From f4b5f67ee07dabc25b5baab0a94f3420606fd0ea Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sat, 3 Jun 2017 19:01:22 +0200 Subject: [PATCH 001/272] core/vm: improved jumpdest analysis --- core/vm/analysis.go | 44 ++++++++++++++++++++++++++++++++-------- core/vm/analysis_test.go | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 core/vm/analysis_test.go diff --git a/core/vm/analysis.go b/core/vm/analysis.go index d5f048d1d0..b27dee8dc8 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -41,21 +41,47 @@ func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool m = jumpdests(code) d[codehash] = m } - return (m[udest/8] & (1 << (udest % 8))) != 0 + return OpCode(code[udest]) == JUMPDEST && (m[udest/8]&(0x80>>(udest%8))) == 0 + // return (m[udest/8] & (1 << (udest % 8))) != 0 +} + +type bitvec struct { + m []byte +} + +func (bits *bitvec) addone(pos uint64) { + bits.m[pos/8] |= 0x80 >> (pos % 8) +} +func (bits *bitvec) addOneByte(pos uint64) { + bits.m[pos/8] |= 0xFF >> (pos % 8) + bits.m[pos/8+1] |= ^(0xFF >> (pos % 8)) } // jumpdests creates a map that contains an entry for each // PC location that is a JUMPDEST instruction. func jumpdests(code []byte) []byte { - m := make([]byte, len(code)/8+1) - for pc := uint64(0); pc < uint64(len(code)); pc++ { + //The map is 4 bytes longer than necessary, in case the code + // ends with a PUSH32, the algorithm will push zeroes onto the + // bitvector outside the bounds of the actual code. + m := make([]byte, len(code)/8+1+4) + bits := &bitvec{m} + for pc := uint64(0); pc < uint64(len(code)); { op := OpCode(code[pc]) - if op == JUMPDEST { - m[pc/8] |= 1 << (pc % 8) - } else if op >= PUSH1 && op <= PUSH32 { - a := uint64(op) - uint64(PUSH1) + 1 - pc += a + + if op >= PUSH1 && op <= PUSH32 { + numbits := op - PUSH1 + 1 + pc++ + for ; numbits >= 8; numbits -= 8 { + bits.addOneByte(pc) // 8 + pc += 8 + } + for ; numbits > 0; numbits-- { + bits.addone(pc) + pc++ + } + } else { + pc++ } } - return m + return bits.m } diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go new file mode 100644 index 0000000000..17c578e95e --- /dev/null +++ b/core/vm/analysis_test.go @@ -0,0 +1,37 @@ +package vm + +import "testing" + +func TestJumpDestAnalysis(t *testing.T) { + tests := []struct { + code []byte + exp byte + which int + }{ + {[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0x40, 0}, + {[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0x50, 0}, + {[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, 0x7F, 0}, + {[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 1}, + {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0x03, 0}, + {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, + {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x74, 0}, + {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, + {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x3F, 0}, + {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xC0, 1}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x7F, 0}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xFF, 1}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 2}, + {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0x7f, 0}, + {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0xA0, 1}, + {[]byte{byte(PUSH32)}, 0x7F, 0}, + {[]byte{byte(PUSH32)}, 0xFF, 1}, + {[]byte{byte(PUSH32)}, 0xFF, 2}, + } + for _, test := range tests { + ret := jumpdests(test.code) + if ret[test.which] != test.exp { + t.Fatalf("expected %x, got %02x", test.exp, ret[test.which]) + } + } + +} From c4d28aee9bb3ce7851e92462bb2e7fdbf88f9a9a Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 30 Jun 2017 16:39:18 +0300 Subject: [PATCH 002/272] consensus/ethash: implement Metropolis EIP 100 --- consensus/ethash/consensus.go | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index dd9c81fd41..fa2d740e45 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -289,6 +289,8 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent * func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int { next := new(big.Int).Add(parent.Number, common.Big1) switch { + case config.IsMetropolis(next): + return calcDifficultyMetropolis(time, parent) case config.IsHomestead(next): return calcDifficultyHomestead(time, parent) default: @@ -299,10 +301,56 @@ func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Heade // Some weird constants to avoid constant memory allocs for them. var ( expDiffPeriod = big.NewInt(100000) + big9 = big.NewInt(9) big10 = big.NewInt(10) bigMinus99 = big.NewInt(-99) ) +func calcDifficultyMetropolis(time uint64, parent *types.Header) *big.Int { + bigTime := new(big.Int).SetUint64(time) + bigParentTime := new(big.Int).Set(parent.Time) + + // adj_factor = max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99) + var x *big.Int + if parent.UncleHash == types.EmptyUncleHash { + x = big.NewInt(1) + } else { + x = big.NewInt(2) + } + z := new(big.Int).Sub(bigTime, bigParentTime) + z.Div(z, big9) + x.Sub(x, z) + + // max(1 - (block_timestamp - parent_timestamp) // 10, -99))) + if x.Cmp(bigMinus99) < 0 { + x.Set(bigMinus99) + } + + // (parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99)) + y := new(big.Int).Div(parent.Difficulty, params.DifficultyBoundDivisor) + x.Mul(y, x) + x.Add(parent.Difficulty, x) + + // minimum difficulty can ever be (before exponential factor) + if x.Cmp(params.MinimumDifficulty) < 0 { + x.Set(params.MinimumDifficulty) + } + + // for the exponential factor + periodCount := new(big.Int).Add(parent.Number, common.Big1) + periodCount.Div(periodCount, expDiffPeriod) + + // the exponential factor, commonly referred to as "the bomb" + // diff = diff + 2^(periodCount - 2) + if periodCount.Cmp(common.Big1) > 0 { + y.Sub(periodCount, common.Big2) + y.Exp(common.Big2, y, nil) + x.Add(x, y) + } + + return x +} + // calcDifficultyHomestead is the difficulty adjustment algorithm. It returns // the difficulty that a new block should have when created at time given the // parent block's time and difficulty. The calculation uses the Homestead rules. From 8c313eed2614990089114bfe5fea7540f4298752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 29 Jun 2017 13:13:00 +0300 Subject: [PATCH 003/272] consensus, core: EIP 100 polishes, fix chain maker diff This PR polishes the EIP 100 difficulty adjustment algorithm to match the same mechanisms as the Homestead was implemented to keep the code uniform. It also avoids a few memory allocs by reusing big1 and big2, pulling it out of the common package and into ethash. The commit also fixes chain maker to forward the uncle hash when creating a simulated chain (it wasn't needed until now so we just skipped a copy there). --- consensus/ethash/consensus.go | 71 ++++++++++++++++++++--------------- core/chain_makers.go | 1 + 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index fa2d740e45..01d97a470e 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -287,7 +287,7 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent * // given the parent block's time and difficulty. // TODO (karalabe): Move the chain maker into this package and make this private! func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int { - next := new(big.Int).Add(parent.Number, common.Big1) + next := new(big.Int).Add(parent.Number, big1) switch { case config.IsMetropolis(next): return calcDifficultyMetropolis(time, parent) @@ -301,33 +301,44 @@ func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Heade // Some weird constants to avoid constant memory allocs for them. var ( expDiffPeriod = big.NewInt(100000) + big1 = big.NewInt(1) + big2 = big.NewInt(2) big9 = big.NewInt(9) big10 = big.NewInt(10) bigMinus99 = big.NewInt(-99) ) +// calcDifficultyMetropolis is the difficulty adjustment algorithm. It returns +// the difficulty that a new block should have when created at time given the +// parent block's time and difficulty. The calculation uses the Metropolis rules. func calcDifficultyMetropolis(time uint64, parent *types.Header) *big.Int { + // https://github.com/ethereum/EIPs/issues/100. + // algorithm: + // diff = (parent_diff + + // (parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)) + // ) + 2^(periodCount - 2) + bigTime := new(big.Int).SetUint64(time) bigParentTime := new(big.Int).Set(parent.Time) - // adj_factor = max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99) - var x *big.Int - if parent.UncleHash == types.EmptyUncleHash { - x = big.NewInt(1) - } else { - x = big.NewInt(2) - } - z := new(big.Int).Sub(bigTime, bigParentTime) - z.Div(z, big9) - x.Sub(x, z) + // holds intermediate values to make the algo easier to read & audit + x := new(big.Int) + y := new(big.Int) - // max(1 - (block_timestamp - parent_timestamp) // 10, -99))) + // (2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // 9 + x.Sub(bigTime, bigParentTime) + x.Div(x, big9) + if parent.UncleHash == types.EmptyUncleHash { + x.Sub(big1, x) + } else { + x.Sub(big2, x) + } + // max((2 if len(parent_uncles) else 1) - (block_timestamp - parent_timestamp) // 9, -99) if x.Cmp(bigMinus99) < 0 { x.Set(bigMinus99) } - // (parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99)) - y := new(big.Int).Div(parent.Difficulty, params.DifficultyBoundDivisor) + y.Div(parent.Difficulty, params.DifficultyBoundDivisor) x.Mul(y, x) x.Add(parent.Difficulty, x) @@ -335,19 +346,17 @@ func calcDifficultyMetropolis(time uint64, parent *types.Header) *big.Int { if x.Cmp(params.MinimumDifficulty) < 0 { x.Set(params.MinimumDifficulty) } - // for the exponential factor - periodCount := new(big.Int).Add(parent.Number, common.Big1) + periodCount := new(big.Int).Add(parent.Number, big1) periodCount.Div(periodCount, expDiffPeriod) // the exponential factor, commonly referred to as "the bomb" // diff = diff + 2^(periodCount - 2) - if periodCount.Cmp(common.Big1) > 0 { - y.Sub(periodCount, common.Big2) - y.Exp(common.Big2, y, nil) + if periodCount.Cmp(big1) > 0 { + y.Sub(periodCount, big2) + y.Exp(big2, y, nil) x.Add(x, y) } - return x } @@ -368,12 +377,12 @@ func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int { x := new(big.Int) y := new(big.Int) - // 1 - (block_timestamp -parent_timestamp) // 10 + // 1 - (block_timestamp - parent_timestamp) // 10 x.Sub(bigTime, bigParentTime) x.Div(x, big10) - x.Sub(common.Big1, x) + x.Sub(big1, x) - // max(1 - (block_timestamp - parent_timestamp) // 10, -99))) + // max(1 - (block_timestamp - parent_timestamp) // 10, -99) if x.Cmp(bigMinus99) < 0 { x.Set(bigMinus99) } @@ -387,14 +396,14 @@ func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int { x.Set(params.MinimumDifficulty) } // for the exponential factor - periodCount := new(big.Int).Add(parent.Number, common.Big1) + periodCount := new(big.Int).Add(parent.Number, big1) periodCount.Div(periodCount, expDiffPeriod) // the exponential factor, commonly referred to as "the bomb" // diff = diff + 2^(periodCount - 2) - if periodCount.Cmp(common.Big1) > 0 { - y.Sub(periodCount, common.Big2) - y.Exp(common.Big2, y, nil) + if periodCount.Cmp(big1) > 0 { + y.Sub(periodCount, big2) + y.Exp(big2, y, nil) x.Add(x, y) } return x @@ -421,12 +430,12 @@ func calcDifficultyFrontier(time uint64, parent *types.Header) *big.Int { diff.Set(params.MinimumDifficulty) } - periodCount := new(big.Int).Add(parent.Number, common.Big1) + periodCount := new(big.Int).Add(parent.Number, big1) periodCount.Div(periodCount, expDiffPeriod) - if periodCount.Cmp(common.Big1) > 0 { + if periodCount.Cmp(big1) > 0 { // diff = diff + 2^(periodCount - 2) - expDiff := periodCount.Sub(periodCount, common.Big2) - expDiff.Exp(common.Big2, expDiff, nil) + expDiff := periodCount.Sub(periodCount, big2) + expDiff.Exp(big2, expDiff, nil) diff.Add(diff, expDiff) diff = math.BigMax(diff, params.MinimumDifficulty) } diff --git a/core/chain_makers.go b/core/chain_makers.go index 38a69d42a9..976a8114d3 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -218,6 +218,7 @@ func makeHeader(config *params.ChainConfig, parent *types.Block, state *state.St Number: parent.Number(), Time: new(big.Int).Sub(time, big.NewInt(10)), Difficulty: parent.Difficulty(), + UncleHash: parent.UncleHash(), }), GasLimit: CalcGasLimit(parent), GasUsed: new(big.Int), From bf468a81ec261745b25206b2a596eb0ee0a24a74 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 11 Jul 2017 16:33:39 +0200 Subject: [PATCH 004/272] params, VERSION: v1.6.8 unstable --- VERSION | 2 +- params/version.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 400084b1bf..d8c5e721a7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.7 +1.6.8 diff --git a/params/version.go b/params/version.go index a8e4aedfb4..3dac93d897 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 6 // Minor version component of the current release - VersionPatch = 7 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 6 // Minor version component of the current release + VersionPatch = 8 // Patch version component of the current release + VersionMeta = "unstable" // Version metadata to append to the version string ) // Version holds the textual version string. From 01cb9948f1a95f1584fe2336757fd7a68571257e Mon Sep 17 00:00:00 2001 From: Dexaran Date: Fri, 14 Jul 2017 11:53:09 +0400 Subject: [PATCH 005/272] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ac9fe8fb5..24d383c696 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001" | disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | +| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. ` echo "6001" | disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | | `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | From df74a433961bf8d5a7da84a7b7b962f661231632 Mon Sep 17 00:00:00 2001 From: Dexaran Date: Fri, 14 Jul 2017 11:53:46 +0400 Subject: [PATCH 006/272] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 24d383c696..efa4b1c334 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. ` echo "6001" | disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | +| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001" disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | | `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | From d68ad36bb9ae854e41b4e677de396542216d0040 Mon Sep 17 00:00:00 2001 From: Dexaran Date: Fri, 14 Jul 2017 11:54:35 +0400 Subject: [PATCH 007/272] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index efa4b1c334..d0af6fe158 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001" disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | +| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001"`|` disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | | `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | From 2d47c6bfde0ac8bfa84de0400dc60e97e84c7cb7 Mon Sep 17 00:00:00 2001 From: Dexaran Date: Fri, 14 Jul 2017 11:55:10 +0400 Subject: [PATCH 008/272] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d0af6fe158..9ee25b4aa7 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001"`|` disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | +| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. echo "6001" | disasm). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | | `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | From 33a24bb7311fd4ad15420f2418cca408d7acdb6a Mon Sep 17 00:00:00 2001 From: Dexaran Date: Fri, 14 Jul 2017 11:56:08 +0400 Subject: [PATCH 009/272] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ee25b4aa7..efa4b1c334 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. echo "6001" | disasm). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | +| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001" disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | | `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | From 8d6a5a3581ce6221786eb464bfef7e8c31e7ad95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 14 Jul 2017 18:10:18 +0300 Subject: [PATCH 010/272] VERSION, params: begin 1.7.0 cycle (cannot downgrade) --- VERSION | 2 +- params/version.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index d8c5e721a7..bd8bf882d0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.8 +1.7.0 diff --git a/params/version.go b/params/version.go index 3dac93d897..0896662606 100644 --- a/params/version.go +++ b/params/version.go @@ -22,8 +22,8 @@ import ( const ( VersionMajor = 1 // Major version component of the current release - VersionMinor = 6 // Minor version component of the current release - VersionPatch = 8 // Patch version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 0 // Patch version component of the current release VersionMeta = "unstable" // Version metadata to append to the version string ) From 0ff35e170d1b913082313089d13e3e6d5490839b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 14 Jul 2017 19:39:53 +0300 Subject: [PATCH 011/272] core: remove redundant storage of transactions and receipts (#14801) * core: remove redundant storage of transactions and receipts * core, eth, internal: new transaction schema usage polishes * eth: implement upgrade mechanism for db deduplication * core, eth: drop old sequential key db upgrader * eth: close last iterator on successful db upgrage * core: prefix the lookup entries to make their purpose clearer --- accounts/abi/bind/backends/simulated.go | 3 +- core/blockchain.go | 33 +-- core/blockchain_test.go | 8 +- core/database_util.go | 194 ++++++--------- core/database_util_test.go | 74 +----- eth/backend.go | 6 +- eth/backend_test.go | 9 - eth/db_upgrade.go | 303 ++++++++---------------- eth/filters/filter_test.go | 12 - internal/ethapi/api.go | 212 ++++++----------- light/txpool.go | 66 ++---- miner/worker.go | 4 +- 12 files changed, 285 insertions(+), 639 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 7ac8b58204..14bf7bd752 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -144,7 +144,8 @@ func (b *SimulatedBackend) StorageAt(ctx context.Context, contract common.Addres // TransactionReceipt returns the receipt of a transaction. func (b *SimulatedBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - return core.GetReceipt(b.database, txHash), nil + receipt, _, _, _ := core.GetReceipt(b.database, txHash) + return receipt, nil } // PendingCodeAt returns the code associated with an account in the pending state. diff --git a/core/blockchain.go b/core/blockchain.go index 6772ea2848..bb1c14f437 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -759,16 +759,10 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ log.Crit("Failed to write log blooms", "err", err) return } - if err := WriteTransactions(bc.chainDb, block); err != nil { - errs[index] = fmt.Errorf("failed to write individual transactions: %v", err) + if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { + errs[index] = fmt.Errorf("failed to write lookup metadata: %v", err) atomic.AddInt32(&failed, 1) - log.Crit("Failed to write individual transactions", "err", err) - return - } - if err := WriteReceipts(bc.chainDb, receipts); err != nil { - errs[index] = fmt.Errorf("failed to write individual receipts: %v", err) - atomic.AddInt32(&failed, 1) - log.Crit("Failed to write individual receipts", "err", err) + log.Crit("Failed to write lookup metadata", "err", err) return } atomic.AddInt32(&stats.processed, 1) @@ -1002,12 +996,8 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) - // This puts transactions in a extra db for rpc - if err := WriteTransactions(bc.chainDb, block); err != nil { - return i, err - } - // store the receipts - if err := WriteReceipts(bc.chainDb, receipts); err != nil { + // Write the positional metadata for transaction and receipt lookups + if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { return i, err } // Write map map bloom filters @@ -1167,16 +1157,12 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { for _, block := range newChain { // insert the block in the canonical way, re-writing history bc.insert(block) - // write canonical receipts and transactions - if err := WriteTransactions(bc.chainDb, block); err != nil { - return err - } - receipts := GetBlockReceipts(bc.chainDb, block.Hash(), block.NumberU64()) - // write receipts - if err := WriteReceipts(bc.chainDb, receipts); err != nil { + // write lookup entries for hash based transaction/receipt searches + if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { return err } // Write map map bloom filters + receipts := GetBlockReceipts(bc.chainDb, block.Hash(), block.NumberU64()) if err := WriteMipmapBloom(bc.chainDb, block.NumberU64(), receipts); err != nil { return err } @@ -1188,8 +1174,7 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { // When transactions get deleted from the database that means the // receipts that were created in the fork must also be deleted for _, tx := range diff { - DeleteReceipt(bc.chainDb, tx.Hash()) - DeleteTransaction(bc.chainDb, tx.Hash()) + DeleteTxLookupEntry(bc.chainDb, tx.Hash()) } // Must be posted in a goroutine because of the transaction pool trying // to acquire the chain manager lock diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 371522ab77..5fa671e2b9 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -806,8 +806,8 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := GetTransaction(db, tx.Hash()); txn != nil { t.Errorf("drop %d: tx %v found while shouldn't have been", i, txn) } - if GetReceipt(db, tx.Hash()) != nil { - t.Errorf("drop %d: receipt found while shouldn't have been", i) + if rcpt, _, _, _ := GetReceipt(db, tx.Hash()); rcpt != nil { + t.Errorf("drop %d: receipt %v found while shouldn't have been", i, rcpt) } } // added tx @@ -815,7 +815,7 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := GetTransaction(db, tx.Hash()); txn == nil { t.Errorf("add %d: expected tx to be found", i) } - if GetReceipt(db, tx.Hash()) == nil { + if rcpt, _, _, _ := GetReceipt(db, tx.Hash()); rcpt == nil { t.Errorf("add %d: expected receipt to be found", i) } } @@ -824,7 +824,7 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := GetTransaction(db, tx.Hash()); txn == nil { t.Errorf("share %d: expected tx to be found", i) } - if GetReceipt(db, tx.Hash()) == nil { + if rcpt, _, _, _ := GetReceipt(db, tx.Hash()); rcpt == nil { t.Errorf("share %d: expected receipt to be found", i) } } diff --git a/core/database_util.go b/core/database_util.go index b4a230c9c9..6971113944 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -45,24 +45,17 @@ var ( blockHashPrefix = []byte("H") // blockHashPrefix + hash -> num (uint64 big endian) bodyPrefix = []byte("b") // bodyPrefix + num (uint64 big endian) + hash -> block body blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts + lookupPrefix = []byte("l") // lookupPrefix + hash -> transaction/receipt lookup metadata preimagePrefix = "secure-key-" // preimagePrefix + hash -> preimage - txMetaSuffix = []byte{0x01} - receiptsPrefix = []byte("receipts-") - mipmapPre = []byte("mipmap-log-bloom-") MIPMapLevels = []uint64{1000000, 500000, 100000, 50000, 1000} configPrefix = []byte("ethereum-config-") // config prefix for the db - // used by old (non-sequential keys) db, now only used for conversion - oldBlockPrefix = []byte("block-") - oldHeaderSuffix = []byte("-header") - oldTdSuffix = []byte("-td") // headerPrefix + num (uint64 big endian) + hash + tdSuffix -> td - oldBodySuffix = []byte("-body") - oldBlockNumPrefix = []byte("block-num-") - oldBlockReceiptsPrefix = []byte("receipts-block-") - oldBlockHashPrefix = []byte("block-hash-") // [deprecated by the header/block split, remove eventually] + // used by old db, now only used for conversion + oldReceiptsPrefix = []byte("receipts-") + oldTxMetaSuffix = []byte{0x01} ErrChainConfigNotFound = errors.New("ChainConfig not found") // general config not found error @@ -72,6 +65,14 @@ var ( preimageHitCounter = metrics.NewCounter("db/preimage/hits") ) +// txLookupEntry is a positional metadata to help looking up the data content of +// a transaction or receipt given only its hash. +type txLookupEntry struct { + BlockHash common.Hash + BlockIndex uint64 + Index uint64 +} + // encodeBlockNumber encodes a block number as big endian uint64 func encodeBlockNumber(number uint64) []byte { enc := make([]byte, 8) @@ -83,10 +84,7 @@ func encodeBlockNumber(number uint64) []byte { func GetCanonicalHash(db ethdb.Database, number uint64) common.Hash { data, _ := db.Get(append(append(headerPrefix, encodeBlockNumber(number)...), numSuffix...)) if len(data) == 0 { - data, _ = db.Get(append(oldBlockNumPrefix, big.NewInt(int64(number)).Bytes()...)) - if len(data) == 0 { - return common.Hash{} - } + return common.Hash{} } return common.BytesToHash(data) } @@ -100,15 +98,7 @@ const missingNumber = uint64(0xffffffffffffffff) func GetBlockNumber(db ethdb.Database, hash common.Hash) uint64 { data, _ := db.Get(append(blockHashPrefix, hash.Bytes()...)) if len(data) != 8 { - data, _ := db.Get(append(append(oldBlockPrefix, hash.Bytes()...), oldHeaderSuffix...)) - if len(data) == 0 { - return missingNumber - } - header := new(types.Header) - if err := rlp.Decode(bytes.NewReader(data), header); err != nil { - log.Crit("Failed to decode block header", "err", err) - } - return header.Number.Uint64() + return missingNumber } return binary.BigEndian.Uint64(data) } @@ -151,9 +141,6 @@ func GetHeadFastBlockHash(db ethdb.Database) common.Hash { // if the header's not found. func GetHeaderRLP(db ethdb.Database, hash common.Hash, number uint64) rlp.RawValue { data, _ := db.Get(append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) - if len(data) == 0 { - data, _ = db.Get(append(append(oldBlockPrefix, hash.Bytes()...), oldHeaderSuffix...)) - } return data } @@ -175,9 +162,6 @@ func GetHeader(db ethdb.Database, hash common.Hash, number uint64) *types.Header // GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. func GetBodyRLP(db ethdb.Database, hash common.Hash, number uint64) rlp.RawValue { data, _ := db.Get(append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) - if len(data) == 0 { - data, _ = db.Get(append(append(oldBlockPrefix, hash.Bytes()...), oldBodySuffix...)) - } return data } @@ -201,10 +185,7 @@ func GetBody(db ethdb.Database, hash common.Hash, number uint64) *types.Body { func GetTd(db ethdb.Database, hash common.Hash, number uint64) *big.Int { data, _ := db.Get(append(append(append(headerPrefix, encodeBlockNumber(number)...), hash[:]...), tdSuffix...)) if len(data) == 0 { - data, _ = db.Get(append(append(oldBlockPrefix, hash.Bytes()...), oldTdSuffix...)) - if len(data) == 0 { - return nil - } + return nil } td := new(big.Int) if err := rlp.Decode(bytes.NewReader(data), td); err != nil { @@ -239,10 +220,7 @@ func GetBlock(db ethdb.Database, hash common.Hash, number uint64) *types.Block { func GetBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) types.Receipts { data, _ := db.Get(append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash[:]...)) if len(data) == 0 { - data, _ = db.Get(append(oldBlockReceiptsPrefix, hash.Bytes()...)) - if len(data) == 0 { - return nil - } + return nil } storageReceipts := []*types.ReceiptForStorage{} if err := rlp.DecodeBytes(data, &storageReceipts); err != nil { @@ -256,10 +234,38 @@ func GetBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) types. return receipts } +// GetTxLookupEntry retrieves the positional metadata associated with a transaction +// hash to allow retrieving the transaction or receipt by hash. +func GetTxLookupEntry(db ethdb.Database, hash common.Hash) (common.Hash, uint64, uint64) { + // Load the positional metadata from disk and bail if it fails + data, _ := db.Get(append(lookupPrefix, hash.Bytes()...)) + if len(data) == 0 { + return common.Hash{}, 0, 0 + } + // Parse and return the contents of the lookup entry + var entry txLookupEntry + if err := rlp.DecodeBytes(data, &entry); err != nil { + log.Error("Invalid lookup entry RLP", "hash", hash, "err", err) + return common.Hash{}, 0, 0 + } + return entry.BlockHash, entry.BlockIndex, entry.Index +} + // GetTransaction retrieves a specific transaction from the database, along with // its added positional metadata. func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { - // Retrieve the transaction itself from the database + // Retrieve the lookup metadata and resolve the transaction from the body + blockHash, blockNumber, txIndex := GetTxLookupEntry(db, hash) + + if blockHash != (common.Hash{}) { + body := GetBody(db, blockHash, blockNumber) + if body == nil || len(body.Transactions) <= int(txIndex) { + log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex) + return nil, common.Hash{}, 0, 0 + } + return body.Transactions[txIndex], blockHash, blockNumber, txIndex + } + // Old transaction representation, load the transaction and it's metadata separately data, _ := db.Get(hash.Bytes()) if len(data) == 0 { return nil, common.Hash{}, 0, 0 @@ -269,33 +275,42 @@ func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, co return nil, common.Hash{}, 0, 0 } // Retrieve the blockchain positional metadata - data, _ = db.Get(append(hash.Bytes(), txMetaSuffix...)) + data, _ = db.Get(append(hash.Bytes(), oldTxMetaSuffix...)) if len(data) == 0 { return nil, common.Hash{}, 0, 0 } - var meta struct { - BlockHash common.Hash - BlockIndex uint64 - Index uint64 - } - if err := rlp.DecodeBytes(data, &meta); err != nil { + var entry txLookupEntry + if err := rlp.DecodeBytes(data, &entry); err != nil { return nil, common.Hash{}, 0, 0 } - return &tx, meta.BlockHash, meta.BlockIndex, meta.Index + return &tx, entry.BlockHash, entry.BlockIndex, entry.Index } -// GetReceipt returns a receipt by hash -func GetReceipt(db ethdb.Database, hash common.Hash) *types.Receipt { - data, _ := db.Get(append(receiptsPrefix, hash[:]...)) +// GetReceipt retrieves a specific transaction receipt from the database, along with +// its added positional metadata. +func GetReceipt(db ethdb.Database, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { + // Retrieve the lookup metadata and resolve the receipt from the receipts + blockHash, blockNumber, receiptIndex := GetTxLookupEntry(db, hash) + + if blockHash != (common.Hash{}) { + receipts := GetBlockReceipts(db, blockHash, blockNumber) + if len(receipts) <= int(receiptIndex) { + log.Error("Receipt refereced missing", "number", blockNumber, "hash", blockHash, "index", receiptIndex) + return nil, common.Hash{}, 0, 0 + } + return receipts[receiptIndex], blockHash, blockNumber, receiptIndex + } + // Old receipt representation, load the receipt and set an unknown metadata + data, _ := db.Get(append(oldReceiptsPrefix, hash[:]...)) if len(data) == 0 { - return nil + return nil, common.Hash{}, 0, 0 } var receipt types.ReceiptForStorage err := rlp.DecodeBytes(data, &receipt) if err != nil { log.Error("Invalid receipt RLP", "hash", hash, "err", err) } - return (*types.Receipt)(&receipt) + return (*types.Receipt)(&receipt), common.Hash{}, 0, 0 } // WriteCanonicalHash stores the canonical hash for the given block number. @@ -416,76 +431,29 @@ func WriteBlockReceipts(db ethdb.Database, hash common.Hash, number uint64, rece return nil } -// WriteTransactions stores the transactions associated with a specific block -// into the given database. Beside writing the transaction, the function also -// stores a metadata entry along with the transaction, detailing the position -// of this within the blockchain. -func WriteTransactions(db ethdb.Database, block *types.Block) error { +// WriteTxLookupEntries stores a positional metadata for every transaction from +// a block, enabling hash based transaction and receipt lookups. +func WriteTxLookupEntries(db ethdb.Database, block *types.Block) error { batch := db.NewBatch() - // Iterate over each transaction and encode it with its metadata + // Iterate over each transaction and encode its metadata for i, tx := range block.Transactions() { - // Encode and queue up the transaction for storage - data, err := rlp.EncodeToBytes(tx) - if err != nil { - return err - } - if err = batch.Put(tx.Hash().Bytes(), data); err != nil { - return err - } - // Encode and queue up the transaction metadata for storage - meta := struct { - BlockHash common.Hash - BlockIndex uint64 - Index uint64 - }{ + entry := txLookupEntry{ BlockHash: block.Hash(), BlockIndex: block.NumberU64(), Index: uint64(i), } - data, err = rlp.EncodeToBytes(meta) + data, err := rlp.EncodeToBytes(entry) if err != nil { return err } - if err := batch.Put(append(tx.Hash().Bytes(), txMetaSuffix...), data); err != nil { + if err := batch.Put(append(lookupPrefix, tx.Hash().Bytes()...), data); err != nil { return err } } // Write the scheduled data into the database if err := batch.Write(); err != nil { - log.Crit("Failed to store transactions", "err", err) - } - return nil -} - -// WriteReceipt stores a single transaction receipt into the database. -func WriteReceipt(db ethdb.Database, receipt *types.Receipt) error { - storageReceipt := (*types.ReceiptForStorage)(receipt) - data, err := rlp.EncodeToBytes(storageReceipt) - if err != nil { - return err - } - return db.Put(append(receiptsPrefix, receipt.TxHash.Bytes()...), data) -} - -// WriteReceipts stores a batch of transaction receipts into the database. -func WriteReceipts(db ethdb.Database, receipts types.Receipts) error { - batch := db.NewBatch() - - // Iterate over all the receipts and queue them for database injection - for _, receipt := range receipts { - storageReceipt := (*types.ReceiptForStorage)(receipt) - data, err := rlp.EncodeToBytes(storageReceipt) - if err != nil { - return err - } - if err := batch.Put(append(receiptsPrefix, receipt.TxHash.Bytes()...), data); err != nil { - return err - } - } - // Write the scheduled data into the database - if err := batch.Write(); err != nil { - log.Crit("Failed to store receipts", "err", err) + log.Crit("Failed to store lookup entries", "err", err) } return nil } @@ -524,15 +492,9 @@ func DeleteBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) { db.Delete(append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) } -// DeleteTransaction removes all transaction data associated with a hash. -func DeleteTransaction(db ethdb.Database, hash common.Hash) { - db.Delete(hash.Bytes()) - db.Delete(append(hash.Bytes(), txMetaSuffix...)) -} - -// DeleteReceipt removes all receipt data associated with a transaction hash. -func DeleteReceipt(db ethdb.Database, hash common.Hash) { - db.Delete(append(receiptsPrefix, hash.Bytes()...)) +// DeleteTxLookupEntry removes all transaction data associated with a hash. +func DeleteTxLookupEntry(db ethdb.Database, hash common.Hash) { + db.Delete(append(lookupPrefix, hash.Bytes()...)) } // returns a formatted MIP mapped key by adding prefix, canonical number and level diff --git a/core/database_util_test.go b/core/database_util_test.go index 9f16b660a9..e9a6df97b7 100644 --- a/core/database_util_test.go +++ b/core/database_util_test.go @@ -290,8 +290,8 @@ func TestHeadStorage(t *testing.T) { } } -// Tests that transactions and associated metadata can be stored and retrieved. -func TestTransactionStorage(t *testing.T) { +// Tests that positional lookup metadata can be stored and retrieved. +func TestLookupStorage(t *testing.T) { db, _ := ethdb.NewMemDatabase() tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), big.NewInt(1111), big.NewInt(11111), []byte{0x11, 0x11, 0x11}) @@ -308,7 +308,10 @@ func TestTransactionStorage(t *testing.T) { } } // Insert all the transactions into the database, and verify contents - if err := WriteTransactions(db, block); err != nil { + if err := WriteBlock(db, block); err != nil { + t.Fatalf("failed to write block contents: %v", err) + } + if err := WriteTxLookupEntries(db, block); err != nil { t.Fatalf("failed to write transactions: %v", err) } for i, tx := range txs { @@ -325,72 +328,13 @@ func TestTransactionStorage(t *testing.T) { } // Delete the transactions and check purge for i, tx := range txs { - DeleteTransaction(db, tx.Hash()) + DeleteTxLookupEntry(db, tx.Hash()) if txn, _, _, _ := GetTransaction(db, tx.Hash()); txn != nil { t.Fatalf("tx #%d [%x]: deleted transaction returned: %v", i, tx.Hash(), txn) } } } -// Tests that receipts can be stored and retrieved. -func TestReceiptStorage(t *testing.T) { - db, _ := ethdb.NewMemDatabase() - - receipt1 := &types.Receipt{ - PostState: []byte{0x01}, - CumulativeGasUsed: big.NewInt(1), - Logs: []*types.Log{ - {Address: common.BytesToAddress([]byte{0x11})}, - {Address: common.BytesToAddress([]byte{0x01, 0x11})}, - }, - TxHash: common.BytesToHash([]byte{0x11, 0x11}), - ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), - GasUsed: big.NewInt(111111), - } - receipt2 := &types.Receipt{ - PostState: []byte{0x02}, - CumulativeGasUsed: big.NewInt(2), - Logs: []*types.Log{ - {Address: common.BytesToAddress([]byte{0x22})}, - {Address: common.BytesToAddress([]byte{0x02, 0x22})}, - }, - TxHash: common.BytesToHash([]byte{0x22, 0x22}), - ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), - GasUsed: big.NewInt(222222), - } - receipts := []*types.Receipt{receipt1, receipt2} - - // Check that no receipt entries are in a pristine database - for i, receipt := range receipts { - if r := GetReceipt(db, receipt.TxHash); r != nil { - t.Fatalf("receipt #%d [%x]: non existent receipt returned: %v", i, receipt.TxHash, r) - } - } - // Insert all the receipts into the database, and verify contents - if err := WriteReceipts(db, receipts); err != nil { - t.Fatalf("failed to write receipts: %v", err) - } - for i, receipt := range receipts { - if r := GetReceipt(db, receipt.TxHash); r == nil { - t.Fatalf("receipt #%d [%x]: receipt not found", i, receipt.TxHash) - } else { - rlpHave, _ := rlp.EncodeToBytes(r) - rlpWant, _ := rlp.EncodeToBytes(receipt) - - if !bytes.Equal(rlpHave, rlpWant) { - t.Fatalf("receipt #%d [%x]: receipt mismatch: have %v, want %v", i, receipt.TxHash, r, receipt) - } - } - } - // Delete the receipts and check purge - for i, receipt := range receipts { - DeleteReceipt(db, receipt.TxHash) - if r := GetReceipt(db, receipt.TxHash); r != nil { - t.Fatalf("receipt #%d [%x]: deleted receipt returned: %v", i, receipt.TxHash, r) - } - } -} - // Tests that receipts associated with a single block can be stored and retrieved. func TestBlockReceiptStorage(t *testing.T) { db, _ := ethdb.NewMemDatabase() @@ -530,10 +474,6 @@ func TestMipmapChain(t *testing.T) { } // store the receipts - err := WriteReceipts(db, receipts) - if err != nil { - t.Fatal(err) - } WriteMipmapBloom(db, uint64(i+1), receipts) }) for i, block := range chain { diff --git a/eth/backend.go b/eth/backend.go index 78478e86e9..c7df517c04 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -59,8 +59,8 @@ type LesServer interface { type Ethereum struct { chainConfig *params.ChainConfig // Channel for shutting down the service - shutdownChan chan bool // Channel for shutting down the ethereum - stopDbUpgrade func() // stop chain db sequential key upgrade + shutdownChan chan bool // Channel for shutting down the ethereum + stopDbUpgrade func() error // stop chain db sequential key upgrade // Handlers txPool *core.TxPool blockchain *core.BlockChain @@ -103,7 +103,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if err != nil { return nil, err } - stopDbUpgrade := upgradeSequentialKeys(chainDb) + stopDbUpgrade := upgradeDeduplicateData(chainDb) chainConfig, genesisHash, genesisErr := core.SetupGenesisBlock(chainDb, config.Genesis) if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok { return nil, genesisErr diff --git a/eth/backend_test.go b/eth/backend_test.go index f60e3214c3..4351b24cfb 100644 --- a/eth/backend_test.go +++ b/eth/backend_test.go @@ -33,24 +33,15 @@ func TestMipmapUpgrade(t *testing.T) { genesis := new(core.Genesis).MustCommit(db) chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) { - var receipts types.Receipts switch i { case 1: receipt := types.NewReceipt(nil, new(big.Int)) receipt.Logs = []*types.Log{{Address: addr}} gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} case 2: receipt := types.NewReceipt(nil, new(big.Int)) receipt.Logs = []*types.Log{{Address: addr}} gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} - } - - // store the receipts - err := core.WriteReceipts(db, receipts) - if err != nil { - t.Fatal(err) } }) for i, block := range chain { diff --git a/eth/db_upgrade.go b/eth/db_upgrade.go index 82cdd7e55e..90111b2b38 100644 --- a/eth/db_upgrade.go +++ b/eth/db_upgrade.go @@ -19,237 +19,120 @@ package eth import ( "bytes" - "encoding/binary" "fmt" - "math/big" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" ) -var useSequentialKeys = []byte("dbUpgrade_20160530sequentialKeys") +var deduplicateData = []byte("dbUpgrade_20170714deduplicateData") -// upgradeSequentialKeys checks the chain database version and +// upgradeDeduplicateData checks the chain database version and // starts a background process to make upgrades if necessary. // Returns a stop function that blocks until the process has // been safely stopped. -func upgradeSequentialKeys(db ethdb.Database) (stopFn func()) { - data, _ := db.Get(useSequentialKeys) +func upgradeDeduplicateData(db ethdb.Database) func() error { + // If the database is already converted or empty, bail out + data, _ := db.Get(deduplicateData) if len(data) > 0 && data[0] == 42 { - return nil // already converted - } - - if data, _ := db.Get([]byte("LastHeader")); len(data) == 0 { - db.Put(useSequentialKeys, []byte{42}) - return nil // empty database, nothing to do - } - - log.Warn("Upgrading chain database to use sequential keys") - - stopChn := make(chan struct{}) - stoppedChn := make(chan struct{}) - - go func() { - stopFn := func() bool { - select { - case <-time.After(time.Microsecond * 100): // make sure other processes don't get starved - case <-stopChn: - return true - } - return false - } - - err, stopped := upgradeSequentialCanonicalNumbers(db, stopFn) - if err == nil && !stopped { - err, stopped = upgradeSequentialBlocks(db, stopFn) - } - if err == nil && !stopped { - err, stopped = upgradeSequentialOrphanedReceipts(db, stopFn) - } - if err == nil && !stopped { - log.Info("Database conversion successful") - db.Put(useSequentialKeys, []byte{42}) - } - if err != nil { - log.Error("Database conversion failed", "err", err) - } - close(stoppedChn) - }() - - return func() { - close(stopChn) - <-stoppedChn - } -} - -// upgradeSequentialCanonicalNumbers reads all old format canonical numbers from -// the database, writes them in new format and deletes the old ones if successful. -func upgradeSequentialCanonicalNumbers(db ethdb.Database, stopFn func() bool) (error, bool) { - prefix := []byte("block-num-") - it := db.(*ethdb.LDBDatabase).NewIterator() - defer func() { - it.Release() - }() - it.Seek(prefix) - cnt := 0 - for bytes.HasPrefix(it.Key(), prefix) { - keyPtr := it.Key() - if len(keyPtr) < 20 { - cnt++ - if cnt%100000 == 0 { - it.Release() - it = db.(*ethdb.LDBDatabase).NewIterator() - it.Seek(keyPtr) - log.Info("Converting canonical numbers", "count", cnt) - } - number := big.NewInt(0).SetBytes(keyPtr[10:]).Uint64() - newKey := []byte("h12345678n") - binary.BigEndian.PutUint64(newKey[1:9], number) - if err := db.Put(newKey, it.Value()); err != nil { - return err, false - } - if err := db.Delete(keyPtr); err != nil { - return err, false - } - } - - if stopFn() { - return nil, true - } - it.Next() - } - if cnt > 0 { - log.Info("converted canonical numbers", "count", cnt) - } - return nil, false -} - -// upgradeSequentialBlocks reads all old format block headers, bodies, TDs and block -// receipts from the database, writes them in new format and deletes the old ones -// if successful. -func upgradeSequentialBlocks(db ethdb.Database, stopFn func() bool) (error, bool) { - prefix := []byte("block-") - it := db.(*ethdb.LDBDatabase).NewIterator() - defer func() { - it.Release() - }() - it.Seek(prefix) - cnt := 0 - for bytes.HasPrefix(it.Key(), prefix) { - keyPtr := it.Key() - if len(keyPtr) >= 38 { - cnt++ - if cnt%10000 == 0 { - it.Release() - it = db.(*ethdb.LDBDatabase).NewIterator() - it.Seek(keyPtr) - log.Info("Converting blocks", "count", cnt) - } - // convert header, body, td and block receipts - var keyPrefix [38]byte - copy(keyPrefix[:], keyPtr[0:38]) - hash := keyPrefix[6:38] - if err := upgradeSequentialBlockData(db, hash); err != nil { - return err, false - } - // delete old db entries belonging to this hash - for bytes.HasPrefix(it.Key(), keyPrefix[:]) { - if err := db.Delete(it.Key()); err != nil { - return err, false - } - it.Next() - } - if err := db.Delete(append([]byte("receipts-block-"), hash...)); err != nil { - return err, false - } - } else { - it.Next() - } - - if stopFn() { - return nil, true - } - } - if cnt > 0 { - log.Info("Converted blocks", "count", cnt) - } - return nil, false -} - -// upgradeSequentialOrphanedReceipts removes any old format block receipts from the -// database that did not have a corresponding block -func upgradeSequentialOrphanedReceipts(db ethdb.Database, stopFn func() bool) (error, bool) { - prefix := []byte("receipts-block-") - it := db.(*ethdb.LDBDatabase).NewIterator() - defer it.Release() - it.Seek(prefix) - cnt := 0 - for bytes.HasPrefix(it.Key(), prefix) { - // phase 2 already converted receipts belonging to existing - // blocks, just remove if there's anything left - cnt++ - if err := db.Delete(it.Key()); err != nil { - return err, false - } - - if stopFn() { - return nil, true - } - it.Next() - } - if cnt > 0 { - log.Info("Removed orphaned block receipts", "count", cnt) - } - return nil, false -} - -// upgradeSequentialBlockData upgrades the header, body, td and block receipts -// database entries belonging to a single hash (doesn't delete old data). -func upgradeSequentialBlockData(db ethdb.Database, hash []byte) error { - // get old chain data and block number - headerRLP, _ := db.Get(append(append([]byte("block-"), hash...), []byte("-header")...)) - if len(headerRLP) == 0 { return nil } - header := new(types.Header) - if err := rlp.Decode(bytes.NewReader(headerRLP), header); err != nil { - return err + if data, _ := db.Get([]byte("LastHeader")); len(data) == 0 { + db.Put(deduplicateData, []byte{42}) + return nil } - number := header.Number.Uint64() - bodyRLP, _ := db.Get(append(append([]byte("block-"), hash...), []byte("-body")...)) - tdRLP, _ := db.Get(append(append([]byte("block-"), hash...), []byte("-td")...)) - receiptsRLP, _ := db.Get(append([]byte("receipts-block-"), hash...)) - // store new hash -> number association - encNum := make([]byte, 8) - binary.BigEndian.PutUint64(encNum, number) - if err := db.Put(append([]byte("H"), hash...), encNum); err != nil { - return err - } - // store new chain data - if err := db.Put(append(append([]byte("h"), encNum...), hash...), headerRLP); err != nil { - return err - } - if len(tdRLP) != 0 { - if err := db.Put(append(append(append([]byte("h"), encNum...), hash...), []byte("t")...), tdRLP); err != nil { - return err + // Start the deduplication upgrade on a new goroutine + log.Warn("Upgrading database to use lookup entries") + stop := make(chan chan error) + + go func() { + // Create an iterator to read the entire database and covert old lookup entires + it := db.(*ethdb.LDBDatabase).NewIterator() + defer func() { + if it != nil { + it.Release() + } + }() + + var ( + converted uint64 + failed error + ) + for failed == nil && it.Next() { + // Skip any entries that don't look like old transaction meta entires (0x01) + key := it.Key() + if len(key) != common.HashLength+1 || key[common.HashLength] != 0x01 { + continue + } + // Skip any entries that don't contain metadata (name clash between 0x01 and ) + var meta struct { + BlockHash common.Hash + BlockIndex uint64 + Index uint64 + } + if err := rlp.DecodeBytes(it.Value(), &meta); err != nil { + continue + } + // Skip any already upgraded entries (clash due to ending with 0x01 (old suffix)) + hash := key[:common.HashLength] + + if hash[0] == byte('l') { + // Potential clash, the "old" `hash` must point to a live transaction. + if tx, _, _, _ := core.GetTransaction(db, common.BytesToHash(hash)); tx == nil || !bytes.Equal(tx.Hash().Bytes(), hash) { + continue + } + } + // Convert the old metadata to a new lookup entry, delete duplicate data + if failed = db.Put(append([]byte("l"), hash...), it.Value()); failed == nil { // Write the new looku entry + if failed = db.Delete(hash); failed == nil { // Delete the duplicate transaction data + if failed = db.Delete(append([]byte("receipts-"), hash...)); failed == nil { // Delete the duplicate receipt data + if failed = db.Delete(key); failed != nil { // Delete the old transaction metadata + break + } + } + } + } + // Bump the conversion counter, and recreate the iterator occasionally to + // avoid too high memory consumption. + converted++ + if converted%100000 == 0 { + it.Release() + it = db.(*ethdb.LDBDatabase).NewIterator() + it.Seek(key) + + log.Info("Deduplicating database entries", "deduped", converted) + } + // Check for termination, or continue after a bit of a timeout + select { + case errc := <-stop: + errc <- nil + return + case <-time.After(time.Microsecond * 100): + } } - } - if len(bodyRLP) != 0 { - if err := db.Put(append(append([]byte("b"), encNum...), hash...), bodyRLP); err != nil { - return err + // Upgrade finished, mark a such and terminate + if failed == nil { + log.Info("Database deduplication successful", "deduped", converted) + db.Put(deduplicateData, []byte{42}) + } else { + log.Error("Database deduplication failed", "deduped", converted, "err", failed) } + it.Release() + it = nil + + errc := <-stop + errc <- failed + }() + // Assembly the cancellation callback + return func() error { + errc := make(chan error) + stop <- errc + return <-errc } - if len(receiptsRLP) != 0 { - if err := db.Put(append(append([]byte("r"), encNum...), hash...), receiptsRLP); err != nil { - return err - } - } - return nil } func addMipmapBloomBins(db ethdb.Database) (err error) { diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index cd5e7cafd5..b6cfd4bbc3 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -82,12 +82,6 @@ func BenchmarkMipmaps(b *testing.B) { gen.AddUncheckedReceipt(receipt) } - - // store the receipts - err := core.WriteReceipts(db, receipts) - if err != nil { - b.Fatal(err) - } core.WriteMipmapBloom(db, uint64(i+1), receipts) }) for i, block := range chain { @@ -183,12 +177,6 @@ func TestFilters(t *testing.T) { gen.AddUncheckedReceipt(receipt) receipts = types.Receipts{receipt} } - - // store the receipts - err := core.WriteReceipts(db, receipts) - if err != nil { - t.Fatal(err) - } // i is used as block number for the writes but since the i // starts at 0 and block 0 (genesis) is already present increment // by one diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index c22c56dfb3..1b23ac5593 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -17,7 +17,6 @@ package ethapi import ( - "bytes" "context" "errors" "fmt" @@ -35,7 +34,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -769,7 +767,7 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx if fullTx { formatTx = func(tx *types.Transaction) (interface{}, error) { - return newRPCTransaction(b, tx.Hash()) + return newRPCTransactionFromBlockHash(b, tx.Hash()), nil } } @@ -812,15 +810,17 @@ type RPCTransaction struct { S *hexutil.Big `json:"s"` } -// newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation -func newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction { +// newRPCTransaction returns a transaction that will serialize to the RPC +// representation, with the given location metadata set (if available). +func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction { var signer types.Signer = types.FrontierSigner{} if tx.Protected() { signer = types.NewEIP155Signer(tx.ChainId()) } from, _ := types.Sender(signer, tx) v, r, s := tx.RawSignatureValues() - return &RPCTransaction{ + + result := &RPCTransaction{ From: from, Gas: (*hexutil.Big)(tx.Gas()), GasPrice: (*hexutil.Big)(tx.GasPrice()), @@ -833,58 +833,46 @@ func newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction { R: (*hexutil.Big)(r), S: (*hexutil.Big)(s), } + if blockHash != (common.Hash{}) { + result.BlockHash = blockHash + result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber)) + result.TransactionIndex = hexutil.Uint(index) + } + return result } -// newRPCTransaction returns a transaction that will serialize to the RPC representation. -func newRPCTransactionFromBlockIndex(b *types.Block, txIndex uint) (*RPCTransaction, error) { - if txIndex < uint(len(b.Transactions())) { - tx := b.Transactions()[txIndex] - var signer types.Signer = types.FrontierSigner{} - if tx.Protected() { - signer = types.NewEIP155Signer(tx.ChainId()) - } - from, _ := types.Sender(signer, tx) - v, r, s := tx.RawSignatureValues() - return &RPCTransaction{ - BlockHash: b.Hash(), - BlockNumber: (*hexutil.Big)(b.Number()), - From: from, - Gas: (*hexutil.Big)(tx.Gas()), - GasPrice: (*hexutil.Big)(tx.GasPrice()), - Hash: tx.Hash(), - Input: hexutil.Bytes(tx.Data()), - Nonce: hexutil.Uint64(tx.Nonce()), - To: tx.To(), - TransactionIndex: hexutil.Uint(txIndex), - Value: (*hexutil.Big)(tx.Value()), - V: (*hexutil.Big)(v), - R: (*hexutil.Big)(r), - S: (*hexutil.Big)(s), - }, nil - } +// newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation +func newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction { + return newRPCTransaction(tx, common.Hash{}, 0, 0) +} - return nil, nil +// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation. +func newRPCTransactionFromBlockIndex(b *types.Block, index uint64) *RPCTransaction { + txs := b.Transactions() + if index >= uint64(len(txs)) { + return nil + } + return newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index) } // newRPCRawTransactionFromBlockIndex returns the bytes of a transaction given a block and a transaction index. -func newRPCRawTransactionFromBlockIndex(b *types.Block, txIndex uint) (hexutil.Bytes, error) { - if txIndex < uint(len(b.Transactions())) { - tx := b.Transactions()[txIndex] - return rlp.EncodeToBytes(tx) +func newRPCRawTransactionFromBlockIndex(b *types.Block, index uint64) hexutil.Bytes { + txs := b.Transactions() + if index >= uint64(len(txs)) { + return nil } - - return nil, nil + blob, _ := rlp.EncodeToBytes(txs[index]) + return blob } -// newRPCTransaction returns a transaction that will serialize to the RPC representation. -func newRPCTransaction(b *types.Block, txHash common.Hash) (*RPCTransaction, error) { +// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation. +func newRPCTransactionFromBlockHash(b *types.Block, hash common.Hash) *RPCTransaction { for idx, tx := range b.Transactions() { - if tx.Hash() == txHash { - return newRPCTransactionFromBlockIndex(b, uint(idx)) + if tx.Hash() == hash { + return newRPCTransactionFromBlockIndex(b, uint64(idx)) } } - - return nil, nil + return nil } // PublicTransactionPoolAPI exposes methods for the RPC interface @@ -898,24 +886,6 @@ func NewPublicTransactionPoolAPI(b Backend, nonceLock *AddrLocker) *PublicTransa return &PublicTransactionPoolAPI{b, nonceLock} } -func getTransaction(chainDb ethdb.Database, b Backend, txHash common.Hash) (*types.Transaction, bool, error) { - txData, err := chainDb.Get(txHash.Bytes()) - isPending := false - tx := new(types.Transaction) - - if err == nil && len(txData) > 0 { - if err := rlp.DecodeBytes(txData, tx); err != nil { - return nil, isPending, err - } - } else { - // pending transaction? - tx = b.GetPoolTransaction(txHash) - isPending = true - } - - return tx, isPending, nil -} - // GetBlockTransactionCountByNumber returns the number of transactions in the block with the given block number. func (s *PublicTransactionPoolAPI) GetBlockTransactionCountByNumber(ctx context.Context, blockNr rpc.BlockNumber) *hexutil.Uint { if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil { @@ -935,35 +905,35 @@ func (s *PublicTransactionPoolAPI) GetBlockTransactionCountByHash(ctx context.Co } // GetTransactionByBlockNumberAndIndex returns the transaction for the given block number and index. -func (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (*RPCTransaction, error) { +func (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) *RPCTransaction { if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil { - return newRPCTransactionFromBlockIndex(block, uint(index)) + return newRPCTransactionFromBlockIndex(block, uint64(index)) } - return nil, nil + return nil } // GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index. -func (s *PublicTransactionPoolAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (*RPCTransaction, error) { +func (s *PublicTransactionPoolAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) *RPCTransaction { if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { - return newRPCTransactionFromBlockIndex(block, uint(index)) + return newRPCTransactionFromBlockIndex(block, uint64(index)) } - return nil, nil + return nil } // GetRawTransactionByBlockNumberAndIndex returns the bytes of the transaction for the given block number and index. -func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (hexutil.Bytes, error) { +func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) hexutil.Bytes { if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil { - return newRPCRawTransactionFromBlockIndex(block, uint(index)) + return newRPCRawTransactionFromBlockIndex(block, uint64(index)) } - return nil, nil + return nil } // GetRawTransactionByBlockHashAndIndex returns the bytes of the transaction for the given block hash and index. -func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (hexutil.Bytes, error) { +func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) hexutil.Bytes { if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { - return newRPCRawTransactionFromBlockIndex(block, uint(index)) + return newRPCRawTransactionFromBlockIndex(block, uint64(index)) } - return nil, nil + return nil } // GetTransactionCount returns the number of transactions the given address has sent for the given block number @@ -976,90 +946,42 @@ func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, addr return (*hexutil.Uint64)(&nonce), state.Error() } -// getTransactionBlockData fetches the meta data for the given transaction from the chain database. This is useful to -// retrieve block information for a hash. It returns the block hash, block index and transaction index. -func getTransactionBlockData(chainDb ethdb.Database, txHash common.Hash) (common.Hash, uint64, uint64, error) { - var txBlock struct { - BlockHash common.Hash - BlockIndex uint64 - Index uint64 - } - - blockData, err := chainDb.Get(append(txHash.Bytes(), 0x0001)) - if err != nil { - return common.Hash{}, uint64(0), uint64(0), err - } - - reader := bytes.NewReader(blockData) - if err = rlp.Decode(reader, &txBlock); err != nil { - return common.Hash{}, uint64(0), uint64(0), err - } - - return txBlock.BlockHash, txBlock.BlockIndex, txBlock.Index, nil -} - // GetTransactionByHash returns the transaction for the given hash -func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (*RPCTransaction, error) { - var tx *types.Transaction - var isPending bool - var err error - - if tx, isPending, err = getTransaction(s.b.ChainDb(), s.b, hash); err != nil { - log.Debug("Failed to retrieve transaction", "hash", hash, "err", err) - return nil, nil - } else if tx == nil { - return nil, nil +func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) *RPCTransaction { + // Try to return an already finalized transaction + if tx, blockHash, blockNumber, index := core.GetTransaction(s.b.ChainDb(), hash); tx != nil { + return newRPCTransaction(tx, blockHash, blockNumber, index) } - if isPending { - return newRPCPendingTransaction(tx), nil + // No finalized transaction, try to retrieve it from the pool + if tx := s.b.GetPoolTransaction(hash); tx != nil { + return newRPCPendingTransaction(tx) } - - blockHash, _, _, err := getTransactionBlockData(s.b.ChainDb(), hash) - if err != nil { - log.Debug("Failed to retrieve transaction block", "hash", hash, "err", err) - return nil, nil - } - - if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { - return newRPCTransaction(block, hash) - } - return nil, nil + // Transaction unknown, return as such + return nil } // GetRawTransactionByHash returns the bytes of the transaction for the given hash. func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) { var tx *types.Transaction - var err error - if tx, _, err = getTransaction(s.b.ChainDb(), s.b, hash); err != nil { - log.Debug("Failed to retrieve transaction", "hash", hash, "err", err) - return nil, nil - } else if tx == nil { - return nil, nil + // Retrieve a finalized transaction, or a pooled otherwise + if tx, _, _, _ = core.GetTransaction(s.b.ChainDb(), hash); tx == nil { + if tx = s.b.GetPoolTransaction(hash); tx == nil { + // Transaction not found anywhere, abort + return nil, nil + } } - + // Serialize to RLP and return return rlp.EncodeToBytes(tx) } // GetTransactionReceipt returns the transaction receipt for the given transaction hash. func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) { - receipt := core.GetReceipt(s.b.ChainDb(), hash) - if receipt == nil { - log.Debug("Receipt not found for transaction", "hash", hash) - return nil, nil - } - - tx, _, err := getTransaction(s.b.ChainDb(), s.b, hash) - if err != nil { - log.Debug("Failed to retrieve transaction", "hash", hash, "err", err) - return nil, nil - } - - txBlock, blockIndex, index, err := getTransactionBlockData(s.b.ChainDb(), hash) - if err != nil { - log.Debug("Failed to retrieve transaction block", "hash", hash, "err", err) + tx, blockHash, blockNumber, index := core.GetTransaction(s.b.ChainDb(), hash) + if tx == nil { return nil, nil } + receipt, _, _, _ := core.GetReceipt(s.b.ChainDb(), hash) // Old receipts don't have the lookup data available var signer types.Signer = types.FrontierSigner{} if tx.Protected() { @@ -1069,8 +991,8 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[ fields := map[string]interface{}{ "root": hexutil.Bytes(receipt.PostState), - "blockHash": txBlock, - "blockNumber": hexutil.Uint64(blockIndex), + "blockHash": blockHash, + "blockNumber": hexutil.Uint64(blockNumber), "transactionHash": hash, "transactionIndex": hexutil.Uint64(index), "from": from, diff --git a/light/txpool.go b/light/txpool.go index 0430b280f6..416148b7e6 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -130,19 +130,6 @@ type txBlockData struct { Index uint64 } -// storeTxBlockData stores the block position of a mined tx in the local db -func (pool *TxPool) storeTxBlockData(txh common.Hash, tbd txBlockData) { - //fmt.Println("storeTxBlockData", txh, tbd) - data, _ := rlp.EncodeToBytes(tbd) - pool.chainDb.Put(append(txh[:], byte(1)), data) -} - -// removeTxBlockData removes the stored block position of a rolled back tx -func (pool *TxPool) removeTxBlockData(txh common.Hash) { - //fmt.Println("removeTxBlockData", txh) - pool.chainDb.Delete(append(txh[:], byte(1))) -} - // txStateChanges stores the recent changes between pending/mined states of // transactions. True means mined, false means rolled back, no entry means no change type txStateChanges map[common.Hash]bool @@ -172,59 +159,48 @@ func (txc txStateChanges) getLists() (mined []common.Hash, rollback []common.Has // checkMinedTxs checks newly added blocks for the currently pending transactions // and marks them as mined if necessary. It also stores block position in the db // and adds them to the received txStateChanges map. -func (pool *TxPool) checkMinedTxs(ctx context.Context, hash common.Hash, idx uint64, txc txStateChanges) error { - //fmt.Println("checkMinedTxs") +func (pool *TxPool) checkMinedTxs(ctx context.Context, hash common.Hash, number uint64, txc txStateChanges) error { + // If no transactions are pending, we don't care about anything if len(pool.pending) == 0 { return nil } - //fmt.Println("len(pool) =", len(pool.pending)) - - block, err := GetBlock(ctx, pool.odr, hash, idx) - var receipts types.Receipts + block, err := GetBlock(ctx, pool.odr, hash, number) if err != nil { - //fmt.Println(err) return err } - //fmt.Println("len(block.Transactions()) =", len(block.Transactions())) - + // Gather all the local transaction mined in this block list := pool.mined[hash] - for i, tx := range block.Transactions() { - txHash := tx.Hash() - //fmt.Println(" txHash:", txHash) - if tx, ok := pool.pending[txHash]; ok { - //fmt.Println("TX FOUND") - if receipts == nil { - receipts, err = GetBlockReceipts(ctx, pool.odr, hash, idx) - if err != nil { - return err - } - if len(receipts) != len(block.Transactions()) { - panic(nil) // should never happen if hashes did match - } - core.SetReceiptsData(pool.config, block, receipts) - } - //fmt.Println("WriteReceipt", receipts[i].TxHash) - core.WriteReceipt(pool.chainDb, receipts[i]) - pool.storeTxBlockData(txHash, txBlockData{hash, idx, uint64(i)}) - delete(pool.pending, txHash) + for _, tx := range block.Transactions() { + if _, ok := pool.pending[tx.Hash()]; ok { list = append(list, tx) - txc.setState(txHash, true) } } + // If some transactions have been mined, write the needed data to disk and update if list != nil { + // Retrieve all the receipts belonging to this block and write the loopup table + if _, err := GetBlockReceipts(ctx, pool.odr, hash, number); err != nil { // ODR caches, ignore results + return err + } + if err := core.WriteTxLookupEntries(pool.chainDb, block); err != nil { + return err + } + // Update the transaction pool's state + for _, tx := range list { + delete(pool.pending, tx.Hash()) + txc.setState(tx.Hash(), true) + } pool.mined[hash] = list } return nil } // rollbackTxs marks the transactions contained in recently rolled back blocks -// as rolled back. It also removes block position info from the db and adds them -// to the received txStateChanges map. +// as rolled back. It also removes any positional lookup entries. func (pool *TxPool) rollbackTxs(hash common.Hash, txc txStateChanges) { if list, ok := pool.mined[hash]; ok { for _, tx := range list { txHash := tx.Hash() - pool.removeTxBlockData(txHash) + core.DeleteTxLookupEntry(pool.chainDb, txHash) pool.pending[txHash] = tx txc.setState(txHash, false) } diff --git a/miner/worker.go b/miner/worker.go index e44514755a..411bc4e1b8 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -293,9 +293,7 @@ func (self *worker) wait() { // check if canon block and write transactions if stat == core.CanonStatTy { // This puts transactions in a extra db for rpc - core.WriteTransactions(self.chainDb, block) - // store the receipts - core.WriteReceipts(self.chainDb, work.receipts) + core.WriteTxLookupEntries(self.chainDb, block) // Write map map bloom filters core.WriteMipmapBloom(self.chainDb, block.NumberU64(), work.receipts) // implicit by posting ChainHeadEvent From 9e80d9bee1363520f4868bd63e42dea79ada24e5 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Sun, 16 Jul 2017 13:26:16 +0100 Subject: [PATCH 012/272] common: Address.Hex() outputs EIP55-compliant string --- common/types.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/common/types.go b/common/types.go index 8037266349..eaf8352fbc 100644 --- a/common/types.go +++ b/common/types.go @@ -24,6 +24,7 @@ import ( "reflect" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto/sha3" ) const ( @@ -163,7 +164,28 @@ func (a Address) Str() string { return string(a[:]) } func (a Address) Bytes() []byte { return a[:] } func (a Address) Big() *big.Int { return new(big.Int).SetBytes(a[:]) } func (a Address) Hash() Hash { return BytesToHash(a[:]) } -func (a Address) Hex() string { return hexutil.Encode(a[:]) } + +// Hex returns an EIP55-compliant hex string representation of the address. +func (a Address) Hex() string { + unchecksummed := hex.EncodeToString(a[:]) + sha := sha3.NewKeccak256() + sha.Write([]byte(unchecksummed)) + hash := sha.Sum(nil) + + result := []byte(unchecksummed) + for i := 0; i < len(result); i++ { + hashByte := hash[i/2] + if i%2 == 0 { + hashByte = hashByte >> 4 + } else { + hashByte &= 0xf + } + if result[i] > '9' && hashByte > 7 { + result[i] -= 32 + } + } + return "0x" + string(result) +} // String implements the stringer interface and is used also by the logger. func (a Address) String() string { From ad8d519eb5dbf7852737f827c563c70287a4dfa8 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Sun, 16 Jul 2017 13:28:22 +0100 Subject: [PATCH 013/272] common: tests for EIP55-compliant Address.Hex() --- common/types_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/common/types_test.go b/common/types_test.go index 154c330632..6f3b315761 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -94,3 +94,34 @@ func TestAddressUnmarshalJSON(t *testing.T) { } } } + +func TestAddressHexChecksum(t *testing.T) { + var tests = []struct { + Input string + Output string + }{ + // Test cases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md#specification + {"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"}, + {"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359", "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"}, + {"0xdbf03b407c01e7cd3cbea99509d93f8dddc8c6fb", "0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB"}, + {"0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb"}, + // Ensure that non-standard length input values are handled correctly + {"0xa", "0x000000000000000000000000000000000000000A"}, + {"0x0a", "0x000000000000000000000000000000000000000A"}, + {"0x00a", "0x000000000000000000000000000000000000000A"}, + {"0x000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000A"}, + } + for i, test := range tests { + output := HexToAddress(test.Input).Hex() + if output != test.Output { + t.Errorf("test #%d: failed to match when it should (%s != %s)", i, output, test.Output) + } + } +} + +func BenchmarkAddressHex(b *testing.B) { + testAddr := HexToAddress("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") + for n := 0; n < b.N; n++ { + testAddr.Hex() + } +} From 688ee6d1e5194c5ec1c7862e47a674a13b0f5f4a Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Sun, 16 Jul 2017 13:29:20 +0100 Subject: [PATCH 014/272] cmd/geth: update tests for EIP55-compliant Address.Hex() --- cmd/geth/accountcmd_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/geth/accountcmd_test.go b/cmd/geth/accountcmd_test.go index e146323eeb..66e3e02a4e 100644 --- a/cmd/geth/accountcmd_test.go +++ b/cmd/geth/accountcmd_test.go @@ -146,7 +146,7 @@ Passphrase: {{.InputLine "foobar"}} wantMessages := []string{ "Unlocked account", - "=0xf466859ead1932d743d622cb74fc058882e8648a", + "=0xf466859eAD1932D743d622CB74FC058882E8648A", } for _, m := range wantMessages { if !strings.Contains(geth.StderrText(), m) { @@ -191,8 +191,8 @@ Passphrase: {{.InputLine "foobar"}} wantMessages := []string{ "Unlocked account", - "=0x7ef5a6135f1fd6a02593eedc869c6d41d934aef8", - "=0x289d485d9771714cce91d3393d764e1311907acc", + "=0x7EF5A6135f1FD6a02593eEdC869c6D41D934aef8", + "=0x289d485D9771714CCe91D3393D764E1311907ACc", } for _, m := range wantMessages { if !strings.Contains(geth.StderrText(), m) { @@ -211,8 +211,8 @@ func TestUnlockFlagPasswordFile(t *testing.T) { wantMessages := []string{ "Unlocked account", - "=0x7ef5a6135f1fd6a02593eedc869c6d41d934aef8", - "=0x289d485d9771714cce91d3393d764e1311907acc", + "=0x7EF5A6135f1FD6a02593eEdC869c6D41D934aef8", + "=0x289d485D9771714CCe91D3393D764E1311907ACc", } for _, m := range wantMessages { if !strings.Contains(geth.StderrText(), m) { @@ -261,7 +261,7 @@ In order to avoid this warning, you need to remove the following duplicate key f wantMessages := []string{ "Unlocked account", - "=0xf466859ead1932d743d622cb74fc058882e8648a", + "=0xf466859eAD1932D743d622CB74FC058882E8648A", } for _, m := range wantMessages { if !strings.Contains(geth.StderrText(), m) { From 47359301a24b3682b5bf9bbfae0cf8ae21a9ee62 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 17 Jul 2017 10:33:13 +0200 Subject: [PATCH 015/272] core: blocknumber in genesis as hex (#14812) --- core/gen_genesis.go | 10 ++++------ core/genesis.go | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/gen_genesis.go b/core/gen_genesis.go index 1f3b4a8aa2..4d75704a6d 100644 --- a/core/gen_genesis.go +++ b/core/gen_genesis.go @@ -13,8 +13,6 @@ import ( "github.com/ethereum/go-ethereum/params" ) -var _ = (*genesisSpecMarshaling)(nil) - func (g Genesis) MarshalJSON() ([]byte, error) { type Genesis struct { Config *params.ChainConfig `json:"config"` @@ -26,7 +24,7 @@ func (g Genesis) MarshalJSON() ([]byte, error) { Mixhash common.Hash `json:"mixHash"` Coinbase common.Address `json:"coinbase"` Alloc map[common.UnprefixedAddress]GenesisAccount `json:"alloc" gencodec:"required"` - Number uint64 `json:"number"` + Number math.HexOrDecimal64 `json:"number"` GasUsed math.HexOrDecimal64 `json:"gasUsed"` ParentHash common.Hash `json:"parentHash"` } @@ -45,7 +43,7 @@ func (g Genesis) MarshalJSON() ([]byte, error) { enc.Alloc[common.UnprefixedAddress(k)] = v } } - enc.Number = g.Number + enc.Number = math.HexOrDecimal64(g.Number) enc.GasUsed = math.HexOrDecimal64(g.GasUsed) enc.ParentHash = g.ParentHash return json.Marshal(&enc) @@ -62,7 +60,7 @@ func (g *Genesis) UnmarshalJSON(input []byte) error { Mixhash *common.Hash `json:"mixHash"` Coinbase *common.Address `json:"coinbase"` Alloc map[common.UnprefixedAddress]GenesisAccount `json:"alloc" gencodec:"required"` - Number *uint64 `json:"number"` + Number *math.HexOrDecimal64 `json:"number"` GasUsed *math.HexOrDecimal64 `json:"gasUsed"` ParentHash *common.Hash `json:"parentHash"` } @@ -104,7 +102,7 @@ func (g *Genesis) UnmarshalJSON(input []byte) error { g.Alloc[common.Address(k)] = v } if dec.Number != nil { - g.Number = *dec.Number + g.Number = uint64(*dec.Number) } if dec.GasUsed != nil { g.GasUsed = uint64(*dec.GasUsed) diff --git a/core/genesis.go b/core/genesis.go index a507d522b9..fd6ed61159 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -92,6 +92,7 @@ type genesisSpecMarshaling struct { ExtraData hexutil.Bytes GasLimit math.HexOrDecimal64 GasUsed math.HexOrDecimal64 + Number math.HexOrDecimal64 Difficulty *math.HexOrDecimal256 Alloc map[common.UnprefixedAddress]GenesisAccount } From a56f3dc0d94417e5d88bbb32b124b0889dfcbd6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 17 Jul 2017 11:34:53 +0300 Subject: [PATCH 016/272] core, ethclient: implement Metropolis EIP 98 (#14750) Implements ethereum/EIPs#98 --- core/state_processor.go | 10 ++++- core/types/gen_receipt_json.go | 9 ++-- core/types/receipt.go | 77 ++++++++++++++++++++++++++++------ ethclient/ethclient.go | 2 - 4 files changed, 77 insertions(+), 21 deletions(-) diff --git a/core/state_processor.go b/core/state_processor.go index 90f5a4f60c..4489cfce25 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -104,11 +104,17 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common } // Update the state with pending changes + var root []byte + if config.IsMetropolis(header.Number) { + statedb.Finalise() + } else { + root = statedb.IntermediateRoot(config.IsEIP158(header.Number)).Bytes() + } usedGas.Add(usedGas, gas) + // Create a new receipt for the transaction, storing the intermediate root and gas used by the tx // based on the eip phase, we're passing wether the root touch-delete accounts. - root := statedb.IntermediateRoot(config.IsEIP158(header.Number)) - receipt := types.NewReceipt(root.Bytes(), usedGas) + receipt := types.NewReceipt(root, usedGas) receipt.TxHash = tx.Hash() receipt.GasUsed = new(big.Int).Set(gas) // if the transaction created a contract, store the creation address in the receipt. diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index edbd64ba4e..eb2e5d42b4 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -13,7 +13,7 @@ import ( func (r Receipt) MarshalJSON() ([]byte, error) { type Receipt struct { - PostState hexutil.Bytes `json:"root" gencodec:"required"` + PostState hexutil.Bytes `json:"root"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -34,7 +34,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { func (r *Receipt) UnmarshalJSON(input []byte) error { type Receipt struct { - PostState hexutil.Bytes `json:"root" gencodec:"required"` + PostState hexutil.Bytes `json:"root"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom *Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -46,10 +46,9 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { if err := json.Unmarshal(input, &dec); err != nil { return err } - if dec.PostState == nil { - return errors.New("missing required field 'root' for Receipt") + if dec.PostState != nil { + r.PostState = dec.PostState } - r.PostState = dec.PostState if dec.CumulativeGasUsed == nil { return errors.New("missing required field 'cumulativeGasUsed' for Receipt") } diff --git a/core/types/receipt.go b/core/types/receipt.go index ef6f6a2bb2..c9906b0154 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -31,7 +31,7 @@ import ( // Receipt represents the results of a transaction. type Receipt struct { // Consensus fields - PostState []byte `json:"root" gencodec:"required"` + PostState []byte `json:"root"` CumulativeGasUsed *big.Int `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -48,35 +48,88 @@ type receiptMarshaling struct { GasUsed *hexutil.Big } +// homesteadReceiptRLP contains the receipt's Homestead consensus fields, used +// during RLP serialization. +type homesteadReceiptRLP struct { + PostState []byte + CumulativeGasUsed *big.Int + Bloom Bloom + Logs []*Log +} + +// metropolisReceiptRLP contains the receipt's Metropolis consensus fields, used +// during RLP serialization. +type metropolisReceiptRLP struct { + CumulativeGasUsed *big.Int + Bloom Bloom + Logs []*Log +} + // NewReceipt creates a barebone transaction receipt, copying the init fields. func NewReceipt(root []byte, cumulativeGasUsed *big.Int) *Receipt { return &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: new(big.Int).Set(cumulativeGasUsed)} } // EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt -// into an RLP stream. +// into an RLP stream. If no post state is present, metropolis fork is assumed. func (r *Receipt) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, []interface{}{r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs}) + if r.PostState == nil { + return rlp.Encode(w, &metropolisReceiptRLP{r.CumulativeGasUsed, r.Bloom, r.Logs}) + } + return rlp.Encode(w, &homesteadReceiptRLP{r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs}) } // DecodeRLP implements rlp.Decoder, and loads the consensus fields of a receipt // from an RLP stream. func (r *Receipt) DecodeRLP(s *rlp.Stream) error { - var receipt struct { - PostState []byte - CumulativeGasUsed *big.Int - Bloom Bloom - Logs []*Log - } - if err := s.Decode(&receipt); err != nil { + // Load the raw bytes since we have multiple possible formats + raw, err := s.Raw() + if err != nil { return err } - r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs = receipt.PostState, receipt.CumulativeGasUsed, receipt.Bloom, receipt.Logs - return nil + list, _, err := rlp.SplitList(raw) + if err != nil { + return err + } + items, err := rlp.CountValues(list) + if err != nil { + return err + } + // Deserialize based on the number of content items + switch items { + case 3: + // Metropolis receipts have 3 components + var metro metropolisReceiptRLP + if err := rlp.DecodeBytes(raw, &metro); err != nil { + return err + } + r.CumulativeGasUsed = metro.CumulativeGasUsed + r.Bloom = metro.Bloom + r.Logs = metro.Logs + return nil + + case 4: + // Homestead receipts have 4 components + var home homesteadReceiptRLP + if err := rlp.DecodeBytes(raw, &home); err != nil { + return err + } + r.PostState = home.PostState[:] + r.CumulativeGasUsed = home.CumulativeGasUsed + r.Bloom = home.Bloom + r.Logs = home.Logs + return nil + + default: + return fmt.Errorf("invalid receipt components: %v", items) + } } // String implements the Stringer interface. func (r *Receipt) String() string { + if r.PostState == nil { + return fmt.Sprintf("receipt{cgas=%v bloom=%x logs=%v}", r.CumulativeGasUsed, r.Bloom, r.Logs) + } return fmt.Sprintf("receipt{med=%x cgas=%v bloom=%x logs=%v}", r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs) } diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 45bb873225..02df03fff4 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -203,8 +203,6 @@ func (ec *Client) TransactionReceipt(ctx context.Context, txHash common.Hash) (* if err == nil { if r == nil { return nil, ethereum.NotFound - } else if len(r.PostState) == 0 { - return nil, fmt.Errorf("server returned receipt without post state") } } return r, err From 8e9197f2a12a854e5670cf63679bff3b1ceb754e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 17 Jul 2017 12:48:12 +0300 Subject: [PATCH 017/272] README: get rid of the on-existent disasm command --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index efa4b1c334..ac9760738a 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `disasm` | Bytecode disassembler to convert EVM (Ethereum Virtual Machine) bytecode into more user friendly assembly-like opcodes (e.g. `echo "6001" disasm`). For details on the individual opcodes, please see pages 22-30 of the [Ethereum Yellow Paper](http://gavwood.com/paper.pdf). | | `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | From cf5d4b55412f570bd1b492998b0c0b8e953e2418 Mon Sep 17 00:00:00 2001 From: ligi Date: Mon, 17 Jul 2017 13:31:26 +0200 Subject: [PATCH 018/272] mobile: use EIP155 signer (#14817) * mobile: Use EIP155Signer - closes #14762 * mobile: Correctly fall back on HomesteadSigner when no chainID is passed in --- mobile/types.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mobile/types.go b/mobile/types.go index 02282f7a37..4c4cd8822e 100644 --- a/mobile/types.go +++ b/mobile/types.go @@ -265,10 +265,11 @@ func (tx *Transaction) GetSigHash() *Hash { return &Hash{tx.tx.SigHash(types.Hom func (tx *Transaction) GetCost() *BigInt { return &BigInt{tx.tx.Cost()} } func (tx *Transaction) GetFrom(chainID *BigInt) (address *Address, _ error) { - if chainID == nil { // Null passed from mobile app - chainID = new(BigInt) + var signer types.Signer = types.HomesteadSigner{} + if chainID != nil { + signer = types.NewEIP155Signer(chainID.bigint) } - from, err := types.Sender(types.NewEIP155Signer(chainID.bigint), tx.tx) + from, err := types.Sender(signer, tx.tx) return &Address{from}, err } @@ -279,8 +280,12 @@ func (tx *Transaction) GetTo() *Address { return nil } -func (tx *Transaction) WithSignature(sig []byte) (signedTx *Transaction, _ error) { - rawTx, err := tx.tx.WithSignature(types.HomesteadSigner{}, sig) +func (tx *Transaction) WithSignature(sig []byte, chainID *BigInt) (signedTx *Transaction, _ error) { + var signer types.Signer = types.HomesteadSigner{} + if chainID != nil { + signer = types.NewEIP155Signer(chainID.bigint) + } + rawTx, err := tx.tx.WithSignature(signer, sig) return &Transaction{rawTx}, err } From 23c6fcdbe834b70ff25473e6ff03da94814609c1 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 17 Jul 2017 14:25:46 +0200 Subject: [PATCH 019/272] mobile: don't retain transient []byte in CallMsg.SetData (#14804) * mobile: don't retain transient []byte in CallMsg.SetData Go mobile doesn't copy []byte parameters, for performance and to allow writes to the byte array be reflected in the native byte array. Unfortunately, that means []byte arguments are only valid during the call it is being passed into. CallMsg.SetData retains such a byte array. Copy it instead Fixes #14675 * mobile: copy all []byte arguments from gomobile To avoid subtle errors when accidentially retaining an otherwise transient byte slice coming from gomobile, copy all byte slices before use. * mobile: replace copySlice with common.CopyBytes --- mobile/accounts.go | 11 ++++++----- mobile/big.go | 4 +++- mobile/bind.go | 2 +- mobile/common.go | 4 ++-- mobile/ethereum.go | 2 +- mobile/interface.go | 2 +- mobile/types.go | 13 +++++++------ 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/mobile/accounts.go b/mobile/accounts.go index 977999c3af..4d979bffff 100644 --- a/mobile/accounts.go +++ b/mobile/accounts.go @@ -25,6 +25,7 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" ) @@ -111,7 +112,7 @@ func (ks *KeyStore) DeleteAccount(account *Account, passphrase string) error { // SignHash calculates a ECDSA signature for the given hash. The produced signature // is in the [R || S || V] format where V is 0 or 1. func (ks *KeyStore) SignHash(address *Address, hash []byte) (signature []byte, _ error) { - return ks.keystore.SignHash(accounts.Account{Address: address.address}, hash) + return ks.keystore.SignHash(accounts.Account{Address: address.address}, common.CopyBytes(hash)) } // SignTx signs the given transaction with the requested account. @@ -130,7 +131,7 @@ func (ks *KeyStore) SignTx(account *Account, tx *Transaction, chainID *BigInt) ( // be decrypted with the given passphrase. The produced signature is in the // [R || S || V] format where V is 0 or 1. func (ks *KeyStore) SignHashPassphrase(account *Account, passphrase string, hash []byte) (signature []byte, _ error) { - return ks.keystore.SignHashWithPassphrase(account.account, passphrase, hash) + return ks.keystore.SignHashWithPassphrase(account.account, passphrase, common.CopyBytes(hash)) } // SignTxPassphrase signs the transaction if the private key matching the @@ -189,7 +190,7 @@ func (ks *KeyStore) ExportKey(account *Account, passphrase, newPassphrase string // ImportKey stores the given encrypted JSON key into the key directory. func (ks *KeyStore) ImportKey(keyJSON []byte, passphrase, newPassphrase string) (account *Account, _ error) { - acc, err := ks.keystore.Import(keyJSON, passphrase, newPassphrase) + acc, err := ks.keystore.Import(common.CopyBytes(keyJSON), passphrase, newPassphrase) if err != nil { return nil, err } @@ -198,7 +199,7 @@ func (ks *KeyStore) ImportKey(keyJSON []byte, passphrase, newPassphrase string) // ImportECDSAKey stores the given encrypted JSON key into the key directory. func (ks *KeyStore) ImportECDSAKey(key []byte, passphrase string) (account *Account, _ error) { - privkey, err := crypto.ToECDSA(key) + privkey, err := crypto.ToECDSA(common.CopyBytes(key)) if err != nil { return nil, err } @@ -212,7 +213,7 @@ func (ks *KeyStore) ImportECDSAKey(key []byte, passphrase string) (account *Acco // ImportPreSaleKey decrypts the given Ethereum presale wallet and stores // a key file in the key directory. The key file is encrypted with the same passphrase. func (ks *KeyStore) ImportPreSaleKey(keyJSON []byte, passphrase string) (ccount *Account, _ error) { - account, err := ks.keystore.ImportPreSaleKey(keyJSON, passphrase) + account, err := ks.keystore.ImportPreSaleKey(common.CopyBytes(keyJSON), passphrase) if err != nil { return nil, err } diff --git a/mobile/big.go b/mobile/big.go index 525717caa8..564fbad47c 100644 --- a/mobile/big.go +++ b/mobile/big.go @@ -21,6 +21,8 @@ package geth import ( "errors" "math/big" + + "github.com/ethereum/go-ethereum/common" ) // A BigInt represents a signed multi-precision integer. @@ -52,7 +54,7 @@ func (bi *BigInt) GetInt64() int64 { // SetBytes interprets buf as the bytes of a big-endian unsigned integer and sets // the big int to that value. func (bi *BigInt) SetBytes(buf []byte) { - bi.bigint.SetBytes(buf) + bi.bigint.SetBytes(common.CopyBytes(buf)) } // SetInt64 sets the big int to x. diff --git a/mobile/bind.go b/mobile/bind.go index bc4eb25bad..084d6ef4c7 100644 --- a/mobile/bind.go +++ b/mobile/bind.go @@ -119,7 +119,7 @@ func DeployContract(opts *TransactOpts, abiJSON string, bytecode []byte, client if err != nil { return nil, err } - addr, tx, bound, err := bind.DeployContract(&opts.opts, parsed, bytecode, client.client, args.objects...) + addr, tx, bound, err := bind.DeployContract(&opts.opts, parsed, common.CopyBytes(bytecode), client.client, args.objects...) if err != nil { return nil, err } diff --git a/mobile/common.go b/mobile/common.go index 3090014c5a..047d8e1f65 100644 --- a/mobile/common.go +++ b/mobile/common.go @@ -35,7 +35,7 @@ type Hash struct { // NewHashFromBytes converts a slice of bytes to a hash value. func NewHashFromBytes(binary []byte) (hash *Hash, _ error) { h := new(Hash) - if err := h.SetBytes(binary); err != nil { + if err := h.SetBytes(common.CopyBytes(binary)); err != nil { return nil, err } return h, nil @@ -136,7 +136,7 @@ type Address struct { // NewAddressFromBytes converts a slice of bytes to a hash value. func NewAddressFromBytes(binary []byte) (address *Address, _ error) { a := new(Address) - if err := a.SetBytes(binary); err != nil { + if err := a.SetBytes(common.CopyBytes(binary)); err != nil { return nil, err } return a, nil diff --git a/mobile/ethereum.go b/mobile/ethereum.go index 30a94dc89c..c9bb3013c2 100644 --- a/mobile/ethereum.go +++ b/mobile/ethereum.go @@ -64,7 +64,7 @@ func (msg *CallMsg) SetFrom(address *Address) { msg.msg.From = address.address func (msg *CallMsg) SetGas(gas int64) { msg.msg.Gas = big.NewInt(gas) } func (msg *CallMsg) SetGasPrice(price *BigInt) { msg.msg.GasPrice = price.bigint } func (msg *CallMsg) SetValue(value *BigInt) { msg.msg.Value = value.bigint } -func (msg *CallMsg) SetData(data []byte) { msg.msg.Data = data } +func (msg *CallMsg) SetData(data []byte) { msg.msg.Data = common.CopyBytes(data) } func (msg *CallMsg) SetTo(address *Address) { if address == nil { msg.msg.To = nil diff --git a/mobile/interface.go b/mobile/interface.go index 10eac5f725..72958e66a2 100644 --- a/mobile/interface.go +++ b/mobile/interface.go @@ -46,7 +46,7 @@ func (i *Interface) SetBool(b bool) { i.object = &b } func (i *Interface) SetBools(bs []bool) { i.object = &bs } func (i *Interface) SetString(str string) { i.object = &str } func (i *Interface) SetStrings(strs *Strings) { i.object = &strs.strs } -func (i *Interface) SetBinary(binary []byte) { i.object = &binary } +func (i *Interface) SetBinary(binary []byte) { b := common.CopyBytes(binary); i.object = &b } func (i *Interface) SetBinaries(binaries [][]byte) { i.object = &binaries } func (i *Interface) SetAddress(address *Address) { i.object = &address.address } func (i *Interface) SetAddresses(addrs *Addresses) { i.object = &addrs.addresses } diff --git a/mobile/types.go b/mobile/types.go index 4c4cd8822e..088c7c6b33 100644 --- a/mobile/types.go +++ b/mobile/types.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" ) @@ -68,7 +69,7 @@ func NewHeaderFromRLP(data []byte) (*Header, error) { h := &Header{ header: new(types.Header), } - if err := rlp.DecodeBytes(data, h.header); err != nil { + if err := rlp.DecodeBytes(common.CopyBytes(data), h.header); err != nil { return nil, err } return h, nil @@ -145,7 +146,7 @@ func NewBlockFromRLP(data []byte) (*Block, error) { b := &Block{ block: new(types.Block), } - if err := rlp.DecodeBytes(data, b.block); err != nil { + if err := rlp.DecodeBytes(common.CopyBytes(data), b.block); err != nil { return nil, err } return b, nil @@ -212,7 +213,7 @@ type Transaction struct { // NewTransaction creates a new transaction with the given properties. func NewTransaction(nonce int64, to *Address, amount, gasLimit, gasPrice *BigInt, data []byte) *Transaction { - return &Transaction{types.NewTransaction(uint64(nonce), to.address, amount.bigint, gasLimit.bigint, gasPrice.bigint, data)} + return &Transaction{types.NewTransaction(uint64(nonce), to.address, amount.bigint, gasLimit.bigint, gasPrice.bigint, common.CopyBytes(data))} } // NewTransactionFromRLP parses a transaction from an RLP data dump. @@ -220,7 +221,7 @@ func NewTransactionFromRLP(data []byte) (*Transaction, error) { tx := &Transaction{ tx: new(types.Transaction), } - if err := rlp.DecodeBytes(data, tx.tx); err != nil { + if err := rlp.DecodeBytes(common.CopyBytes(data), tx.tx); err != nil { return nil, err } return tx, nil @@ -285,7 +286,7 @@ func (tx *Transaction) WithSignature(sig []byte, chainID *BigInt) (signedTx *Tra if chainID != nil { signer = types.NewEIP155Signer(chainID.bigint) } - rawTx, err := tx.tx.WithSignature(signer, sig) + rawTx, err := tx.tx.WithSignature(signer, common.CopyBytes(sig)) return &Transaction{rawTx}, err } @@ -315,7 +316,7 @@ func NewReceiptFromRLP(data []byte) (*Receipt, error) { r := &Receipt{ receipt: new(types.Receipt), } - if err := rlp.DecodeBytes(data, r.receipt); err != nil { + if err := rlp.DecodeBytes(common.CopyBytes(data), r.receipt); err != nil { return nil, err } return r, nil From 9488e7fd5fee6e88911758ba8202409004edec63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 17 Jul 2017 20:38:40 +0300 Subject: [PATCH 020/272] cmd/puppeth: limit cotnainers to 10MB logs --- cmd/puppeth/module_dashboard.go | 5 +++++ cmd/puppeth/module_ethstats.go | 5 +++++ cmd/puppeth/module_faucet.go | 5 +++++ cmd/puppeth/module_nginx.go | 5 +++++ cmd/puppeth/module_node.go | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/cmd/puppeth/module_dashboard.go b/cmd/puppeth/module_dashboard.go index 17f119111c..1cf6cab799 100644 --- a/cmd/puppeth/module_dashboard.go +++ b/cmd/puppeth/module_dashboard.go @@ -425,6 +425,11 @@ services: - "{{.Port}}:80"{{else}} environment: - VIRTUAL_HOST={{.VHost}}{{end}} + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" restart: always ` diff --git a/cmd/puppeth/module_ethstats.go b/cmd/puppeth/module_ethstats.go index 571df1454c..da34acb3bb 100644 --- a/cmd/puppeth/module_ethstats.go +++ b/cmd/puppeth/module_ethstats.go @@ -60,6 +60,11 @@ services: environment: - WS_SECRET={{.Secret}}{{if .VHost}} - VIRTUAL_HOST={{.VHost}}{{end}} + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" restart: always ` diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index 5a5dc65064..acf1e4324e 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -82,6 +82,11 @@ services: - CAPTCHA_SECRET={{.CaptchaSecret}}{{if .VHost}} - VIRTUAL_HOST={{.VHost}} - VIRTUAL_PORT=8080{{end}} + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" restart: always ` diff --git a/cmd/puppeth/module_nginx.go b/cmd/puppeth/module_nginx.go index 0eac5ace53..fd6d1d74ed 100644 --- a/cmd/puppeth/module_nginx.go +++ b/cmd/puppeth/module_nginx.go @@ -43,6 +43,11 @@ services: - "{{.Port}}:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" restart: always ` diff --git a/cmd/puppeth/module_node.go b/cmd/puppeth/module_node.go index ce1d341357..9fe97c892d 100644 --- a/cmd/puppeth/module_node.go +++ b/cmd/puppeth/module_node.go @@ -68,6 +68,11 @@ services: - MINER_NAME={{.Etherbase}} - GAS_TARGET={{.GasTarget}} - GAS_PRICE={{.GasPrice}} + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" restart: always ` From 671ba3791d31e46c21a34b061b804536a98c0182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 17 Jul 2017 21:15:25 +0300 Subject: [PATCH 021/272] cmd/faucet: ignore whitespace in gist content --- cmd/faucet/faucet.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index c06c4365b5..8cd62441ed 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -413,8 +413,9 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { // Iterate over all the files and look for Ethereum addresses var address common.Address for _, file := range gist.Files { - if len(file.Content) == 2+common.AddressLength*2 { - address = common.HexToAddress(file.Content) + content := strings.TrimSpace(file.Content) + if len(content) == 2+common.AddressLength*2 { + address = common.HexToAddress(content) } } if address == (common.Address{}) { From 1802682f65655a69cb17c21113100bac16539192 Mon Sep 17 00:00:00 2001 From: Chase Wright Date: Tue, 18 Jul 2017 03:58:46 -0500 Subject: [PATCH 022/272] node: Rename TrusterNodes (#14827) * node: Rename TrusterNodes * node: Rename TrusterNodes --- node/config.go | 4 ++-- node/node.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/node/config.go b/node/config.go index 61e0008ef9..abbe64f43c 100644 --- a/node/config.go +++ b/node/config.go @@ -316,8 +316,8 @@ func (c *Config) StaticNodes() []*discover.Node { return c.parsePersistentNodes(c.resolvePath(datadirStaticNodes)) } -// TrusterNodes returns a list of node enode URLs configured as trusted nodes. -func (c *Config) TrusterNodes() []*discover.Node { +// TrustedNodes returns a list of node enode URLs configured as trusted nodes. +func (c *Config) TrustedNodes() []*discover.Node { return c.parsePersistentNodes(c.resolvePath(datadirTrustedNodes)) } diff --git a/node/node.go b/node/node.go index a372b1c255..e3f0232b4b 100644 --- a/node/node.go +++ b/node/node.go @@ -160,7 +160,7 @@ func (n *Node) Start() error { n.serverConfig.StaticNodes = n.config.StaticNodes() } if n.serverConfig.TrustedNodes == nil { - n.serverConfig.TrustedNodes = n.config.TrusterNodes() + n.serverConfig.TrustedNodes = n.config.TrustedNodes() } if n.serverConfig.NodeDatabase == "" { n.serverConfig.NodeDatabase = n.config.NodeDB() From 3e0dbe0eaa723580a86a6a2f18ab744387d4235e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 19 Jul 2017 14:32:45 +0200 Subject: [PATCH 023/272] core/vm: remove logging and add section labels to struct logs (#14782) --- core/vm/contracts.go | 3 --- core/vm/interpreter.go | 11 ----------- core/vm/logger.go | 25 ++++++++++++++++--------- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 90b2f913e6..43b60ba775 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -23,7 +23,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "golang.org/x/crypto/ripemd160" ) @@ -76,14 +75,12 @@ func (c *ecrecover) Run(in []byte) ([]byte, error) { // tighter sig s values in homestead only apply to tx sigs if !allZero(in[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { - log.Trace("ECRECOVER error: v, r or s value invalid") return nil, nil } // v needs to be at the end for libsecp256k1 pubKey, err := crypto.Ecrecover(in[:32], append(in[64:128], v)) // make sure the public key is a valid one if err != nil { - log.Trace("ECRECOVER failed", "err", err) return nil, nil } diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 545f7d6502..0a225bca41 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -19,12 +19,10 @@ package vm import ( "fmt" "sync/atomic" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" ) @@ -122,19 +120,12 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret ) contract.Input = input - // User defer pattern to check for an error and, based on the error being nil or not, use all gas and return. defer func() { if err != nil && in.cfg.Debug { - // XXX For debugging - //fmt.Printf("%04d: %8v cost = %-8d stack = %-8d ERR = %v\n", pc, op, cost, stack.len(), err) in.cfg.Tracer.CaptureState(in.evm, pc, op, contract.Gas, cost, mem, stack, contract, in.evm.depth, err) } }() - log.Debug("interpreter running contract", "hash", codehash[:]) - tstart := time.Now() - defer log.Debug("interpreter finished running contract", "hash", codehash[:], "elapsed", time.Since(tstart)) - // The Interpreter main run loop (contextual). This loop runs until either an // explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during // the execution of one of the operations or until the done flag is set by the @@ -190,8 +181,6 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret if in.cfg.Debug { in.cfg.Tracer.CaptureState(in.evm, pc, op, contract.Gas, cost, mem, stack, contract, in.evm.depth, err) } - // XXX For debugging - //fmt.Printf("%04d: %8v cost = %-8d stack = %-8d\n", pc, op, cost, stack.len()) // execute the operation res, err := operation.execute(&pc, in.evm, contract, mem, stack) diff --git a/core/vm/logger.go b/core/vm/logger.go index 17a9c9ec3f..b73b13bd97 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -196,20 +196,27 @@ func (l *StructLogger) StructLogs() []StructLog { // WriteTrace writes a formatted trace to the given writer func WriteTrace(writer io.Writer, logs []StructLog) { for _, log := range logs { - fmt.Fprintf(writer, "%-10spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost) + fmt.Fprintf(writer, "%-16spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost) if log.Err != nil { fmt.Fprintf(writer, " ERROR: %v", log.Err) } - fmt.Fprintf(writer, "\n") + fmt.Fprintln(writer) - for i := len(log.Stack) - 1; i >= 0; i-- { - fmt.Fprintf(writer, "%08d %x\n", len(log.Stack)-i-1, math.PaddedBigBytes(log.Stack[i], 32)) + if len(log.Stack) > 0 { + fmt.Fprintln(writer, "Stack:") + for i := len(log.Stack) - 1; i >= 0; i-- { + fmt.Fprintf(writer, "%08d %x\n", len(log.Stack)-i-1, math.PaddedBigBytes(log.Stack[i], 32)) + } } - - fmt.Fprint(writer, hex.Dump(log.Memory)) - - for h, item := range log.Storage { - fmt.Fprintf(writer, "%x: %x\n", h, item) + if len(log.Memory) > 0 { + fmt.Fprintln(writer, "Memory:") + fmt.Fprint(writer, hex.Dump(log.Memory)) + } + if len(log.Storage) > 0 { + fmt.Fprintln(writer, "Storage:") + for h, item := range log.Storage { + fmt.Fprintf(writer, "%x: %x\n", h, item) + } } fmt.Fprintln(writer) } From 3a678a15c92e287c90eabab75463bbed97ba832c Mon Sep 17 00:00:00 2001 From: Leo Shklovskii Date: Mon, 24 Jul 2017 08:09:03 -0400 Subject: [PATCH 024/272] cmd/abigen: update generated go file header text (#14845) As per https://golang.org/s/generatedcode. This will allow other tools such as golint to properly ignore the files. --- accounts/abi/bind/template.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accounts/abi/bind/template.go b/accounts/abi/bind/template.go index 64dd598c0b..d07610e7c2 100644 --- a/accounts/abi/bind/template.go +++ b/accounts/abi/bind/template.go @@ -52,8 +52,8 @@ var tmplSource = map[Lang]string{ // tmplSourceGo is the Go source template use to generate the contract binding // based on. const tmplSourceGo = ` -// This file is an automatically generated Go binding. Do not modify as any -// change will likely be lost upon the next re-generation! +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. package {{.Package}} From f4841ff43dda9f41a47ec94b5a5356023eec59d4 Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Tue, 25 Jul 2017 10:51:26 +0100 Subject: [PATCH 025/272] swarm/api/http: redirect root manifest requests to include trailing slash (#14806) --- swarm/api/http/server.go | 6 ++++ swarm/api/http/server_test.go | 62 +++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index 5f64f971bb..b4032839af 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -522,6 +522,12 @@ func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) { // HandleGetFile handles a GET request to bzz:/// and responds // with the content of the file at from the given func (s *Server) HandleGetFile(w http.ResponseWriter, r *Request) { + // ensure the root path has a trailing slash so that relative URLs work + if r.uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") { + http.Redirect(w, &r.Request, r.URL.Path+"/", http.StatusMovedPermanently) + return + } + key, err := s.api.Resolve(r.uri) if err != nil { s.Error(w, r, fmt.Errorf("error resolving %s: %s", r.uri.Addr, err)) diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 0b124a19a9..14abd1df4a 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -18,12 +18,16 @@ package http_test import ( "bytes" + "errors" + "fmt" "io/ioutil" "net/http" "sync" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/swarm/api" + swarm "github.com/ethereum/go-ethereum/swarm/api/client" "github.com/ethereum/go-ethereum/swarm/storage" "github.com/ethereum/go-ethereum/swarm/testutil" ) @@ -128,3 +132,61 @@ func TestBzzrGetPath(t *testing.T) { } } + +// TestBzzRootRedirect tests that getting the root path of a manifest without +// a trailing slash gets redirected to include the trailing slash so that +// relative URLs work as expected. +func TestBzzRootRedirect(t *testing.T) { + srv := testutil.NewTestSwarmServer(t) + defer srv.Close() + + // create a manifest with some data at the root path + client := swarm.NewClient(srv.URL) + data := []byte("data") + file := &swarm.File{ + ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), + ManifestEntry: api.ManifestEntry{ + Path: "", + ContentType: "text/plain", + Size: int64(len(data)), + }, + } + hash, err := client.Upload(file, "") + if err != nil { + t.Fatal(err) + } + + // define a CheckRedirect hook which ensures there is only a single + // redirect to the correct URL + redirected := false + httpClient := http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + if redirected { + return errors.New("too many redirects") + } + redirected = true + expectedPath := "/bzz:/" + hash + "/" + if req.URL.Path != expectedPath { + return fmt.Errorf("expected redirect to %q, got %q", expectedPath, req.URL.Path) + } + return nil + }, + } + + // perform the GET request and assert the response + res, err := httpClient.Get(srv.URL + "/bzz:/" + hash) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + if !redirected { + t.Fatal("expected GET /bzz:/ to redirect to /bzz:// but it didn't") + } + gotData, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(gotData, data) { + t.Fatalf("expected response to equal %q, got %q", data, gotData) + } +} From 99da85c895c51e4512b1923f2fa0d040e2e1147e Mon Sep 17 00:00:00 2001 From: Petr Mikusek Date: Tue, 25 Jul 2017 19:02:40 +0200 Subject: [PATCH 026/272] trie: typo in comment --- trie/sync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trie/sync.go b/trie/sync.go index 9e8449431d..1e4f8d87c1 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -55,7 +55,7 @@ type SyncResult struct { // syncMemBatch is an in-memory buffer of successfully downloaded but not yet // persisted data items. type syncMemBatch struct { - batch map[common.Hash][]byte // In-memory membatch of recently ocmpleted items + batch map[common.Hash][]byte // In-memory membatch of recently completed items order []common.Hash // Order of completion to prevent out-of-order data loss } From ffebf00114e1da39828b5b9452a4353e7700915e Mon Sep 17 00:00:00 2001 From: cdetrio Date: Tue, 25 Jul 2017 13:06:56 -0400 Subject: [PATCH 027/272] core/vm/runtime: fix evm command to use --gasprice flag value --- core/vm/runtime/env.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go index 9aa88e6690..7b41fe85a7 100644 --- a/core/vm/runtime/env.go +++ b/core/vm/runtime/env.go @@ -37,7 +37,7 @@ func NewEnv(cfg *Config, state *state.StateDB) *vm.EVM { Time: cfg.Time, Difficulty: cfg.Difficulty, GasLimit: new(big.Int).SetUint64(cfg.GasLimit), - GasPrice: new(big.Int), + GasPrice: cfg.GasPrice, } return vm.NewEVM(context, cfg.State, cfg.ChainConfig, cfg.EVMConfig) From 3d32690b54539d13ec8e7884bf3416ada6046354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 28 Jul 2017 15:09:39 +0200 Subject: [PATCH 028/272] cmd, core, eth: journal local transactions to disk (#14784) * core: reduce txpool event loop goroutines and sync structs * cmd, core, eth: journal local transactions to disk * core: journal replacement pending transactions too * core: separate transaction journal from pool --- cmd/geth/main.go | 2 + cmd/geth/usage.go | 2 + cmd/utils/flags.go | 16 ++++ core/tx_journal.go | 150 +++++++++++++++++++++++++++++++++++++ core/tx_pool.go | 152 +++++++++++++++++++++++++------------- core/tx_pool_test.go | 172 +++++++++++++++++++++++++++++++++++-------- eth/backend.go | 6 +- 7 files changed, 416 insertions(+), 84 deletions(-) create mode 100644 core/tx_journal.go diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 607414bbb6..e89f88ec91 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -67,6 +67,8 @@ var ( utils.EthashDatasetsInMemoryFlag, utils.EthashDatasetsOnDiskFlag, utils.TxPoolNoLocalsFlag, + utils.TxPoolJournalFlag, + utils.TxPoolRejournalFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolPriceBumpFlag, utils.TxPoolAccountSlotsFlag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 275aad674b..80861d8525 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -96,6 +96,8 @@ var AppHelpFlagGroups = []flagGroup{ Name: "TRANSACTION POOL", Flags: []cli.Flag{ utils.TxPoolNoLocalsFlag, + utils.TxPoolJournalFlag, + utils.TxPoolRejournalFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolPriceBumpFlag, utils.TxPoolAccountSlotsFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 0159364af7..9f7b76c121 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -213,6 +213,16 @@ var ( Name: "txpool.nolocals", Usage: "Disables price exemptions for locally submitted transactions", } + TxPoolJournalFlag = cli.StringFlag{ + Name: "txpool.journal", + Usage: "Disk journal for local transaction to survive node restarts", + Value: core.DefaultTxPoolConfig.Journal, + } + TxPoolRejournalFlag = cli.DurationFlag{ + Name: "txpool.rejournal", + Usage: "Time interval to regenerate the local transaction journal", + Value: core.DefaultTxPoolConfig.Rejournal, + } TxPoolPriceLimitFlag = cli.Uint64Flag{ Name: "txpool.pricelimit", Usage: "Minimum gas price limit to enforce for acceptance into the pool", @@ -838,6 +848,12 @@ func setTxPool(ctx *cli.Context, cfg *core.TxPoolConfig) { if ctx.GlobalIsSet(TxPoolNoLocalsFlag.Name) { cfg.NoLocals = ctx.GlobalBool(TxPoolNoLocalsFlag.Name) } + if ctx.GlobalIsSet(TxPoolJournalFlag.Name) { + cfg.Journal = ctx.GlobalString(TxPoolJournalFlag.Name) + } + if ctx.GlobalIsSet(TxPoolRejournalFlag.Name) { + cfg.Rejournal = ctx.GlobalDuration(TxPoolRejournalFlag.Name) + } if ctx.GlobalIsSet(TxPoolPriceLimitFlag.Name) { cfg.PriceLimit = ctx.GlobalUint64(TxPoolPriceLimitFlag.Name) } diff --git a/core/tx_journal.go b/core/tx_journal.go new file mode 100644 index 0000000000..94a9ff9b8c --- /dev/null +++ b/core/tx_journal.go @@ -0,0 +1,150 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "errors" + "io" + "os" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" +) + +// errNoActiveJournal is returned if a transaction is attempted to be inserted +// into the journal, but no such file is currently open. +var errNoActiveJournal = errors.New("no active journal") + +// txJournal is a rotating log of transactions with the aim of storing locally +// created transactions to allow non-executed ones to survive node restarts. +type txJournal struct { + path string // Filesystem path to store the transactions at + writer io.WriteCloser // Output stream to write new transactions into +} + +// newTxJournal creates a new transaction journal to +func newTxJournal(path string) *txJournal { + return &txJournal{ + path: path, + } +} + +// load parses a transaction journal dump from disk, loading its contents into +// the specified pool. +func (journal *txJournal) load(add func(*types.Transaction) error) error { + // Skip the parsing if the journal file doens't exist at all + if _, err := os.Stat(journal.path); os.IsNotExist(err) { + return nil + } + // Open the journal for loading any past transactions + input, err := os.Open(journal.path) + if err != nil { + return err + } + defer input.Close() + + // Inject all transactions from the journal into the pool + stream := rlp.NewStream(input, 0) + total, dropped := 0, 0 + + var failure error + for { + // Parse the next transaction and terminate on error + tx := new(types.Transaction) + if err = stream.Decode(tx); err != nil { + if err != io.EOF { + failure = err + } + break + } + // Import the transaction and bump the appropriate progress counters + total++ + if err = add(tx); err != nil { + log.Debug("Failed to add journaled transaction", "err", err) + dropped++ + continue + } + } + log.Info("Loaded local transaction journal", "transactions", total, "dropped", dropped) + + return failure +} + +// insert adds the specified transaction to the local disk journal. +func (journal *txJournal) insert(tx *types.Transaction) error { + if journal.writer == nil { + return errNoActiveJournal + } + if err := rlp.Encode(journal.writer, tx); err != nil { + return err + } + return nil +} + +// rotate regenerates the transaction journal based on the current contents of +// the transaction pool. +func (journal *txJournal) rotate(all map[common.Address]types.Transactions) error { + // Close the current journal (if any is open) + if journal.writer != nil { + if err := journal.writer.Close(); err != nil { + return err + } + journal.writer = nil + } + // Generate a new journal with the contents of the current pool + replacement, err := os.OpenFile(journal.path+".new", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) + if err != nil { + return err + } + journaled := 0 + for _, txs := range all { + for _, tx := range txs { + if err = rlp.Encode(replacement, tx); err != nil { + replacement.Close() + return err + } + } + journaled += len(txs) + } + replacement.Close() + + // Replace the live journal with the newly generated one + if err = os.Rename(journal.path+".new", journal.path); err != nil { + return err + } + sink, err := os.OpenFile(journal.path, os.O_WRONLY|os.O_APPEND, 0755) + if err != nil { + return err + } + journal.writer = sink + log.Info("Regenerated local transaction journal", "transactions", journaled, "accounts", len(all)) + + return nil +} + +// close flushes the transaction journal contents to disk and closes the file. +func (journal *txJournal) close() error { + var err error + + if journal.writer != nil { + err = journal.writer.Close() + journal.writer = nil + } + return err +} diff --git a/core/tx_pool.go b/core/tx_pool.go index 8e2d1b31d8..16f7742650 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -99,7 +99,9 @@ type stateFn func() (*state.StateDB, error) // TxPoolConfig are the configuration parameters of the transaction pool. type TxPoolConfig struct { - NoLocals bool // Whether local transaction handling should be disabled + NoLocals bool // Whether local transaction handling should be disabled + Journal string // Journal of local transactions to survive node restarts + Rejournal time.Duration // Time interval to regenerate the local transaction journal PriceLimit uint64 // Minimum gas price to enforce for acceptance into the pool PriceBump uint64 // Minimum price bump percentage to replace an already existing transaction (nonce) @@ -115,6 +117,9 @@ type TxPoolConfig struct { // DefaultTxPoolConfig contains the default configurations for the transaction // pool. var DefaultTxPoolConfig = TxPoolConfig{ + Journal: "transactions.rlp", + Rejournal: time.Hour, + PriceLimit: 1, PriceBump: 10, @@ -130,6 +135,10 @@ var DefaultTxPoolConfig = TxPoolConfig{ // unreasonable or unworkable. func (config *TxPoolConfig) sanitize() TxPoolConfig { conf := *config + if conf.Rejournal < time.Second { + log.Warn("Sanitizing invalid txpool journal time", "provided", conf.Rejournal, "updated", time.Second) + conf.Rejournal = time.Second + } if conf.PriceLimit < 1 { log.Warn("Sanitizing invalid txpool price limit", "provided", conf.PriceLimit, "updated", DefaultTxPoolConfig.PriceLimit) conf.PriceLimit = DefaultTxPoolConfig.PriceLimit @@ -157,18 +166,19 @@ type TxPool struct { gasPrice *big.Int eventMux *event.TypeMux events *event.TypeMuxSubscription - locals *accountSet signer types.Signer mu sync.RWMutex + locals *accountSet // Set of local transaction to exepmt from evicion rules + journal *txJournal // Journal of local transaction to back up to disk + pending map[common.Address]*txList // All currently processable transactions queue map[common.Address]*txList // Queued but non-processable transactions beats map[common.Address]time.Time // Last heartbeat from each known account all map[common.Hash]*types.Transaction // All transactions to allow lookups priced *txPricedList // All transactions sorted by price - wg sync.WaitGroup // for shutdown sync - quit chan struct{} + wg sync.WaitGroup // for shutdown sync homestead bool } @@ -194,32 +204,48 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, eventMux *e gasPrice: new(big.Int).SetUint64(config.PriceLimit), pendingState: nil, events: eventMux.Subscribe(ChainHeadEvent{}, RemovedTransactionEvent{}), - quit: make(chan struct{}), } pool.locals = newAccountSet(pool.signer) pool.priced = newTxPricedList(&pool.all) pool.resetState() - // Start the various events loops and return - pool.wg.Add(2) - go pool.eventLoop() - go pool.expirationLoop() + // If local transactions and journaling is enabled, load from disk + if !config.NoLocals && config.Journal != "" { + pool.journal = newTxJournal(config.Journal) + + if err := pool.journal.load(pool.AddLocal); err != nil { + log.Warn("Failed to load transaction journal", "err", err) + } + if err := pool.journal.rotate(pool.local()); err != nil { + log.Warn("Failed to rotate transaction journal", "err", err) + } + } + // Start the event loop and return + pool.wg.Add(1) + go pool.loop() return pool } -func (pool *TxPool) eventLoop() { +// loop is the transaction pool's main event loop, waiting for and reacting to +// outside blockchain events as well as for various reporting and transaction +// eviction events. +func (pool *TxPool) loop() { defer pool.wg.Done() - // Start a ticker and keep track of interesting pool stats to report + // Start the stats reporting and transaction eviction tickers var prevPending, prevQueued, prevStales int report := time.NewTicker(statsReportInterval) defer report.Stop() - // Track chain events. When a chain events occurs (new chain canon block) - // we need to know the new state. The new state will help us determine - // the nonces in the managed state + evict := time.NewTicker(evictionInterval) + defer evict.Stop() + + journal := time.NewTicker(pool.config.Rejournal) + defer journal.Stop() + + // Keep waiting for and reacting to the various events for { select { // Handle any events fired by the system @@ -253,6 +279,31 @@ func (pool *TxPool) eventLoop() { log.Debug("Transaction pool status report", "executable", pending, "queued", queued, "stales", stales) prevPending, prevQueued, prevStales = pending, queued, stales } + + // Handle inactive account transaction eviction + case <-evict.C: + pool.mu.Lock() + for addr := range pool.queue { + // Skip local transactions from the eviction mechanism + if pool.locals.contains(addr) { + continue + } + // Any non-locals old enough should be removed + if time.Since(pool.beats[addr]) > pool.config.Lifetime { + for _, tx := range pool.queue[addr].Flatten() { + pool.removeTx(tx.Hash()) + } + } + } + pool.mu.Unlock() + + // Handle local transaction journal rotation + case <-journal.C: + if pool.journal != nil { + if err := pool.journal.rotate(pool.local()); err != nil { + log.Warn("Failed to rotate local tx journal", "err", err) + } + } } } } @@ -284,9 +335,11 @@ func (pool *TxPool) resetState() { // Stop terminates the transaction pool. func (pool *TxPool) Stop() { pool.events.Unsubscribe() - close(pool.quit) pool.wg.Wait() + if pool.journal != nil { + pool.journal.close() + } log.Info("Transaction pool stopped") } @@ -373,6 +426,22 @@ func (pool *TxPool) Pending() (map[common.Address]types.Transactions, error) { return pending, nil } +// local retrieves all currently known local transactions, groupped by origin +// account and sorted by nonce. The returned transaction set is a copy and can be +// freely modified by calling code. +func (pool *TxPool) local() map[common.Address]types.Transactions { + txs := make(map[common.Address]types.Transactions) + for addr := range pool.locals.accounts { + if pending := pool.pending[addr]; pending != nil { + txs[addr] = append(txs[addr], pending.Flatten()...) + } + if queued := pool.queue[addr]; queued != nil { + txs[addr] = append(txs[addr], queued.Flatten()...) + } + } + return txs +} + // validateTx checks whether a transaction is valid according to the consensus // rules and adheres to some heuristic limits of the local node (price and size). func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { @@ -473,18 +542,22 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { } pool.all[tx.Hash()] = tx pool.priced.Put(tx) + pool.journalTx(from, tx) log.Trace("Pooled new executable transaction", "hash", hash, "from", from, "to", tx.To()) return old != nil, nil } - // New transaction isn't replacing a pending one, push into queue and potentially mark local + // New transaction isn't replacing a pending one, push into queue replace, err := pool.enqueueTx(hash, tx) if err != nil { return false, err } + // Mark local addresses and journal local transactions if local { pool.locals.add(from) } + pool.journalTx(from, tx) + log.Trace("Pooled new future transaction", "hash", hash, "from", from, "to", tx.To()) return replace, nil } @@ -515,6 +588,18 @@ func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, er return old != nil, nil } +// journalTx adds the specified transaction to the local disk journal if it is +// deemed to have been sent from a local account. +func (pool *TxPool) journalTx(from common.Address, tx *types.Transaction) { + // Only journal if it's enabled and the transaction is local + if pool.journal == nil || !pool.locals.contains(from) { + return + } + if err := pool.journal.insert(tx); err != nil { + log.Warn("Failed to journal local transaction", "err", err) + } +} + // promoteTx adds a transaction to the pending (processable) list of transactions. // // Note, this method assumes the pool lock is held! @@ -910,39 +995,6 @@ func (pool *TxPool) demoteUnexecutables(state *state.StateDB) { } } -// expirationLoop is a loop that periodically iterates over all accounts with -// queued transactions and drop all that have been inactive for a prolonged amount -// of time. -func (pool *TxPool) expirationLoop() { - defer pool.wg.Done() - - evict := time.NewTicker(evictionInterval) - defer evict.Stop() - - for { - select { - case <-evict.C: - pool.mu.Lock() - for addr := range pool.queue { - // Skip local transactions from the eviction mechanism - if pool.locals.contains(addr) { - continue - } - // Any non-locals old enough should be removed - if time.Since(pool.beats[addr]) > pool.config.Lifetime { - for _, tx := range pool.queue[addr].Flatten() { - pool.removeTx(tx.Hash()) - } - } - } - pool.mu.Unlock() - - case <-pool.quit: - return - } - } -} - // addressByHeartbeat is an account address tagged with its last activity timestamp. type addressByHeartbeat struct { address common.Address @@ -955,7 +1007,7 @@ func (a addresssByHeartbeat) Len() int { return len(a) } func (a addresssByHeartbeat) Less(i, j int) bool { return a[i].heartbeat.Before(a[j].heartbeat) } func (a addresssByHeartbeat) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -// accountSet is simply a set of addresses to check for existance, and a signer +// accountSet is simply a set of addresses to check for existence, and a signer // capable of deriving addresses from transactions. type accountSet struct { accounts map[common.Address]struct{} diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 03ece3886f..80bc0b3848 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -19,8 +19,10 @@ package core import ( "crypto/ecdsa" "fmt" + "io/ioutil" "math/big" "math/rand" + "os" "testing" "time" @@ -33,6 +35,15 @@ import ( "github.com/ethereum/go-ethereum/params" ) +// testTxPoolConfig is a transaction pool configuration without stateful disk +// sideeffects used during testing. +var testTxPoolConfig TxPoolConfig + +func init() { + testTxPoolConfig = DefaultTxPoolConfig + testTxPoolConfig.Journal = "" +} + func transaction(nonce uint64, gaslimit *big.Int, key *ecdsa.PrivateKey) *types.Transaction { return pricedTransaction(nonce, gaslimit, big.NewInt(1), key) } @@ -47,8 +58,7 @@ func setupTxPool() (*TxPool, *ecdsa.PrivateKey) { statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) key, _ := crypto.GenerateKey() - pool := NewTxPool(DefaultTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) - pool.resetState() + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) return pool, key } @@ -125,9 +135,8 @@ func TestStateChangeDuringPoolReset(t *testing.T) { gasLimitFunc := func() *big.Int { return big.NewInt(1000000000) } - pool := NewTxPool(DefaultTxPoolConfig, params.TestChainConfig, mux, stateFunc, gasLimitFunc) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, mux, stateFunc, gasLimitFunc) defer pool.Stop() - pool.resetState() nonce := pool.State().GetNonce(address) if nonce != 0 { @@ -618,25 +627,25 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { pool.resetState() // Keep queuing up transactions and make sure all above a limit are dropped - for i := uint64(1); i <= DefaultTxPoolConfig.AccountQueue+5; i++ { + for i := uint64(1); i <= testTxPoolConfig.AccountQueue+5; i++ { if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } if len(pool.pending) != 0 { t.Errorf("tx %d: pending pool size mismatch: have %d, want %d", i, len(pool.pending), 0) } - if i <= DefaultTxPoolConfig.AccountQueue { + if i <= testTxPoolConfig.AccountQueue { if pool.queue[account].Len() != int(i) { t.Errorf("tx %d: queue size mismatch: have %d, want %d", i, pool.queue[account].Len(), i) } } else { - if pool.queue[account].Len() != int(DefaultTxPoolConfig.AccountQueue) { - t.Errorf("tx %d: queue limit mismatch: have %d, want %d", i, pool.queue[account].Len(), DefaultTxPoolConfig.AccountQueue) + if pool.queue[account].Len() != int(testTxPoolConfig.AccountQueue) { + t.Errorf("tx %d: queue limit mismatch: have %d, want %d", i, pool.queue[account].Len(), testTxPoolConfig.AccountQueue) } } } - if len(pool.all) != int(DefaultTxPoolConfig.AccountQueue) { - t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), DefaultTxPoolConfig.AccountQueue) + if len(pool.all) != int(testTxPoolConfig.AccountQueue) { + t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), testTxPoolConfig.AccountQueue) } } @@ -657,13 +666,12 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - config := DefaultTxPoolConfig + config := testTxPoolConfig config.NoLocals = nolocals config.GlobalQueue = config.AccountQueue*3 - 1 // reduce the queue limits to shorten test time (-1 to make it non divisible) pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them (last one will be the local) state, _ := pool.currentState() @@ -748,13 +756,12 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - config := DefaultTxPoolConfig + config := testTxPoolConfig config.Lifetime = 250 * time.Millisecond config.NoLocals = nolocals pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create two test accounts to ensure remotes expire but locals do not local, _ := crypto.GenerateKey() @@ -817,7 +824,7 @@ func TestTransactionPendingLimiting(t *testing.T) { pool.resetState() // Keep queuing up transactions and make sure all above a limit are dropped - for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { + for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } @@ -828,8 +835,8 @@ func TestTransactionPendingLimiting(t *testing.T) { t.Errorf("tx %d: queue size mismatch: have %d, want %d", i, pool.queue[account].Len(), 0) } } - if len(pool.all) != int(DefaultTxPoolConfig.AccountQueue+5) { - t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), DefaultTxPoolConfig.AccountQueue+5) + if len(pool.all) != int(testTxPoolConfig.AccountQueue+5) { + t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), testTxPoolConfig.AccountQueue+5) } } @@ -845,7 +852,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { state1, _ := pool1.currentState() state1.AddBalance(account1, big.NewInt(1000000)) - for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { + for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { if err := pool1.AddRemote(transaction(origin+i, big.NewInt(100000), key1)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } @@ -857,7 +864,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { state2.AddBalance(account2, big.NewInt(1000000)) txns := []*types.Transaction{} - for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { + for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { txns = append(txns, transaction(origin+i, big.NewInt(100000), key2)) } pool2.AddRemotes(txns) @@ -888,12 +895,11 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - config := DefaultTxPoolConfig + config := testTxPoolConfig config.GlobalSlots = config.AccountSlots * 10 pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them state, _ := pool.currentState() @@ -935,14 +941,13 @@ func TestTransactionCapClearsFromAll(t *testing.T) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - config := DefaultTxPoolConfig + config := testTxPoolConfig config.AccountSlots = 2 config.AccountQueue = 2 config.GlobalSlots = 8 pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them state, _ := pool.currentState() @@ -970,12 +975,11 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - config := DefaultTxPoolConfig + config := testTxPoolConfig config.GlobalSlots = 0 pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them state, _ := pool.currentState() @@ -1019,9 +1023,8 @@ func TestTransactionPoolRepricing(t *testing.T) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - pool := NewTxPool(DefaultTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them state, _ := pool.currentState() @@ -1104,13 +1107,12 @@ func TestTransactionPoolUnderpricing(t *testing.T) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - config := DefaultTxPoolConfig + config := testTxPoolConfig config.GlobalSlots = 2 config.GlobalQueue = 2 pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them state, _ := pool.currentState() @@ -1192,9 +1194,8 @@ func TestTransactionReplacement(t *testing.T) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - pool := NewTxPool(DefaultTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) defer pool.Stop() - pool.resetState() // Create a test account to add transactions with key, _ := crypto.GenerateKey() @@ -1204,7 +1205,7 @@ func TestTransactionReplacement(t *testing.T) { // Add pending transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) price := int64(100) - threshold := (price * (100 + int64(DefaultTxPoolConfig.PriceBump))) / 100 + threshold := (price * (100 + int64(testTxPoolConfig.PriceBump))) / 100 if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), key)); err != nil { t.Fatalf("failed to add original cheap pending transaction: %v", err) @@ -1250,6 +1251,113 @@ func TestTransactionReplacement(t *testing.T) { } } +// Tests that local transactions are journaled to disk, but remote transactions +// get discarded between restarts. +func TestTransactionJournaling(t *testing.T) { testTransactionJournaling(t, false) } +func TestTransactionJournalingNoLocals(t *testing.T) { testTransactionJournaling(t, true) } + +func testTransactionJournaling(t *testing.T, nolocals bool) { + // Create a temporary file for the journal + file, err := ioutil.TempFile("", "") + if err != nil { + t.Fatalf("failed to create temporary journal: %v", err) + } + journal := file.Name() + defer os.Remove(journal) + + // Clean up the temporary file, we only need the path for now + file.Close() + os.Remove(journal) + + // Create the original pool to inject transaction into the journal + db, _ := ethdb.NewMemDatabase() + statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + + config := testTxPoolConfig + config.NoLocals = nolocals + config.Journal = journal + config.Rejournal = time.Second + + pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + + // Create two test accounts to ensure remotes expire but locals do not + local, _ := crypto.GenerateKey() + remote, _ := crypto.GenerateKey() + + statedb, _ = pool.currentState() + statedb.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) + statedb.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) + + // Add three local and a remote transactions and ensure they are queued up + if err := pool.AddLocal(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), local)); err != nil { + t.Fatalf("failed to add local transaction: %v", err) + } + if err := pool.AddLocal(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), local)); err != nil { + t.Fatalf("failed to add local transaction: %v", err) + } + if err := pool.AddLocal(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), local)); err != nil { + t.Fatalf("failed to add local transaction: %v", err) + } + if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), remote)); err != nil { + t.Fatalf("failed to add remote transaction: %v", err) + } + pending, queued := pool.stats() + if pending != 4 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 4) + } + if queued != 0 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) + } + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } + // Terminate the old pool, bump the local nonce, create a new pool and ensure relevant transaction survive + pool.Stop() + statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) + pool = NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + + pending, queued = pool.stats() + if queued != 0 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) + } + if nolocals { + if pending != 0 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) + } + } else { + if pending != 2 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) + } + } + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } + // Bump the nonce temporarily and ensure the newly invalidated transaction is removed + statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 2) + pool.resetState() + time.Sleep(2 * config.Rejournal) + pool.Stop() + statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) + pool = NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + + pending, queued = pool.stats() + if pending != 0 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) + } + if nolocals { + if queued != 0 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) + } + } else { + if queued != 1 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) + } + } + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } +} + // Benchmarks the speed of validating the contents of the pending queue of the // transaction pool. func BenchmarkPendingDemotion100(b *testing.B) { benchmarkPendingDemotion(b, 100) } diff --git a/eth/backend.go b/eth/backend.go index c7df517c04..8a837f7b88 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -148,8 +148,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { core.WriteChainConfig(chainDb, genesisHash, chainConfig) } - newPool := core.NewTxPool(config.TxPool, eth.chainConfig, eth.EventMux(), eth.blockchain.State, eth.blockchain.GasLimit) - eth.txPool = newPool + if config.TxPool.Journal != "" { + config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) + } + eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.EventMux(), eth.blockchain.State, eth.blockchain.GasLimit) maxPeers := config.MaxPeers if config.LightServ > 0 { From 0732ad4e478144ec66b3866de34d99ffa2ee4890 Mon Sep 17 00:00:00 2001 From: am2rican5 Date: Mon, 31 Jul 2017 17:44:08 +0900 Subject: [PATCH 029/272] mobile: add RinkebyGenesis method --- mobile/params.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mobile/params.go b/mobile/params.go index 9c58a90abc..45fe870ee3 100644 --- a/mobile/params.go +++ b/mobile/params.go @@ -41,6 +41,15 @@ func TestnetGenesis() string { return string(enc) } +// RinkebyGenesis returns the JSON spec to use for the Rinkeby test network +func RinkebyGenesis() string { + enc, err := json.Marshal(core.DefaultRinkebyGenesisBlock()) + if err != nil { + panic(err) + } + return string(enc) +} + // FoundationBootnodes returns the enode URLs of the P2P bootstrap nodes operated // by the foundation running the V5 discovery protocol. func FoundationBootnodes() *Enodes { From 4f9789b28d570ccd234640f1c13c08cb9f16f4ee Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 31 Jul 2017 04:59:07 -0500 Subject: [PATCH 030/272] core: avoid write existing block again (#14849) --- core/blockchain.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/blockchain.go b/core/blockchain.go index bb1c14f437..3fb8be15f4 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -827,6 +827,11 @@ func (bc *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err er bc.mu.Lock() defer bc.mu.Unlock() + if bc.HasBlock(block.Hash()) { + log.Trace("Block existed", "hash", block.Hash()) + return + } + localTd := bc.GetTd(bc.currentBlock.Hash(), bc.currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) From 13cda8d9b6113c7df583e68bdce5adf1bca2b8a8 Mon Sep 17 00:00:00 2001 From: Lee Hyeon Date: Mon, 31 Jul 2017 19:00:17 +0900 Subject: [PATCH 031/272] Makefile: fixed GOBIN absolute path issue (#14854) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b6e2ddd5e5..19924f9529 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ .PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 .PHONY: geth-windows geth-windows-386 geth-windows-amd64 -GOBIN = build/bin +GOBIN = $(pwd)/build/bin GO ?= latest geth: From c259e6874ece4ff3b6ee7b1ce77f58e64db1fb34 Mon Sep 17 00:00:00 2001 From: bas-vk Date: Mon, 31 Jul 2017 12:06:01 +0200 Subject: [PATCH 032/272] light: update txpool signer to EIP155 (#14720) --- light/txpool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/light/txpool.go b/light/txpool.go index 416148b7e6..1d52aa622b 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -81,7 +81,7 @@ type TxRelayBackend interface { func NewTxPool(config *params.ChainConfig, eventMux *event.TypeMux, chain *LightChain, relay TxRelayBackend) *TxPool { pool := &TxPool{ config: config, - signer: types.HomesteadSigner{}, + signer: types.NewEIP155Signer(config.ChainId), nonce: make(map[common.Address]uint64), pending: make(map[common.Hash]*types.Transaction), mined: make(map[common.Hash][]*types.Transaction), From 53f3460ab5b94875edf90c8b0f5da46b0c104321 Mon Sep 17 00:00:00 2001 From: njupt-moon <1015041018@njupt.edu.cn> Date: Mon, 31 Jul 2017 19:02:36 +0800 Subject: [PATCH 033/272] core/asm: fix hex number lexing (#14861) --- core/asm/lex_test.go | 45 +++++++++++++++++++++++++++++++++++++++----- core/asm/lexer.go | 2 +- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/core/asm/lex_test.go b/core/asm/lex_test.go index 36e67bcf7e..e6901d4e37 100644 --- a/core/asm/lex_test.go +++ b/core/asm/lex_test.go @@ -16,7 +16,10 @@ package asm -import "testing" +import ( + "reflect" + "testing" +) func lexAll(src string) []token { ch := Lex("test.asm", []byte(src), false) @@ -28,9 +31,41 @@ func lexAll(src string) []token { return tokens } -func TestComment(t *testing.T) { - tokens := lexAll(";; this is a comment") - if len(tokens) != 2 { // {new line, EOF} - t.Error("expected no tokens") +func TestLexer(t *testing.T) { + tests := []struct { + input string + tokens []token + }{ + { + input: ";; this is a comment", + tokens: []token{{typ: lineStart}, {typ: eof}}, + }, + { + input: "0x12345678", + tokens: []token{{typ: lineStart}, {typ: number, text: "0x12345678"}, {typ: eof}}, + }, + { + input: "0x123ggg", + tokens: []token{{typ: lineStart}, {typ: number, text: "0x123"}, {typ: element, text: "ggg"}, {typ: eof}}, + }, + { + input: "12345678", + tokens: []token{{typ: lineStart}, {typ: number, text: "12345678"}, {typ: eof}}, + }, + { + input: "123abc", + tokens: []token{{typ: lineStart}, {typ: number, text: "123"}, {typ: element, text: "abc"}, {typ: eof}}, + }, + { + input: "0123abc", + tokens: []token{{typ: lineStart}, {typ: number, text: "0123"}, {typ: element, text: "abc"}, {typ: eof}}, + }, + } + + for _, test := range tests { + tokens := lexAll(test.input) + if !reflect.DeepEqual(tokens, test.tokens) { + t.Errorf("input %q\ngot: %+v\nwant: %+v", test.input, tokens, test.tokens) + } } } diff --git a/core/asm/lexer.go b/core/asm/lexer.go index 2770bd35fc..d784e5d504 100644 --- a/core/asm/lexer.go +++ b/core/asm/lexer.go @@ -254,7 +254,7 @@ func lexInsideString(l *lexer) stateFn { func lexNumber(l *lexer) stateFn { acceptance := Numbers - if l.accept("0") && l.accept("xX") { + if l.accept("0") || l.accept("xX") { acceptance = HexadecimalNumbers } l.acceptRun(acceptance) From e9b850805eebc55ea8486323a1a7861b9b554430 Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Mon, 31 Jul 2017 12:23:44 +0100 Subject: [PATCH 034/272] cmd/swarm: support exporting, importing chunk db (#14868) --- cmd/swarm/cleandb.go | 38 ------------- cmd/swarm/db.go | 116 +++++++++++++++++++++++++++++++++++++++ cmd/swarm/main.go | 59 +++++++++++++++++++- swarm/storage/dbstore.go | 82 +++++++++++++++++++++++++++ 4 files changed, 254 insertions(+), 41 deletions(-) delete mode 100644 cmd/swarm/cleandb.go create mode 100644 cmd/swarm/db.go diff --git a/cmd/swarm/cleandb.go b/cmd/swarm/cleandb.go deleted file mode 100644 index 2680760624..0000000000 --- a/cmd/swarm/cleandb.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/storage" - "gopkg.in/urfave/cli.v1" -) - -func cleandb(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Need path to chunks database as the first and only argument") - } - - chunkDbPath := args[0] - hash := storage.MakeHashFunc("SHA3") - dbStore, err := storage.NewDbStore(chunkDbPath, hash, 10000000, 0) - if err != nil { - utils.Fatalf("Cannot initialise dbstore: %v", err) - } - dbStore.Cleanup() -} diff --git a/cmd/swarm/db.go b/cmd/swarm/db.go new file mode 100644 index 0000000000..dfd2d069b9 --- /dev/null +++ b/cmd/swarm/db.go @@ -0,0 +1,116 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/swarm/storage" + "gopkg.in/urfave/cli.v1" +) + +func dbExport(ctx *cli.Context) { + args := ctx.Args() + if len(args) != 2 { + utils.Fatalf("invalid arguments, please specify both (path to a local chunk database) and (path to write the tar archive to, - for stdout)") + } + + store, err := openDbStore(args[0]) + if err != nil { + utils.Fatalf("error opening local chunk database: %s", err) + } + defer store.Close() + + var out io.Writer + if args[1] == "-" { + out = os.Stdout + } else { + f, err := os.Create(args[1]) + if err != nil { + utils.Fatalf("error opening output file: %s", err) + } + defer f.Close() + out = f + } + + count, err := store.Export(out) + if err != nil { + utils.Fatalf("error exporting local chunk database: %s", err) + } + + log.Info(fmt.Sprintf("successfully exported %d chunks", count)) +} + +func dbImport(ctx *cli.Context) { + args := ctx.Args() + if len(args) != 2 { + utils.Fatalf("invalid arguments, please specify both (path to a local chunk database) and (path to read the tar archive from, - for stdin)") + } + + store, err := openDbStore(args[0]) + if err != nil { + utils.Fatalf("error opening local chunk database: %s", err) + } + defer store.Close() + + var in io.Reader + if args[1] == "-" { + in = os.Stdin + } else { + f, err := os.Open(args[1]) + if err != nil { + utils.Fatalf("error opening input file: %s", err) + } + defer f.Close() + in = f + } + + count, err := store.Import(in) + if err != nil { + utils.Fatalf("error importing local chunk database: %s", err) + } + + log.Info(fmt.Sprintf("successfully imported %d chunks", count)) +} + +func dbClean(ctx *cli.Context) { + args := ctx.Args() + if len(args) != 1 { + utils.Fatalf("invalid arguments, please specify (path to a local chunk database)") + } + + store, err := openDbStore(args[0]) + if err != nil { + utils.Fatalf("error opening local chunk database: %s", err) + } + defer store.Close() + + store.Cleanup() +} + +func openDbStore(path string) (*storage.DbStore, error) { + if _, err := os.Stat(filepath.Join(path, "CURRENT")); err != nil { + return nil, fmt.Errorf("invalid chunkdb path: %s", err) + } + hash := storage.MakeHashFunc("SHA3") + return storage.NewDbStore(path, hash, 10000000, 0) +} diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go index 4ae06a1c99..449d11f36b 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -240,12 +240,65 @@ Removes a path from the manifest }, }, { - Action: cleandb, + Name: "db", + Usage: "manage the local chunk database", + ArgsUsage: "db COMMAND", + Description: ` +Manage the local chunk database. +`, + Subcommands: []cli.Command{ + { + Action: dbExport, + Name: "export", + Usage: "export a local chunk database as a tar archive (use - to send to stdout)", + ArgsUsage: " ", + Description: ` +Export a local chunk database as a tar archive (use - to send to stdout). + + swarm db export ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar + +The export may be quite large, consider piping the output through the Unix +pv(1) tool to get a progress bar: + + swarm db export ~/.ethereum/swarm/bzz-KEY/chunks - | pv > chunks.tar +`, + }, + { + Action: dbImport, + Name: "import", + Usage: "import chunks from a tar archive into a local chunk database (use - to read from stdin)", + ArgsUsage: " ", + Description: ` +Import chunks from a tar archive into a local chunk database (use - to read from stdin). + + swarm db import ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar + +The import may be quite large, consider piping the input through the Unix +pv(1) tool to get a progress bar: + + pv chunks.tar | swarm db import ~/.ethereum/swarm/bzz-KEY/chunks - +`, + }, + { + Action: dbClean, + Name: "clean", + Usage: "remove corrupt entries from a local chunk database", + ArgsUsage: "", + Description: ` +Remove corrupt entries from a local chunk database. +`, + }, + }, + }, + { + Action: func(ctx *cli.Context) { + utils.Fatalf("ERROR: 'swarm cleandb' has been removed, please use 'swarm db clean'.") + }, Name: "cleandb", - Usage: "Cleans database of corrupted entries", + Usage: "DEPRECATED: use 'swarm db clean'", ArgsUsage: " ", Description: ` -Cleans database of corrupted entries. +DEPRECATED: use 'swarm db clean'. `, }, } diff --git a/swarm/storage/dbstore.go b/swarm/storage/dbstore.go index 31ff5b64e6..0761130846 100644 --- a/swarm/storage/dbstore.go +++ b/swarm/storage/dbstore.go @@ -23,9 +23,13 @@ package storage import ( + "archive/tar" "bytes" "encoding/binary" + "encoding/hex" "fmt" + "io" + "io/ioutil" "sync" "github.com/ethereum/go-ethereum/log" @@ -260,6 +264,84 @@ func (s *DbStore) collectGarbage(ratio float32) { s.db.Put(keyGCPos, s.gcPos) } +// Export writes all chunks from the store to a tar archive, returning the +// number of chunks written. +func (s *DbStore) Export(out io.Writer) (int64, error) { + tw := tar.NewWriter(out) + defer tw.Close() + + it := s.db.NewIterator() + defer it.Release() + var count int64 + for ok := it.Seek([]byte{kpIndex}); ok; ok = it.Next() { + key := it.Key() + if (key == nil) || (key[0] != kpIndex) { + break + } + + var index dpaDBIndex + decodeIndex(it.Value(), &index) + + data, err := s.db.Get(getDataKey(index.Idx)) + if err != nil { + log.Warn(fmt.Sprintf("Chunk %x found but could not be accessed: %v", key[:], err)) + continue + } + + hdr := &tar.Header{ + Name: hex.EncodeToString(key[1:]), + Mode: 0644, + Size: int64(len(data)), + } + if err := tw.WriteHeader(hdr); err != nil { + return count, err + } + if _, err := tw.Write(data); err != nil { + return count, err + } + count++ + } + + return count, nil +} + +// Import reads chunks into the store from a tar archive, returning the number +// of chunks read. +func (s *DbStore) Import(in io.Reader) (int64, error) { + tr := tar.NewReader(in) + + var count int64 + for { + hdr, err := tr.Next() + if err == io.EOF { + break + } else if err != nil { + return count, err + } + + if len(hdr.Name) != 64 { + log.Warn("ignoring non-chunk file", "name", hdr.Name) + continue + } + + key, err := hex.DecodeString(hdr.Name) + if err != nil { + log.Warn("ignoring invalid chunk file", "name", hdr.Name, "err", err) + continue + } + + data, err := ioutil.ReadAll(tr) + if err != nil { + return count, err + } + + s.Put(&Chunk{Key: key, SData: data}) + count++ + } + + return count, nil +} + func (s *DbStore) Cleanup() { //Iterates over the database and checks that there are no faulty chunks it := s.db.NewIterator() From 60c858a5291da6757ca6798178f4e67f77dd4122 Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Mon, 31 Jul 2017 14:58:19 +0100 Subject: [PATCH 035/272] swarm/api: make api.NewManifest synchronous (#14880) Previously, NewManifest was asynchronous so subsequent code which tried to use the returned manifest could error as the manifest was not yet persisted. --- cmd/swarm/run_test.go | 1 + cmd/swarm/upload_test.go | 2 -- swarm/api/manifest.go | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/swarm/run_test.go b/cmd/swarm/run_test.go index 05cbb27f1d..aaaf9e1e53 100644 --- a/cmd/swarm/run_test.go +++ b/cmd/swarm/run_test.go @@ -161,6 +161,7 @@ func newTestNode(t *testing.T, dir string) *testNode { conf := &node.Config{ DataDir: dir, IPCPath: "bzzd.ipc", + NoUSB: true, } n, err := node.New(conf) if err != nil { diff --git a/cmd/swarm/upload_test.go b/cmd/swarm/upload_test.go index 5b74dd4f13..5656186e1c 100644 --- a/cmd/swarm/upload_test.go +++ b/cmd/swarm/upload_test.go @@ -27,8 +27,6 @@ import ( // TestCLISwarmUp tests that running 'swarm up' makes the resulting file // available from all nodes via the HTTP API func TestCLISwarmUp(t *testing.T) { - t.Skip("flaky test") - // start 3 node cluster t.Log("starting 3 node cluster") cluster := newTestCluster(t, 3) diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index e251620a75..90f287677b 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -63,7 +63,7 @@ func (a *Api) NewManifest() (storage.Key, error) { if err != nil { return nil, err } - return a.Store(bytes.NewReader(data), int64(len(data)), nil) + return a.Store(bytes.NewReader(data), int64(len(data)), &sync.WaitGroup{}) } // ManifestWriter is used to add and remove entries from an underlying manifest From bc0e6a5e68904b2a1251240b85dd97dc8fa07e11 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Tue, 1 Aug 2017 09:59:46 +0100 Subject: [PATCH 036/272] ethclient: add NetworkID method (#14791) There is currently no simple way to obtain the network ID from a Client. This adds a NetworkID method that wraps the net_version JSON-RPC call. --- ethclient/ethclient.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 02df03fff4..48639d9492 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -256,6 +256,19 @@ func (ec *Client) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) // State Access +// NetworkID returns the network ID (also known as the chain ID) for this chain. +func (ec *Client) NetworkID(ctx context.Context) (*big.Int, error) { + version := new(big.Int) + var ver string + if err := ec.c.CallContext(ctx, &ver, "net_version"); err != nil { + return nil, err + } + if _, ok := version.SetString(ver, 10); !ok { + return nil, fmt.Errorf("invalid net_version result %q", ver) + } + return version, nil +} + // BalanceAt returns the wei balance of the given account. // The block number can be nil, in which case the balance is taken from the latest known block. func (ec *Client) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { From 4371367cd18cf5b03c90e35630b61586071c8724 Mon Sep 17 00:00:00 2001 From: akiva Date: Thu, 3 Aug 2017 04:58:35 -0700 Subject: [PATCH 037/272] Makefile, README: remove evm target, add puppeth to table (#14886) --- Makefile | 5 ----- README.md | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 19924f9529..26d648f330 100644 --- a/Makefile +++ b/Makefile @@ -21,11 +21,6 @@ swarm: @echo "Done building." @echo "Run \"$(GOBIN)/swarm\" to launch swarm." -evm: - build/env.sh go run build/ci.go install ./cmd/evm - @echo "Done building." - @echo "Run \"$(GOBIN)/evm\" to start the evm." - all: build/env.sh go run build/ci.go install diff --git a/README.md b/README.md index ac9760738a..76ee1b111a 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | | `swarm` | swarm daemon and tools. This is the entrypoint for the swarm network. `swarm --help` for command line options and subcommands. See https://swarm-guide.readthedocs.io for swarm documentation. | +| `puppeth` | a CLI wizard that aids in creating a new Ethereum network. | ## Running geth From 4a260dc1f28719be860937a2b0c9574d59e51ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 3 Aug 2017 06:32:47 +0200 Subject: [PATCH 038/272] cmd: add makecache cmd, use caches during import cmd --- cmd/geth/main.go | 1 + cmd/geth/misccmd.go | 69 ++++++++++++++++++++++++++------------------- cmd/utils/flags.go | 5 +++- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index e89f88ec91..58e9498060 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -157,6 +157,7 @@ func init() { attachCommand, javascriptCommand, // See misccmd.go: + makecacheCommand, makedagCommand, versionCommand, bugCommand, diff --git a/cmd/geth/misccmd.go b/cmd/geth/misccmd.go index 62b93d65a0..2e68dcda32 100644 --- a/cmd/geth/misccmd.go +++ b/cmd/geth/misccmd.go @@ -18,9 +18,7 @@ package main import ( "fmt" - "io/ioutil" "os" - "path/filepath" "runtime" "strconv" "strings" @@ -33,14 +31,27 @@ import ( ) var ( - makedagCommand = cli.Command{ - Action: utils.MigrateFlags(makedag), - Name: "makedag", - Usage: "Generate ethash DAG (for testing)", + makecacheCommand = cli.Command{ + Action: utils.MigrateFlags(makecache), + Name: "makecache", + Usage: "Generate ethash verification cache (for testing)", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", Description: ` -The makedag command generates an ethash DAG in /tmp/dag. +The makecache command generates an ethash cache in . + +This command exists to support the system testing project. +Regular users do not need to execute it. +`, + } + makedagCommand = cli.Command{ + Action: utils.MigrateFlags(makedag), + Name: "makedag", + Usage: "Generate ethash mining DAG (for testing)", + ArgsUsage: " ", + Category: "MISCELLANEOUS COMMANDS", + Description: ` +The makedag command generates an ethash DAG in . This command exists to support the system testing project. Regular users do not need to execute it. @@ -65,33 +76,33 @@ The output of this command is supposed to be machine-readable. } ) +// makecache generates an ethash verification cache into the provided folder. +func makecache(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 2 { + utils.Fatalf(`Usage: geth makecache `) + } + block, err := strconv.ParseUint(args[0], 0, 64) + if err != nil { + utils.Fatalf("Invalid block number: %v", err) + } + ethash.MakeCache(block, args[1]) + + return nil +} + +// makedag generates an ethash mining DAG into the provided folder. func makedag(ctx *cli.Context) error { args := ctx.Args() - wrongArgs := func() { + if len(args) != 2 { utils.Fatalf(`Usage: geth makedag `) } - switch { - case len(args) == 2: - blockNum, err := strconv.ParseUint(args[0], 0, 64) - dir := args[1] - if err != nil { - wrongArgs() - } else { - dir = filepath.Clean(dir) - // seems to require a trailing slash - if !strings.HasSuffix(dir, "/") { - dir = dir + "/" - } - _, err = ioutil.ReadDir(dir) - if err != nil { - utils.Fatalf("Can't find dir") - } - fmt.Println("making DAG, this could take awhile...") - ethash.MakeDataset(blockNum, dir) - } - default: - wrongArgs() + block, err := strconv.ParseUint(args[0], 0, 64) + if err != nil { + utils.Fatalf("Invalid block number: %v", err) } + ethash.MakeDataset(block, args[1]) + return nil } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 9f7b76c121..04728b5c62 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1093,7 +1093,10 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai engine := ethash.NewFaker() if !ctx.GlobalBool(FakePoWFlag.Name) { - engine = ethash.New("", 1, 0, "", 1, 0) + engine = ethash.New( + stack.ResolvePath(eth.DefaultConfig.EthashCacheDir), eth.DefaultConfig.EthashCachesInMem, eth.DefaultConfig.EthashCachesOnDisk, + stack.ResolvePath(eth.DefaultConfig.EthashDatasetDir), eth.DefaultConfig.EthashDatasetsInMem, eth.DefaultConfig.EthashDatasetsOnDisk, + ) } config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx)) if err != nil { From 0cc9b8791e63473c1c06609010ef51c587c82bcb Mon Sep 17 00:00:00 2001 From: evgk Date: Fri, 4 Aug 2017 05:31:18 +0600 Subject: [PATCH 039/272] core/vm: fix typo in comment (#14894) --- core/vm/interpreter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 0a225bca41..3faa987047 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -44,7 +44,7 @@ type Config struct { // Enable recording of SHA3/keccak preimages EnablePreimageRecording bool // JumpTable contains the EVM instruction table. This - // may me left uninitialised and will be set the default + // may be left uninitialised and will be set to the default // table. JumpTable [256]operation } From 455fcc830972f453456195c4118233fec030ca4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 4 Aug 2017 17:00:22 +0200 Subject: [PATCH 040/272] cmd/puppeth: remove wrapping loop in single reads --- cmd/puppeth/wizard.go | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 51e64688e1..288b675087 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -106,17 +106,15 @@ func (w *wizard) readString() string { // readDefaultString reads a single line from stdin, trimming if from spaces. If // an empty line is entered, the default value is returned. func (w *wizard) readDefaultString(def string) string { - for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } - if text = strings.TrimSpace(text); text != "" { - return text - } - return def + fmt.Printf("> ") + text, err := w.in.ReadString('\n') + if err != nil { + log.Crit("Failed to read user input", "err", err) } + if text = strings.TrimSpace(text); text != "" { + return text + } + return def } // readInt reads a single line from stdin, trimming if from spaces, enforcing it @@ -207,15 +205,13 @@ func (w *wizard) readDefaultFloat(def float64) float64 { // readPassword reads a single line from stdin, trimming it from the trailing new // line and returns it. The input will not be echoed. func (w *wizard) readPassword() string { - for { - fmt.Printf("> ") - text, err := terminal.ReadPassword(int(syscall.Stdin)) - if err != nil { - log.Crit("Failed to read password", "err", err) - } - fmt.Println() - return string(text) + fmt.Printf("> ") + text, err := terminal.ReadPassword(int(syscall.Stdin)) + if err != nil { + log.Crit("Failed to read password", "err", err) } + fmt.Println() + return string(text) } // readAddress reads a single line from stdin, trimming if from spaces and converts From 5e805aa865cb799980d6b0cb0114a724306ca8ff Mon Sep 17 00:00:00 2001 From: detailyang Date: Fri, 4 Aug 2017 23:54:30 +0800 Subject: [PATCH 041/272] Makefile: call shell function to get pwd --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 26d648f330..2cfd1110ec 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ .PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 .PHONY: geth-windows geth-windows-386 geth-windows-amd64 -GOBIN = $(pwd)/build/bin +GOBIN = $(shell pwd)/build/bin GO ?= latest geth: From fca6e515d6b8b915b4a91e378030f69b5658f42d Mon Sep 17 00:00:00 2001 From: Agustin Armellini Fischer Date: Sun, 6 Aug 2017 00:32:17 +0200 Subject: [PATCH 042/272] node: fix doc typo --- node/doc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/doc.go b/node/doc.go index f009e6f85d..d9688e0a12 100644 --- a/node/doc.go +++ b/node/doc.go @@ -68,7 +68,7 @@ unless its location is changed through the KeyStoreDir configuration option. Data Directory Sharing Example -In this exanple, two node instances named A and B are started with the same data +In this example, two node instances named A and B are started with the same data directory. Mode instance A opens the database "db", node instance B opens the databases "db" and "db-2". The following files will be created in the data directory: From 524ca544b2d10e7efd1d84dcbc80e8c199bb2d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 7 Aug 2017 11:12:44 +0300 Subject: [PATCH 043/272] build: drop yakkety builds (launchpad end of life) --- build/ci.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/ci.go b/build/ci.go index 6a52077d45..e631d70efd 100644 --- a/build/ci.go +++ b/build/ci.go @@ -119,7 +119,8 @@ var ( // Distros for which packages are created. // Note: vivid is unsupported because there is no golang-1.6 package for it. // Note: wily is unsupported because it was officially deprecated on lanchpad. - debDistros = []string{"trusty", "xenial", "yakkety", "zesty"} + // Note: yakkety is unsupported because it was officially deprecated on lanchpad. + debDistros = []string{"trusty", "xenial", "zesty"} ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) From 5b742fb82b31298f384c2ee7fb76fb1fa3a3f6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 7 Aug 2017 12:53:32 +0300 Subject: [PATCH 044/272] core: bump timeout test to avoid flakyness on overloaded ci --- core/tx_pool_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 80bc0b3848..9a03caf61c 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -750,14 +750,14 @@ func TestTransactionQueueTimeLimitingNoLocals(t *testing.T) { testTransactionQue func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { // Reduce the eviction interval to a testable amount defer func(old time.Duration) { evictionInterval = old }(evictionInterval) - evictionInterval = 250 * time.Millisecond + evictionInterval = time.Second // Create the pool to test the non-expiration enforcement db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) config := testTxPoolConfig - config.Lifetime = 250 * time.Millisecond + config.Lifetime = time.Second config.NoLocals = nolocals pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) From 392151e251fef59bf72df5a33899724edb7238b9 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sat, 5 Aug 2017 13:40:51 +0300 Subject: [PATCH 045/272] common: fix megacheck warnings --- common/bitutil/compress_test.go | 8 ++++---- common/hexutil/json.go | 9 ++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/common/bitutil/compress_test.go b/common/bitutil/compress_test.go index 805ab0369d..9bd1de103a 100644 --- a/common/bitutil/compress_test.go +++ b/common/bitutil/compress_test.go @@ -121,20 +121,20 @@ func TestCompression(t *testing.T) { in := hexutil.MustDecode("0x4912385c0e7b64000000") out := hexutil.MustDecode("0x80fe4912385c0e7b64") - if data := CompressBytes(in); bytes.Compare(data, out) != 0 { + if data := CompressBytes(in); !bytes.Equal(data, out) { t.Errorf("encoding mismatch for sparse data: have %x, want %x", data, out) } - if data, err := DecompressBytes(out, len(in)); err != nil || bytes.Compare(data, in) != 0 { + if data, err := DecompressBytes(out, len(in)); err != nil || !bytes.Equal(data, in) { t.Errorf("decoding mismatch for sparse data: have %x, want %x, error %v", data, in, err) } // Check the the compression returns the input if the bitset encoding is longer in = hexutil.MustDecode("0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb") out = hexutil.MustDecode("0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb") - if data := CompressBytes(in); bytes.Compare(data, out) != 0 { + if data := CompressBytes(in); !bytes.Equal(data, out) { t.Errorf("encoding mismatch for dense data: have %x, want %x", data, out) } - if data, err := DecompressBytes(out, len(in)); err != nil || bytes.Compare(data, in) != 0 { + if data, err := DecompressBytes(out, len(in)); err != nil || !bytes.Equal(data, in) { t.Errorf("decoding mismatch for dense data: have %x, want %x, error %v", data, in, err) } // Check that decompressing a longer input than the target fails diff --git a/common/hexutil/json.go b/common/hexutil/json.go index 943288fad3..11e14cae7f 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -26,11 +26,10 @@ import ( ) var ( - textZero = []byte(`0x0`) - bytesT = reflect.TypeOf(Bytes(nil)) - bigT = reflect.TypeOf((*Big)(nil)) - uintT = reflect.TypeOf(Uint(0)) - uint64T = reflect.TypeOf(Uint64(0)) + bytesT = reflect.TypeOf(Bytes(nil)) + bigT = reflect.TypeOf((*Big)(nil)) + uintT = reflect.TypeOf(Uint(0)) + uint64T = reflect.TypeOf(Uint64(0)) ) // Bytes marshals/unmarshals as a JSON string with 0x prefix. From aee70ae30bb4e0cd1532308ae07588bf31123150 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sat, 5 Aug 2017 13:44:45 +0300 Subject: [PATCH 046/272] consensus: fix megacheck warnings --- consensus/clique/clique.go | 2 +- consensus/clique/snapshot.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index d2fb6934b9..21f048ce38 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -619,7 +619,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, stop <-ch } } // Sweet, the protocol permits us to sign the block, wait for our time - delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now()) + delay := time.Until(time.Unix(header.Time.Int64(), 0)) if header.Difficulty.Cmp(diffNoTurn) == 0 { // It's not our turn explicitly to sign, delay it a bit wiggle := time.Duration(len(snap.Signers)/2+1) * wiggleTime diff --git a/consensus/clique/snapshot.go b/consensus/clique/snapshot.go index 32a1191dbe..9ebdb8df15 100644 --- a/consensus/clique/snapshot.go +++ b/consensus/clique/snapshot.go @@ -229,9 +229,9 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { // Tally up the new vote from the signer var authorize bool switch { - case bytes.Compare(header.Nonce[:], nonceAuthVote) == 0: + case bytes.Equal(header.Nonce[:], nonceAuthVote): authorize = true - case bytes.Compare(header.Nonce[:], nonceDropVote) == 0: + case bytes.Equal(header.Nonce[:], nonceDropVote): authorize = false default: return nil, errInvalidVote From ff89a3ddce3d985a2242c1724ac20cd890419fe2 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sat, 5 Aug 2017 13:46:09 +0300 Subject: [PATCH 047/272] console: fix megacheck warnings --- console/console_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/console/console_test.go b/console/console_test.go index 0fc0e70513..8ac499bd12 100644 --- a/console/console_test.go +++ b/console/console_test.go @@ -77,8 +77,6 @@ type tester struct { console *Console input *hookedPrompter output *bytes.Buffer - - lastConfirm string } // newTester creates a test environment based on which the console can operate. From 3780d0b6f7722b506371fb197924a1087fa90a8c Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 6 Aug 2017 18:58:39 +0300 Subject: [PATCH 048/272] ethstats: fix megacheck warnings --- ethstats/ethstats.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index 333c975c9a..b75c5e6da4 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -39,7 +39,6 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/les" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rpc" "golang.org/x/net/websocket" @@ -52,8 +51,6 @@ const historyUpdateRange = 50 // Service implements an Ethereum netstats reporting daemon that pushes local // chain statistics up to a monitoring server. type Service struct { - stack *node.Node // Temporary workaround, remove when API finalized - server *p2p.Server // Peer-to-peer server to retrieve networking infos eth *eth.Ethereum // Full Ethereum service if monitoring a full node les *les.LightEthereum // Light Ethereum service if monitoring a light node From cd82b89fde6e898318015f6252f202b0bf6c3489 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 6 Aug 2017 19:35:37 +0300 Subject: [PATCH 049/272] log: fix megacheck warnings --- log/format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log/format.go b/log/format.go index 6c19c7a552..0b07abb2ac 100644 --- a/log/format.go +++ b/log/format.go @@ -330,7 +330,7 @@ func escapeString(s string) string { needsEscape = true } } - if needsEscape == false && needsQuotes == false { + if !needsEscape && !needsQuotes { return s } e := stringBufPool.Get().(*bytes.Buffer) From faafeef79e1a7af462c5031a91936aae0c9cebf2 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 6 Aug 2017 19:40:34 +0300 Subject: [PATCH 050/272] miner: fix megacheck warnings --- miner/remote_agent.go | 5 +++-- miner/worker.go | 13 ++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/miner/remote_agent.go b/miner/remote_agent.go index bb223ba1bc..aac7ce8655 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -169,7 +169,8 @@ func (a *RemoteAgent) SubmitWork(nonce types.BlockNonce, mixDigest, hash common. // RemoteAgent.Start() constantly recreates these channels, so the loop code cannot // assume data stability in these member fields. func (a *RemoteAgent) loop(workCh chan *Work, quitCh chan struct{}) { - ticker := time.Tick(5 * time.Second) + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() for { select { @@ -179,7 +180,7 @@ func (a *RemoteAgent) loop(workCh chan *Work, quitCh chan struct{}) { a.mu.Lock() a.currentWork = work a.mu.Unlock() - case <-ticker: + case <-ticker.C: // cleanup a.mu.Lock() for hash, work := range a.work { diff --git a/miner/worker.go b/miner/worker.go index 411bc4e1b8..dab192c24f 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -24,7 +24,6 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/misc" @@ -109,9 +108,6 @@ type worker struct { uncleMu sync.Mutex possibleUncles map[common.Hash]*types.Block - txQueueMu sync.Mutex - txQueue map[common.Hash]*types.Transaction - unconfirmed *unconfirmedBlocks // set of locally mined blocks pending canonicalness confirmations // atomic status counters @@ -133,9 +129,8 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, coinbase com proc: eth.BlockChain().Validator(), possibleUncles: make(map[common.Hash]*types.Block), coinbase: coinbase, - txQueue: make(map[common.Hash]*types.Transaction), agents: make(map[Agent]struct{}), - unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), 5), + unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), miningLogAtDepth), fullValidation: false, } worker.events = worker.mux.Subscribe(core.ChainHeadEvent{}, core.ChainSideEvent{}, core.TxPreEvent{}) @@ -362,11 +357,7 @@ func (self *worker) makeCurrent(parent *types.Block, header *types.Header) error work.family.Add(ancestor.Hash()) work.ancestors.Add(ancestor.Hash()) } - wallets := self.eth.AccountManager().Wallets() - accounts := make([]accounts.Account, 0, len(wallets)) - for _, wallet := range wallets { - accounts = append(accounts, wallet.Accounts()...) - } + // Keep track of transactions which return errors so they can be removed work.tcount = 0 self.current = work From 19866075ace7b61301c78935d82b4f28992d92a5 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 6 Aug 2017 19:43:43 +0300 Subject: [PATCH 051/272] node: fix megacheck warnings --- node/config.go | 4 ++-- node/utils_test.go | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/node/config.go b/node/config.go index abbe64f43c..e9693277ad 100644 --- a/node/config.go +++ b/node/config.go @@ -35,7 +35,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/discover" ) -var ( +const ( datadirPrivateKey = "nodekey" // Path within the datadir to the node's private key datadirDefaultKeyStore = "keystore" // Path within the datadir to the keystore datadirStaticNodes = "static-nodes.json" // Path within the datadir to the static node list @@ -160,7 +160,7 @@ func (c *Config) NodeDB() string { if c.DataDir == "" { return "" // ephemeral } - return c.resolvePath("nodes") + return c.resolvePath(datadirNodeDatabase) } // DefaultIPCEndpoint returns the IPC path used by default. diff --git a/node/utils_test.go b/node/utils_test.go index 7cdfc2b3aa..8eddce3ed7 100644 --- a/node/utils_test.go +++ b/node/utils_test.go @@ -41,12 +41,10 @@ func NewNoopService(*ServiceContext) (Service, error) { return new(NoopService), type NoopServiceA struct{ NoopService } type NoopServiceB struct{ NoopService } type NoopServiceC struct{ NoopService } -type NoopServiceD struct{ NoopService } func NewNoopServiceA(*ServiceContext) (Service, error) { return new(NoopServiceA), nil } func NewNoopServiceB(*ServiceContext) (Service, error) { return new(NoopServiceB), nil } func NewNoopServiceC(*ServiceContext) (Service, error) { return new(NoopServiceC), nil } -func NewNoopServiceD(*ServiceContext) (Service, error) { return new(NoopServiceD), nil } // InstrumentedService is an implementation of Service for which all interface // methods can be instrumented both return value as well as event hook wise. From 7c74e166b0ee14cf040374f522bc399841a11e69 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 7 Aug 2017 14:11:15 +0300 Subject: [PATCH 052/272] accounts: fix megacheck warnings (#14903) * accounts: fix megacheck warnings * accounts: don't modify abi in favor of full cleanup --- accounts/keystore/key.go | 8 -------- accounts/keystore/keystore_passphrase.go | 4 ++-- accounts/usbwallet/ledger_hub.go | 9 ++++----- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go index ecc955d74d..211fa863d7 100644 --- a/accounts/keystore/key.go +++ b/accounts/keystore/key.go @@ -91,14 +91,6 @@ type cipherparamsJSON struct { IV string `json:"iv"` } -type scryptParamsJSON struct { - N int `json:"n"` - R int `json:"r"` - P int `json:"p"` - DkLen int `json:"dklen"` - Salt string `json:"salt"` -} - func (k *Key) MarshalJSON() (j []byte, err error) { jStruct := plainKeyJSON{ hex.EncodeToString(k.Address[:]), diff --git a/accounts/keystore/keystore_passphrase.go b/accounts/keystore/keystore_passphrase.go index 679fc15d69..535608a600 100644 --- a/accounts/keystore/keystore_passphrase.go +++ b/accounts/keystore/keystore_passphrase.go @@ -140,7 +140,7 @@ func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) { Cipher: "aes-128-ctr", CipherText: hex.EncodeToString(cipherText), CipherParams: cipherParamsJSON, - KDF: "scrypt", + KDF: keyHeaderKDF, KDFParams: scryptParamsJSON, MAC: hex.EncodeToString(mac), } @@ -275,7 +275,7 @@ func getKDFKey(cryptoJSON cryptoJSON, auth string) ([]byte, error) { } dkLen := ensureInt(cryptoJSON.KDFParams["dklen"]) - if cryptoJSON.KDF == "scrypt" { + if cryptoJSON.KDF == keyHeaderKDF { n := ensureInt(cryptoJSON.KDFParams["n"]) r := ensureInt(cryptoJSON.KDFParams["r"]) p := ensureInt(cryptoJSON.KDFParams["p"]) diff --git a/accounts/usbwallet/ledger_hub.go b/accounts/usbwallet/ledger_hub.go index fcbc24c0f5..2b0d56097c 100644 --- a/accounts/usbwallet/ledger_hub.go +++ b/accounts/usbwallet/ledger_hub.go @@ -197,11 +197,10 @@ func (hub *LedgerHub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscrip // is not running). func (hub *LedgerHub) updater() { for { - // Wait for a USB hotplug event (not supported yet) or a refresh timeout - select { - //case <-hub.changes: // reenable on hutplug implementation - case <-time.After(ledgerRefreshCycle): - } + // TODO: Wait for a USB hotplug event (not supported yet) or a refresh timeout + // <-hub.changes + time.Sleep(ledgerRefreshCycle) + // Run the wallet refresher hub.refreshWallets() From 80de4dc72c8d9967fdb3b40e9a8790c87e1400b5 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 7 Aug 2017 14:32:03 +0300 Subject: [PATCH 053/272] consensus: revert time.Until change --- consensus/clique/clique.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index 21f048ce38..d2fb6934b9 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -619,7 +619,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, stop <-ch } } // Sweet, the protocol permits us to sign the block, wait for our time - delay := time.Until(time.Unix(header.Time.Int64(), 0)) + delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now()) if header.Difficulty.Cmp(diffNoTurn) == 0 { // It's not our turn explicitly to sign, delay it a bit wiggle := time.Duration(len(snap.Signers)/2+1) * wiggleTime From 85454e7678f8f295ae72b8579aa443f9e45344cb Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 7 Aug 2017 14:34:21 +0300 Subject: [PATCH 054/272] cmd: fix megacheck warnings (#14912) * cmd: fix megacheck warnings * cmd: revert time.Until changes, keep readFloat --- cmd/evm/disasm.go | 5 +---- cmd/puppeth/ssh.go | 2 +- cmd/puppeth/wizard.go | 2 ++ cmd/puppeth/wizard_network.go | 26 ++++++++++++-------------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/cmd/evm/disasm.go b/cmd/evm/disasm.go index a78b2a8e18..4a442cf784 100644 --- a/cmd/evm/disasm.go +++ b/cmd/evm/disasm.go @@ -46,8 +46,5 @@ func disasmCmd(ctx *cli.Context) error { code := strings.TrimSpace(string(in[:])) fmt.Printf("%v\n", code) - if err = asm.PrintDisassembled(code); err != nil { - return err - } - return nil + return asm.PrintDisassembled(code) } diff --git a/cmd/puppeth/ssh.go b/cmd/puppeth/ssh.go index 93668945c0..26f8466850 100644 --- a/cmd/puppeth/ssh.go +++ b/cmd/puppeth/ssh.go @@ -122,7 +122,7 @@ func dial(server string, pubkey []byte) (*sshClient, error) { } } // If a public key exists for this SSH server, check that it matches - if bytes.Compare(pubkey, key.Marshal()) == 0 { + if bytes.Equal(pubkey, key.Marshal()) { return nil } // We have a mismatch, forbid connecting diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 288b675087..f19bcbbcd9 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -160,6 +160,7 @@ func (w *wizard) readDefaultInt(def int) int { } } +/* // readFloat reads a single line from stdin, trimming if from spaces, enforcing it // to parse into a float. func (w *wizard) readFloat() float64 { @@ -180,6 +181,7 @@ func (w *wizard) readFloat() float64 { return val } } +*/ // readDefaultFloat reads a single line from stdin, trimming if from spaces, enforcing // it to parse into a float. If an empty line is entered, the default value is returned. diff --git a/cmd/puppeth/wizard_network.go b/cmd/puppeth/wizard_network.go index 0455e1ef3b..ff2ff74f58 100644 --- a/cmd/puppeth/wizard_network.go +++ b/cmd/puppeth/wizard_network.go @@ -71,22 +71,20 @@ func (w *wizard) makeServer() string { fmt.Println() fmt.Println("Please enter remote server's address:") - for { - // Read and fial the server to ensure docker is present - input := w.readString() + // Read and fial the server to ensure docker is present + input := w.readString() - client, err := dial(input, nil) - if err != nil { - log.Error("Server not ready for puppeth", "err", err) - return "" - } - // All checks passed, start tracking the server - w.servers[input] = client - w.conf.Servers[input] = client.pubkey - w.conf.flush() - - return input + client, err := dial(input, nil) + if err != nil { + log.Error("Server not ready for puppeth", "err", err) + return "" } + // All checks passed, start tracking the server + w.servers[input] = client + w.conf.Servers[input] = client.pubkey + w.conf.flush() + + return input } // selectServer lists the user all the currnetly known servers to choose from, From 2b50367fe938e603a5f9d3a525e0cdfa000f402e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 7 Aug 2017 15:47:25 +0300 Subject: [PATCH 055/272] core: fix blockchain goroutine leaks in tests --- core/bench_test.go | 1 + core/block_validator_test.go | 5 ++++ core/blockchain_test.go | 57 ++++++++++++++++++++++++++++++++---- core/chain_makers_test.go | 3 ++ core/dao_test.go | 10 +++++++ core/filter_test.go | 17 ----------- core/genesis_test.go | 2 ++ core/tx_pool_test.go | 7 +++++ 8 files changed, 79 insertions(+), 23 deletions(-) delete mode 100644 core/filter_test.go diff --git a/core/bench_test.go b/core/bench_test.go index 20676fc976..b9250f7d39 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -300,6 +300,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { } } + chain.Stop() db.Close() } } diff --git a/core/block_validator_test.go b/core/block_validator_test.go index abe1766b4f..c0afc2955f 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -44,6 +44,7 @@ func TestHeaderVerification(t *testing.T) { } // Run the header checker for blocks one-by-one, checking for both valid and invalid nonces chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer chain.Stop() for i := 0; i < len(blocks); i++ { for j, valid := range []bool{true, false} { @@ -108,9 +109,11 @@ func testHeaderConcurrentVerification(t *testing.T, threads int) { if valid { chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) _, results = chain.engine.VerifyHeaders(chain, headers, seals) + chain.Stop() } else { chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), new(event.TypeMux), vm.Config{}) _, results = chain.engine.VerifyHeaders(chain, headers, seals) + chain.Stop() } // Wait for all the verification results checks := make(map[int]error) @@ -172,6 +175,8 @@ func testHeaderConcurrentAbortion(t *testing.T, threads int) { // Start the verifications and immediately abort chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), new(event.TypeMux), vm.Config{}) + defer chain.Stop() + abort, results := chain.engine.VerifyHeaders(chain, headers, seals) close(abort) diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 5fa671e2b9..4a0f449408 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -20,6 +20,7 @@ import ( "fmt" "math/big" "math/rand" + "sync" "testing" "time" @@ -61,6 +62,8 @@ func testFork(t *testing.T, blockchain *BlockChain, i, n int, full bool, compara if err != nil { t.Fatal("could not make new canonical in testFork", err) } + defer blockchain2.Stop() + // Assert the chains have the same header/block at #i var hash1, hash2 common.Hash if full { @@ -182,6 +185,8 @@ func insertChain(done chan bool, blockchain *BlockChain, chain types.Blocks, t * func TestLastBlock(t *testing.T) { bchain := newTestBlockChain(false) + defer bchain.Stop() + block := makeBlockChain(bchain.CurrentBlock(), 1, bchain.chainDb, 0)[0] bchain.insert(block) if block.Hash() != GetHeadBlockHash(bchain.chainDb) { @@ -202,6 +207,8 @@ func testExtendCanonical(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to make new canonical chain: %v", err) } + defer processor.Stop() + // Define the difficulty comparator better := func(td1, td2 *big.Int) { if td2.Cmp(td1) <= 0 { @@ -228,6 +235,8 @@ func testShorterFork(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to make new canonical chain: %v", err) } + defer processor.Stop() + // Define the difficulty comparator worse := func(td1, td2 *big.Int) { if td2.Cmp(td1) >= 0 { @@ -256,6 +265,8 @@ func testLongerFork(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to make new canonical chain: %v", err) } + defer processor.Stop() + // Define the difficulty comparator better := func(td1, td2 *big.Int) { if td2.Cmp(td1) <= 0 { @@ -284,6 +295,8 @@ func testEqualFork(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to make new canonical chain: %v", err) } + defer processor.Stop() + // Define the difficulty comparator equal := func(td1, td2 *big.Int) { if td2.Cmp(td1) != 0 { @@ -309,6 +322,8 @@ func testBrokenChain(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to make new canonical chain: %v", err) } + defer blockchain.Stop() + // Create a forked chain, and try to insert with a missing link if full { chain := makeBlockChain(blockchain.CurrentBlock(), 5, db, forkSeed)[1:] @@ -385,6 +400,7 @@ func testReorgShort(t *testing.T, full bool) { func testReorg(t *testing.T, first, second []int, td int64, full bool) { bc := newTestBlockChain(true) + defer bc.Stop() // Insert an easy and a difficult chain afterwards if full { @@ -429,6 +445,7 @@ func TestBadBlockHashes(t *testing.T) { testBadHashes(t, true) } func testBadHashes(t *testing.T, full bool) { bc := newTestBlockChain(true) + defer bc.Stop() // Create a chain, ban a hash and try to import var err error @@ -453,6 +470,7 @@ func TestReorgBadBlockHashes(t *testing.T) { testReorgBadHashes(t, true) } func testReorgBadHashes(t *testing.T, full bool) { bc := newTestBlockChain(true) + defer bc.Stop() // Create a chain, import and ban afterwards headers := makeHeaderChainWithDiff(bc.genesisBlock, []int{1, 2, 3, 4}, 10) @@ -483,6 +501,8 @@ func testReorgBadHashes(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to create new chain manager: %v", err) } + defer ncm.Stop() + if full { if ncm.CurrentBlock().Hash() != blocks[2].Header().Hash() { t.Errorf("last block hash mismatch: have: %x, want %x", ncm.CurrentBlock().Hash(), blocks[2].Header().Hash()) @@ -508,6 +528,8 @@ func testInsertNonceError(t *testing.T, full bool) { if err != nil { t.Fatalf("failed to create pristine chain: %v", err) } + defer blockchain.Stop() + // Create and insert a chain with a failing nonce var ( failAt int @@ -589,15 +611,16 @@ func TestFastVsFullChains(t *testing.T) { archiveDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(archiveDb) archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer archive.Stop() if n, err := archive.InsertChain(blocks); err != nil { t.Fatalf("failed to process block %d: %v", n, err) } - // Fast import the chain as a non-archive node to test fastDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(fastDb) fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer fast.Stop() headers := make([]*types.Header, len(blocks)) for i, block := range blocks { @@ -678,6 +701,8 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { if n, err := archive.InsertChain(blocks); err != nil { t.Fatalf("failed to process block %d: %v", n, err) } + defer archive.Stop() + assert(t, "archive", archive, height, height, height) archive.Rollback(remove) assert(t, "archive", archive, height/2, height/2, height/2) @@ -686,6 +711,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { fastDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(fastDb) fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer fast.Stop() headers := make([]*types.Header, len(blocks)) for i, block := range blocks { @@ -709,6 +735,8 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { if n, err := light.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) } + defer light.Stop() + assert(t, "light", light, height, 0, 0) light.Rollback(remove) assert(t, "light", light, height/2, 0, 0) @@ -777,6 +805,7 @@ func TestChainTxReorgs(t *testing.T) { if i, err := blockchain.InsertChain(chain); err != nil { t.Fatalf("failed to insert original chain[%d]: %v", i, err) } + defer blockchain.Stop() // overwrite the old chain chain, _ = GenerateChain(gspec.Config, genesis, db, 5, func(i int, gen *BlockGen) { @@ -845,6 +874,7 @@ func TestLogReorgs(t *testing.T) { var evmux event.TypeMux blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), &evmux, vm.Config{}) + defer blockchain.Stop() subs := evmux.Subscribe(RemovedLogsEvent{}) chain, _ := GenerateChain(params.TestChainConfig, genesis, db, 2, func(i int, gen *BlockGen) { @@ -886,6 +916,7 @@ func TestReorgSideEvent(t *testing.T) { evmux := &event.TypeMux{} blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), evmux, vm.Config{}) + defer blockchain.Stop() chain, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, gen *BlockGen) {}) if _, err := blockchain.InsertChain(chain); err != nil { @@ -955,11 +986,18 @@ done: // Tests if the canonical block can be fetched from the database during chain insertion. func TestCanonicalBlockRetrieval(t *testing.T) { - bc := newTestBlockChain(false) + bc := newTestBlockChain(true) + defer bc.Stop() + chain, _ := GenerateChain(bc.config, bc.genesisBlock, bc.chainDb, 10, func(i int, gen *BlockGen) {}) + var pend sync.WaitGroup + pend.Add(len(chain)) + for i := range chain { go func(block *types.Block) { + defer pend.Done() + // try to retrieve a block by its canonical hash and see if the block data can be retrieved. for { ch := GetCanonicalHash(bc.chainDb, block.NumberU64()) @@ -980,8 +1018,11 @@ func TestCanonicalBlockRetrieval(t *testing.T) { } }(chain[i]) - bc.InsertChain(types.Blocks{chain[i]}) + if _, err := bc.InsertChain(types.Blocks{chain[i]}); err != nil { + t.Fatalf("failed to insert block %d: %v", i, err) + } } + pend.Wait() } func TestEIP155Transition(t *testing.T) { @@ -1001,6 +1042,8 @@ func TestEIP155Transition(t *testing.T) { ) blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), &mux, vm.Config{}) + defer blockchain.Stop() + blocks, _ := GenerateChain(gspec.Config, genesis, db, 4, func(i int, block *BlockGen) { var ( tx *types.Transaction @@ -1104,10 +1147,12 @@ func TestEIP161AccountRemoval(t *testing.T) { }, Alloc: GenesisAlloc{address: {Balance: funds}}, } - genesis = gspec.MustCommit(db) - mux event.TypeMux - blockchain, _ = NewBlockChain(db, gspec.Config, ethash.NewFaker(), &mux, vm.Config{}) + genesis = gspec.MustCommit(db) + mux event.TypeMux ) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), &mux, vm.Config{}) + defer blockchain.Stop() + blocks, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, block *BlockGen) { var ( tx *types.Transaction diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index 3a7c62396f..28eb76c634 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -81,7 +81,10 @@ func ExampleGenerateChain() { // Import the chain. This runs all block validation rules. evmux := &event.TypeMux{} + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), evmux, vm.Config{}) + defer blockchain.Stop() + if i, err := blockchain.InsertChain(chain); err != nil { fmt.Printf("insert error (block %d): %v\n", chain[i].NumberU64(), err) return diff --git a/core/dao_test.go b/core/dao_test.go index bc9f3f3942..99bf1ecaef 100644 --- a/core/dao_test.go +++ b/core/dao_test.go @@ -43,11 +43,13 @@ func TestDAOForkRangeExtradata(t *testing.T) { gspec.MustCommit(proDb) proConf := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(0), DAOForkBlock: forkBlock, DAOForkSupport: true} proBc, _ := NewBlockChain(proDb, proConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer proBc.Stop() conDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(conDb) conConf := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(0), DAOForkBlock: forkBlock, DAOForkSupport: false} conBc, _ := NewBlockChain(conDb, conConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer conBc.Stop() if _, err := proBc.InsertChain(prefix); err != nil { t.Fatalf("pro-fork: failed to import chain prefix: %v", err) @@ -60,7 +62,9 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Create a pro-fork block, and try to feed into the no-fork chain db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) + bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer bc.Stop() blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) for j := 0; j < len(blocks)/2; j++ { @@ -81,7 +85,9 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Create a no-fork block, and try to feed into the pro-fork chain db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) + bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer bc.Stop() blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) for j := 0; j < len(blocks)/2; j++ { @@ -103,7 +109,9 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Verify that contra-forkers accept pro-fork extra-datas after forking finishes db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) + bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer bc.Stop() blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) for j := 0; j < len(blocks)/2; j++ { @@ -119,7 +127,9 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Verify that pro-forkers accept contra-fork extra-datas after forking finishes db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) + bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + defer bc.Stop() blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) for j := 0; j < len(blocks)/2; j++ { diff --git a/core/filter_test.go b/core/filter_test.go deleted file mode 100644 index 58e71e305d..0000000000 --- a/core/filter_test.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core diff --git a/core/genesis_test.go b/core/genesis_test.go index bc82fe54ea..8b193759fc 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -120,6 +120,8 @@ func TestSetupGenesis(t *testing.T) { // Advance to block #4, past the homestead transition block of customg. genesis := oldcustomg.MustCommit(db) bc, _ := NewBlockChain(db, oldcustomg.Config, ethash.NewFullFaker(), new(event.TypeMux), vm.Config{}) + defer bc.Stop() + bc.SetValidator(bproc{}) bc.InsertChain(makeBlockChainWithDiff(genesis, []int{2, 3, 4, 5}, 0)) bc.CurrentBlock() diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 9a03caf61c..020d6beddd 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -235,6 +235,8 @@ func TestTransactionQueue(t *testing.T) { } pool, key = setupTxPool() + defer pool.Stop() + tx1 := transaction(0, big.NewInt(100), key) tx2 := transaction(10, big.NewInt(100), key) tx3 := transaction(11, big.NewInt(100), key) @@ -848,6 +850,8 @@ func TestTransactionPendingLimitingEquivalency(t *testing.T) { testTransactionLi func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { // Add a batch of transactions to a pool one by one pool1, key1 := setupTxPool() + defer pool1.Stop() + account1, _ := deriveSender(transaction(0, big.NewInt(0), key1)) state1, _ := pool1.currentState() state1.AddBalance(account1, big.NewInt(1000000)) @@ -859,6 +863,8 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { } // Add a batch of transactions to a pool in one big batch pool2, key2 := setupTxPool() + defer pool2.Stop() + account2, _ := deriveSender(transaction(0, big.NewInt(0), key2)) state2, _ := pool2.currentState() state2.AddBalance(account2, big.NewInt(1000000)) @@ -1356,6 +1362,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } + pool.Stop() } // Benchmarks the speed of validating the contents of the pending queue of the From f59a49d591e3311b030b57d2be488a6303a3747a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 7 Aug 2017 15:50:31 +0200 Subject: [PATCH 056/272] internal/build: add GoTool and document why it uses GOROOT --- build/ci.go | 5 +---- internal/build/util.go | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/build/ci.go b/build/ci.go index e631d70efd..6fe03db713 100644 --- a/build/ci.go +++ b/build/ci.go @@ -250,10 +250,7 @@ func goTool(subcmd string, args ...string) *exec.Cmd { } func goToolArch(arch string, subcmd string, args ...string) *exec.Cmd { - gocmd := filepath.Join(runtime.GOROOT(), "bin", "go") - cmd := exec.Command(gocmd, subcmd) - cmd.Args = append(cmd.Args, args...) - + cmd := build.GoTool(subcmd, args...) if subcmd == "build" || subcmd == "install" || subcmd == "test" { // Go CGO has a Windows linker error prior to 1.8 (https://github.com/golang/go/issues/8756). // Work around issue by allowing multiple definitions for <1.8 builds. diff --git a/internal/build/util.go b/internal/build/util.go index 44f6760b95..ade9cbe930 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -138,6 +138,19 @@ func CopyFile(dst, src string, mode os.FileMode) { } } +// GoTool returns the command that runs a go tool. This uses go from GOROOT instead of PATH +// so that go commands executed by build use the same version of Go as the 'host' that runs +// build code. e.g. +// +// /usr/lib/go-1.8/bin/go run build/ci.go ... +// +// runs using go 1.8 and invokes go 1.8 tools from the same GOROOT. This is also important +// because runtime.Version checks on the host should match the tools that are run. +func GoTool(tool string, args ...string) *exec.Cmd { + args = append([]string{tool}, args...) + return exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) +} + // ExpandPackagesNoVendor expands a cmd/go import path pattern, skipping // vendored packages. func ExpandPackagesNoVendor(patterns []string) []string { @@ -148,8 +161,7 @@ func ExpandPackagesNoVendor(patterns []string) []string { } } if expand { - args := append([]string{"list"}, patterns...) - cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) + cmd := GoTool("list", patterns...) out, err := cmd.CombinedOutput() if err != nil { log.Fatalf("package listing failed: %v\n%s", err, string(out)) From bd74882d83509ba4a8477dd21b86d46bc7d12eb4 Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Sun, 5 Mar 2017 16:52:03 +0100 Subject: [PATCH 057/272] core: implement ChainIndexer --- core/chain_indexer.go | 294 +++++++++++++++++++++++++++++++++++++ core/chain_indexer_test.go | 235 +++++++++++++++++++++++++++++ 2 files changed, 529 insertions(+) create mode 100644 core/chain_indexer.go create mode 100644 core/chain_indexer_test.go diff --git a/core/chain_indexer.go b/core/chain_indexer.go new file mode 100644 index 0000000000..f1ead526de --- /dev/null +++ b/core/chain_indexer.go @@ -0,0 +1,294 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package core implements the Ethereum consensus protocol. +package core + +import ( + "encoding/binary" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" +) + +// ChainIndexer does a post-processing job for equally sized sections of the canonical +// chain (like BlooomBits and CHT structures). A ChainIndexer is connected to the blockchain +// through the event system by starting a ChainEventLoop in a goroutine. +// Further child ChainIndexers can be added which use the output of the parent section +// indexer. These child indexers receive new head notifications only after an entire section +// has been finished or in case of rollbacks that might affect already finished sections. +type ChainIndexer struct { + chainDb, indexDb ethdb.Database + backend ChainIndexerBackend + sectionSize, confirmReq uint64 + stop chan struct{} + lock sync.Mutex + procWait time.Duration + tryUpdate chan struct{} + stored, targetCount, calcIdx, lastForwarded uint64 + updating bool + children []*ChainIndexer +} + +// ChainIndexerBackend interface is a backend for the indexer doing the actual post-processing job +type ChainIndexerBackend interface { + Reset(section uint64) // start processing a new section + Process(header *types.Header) // process a single block (called for each block in the section) + Commit(db ethdb.Database) error // do some more processing if necessary and store the results in the database + UpdateMsg(done, all uint64) // print a progress update message if necessary (only called when multiple sections need to be processed) +} + +// NewChainIndexer creates a new ChainIndexer +// db: database where the index of available processed sections is stored (the index is stored by the +// indexer, the actual processed chain data is stored by the backend) +// dbKey: key prefix where the index is stored +// backend: an implementation of ChainIndexerBackend +// sectionSize: the size of processable sections +// confirmReq: required number of confirmation blocks before a new section is being processed +// procWait: waiting time between processing sections (simple way of limiting the resource usage of a db upgrade) +// stop: quit channel +func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBackend, sectionSize, confirmReq uint64, procWait time.Duration, stop chan struct{}) *ChainIndexer { + c := &ChainIndexer{ + chainDb: chainDb, + indexDb: indexDb, + backend: backend, + sectionSize: sectionSize, + confirmReq: confirmReq, + tryUpdate: make(chan struct{}, 1), + stop: stop, + procWait: procWait, + } + c.stored = c.getValidSections() + go c.updateLoop() + return c +} + +// updateLoop is the main event loop of the indexer +func (c *ChainIndexer) updateLoop() { + updateMsg := false + + for { + select { + case <-c.stop: + return + case <-c.tryUpdate: + c.lock.Lock() + if c.targetCount > c.stored { + if !updateMsg && c.targetCount > c.stored+1 { + updateMsg = true + c.backend.UpdateMsg(c.stored, c.targetCount) + } + c.calcIdx = c.stored + + var lastSectionHead common.Hash + if c.calcIdx > 0 { + lastSectionHead = c.getSectionHead(c.calcIdx - 1) + } + + c.lock.Unlock() + sectionHead, ok := c.processSection(c.calcIdx, lastSectionHead) + c.lock.Lock() + + if ok && lastSectionHead == c.getSectionHead(c.calcIdx-1) { + c.stored = c.calcIdx + 1 + c.setSectionHead(c.calcIdx, sectionHead) + c.setValidSections(c.stored) + if updateMsg { + c.backend.UpdateMsg(c.stored, c.targetCount) + if c.stored >= c.targetCount { + updateMsg = false + } + } + c.lastForwarded = c.stored*c.sectionSize - 1 + for _, cp := range c.children { + cp.newHead(c.lastForwarded, false) + } + } else { + // if processing has failed, do not retry until further notification + c.targetCount = c.stored + } + } + + if c.targetCount > c.stored { + go func() { + time.Sleep(c.procWait) + c.tryUpdate <- struct{}{} + }() + } else { + c.updating = false + } + c.lock.Unlock() + } + } +} + +// ChainEventLoop runs in a goroutine and feeds blockchain events to the indexer by calling newHead +// (not needed for child indexers where the parent calls newHead) +func (c *ChainIndexer) ChainEventLoop(currentHeader *types.Header, eventMux *event.TypeMux) { + sub := eventMux.Subscribe(ChainEvent{}) + c.newHead(currentHeader.Number.Uint64(), false) + lastHead := currentHeader.Hash() + for { + select { + case <-c.stop: + return + case ev := <-sub.Chan(): + header := ev.Data.(ChainEvent).Block.Header() + c.newHead(header.Number.Uint64(), header.ParentHash != lastHead) + lastHead = header.Hash() + } + } +} + +// AddChildIndexer adds a child ChainIndexer that can use the output of this one +func (c *ChainIndexer) AddChildIndexer(ci *ChainIndexer) { + c.children = append(c.children, ci) +} + +// newHead notifies the indexer about new chain heads or rollbacks +func (c *ChainIndexer) newHead(headNum uint64, rollback bool) { + c.lock.Lock() + defer c.lock.Unlock() + + if rollback { + firstChanged := headNum / c.sectionSize + if firstChanged < c.targetCount { + c.targetCount = firstChanged + } + if firstChanged < c.stored { + c.stored = firstChanged + c.setValidSections(c.stored) + } + headNum = firstChanged * c.sectionSize + + if headNum < c.lastForwarded { + c.lastForwarded = headNum + for _, cp := range c.children { + cp.newHead(c.lastForwarded, true) + } + } + + } else { + var newCount uint64 + if headNum >= c.confirmReq { + newCount = (headNum + 1 - c.confirmReq) / c.sectionSize + if newCount > c.targetCount { + c.targetCount = newCount + if !c.updating { + c.updating = true + c.tryUpdate <- struct{}{} + } + } + } + } +} + +// processSection processes an entire section by calling backend functions while ensuring +// the continuity of the passed headers. Since the chain mutex is not held while processing, +// the continuity can be broken by a long reorg, in which case the function returns with ok == false. +func (c *ChainIndexer) processSection(section uint64, lastSectionHead common.Hash) (sectionHead common.Hash, ok bool) { + c.backend.Reset(section) + + head := lastSectionHead + for i := section * c.sectionSize; i < (section+1)*c.sectionSize; i++ { + hash := GetCanonicalHash(c.chainDb, i) + if hash == (common.Hash{}) { + return common.Hash{}, false + } + header := GetHeader(c.chainDb, hash, i) + if header == nil || header.ParentHash != head { + return common.Hash{}, false + } + c.backend.Process(header) + head = header.Hash() + } + if err := c.backend.Commit(c.chainDb); err != nil { + return common.Hash{}, false + } + return head, true +} + +// CanonicalSections returns the number of processed sections that are consistent with +// the current canonical chain +func (c *ChainIndexer) CanonicalSections() uint64 { + c.lock.Lock() + defer c.lock.Unlock() + + cnt := c.getValidSections() + for cnt > 0 { + if c.getSectionHead(cnt-1) == GetCanonicalHash(c.chainDb, cnt*c.sectionSize-1) { + break + } + cnt-- + c.setValidSections(cnt) + } + return cnt +} + +// getValidSections reads the number of valid sections from the index database +func (c *ChainIndexer) getValidSections() uint64 { + data, _ := c.indexDb.Get([]byte("count")) + if len(data) == 8 { + return binary.BigEndian.Uint64(data[:]) + } + return 0 +} + +// setValidSections writes the number of valid sections to the index database +func (c *ChainIndexer) setValidSections(cnt uint64) { + oldCnt := c.getValidSections() + if cnt < oldCnt { + for i := cnt; i < oldCnt; i++ { + c.removeSectionHead(i) + } + } + + var data [8]byte + binary.BigEndian.PutUint64(data[:], cnt) + c.indexDb.Put([]byte("count"), data[:]) +} + +// getSectionHead reads the last block hash of a processed section from the index database +func (c *ChainIndexer) getSectionHead(idx uint64) common.Hash { + var data [8]byte + binary.BigEndian.PutUint64(data[:], idx) + + hash, _ := c.indexDb.Get(append([]byte("shead"), data[:]...)) + if len(hash) == len(common.Hash{}) { + return common.BytesToHash(hash) + } + return common.Hash{} +} + +// setSectionHead writes the last block hash of a processed section to the index database +func (c *ChainIndexer) setSectionHead(idx uint64, shead common.Hash) { + var data [8]byte + binary.BigEndian.PutUint64(data[:], idx) + + c.indexDb.Put(append([]byte("shead"), data[:]...), shead.Bytes()) +} + +// removeSectionHead removes the reference to a processed section from the index database +func (c *ChainIndexer) removeSectionHead(idx uint64) { + var data [8]byte + binary.BigEndian.PutUint64(data[:], idx) + + c.indexDb.Delete(append([]byte("shead"), data[:]...)) +} diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go new file mode 100644 index 0000000000..827976d51c --- /dev/null +++ b/core/chain_indexer_test.go @@ -0,0 +1,235 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package core implements the Ethereum consensus protocol. +package core + +import ( + "encoding/binary" + "math/big" + "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" +) + +func TestChainIndexerSingle(t *testing.T) { + // run multiple tests with randomized parameters + for i := 0; i < 10; i++ { + testChainIndexer(t, 1) + } +} + +func TestChainIndexerWithChildren(t *testing.T) { + // run multiple tests with randomized parameters and different number of + // chained indexers + for i := 2; i < 8; i++ { + testChainIndexer(t, i) + } +} + +// testChainIndexer runs a test with either a single ChainIndexer or a chain of multiple indexers +// sectionSize and confirmReq parameters are randomized +func testChainIndexer(t *testing.T, tciCount int) { + db, _ := ethdb.NewMemDatabase() + stop := make(chan struct{}) + tciList := make([]*testChainIndex, tciCount) + var lastIndexer *ChainIndexer + for i, _ := range tciList { + tci := &testChainIndex{t: t, sectionSize: uint64(rand.Intn(100) + 1), confirmReq: uint64(rand.Intn(10)), processCh: make(chan uint64)} + tciList[i] = tci + tci.indexer = NewChainIndexer(db, ethdb.NewTable(db, string([]byte{byte(i)})), tci, tci.sectionSize, tci.confirmReq, 0, stop) + if cs := tci.indexer.CanonicalSections(); cs != 0 { + t.Errorf("Expected 0 canonical sections, got %d", cs) + } + if lastIndexer != nil { + lastIndexer.AddChildIndexer(tci.indexer) + } + lastIndexer = tci.indexer + } + + // expectCs expects a certain number of available canonical sections + expectCs := func(indexer *ChainIndexer, expCs uint64) { + cnt := 0 + for { + cs := indexer.CanonicalSections() + if cs == expCs { + return + } + // keep trying for 10 seconds if it does not match + cnt++ + if cnt == 10000 { + t.Fatalf("Expected %d canonical sections, got %d", expCs, cs) + } + time.Sleep(time.Millisecond) + } + } + + // notify the indexer about a new head or rollback, then expect processed blocks if a section is processable + notify := func(headNum, expFailAfter uint64, rollback bool) { + tciList[0].indexer.newHead(headNum, rollback) + if rollback { + for _, tci := range tciList { + headNum = tci.rollback(headNum) + expectCs(tci.indexer, tci.stored) + } + } else { + for _, tci := range tciList { + var more bool + headNum, more = tci.newBlocks(headNum, expFailAfter) + if !more { + break + } + expectCs(tci.indexer, tci.stored) + } + } + } + + for i := uint64(0); i <= 100; i++ { + testCanonicalHeader(db, i) + } + // start indexer with an already existing chain + notify(100, 100, false) + // add new blocks one by one + for i := uint64(101); i <= 1000; i++ { + testCanonicalHeader(db, i) + notify(i, i, false) + } + // do a rollback + notify(500, 500, true) + // create new fork + for i := uint64(501); i <= 1000; i++ { + testCanonicalHeader(db, i) + notify(i, i, false) + } + + for i := uint64(1001); i <= 1500; i++ { + testCanonicalHeader(db, i) + } + // create a failed processing scenario where less blocks are available at processing time than notified + notify(2000, 1500, false) + // notify about a rollback (which could have caused the missing blocks if happened during processing) + notify(1500, 1500, true) + + // create new fork + for i := uint64(1501); i <= 2000; i++ { + testCanonicalHeader(db, i) + notify(i, i, false) + } + close(stop) + db.Close() +} + +func testCanonicalHeader(db ethdb.Database, idx uint64) { + var rnd [8]byte + binary.BigEndian.PutUint64(rnd[:], uint64(rand.Int63())) + header := &types.Header{Number: big.NewInt(int64(idx)), Extra: rnd[:]} + if idx > 0 { + header.ParentHash = GetCanonicalHash(db, idx-1) + } + WriteHeader(db, header) + WriteCanonicalHash(db, header.Hash(), idx) +} + +// testChainIndex implements ChainIndexerBackend +type testChainIndex struct { + t *testing.T + sectionSize, confirmReq uint64 + section, headerCnt, stored uint64 + indexer *ChainIndexer + processCh chan uint64 +} + +// newBlocks expects process calls after new blocks have arrived. If expFailAfter < headNum then +// we are simulating a scenario where a rollback has happened after the processing has started and +// the processing of a section fails. +func (t *testChainIndex) newBlocks(headNum, expFailAfter uint64) (uint64, bool) { + var newCount uint64 + if headNum >= t.confirmReq { + newCount = (headNum + 1 - t.confirmReq) / t.sectionSize + if newCount > t.stored { + // expect processed blocks + for exp := t.stored * t.sectionSize; exp < newCount*t.sectionSize; exp++ { + if exp > expFailAfter { + // rolled back after processing started, no more process calls expected + // wait until updating is done to make sure that processing actually fails + for { + t.indexer.lock.Lock() + u := t.indexer.updating + t.indexer.lock.Unlock() + if !u { + break + } + time.Sleep(time.Millisecond) + } + + newCount = exp / t.sectionSize + break + } + select { + case <-time.After(10 * time.Second): + t.t.Fatalf("Expected processed block #%d, got nothing", exp) + case proc := <-t.processCh: + if proc != exp { + t.t.Errorf("Expected processed block #%d, got #%d", exp, proc) + } + } + } + t.stored = newCount + } + } + if t.stored == 0 { + return 0, false + } + return t.stored*t.sectionSize - 1, true +} + +func (t *testChainIndex) rollback(headNum uint64) uint64 { + firstChanged := headNum / t.sectionSize + if firstChanged < t.stored { + t.stored = firstChanged + } + return t.stored * t.sectionSize +} + +func (t *testChainIndex) Reset(section uint64) { + t.section = section + t.headerCnt = 0 +} + +func (t *testChainIndex) Process(header *types.Header) { + t.headerCnt++ + if t.headerCnt > t.sectionSize { + t.t.Error("Processing too many headers") + } + //t.processCh <- header.Number.Uint64() + select { + case <-time.After(10 * time.Second): + t.t.Fatal("Unexpected call to Process") + case t.processCh <- header.Number.Uint64(): + } +} + +func (t *testChainIndex) Commit(db ethdb.Database) error { + if t.headerCnt != t.sectionSize { + t.t.Error("Not enough headers processed") + } + return nil +} + +func (t *testChainIndex) UpdateMsg(done, all uint64) {} From 8edaaa227db9dfc0a3993f9d33413771c7963330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 3 Aug 2017 18:25:06 +0200 Subject: [PATCH 058/272] core: polish chain indexer a bit --- core/chain_indexer.go | 488 ++++++++++++++++++++++--------------- core/chain_indexer_test.go | 269 ++++++++++---------- 2 files changed, 429 insertions(+), 328 deletions(-) diff --git a/core/chain_indexer.go b/core/chain_indexer.go index f1ead526de..9a88a5b1b8 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -14,261 +14,361 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package core implements the Ethereum consensus protocol. package core import ( "encoding/binary" + "fmt" "sync" + "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" ) -// ChainIndexer does a post-processing job for equally sized sections of the canonical -// chain (like BlooomBits and CHT structures). A ChainIndexer is connected to the blockchain -// through the event system by starting a ChainEventLoop in a goroutine. -// Further child ChainIndexers can be added which use the output of the parent section -// indexer. These child indexers receive new head notifications only after an entire section -// has been finished or in case of rollbacks that might affect already finished sections. -type ChainIndexer struct { - chainDb, indexDb ethdb.Database - backend ChainIndexerBackend - sectionSize, confirmReq uint64 - stop chan struct{} - lock sync.Mutex - procWait time.Duration - tryUpdate chan struct{} - stored, targetCount, calcIdx, lastForwarded uint64 - updating bool - children []*ChainIndexer -} - -// ChainIndexerBackend interface is a backend for the indexer doing the actual post-processing job +// ChainIndexerBackend defines the methods needed to process chain segments in +// the background and write the segment results into the database. These can be +// used to create filter blooms or CHTs. type ChainIndexerBackend interface { - Reset(section uint64) // start processing a new section - Process(header *types.Header) // process a single block (called for each block in the section) - Commit(db ethdb.Database) error // do some more processing if necessary and store the results in the database - UpdateMsg(done, all uint64) // print a progress update message if necessary (only called when multiple sections need to be processed) + // Reset initiates the processing of a new chain segment, potentially terminating + // any partially completed operations (in case of a reorg). + Reset(section uint64) + + // Process crunches through the next header in the chain segment. The caller + // will ensure a sequential order of headers. + Process(header *types.Header) + + // Commit finalizes the section metadata and stores it into the database. This + // interface will usually be a batch writer. + Commit(db ethdb.Database) error } -// NewChainIndexer creates a new ChainIndexer -// db: database where the index of available processed sections is stored (the index is stored by the -// indexer, the actual processed chain data is stored by the backend) -// dbKey: key prefix where the index is stored -// backend: an implementation of ChainIndexerBackend -// sectionSize: the size of processable sections -// confirmReq: required number of confirmation blocks before a new section is being processed -// procWait: waiting time between processing sections (simple way of limiting the resource usage of a db upgrade) -// stop: quit channel -func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBackend, sectionSize, confirmReq uint64, procWait time.Duration, stop chan struct{}) *ChainIndexer { +// ChainIndexer does a post-processing job for equally sized sections of the +// canonical chain (like BlooomBits and CHT structures). A ChainIndexer is +// connected to the blockchain through the event system by starting a +// ChainEventLoop in a goroutine. +// +// Further child ChainIndexers can be added which use the output of the parent +// section indexer. These child indexers receive new head notifications only +// after an entire section has been finished or in case of rollbacks that might +// affect already finished sections. +type ChainIndexer struct { + chainDb ethdb.Database // Chain database to index the data from + indexDb ethdb.Database // Prefixed table-view of the db to write index metadata into + backend ChainIndexerBackend // Background processor generating the index data content + children []*ChainIndexer // Child indexers to cascade chain updates to + + active uint32 // Flag whether the event loop was started + update chan struct{} // Notification channel that headers should be processed + quit chan chan error // Quit channel to tear down running goroutines + + sectionSize uint64 // Number of blocks in a single chain segment to process + confirmsReq uint64 // Number of confirmations before processing a completed segment + + storedSections uint64 // Number of sections successfully indexed into the database + knownSections uint64 // Number of sections known to be complete (block wise) + cascadedHead uint64 // Block number of the last completed section cascaded to subindexers + + throttling time.Duration // Disk throttling to prevent a heavy upgrade from hogging resources + + log log.Logger + lock sync.RWMutex +} + +// NewChainIndexer creates a new chain indexer to do background processing on +// chain segments of a given size after certain number of confirmations passed. +// The throttling parameter might be used to prevent database thrashing. +func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer { c := &ChainIndexer{ chainDb: chainDb, indexDb: indexDb, backend: backend, - sectionSize: sectionSize, - confirmReq: confirmReq, - tryUpdate: make(chan struct{}, 1), - stop: stop, - procWait: procWait, + update: make(chan struct{}, 1), + quit: make(chan chan error), + sectionSize: section, + confirmsReq: confirm, + throttling: throttling, + log: log.New("type", kind), } - c.stored = c.getValidSections() + // Initialize database dependent fields and start the updater + c.loadValidSections() go c.updateLoop() + return c } -// updateLoop is the main event loop of the indexer +// Start creates a goroutine to feed chain head events into the indexer for +// cascading background processing. +func (c *ChainIndexer) Start(currentHeader *types.Header, eventMux *event.TypeMux) { + go c.eventLoop(currentHeader, eventMux) +} + +// Close tears down all goroutines belonging to the indexer and returns any error +// that might have occurred internally. +func (c *ChainIndexer) Close() error { + var errs []error + + // Tear down the primary update loop + errc := make(chan error) + c.quit <- errc + if err := <-errc; err != nil { + errs = append(errs, err) + } + // If needed, tear down the secondary event loop + if atomic.LoadUint32(&c.active) != 0 { + c.quit <- errc + if err := <-errc; err != nil { + errs = append(errs, err) + } + } + // Return any failures + switch { + case len(errs) == 0: + return nil + + case len(errs) == 1: + return errs[0] + + default: + return fmt.Errorf("%v", errs) + } +} + +// eventLoop is a secondary - optional - event loop of the indexer which is only +// started for the outermost indexer to push chain head events into a processing +// queue. +func (c *ChainIndexer) eventLoop(currentHeader *types.Header, eventMux *event.TypeMux) { + // Mark the chain indexer as active, requiring an additional teardown + atomic.StoreUint32(&c.active, 1) + + // Subscribe to chain head events + sub := eventMux.Subscribe(ChainEvent{}) + defer sub.Unsubscribe() + + // Fire the initial new head event to start any outstanding processing + c.newHead(currentHeader.Number.Uint64(), false) + + var ( + prevHeader = currentHeader + prevHash = currentHeader.Hash() + ) + for { + select { + case errc := <-c.quit: + // Chain indexer terminating, report no failure and abort + errc <- nil + return + + case ev, ok := <-sub.Chan(): + // Received a new event, ensure it's not nil (closing) and update + if !ok { + errc := <-c.quit + errc <- nil + return + } + header := ev.Data.(ChainEvent).Block.Header() + if header.ParentHash != prevHash { + c.newHead(FindCommonAncestor(c.chainDb, prevHeader, header).Number.Uint64(), true) + } + c.newHead(header.Number.Uint64(), false) + + prevHeader, prevHash = header, header.Hash() + } + } +} + +// newHead notifies the indexer about new chain heads and/or reorgs. +func (c *ChainIndexer) newHead(head uint64, reorg bool) { + c.lock.Lock() + defer c.lock.Unlock() + + // If a reorg happened, invalidate all sections until that point + if reorg { + // Revert the known section number to the reorg point + changed := head / c.sectionSize + if changed < c.knownSections { + c.knownSections = changed + } + // Revert the stored sections from the database to the reorg point + if changed < c.storedSections { + c.setValidSections(changed) + } + // Update the new head number to te finalized section end and notify children + head = changed * c.sectionSize + + if head < c.cascadedHead { + c.cascadedHead = head + for _, child := range c.children { + child.newHead(c.cascadedHead, true) + } + } + return + } + // No reorg, calculate the number of newly known sections and update if high enough + var sections uint64 + if head >= c.confirmsReq { + sections = (head + 1 - c.confirmsReq) / c.sectionSize + if sections > c.knownSections { + c.knownSections = sections + + select { + case c.update <- struct{}{}: + default: + } + } + } +} + +// updateLoop is the main event loop of the indexer which pushes chain segments +// down into the processing backend. func (c *ChainIndexer) updateLoop() { - updateMsg := false + var updated time.Time for { select { - case <-c.stop: + case errc := <-c.quit: + // Chain indexer terminating, report no failure and abort + errc <- nil return - case <-c.tryUpdate: + + case <-c.update: + // Section headers completed (or rolled back), update the index c.lock.Lock() - if c.targetCount > c.stored { - if !updateMsg && c.targetCount > c.stored+1 { - updateMsg = true - c.backend.UpdateMsg(c.stored, c.targetCount) + if c.knownSections > c.storedSections { + // Periodically print an upgrade log message to the user + if time.Since(updated) > 8*time.Second { + if c.knownSections > c.storedSections+1 { + c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) + } + updated = time.Now() } - c.calcIdx = c.stored - - var lastSectionHead common.Hash - if c.calcIdx > 0 { - lastSectionHead = c.getSectionHead(c.calcIdx - 1) + // Cache the current section count and head to allow unlocking the mutex + section := c.storedSections + var oldHead common.Hash + if section > 0 { + oldHead = c.sectionHead(section - 1) } - + // Process the newly defined section in the background c.lock.Unlock() - sectionHead, ok := c.processSection(c.calcIdx, lastSectionHead) + newHead, err := c.processSection(section, oldHead) c.lock.Lock() - if ok && lastSectionHead == c.getSectionHead(c.calcIdx-1) { - c.stored = c.calcIdx + 1 - c.setSectionHead(c.calcIdx, sectionHead) - c.setValidSections(c.stored) - if updateMsg { - c.backend.UpdateMsg(c.stored, c.targetCount) - if c.stored >= c.targetCount { - updateMsg = false - } - } - c.lastForwarded = c.stored*c.sectionSize - 1 - for _, cp := range c.children { - cp.newHead(c.lastForwarded, false) + // If processing succeeded and no reorgs occcurred, mark the section completed + if err == nil && oldHead == c.sectionHead(section-1) { + c.setSectionHead(section, newHead) + c.setValidSections(section + 1) + + c.cascadedHead = c.storedSections*c.sectionSize - 1 + for _, child := range c.children { + c.log.Trace("Cascading chain index update", "head", c.cascadedHead) + child.newHead(c.cascadedHead, false) } } else { - // if processing has failed, do not retry until further notification - c.targetCount = c.stored + // If processing failed, don't retry until further notification + c.log.Debug("Chain index processing failed", "section", section, "err", err) + c.knownSections = c.storedSections } } - - if c.targetCount > c.stored { - go func() { - time.Sleep(c.procWait) - c.tryUpdate <- struct{}{} - }() - } else { - c.updating = false + // If there are still further sections to process, reschedule + if c.knownSections > c.storedSections { + time.AfterFunc(c.throttling, func() { + select { + case c.update <- struct{}{}: + default: + } + }) } c.lock.Unlock() } } } -// ChainEventLoop runs in a goroutine and feeds blockchain events to the indexer by calling newHead -// (not needed for child indexers where the parent calls newHead) -func (c *ChainIndexer) ChainEventLoop(currentHeader *types.Header, eventMux *event.TypeMux) { - sub := eventMux.Subscribe(ChainEvent{}) - c.newHead(currentHeader.Number.Uint64(), false) - lastHead := currentHeader.Hash() - for { - select { - case <-c.stop: - return - case ev := <-sub.Chan(): - header := ev.Data.(ChainEvent).Block.Header() - c.newHead(header.Number.Uint64(), header.ParentHash != lastHead) - lastHead = header.Hash() +// processSection processes an entire section by calling backend functions while +// ensuring the continuity of the passed headers. Since the chain mutex is not +// held while processing, the continuity can be broken by a long reorg, in which +// case the function returns with an error. +func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (common.Hash, error) { + c.log.Trace("Processing new chain section", "section", section) + + // Reset and partial processing + c.backend.Reset(section) + + for number := section * c.sectionSize; number < (section+1)*c.sectionSize; number++ { + hash := GetCanonicalHash(c.chainDb, number) + if hash == (common.Hash{}) { + return common.Hash{}, fmt.Errorf("canonical block #%d unknown", number) } + header := GetHeader(c.chainDb, hash, number) + if header == nil { + return common.Hash{}, fmt.Errorf("block #%d [%x…] not found", number, hash[:4]) + } else if header.ParentHash != lastHead { + return common.Hash{}, fmt.Errorf("chain reorged during section processing") + } + c.backend.Process(header) + lastHead = header.Hash() } + if err := c.backend.Commit(c.chainDb); err != nil { + return common.Hash{}, err + } + return lastHead, nil +} + +// Sections returns the number of processed sections maintained by the indexer +// and also the information about the last header indexed for potential canonical +// verifications. +func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { + c.lock.Lock() + defer c.lock.Unlock() + + return c.storedSections, c.storedSections*c.sectionSize - 1, c.sectionHead(c.storedSections - 1) } // AddChildIndexer adds a child ChainIndexer that can use the output of this one -func (c *ChainIndexer) AddChildIndexer(ci *ChainIndexer) { - c.children = append(c.children, ci) -} - -// newHead notifies the indexer about new chain heads or rollbacks -func (c *ChainIndexer) newHead(headNum uint64, rollback bool) { +func (c *ChainIndexer) AddChildIndexer(indexer *ChainIndexer) { c.lock.Lock() defer c.lock.Unlock() - if rollback { - firstChanged := headNum / c.sectionSize - if firstChanged < c.targetCount { - c.targetCount = firstChanged - } - if firstChanged < c.stored { - c.stored = firstChanged - c.setValidSections(c.stored) - } - headNum = firstChanged * c.sectionSize + c.children = append(c.children, indexer) - if headNum < c.lastForwarded { - c.lastForwarded = headNum - for _, cp := range c.children { - cp.newHead(c.lastForwarded, true) - } - } - - } else { - var newCount uint64 - if headNum >= c.confirmReq { - newCount = (headNum + 1 - c.confirmReq) / c.sectionSize - if newCount > c.targetCount { - c.targetCount = newCount - if !c.updating { - c.updating = true - c.tryUpdate <- struct{}{} - } - } - } + // Cascade any pending updates to new children too + if c.storedSections > 0 { + indexer.newHead(c.storedSections*c.sectionSize-1, false) } } -// processSection processes an entire section by calling backend functions while ensuring -// the continuity of the passed headers. Since the chain mutex is not held while processing, -// the continuity can be broken by a long reorg, in which case the function returns with ok == false. -func (c *ChainIndexer) processSection(section uint64, lastSectionHead common.Hash) (sectionHead common.Hash, ok bool) { - c.backend.Reset(section) - - head := lastSectionHead - for i := section * c.sectionSize; i < (section+1)*c.sectionSize; i++ { - hash := GetCanonicalHash(c.chainDb, i) - if hash == (common.Hash{}) { - return common.Hash{}, false - } - header := GetHeader(c.chainDb, hash, i) - if header == nil || header.ParentHash != head { - return common.Hash{}, false - } - c.backend.Process(header) - head = header.Hash() - } - if err := c.backend.Commit(c.chainDb); err != nil { - return common.Hash{}, false - } - return head, true -} - -// CanonicalSections returns the number of processed sections that are consistent with -// the current canonical chain -func (c *ChainIndexer) CanonicalSections() uint64 { - c.lock.Lock() - defer c.lock.Unlock() - - cnt := c.getValidSections() - for cnt > 0 { - if c.getSectionHead(cnt-1) == GetCanonicalHash(c.chainDb, cnt*c.sectionSize-1) { - break - } - cnt-- - c.setValidSections(cnt) - } - return cnt -} - -// getValidSections reads the number of valid sections from the index database -func (c *ChainIndexer) getValidSections() uint64 { +// loadValidSections reads the number of valid sections from the index database +// and caches is into the local state. +func (c *ChainIndexer) loadValidSections() { data, _ := c.indexDb.Get([]byte("count")) if len(data) == 8 { - return binary.BigEndian.Uint64(data[:]) + c.storedSections = binary.BigEndian.Uint64(data[:]) } - return 0 } // setValidSections writes the number of valid sections to the index database -func (c *ChainIndexer) setValidSections(cnt uint64) { - oldCnt := c.getValidSections() - if cnt < oldCnt { - for i := cnt; i < oldCnt; i++ { - c.removeSectionHead(i) - } - } - +func (c *ChainIndexer) setValidSections(sections uint64) { + // Set the current number of valid sections in the database var data [8]byte - binary.BigEndian.PutUint64(data[:], cnt) + binary.BigEndian.PutUint64(data[:], sections) c.indexDb.Put([]byte("count"), data[:]) + + // Remove any reorged sections, caching the valids in the mean time + for c.storedSections > sections { + c.storedSections-- + c.removeSectionHead(c.storedSections) + } + c.storedSections = sections // needed if new > old } -// getSectionHead reads the last block hash of a processed section from the index database -func (c *ChainIndexer) getSectionHead(idx uint64) common.Hash { +// sectionHead retrieves the last block hash of a processed section from the +// index database. +func (c *ChainIndexer) sectionHead(section uint64) common.Hash { var data [8]byte - binary.BigEndian.PutUint64(data[:], idx) + binary.BigEndian.PutUint64(data[:], section) hash, _ := c.indexDb.Get(append([]byte("shead"), data[:]...)) if len(hash) == len(common.Hash{}) { @@ -277,18 +377,20 @@ func (c *ChainIndexer) getSectionHead(idx uint64) common.Hash { return common.Hash{} } -// setSectionHead writes the last block hash of a processed section to the index database -func (c *ChainIndexer) setSectionHead(idx uint64, shead common.Hash) { +// setSectionHead writes the last block hash of a processed section to the index +// database. +func (c *ChainIndexer) setSectionHead(section uint64, hash common.Hash) { var data [8]byte - binary.BigEndian.PutUint64(data[:], idx) + binary.BigEndian.PutUint64(data[:], section) - c.indexDb.Put(append([]byte("shead"), data[:]...), shead.Bytes()) + c.indexDb.Put(append([]byte("shead"), data[:]...), hash.Bytes()) } -// removeSectionHead removes the reference to a processed section from the index database -func (c *ChainIndexer) removeSectionHead(idx uint64) { +// removeSectionHead removes the reference to a processed section from the index +// database. +func (c *ChainIndexer) removeSectionHead(section uint64) { var data [8]byte - binary.BigEndian.PutUint64(data[:], idx) + binary.BigEndian.PutUint64(data[:], section) c.indexDb.Delete(append([]byte("shead"), data[:]...)) } diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index 827976d51c..780e46e433 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -14,11 +14,10 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package core implements the Ethereum consensus protocol. package core import ( - "encoding/binary" + "fmt" "math/big" "math/rand" "testing" @@ -28,208 +27,208 @@ import ( "github.com/ethereum/go-ethereum/ethdb" ) +// Runs multiple tests with randomized parameters. func TestChainIndexerSingle(t *testing.T) { - // run multiple tests with randomized parameters for i := 0; i < 10; i++ { testChainIndexer(t, 1) } } +// Runs multiple tests with randomized parameters and different number of +// chain backends. func TestChainIndexerWithChildren(t *testing.T) { - // run multiple tests with randomized parameters and different number of - // chained indexers for i := 2; i < 8; i++ { testChainIndexer(t, i) } } -// testChainIndexer runs a test with either a single ChainIndexer or a chain of multiple indexers -// sectionSize and confirmReq parameters are randomized -func testChainIndexer(t *testing.T, tciCount int) { +// testChainIndexer runs a test with either a single chain indexer or a chain of +// multiple backends. The section size and required confirmation count parameters +// are randomized. +func testChainIndexer(t *testing.T, count int) { db, _ := ethdb.NewMemDatabase() - stop := make(chan struct{}) - tciList := make([]*testChainIndex, tciCount) - var lastIndexer *ChainIndexer - for i, _ := range tciList { - tci := &testChainIndex{t: t, sectionSize: uint64(rand.Intn(100) + 1), confirmReq: uint64(rand.Intn(10)), processCh: make(chan uint64)} - tciList[i] = tci - tci.indexer = NewChainIndexer(db, ethdb.NewTable(db, string([]byte{byte(i)})), tci, tci.sectionSize, tci.confirmReq, 0, stop) - if cs := tci.indexer.CanonicalSections(); cs != 0 { - t.Errorf("Expected 0 canonical sections, got %d", cs) - } - if lastIndexer != nil { - lastIndexer.AddChildIndexer(tci.indexer) - } - lastIndexer = tci.indexer - } + defer db.Close() - // expectCs expects a certain number of available canonical sections - expectCs := func(indexer *ChainIndexer, expCs uint64) { - cnt := 0 - for { - cs := indexer.CanonicalSections() - if cs == expCs { - return - } - // keep trying for 10 seconds if it does not match - cnt++ - if cnt == 10000 { - t.Fatalf("Expected %d canonical sections, got %d", expCs, cs) - } - time.Sleep(time.Millisecond) + // Create a chain of indexers and ensure they all report empty + backends := make([]*testChainIndexBackend, count) + for i := 0; i < count; i++ { + var ( + sectionSize = uint64(rand.Intn(100) + 1) + confirmsReq = uint64(rand.Intn(10)) + ) + backends[i] = &testChainIndexBackend{t: t, processCh: make(chan uint64)} + backends[i].indexer = NewChainIndexer(db, ethdb.NewTable(db, string([]byte{byte(i)})), backends[i], sectionSize, confirmsReq, 0, fmt.Sprintf("indexer-%d", i)) + defer backends[i].indexer.Close() + + if sections, _, _ := backends[i].indexer.Sections(); sections != 0 { + t.Fatalf("Canonical section count mismatch: have %v, want %v", sections, 0) + } + if i > 0 { + backends[i-1].indexer.AddChildIndexer(backends[i].indexer) } } - - // notify the indexer about a new head or rollback, then expect processed blocks if a section is processable - notify := func(headNum, expFailAfter uint64, rollback bool) { - tciList[0].indexer.newHead(headNum, rollback) - if rollback { - for _, tci := range tciList { - headNum = tci.rollback(headNum) - expectCs(tci.indexer, tci.stored) + // notify pings the root indexer about a new head or reorg, then expect + // processed blocks if a section is processable + notify := func(headNum, failNum uint64, reorg bool) { + backends[0].indexer.newHead(headNum, reorg) + if reorg { + for _, backend := range backends { + headNum = backend.reorg(headNum) + backend.assertSections() } - } else { - for _, tci := range tciList { - var more bool - headNum, more = tci.newBlocks(headNum, expFailAfter) - if !more { - break - } - expectCs(tci.indexer, tci.stored) + return + } + var cascade bool + for _, backend := range backends { + headNum, cascade = backend.assertBlocks(headNum, failNum) + if !cascade { + break } + backend.assertSections() } } - + // inject inserts a new random canonical header into the database directly + inject := func(number uint64) { + header := &types.Header{Number: big.NewInt(int64(number)), Extra: big.NewInt(rand.Int63()).Bytes()} + if number > 0 { + header.ParentHash = GetCanonicalHash(db, number-1) + } + WriteHeader(db, header) + WriteCanonicalHash(db, header.Hash(), number) + } + // Start indexer with an already existing chain for i := uint64(0); i <= 100; i++ { - testCanonicalHeader(db, i) + inject(i) } - // start indexer with an already existing chain notify(100, 100, false) - // add new blocks one by one - for i := uint64(101); i <= 1000; i++ { - testCanonicalHeader(db, i) - notify(i, i, false) - } - // do a rollback - notify(500, 500, true) - // create new fork - for i := uint64(501); i <= 1000; i++ { - testCanonicalHeader(db, i) - notify(i, i, false) - } - for i := uint64(1001); i <= 1500; i++ { - testCanonicalHeader(db, i) + // Add new blocks one by one + for i := uint64(101); i <= 1000; i++ { + inject(i) + notify(i, i, false) } - // create a failed processing scenario where less blocks are available at processing time than notified + // Do a reorg + notify(500, 500, true) + + // Create new fork + for i := uint64(501); i <= 1000; i++ { + inject(i) + notify(i, i, false) + } + for i := uint64(1001); i <= 1500; i++ { + inject(i) + } + // Failed processing scenario where less blocks are available than notified notify(2000, 1500, false) - // notify about a rollback (which could have caused the missing blocks if happened during processing) + + // Notify about a reorg (which could have caused the missing blocks if happened during processing) notify(1500, 1500, true) - // create new fork + // Create new fork for i := uint64(1501); i <= 2000; i++ { - testCanonicalHeader(db, i) + inject(i) notify(i, i, false) } - close(stop) - db.Close() } -func testCanonicalHeader(db ethdb.Database, idx uint64) { - var rnd [8]byte - binary.BigEndian.PutUint64(rnd[:], uint64(rand.Int63())) - header := &types.Header{Number: big.NewInt(int64(idx)), Extra: rnd[:]} - if idx > 0 { - header.ParentHash = GetCanonicalHash(db, idx-1) - } - WriteHeader(db, header) - WriteCanonicalHash(db, header.Hash(), idx) -} - -// testChainIndex implements ChainIndexerBackend -type testChainIndex struct { +// testChainIndexBackend implements ChainIndexerBackend +type testChainIndexBackend struct { t *testing.T - sectionSize, confirmReq uint64 - section, headerCnt, stored uint64 indexer *ChainIndexer + section, headerCnt, stored uint64 processCh chan uint64 } -// newBlocks expects process calls after new blocks have arrived. If expFailAfter < headNum then -// we are simulating a scenario where a rollback has happened after the processing has started and -// the processing of a section fails. -func (t *testChainIndex) newBlocks(headNum, expFailAfter uint64) (uint64, bool) { - var newCount uint64 - if headNum >= t.confirmReq { - newCount = (headNum + 1 - t.confirmReq) / t.sectionSize - if newCount > t.stored { +// assertSections verifies if a chain indexer has the correct number of section. +func (b *testChainIndexBackend) assertSections() { + // Keep trying for 3 seconds if it does not match + var sections uint64 + for i := 0; i < 300; i++ { + sections, _, _ = b.indexer.Sections() + if sections == b.stored { + return + } + time.Sleep(10 * time.Millisecond) + } + b.t.Fatalf("Canonical section count mismatch: have %v, want %v", sections, b.stored) +} + +// assertBlocks expects processing calls after new blocks have arrived. If the +// failNum < headNum then we are simulating a scenario where a reorg has happened +// after the processing has started and the processing of a section fails. +func (b *testChainIndexBackend) assertBlocks(headNum, failNum uint64) (uint64, bool) { + var sections uint64 + if headNum >= b.indexer.confirmsReq { + sections = (headNum + 1 - b.indexer.confirmsReq) / b.indexer.sectionSize + if sections > b.stored { // expect processed blocks - for exp := t.stored * t.sectionSize; exp < newCount*t.sectionSize; exp++ { - if exp > expFailAfter { + for expectd := b.stored * b.indexer.sectionSize; expectd < sections*b.indexer.sectionSize; expectd++ { + if expectd > failNum { // rolled back after processing started, no more process calls expected // wait until updating is done to make sure that processing actually fails - for { - t.indexer.lock.Lock() - u := t.indexer.updating - t.indexer.lock.Unlock() - if !u { + var updating bool + for i := 0; i < 300; i++ { + b.indexer.lock.Lock() + updating = b.indexer.knownSections > b.indexer.storedSections + b.indexer.lock.Unlock() + if !updating { break } - time.Sleep(time.Millisecond) + time.Sleep(10 * time.Millisecond) } - - newCount = exp / t.sectionSize + if updating { + b.t.Fatalf("update did not finish") + } + sections = expectd / b.indexer.sectionSize break } select { case <-time.After(10 * time.Second): - t.t.Fatalf("Expected processed block #%d, got nothing", exp) - case proc := <-t.processCh: - if proc != exp { - t.t.Errorf("Expected processed block #%d, got #%d", exp, proc) + b.t.Fatalf("Expected processed block #%d, got nothing", expectd) + case processed := <-b.processCh: + if processed != expectd { + b.t.Errorf("Expected processed block #%d, got #%d", expectd, processed) } } } - t.stored = newCount + b.stored = sections } } - if t.stored == 0 { + if b.stored == 0 { return 0, false } - return t.stored*t.sectionSize - 1, true + return b.stored*b.indexer.sectionSize - 1, true } -func (t *testChainIndex) rollback(headNum uint64) uint64 { - firstChanged := headNum / t.sectionSize - if firstChanged < t.stored { - t.stored = firstChanged +func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { + firstChanged := headNum / b.indexer.sectionSize + if firstChanged < b.stored { + b.stored = firstChanged } - return t.stored * t.sectionSize + return b.stored * b.indexer.sectionSize } -func (t *testChainIndex) Reset(section uint64) { - t.section = section - t.headerCnt = 0 +func (b *testChainIndexBackend) Reset(section uint64) { + b.section = section + b.headerCnt = 0 } -func (t *testChainIndex) Process(header *types.Header) { - t.headerCnt++ - if t.headerCnt > t.sectionSize { - t.t.Error("Processing too many headers") +func (b *testChainIndexBackend) Process(header *types.Header) { + b.headerCnt++ + if b.headerCnt > b.indexer.sectionSize { + b.t.Error("Processing too many headers") } //t.processCh <- header.Number.Uint64() select { case <-time.After(10 * time.Second): - t.t.Fatal("Unexpected call to Process") - case t.processCh <- header.Number.Uint64(): + b.t.Fatal("Unexpected call to Process") + case b.processCh <- header.Number.Uint64(): } } -func (t *testChainIndex) Commit(db ethdb.Database) error { - if t.headerCnt != t.sectionSize { - t.t.Error("Not enough headers processed") +func (b *testChainIndexBackend) Commit(db ethdb.Database) error { + if b.headerCnt != b.indexer.sectionSize { + b.t.Error("Not enough headers processed") } return nil } - -func (t *testChainIndex) UpdateMsg(done, all uint64) {} From f42bd73ce5e9c4d87b0bbcfbd900641305ebe894 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 7 Aug 2017 18:14:40 +0300 Subject: [PATCH 059/272] internal: fix megacheck warnings (#14919) --- internal/ethapi/api.go | 29 +++-------------------------- internal/jsre/pretty.go | 8 -------- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 1b23ac5593..7874b7101f 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -46,7 +46,6 @@ import ( const ( defaultGas = 90000 defaultGasPrice = 50 * params.Shannon - emptyHex = "0x" ) // PublicEthereumAPI provides an API to access Ethereum related information. @@ -548,26 +547,6 @@ func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.A return res[:], state.Error() } -// callmsg is the message type used for call transitions. -type callmsg struct { - addr common.Address - to *common.Address - gas, gasPrice *big.Int - value *big.Int - data []byte -} - -// accessor boilerplate to implement core.Message -func (m callmsg) From() (common.Address, error) { return m.addr, nil } -func (m callmsg) FromFrontier() (common.Address, error) { return m.addr, nil } -func (m callmsg) Nonce() uint64 { return 0 } -func (m callmsg) CheckNonce() bool { return false } -func (m callmsg) To() *common.Address { return m.to } -func (m callmsg) GasPrice() *big.Int { return m.gasPrice } -func (m callmsg) Gas() *big.Int { return m.gas } -func (m callmsg) Value() *big.Int { return m.value } -func (m callmsg) Data() []byte { return m.data } - // CallArgs represents the arguments for a call. type CallArgs struct { From common.Address `json:"from"` @@ -626,10 +605,8 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr // Wait for the context to be done and cancel the evm. Even if the // EVM has finished, cancelling may be done (repeatedly) go func() { - select { - case <-ctx.Done(): - evm.Cancel() - } + <-ctx.Done() + evm.Cancel() }() // Setup the gas pool (also for unmetered requests) @@ -1306,7 +1283,7 @@ func (api *PublicDebugAPI) PrintBlock(ctx context.Context, number uint64) (strin if block == nil { return "", fmt.Errorf("block #%d not found", number) } - return fmt.Sprintf("%s", block), nil + return block.String(), nil } // SeedHash retrieves the seed hash of a block. diff --git a/internal/jsre/pretty.go b/internal/jsre/pretty.go index e096eec236..16fa91b67d 100644 --- a/internal/jsre/pretty.go +++ b/internal/jsre/pretty.go @@ -65,14 +65,6 @@ func prettyError(vm *otto.Otto, err error, w io.Writer) { fmt.Fprint(w, ErrorColor("%s", failure)) } -// jsErrorString adds a backtrace to errors generated by otto. -func jsErrorString(err error) string { - if ottoErr, ok := err.(*otto.Error); ok { - return ottoErr.String() - } - return err.Error() -} - func (re *JSRE) prettyPrintJS(call otto.FunctionCall) otto.Value { for _, v := range call.ArgumentList { prettyPrint(call.Otto, v, re.output) From 971079822ee6c12d9348ec78f212fe91c9b83edf Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 7 Aug 2017 18:25:18 +0300 Subject: [PATCH 060/272] light: fix megacheck warnings (#14920) --- light/lightchain.go | 1 - light/lightchain_test.go | 13 +------------ light/txpool.go | 6 ------ 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/light/lightchain.go b/light/lightchain.go index 8bbf529cce..a51043975f 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -52,7 +52,6 @@ type LightChain struct { mu sync.RWMutex chainmu sync.RWMutex - procmu sync.RWMutex bodyCache *lru.Cache // Cache for the most recent block bodies bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format diff --git a/light/lightchain_test.go b/light/lightchain_test.go index 21b6210462..0ad6405256 100644 --- a/light/lightchain_test.go +++ b/light/lightchain_test.go @@ -18,7 +18,6 @@ package light import ( "context" - "fmt" "math/big" "testing" @@ -98,10 +97,7 @@ func testFork(t *testing.T, LightChain *LightChain, i, n int, comparator func(td t.Errorf("chain content mismatch at %d: have hash %v, want hash %v", i, hash2, hash1) } // Extend the newly created chain - var ( - headerChainB []*types.Header - ) - headerChainB = makeHeaderChain(LightChain2.CurrentHeader(), n, db, forkSeed) + headerChainB := makeHeaderChain(LightChain2.CurrentHeader(), n, db, forkSeed) if _, err := LightChain2.InsertHeaderChain(headerChainB, 1); err != nil { t.Fatalf("failed to insert forking chain: %v", err) } @@ -117,13 +113,6 @@ func testFork(t *testing.T, LightChain *LightChain, i, n int, comparator func(td comparator(tdPre, tdPost) } -func printChain(bc *LightChain) { - for i := bc.CurrentHeader().Number.Uint64(); i > 0; i-- { - b := bc.GetHeaderByNumber(uint64(i)) - fmt.Printf("\t%x %v\n", b.Hash(), b.Difficulty) - } -} - // testHeaderChainImport tries to process a chain of header, writing them into // the database if successful. func testHeaderChainImport(chain []*types.Header, lightchain *LightChain) error { diff --git a/light/txpool.go b/light/txpool.go index 1d52aa622b..7cbb991e85 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -124,12 +124,6 @@ func (pool *TxPool) GetNonce(ctx context.Context, addr common.Address) (uint64, return nonce, nil } -type txBlockData struct { - BlockHash common.Hash - BlockIndex uint64 - Index uint64 -} - // txStateChanges stores the recent changes between pending/mined states of // transactions. True means mined, false means rolled back, no entry means no change type txStateChanges map[common.Hash]bool From 8f06b7980dd2b6023ee7657d28da5567cdda4fcc Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 6 Aug 2017 08:54:25 +0300 Subject: [PATCH 061/272] eth: fix megacheck warnings --- eth/api.go | 20 -------------------- eth/downloader/downloader_test.go | 19 +++++++++---------- eth/filters/api.go | 1 - eth/filters/filter.go | 3 --- eth/filters/filter_system.go | 1 - eth/filters/filter_system_test.go | 7 ++++--- eth/sync.go | 6 ++++-- 7 files changed, 17 insertions(+), 40 deletions(-) diff --git a/eth/api.go b/eth/api.go index 0d90759b6c..f5214fc379 100644 --- a/eth/api.go +++ b/eth/api.go @@ -465,26 +465,6 @@ func (api *PrivateDebugAPI) traceBlock(block *types.Block, logConfig *vm.LogConf return true, structLogger.StructLogs(), nil } -// callmsg is the message type used for call transitions. -type callmsg struct { - addr common.Address - to *common.Address - gas, gasPrice *big.Int - value *big.Int - data []byte -} - -// accessor boilerplate to implement core.Message -func (m callmsg) From() (common.Address, error) { return m.addr, nil } -func (m callmsg) FromFrontier() (common.Address, error) { return m.addr, nil } -func (m callmsg) Nonce() uint64 { return 0 } -func (m callmsg) CheckNonce() bool { return false } -func (m callmsg) To() *common.Address { return m.to } -func (m callmsg) GasPrice() *big.Int { return m.gasPrice } -func (m callmsg) Gas() *big.Int { return m.gas } -func (m callmsg) Value() *big.Int { return m.value } -func (m callmsg) Data() []byte { return m.data } - // formatError formats a Go error into either an empty string or the data content // of the error itself. func formatError(err error) string { diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index b354682a14..36e8c800f6 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -403,8 +403,7 @@ func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Ha dl.lock.Lock() defer dl.lock.Unlock() - var err error - err = dl.downloader.RegisterPeer(id, version, &downloadTesterPeer{dl, id, delay}) + var err = dl.downloader.RegisterPeer(id, version, &downloadTesterPeer{dl, id, delay}) if err == nil { // Assign the owned hashes, headers and blocks to the peer (deep copy) dl.peerHashes[id] = make([]common.Hash, len(hashes)) @@ -1381,7 +1380,7 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("peer-half", nil, mode); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) } }() <-starting @@ -1398,7 +1397,7 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("peer-full", nil, mode); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) } }() <-starting @@ -1454,7 +1453,7 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("fork A", nil, mode); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) } }() <-starting @@ -1474,7 +1473,7 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("fork B", nil, mode); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) } }() <-starting @@ -1535,7 +1534,7 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("faulty", nil, mode); err == nil { - t.Fatalf("succeeded faulty synchronisation") + panic("succeeded faulty synchronisation") } }() <-starting @@ -1552,7 +1551,7 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("valid", nil, mode); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) } }() <-starting @@ -1613,7 +1612,7 @@ func testFakedSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("attack", nil, mode); err == nil { - t.Fatalf("succeeded attacker synchronisation") + panic("succeeded attacker synchronisation") } }() <-starting @@ -1630,7 +1629,7 @@ func testFakedSyncProgress(t *testing.T, protocol int, mode SyncMode) { go func() { defer pending.Done() if err := tester.sync("valid", nil, mode); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) } }() <-starting diff --git a/eth/filters/api.go b/eth/filters/api.go index 61647a5d07..fff58a268e 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -54,7 +54,6 @@ type PublicFilterAPI struct { backend Backend useMipMap bool mux *event.TypeMux - quit chan struct{} chainDb ethdb.Database events *EventSystem filtersMu sync.Mutex diff --git a/eth/filters/filter.go b/eth/filters/filter.go index 0a0b81224e..f27b76929e 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -20,7 +20,6 @@ import ( "context" "math" "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -42,8 +41,6 @@ type Filter struct { backend Backend useMipMap bool - created time.Time - db ethdb.Database begin, end int64 addresses []common.Address diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go index 7abace1e6b..ab0b7473ea 100644 --- a/eth/filters/filter_system.go +++ b/eth/filters/filter_system.go @@ -74,7 +74,6 @@ type subscription struct { // subscription which match the subscription criteria. type EventSystem struct { mux *event.TypeMux - sub *event.TypeMuxSubscription backend Backend lightMode bool lastHead *types.Header diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index 822580b56c..23e6d66e18 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -18,6 +18,7 @@ package filters import ( "context" + "fmt" "math/big" "reflect" "testing" @@ -439,15 +440,15 @@ func TestPendingLogsSubscription(t *testing.T) { } if len(fetched) != len(tt.expected) { - t.Fatalf("invalid number of logs for case %d, want %d log(s), got %d", i, len(tt.expected), len(fetched)) + panic(fmt.Sprintf("invalid number of logs for case %d, want %d log(s), got %d", i, len(tt.expected), len(fetched))) } for l := range fetched { if fetched[l].Removed { - t.Errorf("expected log not to be removed for log %d in case %d", l, i) + panic(fmt.Sprintf("expected log not to be removed for log %d in case %d", l, i)) } if !reflect.DeepEqual(fetched[l], tt.expected[l]) { - t.Errorf("invalid log on index %d for case %d", l, i) + panic(fmt.Sprintf("invalid log on index %d for case %d", l, i)) } } }() diff --git a/eth/sync.go b/eth/sync.go index 8784b225de..7442f912c7 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -138,7 +138,9 @@ func (pm *ProtocolManager) syncer() { defer pm.downloader.Terminate() // Wait for different events to fire synchronisation operations - forceSync := time.Tick(forceSyncCycle) + forceSync := time.NewTicker(forceSyncCycle) + defer forceSync.Stop() + for { select { case <-pm.newPeerCh: @@ -148,7 +150,7 @@ func (pm *ProtocolManager) syncer() { } go pm.synchronise(pm.peers.BestPeer()) - case <-forceSync: + case <-forceSync.C: // Force a sync even if not enough peers are present go pm.synchronise(pm.peers.BestPeer()) From e063d538b80d2edfc3c2b374aaee4e38e2145170 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 8 Aug 2017 12:08:37 +0300 Subject: [PATCH 062/272] rpc: fix megacheck warnings --- rpc/server.go | 29 ++++++----------------------- rpc/subscription.go | 1 - rpc/subscription_test.go | 16 +++++++++++----- rpc/types.go | 13 ++++--------- rpc/utils.go | 27 +++------------------------ 5 files changed, 24 insertions(+), 62 deletions(-) diff --git a/rpc/server.go b/rpc/server.go index 62b84af34e..30c288349e 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -29,11 +29,7 @@ import ( "gopkg.in/fatih/set.v0" ) -const ( - notificationBufferSize = 10000 // max buffered notifications before codec is closed - - MetadataApi = "rpc" -) +const MetadataApi = "rpc" // CodecOption specifies which type of messages this codec supports type CodecOption int @@ -49,10 +45,9 @@ const ( // NewServer will create a new server instance with no registered handlers. func NewServer() *Server { server := &Server{ - services: make(serviceRegistry), - subscriptions: make(subscriptionRegistry), - codecs: set.New(), - run: 1, + services: make(serviceRegistry), + codecs: set.New(), + run: 1, } // register a default service which will provide meta information about the RPC service such as the services and @@ -124,16 +119,6 @@ func (s *Server) RegisterName(name string, rcvr interface{}) error { return nil } -// hasOption returns true if option is included in options, otherwise false -func hasOption(option CodecOption, options []CodecOption) bool { - for _, o := range options { - if option == o { - return true - } - } - return false -} - // serveRequest will reads requests from the codec, calls the RPC callback and // writes the response to the given codec. // @@ -148,13 +133,11 @@ func (s *Server) serveRequest(codec ServerCodec, singleShot bool, options CodecO const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] - log.Error(fmt.Sprint(string(buf))) + log.Error(string(buf)) } s.codecsMu.Lock() s.codecs.Remove(codec) s.codecsMu.Unlock() - - return }() ctx, cancel := context.WithCancel(context.Background()) @@ -246,7 +229,7 @@ func (s *Server) ServeSingleRequest(codec ServerCodec, options CodecOption) { // close all codecs which will cancel pending requests/subscriptions. func (s *Server) Stop() { if atomic.CompareAndSwapInt32(&s.run, 1, 0) { - log.Debug(fmt.Sprint("RPC Server shutdown initiatied")) + log.Debug("RPC Server shutdown initiatied") s.codecsMu.Lock() defer s.codecsMu.Unlock() s.codecs.Each(func(c interface{}) bool { diff --git a/rpc/subscription.go b/rpc/subscription.go index 720e4dd06b..6ce7befa1d 100644 --- a/rpc/subscription.go +++ b/rpc/subscription.go @@ -53,7 +53,6 @@ type notifierKey struct{} type Notifier struct { codec ServerCodec subMu sync.RWMutex // guards active and inactive maps - stopped bool active map[ID]*Subscription inactive map[ID]*Subscription } diff --git a/rpc/subscription_test.go b/rpc/subscription_test.go index 0ed15ddfe8..39f7596923 100644 --- a/rpc/subscription_test.go +++ b/rpc/subscription_test.go @@ -165,7 +165,7 @@ func TestNotifications(t *testing.T) { } func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSuccessResponse, - failures chan<- jsonErrResponse, notifications chan<- jsonNotification) { + failures chan<- jsonErrResponse, notifications chan<- jsonNotification, errors chan<- error) { // read and parse server messages for { @@ -177,12 +177,14 @@ func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSucces var responses []map[string]interface{} if rmsg[0] == '[' { if err := json.Unmarshal(rmsg, &responses); err != nil { - t.Fatalf("Received invalid message: %s", rmsg) + errors <- fmt.Errorf("Received invalid message: %s", rmsg) + return } } else { var msg map[string]interface{} if err := json.Unmarshal(rmsg, &msg); err != nil { - t.Fatalf("Received invalid message: %s", rmsg) + errors <- fmt.Errorf("Received invalid message: %s", rmsg) + return } responses = append(responses, msg) } @@ -216,7 +218,7 @@ func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSucces } continue } - t.Fatalf("Received invalid message: %s", msg) + errors <- fmt.Errorf("Received invalid message: %s", msg) } } } @@ -235,6 +237,8 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { successes = make(chan jsonSuccessResponse) failures = make(chan jsonErrResponse) notifications = make(chan jsonNotification) + + errors = make(chan error, 10) ) // setup and start server @@ -248,7 +252,7 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { defer server.Stop() // wait for message and write them to the given channels - go waitForMessages(t, in, successes, failures, notifications) + go waitForMessages(t, in, successes, failures, notifications, errors) // create subscriptions one by one n := 3 @@ -297,6 +301,8 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { } select { + case err := <-errors: + t.Fatal(err) case suc := <-successes: // subscription created subids[namespaces[int(suc.Id.(float64))]] = suc.Result.(string) case failure := <-failures: diff --git a/rpc/types.go b/rpc/types.go index a7b8c9788c..f2375604ed 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -48,7 +48,6 @@ type callback struct { // service represents a registered object type service struct { name string // name for service - rcvr reflect.Value // receiver of methods for the service typ reflect.Type // receiver type callbacks callbacks // registered handlers subscriptions subscriptions // available subscriptions/notifications @@ -58,23 +57,19 @@ type service struct { type serverRequest struct { id interface{} svcname string - rcvr reflect.Value callb *callback args []reflect.Value isUnsubscribe bool err Error } -type serviceRegistry map[string]*service // collection of services -type callbacks map[string]*callback // collection of RPC callbacks -type subscriptions map[string]*callback // collection of subscription callbacks -type subscriptionRegistry map[string]*callback // collection of subscription callbacks +type serviceRegistry map[string]*service // collection of services +type callbacks map[string]*callback // collection of RPC callbacks +type subscriptions map[string]*callback // collection of subscription callbacks // Server represents a RPC server type Server struct { - services serviceRegistry - muSubcriptions sync.Mutex // protects subscriptions - subscriptions subscriptionRegistry + services serviceRegistry run int32 codecsMu sync.Mutex diff --git a/rpc/utils.go b/rpc/utils.go index 2506c48331..9315cab591 100644 --- a/rpc/utils.go +++ b/rpc/utils.go @@ -119,21 +119,6 @@ func isHexNum(t reflect.Type) bool { return t == bigIntType } -var blockNumberType = reflect.TypeOf((*BlockNumber)(nil)).Elem() - -// Indication if the given block is a BlockNumber -func isBlockNumber(t reflect.Type) bool { - if t == nil { - return false - } - - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - - return t == blockNumberType -} - // suitableCallbacks iterates over the methods of the given type. It will determine if a method satisfies the criteria // for a RPC callback or a subscription callback and adds it to the collection of callbacks or subscriptions. See server // documentation for a summary of these criteria. @@ -210,18 +195,12 @@ METHODS: } switch mtype.NumOut() { - case 0, 1: - break - case 2: - if h.errPos == -1 { // method must one return value and 1 error + case 0, 1, 2: + if mtype.NumOut() == 2 && h.errPos == -1 { // method must one return value and 1 error continue METHODS } - break - default: - continue METHODS + callbacks[mname] = &h } - - callbacks[mname] = &h } return callbacks, subscriptions From 1c45f2f42e6578258e74c790d063b8639ec58bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 8 Aug 2017 11:59:34 +0300 Subject: [PATCH 063/272] core: fix txpool journal and test races --- core/tx_pool.go | 19 +++++++++++++--- core/tx_pool_test.go | 54 ++++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/core/tx_pool.go b/core/tx_pool.go index 16f7742650..b0c251f921 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -207,7 +207,7 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, eventMux *e } pool.locals = newAccountSet(pool.signer) pool.priced = newTxPricedList(&pool.all) - pool.resetState() + pool.reset() // If local transactions and journaling is enabled, load from disk if !config.NoLocals && config.Journal != "" { @@ -261,7 +261,7 @@ func (pool *TxPool) loop() { pool.homestead = true } } - pool.resetState() + pool.reset() pool.mu.Unlock() case RemovedTransactionEvent: @@ -300,15 +300,28 @@ func (pool *TxPool) loop() { // Handle local transaction journal rotation case <-journal.C: if pool.journal != nil { + pool.mu.Lock() if err := pool.journal.rotate(pool.local()); err != nil { log.Warn("Failed to rotate local tx journal", "err", err) } + pool.mu.Unlock() } } } } -func (pool *TxPool) resetState() { +// lockedReset is a wrapper around reset to allow calling it in a thread safe +// manner. This method is only ever used in the tester! +func (pool *TxPool) lockedReset() { + pool.mu.Lock() + defer pool.mu.Unlock() + + pool.reset() +} + +// reset retrieves the current state of the blockchain and ensures the content +// of the transaction pool is valid with regard to the chain state. +func (pool *TxPool) reset() { currentState, err := pool.currentState() if err != nil { log.Error("Failed reset txpool state", "err", err) diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 020d6beddd..fcb330051c 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -153,7 +153,7 @@ func TestStateChangeDuringPoolReset(t *testing.T) { // trigger state change in the background trigger = true - pool.resetState() + pool.lockedReset() pendingTx, err := pool.Pending() if err != nil { @@ -213,7 +213,7 @@ func TestTransactionQueue(t *testing.T) { from, _ := deriveSender(tx) currentState, _ := pool.currentState() currentState.AddBalance(from, big.NewInt(1000)) - pool.resetState() + pool.lockedReset() pool.enqueueTx(tx.Hash(), tx) pool.promoteExecutables(currentState, []common.Address{from}) @@ -243,7 +243,7 @@ func TestTransactionQueue(t *testing.T) { from, _ = deriveSender(tx1) currentState, _ = pool.currentState() currentState.AddBalance(from, big.NewInt(1000)) - pool.resetState() + pool.lockedReset() pool.enqueueTx(tx1.Hash(), tx1) pool.enqueueTx(tx2.Hash(), tx2) @@ -314,7 +314,7 @@ func TestTransactionChainFork(t *testing.T) { pool.currentState = func() (*state.StateDB, error) { return statedb, nil } currentState, _ := pool.currentState() currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.resetState() + pool.lockedReset() } resetState() @@ -342,7 +342,7 @@ func TestTransactionDoubleNonce(t *testing.T) { pool.currentState = func() (*state.StateDB, error) { return statedb, nil } currentState, _ := pool.currentState() currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.resetState() + pool.lockedReset() } resetState() @@ -412,14 +412,14 @@ func TestNonceRecovery(t *testing.T) { currentState, _ := pool.currentState() currentState.SetNonce(addr, n) currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.resetState() + pool.lockedReset() tx := transaction(n, big.NewInt(100000), key) if err := pool.AddRemote(tx); err != nil { t.Error(err) } // simulate some weird re-order of transactions and missing nonce(s) currentState.SetNonce(addr, n-1) - pool.resetState() + pool.lockedReset() if fn := pool.pendingState.GetNonce(addr); fn != n+1 { t.Errorf("expected nonce to be %d, got %d", n+1, fn) } @@ -433,7 +433,7 @@ func TestRemovedTxEvent(t *testing.T) { from, _ := deriveSender(tx) currentState, _ := pool.currentState() currentState.AddBalance(from, big.NewInt(1000000000000)) - pool.resetState() + pool.lockedReset() pool.eventMux.Post(RemovedTransactionEvent{types.Transactions{tx}}) pool.eventMux.Post(ChainHeadEvent{nil}) if pool.pending[from].Len() != 1 { @@ -482,7 +482,7 @@ func TestTransactionDropping(t *testing.T) { if len(pool.all) != 6 { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), 6) } - pool.resetState() + pool.lockedReset() if pool.pending[account].Len() != 3 { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) } @@ -494,7 +494,7 @@ func TestTransactionDropping(t *testing.T) { } // Reduce the balance of the account, and check that invalidated transactions are dropped state.AddBalance(account, big.NewInt(-650)) - pool.resetState() + pool.lockedReset() if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -519,7 +519,7 @@ func TestTransactionDropping(t *testing.T) { } // Reduce the block gas limit, check that invalidated transactions are dropped pool.gasLimit = func() *big.Int { return big.NewInt(100) } - pool.resetState() + pool.lockedReset() if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -573,7 +573,7 @@ func TestTransactionPostponing(t *testing.T) { if len(pool.all) != len(txns) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), len(txns)) } - pool.resetState() + pool.lockedReset() if pool.pending[account].Len() != len(txns) { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), len(txns)) } @@ -585,7 +585,7 @@ func TestTransactionPostponing(t *testing.T) { } // Reduce the balance of the account, and check that transactions are reorganised state.AddBalance(account, big.NewInt(-750)) - pool.resetState() + pool.lockedReset() if _, ok := pool.pending[account].txs.items[txns[0].Nonce()]; !ok { t.Errorf("tx %d: valid and funded transaction missing from pending pool: %v", 0, txns[0]) @@ -626,7 +626,7 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { state, _ := pool.currentState() state.AddBalance(account, big.NewInt(1000000)) - pool.resetState() + pool.lockedReset() // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(1); i <= testTxPoolConfig.AccountQueue+5; i++ { @@ -780,7 +780,7 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { if err := pool.AddRemote(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), remote)); err != nil { t.Fatalf("failed to add remote transaction: %v", err) } - pending, queued := pool.stats() + pending, queued := pool.Stats() if pending != 0 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) } @@ -793,7 +793,7 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { // Wait a bit for eviction to run and clean up any leftovers, and ensure only the local remains time.Sleep(2 * config.Lifetime) - pending, queued = pool.stats() + pending, queued = pool.Stats() if pending != 0 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) } @@ -823,7 +823,7 @@ func TestTransactionPendingLimiting(t *testing.T) { state, _ := pool.currentState() state.AddBalance(account, big.NewInt(1000000)) - pool.resetState() + pool.lockedReset() // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { @@ -1057,7 +1057,7 @@ func TestTransactionPoolRepricing(t *testing.T) { pool.AddRemotes(txs) pool.AddLocal(ltx) - pending, queued := pool.stats() + pending, queued := pool.Stats() if pending != 4 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 4) } @@ -1070,7 +1070,7 @@ func TestTransactionPoolRepricing(t *testing.T) { // Reprice the pool and check that underpriced transactions get dropped pool.SetGasPrice(big.NewInt(2)) - pending, queued = pool.stats() + pending, queued = pool.Stats() if pending != 2 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) } @@ -1095,7 +1095,7 @@ func TestTransactionPoolRepricing(t *testing.T) { if err := pool.AddLocal(tx); err != nil { t.Fatalf("failed to add underpriced local transaction: %v", err) } - if pending, _ = pool.stats(); pending != 3 { + if pending, _ = pool.Stats(); pending != 3 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) } if err := validateTxPoolInternals(pool); err != nil { @@ -1142,7 +1142,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { pool.AddRemotes(txs) pool.AddLocal(ltx) - pending, queued := pool.stats() + pending, queued := pool.Stats() if pending != 3 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) } @@ -1166,7 +1166,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { if err := pool.AddRemote(pricedTransaction(3, big.NewInt(100000), big.NewInt(5), keys[1])); err != nil { t.Fatalf("failed to add well priced transaction: %v", err) } - pending, queued = pool.stats() + pending, queued = pool.Stats() if pending != 2 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) } @@ -1181,7 +1181,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { if err := pool.AddLocal(tx); err != nil { t.Fatalf("failed to add underpriced local transaction: %v", err) } - pending, queued = pool.stats() + pending, queued = pool.Stats() if pending != 2 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) } @@ -1307,7 +1307,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), remote)); err != nil { t.Fatalf("failed to add remote transaction: %v", err) } - pending, queued := pool.stats() + pending, queued := pool.Stats() if pending != 4 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 4) } @@ -1322,7 +1322,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) pool = NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) - pending, queued = pool.stats() + pending, queued = pool.Stats() if queued != 0 { t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) } @@ -1340,13 +1340,13 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { } // Bump the nonce temporarily and ensure the newly invalidated transaction is removed statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 2) - pool.resetState() + pool.lockedReset() time.Sleep(2 * config.Rejournal) pool.Stop() statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) pool = NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) - pending, queued = pool.stats() + pending, queued = pool.Stats() if pending != 0 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) } From 6f8c7b0defd4df773a1c9d630514016d3b914897 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 8 Aug 2017 12:32:10 +0300 Subject: [PATCH 064/272] ethdb: add basic and parallel sanity tests (#14938) * ethdb: add basic sanity test * ethdb: test MemDatabase * ethdb: add parallel tests --- ethdb/database_test.go | 161 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 152 insertions(+), 9 deletions(-) diff --git a/ethdb/database_test.go b/ethdb/database_test.go index 0e69a1218c..4740cdaedd 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -14,21 +14,164 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package ethdb +package ethdb_test import ( + "bytes" + "fmt" + "io/ioutil" "os" - "path/filepath" + "strconv" + "sync" + "testing" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" ) -func newDb() *LDBDatabase { - file := filepath.Join("/", "tmp", "ldbtesttmpfile") - if common.FileExist(file) { - os.RemoveAll(file) +func newTestLDB() (*ethdb.LDBDatabase, func()) { + dirname, err := ioutil.TempDir(os.TempDir(), "ethdb_test_") + if err != nil { + panic("failed to create test file: " + err.Error()) + } + db, err := ethdb.NewLDBDatabase(dirname, 0, 0) + if err != nil { + panic("failed to create test database: " + err.Error()) } - db, _ := NewLDBDatabase(file, 0, 0) - return db + return db, func() { + db.Close() + os.RemoveAll(dirname) + } +} + +var test_values = []string{"", "a", "1251", "\x00123\x00"} + +func TestLDB_PutGet(t *testing.T) { + db, remove := newTestLDB() + defer remove() + testPutGet(db, t) +} + +func TestMemoryDB_PutGet(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + testPutGet(db, t) +} + +func testPutGet(db ethdb.Database, t *testing.T) { + t.Parallel() + + for _, v := range test_values { + err := db.Put([]byte(v), []byte(v)) + if err != nil { + t.Fatalf("put failed: %v", err) + } + } + + for _, v := range test_values { + data, err := db.Get([]byte(v)) + if err != nil { + t.Fatalf("get failed: %v", err) + } + if !bytes.Equal(data, []byte(v)) { + t.Fatalf("get returned wrong result, got %q expected %q", string(data), v) + } + } + + for _, v := range test_values { + err := db.Put([]byte(v), []byte("?")) + if err != nil { + t.Fatalf("put override failed: %v", err) + } + } + + for _, v := range test_values { + data, err := db.Get([]byte(v)) + if err != nil { + t.Fatalf("get failed: %v", err) + } + if !bytes.Equal(data, []byte("?")) { + t.Fatalf("get returned wrong result, got %q expected ?", string(data)) + } + } + + for _, v := range test_values { + err := db.Delete([]byte(v)) + if err != nil { + t.Fatalf("delete %q failed: %v", v, err) + } + } + + for _, v := range test_values { + _, err := db.Get([]byte(v)) + if err == nil { + t.Fatalf("got deleted value %q", v) + } + } +} + +func TestLDB_ParallelPutGet(t *testing.T) { + db, remove := newTestLDB() + defer remove() + testParallelPutGet(db, t) +} + +func TestMemoryDB_ParallelPutGet(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + testParallelPutGet(db, t) +} + +func testParallelPutGet(db ethdb.Database, t *testing.T) { + const n = 8 + var pending sync.WaitGroup + + pending.Add(n) + for i := 0; i < n; i++ { + go func(key string) { + defer pending.Done() + err := db.Put([]byte(key), []byte("v"+key)) + if err != nil { + panic("put failed: " + err.Error()) + } + }(strconv.Itoa(i)) + } + pending.Wait() + + pending.Add(n) + for i := 0; i < n; i++ { + go func(key string) { + defer pending.Done() + data, err := db.Get([]byte(key)) + if err != nil { + panic("get failed: " + err.Error()) + } + if !bytes.Equal(data, []byte("v"+key)) { + panic(fmt.Sprintf("get failed, got %q expected %q", []byte(data), []byte("v"+key))) + } + }(strconv.Itoa(i)) + } + pending.Wait() + + pending.Add(n) + for i := 0; i < n; i++ { + go func(key string) { + defer pending.Done() + err := db.Delete([]byte(key)) + if err != nil { + panic("delete failed: " + err.Error()) + } + }(strconv.Itoa(i)) + } + pending.Wait() + + pending.Add(n) + for i := 0; i < n; i++ { + go func(key string) { + defer pending.Done() + _, err := db.Get([]byte(key)) + if err == nil { + panic("get succeeded") + } + }(strconv.Itoa(i)) + } + pending.Wait() } From 10ce8b0e3c361f7fcbd9440fe78566f49cce9588 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 8 Aug 2017 13:58:22 +0300 Subject: [PATCH 065/272] crypto: fix megacheck warnings (#14917) * crypto: fix megacheck warnings * crypto/ecies: remove ASN.1 support --- crypto/ecies/asn1.go | 584 ------------------------------------- crypto/ecies/ecies.go | 14 +- crypto/ecies/ecies_test.go | 186 +----------- crypto/ecies/params.go | 93 ------ crypto/sha3/sha3.go | 5 +- crypto/sha3/sha3_test.go | 11 +- 6 files changed, 21 insertions(+), 872 deletions(-) delete mode 100644 crypto/ecies/asn1.go diff --git a/crypto/ecies/asn1.go b/crypto/ecies/asn1.go deleted file mode 100644 index d3e77d8490..0000000000 --- a/crypto/ecies/asn1.go +++ /dev/null @@ -1,584 +0,0 @@ -// Copyright (c) 2013 Kyle Isom -// Copyright (c) 2012 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package ecies - -import ( - "bytes" - "crypto" - "crypto/elliptic" - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" - "encoding/asn1" - "encoding/pem" - "fmt" - "hash" - "math/big" - - ethcrypto "github.com/ethereum/go-ethereum/crypto" -) - -var ( - secgScheme = []int{1, 3, 132, 1} - shaScheme = []int{2, 16, 840, 1, 101, 3, 4, 2} - ansiX962Scheme = []int{1, 2, 840, 10045} - x963Scheme = []int{1, 2, 840, 63, 0} -) - -var ErrInvalidPrivateKey = fmt.Errorf("ecies: invalid private key") - -func doScheme(base, v []int) asn1.ObjectIdentifier { - var oidInts asn1.ObjectIdentifier - oidInts = append(oidInts, base...) - return append(oidInts, v...) -} - -// curve OID code taken from crypto/x509, including -// - oidNameCurve* -// - namedCurveFromOID -// - oidFromNamedCurve -// RFC 5480, 2.1.1.1. Named Curve -// -// secp224r1 OBJECT IDENTIFIER ::= { -// iso(1) identified-organization(3) certicom(132) curve(0) 33 } -// -// secp256r1 OBJECT IDENTIFIER ::= { -// iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) -// prime(1) 7 } -// -// secp384r1 OBJECT IDENTIFIER ::= { -// iso(1) identified-organization(3) certicom(132) curve(0) 34 } -// -// secp521r1 OBJECT IDENTIFIER ::= { -// iso(1) identified-organization(3) certicom(132) curve(0) 35 } -// -// NB: secp256r1 is equivalent to prime256v1 -type secgNamedCurve asn1.ObjectIdentifier - -var ( - secgNamedCurveS256 = secgNamedCurve{1, 3, 132, 0, 10} - secgNamedCurveP256 = secgNamedCurve{1, 2, 840, 10045, 3, 1, 7} - secgNamedCurveP384 = secgNamedCurve{1, 3, 132, 0, 34} - secgNamedCurveP521 = secgNamedCurve{1, 3, 132, 0, 35} - rawCurveP256 = []byte{6, 8, 4, 2, 1, 3, 4, 7, 2, 2, 0, 6, 6, 1, 3, 1, 7} - rawCurveP384 = []byte{6, 5, 4, 3, 1, 2, 9, 4, 0, 3, 4} - rawCurveP521 = []byte{6, 5, 4, 3, 1, 2, 9, 4, 0, 3, 5} -) - -func rawCurve(curve elliptic.Curve) []byte { - switch curve { - case elliptic.P256(): - return rawCurveP256 - case elliptic.P384(): - return rawCurveP384 - case elliptic.P521(): - return rawCurveP521 - default: - return nil - } -} - -func (curve secgNamedCurve) Equal(curve2 secgNamedCurve) bool { - if len(curve) != len(curve2) { - return false - } - for i := range curve { - if curve[i] != curve2[i] { - return false - } - } - return true -} - -func namedCurveFromOID(curve secgNamedCurve) elliptic.Curve { - switch { - case curve.Equal(secgNamedCurveS256): - return ethcrypto.S256() - case curve.Equal(secgNamedCurveP256): - return elliptic.P256() - case curve.Equal(secgNamedCurveP384): - return elliptic.P384() - case curve.Equal(secgNamedCurveP521): - return elliptic.P521() - } - return nil -} - -func oidFromNamedCurve(curve elliptic.Curve) (secgNamedCurve, bool) { - switch curve { - case elliptic.P256(): - return secgNamedCurveP256, true - case elliptic.P384(): - return secgNamedCurveP384, true - case elliptic.P521(): - return secgNamedCurveP521, true - case ethcrypto.S256(): - return secgNamedCurveS256, true - } - - return nil, false -} - -// asnAlgorithmIdentifier represents the ASN.1 structure of the same name. See RFC -// 5280, section 4.1.1.2. -type asnAlgorithmIdentifier struct { - Algorithm asn1.ObjectIdentifier - Parameters asn1.RawValue `asn1:"optional"` -} - -func (a asnAlgorithmIdentifier) Cmp(b asnAlgorithmIdentifier) bool { - if len(a.Algorithm) != len(b.Algorithm) { - return false - } - for i := range a.Algorithm { - if a.Algorithm[i] != b.Algorithm[i] { - return false - } - } - return true -} - -type asnHashFunction asnAlgorithmIdentifier - -var ( - oidSHA1 = asn1.ObjectIdentifier{1, 3, 14, 3, 2, 26} - oidSHA224 = doScheme(shaScheme, []int{4}) - oidSHA256 = doScheme(shaScheme, []int{1}) - oidSHA384 = doScheme(shaScheme, []int{2}) - oidSHA512 = doScheme(shaScheme, []int{3}) -) - -func hashFromOID(oid asn1.ObjectIdentifier) func() hash.Hash { - switch { - case oid.Equal(oidSHA1): - return sha1.New - case oid.Equal(oidSHA224): - return sha256.New224 - case oid.Equal(oidSHA256): - return sha256.New - case oid.Equal(oidSHA384): - return sha512.New384 - case oid.Equal(oidSHA512): - return sha512.New - } - return nil -} - -func oidFromHash(hash crypto.Hash) (asn1.ObjectIdentifier, bool) { - switch hash { - case crypto.SHA1: - return oidSHA1, true - case crypto.SHA224: - return oidSHA224, true - case crypto.SHA256: - return oidSHA256, true - case crypto.SHA384: - return oidSHA384, true - case crypto.SHA512: - return oidSHA512, true - default: - return nil, false - } -} - -var ( - asnAlgoSHA1 = asnHashFunction{ - Algorithm: oidSHA1, - } - asnAlgoSHA224 = asnHashFunction{ - Algorithm: oidSHA224, - } - asnAlgoSHA256 = asnHashFunction{ - Algorithm: oidSHA256, - } - asnAlgoSHA384 = asnHashFunction{ - Algorithm: oidSHA384, - } - asnAlgoSHA512 = asnHashFunction{ - Algorithm: oidSHA512, - } -) - -// type ASNasnSubjectPublicKeyInfo struct { -// -// } -// - -type asnSubjectPublicKeyInfo struct { - Algorithm asn1.ObjectIdentifier - PublicKey asn1.BitString - Supplements ecpksSupplements `asn1:"optional"` -} - -type asnECPKAlgorithms struct { - Type asn1.ObjectIdentifier -} - -var idPublicKeyType = doScheme(ansiX962Scheme, []int{2}) -var idEcPublicKey = doScheme(idPublicKeyType, []int{1}) -var idEcPublicKeySupplemented = doScheme(idPublicKeyType, []int{0}) - -func curveToRaw(curve elliptic.Curve) (rv asn1.RawValue, ok bool) { - switch curve { - case elliptic.P256(), elliptic.P384(), elliptic.P521(): - raw := rawCurve(curve) - return asn1.RawValue{ - Tag: 30, - Bytes: raw[2:], - FullBytes: raw, - }, true - default: - return rv, false - } -} - -func asnECPublicKeyType(curve elliptic.Curve) (algo asnAlgorithmIdentifier, ok bool) { - raw, ok := curveToRaw(curve) - if !ok { - return - } else { - return asnAlgorithmIdentifier{Algorithm: idEcPublicKey, - Parameters: raw}, true - } -} - -type asnECPrivKeyVer int - -var asnECPrivKeyVer1 asnECPrivKeyVer = 1 - -type asnPrivateKey struct { - Version asnECPrivKeyVer - Private []byte - Curve secgNamedCurve `asn1:"optional"` - Public asn1.BitString -} - -var asnECDH = doScheme(secgScheme, []int{12}) - -type asnECDHAlgorithm asnAlgorithmIdentifier - -var ( - dhSinglePass_stdDH_sha1kdf = asnECDHAlgorithm{ - Algorithm: doScheme(x963Scheme, []int{2}), - } - dhSinglePass_stdDH_sha256kdf = asnECDHAlgorithm{ - Algorithm: doScheme(secgScheme, []int{11, 1}), - } - dhSinglePass_stdDH_sha384kdf = asnECDHAlgorithm{ - Algorithm: doScheme(secgScheme, []int{11, 2}), - } - dhSinglePass_stdDH_sha224kdf = asnECDHAlgorithm{ - Algorithm: doScheme(secgScheme, []int{11, 0}), - } - dhSinglePass_stdDH_sha512kdf = asnECDHAlgorithm{ - Algorithm: doScheme(secgScheme, []int{11, 3}), - } -) - -func (a asnECDHAlgorithm) Cmp(b asnECDHAlgorithm) bool { - if len(a.Algorithm) != len(b.Algorithm) { - return false - } - for i := range a.Algorithm { - if a.Algorithm[i] != b.Algorithm[i] { - return false - } - } - return true -} - -// asnNISTConcatenation is the only supported KDF at this time. -type asnKeyDerivationFunction asnAlgorithmIdentifier - -var asnNISTConcatenationKDF = asnKeyDerivationFunction{ - Algorithm: doScheme(secgScheme, []int{17, 1}), -} - -func (a asnKeyDerivationFunction) Cmp(b asnKeyDerivationFunction) bool { - if len(a.Algorithm) != len(b.Algorithm) { - return false - } - for i := range a.Algorithm { - if a.Algorithm[i] != b.Algorithm[i] { - return false - } - } - return true -} - -var eciesRecommendedParameters = doScheme(secgScheme, []int{7}) -var eciesSpecifiedParameters = doScheme(secgScheme, []int{8}) - -type asnECIESParameters struct { - KDF asnKeyDerivationFunction `asn1:"optional"` - Sym asnSymmetricEncryption `asn1:"optional"` - MAC asnMessageAuthenticationCode `asn1:"optional"` -} - -type asnSymmetricEncryption asnAlgorithmIdentifier - -var ( - aes128CTRinECIES = asnSymmetricEncryption{ - Algorithm: doScheme(secgScheme, []int{21, 0}), - } - aes192CTRinECIES = asnSymmetricEncryption{ - Algorithm: doScheme(secgScheme, []int{21, 1}), - } - aes256CTRinECIES = asnSymmetricEncryption{ - Algorithm: doScheme(secgScheme, []int{21, 2}), - } -) - -func (a asnSymmetricEncryption) Cmp(b asnSymmetricEncryption) bool { - if len(a.Algorithm) != len(b.Algorithm) { - return false - } - for i := range a.Algorithm { - if a.Algorithm[i] != b.Algorithm[i] { - return false - } - } - return true -} - -type asnMessageAuthenticationCode asnAlgorithmIdentifier - -var ( - hmacFull = asnMessageAuthenticationCode{ - Algorithm: doScheme(secgScheme, []int{22}), - } -) - -func (a asnMessageAuthenticationCode) Cmp(b asnMessageAuthenticationCode) bool { - if len(a.Algorithm) != len(b.Algorithm) { - return false - } - for i := range a.Algorithm { - if a.Algorithm[i] != b.Algorithm[i] { - return false - } - } - return true -} - -type ecpksSupplements struct { - ECDomain secgNamedCurve - ECCAlgorithms eccAlgorithmSet -} - -type eccAlgorithmSet struct { - ECDH asnECDHAlgorithm `asn1:"optional"` - ECIES asnECIESParameters `asn1:"optional"` -} - -func marshalSubjectPublicKeyInfo(pub *PublicKey) (subj asnSubjectPublicKeyInfo, err error) { - subj.Algorithm = idEcPublicKeySupplemented - curve, ok := oidFromNamedCurve(pub.Curve) - if !ok { - err = ErrInvalidPublicKey - return - } - subj.Supplements.ECDomain = curve - if pub.Params != nil { - subj.Supplements.ECCAlgorithms.ECDH = paramsToASNECDH(pub.Params) - subj.Supplements.ECCAlgorithms.ECIES = paramsToASNECIES(pub.Params) - } - pubkey := elliptic.Marshal(pub.Curve, pub.X, pub.Y) - subj.PublicKey = asn1.BitString{ - BitLength: len(pubkey) * 8, - Bytes: pubkey, - } - return -} - -// Encode a public key to DER format. -func MarshalPublic(pub *PublicKey) ([]byte, error) { - subj, err := marshalSubjectPublicKeyInfo(pub) - if err != nil { - return nil, err - } - return asn1.Marshal(subj) -} - -// Decode a DER-encoded public key. -func UnmarshalPublic(in []byte) (pub *PublicKey, err error) { - var subj asnSubjectPublicKeyInfo - - if _, err = asn1.Unmarshal(in, &subj); err != nil { - return - } - if !subj.Algorithm.Equal(idEcPublicKeySupplemented) { - err = ErrInvalidPublicKey - return - } - pub = new(PublicKey) - pub.Curve = namedCurveFromOID(subj.Supplements.ECDomain) - x, y := elliptic.Unmarshal(pub.Curve, subj.PublicKey.Bytes) - if x == nil { - err = ErrInvalidPublicKey - return - } - pub.X = x - pub.Y = y - pub.Params = new(ECIESParams) - asnECIEStoParams(subj.Supplements.ECCAlgorithms.ECIES, pub.Params) - asnECDHtoParams(subj.Supplements.ECCAlgorithms.ECDH, pub.Params) - if pub.Params == nil { - if pub.Params = ParamsFromCurve(pub.Curve); pub.Params == nil { - err = ErrInvalidPublicKey - } - } - return -} - -func marshalPrivateKey(prv *PrivateKey) (ecprv asnPrivateKey, err error) { - ecprv.Version = asnECPrivKeyVer1 - ecprv.Private = prv.D.Bytes() - - var ok bool - ecprv.Curve, ok = oidFromNamedCurve(prv.PublicKey.Curve) - if !ok { - err = ErrInvalidPrivateKey - return - } - - var pub []byte - if pub, err = MarshalPublic(&prv.PublicKey); err != nil { - return - } else { - ecprv.Public = asn1.BitString{ - BitLength: len(pub) * 8, - Bytes: pub, - } - } - return -} - -// Encode a private key to DER format. -func MarshalPrivate(prv *PrivateKey) ([]byte, error) { - ecprv, err := marshalPrivateKey(prv) - if err != nil { - return nil, err - } - return asn1.Marshal(ecprv) -} - -// Decode a private key from a DER-encoded format. -func UnmarshalPrivate(in []byte) (prv *PrivateKey, err error) { - var ecprv asnPrivateKey - - if _, err = asn1.Unmarshal(in, &ecprv); err != nil { - return - } else if ecprv.Version != asnECPrivKeyVer1 { - err = ErrInvalidPrivateKey - return - } - - privateCurve := namedCurveFromOID(ecprv.Curve) - if privateCurve == nil { - err = ErrInvalidPrivateKey - return - } - - prv = new(PrivateKey) - prv.D = new(big.Int).SetBytes(ecprv.Private) - - if pub, err := UnmarshalPublic(ecprv.Public.Bytes); err != nil { - return nil, err - } else { - prv.PublicKey = *pub - } - - return -} - -// Export a public key to PEM format. -func ExportPublicPEM(pub *PublicKey) (out []byte, err error) { - der, err := MarshalPublic(pub) - if err != nil { - return - } - - var block pem.Block - block.Type = "ELLIPTIC CURVE PUBLIC KEY" - block.Bytes = der - - buf := new(bytes.Buffer) - err = pem.Encode(buf, &block) - if err != nil { - return - } else { - out = buf.Bytes() - } - return -} - -// Export a private key to PEM format. -func ExportPrivatePEM(prv *PrivateKey) (out []byte, err error) { - der, err := MarshalPrivate(prv) - if err != nil { - return - } - - var block pem.Block - block.Type = "ELLIPTIC CURVE PRIVATE KEY" - block.Bytes = der - - buf := new(bytes.Buffer) - err = pem.Encode(buf, &block) - if err != nil { - return - } else { - out = buf.Bytes() - } - return -} - -// Import a PEM-encoded public key. -func ImportPublicPEM(in []byte) (pub *PublicKey, err error) { - p, _ := pem.Decode(in) - if p == nil || p.Type != "ELLIPTIC CURVE PUBLIC KEY" { - return nil, ErrInvalidPublicKey - } - - pub, err = UnmarshalPublic(p.Bytes) - return -} - -// Import a PEM-encoded private key. -func ImportPrivatePEM(in []byte) (prv *PrivateKey, err error) { - p, _ := pem.Decode(in) - if p == nil || p.Type != "ELLIPTIC CURVE PRIVATE KEY" { - return nil, ErrInvalidPrivateKey - } - - prv, err = UnmarshalPrivate(p.Bytes) - return -} diff --git a/crypto/ecies/ecies.go b/crypto/ecies/ecies.go index 2a16f20a2e..1d5f96ed27 100644 --- a/crypto/ecies/ecies.go +++ b/crypto/ecies/ecies.go @@ -151,14 +151,16 @@ var ( func incCounter(ctr []byte) { if ctr[3]++; ctr[3] != 0 { return - } else if ctr[2]++; ctr[2] != 0 { - return - } else if ctr[1]++; ctr[1] != 0 { - return - } else if ctr[0]++; ctr[0] != 0 { + } + if ctr[2]++; ctr[2] != 0 { + return + } + if ctr[1]++; ctr[1] != 0 { + return + } + if ctr[0]++; ctr[0] != 0 { return } - return } // NIST SP 800-56 Concatenation Key Derivation Function (see section 5.8.1). diff --git a/crypto/ecies/ecies_test.go b/crypto/ecies/ecies_test.go index 7c454aa730..9cd5c79f7e 100644 --- a/crypto/ecies/ecies_test.go +++ b/crypto/ecies/ecies_test.go @@ -37,7 +37,6 @@ import ( "encoding/hex" "flag" "fmt" - "io/ioutil" "math/big" "testing" @@ -63,8 +62,7 @@ func TestKDF(t *testing.T) { t.FailNow() } if len(k) != 64 { - fmt.Printf("KDF: generated key is the wrong size (%d instead of 64\n", - len(k)) + fmt.Printf("KDF: generated key is the wrong size (%d instead of 64\n", len(k)) t.FailNow() } } @@ -74,14 +72,9 @@ var ErrBadSharedKeys = fmt.Errorf("ecies: shared keys don't match") // cmpParams compares a set of ECIES parameters. We assume, as per the // docs, that AES is the only supported symmetric encryption algorithm. func cmpParams(p1, p2 *ECIESParams) bool { - if p1.hashAlgo != p2.hashAlgo { - return false - } else if p1.KeyLen != p2.KeyLen { - return false - } else if p1.BlockSize != p2.BlockSize { - return false - } - return true + return p1.hashAlgo == p2.hashAlgo && + p1.KeyLen == p2.KeyLen && + p1.BlockSize == p2.BlockSize } // cmpPublic returns true if the two public keys represent the same pojnt. @@ -212,118 +205,6 @@ func TestTooBigSharedKey(t *testing.T) { } } -// Ensure a public key can be successfully marshalled and unmarshalled, and -// that the decoded key is the same as the original. -func TestMarshalPublic(t *testing.T) { - prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - t.Fatalf("GenerateKey error: %s", err) - } - - out, err := MarshalPublic(&prv.PublicKey) - if err != nil { - t.Fatalf("MarshalPublic error: %s", err) - } - - pub, err := UnmarshalPublic(out) - if err != nil { - t.Fatalf("UnmarshalPublic error: %s", err) - } - - if !cmpPublic(prv.PublicKey, *pub) { - t.Fatal("ecies: failed to unmarshal public key") - } -} - -// Ensure that a private key can be encoded into DER format, and that -// the resulting key is properly parsed back into a public key. -func TestMarshalPrivate(t *testing.T) { - prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - out, err := MarshalPrivate(prv) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - if dumpEnc { - ioutil.WriteFile("test.out", out, 0644) - } - - prv2, err := UnmarshalPrivate(out) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - if !cmpPrivate(prv, prv2) { - fmt.Println("ecdh: private key import failed") - t.FailNow() - } -} - -// Ensure that a private key can be successfully encoded to PEM format, and -// the resulting key is properly parsed back in. -func TestPrivatePEM(t *testing.T) { - prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - out, err := ExportPrivatePEM(prv) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - if dumpEnc { - ioutil.WriteFile("test.key", out, 0644) - } - - prv2, err := ImportPrivatePEM(out) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } else if !cmpPrivate(prv, prv2) { - fmt.Println("ecdh: import from PEM failed") - t.FailNow() - } -} - -// Ensure that a public key can be successfully encoded to PEM format, and -// the resulting key is properly parsed back in. -func TestPublicPEM(t *testing.T) { - prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - out, err := ExportPublicPEM(&prv.PublicKey) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - if dumpEnc { - ioutil.WriteFile("test.pem", out, 0644) - } - - pub2, err := ImportPublicPEM(out) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } else if !cmpPublic(prv.PublicKey, *pub2) { - fmt.Println("ecdh: import from PEM failed") - t.FailNow() - } -} - // Benchmark the generation of P256 keys. func BenchmarkGenerateKeyP256(b *testing.B) { for i := 0; i < b.N; i++ { @@ -437,74 +318,27 @@ func TestDecryptShared2(t *testing.T) { } } -// TestMarshalEncryption validates the encode/decode produces a valid -// ECIES encryption key. -func TestMarshalEncryption(t *testing.T) { - prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - out, err := MarshalPrivate(prv1) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - prv2, err := UnmarshalPrivate(out) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - message := []byte("Hello, world.") - ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - pt, err := prv2.Decrypt(rand.Reader, ct, nil, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - - if !bytes.Equal(pt, message) { - fmt.Println("ecies: plaintext doesn't match message") - t.FailNow() - } - - _, err = prv1.Decrypt(rand.Reader, ct, nil, nil) - if err != nil { - fmt.Println(err.Error()) - t.FailNow() - } - -} - type testCase struct { Curve elliptic.Curve Name string - Expected bool + Expected *ECIESParams } var testCases = []testCase{ { Curve: elliptic.P256(), Name: "P256", - Expected: true, + Expected: ECIES_AES128_SHA256, }, { Curve: elliptic.P384(), Name: "P384", - Expected: true, + Expected: ECIES_AES256_SHA384, }, { Curve: elliptic.P521(), Name: "P521", - Expected: true, + Expected: ECIES_AES256_SHA512, }, } @@ -519,10 +353,10 @@ func TestParamSelection(t *testing.T) { func testParamSelection(t *testing.T, c testCase) { params := ParamsFromCurve(c.Curve) - if params == nil && c.Expected { + if params == nil && c.Expected != nil { fmt.Printf("%s (%s)\n", ErrInvalidParams.Error(), c.Name) t.FailNow() - } else if params != nil && !c.Expected { + } else if params != nil && !cmpParams(params, c.Expected) { fmt.Printf("ecies: parameters should be invalid (%s)\n", c.Name) t.FailNow() diff --git a/crypto/ecies/params.go b/crypto/ecies/params.go index 826d90c845..6312daf5a1 100644 --- a/crypto/ecies/params.go +++ b/crypto/ecies/params.go @@ -114,97 +114,4 @@ func AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) { // Only the curves P256, P384, and P512 are supported. func ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) { return paramsFromCurve[curve] - - /* - switch curve { - case elliptic.P256(): - return ECIES_AES128_SHA256 - case elliptic.P384(): - return ECIES_AES256_SHA384 - case elliptic.P521(): - return ECIES_AES256_SHA512 - default: - return nil - } - */ -} - -// ASN.1 encode the ECIES parameters relevant to the encryption operations. -func paramsToASNECIES(params *ECIESParams) (asnParams asnECIESParameters) { - if nil == params { - return - } - asnParams.KDF = asnNISTConcatenationKDF - asnParams.MAC = hmacFull - switch params.KeyLen { - case 16: - asnParams.Sym = aes128CTRinECIES - case 24: - asnParams.Sym = aes192CTRinECIES - case 32: - asnParams.Sym = aes256CTRinECIES - } - return -} - -// ASN.1 encode the ECIES parameters relevant to ECDH. -func paramsToASNECDH(params *ECIESParams) (algo asnECDHAlgorithm) { - switch params.hashAlgo { - case crypto.SHA224: - algo = dhSinglePass_stdDH_sha224kdf - case crypto.SHA256: - algo = dhSinglePass_stdDH_sha256kdf - case crypto.SHA384: - algo = dhSinglePass_stdDH_sha384kdf - case crypto.SHA512: - algo = dhSinglePass_stdDH_sha512kdf - } - return -} - -// ASN.1 decode the ECIES parameters relevant to the encryption stage. -func asnECIEStoParams(asnParams asnECIESParameters, params *ECIESParams) { - if !asnParams.KDF.Cmp(asnNISTConcatenationKDF) { - params = nil - return - } else if !asnParams.MAC.Cmp(hmacFull) { - params = nil - return - } - - switch { - case asnParams.Sym.Cmp(aes128CTRinECIES): - params.KeyLen = 16 - params.BlockSize = 16 - params.Cipher = aes.NewCipher - case asnParams.Sym.Cmp(aes192CTRinECIES): - params.KeyLen = 24 - params.BlockSize = 16 - params.Cipher = aes.NewCipher - case asnParams.Sym.Cmp(aes256CTRinECIES): - params.KeyLen = 32 - params.BlockSize = 16 - params.Cipher = aes.NewCipher - default: - params = nil - } -} - -// ASN.1 decode the ECIES parameters relevant to ECDH. -func asnECDHtoParams(asnParams asnECDHAlgorithm, params *ECIESParams) { - if asnParams.Cmp(dhSinglePass_stdDH_sha224kdf) { - params.hashAlgo = crypto.SHA224 - params.Hash = sha256.New224 - } else if asnParams.Cmp(dhSinglePass_stdDH_sha256kdf) { - params.hashAlgo = crypto.SHA256 - params.Hash = sha256.New - } else if asnParams.Cmp(dhSinglePass_stdDH_sha384kdf) { - params.hashAlgo = crypto.SHA384 - params.Hash = sha512.New384 - } else if asnParams.Cmp(dhSinglePass_stdDH_sha512kdf) { - params.hashAlgo = crypto.SHA512 - params.Hash = sha512.New - } else { - params = nil - } } diff --git a/crypto/sha3/sha3.go b/crypto/sha3/sha3.go index c86167c0b4..b12a35c87f 100644 --- a/crypto/sha3/sha3.go +++ b/crypto/sha3/sha3.go @@ -42,9 +42,8 @@ type state struct { storage [maxRate]byte // Specific to SHA-3 and SHAKE. - fixedOutput bool // whether this is a fixed-output-length instance - outputLen int // the default output size in bytes - state spongeDirection // whether the sponge is absorbing or squeezing + outputLen int // the default output size in bytes + state spongeDirection // whether the sponge is absorbing or squeezing } // BlockSize returns the rate of sponge underlying this hash function. diff --git a/crypto/sha3/sha3_test.go b/crypto/sha3/sha3_test.go index c433761a8a..0e33676ce6 100644 --- a/crypto/sha3/sha3_test.go +++ b/crypto/sha3/sha3_test.go @@ -53,15 +53,6 @@ var testShakes = map[string]func() ShakeHash{ "SHAKE256": NewShake256, } -// decodeHex converts a hex-encoded string into a raw byte string. -func decodeHex(s string) []byte { - b, err := hex.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - // structs used to marshal JSON test-cases. type KeccakKats struct { Kats map[string][]struct { @@ -125,7 +116,7 @@ func TestKeccakKats(t *testing.T) { // TestUnalignedWrite tests that writing data in an arbitrary pattern with // small input buffers. -func testUnalignedWrite(t *testing.T) { +func TestUnalignedWrite(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { buf := sequentialBytes(0x10000) for alg, df := range testDigests { From d375193797e8198a82c6a1796064ffb289c6956e Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 8 Aug 2017 14:48:06 +0300 Subject: [PATCH 066/272] whisper: fix megacheck warnings (#14925) * whisper: fix megacheck warnings * whisper/whisperv5: regenerate json codec to fix unused override type --- whisper/mailserver/mailserver.go | 2 +- whisper/mailserver/server_test.go | 2 +- whisper/whisperv2/api.go | 9 --------- whisper/whisperv2/whisper.go | 4 ++-- whisper/whisperv5/gen_criteria_json.go | 2 ++ whisper/whisperv5/gen_message_json.go | 2 ++ whisper/whisperv5/gen_newmessage_json.go | 2 ++ whisper/whisperv5/message_test.go | 7 +------ whisper/whisperv5/whisper_test.go | 8 +++++++- 9 files changed, 18 insertions(+), 20 deletions(-) diff --git a/whisper/mailserver/mailserver.go b/whisper/mailserver/mailserver.go index 42a0671a37..0ec6ec570c 100644 --- a/whisper/mailserver/mailserver.go +++ b/whisper/mailserver/mailserver.go @@ -104,7 +104,7 @@ func (s *WMailServer) Archive(env *whisper.Envelope) { func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) { if peer == nil { - log.Error(fmt.Sprint("Whisper peer is nil")) + log.Error("Whisper peer is nil") return } diff --git a/whisper/mailserver/server_test.go b/whisper/mailserver/server_test.go index 95bf2bb436..9155ee85a6 100644 --- a/whisper/mailserver/server_test.go +++ b/whisper/mailserver/server_test.go @@ -168,7 +168,7 @@ func singleRequest(t *testing.T, server *WMailServer, env *whisper.Envelope, p * src[0]++ ok, lower, upper, topic = server.validateRequest(src, request) if ok { - t.Fatalf("request validation false positive, seed: %d.", seed) + t.Fatalf("request validation false positive, seed: %d (lower: %d, upper: %d).", seed, lower, upper) } } diff --git a/whisper/whisperv2/api.go b/whisper/whisperv2/api.go index 0509453ba5..5c6d170959 100644 --- a/whisper/whisperv2/api.go +++ b/whisper/whisperv2/api.go @@ -377,15 +377,6 @@ func (w *whisperFilter) retrieve() (messages []WhisperMessage) { return } -// activity returns the last time instance when client requests were executed on -// the filter. -func (w *whisperFilter) activity() time.Time { - w.lock.RLock() - defer w.lock.RUnlock() - - return w.update -} - // newWhisperFilter creates a new serialized, poll based whisper topic filter. func newWhisperFilter(id hexutil.Uint, ref *Whisper) *whisperFilter { return &whisperFilter{ diff --git a/whisper/whisperv2/whisper.go b/whisper/whisperv2/whisper.go index 1d7c21bd12..61c36918d4 100644 --- a/whisper/whisperv2/whisper.go +++ b/whisper/whisperv2/whisper.go @@ -173,7 +173,7 @@ func (self *Whisper) Send(envelope *Envelope) error { // Start implements node.Service, starting the background data propagation thread // of the Whisper protocol. func (self *Whisper) Start(*p2p.Server) error { - log.Info(fmt.Sprint("Whisper started")) + log.Info("Whisper started") go self.update() return nil } @@ -182,7 +182,7 @@ func (self *Whisper) Start(*p2p.Server) error { // of the Whisper protocol. func (self *Whisper) Stop() error { close(self.quit) - log.Info(fmt.Sprint("Whisper stopped")) + log.Info("Whisper stopped") return nil } diff --git a/whisper/whisperv5/gen_criteria_json.go b/whisper/whisperv5/gen_criteria_json.go index 8d3e9ee24b..df0de85dfa 100644 --- a/whisper/whisperv5/gen_criteria_json.go +++ b/whisper/whisperv5/gen_criteria_json.go @@ -8,6 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ) +var _ = (*criteriaOverride)(nil) + func (c Criteria) MarshalJSON() ([]byte, error) { type Criteria struct { SymKeyID string `json:"symKeyID"` diff --git a/whisper/whisperv5/gen_message_json.go b/whisper/whisperv5/gen_message_json.go index 26168225c9..1855573317 100644 --- a/whisper/whisperv5/gen_message_json.go +++ b/whisper/whisperv5/gen_message_json.go @@ -8,6 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ) +var _ = (*messageOverride)(nil) + func (m Message) MarshalJSON() ([]byte, error) { type Message struct { Sig hexutil.Bytes `json:"sig,omitempty"` diff --git a/whisper/whisperv5/gen_newmessage_json.go b/whisper/whisperv5/gen_newmessage_json.go index 0231cd9191..d0a47185ea 100644 --- a/whisper/whisperv5/gen_newmessage_json.go +++ b/whisper/whisperv5/gen_newmessage_json.go @@ -8,6 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ) +var _ = (*newMessageOverride)(nil) + func (n NewMessage) MarshalJSON() ([]byte, error) { type NewMessage struct { SymKeyID string `json:"symKeyID"` diff --git a/whisper/whisperv5/message_test.go b/whisper/whisperv5/message_test.go index aa82a02f36..2edf945df0 100644 --- a/whisper/whisperv5/message_test.go +++ b/whisper/whisperv5/message_test.go @@ -25,11 +25,6 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) -func copyFromBuf(dst []byte, src []byte, beg int) int { - copy(dst, src[beg:]) - return beg + len(dst) -} - func generateMessageParams() (*MessageParams, error) { // set all the parameters except p.Dst and p.Padding @@ -158,7 +153,7 @@ func TestMessageWrap(t *testing.T) { params.TTL = 1000000 params.WorkTime = 1 params.PoW = 10000000.0 - env, err = msg2.Wrap(params) + _, err = msg2.Wrap(params) if err == nil { t.Fatalf("unexpectedly reached the PoW target with seed %d.", seed) } diff --git a/whisper/whisperv5/whisper_test.go b/whisper/whisperv5/whisper_test.go index 1451438336..025be5b544 100644 --- a/whisper/whisperv5/whisper_test.go +++ b/whisper/whisperv5/whisper_test.go @@ -424,7 +424,7 @@ func TestWhisperSymKeyManagement(t *testing.T) { randomKey = make([]byte, aesKeyLength+1) mrand.Read(randomKey) - id1, err = w.AddSymKeyDirect(randomKey) + _, err = w.AddSymKeyDirect(randomKey) if err == nil { t.Fatalf("added the key with wrong size, seed %d.", seed) } @@ -541,6 +541,9 @@ func TestCustomization(t *testing.T) { const smallPoW = 0.00001 f, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } params, err := generateMessageParams() if err != nil { t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) @@ -607,6 +610,9 @@ func TestCustomization(t *testing.T) { // check w.messages() id, err := w.Subscribe(f) + if err != nil { + t.Fatalf("failed subscribe with seed %d: %s.", seed, err) + } time.Sleep(5 * time.Millisecond) mail := f.Retrieve() if len(mail) > 0 { From fff6e03a792b0e0a84943e2c3764c39b2840458a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felf=C3=B6ldi=20Zsolt?= Date: Tue, 8 Aug 2017 17:31:08 +0100 Subject: [PATCH 067/272] les: fix megacheck warnings (#14941) * les: fix megacheck warnings * les: fixed testGetProofs --- les/backend.go | 3 +-- les/flowcontrol/control.go | 4 +--- les/handler.go | 6 ------ les/handler_test.go | 4 ++-- les/helper_test.go | 42 +------------------------------------- les/peer.go | 5 +---- les/protocol.go | 27 ------------------------ les/server.go | 11 ---------- 8 files changed, 6 insertions(+), 96 deletions(-) diff --git a/les/backend.go b/les/backend.go index 658c73c6ee..a4e7726717 100644 --- a/les/backend.go +++ b/les/backend.go @@ -70,8 +70,7 @@ type LightEthereum struct { networkId uint64 netRPCService *ethapi.PublicNetAPI - quitSync chan struct{} - wg sync.WaitGroup + wg sync.WaitGroup } func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { diff --git a/les/flowcontrol/control.go b/les/flowcontrol/control.go index e40e693464..d50eb809cc 100644 --- a/les/flowcontrol/control.go +++ b/les/flowcontrol/control.go @@ -157,9 +157,7 @@ func (peer *ServerNode) QueueRequest(reqID, maxCost uint64) { peer.bufEstimate -= maxCost peer.sumCost += maxCost - if reqID >= 0 { - peer.pending[reqID] = peer.sumCost - } + peer.pending[reqID] = peer.sumCost } // GotReply adjusts estimated buffer value according to the value included in diff --git a/les/handler.go b/les/handler.go index f50abaaa3e..234b6e998b 100644 --- a/les/handler.go +++ b/les/handler.go @@ -69,8 +69,6 @@ func errResp(code errCode, format string, v ...interface{}) error { return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) } -type hashFetcherFn func(common.Hash) error - type BlockChain interface { HasHeader(hash common.Hash) bool GetHeader(hash common.Hash, number uint64) *types.Header @@ -119,10 +117,6 @@ type ProtocolManager struct { quitSync chan struct{} noMorePeers chan struct{} - syncMu sync.Mutex - syncing bool - syncDone chan struct{} - // wait group is used for graceful shutdowns during downloading // and processing wg *sync.WaitGroup diff --git a/les/handler_test.go b/les/handler_test.go index 5df1d3463a..b1f1aa0951 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -305,7 +305,7 @@ func testGetReceipt(t *testing.T, protocol int) { } // Tests that trie merkle proofs can be retrieved -func TestGetProofsLes1(t *testing.T) { testGetReceipt(t, 1) } +func TestGetProofsLes1(t *testing.T) { testGetProofs(t, 1) } func testGetProofs(t *testing.T, protocol int) { // Assemble the test environment @@ -327,7 +327,7 @@ func testGetProofs(t *testing.T, protocol int) { for _, acc := range accounts { req := ProofReq{ BHash: header.Hash(), - Key: acc[:], + Key: crypto.Keccak256(acc[:]), } proofreqs = append(proofreqs, req) diff --git a/les/helper_test.go b/les/helper_test.go index 52fddd117a..7dccfc4582 100644 --- a/les/helper_test.go +++ b/les/helper_test.go @@ -20,7 +20,6 @@ package les import ( - "crypto/ecdsa" "crypto/rand" "math/big" "sync" @@ -140,7 +139,7 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}, } genesis = gspec.MustCommit(db) - chain BlockChain + chain BlockChain ) if peers == nil { peers = newPeerSet() @@ -189,45 +188,6 @@ func newTestProtocolManagerMust(t *testing.T, lightSync bool, blocks int, genera return pm } -// testTxPool is a fake, helper transaction pool for testing purposes -type testTxPool struct { - pool []*types.Transaction // Collection of all transactions - added chan<- []*types.Transaction // Notification channel for new transactions - - lock sync.RWMutex // Protects the transaction pool -} - -// AddTransactions appends a batch of transactions to the pool, and notifies any -// listeners if the addition channel is non nil -func (p *testTxPool) AddBatch(txs []*types.Transaction) { - p.lock.Lock() - defer p.lock.Unlock() - - p.pool = append(p.pool, txs...) - if p.added != nil { - p.added <- txs - } -} - -// GetTransactions returns all the transactions known to the pool -func (p *testTxPool) GetTransactions() types.Transactions { - p.lock.RLock() - defer p.lock.RUnlock() - - txs := make([]*types.Transaction, len(p.pool)) - copy(txs, p.pool) - - return txs -} - -// newTestTransaction create a new dummy transaction. -func newTestTransaction(from *ecdsa.PrivateKey, nonce uint64, datasize int) *types.Transaction { - tx := types.NewTransaction(nonce, common.Address{}, big.NewInt(0), big.NewInt(100000), big.NewInt(0), make([]byte, datasize)) - tx, _ = types.SignTx(tx, types.HomesteadSigner{}, from) - - return tx -} - // testPeer is a simulated peer to allow testing direct network calls. type testPeer struct { net p2p.MsgReadWriter // Network layer reader/writer to simulate remote messaging diff --git a/les/peer.go b/les/peer.go index 791d0da24f..3ba2df3fe8 100644 --- a/les/peer.go +++ b/les/peer.go @@ -38,10 +38,7 @@ var ( errNotRegistered = errors.New("peer is not registered") ) -const ( - maxHeadInfoLen = 20 - maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) -) +const maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) type peer struct { *p2p.Peer diff --git a/les/protocol.go b/les/protocol.go index 46da2b8c8b..33d930ee0c 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -23,7 +23,6 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" ) @@ -105,12 +104,6 @@ var errorToString = map[int]string{ ErrHandshakeMissingKey: "Key missing from handshake message", } -type chainManager interface { - GetBlockHashesFromHash(hash common.Hash, amount uint64) (hashes []common.Hash) - GetBlock(hash common.Hash) (block *types.Block) - Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash) -} - // announceData is the network packet for the block announcements. type announceData struct { Hash common.Hash // Hash of one particular block being announced @@ -118,11 +111,6 @@ type announceData struct { Td *big.Int // Total difficulty of one particular block being announced ReorgDepth uint64 Update keyValueList - - haveHeaders uint64 // we have the headers of the remote peer's chain up to this number - headKnown bool - requested bool - next *announceData } type blockInfo struct { @@ -131,12 +119,6 @@ type blockInfo struct { Td *big.Int // Total difficulty of one particular block being announced } -// getBlockHashesData is the network packet for the hash based hash retrieval. -type getBlockHashesData struct { - Hash common.Hash - Amount uint64 -} - // getBlockHeadersData represents a block header query. type getBlockHeadersData struct { Origin hashOrNumber // Block from which to retrieve headers @@ -181,15 +163,6 @@ func (hn *hashOrNumber) DecodeRLP(s *rlp.Stream) error { return err } -// newBlockData is the network packet for the block propagation message. -type newBlockData struct { - Block *types.Block - TD *big.Int -} - -// blockBodiesData is the network packet for block content distribution. -type blockBodiesData []*types.Body - // CodeData is the network response packet for a node data retrieval. type CodeData []struct { Value []byte diff --git a/les/server.go b/les/server.go index 2ff715ea85..39ef0efffe 100644 --- a/les/server.go +++ b/les/server.go @@ -44,7 +44,6 @@ type LesServer struct { defParams *flowcontrol.ServerParams lesTopic discv5.Topic quitSync chan struct{} - stopped bool } func NewLesServer(eth *eth.Ethereum, config *eth.Config) (*LesServer, error) { @@ -118,16 +117,6 @@ func (list RequestCostList) decode() requestCostTable { return table } -func (table requestCostTable) encode() RequestCostList { - list := make(RequestCostList, len(table)) - for idx, code := range reqList { - list[idx].MsgCode = code - list[idx].BaseCost = table[code].baseCost - list[idx].ReqCost = table[code].reqCost - } - return list -} - type linReg struct { sumX, sumY, sumXX, sumXY float64 cnt uint64 From 26b2d6e1aa25c847e452173b412b57d8a93c1eaa Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 8 Aug 2017 19:41:35 +0300 Subject: [PATCH 068/272] contracts: fix megacheck errors (#14916) * contracts: fix megacheck errors * contracts: drop useless sleep, lets see what breaks --- contracts/chequebook/cheque.go | 11 ++++------- contracts/chequebook/cheque_test.go | 7 +++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/contracts/chequebook/cheque.go b/contracts/chequebook/cheque.go index bd635705e1..09daa92484 100644 --- a/contracts/chequebook/cheque.go +++ b/contracts/chequebook/cheque.go @@ -376,12 +376,12 @@ func (self *Chequebook) autoDeposit(interval time.Duration) { ticker := time.NewTicker(interval) self.quit = make(chan bool) quit := self.quit + go func() { - FOR: for { select { case <-quit: - break FOR + return case <-ticker.C: self.lock.Lock() if self.balance.Cmp(self.buffer) < 0 { @@ -395,7 +395,6 @@ func (self *Chequebook) autoDeposit(interval time.Duration) { } } }() - return } // Outbox can issue cheques from a single contract to a single beneficiary. @@ -436,7 +435,6 @@ type Inbox struct { sender common.Address // local peer's address to send cashing tx from signer *ecdsa.PublicKey // peer's public key txhash string // tx hash of last cashing tx - abigen bind.ContractBackend // blockchain API session *contract.ChequebookSession // abi contract backend with tx opts quit chan bool // when closed causes autocash to stop maxUncashed *big.Int // threshold that triggers autocashing @@ -525,12 +523,12 @@ func (self *Inbox) autoCash(cashInterval time.Duration) { ticker := time.NewTicker(cashInterval) self.quit = make(chan bool) quit := self.quit + go func() { - FOR: for { select { case <-quit: - break FOR + return case <-ticker.C: self.lock.Lock() if self.cheque != nil && self.cheque.Amount.Cmp(self.cashed) != 0 { @@ -543,7 +541,6 @@ func (self *Inbox) autoCash(cashInterval time.Duration) { } } }() - return } // Receive is called to deposit the latest cheque to the incoming Inbox. diff --git a/contracts/chequebook/cheque_test.go b/contracts/chequebook/cheque_test.go index 1f8b711295..5f6a54a1c1 100644 --- a/contracts/chequebook/cheque_test.go +++ b/contracts/chequebook/cheque_test.go @@ -170,7 +170,6 @@ func TestVerifyErrors(t *testing.T) { t.Fatalf("expected no error, got %v", err) } - time.Sleep(5) chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) if err != nil { t.Fatalf("expected no error, got %v", err) @@ -193,7 +192,7 @@ func TestVerifyErrors(t *testing.T) { received, err = chbox.Receive(ch1) t.Logf("correct error: %v", err) if err == nil { - t.Fatalf("expected receiver error, got none") + t.Fatalf("expected receiver error, got none and value %v", received) } ch2, err := chbook1.Issue(addr1, amount) @@ -203,7 +202,7 @@ func TestVerifyErrors(t *testing.T) { received, err = chbox.Receive(ch2) t.Logf("correct error: %v", err) if err == nil { - t.Fatalf("expected sender error, got none") + t.Fatalf("expected sender error, got none and value %v", received) } _, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1)) @@ -215,7 +214,7 @@ func TestVerifyErrors(t *testing.T) { received, err = chbox.Receive(ch0) t.Logf("correct error: %v", err) if err == nil { - t.Fatalf("expected incorrect amount error, got none") + t.Fatalf("expected incorrect amount error, got none and value %v", received) } } From 17ce0a37de5a2712a8bf9d58df705e718b3b2cd6 Mon Sep 17 00:00:00 2001 From: Ivan Daniluk Date: Tue, 8 Aug 2017 20:10:09 +0300 Subject: [PATCH 069/272] eth/downloader: fix race in downloadTesterPeer (#14942) * eth/downloader: fix race in downloadTesterPeer Signed-off-by: Ivan Daniluk * eth/downloader: minor datarace fix cleanup --- eth/downloader/downloader_test.go | 32 ++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 36e8c800f6..d66aafe94e 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -403,7 +403,7 @@ func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Ha dl.lock.Lock() defer dl.lock.Unlock() - var err = dl.downloader.RegisterPeer(id, version, &downloadTesterPeer{dl, id, delay}) + var err = dl.downloader.RegisterPeer(id, version, &downloadTesterPeer{dl: dl, id: id, delay: delay}) if err == nil { // Assign the owned hashes, headers and blocks to the peer (deep copy) dl.peerHashes[id] = make([]common.Hash, len(hashes)) @@ -465,6 +465,24 @@ type downloadTesterPeer struct { dl *downloadTester id string delay time.Duration + lock sync.RWMutex +} + +// setDelay is a thread safe setter for the network delay value. +func (dlp *downloadTesterPeer) setDelay(delay time.Duration) { + dlp.lock.Lock() + defer dlp.lock.Unlock() + + dlp.delay = delay +} + +// waitDelay is a thread safe way to sleep for the configured time. +func (dlp *downloadTesterPeer) waitDelay() { + dlp.lock.RLock() + delay := dlp.delay + dlp.lock.RUnlock() + + time.Sleep(delay) } // Head constructs a function to retrieve a peer's current head hash @@ -499,7 +517,7 @@ func (dlp *downloadTesterPeer) RequestHeadersByHash(origin common.Hash, amount i // origin; associated with a particular peer in the download tester. The returned // function can be used to retrieve batches of headers from the particular peer. func (dlp *downloadTesterPeer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { - time.Sleep(dlp.delay) + dlp.waitDelay() dlp.dl.lock.RLock() defer dlp.dl.lock.RUnlock() @@ -525,7 +543,7 @@ func (dlp *downloadTesterPeer) RequestHeadersByNumber(origin uint64, amount int, // peer in the download tester. The returned function can be used to retrieve // batches of block bodies from the particularly requested peer. func (dlp *downloadTesterPeer) RequestBodies(hashes []common.Hash) error { - time.Sleep(dlp.delay) + dlp.waitDelay() dlp.dl.lock.RLock() defer dlp.dl.lock.RUnlock() @@ -550,7 +568,7 @@ func (dlp *downloadTesterPeer) RequestBodies(hashes []common.Hash) error { // peer in the download tester. The returned function can be used to retrieve // batches of block receipts from the particularly requested peer. func (dlp *downloadTesterPeer) RequestReceipts(hashes []common.Hash) error { - time.Sleep(dlp.delay) + dlp.waitDelay() dlp.dl.lock.RLock() defer dlp.dl.lock.RUnlock() @@ -572,7 +590,7 @@ func (dlp *downloadTesterPeer) RequestReceipts(hashes []common.Hash) error { // peer in the download tester. The returned function can be used to retrieve // batches of node state data from the particularly requested peer. func (dlp *downloadTesterPeer) RequestNodeData(hashes []common.Hash) error { - time.Sleep(dlp.delay) + dlp.waitDelay() dlp.dl.lock.RLock() defer dlp.dl.lock.RUnlock() @@ -1746,7 +1764,7 @@ func testFastCriticalRestarts(t *testing.T, protocol int, progress bool) { for i := 0; i < fsPivotInterval; i++ { tester.peerMissingStates["peer"][headers[hashes[fsMinFullBlocks+i]].Root] = true } - (tester.downloader.peers.peers["peer"].peer).(*downloadTesterPeer).delay = 500 * time.Millisecond // Enough to reach the critical section + (tester.downloader.peers.peers["peer"].peer).(*downloadTesterPeer).setDelay(500 * time.Millisecond) // Enough to reach the critical section // Synchronise with the peer a few times and make sure they fail until the retry limit for i := 0; i < int(fsCriticalTrials)-1; i++ { @@ -1765,7 +1783,7 @@ func testFastCriticalRestarts(t *testing.T, protocol int, progress bool) { tester.lock.Lock() tester.peerHeaders["peer"][hashes[fsMinFullBlocks-1]] = headers[hashes[fsMinFullBlocks-1]] tester.peerMissingStates["peer"] = map[common.Hash]bool{tester.downloader.fsPivotLock.Root: true} - (tester.downloader.peers.peers["peer"].peer).(*downloadTesterPeer).delay = 0 + (tester.downloader.peers.peers["peer"].peer).(*downloadTesterPeer).setDelay(0) tester.lock.Unlock() } } From db568a61e2a98880ab308bf2224aa34073dc7f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 1 Aug 2017 17:45:17 +0200 Subject: [PATCH 070/272] accounts, console, internal: support trezor hardware wallet --- accounts/accounts.go | 21 +- accounts/hd.go | 9 +- accounts/keystore/keystore.go | 6 +- accounts/keystore/keystore_test.go | 8 +- accounts/manager.go | 5 +- .../usbwallet/internal/trezor/messages.pb.go | 3081 +++++++++++++++++ .../usbwallet/internal/trezor/messages.proto | 903 +++++ accounts/usbwallet/internal/trezor/trezor.go | 46 + .../usbwallet/internal/trezor/types.pb.go | 1333 +++++++ .../usbwallet/internal/trezor/types.proto | 276 ++ accounts/usbwallet/ledger_hub.go | 10 +- accounts/usbwallet/ledger_wallet.go | 13 +- accounts/usbwallet/trezor_hub.go | 210 ++ accounts/usbwallet/trezor_wallet.go | 761 ++++ accounts/usbwallet/usbwallet.go | 9 + cmd/geth/main.go | 16 +- console/bridge.go | 49 + console/console.go | 12 +- internal/ethapi/api.go | 16 + internal/web3ext/web3ext.go | 5 + node/config.go | 7 + vendor/github.com/golang/protobuf/LICENSE | 31 + .../github.com/golang/protobuf/proto/Makefile | 43 + .../github.com/golang/protobuf/proto/clone.go | 229 ++ .../golang/protobuf/proto/decode.go | 970 ++++++ .../golang/protobuf/proto/encode.go | 1362 ++++++++ .../github.com/golang/protobuf/proto/equal.go | 300 ++ .../golang/protobuf/proto/extensions.go | 587 ++++ .../github.com/golang/protobuf/proto/lib.go | 897 +++++ .../golang/protobuf/proto/message_set.go | 311 ++ .../golang/protobuf/proto/pointer_reflect.go | 484 +++ .../golang/protobuf/proto/pointer_unsafe.go | 270 ++ .../golang/protobuf/proto/properties.go | 872 +++++ .../github.com/golang/protobuf/proto/text.go | 854 +++++ .../golang/protobuf/proto/text_parser.go | 895 +++++ .../protoc-gen-go/descriptor/Makefile | 36 + .../protoc-gen-go/descriptor/descriptor.pb.go | 2152 ++++++++++++ vendor/vendor.json | 12 + 38 files changed, 17063 insertions(+), 38 deletions(-) create mode 100644 accounts/usbwallet/internal/trezor/messages.pb.go create mode 100644 accounts/usbwallet/internal/trezor/messages.proto create mode 100644 accounts/usbwallet/internal/trezor/trezor.go create mode 100644 accounts/usbwallet/internal/trezor/types.pb.go create mode 100644 accounts/usbwallet/internal/trezor/types.proto create mode 100644 accounts/usbwallet/trezor_hub.go create mode 100644 accounts/usbwallet/trezor_wallet.go create mode 100644 vendor/github.com/golang/protobuf/LICENSE create mode 100644 vendor/github.com/golang/protobuf/proto/Makefile create mode 100644 vendor/github.com/golang/protobuf/proto/clone.go create mode 100644 vendor/github.com/golang/protobuf/proto/decode.go create mode 100644 vendor/github.com/golang/protobuf/proto/encode.go create mode 100644 vendor/github.com/golang/protobuf/proto/equal.go create mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go create mode 100644 vendor/github.com/golang/protobuf/proto/lib.go create mode 100644 vendor/github.com/golang/protobuf/proto/message_set.go create mode 100644 vendor/github.com/golang/protobuf/proto/pointer_reflect.go create mode 100644 vendor/github.com/golang/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/github.com/golang/protobuf/proto/properties.go create mode 100644 vendor/github.com/golang/protobuf/proto/text.go create mode 100644 vendor/github.com/golang/protobuf/proto/text_parser.go create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go diff --git a/accounts/accounts.go b/accounts/accounts.go index 640de52207..5872bb4a3d 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -147,9 +147,26 @@ type Backend interface { Subscribe(sink chan<- WalletEvent) event.Subscription } +// WalletEventType represents the different event types that can be fired by +// the wallet subscription subsystem. +type WalletEventType int + +const ( + // WalletArrived is fired when a new wallet is detected either via USB or via + // a filesystem event in the keystore. + WalletArrived WalletEventType = iota + + // WalletOpened is fired when a wallet is successfully opened with the purpose + // of starting any background processes such as automatic key derivation. + WalletOpened + + // WalletDropped + WalletDropped +) + // WalletEvent is an event fired by an account backend when a wallet arrival or // departure is detected. type WalletEvent struct { - Wallet Wallet // Wallet instance arrived or departed - Arrive bool // Whether the wallet was added or removed + Wallet Wallet // Wallet instance arrived or departed + Kind WalletEventType // Event type that happened in the system } diff --git a/accounts/hd.go b/accounts/hd.go index e8bc191afb..277f688e48 100644 --- a/accounts/hd.go +++ b/accounts/hd.go @@ -27,12 +27,17 @@ import ( // DefaultRootDerivationPath is the root path to which custom derivation endpoints // are appended. As such, the first account will be at m/44'/60'/0'/0, the second // at m/44'/60'/0'/1, etc. -var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0} +var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DefaultBaseDerivationPath is the base path from which custom derivation endpoints // are incremented. As such, the first account will be at m/44'/60'/0'/0, the second // at m/44'/60'/0'/1, etc. -var DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} +var DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0} + +// DefaultLedgerBaseDerivationPath is the base path from which custom derivation endpoints +// are incremented. As such, the first account will be at m/44'/60'/0'/0, the second +// at m/44'/60'/0'/1, etc. +var DefaultLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DerivationPath represents the computer friendly version of a hierarchical // deterministic wallet account derivaion path. diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go index 9df7f2dd96..80ccd37419 100644 --- a/accounts/keystore/keystore.go +++ b/accounts/keystore/keystore.go @@ -143,14 +143,14 @@ func (ks *KeyStore) refreshWallets() { for _, account := range accs { // Drop wallets while they were in front of the next account for len(ks.wallets) > 0 && ks.wallets[0].URL().Cmp(account.URL) < 0 { - events = append(events, accounts.WalletEvent{Wallet: ks.wallets[0], Arrive: false}) + events = append(events, accounts.WalletEvent{Wallet: ks.wallets[0], Kind: accounts.WalletDropped}) ks.wallets = ks.wallets[1:] } // If there are no more wallets or the account is before the next, wrap new wallet if len(ks.wallets) == 0 || ks.wallets[0].URL().Cmp(account.URL) > 0 { wallet := &keystoreWallet{account: account, keystore: ks} - events = append(events, accounts.WalletEvent{Wallet: wallet, Arrive: true}) + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) wallets = append(wallets, wallet) continue } @@ -163,7 +163,7 @@ func (ks *KeyStore) refreshWallets() { } // Drop any leftover wallets and set the new batch for _, wallet := range ks.wallets { - events = append(events, accounts.WalletEvent{Wallet: wallet, Arrive: false}) + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) } ks.wallets = wallets ks.mu.Unlock() diff --git a/accounts/keystore/keystore_test.go b/accounts/keystore/keystore_test.go index 5d89a4dbb7..132b74439e 100644 --- a/accounts/keystore/keystore_test.go +++ b/accounts/keystore/keystore_test.go @@ -296,8 +296,8 @@ func TestWalletNotifications(t *testing.T) { } select { case event := <-updates: - if !event.Arrive { - t.Errorf("departure event on account creation") + if event.Kind != accounts.WalletArrived { + t.Errorf("non-arrival event on account creation") } if event.Wallet.Accounts()[0] != account { t.Errorf("account mismatch on created wallet: have %v, want %v", event.Wallet.Accounts()[0], account) @@ -319,8 +319,8 @@ func TestWalletNotifications(t *testing.T) { } select { case event := <-updates: - if event.Arrive { - t.Errorf("arrival event on account deletion") + if event.Kind != accounts.WalletDropped { + t.Errorf("non-drop event on account deletion") } if event.Wallet.Accounts()[0] != account { t.Errorf("account mismatch on deleted wallet: have %v, want %v", event.Wallet.Accounts()[0], account) diff --git a/accounts/manager.go b/accounts/manager.go index 12a5bfcd90..78ddb13683 100644 --- a/accounts/manager.go +++ b/accounts/manager.go @@ -96,9 +96,10 @@ func (am *Manager) update() { case event := <-am.updates: // Wallet event arrived, update local cache am.lock.Lock() - if event.Arrive { + switch event.Kind { + case WalletArrived: am.wallets = merge(am.wallets, event.Wallet) - } else { + case WalletDropped: am.wallets = drop(am.wallets, event.Wallet) } am.lock.Unlock() diff --git a/accounts/usbwallet/internal/trezor/messages.pb.go b/accounts/usbwallet/internal/trezor/messages.pb.go new file mode 100644 index 0000000000..15bb6fb73b --- /dev/null +++ b/accounts/usbwallet/internal/trezor/messages.pb.go @@ -0,0 +1,3081 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages.proto + +package trezor + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// * +// Mapping between Trezor wire identifier (uint) and a protobuf message +type MessageType int32 + +const ( + MessageType_MessageType_Initialize MessageType = 0 + MessageType_MessageType_Ping MessageType = 1 + MessageType_MessageType_Success MessageType = 2 + MessageType_MessageType_Failure MessageType = 3 + MessageType_MessageType_ChangePin MessageType = 4 + MessageType_MessageType_WipeDevice MessageType = 5 + MessageType_MessageType_FirmwareErase MessageType = 6 + MessageType_MessageType_FirmwareUpload MessageType = 7 + MessageType_MessageType_FirmwareRequest MessageType = 8 + MessageType_MessageType_GetEntropy MessageType = 9 + MessageType_MessageType_Entropy MessageType = 10 + MessageType_MessageType_GetPublicKey MessageType = 11 + MessageType_MessageType_PublicKey MessageType = 12 + MessageType_MessageType_LoadDevice MessageType = 13 + MessageType_MessageType_ResetDevice MessageType = 14 + MessageType_MessageType_SignTx MessageType = 15 + MessageType_MessageType_SimpleSignTx MessageType = 16 + MessageType_MessageType_Features MessageType = 17 + MessageType_MessageType_PinMatrixRequest MessageType = 18 + MessageType_MessageType_PinMatrixAck MessageType = 19 + MessageType_MessageType_Cancel MessageType = 20 + MessageType_MessageType_TxRequest MessageType = 21 + MessageType_MessageType_TxAck MessageType = 22 + MessageType_MessageType_CipherKeyValue MessageType = 23 + MessageType_MessageType_ClearSession MessageType = 24 + MessageType_MessageType_ApplySettings MessageType = 25 + MessageType_MessageType_ButtonRequest MessageType = 26 + MessageType_MessageType_ButtonAck MessageType = 27 + MessageType_MessageType_ApplyFlags MessageType = 28 + MessageType_MessageType_GetAddress MessageType = 29 + MessageType_MessageType_Address MessageType = 30 + MessageType_MessageType_SelfTest MessageType = 32 + MessageType_MessageType_BackupDevice MessageType = 34 + MessageType_MessageType_EntropyRequest MessageType = 35 + MessageType_MessageType_EntropyAck MessageType = 36 + MessageType_MessageType_SignMessage MessageType = 38 + MessageType_MessageType_VerifyMessage MessageType = 39 + MessageType_MessageType_MessageSignature MessageType = 40 + MessageType_MessageType_PassphraseRequest MessageType = 41 + MessageType_MessageType_PassphraseAck MessageType = 42 + MessageType_MessageType_EstimateTxSize MessageType = 43 + MessageType_MessageType_TxSize MessageType = 44 + MessageType_MessageType_RecoveryDevice MessageType = 45 + MessageType_MessageType_WordRequest MessageType = 46 + MessageType_MessageType_WordAck MessageType = 47 + MessageType_MessageType_CipheredKeyValue MessageType = 48 + MessageType_MessageType_EncryptMessage MessageType = 49 + MessageType_MessageType_EncryptedMessage MessageType = 50 + MessageType_MessageType_DecryptMessage MessageType = 51 + MessageType_MessageType_DecryptedMessage MessageType = 52 + MessageType_MessageType_SignIdentity MessageType = 53 + MessageType_MessageType_SignedIdentity MessageType = 54 + MessageType_MessageType_GetFeatures MessageType = 55 + MessageType_MessageType_EthereumGetAddress MessageType = 56 + MessageType_MessageType_EthereumAddress MessageType = 57 + MessageType_MessageType_EthereumSignTx MessageType = 58 + MessageType_MessageType_EthereumTxRequest MessageType = 59 + MessageType_MessageType_EthereumTxAck MessageType = 60 + MessageType_MessageType_GetECDHSessionKey MessageType = 61 + MessageType_MessageType_ECDHSessionKey MessageType = 62 + MessageType_MessageType_SetU2FCounter MessageType = 63 + MessageType_MessageType_EthereumSignMessage MessageType = 64 + MessageType_MessageType_EthereumVerifyMessage MessageType = 65 + MessageType_MessageType_EthereumMessageSignature MessageType = 66 + MessageType_MessageType_DebugLinkDecision MessageType = 100 + MessageType_MessageType_DebugLinkGetState MessageType = 101 + MessageType_MessageType_DebugLinkState MessageType = 102 + MessageType_MessageType_DebugLinkStop MessageType = 103 + MessageType_MessageType_DebugLinkLog MessageType = 104 + MessageType_MessageType_DebugLinkMemoryRead MessageType = 110 + MessageType_MessageType_DebugLinkMemory MessageType = 111 + MessageType_MessageType_DebugLinkMemoryWrite MessageType = 112 + MessageType_MessageType_DebugLinkFlashErase MessageType = 113 +) + +var MessageType_name = map[int32]string{ + 0: "MessageType_Initialize", + 1: "MessageType_Ping", + 2: "MessageType_Success", + 3: "MessageType_Failure", + 4: "MessageType_ChangePin", + 5: "MessageType_WipeDevice", + 6: "MessageType_FirmwareErase", + 7: "MessageType_FirmwareUpload", + 8: "MessageType_FirmwareRequest", + 9: "MessageType_GetEntropy", + 10: "MessageType_Entropy", + 11: "MessageType_GetPublicKey", + 12: "MessageType_PublicKey", + 13: "MessageType_LoadDevice", + 14: "MessageType_ResetDevice", + 15: "MessageType_SignTx", + 16: "MessageType_SimpleSignTx", + 17: "MessageType_Features", + 18: "MessageType_PinMatrixRequest", + 19: "MessageType_PinMatrixAck", + 20: "MessageType_Cancel", + 21: "MessageType_TxRequest", + 22: "MessageType_TxAck", + 23: "MessageType_CipherKeyValue", + 24: "MessageType_ClearSession", + 25: "MessageType_ApplySettings", + 26: "MessageType_ButtonRequest", + 27: "MessageType_ButtonAck", + 28: "MessageType_ApplyFlags", + 29: "MessageType_GetAddress", + 30: "MessageType_Address", + 32: "MessageType_SelfTest", + 34: "MessageType_BackupDevice", + 35: "MessageType_EntropyRequest", + 36: "MessageType_EntropyAck", + 38: "MessageType_SignMessage", + 39: "MessageType_VerifyMessage", + 40: "MessageType_MessageSignature", + 41: "MessageType_PassphraseRequest", + 42: "MessageType_PassphraseAck", + 43: "MessageType_EstimateTxSize", + 44: "MessageType_TxSize", + 45: "MessageType_RecoveryDevice", + 46: "MessageType_WordRequest", + 47: "MessageType_WordAck", + 48: "MessageType_CipheredKeyValue", + 49: "MessageType_EncryptMessage", + 50: "MessageType_EncryptedMessage", + 51: "MessageType_DecryptMessage", + 52: "MessageType_DecryptedMessage", + 53: "MessageType_SignIdentity", + 54: "MessageType_SignedIdentity", + 55: "MessageType_GetFeatures", + 56: "MessageType_EthereumGetAddress", + 57: "MessageType_EthereumAddress", + 58: "MessageType_EthereumSignTx", + 59: "MessageType_EthereumTxRequest", + 60: "MessageType_EthereumTxAck", + 61: "MessageType_GetECDHSessionKey", + 62: "MessageType_ECDHSessionKey", + 63: "MessageType_SetU2FCounter", + 64: "MessageType_EthereumSignMessage", + 65: "MessageType_EthereumVerifyMessage", + 66: "MessageType_EthereumMessageSignature", + 100: "MessageType_DebugLinkDecision", + 101: "MessageType_DebugLinkGetState", + 102: "MessageType_DebugLinkState", + 103: "MessageType_DebugLinkStop", + 104: "MessageType_DebugLinkLog", + 110: "MessageType_DebugLinkMemoryRead", + 111: "MessageType_DebugLinkMemory", + 112: "MessageType_DebugLinkMemoryWrite", + 113: "MessageType_DebugLinkFlashErase", +} +var MessageType_value = map[string]int32{ + "MessageType_Initialize": 0, + "MessageType_Ping": 1, + "MessageType_Success": 2, + "MessageType_Failure": 3, + "MessageType_ChangePin": 4, + "MessageType_WipeDevice": 5, + "MessageType_FirmwareErase": 6, + "MessageType_FirmwareUpload": 7, + "MessageType_FirmwareRequest": 8, + "MessageType_GetEntropy": 9, + "MessageType_Entropy": 10, + "MessageType_GetPublicKey": 11, + "MessageType_PublicKey": 12, + "MessageType_LoadDevice": 13, + "MessageType_ResetDevice": 14, + "MessageType_SignTx": 15, + "MessageType_SimpleSignTx": 16, + "MessageType_Features": 17, + "MessageType_PinMatrixRequest": 18, + "MessageType_PinMatrixAck": 19, + "MessageType_Cancel": 20, + "MessageType_TxRequest": 21, + "MessageType_TxAck": 22, + "MessageType_CipherKeyValue": 23, + "MessageType_ClearSession": 24, + "MessageType_ApplySettings": 25, + "MessageType_ButtonRequest": 26, + "MessageType_ButtonAck": 27, + "MessageType_ApplyFlags": 28, + "MessageType_GetAddress": 29, + "MessageType_Address": 30, + "MessageType_SelfTest": 32, + "MessageType_BackupDevice": 34, + "MessageType_EntropyRequest": 35, + "MessageType_EntropyAck": 36, + "MessageType_SignMessage": 38, + "MessageType_VerifyMessage": 39, + "MessageType_MessageSignature": 40, + "MessageType_PassphraseRequest": 41, + "MessageType_PassphraseAck": 42, + "MessageType_EstimateTxSize": 43, + "MessageType_TxSize": 44, + "MessageType_RecoveryDevice": 45, + "MessageType_WordRequest": 46, + "MessageType_WordAck": 47, + "MessageType_CipheredKeyValue": 48, + "MessageType_EncryptMessage": 49, + "MessageType_EncryptedMessage": 50, + "MessageType_DecryptMessage": 51, + "MessageType_DecryptedMessage": 52, + "MessageType_SignIdentity": 53, + "MessageType_SignedIdentity": 54, + "MessageType_GetFeatures": 55, + "MessageType_EthereumGetAddress": 56, + "MessageType_EthereumAddress": 57, + "MessageType_EthereumSignTx": 58, + "MessageType_EthereumTxRequest": 59, + "MessageType_EthereumTxAck": 60, + "MessageType_GetECDHSessionKey": 61, + "MessageType_ECDHSessionKey": 62, + "MessageType_SetU2FCounter": 63, + "MessageType_EthereumSignMessage": 64, + "MessageType_EthereumVerifyMessage": 65, + "MessageType_EthereumMessageSignature": 66, + "MessageType_DebugLinkDecision": 100, + "MessageType_DebugLinkGetState": 101, + "MessageType_DebugLinkState": 102, + "MessageType_DebugLinkStop": 103, + "MessageType_DebugLinkLog": 104, + "MessageType_DebugLinkMemoryRead": 110, + "MessageType_DebugLinkMemory": 111, + "MessageType_DebugLinkMemoryWrite": 112, + "MessageType_DebugLinkFlashErase": 113, +} + +func (x MessageType) Enum() *MessageType { + p := new(MessageType) + *p = x + return p +} +func (x MessageType) String() string { + return proto.EnumName(MessageType_name, int32(x)) +} +func (x *MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MessageType_value, data, "MessageType") + if err != nil { + return err + } + *x = MessageType(value) + return nil +} +func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } + +// * +// Request: Reset device to default state and ask for device details +// @next Features +type Initialize struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Initialize) Reset() { *m = Initialize{} } +func (m *Initialize) String() string { return proto.CompactTextString(m) } +func (*Initialize) ProtoMessage() {} +func (*Initialize) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } + +// * +// Request: Ask for device details (no device reset) +// @next Features +type GetFeatures struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetFeatures) Reset() { *m = GetFeatures{} } +func (m *GetFeatures) String() string { return proto.CompactTextString(m) } +func (*GetFeatures) ProtoMessage() {} +func (*GetFeatures) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} } + +// * +// Response: Reports various information about the device +// @prev Initialize +// @prev GetFeatures +type Features struct { + Vendor *string `protobuf:"bytes,1,opt,name=vendor" json:"vendor,omitempty"` + MajorVersion *uint32 `protobuf:"varint,2,opt,name=major_version,json=majorVersion" json:"major_version,omitempty"` + MinorVersion *uint32 `protobuf:"varint,3,opt,name=minor_version,json=minorVersion" json:"minor_version,omitempty"` + PatchVersion *uint32 `protobuf:"varint,4,opt,name=patch_version,json=patchVersion" json:"patch_version,omitempty"` + BootloaderMode *bool `protobuf:"varint,5,opt,name=bootloader_mode,json=bootloaderMode" json:"bootloader_mode,omitempty"` + DeviceId *string `protobuf:"bytes,6,opt,name=device_id,json=deviceId" json:"device_id,omitempty"` + PinProtection *bool `protobuf:"varint,7,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + PassphraseProtection *bool `protobuf:"varint,8,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + Language *string `protobuf:"bytes,9,opt,name=language" json:"language,omitempty"` + Label *string `protobuf:"bytes,10,opt,name=label" json:"label,omitempty"` + Coins []*CoinType `protobuf:"bytes,11,rep,name=coins" json:"coins,omitempty"` + Initialized *bool `protobuf:"varint,12,opt,name=initialized" json:"initialized,omitempty"` + Revision []byte `protobuf:"bytes,13,opt,name=revision" json:"revision,omitempty"` + BootloaderHash []byte `protobuf:"bytes,14,opt,name=bootloader_hash,json=bootloaderHash" json:"bootloader_hash,omitempty"` + Imported *bool `protobuf:"varint,15,opt,name=imported" json:"imported,omitempty"` + PinCached *bool `protobuf:"varint,16,opt,name=pin_cached,json=pinCached" json:"pin_cached,omitempty"` + PassphraseCached *bool `protobuf:"varint,17,opt,name=passphrase_cached,json=passphraseCached" json:"passphrase_cached,omitempty"` + FirmwarePresent *bool `protobuf:"varint,18,opt,name=firmware_present,json=firmwarePresent" json:"firmware_present,omitempty"` + NeedsBackup *bool `protobuf:"varint,19,opt,name=needs_backup,json=needsBackup" json:"needs_backup,omitempty"` + Flags *uint32 `protobuf:"varint,20,opt,name=flags" json:"flags,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Features) Reset() { *m = Features{} } +func (m *Features) String() string { return proto.CompactTextString(m) } +func (*Features) ProtoMessage() {} +func (*Features) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} } + +func (m *Features) GetVendor() string { + if m != nil && m.Vendor != nil { + return *m.Vendor + } + return "" +} + +func (m *Features) GetMajorVersion() uint32 { + if m != nil && m.MajorVersion != nil { + return *m.MajorVersion + } + return 0 +} + +func (m *Features) GetMinorVersion() uint32 { + if m != nil && m.MinorVersion != nil { + return *m.MinorVersion + } + return 0 +} + +func (m *Features) GetPatchVersion() uint32 { + if m != nil && m.PatchVersion != nil { + return *m.PatchVersion + } + return 0 +} + +func (m *Features) GetBootloaderMode() bool { + if m != nil && m.BootloaderMode != nil { + return *m.BootloaderMode + } + return false +} + +func (m *Features) GetDeviceId() string { + if m != nil && m.DeviceId != nil { + return *m.DeviceId + } + return "" +} + +func (m *Features) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *Features) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *Features) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return "" +} + +func (m *Features) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *Features) GetCoins() []*CoinType { + if m != nil { + return m.Coins + } + return nil +} + +func (m *Features) GetInitialized() bool { + if m != nil && m.Initialized != nil { + return *m.Initialized + } + return false +} + +func (m *Features) GetRevision() []byte { + if m != nil { + return m.Revision + } + return nil +} + +func (m *Features) GetBootloaderHash() []byte { + if m != nil { + return m.BootloaderHash + } + return nil +} + +func (m *Features) GetImported() bool { + if m != nil && m.Imported != nil { + return *m.Imported + } + return false +} + +func (m *Features) GetPinCached() bool { + if m != nil && m.PinCached != nil { + return *m.PinCached + } + return false +} + +func (m *Features) GetPassphraseCached() bool { + if m != nil && m.PassphraseCached != nil { + return *m.PassphraseCached + } + return false +} + +func (m *Features) GetFirmwarePresent() bool { + if m != nil && m.FirmwarePresent != nil { + return *m.FirmwarePresent + } + return false +} + +func (m *Features) GetNeedsBackup() bool { + if m != nil && m.NeedsBackup != nil { + return *m.NeedsBackup + } + return false +} + +func (m *Features) GetFlags() uint32 { + if m != nil && m.Flags != nil { + return *m.Flags + } + return 0 +} + +// * +// Request: clear session (removes cached PIN, passphrase, etc). +// @next Success +type ClearSession struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *ClearSession) Reset() { *m = ClearSession{} } +func (m *ClearSession) String() string { return proto.CompactTextString(m) } +func (*ClearSession) ProtoMessage() {} +func (*ClearSession) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} } + +// * +// Request: change language and/or label of the device +// @next Success +// @next Failure +// @next ButtonRequest +// @next PinMatrixRequest +type ApplySettings struct { + Language *string `protobuf:"bytes,1,opt,name=language" json:"language,omitempty"` + Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` + UsePassphrase *bool `protobuf:"varint,3,opt,name=use_passphrase,json=usePassphrase" json:"use_passphrase,omitempty"` + Homescreen []byte `protobuf:"bytes,4,opt,name=homescreen" json:"homescreen,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ApplySettings) Reset() { *m = ApplySettings{} } +func (m *ApplySettings) String() string { return proto.CompactTextString(m) } +func (*ApplySettings) ProtoMessage() {} +func (*ApplySettings) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} } + +func (m *ApplySettings) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return "" +} + +func (m *ApplySettings) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *ApplySettings) GetUsePassphrase() bool { + if m != nil && m.UsePassphrase != nil { + return *m.UsePassphrase + } + return false +} + +func (m *ApplySettings) GetHomescreen() []byte { + if m != nil { + return m.Homescreen + } + return nil +} + +// * +// Request: set flags of the device +// @next Success +// @next Failure +type ApplyFlags struct { + Flags *uint32 `protobuf:"varint,1,opt,name=flags" json:"flags,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ApplyFlags) Reset() { *m = ApplyFlags{} } +func (m *ApplyFlags) String() string { return proto.CompactTextString(m) } +func (*ApplyFlags) ProtoMessage() {} +func (*ApplyFlags) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} } + +func (m *ApplyFlags) GetFlags() uint32 { + if m != nil && m.Flags != nil { + return *m.Flags + } + return 0 +} + +// * +// Request: Starts workflow for setting/changing/removing the PIN +// @next ButtonRequest +// @next PinMatrixRequest +type ChangePin struct { + Remove *bool `protobuf:"varint,1,opt,name=remove" json:"remove,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ChangePin) Reset() { *m = ChangePin{} } +func (m *ChangePin) String() string { return proto.CompactTextString(m) } +func (*ChangePin) ProtoMessage() {} +func (*ChangePin) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} } + +func (m *ChangePin) GetRemove() bool { + if m != nil && m.Remove != nil { + return *m.Remove + } + return false +} + +// * +// Request: Test if the device is alive, device sends back the message in Success response +// @next Success +type Ping struct { + Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + ButtonProtection *bool `protobuf:"varint,2,opt,name=button_protection,json=buttonProtection" json:"button_protection,omitempty"` + PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Ping) Reset() { *m = Ping{} } +func (m *Ping) String() string { return proto.CompactTextString(m) } +func (*Ping) ProtoMessage() {} +func (*Ping) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} } + +func (m *Ping) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *Ping) GetButtonProtection() bool { + if m != nil && m.ButtonProtection != nil { + return *m.ButtonProtection + } + return false +} + +func (m *Ping) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *Ping) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +// * +// Response: Success of the previous request +type Success struct { + Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Success) Reset() { *m = Success{} } +func (m *Success) String() string { return proto.CompactTextString(m) } +func (*Success) ProtoMessage() {} +func (*Success) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} } + +func (m *Success) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +// * +// Response: Failure of the previous request +type Failure struct { + Code *FailureType `protobuf:"varint,1,opt,name=code,enum=FailureType" json:"code,omitempty"` + Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Failure) Reset() { *m = Failure{} } +func (m *Failure) String() string { return proto.CompactTextString(m) } +func (*Failure) ProtoMessage() {} +func (*Failure) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} } + +func (m *Failure) GetCode() FailureType { + if m != nil && m.Code != nil { + return *m.Code + } + return FailureType_Failure_UnexpectedMessage +} + +func (m *Failure) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +// * +// Response: Device is waiting for HW button press. +// @next ButtonAck +// @next Cancel +type ButtonRequest struct { + Code *ButtonRequestType `protobuf:"varint,1,opt,name=code,enum=ButtonRequestType" json:"code,omitempty"` + Data *string `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ButtonRequest) Reset() { *m = ButtonRequest{} } +func (m *ButtonRequest) String() string { return proto.CompactTextString(m) } +func (*ButtonRequest) ProtoMessage() {} +func (*ButtonRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} } + +func (m *ButtonRequest) GetCode() ButtonRequestType { + if m != nil && m.Code != nil { + return *m.Code + } + return ButtonRequestType_ButtonRequest_Other +} + +func (m *ButtonRequest) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +// * +// Request: Computer agrees to wait for HW button press +// @prev ButtonRequest +type ButtonAck struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *ButtonAck) Reset() { *m = ButtonAck{} } +func (m *ButtonAck) String() string { return proto.CompactTextString(m) } +func (*ButtonAck) ProtoMessage() {} +func (*ButtonAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{11} } + +// * +// Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme +// @next PinMatrixAck +// @next Cancel +type PinMatrixRequest struct { + Type *PinMatrixRequestType `protobuf:"varint,1,opt,name=type,enum=PinMatrixRequestType" json:"type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PinMatrixRequest) Reset() { *m = PinMatrixRequest{} } +func (m *PinMatrixRequest) String() string { return proto.CompactTextString(m) } +func (*PinMatrixRequest) ProtoMessage() {} +func (*PinMatrixRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{12} } + +func (m *PinMatrixRequest) GetType() PinMatrixRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return PinMatrixRequestType_PinMatrixRequestType_Current +} + +// * +// Request: Computer responds with encoded PIN +// @prev PinMatrixRequest +type PinMatrixAck struct { + Pin *string `protobuf:"bytes,1,req,name=pin" json:"pin,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PinMatrixAck) Reset() { *m = PinMatrixAck{} } +func (m *PinMatrixAck) String() string { return proto.CompactTextString(m) } +func (*PinMatrixAck) ProtoMessage() {} +func (*PinMatrixAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{13} } + +func (m *PinMatrixAck) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +// * +// Request: Abort last operation that required user interaction +// @prev ButtonRequest +// @prev PinMatrixRequest +// @prev PassphraseRequest +type Cancel struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cancel) Reset() { *m = Cancel{} } +func (m *Cancel) String() string { return proto.CompactTextString(m) } +func (*Cancel) ProtoMessage() {} +func (*Cancel) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{14} } + +// * +// Response: Device awaits encryption passphrase +// @next PassphraseAck +// @next Cancel +type PassphraseRequest struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *PassphraseRequest) Reset() { *m = PassphraseRequest{} } +func (m *PassphraseRequest) String() string { return proto.CompactTextString(m) } +func (*PassphraseRequest) ProtoMessage() {} +func (*PassphraseRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{15} } + +// * +// Request: Send passphrase back +// @prev PassphraseRequest +type PassphraseAck struct { + Passphrase *string `protobuf:"bytes,1,req,name=passphrase" json:"passphrase,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PassphraseAck) Reset() { *m = PassphraseAck{} } +func (m *PassphraseAck) String() string { return proto.CompactTextString(m) } +func (*PassphraseAck) ProtoMessage() {} +func (*PassphraseAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{16} } + +func (m *PassphraseAck) GetPassphrase() string { + if m != nil && m.Passphrase != nil { + return *m.Passphrase + } + return "" +} + +// * +// Request: Request a sample of random data generated by hardware RNG. May be used for testing. +// @next ButtonRequest +// @next Entropy +// @next Failure +type GetEntropy struct { + Size *uint32 `protobuf:"varint,1,req,name=size" json:"size,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetEntropy) Reset() { *m = GetEntropy{} } +func (m *GetEntropy) String() string { return proto.CompactTextString(m) } +func (*GetEntropy) ProtoMessage() {} +func (*GetEntropy) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{17} } + +func (m *GetEntropy) GetSize() uint32 { + if m != nil && m.Size != nil { + return *m.Size + } + return 0 +} + +// * +// Response: Reply with random data generated by internal RNG +// @prev GetEntropy +type Entropy struct { + Entropy []byte `protobuf:"bytes,1,req,name=entropy" json:"entropy,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Entropy) Reset() { *m = Entropy{} } +func (m *Entropy) String() string { return proto.CompactTextString(m) } +func (*Entropy) ProtoMessage() {} +func (*Entropy) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{18} } + +func (m *Entropy) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +// * +// Request: Ask device for public key corresponding to address_n path +// @next PassphraseRequest +// @next PublicKey +// @next Failure +type GetPublicKey struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + EcdsaCurveName *string `protobuf:"bytes,2,opt,name=ecdsa_curve_name,json=ecdsaCurveName" json:"ecdsa_curve_name,omitempty"` + ShowDisplay *bool `protobuf:"varint,3,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` + CoinName *string `protobuf:"bytes,4,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetPublicKey) Reset() { *m = GetPublicKey{} } +func (m *GetPublicKey) String() string { return proto.CompactTextString(m) } +func (*GetPublicKey) ProtoMessage() {} +func (*GetPublicKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{19} } + +const Default_GetPublicKey_CoinName string = "Bitcoin" + +func (m *GetPublicKey) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *GetPublicKey) GetEcdsaCurveName() string { + if m != nil && m.EcdsaCurveName != nil { + return *m.EcdsaCurveName + } + return "" +} + +func (m *GetPublicKey) GetShowDisplay() bool { + if m != nil && m.ShowDisplay != nil { + return *m.ShowDisplay + } + return false +} + +func (m *GetPublicKey) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_GetPublicKey_CoinName +} + +// * +// Response: Contains public key derived from device private seed +// @prev GetPublicKey +type PublicKey struct { + Node *HDNodeType `protobuf:"bytes,1,req,name=node" json:"node,omitempty"` + Xpub *string `protobuf:"bytes,2,opt,name=xpub" json:"xpub,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PublicKey) Reset() { *m = PublicKey{} } +func (m *PublicKey) String() string { return proto.CompactTextString(m) } +func (*PublicKey) ProtoMessage() {} +func (*PublicKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{20} } + +func (m *PublicKey) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *PublicKey) GetXpub() string { + if m != nil && m.Xpub != nil { + return *m.Xpub + } + return "" +} + +// * +// Request: Ask device for address corresponding to address_n path +// @next PassphraseRequest +// @next Address +// @next Failure +type GetAddress struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + CoinName *string `protobuf:"bytes,2,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + ShowDisplay *bool `protobuf:"varint,3,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` + Multisig *MultisigRedeemScriptType `protobuf:"bytes,4,opt,name=multisig" json:"multisig,omitempty"` + ScriptType *InputScriptType `protobuf:"varint,5,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetAddress) Reset() { *m = GetAddress{} } +func (m *GetAddress) String() string { return proto.CompactTextString(m) } +func (*GetAddress) ProtoMessage() {} +func (*GetAddress) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{21} } + +const Default_GetAddress_CoinName string = "Bitcoin" +const Default_GetAddress_ScriptType InputScriptType = InputScriptType_SPENDADDRESS + +func (m *GetAddress) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *GetAddress) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_GetAddress_CoinName +} + +func (m *GetAddress) GetShowDisplay() bool { + if m != nil && m.ShowDisplay != nil { + return *m.ShowDisplay + } + return false +} + +func (m *GetAddress) GetMultisig() *MultisigRedeemScriptType { + if m != nil { + return m.Multisig + } + return nil +} + +func (m *GetAddress) GetScriptType() InputScriptType { + if m != nil && m.ScriptType != nil { + return *m.ScriptType + } + return Default_GetAddress_ScriptType +} + +// * +// Request: Ask device for Ethereum address corresponding to address_n path +// @next PassphraseRequest +// @next EthereumAddress +// @next Failure +type EthereumGetAddress struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + ShowDisplay *bool `protobuf:"varint,2,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumGetAddress) Reset() { *m = EthereumGetAddress{} } +func (m *EthereumGetAddress) String() string { return proto.CompactTextString(m) } +func (*EthereumGetAddress) ProtoMessage() {} +func (*EthereumGetAddress) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{22} } + +func (m *EthereumGetAddress) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumGetAddress) GetShowDisplay() bool { + if m != nil && m.ShowDisplay != nil { + return *m.ShowDisplay + } + return false +} + +// * +// Response: Contains address derived from device private seed +// @prev GetAddress +type Address struct { + Address *string `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Address) Reset() { *m = Address{} } +func (m *Address) String() string { return proto.CompactTextString(m) } +func (*Address) ProtoMessage() {} +func (*Address) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{23} } + +func (m *Address) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +// * +// Response: Contains an Ethereum address derived from device private seed +// @prev EthereumGetAddress +type EthereumAddress struct { + Address []byte `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumAddress) Reset() { *m = EthereumAddress{} } +func (m *EthereumAddress) String() string { return proto.CompactTextString(m) } +func (*EthereumAddress) ProtoMessage() {} +func (*EthereumAddress) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{24} } + +func (m *EthereumAddress) GetAddress() []byte { + if m != nil { + return m.Address + } + return nil +} + +// * +// Request: Request device to wipe all sensitive data and settings +// @next ButtonRequest +type WipeDevice struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *WipeDevice) Reset() { *m = WipeDevice{} } +func (m *WipeDevice) String() string { return proto.CompactTextString(m) } +func (*WipeDevice) ProtoMessage() {} +func (*WipeDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{25} } + +// * +// Request: Load seed and related internal settings from the computer +// @next ButtonRequest +// @next Success +// @next Failure +type LoadDevice struct { + Mnemonic *string `protobuf:"bytes,1,opt,name=mnemonic" json:"mnemonic,omitempty"` + Node *HDNodeType `protobuf:"bytes,2,opt,name=node" json:"node,omitempty"` + Pin *string `protobuf:"bytes,3,opt,name=pin" json:"pin,omitempty"` + PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` + SkipChecksum *bool `protobuf:"varint,7,opt,name=skip_checksum,json=skipChecksum" json:"skip_checksum,omitempty"` + U2FCounter *uint32 `protobuf:"varint,8,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LoadDevice) Reset() { *m = LoadDevice{} } +func (m *LoadDevice) String() string { return proto.CompactTextString(m) } +func (*LoadDevice) ProtoMessage() {} +func (*LoadDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{26} } + +const Default_LoadDevice_Language string = "english" + +func (m *LoadDevice) GetMnemonic() string { + if m != nil && m.Mnemonic != nil { + return *m.Mnemonic + } + return "" +} + +func (m *LoadDevice) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *LoadDevice) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +func (m *LoadDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *LoadDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_LoadDevice_Language +} + +func (m *LoadDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *LoadDevice) GetSkipChecksum() bool { + if m != nil && m.SkipChecksum != nil { + return *m.SkipChecksum + } + return false +} + +func (m *LoadDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +// * +// Request: Ask device to do initialization involving user interaction +// @next EntropyRequest +// @next Failure +type ResetDevice struct { + DisplayRandom *bool `protobuf:"varint,1,opt,name=display_random,json=displayRandom" json:"display_random,omitempty"` + Strength *uint32 `protobuf:"varint,2,opt,name=strength,def=256" json:"strength,omitempty"` + PassphraseProtection *bool `protobuf:"varint,3,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + PinProtection *bool `protobuf:"varint,4,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` + U2FCounter *uint32 `protobuf:"varint,7,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + SkipBackup *bool `protobuf:"varint,8,opt,name=skip_backup,json=skipBackup" json:"skip_backup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ResetDevice) Reset() { *m = ResetDevice{} } +func (m *ResetDevice) String() string { return proto.CompactTextString(m) } +func (*ResetDevice) ProtoMessage() {} +func (*ResetDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{27} } + +const Default_ResetDevice_Strength uint32 = 256 +const Default_ResetDevice_Language string = "english" + +func (m *ResetDevice) GetDisplayRandom() bool { + if m != nil && m.DisplayRandom != nil { + return *m.DisplayRandom + } + return false +} + +func (m *ResetDevice) GetStrength() uint32 { + if m != nil && m.Strength != nil { + return *m.Strength + } + return Default_ResetDevice_Strength +} + +func (m *ResetDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *ResetDevice) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *ResetDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_ResetDevice_Language +} + +func (m *ResetDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *ResetDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func (m *ResetDevice) GetSkipBackup() bool { + if m != nil && m.SkipBackup != nil { + return *m.SkipBackup + } + return false +} + +// * +// Request: Perform backup of the device seed if not backed up using ResetDevice +// @next ButtonRequest +type BackupDevice struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *BackupDevice) Reset() { *m = BackupDevice{} } +func (m *BackupDevice) String() string { return proto.CompactTextString(m) } +func (*BackupDevice) ProtoMessage() {} +func (*BackupDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{28} } + +// * +// Response: Ask for additional entropy from host computer +// @prev ResetDevice +// @next EntropyAck +type EntropyRequest struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *EntropyRequest) Reset() { *m = EntropyRequest{} } +func (m *EntropyRequest) String() string { return proto.CompactTextString(m) } +func (*EntropyRequest) ProtoMessage() {} +func (*EntropyRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{29} } + +// * +// Request: Provide additional entropy for seed generation function +// @prev EntropyRequest +// @next ButtonRequest +type EntropyAck struct { + Entropy []byte `protobuf:"bytes,1,opt,name=entropy" json:"entropy,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EntropyAck) Reset() { *m = EntropyAck{} } +func (m *EntropyAck) String() string { return proto.CompactTextString(m) } +func (*EntropyAck) ProtoMessage() {} +func (*EntropyAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{30} } + +func (m *EntropyAck) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +// * +// Request: Start recovery workflow asking user for specific words of mnemonic +// Used to recovery device safely even on untrusted computer. +// @next WordRequest +type RecoveryDevice struct { + WordCount *uint32 `protobuf:"varint,1,opt,name=word_count,json=wordCount" json:"word_count,omitempty"` + PassphraseProtection *bool `protobuf:"varint,2,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + Language *string `protobuf:"bytes,4,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,5,opt,name=label" json:"label,omitempty"` + EnforceWordlist *bool `protobuf:"varint,6,opt,name=enforce_wordlist,json=enforceWordlist" json:"enforce_wordlist,omitempty"` + // 7 reserved for unused recovery method + Type *uint32 `protobuf:"varint,8,opt,name=type" json:"type,omitempty"` + U2FCounter *uint32 `protobuf:"varint,9,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + DryRun *bool `protobuf:"varint,10,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RecoveryDevice) Reset() { *m = RecoveryDevice{} } +func (m *RecoveryDevice) String() string { return proto.CompactTextString(m) } +func (*RecoveryDevice) ProtoMessage() {} +func (*RecoveryDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{31} } + +const Default_RecoveryDevice_Language string = "english" + +func (m *RecoveryDevice) GetWordCount() uint32 { + if m != nil && m.WordCount != nil { + return *m.WordCount + } + return 0 +} + +func (m *RecoveryDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *RecoveryDevice) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *RecoveryDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_RecoveryDevice_Language +} + +func (m *RecoveryDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *RecoveryDevice) GetEnforceWordlist() bool { + if m != nil && m.EnforceWordlist != nil { + return *m.EnforceWordlist + } + return false +} + +func (m *RecoveryDevice) GetType() uint32 { + if m != nil && m.Type != nil { + return *m.Type + } + return 0 +} + +func (m *RecoveryDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func (m *RecoveryDevice) GetDryRun() bool { + if m != nil && m.DryRun != nil { + return *m.DryRun + } + return false +} + +// * +// Response: Device is waiting for user to enter word of the mnemonic +// Its position is shown only on device's internal display. +// @prev RecoveryDevice +// @prev WordAck +type WordRequest struct { + Type *WordRequestType `protobuf:"varint,1,opt,name=type,enum=WordRequestType" json:"type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *WordRequest) Reset() { *m = WordRequest{} } +func (m *WordRequest) String() string { return proto.CompactTextString(m) } +func (*WordRequest) ProtoMessage() {} +func (*WordRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{32} } + +func (m *WordRequest) GetType() WordRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return WordRequestType_WordRequestType_Plain +} + +// * +// Request: Computer replies with word from the mnemonic +// @prev WordRequest +// @next WordRequest +// @next Success +// @next Failure +type WordAck struct { + Word *string `protobuf:"bytes,1,req,name=word" json:"word,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *WordAck) Reset() { *m = WordAck{} } +func (m *WordAck) String() string { return proto.CompactTextString(m) } +func (*WordAck) ProtoMessage() {} +func (*WordAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{33} } + +func (m *WordAck) GetWord() string { + if m != nil && m.Word != nil { + return *m.Word + } + return "" +} + +// * +// Request: Ask device to sign message +// @next MessageSignature +// @next Failure +type SignMessage struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Message []byte `protobuf:"bytes,2,req,name=message" json:"message,omitempty"` + CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + ScriptType *InputScriptType `protobuf:"varint,4,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SignMessage) Reset() { *m = SignMessage{} } +func (m *SignMessage) String() string { return proto.CompactTextString(m) } +func (*SignMessage) ProtoMessage() {} +func (*SignMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{34} } + +const Default_SignMessage_CoinName string = "Bitcoin" +const Default_SignMessage_ScriptType InputScriptType = InputScriptType_SPENDADDRESS + +func (m *SignMessage) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *SignMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *SignMessage) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_SignMessage_CoinName +} + +func (m *SignMessage) GetScriptType() InputScriptType { + if m != nil && m.ScriptType != nil { + return *m.ScriptType + } + return Default_SignMessage_ScriptType +} + +// * +// Request: Ask device to verify message +// @next Success +// @next Failure +type VerifyMessage struct { + Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + CoinName *string `protobuf:"bytes,4,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *VerifyMessage) Reset() { *m = VerifyMessage{} } +func (m *VerifyMessage) String() string { return proto.CompactTextString(m) } +func (*VerifyMessage) ProtoMessage() {} +func (*VerifyMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{35} } + +const Default_VerifyMessage_CoinName string = "Bitcoin" + +func (m *VerifyMessage) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *VerifyMessage) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *VerifyMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *VerifyMessage) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_VerifyMessage_CoinName +} + +// * +// Response: Signed message +// @prev SignMessage +type MessageSignature struct { + Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageSignature) Reset() { *m = MessageSignature{} } +func (m *MessageSignature) String() string { return proto.CompactTextString(m) } +func (*MessageSignature) ProtoMessage() {} +func (*MessageSignature) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{36} } + +func (m *MessageSignature) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *MessageSignature) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +// * +// Request: Ask device to encrypt message +// @next EncryptedMessage +// @next Failure +type EncryptMessage struct { + Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey" json:"pubkey,omitempty"` + Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + DisplayOnly *bool `protobuf:"varint,3,opt,name=display_only,json=displayOnly" json:"display_only,omitempty"` + AddressN []uint32 `protobuf:"varint,4,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + CoinName *string `protobuf:"bytes,5,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EncryptMessage) Reset() { *m = EncryptMessage{} } +func (m *EncryptMessage) String() string { return proto.CompactTextString(m) } +func (*EncryptMessage) ProtoMessage() {} +func (*EncryptMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{37} } + +const Default_EncryptMessage_CoinName string = "Bitcoin" + +func (m *EncryptMessage) GetPubkey() []byte { + if m != nil { + return m.Pubkey + } + return nil +} + +func (m *EncryptMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *EncryptMessage) GetDisplayOnly() bool { + if m != nil && m.DisplayOnly != nil { + return *m.DisplayOnly + } + return false +} + +func (m *EncryptMessage) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EncryptMessage) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_EncryptMessage_CoinName +} + +// * +// Response: Encrypted message +// @prev EncryptMessage +type EncryptedMessage struct { + Nonce []byte `protobuf:"bytes,1,opt,name=nonce" json:"nonce,omitempty"` + Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + Hmac []byte `protobuf:"bytes,3,opt,name=hmac" json:"hmac,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EncryptedMessage) Reset() { *m = EncryptedMessage{} } +func (m *EncryptedMessage) String() string { return proto.CompactTextString(m) } +func (*EncryptedMessage) ProtoMessage() {} +func (*EncryptedMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{38} } + +func (m *EncryptedMessage) GetNonce() []byte { + if m != nil { + return m.Nonce + } + return nil +} + +func (m *EncryptedMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *EncryptedMessage) GetHmac() []byte { + if m != nil { + return m.Hmac + } + return nil +} + +// * +// Request: Ask device to decrypt message +// @next Success +// @next Failure +type DecryptMessage struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Nonce []byte `protobuf:"bytes,2,opt,name=nonce" json:"nonce,omitempty"` + Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + Hmac []byte `protobuf:"bytes,4,opt,name=hmac" json:"hmac,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DecryptMessage) Reset() { *m = DecryptMessage{} } +func (m *DecryptMessage) String() string { return proto.CompactTextString(m) } +func (*DecryptMessage) ProtoMessage() {} +func (*DecryptMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{39} } + +func (m *DecryptMessage) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *DecryptMessage) GetNonce() []byte { + if m != nil { + return m.Nonce + } + return nil +} + +func (m *DecryptMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *DecryptMessage) GetHmac() []byte { + if m != nil { + return m.Hmac + } + return nil +} + +// * +// Response: Decrypted message +// @prev DecryptedMessage +type DecryptedMessage struct { + Message []byte `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + Address *string `protobuf:"bytes,2,opt,name=address" json:"address,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DecryptedMessage) Reset() { *m = DecryptedMessage{} } +func (m *DecryptedMessage) String() string { return proto.CompactTextString(m) } +func (*DecryptedMessage) ProtoMessage() {} +func (*DecryptedMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{40} } + +func (m *DecryptedMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *DecryptedMessage) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +// * +// Request: Ask device to encrypt or decrypt value of given key +// @next CipheredKeyValue +// @next Failure +type CipherKeyValue struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Encrypt *bool `protobuf:"varint,4,opt,name=encrypt" json:"encrypt,omitempty"` + AskOnEncrypt *bool `protobuf:"varint,5,opt,name=ask_on_encrypt,json=askOnEncrypt" json:"ask_on_encrypt,omitempty"` + AskOnDecrypt *bool `protobuf:"varint,6,opt,name=ask_on_decrypt,json=askOnDecrypt" json:"ask_on_decrypt,omitempty"` + Iv []byte `protobuf:"bytes,7,opt,name=iv" json:"iv,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CipherKeyValue) Reset() { *m = CipherKeyValue{} } +func (m *CipherKeyValue) String() string { return proto.CompactTextString(m) } +func (*CipherKeyValue) ProtoMessage() {} +func (*CipherKeyValue) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{41} } + +func (m *CipherKeyValue) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *CipherKeyValue) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *CipherKeyValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *CipherKeyValue) GetEncrypt() bool { + if m != nil && m.Encrypt != nil { + return *m.Encrypt + } + return false +} + +func (m *CipherKeyValue) GetAskOnEncrypt() bool { + if m != nil && m.AskOnEncrypt != nil { + return *m.AskOnEncrypt + } + return false +} + +func (m *CipherKeyValue) GetAskOnDecrypt() bool { + if m != nil && m.AskOnDecrypt != nil { + return *m.AskOnDecrypt + } + return false +} + +func (m *CipherKeyValue) GetIv() []byte { + if m != nil { + return m.Iv + } + return nil +} + +// * +// Response: Return ciphered/deciphered value +// @prev CipherKeyValue +type CipheredKeyValue struct { + Value []byte `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CipheredKeyValue) Reset() { *m = CipheredKeyValue{} } +func (m *CipheredKeyValue) String() string { return proto.CompactTextString(m) } +func (*CipheredKeyValue) ProtoMessage() {} +func (*CipheredKeyValue) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{42} } + +func (m *CipheredKeyValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +// * +// Request: Estimated size of the transaction +// This behaves exactly like SignTx, which means that it can ask using TxRequest +// This call is non-blocking (except possible PassphraseRequest to unlock the seed) +// @next TxSize +// @next Failure +type EstimateTxSize struct { + OutputsCount *uint32 `protobuf:"varint,1,req,name=outputs_count,json=outputsCount" json:"outputs_count,omitempty"` + InputsCount *uint32 `protobuf:"varint,2,req,name=inputs_count,json=inputsCount" json:"inputs_count,omitempty"` + CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EstimateTxSize) Reset() { *m = EstimateTxSize{} } +func (m *EstimateTxSize) String() string { return proto.CompactTextString(m) } +func (*EstimateTxSize) ProtoMessage() {} +func (*EstimateTxSize) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{43} } + +const Default_EstimateTxSize_CoinName string = "Bitcoin" + +func (m *EstimateTxSize) GetOutputsCount() uint32 { + if m != nil && m.OutputsCount != nil { + return *m.OutputsCount + } + return 0 +} + +func (m *EstimateTxSize) GetInputsCount() uint32 { + if m != nil && m.InputsCount != nil { + return *m.InputsCount + } + return 0 +} + +func (m *EstimateTxSize) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_EstimateTxSize_CoinName +} + +// * +// Response: Estimated size of the transaction +// @prev EstimateTxSize +type TxSize struct { + TxSize *uint32 `protobuf:"varint,1,opt,name=tx_size,json=txSize" json:"tx_size,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxSize) Reset() { *m = TxSize{} } +func (m *TxSize) String() string { return proto.CompactTextString(m) } +func (*TxSize) ProtoMessage() {} +func (*TxSize) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{44} } + +func (m *TxSize) GetTxSize() uint32 { + if m != nil && m.TxSize != nil { + return *m.TxSize + } + return 0 +} + +// * +// Request: Ask device to sign transaction +// @next PassphraseRequest +// @next PinMatrixRequest +// @next TxRequest +// @next Failure +type SignTx struct { + OutputsCount *uint32 `protobuf:"varint,1,req,name=outputs_count,json=outputsCount" json:"outputs_count,omitempty"` + InputsCount *uint32 `protobuf:"varint,2,req,name=inputs_count,json=inputsCount" json:"inputs_count,omitempty"` + CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + Version *uint32 `protobuf:"varint,4,opt,name=version,def=1" json:"version,omitempty"` + LockTime *uint32 `protobuf:"varint,5,opt,name=lock_time,json=lockTime,def=0" json:"lock_time,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SignTx) Reset() { *m = SignTx{} } +func (m *SignTx) String() string { return proto.CompactTextString(m) } +func (*SignTx) ProtoMessage() {} +func (*SignTx) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{45} } + +const Default_SignTx_CoinName string = "Bitcoin" +const Default_SignTx_Version uint32 = 1 +const Default_SignTx_LockTime uint32 = 0 + +func (m *SignTx) GetOutputsCount() uint32 { + if m != nil && m.OutputsCount != nil { + return *m.OutputsCount + } + return 0 +} + +func (m *SignTx) GetInputsCount() uint32 { + if m != nil && m.InputsCount != nil { + return *m.InputsCount + } + return 0 +} + +func (m *SignTx) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_SignTx_CoinName +} + +func (m *SignTx) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return Default_SignTx_Version +} + +func (m *SignTx) GetLockTime() uint32 { + if m != nil && m.LockTime != nil { + return *m.LockTime + } + return Default_SignTx_LockTime +} + +// * +// Request: Simplified transaction signing +// This method doesn't support streaming, so there are hardware limits in number of inputs and outputs. +// In case of success, the result is returned using TxRequest message. +// @next PassphraseRequest +// @next PinMatrixRequest +// @next TxRequest +// @next Failure +type SimpleSignTx struct { + Inputs []*TxInputType `protobuf:"bytes,1,rep,name=inputs" json:"inputs,omitempty"` + Outputs []*TxOutputType `protobuf:"bytes,2,rep,name=outputs" json:"outputs,omitempty"` + Transactions []*TransactionType `protobuf:"bytes,3,rep,name=transactions" json:"transactions,omitempty"` + CoinName *string `protobuf:"bytes,4,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` + Version *uint32 `protobuf:"varint,5,opt,name=version,def=1" json:"version,omitempty"` + LockTime *uint32 `protobuf:"varint,6,opt,name=lock_time,json=lockTime,def=0" json:"lock_time,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SimpleSignTx) Reset() { *m = SimpleSignTx{} } +func (m *SimpleSignTx) String() string { return proto.CompactTextString(m) } +func (*SimpleSignTx) ProtoMessage() {} +func (*SimpleSignTx) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{46} } + +const Default_SimpleSignTx_CoinName string = "Bitcoin" +const Default_SimpleSignTx_Version uint32 = 1 +const Default_SimpleSignTx_LockTime uint32 = 0 + +func (m *SimpleSignTx) GetInputs() []*TxInputType { + if m != nil { + return m.Inputs + } + return nil +} + +func (m *SimpleSignTx) GetOutputs() []*TxOutputType { + if m != nil { + return m.Outputs + } + return nil +} + +func (m *SimpleSignTx) GetTransactions() []*TransactionType { + if m != nil { + return m.Transactions + } + return nil +} + +func (m *SimpleSignTx) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_SimpleSignTx_CoinName +} + +func (m *SimpleSignTx) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return Default_SimpleSignTx_Version +} + +func (m *SimpleSignTx) GetLockTime() uint32 { + if m != nil && m.LockTime != nil { + return *m.LockTime + } + return Default_SimpleSignTx_LockTime +} + +// * +// Response: Device asks for information for signing transaction or returns the last result +// If request_index is set, device awaits TxAck message (with fields filled in according to request_type) +// If signature_index is set, 'signature' contains signed input of signature_index's input +// @prev SignTx +// @prev SimpleSignTx +// @prev TxAck +type TxRequest struct { + RequestType *RequestType `protobuf:"varint,1,opt,name=request_type,json=requestType,enum=RequestType" json:"request_type,omitempty"` + Details *TxRequestDetailsType `protobuf:"bytes,2,opt,name=details" json:"details,omitempty"` + Serialized *TxRequestSerializedType `protobuf:"bytes,3,opt,name=serialized" json:"serialized,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxRequest) Reset() { *m = TxRequest{} } +func (m *TxRequest) String() string { return proto.CompactTextString(m) } +func (*TxRequest) ProtoMessage() {} +func (*TxRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{47} } + +func (m *TxRequest) GetRequestType() RequestType { + if m != nil && m.RequestType != nil { + return *m.RequestType + } + return RequestType_TXINPUT +} + +func (m *TxRequest) GetDetails() *TxRequestDetailsType { + if m != nil { + return m.Details + } + return nil +} + +func (m *TxRequest) GetSerialized() *TxRequestSerializedType { + if m != nil { + return m.Serialized + } + return nil +} + +// * +// Request: Reported transaction data +// @prev TxRequest +// @next TxRequest +type TxAck struct { + Tx *TransactionType `protobuf:"bytes,1,opt,name=tx" json:"tx,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxAck) Reset() { *m = TxAck{} } +func (m *TxAck) String() string { return proto.CompactTextString(m) } +func (*TxAck) ProtoMessage() {} +func (*TxAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{48} } + +func (m *TxAck) GetTx() *TransactionType { + if m != nil { + return m.Tx + } + return nil +} + +// * +// Request: Ask device to sign transaction +// All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. +// Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. +// @next PassphraseRequest +// @next PinMatrixRequest +// @next EthereumTxRequest +// @next Failure +type EthereumSignTx struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Nonce []byte `protobuf:"bytes,2,opt,name=nonce" json:"nonce,omitempty"` + GasPrice []byte `protobuf:"bytes,3,opt,name=gas_price,json=gasPrice" json:"gas_price,omitempty"` + GasLimit []byte `protobuf:"bytes,4,opt,name=gas_limit,json=gasLimit" json:"gas_limit,omitempty"` + To []byte `protobuf:"bytes,5,opt,name=to" json:"to,omitempty"` + Value []byte `protobuf:"bytes,6,opt,name=value" json:"value,omitempty"` + DataInitialChunk []byte `protobuf:"bytes,7,opt,name=data_initial_chunk,json=dataInitialChunk" json:"data_initial_chunk,omitempty"` + DataLength *uint32 `protobuf:"varint,8,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` + ChainId *uint32 `protobuf:"varint,9,opt,name=chain_id,json=chainId" json:"chain_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumSignTx) Reset() { *m = EthereumSignTx{} } +func (m *EthereumSignTx) String() string { return proto.CompactTextString(m) } +func (*EthereumSignTx) ProtoMessage() {} +func (*EthereumSignTx) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{49} } + +func (m *EthereumSignTx) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumSignTx) GetNonce() []byte { + if m != nil { + return m.Nonce + } + return nil +} + +func (m *EthereumSignTx) GetGasPrice() []byte { + if m != nil { + return m.GasPrice + } + return nil +} + +func (m *EthereumSignTx) GetGasLimit() []byte { + if m != nil { + return m.GasLimit + } + return nil +} + +func (m *EthereumSignTx) GetTo() []byte { + if m != nil { + return m.To + } + return nil +} + +func (m *EthereumSignTx) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *EthereumSignTx) GetDataInitialChunk() []byte { + if m != nil { + return m.DataInitialChunk + } + return nil +} + +func (m *EthereumSignTx) GetDataLength() uint32 { + if m != nil && m.DataLength != nil { + return *m.DataLength + } + return 0 +} + +func (m *EthereumSignTx) GetChainId() uint32 { + if m != nil && m.ChainId != nil { + return *m.ChainId + } + return 0 +} + +// * +// Response: Device asks for more data from transaction payload, or returns the signature. +// If data_length is set, device awaits that many more bytes of payload. +// Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. +// @prev EthereumSignTx +// @next EthereumTxAck +type EthereumTxRequest struct { + DataLength *uint32 `protobuf:"varint,1,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` + SignatureV *uint32 `protobuf:"varint,2,opt,name=signature_v,json=signatureV" json:"signature_v,omitempty"` + SignatureR []byte `protobuf:"bytes,3,opt,name=signature_r,json=signatureR" json:"signature_r,omitempty"` + SignatureS []byte `protobuf:"bytes,4,opt,name=signature_s,json=signatureS" json:"signature_s,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumTxRequest) Reset() { *m = EthereumTxRequest{} } +func (m *EthereumTxRequest) String() string { return proto.CompactTextString(m) } +func (*EthereumTxRequest) ProtoMessage() {} +func (*EthereumTxRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{50} } + +func (m *EthereumTxRequest) GetDataLength() uint32 { + if m != nil && m.DataLength != nil { + return *m.DataLength + } + return 0 +} + +func (m *EthereumTxRequest) GetSignatureV() uint32 { + if m != nil && m.SignatureV != nil { + return *m.SignatureV + } + return 0 +} + +func (m *EthereumTxRequest) GetSignatureR() []byte { + if m != nil { + return m.SignatureR + } + return nil +} + +func (m *EthereumTxRequest) GetSignatureS() []byte { + if m != nil { + return m.SignatureS + } + return nil +} + +// * +// Request: Transaction payload data. +// @prev EthereumTxRequest +// @next EthereumTxRequest +type EthereumTxAck struct { + DataChunk []byte `protobuf:"bytes,1,opt,name=data_chunk,json=dataChunk" json:"data_chunk,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumTxAck) Reset() { *m = EthereumTxAck{} } +func (m *EthereumTxAck) String() string { return proto.CompactTextString(m) } +func (*EthereumTxAck) ProtoMessage() {} +func (*EthereumTxAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{51} } + +func (m *EthereumTxAck) GetDataChunk() []byte { + if m != nil { + return m.DataChunk + } + return nil +} + +// * +// Request: Ask device to sign message +// @next EthereumMessageSignature +// @next Failure +type EthereumSignMessage struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Message []byte `protobuf:"bytes,2,req,name=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumSignMessage) Reset() { *m = EthereumSignMessage{} } +func (m *EthereumSignMessage) String() string { return proto.CompactTextString(m) } +func (*EthereumSignMessage) ProtoMessage() {} +func (*EthereumSignMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{52} } + +func (m *EthereumSignMessage) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumSignMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +// * +// Request: Ask device to verify message +// @next Success +// @next Failure +type EthereumVerifyMessage struct { + Address []byte `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumVerifyMessage) Reset() { *m = EthereumVerifyMessage{} } +func (m *EthereumVerifyMessage) String() string { return proto.CompactTextString(m) } +func (*EthereumVerifyMessage) ProtoMessage() {} +func (*EthereumVerifyMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{53} } + +func (m *EthereumVerifyMessage) GetAddress() []byte { + if m != nil { + return m.Address + } + return nil +} + +func (m *EthereumVerifyMessage) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *EthereumVerifyMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +// * +// Response: Signed message +// @prev EthereumSignMessage +type EthereumMessageSignature struct { + Address []byte `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EthereumMessageSignature) Reset() { *m = EthereumMessageSignature{} } +func (m *EthereumMessageSignature) String() string { return proto.CompactTextString(m) } +func (*EthereumMessageSignature) ProtoMessage() {} +func (*EthereumMessageSignature) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{54} } + +func (m *EthereumMessageSignature) GetAddress() []byte { + if m != nil { + return m.Address + } + return nil +} + +func (m *EthereumMessageSignature) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +// * +// Request: Ask device to sign identity +// @next SignedIdentity +// @next Failure +type SignIdentity struct { + Identity *IdentityType `protobuf:"bytes,1,opt,name=identity" json:"identity,omitempty"` + ChallengeHidden []byte `protobuf:"bytes,2,opt,name=challenge_hidden,json=challengeHidden" json:"challenge_hidden,omitempty"` + ChallengeVisual *string `protobuf:"bytes,3,opt,name=challenge_visual,json=challengeVisual" json:"challenge_visual,omitempty"` + EcdsaCurveName *string `protobuf:"bytes,4,opt,name=ecdsa_curve_name,json=ecdsaCurveName" json:"ecdsa_curve_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SignIdentity) Reset() { *m = SignIdentity{} } +func (m *SignIdentity) String() string { return proto.CompactTextString(m) } +func (*SignIdentity) ProtoMessage() {} +func (*SignIdentity) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{55} } + +func (m *SignIdentity) GetIdentity() *IdentityType { + if m != nil { + return m.Identity + } + return nil +} + +func (m *SignIdentity) GetChallengeHidden() []byte { + if m != nil { + return m.ChallengeHidden + } + return nil +} + +func (m *SignIdentity) GetChallengeVisual() string { + if m != nil && m.ChallengeVisual != nil { + return *m.ChallengeVisual + } + return "" +} + +func (m *SignIdentity) GetEcdsaCurveName() string { + if m != nil && m.EcdsaCurveName != nil { + return *m.EcdsaCurveName + } + return "" +} + +// * +// Response: Device provides signed identity +// @prev SignIdentity +type SignedIdentity struct { + Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` + Signature []byte `protobuf:"bytes,3,opt,name=signature" json:"signature,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SignedIdentity) Reset() { *m = SignedIdentity{} } +func (m *SignedIdentity) String() string { return proto.CompactTextString(m) } +func (*SignedIdentity) ProtoMessage() {} +func (*SignedIdentity) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{56} } + +func (m *SignedIdentity) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *SignedIdentity) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +func (m *SignedIdentity) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +// * +// Request: Ask device to generate ECDH session key +// @next ECDHSessionKey +// @next Failure +type GetECDHSessionKey struct { + Identity *IdentityType `protobuf:"bytes,1,opt,name=identity" json:"identity,omitempty"` + PeerPublicKey []byte `protobuf:"bytes,2,opt,name=peer_public_key,json=peerPublicKey" json:"peer_public_key,omitempty"` + EcdsaCurveName *string `protobuf:"bytes,3,opt,name=ecdsa_curve_name,json=ecdsaCurveName" json:"ecdsa_curve_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetECDHSessionKey) Reset() { *m = GetECDHSessionKey{} } +func (m *GetECDHSessionKey) String() string { return proto.CompactTextString(m) } +func (*GetECDHSessionKey) ProtoMessage() {} +func (*GetECDHSessionKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{57} } + +func (m *GetECDHSessionKey) GetIdentity() *IdentityType { + if m != nil { + return m.Identity + } + return nil +} + +func (m *GetECDHSessionKey) GetPeerPublicKey() []byte { + if m != nil { + return m.PeerPublicKey + } + return nil +} + +func (m *GetECDHSessionKey) GetEcdsaCurveName() string { + if m != nil && m.EcdsaCurveName != nil { + return *m.EcdsaCurveName + } + return "" +} + +// * +// Response: Device provides ECDH session key +// @prev GetECDHSessionKey +type ECDHSessionKey struct { + SessionKey []byte `protobuf:"bytes,1,opt,name=session_key,json=sessionKey" json:"session_key,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ECDHSessionKey) Reset() { *m = ECDHSessionKey{} } +func (m *ECDHSessionKey) String() string { return proto.CompactTextString(m) } +func (*ECDHSessionKey) ProtoMessage() {} +func (*ECDHSessionKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{58} } + +func (m *ECDHSessionKey) GetSessionKey() []byte { + if m != nil { + return m.SessionKey + } + return nil +} + +// * +// Request: Set U2F counter +// @next Success +type SetU2FCounter struct { + U2FCounter *uint32 `protobuf:"varint,1,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SetU2FCounter) Reset() { *m = SetU2FCounter{} } +func (m *SetU2FCounter) String() string { return proto.CompactTextString(m) } +func (*SetU2FCounter) ProtoMessage() {} +func (*SetU2FCounter) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{59} } + +func (m *SetU2FCounter) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +// * +// Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload) +// @next Success +// @next FirmwareRequest +// @next Failure +type FirmwareErase struct { + Length *uint32 `protobuf:"varint,1,opt,name=length" json:"length,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FirmwareErase) Reset() { *m = FirmwareErase{} } +func (m *FirmwareErase) String() string { return proto.CompactTextString(m) } +func (*FirmwareErase) ProtoMessage() {} +func (*FirmwareErase) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{60} } + +func (m *FirmwareErase) GetLength() uint32 { + if m != nil && m.Length != nil { + return *m.Length + } + return 0 +} + +// * +// Response: Ask for firmware chunk +// @next FirmwareUpload +type FirmwareRequest struct { + Offset *uint32 `protobuf:"varint,1,opt,name=offset" json:"offset,omitempty"` + Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FirmwareRequest) Reset() { *m = FirmwareRequest{} } +func (m *FirmwareRequest) String() string { return proto.CompactTextString(m) } +func (*FirmwareRequest) ProtoMessage() {} +func (*FirmwareRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{61} } + +func (m *FirmwareRequest) GetOffset() uint32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return 0 +} + +func (m *FirmwareRequest) GetLength() uint32 { + if m != nil && m.Length != nil { + return *m.Length + } + return 0 +} + +// * +// Request: Send firmware in binary form to the device +// @next Success +// @next Failure +type FirmwareUpload struct { + Payload []byte `protobuf:"bytes,1,req,name=payload" json:"payload,omitempty"` + Hash []byte `protobuf:"bytes,2,opt,name=hash" json:"hash,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FirmwareUpload) Reset() { *m = FirmwareUpload{} } +func (m *FirmwareUpload) String() string { return proto.CompactTextString(m) } +func (*FirmwareUpload) ProtoMessage() {} +func (*FirmwareUpload) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{62} } + +func (m *FirmwareUpload) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *FirmwareUpload) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +// * +// Request: Perform a device self-test +// @next Success +// @next Failure +type SelfTest struct { + Payload []byte `protobuf:"bytes,1,opt,name=payload" json:"payload,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SelfTest) Reset() { *m = SelfTest{} } +func (m *SelfTest) String() string { return proto.CompactTextString(m) } +func (*SelfTest) ProtoMessage() {} +func (*SelfTest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{63} } + +func (m *SelfTest) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +// * +// Request: "Press" the button on the device +// @next Success +type DebugLinkDecision struct { + YesNo *bool `protobuf:"varint,1,req,name=yes_no,json=yesNo" json:"yes_no,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkDecision) Reset() { *m = DebugLinkDecision{} } +func (m *DebugLinkDecision) String() string { return proto.CompactTextString(m) } +func (*DebugLinkDecision) ProtoMessage() {} +func (*DebugLinkDecision) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{64} } + +func (m *DebugLinkDecision) GetYesNo() bool { + if m != nil && m.YesNo != nil { + return *m.YesNo + } + return false +} + +// * +// Request: Computer asks for device state +// @next DebugLinkState +type DebugLinkGetState struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkGetState) Reset() { *m = DebugLinkGetState{} } +func (m *DebugLinkGetState) String() string { return proto.CompactTextString(m) } +func (*DebugLinkGetState) ProtoMessage() {} +func (*DebugLinkGetState) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{65} } + +// * +// Response: Device current state +// @prev DebugLinkGetState +type DebugLinkState struct { + Layout []byte `protobuf:"bytes,1,opt,name=layout" json:"layout,omitempty"` + Pin *string `protobuf:"bytes,2,opt,name=pin" json:"pin,omitempty"` + Matrix *string `protobuf:"bytes,3,opt,name=matrix" json:"matrix,omitempty"` + Mnemonic *string `protobuf:"bytes,4,opt,name=mnemonic" json:"mnemonic,omitempty"` + Node *HDNodeType `protobuf:"bytes,5,opt,name=node" json:"node,omitempty"` + PassphraseProtection *bool `protobuf:"varint,6,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + ResetWord *string `protobuf:"bytes,7,opt,name=reset_word,json=resetWord" json:"reset_word,omitempty"` + ResetEntropy []byte `protobuf:"bytes,8,opt,name=reset_entropy,json=resetEntropy" json:"reset_entropy,omitempty"` + RecoveryFakeWord *string `protobuf:"bytes,9,opt,name=recovery_fake_word,json=recoveryFakeWord" json:"recovery_fake_word,omitempty"` + RecoveryWordPos *uint32 `protobuf:"varint,10,opt,name=recovery_word_pos,json=recoveryWordPos" json:"recovery_word_pos,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkState) Reset() { *m = DebugLinkState{} } +func (m *DebugLinkState) String() string { return proto.CompactTextString(m) } +func (*DebugLinkState) ProtoMessage() {} +func (*DebugLinkState) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{66} } + +func (m *DebugLinkState) GetLayout() []byte { + if m != nil { + return m.Layout + } + return nil +} + +func (m *DebugLinkState) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +func (m *DebugLinkState) GetMatrix() string { + if m != nil && m.Matrix != nil { + return *m.Matrix + } + return "" +} + +func (m *DebugLinkState) GetMnemonic() string { + if m != nil && m.Mnemonic != nil { + return *m.Mnemonic + } + return "" +} + +func (m *DebugLinkState) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *DebugLinkState) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *DebugLinkState) GetResetWord() string { + if m != nil && m.ResetWord != nil { + return *m.ResetWord + } + return "" +} + +func (m *DebugLinkState) GetResetEntropy() []byte { + if m != nil { + return m.ResetEntropy + } + return nil +} + +func (m *DebugLinkState) GetRecoveryFakeWord() string { + if m != nil && m.RecoveryFakeWord != nil { + return *m.RecoveryFakeWord + } + return "" +} + +func (m *DebugLinkState) GetRecoveryWordPos() uint32 { + if m != nil && m.RecoveryWordPos != nil { + return *m.RecoveryWordPos + } + return 0 +} + +// * +// Request: Ask device to restart +type DebugLinkStop struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkStop) Reset() { *m = DebugLinkStop{} } +func (m *DebugLinkStop) String() string { return proto.CompactTextString(m) } +func (*DebugLinkStop) ProtoMessage() {} +func (*DebugLinkStop) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{67} } + +// * +// Response: Device wants host to log event +type DebugLinkLog struct { + Level *uint32 `protobuf:"varint,1,opt,name=level" json:"level,omitempty"` + Bucket *string `protobuf:"bytes,2,opt,name=bucket" json:"bucket,omitempty"` + Text *string `protobuf:"bytes,3,opt,name=text" json:"text,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkLog) Reset() { *m = DebugLinkLog{} } +func (m *DebugLinkLog) String() string { return proto.CompactTextString(m) } +func (*DebugLinkLog) ProtoMessage() {} +func (*DebugLinkLog) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{68} } + +func (m *DebugLinkLog) GetLevel() uint32 { + if m != nil && m.Level != nil { + return *m.Level + } + return 0 +} + +func (m *DebugLinkLog) GetBucket() string { + if m != nil && m.Bucket != nil { + return *m.Bucket + } + return "" +} + +func (m *DebugLinkLog) GetText() string { + if m != nil && m.Text != nil { + return *m.Text + } + return "" +} + +// * +// Request: Read memory from device +// @next DebugLinkMemory +type DebugLinkMemoryRead struct { + Address *uint32 `protobuf:"varint,1,opt,name=address" json:"address,omitempty"` + Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkMemoryRead) Reset() { *m = DebugLinkMemoryRead{} } +func (m *DebugLinkMemoryRead) String() string { return proto.CompactTextString(m) } +func (*DebugLinkMemoryRead) ProtoMessage() {} +func (*DebugLinkMemoryRead) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{69} } + +func (m *DebugLinkMemoryRead) GetAddress() uint32 { + if m != nil && m.Address != nil { + return *m.Address + } + return 0 +} + +func (m *DebugLinkMemoryRead) GetLength() uint32 { + if m != nil && m.Length != nil { + return *m.Length + } + return 0 +} + +// * +// Response: Device sends memory back +// @prev DebugLinkMemoryRead +type DebugLinkMemory struct { + Memory []byte `protobuf:"bytes,1,opt,name=memory" json:"memory,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkMemory) Reset() { *m = DebugLinkMemory{} } +func (m *DebugLinkMemory) String() string { return proto.CompactTextString(m) } +func (*DebugLinkMemory) ProtoMessage() {} +func (*DebugLinkMemory) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{70} } + +func (m *DebugLinkMemory) GetMemory() []byte { + if m != nil { + return m.Memory + } + return nil +} + +// * +// Request: Write memory to device. +// WARNING: Writing to the wrong location can irreparably break the device. +type DebugLinkMemoryWrite struct { + Address *uint32 `protobuf:"varint,1,opt,name=address" json:"address,omitempty"` + Memory []byte `protobuf:"bytes,2,opt,name=memory" json:"memory,omitempty"` + Flash *bool `protobuf:"varint,3,opt,name=flash" json:"flash,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkMemoryWrite) Reset() { *m = DebugLinkMemoryWrite{} } +func (m *DebugLinkMemoryWrite) String() string { return proto.CompactTextString(m) } +func (*DebugLinkMemoryWrite) ProtoMessage() {} +func (*DebugLinkMemoryWrite) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{71} } + +func (m *DebugLinkMemoryWrite) GetAddress() uint32 { + if m != nil && m.Address != nil { + return *m.Address + } + return 0 +} + +func (m *DebugLinkMemoryWrite) GetMemory() []byte { + if m != nil { + return m.Memory + } + return nil +} + +func (m *DebugLinkMemoryWrite) GetFlash() bool { + if m != nil && m.Flash != nil { + return *m.Flash + } + return false +} + +// * +// Request: Erase block of flash on device +// WARNING: Writing to the wrong location can irreparably break the device. +type DebugLinkFlashErase struct { + Sector *uint32 `protobuf:"varint,1,opt,name=sector" json:"sector,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DebugLinkFlashErase) Reset() { *m = DebugLinkFlashErase{} } +func (m *DebugLinkFlashErase) String() string { return proto.CompactTextString(m) } +func (*DebugLinkFlashErase) ProtoMessage() {} +func (*DebugLinkFlashErase) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{72} } + +func (m *DebugLinkFlashErase) GetSector() uint32 { + if m != nil && m.Sector != nil { + return *m.Sector + } + return 0 +} + +func init() { + proto.RegisterType((*Initialize)(nil), "Initialize") + proto.RegisterType((*GetFeatures)(nil), "GetFeatures") + proto.RegisterType((*Features)(nil), "Features") + proto.RegisterType((*ClearSession)(nil), "ClearSession") + proto.RegisterType((*ApplySettings)(nil), "ApplySettings") + proto.RegisterType((*ApplyFlags)(nil), "ApplyFlags") + proto.RegisterType((*ChangePin)(nil), "ChangePin") + proto.RegisterType((*Ping)(nil), "Ping") + proto.RegisterType((*Success)(nil), "Success") + proto.RegisterType((*Failure)(nil), "Failure") + proto.RegisterType((*ButtonRequest)(nil), "ButtonRequest") + proto.RegisterType((*ButtonAck)(nil), "ButtonAck") + proto.RegisterType((*PinMatrixRequest)(nil), "PinMatrixRequest") + proto.RegisterType((*PinMatrixAck)(nil), "PinMatrixAck") + proto.RegisterType((*Cancel)(nil), "Cancel") + proto.RegisterType((*PassphraseRequest)(nil), "PassphraseRequest") + proto.RegisterType((*PassphraseAck)(nil), "PassphraseAck") + proto.RegisterType((*GetEntropy)(nil), "GetEntropy") + proto.RegisterType((*Entropy)(nil), "Entropy") + proto.RegisterType((*GetPublicKey)(nil), "GetPublicKey") + proto.RegisterType((*PublicKey)(nil), "PublicKey") + proto.RegisterType((*GetAddress)(nil), "GetAddress") + proto.RegisterType((*EthereumGetAddress)(nil), "EthereumGetAddress") + proto.RegisterType((*Address)(nil), "Address") + proto.RegisterType((*EthereumAddress)(nil), "EthereumAddress") + proto.RegisterType((*WipeDevice)(nil), "WipeDevice") + proto.RegisterType((*LoadDevice)(nil), "LoadDevice") + proto.RegisterType((*ResetDevice)(nil), "ResetDevice") + proto.RegisterType((*BackupDevice)(nil), "BackupDevice") + proto.RegisterType((*EntropyRequest)(nil), "EntropyRequest") + proto.RegisterType((*EntropyAck)(nil), "EntropyAck") + proto.RegisterType((*RecoveryDevice)(nil), "RecoveryDevice") + proto.RegisterType((*WordRequest)(nil), "WordRequest") + proto.RegisterType((*WordAck)(nil), "WordAck") + proto.RegisterType((*SignMessage)(nil), "SignMessage") + proto.RegisterType((*VerifyMessage)(nil), "VerifyMessage") + proto.RegisterType((*MessageSignature)(nil), "MessageSignature") + proto.RegisterType((*EncryptMessage)(nil), "EncryptMessage") + proto.RegisterType((*EncryptedMessage)(nil), "EncryptedMessage") + proto.RegisterType((*DecryptMessage)(nil), "DecryptMessage") + proto.RegisterType((*DecryptedMessage)(nil), "DecryptedMessage") + proto.RegisterType((*CipherKeyValue)(nil), "CipherKeyValue") + proto.RegisterType((*CipheredKeyValue)(nil), "CipheredKeyValue") + proto.RegisterType((*EstimateTxSize)(nil), "EstimateTxSize") + proto.RegisterType((*TxSize)(nil), "TxSize") + proto.RegisterType((*SignTx)(nil), "SignTx") + proto.RegisterType((*SimpleSignTx)(nil), "SimpleSignTx") + proto.RegisterType((*TxRequest)(nil), "TxRequest") + proto.RegisterType((*TxAck)(nil), "TxAck") + proto.RegisterType((*EthereumSignTx)(nil), "EthereumSignTx") + proto.RegisterType((*EthereumTxRequest)(nil), "EthereumTxRequest") + proto.RegisterType((*EthereumTxAck)(nil), "EthereumTxAck") + proto.RegisterType((*EthereumSignMessage)(nil), "EthereumSignMessage") + proto.RegisterType((*EthereumVerifyMessage)(nil), "EthereumVerifyMessage") + proto.RegisterType((*EthereumMessageSignature)(nil), "EthereumMessageSignature") + proto.RegisterType((*SignIdentity)(nil), "SignIdentity") + proto.RegisterType((*SignedIdentity)(nil), "SignedIdentity") + proto.RegisterType((*GetECDHSessionKey)(nil), "GetECDHSessionKey") + proto.RegisterType((*ECDHSessionKey)(nil), "ECDHSessionKey") + proto.RegisterType((*SetU2FCounter)(nil), "SetU2FCounter") + proto.RegisterType((*FirmwareErase)(nil), "FirmwareErase") + proto.RegisterType((*FirmwareRequest)(nil), "FirmwareRequest") + proto.RegisterType((*FirmwareUpload)(nil), "FirmwareUpload") + proto.RegisterType((*SelfTest)(nil), "SelfTest") + proto.RegisterType((*DebugLinkDecision)(nil), "DebugLinkDecision") + proto.RegisterType((*DebugLinkGetState)(nil), "DebugLinkGetState") + proto.RegisterType((*DebugLinkState)(nil), "DebugLinkState") + proto.RegisterType((*DebugLinkStop)(nil), "DebugLinkStop") + proto.RegisterType((*DebugLinkLog)(nil), "DebugLinkLog") + proto.RegisterType((*DebugLinkMemoryRead)(nil), "DebugLinkMemoryRead") + proto.RegisterType((*DebugLinkMemory)(nil), "DebugLinkMemory") + proto.RegisterType((*DebugLinkMemoryWrite)(nil), "DebugLinkMemoryWrite") + proto.RegisterType((*DebugLinkFlashErase)(nil), "DebugLinkFlashErase") + proto.RegisterEnum("MessageType", MessageType_name, MessageType_value) +} + +func init() { proto.RegisterFile("messages.proto", fileDescriptor1) } + +var fileDescriptor1 = []byte{ + // 3424 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5a, 0xcb, 0x6f, 0xdc, 0x46, + 0x9a, 0x5f, 0x76, 0xb7, 0xfa, 0xf1, 0x35, 0xbb, 0x55, 0xa2, 0x2d, 0xbb, 0x2d, 0x5b, 0xb6, 0x4c, + 0xc9, 0xb6, 0x64, 0x27, 0xed, 0x44, 0x79, 0x6c, 0xd6, 0xbb, 0x79, 0xc8, 0x7a, 0xd8, 0xde, 0xd8, + 0x8e, 0xc0, 0x56, 0x9c, 0xdb, 0x12, 0x14, 0x59, 0xea, 0xae, 0x55, 0x37, 0xc9, 0xf0, 0xa1, 0xa8, + 0x7d, 0xd8, 0xeb, 0xee, 0x65, 0x81, 0xec, 0x69, 0x73, 0x1a, 0xe4, 0x36, 0x19, 0x04, 0x18, 0x0c, + 0x30, 0x18, 0x60, 0x72, 0x9a, 0x3f, 0x60, 0xfe, 0x8b, 0x39, 0xce, 0x1f, 0x30, 0xe7, 0x41, 0x3d, + 0x48, 0x16, 0x29, 0xb6, 0x6c, 0x27, 0xc0, 0x5c, 0x04, 0xd6, 0x57, 0xbf, 0xfe, 0xea, 0x7b, 0xd5, + 0x57, 0x5f, 0x7d, 0x25, 0xe8, 0x4e, 0x70, 0x18, 0x5a, 0x43, 0x1c, 0xf6, 0xfd, 0xc0, 0x8b, 0xbc, + 0xa5, 0x76, 0x34, 0xf5, 0x93, 0x81, 0xae, 0x02, 0x3c, 0x71, 0x49, 0x44, 0xac, 0x31, 0x79, 0x89, + 0xf5, 0x0e, 0xb4, 0x1f, 0xe1, 0x68, 0x0f, 0x5b, 0x51, 0x1c, 0xe0, 0x50, 0xff, 0x69, 0x0e, 0x9a, + 0xc9, 0x40, 0xbb, 0x04, 0xf5, 0x13, 0xec, 0x3a, 0x5e, 0xd0, 0x53, 0x56, 0x94, 0xf5, 0x96, 0x21, + 0x46, 0xda, 0x2a, 0x74, 0x26, 0xd6, 0x7f, 0x7a, 0x81, 0x79, 0x82, 0x83, 0x90, 0x78, 0x6e, 0xaf, + 0xb2, 0xa2, 0xac, 0x77, 0x0c, 0x95, 0x11, 0x5f, 0x70, 0x1a, 0x03, 0x11, 0x57, 0x02, 0x55, 0x05, + 0x88, 0x12, 0x25, 0x90, 0x6f, 0x45, 0xf6, 0x28, 0x05, 0xd5, 0x38, 0x88, 0x11, 0x13, 0xd0, 0x1d, + 0x98, 0x3f, 0xf4, 0xbc, 0x68, 0xec, 0x59, 0x0e, 0x0e, 0xcc, 0x89, 0xe7, 0xe0, 0xde, 0xdc, 0x8a, + 0xb2, 0xde, 0x34, 0xba, 0x19, 0xf9, 0x99, 0xe7, 0x60, 0xed, 0x2a, 0xb4, 0x1c, 0x7c, 0x42, 0x6c, + 0x6c, 0x12, 0xa7, 0x57, 0x67, 0x22, 0x37, 0x39, 0xe1, 0x89, 0xa3, 0xdd, 0x82, 0xae, 0x4f, 0x5c, + 0x93, 0xda, 0x00, 0xdb, 0x11, 0x5d, 0xab, 0xc1, 0x98, 0x74, 0x7c, 0xe2, 0xee, 0xa7, 0x44, 0xed, + 0x3d, 0x58, 0xf4, 0xad, 0x30, 0xf4, 0x47, 0x81, 0x15, 0x62, 0x19, 0xdd, 0x64, 0xe8, 0x8b, 0xd9, + 0xa4, 0xf4, 0xa3, 0x25, 0x68, 0x8e, 0x2d, 0x77, 0x18, 0x5b, 0x43, 0xdc, 0x6b, 0xf1, 0x75, 0x93, + 0xb1, 0x76, 0x11, 0xe6, 0xc6, 0xd6, 0x21, 0x1e, 0xf7, 0x80, 0x4d, 0xf0, 0x81, 0x76, 0x03, 0xe6, + 0x6c, 0x8f, 0xb8, 0x61, 0xaf, 0xbd, 0x52, 0x5d, 0x6f, 0x6f, 0xb6, 0xfa, 0xdb, 0x1e, 0x71, 0x0f, + 0xa6, 0x3e, 0x36, 0x38, 0x5d, 0x5b, 0x81, 0x36, 0x49, 0xbd, 0xe4, 0xf4, 0x54, 0xb6, 0xba, 0x4c, + 0xa2, 0x8b, 0x06, 0xf8, 0x84, 0x30, 0xb3, 0x75, 0x56, 0x94, 0x75, 0xd5, 0x48, 0xc7, 0x05, 0x93, + 0x8d, 0xac, 0x70, 0xd4, 0xeb, 0x32, 0x88, 0x64, 0xb2, 0xc7, 0x56, 0x38, 0xa2, 0x4c, 0xc8, 0xc4, + 0xf7, 0x82, 0x08, 0x3b, 0xbd, 0x79, 0xb6, 0x46, 0x3a, 0xd6, 0x96, 0x01, 0xa8, 0xc5, 0x6c, 0xcb, + 0x1e, 0x61, 0xa7, 0x87, 0xd8, 0x6c, 0xcb, 0x27, 0xee, 0x36, 0x23, 0x68, 0xf7, 0x60, 0x41, 0xb2, + 0x94, 0x40, 0x2d, 0x30, 0x14, 0xca, 0x26, 0x04, 0x78, 0x03, 0xd0, 0x11, 0x09, 0x26, 0xdf, 0x58, + 0x01, 0x35, 0x2a, 0x0e, 0xb1, 0x1b, 0xf5, 0x34, 0x86, 0x9d, 0x4f, 0xe8, 0xfb, 0x9c, 0xac, 0xdd, + 0x04, 0xd5, 0xc5, 0xd8, 0x09, 0xcd, 0x43, 0xcb, 0x3e, 0x8e, 0xfd, 0xde, 0x05, 0xae, 0x3a, 0xa3, + 0x3d, 0x64, 0x24, 0x6a, 0xd3, 0xa3, 0xb1, 0x35, 0x0c, 0x7b, 0x17, 0x59, 0xb8, 0xf0, 0x81, 0xde, + 0x05, 0x75, 0x7b, 0x8c, 0xad, 0x60, 0x80, 0x43, 0x6a, 0x04, 0xfd, 0x7f, 0x14, 0xe8, 0x6c, 0xf9, + 0xfe, 0x78, 0x3a, 0xc0, 0x51, 0x44, 0xdc, 0x61, 0x98, 0xf3, 0x93, 0x32, 0xcb, 0x4f, 0x15, 0xd9, + 0x4f, 0xb7, 0xa0, 0x1b, 0xd3, 0x38, 0x48, 0xf5, 0x61, 0x61, 0xdc, 0x34, 0x3a, 0x71, 0x88, 0xf7, + 0x53, 0xa2, 0x76, 0x1d, 0x60, 0xe4, 0x4d, 0x70, 0x68, 0x07, 0x18, 0xf3, 0x20, 0x56, 0x0d, 0x89, + 0xa2, 0xeb, 0x00, 0x4c, 0x92, 0x3d, 0x2a, 0x68, 0x26, 0xbe, 0x22, 0x8b, 0xbf, 0x0a, 0xad, 0xed, + 0x91, 0xe5, 0x0e, 0xf1, 0x3e, 0x71, 0xe9, 0xd6, 0x0b, 0xf0, 0xc4, 0x3b, 0xe1, 0x72, 0x36, 0x0d, + 0x31, 0xd2, 0x7f, 0xa3, 0x40, 0x6d, 0x9f, 0xb8, 0x43, 0xad, 0x07, 0x0d, 0xb1, 0xc9, 0x85, 0x26, + 0xc9, 0x90, 0xfa, 0xe5, 0x30, 0x8e, 0x22, 0x2f, 0x17, 0xeb, 0x15, 0xee, 0x17, 0x3e, 0x21, 0x45, + 0xee, 0xd9, 0x5d, 0x51, 0x7d, 0xa3, 0x5d, 0x51, 0x9b, 0xbd, 0x2b, 0xf4, 0x55, 0x68, 0x0c, 0x62, + 0xdb, 0xc6, 0x61, 0x38, 0x5b, 0x5a, 0x7d, 0x17, 0x1a, 0x7b, 0x16, 0x19, 0xc7, 0x01, 0xd6, 0x56, + 0xa0, 0x66, 0xd3, 0xcd, 0x4d, 0x11, 0xdd, 0x4d, 0xb5, 0x2f, 0xe8, 0x6c, 0x57, 0xb0, 0x19, 0x99, + 0x4d, 0x25, 0xcf, 0xe6, 0x73, 0xe8, 0x3c, 0x64, 0xba, 0x19, 0xf8, 0xeb, 0x18, 0x87, 0x91, 0x76, + 0x3b, 0xc7, 0x4c, 0xeb, 0xe7, 0x66, 0x25, 0x96, 0x1a, 0xd4, 0x1c, 0x2b, 0xb2, 0x04, 0x3f, 0xf6, + 0xad, 0xb7, 0xa1, 0xc5, 0xe1, 0x5b, 0xf6, 0xb1, 0xfe, 0x31, 0xa0, 0x7d, 0xe2, 0x3e, 0xb3, 0xa2, + 0x80, 0x9c, 0x26, 0xcc, 0x37, 0xa0, 0x46, 0x33, 0xaa, 0x60, 0xbe, 0xd8, 0x2f, 0x02, 0x38, 0x7f, + 0x0a, 0xd1, 0x57, 0x40, 0x4d, 0x67, 0xb7, 0xec, 0x63, 0x0d, 0x41, 0xd5, 0x27, 0x6e, 0x4f, 0x59, + 0xa9, 0xac, 0xb7, 0x0c, 0xfa, 0xa9, 0x37, 0xa1, 0xbe, 0x6d, 0xb9, 0x36, 0x1e, 0xeb, 0x17, 0x60, + 0x21, 0x8b, 0x29, 0xc1, 0x4a, 0xbf, 0x0f, 0x9d, 0x8c, 0x48, 0x39, 0x5c, 0x07, 0x90, 0xc2, 0x91, + 0x33, 0x92, 0x28, 0xfa, 0x0a, 0xc0, 0x23, 0x1c, 0xed, 0xba, 0x51, 0xe0, 0xf9, 0x53, 0xaa, 0x5f, + 0x48, 0x5e, 0x72, 0x5c, 0xc7, 0x60, 0xdf, 0xd4, 0x31, 0xc9, 0x74, 0x0f, 0x1a, 0x98, 0x7f, 0x32, + 0x84, 0x6a, 0x24, 0x43, 0xfd, 0x57, 0x0a, 0xa8, 0x8f, 0x70, 0xb4, 0x1f, 0x1f, 0x8e, 0x89, 0xfd, + 0x39, 0x9e, 0xd2, 0xec, 0x6a, 0x39, 0x4e, 0x80, 0xc3, 0xd0, 0xa4, 0xf2, 0x57, 0xd7, 0x3b, 0x46, + 0x53, 0x10, 0x9e, 0x6b, 0xeb, 0x80, 0xb0, 0xed, 0x84, 0x96, 0x69, 0xc7, 0xc1, 0x09, 0x36, 0x5d, + 0x6b, 0x92, 0xb8, 0xa8, 0xcb, 0xe8, 0xdb, 0x94, 0xfc, 0xdc, 0x9a, 0x60, 0xba, 0xbd, 0xc3, 0x91, + 0xf7, 0x8d, 0xe9, 0x90, 0xd0, 0x1f, 0x5b, 0x53, 0x11, 0x6f, 0x6d, 0x4a, 0xdb, 0xe1, 0x24, 0x6d, + 0x0d, 0x5a, 0x34, 0x09, 0x72, 0x2e, 0x34, 0xc2, 0x5a, 0x0f, 0x1a, 0x0f, 0x49, 0x44, 0x69, 0x46, + 0x93, 0xfe, 0xa5, 0x8c, 0xf4, 0xcf, 0xa0, 0x95, 0x09, 0x77, 0x03, 0x6a, 0x2e, 0x77, 0x77, 0x65, + 0xbd, 0xbd, 0xd9, 0xee, 0x3f, 0xde, 0x79, 0xee, 0x39, 0x22, 0x74, 0x5c, 0xe1, 0xe7, 0x53, 0x3f, + 0x3e, 0x4c, 0xfc, 0x4c, 0xbf, 0xf5, 0xbf, 0x2a, 0xcc, 0x54, 0x5b, 0x5c, 0x89, 0xf3, 0x15, 0xcc, + 0xc9, 0x54, 0x99, 0x21, 0xd3, 0xeb, 0x28, 0xf7, 0x01, 0x34, 0x27, 0xf1, 0x38, 0x22, 0x21, 0x19, + 0x32, 0xdd, 0xda, 0x9b, 0x57, 0xfa, 0xcf, 0x04, 0xc1, 0xc0, 0x0e, 0xc6, 0x93, 0x81, 0x1d, 0x10, + 0x9f, 0xc7, 0x50, 0x0a, 0xd5, 0x3e, 0x85, 0x76, 0xc8, 0xe8, 0x26, 0x8b, 0xbc, 0x39, 0x16, 0x79, + 0xa8, 0xff, 0xc4, 0xf5, 0xe3, 0x28, 0xfb, 0xc1, 0x03, 0x75, 0xb0, 0xbf, 0xfb, 0x7c, 0x67, 0x6b, + 0x67, 0xc7, 0xd8, 0x1d, 0x0c, 0x0c, 0x08, 0xd3, 0x19, 0xfd, 0x00, 0xb4, 0xdd, 0x68, 0x84, 0x03, + 0x1c, 0x4f, 0x5e, 0x57, 0xe7, 0xa2, 0x36, 0x95, 0x33, 0xda, 0xd0, 0x50, 0x4a, 0x58, 0xf5, 0xa0, + 0x21, 0x7e, 0x29, 0x82, 0x32, 0x19, 0xea, 0xf7, 0x60, 0x3e, 0x59, 0x7a, 0x06, 0x58, 0xcd, 0xc0, + 0x2a, 0xc0, 0x57, 0xc4, 0xc7, 0x3b, 0xec, 0xdc, 0xd6, 0xff, 0xaf, 0x02, 0xf0, 0xd4, 0xb3, 0x1c, + 0x3e, 0xa4, 0x09, 0x7c, 0xe2, 0xe2, 0x89, 0xe7, 0x12, 0x3b, 0x49, 0xe0, 0xc9, 0x38, 0x0d, 0x81, + 0x0a, 0x33, 0x6a, 0x49, 0x08, 0x88, 0xad, 0x57, 0x65, 0xbf, 0xa3, 0x9f, 0x3f, 0x2b, 0xad, 0x69, + 0xab, 0xd2, 0x21, 0x32, 0xc7, 0x03, 0x01, 0xbb, 0xc3, 0x31, 0x09, 0x47, 0x65, 0xa7, 0x49, 0x5d, + 0x3e, 0x4d, 0x56, 0xa1, 0x13, 0x1e, 0x13, 0xdf, 0xb4, 0x47, 0xd8, 0x3e, 0x0e, 0xe3, 0x89, 0x28, + 0x41, 0x54, 0x4a, 0xdc, 0x16, 0x34, 0xed, 0x06, 0xb4, 0xe3, 0xcd, 0x23, 0xd3, 0xf6, 0x62, 0x37, + 0xc2, 0x01, 0xab, 0x3b, 0x3a, 0x06, 0xc4, 0x9b, 0x47, 0xdb, 0x9c, 0xa2, 0xff, 0xb6, 0x02, 0x6d, + 0x03, 0x87, 0x38, 0x12, 0x46, 0xb9, 0x05, 0x5d, 0xe1, 0x21, 0x33, 0xb0, 0x5c, 0xc7, 0x9b, 0x88, + 0x33, 0xa3, 0x23, 0xa8, 0x06, 0x23, 0x6a, 0x37, 0xa0, 0x19, 0x46, 0x01, 0x76, 0x87, 0xd1, 0x88, + 0x17, 0x6c, 0x0f, 0xaa, 0x9b, 0x1f, 0x7c, 0x68, 0xa4, 0xc4, 0xd9, 0xd6, 0xa8, 0x9e, 0x63, 0x8d, + 0xb3, 0x07, 0x48, 0xad, 0xec, 0x00, 0xf9, 0x05, 0x46, 0x2b, 0xd8, 0xa3, 0x51, 0xb4, 0x07, 0x05, + 0x30, 0xab, 0x8a, 0x7a, 0x81, 0x17, 0x6a, 0x40, 0x49, 0xbc, 0x5c, 0xa0, 0x85, 0x01, 0xff, 0x12, + 0x41, 0x85, 0xa0, 0x2b, 0xf2, 0x5f, 0x92, 0x64, 0x6f, 0x03, 0x08, 0x0a, 0xcd, 0xb0, 0xb9, 0xa4, + 0xa8, 0xc8, 0x49, 0xf1, 0x4f, 0x15, 0xe8, 0x1a, 0xd8, 0xf6, 0x4e, 0x70, 0x30, 0x15, 0xd6, 0x5f, + 0x06, 0xf8, 0xc6, 0x0b, 0x1c, 0x2e, 0x9f, 0x38, 0xd1, 0x5b, 0x94, 0xc2, 0xc4, 0x9b, 0x6d, 0xd4, + 0xca, 0x1b, 0x19, 0xb5, 0xfa, 0x2a, 0xa3, 0xd6, 0x5e, 0x69, 0xd4, 0x39, 0xd9, 0xa8, 0x1b, 0x80, + 0xb0, 0x7b, 0xe4, 0x05, 0x36, 0x36, 0xa9, 0xac, 0x63, 0x12, 0x46, 0xcc, 0xea, 0x4d, 0x63, 0x5e, + 0xd0, 0xbf, 0x12, 0x64, 0x9a, 0x39, 0x59, 0xca, 0xe1, 0x81, 0xc8, 0xbe, 0x8b, 0x3e, 0x69, 0x9d, + 0xf1, 0xc9, 0x65, 0x68, 0x38, 0xc1, 0xd4, 0x0c, 0x62, 0x97, 0xd5, 0xbd, 0x4d, 0xa3, 0xee, 0x04, + 0x53, 0x23, 0x76, 0xf5, 0xf7, 0xa0, 0x4d, 0x39, 0x27, 0x27, 0xe9, 0x5a, 0xee, 0x24, 0x45, 0x7d, + 0x69, 0x4e, 0x3a, 0x44, 0x97, 0xa1, 0x41, 0x27, 0xa8, 0x6f, 0x34, 0xa8, 0x51, 0x81, 0x45, 0x8a, + 0x61, 0xdf, 0xfa, 0x8f, 0x0a, 0xb4, 0x07, 0x64, 0xe8, 0x3e, 0x13, 0x15, 0xd0, 0xb9, 0x49, 0x2d, + 0x57, 0x43, 0xb0, 0xcc, 0x93, 0x14, 0x4e, 0xb9, 0x14, 0x5f, 0x9d, 0x95, 0xe2, 0x0b, 0x89, 0xb8, + 0xf6, 0xc6, 0x89, 0xf8, 0xbf, 0x15, 0xe8, 0xbc, 0xc0, 0x01, 0x39, 0x9a, 0x26, 0xf2, 0xe6, 0x92, + 0xa1, 0x22, 0x65, 0x4e, 0xed, 0x1a, 0xb4, 0x42, 0x32, 0x74, 0xd9, 0x7d, 0x8c, 0x45, 0x8c, 0x6a, + 0x64, 0x04, 0x59, 0x95, 0x2a, 0x8f, 0xd3, 0x52, 0x55, 0x66, 0x9e, 0xa0, 0xff, 0x0e, 0x48, 0x88, + 0x30, 0x90, 0x79, 0xfe, 0x1c, 0x59, 0xf4, 0x1f, 0x14, 0xba, 0xa9, 0xec, 0x60, 0xea, 0x47, 0x89, + 0x5a, 0x97, 0xa0, 0xee, 0xc7, 0x87, 0xc7, 0x38, 0xd9, 0x45, 0x62, 0x54, 0xac, 0xe2, 0x24, 0xb1, + 0x6f, 0x82, 0x9a, 0x64, 0x32, 0xcf, 0x1d, 0xa7, 0xc7, 0xa7, 0xa0, 0x7d, 0xe1, 0x8e, 0x0b, 0x55, + 0x48, 0xed, 0xbc, 0x43, 0x7a, 0x6e, 0x96, 0xda, 0x2f, 0x00, 0x09, 0x49, 0xb1, 0x93, 0xc8, 0x7a, + 0x11, 0xe6, 0x5c, 0xcf, 0xb5, 0xb1, 0x10, 0x95, 0x0f, 0xce, 0x91, 0x54, 0x83, 0xda, 0x68, 0x62, + 0xd9, 0xc2, 0xee, 0xec, 0x5b, 0xff, 0x1a, 0xba, 0x3b, 0x38, 0x67, 0x81, 0x73, 0x03, 0x31, 0x5d, + 0xb2, 0x32, 0x63, 0xc9, 0x6a, 0xf9, 0x92, 0x35, 0x69, 0xc9, 0x3d, 0x40, 0x62, 0xc9, 0x4c, 0x95, + 0x42, 0xad, 0x2d, 0x71, 0x90, 0x7c, 0x5b, 0xc9, 0xf9, 0x56, 0xff, 0xb3, 0x02, 0xdd, 0x6d, 0xe2, + 0x8f, 0x70, 0xf0, 0x39, 0x9e, 0xbe, 0xb0, 0xc6, 0xf1, 0x2b, 0x64, 0x47, 0x50, 0xa5, 0x7e, 0xe5, + 0x5c, 0xe8, 0x27, 0xd5, 0xe6, 0x84, 0xfe, 0x4e, 0x48, 0xcd, 0x07, 0x3c, 0x93, 0x32, 0xf9, 0xc4, + 0xb1, 0x90, 0x0c, 0xb5, 0x35, 0xe8, 0x5a, 0xe1, 0xb1, 0xe9, 0xb9, 0x66, 0x02, 0xe0, 0x77, 0x7a, + 0xd5, 0x0a, 0x8f, 0xbf, 0x70, 0x77, 0xcf, 0xa0, 0x1c, 0xae, 0xa6, 0x48, 0x52, 0x1c, 0x25, 0x54, + 0xd7, 0xba, 0x50, 0x21, 0x27, 0xec, 0x60, 0x50, 0x8d, 0x0a, 0x39, 0xd1, 0xd7, 0x01, 0x71, 0x65, + 0xb0, 0x93, 0xaa, 0x93, 0xca, 0xa7, 0x48, 0xf2, 0xe9, 0xff, 0x05, 0xdd, 0xdd, 0x30, 0x22, 0x13, + 0x2b, 0xc2, 0x07, 0xa7, 0x03, 0xf2, 0x12, 0xd3, 0x23, 0xda, 0x8b, 0x23, 0x3f, 0x8e, 0xc2, 0x34, + 0xa3, 0xd3, 0xc2, 0x59, 0x15, 0x44, 0x9e, 0xd4, 0x6f, 0x82, 0x4a, 0x5c, 0x09, 0x53, 0x61, 0x98, + 0x36, 0xa7, 0x71, 0xc8, 0x6b, 0x25, 0x13, 0xfd, 0x26, 0xd4, 0xc5, 0xba, 0x97, 0xa1, 0x11, 0x9d, + 0x9a, 0xa2, 0x54, 0xa7, 0xd9, 0xb4, 0x1e, 0xb1, 0x09, 0xfd, 0xf7, 0x0a, 0xd4, 0xe9, 0xf6, 0x3c, + 0x38, 0xfd, 0xc7, 0xca, 0xa6, 0x5d, 0x85, 0x46, 0xae, 0x2b, 0xf3, 0x40, 0x79, 0xd7, 0x48, 0x28, + 0xda, 0x75, 0x68, 0x8d, 0x3d, 0xfb, 0xd8, 0x8c, 0x88, 0xd8, 0x69, 0x9d, 0x07, 0xca, 0x3b, 0x46, + 0x93, 0xd2, 0x0e, 0xc8, 0x04, 0xeb, 0x7f, 0x53, 0x40, 0x1d, 0x90, 0x89, 0x3f, 0xc6, 0x42, 0xf6, + 0x35, 0xa8, 0x73, 0x11, 0x58, 0x2c, 0xb5, 0x37, 0xd5, 0xfe, 0xc1, 0x29, 0xcb, 0x99, 0x2c, 0xcd, + 0x8b, 0x39, 0xed, 0x0e, 0x34, 0x84, 0x32, 0xbd, 0x0a, 0x83, 0x75, 0xfa, 0x07, 0xa7, 0x5f, 0x30, + 0x0a, 0xc3, 0x25, 0xb3, 0xda, 0xfb, 0xa0, 0x46, 0x81, 0xe5, 0x86, 0x16, 0x3b, 0x09, 0xc3, 0x5e, + 0x95, 0xa1, 0x51, 0xff, 0x20, 0x23, 0xb2, 0x1f, 0xe4, 0x50, 0xaf, 0x97, 0x16, 0x65, 0xc5, 0xe7, + 0xce, 0x57, 0xbc, 0x7e, 0x56, 0xf1, 0x5f, 0x2b, 0xd0, 0x3a, 0x48, 0x2f, 0x8a, 0xf7, 0x41, 0x0d, + 0xf8, 0xa7, 0x29, 0x1d, 0x73, 0x6a, 0x5f, 0x3e, 0xe2, 0xda, 0x41, 0x36, 0xd0, 0xee, 0x43, 0xc3, + 0xc1, 0x91, 0x45, 0xc6, 0xa1, 0xa8, 0x63, 0x17, 0xfb, 0x29, 0xb7, 0x1d, 0x3e, 0xc1, 0x0d, 0x21, + 0x50, 0xda, 0x47, 0x00, 0x21, 0x0e, 0x92, 0x36, 0x51, 0x95, 0xfd, 0xa6, 0x97, 0xfd, 0x66, 0x90, + 0xce, 0xb1, 0x9f, 0x49, 0x58, 0x7d, 0x03, 0xe6, 0x0e, 0xd8, 0x95, 0x74, 0x05, 0x2a, 0xd1, 0x29, + 0x13, 0xad, 0xcc, 0x82, 0x95, 0xe8, 0x54, 0xff, 0xdf, 0x0a, 0x74, 0x93, 0x0a, 0x5e, 0xf8, 0xf3, + 0x67, 0xa4, 0xb6, 0xab, 0xd0, 0x1a, 0x5a, 0xa1, 0xe9, 0x07, 0xc4, 0x4e, 0xd2, 0x44, 0x73, 0x68, + 0x85, 0xfb, 0x74, 0x9c, 0x4c, 0x8e, 0xc9, 0x84, 0x44, 0x22, 0xc5, 0xd1, 0xc9, 0xa7, 0x74, 0x4c, + 0x37, 0x78, 0xe4, 0x31, 0x67, 0xa8, 0x46, 0x25, 0xf2, 0xb2, 0xcd, 0x5c, 0x97, 0x93, 0xcd, 0x5b, + 0xa0, 0xd1, 0xeb, 0xbb, 0x29, 0x9a, 0x64, 0xa6, 0x3d, 0x8a, 0xdd, 0x63, 0x91, 0x16, 0x10, 0x9d, + 0x11, 0x6d, 0xcf, 0x6d, 0x4a, 0xa7, 0x25, 0x0c, 0x43, 0x8f, 0x79, 0x45, 0x2c, 0xca, 0x6c, 0x4a, + 0x7a, 0xca, 0xcb, 0xe1, 0x2b, 0xd0, 0xb4, 0x47, 0x16, 0x71, 0x4d, 0xe2, 0x88, 0x02, 0xa7, 0xc1, + 0xc6, 0x4f, 0x1c, 0xfd, 0xff, 0x15, 0x58, 0x48, 0xec, 0x91, 0x39, 0xbb, 0xc0, 0x51, 0x39, 0xc3, + 0x91, 0x16, 0xaa, 0xc9, 0x81, 0x69, 0x9e, 0x88, 0xae, 0x29, 0xa4, 0xa4, 0x17, 0x79, 0x40, 0x20, + 0x6c, 0x94, 0x01, 0x8c, 0x3c, 0x20, 0x4c, 0x1a, 0x4d, 0x29, 0x69, 0xa0, 0xf7, 0xa1, 0x93, 0x09, + 0x46, 0x9d, 0xbb, 0x0c, 0x4c, 0x02, 0x61, 0x0c, 0x9e, 0xfc, 0x5a, 0x94, 0xc2, 0xac, 0xa0, 0x3f, + 0x85, 0x0b, 0xb2, 0x63, 0x7f, 0x59, 0x05, 0xa5, 0x13, 0x58, 0x4c, 0xb8, 0x9d, 0x5b, 0xe1, 0xa8, + 0xbf, 0xb8, 0xc2, 0xd1, 0x0d, 0xe8, 0x25, 0x4b, 0xbd, 0xaa, 0x86, 0x79, 0xdd, 0xd5, 0xf4, 0x9f, + 0x58, 0xd2, 0x1a, 0xba, 0x4f, 0x1c, 0xec, 0x46, 0x24, 0x9a, 0x6a, 0x1b, 0xd0, 0x24, 0xe2, 0x5b, + 0xec, 0x8f, 0x4e, 0x3f, 0x99, 0xe4, 0xf7, 0x73, 0x92, 0x41, 0x91, 0x3d, 0xb2, 0xc6, 0xd4, 0xf7, + 0xd8, 0x1c, 0x11, 0xc7, 0xc1, 0xae, 0x58, 0x60, 0x3e, 0xa5, 0x3f, 0x66, 0xe4, 0x3c, 0xf4, 0x84, + 0x84, 0xb1, 0x35, 0x16, 0x97, 0xd2, 0x0c, 0xfa, 0x82, 0x91, 0x4b, 0xdb, 0x2a, 0xb5, 0xb2, 0xb6, + 0x8a, 0x3e, 0x84, 0x2e, 0x15, 0x1d, 0x3b, 0xa9, 0xf0, 0xb3, 0x2b, 0xb9, 0x65, 0x00, 0x9f, 0x75, + 0x4e, 0xcc, 0xe4, 0x10, 0x57, 0x8d, 0x96, 0x9f, 0xf6, 0x52, 0x72, 0x46, 0xaa, 0x16, 0x8d, 0xf4, + 0xad, 0x02, 0x0b, 0x8f, 0x70, 0xb4, 0xbb, 0xbd, 0xf3, 0x58, 0x34, 0x5a, 0xe9, 0x6f, 0xde, 0xc0, + 0x52, 0xb7, 0x61, 0xde, 0xc7, 0x38, 0x30, 0xcf, 0x88, 0xd0, 0xa1, 0xe4, 0xac, 0xa5, 0x53, 0xa6, + 0x7b, 0xb5, 0x54, 0xf7, 0x77, 0xa1, 0x5b, 0x10, 0x87, 0xee, 0x13, 0x3e, 0x32, 0xb3, 0xfa, 0x13, + 0xc2, 0x14, 0xa0, 0xbf, 0x03, 0x9d, 0x01, 0x8e, 0xbe, 0xdc, 0xdc, 0x93, 0x2e, 0x91, 0xf2, 0x8d, + 0x46, 0x39, 0x73, 0xeb, 0xbe, 0x03, 0x9d, 0x3d, 0xd1, 0xa9, 0xde, 0x65, 0x3d, 0xdf, 0x4b, 0x50, + 0xcf, 0xed, 0x74, 0x31, 0xd2, 0xb7, 0x60, 0x3e, 0x01, 0x26, 0x99, 0xe1, 0x12, 0xd4, 0xbd, 0xa3, + 0xa3, 0x10, 0x27, 0xf7, 0x43, 0x31, 0x92, 0x58, 0x54, 0x72, 0x2c, 0x3e, 0x81, 0x6e, 0xc2, 0xe2, + 0x4b, 0x7f, 0xec, 0x59, 0x0e, 0x75, 0xa6, 0x6f, 0x4d, 0xe9, 0x67, 0xd2, 0x2f, 0x11, 0x43, 0x56, + 0x16, 0x5a, 0xe1, 0x48, 0xd8, 0x90, 0x7d, 0xeb, 0x6b, 0xd0, 0x1c, 0xe0, 0xf1, 0xd1, 0x01, 0x5d, + 0x3b, 0xf7, 0x4b, 0x45, 0xfa, 0xa5, 0x7e, 0x17, 0x16, 0x76, 0xf0, 0x61, 0x3c, 0x7c, 0x4a, 0xdc, + 0xe3, 0x1d, 0x6c, 0xf3, 0x97, 0x83, 0x45, 0xa8, 0x4f, 0x71, 0x68, 0xba, 0x1e, 0x5b, 0xa7, 0x69, + 0xcc, 0x4d, 0x71, 0xf8, 0xdc, 0xd3, 0x2f, 0x48, 0xd8, 0x47, 0x38, 0x1a, 0x44, 0x56, 0x84, 0xf5, + 0xbf, 0x54, 0x68, 0xc5, 0x2b, 0xa8, 0x8c, 0xc4, 0x34, 0xb2, 0xa6, 0x5e, 0x1c, 0x25, 0x35, 0x3f, + 0x1f, 0x25, 0xbd, 0x97, 0x4a, 0xd6, 0x7b, 0xb9, 0x04, 0xf5, 0x09, 0xeb, 0x8a, 0x0a, 0xa7, 0x8a, + 0x51, 0xae, 0xc5, 0x53, 0x9b, 0xd1, 0xe2, 0x99, 0x9b, 0xd5, 0xe2, 0x99, 0x79, 0xdb, 0xae, 0x9f, + 0x73, 0xdb, 0x5e, 0x06, 0x08, 0x70, 0x88, 0x23, 0x76, 0x13, 0x66, 0xe7, 0x45, 0xcb, 0x68, 0x31, + 0x0a, 0xbd, 0x74, 0xd2, 0xaa, 0x8b, 0x4f, 0x27, 0x3d, 0x81, 0x26, 0xd3, 0x4c, 0x65, 0xc4, 0xa4, + 0x8f, 0xfa, 0x16, 0x68, 0x81, 0xe8, 0x0b, 0x98, 0x47, 0xd6, 0x31, 0xbf, 0x55, 0x8b, 0xb7, 0x20, + 0x94, 0xcc, 0xec, 0x59, 0xc7, 0xec, 0x5a, 0xad, 0xdd, 0x85, 0x85, 0x14, 0xcd, 0x9a, 0x07, 0xbe, + 0x17, 0xb2, 0x7b, 0x72, 0xc7, 0x98, 0x4f, 0x26, 0x28, 0x70, 0xdf, 0x0b, 0xf5, 0x79, 0xe8, 0x48, + 0x36, 0xf6, 0x7c, 0x7d, 0x1f, 0xd4, 0x94, 0xf0, 0xd4, 0x1b, 0xb2, 0x0b, 0x3e, 0x3e, 0xc1, 0xe3, + 0xe4, 0x35, 0x81, 0x0d, 0xa8, 0x79, 0x0f, 0x63, 0xfb, 0x18, 0x47, 0xc2, 0xe6, 0x62, 0xc4, 0x6e, + 0xf3, 0xf8, 0x34, 0x12, 0x46, 0x67, 0xdf, 0xfa, 0x23, 0xb8, 0x90, 0x72, 0x7c, 0x86, 0x27, 0x5e, + 0x30, 0x35, 0x30, 0x8f, 0x39, 0x39, 0x81, 0x74, 0xb2, 0x04, 0x32, 0x2b, 0x6e, 0x37, 0x60, 0xbe, + 0xc0, 0x88, 0xb9, 0x99, 0x7d, 0x25, 0x01, 0xc1, 0x47, 0xfa, 0x7f, 0xc0, 0xc5, 0x02, 0xf4, 0xab, + 0x80, 0x44, 0xf8, 0xfc, 0x45, 0x05, 0xa7, 0x8a, 0xcc, 0x49, 0xbc, 0xa6, 0x84, 0x23, 0x71, 0x5b, + 0xe4, 0x03, 0xfd, 0x6d, 0x49, 0xa7, 0x3d, 0x4a, 0x49, 0x37, 0x6d, 0x88, 0xed, 0xc8, 0x4b, 0x76, + 0xb8, 0x18, 0xdd, 0xfd, 0x71, 0x11, 0xda, 0xe2, 0x1c, 0x61, 0x75, 0xd8, 0x0a, 0x5c, 0x92, 0x86, + 0x66, 0xf6, 0x60, 0x8a, 0xfe, 0x69, 0xa9, 0xf6, 0xed, 0x1f, 0x7a, 0x8a, 0xb6, 0x94, 0x5e, 0x9e, + 0x19, 0x62, 0x9f, 0xb8, 0x43, 0xa4, 0x88, 0xb9, 0x65, 0xb8, 0x20, 0xcf, 0x89, 0x57, 0x10, 0x54, + 0x59, 0xaa, 0x7d, 0x57, 0x32, 0x2d, 0xde, 0x39, 0x50, 0x55, 0x4c, 0xdf, 0x80, 0x45, 0x79, 0x3a, + 0x7d, 0x14, 0x42, 0x35, 0xc1, 0xbe, 0x20, 0x5c, 0xd6, 0x2e, 0x45, 0x73, 0x02, 0x71, 0x07, 0xae, + 0xe4, 0x56, 0x90, 0x13, 0x17, 0xaa, 0x2f, 0x35, 0x29, 0xe8, 0x8f, 0x14, 0xb8, 0x0e, 0x4b, 0x65, + 0x40, 0x9e, 0x75, 0x50, 0x43, 0x42, 0x6e, 0xc0, 0xd5, 0x32, 0xa4, 0x48, 0x71, 0xa8, 0xb9, 0xd4, + 0xfc, 0x2e, 0x81, 0x16, 0xe4, 0xcb, 0x5e, 0x23, 0x50, 0xab, 0xdc, 0x40, 0xc9, 0x34, 0x08, 0x0b, + 0xe8, 0xd0, 0x2b, 0x30, 0x48, 0x8f, 0x05, 0xd4, 0x16, 0x2c, 0x0a, 0x56, 0xca, 0x00, 0xaa, 0x60, + 0x52, 0x90, 0x22, 0xeb, 0x22, 0xa3, 0x8e, 0x60, 0x71, 0x13, 0x2e, 0xcb, 0x08, 0xa9, 0xa7, 0x8a, + 0xba, 0x02, 0x72, 0x0d, 0xb4, 0x9c, 0x27, 0x59, 0xf1, 0x8b, 0xe6, 0xc5, 0xec, 0x5a, 0x5e, 0x4e, + 0xf9, 0xc2, 0x83, 0xd0, 0x52, 0x9d, 0x62, 0x9a, 0x8a, 0x76, 0x1d, 0x2e, 0xe6, 0x2c, 0x27, 0x9e, + 0xd7, 0xd1, 0x82, 0x10, 0xf4, 0x36, 0x5c, 0x2b, 0x44, 0x52, 0xee, 0x31, 0x09, 0x69, 0x29, 0xae, + 0x57, 0x8a, 0xdb, 0xb2, 0x8f, 0xd1, 0x05, 0xee, 0xa9, 0xdf, 0x95, 0xc8, 0xcc, 0x1f, 0x97, 0xd0, + 0xc5, 0x72, 0xbb, 0xa5, 0xe5, 0x2b, 0x5a, 0x14, 0xcb, 0x5c, 0x85, 0x85, 0x3c, 0x80, 0xf2, 0xbf, + 0x94, 0x6a, 0x9c, 0x8b, 0x97, 0x7c, 0xcf, 0x00, 0x5d, 0x16, 0xa8, 0x82, 0xff, 0xe4, 0x57, 0x59, + 0xd4, 0x13, 0x98, 0xd5, 0x7c, 0x88, 0xe6, 0x1e, 0x6a, 0xd1, 0x95, 0x72, 0x50, 0xee, 0x11, 0x0f, + 0x2d, 0x09, 0x81, 0x57, 0xf3, 0x1a, 0xa5, 0x4f, 0x77, 0xe8, 0xaa, 0x64, 0x94, 0x42, 0x34, 0x64, + 0xaf, 0xb1, 0xe8, 0x5a, 0xf9, 0xae, 0xca, 0x1e, 0x49, 0xd0, 0x72, 0x79, 0xd4, 0x26, 0xd3, 0xd7, + 0xd3, 0xa8, 0xcd, 0xf9, 0x39, 0x39, 0x81, 0xd1, 0x8a, 0xb4, 0x8b, 0x0a, 0x96, 0x91, 0xdb, 0xd2, + 0x48, 0x2f, 0xb7, 0x71, 0xbe, 0x55, 0x8d, 0x56, 0xcb, 0xc3, 0x3b, 0x6b, 0x5f, 0xa3, 0xb5, 0xf2, + 0xf0, 0x96, 0xea, 0x7b, 0x74, 0xbb, 0xdc, 0xbe, 0xb9, 0xa2, 0x1d, 0xdd, 0x11, 0xa0, 0x42, 0x7c, + 0x16, 0xcb, 0x6d, 0xb4, 0x2e, 0x24, 0xba, 0x03, 0xcb, 0xb9, 0xf8, 0x2c, 0x3e, 0x65, 0xa2, 0x8d, + 0x14, 0x78, 0xa5, 0x1c, 0x48, 0xa5, 0xbf, 0x2b, 0x39, 0xed, 0x76, 0xc1, 0x12, 0xb9, 0x56, 0x0d, + 0xba, 0x27, 0xed, 0x30, 0x2d, 0x1f, 0xb2, 0x6c, 0xfe, 0xad, 0xa5, 0xfa, 0x77, 0x7c, 0xbe, 0x60, + 0xd1, 0x7c, 0x07, 0x1f, 0xbd, 0x5d, 0x6e, 0x2f, 0xa9, 0x15, 0x8d, 0xfa, 0xe5, 0x99, 0x5b, 0x34, + 0xa5, 0xd1, 0xfd, 0x72, 0x4b, 0x15, 0x9b, 0x50, 0xe8, 0x9d, 0x74, 0x27, 0x17, 0x3c, 0x2c, 0x77, + 0x0d, 0xd1, 0xbb, 0xa9, 0x5e, 0xeb, 0x79, 0x7e, 0xc5, 0xae, 0x25, 0xda, 0x4c, 0x35, 0x2c, 0x70, + 0xcc, 0xf7, 0x21, 0xd1, 0x7b, 0xb3, 0x38, 0x16, 0x9b, 0x87, 0xe8, 0xfd, 0x94, 0xa3, 0x5e, 0xcc, + 0x6d, 0xd9, 0xbd, 0x08, 0x7d, 0x50, 0x1e, 0xa9, 0xf9, 0x0b, 0x08, 0xfa, 0x50, 0x68, 0x5b, 0xb0, + 0xab, 0xf4, 0xef, 0x46, 0xe8, 0x9f, 0x05, 0xa3, 0x75, 0xb8, 0x9e, 0x53, 0xf4, 0xcc, 0x43, 0x25, + 0xfa, 0x48, 0x20, 0x6f, 0xe5, 0x8f, 0xa1, 0xc2, 0xbb, 0x22, 0xfa, 0x17, 0xb1, 0x66, 0x71, 0x0f, + 0xe5, 0x9a, 0x17, 0xe8, 0x41, 0x7a, 0x4c, 0x2e, 0x97, 0xa1, 0xb2, 0x9c, 0xf8, 0xaf, 0x69, 0x8a, + 0xb9, 0x52, 0x0e, 0xa4, 0xde, 0xff, 0xb7, 0x72, 0x6e, 0x67, 0x2e, 0x49, 0xe8, 0xe3, 0x19, 0x1b, + 0x3c, 0x8f, 0xfa, 0xa4, 0x7c, 0xcd, 0xdc, 0x75, 0x05, 0x7d, 0x2a, 0x58, 0x6d, 0xc0, 0x8d, 0x59, + 0x7a, 0x26, 0x2e, 0xfd, 0x4c, 0x40, 0xef, 0xc1, 0xcd, 0x32, 0x68, 0x7e, 0xcf, 0x6f, 0x09, 0x70, + 0x1f, 0xd6, 0xca, 0xc0, 0x67, 0xf6, 0xfe, 0x43, 0x21, 0xec, 0xbd, 0xbc, 0xee, 0x67, 0xee, 0x15, + 0xc8, 0x59, 0x6a, 0x7e, 0x9f, 0x6c, 0xeb, 0x3b, 0x33, 0xc0, 0xc9, 0xc5, 0x02, 0xe1, 0xa5, 0xda, + 0xf7, 0x25, 0x86, 0xca, 0xdf, 0x35, 0xd0, 0xd1, 0x52, 0xed, 0x87, 0x12, 0x43, 0xe5, 0xaa, 0x65, + 0x34, 0x14, 0xac, 0x0a, 0xe1, 0x2c, 0x57, 0xd0, 0x68, 0x24, 0x18, 0x15, 0x8c, 0x59, 0x52, 0x13, + 0x23, 0x57, 0xb0, 0x2b, 0x84, 0x61, 0x01, 0x8a, 0x3c, 0xc1, 0xf1, 0x2e, 0xac, 0x9c, 0x03, 0x63, + 0x15, 0x2f, 0xf2, 0x05, 0xcb, 0x59, 0xab, 0x67, 0xd5, 0x2b, 0xfa, 0x9a, 0x43, 0x1f, 0xbe, 0x0f, + 0xab, 0xb6, 0x37, 0xe9, 0x87, 0x56, 0xe4, 0x85, 0x23, 0x32, 0xb6, 0x0e, 0xc3, 0x7e, 0x14, 0xe0, + 0x97, 0x5e, 0xd0, 0x1f, 0x93, 0x43, 0xfe, 0x6f, 0x7e, 0x87, 0xf1, 0xd1, 0xc3, 0xce, 0x01, 0x23, + 0x0a, 0xae, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x2a, 0xe4, 0xc0, 0x85, 0x16, 0x28, 0x00, 0x00, +} diff --git a/accounts/usbwallet/internal/trezor/messages.proto b/accounts/usbwallet/internal/trezor/messages.proto new file mode 100644 index 0000000000..178956457e --- /dev/null +++ b/accounts/usbwallet/internal/trezor/messages.proto @@ -0,0 +1,903 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages.proto +// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b. + +/** + * Messages for TREZOR communication + */ + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessage"; + +import "types.proto"; + +/** + * Mapping between Trezor wire identifier (uint) and a protobuf message + */ +enum MessageType { + MessageType_Initialize = 0 [(wire_in) = true]; + MessageType_Ping = 1 [(wire_in) = true]; + MessageType_Success = 2 [(wire_out) = true]; + MessageType_Failure = 3 [(wire_out) = true]; + MessageType_ChangePin = 4 [(wire_in) = true]; + MessageType_WipeDevice = 5 [(wire_in) = true]; + MessageType_FirmwareErase = 6 [(wire_in) = true, (wire_bootloader) = true]; + MessageType_FirmwareUpload = 7 [(wire_in) = true, (wire_bootloader) = true]; + MessageType_FirmwareRequest = 8 [(wire_out) = true, (wire_bootloader) = true]; + MessageType_GetEntropy = 9 [(wire_in) = true]; + MessageType_Entropy = 10 [(wire_out) = true]; + MessageType_GetPublicKey = 11 [(wire_in) = true]; + MessageType_PublicKey = 12 [(wire_out) = true]; + MessageType_LoadDevice = 13 [(wire_in) = true]; + MessageType_ResetDevice = 14 [(wire_in) = true]; + MessageType_SignTx = 15 [(wire_in) = true]; + MessageType_SimpleSignTx = 16 [(wire_in) = true, deprecated = true]; + MessageType_Features = 17 [(wire_out) = true]; + MessageType_PinMatrixRequest = 18 [(wire_out) = true]; + MessageType_PinMatrixAck = 19 [(wire_in) = true, (wire_tiny) = true]; + MessageType_Cancel = 20 [(wire_in) = true]; + MessageType_TxRequest = 21 [(wire_out) = true]; + MessageType_TxAck = 22 [(wire_in) = true]; + MessageType_CipherKeyValue = 23 [(wire_in) = true]; + MessageType_ClearSession = 24 [(wire_in) = true]; + MessageType_ApplySettings = 25 [(wire_in) = true]; + MessageType_ButtonRequest = 26 [(wire_out) = true]; + MessageType_ButtonAck = 27 [(wire_in) = true, (wire_tiny) = true]; + MessageType_ApplyFlags = 28 [(wire_in) = true]; + MessageType_GetAddress = 29 [(wire_in) = true]; + MessageType_Address = 30 [(wire_out) = true]; + MessageType_SelfTest = 32 [(wire_in) = true, (wire_bootloader) = true]; + MessageType_BackupDevice = 34 [(wire_in) = true]; + MessageType_EntropyRequest = 35 [(wire_out) = true]; + MessageType_EntropyAck = 36 [(wire_in) = true]; + MessageType_SignMessage = 38 [(wire_in) = true]; + MessageType_VerifyMessage = 39 [(wire_in) = true]; + MessageType_MessageSignature = 40 [(wire_out) = true]; + MessageType_PassphraseRequest = 41 [(wire_out) = true]; + MessageType_PassphraseAck = 42 [(wire_in) = true, (wire_tiny) = true]; + MessageType_EstimateTxSize = 43 [(wire_in) = true, deprecated = true]; + MessageType_TxSize = 44 [(wire_out) = true, deprecated = true]; + MessageType_RecoveryDevice = 45 [(wire_in) = true]; + MessageType_WordRequest = 46 [(wire_out) = true]; + MessageType_WordAck = 47 [(wire_in) = true]; + MessageType_CipheredKeyValue = 48 [(wire_out) = true]; + MessageType_EncryptMessage = 49 [(wire_in) = true, deprecated = true]; + MessageType_EncryptedMessage = 50 [(wire_out) = true, deprecated = true]; + MessageType_DecryptMessage = 51 [(wire_in) = true, deprecated = true]; + MessageType_DecryptedMessage = 52 [(wire_out) = true, deprecated = true]; + MessageType_SignIdentity = 53 [(wire_in) = true]; + MessageType_SignedIdentity = 54 [(wire_out) = true]; + MessageType_GetFeatures = 55 [(wire_in) = true]; + MessageType_EthereumGetAddress = 56 [(wire_in) = true]; + MessageType_EthereumAddress = 57 [(wire_out) = true]; + MessageType_EthereumSignTx = 58 [(wire_in) = true]; + MessageType_EthereumTxRequest = 59 [(wire_out) = true]; + MessageType_EthereumTxAck = 60 [(wire_in) = true]; + MessageType_GetECDHSessionKey = 61 [(wire_in) = true]; + MessageType_ECDHSessionKey = 62 [(wire_out) = true]; + MessageType_SetU2FCounter = 63 [(wire_in) = true]; + MessageType_EthereumSignMessage = 64 [(wire_in) = true]; + MessageType_EthereumVerifyMessage = 65 [(wire_in) = true]; + MessageType_EthereumMessageSignature = 66 [(wire_out) = true]; + MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true, (wire_tiny) = true]; + MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true]; + MessageType_DebugLinkState = 102 [(wire_debug_out) = true]; + MessageType_DebugLinkStop = 103 [(wire_debug_in) = true]; + MessageType_DebugLinkLog = 104 [(wire_debug_out) = true]; + MessageType_DebugLinkMemoryRead = 110 [(wire_debug_in) = true]; + MessageType_DebugLinkMemory = 111 [(wire_debug_out) = true]; + MessageType_DebugLinkMemoryWrite = 112 [(wire_debug_in) = true]; + MessageType_DebugLinkFlashErase = 113 [(wire_debug_in) = true]; +} + +//////////////////// +// Basic messages // +//////////////////// + +/** + * Request: Reset device to default state and ask for device details + * @next Features + */ +message Initialize { +} + +/** + * Request: Ask for device details (no device reset) + * @next Features + */ +message GetFeatures { +} + +/** + * Response: Reports various information about the device + * @prev Initialize + * @prev GetFeatures + */ +message Features { + optional string vendor = 1; // name of the manufacturer, e.g. "bitcointrezor.com" + optional uint32 major_version = 2; // major version of the device, e.g. 1 + optional uint32 minor_version = 3; // minor version of the device, e.g. 0 + optional uint32 patch_version = 4; // patch version of the device, e.g. 0 + optional bool bootloader_mode = 5; // is device in bootloader mode? + optional string device_id = 6; // device's unique identifier + optional bool pin_protection = 7; // is device protected by PIN? + optional bool passphrase_protection = 8; // is node/mnemonic encrypted using passphrase? + optional string language = 9; // device language + optional string label = 10; // device description label + repeated CoinType coins = 11; // supported coins + optional bool initialized = 12; // does device contain seed? + optional bytes revision = 13; // SCM revision of firmware + optional bytes bootloader_hash = 14; // hash of the bootloader + optional bool imported = 15; // was storage imported from an external source? + optional bool pin_cached = 16; // is PIN already cached in session? + optional bool passphrase_cached = 17; // is passphrase already cached in session? + optional bool firmware_present = 18; // is valid firmware loaded? + optional bool needs_backup = 19; // does storage need backup? (equals to Storage.needs_backup) + optional uint32 flags = 20; // device flags (equals to Storage.flags) +} + +/** + * Request: clear session (removes cached PIN, passphrase, etc). + * @next Success + */ +message ClearSession { +} + +/** + * Request: change language and/or label of the device + * @next Success + * @next Failure + * @next ButtonRequest + * @next PinMatrixRequest + */ +message ApplySettings { + optional string language = 1; + optional string label = 2; + optional bool use_passphrase = 3; + optional bytes homescreen = 4; +} + +/** + * Request: set flags of the device + * @next Success + * @next Failure + */ +message ApplyFlags { + optional uint32 flags = 1; // bitmask, can only set bits, not unset +} + +/** + * Request: Starts workflow for setting/changing/removing the PIN + * @next ButtonRequest + * @next PinMatrixRequest + */ +message ChangePin { + optional bool remove = 1; // is PIN removal requested? +} + +/** + * Request: Test if the device is alive, device sends back the message in Success response + * @next Success + */ +message Ping { + optional string message = 1; // message to send back in Success message + optional bool button_protection = 2; // ask for button press + optional bool pin_protection = 3; // ask for PIN if set in device + optional bool passphrase_protection = 4; // ask for passphrase if set in device +} + +/** + * Response: Success of the previous request + */ +message Success { + optional string message = 1; // human readable description of action or request-specific payload +} + +/** + * Response: Failure of the previous request + */ +message Failure { + optional FailureType code = 1; // computer-readable definition of the error state + optional string message = 2; // human-readable message of the error state +} + +/** + * Response: Device is waiting for HW button press. + * @next ButtonAck + * @next Cancel + */ +message ButtonRequest { + optional ButtonRequestType code = 1; + optional string data = 2; +} + +/** + * Request: Computer agrees to wait for HW button press + * @prev ButtonRequest + */ +message ButtonAck { +} + +/** + * Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme + * @next PinMatrixAck + * @next Cancel + */ +message PinMatrixRequest { + optional PinMatrixRequestType type = 1; +} + +/** + * Request: Computer responds with encoded PIN + * @prev PinMatrixRequest + */ +message PinMatrixAck { + required string pin = 1; // matrix encoded PIN entered by user +} + +/** + * Request: Abort last operation that required user interaction + * @prev ButtonRequest + * @prev PinMatrixRequest + * @prev PassphraseRequest + */ +message Cancel { +} + +/** + * Response: Device awaits encryption passphrase + * @next PassphraseAck + * @next Cancel + */ +message PassphraseRequest { +} + +/** + * Request: Send passphrase back + * @prev PassphraseRequest + */ +message PassphraseAck { + required string passphrase = 1; +} + +/** + * Request: Request a sample of random data generated by hardware RNG. May be used for testing. + * @next ButtonRequest + * @next Entropy + * @next Failure + */ +message GetEntropy { + required uint32 size = 1; // size of requested entropy +} + +/** + * Response: Reply with random data generated by internal RNG + * @prev GetEntropy + */ +message Entropy { + required bytes entropy = 1; // stream of random generated bytes +} + +/** + * Request: Ask device for public key corresponding to address_n path + * @next PassphraseRequest + * @next PublicKey + * @next Failure + */ +message GetPublicKey { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional string ecdsa_curve_name = 2; // ECDSA curve name to use + optional bool show_display = 3; // optionally show on display before sending the result + optional string coin_name = 4 [default='Bitcoin']; +} + +/** + * Response: Contains public key derived from device private seed + * @prev GetPublicKey + */ +message PublicKey { + required HDNodeType node = 1; // BIP32 public node + optional string xpub = 2; // serialized form of public node +} + +/** + * Request: Ask device for address corresponding to address_n path + * @next PassphraseRequest + * @next Address + * @next Failure + */ +message GetAddress { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional string coin_name = 2 [default='Bitcoin']; + optional bool show_display = 3 ; // optionally show on display before sending the result + optional MultisigRedeemScriptType multisig = 4; // filled if we are showing a multisig address + optional InputScriptType script_type = 5 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) +} + +/** + * Request: Ask device for Ethereum address corresponding to address_n path + * @next PassphraseRequest + * @next EthereumAddress + * @next Failure + */ +message EthereumGetAddress { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bool show_display = 2; // optionally show on display before sending the result +} + +/** + * Response: Contains address derived from device private seed + * @prev GetAddress + */ +message Address { + required string address = 1; // Coin address in Base58 encoding +} + +/** + * Response: Contains an Ethereum address derived from device private seed + * @prev EthereumGetAddress + */ +message EthereumAddress { + required bytes address = 1; // Coin address as an Ethereum 160 bit hash +} + +/** + * Request: Request device to wipe all sensitive data and settings + * @next ButtonRequest + */ +message WipeDevice { +} + +/** + * Request: Load seed and related internal settings from the computer + * @next ButtonRequest + * @next Success + * @next Failure + */ +message LoadDevice { + optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words) + optional HDNodeType node = 2; // BIP-32 node + optional string pin = 3; // set PIN protection + optional bool passphrase_protection = 4; // enable master node encryption using passphrase + optional string language = 5 [default='english']; // device language + optional string label = 6; // device label + optional bool skip_checksum = 7; // do not test mnemonic for valid BIP-39 checksum + optional uint32 u2f_counter = 8; // U2F counter +} + +/** + * Request: Ask device to do initialization involving user interaction + * @next EntropyRequest + * @next Failure + */ +message ResetDevice { + optional bool display_random = 1; // display entropy generated by the device before asking for additional entropy + optional uint32 strength = 2 [default=256]; // strength of seed in bits + optional bool passphrase_protection = 3; // enable master node encryption using passphrase + optional bool pin_protection = 4; // enable PIN protection + optional string language = 5 [default='english']; // device language + optional string label = 6; // device label + optional uint32 u2f_counter = 7; // U2F counter + optional bool skip_backup = 8; // postpone seed backup to BackupDevice workflow +} + +/** + * Request: Perform backup of the device seed if not backed up using ResetDevice + * @next ButtonRequest + */ +message BackupDevice { +} + +/** + * Response: Ask for additional entropy from host computer + * @prev ResetDevice + * @next EntropyAck + */ +message EntropyRequest { +} + +/** + * Request: Provide additional entropy for seed generation function + * @prev EntropyRequest + * @next ButtonRequest + */ +message EntropyAck { + optional bytes entropy = 1; // 256 bits (32 bytes) of random data +} + +/** + * Request: Start recovery workflow asking user for specific words of mnemonic + * Used to recovery device safely even on untrusted computer. + * @next WordRequest + */ +message RecoveryDevice { + optional uint32 word_count = 1; // number of words in BIP-39 mnemonic + optional bool passphrase_protection = 2; // enable master node encryption using passphrase + optional bool pin_protection = 3; // enable PIN protection + optional string language = 4 [default='english']; // device language + optional string label = 5; // device label + optional bool enforce_wordlist = 6; // enforce BIP-39 wordlist during the process + // 7 reserved for unused recovery method + optional uint32 type = 8; // supported recovery type (see RecoveryType) + optional uint32 u2f_counter = 9; // U2F counter + optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation) +} + +/** + * Response: Device is waiting for user to enter word of the mnemonic + * Its position is shown only on device's internal display. + * @prev RecoveryDevice + * @prev WordAck + */ +message WordRequest { + optional WordRequestType type = 1; +} + +/** + * Request: Computer replies with word from the mnemonic + * @prev WordRequest + * @next WordRequest + * @next Success + * @next Failure + */ +message WordAck { + required string word = 1; // one word of mnemonic on asked position +} + +////////////////////////////// +// Message signing messages // +////////////////////////////// + +/** + * Request: Ask device to sign message + * @next MessageSignature + * @next Failure + */ +message SignMessage { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + required bytes message = 2; // message to be signed + optional string coin_name = 3 [default='Bitcoin']; // coin to use for signing + optional InputScriptType script_type = 4 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) +} + +/** + * Request: Ask device to verify message + * @next Success + * @next Failure + */ +message VerifyMessage { + optional string address = 1; // address to verify + optional bytes signature = 2; // signature to verify + optional bytes message = 3; // message to verify + optional string coin_name = 4 [default='Bitcoin']; // coin to use for verifying +} + +/** + * Response: Signed message + * @prev SignMessage + */ +message MessageSignature { + optional string address = 1; // address used to sign the message + optional bytes signature = 2; // signature of the message +} + +/////////////////////////// +// Encryption/decryption // +/////////////////////////// + +/** + * Request: Ask device to encrypt message + * @next EncryptedMessage + * @next Failure + */ +message EncryptMessage { + optional bytes pubkey = 1; // public key + optional bytes message = 2; // message to encrypt + optional bool display_only = 3; // show just on display? (don't send back via wire) + repeated uint32 address_n = 4; // BIP-32 path to derive the signing key from master node + optional string coin_name = 5 [default='Bitcoin']; // coin to use for signing +} + +/** + * Response: Encrypted message + * @prev EncryptMessage + */ +message EncryptedMessage { + optional bytes nonce = 1; // nonce used during encryption + optional bytes message = 2; // encrypted message + optional bytes hmac = 3; // message hmac +} + +/** + * Request: Ask device to decrypt message + * @next Success + * @next Failure + */ +message DecryptMessage { + repeated uint32 address_n = 1; // BIP-32 path to derive the decryption key from master node + optional bytes nonce = 2; // nonce used during encryption + optional bytes message = 3; // message to decrypt + optional bytes hmac = 4; // message hmac +} + +/** + * Response: Decrypted message + * @prev DecryptedMessage + */ +message DecryptedMessage { + optional bytes message = 1; // decrypted message + optional string address = 2; // address used to sign the message (if used) +} + +/** + * Request: Ask device to encrypt or decrypt value of given key + * @next CipheredKeyValue + * @next Failure + */ +message CipherKeyValue { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional string key = 2; // key component of key:value + optional bytes value = 3; // value component of key:value + optional bool encrypt = 4; // are we encrypting (True) or decrypting (False)? + optional bool ask_on_encrypt = 5; // should we ask on encrypt operation? + optional bool ask_on_decrypt = 6; // should we ask on decrypt operation? + optional bytes iv = 7; // initialization vector (will be computed if not set) +} + +/** + * Response: Return ciphered/deciphered value + * @prev CipherKeyValue + */ +message CipheredKeyValue { + optional bytes value = 1; // ciphered/deciphered value +} + +////////////////////////////////// +// Transaction signing messages // +////////////////////////////////// + +/** + * Request: Estimated size of the transaction + * This behaves exactly like SignTx, which means that it can ask using TxRequest + * This call is non-blocking (except possible PassphraseRequest to unlock the seed) + * @next TxSize + * @next Failure + */ +message EstimateTxSize { + required uint32 outputs_count = 1; // number of transaction outputs + required uint32 inputs_count = 2; // number of transaction inputs + optional string coin_name = 3 [default='Bitcoin']; // coin to use +} + +/** + * Response: Estimated size of the transaction + * @prev EstimateTxSize + */ +message TxSize { + optional uint32 tx_size = 1; // estimated size of transaction in bytes +} + +/** + * Request: Ask device to sign transaction + * @next PassphraseRequest + * @next PinMatrixRequest + * @next TxRequest + * @next Failure + */ +message SignTx { + required uint32 outputs_count = 1; // number of transaction outputs + required uint32 inputs_count = 2; // number of transaction inputs + optional string coin_name = 3 [default='Bitcoin']; // coin to use + optional uint32 version = 4 [default=1]; // transaction version + optional uint32 lock_time = 5 [default=0]; // transaction lock_time +} + +/** + * Request: Simplified transaction signing + * This method doesn't support streaming, so there are hardware limits in number of inputs and outputs. + * In case of success, the result is returned using TxRequest message. + * @next PassphraseRequest + * @next PinMatrixRequest + * @next TxRequest + * @next Failure + */ +message SimpleSignTx { + repeated TxInputType inputs = 1; // transaction inputs + repeated TxOutputType outputs = 2; // transaction outputs + repeated TransactionType transactions = 3; // transactions whose outputs are used to build current inputs + optional string coin_name = 4 [default='Bitcoin']; // coin to use + optional uint32 version = 5 [default=1]; // transaction version + optional uint32 lock_time = 6 [default=0]; // transaction lock_time +} + +/** + * Response: Device asks for information for signing transaction or returns the last result + * If request_index is set, device awaits TxAck message (with fields filled in according to request_type) + * If signature_index is set, 'signature' contains signed input of signature_index's input + * @prev SignTx + * @prev SimpleSignTx + * @prev TxAck + */ +message TxRequest { + optional RequestType request_type = 1; // what should be filled in TxAck message? + optional TxRequestDetailsType details = 2; // request for tx details + optional TxRequestSerializedType serialized = 3; // serialized data and request for next +} + +/** + * Request: Reported transaction data + * @prev TxRequest + * @next TxRequest + */ +message TxAck { + optional TransactionType tx = 1; +} + +/** + * Request: Ask device to sign transaction + * All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. + * Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. + * @next PassphraseRequest + * @next PinMatrixRequest + * @next EthereumTxRequest + * @next Failure + */ +message EthereumSignTx { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bytes nonce = 2; // <=256 bit unsigned big endian + optional bytes gas_price = 3; // <=256 bit unsigned big endian (in wei) + optional bytes gas_limit = 4; // <=256 bit unsigned big endian + optional bytes to = 5; // 160 bit address hash + optional bytes value = 6; // <=256 bit unsigned big endian (in wei) + optional bytes data_initial_chunk = 7; // The initial data chunk (<= 1024 bytes) + optional uint32 data_length = 8; // Length of transaction payload + optional uint32 chain_id = 9; // Chain Id for EIP 155 +} + +/** + * Response: Device asks for more data from transaction payload, or returns the signature. + * If data_length is set, device awaits that many more bytes of payload. + * Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. + * @prev EthereumSignTx + * @next EthereumTxAck + */ +message EthereumTxRequest { + optional uint32 data_length = 1; // Number of bytes being requested (<= 1024) + optional uint32 signature_v = 2; // Computed signature (recovery parameter, limited to 27 or 28) + optional bytes signature_r = 3; // Computed signature R component (256 bit) + optional bytes signature_s = 4; // Computed signature S component (256 bit) +} + +/** + * Request: Transaction payload data. + * @prev EthereumTxRequest + * @next EthereumTxRequest + */ +message EthereumTxAck { + optional bytes data_chunk = 1; // Bytes from transaction payload (<= 1024 bytes) +} + +//////////////////////////////////////// +// Ethereum: Message signing messages // +//////////////////////////////////////// + +/** + * Request: Ask device to sign message + * @next EthereumMessageSignature + * @next Failure + */ +message EthereumSignMessage { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + required bytes message = 2; // message to be signed +} + +/** + * Request: Ask device to verify message + * @next Success + * @next Failure + */ +message EthereumVerifyMessage { + optional bytes address = 1; // address to verify + optional bytes signature = 2; // signature to verify + optional bytes message = 3; // message to verify +} + +/** + * Response: Signed message + * @prev EthereumSignMessage + */ +message EthereumMessageSignature { + optional bytes address = 1; // address used to sign the message + optional bytes signature = 2; // signature of the message +} + +/////////////////////// +// Identity messages // +/////////////////////// + +/** + * Request: Ask device to sign identity + * @next SignedIdentity + * @next Failure + */ +message SignIdentity { + optional IdentityType identity = 1; // identity + optional bytes challenge_hidden = 2; // non-visible challenge + optional string challenge_visual = 3; // challenge shown on display (e.g. date+time) + optional string ecdsa_curve_name = 4; // ECDSA curve name to use +} + +/** + * Response: Device provides signed identity + * @prev SignIdentity + */ +message SignedIdentity { + optional string address = 1; // identity address + optional bytes public_key = 2; // identity public key + optional bytes signature = 3; // signature of the identity data +} + +/////////////////// +// ECDH messages // +/////////////////// + +/** + * Request: Ask device to generate ECDH session key + * @next ECDHSessionKey + * @next Failure + */ +message GetECDHSessionKey { + optional IdentityType identity = 1; // identity + optional bytes peer_public_key = 2; // peer's public key + optional string ecdsa_curve_name = 3; // ECDSA curve name to use +} + +/** + * Response: Device provides ECDH session key + * @prev GetECDHSessionKey + */ +message ECDHSessionKey { + optional bytes session_key = 1; // ECDH session key +} + +/////////////////// +// U2F messages // +/////////////////// + +/** + * Request: Set U2F counter + * @next Success + */ +message SetU2FCounter { + optional uint32 u2f_counter = 1; // counter +} + +///////////////////////// +// Bootloader messages // +///////////////////////// + +/** + * Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload) + * @next Success + * @next FirmwareRequest + * @next Failure + */ +message FirmwareErase { + optional uint32 length = 1; // length of new firmware +} + +/** + * Response: Ask for firmware chunk + * @next FirmwareUpload + */ +message FirmwareRequest { + optional uint32 offset = 1; // offset of requested firmware chunk + optional uint32 length = 2; // length of requested firmware chunk +} + +/** + * Request: Send firmware in binary form to the device + * @next Success + * @next Failure + */ +message FirmwareUpload { + required bytes payload = 1; // firmware to be loaded into device + optional bytes hash = 2; // hash of the payload +} + + +/** + * Request: Perform a device self-test + * @next Success + * @next Failure + */ +message SelfTest { + optional bytes payload = 1; // payload to be used in self-test +} + +///////////////////////////////////////////////////////////// +// Debug messages (only available if DebugLink is enabled) // +///////////////////////////////////////////////////////////// + +/** + * Request: "Press" the button on the device + * @next Success + */ +message DebugLinkDecision { + required bool yes_no = 1; // true for "Confirm", false for "Cancel" +} + +/** + * Request: Computer asks for device state + * @next DebugLinkState + */ +message DebugLinkGetState { +} + +/** + * Response: Device current state + * @prev DebugLinkGetState + */ +message DebugLinkState { + optional bytes layout = 1; // raw buffer of display + optional string pin = 2; // current PIN, blank if PIN is not set/enabled + optional string matrix = 3; // current PIN matrix + optional string mnemonic = 4; // current BIP-39 mnemonic + optional HDNodeType node = 5; // current BIP-32 node + optional bool passphrase_protection = 6; // is node/mnemonic encrypted using passphrase? + optional string reset_word = 7; // word on device display during ResetDevice workflow + optional bytes reset_entropy = 8; // current entropy during ResetDevice workflow + optional string recovery_fake_word = 9; // (fake) word on display during RecoveryDevice workflow + optional uint32 recovery_word_pos = 10; // index of mnemonic word the device is expecting during RecoveryDevice workflow +} + +/** + * Request: Ask device to restart + */ +message DebugLinkStop { +} + +/** + * Response: Device wants host to log event + */ +message DebugLinkLog { + optional uint32 level = 1; + optional string bucket = 2; + optional string text = 3; +} + +/** + * Request: Read memory from device + * @next DebugLinkMemory + */ +message DebugLinkMemoryRead { + optional uint32 address = 1; + optional uint32 length = 2; +} + +/** + * Response: Device sends memory back + * @prev DebugLinkMemoryRead + */ +message DebugLinkMemory { + optional bytes memory = 1; +} + +/** + * Request: Write memory to device. + * WARNING: Writing to the wrong location can irreparably break the device. + */ +message DebugLinkMemoryWrite { + optional uint32 address = 1; + optional bytes memory = 2; + optional bool flash = 3; +} + +/** + * Request: Erase block of flash on device + * WARNING: Writing to the wrong location can irreparably break the device. + */ +message DebugLinkFlashErase { + optional uint32 sector = 1; +} diff --git a/accounts/usbwallet/internal/trezor/trezor.go b/accounts/usbwallet/internal/trezor/trezor.go new file mode 100644 index 0000000000..487aeb5f81 --- /dev/null +++ b/accounts/usbwallet/internal/trezor/trezor.go @@ -0,0 +1,46 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// This file contains the implementation for interacting with the Trezor hardware +// wallets. The wire protocol spec can be found on the SatoshiLabs website: +// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html + +//go:generate protoc --go_out=Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor,import_path=trezor:. types.proto messages.proto + +// Package trezor contains the wire protocol wrapper in Go. +package trezor + +import ( + "reflect" + + "github.com/golang/protobuf/proto" +) + +// Type returns the protocol buffer type number of a specific message. If the +// message is nil, this method panics! +func Type(msg proto.Message) uint16 { + return uint16(MessageType_value["MessageType_"+reflect.TypeOf(msg).Elem().Name()]) +} + +// Name returns the friendly message type name of a specific protocol buffer +// type numbers. +func Name(kind uint16) string { + name := MessageType_name[int32(kind)] + if len(name) < 12 { + return name + } + return name[12:] +} diff --git a/accounts/usbwallet/internal/trezor/types.pb.go b/accounts/usbwallet/internal/trezor/types.pb.go new file mode 100644 index 0000000000..25b7672d23 --- /dev/null +++ b/accounts/usbwallet/internal/trezor/types.pb.go @@ -0,0 +1,1333 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: types.proto + +/* +Package trezor is a generated protocol buffer package. + +It is generated from these files: + types.proto + messages.proto + +It has these top-level messages: + HDNodeType + HDNodePathType + CoinType + MultisigRedeemScriptType + TxInputType + TxOutputType + TxOutputBinType + TransactionType + TxRequestDetailsType + TxRequestSerializedType + IdentityType + Initialize + GetFeatures + Features + ClearSession + ApplySettings + ApplyFlags + ChangePin + Ping + Success + Failure + ButtonRequest + ButtonAck + PinMatrixRequest + PinMatrixAck + Cancel + PassphraseRequest + PassphraseAck + GetEntropy + Entropy + GetPublicKey + PublicKey + GetAddress + EthereumGetAddress + Address + EthereumAddress + WipeDevice + LoadDevice + ResetDevice + BackupDevice + EntropyRequest + EntropyAck + RecoveryDevice + WordRequest + WordAck + SignMessage + VerifyMessage + MessageSignature + EncryptMessage + EncryptedMessage + DecryptMessage + DecryptedMessage + CipherKeyValue + CipheredKeyValue + EstimateTxSize + TxSize + SignTx + SimpleSignTx + TxRequest + TxAck + EthereumSignTx + EthereumTxRequest + EthereumTxAck + EthereumSignMessage + EthereumVerifyMessage + EthereumMessageSignature + SignIdentity + SignedIdentity + GetECDHSessionKey + ECDHSessionKey + SetU2FCounter + FirmwareErase + FirmwareRequest + FirmwareUpload + SelfTest + DebugLinkDecision + DebugLinkGetState + DebugLinkState + DebugLinkStop + DebugLinkLog + DebugLinkMemoryRead + DebugLinkMemory + DebugLinkMemoryWrite + DebugLinkFlashErase +*/ +package trezor + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// * +// Type of failures returned by Failure message +// @used_in Failure +type FailureType int32 + +const ( + FailureType_Failure_UnexpectedMessage FailureType = 1 + FailureType_Failure_ButtonExpected FailureType = 2 + FailureType_Failure_DataError FailureType = 3 + FailureType_Failure_ActionCancelled FailureType = 4 + FailureType_Failure_PinExpected FailureType = 5 + FailureType_Failure_PinCancelled FailureType = 6 + FailureType_Failure_PinInvalid FailureType = 7 + FailureType_Failure_InvalidSignature FailureType = 8 + FailureType_Failure_ProcessError FailureType = 9 + FailureType_Failure_NotEnoughFunds FailureType = 10 + FailureType_Failure_NotInitialized FailureType = 11 + FailureType_Failure_FirmwareError FailureType = 99 +) + +var FailureType_name = map[int32]string{ + 1: "Failure_UnexpectedMessage", + 2: "Failure_ButtonExpected", + 3: "Failure_DataError", + 4: "Failure_ActionCancelled", + 5: "Failure_PinExpected", + 6: "Failure_PinCancelled", + 7: "Failure_PinInvalid", + 8: "Failure_InvalidSignature", + 9: "Failure_ProcessError", + 10: "Failure_NotEnoughFunds", + 11: "Failure_NotInitialized", + 99: "Failure_FirmwareError", +} +var FailureType_value = map[string]int32{ + "Failure_UnexpectedMessage": 1, + "Failure_ButtonExpected": 2, + "Failure_DataError": 3, + "Failure_ActionCancelled": 4, + "Failure_PinExpected": 5, + "Failure_PinCancelled": 6, + "Failure_PinInvalid": 7, + "Failure_InvalidSignature": 8, + "Failure_ProcessError": 9, + "Failure_NotEnoughFunds": 10, + "Failure_NotInitialized": 11, + "Failure_FirmwareError": 99, +} + +func (x FailureType) Enum() *FailureType { + p := new(FailureType) + *p = x + return p +} +func (x FailureType) String() string { + return proto.EnumName(FailureType_name, int32(x)) +} +func (x *FailureType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FailureType_value, data, "FailureType") + if err != nil { + return err + } + *x = FailureType(value) + return nil +} +func (FailureType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +// * +// Type of script which will be used for transaction output +// @used_in TxOutputType +type OutputScriptType int32 + +const ( + OutputScriptType_PAYTOADDRESS OutputScriptType = 0 + OutputScriptType_PAYTOSCRIPTHASH OutputScriptType = 1 + OutputScriptType_PAYTOMULTISIG OutputScriptType = 2 + OutputScriptType_PAYTOOPRETURN OutputScriptType = 3 + OutputScriptType_PAYTOWITNESS OutputScriptType = 4 + OutputScriptType_PAYTOP2SHWITNESS OutputScriptType = 5 +) + +var OutputScriptType_name = map[int32]string{ + 0: "PAYTOADDRESS", + 1: "PAYTOSCRIPTHASH", + 2: "PAYTOMULTISIG", + 3: "PAYTOOPRETURN", + 4: "PAYTOWITNESS", + 5: "PAYTOP2SHWITNESS", +} +var OutputScriptType_value = map[string]int32{ + "PAYTOADDRESS": 0, + "PAYTOSCRIPTHASH": 1, + "PAYTOMULTISIG": 2, + "PAYTOOPRETURN": 3, + "PAYTOWITNESS": 4, + "PAYTOP2SHWITNESS": 5, +} + +func (x OutputScriptType) Enum() *OutputScriptType { + p := new(OutputScriptType) + *p = x + return p +} +func (x OutputScriptType) String() string { + return proto.EnumName(OutputScriptType_name, int32(x)) +} +func (x *OutputScriptType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(OutputScriptType_value, data, "OutputScriptType") + if err != nil { + return err + } + *x = OutputScriptType(value) + return nil +} +func (OutputScriptType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +// * +// Type of script which will be used for transaction output +// @used_in TxInputType +type InputScriptType int32 + +const ( + InputScriptType_SPENDADDRESS InputScriptType = 0 + InputScriptType_SPENDMULTISIG InputScriptType = 1 + InputScriptType_EXTERNAL InputScriptType = 2 + InputScriptType_SPENDWITNESS InputScriptType = 3 + InputScriptType_SPENDP2SHWITNESS InputScriptType = 4 +) + +var InputScriptType_name = map[int32]string{ + 0: "SPENDADDRESS", + 1: "SPENDMULTISIG", + 2: "EXTERNAL", + 3: "SPENDWITNESS", + 4: "SPENDP2SHWITNESS", +} +var InputScriptType_value = map[string]int32{ + "SPENDADDRESS": 0, + "SPENDMULTISIG": 1, + "EXTERNAL": 2, + "SPENDWITNESS": 3, + "SPENDP2SHWITNESS": 4, +} + +func (x InputScriptType) Enum() *InputScriptType { + p := new(InputScriptType) + *p = x + return p +} +func (x InputScriptType) String() string { + return proto.EnumName(InputScriptType_name, int32(x)) +} +func (x *InputScriptType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(InputScriptType_value, data, "InputScriptType") + if err != nil { + return err + } + *x = InputScriptType(value) + return nil +} +func (InputScriptType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +// * +// Type of information required by transaction signing process +// @used_in TxRequest +type RequestType int32 + +const ( + RequestType_TXINPUT RequestType = 0 + RequestType_TXOUTPUT RequestType = 1 + RequestType_TXMETA RequestType = 2 + RequestType_TXFINISHED RequestType = 3 + RequestType_TXEXTRADATA RequestType = 4 +) + +var RequestType_name = map[int32]string{ + 0: "TXINPUT", + 1: "TXOUTPUT", + 2: "TXMETA", + 3: "TXFINISHED", + 4: "TXEXTRADATA", +} +var RequestType_value = map[string]int32{ + "TXINPUT": 0, + "TXOUTPUT": 1, + "TXMETA": 2, + "TXFINISHED": 3, + "TXEXTRADATA": 4, +} + +func (x RequestType) Enum() *RequestType { + p := new(RequestType) + *p = x + return p +} +func (x RequestType) String() string { + return proto.EnumName(RequestType_name, int32(x)) +} +func (x *RequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RequestType_value, data, "RequestType") + if err != nil { + return err + } + *x = RequestType(value) + return nil +} +func (RequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +// * +// Type of button request +// @used_in ButtonRequest +type ButtonRequestType int32 + +const ( + ButtonRequestType_ButtonRequest_Other ButtonRequestType = 1 + ButtonRequestType_ButtonRequest_FeeOverThreshold ButtonRequestType = 2 + ButtonRequestType_ButtonRequest_ConfirmOutput ButtonRequestType = 3 + ButtonRequestType_ButtonRequest_ResetDevice ButtonRequestType = 4 + ButtonRequestType_ButtonRequest_ConfirmWord ButtonRequestType = 5 + ButtonRequestType_ButtonRequest_WipeDevice ButtonRequestType = 6 + ButtonRequestType_ButtonRequest_ProtectCall ButtonRequestType = 7 + ButtonRequestType_ButtonRequest_SignTx ButtonRequestType = 8 + ButtonRequestType_ButtonRequest_FirmwareCheck ButtonRequestType = 9 + ButtonRequestType_ButtonRequest_Address ButtonRequestType = 10 + ButtonRequestType_ButtonRequest_PublicKey ButtonRequestType = 11 +) + +var ButtonRequestType_name = map[int32]string{ + 1: "ButtonRequest_Other", + 2: "ButtonRequest_FeeOverThreshold", + 3: "ButtonRequest_ConfirmOutput", + 4: "ButtonRequest_ResetDevice", + 5: "ButtonRequest_ConfirmWord", + 6: "ButtonRequest_WipeDevice", + 7: "ButtonRequest_ProtectCall", + 8: "ButtonRequest_SignTx", + 9: "ButtonRequest_FirmwareCheck", + 10: "ButtonRequest_Address", + 11: "ButtonRequest_PublicKey", +} +var ButtonRequestType_value = map[string]int32{ + "ButtonRequest_Other": 1, + "ButtonRequest_FeeOverThreshold": 2, + "ButtonRequest_ConfirmOutput": 3, + "ButtonRequest_ResetDevice": 4, + "ButtonRequest_ConfirmWord": 5, + "ButtonRequest_WipeDevice": 6, + "ButtonRequest_ProtectCall": 7, + "ButtonRequest_SignTx": 8, + "ButtonRequest_FirmwareCheck": 9, + "ButtonRequest_Address": 10, + "ButtonRequest_PublicKey": 11, +} + +func (x ButtonRequestType) Enum() *ButtonRequestType { + p := new(ButtonRequestType) + *p = x + return p +} +func (x ButtonRequestType) String() string { + return proto.EnumName(ButtonRequestType_name, int32(x)) +} +func (x *ButtonRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ButtonRequestType_value, data, "ButtonRequestType") + if err != nil { + return err + } + *x = ButtonRequestType(value) + return nil +} +func (ButtonRequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +// * +// Type of PIN request +// @used_in PinMatrixRequest +type PinMatrixRequestType int32 + +const ( + PinMatrixRequestType_PinMatrixRequestType_Current PinMatrixRequestType = 1 + PinMatrixRequestType_PinMatrixRequestType_NewFirst PinMatrixRequestType = 2 + PinMatrixRequestType_PinMatrixRequestType_NewSecond PinMatrixRequestType = 3 +) + +var PinMatrixRequestType_name = map[int32]string{ + 1: "PinMatrixRequestType_Current", + 2: "PinMatrixRequestType_NewFirst", + 3: "PinMatrixRequestType_NewSecond", +} +var PinMatrixRequestType_value = map[string]int32{ + "PinMatrixRequestType_Current": 1, + "PinMatrixRequestType_NewFirst": 2, + "PinMatrixRequestType_NewSecond": 3, +} + +func (x PinMatrixRequestType) Enum() *PinMatrixRequestType { + p := new(PinMatrixRequestType) + *p = x + return p +} +func (x PinMatrixRequestType) String() string { + return proto.EnumName(PinMatrixRequestType_name, int32(x)) +} +func (x *PinMatrixRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PinMatrixRequestType_value, data, "PinMatrixRequestType") + if err != nil { + return err + } + *x = PinMatrixRequestType(value) + return nil +} +func (PinMatrixRequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +// * +// Type of recovery procedure. These should be used as bitmask, e.g., +// `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` +// listing every method supported by the host computer. +// +// Note that ScrambledWords must be supported by every implementation +// for backward compatibility; there is no way to not support it. +// +// @used_in RecoveryDevice +type RecoveryDeviceType int32 + +const ( + // use powers of two when extending this field + RecoveryDeviceType_RecoveryDeviceType_ScrambledWords RecoveryDeviceType = 0 + RecoveryDeviceType_RecoveryDeviceType_Matrix RecoveryDeviceType = 1 +) + +var RecoveryDeviceType_name = map[int32]string{ + 0: "RecoveryDeviceType_ScrambledWords", + 1: "RecoveryDeviceType_Matrix", +} +var RecoveryDeviceType_value = map[string]int32{ + "RecoveryDeviceType_ScrambledWords": 0, + "RecoveryDeviceType_Matrix": 1, +} + +func (x RecoveryDeviceType) Enum() *RecoveryDeviceType { + p := new(RecoveryDeviceType) + *p = x + return p +} +func (x RecoveryDeviceType) String() string { + return proto.EnumName(RecoveryDeviceType_name, int32(x)) +} +func (x *RecoveryDeviceType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RecoveryDeviceType_value, data, "RecoveryDeviceType") + if err != nil { + return err + } + *x = RecoveryDeviceType(value) + return nil +} +func (RecoveryDeviceType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +// * +// Type of Recovery Word request +// @used_in WordRequest +type WordRequestType int32 + +const ( + WordRequestType_WordRequestType_Plain WordRequestType = 0 + WordRequestType_WordRequestType_Matrix9 WordRequestType = 1 + WordRequestType_WordRequestType_Matrix6 WordRequestType = 2 +) + +var WordRequestType_name = map[int32]string{ + 0: "WordRequestType_Plain", + 1: "WordRequestType_Matrix9", + 2: "WordRequestType_Matrix6", +} +var WordRequestType_value = map[string]int32{ + "WordRequestType_Plain": 0, + "WordRequestType_Matrix9": 1, + "WordRequestType_Matrix6": 2, +} + +func (x WordRequestType) Enum() *WordRequestType { + p := new(WordRequestType) + *p = x + return p +} +func (x WordRequestType) String() string { + return proto.EnumName(WordRequestType_name, int32(x)) +} +func (x *WordRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(WordRequestType_value, data, "WordRequestType") + if err != nil { + return err + } + *x = WordRequestType(value) + return nil +} +func (WordRequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +// * +// Structure representing BIP32 (hierarchical deterministic) node +// Used for imports of private key into the device and exporting public key out of device +// @used_in PublicKey +// @used_in LoadDevice +// @used_in DebugLinkState +// @used_in Storage +type HDNodeType struct { + Depth *uint32 `protobuf:"varint,1,req,name=depth" json:"depth,omitempty"` + Fingerprint *uint32 `protobuf:"varint,2,req,name=fingerprint" json:"fingerprint,omitempty"` + ChildNum *uint32 `protobuf:"varint,3,req,name=child_num,json=childNum" json:"child_num,omitempty"` + ChainCode []byte `protobuf:"bytes,4,req,name=chain_code,json=chainCode" json:"chain_code,omitempty"` + PrivateKey []byte `protobuf:"bytes,5,opt,name=private_key,json=privateKey" json:"private_key,omitempty"` + PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *HDNodeType) Reset() { *m = HDNodeType{} } +func (m *HDNodeType) String() string { return proto.CompactTextString(m) } +func (*HDNodeType) ProtoMessage() {} +func (*HDNodeType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *HDNodeType) GetDepth() uint32 { + if m != nil && m.Depth != nil { + return *m.Depth + } + return 0 +} + +func (m *HDNodeType) GetFingerprint() uint32 { + if m != nil && m.Fingerprint != nil { + return *m.Fingerprint + } + return 0 +} + +func (m *HDNodeType) GetChildNum() uint32 { + if m != nil && m.ChildNum != nil { + return *m.ChildNum + } + return 0 +} + +func (m *HDNodeType) GetChainCode() []byte { + if m != nil { + return m.ChainCode + } + return nil +} + +func (m *HDNodeType) GetPrivateKey() []byte { + if m != nil { + return m.PrivateKey + } + return nil +} + +func (m *HDNodeType) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +type HDNodePathType struct { + Node *HDNodeType `protobuf:"bytes,1,req,name=node" json:"node,omitempty"` + AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *HDNodePathType) Reset() { *m = HDNodePathType{} } +func (m *HDNodePathType) String() string { return proto.CompactTextString(m) } +func (*HDNodePathType) ProtoMessage() {} +func (*HDNodePathType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *HDNodePathType) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *HDNodePathType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +// * +// Structure representing Coin +// @used_in Features +type CoinType struct { + CoinName *string `protobuf:"bytes,1,opt,name=coin_name,json=coinName" json:"coin_name,omitempty"` + CoinShortcut *string `protobuf:"bytes,2,opt,name=coin_shortcut,json=coinShortcut" json:"coin_shortcut,omitempty"` + AddressType *uint32 `protobuf:"varint,3,opt,name=address_type,json=addressType,def=0" json:"address_type,omitempty"` + MaxfeeKb *uint64 `protobuf:"varint,4,opt,name=maxfee_kb,json=maxfeeKb" json:"maxfee_kb,omitempty"` + AddressTypeP2Sh *uint32 `protobuf:"varint,5,opt,name=address_type_p2sh,json=addressTypeP2sh,def=5" json:"address_type_p2sh,omitempty"` + SignedMessageHeader *string `protobuf:"bytes,8,opt,name=signed_message_header,json=signedMessageHeader" json:"signed_message_header,omitempty"` + XpubMagic *uint32 `protobuf:"varint,9,opt,name=xpub_magic,json=xpubMagic,def=76067358" json:"xpub_magic,omitempty"` + XprvMagic *uint32 `protobuf:"varint,10,opt,name=xprv_magic,json=xprvMagic,def=76066276" json:"xprv_magic,omitempty"` + Segwit *bool `protobuf:"varint,11,opt,name=segwit" json:"segwit,omitempty"` + Forkid *uint32 `protobuf:"varint,12,opt,name=forkid" json:"forkid,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CoinType) Reset() { *m = CoinType{} } +func (m *CoinType) String() string { return proto.CompactTextString(m) } +func (*CoinType) ProtoMessage() {} +func (*CoinType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +const Default_CoinType_AddressType uint32 = 0 +const Default_CoinType_AddressTypeP2Sh uint32 = 5 +const Default_CoinType_XpubMagic uint32 = 76067358 +const Default_CoinType_XprvMagic uint32 = 76066276 + +func (m *CoinType) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return "" +} + +func (m *CoinType) GetCoinShortcut() string { + if m != nil && m.CoinShortcut != nil { + return *m.CoinShortcut + } + return "" +} + +func (m *CoinType) GetAddressType() uint32 { + if m != nil && m.AddressType != nil { + return *m.AddressType + } + return Default_CoinType_AddressType +} + +func (m *CoinType) GetMaxfeeKb() uint64 { + if m != nil && m.MaxfeeKb != nil { + return *m.MaxfeeKb + } + return 0 +} + +func (m *CoinType) GetAddressTypeP2Sh() uint32 { + if m != nil && m.AddressTypeP2Sh != nil { + return *m.AddressTypeP2Sh + } + return Default_CoinType_AddressTypeP2Sh +} + +func (m *CoinType) GetSignedMessageHeader() string { + if m != nil && m.SignedMessageHeader != nil { + return *m.SignedMessageHeader + } + return "" +} + +func (m *CoinType) GetXpubMagic() uint32 { + if m != nil && m.XpubMagic != nil { + return *m.XpubMagic + } + return Default_CoinType_XpubMagic +} + +func (m *CoinType) GetXprvMagic() uint32 { + if m != nil && m.XprvMagic != nil { + return *m.XprvMagic + } + return Default_CoinType_XprvMagic +} + +func (m *CoinType) GetSegwit() bool { + if m != nil && m.Segwit != nil { + return *m.Segwit + } + return false +} + +func (m *CoinType) GetForkid() uint32 { + if m != nil && m.Forkid != nil { + return *m.Forkid + } + return 0 +} + +// * +// Type of redeem script used in input +// @used_in TxInputType +type MultisigRedeemScriptType struct { + Pubkeys []*HDNodePathType `protobuf:"bytes,1,rep,name=pubkeys" json:"pubkeys,omitempty"` + Signatures [][]byte `protobuf:"bytes,2,rep,name=signatures" json:"signatures,omitempty"` + M *uint32 `protobuf:"varint,3,opt,name=m" json:"m,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MultisigRedeemScriptType) Reset() { *m = MultisigRedeemScriptType{} } +func (m *MultisigRedeemScriptType) String() string { return proto.CompactTextString(m) } +func (*MultisigRedeemScriptType) ProtoMessage() {} +func (*MultisigRedeemScriptType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *MultisigRedeemScriptType) GetPubkeys() []*HDNodePathType { + if m != nil { + return m.Pubkeys + } + return nil +} + +func (m *MultisigRedeemScriptType) GetSignatures() [][]byte { + if m != nil { + return m.Signatures + } + return nil +} + +func (m *MultisigRedeemScriptType) GetM() uint32 { + if m != nil && m.M != nil { + return *m.M + } + return 0 +} + +// * +// Structure representing transaction input +// @used_in SimpleSignTx +// @used_in TransactionType +type TxInputType struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + PrevHash []byte `protobuf:"bytes,2,req,name=prev_hash,json=prevHash" json:"prev_hash,omitempty"` + PrevIndex *uint32 `protobuf:"varint,3,req,name=prev_index,json=prevIndex" json:"prev_index,omitempty"` + ScriptSig []byte `protobuf:"bytes,4,opt,name=script_sig,json=scriptSig" json:"script_sig,omitempty"` + Sequence *uint32 `protobuf:"varint,5,opt,name=sequence,def=4294967295" json:"sequence,omitempty"` + ScriptType *InputScriptType `protobuf:"varint,6,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` + Multisig *MultisigRedeemScriptType `protobuf:"bytes,7,opt,name=multisig" json:"multisig,omitempty"` + Amount *uint64 `protobuf:"varint,8,opt,name=amount" json:"amount,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxInputType) Reset() { *m = TxInputType{} } +func (m *TxInputType) String() string { return proto.CompactTextString(m) } +func (*TxInputType) ProtoMessage() {} +func (*TxInputType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +const Default_TxInputType_Sequence uint32 = 4294967295 +const Default_TxInputType_ScriptType InputScriptType = InputScriptType_SPENDADDRESS + +func (m *TxInputType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *TxInputType) GetPrevHash() []byte { + if m != nil { + return m.PrevHash + } + return nil +} + +func (m *TxInputType) GetPrevIndex() uint32 { + if m != nil && m.PrevIndex != nil { + return *m.PrevIndex + } + return 0 +} + +func (m *TxInputType) GetScriptSig() []byte { + if m != nil { + return m.ScriptSig + } + return nil +} + +func (m *TxInputType) GetSequence() uint32 { + if m != nil && m.Sequence != nil { + return *m.Sequence + } + return Default_TxInputType_Sequence +} + +func (m *TxInputType) GetScriptType() InputScriptType { + if m != nil && m.ScriptType != nil { + return *m.ScriptType + } + return Default_TxInputType_ScriptType +} + +func (m *TxInputType) GetMultisig() *MultisigRedeemScriptType { + if m != nil { + return m.Multisig + } + return nil +} + +func (m *TxInputType) GetAmount() uint64 { + if m != nil && m.Amount != nil { + return *m.Amount + } + return 0 +} + +// * +// Structure representing transaction output +// @used_in SimpleSignTx +// @used_in TransactionType +type TxOutputType struct { + Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Amount *uint64 `protobuf:"varint,3,req,name=amount" json:"amount,omitempty"` + ScriptType *OutputScriptType `protobuf:"varint,4,req,name=script_type,json=scriptType,enum=OutputScriptType" json:"script_type,omitempty"` + Multisig *MultisigRedeemScriptType `protobuf:"bytes,5,opt,name=multisig" json:"multisig,omitempty"` + OpReturnData []byte `protobuf:"bytes,6,opt,name=op_return_data,json=opReturnData" json:"op_return_data,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxOutputType) Reset() { *m = TxOutputType{} } +func (m *TxOutputType) String() string { return proto.CompactTextString(m) } +func (*TxOutputType) ProtoMessage() {} +func (*TxOutputType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *TxOutputType) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *TxOutputType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *TxOutputType) GetAmount() uint64 { + if m != nil && m.Amount != nil { + return *m.Amount + } + return 0 +} + +func (m *TxOutputType) GetScriptType() OutputScriptType { + if m != nil && m.ScriptType != nil { + return *m.ScriptType + } + return OutputScriptType_PAYTOADDRESS +} + +func (m *TxOutputType) GetMultisig() *MultisigRedeemScriptType { + if m != nil { + return m.Multisig + } + return nil +} + +func (m *TxOutputType) GetOpReturnData() []byte { + if m != nil { + return m.OpReturnData + } + return nil +} + +// * +// Structure representing compiled transaction output +// @used_in TransactionType +type TxOutputBinType struct { + Amount *uint64 `protobuf:"varint,1,req,name=amount" json:"amount,omitempty"` + ScriptPubkey []byte `protobuf:"bytes,2,req,name=script_pubkey,json=scriptPubkey" json:"script_pubkey,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxOutputBinType) Reset() { *m = TxOutputBinType{} } +func (m *TxOutputBinType) String() string { return proto.CompactTextString(m) } +func (*TxOutputBinType) ProtoMessage() {} +func (*TxOutputBinType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *TxOutputBinType) GetAmount() uint64 { + if m != nil && m.Amount != nil { + return *m.Amount + } + return 0 +} + +func (m *TxOutputBinType) GetScriptPubkey() []byte { + if m != nil { + return m.ScriptPubkey + } + return nil +} + +// * +// Structure representing transaction +// @used_in SimpleSignTx +type TransactionType struct { + Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + Inputs []*TxInputType `protobuf:"bytes,2,rep,name=inputs" json:"inputs,omitempty"` + BinOutputs []*TxOutputBinType `protobuf:"bytes,3,rep,name=bin_outputs,json=binOutputs" json:"bin_outputs,omitempty"` + Outputs []*TxOutputType `protobuf:"bytes,5,rep,name=outputs" json:"outputs,omitempty"` + LockTime *uint32 `protobuf:"varint,4,opt,name=lock_time,json=lockTime" json:"lock_time,omitempty"` + InputsCnt *uint32 `protobuf:"varint,6,opt,name=inputs_cnt,json=inputsCnt" json:"inputs_cnt,omitempty"` + OutputsCnt *uint32 `protobuf:"varint,7,opt,name=outputs_cnt,json=outputsCnt" json:"outputs_cnt,omitempty"` + ExtraData []byte `protobuf:"bytes,8,opt,name=extra_data,json=extraData" json:"extra_data,omitempty"` + ExtraDataLen *uint32 `protobuf:"varint,9,opt,name=extra_data_len,json=extraDataLen" json:"extra_data_len,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TransactionType) Reset() { *m = TransactionType{} } +func (m *TransactionType) String() string { return proto.CompactTextString(m) } +func (*TransactionType) ProtoMessage() {} +func (*TransactionType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *TransactionType) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +func (m *TransactionType) GetInputs() []*TxInputType { + if m != nil { + return m.Inputs + } + return nil +} + +func (m *TransactionType) GetBinOutputs() []*TxOutputBinType { + if m != nil { + return m.BinOutputs + } + return nil +} + +func (m *TransactionType) GetOutputs() []*TxOutputType { + if m != nil { + return m.Outputs + } + return nil +} + +func (m *TransactionType) GetLockTime() uint32 { + if m != nil && m.LockTime != nil { + return *m.LockTime + } + return 0 +} + +func (m *TransactionType) GetInputsCnt() uint32 { + if m != nil && m.InputsCnt != nil { + return *m.InputsCnt + } + return 0 +} + +func (m *TransactionType) GetOutputsCnt() uint32 { + if m != nil && m.OutputsCnt != nil { + return *m.OutputsCnt + } + return 0 +} + +func (m *TransactionType) GetExtraData() []byte { + if m != nil { + return m.ExtraData + } + return nil +} + +func (m *TransactionType) GetExtraDataLen() uint32 { + if m != nil && m.ExtraDataLen != nil { + return *m.ExtraDataLen + } + return 0 +} + +// * +// Structure representing request details +// @used_in TxRequest +type TxRequestDetailsType struct { + RequestIndex *uint32 `protobuf:"varint,1,opt,name=request_index,json=requestIndex" json:"request_index,omitempty"` + TxHash []byte `protobuf:"bytes,2,opt,name=tx_hash,json=txHash" json:"tx_hash,omitempty"` + ExtraDataLen *uint32 `protobuf:"varint,3,opt,name=extra_data_len,json=extraDataLen" json:"extra_data_len,omitempty"` + ExtraDataOffset *uint32 `protobuf:"varint,4,opt,name=extra_data_offset,json=extraDataOffset" json:"extra_data_offset,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxRequestDetailsType) Reset() { *m = TxRequestDetailsType{} } +func (m *TxRequestDetailsType) String() string { return proto.CompactTextString(m) } +func (*TxRequestDetailsType) ProtoMessage() {} +func (*TxRequestDetailsType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *TxRequestDetailsType) GetRequestIndex() uint32 { + if m != nil && m.RequestIndex != nil { + return *m.RequestIndex + } + return 0 +} + +func (m *TxRequestDetailsType) GetTxHash() []byte { + if m != nil { + return m.TxHash + } + return nil +} + +func (m *TxRequestDetailsType) GetExtraDataLen() uint32 { + if m != nil && m.ExtraDataLen != nil { + return *m.ExtraDataLen + } + return 0 +} + +func (m *TxRequestDetailsType) GetExtraDataOffset() uint32 { + if m != nil && m.ExtraDataOffset != nil { + return *m.ExtraDataOffset + } + return 0 +} + +// * +// Structure representing serialized data +// @used_in TxRequest +type TxRequestSerializedType struct { + SignatureIndex *uint32 `protobuf:"varint,1,opt,name=signature_index,json=signatureIndex" json:"signature_index,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + SerializedTx []byte `protobuf:"bytes,3,opt,name=serialized_tx,json=serializedTx" json:"serialized_tx,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TxRequestSerializedType) Reset() { *m = TxRequestSerializedType{} } +func (m *TxRequestSerializedType) String() string { return proto.CompactTextString(m) } +func (*TxRequestSerializedType) ProtoMessage() {} +func (*TxRequestSerializedType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +func (m *TxRequestSerializedType) GetSignatureIndex() uint32 { + if m != nil && m.SignatureIndex != nil { + return *m.SignatureIndex + } + return 0 +} + +func (m *TxRequestSerializedType) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *TxRequestSerializedType) GetSerializedTx() []byte { + if m != nil { + return m.SerializedTx + } + return nil +} + +// * +// Structure representing identity data +// @used_in IdentityType +type IdentityType struct { + Proto *string `protobuf:"bytes,1,opt,name=proto" json:"proto,omitempty"` + User *string `protobuf:"bytes,2,opt,name=user" json:"user,omitempty"` + Host *string `protobuf:"bytes,3,opt,name=host" json:"host,omitempty"` + Port *string `protobuf:"bytes,4,opt,name=port" json:"port,omitempty"` + Path *string `protobuf:"bytes,5,opt,name=path" json:"path,omitempty"` + Index *uint32 `protobuf:"varint,6,opt,name=index,def=0" json:"index,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IdentityType) Reset() { *m = IdentityType{} } +func (m *IdentityType) String() string { return proto.CompactTextString(m) } +func (*IdentityType) ProtoMessage() {} +func (*IdentityType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +const Default_IdentityType_Index uint32 = 0 + +func (m *IdentityType) GetProto() string { + if m != nil && m.Proto != nil { + return *m.Proto + } + return "" +} + +func (m *IdentityType) GetUser() string { + if m != nil && m.User != nil { + return *m.User + } + return "" +} + +func (m *IdentityType) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *IdentityType) GetPort() string { + if m != nil && m.Port != nil { + return *m.Port + } + return "" +} + +func (m *IdentityType) GetPath() string { + if m != nil && m.Path != nil { + return *m.Path + } + return "" +} + +func (m *IdentityType) GetIndex() uint32 { + if m != nil && m.Index != nil { + return *m.Index + } + return Default_IdentityType_Index +} + +var E_WireIn = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50002, + Name: "wire_in", + Tag: "varint,50002,opt,name=wire_in,json=wireIn", + Filename: "types.proto", +} + +var E_WireOut = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50003, + Name: "wire_out", + Tag: "varint,50003,opt,name=wire_out,json=wireOut", + Filename: "types.proto", +} + +var E_WireDebugIn = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50004, + Name: "wire_debug_in", + Tag: "varint,50004,opt,name=wire_debug_in,json=wireDebugIn", + Filename: "types.proto", +} + +var E_WireDebugOut = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50005, + Name: "wire_debug_out", + Tag: "varint,50005,opt,name=wire_debug_out,json=wireDebugOut", + Filename: "types.proto", +} + +var E_WireTiny = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50006, + Name: "wire_tiny", + Tag: "varint,50006,opt,name=wire_tiny,json=wireTiny", + Filename: "types.proto", +} + +var E_WireBootloader = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50007, + Name: "wire_bootloader", + Tag: "varint,50007,opt,name=wire_bootloader,json=wireBootloader", + Filename: "types.proto", +} + +func init() { + proto.RegisterType((*HDNodeType)(nil), "HDNodeType") + proto.RegisterType((*HDNodePathType)(nil), "HDNodePathType") + proto.RegisterType((*CoinType)(nil), "CoinType") + proto.RegisterType((*MultisigRedeemScriptType)(nil), "MultisigRedeemScriptType") + proto.RegisterType((*TxInputType)(nil), "TxInputType") + proto.RegisterType((*TxOutputType)(nil), "TxOutputType") + proto.RegisterType((*TxOutputBinType)(nil), "TxOutputBinType") + proto.RegisterType((*TransactionType)(nil), "TransactionType") + proto.RegisterType((*TxRequestDetailsType)(nil), "TxRequestDetailsType") + proto.RegisterType((*TxRequestSerializedType)(nil), "TxRequestSerializedType") + proto.RegisterType((*IdentityType)(nil), "IdentityType") + proto.RegisterEnum("FailureType", FailureType_name, FailureType_value) + proto.RegisterEnum("OutputScriptType", OutputScriptType_name, OutputScriptType_value) + proto.RegisterEnum("InputScriptType", InputScriptType_name, InputScriptType_value) + proto.RegisterEnum("RequestType", RequestType_name, RequestType_value) + proto.RegisterEnum("ButtonRequestType", ButtonRequestType_name, ButtonRequestType_value) + proto.RegisterEnum("PinMatrixRequestType", PinMatrixRequestType_name, PinMatrixRequestType_value) + proto.RegisterEnum("RecoveryDeviceType", RecoveryDeviceType_name, RecoveryDeviceType_value) + proto.RegisterEnum("WordRequestType", WordRequestType_name, WordRequestType_value) + proto.RegisterExtension(E_WireIn) + proto.RegisterExtension(E_WireOut) + proto.RegisterExtension(E_WireDebugIn) + proto.RegisterExtension(E_WireDebugOut) + proto.RegisterExtension(E_WireTiny) + proto.RegisterExtension(E_WireBootloader) +} + +func init() { proto.RegisterFile("types.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 1899 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xdb, 0x72, 0x1a, 0xc9, + 0x19, 0xf6, 0x00, 0x92, 0xe0, 0x07, 0xc4, 0xa8, 0x7d, 0xd0, 0x78, 0x6d, 0xaf, 0x31, 0x76, 0x62, + 0x45, 0x55, 0x61, 0x77, 0xc9, 0x5a, 0x8e, 0x55, 0xa9, 0x24, 0x3a, 0xa0, 0x15, 0x65, 0x0b, 0x51, + 0xc3, 0x28, 0x56, 0x72, 0x33, 0x35, 0xcc, 0xb4, 0xa0, 0x4b, 0x43, 0x37, 0xe9, 0xe9, 0x91, 0xd1, + 0xde, 0xe4, 0x2a, 0xc9, 0x55, 0x5e, 0x23, 0x6f, 0x91, 0xaa, 0xbc, 0x41, 0xaa, 0x36, 0xa7, 0xcb, + 0xbc, 0x41, 0xae, 0xf2, 0x00, 0xa9, 0x3e, 0x0c, 0x02, 0xc9, 0xde, 0xd2, 0x1d, 0xfd, 0x7d, 0xff, + 0xf9, 0xd0, 0x3d, 0x40, 0x59, 0x5c, 0x4e, 0x70, 0xd2, 0x9c, 0x70, 0x26, 0xd8, 0x67, 0xf5, 0x21, + 0x63, 0xc3, 0x18, 0x7f, 0xa1, 0x4e, 0x83, 0xf4, 0xec, 0x8b, 0x08, 0x27, 0x21, 0x27, 0x13, 0xc1, + 0xb8, 0x96, 0x68, 0xfc, 0xd5, 0x02, 0x38, 0xdc, 0xef, 0xb2, 0x08, 0x7b, 0x97, 0x13, 0x8c, 0xee, + 0xc1, 0x52, 0x84, 0x27, 0x62, 0xe4, 0x58, 0xf5, 0xdc, 0x46, 0xd5, 0xd5, 0x07, 0x54, 0x87, 0xf2, + 0x19, 0xa1, 0x43, 0xcc, 0x27, 0x9c, 0x50, 0xe1, 0xe4, 0x14, 0x37, 0x0f, 0xa1, 0x47, 0x50, 0x0a, + 0x47, 0x24, 0x8e, 0x7c, 0x9a, 0x8e, 0x9d, 0xbc, 0xe2, 0x8b, 0x0a, 0xe8, 0xa6, 0x63, 0xf4, 0x04, + 0x20, 0x1c, 0x05, 0x84, 0xfa, 0x21, 0x8b, 0xb0, 0x53, 0xa8, 0xe7, 0x36, 0x2a, 0x6e, 0x49, 0x21, + 0x7b, 0x2c, 0xc2, 0xe8, 0x29, 0x94, 0x27, 0x9c, 0x5c, 0x04, 0x02, 0xfb, 0xe7, 0xf8, 0xd2, 0x59, + 0xaa, 0x5b, 0x1b, 0x15, 0x17, 0x0c, 0xf4, 0x16, 0x5f, 0x4a, 0xfd, 0x49, 0x3a, 0x88, 0x49, 0xa8, + 0xf8, 0x65, 0xc5, 0x97, 0x34, 0xf2, 0x16, 0x5f, 0x36, 0xba, 0xb0, 0xaa, 0x33, 0xe8, 0x05, 0x62, + 0xa4, 0xb2, 0x78, 0x0a, 0x05, 0x2a, 0x5d, 0xc9, 0x24, 0xca, 0xad, 0x72, 0xf3, 0x2a, 0x41, 0x57, + 0x11, 0x32, 0xdc, 0x20, 0x8a, 0x38, 0x4e, 0x12, 0x9f, 0x3a, 0xb9, 0x7a, 0x5e, 0x86, 0x6b, 0x80, + 0x6e, 0xe3, 0x7f, 0x39, 0x28, 0xee, 0x31, 0x42, 0x95, 0x29, 0x99, 0x18, 0x23, 0xd4, 0xa7, 0xc1, + 0x58, 0xda, 0xb3, 0x36, 0x4a, 0x6e, 0x51, 0x02, 0xdd, 0x60, 0x8c, 0xd1, 0x73, 0xa8, 0x2a, 0x32, + 0x19, 0x31, 0x2e, 0xc2, 0x54, 0x56, 0x46, 0x0a, 0x54, 0x24, 0xd8, 0x37, 0x18, 0x7a, 0x01, 0x95, + 0xcc, 0x97, 0x6c, 0x8d, 0x93, 0xaf, 0x5b, 0x1b, 0xd5, 0x6d, 0xeb, 0x4b, 0xb7, 0x6c, 0xe0, 0xcc, + 0xcf, 0x38, 0x98, 0x9e, 0x61, 0xec, 0x9f, 0x0f, 0x9c, 0x42, 0xdd, 0xda, 0x28, 0xb8, 0x45, 0x0d, + 0xbc, 0x1d, 0xa0, 0x1f, 0xc3, 0xda, 0xbc, 0x09, 0x7f, 0xd2, 0x4a, 0x46, 0xaa, 0x4e, 0xd5, 0x6d, + 0xeb, 0x95, 0x5b, 0x9b, 0xb3, 0xd3, 0x6b, 0x25, 0x23, 0xd4, 0x82, 0xfb, 0x09, 0x19, 0x52, 0x1c, + 0xf9, 0x63, 0x9c, 0x24, 0xc1, 0x10, 0xfb, 0x23, 0x1c, 0x44, 0x98, 0x3b, 0x45, 0x15, 0xde, 0x5d, + 0x4d, 0x1e, 0x69, 0xee, 0x50, 0x51, 0xe8, 0x25, 0xc0, 0x74, 0x92, 0x0e, 0xfc, 0x71, 0x30, 0x24, + 0xa1, 0x53, 0x52, 0xb6, 0x8b, 0xaf, 0xb7, 0xbe, 0xdc, 0x7a, 0xfd, 0x93, 0x57, 0x3f, 0x75, 0x4b, + 0x92, 0x3b, 0x92, 0x94, 0x16, 0xe4, 0x17, 0x46, 0x10, 0xae, 0x04, 0xb7, 0x5a, 0xaf, 0xb7, 0xa4, + 0x20, 0xbf, 0xd0, 0x82, 0x0f, 0x60, 0x39, 0xc1, 0xc3, 0x0f, 0x44, 0x38, 0xe5, 0xba, 0xb5, 0x51, + 0x74, 0xcd, 0x49, 0xe2, 0x67, 0x8c, 0x9f, 0x93, 0xc8, 0xa9, 0x48, 0x65, 0xd7, 0x9c, 0x1a, 0x09, + 0x38, 0x47, 0x69, 0x2c, 0x48, 0x42, 0x86, 0x2e, 0x8e, 0x30, 0x1e, 0xf7, 0xd5, 0xa4, 0xaa, 0xea, + 0xfc, 0x08, 0x56, 0x26, 0xe9, 0xe0, 0x1c, 0x5f, 0x26, 0x8e, 0x55, 0xcf, 0x6f, 0x94, 0x5b, 0xb5, + 0xe6, 0x62, 0xcb, 0xdd, 0x8c, 0x47, 0x9f, 0x03, 0xc8, 0xfc, 0x02, 0x91, 0x72, 0x9c, 0xa8, 0xde, + 0x56, 0xdc, 0x39, 0x04, 0x55, 0xc0, 0x1a, 0xeb, 0x1e, 0xb8, 0xd6, 0xb8, 0xf1, 0x97, 0x1c, 0x94, + 0xbd, 0x69, 0x87, 0x4e, 0x52, 0x91, 0xb5, 0xe1, 0x6a, 0x30, 0xac, 0xc5, 0xc1, 0x90, 0xe4, 0x84, + 0xe3, 0x0b, 0x7f, 0x14, 0x24, 0x23, 0xb5, 0x04, 0x15, 0xb7, 0x28, 0x81, 0xc3, 0x20, 0x19, 0xa9, + 0x21, 0x95, 0x24, 0xa1, 0x11, 0x9e, 0x9a, 0x15, 0x50, 0xe2, 0x1d, 0x09, 0x48, 0x5a, 0x6f, 0x9e, + 0x9f, 0x90, 0xa1, 0x6a, 0x70, 0xc5, 0x2d, 0x69, 0xa4, 0x4f, 0x86, 0xe8, 0x87, 0x50, 0x4c, 0xf0, + 0x6f, 0x53, 0x4c, 0x43, 0x6c, 0x1a, 0x0b, 0x5f, 0xb7, 0xde, 0x7c, 0xfd, 0x66, 0xeb, 0x75, 0xeb, + 0xcd, 0x2b, 0x77, 0xc6, 0xa1, 0x5f, 0x40, 0xd9, 0x98, 0x51, 0xb3, 0x24, 0x77, 0x61, 0xb5, 0x65, + 0x37, 0x55, 0x02, 0x57, 0xf5, 0xda, 0xae, 0xf4, 0x7b, 0xed, 0xee, 0xfe, 0xce, 0xfe, 0xbe, 0xdb, + 0xee, 0xf7, 0x5d, 0xe3, 0x59, 0x25, 0xf8, 0x0a, 0x8a, 0x63, 0x53, 0x65, 0x67, 0xa5, 0x6e, 0x6d, + 0x94, 0x5b, 0x0f, 0x9b, 0x9f, 0x2a, 0xbb, 0x3b, 0x13, 0x95, 0x4d, 0x0b, 0xc6, 0x2c, 0xa5, 0x42, + 0xcd, 0x50, 0xc1, 0x35, 0xa7, 0xc6, 0x7f, 0x2d, 0xa8, 0x78, 0xd3, 0xe3, 0x54, 0x64, 0x05, 0x74, + 0x60, 0xc5, 0xd4, 0xcb, 0x6c, 0x4b, 0x76, 0xfc, 0xde, 0x9d, 0x9b, 0xb3, 0x2f, 0x2b, 0x37, 0xb3, + 0x8f, 0x5a, 0x8b, 0xf9, 0xca, 0xbb, 0x63, 0xb5, 0xb5, 0xd6, 0xd4, 0x0e, 0xe7, 0x22, 0xfd, 0x54, + 0x8a, 0x4b, 0xb7, 0x4f, 0xf1, 0x05, 0xac, 0xb2, 0x89, 0xcf, 0xb1, 0x48, 0x39, 0xf5, 0xa3, 0x40, + 0x04, 0xe6, 0xa6, 0xa9, 0xb0, 0x89, 0xab, 0xc0, 0xfd, 0x40, 0x04, 0x8d, 0x2e, 0xd4, 0xb2, 0x7c, + 0x77, 0xcd, 0x15, 0x71, 0x15, 0xbb, 0xb5, 0x10, 0xfb, 0x73, 0xa8, 0x9a, 0xd8, 0xf5, 0x6c, 0x9a, + 0x91, 0xa9, 0x68, 0xb0, 0xa7, 0xb0, 0xc6, 0xdf, 0x72, 0x50, 0xf3, 0x78, 0x40, 0x93, 0x20, 0x14, + 0x84, 0xd1, 0xac, 0x86, 0x17, 0x98, 0x27, 0x84, 0x51, 0x55, 0xc3, 0xaa, 0x9b, 0x1d, 0xd1, 0x0b, + 0x58, 0x26, 0xb2, 0xd5, 0x7a, 0xb0, 0xcb, 0xad, 0x4a, 0x73, 0x6e, 0x78, 0x5d, 0xc3, 0xa1, 0xaf, + 0xa0, 0x3c, 0x20, 0xd4, 0x67, 0x2a, 0xca, 0xc4, 0xc9, 0x2b, 0x51, 0xbb, 0x79, 0x2d, 0x6e, 0x17, + 0x06, 0x84, 0x6a, 0x24, 0x41, 0x2f, 0x61, 0x25, 0x13, 0x5f, 0x52, 0xe2, 0xd5, 0xe6, 0x7c, 0x5b, + 0xdd, 0x8c, 0x95, 0x5d, 0x8c, 0x59, 0x78, 0xee, 0x0b, 0x32, 0xc6, 0x6a, 0x8c, 0xab, 0x6e, 0x51, + 0x02, 0x1e, 0x19, 0x63, 0x39, 0xe4, 0x3a, 0x04, 0x3f, 0xa4, 0x42, 0x95, 0xaf, 0xea, 0x96, 0x34, + 0xb2, 0x47, 0x85, 0xbc, 0xe8, 0x8d, 0x19, 0xc5, 0xaf, 0x28, 0x1e, 0x0c, 0x24, 0x05, 0x9e, 0x00, + 0xe0, 0xa9, 0xe0, 0x81, 0x2e, 0x7f, 0x51, 0x2f, 0x89, 0x42, 0x64, 0xed, 0x65, 0x87, 0xae, 0x68, + 0x3f, 0xc6, 0x54, 0xdf, 0x53, 0x6e, 0x65, 0x26, 0xf2, 0x0e, 0xd3, 0xc6, 0x9f, 0x2d, 0xb8, 0xe7, + 0x4d, 0x5d, 0xb9, 0x31, 0x89, 0xd8, 0xc7, 0x22, 0x20, 0xb1, 0xbe, 0x62, 0x9f, 0x43, 0x95, 0x6b, + 0xd4, 0x2c, 0xa9, 0x2e, 0x6e, 0xc5, 0x80, 0x7a, 0x4f, 0xd7, 0x61, 0x45, 0x4c, 0xb3, 0x0d, 0x97, + 0xfe, 0x97, 0xc5, 0x54, 0xed, 0xf7, 0x4d, 0xe7, 0xf9, 0x9b, 0xce, 0xd1, 0x26, 0xac, 0xcd, 0x49, + 0xb1, 0xb3, 0xb3, 0x04, 0x0b, 0x53, 0xa6, 0xda, 0x4c, 0xf0, 0x58, 0xc1, 0x8d, 0xdf, 0x5b, 0xb0, + 0x3e, 0x0b, 0xb4, 0x8f, 0x39, 0x09, 0x62, 0xf2, 0x2d, 0x8e, 0x54, 0xac, 0x2f, 0xa1, 0x36, 0xbb, + 0xb3, 0x16, 0xa2, 0x5d, 0x9d, 0xc1, 0x3a, 0xde, 0xc7, 0x50, 0x9a, 0x21, 0x26, 0xe2, 0x2b, 0x40, + 0x8d, 0xe0, 0xcc, 0xb0, 0x2f, 0xa6, 0x2a, 0x66, 0x39, 0x82, 0x57, 0xde, 0xa6, 0x8d, 0x3f, 0x59, + 0x50, 0xe9, 0x44, 0x98, 0x0a, 0x22, 0x2e, 0xb3, 0x8f, 0x00, 0xf5, 0x71, 0x60, 0x36, 0x58, 0x1f, + 0x10, 0x82, 0x42, 0x9a, 0x60, 0x6e, 0xde, 0x38, 0xf5, 0x5b, 0x62, 0x23, 0x96, 0x08, 0x65, 0xb6, + 0xe4, 0xaa, 0xdf, 0x12, 0x9b, 0x30, 0xae, 0xb3, 0x2e, 0xb9, 0xea, 0xb7, 0xc2, 0x02, 0xa1, 0xdf, + 0x2c, 0x89, 0x05, 0x62, 0x84, 0xd6, 0x61, 0x49, 0x27, 0xb6, 0x9c, 0x3d, 0x88, 0xfa, 0xbc, 0xf9, + 0x5d, 0x0e, 0xca, 0x07, 0x01, 0x89, 0x53, 0xae, 0xbf, 0x49, 0x9e, 0xc0, 0x43, 0x73, 0xf4, 0x4f, + 0x28, 0x9e, 0x4e, 0x70, 0x28, 0x66, 0xaf, 0x97, 0x6d, 0xa1, 0xcf, 0xe0, 0x41, 0x46, 0xef, 0xa6, + 0x42, 0x30, 0xda, 0x36, 0x22, 0x76, 0x0e, 0xdd, 0x87, 0xb5, 0x8c, 0x93, 0x85, 0x6f, 0x73, 0xce, + 0xb8, 0x9d, 0x47, 0x8f, 0x60, 0x3d, 0x83, 0x77, 0xd4, 0xda, 0xed, 0x05, 0x34, 0xc4, 0x71, 0x8c, + 0x23, 0xbb, 0x80, 0xd6, 0xe1, 0x6e, 0x46, 0xf6, 0xc8, 0x95, 0xb1, 0x25, 0xe4, 0xc0, 0xbd, 0x39, + 0xe2, 0x4a, 0x65, 0x19, 0x3d, 0x00, 0x34, 0xc7, 0x74, 0xe8, 0x45, 0x10, 0x93, 0xc8, 0x5e, 0x41, + 0x8f, 0xc1, 0xc9, 0x70, 0x03, 0xf6, 0xb3, 0xd6, 0xd8, 0xc5, 0x05, 0x7b, 0x9c, 0x85, 0x38, 0x49, + 0x74, 0x7c, 0xa5, 0xf9, 0x94, 0xba, 0x4c, 0xb4, 0x29, 0x4b, 0x87, 0xa3, 0x83, 0x94, 0x46, 0x89, + 0x0d, 0xd7, 0xb8, 0x0e, 0x25, 0xc2, 0x74, 0xd2, 0x2e, 0xa3, 0x87, 0x70, 0x3f, 0xe3, 0x0e, 0x08, + 0x1f, 0x7f, 0x08, 0x38, 0xd6, 0x26, 0xc3, 0xcd, 0x3f, 0x5a, 0x60, 0x5f, 0xbf, 0x35, 0x91, 0x0d, + 0x95, 0xde, 0xce, 0xaf, 0xbd, 0x63, 0xf3, 0x50, 0xd8, 0x77, 0xd0, 0x5d, 0xa8, 0x29, 0xa4, 0xbf, + 0xe7, 0x76, 0x7a, 0xde, 0xe1, 0x4e, 0xff, 0xd0, 0xb6, 0xd0, 0x1a, 0x54, 0x15, 0x78, 0x74, 0xf2, + 0xce, 0xeb, 0xf4, 0x3b, 0xdf, 0xd8, 0xb9, 0x19, 0x74, 0xdc, 0x73, 0xdb, 0xde, 0x89, 0xdb, 0xb5, + 0xf3, 0x33, 0x63, 0xef, 0x3b, 0x5e, 0x57, 0x1a, 0x2b, 0xa0, 0x7b, 0x60, 0x2b, 0xa4, 0xd7, 0xea, + 0x1f, 0x66, 0xe8, 0xd2, 0x66, 0x0c, 0xb5, 0x6b, 0xcf, 0x95, 0x54, 0x9d, 0x7f, 0xb0, 0xec, 0x3b, + 0xd2, 0xbe, 0x42, 0x66, 0x2e, 0x2d, 0x54, 0x81, 0x62, 0xfb, 0xd4, 0x6b, 0xbb, 0xdd, 0x9d, 0x77, + 0x76, 0x6e, 0xa6, 0x92, 0xd9, 0xcd, 0x4b, 0x6f, 0x0a, 0x99, 0xf7, 0x56, 0xd8, 0x3c, 0x81, 0xb2, + 0xd9, 0x30, 0xe5, 0xa9, 0x0c, 0x2b, 0xde, 0x69, 0xa7, 0xdb, 0x3b, 0xf1, 0xec, 0x3b, 0xd2, 0xa2, + 0x77, 0x7a, 0x7c, 0xe2, 0xc9, 0x93, 0x85, 0x00, 0x96, 0xbd, 0xd3, 0xa3, 0xb6, 0xb7, 0x63, 0xe7, + 0xd0, 0x2a, 0x80, 0x77, 0x7a, 0xd0, 0xe9, 0x76, 0xfa, 0x87, 0xed, 0x7d, 0x3b, 0x8f, 0x6a, 0x50, + 0xf6, 0x4e, 0xdb, 0xa7, 0x9e, 0xbb, 0xb3, 0xbf, 0xe3, 0xed, 0xd8, 0x85, 0xcd, 0xff, 0xe4, 0x60, + 0x4d, 0x4f, 0xdb, 0xbc, 0xf5, 0x75, 0xb8, 0xbb, 0x00, 0xfa, 0xc7, 0x62, 0x84, 0xb9, 0x6d, 0xa1, + 0x06, 0x7c, 0xbe, 0x48, 0x1c, 0x60, 0x7c, 0x7c, 0x81, 0xb9, 0x37, 0xe2, 0x38, 0x19, 0xb1, 0x58, + 0xce, 0xea, 0x53, 0x78, 0xb4, 0x28, 0xb3, 0xc7, 0xe8, 0x19, 0xe1, 0x63, 0xdd, 0x35, 0x3b, 0x2f, + 0xf7, 0x60, 0x51, 0xc0, 0xc5, 0x09, 0x16, 0xfb, 0xf8, 0x82, 0x84, 0xd8, 0x2e, 0xdc, 0xa4, 0x8d, + 0xfe, 0x7b, 0xc6, 0xe5, 0xf4, 0x3e, 0x06, 0x67, 0x91, 0x7e, 0x4f, 0x26, 0xd8, 0x28, 0x2f, 0xdf, + 0x54, 0xee, 0x71, 0x26, 0x70, 0x28, 0xf6, 0x82, 0x38, 0xb6, 0x57, 0xe4, 0xa8, 0x2e, 0xd2, 0x72, + 0x8e, 0xbd, 0xa9, 0x5d, 0xbc, 0x19, 0x75, 0x36, 0x78, 0x7b, 0x23, 0x1c, 0x9e, 0xdb, 0x25, 0x39, + 0x93, 0x8b, 0x02, 0x3b, 0xfa, 0xcd, 0xb7, 0x41, 0xae, 0xe1, 0x35, 0xa7, 0xd9, 0x37, 0xbd, 0x5d, + 0xde, 0xfc, 0x1d, 0xdc, 0xeb, 0x11, 0x7a, 0x14, 0x08, 0x4e, 0xa6, 0xf3, 0x35, 0xae, 0xc3, 0xe3, + 0x8f, 0xe1, 0xfe, 0x5e, 0xca, 0x39, 0xa6, 0xc2, 0xb6, 0xd0, 0x33, 0x78, 0xf2, 0x51, 0x89, 0x2e, + 0xfe, 0x70, 0x40, 0x78, 0x22, 0xec, 0x9c, 0xec, 0xc7, 0xa7, 0x44, 0xfa, 0x38, 0x64, 0x34, 0xb2, + 0xf3, 0x9b, 0xbf, 0x01, 0xe4, 0xe2, 0x90, 0x5d, 0x60, 0x7e, 0xa9, 0xcb, 0xa4, 0xdc, 0xff, 0x00, + 0x9e, 0xdd, 0x44, 0xfd, 0x7e, 0xc8, 0x83, 0xf1, 0x20, 0xc6, 0x91, 0x2c, 0x76, 0x62, 0xdf, 0x91, + 0xf5, 0xfc, 0x88, 0x98, 0x76, 0x68, 0x5b, 0x9b, 0x67, 0x50, 0x93, 0x92, 0xf3, 0x79, 0x3d, 0x84, + 0xfb, 0xd7, 0x20, 0xbf, 0x17, 0x07, 0x84, 0xda, 0x77, 0x64, 0x9d, 0xae, 0x53, 0xda, 0xd2, 0x1b, + 0xdb, 0xfa, 0x34, 0xb9, 0x65, 0xe7, 0xb6, 0x7f, 0x06, 0x2b, 0x1f, 0x88, 0x7a, 0x41, 0xd0, 0xb3, + 0xa6, 0xfe, 0x2f, 0xd8, 0xcc, 0xfe, 0x0b, 0x36, 0xdb, 0x34, 0x1d, 0xff, 0x2a, 0x88, 0x53, 0x7c, + 0x3c, 0x91, 0x77, 0x60, 0xe2, 0x7c, 0xf7, 0x87, 0xbc, 0xfe, 0x52, 0x97, 0x3a, 0x1d, 0xba, 0xfd, + 0x73, 0x28, 0x2a, 0x6d, 0x96, 0x8a, 0xdb, 0xa8, 0xff, 0xdd, 0xa8, 0x2b, 0x97, 0xc7, 0xa9, 0xd8, + 0xfe, 0x06, 0xaa, 0x4a, 0x3f, 0xc2, 0x83, 0x74, 0x78, 0xcb, 0x18, 0xfe, 0x61, 0x8c, 0x94, 0xa5, + 0xe6, 0xbe, 0x54, 0xec, 0xd0, 0xed, 0x0e, 0xac, 0xce, 0x19, 0xba, 0x65, 0x38, 0xff, 0x34, 0x96, + 0x2a, 0x33, 0x4b, 0x32, 0xa6, 0x5f, 0x42, 0x49, 0x99, 0x12, 0x84, 0x5e, 0xde, 0xc6, 0xca, 0xbf, + 0x8c, 0x15, 0x55, 0x09, 0x8f, 0xd0, 0xcb, 0xed, 0x77, 0x50, 0x53, 0x16, 0x06, 0x8c, 0x89, 0x98, + 0xa9, 0x3f, 0x4f, 0xb7, 0xb0, 0xf3, 0x6f, 0x63, 0x47, 0x25, 0xb2, 0x3b, 0x53, 0xdd, 0xfd, 0x0a, + 0x9e, 0x87, 0x6c, 0xdc, 0x4c, 0x02, 0xc1, 0x92, 0x11, 0x89, 0x83, 0x41, 0xd2, 0x14, 0x1c, 0x7f, + 0xcb, 0x78, 0x33, 0x26, 0x83, 0x99, 0xbd, 0x5d, 0xf0, 0x14, 0x28, 0xdb, 0xfb, 0xff, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x70, 0x88, 0xcd, 0x71, 0xe2, 0x0f, 0x00, 0x00, +} diff --git a/accounts/usbwallet/internal/trezor/types.proto b/accounts/usbwallet/internal/trezor/types.proto new file mode 100644 index 0000000000..3a358a584d --- /dev/null +++ b/accounts/usbwallet/internal/trezor/types.proto @@ -0,0 +1,276 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/types.proto +// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b. + +/** + * Types for TREZOR communication + * + * @author Marek Palatinus + * @version 1.2 + */ + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorType"; + +import "google/protobuf/descriptor.proto"; + +/** + * Options for specifying message direction and type of wire (normal/debug) + */ +extend google.protobuf.EnumValueOptions { + optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR + optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC + optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR + optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC + optional bool wire_tiny = 50006; // message is handled by TREZOR when the USB stack is in tiny mode + optional bool wire_bootloader = 50007; // message is only handled by TREZOR Bootloader +} + +/** + * Type of failures returned by Failure message + * @used_in Failure + */ +enum FailureType { + Failure_UnexpectedMessage = 1; + Failure_ButtonExpected = 2; + Failure_DataError = 3; + Failure_ActionCancelled = 4; + Failure_PinExpected = 5; + Failure_PinCancelled = 6; + Failure_PinInvalid = 7; + Failure_InvalidSignature = 8; + Failure_ProcessError = 9; + Failure_NotEnoughFunds = 10; + Failure_NotInitialized = 11; + Failure_FirmwareError = 99; +} + +/** + * Type of script which will be used for transaction output + * @used_in TxOutputType + */ +enum OutputScriptType { + PAYTOADDRESS = 0; // used for all addresses (bitcoin, p2sh, witness) + PAYTOSCRIPTHASH = 1; // p2sh address (deprecated; use PAYTOADDRESS) + PAYTOMULTISIG = 2; // only for change output + PAYTOOPRETURN = 3; // op_return + PAYTOWITNESS = 4; // only for change output + PAYTOP2SHWITNESS = 5; // only for change output +} + +/** + * Type of script which will be used for transaction output + * @used_in TxInputType + */ +enum InputScriptType { + SPENDADDRESS = 0; // standard p2pkh address + SPENDMULTISIG = 1; // p2sh multisig address + EXTERNAL = 2; // reserved for external inputs (coinjoin) + SPENDWITNESS = 3; // native segwit + SPENDP2SHWITNESS = 4; // segwit over p2sh (backward compatible) +} + +/** + * Type of information required by transaction signing process + * @used_in TxRequest + */ +enum RequestType { + TXINPUT = 0; + TXOUTPUT = 1; + TXMETA = 2; + TXFINISHED = 3; + TXEXTRADATA = 4; +} + +/** + * Type of button request + * @used_in ButtonRequest + */ +enum ButtonRequestType { + ButtonRequest_Other = 1; + ButtonRequest_FeeOverThreshold = 2; + ButtonRequest_ConfirmOutput = 3; + ButtonRequest_ResetDevice = 4; + ButtonRequest_ConfirmWord = 5; + ButtonRequest_WipeDevice = 6; + ButtonRequest_ProtectCall = 7; + ButtonRequest_SignTx = 8; + ButtonRequest_FirmwareCheck = 9; + ButtonRequest_Address = 10; + ButtonRequest_PublicKey = 11; +} + +/** + * Type of PIN request + * @used_in PinMatrixRequest + */ +enum PinMatrixRequestType { + PinMatrixRequestType_Current = 1; + PinMatrixRequestType_NewFirst = 2; + PinMatrixRequestType_NewSecond = 3; +} + +/** + * Type of recovery procedure. These should be used as bitmask, e.g., + * `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` + * listing every method supported by the host computer. + * + * Note that ScrambledWords must be supported by every implementation + * for backward compatibility; there is no way to not support it. + * + * @used_in RecoveryDevice + */ +enum RecoveryDeviceType { + // use powers of two when extending this field + RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order + RecoveryDeviceType_Matrix = 1; // matrix recovery type +} + +/** + * Type of Recovery Word request + * @used_in WordRequest + */ +enum WordRequestType { + WordRequestType_Plain = 0; + WordRequestType_Matrix9 = 1; + WordRequestType_Matrix6 = 2; +} + +/** + * Structure representing BIP32 (hierarchical deterministic) node + * Used for imports of private key into the device and exporting public key out of device + * @used_in PublicKey + * @used_in LoadDevice + * @used_in DebugLinkState + * @used_in Storage + */ +message HDNodeType { + required uint32 depth = 1; + required uint32 fingerprint = 2; + required uint32 child_num = 3; + required bytes chain_code = 4; + optional bytes private_key = 5; + optional bytes public_key = 6; +} + +message HDNodePathType { + required HDNodeType node = 1; // BIP-32 node in deserialized form + repeated uint32 address_n = 2; // BIP-32 path to derive the key from node +} + +/** + * Structure representing Coin + * @used_in Features + */ +message CoinType { + optional string coin_name = 1; + optional string coin_shortcut = 2; + optional uint32 address_type = 3 [default=0]; + optional uint64 maxfee_kb = 4; + optional uint32 address_type_p2sh = 5 [default=5]; + optional string signed_message_header = 8; + optional uint32 xpub_magic = 9 [default=76067358]; // default=0x0488b21e + optional uint32 xprv_magic = 10 [default=76066276]; // default=0x0488ade4 + optional bool segwit = 11; + optional uint32 forkid = 12; +} + +/** + * Type of redeem script used in input + * @used_in TxInputType + */ +message MultisigRedeemScriptType { + repeated HDNodePathType pubkeys = 1; // pubkeys from multisig address (sorted lexicographically) + repeated bytes signatures = 2; // existing signatures for partially signed input + optional uint32 m = 3; // "m" from n, how many valid signatures is necessary for spending +} + +/** + * Structure representing transaction input + * @used_in SimpleSignTx + * @used_in TransactionType + */ +message TxInputType { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + required bytes prev_hash = 2; // hash of previous transaction output to spend by this input + required uint32 prev_index = 3; // index of previous output to spend + optional bytes script_sig = 4; // script signature, unset for tx to sign + optional uint32 sequence = 5 [default=4294967295]; // sequence (default=0xffffffff) + optional InputScriptType script_type = 6 [default=SPENDADDRESS]; // defines template of input script + optional MultisigRedeemScriptType multisig = 7; // Filled if input is going to spend multisig tx + optional uint64 amount = 8; // amount of previous transaction output (for segwit only) +} + +/** + * Structure representing transaction output + * @used_in SimpleSignTx + * @used_in TransactionType + */ +message TxOutputType { + optional string address = 1; // target coin address in Base58 encoding + repeated uint32 address_n = 2; // BIP-32 path to derive the key from master node; has higher priority than "address" + required uint64 amount = 3; // amount to spend in satoshis + required OutputScriptType script_type = 4; // output script type + optional MultisigRedeemScriptType multisig = 5; // defines multisig address; script_type must be PAYTOMULTISIG + optional bytes op_return_data = 6; // defines op_return data; script_type must be PAYTOOPRETURN, amount must be 0 +} + +/** + * Structure representing compiled transaction output + * @used_in TransactionType + */ +message TxOutputBinType { + required uint64 amount = 1; + required bytes script_pubkey = 2; +} + +/** + * Structure representing transaction + * @used_in SimpleSignTx + */ +message TransactionType { + optional uint32 version = 1; + repeated TxInputType inputs = 2; + repeated TxOutputBinType bin_outputs = 3; + repeated TxOutputType outputs = 5; + optional uint32 lock_time = 4; + optional uint32 inputs_cnt = 6; + optional uint32 outputs_cnt = 7; + optional bytes extra_data = 8; + optional uint32 extra_data_len = 9; +} + +/** + * Structure representing request details + * @used_in TxRequest + */ +message TxRequestDetailsType { + optional uint32 request_index = 1; // device expects TxAck message from the computer + optional bytes tx_hash = 2; // tx_hash of requested transaction + optional uint32 extra_data_len = 3; // length of requested extra data + optional uint32 extra_data_offset = 4; // offset of requested extra data +} + +/** + * Structure representing serialized data + * @used_in TxRequest + */ +message TxRequestSerializedType { + optional uint32 signature_index = 1; // 'signature' field contains signed input of this index + optional bytes signature = 2; // signature of the signature_index input + optional bytes serialized_tx = 3; // part of serialized and signed transaction +} + +/** + * Structure representing identity data + * @used_in IdentityType + */ +message IdentityType { + optional string proto = 1; // proto part of URI + optional string user = 2; // user part of URI + optional string host = 3; // host part of URI + optional string port = 4; // port part of URI + optional string path = 5; // path part of URI + optional uint32 index = 6 [default=0]; // identity index +} diff --git a/accounts/usbwallet/ledger_hub.go b/accounts/usbwallet/ledger_hub.go index 2b0d56097c..ffe7cffe47 100644 --- a/accounts/usbwallet/ledger_hub.go +++ b/accounts/usbwallet/ledger_hub.go @@ -14,10 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// This file contains the implementation for interacting with the Ledger hardware -// wallets. The wire protocol spec can be found in the Ledger Blue GitHub repo: -// https://raw.githubusercontent.com/LedgerHQ/blue-app-eth/master/doc/ethapp.asc - package usbwallet import ( @@ -140,14 +136,14 @@ func (hub *LedgerHub) refreshWallets() { // Drop wallets in front of the next device or those that failed for some reason for len(hub.wallets) > 0 && (hub.wallets[0].URL().Cmp(url) < 0 || hub.wallets[0].(*ledgerWallet).failed()) { - events = append(events, accounts.WalletEvent{Wallet: hub.wallets[0], Arrive: false}) + events = append(events, accounts.WalletEvent{Wallet: hub.wallets[0], Kind: accounts.WalletDropped}) hub.wallets = hub.wallets[1:] } // If there are no more wallets or the device is before the next, wrap new wallet if len(hub.wallets) == 0 || hub.wallets[0].URL().Cmp(url) > 0 { wallet := &ledgerWallet{hub: hub, url: &url, info: ledger, log: log.New("url", url)} - events = append(events, accounts.WalletEvent{Wallet: wallet, Arrive: true}) + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) wallets = append(wallets, wallet) continue } @@ -160,7 +156,7 @@ func (hub *LedgerHub) refreshWallets() { } // Drop any leftover wallets and set the new batch for _, wallet := range hub.wallets { - events = append(events, accounts.WalletEvent{Wallet: wallet, Arrive: false}) + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) } hub.refreshed = time.Now() hub.wallets = wallets diff --git a/accounts/usbwallet/ledger_wallet.go b/accounts/usbwallet/ledger_wallet.go index f1beebb2c9..b8f04d74c0 100644 --- a/accounts/usbwallet/ledger_wallet.go +++ b/accounts/usbwallet/ledger_wallet.go @@ -41,13 +41,6 @@ import ( "github.com/karalabe/hid" ) -// Maximum time between wallet health checks to detect USB unplugs. -const ledgerHeartbeatCycle = time.Second - -// Minimum time to wait between self derivation attempts, even it the user is -// requesting accounts like crazy. -const ledgerSelfDeriveThrottling = time.Second - // ledgerOpcode is an enumeration encoding the supported Ledger opcodes. type ledgerOpcode byte @@ -215,6 +208,8 @@ func (w *ledgerWallet) Open(passphrase string) error { if w.version, err = w.ledgerVersion(); err != nil { w.version = [3]byte{1, 0, 0} // Assume worst case, can't verify if v1.0.0 or v1.0.1 } + go w.hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened}) + return nil } @@ -237,7 +232,7 @@ func (w *ledgerWallet) heartbeat() { case errc = <-w.healthQuit: // Termination requested continue - case <-time.After(ledgerHeartbeatCycle): + case <-time.After(heartbeatCycle): // Heartbeat time } // Execute a tiny data exchange to see responsiveness @@ -465,7 +460,7 @@ func (w *ledgerWallet) selfDerive() { select { case errc = <-w.deriveQuit: // Termination requested, abort - case <-time.After(ledgerSelfDeriveThrottling): + case <-time.After(selfDeriveThrottling): // Waited enough, willing to self-derive again } } diff --git a/accounts/usbwallet/trezor_hub.go b/accounts/usbwallet/trezor_hub.go new file mode 100644 index 0000000000..5681a55c74 --- /dev/null +++ b/accounts/usbwallet/trezor_hub.go @@ -0,0 +1,210 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package usbwallet + +import ( + "errors" + "runtime" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/karalabe/hid" +) + +// TrezorScheme is the protocol scheme prefixing account and wallet URLs. +var TrezorScheme = "trezor" + +// trezorVendorID is the USB vendor ID for SatoshiLabs. +var trezorVendorID = uint16(0x534c) + +// trezorDeviceID is the USB device ID for the Trezor 1. +var trezorDeviceID = uint16(0x0001) + +// Maximum time between wallet refreshes (if USB hotplug notifications don't work). +const trezorRefreshCycle = time.Second + +// Minimum time between wallet refreshes to avoid USB trashing. +const trezorRefreshThrottling = 500 * time.Millisecond + +// TrezorHub is a accounts.Backend that can find and handle Trezor hardware wallets. +type TrezorHub struct { + refreshed time.Time // Time instance when the list of wallets was last refreshed + wallets []accounts.Wallet // List of Trezor devices currently tracking + updateFeed event.Feed // Event feed to notify wallet additions/removals + updateScope event.SubscriptionScope // Subscription scope tracking current live listeners + updating bool // Whether the event notification loop is running + + quit chan chan error + + stateLock sync.RWMutex // Protects the internals of the hub from racey access + + // TODO(karalabe): remove if hotplug lands on Windows + commsPend int // Number of operations blocking enumeration + commsLock sync.Mutex // Lock protecting the pending counter and enumeration +} + +// NewTrezorHub creates a new hardware wallet manager for Trezor devices. +func NewTrezorHub() (*TrezorHub, error) { + if !hid.Supported() { + return nil, errors.New("unsupported platform") + } + hub := &TrezorHub{ + quit: make(chan chan error), + } + hub.refreshWallets() + return hub, nil +} + +// Wallets implements accounts.Backend, returning all the currently tracked USB +// devices that appear to be Trezor hardware wallets. +func (hub *TrezorHub) Wallets() []accounts.Wallet { + // Make sure the list of wallets is up to date + hub.refreshWallets() + + hub.stateLock.RLock() + defer hub.stateLock.RUnlock() + + cpy := make([]accounts.Wallet, len(hub.wallets)) + copy(cpy, hub.wallets) + return cpy +} + +// refreshWallets scans the USB devices attached to the machine and updates the +// list of wallets based on the found devices. +func (hub *TrezorHub) refreshWallets() { + // Don't scan the USB like crazy it the user fetches wallets in a loop + hub.stateLock.RLock() + elapsed := time.Since(hub.refreshed) + hub.stateLock.RUnlock() + + if elapsed < trezorRefreshThrottling { + return + } + // Retrieve the current list of Trezor devices + var trezors []hid.DeviceInfo + + if runtime.GOOS == "linux" { + // hidapi on Linux opens the device during enumeration to retrieve some infos, + // breaking the Trezor protocol if that is waiting for user confirmation. This + // is a bug acknowledged at Trezor, but it won't be fixed on old devices so we + // need to prevent concurrent comms ourselves. The more elegant solution would + // be to ditch enumeration in favor of hutplug events, but that don't work yet + // on Windows so if we need to hack it anyway, this is more elegant for now. + hub.commsLock.Lock() + if hub.commsPend > 0 { // A confirmation is pending, don't refresh + hub.commsLock.Unlock() + return + } + } + for _, info := range hid.Enumerate(trezorVendorID, trezorDeviceID) { + if info.Interface == 0 { // interface #1 is the debug link, skip it + trezors = append(trezors, info) + } + } + if runtime.GOOS == "linux" { + // See rationale before the enumeration why this is needed and only on Linux. + hub.commsLock.Unlock() + } + // Transform the current list of wallets into the new one + hub.stateLock.Lock() + + wallets := make([]accounts.Wallet, 0, len(trezors)) + events := []accounts.WalletEvent{} + + for _, trezor := range trezors { + url := accounts.URL{Scheme: TrezorScheme, Path: trezor.Path} + + // Drop wallets in front of the next device or those that failed for some reason + for len(hub.wallets) > 0 && (hub.wallets[0].URL().Cmp(url) < 0 || hub.wallets[0].(*trezorWallet).failed()) { + events = append(events, accounts.WalletEvent{Wallet: hub.wallets[0], Kind: accounts.WalletDropped}) + hub.wallets = hub.wallets[1:] + } + // If there are no more wallets or the device is before the next, wrap new wallet + if len(hub.wallets) == 0 || hub.wallets[0].URL().Cmp(url) > 0 { + wallet := &trezorWallet{hub: hub, url: &url, info: trezor, log: log.New("url", url)} + + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) + wallets = append(wallets, wallet) + continue + } + // If the device is the same as the first wallet, keep it + if hub.wallets[0].URL().Cmp(url) == 0 { + wallets = append(wallets, hub.wallets[0]) + hub.wallets = hub.wallets[1:] + continue + } + } + // Drop any leftover wallets and set the new batch + for _, wallet := range hub.wallets { + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) + } + hub.refreshed = time.Now() + hub.wallets = wallets + hub.stateLock.Unlock() + + // Fire all wallet events and return + for _, event := range events { + hub.updateFeed.Send(event) + } +} + +// Subscribe implements accounts.Backend, creating an async subscription to +// receive notifications on the addition or removal of Trezor wallets. +func (hub *TrezorHub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { + // We need the mutex to reliably start/stop the update loop + hub.stateLock.Lock() + defer hub.stateLock.Unlock() + + // Subscribe the caller and track the subscriber count + sub := hub.updateScope.Track(hub.updateFeed.Subscribe(sink)) + + // Subscribers require an active notification loop, start it + if !hub.updating { + hub.updating = true + go hub.updater() + } + return sub +} + +// updater is responsible for maintaining an up-to-date list of wallets stored in +// the keystore, and for firing wallet addition/removal events. It listens for +// account change events from the underlying account cache, and also periodically +// forces a manual refresh (only triggers for systems where the filesystem notifier +// is not running). +func (hub *TrezorHub) updater() { + for { + // Wait for a USB hotplug event (not supported yet) or a refresh timeout + select { + //case <-hub.changes: // reenable on hutplug implementation + case <-time.After(trezorRefreshCycle): + } + // Run the wallet refresher + hub.refreshWallets() + + // If all our subscribers left, stop the updater + hub.stateLock.Lock() + if hub.updateScope.Count() == 0 { + hub.updating = false + hub.stateLock.Unlock() + return + } + hub.stateLock.Unlock() + } +} diff --git a/accounts/usbwallet/trezor_wallet.go b/accounts/usbwallet/trezor_wallet.go new file mode 100644 index 0000000000..7791191920 --- /dev/null +++ b/accounts/usbwallet/trezor_wallet.go @@ -0,0 +1,761 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// This file contains the implementation for interacting with the Trezor hardware +// wallets. The wire protocol spec can be found on the SatoshiLabs website: +// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html + +package usbwallet + +import ( + "context" + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + "sync" + "time" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/usbwallet/internal/trezor" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/golang/protobuf/proto" + "github.com/karalabe/hid" +) + +// ErrTrezorPINNeeded is returned if opening the trezor requires a PIN code. In +// this case, the calling application should display a pinpad and send back the +// encoded passphrase. +var ErrTrezorPINNeeded = errors.New("trezor: pin needed") + +// trezorWallet represents a live USB Trezor hardware wallet. +type trezorWallet struct { + hub *TrezorHub // USB hub the device originates from (TODO(karalabe): remove if hotplug lands on Windows) + url *accounts.URL // Textual URL uniquely identifying this wallet + + info hid.DeviceInfo // Known USB device infos about the wallet + device *hid.Device // USB device advertising itself as a Trezor wallet + failure error // Any failure that would make the device unusable + + version [3]uint32 // Current version of the Trezor formware (zero if app is offline) + label string // Current textual label of the Trezor device + pinwait bool // Flags whether the device is waiting for PIN entry + accounts []accounts.Account // List of derive accounts pinned on the Trezor + paths map[common.Address]accounts.DerivationPath // Known derivation paths for signing operations + + deriveNextPath accounts.DerivationPath // Next derivation path for account auto-discovery + deriveNextAddr common.Address // Next derived account address for auto-discovery + deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with + deriveReq chan chan struct{} // Channel to request a self-derivation on + deriveQuit chan chan error // Channel to terminate the self-deriver with + + healthQuit chan chan error + + // Locking a hardware wallet is a bit special. Since hardware devices are lower + // performing, any communication with them might take a non negligible amount of + // time. Worse still, waiting for user confirmation can take arbitrarily long, + // but exclusive communication must be upheld during. Locking the entire wallet + // in the mean time however would stall any parts of the system that don't want + // to communicate, just read some state (e.g. list the accounts). + // + // As such, a hardware wallet needs two locks to function correctly. A state + // lock can be used to protect the wallet's software-side internal state, which + // must not be held exlusively during hardware communication. A communication + // lock can be used to achieve exclusive access to the device itself, this one + // however should allow "skipping" waiting for operations that might want to + // use the device, but can live without too (e.g. account self-derivation). + // + // Since we have two locks, it's important to know how to properly use them: + // - Communication requires the `device` to not change, so obtaining the + // commsLock should be done after having a stateLock. + // - Communication must not disable read access to the wallet state, so it + // must only ever hold a *read* lock to stateLock. + commsLock chan struct{} // Mutex (buf=1) for the USB comms without keeping the state locked + stateLock sync.RWMutex // Protects read and write access to the wallet struct fields + + log log.Logger // Contextual logger to tag the trezor with its id +} + +// URL implements accounts.Wallet, returning the URL of the Trezor device. +func (w *trezorWallet) URL() accounts.URL { + return *w.url // Immutable, no need for a lock +} + +// Status implements accounts.Wallet, always whether the Trezor is opened, closed +// or whether the Ethereum app was not started on it. +func (w *trezorWallet) Status() string { + w.stateLock.RLock() // No device communication, state lock is enough + defer w.stateLock.RUnlock() + + if w.failure != nil { + return fmt.Sprintf("Failed: %v", w.failure) + } + if w.device == nil { + return "Closed" + } + if w.pinwait { + return fmt.Sprintf("Trezor v%d.%d.%d '%s' waiting for PIN", w.version[0], w.version[1], w.version[2], w.label) + } + return fmt.Sprintf("Trezor v%d.%d.%d '%s' online", w.version[0], w.version[1], w.version[2], w.label) +} + +// failed returns if the USB device wrapped by the wallet failed for some reason. +// This is used by the device scanner to report failed wallets as departed. +// +// The method assumes that the state lock is *not* held! +func (w *trezorWallet) failed() bool { + w.stateLock.RLock() // No device communication, state lock is enough + defer w.stateLock.RUnlock() + + return w.failure != nil +} + +// Open implements accounts.Wallet, attempting to open a USB connection to the +// Trezor hardware wallet. Connecting to the Trezor is a two phase operation: +// * The first phase is to establish the USB connection, initialize it and read +// the wallet's features. This phase is invoked is the provided passphrase is +// empty. The device will display the pinpad as a result and will return an +// appropriate error to notify the user that a second open phase is needed. +// * The second phase is to unlock access to the Trezor, which is done by the +// user actually providing a passphrase mapping a keyboard keypad to the pin +// number of the user (shuffled according to the pinpad displayed). +func (w *trezorWallet) Open(passphrase string) error { + w.stateLock.Lock() // State lock is enough since there's no connection yet at this point + defer w.stateLock.Unlock() + + // If phase 1 is requested, init the connection and wait for user callback + if passphrase == "" { + // If we're already waiting for a PIN entry, insta-return + if w.pinwait { + return ErrTrezorPINNeeded + } + // Initialize a connection to the device + if err := w.openInit(); err != nil { + return err + } + // Do a manual ping, forcing the device to ask for its PIN + askPin, pinRequest := true, new(trezor.PinMatrixRequest) + if err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin}, pinRequest); err != nil { + return err + } + w.pinwait = true + + return ErrTrezorPINNeeded + } + // Phase 2 requested with actual PIN entry + w.pinwait = false + + success := new(trezor.Success) + if err := w.trezorExchange(&trezor.PinMatrixAck{Pin: &passphrase}, success); err != nil { + w.failure = err + return err + } + go w.hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened}) + + // Trezor unlocked, start the heartbeat cycle and account derivation + w.paths = make(map[common.Address]accounts.DerivationPath) + + w.deriveReq = make(chan chan struct{}) + w.deriveQuit = make(chan chan error) + w.healthQuit = make(chan chan error) + + defer func() { + go w.heartbeat() + go w.selfDerive() + }() + return nil +} + +// openInit is the first phase of a Trezor opening mechanism which initializes +// device connection and requests the device to display the pinpad. +func (w *trezorWallet) openInit() error { + // If the wallet was already opened, don't try to phase-1 open again + if w.device != nil { + return accounts.ErrWalletAlreadyOpen + } + // Otherwise iterate over all USB devices and find this again (no way to directly do this) + device, err := w.info.Open() + if err != nil { + return err + } + // Wallet successfully connected to, init the connection and start the heartbeat + w.device = device + w.commsLock = make(chan struct{}, 1) + w.commsLock <- struct{}{} // Enable lock + + // Retrieve the Trezor's version number and user label + features := new(trezor.Features) + if err := w.trezorExchange(&trezor.Initialize{}, features); err != nil { + return err + } + w.version = [3]uint32{features.GetMajorVersion(), features.GetMinorVersion(), features.GetPatchVersion()} + w.label = features.GetLabel() + + return nil +} + +// heartbeat is a health check loop for the Trezor wallets to periodically verify +// whether they are still present or if they malfunctioned. It is needed because: +// - libusb on Windows doesn't support hotplug, so we can't detect USB unplugs +func (w *trezorWallet) heartbeat() { + w.log.Debug("Trezor health-check started") + defer w.log.Debug("Trezor health-check stopped") + + // Execute heartbeat checks until termination or error + var ( + errc chan error + err error + ) + for errc == nil && err == nil { + // Wait until termination is requested or the heartbeat cycle arrives + select { + case errc = <-w.healthQuit: + // Termination requested + continue + case <-time.After(heartbeatCycle): + // Heartbeat time + } + // Execute a tiny data exchange to see responsiveness + w.stateLock.RLock() + if w.device == nil { + // Terminated while waiting for the lock + w.stateLock.RUnlock() + continue + } + <-w.commsLock // Don't lock state while executing ping + + success := new(trezor.Success) + err = w.trezorExchange(&trezor.Ping{}, success) + + w.commsLock <- struct{}{} + w.stateLock.RUnlock() + + if err != nil { + w.stateLock.Lock() // Lock state to tear the wallet down + w.failure = err + w.close() + w.stateLock.Unlock() + } + // Ignore non hardware related errors + err = nil + } + // In case of error, wait for termination + if err != nil { + w.log.Debug("Trezor health-check failed", "err", err) + errc = <-w.healthQuit + } + errc <- err +} + +// Close implements accounts.Wallet, closing the USB connection to the Trezor. +func (w *trezorWallet) Close() error { + // Ensure the wallet was opened + w.stateLock.RLock() + hQuit, dQuit := w.healthQuit, w.deriveQuit + w.stateLock.RUnlock() + + // Terminate the health checks + var herr error + if hQuit != nil { + errc := make(chan error) + hQuit <- errc + herr = <-errc // Save for later, we *must* close the USB + } + // Terminate the self-derivations + var derr error + if dQuit != nil { + errc := make(chan error) + dQuit <- errc + derr = <-errc // Save for later, we *must* close the USB + } + // Terminate the device connection + w.stateLock.Lock() + defer w.stateLock.Unlock() + + w.healthQuit = nil + w.deriveQuit = nil + w.deriveReq = nil + + if err := w.close(); err != nil { + return err + } + if herr != nil { + return herr + } + return derr +} + +// close is the internal wallet closer that terminates the USB connection and +// resets all the fields to their defaults. +// +// Note, close assumes the state lock is held! +func (w *trezorWallet) close() error { + // Allow duplicate closes, especially for health-check failures + if w.device == nil { + return nil + } + // Close the device, clear everything, then return + w.device.Close() + w.device = nil + + w.label, w.version = "", [3]uint32{} + w.accounts, w.paths = nil, nil + + return nil +} + +// Accounts implements accounts.Wallet, returning the list of accounts pinned to +// the Trezor hardware wallet. If self-derivation was enabled, the account list +// is periodically expanded based on current chain state. +func (w *trezorWallet) Accounts() []accounts.Account { + // Attempt self-derivation if it's running + reqc := make(chan struct{}, 1) + select { + case w.deriveReq <- reqc: + // Self-derivation request accepted, wait for it + <-reqc + default: + // Self-derivation offline, throttled or busy, skip + } + // Return whatever account list we ended up with + w.stateLock.RLock() + defer w.stateLock.RUnlock() + + cpy := make([]accounts.Account, len(w.accounts)) + copy(cpy, w.accounts) + return cpy +} + +// selfDerive is an account derivation loop that upon request attempts to find +// new non-zero accounts. +func (w *trezorWallet) selfDerive() { + w.log.Debug("Trezor self-derivation started") + defer w.log.Debug("Trezor self-derivation stopped") + + // Execute self-derivations until termination or error + var ( + reqc chan struct{} + errc chan error + err error + ) + for errc == nil && err == nil { + // Wait until either derivation or termination is requested + select { + case errc = <-w.deriveQuit: + // Termination requested + continue + case reqc = <-w.deriveReq: + // Account discovery requested + } + // Derivation needs a chain and device access, skip if either unavailable + w.stateLock.RLock() + if w.device == nil || w.deriveChain == nil { + w.stateLock.RUnlock() + reqc <- struct{}{} + continue + } + select { + case <-w.commsLock: + default: + w.stateLock.RUnlock() + reqc <- struct{}{} + continue + } + // Device lock obtained, derive the next batch of accounts + var ( + accs []accounts.Account + paths []accounts.DerivationPath + + nextAddr = w.deriveNextAddr + nextPath = w.deriveNextPath + + context = context.Background() + ) + for empty := false; !empty; { + // Retrieve the next derived Ethereum account + if nextAddr == (common.Address{}) { + if nextAddr, err = w.trezorDerive(nextPath); err != nil { + w.log.Warn("Trezor account derivation failed", "err", err) + break + } + } + // Check the account's status against the current chain state + var ( + balance *big.Int + nonce uint64 + ) + balance, err = w.deriveChain.BalanceAt(context, nextAddr, nil) + if err != nil { + w.log.Warn("Trezor balance retrieval failed", "err", err) + break + } + nonce, err = w.deriveChain.NonceAt(context, nextAddr, nil) + if err != nil { + w.log.Warn("Trezor nonce retrieval failed", "err", err) + break + } + // If the next account is empty, stop self-derivation, but add it nonetheless + if balance.Sign() == 0 && nonce == 0 { + empty = true + } + // We've just self-derived a new account, start tracking it locally + path := make(accounts.DerivationPath, len(nextPath)) + copy(path[:], nextPath[:]) + paths = append(paths, path) + + account := accounts.Account{ + Address: nextAddr, + URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, + } + accs = append(accs, account) + + // Display a log message to the user for new (or previously empty accounts) + if _, known := w.paths[nextAddr]; !known || (!empty && nextAddr == w.deriveNextAddr) { + w.log.Info("Trezor discovered new account", "address", nextAddr, "path", path, "balance", balance, "nonce", nonce) + } + // Fetch the next potential account + if !empty { + nextAddr = common.Address{} + nextPath[len(nextPath)-1]++ + } + } + // Self derivation complete, release device lock + w.commsLock <- struct{}{} + w.stateLock.RUnlock() + + // Insert any accounts successfully derived + w.stateLock.Lock() + for i := 0; i < len(accs); i++ { + if _, ok := w.paths[accs[i].Address]; !ok { + w.accounts = append(w.accounts, accs[i]) + w.paths[accs[i].Address] = paths[i] + } + } + // Shift the self-derivation forward + // TODO(karalabe): don't overwrite changes from wallet.SelfDerive + w.deriveNextAddr = nextAddr + w.deriveNextPath = nextPath + w.stateLock.Unlock() + + // Notify the user of termination and loop after a bit of time (to avoid trashing) + reqc <- struct{}{} + if err == nil { + select { + case errc = <-w.deriveQuit: + // Termination requested, abort + case <-time.After(selfDeriveThrottling): + // Waited enough, willing to self-derive again + } + } + } + // In case of error, wait for termination + if err != nil { + w.log.Debug("Trezor self-derivation failed", "err", err) + errc = <-w.deriveQuit + } + errc <- err +} + +// Contains implements accounts.Wallet, returning whether a particular account is +// or is not pinned into this Trezor instance. Although we could attempt to resolve +// unpinned accounts, that would be an non-negligible hardware operation. +func (w *trezorWallet) Contains(account accounts.Account) bool { + w.stateLock.RLock() + defer w.stateLock.RUnlock() + + _, exists := w.paths[account.Address] + return exists +} + +// Derive implements accounts.Wallet, deriving a new account at the specific +// derivation path. If pin is set to true, the account will be added to the list +// of tracked accounts. +func (w *trezorWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + // Try to derive the actual account and update its URL if successful + w.stateLock.RLock() // Avoid device disappearing during derivation + + if w.device == nil { + w.stateLock.RUnlock() + return accounts.Account{}, accounts.ErrWalletClosed + } + <-w.commsLock // Avoid concurrent hardware access + address, err := w.trezorDerive(path) + w.commsLock <- struct{}{} + + w.stateLock.RUnlock() + + // If an error occurred or no pinning was requested, return + if err != nil { + return accounts.Account{}, err + } + account := accounts.Account{ + Address: address, + URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, + } + if !pin { + return account, nil + } + // Pinning needs to modify the state + w.stateLock.Lock() + defer w.stateLock.Unlock() + + if _, ok := w.paths[address]; !ok { + w.accounts = append(w.accounts, account) + w.paths[address] = path + } + return account, nil +} + +// SelfDerive implements accounts.Wallet, trying to discover accounts that the +// user used previously (based on the chain state), but ones that he/she did not +// explicitly pin to the wallet manually. To avoid chain head monitoring, self +// derivation only runs during account listing (and even then throttled). +func (w *trezorWallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) { + w.stateLock.Lock() + defer w.stateLock.Unlock() + + w.deriveNextPath = make(accounts.DerivationPath, len(base)) + copy(w.deriveNextPath[:], base[:]) + + w.deriveNextAddr = common.Address{} + w.deriveChain = chain +} + +// SignHash implements accounts.Wallet, however signing arbitrary data is not +// supported for Trezor wallets, so this method will always return an error. +func (w *trezorWallet) SignHash(acc accounts.Account, hash []byte) ([]byte, error) { + return nil, accounts.ErrNotSupported +} + +// SignTx implements accounts.Wallet. It sends the transaction over to the Trezor +// wallet to request a confirmation from the user. It returns either the signed +// transaction or a failure if the user denied the transaction. +func (w *trezorWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + w.stateLock.RLock() // Comms have own mutex, this is for the state fields + defer w.stateLock.RUnlock() + + // If the wallet is closed, abort + if w.device == nil { + return nil, accounts.ErrWalletClosed + } + // Make sure the requested account is contained within + path, ok := w.paths[account.Address] + if !ok { + return nil, accounts.ErrUnknownAccount + } + // All infos gathered and metadata checks out, request signing + <-w.commsLock + defer func() { w.commsLock <- struct{}{} }() + + // Ensure the device isn't screwed with while user confirmation is pending + // TODO(karalabe): remove if hotplug lands on Windows + w.hub.commsLock.Lock() + w.hub.commsPend++ + w.hub.commsLock.Unlock() + + defer func() { + w.hub.commsLock.Lock() + w.hub.commsPend-- + w.hub.commsLock.Unlock() + }() + + return w.trezorSign(path, account.Address, tx, chainID) +} + +// SignHashWithPassphrase implements accounts.Wallet, however signing arbitrary +// data is not supported for Trezor wallets, so this method will always return +// an error. +func (w *trezorWallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { + return nil, accounts.ErrNotSupported +} + +// SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given +// transaction with the given account using passphrase as extra authentication. +// Since the Trezor does not support extra passphrases, it is silently ignored. +func (w *trezorWallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + return w.SignTx(account, tx, chainID) +} + +// trezorDerive sends a derivation request to the Trezor device and returns the +// Ethereum address located on that path. +func (w *trezorWallet) trezorDerive(derivationPath []uint32) (common.Address, error) { + address := new(trezor.EthereumAddress) + if err := w.trezorExchange(&trezor.EthereumGetAddress{AddressN: derivationPath}, address); err != nil { + return common.Address{}, err + } + return common.BytesToAddress(address.GetAddress()), nil +} + +// trezorSign sends the transaction to the Trezor wallet, and waits for the user +// to confirm or deny the transaction. +func (w *trezorWallet) trezorSign(derivationPath []uint32, address common.Address, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + // Create the transaction initiation message + data := tx.Data() + length := uint32(len(data)) + + request := &trezor.EthereumSignTx{ + AddressN: derivationPath, + Nonce: new(big.Int).SetUint64(tx.Nonce()).Bytes(), + GasPrice: tx.GasPrice().Bytes(), + GasLimit: tx.Gas().Bytes(), + Value: tx.Value().Bytes(), + DataLength: &length, + } + if to := tx.To(); to != nil { + request.To = (*to)[:] // Non contract deploy, set recipient explicitly + } + if length > 1024 { // Send the data chunked if that was requested + request.DataInitialChunk, data = data[:1024], data[1024:] + } else { + request.DataInitialChunk, data = data, nil + } + if chainID != nil { // EIP-155 transaction, set chain ID explicitly (only 32 bit is supported!?) + id := uint32(chainID.Int64()) + request.ChainId = &id + } + // Send the initiation message and stream content until a signature is returned + response := new(trezor.EthereumTxRequest) + if err := w.trezorExchange(request, response); err != nil { + return nil, err + } + for response.DataLength != nil && int(*response.DataLength) <= len(data) { + chunk := data[:*response.DataLength] + data = data[*response.DataLength:] + + if err := w.trezorExchange(&trezor.EthereumTxAck{DataChunk: chunk}, response); err != nil { + return nil, err + } + } + // Extract the Ethereum signature and do a sanity validation + if len(response.GetSignatureR()) == 0 || len(response.GetSignatureS()) == 0 || response.GetSignatureV() == 0 { + return nil, errors.New("reply lacks signature") + } + signature := append(append(response.GetSignatureR(), response.GetSignatureS()...), byte(response.GetSignatureV())) + + // Create the correct signer and signature transform based on the chain ID + var signer types.Signer + if chainID == nil { + signer = new(types.HomesteadSigner) + } else { + signer = types.NewEIP155Signer(chainID) + signature[64] = signature[64] - byte(chainID.Uint64()*2+35) + } + // Inject the final signature into the transaction and sanity check the sender + signed, err := tx.WithSignature(signer, signature) + if err != nil { + return nil, err + } + sender, err := types.Sender(signer, signed) + if err != nil { + return nil, err + } + if sender != address { + return nil, fmt.Errorf("signer mismatch: expected %s, got %s", address.Hex(), sender.Hex()) + } + return signed, nil +} + +// trezorExchange performs a data exchange with the Trezor wallet, sending it a +// message and retrieving the response. +func (w *trezorWallet) trezorExchange(req proto.Message, res proto.Message) error { + // Construct the original message payload to chunk up + data, err := proto.Marshal(req) + if err != nil { + return err + } + payload := make([]byte, 8+len(data)) + copy(payload, []byte{0x23, 0x23}) + binary.BigEndian.PutUint16(payload[2:], trezor.Type(req)) + binary.BigEndian.PutUint32(payload[4:], uint32(len(data))) + copy(payload[8:], data) + + // Stream all the chunks to the device + chunk := make([]byte, 64) + chunk[0] = 0x3f // Report ID magic number + + for len(payload) > 0 { + // Construct the new message to stream, padding with zeroes if needed + if len(payload) > 63 { + copy(chunk[1:], payload[:63]) + payload = payload[63:] + } else { + copy(chunk[1:], payload) + copy(chunk[1+len(payload):], make([]byte, 63-len(payload))) + payload = nil + } + // Send over to the device + w.log.Trace("Data chunk sent to the Trezor", "chunk", hexutil.Bytes(chunk)) + if _, err := w.device.Write(chunk); err != nil { + return err + } + } + // Stream the reply back from the wallet in 64 byte chunks + var ( + kind uint16 + reply []byte + ) + for { + // Read the next chunk from the Trezor wallet + if _, err := io.ReadFull(w.device, chunk); err != nil { + return err + } + w.log.Trace("Data chunk received from the Trezor", "chunk", hexutil.Bytes(chunk)) + + // Make sure the transport header matches + if chunk[0] != 0x3f || (len(reply) == 0 && (chunk[1] != 0x23 || chunk[2] != 0x23)) { + return errReplyInvalidHeader + } + // If it's the first chunk, retrieve the reply message type and total message length + var payload []byte + + if len(reply) == 0 { + kind = binary.BigEndian.Uint16(chunk[3:5]) + reply = make([]byte, 0, int(binary.BigEndian.Uint32(chunk[5:9]))) + payload = chunk[9:] + } else { + payload = chunk[1:] + } + // Append to the reply and stop when filled up + if left := cap(reply) - len(reply); left > len(payload) { + reply = append(reply, payload...) + } else { + reply = append(reply, payload[:left]...) + break + } + } + // Try to parse the reply into the requested reply message + if kind == uint16(trezor.MessageType_MessageType_Failure) { + // Trezor returned a failure, extract and return the message + failure := new(trezor.Failure) + if err := proto.Unmarshal(reply, failure); err != nil { + return err + } + return errors.New("trezor: " + failure.GetMessage()) + } + if kind == uint16(trezor.MessageType_MessageType_ButtonRequest) { + // Trezor is waitinf for user confirmation, ack and wait for the next message + return w.trezorExchange(&trezor.ButtonAck{}, res) + } + if want := trezor.Type(res); kind != want { + return fmt.Errorf("trezor: expected reply type %s, got %s", trezor.Name(want), trezor.Name(kind)) + } + return proto.Unmarshal(reply, res) +} diff --git a/accounts/usbwallet/usbwallet.go b/accounts/usbwallet/usbwallet.go index 938ab1e6a2..3ed471693f 100644 --- a/accounts/usbwallet/usbwallet.go +++ b/accounts/usbwallet/usbwallet.go @@ -17,9 +17,18 @@ // Package usbwallet implements support for USB hardware wallets. package usbwallet +import "time" + // deviceID is a combined vendor/product identifier to uniquely identify a USB // hardware device. type deviceID struct { Vendor uint16 // The Vendor identifer Product uint16 // The Product identifier } + +// Maximum time between wallet health checks to detect USB unplugs. +const heartbeatCycle = time.Second + +// Minimum time to wait between self derivation attempts, even it the user is +// requesting accounts like crazy. +const selfDeriveThrottling = time.Second diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 58e9498060..257cb22310 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -237,24 +237,28 @@ func startNode(ctx *cli.Context, stack *node.Node) { } stateReader := ethclient.NewClient(rpcClient) - // Open and self derive any wallets already attached + // Open any wallets already attached for _, wallet := range stack.AccountManager().Wallets() { if err := wallet.Open(""); err != nil { log.Warn("Failed to open wallet", "url", wallet.URL(), "err", err) - } else { - wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader) } } // Listen for wallet event till termination for event := range events { - if event.Arrive { + switch event.Kind { + case accounts.WalletArrived: if err := event.Wallet.Open(""); err != nil { log.Warn("New wallet appeared, failed to open", "url", event.Wallet.URL(), "err", err) + } + case accounts.WalletOpened: + log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", event.Wallet.Status()) + if event.Wallet.URL().Scheme == "ledger" { + event.Wallet.SelfDerive(accounts.DefaultLedgerBaseDerivationPath, stateReader) } else { - log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", event.Wallet.Status()) event.Wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader) } - } else { + + case accounts.WalletDropped: log.Info("Old wallet dropped", "url", event.Wallet.URL()) event.Wallet.Close() } diff --git a/console/bridge.go b/console/bridge.go index 75be681888..b2d4e09745 100644 --- a/console/bridge.go +++ b/console/bridge.go @@ -23,6 +23,7 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/accounts/usbwallet" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" "github.com/robertkrimen/otto" @@ -83,6 +84,54 @@ func (b *bridge) NewAccount(call otto.FunctionCall) (response otto.Value) { return ret } +// OpenWallet is a wrapper around personal.openWallet which can interpret and +// react to certain error messages, such as the Trezor PIN matrix request. +func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { + // Make sure we have an wallet specified to open + if !call.Argument(0).IsString() { + throwJSException("first argument must be the wallet URL to open") + } + wallet := call.Argument(0) + + var passwd otto.Value + if call.Argument(1).IsUndefined() || call.Argument(1).IsNull() { + passwd, _ = otto.ToValue("") + } else { + passwd = call.Argument(1) + } + // Open the wallet and return if successful in itself + val, err := call.Otto.Call("jeth.openWallet", nil, wallet, passwd) + if err == nil { + return val + } + // Wallet open failed, report error unless it's a PIN entry + if !strings.HasSuffix(err.Error(), usbwallet.ErrTrezorPINNeeded.Error()) { + throwJSException(err.Error()) + } + // Trezor PIN matrix input requested, display the matrix to the user and fetch the data + fmt.Fprintf(b.printer, "Look at the device for number positions\n\n") + fmt.Fprintf(b.printer, "a | b | c\n") + fmt.Fprintf(b.printer, "--+---+--\n") + fmt.Fprintf(b.printer, "d | e | f\n") + fmt.Fprintf(b.printer, "--+---+--\n") + fmt.Fprintf(b.printer, "g | h | i\n\n") + + if input, err := b.prompter.PromptPassword("Please enter current PIN: "); err != nil { + throwJSException(err.Error()) + } else { + // Transform the alphabetical input to numbers + mapping := map[string]string{"a": "7", "b": "8", "c": "9", "d": "4", "e": "5", "f": "6", "g": "1", "h": "2", "i": "3"} + for from, to := range mapping { + input = strings.Replace(input, from, to, -1) + } + passwd, _ = otto.ToValue(input) + } + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + throwJSException(err.Error()) + } + return val +} + // UnlockAccount is a wrapper around the personal.unlockAccount RPC method that // uses a non-echoing password prompt to acquire the passphrase and executes the // original RPC method (saved in jeth.unlockAccount) with it to actually execute diff --git a/console/console.go b/console/console.go index 389d528580..3cd2ad34b7 100644 --- a/console/console.go +++ b/console/console.go @@ -160,10 +160,15 @@ func (c *Console) init(preload []string) error { if err != nil { return err } - // Override the unlockAccount, newAccount and sign methods since these require user interaction. - // Assign these method in the Console the original web3 callbacks. These will be called by the jeth.* - // methods after they got the password from the user and send the original web3 request to the backend. + // Override the openWallet, unlockAccount, newAccount and sign methods since + // these require user interaction. Assign these method in the Console the + // original web3 callbacks. These will be called by the jeth.* methods after + // they got the password from the user and send the original web3 request to + // the backend. if obj := personal.Object(); obj != nil { // make sure the personal api is enabled over the interface + if _, err = c.jsre.Run(`jeth.openWallet = personal.openWallet;`); err != nil { + return fmt.Errorf("personal.openWallet: %v", err) + } if _, err = c.jsre.Run(`jeth.unlockAccount = personal.unlockAccount;`); err != nil { return fmt.Errorf("personal.unlockAccount: %v", err) } @@ -173,6 +178,7 @@ func (c *Console) init(preload []string) error { if _, err = c.jsre.Run(`jeth.sign = personal.sign;`); err != nil { return fmt.Errorf("personal.sign: %v", err) } + obj.Set("openWallet", bridge.OpenWallet) obj.Set("unlockAccount", bridge.UnlockAccount) obj.Set("newAccount", bridge.NewAccount) obj.Set("sign", bridge.Sign) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 7874b7101f..6b9c151cfc 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -246,6 +246,22 @@ func (s *PrivateAccountAPI) ListWallets() []rawWallet { return wallets } +// OpenWallet initiates a hardware wallet opening procedure, establishing a USB +// connection and attempting to authenticate via the provided passphrase. Note, +// the method may return an extra challenge requiring a second open (e.g. the +// Trezor PIN matrix challenge). +func (s *PrivateAccountAPI) OpenWallet(url string, passphrase *string) error { + wallet, err := s.am.Wallet(url) + if err != nil { + return err + } + pass := "" + if passphrase != nil { + pass = *passphrase + } + return wallet.Open(pass) +} + // DeriveAccount requests a HD wallet to derive a new account, optionally pinning // it for later reuse. func (s *PrivateAccountAPI) DeriveAccount(url string, path string, pin *bool) (accounts.Account, error) { diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 44fabd6abb..bf1db88196 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -492,6 +492,11 @@ web3._extend({ call: 'personal_ecRecover', params: 2 }), + new web3._extend.Method({ + name: 'openWallet', + call: 'personal_openWallet', + params: 2 + }), new web3._extend.Method({ name: 'deriveAccount', call: 'personal_deriveAccount', diff --git a/node/config.go b/node/config.go index e9693277ad..b9b5e5b922 100644 --- a/node/config.go +++ b/node/config.go @@ -393,11 +393,18 @@ func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { keystore.NewKeyStore(keydir, scryptN, scryptP), } if !conf.NoUSB { + // Start a USB hub for Ledger hardware wallets if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil { log.Warn(fmt.Sprintf("Failed to start Ledger hub, disabling: %v", err)) } else { backends = append(backends, ledgerhub) } + // Start a USB hub for Trezor hardware wallets + if trezorhub, err := usbwallet.NewTrezorHub(); err != nil { + log.Warn(fmt.Sprintf("Failed to start Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + } } return accounts.NewManager(backends...), ephemeral, nil } diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE new file mode 100644 index 0000000000..1b1b1921ef --- /dev/null +++ b/vendor/github.com/golang/protobuf/LICENSE @@ -0,0 +1,31 @@ +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/golang/protobuf/proto/Makefile b/vendor/github.com/golang/protobuf/proto/Makefile new file mode 100644 index 0000000000..e2e0651a93 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/Makefile @@ -0,0 +1,43 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +install: + go install + +test: install generate-test-pbs + go test + + +generate-test-pbs: + make install + make -C testdata + protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto + make diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 0000000000..e392575b35 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,229 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(pb Message) Message { + in := reflect.ValueOf(pb) + if in.IsNil() { + return pb + } + + out := reflect.New(in.Type().Elem()) + // out is empty so a merge is a deep copy. + mergeStruct(out.Elem(), in.Elem()) + return out.Interface().(Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + // Explicit test prior to mergeStruct so that mistyped nils will fail + panic("proto: type mismatch") + } + if in.IsNil() { + // Merging nil into non-nil is a quiet no-op + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, ok := extendable(in.Addr().Interface()); ok { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 0000000000..aa207298f9 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,970 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" + "os" + "reflect" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// The fundamental decoders that interpret bytes on the wire. +// Those that take integer types all return uint64 and are +// therefore of type valueDecoder. + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// These are not ValueDecoders: they produce an array of bytes or a string. +// bytes, embedded messages + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +// If the protocol buffer has extensions, and the field matches, add it as an extension. +// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. +func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { + oi := o.index + + err := o.skip(t, tag, wire) + if err != nil { + return err + } + + if !unrecField.IsValid() { + return nil + } + + ptr := structPointer_Bytes(base, unrecField) + + // Add the skipped field to struct field + obuf := o.buf + + o.buf = *ptr + o.EncodeVarint(uint64(tag<<3 | wire)) + *ptr = append(o.buf, obuf[oi:o.index]...) + + o.buf = obuf + + return nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +func (o *Buffer) skip(t reflect.Type, tag, wire int) error { + + var u uint64 + var err error + + switch wire { + case WireVarint: + _, err = o.DecodeVarint() + case WireFixed64: + _, err = o.DecodeFixed64() + case WireBytes: + _, err = o.DecodeRawBytes(false) + case WireFixed32: + _, err = o.DecodeFixed32() + case WireStartGroup: + for { + u, err = o.DecodeVarint() + if err != nil { + break + } + fwire := int(u & 0x7) + if fwire == WireEndGroup { + break + } + ftag := int(u >> 3) + err = o.skip(t, ftag, fwire) + if err != nil { + break + } + } + default: + err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) + } + return err +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The method should reset the receiver before +// decoding starts. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + return UnmarshalMerge(buf, pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +func (p *Buffer) DecodeGroup(pb Message) error { + typ, base, err := getbase(pb) + if err != nil { + return err + } + return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(Unmarshaler); ok { + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + typ, base, err := getbase(pb) + if err != nil { + return err + } + + err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) + + if collectStats { + stats.Decode++ + } + + return err +} + +// unmarshalType does the work of unmarshaling a structure. +func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { + var state errorState + required, reqFields := prop.reqCount, uint64(0) + + var err error + for err == nil && o.index < len(o.buf) { + oi := o.index + var u uint64 + u, err = o.DecodeVarint() + if err != nil { + break + } + wire := int(u & 0x7) + if wire == WireEndGroup { + if is_group { + if required > 0 { + // Not enough information to determine the exact field. + // (See below.) + return &RequiredNotSetError{"{Unknown}"} + } + return nil // input is satisfied + } + return fmt.Errorf("proto: %s: wiretype end group for non-group", st) + } + tag := int(u >> 3) + if tag <= 0 { + return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) + } + fieldnum, ok := prop.decoderTags.get(tag) + if !ok { + // Maybe it's an extension? + if prop.extendable { + if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { + if err = o.skip(st, tag, wire); err == nil { + extmap := e.extensionsWrite() + ext := extmap[int32(tag)] // may be missing + ext.enc = append(ext.enc, o.buf[oi:o.index]...) + extmap[int32(tag)] = ext + } + continue + } + } + // Maybe it's a oneof? + if prop.oneofUnmarshaler != nil { + m := structPointer_Interface(base, st).(Message) + // First return value indicates whether tag is a oneof field. + ok, err = prop.oneofUnmarshaler(m, tag, wire, o) + if err == ErrInternalBadWireType { + // Map the error to something more descriptive. + // Do the formatting here to save generated code space. + err = fmt.Errorf("bad wiretype for oneof field in %T", m) + } + if ok { + continue + } + } + err = o.skipAndSave(st, tag, wire, base, prop.unrecField) + continue + } + p := prop.Prop[fieldnum] + + if p.dec == nil { + fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) + continue + } + dec := p.dec + if wire != WireStartGroup && wire != p.WireType { + if wire == WireBytes && p.packedDec != nil { + // a packable field + dec = p.packedDec + } else { + err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) + continue + } + } + decErr := dec(o, p, base) + if decErr != nil && !state.shouldContinue(decErr, p) { + err = decErr + } + if err == nil && p.Required { + // Successfully decoded a required field. + if tag <= 64 { + // use bitmap for fields 1-64 to catch field reuse. + var mask uint64 = 1 << uint64(tag-1) + if reqFields&mask == 0 { + // new required field + reqFields |= mask + required-- + } + } else { + // This is imprecise. It can be fooled by a required field + // with a tag > 64 that is encoded twice; that's very rare. + // A fully correct implementation would require allocating + // a data structure, which we would like to avoid. + required-- + } + } + } + if err == nil { + if is_group { + return io.ErrUnexpectedEOF + } + if state.err != nil { + return state.err + } + if required > 0 { + // Not enough information to determine the exact field. If we use extra + // CPU, we could determine the field only if the missing required field + // has a tag <= 64 and we check reqFields. + return &RequiredNotSetError{"{Unknown}"} + } + } + return err +} + +// Individual type decoders +// For each, +// u is the decoded value, +// v is a pointer to the field (pointer) in the struct + +// Sizes of the pools to allocate inside the Buffer. +// The goal is modest amortization and allocation +// on at least 16-byte boundaries. +const ( + boolPoolSize = 16 + uint32PoolSize = 8 + uint64PoolSize = 4 +) + +// Decode a bool. +func (o *Buffer) dec_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + if len(o.bools) == 0 { + o.bools = make([]bool, boolPoolSize) + } + o.bools[0] = u != 0 + *structPointer_Bool(base, p.field) = &o.bools[0] + o.bools = o.bools[1:] + return nil +} + +func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + *structPointer_BoolVal(base, p.field) = u != 0 + return nil +} + +// Decode an int32. +func (o *Buffer) dec_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) + return nil +} + +func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) + return nil +} + +// Decode an int64. +func (o *Buffer) dec_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64_Set(structPointer_Word64(base, p.field), o, u) + return nil +} + +func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64Val_Set(structPointer_Word64Val(base, p.field), o, u) + return nil +} + +// Decode a string. +func (o *Buffer) dec_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_String(base, p.field) = &s + return nil +} + +func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_StringVal(base, p.field) = s + return nil +} + +// Decode a slice of bytes ([]byte). +func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + *structPointer_Bytes(base, p.field) = b + return nil +} + +// Decode a slice of bools ([]bool). +func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + v := structPointer_BoolSlice(base, p.field) + *v = append(*v, u != 0) + return nil +} + +// Decode a slice of bools ([]bool) in packed format. +func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { + v := structPointer_BoolSlice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded bools + fin := o.index + nb + if fin < o.index { + return errOverflow + } + + y := *v + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + y = append(y, u != 0) + } + + *v = y + return nil +} + +// Decode a slice of int32s ([]int32). +func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + structPointer_Word32Slice(base, p.field).Append(uint32(u)) + return nil +} + +// Decode a slice of int32s ([]int32) in packed format. +func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int32s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(uint32(u)) + } + return nil +} + +// Decode a slice of int64s ([]int64). +func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + + structPointer_Word64Slice(base, p.field).Append(u) + return nil +} + +// Decode a slice of int64s ([]int64) in packed format. +func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int64s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(u) + } + return nil +} + +// Decode a slice of strings ([]string). +func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + v := structPointer_StringSlice(base, p.field) + *v = append(*v, s) + return nil +} + +// Decode a slice of slice of bytes ([][]byte). +func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + v := structPointer_BytesSlice(base, p.field) + *v = append(*v, b) + return nil +} + +// Decode a map field. +func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + oi := o.index // index at the end of this map entry + o.index -= len(raw) // move buffer back to start of map entry + + mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V + if mptr.Elem().IsNil() { + mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) + } + v := mptr.Elem() // map[K]V + + // Prepare addressable doubly-indirect placeholders for the key and value types. + // See enc_new_map for why. + keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K + keybase := toStructPointer(keyptr.Addr()) // **K + + var valbase structPointer + var valptr reflect.Value + switch p.mtype.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valptr = reflect.ValueOf(&dummy) // *[]byte + valbase = toStructPointer(valptr) // *[]byte + case reflect.Ptr: + // message; valptr is **Msg; need to allocate the intermediate pointer + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valptr.Set(reflect.New(valptr.Type().Elem())) + valbase = toStructPointer(valptr) + default: + // everything else + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valbase = toStructPointer(valptr.Addr()) // **V + } + + // Decode. + // This parses a restricted wire format, namely the encoding of a message + // with two fields. See enc_new_map for the format. + for o.index < oi { + // tagcode for key and value properties are always a single byte + // because they have tags 1 and 2. + tagcode := o.buf[o.index] + o.index++ + switch tagcode { + case p.mkeyprop.tagcode[0]: + if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { + return err + } + case p.mvalprop.tagcode[0]: + if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { + return err + } + default: + // TODO: Should we silently skip this instead? + return fmt.Errorf("proto: bad map data tag %d", raw[0]) + } + } + keyelem, valelem := keyptr.Elem(), valptr.Elem() + if !keyelem.IsValid() { + keyelem = reflect.Zero(p.mtype.Key()) + } + if !valelem.IsValid() { + valelem = reflect.Zero(p.mtype.Elem()) + } + + v.SetMapIndex(keyelem, valelem) + return nil +} + +// Decode a group. +func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + return o.unmarshalType(p.stype, p.sprop, true, bas) +} + +// Decode an embedded message. +func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { + raw, e := o.DecodeRawBytes(false) + if e != nil { + return e + } + + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := structPointer_Interface(bas, p.stype) + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, false, bas) + o.buf = obuf + o.index = oi + + return err +} + +// Decode a slice of embedded messages. +func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, false, base) +} + +// Decode a slice of embedded groups. +func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, true, base) +} + +// Decode a slice of structs ([]*struct). +func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { + v := reflect.New(p.stype) + bas := toStructPointer(v) + structPointer_StructPointerSlice(base, p.field).Append(bas) + + if is_group { + err := o.unmarshalType(p.stype, p.sprop, is_group, bas) + return err + } + + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := v.Interface() + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, is_group, bas) + + o.buf = obuf + o.index = oi + + return err +} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go new file mode 100644 index 0000000000..8b84d1b22d --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/encode.go @@ -0,0 +1,1362 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "fmt" + "reflect" + "sort" +) + +// RequiredNotSetError is the error returned if Marshal is called with +// a protocol buffer struct whose required fields have not +// all been initialized. It is also the error returned if Unmarshal is +// called with an encoded protocol buffer that does not include all the +// required fields. +// +// When printed, RequiredNotSetError reports the first unset required field in a +// message. If the field cannot be precisely determined, it is reported as +// "{Unknown}". +type RequiredNotSetError struct { + field string +} + +func (e *RequiredNotSetError) Error() string { + return fmt.Sprintf("proto: required field %q not set", e.field) +} + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// maxMarshalSize is the largest allowed size of an encoded protobuf, +// since C++ and Java use signed int32s for the size. +const maxMarshalSize = 1<<31 - 1 + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + return sizeVarint(x) +} + +func sizeVarint(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +func sizeFixed64(x uint64) int { + return 8 +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +func sizeFixed32(x uint64) int { + return 4 +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63))) +} + +func sizeZigzag64(x uint64) int { + return sizeVarint((x << 1) ^ uint64((int64(x) >> 63))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +func sizeZigzag32(x uint64) int { + return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +func sizeRawBytes(b []byte) int { + return sizeVarint(uint64(len(b))) + + len(b) +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +func sizeStringBytes(s string) int { + return sizeVarint(uint64(len(s))) + + len(s) +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, returning the data. +func Marshal(pb Message) ([]byte, error) { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + return m.Marshal() + } + p := NewBuffer(nil) + err := p.Marshal(pb) + if p.buf == nil && err == nil { + // Return a non-nil slice on success. + return []byte{}, nil + } + return p.buf, err +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + var state errorState + err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) + } + return err +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, writing the result to the +// Buffer. +func (p *Buffer) Marshal(pb Message) error { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + data, err := m.Marshal() + p.buf = append(p.buf, data...) + return err + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + err = p.enc_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + (stats).Encode++ // Parens are to work around a goimports bug. + } + + if len(p.buf) > maxMarshalSize { + return ErrTooLarge + } + return err +} + +// Size returns the encoded size of a protocol buffer. +func Size(pb Message) (n int) { + // Can the object marshal itself? If so, Size is slow. + // TODO: add Size to Marshaler, or add a Sizer interface. + if m, ok := pb.(Marshaler); ok { + b, _ := m.Marshal() + return len(b) + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return 0 + } + if err == nil { + n = size_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + (stats).Size++ // Parens are to work around a goimports bug. + } + + return +} + +// Individual type encoders. + +// Encode a bool. +func (o *Buffer) enc_bool(p *Properties, base structPointer) error { + v := *structPointer_Bool(base, p.field) + if v == nil { + return ErrNil + } + x := 0 + if *v { + x = 1 + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { + v := *structPointer_BoolVal(base, p.field) + if !v { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, 1) + return nil +} + +func size_bool(p *Properties, base structPointer) int { + v := *structPointer_Bool(base, p.field) + if v == nil { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +func size_proto3_bool(p *Properties, base structPointer) int { + v := *structPointer_BoolVal(base, p.field) + if !v && !p.oneof { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +// Encode an int32. +func (o *Buffer) enc_int32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode a uint32. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := word32_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := word32_Get(v) + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode an int64. +func (o *Buffer) enc_int64(p *Properties, base structPointer) error { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return ErrNil + } + x := word64_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func size_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return 0 + } + x := word64_Get(v) + n += len(p.tagcode) + n += p.valSize(x) + return +} + +func size_proto3_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(x) + return +} + +// Encode a string. +func (o *Buffer) enc_string(p *Properties, base structPointer) error { + v := *structPointer_String(base, p.field) + if v == nil { + return ErrNil + } + x := *v + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(x) + return nil +} + +func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { + v := *structPointer_StringVal(base, p.field) + if v == "" { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(v) + return nil +} + +func size_string(p *Properties, base structPointer) (n int) { + v := *structPointer_String(base, p.field) + if v == nil { + return 0 + } + x := *v + n += len(p.tagcode) + n += sizeStringBytes(x) + return +} + +func size_proto3_string(p *Properties, base structPointer) (n int) { + v := *structPointer_StringVal(base, p.field) + if v == "" && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeStringBytes(v) + return +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} + +// Encode a message struct. +func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { + var state errorState + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return ErrNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + return state.err + } + + o.buf = append(o.buf, p.tagcode...) + return o.enc_len_struct(p.sprop, structp, &state) +} + +func size_struct_message(p *Properties, base structPointer) int { + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return 0 + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n0 := len(p.tagcode) + n1 := sizeRawBytes(data) + return n0 + n1 + } + + n0 := len(p.tagcode) + n1 := size_struct(p.sprop, structp) + n2 := sizeVarint(uint64(n1)) // size of encoded length + return n0 + n1 + n2 +} + +// Encode a group struct. +func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { + var state errorState + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return ErrNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + err := o.enc_struct(p.sprop, b) + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return state.err +} + +func size_struct_group(p *Properties, base structPointer) (n int) { + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return 0 + } + + n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) + n += size_struct(p.sprop, b) + n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return +} + +// Encode a slice of bools ([]bool). +func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + for _, x := range s { + o.buf = append(o.buf, p.tagcode...) + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_bool(p *Properties, base structPointer) int { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + return l * (len(p.tagcode) + 1) // each bool takes exactly one byte +} + +// Encode a slice of bools ([]bool) in packed format. +func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(l)) // each bool takes exactly one byte + for _, x := range s { + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_packed_bool(p *Properties, base structPointer) (n int) { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + n += len(p.tagcode) + n += sizeVarint(uint64(l)) + n += l // each bool takes exactly one byte + return +} + +// Encode a slice of bytes ([]byte). +func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if s == nil { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func size_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if s == nil && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +// Encode a slice of int32s ([]int32). +func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of int32s ([]int32) in packed format. +func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(buf, uint64(x)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + bufSize += p.valSize(uint64(x)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of uint32s ([]uint32). +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := s.Index(i) + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := s.Index(i) + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of uint32s ([]uint32) in packed format. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, uint64(s.Index(i))) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(uint64(s.Index(i))) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of int64s ([]int64). +func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, s.Index(i)) + } + return nil +} + +func size_slice_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + n += p.valSize(s.Index(i)) + } + return +} + +// Encode a slice of int64s ([]int64) in packed format. +func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, s.Index(i)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(s.Index(i)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of slice of bytes ([][]byte). +func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(ss[i]) + } + return nil +} + +func size_slice_slice_byte(p *Properties, base structPointer) (n int) { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return 0 + } + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeRawBytes(ss[i]) + } + return +} + +// Encode a slice of strings ([]string). +func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(ss[i]) + } + return nil +} + +func size_slice_string(p *Properties, base structPointer) (n int) { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeStringBytes(ss[i]) + } + return +} + +// Encode a slice of message structs ([]*struct). +func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return errRepeatedHasNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + continue + } + + o.buf = append(o.buf, p.tagcode...) + err := o.enc_len_struct(p.sprop, structp, &state) + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + } + return state.err +} + +func size_slice_struct_message(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return // return the size up to this point + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n += sizeRawBytes(data) + continue + } + + n0 := size_struct(p.sprop, structp) + n1 := sizeVarint(uint64(n0)) // size of encoded length + n += n0 + n1 + } + return +} + +// Encode a slice of group structs ([]*struct). +func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return errRepeatedHasNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + + err := o.enc_struct(p.sprop, b) + + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + } + return state.err +} + +func size_slice_struct_group(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) + n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return // return size up to this point + } + + n += size_struct(p.sprop, b) + } + return +} + +// Encode an extension map. +func (o *Buffer) enc_map(p *Properties, base structPointer) error { + exts := structPointer_ExtMap(base, p.field) + if err := encodeExtensionsMap(*exts); err != nil { + return err + } + + return o.enc_map_body(*exts) +} + +func (o *Buffer) enc_exts(p *Properties, base structPointer) error { + exts := structPointer_Extensions(base, p.field) + + v, mu := exts.extensionsRead() + if v == nil { + return nil + } + + mu.Lock() + defer mu.Unlock() + if err := encodeExtensionsMap(v); err != nil { + return err + } + + return o.enc_map_body(v) +} + +func (o *Buffer) enc_map_body(v map[int32]Extension) error { + // Fast-path for common cases: zero or one extensions. + if len(v) <= 1 { + for _, e := range v { + o.buf = append(o.buf, e.enc...) + } + return nil + } + + // Sort keys to provide a deterministic encoding. + keys := make([]int, 0, len(v)) + for k := range v { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + o.buf = append(o.buf, v[int32(k)].enc...) + } + return nil +} + +func size_map(p *Properties, base structPointer) int { + v := structPointer_ExtMap(base, p.field) + return extensionsMapSize(*v) +} + +func size_exts(p *Properties, base structPointer) int { + v := structPointer_Extensions(base, p.field) + return extensionsSize(v) +} + +// Encode a map field. +func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { + var state errorState // XXX: or do we need to plumb this through? + + /* + A map defined as + map map_field = N; + is encoded in the same way as + message MapFieldEntry { + key_type key = 1; + value_type value = 2; + } + repeated MapFieldEntry map_field = N; + */ + + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + if v.Len() == 0 { + return nil + } + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + enc := func() error { + if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { + return err + } + if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { + return err + } + return nil + } + + // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + + keycopy.Set(key) + valcopy.Set(val) + + o.buf = append(o.buf, p.tagcode...) + if err := o.enc_len_thing(enc, &state); err != nil { + return err + } + } + return nil +} + +func size_new_map(p *Properties, base structPointer) int { + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + n := 0 + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + keycopy.Set(key) + valcopy.Set(val) + + // Tag codes for key and val are the responsibility of the sub-sizer. + keysize := p.mkeyprop.size(p.mkeyprop, keybase) + valsize := p.mvalprop.size(p.mvalprop, valbase) + entry := keysize + valsize + // Add on tag code and length of map entry itself. + n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry + } + return n +} + +// mapEncodeScratch returns a new reflect.Value matching the map's value type, +// and a structPointer suitable for passing to an encoder or sizer. +func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { + // Prepare addressable doubly-indirect placeholders for the key and value types. + // This is needed because the element-type encoders expect **T, but the map iteration produces T. + + keycopy = reflect.New(mapType.Key()).Elem() // addressable K + keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K + keyptr.Set(keycopy.Addr()) // + keybase = toStructPointer(keyptr.Addr()) // **K + + // Value types are more varied and require special handling. + switch mapType.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte + valbase = toStructPointer(valcopy.Addr()) + case reflect.Ptr: + // message; the generated field type is map[K]*Msg (so V is *Msg), + // so we only need one level of indirection. + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valbase = toStructPointer(valcopy.Addr()) + default: + // everything else + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V + valptr.Set(valcopy.Addr()) // + valbase = toStructPointer(valptr.Addr()) // **V + } + return +} + +// Encode a struct. +func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { + var state errorState + // Encode fields in tag order so that decoders may use optimizations + // that depend on the ordering. + // https://developers.google.com/protocol-buffers/docs/encoding#order + for _, i := range prop.order { + p := prop.Prop[i] + if p.enc != nil { + err := p.enc(o, p, base) + if err != nil { + if err == ErrNil { + if p.Required && state.err == nil { + state.err = &RequiredNotSetError{p.Name} + } + } else if err == errRepeatedHasNil { + // Give more context to nil values in repeated fields. + return errors.New("repeated field " + p.OrigName + " has nil element") + } else if !state.shouldContinue(err, p) { + return err + } + } + if len(o.buf) > maxMarshalSize { + return ErrTooLarge + } + } + } + + // Do oneof fields. + if prop.oneofMarshaler != nil { + m := structPointer_Interface(base, prop.stype).(Message) + if err := prop.oneofMarshaler(m, o); err == ErrNil { + return errOneofHasNil + } else if err != nil { + return err + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + if len(o.buf)+len(v) > maxMarshalSize { + return ErrTooLarge + } + if len(v) > 0 { + o.buf = append(o.buf, v...) + } + } + + return state.err +} + +func size_struct(prop *StructProperties, base structPointer) (n int) { + for _, i := range prop.order { + p := prop.Prop[i] + if p.size != nil { + n += p.size(p, base) + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + n += len(v) + } + + // Factor in any oneof fields. + if prop.oneofSizer != nil { + m := structPointer_Interface(base, prop.stype).(Message) + n += prop.oneofSizer(m) + } + + return +} + +var zeroes [20]byte // longer than any conceivable sizeVarint + +// Encode a struct, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { + return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) +} + +// Encode something, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { + iLen := len(o.buf) + o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length + iMsg := len(o.buf) + err := enc() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + lMsg := len(o.buf) - iMsg + lLen := sizeVarint(uint64(lMsg)) + switch x := lLen - (iMsg - iLen); { + case x > 0: // actual length is x bytes larger than the space we reserved + // Move msg x bytes right. + o.buf = append(o.buf, zeroes[:x]...) + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + case x < 0: // actual length is x bytes smaller than the space we reserved + // Move msg x bytes left. + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + o.buf = o.buf[:len(o.buf)+x] // x is negative + } + // Encode the length in the reserved space. + o.buf = o.buf[:iLen] + o.EncodeVarint(uint64(lMsg)) + o.buf = o.buf[:len(o.buf)+lMsg] + return state.err +} + +// errorState maintains the first error that occurs and updates that error +// with additional context. +type errorState struct { + err error +} + +// shouldContinue reports whether encoding should continue upon encountering the +// given error. If the error is RequiredNotSetError, shouldContinue returns true +// and, if this is the first appearance of that error, remembers it for future +// reporting. +// +// If prop is not nil, it may update any error with additional context about the +// field with the error. +func (s *errorState) shouldContinue(err error, prop *Properties) bool { + // Ignore unset required fields. + reqNotSet, ok := err.(*RequiredNotSetError) + if !ok { + return false + } + if s.err == nil { + if prop != nil { + err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} + } + s.err = err + } + return true +} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go new file mode 100644 index 0000000000..2ed1cf5966 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/equal.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + b1, ok := f1.Interface().(raw) + if ok { + b2 := f2.Interface().(raw) + // RawMessage + if !bytes.Equal(b1.Bytes(), b2.Bytes()) { + return false + } + continue + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + if !bytes.Equal(u1, u2) { + return false + } + + return true +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1, m2 := e1.value, e2.value + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + continue + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go new file mode 100644 index 0000000000..eaad218312 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/extensions.go @@ -0,0 +1,587 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, bool) { + if ep, ok := p.(extendableProto); ok { + return ep, ok + } + if ep, ok := p.(extendableProtoV1); ok { + return extensionAdapter{ep}, ok + } + return nil, false +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() +var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + value interface{} + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + epb, ok := extendable(base) + if !ok { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// encode encodes any unmarshaled (unencoded) extensions in e. +func encodeExtensions(e *XXX_InternalExtensions) error { + m, mu := e.extensionsRead() + if m == nil { + return nil // fast path + } + mu.Lock() + defer mu.Unlock() + return encodeExtensionsMap(m) +} + +// encode encodes any unmarshaled (unencoded) extensions in e. +func encodeExtensionsMap(m map[int32]Extension) error { + for k, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + et := reflect.TypeOf(e.desc.ExtensionType) + props := extensionProperties(e.desc) + + p := NewBuffer(nil) + // If e.value has type T, the encoder expects a *struct{ X T }. + // Pass a *T with a zero field and hope it all works out. + x := reflect.New(et) + x.Elem().Set(reflect.ValueOf(e.value)) + if err := props.enc(p, props, toStructPointer(x)); err != nil { + return err + } + e.enc = p.buf + m[k] = e + } + return nil +} + +func extensionsSize(e *XXX_InternalExtensions) (n int) { + m, mu := e.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + defer mu.Unlock() + return extensionsMapSize(m) +} + +func extensionsMapSize(m map[int32]Extension) (n int) { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + et := reflect.TypeOf(e.desc.ExtensionType) + props := extensionProperties(e.desc) + + // If e.value has type T, the encoder expects a *struct{ X T }. + // Pass a *T with a zero field and hope it all works out. + x := reflect.New(et) + x.Elem().Set(reflect.ValueOf(e.value)) + n += props.size(props, toStructPointer(x)) + } + return +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + // TODO: Check types, field numbers, etc.? + epb, ok := extendable(pb) + if !ok { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok = extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + epb, ok := extendable(pb) + if !ok { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, extension.Field) +} + +// GetExtension parses and returns the given extension of pb. +// If the extension is not present and has no default value it returns ErrMissingExtension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") + } + + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return e.value, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = v + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return e.value, nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + o := NewBuffer(b) + + t := reflect.TypeOf(extension.ExtensionType) + + props := extensionProperties(extension) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate a "field" to store the pointer/slice itself; the + // pointer/slice will be stored here. We pass + // the address of this field to props.dec. + // This passes a zero field and a *t and lets props.dec + // interpret it as a *struct{ x t }. + value := reflect.New(t).Elem() + + for { + // Discard wire type and field number varint. It isn't needed. + if _, err := o.DecodeVarint(); err != nil { + return nil, err + } + + if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { + return nil, err + } + + if o.index >= len(o.buf) { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, ok := extendable(pb) + if !ok { + return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, ok := extendable(pb) + if !ok { + return errors.New("proto: not an extendable proto") + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return errors.New("proto: bad extension value type") + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, ok := extendable(pb) + if !ok { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 0000000000..1c225504a0 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,897 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// Stats records allocation details about the protocol buffer encoders +// and decoders. Useful for tuning the library itself. +type Stats struct { + Emalloc uint64 // mallocs in encode + Dmalloc uint64 // mallocs in decode + Encode uint64 // number of encodes + Decode uint64 // number of decodes + Chit uint64 // number of cache hits + Cmiss uint64 // number of cache misses + Size uint64 // number of sizes +} + +// Set to true to enable stats collection. +const collectStats = false + +var stats Stats + +// GetStats returns a copy of the global Stats structure. +func GetStats() Stats { return stats } + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + // pools of basic types to amortize allocation. + bools []bool + uint32s []uint32 + uint64s []uint64 + + // extra pools, only used with pointer_reflect.go + int32s []int32 + int64s []int64 + float32s []float32 + float64s []float64 +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. + +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{ + vs: vs, + // default Less function: textual comparison + less: func(a, b reflect.Value) bool { + return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) + }, + } + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; + // numeric keys are sorted numerically. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion2 = true + +// ProtoPackageIsVersion1 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion1 = true diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 0000000000..fd982decd6 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,311 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + if ms.find(pb) != nil { + return true + } + return false +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// MarshalMessageSet encodes the extension map represented by m in the message set wire format. +// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSet(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + if err := encodeExtensions(exts); err != nil { + return nil, err + } + m, _ = exts.extensionsRead() + case map[int32]Extension: + if err := encodeExtensionsMap(exts); err != nil { + return nil, err + } + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + + // Sort extension IDs to provide a deterministic encoding. + // See also enc_map in encode.go. + ids := make([]int, 0, len(m)) + for id := range m { + ids = append(ids, int(id)) + } + sort.Ints(ids) + + ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} + for _, id := range ids { + e := m[int32(id)] + // Remove the wire type and field number varint, as well as the length varint. + msg := skipVarint(skipVarint(e.enc)) + + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: Int32(int32(id)), + Message: msg, + }) + } + return Marshal(ms) +} + +// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} + +// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. +// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m, _ = exts.extensionsRead() + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + var b bytes.Buffer + b.WriteByte('{') + + // Process the map in key order for deterministic output. + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) // int32Slice defined in text.go + + for i, id := range ids { + ext := m[id] + if i > 0 { + b.WriteByte(',') + } + + msd, ok := messageSetMap[id] + if !ok { + // Unknown type; we can't render it, so skip it. + continue + } + fmt.Fprintf(&b, `"[%s]":`, msd.name) + + x := ext.value + if x == nil { + x = reflect.New(msd.t.Elem()).Interface() + if err := Unmarshal(ext.enc, x.(Message)); err != nil { + return nil, err + } + } + d, err := json.Marshal(x) + if err != nil { + return nil, err + } + b.Write(d) + } + b.WriteByte('}') + return b.Bytes(), nil +} + +// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. +// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { + // Common-case fast path. + if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { + return nil + } + + // This is fairly tricky, and it's not clear that it is needed. + return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") +} + +// A global registry of types that can be used in a MessageSet. + +var messageSetMap = make(map[int32]messageSetDesc) + +type messageSetDesc struct { + t reflect.Type // pointer to struct + name string +} + +// RegisterMessageSetType is called from the generated code. +func RegisterMessageSetType(m Message, fieldNum int32, name string) { + messageSetMap[fieldNum] = messageSetDesc{ + t: reflect.TypeOf(m), + name: name, + } +} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 0000000000..fb512e2e16 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,484 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "math" + "reflect" +) + +// A structPointer is a pointer to a struct. +type structPointer struct { + v reflect.Value +} + +// toStructPointer returns a structPointer equivalent to the given reflect value. +// The reflect value must itself be a pointer to a struct. +func toStructPointer(v reflect.Value) structPointer { + return structPointer{v} +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p.v.IsNil() +} + +// Interface returns the struct pointer as an interface value. +func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { + return p.v.Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// field returns the given field in the struct as a reflect value. +func structPointer_field(p structPointer, f field) reflect.Value { + // Special case: an extension map entry with a value of type T + // passes a *T to the struct-handling code with a zero field, + // expecting that it will be treated as equivalent to *struct{ X T }, + // which has the same memory layout. We have to handle that case + // specially, because reflect will panic if we call FieldByIndex on a + // non-struct. + if f == nil { + return p.v.Elem() + } + + return p.v.Elem().FieldByIndex(f) +} + +// ifield returns the given field in the struct as an interface value. +func structPointer_ifield(p structPointer, f field) interface{} { + return structPointer_field(p, f).Addr().Interface() +} + +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return structPointer_ifield(p, f).(*[]byte) +} + +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return structPointer_ifield(p, f).(*[][]byte) +} + +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return structPointer_ifield(p, f).(**bool) +} + +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return structPointer_ifield(p, f).(*bool) +} + +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return structPointer_ifield(p, f).(*[]bool) +} + +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return structPointer_ifield(p, f).(**string) +} + +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return structPointer_ifield(p, f).(*string) +} + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return structPointer_ifield(p, f).(*[]string) +} + +// Extensions returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return structPointer_ifield(p, f).(*XXX_InternalExtensions) +} + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return structPointer_ifield(p, f).(*map[int32]Extension) +} + +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return structPointer_field(p, f).Addr() +} + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + structPointer_field(p, f).Set(q.v) +} + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return structPointer{structPointer_field(p, f)} +} + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { + return structPointerSlice{structPointer_field(p, f)} +} + +// A structPointerSlice represents the address of a slice of pointers to structs +// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. +type structPointerSlice struct { + v reflect.Value +} + +func (p structPointerSlice) Len() int { return p.v.Len() } +func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } +func (p structPointerSlice) Append(q structPointer) { + p.v.Set(reflect.Append(p.v, q.v)) +} + +var ( + int32Type = reflect.TypeOf(int32(0)) + uint32Type = reflect.TypeOf(uint32(0)) + float32Type = reflect.TypeOf(float32(0)) + int64Type = reflect.TypeOf(int64(0)) + uint64Type = reflect.TypeOf(uint64(0)) + float64Type = reflect.TypeOf(float64(0)) +) + +// A word32 represents a field of type *int32, *uint32, *float32, or *enum. +// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. +type word32 struct { + v reflect.Value +} + +// IsNil reports whether p is nil. +func word32_IsNil(p word32) bool { + return p.v.IsNil() +} + +// Set sets p to point at a newly allocated word with bits set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + t := p.v.Type().Elem() + switch t { + case int32Type: + if len(o.int32s) == 0 { + o.int32s = make([]int32, uint32PoolSize) + } + o.int32s[0] = int32(x) + p.v.Set(reflect.ValueOf(&o.int32s[0])) + o.int32s = o.int32s[1:] + return + case uint32Type: + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + p.v.Set(reflect.ValueOf(&o.uint32s[0])) + o.uint32s = o.uint32s[1:] + return + case float32Type: + if len(o.float32s) == 0 { + o.float32s = make([]float32, uint32PoolSize) + } + o.float32s[0] = math.Float32frombits(x) + p.v.Set(reflect.ValueOf(&o.float32s[0])) + o.float32s = o.float32s[1:] + return + } + + // must be enum + p.v.Set(reflect.New(t)) + p.v.Elem().SetInt(int64(int32(x))) +} + +// Get gets the bits pointed at by p, as a uint32. +func word32_Get(p word32) uint32 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32{structPointer_field(p, f)} +} + +// A word32Val represents a field of type int32, uint32, float32, or enum. +// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. +type word32Val struct { + v reflect.Value +} + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + switch p.v.Type() { + case int32Type: + p.v.SetInt(int64(x)) + return + case uint32Type: + p.v.SetUint(uint64(x)) + return + case float32Type: + p.v.SetFloat(float64(math.Float32frombits(x))) + return + } + + // must be enum + p.v.SetInt(int64(int32(x))) +} + +// Get gets the bits pointed at by p, as a uint32. +func word32Val_Get(p word32Val) uint32 { + elem := p.v + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val{structPointer_field(p, f)} +} + +// A word32Slice is a slice of 32-bit values. +// That is, v.Type() is []int32, []uint32, []float32, or []enum. +type word32Slice struct { + v reflect.Value +} + +func (p word32Slice) Append(x uint32) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int32: + elem.SetInt(int64(int32(x))) + case reflect.Uint32: + elem.SetUint(uint64(x)) + case reflect.Float32: + elem.SetFloat(float64(math.Float32frombits(x))) + } +} + +func (p word32Slice) Len() int { + return p.v.Len() +} + +func (p word32Slice) Index(i int) uint32 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) word32Slice { + return word32Slice{structPointer_field(p, f)} +} + +// word64 is like word32 but for 64-bit values. +type word64 struct { + v reflect.Value +} + +func word64_Set(p word64, o *Buffer, x uint64) { + t := p.v.Type().Elem() + switch t { + case int64Type: + if len(o.int64s) == 0 { + o.int64s = make([]int64, uint64PoolSize) + } + o.int64s[0] = int64(x) + p.v.Set(reflect.ValueOf(&o.int64s[0])) + o.int64s = o.int64s[1:] + return + case uint64Type: + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + p.v.Set(reflect.ValueOf(&o.uint64s[0])) + o.uint64s = o.uint64s[1:] + return + case float64Type: + if len(o.float64s) == 0 { + o.float64s = make([]float64, uint64PoolSize) + } + o.float64s[0] = math.Float64frombits(x) + p.v.Set(reflect.ValueOf(&o.float64s[0])) + o.float64s = o.float64s[1:] + return + } + panic("unreachable") +} + +func word64_IsNil(p word64) bool { + return p.v.IsNil() +} + +func word64_Get(p word64) uint64 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") +} + +func structPointer_Word64(p structPointer, f field) word64 { + return word64{structPointer_field(p, f)} +} + +// word64Val is like word32Val but for 64-bit values. +type word64Val struct { + v reflect.Value +} + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + switch p.v.Type() { + case int64Type: + p.v.SetInt(int64(x)) + return + case uint64Type: + p.v.SetUint(x) + return + case float64Type: + p.v.SetFloat(math.Float64frombits(x)) + return + } + panic("unreachable") +} + +func word64Val_Get(p word64Val) uint64 { + elem := p.v + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") +} + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val{structPointer_field(p, f)} +} + +type word64Slice struct { + v reflect.Value +} + +func (p word64Slice) Append(x uint64) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int64: + elem.SetInt(int64(int64(x))) + case reflect.Uint64: + elem.SetUint(uint64(x)) + case reflect.Float64: + elem.SetFloat(float64(math.Float64frombits(x))) + } +} + +func (p word64Slice) Len() int { + return p.v.Len() +} + +func (p word64Slice) Index(i int) uint64 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return uint64(elem.Uint()) + case reflect.Float64: + return math.Float64bits(float64(elem.Float())) + } + panic("unreachable") +} + +func structPointer_Word64Slice(p structPointer, f field) word64Slice { + return word64Slice{structPointer_field(p, f)} +} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 0000000000..6b5567d47c --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,270 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "unsafe" +) + +// NOTE: These type_Foo functions would more idiomatically be methods, +// but Go does not allow methods on pointer types, and we must preserve +// some pointer type for the garbage collector. We use these +// funcs with clunky names as our poor approximation to methods. +// +// An alternative would be +// type structPointer struct { p unsafe.Pointer } +// but that does not registerize as well. + +// A structPointer is a pointer to a struct. +type structPointer unsafe.Pointer + +// toStructPointer returns a structPointer equivalent to the given reflect value. +func toStructPointer(v reflect.Value) structPointer { + return structPointer(unsafe.Pointer(v.Pointer())) +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p == nil +} + +// Interface returns the struct pointer, assumed to have element type t, +// as an interface value. +func structPointer_Interface(p structPointer, t reflect.Type) interface{} { + return reflect.NewAt(t, unsafe.Pointer(p)).Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != ^field(0) +} + +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) +} + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q +} + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { + return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). +type structPointerSlice []structPointer + +func (v *structPointerSlice) Len() int { return len(*v) } +func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } +func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } + +// A word32 is the address of a "pointer to 32-bit value" field. +type word32 **uint32 + +// IsNil reports whether *v is nil. +func word32_IsNil(p word32) bool { + return *p == nil +} + +// Set sets *v to point at a newly allocated word set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + *p = &o.uint32s[0] + o.uint32s = o.uint32s[1:] +} + +// Get gets the value pointed at by *v. +func word32_Get(p word32) uint32 { + return **p +} + +// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// A word32Val is the address of a 32-bit value field. +type word32Val *uint32 + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + *p = x +} + +// Get gets the value pointed at by p. +func word32Val_Get(p word32Val) uint32 { + return *p +} + +// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// A word32Slice is a slice of 32-bit values. +type word32Slice []uint32 + +func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } +func (v *word32Slice) Len() int { return len(*v) } +func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } + +// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) *word32Slice { + return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// word64 is like word32 but for 64-bit values. +type word64 **uint64 + +func word64_Set(p word64, o *Buffer, x uint64) { + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + *p = &o.uint64s[0] + o.uint64s = o.uint64s[1:] +} + +func word64_IsNil(p word64) bool { + return *p == nil +} + +func word64_Get(p word64) uint64 { + return **p +} + +func structPointer_Word64(p structPointer, f field) word64 { + return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// word64Val is like word32Val but for 64-bit values. +type word64Val *uint64 + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + *p = x +} + +func word64Val_Get(p word64Val) uint64 { + return *p +} + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// word64Slice is like word32Slice but for 64-bit values. +type word64Slice []uint64 + +func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } +func (v *word64Slice) Len() int { return len(*v) } +func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } + +func structPointer_Word64Slice(p structPointer, f field) *word64Slice { + return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 0000000000..ec2289c005 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,872 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +const startSize = 10 // initial slice/string sizes + +// Encoders are defined in encode.go +// An encoder outputs the full representation of a field, including its +// tag and encoder type. +type encoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueEncoder encodes a single integer in a particular encoding. +type valueEncoder func(o *Buffer, x uint64) error + +// Sizers are defined in encode.go +// A sizer returns the encoded size of a field, including its tag and encoder +// type. +type sizer func(prop *Properties, base structPointer) int + +// A valueSizer returns the encoded size of a single integer in a particular +// encoding. +type valueSizer func(x uint64) int + +// Decoders are defined in decode.go +// A decoder creates a value from its wire representation. +// Unrecognized subelements are saved in unrec. +type decoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueDecoder decodes a single integer in a particular encoding. +type valueDecoder func(o *Buffer) (x uint64, err error) + +// A oneofMarshaler does the marshaling for all oneof fields in a message. +type oneofMarshaler func(Message, *Buffer) error + +// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. +type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) + +// A oneofSizer does the sizing for all oneof fields in a message. +type oneofSizer func(Message) int + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + unrecField field // field id of the XXX_unrecognized []byte field + extendable bool // is this an extendable proto + + oneofMarshaler oneofMarshaler + oneofUnmarshaler oneofUnmarshaler + oneofSizer oneofSizer + stype reflect.Type + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field; set for []byte only + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + def_uint64 uint64 + + enc encoder + valEnc valueEncoder // set for bool and numeric types only + field field + tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) + tagbuf [8]byte + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + isMarshaler bool + isUnmarshaler bool + + mtype reflect.Type // set for map types only + mkeyprop *Properties // set for map types only + mvalprop *Properties // set for map types only + + size sizer + valSize valueSizer // set for bool and numeric types only + + dec decoder + valDec valueDecoder // set for bool and numeric types only + + // If this is a packable field, this will be the decoder for the packed version of the field. + packedDec decoder +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s = "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeVarint + p.valDec = (*Buffer).DecodeVarint + p.valSize = sizeVarint + case "fixed32": + p.WireType = WireFixed32 + p.valEnc = (*Buffer).EncodeFixed32 + p.valDec = (*Buffer).DecodeFixed32 + p.valSize = sizeFixed32 + case "fixed64": + p.WireType = WireFixed64 + p.valEnc = (*Buffer).EncodeFixed64 + p.valDec = (*Buffer).DecodeFixed64 + p.valSize = sizeFixed64 + case "zigzag32": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag32 + p.valDec = (*Buffer).DecodeZigzag32 + p.valSize = sizeZigzag32 + case "zigzag64": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag64 + p.valDec = (*Buffer).DecodeZigzag64 + p.valSize = sizeZigzag64 + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break + } + } + } +} + +func logNoSliceEnc(t1, t2 reflect.Type) { + fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// Initialize the fields for encoding and decoding. +func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + p.enc = nil + p.dec = nil + p.size = nil + + switch t1 := typ; t1.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) + + // proto3 scalar types + + case reflect.Bool: + p.enc = (*Buffer).enc_proto3_bool + p.dec = (*Buffer).dec_proto3_bool + p.size = size_proto3_bool + case reflect.Int32: + p.enc = (*Buffer).enc_proto3_int32 + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_proto3_uint32 + p.dec = (*Buffer).dec_proto3_int32 // can reuse + p.size = size_proto3_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_proto3_int64 + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.String: + p.enc = (*Buffer).enc_proto3_string + p.dec = (*Buffer).dec_proto3_string + p.size = size_proto3_string + + case reflect.Ptr: + switch t2 := t1.Elem(); t2.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) + break + case reflect.Bool: + p.enc = (*Buffer).enc_bool + p.dec = (*Buffer).dec_bool + p.size = size_bool + case reflect.Int32: + p.enc = (*Buffer).enc_int32 + p.dec = (*Buffer).dec_int32 + p.size = size_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_uint32 + p.dec = (*Buffer).dec_int32 // can reuse + p.size = size_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_int64 + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_int32 + p.size = size_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_int64 // can just treat them as bits + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.String: + p.enc = (*Buffer).enc_string + p.dec = (*Buffer).dec_string + p.size = size_string + case reflect.Struct: + p.stype = t1.Elem() + p.isMarshaler = isMarshaler(t1) + p.isUnmarshaler = isUnmarshaler(t1) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_struct_message + p.dec = (*Buffer).dec_struct_message + p.size = size_struct_message + } else { + p.enc = (*Buffer).enc_struct_group + p.dec = (*Buffer).dec_struct_group + p.size = size_struct_group + } + } + + case reflect.Slice: + switch t2 := t1.Elem(); t2.Kind() { + default: + logNoSliceEnc(t1, t2) + break + case reflect.Bool: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_bool + p.size = size_slice_packed_bool + } else { + p.enc = (*Buffer).enc_slice_bool + p.size = size_slice_bool + } + p.dec = (*Buffer).dec_slice_bool + p.packedDec = (*Buffer).dec_slice_packed_bool + case reflect.Int32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int32 + p.size = size_slice_packed_int32 + } else { + p.enc = (*Buffer).enc_slice_int32 + p.size = size_slice_int32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Uint32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Int64, reflect.Uint64: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + case reflect.Uint8: + p.dec = (*Buffer).dec_slice_byte + if p.proto3 { + p.enc = (*Buffer).enc_proto3_slice_byte + p.size = size_proto3_slice_byte + } else { + p.enc = (*Buffer).enc_slice_byte + p.size = size_slice_byte + } + case reflect.Float32, reflect.Float64: + switch t2.Bits() { + case 32: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case 64: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + default: + logNoSliceEnc(t1, t2) + break + } + case reflect.String: + p.enc = (*Buffer).enc_slice_string + p.dec = (*Buffer).dec_slice_string + p.size = size_slice_string + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) + break + case reflect.Struct: + p.stype = t2.Elem() + p.isMarshaler = isMarshaler(t2) + p.isUnmarshaler = isUnmarshaler(t2) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_slice_struct_message + p.dec = (*Buffer).dec_slice_struct_message + p.size = size_slice_struct_message + } else { + p.enc = (*Buffer).enc_slice_struct_group + p.dec = (*Buffer).dec_slice_struct_group + p.size = size_slice_struct_group + } + } + case reflect.Slice: + switch t2.Elem().Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) + break + case reflect.Uint8: + p.enc = (*Buffer).enc_slice_slice_byte + p.dec = (*Buffer).dec_slice_slice_byte + p.size = size_slice_slice_byte + } + } + + case reflect.Map: + p.enc = (*Buffer).enc_new_map + p.dec = (*Buffer).dec_new_map + p.size = size_new_map + + p.mtype = t1 + p.mkeyprop = &Properties{} + p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.mvalprop = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + // precalculate tag code + wire := p.WireType + if p.Packed { + wire = WireBytes + } + x := uint32(p.Tag)<<3 | uint32(wire) + i := 0 + for i = 0; x > 127; i++ { + p.tagbuf[i] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + p.tagbuf[i] = uint8(x) + p.tagcode = p.tagbuf[0 : i+1] + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() +) + +// isMarshaler reports whether type t implements Marshaler. +func isMarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isMarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isMarshaler") + } + return t.Implements(marshalerType) +} + +// isUnmarshaler reports whether type t implements Unmarshaler. +func isUnmarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isUnmarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isUnmarshaler") + } + return t.Implements(unmarshalerType) +} + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if f != nil { + p.field = toField(f) + } + if tag == "" { + return + } + p.Parse(tag) + p.setEncAndDec(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + if collectStats { + stats.Chit++ + } + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + if collectStats { + stats.Chit++ + } + return prop + } + if collectStats { + stats.Cmiss++ + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || + reflect.PtrTo(t).Implements(extendableProtoV1Type) + prop.unrecField = invalidField + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + if f.Name == "XXX_InternalExtensions" { // special case + p.enc = (*Buffer).enc_exts + p.dec = nil // not needed + p.size = size_exts + } else if f.Name == "XXX_extensions" { // special case + p.enc = (*Buffer).enc_map + p.dec = nil // not needed + p.size = size_map + } else if f.Name == "XXX_unrecognized" { // special case + prop.unrecField = toField(&f) + } + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { + fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + var oots []interface{} + prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() + prop.stype = t + + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// Return the Properties object for the x[0]'th field of the structure. +func propByIndex(t reflect.Type, x []int) *Properties { + if len(x) != 1 { + fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) + return nil + } + prop := GetProperties(t) + return prop.Prop[x[0]] +} + +// Get the address and type of a pointer to a struct from an interface. +func getbase(pb Message) (t reflect.Type, b structPointer, err error) { + if pb == nil { + err = ErrNil + return + } + // get the reflect type of the pointer to the struct. + t = reflect.TypeOf(pb) + // get the address of the struct. + value := reflect.ValueOf(pb) + b = toStructPointer(value) + return +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypes = make(map[string]reflect.Type) + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypes[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +func MessageType(name string) reflect.Type { return protoTypes[name] } + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go new file mode 100644 index 0000000000..965876bf03 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,854 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + gtNewline = []byte(">\n") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +// raw is the interface satisfied by RawMessage. +type raw interface { + Bytes() []byte +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.mkeyprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.mvalprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if b, ok := fv.Interface().(raw); ok { + if err := writeRaw(w, b.Bytes()); err != nil { + return err + } + continue + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, ok := extendable(pv.Interface()); ok { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeRaw writes an uninterpreted raw message. +func writeRaw(w *textWriter, b []byte) error { + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if err := writeUnknownStruct(w, b); err != nil { + return err + } + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else if err := tm.writeStruct(w, v); err != nil { + return err + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 0000000000..5e14513f28 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,895 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") + errBadHex = errors.New("proto: bad hexadecimal") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + base := 8 + ss := s[:2] + s = s[2:] + if r == 'x' || r == 'X' { + base = 16 + } else { + ss = string(r) + ss + } + i, err := strconv.ParseUint(ss, base, 8) + if err != nil { + return "", "", err + } + return string([]byte{byte(i)}), s, nil + case 'u', 'U': + n := 4 + if r == 'U' { + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) + } + + bs := make([]byte, n/2) + for i := 0; i < n; i += 2 { + a, ok1 := unhex(s[i]) + b, ok2 := unhex(s[i+1]) + if !ok1 || !ok2 { + return "", "", errBadHex + } + bs[i/2] = a<<4 | b + } + s = s[n:] + return string(bs), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Adapted from src/pkg/strconv/quote.go. +func unhex(b byte) (v byte, ok bool) { + switch { + case '0' <= b && b <= '9': + return b - '0', true + case 'a' <= b && b <= 'f': + return b - 'a' + 10, true + case 'A' <= b && b <= 'F': + return b - 'A' + 10, true + } + return 0, false +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.mkeyprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.mvalprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + err := um.UnmarshalText([]byte(s)) + return err + } + pb.Reset() + v := reflect.ValueOf(pb) + if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { + return pe + } + return nil +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile new file mode 100644 index 0000000000..41a2d04d01 --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile @@ -0,0 +1,36 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Not stored here, but descriptor.proto is in https://github.com/google/protobuf/ +# at src/google/protobuf/descriptor.proto +regenerate: + @echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION + protoc --go_out=../../../../.. -I$(HOME)/src/protobuf/include $(HOME)/src/protobuf/include/google/protobuf/descriptor.proto diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go new file mode 100644 index 0000000000..63cf2c80aa --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go @@ -0,0 +1,2152 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/descriptor.proto + +/* +Package descriptor is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/descriptor.proto + +It has these top-level messages: + FileDescriptorSet + FileDescriptorProto + DescriptorProto + FieldDescriptorProto + OneofDescriptorProto + EnumDescriptorProto + EnumValueDescriptorProto + ServiceDescriptorProto + MethodDescriptorProto + FileOptions + MessageOptions + FieldOptions + OneofOptions + EnumOptions + EnumValueOptions + ServiceOptions + MethodOptions + UninterpretedOption + SourceCodeInfo + GeneratedCodeInfo +*/ +package descriptor + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{3, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{9, 0} } + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 0} } + +type FieldOptions_JSType int32 + +const ( + // Use the default type. + FieldOptions_JS_NORMAL FieldOptions_JSType = 0 + // Use JavaScript strings. + FieldOptions_JS_STRING FieldOptions_JSType = 1 + // Use JavaScript numbers. + FieldOptions_JS_NUMBER FieldOptions_JSType = 2 +) + +var FieldOptions_JSType_name = map[int32]string{ + 0: "JS_NORMAL", + 1: "JS_STRING", + 2: "JS_NUMBER", +} +var FieldOptions_JSType_value = map[string]int32{ + "JS_NORMAL": 0, + "JS_STRING": 1, + "JS_NUMBER": 2, +} + +func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { + p := new(FieldOptions_JSType) + *p = x + return p +} +func (x FieldOptions_JSType) String() string { + return proto.EnumName(FieldOptions_JSType_name, int32(x)) +} +func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") + if err != nil { + return err + } + *x = FieldOptions_JSType(value) + return nil +} +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 1} } + +// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, +// or neither? HTTP based RPC implementation may choose GET verb for safe +// methods, and PUT verb for idempotent methods instead of the default POST. +type MethodOptions_IdempotencyLevel int32 + +const ( + MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 + MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 + MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 +) + +var MethodOptions_IdempotencyLevel_name = map[int32]string{ + 0: "IDEMPOTENCY_UNKNOWN", + 1: "NO_SIDE_EFFECTS", + 2: "IDEMPOTENT", +} +var MethodOptions_IdempotencyLevel_value = map[string]int32{ + "IDEMPOTENCY_UNKNOWN": 0, + "NO_SIDE_EFFECTS": 1, + "IDEMPOTENT": 2, +} + +func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { + p := new(MethodOptions_IdempotencyLevel) + *p = x + return p +} +func (x MethodOptions_IdempotencyLevel) String() string { + return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) +} +func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") + if err != nil { + return err + } + *x = MethodOptions_IdempotencyLevel(value) + return nil +} +func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{16, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *DescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{2, 0} +} + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Range of reserved tag numbers. Reserved tag numbers may not be used by +// fields or extension ranges in the same message. Reserved ranges may +// not overlap. +type DescriptorProto_ReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } +func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ReservedRange) ProtoMessage() {} +func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{2, 1} +} + +func (m *DescriptorProto_ReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetJsonName() string { + if m != nil && m.JsonName != nil { + return *m.JsonName + } + return "" +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OneofDescriptorProto) GetOptions() *OneofOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // This option does nothing. + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` + // Namespace for generated classes; defaults to the package. + CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +var extRange_FileOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return false +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetObjcClassPrefix() string { + if m != nil && m.ObjcClassPrefix != nil { + return *m.ObjcClassPrefix + } + return "" +} + +func (m *FileOptions) GetCsharpNamespace() string { + if m != nil && m.CsharpNamespace != nil { + return *m.CsharpNamespace + } + return "" +} + +func (m *FileOptions) GetSwiftPrefix() string { + if m != nil && m.SwiftPrefix != nil { + return *m.SwiftPrefix + } + return "" +} + +func (m *FileOptions) GetPhpClassPrefix() string { + if m != nil && m.PhpClassPrefix != nil { + return *m.PhpClassPrefix + } + return "" +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +var extRange_MessageOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). By default these types are + // represented as JavaScript strings. This avoids loss of precision that can + // happen when a large value is converted to a floating point JavaScript + // numbers. Specifying JS_NUMBER for the jstype causes the generated + // JavaScript code to use the JavaScript "number" type instead of strings. + // This option is an enum to permit additional types to be added, + // e.g. goog.math.Integer. + Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +var extRange_FieldOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetJstype() FieldOptions_JSType { + if m != nil && m.Jstype != nil { + return *m.Jstype + } + return Default_FieldOptions_Jstype +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type OneofOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +var extRange_OneofOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OneofOptions +} + +func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +var extRange_EnumOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +var extRange_MethodOptions = []proto.ExtensionRange{ + {1000, 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} + +const Default_MethodOptions_Deprecated bool = false +const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { + if m != nil && m.IdempotencyLevel != nil { + return *m.IdempotencyLevel + } + return Default_MethodOptions_IdempotencyLevel +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{17, 0} +} + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} } + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { + if m != nil { + return m.LeadingDetachedComments + } + return nil +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +type GeneratedCodeInfo struct { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { + if m != nil { + return m.Annotation + } + return nil +} + +type GeneratedCodeInfo_Annotation struct { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Identifies the filesystem path to the original source .proto. + SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } +func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} +func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{19, 0} +} + +func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { + if m != nil && m.SourceFile != nil { + return *m.SourceFile + } + return "" +} + +func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { + if m != nil && m.Begin != nil { + return *m.Begin + } + return 0 +} + +func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func init() { + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") + proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) +} + +func init() { proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 2460 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x5b, 0x6f, 0xdb, 0xc8, + 0x15, 0x5e, 0x5d, 0x2d, 0x1d, 0xc9, 0xf2, 0x78, 0xec, 0x4d, 0x18, 0xef, 0x25, 0x8e, 0xf6, 0x12, + 0x6f, 0xd2, 0xc8, 0x0b, 0xe7, 0xb2, 0x59, 0xa7, 0x48, 0x21, 0x4b, 0x8c, 0x57, 0xa9, 0x2c, 0xa9, + 0x94, 0xdc, 0x4d, 0xf6, 0x85, 0x18, 0x93, 0x23, 0x99, 0x09, 0x45, 0x72, 0x49, 0x2a, 0x89, 0xf7, + 0x29, 0x40, 0x9f, 0x0a, 0xf4, 0x07, 0x14, 0x45, 0xd1, 0x87, 0x7d, 0x59, 0xa0, 0x3f, 0xa0, 0xcf, + 0xfd, 0x05, 0x05, 0xf6, 0xb9, 0x2f, 0x45, 0x51, 0xa0, 0xfd, 0x07, 0x7d, 0x2d, 0x66, 0x86, 0xa4, + 0x48, 0x5d, 0x12, 0x77, 0x81, 0xec, 0x3e, 0xd9, 0x73, 0xce, 0x77, 0x0e, 0xcf, 0x9c, 0xf9, 0x66, + 0xce, 0x99, 0x11, 0x6c, 0x8f, 0x6c, 0x7b, 0x64, 0xd2, 0x5d, 0xc7, 0xb5, 0x7d, 0xfb, 0x64, 0x32, + 0xdc, 0xd5, 0xa9, 0xa7, 0xb9, 0x86, 0xe3, 0xdb, 0x6e, 0x8d, 0xcb, 0xf0, 0x9a, 0x40, 0xd4, 0x42, + 0x44, 0xf5, 0x08, 0xd6, 0x1f, 0x18, 0x26, 0x6d, 0x46, 0xc0, 0x3e, 0xf5, 0xf1, 0x5d, 0xc8, 0x0e, + 0x0d, 0x93, 0x4a, 0xa9, 0xed, 0xcc, 0x4e, 0x69, 0xef, 0xc3, 0xda, 0x8c, 0x51, 0x2d, 0x69, 0xd1, + 0x63, 0x62, 0x85, 0x5b, 0x54, 0xff, 0x95, 0x85, 0x8d, 0x05, 0x5a, 0x8c, 0x21, 0x6b, 0x91, 0x31, + 0xf3, 0x98, 0xda, 0x29, 0x2a, 0xfc, 0x7f, 0x2c, 0xc1, 0x8a, 0x43, 0xb4, 0xa7, 0x64, 0x44, 0xa5, + 0x34, 0x17, 0x87, 0x43, 0xfc, 0x3e, 0x80, 0x4e, 0x1d, 0x6a, 0xe9, 0xd4, 0xd2, 0xce, 0xa4, 0xcc, + 0x76, 0x66, 0xa7, 0xa8, 0xc4, 0x24, 0xf8, 0x3a, 0xac, 0x3b, 0x93, 0x13, 0xd3, 0xd0, 0xd4, 0x18, + 0x0c, 0xb6, 0x33, 0x3b, 0x39, 0x05, 0x09, 0x45, 0x73, 0x0a, 0xbe, 0x0a, 0x6b, 0xcf, 0x29, 0x79, + 0x1a, 0x87, 0x96, 0x38, 0xb4, 0xc2, 0xc4, 0x31, 0x60, 0x03, 0xca, 0x63, 0xea, 0x79, 0x64, 0x44, + 0x55, 0xff, 0xcc, 0xa1, 0x52, 0x96, 0xcf, 0x7e, 0x7b, 0x6e, 0xf6, 0xb3, 0x33, 0x2f, 0x05, 0x56, + 0x83, 0x33, 0x87, 0xe2, 0x3a, 0x14, 0xa9, 0x35, 0x19, 0x0b, 0x0f, 0xb9, 0x25, 0xf9, 0x93, 0xad, + 0xc9, 0x78, 0xd6, 0x4b, 0x81, 0x99, 0x05, 0x2e, 0x56, 0x3c, 0xea, 0x3e, 0x33, 0x34, 0x2a, 0xe5, + 0xb9, 0x83, 0xab, 0x73, 0x0e, 0xfa, 0x42, 0x3f, 0xeb, 0x23, 0xb4, 0xc3, 0x0d, 0x28, 0xd2, 0x17, + 0x3e, 0xb5, 0x3c, 0xc3, 0xb6, 0xa4, 0x15, 0xee, 0xe4, 0xa3, 0x05, 0xab, 0x48, 0x4d, 0x7d, 0xd6, + 0xc5, 0xd4, 0x0e, 0xdf, 0x81, 0x15, 0xdb, 0xf1, 0x0d, 0xdb, 0xf2, 0xa4, 0xc2, 0x76, 0x6a, 0xa7, + 0xb4, 0xf7, 0xee, 0x42, 0x22, 0x74, 0x05, 0x46, 0x09, 0xc1, 0xb8, 0x05, 0xc8, 0xb3, 0x27, 0xae, + 0x46, 0x55, 0xcd, 0xd6, 0xa9, 0x6a, 0x58, 0x43, 0x5b, 0x2a, 0x72, 0x07, 0x97, 0xe7, 0x27, 0xc2, + 0x81, 0x0d, 0x5b, 0xa7, 0x2d, 0x6b, 0x68, 0x2b, 0x15, 0x2f, 0x31, 0xc6, 0x17, 0x20, 0xef, 0x9d, + 0x59, 0x3e, 0x79, 0x21, 0x95, 0x39, 0x43, 0x82, 0x51, 0xf5, 0xbf, 0x39, 0x58, 0x3b, 0x0f, 0xc5, + 0xee, 0x41, 0x6e, 0xc8, 0x66, 0x29, 0xa5, 0xff, 0x9f, 0x1c, 0x08, 0x9b, 0x64, 0x12, 0xf3, 0x3f, + 0x30, 0x89, 0x75, 0x28, 0x59, 0xd4, 0xf3, 0xa9, 0x2e, 0x18, 0x91, 0x39, 0x27, 0xa7, 0x40, 0x18, + 0xcd, 0x53, 0x2a, 0xfb, 0x83, 0x28, 0xf5, 0x08, 0xd6, 0xa2, 0x90, 0x54, 0x97, 0x58, 0xa3, 0x90, + 0x9b, 0xbb, 0xaf, 0x8b, 0xa4, 0x26, 0x87, 0x76, 0x0a, 0x33, 0x53, 0x2a, 0x34, 0x31, 0xc6, 0x4d, + 0x00, 0xdb, 0xa2, 0xf6, 0x50, 0xd5, 0xa9, 0x66, 0x4a, 0x85, 0x25, 0x59, 0xea, 0x32, 0xc8, 0x5c, + 0x96, 0x6c, 0x21, 0xd5, 0x4c, 0xfc, 0xf9, 0x94, 0x6a, 0x2b, 0x4b, 0x98, 0x72, 0x24, 0x36, 0xd9, + 0x1c, 0xdb, 0x8e, 0xa1, 0xe2, 0x52, 0xc6, 0x7b, 0xaa, 0x07, 0x33, 0x2b, 0xf2, 0x20, 0x6a, 0xaf, + 0x9d, 0x99, 0x12, 0x98, 0x89, 0x89, 0xad, 0xba, 0xf1, 0x21, 0xfe, 0x00, 0x22, 0x81, 0xca, 0x69, + 0x05, 0xfc, 0x14, 0x2a, 0x87, 0xc2, 0x0e, 0x19, 0xd3, 0xad, 0xbb, 0x50, 0x49, 0xa6, 0x07, 0x6f, + 0x42, 0xce, 0xf3, 0x89, 0xeb, 0x73, 0x16, 0xe6, 0x14, 0x31, 0xc0, 0x08, 0x32, 0xd4, 0xd2, 0xf9, + 0x29, 0x97, 0x53, 0xd8, 0xbf, 0x5b, 0x9f, 0xc1, 0x6a, 0xe2, 0xf3, 0xe7, 0x35, 0xac, 0xfe, 0x3e, + 0x0f, 0x9b, 0x8b, 0x38, 0xb7, 0x90, 0xfe, 0x17, 0x20, 0x6f, 0x4d, 0xc6, 0x27, 0xd4, 0x95, 0x32, + 0xdc, 0x43, 0x30, 0xc2, 0x75, 0xc8, 0x99, 0xe4, 0x84, 0x9a, 0x52, 0x76, 0x3b, 0xb5, 0x53, 0xd9, + 0xbb, 0x7e, 0x2e, 0x56, 0xd7, 0xda, 0xcc, 0x44, 0x11, 0x96, 0xf8, 0x3e, 0x64, 0x83, 0x23, 0x8e, + 0x79, 0xb8, 0x76, 0x3e, 0x0f, 0x8c, 0x8b, 0x0a, 0xb7, 0xc3, 0xef, 0x40, 0x91, 0xfd, 0x15, 0xb9, + 0xcd, 0xf3, 0x98, 0x0b, 0x4c, 0xc0, 0xf2, 0x8a, 0xb7, 0xa0, 0xc0, 0x69, 0xa6, 0xd3, 0xb0, 0x34, + 0x44, 0x63, 0xb6, 0x30, 0x3a, 0x1d, 0x92, 0x89, 0xe9, 0xab, 0xcf, 0x88, 0x39, 0xa1, 0x9c, 0x30, + 0x45, 0xa5, 0x1c, 0x08, 0x7f, 0xcd, 0x64, 0xf8, 0x32, 0x94, 0x04, 0x2b, 0x0d, 0x4b, 0xa7, 0x2f, + 0xf8, 0xe9, 0x93, 0x53, 0x04, 0x51, 0x5b, 0x4c, 0xc2, 0x3e, 0xff, 0xc4, 0xb3, 0xad, 0x70, 0x69, + 0xf9, 0x27, 0x98, 0x80, 0x7f, 0xfe, 0xb3, 0xd9, 0x83, 0xef, 0xbd, 0xc5, 0xd3, 0x9b, 0xe5, 0x62, + 0xf5, 0x2f, 0x69, 0xc8, 0xf2, 0xfd, 0xb6, 0x06, 0xa5, 0xc1, 0xe3, 0x9e, 0xac, 0x36, 0xbb, 0xc7, + 0x07, 0x6d, 0x19, 0xa5, 0x70, 0x05, 0x80, 0x0b, 0x1e, 0xb4, 0xbb, 0xf5, 0x01, 0x4a, 0x47, 0xe3, + 0x56, 0x67, 0x70, 0xe7, 0x16, 0xca, 0x44, 0x06, 0xc7, 0x42, 0x90, 0x8d, 0x03, 0x6e, 0xee, 0xa1, + 0x1c, 0x46, 0x50, 0x16, 0x0e, 0x5a, 0x8f, 0xe4, 0xe6, 0x9d, 0x5b, 0x28, 0x9f, 0x94, 0xdc, 0xdc, + 0x43, 0x2b, 0x78, 0x15, 0x8a, 0x5c, 0x72, 0xd0, 0xed, 0xb6, 0x51, 0x21, 0xf2, 0xd9, 0x1f, 0x28, + 0xad, 0xce, 0x21, 0x2a, 0x46, 0x3e, 0x0f, 0x95, 0xee, 0x71, 0x0f, 0x41, 0xe4, 0xe1, 0x48, 0xee, + 0xf7, 0xeb, 0x87, 0x32, 0x2a, 0x45, 0x88, 0x83, 0xc7, 0x03, 0xb9, 0x8f, 0xca, 0x89, 0xb0, 0x6e, + 0xee, 0xa1, 0xd5, 0xe8, 0x13, 0x72, 0xe7, 0xf8, 0x08, 0x55, 0xf0, 0x3a, 0xac, 0x8a, 0x4f, 0x84, + 0x41, 0xac, 0xcd, 0x88, 0xee, 0xdc, 0x42, 0x68, 0x1a, 0x88, 0xf0, 0xb2, 0x9e, 0x10, 0xdc, 0xb9, + 0x85, 0x70, 0xb5, 0x01, 0x39, 0xce, 0x2e, 0x8c, 0xa1, 0xd2, 0xae, 0x1f, 0xc8, 0x6d, 0xb5, 0xdb, + 0x1b, 0xb4, 0xba, 0x9d, 0x7a, 0x1b, 0xa5, 0xa6, 0x32, 0x45, 0xfe, 0xd5, 0x71, 0x4b, 0x91, 0x9b, + 0x28, 0x1d, 0x97, 0xf5, 0xe4, 0xfa, 0x40, 0x6e, 0xa2, 0x4c, 0x55, 0x83, 0xcd, 0x45, 0xe7, 0xcc, + 0xc2, 0x9d, 0x11, 0x5b, 0xe2, 0xf4, 0x92, 0x25, 0xe6, 0xbe, 0xe6, 0x96, 0xf8, 0xdb, 0x14, 0x6c, + 0x2c, 0x38, 0x6b, 0x17, 0x7e, 0xe4, 0x17, 0x90, 0x13, 0x14, 0x15, 0xd5, 0xe7, 0x93, 0x85, 0x87, + 0x36, 0x27, 0xec, 0x5c, 0x05, 0xe2, 0x76, 0xf1, 0x0a, 0x9c, 0x59, 0x52, 0x81, 0x99, 0x8b, 0xb9, + 0x20, 0x7f, 0x93, 0x02, 0x69, 0x99, 0xef, 0xd7, 0x1c, 0x14, 0xe9, 0xc4, 0x41, 0x71, 0x6f, 0x36, + 0x80, 0x2b, 0xcb, 0xe7, 0x30, 0x17, 0xc5, 0x77, 0x29, 0xb8, 0xb0, 0xb8, 0x51, 0x59, 0x18, 0xc3, + 0x7d, 0xc8, 0x8f, 0xa9, 0x7f, 0x6a, 0x87, 0xc5, 0xfa, 0xe3, 0x05, 0x25, 0x80, 0xa9, 0x67, 0x73, + 0x15, 0x58, 0xc5, 0x6b, 0x48, 0x66, 0x59, 0xb7, 0x21, 0xa2, 0x99, 0x8b, 0xf4, 0xb7, 0x69, 0x78, + 0x7b, 0xa1, 0xf3, 0x85, 0x81, 0xbe, 0x07, 0x60, 0x58, 0xce, 0xc4, 0x17, 0x05, 0x59, 0x9c, 0x4f, + 0x45, 0x2e, 0xe1, 0x7b, 0x9f, 0x9d, 0x3d, 0x13, 0x3f, 0xd2, 0x67, 0xb8, 0x1e, 0x84, 0x88, 0x03, + 0xee, 0x4e, 0x03, 0xcd, 0xf2, 0x40, 0xdf, 0x5f, 0x32, 0xd3, 0xb9, 0x5a, 0xf7, 0x29, 0x20, 0xcd, + 0x34, 0xa8, 0xe5, 0xab, 0x9e, 0xef, 0x52, 0x32, 0x36, 0xac, 0x11, 0x3f, 0x80, 0x0b, 0xfb, 0xb9, + 0x21, 0x31, 0x3d, 0xaa, 0xac, 0x09, 0x75, 0x3f, 0xd4, 0x32, 0x0b, 0x5e, 0x65, 0xdc, 0x98, 0x45, + 0x3e, 0x61, 0x21, 0xd4, 0x91, 0x45, 0xf5, 0xef, 0x2b, 0x50, 0x8a, 0xb5, 0x75, 0xf8, 0x0a, 0x94, + 0x9f, 0x90, 0x67, 0x44, 0x0d, 0x5b, 0x75, 0x91, 0x89, 0x12, 0x93, 0xf5, 0x82, 0x76, 0xfd, 0x53, + 0xd8, 0xe4, 0x10, 0x7b, 0xe2, 0x53, 0x57, 0xd5, 0x4c, 0xe2, 0x79, 0x3c, 0x69, 0x05, 0x0e, 0xc5, + 0x4c, 0xd7, 0x65, 0xaa, 0x46, 0xa8, 0xc1, 0xb7, 0x61, 0x83, 0x5b, 0x8c, 0x27, 0xa6, 0x6f, 0x38, + 0x26, 0x55, 0xd9, 0xe5, 0xc1, 0xe3, 0x07, 0x71, 0x14, 0xd9, 0x3a, 0x43, 0x1c, 0x05, 0x00, 0x16, + 0x91, 0x87, 0x9b, 0xf0, 0x1e, 0x37, 0x1b, 0x51, 0x8b, 0xba, 0xc4, 0xa7, 0x2a, 0xfd, 0x7a, 0x42, + 0x4c, 0x4f, 0x25, 0x96, 0xae, 0x9e, 0x12, 0xef, 0x54, 0xda, 0x64, 0x0e, 0x0e, 0xd2, 0x52, 0x4a, + 0xb9, 0xc4, 0x80, 0x87, 0x01, 0x4e, 0xe6, 0xb0, 0xba, 0xa5, 0x7f, 0x41, 0xbc, 0x53, 0xbc, 0x0f, + 0x17, 0xb8, 0x17, 0xcf, 0x77, 0x0d, 0x6b, 0xa4, 0x6a, 0xa7, 0x54, 0x7b, 0xaa, 0x4e, 0xfc, 0xe1, + 0x5d, 0xe9, 0x9d, 0xf8, 0xf7, 0x79, 0x84, 0x7d, 0x8e, 0x69, 0x30, 0xc8, 0xb1, 0x3f, 0xbc, 0x8b, + 0xfb, 0x50, 0x66, 0x8b, 0x31, 0x36, 0xbe, 0xa1, 0xea, 0xd0, 0x76, 0x79, 0x65, 0xa9, 0x2c, 0xd8, + 0xd9, 0xb1, 0x0c, 0xd6, 0xba, 0x81, 0xc1, 0x91, 0xad, 0xd3, 0xfd, 0x5c, 0xbf, 0x27, 0xcb, 0x4d, + 0xa5, 0x14, 0x7a, 0x79, 0x60, 0xbb, 0x8c, 0x50, 0x23, 0x3b, 0x4a, 0x70, 0x49, 0x10, 0x6a, 0x64, + 0x87, 0xe9, 0xbd, 0x0d, 0x1b, 0x9a, 0x26, 0xe6, 0x6c, 0x68, 0x6a, 0xd0, 0xe2, 0x7b, 0x12, 0x4a, + 0x24, 0x4b, 0xd3, 0x0e, 0x05, 0x20, 0xe0, 0xb8, 0x87, 0x3f, 0x87, 0xb7, 0xa7, 0xc9, 0x8a, 0x1b, + 0xae, 0xcf, 0xcd, 0x72, 0xd6, 0xf4, 0x36, 0x6c, 0x38, 0x67, 0xf3, 0x86, 0x38, 0xf1, 0x45, 0xe7, + 0x6c, 0xd6, 0xec, 0x23, 0x7e, 0x6d, 0x73, 0xa9, 0x46, 0x7c, 0xaa, 0x4b, 0x17, 0xe3, 0xe8, 0x98, + 0x02, 0xef, 0x02, 0xd2, 0x34, 0x95, 0x5a, 0xe4, 0xc4, 0xa4, 0x2a, 0x71, 0xa9, 0x45, 0x3c, 0xe9, + 0x72, 0x1c, 0x5c, 0xd1, 0x34, 0x99, 0x6b, 0xeb, 0x5c, 0x89, 0xaf, 0xc1, 0xba, 0x7d, 0xf2, 0x44, + 0x13, 0xcc, 0x52, 0x1d, 0x97, 0x0e, 0x8d, 0x17, 0xd2, 0x87, 0x3c, 0x4d, 0x6b, 0x4c, 0xc1, 0x79, + 0xd5, 0xe3, 0x62, 0xfc, 0x09, 0x20, 0xcd, 0x3b, 0x25, 0xae, 0xc3, 0x4b, 0xbb, 0xe7, 0x10, 0x8d, + 0x4a, 0x1f, 0x09, 0xa8, 0x90, 0x77, 0x42, 0x31, 0x63, 0xb6, 0xf7, 0xdc, 0x18, 0xfa, 0xa1, 0xc7, + 0xab, 0x82, 0xd9, 0x5c, 0x16, 0x78, 0xdb, 0x01, 0xe4, 0x9c, 0x3a, 0xc9, 0x0f, 0xef, 0x70, 0x58, + 0xc5, 0x39, 0x75, 0xe2, 0xdf, 0x7d, 0x04, 0x9b, 0x13, 0xcb, 0xb0, 0x7c, 0xea, 0x3a, 0x2e, 0x65, + 0xed, 0xbe, 0xd8, 0xb3, 0xd2, 0xbf, 0x57, 0x96, 0x34, 0xec, 0xc7, 0x71, 0xb4, 0xa0, 0x8a, 0xb2, + 0x31, 0x99, 0x17, 0x56, 0xf7, 0xa1, 0x1c, 0x67, 0x10, 0x2e, 0x82, 0xe0, 0x10, 0x4a, 0xb1, 0x6a, + 0xdc, 0xe8, 0x36, 0x59, 0x1d, 0xfd, 0x4a, 0x46, 0x69, 0x56, 0xcf, 0xdb, 0xad, 0x81, 0xac, 0x2a, + 0xc7, 0x9d, 0x41, 0xeb, 0x48, 0x46, 0x99, 0x6b, 0xc5, 0xc2, 0x7f, 0x56, 0xd0, 0xcb, 0x97, 0x2f, + 0x5f, 0xa6, 0x1f, 0x66, 0x0b, 0x1f, 0xa3, 0xab, 0xd5, 0xef, 0xd3, 0x50, 0x49, 0x76, 0xd2, 0xf8, + 0xe7, 0x70, 0x31, 0xbc, 0xf6, 0x7a, 0xd4, 0x57, 0x9f, 0x1b, 0x2e, 0xa7, 0xf6, 0x98, 0x88, 0x5e, + 0x34, 0x5a, 0x95, 0xcd, 0x00, 0xd5, 0xa7, 0xfe, 0x97, 0x86, 0xcb, 0x88, 0x3b, 0x26, 0x3e, 0x6e, + 0xc3, 0x65, 0xcb, 0x56, 0x3d, 0x9f, 0x58, 0x3a, 0x71, 0x75, 0x75, 0xfa, 0xe0, 0xa0, 0x12, 0x4d, + 0xa3, 0x9e, 0x67, 0x8b, 0x92, 0x12, 0x79, 0x79, 0xd7, 0xb2, 0xfb, 0x01, 0x78, 0x7a, 0xd6, 0xd6, + 0x03, 0xe8, 0x0c, 0x83, 0x32, 0xcb, 0x18, 0xf4, 0x0e, 0x14, 0xc7, 0xc4, 0x51, 0xa9, 0xe5, 0xbb, + 0x67, 0xbc, 0xff, 0x2b, 0x28, 0x85, 0x31, 0x71, 0x64, 0x36, 0x7e, 0x73, 0x2b, 0x91, 0xcc, 0x66, + 0x01, 0x15, 0x1f, 0x66, 0x0b, 0x45, 0x04, 0xd5, 0x7f, 0x66, 0xa0, 0x1c, 0xef, 0x07, 0x59, 0x7b, + 0xad, 0xf1, 0xb3, 0x3f, 0xc5, 0x4f, 0x87, 0x0f, 0x5e, 0xd9, 0x3d, 0xd6, 0x1a, 0xac, 0x28, 0xec, + 0xe7, 0x45, 0x97, 0xa6, 0x08, 0x4b, 0x56, 0x90, 0xd9, 0x79, 0x40, 0x45, 0xef, 0x5f, 0x50, 0x82, + 0x11, 0x3e, 0x84, 0xfc, 0x13, 0x8f, 0xfb, 0xce, 0x73, 0xdf, 0x1f, 0xbe, 0xda, 0xf7, 0xc3, 0x3e, + 0x77, 0x5e, 0x7c, 0xd8, 0x57, 0x3b, 0x5d, 0xe5, 0xa8, 0xde, 0x56, 0x02, 0x73, 0x7c, 0x09, 0xb2, + 0x26, 0xf9, 0xe6, 0x2c, 0x59, 0x3e, 0xb8, 0xe8, 0xbc, 0x8b, 0x70, 0x09, 0xb2, 0xcf, 0x29, 0x79, + 0x9a, 0x3c, 0xb4, 0xb9, 0xe8, 0x0d, 0x6e, 0x86, 0x5d, 0xc8, 0xf1, 0x7c, 0x61, 0x80, 0x20, 0x63, + 0xe8, 0x2d, 0x5c, 0x80, 0x6c, 0xa3, 0xab, 0xb0, 0x0d, 0x81, 0xa0, 0x2c, 0xa4, 0x6a, 0xaf, 0x25, + 0x37, 0x64, 0x94, 0xae, 0xde, 0x86, 0xbc, 0x48, 0x02, 0xdb, 0x2c, 0x51, 0x1a, 0xd0, 0x5b, 0xc1, + 0x30, 0xf0, 0x91, 0x0a, 0xb5, 0xc7, 0x47, 0x07, 0xb2, 0x82, 0xd2, 0xc9, 0xa5, 0xce, 0xa2, 0x5c, + 0xd5, 0x83, 0x72, 0xbc, 0x21, 0xfc, 0x51, 0x58, 0x56, 0xfd, 0x6b, 0x0a, 0x4a, 0xb1, 0x06, 0x8f, + 0xb5, 0x16, 0xc4, 0x34, 0xed, 0xe7, 0x2a, 0x31, 0x0d, 0xe2, 0x05, 0xd4, 0x00, 0x2e, 0xaa, 0x33, + 0xc9, 0x79, 0x97, 0xee, 0x47, 0xda, 0x22, 0x39, 0x94, 0xaf, 0xfe, 0x29, 0x05, 0x68, 0xb6, 0x45, + 0x9c, 0x09, 0x33, 0xf5, 0x53, 0x86, 0x59, 0xfd, 0x63, 0x0a, 0x2a, 0xc9, 0xbe, 0x70, 0x26, 0xbc, + 0x2b, 0x3f, 0x69, 0x78, 0xff, 0x48, 0xc3, 0x6a, 0xa2, 0x1b, 0x3c, 0x6f, 0x74, 0x5f, 0xc3, 0xba, + 0xa1, 0xd3, 0xb1, 0x63, 0xfb, 0xd4, 0xd2, 0xce, 0x54, 0x93, 0x3e, 0xa3, 0xa6, 0x54, 0xe5, 0x87, + 0xc6, 0xee, 0xab, 0xfb, 0xcd, 0x5a, 0x6b, 0x6a, 0xd7, 0x66, 0x66, 0xfb, 0x1b, 0xad, 0xa6, 0x7c, + 0xd4, 0xeb, 0x0e, 0xe4, 0x4e, 0xe3, 0xb1, 0x7a, 0xdc, 0xf9, 0x65, 0xa7, 0xfb, 0x65, 0x47, 0x41, + 0xc6, 0x0c, 0xec, 0x0d, 0x6e, 0xfb, 0x1e, 0xa0, 0xd9, 0xa0, 0xf0, 0x45, 0x58, 0x14, 0x16, 0x7a, + 0x0b, 0x6f, 0xc0, 0x5a, 0xa7, 0xab, 0xf6, 0x5b, 0x4d, 0x59, 0x95, 0x1f, 0x3c, 0x90, 0x1b, 0x83, + 0xbe, 0xb8, 0x80, 0x47, 0xe8, 0x41, 0x62, 0x83, 0x57, 0xff, 0x90, 0x81, 0x8d, 0x05, 0x91, 0xe0, + 0x7a, 0xd0, 0xfb, 0x8b, 0xeb, 0xc8, 0x8d, 0xf3, 0x44, 0x5f, 0x63, 0xdd, 0x45, 0x8f, 0xb8, 0x7e, + 0x70, 0x55, 0xf8, 0x04, 0x58, 0x96, 0x2c, 0xdf, 0x18, 0x1a, 0xd4, 0x0d, 0xde, 0x2b, 0xc4, 0x85, + 0x60, 0x6d, 0x2a, 0x17, 0x4f, 0x16, 0x3f, 0x03, 0xec, 0xd8, 0x9e, 0xe1, 0x1b, 0xcf, 0xa8, 0x6a, + 0x58, 0xe1, 0xe3, 0x06, 0xbb, 0x20, 0x64, 0x15, 0x14, 0x6a, 0x5a, 0x96, 0x1f, 0xa1, 0x2d, 0x3a, + 0x22, 0x33, 0x68, 0x76, 0x98, 0x67, 0x14, 0x14, 0x6a, 0x22, 0xf4, 0x15, 0x28, 0xeb, 0xf6, 0x84, + 0xb5, 0x5b, 0x02, 0xc7, 0x6a, 0x47, 0x4a, 0x29, 0x09, 0x59, 0x04, 0x09, 0xfa, 0xe1, 0xe9, 0xab, + 0x4a, 0x59, 0x29, 0x09, 0x99, 0x80, 0x5c, 0x85, 0x35, 0x32, 0x1a, 0xb9, 0xcc, 0x79, 0xe8, 0x48, + 0x74, 0xf8, 0x95, 0x48, 0xcc, 0x81, 0x5b, 0x0f, 0xa1, 0x10, 0xe6, 0x81, 0x95, 0x6a, 0x96, 0x09, + 0xd5, 0x11, 0x6f, 0x5b, 0xe9, 0x9d, 0xa2, 0x52, 0xb0, 0x42, 0xe5, 0x15, 0x28, 0x1b, 0x9e, 0x3a, + 0x7d, 0x64, 0x4d, 0x6f, 0xa7, 0x77, 0x0a, 0x4a, 0xc9, 0xf0, 0xa2, 0x57, 0xb5, 0xea, 0x77, 0x69, + 0xa8, 0x24, 0x1f, 0x89, 0x71, 0x13, 0x0a, 0xa6, 0xad, 0x11, 0x4e, 0x2d, 0xf1, 0x0b, 0xc5, 0xce, + 0x6b, 0xde, 0x95, 0x6b, 0xed, 0x00, 0xaf, 0x44, 0x96, 0x5b, 0x7f, 0x4b, 0x41, 0x21, 0x14, 0xe3, + 0x0b, 0x90, 0x75, 0x88, 0x7f, 0xca, 0xdd, 0xe5, 0x0e, 0xd2, 0x28, 0xa5, 0xf0, 0x31, 0x93, 0x7b, + 0x0e, 0xb1, 0x38, 0x05, 0x02, 0x39, 0x1b, 0xb3, 0x75, 0x35, 0x29, 0xd1, 0xf9, 0xf5, 0xc1, 0x1e, + 0x8f, 0xa9, 0xe5, 0x7b, 0xe1, 0xba, 0x06, 0xf2, 0x46, 0x20, 0xc6, 0xd7, 0x61, 0xdd, 0x77, 0x89, + 0x61, 0x26, 0xb0, 0x59, 0x8e, 0x45, 0xa1, 0x22, 0x02, 0xef, 0xc3, 0xa5, 0xd0, 0xaf, 0x4e, 0x7d, + 0xa2, 0x9d, 0x52, 0x7d, 0x6a, 0x94, 0xe7, 0x2f, 0x90, 0x17, 0x03, 0x40, 0x33, 0xd0, 0x87, 0xb6, + 0xd5, 0xef, 0x53, 0xb0, 0x1e, 0x5e, 0x78, 0xf4, 0x28, 0x59, 0x47, 0x00, 0xc4, 0xb2, 0x6c, 0x3f, + 0x9e, 0xae, 0x79, 0x2a, 0xcf, 0xd9, 0xd5, 0xea, 0x91, 0x91, 0x12, 0x73, 0xb0, 0x35, 0x06, 0x98, + 0x6a, 0x96, 0xa6, 0xed, 0x32, 0x94, 0x82, 0x5f, 0x00, 0xf8, 0xcf, 0x48, 0xe2, 0x8a, 0x0c, 0x42, + 0xc4, 0x6e, 0x46, 0x78, 0x13, 0x72, 0x27, 0x74, 0x64, 0x58, 0xc1, 0xbb, 0xa4, 0x18, 0x84, 0xaf, + 0x9d, 0xd9, 0xe8, 0xb5, 0xf3, 0xe0, 0x77, 0x29, 0xd8, 0xd0, 0xec, 0xf1, 0x6c, 0xbc, 0x07, 0x68, + 0xe6, 0x9e, 0xee, 0x7d, 0x91, 0xfa, 0xea, 0xfe, 0xc8, 0xf0, 0x4f, 0x27, 0x27, 0x35, 0xcd, 0x1e, + 0xef, 0x8e, 0x6c, 0x93, 0x58, 0xa3, 0xe9, 0xef, 0x60, 0xfc, 0x1f, 0xed, 0xc6, 0x88, 0x5a, 0x37, + 0x46, 0x76, 0xec, 0x57, 0xb1, 0x7b, 0xd3, 0x7f, 0xbf, 0x4d, 0x67, 0x0e, 0x7b, 0x07, 0x7f, 0x4e, + 0x6f, 0x1d, 0x8a, 0x6f, 0xf5, 0xc2, 0xdc, 0x28, 0x74, 0x68, 0x52, 0x8d, 0xcd, 0xf7, 0x7f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x8e, 0x54, 0xe7, 0xef, 0x60, 0x1b, 0x00, 0x00, +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 1386de4a35..1358947663 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -104,6 +104,18 @@ "revision": "54be5f394ed2c3e19dac9134a40a95ba5a017f7b", "revisionTime": "2017-07-10T16:04:46Z" }, + { + "checksumSHA1": "yqF125xVSkmfLpIVGrLlfE05IUk=", + "path": "github.com/golang/protobuf/proto", + "revision": "748d386b5c1ea99658fd69fe9f03991ce86a90c1", + "revisionTime": "2017-07-26T21:28:29Z" + }, + { + "checksumSHA1": "Z1gJ3PKzwBpOoPnTSEM5yd0zHYA=", + "path": "github.com/golang/protobuf/protoc-gen-go/descriptor", + "revision": "748d386b5c1ea99658fd69fe9f03991ce86a90c1", + "revisionTime": "2017-07-26T21:28:29Z" + }, { "checksumSHA1": "p/8vSviYF91gFflhrt5vkyksroo=", "path": "github.com/golang/snappy", From 5d9ac49c7e6027c60998a56287dbb3e407011c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 9 Aug 2017 12:51:16 +0300 Subject: [PATCH 071/272] accounts: refactor API for generalized USB wallets --- accounts/accounts.go | 5 +- accounts/hd_test.go | 20 +- accounts/keystore/keystore_wallet.go | 10 +- accounts/usbwallet/{ledger_hub.go => hub.go} | 102 ++- accounts/usbwallet/ledger.go | 464 ++++++++++ accounts/usbwallet/ledger_wallet.go | 898 ------------------- accounts/usbwallet/trezor.go | 330 +++++++ accounts/usbwallet/trezor_hub.go | 210 ----- accounts/usbwallet/trezor_wallet.go | 761 ---------------- accounts/usbwallet/usbwallet.go | 34 - accounts/usbwallet/wallet.go | 562 ++++++++++++ cmd/geth/main.go | 4 +- internal/ethapi/api.go | 15 +- 13 files changed, 1450 insertions(+), 1965 deletions(-) rename accounts/usbwallet/{ledger_hub.go => hub.go} (65%) create mode 100644 accounts/usbwallet/ledger.go delete mode 100644 accounts/usbwallet/ledger_wallet.go create mode 100644 accounts/usbwallet/trezor.go delete mode 100644 accounts/usbwallet/trezor_hub.go delete mode 100644 accounts/usbwallet/trezor_wallet.go delete mode 100644 accounts/usbwallet/usbwallet.go create mode 100644 accounts/usbwallet/wallet.go diff --git a/accounts/accounts.go b/accounts/accounts.go index 5872bb4a3d..76951e1a42 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -42,8 +42,9 @@ type Wallet interface { URL() URL // Status returns a textual status to aid the user in the current state of the - // wallet. - Status() string + // wallet. It also returns an error indicating any failure the wallet might have + // encountered. + Status() (string, error) // Open initializes access to a wallet instance. It is not meant to unlock or // decrypt account keys, rather simply to establish a connection to hardware diff --git a/accounts/hd_test.go b/accounts/hd_test.go index 83ec34adba..b6b23230dc 100644 --- a/accounts/hd_test.go +++ b/accounts/hd_test.go @@ -37,11 +37,11 @@ func TestHDPathParsing(t *testing.T) { {"m/2147483692/2147483708/2147483648/2147483648", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 0}}, // Plain relative derivation paths - {"0", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0}}, - {"128", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 128}}, - {"0'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 0}}, - {"128'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 128}}, - {"2147483648", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 0}}, + {"0", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0}}, + {"128", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 128}}, + {"0'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0x80000000 + 0}}, + {"128'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0x80000000 + 128}}, + {"2147483648", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0x80000000 + 0}}, // Hexadecimal absolute derivation paths {"m/0x2C'/0x3c'/0x00'/0x00", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0}}, @@ -52,11 +52,11 @@ func TestHDPathParsing(t *testing.T) { {"m/0x8000002C/0x8000003c/0x80000000/0x80000000", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 0}}, // Hexadecimal relative derivation paths - {"0x00", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0}}, - {"0x80", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 128}}, - {"0x00'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 0}}, - {"0x80'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 128}}, - {"0x80000000", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0x80000000 + 0}}, + {"0x00", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0}}, + {"0x80", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 128}}, + {"0x00'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0x80000000 + 0}}, + {"0x80'", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0x80000000 + 128}}, + {"0x80000000", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0x80000000 + 0}}, // Weird inputs just to ensure they work {" m / 44 '\n/\n 60 \n\n\t' /\n0 ' /\t\t 0", DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0}}, diff --git a/accounts/keystore/keystore_wallet.go b/accounts/keystore/keystore_wallet.go index 7165d28217..758fdfe364 100644 --- a/accounts/keystore/keystore_wallet.go +++ b/accounts/keystore/keystore_wallet.go @@ -36,16 +36,16 @@ func (w *keystoreWallet) URL() accounts.URL { return w.account.URL } -// Status implements accounts.Wallet, always returning "open", since there is no -// concept of open/close for plain keystore accounts. -func (w *keystoreWallet) Status() string { +// Status implements accounts.Wallet, returning whether the account held by the +// keystore wallet is unlocked or not. +func (w *keystoreWallet) Status() (string, error) { w.keystore.mu.RLock() defer w.keystore.mu.RUnlock() if _, ok := w.keystore.unlocked[w.account.Address]; ok { - return "Unlocked" + return "Unlocked", nil } - return "Locked" + return "Locked", nil } // Open implements accounts.Wallet, but is a noop for plain wallets since there diff --git a/accounts/usbwallet/ledger_hub.go b/accounts/usbwallet/hub.go similarity index 65% rename from accounts/usbwallet/ledger_hub.go rename to accounts/usbwallet/hub.go index ffe7cffe47..7069d25311 100644 --- a/accounts/usbwallet/ledger_hub.go +++ b/accounts/usbwallet/hub.go @@ -29,24 +29,28 @@ import ( ) // LedgerScheme is the protocol scheme prefixing account and wallet URLs. -var LedgerScheme = "ledger" +const LedgerScheme = "ledger" -// ledgerDeviceIDs are the known device IDs that Ledger wallets use. -var ledgerDeviceIDs = []deviceID{ - {Vendor: 0x2c97, Product: 0x0000}, // Ledger Blue - {Vendor: 0x2c97, Product: 0x0001}, // Ledger Nano S -} +// TrezorScheme is the protocol scheme prefixing account and wallet URLs. +const TrezorScheme = "trezor" -// Maximum time between wallet refreshes (if USB hotplug notifications don't work). -const ledgerRefreshCycle = time.Second +// refreshCycle is the maximum time between wallet refreshes (if USB hotplug +// notifications don't work). +const refreshCycle = time.Second -// Minimum time between wallet refreshes to avoid USB trashing. -const ledgerRefreshThrottling = 500 * time.Millisecond +// refreshThrottling is the minimum time between wallet refreshes to avoid USB +// trashing. +const refreshThrottling = 500 * time.Millisecond + +// Hub is a accounts.Backend that can find and handle generic USB hardware wallets. +type Hub struct { + scheme string // Protocol scheme prefixing account and wallet URLs. + vendorID uint16 // USB vendor identifier used for device discovery + productIDs []uint16 // USB product identifiers used for device discovery + makeDriver func(log.Logger) driver // Factory method to construct a vendor specific driver -// LedgerHub is a accounts.Backend that can find and handle Ledger hardware wallets. -type LedgerHub struct { refreshed time.Time // Time instance when the list of wallets was last refreshed - wallets []accounts.Wallet // List of Ledger devices currently tracking + wallets []accounts.Wallet // List of USB wallet devices currently tracking updateFeed event.Feed // Event feed to notify wallet additions/removals updateScope event.SubscriptionScope // Subscription scope tracking current live listeners updating bool // Whether the event notification loop is running @@ -61,20 +65,34 @@ type LedgerHub struct { } // NewLedgerHub creates a new hardware wallet manager for Ledger devices. -func NewLedgerHub() (*LedgerHub, error) { +func NewLedgerHub() (*Hub, error) { + return newHub(LedgerScheme, 0x2c97, []uint16{0x0000 /* Ledger Blue */, 0x0001 /* Ledger Nano S */}, newLedgerDriver) +} + +// NewTrezorHub creates a new hardware wallet manager for Trezor devices. +func NewTrezorHub() (*Hub, error) { + return newHub(TrezorScheme, 0x534c, []uint16{0x0001 /* Trezor 1 */}, newTrezorDriver) +} + +// newHub creates a new hardware wallet manager for generic USB devices. +func newHub(scheme string, vendorID uint16, productIDs []uint16, makeDriver func(log.Logger) driver) (*Hub, error) { if !hid.Supported() { return nil, errors.New("unsupported platform") } - hub := &LedgerHub{ - quit: make(chan chan error), + hub := &Hub{ + scheme: scheme, + vendorID: vendorID, + productIDs: productIDs, + makeDriver: makeDriver, + quit: make(chan chan error), } hub.refreshWallets() return hub, nil } // Wallets implements accounts.Backend, returning all the currently tracked USB -// devices that appear to be Ledger hardware wallets. -func (hub *LedgerHub) Wallets() []accounts.Wallet { +// devices that appear to be hardware wallets. +func (hub *Hub) Wallets() []accounts.Wallet { // Make sure the list of wallets is up to date hub.refreshWallets() @@ -88,17 +106,17 @@ func (hub *LedgerHub) Wallets() []accounts.Wallet { // refreshWallets scans the USB devices attached to the machine and updates the // list of wallets based on the found devices. -func (hub *LedgerHub) refreshWallets() { +func (hub *Hub) refreshWallets() { // Don't scan the USB like crazy it the user fetches wallets in a loop hub.stateLock.RLock() elapsed := time.Since(hub.refreshed) hub.stateLock.RUnlock() - if elapsed < ledgerRefreshThrottling { + if elapsed < refreshThrottling { return } - // Retrieve the current list of Ledger devices - var ledgers []hid.DeviceInfo + // Retrieve the current list of USB wallet devices + var devices []hid.DeviceInfo if runtime.GOOS == "linux" { // hidapi on Linux opens the device during enumeration to retrieve some infos, @@ -113,10 +131,10 @@ func (hub *LedgerHub) refreshWallets() { return } } - for _, info := range hid.Enumerate(0, 0) { // Can't enumerate directly, one valid ID is the 0 wildcard - for _, id := range ledgerDeviceIDs { - if info.VendorID == id.Vendor && info.ProductID == id.Product { - ledgers = append(ledgers, info) + for _, info := range hid.Enumerate(hub.vendorID, 0) { + for _, id := range hub.productIDs { + if info.ProductID == id && info.Interface == 0 { + devices = append(devices, info) break } } @@ -128,20 +146,27 @@ func (hub *LedgerHub) refreshWallets() { // Transform the current list of wallets into the new one hub.stateLock.Lock() - wallets := make([]accounts.Wallet, 0, len(ledgers)) + wallets := make([]accounts.Wallet, 0, len(devices)) events := []accounts.WalletEvent{} - for _, ledger := range ledgers { - url := accounts.URL{Scheme: LedgerScheme, Path: ledger.Path} + for _, device := range devices { + url := accounts.URL{Scheme: hub.scheme, Path: device.Path} // Drop wallets in front of the next device or those that failed for some reason - for len(hub.wallets) > 0 && (hub.wallets[0].URL().Cmp(url) < 0 || hub.wallets[0].(*ledgerWallet).failed()) { + for len(hub.wallets) > 0 { + // Abort if we're past the current device and found an operational one + _, failure := hub.wallets[0].Status() + if hub.wallets[0].URL().Cmp(url) >= 0 || failure == nil { + break + } + // Drop the stale and failed devices events = append(events, accounts.WalletEvent{Wallet: hub.wallets[0], Kind: accounts.WalletDropped}) hub.wallets = hub.wallets[1:] } // If there are no more wallets or the device is before the next, wrap new wallet if len(hub.wallets) == 0 || hub.wallets[0].URL().Cmp(url) > 0 { - wallet := &ledgerWallet{hub: hub, url: &url, info: ledger, log: log.New("url", url)} + logger := log.New("url", url) + wallet := &wallet{hub: hub, driver: hub.makeDriver(logger), url: &url, info: device, log: logger} events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) wallets = append(wallets, wallet) @@ -169,8 +194,8 @@ func (hub *LedgerHub) refreshWallets() { } // Subscribe implements accounts.Backend, creating an async subscription to -// receive notifications on the addition or removal of Ledger wallets. -func (hub *LedgerHub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { +// receive notifications on the addition or removal of USB wallets. +func (hub *Hub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { // We need the mutex to reliably start/stop the update loop hub.stateLock.Lock() defer hub.stateLock.Unlock() @@ -186,16 +211,13 @@ func (hub *LedgerHub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscrip return sub } -// updater is responsible for maintaining an up-to-date list of wallets stored in -// the keystore, and for firing wallet addition/removal events. It listens for -// account change events from the underlying account cache, and also periodically -// forces a manual refresh (only triggers for systems where the filesystem notifier -// is not running). -func (hub *LedgerHub) updater() { +// updater is responsible for maintaining an up-to-date list of wallets managed +// by the USB hub, and for firing wallet addition/removal events. +func (hub *Hub) updater() { for { // TODO: Wait for a USB hotplug event (not supported yet) or a refresh timeout // <-hub.changes - time.Sleep(ledgerRefreshCycle) + time.Sleep(refreshCycle) // Run the wallet refresher hub.refreshWallets() diff --git a/accounts/usbwallet/ledger.go b/accounts/usbwallet/ledger.go new file mode 100644 index 0000000000..f5def61d23 --- /dev/null +++ b/accounts/usbwallet/ledger.go @@ -0,0 +1,464 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// This file contains the implementation for interacting with the Ledger hardware +// wallets. The wire protocol spec can be found in the Ledger Blue GitHub repo: +// https://raw.githubusercontent.com/LedgerHQ/blue-app-eth/master/doc/ethapp.asc + +package usbwallet + +import ( + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "io" + "math/big" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" +) + +// ledgerOpcode is an enumeration encoding the supported Ledger opcodes. +type ledgerOpcode byte + +// ledgerParam1 is an enumeration encoding the supported Ledger parameters for +// specific opcodes. The same parameter values may be reused between opcodes. +type ledgerParam1 byte + +// ledgerParam2 is an enumeration encoding the supported Ledger parameters for +// specific opcodes. The same parameter values may be reused between opcodes. +type ledgerParam2 byte + +const ( + ledgerOpRetrieveAddress ledgerOpcode = 0x02 // Returns the public key and Ethereum address for a given BIP 32 path + ledgerOpSignTransaction ledgerOpcode = 0x04 // Signs an Ethereum transaction after having the user validate the parameters + ledgerOpGetConfiguration ledgerOpcode = 0x06 // Returns specific wallet application configuration + + ledgerP1DirectlyFetchAddress ledgerParam1 = 0x00 // Return address directly from the wallet + ledgerP1ConfirmFetchAddress ledgerParam1 = 0x01 // Require a user confirmation before returning the address + ledgerP1InitTransactionData ledgerParam1 = 0x00 // First transaction data block for signing + ledgerP1ContTransactionData ledgerParam1 = 0x80 // Subsequent transaction data block for signing + ledgerP2DiscardAddressChainCode ledgerParam2 = 0x00 // Do not return the chain code along with the address + ledgerP2ReturnAddressChainCode ledgerParam2 = 0x01 // Require a user confirmation before returning the address +) + +// errLedgerReplyInvalidHeader is the error message returned by a Ledger data exchange +// if the device replies with a mismatching header. This usually means the device +// is in browser mode. +var errLedgerReplyInvalidHeader = errors.New("ledger: invalid reply header") + +// errLedgerInvalidVersionReply is the error message returned by a Ledger version retrieval +// when a response does arrive, but it does not contain the expected data. +var errLedgerInvalidVersionReply = errors.New("ledger: invalid version reply") + +// ledgerDriver implements the communication with a Ledger hardware wallet. +type ledgerDriver struct { + device io.ReadWriter // USB device connection to communicate through + version [3]byte // Current version of the Ledger firmware (zero if app is offline) + browser bool // Flag whether the Ledger is in browser mode (reply channel mismatch) + failure error // Any failure that would make the device unusable + log log.Logger // Contextual logger to tag the ledger with its id +} + +// newLedgerDriver creates a new instance of a Ledger USB protocol driver. +func newLedgerDriver(logger log.Logger) driver { + return &ledgerDriver{ + log: logger, + } +} + +// Status implements usbwallet.driver, returning various states the Ledger can +// currently be in. +func (w *ledgerDriver) Status() (string, error) { + if w.failure != nil { + return fmt.Sprintf("Failed: %v", w.failure), w.failure + } + if w.browser { + return "Ethereum app in browser mode", w.failure + } + if w.offline() { + return "Ethereum app offline", w.failure + } + return fmt.Sprintf("Ethereum app v%d.%d.%d online", w.version[0], w.version[1], w.version[2]), w.failure +} + +// offline returns whether the wallet and the Ethereum app is offline or not. +// +// The method assumes that the state lock is held! +func (w *ledgerDriver) offline() bool { + return w.version == [3]byte{0, 0, 0} +} + +// Open implements usbwallet.driver, attempting to initialize the connection to the +// Ledger hardware wallet. The Ledger does not require a user passphrase, so that +// parameter is silently discarded. +func (w *ledgerDriver) Open(device io.ReadWriter, passphrase string) error { + w.device, w.failure = device, nil + + _, err := w.ledgerDerive(accounts.DefaultBaseDerivationPath) + if err != nil { + // Ethereum app is not running or in browser mode, nothing more to do, return + if err == errLedgerReplyInvalidHeader { + w.browser = true + } + return nil + } + // Try to resolve the Ethereum app's version, will fail prior to v1.0.2 + if w.version, err = w.ledgerVersion(); err != nil { + w.version = [3]byte{1, 0, 0} // Assume worst case, can't verify if v1.0.0 or v1.0.1 + } + return nil +} + +// Close implements usbwallet.driver, cleaning up and metadata maintained within +// the Ledger driver. +func (w *ledgerDriver) Close() error { + w.browser, w.version = false, [3]byte{} + return nil +} + +// Heartbeat implements usbwallet.driver, performing a sanity check against the +// Ledger to see if it's still online. +func (w *ledgerDriver) Heartbeat() error { + if _, err := w.ledgerVersion(); err != nil && err != errLedgerInvalidVersionReply { + w.failure = err + return err + } + return nil +} + +// Derive implements usbwallet.driver, sending a derivation request to the Ledger +// and returning the Ethereum address located on that derivation path. +func (w *ledgerDriver) Derive(path accounts.DerivationPath) (common.Address, error) { + return w.ledgerDerive(path) +} + +// SignTx implements usbwallet.driver, sending the transaction to the Ledger and +// waiting for the user to confirm or deny the transaction. +// +// Note, if the version of the Ethereum application running on the Ledger wallet is +// too old to sign EIP-155 transactions, but such is requested nonetheless, an error +// will be returned opposed to silently signing in Homestead mode. +func (w *ledgerDriver) SignTx(path accounts.DerivationPath, tx *types.Transaction, chainID *big.Int) (common.Address, *types.Transaction, error) { + // If the Ethereum app doesn't run, abort + if w.offline() { + return common.Address{}, nil, accounts.ErrWalletClosed + } + // Ensure the wallet is capable of signing the given transaction + if chainID != nil && w.version[0] <= 1 && w.version[1] <= 0 && w.version[2] <= 2 { + return common.Address{}, nil, fmt.Errorf("Ledger v%d.%d.%d doesn't support signing this transaction, please update to v1.0.3 at least", w.version[0], w.version[1], w.version[2]) + } + // All infos gathered and metadata checks out, request signing + return w.ledgerSign(path, tx, chainID) +} + +// ledgerVersion retrieves the current version of the Ethereum wallet app running +// on the Ledger wallet. +// +// The version retrieval protocol is defined as follows: +// +// CLA | INS | P1 | P2 | Lc | Le +// ----+-----+----+----+----+--- +// E0 | 06 | 00 | 00 | 00 | 04 +// +// With no input data, and the output data being: +// +// Description | Length +// ---------------------------------------------------+-------- +// Flags 01: arbitrary data signature enabled by user | 1 byte +// Application major version | 1 byte +// Application minor version | 1 byte +// Application patch version | 1 byte +func (w *ledgerDriver) ledgerVersion() ([3]byte, error) { + // Send the request and wait for the response + reply, err := w.ledgerExchange(ledgerOpGetConfiguration, 0, 0, nil) + if err != nil { + return [3]byte{}, err + } + if len(reply) != 4 { + return [3]byte{}, errLedgerInvalidVersionReply + } + // Cache the version for future reference + var version [3]byte + copy(version[:], reply[1:]) + return version, nil +} + +// ledgerDerive retrieves the currently active Ethereum address from a Ledger +// wallet at the specified derivation path. +// +// The address derivation protocol is defined as follows: +// +// CLA | INS | P1 | P2 | Lc | Le +// ----+-----+----+----+-----+--- +// E0 | 02 | 00 return address +// 01 display address and confirm before returning +// | 00: do not return the chain code +// | 01: return the chain code +// | var | 00 +// +// Where the input data is: +// +// Description | Length +// -------------------------------------------------+-------- +// Number of BIP 32 derivations to perform (max 10) | 1 byte +// First derivation index (big endian) | 4 bytes +// ... | 4 bytes +// Last derivation index (big endian) | 4 bytes +// +// And the output data is: +// +// Description | Length +// ------------------------+------------------- +// Public Key length | 1 byte +// Uncompressed Public Key | arbitrary +// Ethereum address length | 1 byte +// Ethereum address | 40 bytes hex ascii +// Chain code if requested | 32 bytes +func (w *ledgerDriver) ledgerDerive(derivationPath []uint32) (common.Address, error) { + // Flatten the derivation path into the Ledger request + path := make([]byte, 1+4*len(derivationPath)) + path[0] = byte(len(derivationPath)) + for i, component := range derivationPath { + binary.BigEndian.PutUint32(path[1+4*i:], component) + } + // Send the request and wait for the response + reply, err := w.ledgerExchange(ledgerOpRetrieveAddress, ledgerP1DirectlyFetchAddress, ledgerP2DiscardAddressChainCode, path) + if err != nil { + return common.Address{}, err + } + // Discard the public key, we don't need that for now + if len(reply) < 1 || len(reply) < 1+int(reply[0]) { + return common.Address{}, errors.New("reply lacks public key entry") + } + reply = reply[1+int(reply[0]):] + + // Extract the Ethereum hex address string + if len(reply) < 1 || len(reply) < 1+int(reply[0]) { + return common.Address{}, errors.New("reply lacks address entry") + } + hexstr := reply[1 : 1+int(reply[0])] + + // Decode the hex sting into an Ethereum address and return + var address common.Address + hex.Decode(address[:], hexstr) + return address, nil +} + +// ledgerSign sends the transaction to the Ledger wallet, and waits for the user +// to confirm or deny the transaction. +// +// The transaction signing protocol is defined as follows: +// +// CLA | INS | P1 | P2 | Lc | Le +// ----+-----+----+----+-----+--- +// E0 | 04 | 00: first transaction data block +// 80: subsequent transaction data block +// | 00 | variable | variable +// +// Where the input for the first transaction block (first 255 bytes) is: +// +// Description | Length +// -------------------------------------------------+---------- +// Number of BIP 32 derivations to perform (max 10) | 1 byte +// First derivation index (big endian) | 4 bytes +// ... | 4 bytes +// Last derivation index (big endian) | 4 bytes +// RLP transaction chunk | arbitrary +// +// And the input for subsequent transaction blocks (first 255 bytes) are: +// +// Description | Length +// ----------------------+---------- +// RLP transaction chunk | arbitrary +// +// And the output data is: +// +// Description | Length +// ------------+--------- +// signature V | 1 byte +// signature R | 32 bytes +// signature S | 32 bytes +func (w *ledgerDriver) ledgerSign(derivationPath []uint32, tx *types.Transaction, chainID *big.Int) (common.Address, *types.Transaction, error) { + // Flatten the derivation path into the Ledger request + path := make([]byte, 1+4*len(derivationPath)) + path[0] = byte(len(derivationPath)) + for i, component := range derivationPath { + binary.BigEndian.PutUint32(path[1+4*i:], component) + } + // Create the transaction RLP based on whether legacy or EIP155 signing was requeste + var ( + txrlp []byte + err error + ) + if chainID == nil { + if txrlp, err = rlp.EncodeToBytes([]interface{}{tx.Nonce(), tx.GasPrice(), tx.Gas(), tx.To(), tx.Value(), tx.Data()}); err != nil { + return common.Address{}, nil, err + } + } else { + if txrlp, err = rlp.EncodeToBytes([]interface{}{tx.Nonce(), tx.GasPrice(), tx.Gas(), tx.To(), tx.Value(), tx.Data(), chainID, big.NewInt(0), big.NewInt(0)}); err != nil { + return common.Address{}, nil, err + } + } + payload := append(path, txrlp...) + + // Send the request and wait for the response + var ( + op = ledgerP1InitTransactionData + reply []byte + ) + for len(payload) > 0 { + // Calculate the size of the next data chunk + chunk := 255 + if chunk > len(payload) { + chunk = len(payload) + } + // Send the chunk over, ensuring it's processed correctly + reply, err = w.ledgerExchange(ledgerOpSignTransaction, op, 0, payload[:chunk]) + if err != nil { + return common.Address{}, nil, err + } + // Shift the payload and ensure subsequent chunks are marked as such + payload = payload[chunk:] + op = ledgerP1ContTransactionData + } + // Extract the Ethereum signature and do a sanity validation + if len(reply) != 65 { + return common.Address{}, nil, errors.New("reply lacks signature") + } + signature := append(reply[1:], reply[0]) + + // Create the correct signer and signature transform based on the chain ID + var signer types.Signer + if chainID == nil { + signer = new(types.HomesteadSigner) + } else { + signer = types.NewEIP155Signer(chainID) + signature[64] = signature[64] - byte(chainID.Uint64()*2+35) + } + signed, err := tx.WithSignature(signer, signature) + if err != nil { + return common.Address{}, nil, err + } + sender, err := types.Sender(signer, signed) + if err != nil { + return common.Address{}, nil, err + } + return sender, signed, nil +} + +// ledgerExchange performs a data exchange with the Ledger wallet, sending it a +// message and retrieving the response. +// +// The common transport header is defined as follows: +// +// Description | Length +// --------------------------------------+---------- +// Communication channel ID (big endian) | 2 bytes +// Command tag | 1 byte +// Packet sequence index (big endian) | 2 bytes +// Payload | arbitrary +// +// The Communication channel ID allows commands multiplexing over the same +// physical link. It is not used for the time being, and should be set to 0101 +// to avoid compatibility issues with implementations ignoring a leading 00 byte. +// +// The Command tag describes the message content. Use TAG_APDU (0x05) for standard +// APDU payloads, or TAG_PING (0x02) for a simple link test. +// +// The Packet sequence index describes the current sequence for fragmented payloads. +// The first fragment index is 0x00. +// +// APDU Command payloads are encoded as follows: +// +// Description | Length +// ----------------------------------- +// APDU length (big endian) | 2 bytes +// APDU CLA | 1 byte +// APDU INS | 1 byte +// APDU P1 | 1 byte +// APDU P2 | 1 byte +// APDU length | 1 byte +// Optional APDU data | arbitrary +func (w *ledgerDriver) ledgerExchange(opcode ledgerOpcode, p1 ledgerParam1, p2 ledgerParam2, data []byte) ([]byte, error) { + // Construct the message payload, possibly split into multiple chunks + apdu := make([]byte, 2, 7+len(data)) + + binary.BigEndian.PutUint16(apdu, uint16(5+len(data))) + apdu = append(apdu, []byte{0xe0, byte(opcode), byte(p1), byte(p2), byte(len(data))}...) + apdu = append(apdu, data...) + + // Stream all the chunks to the device + header := []byte{0x01, 0x01, 0x05, 0x00, 0x00} // Channel ID and command tag appended + chunk := make([]byte, 64) + space := len(chunk) - len(header) + + for i := 0; len(apdu) > 0; i++ { + // Construct the new message to stream + chunk = append(chunk[:0], header...) + binary.BigEndian.PutUint16(chunk[3:], uint16(i)) + + if len(apdu) > space { + chunk = append(chunk, apdu[:space]...) + apdu = apdu[space:] + } else { + chunk = append(chunk, apdu...) + apdu = nil + } + // Send over to the device + w.log.Trace("Data chunk sent to the Ledger", "chunk", hexutil.Bytes(chunk)) + if _, err := w.device.Write(chunk); err != nil { + return nil, err + } + } + // Stream the reply back from the wallet in 64 byte chunks + var reply []byte + chunk = chunk[:64] // Yeah, we surely have enough space + for { + // Read the next chunk from the Ledger wallet + if _, err := io.ReadFull(w.device, chunk); err != nil { + return nil, err + } + w.log.Trace("Data chunk received from the Ledger", "chunk", hexutil.Bytes(chunk)) + + // Make sure the transport header matches + if chunk[0] != 0x01 || chunk[1] != 0x01 || chunk[2] != 0x05 { + return nil, errLedgerReplyInvalidHeader + } + // If it's the first chunk, retrieve the total message length + var payload []byte + + if chunk[3] == 0x00 && chunk[4] == 0x00 { + reply = make([]byte, 0, int(binary.BigEndian.Uint16(chunk[5:7]))) + payload = chunk[7:] + } else { + payload = chunk[5:] + } + // Append to the reply and stop when filled up + if left := cap(reply) - len(reply); left > len(payload) { + reply = append(reply, payload...) + } else { + reply = append(reply, payload[:left]...) + break + } + } + return reply[:len(reply)-2], nil +} diff --git a/accounts/usbwallet/ledger_wallet.go b/accounts/usbwallet/ledger_wallet.go deleted file mode 100644 index b8f04d74c0..0000000000 --- a/accounts/usbwallet/ledger_wallet.go +++ /dev/null @@ -1,898 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// This file contains the implementation for interacting with the Ledger hardware -// wallets. The wire protocol spec can be found in the Ledger Blue GitHub repo: -// https://raw.githubusercontent.com/LedgerHQ/blue-app-eth/master/doc/ethapp.asc - -package usbwallet - -import ( - "context" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "math/big" - "sync" - "time" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rlp" - "github.com/karalabe/hid" -) - -// ledgerOpcode is an enumeration encoding the supported Ledger opcodes. -type ledgerOpcode byte - -// ledgerParam1 is an enumeration encoding the supported Ledger parameters for -// specific opcodes. The same parameter values may be reused between opcodes. -type ledgerParam1 byte - -// ledgerParam2 is an enumeration encoding the supported Ledger parameters for -// specific opcodes. The same parameter values may be reused between opcodes. -type ledgerParam2 byte - -const ( - ledgerOpRetrieveAddress ledgerOpcode = 0x02 // Returns the public key and Ethereum address for a given BIP 32 path - ledgerOpSignTransaction ledgerOpcode = 0x04 // Signs an Ethereum transaction after having the user validate the parameters - ledgerOpGetConfiguration ledgerOpcode = 0x06 // Returns specific wallet application configuration - - ledgerP1DirectlyFetchAddress ledgerParam1 = 0x00 // Return address directly from the wallet - ledgerP1ConfirmFetchAddress ledgerParam1 = 0x01 // Require a user confirmation before returning the address - ledgerP1InitTransactionData ledgerParam1 = 0x00 // First transaction data block for signing - ledgerP1ContTransactionData ledgerParam1 = 0x80 // Subsequent transaction data block for signing - ledgerP2DiscardAddressChainCode ledgerParam2 = 0x00 // Do not return the chain code along with the address - ledgerP2ReturnAddressChainCode ledgerParam2 = 0x01 // Require a user confirmation before returning the address -) - -// errReplyInvalidHeader is the error message returned by a Ledger data exchange -// if the device replies with a mismatching header. This usually means the device -// is in browser mode. -var errReplyInvalidHeader = errors.New("invalid reply header") - -// errInvalidVersionReply is the error message returned by a Ledger version retrieval -// when a response does arrive, but it does not contain the expected data. -var errInvalidVersionReply = errors.New("invalid version reply") - -// ledgerWallet represents a live USB Ledger hardware wallet. -type ledgerWallet struct { - hub *LedgerHub // USB hub the device originates from (TODO(karalabe): remove if hotplug lands on Windows) - url *accounts.URL // Textual URL uniquely identifying this wallet - - info hid.DeviceInfo // Known USB device infos about the wallet - device *hid.Device // USB device advertising itself as a Ledger wallet - failure error // Any failure that would make the device unusable - - version [3]byte // Current version of the Ledger Ethereum app (zero if app is offline) - browser bool // Flag whether the Ledger is in browser mode (reply channel mismatch) - accounts []accounts.Account // List of derive accounts pinned on the Ledger - paths map[common.Address]accounts.DerivationPath // Known derivation paths for signing operations - - deriveNextPath accounts.DerivationPath // Next derivation path for account auto-discovery - deriveNextAddr common.Address // Next derived account address for auto-discovery - deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with - deriveReq chan chan struct{} // Channel to request a self-derivation on - deriveQuit chan chan error // Channel to terminate the self-deriver with - - healthQuit chan chan error - - // Locking a hardware wallet is a bit special. Since hardware devices are lower - // performing, any communication with them might take a non negligible amount of - // time. Worse still, waiting for user confirmation can take arbitrarily long, - // but exclusive communication must be upheld during. Locking the entire wallet - // in the mean time however would stall any parts of the system that don't want - // to communicate, just read some state (e.g. list the accounts). - // - // As such, a hardware wallet needs two locks to function correctly. A state - // lock can be used to protect the wallet's software-side internal state, which - // must not be held exlusively during hardware communication. A communication - // lock can be used to achieve exclusive access to the device itself, this one - // however should allow "skipping" waiting for operations that might want to - // use the device, but can live without too (e.g. account self-derivation). - // - // Since we have two locks, it's important to know how to properly use them: - // - Communication requires the `device` to not change, so obtaining the - // commsLock should be done after having a stateLock. - // - Communication must not disable read access to the wallet state, so it - // must only ever hold a *read* lock to stateLock. - commsLock chan struct{} // Mutex (buf=1) for the USB comms without keeping the state locked - stateLock sync.RWMutex // Protects read and write access to the wallet struct fields - - log log.Logger // Contextual logger to tag the ledger with its id -} - -// URL implements accounts.Wallet, returning the URL of the Ledger device. -func (w *ledgerWallet) URL() accounts.URL { - return *w.url // Immutable, no need for a lock -} - -// Status implements accounts.Wallet, always whether the Ledger is opened, closed -// or whether the Ethereum app was not started on it. -func (w *ledgerWallet) Status() string { - w.stateLock.RLock() // No device communication, state lock is enough - defer w.stateLock.RUnlock() - - if w.failure != nil { - return fmt.Sprintf("Failed: %v", w.failure) - } - if w.device == nil { - return "Closed" - } - if w.browser { - return "Ethereum app in browser mode" - } - if w.offline() { - return "Ethereum app offline" - } - return fmt.Sprintf("Ethereum app v%d.%d.%d online", w.version[0], w.version[1], w.version[2]) -} - -// offline returns whether the wallet and the Ethereum app is offline or not. -// -// The method assumes that the state lock is held! -func (w *ledgerWallet) offline() bool { - return w.version == [3]byte{0, 0, 0} -} - -// failed returns if the USB device wrapped by the wallet failed for some reason. -// This is used by the device scanner to report failed wallets as departed. -// -// The method assumes that the state lock is *not* held! -func (w *ledgerWallet) failed() bool { - w.stateLock.RLock() // No device communication, state lock is enough - defer w.stateLock.RUnlock() - - return w.failure != nil -} - -// Open implements accounts.Wallet, attempting to open a USB connection to the -// Ledger hardware wallet. The Ledger does not require a user passphrase, so that -// parameter is silently discarded. -func (w *ledgerWallet) Open(passphrase string) error { - w.stateLock.Lock() // State lock is enough since there's no connection yet at this point - defer w.stateLock.Unlock() - - // If the wallet was already opened, don't try to open again - if w.device != nil { - return accounts.ErrWalletAlreadyOpen - } - // Otherwise iterate over all USB devices and find this again (no way to directly do this) - device, err := w.info.Open() - if err != nil { - return err - } - // Wallet seems to be successfully opened, guess if the Ethereum app is running - w.device = device - w.commsLock = make(chan struct{}, 1) - w.commsLock <- struct{}{} // Enable lock - - w.paths = make(map[common.Address]accounts.DerivationPath) - - w.deriveReq = make(chan chan struct{}) - w.deriveQuit = make(chan chan error) - w.healthQuit = make(chan chan error) - - defer func() { - go w.heartbeat() - go w.selfDerive() - }() - - if _, err = w.ledgerDerive(accounts.DefaultBaseDerivationPath); err != nil { - // Ethereum app is not running or in browser mode, nothing more to do, return - if err == errReplyInvalidHeader { - w.browser = true - } - return nil - } - // Try to resolve the Ethereum app's version, will fail prior to v1.0.2 - if w.version, err = w.ledgerVersion(); err != nil { - w.version = [3]byte{1, 0, 0} // Assume worst case, can't verify if v1.0.0 or v1.0.1 - } - go w.hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened}) - - return nil -} - -// heartbeat is a health check loop for the Ledger wallets to periodically verify -// whether they are still present or if they malfunctioned. It is needed because: -// - libusb on Windows doesn't support hotplug, so we can't detect USB unplugs -// - communication timeout on the Ledger requires a device power cycle to fix -func (w *ledgerWallet) heartbeat() { - w.log.Debug("Ledger health-check started") - defer w.log.Debug("Ledger health-check stopped") - - // Execute heartbeat checks until termination or error - var ( - errc chan error - err error - ) - for errc == nil && err == nil { - // Wait until termination is requested or the heartbeat cycle arrives - select { - case errc = <-w.healthQuit: - // Termination requested - continue - case <-time.After(heartbeatCycle): - // Heartbeat time - } - // Execute a tiny data exchange to see responsiveness - w.stateLock.RLock() - if w.device == nil { - // Terminated while waiting for the lock - w.stateLock.RUnlock() - continue - } - <-w.commsLock // Don't lock state while resolving version - _, err = w.ledgerVersion() - w.commsLock <- struct{}{} - w.stateLock.RUnlock() - - if err != nil && err != errInvalidVersionReply { - w.stateLock.Lock() // Lock state to tear the wallet down - w.failure = err - w.close() - w.stateLock.Unlock() - } - // Ignore non hardware related errors - err = nil - } - // In case of error, wait for termination - if err != nil { - w.log.Debug("Ledger health-check failed", "err", err) - errc = <-w.healthQuit - } - errc <- err -} - -// Close implements accounts.Wallet, closing the USB connection to the Ledger. -func (w *ledgerWallet) Close() error { - // Ensure the wallet was opened - w.stateLock.RLock() - hQuit, dQuit := w.healthQuit, w.deriveQuit - w.stateLock.RUnlock() - - // Terminate the health checks - var herr error - if hQuit != nil { - errc := make(chan error) - hQuit <- errc - herr = <-errc // Save for later, we *must* close the USB - } - // Terminate the self-derivations - var derr error - if dQuit != nil { - errc := make(chan error) - dQuit <- errc - derr = <-errc // Save for later, we *must* close the USB - } - // Terminate the device connection - w.stateLock.Lock() - defer w.stateLock.Unlock() - - w.healthQuit = nil - w.deriveQuit = nil - w.deriveReq = nil - - if err := w.close(); err != nil { - return err - } - if herr != nil { - return herr - } - return derr -} - -// close is the internal wallet closer that terminates the USB connection and -// resets all the fields to their defaults. -// -// Note, close assumes the state lock is held! -func (w *ledgerWallet) close() error { - // Allow duplicate closes, especially for health-check failures - if w.device == nil { - return nil - } - // Close the device, clear everything, then return - w.device.Close() - w.device = nil - - w.browser, w.version = false, [3]byte{} - w.accounts, w.paths = nil, nil - - return nil -} - -// Accounts implements accounts.Wallet, returning the list of accounts pinned to -// the Ledger hardware wallet. If self-derivation was enabled, the account list -// is periodically expanded based on current chain state. -func (w *ledgerWallet) Accounts() []accounts.Account { - // Attempt self-derivation if it's running - reqc := make(chan struct{}, 1) - select { - case w.deriveReq <- reqc: - // Self-derivation request accepted, wait for it - <-reqc - default: - // Self-derivation offline, throttled or busy, skip - } - // Return whatever account list we ended up with - w.stateLock.RLock() - defer w.stateLock.RUnlock() - - cpy := make([]accounts.Account, len(w.accounts)) - copy(cpy, w.accounts) - return cpy -} - -// selfDerive is an account derivation loop that upon request attempts to find -// new non-zero accounts. -func (w *ledgerWallet) selfDerive() { - w.log.Debug("Ledger self-derivation started") - defer w.log.Debug("Ledger self-derivation stopped") - - // Execute self-derivations until termination or error - var ( - reqc chan struct{} - errc chan error - err error - ) - for errc == nil && err == nil { - // Wait until either derivation or termination is requested - select { - case errc = <-w.deriveQuit: - // Termination requested - continue - case reqc = <-w.deriveReq: - // Account discovery requested - } - // Derivation needs a chain and device access, skip if either unavailable - w.stateLock.RLock() - if w.device == nil || w.deriveChain == nil || w.offline() { - w.stateLock.RUnlock() - reqc <- struct{}{} - continue - } - select { - case <-w.commsLock: - default: - w.stateLock.RUnlock() - reqc <- struct{}{} - continue - } - // Device lock obtained, derive the next batch of accounts - var ( - accs []accounts.Account - paths []accounts.DerivationPath - - nextAddr = w.deriveNextAddr - nextPath = w.deriveNextPath - - context = context.Background() - ) - for empty := false; !empty; { - // Retrieve the next derived Ethereum account - if nextAddr == (common.Address{}) { - if nextAddr, err = w.ledgerDerive(nextPath); err != nil { - w.log.Warn("Ledger account derivation failed", "err", err) - break - } - } - // Check the account's status against the current chain state - var ( - balance *big.Int - nonce uint64 - ) - balance, err = w.deriveChain.BalanceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("Ledger balance retrieval failed", "err", err) - break - } - nonce, err = w.deriveChain.NonceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("Ledger nonce retrieval failed", "err", err) - break - } - // If the next account is empty, stop self-derivation, but add it nonetheless - if balance.Sign() == 0 && nonce == 0 { - empty = true - } - // We've just self-derived a new account, start tracking it locally - path := make(accounts.DerivationPath, len(nextPath)) - copy(path[:], nextPath[:]) - paths = append(paths, path) - - account := accounts.Account{ - Address: nextAddr, - URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, - } - accs = append(accs, account) - - // Display a log message to the user for new (or previously empty accounts) - if _, known := w.paths[nextAddr]; !known || (!empty && nextAddr == w.deriveNextAddr) { - w.log.Info("Ledger discovered new account", "address", nextAddr, "path", path, "balance", balance, "nonce", nonce) - } - // Fetch the next potential account - if !empty { - nextAddr = common.Address{} - nextPath[len(nextPath)-1]++ - } - } - // Self derivation complete, release device lock - w.commsLock <- struct{}{} - w.stateLock.RUnlock() - - // Insert any accounts successfully derived - w.stateLock.Lock() - for i := 0; i < len(accs); i++ { - if _, ok := w.paths[accs[i].Address]; !ok { - w.accounts = append(w.accounts, accs[i]) - w.paths[accs[i].Address] = paths[i] - } - } - // Shift the self-derivation forward - // TODO(karalabe): don't overwrite changes from wallet.SelfDerive - w.deriveNextAddr = nextAddr - w.deriveNextPath = nextPath - w.stateLock.Unlock() - - // Notify the user of termination and loop after a bit of time (to avoid trashing) - reqc <- struct{}{} - if err == nil { - select { - case errc = <-w.deriveQuit: - // Termination requested, abort - case <-time.After(selfDeriveThrottling): - // Waited enough, willing to self-derive again - } - } - } - // In case of error, wait for termination - if err != nil { - w.log.Debug("Ledger self-derivation failed", "err", err) - errc = <-w.deriveQuit - } - errc <- err -} - -// Contains implements accounts.Wallet, returning whether a particular account is -// or is not pinned into this Ledger instance. Although we could attempt to resolve -// unpinned accounts, that would be an non-negligible hardware operation. -func (w *ledgerWallet) Contains(account accounts.Account) bool { - w.stateLock.RLock() - defer w.stateLock.RUnlock() - - _, exists := w.paths[account.Address] - return exists -} - -// Derive implements accounts.Wallet, deriving a new account at the specific -// derivation path. If pin is set to true, the account will be added to the list -// of tracked accounts. -func (w *ledgerWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { - // Try to derive the actual account and update its URL if successful - w.stateLock.RLock() // Avoid device disappearing during derivation - - if w.device == nil || w.offline() { - w.stateLock.RUnlock() - return accounts.Account{}, accounts.ErrWalletClosed - } - <-w.commsLock // Avoid concurrent hardware access - address, err := w.ledgerDerive(path) - w.commsLock <- struct{}{} - - w.stateLock.RUnlock() - - // If an error occurred or no pinning was requested, return - if err != nil { - return accounts.Account{}, err - } - account := accounts.Account{ - Address: address, - URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, - } - if !pin { - return account, nil - } - // Pinning needs to modify the state - w.stateLock.Lock() - defer w.stateLock.Unlock() - - if _, ok := w.paths[address]; !ok { - w.accounts = append(w.accounts, account) - w.paths[address] = path - } - return account, nil -} - -// SelfDerive implements accounts.Wallet, trying to discover accounts that the -// user used previously (based on the chain state), but ones that he/she did not -// explicitly pin to the wallet manually. To avoid chain head monitoring, self -// derivation only runs during account listing (and even then throttled). -func (w *ledgerWallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) { - w.stateLock.Lock() - defer w.stateLock.Unlock() - - w.deriveNextPath = make(accounts.DerivationPath, len(base)) - copy(w.deriveNextPath[:], base[:]) - - w.deriveNextAddr = common.Address{} - w.deriveChain = chain -} - -// SignHash implements accounts.Wallet, however signing arbitrary data is not -// supported for Ledger wallets, so this method will always return an error. -func (w *ledgerWallet) SignHash(acc accounts.Account, hash []byte) ([]byte, error) { - return nil, accounts.ErrNotSupported -} - -// SignTx implements accounts.Wallet. It sends the transaction over to the Ledger -// wallet to request a confirmation from the user. It returns either the signed -// transaction or a failure if the user denied the transaction. -// -// Note, if the version of the Ethereum application running on the Ledger wallet is -// too old to sign EIP-155 transactions, but such is requested nonetheless, an error -// will be returned opposed to silently signing in Homestead mode. -func (w *ledgerWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - w.stateLock.RLock() // Comms have own mutex, this is for the state fields - defer w.stateLock.RUnlock() - - // If the wallet is closed, or the Ethereum app doesn't run, abort - if w.device == nil || w.offline() { - return nil, accounts.ErrWalletClosed - } - // Make sure the requested account is contained within - path, ok := w.paths[account.Address] - if !ok { - return nil, accounts.ErrUnknownAccount - } - // Ensure the wallet is capable of signing the given transaction - if chainID != nil && w.version[0] <= 1 && w.version[1] <= 0 && w.version[2] <= 2 { - return nil, fmt.Errorf("Ledger v%d.%d.%d doesn't support signing this transaction, please update to v1.0.3 at least", w.version[0], w.version[1], w.version[2]) - } - // All infos gathered and metadata checks out, request signing - <-w.commsLock - defer func() { w.commsLock <- struct{}{} }() - - // Ensure the device isn't screwed with while user confirmation is pending - // TODO(karalabe): remove if hotplug lands on Windows - w.hub.commsLock.Lock() - w.hub.commsPend++ - w.hub.commsLock.Unlock() - - defer func() { - w.hub.commsLock.Lock() - w.hub.commsPend-- - w.hub.commsLock.Unlock() - }() - return w.ledgerSign(path, account.Address, tx, chainID) -} - -// SignHashWithPassphrase implements accounts.Wallet, however signing arbitrary -// data is not supported for Ledger wallets, so this method will always return -// an error. -func (w *ledgerWallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { - return nil, accounts.ErrNotSupported -} - -// SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given -// transaction with the given account using passphrase as extra authentication. -// Since the Ledger does not support extra passphrases, it is silently ignored. -func (w *ledgerWallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - return w.SignTx(account, tx, chainID) -} - -// ledgerVersion retrieves the current version of the Ethereum wallet app running -// on the Ledger wallet. -// -// The version retrieval protocol is defined as follows: -// -// CLA | INS | P1 | P2 | Lc | Le -// ----+-----+----+----+----+--- -// E0 | 06 | 00 | 00 | 00 | 04 -// -// With no input data, and the output data being: -// -// Description | Length -// ---------------------------------------------------+-------- -// Flags 01: arbitrary data signature enabled by user | 1 byte -// Application major version | 1 byte -// Application minor version | 1 byte -// Application patch version | 1 byte -func (w *ledgerWallet) ledgerVersion() ([3]byte, error) { - // Send the request and wait for the response - reply, err := w.ledgerExchange(ledgerOpGetConfiguration, 0, 0, nil) - if err != nil { - return [3]byte{}, err - } - if len(reply) != 4 { - return [3]byte{}, errInvalidVersionReply - } - // Cache the version for future reference - var version [3]byte - copy(version[:], reply[1:]) - return version, nil -} - -// ledgerDerive retrieves the currently active Ethereum address from a Ledger -// wallet at the specified derivation path. -// -// The address derivation protocol is defined as follows: -// -// CLA | INS | P1 | P2 | Lc | Le -// ----+-----+----+----+-----+--- -// E0 | 02 | 00 return address -// 01 display address and confirm before returning -// | 00: do not return the chain code -// | 01: return the chain code -// | var | 00 -// -// Where the input data is: -// -// Description | Length -// -------------------------------------------------+-------- -// Number of BIP 32 derivations to perform (max 10) | 1 byte -// First derivation index (big endian) | 4 bytes -// ... | 4 bytes -// Last derivation index (big endian) | 4 bytes -// -// And the output data is: -// -// Description | Length -// ------------------------+------------------- -// Public Key length | 1 byte -// Uncompressed Public Key | arbitrary -// Ethereum address length | 1 byte -// Ethereum address | 40 bytes hex ascii -// Chain code if requested | 32 bytes -func (w *ledgerWallet) ledgerDerive(derivationPath []uint32) (common.Address, error) { - // Flatten the derivation path into the Ledger request - path := make([]byte, 1+4*len(derivationPath)) - path[0] = byte(len(derivationPath)) - for i, component := range derivationPath { - binary.BigEndian.PutUint32(path[1+4*i:], component) - } - // Send the request and wait for the response - reply, err := w.ledgerExchange(ledgerOpRetrieveAddress, ledgerP1DirectlyFetchAddress, ledgerP2DiscardAddressChainCode, path) - if err != nil { - return common.Address{}, err - } - // Discard the public key, we don't need that for now - if len(reply) < 1 || len(reply) < 1+int(reply[0]) { - return common.Address{}, errors.New("reply lacks public key entry") - } - reply = reply[1+int(reply[0]):] - - // Extract the Ethereum hex address string - if len(reply) < 1 || len(reply) < 1+int(reply[0]) { - return common.Address{}, errors.New("reply lacks address entry") - } - hexstr := reply[1 : 1+int(reply[0])] - - // Decode the hex sting into an Ethereum address and return - var address common.Address - hex.Decode(address[:], hexstr) - return address, nil -} - -// ledgerSign sends the transaction to the Ledger wallet, and waits for the user -// to confirm or deny the transaction. -// -// The transaction signing protocol is defined as follows: -// -// CLA | INS | P1 | P2 | Lc | Le -// ----+-----+----+----+-----+--- -// E0 | 04 | 00: first transaction data block -// 80: subsequent transaction data block -// | 00 | variable | variable -// -// Where the input for the first transaction block (first 255 bytes) is: -// -// Description | Length -// -------------------------------------------------+---------- -// Number of BIP 32 derivations to perform (max 10) | 1 byte -// First derivation index (big endian) | 4 bytes -// ... | 4 bytes -// Last derivation index (big endian) | 4 bytes -// RLP transaction chunk | arbitrary -// -// And the input for subsequent transaction blocks (first 255 bytes) are: -// -// Description | Length -// ----------------------+---------- -// RLP transaction chunk | arbitrary -// -// And the output data is: -// -// Description | Length -// ------------+--------- -// signature V | 1 byte -// signature R | 32 bytes -// signature S | 32 bytes -func (w *ledgerWallet) ledgerSign(derivationPath []uint32, address common.Address, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - // Flatten the derivation path into the Ledger request - path := make([]byte, 1+4*len(derivationPath)) - path[0] = byte(len(derivationPath)) - for i, component := range derivationPath { - binary.BigEndian.PutUint32(path[1+4*i:], component) - } - // Create the transaction RLP based on whether legacy or EIP155 signing was requeste - var ( - txrlp []byte - err error - ) - if chainID == nil { - if txrlp, err = rlp.EncodeToBytes([]interface{}{tx.Nonce(), tx.GasPrice(), tx.Gas(), tx.To(), tx.Value(), tx.Data()}); err != nil { - return nil, err - } - } else { - if txrlp, err = rlp.EncodeToBytes([]interface{}{tx.Nonce(), tx.GasPrice(), tx.Gas(), tx.To(), tx.Value(), tx.Data(), chainID, big.NewInt(0), big.NewInt(0)}); err != nil { - return nil, err - } - } - payload := append(path, txrlp...) - - // Send the request and wait for the response - var ( - op = ledgerP1InitTransactionData - reply []byte - ) - for len(payload) > 0 { - // Calculate the size of the next data chunk - chunk := 255 - if chunk > len(payload) { - chunk = len(payload) - } - // Send the chunk over, ensuring it's processed correctly - reply, err = w.ledgerExchange(ledgerOpSignTransaction, op, 0, payload[:chunk]) - if err != nil { - return nil, err - } - // Shift the payload and ensure subsequent chunks are marked as such - payload = payload[chunk:] - op = ledgerP1ContTransactionData - } - // Extract the Ethereum signature and do a sanity validation - if len(reply) != 65 { - return nil, errors.New("reply lacks signature") - } - signature := append(reply[1:], reply[0]) - - // Create the correct signer and signature transform based on the chain ID - var signer types.Signer - if chainID == nil { - signer = new(types.HomesteadSigner) - } else { - signer = types.NewEIP155Signer(chainID) - signature[64] = signature[64] - byte(chainID.Uint64()*2+35) - } - // Inject the final signature into the transaction and sanity check the sender - signed, err := tx.WithSignature(signer, signature) - if err != nil { - return nil, err - } - sender, err := types.Sender(signer, signed) - if err != nil { - return nil, err - } - if sender != address { - return nil, fmt.Errorf("signer mismatch: expected %s, got %s", address.Hex(), sender.Hex()) - } - return signed, nil -} - -// ledgerExchange performs a data exchange with the Ledger wallet, sending it a -// message and retrieving the response. -// -// The common transport header is defined as follows: -// -// Description | Length -// --------------------------------------+---------- -// Communication channel ID (big endian) | 2 bytes -// Command tag | 1 byte -// Packet sequence index (big endian) | 2 bytes -// Payload | arbitrary -// -// The Communication channel ID allows commands multiplexing over the same -// physical link. It is not used for the time being, and should be set to 0101 -// to avoid compatibility issues with implementations ignoring a leading 00 byte. -// -// The Command tag describes the message content. Use TAG_APDU (0x05) for standard -// APDU payloads, or TAG_PING (0x02) for a simple link test. -// -// The Packet sequence index describes the current sequence for fragmented payloads. -// The first fragment index is 0x00. -// -// APDU Command payloads are encoded as follows: -// -// Description | Length -// ----------------------------------- -// APDU length (big endian) | 2 bytes -// APDU CLA | 1 byte -// APDU INS | 1 byte -// APDU P1 | 1 byte -// APDU P2 | 1 byte -// APDU length | 1 byte -// Optional APDU data | arbitrary -func (w *ledgerWallet) ledgerExchange(opcode ledgerOpcode, p1 ledgerParam1, p2 ledgerParam2, data []byte) ([]byte, error) { - // Construct the message payload, possibly split into multiple chunks - apdu := make([]byte, 2, 7+len(data)) - - binary.BigEndian.PutUint16(apdu, uint16(5+len(data))) - apdu = append(apdu, []byte{0xe0, byte(opcode), byte(p1), byte(p2), byte(len(data))}...) - apdu = append(apdu, data...) - - // Stream all the chunks to the device - header := []byte{0x01, 0x01, 0x05, 0x00, 0x00} // Channel ID and command tag appended - chunk := make([]byte, 64) - space := len(chunk) - len(header) - - for i := 0; len(apdu) > 0; i++ { - // Construct the new message to stream - chunk = append(chunk[:0], header...) - binary.BigEndian.PutUint16(chunk[3:], uint16(i)) - - if len(apdu) > space { - chunk = append(chunk, apdu[:space]...) - apdu = apdu[space:] - } else { - chunk = append(chunk, apdu...) - apdu = nil - } - // Send over to the device - w.log.Trace("Data chunk sent to the Ledger", "chunk", hexutil.Bytes(chunk)) - if _, err := w.device.Write(chunk); err != nil { - return nil, err - } - } - // Stream the reply back from the wallet in 64 byte chunks - var reply []byte - chunk = chunk[:64] // Yeah, we surely have enough space - for { - // Read the next chunk from the Ledger wallet - if _, err := io.ReadFull(w.device, chunk); err != nil { - return nil, err - } - w.log.Trace("Data chunk received from the Ledger", "chunk", hexutil.Bytes(chunk)) - - // Make sure the transport header matches - if chunk[0] != 0x01 || chunk[1] != 0x01 || chunk[2] != 0x05 { - return nil, errReplyInvalidHeader - } - // If it's the first chunk, retrieve the total message length - var payload []byte - - if chunk[3] == 0x00 && chunk[4] == 0x00 { - reply = make([]byte, 0, int(binary.BigEndian.Uint16(chunk[5:7]))) - payload = chunk[7:] - } else { - payload = chunk[5:] - } - // Append to the reply and stop when filled up - if left := cap(reply) - len(reply); left > len(payload) { - reply = append(reply, payload...) - } else { - reply = append(reply, payload[:left]...) - break - } - } - return reply[:len(reply)-2], nil -} diff --git a/accounts/usbwallet/trezor.go b/accounts/usbwallet/trezor.go new file mode 100644 index 0000000000..159cb2ea97 --- /dev/null +++ b/accounts/usbwallet/trezor.go @@ -0,0 +1,330 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// This file contains the implementation for interacting with the Trezor hardware +// wallets. The wire protocol spec can be found on the SatoshiLabs website: +// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html + +package usbwallet + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/usbwallet/internal/trezor" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/golang/protobuf/proto" +) + +// ErrTrezorPINNeeded is returned if opening the trezor requires a PIN code. In +// this case, the calling application should display a pinpad and send back the +// encoded passphrase. +var ErrTrezorPINNeeded = errors.New("trezor: pin needed") + +// errTrezorReplyInvalidHeader is the error message returned by a Trezor data exchange +// if the device replies with a mismatching header. This usually means the device +// is in browser mode. +var errTrezorReplyInvalidHeader = errors.New("trezor: invalid reply header") + +// trezorDriver implements the communication with a Trezor hardware wallet. +type trezorDriver struct { + device io.ReadWriter // USB device connection to communicate through + version [3]uint32 // Current version of the Trezor firmware + label string // Current textual label of the Trezor device + pinwait bool // Flags whether the device is waiting for PIN entry + failure error // Any failure that would make the device unusable + log log.Logger // Contextual logger to tag the trezor with its id +} + +// newTrezorDriver creates a new instance of a Trezor USB protocol driver. +func newTrezorDriver(logger log.Logger) driver { + return &trezorDriver{ + log: logger, + } +} + +// Status implements accounts.Wallet, always whether the Trezor is opened, closed +// or whether the Ethereum app was not started on it. +func (w *trezorDriver) Status() (string, error) { + if w.failure != nil { + return fmt.Sprintf("Failed: %v", w.failure), w.failure + } + if w.device == nil { + return "Closed", w.failure + } + if w.pinwait { + return fmt.Sprintf("Trezor v%d.%d.%d '%s' waiting for PIN", w.version[0], w.version[1], w.version[2], w.label), w.failure + } + return fmt.Sprintf("Trezor v%d.%d.%d '%s' online", w.version[0], w.version[1], w.version[2], w.label), w.failure +} + +// Open implements usbwallet.driver, attempting to initialize the connection to +// the Trezor hardware wallet. Initializing the Trezor is a two phase operation: +// * The first phase is to initialize the connection and read the wallet's +// features. This phase is invoked is the provided passphrase is empty. The +// device will display the pinpad as a result and will return an appropriate +// error to notify the user that a second open phase is needed. +// * The second phase is to unlock access to the Trezor, which is done by the +// user actually providing a passphrase mapping a keyboard keypad to the pin +// number of the user (shuffled according to the pinpad displayed). +func (w *trezorDriver) Open(device io.ReadWriter, passphrase string) error { + w.device, w.failure = device, nil + + // If phase 1 is requested, init the connection and wait for user callback + if passphrase == "" { + // If we're already waiting for a PIN entry, insta-return + if w.pinwait { + return ErrTrezorPINNeeded + } + // Initialize a connection to the device + features := new(trezor.Features) + if _, err := w.trezorExchange(&trezor.Initialize{}, features); err != nil { + return err + } + w.version = [3]uint32{features.GetMajorVersion(), features.GetMinorVersion(), features.GetPatchVersion()} + w.label = features.GetLabel() + + // Do a manual ping, forcing the device to ask for its PIN + askPin := true + res, err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin}, new(trezor.PinMatrixRequest), new(trezor.Success)) + if err != nil { + return err + } + // Only return the PIN request if the device wasn't unlocked until now + if res == 1 { + return nil // Device responded with trezor.Success + } + w.pinwait = true + return ErrTrezorPINNeeded + } + // Phase 2 requested with actual PIN entry + w.pinwait = false + + if _, err := w.trezorExchange(&trezor.PinMatrixAck{Pin: &passphrase}, new(trezor.Success)); err != nil { + w.failure = err + return err + } + return nil +} + +// Close implements usbwallet.driver, cleaning up and metadata maintained within +// the Trezor driver. +func (w *trezorDriver) Close() error { + w.version, w.label, w.pinwait = [3]uint32{}, "", false + return nil +} + +// Heartbeat implements usbwallet.driver, performing a sanity check against the +// Trezor to see if it's still online. +func (w *trezorDriver) Heartbeat() error { + if _, err := w.trezorExchange(&trezor.Ping{}, new(trezor.Success)); err != nil { + w.failure = err + return err + } + return nil +} + +// Derive implements usbwallet.driver, sending a derivation request to the Trezor +// and returning the Ethereum address located on that derivation path. +func (w *trezorDriver) Derive(path accounts.DerivationPath) (common.Address, error) { + return w.trezorDerive(path) +} + +// SignTx implements usbwallet.driver, sending the transaction to the Trezor and +// waiting for the user to confirm or deny the transaction. +func (w *trezorDriver) SignTx(path accounts.DerivationPath, tx *types.Transaction, chainID *big.Int) (common.Address, *types.Transaction, error) { + if w.device == nil { + return common.Address{}, nil, accounts.ErrWalletClosed + } + return w.trezorSign(path, tx, chainID) +} + +// trezorDerive sends a derivation request to the Trezor device and returns the +// Ethereum address located on that path. +func (w *trezorDriver) trezorDerive(derivationPath []uint32) (common.Address, error) { + address := new(trezor.EthereumAddress) + if _, err := w.trezorExchange(&trezor.EthereumGetAddress{AddressN: derivationPath}, address); err != nil { + return common.Address{}, err + } + return common.BytesToAddress(address.GetAddress()), nil +} + +// trezorSign sends the transaction to the Trezor wallet, and waits for the user +// to confirm or deny the transaction. +func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction, chainID *big.Int) (common.Address, *types.Transaction, error) { + // Create the transaction initiation message + data := tx.Data() + length := uint32(len(data)) + + request := &trezor.EthereumSignTx{ + AddressN: derivationPath, + Nonce: new(big.Int).SetUint64(tx.Nonce()).Bytes(), + GasPrice: tx.GasPrice().Bytes(), + GasLimit: tx.Gas().Bytes(), + Value: tx.Value().Bytes(), + DataLength: &length, + } + if to := tx.To(); to != nil { + request.To = (*to)[:] // Non contract deploy, set recipient explicitly + } + if length > 1024 { // Send the data chunked if that was requested + request.DataInitialChunk, data = data[:1024], data[1024:] + } else { + request.DataInitialChunk, data = data, nil + } + if chainID != nil { // EIP-155 transaction, set chain ID explicitly (only 32 bit is supported!?) + id := uint32(chainID.Int64()) + request.ChainId = &id + } + // Send the initiation message and stream content until a signature is returned + response := new(trezor.EthereumTxRequest) + if _, err := w.trezorExchange(request, response); err != nil { + return common.Address{}, nil, err + } + for response.DataLength != nil && int(*response.DataLength) <= len(data) { + chunk := data[:*response.DataLength] + data = data[*response.DataLength:] + + if _, err := w.trezorExchange(&trezor.EthereumTxAck{DataChunk: chunk}, response); err != nil { + return common.Address{}, nil, err + } + } + // Extract the Ethereum signature and do a sanity validation + if len(response.GetSignatureR()) == 0 || len(response.GetSignatureS()) == 0 || response.GetSignatureV() == 0 { + return common.Address{}, nil, errors.New("reply lacks signature") + } + signature := append(append(response.GetSignatureR(), response.GetSignatureS()...), byte(response.GetSignatureV())) + + // Create the correct signer and signature transform based on the chain ID + var signer types.Signer + if chainID == nil { + signer = new(types.HomesteadSigner) + } else { + signer = types.NewEIP155Signer(chainID) + signature[64] = signature[64] - byte(chainID.Uint64()*2+35) + } + // Inject the final signature into the transaction and sanity check the sender + signed, err := tx.WithSignature(signer, signature) + if err != nil { + return common.Address{}, nil, err + } + sender, err := types.Sender(signer, signed) + if err != nil { + return common.Address{}, nil, err + } + return sender, signed, nil +} + +// trezorExchange performs a data exchange with the Trezor wallet, sending it a +// message and retrieving the response. If multiple responses are possible, the +// method will also return the index of the destination object used. +func (w *trezorDriver) trezorExchange(req proto.Message, results ...proto.Message) (int, error) { + // Construct the original message payload to chunk up + data, err := proto.Marshal(req) + if err != nil { + return 0, err + } + payload := make([]byte, 8+len(data)) + copy(payload, []byte{0x23, 0x23}) + binary.BigEndian.PutUint16(payload[2:], trezor.Type(req)) + binary.BigEndian.PutUint32(payload[4:], uint32(len(data))) + copy(payload[8:], data) + + // Stream all the chunks to the device + chunk := make([]byte, 64) + chunk[0] = 0x3f // Report ID magic number + + for len(payload) > 0 { + // Construct the new message to stream, padding with zeroes if needed + if len(payload) > 63 { + copy(chunk[1:], payload[:63]) + payload = payload[63:] + } else { + copy(chunk[1:], payload) + copy(chunk[1+len(payload):], make([]byte, 63-len(payload))) + payload = nil + } + // Send over to the device + w.log.Trace("Data chunk sent to the Trezor", "chunk", hexutil.Bytes(chunk)) + if _, err := w.device.Write(chunk); err != nil { + return 0, err + } + } + // Stream the reply back from the wallet in 64 byte chunks + var ( + kind uint16 + reply []byte + ) + for { + // Read the next chunk from the Trezor wallet + if _, err := io.ReadFull(w.device, chunk); err != nil { + return 0, err + } + w.log.Trace("Data chunk received from the Trezor", "chunk", hexutil.Bytes(chunk)) + + // Make sure the transport header matches + if chunk[0] != 0x3f || (len(reply) == 0 && (chunk[1] != 0x23 || chunk[2] != 0x23)) { + return 0, errTrezorReplyInvalidHeader + } + // If it's the first chunk, retrieve the reply message type and total message length + var payload []byte + + if len(reply) == 0 { + kind = binary.BigEndian.Uint16(chunk[3:5]) + reply = make([]byte, 0, int(binary.BigEndian.Uint32(chunk[5:9]))) + payload = chunk[9:] + } else { + payload = chunk[1:] + } + // Append to the reply and stop when filled up + if left := cap(reply) - len(reply); left > len(payload) { + reply = append(reply, payload...) + } else { + reply = append(reply, payload[:left]...) + break + } + } + // Try to parse the reply into the requested reply message + if kind == uint16(trezor.MessageType_MessageType_Failure) { + // Trezor returned a failure, extract and return the message + failure := new(trezor.Failure) + if err := proto.Unmarshal(reply, failure); err != nil { + return 0, err + } + return 0, errors.New("trezor: " + failure.GetMessage()) + } + if kind == uint16(trezor.MessageType_MessageType_ButtonRequest) { + // Trezor is waiting for user confirmation, ack and wait for the next message + return w.trezorExchange(&trezor.ButtonAck{}, results...) + } + for i, res := range results { + if trezor.Type(res) == kind { + return i, proto.Unmarshal(reply, res) + } + } + expected := make([]string, len(results)) + for i, res := range results { + expected[i] = trezor.Name(trezor.Type(res)) + } + return 0, fmt.Errorf("trezor: expected reply types %s, got %s", expected, trezor.Name(kind)) +} diff --git a/accounts/usbwallet/trezor_hub.go b/accounts/usbwallet/trezor_hub.go deleted file mode 100644 index 5681a55c74..0000000000 --- a/accounts/usbwallet/trezor_hub.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package usbwallet - -import ( - "errors" - "runtime" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/log" - "github.com/karalabe/hid" -) - -// TrezorScheme is the protocol scheme prefixing account and wallet URLs. -var TrezorScheme = "trezor" - -// trezorVendorID is the USB vendor ID for SatoshiLabs. -var trezorVendorID = uint16(0x534c) - -// trezorDeviceID is the USB device ID for the Trezor 1. -var trezorDeviceID = uint16(0x0001) - -// Maximum time between wallet refreshes (if USB hotplug notifications don't work). -const trezorRefreshCycle = time.Second - -// Minimum time between wallet refreshes to avoid USB trashing. -const trezorRefreshThrottling = 500 * time.Millisecond - -// TrezorHub is a accounts.Backend that can find and handle Trezor hardware wallets. -type TrezorHub struct { - refreshed time.Time // Time instance when the list of wallets was last refreshed - wallets []accounts.Wallet // List of Trezor devices currently tracking - updateFeed event.Feed // Event feed to notify wallet additions/removals - updateScope event.SubscriptionScope // Subscription scope tracking current live listeners - updating bool // Whether the event notification loop is running - - quit chan chan error - - stateLock sync.RWMutex // Protects the internals of the hub from racey access - - // TODO(karalabe): remove if hotplug lands on Windows - commsPend int // Number of operations blocking enumeration - commsLock sync.Mutex // Lock protecting the pending counter and enumeration -} - -// NewTrezorHub creates a new hardware wallet manager for Trezor devices. -func NewTrezorHub() (*TrezorHub, error) { - if !hid.Supported() { - return nil, errors.New("unsupported platform") - } - hub := &TrezorHub{ - quit: make(chan chan error), - } - hub.refreshWallets() - return hub, nil -} - -// Wallets implements accounts.Backend, returning all the currently tracked USB -// devices that appear to be Trezor hardware wallets. -func (hub *TrezorHub) Wallets() []accounts.Wallet { - // Make sure the list of wallets is up to date - hub.refreshWallets() - - hub.stateLock.RLock() - defer hub.stateLock.RUnlock() - - cpy := make([]accounts.Wallet, len(hub.wallets)) - copy(cpy, hub.wallets) - return cpy -} - -// refreshWallets scans the USB devices attached to the machine and updates the -// list of wallets based on the found devices. -func (hub *TrezorHub) refreshWallets() { - // Don't scan the USB like crazy it the user fetches wallets in a loop - hub.stateLock.RLock() - elapsed := time.Since(hub.refreshed) - hub.stateLock.RUnlock() - - if elapsed < trezorRefreshThrottling { - return - } - // Retrieve the current list of Trezor devices - var trezors []hid.DeviceInfo - - if runtime.GOOS == "linux" { - // hidapi on Linux opens the device during enumeration to retrieve some infos, - // breaking the Trezor protocol if that is waiting for user confirmation. This - // is a bug acknowledged at Trezor, but it won't be fixed on old devices so we - // need to prevent concurrent comms ourselves. The more elegant solution would - // be to ditch enumeration in favor of hutplug events, but that don't work yet - // on Windows so if we need to hack it anyway, this is more elegant for now. - hub.commsLock.Lock() - if hub.commsPend > 0 { // A confirmation is pending, don't refresh - hub.commsLock.Unlock() - return - } - } - for _, info := range hid.Enumerate(trezorVendorID, trezorDeviceID) { - if info.Interface == 0 { // interface #1 is the debug link, skip it - trezors = append(trezors, info) - } - } - if runtime.GOOS == "linux" { - // See rationale before the enumeration why this is needed and only on Linux. - hub.commsLock.Unlock() - } - // Transform the current list of wallets into the new one - hub.stateLock.Lock() - - wallets := make([]accounts.Wallet, 0, len(trezors)) - events := []accounts.WalletEvent{} - - for _, trezor := range trezors { - url := accounts.URL{Scheme: TrezorScheme, Path: trezor.Path} - - // Drop wallets in front of the next device or those that failed for some reason - for len(hub.wallets) > 0 && (hub.wallets[0].URL().Cmp(url) < 0 || hub.wallets[0].(*trezorWallet).failed()) { - events = append(events, accounts.WalletEvent{Wallet: hub.wallets[0], Kind: accounts.WalletDropped}) - hub.wallets = hub.wallets[1:] - } - // If there are no more wallets or the device is before the next, wrap new wallet - if len(hub.wallets) == 0 || hub.wallets[0].URL().Cmp(url) > 0 { - wallet := &trezorWallet{hub: hub, url: &url, info: trezor, log: log.New("url", url)} - - events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) - wallets = append(wallets, wallet) - continue - } - // If the device is the same as the first wallet, keep it - if hub.wallets[0].URL().Cmp(url) == 0 { - wallets = append(wallets, hub.wallets[0]) - hub.wallets = hub.wallets[1:] - continue - } - } - // Drop any leftover wallets and set the new batch - for _, wallet := range hub.wallets { - events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) - } - hub.refreshed = time.Now() - hub.wallets = wallets - hub.stateLock.Unlock() - - // Fire all wallet events and return - for _, event := range events { - hub.updateFeed.Send(event) - } -} - -// Subscribe implements accounts.Backend, creating an async subscription to -// receive notifications on the addition or removal of Trezor wallets. -func (hub *TrezorHub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { - // We need the mutex to reliably start/stop the update loop - hub.stateLock.Lock() - defer hub.stateLock.Unlock() - - // Subscribe the caller and track the subscriber count - sub := hub.updateScope.Track(hub.updateFeed.Subscribe(sink)) - - // Subscribers require an active notification loop, start it - if !hub.updating { - hub.updating = true - go hub.updater() - } - return sub -} - -// updater is responsible for maintaining an up-to-date list of wallets stored in -// the keystore, and for firing wallet addition/removal events. It listens for -// account change events from the underlying account cache, and also periodically -// forces a manual refresh (only triggers for systems where the filesystem notifier -// is not running). -func (hub *TrezorHub) updater() { - for { - // Wait for a USB hotplug event (not supported yet) or a refresh timeout - select { - //case <-hub.changes: // reenable on hutplug implementation - case <-time.After(trezorRefreshCycle): - } - // Run the wallet refresher - hub.refreshWallets() - - // If all our subscribers left, stop the updater - hub.stateLock.Lock() - if hub.updateScope.Count() == 0 { - hub.updating = false - hub.stateLock.Unlock() - return - } - hub.stateLock.Unlock() - } -} diff --git a/accounts/usbwallet/trezor_wallet.go b/accounts/usbwallet/trezor_wallet.go deleted file mode 100644 index 7791191920..0000000000 --- a/accounts/usbwallet/trezor_wallet.go +++ /dev/null @@ -1,761 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// This file contains the implementation for interacting with the Trezor hardware -// wallets. The wire protocol spec can be found on the SatoshiLabs website: -// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html - -package usbwallet - -import ( - "context" - "encoding/binary" - "errors" - "fmt" - "io" - "math/big" - "sync" - "time" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/usbwallet/internal/trezor" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/golang/protobuf/proto" - "github.com/karalabe/hid" -) - -// ErrTrezorPINNeeded is returned if opening the trezor requires a PIN code. In -// this case, the calling application should display a pinpad and send back the -// encoded passphrase. -var ErrTrezorPINNeeded = errors.New("trezor: pin needed") - -// trezorWallet represents a live USB Trezor hardware wallet. -type trezorWallet struct { - hub *TrezorHub // USB hub the device originates from (TODO(karalabe): remove if hotplug lands on Windows) - url *accounts.URL // Textual URL uniquely identifying this wallet - - info hid.DeviceInfo // Known USB device infos about the wallet - device *hid.Device // USB device advertising itself as a Trezor wallet - failure error // Any failure that would make the device unusable - - version [3]uint32 // Current version of the Trezor formware (zero if app is offline) - label string // Current textual label of the Trezor device - pinwait bool // Flags whether the device is waiting for PIN entry - accounts []accounts.Account // List of derive accounts pinned on the Trezor - paths map[common.Address]accounts.DerivationPath // Known derivation paths for signing operations - - deriveNextPath accounts.DerivationPath // Next derivation path for account auto-discovery - deriveNextAddr common.Address // Next derived account address for auto-discovery - deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with - deriveReq chan chan struct{} // Channel to request a self-derivation on - deriveQuit chan chan error // Channel to terminate the self-deriver with - - healthQuit chan chan error - - // Locking a hardware wallet is a bit special. Since hardware devices are lower - // performing, any communication with them might take a non negligible amount of - // time. Worse still, waiting for user confirmation can take arbitrarily long, - // but exclusive communication must be upheld during. Locking the entire wallet - // in the mean time however would stall any parts of the system that don't want - // to communicate, just read some state (e.g. list the accounts). - // - // As such, a hardware wallet needs two locks to function correctly. A state - // lock can be used to protect the wallet's software-side internal state, which - // must not be held exlusively during hardware communication. A communication - // lock can be used to achieve exclusive access to the device itself, this one - // however should allow "skipping" waiting for operations that might want to - // use the device, but can live without too (e.g. account self-derivation). - // - // Since we have two locks, it's important to know how to properly use them: - // - Communication requires the `device` to not change, so obtaining the - // commsLock should be done after having a stateLock. - // - Communication must not disable read access to the wallet state, so it - // must only ever hold a *read* lock to stateLock. - commsLock chan struct{} // Mutex (buf=1) for the USB comms without keeping the state locked - stateLock sync.RWMutex // Protects read and write access to the wallet struct fields - - log log.Logger // Contextual logger to tag the trezor with its id -} - -// URL implements accounts.Wallet, returning the URL of the Trezor device. -func (w *trezorWallet) URL() accounts.URL { - return *w.url // Immutable, no need for a lock -} - -// Status implements accounts.Wallet, always whether the Trezor is opened, closed -// or whether the Ethereum app was not started on it. -func (w *trezorWallet) Status() string { - w.stateLock.RLock() // No device communication, state lock is enough - defer w.stateLock.RUnlock() - - if w.failure != nil { - return fmt.Sprintf("Failed: %v", w.failure) - } - if w.device == nil { - return "Closed" - } - if w.pinwait { - return fmt.Sprintf("Trezor v%d.%d.%d '%s' waiting for PIN", w.version[0], w.version[1], w.version[2], w.label) - } - return fmt.Sprintf("Trezor v%d.%d.%d '%s' online", w.version[0], w.version[1], w.version[2], w.label) -} - -// failed returns if the USB device wrapped by the wallet failed for some reason. -// This is used by the device scanner to report failed wallets as departed. -// -// The method assumes that the state lock is *not* held! -func (w *trezorWallet) failed() bool { - w.stateLock.RLock() // No device communication, state lock is enough - defer w.stateLock.RUnlock() - - return w.failure != nil -} - -// Open implements accounts.Wallet, attempting to open a USB connection to the -// Trezor hardware wallet. Connecting to the Trezor is a two phase operation: -// * The first phase is to establish the USB connection, initialize it and read -// the wallet's features. This phase is invoked is the provided passphrase is -// empty. The device will display the pinpad as a result and will return an -// appropriate error to notify the user that a second open phase is needed. -// * The second phase is to unlock access to the Trezor, which is done by the -// user actually providing a passphrase mapping a keyboard keypad to the pin -// number of the user (shuffled according to the pinpad displayed). -func (w *trezorWallet) Open(passphrase string) error { - w.stateLock.Lock() // State lock is enough since there's no connection yet at this point - defer w.stateLock.Unlock() - - // If phase 1 is requested, init the connection and wait for user callback - if passphrase == "" { - // If we're already waiting for a PIN entry, insta-return - if w.pinwait { - return ErrTrezorPINNeeded - } - // Initialize a connection to the device - if err := w.openInit(); err != nil { - return err - } - // Do a manual ping, forcing the device to ask for its PIN - askPin, pinRequest := true, new(trezor.PinMatrixRequest) - if err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin}, pinRequest); err != nil { - return err - } - w.pinwait = true - - return ErrTrezorPINNeeded - } - // Phase 2 requested with actual PIN entry - w.pinwait = false - - success := new(trezor.Success) - if err := w.trezorExchange(&trezor.PinMatrixAck{Pin: &passphrase}, success); err != nil { - w.failure = err - return err - } - go w.hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened}) - - // Trezor unlocked, start the heartbeat cycle and account derivation - w.paths = make(map[common.Address]accounts.DerivationPath) - - w.deriveReq = make(chan chan struct{}) - w.deriveQuit = make(chan chan error) - w.healthQuit = make(chan chan error) - - defer func() { - go w.heartbeat() - go w.selfDerive() - }() - return nil -} - -// openInit is the first phase of a Trezor opening mechanism which initializes -// device connection and requests the device to display the pinpad. -func (w *trezorWallet) openInit() error { - // If the wallet was already opened, don't try to phase-1 open again - if w.device != nil { - return accounts.ErrWalletAlreadyOpen - } - // Otherwise iterate over all USB devices and find this again (no way to directly do this) - device, err := w.info.Open() - if err != nil { - return err - } - // Wallet successfully connected to, init the connection and start the heartbeat - w.device = device - w.commsLock = make(chan struct{}, 1) - w.commsLock <- struct{}{} // Enable lock - - // Retrieve the Trezor's version number and user label - features := new(trezor.Features) - if err := w.trezorExchange(&trezor.Initialize{}, features); err != nil { - return err - } - w.version = [3]uint32{features.GetMajorVersion(), features.GetMinorVersion(), features.GetPatchVersion()} - w.label = features.GetLabel() - - return nil -} - -// heartbeat is a health check loop for the Trezor wallets to periodically verify -// whether they are still present or if they malfunctioned. It is needed because: -// - libusb on Windows doesn't support hotplug, so we can't detect USB unplugs -func (w *trezorWallet) heartbeat() { - w.log.Debug("Trezor health-check started") - defer w.log.Debug("Trezor health-check stopped") - - // Execute heartbeat checks until termination or error - var ( - errc chan error - err error - ) - for errc == nil && err == nil { - // Wait until termination is requested or the heartbeat cycle arrives - select { - case errc = <-w.healthQuit: - // Termination requested - continue - case <-time.After(heartbeatCycle): - // Heartbeat time - } - // Execute a tiny data exchange to see responsiveness - w.stateLock.RLock() - if w.device == nil { - // Terminated while waiting for the lock - w.stateLock.RUnlock() - continue - } - <-w.commsLock // Don't lock state while executing ping - - success := new(trezor.Success) - err = w.trezorExchange(&trezor.Ping{}, success) - - w.commsLock <- struct{}{} - w.stateLock.RUnlock() - - if err != nil { - w.stateLock.Lock() // Lock state to tear the wallet down - w.failure = err - w.close() - w.stateLock.Unlock() - } - // Ignore non hardware related errors - err = nil - } - // In case of error, wait for termination - if err != nil { - w.log.Debug("Trezor health-check failed", "err", err) - errc = <-w.healthQuit - } - errc <- err -} - -// Close implements accounts.Wallet, closing the USB connection to the Trezor. -func (w *trezorWallet) Close() error { - // Ensure the wallet was opened - w.stateLock.RLock() - hQuit, dQuit := w.healthQuit, w.deriveQuit - w.stateLock.RUnlock() - - // Terminate the health checks - var herr error - if hQuit != nil { - errc := make(chan error) - hQuit <- errc - herr = <-errc // Save for later, we *must* close the USB - } - // Terminate the self-derivations - var derr error - if dQuit != nil { - errc := make(chan error) - dQuit <- errc - derr = <-errc // Save for later, we *must* close the USB - } - // Terminate the device connection - w.stateLock.Lock() - defer w.stateLock.Unlock() - - w.healthQuit = nil - w.deriveQuit = nil - w.deriveReq = nil - - if err := w.close(); err != nil { - return err - } - if herr != nil { - return herr - } - return derr -} - -// close is the internal wallet closer that terminates the USB connection and -// resets all the fields to their defaults. -// -// Note, close assumes the state lock is held! -func (w *trezorWallet) close() error { - // Allow duplicate closes, especially for health-check failures - if w.device == nil { - return nil - } - // Close the device, clear everything, then return - w.device.Close() - w.device = nil - - w.label, w.version = "", [3]uint32{} - w.accounts, w.paths = nil, nil - - return nil -} - -// Accounts implements accounts.Wallet, returning the list of accounts pinned to -// the Trezor hardware wallet. If self-derivation was enabled, the account list -// is periodically expanded based on current chain state. -func (w *trezorWallet) Accounts() []accounts.Account { - // Attempt self-derivation if it's running - reqc := make(chan struct{}, 1) - select { - case w.deriveReq <- reqc: - // Self-derivation request accepted, wait for it - <-reqc - default: - // Self-derivation offline, throttled or busy, skip - } - // Return whatever account list we ended up with - w.stateLock.RLock() - defer w.stateLock.RUnlock() - - cpy := make([]accounts.Account, len(w.accounts)) - copy(cpy, w.accounts) - return cpy -} - -// selfDerive is an account derivation loop that upon request attempts to find -// new non-zero accounts. -func (w *trezorWallet) selfDerive() { - w.log.Debug("Trezor self-derivation started") - defer w.log.Debug("Trezor self-derivation stopped") - - // Execute self-derivations until termination or error - var ( - reqc chan struct{} - errc chan error - err error - ) - for errc == nil && err == nil { - // Wait until either derivation or termination is requested - select { - case errc = <-w.deriveQuit: - // Termination requested - continue - case reqc = <-w.deriveReq: - // Account discovery requested - } - // Derivation needs a chain and device access, skip if either unavailable - w.stateLock.RLock() - if w.device == nil || w.deriveChain == nil { - w.stateLock.RUnlock() - reqc <- struct{}{} - continue - } - select { - case <-w.commsLock: - default: - w.stateLock.RUnlock() - reqc <- struct{}{} - continue - } - // Device lock obtained, derive the next batch of accounts - var ( - accs []accounts.Account - paths []accounts.DerivationPath - - nextAddr = w.deriveNextAddr - nextPath = w.deriveNextPath - - context = context.Background() - ) - for empty := false; !empty; { - // Retrieve the next derived Ethereum account - if nextAddr == (common.Address{}) { - if nextAddr, err = w.trezorDerive(nextPath); err != nil { - w.log.Warn("Trezor account derivation failed", "err", err) - break - } - } - // Check the account's status against the current chain state - var ( - balance *big.Int - nonce uint64 - ) - balance, err = w.deriveChain.BalanceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("Trezor balance retrieval failed", "err", err) - break - } - nonce, err = w.deriveChain.NonceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("Trezor nonce retrieval failed", "err", err) - break - } - // If the next account is empty, stop self-derivation, but add it nonetheless - if balance.Sign() == 0 && nonce == 0 { - empty = true - } - // We've just self-derived a new account, start tracking it locally - path := make(accounts.DerivationPath, len(nextPath)) - copy(path[:], nextPath[:]) - paths = append(paths, path) - - account := accounts.Account{ - Address: nextAddr, - URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, - } - accs = append(accs, account) - - // Display a log message to the user for new (or previously empty accounts) - if _, known := w.paths[nextAddr]; !known || (!empty && nextAddr == w.deriveNextAddr) { - w.log.Info("Trezor discovered new account", "address", nextAddr, "path", path, "balance", balance, "nonce", nonce) - } - // Fetch the next potential account - if !empty { - nextAddr = common.Address{} - nextPath[len(nextPath)-1]++ - } - } - // Self derivation complete, release device lock - w.commsLock <- struct{}{} - w.stateLock.RUnlock() - - // Insert any accounts successfully derived - w.stateLock.Lock() - for i := 0; i < len(accs); i++ { - if _, ok := w.paths[accs[i].Address]; !ok { - w.accounts = append(w.accounts, accs[i]) - w.paths[accs[i].Address] = paths[i] - } - } - // Shift the self-derivation forward - // TODO(karalabe): don't overwrite changes from wallet.SelfDerive - w.deriveNextAddr = nextAddr - w.deriveNextPath = nextPath - w.stateLock.Unlock() - - // Notify the user of termination and loop after a bit of time (to avoid trashing) - reqc <- struct{}{} - if err == nil { - select { - case errc = <-w.deriveQuit: - // Termination requested, abort - case <-time.After(selfDeriveThrottling): - // Waited enough, willing to self-derive again - } - } - } - // In case of error, wait for termination - if err != nil { - w.log.Debug("Trezor self-derivation failed", "err", err) - errc = <-w.deriveQuit - } - errc <- err -} - -// Contains implements accounts.Wallet, returning whether a particular account is -// or is not pinned into this Trezor instance. Although we could attempt to resolve -// unpinned accounts, that would be an non-negligible hardware operation. -func (w *trezorWallet) Contains(account accounts.Account) bool { - w.stateLock.RLock() - defer w.stateLock.RUnlock() - - _, exists := w.paths[account.Address] - return exists -} - -// Derive implements accounts.Wallet, deriving a new account at the specific -// derivation path. If pin is set to true, the account will be added to the list -// of tracked accounts. -func (w *trezorWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { - // Try to derive the actual account and update its URL if successful - w.stateLock.RLock() // Avoid device disappearing during derivation - - if w.device == nil { - w.stateLock.RUnlock() - return accounts.Account{}, accounts.ErrWalletClosed - } - <-w.commsLock // Avoid concurrent hardware access - address, err := w.trezorDerive(path) - w.commsLock <- struct{}{} - - w.stateLock.RUnlock() - - // If an error occurred or no pinning was requested, return - if err != nil { - return accounts.Account{}, err - } - account := accounts.Account{ - Address: address, - URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, - } - if !pin { - return account, nil - } - // Pinning needs to modify the state - w.stateLock.Lock() - defer w.stateLock.Unlock() - - if _, ok := w.paths[address]; !ok { - w.accounts = append(w.accounts, account) - w.paths[address] = path - } - return account, nil -} - -// SelfDerive implements accounts.Wallet, trying to discover accounts that the -// user used previously (based on the chain state), but ones that he/she did not -// explicitly pin to the wallet manually. To avoid chain head monitoring, self -// derivation only runs during account listing (and even then throttled). -func (w *trezorWallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) { - w.stateLock.Lock() - defer w.stateLock.Unlock() - - w.deriveNextPath = make(accounts.DerivationPath, len(base)) - copy(w.deriveNextPath[:], base[:]) - - w.deriveNextAddr = common.Address{} - w.deriveChain = chain -} - -// SignHash implements accounts.Wallet, however signing arbitrary data is not -// supported for Trezor wallets, so this method will always return an error. -func (w *trezorWallet) SignHash(acc accounts.Account, hash []byte) ([]byte, error) { - return nil, accounts.ErrNotSupported -} - -// SignTx implements accounts.Wallet. It sends the transaction over to the Trezor -// wallet to request a confirmation from the user. It returns either the signed -// transaction or a failure if the user denied the transaction. -func (w *trezorWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - w.stateLock.RLock() // Comms have own mutex, this is for the state fields - defer w.stateLock.RUnlock() - - // If the wallet is closed, abort - if w.device == nil { - return nil, accounts.ErrWalletClosed - } - // Make sure the requested account is contained within - path, ok := w.paths[account.Address] - if !ok { - return nil, accounts.ErrUnknownAccount - } - // All infos gathered and metadata checks out, request signing - <-w.commsLock - defer func() { w.commsLock <- struct{}{} }() - - // Ensure the device isn't screwed with while user confirmation is pending - // TODO(karalabe): remove if hotplug lands on Windows - w.hub.commsLock.Lock() - w.hub.commsPend++ - w.hub.commsLock.Unlock() - - defer func() { - w.hub.commsLock.Lock() - w.hub.commsPend-- - w.hub.commsLock.Unlock() - }() - - return w.trezorSign(path, account.Address, tx, chainID) -} - -// SignHashWithPassphrase implements accounts.Wallet, however signing arbitrary -// data is not supported for Trezor wallets, so this method will always return -// an error. -func (w *trezorWallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { - return nil, accounts.ErrNotSupported -} - -// SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given -// transaction with the given account using passphrase as extra authentication. -// Since the Trezor does not support extra passphrases, it is silently ignored. -func (w *trezorWallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - return w.SignTx(account, tx, chainID) -} - -// trezorDerive sends a derivation request to the Trezor device and returns the -// Ethereum address located on that path. -func (w *trezorWallet) trezorDerive(derivationPath []uint32) (common.Address, error) { - address := new(trezor.EthereumAddress) - if err := w.trezorExchange(&trezor.EthereumGetAddress{AddressN: derivationPath}, address); err != nil { - return common.Address{}, err - } - return common.BytesToAddress(address.GetAddress()), nil -} - -// trezorSign sends the transaction to the Trezor wallet, and waits for the user -// to confirm or deny the transaction. -func (w *trezorWallet) trezorSign(derivationPath []uint32, address common.Address, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - // Create the transaction initiation message - data := tx.Data() - length := uint32(len(data)) - - request := &trezor.EthereumSignTx{ - AddressN: derivationPath, - Nonce: new(big.Int).SetUint64(tx.Nonce()).Bytes(), - GasPrice: tx.GasPrice().Bytes(), - GasLimit: tx.Gas().Bytes(), - Value: tx.Value().Bytes(), - DataLength: &length, - } - if to := tx.To(); to != nil { - request.To = (*to)[:] // Non contract deploy, set recipient explicitly - } - if length > 1024 { // Send the data chunked if that was requested - request.DataInitialChunk, data = data[:1024], data[1024:] - } else { - request.DataInitialChunk, data = data, nil - } - if chainID != nil { // EIP-155 transaction, set chain ID explicitly (only 32 bit is supported!?) - id := uint32(chainID.Int64()) - request.ChainId = &id - } - // Send the initiation message and stream content until a signature is returned - response := new(trezor.EthereumTxRequest) - if err := w.trezorExchange(request, response); err != nil { - return nil, err - } - for response.DataLength != nil && int(*response.DataLength) <= len(data) { - chunk := data[:*response.DataLength] - data = data[*response.DataLength:] - - if err := w.trezorExchange(&trezor.EthereumTxAck{DataChunk: chunk}, response); err != nil { - return nil, err - } - } - // Extract the Ethereum signature and do a sanity validation - if len(response.GetSignatureR()) == 0 || len(response.GetSignatureS()) == 0 || response.GetSignatureV() == 0 { - return nil, errors.New("reply lacks signature") - } - signature := append(append(response.GetSignatureR(), response.GetSignatureS()...), byte(response.GetSignatureV())) - - // Create the correct signer and signature transform based on the chain ID - var signer types.Signer - if chainID == nil { - signer = new(types.HomesteadSigner) - } else { - signer = types.NewEIP155Signer(chainID) - signature[64] = signature[64] - byte(chainID.Uint64()*2+35) - } - // Inject the final signature into the transaction and sanity check the sender - signed, err := tx.WithSignature(signer, signature) - if err != nil { - return nil, err - } - sender, err := types.Sender(signer, signed) - if err != nil { - return nil, err - } - if sender != address { - return nil, fmt.Errorf("signer mismatch: expected %s, got %s", address.Hex(), sender.Hex()) - } - return signed, nil -} - -// trezorExchange performs a data exchange with the Trezor wallet, sending it a -// message and retrieving the response. -func (w *trezorWallet) trezorExchange(req proto.Message, res proto.Message) error { - // Construct the original message payload to chunk up - data, err := proto.Marshal(req) - if err != nil { - return err - } - payload := make([]byte, 8+len(data)) - copy(payload, []byte{0x23, 0x23}) - binary.BigEndian.PutUint16(payload[2:], trezor.Type(req)) - binary.BigEndian.PutUint32(payload[4:], uint32(len(data))) - copy(payload[8:], data) - - // Stream all the chunks to the device - chunk := make([]byte, 64) - chunk[0] = 0x3f // Report ID magic number - - for len(payload) > 0 { - // Construct the new message to stream, padding with zeroes if needed - if len(payload) > 63 { - copy(chunk[1:], payload[:63]) - payload = payload[63:] - } else { - copy(chunk[1:], payload) - copy(chunk[1+len(payload):], make([]byte, 63-len(payload))) - payload = nil - } - // Send over to the device - w.log.Trace("Data chunk sent to the Trezor", "chunk", hexutil.Bytes(chunk)) - if _, err := w.device.Write(chunk); err != nil { - return err - } - } - // Stream the reply back from the wallet in 64 byte chunks - var ( - kind uint16 - reply []byte - ) - for { - // Read the next chunk from the Trezor wallet - if _, err := io.ReadFull(w.device, chunk); err != nil { - return err - } - w.log.Trace("Data chunk received from the Trezor", "chunk", hexutil.Bytes(chunk)) - - // Make sure the transport header matches - if chunk[0] != 0x3f || (len(reply) == 0 && (chunk[1] != 0x23 || chunk[2] != 0x23)) { - return errReplyInvalidHeader - } - // If it's the first chunk, retrieve the reply message type and total message length - var payload []byte - - if len(reply) == 0 { - kind = binary.BigEndian.Uint16(chunk[3:5]) - reply = make([]byte, 0, int(binary.BigEndian.Uint32(chunk[5:9]))) - payload = chunk[9:] - } else { - payload = chunk[1:] - } - // Append to the reply and stop when filled up - if left := cap(reply) - len(reply); left > len(payload) { - reply = append(reply, payload...) - } else { - reply = append(reply, payload[:left]...) - break - } - } - // Try to parse the reply into the requested reply message - if kind == uint16(trezor.MessageType_MessageType_Failure) { - // Trezor returned a failure, extract and return the message - failure := new(trezor.Failure) - if err := proto.Unmarshal(reply, failure); err != nil { - return err - } - return errors.New("trezor: " + failure.GetMessage()) - } - if kind == uint16(trezor.MessageType_MessageType_ButtonRequest) { - // Trezor is waitinf for user confirmation, ack and wait for the next message - return w.trezorExchange(&trezor.ButtonAck{}, res) - } - if want := trezor.Type(res); kind != want { - return fmt.Errorf("trezor: expected reply type %s, got %s", trezor.Name(want), trezor.Name(kind)) - } - return proto.Unmarshal(reply, res) -} diff --git a/accounts/usbwallet/usbwallet.go b/accounts/usbwallet/usbwallet.go deleted file mode 100644 index 3ed471693f..0000000000 --- a/accounts/usbwallet/usbwallet.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package usbwallet implements support for USB hardware wallets. -package usbwallet - -import "time" - -// deviceID is a combined vendor/product identifier to uniquely identify a USB -// hardware device. -type deviceID struct { - Vendor uint16 // The Vendor identifer - Product uint16 // The Product identifier -} - -// Maximum time between wallet health checks to detect USB unplugs. -const heartbeatCycle = time.Second - -// Minimum time to wait between self derivation attempts, even it the user is -// requesting accounts like crazy. -const selfDeriveThrottling = time.Second diff --git a/accounts/usbwallet/wallet.go b/accounts/usbwallet/wallet.go new file mode 100644 index 0000000000..8b3b5a5224 --- /dev/null +++ b/accounts/usbwallet/wallet.go @@ -0,0 +1,562 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package usbwallet implements support for USB hardware wallets. +package usbwallet + +import ( + "context" + "fmt" + "io" + "math/big" + "sync" + "time" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/karalabe/hid" +) + +// Maximum time between wallet health checks to detect USB unplugs. +const heartbeatCycle = time.Second + +// Minimum time to wait between self derivation attempts, even it the user is +// requesting accounts like crazy. +const selfDeriveThrottling = time.Second + +// driver defines the vendor specific functionality hardware wallets instances +// must implement to allow using them with the wallet lifecycle management. +type driver interface { + // Status returns a textual status to aid the user in the current state of the + // wallet. It also returns an error indicating any failure the wallet might have + // encountered. + Status() (string, error) + + // Open initializes access to a wallet instance. The passphrase parameter may + // or may not be used by the implementation of a particular wallet instance. + Open(device io.ReadWriter, passphrase string) error + + // Close releases any resources held by an open wallet instance. + Close() error + + // Heartbeat performs a sanity check against the hardware wallet to see if it + // is still online and healthy. + Heartbeat() error + + // Derive sends a derivation request to the USB device and returns the Ethereum + // address located on that path. + Derive(path accounts.DerivationPath) (common.Address, error) + + // SignTx sends the transaction to the USB device and waits for the user to confirm + // or deny the transaction. + SignTx(path accounts.DerivationPath, tx *types.Transaction, chainID *big.Int) (common.Address, *types.Transaction, error) +} + +// wallet represents the common functionality shared by all USB hardware +// wallets to prevent reimplementing the same complex maintenance mechanisms +// for different vendors. +type wallet struct { + hub *Hub // USB hub scanning + driver driver // Hardware implementation of the low level device operations + url *accounts.URL // Textual URL uniquely identifying this wallet + + info hid.DeviceInfo // Known USB device infos about the wallet + device *hid.Device // USB device advertising itself as a hardware wallet + + accounts []accounts.Account // List of derive accounts pinned on the hardware wallet + paths map[common.Address]accounts.DerivationPath // Known derivation paths for signing operations + + deriveNextPath accounts.DerivationPath // Next derivation path for account auto-discovery + deriveNextAddr common.Address // Next derived account address for auto-discovery + deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with + deriveReq chan chan struct{} // Channel to request a self-derivation on + deriveQuit chan chan error // Channel to terminate the self-deriver with + + healthQuit chan chan error + + // Locking a hardware wallet is a bit special. Since hardware devices are lower + // performing, any communication with them might take a non negligible amount of + // time. Worse still, waiting for user confirmation can take arbitrarily long, + // but exclusive communication must be upheld during. Locking the entire wallet + // in the mean time however would stall any parts of the system that don't want + // to communicate, just read some state (e.g. list the accounts). + // + // As such, a hardware wallet needs two locks to function correctly. A state + // lock can be used to protect the wallet's software-side internal state, which + // must not be held exlusively during hardware communication. A communication + // lock can be used to achieve exclusive access to the device itself, this one + // however should allow "skipping" waiting for operations that might want to + // use the device, but can live without too (e.g. account self-derivation). + // + // Since we have two locks, it's important to know how to properly use them: + // - Communication requires the `device` to not change, so obtaining the + // commsLock should be done after having a stateLock. + // - Communication must not disable read access to the wallet state, so it + // must only ever hold a *read* lock to stateLock. + commsLock chan struct{} // Mutex (buf=1) for the USB comms without keeping the state locked + stateLock sync.RWMutex // Protects read and write access to the wallet struct fields + + log log.Logger // Contextual logger to tag the base with its id +} + +// URL implements accounts.Wallet, returning the URL of the USB hardware device. +func (w *wallet) URL() accounts.URL { + return *w.url // Immutable, no need for a lock +} + +// Status implements accounts.Wallet, returning a custom status message from the +// underlying vendor-specific hardware wallet implementation. +func (w *wallet) Status() (string, error) { + w.stateLock.RLock() // No device communication, state lock is enough + defer w.stateLock.RUnlock() + + status, failure := w.driver.Status() + if w.device == nil { + return "Closed", failure + } + return status, failure +} + +// Open implements accounts.Wallet, attempting to open a USB connection to the +// hardware wallet. +func (w *wallet) Open(passphrase string) error { + w.stateLock.Lock() // State lock is enough since there's no connection yet at this point + defer w.stateLock.Unlock() + + // If the device was already opened once, refuse to try again + if w.paths != nil { + return accounts.ErrWalletAlreadyOpen + } + // Make sure the actual device connection is done only once + if w.device == nil { + device, err := w.info.Open() + if err != nil { + return err + } + w.device = device + w.commsLock = make(chan struct{}, 1) + w.commsLock <- struct{}{} // Enable lock + } + // Delegate device initialization to the underlying driver + if err := w.driver.Open(w.device, passphrase); err != nil { + return err + } + // Connection successful, start life-cycle management + w.paths = make(map[common.Address]accounts.DerivationPath) + + w.deriveReq = make(chan chan struct{}) + w.deriveQuit = make(chan chan error) + w.healthQuit = make(chan chan error) + + go w.heartbeat() + go w.selfDerive() + + // Notify anyone listening for wallet events that a new device is accessible + go w.hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened}) + + return nil +} + +// heartbeat is a health check loop for the USB wallets to periodically verify +// whether they are still present or if they malfunctioned. +func (w *wallet) heartbeat() { + w.log.Debug("USB wallet health-check started") + defer w.log.Debug("USB wallet health-check stopped") + + // Execute heartbeat checks until termination or error + var ( + errc chan error + err error + ) + for errc == nil && err == nil { + // Wait until termination is requested or the heartbeat cycle arrives + select { + case errc = <-w.healthQuit: + // Termination requested + continue + case <-time.After(heartbeatCycle): + // Heartbeat time + } + // Execute a tiny data exchange to see responsiveness + w.stateLock.RLock() + if w.device == nil { + // Terminated while waiting for the lock + w.stateLock.RUnlock() + continue + } + <-w.commsLock // Don't lock state while resolving version + err = w.driver.Heartbeat() + w.commsLock <- struct{}{} + w.stateLock.RUnlock() + + if err != nil { + w.stateLock.Lock() // Lock state to tear the wallet down + w.close() + w.stateLock.Unlock() + } + // Ignore non hardware related errors + err = nil + } + // In case of error, wait for termination + if err != nil { + w.log.Debug("USB wallet health-check failed", "err", err) + errc = <-w.healthQuit + } + errc <- err +} + +// Close implements accounts.Wallet, closing the USB connection to the device. +func (w *wallet) Close() error { + // Ensure the wallet was opened + w.stateLock.RLock() + hQuit, dQuit := w.healthQuit, w.deriveQuit + w.stateLock.RUnlock() + + // Terminate the health checks + var herr error + if hQuit != nil { + errc := make(chan error) + hQuit <- errc + herr = <-errc // Save for later, we *must* close the USB + } + // Terminate the self-derivations + var derr error + if dQuit != nil { + errc := make(chan error) + dQuit <- errc + derr = <-errc // Save for later, we *must* close the USB + } + // Terminate the device connection + w.stateLock.Lock() + defer w.stateLock.Unlock() + + w.healthQuit = nil + w.deriveQuit = nil + w.deriveReq = nil + + if err := w.close(); err != nil { + return err + } + if herr != nil { + return herr + } + return derr +} + +// close is the internal wallet closer that terminates the USB connection and +// resets all the fields to their defaults. +// +// Note, close assumes the state lock is held! +func (w *wallet) close() error { + // Allow duplicate closes, especially for health-check failures + if w.device == nil { + return nil + } + // Close the device, clear everything, then return + w.device.Close() + w.device = nil + + w.accounts, w.paths = nil, nil + w.driver.Close() + + return nil +} + +// Accounts implements accounts.Wallet, returning the list of accounts pinned to +// the USB hardware wallet. If self-derivation was enabled, the account list is +// periodically expanded based on current chain state. +func (w *wallet) Accounts() []accounts.Account { + // Attempt self-derivation if it's running + reqc := make(chan struct{}, 1) + select { + case w.deriveReq <- reqc: + // Self-derivation request accepted, wait for it + <-reqc + default: + // Self-derivation offline, throttled or busy, skip + } + // Return whatever account list we ended up with + w.stateLock.RLock() + defer w.stateLock.RUnlock() + + cpy := make([]accounts.Account, len(w.accounts)) + copy(cpy, w.accounts) + return cpy +} + +// selfDerive is an account derivation loop that upon request attempts to find +// new non-zero accounts. +func (w *wallet) selfDerive() { + w.log.Debug("USB wallet self-derivation started") + defer w.log.Debug("USB wallet self-derivation stopped") + + // Execute self-derivations until termination or error + var ( + reqc chan struct{} + errc chan error + err error + ) + for errc == nil && err == nil { + // Wait until either derivation or termination is requested + select { + case errc = <-w.deriveQuit: + // Termination requested + continue + case reqc = <-w.deriveReq: + // Account discovery requested + } + // Derivation needs a chain and device access, skip if either unavailable + w.stateLock.RLock() + if w.device == nil || w.deriveChain == nil { + w.stateLock.RUnlock() + reqc <- struct{}{} + continue + } + select { + case <-w.commsLock: + default: + w.stateLock.RUnlock() + reqc <- struct{}{} + continue + } + // Device lock obtained, derive the next batch of accounts + var ( + accs []accounts.Account + paths []accounts.DerivationPath + + nextAddr = w.deriveNextAddr + nextPath = w.deriveNextPath + + context = context.Background() + ) + for empty := false; !empty; { + // Retrieve the next derived Ethereum account + if nextAddr == (common.Address{}) { + if nextAddr, err = w.driver.Derive(nextPath); err != nil { + w.log.Warn("USB wallet account derivation failed", "err", err) + break + } + } + // Check the account's status against the current chain state + var ( + balance *big.Int + nonce uint64 + ) + balance, err = w.deriveChain.BalanceAt(context, nextAddr, nil) + if err != nil { + w.log.Warn("USB wallet balance retrieval failed", "err", err) + break + } + nonce, err = w.deriveChain.NonceAt(context, nextAddr, nil) + if err != nil { + w.log.Warn("USB wallet nonce retrieval failed", "err", err) + break + } + // If the next account is empty, stop self-derivation, but add it nonetheless + if balance.Sign() == 0 && nonce == 0 { + empty = true + } + // We've just self-derived a new account, start tracking it locally + path := make(accounts.DerivationPath, len(nextPath)) + copy(path[:], nextPath[:]) + paths = append(paths, path) + + account := accounts.Account{ + Address: nextAddr, + URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, + } + accs = append(accs, account) + + // Display a log message to the user for new (or previously empty accounts) + if _, known := w.paths[nextAddr]; !known || (!empty && nextAddr == w.deriveNextAddr) { + w.log.Info("USB wallet discovered new account", "address", nextAddr, "path", path, "balance", balance, "nonce", nonce) + } + // Fetch the next potential account + if !empty { + nextAddr = common.Address{} + nextPath[len(nextPath)-1]++ + } + } + // Self derivation complete, release device lock + w.commsLock <- struct{}{} + w.stateLock.RUnlock() + + // Insert any accounts successfully derived + w.stateLock.Lock() + for i := 0; i < len(accs); i++ { + if _, ok := w.paths[accs[i].Address]; !ok { + w.accounts = append(w.accounts, accs[i]) + w.paths[accs[i].Address] = paths[i] + } + } + // Shift the self-derivation forward + // TODO(karalabe): don't overwrite changes from wallet.SelfDerive + w.deriveNextAddr = nextAddr + w.deriveNextPath = nextPath + w.stateLock.Unlock() + + // Notify the user of termination and loop after a bit of time (to avoid trashing) + reqc <- struct{}{} + if err == nil { + select { + case errc = <-w.deriveQuit: + // Termination requested, abort + case <-time.After(selfDeriveThrottling): + // Waited enough, willing to self-derive again + } + } + } + // In case of error, wait for termination + if err != nil { + w.log.Debug("USB wallet self-derivation failed", "err", err) + errc = <-w.deriveQuit + } + errc <- err +} + +// Contains implements accounts.Wallet, returning whether a particular account is +// or is not pinned into this wallet instance. Although we could attempt to resolve +// unpinned accounts, that would be an non-negligible hardware operation. +func (w *wallet) Contains(account accounts.Account) bool { + w.stateLock.RLock() + defer w.stateLock.RUnlock() + + _, exists := w.paths[account.Address] + return exists +} + +// Derive implements accounts.Wallet, deriving a new account at the specific +// derivation path. If pin is set to true, the account will be added to the list +// of tracked accounts. +func (w *wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + // Try to derive the actual account and update its URL if successful + w.stateLock.RLock() // Avoid device disappearing during derivation + + if w.device == nil { + w.stateLock.RUnlock() + return accounts.Account{}, accounts.ErrWalletClosed + } + <-w.commsLock // Avoid concurrent hardware access + address, err := w.driver.Derive(path) + w.commsLock <- struct{}{} + + w.stateLock.RUnlock() + + // If an error occurred or no pinning was requested, return + if err != nil { + return accounts.Account{}, err + } + account := accounts.Account{ + Address: address, + URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, + } + if !pin { + return account, nil + } + // Pinning needs to modify the state + w.stateLock.Lock() + defer w.stateLock.Unlock() + + if _, ok := w.paths[address]; !ok { + w.accounts = append(w.accounts, account) + w.paths[address] = path + } + return account, nil +} + +// SelfDerive implements accounts.Wallet, trying to discover accounts that the +// user used previously (based on the chain state), but ones that he/she did not +// explicitly pin to the wallet manually. To avoid chain head monitoring, self +// derivation only runs during account listing (and even then throttled). +func (w *wallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) { + w.stateLock.Lock() + defer w.stateLock.Unlock() + + w.deriveNextPath = make(accounts.DerivationPath, len(base)) + copy(w.deriveNextPath[:], base[:]) + + w.deriveNextAddr = common.Address{} + w.deriveChain = chain +} + +// SignHash implements accounts.Wallet, however signing arbitrary data is not +// supported for hardware wallets, so this method will always return an error. +func (w *wallet) SignHash(account accounts.Account, hash []byte) ([]byte, error) { + return nil, accounts.ErrNotSupported +} + +// SignTx implements accounts.Wallet. It sends the transaction over to the Ledger +// wallet to request a confirmation from the user. It returns either the signed +// transaction or a failure if the user denied the transaction. +// +// Note, if the version of the Ethereum application running on the Ledger wallet is +// too old to sign EIP-155 transactions, but such is requested nonetheless, an error +// will be returned opposed to silently signing in Homestead mode. +func (w *wallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + w.stateLock.RLock() // Comms have own mutex, this is for the state fields + defer w.stateLock.RUnlock() + + // If the wallet is closed, abort + if w.device == nil { + return nil, accounts.ErrWalletClosed + } + // Make sure the requested account is contained within + path, ok := w.paths[account.Address] + if !ok { + return nil, accounts.ErrUnknownAccount + } + // All infos gathered and metadata checks out, request signing + <-w.commsLock + defer func() { w.commsLock <- struct{}{} }() + + // Ensure the device isn't screwed with while user confirmation is pending + // TODO(karalabe): remove if hotplug lands on Windows + w.hub.commsLock.Lock() + w.hub.commsPend++ + w.hub.commsLock.Unlock() + + defer func() { + w.hub.commsLock.Lock() + w.hub.commsPend-- + w.hub.commsLock.Unlock() + }() + // Sign the transaction and verify the sender to avoid hardware fault surprises + sender, signed, err := w.driver.SignTx(path, tx, chainID) + if err != nil { + return nil, err + } + if sender != account.Address { + return nil, fmt.Errorf("signer mismatch: expected %s, got %s", account.Address.Hex(), sender.Hex()) + } + return signed, nil +} + +// SignHashWithPassphrase implements accounts.Wallet, however signing arbitrary +// data is not supported for Ledger wallets, so this method will always return +// an error. +func (w *wallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { + return w.SignHash(account, hash) +} + +// SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given +// transaction with the given account using passphrase as extra authentication. +// Since USB wallets don't rely on passphrases, these are silently ignored. +func (w *wallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + return w.SignTx(account, tx, chainID) +} diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 257cb22310..34d1d84065 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -251,7 +251,9 @@ func startNode(ctx *cli.Context, stack *node.Node) { log.Warn("New wallet appeared, failed to open", "url", event.Wallet.URL(), "err", err) } case accounts.WalletOpened: - log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", event.Wallet.Status()) + status, _ := event.Wallet.Status() + log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status) + if event.Wallet.URL().Scheme == "ledger" { event.Wallet.SelfDerive(accounts.DefaultLedgerBaseDerivationPath, stateReader) } else { diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 6b9c151cfc..c3924b93a7 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -230,18 +230,25 @@ func (s *PrivateAccountAPI) ListAccounts() []common.Address { type rawWallet struct { URL string `json:"url"` Status string `json:"status"` - Accounts []accounts.Account `json:"accounts"` + Failure string `json:"failure,omitempty"` + Accounts []accounts.Account `json:"accounts,omitempty"` } // ListWallets will return a list of wallets this node manages. func (s *PrivateAccountAPI) ListWallets() []rawWallet { wallets := make([]rawWallet, 0) // return [] instead of nil if empty for _, wallet := range s.am.Wallets() { - wallets = append(wallets, rawWallet{ + status, failure := wallet.Status() + + raw := rawWallet{ URL: wallet.URL().String(), - Status: wallet.Status(), + Status: status, Accounts: wallet.Accounts(), - }) + } + if failure != nil { + raw.Failure = failure.Error() + } + wallets = append(wallets, raw) } return wallets } From 6a56b15019271f5a16406c7e1be50d581f8efcab Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 10 Aug 2017 11:38:17 +0200 Subject: [PATCH 072/272] tests: update tests, use blockchain test "network" field Blockchain tests now include the "network" which determines the chain config to use. Remove config matching based on test name and share the name-to-config index with state tests. Byzantium/Constantinople tests are still skipped because most of them fail anyway. --- tests/block_test.go | 55 +++++-------------------- tests/block_test_util.go | 8 +++- tests/init.go | 88 ++++++++++++++++++++++++++++++++++++++++ tests/state_test.go | 8 ++-- tests/state_test_util.go | 35 +--------------- tests/testdata | 2 +- 6 files changed, 111 insertions(+), 85 deletions(-) create mode 100644 tests/init.go diff --git a/tests/block_test.go b/tests/block_test.go index 3245aca7db..6fc66b17cc 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -17,10 +17,7 @@ package tests import ( - "math/big" "testing" - - "github.com/ethereum/go-ethereum/params" ) func TestBlockchain(t *testing.T) { @@ -30,51 +27,19 @@ func TestBlockchain(t *testing.T) { // General state tests are 'exported' as blockchain tests, but we can run them natively. bt.skipLoad(`^GeneralStateTests/`) // Skip random failures due to selfish mining test. - bt.skipLoad(`bcForkUncle\.json/ForkUncle`) - bt.skipLoad(`^bcMultiChainTest\.json/ChainAtoChainB_blockorder`) - bt.skipLoad(`^bcTotalDifficultyTest\.json/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)$`) - bt.skipLoad(`^bcMultiChainTest\.json/CallContractFromNotBestBlock`) + bt.skipLoad(`^bcForgedTest/bcForkUncle\.json`) + bt.skipLoad(`^bcMultiChainTest/(ChainAtoChainB_blockorder|CallContractFromNotBestBlock)`) + bt.skipLoad(`^bcTotalDifficultyTest/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)`) + // Constantinople is not implemented yet. + bt.skipLoad(`(?i)(constantinople)`) // Expected failures: - bt.fails(`(?i)metropolis`, "metropolis is not supported yet") - bt.fails(`^TestNetwork/bcTheDaoTest\.json/(DaoTransactions$|DaoTransactions_UncleExtradata$)`, "issue in test") - - bt.config(`^TestNetwork/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(5), - DAOForkBlock: big.NewInt(8), - DAOForkSupport: true, - EIP150Block: big.NewInt(10), - EIP155Block: big.NewInt(10), - EIP158Block: big.NewInt(14), - // MetropolisBlock: big.NewInt(16), - }) - bt.config(`^RandomTests/.*EIP150`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - }) - bt.config(`^RandomTests/.*EIP158`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - }) - bt.config(`^RandomTests/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(10), - }) - bt.config(`^Homestead/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - }) - bt.config(`^EIP150/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - }) - bt.config(`^[^/]+\.json`, params.ChainConfig{ - HomesteadBlock: big.NewInt(1000000), - }) + bt.fails("^TransitionTests/bcEIP158ToByzantium", "byzantium not supported") + bt.fails(`^TransitionTests/bcHomesteadToDao/DaoTransactions(|_UncleExtradata|_EmptyTransactionAndForkBlocksAhead)\.json`, "issue in test") + bt.fails(`^bc(Exploit|Fork|Gas|Multi|Total|State|Random|Uncle|Valid|Wallet).*_Byzantium$`, "byzantium not supported") + bt.fails(`^bcBlockGasLimitTest/(BlockGasLimit2p63m1|TransactionGasHigherThanLimit2p63m1|SuicideTransaction|GasUsedHigherThanBlockGasLimitButNotWithRefundsSuicideFirst|TransactionGasHigherThanLimit2p63m1_2).*_Byzantium$`, "byzantium not supported") bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { - cfg := bt.findConfig(name) - if err := bt.checkFailure(t, name, test.Run(cfg)); err != nil { + if err := bt.checkFailure(t, name, test.Run()); err != nil { t.Error(err) } }) diff --git a/tests/block_test_util.go b/tests/block_test_util.go index a74f7d68dd..c1d433ff39 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -53,6 +53,7 @@ type btJSON struct { Pre core.GenesisAlloc `json:"pre"` Post core.GenesisAlloc `json:"postState"` BestBlock common.UnprefixedHash `json:"lastblockhash"` + Network string `json:"network"` } type btBlock struct { @@ -91,7 +92,12 @@ type btHeaderMarshaling struct { Timestamp *math.HexOrDecimal256 } -func (t *BlockTest) Run(config *params.ChainConfig) error { +func (t *BlockTest) Run() error { + config, ok := Forks[t.json.Network] + if !ok { + return UnsupportedForkError{t.json.Network} + } + // import pre accounts & construct test genesis block & state root db, _ := ethdb.NewMemDatabase() gblock, err := t.genesis(config).Commit(db) diff --git a/tests/init.go b/tests/init.go new file mode 100644 index 0000000000..0c3fe61d13 --- /dev/null +++ b/tests/init.go @@ -0,0 +1,88 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package tests + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/params" +) + +// This table defines supported forks and their chain config. +var Forks = map[string]*params.ChainConfig{ + "Frontier": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + }, + "Homestead": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + }, + "EIP150": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + }, + "EIP158": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + }, + "Byzantium": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + MetropolisBlock: big.NewInt(0), + }, + "FrontierToHomesteadAt5": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(5), + }, + "HomesteadToEIP150At5": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(5), + }, + "HomesteadToDaoAt5": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: big.NewInt(5), + DAOForkSupport: true, + }, + "EIP158ToByzantiumAt5": ¶ms.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + MetropolisBlock: big.NewInt(5), + }, +} + +// UnsupportedForkError is returned when a test requests a fork that isn't implemented. +type UnsupportedForkError struct { + Name string +} + +func (e UnsupportedForkError) Error() string { + return fmt.Sprintf("unsupported fork %q", e.Name) +} diff --git a/tests/state_test.go b/tests/state_test.go index e4e691589e..ab6dc423f9 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -33,11 +33,9 @@ func TestState(t *testing.T) { st.skipShortMode(`^stQuadraticComplexityTest/`) // Broken tests: st.skipLoad(`^stTransactionTest/OverflowGasRequire\.json`) // gasLimit > 256 bits - st.skipLoad(`^stStackTests/shallowStackOK\.json`) // bad hex encoding st.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\.json`) // EIP-86 is not supported yet // Expected failures: - st.fails(`^stCallCreateCallCodeTest/createJS_ExampleContract\.json`, "bug in test") - st.fails(`^stCodeSizeLimit/codesizeOOGInvalidSize\.json/(Frontier|Homestead)`, + st.fails(`^stCodeSizeLimit/codesizeOOGInvalidSize\.json/(Frontier|Homestead|EIP150)`, "code size limit implementation is not conditional on fork") st.fails(`^stRevertTest/RevertDepthCreateAddressCollision\.json/EIP15[08]/[67]`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") @@ -49,8 +47,8 @@ func TestState(t *testing.T) { key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) name := name + "/" + key t.Run(key, func(t *testing.T) { - if subtest.Fork == "Metropolis" { - t.Skip("metropolis not supported yet") + if subtest.Fork == "Constantinople" || subtest.Fork == "Byzantium" { + t.Skip("constantinople, byzantium not supported yet") } withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { return st.checkFailure(t, name, test.Run(subtest, vmconfig)) diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 5c7ed5d67c..2bf940bab7 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -37,37 +37,6 @@ import ( "github.com/ethereum/go-ethereum/params" ) -// This table defines supported forks and their chain config. -var stateTestForks = map[string]*params.ChainConfig{ - "Frontier": ¶ms.ChainConfig{ - ChainId: big.NewInt(1), - }, - "Homestead": ¶ms.ChainConfig{ - HomesteadBlock: big.NewInt(0), - ChainId: big.NewInt(1), - }, - "EIP150": ¶ms.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - ChainId: big.NewInt(1), - }, - "EIP158": ¶ms.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ChainId: big.NewInt(1), - }, - "Metropolis": ¶ms.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - MetropolisBlock: big.NewInt(0), - ChainId: big.NewInt(1), - }, -} - // StateTest checks transaction processing without block context. // See https://github.com/ethereum/EIPs/issues/176 for the test format specification. type StateTest struct { @@ -167,9 +136,9 @@ func (t *StateTest) Subtests() []StateSubtest { // Run executes a specific subtest. func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) error { - config, ok := stateTestForks[subtest.Fork] + config, ok := Forks[subtest.Fork] if !ok { - return fmt.Errorf("no config for fork %q", subtest.Fork) + return UnsupportedForkError{subtest.Fork} } block, _ := t.genesis(config).ToBlock() db, _ := ethdb.NewMemDatabase() diff --git a/tests/testdata b/tests/testdata index f1de8c3b7f..815151e4ce 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit f1de8c3b7fa2c2c0aa281b6b3a1ad7010356c5ff +Subproject commit 815151e4cea4e73328f8586b4e61c3d7e1e9e543 From 73c5aba21fcca1bf1f78e94d88920fde6762be9e Mon Sep 17 00:00:00 2001 From: gary rong Date: Fri, 11 Aug 2017 18:41:49 +0800 Subject: [PATCH 073/272] ethdb: return copied value from MemDatabase.Get (#14958) --- ethdb/database_test.go | 15 +++++++++++++++ ethdb/memory_database.go | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ethdb/database_test.go b/ethdb/database_test.go index 4740cdaedd..5e4a3ca34a 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -94,6 +94,21 @@ func testPutGet(db ethdb.Database, t *testing.T) { } } + for _, v := range test_values { + orig, err := db.Get([]byte(v)) + if err != nil { + t.Fatalf("get failed: %v", err) + } + orig[0] = byte(0xff) + data, err := db.Get([]byte(v)) + if err != nil { + t.Fatalf("get failed: %v", err) + } + if !bytes.Equal(data, []byte("?")) { + t.Fatalf("get returned wrong result, got %q expected ?", string(data)) + } + } + for _, v := range test_values { err := db.Delete([]byte(v)) if err != nil { diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index a2ee2f2ccd..11b0937248 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -50,7 +50,7 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) { defer db.lock.RUnlock() if entry, ok := db.db[string(key)]; ok { - return entry, nil + return common.CopyBytes(entry), nil } return nil, errors.New("not found") } From 2b422b1a47e9b2a0f3d7ecf7063eef2e59cc082e Mon Sep 17 00:00:00 2001 From: Maximilian Meister Date: Fri, 11 Aug 2017 13:29:05 +0200 Subject: [PATCH 074/272] cmd/geth, cmd/swarm: sort commands and flags by name (#3462) --- cmd/geth/main.go | 2 + cmd/swarm/main.go | 2 + vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md | 43 ++++++++++++++ vendor/gopkg.in/urfave/cli.v1/README.md | 33 ++++++++--- vendor/gopkg.in/urfave/cli.v1/app.go | 7 ++- vendor/gopkg.in/urfave/cli.v1/appveyor.yml | 10 ++-- vendor/gopkg.in/urfave/cli.v1/cli.go | 1 + vendor/gopkg.in/urfave/cli.v1/command.go | 44 +++++++++----- vendor/gopkg.in/urfave/cli.v1/context.go | 2 + vendor/gopkg.in/urfave/cli.v1/errors.go | 23 +++++--- vendor/gopkg.in/urfave/cli.v1/flag.go | 12 ++-- vendor/gopkg.in/urfave/cli.v1/help.go | 68 ++++++++++++++++++---- vendor/vendor.json | 6 +- 13 files changed, 197 insertions(+), 56 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 58e9498060..66958e34d5 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -21,6 +21,7 @@ import ( "fmt" "os" "runtime" + "sort" "strings" "time" @@ -165,6 +166,7 @@ func init() { // See config.go dumpConfigCommand, } + sort.Sort(cli.CommandsByName(app.Commands)) app.Flags = append(app.Flags, nodeFlags...) app.Flags = append(app.Flags, rpcFlags...) diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go index 449d11f36b..603fd9b941 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -25,6 +25,7 @@ import ( "os" "os/signal" "runtime" + "sort" "strconv" "strings" "syscall" @@ -302,6 +303,7 @@ DEPRECATED: use 'swarm db clean'. `, }, } + sort.Sort(cli.CommandsByName(app.Commands)) app.Flags = []cli.Flag{ utils.IdentityFlag, diff --git a/vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md b/vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md index 07f75464b4..401eae5a2c 100644 --- a/vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md +++ b/vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md @@ -4,6 +4,49 @@ ## [Unreleased] +## 1.20.0 - 2017-08-10 + +### Fixed + +* `HandleExitCoder` is now correctly iterates over all errors in + a `MultiError`. The exit code is the exit code of the last error or `1` if + there are no `ExitCoder`s in the `MultiError`. +* Fixed YAML file loading on Windows (previously would fail validate the file path) +* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly + propogated +* `ErrWriter` is now passed downwards through command structure to avoid the + need to redefine it +* Pass `Command` context into `OnUsageError` rather than parent context so that + all fields are avaiable +* Errors occuring in `Before` funcs are no longer double printed +* Use `UsageText` in the help templates for commands and subcommands if + defined; otherwise build the usage as before (was previously ignoring this + field) +* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if + a program calls `Set` or `GlobalSet` directly after flag parsing (would + previously only return `true` if the flag was set during parsing) + +### Changed + +* No longer exit the program on command/subcommand error if the error raised is + not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was + determined to be a regression in functionality. See [the + PR](https://github.com/urfave/cli/pull/595) for discussion. + +### Added + +* `CommandsByName` type was added to make it easy to sort `Command`s by name, + alphabetically +* `altsrc` now handles loading of string and int arrays from TOML +* Support for definition of custom help templates for `App` via + `CustomAppHelpTemplate` +* Support for arbitrary key/value fields on `App` to be used with + `CustomAppHelpTemplate` via `ExtraInfo` +* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be + `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` + interface to be used. + + ## [1.19.1] - 2016-11-21 ### Fixed diff --git a/vendor/gopkg.in/urfave/cli.v1/README.md b/vendor/gopkg.in/urfave/cli.v1/README.md index bb5f61eafd..2bbbd8ea97 100644 --- a/vendor/gopkg.in/urfave/cli.v1/README.md +++ b/vendor/gopkg.in/urfave/cli.v1/README.md @@ -455,13 +455,13 @@ error. Flags for the application and commands are shown in the order they are defined. However, it's possible to sort them from outside this library by using `FlagsByName` -with `sort`. +or `CommandsByName` with `sort`. For example this: ``` go package main @@ -488,7 +488,27 @@ func main() { }, } + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + } + sort.Sort(cli.FlagsByName(app.Flags)) + sort.Sort(cli.CommandsByName(app.Commands)) app.Run(os.Args) } @@ -940,16 +960,13 @@ SUPPORT: support@awesometown.example.com cli.AppHelpTemplate = `NAME: {{.Name}} - {{.Usage}} USAGE: - {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command -[command options]{{end}} {{if -.ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} + {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} {{if len .Authors}} -AUTHOR(S): +AUTHOR: {{range .Authors}}{{ . }}{{end}} {{end}}{{if .Commands}} COMMANDS: -{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t" -}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} +{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} GLOBAL OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}}{{if .Copyright }} diff --git a/vendor/gopkg.in/urfave/cli.v1/app.go b/vendor/gopkg.in/urfave/cli.v1/app.go index 95ffc0b976..51fc45d878 100644 --- a/vendor/gopkg.in/urfave/cli.v1/app.go +++ b/vendor/gopkg.in/urfave/cli.v1/app.go @@ -85,6 +85,12 @@ type App struct { ErrWriter io.Writer // Other custom info Metadata map[string]interface{} + // Carries a function which returns app specific info. + ExtraInfo func() map[string]string + // CustomAppHelpTemplate the text template for app help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomAppHelpTemplate string didSetup bool } @@ -234,7 +240,6 @@ func (a *App) Run(arguments []string) (err error) { if a.Before != nil { beforeErr := a.Before(context) if beforeErr != nil { - fmt.Fprintf(a.Writer, "%v\n\n", beforeErr) ShowAppHelp(context) HandleExitCoder(beforeErr) err = beforeErr diff --git a/vendor/gopkg.in/urfave/cli.v1/appveyor.yml b/vendor/gopkg.in/urfave/cli.v1/appveyor.yml index 698b188e12..1e1489c365 100644 --- a/vendor/gopkg.in/urfave/cli.v1/appveyor.yml +++ b/vendor/gopkg.in/urfave/cli.v1/appveyor.yml @@ -1,14 +1,16 @@ version: "{build}" -os: Windows Server 2012 R2 +os: Windows Server 2016 + +image: Visual Studio 2017 clone_folder: c:\gopath\src\github.com\urfave\cli environment: GOPATH: C:\gopath - GOVERSION: 1.6 - PYTHON: C:\Python27-x64 - PYTHON_VERSION: 2.7.x + GOVERSION: 1.8.x + PYTHON: C:\Python36-x64 + PYTHON_VERSION: 3.6.x PYTHON_ARCH: 64 install: diff --git a/vendor/gopkg.in/urfave/cli.v1/cli.go b/vendor/gopkg.in/urfave/cli.v1/cli.go index 74fd101f45..90c07eb8ef 100644 --- a/vendor/gopkg.in/urfave/cli.v1/cli.go +++ b/vendor/gopkg.in/urfave/cli.v1/cli.go @@ -12,6 +12,7 @@ // app.Usage = "say a greeting" // app.Action = func(c *cli.Context) error { // println("Greetings") +// return nil // } // // app.Run(os.Args) diff --git a/vendor/gopkg.in/urfave/cli.v1/command.go b/vendor/gopkg.in/urfave/cli.v1/command.go index 2628fbf48a..23de2944be 100644 --- a/vendor/gopkg.in/urfave/cli.v1/command.go +++ b/vendor/gopkg.in/urfave/cli.v1/command.go @@ -59,6 +59,25 @@ type Command struct { // Full name of command for help, defaults to full command name, including parent commands. HelpName string commandNamePath []string + + // CustomHelpTemplate the text template for the command help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomHelpTemplate string +} + +type CommandsByName []Command + +func (c CommandsByName) Len() int { + return len(c) +} + +func (c CommandsByName) Less(i, j int) bool { + return c[i].Name < c[j].Name +} + +func (c CommandsByName) Swap(i, j int) { + c[i], c[j] = c[j], c[i] } // FullName returns the full name of the command. @@ -140,19 +159,20 @@ func (c Command) Run(ctx *Context) (err error) { } context := NewContext(ctx.App, set, ctx) + context.Command = c if checkCommandCompletions(context, c.Name) { return nil } if err != nil { if c.OnUsageError != nil { - err := c.OnUsageError(ctx, err, false) + err := c.OnUsageError(context, err, false) HandleExitCoder(err) return err } - fmt.Fprintln(ctx.App.Writer, "Incorrect Usage:", err.Error()) - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) + fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) + fmt.Fprintln(context.App.Writer) + ShowCommandHelp(context, c.Name) return err } @@ -177,9 +197,7 @@ func (c Command) Run(ctx *Context) (err error) { if c.Before != nil { err = c.Before(context) if err != nil { - fmt.Fprintln(ctx.App.Writer, err) - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) + ShowCommandHelp(context, c.Name) HandleExitCoder(err) return err } @@ -189,7 +207,6 @@ func (c Command) Run(ctx *Context) (err error) { c.Action = helpSubcommand.Action } - context.Command = c err = HandleAction(c.Action, context) if err != nil { @@ -230,14 +247,13 @@ func (c Command) startApp(ctx *Context) error { app.HelpName = app.Name } - if c.Description != "" { - app.Usage = c.Description - } else { - app.Usage = c.Usage - } + app.Usage = c.Usage + app.Description = c.Description + app.ArgsUsage = c.ArgsUsage // set CommandNotFound app.CommandNotFound = ctx.App.CommandNotFound + app.CustomAppHelpTemplate = c.CustomHelpTemplate // set the flags and commands app.Commands = c.Subcommands @@ -250,6 +266,7 @@ func (c Command) startApp(ctx *Context) error { app.Author = ctx.App.Author app.Email = ctx.App.Email app.Writer = ctx.App.Writer + app.ErrWriter = ctx.App.ErrWriter app.categories = CommandCategories{} for _, command := range c.Subcommands { @@ -272,6 +289,7 @@ func (c Command) startApp(ctx *Context) error { } else { app.Action = helpSubcommand.Action } + app.OnUsageError = c.OnUsageError for index, cc := range app.Commands { app.Commands[index].commandNamePath = []string{c.Name, cc.Name} diff --git a/vendor/gopkg.in/urfave/cli.v1/context.go b/vendor/gopkg.in/urfave/cli.v1/context.go index cb89e92a08..db94191e2a 100644 --- a/vendor/gopkg.in/urfave/cli.v1/context.go +++ b/vendor/gopkg.in/urfave/cli.v1/context.go @@ -39,11 +39,13 @@ func (c *Context) NumFlags() int { // Set sets a context flag to a value. func (c *Context) Set(name, value string) error { + c.setFlags = nil return c.flagSet.Set(name, value) } // GlobalSet sets a context flag to a value on the global flagset func (c *Context) GlobalSet(name, value string) error { + globalContext(c).setFlags = nil return globalContext(c).flagSet.Set(name, value) } diff --git a/vendor/gopkg.in/urfave/cli.v1/errors.go b/vendor/gopkg.in/urfave/cli.v1/errors.go index 0206ff4911..562b2953cf 100644 --- a/vendor/gopkg.in/urfave/cli.v1/errors.go +++ b/vendor/gopkg.in/urfave/cli.v1/errors.go @@ -74,7 +74,7 @@ func (ee *ExitError) ExitCode() int { // HandleExitCoder checks if the error fulfills the ExitCoder interface, and if // so prints the error to stderr (if it is non-empty) and calls OsExiter with the // given exit code. If the given error is a MultiError, then this func is -// called on all members of the Errors slice. +// called on all members of the Errors slice and calls OsExiter with the last exit code. func HandleExitCoder(err error) { if err == nil { return @@ -93,18 +93,23 @@ func HandleExitCoder(err error) { } if multiErr, ok := err.(MultiError); ok { - for _, merr := range multiErr.Errors { - HandleExitCoder(merr) - } + code := handleMultiError(multiErr) + OsExiter(code) return } +} - if err.Error() != "" { - if _, ok := err.(ErrorFormatter); ok { - fmt.Fprintf(ErrWriter, "%+v\n", err) +func handleMultiError(multiErr MultiError) int { + code := 1 + for _, merr := range multiErr.Errors { + if multiErr2, ok := merr.(MultiError); ok { + code = handleMultiError(multiErr2) } else { - fmt.Fprintln(ErrWriter, err) + fmt.Fprintln(ErrWriter, merr) + if exitErr, ok := merr.(ExitCoder); ok { + code = exitErr.ExitCode() + } } } - OsExiter(1) + return code } diff --git a/vendor/gopkg.in/urfave/cli.v1/flag.go b/vendor/gopkg.in/urfave/cli.v1/flag.go index 7dd8a2c4ab..877ff3523d 100644 --- a/vendor/gopkg.in/urfave/cli.v1/flag.go +++ b/vendor/gopkg.in/urfave/cli.v1/flag.go @@ -14,13 +14,13 @@ import ( const defaultPlaceholder = "value" // BashCompletionFlag enables bash-completion for all commands and subcommands -var BashCompletionFlag = BoolFlag{ +var BashCompletionFlag Flag = BoolFlag{ Name: "generate-bash-completion", Hidden: true, } // VersionFlag prints the version for the application -var VersionFlag = BoolFlag{ +var VersionFlag Flag = BoolFlag{ Name: "version, v", Usage: "print the version", } @@ -28,7 +28,7 @@ var VersionFlag = BoolFlag{ // HelpFlag prints the help for all commands and subcommands // Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand // unless HideHelp is set to true) -var HelpFlag = BoolFlag{ +var HelpFlag Flag = BoolFlag{ Name: "help, h", Usage: "show help", } @@ -630,7 +630,8 @@ func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { func visibleFlags(fl []Flag) []Flag { visible := []Flag{} for _, flag := range fl { - if !flagValue(flag).FieldByName("Hidden").Bool() { + field := flagValue(flag).FieldByName("Hidden") + if !field.IsValid() || !field.Bool() { visible = append(visible, flag) } } @@ -723,9 +724,8 @@ func stringifyFlag(f Flag) string { needsPlaceholder := false defaultValueString := "" - val := fv.FieldByName("Value") - if val.IsValid() { + if val := fv.FieldByName("Value"); val.IsValid() { needsPlaceholder = true defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) diff --git a/vendor/gopkg.in/urfave/cli.v1/help.go b/vendor/gopkg.in/urfave/cli.v1/help.go index c8c1aee057..57ec98d58a 100644 --- a/vendor/gopkg.in/urfave/cli.v1/help.go +++ b/vendor/gopkg.in/urfave/cli.v1/help.go @@ -47,7 +47,7 @@ var CommandHelpTemplate = `NAME: {{.HelpName}} - {{.Usage}} USAGE: - {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}} + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} CATEGORY: {{.Category}}{{end}}{{if .Description}} @@ -64,10 +64,10 @@ OPTIONS: // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var SubcommandHelpTemplate = `NAME: - {{.HelpName}} - {{.Usage}} + {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} USAGE: - {{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}} COMMANDS:{{range .VisibleCategories}}{{if .Name}} {{.Name}}:{{end}}{{range .VisibleCommands}} @@ -112,17 +112,42 @@ var helpSubcommand = Command{ // Prints help for the App or Command type helpPrinter func(w io.Writer, templ string, data interface{}) +// Prints help for the App or Command with custom template function. +type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{}) + // HelpPrinter is a function that writes the help output. If not set a default // is used. The function signature is: // func(w io.Writer, templ string, data interface{}) var HelpPrinter helpPrinter = printHelp +// HelpPrinterCustom is same as HelpPrinter but +// takes a custom function for template function map. +var HelpPrinterCustom helpPrinterCustom = printHelpCustom + // VersionPrinter prints the version for the App var VersionPrinter = printVersion +// ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code. +func ShowAppHelpAndExit(c *Context, exitCode int) { + ShowAppHelp(c) + os.Exit(exitCode) +} + // ShowAppHelp is an action that displays the help. -func ShowAppHelp(c *Context) error { - HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) +func ShowAppHelp(c *Context) (err error) { + if c.App.CustomAppHelpTemplate == "" { + HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) + return + } + customAppData := func() map[string]interface{} { + if c.App.ExtraInfo == nil { + return nil + } + return map[string]interface{}{ + "ExtraInfo": c.App.ExtraInfo, + } + } + HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData()) return nil } @@ -138,6 +163,12 @@ func DefaultAppComplete(c *Context) { } } +// ShowCommandHelpAndExit - exits with code after showing help +func ShowCommandHelpAndExit(c *Context, command string, code int) { + ShowCommandHelp(c, command) + os.Exit(code) +} + // ShowCommandHelp prints help for the given command func ShowCommandHelp(ctx *Context, command string) error { // show the subcommand help for a command with subcommands @@ -148,7 +179,11 @@ func ShowCommandHelp(ctx *Context, command string) error { for _, c := range ctx.App.Commands { if c.HasName(command) { - HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) + if c.CustomHelpTemplate != "" { + HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil) + } else { + HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) + } return nil } } @@ -191,10 +226,15 @@ func ShowCommandCompletions(ctx *Context, command string) { } } -func printHelp(out io.Writer, templ string, data interface{}) { +func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) { funcMap := template.FuncMap{ "join": strings.Join, } + if customFunc != nil { + for key, value := range customFunc { + funcMap[key] = value + } + } w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) @@ -210,10 +250,14 @@ func printHelp(out io.Writer, templ string, data interface{}) { w.Flush() } +func printHelp(out io.Writer, templ string, data interface{}) { + printHelpCustom(out, templ, data, nil) +} + func checkVersion(c *Context) bool { found := false - if VersionFlag.Name != "" { - eachName(VersionFlag.Name, func(name string) { + if VersionFlag.GetName() != "" { + eachName(VersionFlag.GetName(), func(name string) { if c.GlobalBool(name) || c.Bool(name) { found = true } @@ -224,8 +268,8 @@ func checkVersion(c *Context) bool { func checkHelp(c *Context) bool { found := false - if HelpFlag.Name != "" { - eachName(HelpFlag.Name, func(name string) { + if HelpFlag.GetName() != "" { + eachName(HelpFlag.GetName(), func(name string) { if c.GlobalBool(name) || c.Bool(name) { found = true } @@ -260,7 +304,7 @@ func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { pos := len(arguments) - 1 lastArg := arguments[pos] - if lastArg != "--"+BashCompletionFlag.Name { + if lastArg != "--"+BashCompletionFlag.GetName() { return false, arguments } diff --git a/vendor/vendor.json b/vendor/vendor.json index 1386de4a35..b65870c245 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -658,10 +658,10 @@ "revisionTime": "2017-02-13T14:20:43Z" }, { - "checksumSHA1": "brhONOPp4CSdTZf5uEtcH+FpFUI=", + "checksumSHA1": "Yx1MU40fyGe7hhqW9+dkv8kXa60=", "path": "gopkg.in/urfave/cli.v1", - "revision": "0bdeddeeb0f650497d603c4ad7b20cfe685682f6", - "revisionTime": "2016-11-22T04:36:10Z" + "revision": "cfb38830724cc34fedffe9a2a29fb54fa9169cd1", + "revisionTime": "2017-08-11T01:42:03Z" } ], "rootPath": "github.com/ethereum/go-ethereum" From 833eeb9f23e6808377f0414f0db4a731b134fe9f Mon Sep 17 00:00:00 2001 From: Joel Burget Date: Fri, 11 Aug 2017 07:29:32 -0400 Subject: [PATCH 075/272] core/vm/runtime: remove unused state parameter to NewEnv (#14953) * core: Remove unused `state` parameter to `NewEnv`. `cfg.State` is used instead. * core/vm/runtime: remove unused import --- core/vm/runtime/env.go | 3 +-- core/vm/runtime/runtime.go | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go index 7b41fe85a7..818da1be26 100644 --- a/core/vm/runtime/env.go +++ b/core/vm/runtime/env.go @@ -21,11 +21,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" ) -func NewEnv(cfg *Config, state *state.StateDB) *vm.EVM { +func NewEnv(cfg *Config) *vm.EVM { context := vm.Context{ CanTransfer: core.CanTransfer, Transfer: core.Transfer, diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 44cde4f70a..edbf541766 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -106,7 +106,7 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { } var ( address = common.StringToAddress("contract") - vmenv = NewEnv(cfg, cfg.State) + vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) cfg.State.CreateAccount(address) @@ -136,7 +136,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(db)) } var ( - vmenv = NewEnv(cfg, cfg.State) + vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) @@ -158,7 +158,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, error) { setDefaults(cfg) - vmenv := NewEnv(cfg, cfg.State) + vmenv := NewEnv(cfg) sender := cfg.State.GetOrNewStateObject(cfg.Origin) // Call the code with the given configuration. From 7bbdf3e2687ea293b68a7f73c039cbde411217fa Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Thu, 10 Aug 2017 14:07:11 +0300 Subject: [PATCH 076/272] core: add Metropolis pre-compiles (EIP 197, 198 and 213) --- core/vm/contracts.go | 202 ++++++++++++++++++++++++++++++++++++++ core/vm/contracts_test.go | 34 +++++++ core/vm/evm.go | 8 +- 3 files changed, 242 insertions(+), 2 deletions(-) diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 43b60ba775..407f198f02 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -22,7 +22,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/bn256" "github.com/ethereum/go-ethereum/params" "golang.org/x/crypto/ripemd160" ) @@ -45,6 +47,19 @@ var PrecompiledContracts = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{4}): &dataCopy{}, } +// PrecompiledContractsMetropolis contains the default set of ethereum contracts +// for metropolis hardfork +var PrecompiledContractsMetropolis = map[common.Address]PrecompiledContract{ + common.BytesToAddress([]byte{1}): &ecrecover{}, + common.BytesToAddress([]byte{2}): &sha256hash{}, + common.BytesToAddress([]byte{3}): &ripemd160hash{}, + common.BytesToAddress([]byte{4}): &dataCopy{}, + common.BytesToAddress([]byte{5}): &bigModexp{}, + common.BytesToAddress([]byte{6}): &bn256Add{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMul{}, + common.BytesToAddress([]byte{8}): &pairing{}, +} + // RunPrecompile runs and evaluate the output of a precompiled contract defined in contracts.go func RunPrecompiledContract(p PrecompiledContract, input []byte, contract *Contract) (ret []byte, err error) { gas := p.RequiredGas(input) @@ -132,3 +147,190 @@ func (c *dataCopy) RequiredGas(input []byte) uint64 { func (c *dataCopy) Run(in []byte) ([]byte, error) { return in, nil } + +// bigModexp implements a native big integer exponential modular operation. +type bigModexp struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *bigModexp) RequiredGas(input []byte) uint64 { + // TODO reword required gas to have error reporting and convert arithmetic + // to uint64. + if len(input) < 3*32 { + input = append(input, make([]byte, 3*32-len(input))...) + } + var ( + baseLen = new(big.Int).SetBytes(input[:31]) + expLen = math.BigMax(new(big.Int).SetBytes(input[32:64]), big.NewInt(1)) + modLen = new(big.Int).SetBytes(input[65:97]) + ) + x := new(big.Int).Set(math.BigMax(baseLen, modLen)) + x.Mul(x, x) + x.Mul(x, expLen) + x.Div(x, new(big.Int).SetUint64(params.QuadCoeffDiv)) + + return x.Uint64() +} + +func (c *bigModexp) Run(input []byte) ([]byte, error) { + if len(input) < 3*32 { + input = append(input, make([]byte, 3*32-len(input))...) + } + // why 32-byte? These values won't fit anyway + var ( + baseLen = new(big.Int).SetBytes(input[:32]).Uint64() + expLen = new(big.Int).SetBytes(input[32:64]).Uint64() + modLen = new(big.Int).SetBytes(input[64:96]).Uint64() + ) + + input = input[96:] + if uint64(len(input)) < baseLen { + input = append(input, make([]byte, baseLen-uint64(len(input)))...) + } + base := new(big.Int).SetBytes(input[:baseLen]) + + input = input[baseLen:] + if uint64(len(input)) < expLen { + input = append(input, make([]byte, expLen-uint64(len(input)))...) + } + exp := new(big.Int).SetBytes(input[:expLen]) + + input = input[expLen:] + if uint64(len(input)) < modLen { + input = append(input, make([]byte, modLen-uint64(len(input)))...) + } + mod := new(big.Int).SetBytes(input[:modLen]) + + return common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), len(input[:modLen])), nil +} + +type bn256Add struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *bn256Add) RequiredGas(input []byte) uint64 { + return 0 // TODO +} + +func (c *bn256Add) Run(in []byte) ([]byte, error) { + in = common.RightPadBytes(in, 128) + + x, onCurve := new(bn256.G1).Unmarshal(in[:64]) + if !onCurve { + return nil, errNotOnCurve + } + gx, gy, _, _ := x.CurvePoints() + if gx.Cmp(bn256.P) >= 0 || gy.Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + + y, onCurve := new(bn256.G1).Unmarshal(in[64:128]) + if !onCurve { + return nil, errNotOnCurve + } + gx, gy, _, _ = y.CurvePoints() + if gx.Cmp(bn256.P) >= 0 || gy.Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + x.Add(x, y) + + return x.Marshal(), nil +} + +type bn256ScalarMul struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *bn256ScalarMul) RequiredGas(input []byte) uint64 { + return 0 // TODO +} + +func (c *bn256ScalarMul) Run(in []byte) ([]byte, error) { + in = common.RightPadBytes(in, 96) + + g1, onCurve := new(bn256.G1).Unmarshal(in[:64]) + if !onCurve { + return nil, errNotOnCurve + } + x, y, _, _ := g1.CurvePoints() + if x.Cmp(bn256.P) >= 0 || y.Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + g1.ScalarMult(g1, new(big.Int).SetBytes(in[64:96])) + + return g1.Marshal(), nil +} + +// pairing implements a pairing pre-compile for the bn256 curve +type pairing struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +// +// This method does not require any overflow checking as the input size gas costs +// required for anything significant is so high it's impossible to pay for. +func (c *pairing) RequiredGas(input []byte) uint64 { + //return 0 // TODO + k := (len(input) + 191) / pairSize + return uint64(60000*k + 40000) +} + +const pairSize = 192 + +var ( + true32Byte = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} + fals32Byte = make([]byte, 32) + errNotOnCurve = errors.New("point not on elliptic curve") + errInvalidCurvePoint = errors.New("invalid elliptic curve point") +) + +func (c *pairing) Run(in []byte) ([]byte, error) { + if len(in) == 0 { + return true32Byte, nil + } + + if len(in)%pairSize > 0 { + return nil, errBadPrecompileInput + } + + var ( + g1s []*bn256.G1 + g2s []*bn256.G2 + ) + for i := 0; i < len(in); i += pairSize { + g1, onCurve := new(bn256.G1).Unmarshal(in[i : i+64]) + if !onCurve { + return nil, errNotOnCurve + } + + x, y, _, _ := g1.CurvePoints() + if x.Cmp(bn256.P) >= 0 || y.Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + + g2, onCurve := new(bn256.G2).Unmarshal(in[i+64 : i+192]) + if !onCurve { + return nil, errNotOnCurve + } + x2, y2, _, _ := g2.CurvePoints() + if x2.Real().Cmp(bn256.P) >= 0 || x2.Imag().Cmp(bn256.P) >= 0 || + y2.Real().Cmp(bn256.P) >= 0 || y2.Imag().Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + + g1s = append(g1s, g1) + g2s = append(g2s, g2) + } + + isOne := bn256.PairingCheck(g1s, g2s) + if isOne { + return true32Byte, nil + } + + return fals32Byte, nil +} diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 830a8f69d9..2b4070ede7 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -1 +1,35 @@ package vm + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +const input = "" + +func TestPairing(t *testing.T) { + pairing := &pairing{} + + for i, test := range []struct { + input string + valid int + }{ + {"1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, + {"2eca0c7238bf16e83e7a1e6c5d49540685ff51380f309842a98561558019fc0203d3260361bb8451de5ff5ecd17f010ff22f5c31cdf184e9020b06fa5997db841213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f06967a1237ebfeca9aaae0d6d0bab8e28c198c5a339ef8a2407e31cdac516db922160fa257a5fd5b280642ff47b65eca77e626cb685c84fa6d3b6882a283ddd1198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, + {"0f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd216da2f5cb6be7a0aa72c440c53c9bbdfec6c36c7d515536431b3a865468acbba2e89718ad33c8bed92e210e81d1853435399a271913a6520736a4729cf0d51eb01a9e2ffa2e92599b68e44de5bcf354fa2642bd4f26b259daa6f7ce3ed57aeb314a9a87b789a58af499b314e13c3d65bede56c07ea2d418d6874857b70763713178fb49a2d6cd347dc58973ff49613a20757d0fcc22079f9abd10c3baee245901b9e027bd5cfc2cb5db82d4dc9677ac795ec500ecd47deee3b5da006d6d049b811d7511c78158de484232fc68daf8a45cf217d1c2fae693ff5871e8752d73b21198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, + {"2f2ea0b3da1e8ef11914acf8b2e1b32d99df51f5f4f206fc6b947eae860eddb6068134ddb33dc888ef446b648d72338684d678d2eb2371c61a50734d78da4b7225f83c8b6ab9de74e7da488ef02645c5a16a6652c3c71a15dc37fe3a5dcb7cb122acdedd6308e3bb230d226d16a105295f523a8a02bfc5e8bd2da135ac4c245d065bbad92e7c4e31bf3757f1fe7362a63fbfee50e7dc68da116e67d600d9bf6806d302580dc0661002994e7cd3a7f224e7ddc27802777486bf80f40e4ca3cfdb186bac5188a98c45e6016873d107f5cd131f3a3e339d0375e58bd6219347b008122ae2b09e539e152ec5364e7e2204b03d11d3caa038bfc7cd499f8176aacbee1f39e4e4afc4bc74790a4a028aff2c3d2538731fb755edefd8cb48d6ea589b5e283f150794b6736f670d6a1033f9b46c6f5204f50813eb85c8dc4b59db1c5d39140d97ee4d2b36d99bc49974d18ecca3e7ad51011956051b464d9e27d46cc25e0764bb98575bd466d32db7b15f582b2d5c452b36aa394b789366e5e3ca5aabd415794ab061441e51d01e94640b7e3084a07e02c78cf3103c542bc5b298669f211b88da1679b0b64a63b7e0e7bfe52aae524f73a55be7fe70c7e9bfc94b4cf0da1213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f", 1}, + {"20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, + {"1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 0}, + } { + r, err := pairing.Run(common.FromHex(test.input)) + if err != nil { + t.Error(i, ":", err) + } + + if int(r[31]) != test.valid { + t.Error(i, "expected", test.valid, "but was", r[31]) + } + } + +} diff --git a/core/vm/evm.go b/core/vm/evm.go index 9296cc7cac..20eaaccb46 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -37,6 +37,10 @@ type ( func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, error) { if contract.CodeAddr != nil { precompiledContracts := PrecompiledContracts + if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { + precompiledContracts = PrecompiledContractsMetropolis + } + if p := precompiledContracts[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) } @@ -100,8 +104,8 @@ type EVM struct { abort int32 } -// NewEVM retutrns a new EVM evmironment. The returned EVM is not thread safe -// and should only ever be used *once*. +// NewEVM retutrns a new EVM . The returned EVM is not thread safe and should +// only ever be used *once*. func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM { evm := &EVM{ Context: ctx, From 02aa86e6591d4a70f152d8dc579df25e9aa0cd12 Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Mon, 14 Aug 2017 13:48:24 +0800 Subject: [PATCH 077/272] eth/downloader: exit loop when there is no more available task --- eth/downloader/downloader.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 6ac58140a3..13f3b11c9a 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -1093,6 +1093,10 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv throttled = true break } + // Short circuit if there is no more available task. + if pending() == 0 { + break + } // Reserve a chunk of fetches for a peer. A nil can mean either that // no more headers are available, or that the peer is known not to // have them. From 967e097faa51850a01053624cc74f300edf9770b Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 14 Aug 2017 10:57:54 +0200 Subject: [PATCH 078/272] core/vm: Address review concerns --- core/vm/analysis.go | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/core/vm/analysis.go b/core/vm/analysis.go index b27dee8dc8..3ff8626956 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -25,7 +25,7 @@ import ( // destinations stores one map per contract (keyed by hash of code). // The maps contain an entry for each location of a JUMPDEST // instruction. -type destinations map[common.Hash][]byte +type destinations map[common.Hash]bitvec // has checks whether code has a JUMPDEST at dest. func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool { @@ -41,20 +41,25 @@ func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool m = jumpdests(code) d[codehash] = m } - return OpCode(code[udest]) == JUMPDEST && (m[udest/8]&(0x80>>(udest%8))) == 0 + return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) // return (m[udest/8] & (1 << (udest % 8))) != 0 } -type bitvec struct { - m []byte +// bitvec is a bit vector which maps bytes in a program +// An unset bit means the byte is a code-segemnt, a set bit means it's data-segment +type bitvec []byte + +func (bits *bitvec) set(pos uint64) { + (*bits)[pos/8] |= 0x80 >> (pos % 8) +} +func (bits *bitvec) set8(pos uint64) { + (*bits)[pos/8] |= 0xFF >> (pos % 8) + (*bits)[pos/8+1] |= ^(0xFF >> (pos % 8)) } -func (bits *bitvec) addone(pos uint64) { - bits.m[pos/8] |= 0x80 >> (pos % 8) -} -func (bits *bitvec) addOneByte(pos uint64) { - bits.m[pos/8] |= 0xFF >> (pos % 8) - bits.m[pos/8+1] |= ^(0xFF >> (pos % 8)) +// codeSegment checks if the position is in a code segment +func (bits *bitvec) codeSegment(pos uint64) bool { + return ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0 } // jumpdests creates a map that contains an entry for each @@ -64,7 +69,7 @@ func jumpdests(code []byte) []byte { // ends with a PUSH32, the algorithm will push zeroes onto the // bitvector outside the bounds of the actual code. m := make([]byte, len(code)/8+1+4) - bits := &bitvec{m} + bits := bitvec(m) for pc := uint64(0); pc < uint64(len(code)); { op := OpCode(code[pc]) @@ -72,16 +77,16 @@ func jumpdests(code []byte) []byte { numbits := op - PUSH1 + 1 pc++ for ; numbits >= 8; numbits -= 8 { - bits.addOneByte(pc) // 8 + bits.set8(pc) // 8 pc += 8 } for ; numbits > 0; numbits-- { - bits.addone(pc) + bits.set(pc) pc++ } } else { pc++ } } - return bits.m + return bits } From 02656f9f614374b3f30b0cc57562e31c570cdf3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 14 Aug 2017 12:21:40 +0300 Subject: [PATCH 079/272] console: use keypad based pinpad (Trezor request) --- console/bridge.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/console/bridge.go b/console/bridge.go index b2d4e09745..b28cc438e2 100644 --- a/console/bridge.go +++ b/console/bridge.go @@ -110,20 +110,15 @@ func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { } // Trezor PIN matrix input requested, display the matrix to the user and fetch the data fmt.Fprintf(b.printer, "Look at the device for number positions\n\n") - fmt.Fprintf(b.printer, "a | b | c\n") + fmt.Fprintf(b.printer, "7 | 8 | 9\n") fmt.Fprintf(b.printer, "--+---+--\n") - fmt.Fprintf(b.printer, "d | e | f\n") + fmt.Fprintf(b.printer, "4 | 5 | 6\n") fmt.Fprintf(b.printer, "--+---+--\n") - fmt.Fprintf(b.printer, "g | h | i\n\n") + fmt.Fprintf(b.printer, "1 | 2 | 3\n\n") if input, err := b.prompter.PromptPassword("Please enter current PIN: "); err != nil { throwJSException(err.Error()) } else { - // Transform the alphabetical input to numbers - mapping := map[string]string{"a": "7", "b": "8", "c": "9", "d": "4", "e": "5", "f": "6", "g": "1", "h": "2", "i": "3"} - for from, to := range mapping { - input = strings.Replace(input, from, to, -1) - } passwd, _ = otto.ToValue(input) } if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { From 6131dd55c5cb6f964a1b8e8d51400f10d545a92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 10 Aug 2017 16:39:43 +0300 Subject: [PATCH 080/272] core/vm: polish precompile contract code, add tests and benches * Update modexp gas calculation to new version * Fix modexp modulo 0 special case to return zero --- core/vm/contracts.go | 425 +++++++++++++++++++---------------- core/vm/contracts_test.go | 101 ++++++++- core/vm/evm.go | 15 +- core/vm/instructions_test.go | 86 +++++-- params/protocol_params.go | 24 +- 5 files changed, 409 insertions(+), 242 deletions(-) diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 407f198f02..c59779dac6 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -29,9 +29,7 @@ import ( "golang.org/x/crypto/ripemd160" ) -var errBadPrecompileInput = errors.New("bad pre compile input") - -// Precompiled contract is the basic interface for native Go contracts. The implementation +// PrecompiledContract is the basic interface for native Go contracts. The implementation // requires a deterministic gas count based on the input size of the Run method of the // contract. type PrecompiledContract interface { @@ -39,61 +37,61 @@ type PrecompiledContract interface { Run(input []byte) ([]byte, error) // Run runs the precompiled contract } -// PrecompiledContracts contains the default set of ethereum contracts -var PrecompiledContracts = map[common.Address]PrecompiledContract{ +// PrecompiledContractsHomestead contains the default set of pre-compiled Ethereum +// contracts used in the Frontier and Homestead releases. +var PrecompiledContractsHomestead = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{1}): &ecrecover{}, common.BytesToAddress([]byte{2}): &sha256hash{}, common.BytesToAddress([]byte{3}): &ripemd160hash{}, common.BytesToAddress([]byte{4}): &dataCopy{}, } -// PrecompiledContractsMetropolis contains the default set of ethereum contracts -// for metropolis hardfork +// PrecompiledContractsMetropolis contains the default set of pre-compiled Ethereum +// contracts used in the Metropolis release. var PrecompiledContractsMetropolis = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{1}): &ecrecover{}, common.BytesToAddress([]byte{2}): &sha256hash{}, common.BytesToAddress([]byte{3}): &ripemd160hash{}, common.BytesToAddress([]byte{4}): &dataCopy{}, - common.BytesToAddress([]byte{5}): &bigModexp{}, + common.BytesToAddress([]byte{5}): &bigModExp{}, common.BytesToAddress([]byte{6}): &bn256Add{}, common.BytesToAddress([]byte{7}): &bn256ScalarMul{}, - common.BytesToAddress([]byte{8}): &pairing{}, + common.BytesToAddress([]byte{8}): &bn256Pairing{}, } -// RunPrecompile runs and evaluate the output of a precompiled contract defined in contracts.go +// RunPrecompiledContract runs and evaluates the output of a precompiled contract. func RunPrecompiledContract(p PrecompiledContract, input []byte, contract *Contract) (ret []byte, err error) { gas := p.RequiredGas(input) if contract.UseGas(gas) { return p.Run(input) - } else { - return nil, ErrOutOfGas } + return nil, ErrOutOfGas } -// ECRECOVER implemented as a native contract +// ECRECOVER implemented as a native contract. type ecrecover struct{} func (c *ecrecover) RequiredGas(input []byte) uint64 { return params.EcrecoverGas } -func (c *ecrecover) Run(in []byte) ([]byte, error) { +func (c *ecrecover) Run(input []byte) ([]byte, error) { const ecRecoverInputLength = 128 - in = common.RightPadBytes(in, ecRecoverInputLength) - // "in" is (hash, v, r, s), each 32 bytes + input = common.RightPadBytes(input, ecRecoverInputLength) + // "input" is (hash, v, r, s), each 32 bytes // but for ecrecover we want (r, s, v) - r := new(big.Int).SetBytes(in[64:96]) - s := new(big.Int).SetBytes(in[96:128]) - v := in[63] - 27 + r := new(big.Int).SetBytes(input[64:96]) + s := new(big.Int).SetBytes(input[96:128]) + v := input[63] - 27 - // tighter sig s values in homestead only apply to tx sigs - if !allZero(in[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { + // tighter sig s values input homestead only apply to tx sigs + if !allZero(input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { return nil, nil } // v needs to be at the end for libsecp256k1 - pubKey, err := crypto.Ecrecover(in[:32], append(in[64:128], v)) + pubKey, err := crypto.Ecrecover(input[:32], append(input[64:128], v)) // make sure the public key is a valid one if err != nil { return nil, nil @@ -103,7 +101,7 @@ func (c *ecrecover) Run(in []byte) ([]byte, error) { return common.LeftPadBytes(crypto.Keccak256(pubKey[1:])[12:], 32), nil } -// SHA256 implemented as a native contract +// SHA256 implemented as a native contract. type sha256hash struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. @@ -111,14 +109,14 @@ type sha256hash struct{} // This method does not require any overflow checking as the input size gas costs // required for anything significant is so high it's impossible to pay for. func (c *sha256hash) RequiredGas(input []byte) uint64 { - return uint64(len(input)+31)/32*params.Sha256WordGas + params.Sha256Gas + return uint64(len(input)+31)/32*params.Sha256PerWordGas + params.Sha256BaseGas } -func (c *sha256hash) Run(in []byte) ([]byte, error) { - h := sha256.Sum256(in) +func (c *sha256hash) Run(input []byte) ([]byte, error) { + h := sha256.Sum256(input) return h[:], nil } -// RIPMED160 implemented as a native contract +// RIPMED160 implemented as a native contract. type ripemd160hash struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. @@ -126,15 +124,15 @@ type ripemd160hash struct{} // This method does not require any overflow checking as the input size gas costs // required for anything significant is so high it's impossible to pay for. func (c *ripemd160hash) RequiredGas(input []byte) uint64 { - return uint64(len(input)+31)/32*params.Ripemd160WordGas + params.Ripemd160Gas + return uint64(len(input)+31)/32*params.Ripemd160PerWordGas + params.Ripemd160BaseGas } -func (c *ripemd160hash) Run(in []byte) ([]byte, error) { +func (c *ripemd160hash) Run(input []byte) ([]byte, error) { ripemd := ripemd160.New() - ripemd.Write(in) + ripemd.Write(input) return common.LeftPadBytes(ripemd.Sum(nil), 32), nil } -// data copy implemented as a native contract +// data copy implemented as a native contract. type dataCopy struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. @@ -142,195 +140,232 @@ type dataCopy struct{} // This method does not require any overflow checking as the input size gas costs // required for anything significant is so high it's impossible to pay for. func (c *dataCopy) RequiredGas(input []byte) uint64 { - return uint64(len(input)+31)/32*params.IdentityWordGas + params.IdentityGas + return uint64(len(input)+31)/32*params.IdentityPerWordGas + params.IdentityBaseGas } func (c *dataCopy) Run(in []byte) ([]byte, error) { return in, nil } -// bigModexp implements a native big integer exponential modular operation. -type bigModexp struct{} +// bigModExp implements a native big integer exponential modular operation. +type bigModExp struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. -// -// This method does not require any overflow checking as the input size gas costs -// required for anything significant is so high it's impossible to pay for. -func (c *bigModexp) RequiredGas(input []byte) uint64 { - // TODO reword required gas to have error reporting and convert arithmetic - // to uint64. - if len(input) < 3*32 { - input = append(input, make([]byte, 3*32-len(input))...) - } - var ( - baseLen = new(big.Int).SetBytes(input[:31]) - expLen = math.BigMax(new(big.Int).SetBytes(input[32:64]), big.NewInt(1)) - modLen = new(big.Int).SetBytes(input[65:97]) - ) - x := new(big.Int).Set(math.BigMax(baseLen, modLen)) - x.Mul(x, x) - x.Mul(x, expLen) - x.Div(x, new(big.Int).SetUint64(params.QuadCoeffDiv)) +func (c *bigModExp) RequiredGas(input []byte) uint64 { + // Pad the input with zeroes to the minimum size to read the field lengths + input = common.RightPadBytes(input, 96) - return x.Uint64() + var ( + baseLen = new(big.Int).SetBytes(input[:32]) + expLen = new(big.Int).SetBytes(input[32:64]) + modLen = new(big.Int).SetBytes(input[64:96]) + ) + input = input[96:] + + // Retrieve the head 32 bytes of exp for the adjusted exponent length + var expHead *big.Int + if big.NewInt(int64(len(input))).Cmp(baseLen) <= 0 { + expHead = new(big.Int) + } else { + offset := int(baseLen.Uint64()) + + input = common.RightPadBytes(input, offset+32) + if expLen.Cmp(big.NewInt(32)) > 0 { + expHead = new(big.Int).SetBytes(input[offset : offset+32]) + } else { + expHead = new(big.Int).SetBytes(input[offset : offset+int(expLen.Uint64())]) + } + } + // Calculate the adjusted exponent length + var msb int + if bitlen := expHead.BitLen(); bitlen > 0 { + msb = bitlen - 1 + } + adjExpLen := new(big.Int) + if expLen.Cmp(big.NewInt(32)) > 0 { + adjExpLen.Sub(expLen, big.NewInt(32)) + adjExpLen.Mul(big.NewInt(8), adjExpLen) + } + adjExpLen.Add(adjExpLen, big.NewInt(int64(msb))) + + // Calculate the gas cost of the operation + gas := new(big.Int).Set(math.BigMax(modLen, baseLen)) + switch { + case gas.Cmp(big.NewInt(64)) <= 0: + gas.Mul(gas, gas) + case gas.Cmp(big.NewInt(1024)) <= 0: + gas = new(big.Int).Add( + new(big.Int).Div(new(big.Int).Mul(gas, gas), big.NewInt(4)), + new(big.Int).Sub(new(big.Int).Mul(big.NewInt(96), gas), big.NewInt(3072)), + ) + default: + gas = new(big.Int).Add( + new(big.Int).Div(new(big.Int).Mul(gas, gas), big.NewInt(16)), + new(big.Int).Sub(new(big.Int).Mul(big.NewInt(480), gas), big.NewInt(199680)), + ) + } + gas.Mul(gas, math.BigMax(adjExpLen, big.NewInt(1))) + gas.Div(gas, new(big.Int).SetUint64(params.ModExpQuadCoeffDiv)) + + if gas.BitLen() > 64 { + return math.MaxUint64 + } + return gas.Uint64() } -func (c *bigModexp) Run(input []byte) ([]byte, error) { - if len(input) < 3*32 { - input = append(input, make([]byte, 3*32-len(input))...) - } - // why 32-byte? These values won't fit anyway +func (c *bigModExp) Run(input []byte) ([]byte, error) { + // Pad the input with zeroes to the minimum size to read the field lengths + input = common.RightPadBytes(input, 96) + var ( baseLen = new(big.Int).SetBytes(input[:32]).Uint64() expLen = new(big.Int).SetBytes(input[32:64]).Uint64() modLen = new(big.Int).SetBytes(input[64:96]).Uint64() ) - input = input[96:] - if uint64(len(input)) < baseLen { - input = append(input, make([]byte, baseLen-uint64(len(input)))...) - } - base := new(big.Int).SetBytes(input[:baseLen]) - input = input[baseLen:] - if uint64(len(input)) < expLen { - input = append(input, make([]byte, expLen-uint64(len(input)))...) - } - exp := new(big.Int).SetBytes(input[:expLen]) + // Pad the input with zeroes to the minimum size to read the field contents + input = common.RightPadBytes(input, int(baseLen+expLen+modLen)) - input = input[expLen:] - if uint64(len(input)) < modLen { - input = append(input, make([]byte, modLen-uint64(len(input)))...) + var ( + base = new(big.Int).SetBytes(input[:baseLen]) + exp = new(big.Int).SetBytes(input[baseLen : baseLen+expLen]) + mod = new(big.Int).SetBytes(input[baseLen+expLen : baseLen+expLen+modLen]) + ) + if mod.BitLen() == 0 { + // Modulo 0 is undefined, return zero + return common.LeftPadBytes([]byte{}, int(modLen)), nil } - mod := new(big.Int).SetBytes(input[:modLen]) - - return common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), len(input[:modLen])), nil + return common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), int(modLen)), nil } -type bn256Add struct{} - -// RequiredGas returns the gas required to execute the pre-compiled contract. -// -// This method does not require any overflow checking as the input size gas costs -// required for anything significant is so high it's impossible to pay for. -func (c *bn256Add) RequiredGas(input []byte) uint64 { - return 0 // TODO -} - -func (c *bn256Add) Run(in []byte) ([]byte, error) { - in = common.RightPadBytes(in, 128) - - x, onCurve := new(bn256.G1).Unmarshal(in[:64]) - if !onCurve { - return nil, errNotOnCurve - } - gx, gy, _, _ := x.CurvePoints() - if gx.Cmp(bn256.P) >= 0 || gy.Cmp(bn256.P) >= 0 { - return nil, errInvalidCurvePoint - } - - y, onCurve := new(bn256.G1).Unmarshal(in[64:128]) - if !onCurve { - return nil, errNotOnCurve - } - gx, gy, _, _ = y.CurvePoints() - if gx.Cmp(bn256.P) >= 0 || gy.Cmp(bn256.P) >= 0 { - return nil, errInvalidCurvePoint - } - x.Add(x, y) - - return x.Marshal(), nil -} - -type bn256ScalarMul struct{} - -// RequiredGas returns the gas required to execute the pre-compiled contract. -// -// This method does not require any overflow checking as the input size gas costs -// required for anything significant is so high it's impossible to pay for. -func (c *bn256ScalarMul) RequiredGas(input []byte) uint64 { - return 0 // TODO -} - -func (c *bn256ScalarMul) Run(in []byte) ([]byte, error) { - in = common.RightPadBytes(in, 96) - - g1, onCurve := new(bn256.G1).Unmarshal(in[:64]) - if !onCurve { - return nil, errNotOnCurve - } - x, y, _, _ := g1.CurvePoints() - if x.Cmp(bn256.P) >= 0 || y.Cmp(bn256.P) >= 0 { - return nil, errInvalidCurvePoint - } - g1.ScalarMult(g1, new(big.Int).SetBytes(in[64:96])) - - return g1.Marshal(), nil -} - -// pairing implements a pairing pre-compile for the bn256 curve -type pairing struct{} - -// RequiredGas returns the gas required to execute the pre-compiled contract. -// -// This method does not require any overflow checking as the input size gas costs -// required for anything significant is so high it's impossible to pay for. -func (c *pairing) RequiredGas(input []byte) uint64 { - //return 0 // TODO - k := (len(input) + 191) / pairSize - return uint64(60000*k + 40000) -} - -const pairSize = 192 - var ( - true32Byte = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} - fals32Byte = make([]byte, 32) - errNotOnCurve = errors.New("point not on elliptic curve") + // errNotOnCurve is returned if a point being unmarshalled as a bn256 elliptic + // curve point is not on the curve. + errNotOnCurve = errors.New("point not on elliptic curve") + + // errInvalidCurvePoint is returned if a point being unmarshalled as a bn256 + // elliptic curve point is invalid. errInvalidCurvePoint = errors.New("invalid elliptic curve point") ) -func (c *pairing) Run(in []byte) ([]byte, error) { - if len(in) == 0 { - return true32Byte, nil +// newCurvePoint unmarshals a binary blob into a bn256 elliptic curve point, +// returning it, or an error if the point is invalid. +func newCurvePoint(blob []byte) (*bn256.G1, error) { + p, onCurve := new(bn256.G1).Unmarshal(blob) + if !onCurve { + return nil, errNotOnCurve } - - if len(in)%pairSize > 0 { - return nil, errBadPrecompileInput + gx, gy, _, _ := p.CurvePoints() + if gx.Cmp(bn256.P) >= 0 || gy.Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint } - - var ( - g1s []*bn256.G1 - g2s []*bn256.G2 - ) - for i := 0; i < len(in); i += pairSize { - g1, onCurve := new(bn256.G1).Unmarshal(in[i : i+64]) - if !onCurve { - return nil, errNotOnCurve - } - - x, y, _, _ := g1.CurvePoints() - if x.Cmp(bn256.P) >= 0 || y.Cmp(bn256.P) >= 0 { - return nil, errInvalidCurvePoint - } - - g2, onCurve := new(bn256.G2).Unmarshal(in[i+64 : i+192]) - if !onCurve { - return nil, errNotOnCurve - } - x2, y2, _, _ := g2.CurvePoints() - if x2.Real().Cmp(bn256.P) >= 0 || x2.Imag().Cmp(bn256.P) >= 0 || - y2.Real().Cmp(bn256.P) >= 0 || y2.Imag().Cmp(bn256.P) >= 0 { - return nil, errInvalidCurvePoint - } - - g1s = append(g1s, g1) - g2s = append(g2s, g2) - } - - isOne := bn256.PairingCheck(g1s, g2s) - if isOne { - return true32Byte, nil - } - - return fals32Byte, nil + return p, nil +} + +// newTwistPoint unmarshals a binary blob into a bn256 elliptic curve point, +// returning it, or an error if the point is invalid. +func newTwistPoint(blob []byte) (*bn256.G2, error) { + p, onCurve := new(bn256.G2).Unmarshal(blob) + if !onCurve { + return nil, errNotOnCurve + } + x2, y2, _, _ := p.CurvePoints() + if x2.Real().Cmp(bn256.P) >= 0 || x2.Imag().Cmp(bn256.P) >= 0 || + y2.Real().Cmp(bn256.P) >= 0 || y2.Imag().Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + return p, nil +} + +// bn256Add implements a native elliptic curve point addition. +type bn256Add struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256Add) RequiredGas(input []byte) uint64 { + return params.Bn256AddGas +} + +func (c *bn256Add) Run(input []byte) ([]byte, error) { + // Ensure we have enough data to operate on + input = common.RightPadBytes(input, 128) + + x, err := newCurvePoint(input[:64]) + if err != nil { + return nil, err + } + y, err := newCurvePoint(input[64:128]) + if err != nil { + return nil, err + } + x.Add(x, y) + return x.Marshal(), nil +} + +// bn256ScalarMul implements a native elliptic curve scalar multiplication. +type bn256ScalarMul struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256ScalarMul) RequiredGas(input []byte) uint64 { + return params.Bn256ScalarMulGas +} + +func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { + // Ensure we have enough data to operate on + input = common.RightPadBytes(input, 96) + + p, err := newCurvePoint(input[:64]) + if err != nil { + return nil, err + } + p.ScalarMult(p, new(big.Int).SetBytes(input[64:96])) + return p.Marshal(), nil +} + +var ( + // true32Byte is returned if the bn256 pairing check succeeds. + true32Byte = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} + + // false32Byte is returned if the bn256 pairing check fails. + false32Byte = make([]byte, 32) + + // errBadPairingInput is returned if the bn256 pairing input is invalid. + errBadPairingInput = errors.New("bad elliptic curve pairing size") +) + +// bn256Pairing implements a pairing pre-compile for the bn256 curve +type bn256Pairing struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256Pairing) RequiredGas(input []byte) uint64 { + return params.Bn256PairingBaseGas + uint64(len(input)/192)*params.Bn256PairingPerPointGas +} + +func (c *bn256Pairing) Run(input []byte) ([]byte, error) { + // Handle some corner cases cheaply + if len(input)%192 > 0 { + return nil, errBadPairingInput + } + // Convert the input into a set of coordinates + var ( + cs []*bn256.G1 + ts []*bn256.G2 + ) + for i := 0; i < len(input); i += 192 { + c, err := newCurvePoint(input[i : i+64]) + if err != nil { + return nil, err + } + t, err := newTwistPoint(input[i+64 : i+192]) + if err != nil { + return nil, err + } + cs = append(cs, c) + ts = append(ts, t) + } + // Execute the pairing checks and return the results + ok := bn256.PairingCheck(cs, ts) + if ok { + return true32Byte, nil + } + return false32Byte, nil } diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 2b4070ede7..d049571610 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -1,17 +1,100 @@ package vm import ( + "bytes" + "math" "testing" "github.com/ethereum/go-ethereum/common" ) -const input = "" +// Tests the sample inputs from the ModExp EIP 198. +func TestPrecompiledModExp(t *testing.T) { + bigModExp := &bigModExp{} -func TestPairing(t *testing.T) { - pairing := &pairing{} + for i, tt := range []struct { + input string + gas uint64 + output string + }{ + {"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 2611, "0000000000000000000000000000000000000000000000000000000000000001"}, + {"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 2611, "0000000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", math.MaxUint64, ""}, + {"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007", 153, "3b01b01ac41f2d6e917c6d6a221ce793802469026d9ab7578fa2e79e4da6aaab"}, + {"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80", 153, "3b01b01ac41f2d6e917c6d6a221ce793802469026d9ab7578fa2e79e4da6aaab"}, + } { + gas := bigModExp.RequiredGas(common.FromHex(tt.input)) + if gas != tt.gas { + t.Errorf("test %d: required gas mismatch: have %v, want %v", i, gas, tt.gas) + continue + } + if gas == math.MaxUint64 { + continue // Out of gas + } + out, err := bigModExp.Run(common.FromHex(tt.input)) + if err != nil { + t.Errorf("test %d: contract execution failed: %v", i, err) + continue + } + if !bytes.Equal(out, common.FromHex(tt.output)) { + t.Errorf("test %d: contract output mismatch: have %x, want %v", i, out, tt.output) + } + } +} - for i, test := range []struct { +// Tests the sample inputs from the elliptic curve addition EIP 213. +func TestPrecompiledBn256Add(t *testing.T) { + bn256Add := &bn256Add{} + + for i, tt := range []struct { + input string + failure error + output string + }{ + {"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, + {"", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, + {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", errNotOnCurve, ""}, + } { + out, err := bn256Add.Run(common.FromHex(tt.input)) + if err != tt.failure { + t.Errorf("test %d: contract execution failure mismatch: have %v, want %v", i, err, tt.failure) + continue + } + if !bytes.Equal(out, common.FromHex(tt.output)) { + t.Errorf("test %d: contract output mismatch: have %x, want %v", i, out, tt.output) + } + } +} + +// Tests the sample inputs from the elliptic curve scalar multiplication EIP 213. +func TestPrecompiledBn256ScalarMul(t *testing.T) { + bn256ScalarMul := &bn256ScalarMul{} + + for i, tt := range []struct { + input string + failure error + output string + }{ + {"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, + {"", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, + {"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110f00000000000000000000000000000000000000000000000000000000000000", errNotOnCurve, ""}, + } { + out, err := bn256ScalarMul.Run(common.FromHex(tt.input)) + if err != tt.failure { + t.Errorf("test %d: contract execution failure mismatch: have %v, want %v", i, err, tt.failure) + continue + } + if !bytes.Equal(out, common.FromHex(tt.output)) { + t.Errorf("test %d: contract output mismatch: have %x, want %v", i, out, tt.output) + } + } +} + +// Tests the sample inputs from the elliptic curve pairing check EIP 197. +func TestPrecompiledBn256Pairing(t *testing.T) { + bn256Pairing := &bn256Pairing{} + + for i, tt := range []struct { input string valid int }{ @@ -22,14 +105,12 @@ func TestPairing(t *testing.T) { {"20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, {"1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 0}, } { - r, err := pairing.Run(common.FromHex(test.input)) + out, err := bn256Pairing.Run(common.FromHex(tt.input)) if err != nil { - t.Error(i, ":", err) + t.Errorf("test %d: contrac execution failed: %v", i, err) } - - if int(r[31]) != test.valid { - t.Error(i, "expected", test.valid, "but was", r[31]) + if int(out[31]) != tt.valid { + t.Errorf("test %d: contract output mismatch: have %v, want %v", i, out[31], tt.valid) } } - } diff --git a/core/vm/evm.go b/core/vm/evm.go index 20eaaccb46..b8af9bd15f 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -36,16 +36,14 @@ type ( // run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter. func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, error) { if contract.CodeAddr != nil { - precompiledContracts := PrecompiledContracts + precompiles := PrecompiledContractsHomestead if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { - precompiledContracts = PrecompiledContractsMetropolis + precompiles = PrecompiledContractsMetropolis } - - if p := precompiledContracts[*contract.CodeAddr]; p != nil { + if p := precompiles[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) } } - return evm.interpreter.Run(snapshot, contract, input) } @@ -147,10 +145,13 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas snapshot = evm.StateDB.Snapshot() ) if !evm.StateDB.Exist(addr) { - if PrecompiledContracts[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 { + precompiles := PrecompiledContractsHomestead + if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { + precompiles = PrecompiledContractsMetropolis + } + if precompiles[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 { return nil, gas, nil } - evm.StateDB.CreateAccount(addr) } evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value) diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 03c42c561c..13e411d127 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -69,7 +69,7 @@ func precompiledBenchmark(addr, input, expected string, gas uint64, bench *testi contract := NewContract(AccountRef(common.HexToAddress("1337")), nil, new(big.Int), gas) - p := PrecompiledContracts[common.HexToAddress(addr)] + p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] in := common.Hex2Bytes(input) var ( res []byte @@ -94,7 +94,7 @@ func precompiledBenchmark(addr, input, expected string, gas uint64, bench *testi } } -func BenchmarkPrecompiledEcdsa(bench *testing.B) { +func BenchmarkPrecompiledECDSA(bench *testing.B) { var ( addr = "01" inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" @@ -103,6 +103,7 @@ func BenchmarkPrecompiledEcdsa(bench *testing.B) { ) precompiledBenchmark(addr, inp, exp, gas, bench) } + func BenchmarkPrecompiledSha256(bench *testing.B) { var ( addr = "02" @@ -112,6 +113,7 @@ func BenchmarkPrecompiledSha256(bench *testing.B) { ) precompiledBenchmark(addr, inp, exp, gas, bench) } + func BenchmarkPrecompiledRipeMD(bench *testing.B) { var ( addr = "03" @@ -121,6 +123,7 @@ func BenchmarkPrecompiledRipeMD(bench *testing.B) { ) precompiledBenchmark(addr, inp, exp, gas, bench) } + func BenchmarkPrecompiledIdentity(bench *testing.B) { var ( addr = "04" @@ -130,131 +133,171 @@ func BenchmarkPrecompiledIdentity(bench *testing.B) { ) precompiledBenchmark(addr, inp, exp, gas, bench) } + +func BenchmarkPrecompiledModExp(bench *testing.B) { + var ( + addr = "05" + inp = "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" + exp = "0000000000000000000000000000000000000000000000000000000000000001" + gas = uint64(4000000) + ) + precompiledBenchmark(addr, inp, exp, gas, bench) +} + +func BenchmarkPrecompiledBn256Add(bench *testing.B) { + var ( + addr = "06" + inp = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + exp = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + gas = uint64(4000000) + ) + precompiledBenchmark(addr, inp, exp, gas, bench) +} + +func BenchmarkPrecompiledBn256ScalarMul(bench *testing.B) { + var ( + addr = "07" + inp = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + exp = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + gas = uint64(4000000) + ) + precompiledBenchmark(addr, inp, exp, gas, bench) +} + +func BenchmarkPrecompiledBn256Pairing(bench *testing.B) { + var ( + addr = "08" + inp = "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa" + exp = "0000000000000000000000000000000000000000000000000000000000000001" + gas = uint64(4000000) + ) + precompiledBenchmark(addr, inp, exp, gas, bench) +} + func BenchmarkOpAdd(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opAdd, x, y) - } + func BenchmarkOpSub(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSub, x, y) - } + func BenchmarkOpMul(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opMul, x, y) - } + func BenchmarkOpDiv(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opDiv, x, y) - } + func BenchmarkOpSdiv(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSdiv, x, y) - } + func BenchmarkOpMod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opMod, x, y) - } + func BenchmarkOpSmod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSmod, x, y) - } + func BenchmarkOpExp(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opExp, x, y) - } + func BenchmarkOpSignExtend(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSignExtend, x, y) - } + func BenchmarkOpLt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opLt, x, y) - } + func BenchmarkOpGt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opGt, x, y) - } + func BenchmarkOpSlt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSlt, x, y) - } + func BenchmarkOpSgt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSgt, x, y) - } + func BenchmarkOpEq(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opEq, x, y) - } + func BenchmarkOpAnd(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opAnd, x, y) - } + func BenchmarkOpOr(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opOr, x, y) - } + func BenchmarkOpXor(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opXor, x, y) - } + func BenchmarkOpByte(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opByte, x, y) - } func BenchmarkOpAddmod(b *testing.B) { @@ -263,15 +306,14 @@ func BenchmarkOpAddmod(b *testing.B) { z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opAddmod, x, y, z) - } + func BenchmarkOpMulmod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opMulmod, x, y, z) - } //func BenchmarkOpSha3(b *testing.B) { diff --git a/params/protocol_params.go b/params/protocol_params.go index f48bf4992d..9c84c7d348 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -31,23 +31,16 @@ const ( SstoreSetGas uint64 = 20000 // Once per SLOAD operation. LogDataGas uint64 = 8 // Per byte in a LOG* operation's data. CallStipend uint64 = 2300 // Free gas given at beginning of call. - EcrecoverGas uint64 = 3000 // - Sha256WordGas uint64 = 12 // Sha3Gas uint64 = 30 // Once per SHA3 operation. - Sha256Gas uint64 = 60 // - IdentityWordGas uint64 = 3 // Sha3WordGas uint64 = 6 // Once per word of the SHA3 operation's data. SstoreResetGas uint64 = 5000 // Once per SSTORE operation if the zeroness changes from zero. SstoreClearGas uint64 = 5000 // Once per SSTORE operation if the zeroness doesn't change. SstoreRefundGas uint64 = 15000 // Once per SSTORE operation if the zeroness changes to zero. JumpdestGas uint64 = 1 // Refunded gas, once per SSTORE operation if the zeroness changes to zero. - IdentityGas uint64 = 15 // EpochDuration uint64 = 30000 // Duration between proof-of-work epochs. CallGas uint64 = 40 // Once per CALL operation & message call transaction. CreateDataGas uint64 = 200 // - Ripemd160Gas uint64 = 600 // - Ripemd160WordGas uint64 = 120 // CallCreateDepth uint64 = 1024 // Maximum depth of call/create stack. ExpGas uint64 = 10 // Once per EXP instruction LogGas uint64 = 375 // Per LOG* operation. @@ -60,7 +53,22 @@ const ( MemoryGas uint64 = 3 // Times the address of the (highest referenced byte in memory + 1). NOTE: referencing happens on read, write and in instructions such as RETURN and CALL. TxDataNonZeroGas uint64 = 68 // Per byte of data attached to a transaction that is not equal to zero. NOTE: Not payable on data of calls between transactions. - MaxCodeSize = 24576 + MaxCodeSize = 24576 // Maximum bytecode to permit for a contract + + // Precompiled contract gas prices + + EcrecoverGas uint64 = 3000 // Elliptic curve sender recovery gas price + Sha256BaseGas uint64 = 60 // Base price for a SHA256 operation + Sha256PerWordGas uint64 = 12 // Per-word price for a SHA256 operation + Ripemd160BaseGas uint64 = 600 // Base price for a RIPEMD160 operation + Ripemd160PerWordGas uint64 = 120 // Per-word price for a RIPEMD160 operation + IdentityBaseGas uint64 = 15 // Base price for a data copy operation + IdentityPerWordGas uint64 = 3 // Per-work price for a data copy operation + ModExpQuadCoeffDiv uint64 = 100 // Divisor for the quadratic particle of the big int modular exponentiation + Bn256AddGas uint64 = 500 // Gas needed for an elliptic curve addition + Bn256ScalarMulGas uint64 = 2000 // Gas needed for an elliptic curve scalar multiplication + Bn256PairingBaseGas uint64 = 100000 // Base price for an elliptic curve pairing check + Bn256PairingPerPointGas uint64 = 80000 // Per-point price for an elliptic curve pairing check ) var ( From d8aaa3a215ea19c0ccde2419832ac2bd80d8ddf0 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 14 Aug 2017 15:26:47 +0300 Subject: [PATCH 081/272] core/vm: benchmarking of metro precompiles --- core/vm/contracts_test.go | 388 +++++++++++++++++++++++++++-------- core/vm/instructions_test.go | 181 +++++----------- 2 files changed, 352 insertions(+), 217 deletions(-) diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index d049571610..4a2ed8101f 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -1,116 +1,332 @@ package vm import ( - "bytes" - "math" + "fmt" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" ) +// precompiledTest defines the input/output pairs for precompiled contract tests. +type precompiledTest struct { + input, expected string + gas uint64 + name string +} + +// modexpTests are the test and benchmark data for the modexp precompiled contract. +var modexpTests = []precompiledTest{ + { + input: "0000000000000000000000000000000000000000000000000000000000000001" + + "0000000000000000000000000000000000000000000000000000000000000020" + + "0000000000000000000000000000000000000000000000000000000000000020" + + "03" + + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e" + + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "eip_example1", + }, { + input: "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000020" + + "0000000000000000000000000000000000000000000000000000000000000020" + + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e" + + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + expected: "0000000000000000000000000000000000000000000000000000000000000000", + name: "eip_example2", + }, { + input: "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb502fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + expected: "60008f1614cc01dcfb6bfb09c625cf90b47d4468db81b5f8b7a39d42f332eab9b2da8f2d95311648a8f243f4bb13cfb3d8f7f2a3c014122ebb3ed41b02783adc", + name: "nagydani-1-square", + }, { + input: "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb503fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + expected: "4834a46ba565db27903b1c720c9d593e84e4cbd6ad2e64b31885d944f68cd801f92225a8961c952ddf2797fa4701b330c85c4b363798100b921a1a22a46a7fec", + name: "nagydani-1-qube", + }, { + input: "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb5010001fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", + expected: "c36d804180c35d4426b57b50c5bfcca5c01856d104564cd513b461d3c8b8409128a5573e416d0ebe38f5f736766d9dc27143e4da981dfa4d67f7dc474cbee6d2", + name: "nagydani-1-pow0x10001", + }, { + input: "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5102e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + expected: "981dd99c3b113fae3e3eaa9435c0dc96779a23c12a53d1084b4f67b0b053a27560f627b873e3f16ad78f28c94f14b6392def26e4d8896c5e3c984e50fa0b3aa44f1da78b913187c6128baa9340b1e9c9a0fd02cb78885e72576da4a8f7e5a113e173a7a2889fde9d407bd9f06eb05bc8fc7b4229377a32941a02bf4edcc06d70", + name: "nagydani-2-square", + }, { + input: "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5103e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + expected: "d89ceb68c32da4f6364978d62aaa40d7b09b59ec61eb3c0159c87ec3a91037f7dc6967594e530a69d049b64adfa39c8fa208ea970cfe4b7bcd359d345744405afe1cbf761647e32b3184c7fbe87cee8c6c7ff3b378faba6c68b83b6889cb40f1603ee68c56b4c03d48c595c826c041112dc941878f8c5be828154afd4a16311f", + name: "nagydani-2-qube", + }, { + input: "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf51010001e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", + expected: "ad85e8ef13fd1dd46eae44af8b91ad1ccae5b7a1c92944f92a19f21b0b658139e0cabe9c1f679507c2de354bf2c91ebd965d1e633978a830d517d2f6f8dd5fd58065d58559de7e2334a878f8ec6992d9b9e77430d4764e863d77c0f87beede8f2f7f2ab2e7222f85cc9d98b8467f4bb72e87ef2882423ebdb6daf02dddac6db2", + name: "nagydani-2-pow0x10001", + }, { + input: "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb02d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + expected: "affc7507ea6d84751ec6b3f0d7b99dbcc263f33330e450d1b3ff0bc3d0874320bf4edd57debd587306988157958cb3cfd369cc0c9c198706f635c9e0f15d047df5cb44d03e2727f26b083c4ad8485080e1293f171c1ed52aef5993a5815c35108e848c951cf1e334490b4a539a139e57b68f44fee583306f5b85ffa57206b3ee5660458858534e5386b9584af3c7f67806e84c189d695e5eb96e1272d06ec2df5dc5fabc6e94b793718c60c36be0a4d031fc84cd658aa72294b2e16fc240aef70cb9e591248e38bd49c5a554d1afa01f38dab72733092f7555334bbef6c8c430119840492380aa95fa025dcf699f0a39669d812b0c6946b6091e6e235337b6f8", + name: "nagydani-3-square", + }, { + input: "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb03d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + expected: "1b280ecd6a6bf906b806d527c2a831e23b238f89da48449003a88ac3ac7150d6a5e9e6b3be4054c7da11dd1e470ec29a606f5115801b5bf53bc1900271d7c3ff3cd5ed790d1c219a9800437a689f2388ba1a11d68f6a8e5b74e9a3b1fac6ee85fc6afbac599f93c391f5dc82a759e3c6c0ab45ce3f5d25d9b0c1bf94cf701ea6466fc9a478dacc5754e593172b5111eeba88557048bceae401337cd4c1182ad9f700852bc8c99933a193f0b94cf1aedbefc48be3bc93ef5cb276d7c2d5462ac8bb0c8fe8923a1db2afe1c6b90d59c534994a6a633f0ead1d638fdc293486bb634ff2c8ec9e7297c04241a61c37e3ae95b11d53343d4ba2b4cc33d2cfa7eb705e", + name: "nagydani-3-qube", + }, { + input: "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb010001d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", + expected: "37843d7c67920b5f177372fa56e2a09117df585f81df8b300fba245b1175f488c99476019857198ed459ed8d9799c377330e49f4180c4bf8e8f66240c64f65ede93d601f957b95b83efdee1e1bfde74169ff77002eaf078c71815a9220c80b2e3b3ff22c2f358111d816ebf83c2999026b6de50bfc711ff68705d2f40b753424aefc9f70f08d908b5a20276ad613b4ab4309a3ea72f0c17ea9df6b3367d44fb3acab11c333909e02e81ea2ed404a712d3ea96bba87461720e2d98723e7acd0520ac1a5212dbedcd8dc0c1abf61d4719e319ff4758a774790b8d463cdfe131d1b2dcfee52d002694e98e720cb6ae7ccea353bc503269ba35f0f63bf8d7b672a76", + name: "nagydani-3-pow0x10001", + }, { + input: "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8102df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + expected: "8a5aea5f50dcc03dc7a7a272b5aeebc040554dbc1ffe36753c4fc75f7ed5f6c2cc0de3a922bf96c78bf0643a73025ad21f45a4a5cadd717612c511ab2bff1190fe5f1ae05ba9f8fe3624de1de2a817da6072ddcdb933b50216811dbe6a9ca79d3a3c6b3a476b079fd0d05f04fb154e2dd3e5cb83b148a006f2bcbf0042efb2ae7b916ea81b27aac25c3bf9a8b6d35440062ad8eae34a83f3ffa2cc7b40346b62174a4422584f72f95316f6b2bee9ff232ba9739301c97c99a9ded26c45d72676eb856ad6ecc81d36a6de36d7f9dafafee11baa43a4b0d5e4ecffa7b9b7dcefd58c397dd373e6db4acd2b2c02717712e6289bed7c813b670c4a0c6735aa7f3b0f1ce556eae9fcc94b501b2c8781ba50a8c6220e8246371c3c7359fe4ef9da786ca7d98256754ca4e496be0a9174bedbecb384bdf470779186d6a833f068d2838a88d90ef3ad48ff963b67c39cc5a3ee123baf7bf3125f64e77af7f30e105d72c4b9b5b237ed251e4c122c6d8c1405e736299c3afd6db16a28c6a9cfa68241e53de4cd388271fe534a6a9b0dbea6171d170db1b89858468885d08fecbd54c8e471c3e25d48e97ba450b96d0d87e00ac732aaa0d3ce4309c1064bd8a4c0808a97e0143e43a24cfa847635125cd41c13e0574487963e9d725c01375db99c31da67b4cf65eff555f0c0ac416c727ff8d438ad7c42030551d68c2e7adda0abb1ca7c10", + name: "nagydani-4-square", + }, { + input: "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8103df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + expected: "5a2664252aba2d6e19d9600da582cdd1f09d7a890ac48e6b8da15ae7c6ff1856fc67a841ac2314d283ffa3ca81a0ecf7c27d89ef91a5a893297928f5da0245c99645676b481b7e20a566ee6a4f2481942bee191deec5544600bb2441fd0fb19e2ee7d801ad8911c6b7750affec367a4b29a22942c0f5f4744a4e77a8b654da2a82571037099e9c6d930794efe5cdca73c7b6c0844e386bdca8ea01b3d7807146bb81365e2cdc6475f8c23e0ff84463126189dc9789f72bbce2e3d2d114d728a272f1345122de23df54c922ec7a16e5c2a8f84da8871482bd258c20a7c09bbcd64c7a96a51029bbfe848736a6ba7bf9d931a9b7de0bcaf3635034d4958b20ae9ab3a95a147b0421dd5f7ebff46c971010ebfc4adbbe0ad94d5498c853e7142c450d8c71de4b2f84edbf8acd2e16d00c8115b150b1c30e553dbb82635e781379fe2a56360420ff7e9f70cc64c00aba7e26ed13c7c19622865ae07248daced36416080f35f8cc157a857ed70ea4f347f17d1bee80fa038abd6e39b1ba06b97264388b21364f7c56e192d4b62d9b161405f32ab1e2594e86243e56fcf2cb30d21adef15b9940f91af681da24328c883d892670c6aa47940867a81830a82b82716895db810df1b834640abefb7db2092dd92912cb9a735175bc447be40a503cf22dfe565b4ed7a3293ca0dfd63a507430b323ee248ec82e843b673c97ad730728cebc", + name: "nagydani-4-qube", + }, { + input: "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b81010001df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", + expected: "bed8b970c4a34849fc6926b08e40e20b21c15ed68d18f228904878d4370b56322d0da5789da0318768a374758e6375bfe4641fca5285ec7171828922160f48f5ca7efbfee4d5148612c38ad683ae4e3c3a053d2b7c098cf2b34f2cb19146eadd53c86b2d7ccf3d83b2c370bfb840913ee3879b1057a6b4e07e110b6bcd5e958bc71a14798c91d518cc70abee264b0d25a4110962a764b364ac0b0dd1ee8abc8426d775ec0f22b7e47b32576afaf1b5a48f64573ed1c5c29f50ab412188d9685307323d990802b81dacc06c6e05a1e901830ba9fcc67688dc29c5e27bde0a6e845ca925f5454b6fb3747edfaa2a5820838fb759eadf57f7cb5cec57fc213ddd8a4298fa079c3c0f472b07fb15aa6a7f0a3780bd296ff6a62e58ef443870b02260bd4fd2bbc98255674b8e1f1f9f8d33c7170b0ebbea4523b695911abbf26e41885344823bd0587115fdd83b721a4e8457a31c9a84b3d3520a07e0e35df7f48e5a9d534d0ec7feef1ff74de6a11e7f93eab95175b6ce22c68d78a642ad642837897ec11349205d8593ac19300207572c38d29ca5dfa03bc14cdbc32153c80e5cc3e739403d34c75915e49beb43094cc6dcafb3665b305ddec9286934ae66ec6b777ca528728c851318eb0f207b39f1caaf96db6eeead6b55ed08f451939314577d42bcc9f97c0b52d0234f88fd07e4c1d7780fdebc025cfffcb572cb27a8c33963", + name: "nagydani-4-pow0x10001", + }, { + input: "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf02e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + expected: "d61fe4e3f32ac260915b5b03b78a86d11bfc41d973fce5b0cc59035cf8289a8a2e3878ea15fa46565b0d806e2f85b53873ea20ed653869b688adf83f3ef444535bf91598ff7e80f334fb782539b92f39f55310cc4b35349ab7b278346eda9bc37c0d8acd3557fae38197f412f8d9e57ce6a76b7205c23564cab06e5615be7c6f05c3d05ec690cba91da5e89d55b152ff8dd2157dc5458190025cf94b1ad98f7cbe64e9482faba95e6b33844afc640892872b44a9932096508f4a782a4805323808f23e54b6ff9b841dbfa87db3505ae4f687972c18ea0f0d0af89d36c1c2a5b14560c153c3fee406f5cf15cfd1c0bb45d767426d465f2f14c158495069d0c5955a00150707862ecaae30624ebacdd8ac33e4e6aab3ff90b6ba445a84689386b9e945d01823a65874444316e83767290fcff630d2477f49d5d8ffdd200e08ee1274270f86ed14c687895f6caf5ce528bd970c20d2408a9ba66216324c6a011ac4999098362dbd98a038129a2d40c8da6ab88318aa3046cb660327cc44236d9e5d2163bd0959062195c51ed93d0088b6f92051fc99050ece2538749165976233697ab4b610385366e5ce0b02ad6b61c168ecfbedcdf74278a38de340fd7a5fead8e588e294795f9b011e2e60377a89e25c90e145397cdeabc60fd32444a6b7642a611a83c464d8b8976666351b4865c37b02e6dc21dbcdf5f930341707b618cc0f03c3122646b3385c9df9f2ec730eec9d49e7dfc9153b6e6289da8c4f0ebea9ccc1b751948e3bb7171c9e4d57423b0eeeb79095c030cb52677b3f7e0b45c30f645391f3f9c957afa549c4e0b2465b03c67993cd200b1af01035962edbc4c9e89b31c82ac121987d6529dafdeef67a132dc04b6dc68e77f22862040b75e2ceb9ff16da0fca534e6db7bd12fa7b7f51b6c08c1e23dfcdb7acbd2da0b51c87ffbced065a612e9b1c8bba9b7e2d8d7a2f04fcc4aaf355b60d764879a76b5e16762d5f2f55d585d0c8e82df6940960cddfb72c91dfa71f6b4e1c6ca25dfc39a878e998a663c04fe29d5e83b9586d047b4d7ff70a9f0d44f127e7d741685ca75f11629128d916a0ffef4be586a30c4b70389cc746e84ebf177c01ee8a4511cfbb9d1ecf7f7b33c7dd8177896e10bbc82f838dcd6db7ac67de62bf46b6a640fb580c5d1d2708f3862e3d2b645d0d18e49ef088053e3a220adc0e033c2afcfe61c90e32151152eb3caaf746c5e377d541cafc6cbb0cc0fa48b5caf1728f2e1957f5addfc234f1a9d89e40d49356c9172d0561a695fce6dab1d412321bbf407f63766ffd7b6b3d79bcfa07991c5a9709849c1008689e3b47c50d613980bec239fb64185249d055b30375ccb4354d71fe4d05648fbf6c80634dfc3575f2f24abb714c1e4c95e8896763bf4316e954c7ad19e5780ab7a040ca6fb9271f90a8b22ae738daf6cb", + name: "nagydani-5-square", + }, { + input: "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf03e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + expected: "5f9c70ec884926a89461056ad20ac4c30155e817f807e4d3f5bb743d789c83386762435c3627773fa77da5144451f2a8aad8adba88e0b669f5377c5e9bad70e45c86fe952b613f015a9953b8a5de5eaee4566acf98d41e327d93a35bd5cef4607d025e58951167957df4ff9b1627649d3943805472e5e293d3efb687cfd1e503faafeb2840a3e3b3f85d016051a58e1c9498aab72e63b748d834b31eb05d85dcde65e27834e266b85c75cc4ec0135135e0601cb93eeeb6e0010c8ceb65c4c319623c5e573a2c8c9fbbf7df68a930beb412d3f4dfd146175484f45d7afaa0d2e60684af9b34730f7c8438465ad3e1d0c3237336722f2aa51095bd5759f4b8ab4dda111b684aa3dac62a761722e7ae43495b7709933512c81c4e3c9133a51f7ce9f2b51fcec064f65779666960b4e45df3900f54311f5613e8012dd1b8efd359eda31a778264c72aa8bb419d862734d769076bce2810011989a45374e5c5d8729fec21427f0bf397eacbb4220f603cf463a4b0c94efd858ffd9768cd60d6ce68d755e0fbad007ce5c2223d70c7018345a102e4ab3c60a13a9e7794303156d4c2063e919f2153c13961fb324c80b240742f47773a7a8e25b3e3fb19b00ce839346c6eb3c732fbc6b888df0b1fe0a3d07b053a2e9402c267b2d62f794d8a2840526e3ade15ce2264496ccd7519571dfde47f7a4bb16292241c20b2be59f3f8fb4f6383f232d838c5a22d8c95b6834d9d2ca493f5a505ebe8899503b0e8f9b19e6e2dd81c1628b80016d02097e0134de51054c4e7674824d4d758760fc52377d2cad145e259aa2ffaf54139e1a66b1e0c1c191e32ac59474c6b526f5b3ba07d3e5ec286eddf531fcd5292869be58c9f22ef91026159f7cf9d05ef66b4299f4da48cc1635bf2243051d342d378a22c83390553e873713c0454ce5f3234397111ac3fe3207b86f0ed9fc025c81903e1748103692074f83824fda6341be4f95ff00b0a9a208c267e12fa01825054cc0513629bf3dbb56dc5b90d4316f87654a8be18227978ea0a8a522760cad620d0d14fd38920fb7321314062914275a5f99f677145a6979b156bd82ecd36f23f8e1273cc2759ecc0b2c69d94dad5211d1bed939dd87ed9e07b91d49713a6e16ade0a98aea789f04994e318e4ff2c8a188cd8d43aeb52c6daa3bc29b4af50ea82a247c5cd67b573b34cbadcc0a376d3bbd530d50367b42705d870f2e27a8197ef46070528bfe408360faa2ebb8bf76e9f388572842bcb119f4d84ee34ae31f5cc594f23705a49197b181fb78ed1ec99499c690f843a4d0cf2e226d118e9372271054fbabdcc5c92ae9fefaef0589cd0e722eaf30c1703ec4289c7fd81beaa8a455ccee5298e31e2080c10c366a6fcf56f7d13582ad0bcad037c612b710fc595b70fbefaaca23623b60c6c39b11beb8e5843b6b3dac60f", + name: "nagydani-5-qube", + }, { + input: "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf010001e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", + expected: "5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500", + name: "nagydani-5-pow0x10001"}, +} + +// bn256AddTests are the test and benchmark data for the bn256 addition precompiled +// contract. +var bn256AddTests = []precompiledTest{ + { + input: "18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f3726607c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6a014eed06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7", + expected: "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c915", + name: "chfast1", + }, { + input: "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c91518b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266", + expected: "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb204", + name: "chfast2"}, +} + +// bn256ScalarMulTests are the test and benchmark data for the bn256 scalar +// multipication precompiled contract. +var bn256ScalarMulTests = []precompiledTest{ + { + input: "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb20400000000000000000000000000000000000000000000000011138ce750fa15c2", + expected: "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc", + name: "chfast1", + }, { + input: "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46", + expected: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e", + name: "chfast2", + }, { + input: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", + expected: "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", + name: "chfast3"}, +} + +// bn256PairingTests are the test and benchmark data for the bn256 pairing check +// precompiled contract. +var bn256PairingTests = []precompiledTest{ + { + input: "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "jeff1", + }, { + input: "2eca0c7238bf16e83e7a1e6c5d49540685ff51380f309842a98561558019fc0203d3260361bb8451de5ff5ecd17f010ff22f5c31cdf184e9020b06fa5997db841213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f06967a1237ebfeca9aaae0d6d0bab8e28c198c5a339ef8a2407e31cdac516db922160fa257a5fd5b280642ff47b65eca77e626cb685c84fa6d3b6882a283ddd1198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "jeff2", + }, { + input: "0f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd216da2f5cb6be7a0aa72c440c53c9bbdfec6c36c7d515536431b3a865468acbba2e89718ad33c8bed92e210e81d1853435399a271913a6520736a4729cf0d51eb01a9e2ffa2e92599b68e44de5bcf354fa2642bd4f26b259daa6f7ce3ed57aeb314a9a87b789a58af499b314e13c3d65bede56c07ea2d418d6874857b70763713178fb49a2d6cd347dc58973ff49613a20757d0fcc22079f9abd10c3baee245901b9e027bd5cfc2cb5db82d4dc9677ac795ec500ecd47deee3b5da006d6d049b811d7511c78158de484232fc68daf8a45cf217d1c2fae693ff5871e8752d73b21198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "jeff3", + }, { + input: "2f2ea0b3da1e8ef11914acf8b2e1b32d99df51f5f4f206fc6b947eae860eddb6068134ddb33dc888ef446b648d72338684d678d2eb2371c61a50734d78da4b7225f83c8b6ab9de74e7da488ef02645c5a16a6652c3c71a15dc37fe3a5dcb7cb122acdedd6308e3bb230d226d16a105295f523a8a02bfc5e8bd2da135ac4c245d065bbad92e7c4e31bf3757f1fe7362a63fbfee50e7dc68da116e67d600d9bf6806d302580dc0661002994e7cd3a7f224e7ddc27802777486bf80f40e4ca3cfdb186bac5188a98c45e6016873d107f5cd131f3a3e339d0375e58bd6219347b008122ae2b09e539e152ec5364e7e2204b03d11d3caa038bfc7cd499f8176aacbee1f39e4e4afc4bc74790a4a028aff2c3d2538731fb755edefd8cb48d6ea589b5e283f150794b6736f670d6a1033f9b46c6f5204f50813eb85c8dc4b59db1c5d39140d97ee4d2b36d99bc49974d18ecca3e7ad51011956051b464d9e27d46cc25e0764bb98575bd466d32db7b15f582b2d5c452b36aa394b789366e5e3ca5aabd415794ab061441e51d01e94640b7e3084a07e02c78cf3103c542bc5b298669f211b88da1679b0b64a63b7e0e7bfe52aae524f73a55be7fe70c7e9bfc94b4cf0da1213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "jeff4", + }, { + input: "20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "jeff5", + }, { + input: "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000000", + name: "jeff6", + }, { // ecpairing_empty_data_insufficient_gas + input: "", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "empty_data", + }, { // ecpairing_one_point_insufficient_gas + input: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000000", + name: "one_point", + }, { // ecpairing_two_point_match_2 + input: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "two_point_match_2", + }, { // ecpairing_two_point_match_3 + input: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "two_point_match_3", + }, { // ecpairing_two_point_match_4 + input: "105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "two_point_match_4", + }, { + input: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "ten_point_match_1", + }, { + input: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "ten_point_match_2", + }, { // ecpairing_two_point_match_4 + input: "105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75", + expected: "0000000000000000000000000000000000000000000000000000000000000001", + name: "ten_point_match_3", + }, +} + +func testPrecompiled(addr string, test precompiledTest, t *testing.T) { + p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.input) + contract := NewContract(AccountRef(common.HexToAddress("1337")), + nil, new(big.Int), p.RequiredGas(in)) + t.Run(fmt.Sprintf("%s-Gas=%d", test.name, contract.Gas), func(t *testing.T) { + if res, err := RunPrecompiledContract(p, in, contract); err != nil { + t.Error(err) + } else if common.Bytes2Hex(res) != test.expected { + t.Errorf("Expected %v, got %v", test.expected, common.Bytes2Hex(res)) + } + }) +} + +func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { + p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.input) + reqGas := p.RequiredGas(in) + contract := NewContract(AccountRef(common.HexToAddress("1337")), + nil, new(big.Int), reqGas) + + var ( + res []byte + err error + data = make([]byte, len(in)) + ) + + bench.Run(fmt.Sprintf("%s-Gas=%d", test.name, contract.Gas), func(bench *testing.B) { + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + contract.Gas = reqGas + copy(data, in) + res, err = RunPrecompiledContract(p, data, contract) + } + bench.StopTimer() + //Check if it is correct + if err != nil { + bench.Error(err) + return + } + if common.Bytes2Hex(res) != test.expected { + bench.Error(fmt.Sprintf("Expected %v, got %v", test.expected, common.Bytes2Hex(res))) + return + } + }) +} + +// Benchmarks the sample inputs from the ECRECOVER precompile. +func BenchmarkPrecompiledEcrecover(bench *testing.B) { + t := precompiledTest{ + input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + expected: "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d", + name: "", + } + benchmarkPrecompiled("01", t, bench) +} + +// Benchmarks the sample inputs from the SHA256 precompile. +func BenchmarkPrecompiledSha256(bench *testing.B) { + t := precompiledTest{ + input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + expected: "811c7003375852fabd0d362e40e68607a12bdabae61a7d068fe5fdd1dbbf2a5d", + name: "128", + } + benchmarkPrecompiled("02", t, bench) +} + +// Benchmarks the sample inputs from the RIPEMD precompile. +func BenchmarkPrecompiledRipeMD(bench *testing.B) { + t := precompiledTest{ + input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + expected: "0000000000000000000000009215b8d9882ff46f0dfde6684d78e831467f65e6", + name: "128", + } + benchmarkPrecompiled("03", t, bench) +} + +// Benchmarks the sample inputs from the identiy precompile. +func BenchmarkPrecompiledIdentity(bench *testing.B) { + t := precompiledTest{ + input: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + expected: "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + name: "128", + } + benchmarkPrecompiled("04", t, bench) +} + // Tests the sample inputs from the ModExp EIP 198. func TestPrecompiledModExp(t *testing.T) { - bigModExp := &bigModExp{} + for _, test := range modexpTests { + testPrecompiled("05", test, t) + } +} - for i, tt := range []struct { - input string - gas uint64 - output string - }{ - {"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 2611, "0000000000000000000000000000000000000000000000000000000000000001"}, - {"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 2611, "0000000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", math.MaxUint64, ""}, - {"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007", 153, "3b01b01ac41f2d6e917c6d6a221ce793802469026d9ab7578fa2e79e4da6aaab"}, - {"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80", 153, "3b01b01ac41f2d6e917c6d6a221ce793802469026d9ab7578fa2e79e4da6aaab"}, - } { - gas := bigModExp.RequiredGas(common.FromHex(tt.input)) - if gas != tt.gas { - t.Errorf("test %d: required gas mismatch: have %v, want %v", i, gas, tt.gas) - continue - } - if gas == math.MaxUint64 { - continue // Out of gas - } - out, err := bigModExp.Run(common.FromHex(tt.input)) - if err != nil { - t.Errorf("test %d: contract execution failed: %v", i, err) - continue - } - if !bytes.Equal(out, common.FromHex(tt.output)) { - t.Errorf("test %d: contract output mismatch: have %x, want %v", i, out, tt.output) - } +// Benchmarks the sample inputs from the ModExp EIP 198. +func BenchmarkPrecompiledModExp(bench *testing.B) { + for _, test := range modexpTests { + benchmarkPrecompiled("05", test, bench) } } // Tests the sample inputs from the elliptic curve addition EIP 213. func TestPrecompiledBn256Add(t *testing.T) { - bn256Add := &bn256Add{} + for _, test := range bn256AddTests { + testPrecompiled("06", test, t) + } +} - for i, tt := range []struct { - input string - failure error - output string - }{ - {"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {"", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", errNotOnCurve, ""}, - } { - out, err := bn256Add.Run(common.FromHex(tt.input)) - if err != tt.failure { - t.Errorf("test %d: contract execution failure mismatch: have %v, want %v", i, err, tt.failure) - continue - } - if !bytes.Equal(out, common.FromHex(tt.output)) { - t.Errorf("test %d: contract output mismatch: have %x, want %v", i, out, tt.output) - } +// Benchmarks the sample inputs from the elliptic curve addition EIP 213. +func BenchmarkPrecompiledBn256Add(bench *testing.B) { + for _, test := range bn256AddTests { + benchmarkPrecompiled("06", test, bench) } } // Tests the sample inputs from the elliptic curve scalar multiplication EIP 213. func TestPrecompiledBn256ScalarMul(t *testing.T) { - bn256ScalarMul := &bn256ScalarMul{} + for _, test := range bn256ScalarMulTests { + testPrecompiled("07", test, t) + } +} - for i, tt := range []struct { - input string - failure error - output string - }{ - {"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {"", nil, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110f00000000000000000000000000000000000000000000000000000000000000", errNotOnCurve, ""}, - } { - out, err := bn256ScalarMul.Run(common.FromHex(tt.input)) - if err != tt.failure { - t.Errorf("test %d: contract execution failure mismatch: have %v, want %v", i, err, tt.failure) - continue - } - if !bytes.Equal(out, common.FromHex(tt.output)) { - t.Errorf("test %d: contract output mismatch: have %x, want %v", i, out, tt.output) - } +// Benchmarks the sample inputs from the elliptic curve scalar multiplication EIP 213. +func BenchmarkPrecompiledBn256ScalarMul(bench *testing.B) { + for _, test := range bn256ScalarMulTests { + benchmarkPrecompiled("07", test, bench) } } // Tests the sample inputs from the elliptic curve pairing check EIP 197. func TestPrecompiledBn256Pairing(t *testing.T) { - bn256Pairing := &bn256Pairing{} - - for i, tt := range []struct { - input string - valid int - }{ - {"1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, - {"2eca0c7238bf16e83e7a1e6c5d49540685ff51380f309842a98561558019fc0203d3260361bb8451de5ff5ecd17f010ff22f5c31cdf184e9020b06fa5997db841213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f06967a1237ebfeca9aaae0d6d0bab8e28c198c5a339ef8a2407e31cdac516db922160fa257a5fd5b280642ff47b65eca77e626cb685c84fa6d3b6882a283ddd1198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, - {"0f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd216da2f5cb6be7a0aa72c440c53c9bbdfec6c36c7d515536431b3a865468acbba2e89718ad33c8bed92e210e81d1853435399a271913a6520736a4729cf0d51eb01a9e2ffa2e92599b68e44de5bcf354fa2642bd4f26b259daa6f7ce3ed57aeb314a9a87b789a58af499b314e13c3d65bede56c07ea2d418d6874857b70763713178fb49a2d6cd347dc58973ff49613a20757d0fcc22079f9abd10c3baee245901b9e027bd5cfc2cb5db82d4dc9677ac795ec500ecd47deee3b5da006d6d049b811d7511c78158de484232fc68daf8a45cf217d1c2fae693ff5871e8752d73b21198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, - {"2f2ea0b3da1e8ef11914acf8b2e1b32d99df51f5f4f206fc6b947eae860eddb6068134ddb33dc888ef446b648d72338684d678d2eb2371c61a50734d78da4b7225f83c8b6ab9de74e7da488ef02645c5a16a6652c3c71a15dc37fe3a5dcb7cb122acdedd6308e3bb230d226d16a105295f523a8a02bfc5e8bd2da135ac4c245d065bbad92e7c4e31bf3757f1fe7362a63fbfee50e7dc68da116e67d600d9bf6806d302580dc0661002994e7cd3a7f224e7ddc27802777486bf80f40e4ca3cfdb186bac5188a98c45e6016873d107f5cd131f3a3e339d0375e58bd6219347b008122ae2b09e539e152ec5364e7e2204b03d11d3caa038bfc7cd499f8176aacbee1f39e4e4afc4bc74790a4a028aff2c3d2538731fb755edefd8cb48d6ea589b5e283f150794b6736f670d6a1033f9b46c6f5204f50813eb85c8dc4b59db1c5d39140d97ee4d2b36d99bc49974d18ecca3e7ad51011956051b464d9e27d46cc25e0764bb98575bd466d32db7b15f582b2d5c452b36aa394b789366e5e3ca5aabd415794ab061441e51d01e94640b7e3084a07e02c78cf3103c542bc5b298669f211b88da1679b0b64a63b7e0e7bfe52aae524f73a55be7fe70c7e9bfc94b4cf0da1213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f", 1}, - {"20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 1}, - {"1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", 0}, - } { - out, err := bn256Pairing.Run(common.FromHex(tt.input)) - if err != nil { - t.Errorf("test %d: contrac execution failed: %v", i, err) - } - if int(out[31]) != tt.valid { - t.Errorf("test %d: contract output mismatch: have %v, want %v", i, out[31], tt.valid) - } + for _, test := range bn256PairingTests { + testPrecompiled("08", test, t) + } +} + +// Behcnmarks the sample inputs from the elliptic curve pairing check EIP 197. +func BenchmarkPrecompiledPairing(bench *testing.B) { + for _, test := range bn256PairingTests { + benchmarkPrecompiled("08", test, bench) } } diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 13e411d127..18644989c1 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -1,7 +1,6 @@ package vm import ( - "fmt" "math/big" "testing" @@ -64,126 +63,44 @@ func opBenchmark(bench *testing.B, op func(pc *uint64, evm *EVM, contract *Contr } } -func precompiledBenchmark(addr, input, expected string, gas uint64, bench *testing.B) { - - contract := NewContract(AccountRef(common.HexToAddress("1337")), - nil, new(big.Int), gas) - - p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] - in := common.Hex2Bytes(input) - var ( - res []byte - err error - ) - data := make([]byte, len(in)) - bench.ResetTimer() - for i := 0; i < bench.N; i++ { - contract.Gas = gas - copy(data, in) - res, err = RunPrecompiledContract(p, data, contract) - } - bench.StopTimer() - //Check if it is correct - if err != nil { - bench.Error(err) - return - } - if common.Bytes2Hex(res) != expected { - bench.Error(fmt.Sprintf("Expected %v, got %v", expected, common.Bytes2Hex(res))) - return - } -} - -func BenchmarkPrecompiledECDSA(bench *testing.B) { - var ( - addr = "01" - inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" - exp = "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledSha256(bench *testing.B) { - var ( - addr = "02" - inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" - exp = "811c7003375852fabd0d362e40e68607a12bdabae61a7d068fe5fdd1dbbf2a5d" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledRipeMD(bench *testing.B) { - var ( - addr = "03" - inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" - exp = "0000000000000000000000009215b8d9882ff46f0dfde6684d78e831467f65e6" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledIdentity(bench *testing.B) { - var ( - addr = "04" - inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" - exp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledModExp(bench *testing.B) { - var ( - addr = "05" - inp = "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" - exp = "0000000000000000000000000000000000000000000000000000000000000001" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledBn256Add(bench *testing.B) { - var ( - addr = "06" - inp = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - exp = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledBn256ScalarMul(bench *testing.B) { - var ( - addr = "07" - inp = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - exp = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkPrecompiledBn256Pairing(bench *testing.B) { - var ( - addr = "08" - inp = "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa" - exp = "0000000000000000000000000000000000000000000000000000000000000001" - gas = uint64(4000000) - ) - precompiledBenchmark(addr, inp, exp, gas, bench) -} - -func BenchmarkOpAdd(b *testing.B) { - x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" - y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" +func BenchmarkOpAdd64(b *testing.B) { + x := "ffffffff" + y := "fd37f3e2bba2c4f" opBenchmark(b, opAdd, x, y) } -func BenchmarkOpSub(b *testing.B) { - x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" - y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" +func BenchmarkOpAdd128(b *testing.B) { + x := "ffffffffffffffff" + y := "f5470b43c6549b016288e9a65629687" + + opBenchmark(b, opAdd, x, y) +} + +func BenchmarkOpAdd256(b *testing.B) { + x := "0802431afcbce1fc194c9eaa417b2fb67dc75a95db0bc7ec6b1c8af11df6a1da9" + y := "a1f5aac137876480252e5dcac62c354ec0d42b76b0642b6181ed099849ea1d57" + + opBenchmark(b, opAdd, x, y) +} + +func BenchmarkOpSub64(b *testing.B) { + x := "51022b6317003a9d" + y := "a20456c62e00753a" + + opBenchmark(b, opSub, x, y) +} + +func BenchmarkOpSub128(b *testing.B) { + x := "4dde30faaacdc14d00327aac314e915d" + y := "9bbc61f5559b829a0064f558629d22ba" + + opBenchmark(b, opSub, x, y) +} + +func BenchmarkOpSub256(b *testing.B) { + x := "4bfcd8bb2ac462735b48a17580690283980aa2d679f091c64364594df113ea37" + y := "97f9b1765588c4e6b69142eb00d20507301545acf3e1238c86c8b29be227d46e" opBenchmark(b, opSub, x, y) } @@ -195,16 +112,27 @@ func BenchmarkOpMul(b *testing.B) { opBenchmark(b, opMul, x, y) } -func BenchmarkOpDiv(b *testing.B) { - x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" - y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" +func BenchmarkOpDiv256(b *testing.B) { + x := "ff3f9014f20db29ae04af2c2d265de17" + y := "fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611" + opBenchmark(b, opDiv, x, y) +} +func BenchmarkOpDiv128(b *testing.B) { + x := "fdedc7f10142ff97" + y := "fbdfda0e2ce356173d1993d5f70a2b11" + opBenchmark(b, opDiv, x, y) +} + +func BenchmarkOpDiv64(b *testing.B) { + x := "fcb34eb3" + y := "f97180878e839129" opBenchmark(b, opDiv, x, y) } func BenchmarkOpSdiv(b *testing.B) { - x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" - y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" + x := "ff3f9014f20db29ae04af2c2d265de17" + y := "fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611" opBenchmark(b, opSdiv, x, y) } @@ -315,12 +243,3 @@ func BenchmarkOpMulmod(b *testing.B) { opBenchmark(b, opMulmod, x, y, z) } - -//func BenchmarkOpSha3(b *testing.B) { -// x := "0" -// y := "32" -// -// opBenchmark(b,opSha3, x, y) -// -// -//} From f8d8b56b280dd921436fb046dbcaa010ef43122d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 14 Aug 2017 17:08:49 +0300 Subject: [PATCH 082/272] core/vm: optimize copy-less data retrievals --- core/vm/common.go | 16 +++++- core/vm/contracts.go | 103 ++++++++++++++++++++------------------ core/vm/contracts_test.go | 2 +- core/vm/instructions.go | 8 +-- 4 files changed, 75 insertions(+), 54 deletions(-) diff --git a/core/vm/common.go b/core/vm/common.go index 779cee006d..17de38decb 100644 --- a/core/vm/common.go +++ b/core/vm/common.go @@ -34,7 +34,21 @@ func calcMemSize(off, l *big.Int) *big.Int { // getData returns a slice from the data based on the start and size and pads // up to size with zero's. This function is overflow safe. -func getData(data []byte, start, size *big.Int) []byte { +func getData(data []byte, start uint64, size uint64) []byte { + length := uint64(len(data)) + if start > length { + start = length + } + end := start + size + if end > length { + end = length + } + return common.RightPadBytes(data[start:end], int(size)) +} + +// getDataBig returns a slice from the data based on the start and size and pads +// up to size with zero's. This function is overflow safe. +func getDataBig(data []byte, start *big.Int, size *big.Int) []byte { dlen := big.NewInt(int64(len(data))) s := math.BigMin(start, dlen) diff --git a/core/vm/contracts.go b/core/vm/contracts.go index c59779dac6..b885d42bb7 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -149,30 +149,41 @@ func (c *dataCopy) Run(in []byte) ([]byte, error) { // bigModExp implements a native big integer exponential modular operation. type bigModExp struct{} +var ( + big1 = big.NewInt(1) + big4 = big.NewInt(4) + big8 = big.NewInt(8) + big16 = big.NewInt(16) + big32 = big.NewInt(32) + big64 = big.NewInt(64) + big96 = big.NewInt(96) + big480 = big.NewInt(480) + big1024 = big.NewInt(1024) + big3072 = big.NewInt(3072) + big199680 = big.NewInt(199680) +) + // RequiredGas returns the gas required to execute the pre-compiled contract. func (c *bigModExp) RequiredGas(input []byte) uint64 { - // Pad the input with zeroes to the minimum size to read the field lengths - input = common.RightPadBytes(input, 96) - var ( - baseLen = new(big.Int).SetBytes(input[:32]) - expLen = new(big.Int).SetBytes(input[32:64]) - modLen = new(big.Int).SetBytes(input[64:96]) + baseLen = new(big.Int).SetBytes(getData(input, 0, 32)) + expLen = new(big.Int).SetBytes(getData(input, 32, 32)) + modLen = new(big.Int).SetBytes(getData(input, 64, 32)) ) - input = input[96:] - + if len(input) > 96 { + input = input[96:] + } else { + input = input[:0] + } // Retrieve the head 32 bytes of exp for the adjusted exponent length var expHead *big.Int if big.NewInt(int64(len(input))).Cmp(baseLen) <= 0 { expHead = new(big.Int) } else { - offset := int(baseLen.Uint64()) - - input = common.RightPadBytes(input, offset+32) - if expLen.Cmp(big.NewInt(32)) > 0 { - expHead = new(big.Int).SetBytes(input[offset : offset+32]) + if expLen.Cmp(big32) > 0 { + expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), 32)) } else { - expHead = new(big.Int).SetBytes(input[offset : offset+int(expLen.Uint64())]) + expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), expLen.Uint64())) } } // Calculate the adjusted exponent length @@ -181,29 +192,29 @@ func (c *bigModExp) RequiredGas(input []byte) uint64 { msb = bitlen - 1 } adjExpLen := new(big.Int) - if expLen.Cmp(big.NewInt(32)) > 0 { - adjExpLen.Sub(expLen, big.NewInt(32)) - adjExpLen.Mul(big.NewInt(8), adjExpLen) + if expLen.Cmp(big32) > 0 { + adjExpLen.Sub(expLen, big32) + adjExpLen.Mul(big8, adjExpLen) } adjExpLen.Add(adjExpLen, big.NewInt(int64(msb))) // Calculate the gas cost of the operation gas := new(big.Int).Set(math.BigMax(modLen, baseLen)) switch { - case gas.Cmp(big.NewInt(64)) <= 0: + case gas.Cmp(big64) <= 0: gas.Mul(gas, gas) - case gas.Cmp(big.NewInt(1024)) <= 0: + case gas.Cmp(big1024) <= 0: gas = new(big.Int).Add( - new(big.Int).Div(new(big.Int).Mul(gas, gas), big.NewInt(4)), - new(big.Int).Sub(new(big.Int).Mul(big.NewInt(96), gas), big.NewInt(3072)), + new(big.Int).Div(new(big.Int).Mul(gas, gas), big4), + new(big.Int).Sub(new(big.Int).Mul(big96, gas), big3072), ) default: gas = new(big.Int).Add( - new(big.Int).Div(new(big.Int).Mul(gas, gas), big.NewInt(16)), - new(big.Int).Sub(new(big.Int).Mul(big.NewInt(480), gas), big.NewInt(199680)), + new(big.Int).Div(new(big.Int).Mul(gas, gas), big16), + new(big.Int).Sub(new(big.Int).Mul(big480, gas), big199680), ) } - gas.Mul(gas, math.BigMax(adjExpLen, big.NewInt(1))) + gas.Mul(gas, math.BigMax(adjExpLen, big1)) gas.Div(gas, new(big.Int).SetUint64(params.ModExpQuadCoeffDiv)) if gas.BitLen() > 64 { @@ -213,23 +224,25 @@ func (c *bigModExp) RequiredGas(input []byte) uint64 { } func (c *bigModExp) Run(input []byte) ([]byte, error) { - // Pad the input with zeroes to the minimum size to read the field lengths - input = common.RightPadBytes(input, 96) - var ( - baseLen = new(big.Int).SetBytes(input[:32]).Uint64() - expLen = new(big.Int).SetBytes(input[32:64]).Uint64() - modLen = new(big.Int).SetBytes(input[64:96]).Uint64() + baseLen = new(big.Int).SetBytes(getData(input, 0, 32)).Uint64() + expLen = new(big.Int).SetBytes(getData(input, 32, 32)).Uint64() + modLen = new(big.Int).SetBytes(getData(input, 64, 32)).Uint64() ) - input = input[96:] - - // Pad the input with zeroes to the minimum size to read the field contents - input = common.RightPadBytes(input, int(baseLen+expLen+modLen)) - + if len(input) > 96 { + input = input[96:] + } else { + input = input[:0] + } + // Handle a special case when both the base and mod length is zero + if baseLen == 0 && modLen == 0 { + return []byte{}, nil + } + // Retrieve the operands and execute the exponentiation var ( - base = new(big.Int).SetBytes(input[:baseLen]) - exp = new(big.Int).SetBytes(input[baseLen : baseLen+expLen]) - mod = new(big.Int).SetBytes(input[baseLen+expLen : baseLen+expLen+modLen]) + base = new(big.Int).SetBytes(getData(input, 0, baseLen)) + exp = new(big.Int).SetBytes(getData(input, baseLen, expLen)) + mod = new(big.Int).SetBytes(getData(input, baseLen+expLen, modLen)) ) if mod.BitLen() == 0 { // Modulo 0 is undefined, return zero @@ -286,14 +299,11 @@ func (c *bn256Add) RequiredGas(input []byte) uint64 { } func (c *bn256Add) Run(input []byte) ([]byte, error) { - // Ensure we have enough data to operate on - input = common.RightPadBytes(input, 128) - - x, err := newCurvePoint(input[:64]) + x, err := newCurvePoint(getData(input, 0, 64)) if err != nil { return nil, err } - y, err := newCurvePoint(input[64:128]) + y, err := newCurvePoint(getData(input, 64, 64)) if err != nil { return nil, err } @@ -310,14 +320,11 @@ func (c *bn256ScalarMul) RequiredGas(input []byte) uint64 { } func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { - // Ensure we have enough data to operate on - input = common.RightPadBytes(input, 96) - - p, err := newCurvePoint(input[:64]) + p, err := newCurvePoint(getData(input, 0, 64)) if err != nil { return nil, err } - p.ScalarMult(p, new(big.Int).SetBytes(input[64:96])) + p.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) return p.Marshal(), nil } diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 4a2ed8101f..9bc860b5f0 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -325,7 +325,7 @@ func TestPrecompiledBn256Pairing(t *testing.T) { } // Behcnmarks the sample inputs from the elliptic curve pairing check EIP 197. -func BenchmarkPrecompiledPairing(bench *testing.B) { +func BenchmarkPrecompiledBn256Pairing(bench *testing.B) { for _, test := range bn256PairingTests { benchmarkPrecompiled("08", test, bench) } diff --git a/core/vm/instructions.go b/core/vm/instructions.go index f5164fcdd4..4f9e45ffe8 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -337,7 +337,7 @@ func opCallValue(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack } func opCalldataLoad(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(new(big.Int).SetBytes(getData(contract.Input, stack.pop(), common.Big32))) + stack.push(new(big.Int).SetBytes(getDataBig(contract.Input, stack.pop(), big32))) return nil, nil } @@ -352,7 +352,7 @@ func opCalldataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st cOff = stack.pop() l = stack.pop() ) - memory.Set(mOff.Uint64(), l.Uint64(), getData(contract.Input, cOff, l)) + memory.Set(mOff.Uint64(), l.Uint64(), getDataBig(contract.Input, cOff, l)) evm.interpreter.intPool.put(mOff, cOff, l) return nil, nil @@ -380,7 +380,7 @@ func opCodeCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack cOff = stack.pop() l = stack.pop() ) - codeCopy := getData(contract.Code, cOff, l) + codeCopy := getDataBig(contract.Code, cOff, l) memory.Set(mOff.Uint64(), l.Uint64(), codeCopy) @@ -395,7 +395,7 @@ func opExtCodeCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, sta cOff = stack.pop() l = stack.pop() ) - codeCopy := getData(evm.StateDB.GetCode(addr), cOff, l) + codeCopy := getDataBig(evm.StateDB.GetCode(addr), cOff, l) memory.Set(mOff.Uint64(), l.Uint64(), codeCopy) From 133de3d80659680dc051065cb3baddd92a4e45c5 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 8 Aug 2017 20:34:35 +0300 Subject: [PATCH 083/272] swarm: fix megacheck warnings --- swarm/api/api.go | 10 ++++------ swarm/api/client/client_test.go | 8 +++----- swarm/api/http/server.go | 2 +- swarm/api/http/server_test.go | 5 ++++- swarm/fuse/swarmfs_unix.go | 13 ++----------- swarm/network/hive.go | 2 +- swarm/network/messages.go | 23 +++++++---------------- swarm/network/protocol.go | 3 --- swarm/network/syncer.go | 3 +-- swarm/storage/chunker.go | 12 +++++------- swarm/storage/chunker_test.go | 21 --------------------- swarm/storage/dbstore.go | 7 +------ swarm/storage/dpa.go | 5 +---- swarm/storage/localstore.go | 4 +--- swarm/storage/memstore.go | 10 +--------- swarm/storage/netstore.go | 6 +----- swarm/storage/pyramid.go | 7 +++---- swarm/swarm.go | 6 +++--- 18 files changed, 39 insertions(+), 108 deletions(-) diff --git a/swarm/api/api.go b/swarm/api/api.go index 803265a3e7..7d185ab3ca 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -34,11 +34,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/storage" ) -var ( - hashMatcher = regexp.MustCompile("^[0-9A-Fa-f]{64}") - slashes = regexp.MustCompile("/+") - domainAndVersion = regexp.MustCompile("[@:;,]+") -) +var hashMatcher = regexp.MustCompile("^[0-9A-Fa-f]{64}") type Resolver interface { Resolve(string) (common.Hash, error) @@ -335,7 +331,6 @@ func (self *Api) AppendFile(mhash, path, fname string, existingSize int64, conte } func (self *Api) BuildDirectoryTree(mhash string, nameresolver bool) (key storage.Key, manifestEntryMap map[string]*manifestTrieEntry, err error) { - uri, err := Parse("bzz:/" + mhash) if err != nil { return nil, nil, err @@ -356,5 +351,8 @@ func (self *Api) BuildDirectoryTree(mhash string, nameresolver bool) (key storag manifestEntryMap[suffix] = entry }) + if err != nil { + return nil, nil, fmt.Errorf("list with prefix failed %v: %v", key.String(), err) + } return key, manifestEntryMap, nil } diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go index 03d25049d4..edf385dd08 100644 --- a/swarm/api/client/client_test.go +++ b/swarm/api/client/client_test.go @@ -89,8 +89,8 @@ func TestClientUploadDownloadFiles(t *testing.T) { if file.Size != int64(len(expected)) { t.Fatalf("expected downloaded file to be %d bytes, got %d", len(expected), file.Size) } - if file.ContentType != file.ContentType { - t.Fatalf("expected downloaded file to have type %q, got %q", file.ContentType, file.ContentType) + if file.ContentType != "text/plain" { + t.Fatalf("expected downloaded file to have type %q, got %q", "text/plain", file.ContentType) } data, err := ioutil.ReadAll(file) if err != nil { @@ -235,9 +235,7 @@ func TestClientFileList(t *testing.T) { t.Fatal(err) } paths := make([]string, 0, len(list.CommonPrefixes)+len(list.Entries)) - for _, prefix := range list.CommonPrefixes { - paths = append(paths, prefix) - } + paths = append(paths, list.CommonPrefixes...) for _, entry := range list.Entries { paths = append(paths, entry.Path) } diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index b4032839af..0b4ec7e18e 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -224,7 +224,7 @@ func (s *Server) handleMultipartUpload(req *Request, boundary string, mw *api.Ma if err != nil { return fmt.Errorf("error copying multipart content: %s", err) } - if _, err := tmp.Seek(0, os.SEEK_SET); err != nil { + if _, err := tmp.Seek(0, io.SeekStart); err != nil { return fmt.Errorf("error copying multipart content: %s", err) } reader = tmp diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 14abd1df4a..d3374594b6 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -97,7 +97,7 @@ func TestBzzrGetPath(t *testing.T) { isexpectedfailrequest = true } } - if isexpectedfailrequest == false { + if !isexpectedfailrequest { t.Fatalf("Response body does not match, expected: %v, got %v", testmanifest[v], string(respbody)) } } @@ -126,6 +126,9 @@ func TestBzzrGetPath(t *testing.T) { } defer resp.Body.Close() respbody, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatalf("ReadAll failed: %v", err) + } if string(respbody) != nonhashresponses[i] { t.Fatalf("Non-Hash response body does not match, expected: %v, got: %v", nonhashresponses[i], string(respbody)) } diff --git a/swarm/fuse/swarmfs_unix.go b/swarm/fuse/swarmfs_unix.go index 1a8390a4b9..75742845a2 100644 --- a/swarm/fuse/swarmfs_unix.go +++ b/swarm/fuse/swarmfs_unix.go @@ -59,14 +59,6 @@ type MountInfo struct { lock *sync.RWMutex } -// Inode numbers need to be unique, they are used for caching inside fuse -func newInode() uint64 { - inodeLock.Lock() - defer inodeLock.Unlock() - inode += 1 - return inode -} - func NewMountInfo(mhash, mpoint string, sapi *api.Api) *MountInfo { newMountInfo := &MountInfo{ MountPoint: mpoint, @@ -103,7 +95,7 @@ func (self *SwarmFS) Mount(mhash, mountpoint string) (*MountInfo, error) { } log.Info(fmt.Sprintf("Attempting to mount %s ", cleanedMountPoint)) - key, manifestEntryMap, err := self.swarmApi.BuildDirectoryTree(mhash, true) + _, manifestEntryMap, err := self.swarmApi.BuildDirectoryTree(mhash, true) if err != nil { return nil, err } @@ -116,8 +108,7 @@ func (self *SwarmFS) Mount(mhash, mountpoint string) (*MountInfo, error) { mi.rootDir = rootDir for suffix, entry := range manifestEntryMap { - - key = common.Hex2Bytes(entry.Hash) + key := common.Hex2Bytes(entry.Hash) fullpath := "/" + suffix basepath := filepath.Dir(fullpath) diff --git a/swarm/network/hive.go b/swarm/network/hive.go index 70652c4509..d37b7e4006 100644 --- a/swarm/network/hive.go +++ b/swarm/network/hive.go @@ -355,7 +355,7 @@ func saveSync(record *kademlia.NodeRecord, node kademlia.Node) { // sends relevant peer data given by the kademlia hive to the requester // TODO: remember peers sent for duration of the session, only new peers sent func (self *Hive) peers(req *retrieveRequestMsgData) { - if req != nil && req.MaxPeers >= 0 { + if req != nil { var addrs []*peerAddr if req.timeout == nil || time.Now().Before(*(req.timeout)) { key := req.Key diff --git a/swarm/network/messages.go b/swarm/network/messages.go index d3858c4240..d920def959 100644 --- a/swarm/network/messages.go +++ b/swarm/network/messages.go @@ -133,7 +133,7 @@ type retrieveRequestMsgData struct { from *peer // } -func (self retrieveRequestMsgData) String() string { +func (self *retrieveRequestMsgData) String() string { var from string if self.from == nil { from = "ourselves" @@ -148,12 +148,12 @@ func (self retrieveRequestMsgData) String() string { } // lookups are encoded by missing request ID -func (self retrieveRequestMsgData) isLookup() bool { +func (self *retrieveRequestMsgData) isLookup() bool { return self.Id == 0 } // sets timeout fields -func (self retrieveRequestMsgData) setTimeout(t *time.Time) { +func (self *retrieveRequestMsgData) setTimeout(t *time.Time) { self.timeout = t if t != nil { self.Timeout = uint64(t.UnixNano()) @@ -162,7 +162,7 @@ func (self retrieveRequestMsgData) setTimeout(t *time.Time) { } } -func (self retrieveRequestMsgData) getTimeout() (t *time.Time) { +func (self *retrieveRequestMsgData) getTimeout() (t *time.Time) { if self.Timeout > 0 && self.timeout == nil { timeout := time.Unix(int64(self.Timeout), 0) t = &timeout @@ -180,7 +180,7 @@ type peerAddr struct { } // peerAddr pretty prints as enode -func (self peerAddr) String() string { +func (self *peerAddr) String() string { var nodeid discover.NodeID copy(nodeid[:], self.ID) return discover.NewNode(nodeid, self.IP, 0, self.Port).String() @@ -213,7 +213,7 @@ type peersMsgData struct { } // peers msg pretty printer -func (self peersMsgData) String() string { +func (self *peersMsgData) String() string { var from string if self.from == nil { from = "ourselves" @@ -227,7 +227,7 @@ func (self peersMsgData) String() string { return fmt.Sprintf("from: %v, Key: %x; ID: %v, Peers: %v", from, target, self.Id, self.Peers) } -func (self peersMsgData) setTimeout(t *time.Time) { +func (self *peersMsgData) setTimeout(t *time.Time) { self.timeout = t if t != nil { self.Timeout = uint64(t.UnixNano()) @@ -236,15 +236,6 @@ func (self peersMsgData) setTimeout(t *time.Time) { } } -func (self peersMsgData) getTimeout() (t *time.Time) { - if self.Timeout > 0 && self.timeout == nil { - timeout := time.Unix(int64(self.Timeout), 0) - t = &timeout - self.timeout = t - } - return -} - /* syncRequest diff --git a/swarm/network/protocol.go b/swarm/network/protocol.go index d013b3109b..2f880df570 100644 --- a/swarm/network/protocol.go +++ b/swarm/network/protocol.go @@ -40,7 +40,6 @@ import ( "github.com/ethereum/go-ethereum/contracts/chequebook" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" bzzswap "github.com/ethereum/go-ethereum/swarm/services/swap" "github.com/ethereum/go-ethereum/swarm/services/swap/swap" "github.com/ethereum/go-ethereum/swarm/storage" @@ -56,8 +55,6 @@ const ( // bzz represents the swarm wire protocol // an instance is running on each peer type bzz struct { - selfID discover.NodeID // peer's node id used in peer advertising in handshake - key storage.Key // baseaddress as storage.Key storage StorageHandler // handler storage/retrieval related requests coming via the bzz wire protocol hive *Hive // the logistic manager, peerPool, routing service and peer handler dbAccess *DbAccess // access to db storage counter and iterator for syncing diff --git a/swarm/network/syncer.go b/swarm/network/syncer.go index 20129c2a81..a3814e4232 100644 --- a/swarm/network/syncer.go +++ b/swarm/network/syncer.go @@ -156,8 +156,7 @@ type syncer struct { quit chan bool // signal to quit loops // DB related fields - dbAccess *DbAccess // access to dbStore - db *storage.LDBDatabase // delivery msg db + dbAccess *DbAccess // access to dbStore // native fields queues [priorities]*syncDb // in-memory cache / queues for sync reqs diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go index d55875369d..563793e98f 100644 --- a/swarm/storage/chunker.go +++ b/swarm/storage/chunker.go @@ -156,14 +156,12 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s close(errC) }() - select { - case err := <-errC: - if err != nil { - close(quitC) - return nil, err - } - //TODO: add a timeout + //TODO: add a timeout + if err := <-errC; err != nil { + close(quitC) + return nil, err } + return key, nil } diff --git a/swarm/storage/chunker_test.go b/swarm/storage/chunker_test.go index 40f870246f..426074e59a 100644 --- a/swarm/storage/chunker_test.go +++ b/swarm/storage/chunker_test.go @@ -43,13 +43,6 @@ type chunkerTester struct { t test } -func (self *chunkerTester) checkChunks(t *testing.T, want int) { - l := len(self.chunks) - if l != want { - t.Errorf("expected %v chunks, got %v", want, l) - } -} - func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, chunkC chan *Chunk, swg *sync.WaitGroup, expectedError error) (key Key) { // reset self.chunks = make(map[string]*Chunk) @@ -209,20 +202,6 @@ func TestRandomBrokenData(t *testing.T) { } } -func readAll(reader LazySectionReader, result []byte) { - size := int64(len(result)) - - var end int64 - for pos := int64(0); pos < size; pos += 1000 { - if pos+1000 > size { - end = size - } else { - end = pos + 1000 - } - reader.ReadAt(result[pos:end], pos) - } -} - func benchReadAll(reader LazySectionReader) { size, _ := reader.Size(nil) output := make([]byte, 1000) diff --git a/swarm/storage/dbstore.go b/swarm/storage/dbstore.go index 0761130846..cbeddb8cb5 100644 --- a/swarm/storage/dbstore.go +++ b/swarm/storage/dbstore.go @@ -514,8 +514,7 @@ func (s *DbStore) setCapacity(c uint64) { s.capacity = c if s.entryCnt > c { - var ratio float32 - ratio = float32(1.01) - float32(c)/float32(s.entryCnt) + ratio := float32(1.01) - float32(c)/float32(s.entryCnt) if ratio < gcArrayFreeRatio { ratio = gcArrayFreeRatio } @@ -528,10 +527,6 @@ func (s *DbStore) setCapacity(c uint64) { } } -func (s *DbStore) getEntryCnt() uint64 { - return s.entryCnt -} - func (s *DbStore) Close() { s.db.Close() } diff --git a/swarm/storage/dpa.go b/swarm/storage/dpa.go index e16e4aacb4..44a2669f12 100644 --- a/swarm/storage/dpa.go +++ b/swarm/storage/dpa.go @@ -59,7 +59,6 @@ type DPA struct { lock sync.Mutex running bool - wg *sync.WaitGroup quitC chan bool } @@ -239,6 +238,4 @@ func (self *dpaChunkStore) Put(entry *Chunk) { } // Close chunk store -func (self *dpaChunkStore) Close() { - return -} +func (self *dpaChunkStore) Close() {} diff --git a/swarm/storage/localstore.go b/swarm/storage/localstore.go index 14827e3618..58f59d0a24 100644 --- a/swarm/storage/localstore.go +++ b/swarm/storage/localstore.go @@ -74,6 +74,4 @@ func (self *LocalStore) Get(key Key) (chunk *Chunk, err error) { } // Close local store -func (self *LocalStore) Close() { - return -} +func (self *LocalStore) Close() {} diff --git a/swarm/storage/memstore.go b/swarm/storage/memstore.go index f96792c6ea..155dd00882 100644 --- a/swarm/storage/memstore.go +++ b/swarm/storage/memstore.go @@ -130,10 +130,6 @@ func (s *MemStore) setCapacity(c uint) { s.capacity = c } -func (s *MemStore) getEntryCnt() uint { - return s.entryCnt -} - // entry (not its copy) is going to be in MemStore func (s *MemStore) Put(entry *Chunk) { if s.capacity == 0 { @@ -206,8 +202,6 @@ func (s *MemStore) Put(entry *Chunk) { node.lastDBaccess = s.dbAccessCnt node.updateAccess(s.accessCnt) s.entryCnt++ - - return } func (s *MemStore) Get(hash Key) (chunk *Chunk, err error) { @@ -323,6 +317,4 @@ func (s *MemStore) removeOldest() { } // Close memstore -func (s *MemStore) Close() { - return -} +func (s *MemStore) Close() {} diff --git a/swarm/storage/netstore.go b/swarm/storage/netstore.go index 7c0436c3fd..746dd85f69 100644 --- a/swarm/storage/netstore.go +++ b/swarm/storage/netstore.go @@ -19,7 +19,6 @@ package storage import ( "fmt" "path/filepath" - "sync" "time" "github.com/ethereum/go-ethereum/log" @@ -40,7 +39,6 @@ type NetStore struct { hashfunc Hasher localStore *LocalStore cloud CloudStore - lock sync.Mutex } // backend engine for cloud store @@ -134,6 +132,4 @@ func (self *NetStore) Get(key Key) (*Chunk, error) { } // Close netstore -func (self *NetStore) Close() { - return -} +func (self *NetStore) Close() {} diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go index 79e1927b94..74e00a4971 100644 --- a/swarm/storage/pyramid.go +++ b/swarm/storage/pyramid.go @@ -178,10 +178,9 @@ func (self *PyramidChunker) processor(pend, swg *sync.WaitGroup, tasks chan *Tas if swg != nil { swg.Add(1) } - select { - case chunkC <- &Chunk{Key: hash, SData: data, wg: swg}: - // case <- self.quitC - } + + chunkC <- &Chunk{Key: hash, SData: data, wg: swg} + // TODO: consider selecting on self.quitC to avoid blocking forever on shutdown } if depth+1 < len(results.Levels) { delete(results.Levels[depth+1], task.Index/(pow/self.branches)) diff --git a/swarm/swarm.go b/swarm/swarm.go index 8304908433..9db15325ae 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -115,11 +115,11 @@ func NewSwarm(ctx *node.ServiceContext, backend chequebook.Backend, ensClient *e log.Debug(fmt.Sprintf("Set up swarm network with Kademlia hive")) // setup cloud storage backend - cloud := network.NewForwarder(self.hive) + self.cloud = network.NewForwarder(self.hive) log.Debug(fmt.Sprintf("-> set swarm forwarder as cloud storage backend")) - // setup cloud storage internal access layer - self.storage = storage.NewNetStore(hash, self.lstore, cloud, config.StoreParams) + // setup cloud storage internal access layer + self.storage = storage.NewNetStore(hash, self.lstore, self.cloud, config.StoreParams) log.Debug(fmt.Sprintf("-> swarm net store shared access layer to Swarm Chunk Store")) // set up Depo (storage handler = cloud storage access layer for incoming remote requests) From 30402430427854b61e9836850d6163554c4c667d Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Tue, 15 Aug 2017 11:31:36 +0200 Subject: [PATCH 084/272] cmd/evm: add --receiver, support code from stdin (#14873) --- cmd/evm/main.go | 7 +++++- cmd/evm/runner.go | 59 ++++++++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 1892ae3d31..a2e3b048e7 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -53,7 +53,7 @@ var ( } CodeFileFlag = cli.StringFlag{ Name: "codefile", - Usage: "file containing EVM code", + Usage: "File containing EVM code. If '-' is specified, code is read from stdin ", } GasFlag = cli.Uint64Flag{ Name: "gas", @@ -102,6 +102,10 @@ var ( Name: "sender", Usage: "The transaction origin", } + ReceiverFlag = cli.StringFlag{ + Name: "receiver", + Usage: "The transaction receiver (execution context)", + } DisableMemoryFlag = cli.BoolFlag{ Name: "nomemory", Usage: "disable memory output", @@ -131,6 +135,7 @@ func init() { GenesisFlag, MachineFlag, SenderFlag, + ReceiverFlag, DisableMemoryFlag, DisableStackFlag, } diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index 3f95a0c93a..ae56781103 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -84,6 +84,7 @@ func runCmd(ctx *cli.Context) error { statedb *state.StateDB chainConfig *params.ChainConfig sender = common.StringToAddress("sender") + receiver = common.StringToAddress("receiver") ) if ctx.GlobalBool(MachineFlag.Name) { tracer = NewJSONLogger(logconfig, os.Stdout) @@ -104,46 +105,52 @@ func runCmd(ctx *cli.Context) error { if ctx.GlobalString(SenderFlag.Name) != "" { sender = common.HexToAddress(ctx.GlobalString(SenderFlag.Name)) } - statedb.CreateAccount(sender) + if ctx.GlobalString(ReceiverFlag.Name) != "" { + receiver = common.HexToAddress(ctx.GlobalString(ReceiverFlag.Name)) + } + var ( code []byte ret []byte err error ) - if fn := ctx.Args().First(); len(fn) > 0 { + // The '--code' or '--codefile' flag overrides code in state + if ctx.GlobalString(CodeFileFlag.Name) != "" { + var hexcode []byte + var err error + // If - is specified, it means that code comes from stdin + if ctx.GlobalString(CodeFileFlag.Name) == "-" { + //Try reading from stdin + if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil { + fmt.Printf("Could not load code from stdin: %v\n", err) + os.Exit(1) + } + } else { + // Codefile with hex assembly + if hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name)); err != nil { + fmt.Printf("Could not load code from file: %v\n", err) + os.Exit(1) + } + } + code = common.Hex2Bytes(string(bytes.TrimRight(hexcode, "\n"))) + + } else if ctx.GlobalString(CodeFlag.Name) != "" { + code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)) + } else if fn := ctx.Args().First(); len(fn) > 0 { + // EASM-file to compile src, err := ioutil.ReadFile(fn) if err != nil { return err } - bin, err := compiler.Compile(fn, src, false) if err != nil { return err } code = common.Hex2Bytes(bin) - } else if ctx.GlobalString(CodeFlag.Name) != "" { - code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)) - } else { - var hexcode []byte - if ctx.GlobalString(CodeFileFlag.Name) != "" { - var err error - hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name)) - if err != nil { - fmt.Printf("Could not load code from file: %v\n", err) - os.Exit(1) - } - } else { - var err error - hexcode, err = ioutil.ReadAll(os.Stdin) - if err != nil { - fmt.Printf("Could not load code from stdin: %v\n", err) - os.Exit(1) - } - } - code = common.Hex2Bytes(string(bytes.TrimRight(hexcode, "\n"))) } + initialGas := ctx.GlobalUint64(GasFlag.Name) runtimeConfig := runtime.Config{ Origin: sender, @@ -180,9 +187,9 @@ func runCmd(ctx *cli.Context) error { input := append(code, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name))...) ret, _, leftOverGas, err = runtime.Create(input, &runtimeConfig) } else { - receiver := common.StringToAddress("receiver") - statedb.SetCode(receiver, code) - + if len(code) > 0 { + statedb.SetCode(receiver, code) + } ret, leftOverGas, err = runtime.Call(receiver, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)), &runtimeConfig) } execTime := time.Since(tstart) From 3d123bcde67973b57c0a9e7edc219cc2ea589443 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Tue, 15 Aug 2017 11:23:23 +0300 Subject: [PATCH 085/272] core/vm: implement metropolis static call opcode --- core/vm/evm.go | 45 +++++++++++++++++++++++++++++++++++++++++ core/vm/gas_table.go | 27 +++++++++++++++++++++++++ core/vm/instructions.go | 33 +++++++++++++++++++++++++++++- core/vm/interpreter.go | 16 +++++++++++++++ core/vm/jump_table.go | 25 +++++++++++++++++++++-- core/vm/memory_table.go | 7 +++++++ core/vm/opcodes.go | 3 +++ 7 files changed, 153 insertions(+), 3 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index b8af9bd15f..97a9d31053 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -245,6 +245,51 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by return ret, contract.Gas, err } +func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { + if evm.vmConfig.NoRecursion && evm.depth > 0 { + return nil, gas, nil + } + + // Depth check execution. Fail if we're trying to execute above the + // limit. + if evm.depth > int(params.CallCreateDepth) { + return nil, gas, ErrDepth + } + + // make sure the readonly is only set if we aren't in readonly yet + // this makes also sure that the readonly flag isn't removed for + // child calls. + if !evm.interpreter.readonly { + evm.interpreter.readonly = true + defer func() { evm.interpreter.readonly = false }() + } + + var ( + to = AccountRef(addr) + snapshot = evm.StateDB.Snapshot() + ) + if !evm.StateDB.Exist(addr) { + return nil, gas, nil + } + + // initialise a new contract and set the code that is to be used by the + // EVM. The contract is a scoped evmironment for this execution context + // only. + contract := NewContract(caller, to, new(big.Int), gas) + contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) + + ret, err = evm.interpreter.Run(snapshot, contract, input) + // When an error was returned by the EVM or when setting the creation code + // above we revert to the snapshot and consume any gas remaining. Additionally + // when we're in homestead this also counts for code storage gas errors. + if err != nil { + contract.UseGas(contract.Gas) + + evm.StateDB.RevertToSnapshot(snapshot) + } + return ret, contract.Gas, err +} + // Create creates a new contract using code as deployment code. func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 761ca44507..8a6c2741de 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -423,6 +423,33 @@ func gasDelegateCall(gt params.GasTable, evm *EVM, contract *Contract, stack *St return gas, nil } +func gasStaticCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + var overflow bool + if gas, overflow = math.SafeAdd(gas, gt.Calls); overflow { + return 0, errGasUintOverflow + } + + cg, err := callGas(gt, contract.Gas, gas, stack.Back(0)) + if err != nil { + return 0, err + } + // Replace the stack item with the new gas calculation. This means that + // either the original item is left on the stack or the item is replaced by: + // (availableGas - gas) * 63 / 64 + // We replace the stack item so that it's available when the opCall instruction is + // called. + stack.data[stack.len()-1] = new(big.Int).SetUint64(cg) + + if gas, overflow = math.SafeAdd(gas, cg); overflow { + return 0, errGasUintOverflow + } + return gas, nil +} + func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return GasFastestStep, nil } diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 4f9e45ffe8..aaa8d7945e 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -17,6 +17,7 @@ package vm import ( + "errors" "fmt" "math/big" @@ -28,7 +29,8 @@ import ( ) var ( - bigZero = new(big.Int) + bigZero = new(big.Int) + errWriteProtection = errors.New("evm: write protection") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -656,6 +658,35 @@ func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st return ret, nil } +func opStaticCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + // pop gas + gas := stack.pop().Uint64() + // pop address + addr := stack.pop() + // pop input size and offset + inOffset, inSize := stack.pop(), stack.pop() + // pop return size and offset + retOffset, retSize := stack.pop(), stack.pop() + + address := common.BigToAddress(addr) + + // Get the arguments from the memory + args := memory.Get(inOffset.Int64(), inSize.Int64()) + + ret, returnGas, err := evm.StaticCall(contract, address, args, gas) + if err != nil { + stack.push(new(big.Int)) + } else { + stack.push(big.NewInt(1)) + + memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + } + contract.Gas += returnGas + + evm.interpreter.intPool.put(addr, inOffset, inSize, retOffset, retSize) + return ret, nil +} + func opReturn(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset, size := stack.pop(), stack.pop() ret := memory.GetPtr(offset.Int64(), size.Int64()) diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 3faa987047..32d764b9f4 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -69,6 +69,8 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { // we'll set the default jump table. if !cfg.JumpTable[STOP].valid { switch { + case evm.ChainConfig().IsMetropolis(evm.BlockNumber): + cfg.JumpTable = metropolisInstructionSet case evm.ChainConfig().IsHomestead(evm.BlockNumber): cfg.JumpTable = homesteadInstructionSet default: @@ -85,6 +87,19 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { } func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { + if in.evm.chainRules.IsMetropolis { + if in.readonly { + // if the interpreter is operating in readonly mode, make sure no + // state-modifying operation is performed. The 4th stack item + // for a call operation is the value. Transfering value from one + // account to the others means the state is modified and should also + // return with an error. + if operation.writes || + ((op == CALL || op == CALLCODE) && stack.Back(3).BitLen() > 0) { + return errWriteProtection + } + } + } return nil } @@ -95,6 +110,7 @@ func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack // considered a revert-and-consume-all-gas operation. No error specific checks // should be handled to reduce complexity and errors further down the in. func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret []byte, err error) { + // Increment the call depth which is restricted to 1024 in.evm.depth++ defer func() { in.evm.depth-- }() diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 0034eacb7d..f6e8dae665 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -56,10 +56,26 @@ type operation struct { } var ( - frontierInstructionSet = NewFrontierInstructionSet() - homesteadInstructionSet = NewHomesteadInstructionSet() + frontierInstructionSet = NewFrontierInstructionSet() + homesteadInstructionSet = NewHomesteadInstructionSet() + metropolisInstructionSet = NewMetropolisInstructionSet() ) +// NewMetropolisInstructionSet returns the frontier, homestead and +// metropolis instructions. +func NewMetropolisInstructionSet() [256]operation { + // instructions that can be executed during the homestead phase. + instructionSet := NewHomesteadInstructionSet() + instructionSet[STATICCALL] = operation{ + execute: opStaticCall, + gasCost: gasStaticCall, + validateStack: makeStackFunc(6, 1), + memorySize: memoryStaticCall, + valid: true, + } + return instructionSet +} + // NewHomesteadInstructionSet returns the frontier and homestead // instructions that can be executed during the homestead phase. func NewHomesteadInstructionSet() [256]operation { @@ -810,6 +826,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(2, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG1: { execute: makeLog(1), @@ -817,6 +834,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(3, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG2: { execute: makeLog(2), @@ -824,6 +842,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(4, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG3: { execute: makeLog(3), @@ -831,6 +850,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(5, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG4: { execute: makeLog(4), @@ -838,6 +858,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(6, 0), memorySize: memoryLog, valid: true, + writes: true, }, CREATE: { execute: opCreate, diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index 654137c70b..9d293a2f2c 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -74,6 +74,13 @@ func memoryDelegateCall(stack *Stack) *big.Int { return math.BigMax(x, y) } +func memoryStaticCall(stack *Stack) *big.Int { + x := calcMemSize(stack.Back(4), stack.Back(5)) + y := calcMemSize(stack.Back(2), stack.Back(3)) + + return math.BigMax(x, y) +} + func memoryReturn(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(1)) } diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index d4ba7f1563..51925e8ddd 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -201,6 +201,7 @@ const ( CALLCODE RETURN DELEGATECALL + STATICCALL = 0xfa SELFDESTRUCT = 0xff ) @@ -355,6 +356,7 @@ var opCodeToString = map[OpCode]string{ RETURN: "RETURN", CALLCODE: "CALLCODE", DELEGATECALL: "DELEGATECALL", + STATICCALL: "STATICCALL", SELFDESTRUCT: "SELFDESTRUCT", PUSH: "PUSH", @@ -405,6 +407,7 @@ var stringToOp = map[string]OpCode{ "CALLDATASIZE": CALLDATASIZE, "CALLDATACOPY": CALLDATACOPY, "DELEGATECALL": DELEGATECALL, + "STATICCALL": STATICCALL, "CODESIZE": CODESIZE, "CODECOPY": CODECOPY, "GASPRICE": GASPRICE, From 3df7142b3e2804aa7ccf88cc0c2663861ebfa3b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 15 Aug 2017 12:56:09 +0300 Subject: [PATCH 086/272] core/vm: minor polishes, fix STATICCALL for precompiles * Fix STATICCALL so it is able to call precompiles too * Fix write detection to use the correct value argument of CALL * Fix write protection to ignore the value in CALLCODE --- core/vm/evm.go | 63 ++++++++++++++++++++---------------------- core/vm/interpreter.go | 7 ++--- 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index 97a9d31053..cc4214a163 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -123,19 +123,20 @@ func (evm *EVM) Cancel() { atomic.StoreInt32(&evm.abort, 1) } -// Call executes the contract associated with the addr with the given input as parameters. It also handles any -// necessary value transfer required and takes the necessary steps to create accounts and reverses the state in -// case of an execution error or failed value transfer. +// Call executes the contract associated with the addr with the given input as +// parameters. It also handles any necessary value transfer required and takes +// the necessary steps to create accounts and reverses the state in case of an +// execution error or failed value transfer. func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } - // Depth check execution. Fail if we're trying to execute above the - // limit. + // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } + // Fail if we're trying to transfer more than the available balance if !evm.Context.CanTransfer(evm.StateDB, caller.Address(), value) { return nil, gas, ErrInsufficientBalance } @@ -173,21 +174,23 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas return ret, contract.Gas, err } -// CallCode executes the contract associated with the addr with the given input as parameters. It also handles any -// necessary value transfer required and takes the necessary steps to create accounts and reverses the state in -// case of an execution error or failed value transfer. +// CallCode executes the contract associated with the addr with the given input +// as parameters. It also handles any necessary value transfer required and takes +// the necessary steps to create accounts and reverses the state in case of an +// execution error or failed value transfer. // -// CallCode differs from Call in the sense that it executes the given address' code with the caller as context. +// CallCode differs from Call in the sense that it executes the given address' +// code with the caller as context. func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } - // Depth check execution. Fail if we're trying to execute above the - // limit. + // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } + // Fail if we're trying to transfer more than the available balance if !evm.CanTransfer(evm.StateDB, caller.Address(), value) { return nil, gas, ErrInsufficientBalance } @@ -211,18 +214,16 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, return ret, contract.Gas, err } -// DelegateCall executes the contract associated with the addr with the given input as parameters. -// It reverses the state in case of an execution error. +// DelegateCall executes the contract associated with the addr with the given input +// as parameters. It reverses the state in case of an execution error. // -// DelegateCall differs from CallCode in the sense that it executes the given address' code with the caller as context -// and the caller is set to the caller of the caller. +// DelegateCall differs from CallCode in the sense that it executes the given address' +// code with the caller as context and the caller is set to the caller of the caller. func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } - - // Depth check execution. Fail if we're trying to execute above the - // limit. + // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } @@ -232,7 +233,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by to = AccountRef(caller.Address()) ) - // Iinitialise a new contract and make initialise the delegate values + // Initialise a new contract and make initialise the delegate values contract := NewContract(caller, to, nil, gas).AsDelegate() contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) @@ -245,18 +246,19 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by return ret, contract.Gas, err } +// StaticCall executes the contract associated with the addr with the given input +// as parameters while disallowing any modifications to the state during the call. +// Opcodes that attempt to perform such modifications will result in exceptions +// instead of performing the modifications. func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } - - // Depth check execution. Fail if we're trying to execute above the - // limit. + // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } - - // make sure the readonly is only set if we aren't in readonly yet + // Make sure the readonly is only set if we aren't in readonly yet // this makes also sure that the readonly flag isn't removed for // child calls. if !evm.interpreter.readonly { @@ -268,23 +270,18 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte to = AccountRef(addr) snapshot = evm.StateDB.Snapshot() ) - if !evm.StateDB.Exist(addr) { - return nil, gas, nil - } - - // initialise a new contract and set the code that is to be used by the - // EVM. The contract is a scoped evmironment for this execution context + // Initialise a new contract and set the code that is to be used by the + // EVM. The contract is a scoped environment for this execution context // only. contract := NewContract(caller, to, new(big.Int), gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) - ret, err = evm.interpreter.Run(snapshot, contract, input) // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally - // when we're in homestead this also counts for code storage gas errors. + // when we're in Homestead this also counts for code storage gas errors. + ret, err = run(evm, snapshot, contract, input) if err != nil { contract.UseGas(contract.Gas) - evm.StateDB.RevertToSnapshot(snapshot) } return ret, contract.Gas, err diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 32d764b9f4..661ada6910 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -89,13 +89,12 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { if in.evm.chainRules.IsMetropolis { if in.readonly { - // if the interpreter is operating in readonly mode, make sure no - // state-modifying operation is performed. The 4th stack item + // If the interpreter is operating in readonly mode, make sure no + // state-modifying operation is performed. The 3rd stack item // for a call operation is the value. Transfering value from one // account to the others means the state is modified and should also // return with an error. - if operation.writes || - ((op == CALL || op == CALLCODE) && stack.Back(3).BitLen() > 0) { + if operation.writes || (op == CALL && stack.Back(2).BitLen() > 0) { return errWriteProtection } } From 9bd6068fefe5687735bed342f3545f515fa717c8 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Wed, 16 Aug 2017 13:07:33 +0300 Subject: [PATCH 087/272] core/vm: implement RETURNDATA metropolis opcodes --- core/vm/gas_table.go | 26 ++++ core/vm/instructions.go | 23 +++ core/vm/interpreter.go | 14 +- core/vm/jump_table.go | 50 ++++--- core/vm/memory_table.go | 4 + core/vm/opcodes.go | 307 ++++++++++++++++++++-------------------- 6 files changed, 253 insertions(+), 171 deletions(-) diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 8a6c2741de..6cdbc5c39b 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -91,6 +91,32 @@ func gasCalldataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *St return gas, nil } +func gasReturnDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + + var overflow bool + if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { + return 0, errGasUintOverflow + } + + words, overflow := bigUint64(stack.Back(2)) + if overflow { + return 0, errGasUintOverflow + } + + if words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow { + return 0, errGasUintOverflow + } + + if gas, overflow = math.SafeAdd(gas, words); overflow { + return 0, errGasUintOverflow + } + return gas, nil +} + func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var ( y, x = stack.Back(1), stack.Back(0) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index aaa8d7945e..0dd9af0968 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -31,6 +31,7 @@ import ( var ( bigZero = new(big.Int) errWriteProtection = errors.New("evm: write protection") + errReadOutOfBound = errors.New("evm: read out of bound") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -360,6 +361,28 @@ func opCalldataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st return nil, nil } +func opReturnDataSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + stack.push(evm.interpreter.intPool.get().SetUint64(uint64(len(evm.interpreter.returnData)))) + return nil, nil +} + +func opReturnDataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + var ( + mOff = stack.pop() + cOff = stack.pop() + l = stack.pop() + ) + defer evm.interpreter.intPool.put(mOff, cOff, l) + + cEnd := new(big.Int).Add(cOff, l) + if cEnd.BitLen() > 64 || uint64(len(evm.interpreter.returnData)) < cEnd.Uint64() { + return nil, errReadOutOfBound + } + memory.Set(mOff.Uint64(), l.Uint64(), evm.interpreter.returnData[cOff.Uint64():cEnd.Uint64()]) + + return nil, nil +} + func opExtCodeSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { a := stack.pop() diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 661ada6910..1c7481bc5d 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -60,6 +60,8 @@ type Interpreter struct { intPool *intPool readonly bool + // returnData contains the last call's return data + returnData []byte } // NewInterpreter returns a new instance of the Interpreter. @@ -113,6 +115,10 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret in.evm.depth++ defer func() { in.evm.depth-- }() + // Reset the previous call's return data. It's unimportant to preserve the old buffer + // as every returning call will return new data anyway. + in.returnData = nil + // Don't bother with the execution if there's no code. if len(contract.Code) == 0 { return nil, nil @@ -213,10 +219,10 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret case !operation.jumps: pc++ } - // if the operation returned a value make sure that is also set - // the last return data. - if res != nil { - mem.lastReturn = ret + // if the operation clears the return data (e.g. it has returning data) + // set the last return to the result of the operation. + if operation.clearsReturndata { + in.returnData = res } } return nil, nil diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index f6e8dae665..7fb11021f0 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -53,6 +53,8 @@ type operation struct { valid bool // reverts determined whether the operation reverts state reverts bool + // clearsReturndata determines whether the opertions clears the return data + clearsReturndata bool } var ( @@ -73,6 +75,19 @@ func NewMetropolisInstructionSet() [256]operation { memorySize: memoryStaticCall, valid: true, } + instructionSet[RETURNDATASIZE] = operation{ + execute: opReturnDataSize, + gasCost: constGasFunc(GasQuickStep), + validateStack: makeStackFunc(0, 1), + valid: true, + } + instructionSet[RETURNDATACOPY] = operation{ + execute: opReturnDataCopy, + gasCost: gasReturnDataCopy, + validateStack: makeStackFunc(3, 0), + memorySize: memoryReturnDataCopy, + valid: true, + } return instructionSet } @@ -861,26 +876,29 @@ func NewFrontierInstructionSet() [256]operation { writes: true, }, CREATE: { - execute: opCreate, - gasCost: gasCreate, - validateStack: makeStackFunc(3, 1), - memorySize: memoryCreate, - valid: true, - writes: true, + execute: opCreate, + gasCost: gasCreate, + validateStack: makeStackFunc(3, 1), + memorySize: memoryCreate, + valid: true, + writes: true, + clearsReturndata: true, }, CALL: { - execute: opCall, - gasCost: gasCall, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, + execute: opCall, + gasCost: gasCall, + validateStack: makeStackFunc(7, 1), + memorySize: memoryCall, + valid: true, + clearsReturndata: true, }, CALLCODE: { - execute: opCallCode, - gasCost: gasCallCode, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, + execute: opCallCode, + gasCost: gasCallCode, + validateStack: makeStackFunc(7, 1), + memorySize: memoryCall, + valid: true, + clearsReturndata: true, }, RETURN: { execute: opReturn, diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index 9d293a2f2c..9f6533bbce 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -30,6 +30,10 @@ func memoryCalldataCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } +func memoryReturnDataCopy(stack *Stack) *big.Int { + return calcMemSize(stack.Back(0), stack.Back(2)) +} + func memoryCodeCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index 51925e8ddd..be87cae18b 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -82,10 +82,11 @@ const ( GASPRICE EXTCODESIZE EXTCODECOPY + RETURNDATASIZE + RETURNDATACOPY ) const ( - // 0x40 range - block operations BLOCKHASH OpCode = 0x40 + iota COINBASE @@ -239,27 +240,29 @@ var opCodeToString = map[OpCode]string{ SHA3: "SHA3", // 0x30 range - closure state - ADDRESS: "ADDRESS", - BALANCE: "BALANCE", - ORIGIN: "ORIGIN", - CALLER: "CALLER", - CALLVALUE: "CALLVALUE", - CALLDATALOAD: "CALLDATALOAD", - CALLDATASIZE: "CALLDATASIZE", - CALLDATACOPY: "CALLDATACOPY", - CODESIZE: "CODESIZE", - CODECOPY: "CODECOPY", - GASPRICE: "GASPRICE", + ADDRESS: "ADDRESS", + BALANCE: "BALANCE", + ORIGIN: "ORIGIN", + CALLER: "CALLER", + CALLVALUE: "CALLVALUE", + CALLDATALOAD: "CALLDATALOAD", + CALLDATASIZE: "CALLDATASIZE", + CALLDATACOPY: "CALLDATACOPY", + CODESIZE: "CODESIZE", + CODECOPY: "CODECOPY", + GASPRICE: "GASPRICE", + EXTCODESIZE: "EXTCODESIZE", + EXTCODECOPY: "EXTCODECOPY", + RETURNDATASIZE: "RETURNDATASIZE", + RETURNDATACOPY: "RETURNDATACOPY", // 0x40 range - block operations - BLOCKHASH: "BLOCKHASH", - COINBASE: "COINBASE", - TIMESTAMP: "TIMESTAMP", - NUMBER: "NUMBER", - DIFFICULTY: "DIFFICULTY", - GASLIMIT: "GASLIMIT", - EXTCODESIZE: "EXTCODESIZE", - EXTCODECOPY: "EXTCODECOPY", + BLOCKHASH: "BLOCKHASH", + COINBASE: "COINBASE", + TIMESTAMP: "TIMESTAMP", + NUMBER: "NUMBER", + DIFFICULTY: "DIFFICULTY", + GASLIMIT: "GASLIMIT", // 0x50 range - 'storage' and execution POP: "POP", @@ -374,137 +377,139 @@ func (o OpCode) String() string { } var stringToOp = map[string]OpCode{ - "STOP": STOP, - "ADD": ADD, - "MUL": MUL, - "SUB": SUB, - "DIV": DIV, - "SDIV": SDIV, - "MOD": MOD, - "SMOD": SMOD, - "EXP": EXP, - "NOT": NOT, - "LT": LT, - "GT": GT, - "SLT": SLT, - "SGT": SGT, - "EQ": EQ, - "ISZERO": ISZERO, - "SIGNEXTEND": SIGNEXTEND, - "AND": AND, - "OR": OR, - "XOR": XOR, - "BYTE": BYTE, - "ADDMOD": ADDMOD, - "MULMOD": MULMOD, - "SHA3": SHA3, - "ADDRESS": ADDRESS, - "BALANCE": BALANCE, - "ORIGIN": ORIGIN, - "CALLER": CALLER, - "CALLVALUE": CALLVALUE, - "CALLDATALOAD": CALLDATALOAD, - "CALLDATASIZE": CALLDATASIZE, - "CALLDATACOPY": CALLDATACOPY, - "DELEGATECALL": DELEGATECALL, - "STATICCALL": STATICCALL, - "CODESIZE": CODESIZE, - "CODECOPY": CODECOPY, - "GASPRICE": GASPRICE, - "BLOCKHASH": BLOCKHASH, - "COINBASE": COINBASE, - "TIMESTAMP": TIMESTAMP, - "NUMBER": NUMBER, - "DIFFICULTY": DIFFICULTY, - "GASLIMIT": GASLIMIT, - "EXTCODESIZE": EXTCODESIZE, - "EXTCODECOPY": EXTCODECOPY, - "POP": POP, - "MLOAD": MLOAD, - "MSTORE": MSTORE, - "MSTORE8": MSTORE8, - "SLOAD": SLOAD, - "SSTORE": SSTORE, - "JUMP": JUMP, - "JUMPI": JUMPI, - "PC": PC, - "MSIZE": MSIZE, - "GAS": GAS, - "JUMPDEST": JUMPDEST, - "PUSH1": PUSH1, - "PUSH2": PUSH2, - "PUSH3": PUSH3, - "PUSH4": PUSH4, - "PUSH5": PUSH5, - "PUSH6": PUSH6, - "PUSH7": PUSH7, - "PUSH8": PUSH8, - "PUSH9": PUSH9, - "PUSH10": PUSH10, - "PUSH11": PUSH11, - "PUSH12": PUSH12, - "PUSH13": PUSH13, - "PUSH14": PUSH14, - "PUSH15": PUSH15, - "PUSH16": PUSH16, - "PUSH17": PUSH17, - "PUSH18": PUSH18, - "PUSH19": PUSH19, - "PUSH20": PUSH20, - "PUSH21": PUSH21, - "PUSH22": PUSH22, - "PUSH23": PUSH23, - "PUSH24": PUSH24, - "PUSH25": PUSH25, - "PUSH26": PUSH26, - "PUSH27": PUSH27, - "PUSH28": PUSH28, - "PUSH29": PUSH29, - "PUSH30": PUSH30, - "PUSH31": PUSH31, - "PUSH32": PUSH32, - "DUP1": DUP1, - "DUP2": DUP2, - "DUP3": DUP3, - "DUP4": DUP4, - "DUP5": DUP5, - "DUP6": DUP6, - "DUP7": DUP7, - "DUP8": DUP8, - "DUP9": DUP9, - "DUP10": DUP10, - "DUP11": DUP11, - "DUP12": DUP12, - "DUP13": DUP13, - "DUP14": DUP14, - "DUP15": DUP15, - "DUP16": DUP16, - "SWAP1": SWAP1, - "SWAP2": SWAP2, - "SWAP3": SWAP3, - "SWAP4": SWAP4, - "SWAP5": SWAP5, - "SWAP6": SWAP6, - "SWAP7": SWAP7, - "SWAP8": SWAP8, - "SWAP9": SWAP9, - "SWAP10": SWAP10, - "SWAP11": SWAP11, - "SWAP12": SWAP12, - "SWAP13": SWAP13, - "SWAP14": SWAP14, - "SWAP15": SWAP15, - "SWAP16": SWAP16, - "LOG0": LOG0, - "LOG1": LOG1, - "LOG2": LOG2, - "LOG3": LOG3, - "LOG4": LOG4, - "CREATE": CREATE, - "CALL": CALL, - "RETURN": RETURN, - "CALLCODE": CALLCODE, - "SELFDESTRUCT": SELFDESTRUCT, + "STOP": STOP, + "ADD": ADD, + "MUL": MUL, + "SUB": SUB, + "DIV": DIV, + "SDIV": SDIV, + "MOD": MOD, + "SMOD": SMOD, + "EXP": EXP, + "NOT": NOT, + "LT": LT, + "GT": GT, + "SLT": SLT, + "SGT": SGT, + "EQ": EQ, + "ISZERO": ISZERO, + "SIGNEXTEND": SIGNEXTEND, + "AND": AND, + "OR": OR, + "XOR": XOR, + "BYTE": BYTE, + "ADDMOD": ADDMOD, + "MULMOD": MULMOD, + "SHA3": SHA3, + "ADDRESS": ADDRESS, + "BALANCE": BALANCE, + "ORIGIN": ORIGIN, + "CALLER": CALLER, + "CALLVALUE": CALLVALUE, + "CALLDATALOAD": CALLDATALOAD, + "CALLDATASIZE": CALLDATASIZE, + "CALLDATACOPY": CALLDATACOPY, + "DELEGATECALL": DELEGATECALL, + "STATICCALL": STATICCALL, + "CODESIZE": CODESIZE, + "CODECOPY": CODECOPY, + "GASPRICE": GASPRICE, + "EXTCODESIZE": EXTCODESIZE, + "EXTCODECOPY": EXTCODECOPY, + "RETURNDATASIZE": RETURNDATASIZE, + "RETURNDATACOPY": RETURNDATACOPY, + "BLOCKHASH": BLOCKHASH, + "COINBASE": COINBASE, + "TIMESTAMP": TIMESTAMP, + "NUMBER": NUMBER, + "DIFFICULTY": DIFFICULTY, + "GASLIMIT": GASLIMIT, + "POP": POP, + "MLOAD": MLOAD, + "MSTORE": MSTORE, + "MSTORE8": MSTORE8, + "SLOAD": SLOAD, + "SSTORE": SSTORE, + "JUMP": JUMP, + "JUMPI": JUMPI, + "PC": PC, + "MSIZE": MSIZE, + "GAS": GAS, + "JUMPDEST": JUMPDEST, + "PUSH1": PUSH1, + "PUSH2": PUSH2, + "PUSH3": PUSH3, + "PUSH4": PUSH4, + "PUSH5": PUSH5, + "PUSH6": PUSH6, + "PUSH7": PUSH7, + "PUSH8": PUSH8, + "PUSH9": PUSH9, + "PUSH10": PUSH10, + "PUSH11": PUSH11, + "PUSH12": PUSH12, + "PUSH13": PUSH13, + "PUSH14": PUSH14, + "PUSH15": PUSH15, + "PUSH16": PUSH16, + "PUSH17": PUSH17, + "PUSH18": PUSH18, + "PUSH19": PUSH19, + "PUSH20": PUSH20, + "PUSH21": PUSH21, + "PUSH22": PUSH22, + "PUSH23": PUSH23, + "PUSH24": PUSH24, + "PUSH25": PUSH25, + "PUSH26": PUSH26, + "PUSH27": PUSH27, + "PUSH28": PUSH28, + "PUSH29": PUSH29, + "PUSH30": PUSH30, + "PUSH31": PUSH31, + "PUSH32": PUSH32, + "DUP1": DUP1, + "DUP2": DUP2, + "DUP3": DUP3, + "DUP4": DUP4, + "DUP5": DUP5, + "DUP6": DUP6, + "DUP7": DUP7, + "DUP8": DUP8, + "DUP9": DUP9, + "DUP10": DUP10, + "DUP11": DUP11, + "DUP12": DUP12, + "DUP13": DUP13, + "DUP14": DUP14, + "DUP15": DUP15, + "DUP16": DUP16, + "SWAP1": SWAP1, + "SWAP2": SWAP2, + "SWAP3": SWAP3, + "SWAP4": SWAP4, + "SWAP5": SWAP5, + "SWAP6": SWAP6, + "SWAP7": SWAP7, + "SWAP8": SWAP8, + "SWAP9": SWAP9, + "SWAP10": SWAP10, + "SWAP11": SWAP11, + "SWAP12": SWAP12, + "SWAP13": SWAP13, + "SWAP14": SWAP14, + "SWAP15": SWAP15, + "SWAP16": SWAP16, + "LOG0": LOG0, + "LOG1": LOG1, + "LOG2": LOG2, + "LOG3": LOG3, + "LOG4": LOG4, + "CREATE": CREATE, + "CALL": CALL, + "RETURN": RETURN, + "CALLCODE": CALLCODE, + "SELFDESTRUCT": SELFDESTRUCT, } func StringToOp(str string) OpCode { From 4e0fea4d30e922c1cc0e8e2f33e5ad8ae55053d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 16 Aug 2017 13:36:48 +0300 Subject: [PATCH 088/272] core/vm: polish RETURNDATA, add missing returns to CALL* --- core/vm/evm.go | 6 ++-- core/vm/gas_table.go | 2 +- core/vm/instructions.go | 73 +++++++++++++++++++++-------------------- core/vm/interpreter.go | 9 +++-- core/vm/jump_table.go | 54 +++++++++++++++--------------- core/vm/memory.go | 1 - core/vm/memory_table.go | 2 +- 7 files changed, 75 insertions(+), 72 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index cc4214a163..448acd469d 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -261,9 +261,9 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // Make sure the readonly is only set if we aren't in readonly yet // this makes also sure that the readonly flag isn't removed for // child calls. - if !evm.interpreter.readonly { - evm.interpreter.readonly = true - defer func() { evm.interpreter.readonly = false }() + if !evm.interpreter.readOnly { + evm.interpreter.readOnly = true + defer func() { evm.interpreter.readOnly = false }() } var ( diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 6cdbc5c39b..a6346bd806 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -65,7 +65,7 @@ func constGasFunc(gas uint64) gasFunc { } } -func gasCalldataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasCallDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 0dd9af0968..4d6197912f 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -29,9 +29,9 @@ import ( ) var ( - bigZero = new(big.Int) - errWriteProtection = errors.New("evm: write protection") - errReadOutOfBound = errors.New("evm: read out of bound") + bigZero = new(big.Int) + errWriteProtection = errors.New("evm: write protection") + errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -243,6 +243,7 @@ func opAnd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stac evm.interpreter.intPool.put(y) return nil, nil } + func opOr(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.pop() stack.push(x.Or(x, y)) @@ -250,6 +251,7 @@ func opOr(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack evm.interpreter.intPool.put(y) return nil, nil } + func opXor(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.pop() stack.push(x.Xor(x, y)) @@ -269,6 +271,7 @@ func opByte(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta evm.interpreter.intPool.put(th) return nil, nil } + func opAddmod(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y, z := stack.pop(), stack.pop(), stack.pop() if z.Cmp(bigZero) > 0 { @@ -282,6 +285,7 @@ func opAddmod(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S evm.interpreter.intPool.put(y, z) return nil, nil } + func opMulmod(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y, z := stack.pop(), stack.pop(), stack.pop() if z.Cmp(bigZero) > 0 { @@ -339,25 +343,25 @@ func opCallValue(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack return nil, nil } -func opCalldataLoad(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { +func opCallDataLoad(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(new(big.Int).SetBytes(getDataBig(contract.Input, stack.pop(), big32))) return nil, nil } -func opCalldataSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { +func opCallDataSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(evm.interpreter.intPool.get().SetInt64(int64(len(contract.Input)))) return nil, nil } -func opCalldataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { +func opCallDataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( - mOff = stack.pop() - cOff = stack.pop() - l = stack.pop() + memOffset = stack.pop() + dataOffset = stack.pop() + length = stack.pop() ) - memory.Set(mOff.Uint64(), l.Uint64(), getDataBig(contract.Input, cOff, l)) + memory.Set(memOffset.Uint64(), length.Uint64(), getDataBig(contract.Input, dataOffset, length)) - evm.interpreter.intPool.put(mOff, cOff, l) + evm.interpreter.intPool.put(memOffset, dataOffset, length) return nil, nil } @@ -368,17 +372,17 @@ func opReturnDataSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, func opReturnDataCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( - mOff = stack.pop() - cOff = stack.pop() - l = stack.pop() + memOffset = stack.pop() + dataOffset = stack.pop() + length = stack.pop() ) - defer evm.interpreter.intPool.put(mOff, cOff, l) + defer evm.interpreter.intPool.put(memOffset, dataOffset, length) - cEnd := new(big.Int).Add(cOff, l) - if cEnd.BitLen() > 64 || uint64(len(evm.interpreter.returnData)) < cEnd.Uint64() { - return nil, errReadOutOfBound + end := new(big.Int).Add(dataOffset, length) + if end.BitLen() > 64 || uint64(len(evm.interpreter.returnData)) < end.Uint64() { + return nil, errReturnDataOutOfBounds } - memory.Set(mOff.Uint64(), l.Uint64(), evm.interpreter.returnData[cOff.Uint64():cEnd.Uint64()]) + memory.Set(memOffset.Uint64(), length.Uint64(), evm.interpreter.returnData[dataOffset.Uint64():end.Uint64()]) return nil, nil } @@ -401,31 +405,28 @@ func opCodeSize(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack func opCodeCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( - mOff = stack.pop() - cOff = stack.pop() - l = stack.pop() + memOffset = stack.pop() + codeOffset = stack.pop() + length = stack.pop() ) - codeCopy := getDataBig(contract.Code, cOff, l) + codeCopy := getDataBig(contract.Code, codeOffset, length) + memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) - memory.Set(mOff.Uint64(), l.Uint64(), codeCopy) - - evm.interpreter.intPool.put(mOff, cOff, l) + evm.interpreter.intPool.put(memOffset, codeOffset, length) return nil, nil } func opExtCodeCopy(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( - addr = common.BigToAddress(stack.pop()) - mOff = stack.pop() - cOff = stack.pop() - l = stack.pop() + addr = common.BigToAddress(stack.pop()) + memOffset = stack.pop() + codeOffset = stack.pop() + length = stack.pop() ) - codeCopy := getDataBig(evm.StateDB.GetCode(addr), cOff, l) - - memory.Set(mOff.Uint64(), l.Uint64(), codeCopy) - - evm.interpreter.intPool.put(mOff, cOff, l) + codeCopy := getDataBig(evm.StateDB.GetCode(addr), codeOffset, length) + memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) + evm.interpreter.intPool.put(memOffset, codeOffset, length) return nil, nil } @@ -530,6 +531,7 @@ func opJump(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta evm.interpreter.intPool.put(pos) return nil, nil } + func opJumpi(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { pos, cond := stack.pop(), stack.pop() if cond.Sign() != 0 { @@ -545,6 +547,7 @@ func opJumpi(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *St evm.interpreter.intPool.put(pos, cond) return nil, nil } + func opJumpdest(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { return nil, nil } diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 1c7481bc5d..954839f2e3 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -59,9 +59,8 @@ type Interpreter struct { gasTable params.GasTable intPool *intPool - readonly bool - // returnData contains the last call's return data - returnData []byte + readOnly bool // Whether to throw on stateful modifications + returnData []byte // Last CALL's return data for subsequent reuse } // NewInterpreter returns a new instance of the Interpreter. @@ -90,7 +89,7 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { if in.evm.chainRules.IsMetropolis { - if in.readonly { + if in.readOnly { // If the interpreter is operating in readonly mode, make sure no // state-modifying operation is performed. The 3rd stack item // for a call operation is the value. Transfering value from one @@ -221,7 +220,7 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret } // if the operation clears the return data (e.g. it has returning data) // set the last return to the result of the operation. - if operation.clearsReturndata { + if operation.returns { in.returnData = res } } diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 7fb11021f0..2d238f7a16 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -53,8 +53,8 @@ type operation struct { valid bool // reverts determined whether the operation reverts state reverts bool - // clearsReturndata determines whether the opertions clears the return data - clearsReturndata bool + // returns determines whether the opertions sets the return data + returns bool } var ( @@ -74,6 +74,7 @@ func NewMetropolisInstructionSet() [256]operation { validateStack: makeStackFunc(6, 1), memorySize: memoryStaticCall, valid: true, + returns: true, } instructionSet[RETURNDATASIZE] = operation{ execute: opReturnDataSize, @@ -101,6 +102,7 @@ func NewHomesteadInstructionSet() [256]operation { validateStack: makeStackFunc(6, 1), memorySize: memoryDelegateCall, valid: true, + returns: true, } return instructionSet } @@ -286,22 +288,22 @@ func NewFrontierInstructionSet() [256]operation { valid: true, }, CALLDATALOAD: { - execute: opCalldataLoad, + execute: opCallDataLoad, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(1, 1), valid: true, }, CALLDATASIZE: { - execute: opCalldataSize, + execute: opCallDataSize, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, CALLDATACOPY: { - execute: opCalldataCopy, - gasCost: gasCalldataCopy, + execute: opCallDataCopy, + gasCost: gasCallDataCopy, validateStack: makeStackFunc(3, 0), - memorySize: memoryCalldataCopy, + memorySize: memoryCallDataCopy, valid: true, }, CODESIZE: { @@ -876,29 +878,29 @@ func NewFrontierInstructionSet() [256]operation { writes: true, }, CREATE: { - execute: opCreate, - gasCost: gasCreate, - validateStack: makeStackFunc(3, 1), - memorySize: memoryCreate, - valid: true, - writes: true, - clearsReturndata: true, + execute: opCreate, + gasCost: gasCreate, + validateStack: makeStackFunc(3, 1), + memorySize: memoryCreate, + valid: true, + writes: true, + returns: true, }, CALL: { - execute: opCall, - gasCost: gasCall, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, - clearsReturndata: true, + execute: opCall, + gasCost: gasCall, + validateStack: makeStackFunc(7, 1), + memorySize: memoryCall, + valid: true, + returns: true, }, CALLCODE: { - execute: opCallCode, - gasCost: gasCallCode, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, - clearsReturndata: true, + execute: opCallCode, + gasCost: gasCallCode, + validateStack: makeStackFunc(7, 1), + memorySize: memoryCall, + valid: true, + returns: true, }, RETURN: { execute: opReturn, diff --git a/core/vm/memory.go b/core/vm/memory.go index 6dbee94eff..99a84d2271 100644 --- a/core/vm/memory.go +++ b/core/vm/memory.go @@ -22,7 +22,6 @@ import "fmt" type Memory struct { store []byte lastGasCost uint64 - lastReturn []byte } func NewMemory() *Memory { diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index 9f6533bbce..f1b671adcf 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -26,7 +26,7 @@ func memorySha3(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(1)) } -func memoryCalldataCopy(stack *Stack) *big.Int { +func memoryCallDataCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } From 64d199edf2c152072df92f31313e2c157d38c520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 16 Aug 2017 13:41:51 +0300 Subject: [PATCH 089/272] tests: pull in latest tests from upstream --- tests/testdata | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testdata b/tests/testdata index 815151e4ce..85f6d7cc01 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 815151e4cea4e73328f8586b4e61c3d7e1e9e543 +Subproject commit 85f6d7cc01b6bd04e071f5ba579fc675cfd2043b From b70a73cd3e49e249a9ab2c41c2dd268786dcd1a3 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Wed, 16 Aug 2017 15:32:59 +0300 Subject: [PATCH 090/272] core/vm: implement REVERT metropolis opcode --- core/vm/instructions.go | 8 +++++++- core/vm/interpreter.go | 4 ++++ core/vm/jump_table.go | 7 +++++++ core/vm/opcodes.go | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 4d6197912f..b3b7310dd4 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -718,7 +718,14 @@ func opReturn(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S ret := memory.GetPtr(offset.Int64(), size.Int64()) evm.interpreter.intPool.put(offset, size) + return ret, nil +} +func opRevert(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + offset, size := stack.pop(), stack.pop() + ret := memory.GetPtr(offset.Int64(), size.Int64()) + + evm.interpreter.intPool.put(offset, size) return ret, nil } @@ -731,7 +738,6 @@ func opSuicide(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack * evm.StateDB.AddBalance(common.BigToAddress(stack.pop()), balance) evm.StateDB.Suicide(contract.Address()) - return nil, nil } diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 954839f2e3..23f930e913 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -209,6 +209,10 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret if verifyPool { verifyIntegerPool(in.intPool) } + // checks whether the operation should revert state. + if operation.reverts { + in.evm.StateDB.RevertToSnapshot(snapshot) + } switch { case err != nil: diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 2d238f7a16..2d7697e9c1 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -89,6 +89,13 @@ func NewMetropolisInstructionSet() [256]operation { memorySize: memoryReturnDataCopy, valid: true, } + instructionSet[REVERT] = operation{ + execute: opRevert, + gasCost: constGasFunc(GasFastestStep), + validateStack: makeStackFunc(2, 0), + valid: true, + reverts: true, + } return instructionSet } diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index be87cae18b..0c65507355 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -204,6 +204,7 @@ const ( DELEGATECALL STATICCALL = 0xfa + REVERT = 0xfd SELFDESTRUCT = 0xff ) @@ -360,6 +361,7 @@ var opCodeToString = map[OpCode]string{ CALLCODE: "CALLCODE", DELEGATECALL: "DELEGATECALL", STATICCALL: "STATICCALL", + REVERT: "REVERT", SELFDESTRUCT: "SELFDESTRUCT", PUSH: "PUSH", @@ -509,6 +511,7 @@ var stringToOp = map[string]OpCode{ "CALL": CALL, "RETURN": RETURN, "CALLCODE": CALLCODE, + "REVERT": REVERT, "SELFDESTRUCT": SELFDESTRUCT, } From 1335a6cc8c65aabe5e4b35b013f91f474a243442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 17 Aug 2017 16:46:46 +0300 Subject: [PATCH 091/272] core/vm, crypto/bn256: fix bn256 use and pairing corner case --- core/vm/contracts.go | 13 ++++---- core/vm/contracts_test.go | 65 +++++++++++++++++++++++++++++++++++++-- crypto/bn256/bn256.go | 18 +++++++---- crypto/bn256/optate.go | 1 - 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/core/vm/contracts.go b/core/vm/contracts.go index b885d42bb7..790d42bbe6 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -307,8 +307,9 @@ func (c *bn256Add) Run(input []byte) ([]byte, error) { if err != nil { return nil, err } - x.Add(x, y) - return x.Marshal(), nil + res := new(bn256.G1) + res.Add(x, y) + return res.Marshal(), nil } // bn256ScalarMul implements a native elliptic curve scalar multiplication. @@ -324,8 +325,9 @@ func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { if err != nil { return nil, err } - p.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) - return p.Marshal(), nil + res := new(bn256.G1) + res.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) + return res.Marshal(), nil } var ( @@ -370,8 +372,7 @@ func (c *bn256Pairing) Run(input []byte) ([]byte, error) { ts = append(ts, t) } // Execute the pairing checks and return the results - ok := bn256.PairingCheck(cs, ts) - if ok { + if bn256.PairingCheck(cs, ts) { return true32Byte, nil } return false32Byte, nil diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 9bc860b5f0..022070ab80 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -93,7 +93,8 @@ var modexpTests = []precompiledTest{ }, { input: "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf010001e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", expected: "5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500", - name: "nagydani-5-pow0x10001"}, + name: "nagydani-5-pow0x10001", + }, } // bn256AddTests are the test and benchmark data for the bn256 addition precompiled @@ -106,7 +107,64 @@ var bn256AddTests = []precompiledTest{ }, { input: "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c91518b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266", expected: "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb204", - name: "chfast2"}, + name: "chfast2", + }, { + input: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name: "cdetrio1", + }, { + input: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name: "cdetrio2", + }, { + input: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name: "cdetrio3", + }, { + input: "", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name: "cdetrio4", + }, { + input: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name: "cdetrio5", + }, { + input: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + expected: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + name: "cdetrio6", + }, { + input: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + name: "cdetrio7", + }, { + input: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + expected: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + name: "cdetrio8", + }, { + input: "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + name: "cdetrio9", + }, { + input: "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + name: "cdetrio10", + }, { + input: "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + expected: "030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4", + name: "cdetrio11", + }, { + input: "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4", + name: "cdetrio12", + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", + expected: "15bf2bb17880144b5d1cd2b1f46eff9d617bffd1ca57c37fb5a49bd84e53cf66049c797f9ce0d17083deb32b5e36f2ea2a212ee036598dd7624c168993d1355f", + name: "cdetrio13", + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name: "cdetrio14", + }, } // bn256ScalarMulTests are the test and benchmark data for the bn256 scalar @@ -123,7 +181,8 @@ var bn256ScalarMulTests = []precompiledTest{ }, { input: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", expected: "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", - name: "chfast3"}, + name: "chfast3", + }, } // bn256PairingTests are the test and benchmark data for the bn256 pairing check diff --git a/crypto/bn256/bn256.go b/crypto/bn256/bn256.go index 92418369b0..7144c31a8a 100644 --- a/crypto/bn256/bn256.go +++ b/crypto/bn256/bn256.go @@ -379,16 +379,22 @@ func Pair(g1 *G1, g2 *G2) *GT { return >{optimalAte(g2.p, g1.p, new(bnPool))} } +// PairingCheck calculates the Optimal Ate pairing for a set of points. func PairingCheck(a []*G1, b []*G2) bool { pool := new(bnPool) - e := newGFp12(pool) - e.SetOne() + + acc := newGFp12(pool) + acc.SetOne() + for i := 0; i < len(a); i++ { - new_e := miller(b[i].p, a[i].p, pool) - e.Mul(e, new_e, pool) + if a[i].p.IsInfinity() || b[i].p.IsInfinity() { + continue + } + acc.Mul(acc, miller(b[i].p, a[i].p, pool), pool) } - ret := finalExponentiation(e, pool) - e.Put(pool) + ret := finalExponentiation(acc, pool) + acc.Put(pool) + return ret.IsOne() } diff --git a/crypto/bn256/optate.go b/crypto/bn256/optate.go index 68716b62b5..9d6957062e 100644 --- a/crypto/bn256/optate.go +++ b/crypto/bn256/optate.go @@ -393,6 +393,5 @@ func optimalAte(a *twistPoint, b *curvePoint, pool *bnPool) *gfP12 { if a.IsInfinity() || b.IsInfinity() { ret.SetOne() } - return ret } From f9fb70d2eeebfc27d3a4f8ae3ea93c67d7fb0e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 16 Aug 2017 17:09:29 +0300 Subject: [PATCH 092/272] core/vm: rework reversion to work on a higher level --- core/vm/evm.go | 32 ++++++++++++++++---------------- core/vm/gas_table.go | 4 ++++ core/vm/instructions.go | 19 +++++++++++++------ core/vm/interpreter.go | 24 +++++++++++------------- core/vm/jump_table.go | 25 ++++++++++--------------- core/vm/memory_table.go | 4 ++++ 6 files changed, 58 insertions(+), 50 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index 448acd469d..8d654c666e 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -168,8 +168,10 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in homestead this also counts for code storage gas errors. if err != nil { - contract.UseGas(contract.Gas) evm.StateDB.RevertToSnapshot(snapshot) + if err != errExecutionReverted { + contract.UseGas(contract.Gas) + } } return ret, contract.Gas, err } @@ -207,10 +209,11 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, ret, err = run(evm, snapshot, contract, input) if err != nil { - contract.UseGas(contract.Gas) evm.StateDB.RevertToSnapshot(snapshot) + if err != errExecutionReverted { + contract.UseGas(contract.Gas) + } } - return ret, contract.Gas, err } @@ -239,10 +242,11 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by ret, err = run(evm, snapshot, contract, input) if err != nil { - contract.UseGas(contract.Gas) evm.StateDB.RevertToSnapshot(snapshot) + if err != errExecutionReverted { + contract.UseGas(contract.Gas) + } } - return ret, contract.Gas, err } @@ -281,8 +285,10 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // when we're in Homestead this also counts for code storage gas errors. ret, err = run(evm, snapshot, contract, input) if err != nil { - contract.UseGas(contract.Gas) evm.StateDB.RevertToSnapshot(snapshot) + if err != errExecutionReverted { + contract.UseGas(contract.Gas) + } } return ret, contract.Gas, err } @@ -339,18 +345,12 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in homestead this also counts for code storage gas errors. - if maxCodeSizeExceeded || - (err != nil && (evm.ChainConfig().IsHomestead(evm.BlockNumber) || err != ErrCodeStoreOutOfGas)) { - contract.UseGas(contract.Gas) + if maxCodeSizeExceeded || (err != nil && (evm.ChainConfig().IsHomestead(evm.BlockNumber) || err != ErrCodeStoreOutOfGas)) { evm.StateDB.RevertToSnapshot(snapshot) + if err != errExecutionReverted { + contract.UseGas(contract.Gas) + } } - // If the vm returned with an error the return value should be set to nil. - // This isn't consensus critical but merely to for behaviour reasons such as - // tests, RPC calls, etc. - if err != nil { - ret = nil - } - return ret, contractAddr, contract.Gas, err } diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index a6346bd806..3b0698ce9e 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -396,6 +396,10 @@ func gasReturn(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, m return memoryGasCost(mem, memorySize) } +func gasRevert(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + return memoryGasCost(mem, memorySize) +} + func gasSuicide(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var gas uint64 // EIP150 homestead gas reprice fork: diff --git a/core/vm/instructions.go b/core/vm/instructions.go index b3b7310dd4..ece4d2229a 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -32,6 +32,7 @@ var ( bigZero = new(big.Int) errWriteProtection = errors.New("evm: write protection") errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") + errExecutionReverted = errors.New("evm: execution reverted") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -579,7 +580,7 @@ func opCreate(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S } contract.UseGas(gas) - _, addr, returnGas, suberr := evm.Create(contract, input, gas, value) + res, addr, returnGas, suberr := evm.Create(contract, input, gas, value) // Push item on the stack based on the returned error. If the ruleset is // homestead we must check for CodeStoreOutOfGasError (homestead only // rule) and treat as an error, if the ruleset is frontier we must @@ -592,9 +593,11 @@ func opCreate(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *S stack.push(addr.Big()) } contract.Gas += returnGas - evm.interpreter.intPool.put(value, offset, size) + if suberr == errExecutionReverted { + return res, nil + } return nil, nil } @@ -622,7 +625,8 @@ func opCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta stack.push(new(big.Int)) } else { stack.push(big.NewInt(1)) - + } + if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas @@ -653,10 +657,10 @@ func opCallCode(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack ret, returnGas, err := evm.CallCode(contract, address, args, gas, value) if err != nil { stack.push(new(big.Int)) - } else { stack.push(big.NewInt(1)) - + } + if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas @@ -676,6 +680,8 @@ func opDelegateCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, st stack.push(new(big.Int)) } else { stack.push(big.NewInt(1)) + } + if err == nil || err == errExecutionReverted { memory.Set(outOffset.Uint64(), outSize.Uint64(), ret) } contract.Gas += returnGas @@ -704,7 +710,8 @@ func opStaticCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stac stack.push(new(big.Int)) } else { stack.push(big.NewInt(1)) - + } + if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 23f930e913..0466bf085c 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -209,24 +209,22 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret if verifyPool { verifyIntegerPool(in.intPool) } - // checks whether the operation should revert state. - if operation.reverts { - in.evm.StateDB.RevertToSnapshot(snapshot) - } - - switch { - case err != nil: - return nil, err - case operation.halts: - return res, nil - case !operation.jumps: - pc++ - } // if the operation clears the return data (e.g. it has returning data) // set the last return to the result of the operation. if operation.returns { in.returnData = res } + + switch { + case err != nil: + return nil, err + case operation.reverts: + return res, errExecutionReverted + case operation.halts: + return res, nil + case !operation.jumps: + pc++ + } } return nil, nil } diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 2d7697e9c1..f0a922912f 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -41,20 +41,13 @@ type operation struct { validateStack stackValidationFunc // memorySize returns the memory size required for the operation memorySize memorySizeFunc - // halts indicates whether the operation shoult halt further execution - // and return - halts bool - // jumps indicates whether operation made a jump. This prevents the program - // counter from further incrementing. - jumps bool - // writes determines whether this a state modifying operation - writes bool - // valid is used to check whether the retrieved operation is valid and known - valid bool - // reverts determined whether the operation reverts state - reverts bool - // returns determines whether the opertions sets the return data - returns bool + + halts bool // indicates whether the operation shoult halt further execution + jumps bool // indicates whether the program counter should not increment + writes bool // determines whether this a state modifying operation + valid bool // indication whether the retrieved operation is valid and known + reverts bool // determines whether the operation reverts state (implicitly halts) + returns bool // determines whether the opertions sets the return data content } var ( @@ -91,10 +84,12 @@ func NewMetropolisInstructionSet() [256]operation { } instructionSet[REVERT] = operation{ execute: opRevert, - gasCost: constGasFunc(GasFastestStep), + gasCost: gasRevert, validateStack: makeStackFunc(2, 0), + memorySize: memoryRevert, valid: true, reverts: true, + returns: true, } return instructionSet } diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index f1b671adcf..bec0235bcc 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -89,6 +89,10 @@ func memoryReturn(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(1)) } +func memoryRevert(stack *Stack) *big.Int { + return calcMemSize(stack.Back(0), stack.Back(1)) +} + func memoryLog(stack *Stack) *big.Int { mSize, mStart := stack.Back(1), stack.Back(0) return calcMemSize(mStart, mSize) From 1bbd400899304152b15a0fcd3cf1946442171c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 16 Aug 2017 17:12:46 +0300 Subject: [PATCH 093/272] tests: skip the bad tests from colliding account touches --- tests/state_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/state_test.go b/tests/state_test.go index ab6dc423f9..7e5516e7e9 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -40,6 +40,9 @@ func TestState(t *testing.T) { st.fails(`^stRevertTest/RevertDepthCreateAddressCollision\.json/EIP15[08]/[67]`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test") + st.fails(`^stRevertTest/RevertDepthCreateAddressCollision\.json/Byzantium/[67]`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") + st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/Byzantium`, "bug in test") st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { for _, subtest := range test.Subtests() { From d4f11d9b4fa294442b3c97bd9c892d14df085363 Mon Sep 17 00:00:00 2001 From: "mark.lin" Date: Fri, 18 Aug 2017 13:52:16 +0800 Subject: [PATCH 094/272] eth: send but not announce block to peers if propagate is true --- eth/handler.go | 1 + 1 file changed, 1 insertion(+) diff --git a/eth/handler.go b/eth/handler.go index 6c64493401..e6a9c86d79 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -688,6 +688,7 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) { peer.SendNewBlock(block, td) } log.Trace("Propagated block", "hash", hash, "recipients", len(transfer), "duration", common.PrettyDuration(time.Since(block.ReceivedAt))) + return } // Otherwise if the block is indeed in out own chain, announce it if pm.blockchain.HasBlock(hash) { From 059c767adf4956d6d7bae16066a798d02a367f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 18 Aug 2017 11:23:56 +0300 Subject: [PATCH 095/272] cmd/puppeth: support blacklisting malicious IPs on ethstats --- cmd/puppeth/module_ethstats.go | 25 +++++++++++++++++++------ cmd/puppeth/wizard.go | 24 ++++++++++++++++++++++++ cmd/puppeth/wizard_ethstats.go | 18 +++++++++++++++++- 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/cmd/puppeth/module_ethstats.go b/cmd/puppeth/module_ethstats.go index da34acb3bb..5d3fa5fc03 100644 --- a/cmd/puppeth/module_ethstats.go +++ b/cmd/puppeth/module_ethstats.go @@ -42,7 +42,7 @@ RUN \ WORKDIR /eth-netstats EXPOSE 3000 -RUN echo 'module.exports = {trusted: [{{.Trusted}}], banned: []};' > lib/utils/config.js +RUN echo 'module.exports = {trusted: [{{.Trusted}}], banned: [{{.Banned}}]};' > lib/utils/config.js CMD ["npm", "start"] ` @@ -59,7 +59,8 @@ services: - "{{.Port}}:3000"{{end}} environment: - WS_SECRET={{.Secret}}{{if .VHost}} - - VIRTUAL_HOST={{.VHost}}{{end}} + - VIRTUAL_HOST={{.VHost}}{{end}}{{if .Banned}} + - BANNED={{.Banned}}{{end}} logging: driver: "json-file" options: @@ -71,18 +72,24 @@ services: // deployEthstats deploys a new ethstats container to a remote machine via SSH, // docker and docker-compose. If an instance with the specified network name // already exists there, it will be overwritten! -func deployEthstats(client *sshClient, network string, port int, secret string, vhost string, trusted []string) ([]byte, error) { +func deployEthstats(client *sshClient, network string, port int, secret string, vhost string, trusted []string, banned []string) ([]byte, error) { // Generate the content to upload to the server workdir := fmt.Sprintf("%d", rand.Int63()) files := make(map[string][]byte) + trustedLabels := make([]string, len(trusted)) for i, address := range trusted { - trusted[i] = fmt.Sprintf("\"%s\"", address) + trustedLabels[i] = fmt.Sprintf("\"%s\"", address) + } + bannedLabels := make([]string, len(banned)) + for i, address := range banned { + bannedLabels[i] = fmt.Sprintf("\"%s\"", address) } dockerfile := new(bytes.Buffer) template.Must(template.New("").Parse(ethstatsDockerfile)).Execute(dockerfile, map[string]interface{}{ - "Trusted": strings.Join(trusted, ", "), + "Trusted": strings.Join(trustedLabels, ", "), + "Banned": strings.Join(bannedLabels, ", "), }) files[filepath.Join(workdir, "Dockerfile")] = dockerfile.Bytes() @@ -92,6 +99,7 @@ func deployEthstats(client *sshClient, network string, port int, secret string, "Port": port, "Secret": secret, "VHost": vhost, + "Banned": strings.Join(banned, ","), }) files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() @@ -112,11 +120,12 @@ type ethstatsInfos struct { port int secret string config string + banned []string } // String implements the stringer interface. func (info *ethstatsInfos) String() string { - return fmt.Sprintf("host=%s, port=%d, secret=%s", info.host, info.port, info.secret) + return fmt.Sprintf("host=%s, port=%d, secret=%s, banned=%v", info.host, info.port, info.secret, info.banned) } // checkEthstats does a health-check against an ethstats server to verify whether @@ -150,6 +159,9 @@ func checkEthstats(client *sshClient, network string) (*ethstatsInfos, error) { if port != 80 && port != 443 { config += fmt.Sprintf(":%d", port) } + // Retrieve the IP blacklist + banned := strings.Split(infos.envvars["BANNED"], ",") + // Run a sanity check to see if the port is reachable if err = checkPort(host, port); err != nil { log.Warn("Ethstats service seems unreachable", "server", host, "port", port, "err", err) @@ -160,5 +172,6 @@ func checkEthstats(client *sshClient, network string) (*ethstatsInfos, error) { port: port, secret: secret, config: config, + banned: banned, }, nil } diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index f19bcbbcd9..5187412797 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -22,6 +22,7 @@ import ( "fmt" "io/ioutil" "math/big" + "net" "os" "path/filepath" "sort" @@ -277,3 +278,26 @@ func (w *wizard) readJSON() string { return string(blob) } } + +// readIPAddress reads a single line from stdin, trimming if from spaces and +// converts it to a network IP address. +func (w *wizard) readIPAddress() net.IP { + for { + // Read the IP address from the user + fmt.Printf("> ") + text, err := w.in.ReadString('\n') + if err != nil { + log.Crit("Failed to read user input", "err", err) + } + if text = strings.TrimSpace(text); text == "" { + return nil + } + // Make sure it looks ok and return it if so + ip := net.ParseIP(text) + if ip == nil { + log.Error("Invalid IP address, please retry") + continue + } + return ip + } +} diff --git a/cmd/puppeth/wizard_ethstats.go b/cmd/puppeth/wizard_ethstats.go index c117a60276..504d8fd9cb 100644 --- a/cmd/puppeth/wizard_ethstats.go +++ b/cmd/puppeth/wizard_ethstats.go @@ -60,6 +60,22 @@ func (w *wizard) deployEthstats() { fmt.Printf("What should be the secret password for the API? (default = %s)\n", infos.secret) infos.secret = w.readDefaultString(infos.secret) } + // Gather any blacklists to ban from reporting + fmt.Println() + fmt.Printf("Keep existing IP %v blacklist (y/n)? (default = yes)\n", infos.banned) + if w.readDefaultString("y") != "y" { + infos.banned = nil + + fmt.Println() + fmt.Println("Which IP addresses should be blacklisted?") + for { + if ip := w.readIPAddress(); ip != nil { + infos.banned = append(infos.banned, ip.String()) + continue + } + break + } + } // Try to deploy the ethstats server on the host trusted := make([]string, 0, len(w.servers)) for _, client := range w.servers { @@ -67,7 +83,7 @@ func (w *wizard) deployEthstats() { trusted = append(trusted, client.address) } } - if out, err := deployEthstats(client, w.network, infos.port, infos.secret, infos.host, trusted); err != nil { + if out, err := deployEthstats(client, w.network, infos.port, infos.secret, infos.host, trusted, infos.banned); err != nil { log.Error("Failed to deploy ethstats container", "err", err) if len(out) > 0 { fmt.Printf("%s\n", out) From 7e57fee3551ad5b66c985ad208613fd80c2d6b8a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 18 Aug 2017 12:14:00 +0200 Subject: [PATCH 096/272] node: fix instance dir locking and improve error message The lock file was ineffective because opening leveldb storage in read-only mode doesn't really take the lock. Fix it by including a dedicated flock library (which is actually split out of goleveldb). --- node/errors.go | 18 ++ node/node.go | 36 ++-- .../github.com/prometheus/prometheus/LICENSE | 201 ++++++++++++++++++ .../github.com/prometheus/prometheus/NOTICE | 87 ++++++++ .../prometheus/prometheus/util/flock/flock.go | 46 ++++ .../prometheus/util/flock/flock_plan9.go | 32 +++ .../prometheus/util/flock/flock_solaris.go | 59 +++++ .../prometheus/util/flock/flock_unix.go | 54 +++++ .../prometheus/util/flock/flock_windows.go | 36 ++++ vendor/vendor.json | 6 + 10 files changed, 551 insertions(+), 24 deletions(-) create mode 100644 vendor/github.com/prometheus/prometheus/LICENSE create mode 100644 vendor/github.com/prometheus/prometheus/NOTICE create mode 100644 vendor/github.com/prometheus/prometheus/util/flock/flock.go create mode 100644 vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go create mode 100644 vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go create mode 100644 vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go create mode 100644 vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go diff --git a/node/errors.go b/node/errors.go index bd5ddeb5de..2e0dadc4d6 100644 --- a/node/errors.go +++ b/node/errors.go @@ -17,10 +17,28 @@ package node import ( + "errors" "fmt" "reflect" + "syscall" ) +var ( + ErrDatadirUsed = errors.New("datadir already used by another process") + ErrNodeStopped = errors.New("node not started") + ErrNodeRunning = errors.New("node already running") + ErrServiceUnknown = errors.New("unknown service") + + datadirInUseErrnos = map[uint]bool{11: true, 32: true, 35: true} +) + +func convertFileLockError(err error) error { + if errno, ok := err.(syscall.Errno); ok && datadirInUseErrnos[uint(errno)] { + return ErrDatadirUsed + } + return err +} + // DuplicateServiceError is returned during Node startup if a registered service // constructor returns a service of the same type that was already started. type DuplicateServiceError struct { diff --git a/node/node.go b/node/node.go index e3f0232b4b..86cfb29baf 100644 --- a/node/node.go +++ b/node/node.go @@ -25,7 +25,6 @@ import ( "reflect" "strings" "sync" - "syscall" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/ethdb" @@ -34,16 +33,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rpc" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -var ( - ErrDatadirUsed = errors.New("datadir already used") - ErrNodeStopped = errors.New("node not started") - ErrNodeRunning = errors.New("node already running") - ErrServiceUnknown = errors.New("unknown service") - - datadirInUseErrnos = map[uint]bool{11: true, 32: true, 35: true} + "github.com/prometheus/prometheus/util/flock" ) // Node is a container on which services can be registered. @@ -52,8 +42,8 @@ type Node struct { config *Config accman *accounts.Manager - ephemeralKeystore string // if non-empty, the key directory that will be removed by Stop - instanceDirLock storage.Storage // prevents concurrent use of instance directory + ephemeralKeystore string // if non-empty, the key directory that will be removed by Stop + instanceDirLock flock.Releaser // prevents concurrent use of instance directory serverConfig p2p.Config server *p2p.Server // Currently running P2P networking layer @@ -197,10 +187,7 @@ func (n *Node) Start() error { running.Protocols = append(running.Protocols, service.Protocols()...) } if err := running.Start(); err != nil { - if errno, ok := err.(syscall.Errno); ok && datadirInUseErrnos[uint(errno)] { - return ErrDatadirUsed - } - return err + return convertFileLockError(err) } // Start each of the services started := []reflect.Type{} @@ -242,14 +229,13 @@ func (n *Node) openDataDir() error { if err := os.MkdirAll(instdir, 0700); err != nil { return err } - // Try to open the instance directory as LevelDB storage. This creates a lock file - // which prevents concurrent use by another instance as well as accidental use of the - // instance directory as a database. - storage, err := storage.OpenFile(instdir, true) + // Lock the instance directory to prevent concurrent use by another instance as well as + // accidental use of the instance directory as a database. + release, _, err := flock.New(filepath.Join(instdir, "LOCK")) if err != nil { - return err + return convertFileLockError(err) } - n.instanceDirLock = storage + n.instanceDirLock = release return nil } @@ -509,7 +495,9 @@ func (n *Node) Stop() error { // Release instance directory lock. if n.instanceDirLock != nil { - n.instanceDirLock.Close() + if err := n.instanceDirLock.Release(); err != nil { + log.Error("Can't release datadir lock", "err", err) + } n.instanceDirLock = nil } diff --git a/vendor/github.com/prometheus/prometheus/LICENSE b/vendor/github.com/prometheus/prometheus/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/prometheus/NOTICE b/vendor/github.com/prometheus/prometheus/NOTICE new file mode 100644 index 0000000000..47de2415e1 --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/NOTICE @@ -0,0 +1,87 @@ +The Prometheus systems and service monitoring server +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +Bootstrap +http://getbootstrap.com +Copyright 2011-2014 Twitter, Inc. +Licensed under the MIT License + +bootstrap3-typeahead.js +https://github.com/bassjobsen/Bootstrap-3-Typeahead +Original written by @mdo and @fat +Copyright 2014 Bass Jobsen @bassjobsen +Licensed under the Apache License, Version 2.0 + +fuzzy +https://github.com/mattyork/fuzzy +Original written by @mattyork +Copyright 2012 Matt York +Licensed under the MIT License + +bootstrap-datetimepicker.js +https://github.com/Eonasdan/bootstrap-datetimepicker +Copyright 2015 Jonathan Peterson (@Eonasdan) +Licensed under the MIT License + +moment.js +https://github.com/moment/moment/ +Copyright JS Foundation and other contributors +Licensed under the MIT License + +Rickshaw +https://github.com/shutterstock/rickshaw +Copyright 2011-2014 by Shutterstock Images, LLC +See https://github.com/shutterstock/rickshaw/blob/master/LICENSE for license details + +mustache.js +https://github.com/janl/mustache.js +Copyright 2009 Chris Wanstrath (Ruby) +Copyright 2010-2014 Jan Lehnardt (JavaScript) +Copyright 2010-2015 The mustache.js community +Licensed under the MIT License + +jQuery +https://jquery.org +Copyright jQuery Foundation and other contributors +Licensed under the MIT License + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Go support for leveled logs, analogous to +https://code.google.com/p/google-glog/ +Copyright 2013 Google Inc. +Licensed under the Apache License, Version 2.0 + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 + +DNS library in Go +http://miek.nl/posts/2014/Aug/16/go-dns-package/ +Copyright 2009 The Go Authors, 2011 Miek Gieben +See https://github.com/miekg/dns/blob/master/LICENSE for license details. + +LevelDB key/value database in Go +https://github.com/syndtr/goleveldb +Copyright 2012 Suryandaru Triandana +See https://github.com/syndtr/goleveldb/blob/master/LICENSE for license details. + +gosnappy - a fork of code.google.com/p/snappy-go +https://github.com/syndtr/gosnappy +Copyright 2011 The Snappy-Go Authors +See https://github.com/syndtr/gosnappy/blob/master/LICENSE for license details. + +go-zookeeper - Native ZooKeeper client for Go +https://github.com/samuel/go-zookeeper +Copyright (c) 2013, Samuel Stauffer +See https://github.com/samuel/go-zookeeper/blob/master/LICENSE for license details. diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock.go b/vendor/github.com/prometheus/prometheus/util/flock/flock.go new file mode 100644 index 0000000000..5dc22a2fae --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/util/flock/flock.go @@ -0,0 +1,46 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package flock provides portable file locking. It is essentially ripped out +// from the code of github.com/syndtr/goleveldb. Strange enough that the +// standard library does not provide this functionality. Once this package has +// proven to work as expected, we should probably turn it into a separate +// general purpose package for humanity. +package flock + +import ( + "os" + "path/filepath" +) + +// Releaser provides the Release method to release a file lock. +type Releaser interface { + Release() error +} + +// New locks the file with the provided name. If the file does not exist, it is +// created. The returned Releaser is used to release the lock. existed is true +// if the file to lock already existed. A non-nil error is returned if the +// locking has failed. Neither this function nor the returned Releaser is +// goroutine-safe. +func New(fileName string) (r Releaser, existed bool, err error) { + if err = os.MkdirAll(filepath.Dir(fileName), 0755); err != nil { + return + } + + _, err = os.Stat(fileName) + existed = err == nil + + r, err = newLock(fileName) + return +} diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go b/vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go new file mode 100644 index 0000000000..004e85c0fe --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go @@ -0,0 +1,32 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package flock + +import "os" + +type plan9Lock struct { + f *os.File +} + +func (l *plan9Lock) Release() error { + return l.f.Close() +} + +func newLock(fileName string) (Releaser, error) { + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, os.ModeExclusive|0644) + if err != nil { + return nil, err + } + return &plan9Lock{f}, nil +} diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go b/vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go new file mode 100644 index 0000000000..299fc87446 --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go @@ -0,0 +1,59 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build solaris + +package flock + +import ( + "os" + "syscall" +) + +type unixLock struct { + f *os.File +} + +func (l *unixLock) Release() error { + if err := l.set(false); err != nil { + return err + } + return l.f.Close() +} + +func (l *unixLock) set(lock bool) error { + flock := syscall.Flock_t{ + Type: syscall.F_UNLCK, + Start: 0, + Len: 0, + Whence: 1, + } + if lock { + flock.Type = syscall.F_WRLCK + } + return syscall.FcntlFlock(l.f.Fd(), syscall.F_SETLK, &flock) +} + +func newLock(fileName string) (Releaser, error) { + f, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return nil, err + } + l := &unixLock{f} + err = l.set(true) + if err != nil { + f.Close() + return nil, err + } + return l, nil +} diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go b/vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go new file mode 100644 index 0000000000..7d71f8fc09 --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go @@ -0,0 +1,54 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package flock + +import ( + "os" + "syscall" +) + +type unixLock struct { + f *os.File +} + +func (l *unixLock) Release() error { + if err := l.set(false); err != nil { + return err + } + return l.f.Close() +} + +func (l *unixLock) set(lock bool) error { + how := syscall.LOCK_UN + if lock { + how = syscall.LOCK_EX + } + return syscall.Flock(int(l.f.Fd()), how|syscall.LOCK_NB) +} + +func newLock(fileName string) (Releaser, error) { + f, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return nil, err + } + l := &unixLock{f} + err = l.set(true) + if err != nil { + f.Close() + return nil, err + } + return l, nil +} diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go b/vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go new file mode 100644 index 0000000000..bf7266f14c --- /dev/null +++ b/vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go @@ -0,0 +1,36 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package flock + +import "syscall" + +type windowsLock struct { + fd syscall.Handle +} + +func (fl *windowsLock) Release() error { + return syscall.Close(fl.fd) +} + +func newLock(fileName string) (Releaser, error) { + pathp, err := syscall.UTF16PtrFromString(fileName) + if err != nil { + return nil, err + } + fd, err := syscall.CreateFile(pathp, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.CREATE_ALWAYS, syscall.FILE_ATTRIBUTE_NORMAL, 0) + if err != nil { + return nil, err + } + return &windowsLock{fd}, nil +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 8be10b94fb..b0bc88adc6 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -255,6 +255,12 @@ "revision": "bf27d3ba8e1d9899d45a457ffac16c953eb2d647", "revisionTime": "2017-02-11T19:53:22Z" }, + { + "checksumSHA1": "WbbxCn2jUYIL5viqLo0BKXEdPrQ=", + "path": "github.com/prometheus/prometheus/util/flock", + "revision": "3101606756c53221ed58ba94ecba6b26adf89dcc", + "revisionTime": "2017-08-14T17:01:13Z" + }, { "checksumSHA1": "KAzbLjI9MzW2tjfcAsK75lVRp6I=", "path": "github.com/rcrowley/go-metrics", From bf1e2631281e1e439533f2abcf1e99a7b2f9552a Mon Sep 17 00:00:00 2001 From: Miya Chen Date: Fri, 18 Aug 2017 18:58:36 +0800 Subject: [PATCH 097/272] core, light: send chain events using event.Feed (#14865) --- accounts/abi/bind/backends/simulated.go | 3 +- cmd/utils/flags.go | 3 +- core/bench_test.go | 6 +- core/block_validator_test.go | 9 +- core/blockchain.go | 92 +++++++++--- core/blockchain_test.go | 53 +++---- core/chain_makers.go | 3 +- core/chain_makers_test.go | 5 +- core/dao_test.go | 17 +-- core/genesis_test.go | 4 +- core/tx_pool.go | 101 ++++++++----- core/tx_pool_test.go | 181 +++++++++++++++--------- eth/api_backend.go | 28 ++++ eth/backend.go | 4 +- eth/filters/filter.go | 4 + eth/filters/filter_system.go | 98 +++++++++---- eth/filters/filter_system_test.go | 117 +++++++++++---- eth/filters/filter_test.go | 34 +++-- eth/handler.go | 23 ++- eth/handler_test.go | 2 +- eth/helper_test.go | 11 +- eth/protocol.go | 6 + ethstats/ethstats.go | 63 ++++++--- internal/ethapi/backend.go | 4 + les/api_backend.go | 24 ++++ les/backend.go | 4 +- les/handler.go | 1 + les/helper_test.go | 4 +- les/server.go | 9 +- light/lightchain.go | 57 ++++++-- light/lightchain_test.go | 7 +- light/odr_test.go | 6 +- light/trie_test.go | 3 +- light/txpool.go | 93 +++++++----- light/txpool_test.go | 8 +- miner/worker.go | 68 +++++++-- tests/block_test_util.go | 3 +- 37 files changed, 786 insertions(+), 372 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 14bf7bd752..e0ee06a0a1 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -33,7 +33,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -61,7 +60,7 @@ func NewSimulatedBackend(alloc core.GenesisAlloc) *SimulatedBackend { database, _ := ethdb.NewMemDatabase() genesis := core.Genesis{Config: params.AllProtocolChanges, Alloc: alloc} genesis.MustCommit(database) - blockchain, _ := core.NewBlockChain(database, genesis.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + blockchain, _ := core.NewBlockChain(database, genesis.Config, ethash.NewFaker(), vm.Config{}) backend := &SimulatedBackend{database: database, blockchain: blockchain, config: genesis.Config} backend.rollback() return backend diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 04728b5c62..b257084719 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -41,7 +41,6 @@ import ( "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethstats" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/les" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" @@ -1103,7 +1102,7 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai Fatalf("%v", err) } vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} - chain, err = core.NewBlockChain(chainDb, config, engine, new(event.TypeMux), vmcfg) + chain, err = core.NewBlockChain(chainDb, config, engine, vmcfg) if err != nil { Fatalf("Can't create BlockChain: %v", err) } diff --git a/core/bench_test.go b/core/bench_test.go index b9250f7d39..ab25c27d39 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -30,7 +30,6 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -175,8 +174,7 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { // Time the insertion of the new chain. // State and blocks are stored in the same DB. - evmux := new(event.TypeMux) - chainman, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), evmux, vm.Config{}) + chainman, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) defer chainman.Stop() b.ReportAllocs() b.ResetTimer() @@ -286,7 +284,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } - chain, err := NewBlockChain(db, params.TestChainConfig, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + chain, err := NewBlockChain(db, params.TestChainConfig, ethash.NewFaker(), vm.Config{}) if err != nil { b.Fatalf("error creating chain: %v", err) } diff --git a/core/block_validator_test.go b/core/block_validator_test.go index c0afc2955f..6d54c2b932 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -25,7 +25,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -43,7 +42,7 @@ func TestHeaderVerification(t *testing.T) { headers[i] = block.Header() } // Run the header checker for blocks one-by-one, checking for both valid and invalid nonces - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), vm.Config{}) defer chain.Stop() for i := 0; i < len(blocks); i++ { @@ -107,11 +106,11 @@ func testHeaderConcurrentVerification(t *testing.T, threads int) { var results <-chan error if valid { - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), vm.Config{}) _, results = chain.engine.VerifyHeaders(chain, headers, seals) chain.Stop() } else { - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), vm.Config{}) _, results = chain.engine.VerifyHeaders(chain, headers, seals) chain.Stop() } @@ -174,7 +173,7 @@ func testHeaderConcurrentAbortion(t *testing.T, threads int) { defer runtime.GOMAXPROCS(old) // Start the verifications and immediately abort - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), vm.Config{}) defer chain.Stop() abort, results := chain.engine.VerifyHeaders(chain, headers, seals) diff --git a/core/blockchain.go b/core/blockchain.go index 3fb8be15f4..f3ca4e08cf 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -79,10 +79,16 @@ const ( type BlockChain struct { config *params.ChainConfig // chain & network configuration - hc *HeaderChain - chainDb ethdb.Database - eventMux *event.TypeMux - genesisBlock *types.Block + hc *HeaderChain + chainDb ethdb.Database + rmTxFeed event.Feed + rmLogsFeed event.Feed + chainFeed event.Feed + chainSideFeed event.Feed + chainHeadFeed event.Feed + logsFeed event.Feed + scope event.SubscriptionScope + genesisBlock *types.Block mu sync.RWMutex // global mutex for locking chain operations chainmu sync.RWMutex // blockchain insertion lock @@ -115,7 +121,7 @@ type BlockChain struct { // NewBlockChain returns a fully initialised block chain using information // available in the database. It initialises the default Ethereum Validator and // Processor. -func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, engine consensus.Engine, mux *event.TypeMux, vmConfig vm.Config) (*BlockChain, error) { +func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config) (*BlockChain, error) { bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) blockCache, _ := lru.New(blockCacheLimit) @@ -126,7 +132,6 @@ func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, engine co config: config, chainDb: chainDb, stateCache: state.NewDatabase(chainDb), - eventMux: mux, quit: make(chan struct{}), bodyCache: bodyCache, bodyRLPCache: bodyRLPCache, @@ -594,6 +599,8 @@ func (bc *BlockChain) Stop() { if !atomic.CompareAndSwapInt32(&bc.running, 0, 1) { return } + // Unsubscribe all subscriptions registered from blockchain + bc.scope.Close() close(bc.quit) atomic.StoreInt32(&bc.procInterrupt, 1) @@ -1000,6 +1007,12 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) + // We need some control over the mining operation. Acquiring locks and waiting + // for the miner to create new block takes too long and in most cases isn't + // even necessary. + if bc.LastBlockHash() == block.Hash() { + events = append(events, ChainHeadEvent{block}) + } // Write the positional metadata for transaction and receipt lookups if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { @@ -1024,7 +1037,7 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { stats.usedGas += usedGas.Uint64() stats.report(chain, i) } - go bc.postChainEvents(events, coalescedLogs) + go bc.PostChainEvents(events, coalescedLogs) return 0, nil } @@ -1184,16 +1197,16 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { // Must be posted in a goroutine because of the transaction pool trying // to acquire the chain manager lock if len(diff) > 0 { - go bc.eventMux.Post(RemovedTransactionEvent{diff}) + go bc.rmTxFeed.Send(RemovedTransactionEvent{diff}) } if len(deletedLogs) > 0 { - go bc.eventMux.Post(RemovedLogsEvent{deletedLogs}) + go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs}) } if len(oldChain) > 0 { go func() { for _, block := range oldChain { - bc.eventMux.Post(ChainSideEvent{Block: block}) + bc.chainSideFeed.Send(ChainSideEvent{Block: block}) } }() } @@ -1201,22 +1214,25 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { return nil } -// postChainEvents iterates over the events generated by a chain insertion and -// posts them into the event mux. -func (bc *BlockChain) postChainEvents(events []interface{}, logs []*types.Log) { +// PostChainEvents iterates over the events generated by a chain insertion and +// posts them into the event feed. +// TODO: Should not expose PostChainEvents. The chain events should be posted in WriteBlock. +func (bc *BlockChain) PostChainEvents(events []interface{}, logs []*types.Log) { // post event logs for further processing - bc.eventMux.Post(logs) + if logs != nil { + bc.logsFeed.Send(logs) + } for _, event := range events { - if event, ok := event.(ChainEvent); ok { - // We need some control over the mining operation. Acquiring locks and waiting - // for the miner to create new block takes too long and in most cases isn't - // even necessary. - if bc.LastBlockHash() == event.Hash { - bc.eventMux.Post(ChainHeadEvent{event.Block}) - } + switch ev := event.(type) { + case ChainEvent: + bc.chainFeed.Send(ev) + + case ChainHeadEvent: + bc.chainHeadFeed.Send(ev) + + case ChainSideEvent: + bc.chainSideFeed.Send(ev) } - // Fire the insertion events individually too - bc.eventMux.Post(event) } } @@ -1384,3 +1400,33 @@ func (bc *BlockChain) Config() *params.ChainConfig { return bc.config } // Engine retrieves the blockchain's consensus engine. func (bc *BlockChain) Engine() consensus.Engine { return bc.engine } + +// SubscribeRemovedTxEvent registers a subscription of RemovedTransactionEvent. +func (bc *BlockChain) SubscribeRemovedTxEvent(ch chan<- RemovedTransactionEvent) event.Subscription { + return bc.scope.Track(bc.rmTxFeed.Subscribe(ch)) +} + +// SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. +func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription { + return bc.scope.Track(bc.rmLogsFeed.Subscribe(ch)) +} + +// SubscribeChainEvent registers a subscription of ChainEvent. +func (bc *BlockChain) SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription { + return bc.scope.Track(bc.chainFeed.Subscribe(ch)) +} + +// SubscribeChainHeadEvent registers a subscription of ChainHeadEvent. +func (bc *BlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { + return bc.scope.Track(bc.chainHeadFeed.Subscribe(ch)) +} + +// SubscribeChainSideEvent registers a subscription of ChainSideEvent. +func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription { + return bc.scope.Track(bc.chainSideFeed.Subscribe(ch)) +} + +// SubscribeLogsEvent registers a subscription of []*types.Log. +func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return bc.scope.Track(bc.logsFeed.Subscribe(ch)) +} diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 4a0f449408..470974a0a7 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -47,7 +46,7 @@ func newTestBlockChain(fake bool) *BlockChain { if !fake { engine = ethash.NewTester() } - blockchain, err := NewBlockChain(db, gspec.Config, engine, new(event.TypeMux), vm.Config{}) + blockchain, err := NewBlockChain(db, gspec.Config, engine, vm.Config{}) if err != nil { panic(err) } @@ -497,7 +496,7 @@ func testReorgBadHashes(t *testing.T, full bool) { } // Create a new BlockChain and check that it rolled back the state. - ncm, err := NewBlockChain(bc.chainDb, bc.config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + ncm, err := NewBlockChain(bc.chainDb, bc.config, ethash.NewFaker(), vm.Config{}) if err != nil { t.Fatalf("failed to create new chain manager: %v", err) } @@ -610,7 +609,7 @@ func TestFastVsFullChains(t *testing.T) { // Import the chain as an archive node for the comparison baseline archiveDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(archiveDb) - archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), vm.Config{}) defer archive.Stop() if n, err := archive.InsertChain(blocks); err != nil { @@ -619,7 +618,7 @@ func TestFastVsFullChains(t *testing.T) { // Fast import the chain as a non-archive node to test fastDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(fastDb) - fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), vm.Config{}) defer fast.Stop() headers := make([]*types.Header, len(blocks)) @@ -697,7 +696,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { archiveDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(archiveDb) - archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), vm.Config{}) if n, err := archive.InsertChain(blocks); err != nil { t.Fatalf("failed to process block %d: %v", n, err) } @@ -710,7 +709,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { // Import the chain as a non-archive node and ensure all pointers are updated fastDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(fastDb) - fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), vm.Config{}) defer fast.Stop() headers := make([]*types.Header, len(blocks)) @@ -731,7 +730,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { lightDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(lightDb) - light, _ := NewBlockChain(lightDb, gspec.Config, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + light, _ := NewBlockChain(lightDb, gspec.Config, ethash.NewFaker(), vm.Config{}) if n, err := light.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) } @@ -800,8 +799,7 @@ func TestChainTxReorgs(t *testing.T) { } }) // Import the chain. This runs all block validation rules. - evmux := &event.TypeMux{} - blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) if i, err := blockchain.InsertChain(chain); err != nil { t.Fatalf("failed to insert original chain[%d]: %v", i, err) } @@ -872,11 +870,11 @@ func TestLogReorgs(t *testing.T) { signer = types.NewEIP155Signer(gspec.Config.ChainId) ) - var evmux event.TypeMux - blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), &evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) defer blockchain.Stop() - subs := evmux.Subscribe(RemovedLogsEvent{}) + rmLogsCh := make(chan RemovedLogsEvent) + blockchain.SubscribeRemovedLogsEvent(rmLogsCh) chain, _ := GenerateChain(params.TestChainConfig, genesis, db, 2, func(i int, gen *BlockGen) { if i == 1 { tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), big.NewInt(1000000), new(big.Int), code), signer, key1) @@ -895,9 +893,14 @@ func TestLogReorgs(t *testing.T) { t.Fatalf("failed to insert forked chain: %v", err) } - ev := <-subs.Chan() - if len(ev.Data.(RemovedLogsEvent).Logs) == 0 { - t.Error("expected logs") + timeout := time.NewTimer(1 * time.Second) + select { + case ev := <-rmLogsCh: + if len(ev.Logs) == 0 { + t.Error("expected logs") + } + case <-timeout.C: + t.Fatal("Timeout. There is no RemovedLogsEvent has been sent.") } } @@ -914,8 +917,7 @@ func TestReorgSideEvent(t *testing.T) { signer = types.NewEIP155Signer(gspec.Config.ChainId) ) - evmux := &event.TypeMux{} - blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) defer blockchain.Stop() chain, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, gen *BlockGen) {}) @@ -933,7 +935,8 @@ func TestReorgSideEvent(t *testing.T) { } gen.AddTx(tx) }) - subs := evmux.Subscribe(ChainSideEvent{}) + chainSideCh := make(chan ChainSideEvent) + blockchain.SubscribeChainSideEvent(chainSideCh) if _, err := blockchain.InsertChain(replacementBlocks); err != nil { t.Fatalf("failed to insert chain: %v", err) } @@ -956,8 +959,8 @@ func TestReorgSideEvent(t *testing.T) { done: for { select { - case ev := <-subs.Chan(): - block := ev.Data.(ChainSideEvent).Block + case ev := <-chainSideCh: + block := ev.Block if _, ok := expectedSideHashes[block.Hash()]; !ok { t.Errorf("%d: didn't expect %x to be in side chain", i, block.Hash()) } @@ -977,7 +980,7 @@ done: // make sure no more events are fired select { - case e := <-subs.Chan(): + case e := <-chainSideCh: t.Errorf("unexpected event fired: %v", e) case <-time.After(250 * time.Millisecond): } @@ -1038,10 +1041,9 @@ func TestEIP155Transition(t *testing.T) { Alloc: GenesisAlloc{address: {Balance: funds}, deleteAddr: {Balance: new(big.Int)}}, } genesis = gspec.MustCommit(db) - mux event.TypeMux ) - blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), &mux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) defer blockchain.Stop() blocks, _ := GenerateChain(gspec.Config, genesis, db, 4, func(i int, block *BlockGen) { @@ -1148,9 +1150,8 @@ func TestEIP161AccountRemoval(t *testing.T) { Alloc: GenesisAlloc{address: {Balance: funds}}, } genesis = gspec.MustCommit(db) - mux event.TypeMux ) - blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), &mux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) defer blockchain.Stop() blocks, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, block *BlockGen) { diff --git a/core/chain_makers.go b/core/chain_makers.go index 976a8114d3..cb5825d187 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -27,7 +27,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -236,7 +235,7 @@ func newCanonical(n int, full bool) (ethdb.Database, *BlockChain, error) { db, _ := ethdb.NewMemDatabase() genesis := gspec.MustCommit(db) - blockchain, _ := NewBlockChain(db, params.AllProtocolChanges, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + blockchain, _ := NewBlockChain(db, params.AllProtocolChanges, ethash.NewFaker(), vm.Config{}) // Create and inject the requested chain if n == 0 { return db, blockchain, nil diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index 28eb76c634..2260c62fbd 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -25,7 +25,6 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -80,9 +79,7 @@ func ExampleGenerateChain() { }) // Import the chain. This runs all block validation rules. - evmux := &event.TypeMux{} - - blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{}) defer blockchain.Stop() if i, err := blockchain.InsertChain(chain); err != nil { diff --git a/core/dao_test.go b/core/dao_test.go index 99bf1ecaef..d6e11d78ae 100644 --- a/core/dao_test.go +++ b/core/dao_test.go @@ -23,7 +23,6 @@ import ( "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -42,13 +41,13 @@ func TestDAOForkRangeExtradata(t *testing.T) { proDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(proDb) proConf := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(0), DAOForkBlock: forkBlock, DAOForkSupport: true} - proBc, _ := NewBlockChain(proDb, proConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + proBc, _ := NewBlockChain(proDb, proConf, ethash.NewFaker(), vm.Config{}) defer proBc.Stop() conDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(conDb) conConf := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(0), DAOForkBlock: forkBlock, DAOForkSupport: false} - conBc, _ := NewBlockChain(conDb, conConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + conBc, _ := NewBlockChain(conDb, conConf, ethash.NewFaker(), vm.Config{}) defer conBc.Stop() if _, err := proBc.InsertChain(prefix); err != nil { @@ -62,8 +61,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Create a pro-fork block, and try to feed into the no-fork chain db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - - bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) @@ -85,8 +83,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Create a no-fork block, and try to feed into the pro-fork chain db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - - bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) @@ -109,8 +106,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Verify that contra-forkers accept pro-fork extra-datas after forking finishes db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - - bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) @@ -127,8 +123,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Verify that pro-forkers accept contra-fork extra-datas after forking finishes db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - - bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), new(event.TypeMux), vm.Config{}) + bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) diff --git a/core/genesis_test.go b/core/genesis_test.go index 8b193759fc..482f861904 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -26,7 +26,6 @@ import ( "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -119,9 +118,8 @@ func TestSetupGenesis(t *testing.T) { // Commit the 'old' genesis block with Homestead transition at #2. // Advance to block #4, past the homestead transition block of customg. genesis := oldcustomg.MustCommit(db) - bc, _ := NewBlockChain(db, oldcustomg.Config, ethash.NewFullFaker(), new(event.TypeMux), vm.Config{}) + bc, _ := NewBlockChain(db, oldcustomg.Config, ethash.NewFullFaker(), vm.Config{}) defer bc.Stop() - bc.SetValidator(bproc{}) bc.InsertChain(makeBlockChainWithDiff(genesis, []int{2, 3, 4, 5}, 0)) bc.CurrentBlock() diff --git a/core/tx_pool.go b/core/tx_pool.go index b0c251f921..d835c94d1a 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -34,6 +34,13 @@ import ( "gopkg.in/karalabe/cookiejar.v2/collections/prque" ) +const ( + // chainHeadChanSize is the size of channel listening to ChainHeadEvent. + chainHeadChanSize = 10 + // rmTxChanSize is the size of channel listening to RemovedTransactionEvent. + rmTxChanSize = 10 +) + var ( // ErrInvalidSender is returned if the transaction contains an invalid signature. ErrInvalidSender = errors.New("invalid sender") @@ -95,7 +102,14 @@ var ( underpricedTxCounter = metrics.NewCounter("txpool/underpriced") ) -type stateFn func() (*state.StateDB, error) +// blockChain provides the state of blockchain and current gas limit to do +// some pre checks in tx pool and event subscribers. +type blockChain interface { + State() (*state.StateDB, error) + GasLimit() *big.Int + SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription + SubscribeRemovedTxEvent(ch chan<- RemovedTransactionEvent) event.Subscription +} // TxPoolConfig are the configuration parameters of the transaction pool. type TxPoolConfig struct { @@ -160,12 +174,15 @@ func (config *TxPoolConfig) sanitize() TxPoolConfig { type TxPool struct { config TxPoolConfig chainconfig *params.ChainConfig - currentState stateFn // The state function which will allow us to do some pre checks + blockChain blockChain pendingState *state.ManagedState - gasLimit func() *big.Int // The current gas limit function callback gasPrice *big.Int - eventMux *event.TypeMux - events *event.TypeMuxSubscription + txFeed event.Feed + scope event.SubscriptionScope + chainHeadCh chan ChainHeadEvent + chainHeadSub event.Subscription + rmTxCh chan RemovedTransactionEvent + rmTxSub event.Subscription signer types.Signer mu sync.RWMutex @@ -185,7 +202,7 @@ type TxPool struct { // NewTxPool creates a new transaction pool to gather, sort and filter inbound // trnsactions from the network. -func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func() *big.Int) *TxPool { +func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, blockChain blockChain) *TxPool { // Sanitize the input to ensure no vulnerable gas prices are set config = (&config).sanitize() @@ -193,17 +210,16 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, eventMux *e pool := &TxPool{ config: config, chainconfig: chainconfig, + blockChain: blockChain, signer: types.NewEIP155Signer(chainconfig.ChainId), pending: make(map[common.Address]*txList), queue: make(map[common.Address]*txList), beats: make(map[common.Address]time.Time), all: make(map[common.Hash]*types.Transaction), - eventMux: eventMux, - currentState: currentStateFn, - gasLimit: gasLimitFn, + chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), + rmTxCh: make(chan RemovedTransactionEvent, rmTxChanSize), gasPrice: new(big.Int).SetUint64(config.PriceLimit), pendingState: nil, - events: eventMux.Subscribe(ChainHeadEvent{}, RemovedTransactionEvent{}), } pool.locals = newAccountSet(pool.signer) pool.priced = newTxPricedList(&pool.all) @@ -220,6 +236,9 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, eventMux *e log.Warn("Failed to rotate transaction journal", "err", err) } } + // Subscribe events from blockchain + pool.chainHeadSub = pool.blockChain.SubscribeChainHeadEvent(pool.chainHeadCh) + pool.rmTxSub = pool.blockChain.SubscribeRemovedTxEvent(pool.rmTxCh) // Start the event loop and return pool.wg.Add(1) go pool.loop() @@ -248,25 +267,27 @@ func (pool *TxPool) loop() { // Keep waiting for and reacting to the various events for { select { - // Handle any events fired by the system - case ev, ok := <-pool.events.Chan(): - if !ok { - return - } - switch ev := ev.Data.(type) { - case ChainHeadEvent: - pool.mu.Lock() - if ev.Block != nil { - if pool.chainconfig.IsHomestead(ev.Block.Number()) { - pool.homestead = true - } + // Handle ChainHeadEvent + case ev := <-pool.chainHeadCh: + pool.mu.Lock() + if ev.Block != nil { + if pool.chainconfig.IsHomestead(ev.Block.Number()) { + pool.homestead = true } - pool.reset() - pool.mu.Unlock() - case RemovedTransactionEvent: - pool.addTxs(ev.Txs, false) } + pool.reset() + pool.mu.Unlock() + // Be unsubscribed due to system stopped + case <-pool.chainHeadSub.Err(): + return + + // Handle RemovedTransactionEvent + case ev := <-pool.rmTxCh: + pool.addTxs(ev.Txs, false) + // Be unsubscribed due to system stopped + case <-pool.rmTxSub.Err(): + return // Handle stats reporting ticks case <-report.C: @@ -322,7 +343,7 @@ func (pool *TxPool) lockedReset() { // reset retrieves the current state of the blockchain and ensures the content // of the transaction pool is valid with regard to the chain state. func (pool *TxPool) reset() { - currentState, err := pool.currentState() + currentState, err := pool.blockChain.State() if err != nil { log.Error("Failed reset txpool state", "err", err) return @@ -347,7 +368,11 @@ func (pool *TxPool) reset() { // Stop terminates the transaction pool. func (pool *TxPool) Stop() { - pool.events.Unsubscribe() + // Unsubscribe all subscriptions registered from txpool + pool.scope.Close() + // Unsubscribe subscriptions registered from blockchain + pool.chainHeadSub.Unsubscribe() + pool.rmTxSub.Unsubscribe() pool.wg.Wait() if pool.journal != nil { @@ -356,6 +381,12 @@ func (pool *TxPool) Stop() { log.Info("Transaction pool stopped") } +// SubscribeTxPreEvent registers a subscription of TxPreEvent and +// starts sending event to the given channel. +func (pool *TxPool) SubscribeTxPreEvent(ch chan<- TxPreEvent) event.Subscription { + return pool.scope.Track(pool.txFeed.Subscribe(ch)) +} + // GasPrice returns the current gas price enforced by the transaction pool. func (pool *TxPool) GasPrice() *big.Int { pool.mu.RLock() @@ -468,7 +499,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return ErrNegativeValue } // Ensure the transaction doesn't exceed the current block limit gas. - if pool.gasLimit().Cmp(tx.Gas()) < 0 { + if pool.blockChain.GasLimit().Cmp(tx.Gas()) < 0 { return ErrGasLimit } // Make sure the transaction is signed properly @@ -482,7 +513,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return ErrUnderpriced } // Ensure the transaction adheres to nonce ordering - currentState, err := pool.currentState() + currentState, err := pool.blockChain.State() if err != nil { return err } @@ -647,7 +678,7 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T // Set the potentially new pending nonce and notify any subsystems of the new tx pool.beats[addr] = time.Now() pool.pendingState.SetNonce(addr, tx.Nonce()+1) - go pool.eventMux.Post(TxPreEvent{tx}) + go pool.txFeed.Send(TxPreEvent{tx}) } // AddLocal enqueues a single transaction into the pool if it is valid, marking @@ -690,7 +721,7 @@ func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { } // If we added a new transaction, run promotion checks and return if !replace { - state, err := pool.currentState() + state, err := pool.blockChain.State() if err != nil { return err } @@ -717,7 +748,7 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) error { } // Only reprocess the internal state if something was actually added if len(dirty) > 0 { - state, err := pool.currentState() + state, err := pool.blockChain.State() if err != nil { return err } @@ -804,7 +835,7 @@ func (pool *TxPool) removeTx(hash common.Hash) { // future queue to the set of pending transactions. During this process, all // invalidated transactions (low nonce, low balance) are deleted. func (pool *TxPool) promoteExecutables(state *state.StateDB, accounts []common.Address) { - gaslimit := pool.gasLimit() + gaslimit := pool.blockChain.GasLimit() // Gather all the accounts potentially needing updates if accounts == nil { @@ -973,7 +1004,7 @@ func (pool *TxPool) promoteExecutables(state *state.StateDB, accounts []common.A // executable/pending queue and any subsequent transactions that become unexecutable // are moved back into the future queue. func (pool *TxPool) demoteUnexecutables(state *state.StateDB) { - gaslimit := pool.gasLimit() + gaslimit := pool.blockChain.GasLimit() // Iterate over all accounts and demote any non-executable transactions for addr, list := range pool.pending { diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index fcb330051c..ee1ddd4bbc 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -44,6 +44,29 @@ func init() { testTxPoolConfig.Journal = "" } +type testBlockChain struct { + statedb *state.StateDB + gasLimit *big.Int + chainHeadFeed *event.Feed + rmTxFeed *event.Feed +} + +func (bc *testBlockChain) State() (*state.StateDB, error) { + return bc.statedb, nil +} + +func (bc *testBlockChain) GasLimit() *big.Int { + return new(big.Int).Set(bc.gasLimit) +} + +func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { + return bc.chainHeadFeed.Subscribe(ch) +} + +func (bc *testBlockChain) SubscribeRemovedTxEvent(ch chan<- RemovedTransactionEvent) event.Subscription { + return bc.rmTxFeed.Subscribe(ch) +} + func transaction(nonce uint64, gaslimit *big.Int, key *ecdsa.PrivateKey) *types.Transaction { return pricedTransaction(nonce, gaslimit, big.NewInt(1), key) } @@ -56,9 +79,10 @@ func pricedTransaction(nonce uint64, gaslimit, gasprice *big.Int, key *ecdsa.Pri func setupTxPool() (*TxPool, *ecdsa.PrivateKey) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} key, _ := crypto.GenerateKey() - pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) return pool, key } @@ -96,6 +120,31 @@ func deriveSender(tx *types.Transaction) (common.Address, error) { return types.Sender(types.HomesteadSigner{}, tx) } +type testChain struct { + *testBlockChain + address common.Address + trigger *bool +} + +// testChain.State() is used multiple times to reset the pending state. +// when simulate is true it will create a state that indicates +// that tx0 and tx1 are included in the chain. +func (c *testChain) State() (*state.StateDB, error) { + // delay "state change" by one. The tx pool fetches the + // state multiple times and by delaying it a bit we simulate + // a state change between those fetches. + stdb := c.statedb + if *c.trigger { + db, _ := ethdb.NewMemDatabase() + c.statedb, _ = state.New(common.Hash{}, state.NewDatabase(db)) + // simulate that the new head block included tx0 and tx1 + c.statedb.SetNonce(c.address, 2) + c.statedb.SetBalance(c.address, new(big.Int).SetUint64(params.Ether)) + *c.trigger = false + } + return stdb, nil +} + // This test simulates a scenario where a new block is imported during a // state reset and tests whether the pending state is in sync with the // block head event that initiated the resetState(). @@ -104,38 +153,18 @@ func TestStateChangeDuringPoolReset(t *testing.T) { db, _ = ethdb.NewMemDatabase() key, _ = crypto.GenerateKey() address = crypto.PubkeyToAddress(key.PublicKey) - mux = new(event.TypeMux) statedb, _ = state.New(common.Hash{}, state.NewDatabase(db)) trigger = false ) // setup pool with 2 transaction in it statedb.SetBalance(address, new(big.Int).SetUint64(params.Ether)) + blockchain := &testChain{&testBlockChain{statedb, big.NewInt(1000000000), new(event.Feed), new(event.Feed)}, address, &trigger} tx0 := transaction(0, big.NewInt(100000), key) tx1 := transaction(1, big.NewInt(100000), key) - // stateFunc is used multiple times to reset the pending state. - // when simulate is true it will create a state that indicates - // that tx0 and tx1 are included in the chain. - stateFunc := func() (*state.StateDB, error) { - // delay "state change" by one. The tx pool fetches the - // state multiple times and by delaying it a bit we simulate - // a state change between those fetches. - stdb := statedb - if trigger { - statedb, _ = state.New(common.Hash{}, state.NewDatabase(db)) - // simulate that the new head block included tx0 and tx1 - statedb.SetNonce(address, 2) - statedb.SetBalance(address, new(big.Int).SetUint64(params.Ether)) - trigger = false - } - return stdb, nil - } - - gasLimitFunc := func() *big.Int { return big.NewInt(1000000000) } - - pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, mux, stateFunc, gasLimitFunc) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() nonce := pool.State().GetNonce(address) @@ -176,7 +205,7 @@ func TestInvalidTransactions(t *testing.T) { tx := transaction(0, big.NewInt(100), key) from, _ := deriveSender(tx) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.AddBalance(from, big.NewInt(1)) if err := pool.AddRemote(tx); err != ErrInsufficientFunds { t.Error("expected", ErrInsufficientFunds) @@ -211,7 +240,7 @@ func TestTransactionQueue(t *testing.T) { tx := transaction(0, big.NewInt(100), key) from, _ := deriveSender(tx) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.AddBalance(from, big.NewInt(1000)) pool.lockedReset() pool.enqueueTx(tx.Hash(), tx) @@ -241,7 +270,7 @@ func TestTransactionQueue(t *testing.T) { tx2 := transaction(10, big.NewInt(100), key) tx3 := transaction(11, big.NewInt(100), key) from, _ = deriveSender(tx1) - currentState, _ = pool.currentState() + currentState, _ = pool.blockChain.State() currentState.AddBalance(from, big.NewInt(1000)) pool.lockedReset() @@ -264,7 +293,7 @@ func TestRemoveTx(t *testing.T) { defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.AddBalance(addr, big.NewInt(1)) tx1 := transaction(0, big.NewInt(100), key) @@ -296,7 +325,7 @@ func TestNegativeValue(t *testing.T) { tx, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(-1), big.NewInt(100), big.NewInt(1), nil), types.HomesteadSigner{}, key) from, _ := deriveSender(tx) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.AddBalance(from, big.NewInt(1)) if err := pool.AddRemote(tx); err != ErrNegativeValue { t.Error("expected", ErrNegativeValue, "got", err) @@ -311,8 +340,8 @@ func TestTransactionChainFork(t *testing.T) { resetState := func() { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - pool.currentState = func() (*state.StateDB, error) { return statedb, nil } - currentState, _ := pool.currentState() + pool.blockChain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + currentState, _ := pool.blockChain.State() currentState.AddBalance(addr, big.NewInt(100000000000000)) pool.lockedReset() } @@ -339,8 +368,8 @@ func TestTransactionDoubleNonce(t *testing.T) { resetState := func() { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - pool.currentState = func() (*state.StateDB, error) { return statedb, nil } - currentState, _ := pool.currentState() + pool.blockChain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + currentState, _ := pool.blockChain.State() currentState.AddBalance(addr, big.NewInt(100000000000000)) pool.lockedReset() } @@ -358,7 +387,7 @@ func TestTransactionDoubleNonce(t *testing.T) { if replace, err := pool.add(tx2, false); err != nil || !replace { t.Errorf("second transaction insert failed (%v) or not reported replacement (%v)", err, replace) } - state, _ := pool.currentState() + state, _ := pool.blockChain.State() pool.promoteExecutables(state, []common.Address{addr}) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) @@ -386,7 +415,7 @@ func TestMissingNonce(t *testing.T) { defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.AddBalance(addr, big.NewInt(100000000000000)) tx := transaction(1, big.NewInt(100000), key) if _, err := pool.add(tx, false); err != nil { @@ -409,7 +438,7 @@ func TestNonceRecovery(t *testing.T) { defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.SetNonce(addr, n) currentState.AddBalance(addr, big.NewInt(100000000000000)) pool.lockedReset() @@ -431,11 +460,14 @@ func TestRemovedTxEvent(t *testing.T) { tx := transaction(0, big.NewInt(1000000), key) from, _ := deriveSender(tx) - currentState, _ := pool.currentState() + currentState, _ := pool.blockChain.State() currentState.AddBalance(from, big.NewInt(1000000000000)) pool.lockedReset() - pool.eventMux.Post(RemovedTransactionEvent{types.Transactions{tx}}) - pool.eventMux.Post(ChainHeadEvent{nil}) + blockChain, _ := pool.blockChain.(*testBlockChain) + blockChain.rmTxFeed.Send(RemovedTransactionEvent{types.Transactions{tx}}) + blockChain.chainHeadFeed.Send(ChainHeadEvent{nil}) + // wait for handling events + <-time.After(500 * time.Millisecond) if pool.pending[from].Len() != 1 { t.Error("expected 1 pending tx, got", pool.pending[from].Len()) } @@ -453,7 +485,7 @@ func TestTransactionDropping(t *testing.T) { account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000)) // Add some pending and some queued transactions @@ -518,7 +550,7 @@ func TestTransactionDropping(t *testing.T) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), 4) } // Reduce the block gas limit, check that invalidated transactions are dropped - pool.gasLimit = func() *big.Int { return big.NewInt(100) } + pool.blockChain.(*testBlockChain).gasLimit = big.NewInt(100) pool.lockedReset() if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { @@ -548,7 +580,7 @@ func TestTransactionPostponing(t *testing.T) { account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000)) // Add a batch consecutive pending transactions for validation @@ -624,7 +656,7 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000000)) pool.lockedReset() @@ -667,16 +699,17 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.NoLocals = nolocals config.GlobalQueue = config.AccountQueue*3 - 1 // reduce the queue limits to shorten test time (-1 to make it non divisible) - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them (last one will be the local) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() keys := make([]*ecdsa.PrivateKey, 5) for i := 0; i < len(keys); i++ { @@ -757,19 +790,20 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { // Create the pool to test the non-expiration enforcement db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.Lifetime = time.Second config.NoLocals = nolocals - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() // Create two test accounts to ensure remotes expire but locals do not local, _ := crypto.GenerateKey() remote, _ := crypto.GenerateKey() - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) state.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) @@ -821,7 +855,7 @@ func TestTransactionPendingLimiting(t *testing.T) { account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000000)) pool.lockedReset() @@ -853,7 +887,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { defer pool1.Stop() account1, _ := deriveSender(transaction(0, big.NewInt(0), key1)) - state1, _ := pool1.currentState() + state1, _ := pool1.blockChain.State() state1.AddBalance(account1, big.NewInt(1000000)) for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { @@ -866,7 +900,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { defer pool2.Stop() account2, _ := deriveSender(transaction(0, big.NewInt(0), key2)) - state2, _ := pool2.currentState() + state2, _ := pool2.blockChain.State() state2.AddBalance(account2, big.NewInt(1000000)) txns := []*types.Transaction{} @@ -900,15 +934,16 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.GlobalSlots = config.AccountSlots * 10 - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.currentState() + state, _ := pool.blockChain.State() keys := make([]*ecdsa.PrivateKey, 5) for i := 0; i < len(keys); i++ { @@ -946,17 +981,18 @@ func TestTransactionCapClearsFromAll(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.AccountSlots = 2 config.AccountQueue = 2 config.GlobalSlots = 8 - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.currentState() + state, _ := pool.blockChain.State() key, _ := crypto.GenerateKey() addr := crypto.PubkeyToAddress(key.PublicKey) @@ -980,15 +1016,16 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.GlobalSlots = 0 - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.currentState() + state, _ := pool.blockChain.State() keys := make([]*ecdsa.PrivateKey, 5) for i := 0; i < len(keys); i++ { @@ -1028,12 +1065,13 @@ func TestTransactionPoolRepricing(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} - pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.currentState() + state, _ := pool.blockChain.State() keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { @@ -1112,16 +1150,17 @@ func TestTransactionPoolUnderpricing(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.GlobalSlots = 2 config.GlobalQueue = 2 - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.currentState() + state, _ := pool.blockChain.State() keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { @@ -1199,14 +1238,15 @@ func TestTransactionReplacement(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} - pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() // Create a test account to add transactions with key, _ := crypto.GenerateKey() - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(crypto.PubkeyToAddress(key.PublicKey), big.NewInt(1000000000)) // Add pending transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) @@ -1278,19 +1318,20 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { // Create the original pool to inject transaction into the journal db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} config := testTxPoolConfig config.NoLocals = nolocals config.Journal = journal config.Rejournal = time.Second - pool := NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) // Create two test accounts to ensure remotes expire but locals do not local, _ := crypto.GenerateKey() remote, _ := crypto.GenerateKey() - statedb, _ = pool.currentState() + statedb, _ = pool.blockChain.State() statedb.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) statedb.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) @@ -1320,7 +1361,8 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { // Terminate the old pool, bump the local nonce, create a new pool and ensure relevant transaction survive pool.Stop() statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) - pool = NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + pool = NewTxPool(config, params.TestChainConfig, blockchain) pending, queued = pool.Stats() if queued != 0 { @@ -1344,7 +1386,8 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { time.Sleep(2 * config.Rejournal) pool.Stop() statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) - pool = NewTxPool(config, params.TestChainConfig, new(event.TypeMux), func() (*state.StateDB, error) { return statedb, nil }, func() *big.Int { return big.NewInt(1000000) }) + blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + pool = NewTxPool(config, params.TestChainConfig, blockchain) pending, queued = pool.Stats() if pending != 0 { @@ -1377,7 +1420,7 @@ func benchmarkPendingDemotion(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000000)) for i := 0; i < size; i++ { @@ -1403,7 +1446,7 @@ func benchmarkFuturePromotion(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000000)) for i := 0; i < size; i++ { @@ -1424,7 +1467,7 @@ func BenchmarkPoolInsert(b *testing.B) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000000)) txs := make(types.Transactions, b.N) @@ -1449,7 +1492,7 @@ func benchmarkPoolBatchInsert(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() + state, _ := pool.blockChain.State() state.AddBalance(account, big.NewInt(1000000)) batches := make([]types.Transactions, b.N) diff --git a/eth/api_backend.go b/eth/api_backend.go index 7ef7c030dd..abf52326b6 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -115,6 +115,30 @@ func (b *EthApiBackend) GetEVM(ctx context.Context, msg core.Message, state *sta return vm.NewEVM(context, state, b.eth.chainConfig, vmCfg), vmError, nil } +func (b *EthApiBackend) SubscribeRemovedTxEvent(ch chan<- core.RemovedTransactionEvent) event.Subscription { + return b.eth.BlockChain().SubscribeRemovedTxEvent(ch) +} + +func (b *EthApiBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return b.eth.BlockChain().SubscribeRemovedLogsEvent(ch) +} + +func (b *EthApiBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + return b.eth.BlockChain().SubscribeChainEvent(ch) +} + +func (b *EthApiBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + return b.eth.BlockChain().SubscribeChainHeadEvent(ch) +} + +func (b *EthApiBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { + return b.eth.BlockChain().SubscribeChainSideEvent(ch) +} + +func (b *EthApiBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return b.eth.BlockChain().SubscribeLogsEvent(ch) +} + func (b *EthApiBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error { return b.eth.txPool.AddLocal(signedTx) } @@ -151,6 +175,10 @@ func (b *EthApiBackend) TxPoolContent() (map[common.Address]types.Transactions, return b.eth.TxPool().Content() } +func (b *EthApiBackend) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription { + return b.eth.TxPool().SubscribeTxPreEvent(ch) +} + func (b *EthApiBackend) Downloader() *downloader.Downloader { return b.eth.Downloader() } diff --git a/eth/backend.go b/eth/backend.go index 8a837f7b88..5f4f2097a7 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -137,7 +137,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { } vmConfig := vm.Config{EnablePreimageRecording: config.EnablePreimageRecording} - eth.blockchain, err = core.NewBlockChain(chainDb, eth.chainConfig, eth.engine, eth.eventMux, vmConfig) + eth.blockchain, err = core.NewBlockChain(chainDb, eth.chainConfig, eth.engine, vmConfig) if err != nil { return nil, err } @@ -151,7 +151,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if config.TxPool.Journal != "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) } - eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.EventMux(), eth.blockchain.State, eth.blockchain.GasLimit) + eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.blockchain) maxPeers := config.MaxPeers if config.LightServ > 0 { diff --git a/eth/filters/filter.go b/eth/filters/filter.go index f27b76929e..f848bc6af9 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -34,6 +34,10 @@ type Backend interface { EventMux() *event.TypeMux HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) + SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription + SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription + SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription + SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription } // Filter can be used to retrieve and filter logs. diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go index ab0b7473ea..00ade0ffb2 100644 --- a/eth/filters/filter_system.go +++ b/eth/filters/filter_system.go @@ -54,6 +54,19 @@ const ( LastIndexSubscription ) +const ( + + // txChanSize is the size of channel listening to TxPreEvent. + // The number is referenced from the size of tx pool. + txChanSize = 4096 + // rmLogsChanSize is the size of channel listening to RemovedLogsEvent. + rmLogsChanSize = 10 + // logsChanSize is the size of channel listening to LogsEvent. + logsChanSize = 10 + // chainEvChanSize is the size of channel listening to ChainEvent. + chainEvChanSize = 10 +) + var ( ErrInvalidSubscriptionID = errors.New("invalid id") ) @@ -276,57 +289,50 @@ func (es *EventSystem) SubscribePendingTxEvents(hashes chan common.Hash) *Subscr type filterIndex map[Type]map[rpc.ID]*subscription // broadcast event to filters that match criteria. -func (es *EventSystem) broadcast(filters filterIndex, ev *event.TypeMuxEvent) { +func (es *EventSystem) broadcast(filters filterIndex, ev interface{}) { if ev == nil { return } - switch e := ev.Data.(type) { + switch e := ev.(type) { case []*types.Log: if len(e) > 0 { for _, f := range filters[LogsSubscription] { - if ev.Time.After(f.created) { - if matchedLogs := filterLogs(e, f.logsCrit.FromBlock, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 { - f.logs <- matchedLogs - } + if matchedLogs := filterLogs(e, f.logsCrit.FromBlock, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 { + f.logs <- matchedLogs } } } case core.RemovedLogsEvent: for _, f := range filters[LogsSubscription] { - if ev.Time.After(f.created) { - if matchedLogs := filterLogs(e.Logs, f.logsCrit.FromBlock, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 { - f.logs <- matchedLogs - } + if matchedLogs := filterLogs(e.Logs, f.logsCrit.FromBlock, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 { + f.logs <- matchedLogs } } - case core.PendingLogsEvent: - for _, f := range filters[PendingLogsSubscription] { - if ev.Time.After(f.created) { - if matchedLogs := filterLogs(e.Logs, nil, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 { - f.logs <- matchedLogs + case *event.TypeMuxEvent: + switch muxe := e.Data.(type) { + case core.PendingLogsEvent: + for _, f := range filters[PendingLogsSubscription] { + if e.Time.After(f.created) { + if matchedLogs := filterLogs(muxe.Logs, nil, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 { + f.logs <- matchedLogs + } } } } case core.TxPreEvent: for _, f := range filters[PendingTransactionsSubscription] { - if ev.Time.After(f.created) { - f.hashes <- e.Tx.Hash() - } + f.hashes <- e.Tx.Hash() } case core.ChainEvent: for _, f := range filters[BlocksSubscription] { - if ev.Time.After(f.created) { - f.headers <- e.Block.Header() - } + f.headers <- e.Block.Header() } if es.lightMode && len(filters[LogsSubscription]) > 0 { es.lightFilterNewHead(e.Block.Header(), func(header *types.Header, remove bool) { for _, f := range filters[LogsSubscription] { - if ev.Time.After(f.created) { - if matchedLogs := es.lightFilterLogs(header, f.logsCrit.Addresses, f.logsCrit.Topics, remove); len(matchedLogs) > 0 { - f.logs <- matchedLogs - } + if matchedLogs := es.lightFilterLogs(header, f.logsCrit.Addresses, f.logsCrit.Topics, remove); len(matchedLogs) > 0 { + f.logs <- matchedLogs } } }) @@ -395,9 +401,28 @@ func (es *EventSystem) lightFilterLogs(header *types.Header, addresses []common. func (es *EventSystem) eventLoop() { var ( index = make(filterIndex) - sub = es.mux.Subscribe(core.PendingLogsEvent{}, core.RemovedLogsEvent{}, []*types.Log{}, core.TxPreEvent{}, core.ChainEvent{}) + sub = es.mux.Subscribe(core.PendingLogsEvent{}) + // Subscribe TxPreEvent form txpool + txCh = make(chan core.TxPreEvent, txChanSize) + txSub = es.backend.SubscribeTxPreEvent(txCh) + // Subscribe RemovedLogsEvent + rmLogsCh = make(chan core.RemovedLogsEvent, rmLogsChanSize) + rmLogsSub = es.backend.SubscribeRemovedLogsEvent(rmLogsCh) + // Subscribe []*types.Log + logsCh = make(chan []*types.Log, logsChanSize) + logsSub = es.backend.SubscribeLogsEvent(logsCh) + // Subscribe ChainEvent + chainEvCh = make(chan core.ChainEvent, chainEvChanSize) + chainEvSub = es.backend.SubscribeChainEvent(chainEvCh) ) + // Unsubscribe all events + defer sub.Unsubscribe() + defer txSub.Unsubscribe() + defer rmLogsSub.Unsubscribe() + defer logsSub.Unsubscribe() + defer chainEvSub.Unsubscribe() + for i := UnknownSubscription; i < LastIndexSubscription; i++ { index[i] = make(map[rpc.ID]*subscription) } @@ -409,6 +434,17 @@ func (es *EventSystem) eventLoop() { return } es.broadcast(index, ev) + + // Handle subscribed events + case ev := <-txCh: + es.broadcast(index, ev) + case ev := <-rmLogsCh: + es.broadcast(index, ev) + case ev := <-logsCh: + es.broadcast(index, ev) + case ev := <-chainEvCh: + es.broadcast(index, ev) + case f := <-es.install: if f.typ == MinedAndPendingLogsSubscription { // the type are logs and pending logs subscriptions @@ -427,6 +463,16 @@ func (es *EventSystem) eventLoop() { delete(index[f.typ], f.id) } close(f.err) + + // System stopped + case <-txSub.Err(): + return + case <-rmLogsSub.Err(): + return + case <-logsSub.Err(): + return + case <-chainEvSub.Err(): + return } } } diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index 23e6d66e18..fcc888b8cf 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -34,8 +34,12 @@ import ( ) type testBackend struct { - mux *event.TypeMux - db ethdb.Database + mux *event.TypeMux + db ethdb.Database + txFeed *event.Feed + rmLogsFeed *event.Feed + logsFeed *event.Feed + chainFeed *event.Feed } func (b *testBackend) ChainDb() ethdb.Database { @@ -64,6 +68,22 @@ func (b *testBackend) GetReceipts(ctx context.Context, blockHash common.Hash) (t return core.GetBlockReceipts(b.db, blockHash, num), nil } +func (b *testBackend) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription { + return b.txFeed.Subscribe(ch) +} + +func (b *testBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return b.rmLogsFeed.Subscribe(ch) +} + +func (b *testBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return b.logsFeed.Subscribe(ch) +} + +func (b *testBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + return b.chainFeed.Subscribe(ch) +} + // TestBlockSubscription tests if a block subscription returns block hashes for posted chain events. // It creates multiple subscriptions: // - one at the start and should receive all posted chain events and a second (blockHashes) @@ -75,7 +95,11 @@ func TestBlockSubscription(t *testing.T) { var ( mux = new(event.TypeMux) db, _ = ethdb.NewMemDatabase() - backend = &testBackend{mux, db} + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} api = NewPublicFilterAPI(backend, false) genesis = new(core.Genesis).MustCommit(db) chain, _ = core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) {}) @@ -114,7 +138,7 @@ func TestBlockSubscription(t *testing.T) { time.Sleep(1 * time.Second) for _, e := range chainEvents { - mux.Post(e) + chainFeed.Send(e) } <-sub0.Err() @@ -126,10 +150,14 @@ func TestPendingTxFilter(t *testing.T) { t.Parallel() var ( - mux = new(event.TypeMux) - db, _ = ethdb.NewMemDatabase() - backend = &testBackend{mux, db} - api = NewPublicFilterAPI(backend, false) + mux = new(event.TypeMux) + db, _ = ethdb.NewMemDatabase() + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) transactions = []*types.Transaction{ types.NewTransaction(0, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil), @@ -147,9 +175,10 @@ func TestPendingTxFilter(t *testing.T) { time.Sleep(1 * time.Second) for _, tx := range transactions { ev := core.TxPreEvent{Tx: tx} - mux.Post(ev) + txFeed.Send(ev) } + timeout := time.Now().Add(1 * time.Second) for { results, err := api.GetFilterChanges(fid0) if err != nil { @@ -161,10 +190,18 @@ func TestPendingTxFilter(t *testing.T) { if len(hashes) >= len(transactions) { break } + // check timeout + if time.Now().After(timeout) { + break + } time.Sleep(100 * time.Millisecond) } + if len(hashes) != len(transactions) { + t.Errorf("invalid number of transactions, want %d transactions(s), got %d", len(transactions), len(hashes)) + return + } for i := range hashes { if hashes[i] != transactions[i].Hash() { t.Errorf("hashes[%d] invalid, want %x, got %x", i, transactions[i].Hash(), hashes[i]) @@ -176,10 +213,14 @@ func TestPendingTxFilter(t *testing.T) { // If not it must return an error. func TestLogFilterCreation(t *testing.T) { var ( - mux = new(event.TypeMux) - db, _ = ethdb.NewMemDatabase() - backend = &testBackend{mux, db} - api = NewPublicFilterAPI(backend, false) + mux = new(event.TypeMux) + db, _ = ethdb.NewMemDatabase() + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) testCases = []struct { crit FilterCriteria @@ -221,10 +262,14 @@ func TestInvalidLogFilterCreation(t *testing.T) { t.Parallel() var ( - mux = new(event.TypeMux) - db, _ = ethdb.NewMemDatabase() - backend = &testBackend{mux, db} - api = NewPublicFilterAPI(backend, false) + mux = new(event.TypeMux) + db, _ = ethdb.NewMemDatabase() + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) ) // different situations where log filter creation should fail. @@ -242,15 +287,19 @@ func TestInvalidLogFilterCreation(t *testing.T) { } } -// TestLogFilter tests whether log filters match the correct logs that are posted to the event mux. +// TestLogFilter tests whether log filters match the correct logs that are posted to the event feed. func TestLogFilter(t *testing.T) { t.Parallel() var ( - mux = new(event.TypeMux) - db, _ = ethdb.NewMemDatabase() - backend = &testBackend{mux, db} - api = NewPublicFilterAPI(backend, false) + mux = new(event.TypeMux) + db, _ = ethdb.NewMemDatabase() + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") @@ -311,8 +360,8 @@ func TestLogFilter(t *testing.T) { // raise events time.Sleep(1 * time.Second) - if err := mux.Post(allLogs); err != nil { - t.Fatal(err) + if nsend := logsFeed.Send(allLogs); nsend == 0 { + t.Fatal("Shoud have at least one subscription") } if err := mux.Post(core.PendingLogsEvent{Logs: allLogs}); err != nil { t.Fatal(err) @@ -320,6 +369,7 @@ func TestLogFilter(t *testing.T) { for i, tt := range testCases { var fetched []*types.Log + timeout := time.Now().Add(1 * time.Second) for { // fetch all expected logs results, err := api.GetFilterChanges(tt.id) if err != nil { @@ -330,6 +380,10 @@ func TestLogFilter(t *testing.T) { if len(fetched) >= len(tt.expected) { break } + // check timeout + if time.Now().After(timeout) { + break + } time.Sleep(100 * time.Millisecond) } @@ -350,15 +404,19 @@ func TestLogFilter(t *testing.T) { } } -// TestPendingLogsSubscription tests if a subscription receives the correct pending logs that are posted to the event mux. +// TestPendingLogsSubscription tests if a subscription receives the correct pending logs that are posted to the event feed. func TestPendingLogsSubscription(t *testing.T) { t.Parallel() var ( - mux = new(event.TypeMux) - db, _ = ethdb.NewMemDatabase() - backend = &testBackend{mux, db} - api = NewPublicFilterAPI(backend, false) + mux = new(event.TypeMux) + db, _ = ethdb.NewMemDatabase() + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") @@ -456,6 +514,7 @@ func TestPendingLogsSubscription(t *testing.T) { // raise events time.Sleep(1 * time.Second) + // allLogs are type of core.PendingLogsEvent for _, l := range allLogs { if err := mux.Post(l); err != nil { t.Fatal(err) diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index b6cfd4bbc3..3244c04d74 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -49,14 +49,18 @@ func BenchmarkMipmaps(b *testing.B) { defer os.RemoveAll(dir) var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) - mux = new(event.TypeMux) - backend = &testBackend{mux, db} - key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - addr1 = crypto.PubkeyToAddress(key1.PublicKey) - addr2 = common.BytesToAddress([]byte("jeff")) - addr3 = common.BytesToAddress([]byte("ethereum")) - addr4 = common.BytesToAddress([]byte("random addresses please")) + db, _ = ethdb.NewLDBDatabase(dir, 0, 0) + mux = new(event.TypeMux) + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + addr2 = common.BytesToAddress([]byte("jeff")) + addr3 = common.BytesToAddress([]byte("ethereum")) + addr4 = common.BytesToAddress([]byte("random addresses please")) ) defer db.Close() @@ -119,11 +123,15 @@ func TestFilters(t *testing.T) { defer os.RemoveAll(dir) var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) - mux = new(event.TypeMux) - backend = &testBackend{mux, db} - key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - addr = crypto.PubkeyToAddress(key1.PublicKey) + db, _ = ethdb.NewLDBDatabase(dir, 0, 0) + mux = new(event.TypeMux) + txFeed = new(event.Feed) + rmLogsFeed = new(event.Feed) + logsFeed = new(event.Feed) + chainFeed = new(event.Feed) + backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key1.PublicKey) hash1 = common.BytesToHash([]byte("topic1")) hash2 = common.BytesToHash([]byte("topic2")) diff --git a/eth/handler.go b/eth/handler.go index e6a9c86d79..9d230a4ad6 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -45,6 +45,10 @@ import ( const ( softResponseLimit = 2 * 1024 * 1024 // Target maximum size of returned blocks, headers or node data. estHeaderRlpSize = 500 // Approximate size of an RLP encoded block header + + // txChanSize is the size of channel listening to TxPreEvent. + // The number is referenced from the size of tx pool. + txChanSize = 4096 ) var ( @@ -78,7 +82,8 @@ type ProtocolManager struct { SubProtocols []p2p.Protocol eventMux *event.TypeMux - txSub *event.TypeMuxSubscription + txCh chan core.TxPreEvent + txSub event.Subscription minedBlockSub *event.TypeMuxSubscription // channels for fetcher, syncer, txsyncLoop @@ -200,7 +205,8 @@ func (pm *ProtocolManager) removePeer(id string) { func (pm *ProtocolManager) Start() { // broadcast transactions - pm.txSub = pm.eventMux.Subscribe(core.TxPreEvent{}) + pm.txCh = make(chan core.TxPreEvent, txChanSize) + pm.txSub = pm.txpool.SubscribeTxPreEvent(pm.txCh) go pm.txBroadcastLoop() // broadcast mined blocks pm.minedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{}) @@ -724,10 +730,15 @@ func (self *ProtocolManager) minedBroadcastLoop() { } func (self *ProtocolManager) txBroadcastLoop() { - // automatically stops if unsubscribe - for obj := range self.txSub.Chan() { - event := obj.Data.(core.TxPreEvent) - self.BroadcastTx(event.Tx.Hash(), event.Tx) + for { + select { + case event := <-self.txCh: + self.BroadcastTx(event.Tx.Hash(), event.Tx) + + // Err() channel will be closed when unsubscribing. + case <-self.txSub.Err(): + return + } } } diff --git a/eth/handler_test.go b/eth/handler_test.go index ca9c9e1b40..aba2774444 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -474,7 +474,7 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool config = ¶ms.ChainConfig{DAOForkBlock: big.NewInt(1), DAOForkSupport: localForked} gspec = &core.Genesis{Config: config} genesis = gspec.MustCommit(db) - blockchain, _ = core.NewBlockChain(db, config, pow, evmux, vm.Config{}) + blockchain, _ = core.NewBlockChain(db, config, pow, vm.Config{}) ) pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, 1000, evmux, new(testTxPool), pow, blockchain, db) if err != nil { diff --git a/eth/helper_test.go b/eth/helper_test.go index 546478a3ee..f1dab95283 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -59,7 +59,7 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func Alloc: core.GenesisAlloc{testBank: {Balance: big.NewInt(1000000)}}, } genesis = gspec.MustCommit(db) - blockchain, _ = core.NewBlockChain(db, gspec.Config, engine, evmux, vm.Config{}) + blockchain, _ = core.NewBlockChain(db, gspec.Config, engine, vm.Config{}) ) chain, _ := core.GenerateChain(gspec.Config, genesis, db, blocks, generator) if _, err := blockchain.InsertChain(chain); err != nil { @@ -88,8 +88,9 @@ func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks i // testTxPool is a fake, helper transaction pool for testing purposes type testTxPool struct { - pool []*types.Transaction // Collection of all transactions - added chan<- []*types.Transaction // Notification channel for new transactions + txFeed event.Feed + pool []*types.Transaction // Collection of all transactions + added chan<- []*types.Transaction // Notification channel for new transactions lock sync.RWMutex // Protects the transaction pool } @@ -124,6 +125,10 @@ func (p *testTxPool) Pending() (map[common.Address]types.Transactions, error) { return batches, nil } +func (p *testTxPool) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription { + return p.txFeed.Subscribe(ch) +} + // newTestTransaction create a new dummy transaction. func newTestTransaction(from *ecdsa.PrivateKey, nonce uint64, datasize int) *types.Transaction { tx := types.NewTransaction(nonce, common.Address{}, big.NewInt(0), big.NewInt(100000), big.NewInt(0), make([]byte, datasize)) diff --git a/eth/protocol.go b/eth/protocol.go index 376e4663e3..2c41376fa8 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -22,7 +22,9 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/rlp" ) @@ -100,6 +102,10 @@ type txPool interface { // Pending should return pending transactions. // The slice should be modifiable by the caller. Pending() (map[common.Address]types.Transactions, error) + + // SubscribeTxPreEvent should return an event subscription of + // TxPreEvent and send events to the given channel. + SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription } // statusData is the network packet for the status message. diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index b75c5e6da4..bb03dc72b0 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -44,9 +44,27 @@ import ( "golang.org/x/net/websocket" ) -// historyUpdateRange is the number of blocks a node should report upon login or -// history request. -const historyUpdateRange = 50 +const ( + // historyUpdateRange is the number of blocks a node should report upon login or + // history request. + historyUpdateRange = 50 + + // txChanSize is the size of channel listening to TxPreEvent. + // The number is referenced from the size of tx pool. + txChanSize = 4096 + // chainHeadChanSize is the size of channel listening to ChainHeadEvent. + chainHeadChanSize = 10 +) + +type txPool interface { + // SubscribeTxPreEvent should return an event subscription of + // TxPreEvent and send events to the given channel. + SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription +} + +type blockChain interface { + SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription +} // Service implements an Ethereum netstats reporting daemon that pushes local // chain statistics up to a monitoring server. @@ -118,16 +136,22 @@ func (s *Service) Stop() error { // until termination. func (s *Service) loop() { // Subscribe to chain events to execute updates on - var emux *event.TypeMux + var blockchain blockChain + var txpool txPool if s.eth != nil { - emux = s.eth.EventMux() + blockchain = s.eth.BlockChain() + txpool = s.eth.TxPool() } else { - emux = s.les.EventMux() + blockchain = s.les.BlockChain() + txpool = s.les.TxPool() } - headSub := emux.Subscribe(core.ChainHeadEvent{}) + + chainHeadCh := make(chan core.ChainHeadEvent, chainHeadChanSize) + headSub := blockchain.SubscribeChainHeadEvent(chainHeadCh) defer headSub.Unsubscribe() - txSub := emux.Subscribe(core.TxPreEvent{}) + txEventCh := make(chan core.TxPreEvent, txChanSize) + txSub := txpool.SubscribeTxPreEvent(txEventCh) defer txSub.Unsubscribe() // Start a goroutine that exhausts the subsciptions to avoid events piling up @@ -139,25 +163,18 @@ func (s *Service) loop() { go func() { var lastTx mclock.AbsTime + HandleLoop: for { select { // Notify of chain head events, but drop if too frequent - case head, ok := <-headSub.Chan(): - if !ok { // node stopped - close(quitCh) - return - } + case head := <-chainHeadCh: select { - case headCh <- head.Data.(core.ChainHeadEvent).Block: + case headCh <- head.Block: default: } // Notify of new transaction events, but drop if too frequent - case _, ok := <-txSub.Chan(): - if !ok { // node stopped - close(quitCh) - return - } + case <-txEventCh: if time.Duration(mclock.Now()-lastTx) < time.Second { continue } @@ -167,8 +184,16 @@ func (s *Service) loop() { case txCh <- struct{}{}: default: } + + // node stopped + case <-txSub.Err(): + break HandleLoop + case <-headSub.Err(): + break HandleLoop } } + close(quitCh) + return }() // Loop reporting until termination for { diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index d122b7915b..be17ffeae4 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -53,6 +53,9 @@ type Backend interface { GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) GetTd(blockHash common.Hash) *big.Int GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error) + SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription + SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription + SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription // TxPool API SendTx(ctx context.Context, signedTx *types.Transaction) error @@ -62,6 +65,7 @@ type Backend interface { GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) Stats() (pending int, queued int) TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) + SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription ChainConfig() *params.ChainConfig CurrentBlock() *types.Block diff --git a/les/api_backend.go b/les/api_backend.go index 7a3c2447c9..1323e88644 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -124,6 +124,30 @@ func (b *LesApiBackend) TxPoolContent() (map[common.Address]types.Transactions, return b.eth.txPool.Content() } +func (b *LesApiBackend) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription { + return b.eth.txPool.SubscribeTxPreEvent(ch) +} + +func (b *LesApiBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + return b.eth.blockchain.SubscribeChainEvent(ch) +} + +func (b *LesApiBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + return b.eth.blockchain.SubscribeChainHeadEvent(ch) +} + +func (b *LesApiBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { + return b.eth.blockchain.SubscribeChainSideEvent(ch) +} + +func (b *LesApiBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return b.eth.blockchain.SubscribeLogsEvent(ch) +} + +func (b *LesApiBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return b.eth.blockchain.SubscribeRemovedLogsEvent(ch) +} + func (b *LesApiBackend) Downloader() *downloader.Downloader { return b.eth.Downloader() } diff --git a/les/backend.go b/les/backend.go index a4e7726717..4c33417c03 100644 --- a/les/backend.go +++ b/les/backend.go @@ -103,7 +103,7 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { eth.serverPool = newServerPool(chainDb, quitSync, ð.wg) eth.retriever = newRetrieveManager(peers, eth.reqDist, eth.serverPool) eth.odr = NewLesOdr(chainDb, eth.retriever) - if eth.blockchain, err = light.NewLightChain(eth.odr, eth.chainConfig, eth.engine, eth.eventMux); err != nil { + if eth.blockchain, err = light.NewLightChain(eth.odr, eth.chainConfig, eth.engine); err != nil { return nil, err } // Rewind the chain in case of an incompatible config upgrade. @@ -113,7 +113,7 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { core.WriteChainConfig(chainDb, genesisHash, chainConfig) } - eth.txPool = light.NewTxPool(eth.chainConfig, eth.eventMux, eth.blockchain, eth.relay) + eth.txPool = light.NewTxPool(eth.chainConfig, eth.blockchain, eth.relay) if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, true, config.NetworkId, eth.eventMux, eth.engine, eth.peers, eth.blockchain, nil, chainDb, eth.odr, eth.relay, quitSync, ð.wg); err != nil { return nil, err } diff --git a/les/handler.go b/les/handler.go index 234b6e998b..1a75cd369d 100644 --- a/les/handler.go +++ b/les/handler.go @@ -82,6 +82,7 @@ type BlockChain interface { GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash LastBlockHash() common.Hash Genesis() *types.Block + SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription } type txPool interface { diff --git a/les/helper_test.go b/les/helper_test.go index 7dccfc4582..b33454e1d0 100644 --- a/les/helper_test.go +++ b/les/helper_test.go @@ -146,9 +146,9 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor } if lightSync { - chain, _ = light.NewLightChain(odr, gspec.Config, engine, evmux) + chain, _ = light.NewLightChain(odr, gspec.Config, engine) } else { - blockchain, _ := core.NewBlockChain(db, gspec.Config, engine, evmux, vm.Config{}) + blockchain, _ := core.NewBlockChain(db, gspec.Config, engine, vm.Config{}) gchain, _ := core.GenerateChain(gspec.Config, genesis, db, blocks, generator) if _, err := blockchain.InsertChain(gchain); err != nil { panic(err) diff --git a/les/server.go b/les/server.go index 39ef0efffe..8b27307141 100644 --- a/les/server.go +++ b/les/server.go @@ -271,7 +271,8 @@ func (s *requestCostStats) update(msgCode, reqCnt, cost uint64) { func (pm *ProtocolManager) blockLoop() { pm.wg.Add(1) - sub := pm.eventMux.Subscribe(core.ChainHeadEvent{}) + headCh := make(chan core.ChainHeadEvent, 10) + headSub := pm.blockchain.SubscribeChainHeadEvent(headCh) newCht := make(chan struct{}, 10) newCht <- struct{}{} go func() { @@ -280,10 +281,10 @@ func (pm *ProtocolManager) blockLoop() { lastBroadcastTd := common.Big0 for { select { - case ev := <-sub.Chan(): + case ev := <-headCh: peers := pm.peers.AllPeers() if len(peers) > 0 { - header := ev.Data.(core.ChainHeadEvent).Block.Header() + header := ev.Block.Header() hash := header.Hash() number := header.Number.Uint64() td := core.GetTd(pm.chainDb, hash, number) @@ -319,7 +320,7 @@ func (pm *ProtocolManager) blockLoop() { } }() case <-pm.quitSync: - sub.Unsubscribe() + headSub.Unsubscribe() pm.wg.Done() return } diff --git a/light/lightchain.go b/light/lightchain.go index a51043975f..df194ecadf 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -44,11 +44,14 @@ var ( // headers, downloading block bodies and receipts on demand through an ODR // interface. It only does header validation during chain insertion. type LightChain struct { - hc *core.HeaderChain - chainDb ethdb.Database - odr OdrBackend - eventMux *event.TypeMux - genesisBlock *types.Block + hc *core.HeaderChain + chainDb ethdb.Database + odr OdrBackend + chainFeed event.Feed + chainSideFeed event.Feed + chainHeadFeed event.Feed + scope event.SubscriptionScope + genesisBlock *types.Block mu sync.RWMutex chainmu sync.RWMutex @@ -69,7 +72,7 @@ type LightChain struct { // NewLightChain returns a fully initialised light chain using information // available in the database. It initialises the default Ethereum header // validator. -func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus.Engine, mux *event.TypeMux) (*LightChain, error) { +func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus.Engine) (*LightChain, error) { bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) blockCache, _ := lru.New(blockCacheLimit) @@ -77,7 +80,6 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. bc := &LightChain{ chainDb: odr.Database(), odr: odr, - eventMux: mux, quit: make(chan struct{}), bodyCache: bodyCache, bodyRLPCache: bodyRLPCache, @@ -316,16 +318,18 @@ func (self *LightChain) Rollback(chain []common.Hash) { } // postChainEvents iterates over the events generated by a chain insertion and -// posts them into the event mux. +// posts them into the event feed. func (self *LightChain) postChainEvents(events []interface{}) { for _, event := range events { - if event, ok := event.(core.ChainEvent); ok { - if self.LastBlockHash() == event.Hash { - self.eventMux.Post(core.ChainHeadEvent{Block: event.Block}) + switch ev := event.(type) { + case core.ChainEvent: + if self.LastBlockHash() == ev.Hash { + self.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block}) } + self.chainFeed.Send(ev) + case core.ChainSideEvent: + self.chainSideFeed.Send(ev) } - // Fire the insertion events individually too - self.eventMux.Post(event) } } @@ -467,3 +471,30 @@ func (self *LightChain) LockChain() { func (self *LightChain) UnlockChain() { self.chainmu.RUnlock() } + +// SubscribeChainEvent registers a subscription of ChainEvent. +func (self *LightChain) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + return self.scope.Track(self.chainFeed.Subscribe(ch)) +} + +// SubscribeChainHeadEvent registers a subscription of ChainHeadEvent. +func (self *LightChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + return self.scope.Track(self.chainHeadFeed.Subscribe(ch)) +} + +// SubscribeChainSideEvent registers a subscription of ChainSideEvent. +func (self *LightChain) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { + return self.scope.Track(self.chainSideFeed.Subscribe(ch)) +} + +// SubscribeLogsEvent implements the interface of filters.Backend +// LightChain does not send logs events, so return an empty subscription. +func (self *LightChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return self.scope.Track(new(event.Feed).Subscribe(ch)) +} + +// SubscribeRemovedLogsEvent implements the interface of filters.Backend +// LightChain does not send core.RemovedLogsEvent, so return an empty subscription. +func (self *LightChain) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return self.scope.Track(new(event.Feed).Subscribe(ch)) +} diff --git a/light/lightchain_test.go b/light/lightchain_test.go index 0ad6405256..40a4d396a8 100644 --- a/light/lightchain_test.go +++ b/light/lightchain_test.go @@ -26,7 +26,6 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -55,7 +54,7 @@ func newCanonical(n int) (ethdb.Database, *LightChain, error) { db, _ := ethdb.NewMemDatabase() gspec := core.Genesis{Config: params.TestChainConfig} genesis := gspec.MustCommit(db) - blockchain, _ := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFaker(), new(event.TypeMux)) + blockchain, _ := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFaker()) // Create and inject the requested chain if n == 0 { @@ -75,7 +74,7 @@ func newTestLightChain() *LightChain { Config: params.TestChainConfig, } gspec.MustCommit(db) - lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFullFaker(), new(event.TypeMux)) + lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFullFaker()) if err != nil { panic(err) } @@ -339,7 +338,7 @@ func TestReorgBadHeaderHashes(t *testing.T) { defer func() { delete(core.BadHashes, headers[3].Hash()) }() // Create a new LightChain and check that it rolled back the state. - ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ethash.NewFaker(), new(event.TypeMux)) + ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ethash.NewFaker()) if err != nil { t.Fatalf("failed to create new chain manager: %v", err) } diff --git a/light/odr_test.go b/light/odr_test.go index 544b64effc..bd1e976e81 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -33,7 +33,6 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" @@ -233,7 +232,6 @@ func testChainGen(i int, block *core.BlockGen) { func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { var ( - evmux = new(event.TypeMux) sdb, _ = ethdb.NewMemDatabase() ldb, _ = ethdb.NewMemDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} @@ -241,14 +239,14 @@ func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { ) gspec.MustCommit(ldb) // Assemble the test environment - blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ethash.NewFullFaker(), evmux, vm.Config{}) + blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{}) gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, sdb, 4, testChainGen) if _, err := blockchain.InsertChain(gchain); err != nil { t.Fatal(err) } odr := &testOdr{sdb: sdb, ldb: ldb} - lightchain, err := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker(), evmux) + lightchain, err := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker()) if err != nil { t.Fatal(err) } diff --git a/light/trie_test.go b/light/trie_test.go index 9b2cf7c2b1..5f45c01af9 100644 --- a/light/trie_test.go +++ b/light/trie_test.go @@ -28,7 +28,6 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" ) @@ -41,7 +40,7 @@ func TestNodeIterator(t *testing.T) { genesis = gspec.MustCommit(fulldb) ) gspec.MustCommit(lightdb) - blockchain, _ := core.NewBlockChain(fulldb, params.TestChainConfig, ethash.NewFullFaker(), new(event.TypeMux), vm.Config{}) + blockchain, _ := core.NewBlockChain(fulldb, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{}) gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, fulldb, 4, testChainGen) if _, err := blockchain.InsertChain(gchain); err != nil { panic(err) diff --git a/light/txpool.go b/light/txpool.go index 7cbb991e85..bd215b9928 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -33,6 +33,11 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) +const ( + // chainHeadChanSize is the size of channel listening to ChainHeadEvent. + chainHeadChanSize = 10 +) + // txPermanent is the number of mined blocks after a mined transaction is // considered permanent and no rollback is expected var txPermanent = uint64(500) @@ -43,21 +48,23 @@ var txPermanent = uint64(500) // always receive all locally signed transactions in the same order as they are // created. type TxPool struct { - config *params.ChainConfig - signer types.Signer - quit chan bool - eventMux *event.TypeMux - events *event.TypeMuxSubscription - mu sync.RWMutex - chain *LightChain - odr OdrBackend - chainDb ethdb.Database - relay TxRelayBackend - head common.Hash - nonce map[common.Address]uint64 // "pending" nonce - pending map[common.Hash]*types.Transaction // pending transactions by tx hash - mined map[common.Hash][]*types.Transaction // mined transactions by block hash - clearIdx uint64 // earliest block nr that can contain mined tx info + config *params.ChainConfig + signer types.Signer + quit chan bool + txFeed event.Feed + scope event.SubscriptionScope + chainHeadCh chan core.ChainHeadEvent + chainHeadSub event.Subscription + mu sync.RWMutex + chain *LightChain + odr OdrBackend + chainDb ethdb.Database + relay TxRelayBackend + head common.Hash + nonce map[common.Address]uint64 // "pending" nonce + pending map[common.Hash]*types.Transaction // pending transactions by tx hash + mined map[common.Hash][]*types.Transaction // mined transactions by block hash + clearIdx uint64 // earliest block nr that can contain mined tx info homestead bool } @@ -78,23 +85,24 @@ type TxRelayBackend interface { } // NewTxPool creates a new light transaction pool -func NewTxPool(config *params.ChainConfig, eventMux *event.TypeMux, chain *LightChain, relay TxRelayBackend) *TxPool { +func NewTxPool(config *params.ChainConfig, chain *LightChain, relay TxRelayBackend) *TxPool { pool := &TxPool{ - config: config, - signer: types.NewEIP155Signer(config.ChainId), - nonce: make(map[common.Address]uint64), - pending: make(map[common.Hash]*types.Transaction), - mined: make(map[common.Hash][]*types.Transaction), - quit: make(chan bool), - eventMux: eventMux, - events: eventMux.Subscribe(core.ChainHeadEvent{}), - chain: chain, - relay: relay, - odr: chain.Odr(), - chainDb: chain.Odr().Database(), - head: chain.CurrentHeader().Hash(), - clearIdx: chain.CurrentHeader().Number.Uint64(), + config: config, + signer: types.NewEIP155Signer(config.ChainId), + nonce: make(map[common.Address]uint64), + pending: make(map[common.Hash]*types.Transaction), + mined: make(map[common.Hash][]*types.Transaction), + quit: make(chan bool), + chainHeadCh: make(chan core.ChainHeadEvent, chainHeadChanSize), + chain: chain, + relay: relay, + odr: chain.Odr(), + chainDb: chain.Odr().Database(), + head: chain.CurrentHeader().Hash(), + clearIdx: chain.CurrentHeader().Number.Uint64(), } + // Subscribe events from blockchain + pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) go pool.eventLoop() return pool @@ -274,13 +282,17 @@ const blockCheckTimeout = time.Second * 3 // eventLoop processes chain head events and also notifies the tx relay backend // about the new head hash and tx state changes func (pool *TxPool) eventLoop() { - for ev := range pool.events.Chan() { - switch ev.Data.(type) { - case core.ChainHeadEvent: - pool.setNewHead(ev.Data.(core.ChainHeadEvent).Block.Header()) + for { + select { + case ev := <-pool.chainHeadCh: + pool.setNewHead(ev.Block.Header()) // hack in order to avoid hogging the lock; this part will // be replaced by a subsequent PR. time.Sleep(time.Millisecond) + + // System stopped + case <-pool.chainHeadSub.Err(): + return } } } @@ -301,11 +313,20 @@ func (pool *TxPool) setNewHead(head *types.Header) { // Stop stops the light transaction pool func (pool *TxPool) Stop() { + // Unsubscribe all subscriptions registered from txpool + pool.scope.Close() + // Unsubscribe subscriptions registered from blockchain + pool.chainHeadSub.Unsubscribe() close(pool.quit) - pool.events.Unsubscribe() log.Info("Transaction pool stopped") } +// SubscribeTxPreEvent registers a subscription of core.TxPreEvent and +// starts sending event to the given channel. +func (pool *TxPool) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription { + return pool.scope.Track(pool.txFeed.Subscribe(ch)) +} + // Stats returns the number of currently pending (locally created) transactions func (pool *TxPool) Stats() (pending int) { pool.mu.RLock() @@ -388,7 +409,7 @@ func (self *TxPool) add(ctx context.Context, tx *types.Transaction) error { // Notify the subscribers. This event is posted in a goroutine // because it's possible that somewhere during the post "Remove transaction" // gets called which will then wait for the global tx pool lock and deadlock. - go self.eventMux.Post(core.TxPreEvent{Tx: tx}) + go self.txFeed.Send(core.TxPreEvent{Tx: tx}) } // Print a log message if low enough level is set diff --git a/light/txpool_test.go b/light/txpool_test.go index f23832a417..fe7936ac28 100644 --- a/light/txpool_test.go +++ b/light/txpool_test.go @@ -29,7 +29,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -82,7 +81,6 @@ func TestTxPool(t *testing.T) { } var ( - evmux = new(event.TypeMux) sdb, _ = ethdb.NewMemDatabase() ldb, _ = ethdb.NewMemDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} @@ -90,7 +88,7 @@ func TestTxPool(t *testing.T) { ) gspec.MustCommit(ldb) // Assemble the test environment - blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ethash.NewFullFaker(), evmux, vm.Config{}) + blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{}) gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, sdb, poolTestBlocks, txPoolTestChainGen) if _, err := blockchain.InsertChain(gchain); err != nil { panic(err) @@ -102,9 +100,9 @@ func TestTxPool(t *testing.T) { discard: make(chan int, 1), mined: make(chan int, 1), } - lightchain, _ := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker(), evmux) + lightchain, _ := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker()) txPermanent = 50 - pool := NewTxPool(params.TestChainConfig, evmux, lightchain, relay) + pool := NewTxPool(params.TestChainConfig, lightchain, relay) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() diff --git a/miner/worker.go b/miner/worker.go index dab192c24f..24e03be60a 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -41,6 +41,14 @@ import ( const ( resultQueueSize = 10 miningLogAtDepth = 5 + + // txChanSize is the size of channel listening to TxPreEvent. + // The number is referenced from the size of tx pool. + txChanSize = 4096 + // chainHeadChanSize is the size of channel listening to ChainHeadEvent. + chainHeadChanSize = 10 + // chainSideChanSize is the size of channel listening to ChainSideEvent. + chainSideChanSize = 10 ) // Agent can register themself with the worker @@ -87,9 +95,14 @@ type worker struct { mu sync.Mutex // update loop - mux *event.TypeMux - events *event.TypeMuxSubscription - wg sync.WaitGroup + mux *event.TypeMux + txCh chan core.TxPreEvent + txSub event.Subscription + chainHeadCh chan core.ChainHeadEvent + chainHeadSub event.Subscription + chainSideCh chan core.ChainSideEvent + chainSideSub event.Subscription + wg sync.WaitGroup agents map[Agent]struct{} recv chan *Result @@ -123,6 +136,9 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, coinbase com engine: engine, eth: eth, mux: mux, + txCh: make(chan core.TxPreEvent, txChanSize), + chainHeadCh: make(chan core.ChainHeadEvent, chainHeadChanSize), + chainSideCh: make(chan core.ChainSideEvent, chainSideChanSize), chainDb: eth.ChainDb(), recv: make(chan *Result, resultQueueSize), chain: eth.BlockChain(), @@ -133,7 +149,11 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, coinbase com unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), miningLogAtDepth), fullValidation: false, } - worker.events = worker.mux.Subscribe(core.ChainHeadEvent{}, core.ChainSideEvent{}, core.TxPreEvent{}) + // Subscribe TxPreEvent for tx pool + worker.txSub = eth.TxPool().SubscribeTxPreEvent(worker.txCh) + // Subscribe events for blockchain + worker.chainHeadSub = eth.BlockChain().SubscribeChainHeadEvent(worker.chainHeadCh) + worker.chainSideSub = eth.BlockChain().SubscribeChainSideEvent(worker.chainSideCh) go worker.update() go worker.wait() @@ -225,20 +245,28 @@ func (self *worker) unregister(agent Agent) { } func (self *worker) update() { - for event := range self.events.Chan() { + defer self.txSub.Unsubscribe() + defer self.chainHeadSub.Unsubscribe() + defer self.chainSideSub.Unsubscribe() + + for { // A real event arrived, process interesting content - switch ev := event.Data.(type) { - case core.ChainHeadEvent: + select { + // Handle ChainHeadEvent + case <-self.chainHeadCh: self.commitNewWork() - case core.ChainSideEvent: + + // Handle ChainSideEvent + case ev := <-self.chainSideCh: self.uncleMu.Lock() self.possibleUncles[ev.Block.Hash()] = ev.Block self.uncleMu.Unlock() - case core.TxPreEvent: + + // Handle TxPreEvent + case ev := <-self.txCh: // Apply transaction to the pending state if we're not mining if atomic.LoadInt32(&self.mining) == 0 { self.currentMu.Lock() - acc, _ := types.Sender(self.current.signer, ev.Tx) txs := map[common.Address]types.Transactions{acc: {ev.Tx}} txset := types.NewTransactionsByPriceAndNonce(txs) @@ -246,6 +274,14 @@ func (self *worker) update() { self.current.commitTransactions(self.mux, txset, self.chain, self.coinbase) self.currentMu.Unlock() } + + // System stopped + case <-self.txSub.Err(): + return + case <-self.chainHeadSub.Err(): + return + case <-self.chainSideSub.Err(): + return } } } @@ -298,12 +334,18 @@ func (self *worker) wait() { // broadcast before waiting for validation go func(block *types.Block, logs []*types.Log, receipts []*types.Receipt) { self.mux.Post(core.NewMinedBlockEvent{Block: block}) - self.mux.Post(core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) + var ( + events []interface{} + coalescedLogs []*types.Log + ) + events = append(events, core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) if stat == core.CanonStatTy { - self.mux.Post(core.ChainHeadEvent{Block: block}) - self.mux.Post(logs) + events = append(events, core.ChainHeadEvent{Block: block}) + coalescedLogs = logs } + // post blockchain events + self.chain.PostChainEvents(events, coalescedLogs) if err := core.WriteBlockReceipts(self.chainDb, block.Hash(), block.NumberU64(), receipts); err != nil { log.Warn("Failed writing block receipts", "err", err) } diff --git a/tests/block_test_util.go b/tests/block_test_util.go index c1d433ff39..a789e6d887 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -33,7 +33,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) @@ -111,7 +110,7 @@ func (t *BlockTest) Run() error { return fmt.Errorf("genesis block state root does not match test: computed=%x, test=%x", gblock.Root().Bytes()[:6], t.json.Genesis.StateRoot[:6]) } - chain, err := core.NewBlockChain(db, config, ethash.NewShared(), new(event.TypeMux), vm.Config{}) + chain, err := core.NewBlockChain(db, config, ethash.NewShared(), vm.Config{}) if err != nil { return err } From 314246da7866f374d4efacdc460d65fd5cba8f3d Mon Sep 17 00:00:00 2001 From: gurrpi Date: Mon, 21 Aug 2017 15:08:57 +0900 Subject: [PATCH 098/272] Adding period at end of sentence missing period at line 119 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76ee1b111a..ab741fcc90 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ To get an idea how the file should look like you can use the `dumpconfig` subcom $ geth --your-favourite-flags dumpconfig ``` -*Note: This works only with geth v1.6.0 and above* +*Note: This works only with geth v1.6.0 and above.* #### Docker quick start From e311bb520a1869e42ed30eb1487a751fa30cd0b4 Mon Sep 17 00:00:00 2001 From: Noman Date: Mon, 21 Aug 2017 05:22:00 -0400 Subject: [PATCH 099/272] whisper: Fix spelling and grammar in error (#15009) * whisper: Fix spelling and grammar in error * whisper: Fix grammar in comments --- whisper/whisperv5/api.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/whisper/whisperv5/api.go b/whisper/whisperv5/api.go index 5b84b99eb4..ec22f0d1d0 100644 --- a/whisper/whisperv5/api.go +++ b/whisper/whisperv5/api.go @@ -37,7 +37,7 @@ const ( ) var ( - ErrSymAsym = errors.New("specify either a symetric or a asymmetric key") + ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key") ErrInvalidSymmetricKey = errors.New("invalid symmetric key") ErrInvalidPublicKey = errors.New("invalid public key") ErrInvalidSigningPubKey = errors.New("invalid signing public key") @@ -243,7 +243,7 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er err error ) - // user must specify either a symmetric or a asymmetric key + // user must specify either a symmetric or an asymmetric key if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) { return false, ErrSymAsym } @@ -344,7 +344,7 @@ func (api *PublicWhisperAPI) Messages(ctx context.Context, crit Criteria) (*rpc. return nil, rpc.ErrNotificationsUnsupported } - // user must specify either a symmetric or a asymmetric key + // user must specify either a symmetric or an asymmetric key if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) { return nil, ErrSymAsym } @@ -534,7 +534,7 @@ func (api *PublicWhisperAPI) NewMessageFilter(req Criteria) (string, error) { err error ) - // user must specify either a symmetric or a asymmetric key + // user must specify either a symmetric or an asymmetric key if (symKeyGiven && asymKeyGiven) || (!symKeyGiven && !asymKeyGiven) { return "", ErrSymAsym } From 58f7f977e7998761a37ec5075ffa51faf36e5399 Mon Sep 17 00:00:00 2001 From: George Angel Date: Mon, 21 Aug 2017 11:26:42 +0100 Subject: [PATCH 100/272] Dockerfile: use alpine:3.6, clean up apk incovation (#15006) --- Dockerfile | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6bf13dc316..947f045e59 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,13 @@ -FROM alpine:3.5 +FROM alpine:3.6 ADD . /go-ethereum RUN \ - apk add --update git go make gcc musl-dev linux-headers && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /usr/local/bin/ && \ - apk del git go make gcc musl-dev linux-headers && \ - rm -rf /go-ethereum && rm -rf /var/cache/apk/* + apk add --no-cache git go make gcc musl-dev linux-headers && \ + (cd go-ethereum && make geth) && \ + cp go-ethereum/build/bin/geth /usr/local/bin/ && \ + apk del git go make gcc musl-dev linux-headers && \ + rm -rf /go-ethereum -EXPOSE 8545 -EXPOSE 30303 -EXPOSE 30303/udp +EXPOSE 8545 30303 30303/udp ENTRYPOINT ["geth"] From 3e14837c1c711f70a7d8373213f24b95e0bab3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 21 Aug 2017 13:45:50 +0300 Subject: [PATCH 101/272] vendor: update USB HID lib (fix macOS crash) --- vendor/github.com/karalabe/hid/README.md | 6 ++++++ vendor/github.com/karalabe/hid/appveyor.yml | 1 + vendor/github.com/karalabe/hid/hid.go | 2 +- vendor/github.com/karalabe/hid/hid_disabled.go | 2 +- vendor/github.com/karalabe/hid/hid_enabled.go | 14 +++++++++++++- vendor/vendor.json | 6 +++--- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/vendor/github.com/karalabe/hid/README.md b/vendor/github.com/karalabe/hid/README.md index 5c0213f3b2..2851ffe420 100644 --- a/vendor/github.com/karalabe/hid/README.md +++ b/vendor/github.com/karalabe/hid/README.md @@ -24,6 +24,12 @@ and go-gettable. Supported platforms at the moment are Linux, macOS and Windows (exclude constraints are also specified for Android and iOS to allow smoother vendoring into cross platform projects). +## Cross-compiling + +Using `go get` the embedded C library is compiled into the binary format of your host OS. Cross compiling to a different platform or architecture entails disabling CGO by default in Go, causing device enumeration `hid.Enumerate()` to yield no results. + +To cross compile a functional version of this library, you'll need to enable CGO during cross compilation via `CGO_ENABLED=1` and you'll need to install and set a cross compilation enabled C toolkit via `CC=your-cross-gcc`. + ## Acknowledgements Although the `hid` package is an implementation from scratch, it was heavily inspired by the existing diff --git a/vendor/github.com/karalabe/hid/appveyor.yml b/vendor/github.com/karalabe/hid/appveyor.yml index 34623ddb01..f43958747c 100644 --- a/vendor/github.com/karalabe/hid/appveyor.yml +++ b/vendor/github.com/karalabe/hid/appveyor.yml @@ -29,3 +29,4 @@ install: build_script: - go install ./... + - go test -v ./... diff --git a/vendor/github.com/karalabe/hid/hid.go b/vendor/github.com/karalabe/hid/hid.go index be75f949d8..60a40b8c24 100644 --- a/vendor/github.com/karalabe/hid/hid.go +++ b/vendor/github.com/karalabe/hid/hid.go @@ -2,7 +2,7 @@ // Copyright (c) 2017 Péter Szilágyi. All rights reserved. // // This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU GPL 2.1 or later. +// support depends on libusb, released under GNU LGPL 2.1 or later. // Package hid provides an interface for USB HID devices. package hid diff --git a/vendor/github.com/karalabe/hid/hid_disabled.go b/vendor/github.com/karalabe/hid/hid_disabled.go index d8ecc9d5a2..1f40263791 100644 --- a/vendor/github.com/karalabe/hid/hid_disabled.go +++ b/vendor/github.com/karalabe/hid/hid_disabled.go @@ -2,7 +2,7 @@ // Copyright (c) 2017 Péter Szilágyi. All rights reserved. // // This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU GPL 2.1 or later. +// support depends on libusb, released under GNU LGPL 2.1 or later. // +build !linux,!darwin,!windows ios !cgo diff --git a/vendor/github.com/karalabe/hid/hid_enabled.go b/vendor/github.com/karalabe/hid/hid_enabled.go index 3ceecce0d3..419273be6a 100644 --- a/vendor/github.com/karalabe/hid/hid_enabled.go +++ b/vendor/github.com/karalabe/hid/hid_enabled.go @@ -2,7 +2,7 @@ // Copyright (c) 2017 Péter Szilágyi. All rights reserved. // // This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU GPL 2.1 or later. +// support depends on libusb, released under LGNU GPL 2.1 or later. // +build linux,cgo darwin,!ios,cgo windows,cgo @@ -48,6 +48,15 @@ import ( "unsafe" ) +// enumerateLock is a mutex serializing access to USB device enumeration needed +// by the macOS USB HID system calls, which require 2 consecutive method calls +// for enumeration, causing crashes if called concurrently. +// +// For more details, see: +// https://developer.apple.com/documentation/iokit/1438371-iohidmanagersetdevicematching +// > "subsequent calls will cause the hid manager to release previously enumerated devices" +var enumerateLock sync.Mutex + func init() { // Initialize the HIDAPI library C.hid_init() @@ -66,6 +75,9 @@ func Supported() bool { // - If the product id is set to 0 then any product matches. // - If the vendor and product id are both 0, all HID devices are returned. func Enumerate(vendorID uint16, productID uint16) []DeviceInfo { + enumerateLock.Lock() + defer enumerateLock.Unlock() + // Gather all device infos and ensure they are freed before returning head := C.hid_enumerate(C.ushort(vendorID), C.ushort(productID)) if head == nil { diff --git a/vendor/vendor.json b/vendor/vendor.json index 8be10b94fb..9764a4783c 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -183,10 +183,10 @@ "revisionTime": "2016-06-03T03:41:37Z" }, { - "checksumSHA1": "sGdhjz2N/DpfiZrMnHSzl2H/YX8=", + "checksumSHA1": "UpjhOUZ1+0zNt+iIvdtECSHXmTs=", "path": "github.com/karalabe/hid", - "revision": "875879887cf0560a993b57e04615944e1dd02a73", - "revisionTime": "2017-02-27T10:57:12Z", + "revision": "f00545f9f3748e591590be3732d913c77525b10f", + "revisionTime": "2017-08-21T10:38:37Z", "tree": true }, { From b4b27ebaea3e1145926555b139a2910af855215e Mon Sep 17 00:00:00 2001 From: Bo Ye Date: Tue, 22 Aug 2017 18:35:09 +1200 Subject: [PATCH 102/272] metrics: change MetricsEnabledFlag to be const --- metrics/metrics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/metrics.go b/metrics/metrics.go index 9906bb8ad2..da2cdbc53c 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -29,7 +29,7 @@ import ( ) // MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. -var MetricsEnabledFlag = "metrics" +const MetricsEnabledFlag = "metrics" // Enabled is the flag specifying if metrics are enable or not. var Enabled = false From 2fd5ba6bd41380cf0e21d3ec0ca4bbc4aa7b6c34 Mon Sep 17 00:00:00 2001 From: Ti Zhou Date: Tue, 22 Aug 2017 17:43:36 +0800 Subject: [PATCH 103/272] core/vm: fix typo in method documentation (#15019) Signed-off-by: Ti Zhou --- core/vm/interpreter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 0466bf085c..d3e24a7a45 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -92,7 +92,7 @@ func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack if in.readOnly { // If the interpreter is operating in readonly mode, make sure no // state-modifying operation is performed. The 3rd stack item - // for a call operation is the value. Transfering value from one + // for a call operation is the value. Transferring value from one // account to the others means the state is modified and should also // return with an error. if operation.writes || (op == CALL && stack.Back(2).BitLen() > 0) { From 3cc476c8abd7cd00fa70464d023cb10f1f0b991d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 22 Aug 2017 14:03:14 +0300 Subject: [PATCH 104/272] tests: enable Byzantium state tests for CI --- tests/state_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/state_test.go b/tests/state_test.go index 7e5516e7e9..00067c61ac 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -50,8 +50,8 @@ func TestState(t *testing.T) { key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) name := name + "/" + key t.Run(key, func(t *testing.T) { - if subtest.Fork == "Constantinople" || subtest.Fork == "Byzantium" { - t.Skip("constantinople, byzantium not supported yet") + if subtest.Fork == "Constantinople" { + t.Skip("constantinople not supported yet") } withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { return st.checkFailure(t, name, test.Run(subtest, vmconfig)) From 28aea46ac08579f3ecd1c35620915b8e1bfcc8b0 Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Mon, 21 Aug 2017 08:47:15 +0800 Subject: [PATCH 105/272] core: implement Metropolis EIP 658, receipt status byte --- accounts/abi/bind/backends/simulated.go | 3 +- common/bytes.go | 3 ++ core/database_util_test.go | 4 +-- core/state_processor.go | 4 +-- core/state_transition.go | 19 +++++------ core/types/gen_receipt_json.go | 6 ++++ core/types/receipt.go | 44 ++++++++++++++++--------- core/vm/evm.go | 6 +++- core/vm/instructions.go | 2 +- eth/api.go | 5 +-- eth/backend_test.go | 4 +-- eth/filters/filter_test.go | 10 +++--- internal/ethapi/api.go | 3 +- les/odr_test.go | 4 +-- light/odr_test.go | 2 +- tests/state_test_util.go | 2 +- 16 files changed, 75 insertions(+), 46 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index e0ee06a0a1..88fb3331e8 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -253,7 +253,8 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM // about the transaction and calling mechanisms. vmenv := vm.NewEVM(evmContext, statedb, b.config, vm.Config{}) gaspool := new(core.GasPool).AddGas(math.MaxBig256) - ret, gasUsed, _, err := core.NewStateTransition(vmenv, msg, gaspool).TransitionDb() + // TODO utilize returned failed flag to help gas estimation. + ret, gasUsed, _, _, err := core.NewStateTransition(vmenv, msg, gaspool).TransitionDb() return ret, gasUsed, err } diff --git a/common/bytes.go b/common/bytes.go index c445968f22..66577bbfd0 100644 --- a/common/bytes.go +++ b/common/bytes.go @@ -47,6 +47,9 @@ func FromHex(s string) []byte { // // Returns an exact copy of the provided bytes func CopyBytes(b []byte) (copiedBytes []byte) { + if b == nil { + return nil + } copiedBytes = make([]byte, len(b)) copy(copiedBytes, b) diff --git a/core/database_util_test.go b/core/database_util_test.go index e9a6df97b7..5c75d53d0d 100644 --- a/core/database_util_test.go +++ b/core/database_util_test.go @@ -461,12 +461,12 @@ func TestMipmapChain(t *testing.T) { var receipts types.Receipts switch i { case 1: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{{Address: addr, Topics: []common.Hash{hash1}}} gen.AddUncheckedReceipt(receipt) receipts = types.Receipts{receipt} case 1000: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{{Address: addr2}} gen.AddUncheckedReceipt(receipt) receipts = types.Receipts{receipt} diff --git a/core/state_processor.go b/core/state_processor.go index 4489cfce25..a4b554b10a 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -98,7 +98,7 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common // about the transaction and calling mechanisms. vmenv := vm.NewEVM(context, statedb, config, cfg) // Apply the transaction to the current state (included in the env) - _, gas, err := ApplyMessage(vmenv, msg, gp) + _, gas, failed, err := ApplyMessage(vmenv, msg, gp) if err != nil { return nil, nil, err } @@ -114,7 +114,7 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common // Create a new receipt for the transaction, storing the intermediate root and gas used by the tx // based on the eip phase, we're passing wether the root touch-delete accounts. - receipt := types.NewReceipt(root, usedGas) + receipt := types.NewReceipt(root, failed, usedGas) receipt.TxHash = tx.Hash() receipt.GasUsed = new(big.Int).Set(gas) // if the transaction created a contract, store the creation address in the receipt. diff --git a/core/state_transition.go b/core/state_transition.go index 0ae9d7fcbf..bab4540be8 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -59,8 +59,7 @@ type StateTransition struct { value *big.Int data []byte state vm.StateDB - - evm *vm.EVM + evm *vm.EVM } // Message represents a message sent to a contract. @@ -127,11 +126,11 @@ func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition // the gas used (which includes gas refunds) and an error if it failed. An error always // indicates a core error meaning that the message would always fail for that particular // state and would never be accepted within a block. -func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, *big.Int, error) { +func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, *big.Int, bool, error) { st := NewStateTransition(evm, msg, gp) - ret, _, gasUsed, err := st.TransitionDb() - return ret, gasUsed, err + ret, _, gasUsed, failed, err := st.TransitionDb() + return ret, gasUsed, failed, err } func (st *StateTransition) from() vm.AccountRef { @@ -208,7 +207,7 @@ func (st *StateTransition) preCheck() error { // TransitionDb will transition the state by applying the current message and returning the result // including the required gas for the operation as well as the used gas. It returns an error if it // failed. An error indicates a consensus issue. -func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big.Int, err error) { +func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big.Int, failed bool, err error) { if err = st.preCheck(); err != nil { return } @@ -222,10 +221,10 @@ func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big // TODO convert to uint64 intrinsicGas := IntrinsicGas(st.data, contractCreation, homestead) if intrinsicGas.BitLen() > 64 { - return nil, nil, nil, vm.ErrOutOfGas + return nil, nil, nil, false, vm.ErrOutOfGas } if err = st.useGas(intrinsicGas.Uint64()); err != nil { - return nil, nil, nil, err + return nil, nil, nil, false, err } var ( @@ -248,7 +247,7 @@ func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big // sufficient balance to make the transfer happen. The first // balance transfer may never fail. if vmerr == vm.ErrInsufficientBalance { - return nil, nil, nil, vmerr + return nil, nil, nil, false, vmerr } } requiredGas = new(big.Int).Set(st.gasUsed()) @@ -256,7 +255,7 @@ func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big st.refundGas() st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(st.gasUsed(), st.gasPrice)) - return ret, requiredGas, st.gasUsed(), err + return ret, requiredGas, st.gasUsed(), vmerr != nil, err } func (st *StateTransition) refundGas() { diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index eb2e5d42b4..1e6880c223 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -14,6 +14,7 @@ import ( func (r Receipt) MarshalJSON() ([]byte, error) { type Receipt struct { PostState hexutil.Bytes `json:"root"` + Failed bool `json:"failed"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -23,6 +24,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { } var enc Receipt enc.PostState = r.PostState + enc.Failed = r.Failed enc.CumulativeGasUsed = (*hexutil.Big)(r.CumulativeGasUsed) enc.Bloom = r.Bloom enc.Logs = r.Logs @@ -35,6 +37,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { func (r *Receipt) UnmarshalJSON(input []byte) error { type Receipt struct { PostState hexutil.Bytes `json:"root"` + Failed *bool `json:"failed"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom *Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -49,6 +52,9 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { if dec.PostState != nil { r.PostState = dec.PostState } + if dec.Failed != nil { + r.Failed = *dec.Failed + } if dec.CumulativeGasUsed == nil { return errors.New("missing required field 'cumulativeGasUsed' for Receipt") } diff --git a/core/types/receipt.go b/core/types/receipt.go index c9906b0154..9c49648b43 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -28,10 +28,16 @@ import ( //go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go +const ( + receiptStatusSuccessful = byte(0x01) + receiptStatusFailed = byte(0x00) +) + // Receipt represents the results of a transaction. type Receipt struct { // Consensus fields PostState []byte `json:"root"` + Failed bool `json:"failed"` CumulativeGasUsed *big.Int `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -60,21 +66,26 @@ type homesteadReceiptRLP struct { // metropolisReceiptRLP contains the receipt's Metropolis consensus fields, used // during RLP serialization. type metropolisReceiptRLP struct { + Status byte CumulativeGasUsed *big.Int Bloom Bloom Logs []*Log } // NewReceipt creates a barebone transaction receipt, copying the init fields. -func NewReceipt(root []byte, cumulativeGasUsed *big.Int) *Receipt { - return &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: new(big.Int).Set(cumulativeGasUsed)} +func NewReceipt(root []byte, failed bool, cumulativeGasUsed *big.Int) *Receipt { + return &Receipt{PostState: common.CopyBytes(root), Failed: failed, CumulativeGasUsed: new(big.Int).Set(cumulativeGasUsed)} } // EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt // into an RLP stream. If no post state is present, metropolis fork is assumed. func (r *Receipt) EncodeRLP(w io.Writer) error { if r.PostState == nil { - return rlp.Encode(w, &metropolisReceiptRLP{r.CumulativeGasUsed, r.Bloom, r.Logs}) + status := receiptStatusSuccessful + if r.Failed { + status = receiptStatusFailed + } + return rlp.Encode(w, &metropolisReceiptRLP{status, r.CumulativeGasUsed, r.Bloom, r.Logs}) } return rlp.Encode(w, &homesteadReceiptRLP{r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs}) } @@ -87,29 +98,31 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { if err != nil { return err } - list, _, err := rlp.SplitList(raw) + content, _, err := rlp.SplitList(raw) if err != nil { return err } - items, err := rlp.CountValues(list) + kind, cnt, _, err := rlp.Split(content) if err != nil { return err } - // Deserialize based on the number of content items - switch items { - case 3: - // Metropolis receipts have 3 components + // Deserialize based on the first component type. + switch { + case kind == rlp.Byte || kind == rlp.String && len(cnt) == 0: + // The first component of metropolis receipts is Byte + // or empty String(byte with 0x00 value). var metro metropolisReceiptRLP if err := rlp.DecodeBytes(raw, &metro); err != nil { return err } + r.Failed = metro.Status == receiptStatusFailed r.CumulativeGasUsed = metro.CumulativeGasUsed r.Bloom = metro.Bloom r.Logs = metro.Logs return nil - case 4: - // Homestead receipts have 4 components + case kind == rlp.String: + // The first component of homestead receipts is non-empty String. var home homesteadReceiptRLP if err := rlp.DecodeBytes(raw, &home); err != nil { return err @@ -121,14 +134,14 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { return nil default: - return fmt.Errorf("invalid receipt components: %v", items) + return fmt.Errorf("invalid first receipt component: %v", kind) } } // String implements the Stringer interface. func (r *Receipt) String() string { if r.PostState == nil { - return fmt.Sprintf("receipt{cgas=%v bloom=%x logs=%v}", r.CumulativeGasUsed, r.Bloom, r.Logs) + return fmt.Sprintf("receipt{failed=%t cgas=%v bloom=%x logs=%v}", r.Failed, r.CumulativeGasUsed, r.Bloom, r.Logs) } return fmt.Sprintf("receipt{med=%x cgas=%v bloom=%x logs=%v}", r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs) } @@ -144,7 +157,7 @@ func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { for i, log := range r.Logs { logs[i] = (*LogForStorage)(log) } - return rlp.Encode(w, []interface{}{r.PostState, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, logs, r.GasUsed}) + return rlp.Encode(w, []interface{}{r.PostState, r.Failed, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, logs, r.GasUsed}) } // DecodeRLP implements rlp.Decoder, and loads both consensus and implementation @@ -152,6 +165,7 @@ func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { var receipt struct { PostState []byte + Failed bool CumulativeGasUsed *big.Int Bloom Bloom TxHash common.Hash @@ -163,7 +177,7 @@ func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { return err } // Assign the consensus fields - r.PostState, r.CumulativeGasUsed, r.Bloom = receipt.PostState, receipt.CumulativeGasUsed, receipt.Bloom + r.PostState, r.Failed, r.CumulativeGasUsed, r.Bloom = receipt.PostState, receipt.Failed, receipt.CumulativeGasUsed, receipt.Bloom r.Logs = make([]*Log, len(receipt.Logs)) for i, log := range receipt.Logs { r.Logs[i] = (*Log)(log) diff --git a/core/vm/evm.go b/core/vm/evm.go index 8d654c666e..34933a1dc4 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -158,7 +158,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value) // initialise a new contract and set the code that is to be used by the - // E The contract is a scoped evmironment for this execution context + // E The contract is a scoped environment for this execution context // only. contract := NewContract(caller, to, value, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) @@ -351,6 +351,10 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I contract.UseGas(contract.Gas) } } + // Assign err if contract code size exceeds the max while the err is still empty. + if maxCodeSizeExceeded && err == nil { + err = errMaxCodeSizeExceeded + } return ret, contractAddr, contract.Gas, err } diff --git a/core/vm/instructions.go b/core/vm/instructions.go index ece4d2229a..b6d6e22c4c 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -33,6 +33,7 @@ var ( errWriteProtection = errors.New("evm: write protection") errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") errExecutionReverted = errors.New("evm: execution reverted") + errMaxCodeSizeExceeded = errors.New("evm: max code size exceeded") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -619,7 +620,6 @@ func opCall(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Sta if value.Sign() != 0 { gas += params.CallStipend } - ret, returnGas, err := evm.Call(contract, address, args, gas, value) if err != nil { stack.push(new(big.Int)) diff --git a/eth/api.go b/eth/api.go index f5214fc379..9904c6f536 100644 --- a/eth/api.go +++ b/eth/api.go @@ -523,7 +523,8 @@ func (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, txHash common. // Run the transaction with tracing enabled. vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{Debug: true, Tracer: tracer}) - ret, gas, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())) + // TODO utilize failed flag + ret, gas, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())) if err != nil { return nil, fmt.Errorf("tracing failed: %v", err) } @@ -570,7 +571,7 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int) (co vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{}) gp := new(core.GasPool).AddGas(tx.Gas()) - _, _, err := core.ApplyMessage(vmenv, msg, gp) + _, _, _, err := core.ApplyMessage(vmenv, msg, gp) if err != nil { return nil, vm.Context{}, nil, fmt.Errorf("tx %x failed: %v", tx.Hash(), err) } diff --git a/eth/backend_test.go b/eth/backend_test.go index 4351b24cfb..1fd25e95aa 100644 --- a/eth/backend_test.go +++ b/eth/backend_test.go @@ -35,11 +35,11 @@ func TestMipmapUpgrade(t *testing.T) { chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) { switch i { case 1: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{{Address: addr}} gen.AddUncheckedReceipt(receipt) case 2: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{{Address: addr}} gen.AddUncheckedReceipt(receipt) } diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index 3244c04d74..cf508a218d 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -33,7 +33,7 @@ import ( ) func makeReceipt(addr common.Address) *types.Receipt { - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ {Address: addr}, } @@ -145,7 +145,7 @@ func TestFilters(t *testing.T) { var receipts types.Receipts switch i { case 1: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ { Address: addr, @@ -155,7 +155,7 @@ func TestFilters(t *testing.T) { gen.AddUncheckedReceipt(receipt) receipts = types.Receipts{receipt} case 2: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ { Address: addr, @@ -165,7 +165,7 @@ func TestFilters(t *testing.T) { gen.AddUncheckedReceipt(receipt) receipts = types.Receipts{receipt} case 998: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ { Address: addr, @@ -175,7 +175,7 @@ func TestFilters(t *testing.T) { gen.AddUncheckedReceipt(receipt) receipts = types.Receipts{receipt} case 999: - receipt := types.NewReceipt(nil, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ { Address: addr, diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index c3924b93a7..30710aaabd 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -635,7 +635,8 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr // Setup the gas pool (also for unmetered requests) // and apply the message. gp := new(core.GasPool).AddGas(math.MaxBig256) - res, gas, err := core.ApplyMessage(evm, msg, gp) + // TODO utilize failed flag to help gas estimation + res, gas, _, err := core.ApplyMessage(evm, msg, gp) if err := vmError(); err != nil { return nil, common.Big0, err } diff --git a/les/odr_test.go b/les/odr_test.go index 3a0fd6738f..f56c4036d4 100644 --- a/les/odr_test.go +++ b/les/odr_test.go @@ -127,7 +127,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai //vmenv := core.NewEnv(statedb, config, bc, msg, header, vm.Config{}) gp := new(core.GasPool).AddGas(math.MaxBig256) - ret, _, _ := core.ApplyMessage(vmenv, msg, gp) + ret, _, _, _ := core.ApplyMessage(vmenv, msg, gp) res = append(res, ret...) } } else { @@ -138,7 +138,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai context := core.NewEVMContext(msg, header, lc, nil) vmenv := vm.NewEVM(context, state, config, vm.Config{}) gp := new(core.GasPool).AddGas(math.MaxBig256) - ret, _, _ := core.ApplyMessage(vmenv, msg, gp) + ret, _, _, _ := core.ApplyMessage(vmenv, msg, gp) if state.Error() == nil { res = append(res, ret...) } diff --git a/light/odr_test.go b/light/odr_test.go index bd1e976e81..c0c5438fdb 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -180,7 +180,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, bc *core.BlockChain context := core.NewEVMContext(msg, header, chain, nil) vmenv := vm.NewEVM(context, st, config, vm.Config{}) gp := new(core.GasPool).AddGas(math.MaxBig256) - ret, _, _ := core.ApplyMessage(vmenv, msg, gp) + ret, _, _, _ := core.ApplyMessage(vmenv, msg, gp) res = append(res, ret...) if st.Error() != nil { return res, st.Error() diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 2bf940bab7..0eb85ab28e 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -156,7 +156,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) error { gaspool := new(core.GasPool) gaspool.AddGas(block.GasLimit()) snapshot := statedb.Snapshot() - if _, _, err := core.ApplyMessage(evm, msg, gaspool); err != nil { + if _, _, _, err := core.ApplyMessage(evm, msg, gaspool); err != nil { statedb.RevertToSnapshot(snapshot) } if post.Logs != nil { From 79bf69b55687704429e083c22fb62ba931648e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 22 Aug 2017 18:30:46 +0300 Subject: [PATCH 106/272] tests: pull in new test suite, enable most block tests --- tests/block_test.go | 7 ++++--- tests/testdata | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/block_test.go b/tests/block_test.go index 6fc66b17cc..066f280349 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -33,10 +33,11 @@ func TestBlockchain(t *testing.T) { // Constantinople is not implemented yet. bt.skipLoad(`(?i)(constantinople)`) // Expected failures: - bt.fails("^TransitionTests/bcEIP158ToByzantium", "byzantium not supported") bt.fails(`^TransitionTests/bcHomesteadToDao/DaoTransactions(|_UncleExtradata|_EmptyTransactionAndForkBlocksAhead)\.json`, "issue in test") - bt.fails(`^bc(Exploit|Fork|Gas|Multi|Total|State|Random|Uncle|Valid|Wallet).*_Byzantium$`, "byzantium not supported") - bt.fails(`^bcBlockGasLimitTest/(BlockGasLimit2p63m1|TransactionGasHigherThanLimit2p63m1|SuicideTransaction|GasUsedHigherThanBlockGasLimitButNotWithRefundsSuicideFirst|TransactionGasHigherThanLimit2p63m1_2).*_Byzantium$`, "byzantium not supported") + + // Still failing tests + bt.skipLoad(`^bcWalletTest.*_Byzantium$`) + bt.skipLoad(`^bcStateTests/suicideCoinbase.json.*_Byzantium$`) bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { if err := bt.checkFailure(t, name, test.Run()); err != nil { diff --git a/tests/testdata b/tests/testdata index 85f6d7cc01..70e5862eb2 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 85f6d7cc01b6bd04e071f5ba579fc675cfd2043b +Subproject commit 70e5862eb267226ca89fb9f395c97be1fdf6923a From 4ee92f2d193225e70c190194d005a6ce80e70236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 23 Aug 2017 10:41:12 +0300 Subject: [PATCH 107/272] core/types: reject Metro receipts with > 0x01 status bytes --- core/types/receipt.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/types/receipt.go b/core/types/receipt.go index 9c49648b43..b54bd7b4f9 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -108,14 +108,21 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { } // Deserialize based on the first component type. switch { - case kind == rlp.Byte || kind == rlp.String && len(cnt) == 0: - // The first component of metropolis receipts is Byte - // or empty String(byte with 0x00 value). + case kind == rlp.Byte || (kind == rlp.String && len(cnt) == 0): + // The first component of metropolis receipts is Byte (0x01), or the empty + // string (0x80, decoded as a byte with 0x00 value). var metro metropolisReceiptRLP if err := rlp.DecodeBytes(raw, &metro); err != nil { return err } - r.Failed = metro.Status == receiptStatusFailed + switch metro.Status { + case receiptStatusSuccessful: + r.Failed = false + case receiptStatusFailed: + r.Failed = true + default: + return fmt.Errorf("invalid status byte: 0x%x", metro.Status) + } r.CumulativeGasUsed = metro.CumulativeGasUsed r.Bloom = metro.Bloom r.Logs = metro.Logs From 286ec5df40d3707a7a2c98d49c8d324372ed29c2 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Wed, 23 Aug 2017 13:37:18 +0200 Subject: [PATCH 108/272] cmd/evm, core/vm, internal/ethapi: Show error when exiting (#14985) * cmd/evm, core/vm, internal/ethapi: Add 'err' to tracer interface CaptureEnd * cmd/evm: fix nullpointer when there is no error --- cmd/evm/json_logger.go | 8 ++++++-- cmd/evm/runner.go | 8 ++++---- core/vm/logger.go | 7 +++++-- internal/ethapi/tracer.go | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/cmd/evm/json_logger.go b/cmd/evm/json_logger.go index d61981062c..2cfeaa7952 100644 --- a/cmd/evm/json_logger.go +++ b/cmd/evm/json_logger.go @@ -57,11 +57,15 @@ func (l *JSONLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cos } // CaptureEnd is triggered at end of execution. -func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration) error { +func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { type endLog struct { Output string `json:"output"` GasUsed math.HexOrDecimal64 `json:"gasUsed"` Time time.Duration `json:"time"` + Err string `json:"error,omitempty"` } - return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t}) + if err != nil { + return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) + } + return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) } diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index ae56781103..96de0c76ac 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -234,13 +234,13 @@ Gas used: %d `, execTime, mem.HeapObjects, mem.Alloc, mem.TotalAlloc, mem.NumGC, initialGas-leftOverGas) } if tracer != nil { - tracer.CaptureEnd(ret, initialGas-leftOverGas, execTime) + tracer.CaptureEnd(ret, initialGas-leftOverGas, execTime, err) } else { fmt.Printf("0x%x\n", ret) + if err != nil { + fmt.Printf(" error: %v\n", err) + } } - if err != nil { - fmt.Printf(" error: %v\n", err) - } return nil } diff --git a/core/vm/logger.go b/core/vm/logger.go index b73b13bd97..5ada310f0a 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -86,7 +86,7 @@ func (s *StructLog) OpName() string { // if you need to retain them beyond the current call. type Tracer interface { CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error - CaptureEnd(output []byte, gasUsed uint64, t time.Duration) error + CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error } // StructLogger is an EVM state logger and implements Tracer. @@ -183,8 +183,11 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui return nil } -func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration) error { +func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { fmt.Printf("0x%x", output) + if err != nil { + fmt.Printf(" error: %v\n", err) + } return nil } diff --git a/internal/ethapi/tracer.go b/internal/ethapi/tracer.go index fc66839ea5..0516265270 100644 --- a/internal/ethapi/tracer.go +++ b/internal/ethapi/tracer.go @@ -346,7 +346,7 @@ func (jst *JavascriptTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, } // CaptureEnd is called after the call finishes -func (jst *JavascriptTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration) error { +func (jst *JavascriptTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { //TODO! @Arachnid please figure out of there's anything we can use this method for return nil } From 63246e25426df51143d5fb06861d418753267ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 24 Aug 2017 13:10:50 +0300 Subject: [PATCH 109/272] rlp: fix decoding long strings into RawValue types --- rlp/decode.go | 2 +- rlp/decode_test.go | 33 ++++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/rlp/decode.go b/rlp/decode.go index 78ccf6275e..60d9dab2b5 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -693,7 +693,7 @@ func (s *Stream) Raw() ([]byte, error) { return nil, err } if kind == String { - puthead(buf, 0x80, 0xB8, size) + puthead(buf, 0x80, 0xB7, size) } else { puthead(buf, 0xC0, 0xF7, size) } diff --git a/rlp/decode_test.go b/rlp/decode_test.go index d762e195d0..4d8abd0012 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -256,16 +256,31 @@ func TestStreamList(t *testing.T) { } func TestStreamRaw(t *testing.T) { - s := NewStream(bytes.NewReader(unhex("C58401010101")), 0) - s.List() - - want := unhex("8401010101") - raw, err := s.Raw() - if err != nil { - t.Fatal(err) + tests := []struct { + input string + output string + }{ + { + "C58401010101", + "8401010101", + }, + { + "F842B84001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", + "B84001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", + }, } - if !bytes.Equal(want, raw) { - t.Errorf("raw mismatch: got %x, want %x", raw, want) + for i, tt := range tests { + s := NewStream(bytes.NewReader(unhex(tt.input)), 0) + s.List() + + want := unhex(tt.output) + raw, err := s.Raw() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(want, raw) { + t.Errorf("test %d: raw mismatch: got %x, want %x", i, raw, want) + } } } From ff9a8682323648266d5c73f4f4bce545d91edccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 24 Aug 2017 13:42:00 +0300 Subject: [PATCH 110/272] core/state: revert metro suicide map addition (#15024) --- core/state/journal.go | 5 --- core/state/statedb.go | 69 ++++++++++++++++------------------------- core/state_processor.go | 2 +- tests/block_test.go | 1 - 4 files changed, 28 insertions(+), 49 deletions(-) diff --git a/core/state/journal.go b/core/state/journal.go index b5c8ca9a21..ddb76f1a2e 100644 --- a/core/state/journal.go +++ b/core/state/journal.go @@ -91,11 +91,6 @@ func (ch suicideChange) undo(s *StateDB) { if obj != nil { obj.suicided = ch.prev obj.setBalance(ch.prevbalance) - // if the object wasn't suicided before, remove - // it from the list of destructed objects as well. - if !obj.suicided { - delete(s.stateObjectsDestructed, *ch.account) - } } } diff --git a/core/state/statedb.go b/core/state/statedb.go index 694374f822..002fa62496 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -46,9 +46,8 @@ type StateDB struct { trie Trie // This map holds 'live' objects, which will get modified while processing a state transition. - stateObjects map[common.Address]*stateObject - stateObjectsDirty map[common.Address]struct{} - stateObjectsDestructed map[common.Address]struct{} + stateObjects map[common.Address]*stateObject + stateObjectsDirty map[common.Address]struct{} // DB error. // State objects are used by the consensus core and VM which are @@ -83,14 +82,13 @@ func New(root common.Hash, db Database) (*StateDB, error) { return nil, err } return &StateDB{ - db: db, - trie: tr, - stateObjects: make(map[common.Address]*stateObject), - stateObjectsDirty: make(map[common.Address]struct{}), - stateObjectsDestructed: make(map[common.Address]struct{}), - refund: new(big.Int), - logs: make(map[common.Hash][]*types.Log), - preimages: make(map[common.Hash][]byte), + db: db, + trie: tr, + stateObjects: make(map[common.Address]*stateObject), + stateObjectsDirty: make(map[common.Address]struct{}), + refund: new(big.Int), + logs: make(map[common.Hash][]*types.Log), + preimages: make(map[common.Hash][]byte), }, nil } @@ -115,7 +113,6 @@ func (self *StateDB) Reset(root common.Hash) error { self.trie = tr self.stateObjects = make(map[common.Address]*stateObject) self.stateObjectsDirty = make(map[common.Address]struct{}) - self.stateObjectsDestructed = make(map[common.Address]struct{}) self.thash = common.Hash{} self.bhash = common.Hash{} self.txIndex = 0 @@ -323,7 +320,6 @@ func (self *StateDB) Suicide(addr common.Address) bool { }) stateObject.markSuicided() stateObject.data.Balance = new(big.Int) - self.stateObjectsDestructed[addr] = struct{}{} return true } @@ -456,23 +452,19 @@ func (self *StateDB) Copy() *StateDB { // Copy all the basic fields, initialize the memory ones state := &StateDB{ - db: self.db, - trie: self.trie, - stateObjects: make(map[common.Address]*stateObject, len(self.stateObjectsDirty)), - stateObjectsDirty: make(map[common.Address]struct{}, len(self.stateObjectsDirty)), - stateObjectsDestructed: make(map[common.Address]struct{}, len(self.stateObjectsDestructed)), - refund: new(big.Int).Set(self.refund), - logs: make(map[common.Hash][]*types.Log, len(self.logs)), - logSize: self.logSize, - preimages: make(map[common.Hash][]byte), + db: self.db, + trie: self.trie, + stateObjects: make(map[common.Address]*stateObject, len(self.stateObjectsDirty)), + stateObjectsDirty: make(map[common.Address]struct{}, len(self.stateObjectsDirty)), + refund: new(big.Int).Set(self.refund), + logs: make(map[common.Hash][]*types.Log, len(self.logs)), + logSize: self.logSize, + preimages: make(map[common.Hash][]byte), } // Copy the dirty states, logs, and preimages for addr := range self.stateObjectsDirty { state.stateObjects[addr] = self.stateObjects[addr].deepCopy(state, state.MarkStateObjectDirty) state.stateObjectsDirty[addr] = struct{}{} - if self.stateObjects[addr].suicided { - state.stateObjectsDestructed[addr] = struct{}{} - } } for hash, logs := range self.logs { state.logs[hash] = make([]*types.Log, len(logs)) @@ -520,10 +512,9 @@ func (self *StateDB) GetRefund() *big.Int { return self.refund } -// IntermediateRoot computes the current root hash of the state trie. -// It is called in between transactions to get the root hash that -// goes into transaction receipts. -func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { +// Finalise finalises the state by removing the self destructed objects +// and clears the journal as well as the refunds. +func (s *StateDB) Finalise(deleteEmptyObjects bool) { for addr := range s.stateObjectsDirty { stateObject := s.stateObjects[addr] if stateObject.suicided || (deleteEmptyObjects && stateObject.empty()) { @@ -535,6 +526,13 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { } // Invalidate journal because reverting across transactions is not allowed. s.clearJournalAndRefund() +} + +// IntermediateRoot computes the current root hash of the state trie. +// It is called in between transactions to get the root hash that +// goes into transaction receipts. +func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { + s.Finalise(deleteEmptyObjects) return s.trie.Hash() } @@ -546,19 +544,6 @@ func (self *StateDB) Prepare(thash, bhash common.Hash, ti int) { self.txIndex = ti } -// Finalise finalises the state by removing the self destructed objects -// in the current stateObjectsDestructed buffer and clears the journal -// as well as the refunds. -// -// Please note that Finalise is used by EIP#98 and is used instead of -// IntermediateRoot. -func (s *StateDB) Finalise() { - for addr := range s.stateObjectsDestructed { - s.deleteStateObject(s.stateObjects[addr]) - } - s.clearJournalAndRefund() -} - // DeleteSuicides flags the suicided objects for deletion so that it // won't be referenced again when called / queried up on. // diff --git a/core/state_processor.go b/core/state_processor.go index a4b554b10a..4115eab8cb 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -106,7 +106,7 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common // Update the state with pending changes var root []byte if config.IsMetropolis(header.Number) { - statedb.Finalise() + statedb.Finalise(true) } else { root = statedb.IntermediateRoot(config.IsEIP158(header.Number)).Bytes() } diff --git a/tests/block_test.go b/tests/block_test.go index 066f280349..56e1e1e8da 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -37,7 +37,6 @@ func TestBlockchain(t *testing.T) { // Still failing tests bt.skipLoad(`^bcWalletTest.*_Byzantium$`) - bt.skipLoad(`^bcStateTests/suicideCoinbase.json.*_Byzantium$`) bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { if err := bt.checkFailure(t, name, test.Run()); err != nil { From 68955ed2eb12165416411dc30b1ac4d74aa49307 Mon Sep 17 00:00:00 2001 From: nkbai Date: Thu, 24 Aug 2017 18:48:13 +0800 Subject: [PATCH 111/272] core/types: fix create indicator in Transaction.String (#15025) --- core/types/transaction.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/types/transaction.go b/core/types/transaction.go index 8e108b2a33..947fc85d60 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -300,7 +300,7 @@ func (tx *Transaction) String() string { Hex: %x `, tx.Hash(), - len(tx.data.Recipient) == 0, + tx.data.Recipient == nil, from, to, tx.data.AccountNonce, From 54b1de67e2cbe700a4086d33b10501578dbeaaaf Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 24 Aug 2017 13:09:53 +0200 Subject: [PATCH 112/272] core/vm: make jumpdest code nicer --- core/vm/analysis.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/vm/analysis.go b/core/vm/analysis.go index 3ff8626956..08415fc1ef 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -42,7 +42,6 @@ func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool d[codehash] = m } return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) - // return (m[udest/8] & (1 << (udest % 8))) != 0 } // bitvec is a bit vector which maps bytes in a program @@ -68,8 +67,7 @@ func jumpdests(code []byte) []byte { //The map is 4 bytes longer than necessary, in case the code // ends with a PUSH32, the algorithm will push zeroes onto the // bitvector outside the bounds of the actual code. - m := make([]byte, len(code)/8+1+4) - bits := bitvec(m) + bits := make(bitvec, len(code)/8+1+4) for pc := uint64(0); pc < uint64(len(code)); { op := OpCode(code[pc]) From b872961ec82ec88a7ac6ef331cfb3eb685ce2c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 24 Aug 2017 12:26:06 +0300 Subject: [PATCH 113/272] consensus, core, tests: implement Metropolis EIP 649 --- consensus/ethash/consensus.go | 25 +++++++++++--- core/chain_makers.go | 2 +- core/vm/logger.go | 8 ++--- tests/gen_stlog.go | 61 ----------------------------------- tests/state_test_util.go | 56 ++++++-------------------------- tests/testdata | 2 +- tests/vm_test.go | 4 +++ tests/vm_test_util.go | 21 ++++++------ 8 files changed, 50 insertions(+), 129 deletions(-) delete mode 100644 tests/gen_stlog.go diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index 01d97a470e..b714204458 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -36,8 +36,9 @@ import ( // Ethash proof-of-work protocol constants. var ( - blockReward *big.Int = big.NewInt(5e+18) // Block reward in wei for successfully mining a block - maxUncles = 2 // Maximum number of uncles allowed in a single block + frontierBlockReward *big.Int = big.NewInt(5e+18) // Block reward in wei for successfully mining a block + metropolisBlockReward *big.Int = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Metropolis + maxUncles = 2 // Maximum number of uncles allowed in a single block ) // Various error messages to mark blocks invalid. These should be private to @@ -306,6 +307,7 @@ var ( big9 = big.NewInt(9) big10 = big.NewInt(10) bigMinus99 = big.NewInt(-99) + big2999999 = big.NewInt(2999999) ) // calcDifficultyMetropolis is the difficulty adjustment algorithm. It returns @@ -346,8 +348,15 @@ func calcDifficultyMetropolis(time uint64, parent *types.Header) *big.Int { if x.Cmp(params.MinimumDifficulty) < 0 { x.Set(params.MinimumDifficulty) } + // calculate a fake block numer for the ice-age delay: + // https://github.com/ethereum/EIPs/pull/669 + // fake_block_number = min(0, block.number - 3_000_000 + fakeBlockNumber := new(big.Int) + if parent.Number.Cmp(big2999999) >= 0 { + fakeBlockNumber = fakeBlockNumber.Sub(parent.Number, big2999999) // Note, parent is 1 less than the actual block number + } // for the exponential factor - periodCount := new(big.Int).Add(parent.Number, big1) + periodCount := fakeBlockNumber periodCount.Div(periodCount, expDiffPeriod) // the exponential factor, commonly referred to as "the bomb" @@ -501,7 +510,7 @@ func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) // setting the final state and assembling the block. func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // Accumulate any block and uncle rewards and commit the final state root - AccumulateRewards(state, header, uncles) + AccumulateRewards(chain.Config(), state, header, uncles) header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) // Header seems complete, assemble into a block and return @@ -518,7 +527,13 @@ var ( // reward. The total reward consists of the static block reward and rewards for // included uncles. The coinbase of each uncle block is also rewarded. // TODO (karalabe): Move the chain maker into this package and make this private! -func AccumulateRewards(state *state.StateDB, header *types.Header, uncles []*types.Header) { +func AccumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) { + // Select the correct block reward based on chain progression + blockReward := frontierBlockReward + if config.IsMetropolis(header.Number) { + blockReward = metropolisBlockReward + } + // Accumulate the rewards for the miner and any included uncles reward := new(big.Int).Set(blockReward) r := new(big.Int) for _, uncle := range uncles { diff --git a/core/chain_makers.go b/core/chain_makers.go index cb5825d187..dd3e2fb192 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -179,7 +179,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, db ethdb.Dat if gen != nil { gen(i, b) } - ethash.AccumulateRewards(statedb, h, b.uncles) + ethash.AccumulateRewards(config, statedb, h, b.uncles) root, err := statedb.CommitTo(db, config.IsEIP158(h.Number)) if err != nil { panic(fmt.Sprintf("state write error: %v", err)) diff --git a/core/vm/logger.go b/core/vm/logger.go index 5ada310f0a..623c0d5632 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -128,18 +128,14 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui } // capture SSTORE opcodes and determine the changed value and store - // it in the local storage container. NOTE: we do not need to do any - // range checks here because that's already handler prior to calling - // this function. - switch op { - case SSTORE: + // it in the local storage container. + if op == SSTORE && stack.len() >= 2 { var ( value = common.BigToHash(stack.data[stack.len()-2]) address = common.BigToHash(stack.data[stack.len()-1]) ) l.changedValues[contract.Address()][address] = value } - // copy a snapstot of the current memory state to a new buffer var mem []byte if !l.cfg.DisableMemory { diff --git a/tests/gen_stlog.go b/tests/gen_stlog.go deleted file mode 100644 index 4f7ebc9660..0000000000 --- a/tests/gen_stlog.go +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" -) - -var _ = (*stLogMarshaling)(nil) - -func (s stLog) MarshalJSON() ([]byte, error) { - type stLog struct { - Address common.UnprefixedAddress `json:"address"` - Data hexutil.Bytes `json:"data"` - Topics []common.UnprefixedHash `json:"topics"` - Bloom string `json:"bloom"` - } - var enc stLog - enc.Address = common.UnprefixedAddress(s.Address) - enc.Data = s.Data - if s.Topics != nil { - enc.Topics = make([]common.UnprefixedHash, len(s.Topics)) - for k, v := range s.Topics { - enc.Topics[k] = common.UnprefixedHash(v) - } - } - enc.Bloom = s.Bloom - return json.Marshal(&enc) -} - -func (s *stLog) UnmarshalJSON(input []byte) error { - type stLog struct { - Address *common.UnprefixedAddress `json:"address"` - Data hexutil.Bytes `json:"data"` - Topics []common.UnprefixedHash `json:"topics"` - Bloom *string `json:"bloom"` - } - var dec stLog - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Address != nil { - s.Address = common.Address(*dec.Address) - } - if dec.Data != nil { - s.Data = dec.Data - } - if dec.Topics != nil { - s.Topics = make([]common.Hash, len(dec.Topics)) - for k, v := range dec.Topics { - s.Topics[k] = common.Hash(v) - } - } - if dec.Bloom != nil { - s.Bloom = *dec.Bloom - } - return nil -} diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 0eb85ab28e..ecaa6c6684 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -17,12 +17,10 @@ package tests import ( - "bytes" "encoding/hex" "encoding/json" "fmt" "math/big" - "reflect" "strings" "github.com/ethereum/go-ethereum/common" @@ -33,8 +31,10 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // StateTest checks transaction processing without block context. @@ -63,7 +63,7 @@ type stJSON struct { type stPostState struct { Root common.UnprefixedHash `json:"hash"` - Logs *[]stLog `json:"logs"` + Logs common.UnprefixedHash `json:"logs"` Indexes struct { Data int `json:"data"` Gas int `json:"gas"` @@ -108,21 +108,6 @@ type stTransactionMarshaling struct { PrivateKey hexutil.Bytes } -//go:generate gencodec -type stLog -field-override stLogMarshaling -out gen_stlog.go - -type stLog struct { - Address common.Address `json:"address"` - Data []byte `json:"data"` - Topics []common.Hash `json:"topics"` - Bloom string `json:"bloom"` -} - -type stLogMarshaling struct { - Address common.UnprefixedAddress - Data hexutil.Bytes - Topics []common.UnprefixedHash -} - // Subtests returns all valid subtests of the test. func (t *StateTest) Subtests() []StateSubtest { var sub []StateSubtest @@ -159,10 +144,8 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) error { if _, _, _, err := core.ApplyMessage(evm, msg, gaspool); err != nil { statedb.RevertToSnapshot(snapshot) } - if post.Logs != nil { - if err := checkLogs(statedb.Logs(), *post.Logs); err != nil { - return err - } + if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) { + return fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) } root, _ := statedb.CommitTo(db, config.IsEIP158(block.Number())) if root != common.Hash(post.Root) { @@ -254,28 +237,9 @@ func (tx *stTransaction) toMessage(ps stPostState) (core.Message, error) { return msg, nil } -func checkLogs(have []*types.Log, want []stLog) error { - if len(have) != len(want) { - return fmt.Errorf("logs length mismatch: got %d, want %d", len(have), len(want)) - } - for i := range have { - if have[i].Address != want[i].Address { - return fmt.Errorf("log address %d: got %x, want %x", i, have[i].Address, want[i].Address) - } - if !bytes.Equal(have[i].Data, want[i].Data) { - return fmt.Errorf("log data %d: got %x, want %x", i, have[i].Data, want[i].Data) - } - if !reflect.DeepEqual(have[i].Topics, want[i].Topics) { - return fmt.Errorf("log topics %d:\ngot %x\nwant %x", i, have[i].Topics, want[i].Topics) - } - genBloom := math.PaddedBigBytes(types.LogsBloom([]*types.Log{have[i]}), 256) - var wantBloom types.Bloom - if err := hexutil.UnmarshalFixedUnprefixedText("Bloom", []byte(want[i].Bloom), wantBloom[:]); err != nil { - return fmt.Errorf("test log %d has invalid bloom: %v", i, err) - } - if !bytes.Equal(genBloom, wantBloom[:]) { - return fmt.Errorf("bloom mismatch") - } - } - return nil +func rlpHash(x interface{}) (h common.Hash) { + hw := sha3.NewKeccak256() + rlp.Encode(hw, x) + hw.Sum(h[:0]) + return h } diff --git a/tests/testdata b/tests/testdata index 70e5862eb2..cd2c3f1b3a 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 70e5862eb267226ca89fb9f395c97be1fdf6923a +Subproject commit cd2c3f1b3acb98c0d1501b06a4a54629d8794d79 diff --git a/tests/vm_test.go b/tests/vm_test.go index 5289ba3559..f35abeb110 100644 --- a/tests/vm_test.go +++ b/tests/vm_test.go @@ -26,6 +26,10 @@ func TestVM(t *testing.T) { t.Parallel() vmt := new(testMatcher) vmt.fails("^vmSystemOperationsTest.json/createNameRegistrator$", "fails without parallel execution") + + vmt.skipLoad(`^vmPerformanceTest.json`) // log format broken + vmt.skipLoad(`^vmInputLimits(Light)?.json`) // log format broken + vmt.skipShortMode("^vmPerformanceTest.json") vmt.skipShortMode("^vmInputLimits(Light)?.json") diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go index afdd896c35..0aa37955ce 100644 --- a/tests/vm_test_util.go +++ b/tests/vm_test_util.go @@ -44,14 +44,14 @@ func (t *VMTest) UnmarshalJSON(data []byte) error { } type vmJSON struct { - Env stEnv `json:"env"` - Exec vmExec `json:"exec"` - Logs []stLog `json:"logs"` - GasRemaining *math.HexOrDecimal64 `json:"gas"` - Out hexutil.Bytes `json:"out"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"post"` - PostStateRoot common.Hash `json:"postStateRoot"` + Env stEnv `json:"env"` + Exec vmExec `json:"exec"` + Logs common.UnprefixedHash `json:"logs"` + GasRemaining *math.HexOrDecimal64 `json:"gas"` + Out hexutil.Bytes `json:"out"` + Pre core.GenesisAlloc `json:"pre"` + Post core.GenesisAlloc `json:"post"` + PostStateRoot common.Hash `json:"postStateRoot"` } //go:generate gencodec -type vmExec -field-override vmExecMarshaling -out gen_vmexec.go @@ -109,7 +109,10 @@ func (t *VMTest) Run(vmconfig vm.Config) error { // if root := statedb.IntermediateRoot(false); root != t.json.PostStateRoot { // return fmt.Errorf("post state root mismatch, got %x, want %x", root, t.json.PostStateRoot) // } - return checkLogs(statedb.Logs(), t.json.Logs) + if logs := rlpHash(statedb.Logs()); logs != common.Hash(t.json.Logs) { + return fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, t.json.Logs) + } + return nil } func (t *VMTest) exec(statedb *state.StateDB, vmconfig vm.Config) ([]byte, uint64, error) { From ad16aeb0a2e79ef6e9db30667152d73565715391 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 24 Aug 2017 15:17:02 +0200 Subject: [PATCH 114/272] core/types: encode receipt status in PostState field This fixes a regression where the new Failed field in ReceiptForStorage rejected previously stored receipts. Fix it by removing the new field and store status in the PostState field. This also removes massive RLP hackery around the status field. --- core/database_util_test.go | 4 +- core/types/receipt.go | 143 ++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 84 deletions(-) diff --git a/core/database_util_test.go b/core/database_util_test.go index 5c75d53d0d..e91f1b5930 100644 --- a/core/database_util_test.go +++ b/core/database_util_test.go @@ -340,7 +340,7 @@ func TestBlockReceiptStorage(t *testing.T) { db, _ := ethdb.NewMemDatabase() receipt1 := &types.Receipt{ - PostState: []byte{0x01}, + Failed: true, CumulativeGasUsed: big.NewInt(1), Logs: []*types.Log{ {Address: common.BytesToAddress([]byte{0x11})}, @@ -351,7 +351,7 @@ func TestBlockReceiptStorage(t *testing.T) { GasUsed: big.NewInt(111111), } receipt2 := &types.Receipt{ - PostState: []byte{0x02}, + PostState: common.Hash{2}.Bytes(), CumulativeGasUsed: big.NewInt(2), Logs: []*types.Log{ {Address: common.BytesToAddress([]byte{0x22})}, diff --git a/core/types/receipt.go b/core/types/receipt.go index b54bd7b4f9..4f3b7357ed 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -17,6 +17,7 @@ package types import ( + "bytes" "fmt" "io" "math/big" @@ -28,9 +29,9 @@ import ( //go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go -const ( - receiptStatusSuccessful = byte(0x01) - receiptStatusFailed = byte(0x00) +var ( + receiptStatusFailed = []byte{} + receiptStatusSuccessful = []byte{0x01} ) // Receipt represents the results of a transaction. @@ -54,22 +55,22 @@ type receiptMarshaling struct { GasUsed *hexutil.Big } -// homesteadReceiptRLP contains the receipt's Homestead consensus fields, used -// during RLP serialization. -type homesteadReceiptRLP struct { - PostState []byte +// receiptRLP is the consensus encoding of a receipt. +type receiptRLP struct { + PostStateOrStatus []byte CumulativeGasUsed *big.Int Bloom Bloom Logs []*Log } -// metropolisReceiptRLP contains the receipt's Metropolis consensus fields, used -// during RLP serialization. -type metropolisReceiptRLP struct { - Status byte +type receiptStorageRLP struct { + PostStateOrStatus []byte CumulativeGasUsed *big.Int Bloom Bloom - Logs []*Log + TxHash common.Hash + ContractAddress common.Address + Logs []*LogForStorage + GasUsed *big.Int } // NewReceipt creates a barebone transaction receipt, copying the init fields. @@ -80,69 +81,46 @@ func NewReceipt(root []byte, failed bool, cumulativeGasUsed *big.Int) *Receipt { // EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt // into an RLP stream. If no post state is present, metropolis fork is assumed. func (r *Receipt) EncodeRLP(w io.Writer) error { - if r.PostState == nil { - status := receiptStatusSuccessful - if r.Failed { - status = receiptStatusFailed - } - return rlp.Encode(w, &metropolisReceiptRLP{status, r.CumulativeGasUsed, r.Bloom, r.Logs}) - } - return rlp.Encode(w, &homesteadReceiptRLP{r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs}) + return rlp.Encode(w, &receiptRLP{r.statusEncoding(), r.CumulativeGasUsed, r.Bloom, r.Logs}) } // DecodeRLP implements rlp.Decoder, and loads the consensus fields of a receipt // from an RLP stream. func (r *Receipt) DecodeRLP(s *rlp.Stream) error { - // Load the raw bytes since we have multiple possible formats - raw, err := s.Raw() - if err != nil { + var dec receiptRLP + if err := s.Decode(&dec); err != nil { return err } - content, _, err := rlp.SplitList(raw) - if err != nil { + if err := r.setStatus(dec.PostStateOrStatus); err != nil { return err } - kind, cnt, _, err := rlp.Split(content) - if err != nil { - return err - } - // Deserialize based on the first component type. + r.CumulativeGasUsed, r.Bloom, r.Logs = dec.CumulativeGasUsed, dec.Bloom, dec.Logs + return nil +} + +func (r *Receipt) setStatus(postStateOrStatus []byte) error { switch { - case kind == rlp.Byte || (kind == rlp.String && len(cnt) == 0): - // The first component of metropolis receipts is Byte (0x01), or the empty - // string (0x80, decoded as a byte with 0x00 value). - var metro metropolisReceiptRLP - if err := rlp.DecodeBytes(raw, &metro); err != nil { - return err - } - switch metro.Status { - case receiptStatusSuccessful: - r.Failed = false - case receiptStatusFailed: - r.Failed = true - default: - return fmt.Errorf("invalid status byte: 0x%x", metro.Status) - } - r.CumulativeGasUsed = metro.CumulativeGasUsed - r.Bloom = metro.Bloom - r.Logs = metro.Logs - return nil - - case kind == rlp.String: - // The first component of homestead receipts is non-empty String. - var home homesteadReceiptRLP - if err := rlp.DecodeBytes(raw, &home); err != nil { - return err - } - r.PostState = home.PostState[:] - r.CumulativeGasUsed = home.CumulativeGasUsed - r.Bloom = home.Bloom - r.Logs = home.Logs - return nil - + case bytes.Equal(postStateOrStatus, receiptStatusSuccessful): + r.Failed = false + case bytes.Equal(postStateOrStatus, receiptStatusFailed): + r.Failed = true + case len(postStateOrStatus) == len(common.Hash{}): + r.PostState = postStateOrStatus default: - return fmt.Errorf("invalid first receipt component: %v", kind) + return fmt.Errorf("invalid receipt status %x", postStateOrStatus) } + return nil +} + +func (r *Receipt) statusEncoding() []byte { + if len(r.PostState) == 0 { + if r.Failed { + return receiptStatusFailed + } else { + return receiptStatusSuccessful + } + } + return r.PostState } // String implements the Stringer interface. @@ -160,38 +138,39 @@ type ReceiptForStorage Receipt // EncodeRLP implements rlp.Encoder, and flattens all content fields of a receipt // into an RLP stream. func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { - logs := make([]*LogForStorage, len(r.Logs)) - for i, log := range r.Logs { - logs[i] = (*LogForStorage)(log) + enc := &receiptStorageRLP{ + PostStateOrStatus: (*Receipt)(r).statusEncoding(), + CumulativeGasUsed: r.CumulativeGasUsed, + Bloom: r.Bloom, + TxHash: r.TxHash, + ContractAddress: r.ContractAddress, + Logs: make([]*LogForStorage, len(r.Logs)), + GasUsed: r.GasUsed, } - return rlp.Encode(w, []interface{}{r.PostState, r.Failed, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, logs, r.GasUsed}) + for i, log := range r.Logs { + enc.Logs[i] = (*LogForStorage)(log) + } + return rlp.Encode(w, enc) } // DecodeRLP implements rlp.Decoder, and loads both consensus and implementation // fields of a receipt from an RLP stream. func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { - var receipt struct { - PostState []byte - Failed bool - CumulativeGasUsed *big.Int - Bloom Bloom - TxHash common.Hash - ContractAddress common.Address - Logs []*LogForStorage - GasUsed *big.Int + var dec receiptStorageRLP + if err := s.Decode(&dec); err != nil { + return err } - if err := s.Decode(&receipt); err != nil { + if err := (*Receipt)(r).setStatus(dec.PostStateOrStatus); err != nil { return err } // Assign the consensus fields - r.PostState, r.Failed, r.CumulativeGasUsed, r.Bloom = receipt.PostState, receipt.Failed, receipt.CumulativeGasUsed, receipt.Bloom - r.Logs = make([]*Log, len(receipt.Logs)) - for i, log := range receipt.Logs { + r.CumulativeGasUsed, r.Bloom = dec.CumulativeGasUsed, dec.Bloom + r.Logs = make([]*Log, len(dec.Logs)) + for i, log := range dec.Logs { r.Logs[i] = (*Log)(log) } // Assign the implementation fields - r.TxHash, r.ContractAddress, r.GasUsed = receipt.TxHash, receipt.ContractAddress, receipt.GasUsed - + r.TxHash, r.ContractAddress, r.GasUsed = dec.TxHash, dec.ContractAddress, dec.GasUsed return nil } From 08f27428b4e97c339a220b7155ad13f4ef5a6767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 25 Aug 2017 12:30:51 +0300 Subject: [PATCH 115/272] core, tests: implement Metropolis EIP 684 --- core/vm/errors.go | 11 ++++++----- core/vm/evm.go | 14 +++++++++++--- tests/state_test.go | 2 -- tests/testdata | 2 +- tests/vm_test.go | 1 - 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/core/vm/errors.go b/core/vm/errors.go index 69c7d6a98c..b19366be0e 100644 --- a/core/vm/errors.go +++ b/core/vm/errors.go @@ -19,9 +19,10 @@ package vm import "errors" var ( - ErrOutOfGas = errors.New("out of gas") - ErrCodeStoreOutOfGas = errors.New("contract creation code storage out of gas") - ErrDepth = errors.New("max call depth exceeded") - ErrTraceLimitReached = errors.New("the number of logs reached the specified limit") - ErrInsufficientBalance = errors.New("insufficient balance for transfer") + ErrOutOfGas = errors.New("out of gas") + ErrCodeStoreOutOfGas = errors.New("contract creation code storage out of gas") + ErrDepth = errors.New("max call depth exceeded") + ErrTraceLimitReached = errors.New("the number of logs reached the specified limit") + ErrInsufficientBalance = errors.New("insufficient balance for transfer") + ErrContractAddressCollision = errors.New("contract address collision") ) diff --git a/core/vm/evm.go b/core/vm/evm.go index 34933a1dc4..caf8b4507d 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -25,6 +25,10 @@ import ( "github.com/ethereum/go-ethereum/params" ) +// emptyCodeHash is used by create to ensure deployment is disallowed to already +// deployed contract addresses (relevant after the account abstraction). +var emptyCodeHash = crypto.Keccak256Hash(nil) + type ( CanTransferFunc func(StateDB, common.Address, *big.Int) bool TransferFunc func(StateDB, common.Address, common.Address, *big.Int) @@ -307,13 +311,17 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I if !evm.CanTransfer(evm.StateDB, caller.Address(), value) { return nil, common.Address{}, gas, ErrInsufficientBalance } - - // Create a new account on the state + // Ensure there's no existing contract already at the designated address nonce := evm.StateDB.GetNonce(caller.Address()) evm.StateDB.SetNonce(caller.Address(), nonce+1) - snapshot := evm.StateDB.Snapshot() contractAddr = crypto.CreateAddress(caller.Address(), nonce) + contractHash := evm.StateDB.GetCodeHash(contractAddr) + if evm.StateDB.GetNonce(contractAddr) != 0 || (contractHash != (common.Hash{}) && contractHash != emptyCodeHash) { + return nil, common.Address{}, 0, ErrContractAddressCollision + } + // Create a new account on the state + snapshot := evm.StateDB.Snapshot() evm.StateDB.CreateAccount(contractAddr) if evm.ChainConfig().IsEIP158(evm.BlockNumber) { evm.StateDB.SetNonce(contractAddr, 1) diff --git a/tests/state_test.go b/tests/state_test.go index 00067c61ac..3d7b29012e 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -37,10 +37,8 @@ func TestState(t *testing.T) { // Expected failures: st.fails(`^stCodeSizeLimit/codesizeOOGInvalidSize\.json/(Frontier|Homestead|EIP150)`, "code size limit implementation is not conditional on fork") - st.fails(`^stRevertTest/RevertDepthCreateAddressCollision\.json/EIP15[08]/[67]`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test") - st.fails(`^stRevertTest/RevertDepthCreateAddressCollision\.json/Byzantium/[67]`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/Byzantium`, "bug in test") diff --git a/tests/testdata b/tests/testdata index cd2c3f1b3a..1d30b47956 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit cd2c3f1b3acb98c0d1501b06a4a54629d8794d79 +Subproject commit 1d30b4795664f64b1b157971754e14a10cfd9115 diff --git a/tests/vm_test.go b/tests/vm_test.go index f35abeb110..c9f5e225e9 100644 --- a/tests/vm_test.go +++ b/tests/vm_test.go @@ -27,7 +27,6 @@ func TestVM(t *testing.T) { vmt := new(testMatcher) vmt.fails("^vmSystemOperationsTest.json/createNameRegistrator$", "fails without parallel execution") - vmt.skipLoad(`^vmPerformanceTest.json`) // log format broken vmt.skipLoad(`^vmInputLimits(Light)?.json`) // log format broken vmt.skipShortMode("^vmPerformanceTest.json") From ebf41d16a04420a3eba082cc0a1783c93caa1f86 Mon Sep 17 00:00:00 2001 From: Oli Bye Date: Fri, 25 Aug 2017 14:54:36 +0100 Subject: [PATCH 116/272] cmd/geth: fix --nousb typo (#15040) --- cmd/utils/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index b257084719..37ccd06efb 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -120,7 +120,7 @@ var ( } NoUSBFlag = cli.BoolFlag{ Name: "nousb", - Usage: "Disables monitoring for and managine USB hardware wallets", + Usage: "Disables monitoring for and managing USB hardware wallets", } NetworkIdFlag = cli.Uint64Flag{ Name: "networkid", From bc2a5578c043f251387bb0b7200a7bf651cd7905 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sun, 27 Aug 2017 14:00:32 +0200 Subject: [PATCH 117/272] core/vm: more benchmarks --- core/vm/contracts_test.go | 76 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 022070ab80..4ee8bbfd93 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -13,6 +13,7 @@ type precompiledTest struct { input, expected string gas uint64 name string + notForBenchmarking bool // Benchmark primarily the worst-cases } // modexpTests are the test and benchmark data for the modexp precompiled contract. @@ -182,6 +183,78 @@ var bn256ScalarMulTests = []precompiledTest{ input: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", expected: "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", name: "chfast3", + },{ + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + expected: "2cde5879ba6f13c0b5aa4ef627f159a3347df9722efce88a9afbb20b763b4c411aa7e43076f6aee272755a7f9b84832e71559ba0d2e0b17d5f9f01755e5b0d11", + name : "cdetrio1", + },{ + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + expected: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe3163511ddc1c3f25d396745388200081287b3fd1472d8339d5fecb2eae0830451", + name : "cdetrio2", + notForBenchmarking:true, + },{ + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000", + expected: "1051acb0700ec6d42a88215852d582efbaef31529b6fcbc3277b5c1b300f5cf0135b2394bb45ab04b8bd7611bd2dfe1de6a4e6e2ccea1ea1955f577cd66af85b", + name : "cdetrio3", + notForBenchmarking:true, + },{ + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009", + expected: "1dbad7d39dbc56379f78fac1bca147dc8e66de1b9d183c7b167351bfe0aeab742cd757d51289cd8dbd0acf9e673ad67d0f0a89f912af47ed1be53664f5692575", + name : "cdetrio4", + notForBenchmarking:true, + },{ + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001", + expected: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6", + name : "cdetrio5", + notForBenchmarking:true, + },{ + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + expected: "29e587aadd7c06722aabba753017c093f70ba7eb1f1c0104ec0564e7e3e21f6022b1143f6a41008e7755c71c3d00b6b915d386de21783ef590486d8afa8453b1", + name : "cdetrio6", + },{ + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + expected: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb", + name : "cdetrio7", + notForBenchmarking:true, + },{ + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000100000000000000000000000000000000", + expected: "221a3577763877920d0d14a91cd59b9479f83b87a653bb41f82a3f6f120cea7c2752c7f64cdd7f0e494bff7b60419f242210f2026ed2ec70f89f78a4c56a1f15", + name : "cdetrio8", + notForBenchmarking:true, + },{ + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000009", + expected: "228e687a379ba154554040f8821f4e41ee2be287c201aa9c3bc02c9dd12f1e691e0fd6ee672d04cfd924ed8fdc7ba5f2d06c53c1edc30f65f2af5a5b97f0a76a", + name : "cdetrio9", + notForBenchmarking:true, + },{ + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000001", + expected: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c", + name : "cdetrio10", + notForBenchmarking:true, + },{ + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + expected: "00a1a234d08efaa2616607e31eca1980128b00b415c845ff25bba3afcb81dc00242077290ed33906aeb8e42fd98c41bcb9057ba03421af3f2d08cfc441186024", + name : "cdetrio11", + },{ + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d9830644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + expected: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b8692929ee761a352600f54921df9bf472e66217e7bb0cee9032e00acc86b3c8bfaf", + name : "cdetrio12", + notForBenchmarking:true, + },{ + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000100000000000000000000000000000000", + expected: "1071b63011e8c222c5a771dfa03c2e11aac9666dd097f2c620852c3951a4376a2f46fe2f73e1cf310a168d56baa5575a8319389d7bfa6b29ee2d908305791434", + name : "cdetrio13", + notForBenchmarking:true, + },{ + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000009", + expected: "19f75b9dd68c080a688774a6213f131e3052bd353a304a189d7a2ee367e3c2582612f545fb9fc89fde80fd81c68fc7dcb27fea5fc124eeda69433cf5c46d2d7f", + name : "cdetrio14", + notForBenchmarking:true, + },{ + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98000000000000000000000000000000000000000000000000000000000000000", + expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + name : "cdetrio15", + notForBenchmarking:true, }, } @@ -262,6 +335,9 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) { } func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { + if test.notForBenchmarking{ + return + } p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] in := common.Hex2Bytes(test.input) reqGas := p.RequiredGas(in) From a4df80f47f2ac6e70c0be242ccec54aef7777115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 28 Aug 2017 11:15:29 +0300 Subject: [PATCH 118/272] travis, appveyor: bump Go to 1.9 stable --- .travis.yml | 26 +++++++++++++++++++------- appveyor.yml | 4 ++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 703ed0cb1d..a972668c95 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,11 +15,23 @@ matrix: - go run build/ci.go install - go run build/ci.go test -coverage - # These are the latest Go versions. - os: linux dist: trusty sudo: required go: 1.8.3 + script: + - sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install fuse + - sudo modprobe fuse + - sudo chmod 666 /dev/fuse + - sudo chown root:$USER /etc/fuse.conf + - go run build/ci.go install + - go run build/ci.go test -coverage + + # These are the latest Go versions. + - os: linux + dist: trusty + sudo: required + go: 1.9.0 script: - sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install fuse - sudo modprobe fuse @@ -29,7 +41,7 @@ matrix: - go run build/ci.go test -coverage -misspell - os: osx - go: 1.8.3 + go: 1.9.0 sudo: required script: - brew update @@ -42,7 +54,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.8.3 + go: 1.9.0 env: - ubuntu-ppa - azure-linux @@ -81,7 +93,7 @@ matrix: sudo: required services: - docker - go: 1.8.3 + go: 1.9.0 env: - azure-linux-mips script: @@ -121,7 +133,7 @@ matrix: - azure-android - maven-android before_install: - - curl https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz | tar -xz + - curl https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz | tar -xz - export PATH=`pwd`/go/bin:$PATH - export GOROOT=`pwd`/go - export GOPATH=$HOME/go @@ -138,7 +150,7 @@ matrix: # This builder does the OSX Azure, iOS CocoaPods and iOS Azure uploads - os: osx - go: 1.8.3 + go: 1.9.0 env: - azure-osx - azure-ios @@ -164,7 +176,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.8.3 + go: 1.9.0 env: - azure-purge script: diff --git a/appveyor.yml b/appveyor.yml index 945cafaf2e..78b11fa9d6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,8 +23,8 @@ environment: install: - git submodule update --init - rmdir C:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go1.8.3.windows-%GETH_ARCH%.zip - - 7z x go1.8.3.windows-%GETH_ARCH%.zip -y -oC:\ > NUL + - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.windows-%GETH_ARCH%.zip + - 7z x go1.9.windows-%GETH_ARCH%.zip -y -oC:\ > NUL - go version - gcc --version From 64a3a3d23c745b934ca0d2a5dda98c826c7d064c Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 28 Aug 2017 13:30:26 +0200 Subject: [PATCH 119/272] core/vm: Fix testcase input for ecmul --- core/vm/contracts_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 4ee8bbfd93..0c6ae9ac6b 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -251,8 +251,8 @@ var bn256ScalarMulTests = []precompiledTest{ name : "cdetrio14", notForBenchmarking:true, },{ - input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98000000000000000000000000000000000000000000000000000000000000000", - expected: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000001", + expected: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", name : "cdetrio15", notForBenchmarking:true, }, From 07635e43e28260b4523cc8e77006f54d237a8a8d Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 28 Aug 2017 13:33:24 +0200 Subject: [PATCH 120/272] core/vm: renamed struct member + go fmt --- core/vm/contracts_test.go | 142 +++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 0c6ae9ac6b..880d7324ae 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -13,7 +13,7 @@ type precompiledTest struct { input, expected string gas uint64 name string - notForBenchmarking bool // Benchmark primarily the worst-cases + noBenchmark bool // Benchmark primarily the worst-cases } // modexpTests are the test and benchmark data for the modexp precompiled contract. @@ -183,78 +183,78 @@ var bn256ScalarMulTests = []precompiledTest{ input: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", expected: "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", name: "chfast3", - },{ - input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + }, { + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", expected: "2cde5879ba6f13c0b5aa4ef627f159a3347df9722efce88a9afbb20b763b4c411aa7e43076f6aee272755a7f9b84832e71559ba0d2e0b17d5f9f01755e5b0d11", - name : "cdetrio1", - },{ - input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", - expected: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe3163511ddc1c3f25d396745388200081287b3fd1472d8339d5fecb2eae0830451", - name : "cdetrio2", - notForBenchmarking:true, - },{ - input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000", - expected: "1051acb0700ec6d42a88215852d582efbaef31529b6fcbc3277b5c1b300f5cf0135b2394bb45ab04b8bd7611bd2dfe1de6a4e6e2ccea1ea1955f577cd66af85b", - name : "cdetrio3", - notForBenchmarking:true, - },{ - input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009", - expected: "1dbad7d39dbc56379f78fac1bca147dc8e66de1b9d183c7b167351bfe0aeab742cd757d51289cd8dbd0acf9e673ad67d0f0a89f912af47ed1be53664f5692575", - name : "cdetrio4", - notForBenchmarking:true, - },{ - input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001", - expected: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6", - name : "cdetrio5", - notForBenchmarking:true, - },{ - input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + name: "cdetrio1", + }, { + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + expected: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe3163511ddc1c3f25d396745388200081287b3fd1472d8339d5fecb2eae0830451", + name: "cdetrio2", + noBenchmark: true, + }, { + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000", + expected: "1051acb0700ec6d42a88215852d582efbaef31529b6fcbc3277b5c1b300f5cf0135b2394bb45ab04b8bd7611bd2dfe1de6a4e6e2ccea1ea1955f577cd66af85b", + name: "cdetrio3", + noBenchmark: true, + }, { + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009", + expected: "1dbad7d39dbc56379f78fac1bca147dc8e66de1b9d183c7b167351bfe0aeab742cd757d51289cd8dbd0acf9e673ad67d0f0a89f912af47ed1be53664f5692575", + name: "cdetrio4", + noBenchmark: true, + }, { + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001", + expected: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6", + name: "cdetrio5", + noBenchmark: true, + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", expected: "29e587aadd7c06722aabba753017c093f70ba7eb1f1c0104ec0564e7e3e21f6022b1143f6a41008e7755c71c3d00b6b915d386de21783ef590486d8afa8453b1", - name : "cdetrio6", - },{ - input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", - expected: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb", - name : "cdetrio7", - notForBenchmarking:true, - },{ - input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000100000000000000000000000000000000", - expected: "221a3577763877920d0d14a91cd59b9479f83b87a653bb41f82a3f6f120cea7c2752c7f64cdd7f0e494bff7b60419f242210f2026ed2ec70f89f78a4c56a1f15", - name : "cdetrio8", - notForBenchmarking:true, - },{ - input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000009", - expected: "228e687a379ba154554040f8821f4e41ee2be287c201aa9c3bc02c9dd12f1e691e0fd6ee672d04cfd924ed8fdc7ba5f2d06c53c1edc30f65f2af5a5b97f0a76a", - name : "cdetrio9", - notForBenchmarking:true, - },{ - input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000001", - expected: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c", - name : "cdetrio10", - notForBenchmarking:true, - },{ - input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + name: "cdetrio6", + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + expected: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb", + name: "cdetrio7", + noBenchmark: true, + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000100000000000000000000000000000000", + expected: "221a3577763877920d0d14a91cd59b9479f83b87a653bb41f82a3f6f120cea7c2752c7f64cdd7f0e494bff7b60419f242210f2026ed2ec70f89f78a4c56a1f15", + name: "cdetrio8", + noBenchmark: true, + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000009", + expected: "228e687a379ba154554040f8821f4e41ee2be287c201aa9c3bc02c9dd12f1e691e0fd6ee672d04cfd924ed8fdc7ba5f2d06c53c1edc30f65f2af5a5b97f0a76a", + name: "cdetrio9", + noBenchmark: true, + }, { + input: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000001", + expected: "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c", + name: "cdetrio10", + noBenchmark: true, + }, { + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", expected: "00a1a234d08efaa2616607e31eca1980128b00b415c845ff25bba3afcb81dc00242077290ed33906aeb8e42fd98c41bcb9057ba03421af3f2d08cfc441186024", - name : "cdetrio11", - },{ - input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d9830644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", - expected: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b8692929ee761a352600f54921df9bf472e66217e7bb0cee9032e00acc86b3c8bfaf", - name : "cdetrio12", - notForBenchmarking:true, - },{ - input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000100000000000000000000000000000000", - expected: "1071b63011e8c222c5a771dfa03c2e11aac9666dd097f2c620852c3951a4376a2f46fe2f73e1cf310a168d56baa5575a8319389d7bfa6b29ee2d908305791434", - name : "cdetrio13", - notForBenchmarking:true, - },{ - input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000009", - expected: "19f75b9dd68c080a688774a6213f131e3052bd353a304a189d7a2ee367e3c2582612f545fb9fc89fde80fd81c68fc7dcb27fea5fc124eeda69433cf5c46d2d7f", - name : "cdetrio14", - notForBenchmarking:true, - },{ - input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000001", - expected: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", - name : "cdetrio15", - notForBenchmarking:true, + name: "cdetrio11", + }, { + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d9830644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", + expected: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b8692929ee761a352600f54921df9bf472e66217e7bb0cee9032e00acc86b3c8bfaf", + name: "cdetrio12", + noBenchmark: true, + }, { + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000100000000000000000000000000000000", + expected: "1071b63011e8c222c5a771dfa03c2e11aac9666dd097f2c620852c3951a4376a2f46fe2f73e1cf310a168d56baa5575a8319389d7bfa6b29ee2d908305791434", + name: "cdetrio13", + noBenchmark: true, + }, { + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000009", + expected: "19f75b9dd68c080a688774a6213f131e3052bd353a304a189d7a2ee367e3c2582612f545fb9fc89fde80fd81c68fc7dcb27fea5fc124eeda69433cf5c46d2d7f", + name: "cdetrio14", + noBenchmark: true, + }, { + input: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000001", + expected: "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", + name: "cdetrio15", + noBenchmark: true, }, } @@ -335,7 +335,7 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) { } func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { - if test.notForBenchmarking{ + if test.noBenchmark { return } p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] From dc92779c0a1e01de9561087a3a534d9d7cfdef3f Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 4 Sep 2017 09:24:52 +0200 Subject: [PATCH 121/272] p2p: change ping ticker to timer (#15071) Using a Timer over Ticker seems to be a lot better, though I cannot fully account for why that it behaves so (since Ticker should be more bursty, but not necessarily more active over time, but that may depend on how long window it uses to decide on when to tick next) --- p2p/peer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/p2p/peer.go b/p2p/peer.go index a9c20189a4..fb4b39e950 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -190,7 +190,7 @@ loop: } func (p *Peer) pingLoop() { - ping := time.NewTicker(pingInterval) + ping := time.NewTimer(pingInterval) defer p.wg.Done() defer ping.Stop() for { @@ -200,6 +200,7 @@ func (p *Peer) pingLoop() { p.protoErr <- err return } + ping.Reset(pingInterval) case <-p.closed: return } From 23b51a68cbdd637824be906c9354a0b59c57491b Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 4 Sep 2017 10:56:45 +0200 Subject: [PATCH 122/272] core/vm: avoid state lookup during gas calc for call (#15061) --- core/vm/gas_table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 3b0698ce9e..13712295c9 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -324,7 +324,7 @@ func gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem eip158 = evm.ChainConfig().IsEIP158(evm.BlockNumber) ) if eip158 { - if evm.StateDB.Empty(address) && transfersValue { + if transfersValue && evm.StateDB.Empty(address) { gas += params.CallNewAccountGas } } else if !evm.StateDB.Exist(address) { From 1901521ed0423a5feaadd3635b10783c5a998151 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 4 Sep 2017 11:48:36 +0200 Subject: [PATCH 123/272] core: Fix flaw where underpriced locals were removed (#15081) * core: Fix flaw where underpriced locals were removed * core: minor code cleanups for tx pool tests --- core/tx_list.go | 1 + core/tx_pool_test.go | 62 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/core/tx_list.go b/core/tx_list.go index 0d87c20bc2..1087970fac 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -435,6 +435,7 @@ func (l *txPricedList) Cap(threshold *big.Int, local *accountSet) types.Transact } // Stop the discards if we've reached the threshold if tx.GasPrice().Cmp(threshold) >= 0 { + save = append(save, tx) break } // Non stale transaction found, discard unless local diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index ee1ddd4bbc..c1bcb1b2d6 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -976,7 +976,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { } } -// Tests that if transactions start being capped, transasctions are also removed from 'all' +// Tests that if transactions start being capped, transactions are also removed from 'all' func TestTransactionCapClearsFromAll(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() @@ -1141,6 +1141,66 @@ func TestTransactionPoolRepricing(t *testing.T) { } } +// Tests that setting the transaction pool gas price to a higher value does not +// remove local transactions. +func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { + // Create the pool to test the pricing enforcement with + db, _ := ethdb.NewMemDatabase() + statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) + defer pool.Stop() + + // Create a number of test accounts and fund them + state, _ := pool.blockChain.State() + + keys := make([]*ecdsa.PrivateKey, 3) + for i := 0; i < len(keys); i++ { + keys[i], _ = crypto.GenerateKey() + state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000*1000000)) + } + // Create transaction (both pending and queued) with a linearly growing gasprice + for i := uint64(0); i < 500; i++ { + // Add pending + p_tx := pricedTransaction(i, big.NewInt(100000), big.NewInt(int64(i)), keys[2]) + if err := pool.AddLocal(p_tx); err != nil { + t.Fatal(err) + } + // Add queued + q_tx := pricedTransaction(i+501, big.NewInt(100000), big.NewInt(int64(i)), keys[2]) + if err := pool.AddLocal(q_tx); err != nil { + t.Fatal(err) + } + } + pending, queued := pool.Stats() + expPending, expQueued := 500, 500 + validate := func() { + pending, queued = pool.Stats() + if pending != expPending { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, expPending) + } + if queued != expQueued { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, expQueued) + } + + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } + } + validate() + + // Reprice the pool and check that nothing is dropped + pool.SetGasPrice(big.NewInt(2)) + validate() + + pool.SetGasPrice(big.NewInt(2)) + pool.SetGasPrice(big.NewInt(4)) + pool.SetGasPrice(big.NewInt(8)) + pool.SetGasPrice(big.NewInt(100)) + validate() +} + // Tests that when the pool reaches its global transaction limit, underpriced // transactions are gradually shifted out for more expensive ones and any gapped // pending transactions are moved into te queue. From e7408b5552002df7c3ba6a2351f14c533dfc5a36 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 4 Sep 2017 11:53:25 +0200 Subject: [PATCH 124/272] core/vm: Make MaxCodesize non-retroactive (#15072) * core/vm: Make max_codesize only applicable post Spurious Dragon/158/155/161/170 * tests: Remove expected failure --- core/vm/evm.go | 2 +- tests/state_test.go | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index caf8b4507d..495d9beea1 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -336,7 +336,7 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I ret, err = run(evm, snapshot, contract, nil) // check whether the max code size has been exceeded - maxCodeSizeExceeded := len(ret) > params.MaxCodeSize + maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize // if the contract creation ran successfully and no errors were returned // calculate the gas required to store the code. If the code could not // be stored due to not enough gas set an error and let it be handled diff --git a/tests/state_test.go b/tests/state_test.go index 3d7b29012e..4b6ba8b31b 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -35,8 +35,6 @@ func TestState(t *testing.T) { st.skipLoad(`^stTransactionTest/OverflowGasRequire\.json`) // gasLimit > 256 bits st.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\.json`) // EIP-86 is not supported yet // Expected failures: - st.fails(`^stCodeSizeLimit/codesizeOOGInvalidSize\.json/(Frontier|Homestead|EIP150)`, - "code size limit implementation is not conditional on fork") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") From 504278e8398ef787d4f6f73178afa342a31a88ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 11:16:46 +0300 Subject: [PATCH 125/272] build: bump PPA builders to Go 1.9 (#15083) --- build/ci-notes.md | 6 +++--- build/deb.control | 2 +- build/deb.rules | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/ci-notes.md b/build/ci-notes.md index 7574bfffa2..78e9575c01 100644 --- a/build/ci-notes.md +++ b/build/ci-notes.md @@ -21,18 +21,18 @@ variable which Travis CI makes available to certain builds. We want to build go-ethereum with the most recent version of Go, irrespective of the Go version that is available in the main Ubuntu repository. In order to make this possible, our PPA depends on the ~gophers/ubuntu/archive PPA. Our source package build-depends on -golang-1.8, which is co-installable alongside the regular golang package. PPA dependencies +golang-1.9, which is co-installable alongside the regular golang package. PPA dependencies can be edited at https://launchpad.net/%7Eethereum/+archive/ubuntu/ethereum/+edit-dependencies ## Building Packages Locally (for testing) You need to run Ubuntu to do test packaging. -Add the gophers PPA and install Go 1.8 and Debian packaging tools: +Add the gophers PPA and install Go 1.9 and Debian packaging tools: $ sudo apt-add-repository ppa:gophers/ubuntu/archive $ sudo apt-get update - $ sudo apt-get install build-essential golang-1.8 devscripts debhelper + $ sudo apt-get install build-essential golang-1.9 devscripts debhelper Create the source packages: diff --git a/build/deb.control b/build/deb.control index 7394754ef0..5c9ce6705c 100644 --- a/build/deb.control +++ b/build/deb.control @@ -2,7 +2,7 @@ Source: {{.Name}} Section: science Priority: extra Maintainer: {{.Author}} -Build-Depends: debhelper (>= 8.0.0), golang-1.8 +Build-Depends: debhelper (>= 8.0.0), golang-1.9 Standards-Version: 3.9.5 Homepage: https://ethereum.org Vcs-Git: git://github.com/ethereum/go-ethereum.git diff --git a/build/deb.rules b/build/deb.rules index b3fe5267f3..7a78525139 100644 --- a/build/deb.rules +++ b/build/deb.rules @@ -5,7 +5,7 @@ #export DH_VERBOSE=1 override_dh_auto_build: - build/env.sh /usr/lib/go-1.8/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}} + build/env.sh /usr/lib/go-1.9/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}} override_dh_auto_test: From 8f567dc8a2cf1e963a972a0d986703b41988f50b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 12:16:59 +0300 Subject: [PATCH 126/272] Dockerfile: multi-stage builds, Go 1.9 --- Dockerfile | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 947f045e59..17fa40951e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,15 @@ -FROM alpine:3.6 +# Build Geth in a stock Go builder container +FROM golang:1.9-alpine as builder + +RUN apk add --no-cache make gcc musl-dev linux-headers ADD . /go-ethereum -RUN \ - apk add --no-cache git go make gcc musl-dev linux-headers && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /usr/local/bin/ && \ - apk del git go make gcc musl-dev linux-headers && \ - rm -rf /go-ethereum +RUN cd /go-ethereum && make geth -EXPOSE 8545 30303 30303/udp +# Pull Geth into a second stage deploy alpine container +FROM alpine:latest +COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/ + +EXPOSE 8545 8546 30303 30303/udp ENTRYPOINT ["geth"] From 8cab3ab4350fe06f5dd1e9bb9ce5f559c08bc4cf Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Tue, 5 Sep 2017 11:24:26 +0200 Subject: [PATCH 127/272] cmd/evm: adds ability to run individual state test file (#14998) * cmd/evm: adds ability to run individual state test file * cmd/evm: Fix statetest runner to be more json friendly * cmd/evm, tests: minor polishes, dump state on fail --- cmd/evm/main.go | 1 + cmd/evm/staterunner.go | 119 +++++++++++++++++++++++++++++++++++++++ tests/state_test.go | 3 +- tests/state_test_util.go | 12 ++-- 4 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 cmd/evm/staterunner.go diff --git a/cmd/evm/main.go b/cmd/evm/main.go index a2e3b048e7..6c39cf8b88 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -143,6 +143,7 @@ func init() { compileCommand, disasmCommand, runCommand, + stateTestCommand, } } diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go new file mode 100644 index 0000000000..3a4cc51c03 --- /dev/null +++ b/cmd/evm/staterunner.go @@ -0,0 +1,119 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "os" + + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/tests" + + cli "gopkg.in/urfave/cli.v1" +) + +var stateTestCommand = cli.Command{ + Action: stateTestCmd, + Name: "statetest", + Usage: "executes the given state tests", + ArgsUsage: "", +} + +type StatetestResult struct { + Name string `json:"name"` + Pass bool `json:"pass"` + Fork string `json:"fork"` + Error string `json:"error,omitempty"` + State *state.Dump `json:"state,omitempty"` +} + +func stateTestCmd(ctx *cli.Context) error { + if len(ctx.Args().First()) == 0 { + return errors.New("path-to-test argument required") + } + // Configure the go-ethereum logger + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) + glogger.Verbosity(log.Lvl(ctx.GlobalInt(VerbosityFlag.Name))) + log.Root().SetHandler(glogger) + + // Configure the EVM logger + config := &vm.LogConfig{ + DisableMemory: ctx.GlobalBool(DisableMemoryFlag.Name), + DisableStack: ctx.GlobalBool(DisableStackFlag.Name), + } + var ( + tracer vm.Tracer + debugger *vm.StructLogger + ) + switch { + case ctx.GlobalBool(MachineFlag.Name): + tracer = NewJSONLogger(config, os.Stderr) + + case ctx.GlobalBool(DebugFlag.Name): + debugger = vm.NewStructLogger(config) + tracer = debugger + + default: + debugger = vm.NewStructLogger(config) + } + // Load the test content from the input file + src, err := ioutil.ReadFile(ctx.Args().First()) + if err != nil { + return err + } + var tests map[string]tests.StateTest + if err = json.Unmarshal(src, &tests); err != nil { + return err + } + // Iterate over all the tests, run them and aggregate the results + cfg := vm.Config{ + Tracer: tracer, + Debug: ctx.GlobalBool(DebugFlag.Name) || ctx.GlobalBool(MachineFlag.Name), + } + results := make([]StatetestResult, 0, len(tests)) + for key, test := range tests { + for _, st := range test.Subtests() { + // Run the test and aggregate the result + result := &StatetestResult{Name: key, Fork: st.Fork, Pass: true} + if state, err := test.Run(st, cfg); err != nil { + // Test failed, mark as so and dump any state to aid debugging + result.Pass, result.Error = false, err.Error() + if ctx.GlobalBool(DumpFlag.Name) && state != nil { + dump := state.RawDump() + result.State = &dump + } + } + results = append(results, *result) + + // Print any structured logs collected + if ctx.GlobalBool(DebugFlag.Name) { + if debugger != nil { + fmt.Fprintln(os.Stderr, "#### TRACE ####") + vm.WriteTrace(os.Stderr, debugger.StructLogs()) + } + } + } + } + out, _ := json.MarshalIndent(results, "", " ") + fmt.Println(string(out)) + return nil +} diff --git a/tests/state_test.go b/tests/state_test.go index 4b6ba8b31b..1fb7f5908f 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -50,7 +50,8 @@ func TestState(t *testing.T) { t.Skip("constantinople not supported yet") } withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { - return st.checkFailure(t, name, test.Run(subtest, vmconfig)) + _, err := test.Run(subtest, vmconfig) + return st.checkFailure(t, name, err) }) }) } diff --git a/tests/state_test_util.go b/tests/state_test_util.go index ecaa6c6684..64bf09cb42 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -120,10 +120,10 @@ func (t *StateTest) Subtests() []StateSubtest { } // Run executes a specific subtest. -func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) error { +func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, error) { config, ok := Forks[subtest.Fork] if !ok { - return UnsupportedForkError{subtest.Fork} + return nil, UnsupportedForkError{subtest.Fork} } block, _ := t.genesis(config).ToBlock() db, _ := ethdb.NewMemDatabase() @@ -132,7 +132,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) error { post := t.json.Post[subtest.Fork][subtest.Index] msg, err := t.json.Tx.toMessage(post) if err != nil { - return err + return nil, err } context := core.NewEVMContext(msg, block.Header(), nil, &t.json.Env.Coinbase) context.GetHash = vmTestBlockHash @@ -145,13 +145,13 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) error { statedb.RevertToSnapshot(snapshot) } if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) { - return fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) + return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) } root, _ := statedb.CommitTo(db, config.IsEIP158(block.Number())) if root != common.Hash(post.Root) { - return fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root) + return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root) } - return nil + return statedb, nil } func (t *StateTest) gasLimit(subtest StateSubtest) uint64 { From da7d57e07c04dcbb7cc20b35f6606ef3f4c400e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 4 Sep 2017 22:35:00 +0300 Subject: [PATCH 128/272] core: make txpool operate on immutable state --- core/blockchain.go | 12 -- core/error.go | 4 + core/state_transition.go | 8 +- core/tx_list.go | 1 + core/tx_pool.go | 203 +++++++++++++++------------ core/tx_pool_test.go | 281 +++++++++++++------------------------ eth/api_backend.go | 8 -- internal/ethapi/api.go | 1 - internal/ethapi/backend.go | 1 - miner/worker.go | 21 ++- 10 files changed, 233 insertions(+), 307 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index f3ca4e08cf..0bb12fc190 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -81,7 +81,6 @@ type BlockChain struct { hc *HeaderChain chainDb ethdb.Database - rmTxFeed event.Feed rmLogsFeed event.Feed chainFeed event.Feed chainSideFeed event.Feed @@ -1194,15 +1193,9 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { for _, tx := range diff { DeleteTxLookupEntry(bc.chainDb, tx.Hash()) } - // Must be posted in a goroutine because of the transaction pool trying - // to acquire the chain manager lock - if len(diff) > 0 { - go bc.rmTxFeed.Send(RemovedTransactionEvent{diff}) - } if len(deletedLogs) > 0 { go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs}) } - if len(oldChain) > 0 { go func() { for _, block := range oldChain { @@ -1401,11 +1394,6 @@ func (bc *BlockChain) Config() *params.ChainConfig { return bc.config } // Engine retrieves the blockchain's consensus engine. func (bc *BlockChain) Engine() consensus.Engine { return bc.engine } -// SubscribeRemovedTxEvent registers a subscription of RemovedTransactionEvent. -func (bc *BlockChain) SubscribeRemovedTxEvent(ch chan<- RemovedTransactionEvent) event.Subscription { - return bc.scope.Track(bc.rmTxFeed.Subscribe(ch)) -} - // SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription { return bc.scope.Track(bc.rmLogsFeed.Subscribe(ch)) diff --git a/core/error.go b/core/error.go index 9ac4fff514..410eca1e1e 100644 --- a/core/error.go +++ b/core/error.go @@ -28,4 +28,8 @@ var ( // ErrBlacklistedHash is returned if a block to import is on the blacklist. ErrBlacklistedHash = errors.New("blacklisted hash") + + // ErrNonceTooHigh is returned if the nonce of a transaction is higher than the + // next one expected based on the local chain. + ErrNonceTooHigh = errors.New("nonce too high") ) diff --git a/core/state_transition.go b/core/state_transition.go index bab4540be8..e7a0685893 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -18,7 +18,6 @@ package core import ( "errors" - "fmt" "math/big" "github.com/ethereum/go-ethereum/common" @@ -197,8 +196,11 @@ func (st *StateTransition) preCheck() error { // Make sure this transaction's nonce is correct if msg.CheckNonce() { - if n := st.state.GetNonce(sender.Address()); n != msg.Nonce() { - return fmt.Errorf("invalid nonce: have %d, expected %d", msg.Nonce(), n) + nonce := st.state.GetNonce(sender.Address()) + if nonce < msg.Nonce() { + return ErrNonceTooHigh + } else if nonce > msg.Nonce() { + return ErrNonceTooLow } } return st.buyGas() diff --git a/core/tx_list.go b/core/tx_list.go index 1087970fac..2935929d72 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -298,6 +298,7 @@ func (l *txList) Filter(costLimit, gasLimit *big.Int) (types.Transactions, types // If the list was strict, filter anything above the lowest nonce var invalids types.Transactions + if l.strict && len(removed) > 0 { lowest := uint64(math.MaxUint64) for _, tx := range removed { diff --git a/core/tx_pool.go b/core/tx_pool.go index d835c94d1a..f41fbe069a 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -105,10 +105,11 @@ var ( // blockChain provides the state of blockchain and current gas limit to do // some pre checks in tx pool and event subscribers. type blockChain interface { - State() (*state.StateDB, error) - GasLimit() *big.Int + CurrentHeader() *types.Header SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription - SubscribeRemovedTxEvent(ch chan<- RemovedTransactionEvent) event.Subscription + + GetBlock(hash common.Hash, number uint64) *types.Block + StateAt(root common.Hash) (*state.StateDB, error) } // TxPoolConfig are the configuration parameters of the transaction pool. @@ -174,18 +175,19 @@ func (config *TxPoolConfig) sanitize() TxPoolConfig { type TxPool struct { config TxPoolConfig chainconfig *params.ChainConfig - blockChain blockChain - pendingState *state.ManagedState + chain blockChain gasPrice *big.Int txFeed event.Feed scope event.SubscriptionScope chainHeadCh chan ChainHeadEvent chainHeadSub event.Subscription - rmTxCh chan RemovedTransactionEvent - rmTxSub event.Subscription signer types.Signer mu sync.RWMutex + currentState *state.StateDB // Current state in the blockchain head + pendingState *state.ManagedState // Pending state tracking virtual nonces + currentMaxGas *big.Int // Current gas limit for transaction caps + locals *accountSet // Set of local transaction to exepmt from evicion rules journal *txJournal // Journal of local transaction to back up to disk @@ -202,28 +204,26 @@ type TxPool struct { // NewTxPool creates a new transaction pool to gather, sort and filter inbound // trnsactions from the network. -func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, blockChain blockChain) *TxPool { +func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain blockChain) *TxPool { // Sanitize the input to ensure no vulnerable gas prices are set config = (&config).sanitize() // Create the transaction pool with its initial settings pool := &TxPool{ - config: config, - chainconfig: chainconfig, - blockChain: blockChain, - signer: types.NewEIP155Signer(chainconfig.ChainId), - pending: make(map[common.Address]*txList), - queue: make(map[common.Address]*txList), - beats: make(map[common.Address]time.Time), - all: make(map[common.Hash]*types.Transaction), - chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), - rmTxCh: make(chan RemovedTransactionEvent, rmTxChanSize), - gasPrice: new(big.Int).SetUint64(config.PriceLimit), - pendingState: nil, + config: config, + chainconfig: chainconfig, + chain: chain, + signer: types.NewEIP155Signer(chainconfig.ChainId), + pending: make(map[common.Address]*txList), + queue: make(map[common.Address]*txList), + beats: make(map[common.Address]time.Time), + all: make(map[common.Hash]*types.Transaction), + chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), + gasPrice: new(big.Int).SetUint64(config.PriceLimit), } pool.locals = newAccountSet(pool.signer) pool.priced = newTxPricedList(&pool.all) - pool.reset() + pool.reset(nil, chain.CurrentHeader()) // If local transactions and journaling is enabled, load from disk if !config.NoLocals && config.Journal != "" { @@ -237,8 +237,8 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, blockChain } } // Subscribe events from blockchain - pool.chainHeadSub = pool.blockChain.SubscribeChainHeadEvent(pool.chainHeadCh) - pool.rmTxSub = pool.blockChain.SubscribeRemovedTxEvent(pool.rmTxCh) + pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) + // Start the event loop and return pool.wg.Add(1) go pool.loop() @@ -264,31 +264,28 @@ func (pool *TxPool) loop() { journal := time.NewTicker(pool.config.Rejournal) defer journal.Stop() + // Track the previous head headers for transaction reorgs + head := pool.chain.CurrentHeader() + // Keep waiting for and reacting to the various events for { select { // Handle ChainHeadEvent case ev := <-pool.chainHeadCh: - pool.mu.Lock() if ev.Block != nil { + pool.mu.Lock() if pool.chainconfig.IsHomestead(ev.Block.Number()) { pool.homestead = true } + pool.reset(head, ev.Block.Header()) + head = ev.Block.Header() + pool.mu.Unlock() } - pool.reset() - pool.mu.Unlock() // Be unsubscribed due to system stopped case <-pool.chainHeadSub.Err(): return - // Handle RemovedTransactionEvent - case ev := <-pool.rmTxCh: - pool.addTxs(ev.Txs, false) - // Be unsubscribed due to system stopped - case <-pool.rmTxSub.Err(): - return - // Handle stats reporting ticks case <-report.C: pool.mu.RLock() @@ -333,28 +330,76 @@ func (pool *TxPool) loop() { // lockedReset is a wrapper around reset to allow calling it in a thread safe // manner. This method is only ever used in the tester! -func (pool *TxPool) lockedReset() { +func (pool *TxPool) lockedReset(oldHead, newHead *types.Header) { pool.mu.Lock() defer pool.mu.Unlock() - pool.reset() + pool.reset(oldHead, newHead) } // reset retrieves the current state of the blockchain and ensures the content // of the transaction pool is valid with regard to the chain state. -func (pool *TxPool) reset() { - currentState, err := pool.blockChain.State() +func (pool *TxPool) reset(oldHead, newHead *types.Header) { + // If we're reorging an old state, reinject all dropped transactions + var reinject types.Transactions + + if oldHead != nil && oldHead.Hash() != newHead.ParentHash { + var discarded, included types.Transactions + + var ( + rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64()) + add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) + ) + for rem.NumberU64() > add.NumberU64() { + discarded = append(discarded, rem.Transactions()...) + if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { + log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + return + } + } + for add.NumberU64() > rem.NumberU64() { + included = append(included, add.Transactions()...) + if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { + log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + return + } + } + for rem.Hash() != add.Hash() { + discarded = append(discarded, rem.Transactions()...) + if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { + log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + return + } + included = append(included, add.Transactions()...) + if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { + log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + return + } + } + reinject = types.TxDifference(discarded, included) + } + // Initialize the internal state to the current head + if newHead == nil { + newHead = pool.chain.CurrentHeader() // Special case during testing + } + statedb, err := pool.chain.StateAt(newHead.Root) if err != nil { - log.Error("Failed reset txpool state", "err", err) + log.Error("Failed to reset txpool state", "err", err) return } - pool.pendingState = state.ManageState(currentState) + pool.currentState = statedb + pool.pendingState = state.ManageState(statedb) + pool.currentMaxGas = newHead.GasLimit + + // Inject any transactions discarded due to reorgs + log.Debug("Reinjecting stale transactions", "count", len(reinject)) + pool.addTxsLocked(reinject, false) // validate the pool of pending transactions, this will remove // any transactions that have been included in the block or // have been invalidated because of another transaction (e.g. // higher gas price) - pool.demoteUnexecutables(currentState) + pool.demoteUnexecutables() // Update all accounts to the latest known pending nonce for addr, list := range pool.pending { @@ -363,16 +408,16 @@ func (pool *TxPool) reset() { } // Check the queue and move transactions over to the pending if possible // or remove those that have become invalid - pool.promoteExecutables(currentState, nil) + pool.promoteExecutables(nil) } // Stop terminates the transaction pool. func (pool *TxPool) Stop() { // Unsubscribe all subscriptions registered from txpool pool.scope.Close() + // Unsubscribe subscriptions registered from blockchain pool.chainHeadSub.Unsubscribe() - pool.rmTxSub.Unsubscribe() pool.wg.Wait() if pool.journal != nil { @@ -442,8 +487,8 @@ func (pool *TxPool) stats() (int, int) { // Content retrieves the data content of the transaction pool, returning all the // pending as well as queued transactions, grouped by account and sorted by nonce. func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { - pool.mu.RLock() - defer pool.mu.RUnlock() + pool.mu.Lock() + defer pool.mu.Unlock() pending := make(map[common.Address]types.Transactions) for addr, list := range pool.pending { @@ -499,7 +544,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return ErrNegativeValue } // Ensure the transaction doesn't exceed the current block limit gas. - if pool.blockChain.GasLimit().Cmp(tx.Gas()) < 0 { + if pool.currentMaxGas.Cmp(tx.Gas()) < 0 { return ErrGasLimit } // Make sure the transaction is signed properly @@ -513,16 +558,12 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return ErrUnderpriced } // Ensure the transaction adheres to nonce ordering - currentState, err := pool.blockChain.State() - if err != nil { - return err - } - if currentState.GetNonce(from) > tx.Nonce() { + if pool.currentState.GetNonce(from) > tx.Nonce() { return ErrNonceTooLow } // Transactor should have enough funds to cover the costs // cost == V + GP * GL - if currentState.GetBalance(from).Cmp(tx.Cost()) < 0 { + if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 { return ErrInsufficientFunds } intrGas := IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead) @@ -721,12 +762,8 @@ func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { } // If we added a new transaction, run promotion checks and return if !replace { - state, err := pool.blockChain.State() - if err != nil { - return err - } from, _ := types.Sender(pool.signer, tx) // already validated - pool.promoteExecutables(state, []common.Address{from}) + pool.promoteExecutables([]common.Address{from}) } return nil } @@ -736,6 +773,12 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) error { pool.mu.Lock() defer pool.mu.Unlock() + return pool.addTxsLocked(txs, local) +} + +// addTxsLocked attempts to queue a batch of transactions if they are valid, +// whilst assuming the transaction pool lock is already held. +func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) error { // Add the batch of transaction, tracking the accepted ones dirty := make(map[common.Address]struct{}) for _, tx := range txs { @@ -748,15 +791,11 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) error { } // Only reprocess the internal state if something was actually added if len(dirty) > 0 { - state, err := pool.blockChain.State() - if err != nil { - return err - } addrs := make([]common.Address, 0, len(dirty)) for addr, _ := range dirty { addrs = append(addrs, addr) } - pool.promoteExecutables(state, addrs) + pool.promoteExecutables(addrs) } return nil } @@ -770,24 +809,6 @@ func (pool *TxPool) Get(hash common.Hash) *types.Transaction { return pool.all[hash] } -// Remove removes the transaction with the given hash from the pool. -func (pool *TxPool) Remove(hash common.Hash) { - pool.mu.Lock() - defer pool.mu.Unlock() - - pool.removeTx(hash) -} - -// RemoveBatch removes all given transactions from the pool. -func (pool *TxPool) RemoveBatch(txs types.Transactions) { - pool.mu.Lock() - defer pool.mu.Unlock() - - for _, tx := range txs { - pool.removeTx(tx.Hash()) - } -} - // removeTx removes a single transaction from the queue, moving all subsequent // transactions back to the future queue. func (pool *TxPool) removeTx(hash common.Hash) { @@ -834,9 +855,7 @@ func (pool *TxPool) removeTx(hash common.Hash) { // promoteExecutables moves transactions that have become processable from the // future queue to the set of pending transactions. During this process, all // invalidated transactions (low nonce, low balance) are deleted. -func (pool *TxPool) promoteExecutables(state *state.StateDB, accounts []common.Address) { - gaslimit := pool.blockChain.GasLimit() - +func (pool *TxPool) promoteExecutables(accounts []common.Address) { // Gather all the accounts potentially needing updates if accounts == nil { accounts = make([]common.Address, 0, len(pool.queue)) @@ -851,14 +870,14 @@ func (pool *TxPool) promoteExecutables(state *state.StateDB, accounts []common.A continue // Just in case someone calls with a non existing account } // Drop all transactions that are deemed too old (low nonce) - for _, tx := range list.Forward(state.GetNonce(addr)) { + for _, tx := range list.Forward(pool.currentState.GetNonce(addr)) { hash := tx.Hash() log.Trace("Removed old queued transaction", "hash", hash) delete(pool.all, hash) pool.priced.Removed() } // Drop all transactions that are too costly (low balance or out of gas) - drops, _ := list.Filter(state.GetBalance(addr), gaslimit) + drops, _ := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) for _, tx := range drops { hash := tx.Hash() log.Trace("Removed unpayable queued transaction", "hash", hash) @@ -1003,12 +1022,10 @@ func (pool *TxPool) promoteExecutables(state *state.StateDB, accounts []common.A // demoteUnexecutables removes invalid and processed transactions from the pools // executable/pending queue and any subsequent transactions that become unexecutable // are moved back into the future queue. -func (pool *TxPool) demoteUnexecutables(state *state.StateDB) { - gaslimit := pool.blockChain.GasLimit() - +func (pool *TxPool) demoteUnexecutables() { // Iterate over all accounts and demote any non-executable transactions for addr, list := range pool.pending { - nonce := state.GetNonce(addr) + nonce := pool.currentState.GetNonce(addr) // Drop all transactions that are deemed too old (low nonce) for _, tx := range list.Forward(nonce) { @@ -1018,7 +1035,7 @@ func (pool *TxPool) demoteUnexecutables(state *state.StateDB) { pool.priced.Removed() } // Drop all transactions that are too costly (low balance or out of gas), and queue any invalids back for later - drops, invalids := list.Filter(state.GetBalance(addr), gaslimit) + drops, invalids := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) for _, tx := range drops { hash := tx.Hash() log.Trace("Removed unpayable pending transaction", "hash", hash) @@ -1031,6 +1048,14 @@ func (pool *TxPool) demoteUnexecutables(state *state.StateDB) { log.Trace("Demoting pending transaction", "hash", hash) pool.enqueueTx(hash, tx) } + // If there's a gap in front, warn (should never happen) and postpone all transactions + if list.Len() > 0 && list.txs.Get(nonce) == nil { + for _, tx := range list.Cap(0) { + hash := tx.Hash() + log.Error("Demoting invalidated transaction", "hash", hash) + pool.enqueueTx(hash, tx) + } + } // Delete the entire queue entry if it became empty. if list.Empty() { delete(pool.pending, addr) diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index c1bcb1b2d6..cdd45b4b1d 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -48,23 +48,24 @@ type testBlockChain struct { statedb *state.StateDB gasLimit *big.Int chainHeadFeed *event.Feed - rmTxFeed *event.Feed } -func (bc *testBlockChain) State() (*state.StateDB, error) { - return bc.statedb, nil -} - -func (bc *testBlockChain) GasLimit() *big.Int { - return new(big.Int).Set(bc.gasLimit) +func (bc *testBlockChain) CurrentHeader() *types.Header { + return &types.Header{ + GasLimit: bc.gasLimit, + } } func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { return bc.chainHeadFeed.Subscribe(ch) } -func (bc *testBlockChain) SubscribeRemovedTxEvent(ch chan<- RemovedTransactionEvent) event.Subscription { - return bc.rmTxFeed.Subscribe(ch) +func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { + return types.NewBlock(bc.CurrentHeader(), nil, nil, nil) +} + +func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { + return bc.statedb, nil } func transaction(nonce uint64, gaslimit *big.Int, key *ecdsa.PrivateKey) *types.Transaction { @@ -79,7 +80,7 @@ func pricedTransaction(nonce uint64, gaslimit, gasprice *big.Int, key *ecdsa.Pri func setupTxPool() (*TxPool, *ecdsa.PrivateKey) { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} key, _ := crypto.GenerateKey() pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -159,7 +160,7 @@ func TestStateChangeDuringPoolReset(t *testing.T) { // setup pool with 2 transaction in it statedb.SetBalance(address, new(big.Int).SetUint64(params.Ether)) - blockchain := &testChain{&testBlockChain{statedb, big.NewInt(1000000000), new(event.Feed), new(event.Feed)}, address, &trigger} + blockchain := &testChain{&testBlockChain{statedb, big.NewInt(1000000000), new(event.Feed)}, address, &trigger} tx0 := transaction(0, big.NewInt(100000), key) tx1 := transaction(1, big.NewInt(100000), key) @@ -182,7 +183,7 @@ func TestStateChangeDuringPoolReset(t *testing.T) { // trigger state change in the background trigger = true - pool.lockedReset() + pool.lockedReset(nil, nil) pendingTx, err := pool.Pending() if err != nil { @@ -205,20 +206,20 @@ func TestInvalidTransactions(t *testing.T) { tx := transaction(0, big.NewInt(100), key) from, _ := deriveSender(tx) - currentState, _ := pool.blockChain.State() - currentState.AddBalance(from, big.NewInt(1)) + + pool.currentState.AddBalance(from, big.NewInt(1)) if err := pool.AddRemote(tx); err != ErrInsufficientFunds { t.Error("expected", ErrInsufficientFunds) } balance := new(big.Int).Add(tx.Value(), new(big.Int).Mul(tx.Gas(), tx.GasPrice())) - currentState.AddBalance(from, balance) + pool.currentState.AddBalance(from, balance) if err := pool.AddRemote(tx); err != ErrIntrinsicGas { t.Error("expected", ErrIntrinsicGas, "got", err) } - currentState.SetNonce(from, 1) - currentState.AddBalance(from, big.NewInt(0xffffffffffffff)) + pool.currentState.SetNonce(from, 1) + pool.currentState.AddBalance(from, big.NewInt(0xffffffffffffff)) tx = transaction(0, big.NewInt(100000), key) if err := pool.AddRemote(tx); err != ErrNonceTooLow { t.Error("expected", ErrNonceTooLow) @@ -240,21 +241,20 @@ func TestTransactionQueue(t *testing.T) { tx := transaction(0, big.NewInt(100), key) from, _ := deriveSender(tx) - currentState, _ := pool.blockChain.State() - currentState.AddBalance(from, big.NewInt(1000)) - pool.lockedReset() + pool.currentState.AddBalance(from, big.NewInt(1000)) + pool.lockedReset(nil, nil) pool.enqueueTx(tx.Hash(), tx) - pool.promoteExecutables(currentState, []common.Address{from}) + pool.promoteExecutables([]common.Address{from}) if len(pool.pending) != 1 { t.Error("expected valid txs to be 1 is", len(pool.pending)) } tx = transaction(1, big.NewInt(100), key) from, _ = deriveSender(tx) - currentState.SetNonce(from, 2) + pool.currentState.SetNonce(from, 2) pool.enqueueTx(tx.Hash(), tx) - pool.promoteExecutables(currentState, []common.Address{from}) + pool.promoteExecutables([]common.Address{from}) if _, ok := pool.pending[from].txs.items[tx.Nonce()]; ok { t.Error("expected transaction to be in tx pool") } @@ -270,15 +270,14 @@ func TestTransactionQueue(t *testing.T) { tx2 := transaction(10, big.NewInt(100), key) tx3 := transaction(11, big.NewInt(100), key) from, _ = deriveSender(tx1) - currentState, _ = pool.blockChain.State() - currentState.AddBalance(from, big.NewInt(1000)) - pool.lockedReset() + pool.currentState.AddBalance(from, big.NewInt(1000)) + pool.lockedReset(nil, nil) pool.enqueueTx(tx1.Hash(), tx1) pool.enqueueTx(tx2.Hash(), tx2) pool.enqueueTx(tx3.Hash(), tx3) - pool.promoteExecutables(currentState, []common.Address{from}) + pool.promoteExecutables([]common.Address{from}) if len(pool.pending) != 1 { t.Error("expected tx pool to be 1, got", len(pool.pending)) @@ -288,45 +287,13 @@ func TestTransactionQueue(t *testing.T) { } } -func TestRemoveTx(t *testing.T) { - pool, key := setupTxPool() - defer pool.Stop() - - addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.blockChain.State() - currentState.AddBalance(addr, big.NewInt(1)) - - tx1 := transaction(0, big.NewInt(100), key) - tx2 := transaction(2, big.NewInt(100), key) - - pool.promoteTx(addr, tx1.Hash(), tx1) - pool.enqueueTx(tx2.Hash(), tx2) - - if len(pool.queue) != 1 { - t.Error("expected queue to be 1, got", len(pool.queue)) - } - if len(pool.pending) != 1 { - t.Error("expected pending to be 1, got", len(pool.pending)) - } - pool.Remove(tx1.Hash()) - pool.Remove(tx2.Hash()) - - if len(pool.queue) > 0 { - t.Error("expected queue to be 0, got", len(pool.queue)) - } - if len(pool.pending) > 0 { - t.Error("expected pending to be 0, got", len(pool.pending)) - } -} - func TestNegativeValue(t *testing.T) { pool, key := setupTxPool() defer pool.Stop() tx, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(-1), big.NewInt(100), big.NewInt(1), nil), types.HomesteadSigner{}, key) from, _ := deriveSender(tx) - currentState, _ := pool.blockChain.State() - currentState.AddBalance(from, big.NewInt(1)) + pool.currentState.AddBalance(from, big.NewInt(1)) if err := pool.AddRemote(tx); err != ErrNegativeValue { t.Error("expected", ErrNegativeValue, "got", err) } @@ -340,10 +307,10 @@ func TestTransactionChainFork(t *testing.T) { resetState := func() { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - pool.blockChain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} - currentState, _ := pool.blockChain.State() - currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.lockedReset() + statedb.AddBalance(addr, big.NewInt(100000000000000)) + + pool.chain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + pool.lockedReset(nil, nil) } resetState() @@ -351,7 +318,7 @@ func TestTransactionChainFork(t *testing.T) { if _, err := pool.add(tx, false); err != nil { t.Error("didn't expect error", err) } - pool.RemoveBatch([]*types.Transaction{tx}) + pool.removeTx(tx.Hash()) // reset the pool's internal state resetState() @@ -368,10 +335,10 @@ func TestTransactionDoubleNonce(t *testing.T) { resetState := func() { db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - pool.blockChain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} - currentState, _ := pool.blockChain.State() - currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.lockedReset() + statedb.AddBalance(addr, big.NewInt(100000000000000)) + + pool.chain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + pool.lockedReset(nil, nil) } resetState() @@ -387,8 +354,7 @@ func TestTransactionDoubleNonce(t *testing.T) { if replace, err := pool.add(tx2, false); err != nil || !replace { t.Errorf("second transaction insert failed (%v) or not reported replacement (%v)", err, replace) } - state, _ := pool.blockChain.State() - pool.promoteExecutables(state, []common.Address{addr}) + pool.promoteExecutables([]common.Address{addr}) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) } @@ -397,7 +363,7 @@ func TestTransactionDoubleNonce(t *testing.T) { } // Add the third transaction and ensure it's not saved (smaller price) pool.add(tx3, false) - pool.promoteExecutables(state, []common.Address{addr}) + pool.promoteExecutables([]common.Address{addr}) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) } @@ -415,8 +381,7 @@ func TestMissingNonce(t *testing.T) { defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.blockChain.State() - currentState.AddBalance(addr, big.NewInt(100000000000000)) + pool.currentState.AddBalance(addr, big.NewInt(100000000000000)) tx := transaction(1, big.NewInt(100000), key) if _, err := pool.add(tx, false); err != nil { t.Error("didn't expect error", err) @@ -432,47 +397,25 @@ func TestMissingNonce(t *testing.T) { } } -func TestNonceRecovery(t *testing.T) { +func TestTransactionNonceRecovery(t *testing.T) { const n = 10 pool, key := setupTxPool() defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.blockChain.State() - currentState.SetNonce(addr, n) - currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.lockedReset() + pool.currentState.SetNonce(addr, n) + pool.currentState.AddBalance(addr, big.NewInt(100000000000000)) + pool.lockedReset(nil, nil) + tx := transaction(n, big.NewInt(100000), key) if err := pool.AddRemote(tx); err != nil { t.Error(err) } // simulate some weird re-order of transactions and missing nonce(s) - currentState.SetNonce(addr, n-1) - pool.lockedReset() - if fn := pool.pendingState.GetNonce(addr); fn != n+1 { - t.Errorf("expected nonce to be %d, got %d", n+1, fn) - } -} - -func TestRemovedTxEvent(t *testing.T) { - pool, key := setupTxPool() - defer pool.Stop() - - tx := transaction(0, big.NewInt(1000000), key) - from, _ := deriveSender(tx) - currentState, _ := pool.blockChain.State() - currentState.AddBalance(from, big.NewInt(1000000000000)) - pool.lockedReset() - blockChain, _ := pool.blockChain.(*testBlockChain) - blockChain.rmTxFeed.Send(RemovedTransactionEvent{types.Transactions{tx}}) - blockChain.chainHeadFeed.Send(ChainHeadEvent{nil}) - // wait for handling events - <-time.After(500 * time.Millisecond) - if pool.pending[from].Len() != 1 { - t.Error("expected 1 pending tx, got", pool.pending[from].Len()) - } - if len(pool.all) != 1 { - t.Error("expected 1 total transactions, got", len(pool.all)) + pool.currentState.SetNonce(addr, n-1) + pool.lockedReset(nil, nil) + if fn := pool.pendingState.GetNonce(addr); fn != n-1 { + t.Errorf("expected nonce to be %d, got %d", n-1, fn) } } @@ -484,9 +427,7 @@ func TestTransactionDropping(t *testing.T) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000)) + pool.currentState.AddBalance(account, big.NewInt(1000)) // Add some pending and some queued transactions var ( @@ -514,7 +455,7 @@ func TestTransactionDropping(t *testing.T) { if len(pool.all) != 6 { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), 6) } - pool.lockedReset() + pool.lockedReset(nil, nil) if pool.pending[account].Len() != 3 { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) } @@ -525,8 +466,8 @@ func TestTransactionDropping(t *testing.T) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), 6) } // Reduce the balance of the account, and check that invalidated transactions are dropped - state.AddBalance(account, big.NewInt(-650)) - pool.lockedReset() + pool.currentState.AddBalance(account, big.NewInt(-650)) + pool.lockedReset(nil, nil) if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -550,8 +491,8 @@ func TestTransactionDropping(t *testing.T) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), 4) } // Reduce the block gas limit, check that invalidated transactions are dropped - pool.blockChain.(*testBlockChain).gasLimit = big.NewInt(100) - pool.lockedReset() + pool.chain.(*testBlockChain).gasLimit = big.NewInt(100) + pool.lockedReset(nil, nil) if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -579,9 +520,7 @@ func TestTransactionPostponing(t *testing.T) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000)) + pool.currentState.AddBalance(account, big.NewInt(1000)) // Add a batch consecutive pending transactions for validation txns := []*types.Transaction{} @@ -605,7 +544,7 @@ func TestTransactionPostponing(t *testing.T) { if len(pool.all) != len(txns) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), len(txns)) } - pool.lockedReset() + pool.lockedReset(nil, nil) if pool.pending[account].Len() != len(txns) { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), len(txns)) } @@ -616,8 +555,8 @@ func TestTransactionPostponing(t *testing.T) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), len(txns)) } // Reduce the balance of the account, and check that transactions are reorganised - state.AddBalance(account, big.NewInt(-750)) - pool.lockedReset() + pool.currentState.AddBalance(account, big.NewInt(-750)) + pool.lockedReset(nil, nil) if _, ok := pool.pending[account].txs.items[txns[0].Nonce()]; !ok { t.Errorf("tx %d: valid and funded transaction missing from pending pool: %v", 0, txns[0]) @@ -655,10 +594,7 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000000)) - pool.lockedReset() + pool.currentState.AddBalance(account, big.NewInt(1000000)) // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(1); i <= testTxPoolConfig.AccountQueue+5; i++ { @@ -699,7 +635,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.NoLocals = nolocals @@ -709,12 +645,10 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { defer pool.Stop() // Create a number of test accounts and fund them (last one will be the local) - state, _ := pool.blockChain.State() - keys := make([]*ecdsa.PrivateKey, 5) for i := 0; i < len(keys); i++ { keys[i], _ = crypto.GenerateKey() - state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) } local := keys[len(keys)-1] @@ -790,7 +724,7 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { // Create the pool to test the non-expiration enforcement db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.Lifetime = time.Second @@ -803,9 +737,8 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { local, _ := crypto.GenerateKey() remote, _ := crypto.GenerateKey() - state, _ := pool.blockChain.State() - state.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) - state.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) // Add the two transactions and ensure they both are queued up if err := pool.AddLocal(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), local)); err != nil { @@ -854,10 +787,7 @@ func TestTransactionPendingLimiting(t *testing.T) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000000)) - pool.lockedReset() + pool.currentState.AddBalance(account, big.NewInt(1000000)) // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { @@ -887,8 +817,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { defer pool1.Stop() account1, _ := deriveSender(transaction(0, big.NewInt(0), key1)) - state1, _ := pool1.blockChain.State() - state1.AddBalance(account1, big.NewInt(1000000)) + pool1.currentState.AddBalance(account1, big.NewInt(1000000)) for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { if err := pool1.AddRemote(transaction(origin+i, big.NewInt(100000), key1)); err != nil { @@ -900,8 +829,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { defer pool2.Stop() account2, _ := deriveSender(transaction(0, big.NewInt(0), key2)) - state2, _ := pool2.blockChain.State() - state2.AddBalance(account2, big.NewInt(1000000)) + pool2.currentState.AddBalance(account2, big.NewInt(1000000)) txns := []*types.Transaction{} for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { @@ -934,7 +862,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.GlobalSlots = config.AccountSlots * 10 @@ -943,12 +871,10 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.blockChain.State() - keys := make([]*ecdsa.PrivateKey, 5) for i := 0; i < len(keys); i++ { keys[i], _ = crypto.GenerateKey() - state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) } // Generate and queue a batch of transactions nonces := make(map[common.Address]uint64) @@ -981,7 +907,7 @@ func TestTransactionCapClearsFromAll(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.AccountSlots = 2 @@ -992,11 +918,9 @@ func TestTransactionCapClearsFromAll(t *testing.T) { defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.blockChain.State() - key, _ := crypto.GenerateKey() addr := crypto.PubkeyToAddress(key.PublicKey) - state.AddBalance(addr, big.NewInt(1000000)) + pool.currentState.AddBalance(addr, big.NewInt(1000000)) txs := types.Transactions{} for j := 0; j < int(config.GlobalSlots)*2; j++ { @@ -1016,7 +940,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.GlobalSlots = 0 @@ -1025,12 +949,10 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.blockChain.State() - keys := make([]*ecdsa.PrivateKey, 5) for i := 0; i < len(keys); i++ { keys[i], _ = crypto.GenerateKey() - state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) } // Generate and queue a batch of transactions nonces := make(map[common.Address]uint64) @@ -1065,18 +987,16 @@ func TestTransactionPoolRepricing(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.blockChain.State() - keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { keys[i], _ = crypto.GenerateKey() - state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) } // Generate and queue a batch of transactions, both pending and queued txs := types.Transactions{} @@ -1147,18 +1067,16 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.blockChain.State() - keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { keys[i], _ = crypto.GenerateKey() - state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000*1000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000*1000000)) } // Create transaction (both pending and queued) with a linearly growing gasprice for i := uint64(0); i < 500; i++ { @@ -1189,11 +1107,11 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { } } validate() - + // Reprice the pool and check that nothing is dropped pool.SetGasPrice(big.NewInt(2)) validate() - + pool.SetGasPrice(big.NewInt(2)) pool.SetGasPrice(big.NewInt(4)) pool.SetGasPrice(big.NewInt(8)) @@ -1210,7 +1128,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.GlobalSlots = 2 @@ -1220,12 +1138,10 @@ func TestTransactionPoolUnderpricing(t *testing.T) { defer pool.Stop() // Create a number of test accounts and fund them - state, _ := pool.blockChain.State() - keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { keys[i], _ = crypto.GenerateKey() - state.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000)) } // Generate and queue a batch of transactions, both pending and queued txs := types.Transactions{} @@ -1298,16 +1214,14 @@ func TestTransactionReplacement(t *testing.T) { // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() // Create a test account to add transactions with key, _ := crypto.GenerateKey() - - state, _ := pool.blockChain.State() - state.AddBalance(crypto.PubkeyToAddress(key.PublicKey), big.NewInt(1000000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(key.PublicKey), big.NewInt(1000000000)) // Add pending transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) price := int64(100) @@ -1378,7 +1292,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { // Create the original pool to inject transaction into the journal db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) - blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} config := testTxPoolConfig config.NoLocals = nolocals @@ -1391,9 +1305,8 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { local, _ := crypto.GenerateKey() remote, _ := crypto.GenerateKey() - statedb, _ = pool.blockChain.State() - statedb.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) - statedb.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(local.PublicKey), big.NewInt(1000000000)) + pool.currentState.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000)) // Add three local and a remote transactions and ensure they are queued up if err := pool.AddLocal(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), local)); err != nil { @@ -1421,7 +1334,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { // Terminate the old pool, bump the local nonce, create a new pool and ensure relevant transaction survive pool.Stop() statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) - blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} pool = NewTxPool(config, params.TestChainConfig, blockchain) pending, queued = pool.Stats() @@ -1442,11 +1355,11 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { } // Bump the nonce temporarily and ensure the newly invalidated transaction is removed statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 2) - pool.lockedReset() + pool.lockedReset(nil, nil) time.Sleep(2 * config.Rejournal) pool.Stop() statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) - blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed), new(event.Feed)} + blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} pool = NewTxPool(config, params.TestChainConfig, blockchain) pending, queued = pool.Stats() @@ -1480,8 +1393,7 @@ func benchmarkPendingDemotion(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000000)) + pool.currentState.AddBalance(account, big.NewInt(1000000)) for i := 0; i < size; i++ { tx := transaction(uint64(i), big.NewInt(100000), key) @@ -1490,7 +1402,7 @@ func benchmarkPendingDemotion(b *testing.B, size int) { // Benchmark the speed of pool validation b.ResetTimer() for i := 0; i < b.N; i++ { - pool.demoteUnexecutables(state) + pool.demoteUnexecutables() } } @@ -1506,8 +1418,7 @@ func benchmarkFuturePromotion(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000000)) + pool.currentState.AddBalance(account, big.NewInt(1000000)) for i := 0; i < size; i++ { tx := transaction(uint64(1+i), big.NewInt(100000), key) @@ -1516,7 +1427,7 @@ func benchmarkFuturePromotion(b *testing.B, size int) { // Benchmark the speed of pool validation b.ResetTimer() for i := 0; i < b.N; i++ { - pool.promoteExecutables(state, nil) + pool.promoteExecutables(nil) } } @@ -1527,8 +1438,7 @@ func BenchmarkPoolInsert(b *testing.B) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000000)) + pool.currentState.AddBalance(account, big.NewInt(1000000)) txs := make(types.Transactions, b.N) for i := 0; i < b.N; i++ { @@ -1552,8 +1462,7 @@ func benchmarkPoolBatchInsert(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.blockChain.State() - state.AddBalance(account, big.NewInt(1000000)) + pool.currentState.AddBalance(account, big.NewInt(1000000)) batches := make([]types.Transactions, b.N) for i := 0; i < b.N; i++ { diff --git a/eth/api_backend.go b/eth/api_backend.go index abf52326b6..19ef79f234 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -115,10 +115,6 @@ func (b *EthApiBackend) GetEVM(ctx context.Context, msg core.Message, state *sta return vm.NewEVM(context, state, b.eth.chainConfig, vmCfg), vmError, nil } -func (b *EthApiBackend) SubscribeRemovedTxEvent(ch chan<- core.RemovedTransactionEvent) event.Subscription { - return b.eth.BlockChain().SubscribeRemovedTxEvent(ch) -} - func (b *EthApiBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { return b.eth.BlockChain().SubscribeRemovedLogsEvent(ch) } @@ -143,10 +139,6 @@ func (b *EthApiBackend) SendTx(ctx context.Context, signedTx *types.Transaction) return b.eth.txPool.AddLocal(signedTx) } -func (b *EthApiBackend) RemoveTx(txHash common.Hash) { - b.eth.txPool.Remove(txHash) -} - func (b *EthApiBackend) GetPoolTransactions() (types.Transactions, error) { pending, err := b.eth.txPool.Pending() if err != nil { diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 30710aaabd..0775749e70 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1265,7 +1265,6 @@ func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxAr if err != nil { return common.Hash{}, err } - s.b.RemoveTx(p.Hash()) if err = s.b.SendTx(ctx, signedTx); err != nil { return common.Hash{}, err } diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index be17ffeae4..368fa48726 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -59,7 +59,6 @@ type Backend interface { // TxPool API SendTx(ctx context.Context, signedTx *types.Transaction) error - RemoveTx(txHash common.Hash) GetPoolTransactions() (types.Transactions, error) GetPoolTransaction(txHash common.Hash) *types.Transaction GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) diff --git a/miner/worker.go b/miner/worker.go index 24e03be60a..5bac5d6e85 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -71,7 +71,6 @@ type Work struct { family *set.Set // family set (used for checking uncle invalidity) uncles *set.Set // uncle set tcount int // tx count in cycle - failedTxs types.Transactions Block *types.Block // the new block @@ -477,8 +476,6 @@ func (self *worker) commitNewWork() { txs := types.NewTransactionsByPriceAndNonce(pending) work.commitTransactions(self.mux, txs, self.chain, self.coinbase) - self.eth.TxPool().RemoveBatch(work.failedTxs) - // compute uncles for the new block. var ( uncles []*types.Header @@ -563,6 +560,16 @@ func (env *Work) commitTransactions(mux *event.TypeMux, txs *types.TransactionsB log.Trace("Gas limit exceeded for current block", "sender", from) txs.Pop() + case core.ErrNonceTooLow: + // New head notification data race between the transaction pool and miner, shift + log.Trace("Skipping transaction with low nonce", "sender", from, "nonce", tx.Nonce()) + txs.Shift() + + case core.ErrNonceTooHigh: + // Reorg notification data race between the transaction pool and miner, skip account = + log.Trace("Skipping account with hight nonce", "sender", from, "nonce", tx.Nonce()) + txs.Pop() + case nil: // Everything ok, collect the logs and shift in the next transaction from the same account coalescedLogs = append(coalescedLogs, logs...) @@ -570,10 +577,10 @@ func (env *Work) commitTransactions(mux *event.TypeMux, txs *types.TransactionsB txs.Shift() default: - // Pop the current failed transaction without shifting in the next from the account - log.Trace("Transaction failed, will be removed", "hash", tx.Hash(), "err", err) - env.failedTxs = append(env.failedTxs, tx) - txs.Pop() + // Strange error, discard the transaction and get the next in line (note, the + // nonce-too-high clause will prevent us from executing in vain). + log.Debug("Transaction failed, account skipped", "hash", tx.Hash(), "err", err) + txs.Shift() } } From 2bacf36d8095ac7936f69552e2727ac6f276479f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Tr=C3=B3n?= Date: Tue, 5 Sep 2017 12:38:36 +0200 Subject: [PATCH 129/272] bmt: Binary Merkle Tree Hash (#14334) bmt is a new package that provides hashers for binary merkle tree hashes on size-limited chunks. the main motivation is that using BMT hash as the chunk hash of the swarm hash offers logsize inclusion proofs for arbitrary files on a 32-byte resolution completely viable to use in challenges on the blockchain. --- bmt/bmt.go | 562 +++++++++++++++++++++++++++++++++++++++ bmt/bmt_r.go | 85 ++++++ bmt/bmt_test.go | 481 +++++++++++++++++++++++++++++++++ swarm/storage/chunker.go | 3 +- swarm/storage/types.go | 1 + 5 files changed, 1131 insertions(+), 1 deletion(-) create mode 100644 bmt/bmt.go create mode 100644 bmt/bmt_r.go create mode 100644 bmt/bmt_test.go diff --git a/bmt/bmt.go b/bmt/bmt.go new file mode 100644 index 0000000000..d62365bb1f --- /dev/null +++ b/bmt/bmt.go @@ -0,0 +1,562 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package bmt provides a binary merkle tree implementation +package bmt + +import ( + "fmt" + "hash" + "io" + "strings" + "sync" + "sync/atomic" +) + +/* +Binary Merkle Tree Hash is a hash function over arbitrary datachunks of limited size +It is defined as the root hash of the binary merkle tree built over fixed size segments +of the underlying chunk using any base hash function (e.g keccak 256 SHA3) + +It is used as the chunk hash function in swarm which in turn is the basis for the +128 branching swarm hash http://swarm-guide.readthedocs.io/en/latest/architecture.html#swarm-hash + +The BMT is optimal for providing compact inclusion proofs, i.e. prove that a +segment is a substring of a chunk starting at a particular offset +The size of the underlying segments is fixed at 32 bytes (called the resolution +of the BMT hash), the EVM word size to optimize for on-chain BMT verification +as well as the hash size optimal for inclusion proofs in the merkle tree of the swarm hash. + +Two implementations are provided: + +* RefHasher is optimized for code simplicity and meant as a reference implementation +* Hasher is optimized for speed taking advantage of concurrency with minimalistic + control structure to coordinate the concurrent routines + It implements the ChunkHash interface as well as the go standard hash.Hash interface + +*/ + +const ( + // DefaultSegmentCount is the maximum number of segments of the underlying chunk + DefaultSegmentCount = 128 // Should be equal to storage.DefaultBranches + // DefaultPoolSize is the maximum number of bmt trees used by the hashers, i.e, + // the maximum number of concurrent BMT hashing operations performed by the same hasher + DefaultPoolSize = 8 +) + +// BaseHasher is a hash.Hash constructor function used for the base hash of the BMT. +type BaseHasher func() hash.Hash + +// Hasher a reusable hasher for fixed maximum size chunks representing a BMT +// implements the hash.Hash interface +// reuse pool of Tree-s for amortised memory allocation and resource control +// supports order-agnostic concurrent segment writes +// as well as sequential read and write +// can not be called concurrently on more than one chunk +// can be further appended after Sum +// Reset gives back the Tree to the pool and guaranteed to leave +// the tree and itself in a state reusable for hashing a new chunk +type Hasher struct { + pool *TreePool // BMT resource pool + bmt *Tree // prebuilt BMT resource for flowcontrol and proofs + blocksize int // segment size (size of hash) also for hash.Hash + count int // segment count + size int // for hash.Hash same as hashsize + cur int // cursor position for righmost currently open chunk + segment []byte // the rightmost open segment (not complete) + depth int // index of last level + result chan []byte // result channel + hash []byte // to record the result + max int32 // max segments for SegmentWriter interface + blockLength []byte // The block length that needes to be added in Sum +} + +// New creates a reusable Hasher +// implements the hash.Hash interface +// pulls a new Tree from a resource pool for hashing each chunk +func New(p *TreePool) *Hasher { + return &Hasher{ + pool: p, + depth: depth(p.SegmentCount), + size: p.SegmentSize, + blocksize: p.SegmentSize, + count: p.SegmentCount, + result: make(chan []byte), + } +} + +// Node is a reuseable segment hasher representing a node in a BMT +// it allows for continued writes after a Sum +// and is left in completely reusable state after Reset +type Node struct { + level, index int // position of node for information/logging only + initial bool // first and last node + root bool // whether the node is root to a smaller BMT + isLeft bool // whether it is left side of the parent double segment + unbalanced bool // indicates if a node has only the left segment + parent *Node // BMT connections + state int32 // atomic increment impl concurrent boolean toggle + left, right []byte +} + +// NewNode constructor for segment hasher nodes in the BMT +func NewNode(level, index int, parent *Node) *Node { + return &Node{ + parent: parent, + level: level, + index: index, + initial: index == 0, + isLeft: index%2 == 0, + } +} + +// TreePool provides a pool of Trees used as resources by Hasher +// a Tree popped from the pool is guaranteed to have clean state +// for hashing a new chunk +// Hasher Reset releases the Tree to the pool +type TreePool struct { + lock sync.Mutex + c chan *Tree + hasher BaseHasher + SegmentSize int + SegmentCount int + Capacity int + count int +} + +// NewTreePool creates a Tree pool with hasher, segment size, segment count and capacity +// on GetTree it reuses free Trees or creates a new one if size is not reached +func NewTreePool(hasher BaseHasher, segmentCount, capacity int) *TreePool { + return &TreePool{ + c: make(chan *Tree, capacity), + hasher: hasher, + SegmentSize: hasher().Size(), + SegmentCount: segmentCount, + Capacity: capacity, + } +} + +// Drain drains the pool uptil it has no more than n resources +func (self *TreePool) Drain(n int) { + self.lock.Lock() + defer self.lock.Unlock() + for len(self.c) > n { + <-self.c + self.count-- + } +} + +// Reserve is blocking until it returns an available Tree +// it reuses free Trees or creates a new one if size is not reached +func (self *TreePool) Reserve() *Tree { + self.lock.Lock() + defer self.lock.Unlock() + var t *Tree + if self.count == self.Capacity { + return <-self.c + } + select { + case t = <-self.c: + default: + t = NewTree(self.hasher, self.SegmentSize, self.SegmentCount) + self.count++ + } + return t +} + +// Release gives back a Tree to the pool. +// This Tree is guaranteed to be in reusable state +// does not need locking +func (self *TreePool) Release(t *Tree) { + self.c <- t // can never fail but... +} + +// Tree is a reusable control structure representing a BMT +// organised in a binary tree +// Hasher uses a TreePool to pick one for each chunk hash +// the Tree is 'locked' while not in the pool +type Tree struct { + leaves []*Node +} + +// Draw draws the BMT (badly) +func (self *Tree) Draw(hash []byte, d int) string { + var left, right []string + var anc []*Node + for i, n := range self.leaves { + left = append(left, fmt.Sprintf("%v", hashstr(n.left))) + if i%2 == 0 { + anc = append(anc, n.parent) + } + right = append(right, fmt.Sprintf("%v", hashstr(n.right))) + } + anc = self.leaves + var hashes [][]string + for l := 0; len(anc) > 0; l++ { + var nodes []*Node + hash := []string{""} + for i, n := range anc { + hash = append(hash, fmt.Sprintf("%v|%v", hashstr(n.left), hashstr(n.right))) + if i%2 == 0 && n.parent != nil { + nodes = append(nodes, n.parent) + } + } + hash = append(hash, "") + hashes = append(hashes, hash) + anc = nodes + } + hashes = append(hashes, []string{"", fmt.Sprintf("%v", hashstr(hash)), ""}) + total := 60 + del := " " + var rows []string + for i := len(hashes) - 1; i >= 0; i-- { + var textlen int + hash := hashes[i] + for _, s := range hash { + textlen += len(s) + } + if total < textlen { + total = textlen + len(hash) + } + delsize := (total - textlen) / (len(hash) - 1) + if delsize > len(del) { + delsize = len(del) + } + row := fmt.Sprintf("%v: %v", len(hashes)-i-1, strings.Join(hash, del[:delsize])) + rows = append(rows, row) + + } + rows = append(rows, strings.Join(left, " ")) + rows = append(rows, strings.Join(right, " ")) + return strings.Join(rows, "\n") + "\n" +} + +// NewTree initialises the Tree by building up the nodes of a BMT +// segment size is stipulated to be the size of the hash +// segmentCount needs to be positive integer and does not need to be +// a power of two and can even be an odd number +// segmentSize * segmentCount determines the maximum chunk size +// hashed using the tree +func NewTree(hasher BaseHasher, segmentSize, segmentCount int) *Tree { + n := NewNode(0, 0, nil) + n.root = true + prevlevel := []*Node{n} + // iterate over levels and creates 2^level nodes + level := 1 + count := 2 + for d := 1; d <= depth(segmentCount); d++ { + nodes := make([]*Node, count) + for i := 0; i < len(nodes); i++ { + var parent *Node + parent = prevlevel[i/2] + t := NewNode(level, i, parent) + nodes[i] = t + } + prevlevel = nodes + level++ + count *= 2 + } + // the datanode level is the nodes on the last level where + return &Tree{ + leaves: prevlevel, + } +} + +// methods needed by hash.Hash + +// Size returns the size +func (self *Hasher) Size() int { + return self.size +} + +// BlockSize returns the block size +func (self *Hasher) BlockSize() int { + return self.blocksize +} + +// Sum returns the hash of the buffer +// hash.Hash interface Sum method appends the byte slice to the underlying +// data before it calculates and returns the hash of the chunk +func (self *Hasher) Sum(b []byte) (r []byte) { + t := self.bmt + i := self.cur + n := t.leaves[i] + j := i + // must run strictly before all nodes calculate + // datanodes are guaranteed to have a parent + if len(self.segment) > self.size && i > 0 && n.parent != nil { + n = n.parent + } else { + i *= 2 + } + d := self.finalise(n, i) + self.writeSegment(j, self.segment, d) + c := <-self.result + self.releaseTree() + + // sha3(length + BMT(pure_chunk)) + if self.blockLength == nil { + return c + } + res := self.pool.hasher() + res.Reset() + res.Write(self.blockLength) + res.Write(c) + return res.Sum(nil) +} + +// Hasher implements the SwarmHash interface + +// Hash waits for the hasher result and returns it +// caller must call this on a BMT Hasher being written to +func (self *Hasher) Hash() []byte { + return <-self.result +} + +// Hasher implements the io.Writer interface + +// Write fills the buffer to hash +// with every full segment complete launches a hasher go routine +// that shoots up the BMT +func (self *Hasher) Write(b []byte) (int, error) { + l := len(b) + if l <= 0 { + return 0, nil + } + s := self.segment + i := self.cur + count := (self.count + 1) / 2 + need := self.count*self.size - self.cur*2*self.size + size := self.size + if need > size { + size *= 2 + } + if l < need { + need = l + } + // calculate missing bit to complete current open segment + rest := size - len(s) + if need < rest { + rest = need + } + s = append(s, b[:rest]...) + need -= rest + // read full segments and the last possibly partial segment + for need > 0 && i < count-1 { + // push all finished chunks we read + self.writeSegment(i, s, self.depth) + need -= size + if need < 0 { + size += need + } + s = b[rest : rest+size] + rest += size + i++ + } + self.segment = s + self.cur = i + // otherwise, we can assume len(s) == 0, so all buffer is read and chunk is not yet full + return l, nil +} + +// Hasher implements the io.ReaderFrom interface + +// ReadFrom reads from io.Reader and appends to the data to hash using Write +// it reads so that chunk to hash is maximum length or reader reaches EOF +// caller must Reset the hasher prior to call +func (self *Hasher) ReadFrom(r io.Reader) (m int64, err error) { + bufsize := self.size*self.count - self.size*self.cur - len(self.segment) + buf := make([]byte, bufsize) + var read int + for { + var n int + n, err = r.Read(buf) + read += n + if err == io.EOF || read == len(buf) { + hash := self.Sum(buf[:n]) + if read == len(buf) { + err = NewEOC(hash) + } + break + } + if err != nil { + break + } + n, err = self.Write(buf[:n]) + if err != nil { + break + } + } + return int64(read), err +} + +// Reset needs to be called before writing to the hasher +func (self *Hasher) Reset() { + self.getTree() + self.blockLength = nil +} + +// Hasher implements the SwarmHash interface + +// ResetWithLength needs to be called before writing to the hasher +// the argument is supposed to be the byte slice binary representation of +// the legth of the data subsumed under the hash +func (self *Hasher) ResetWithLength(l []byte) { + self.Reset() + self.blockLength = l + +} + +// Release gives back the Tree to the pool whereby it unlocks +// it resets tree, segment and index +func (self *Hasher) releaseTree() { + if self.bmt != nil { + n := self.bmt.leaves[self.cur] + for ; n != nil; n = n.parent { + n.unbalanced = false + if n.parent != nil { + n.root = false + } + } + self.pool.Release(self.bmt) + self.bmt = nil + + } + self.cur = 0 + self.segment = nil +} + +func (self *Hasher) writeSegment(i int, s []byte, d int) { + h := self.pool.hasher() + n := self.bmt.leaves[i] + + if len(s) > self.size && n.parent != nil { + go func() { + h.Reset() + h.Write(s) + s = h.Sum(nil) + + if n.root { + self.result <- s + return + } + self.run(n.parent, h, d, n.index, s) + }() + return + } + go self.run(n, h, d, i*2, s) +} + +func (self *Hasher) run(n *Node, h hash.Hash, d int, i int, s []byte) { + isLeft := i%2 == 0 + for { + if isLeft { + n.left = s + } else { + n.right = s + } + if !n.unbalanced && n.toggle() { + return + } + if !n.unbalanced || !isLeft || i == 0 && d == 0 { + h.Reset() + h.Write(n.left) + h.Write(n.right) + s = h.Sum(nil) + + } else { + s = append(n.left, n.right...) + } + + self.hash = s + if n.root { + self.result <- s + return + } + + isLeft = n.isLeft + n = n.parent + i++ + } +} + +// getTree obtains a BMT resource by reserving one from the pool +func (self *Hasher) getTree() *Tree { + if self.bmt != nil { + return self.bmt + } + t := self.pool.Reserve() + self.bmt = t + return t +} + +// atomic bool toggle implementing a concurrent reusable 2-state object +// atomic addint with %2 implements atomic bool toggle +// it returns true if the toggler just put it in the active/waiting state +func (self *Node) toggle() bool { + return atomic.AddInt32(&self.state, 1)%2 == 1 +} + +func hashstr(b []byte) string { + end := len(b) + if end > 4 { + end = 4 + } + return fmt.Sprintf("%x", b[:end]) +} + +func depth(n int) (d int) { + for l := (n - 1) / 2; l > 0; l /= 2 { + d++ + } + return d +} + +// finalise is following the zigzags on the tree belonging +// to the final datasegment +func (self *Hasher) finalise(n *Node, i int) (d int) { + isLeft := i%2 == 0 + for { + // when the final segment's path is going via left segments + // the incoming data is pushed to the parent upon pulling the left + // we do not need toogle the state since this condition is + // detectable + n.unbalanced = isLeft + n.right = nil + if n.initial { + n.root = true + return d + } + isLeft = n.isLeft + n = n.parent + d++ + } +} + +// EOC (end of chunk) implements the error interface +type EOC struct { + Hash []byte // read the hash of the chunk off the error +} + +// Error returns the error string +func (self *EOC) Error() string { + return fmt.Sprintf("hasher limit reached, chunk hash: %x", self.Hash) +} + +// NewEOC creates new end of chunk error with the hash +func NewEOC(hash []byte) *EOC { + return &EOC{hash} +} diff --git a/bmt/bmt_r.go b/bmt/bmt_r.go new file mode 100644 index 0000000000..649093ee3a --- /dev/null +++ b/bmt/bmt_r.go @@ -0,0 +1,85 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// simple nonconcurrent reference implementation for hashsize segment based +// Binary Merkle tree hash on arbitrary but fixed maximum chunksize +// +// This implementation does not take advantage of any paralellisms and uses +// far more memory than necessary, but it is easy to see that it is correct. +// It can be used for generating test cases for optimized implementations. +// see testBMTHasherCorrectness function in bmt_test.go +package bmt + +import ( + "hash" +) + +// RefHasher is the non-optimized easy to read reference implementation of BMT +type RefHasher struct { + span int + section int + cap int + h hash.Hash +} + +// NewRefHasher returns a new RefHasher +func NewRefHasher(hasher BaseHasher, count int) *RefHasher { + h := hasher() + hashsize := h.Size() + maxsize := hashsize * count + c := 2 + for ; c < count; c *= 2 { + } + if c > 2 { + c /= 2 + } + return &RefHasher{ + section: 2 * hashsize, + span: c * hashsize, + cap: maxsize, + h: h, + } +} + +// Hash returns the BMT hash of the byte slice +// implements the SwarmHash interface +func (rh *RefHasher) Hash(d []byte) []byte { + if len(d) > rh.cap { + d = d[:rh.cap] + } + + return rh.hash(d, rh.span) +} + +func (rh *RefHasher) hash(d []byte, s int) []byte { + l := len(d) + left := d + var right []byte + if l > rh.section { + for ; s >= l; s /= 2 { + } + left = rh.hash(d[:s], s) + right = d[s:] + if l-s > rh.section/2 { + right = rh.hash(right, s) + } + } + defer rh.h.Reset() + rh.h.Write(left) + rh.h.Write(right) + h := rh.h.Sum(nil) + return h +} diff --git a/bmt/bmt_test.go b/bmt/bmt_test.go new file mode 100644 index 0000000000..57df83060a --- /dev/null +++ b/bmt/bmt_test.go @@ -0,0 +1,481 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bmt + +import ( + "bytes" + crand "crypto/rand" + "fmt" + "hash" + "io" + "math/rand" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/crypto/sha3" +) + +const ( + maxproccnt = 8 +) + +// TestRefHasher tests that the RefHasher computes the expected BMT hash for +// all data lengths between 0 and 256 bytes +func TestRefHasher(t *testing.T) { + hashFunc := sha3.NewKeccak256 + + sha3 := func(data ...[]byte) []byte { + h := hashFunc() + for _, v := range data { + h.Write(v) + } + return h.Sum(nil) + } + + // the test struct is used to specify the expected BMT hash for data + // lengths between "from" and "to" + type test struct { + from int64 + to int64 + expected func([]byte) []byte + } + + var tests []*test + + // all lengths in [0,64] should be: + // + // sha3(data) + // + tests = append(tests, &test{ + from: 0, + to: 64, + expected: func(data []byte) []byte { + return sha3(data) + }, + }) + + // all lengths in [65,96] should be: + // + // sha3( + // sha3(data[:64]) + // data[64:] + // ) + // + tests = append(tests, &test{ + from: 65, + to: 96, + expected: func(data []byte) []byte { + return sha3(sha3(data[:64]), data[64:]) + }, + }) + + // all lengths in [97,128] should be: + // + // sha3( + // sha3(data[:64]) + // sha3(data[64:]) + // ) + // + tests = append(tests, &test{ + from: 97, + to: 128, + expected: func(data []byte) []byte { + return sha3(sha3(data[:64]), sha3(data[64:])) + }, + }) + + // all lengths in [129,160] should be: + // + // sha3( + // sha3( + // sha3(data[:64]) + // sha3(data[64:128]) + // ) + // data[128:] + // ) + // + tests = append(tests, &test{ + from: 129, + to: 160, + expected: func(data []byte) []byte { + return sha3(sha3(sha3(data[:64]), sha3(data[64:128])), data[128:]) + }, + }) + + // all lengths in [161,192] should be: + // + // sha3( + // sha3( + // sha3(data[:64]) + // sha3(data[64:128]) + // ) + // sha3(data[128:]) + // ) + // + tests = append(tests, &test{ + from: 161, + to: 192, + expected: func(data []byte) []byte { + return sha3(sha3(sha3(data[:64]), sha3(data[64:128])), sha3(data[128:])) + }, + }) + + // all lengths in [193,224] should be: + // + // sha3( + // sha3( + // sha3(data[:64]) + // sha3(data[64:128]) + // ) + // sha3( + // sha3(data[128:192]) + // data[192:] + // ) + // ) + // + tests = append(tests, &test{ + from: 193, + to: 224, + expected: func(data []byte) []byte { + return sha3(sha3(sha3(data[:64]), sha3(data[64:128])), sha3(sha3(data[128:192]), data[192:])) + }, + }) + + // all lengths in [225,256] should be: + // + // sha3( + // sha3( + // sha3(data[:64]) + // sha3(data[64:128]) + // ) + // sha3( + // sha3(data[128:192]) + // sha3(data[192:]) + // ) + // ) + // + tests = append(tests, &test{ + from: 225, + to: 256, + expected: func(data []byte) []byte { + return sha3(sha3(sha3(data[:64]), sha3(data[64:128])), sha3(sha3(data[128:192]), sha3(data[192:]))) + }, + }) + + // run the tests + for _, x := range tests { + for length := x.from; length <= x.to; length++ { + t.Run(fmt.Sprintf("%d_bytes", length), func(t *testing.T) { + data := make([]byte, length) + if _, err := io.ReadFull(crand.Reader, data); err != nil && err != io.EOF { + t.Fatal(err) + } + expected := x.expected(data) + actual := NewRefHasher(hashFunc, 128).Hash(data) + if !bytes.Equal(actual, expected) { + t.Fatalf("expected %x, got %x", expected, actual) + } + }) + } + } +} + +func testDataReader(l int) (r io.Reader) { + return io.LimitReader(crand.Reader, int64(l)) +} + +func TestHasherCorrectness(t *testing.T) { + err := testHasher(testBaseHasher) + if err != nil { + t.Fatal(err) + } +} + +func testHasher(f func(BaseHasher, []byte, int, int) error) error { + tdata := testDataReader(4128) + data := make([]byte, 4128) + tdata.Read(data) + hasher := sha3.NewKeccak256 + size := hasher().Size() + counts := []int{1, 2, 3, 4, 5, 8, 16, 32, 64, 128} + + var err error + for _, count := range counts { + max := count * size + incr := 1 + for n := 0; n <= max+incr; n += incr { + err = f(hasher, data, n, count) + if err != nil { + return err + } + } + } + return nil +} + +func TestHasherReuseWithoutRelease(t *testing.T) { + testHasherReuse(1, t) +} + +func TestHasherReuseWithRelease(t *testing.T) { + testHasherReuse(maxproccnt, t) +} + +func testHasherReuse(i int, t *testing.T) { + hasher := sha3.NewKeccak256 + pool := NewTreePool(hasher, 128, i) + defer pool.Drain(0) + bmt := New(pool) + + for i := 0; i < 500; i++ { + n := rand.Intn(4096) + tdata := testDataReader(n) + data := make([]byte, n) + tdata.Read(data) + + err := testHasherCorrectness(bmt, hasher, data, n, 128) + if err != nil { + t.Fatal(err) + } + } +} + +func TestHasherConcurrency(t *testing.T) { + hasher := sha3.NewKeccak256 + pool := NewTreePool(hasher, 128, maxproccnt) + defer pool.Drain(0) + wg := sync.WaitGroup{} + cycles := 100 + wg.Add(maxproccnt * cycles) + errc := make(chan error) + + for p := 0; p < maxproccnt; p++ { + for i := 0; i < cycles; i++ { + go func() { + bmt := New(pool) + n := rand.Intn(4096) + tdata := testDataReader(n) + data := make([]byte, n) + tdata.Read(data) + err := testHasherCorrectness(bmt, hasher, data, n, 128) + wg.Done() + if err != nil { + errc <- err + } + }() + } + } + go func() { + wg.Wait() + close(errc) + }() + var err error + select { + case <-time.NewTimer(5 * time.Second).C: + err = fmt.Errorf("timed out") + case err = <-errc: + } + if err != nil { + t.Fatal(err) + } +} + +func testBaseHasher(hasher BaseHasher, d []byte, n, count int) error { + pool := NewTreePool(hasher, count, 1) + defer pool.Drain(0) + bmt := New(pool) + return testHasherCorrectness(bmt, hasher, d, n, count) +} + +func testHasherCorrectness(bmt hash.Hash, hasher BaseHasher, d []byte, n, count int) (err error) { + data := d[:n] + rbmt := NewRefHasher(hasher, count) + exp := rbmt.Hash(data) + timeout := time.NewTimer(time.Second) + c := make(chan error) + + go func() { + bmt.Reset() + bmt.Write(data) + got := bmt.Sum(nil) + if !bytes.Equal(got, exp) { + c <- fmt.Errorf("wrong hash: expected %x, got %x", exp, got) + } + close(c) + }() + select { + case <-timeout.C: + err = fmt.Errorf("BMT hash calculation timed out") + case err = <-c: + } + return err +} + +func BenchmarkSHA3_4k(t *testing.B) { benchmarkSHA3(4096, t) } +func BenchmarkSHA3_2k(t *testing.B) { benchmarkSHA3(4096/2, t) } +func BenchmarkSHA3_1k(t *testing.B) { benchmarkSHA3(4096/4, t) } +func BenchmarkSHA3_512b(t *testing.B) { benchmarkSHA3(4096/8, t) } +func BenchmarkSHA3_256b(t *testing.B) { benchmarkSHA3(4096/16, t) } +func BenchmarkSHA3_128b(t *testing.B) { benchmarkSHA3(4096/32, t) } + +func BenchmarkBMTBaseline_4k(t *testing.B) { benchmarkBMTBaseline(4096, t) } +func BenchmarkBMTBaseline_2k(t *testing.B) { benchmarkBMTBaseline(4096/2, t) } +func BenchmarkBMTBaseline_1k(t *testing.B) { benchmarkBMTBaseline(4096/4, t) } +func BenchmarkBMTBaseline_512b(t *testing.B) { benchmarkBMTBaseline(4096/8, t) } +func BenchmarkBMTBaseline_256b(t *testing.B) { benchmarkBMTBaseline(4096/16, t) } +func BenchmarkBMTBaseline_128b(t *testing.B) { benchmarkBMTBaseline(4096/32, t) } + +func BenchmarkRefHasher_4k(t *testing.B) { benchmarkRefHasher(4096, t) } +func BenchmarkRefHasher_2k(t *testing.B) { benchmarkRefHasher(4096/2, t) } +func BenchmarkRefHasher_1k(t *testing.B) { benchmarkRefHasher(4096/4, t) } +func BenchmarkRefHasher_512b(t *testing.B) { benchmarkRefHasher(4096/8, t) } +func BenchmarkRefHasher_256b(t *testing.B) { benchmarkRefHasher(4096/16, t) } +func BenchmarkRefHasher_128b(t *testing.B) { benchmarkRefHasher(4096/32, t) } + +func BenchmarkHasher_4k(t *testing.B) { benchmarkHasher(4096, t) } +func BenchmarkHasher_2k(t *testing.B) { benchmarkHasher(4096/2, t) } +func BenchmarkHasher_1k(t *testing.B) { benchmarkHasher(4096/4, t) } +func BenchmarkHasher_512b(t *testing.B) { benchmarkHasher(4096/8, t) } +func BenchmarkHasher_256b(t *testing.B) { benchmarkHasher(4096/16, t) } +func BenchmarkHasher_128b(t *testing.B) { benchmarkHasher(4096/32, t) } + +func BenchmarkHasherNoReuse_4k(t *testing.B) { benchmarkHasherReuse(1, 4096, t) } +func BenchmarkHasherNoReuse_2k(t *testing.B) { benchmarkHasherReuse(1, 4096/2, t) } +func BenchmarkHasherNoReuse_1k(t *testing.B) { benchmarkHasherReuse(1, 4096/4, t) } +func BenchmarkHasherNoReuse_512b(t *testing.B) { benchmarkHasherReuse(1, 4096/8, t) } +func BenchmarkHasherNoReuse_256b(t *testing.B) { benchmarkHasherReuse(1, 4096/16, t) } +func BenchmarkHasherNoReuse_128b(t *testing.B) { benchmarkHasherReuse(1, 4096/32, t) } + +func BenchmarkHasherReuse_4k(t *testing.B) { benchmarkHasherReuse(16, 4096, t) } +func BenchmarkHasherReuse_2k(t *testing.B) { benchmarkHasherReuse(16, 4096/2, t) } +func BenchmarkHasherReuse_1k(t *testing.B) { benchmarkHasherReuse(16, 4096/4, t) } +func BenchmarkHasherReuse_512b(t *testing.B) { benchmarkHasherReuse(16, 4096/8, t) } +func BenchmarkHasherReuse_256b(t *testing.B) { benchmarkHasherReuse(16, 4096/16, t) } +func BenchmarkHasherReuse_128b(t *testing.B) { benchmarkHasherReuse(16, 4096/32, t) } + +// benchmarks the minimum hashing time for a balanced (for simplicity) BMT +// by doing count/segmentsize parallel hashings of 2*segmentsize bytes +// doing it on n maxproccnt each reusing the base hasher +// the premise is that this is the minimum computation needed for a BMT +// therefore this serves as a theoretical optimum for concurrent implementations +func benchmarkBMTBaseline(n int, t *testing.B) { + tdata := testDataReader(64) + data := make([]byte, 64) + tdata.Read(data) + hasher := sha3.NewKeccak256 + + t.ReportAllocs() + t.ResetTimer() + for i := 0; i < t.N; i++ { + count := int32((n-1)/hasher().Size() + 1) + wg := sync.WaitGroup{} + wg.Add(maxproccnt) + var i int32 + for j := 0; j < maxproccnt; j++ { + go func() { + defer wg.Done() + h := hasher() + for atomic.AddInt32(&i, 1) < count { + h.Reset() + h.Write(data) + h.Sum(nil) + } + }() + } + wg.Wait() + } +} + +func benchmarkHasher(n int, t *testing.B) { + tdata := testDataReader(n) + data := make([]byte, n) + tdata.Read(data) + + size := 1 + hasher := sha3.NewKeccak256 + segmentCount := 128 + pool := NewTreePool(hasher, segmentCount, size) + bmt := New(pool) + + t.ReportAllocs() + t.ResetTimer() + for i := 0; i < t.N; i++ { + bmt.Reset() + bmt.Write(data) + bmt.Sum(nil) + } +} + +func benchmarkHasherReuse(poolsize, n int, t *testing.B) { + tdata := testDataReader(n) + data := make([]byte, n) + tdata.Read(data) + + hasher := sha3.NewKeccak256 + segmentCount := 128 + pool := NewTreePool(hasher, segmentCount, poolsize) + cycles := 200 + + t.ReportAllocs() + t.ResetTimer() + for i := 0; i < t.N; i++ { + wg := sync.WaitGroup{} + wg.Add(cycles) + for j := 0; j < cycles; j++ { + bmt := New(pool) + go func() { + defer wg.Done() + bmt.Reset() + bmt.Write(data) + bmt.Sum(nil) + }() + } + wg.Wait() + } +} + +func benchmarkSHA3(n int, t *testing.B) { + data := make([]byte, n) + tdata := testDataReader(n) + tdata.Read(data) + hasher := sha3.NewKeccak256 + h := hasher() + + t.ReportAllocs() + t.ResetTimer() + for i := 0; i < t.N; i++ { + h.Reset() + h.Write(data) + h.Sum(nil) + } +} + +func benchmarkRefHasher(n int, t *testing.B) { + data := make([]byte, n) + tdata := testDataReader(n) + tdata.Read(data) + hasher := sha3.NewKeccak256 + rbmt := NewRefHasher(hasher, 128) + + t.ReportAllocs() + t.ResetTimer() + for i := 0; i < t.N; i++ { + rbmt.Hash(data) + } +} diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go index 563793e98f..ca85e43337 100644 --- a/swarm/storage/chunker.go +++ b/swarm/storage/chunker.go @@ -51,7 +51,8 @@ data_{i} := size(subtree_{i}) || key_{j} || key_{j+1} .... || key_{j+n-1} */ const ( - defaultHash = "SHA3" // http://golang.org/pkg/hash/#Hash + defaultHash = "SHA3" + // defaultHash = "BMTSHA3" // http://golang.org/pkg/hash/#Hash // defaultHash = "SHA256" // http://golang.org/pkg/hash/#Hash defaultBranches int64 = 128 // hashSize int64 = hasherfunc.New().Size() // hasher knows about its own length in bytes diff --git a/swarm/storage/types.go b/swarm/storage/types.go index cc5ded931d..a9de23c93a 100644 --- a/swarm/storage/types.go +++ b/swarm/storage/types.go @@ -24,6 +24,7 @@ import ( "io" "sync" + // "github.com/ethereum/go-ethereum/bmt" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto/sha3" ) From cd6c861dc567478adb64b7efef327a4aceda97f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 16:04:32 +0300 Subject: [PATCH 130/272] vendor: pull in latest changes for goleveldb (#15090) --- .../github.com/syndtr/goleveldb/leveldb/db.go | 2 +- .../syndtr/goleveldb/leveldb/db_compaction.go | 4 +- .../syndtr/goleveldb/leveldb/db_state.go | 7 ++- .../syndtr/goleveldb/leveldb/db_write.go | 9 ++++ .../syndtr/goleveldb/leveldb/doc.go | 2 + .../goleveldb/leveldb/storage/file_storage.go | 24 +++++++-- .../syndtr/goleveldb/leveldb/table/reader.go | 1 + vendor/vendor.json | 54 +++++++++---------- 8 files changed, 68 insertions(+), 35 deletions(-) diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go index a02cb2c500..b0cdcb3d0a 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db.go @@ -844,7 +844,7 @@ func (db *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { // Has returns true if the DB does contains the given key. // -// It is safe to modify the contents of the argument after Get returns. +// It is safe to modify the contents of the argument after Has returns. func (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { err = db.ok() if err != nil { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go index 2d0ad0753c..b6563e87e4 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go @@ -289,7 +289,7 @@ func (db *DB) memCompaction() { close(resumeC) resumeC = nil case <-db.closeC: - return + db.compactionExitTransact() } var ( @@ -338,7 +338,7 @@ func (db *DB) memCompaction() { case <-resumeC: close(resumeC) case <-db.closeC: - return + db.compactionExitTransact() } } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go index 85b02d24bf..65e1c54bb4 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go @@ -7,6 +7,7 @@ package leveldb import ( + "errors" "sync/atomic" "time" @@ -15,6 +16,10 @@ import ( "github.com/syndtr/goleveldb/leveldb/storage" ) +var ( + errHasFrozenMem = errors.New("has frozen mem") +) + type memDB struct { db *DB *memdb.DB @@ -126,7 +131,7 @@ func (db *DB) newMem(n int) (mem *memDB, err error) { defer db.memMu.Unlock() if db.frozenMem != nil { - panic("still has frozen mem") + return nil, errHasFrozenMem } if db.journal == nil { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go index cc428b695c..5b6cb487dc 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go @@ -32,15 +32,24 @@ func (db *DB) writeJournal(batches []*Batch, seq uint64, sync bool) error { } func (db *DB) rotateMem(n int, wait bool) (mem *memDB, err error) { + retryLimit := 3 +retry: // Wait for pending memdb compaction. err = db.compTriggerWait(db.mcompCmdC) if err != nil { return } + retryLimit-- // Create new memdb and journal. mem, err = db.newMem(n) if err != nil { + if err == errHasFrozenMem { + if retryLimit <= 0 { + panic("BUG: still has frozen memdb") + } + goto retry + } return } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/doc.go b/vendor/github.com/syndtr/goleveldb/leveldb/doc.go index 53f13bb24c..be768e5739 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/doc.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/doc.go @@ -8,6 +8,8 @@ // // Create or open a database: // +// // The returned DB instance is safe for concurrent use. Which mean that all +// // DB's methods may be called concurrently from multiple goroutine. // db, err := leveldb.OpenFile("path/to/db", nil) // ... // defer db.Close() diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go index e53434cab7..1189decac6 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go @@ -234,14 +234,30 @@ func (fs *fileStorage) SetMeta(fd FileDesc) (err error) { return } _, err = fmt.Fprintln(w, fsGenName(fd)) - // Close the file first. - if cerr := w.Close(); cerr != nil { - fs.log(fmt.Sprintf("close CURRENT.%d: %v", fd.Num, cerr)) + if err != nil { + fs.log(fmt.Sprintf("write CURRENT.%d: %v", fd.Num, err)) + return + } + if err = w.Sync(); err != nil { + fs.log(fmt.Sprintf("flush CURRENT.%d: %v", fd.Num, err)) + return + } + if err = w.Close(); err != nil { + fs.log(fmt.Sprintf("close CURRENT.%d: %v", fd.Num, err)) + return } if err != nil { return } - return rename(path, filepath.Join(fs.path, "CURRENT")) + if err = rename(path, filepath.Join(fs.path, "CURRENT")); err != nil { + fs.log(fmt.Sprintf("rename CURRENT.%d: %v", fd.Num, err)) + return + } + // Sync root directory. + if err = syncDir(fs.path); err != nil { + fs.log(fmt.Sprintf("syncDir: %v", err)) + } + return } func (fs *fileStorage) GetMeta() (fd FileDesc, err error) { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go index c5be420b3f..16cfbaa006 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go @@ -581,6 +581,7 @@ func (r *Reader) readRawBlock(bh blockHandle, verifyChecksum bool) ([]byte, erro case blockTypeSnappyCompression: decLen, err := snappy.DecodedLen(data[:bh.length]) if err != nil { + r.bpool.Put(data) return nil, r.newErrCorruptedBH(bh, err.Error()) } decData := r.bpool.Get(decLen) diff --git a/vendor/vendor.json b/vendor/vendor.json index 56c95e341f..a9de0ec728 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -334,76 +334,76 @@ "revisionTime": "2016-06-18T19:32:21Z" }, { - "checksumSHA1": "QvOrAO5S37PL/6XZVWIVGyAbn60=", + "checksumSHA1": "yHbyLpI/Meh0DGrmi8x6FrDxxUY=", "path": "github.com/syndtr/goleveldb/leveldb", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "EKIow7XkgNdWvR/982ffIZxKG8Y=", "path": "github.com/syndtr/goleveldb/leveldb/cache", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "5KPgnvCPlR0ysDAqo6jApzRQ3tw=", "path": "github.com/syndtr/goleveldb/leveldb/comparer", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "1DRAxdlWzS4U0xKN/yQ/fdNN7f0=", "path": "github.com/syndtr/goleveldb/leveldb/errors", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "eqKeD6DS7eNCtxVYZEHHRKkyZrw=", "path": "github.com/syndtr/goleveldb/leveldb/filter", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "8dXuAVIsbtaMiGGuHjzGR6Ny/5c=", "path": "github.com/syndtr/goleveldb/leveldb/iterator", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "gJY7bRpELtO0PJpZXgPQ2BYFJ88=", "path": "github.com/syndtr/goleveldb/leveldb/journal", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "j+uaQ6DwJ50dkIdfMQu1TXdlQcY=", "path": "github.com/syndtr/goleveldb/leveldb/memdb", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "UmQeotV+m8/FduKEfLOhjdp18rs=", "path": "github.com/syndtr/goleveldb/leveldb/opt", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { - "checksumSHA1": "/Wvv9HeJTN9UUjdjwUlz7X4ioIo=", + "checksumSHA1": "tQ2AqXXAEy9icbZI9dLVdZGvWMw=", "path": "github.com/syndtr/goleveldb/leveldb/storage", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { - "checksumSHA1": "JTJA+u8zk7EXy1UUmpFPNGvtO2A=", + "checksumSHA1": "gWFPMz8OQeul0t54RM66yMTX49g=", "path": "github.com/syndtr/goleveldb/leveldb/table", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "4zil8Gwg8VPkDn1YzlgCvtukJFU=", "path": "github.com/syndtr/goleveldb/leveldb/util", - "revision": "23851d93a2292dcc56e71a18ec9e0624d84a0f65", - "revisionTime": "2016-12-27T11:05:19Z" + "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199", + "revisionTime": "2017-07-25T06:48:36Z" }, { "checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=", From 8e14bb1448a792072f780dae3db896bbfe366ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 16:06:04 +0300 Subject: [PATCH 131/272] Dockerfile: fix missing SSL certificates --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 17fa40951e..eae8924997 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ RUN cd /go-ethereum && make geth # Pull Geth into a second stage deploy alpine container FROM alpine:latest +RUN apk add --no-cache ca-certificates COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/ EXPOSE 8545 8546 30303 30303/udp From f90a193f92e0013dc657ebe03a524a2e7286d5df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 16:06:36 +0300 Subject: [PATCH 132/272] cmd/puppeth: switch node containers to main ones --- cmd/puppeth/module_node.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/puppeth/module_node.go b/cmd/puppeth/module_node.go index 9fe97c892d..8f912f9ebd 100644 --- a/cmd/puppeth/module_node.go +++ b/cmd/puppeth/module_node.go @@ -30,7 +30,7 @@ import ( // nodeDockerfile is the Dockerfile required to run an Ethereum node. var nodeDockerfile = ` -FROM ethereum/client-go:alpine-develop +FROM ethereum/client-go:latest ADD genesis.json /genesis.json {{if .Unlock}} @@ -38,9 +38,9 @@ ADD genesis.json /genesis.json ADD signer.pass /signer.pass {{end}} RUN \ - echo '/geth init /genesis.json' > geth.sh && \{{if .Unlock}} + echo 'geth init /genesis.json' > geth.sh && \{{if .Unlock}} echo 'mkdir -p /root/.ethereum/keystore/ && cp /signer.json /root/.ethereum/keystore/' >> geth.sh && \{{end}} - echo $'/geth --networkid {{.NetworkID}} --cache 512 --port {{.Port}} --maxpeers {{.Peers}} {{.LightFlag}} --ethstats \'{{.Ethstats}}\' {{if .BootV4}}--bootnodesv4 {{.BootV4}}{{end}} {{if .BootV5}}--bootnodesv5 {{.BootV5}}{{end}} {{if .Etherbase}}--etherbase {{.Etherbase}} --mine{{end}}{{if .Unlock}}--unlock 0 --password /signer.pass --mine{{end}} --targetgaslimit {{.GasTarget}} --gasprice {{.GasPrice}}' >> geth.sh + echo $'geth --networkid {{.NetworkID}} --cache 512 --port {{.Port}} --maxpeers {{.Peers}} {{.LightFlag}} --ethstats \'{{.Ethstats}}\' {{if .BootV4}}--bootnodesv4 {{.BootV4}}{{end}} {{if .BootV5}}--bootnodesv5 {{.BootV5}}{{end}} {{if .Etherbase}}--etherbase {{.Etherbase}} --mine{{end}}{{if .Unlock}}--unlock 0 --password /signer.pass --mine{{end}} --targetgaslimit {{.GasTarget}} --gasprice {{.GasPrice}}' >> geth.sh ENTRYPOINT ["/bin/sh", "geth.sh"] ` @@ -197,7 +197,7 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error) // Container available, retrieve its node ID and its genesis json var out []byte - if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 /geth --exec admin.nodeInfo.id attach", network, kind)); err != nil { + if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 geth --exec admin.nodeInfo.id attach", network, kind)); err != nil { return nil, ErrServiceUnreachable } id := bytes.Trim(bytes.TrimSpace(out), "\"") From b0ca1b67ce6e297fe02281d01a486225bbf385f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 19:18:28 +0300 Subject: [PATCH 133/272] eth: use maxpeers from p2p layer instead of extra config --- cmd/utils/flags.go | 4 ---- eth/backend.go | 30 +++++++++++++++--------------- eth/config.go | 1 - eth/gen_config.go | 4 ---- eth/handler.go | 8 +++++--- eth/handler_test.go | 4 ++-- eth/helper_test.go | 4 ++-- params/bootnodes.go | 2 -- 8 files changed, 24 insertions(+), 33 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 37ccd06efb..5ab6047e83 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -949,10 +949,6 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) } - // Ethereum needs to know maxPeers to calculate the light server peer ratio. - // TODO(fjl): ensure Ethereum can get MaxPeers from node. - cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) - if ctx.GlobalIsSet(CacheFlag.Name) { cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) } diff --git a/eth/backend.go b/eth/backend.go index 5f4f2097a7..5837c85641 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -57,15 +57,19 @@ type LesServer interface { // Ethereum implements the Ethereum full node service. type Ethereum struct { + config *Config chainConfig *params.ChainConfig + // Channel for shutting down the service shutdownChan chan bool // Channel for shutting down the ethereum stopDbUpgrade func() error // stop chain db sequential key upgrade + // Handlers txPool *core.TxPool blockchain *core.BlockChain protocolManager *ProtocolManager lesServer LesServer + // DB interfaces chainDb ethdb.Database // Block chain database @@ -98,7 +102,6 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if !config.SyncMode.IsValid() { return nil, fmt.Errorf("invalid sync mode %d", config.SyncMode) } - chainDb, err := CreateDB(ctx, config, "chaindata") if err != nil { return nil, err @@ -111,6 +114,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { log.Info("Initialised chain configuration", "config", chainConfig) eth := &Ethereum{ + config: config, chainDb: chainDb, chainConfig: chainConfig, eventMux: ctx.EventMux, @@ -153,21 +157,9 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { } eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.blockchain) - maxPeers := config.MaxPeers - if config.LightServ > 0 { - // if we are running a light server, limit the number of ETH peers so that we reserve some space for incoming LES connections - // temporary solution until the new peer connectivity API is finished - halfPeers := maxPeers / 2 - maxPeers -= config.LightPeers - if maxPeers < halfPeers { - maxPeers = halfPeers - } - } - - if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.SyncMode, config.NetworkId, maxPeers, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb); err != nil { + if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.SyncMode, config.NetworkId, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb); err != nil { return nil, err } - eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine) eth.miner.SetExtra(makeExtraData(config.ExtraData)) @@ -376,7 +368,15 @@ func (s *Ethereum) Protocols() []p2p.Protocol { func (s *Ethereum) Start(srvr *p2p.Server) error { s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.NetVersion()) - s.protocolManager.Start() + // Figure out a max peers count based on the server limits + maxPeers := srvr.MaxPeers + if s.config.LightServ > 0 { + maxPeers -= s.config.LightPeers + if maxPeers < srvr.MaxPeers/2 { + maxPeers = srvr.MaxPeers / 2 + } + } + s.protocolManager.Start(maxPeers) if s.lesServer != nil { s.lesServer.Start(srvr) } diff --git a/eth/config.go b/eth/config.go index 4109cff8b7..7bcfd403ea 100644 --- a/eth/config.go +++ b/eth/config.go @@ -79,7 +79,6 @@ type Config struct { // Light client options LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests LightPeers int `toml:",omitempty"` // Maximum number of LES client peers - MaxPeers int `toml:"-"` // Maximum number of global peers // Database options SkipBcVersionCheck bool `toml:"-"` diff --git a/eth/gen_config.go b/eth/gen_config.go index 4774794197..4a4cd7b9c5 100644 --- a/eth/gen_config.go +++ b/eth/gen_config.go @@ -47,7 +47,6 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.SyncMode = c.SyncMode enc.LightServ = c.LightServ enc.LightPeers = c.LightPeers - enc.MaxPeers = c.MaxPeers enc.SkipBcVersionCheck = c.SkipBcVersionCheck enc.DatabaseHandles = c.DatabaseHandles enc.DatabaseCache = c.DatabaseCache @@ -119,9 +118,6 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.LightPeers != nil { c.LightPeers = *dec.LightPeers } - if dec.MaxPeers != nil { - c.MaxPeers = *dec.MaxPeers - } if dec.SkipBcVersionCheck != nil { c.SkipBcVersionCheck = *dec.SkipBcVersionCheck } diff --git a/eth/handler.go b/eth/handler.go index 9d230a4ad6..28ae208c06 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -99,7 +99,7 @@ type ProtocolManager struct { // NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable // with the ethereum network. -func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, networkId uint64, maxPeers int, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) { +func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, networkId uint64, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) { // Create the protocol manager with the base fields manager := &ProtocolManager{ networkId: networkId, @@ -108,7 +108,6 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne blockchain: blockchain, chaindb: chaindb, chainconfig: config, - maxPeers: maxPeers, peers: newPeerSet(), newPeerCh: make(chan *peer), noMorePeers: make(chan struct{}), @@ -203,11 +202,14 @@ func (pm *ProtocolManager) removePeer(id string) { } } -func (pm *ProtocolManager) Start() { +func (pm *ProtocolManager) Start(maxPeers int) { + pm.maxPeers = maxPeers + // broadcast transactions pm.txCh = make(chan core.TxPreEvent, txChanSize) pm.txSub = pm.txpool.SubscribeTxPreEvent(pm.txCh) go pm.txBroadcastLoop() + // broadcast mined blocks pm.minedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{}) go pm.minedBroadcastLoop() diff --git a/eth/handler_test.go b/eth/handler_test.go index aba2774444..6752cd2a84 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -476,11 +476,11 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool genesis = gspec.MustCommit(db) blockchain, _ = core.NewBlockChain(db, config, pow, vm.Config{}) ) - pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, 1000, evmux, new(testTxPool), pow, blockchain, db) + pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db) if err != nil { t.Fatalf("failed to start test protocol manager: %v", err) } - pm.Start() + pm.Start(1000) defer pm.Stop() // Connect a new peer and check that we receive the DAO challenge diff --git a/eth/helper_test.go b/eth/helper_test.go index f1dab95283..b665531352 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -66,11 +66,11 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func panic(err) } - pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, 1000, evmux, &testTxPool{added: newtx}, engine, blockchain, db) + pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db) if err != nil { return nil, err } - pm.Start() + pm.Start(1000) return pm, nil } diff --git a/params/bootnodes.go b/params/bootnodes.go index 6a145a7a8f..6c6c02f8cf 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -19,7 +19,6 @@ package params // MainnetBootnodes are the enode URLs of the P2P bootstrap nodes running on // the main Ethereum network. var MainnetBootnodes = []string{ - // Ethereum Foundation Go Bootnodes "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303", // IE "enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303", // US-WEST @@ -29,7 +28,6 @@ var MainnetBootnodes = []string{ // Ethereum Foundation Cpp Bootnodes "enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303", // DE - } // TestnetBootnodes are the enode URLs of the P2P bootstrap nodes running on the From cc313e78b7dfbf44dec64ac0d22e4134ee44cc74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 5 Sep 2017 19:49:37 +0300 Subject: [PATCH 134/272] core: use blocks and avoid deep reorgs in txpool --- core/tx_pool.go | 86 ++++++++++++++++++++++++-------------------- core/tx_pool_test.go | 16 ++++----- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/core/tx_pool.go b/core/tx_pool.go index f41fbe069a..0ad7651795 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -19,6 +19,7 @@ package core import ( "errors" "fmt" + "math" "math/big" "sort" "sync" @@ -105,11 +106,11 @@ var ( // blockChain provides the state of blockchain and current gas limit to do // some pre checks in tx pool and event subscribers. type blockChain interface { - CurrentHeader() *types.Header - SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription - + CurrentBlock() *types.Block GetBlock(hash common.Hash, number uint64) *types.Block StateAt(root common.Hash) (*state.StateDB, error) + + SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription } // TxPoolConfig are the configuration parameters of the transaction pool. @@ -223,7 +224,7 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block } pool.locals = newAccountSet(pool.signer) pool.priced = newTxPricedList(&pool.all) - pool.reset(nil, chain.CurrentHeader()) + pool.reset(nil, chain.CurrentBlock().Header()) // If local transactions and journaling is enabled, load from disk if !config.NoLocals && config.Journal != "" { @@ -265,7 +266,7 @@ func (pool *TxPool) loop() { defer journal.Stop() // Track the previous head headers for transaction reorgs - head := pool.chain.CurrentHeader() + head := pool.chain.CurrentBlock() // Keep waiting for and reacting to the various events for { @@ -277,8 +278,8 @@ func (pool *TxPool) loop() { if pool.chainconfig.IsHomestead(ev.Block.Number()) { pool.homestead = true } - pool.reset(head, ev.Block.Header()) - head = ev.Block.Header() + pool.reset(head.Header(), ev.Block.Header()) + head = ev.Block pool.mu.Unlock() } @@ -344,43 +345,52 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) { var reinject types.Transactions if oldHead != nil && oldHead.Hash() != newHead.ParentHash { - var discarded, included types.Transactions + // If the reorg is too deep, avoid doing it (will happen during fast sync) + oldNum := oldHead.Number.Uint64() + newNum := newHead.Number.Uint64() - var ( - rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64()) - add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) - ) - for rem.NumberU64() > add.NumberU64() { - discarded = append(discarded, rem.Transactions()...) - if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { - log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) - return + if depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 { + log.Warn("Skipping deep transaction reorg", "depth", depth) + } else { + // Reorg seems shallow enough to pull in all transactions into memory + var discarded, included types.Transactions + + var ( + rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64()) + add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) + ) + for rem.NumberU64() > add.NumberU64() { + discarded = append(discarded, rem.Transactions()...) + if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { + log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + return + } } + for add.NumberU64() > rem.NumberU64() { + included = append(included, add.Transactions()...) + if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { + log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + return + } + } + for rem.Hash() != add.Hash() { + discarded = append(discarded, rem.Transactions()...) + if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { + log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + return + } + included = append(included, add.Transactions()...) + if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { + log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + return + } + } + reinject = types.TxDifference(discarded, included) } - for add.NumberU64() > rem.NumberU64() { - included = append(included, add.Transactions()...) - if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { - log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) - return - } - } - for rem.Hash() != add.Hash() { - discarded = append(discarded, rem.Transactions()...) - if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { - log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) - return - } - included = append(included, add.Transactions()...) - if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { - log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) - return - } - } - reinject = types.TxDifference(discarded, included) } // Initialize the internal state to the current head if newHead == nil { - newHead = pool.chain.CurrentHeader() // Special case during testing + newHead = pool.chain.CurrentBlock().Header() // Special case during testing } statedb, err := pool.chain.StateAt(newHead.Root) if err != nil { diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index cdd45b4b1d..17d7368774 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -50,24 +50,24 @@ type testBlockChain struct { chainHeadFeed *event.Feed } -func (bc *testBlockChain) CurrentHeader() *types.Header { - return &types.Header{ +func (bc *testBlockChain) CurrentBlock() *types.Block { + return types.NewBlock(&types.Header{ GasLimit: bc.gasLimit, - } -} - -func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { - return bc.chainHeadFeed.Subscribe(ch) + }, nil, nil, nil) } func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { - return types.NewBlock(bc.CurrentHeader(), nil, nil, nil) + return bc.CurrentBlock() } func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { return bc.statedb, nil } +func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { + return bc.chainHeadFeed.Subscribe(ch) +} + func transaction(nonce uint64, gaslimit *big.Int, key *ecdsa.PrivateKey) *types.Transaction { return pricedTransaction(nonce, gaslimit, big.NewInt(1), key) } From 4ea4d2dc3473afd9d2eda6ef6b359accce1f0946 Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Fri, 18 Aug 2017 21:52:20 +0200 Subject: [PATCH 135/272] core, eth: add bloombit indexer, filter based on it --- core/blockchain.go | 15 - core/bloombits/fetcher_test.go | 101 ++++++ core/bloombits/matcher.go | 579 ++++++++++++++++++++++++++++++ core/bloombits/matcher_test.go | 196 ++++++++++ core/bloombits/utils.go | 63 ++++ core/chain_indexer.go | 76 +++- core/chain_indexer_test.go | 7 +- core/database_util.go | 69 ++-- core/database_util_test.go | 108 ------ core/types/bloom9.go | 14 + eth/api_backend.go | 27 ++ eth/backend.go | 10 +- eth/backend_test.go | 74 ---- eth/db_upgrade.go | 68 ++-- eth/filters/api.go | 48 ++- eth/filters/bench_test.go | 237 ++++++++++++ eth/filters/filter.go | 232 +++++++----- eth/filters/filter_system_test.go | 50 ++- eth/filters/filter_test.go | 70 +--- eth/handler.go | 5 + les/api_backend.go | 18 + les/backend.go | 2 +- miner/worker.go | 2 - 23 files changed, 1589 insertions(+), 482 deletions(-) create mode 100644 core/bloombits/fetcher_test.go create mode 100644 core/bloombits/matcher.go create mode 100644 core/bloombits/matcher_test.go create mode 100644 core/bloombits/utils.go delete mode 100644 eth/backend_test.go create mode 100644 eth/filters/bench_test.go diff --git a/core/blockchain.go b/core/blockchain.go index 0bb12fc190..d74b3520b1 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -759,12 +759,6 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ log.Crit("Failed to write block receipts", "err", err) return } - if err := WriteMipmapBloom(bc.chainDb, block.NumberU64(), receipts); err != nil { - errs[index] = fmt.Errorf("failed to write log blooms: %v", err) - atomic.AddInt32(&failed, 1) - log.Crit("Failed to write log blooms", "err", err) - return - } if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { errs[index] = fmt.Errorf("failed to write lookup metadata: %v", err) atomic.AddInt32(&failed, 1) @@ -1017,10 +1011,6 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { return i, err } - // Write map map bloom filters - if err := WriteMipmapBloom(bc.chainDb, block.NumberU64(), receipts); err != nil { - return i, err - } // Write hash preimages if err := WritePreimages(bc.chainDb, block.NumberU64(), state.Preimages()); err != nil { return i, err @@ -1178,11 +1168,6 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { return err } - // Write map map bloom filters - receipts := GetBlockReceipts(bc.chainDb, block.Hash(), block.NumberU64()) - if err := WriteMipmapBloom(bc.chainDb, block.NumberU64(), receipts); err != nil { - return err - } addedTxs = append(addedTxs, block.Transactions()...) } diff --git a/core/bloombits/fetcher_test.go b/core/bloombits/fetcher_test.go new file mode 100644 index 0000000000..9c229cf8da --- /dev/null +++ b/core/bloombits/fetcher_test.go @@ -0,0 +1,101 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . +package bloombits + +import ( + "bytes" + "encoding/binary" + "math/rand" + "sync" + "sync/atomic" + "testing" + "time" +) + +const testFetcherReqCount = 5000 + +func fetcherTestVector(b uint, s uint64) []byte { + r := make([]byte, 10) + binary.BigEndian.PutUint16(r[0:2], uint16(b)) + binary.BigEndian.PutUint64(r[2:10], s) + return r +} + +func TestFetcher(t *testing.T) { + testFetcher(t, 1) +} + +func TestFetcherMultipleReaders(t *testing.T) { + testFetcher(t, 10) +} + +func testFetcher(t *testing.T, cnt int) { + f := &fetcher{ + requestMap: make(map[uint64]fetchRequest), + } + distCh := make(chan distRequest, channelCap) + stop := make(chan struct{}) + var reqCount uint32 + + for i := 0; i < 10; i++ { + go func() { + for { + req, ok := <-distCh + if !ok { + return + } + time.Sleep(time.Duration(rand.Intn(100000))) + atomic.AddUint32(&reqCount, 1) + f.deliver([]uint64{req.sectionIndex}, [][]byte{fetcherTestVector(req.bloomIndex, req.sectionIndex)}) + } + }() + } + + var wg, wg2 sync.WaitGroup + for cc := 0; cc < cnt; cc++ { + wg.Add(1) + in := make(chan uint64, channelCap) + out := f.fetch(in, distCh, stop, &wg2) + + time.Sleep(time.Millisecond * 10 * time.Duration(cc)) + go func() { + for i := uint64(0); i < testFetcherReqCount; i++ { + in <- i + } + }() + + go func() { + for i := uint64(0); i < testFetcherReqCount; i++ { + bv := <-out + if !bytes.Equal(bv, fetcherTestVector(0, i)) { + if len(bv) != 10 { + t.Errorf("Vector #%d length is %d, expected 10", i, len(bv)) + } else { + j := binary.BigEndian.Uint64(bv[2:10]) + t.Errorf("Expected vector #%d, fetched #%d", i, j) + } + } + } + wg.Done() + }() + } + + wg.Wait() + close(stop) + if reqCount != testFetcherReqCount { + t.Errorf("Request count mismatch: expected %v, got %v", testFetcherReqCount, reqCount) + } +} diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go new file mode 100644 index 0000000000..5a7df6b1c9 --- /dev/null +++ b/core/bloombits/matcher.go @@ -0,0 +1,579 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . +package bloombits + +import ( + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core/types" +) + +const channelCap = 100 + +// fetcher handles bit vector retrieval pipelines for a single bit index +type fetcher struct { + bloomIndex uint + requestMap map[uint64]fetchRequest + requestLock sync.RWMutex +} + +// fetchRequest represents the state of a bit vector requested from a fetcher. When a distRequest has been sent to the distributor but +// the data has not been delivered yet, queued is true. When delivered, it is stored in the data field and the delivered channel is closed. +type fetchRequest struct { + data []byte + queued bool + delivered chan struct{} +} + +// distRequest is sent by the fetcher to the distributor which groups and prioritizes these requests. +type distRequest struct { + bloomIndex uint + sectionIndex uint64 +} + +// fetch creates a retrieval pipeline, receiving section indexes from sectionCh and returning the results +// in the same order through the returned channel. Multiple fetch instances of the same fetcher are allowed +// to run in parallel, in case the same bit index appears multiple times in the filter structure. Each section +// is requested only once, requests are sent to the request distributor (part of Matcher) through distCh. +func (f *fetcher) fetch(sectionCh chan uint64, distCh chan distRequest, stop chan struct{}, wg *sync.WaitGroup) chan []byte { + dataCh := make(chan []byte, channelCap) + returnCh := make(chan uint64, channelCap) + wg.Add(2) + + go func() { + defer wg.Done() + defer close(returnCh) + + for { + select { + case <-stop: + return + case idx, ok := <-sectionCh: + if !ok { + return + } + + req := false + f.requestLock.Lock() + r := f.requestMap[idx] + if r.data == nil { + req = !r.queued + r.queued = true + if r.delivered == nil { + r.delivered = make(chan struct{}) + } + f.requestMap[idx] = r + } + f.requestLock.Unlock() + if req { + distCh <- distRequest{bloomIndex: f.bloomIndex, sectionIndex: idx} // success is guaranteed, distibuteRequests shuts down after fetch + } + select { + case <-stop: + return + case returnCh <- idx: + } + } + } + }() + + go func() { + defer wg.Done() + defer close(dataCh) + + for { + select { + case <-stop: + return + case idx, ok := <-returnCh: + if !ok { + return + } + + f.requestLock.RLock() + r := f.requestMap[idx] + f.requestLock.RUnlock() + + if r.data == nil { + select { + case <-stop: + return + case <-r.delivered: + f.requestLock.RLock() + r = f.requestMap[idx] + f.requestLock.RUnlock() + } + } + select { + case <-stop: + return + case dataCh <- r.data: + } + } + } + }() + + return dataCh +} + +// deliver is called by the request distributor when a reply to a request has +// arrived +func (f *fetcher) deliver(sectionIdxList []uint64, data [][]byte) { + f.requestLock.Lock() + defer f.requestLock.Unlock() + + for i, sectionIdx := range sectionIdxList { + r := f.requestMap[sectionIdx] + if r.data != nil { + panic("BloomBits section data delivered twice") + } + r.data = data[i] + close(r.delivered) + f.requestMap[sectionIdx] = r + } +} + +// Matcher is a pipelined structure of fetchers and logic matchers which perform +// binary AND/OR operations on the bitstreams, finally creating a stream of potential matches. +type Matcher struct { + addresses []types.BloomIndexList + topics [][]types.BloomIndexList + fetchers map[uint]*fetcher + sectionSize uint64 + + distCh chan distRequest + reqs map[uint][]uint64 + freeQueues map[uint]struct{} + allocQueue []chan uint + running bool + stop chan struct{} + lock sync.Mutex + wg, distWg sync.WaitGroup +} + +// NewMatcher creates a new Matcher instance +func NewMatcher(sectionSize uint64, addresses []common.Address, topics [][]common.Hash) *Matcher { + m := &Matcher{ + fetchers: make(map[uint]*fetcher), + reqs: make(map[uint][]uint64), + freeQueues: make(map[uint]struct{}), + distCh: make(chan distRequest, channelCap), + sectionSize: sectionSize, + } + m.setAddresses(addresses) + m.setTopics(topics) + return m +} + +// setAddresses matches only logs that are generated from addresses that are included +// in the given addresses. +func (m *Matcher) setAddresses(addresses []common.Address) { + m.addresses = make([]types.BloomIndexList, len(addresses)) + for i, address := range addresses { + m.addresses[i] = types.BloomIndexes(address.Bytes()) + } + + for _, bloomIndexList := range m.addresses { + for _, bloomIndex := range bloomIndexList { + m.newFetcher(bloomIndex) + } + } +} + +// setTopics matches only logs that have topics matching the given topics. +func (m *Matcher) setTopics(topics [][]common.Hash) { + m.topics = nil +loop: + for _, topicList := range topics { + t := make([]types.BloomIndexList, len(topicList)) + for i, topic := range topicList { + if (topic == common.Hash{}) { + continue loop + } + t[i] = types.BloomIndexes(topic.Bytes()) + } + m.topics = append(m.topics, t) + } + + for _, bloomIndexLists := range m.topics { + for _, bloomIndexList := range bloomIndexLists { + for _, bloomIndex := range bloomIndexList { + m.newFetcher(bloomIndex) + } + } + } +} + +// match creates a daisy-chain of sub-matchers, one for the address set and one for each topic set, each +// sub-matcher receiving a section only if the previous ones have all found a potential match in one of +// the blocks of the section, then binary AND-ing its own matches and forwaring the result to the next one +func (m *Matcher) match(processCh chan partialMatches) chan partialMatches { + indexLists := m.topics + if len(m.addresses) > 0 { + indexLists = append([][]types.BloomIndexList{m.addresses}, indexLists...) + } + m.distributeRequests() + + for _, subIndexList := range indexLists { + processCh = m.subMatch(processCh, subIndexList) + } + return processCh +} + +// partialMatches with a non-nil vector represents a section in which some sub-matchers have already +// found potential matches. Subsequent sub-matchers will binary AND their matches with this vector. +// If vector is nil, it represents a section to be processed by the first sub-matcher. +type partialMatches struct { + sectionIndex uint64 + vector []byte +} + +// newFetcher adds a fetcher for the given bit index if it has not existed before +func (m *Matcher) newFetcher(idx uint) { + if _, ok := m.fetchers[idx]; ok { + return + } + f := &fetcher{ + bloomIndex: idx, + requestMap: make(map[uint64]fetchRequest), + } + m.fetchers[idx] = f +} + +// subMatch creates a sub-matcher that filters for a set of addresses or topics, binary OR-s those matches, then +// binary AND-s the result to the daisy-chain input (processCh) and forwards it to the daisy-chain output. +// The matches of each address/topic are calculated by fetching the given sections of the three bloom bit indexes belonging to +// that address/topic, and binary AND-ing those vectors together. +func (m *Matcher) subMatch(processCh chan partialMatches, bloomIndexLists []types.BloomIndexList) chan partialMatches { + // set up fetchers + fetchIndexChannels := make([][3]chan uint64, len(bloomIndexLists)) + fetchDataChannels := make([][3]chan []byte, len(bloomIndexLists)) + for i, bloomIndexList := range bloomIndexLists { + for j, bloomIndex := range bloomIndexList { + fetchIndexChannels[i][j] = make(chan uint64, channelCap) + fetchDataChannels[i][j] = m.fetchers[bloomIndex].fetch(fetchIndexChannels[i][j], m.distCh, m.stop, &m.wg) + } + } + + fetchedCh := make(chan partialMatches, channelCap) // entries from processCh are forwarded here after fetches have been initiated + resultsCh := make(chan partialMatches, channelCap) + + m.wg.Add(2) + // goroutine for starting retrievals + go func() { + defer m.wg.Done() + + for { + select { + case <-m.stop: + return + case s, ok := <-processCh: + if !ok { + close(fetchedCh) + for _, fetchIndexChs := range fetchIndexChannels { + for _, fetchIndexCh := range fetchIndexChs { + close(fetchIndexCh) + } + } + return + } + + for _, fetchIndexChs := range fetchIndexChannels { + for _, fetchIndexCh := range fetchIndexChs { + select { + case <-m.stop: + return + case fetchIndexCh <- s.sectionIndex: + } + } + } + select { + case <-m.stop: + return + case fetchedCh <- s: + } + } + } + }() + + // goroutine for processing retrieved data + go func() { + defer m.wg.Done() + + for { + select { + case <-m.stop: + return + case s, ok := <-fetchedCh: + if !ok { + close(resultsCh) + return + } + + var orVector []byte + for _, fetchDataChs := range fetchDataChannels { + var andVector []byte + for _, fetchDataCh := range fetchDataChs { + var data []byte + select { + case <-m.stop: + return + case data = <-fetchDataCh: + } + if andVector == nil { + andVector = make([]byte, int(m.sectionSize/8)) + copy(andVector, data) + } else { + bitutil.ANDBytes(andVector, andVector, data) + } + } + if orVector == nil { + orVector = andVector + } else { + bitutil.ORBytes(orVector, orVector, andVector) + } + } + + if orVector == nil { + orVector = make([]byte, int(m.sectionSize/8)) + } + if s.vector != nil { + bitutil.ANDBytes(orVector, orVector, s.vector) + } + if bitutil.TestBytes(orVector) { + select { + case <-m.stop: + return + case resultsCh <- partialMatches{s.sectionIndex, orVector}: + } + } + } + } + }() + + return resultsCh +} + +// Start starts the matching process and returns a stream of bloom matches in +// a given range of blocks. +// It returns a results channel immediately and stops if Stop is called or there +// are no more matches in the range (in which case the results channel is closed). +// Start/Stop can be called multiple times for different ranges, in which case already +// delivered bit vectors are not requested again. +func (m *Matcher) Start(begin, end uint64) chan uint64 { + m.stop = make(chan struct{}) + processCh := make(chan partialMatches, channelCap) + resultsCh := make(chan uint64, channelCap) + + res := m.match(processCh) + + startSection := begin / m.sectionSize + endSection := end / m.sectionSize + + m.wg.Add(2) + go func() { + defer m.wg.Done() + defer close(processCh) + + for i := startSection; i <= endSection; i++ { + select { + case processCh <- partialMatches{i, nil}: + case <-m.stop: + return + } + } + }() + + go func() { + defer m.wg.Done() + defer close(resultsCh) + + for { + select { + case r, ok := <-res: + if !ok { + return + } + sectionStart := r.sectionIndex * m.sectionSize + s := sectionStart + if begin > s { + s = begin + } + e := sectionStart + m.sectionSize - 1 + if end < e { + e = end + } + for i := s; i <= e; i++ { + b := r.vector[(i-sectionStart)/8] + bit := 7 - i%8 + if b != 0 { + if b&(1< queue[i] { + i++ + } + queue = append(queue, 0) + copy(queue[i+1:], queue[i:len(queue)-1]) + queue[i] = r.sectionIndex + m.reqs[r.bloomIndex] = queue + if len(queue) == 1 { + m.freeQueue(r.bloomIndex) + } + m.lock.Unlock() + case <-stopDist: + m.lock.Lock() + for _, ch := range m.allocQueue { + close(ch) + } + m.allocQueue = nil + m.running = false + m.lock.Unlock() + m.distWg.Done() + return + } + } + }() +} + +// freeQueue marks a queue as free if there are no AllocSectionQueue functions +// waiting for allocation. If there is someone waiting, the queue is immediately +// allocated. +func (m *Matcher) freeQueue(bloomIndex uint) { + if len(m.allocQueue) > 0 { + m.allocQueue[0] <- bloomIndex + m.allocQueue = m.allocQueue[1:] + } else { + m.freeQueues[bloomIndex] = struct{}{} + } +} + +// AllocSectionQueue allocates a queue of requested section indexes belonging to the same +// bloom bit index for a client process that can either immediately fetch the contents +// of the queue or wait a little while for more section indexes to be requested. +func (m *Matcher) AllocSectionQueue() (uint, bool) { + m.lock.Lock() + if !m.running { + m.lock.Unlock() + return 0, false + } + + var allocCh chan uint + if len(m.freeQueues) > 0 { + var ( + found bool + bestSection uint64 + bestIndex uint + ) + for bloomIndex, _ := range m.freeQueues { + if !found || m.reqs[bloomIndex][0] < bestSection { + found = true + bestIndex = bloomIndex + bestSection = m.reqs[bloomIndex][0] + } + } + delete(m.freeQueues, bestIndex) + m.lock.Unlock() + return bestIndex, true + } else { + allocCh = make(chan uint) + m.allocQueue = append(m.allocQueue, allocCh) + } + m.lock.Unlock() + + bloomIndex, ok := <-allocCh + return bloomIndex, ok +} + +// SectionCount returns the length of the section index queue belonging to the given bloom bit index +func (m *Matcher) SectionCount(bloomIndex uint) int { + m.lock.Lock() + defer m.lock.Unlock() + + return len(m.reqs[bloomIndex]) +} + +// FetchSections fetches all or part of an already allocated queue and deallocates it +func (m *Matcher) FetchSections(bloomIndex uint, maxCount int) []uint64 { + m.lock.Lock() + defer m.lock.Unlock() + + queue := m.reqs[bloomIndex] + if maxCount < len(queue) { + // return only part of the existing queue, mark the rest as free + m.reqs[bloomIndex] = queue[maxCount:] + m.freeQueue(bloomIndex) + return queue[:maxCount] + } else { + // return the entire queue + delete(m.reqs, bloomIndex) + return queue + } +} + +// Deliver delivers a bit vector to the appropriate fetcher. +// It is possible to deliver data even after Stop has been called. Once a vector has been +// requested, the matcher will keep waiting for delivery. +func (m *Matcher) Deliver(bloomIndex uint, sectionIdxList []uint64, data [][]byte) { + m.fetchers[bloomIndex].deliver(sectionIdxList, data) +} diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go new file mode 100644 index 0000000000..bef1491b83 --- /dev/null +++ b/core/bloombits/matcher_test.go @@ -0,0 +1,196 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . +package bloombits + +import ( + "math/rand" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/core/types" +) + +const testSectionSize = 4096 + +func matcherTestVector(b uint, s uint64) []byte { + r := make([]byte, testSectionSize/8) + for i, _ := range r { + var bb byte + for bit := 0; bit < 8; bit++ { + blockIdx := s*testSectionSize + uint64(i*8+bit) + bb += bb + if (blockIdx % uint64(b)) == 0 { + bb++ + } + } + r[i] = bb + } + return r +} + +func expMatch1(idxs types.BloomIndexList, i uint64) bool { + for _, ii := range idxs { + if (i % uint64(ii)) != 0 { + return false + } + } + return true +} + +func expMatch2(idxs []types.BloomIndexList, i uint64) bool { + for _, ii := range idxs { + if expMatch1(ii, i) { + return true + } + } + return false +} + +func expMatch3(idxs [][]types.BloomIndexList, i uint64) bool { + for _, ii := range idxs { + if !expMatch2(ii, i) { + return false + } + } + return true +} + +func testServeMatcher(m *Matcher, stop chan struct{}, cnt *uint32, maxRequestLen int) { + // serve matcher with test vectors + for i := 0; i < 10; i++ { + go func() { + for { + select { + case <-stop: + return + default: + } + b, ok := m.AllocSectionQueue() + if !ok { + return + } + if m.SectionCount(b) < maxRequestLen { + time.Sleep(time.Microsecond * 100) + } + s := m.FetchSections(b, maxRequestLen) + res := make([][]byte, len(s)) + for i, ss := range s { + res[i] = matcherTestVector(b, ss) + atomic.AddUint32(cnt, 1) + } + m.Deliver(b, s, res) + } + }() + } +} + +func testMatcher(t *testing.T, idxs [][]types.BloomIndexList, cnt uint64, stopOnMatches bool, expCount uint32) uint32 { + count1 := testMatcherWithReqCount(t, idxs, cnt, stopOnMatches, expCount, 1) + count16 := testMatcherWithReqCount(t, idxs, cnt, stopOnMatches, expCount, 16) + if count1 != count16 { + t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: request count mismatch, %v with maxReqCount = 1 vs. %v with maxReqCount = 16", idxs, cnt, stopOnMatches, count1, count16) + } + return count1 +} + +func testMatcherWithReqCount(t *testing.T, idxs [][]types.BloomIndexList, cnt uint64, stopOnMatches bool, expCount uint32, maxReqCount int) uint32 { + m := NewMatcher(testSectionSize, nil, nil) + + for _, idxss := range idxs { + for _, idxs := range idxss { + for _, idx := range idxs { + m.newFetcher(idx) + } + } + } + + m.addresses = idxs[0] + m.topics = idxs[1:] + var reqCount uint32 + + stop := make(chan struct{}) + chn := m.Start(0, cnt-1) + testServeMatcher(m, stop, &reqCount, maxReqCount) + + for i := uint64(0); i < cnt; i++ { + if expMatch3(idxs, i) { + match, ok := <-chn + if !ok { + t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: expected #%v, results channel closed", idxs, cnt, stopOnMatches, i) + return 0 + } + if match != i { + t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: expected #%v, got #%v", idxs, cnt, stopOnMatches, i, match) + } + if stopOnMatches { + m.Stop() + close(stop) + stop = make(chan struct{}) + chn = m.Start(i+1, cnt-1) + testServeMatcher(m, stop, &reqCount, maxReqCount) + } + } + } + match, ok := <-chn + if ok { + t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: expected closed channel, got #%v", idxs, cnt, stopOnMatches, match) + } + m.Stop() + close(stop) + + if expCount != 0 && expCount != reqCount { + t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: request count mismatch, expected #%v, got #%v", idxs, cnt, stopOnMatches, expCount, reqCount) + } + + return reqCount +} + +func testRandomIdxs(l []int, max int) [][]types.BloomIndexList { + res := make([][]types.BloomIndexList, len(l)) + for i, ll := range l { + res[i] = make([]types.BloomIndexList, ll) + for j, _ := range res[i] { + for k, _ := range res[i][j] { + res[i][j][k] = uint(rand.Intn(max-1) + 2) + } + } + } + return res +} + +func TestMatcher(t *testing.T) { + testMatcher(t, [][]types.BloomIndexList{{{10, 20, 30}}}, 100000, false, 75) + testMatcher(t, [][]types.BloomIndexList{{{32, 3125, 100}}, {{40, 50, 10}}}, 100000, false, 81) + testMatcher(t, [][]types.BloomIndexList{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, false, 36) +} + +func TestMatcherStopOnMatches(t *testing.T) { + testMatcher(t, [][]types.BloomIndexList{{{10, 20, 30}}}, 100000, true, 75) + testMatcher(t, [][]types.BloomIndexList{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, true, 36) +} + +func TestMatcherRandom(t *testing.T) { + for i := 0; i < 20; i++ { + testMatcher(t, testRandomIdxs([]int{1}, 50), 100000, false, 0) + testMatcher(t, testRandomIdxs([]int{3}, 50), 100000, false, 0) + testMatcher(t, testRandomIdxs([]int{2, 2, 2}, 20), 100000, false, 0) + testMatcher(t, testRandomIdxs([]int{5, 5, 5}, 50), 100000, false, 0) + idxs := testRandomIdxs([]int{2, 2, 2}, 20) + reqCount := testMatcher(t, idxs, 10000, false, 0) + testMatcher(t, idxs, 10000, true, reqCount) + } +} diff --git a/core/bloombits/utils.go b/core/bloombits/utils.go new file mode 100644 index 0000000000..d0755cb65c --- /dev/null +++ b/core/bloombits/utils.go @@ -0,0 +1,63 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . +package bloombits + +import ( + "github.com/ethereum/go-ethereum/core/types" +) + +const BloomLength = 2048 + +// BloomBitsCreator takes SectionSize number of header bloom filters and calculates the bloomBits vectors of the section +type BloomBitsCreator struct { + blooms [BloomLength][]byte + sectionSize, bitIndex uint64 +} + +func NewBloomBitsCreator(sectionSize uint64) *BloomBitsCreator { + b := &BloomBitsCreator{sectionSize: sectionSize} + for i, _ := range b.blooms { + b.blooms[i] = make([]byte, sectionSize/8) + } + return b +} + +// AddHeaderBloom takes a single bloom filter and sets the corresponding bit column in memory accordingly +func (b *BloomBitsCreator) AddHeaderBloom(bloom types.Bloom) { + if b.bitIndex >= b.sectionSize { + panic("too many header blooms added") + } + + byteIdx := b.bitIndex / 8 + bitMask := byte(1) << byte(7-b.bitIndex%8) + for bloomBitIdx, _ := range b.blooms { + bloomByteIdx := BloomLength/8 - 1 - bloomBitIdx/8 + bloomBitMask := byte(1) << byte(bloomBitIdx%8) + if (bloom[bloomByteIdx] & bloomBitMask) != 0 { + b.blooms[bloomBitIdx][byteIdx] |= bitMask + } + } + b.bitIndex++ +} + +// GetBitVector returns the bit vector belonging to the given bit index after header blooms have been added +func (b *BloomBitsCreator) GetBitVector(idx uint) []byte { + if b.bitIndex != b.sectionSize { + panic("not enough header blooms added") + } + + return b.blooms[idx][:] +} diff --git a/core/chain_indexer.go b/core/chain_indexer.go index 9a88a5b1b8..56360b59a3 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -36,7 +36,7 @@ import ( type ChainIndexerBackend interface { // Reset initiates the processing of a new chain segment, potentially terminating // any partially completed operations (in case of a reorg). - Reset(section uint64) + Reset(section uint64, lastSectionHead common.Hash) // Process crunches through the next header in the chain segment. The caller // will ensure a sequential order of headers. @@ -44,7 +44,7 @@ type ChainIndexerBackend interface { // Commit finalizes the section metadata and stores it into the database. This // interface will usually be a batch writer. - Commit(db ethdb.Database) error + Commit() error } // ChainIndexer does a post-processing job for equally sized sections of the @@ -101,10 +101,34 @@ func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBacken return c } +// AddKnownSectionHead marks a new section head as known/processed if it is newer +// than the already known best section head +func (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash) { + c.lock.Lock() + defer c.lock.Unlock() + + if section < c.storedSections { + return + } + c.setSectionHead(section, shead) + c.setValidSections(section + 1) +} + +// IndexerChain interface is used for connecting the indexer to a blockchain +type IndexerChain interface { + CurrentHeader() *types.Header + SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription +} + // Start creates a goroutine to feed chain head events into the indexer for -// cascading background processing. -func (c *ChainIndexer) Start(currentHeader *types.Header, eventMux *event.TypeMux) { - go c.eventLoop(currentHeader, eventMux) +// cascading background processing. Children do not need to be started, they +// are notified about new events by their parents. +func (c *ChainIndexer) Start(chain IndexerChain) { + ch := make(chan ChainEvent, 10) + sub := chain.SubscribeChainEvent(ch) + currentHeader := chain.CurrentHeader() + + go c.eventLoop(currentHeader, ch, sub) } // Close tears down all goroutines belonging to the indexer and returns any error @@ -125,6 +149,14 @@ func (c *ChainIndexer) Close() error { errs = append(errs, err) } } + + // Close all children + for _, child := range c.children { + if err := child.Close(); err != nil { + errs = append(errs, err) + } + } + // Return any failures switch { case len(errs) == 0: @@ -141,12 +173,10 @@ func (c *ChainIndexer) Close() error { // eventLoop is a secondary - optional - event loop of the indexer which is only // started for the outermost indexer to push chain head events into a processing // queue. -func (c *ChainIndexer) eventLoop(currentHeader *types.Header, eventMux *event.TypeMux) { +func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent, sub event.Subscription) { // Mark the chain indexer as active, requiring an additional teardown atomic.StoreUint32(&c.active, 1) - // Subscribe to chain head events - sub := eventMux.Subscribe(ChainEvent{}) defer sub.Unsubscribe() // Fire the initial new head event to start any outstanding processing @@ -163,14 +193,14 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, eventMux *event.Ty errc <- nil return - case ev, ok := <-sub.Chan(): + case ev, ok := <-ch: // Received a new event, ensure it's not nil (closing) and update if !ok { errc := <-c.quit errc <- nil return } - header := ev.Data.(ChainEvent).Block.Header() + header := ev.Block.Header() if header.ParentHash != prevHash { c.newHead(FindCommonAncestor(c.chainDb, prevHeader, header).Number.Uint64(), true) } @@ -226,7 +256,10 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // updateLoop is the main event loop of the indexer which pushes chain segments // down into the processing backend. func (c *ChainIndexer) updateLoop() { - var updated time.Time + var ( + updated time.Time + updateMsg bool + ) for { select { @@ -242,6 +275,7 @@ func (c *ChainIndexer) updateLoop() { // Periodically print an upgrade log message to the user if time.Since(updated) > 8*time.Second { if c.knownSections > c.storedSections+1 { + updateMsg = true c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) } updated = time.Now() @@ -250,17 +284,24 @@ func (c *ChainIndexer) updateLoop() { section := c.storedSections var oldHead common.Hash if section > 0 { - oldHead = c.sectionHead(section - 1) + oldHead = c.SectionHead(section - 1) } // Process the newly defined section in the background c.lock.Unlock() newHead, err := c.processSection(section, oldHead) + if err != nil { + c.log.Error("Section processing failed", "error", err) + } c.lock.Lock() // If processing succeeded and no reorgs occcurred, mark the section completed - if err == nil && oldHead == c.sectionHead(section-1) { + if err == nil && oldHead == c.SectionHead(section-1) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) + if c.storedSections == c.knownSections && updateMsg { + updateMsg = false + c.log.Info("Finished upgrading chain index") + } c.cascadedHead = c.storedSections*c.sectionSize - 1 for _, child := range c.children { @@ -295,7 +336,7 @@ func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (com c.log.Trace("Processing new chain section", "section", section) // Reset and partial processing - c.backend.Reset(section) + c.backend.Reset(section, lastHead) for number := section * c.sectionSize; number < (section+1)*c.sectionSize; number++ { hash := GetCanonicalHash(c.chainDb, number) @@ -311,7 +352,8 @@ func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (com c.backend.Process(header) lastHead = header.Hash() } - if err := c.backend.Commit(c.chainDb); err != nil { + if err := c.backend.Commit(); err != nil { + c.log.Error("Section commit failed", "error", err) return common.Hash{}, err } return lastHead, nil @@ -324,7 +366,7 @@ func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { c.lock.Lock() defer c.lock.Unlock() - return c.storedSections, c.storedSections*c.sectionSize - 1, c.sectionHead(c.storedSections - 1) + return c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1) } // AddChildIndexer adds a child ChainIndexer that can use the output of this one @@ -366,7 +408,7 @@ func (c *ChainIndexer) setValidSections(sections uint64) { // sectionHead retrieves the last block hash of a processed section from the // index database. -func (c *ChainIndexer) sectionHead(section uint64) common.Hash { +func (c *ChainIndexer) SectionHead(section uint64) common.Hash { var data [8]byte binary.BigEndian.PutUint64(data[:], section) diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index 780e46e433..247f52cf9e 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -23,6 +23,7 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" ) @@ -58,7 +59,6 @@ func testChainIndexer(t *testing.T, count int) { ) backends[i] = &testChainIndexBackend{t: t, processCh: make(chan uint64)} backends[i].indexer = NewChainIndexer(db, ethdb.NewTable(db, string([]byte{byte(i)})), backends[i], sectionSize, confirmsReq, 0, fmt.Sprintf("indexer-%d", i)) - defer backends[i].indexer.Close() if sections, _, _ := backends[i].indexer.Sections(); sections != 0 { t.Fatalf("Canonical section count mismatch: have %v, want %v", sections, 0) @@ -67,6 +67,7 @@ func testChainIndexer(t *testing.T, count int) { backends[i-1].indexer.AddChildIndexer(backends[i].indexer) } } + defer backends[0].indexer.Close() // parent indexer shuts down children // notify pings the root indexer about a new head or reorg, then expect // processed blocks if a section is processable notify := func(headNum, failNum uint64, reorg bool) { @@ -208,7 +209,7 @@ func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { return b.stored * b.indexer.sectionSize } -func (b *testChainIndexBackend) Reset(section uint64) { +func (b *testChainIndexBackend) Reset(section uint64, lastSectionHead common.Hash) { b.section = section b.headerCnt = 0 } @@ -226,7 +227,7 @@ func (b *testChainIndexBackend) Process(header *types.Header) { } } -func (b *testChainIndexBackend) Commit(db ethdb.Database) error { +func (b *testChainIndexBackend) Commit() error { if b.headerCnt != b.indexer.sectionSize { b.t.Error("Not enough headers processed") } diff --git a/core/database_util.go b/core/database_util.go index 6971113944..179d6f1b2d 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -23,7 +23,6 @@ import ( "errors" "fmt" "math/big" - "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -48,9 +47,6 @@ var ( lookupPrefix = []byte("l") // lookupPrefix + hash -> transaction/receipt lookup metadata preimagePrefix = "secure-key-" // preimagePrefix + hash -> preimage - mipmapPre = []byte("mipmap-log-bloom-") - MIPMapLevels = []uint64{1000000, 500000, 100000, 50000, 1000} - configPrefix = []byte("ethereum-config-") // config prefix for the db // used by old db, now only used for conversion @@ -59,10 +55,10 @@ var ( ErrChainConfigNotFound = errors.New("ChainConfig not found") // general config not found error - mipmapBloomMu sync.Mutex // protect against race condition when updating mipmap blooms - preimageCounter = metrics.NewCounter("db/preimage/total") preimageHitCounter = metrics.NewCounter("db/preimage/hits") + + bloomBitsPrefix = []byte("bloomBits-") ) // txLookupEntry is a positional metadata to help looking up the data content of @@ -497,48 +493,6 @@ func DeleteTxLookupEntry(db ethdb.Database, hash common.Hash) { db.Delete(append(lookupPrefix, hash.Bytes()...)) } -// returns a formatted MIP mapped key by adding prefix, canonical number and level -// -// ex. fn(98, 1000) = (prefix || 1000 || 0) -func mipmapKey(num, level uint64) []byte { - lkey := make([]byte, 8) - binary.BigEndian.PutUint64(lkey, level) - key := new(big.Int).SetUint64(num / level * level) - - return append(mipmapPre, append(lkey, key.Bytes()...)...) -} - -// WriteMipmapBloom writes each address included in the receipts' logs to the -// MIP bloom bin. -func WriteMipmapBloom(db ethdb.Database, number uint64, receipts types.Receipts) error { - mipmapBloomMu.Lock() - defer mipmapBloomMu.Unlock() - - batch := db.NewBatch() - for _, level := range MIPMapLevels { - key := mipmapKey(number, level) - bloomDat, _ := db.Get(key) - bloom := types.BytesToBloom(bloomDat) - for _, receipt := range receipts { - for _, log := range receipt.Logs { - bloom.Add(log.Address.Big()) - } - } - batch.Put(key, bloom.Bytes()) - } - if err := batch.Write(); err != nil { - return fmt.Errorf("mipmap write fail for: %d: %v", number, err) - } - return nil -} - -// GetMipmapBloom returns a bloom filter using the number and level as input -// parameters. For available levels see MIPMapLevels. -func GetMipmapBloom(db ethdb.Database, number, level uint64) types.Bloom { - bloomDat, _ := db.Get(mipmapKey(number, level)) - return types.BytesToBloom(bloomDat) -} - // PreimageTable returns a Database instance with the key prefix for preimage entries. func PreimageTable(db ethdb.Database) ethdb.Database { return ethdb.NewTable(db, preimagePrefix) @@ -637,3 +591,22 @@ func FindCommonAncestor(db ethdb.Database, a, b *types.Header) *types.Header { } return a } + +// GetBloomBits reads the compressed bloomBits vector belonging to the given section and bit index from the db +func GetBloomBits(db ethdb.Database, bitIdx, sectionIdx uint64, sectionHead common.Hash) ([]byte, error) { + var encKey [10]byte + binary.BigEndian.PutUint16(encKey[0:2], uint16(bitIdx)) + binary.BigEndian.PutUint64(encKey[2:10], sectionIdx) + key := append(append(bloomBitsPrefix, encKey[:]...), sectionHead.Bytes()...) + bloomBits, err := db.Get(key) + return bloomBits, err +} + +// StoreBloomBits writes the compressed bloomBits vector belonging to the given section and bit index to the db +func StoreBloomBits(db ethdb.Database, bitIdx, sectionIdx uint64, sectionHead common.Hash, bloomBits []byte) { + var encKey [10]byte + binary.BigEndian.PutUint16(encKey[0:2], uint16(bitIdx)) + binary.BigEndian.PutUint64(encKey[2:10], sectionIdx) + key := append(append(bloomBitsPrefix, encKey[:]...), sectionHead.Bytes()...) + db.Put(key, bloomBits) +} diff --git a/core/database_util_test.go b/core/database_util_test.go index e91f1b5930..940221a299 100644 --- a/core/database_util_test.go +++ b/core/database_util_test.go @@ -18,17 +18,13 @@ package core import ( "bytes" - "io/ioutil" "math/big" - "os" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) @@ -390,107 +386,3 @@ func TestBlockReceiptStorage(t *testing.T) { t.Fatalf("deleted receipts returned: %v", rs) } } - -func TestMipmapBloom(t *testing.T) { - db, _ := ethdb.NewMemDatabase() - - receipt1 := new(types.Receipt) - receipt1.Logs = []*types.Log{ - {Address: common.BytesToAddress([]byte("test"))}, - {Address: common.BytesToAddress([]byte("address"))}, - } - receipt2 := new(types.Receipt) - receipt2.Logs = []*types.Log{ - {Address: common.BytesToAddress([]byte("test"))}, - {Address: common.BytesToAddress([]byte("address1"))}, - } - - WriteMipmapBloom(db, 1, types.Receipts{receipt1}) - WriteMipmapBloom(db, 2, types.Receipts{receipt2}) - - for _, level := range MIPMapLevels { - bloom := GetMipmapBloom(db, 2, level) - if !bloom.Test(new(big.Int).SetBytes([]byte("address1"))) { - t.Error("expected test to be included on level:", level) - } - } - - // reset - db, _ = ethdb.NewMemDatabase() - receipt := new(types.Receipt) - receipt.Logs = []*types.Log{ - {Address: common.BytesToAddress([]byte("test"))}, - } - WriteMipmapBloom(db, 999, types.Receipts{receipt1}) - - receipt = new(types.Receipt) - receipt.Logs = []*types.Log{ - {Address: common.BytesToAddress([]byte("test 1"))}, - } - WriteMipmapBloom(db, 1000, types.Receipts{receipt}) - - bloom := GetMipmapBloom(db, 1000, 1000) - if bloom.TestBytes([]byte("test")) { - t.Error("test should not have been included") - } -} - -func TestMipmapChain(t *testing.T) { - dir, err := ioutil.TempDir("", "mipmap") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) - key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - addr = crypto.PubkeyToAddress(key1.PublicKey) - addr2 = common.BytesToAddress([]byte("jeff")) - - hash1 = common.BytesToHash([]byte("topic1")) - ) - defer db.Close() - - gspec := &Genesis{ - Config: params.TestChainConfig, - Alloc: GenesisAlloc{addr: {Balance: big.NewInt(1000000)}}, - } - genesis := gspec.MustCommit(db) - chain, receipts := GenerateChain(params.TestChainConfig, genesis, db, 1010, func(i int, gen *BlockGen) { - var receipts types.Receipts - switch i { - case 1: - receipt := types.NewReceipt(nil, false, new(big.Int)) - receipt.Logs = []*types.Log{{Address: addr, Topics: []common.Hash{hash1}}} - gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} - case 1000: - receipt := types.NewReceipt(nil, false, new(big.Int)) - receipt.Logs = []*types.Log{{Address: addr2}} - gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} - - } - - // store the receipts - WriteMipmapBloom(db, uint64(i+1), receipts) - }) - for i, block := range chain { - WriteBlock(db, block) - if err := WriteCanonicalHash(db, block.Hash(), block.NumberU64()); err != nil { - t.Fatalf("failed to insert block number: %v", err) - } - if err := WriteHeadBlockHash(db, block.Hash()); err != nil { - t.Fatalf("failed to insert block number: %v", err) - } - if err := WriteBlockReceipts(db, block.Hash(), block.NumberU64(), receipts[i]); err != nil { - t.Fatal("error writing block receipts:", err) - } - } - - bloom := GetMipmapBloom(db, 0, 1000) - if bloom.TestBytes(addr2[:]) { - t.Error("address was included in bloom and should not have") - } -} diff --git a/core/types/bloom9.go b/core/types/bloom9.go index 60aacc3016..bdc6e60e79 100644 --- a/core/types/bloom9.go +++ b/core/types/bloom9.go @@ -106,6 +106,20 @@ func LogsBloom(logs []*Log) *big.Int { return bin } +type BloomIndexList [3]uint + +// BloomIndexes returns the bloom filter bit indexes belonging to the given key +func BloomIndexes(b []byte) BloomIndexList { + b = crypto.Keccak256(b[:]) + + var r [3]uint + for i, _ := range r { + r[i] = (uint(b[i+i+1]) + (uint(b[i+i]) << 8)) & 2047 + } + + return r +} + func bloom9(b []byte) *big.Int { b = crypto.Keccak256(b[:]) diff --git a/eth/api_backend.go b/eth/api_backend.go index 19ef79f234..fa3cf3f805 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -194,3 +195,29 @@ func (b *EthApiBackend) EventMux() *event.TypeMux { func (b *EthApiBackend) AccountManager() *accounts.Manager { return b.eth.AccountManager() } + +func (b *EthApiBackend) GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) { + results := make([][]byte, len(sectionIdxList)) + var err error + for i, sectionIdx := range sectionIdxList { + sectionHead := core.GetCanonicalHash(b.eth.chainDb, (sectionIdx+1)*bloomBitsSection-1) + results[i], err = core.GetBloomBits(b.eth.chainDb, bitIdx, sectionIdx, sectionHead) + if err != nil { + return nil, err + } + } + return results, nil +} + +func (b *EthApiBackend) BloomBitsSections() uint64 { + sections, _, _ := b.eth.bbIndexer.Sections() + return sections +} + +func (b *EthApiBackend) BloomBitsConfig() filters.BloomConfig { + return filters.BloomConfig{ + SectionSize: bloomBitsSection, + MaxRequestLen: 16, + MaxRequestWait: 0, + } +} diff --git a/eth/backend.go b/eth/backend.go index 5837c85641..efc0a2317f 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -77,6 +77,8 @@ type Ethereum struct { engine consensus.Engine accountManager *accounts.Manager + bbIndexer *core.ChainIndexer + ApiBackend *EthApiBackend miner *miner.Miner @@ -125,11 +127,9 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { networkId: config.NetworkId, gasPrice: config.GasPrice, etherbase: config.Etherbase, + bbIndexer: NewBloomBitsProcessor(chainDb, bloomBitsSection), } - if err := addMipmapBloomBins(chainDb); err != nil { - return nil, err - } log.Info("Initialising Ethereum protocol", "versions", ProtocolVersions, "network", config.NetworkId) if !config.SkipBcVersionCheck { @@ -151,6 +151,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { eth.blockchain.SetHead(compat.RewindTo) core.WriteChainConfig(chainDb, genesisHash, chainConfig) } + eth.bbIndexer.Start(eth.blockchain) if config.TxPool.Journal != "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) @@ -260,7 +261,7 @@ func (s *Ethereum) APIs() []rpc.API { }, { Namespace: "eth", Version: "1.0", - Service: filters.NewPublicFilterAPI(s.ApiBackend, false), + Service: filters.NewPublicFilterAPI(s.ApiBackend, false, bloomBitsSection), Public: true, }, { Namespace: "admin", @@ -389,6 +390,7 @@ func (s *Ethereum) Stop() error { if s.stopDbUpgrade != nil { s.stopDbUpgrade() } + s.bbIndexer.Close() s.blockchain.Stop() s.protocolManager.Stop() if s.lesServer != nil { diff --git a/eth/backend_test.go b/eth/backend_test.go deleted file mode 100644 index 1fd25e95aa..0000000000 --- a/eth/backend_test.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package eth - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/params" -) - -func TestMipmapUpgrade(t *testing.T) { - db, _ := ethdb.NewMemDatabase() - addr := common.BytesToAddress([]byte("jeff")) - genesis := new(core.Genesis).MustCommit(db) - - chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) { - switch i { - case 1: - receipt := types.NewReceipt(nil, false, new(big.Int)) - receipt.Logs = []*types.Log{{Address: addr}} - gen.AddUncheckedReceipt(receipt) - case 2: - receipt := types.NewReceipt(nil, false, new(big.Int)) - receipt.Logs = []*types.Log{{Address: addr}} - gen.AddUncheckedReceipt(receipt) - } - }) - for i, block := range chain { - core.WriteBlock(db, block) - if err := core.WriteCanonicalHash(db, block.Hash(), block.NumberU64()); err != nil { - t.Fatalf("failed to insert block number: %v", err) - } - if err := core.WriteHeadBlockHash(db, block.Hash()); err != nil { - t.Fatalf("failed to insert block number: %v", err) - } - if err := core.WriteBlockReceipts(db, block.Hash(), block.NumberU64(), receipts[i]); err != nil { - t.Fatal("error writing block receipts:", err) - } - } - - err := addMipmapBloomBins(db) - if err != nil { - t.Fatal(err) - } - - bloom := core.GetMipmapBloom(db, 1, core.MIPMapLevels[0]) - if (bloom == types.Bloom{}) { - t.Error("got empty bloom filter") - } - - data, _ := db.Get([]byte("setting-mipmap-version")) - if len(data) == 0 { - t.Error("setting-mipmap-version not written to database") - } -} diff --git a/eth/db_upgrade.go b/eth/db_upgrade.go index 90111b2b38..ce8ce699ab 100644 --- a/eth/db_upgrade.go +++ b/eth/db_upgrade.go @@ -19,11 +19,13 @@ package eth import ( "bytes" - "fmt" "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -135,45 +137,37 @@ func upgradeDeduplicateData(db ethdb.Database) func() error { } } -func addMipmapBloomBins(db ethdb.Database) (err error) { - const mipmapVersion uint = 2 +// BloomBitsIndex implements ChainIndex +type BloomBitsIndex struct { + db ethdb.Database + bc *bloombits.BloomBitsCreator + section, sectionSize uint64 + sectionHead common.Hash +} - // check if the version is set. We ignore data for now since there's - // only one version so we can easily ignore it for now - var data []byte - data, _ = db.Get([]byte("setting-mipmap-version")) - if len(data) > 0 { - var version uint - if err := rlp.DecodeBytes(data, &version); err == nil && version == mipmapVersion { - return nil - } - } +// number of confirmation blocks before a section is considered probably final and its bloom bits are calculated +const bloomBitsConfirmations = 256 - defer func() { - if err == nil { - var val []byte - val, err = rlp.EncodeToBytes(mipmapVersion) - if err == nil { - err = db.Put([]byte("setting-mipmap-version"), val) - } - return - } - }() - latestHash := core.GetHeadBlockHash(db) - latestBlock := core.GetBlock(db, latestHash, core.GetBlockNumber(db, latestHash)) - if latestBlock == nil { // clean database - return - } +// NewBloomBitsProcessor returns a chain processor that generates bloom bits data for the canonical chain +func NewBloomBitsProcessor(db ethdb.Database, sectionSize uint64) *core.ChainIndexer { + backend := &BloomBitsIndex{db: db, sectionSize: sectionSize} + return core.NewChainIndexer(db, ethdb.NewTable(db, "bbIndex-"), backend, sectionSize, bloomBitsConfirmations, time.Millisecond*100, "bloombits") +} - tstart := time.Now() - log.Warn("Upgrading db log bloom bins") - for i := uint64(0); i <= latestBlock.NumberU64(); i++ { - hash := core.GetCanonicalHash(db, i) - if (hash == common.Hash{}) { - return fmt.Errorf("chain db corrupted. Could not find block %d.", i) - } - core.WriteMipmapBloom(db, i, core.GetBlockReceipts(db, hash, i)) +func (b *BloomBitsIndex) Reset(section uint64, lastSectionHead common.Hash) { + b.bc = bloombits.NewBloomBitsCreator(b.sectionSize) + b.section = section +} + +func (b *BloomBitsIndex) Process(header *types.Header) { + b.bc.AddHeaderBloom(header.Bloom) + b.sectionHead = header.Hash() +} + +func (b *BloomBitsIndex) Commit() error { + for i := 0; i < bloombits.BloomLength; i++ { + compVector := bitutil.CompressBytes(b.bc.GetBitVector(uint(i))) + core.StoreBloomBits(b.db, uint64(i), b.section, b.sectionHead, compVector) } - log.Info("Bloom-bin upgrade completed", "elapsed", common.PrettyDuration(time.Since(tstart))) return nil } diff --git a/eth/filters/api.go b/eth/filters/api.go index fff58a268e..11767753e3 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -51,24 +51,25 @@ type filter struct { // PublicFilterAPI offers support to create and manage filters. This will allow external clients to retrieve various // information related to the Ethereum protocol such als blocks, transactions and logs. type PublicFilterAPI struct { - backend Backend - useMipMap bool - mux *event.TypeMux - chainDb ethdb.Database - events *EventSystem - filtersMu sync.Mutex - filters map[rpc.ID]*filter + backend Backend + bloomBitsSection uint64 + mux *event.TypeMux + quit chan struct{} + chainDb ethdb.Database + events *EventSystem + filtersMu sync.Mutex + filters map[rpc.ID]*filter } // NewPublicFilterAPI returns a new PublicFilterAPI instance. -func NewPublicFilterAPI(backend Backend, lightMode bool) *PublicFilterAPI { +func NewPublicFilterAPI(backend Backend, lightMode bool, bloomBitsSection uint64) *PublicFilterAPI { api := &PublicFilterAPI{ - backend: backend, - useMipMap: !lightMode, - mux: backend.EventMux(), - chainDb: backend.ChainDb(), - events: NewEventSystem(backend.EventMux(), backend, lightMode), - filters: make(map[rpc.ID]*filter), + backend: backend, + bloomBitsSection: bloomBitsSection, + mux: backend.EventMux(), + chainDb: backend.ChainDb(), + events: NewEventSystem(backend.EventMux(), backend, lightMode), + filters: make(map[rpc.ID]*filter), } go api.timeoutLoop() @@ -332,11 +333,7 @@ func (api *PublicFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([ crit.ToBlock = big.NewInt(rpc.LatestBlockNumber.Int64()) } - filter := New(api.backend, api.useMipMap) - filter.SetBeginBlock(crit.FromBlock.Int64()) - filter.SetEndBlock(crit.ToBlock.Int64()) - filter.SetAddresses(crit.Addresses) - filter.SetTopics(crit.Topics) + filter := New(api.backend, crit.FromBlock.Int64(), crit.ToBlock.Int64(), crit.Addresses, crit.Topics) logs, err := filter.Find(ctx) return returnLogs(logs), err @@ -372,19 +369,18 @@ func (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*ty return nil, fmt.Errorf("filter not found") } - filter := New(api.backend, api.useMipMap) + var begin, end int64 if f.crit.FromBlock != nil { - filter.SetBeginBlock(f.crit.FromBlock.Int64()) + begin = f.crit.FromBlock.Int64() } else { - filter.SetBeginBlock(rpc.LatestBlockNumber.Int64()) + begin = rpc.LatestBlockNumber.Int64() } if f.crit.ToBlock != nil { - filter.SetEndBlock(f.crit.ToBlock.Int64()) + end = f.crit.ToBlock.Int64() } else { - filter.SetEndBlock(rpc.LatestBlockNumber.Int64()) + end = rpc.LatestBlockNumber.Int64() } - filter.SetAddresses(f.crit.Addresses) - filter.SetTopics(f.crit.Topics) + filter := New(api.backend, begin, end, f.crit.Addresses, f.crit.Topics) logs, err := filter.Find(ctx) if err != nil { diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go new file mode 100644 index 0000000000..2487bc0eb3 --- /dev/null +++ b/eth/filters/bench_test.go @@ -0,0 +1,237 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package filters + +import ( + "bytes" + "context" + "fmt" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/node" + "github.com/golang/snappy" +) + +func BenchmarkBloomBits512(b *testing.B) { + benchmarkBloomBitsForSize(b, 512) +} + +func BenchmarkBloomBits1k(b *testing.B) { + benchmarkBloomBitsForSize(b, 1024) +} + +func BenchmarkBloomBits2k(b *testing.B) { + benchmarkBloomBitsForSize(b, 2048) +} + +func BenchmarkBloomBits4k(b *testing.B) { + benchmarkBloomBitsForSize(b, 4096) +} + +func BenchmarkBloomBits8k(b *testing.B) { + benchmarkBloomBitsForSize(b, 8192) +} + +func BenchmarkBloomBits16k(b *testing.B) { + benchmarkBloomBitsForSize(b, 16384) +} + +func BenchmarkBloomBits32k(b *testing.B) { + benchmarkBloomBitsForSize(b, 32768) +} + +func benchmarkBloomBitsForSize(b *testing.B, sectionSize uint64) { + benchmarkBloomBits(b, sectionSize, 0) + benchmarkBloomBits(b, sectionSize, 1) + benchmarkBloomBits(b, sectionSize, 2) +} + +const benchFilterCnt = 2000 + +func benchmarkBloomBits(b *testing.B, sectionSize uint64, comp int) { + benchDataDir := node.DefaultDataDir() + "/geth/chaindata" + fmt.Println("Running bloombits benchmark section size:", sectionSize, " compression method:", comp) + + var ( + compressFn func([]byte) []byte + decompressFn func([]byte, int) ([]byte, error) + ) + switch comp { + case 0: + // no compression + compressFn = func(data []byte) []byte { + return data + } + decompressFn = func(data []byte, target int) ([]byte, error) { + if len(data) != target { + panic(nil) + } + return data, nil + } + case 1: + // bitutil/compress.go + compressFn = bitutil.CompressBytes + decompressFn = bitutil.DecompressBytes + case 2: + // go snappy + compressFn = func(data []byte) []byte { + return snappy.Encode(nil, data) + } + decompressFn = func(data []byte, target int) ([]byte, error) { + decomp, err := snappy.Decode(nil, data) + if err != nil || len(decomp) != target { + panic(err) + } + return decomp, nil + } + } + + db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + if err != nil { + b.Fatalf("error opening database at %v: %v", benchDataDir, err) + } + head := core.GetHeadBlockHash(db) + if head == (common.Hash{}) { + b.Fatalf("chain data not found at %v", benchDataDir) + } + + clearBloomBits(db) + fmt.Println("Generating bloombits data...") + headNum := core.GetBlockNumber(db, head) + if headNum < sectionSize+512 { + b.Fatalf("not enough blocks for running a benchmark") + } + + start := time.Now() + cnt := (headNum - 512) / sectionSize + var dataSize, compSize uint64 + for sectionIdx := uint64(0); sectionIdx < cnt; sectionIdx++ { + bc := bloombits.NewBloomBitsCreator(sectionSize) + var header *types.Header + for i := sectionIdx * sectionSize; i < (sectionIdx+1)*sectionSize; i++ { + hash := core.GetCanonicalHash(db, i) + header = core.GetHeader(db, hash, i) + if header == nil { + b.Fatalf("Error creating bloomBits data") + } + bc.AddHeaderBloom(header.Bloom) + } + sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*sectionSize-1) + for i := 0; i < bloombits.BloomLength; i++ { + data := bc.GetBitVector(uint(i)) + comp := compressFn(data) + dataSize += uint64(len(data)) + compSize += uint64(len(comp)) + core.StoreBloomBits(db, uint64(i), sectionIdx, sectionHead, comp) + } + //if sectionIdx%50 == 0 { + // fmt.Println(" section", sectionIdx, "/", cnt) + //} + } + + d := time.Since(start) + fmt.Println("Finished generating bloombits data") + fmt.Println(" ", d, "total ", d/time.Duration(cnt*sectionSize), "per block") + fmt.Println(" data size:", dataSize, " compressed size:", compSize, " compression ratio:", float64(compSize)/float64(dataSize)) + + fmt.Println("Running filter benchmarks...") + start = time.Now() + mux := new(event.TypeMux) + var backend *testBackend + + for i := 0; i < benchFilterCnt; i++ { + if i%20 == 0 { + db.Close() + db, _ = ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + backend = &testBackend{mux, db, cnt, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} + } + var addr common.Address + addr[0] = byte(i) + addr[1] = byte(i / 256) + filter := New(backend, 0, int64(cnt*sectionSize-1), []common.Address{addr}, nil) + filter.decompress = decompressFn + if _, err := filter.Find(context.Background()); err != nil { + b.Error("filter.Find error:", err) + } + } + d = time.Since(start) + fmt.Println("Finished running filter benchmarks") + fmt.Println(" ", d, "total ", d/time.Duration(benchFilterCnt), "per address", d*time.Duration(1000000)/time.Duration(benchFilterCnt*cnt*sectionSize), "per million blocks") + db.Close() +} + +func forEachKey(db ethdb.Database, startPrefix, endPrefix []byte, fn func(key []byte)) { + it := db.(*ethdb.LDBDatabase).NewIterator() + it.Seek(startPrefix) + for it.Valid() { + key := it.Key() + cmpLen := len(key) + if len(endPrefix) < cmpLen { + cmpLen = len(endPrefix) + } + if bytes.Compare(key[:cmpLen], endPrefix) == 1 { + break + } + fn(common.CopyBytes(key)) + it.Next() + } + it.Release() +} + +var bloomBitsPrefix = []byte("bloomBits-") + +func clearBloomBits(db ethdb.Database) { + fmt.Println("Clearing bloombits data...") + forEachKey(db, bloomBitsPrefix, bloomBitsPrefix, func(key []byte) { + db.Delete(key) + }) +} + +func BenchmarkNoBloomBits(b *testing.B) { + benchDataDir := node.DefaultDataDir() + "/geth/chaindata" + fmt.Println("Running benchmark without bloombits") + db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + if err != nil { + b.Fatalf("error opening database at %v: %v", benchDataDir, err) + } + head := core.GetHeadBlockHash(db) + if head == (common.Hash{}) { + b.Fatalf("chain data not found at %v", benchDataDir) + } + headNum := core.GetBlockNumber(db, head) + + clearBloomBits(db) + + fmt.Println("Running filter benchmarks...") + start := time.Now() + mux := new(event.TypeMux) + backend := &testBackend{mux, db, 0, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} + filter := New(backend, 0, int64(headNum), []common.Address{common.Address{}}, nil) + filter.Find(context.Background()) + d := time.Since(start) + fmt.Println("Finished running filter benchmarks") + fmt.Println(" ", d, "total ", d*time.Duration(1000000)/time.Duration(headNum+1), "per million blocks") + db.Close() +} diff --git a/eth/filters/filter.go b/eth/filters/filter.go index f848bc6af9..ea9ccf2f92 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -18,11 +18,14 @@ package filters import ( "context" - "math" "math/big" + "sync" + "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -34,58 +37,51 @@ type Backend interface { EventMux() *event.TypeMux HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) + BloomBitsSections() uint64 + BloomBitsConfig() BloomConfig SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription + GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) +} + +type BloomConfig struct { + SectionSize uint64 + MaxRequestLen int + MaxRequestWait time.Duration } // Filter can be used to retrieve and filter logs. type Filter struct { - backend Backend - useMipMap bool + backend Backend + bloomBitsConfig BloomConfig db ethdb.Database begin, end int64 addresses []common.Address topics [][]common.Hash + + decompress func([]byte, int) ([]byte, error) + matcher *bloombits.Matcher } // New creates a new filter which uses a bloom filter on blocks to figure out whether // a particular block is interesting or not. -// MipMaps allow past blocks to be searched much more efficiently, but are not available -// to light clients. -func New(backend Backend, useMipMap bool) *Filter { +func New(backend Backend, begin, end int64, addresses []common.Address, topics [][]common.Hash) *Filter { return &Filter{ - backend: backend, - useMipMap: useMipMap, - db: backend.ChainDb(), + backend: backend, + begin: begin, + end: end, + addresses: addresses, + topics: topics, + bloomBitsConfig: backend.BloomBitsConfig(), + db: backend.ChainDb(), + matcher: bloombits.NewMatcher(backend.BloomBitsConfig().SectionSize, addresses, topics), + decompress: bitutil.DecompressBytes, } } -// SetBeginBlock sets the earliest block for filtering. -// -1 = latest block (i.e., the current block) -// hash = particular hash from-to -func (f *Filter) SetBeginBlock(begin int64) { - f.begin = begin -} - -// SetEndBlock sets the latest block for filtering. -func (f *Filter) SetEndBlock(end int64) { - f.end = end -} - -// SetAddresses matches only logs that are generated from addresses that are included -// in the given addresses. -func (f *Filter) SetAddresses(addr []common.Address) { - f.addresses = addr -} - -// SetTopics matches only logs that have topics matching the given topics. -func (f *Filter) SetTopics(topics [][]common.Hash) { - f.topics = topics -} - // FindOnce searches the blockchain for matching log entries, returning // all matching entries from the first block that contains matches, // updating the start point of the filter accordingly. If no results are @@ -106,18 +102,9 @@ func (f *Filter) FindOnce(ctx context.Context) ([]*types.Log, error) { endBlockNo = headBlockNumber } - // if no addresses are present we can't make use of fast search which - // uses the mipmap bloom filters to check for fast inclusion and uses - // higher range probability in order to ensure at least a false positive - if !f.useMipMap || len(f.addresses) == 0 { - logs, blockNumber, err := f.getLogs(ctx, beginBlockNo, endBlockNo) - f.begin = int64(blockNumber + 1) - return logs, err - } - - logs, blockNumber := f.mipFind(beginBlockNo, endBlockNo, 0) + logs, blockNumber, err := f.getLogs(ctx, beginBlockNo, endBlockNo) f.begin = int64(blockNumber + 1) - return logs, nil + return logs, err } // Run filters logs with the current parameters set @@ -131,43 +118,134 @@ func (f *Filter) Find(ctx context.Context) (logs []*types.Log, err error) { } } -func (f *Filter) mipFind(start, end uint64, depth int) (logs []*types.Log, blockNumber uint64) { - level := core.MIPMapLevels[depth] - // normalise numerator so we can work in level specific batches and - // work with the proper range checks - for num := start / level * level; num <= end; num += level { - // find addresses in bloom filters - bloom := core.GetMipmapBloom(f.db, num, level) - // Don't bother checking the first time through the loop - we're probably picking - // up where a previous run left off. - first := true - for _, addr := range f.addresses { - if first || bloom.TestBytes(addr[:]) { - first = false - // range check normalised values and make sure that - // we're resolving the correct range instead of the - // normalised values. - start := uint64(math.Max(float64(num), float64(start))) - end := uint64(math.Min(float64(num+level-1), float64(end))) - if depth+1 == len(core.MIPMapLevels) { - l, blockNumber, _ := f.getLogs(context.Background(), start, end) - if len(l) > 0 { - return l, blockNumber +// nextRequest returns the next request to retrieve for the bloombits matcher +func (f *Filter) nextRequest() (bloombits uint, sections []uint64) { + bloomIndex, ok := f.matcher.AllocSectionQueue() + if !ok { + return 0, nil + } + if f.bloomBitsConfig.MaxRequestWait > 0 && + (f.bloomBitsConfig.MaxRequestLen <= 1 || // SectionCount is always greater than zero after a successful alloc + f.matcher.SectionCount(bloomIndex) < f.bloomBitsConfig.MaxRequestLen) { + time.Sleep(f.bloomBitsConfig.MaxRequestWait) + } + return bloomIndex, f.matcher.FetchSections(bloomIndex, f.bloomBitsConfig.MaxRequestLen) +} + +// serveMatcher serves the bloombits matcher by fetching the requested vectors +// through the filter backend +func (f *Filter) serveMatcher(ctx context.Context, stop chan struct{}, wg *sync.WaitGroup) chan error { + errChn := make(chan error, 1) + wg.Add(10) + for i := 0; i < 10; i++ { + go func(i int) { + defer wg.Done() + + for { + b, s := f.nextRequest() + if s == nil { + return + } + data, err := f.backend.GetBloomBits(ctx, uint64(b), s) + if err != nil { + select { + case errChn <- err: + case <-stop: } - } else { - l, blockNumber := f.mipFind(start, end, depth+1) - if len(l) > 0 { - return l, blockNumber + return + } + decomp := make([][]byte, len(data)) + for i, d := range data { + var err error + if decomp[i], err = f.decompress(d, int(f.bloomBitsConfig.SectionSize/8)); err != nil { + select { + case errChn <- err: + case <-stop: + } + return } } + f.matcher.Deliver(b, s, decomp) } - } + }(i) } - return nil, end + return errChn +} + +// checkMatches checks if the receipts belonging to the given header contain any log events that +// match the filter criteria. This function is called when the bloom filter signals a potential match. +func (f *Filter) checkMatches(ctx context.Context, header *types.Header) (logs []*types.Log, err error) { + // Get the logs of the block + receipts, err := f.backend.GetReceipts(ctx, header.Hash()) + if err != nil { + return nil, err + } + var unfiltered []*types.Log + for _, receipt := range receipts { + unfiltered = append(unfiltered, ([]*types.Log)(receipt.Logs)...) + } + logs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics) + if len(logs) > 0 { + return logs, nil + } + return nil, nil } func (f *Filter) getLogs(ctx context.Context, start, end uint64) (logs []*types.Log, blockNumber uint64, err error) { + haveBloomBitsBefore := f.backend.BloomBitsSections() * f.bloomBitsConfig.SectionSize + if haveBloomBitsBefore > start { + e := end + if haveBloomBitsBefore <= e { + e = haveBloomBitsBefore - 1 + } + + stop := make(chan struct{}) + var wg sync.WaitGroup + matches := f.matcher.Start(start, e) + errChn := f.serveMatcher(ctx, stop, &wg) + + defer func() { + f.matcher.Stop() + close(stop) + wg.Wait() + }() + + loop: + for { + select { + case i, ok := <-matches: + if !ok { + break loop + } + + blockNumber := rpc.BlockNumber(i) + header, err := f.backend.HeaderByNumber(ctx, blockNumber) + if header == nil || err != nil { + return logs, end, err + } + + logs, err := f.checkMatches(ctx, header) + if err != nil { + return nil, end, err + } + if logs != nil { + return logs, i, nil + } + case err := <-errChn: + return logs, end, err + case <-ctx.Done(): + return nil, end, ctx.Err() + } + } + + if end < haveBloomBitsBefore { + return logs, end, nil + } + start = haveBloomBitsBefore + } + + // search the rest with regular block-by-block bloom filtering for i := start; i <= end; i++ { blockNumber := rpc.BlockNumber(i) header, err := f.backend.HeaderByNumber(ctx, blockNumber) @@ -178,18 +256,12 @@ func (f *Filter) getLogs(ctx context.Context, start, end uint64) (logs []*types. // Use bloom filtering to see if this block is interesting given the // current parameters if f.bloomFilter(header.Bloom) { - // Get the logs of the block - receipts, err := f.backend.GetReceipts(ctx, header.Hash()) + logs, err := f.checkMatches(ctx, header) if err != nil { return nil, end, err } - var unfiltered []*types.Log - for _, receipt := range receipts { - unfiltered = append(unfiltered, ([]*types.Log)(receipt.Logs)...) - } - logs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics) - if len(logs) > 0 { - return logs, uint64(blockNumber), nil + if logs != nil { + return logs, i, nil } } } diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index fcc888b8cf..140fad555c 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -36,6 +36,7 @@ import ( type testBackend struct { mux *event.TypeMux db ethdb.Database + sections uint64 txFeed *event.Feed rmLogsFeed *event.Feed logsFeed *event.Feed @@ -84,6 +85,31 @@ func (b *testBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subsc return b.chainFeed.Subscribe(ch) } +func (b *testBackend) GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) { + results := make([][]byte, len(sectionIdxList)) + var err error + for i, sectionIdx := range sectionIdxList { + sectionHead := core.GetCanonicalHash(b.db, (sectionIdx+1)*testBloomBitsSection-1) + results[i], err = core.GetBloomBits(b.db, bitIdx, sectionIdx, sectionHead) + if err != nil { + return nil, err + } + } + return results, nil +} + +func (b *testBackend) BloomBitsSections() uint64 { + return b.sections +} + +func (b *testBackend) BloomBitsConfig() BloomConfig { + return BloomConfig{ + SectionSize: testBloomBitsSection, + MaxRequestLen: 16, + MaxRequestWait: 0, + } +} + // TestBlockSubscription tests if a block subscription returns block hashes for posted chain events. // It creates multiple subscriptions: // - one at the start and should receive all posted chain events and a second (blockHashes) @@ -99,8 +125,8 @@ func TestBlockSubscription(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false) + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false, 0) genesis = new(core.Genesis).MustCommit(db) chain, _ = core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) {}) chainEvents = []core.ChainEvent{} @@ -156,8 +182,8 @@ func TestPendingTxFilter(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false) + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false, 0) transactions = []*types.Transaction{ types.NewTransaction(0, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil), @@ -219,8 +245,8 @@ func TestLogFilterCreation(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false) + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false, 0) testCases = []struct { crit FilterCriteria @@ -268,8 +294,8 @@ func TestInvalidLogFilterCreation(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false) + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false, 0) ) // different situations where log filter creation should fail. @@ -298,8 +324,8 @@ func TestLogFilter(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false) + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false, 0) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") @@ -415,8 +441,8 @@ func TestPendingLogsSubscription(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false) + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false, 0) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index cf508a218d..f1c6481d7e 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -32,6 +32,8 @@ import ( "github.com/ethereum/go-ethereum/params" ) +const testBloomBitsSection = 4096 + func makeReceipt(addr common.Address) *types.Receipt { receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ @@ -41,8 +43,8 @@ func makeReceipt(addr common.Address) *types.Receipt { return receipt } -func BenchmarkMipmaps(b *testing.B) { - dir, err := ioutil.TempDir("", "mipmap") +func BenchmarkFilters(b *testing.B) { + dir, err := ioutil.TempDir("", "filtertest") if err != nil { b.Fatal(err) } @@ -55,7 +57,7 @@ func BenchmarkMipmaps(b *testing.B) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr1 = crypto.PubkeyToAddress(key1.PublicKey) addr2 = common.BytesToAddress([]byte("jeff")) @@ -66,27 +68,21 @@ func BenchmarkMipmaps(b *testing.B) { genesis := core.GenesisBlockForTesting(db, addr1, big.NewInt(1000000)) chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 100010, func(i int, gen *core.BlockGen) { - var receipts types.Receipts switch i { case 2403: receipt := makeReceipt(addr1) - receipts = types.Receipts{receipt} gen.AddUncheckedReceipt(receipt) case 1034: receipt := makeReceipt(addr2) - receipts = types.Receipts{receipt} gen.AddUncheckedReceipt(receipt) case 34: receipt := makeReceipt(addr3) - receipts = types.Receipts{receipt} gen.AddUncheckedReceipt(receipt) case 99999: receipt := makeReceipt(addr4) - receipts = types.Receipts{receipt} gen.AddUncheckedReceipt(receipt) } - core.WriteMipmapBloom(db, uint64(i+1), receipts) }) for i, block := range chain { core.WriteBlock(db, block) @@ -102,10 +98,7 @@ func BenchmarkMipmaps(b *testing.B) { } b.ResetTimer() - filter := New(backend, true) - filter.SetAddresses([]common.Address{addr1, addr2, addr3, addr4}) - filter.SetBeginBlock(0) - filter.SetEndBlock(-1) + filter := New(backend, 0, -1, []common.Address{addr1, addr2, addr3, addr4}, nil) for i := 0; i < b.N; i++ { logs, _ := filter.Find(context.Background()) @@ -116,7 +109,7 @@ func BenchmarkMipmaps(b *testing.B) { } func TestFilters(t *testing.T) { - dir, err := ioutil.TempDir("", "mipmap") + dir, err := ioutil.TempDir("", "filtertest") if err != nil { t.Fatal(err) } @@ -129,7 +122,7 @@ func TestFilters(t *testing.T) { rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) chainFeed = new(event.Feed) - backend = &testBackend{mux, db, txFeed, rmLogsFeed, logsFeed, chainFeed} + backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr = crypto.PubkeyToAddress(key1.PublicKey) @@ -142,7 +135,6 @@ func TestFilters(t *testing.T) { genesis := core.GenesisBlockForTesting(db, addr, big.NewInt(1000000)) chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 1000, func(i int, gen *core.BlockGen) { - var receipts types.Receipts switch i { case 1: receipt := types.NewReceipt(nil, false, new(big.Int)) @@ -153,7 +145,6 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} case 2: receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ @@ -163,7 +154,6 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} case 998: receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ @@ -173,7 +163,6 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} case 999: receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ @@ -183,12 +172,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) - receipts = types.Receipts{receipt} } - // i is used as block number for the writes but since the i - // starts at 0 and block 0 (genesis) is already present increment - // by one - core.WriteMipmapBloom(db, uint64(i+1), receipts) }) for i, block := range chain { core.WriteBlock(db, block) @@ -203,22 +187,14 @@ func TestFilters(t *testing.T) { } } - filter := New(backend, true) - filter.SetAddresses([]common.Address{addr}) - filter.SetTopics([][]common.Hash{{hash1, hash2, hash3, hash4}}) - filter.SetBeginBlock(0) - filter.SetEndBlock(-1) + filter := New(backend, 0, -1, []common.Address{addr}, [][]common.Hash{{hash1, hash2, hash3, hash4}}) logs, _ := filter.Find(context.Background()) if len(logs) != 4 { t.Error("expected 4 log, got", len(logs)) } - filter = New(backend, true) - filter.SetAddresses([]common.Address{addr}) - filter.SetTopics([][]common.Hash{{hash3}}) - filter.SetBeginBlock(900) - filter.SetEndBlock(999) + filter = New(backend, 900, 999, []common.Address{addr}, [][]common.Hash{{hash3}}) logs, _ = filter.Find(context.Background()) if len(logs) != 1 { t.Error("expected 1 log, got", len(logs)) @@ -227,11 +203,7 @@ func TestFilters(t *testing.T) { t.Errorf("expected log[0].Topics[0] to be %x, got %x", hash3, logs[0].Topics[0]) } - filter = New(backend, true) - filter.SetAddresses([]common.Address{addr}) - filter.SetTopics([][]common.Hash{{hash3}}) - filter.SetBeginBlock(990) - filter.SetEndBlock(-1) + filter = New(backend, 990, -1, []common.Address{addr}, [][]common.Hash{{hash3}}) logs, _ = filter.Find(context.Background()) if len(logs) != 1 { t.Error("expected 1 log, got", len(logs)) @@ -240,10 +212,7 @@ func TestFilters(t *testing.T) { t.Errorf("expected log[0].Topics[0] to be %x, got %x", hash3, logs[0].Topics[0]) } - filter = New(backend, true) - filter.SetTopics([][]common.Hash{{hash1, hash2}}) - filter.SetBeginBlock(1) - filter.SetEndBlock(10) + filter = New(backend, 1, 10, nil, [][]common.Hash{{hash1, hash2}}) logs, _ = filter.Find(context.Background()) if len(logs) != 2 { @@ -251,10 +220,7 @@ func TestFilters(t *testing.T) { } failHash := common.BytesToHash([]byte("fail")) - filter = New(backend, true) - filter.SetTopics([][]common.Hash{{failHash}}) - filter.SetBeginBlock(0) - filter.SetEndBlock(-1) + filter = New(backend, 0, -1, nil, [][]common.Hash{{failHash}}) logs, _ = filter.Find(context.Background()) if len(logs) != 0 { @@ -262,20 +228,14 @@ func TestFilters(t *testing.T) { } failAddr := common.BytesToAddress([]byte("failmenow")) - filter = New(backend, true) - filter.SetAddresses([]common.Address{failAddr}) - filter.SetBeginBlock(0) - filter.SetEndBlock(-1) + filter = New(backend, 0, -1, []common.Address{failAddr}, nil) logs, _ = filter.Find(context.Background()) if len(logs) != 0 { t.Error("expected 0 log, got", len(logs)) } - filter = New(backend, true) - filter.SetTopics([][]common.Hash{{failHash}, {hash1}}) - filter.SetBeginBlock(0) - filter.SetEndBlock(-1) + filter = New(backend, 0, -1, nil, [][]common.Hash{{failHash}, {hash1}}) logs, _ = filter.Find(context.Background()) if len(logs) != 0 { diff --git a/eth/handler.go b/eth/handler.go index 28ae208c06..aadd771df5 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -49,6 +49,8 @@ const ( // txChanSize is the size of channel listening to TxPreEvent. // The number is referenced from the size of tx pool. txChanSize = 4096 + + bloomBitsSection = 4096 ) var ( @@ -92,6 +94,8 @@ type ProtocolManager struct { quitSync chan struct{} noMorePeers chan struct{} + lesServer LesServer + // wait group is used for graceful shutdowns during downloading // and processing wg sync.WaitGroup @@ -114,6 +118,7 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne txsyncCh: make(chan *txsync), quitSync: make(chan struct{}), } + // Figure out whether to allow fast sync or not if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 { log.Warn("Blockchain not empty, fast sync disabled") diff --git a/les/api_backend.go b/les/api_backend.go index 1323e88644..c2ba270283 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -19,6 +19,7 @@ package les import ( "context" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" @@ -28,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -171,3 +173,19 @@ func (b *LesApiBackend) EventMux() *event.TypeMux { func (b *LesApiBackend) AccountManager() *accounts.Manager { return b.eth.accountManager } + +func (b *LesApiBackend) GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) { + return nil, nil // implemented in a subsequent PR +} + +func (b *LesApiBackend) BloomBitsSections() uint64 { + return 0 +} + +func (b *LesApiBackend) BloomBitsConfig() filters.BloomConfig { + return filters.BloomConfig{ + SectionSize: 32768, + MaxRequestLen: 16, + MaxRequestWait: time.Microsecond * 100, + } +} diff --git a/les/backend.go b/les/backend.go index 4c33417c03..a3670b5ac7 100644 --- a/les/backend.go +++ b/les/backend.go @@ -169,7 +169,7 @@ func (s *LightEthereum) APIs() []rpc.API { }, { Namespace: "eth", Version: "1.0", - Service: filters.NewPublicFilterAPI(s.ApiBackend, true), + Service: filters.NewPublicFilterAPI(s.ApiBackend, true, 0), Public: true, }, { Namespace: "net", diff --git a/miner/worker.go b/miner/worker.go index 5bac5d6e85..e1154ac068 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -324,8 +324,6 @@ func (self *worker) wait() { if stat == core.CanonStatTy { // This puts transactions in a extra db for rpc core.WriteTxLookupEntries(self.chainDb, block) - // Write map map bloom filters - core.WriteMipmapBloom(self.chainDb, block.NumberU64(), work.receipts) // implicit by posting ChainHeadEvent mustCommitNewWork = false } From f585f9eee8cb18423c23fe8b517b5b4cbe3b3755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 29 Aug 2017 14:13:11 +0300 Subject: [PATCH 136/272] core, eth: clean up bloom filtering, add some tests --- core/bloombits/doc.go | 18 + core/bloombits/fetcher_test.go | 101 ---- core/bloombits/generator.go | 84 +++ core/bloombits/generator_test.go | 60 ++ core/bloombits/matcher.go | 936 ++++++++++++++++-------------- core/bloombits/matcher_test.go | 347 ++++++----- core/bloombits/scheduler.go | 181 ++++++ core/bloombits/scheduler_test.go | 105 ++++ core/bloombits/utils.go | 63 -- core/chain_indexer.go | 61 +- core/chain_indexer_test.go | 3 +- core/database_util.go | 158 ++--- core/types/bloom9.go | 28 +- eth/api_backend.go | 29 +- eth/backend.go | 21 +- eth/bloombits.go | 142 +++++ eth/db_upgrade.go | 38 -- eth/filters/api.go | 49 +- eth/filters/bench_test.go | 82 +-- eth/filters/filter.go | 276 ++++----- eth/filters/filter_system_test.go | 64 +- eth/filters/filter_test.go | 18 +- eth/handler.go | 5 - les/api_backend.go | 18 +- les/backend.go | 2 +- params/network_params.go | 26 + 26 files changed, 1650 insertions(+), 1265 deletions(-) create mode 100644 core/bloombits/doc.go delete mode 100644 core/bloombits/fetcher_test.go create mode 100644 core/bloombits/generator.go create mode 100644 core/bloombits/generator_test.go create mode 100644 core/bloombits/scheduler.go create mode 100644 core/bloombits/scheduler_test.go delete mode 100644 core/bloombits/utils.go create mode 100644 eth/bloombits.go create mode 100644 params/network_params.go diff --git a/core/bloombits/doc.go b/core/bloombits/doc.go new file mode 100644 index 0000000000..3d159e74f7 --- /dev/null +++ b/core/bloombits/doc.go @@ -0,0 +1,18 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package bloombits implements bloom filtering on batches of data. +package bloombits diff --git a/core/bloombits/fetcher_test.go b/core/bloombits/fetcher_test.go deleted file mode 100644 index 9c229cf8da..0000000000 --- a/core/bloombits/fetcher_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package bloombits - -import ( - "bytes" - "encoding/binary" - "math/rand" - "sync" - "sync/atomic" - "testing" - "time" -) - -const testFetcherReqCount = 5000 - -func fetcherTestVector(b uint, s uint64) []byte { - r := make([]byte, 10) - binary.BigEndian.PutUint16(r[0:2], uint16(b)) - binary.BigEndian.PutUint64(r[2:10], s) - return r -} - -func TestFetcher(t *testing.T) { - testFetcher(t, 1) -} - -func TestFetcherMultipleReaders(t *testing.T) { - testFetcher(t, 10) -} - -func testFetcher(t *testing.T, cnt int) { - f := &fetcher{ - requestMap: make(map[uint64]fetchRequest), - } - distCh := make(chan distRequest, channelCap) - stop := make(chan struct{}) - var reqCount uint32 - - for i := 0; i < 10; i++ { - go func() { - for { - req, ok := <-distCh - if !ok { - return - } - time.Sleep(time.Duration(rand.Intn(100000))) - atomic.AddUint32(&reqCount, 1) - f.deliver([]uint64{req.sectionIndex}, [][]byte{fetcherTestVector(req.bloomIndex, req.sectionIndex)}) - } - }() - } - - var wg, wg2 sync.WaitGroup - for cc := 0; cc < cnt; cc++ { - wg.Add(1) - in := make(chan uint64, channelCap) - out := f.fetch(in, distCh, stop, &wg2) - - time.Sleep(time.Millisecond * 10 * time.Duration(cc)) - go func() { - for i := uint64(0); i < testFetcherReqCount; i++ { - in <- i - } - }() - - go func() { - for i := uint64(0); i < testFetcherReqCount; i++ { - bv := <-out - if !bytes.Equal(bv, fetcherTestVector(0, i)) { - if len(bv) != 10 { - t.Errorf("Vector #%d length is %d, expected 10", i, len(bv)) - } else { - j := binary.BigEndian.Uint64(bv[2:10]) - t.Errorf("Expected vector #%d, fetched #%d", i, j) - } - } - } - wg.Done() - }() - } - - wg.Wait() - close(stop) - if reqCount != testFetcherReqCount { - t.Errorf("Request count mismatch: expected %v, got %v", testFetcherReqCount, reqCount) - } -} diff --git a/core/bloombits/generator.go b/core/bloombits/generator.go new file mode 100644 index 0000000000..04a7f5146c --- /dev/null +++ b/core/bloombits/generator.go @@ -0,0 +1,84 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bloombits + +import ( + "errors" + + "github.com/ethereum/go-ethereum/core/types" +) + +// errSectionOutOfBounds is returned if the user tried to add more bloom filters +// to the batch than available space, or if tries to retrieve above the capacity, +var errSectionOutOfBounds = errors.New("section out of bounds") + +// Generator takes a number of bloom filters and generates the rotated bloom bits +// to be used for batched filtering. +type Generator struct { + blooms [types.BloomBitLength][]byte // Rotated blooms for per-bit matching + sections uint // Number of sections to batch together + nextBit uint // Next bit to set when adding a bloom +} + +// NewGenerator creates a rotated bloom generator that can iteratively fill a +// batched bloom filter's bits. +func NewGenerator(sections uint) (*Generator, error) { + if sections%8 != 0 { + return nil, errors.New("section count not multiple of 8") + } + b := &Generator{sections: sections} + for i := 0; i < types.BloomBitLength; i++ { + b.blooms[i] = make([]byte, sections/8) + } + return b, nil +} + +// AddBloom takes a single bloom filter and sets the corresponding bit column +// in memory accordingly. +func (b *Generator) AddBloom(bloom types.Bloom) error { + // Make sure we're not adding more bloom filters than our capacity + if b.nextBit >= b.sections { + return errSectionOutOfBounds + } + // Rotate the bloom and insert into our collection + byteMask := b.nextBit / 8 + bitMask := byte(1) << byte(7-b.nextBit%8) + + for i := 0; i < types.BloomBitLength; i++ { + bloomByteMask := types.BloomByteLength - 1 - i/8 + bloomBitMask := byte(1) << byte(i%8) + + if (bloom[bloomByteMask] & bloomBitMask) != 0 { + b.blooms[i][byteMask] |= bitMask + } + } + b.nextBit++ + + return nil +} + +// Bitset returns the bit vector belonging to the given bit index after all +// blooms have been added. +func (b *Generator) Bitset(idx uint) ([]byte, error) { + if b.nextBit != b.sections { + return nil, errors.New("bloom not fully generated yet") + } + if idx >= b.sections { + return nil, errSectionOutOfBounds + } + return b.blooms[idx], nil +} diff --git a/core/bloombits/generator_test.go b/core/bloombits/generator_test.go new file mode 100644 index 0000000000..f4aa9551c2 --- /dev/null +++ b/core/bloombits/generator_test.go @@ -0,0 +1,60 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bloombits + +import ( + "bytes" + "math/rand" + "testing" + + "github.com/ethereum/go-ethereum/core/types" +) + +// Tests that batched bloom bits are correctly rotated from the input bloom +// filters. +func TestGenerator(t *testing.T) { + // Generate the input and the rotated output + var input, output [types.BloomBitLength][types.BloomByteLength]byte + + for i := 0; i < types.BloomBitLength; i++ { + for j := 0; j < types.BloomBitLength; j++ { + bit := byte(rand.Int() % 2) + + input[i][j/8] |= bit << byte(7-j%8) + output[types.BloomBitLength-1-j][i/8] |= bit << byte(7-i%8) + } + } + // Crunch the input through the generator and verify the result + gen, err := NewGenerator(types.BloomBitLength) + if err != nil { + t.Fatalf("failed to create bloombit generator: %v", err) + } + for i, bloom := range input { + if err := gen.AddBloom(bloom); err != nil { + t.Fatalf("bloom %d: failed to add: %v", i, err) + } + } + for i, want := range output { + have, err := gen.Bitset(uint(i)) + if err != nil { + t.Fatalf("output %d: failed to retrieve bits: %v", i, err) + } + if !bytes.Equal(have, want[:]) { + t.Errorf("output %d: bit vector mismatch have %x, want %x", i, have, want) + } + } +} diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index 5a7df6b1c9..e365fd6d04 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -13,327 +13,350 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . + package bloombits import ( + "errors" + "math" + "sort" "sync" + "sync/atomic" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/bitutil" - "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) -const channelCap = 100 +// bloomIndexes represents the bit indexes inside the bloom filter that belong +// to some key. +type bloomIndexes [3]uint -// fetcher handles bit vector retrieval pipelines for a single bit index -type fetcher struct { - bloomIndex uint - requestMap map[uint64]fetchRequest - requestLock sync.RWMutex -} +// calcBloomIndexes returns the bloom filter bit indexes belonging to the given key. +func calcBloomIndexes(b []byte) bloomIndexes { + b = crypto.Keccak256(b) -// fetchRequest represents the state of a bit vector requested from a fetcher. When a distRequest has been sent to the distributor but -// the data has not been delivered yet, queued is true. When delivered, it is stored in the data field and the delivered channel is closed. -type fetchRequest struct { - data []byte - queued bool - delivered chan struct{} -} - -// distRequest is sent by the fetcher to the distributor which groups and prioritizes these requests. -type distRequest struct { - bloomIndex uint - sectionIndex uint64 -} - -// fetch creates a retrieval pipeline, receiving section indexes from sectionCh and returning the results -// in the same order through the returned channel. Multiple fetch instances of the same fetcher are allowed -// to run in parallel, in case the same bit index appears multiple times in the filter structure. Each section -// is requested only once, requests are sent to the request distributor (part of Matcher) through distCh. -func (f *fetcher) fetch(sectionCh chan uint64, distCh chan distRequest, stop chan struct{}, wg *sync.WaitGroup) chan []byte { - dataCh := make(chan []byte, channelCap) - returnCh := make(chan uint64, channelCap) - wg.Add(2) - - go func() { - defer wg.Done() - defer close(returnCh) - - for { - select { - case <-stop: - return - case idx, ok := <-sectionCh: - if !ok { - return - } - - req := false - f.requestLock.Lock() - r := f.requestMap[idx] - if r.data == nil { - req = !r.queued - r.queued = true - if r.delivered == nil { - r.delivered = make(chan struct{}) - } - f.requestMap[idx] = r - } - f.requestLock.Unlock() - if req { - distCh <- distRequest{bloomIndex: f.bloomIndex, sectionIndex: idx} // success is guaranteed, distibuteRequests shuts down after fetch - } - select { - case <-stop: - return - case returnCh <- idx: - } - } - } - }() - - go func() { - defer wg.Done() - defer close(dataCh) - - for { - select { - case <-stop: - return - case idx, ok := <-returnCh: - if !ok { - return - } - - f.requestLock.RLock() - r := f.requestMap[idx] - f.requestLock.RUnlock() - - if r.data == nil { - select { - case <-stop: - return - case <-r.delivered: - f.requestLock.RLock() - r = f.requestMap[idx] - f.requestLock.RUnlock() - } - } - select { - case <-stop: - return - case dataCh <- r.data: - } - } - } - }() - - return dataCh -} - -// deliver is called by the request distributor when a reply to a request has -// arrived -func (f *fetcher) deliver(sectionIdxList []uint64, data [][]byte) { - f.requestLock.Lock() - defer f.requestLock.Unlock() - - for i, sectionIdx := range sectionIdxList { - r := f.requestMap[sectionIdx] - if r.data != nil { - panic("BloomBits section data delivered twice") - } - r.data = data[i] - close(r.delivered) - f.requestMap[sectionIdx] = r + var idxs bloomIndexes + for i := 0; i < len(idxs); i++ { + idxs[i] = (uint(b[2*i])<<8)&2047 + uint(b[2*i+1]) } + return idxs } -// Matcher is a pipelined structure of fetchers and logic matchers which perform -// binary AND/OR operations on the bitstreams, finally creating a stream of potential matches. +// partialMatches with a non-nil vector represents a section in which some sub- +// matchers have already found potential matches. Subsequent sub-matchers will +// binary AND their matches with this vector. If vector is nil, it represents a +// section to be processed by the first sub-matcher. +type partialMatches struct { + section uint64 + bitset []byte +} + +// Retrieval represents a request for retrieval task assignments for a given +// bit with the given number of fetch elements, or a response for such a request. +// It can also have the actual results set to be used as a delivery data struct. +type Retrieval struct { + Bit uint + Sections []uint64 + Bitsets [][]byte +} + +// Matcher is a pipelined system of schedulers and logic matchers which perform +// binary AND/OR operations on the bit-streams, creating a stream of potential +// blocks to inspect for data content. type Matcher struct { - addresses []types.BloomIndexList - topics [][]types.BloomIndexList - fetchers map[uint]*fetcher - sectionSize uint64 + sectionSize uint64 // Size of the data batches to filter on - distCh chan distRequest - reqs map[uint][]uint64 - freeQueues map[uint]struct{} - allocQueue []chan uint - running bool - stop chan struct{} - lock sync.Mutex - wg, distWg sync.WaitGroup + addresses []bloomIndexes // Addresses the system is filtering for + topics [][]bloomIndexes // Topics the system is filtering for + schedulers map[uint]*scheduler // Retrieval schedulers for loading bloom bits + + retrievers chan chan uint // Retriever processes waiting for bit allocations + counters chan chan uint // Retriever processes waiting for task count reports + retrievals chan chan *Retrieval // Retriever processes waiting for task allocations + deliveries chan *Retrieval // Retriever processes waiting for task response deliveries + + running uint32 // Atomic flag whether a session is live or not } -// NewMatcher creates a new Matcher instance +// NewMatcher creates a new pipeline for retrieving bloom bit streams and doing +// address and topic filtering on them. func NewMatcher(sectionSize uint64, addresses []common.Address, topics [][]common.Hash) *Matcher { m := &Matcher{ - fetchers: make(map[uint]*fetcher), - reqs: make(map[uint][]uint64), - freeQueues: make(map[uint]struct{}), - distCh: make(chan distRequest, channelCap), sectionSize: sectionSize, + schedulers: make(map[uint]*scheduler), + retrievers: make(chan chan uint), + counters: make(chan chan uint), + retrievals: make(chan chan *Retrieval), + deliveries: make(chan *Retrieval), } m.setAddresses(addresses) m.setTopics(topics) return m } -// setAddresses matches only logs that are generated from addresses that are included -// in the given addresses. +// setAddresses configures the matcher to only return logs that are generated +// from addresses that are included in the given list. func (m *Matcher) setAddresses(addresses []common.Address) { - m.addresses = make([]types.BloomIndexList, len(addresses)) + // Calculate the bloom bit indexes for the addresses we're interested in + m.addresses = make([]bloomIndexes, len(addresses)) for i, address := range addresses { - m.addresses[i] = types.BloomIndexes(address.Bytes()) + m.addresses[i] = calcBloomIndexes(address.Bytes()) } - + // For every bit, create a scheduler to load/download the bit vectors for _, bloomIndexList := range m.addresses { for _, bloomIndex := range bloomIndexList { - m.newFetcher(bloomIndex) + m.addScheduler(bloomIndex) } } } -// setTopics matches only logs that have topics matching the given topics. -func (m *Matcher) setTopics(topics [][]common.Hash) { +// setTopics configures the matcher to only return logs that have topics matching +// the given list. +func (m *Matcher) setTopics(topicsList [][]common.Hash) { + // Calculate the bloom bit indexes for the topics we're interested in m.topics = nil -loop: - for _, topicList := range topics { - t := make([]types.BloomIndexList, len(topicList)) - for i, topic := range topicList { - if (topic == common.Hash{}) { - continue loop - } - t[i] = types.BloomIndexes(topic.Bytes()) - } - m.topics = append(m.topics, t) - } + for _, topics := range topicsList { + bloomBits := make([]bloomIndexes, len(topics)) + for i, topic := range topics { + bloomBits[i] = calcBloomIndexes(topic.Bytes()) + } + m.topics = append(m.topics, bloomBits) + } + // For every bit, create a scheduler to load/download the bit vectors for _, bloomIndexLists := range m.topics { for _, bloomIndexList := range bloomIndexLists { for _, bloomIndex := range bloomIndexList { - m.newFetcher(bloomIndex) + m.addScheduler(bloomIndex) } } } } -// match creates a daisy-chain of sub-matchers, one for the address set and one for each topic set, each -// sub-matcher receiving a section only if the previous ones have all found a potential match in one of -// the blocks of the section, then binary AND-ing its own matches and forwaring the result to the next one -func (m *Matcher) match(processCh chan partialMatches) chan partialMatches { - indexLists := m.topics - if len(m.addresses) > 0 { - indexLists = append([][]types.BloomIndexList{m.addresses}, indexLists...) - } - m.distributeRequests() - - for _, subIndexList := range indexLists { - processCh = m.subMatch(processCh, subIndexList) - } - return processCh -} - -// partialMatches with a non-nil vector represents a section in which some sub-matchers have already -// found potential matches. Subsequent sub-matchers will binary AND their matches with this vector. -// If vector is nil, it represents a section to be processed by the first sub-matcher. -type partialMatches struct { - sectionIndex uint64 - vector []byte -} - -// newFetcher adds a fetcher for the given bit index if it has not existed before -func (m *Matcher) newFetcher(idx uint) { - if _, ok := m.fetchers[idx]; ok { +// addScheduler adds a bit stream retrieval scheduler for the given bit index if +// it has not existed before. If the bit is already selected for filtering, the +// existing scheduler can be used. +func (m *Matcher) addScheduler(idx uint) { + if _, ok := m.schedulers[idx]; ok { return } - f := &fetcher{ - bloomIndex: idx, - requestMap: make(map[uint64]fetchRequest), - } - m.fetchers[idx] = f + m.schedulers[idx] = newScheduler(idx) } -// subMatch creates a sub-matcher that filters for a set of addresses or topics, binary OR-s those matches, then -// binary AND-s the result to the daisy-chain input (processCh) and forwards it to the daisy-chain output. -// The matches of each address/topic are calculated by fetching the given sections of the three bloom bit indexes belonging to -// that address/topic, and binary AND-ing those vectors together. -func (m *Matcher) subMatch(processCh chan partialMatches, bloomIndexLists []types.BloomIndexList) chan partialMatches { - // set up fetchers - fetchIndexChannels := make([][3]chan uint64, len(bloomIndexLists)) - fetchDataChannels := make([][3]chan []byte, len(bloomIndexLists)) - for i, bloomIndexList := range bloomIndexLists { - for j, bloomIndex := range bloomIndexList { - fetchIndexChannels[i][j] = make(chan uint64, channelCap) - fetchDataChannels[i][j] = m.fetchers[bloomIndex].fetch(fetchIndexChannels[i][j], m.distCh, m.stop, &m.wg) - } +// Start starts the matching process and returns a stream of bloom matches in +// a given range of blocks. If there are no more matches in the range, the result +// channel is closed. +func (m *Matcher) Start(begin, end uint64, results chan uint64) (*MatcherSession, error) { + // Make sure we're not creating concurrent sessions + if atomic.SwapUint32(&m.running, 1) == 1 { + return nil, errors.New("matcher already running") } + defer atomic.StoreUint32(&m.running, 0) - fetchedCh := make(chan partialMatches, channelCap) // entries from processCh are forwarded here after fetches have been initiated - resultsCh := make(chan partialMatches, channelCap) + // Initiate a new matching round + session := &MatcherSession{ + matcher: m, + quit: make(chan struct{}), + kill: make(chan struct{}), + } + for _, scheduler := range m.schedulers { + scheduler.reset() + } + sink := m.run(begin, end, cap(results), session) - m.wg.Add(2) - // goroutine for starting retrievals + // Read the output from the result sink and deliver to the user + session.pend.Add(1) go func() { - defer m.wg.Done() + defer session.pend.Done() + defer close(results) for { select { - case <-m.stop: + case <-session.quit: return - case s, ok := <-processCh: - if !ok { - close(fetchedCh) - for _, fetchIndexChs := range fetchIndexChannels { - for _, fetchIndexCh := range fetchIndexChs { - close(fetchIndexCh) - } - } - return - } - for _, fetchIndexChs := range fetchIndexChannels { - for _, fetchIndexCh := range fetchIndexChs { + case res, ok := <-sink: + // New match result found + if !ok { + return + } + // Calculate the first and last blocks of the section + sectionStart := res.section * m.sectionSize + + first := sectionStart + if begin > first { + first = begin + } + last := sectionStart + m.sectionSize - 1 + if end < last { + last = end + } + // Iterate over all the blocks in the section and return the matching ones + for i := first; i <= last; i++ { + // If the bitset is nil, we're a special match-all cornercase + if res.bitset == nil { select { - case <-m.stop: + case <-session.quit: return - case fetchIndexCh <- s.sectionIndex: + case results <- i: + } + continue + } + // Skip the entire byte if no matches are found inside + next := res.bitset[(i-sectionStart)/8] + if next == 0 { + i += 7 + continue + } + // Some bit it set, do the actual submatching + if bit := 7 - i%8; next&(1< 0 { + blooms = append([][]bloomIndexes{m.addresses}, blooms...) + } + next := source + dist := make(chan *request, buffer) + + for _, bloom := range blooms { + next = m.subMatch(next, dist, bloom, session) + } + // Start the request distribution + session.pend.Add(1) + go m.distributor(dist, session) + + return next +} + +// subMatch creates a sub-matcher that filters for a set of addresses or topics, binary OR-s those matches, then +// binary AND-s the result to the daisy-chain input (source) and forwards it to the daisy-chain output. +// The matches of each address/topic are calculated by fetching the given sections of the three bloom bit indexes belonging to +// that address/topic, and binary AND-ing those vectors together. +func (m *Matcher) subMatch(source chan *partialMatches, dist chan *request, bloom []bloomIndexes, session *MatcherSession) chan *partialMatches { + // Start the concurrent schedulers for each bit required by the bloom filter + sectionSources := make([][3]chan uint64, len(bloom)) + sectionSinks := make([][3]chan []byte, len(bloom)) + for i, bits := range bloom { + for j, bit := range bits { + sectionSources[i][j] = make(chan uint64, cap(source)) + sectionSinks[i][j] = make(chan []byte, cap(source)) + + m.schedulers[bit].run(sectionSources[i][j], dist, sectionSinks[i][j], session.quit, &session.pend) + } + } + + process := make(chan *partialMatches, cap(source)) // entries from source are forwarded here after fetches have been initiated + results := make(chan *partialMatches, cap(source)) + + session.pend.Add(2) + go func() { + // Tear down the goroutine and terminate all source channels + defer session.pend.Done() + defer close(process) + + defer func() { + for _, bloomSources := range sectionSources { + for _, bitSource := range bloomSources { + close(bitSource) + } + } + }() + // Read sections from the source channel and multiplex into all bit-schedulers + for { + select { + case <-session.quit: + return + + case subres, ok := <-source: + // New subresult from previous link + if !ok { return - case fetchedCh <- s: + } + // Multiplex the section index to all bit-schedulers + for _, bloomSources := range sectionSources { + for _, bitSource := range bloomSources { + select { + case <-session.quit: + return + case bitSource <- subres.section: + } + } + } + // Notify the processor that this section will become available + select { + case <-session.quit: + return + case process <- subres: } } } }() - // goroutine for processing retrieved data go func() { - defer m.wg.Done() + // Tear down the goroutine and terminate the final sink channel + defer session.pend.Done() + defer close(results) + // Read the source notifications and collect the delivered results for { select { - case <-m.stop: + case <-session.quit: return - case s, ok := <-fetchedCh: + + case subres, ok := <-process: + // Notified of a section being retrieved if !ok { - close(resultsCh) return } - + // Gather all the sub-results and merge them together var orVector []byte - for _, fetchDataChs := range fetchDataChannels { + for _, bloomSinks := range sectionSinks { var andVector []byte - for _, fetchDataCh := range fetchDataChs { + for _, bitSink := range bloomSinks { var data []byte select { - case <-m.stop: + case <-session.quit: return - case data = <-fetchDataCh: + case data = <-bitSink: } if andVector == nil { andVector = make([]byte, int(m.sectionSize/8)) @@ -352,228 +375,277 @@ func (m *Matcher) subMatch(processCh chan partialMatches, bloomIndexLists []type if orVector == nil { orVector = make([]byte, int(m.sectionSize/8)) } - if s.vector != nil { - bitutil.ANDBytes(orVector, orVector, s.vector) + if subres.bitset != nil { + bitutil.ANDBytes(orVector, orVector, subres.bitset) } if bitutil.TestBytes(orVector) { select { - case <-m.stop: + case <-session.quit: return - case resultsCh <- partialMatches{s.sectionIndex, orVector}: + case results <- &partialMatches{subres.section, orVector}: } } } } }() - - return resultsCh + return results } -// Start starts the matching process and returns a stream of bloom matches in -// a given range of blocks. -// It returns a results channel immediately and stops if Stop is called or there -// are no more matches in the range (in which case the results channel is closed). -// Start/Stop can be called multiple times for different ranges, in which case already -// delivered bit vectors are not requested again. -func (m *Matcher) Start(begin, end uint64) chan uint64 { - m.stop = make(chan struct{}) - processCh := make(chan partialMatches, channelCap) - resultsCh := make(chan uint64, channelCap) +// distributor receives requests from the schedulers and queues them into a set +// of pending requests, which are assigned to retrievers wanting to fulfil them. +func (m *Matcher) distributor(dist chan *request, session *MatcherSession) { + defer session.pend.Done() - res := m.match(processCh) + var ( + requests = make(map[uint][]uint64) // Per-bit list of section requests, ordered by section number + unallocs = make(map[uint]struct{}) // Bits with pending requests but not allocated to any retriever + retrievers chan chan uint // Waiting retrievers (toggled to nil if unallocs is empty) + ) + var ( + allocs int // Number of active allocations to handle graceful shutdown requests + shutdown = session.quit // Shutdown request channel, will gracefully wait for pending requests + ) - startSection := begin / m.sectionSize - endSection := end / m.sectionSize + // assign is a helper method fo try to assign a pending bit an an actively + // listening servicer, or schedule it up for later when one arrives. + assign := func(bit uint) { + select { + case fetcher := <-m.retrievers: + allocs++ + fetcher <- bit + default: + // No retrievers active, start listening for new ones + retrievers = m.retrievers + unallocs[bit] = struct{}{} + } + } - m.wg.Add(2) - go func() { - defer m.wg.Done() - defer close(processCh) + for { + select { + case <-shutdown: + // Graceful shutdown requested, wait until all pending requests are honoured + if allocs == 0 { + return + } + shutdown = nil - for i := startSection; i <= endSection; i++ { - select { - case processCh <- partialMatches{i, nil}: - case <-m.stop: + case <-session.kill: + // Pending requests not honoured in time, hard terminate + return + + case req := <-dist: + // New retrieval request arrived to be distributed to some fetcher process + queue := requests[req.bit] + index := sort.Search(len(queue), func(i int) bool { return queue[i] >= req.section }) + requests[req.bit] = append(queue[:index], append([]uint64{req.section}, queue[index:]...)...) + + // If it's a new bit and we have waiting fetchers, allocate to them + if len(queue) == 0 { + assign(req.bit) + } + + case fetcher := <-retrievers: + // New retriever arrived, find the lowest section-ed bit to assign + bit, best := uint(0), uint64(math.MaxUint64) + for idx := range unallocs { + if requests[idx][0] < best { + bit, best = idx, requests[idx][0] + } + } + // Stop tracking this bit (and alloc notifications if no more work is available) + delete(unallocs, bit) + if len(unallocs) == 0 { + retrievers = nil + } + allocs++ + fetcher <- bit + + case fetcher := <-m.counters: + // New task count request arrives, return number of items + fetcher <- uint(len(requests[<-fetcher])) + + case fetcher := <-m.retrievals: + // New fetcher waiting for tasks to retrieve, assign + task := <-fetcher + if want := len(task.Sections); want >= len(requests[task.Bit]) { + task.Sections = requests[task.Bit] + delete(requests, task.Bit) + } else { + task.Sections = append(task.Sections[:0], requests[task.Bit][:want]...) + requests[task.Bit] = append(requests[task.Bit][:0], requests[task.Bit][want:]...) + } + fetcher <- task + + // If anything was left unallocated, try to assign to someone else + if len(requests[task.Bit]) > 0 { + assign(task.Bit) + } + + case result := <-m.deliveries: + // New retrieval task response from fetcher, split out missing sections and + // deliver complete ones + var ( + sections = make([]uint64, 0, len(result.Sections)) + bitsets = make([][]byte, 0, len(result.Bitsets)) + missing = make([]uint64, 0, len(result.Sections)) + ) + for i, bitset := range result.Bitsets { + if len(bitset) == 0 { + missing = append(missing, result.Sections[i]) + continue + } + sections = append(sections, result.Sections[i]) + bitsets = append(bitsets, bitset) + } + m.schedulers[result.Bit].deliver(sections, bitsets) + allocs-- + + // Reschedule missing sections and allocate bit if newly available + if len(missing) > 0 { + queue := requests[result.Bit] + for _, section := range missing { + index := sort.Search(len(queue), func(i int) bool { return queue[i] >= section }) + queue = append(queue[:index], append([]uint64{section}, queue[index:]...)...) + } + requests[result.Bit] = queue + + if len(queue) == len(missing) { + assign(result.Bit) + } + } + // If we're in the process of shutting down, terminate + if allocs == 0 && shutdown == nil { return } } - }() - - go func() { - defer m.wg.Done() - defer close(resultsCh) - - for { - select { - case r, ok := <-res: - if !ok { - return - } - sectionStart := r.sectionIndex * m.sectionSize - s := sectionStart - if begin > s { - s = begin - } - e := sectionStart + m.sectionSize - 1 - if end < e { - e = end - } - for i := s; i <= e; i++ { - b := r.vector[(i-sectionStart)/8] - bit := 7 - i%8 - if b != 0 { - if b&(1< queue[i] { - i++ - } - queue = append(queue, 0) - copy(queue[i+1:], queue[i:len(queue)-1]) - queue[i] = r.sectionIndex - m.reqs[r.bloomIndex] = queue - if len(queue) == 1 { - m.freeQueue(r.bloomIndex) - } - m.lock.Unlock() - case <-stopDist: - m.lock.Lock() - for _, ch := range m.allocQueue { - close(ch) - } - m.allocQueue = nil - m.running = false - m.lock.Unlock() - m.distWg.Done() - return - } - } - }() -} - -// freeQueue marks a queue as free if there are no AllocSectionQueue functions -// waiting for allocation. If there is someone waiting, the queue is immediately -// allocated. -func (m *Matcher) freeQueue(bloomIndex uint) { - if len(m.allocQueue) > 0 { - m.allocQueue[0] <- bloomIndex - m.allocQueue = m.allocQueue[1:] - } else { - m.freeQueues[bloomIndex] = struct{}{} } } -// AllocSectionQueue allocates a queue of requested section indexes belonging to the same -// bloom bit index for a client process that can either immediately fetch the contents -// of the queue or wait a little while for more section indexes to be requested. -func (m *Matcher) AllocSectionQueue() (uint, bool) { - m.lock.Lock() - if !m.running { - m.lock.Unlock() +// MatcherSession is returned by a started matcher to be used as a terminator +// for the actively running matching operation. +type MatcherSession struct { + matcher *Matcher + + quit chan struct{} // Quit channel to request pipeline termination + kill chan struct{} // Term channel to signal non-graceful forced shutdown + pend sync.WaitGroup +} + +// Close stops the matching process and waits for all subprocesses to terminate +// before returning. The timeout may be used for graceful shutdown, allowing the +// currently running retrievals to complete before this time. +func (s *MatcherSession) Close(timeout time.Duration) { + // Bail out if the matcher is not running + select { + case <-s.quit: + return + default: + } + // Signal termination and wait for all goroutines to tear down + close(s.quit) + time.AfterFunc(timeout, func() { close(s.kill) }) + s.pend.Wait() +} + +// AllocateRetrieval assigns a bloom bit index to a client process that can either +// immediately reuest and fetch the section contents assigned to this bit or wait +// a little while for more sections to be requested. +func (s *MatcherSession) AllocateRetrieval() (uint, bool) { + fetcher := make(chan uint) + + select { + case <-s.quit: return 0, false + case s.matcher.retrievers <- fetcher: + bit, ok := <-fetcher + return bit, ok } +} - var allocCh chan uint - if len(m.freeQueues) > 0 { - var ( - found bool - bestSection uint64 - bestIndex uint - ) - for bloomIndex, _ := range m.freeQueues { - if !found || m.reqs[bloomIndex][0] < bestSection { - found = true - bestIndex = bloomIndex - bestSection = m.reqs[bloomIndex][0] +// PendingSections returns the number of pending section retrievals belonging to +// the given bloom bit index. +func (s *MatcherSession) PendingSections(bit uint) int { + fetcher := make(chan uint) + + select { + case <-s.quit: + return 0 + case s.matcher.counters <- fetcher: + fetcher <- bit + return int(<-fetcher) + } +} + +// AllocateSections assigns all or part of an already allocated bit-task queue +// to the requesting process. +func (s *MatcherSession) AllocateSections(bit uint, count int) []uint64 { + fetcher := make(chan *Retrieval) + + select { + case <-s.quit: + return nil + case s.matcher.retrievals <- fetcher: + task := &Retrieval{ + Bit: bit, + Sections: make([]uint64, count), + } + fetcher <- task + return (<-fetcher).Sections + } +} + +// DeliverSections delivers a batch of section bit-vectors for a specific bloom +// bit index to be injected into the processing pipeline. +func (s *MatcherSession) DeliverSections(bit uint, sections []uint64, bitsets [][]byte) { + select { + case <-s.kill: + return + case s.matcher.deliveries <- &Retrieval{Bit: bit, Sections: sections, Bitsets: bitsets}: + } +} + +// Multiplex polls the matcher session for rerieval tasks and multiplexes it into +// the reuested retrieval queue to be serviced together with other sessions. +// +// This method will block for the lifetime of the session. Even after termination +// of the session, any request in-flight need to be responded to! Empty responses +// are fine though in that case. +func (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan *Retrieval) { + for { + // Allocate a new bloom bit index to retrieve data for, stopping when done + bit, ok := s.AllocateRetrieval() + if !ok { + return + } + // Bit allocated, throttle a bit if we're below our batch limit + if s.PendingSections(bit) < batch { + select { + case <-s.quit: + // Session terminating, we can't meaningfully service, abort + s.AllocateSections(bit, 0) + s.DeliverSections(bit, []uint64{}, [][]byte{}) + return + + case <-time.After(wait): + // Throttling up, fetch whatever's available } } - delete(m.freeQueues, bestIndex) - m.lock.Unlock() - return bestIndex, true - } else { - allocCh = make(chan uint) - m.allocQueue = append(m.allocQueue, allocCh) - } - m.lock.Unlock() + // Allocate as much as we can handle and request servicing + sections := s.AllocateSections(bit, batch) + request := make(chan *Retrieval) - bloomIndex, ok := <-allocCh - return bloomIndex, ok -} + select { + case <-s.quit: + // Session terminating, we can't meaningfully service, abort + s.DeliverSections(bit, sections, make([][]byte, len(sections))) + return -// SectionCount returns the length of the section index queue belonging to the given bloom bit index -func (m *Matcher) SectionCount(bloomIndex uint) int { - m.lock.Lock() - defer m.lock.Unlock() + case mux <- request: + // Retrieval accepted, something must arrive before we're aborting + request <- &Retrieval{Bit: bit, Sections: sections} - return len(m.reqs[bloomIndex]) -} - -// FetchSections fetches all or part of an already allocated queue and deallocates it -func (m *Matcher) FetchSections(bloomIndex uint, maxCount int) []uint64 { - m.lock.Lock() - defer m.lock.Unlock() - - queue := m.reqs[bloomIndex] - if maxCount < len(queue) { - // return only part of the existing queue, mark the rest as free - m.reqs[bloomIndex] = queue[maxCount:] - m.freeQueue(bloomIndex) - return queue[:maxCount] - } else { - // return the entire queue - delete(m.reqs, bloomIndex) - return queue + result := <-request + s.DeliverSections(result.Bit, result.Sections, result.Bitsets) + } } } - -// Deliver delivers a bit vector to the appropriate fetcher. -// It is possible to deliver data even after Stop has been called. Once a vector has been -// requested, the matcher will keep waiting for delivery. -func (m *Matcher) Deliver(bloomIndex uint, sectionIdxList []uint64, data [][]byte) { - m.fetchers[bloomIndex].deliver(sectionIdxList, data) -} diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index bef1491b83..fc49b43b8f 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -13,6 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . + package bloombits import ( @@ -20,151 +21,45 @@ import ( "sync/atomic" "testing" "time" - - "github.com/ethereum/go-ethereum/core/types" ) const testSectionSize = 4096 -func matcherTestVector(b uint, s uint64) []byte { - r := make([]byte, testSectionSize/8) - for i, _ := range r { - var bb byte - for bit := 0; bit < 8; bit++ { - blockIdx := s*testSectionSize + uint64(i*8+bit) - bb += bb - if (blockIdx % uint64(b)) == 0 { - bb++ - } - } - r[i] = bb - } - return r +// Tests the matcher pipeline on a single continuous workflow without interrupts. +func TestMatcherContinuous(t *testing.T) { + testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 100000, false, 75) + testMatcherDiffBatches(t, [][]bloomIndexes{{{32, 3125, 100}}, {{40, 50, 10}}}, 100000, false, 81) + testMatcherDiffBatches(t, [][]bloomIndexes{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, false, 36) } -func expMatch1(idxs types.BloomIndexList, i uint64) bool { - for _, ii := range idxs { - if (i % uint64(ii)) != 0 { - return false - } - } - return true +// Tests the matcher pipeline on a constantly interrupted and resumed work pattern +// with the aim of ensuring data items are requested only once. +func TestMatcherIntermittent(t *testing.T) { + testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 100000, true, 75) + testMatcherDiffBatches(t, [][]bloomIndexes{{{32, 3125, 100}}, {{40, 50, 10}}}, 100000, true, 81) + testMatcherDiffBatches(t, [][]bloomIndexes{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, true, 36) } -func expMatch2(idxs []types.BloomIndexList, i uint64) bool { - for _, ii := range idxs { - if expMatch1(ii, i) { - return true - } - } - return false -} - -func expMatch3(idxs [][]types.BloomIndexList, i uint64) bool { - for _, ii := range idxs { - if !expMatch2(ii, i) { - return false - } - } - return true -} - -func testServeMatcher(m *Matcher, stop chan struct{}, cnt *uint32, maxRequestLen int) { - // serve matcher with test vectors +// Tests the matcher pipeline on random input to hopefully catch anomalies. +func TestMatcherRandom(t *testing.T) { for i := 0; i < 10; i++ { - go func() { - for { - select { - case <-stop: - return - default: - } - b, ok := m.AllocSectionQueue() - if !ok { - return - } - if m.SectionCount(b) < maxRequestLen { - time.Sleep(time.Microsecond * 100) - } - s := m.FetchSections(b, maxRequestLen) - res := make([][]byte, len(s)) - for i, ss := range s { - res[i] = matcherTestVector(b, ss) - atomic.AddUint32(cnt, 1) - } - m.Deliver(b, s, res) - } - }() + testMatcherBothModes(t, makeRandomIndexes([]int{1}, 50), 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{3}, 50), 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{2, 2, 2}, 20), 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{5, 5, 5}, 50), 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{4, 4, 4}, 20), 10000, 0) } } -func testMatcher(t *testing.T, idxs [][]types.BloomIndexList, cnt uint64, stopOnMatches bool, expCount uint32) uint32 { - count1 := testMatcherWithReqCount(t, idxs, cnt, stopOnMatches, expCount, 1) - count16 := testMatcherWithReqCount(t, idxs, cnt, stopOnMatches, expCount, 16) - if count1 != count16 { - t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: request count mismatch, %v with maxReqCount = 1 vs. %v with maxReqCount = 16", idxs, cnt, stopOnMatches, count1, count16) - } - return count1 -} - -func testMatcherWithReqCount(t *testing.T, idxs [][]types.BloomIndexList, cnt uint64, stopOnMatches bool, expCount uint32, maxReqCount int) uint32 { - m := NewMatcher(testSectionSize, nil, nil) - - for _, idxss := range idxs { - for _, idxs := range idxss { - for _, idx := range idxs { - m.newFetcher(idx) - } - } - } - - m.addresses = idxs[0] - m.topics = idxs[1:] - var reqCount uint32 - - stop := make(chan struct{}) - chn := m.Start(0, cnt-1) - testServeMatcher(m, stop, &reqCount, maxReqCount) - - for i := uint64(0); i < cnt; i++ { - if expMatch3(idxs, i) { - match, ok := <-chn - if !ok { - t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: expected #%v, results channel closed", idxs, cnt, stopOnMatches, i) - return 0 - } - if match != i { - t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: expected #%v, got #%v", idxs, cnt, stopOnMatches, i, match) - } - if stopOnMatches { - m.Stop() - close(stop) - stop = make(chan struct{}) - chn = m.Start(i+1, cnt-1) - testServeMatcher(m, stop, &reqCount, maxReqCount) - } - } - } - match, ok := <-chn - if ok { - t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: expected closed channel, got #%v", idxs, cnt, stopOnMatches, match) - } - m.Stop() - close(stop) - - if expCount != 0 && expCount != reqCount { - t.Errorf("Error matching idxs = %v count = %v stopOnMatches = %v: request count mismatch, expected #%v, got #%v", idxs, cnt, stopOnMatches, expCount, reqCount) - } - - return reqCount -} - -func testRandomIdxs(l []int, max int) [][]types.BloomIndexList { - res := make([][]types.BloomIndexList, len(l)) - for i, ll := range l { - res[i] = make([]types.BloomIndexList, ll) - for j, _ := range res[i] { - for k, _ := range res[i][j] { +// makeRandomIndexes generates a random filter system, composed on multiple filter +// criteria, each having one bloom list component for the address and arbitrarilly +// many topic bloom list components. +func makeRandomIndexes(lengths []int, max int) [][]bloomIndexes { + res := make([][]bloomIndexes, len(lengths)) + for i, topics := range lengths { + res[i] = make([]bloomIndexes, topics) + for j := 0; j < topics; j++ { + for k := 0; k < len(res[i][j]); k++ { res[i][j][k] = uint(rand.Intn(max-1) + 2) } } @@ -172,25 +67,173 @@ func testRandomIdxs(l []int, max int) [][]types.BloomIndexList { return res } -func TestMatcher(t *testing.T) { - testMatcher(t, [][]types.BloomIndexList{{{10, 20, 30}}}, 100000, false, 75) - testMatcher(t, [][]types.BloomIndexList{{{32, 3125, 100}}, {{40, 50, 10}}}, 100000, false, 81) - testMatcher(t, [][]types.BloomIndexList{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, false, 36) -} +// testMatcherDiffBatches runs the given matches test in single-delivery and also +// in batches delivery mode, verifying that all kinds of deliveries are handled +// correctly withn. +func testMatcherDiffBatches(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermittent bool, retrievals uint32) { + singleton := testMatcher(t, filter, blocks, intermittent, retrievals, 1) + batched := testMatcher(t, filter, blocks, intermittent, retrievals, 16) -func TestMatcherStopOnMatches(t *testing.T) { - testMatcher(t, [][]types.BloomIndexList{{{10, 20, 30}}}, 100000, true, 75) - testMatcher(t, [][]types.BloomIndexList{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, true, 36) -} - -func TestMatcherRandom(t *testing.T) { - for i := 0; i < 20; i++ { - testMatcher(t, testRandomIdxs([]int{1}, 50), 100000, false, 0) - testMatcher(t, testRandomIdxs([]int{3}, 50), 100000, false, 0) - testMatcher(t, testRandomIdxs([]int{2, 2, 2}, 20), 100000, false, 0) - testMatcher(t, testRandomIdxs([]int{5, 5, 5}, 50), 100000, false, 0) - idxs := testRandomIdxs([]int{2, 2, 2}, 20) - reqCount := testMatcher(t, idxs, 10000, false, 0) - testMatcher(t, idxs, 10000, true, reqCount) + if singleton != batched { + t.Errorf("filter = %v blocks = %v intermittent = %v: request count mismatch, %v in signleton vs. %v in batched mode", filter, blocks, intermittent, singleton, batched) } } + +// testMatcherBothModes runs the given matcher test in both continuous as well as +// in intermittent mode, verifying that the request counts match each other. +func testMatcherBothModes(t *testing.T, filter [][]bloomIndexes, blocks uint64, retrievals uint32) { + continuous := testMatcher(t, filter, blocks, false, retrievals, 16) + intermittent := testMatcher(t, filter, blocks, true, retrievals, 16) + + if continuous != intermittent { + t.Errorf("filter = %v blocks = %v: request count mismatch, %v in continuous vs. %v in intermittent mode", filter, blocks, continuous, intermittent) + } +} + +// testMatcher is a generic tester to run the given matcher test and return the +// number of requests made for cross validation between different modes. +func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermittent bool, retrievals uint32, maxReqCount int) uint32 { + // Create a new matcher an simulate our explicit random bitsets + matcher := NewMatcher(testSectionSize, nil, nil) + + matcher.addresses = filter[0] + matcher.topics = filter[1:] + + for _, rule := range filter { + for _, topic := range rule { + for _, bit := range topic { + matcher.addScheduler(bit) + } + } + } + // Track the number of retrieval requests made + var requested uint32 + + // Start the matching session for the filter and the retriver goroutines + quit := make(chan struct{}) + matches := make(chan uint64, 16) + + session, err := matcher.Start(0, blocks-1, matches) + if err != nil { + t.Fatalf("failed to stat matcher session: %v", err) + } + startRetrievers(session, quit, &requested, maxReqCount) + + // Iterate over all the blocks and verify that the pipeline produces the correct matches + for i := uint64(0); i < blocks; i++ { + if expMatch3(filter, i) { + match, ok := <-matches + if !ok { + t.Errorf("filter = %v blocks = %v intermittent = %v: expected #%v, results channel closed", filter, blocks, intermittent, i) + return 0 + } + if match != i { + t.Errorf("filter = %v blocks = %v intermittent = %v: expected #%v, got #%v", filter, blocks, intermittent, i, match) + } + // If we're testing intermittent mode, abort and restart the pipeline + if intermittent { + session.Close(time.Second) + close(quit) + + quit = make(chan struct{}) + matches = make(chan uint64, 16) + + session, err = matcher.Start(i+1, blocks-1, matches) + if err != nil { + t.Fatalf("failed to stat matcher session: %v", err) + } + startRetrievers(session, quit, &requested, maxReqCount) + } + } + } + // Ensure the result channel is torn down after the last block + match, ok := <-matches + if ok { + t.Errorf("filter = %v blocks = %v intermittent = %v: expected closed channel, got #%v", filter, blocks, intermittent, match) + } + // Clean up the session and ensure we match the expected retrieval count + session.Close(time.Second) + close(quit) + + if retrievals != 0 && requested != retrievals { + t.Errorf("filter = %v blocks = %v intermittent = %v: request count mismatch, have #%v, want #%v", filter, blocks, intermittent, requested, retrievals) + } + return requested +} + +// startRetrievers starts a batch of goroutines listening for section requests +// and serving them. +func startRetrievers(session *MatcherSession, quit chan struct{}, retrievals *uint32, batch int) { + requests := make(chan chan *Retrieval) + + for i := 0; i < 10; i++ { + // Start a multiplexer to test multiple threaded execution + go session.Multiplex(batch, 100*time.Microsecond, requests) + + // Start a services to match the above multiplexer + go func() { + for { + // Wait for a service request or a shutdown + select { + case <-quit: + return + + case request := <-requests: + task := <-request + + task.Bitsets = make([][]byte, len(task.Sections)) + for i, section := range task.Sections { + if rand.Int()%4 != 0 { // Handle occasional missing deliveries + task.Bitsets[i] = generateBitset(task.Bit, section) + atomic.AddUint32(retrievals, 1) + } + } + request <- task + } + } + }() + } +} + +// generateBitset generates the rotated bitset for the given bloom bit and section +// numbers. +func generateBitset(bit uint, section uint64) []byte { + bitset := make([]byte, testSectionSize/8) + for i := 0; i < len(bitset); i++ { + for b := 0; b < 8; b++ { + blockIdx := section*testSectionSize + uint64(i*8+b) + bitset[i] += bitset[i] + if (blockIdx % uint64(bit)) == 0 { + bitset[i]++ + } + } + } + return bitset +} + +func expMatch1(filter bloomIndexes, i uint64) bool { + for _, ii := range filter { + if (i % uint64(ii)) != 0 { + return false + } + } + return true +} + +func expMatch2(filter []bloomIndexes, i uint64) bool { + for _, ii := range filter { + if expMatch1(ii, i) { + return true + } + } + return false +} + +func expMatch3(filter [][]bloomIndexes, i uint64) bool { + for _, ii := range filter { + if !expMatch2(ii, i) { + return false + } + } + return true +} diff --git a/core/bloombits/scheduler.go b/core/bloombits/scheduler.go new file mode 100644 index 0000000000..6449c7465a --- /dev/null +++ b/core/bloombits/scheduler.go @@ -0,0 +1,181 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bloombits + +import ( + "sync" +) + +// request represents a bloom retrieval task to prioritize and pull from the local +// database or remotely from the network. +type request struct { + section uint64 // Section index to retrieve the a bit-vector from + bit uint // Bit index within the section to retrieve the vector of +} + +// response represents the state of a requested bit-vector through a scheduler. +type response struct { + cached []byte // Cached bits to dedup multiple requests + done chan struct{} // Channel to allow waiting for completion +} + +// scheduler handles the scheduling of bloom-filter retrieval operations for +// entire section-batches belonging to a single bloom bit. Beside scheduling the +// retrieval operations, this struct also deduplicates the requests and caches +// the results to minimize network/database overhead even in complex filtering +// scenarios. +type scheduler struct { + bit uint // Index of the bit in the bloom filter this scheduler is responsible for + responses map[uint64]*response // Currently pending retrieval requests or already cached responses + lock sync.Mutex // Lock protecting the responses from concurrent access +} + +// newScheduler creates a new bloom-filter retrieval scheduler for a specific +// bit index. +func newScheduler(idx uint) *scheduler { + return &scheduler{ + bit: idx, + responses: make(map[uint64]*response), + } +} + +// run creates a retrieval pipeline, receiving section indexes from sections and +// returning the results in the same order through the done channel. Concurrent +// runs of the same scheduler are allowed, leading to retrieval task deduplication. +func (s *scheduler) run(sections chan uint64, dist chan *request, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) { + // Create a forwarder channel between requests and responses of the same size as + // the distribution channel (since that will block the pipeline anyway). + pend := make(chan uint64, cap(dist)) + + // Start the pipeline schedulers to forward between user -> distributor -> user + wg.Add(2) + go s.scheduleRequests(sections, dist, pend, quit, wg) + go s.scheduleDeliveries(pend, done, quit, wg) +} + +// reset cleans up any leftovers from previous runs. This is required before a +// restart to ensure the no previously requested but never delivered state will +// cause a lockup. +func (s *scheduler) reset() { + s.lock.Lock() + defer s.lock.Unlock() + + for section, res := range s.responses { + if res.cached == nil { + delete(s.responses, section) + } + } +} + +// scheduleRequests reads section retrieval requests from the input channel, +// deduplicates the stream and pushes unique retrieval tasks into the distribution +// channel for a database or network layer to honour. +func (s *scheduler) scheduleRequests(reqs chan uint64, dist chan *request, pend chan uint64, quit chan struct{}, wg *sync.WaitGroup) { + // Clean up the goroutine and pipeline when done + defer wg.Done() + defer close(pend) + + // Keep reading and scheduling section requests + for { + select { + case <-quit: + return + + case section, ok := <-reqs: + // New section retrieval requested + if !ok { + return + } + // Deduplicate retrieval requests + unique := false + + s.lock.Lock() + if s.responses[section] == nil { + s.responses[section] = &response{ + done: make(chan struct{}), + } + unique = true + } + s.lock.Unlock() + + // Schedule the section for retrieval and notify the deliverer to expect this section + if unique { + select { + case <-quit: + return + case dist <- &request{bit: s.bit, section: section}: + } + } + select { + case <-quit: + return + case pend <- section: + } + } + } +} + +// scheduleDeliveries reads section acceptance notifications and waits for them +// to be delivered, pushing them into the output data buffer. +func (s *scheduler) scheduleDeliveries(pend chan uint64, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) { + // Clean up the goroutine and pipeline when done + defer wg.Done() + defer close(done) + + // Keep reading notifications and scheduling deliveries + for { + select { + case <-quit: + return + + case idx, ok := <-pend: + // New section retrieval pending + if !ok { + return + } + // Wait until the request is honoured + s.lock.Lock() + res := s.responses[idx] + s.lock.Unlock() + + select { + case <-quit: + return + case <-res.done: + } + // Deliver the result + select { + case <-quit: + return + case done <- res.cached: + } + } + } +} + +// deliver is called by the request distributor when a reply to a request arrives. +func (s *scheduler) deliver(sections []uint64, data [][]byte) { + s.lock.Lock() + defer s.lock.Unlock() + + for i, section := range sections { + if res := s.responses[section]; res != nil && res.cached == nil { // Avoid non-requests and double deliveries + res.cached = data[i] + close(res.done) + } + } +} diff --git a/core/bloombits/scheduler_test.go b/core/bloombits/scheduler_test.go new file mode 100644 index 0000000000..8a159c2370 --- /dev/null +++ b/core/bloombits/scheduler_test.go @@ -0,0 +1,105 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bloombits + +import ( + "bytes" + "math/big" + "math/rand" + "sync" + "sync/atomic" + "testing" + "time" +) + +// Tests that the scheduler can deduplicate and forward retrieval requests to +// underlying fetchers and serve responses back, irrelevant of the concurrency +// of the requesting clients or serving data fetchers. +func TestSchedulerSingleClientSingleFetcher(t *testing.T) { testScheduler(t, 1, 1, 5000) } +func TestSchedulerSingleClientMultiFetcher(t *testing.T) { testScheduler(t, 1, 10, 5000) } +func TestSchedulerMultiClientSingleFetcher(t *testing.T) { testScheduler(t, 10, 1, 5000) } +func TestSchedulerMultiClientMultiFetcher(t *testing.T) { testScheduler(t, 10, 10, 5000) } + +func testScheduler(t *testing.T, clients int, fetchers int, requests int) { + f := newScheduler(0) + + // Create a batch of handler goroutines that respond to bloom bit requests and + // deliver them to the scheduler. + var fetchPend sync.WaitGroup + fetchPend.Add(fetchers) + defer fetchPend.Wait() + + fetch := make(chan *request, 16) + defer close(fetch) + + var delivered uint32 + for i := 0; i < fetchers; i++ { + go func() { + defer fetchPend.Done() + + for req := range fetch { + time.Sleep(time.Duration(rand.Intn(int(100 * time.Microsecond)))) + atomic.AddUint32(&delivered, 1) + + f.deliver([]uint64{ + req.section + uint64(requests), // Non-requested data (ensure it doesn't go out of bounds) + req.section, // Requested data + req.section, // Duplicated data (ensure it doesn't double close anything) + }, [][]byte{ + []byte{}, + new(big.Int).SetUint64(req.section).Bytes(), + new(big.Int).SetUint64(req.section).Bytes(), + }) + } + }() + } + // Start a batch of goroutines to concurrently run scheduling tasks + quit := make(chan struct{}) + + var pend sync.WaitGroup + pend.Add(clients) + + for i := 0; i < clients; i++ { + go func() { + defer pend.Done() + + in := make(chan uint64, 16) + out := make(chan []byte, 16) + + f.run(in, fetch, out, quit, &pend) + + go func() { + for j := 0; j < requests; j++ { + in <- uint64(j) + } + close(in) + }() + + for j := 0; j < requests; j++ { + bits := <-out + if want := new(big.Int).SetUint64(uint64(j)).Bytes(); !bytes.Equal(bits, want) { + t.Errorf("vector %d: delivered content mismatch: have %x, want %x", j, bits, want) + } + } + }() + } + pend.Wait() + + if have := atomic.LoadUint32(&delivered); int(have) != requests { + t.Errorf("request count mismatch: have %v, want %v", have, requests) + } +} diff --git a/core/bloombits/utils.go b/core/bloombits/utils.go deleted file mode 100644 index d0755cb65c..0000000000 --- a/core/bloombits/utils.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package bloombits - -import ( - "github.com/ethereum/go-ethereum/core/types" -) - -const BloomLength = 2048 - -// BloomBitsCreator takes SectionSize number of header bloom filters and calculates the bloomBits vectors of the section -type BloomBitsCreator struct { - blooms [BloomLength][]byte - sectionSize, bitIndex uint64 -} - -func NewBloomBitsCreator(sectionSize uint64) *BloomBitsCreator { - b := &BloomBitsCreator{sectionSize: sectionSize} - for i, _ := range b.blooms { - b.blooms[i] = make([]byte, sectionSize/8) - } - return b -} - -// AddHeaderBloom takes a single bloom filter and sets the corresponding bit column in memory accordingly -func (b *BloomBitsCreator) AddHeaderBloom(bloom types.Bloom) { - if b.bitIndex >= b.sectionSize { - panic("too many header blooms added") - } - - byteIdx := b.bitIndex / 8 - bitMask := byte(1) << byte(7-b.bitIndex%8) - for bloomBitIdx, _ := range b.blooms { - bloomByteIdx := BloomLength/8 - 1 - bloomBitIdx/8 - bloomBitMask := byte(1) << byte(bloomBitIdx%8) - if (bloom[bloomByteIdx] & bloomBitMask) != 0 { - b.blooms[bloomBitIdx][byteIdx] |= bitMask - } - } - b.bitIndex++ -} - -// GetBitVector returns the bit vector belonging to the given bit index after header blooms have been added -func (b *BloomBitsCreator) GetBitVector(idx uint) []byte { - if b.bitIndex != b.sectionSize { - panic("not enough header blooms added") - } - - return b.blooms[idx][:] -} diff --git a/core/chain_indexer.go b/core/chain_indexer.go index 56360b59a3..f4c207dcca 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -36,14 +36,13 @@ import ( type ChainIndexerBackend interface { // Reset initiates the processing of a new chain segment, potentially terminating // any partially completed operations (in case of a reorg). - Reset(section uint64, lastSectionHead common.Hash) + Reset(section uint64) // Process crunches through the next header in the chain segment. The caller // will ensure a sequential order of headers. Process(header *types.Header) - // Commit finalizes the section metadata and stores it into the database. This - // interface will usually be a batch writer. + // Commit finalizes the section metadata and stores it into the database. Commit() error } @@ -101,34 +100,11 @@ func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBacken return c } -// AddKnownSectionHead marks a new section head as known/processed if it is newer -// than the already known best section head -func (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash) { - c.lock.Lock() - defer c.lock.Unlock() - - if section < c.storedSections { - return - } - c.setSectionHead(section, shead) - c.setValidSections(section + 1) -} - -// IndexerChain interface is used for connecting the indexer to a blockchain -type IndexerChain interface { - CurrentHeader() *types.Header - SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription -} - // Start creates a goroutine to feed chain head events into the indexer for // cascading background processing. Children do not need to be started, they // are notified about new events by their parents. -func (c *ChainIndexer) Start(chain IndexerChain) { - ch := make(chan ChainEvent, 10) - sub := chain.SubscribeChainEvent(ch) - currentHeader := chain.CurrentHeader() - - go c.eventLoop(currentHeader, ch, sub) +func (c *ChainIndexer) Start(currentHeader *types.Header, chainEventer func(ch chan<- ChainEvent) event.Subscription) { + go c.eventLoop(currentHeader, chainEventer) } // Close tears down all goroutines belonging to the indexer and returns any error @@ -149,14 +125,12 @@ func (c *ChainIndexer) Close() error { errs = append(errs, err) } } - // Close all children for _, child := range c.children { if err := child.Close(); err != nil { errs = append(errs, err) } } - // Return any failures switch { case len(errs) == 0: @@ -173,10 +147,12 @@ func (c *ChainIndexer) Close() error { // eventLoop is a secondary - optional - event loop of the indexer which is only // started for the outermost indexer to push chain head events into a processing // queue. -func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent, sub event.Subscription) { +func (c *ChainIndexer) eventLoop(currentHeader *types.Header, chainEventer func(ch chan<- ChainEvent) event.Subscription) { // Mark the chain indexer as active, requiring an additional teardown atomic.StoreUint32(&c.active, 1) + events := make(chan ChainEvent, 10) + sub := chainEventer(events) defer sub.Unsubscribe() // Fire the initial new head event to start any outstanding processing @@ -193,7 +169,7 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent errc <- nil return - case ev, ok := <-ch: + case ev, ok := <-events: // Received a new event, ensure it's not nil (closing) and update if !ok { errc := <-c.quit @@ -257,10 +233,9 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // down into the processing backend. func (c *ChainIndexer) updateLoop() { var ( - updated time.Time - updateMsg bool + updating bool + updated time.Time ) - for { select { case errc := <-c.quit: @@ -275,7 +250,7 @@ func (c *ChainIndexer) updateLoop() { // Periodically print an upgrade log message to the user if time.Since(updated) > 8*time.Second { if c.knownSections > c.storedSections+1 { - updateMsg = true + updating = true c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) } updated = time.Now() @@ -284,7 +259,7 @@ func (c *ChainIndexer) updateLoop() { section := c.storedSections var oldHead common.Hash if section > 0 { - oldHead = c.SectionHead(section - 1) + oldHead = c.sectionHead(section - 1) } // Process the newly defined section in the background c.lock.Unlock() @@ -295,11 +270,11 @@ func (c *ChainIndexer) updateLoop() { c.lock.Lock() // If processing succeeded and no reorgs occcurred, mark the section completed - if err == nil && oldHead == c.SectionHead(section-1) { + if err == nil && oldHead == c.sectionHead(section-1) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) - if c.storedSections == c.knownSections && updateMsg { - updateMsg = false + if c.storedSections == c.knownSections && updating { + updating = false c.log.Info("Finished upgrading chain index") } @@ -336,7 +311,7 @@ func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (com c.log.Trace("Processing new chain section", "section", section) // Reset and partial processing - c.backend.Reset(section, lastHead) + c.backend.Reset(section) for number := section * c.sectionSize; number < (section+1)*c.sectionSize; number++ { hash := GetCanonicalHash(c.chainDb, number) @@ -366,7 +341,7 @@ func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { c.lock.Lock() defer c.lock.Unlock() - return c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1) + return c.storedSections, c.storedSections*c.sectionSize - 1, c.sectionHead(c.storedSections - 1) } // AddChildIndexer adds a child ChainIndexer that can use the output of this one @@ -408,7 +383,7 @@ func (c *ChainIndexer) setValidSections(sections uint64) { // sectionHead retrieves the last block hash of a processed section from the // index database. -func (c *ChainIndexer) SectionHead(section uint64) common.Hash { +func (c *ChainIndexer) sectionHead(section uint64) common.Hash { var data [8]byte binary.BigEndian.PutUint64(data[:], section) diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index 247f52cf9e..b761e8a5b2 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -23,7 +23,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" ) @@ -209,7 +208,7 @@ func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { return b.stored * b.indexer.sectionSize } -func (b *testChainIndexBackend) Reset(section uint64, lastSectionHead common.Hash) { +func (b *testChainIndexBackend) Reset(section uint64) { b.section = section b.headerCnt = 0 } diff --git a/core/database_util.go b/core/database_util.go index 179d6f1b2d..989071104e 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -33,21 +33,41 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) +// DatabaseReader wraps the Get method of a backing data store. +type DatabaseReader interface { + Get(key []byte) (value []byte, err error) +} + +// DatabaseWriter wraps the Put method of a backing data store. +type DatabaseWriter interface { + Put(key, value []byte) error +} + +// DatabaseDeleter wraps the Delete method of a backing data store. +type DatabaseDeleter interface { + Delete(key []byte) error +} + var ( headHeaderKey = []byte("LastHeader") headBlockKey = []byte("LastBlock") headFastKey = []byte("LastFast") - headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header - tdSuffix = []byte("t") // headerPrefix + num (uint64 big endian) + hash + tdSuffix -> td - numSuffix = []byte("n") // headerPrefix + num (uint64 big endian) + numSuffix -> hash - blockHashPrefix = []byte("H") // blockHashPrefix + hash -> num (uint64 big endian) - bodyPrefix = []byte("b") // bodyPrefix + num (uint64 big endian) + hash -> block body - blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts - lookupPrefix = []byte("l") // lookupPrefix + hash -> transaction/receipt lookup metadata - preimagePrefix = "secure-key-" // preimagePrefix + hash -> preimage + // Data item prefixes (use single byte to avoid mixing data types, avoid `i`). + headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header + tdSuffix = []byte("t") // headerPrefix + num (uint64 big endian) + hash + tdSuffix -> td + numSuffix = []byte("n") // headerPrefix + num (uint64 big endian) + numSuffix -> hash + blockHashPrefix = []byte("H") // blockHashPrefix + hash -> num (uint64 big endian) + bodyPrefix = []byte("b") // bodyPrefix + num (uint64 big endian) + hash -> block body + blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts + lookupPrefix = []byte("l") // lookupPrefix + hash -> transaction/receipt lookup metadata + bloomBitsPrefix = []byte("B") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits - configPrefix = []byte("ethereum-config-") // config prefix for the db + preimagePrefix = "secure-key-" // preimagePrefix + hash -> preimage + configPrefix = []byte("ethereum-config-") // config prefix for the db + + // Chain index prefixes (use `i` + single byte to avoid mixing data types). + BloomBitsIndexPrefix = []byte("iB") // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress // used by old db, now only used for conversion oldReceiptsPrefix = []byte("receipts-") @@ -57,8 +77,6 @@ var ( preimageCounter = metrics.NewCounter("db/preimage/total") preimageHitCounter = metrics.NewCounter("db/preimage/hits") - - bloomBitsPrefix = []byte("bloomBits-") ) // txLookupEntry is a positional metadata to help looking up the data content of @@ -77,7 +95,7 @@ func encodeBlockNumber(number uint64) []byte { } // GetCanonicalHash retrieves a hash assigned to a canonical block number. -func GetCanonicalHash(db ethdb.Database, number uint64) common.Hash { +func GetCanonicalHash(db DatabaseReader, number uint64) common.Hash { data, _ := db.Get(append(append(headerPrefix, encodeBlockNumber(number)...), numSuffix...)) if len(data) == 0 { return common.Hash{} @@ -91,7 +109,7 @@ const missingNumber = uint64(0xffffffffffffffff) // GetBlockNumber returns the block number assigned to a block hash // if the corresponding header is present in the database -func GetBlockNumber(db ethdb.Database, hash common.Hash) uint64 { +func GetBlockNumber(db DatabaseReader, hash common.Hash) uint64 { data, _ := db.Get(append(blockHashPrefix, hash.Bytes()...)) if len(data) != 8 { return missingNumber @@ -104,7 +122,7 @@ func GetBlockNumber(db ethdb.Database, hash common.Hash) uint64 { // last block hash is only updated upon a full block import, the last header // hash is updated already at header import, allowing head tracking for the // light synchronization mechanism. -func GetHeadHeaderHash(db ethdb.Database) common.Hash { +func GetHeadHeaderHash(db DatabaseReader) common.Hash { data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} @@ -113,7 +131,7 @@ func GetHeadHeaderHash(db ethdb.Database) common.Hash { } // GetHeadBlockHash retrieves the hash of the current canonical head block. -func GetHeadBlockHash(db ethdb.Database) common.Hash { +func GetHeadBlockHash(db DatabaseReader) common.Hash { data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} @@ -125,7 +143,7 @@ func GetHeadBlockHash(db ethdb.Database) common.Hash { // fast synchronization. The difference between this and GetHeadBlockHash is that // whereas the last block hash is only updated upon a full block import, the last // fast hash is updated when importing pre-processed blocks. -func GetHeadFastBlockHash(db ethdb.Database) common.Hash { +func GetHeadFastBlockHash(db DatabaseReader) common.Hash { data, _ := db.Get(headFastKey) if len(data) == 0 { return common.Hash{} @@ -135,14 +153,14 @@ func GetHeadFastBlockHash(db ethdb.Database) common.Hash { // GetHeaderRLP retrieves a block header in its raw RLP database encoding, or nil // if the header's not found. -func GetHeaderRLP(db ethdb.Database, hash common.Hash, number uint64) rlp.RawValue { +func GetHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { data, _ := db.Get(append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) return data } // GetHeader retrieves the block header corresponding to the hash, nil if none // found. -func GetHeader(db ethdb.Database, hash common.Hash, number uint64) *types.Header { +func GetHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Header { data := GetHeaderRLP(db, hash, number) if len(data) == 0 { return nil @@ -156,14 +174,14 @@ func GetHeader(db ethdb.Database, hash common.Hash, number uint64) *types.Header } // GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. -func GetBodyRLP(db ethdb.Database, hash common.Hash, number uint64) rlp.RawValue { +func GetBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { data, _ := db.Get(append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) return data } // GetBody retrieves the block body (transactons, uncles) corresponding to the // hash, nil if none found. -func GetBody(db ethdb.Database, hash common.Hash, number uint64) *types.Body { +func GetBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { data := GetBodyRLP(db, hash, number) if len(data) == 0 { return nil @@ -178,7 +196,7 @@ func GetBody(db ethdb.Database, hash common.Hash, number uint64) *types.Body { // GetTd retrieves a block's total difficulty corresponding to the hash, nil if // none found. -func GetTd(db ethdb.Database, hash common.Hash, number uint64) *big.Int { +func GetTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { data, _ := db.Get(append(append(append(headerPrefix, encodeBlockNumber(number)...), hash[:]...), tdSuffix...)) if len(data) == 0 { return nil @@ -197,7 +215,7 @@ func GetTd(db ethdb.Database, hash common.Hash, number uint64) *big.Int { // // Note, due to concurrent download of header and block body the header and thus // canonical hash can be stored in the database but the body data not (yet). -func GetBlock(db ethdb.Database, hash common.Hash, number uint64) *types.Block { +func GetBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block { // Retrieve the block header and body contents header := GetHeader(db, hash, number) if header == nil { @@ -213,7 +231,7 @@ func GetBlock(db ethdb.Database, hash common.Hash, number uint64) *types.Block { // GetBlockReceipts retrieves the receipts generated by the transactions included // in a block given by its hash. -func GetBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) types.Receipts { +func GetBlockReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Receipts { data, _ := db.Get(append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash[:]...)) if len(data) == 0 { return nil @@ -232,7 +250,7 @@ func GetBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) types. // GetTxLookupEntry retrieves the positional metadata associated with a transaction // hash to allow retrieving the transaction or receipt by hash. -func GetTxLookupEntry(db ethdb.Database, hash common.Hash) (common.Hash, uint64, uint64) { +func GetTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, uint64) { // Load the positional metadata from disk and bail if it fails data, _ := db.Get(append(lookupPrefix, hash.Bytes()...)) if len(data) == 0 { @@ -249,7 +267,7 @@ func GetTxLookupEntry(db ethdb.Database, hash common.Hash) (common.Hash, uint64, // GetTransaction retrieves a specific transaction from the database, along with // its added positional metadata. -func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { +func GetTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { // Retrieve the lookup metadata and resolve the transaction from the body blockHash, blockNumber, txIndex := GetTxLookupEntry(db, hash) @@ -284,7 +302,7 @@ func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, co // GetReceipt retrieves a specific transaction receipt from the database, along with // its added positional metadata. -func GetReceipt(db ethdb.Database, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { +func GetReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { // Retrieve the lookup metadata and resolve the receipt from the receipts blockHash, blockNumber, receiptIndex := GetTxLookupEntry(db, hash) @@ -309,8 +327,20 @@ func GetReceipt(db ethdb.Database, hash common.Hash) (*types.Receipt, common.Has return (*types.Receipt)(&receipt), common.Hash{}, 0, 0 } +// GetBloomBits retrieves the compressed bloom bit vector belonging to the given +// section and bit index from the. +func GetBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) []byte { + key := append(append(bloomBitsPrefix, make([]byte, 10)...), head.Bytes()...) + + binary.BigEndian.PutUint16(key[1:], uint16(bit)) + binary.BigEndian.PutUint64(key[3:], section) + + bits, _ := db.Get(key) + return bits +} + // WriteCanonicalHash stores the canonical hash for the given block number. -func WriteCanonicalHash(db ethdb.Database, hash common.Hash, number uint64) error { +func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) error { key := append(append(headerPrefix, encodeBlockNumber(number)...), numSuffix...) if err := db.Put(key, hash.Bytes()); err != nil { log.Crit("Failed to store number to hash mapping", "err", err) @@ -319,7 +349,7 @@ func WriteCanonicalHash(db ethdb.Database, hash common.Hash, number uint64) erro } // WriteHeadHeaderHash stores the head header's hash. -func WriteHeadHeaderHash(db ethdb.Database, hash common.Hash) error { +func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) error { if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { log.Crit("Failed to store last header's hash", "err", err) } @@ -327,7 +357,7 @@ func WriteHeadHeaderHash(db ethdb.Database, hash common.Hash) error { } // WriteHeadBlockHash stores the head block's hash. -func WriteHeadBlockHash(db ethdb.Database, hash common.Hash) error { +func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) error { if err := db.Put(headBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last block's hash", "err", err) } @@ -335,7 +365,7 @@ func WriteHeadBlockHash(db ethdb.Database, hash common.Hash) error { } // WriteHeadFastBlockHash stores the fast head block's hash. -func WriteHeadFastBlockHash(db ethdb.Database, hash common.Hash) error { +func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) error { if err := db.Put(headFastKey, hash.Bytes()); err != nil { log.Crit("Failed to store last fast block's hash", "err", err) } @@ -343,7 +373,7 @@ func WriteHeadFastBlockHash(db ethdb.Database, hash common.Hash) error { } // WriteHeader serializes a block header into the database. -func WriteHeader(db ethdb.Database, header *types.Header) error { +func WriteHeader(db DatabaseWriter, header *types.Header) error { data, err := rlp.EncodeToBytes(header) if err != nil { return err @@ -363,7 +393,7 @@ func WriteHeader(db ethdb.Database, header *types.Header) error { } // WriteBody serializes the body of a block into the database. -func WriteBody(db ethdb.Database, hash common.Hash, number uint64, body *types.Body) error { +func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) error { data, err := rlp.EncodeToBytes(body) if err != nil { return err @@ -372,7 +402,7 @@ func WriteBody(db ethdb.Database, hash common.Hash, number uint64, body *types.B } // WriteBodyRLP writes a serialized body of a block into the database. -func WriteBodyRLP(db ethdb.Database, hash common.Hash, number uint64, rlp rlp.RawValue) error { +func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) error { key := append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...) if err := db.Put(key, rlp); err != nil { log.Crit("Failed to store block body", "err", err) @@ -381,7 +411,7 @@ func WriteBodyRLP(db ethdb.Database, hash common.Hash, number uint64, rlp rlp.Ra } // WriteTd serializes the total difficulty of a block into the database. -func WriteTd(db ethdb.Database, hash common.Hash, number uint64, td *big.Int) error { +func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) error { data, err := rlp.EncodeToBytes(td) if err != nil { return err @@ -394,7 +424,7 @@ func WriteTd(db ethdb.Database, hash common.Hash, number uint64, td *big.Int) er } // WriteBlock serializes a block into the database, header and body separately. -func WriteBlock(db ethdb.Database, block *types.Block) error { +func WriteBlock(db DatabaseWriter, block *types.Block) error { // Store the body first to retain database consistency if err := WriteBody(db, block.Hash(), block.NumberU64(), block.Body()); err != nil { return err @@ -409,7 +439,7 @@ func WriteBlock(db ethdb.Database, block *types.Block) error { // WriteBlockReceipts stores all the transaction receipts belonging to a block // as a single receipt slice. This is used during chain reorganisations for // rescheduling dropped transactions. -func WriteBlockReceipts(db ethdb.Database, hash common.Hash, number uint64, receipts types.Receipts) error { +func WriteBlockReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) error { // Convert the receipts into their storage form and serialize them storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) for i, receipt := range receipts { @@ -454,29 +484,42 @@ func WriteTxLookupEntries(db ethdb.Database, block *types.Block) error { return nil } +// WriteBloomBits writes the compressed bloom bits vector belonging to the given +// section and bit index. +func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { + key := append(append(bloomBitsPrefix, make([]byte, 10)...), head.Bytes()...) + + binary.BigEndian.PutUint16(key[1:], uint16(bit)) + binary.BigEndian.PutUint64(key[3:], section) + + if err := db.Put(key, bits); err != nil { + log.Crit("Failed to store bloom bits", "err", err) + } +} + // DeleteCanonicalHash removes the number to hash canonical mapping. -func DeleteCanonicalHash(db ethdb.Database, number uint64) { +func DeleteCanonicalHash(db DatabaseDeleter, number uint64) { db.Delete(append(append(headerPrefix, encodeBlockNumber(number)...), numSuffix...)) } // DeleteHeader removes all block header data associated with a hash. -func DeleteHeader(db ethdb.Database, hash common.Hash, number uint64) { +func DeleteHeader(db DatabaseDeleter, hash common.Hash, number uint64) { db.Delete(append(blockHashPrefix, hash.Bytes()...)) db.Delete(append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) } // DeleteBody removes all block body data associated with a hash. -func DeleteBody(db ethdb.Database, hash common.Hash, number uint64) { +func DeleteBody(db DatabaseDeleter, hash common.Hash, number uint64) { db.Delete(append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) } // DeleteTd removes all block total difficulty data associated with a hash. -func DeleteTd(db ethdb.Database, hash common.Hash, number uint64) { +func DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) { db.Delete(append(append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...), tdSuffix...)) } // DeleteBlock removes all block data associated with a hash. -func DeleteBlock(db ethdb.Database, hash common.Hash, number uint64) { +func DeleteBlock(db DatabaseDeleter, hash common.Hash, number uint64) { DeleteBlockReceipts(db, hash, number) DeleteHeader(db, hash, number) DeleteBody(db, hash, number) @@ -484,12 +527,12 @@ func DeleteBlock(db ethdb.Database, hash common.Hash, number uint64) { } // DeleteBlockReceipts removes all receipt data associated with a block hash. -func DeleteBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) { +func DeleteBlockReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { db.Delete(append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) } // DeleteTxLookupEntry removes all transaction data associated with a hash. -func DeleteTxLookupEntry(db ethdb.Database, hash common.Hash) { +func DeleteTxLookupEntry(db DatabaseDeleter, hash common.Hash) { db.Delete(append(lookupPrefix, hash.Bytes()...)) } @@ -521,7 +564,7 @@ func WritePreimages(db ethdb.Database, number uint64, preimages map[common.Hash] } // GetBlockChainVersion reads the version number from db. -func GetBlockChainVersion(db ethdb.Database) int { +func GetBlockChainVersion(db DatabaseReader) int { var vsn uint enc, _ := db.Get([]byte("BlockchainVersion")) rlp.DecodeBytes(enc, &vsn) @@ -529,13 +572,13 @@ func GetBlockChainVersion(db ethdb.Database) int { } // WriteBlockChainVersion writes vsn as the version number to db. -func WriteBlockChainVersion(db ethdb.Database, vsn int) { +func WriteBlockChainVersion(db DatabaseWriter, vsn int) { enc, _ := rlp.EncodeToBytes(uint(vsn)) db.Put([]byte("BlockchainVersion"), enc) } // WriteChainConfig writes the chain config settings to the database. -func WriteChainConfig(db ethdb.Database, hash common.Hash, cfg *params.ChainConfig) error { +func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConfig) error { // short circuit and ignore if nil config. GetChainConfig // will return a default. if cfg == nil { @@ -551,7 +594,7 @@ func WriteChainConfig(db ethdb.Database, hash common.Hash, cfg *params.ChainConf } // GetChainConfig will fetch the network settings based on the given hash. -func GetChainConfig(db ethdb.Database, hash common.Hash) (*params.ChainConfig, error) { +func GetChainConfig(db DatabaseReader, hash common.Hash) (*params.ChainConfig, error) { jsonChainConfig, _ := db.Get(append(configPrefix, hash[:]...)) if len(jsonChainConfig) == 0 { return nil, ErrChainConfigNotFound @@ -566,7 +609,7 @@ func GetChainConfig(db ethdb.Database, hash common.Hash) (*params.ChainConfig, e } // FindCommonAncestor returns the last common ancestor of two block headers -func FindCommonAncestor(db ethdb.Database, a, b *types.Header) *types.Header { +func FindCommonAncestor(db DatabaseReader, a, b *types.Header) *types.Header { for bn := b.Number.Uint64(); a.Number.Uint64() > bn; { a = GetHeader(db, a.ParentHash, a.Number.Uint64()-1) if a == nil { @@ -591,22 +634,3 @@ func FindCommonAncestor(db ethdb.Database, a, b *types.Header) *types.Header { } return a } - -// GetBloomBits reads the compressed bloomBits vector belonging to the given section and bit index from the db -func GetBloomBits(db ethdb.Database, bitIdx, sectionIdx uint64, sectionHead common.Hash) ([]byte, error) { - var encKey [10]byte - binary.BigEndian.PutUint16(encKey[0:2], uint16(bitIdx)) - binary.BigEndian.PutUint64(encKey[2:10], sectionIdx) - key := append(append(bloomBitsPrefix, encKey[:]...), sectionHead.Bytes()...) - bloomBits, err := db.Get(key) - return bloomBits, err -} - -// StoreBloomBits writes the compressed bloomBits vector belonging to the given section and bit index to the db -func StoreBloomBits(db ethdb.Database, bitIdx, sectionIdx uint64, sectionHead common.Hash, bloomBits []byte) { - var encKey [10]byte - binary.BigEndian.PutUint16(encKey[0:2], uint16(bitIdx)) - binary.BigEndian.PutUint64(encKey[2:10], sectionIdx) - key := append(append(bloomBitsPrefix, encKey[:]...), sectionHead.Bytes()...) - db.Put(key, bloomBits) -} diff --git a/core/types/bloom9.go b/core/types/bloom9.go index bdc6e60e79..a76b6f33c5 100644 --- a/core/types/bloom9.go +++ b/core/types/bloom9.go @@ -28,10 +28,16 @@ type bytesBacked interface { Bytes() []byte } -const bloomLength = 256 +const ( + // BloomByteLength represents the number of bytes used in a header log bloom. + BloomByteLength = 256 -// Bloom represents a 256 bit bloom filter. -type Bloom [bloomLength]byte + // BloomBitLength represents the number of bits used in a header log bloom. + BloomBitLength = 8 * BloomByteLength +) + +// Bloom represents a 2048 bit bloom filter. +type Bloom [BloomByteLength]byte // BytesToBloom converts a byte slice to a bloom filter. // It panics if b is not of suitable size. @@ -47,7 +53,7 @@ func (b *Bloom) SetBytes(d []byte) { if len(b) < len(d) { panic(fmt.Sprintf("bloom bytes too big %d %d", len(b), len(d))) } - copy(b[bloomLength-len(d):], d) + copy(b[BloomByteLength-len(d):], d) } // Add adds d to the filter. Future calls of Test(d) will return true. @@ -106,20 +112,6 @@ func LogsBloom(logs []*Log) *big.Int { return bin } -type BloomIndexList [3]uint - -// BloomIndexes returns the bloom filter bit indexes belonging to the given key -func BloomIndexes(b []byte) BloomIndexList { - b = crypto.Keccak256(b[:]) - - var r [3]uint - for i, _ := range r { - r[i] = (uint(b[i+i+1]) + (uint(b[i+i]) << 8)) & 2047 - } - - return r -} - func bloom9(b []byte) *big.Int { b = crypto.Keccak256(b[:]) diff --git a/eth/api_backend.go b/eth/api_backend.go index fa3cf3f805..91f392f94f 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -24,11 +24,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -196,28 +196,13 @@ func (b *EthApiBackend) AccountManager() *accounts.Manager { return b.eth.AccountManager() } -func (b *EthApiBackend) GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) { - results := make([][]byte, len(sectionIdxList)) - var err error - for i, sectionIdx := range sectionIdxList { - sectionHead := core.GetCanonicalHash(b.eth.chainDb, (sectionIdx+1)*bloomBitsSection-1) - results[i], err = core.GetBloomBits(b.eth.chainDb, bitIdx, sectionIdx, sectionHead) - if err != nil { - return nil, err - } - } - return results, nil +func (b *EthApiBackend) BloomStatus() (uint64, uint64) { + sections, _, _ := b.eth.bloomIndexer.Sections() + return params.BloomBitsBlocks, sections } -func (b *EthApiBackend) BloomBitsSections() uint64 { - sections, _, _ := b.eth.bbIndexer.Sections() - return sections -} - -func (b *EthApiBackend) BloomBitsConfig() filters.BloomConfig { - return filters.BloomConfig{ - SectionSize: bloomBitsSection, - MaxRequestLen: 16, - MaxRequestWait: 0, +func (b *EthApiBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) { + for i := 0; i < bloomFilterThreads; i++ { + go session.Multiplex(bloomRetrievalBatch, bloomRetrievalWait, b.eth.bloomRequests) } } diff --git a/eth/backend.go b/eth/backend.go index efc0a2317f..99a1928fec 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/downloader" @@ -77,7 +78,8 @@ type Ethereum struct { engine consensus.Engine accountManager *accounts.Manager - bbIndexer *core.ChainIndexer + bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests + bloomIndexer *core.ChainIndexer // Bloom indexer operating during block imports ApiBackend *EthApiBackend @@ -127,7 +129,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { networkId: config.NetworkId, gasPrice: config.GasPrice, etherbase: config.Etherbase, - bbIndexer: NewBloomBitsProcessor(chainDb, bloomBitsSection), + bloomRequests: make(chan chan *bloombits.Retrieval), + bloomIndexer: NewBloomIndexer(chainDb, params.BloomBitsBlocks), } log.Info("Initialising Ethereum protocol", "versions", ProtocolVersions, "network", config.NetworkId) @@ -151,7 +154,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { eth.blockchain.SetHead(compat.RewindTo) core.WriteChainConfig(chainDb, genesisHash, chainConfig) } - eth.bbIndexer.Start(eth.blockchain) + eth.bloomIndexer.Start(eth.blockchain.CurrentHeader(), eth.blockchain.SubscribeChainEvent) if config.TxPool.Journal != "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) @@ -261,7 +264,7 @@ func (s *Ethereum) APIs() []rpc.API { }, { Namespace: "eth", Version: "1.0", - Service: filters.NewPublicFilterAPI(s.ApiBackend, false, bloomBitsSection), + Service: filters.NewPublicFilterAPI(s.ApiBackend, false), Public: true, }, { Namespace: "admin", @@ -359,14 +362,17 @@ func (s *Ethereum) Downloader() *downloader.Downloader { return s.protocolManage func (s *Ethereum) Protocols() []p2p.Protocol { if s.lesServer == nil { return s.protocolManager.SubProtocols - } else { - return append(s.protocolManager.SubProtocols, s.lesServer.Protocols()...) } + return append(s.protocolManager.SubProtocols, s.lesServer.Protocols()...) } // Start implements node.Service, starting all internal goroutines needed by the // Ethereum protocol implementation. func (s *Ethereum) Start(srvr *p2p.Server) error { + // Start the bloom bits servicing goroutines + s.startBloomHandlers() + + // Start the RPC service s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.NetVersion()) // Figure out a max peers count based on the server limits @@ -377,6 +383,7 @@ func (s *Ethereum) Start(srvr *p2p.Server) error { maxPeers = srvr.MaxPeers / 2 } } + // Start the networking layer and the light server if requested s.protocolManager.Start(maxPeers) if s.lesServer != nil { s.lesServer.Start(srvr) @@ -390,7 +397,7 @@ func (s *Ethereum) Stop() error { if s.stopDbUpgrade != nil { s.stopDbUpgrade() } - s.bbIndexer.Close() + s.bloomIndexer.Close() s.blockchain.Stop() s.protocolManager.Stop() if s.lesServer != nil { diff --git a/eth/bloombits.go b/eth/bloombits.go new file mode 100644 index 0000000000..02de408b0e --- /dev/null +++ b/eth/bloombits.go @@ -0,0 +1,142 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package eth + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" +) + +const ( + // bloomServiceThreads is the number of goroutines used globally by an Ethereum + // instance to service bloombits lookups for all running filters. + bloomServiceThreads = 16 + + // bloomFilterThreads is the number of goroutines used locally per filter to + // multiplex requests onto the global servicing goroutines. + bloomFilterThreads = 3 + + // bloomRetrievalBatch is the maximum number of bloom bit retrievals to service + // in a single batch. + bloomRetrievalBatch = 16 + + // bloomRetrievalWait is the maximum time to wait for enough bloom bit requests + // to accumulate request an entire batch (avoiding hysteresis). + bloomRetrievalWait = time.Duration(0) +) + +// startBloomHandlers starts a batch of goroutines to accept bloom bit database +// retrievals from possibly a range of filters and serving the data to satisfy. +func (eth *Ethereum) startBloomHandlers() { + for i := 0; i < bloomServiceThreads; i++ { + go func() { + for { + select { + case <-eth.shutdownChan: + return + + case request := <-eth.bloomRequests: + task := <-request + + task.Bitsets = make([][]byte, len(task.Sections)) + for i, section := range task.Sections { + head := core.GetCanonicalHash(eth.chainDb, (section+1)*params.BloomBitsBlocks-1) + blob, err := bitutil.DecompressBytes(core.GetBloomBits(eth.chainDb, task.Bit, section, head), int(params.BloomBitsBlocks)/8) + if err != nil { + panic(err) + } + task.Bitsets[i] = blob + } + request <- task + } + } + }() + } +} + +const ( + // bloomConfirms is the number of confirmation blocks before a bloom section is + // considered probably final and its rotated bits are calculated. + bloomConfirms = 256 + + // bloomThrottling is the time to wait between processing two consecutive index + // sections. It's useful during chain upgrades to prevent disk overload. + bloomThrottling = 100 * time.Millisecond +) + +// BloomIndexer implements a core.ChainIndexer, building up a rotated bloom bits index +// for the Ethereum header bloom filters, permitting blazing fast filtering. +type BloomIndexer struct { + size uint64 // section size to generate bloombits for + + db ethdb.Database // database instance to write index data and metadata into + gen *bloombits.Generator // generator to rotate the bloom bits crating the bloom index + + section uint64 // Section is the section number being processed currently + head common.Hash // Head is the hash of the last header processed +} + +// NewBloomIndexer returns a chain indexer that generates bloom bits data for the +// canonical chain for fast logs filtering. +func NewBloomIndexer(db ethdb.Database, size uint64) *core.ChainIndexer { + backend := &BloomIndexer{ + db: db, + size: size, + } + table := ethdb.NewTable(db, string(core.BloomBitsIndexPrefix)) + + return core.NewChainIndexer(db, table, backend, size, bloomConfirms, bloomThrottling, "bloombits") +} + +// Reset implements core.ChainIndexerBackend, starting a new bloombits index +// section. +func (b *BloomIndexer) Reset(section uint64) { + gen, err := bloombits.NewGenerator(uint(b.size)) + if err != nil { + panic(err) + } + b.gen, b.section, b.head = gen, section, common.Hash{} +} + +// Process implements core.ChainIndexerBackend, adding a new header's bloom into +// the index. +func (b *BloomIndexer) Process(header *types.Header) { + b.gen.AddBloom(header.Bloom) + b.head = header.Hash() +} + +// Commit implements core.ChainIndexerBackend, finalizing the bloom section and +// writing it out into the database. +func (b *BloomIndexer) Commit() error { + batch := b.db.NewBatch() + + for i := 0; i < types.BloomBitLength; i++ { + bits, err := b.gen.Bitset(uint(i)) + if err != nil { + return err + } + core.WriteBloomBits(batch, uint(i), b.section, b.head, bitutil.CompressBytes(bits)) + } + return batch.Write() +} diff --git a/eth/db_upgrade.go b/eth/db_upgrade.go index ce8ce699ab..d41afa17c0 100644 --- a/eth/db_upgrade.go +++ b/eth/db_upgrade.go @@ -22,10 +22,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/bloombits" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -136,38 +133,3 @@ func upgradeDeduplicateData(db ethdb.Database) func() error { return <-errc } } - -// BloomBitsIndex implements ChainIndex -type BloomBitsIndex struct { - db ethdb.Database - bc *bloombits.BloomBitsCreator - section, sectionSize uint64 - sectionHead common.Hash -} - -// number of confirmation blocks before a section is considered probably final and its bloom bits are calculated -const bloomBitsConfirmations = 256 - -// NewBloomBitsProcessor returns a chain processor that generates bloom bits data for the canonical chain -func NewBloomBitsProcessor(db ethdb.Database, sectionSize uint64) *core.ChainIndexer { - backend := &BloomBitsIndex{db: db, sectionSize: sectionSize} - return core.NewChainIndexer(db, ethdb.NewTable(db, "bbIndex-"), backend, sectionSize, bloomBitsConfirmations, time.Millisecond*100, "bloombits") -} - -func (b *BloomBitsIndex) Reset(section uint64, lastSectionHead common.Hash) { - b.bc = bloombits.NewBloomBitsCreator(b.sectionSize) - b.section = section -} - -func (b *BloomBitsIndex) Process(header *types.Header) { - b.bc.AddHeaderBloom(header.Bloom) - b.sectionHead = header.Hash() -} - -func (b *BloomBitsIndex) Commit() error { - for i := 0; i < bloombits.BloomLength; i++ { - compVector := bitutil.CompressBytes(b.bc.GetBitVector(uint(i))) - core.StoreBloomBits(b.db, uint64(i), b.section, b.sectionHead, compVector) - } - return nil -} diff --git a/eth/filters/api.go b/eth/filters/api.go index 11767753e3..6e1d48adb6 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -51,27 +51,24 @@ type filter struct { // PublicFilterAPI offers support to create and manage filters. This will allow external clients to retrieve various // information related to the Ethereum protocol such als blocks, transactions and logs. type PublicFilterAPI struct { - backend Backend - bloomBitsSection uint64 - mux *event.TypeMux - quit chan struct{} - chainDb ethdb.Database - events *EventSystem - filtersMu sync.Mutex - filters map[rpc.ID]*filter + backend Backend + mux *event.TypeMux + quit chan struct{} + chainDb ethdb.Database + events *EventSystem + filtersMu sync.Mutex + filters map[rpc.ID]*filter } // NewPublicFilterAPI returns a new PublicFilterAPI instance. -func NewPublicFilterAPI(backend Backend, lightMode bool, bloomBitsSection uint64) *PublicFilterAPI { +func NewPublicFilterAPI(backend Backend, lightMode bool) *PublicFilterAPI { api := &PublicFilterAPI{ - backend: backend, - bloomBitsSection: bloomBitsSection, - mux: backend.EventMux(), - chainDb: backend.ChainDb(), - events: NewEventSystem(backend.EventMux(), backend, lightMode), - filters: make(map[rpc.ID]*filter), + backend: backend, + mux: backend.EventMux(), + chainDb: backend.ChainDb(), + events: NewEventSystem(backend.EventMux(), backend, lightMode), + filters: make(map[rpc.ID]*filter), } - go api.timeoutLoop() return api @@ -326,16 +323,20 @@ func (api *PublicFilterAPI) NewFilter(crit FilterCriteria) (rpc.ID, error) { // // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getlogs func (api *PublicFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([]*types.Log, error) { + // Convert the RPC block numbers into internal representations if crit.FromBlock == nil { crit.FromBlock = big.NewInt(rpc.LatestBlockNumber.Int64()) } if crit.ToBlock == nil { crit.ToBlock = big.NewInt(rpc.LatestBlockNumber.Int64()) } - + // Create and run the filter to get all the logs filter := New(api.backend, crit.FromBlock.Int64(), crit.ToBlock.Int64(), crit.Addresses, crit.Topics) - logs, err := filter.Find(ctx) + logs, err := filter.Logs(ctx) + if err != nil { + return nil, err + } return returnLogs(logs), err } @@ -369,20 +370,18 @@ func (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*ty return nil, fmt.Errorf("filter not found") } - var begin, end int64 + begin := rpc.LatestBlockNumber.Int64() if f.crit.FromBlock != nil { begin = f.crit.FromBlock.Int64() - } else { - begin = rpc.LatestBlockNumber.Int64() } + end := rpc.LatestBlockNumber.Int64() if f.crit.ToBlock != nil { end = f.crit.ToBlock.Int64() - } else { - end = rpc.LatestBlockNumber.Int64() } + // Create and run the filter to get all the logs filter := New(api.backend, begin, end, f.crit.Addresses, f.crit.Topics) - logs, err := filter.Find(ctx) + logs, err := filter.Logs(ctx) if err != nil { return nil, err } @@ -390,7 +389,7 @@ func (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*ty } // GetFilterChanges returns the logs for the filter with the given id since -// last time is was called. This can be used for polling. +// last time it was called. This can be used for polling. // // For pending transaction and block filters the result is []common.Hash. // (pending)Log filters return []Log. diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index 2487bc0eb3..d994378fc1 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -31,82 +31,41 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/node" - "github.com/golang/snappy" ) func BenchmarkBloomBits512(b *testing.B) { - benchmarkBloomBitsForSize(b, 512) + benchmarkBloomBits(b, 512) } func BenchmarkBloomBits1k(b *testing.B) { - benchmarkBloomBitsForSize(b, 1024) + benchmarkBloomBits(b, 1024) } func BenchmarkBloomBits2k(b *testing.B) { - benchmarkBloomBitsForSize(b, 2048) + benchmarkBloomBits(b, 2048) } func BenchmarkBloomBits4k(b *testing.B) { - benchmarkBloomBitsForSize(b, 4096) + benchmarkBloomBits(b, 4096) } func BenchmarkBloomBits8k(b *testing.B) { - benchmarkBloomBitsForSize(b, 8192) + benchmarkBloomBits(b, 8192) } func BenchmarkBloomBits16k(b *testing.B) { - benchmarkBloomBitsForSize(b, 16384) + benchmarkBloomBits(b, 16384) } func BenchmarkBloomBits32k(b *testing.B) { - benchmarkBloomBitsForSize(b, 32768) -} - -func benchmarkBloomBitsForSize(b *testing.B, sectionSize uint64) { - benchmarkBloomBits(b, sectionSize, 0) - benchmarkBloomBits(b, sectionSize, 1) - benchmarkBloomBits(b, sectionSize, 2) + benchmarkBloomBits(b, 32768) } const benchFilterCnt = 2000 -func benchmarkBloomBits(b *testing.B, sectionSize uint64, comp int) { +func benchmarkBloomBits(b *testing.B, sectionSize uint64) { benchDataDir := node.DefaultDataDir() + "/geth/chaindata" - fmt.Println("Running bloombits benchmark section size:", sectionSize, " compression method:", comp) - - var ( - compressFn func([]byte) []byte - decompressFn func([]byte, int) ([]byte, error) - ) - switch comp { - case 0: - // no compression - compressFn = func(data []byte) []byte { - return data - } - decompressFn = func(data []byte, target int) ([]byte, error) { - if len(data) != target { - panic(nil) - } - return data, nil - } - case 1: - // bitutil/compress.go - compressFn = bitutil.CompressBytes - decompressFn = bitutil.DecompressBytes - case 2: - // go snappy - compressFn = func(data []byte) []byte { - return snappy.Encode(nil, data) - } - decompressFn = func(data []byte, target int) ([]byte, error) { - decomp, err := snappy.Decode(nil, data) - if err != nil || len(decomp) != target { - panic(err) - } - return decomp, nil - } - } + fmt.Println("Running bloombits benchmark section size:", sectionSize) db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) if err != nil { @@ -128,7 +87,10 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64, comp int) { cnt := (headNum - 512) / sectionSize var dataSize, compSize uint64 for sectionIdx := uint64(0); sectionIdx < cnt; sectionIdx++ { - bc := bloombits.NewBloomBitsCreator(sectionSize) + bc, err := bloombits.NewGenerator(uint(sectionSize)) + if err != nil { + b.Fatalf("failed to create generator: %v", err) + } var header *types.Header for i := sectionIdx * sectionSize; i < (sectionIdx+1)*sectionSize; i++ { hash := core.GetCanonicalHash(db, i) @@ -136,15 +98,18 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64, comp int) { if header == nil { b.Fatalf("Error creating bloomBits data") } - bc.AddHeaderBloom(header.Bloom) + bc.AddBloom(header.Bloom) } sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*sectionSize-1) - for i := 0; i < bloombits.BloomLength; i++ { - data := bc.GetBitVector(uint(i)) - comp := compressFn(data) + for i := 0; i < types.BloomBitLength; i++ { + data, err := bc.Bitset(uint(i)) + if err != nil { + b.Fatalf("failed to retrieve bitset: %v", err) + } + comp := bitutil.CompressBytes(data) dataSize += uint64(len(data)) compSize += uint64(len(comp)) - core.StoreBloomBits(db, uint64(i), sectionIdx, sectionHead, comp) + core.WriteBloomBits(db, uint(i), sectionIdx, sectionHead, comp) } //if sectionIdx%50 == 0 { // fmt.Println(" section", sectionIdx, "/", cnt) @@ -171,8 +136,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64, comp int) { addr[0] = byte(i) addr[1] = byte(i / 256) filter := New(backend, 0, int64(cnt*sectionSize-1), []common.Address{addr}, nil) - filter.decompress = decompressFn - if _, err := filter.Find(context.Background()); err != nil { + if _, err := filter.Logs(context.Background()); err != nil { b.Error("filter.Find error:", err) } } @@ -229,7 +193,7 @@ func BenchmarkNoBloomBits(b *testing.B) { mux := new(event.TypeMux) backend := &testBackend{mux, db, 0, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} filter := New(backend, 0, int64(headNum), []common.Address{common.Address{}}, nil) - filter.Find(context.Background()) + filter.Logs(context.Background()) d := time.Since(start) fmt.Println("Finished running filter benchmarks") fmt.Println(" ", d, "total ", d*time.Duration(1000000)/time.Duration(headNum+1), "per million blocks") diff --git a/eth/filters/filter.go b/eth/filters/filter.go index ea9ccf2f92..3a2226f6be 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -19,11 +19,9 @@ package filters import ( "context" "math/big" - "sync" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/types" @@ -37,140 +35,143 @@ type Backend interface { EventMux() *event.TypeMux HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) - BloomBitsSections() uint64 - BloomBitsConfig() BloomConfig + SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription - GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) -} -type BloomConfig struct { - SectionSize uint64 - MaxRequestLen int - MaxRequestWait time.Duration + BloomStatus() (uint64, uint64) + ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) } // Filter can be used to retrieve and filter logs. type Filter struct { - backend Backend - bloomBitsConfig BloomConfig + backend Backend db ethdb.Database begin, end int64 addresses []common.Address topics [][]common.Hash - decompress func([]byte, int) ([]byte, error) - matcher *bloombits.Matcher + matcher *bloombits.Matcher } // New creates a new filter which uses a bloom filter on blocks to figure out whether // a particular block is interesting or not. func New(backend Backend, begin, end int64, addresses []common.Address, topics [][]common.Hash) *Filter { + size, _ := backend.BloomStatus() + return &Filter{ - backend: backend, - begin: begin, - end: end, - addresses: addresses, - topics: topics, - bloomBitsConfig: backend.BloomBitsConfig(), - db: backend.ChainDb(), - matcher: bloombits.NewMatcher(backend.BloomBitsConfig().SectionSize, addresses, topics), - decompress: bitutil.DecompressBytes, + backend: backend, + begin: begin, + end: end, + addresses: addresses, + topics: topics, + db: backend.ChainDb(), + matcher: bloombits.NewMatcher(size, addresses, topics), } } -// FindOnce searches the blockchain for matching log entries, returning -// all matching entries from the first block that contains matches, -// updating the start point of the filter accordingly. If no results are -// found, a nil slice is returned. -func (f *Filter) FindOnce(ctx context.Context) ([]*types.Log, error) { - head, _ := f.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber) - if head == nil { +// Logs searches the blockchain for matching log entries, returning all from the +// first block that contains matches, updating the start of the filter accordingly. +func (f *Filter) Logs(ctx context.Context) ([]*types.Log, error) { + // Figure out the limits of the filter range + header, _ := f.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber) + if header == nil { return nil, nil } - headBlockNumber := head.Number.Uint64() + head := header.Number.Uint64() - var beginBlockNo uint64 = uint64(f.begin) if f.begin == -1 { - beginBlockNo = headBlockNumber + f.begin = int64(head) } - var endBlockNo uint64 = uint64(f.end) + end := uint64(f.end) if f.end == -1 { - endBlockNo = headBlockNumber + end = head } - - logs, blockNumber, err := f.getLogs(ctx, beginBlockNo, endBlockNo) - f.begin = int64(blockNumber + 1) + // Gather all indexed logs, and finish with non indexed ones + var ( + logs []*types.Log + err error + ) + size, sections := f.backend.BloomStatus() + if indexed := sections * size; indexed > uint64(f.begin) { + if indexed > end { + logs, err = f.indexedLogs(ctx, end) + } else { + logs, err = f.indexedLogs(ctx, indexed-1) + } + if err != nil { + return logs, err + } + } + rest, err := f.unindexedLogs(ctx, end) + logs = append(logs, rest...) return logs, err } -// Run filters logs with the current parameters set -func (f *Filter) Find(ctx context.Context) (logs []*types.Log, err error) { +// indexedLogs returns the logs matching the filter criteria based on the bloom +// bits indexed available locally or via the network. +func (f *Filter) indexedLogs(ctx context.Context, end uint64) ([]*types.Log, error) { + // Create a matcher session and request servicing from the backend + matches := make(chan uint64, 64) + + session, err := f.matcher.Start(uint64(f.begin), end, matches) + if err != nil { + return nil, err + } + defer session.Close(time.Second) + + f.backend.ServiceFilter(ctx, session) + + // Iterate over the matches until exhausted or context closed + var logs []*types.Log + for { - newLogs, err := f.FindOnce(ctx) - if len(newLogs) == 0 || err != nil { + select { + case number, ok := <-matches: + // Abort if all matches have been fulfilled + if !ok { + f.begin = int64(end) + 1 + return logs, nil + } + // Retrieve the suggested block and pull any truly matching logs + header, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(number)) + if header == nil || err != nil { + return logs, err + } + found, err := f.checkMatches(ctx, header) + if err != nil { + return logs, err + } + logs = append(logs, found...) + + case <-ctx.Done(): + return logs, ctx.Err() + } + } +} + +// indexedLogs returns the logs matching the filter criteria based on raw block +// iteration and bloom matching. +func (f *Filter) unindexedLogs(ctx context.Context, end uint64) ([]*types.Log, error) { + var logs []*types.Log + + for ; f.begin <= int64(end); f.begin++ { + header, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(f.begin)) + if header == nil || err != nil { return logs, err } - logs = append(logs, newLogs...) - } -} - -// nextRequest returns the next request to retrieve for the bloombits matcher -func (f *Filter) nextRequest() (bloombits uint, sections []uint64) { - bloomIndex, ok := f.matcher.AllocSectionQueue() - if !ok { - return 0, nil - } - if f.bloomBitsConfig.MaxRequestWait > 0 && - (f.bloomBitsConfig.MaxRequestLen <= 1 || // SectionCount is always greater than zero after a successful alloc - f.matcher.SectionCount(bloomIndex) < f.bloomBitsConfig.MaxRequestLen) { - time.Sleep(f.bloomBitsConfig.MaxRequestWait) - } - return bloomIndex, f.matcher.FetchSections(bloomIndex, f.bloomBitsConfig.MaxRequestLen) -} - -// serveMatcher serves the bloombits matcher by fetching the requested vectors -// through the filter backend -func (f *Filter) serveMatcher(ctx context.Context, stop chan struct{}, wg *sync.WaitGroup) chan error { - errChn := make(chan error, 1) - wg.Add(10) - for i := 0; i < 10; i++ { - go func(i int) { - defer wg.Done() - - for { - b, s := f.nextRequest() - if s == nil { - return - } - data, err := f.backend.GetBloomBits(ctx, uint64(b), s) - if err != nil { - select { - case errChn <- err: - case <-stop: - } - return - } - decomp := make([][]byte, len(data)) - for i, d := range data { - var err error - if decomp[i], err = f.decompress(d, int(f.bloomBitsConfig.SectionSize/8)); err != nil { - select { - case errChn <- err: - case <-stop: - } - return - } - } - f.matcher.Deliver(b, s, decomp) + if bloomFilter(header.Bloom, f.addresses, f.topics) { + found, err := f.checkMatches(ctx, header) + if err != nil { + return logs, err } - }(i) + logs = append(logs, found...) + } } - - return errChn + return logs, nil } // checkMatches checks if the receipts belonging to the given header contain any log events that @@ -192,83 +193,6 @@ func (f *Filter) checkMatches(ctx context.Context, header *types.Header) (logs [ return nil, nil } -func (f *Filter) getLogs(ctx context.Context, start, end uint64) (logs []*types.Log, blockNumber uint64, err error) { - haveBloomBitsBefore := f.backend.BloomBitsSections() * f.bloomBitsConfig.SectionSize - if haveBloomBitsBefore > start { - e := end - if haveBloomBitsBefore <= e { - e = haveBloomBitsBefore - 1 - } - - stop := make(chan struct{}) - var wg sync.WaitGroup - matches := f.matcher.Start(start, e) - errChn := f.serveMatcher(ctx, stop, &wg) - - defer func() { - f.matcher.Stop() - close(stop) - wg.Wait() - }() - - loop: - for { - select { - case i, ok := <-matches: - if !ok { - break loop - } - - blockNumber := rpc.BlockNumber(i) - header, err := f.backend.HeaderByNumber(ctx, blockNumber) - if header == nil || err != nil { - return logs, end, err - } - - logs, err := f.checkMatches(ctx, header) - if err != nil { - return nil, end, err - } - if logs != nil { - return logs, i, nil - } - case err := <-errChn: - return logs, end, err - case <-ctx.Done(): - return nil, end, ctx.Err() - } - } - - if end < haveBloomBitsBefore { - return logs, end, nil - } - start = haveBloomBitsBefore - } - - // search the rest with regular block-by-block bloom filtering - for i := start; i <= end; i++ { - blockNumber := rpc.BlockNumber(i) - header, err := f.backend.HeaderByNumber(ctx, blockNumber) - if header == nil || err != nil { - return logs, end, err - } - - // Use bloom filtering to see if this block is interesting given the - // current parameters - if f.bloomFilter(header.Bloom) { - logs, err := f.checkMatches(ctx, header) - if err != nil { - return nil, end, err - } - if logs != nil { - return logs, i, nil - } - } - } - - return logs, end, nil -} - func includes(addresses []common.Address, a common.Address) bool { for _, addr := range addresses { if addr == a { @@ -323,10 +247,6 @@ Logs: return ret } -func (f *Filter) bloomFilter(bloom types.Bloom) bool { - return bloomFilter(bloom, f.addresses, f.topics) -} - func bloomFilter(bloom types.Bloom, addresses []common.Address, topics [][]common.Hash) bool { if len(addresses) > 0 { var included bool diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index 140fad555c..664ce07a5f 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -20,12 +20,14 @@ import ( "context" "fmt" "math/big" + "math/rand" "reflect" "testing" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -85,29 +87,35 @@ func (b *testBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subsc return b.chainFeed.Subscribe(ch) } -func (b *testBackend) GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) { - results := make([][]byte, len(sectionIdxList)) - var err error - for i, sectionIdx := range sectionIdxList { - sectionHead := core.GetCanonicalHash(b.db, (sectionIdx+1)*testBloomBitsSection-1) - results[i], err = core.GetBloomBits(b.db, bitIdx, sectionIdx, sectionHead) - if err != nil { - return nil, err +func (b *testBackend) BloomStatus() (uint64, uint64) { + return params.BloomBitsBlocks, b.sections +} + +func (b *testBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) { + requests := make(chan chan *bloombits.Retrieval) + + go session.Multiplex(16, 0, requests) + go func() { + for { + // Wait for a service request or a shutdown + select { + case <-ctx.Done(): + return + + case request := <-requests: + task := <-request + + task.Bitsets = make([][]byte, len(task.Sections)) + for i, section := range task.Sections { + if rand.Int()%4 != 0 { // Handle occasional missing deliveries + head := core.GetCanonicalHash(b.db, (section+1)*params.BloomBitsBlocks-1) + task.Bitsets[i] = core.GetBloomBits(b.db, task.Bit, section, head) + } + } + request <- task + } } - } - return results, nil -} - -func (b *testBackend) BloomBitsSections() uint64 { - return b.sections -} - -func (b *testBackend) BloomBitsConfig() BloomConfig { - return BloomConfig{ - SectionSize: testBloomBitsSection, - MaxRequestLen: 16, - MaxRequestWait: 0, - } + }() } // TestBlockSubscription tests if a block subscription returns block hashes for posted chain events. @@ -126,7 +134,7 @@ func TestBlockSubscription(t *testing.T) { logsFeed = new(event.Feed) chainFeed = new(event.Feed) backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false, 0) + api = NewPublicFilterAPI(backend, false) genesis = new(core.Genesis).MustCommit(db) chain, _ = core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) {}) chainEvents = []core.ChainEvent{} @@ -183,7 +191,7 @@ func TestPendingTxFilter(t *testing.T) { logsFeed = new(event.Feed) chainFeed = new(event.Feed) backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false, 0) + api = NewPublicFilterAPI(backend, false) transactions = []*types.Transaction{ types.NewTransaction(0, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil), @@ -246,7 +254,7 @@ func TestLogFilterCreation(t *testing.T) { logsFeed = new(event.Feed) chainFeed = new(event.Feed) backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false, 0) + api = NewPublicFilterAPI(backend, false) testCases = []struct { crit FilterCriteria @@ -295,7 +303,7 @@ func TestInvalidLogFilterCreation(t *testing.T) { logsFeed = new(event.Feed) chainFeed = new(event.Feed) backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false, 0) + api = NewPublicFilterAPI(backend, false) ) // different situations where log filter creation should fail. @@ -325,7 +333,7 @@ func TestLogFilter(t *testing.T) { logsFeed = new(event.Feed) chainFeed = new(event.Feed) backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false, 0) + api = NewPublicFilterAPI(backend, false) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") @@ -442,7 +450,7 @@ func TestPendingLogsSubscription(t *testing.T) { logsFeed = new(event.Feed) chainFeed = new(event.Feed) backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} - api = NewPublicFilterAPI(backend, false, 0) + api = NewPublicFilterAPI(backend, false) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index f1c6481d7e..11235e95a7 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -32,8 +32,6 @@ import ( "github.com/ethereum/go-ethereum/params" ) -const testBloomBitsSection = 4096 - func makeReceipt(addr common.Address) *types.Receipt { receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ @@ -101,7 +99,7 @@ func BenchmarkFilters(b *testing.B) { filter := New(backend, 0, -1, []common.Address{addr1, addr2, addr3, addr4}, nil) for i := 0; i < b.N; i++ { - logs, _ := filter.Find(context.Background()) + logs, _ := filter.Logs(context.Background()) if len(logs) != 4 { b.Fatal("expected 4 logs, got", len(logs)) } @@ -189,13 +187,13 @@ func TestFilters(t *testing.T) { filter := New(backend, 0, -1, []common.Address{addr}, [][]common.Hash{{hash1, hash2, hash3, hash4}}) - logs, _ := filter.Find(context.Background()) + logs, _ := filter.Logs(context.Background()) if len(logs) != 4 { t.Error("expected 4 log, got", len(logs)) } filter = New(backend, 900, 999, []common.Address{addr}, [][]common.Hash{{hash3}}) - logs, _ = filter.Find(context.Background()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 1 { t.Error("expected 1 log, got", len(logs)) } @@ -204,7 +202,7 @@ func TestFilters(t *testing.T) { } filter = New(backend, 990, -1, []common.Address{addr}, [][]common.Hash{{hash3}}) - logs, _ = filter.Find(context.Background()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 1 { t.Error("expected 1 log, got", len(logs)) } @@ -214,7 +212,7 @@ func TestFilters(t *testing.T) { filter = New(backend, 1, 10, nil, [][]common.Hash{{hash1, hash2}}) - logs, _ = filter.Find(context.Background()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 2 { t.Error("expected 2 log, got", len(logs)) } @@ -222,7 +220,7 @@ func TestFilters(t *testing.T) { failHash := common.BytesToHash([]byte("fail")) filter = New(backend, 0, -1, nil, [][]common.Hash{{failHash}}) - logs, _ = filter.Find(context.Background()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 0 { t.Error("expected 0 log, got", len(logs)) } @@ -230,14 +228,14 @@ func TestFilters(t *testing.T) { failAddr := common.BytesToAddress([]byte("failmenow")) filter = New(backend, 0, -1, []common.Address{failAddr}, nil) - logs, _ = filter.Find(context.Background()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 0 { t.Error("expected 0 log, got", len(logs)) } filter = New(backend, 0, -1, nil, [][]common.Hash{{failHash}, {hash1}}) - logs, _ = filter.Find(context.Background()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 0 { t.Error("expected 0 log, got", len(logs)) } diff --git a/eth/handler.go b/eth/handler.go index aadd771df5..28ae208c06 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -49,8 +49,6 @@ const ( // txChanSize is the size of channel listening to TxPreEvent. // The number is referenced from the size of tx pool. txChanSize = 4096 - - bloomBitsSection = 4096 ) var ( @@ -94,8 +92,6 @@ type ProtocolManager struct { quitSync chan struct{} noMorePeers chan struct{} - lesServer LesServer - // wait group is used for graceful shutdowns during downloading // and processing wg sync.WaitGroup @@ -118,7 +114,6 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne txsyncCh: make(chan *txsync), quitSync: make(chan struct{}), } - // Figure out whether to allow fast sync or not if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 { log.Warn("Blockchain not empty, fast sync disabled") diff --git a/les/api_backend.go b/les/api_backend.go index c2ba270283..0d2d31b673 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -19,17 +19,16 @@ package les import ( "context" "math/big" - "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -174,18 +173,9 @@ func (b *LesApiBackend) AccountManager() *accounts.Manager { return b.eth.accountManager } -func (b *LesApiBackend) GetBloomBits(ctx context.Context, bitIdx uint64, sectionIdxList []uint64) ([][]byte, error) { - return nil, nil // implemented in a subsequent PR +func (b *LesApiBackend) BloomStatus() (uint64, uint64) { + return params.BloomBitsBlocks, 0 } -func (b *LesApiBackend) BloomBitsSections() uint64 { - return 0 -} - -func (b *LesApiBackend) BloomBitsConfig() filters.BloomConfig { - return filters.BloomConfig{ - SectionSize: 32768, - MaxRequestLen: 16, - MaxRequestWait: time.Microsecond * 100, - } +func (b *LesApiBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) { } diff --git a/les/backend.go b/les/backend.go index a3670b5ac7..4c33417c03 100644 --- a/les/backend.go +++ b/les/backend.go @@ -169,7 +169,7 @@ func (s *LightEthereum) APIs() []rpc.API { }, { Namespace: "eth", Version: "1.0", - Service: filters.NewPublicFilterAPI(s.ApiBackend, true, 0), + Service: filters.NewPublicFilterAPI(s.ApiBackend, true), Public: true, }, { Namespace: "net", diff --git a/params/network_params.go b/params/network_params.go new file mode 100644 index 0000000000..536a46d3df --- /dev/null +++ b/params/network_params.go @@ -0,0 +1,26 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package params + +// These are network parameters that need to be constant between clients, but +// aren't necesarilly consensus related. + +const ( + // BloomBitsBlocks is the number of blocks a single bloom bit section vector + // contains. + BloomBitsBlocks uint64 = 4096 +) From 6ff2c02991e60a8db54c2f60027442277fd889c0 Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Wed, 6 Sep 2017 01:43:00 +0200 Subject: [PATCH 137/272] core/bloombits: AddBloom index parameter and fixes variable names --- core/bloombits/generator.go | 13 ++++++++----- core/bloombits/generator_test.go | 2 +- eth/bloombits.go | 2 +- eth/filters/bench_test.go | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/core/bloombits/generator.go b/core/bloombits/generator.go index 04a7f5146c..540085450d 100644 --- a/core/bloombits/generator.go +++ b/core/bloombits/generator.go @@ -49,21 +49,24 @@ func NewGenerator(sections uint) (*Generator, error) { // AddBloom takes a single bloom filter and sets the corresponding bit column // in memory accordingly. -func (b *Generator) AddBloom(bloom types.Bloom) error { +func (b *Generator) AddBloom(index uint, bloom types.Bloom) error { // Make sure we're not adding more bloom filters than our capacity if b.nextBit >= b.sections { return errSectionOutOfBounds } + if b.nextBit != index { + return errors.New("bloom filter with unexpected index") + } // Rotate the bloom and insert into our collection - byteMask := b.nextBit / 8 + byteIndex := b.nextBit / 8 bitMask := byte(1) << byte(7-b.nextBit%8) for i := 0; i < types.BloomBitLength; i++ { - bloomByteMask := types.BloomByteLength - 1 - i/8 + bloomByteIndex := types.BloomByteLength - 1 - i/8 bloomBitMask := byte(1) << byte(i%8) - if (bloom[bloomByteMask] & bloomBitMask) != 0 { - b.blooms[i][byteMask] |= bitMask + if (bloom[bloomByteIndex] & bloomBitMask) != 0 { + b.blooms[i][byteIndex] |= bitMask } } b.nextBit++ diff --git a/core/bloombits/generator_test.go b/core/bloombits/generator_test.go index f4aa9551c2..f9bcef96e0 100644 --- a/core/bloombits/generator_test.go +++ b/core/bloombits/generator_test.go @@ -44,7 +44,7 @@ func TestGenerator(t *testing.T) { t.Fatalf("failed to create bloombit generator: %v", err) } for i, bloom := range input { - if err := gen.AddBloom(bloom); err != nil { + if err := gen.AddBloom(uint(i), bloom); err != nil { t.Fatalf("bloom %d: failed to add: %v", i, err) } } diff --git a/eth/bloombits.go b/eth/bloombits.go index 02de408b0e..32f6c7b318 100644 --- a/eth/bloombits.go +++ b/eth/bloombits.go @@ -122,7 +122,7 @@ func (b *BloomIndexer) Reset(section uint64) { // Process implements core.ChainIndexerBackend, adding a new header's bloom into // the index. func (b *BloomIndexer) Process(header *types.Header) { - b.gen.AddBloom(header.Bloom) + b.gen.AddBloom(uint(header.Number.Uint64()-b.section*b.size), header.Bloom) b.head = header.Hash() } diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index d994378fc1..abbf4593e9 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -98,7 +98,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { if header == nil { b.Fatalf("Error creating bloomBits data") } - bc.AddBloom(header.Bloom) + bc.AddBloom(uint(i-sectionIdx*sectionSize), header.Bloom) } sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*sectionSize-1) for i := 0; i < types.BloomBitLength; i++ { From 451ffdb62b43bab66188f3f7eeb2131b65415ccb Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Wed, 6 Sep 2017 02:33:10 +0200 Subject: [PATCH 138/272] core/bloombits: use general filters instead of addresses and topics --- core/bloombits/matcher.go | 56 +++++++++------------------------- core/bloombits/matcher_test.go | 6 ++-- eth/filters/filter.go | 19 +++++++++++- 3 files changed, 34 insertions(+), 47 deletions(-) diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index e365fd6d04..df0967a124 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -24,7 +24,6 @@ import ( "sync/atomic" "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/crypto" ) @@ -68,8 +67,7 @@ type Retrieval struct { type Matcher struct { sectionSize uint64 // Size of the data batches to filter on - addresses []bloomIndexes // Addresses the system is filtering for - topics [][]bloomIndexes // Topics the system is filtering for + filters [][]bloomIndexes // Filter the system is matching for schedulers map[uint]*scheduler // Retrieval schedulers for loading bloom bits retrievers chan chan uint // Retriever processes waiting for bit allocations @@ -82,7 +80,8 @@ type Matcher struct { // NewMatcher creates a new pipeline for retrieving bloom bit streams and doing // address and topic filtering on them. -func NewMatcher(sectionSize uint64, addresses []common.Address, topics [][]common.Hash) *Matcher { +func NewMatcher(sectionSize uint64, filters [][][]byte) *Matcher { + // Create the matcher instance m := &Matcher{ sectionSize: sectionSize, schedulers: make(map[uint]*scheduler), @@ -91,48 +90,25 @@ func NewMatcher(sectionSize uint64, addresses []common.Address, topics [][]commo retrievals: make(chan chan *Retrieval), deliveries: make(chan *Retrieval), } - m.setAddresses(addresses) - m.setTopics(topics) - return m -} + // Calculate the bloom bit indexes for the groups we're interested in + m.filters = nil -// setAddresses configures the matcher to only return logs that are generated -// from addresses that are included in the given list. -func (m *Matcher) setAddresses(addresses []common.Address) { - // Calculate the bloom bit indexes for the addresses we're interested in - m.addresses = make([]bloomIndexes, len(addresses)) - for i, address := range addresses { - m.addresses[i] = calcBloomIndexes(address.Bytes()) + for _, filter := range filters { + bloomBits := make([]bloomIndexes, len(filter)) + for i, clause := range filter { + bloomBits[i] = calcBloomIndexes(clause) + } + m.filters = append(m.filters, bloomBits) } // For every bit, create a scheduler to load/download the bit vectors - for _, bloomIndexList := range m.addresses { - for _, bloomIndex := range bloomIndexList { - m.addScheduler(bloomIndex) - } - } -} - -// setTopics configures the matcher to only return logs that have topics matching -// the given list. -func (m *Matcher) setTopics(topicsList [][]common.Hash) { - // Calculate the bloom bit indexes for the topics we're interested in - m.topics = nil - - for _, topics := range topicsList { - bloomBits := make([]bloomIndexes, len(topics)) - for i, topic := range topics { - bloomBits[i] = calcBloomIndexes(topic.Bytes()) - } - m.topics = append(m.topics, bloomBits) - } - // For every bit, create a scheduler to load/download the bit vectors - for _, bloomIndexLists := range m.topics { + for _, bloomIndexLists := range m.filters { for _, bloomIndexList := range bloomIndexLists { for _, bloomIndex := range bloomIndexList { m.addScheduler(bloomIndex) } } } + return m } // addScheduler adds a bit stream retrieval scheduler for the given bit index if @@ -250,14 +226,10 @@ func (m *Matcher) run(begin, end uint64, buffer int, session *MatcherSession) ch } }() // Assemble the daisy-chained filtering pipeline - blooms := m.topics - if len(m.addresses) > 0 { - blooms = append([][]bloomIndexes{m.addresses}, blooms...) - } next := source dist := make(chan *request, buffer) - for _, bloom := range blooms { + for _, bloom := range m.filters { next = m.subMatch(next, dist, bloom, session) } // Start the request distribution diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index fc49b43b8f..177e1b792b 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -94,10 +94,8 @@ func testMatcherBothModes(t *testing.T, filter [][]bloomIndexes, blocks uint64, // number of requests made for cross validation between different modes. func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermittent bool, retrievals uint32, maxReqCount int) uint32 { // Create a new matcher an simulate our explicit random bitsets - matcher := NewMatcher(testSectionSize, nil, nil) - - matcher.addresses = filter[0] - matcher.topics = filter[1:] + matcher := NewMatcher(testSectionSize, nil) + matcher.filters = filter for _, rule := range filter { for _, topic := range rule { diff --git a/eth/filters/filter.go b/eth/filters/filter.go index 3a2226f6be..4f6c30058e 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -60,6 +60,23 @@ type Filter struct { // New creates a new filter which uses a bloom filter on blocks to figure out whether // a particular block is interesting or not. func New(backend Backend, begin, end int64, addresses []common.Address, topics [][]common.Hash) *Filter { + // Flatten the address and topic filter clauses into a single filter system + var filters [][][]byte + if len(addresses) > 0 { + filter := make([][]byte, len(addresses)) + for i, address := range addresses { + filter[i] = address.Bytes() + } + filters = append(filters, filter) + } + for _, topicList := range topics { + filter := make([][]byte, len(topicList)) + for i, topic := range topicList { + filter[i] = topic.Bytes() + } + filters = append(filters, filter) + } + // Assemble and return the filter size, _ := backend.BloomStatus() return &Filter{ @@ -69,7 +86,7 @@ func New(backend Backend, begin, end int64, addresses []common.Address, topics [ addresses: addresses, topics: topics, db: backend.ChainDb(), - matcher: bloombits.NewMatcher(size, addresses, topics), + matcher: bloombits.NewMatcher(size, filters), } } From 564c8f3ae6f80d039ef27479e5ad15145f488710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 6 Sep 2017 11:12:53 +0300 Subject: [PATCH 139/272] core/bloombits: drop nil-matcher special case --- core/bloombits/matcher.go | 12 ++---------- core/bloombits/matcher_test.go | 5 +++++ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index df0967a124..f3ed405a61 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -17,6 +17,7 @@ package bloombits import ( + "bytes" "errors" "math" "sort" @@ -171,15 +172,6 @@ func (m *Matcher) Start(begin, end uint64, results chan uint64) (*MatcherSession } // Iterate over all the blocks in the section and return the matching ones for i := first; i <= last; i++ { - // If the bitset is nil, we're a special match-all cornercase - if res.bitset == nil { - select { - case <-session.quit: - return - case results <- i: - } - continue - } // Skip the entire byte if no matches are found inside next := res.bitset[(i-sectionStart)/8] if next == 0 { @@ -221,7 +213,7 @@ func (m *Matcher) run(begin, end uint64, buffer int, session *MatcherSession) ch select { case <-session.quit: return - case source <- &partialMatches{i, nil}: + case source <- &partialMatches{i, bytes.Repeat([]byte{0xff}, int(m.sectionSize/8))}: } } }() diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index 177e1b792b..f0198c4e38 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -51,6 +51,11 @@ func TestMatcherRandom(t *testing.T) { } } +// Tests that matching on everything doesn't crash (special case internally). +func TestWildcardMatcher(t *testing.T) { + testMatcherBothModes(t, nil, 10000, 0) +} + // makeRandomIndexes generates a random filter system, composed on multiple filter // criteria, each having one bloom list component for the address and arbitrarilly // many topic bloom list components. From f30179d62e239521290690ac0688da8648ddebc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 6 Sep 2017 15:02:44 +0300 Subject: [PATCH 140/272] eth: disable fast sync after pivot is committed --- eth/downloader/downloader.go | 3 +-- eth/sync.go | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 6ac58140a3..f2dbf0f88a 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -1170,7 +1170,7 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { // If we're already past the pivot point, this could be an attack, thread carefully if rollback[len(rollback)-1].Number.Uint64() > pivot { - // If we didn't ever fail, lock in te pivot header (must! not! change!) + // If we didn't ever fail, lock in the pivot header (must! not! change!) if atomic.LoadUint32(&d.fsPivotFails) == 0 { for _, header := range rollback { if header.Number.Uint64() == pivot { @@ -1392,7 +1392,6 @@ func (d *Downloader) processFastSyncContent(latest *types.Header) error { stateSync.Cancel() if err := d.commitPivotBlock(P); err != nil { return err - } } if err := d.importBlockResults(afterP); err != nil { diff --git a/eth/sync.go b/eth/sync.go index 7442f912c7..a8ae646170 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -188,7 +188,17 @@ func (pm *ProtocolManager) synchronise(peer *peer) { atomic.StoreUint32(&pm.fastSync, 1) mode = downloader.FastSync } - if err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil { + // Run the sync cycle, and disable fast sync if we've went past the pivot block + err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode) + + if atomic.LoadUint32(&pm.fastSync) == 1 { + // Disable fast sync if we indeed have something in our chain + if pm.blockchain.CurrentBlock().NumberU64() > 0 { + log.Info("Fast sync complete, auto disabling") + atomic.StoreUint32(&pm.fastSync, 0) + } + } + if err != nil { return } atomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done @@ -201,12 +211,4 @@ func (pm *ProtocolManager) synchronise(peer *peer) { // more reliably update peers or the local TD state. go pm.BroadcastBlock(head, false) } - // If fast sync was enabled, and we synced up, disable it - if atomic.LoadUint32(&pm.fastSync) == 1 { - // Disable fast sync if we indeed have something in our chain - if pm.blockchain.CurrentBlock().NumberU64() > 0 { - log.Info("Fast sync complete, auto disabling") - atomic.StoreUint32(&pm.fastSync, 0) - } - } } From 69c8be7c86d5747e9ef2a59ed769d769fd9249f5 Mon Sep 17 00:00:00 2001 From: Pawan Singh Pal Date: Fri, 8 Sep 2017 02:38:06 +0530 Subject: [PATCH 141/272] core: delete dao.go (#15113) - dao.go is already present in consensus/misc - core/dao.go is not used anywhere in the codebase --- core/dao.go | 75 ----------------------------------------------------- 1 file changed, 75 deletions(-) delete mode 100644 core/dao.go diff --git a/core/dao.go b/core/dao.go deleted file mode 100644 index ff42a0e9d3..0000000000 --- a/core/dao.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "bytes" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/params" -) - -// ValidateDAOHeaderExtraData validates the extra-data field of a block header to -// ensure it conforms to DAO hard-fork rules. -// -// DAO hard-fork extension to the header validity: -// a) if the node is no-fork, do not accept blocks in the [fork, fork+10) range -// with the fork specific extra-data set -// b) if the node is pro-fork, require blocks in the specific range to have the -// unique extra-data set. -func ValidateDAOHeaderExtraData(config *params.ChainConfig, header *types.Header) error { - // Short circuit validation if the node doesn't care about the DAO fork - if config.DAOForkBlock == nil { - return nil - } - // Make sure the block is within the fork's modified extra-data range - limit := new(big.Int).Add(config.DAOForkBlock, params.DAOForkExtraRange) - if header.Number.Cmp(config.DAOForkBlock) < 0 || header.Number.Cmp(limit) >= 0 { - return nil - } - // Depending whether we support or oppose the fork, validate the extra-data contents - if config.DAOForkSupport { - if !bytes.Equal(header.Extra, params.DAOForkBlockExtra) { - return fmt.Errorf("DAO pro-fork bad block extra-data: 0x%x", header.Extra) - } - } else { - if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { - return fmt.Errorf("DAO no-fork bad block extra-data: 0x%x", header.Extra) - } - } - // All ok, header has the same extra-data we expect - return nil -} - -// ApplyDAOHardFork modifies the state database according to the DAO hard-fork -// rules, transferring all balances of a set of DAO accounts to a single refund -// contract. -func ApplyDAOHardFork(statedb *state.StateDB) { - // Retrieve the contract to refund balances into - if !statedb.Exist(params.DAORefundContract) { - statedb.CreateAccount(params.DAORefundContract) - } - - // Move every DAO account and extra-balance account funds into the refund contract - for _, addr := range params.DAODrainList() { - statedb.AddBalance(params.DAORefundContract, statedb.GetBalance(addr)) - statedb.SetBalance(addr, new(big.Int)) - } -} From 2dcb22afec1616c3eb8897be96f01b0a5ab185c9 Mon Sep 17 00:00:00 2001 From: Fiisio Date: Fri, 8 Sep 2017 05:10:51 +0800 Subject: [PATCH 142/272] swarm/fuse: use Equal instead of Compare (#15097) --- swarm/fuse/swarmfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swarm/fuse/swarmfs_test.go b/swarm/fuse/swarmfs_test.go index 69f3cc6157..93f1d4c2fd 100644 --- a/swarm/fuse/swarmfs_test.go +++ b/swarm/fuse/swarmfs_test.go @@ -140,7 +140,7 @@ func compareGeneratedFileWithFileInMount(t *testing.T, files map[string]fileInfo if err != nil { t.Fatalf("Could not readfile %v : %v", fname, err) } - if bytes.Compare(fileContents, finfo.contents) != 0 { + if !bytes.Equal(fileContents, finfo.contents) { t.Fatalf("File %v contents mismatch: %v , %v", fname, fileContents, finfo.contents) } From 02b4d074f688293a3443d5ca73c357c1ded22ddb Mon Sep 17 00:00:00 2001 From: Fiisio Date: Fri, 8 Sep 2017 05:11:48 +0800 Subject: [PATCH 143/272] core/asm: use ContainsRune instead of IndexRune (#15098) --- core/asm/lexer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/asm/lexer.go b/core/asm/lexer.go index d784e5d504..a34b2cbd8f 100644 --- a/core/asm/lexer.go +++ b/core/asm/lexer.go @@ -145,7 +145,7 @@ func (l *lexer) ignore() { // Accepts checks whether the given input matches the next rune func (l *lexer) accept(valid string) bool { - if strings.IndexRune(valid, l.next()) >= 0 { + if strings.ContainsRune(valid, l.next()) { return true } @@ -157,7 +157,7 @@ func (l *lexer) accept(valid string) bool { // acceptRun will continue to advance the seeker until valid // can no longer be met. func (l *lexer) acceptRun(valid string) { - for strings.IndexRune(valid, l.next()) >= 0 { + for strings.ContainsRune(valid, l.next()) { } l.backup() } @@ -166,7 +166,7 @@ func (l *lexer) acceptRun(valid string) { // to advance the seeker until the rune has been found. func (l *lexer) acceptRunUntil(until rune) bool { // Continues running until a rune is found - for i := l.next(); strings.IndexRune(string(until), i) == -1; i = l.next() { + for i := l.next(); !strings.ContainsRune(string(until), i); i = l.next() { if i == 0 { return false } From e3db1236de65619d26e87eb7c886e565fcc2eafc Mon Sep 17 00:00:00 2001 From: Benoit Verkindt Date: Thu, 7 Sep 2017 14:14:47 -0700 Subject: [PATCH 144/272] contracts/chequebook: fix race in test (#15058) --- contracts/chequebook/cheque_test.go | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/contracts/chequebook/cheque_test.go b/contracts/chequebook/cheque_test.go index 5f6a54a1c1..b7555d0815 100644 --- a/contracts/chequebook/cheque_test.go +++ b/contracts/chequebook/cheque_test.go @@ -232,8 +232,8 @@ func TestDeposit(t *testing.T) { balance := new(big.Int).SetUint64(42) chbook.Deposit(balance) backend.Commit() - if chbook.balance.Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.balance) + if chbook.Balance().Cmp(balance) != 0 { + t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) } amount := common.Big1 @@ -243,8 +243,8 @@ func TestDeposit(t *testing.T) { } backend.Commit() exp := new(big.Int).SetUint64(41) - if chbook.balance.Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.balance) + if chbook.Balance().Cmp(exp) != 0 { + t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) } // autodeposit on each issue @@ -259,8 +259,8 @@ func TestDeposit(t *testing.T) { t.Fatalf("expected no error, got %v", err) } backend.Commit() - if chbook.balance.Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.balance) + if chbook.Balance().Cmp(balance) != 0 { + t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) } // autodeposit off @@ -277,11 +277,11 @@ func TestDeposit(t *testing.T) { backend.Commit() exp = new(big.Int).SetUint64(40) - if chbook.balance.Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.balance) + if chbook.Balance().Cmp(exp) != 0 { + t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) } - // autodeposit every 10ms if new cheque issued + // autodeposit every 30ms if new cheque issued interval := 30 * time.Millisecond chbook.AutoDeposit(interval, common.Big1, balance) _, err = chbook.Issue(addr1, amount) @@ -296,14 +296,14 @@ func TestDeposit(t *testing.T) { backend.Commit() exp = new(big.Int).SetUint64(38) - if chbook.balance.Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.balance) + if chbook.Balance().Cmp(exp) != 0 { + t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) } time.Sleep(3 * interval) backend.Commit() - if chbook.balance.Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.balance) + if chbook.Balance().Cmp(balance) != 0 { + t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) } exp = new(big.Int).SetUint64(40) @@ -319,8 +319,8 @@ func TestDeposit(t *testing.T) { } time.Sleep(3 * interval) backend.Commit() - if chbook.balance.Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.balance) + if chbook.Balance().Cmp(exp) != 0 { + t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) } _, err = chbook.Issue(addr1, amount) @@ -330,8 +330,8 @@ func TestDeposit(t *testing.T) { time.Sleep(1 * interval) backend.Commit() - if chbook.balance.Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.balance) + if chbook.Balance().Cmp(balance) != 0 { + t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) } chbook.AutoDeposit(1*interval, common.Big0, balance) @@ -352,8 +352,8 @@ func TestDeposit(t *testing.T) { backend.Commit() exp = new(big.Int).SetUint64(39) - if chbook.balance.Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.balance) + if chbook.Balance().Cmp(exp) != 0 { + t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) } } From c1740e454015e61e8207cdeb34c48eee3adbb4d3 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 7 Sep 2017 16:22:27 -0500 Subject: [PATCH 145/272] core/types, miner: avoid tx sender miscaching (#14773) --- core/types/transaction.go | 22 ++++++++++++---------- core/types/transaction_test.go | 2 +- miner/worker.go | 4 ++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/core/types/transaction.go b/core/types/transaction.go index 947fc85d60..7f54860fc0 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -381,28 +381,32 @@ func (s *TxByPrice) Pop() interface{} { // transactions in a profit-maximising sorted order, while supporting removing // entire batches of transactions for non-executable accounts. type TransactionsByPriceAndNonce struct { - txs map[common.Address]Transactions // Per account nonce-sorted list of transactions - heads TxByPrice // Next transaction for each unique account (price heap) + txs map[common.Address]Transactions // Per account nonce-sorted list of transactions + heads TxByPrice // Next transaction for each unique account (price heap) + signer Signer // Signer for the set of transactions } // NewTransactionsByPriceAndNonce creates a transaction set that can retrieve // price sorted transactions in a nonce-honouring way. // // Note, the input map is reowned so the caller should not interact any more with -// if after providng it to the constructor. -func NewTransactionsByPriceAndNonce(txs map[common.Address]Transactions) *TransactionsByPriceAndNonce { +// if after providing it to the constructor. +func NewTransactionsByPriceAndNonce(signer Signer, txs map[common.Address]Transactions) *TransactionsByPriceAndNonce { // Initialize a price based heap with the head transactions heads := make(TxByPrice, 0, len(txs)) - for acc, accTxs := range txs { + for _, accTxs := range txs { heads = append(heads, accTxs[0]) + // Ensure the sender address is from the signer + acc, _ := Sender(signer, accTxs[0]) txs[acc] = accTxs[1:] } heap.Init(&heads) // Assemble and return the transaction set return &TransactionsByPriceAndNonce{ - txs: txs, - heads: heads, + txs: txs, + heads: heads, + signer: signer, } } @@ -416,9 +420,7 @@ func (t *TransactionsByPriceAndNonce) Peek() *Transaction { // Shift replaces the current best head with the next one from the same account. func (t *TransactionsByPriceAndNonce) Shift() { - signer := deriveSigner(t.heads[0].data.V) - // derive signer but don't cache. - acc, _ := Sender(signer, t.heads[0]) // we only sort valid txs so this cannot fail + acc, _ := Sender(t.signer, t.heads[0]) if txs, ok := t.txs[acc]; ok && len(txs) > 0 { t.heads[0], t.txs[acc] = txs[0], txs[1:] heap.Fix(&t.heads, 0) diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index edbe171e6f..df9d7ffd18 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -143,7 +143,7 @@ func TestTransactionPriceNonceSort(t *testing.T) { } } // Sort the transactions and cross check the nonce ordering - txset := NewTransactionsByPriceAndNonce(groups) + txset := NewTransactionsByPriceAndNonce(signer, groups) txs := Transactions{} for { diff --git a/miner/worker.go b/miner/worker.go index e1154ac068..2919d4a485 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -268,7 +268,7 @@ func (self *worker) update() { self.currentMu.Lock() acc, _ := types.Sender(self.current.signer, ev.Tx) txs := map[common.Address]types.Transactions{acc: {ev.Tx}} - txset := types.NewTransactionsByPriceAndNonce(txs) + txset := types.NewTransactionsByPriceAndNonce(self.current.signer, txs) self.current.commitTransactions(self.mux, txset, self.chain, self.coinbase) self.currentMu.Unlock() @@ -471,7 +471,7 @@ func (self *worker) commitNewWork() { log.Error("Failed to fetch pending transactions", "err", err) return } - txs := types.NewTransactionsByPriceAndNonce(pending) + txs := types.NewTransactionsByPriceAndNonce(self.current.signer, pending) work.commitTransactions(self.mux, txs, self.chain, self.coinbase) // compute uncles for the new block. From fc87bc5f523ad78974e0a6ce1c5651b98a1e8a52 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Thu, 7 Sep 2017 23:32:59 +0200 Subject: [PATCH 146/272] common: improve documentation of Hash.SetBytes (#15062) Fixes #15004 --- common/types.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/types.go b/common/types.go index eaf8352fbc..d31bbf741b 100644 --- a/common/types.go +++ b/common/types.go @@ -88,7 +88,7 @@ func (h Hash) MarshalText() ([]byte, error) { return hexutil.Bytes(h[:]).MarshalText() } -// Sets the hash to the value of b. If b is larger than len(h) it will panic +// Sets the hash to the value of b. If b is larger than len(h), 'b' will be cropped (from the left). func (h *Hash) SetBytes(b []byte) { if len(b) > len(h) { b = b[len(b)-HashLength:] @@ -97,7 +97,7 @@ func (h *Hash) SetBytes(b []byte) { copy(h[HashLength-len(b):], b) } -// Set string `s` to h. If s is larger than len(h) it will panic +// Set string `s` to h. If s is larger than len(h) s will be cropped (from left) to fit. func (h *Hash) SetString(s string) { h.SetBytes([]byte(s)) } // Sets h to other From 5ba9225fe3b06d5512976b808bc87d92d03d54ba Mon Sep 17 00:00:00 2001 From: nkbai Date: Fri, 8 Sep 2017 05:34:45 +0800 Subject: [PATCH 147/272] accounts/abi/bind: pass non-empty directory when calling goimports (#15070) --- accounts/abi/bind/bind.go | 2 +- accounts/abi/bind/bind_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 73e95e02a1..f587580884 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -122,7 +122,7 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La } // For Go bindings pass the code through goimports to clean it up and double check if lang == LangGo { - code, err := imports.Process("", buffer.Bytes(), nil) + code, err := imports.Process(".", buffer.Bytes(), nil) if err != nil { return "", fmt.Errorf("%v\n%s", err, buffer) } diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 8ea3eca415..43ed53b922 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -459,7 +459,7 @@ func TestBindings(t *testing.T) { } // Skip the test if the go-ethereum sources are symlinked (https://github.com/golang/go/issues/14845) linkTestCode := fmt.Sprintf("package linktest\nfunc CheckSymlinks(){\nfmt.Println(backends.NewSimulatedBackend(nil))\n}") - linkTestDeps, err := imports.Process("", []byte(linkTestCode), nil) + linkTestDeps, err := imports.Process(os.TempDir(), []byte(linkTestCode), nil) if err != nil { t.Fatalf("failed check for goimports symlink bug: %v", err) } From d6681ed36037c48bc95c7940e9914b9369e35170 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Fri, 8 Sep 2017 12:47:44 +0200 Subject: [PATCH 148/272] core/vm: Rename + updated doc on jumpdest analysis --- core/vm/analysis.go | 8 ++++---- core/vm/analysis_test.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/vm/analysis.go b/core/vm/analysis.go index 08415fc1ef..e6a2df7b02 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -38,7 +38,7 @@ func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool m, analysed := d[codehash] if !analysed { - m = jumpdests(code) + m = codeBitmap(code) d[codehash] = m } return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) @@ -61,9 +61,9 @@ func (bits *bitvec) codeSegment(pos uint64) bool { return ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0 } -// jumpdests creates a map that contains an entry for each -// PC location that is a JUMPDEST instruction. -func jumpdests(code []byte) []byte { +// jumpdests creates a bitmap of the code, where 1 represents a DATA-segment, +// and 0 represents code-segment +func codeBitmap(code []byte) []byte { //The map is 4 bytes longer than necessary, in case the code // ends with a PUSH32, the algorithm will push zeroes onto the // bitvector outside the bounds of the actual code. diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go index 17c578e95e..3d4e709db4 100644 --- a/core/vm/analysis_test.go +++ b/core/vm/analysis_test.go @@ -28,7 +28,7 @@ func TestJumpDestAnalysis(t *testing.T) { {[]byte{byte(PUSH32)}, 0xFF, 2}, } for _, test := range tests { - ret := jumpdests(test.code) + ret := codeBitmap(test.code) if ret[test.which] != test.exp { t.Fatalf("expected %x, got %02x", test.exp, ret[test.which]) } From ac193e36ce4bce752717124433a8ce84c347dbf7 Mon Sep 17 00:00:00 2001 From: holisticode Date: Fri, 8 Sep 2017 13:29:09 -0500 Subject: [PATCH 149/272] swarm/api/http: add error pages (#14967) --- swarm/api/api.go | 1 + swarm/api/http/error.go | 116 +++++++++ swarm/api/http/error_templates.go | 376 ++++++++++++++++++++++++++++++ swarm/api/http/error_test.go | 143 ++++++++++++ swarm/api/http/server.go | 37 +-- swarm/api/http/server_test.go | 9 +- 6 files changed, 662 insertions(+), 20 deletions(-) create mode 100644 swarm/api/http/error.go create mode 100644 swarm/api/http/error_templates.go create mode 100644 swarm/api/http/error_test.go diff --git a/swarm/api/api.go b/swarm/api/api.go index 7d185ab3ca..a5941fb5cd 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -132,6 +132,7 @@ func (self *Api) Put(content, contentType string) (storage.Key, error) { func (self *Api) Get(key storage.Key, path string) (reader storage.LazySectionReader, mimeType string, status int, err error) { trie, err := loadManifest(self.dpa, key, nil) if err != nil { + status = http.StatusNotFound log.Warn(fmt.Sprintf("loadManifestTrie error: %v", err)) return } diff --git a/swarm/api/http/error.go b/swarm/api/http/error.go new file mode 100644 index 0000000000..ebb5e3ebe2 --- /dev/null +++ b/swarm/api/http/error.go @@ -0,0 +1,116 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +/* +Show nicely (but simple) formatted HTML error pages (or respond with JSON +if the appropriate `Accept` header is set)) for the http package. +*/ +package http + +import ( + "encoding/json" + "fmt" + "html/template" + "net/http" + "time" + + "github.com/ethereum/go-ethereum/log" +) + +//templateMap holds a mapping of an HTTP error code to a template +var templateMap map[int]*template.Template + +//parameters needed for formatting the correct HTML page +type ErrorParams struct { + Msg string + Code int + Timestamp string + template *template.Template + Details template.HTML +} + +//we init the error handling right on boot time, so lookup and http response is fast +func init() { + initErrHandling() +} + +func initErrHandling() { + //pages are saved as strings - get these strings + genErrPage := GetGenericErrorPage() + notFoundPage := GetNotFoundErrorPage() + //map the codes to the available pages + tnames := map[int]string{ + 0: genErrPage, //default + 400: genErrPage, + 404: notFoundPage, + 500: genErrPage, + } + templateMap = make(map[int]*template.Template) + for code, tname := range tnames { + //assign formatted HTML to the code + templateMap[code] = template.Must(template.New(fmt.Sprintf("%d", code)).Parse(tname)) + } +} + +//ShowError is used to show an HTML error page to a client. +//If there is an `Accept` header of `application/json`, JSON will be returned instead +//The function just takes a string message which will be displayed in the error page. +//The code is used to evaluate which template will be displayed +//(and return the correct HTTP status code) +func ShowError(w http.ResponseWriter, r *http.Request, msg string, code int) { + if code == http.StatusInternalServerError { + log.Error(msg) + } + respond(w, r, &ErrorParams{ + Code: code, + Msg: msg, + Timestamp: time.Now().Format(time.RFC1123), + template: getTemplate(code), + }) +} + +//evaluate if client accepts html or json response +func respond(w http.ResponseWriter, r *http.Request, params *ErrorParams) { + w.WriteHeader(params.Code) + if r.Header.Get("Accept") == "application/json" { + respondJson(w, params) + } else { + respondHtml(w, params) + } +} + +//return a HTML page +func respondHtml(w http.ResponseWriter, params *ErrorParams) { + err := params.template.Execute(w, params) + if err != nil { + log.Error(err.Error()) + } +} + +//return JSON +func respondJson(w http.ResponseWriter, params *ErrorParams) { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(params) +} + +//get the HTML template for a given code +func getTemplate(code int) *template.Template { + if val, tmpl := templateMap[code]; tmpl { + return val + } else { + return templateMap[0] + } +} diff --git a/swarm/api/http/error_templates.go b/swarm/api/http/error_templates.go new file mode 100644 index 0000000000..29bd3bfbb1 --- /dev/null +++ b/swarm/api/http/error_templates.go @@ -0,0 +1,376 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +/* +We use html templates to handle simple but as informative as possible error pages. + +To eliminate circular dependency in case of an error, we don't store error pages on swarm. +We can't save the error pages as html files on disk, or when deploying compiled binaries +they won't be found. + +For this reason we resort to save the HTML error pages as strings, which then can be +parsed by Go's html/template package +*/ +package http + +//This returns the HTML for generic errors +func GetGenericErrorPage() string { + page := ` + + + + + + + + + + + + Swarm::HTTP Error Page + + + + +
+ +
+
+ +
+
+

There was a problem serving the requested page

+
+
+
{{.Timestamp}}
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ Hmmmmm....Swarm was not able to serve your request! +
+ Error message: +
+ {{.Msg}} +
+ Error code: +
+ {{.Code}} +
+
+
+ +
+

+ Swarm: Serverless Hosting Incentivised Peer-To-Peer Storage And Content Distribution
+ Swarm +

+
+ + +
+ + + +` + return page +} + +//This returns the HTML for a 404 Not Found error +func GetNotFoundErrorPage() string { + page := ` + + + + + + + + + + + + Swarm::404 HTTP Not Found + + + + +
+ +
+
+ +
+
+

Resource Not Found

+
+
+
{{.Timestamp}}
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ Unfortunately, the resource you were trying to access could not be found on swarm. +
+
+ {{.Msg}} +
+ Error code: +
+ {{.Code}} +
+
+
+ +
+

+ Swarm: Serverless Hosting Incentivised Peer-To-Peer Storage And Content Distribution
+ Swarm +

+
+ + +
+ + + +` + return page +} diff --git a/swarm/api/http/error_test.go b/swarm/api/http/error_test.go new file mode 100644 index 0000000000..465fbf4cad --- /dev/null +++ b/swarm/api/http/error_test.go @@ -0,0 +1,143 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package http_test + +import ( + "encoding/json" + "golang.org/x/net/html" + "io/ioutil" + "net/http" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/swarm/testutil" +) + +func TestError(t *testing.T) { + + srv := testutil.NewTestSwarmServer(t) + defer srv.Close() + + var resp *http.Response + var respbody []byte + + url := srv.URL + "/this_should_fail_as_no_bzz_protocol_present" + resp, err := http.Get(url) + + if err != nil { + t.Fatalf("Request failed: %v", err) + } + defer resp.Body.Close() + respbody, err = ioutil.ReadAll(resp.Body) + + if resp.StatusCode != 400 && !strings.Contains(string(respbody), "Invalid URI "/this_should_fail_as_no_bzz_protocol_present": unknown scheme") { + t.Fatalf("Response body does not match, expected: %v, to contain: %v; received code %d, expected code: %d", string(respbody), "Invalid bzz URI: unknown scheme", 400, resp.StatusCode) + } + + _, err = html.Parse(strings.NewReader(string(respbody))) + if err != nil { + t.Fatalf("HTML validation failed for error page returned!") + } +} + +func Test404Page(t *testing.T) { + srv := testutil.NewTestSwarmServer(t) + defer srv.Close() + + var resp *http.Response + var respbody []byte + + url := srv.URL + "/bzz:/1234567890123456789012345678901234567890123456789012345678901234" + resp, err := http.Get(url) + + if err != nil { + t.Fatalf("Request failed: %v", err) + } + defer resp.Body.Close() + respbody, err = ioutil.ReadAll(resp.Body) + + if resp.StatusCode != 404 || !strings.Contains(string(respbody), "404") { + t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode) + } + + _, err = html.Parse(strings.NewReader(string(respbody))) + if err != nil { + t.Fatalf("HTML validation failed for error page returned!") + } +} + +func Test500Page(t *testing.T) { + srv := testutil.NewTestSwarmServer(t) + defer srv.Close() + + var resp *http.Response + var respbody []byte + + url := srv.URL + "/bzz:/thisShouldFailWith500Code" + resp, err := http.Get(url) + + if err != nil { + t.Fatalf("Request failed: %v", err) + } + defer resp.Body.Close() + respbody, err = ioutil.ReadAll(resp.Body) + + if resp.StatusCode != 500 || !strings.Contains(string(respbody), "500") { + t.Fatalf("Invalid Status Code received, expected 500, got %d", resp.StatusCode) + } + + _, err = html.Parse(strings.NewReader(string(respbody))) + if err != nil { + t.Fatalf("HTML validation failed for error page returned!") + } +} + +func TestJsonResponse(t *testing.T) { + srv := testutil.NewTestSwarmServer(t) + defer srv.Close() + + var resp *http.Response + var respbody []byte + + url := srv.URL + "/bzz:/thisShouldFailWith500Code/" + req, err := http.NewRequest("GET", url, nil) + if err != nil { + t.Fatalf("Request failed: %v", err) + } + req.Header.Set("Accept", "application/json") + resp, err = http.DefaultClient.Do(req) + if err != nil { + t.Fatalf("Request failed: %v", err) + } + + defer resp.Body.Close() + respbody, err = ioutil.ReadAll(resp.Body) + + if resp.StatusCode != 500 { + t.Fatalf("Invalid Status Code received, expected 500, got %d", resp.StatusCode) + } + + if !isJSON(string(respbody)) { + t.Fatalf("Expected repsonse to be JSON, received invalid JSON: %s", string(respbody)) + } + +} + +func isJSON(s string) bool { + var js map[string]interface{} + return json.Unmarshal([]byte(s), &js) == nil +} diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index 0b4ec7e18e..a637b87351 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -332,7 +332,7 @@ func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) { return api.SkipManifest }) if entry == nil { - http.NotFound(w, &r.Request) + s.NotFound(w, r, fmt.Errorf("Manifest entry could not be loaded")) return } key = storage.Key(common.Hex2Bytes(entry.Hash)) @@ -341,8 +341,7 @@ func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) { // check the root chunk exists by retrieving the file's size reader := s.api.Retrieve(key) if _, err := reader.Size(nil); err != nil { - s.logDebug("key not found %s: %s", key, err) - http.NotFound(w, &r.Request) + s.NotFound(w, r, fmt.Errorf("Root chunk not found %s: %s", key, err)) return } @@ -534,16 +533,20 @@ func (s *Server) HandleGetFile(w http.ResponseWriter, r *Request) { return } - reader, contentType, _, err := s.api.Get(key, r.uri.Path) + reader, contentType, status, err := s.api.Get(key, r.uri.Path) if err != nil { - s.Error(w, r, err) + switch status { + case http.StatusNotFound: + s.NotFound(w, r, err) + default: + s.Error(w, r, err) + } return } // check the root chunk exists by retrieving the file's size if _, err := reader.Size(nil); err != nil { - s.logDebug("file not found %s: %s", r.uri, err) - http.NotFound(w, &r.Request) + s.NotFound(w, r, fmt.Errorf("File not found %s: %s", r.uri, err)) return } @@ -556,14 +559,14 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.logDebug("HTTP %s request URL: '%s', Host: '%s', Path: '%s', Referer: '%s', Accept: '%s'", r.Method, r.RequestURI, r.URL.Host, r.URL.Path, r.Referer(), r.Header.Get("Accept")) uri, err := api.Parse(strings.TrimLeft(r.URL.Path, "/")) + req := &Request{Request: *r, uri: uri} if err != nil { s.logError("Invalid URI %q: %s", r.URL.Path, err) - http.Error(w, fmt.Sprintf("Invalid bzz URI: %s", err), http.StatusBadRequest) + s.BadRequest(w, req, fmt.Sprintf("Invalid URI %q: %s", r.URL.Path, err)) return } s.logDebug("%s request received for %s", r.Method, uri) - req := &Request{Request: *r, uri: uri} switch r.Method { case "POST": if uri.Raw() { @@ -579,7 +582,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // strictly a traditional PUT request which replaces content // at a URI, and POST is more ubiquitous) if uri.Raw() { - http.Error(w, fmt.Sprintf("No PUT to %s allowed.", uri), http.StatusBadRequest) + ShowError(w, r, fmt.Sprintf("No PUT to %s allowed.", uri), http.StatusBadRequest) return } else { s.HandlePostFiles(w, req) @@ -587,7 +590,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { case "DELETE": if uri.Raw() { - http.Error(w, fmt.Sprintf("No DELETE to %s allowed.", uri), http.StatusBadRequest) + ShowError(w, r, fmt.Sprintf("No DELETE to %s allowed.", uri), http.StatusBadRequest) return } s.HandleDelete(w, req) @@ -611,7 +614,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.HandleGetFile(w, req) default: - http.Error(w, "Method "+r.Method+" is not supported.", http.StatusMethodNotAllowed) + ShowError(w, r, fmt.Sprintf("Method "+r.Method+" is not supported.", uri), http.StatusMethodNotAllowed) } } @@ -643,11 +646,13 @@ func (s *Server) logError(format string, v ...interface{}) { } func (s *Server) BadRequest(w http.ResponseWriter, r *Request, reason string) { - s.logDebug("bad request %s %s: %s", r.Method, r.uri, reason) - http.Error(w, reason, http.StatusBadRequest) + ShowError(w, &r.Request, fmt.Sprintf("Bad request %s %s: %s", r.Method, r.uri, reason), http.StatusBadRequest) } func (s *Server) Error(w http.ResponseWriter, r *Request, err error) { - s.logError("error serving %s %s: %s", r.Method, r.uri, err) - http.Error(w, err.Error(), http.StatusInternalServerError) + ShowError(w, &r.Request, fmt.Sprintf("Error serving %s %s: %s", r.Method, r.uri, err), http.StatusInternalServerError) +} + +func (s *Server) NotFound(w http.ResponseWriter, r *Request, err error) { + ShowError(w, &r.Request, fmt.Sprintf("NOT FOUND error serving %s %s: %s", r.Method, r.uri, err), http.StatusNotFound) } diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index d3374594b6..ffeaf6e0d8 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -22,6 +22,7 @@ import ( "fmt" "io/ioutil" "net/http" + "strings" "sync" "testing" @@ -110,9 +111,9 @@ func TestBzzrGetPath(t *testing.T) { } nonhashresponses := []string{ - "error resolving name: no DNS to resolve name: \"name\"\n", - "error resolving nonhash: immutable address not a content hash: \"nonhash\"\n", - "error resolving nonhash: no DNS to resolve name: \"nonhash\"\n", + "error resolving name: no DNS to resolve name: "name"", + "error resolving nonhash: immutable address not a content hash: "nonhash"", + "error resolving nonhash: no DNS to resolve name: "nonhash"", } for i, url := range nonhashtests { @@ -129,7 +130,7 @@ func TestBzzrGetPath(t *testing.T) { if err != nil { t.Fatalf("ReadAll failed: %v", err) } - if string(respbody) != nonhashresponses[i] { + if !strings.Contains(string(respbody), nonhashresponses[i]) { t.Fatalf("Non-Hash response body does not match, expected: %v, got: %v", nonhashresponses[i], string(respbody)) } } From 10181b57a9fb648f5fd424ca611820a3cf42c42b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 9 Sep 2017 18:03:07 +0200 Subject: [PATCH 150/272] core, eth/downloader: commit block data using batches (#15115) * ethdb: add Putter interface and Has method * ethdb: improve docs and add IdealBatchSize * ethdb: remove memory batch lock Batches are not safe for concurrent use. * core: use ethdb.Putter for Write* functions This covers the easy cases. * core/state: simplify StateSync * trie: optimize local node check * ethdb: add ValueSize to Batch * core: optimize HasHeader check This avoids one random database read get the block number. For many uses of HasHeader, the expectation is that it's actually there. Using Has avoids a load + decode of the value. * core: write fast sync block data in batches Collect writes into batches up to the ideal size instead of issuing many small, concurrent writes. * eth/downloader: commit larger state batches Collect nodes into a batch up to the ideal size instead of committing whenever a node is received. * core: optimize HasBlock check This avoids a random database read to get the number. * core: use numberCache in HasHeader numberCache has higher capacity, increasing the odds of finding the header without a database lookup. * core: write imported block data using a batch Restore batch writes of state and add blocks, tx entries, receipts to the same batch. The change also simplifies the miner. This commit also removes posting of logs when a forked block is imported. * core: fix DB write error handling * ethdb: use RLock for Has * core: fix HasBlock comment --- cmd/utils/cmd.go | 2 +- core/blockchain.go | 224 +++++++++++++----------------- core/database_util.go | 53 ++++--- core/headerchain.go | 13 +- core/state/sync.go | 42 +----- eth/api.go | 2 +- eth/downloader/downloader.go | 8 +- eth/downloader/downloader_test.go | 2 +- eth/downloader/statesync.go | 77 +++++----- eth/handler.go | 4 +- ethdb/database.go | 24 +++- ethdb/interface.go | 18 ++- ethdb/memory_database.go | 21 ++- les/handler.go | 2 +- light/lightchain.go | 8 +- miner/worker.go | 21 +-- trie/sync.go | 5 +- trie/trie.go | 1 + 18 files changed, 247 insertions(+), 280 deletions(-) diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 17c258c6c8..23b10c2d74 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -164,7 +164,7 @@ func ImportChain(chain *core.BlockChain, fn string) error { func hasAllBlocks(chain *core.BlockChain, bs []*types.Block) bool { for _, b := range bs { - if !chain.HasBlock(b.Hash()) { + if !chain.HasBlock(b.Hash(), b.NumberU64()) { return false } } diff --git a/core/blockchain.go b/core/blockchain.go index d74b3520b1..25be8d762a 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -23,7 +23,6 @@ import ( "io" "math/big" mrand "math/rand" - "runtime" "sync" "sync/atomic" "time" @@ -515,10 +514,13 @@ func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue { return body } -// HasBlock checks if a block is fully present in the database or not, caching -// it if present. -func (bc *BlockChain) HasBlock(hash common.Hash) bool { - return bc.GetBlockByHash(hash) != nil +// HasBlock checks if a block is fully present in the database or not. +func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool { + if bc.blockCache.Contains(hash) { + return true + } + ok, _ := bc.chainDb.Has(blockBodyKey(hash, number)) + return ok } // HasBlockAndState checks if a block and associated state trie is fully present @@ -693,108 +695,73 @@ func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts ty // InsertReceiptChain attempts to complete an already existing header chain with // transaction and receipt data. -// XXX should this be moved to the test? func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { + bc.wg.Add(1) + defer bc.wg.Done() + // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(blockChain); i++ { if blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() { - // Chain broke ancestry, log a messge (programming error) and skip insertion log.Error("Non contiguous receipt insert", "number", blockChain[i].Number(), "hash", blockChain[i].Hash(), "parent", blockChain[i].ParentHash(), "prevnumber", blockChain[i-1].Number(), "prevhash", blockChain[i-1].Hash()) - return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, blockChain[i-1].NumberU64(), blockChain[i-1].Hash().Bytes()[:4], i, blockChain[i].NumberU64(), blockChain[i].Hash().Bytes()[:4], blockChain[i].ParentHash().Bytes()[:4]) } } - // Pre-checks passed, start the block body and receipt imports - bc.wg.Add(1) - defer bc.wg.Done() - // Collect some import statistics to report on - stats := struct{ processed, ignored int32 }{} - start := time.Now() + var ( + stats = struct{ processed, ignored int32 }{} + start = time.Now() + bytes = 0 + batch = bc.chainDb.NewBatch() + ) + for i, block := range blockChain { + receipts := receiptChain[i] + // Short circuit insertion if shutting down or processing failed + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + return 0, nil + } + // Short circuit if the owner header is unknown + if !bc.HasHeader(block.Hash(), block.NumberU64()) { + return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) + } + // Skip if the entire data is already known + if bc.HasBlock(block.Hash(), block.NumberU64()) { + stats.ignored++ + continue + } + // Compute all the non-consensus fields of the receipts + SetReceiptsData(bc.config, block, receipts) + // Write all the data out into the database + if err := WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()); err != nil { + return i, fmt.Errorf("failed to write block body: %v", err) + } + if err := WriteBlockReceipts(batch, block.Hash(), block.NumberU64(), receipts); err != nil { + return i, fmt.Errorf("failed to write block receipts: %v", err) + } + if err := WriteTxLookupEntries(batch, block); err != nil { + return i, fmt.Errorf("failed to write lookup metadata: %v", err) + } + stats.processed++ - // Create the block importing task queue and worker functions - tasks := make(chan int, len(blockChain)) - for i := 0; i < len(blockChain) && i < len(receiptChain); i++ { - tasks <- i - } - close(tasks) - - errs, failed := make([]error, len(tasks)), int32(0) - process := func(worker int) { - for index := range tasks { - block, receipts := blockChain[index], receiptChain[index] - - // Short circuit insertion if shutting down or processing failed - if atomic.LoadInt32(&bc.procInterrupt) == 1 { - return + if batch.ValueSize() >= ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + return 0, err } - if atomic.LoadInt32(&failed) > 0 { - return - } - // Short circuit if the owner header is unknown - if !bc.HasHeader(block.Hash()) { - errs[index] = fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) - atomic.AddInt32(&failed, 1) - return - } - // Skip if the entire data is already known - if bc.HasBlock(block.Hash()) { - atomic.AddInt32(&stats.ignored, 1) - continue - } - // Compute all the non-consensus fields of the receipts - SetReceiptsData(bc.config, block, receipts) - // Write all the data out into the database - if err := WriteBody(bc.chainDb, block.Hash(), block.NumberU64(), block.Body()); err != nil { - errs[index] = fmt.Errorf("failed to write block body: %v", err) - atomic.AddInt32(&failed, 1) - log.Crit("Failed to write block body", "err", err) - return - } - if err := WriteBlockReceipts(bc.chainDb, block.Hash(), block.NumberU64(), receipts); err != nil { - errs[index] = fmt.Errorf("failed to write block receipts: %v", err) - atomic.AddInt32(&failed, 1) - log.Crit("Failed to write block receipts", "err", err) - return - } - if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { - errs[index] = fmt.Errorf("failed to write lookup metadata: %v", err) - atomic.AddInt32(&failed, 1) - log.Crit("Failed to write lookup metadata", "err", err) - return - } - atomic.AddInt32(&stats.processed, 1) + bytes += batch.ValueSize() + batch = bc.chainDb.NewBatch() } } - // Start as many worker threads as goroutines allowed - pending := new(sync.WaitGroup) - for i := 0; i < runtime.GOMAXPROCS(0); i++ { - pending.Add(1) - go func(id int) { - defer pending.Done() - process(id) - }(i) - } - pending.Wait() - - // If anything failed, report - if failed > 0 { - for i, err := range errs { - if err != nil { - return i, err - } + if batch.ValueSize() > 0 { + bytes += batch.ValueSize() + if err := batch.Write(); err != nil { + return 0, err } } - if atomic.LoadInt32(&bc.procInterrupt) == 1 { - log.Debug("Premature abort during receipts processing") - return 0, nil - } + // Update the head fast sync block if better bc.mu.Lock() - - head := blockChain[len(errs)-1] + head := blockChain[len(blockChain)-1] if td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case if bc.GetTd(bc.currentFastBlock.Hash(), bc.currentFastBlock.NumberU64()).Cmp(td) < 0 { if err := WriteHeadFastBlockHash(bc.chainDb, head.Hash()); err != nil { @@ -805,16 +772,18 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ } bc.mu.Unlock() - // Report some public statistics so the user has a clue what's going on - last := blockChain[len(blockChain)-1] - log.Info("Imported new block receipts", "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), - "number", last.Number(), "hash", last.Hash(), "ignored", stats.ignored) - + log.Info("Imported new block receipts", + "count", stats.processed, + "elapsed", common.PrettyDuration(time.Since(start)), + "bytes", bytes, + "number", head.Number(), + "hash", head.Hash(), + "ignored", stats.ignored) return 0, nil } // WriteBlock writes the block to the chain. -func (bc *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err error) { +func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) { bc.wg.Add(1) defer bc.wg.Done() @@ -827,7 +796,7 @@ func (bc *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err er bc.mu.Lock() defer bc.mu.Unlock() - if bc.HasBlock(block.Hash()) { + if bc.HasBlock(block.Hash(), block.NumberU64()) { log.Trace("Block existed", "hash", block.Hash()) return } @@ -837,10 +806,18 @@ func (bc *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err er // Irrelevant of the canonical status, write the block itself to the database if err := bc.hc.WriteTd(block.Hash(), block.NumberU64(), externTd); err != nil { - log.Crit("Failed to write block total difficulty", "err", err) + return NonStatTy, err } - if err := WriteBlock(bc.chainDb, block); err != nil { - log.Crit("Failed to write block contents", "err", err) + // Write other block data using a batch. + batch := bc.chainDb.NewBatch() + if err := WriteBlock(batch, block); err != nil { + return NonStatTy, err + } + if _, err := state.CommitTo(batch, bc.config.IsEIP158(block.Number())); err != nil { + return NonStatTy, err + } + if err := WriteBlockReceipts(batch, block.Hash(), block.NumberU64(), receipts); err != nil { + return NonStatTy, err } // If the total difficulty is higher than our known, add it to the canonical chain @@ -853,15 +830,28 @@ func (bc *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err er return NonStatTy, err } } - bc.insert(block) // Insert the block as the new head of the chain + // Write the positional metadata for transaction and receipt lookups + if err := WriteTxLookupEntries(batch, block); err != nil { + return NonStatTy, err + } + // Write hash preimages + if err := WritePreimages(bc.chainDb, block.NumberU64(), state.Preimages()); err != nil { + return NonStatTy, err + } status = CanonStatTy } else { status = SideStatTy } + if err := batch.Write(); err != nil { + return NonStatTy, err + } + // Set new head. + if status == CanonStatTy { + bc.insert(block) + } bc.futureBlocks.Remove(block.Hash()) - - return + return status, nil } // InsertChain will attempt to insert the given chain in to the canonical chain or, otherwise, create a fork. If an error is returned @@ -975,29 +965,18 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { bc.reportBlock(block, receipts, err) return i, err } - // Write state changes to database - if _, err = state.CommitTo(bc.chainDb, bc.config.IsEIP158(block.Number())); err != nil { - return i, err - } - // coalesce logs for later processing - coalescedLogs = append(coalescedLogs, logs...) - - if err = WriteBlockReceipts(bc.chainDb, block.Hash(), block.NumberU64(), receipts); err != nil { - return i, err - } - - // write the block to the chain and get the status - status, err := bc.WriteBlock(block) + // Write the block to the chain and get the status. + status, err := bc.WriteBlockAndState(block, receipts, state) if err != nil { return i, err } - switch status { case CanonStatTy: log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), "uncles", len(block.Uncles()), "txs", len(block.Transactions()), "gas", block.GasUsed(), "elapsed", common.PrettyDuration(time.Since(bstart))) - + // coalesce logs for later processing + coalescedLogs = append(coalescedLogs, logs...) blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) // We need some control over the mining operation. Acquiring locks and waiting @@ -1006,15 +985,6 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { if bc.LastBlockHash() == block.Hash() { events = append(events, ChainHeadEvent{block}) } - - // Write the positional metadata for transaction and receipt lookups - if err := WriteTxLookupEntries(bc.chainDb, block); err != nil { - return i, err - } - // Write hash preimages - if err := WritePreimages(bc.chainDb, block.NumberU64(), state.Preimages()); err != nil { - return i, err - } case SideStatTy: log.Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(bstart)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles())) @@ -1357,8 +1327,8 @@ func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header { // HasHeader checks if a block header is present in the database or not, caching // it if present. -func (bc *BlockChain) HasHeader(hash common.Hash) bool { - return bc.hc.HasHeader(hash) +func (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool { + return bc.hc.HasHeader(hash, number) } // GetBlockHashesFromHash retrieves a number of block hashes starting at a given diff --git a/core/database_util.go b/core/database_util.go index 989071104e..1730a048e7 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -38,11 +38,6 @@ type DatabaseReader interface { Get(key []byte) (value []byte, err error) } -// DatabaseWriter wraps the Put method of a backing data store. -type DatabaseWriter interface { - Put(key, value []byte) error -} - // DatabaseDeleter wraps the Delete method of a backing data store. type DatabaseDeleter interface { Delete(key []byte) error @@ -154,7 +149,7 @@ func GetHeadFastBlockHash(db DatabaseReader) common.Hash { // GetHeaderRLP retrieves a block header in its raw RLP database encoding, or nil // if the header's not found. func GetHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) + data, _ := db.Get(headerKey(hash, number)) return data } @@ -175,10 +170,18 @@ func GetHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Header // GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. func GetBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) + data, _ := db.Get(blockBodyKey(hash, number)) return data } +func headerKey(hash common.Hash, number uint64) []byte { + return append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...) +} + +func blockBodyKey(hash common.Hash, number uint64) []byte { + return append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...) +} + // GetBody retrieves the block body (transactons, uncles) corresponding to the // hash, nil if none found. func GetBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { @@ -340,7 +343,7 @@ func GetBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) } // WriteCanonicalHash stores the canonical hash for the given block number. -func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) error { +func WriteCanonicalHash(db ethdb.Putter, hash common.Hash, number uint64) error { key := append(append(headerPrefix, encodeBlockNumber(number)...), numSuffix...) if err := db.Put(key, hash.Bytes()); err != nil { log.Crit("Failed to store number to hash mapping", "err", err) @@ -349,7 +352,7 @@ func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) erro } // WriteHeadHeaderHash stores the head header's hash. -func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) error { +func WriteHeadHeaderHash(db ethdb.Putter, hash common.Hash) error { if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { log.Crit("Failed to store last header's hash", "err", err) } @@ -357,7 +360,7 @@ func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) error { } // WriteHeadBlockHash stores the head block's hash. -func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) error { +func WriteHeadBlockHash(db ethdb.Putter, hash common.Hash) error { if err := db.Put(headBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last block's hash", "err", err) } @@ -365,7 +368,7 @@ func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) error { } // WriteHeadFastBlockHash stores the fast head block's hash. -func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) error { +func WriteHeadFastBlockHash(db ethdb.Putter, hash common.Hash) error { if err := db.Put(headFastKey, hash.Bytes()); err != nil { log.Crit("Failed to store last fast block's hash", "err", err) } @@ -373,7 +376,7 @@ func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) error { } // WriteHeader serializes a block header into the database. -func WriteHeader(db DatabaseWriter, header *types.Header) error { +func WriteHeader(db ethdb.Putter, header *types.Header) error { data, err := rlp.EncodeToBytes(header) if err != nil { return err @@ -393,7 +396,7 @@ func WriteHeader(db DatabaseWriter, header *types.Header) error { } // WriteBody serializes the body of a block into the database. -func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) error { +func WriteBody(db ethdb.Putter, hash common.Hash, number uint64, body *types.Body) error { data, err := rlp.EncodeToBytes(body) if err != nil { return err @@ -402,7 +405,7 @@ func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.B } // WriteBodyRLP writes a serialized body of a block into the database. -func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) error { +func WriteBodyRLP(db ethdb.Putter, hash common.Hash, number uint64, rlp rlp.RawValue) error { key := append(append(bodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...) if err := db.Put(key, rlp); err != nil { log.Crit("Failed to store block body", "err", err) @@ -411,7 +414,7 @@ func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.Ra } // WriteTd serializes the total difficulty of a block into the database. -func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) error { +func WriteTd(db ethdb.Putter, hash common.Hash, number uint64, td *big.Int) error { data, err := rlp.EncodeToBytes(td) if err != nil { return err @@ -424,7 +427,7 @@ func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) er } // WriteBlock serializes a block into the database, header and body separately. -func WriteBlock(db DatabaseWriter, block *types.Block) error { +func WriteBlock(db ethdb.Putter, block *types.Block) error { // Store the body first to retain database consistency if err := WriteBody(db, block.Hash(), block.NumberU64(), block.Body()); err != nil { return err @@ -439,7 +442,7 @@ func WriteBlock(db DatabaseWriter, block *types.Block) error { // WriteBlockReceipts stores all the transaction receipts belonging to a block // as a single receipt slice. This is used during chain reorganisations for // rescheduling dropped transactions. -func WriteBlockReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) error { +func WriteBlockReceipts(db ethdb.Putter, hash common.Hash, number uint64, receipts types.Receipts) error { // Convert the receipts into their storage form and serialize them storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) for i, receipt := range receipts { @@ -459,9 +462,7 @@ func WriteBlockReceipts(db DatabaseWriter, hash common.Hash, number uint64, rece // WriteTxLookupEntries stores a positional metadata for every transaction from // a block, enabling hash based transaction and receipt lookups. -func WriteTxLookupEntries(db ethdb.Database, block *types.Block) error { - batch := db.NewBatch() - +func WriteTxLookupEntries(db ethdb.Putter, block *types.Block) error { // Iterate over each transaction and encode its metadata for i, tx := range block.Transactions() { entry := txLookupEntry{ @@ -473,20 +474,16 @@ func WriteTxLookupEntries(db ethdb.Database, block *types.Block) error { if err != nil { return err } - if err := batch.Put(append(lookupPrefix, tx.Hash().Bytes()...), data); err != nil { + if err := db.Put(append(lookupPrefix, tx.Hash().Bytes()...), data); err != nil { return err } } - // Write the scheduled data into the database - if err := batch.Write(); err != nil { - log.Crit("Failed to store lookup entries", "err", err) - } return nil } // WriteBloomBits writes the compressed bloom bits vector belonging to the given // section and bit index. -func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { +func WriteBloomBits(db ethdb.Putter, bit uint, section uint64, head common.Hash, bits []byte) { key := append(append(bloomBitsPrefix, make([]byte, 10)...), head.Bytes()...) binary.BigEndian.PutUint16(key[1:], uint16(bit)) @@ -572,13 +569,13 @@ func GetBlockChainVersion(db DatabaseReader) int { } // WriteBlockChainVersion writes vsn as the version number to db. -func WriteBlockChainVersion(db DatabaseWriter, vsn int) { +func WriteBlockChainVersion(db ethdb.Putter, vsn int) { enc, _ := rlp.EncodeToBytes(uint(vsn)) db.Put([]byte("BlockchainVersion"), enc) } // WriteChainConfig writes the chain config settings to the database. -func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConfig) error { +func WriteChainConfig(db ethdb.Putter, hash common.Hash, cfg *params.ChainConfig) error { // short circuit and ignore if nil config. GetChainConfig // will return a default. if cfg == nil { diff --git a/core/headerchain.go b/core/headerchain.go index 6ec44b61d5..0e5215293d 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -267,7 +267,7 @@ func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCa return i, errors.New("aborted") } // If the header's already known, skip it, otherwise store - if hc.GetHeader(header.Hash(), header.Number.Uint64()) != nil { + if hc.HasHeader(header.Hash(), header.Number.Uint64()) { stats.ignored++ continue } @@ -361,10 +361,13 @@ func (hc *HeaderChain) GetHeaderByHash(hash common.Hash) *types.Header { return hc.GetHeader(hash, hc.GetBlockNumber(hash)) } -// HasHeader checks if a block header is present in the database or not, caching -// it if present. -func (hc *HeaderChain) HasHeader(hash common.Hash) bool { - return hc.GetHeaderByHash(hash) != nil +// HasHeader checks if a block header is present in the database or not. +func (hc *HeaderChain) HasHeader(hash common.Hash, number uint64) bool { + if hc.numberCache.Contains(hash) || hc.headerCache.Contains(hash) { + return true + } + ok, _ := hc.chainDb.Has(headerKey(hash, number)) + return ok } // GetHeaderByNumber retrieves a block header from the database by number, diff --git a/core/state/sync.go b/core/state/sync.go index 2c29d706aa..28fcf6ae05 100644 --- a/core/state/sync.go +++ b/core/state/sync.go @@ -18,60 +18,24 @@ package state import ( "bytes" - "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) -// StateSync is the main state synchronisation scheduler, which provides yet the -// unknown state hashes to retrieve, accepts node data associated with said hashes -// and reconstructs the state database step by step until all is done. -type StateSync trie.TrieSync - // NewStateSync create a new state trie download scheduler. -func NewStateSync(root common.Hash, database trie.DatabaseReader) *StateSync { +func NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.TrieSync { var syncer *trie.TrieSync - callback := func(leaf []byte, parent common.Hash) error { - var obj struct { - Nonce uint64 - Balance *big.Int - Root common.Hash - CodeHash []byte - } + var obj Account if err := rlp.Decode(bytes.NewReader(leaf), &obj); err != nil { return err } syncer.AddSubTrie(obj.Root, 64, parent, nil) syncer.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent) - return nil } syncer = trie.NewTrieSync(root, database, callback) - return (*StateSync)(syncer) -} - -// Missing retrieves the known missing nodes from the state trie for retrieval. -func (s *StateSync) Missing(max int) []common.Hash { - return (*trie.TrieSync)(s).Missing(max) -} - -// Process injects a batch of retrieved trie nodes data, returning if something -// was committed to the memcache and also the index of an entry if processing of -// it failed. -func (s *StateSync) Process(list []trie.SyncResult) (bool, int, error) { - return (*trie.TrieSync)(s).Process(list) -} - -// Commit flushes the data stored in the internal memcache out to persistent -// storage, returning th enumber of items written and any occurred error. -func (s *StateSync) Commit(dbw trie.DatabaseWriter) (int, error) { - return (*trie.TrieSync)(s).Commit(dbw) -} - -// Pending returns the number of state entries currently pending for download. -func (s *StateSync) Pending() int { - return (*trie.TrieSync)(s).Pending() + return syncer } diff --git a/eth/api.go b/eth/api.go index 9904c6f536..a5b6e7076c 100644 --- a/eth/api.go +++ b/eth/api.go @@ -241,7 +241,7 @@ func (api *PrivateAdminAPI) ExportChain(file string) (bool, error) { func hasAllBlocks(chain *core.BlockChain, bs []*types.Block) bool { for _, b := range bs { - if !chain.HasBlock(b.Hash()) { + if !chain.HasBlock(b.Hash(), b.NumberU64()) { return false } } diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index f2dbf0f88a..38b66d9dd5 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -156,7 +156,7 @@ type Downloader struct { // LightChain encapsulates functions required to synchronise a light chain. type LightChain interface { // HasHeader verifies a header's presence in the local chain. - HasHeader(common.Hash) bool + HasHeader(h common.Hash, number uint64) bool // GetHeaderByHash retrieves a header from the local chain. GetHeaderByHash(common.Hash) *types.Header @@ -666,7 +666,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err continue } // Otherwise check if we already know the header or not - if (d.mode == FullSync && d.blockchain.HasBlockAndState(headers[i].Hash())) || (d.mode != FullSync && d.lightchain.HasHeader(headers[i].Hash())) { + if (d.mode == FullSync && d.blockchain.HasBlockAndState(headers[i].Hash())) || (d.mode != FullSync && d.lightchain.HasHeader(headers[i].Hash(), headers[i].Number.Uint64())) { number, hash = headers[i].Number.Uint64(), headers[i].Hash() // If every header is known, even future ones, the peer straight out lied about its head @@ -731,7 +731,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err arrived = true // Modify the search interval based on the response - if (d.mode == FullSync && !d.blockchain.HasBlockAndState(headers[0].Hash())) || (d.mode != FullSync && !d.lightchain.HasHeader(headers[0].Hash())) { + if (d.mode == FullSync && !d.blockchain.HasBlockAndState(headers[0].Hash())) || (d.mode != FullSync && !d.lightchain.HasHeader(headers[0].Hash(), headers[0].Number.Uint64())) { end = check break } @@ -1256,7 +1256,7 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { // Collect the yet unknown headers to mark them as uncertain unknown := make([]*types.Header, 0, len(headers)) for _, header := range chunk { - if !d.lightchain.HasHeader(header.Hash()) { + if !d.lightchain.HasHeader(header.Hash(), header.Number.Uint64()) { unknown = append(unknown, header) } } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index d66aafe94e..58f6e9a624 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -217,7 +217,7 @@ func (dl *downloadTester) sync(id string, td *big.Int, mode SyncMode) error { } // HasHeader checks if a header is present in the testers canonical chain. -func (dl *downloadTester) HasHeader(hash common.Hash) bool { +func (dl *downloadTester) HasHeader(hash common.Hash, number uint64) bool { return dl.GetHeaderByHash(hash) != nil } diff --git a/eth/downloader/statesync.go b/eth/downloader/statesync.go index a5ce8c42df..eb5416f63c 100644 --- a/eth/downloader/statesync.go +++ b/eth/downloader/statesync.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/crypto/sha3" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/trie" ) @@ -187,10 +188,13 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync { type stateSync struct { d *Downloader // Downloader instance to access and manage current peerset - sched *state.StateSync // State trie sync scheduler defining the tasks + sched *trie.TrieSync // State trie sync scheduler defining the tasks keccak hash.Hash // Keccak256 hasher to verify deliveries with tasks map[common.Hash]*stateTask // Set of tasks currently queued for retrieval + numUncommitted int + bytesUncommitted int + deliver chan *stateReq // Delivery channel multiplexing peer responses cancel chan struct{} // Channel to signal a termination request cancelOnce sync.Once // Ensures cancel only ever gets called once @@ -252,9 +256,10 @@ func (s *stateSync) loop() error { // Keep assigning new tasks until the sync completes or aborts for s.sched.Pending() > 0 { - if err := s.assignTasks(); err != nil { + if err := s.commit(false); err != nil { return err } + s.assignTasks() // Tasks assigned, wait for something to happen select { case <-newPeer: @@ -284,12 +289,28 @@ func (s *stateSync) loop() error { } } } + return s.commit(true) +} + +func (s *stateSync) commit(force bool) error { + if !force && s.bytesUncommitted < ethdb.IdealBatchSize { + return nil + } + start := time.Now() + b := s.d.stateDB.NewBatch() + s.sched.Commit(b) + if err := b.Write(); err != nil { + return fmt.Errorf("DB write error: %v", err) + } + s.updateStats(s.numUncommitted, 0, 0, time.Since(start)) + s.numUncommitted = 0 + s.bytesUncommitted = 0 return nil } // assignTasks attempts to assing new tasks to all idle peers, either from the // batch currently being retried, or fetching new data from the trie sync itself. -func (s *stateSync) assignTasks() error { +func (s *stateSync) assignTasks() { // Iterate over all idle peers and try to assign them state fetches peers, _ := s.d.peers.NodeDataIdlePeers() for _, p := range peers { @@ -301,7 +322,6 @@ func (s *stateSync) assignTasks() error { // If the peer was assigned tasks to fetch, send the network request if len(req.items) > 0 { req.peer.log.Trace("Requesting new batch of data", "type", "state", "count", len(req.items)) - select { case s.d.trackStateReq <- req: req.peer.FetchNodeData(req.items) @@ -309,7 +329,6 @@ func (s *stateSync) assignTasks() error { } } } - return nil } // fillTasks fills the given request object with a maximum of n state download @@ -347,11 +366,11 @@ func (s *stateSync) fillTasks(n int, req *stateReq) { // delivered. func (s *stateSync) process(req *stateReq) (bool, error) { // Collect processing stats and update progress if valid data was received - processed, written, duplicate, unexpected := 0, 0, 0, 0 + duplicate, unexpected := 0, 0 defer func(start time.Time) { - if processed+written+duplicate+unexpected > 0 { - s.updateStats(processed, written, duplicate, unexpected, time.Since(start)) + if duplicate > 0 || unexpected > 0 { + s.updateStats(0, duplicate, unexpected, time.Since(start)) } }(time.Now()) @@ -362,7 +381,9 @@ func (s *stateSync) process(req *stateReq) (bool, error) { prog, hash, err := s.processNodeData(blob) switch err { case nil: - processed++ + s.numUncommitted++ + s.bytesUncommitted += len(blob) + progress = progress || prog case trie.ErrNotRequested: unexpected++ case trie.ErrAlreadyProcessed: @@ -370,38 +391,20 @@ func (s *stateSync) process(req *stateReq) (bool, error) { default: return stale, fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err) } - if prog { - progress = true - } // If the node delivered a requested item, mark the delivery non-stale if _, ok := req.tasks[hash]; ok { delete(req.tasks, hash) stale = false } } - // If some data managed to hit the database, flush and reset failure counters - if progress { - // Flush any accumulated data out to disk - batch := s.d.stateDB.NewBatch() - - count, err := s.sched.Commit(batch) - if err != nil { - return stale, err - } - if err := batch.Write(); err != nil { - return stale, err - } - written = count - - // If we're inside the critical section, reset fail counter since we progressed - if atomic.LoadUint32(&s.d.fsPivotFails) > 1 { - log.Trace("Fast-sync progressed, resetting fail counter", "previous", atomic.LoadUint32(&s.d.fsPivotFails)) - atomic.StoreUint32(&s.d.fsPivotFails, 1) // Don't ever reset to 0, as that will unlock the pivot block - } + // If we're inside the critical section, reset fail counter since we progressed. + if progress && atomic.LoadUint32(&s.d.fsPivotFails) > 1 { + log.Trace("Fast-sync progressed, resetting fail counter", "previous", atomic.LoadUint32(&s.d.fsPivotFails)) + atomic.StoreUint32(&s.d.fsPivotFails, 1) // Don't ever reset to 0, as that will unlock the pivot block } + // Put unfulfilled tasks back into the retry queue npeers := s.d.peers.Len() - for hash, task := range req.tasks { // If the node did deliver something, missing items may be due to a protocol // limit or a previous timeout + delayed delivery. Both cases should permit @@ -425,25 +428,25 @@ func (s *stateSync) process(req *stateReq) (bool, error) { // error occurred. func (s *stateSync) processNodeData(blob []byte) (bool, common.Hash, error) { res := trie.SyncResult{Data: blob} - s.keccak.Reset() s.keccak.Write(blob) s.keccak.Sum(res.Hash[:0]) - committed, _, err := s.sched.Process([]trie.SyncResult{res}) return committed, res.Hash, err } // updateStats bumps the various state sync progress counters and displays a log // message for the user to see. -func (s *stateSync) updateStats(processed, written, duplicate, unexpected int, duration time.Duration) { +func (s *stateSync) updateStats(written, duplicate, unexpected int, duration time.Duration) { s.d.syncStatsLock.Lock() defer s.d.syncStatsLock.Unlock() s.d.syncStatsState.pending = uint64(s.sched.Pending()) - s.d.syncStatsState.processed += uint64(processed) + s.d.syncStatsState.processed += uint64(written) s.d.syncStatsState.duplicate += uint64(duplicate) s.d.syncStatsState.unexpected += uint64(unexpected) - log.Info("Imported new state entries", "count", processed, "flushed", written, "elapsed", common.PrettyDuration(duration), "processed", s.d.syncStatsState.processed, "pending", s.d.syncStatsState.pending, "retry", len(s.tasks), "duplicate", s.d.syncStatsState.duplicate, "unexpected", s.d.syncStatsState.unexpected) + if written > 0 || duplicate > 0 || unexpected > 0 { + log.Info("Imported new state entries", "count", written, "elapsed", common.PrettyDuration(duration), "processed", s.d.syncStatsState.processed, "pending", s.d.syncStatsState.pending, "retry", len(s.tasks), "duplicate", s.d.syncStatsState.duplicate, "unexpected", s.d.syncStatsState.unexpected) + } } diff --git a/eth/handler.go b/eth/handler.go index 28ae208c06..cee719ddb6 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -609,7 +609,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { // Schedule all the unknown hashes for retrieval unknown := make(newBlockHashesData, 0, len(announces)) for _, block := range announces { - if !pm.blockchain.HasBlock(block.Hash) { + if !pm.blockchain.HasBlock(block.Hash, block.Number) { unknown = append(unknown, block) } } @@ -699,7 +699,7 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) { return } // Otherwise if the block is indeed in out own chain, announce it - if pm.blockchain.HasBlock(hash) { + if pm.blockchain.HasBlock(hash, block.NumberU64()) { for _, peer := range peers { peer.SendNewBlockHashes([]common.Hash{hash}, []uint64{block.NumberU64()}) } diff --git a/ethdb/database.go b/ethdb/database.go index 7d5fb0b9ef..93755dd7e3 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -109,6 +109,10 @@ func (db *LDBDatabase) Put(key []byte, value []byte) error { return db.db.Put(key, value, nil) } +func (db *LDBDatabase) Has(key []byte) (bool, error) { + return db.db.Has(key, nil) +} + // Get returns the given key if it's present. func (db *LDBDatabase) Get(key []byte) ([]byte, error) { // Measure the database get latency, if requested @@ -271,19 +275,19 @@ func (db *LDBDatabase) meter(refresh time.Duration) { } } -// TODO: remove this stuff and expose leveldb directly - func (db *LDBDatabase) NewBatch() Batch { return &ldbBatch{db: db.db, b: new(leveldb.Batch)} } type ldbBatch struct { - db *leveldb.DB - b *leveldb.Batch + db *leveldb.DB + b *leveldb.Batch + size int } func (b *ldbBatch) Put(key, value []byte) error { b.b.Put(key, value) + b.size += len(value) return nil } @@ -291,6 +295,10 @@ func (b *ldbBatch) Write() error { return b.db.Write(b.b, nil) } +func (b *ldbBatch) ValueSize() int { + return b.size +} + type table struct { db Database prefix string @@ -309,6 +317,10 @@ func (dt *table) Put(key []byte, value []byte) error { return dt.db.Put(append([]byte(dt.prefix), key...), value) } +func (dt *table) Has(key []byte) (bool, error) { + return dt.db.Has(append([]byte(dt.prefix), key...)) +} + func (dt *table) Get(key []byte) ([]byte, error) { return dt.db.Get(append([]byte(dt.prefix), key...)) } @@ -342,3 +354,7 @@ func (tb *tableBatch) Put(key, value []byte) error { func (tb *tableBatch) Write() error { return tb.batch.Write() } + +func (tb *tableBatch) ValueSize() int { + return tb.batch.ValueSize() +} diff --git a/ethdb/interface.go b/ethdb/interface.go index f4b787a52a..99a5b770d5 100644 --- a/ethdb/interface.go +++ b/ethdb/interface.go @@ -16,15 +16,29 @@ package ethdb -type Database interface { +// Code using batches should try to add this much data to the batch. +// The value was determined empirically. +const IdealBatchSize = 100 * 1024 + +// Putter wraps the database write operation supported by both batches and regular databases. +type Putter interface { Put(key []byte, value []byte) error +} + +// Database wraps all database operations. All methods are safe for concurrent use. +type Database interface { + Putter Get(key []byte) ([]byte, error) + Has(key []byte) (bool, error) Delete(key []byte) error Close() NewBatch() Batch } +// Batch is a write-only database that commits changes to its host database +// when Write is called. Batch cannot be used concurrently. type Batch interface { - Put(key, value []byte) error + Putter + ValueSize() int // amount of data in the batch Write() error } diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index 11b0937248..699bd0c9fd 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -45,6 +45,14 @@ func (db *MemDatabase) Put(key []byte, value []byte) error { return nil } +func (db *MemDatabase) Has(key []byte) (bool, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + _, ok := db.db[string(key)] + return ok, nil +} + func (db *MemDatabase) Get(key []byte) ([]byte, error) { db.lock.RLock() defer db.lock.RUnlock() @@ -93,21 +101,16 @@ type kv struct{ k, v []byte } type memBatch struct { db *MemDatabase writes []kv - lock sync.RWMutex + size int } func (b *memBatch) Put(key, value []byte) error { - b.lock.Lock() - defer b.lock.Unlock() - b.writes = append(b.writes, kv{common.CopyBytes(key), common.CopyBytes(value)}) + b.size += len(value) return nil } func (b *memBatch) Write() error { - b.lock.RLock() - defer b.lock.RUnlock() - b.db.lock.Lock() defer b.db.lock.Unlock() @@ -116,3 +119,7 @@ func (b *memBatch) Write() error { } return nil } + +func (b *memBatch) ValueSize() int { + return b.size +} diff --git a/les/handler.go b/les/handler.go index 1a75cd369d..df7eb6af51 100644 --- a/les/handler.go +++ b/les/handler.go @@ -70,7 +70,7 @@ func errResp(code errCode, format string, v ...interface{}) error { } type BlockChain interface { - HasHeader(hash common.Hash) bool + HasHeader(hash common.Hash, number uint64) bool GetHeader(hash common.Hash, number uint64) *types.Header GetHeaderByHash(hash common.Hash) *types.Header CurrentHeader() *types.Header diff --git a/light/lightchain.go b/light/lightchain.go index df194ecadf..3a763fc906 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -252,8 +252,8 @@ func (self *LightChain) GetBodyRLP(ctx context.Context, hash common.Hash) (rlp.R // HasBlock checks if a block is fully present in the database or not, caching // it if present. -func (bc *LightChain) HasBlock(hash common.Hash) bool { - blk, _ := bc.GetBlockByHash(NoOdr, hash) +func (bc *LightChain) HasBlock(hash common.Hash, number uint64) bool { + blk, _ := bc.GetBlock(NoOdr, hash, number) return blk != nil } @@ -418,8 +418,8 @@ func (self *LightChain) GetHeaderByHash(hash common.Hash) *types.Header { // HasHeader checks if a block header is present in the database or not, caching // it if present. -func (bc *LightChain) HasHeader(hash common.Hash) bool { - return bc.hc.HasHeader(hash) +func (bc *LightChain) HasHeader(hash common.Hash, number uint64) bool { + return bc.hc.HasHeader(hash, number) } // GetBlockHashesFromHash retrieves a number of block hashes starting at a given diff --git a/miner/worker.go b/miner/worker.go index 2919d4a485..b48db2a30e 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -304,13 +304,8 @@ func (self *worker) wait() { } go self.mux.Post(core.NewMinedBlockEvent{Block: block}) } else { - work.state.CommitTo(self.chainDb, self.config.IsEIP158(block.Number())) - stat, err := self.chain.WriteBlock(block) - if err != nil { - log.Error("Failed writing block to chain", "err", err) - continue - } - // update block hash since it is now available and not when the receipt/log of individual transactions were created + // Update the block hash in all logs since it is now available and not when the + // receipt/log of individual transactions were created. for _, r := range work.receipts { for _, l := range r.Logs { l.BlockHash = block.Hash() @@ -319,15 +314,17 @@ func (self *worker) wait() { for _, log := range work.state.Logs() { log.BlockHash = block.Hash() } + stat, err := self.chain.WriteBlockAndState(block, work.receipts, work.state) + if err != nil { + log.Error("Failed writing block to chain", "err", err) + continue + } // check if canon block and write transactions if stat == core.CanonStatTy { - // This puts transactions in a extra db for rpc - core.WriteTxLookupEntries(self.chainDb, block) // implicit by posting ChainHeadEvent mustCommitNewWork = false } - // broadcast before waiting for validation go func(block *types.Block, logs []*types.Log, receipts []*types.Receipt) { self.mux.Post(core.NewMinedBlockEvent{Block: block}) @@ -336,16 +333,12 @@ func (self *worker) wait() { coalescedLogs []*types.Log ) events = append(events, core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) - if stat == core.CanonStatTy { events = append(events, core.ChainHeadEvent{Block: block}) coalescedLogs = logs } // post blockchain events self.chain.PostChainEvents(events, coalescedLogs) - if err := core.WriteBlockReceipts(self.chainDb, block.Hash(), block.NumberU64(), receipts); err != nil { - log.Warn("Failed writing block receipts", "err", err) - } }(block, work.state.Logs(), work.receipts) } // Insert the block into the set of pending ones to wait for confirmations diff --git a/trie/sync.go b/trie/sync.go index 1e4f8d87c1..fea10051f4 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -138,7 +138,7 @@ func (s *TrieSync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) if _, ok := s.membatch.batch[hash]; ok { return } - if blob, _ := s.database.Get(hash.Bytes()); blob != nil { + if ok, _ := s.database.Has(hash.Bytes()); ok { return } // Assemble the new sub-trie sync request @@ -296,8 +296,7 @@ func (s *TrieSync) children(req *request, object node) ([]*request, error) { if _, ok := s.membatch.batch[hash]; ok { continue } - blob, _ := s.database.Get(node) - if local, err := decodeNode(node[:], blob, 0); local != nil && err == nil { + if ok, _ := s.database.Has(node); ok { continue } // Locally unknown node, schedule for retrieval diff --git a/trie/trie.go b/trie/trie.go index a3151b1ce7..7f69a3d1de 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -66,6 +66,7 @@ type Database interface { // DatabaseReader wraps the Get method of a backing store for the trie. type DatabaseReader interface { Get(key []byte) (value []byte, err error) + Has(key []byte) (bool, error) } // DatabaseWriter wraps the Put method of a backing store for the trie. From 42a5b54bf50a340bce624da91bffbf2827dad622 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sun, 10 Sep 2017 21:04:36 +0200 Subject: [PATCH 151/272] core/vm: improve bitvec comments --- core/vm/analysis.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/vm/analysis.go b/core/vm/analysis.go index e6a2df7b02..f9c4298d39 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -44,8 +44,9 @@ func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) } -// bitvec is a bit vector which maps bytes in a program -// An unset bit means the byte is a code-segemnt, a set bit means it's data-segment +// bitvec is a bit vector which maps bytes in a program. +// An unset bit means the byte is an opcode, a set bit means +// it's data (i.e. argument of PUSHxx). type bitvec []byte func (bits *bitvec) set(pos uint64) { @@ -56,15 +57,14 @@ func (bits *bitvec) set8(pos uint64) { (*bits)[pos/8+1] |= ^(0xFF >> (pos % 8)) } -// codeSegment checks if the position is in a code segment +// codeSegment checks if the position is in a code segment. func (bits *bitvec) codeSegment(pos uint64) bool { return ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0 } -// jumpdests creates a bitmap of the code, where 1 represents a DATA-segment, -// and 0 represents code-segment -func codeBitmap(code []byte) []byte { - //The map is 4 bytes longer than necessary, in case the code +// codeBitmap collects data locations in code. +func codeBitmap(code []byte) bitvec { + // The bitmap is 4 bytes longer than necessary, in case the code // ends with a PUSH32, the algorithm will push zeroes onto the // bitvector outside the bounds of the actual code. bits := make(bitvec, len(code)/8+1+4) From 5596b664c4ca5be199bb93f87155fa2c1fa7eab2 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 11 Sep 2017 09:33:18 +0200 Subject: [PATCH 152/272] internal/debug: add debug_freeOSMemory (#15122) --- internal/debug/api.go | 5 ++ internal/web3ext/web3ext.go | 132 +++++++++++++++++------------------- 2 files changed, 67 insertions(+), 70 deletions(-) diff --git a/internal/debug/api.go b/internal/debug/api.go index 8b7693f6a4..7583878ed5 100644 --- a/internal/debug/api.go +++ b/internal/debug/api.go @@ -176,6 +176,11 @@ func (*HandlerT) Stacks() string { return string(buf) } +// FreeOSMemory returns unused memory to the OS. +func (*HandlerT) FreeOSMemory() { + debug.FreeOSMemory() +} + func writeProfile(name, file string) error { p := pprof.Lookup(name) log.Info("Writing profile records", "count", p.Count(), "type", name, "dump", file) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index bf1db88196..927085b441 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -34,58 +34,56 @@ var Modules = map[string]string{ const Chequebook_JS = ` web3._extend({ - property: 'chequebook', - methods: - [ - new web3._extend.Method({ - name: 'deposit', - call: 'chequebook_deposit', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Property({ + property: 'chequebook', + methods: [ + new web3._extend.Method({ + name: 'deposit', + call: 'chequebook_deposit', + params: 1, + inputFormatter: [null] + }), + new web3._extend.Property({ name: 'balance', getter: 'chequebook_balance', - outputFormatter: web3._extend.utils.toDecimal + outputFormatter: web3._extend.utils.toDecimal }), - new web3._extend.Method({ - name: 'cash', - call: 'chequebook_cash', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Method({ - name: 'issue', - call: 'chequebook_issue', - params: 2, - inputFormatter: [null, null] - }), - ] + new web3._extend.Method({ + name: 'cash', + call: 'chequebook_cash', + params: 1, + inputFormatter: [null] + }), + new web3._extend.Method({ + name: 'issue', + call: 'chequebook_issue', + params: 2, + inputFormatter: [null, null] + }), + ] }); ` const Clique_JS = ` web3._extend({ - property: 'clique', - methods: - [ + property: 'clique', + methods: [ new web3._extend.Method({ name: 'getSnapshot', call: 'clique_getSnapshot', params: 1, - inputFormatter: [null] + inputFormatter: [null] }), new web3._extend.Method({ name: 'getSnapshotAtHash', call: 'clique_getSnapshotAtHash', params: 1 }), - new web3._extend.Method({ - name: 'getSigners', - call: 'clique_getSigners', - params: 1, - inputFormatter: [null] - }), + new web3._extend.Method({ + name: 'getSigners', + call: 'clique_getSigners', + params: 1, + inputFormatter: [null] + }), new web3._extend.Method({ name: 'getSignersAtHash', call: 'clique_getSignersAtHash', @@ -100,10 +98,9 @@ web3._extend({ name: 'discard', call: 'clique_discard', params: 1 - }) - ], - properties: - [ + }), + ], + properties: [ new web3._extend.Property({ name: 'proposals', getter: 'clique_proposals' @@ -115,8 +112,7 @@ web3._extend({ const Admin_JS = ` web3._extend({ property: 'admin', - methods: - [ + methods: [ new web3._extend.Method({ name: 'addPeer', call: 'admin_addPeer', @@ -162,10 +158,9 @@ web3._extend({ new web3._extend.Method({ name: 'stopWS', call: 'admin_stopWS' - }) + }), ], - properties: - [ + properties: [ new web3._extend.Property({ name: 'nodeInfo', getter: 'admin_nodeInfo' @@ -177,7 +172,7 @@ web3._extend({ new web3._extend.Property({ name: 'datadir', getter: 'admin_datadir' - }) + }), ] }); ` @@ -185,8 +180,7 @@ web3._extend({ const Debug_JS = ` web3._extend({ property: 'debug', - methods: - [ + methods: [ new web3._extend.Method({ name: 'printBlock', call: 'debug_printBlock', @@ -268,6 +262,11 @@ web3._extend({ params: 0, outputFormatter: console.log }), + new web3._extend.Method({ + name: 'freeOSMemory', + call: 'debug_freeOSMemory', + params: 0, + }), new web3._extend.Method({ name: 'memStats', call: 'debug_memStats', @@ -358,8 +357,7 @@ web3._extend({ const Eth_JS = ` web3._extend({ property: 'eth', - methods: - [ + methods: [ new web3._extend.Method({ name: 'sign', call: 'eth_sign', @@ -396,10 +394,9 @@ web3._extend({ }, params: 2, inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] - }) + }), ], - properties: - [ + properties: [ new web3._extend.Property({ name: 'pendingTransactions', getter: 'eth_pendingTransactions', @@ -411,7 +408,7 @@ web3._extend({ } return formatted; } - }) + }), ] }); ` @@ -419,8 +416,7 @@ web3._extend({ const Miner_JS = ` web3._extend({ property: 'miner', - methods: - [ + methods: [ new web3._extend.Method({ name: 'start', call: 'miner_start', @@ -451,7 +447,7 @@ web3._extend({ new web3._extend.Method({ name: 'getHashrate', call: 'miner_getHashrate' - }) + }), ], properties: [] }); @@ -461,12 +457,11 @@ const Net_JS = ` web3._extend({ property: 'net', methods: [], - properties: - [ + properties: [ new web3._extend.Property({ name: 'version', getter: 'net_version' - }) + }), ] }); ` @@ -474,8 +469,7 @@ web3._extend({ const Personal_JS = ` web3._extend({ property: 'personal', - methods: - [ + methods: [ new web3._extend.Method({ name: 'importRawKey', call: 'personal_importRawKey', @@ -501,14 +495,13 @@ web3._extend({ name: 'deriveAccount', call: 'personal_deriveAccount', params: 3 - }) + }), ], - properties: - [ + properties: [ new web3._extend.Property({ name: 'listWallets', getter: 'personal_listWallets' - }) + }), ] }) ` @@ -517,12 +510,11 @@ const RPC_JS = ` web3._extend({ property: 'rpc', methods: [], - properties: - [ + properties: [ new web3._extend.Property({ name: 'modules', getter: 'rpc_modules' - }) + }), ] }); ` @@ -633,7 +625,7 @@ web3._extend({ name: 'newMessageFilter', call: 'shh_newMessageFilter', params: 1 - }) + }), ], properties: [ @@ -669,7 +661,7 @@ web3._extend({ name: 'listmounts', call: 'swarmfs_listmounts', params: 0 - }) + }), ] }); ` @@ -696,7 +688,7 @@ web3._extend({ status.queued = web3._extend.utils.toDecimal(status.queued); return status; } - }) + }), ] }); ` From 10b3f97c9dcc6f3711aa2d3b1bb43e67eb921223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 11 Sep 2017 13:13:05 +0300 Subject: [PATCH 153/272] core: only fire one chain head per batch (#15123) * core: only fire one chain head per batch * miner: announce chan events synchronously --- core/blockchain.go | 53 +++++++++++++++++------------ core/blockchain_test.go | 2 +- miner/worker.go | 75 +++++++++++++++++------------------------ 3 files changed, 63 insertions(+), 67 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 25be8d762a..235c1f3da2 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -854,9 +854,22 @@ func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.R return status, nil } -// InsertChain will attempt to insert the given chain in to the canonical chain or, otherwise, create a fork. If an error is returned -// it will return the index number of the failing block as well an error describing what went wrong (for possible errors see core/errors.go). +// InsertChain attempts to insert the given batch of blocks in to the canonical +// chain or, otherwise, create a fork. If an error is returned it will return +// the index number of the failing block as well an error describing what went +// wrong. +// +// After insertion is done, all accumulated events will be fired. func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { + n, events, logs, err := bc.insertChain(chain) + bc.PostChainEvents(events, logs) + return n, err +} + +// insertChain will execute the actual chain insertion and event aggregation. The +// only reason this method exists as a separate one is to make locking cleaner +// with deferred statements. +func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*types.Log, error) { // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(chain); i++ { if chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() { @@ -864,7 +877,7 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { log.Error("Non contiguous block insert", "number", chain[i].Number(), "hash", chain[i].Hash(), "parent", chain[i].ParentHash(), "prevnumber", chain[i-1].Number(), "prevhash", chain[i-1].Hash()) - return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].NumberU64(), + return 0, nil, nil, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].NumberU64(), chain[i-1].Hash().Bytes()[:4], i, chain[i].NumberU64(), chain[i].Hash().Bytes()[:4], chain[i].ParentHash().Bytes()[:4]) } } @@ -881,6 +894,7 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { var ( stats = insertStats{startTime: mclock.Now()} events = make([]interface{}, 0, len(chain)) + lastCanon *types.Block coalescedLogs []*types.Log ) // Start the parallel header verifier @@ -904,7 +918,7 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { // If the header is a banned one, straight out abort if BadHashes[block.Hash()] { bc.reportBlock(block, nil, ErrBlacklistedHash) - return i, ErrBlacklistedHash + return i, events, coalescedLogs, ErrBlacklistedHash } // Wait for the block's verification to complete bstart := time.Now() @@ -925,7 +939,7 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { // if given. max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks) if block.Time().Cmp(max) > 0 { - return i, fmt.Errorf("future block: %v > %v", block.Time(), max) + return i, events, coalescedLogs, fmt.Errorf("future block: %v > %v", block.Time(), max) } bc.futureBlocks.Add(block.Hash(), block) stats.queued++ @@ -939,7 +953,7 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { } bc.reportBlock(block, nil, err) - return i, err + return i, events, coalescedLogs, err } // Create a new statedb using the parent block and report an // error if it fails. @@ -951,40 +965,35 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { } state, err := state.New(parent.Root(), bc.stateCache) if err != nil { - return i, err + return i, events, coalescedLogs, err } // Process block using the parent state as reference point. receipts, logs, usedGas, err := bc.processor.Process(block, state, bc.vmConfig) if err != nil { bc.reportBlock(block, receipts, err) - return i, err + return i, events, coalescedLogs, err } // Validate the state using the default validator err = bc.Validator().ValidateState(block, parent, state, receipts, usedGas) if err != nil { bc.reportBlock(block, receipts, err) - return i, err + return i, events, coalescedLogs, err } - // Write the block to the chain and get the status. status, err := bc.WriteBlockAndState(block, receipts, state) if err != nil { - return i, err + return i, events, coalescedLogs, err } switch status { case CanonStatTy: log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), "uncles", len(block.Uncles()), "txs", len(block.Transactions()), "gas", block.GasUsed(), "elapsed", common.PrettyDuration(time.Since(bstart))) - // coalesce logs for later processing + coalescedLogs = append(coalescedLogs, logs...) blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) - // We need some control over the mining operation. Acquiring locks and waiting - // for the miner to create new block takes too long and in most cases isn't - // even necessary. - if bc.LastBlockHash() == block.Hash() { - events = append(events, ChainHeadEvent{block}) - } + lastCanon = block + case SideStatTy: log.Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(bstart)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles())) @@ -996,9 +1005,11 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { stats.usedGas += usedGas.Uint64() stats.report(chain, i) } - go bc.PostChainEvents(events, coalescedLogs) - - return 0, nil + // Append a single chain head event if we've progressed the chain + if lastCanon != nil && bc.LastBlockHash() == lastCanon.Hash() { + events = append(events, ChainHeadEvent{lastCanon}) + } + return 0, events, coalescedLogs, nil } // insertStats tracks and reports on block insertion. diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 470974a0a7..700a30a16f 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -935,7 +935,7 @@ func TestReorgSideEvent(t *testing.T) { } gen.AddTx(tx) }) - chainSideCh := make(chan ChainSideEvent) + chainSideCh := make(chan ChainSideEvent, 64) blockchain.SubscribeChainSideEvent(chainSideCh) if _, err := blockchain.InsertChain(replacementBlocks); err != nil { t.Fatalf("failed to insert chain: %v", err) diff --git a/miner/worker.go b/miner/worker.go index b48db2a30e..bf24970f5c 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -125,8 +125,6 @@ type worker struct { // atomic status counters mining int32 atWork int32 - - fullValidation bool } func newWorker(config *params.ChainConfig, engine consensus.Engine, coinbase common.Address, eth Backend, mux *event.TypeMux) *worker { @@ -146,7 +144,6 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, coinbase com coinbase: coinbase, agents: make(map[Agent]struct{}), unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), miningLogAtDepth), - fullValidation: false, } // Subscribe TxPreEvent for tx pool worker.txSub = eth.TxPool().SubscribeTxPreEvent(worker.txCh) @@ -297,50 +294,38 @@ func (self *worker) wait() { block := result.Block work := result.Work - if self.fullValidation { - if _, err := self.chain.InsertChain(types.Blocks{block}); err != nil { - log.Error("Mined invalid block", "err", err) - continue + // Update the block hash in all logs since it is now available and not when the + // receipt/log of individual transactions were created. + for _, r := range work.receipts { + for _, l := range r.Logs { + l.BlockHash = block.Hash() } - go self.mux.Post(core.NewMinedBlockEvent{Block: block}) - } else { - // Update the block hash in all logs since it is now available and not when the - // receipt/log of individual transactions were created. - for _, r := range work.receipts { - for _, l := range r.Logs { - l.BlockHash = block.Hash() - } - } - for _, log := range work.state.Logs() { - log.BlockHash = block.Hash() - } - stat, err := self.chain.WriteBlockAndState(block, work.receipts, work.state) - if err != nil { - log.Error("Failed writing block to chain", "err", err) - continue - } - - // check if canon block and write transactions - if stat == core.CanonStatTy { - // implicit by posting ChainHeadEvent - mustCommitNewWork = false - } - // broadcast before waiting for validation - go func(block *types.Block, logs []*types.Log, receipts []*types.Receipt) { - self.mux.Post(core.NewMinedBlockEvent{Block: block}) - var ( - events []interface{} - coalescedLogs []*types.Log - ) - events = append(events, core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) - if stat == core.CanonStatTy { - events = append(events, core.ChainHeadEvent{Block: block}) - coalescedLogs = logs - } - // post blockchain events - self.chain.PostChainEvents(events, coalescedLogs) - }(block, work.state.Logs(), work.receipts) } + for _, log := range work.state.Logs() { + log.BlockHash = block.Hash() + } + stat, err := self.chain.WriteBlockAndState(block, work.receipts, work.state) + if err != nil { + log.Error("Failed writing block to chain", "err", err) + continue + } + // check if canon block and write transactions + if stat == core.CanonStatTy { + // implicit by posting ChainHeadEvent + mustCommitNewWork = false + } + // Broadcast the block and announce chain insertion event + self.mux.Post(core.NewMinedBlockEvent{Block: block}) + var ( + events []interface{} + logs = work.state.Logs() + ) + events = append(events, core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) + if stat == core.CanonStatTy { + events = append(events, core.ChainHeadEvent{Block: block}) + } + self.chain.PostChainEvents(events, logs) + // Insert the block into the set of pending ones to wait for confirmations self.unconfirmed.Insert(block.NumberU64(), block.Hash()) From 48705f8aea04dffb7e772784122aa600bbc60cab Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 11 Sep 2017 12:29:47 +0200 Subject: [PATCH 154/272] internal/debug: add debug_setGCPercent --- internal/debug/api.go | 6 ++++++ internal/web3ext/web3ext.go | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/internal/debug/api.go b/internal/debug/api.go index 7583878ed5..3547b05641 100644 --- a/internal/debug/api.go +++ b/internal/debug/api.go @@ -181,6 +181,12 @@ func (*HandlerT) FreeOSMemory() { debug.FreeOSMemory() } +// SetGCPercent sets the garbage collection target percentage. It returns the previous +// setting. A negative value disables GC. +func (*HandlerT) SetGCPercent(v int) int { + return debug.SetGCPercent(v) +} + func writeProfile(name, file string) error { p := pprof.Lookup(name) log.Info("Writing profile records", "count", p.Count(), "type", name, "dump", file) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 927085b441..215eae7010 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -267,6 +267,11 @@ web3._extend({ call: 'debug_freeOSMemory', params: 0, }), + new web3._extend.Method({ + name: 'setGCPercent', + call: 'debug_setGCPercent', + params: 1, + }), new web3._extend.Method({ name: 'memStats', call: 'debug_memStats', From 7a7f6a4f29c7d30d861eb6b9c92374d370ce87cd Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Mon, 11 Sep 2017 23:36:16 +0200 Subject: [PATCH 155/272] light: new CHTs for mainnet and ropsten --- light/lightchain.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/light/lightchain.go b/light/lightchain.go index 3a763fc906..4c877a771a 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -97,9 +97,14 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. } if bc.genesisBlock.Hash() == params.MainnetGenesisHash { // add trusted CHT - WriteTrustedCht(bc.chainDb, TrustedCht{Number: 805, Root: common.HexToHash("85e4286fe0a730390245c49de8476977afdae0eb5530b277f62a52b12313d50f")}) + WriteTrustedCht(bc.chainDb, TrustedCht{Number: 1040, Root: common.HexToHash("bb4fb4076cbe6923c8a8ce8f158452bbe19564959313466989fda095a60884ca")}) log.Info("Added trusted CHT for mainnet") } + if bc.genesisBlock.Hash() == params.TestnetGenesisHash { + // add trusted CHT + WriteTrustedCht(bc.chainDb, TrustedCht{Number: 400, Root: common.HexToHash("2a4befa19e4675d939c3dc22dca8c6ae9fcd642be1f04b06bd6e4203cc304660")}) + log.Info("Added trusted CHT for ropsten testnet") + } if err := bc.loadLastState(); err != nil { return nil, err From 66a7ef57e61f15d718c179d2a0ffaf8a5c38b2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 12 Sep 2017 11:35:35 +0300 Subject: [PATCH 156/272] cmd/puppeth: reserve "yournode" as a non-allowed ethstats user --- cmd/puppeth/module_ethstats.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/puppeth/module_ethstats.go b/cmd/puppeth/module_ethstats.go index 5d3fa5fc03..6ce662f65f 100644 --- a/cmd/puppeth/module_ethstats.go +++ b/cmd/puppeth/module_ethstats.go @@ -42,7 +42,7 @@ RUN \ WORKDIR /eth-netstats EXPOSE 3000 -RUN echo 'module.exports = {trusted: [{{.Trusted}}], banned: [{{.Banned}}]};' > lib/utils/config.js +RUN echo 'module.exports = {trusted: [{{.Trusted}}], banned: [{{.Banned}}], reserved: ["yournode"]};' > lib/utils/config.js CMD ["npm", "start"] ` From f46adfac285741e943b97779d2053b22e66ce18d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 12 Sep 2017 14:39:34 +0300 Subject: [PATCH 157/272] eth/downloader: track peer drops and deassign state sync tasks --- eth/downloader/peer.go | 22 ++++++++++++++++------ eth/downloader/statesync.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index d0dc9a8aa6..e638744ea5 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -349,9 +349,10 @@ func (p *peerConnection) Lacks(hash common.Hash) bool { // peerSet represents the collection of active peer participating in the chain // download procedure. type peerSet struct { - peers map[string]*peerConnection - newPeerFeed event.Feed - lock sync.RWMutex + peers map[string]*peerConnection + newPeerFeed event.Feed + peerDropFeed event.Feed + lock sync.RWMutex } // newPeerSet creates a new peer set top track the active download sources. @@ -361,10 +362,16 @@ func newPeerSet() *peerSet { } } +// SubscribeNewPeers subscribes to peer arrival events. func (ps *peerSet) SubscribeNewPeers(ch chan<- *peerConnection) event.Subscription { return ps.newPeerFeed.Subscribe(ch) } +// SubscribePeerDrops subscribes to peer departure events. +func (ps *peerSet) SubscribePeerDrops(ch chan<- *peerConnection) event.Subscription { + return ps.peerDropFeed.Subscribe(ch) +} + // Reset iterates over the current peer set, and resets each of the known peers // to prepare for a next batch of block retrieval. func (ps *peerSet) Reset() { @@ -419,12 +426,15 @@ func (ps *peerSet) Register(p *peerConnection) error { // actions to/from that particular entity. func (ps *peerSet) Unregister(id string) error { ps.lock.Lock() - defer ps.lock.Unlock() - - if _, ok := ps.peers[id]; !ok { + p, ok := ps.peers[id] + if !ok { + defer ps.lock.Unlock() return errNotRegistered } delete(ps.peers, id) + ps.lock.Unlock() + + ps.peerDropFeed.Send(p) return nil } diff --git a/eth/downloader/statesync.go b/eth/downloader/statesync.go index eb5416f63c..a0b05c9be6 100644 --- a/eth/downloader/statesync.go +++ b/eth/downloader/statesync.go @@ -40,6 +40,7 @@ type stateReq struct { timer *time.Timer // Timer to fire when the RTT timeout expires peer *peerConnection // Peer that we're requesting from response [][]byte // Response data of the peer (nil for timeouts) + dropped bool // Flag whether the peer dropped off early } // timedOut returns if this request timed out. @@ -105,6 +106,11 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync { go s.run() defer s.Cancel() + // Listen for peer departure events to cancel assigned tasks + peerDrop := make(chan *peerConnection, 1024) + peerSub := s.d.peers.SubscribePeerDrops(peerDrop) + defer peerSub.Unsubscribe() + for { // Enable sending of the first buffered element if there is one. var ( @@ -143,6 +149,20 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync { finished = append(finished, req) delete(active, pack.PeerId()) + // Handle dropped peer connections: + case p := <-peerDrop: + // Skip if no request is currently pending + req := active[p.id] + if req == nil { + continue + } + // Finalize the request and queue up for processing + req.timer.Stop() + req.dropped = true + + finished = append(finished, req) + delete(active, p.id) + // Handle timed-out requests: case req := <-timeout: // If the peer is already requesting something else, ignore the stale timeout. @@ -167,6 +187,9 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync { log.Warn("Busy peer assigned new state fetch", "peer", old.peer.id) // Make sure the previous one doesn't get siletly lost + old.timer.Stop() + old.dropped = true + finished = append(finished, old) } // Start a timer to notify the sync loop if the peer stalled. @@ -269,9 +292,9 @@ func (s *stateSync) loop() error { return errCancelStateFetch case req := <-s.deliver: - // Response or timeout triggered, drop the peer if stalling - log.Trace("Received node data response", "peer", req.peer.id, "count", len(req.response), "timeout", req.timedOut()) - if len(req.items) <= 2 && req.timedOut() { + // Response, disconnect or timeout triggered, drop the peer if stalling + log.Trace("Received node data response", "peer", req.peer.id, "count", len(req.response), "dropped", req.dropped, "timeout", !req.dropped && req.timedOut()) + if len(req.items) <= 2 && !req.dropped && req.timedOut() { // 2 items are the minimum requested, if even that times out, we've no use of // this peer at the moment. log.Warn("Stalling state sync, dropping peer", "peer", req.peer.id) From 72af509abe8e77ecbc7a1aee344c6dbc6992de66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 13 Sep 2017 11:25:50 +0300 Subject: [PATCH 158/272] params: add Infura bootnode to Rinkeby --- params/bootnodes.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/params/bootnodes.go b/params/bootnodes.go index 6c6c02f8cf..82ab6d48c2 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -41,12 +41,14 @@ var TestnetBootnodes = []string{ // Rinkeby test network. var RinkebyBootnodes = []string{ "enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303", // IE + "enode://343149e4feefa15d882d9fe4ac7d88f885bd05ebb735e547f12e12080a9fa07c8014ca6fd7f373123488102fe5e34111f8509cf0b7de3f5b44339c9f25e87cb8@52.3.158.184:30303", // INFURA } // RinkebyV5Bootnodes are the enode URLs of the P2P bootstrap nodes running on the // Rinkeby test network for the experimental RLPx v5 topic-discovery network. var RinkebyV5Bootnodes = []string{ "enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303?discport=30304", // IE + "enode://343149e4feefa15d882d9fe4ac7d88f885bd05ebb735e547f12e12080a9fa07c8014ca6fd7f373123488102fe5e34111f8509cf0b7de3f5b44339c9f25e87cb8@52.3.158.184:30303?discport=30304", // INFURA } // DiscoveryV5Bootnodes are the enode URLs of the P2P bootstrap nodes for the From 5bbd7fb390a539a7183bccc5f2b75b4e564ed398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 14 Sep 2017 10:07:31 +0300 Subject: [PATCH 159/272] consensus, core, params: rebrand Metro to Byzantium --- consensus/ethash/consensus.go | 20 +++++----- core/state_processor.go | 2 +- core/types/receipt.go | 2 +- core/vm/contracts.go | 6 +-- core/vm/contracts_test.go | 4 +- core/vm/evm.go | 8 ++-- core/vm/gas_table.go | 2 +- core/vm/interpreter.go | 6 +-- core/vm/jump_table.go | 12 +++--- params/config.go | 72 +++++++++++++++++------------------ tests/init.go | 26 ++++++------- tests/transaction_test.go | 12 +++--- 12 files changed, 86 insertions(+), 86 deletions(-) diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index b714204458..6a19d449f3 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -36,9 +36,9 @@ import ( // Ethash proof-of-work protocol constants. var ( - frontierBlockReward *big.Int = big.NewInt(5e+18) // Block reward in wei for successfully mining a block - metropolisBlockReward *big.Int = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Metropolis - maxUncles = 2 // Maximum number of uncles allowed in a single block + frontierBlockReward *big.Int = big.NewInt(5e+18) // Block reward in wei for successfully mining a block + byzantiumBlockReward *big.Int = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Byzantium + maxUncles = 2 // Maximum number of uncles allowed in a single block ) // Various error messages to mark blocks invalid. These should be private to @@ -290,8 +290,8 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent * func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int { next := new(big.Int).Add(parent.Number, big1) switch { - case config.IsMetropolis(next): - return calcDifficultyMetropolis(time, parent) + case config.IsByzantium(next): + return calcDifficultyByzantium(time, parent) case config.IsHomestead(next): return calcDifficultyHomestead(time, parent) default: @@ -310,10 +310,10 @@ var ( big2999999 = big.NewInt(2999999) ) -// calcDifficultyMetropolis is the difficulty adjustment algorithm. It returns +// calcDifficultyByzantium is the difficulty adjustment algorithm. It returns // the difficulty that a new block should have when created at time given the -// parent block's time and difficulty. The calculation uses the Metropolis rules. -func calcDifficultyMetropolis(time uint64, parent *types.Header) *big.Int { +// parent block's time and difficulty. The calculation uses the Byzantium rules. +func calcDifficultyByzantium(time uint64, parent *types.Header) *big.Int { // https://github.com/ethereum/EIPs/issues/100. // algorithm: // diff = (parent_diff + @@ -530,8 +530,8 @@ var ( func AccumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) { // Select the correct block reward based on chain progression blockReward := frontierBlockReward - if config.IsMetropolis(header.Number) { - blockReward = metropolisBlockReward + if config.IsByzantium(header.Number) { + blockReward = byzantiumBlockReward } // Accumulate the rewards for the miner and any included uncles reward := new(big.Int).Set(blockReward) diff --git a/core/state_processor.go b/core/state_processor.go index 4115eab8cb..689c83785f 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -105,7 +105,7 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common // Update the state with pending changes var root []byte - if config.IsMetropolis(header.Number) { + if config.IsByzantium(header.Number) { statedb.Finalise(true) } else { root = statedb.IntermediateRoot(config.IsEIP158(header.Number)).Bytes() diff --git a/core/types/receipt.go b/core/types/receipt.go index 4f3b7357ed..e179fe0cfd 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -79,7 +79,7 @@ func NewReceipt(root []byte, failed bool, cumulativeGasUsed *big.Int) *Receipt { } // EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt -// into an RLP stream. If no post state is present, metropolis fork is assumed. +// into an RLP stream. If no post state is present, byzantium fork is assumed. func (r *Receipt) EncodeRLP(w io.Writer) error { return rlp.Encode(w, &receiptRLP{r.statusEncoding(), r.CumulativeGasUsed, r.Bloom, r.Logs}) } diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 790d42bbe6..7344b6043c 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -46,9 +46,9 @@ var PrecompiledContractsHomestead = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{4}): &dataCopy{}, } -// PrecompiledContractsMetropolis contains the default set of pre-compiled Ethereum -// contracts used in the Metropolis release. -var PrecompiledContractsMetropolis = map[common.Address]PrecompiledContract{ +// PrecompiledContractsByzantium contains the default set of pre-compiled Ethereum +// contracts used in the Byzantium release. +var PrecompiledContractsByzantium = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{1}): &ecrecover{}, common.BytesToAddress([]byte{2}): &sha256hash{}, common.BytesToAddress([]byte{3}): &ripemd160hash{}, diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 880d7324ae..513651835a 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -321,7 +321,7 @@ var bn256PairingTests = []precompiledTest{ } func testPrecompiled(addr string, test precompiledTest, t *testing.T) { - p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] + p := PrecompiledContractsByzantium[common.HexToAddress(addr)] in := common.Hex2Bytes(test.input) contract := NewContract(AccountRef(common.HexToAddress("1337")), nil, new(big.Int), p.RequiredGas(in)) @@ -338,7 +338,7 @@ func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { if test.noBenchmark { return } - p := PrecompiledContractsMetropolis[common.HexToAddress(addr)] + p := PrecompiledContractsByzantium[common.HexToAddress(addr)] in := common.Hex2Bytes(test.input) reqGas := p.RequiredGas(in) contract := NewContract(AccountRef(common.HexToAddress("1337")), diff --git a/core/vm/evm.go b/core/vm/evm.go index 495d9beea1..b0a6f3d269 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -41,8 +41,8 @@ type ( func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, error) { if contract.CodeAddr != nil { precompiles := PrecompiledContractsHomestead - if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { - precompiles = PrecompiledContractsMetropolis + if evm.ChainConfig().IsByzantium(evm.BlockNumber) { + precompiles = PrecompiledContractsByzantium } if p := precompiles[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) @@ -151,8 +151,8 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas ) if !evm.StateDB.Exist(addr) { precompiles := PrecompiledContractsHomestead - if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { - precompiles = PrecompiledContractsMetropolis + if evm.ChainConfig().IsByzantium(evm.BlockNumber) { + precompiles = PrecompiledContractsByzantium } if precompiles[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 { return nil, gas, nil diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 13712295c9..0d8e295a52 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -324,7 +324,7 @@ func gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem eip158 = evm.ChainConfig().IsEIP158(evm.BlockNumber) ) if eip158 { - if transfersValue && evm.StateDB.Empty(address) { + if transfersValue && evm.StateDB.Empty(address) { gas += params.CallNewAccountGas } } else if !evm.StateDB.Exist(address) { diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index d3e24a7a45..b0d796a44b 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -70,8 +70,8 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { // we'll set the default jump table. if !cfg.JumpTable[STOP].valid { switch { - case evm.ChainConfig().IsMetropolis(evm.BlockNumber): - cfg.JumpTable = metropolisInstructionSet + case evm.ChainConfig().IsByzantium(evm.BlockNumber): + cfg.JumpTable = byzantiumInstructionSet case evm.ChainConfig().IsHomestead(evm.BlockNumber): cfg.JumpTable = homesteadInstructionSet default: @@ -88,7 +88,7 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { } func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { - if in.evm.chainRules.IsMetropolis { + if in.evm.chainRules.IsByzantium { if in.readOnly { // If the interpreter is operating in readonly mode, make sure no // state-modifying operation is performed. The 3rd stack item diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index f0a922912f..9ef192fdf9 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -51,14 +51,14 @@ type operation struct { } var ( - frontierInstructionSet = NewFrontierInstructionSet() - homesteadInstructionSet = NewHomesteadInstructionSet() - metropolisInstructionSet = NewMetropolisInstructionSet() + frontierInstructionSet = NewFrontierInstructionSet() + homesteadInstructionSet = NewHomesteadInstructionSet() + byzantiumInstructionSet = NewByzantiumInstructionSet() ) -// NewMetropolisInstructionSet returns the frontier, homestead and -// metropolis instructions. -func NewMetropolisInstructionSet() [256]operation { +// NewByzantiumInstructionSet returns the frontier, homestead and +// byzantium instructions. +func NewByzantiumInstructionSet() [256]operation { // instructions that can be executed during the homestead phase. instructionSet := NewHomesteadInstructionSet() instructionSet[STATICCALL] = operation{ diff --git a/params/config.go b/params/config.go index f4bb6172ba..324620ad5c 100644 --- a/params/config.go +++ b/params/config.go @@ -32,45 +32,45 @@ var ( var ( // MainnetChainConfig is the chain parameters to run a node on the main network. MainnetChainConfig = &ChainConfig{ - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(1150000), - DAOForkBlock: big.NewInt(1920000), - DAOForkSupport: true, - EIP150Block: big.NewInt(2463000), - EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), - EIP155Block: big.NewInt(2675000), - EIP158Block: big.NewInt(2675000), - MetropolisBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(1150000), + DAOForkBlock: big.NewInt(1920000), + DAOForkSupport: true, + EIP150Block: big.NewInt(2463000), + EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), + EIP155Block: big.NewInt(2675000), + EIP158Block: big.NewInt(2675000), + ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet Ethash: new(EthashConfig), } // TestnetChainConfig contains the chain parameters to run a node on the Ropsten test network. TestnetChainConfig = &ChainConfig{ - ChainId: big.NewInt(3), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(0), - EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), - EIP155Block: big.NewInt(10), - EIP158Block: big.NewInt(10), - MetropolisBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ChainId: big.NewInt(3), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Block: big.NewInt(0), + EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), + EIP155Block: big.NewInt(10), + EIP158Block: big.NewInt(10), + ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet Ethash: new(EthashConfig), } // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. RinkebyChainConfig = &ChainConfig{ - ChainId: big.NewInt(4), - HomesteadBlock: big.NewInt(1), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(2), - EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), - EIP155Block: big.NewInt(3), - EIP158Block: big.NewInt(3), - MetropolisBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ChainId: big.NewInt(4), + HomesteadBlock: big.NewInt(1), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Block: big.NewInt(2), + EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), + EIP155Block: big.NewInt(3), + EIP158Block: big.NewInt(3), + ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet Clique: &CliqueConfig{ Period: 15, @@ -110,7 +110,7 @@ type ChainConfig struct { EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block - MetropolisBlock *big.Int `json:"metropolisBlock,omitempty"` // Metropolis switch block (nil = no fork, 0 = alraedy on homestead) + ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = alraedy on homestead) // Various consensus engines Ethash *EthashConfig `json:"ethash,omitempty"` @@ -147,7 +147,7 @@ func (c *ChainConfig) String() string { default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Metropolis: %v Engine: %v}", + return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Engine: %v}", c.ChainId, c.HomesteadBlock, c.DAOForkBlock, @@ -155,7 +155,7 @@ func (c *ChainConfig) String() string { c.EIP150Block, c.EIP155Block, c.EIP158Block, - c.MetropolisBlock, + c.ByzantiumBlock, engine, ) } @@ -182,8 +182,8 @@ func (c *ChainConfig) IsEIP158(num *big.Int) bool { return isForked(c.EIP158Block, num) } -func (c *ChainConfig) IsMetropolis(num *big.Int) bool { - return isForked(c.MetropolisBlock, num) +func (c *ChainConfig) IsByzantium(num *big.Int) bool { + return isForked(c.ByzantiumBlock, num) } // GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice). @@ -243,8 +243,8 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi if c.IsEIP158(head) && !configNumEqual(c.ChainId, newcfg.ChainId) { return newCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block) } - if isForkIncompatible(c.MetropolisBlock, newcfg.MetropolisBlock, head) { - return newCompatError("Metropolis fork block", c.MetropolisBlock, newcfg.MetropolisBlock) + if isForkIncompatible(c.ByzantiumBlock, newcfg.ByzantiumBlock, head) { + return newCompatError("Byzantium fork block", c.ByzantiumBlock, newcfg.ByzantiumBlock) } return nil } @@ -312,7 +312,7 @@ func (err *ConfigCompatError) Error() string { type Rules struct { ChainId *big.Int IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool - IsMetropolis bool + IsByzantium bool } func (c *ChainConfig) Rules(num *big.Int) Rules { @@ -320,5 +320,5 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { if chainId == nil { chainId = new(big.Int) } - return Rules{ChainId: new(big.Int).Set(chainId), IsHomestead: c.IsHomestead(num), IsEIP150: c.IsEIP150(num), IsEIP155: c.IsEIP155(num), IsEIP158: c.IsEIP158(num), IsMetropolis: c.IsMetropolis(num)} + return Rules{ChainId: new(big.Int).Set(chainId), IsHomestead: c.IsHomestead(num), IsEIP150: c.IsEIP150(num), IsEIP155: c.IsEIP155(num), IsEIP158: c.IsEIP158(num), IsByzantium: c.IsByzantium(num)} } diff --git a/tests/init.go b/tests/init.go index 0c3fe61d13..a2c633ad67 100644 --- a/tests/init.go +++ b/tests/init.go @@ -45,13 +45,13 @@ var Forks = map[string]*params.ChainConfig{ EIP158Block: big.NewInt(0), }, "Byzantium": ¶ms.ChainConfig{ - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - DAOForkBlock: big.NewInt(0), - MetropolisBlock: big.NewInt(0), + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), }, "FrontierToHomesteadAt5": ¶ms.ChainConfig{ ChainId: big.NewInt(1), @@ -69,12 +69,12 @@ var Forks = map[string]*params.ChainConfig{ DAOForkSupport: true, }, "EIP158ToByzantiumAt5": ¶ms.ChainConfig{ - ChainId: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - MetropolisBlock: big.NewInt(5), + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(5), }, } diff --git a/tests/transaction_test.go b/tests/transaction_test.go index 72d43c0ece..c743996c2a 100644 --- a/tests/transaction_test.go +++ b/tests/transaction_test.go @@ -37,12 +37,12 @@ func TestTransaction(t *testing.T) { EIP158Block: big.NewInt(0), ChainId: big.NewInt(1), }) - txt.config(`^Metropolis/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - MetropolisBlock: big.NewInt(0), + txt.config(`^Byzantium/`, params.ChainConfig{ + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), }) txt.walk(t, transactionTestDir, func(t *testing.T, name string, test *TransactionTest) { From 9be07de5396527eb527f3ca0dd402213c0008a3e Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Thu, 14 Sep 2017 09:35:54 +0200 Subject: [PATCH 160/272] params: Updated finalized gascosts for ECMUL/MODEXP (#15135) * params: Updated finalized gascosts for ECMUL/MODEXP * core,tests: Updates pending new tests * tests: Updated with new tests * core: revert state transition bugfix * tests: Add expected failures due to #15119 --- core/vm/evm.go | 6 +++--- params/protocol_params.go | 4 ++-- tests/block_test.go | 2 -- tests/state_test.go | 10 +++++++++- tests/testdata | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index b0a6f3d269..093c7d4c14 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -299,9 +299,6 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // Create creates a new contract using code as deployment code. func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { - if evm.vmConfig.NoRecursion && evm.depth > 0 { - return nil, common.Address{}, gas, nil - } // Depth check execution. Fail if we're trying to execute above the // limit. @@ -334,6 +331,9 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I contract := NewContract(caller, AccountRef(contractAddr), value, gas) contract.SetCallCode(&contractAddr, crypto.Keccak256Hash(code), code) + if evm.vmConfig.NoRecursion && evm.depth > 0 { + return nil, contractAddr, gas, nil + } ret, err = run(evm, snapshot, contract, nil) // check whether the max code size has been exceeded maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize diff --git a/params/protocol_params.go b/params/protocol_params.go index 9c84c7d348..c56faf56f8 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -64,9 +64,9 @@ const ( Ripemd160PerWordGas uint64 = 120 // Per-word price for a RIPEMD160 operation IdentityBaseGas uint64 = 15 // Base price for a data copy operation IdentityPerWordGas uint64 = 3 // Per-work price for a data copy operation - ModExpQuadCoeffDiv uint64 = 100 // Divisor for the quadratic particle of the big int modular exponentiation + ModExpQuadCoeffDiv uint64 = 20 // Divisor for the quadratic particle of the big int modular exponentiation Bn256AddGas uint64 = 500 // Gas needed for an elliptic curve addition - Bn256ScalarMulGas uint64 = 2000 // Gas needed for an elliptic curve scalar multiplication + Bn256ScalarMulGas uint64 = 40000 // Gas needed for an elliptic curve scalar multiplication Bn256PairingBaseGas uint64 = 100000 // Base price for an elliptic curve pairing check Bn256PairingPerPointGas uint64 = 80000 // Per-point price for an elliptic curve pairing check ) diff --git a/tests/block_test.go b/tests/block_test.go index 56e1e1e8da..669d3ca08a 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -32,8 +32,6 @@ func TestBlockchain(t *testing.T) { bt.skipLoad(`^bcTotalDifficultyTest/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)`) // Constantinople is not implemented yet. bt.skipLoad(`(?i)(constantinople)`) - // Expected failures: - bt.fails(`^TransitionTests/bcHomesteadToDao/DaoTransactions(|_UncleExtradata|_EmptyTransactionAndForkBlocksAhead)\.json`, "issue in test") // Still failing tests bt.skipLoad(`^bcWalletTest.*_Byzantium$`) diff --git a/tests/state_test.go b/tests/state_test.go index 1fb7f5908f..9a7430fbeb 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -39,6 +39,13 @@ func TestState(t *testing.T) { st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/Byzantium`, "bug in test") + st.fails( `^stRandom/randomStatetest645\.json/EIP150/.*`, "known bug #15119") + st.fails( `^stRandom/randomStatetest645\.json/Frontier/.*`, "known bug #15119") + st.fails( `^stRandom/randomStatetest645\.json/Homestead/.*`, "known bug #15119") + st.fails( `^stRandom/randomStatetest644\.json/EIP150/.*`, "known bug #15119") + st.fails( `^stRandom/randomStatetest644\.json/Frontier/.*`, "known bug #15119") + st.fails( `^stRandom/randomStatetest644\.json/Homestead/.*`, "known bug #15119") + st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { for _, subtest := range test.Subtests() { @@ -59,7 +66,8 @@ func TestState(t *testing.T) { } // Transactions with gasLimit above this value will not get a VM trace on failure. -const traceErrorLimit = 400000 +//const traceErrorLimit = 400000 +const traceErrorLimit = 0 func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { err := test(vm.Config{}) diff --git a/tests/testdata b/tests/testdata index 1d30b47956..ca41e90635 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 1d30b4795664f64b1b157971754e14a10cfd9115 +Subproject commit ca41e906351209481bce3a1b35501f25a79023c5 From 701d60c889f885b3995122a5f9bb9656b75857bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 14 Sep 2017 10:59:05 +0300 Subject: [PATCH 161/272] params: enable Byzantium on Ropsten/tests, fix failures --- core/blockchain_test.go | 2 +- core/dao_test.go | 36 ++++++++++++++++++++++-------------- params/config.go | 6 +++--- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 700a30a16f..cb1df8d4b0 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -928,7 +928,7 @@ func TestReorgSideEvent(t *testing.T) { replacementBlocks, _ := GenerateChain(gspec.Config, genesis, db, 4, func(i int, gen *BlockGen) { tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), big.NewInt(1000000), new(big.Int), nil), signer, key1) if i == 2 { - gen.OffsetTime(-1) + gen.OffsetTime(-9) } if err != nil { t.Fatalf("failed to create tx: %v", err) diff --git a/core/dao_test.go b/core/dao_test.go index d6e11d78ae..b9898ff7c8 100644 --- a/core/dao_test.go +++ b/core/dao_test.go @@ -40,14 +40,22 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Create the concurrent, conflicting two nodes proDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(proDb) - proConf := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(0), DAOForkBlock: forkBlock, DAOForkSupport: true} - proBc, _ := NewBlockChain(proDb, proConf, ethash.NewFaker(), vm.Config{}) + + proConf := *params.TestChainConfig + proConf.DAOForkBlock = forkBlock + proConf.DAOForkSupport = true + + proBc, _ := NewBlockChain(proDb, &proConf, ethash.NewFaker(), vm.Config{}) defer proBc.Stop() conDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(conDb) - conConf := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(0), DAOForkBlock: forkBlock, DAOForkSupport: false} - conBc, _ := NewBlockChain(conDb, conConf, ethash.NewFaker(), vm.Config{}) + + conConf := *params.TestChainConfig + conConf.DAOForkBlock = forkBlock + conConf.DAOForkSupport = false + + conBc, _ := NewBlockChain(conDb, &conConf, ethash.NewFaker(), vm.Config{}) defer conBc.Stop() if _, err := proBc.InsertChain(prefix); err != nil { @@ -61,7 +69,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Create a pro-fork block, and try to feed into the no-fork chain db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), vm.Config{}) + bc, _ := NewBlockChain(db, &conConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) @@ -71,19 +79,19 @@ func TestDAOForkRangeExtradata(t *testing.T) { if _, err := bc.InsertChain(blocks); err != nil { t.Fatalf("failed to import contra-fork chain for expansion: %v", err) } - blocks, _ = GenerateChain(proConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) + blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) if _, err := conBc.InsertChain(blocks); err == nil { t.Fatalf("contra-fork chain accepted pro-fork block: %v", blocks[0]) } // Create a proper no-fork block for the contra-forker - blocks, _ = GenerateChain(conConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) + blocks, _ = GenerateChain(&conConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) if _, err := conBc.InsertChain(blocks); err != nil { t.Fatalf("contra-fork chain didn't accepted no-fork block: %v", err) } // Create a no-fork block, and try to feed into the pro-fork chain db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), vm.Config{}) + bc, _ = NewBlockChain(db, &proConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) @@ -93,12 +101,12 @@ func TestDAOForkRangeExtradata(t *testing.T) { if _, err := bc.InsertChain(blocks); err != nil { t.Fatalf("failed to import pro-fork chain for expansion: %v", err) } - blocks, _ = GenerateChain(conConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) + blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) if _, err := proBc.InsertChain(blocks); err == nil { t.Fatalf("pro-fork chain accepted contra-fork block: %v", blocks[0]) } // Create a proper pro-fork block for the pro-forker - blocks, _ = GenerateChain(proConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) + blocks, _ = GenerateChain(&proConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) if _, err := proBc.InsertChain(blocks); err != nil { t.Fatalf("pro-fork chain didn't accepted pro-fork block: %v", err) } @@ -106,7 +114,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Verify that contra-forkers accept pro-fork extra-datas after forking finishes db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - bc, _ := NewBlockChain(db, conConf, ethash.NewFaker(), vm.Config{}) + bc, _ := NewBlockChain(db, &conConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64())) @@ -116,14 +124,14 @@ func TestDAOForkRangeExtradata(t *testing.T) { if _, err := bc.InsertChain(blocks); err != nil { t.Fatalf("failed to import contra-fork chain for expansion: %v", err) } - blocks, _ = GenerateChain(proConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) + blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) if _, err := conBc.InsertChain(blocks); err != nil { t.Fatalf("contra-fork chain didn't accept pro-fork block post-fork: %v", err) } // Verify that pro-forkers accept contra-fork extra-datas after forking finishes db, _ = ethdb.NewMemDatabase() gspec.MustCommit(db) - bc, _ = NewBlockChain(db, proConf, ethash.NewFaker(), vm.Config{}) + bc, _ = NewBlockChain(db, &proConf, ethash.NewFaker(), vm.Config{}) defer bc.Stop() blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64())) @@ -133,7 +141,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { if _, err := bc.InsertChain(blocks); err != nil { t.Fatalf("failed to import pro-fork chain for expansion: %v", err) } - blocks, _ = GenerateChain(conConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) + blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {}) if _, err := proBc.InsertChain(blocks); err != nil { t.Fatalf("pro-fork chain didn't accept contra-fork block post-fork: %v", err) } diff --git a/params/config.go b/params/config.go index 324620ad5c..5c6f0b6bf7 100644 --- a/params/config.go +++ b/params/config.go @@ -55,7 +55,7 @@ var ( EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), EIP155Block: big.NewInt(10), EIP158Block: big.NewInt(10), - ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ByzantiumBlock: big.NewInt(1700000), Ethash: new(EthashConfig), } @@ -86,8 +86,8 @@ var ( // means that all fields must be set at all times. This forces // anyone adding flags to the config to also have to set these // fields. - AllProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(math.MaxInt64) /*disabled*/, new(EthashConfig), nil} - TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), nil, new(EthashConfig), nil} + AllProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil} + TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil} TestRules = TestChainConfig.Rules(new(big.Int)) ) From 6c6c7b2af3efdad4d2f64f70f3a724af434bbcd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 14 Sep 2017 13:55:42 +0300 Subject: [PATCH 162/272] params: release Geth 1.7.0 - Megara --- params/version.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params/version.go b/params/version.go index 0896662606..b43cecf704 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 0 // Patch version component of the current release - VersionMeta = "unstable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 0 // Patch version component of the current release + VersionMeta = "stable" // Version metadata to append to the version string ) // Version holds the textual version string. From a989cf5bad3ec7661c1df17df6a67b6b340274d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 14 Sep 2017 14:01:31 +0300 Subject: [PATCH 163/272] VERSION, params: begin 1.7.1 release cycle --- VERSION | 2 +- params/version.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index bd8bf882d0..943f9cbc4e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.7.0 +1.7.1 diff --git a/params/version.go b/params/version.go index b43cecf704..80329c91d9 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 0 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 1 // Patch version component of the current release + VersionMeta = "unstable" // Version metadata to append to the version string ) // Version holds the textual version string. From 5705ad004e01054c6aac173348b74c1097b40ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 14 Sep 2017 14:01:44 +0300 Subject: [PATCH 164/272] containers/docker: bump docker images to 1.7 release branch --- containers/docker/master-alpine/Dockerfile | 2 +- containers/docker/master-ubuntu/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/docker/master-alpine/Dockerfile b/containers/docker/master-alpine/Dockerfile index b2467f1a78..44402361d7 100644 --- a/containers/docker/master-alpine/Dockerfile +++ b/containers/docker/master-alpine/Dockerfile @@ -2,7 +2,7 @@ FROM alpine:3.5 RUN \ apk add --update go git make gcc musl-dev linux-headers ca-certificates && \ - git clone --depth 1 --branch release/1.6 https://github.com/ethereum/go-ethereum && \ + git clone --depth 1 --branch release/1.7 https://github.com/ethereum/go-ethereum && \ (cd go-ethereum && make geth) && \ cp go-ethereum/build/bin/geth /geth && \ apk del go git make gcc musl-dev linux-headers && \ diff --git a/containers/docker/master-ubuntu/Dockerfile b/containers/docker/master-ubuntu/Dockerfile index 877ae94e99..cc4fad10c4 100644 --- a/containers/docker/master-ubuntu/Dockerfile +++ b/containers/docker/master-ubuntu/Dockerfile @@ -3,7 +3,7 @@ FROM ubuntu:xenial RUN \ apt-get update && apt-get upgrade -q -y && \ apt-get install -y --no-install-recommends golang git make gcc libc-dev ca-certificates && \ - git clone --depth 1 --branch release/1.5 https://github.com/ethereum/go-ethereum && \ + git clone --depth 1 --branch release/1.7 https://github.com/ethereum/go-ethereum && \ (cd go-ethereum && make geth) && \ cp go-ethereum/build/bin/geth /geth && \ apt-get remove -y golang git make gcc libc-dev && apt autoremove -y && apt-get clean && \ From c197d805f71ea45eaed7f8c692401502ba92d978 Mon Sep 17 00:00:00 2001 From: Kyuntae Ethan Kim Date: Fri, 15 Sep 2017 18:30:17 +0900 Subject: [PATCH 165/272] ethereum: fix typos in interfaces.go (#15149) --- interfaces.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces.go b/interfaces.go index 744f07b95a..67f236ef75 100644 --- a/interfaces.go +++ b/interfaces.go @@ -102,7 +102,7 @@ type SyncProgress struct { CurrentBlock uint64 // Current block number where sync is at HighestBlock uint64 // Highest alleged block number in the chain PulledStates uint64 // Number of state trie entries already downloaded - KnownStates uint64 // Total number os state trie entries known about + KnownStates uint64 // Total number of state trie entries known about } // ChainSyncReader wraps access to the node's current sync status. If there's no @@ -129,7 +129,7 @@ type ContractCaller interface { CallContract(ctx context.Context, call CallMsg, blockNumber *big.Int) ([]byte, error) } -// FilterQuery contains options for contact log filtering. +// FilterQuery contains options for contract log filtering. type FilterQuery struct { FromBlock *big.Int // beginning of the queried range, nil means genesis block ToBlock *big.Int // end of the range, nil means latest block From 019dca9ba2f0ad91047129b95d91b95a9e71650e Mon Sep 17 00:00:00 2001 From: Dave Appleton Date: Fri, 15 Sep 2017 21:20:29 +0800 Subject: [PATCH 166/272] accounts/abi/backends: add AdjustTime (#15077) --- accounts/abi/bind/backends/simulated.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 88fb3331e8..d6d16eb3f9 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -22,6 +22,7 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -284,6 +285,22 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa return nil } +// JumpTimeInSeconds adds skip seconds to the clock +func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error { + b.mu.Lock() + defer b.mu.Unlock() + blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), b.database, 1, func(number int, block *core.BlockGen) { + for _, tx := range b.pendingBlock.Transactions() { + block.AddTx(tx) + } + block.OffsetTime(int64(adjustment.Seconds())) + }) + b.pendingBlock = blocks[0] + b.pendingState, _ = state.New(b.pendingBlock.Root(), state.NewDatabase(b.database)) + + return nil +} + // callmsg implements core.Message to allow passing it as a transaction simulator. type callmsg struct { ethereum.CallMsg From dc17fa6b18c74397139dcfb79b3d05d3629f8e7d Mon Sep 17 00:00:00 2001 From: Davor Kapsa Date: Mon, 18 Sep 2017 23:07:02 +0200 Subject: [PATCH 167/272] travis.yml: update go versions (#15154) --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index a972668c95..8a7f65e3d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.7.6 + go: 1.7.x script: - sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install fuse - sudo modprobe fuse @@ -18,7 +18,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.8.3 + go: 1.8.x script: - sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install fuse - sudo modprobe fuse @@ -31,7 +31,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.9.0 + go: 1.9.x script: - sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install fuse - sudo modprobe fuse @@ -41,7 +41,7 @@ matrix: - go run build/ci.go test -coverage -misspell - os: osx - go: 1.9.0 + go: 1.9.x sudo: required script: - brew update @@ -54,7 +54,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.9.0 + go: 1.9.x env: - ubuntu-ppa - azure-linux @@ -93,7 +93,7 @@ matrix: sudo: required services: - docker - go: 1.9.0 + go: 1.9.x env: - azure-linux-mips script: @@ -150,7 +150,7 @@ matrix: # This builder does the OSX Azure, iOS CocoaPods and iOS Azure uploads - os: osx - go: 1.9.0 + go: 1.9.x env: - azure-osx - azure-ios @@ -176,7 +176,7 @@ matrix: - os: linux dist: trusty sudo: required - go: 1.9.0 + go: 1.9.x env: - azure-purge script: From a92d8a26547c138953665387c57168e68bacdd13 Mon Sep 17 00:00:00 2001 From: Paul Litvak Date: Tue, 19 Sep 2017 00:07:19 +0300 Subject: [PATCH 168/272] trie: fix typo (#15152) --- trie/hasher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trie/hasher.go b/trie/hasher.go index 672456e2d9..4719aabf62 100644 --- a/trie/hasher.go +++ b/trie/hasher.go @@ -76,7 +76,7 @@ func (h *hasher) hash(n node, db DatabaseWriter, force bool) (node, node, error) if err != nil { return hashNode{}, n, err } - // Cache the hash of the ndoe for later reuse and remove + // Cache the hash of the node for later reuse and remove // the dirty flag in commit mode. It's fine to assign these values directly // without copying the node first because hashChildren copies it. cachedHash, _ := hashed.(hashNode) From cb5235eb0767c4de4ba6cc94cf8283421b2179c1 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 19 Sep 2017 06:28:15 -0500 Subject: [PATCH 169/272] miner: make starting of CPU agent more reliable (#15148) --- miner/agent.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/miner/agent.go b/miner/agent.go index 855892a07d..e3cebbd2e2 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -53,7 +53,19 @@ func (self *CpuAgent) Work() chan<- *Work { return self.workCh } func (self *CpuAgent) SetReturnCh(ch chan<- *Result) { self.returnCh = ch } func (self *CpuAgent) Stop() { + if !atomic.CompareAndSwapInt32(&self.isMining, 1, 0) { + return // agent already stopped + } self.stop <- struct{}{} +done: + // Empty work channel + for { + select { + case <-self.workCh: + default: + break done + } + } } func (self *CpuAgent) Start() { @@ -85,17 +97,6 @@ out: break out } } - -done: - // Empty work channel - for { - select { - case <-self.workCh: - default: - break done - } - } - atomic.StoreInt32(&self.isMining, 0) } func (self *CpuAgent) mine(work *Work, stop <-chan struct{}) { From b9ff44bd64b9e59806577239eb037f99aad5fff4 Mon Sep 17 00:00:00 2001 From: gary rong Date: Wed, 20 Sep 2017 17:27:00 +0800 Subject: [PATCH 170/272] params: rename EIP150 gas table (#15167) --- params/config.go | 2 +- params/gas_table.go | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/params/config.go b/params/config.go index 5c6f0b6bf7..fff168a8c2 100644 --- a/params/config.go +++ b/params/config.go @@ -197,7 +197,7 @@ func (c *ChainConfig) GasTable(num *big.Int) GasTable { case c.IsEIP158(num): return GasTableEIP158 case c.IsEIP150(num): - return GasTableHomesteadGasRepriceFork + return GasTableEIP150 default: return GasTableHomestead } diff --git a/params/gas_table.go b/params/gas_table.go index a060539041..4969382b1b 100644 --- a/params/gas_table.go +++ b/params/gas_table.go @@ -49,9 +49,7 @@ var ( // GasTableHomestead contain the gas re-prices for // the homestead phase. - // - // TODO rename to GasTableEIP150 - GasTableHomesteadGasRepriceFork = GasTable{ + GasTableEIP150 = GasTable{ ExtcodeSize: 700, ExtcodeCopy: 700, Balance: 400, From 3c8656347f67dbc8e57c663ec5c26d24c4151678 Mon Sep 17 00:00:00 2001 From: Ernesto del Toro Date: Wed, 20 Sep 2017 05:31:31 -0400 Subject: [PATCH 171/272] eth, internal/ethapi: fix spelling of 'Ethereum' (#15164) --- eth/api.go | 8 ++++---- eth/bind.go | 2 +- internal/ethapi/api.go | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/eth/api.go b/eth/api.go index a5b6e7076c..d64e4e6c75 100644 --- a/eth/api.go +++ b/eth/api.go @@ -51,7 +51,7 @@ type PublicEthereumAPI struct { e *Ethereum } -// NewPublicEthereumAPI creates a new Etheruem protocol API for full nodes. +// NewPublicEthereumAPI creates a new Ethereum protocol API for full nodes. func NewPublicEthereumAPI(e *Ethereum) *PublicEthereumAPI { return &PublicEthereumAPI{e} } @@ -205,7 +205,7 @@ func (api *PrivateMinerAPI) GetHashrate() uint64 { return uint64(api.e.miner.HashRate()) } -// PrivateAdminAPI is the collection of Etheruem full node-related APIs +// PrivateAdminAPI is the collection of Ethereum full node-related APIs // exposed over the private admin endpoint. type PrivateAdminAPI struct { eth *Ethereum @@ -298,7 +298,7 @@ func (api *PrivateAdminAPI) ImportChain(file string) (bool, error) { return true, nil } -// PublicDebugAPI is the collection of Etheruem full node APIs exposed +// PublicDebugAPI is the collection of Ethereum full node APIs exposed // over the public debugging endpoint. type PublicDebugAPI struct { eth *Ethereum @@ -335,7 +335,7 @@ func (api *PublicDebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error return stateDb.RawDump(), nil } -// PrivateDebugAPI is the collection of Etheruem full node APIs exposed over +// PrivateDebugAPI is the collection of Ethereum full node APIs exposed over // the private debugging endpoint. type PrivateDebugAPI struct { config *params.ChainConfig diff --git a/eth/bind.go b/eth/bind.go index 0385db1f9f..d09977dbc2 100644 --- a/eth/bind.go +++ b/eth/bind.go @@ -43,7 +43,7 @@ type ContractBackend struct { } // NewContractBackend creates a new native contract backend using an existing -// Etheruem object. +// Ethereum object. func NewContractBackend(apiBackend ethapi.Backend) *ContractBackend { return &ContractBackend{ eapi: ethapi.NewPublicEthereumAPI(apiBackend), diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 0775749e70..6eb37e6840 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -54,7 +54,7 @@ type PublicEthereumAPI struct { b Backend } -// NewPublicEthereumAPI creates a new Etheruem protocol API. +// NewPublicEthereumAPI creates a new Ethereum protocol API. func NewPublicEthereumAPI(b Backend) *PublicEthereumAPI { return &PublicEthereumAPI{b} } @@ -448,7 +448,7 @@ type PublicBlockChainAPI struct { b Backend } -// NewPublicBlockChainAPI creates a new Etheruem blockchain API. +// NewPublicBlockChainAPI creates a new Ethereum blockchain API. func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI { return &PublicBlockChainAPI{b} } @@ -1275,7 +1275,7 @@ func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxAr return common.Hash{}, fmt.Errorf("Transaction %#x not found", matchTx.Hash()) } -// PublicDebugAPI is the collection of Etheruem APIs exposed over the public +// PublicDebugAPI is the collection of Ethereum APIs exposed over the public // debugging endpoint. type PublicDebugAPI struct { b Backend @@ -1318,7 +1318,7 @@ func (api *PublicDebugAPI) SeedHash(ctx context.Context, number uint64) (string, return fmt.Sprintf("0x%x", ethash.SeedHash(number)), nil } -// PrivateDebugAPI is the collection of Etheruem APIs exposed over the private +// PrivateDebugAPI is the collection of Ethereum APIs exposed over the private // debugging endpoint. type PrivateDebugAPI struct { b Backend From a0d783094ecb9622559606df0591c8f9dd4231b6 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 21 Sep 2017 20:44:46 +0200 Subject: [PATCH 172/272] core/state: revert log index when removing logs --- core/state/journal.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/state/journal.go b/core/state/journal.go index ddb76f1a2e..ddc819fe5f 100644 --- a/core/state/journal.go +++ b/core/state/journal.go @@ -132,6 +132,7 @@ func (ch addLogChange) undo(s *StateDB) { } else { s.logs[ch.txhash] = logs[:len(logs)-1] } + s.logSize-- } func (ch addPreimageChange) undo(s *StateDB) { From d558a595adf4e89bab5b28ffde1448dc1e5768b0 Mon Sep 17 00:00:00 2001 From: Zahoor Mohamed Date: Fri, 22 Sep 2017 01:52:51 +0530 Subject: [PATCH 173/272] swarm/storage: pyramid chunker re-write (#14382) --- .gitignore | 3 + swarm/network/depo.go | 4 +- swarm/storage/chunker.go | 93 +++-- swarm/storage/chunker_test.go | 386 ++++++++++++++++--- swarm/storage/common_test.go | 2 +- swarm/storage/dbstore.go | 4 +- swarm/storage/dbstore_test.go | 2 +- swarm/storage/localstore.go | 2 +- swarm/storage/netstore.go | 4 +- swarm/storage/pyramid.go | 707 +++++++++++++++++++++++++++------- swarm/storage/swarmhasher.go | 40 ++ swarm/storage/types.go | 22 +- 12 files changed, 1022 insertions(+), 247 deletions(-) create mode 100644 swarm/storage/swarmhasher.go diff --git a/.gitignore b/.gitignore index e53e461dc6..cb2c2d14da 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ build/_vendor/pkg # travis profile.tmp profile.cov + +# IdeaIDE +.idea diff --git a/swarm/network/depo.go b/swarm/network/depo.go index e76bfa66c5..8695bf5d98 100644 --- a/swarm/network/depo.go +++ b/swarm/network/depo.go @@ -29,12 +29,12 @@ import ( // Handler for storage/retrieval related protocol requests // implements the StorageHandler interface used by the bzz protocol type Depo struct { - hashfunc storage.Hasher + hashfunc storage.SwarmHasher localStore storage.ChunkStore netStore storage.ChunkStore } -func NewDepo(hash storage.Hasher, localStore, remoteStore storage.ChunkStore) *Depo { +func NewDepo(hash storage.SwarmHasher, localStore, remoteStore storage.ChunkStore) *Depo { return &Depo{ hashfunc: hash, localStore: localStore, diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go index ca85e43337..0454828b9c 100644 --- a/swarm/storage/chunker.go +++ b/swarm/storage/chunker.go @@ -20,9 +20,9 @@ import ( "encoding/binary" "errors" "fmt" - "hash" "io" "sync" + "time" ) /* @@ -50,14 +50,6 @@ data_{i} := size(subtree_{i}) || key_{j} || key_{j+1} .... || key_{j+n-1} The underlying hash function is configurable */ -const ( - defaultHash = "SHA3" - // defaultHash = "BMTSHA3" // http://golang.org/pkg/hash/#Hash - // defaultHash = "SHA256" // http://golang.org/pkg/hash/#Hash - defaultBranches int64 = 128 - // hashSize int64 = hasherfunc.New().Size() // hasher knows about its own length in bytes - // chunksize int64 = branches * hashSize // chunk is defined as this -) /* Tree chunker is a concrete implementation of data chunking. @@ -67,25 +59,19 @@ If all is well it is possible to implement this by simply composing readers so t The hashing itself does use extra copies and allocation though, since it does need it. */ -type ChunkerParams struct { - Branches int64 - Hash string -} - -func NewChunkerParams() *ChunkerParams { - return &ChunkerParams{ - Branches: defaultBranches, - Hash: defaultHash, - } -} +var ( + errAppendOppNotSuported = errors.New("Append operation not supported") + errOperationTimedOut = errors.New("operation timed out") +) type TreeChunker struct { branches int64 - hashFunc Hasher + hashFunc SwarmHasher // calculated hashSize int64 // self.hashFunc.New().Size() chunkSize int64 // hashSize* branches - workerCount int + workerCount int64 // the number of worker routines used + workerLock sync.RWMutex // lock for the worker count } func NewTreeChunker(params *ChunkerParams) (self *TreeChunker) { @@ -94,7 +80,8 @@ func NewTreeChunker(params *ChunkerParams) (self *TreeChunker) { self.branches = params.Branches self.hashSize = int64(self.hashFunc().Size()) self.chunkSize = self.hashSize * self.branches - self.workerCount = 1 + self.workerCount = 0 + return } @@ -114,13 +101,31 @@ type hashJob struct { parentWg *sync.WaitGroup } -func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, swg, wwg *sync.WaitGroup) (Key, error) { +func (self *TreeChunker) incrementWorkerCount() { + self.workerLock.Lock() + defer self.workerLock.Unlock() + self.workerCount += 1 +} +func (self *TreeChunker) getWorkerCount() int64 { + self.workerLock.RLock() + defer self.workerLock.RUnlock() + return self.workerCount +} + +func (self *TreeChunker) decrementWorkerCount() { + self.workerLock.Lock() + defer self.workerLock.Unlock() + self.workerCount -= 1 +} + +func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, swg, wwg *sync.WaitGroup) (Key, error) { if self.chunkSize <= 0 { panic("chunker must be initialised") } - jobC := make(chan *hashJob, 2*processors) + + jobC := make(chan *hashJob, 2*ChunkProcessors) wg := &sync.WaitGroup{} errC := make(chan error) quitC := make(chan bool) @@ -129,6 +134,8 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s if wwg != nil { wwg.Add(1) } + + self.incrementWorkerCount() go self.hashWorker(jobC, chunkC, errC, quitC, swg, wwg) depth := 0 @@ -157,10 +164,15 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s close(errC) }() - //TODO: add a timeout - if err := <-errC; err != nil { - close(quitC) - return nil, err + + defer close(quitC) + select { + case err := <-errC: + if err != nil { + return nil, err + } + case <-time.NewTimer(splitTimeout).C: + return nil,errOperationTimedOut } return key, nil @@ -168,6 +180,8 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s func (self *TreeChunker) split(depth int, treeSize int64, key Key, data io.Reader, size int64, jobC chan *hashJob, chunkC chan *Chunk, errC chan error, quitC chan bool, parentWg, swg, wwg *sync.WaitGroup) { + // + for depth > 0 && size < treeSize { treeSize /= self.branches depth-- @@ -223,12 +237,15 @@ func (self *TreeChunker) split(depth int, treeSize int64, key Key, data io.Reade // parentWg.Add(1) // go func() { childrenWg.Wait() - if len(jobC) > self.workerCount && self.workerCount < processors { + + worker := self.getWorkerCount() + if int64(len(jobC)) > worker && worker < ChunkProcessors { if wwg != nil { wwg.Add(1) } - self.workerCount++ + self.incrementWorkerCount() go self.hashWorker(jobC, chunkC, errC, quitC, swg, wwg) + } select { case jobC <- &hashJob{key, chunk, size, parentWg}: @@ -237,6 +254,8 @@ func (self *TreeChunker) split(depth int, treeSize int64, key Key, data io.Reade } func (self *TreeChunker) hashWorker(jobC chan *hashJob, chunkC chan *Chunk, errC chan error, quitC chan bool, swg, wwg *sync.WaitGroup) { + defer self.decrementWorkerCount() + hasher := self.hashFunc() if wwg != nil { defer wwg.Done() @@ -249,7 +268,6 @@ func (self *TreeChunker) hashWorker(jobC chan *hashJob, chunkC chan *Chunk, errC return } // now we got the hashes in the chunk, then hash the chunks - hasher.Reset() self.hashChunk(hasher, job, chunkC, swg) case <-quitC: return @@ -260,9 +278,11 @@ func (self *TreeChunker) hashWorker(jobC chan *hashJob, chunkC chan *Chunk, errC // The treeChunkers own Hash hashes together // - the size (of the subtree encoded in the Chunk) // - the Chunk, ie. the contents read from the input reader -func (self *TreeChunker) hashChunk(hasher hash.Hash, job *hashJob, chunkC chan *Chunk, swg *sync.WaitGroup) { - hasher.Write(job.chunk) +func (self *TreeChunker) hashChunk(hasher SwarmHash, job *hashJob, chunkC chan *Chunk, swg *sync.WaitGroup) { + hasher.ResetWithLength(job.chunk[:8]) // 8 bytes of length + hasher.Write(job.chunk[8:]) // minus 8 []byte length h := hasher.Sum(nil) + newChunk := &Chunk{ Key: h, SData: job.chunk, @@ -285,6 +305,10 @@ func (self *TreeChunker) hashChunk(hasher hash.Hash, job *hashJob, chunkC chan * } } +func (self *TreeChunker) Append(key Key, data io.Reader, chunkC chan *Chunk, swg, wwg *sync.WaitGroup) (Key, error) { + return nil, errAppendOppNotSuported +} + // LazyChunkReader implements LazySectionReader type LazyChunkReader struct { key Key // root key @@ -298,7 +322,6 @@ type LazyChunkReader struct { // implements the Joiner interface func (self *TreeChunker) Join(key Key, chunkC chan *Chunk) LazySectionReader { - return &LazyChunkReader{ key: key, chunkC: chunkC, diff --git a/swarm/storage/chunker_test.go b/swarm/storage/chunker_test.go index 426074e59a..b41d7dd333 100644 --- a/swarm/storage/chunker_test.go +++ b/swarm/storage/chunker_test.go @@ -20,12 +20,14 @@ import ( "bytes" "crypto/rand" "encoding/binary" + "errors" "fmt" "io" - "runtime" "sync" "testing" "time" + + "github.com/ethereum/go-ethereum/crypto/sha3" ) /* @@ -43,7 +45,7 @@ type chunkerTester struct { t test } -func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, chunkC chan *Chunk, swg *sync.WaitGroup, expectedError error) (key Key) { +func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, chunkC chan *Chunk, swg *sync.WaitGroup, expectedError error) (key Key, err error) { // reset self.chunks = make(map[string]*Chunk) @@ -54,13 +56,13 @@ func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, c quitC := make(chan bool) timeout := time.After(600 * time.Second) if chunkC != nil { - go func() { + go func() error { for { select { case <-timeout: - self.t.Fatalf("Join timeout error") + return errors.New(("Split timeout error")) case <-quitC: - return + return nil case chunk := <-chunkC: // self.chunks = append(self.chunks, chunk) self.chunks[chunk.Key.String()] = chunk @@ -68,22 +70,69 @@ func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, c chunk.wg.Done() } } + } }() } - key, err := chunker.Split(data, size, chunkC, swg, nil) + + key, err = chunker.Split(data, size, chunkC, swg, nil) if err != nil && expectedError == nil { - self.t.Fatalf("Split error: %v", err) - } else if expectedError != nil && (err == nil || err.Error() != expectedError.Error()) { - self.t.Fatalf("Not receiving the correct error! Expected %v, received %v", expectedError, err) + err = errors.New(fmt.Sprintf("Split error: %v", err)) } + if chunkC != nil { if swg != nil { swg.Wait() } close(quitC) } - return + return key, err +} + +func (self *chunkerTester) Append(chunker Splitter, rootKey Key, data io.Reader, chunkC chan *Chunk, swg *sync.WaitGroup, expectedError error) (key Key, err error) { + quitC := make(chan bool) + timeout := time.After(60 * time.Second) + if chunkC != nil { + go func() error { + for { + select { + case <-timeout: + return errors.New(("Append timeout error")) + case <-quitC: + return nil + case chunk := <-chunkC: + if chunk != nil { + stored, success := self.chunks[chunk.Key.String()] + if !success { + // Requesting data + self.chunks[chunk.Key.String()] = chunk + if chunk.wg != nil { + chunk.wg.Done() + } + } else { + // getting data + chunk.SData = stored.SData + chunk.Size = int64(binary.LittleEndian.Uint64(chunk.SData[0:8])) + close(chunk.C) + } + } + } + } + }() + } + + key, err = chunker.Append(rootKey, data, chunkC, swg, nil) + if err != nil && expectedError == nil { + err = errors.New(fmt.Sprintf("Append error: %v", err)) + } + + if chunkC != nil { + if swg != nil { + swg.Wait() + } + close(quitC) + } + return key, err } func (self *chunkerTester) Join(chunker Chunker, key Key, c int, chunkC chan *Chunk, quitC chan bool) LazySectionReader { @@ -93,22 +142,20 @@ func (self *chunkerTester) Join(chunker Chunker, key Key, c int, chunkC chan *Ch timeout := time.After(600 * time.Second) i := 0 - go func() { + go func() error { for { select { case <-timeout: - self.t.Fatalf("Join timeout error") - + return errors.New(("Join timeout error")) case chunk, ok := <-chunkC: if !ok { close(quitC) - return + return nil } // this just mocks the behaviour of a chunk store retrieval stored, success := self.chunks[chunk.Key.String()] if !success { - self.t.Fatalf("not found") - return + return errors.New(("Not found")) } chunk.SData = stored.SData chunk.Size = int64(binary.LittleEndian.Uint64(chunk.SData[0:8])) @@ -136,11 +183,15 @@ func testRandomBrokenData(splitter Splitter, n int, tester *chunkerTester) { chunkC := make(chan *Chunk, 1000) swg := &sync.WaitGroup{} - key := tester.Split(splitter, brokendata, int64(n), chunkC, swg, fmt.Errorf("Broken reader")) + expectedError := fmt.Errorf("Broken reader") + key, err := tester.Split(splitter, brokendata, int64(n), chunkC, swg, expectedError) + if err == nil || err.Error() != expectedError.Error() { + tester.t.Fatalf("Not receiving the correct error! Expected %v, received %v", expectedError, err) + } tester.t.Logf(" Key = %v\n", key) } -func testRandomData(splitter Splitter, n int, tester *chunkerTester) { +func testRandomData(splitter Splitter, n int, tester *chunkerTester) Key { if tester.inputs == nil { tester.inputs = make(map[uint64][]byte) } @@ -156,7 +207,10 @@ func testRandomData(splitter Splitter, n int, tester *chunkerTester) { chunkC := make(chan *Chunk, 1000) swg := &sync.WaitGroup{} - key := tester.Split(splitter, data, int64(n), chunkC, swg, nil) + key, err := tester.Split(splitter, data, int64(n), chunkC, swg, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } tester.t.Logf(" Key = %v\n", key) chunkC = make(chan *Chunk, 1000) @@ -176,29 +230,145 @@ func testRandomData(splitter Splitter, n int, tester *chunkerTester) { } close(chunkC) <-quitC + + return key +} + +func testRandomDataAppend(splitter Splitter, n, m int, tester *chunkerTester) { + if tester.inputs == nil { + tester.inputs = make(map[uint64][]byte) + } + input, found := tester.inputs[uint64(n)] + var data io.Reader + if !found { + data, input = testDataReaderAndSlice(n) + tester.inputs[uint64(n)] = input + } else { + data = io.LimitReader(bytes.NewReader(input), int64(n)) + } + + chunkC := make(chan *Chunk, 1000) + swg := &sync.WaitGroup{} + + key, err := tester.Split(splitter, data, int64(n), chunkC, swg, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + tester.t.Logf(" Key = %v\n", key) + + //create a append data stream + appendInput, found := tester.inputs[uint64(m)] + var appendData io.Reader + if !found { + appendData, appendInput = testDataReaderAndSlice(m) + tester.inputs[uint64(m)] = appendInput + } else { + appendData = io.LimitReader(bytes.NewReader(appendInput), int64(m)) + } + + chunkC = make(chan *Chunk, 1000) + swg = &sync.WaitGroup{} + + newKey, err := tester.Append(splitter, key, appendData, chunkC, swg, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + tester.t.Logf(" NewKey = %v\n", newKey) + + chunkC = make(chan *Chunk, 1000) + quitC := make(chan bool) + + chunker := NewTreeChunker(NewChunkerParams()) + reader := tester.Join(chunker, newKey, 0, chunkC, quitC) + newOutput := make([]byte, n+m) + r, err := reader.Read(newOutput) + if r != (n + m) { + tester.t.Fatalf("read error read: %v n = %v err = %v\n", r, n, err) + } + + newInput := append(input, appendInput...) + if !bytes.Equal(newOutput, newInput) { + tester.t.Fatalf("input and output mismatch\n IN: %v\nOUT: %v\n", newInput, newOutput) + } + + close(chunkC) +} + +func TestSha3ForCorrectness(t *testing.T) { + tester := &chunkerTester{t: t} + + size := 4096 + input := make([]byte, size+8) + binary.LittleEndian.PutUint64(input[:8], uint64(size)) + + io.LimitReader(bytes.NewReader(input[8:]), int64(size)) + + rawSha3 := sha3.NewKeccak256() + rawSha3.Reset() + rawSha3.Write(input) + rawSha3Output := rawSha3.Sum(nil) + + sha3FromMakeFunc := MakeHashFunc(SHA3Hash)() + sha3FromMakeFunc.ResetWithLength(input[:8]) + sha3FromMakeFunc.Write(input[8:]) + sha3FromMakeFuncOutput := sha3FromMakeFunc.Sum(nil) + + if len(rawSha3Output) != len(sha3FromMakeFuncOutput) { + tester.t.Fatalf("Original SHA3 and abstracted Sha3 has different length %v:%v\n", len(rawSha3Output), len(sha3FromMakeFuncOutput)) + } + + if !bytes.Equal(rawSha3Output, sha3FromMakeFuncOutput) { + tester.t.Fatalf("Original SHA3 and abstracted Sha3 mismatch %v:%v\n", rawSha3Output, sha3FromMakeFuncOutput) + } + +} + +func TestDataAppend(t *testing.T) { + sizes := []int{1, 1, 1, 4095, 4096, 4097, 1, 1, 1, 123456, 2345678, 2345678} + appendSizes := []int{4095, 4096, 4097, 1, 1, 1, 8191, 8192, 8193, 9000, 3000, 5000} + + tester := &chunkerTester{t: t} + chunker := NewPyramidChunker(NewChunkerParams()) + for i, s := range sizes { + testRandomDataAppend(chunker, s, appendSizes[i], tester) + + } } func TestRandomData(t *testing.T) { - // sizes := []int{123456} - sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 123456, 2345678} + sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 12287, 12288, 12289, 123456, 2345678} tester := &chunkerTester{t: t} + chunker := NewTreeChunker(NewChunkerParams()) - for _, s := range sizes { - testRandomData(chunker, s, tester) - } pyramid := NewPyramidChunker(NewChunkerParams()) for _, s := range sizes { - testRandomData(pyramid, s, tester) + treeChunkerKey := testRandomData(chunker, s, tester) + pyramidChunkerKey := testRandomData(pyramid, s, tester) + if treeChunkerKey.String() != pyramidChunkerKey.String() { + tester.t.Fatalf("tree chunker and pyramid chunker key mismatch for size %v\n TC: %v\n PC: %v\n", s, treeChunkerKey.String(), pyramidChunkerKey.String()) + } } + + cp := NewChunkerParams() + cp.Hash = BMTHash + chunker = NewTreeChunker(cp) + pyramid = NewPyramidChunker(cp) + for _, s := range sizes { + treeChunkerKey := testRandomData(chunker, s, tester) + pyramidChunkerKey := testRandomData(pyramid, s, tester) + if treeChunkerKey.String() != pyramidChunkerKey.String() { + tester.t.Fatalf("tree chunker BMT and pyramid chunker BMT key mismatch for size %v \n TC: %v\n PC: %v\n", s, treeChunkerKey.String(), pyramidChunkerKey.String()) + } + } + } func TestRandomBrokenData(t *testing.T) { - sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 123456, 2345678} + sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 12287, 12288, 12289, 123456, 2345678} tester := &chunkerTester{t: t} chunker := NewTreeChunker(NewChunkerParams()) for _, s := range sizes { testRandomBrokenData(chunker, s, tester) - t.Logf("done size: %v", s) } } @@ -220,45 +390,100 @@ func benchmarkJoin(n int, t *testing.B) { chunkC := make(chan *Chunk, 1000) swg := &sync.WaitGroup{} - key := tester.Split(chunker, data, int64(n), chunkC, swg, nil) - // t.StartTimer() + key, err := tester.Split(chunker, data, int64(n), chunkC, swg, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } chunkC = make(chan *Chunk, 1000) quitC := make(chan bool) reader := tester.Join(chunker, key, i, chunkC, quitC) benchReadAll(reader) close(chunkC) <-quitC - // t.StopTimer() } - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) - fmt.Println(stats.Sys) } -func benchmarkSplitTree(n int, t *testing.B) { +func benchmarkSplitTreeSHA3(n int, t *testing.B) { t.ReportAllocs() for i := 0; i < t.N; i++ { chunker := NewTreeChunker(NewChunkerParams()) tester := &chunkerTester{t: t} data := testDataReader(n) - tester.Split(chunker, data, int64(n), nil, nil, nil) + _, err := tester.Split(chunker, data, int64(n), nil, nil, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } } - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) - fmt.Println(stats.Sys) } -func benchmarkSplitPyramid(n int, t *testing.B) { +func benchmarkSplitTreeBMT(n int, t *testing.B) { + t.ReportAllocs() + for i := 0; i < t.N; i++ { + cp := NewChunkerParams() + cp.Hash = BMTHash + chunker := NewTreeChunker(cp) + tester := &chunkerTester{t: t} + data := testDataReader(n) + _, err := tester.Split(chunker, data, int64(n), nil, nil, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + } +} + +func benchmarkSplitPyramidSHA3(n int, t *testing.B) { t.ReportAllocs() for i := 0; i < t.N; i++ { splitter := NewPyramidChunker(NewChunkerParams()) tester := &chunkerTester{t: t} data := testDataReader(n) - tester.Split(splitter, data, int64(n), nil, nil, nil) + _, err := tester.Split(splitter, data, int64(n), nil, nil, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + } +} + +func benchmarkSplitPyramidBMT(n int, t *testing.B) { + t.ReportAllocs() + for i := 0; i < t.N; i++ { + cp := NewChunkerParams() + cp.Hash = BMTHash + splitter := NewPyramidChunker(cp) + tester := &chunkerTester{t: t} + data := testDataReader(n) + _, err := tester.Split(splitter, data, int64(n), nil, nil, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + } +} + +func benchmarkAppendPyramid(n, m int, t *testing.B) { + t.ReportAllocs() + for i := 0; i < t.N; i++ { + chunker := NewPyramidChunker(NewChunkerParams()) + tester := &chunkerTester{t: t} + data := testDataReader(n) + data1 := testDataReader(m) + + chunkC := make(chan *Chunk, 1000) + swg := &sync.WaitGroup{} + key, err := tester.Split(chunker, data, int64(n), chunkC, swg, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + + chunkC = make(chan *Chunk, 1000) + swg = &sync.WaitGroup{} + + _, err = tester.Append(chunker, key, data1, chunkC, swg, nil) + if err != nil { + tester.t.Fatalf(err.Error()) + } + + close(chunkC) } - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) - fmt.Println(stats.Sys) } func BenchmarkJoin_2(t *testing.B) { benchmarkJoin(100, t) } @@ -269,26 +494,59 @@ func BenchmarkJoin_6(t *testing.B) { benchmarkJoin(1000000, t) } func BenchmarkJoin_7(t *testing.B) { benchmarkJoin(10000000, t) } func BenchmarkJoin_8(t *testing.B) { benchmarkJoin(100000000, t) } -func BenchmarkSplitTree_2(t *testing.B) { benchmarkSplitTree(100, t) } -func BenchmarkSplitTree_2h(t *testing.B) { benchmarkSplitTree(500, t) } -func BenchmarkSplitTree_3(t *testing.B) { benchmarkSplitTree(1000, t) } -func BenchmarkSplitTree_3h(t *testing.B) { benchmarkSplitTree(5000, t) } -func BenchmarkSplitTree_4(t *testing.B) { benchmarkSplitTree(10000, t) } -func BenchmarkSplitTree_4h(t *testing.B) { benchmarkSplitTree(50000, t) } -func BenchmarkSplitTree_5(t *testing.B) { benchmarkSplitTree(100000, t) } -func BenchmarkSplitTree_6(t *testing.B) { benchmarkSplitTree(1000000, t) } -func BenchmarkSplitTree_7(t *testing.B) { benchmarkSplitTree(10000000, t) } -func BenchmarkSplitTree_8(t *testing.B) { benchmarkSplitTree(100000000, t) } +func BenchmarkSplitTreeSHA3_2(t *testing.B) { benchmarkSplitTreeSHA3(100, t) } +func BenchmarkSplitTreeSHA3_2h(t *testing.B) { benchmarkSplitTreeSHA3(500, t) } +func BenchmarkSplitTreeSHA3_3(t *testing.B) { benchmarkSplitTreeSHA3(1000, t) } +func BenchmarkSplitTreeSHA3_3h(t *testing.B) { benchmarkSplitTreeSHA3(5000, t) } +func BenchmarkSplitTreeSHA3_4(t *testing.B) { benchmarkSplitTreeSHA3(10000, t) } +func BenchmarkSplitTreeSHA3_4h(t *testing.B) { benchmarkSplitTreeSHA3(50000, t) } +func BenchmarkSplitTreeSHA3_5(t *testing.B) { benchmarkSplitTreeSHA3(100000, t) } +func BenchmarkSplitTreeSHA3_6(t *testing.B) { benchmarkSplitTreeSHA3(1000000, t) } +func BenchmarkSplitTreeSHA3_7(t *testing.B) { benchmarkSplitTreeSHA3(10000000, t) } +func BenchmarkSplitTreeSHA3_8(t *testing.B) { benchmarkSplitTreeSHA3(100000000, t) } -func BenchmarkSplitPyramid_2(t *testing.B) { benchmarkSplitPyramid(100, t) } -func BenchmarkSplitPyramid_2h(t *testing.B) { benchmarkSplitPyramid(500, t) } -func BenchmarkSplitPyramid_3(t *testing.B) { benchmarkSplitPyramid(1000, t) } -func BenchmarkSplitPyramid_3h(t *testing.B) { benchmarkSplitPyramid(5000, t) } -func BenchmarkSplitPyramid_4(t *testing.B) { benchmarkSplitPyramid(10000, t) } -func BenchmarkSplitPyramid_4h(t *testing.B) { benchmarkSplitPyramid(50000, t) } -func BenchmarkSplitPyramid_5(t *testing.B) { benchmarkSplitPyramid(100000, t) } -func BenchmarkSplitPyramid_6(t *testing.B) { benchmarkSplitPyramid(1000000, t) } -func BenchmarkSplitPyramid_7(t *testing.B) { benchmarkSplitPyramid(10000000, t) } -func BenchmarkSplitPyramid_8(t *testing.B) { benchmarkSplitPyramid(100000000, t) } +func BenchmarkSplitTreeBMT_2(t *testing.B) { benchmarkSplitTreeBMT(100, t) } +func BenchmarkSplitTreeBMT_2h(t *testing.B) { benchmarkSplitTreeBMT(500, t) } +func BenchmarkSplitTreeBMT_3(t *testing.B) { benchmarkSplitTreeBMT(1000, t) } +func BenchmarkSplitTreeBMT_3h(t *testing.B) { benchmarkSplitTreeBMT(5000, t) } +func BenchmarkSplitTreeBMT_4(t *testing.B) { benchmarkSplitTreeBMT(10000, t) } +func BenchmarkSplitTreeBMT_4h(t *testing.B) { benchmarkSplitTreeBMT(50000, t) } +func BenchmarkSplitTreeBMT_5(t *testing.B) { benchmarkSplitTreeBMT(100000, t) } +func BenchmarkSplitTreeBMT_6(t *testing.B) { benchmarkSplitTreeBMT(1000000, t) } +func BenchmarkSplitTreeBMT_7(t *testing.B) { benchmarkSplitTreeBMT(10000000, t) } +func BenchmarkSplitTreeBMT_8(t *testing.B) { benchmarkSplitTreeBMT(100000000, t) } -// godep go test -bench ./swarm/storage -cpuprofile cpu.out -memprofile mem.out +func BenchmarkSplitPyramidSHA3_2(t *testing.B) { benchmarkSplitPyramidSHA3(100, t) } +func BenchmarkSplitPyramidSHA3_2h(t *testing.B) { benchmarkSplitPyramidSHA3(500, t) } +func BenchmarkSplitPyramidSHA3_3(t *testing.B) { benchmarkSplitPyramidSHA3(1000, t) } +func BenchmarkSplitPyramidSHA3_3h(t *testing.B) { benchmarkSplitPyramidSHA3(5000, t) } +func BenchmarkSplitPyramidSHA3_4(t *testing.B) { benchmarkSplitPyramidSHA3(10000, t) } +func BenchmarkSplitPyramidSHA3_4h(t *testing.B) { benchmarkSplitPyramidSHA3(50000, t) } +func BenchmarkSplitPyramidSHA3_5(t *testing.B) { benchmarkSplitPyramidSHA3(100000, t) } +func BenchmarkSplitPyramidSHA3_6(t *testing.B) { benchmarkSplitPyramidSHA3(1000000, t) } +func BenchmarkSplitPyramidSHA3_7(t *testing.B) { benchmarkSplitPyramidSHA3(10000000, t) } +func BenchmarkSplitPyramidSHA3_8(t *testing.B) { benchmarkSplitPyramidSHA3(100000000, t) } + +func BenchmarkSplitPyramidBMT_2(t *testing.B) { benchmarkSplitPyramidBMT(100, t) } +func BenchmarkSplitPyramidBMT_2h(t *testing.B) { benchmarkSplitPyramidBMT(500, t) } +func BenchmarkSplitPyramidBMT_3(t *testing.B) { benchmarkSplitPyramidBMT(1000, t) } +func BenchmarkSplitPyramidBMT_3h(t *testing.B) { benchmarkSplitPyramidBMT(5000, t) } +func BenchmarkSplitPyramidBMT_4(t *testing.B) { benchmarkSplitPyramidBMT(10000, t) } +func BenchmarkSplitPyramidBMT_4h(t *testing.B) { benchmarkSplitPyramidBMT(50000, t) } +func BenchmarkSplitPyramidBMT_5(t *testing.B) { benchmarkSplitPyramidBMT(100000, t) } +func BenchmarkSplitPyramidBMT_6(t *testing.B) { benchmarkSplitPyramidBMT(1000000, t) } +func BenchmarkSplitPyramidBMT_7(t *testing.B) { benchmarkSplitPyramidBMT(10000000, t) } +func BenchmarkSplitPyramidBMT_8(t *testing.B) { benchmarkSplitPyramidBMT(100000000, t) } + +func BenchmarkAppendPyramid_2(t *testing.B) { benchmarkAppendPyramid(100, 1000, t) } +func BenchmarkAppendPyramid_2h(t *testing.B) { benchmarkAppendPyramid(500, 1000, t) } +func BenchmarkAppendPyramid_3(t *testing.B) { benchmarkAppendPyramid(1000, 1000, t) } +func BenchmarkAppendPyramid_4(t *testing.B) { benchmarkAppendPyramid(10000, 1000, t) } +func BenchmarkAppendPyramid_4h(t *testing.B) { benchmarkAppendPyramid(50000, 1000, t) } +func BenchmarkAppendPyramid_5(t *testing.B) { benchmarkAppendPyramid(1000000, 1000, t) } +func BenchmarkAppendPyramid_6(t *testing.B) { benchmarkAppendPyramid(1000000, 1000, t) } +func BenchmarkAppendPyramid_7(t *testing.B) { benchmarkAppendPyramid(10000000, 1000, t) } +func BenchmarkAppendPyramid_8(t *testing.B) { benchmarkAppendPyramid(100000000, 1000, t) } + +// go test -timeout 20m -cpu 4 -bench=./swarm/storage -run no +// If you dont add the timeout argument above .. the benchmark will timeout and dump diff --git a/swarm/storage/common_test.go b/swarm/storage/common_test.go index 44d1dd1f72..cd4c2ef139 100644 --- a/swarm/storage/common_test.go +++ b/swarm/storage/common_test.go @@ -76,7 +76,7 @@ func testStore(m ChunkStore, l int64, branches int64, t *testing.T) { }() chunker := NewTreeChunker(&ChunkerParams{ Branches: branches, - Hash: defaultHash, + Hash: SHA3Hash, }) swg := &sync.WaitGroup{} key, _ := chunker.Split(rand.Reader, l, chunkC, swg, nil) diff --git a/swarm/storage/dbstore.go b/swarm/storage/dbstore.go index cbeddb8cb5..46a5c16ccc 100644 --- a/swarm/storage/dbstore.go +++ b/swarm/storage/dbstore.go @@ -72,12 +72,12 @@ type DbStore struct { gcPos, gcStartPos []byte gcArray []*gcItem - hashfunc Hasher + hashfunc SwarmHasher lock sync.Mutex } -func NewDbStore(path string, hash Hasher, capacity uint64, radius int) (s *DbStore, err error) { +func NewDbStore(path string, hash SwarmHasher, capacity uint64, radius int) (s *DbStore, err error) { s = new(DbStore) s.hashfunc = hash diff --git a/swarm/storage/dbstore_test.go b/swarm/storage/dbstore_test.go index ddce7ccfea..dd165b5768 100644 --- a/swarm/storage/dbstore_test.go +++ b/swarm/storage/dbstore_test.go @@ -29,7 +29,7 @@ func initDbStore(t *testing.T) *DbStore { if err != nil { t.Fatal(err) } - m, err := NewDbStore(dir, MakeHashFunc(defaultHash), defaultDbCapacity, defaultRadius) + m, err := NewDbStore(dir, MakeHashFunc(SHA3Hash), defaultDbCapacity, defaultRadius) if err != nil { t.Fatal("can't create store:", err) } diff --git a/swarm/storage/localstore.go b/swarm/storage/localstore.go index 58f59d0a24..b442e6cc54 100644 --- a/swarm/storage/localstore.go +++ b/swarm/storage/localstore.go @@ -28,7 +28,7 @@ type LocalStore struct { } // This constructor uses MemStore and DbStore as components -func NewLocalStore(hash Hasher, params *StoreParams) (*LocalStore, error) { +func NewLocalStore(hash SwarmHasher, params *StoreParams) (*LocalStore, error) { dbStore, err := NewDbStore(params.ChunkDbPath, hash, params.DbCapacity, params.Radius) if err != nil { return nil, err diff --git a/swarm/storage/netstore.go b/swarm/storage/netstore.go index 746dd85f69..7b0612edc5 100644 --- a/swarm/storage/netstore.go +++ b/swarm/storage/netstore.go @@ -36,7 +36,7 @@ NetStore falls back to a backend (CloudStorage interface) implemented by bzz/network/forwarder. forwarder or IPFS or IPΞS */ type NetStore struct { - hashfunc Hasher + hashfunc SwarmHasher localStore *LocalStore cloud CloudStore } @@ -69,7 +69,7 @@ func NewStoreParams(path string) (self *StoreParams) { // netstore contructor, takes path argument that is used to initialise dbStore, // the persistent (disk) storage component of LocalStore // the second argument is the hive, the connection/logistics manager for the node -func NewNetStore(hash Hasher, lstore *LocalStore, cloud CloudStore, params *StoreParams) *NetStore { +func NewNetStore(hash SwarmHasher, lstore *LocalStore, cloud CloudStore, params *StoreParams) *NetStore { return &NetStore{ hashfunc: hash, localStore: lstore, diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go index 74e00a4971..e3be2a987f 100644 --- a/swarm/storage/pyramid.go +++ b/swarm/storage/pyramid.go @@ -18,53 +18,112 @@ package storage import ( "encoding/binary" - "fmt" + "errors" "io" - "math" - "strings" "sync" + "time" +) - "github.com/ethereum/go-ethereum/common" +/* + The main idea of a pyramid chunker is to process the input data without knowing the entire size apriori. + For this to be achieved, the chunker tree is built from the ground up until the data is exhausted. + This opens up new aveneus such as easy append and other sort of modifications to the tree therby avoiding + duplication of data chunks. + + + Below is an example of a two level chunks tree. The leaf chunks are called data chunks and all the above + chunks are called tree chunks. The tree chunk above data chunks is level 0 and so on until it reaches + the root tree chunk. + + + + T10 <- Tree chunk lvl1 + | + __________________________|_____________________________ + / | | \ + / | \ \ + __T00__ ___T01__ ___T02__ ___T03__ <- Tree chunks lvl 0 + / / \ / / \ / / \ / / \ + / / \ / / \ / / \ / / \ + D1 D2 ... D128 D1 D2 ... D128 D1 D2 ... D128 D1 D2 ... D128 <- Data Chunks + + + The split function continuously read the data and creates data chunks and send them to storage. + When certain no of data chunks are created (defaultBranches), a signal is sent to create a tree + entry. When the level 0 tree entries reaches certain threshold (defaultBranches), another signal + is sent to a tree entry one level up.. and so on... until only the data is exhausted AND only one + tree entry is present in certain level. The key of tree entry is given out as the rootKey of the file. + +*/ + +var ( + errLoadingTreeRootChunk = errors.New("LoadTree Error: Could not load root chunk") + errLoadingTreeChunk = errors.New("LoadTree Error: Could not load chunk") ) const ( - processors = 8 + ChunkProcessors = 8 + DefaultBranches int64 = 128 + splitTimeout = time.Minute * 5 ) -type Tree struct { - Chunks int64 - Levels []map[int64]*Node - Lock sync.RWMutex +const ( + DataChunk = 0 + TreeChunk = 1 +) + +type ChunkerParams struct { + Branches int64 + Hash string } -type Node struct { - Pending int64 - Size uint64 - Children []common.Hash - Last bool -} - -func (self *Node) String() string { - var children []string - for _, node := range self.Children { - children = append(children, node.Hex()) +func NewChunkerParams() *ChunkerParams { + return &ChunkerParams{ + Branches: DefaultBranches, + Hash: SHA3Hash, } - return fmt.Sprintf("pending: %v, size: %v, last :%v, children: %v", self.Pending, self.Size, self.Last, strings.Join(children, ", ")) } -type Task struct { - Index int64 // Index of the chunk being processed - Size uint64 - Data []byte // Binary blob of the chunk - Last bool +// Entry to create a tree node +type TreeEntry struct { + level int + branchCount int64 + subtreeSize uint64 + chunk []byte + key []byte + index int // used in append to indicate the index of existing tree entry + updatePending bool // indicates if the entry is loaded from existing tree +} + +func NewTreeEntry(pyramid *PyramidChunker) *TreeEntry { + return &TreeEntry{ + level: 0, + branchCount: 0, + subtreeSize: 0, + chunk: make([]byte, pyramid.chunkSize+8), + key: make([]byte, pyramid.hashSize), + index: 0, + updatePending: false, + } +} + +// Used by the hash processor to create a data/tree chunk and send to storage +type chunkJob struct { + key Key + chunk []byte + size int64 + parentWg *sync.WaitGroup + chunkType int // used to identify the tree related chunks for debugging + chunkLvl int // leaf-1 is level 0 and goes upwards until it reaches root } type PyramidChunker struct { - hashFunc Hasher + hashFunc SwarmHasher chunkSize int64 hashSize int64 branches int64 - workerCount int + workerCount int64 + workerLock sync.RWMutex } func NewPyramidChunker(params *ChunkerParams) (self *PyramidChunker) { @@ -73,128 +132,506 @@ func NewPyramidChunker(params *ChunkerParams) (self *PyramidChunker) { self.branches = params.Branches self.hashSize = int64(self.hashFunc().Size()) self.chunkSize = self.hashSize * self.branches - self.workerCount = 1 + self.workerCount = 0 return } -func (self *PyramidChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, swg, wwg *sync.WaitGroup) (Key, error) { +func (self *PyramidChunker) Join(key Key, chunkC chan *Chunk) LazySectionReader { + return &LazyChunkReader{ + key: key, + chunkC: chunkC, + chunkSize: self.chunkSize, + branches: self.branches, + hashSize: self.hashSize, + } +} - chunks := (size + self.chunkSize - 1) / self.chunkSize - depth := int(math.Ceil(math.Log(float64(chunks))/math.Log(float64(self.branches)))) + 1 +func (self *PyramidChunker) incrementWorkerCount() { + self.workerLock.Lock() + defer self.workerLock.Unlock() + self.workerCount += 1 +} - results := Tree{ - Chunks: chunks, - Levels: make([]map[int64]*Node, depth), - } - for i := 0; i < depth; i++ { - results.Levels[i] = make(map[int64]*Node) - } - // Create a pool of workers to crunch through the file - tasks := make(chan *Task, 2*processors) - pend := new(sync.WaitGroup) - abortC := make(chan bool) - for i := 0; i < processors; i++ { - pend.Add(1) - go self.processor(pend, swg, tasks, chunkC, &results) - } - // Feed the chunks into the task pool - read := 0 - for index := 0; ; index++ { - buffer := make([]byte, self.chunkSize+8) - n, err := data.Read(buffer[8:]) - read += n - last := int64(read) == size || err == io.ErrUnexpectedEOF || err == io.EOF - if err != nil && !last { - close(abortC) - break +func (self *PyramidChunker) getWorkerCount() int64 { + self.workerLock.Lock() + defer self.workerLock.Unlock() + return self.workerCount +} + +func (self *PyramidChunker) decrementWorkerCount() { + self.workerLock.Lock() + defer self.workerLock.Unlock() + self.workerCount -= 1 +} + +func (self *PyramidChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, storageWG, processorWG *sync.WaitGroup) (Key, error) { + jobC := make(chan *chunkJob, 2*ChunkProcessors) + wg := &sync.WaitGroup{} + errC := make(chan error) + quitC := make(chan bool) + rootKey := make([]byte, self.hashSize) + chunkLevel := make([][]*TreeEntry, self.branches) + + wg.Add(1) + go self.prepareChunks(false, chunkLevel, data, rootKey, quitC, wg, jobC, processorWG, chunkC, errC, storageWG) + + // closes internal error channel if all subprocesses in the workgroup finished + go func() { + + // waiting for all chunks to finish + wg.Wait() + + // if storage waitgroup is non-nil, we wait for storage to finish too + if storageWG != nil { + storageWG.Wait() } - binary.LittleEndian.PutUint64(buffer[:8], uint64(n)) - pend.Add(1) - select { - case tasks <- &Task{Index: int64(index), Size: uint64(n), Data: buffer[:n+8], Last: last}: - case <-abortC: + //We close errC here because this is passed down to 8 parallel routines underneath. + // if a error happens in one of them.. that particular routine raises error... + // once they all complete successfully, the control comes back and we can safely close this here. + close(errC) + }() + + defer close(quitC) + + select { + case err := <-errC: + if err != nil { return nil, err } - if last { + case <-time.NewTimer(splitTimeout).C: + } + return rootKey, nil + +} + +func (self *PyramidChunker) Append(key Key, data io.Reader, chunkC chan *Chunk, storageWG, processorWG *sync.WaitGroup) (Key, error) { + quitC := make(chan bool) + rootKey := make([]byte, self.hashSize) + chunkLevel := make([][]*TreeEntry, self.branches) + + // Load the right most unfinished tree chunks in every level + self.loadTree(chunkLevel, key, chunkC, quitC) + + jobC := make(chan *chunkJob, 2*ChunkProcessors) + wg := &sync.WaitGroup{} + errC := make(chan error) + + wg.Add(1) + go self.prepareChunks(true, chunkLevel, data, rootKey, quitC, wg, jobC, processorWG, chunkC, errC, storageWG) + + // closes internal error channel if all subprocesses in the workgroup finished + go func() { + + // waiting for all chunks to finish + wg.Wait() + + // if storage waitgroup is non-nil, we wait for storage to finish too + if storageWG != nil { + storageWG.Wait() + } + close(errC) + }() + + defer close(quitC) + + select { + case err := <-errC: + if err != nil { + return nil, err + } + case <-time.NewTimer(splitTimeout).C: + } + return rootKey, nil + +} + +func (self *PyramidChunker) processor(id int64, jobC chan *chunkJob, chunkC chan *Chunk, errC chan error, quitC chan bool, swg, wwg *sync.WaitGroup) { + defer self.decrementWorkerCount() + + hasher := self.hashFunc() + if wwg != nil { + defer wwg.Done() + } + for { + select { + + case job, ok := <-jobC: + if !ok { + return + } + self.processChunk(id, hasher, job, chunkC, swg) + case <-quitC: + return + } + } +} + +func (self *PyramidChunker) processChunk(id int64, hasher SwarmHash, job *chunkJob, chunkC chan *Chunk, swg *sync.WaitGroup) { + hasher.ResetWithLength(job.chunk[:8]) // 8 bytes of length + hasher.Write(job.chunk[8:]) // minus 8 []byte length + h := hasher.Sum(nil) + + newChunk := &Chunk{ + Key: h, + SData: job.chunk, + Size: job.size, + wg: swg, + } + + // report hash of this chunk one level up (keys corresponds to the proper subslice of the parent chunk) + copy(job.key, h) + + // send off new chunk to storage + if chunkC != nil { + if swg != nil { + swg.Add(1) + } + } + job.parentWg.Done() + + if chunkC != nil { + chunkC <- newChunk + } +} + +func (self *PyramidChunker) loadTree(chunkLevel [][]*TreeEntry, key Key, chunkC chan *Chunk, quitC chan bool) error { + // Get the root chunk to get the total size + chunk := retrieve(key, chunkC, quitC) + if chunk == nil { + return errLoadingTreeRootChunk + } + + //if data size is less than a chunk... add a parent with update as pending + if chunk.Size <= self.chunkSize { + newEntry := &TreeEntry{ + level: 0, + branchCount: 1, + subtreeSize: uint64(chunk.Size), + chunk: make([]byte, self.chunkSize+8), + key: make([]byte, self.hashSize), + index: 0, + updatePending: true, + } + copy(newEntry.chunk[8:], chunk.Key) + chunkLevel[0] = append(chunkLevel[0], newEntry) + return nil + } + + var treeSize int64 + var depth int + treeSize = self.chunkSize + for ; treeSize < chunk.Size; treeSize *= self.branches { + depth++ + } + + // Add the root chunk entry + branchCount := int64(len(chunk.SData)-8) / self.hashSize + newEntry := &TreeEntry{ + level: int(depth - 1), + branchCount: branchCount, + subtreeSize: uint64(chunk.Size), + chunk: chunk.SData, + key: key, + index: 0, + updatePending: true, + } + chunkLevel[depth-1] = append(chunkLevel[depth-1], newEntry) + + // Add the rest of the tree + for lvl := (depth - 1); lvl >= 1; lvl-- { + + //TODO(jmozah): instead of loading finished branches and then trim in the end, + //avoid loading them in the first place + for _, ent := range chunkLevel[lvl] { + branchCount = int64(len(ent.chunk)-8) / self.hashSize + for i := int64(0); i < branchCount; i++ { + key := ent.chunk[8+(i*self.hashSize) : 8+((i+1)*self.hashSize)] + newChunk := retrieve(key, chunkC, quitC) + if newChunk == nil { + return errLoadingTreeChunk + } + bewBranchCount := int64(len(newChunk.SData)-8) / self.hashSize + newEntry := &TreeEntry{ + level: int(lvl - 1), + branchCount: bewBranchCount, + subtreeSize: uint64(newChunk.Size), + chunk: newChunk.SData, + key: key, + index: 0, + updatePending: true, + } + chunkLevel[lvl-1] = append(chunkLevel[lvl-1], newEntry) + + } + + // We need to get only the right most unfinished branch.. so trim all finished branches + if int64(len(chunkLevel[lvl-1])) >= self.branches { + chunkLevel[lvl-1] = nil + } + } + } + + return nil +} + +func (self *PyramidChunker) prepareChunks(isAppend bool, chunkLevel [][]*TreeEntry, data io.Reader, rootKey []byte, quitC chan bool, wg *sync.WaitGroup, jobC chan *chunkJob, processorWG *sync.WaitGroup, chunkC chan *Chunk, errC chan error, storageWG *sync.WaitGroup) { + defer wg.Done() + + chunkWG := &sync.WaitGroup{} + totalDataSize := 0 + + // processorWG keeps track of workers spawned for hashing chunks + if processorWG != nil { + processorWG.Add(1) + } + + self.incrementWorkerCount() + go self.processor(self.workerCount, jobC, chunkC, errC, quitC, storageWG, processorWG) + + parent := NewTreeEntry(self) + var unFinishedChunk *Chunk + + if isAppend == true && len(chunkLevel[0]) != 0 { + + lastIndex := len(chunkLevel[0]) - 1 + ent := chunkLevel[0][lastIndex] + + if ent.branchCount < self.branches { + parent = &TreeEntry{ + level: 0, + branchCount: ent.branchCount, + subtreeSize: ent.subtreeSize, + chunk: ent.chunk, + key: ent.key, + index: lastIndex, + updatePending: true, + } + + lastBranch := parent.branchCount - 1 + lastKey := parent.chunk[8+lastBranch*self.hashSize : 8+(lastBranch+1)*self.hashSize] + + unFinishedChunk = retrieve(lastKey, chunkC, quitC) + if unFinishedChunk.Size < self.chunkSize { + + parent.subtreeSize = parent.subtreeSize - uint64(unFinishedChunk.Size) + parent.branchCount = parent.branchCount - 1 + } else { + unFinishedChunk = nil + } + } + } + + for index := 0; ; index++ { + + var n int + var err error + chunkData := make([]byte, self.chunkSize+8) + if unFinishedChunk != nil { + copy(chunkData, unFinishedChunk.SData) + n, err = data.Read(chunkData[8+unFinishedChunk.Size:]) + n += int(unFinishedChunk.Size) + unFinishedChunk = nil + } else { + n, err = data.Read(chunkData[8:]) + } + + totalDataSize += n + if err != nil { + if err == io.EOF || err == io.ErrUnexpectedEOF { + if parent.branchCount == 1 { + // Data is exactly one chunk.. pick the last chunk key as root + chunkWG.Wait() + lastChunksKey := parent.chunk[8 : 8+self.hashSize] + copy(rootKey, lastChunksKey) + break + } + } else { + close(quitC) + break + } + } + + // Data ended in chunk boundry.. just signal to start bulding tree + if n == 0 { + self.buildTree(isAppend, chunkLevel, parent, chunkWG, jobC, quitC, true, rootKey) + break + } else { + + pkey := self.enqueueDataChunk(chunkData, uint64(n), parent, chunkWG, jobC, quitC) + + // update tree related parent data structures + parent.subtreeSize += uint64(n) + parent.branchCount++ + + // Data got exhausted... signal to send any parent tree related chunks + if int64(n) < self.chunkSize { + + // only one data chunk .. so dont add any parent chunk + if parent.branchCount <= 1 { + chunkWG.Wait() + copy(rootKey, pkey) + break + } + + self.buildTree(isAppend, chunkLevel, parent, chunkWG, jobC, quitC, true, rootKey) + break + } + + if parent.branchCount == self.branches { + self.buildTree(isAppend, chunkLevel, parent, chunkWG, jobC, quitC, false, rootKey) + parent = NewTreeEntry(self) + } + + } + + workers := self.getWorkerCount() + if int64(len(jobC)) > workers && workers < ChunkProcessors { + if processorWG != nil { + processorWG.Add(1) + } + self.incrementWorkerCount() + go self.processor(self.workerCount, jobC, chunkC, errC, quitC, storageWG, processorWG) + } + + } + +} + +func (self *PyramidChunker) buildTree(isAppend bool, chunkLevel [][]*TreeEntry, ent *TreeEntry, chunkWG *sync.WaitGroup, jobC chan *chunkJob, quitC chan bool, last bool, rootKey []byte) { + chunkWG.Wait() + self.enqueueTreeChunk(chunkLevel, ent, chunkWG, jobC, quitC, last) + + compress := false + endLvl := self.branches + for lvl := int64(0); lvl < self.branches; lvl++ { + lvlCount := int64(len(chunkLevel[lvl])) + if lvlCount >= self.branches { + endLvl = lvl + 1 + compress = true break } } - // Wait for the workers and return - close(tasks) - pend.Wait() - key := results.Levels[0][0].Children[0][:] - return key, nil + if compress == false && last == false { + return + } + + // Wait for all the keys to be processed before compressing the tree + chunkWG.Wait() + + for lvl := int64(ent.level); lvl < endLvl; lvl++ { + + lvlCount := int64(len(chunkLevel[lvl])) + if lvlCount == 1 && last == true { + copy(rootKey, chunkLevel[lvl][0].key) + return + } + + for startCount := int64(0); startCount < lvlCount; startCount += self.branches { + + endCount := startCount + self.branches + if endCount > lvlCount { + endCount = lvlCount + } + + var nextLvlCount int64 + var tempEntry *TreeEntry + if len(chunkLevel[lvl+1]) > 0 { + nextLvlCount = int64(len(chunkLevel[lvl+1]) - 1) + tempEntry = chunkLevel[lvl+1][nextLvlCount] + } + if isAppend == true && tempEntry != nil && tempEntry.updatePending == true { + updateEntry := &TreeEntry{ + level: int(lvl + 1), + branchCount: 0, + subtreeSize: 0, + chunk: make([]byte, self.chunkSize+8), + key: make([]byte, self.hashSize), + index: int(nextLvlCount), + updatePending: true, + } + for index := int64(0); index < lvlCount; index++ { + updateEntry.branchCount++ + updateEntry.subtreeSize += chunkLevel[lvl][index].subtreeSize + copy(updateEntry.chunk[8+(index*self.hashSize):8+((index+1)*self.hashSize)], chunkLevel[lvl][index].key[:self.hashSize]) + } + + self.enqueueTreeChunk(chunkLevel, updateEntry, chunkWG, jobC, quitC, last) + + } else { + + noOfBranches := endCount - startCount + newEntry := &TreeEntry{ + level: int(lvl + 1), + branchCount: noOfBranches, + subtreeSize: 0, + chunk: make([]byte, (noOfBranches*self.hashSize)+8), + key: make([]byte, self.hashSize), + index: int(nextLvlCount), + updatePending: false, + } + + index := int64(0) + for i := startCount; i < endCount; i++ { + entry := chunkLevel[lvl][i] + newEntry.subtreeSize += entry.subtreeSize + copy(newEntry.chunk[8+(index*self.hashSize):8+((index+1)*self.hashSize)], entry.key[:self.hashSize]) + index++ + } + + self.enqueueTreeChunk(chunkLevel, newEntry, chunkWG, jobC, quitC, last) + + } + + } + + if isAppend == false { + chunkWG.Wait() + if compress == true { + chunkLevel[lvl] = nil + } + } + } + } -func (self *PyramidChunker) processor(pend, swg *sync.WaitGroup, tasks chan *Task, chunkC chan *Chunk, results *Tree) { - defer pend.Done() +func (self *PyramidChunker) enqueueTreeChunk(chunkLevel [][]*TreeEntry, ent *TreeEntry, chunkWG *sync.WaitGroup, jobC chan *chunkJob, quitC chan bool, last bool) { + if ent != nil { - // Start processing leaf chunks ad infinitum - hasher := self.hashFunc() - for task := range tasks { - depth, pow := len(results.Levels)-1, self.branches - size := task.Size - data := task.Data - var node *Node - for depth >= 0 { - // New chunk received, reset the hasher and start processing - hasher.Reset() - if node == nil { // Leaf node, hash the data chunk - hasher.Write(task.Data) - } else { // Internal node, hash the children - size = node.Size - data = make([]byte, hasher.Size()*len(node.Children)+8) - binary.LittleEndian.PutUint64(data[:8], size) - - hasher.Write(data[:8]) - for i, hash := range node.Children { - copy(data[i*hasher.Size()+8:], hash[:]) - hasher.Write(hash[:]) - } - } - hash := hasher.Sum(nil) - last := task.Last || (node != nil) && node.Last - // Insert the subresult into the memoization tree - results.Lock.Lock() - if node = results.Levels[depth][task.Index/pow]; node == nil { - // Figure out the pending tasks - pending := self.branches - if task.Index/pow == results.Chunks/pow { - pending = (results.Chunks + pow/self.branches - 1) / (pow / self.branches) % self.branches - } - node = &Node{pending, 0, make([]common.Hash, pending), last} - results.Levels[depth][task.Index/pow] = node - } - node.Pending-- - i := task.Index / (pow / self.branches) % self.branches - if last { - node.Last = true - } - copy(node.Children[i][:], hash) - node.Size += size - left := node.Pending - if chunkC != nil { - if swg != nil { - swg.Add(1) - } - - chunkC <- &Chunk{Key: hash, SData: data, wg: swg} - // TODO: consider selecting on self.quitC to avoid blocking forever on shutdown - } - if depth+1 < len(results.Levels) { - delete(results.Levels[depth+1], task.Index/(pow/self.branches)) - } - - results.Lock.Unlock() - // If there's more work to be done, leave for others - if left > 0 { - break - } - // We're the last ones in this batch, merge the children together - depth-- - pow *= self.branches + // wait for data chunks to get over before processing the tree chunk + if last == true { + chunkWG.Wait() } - pend.Done() + + binary.LittleEndian.PutUint64(ent.chunk[:8], ent.subtreeSize) + ent.key = make([]byte, self.hashSize) + chunkWG.Add(1) + select { + case jobC <- &chunkJob{ent.key, ent.chunk[:ent.branchCount*self.hashSize+8], int64(ent.subtreeSize), chunkWG, TreeChunk, 0}: + case <-quitC: + } + + // Update or append based on weather it is a new entry or being reused + if ent.updatePending == true { + chunkWG.Wait() + chunkLevel[ent.level][ent.index] = ent + } else { + chunkLevel[ent.level] = append(chunkLevel[ent.level], ent) + } + } } + +func (self *PyramidChunker) enqueueDataChunk(chunkData []byte, size uint64, parent *TreeEntry, chunkWG *sync.WaitGroup, jobC chan *chunkJob, quitC chan bool) Key { + binary.LittleEndian.PutUint64(chunkData[:8], size) + pkey := parent.chunk[8+parent.branchCount*self.hashSize : 8+(parent.branchCount+1)*self.hashSize] + + chunkWG.Add(1) + select { + case jobC <- &chunkJob{pkey, chunkData[:size+8], int64(size), chunkWG, DataChunk, -1}: + case <-quitC: + } + + return pkey + +} \ No newline at end of file diff --git a/swarm/storage/swarmhasher.go b/swarm/storage/swarmhasher.go new file mode 100644 index 0000000000..38b86373c5 --- /dev/null +++ b/swarm/storage/swarmhasher.go @@ -0,0 +1,40 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package storage + +import ( + "hash" +) + +const ( + BMTHash = "BMT" + SHA3Hash = "SHA3" // http://golang.org/pkg/hash/#Hash +) + +type SwarmHash interface { + hash.Hash + ResetWithLength([]byte) +} + +type HashWithLength struct { + hash.Hash +} + +func (self *HashWithLength) ResetWithLength(length []byte) { + self.Reset() + self.Write(length) +} diff --git a/swarm/storage/types.go b/swarm/storage/types.go index a9de23c93a..d35f1f9294 100644 --- a/swarm/storage/types.go +++ b/swarm/storage/types.go @@ -24,12 +24,13 @@ import ( "io" "sync" - // "github.com/ethereum/go-ethereum/bmt" + "github.com/ethereum/go-ethereum/bmt" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto/sha3" ) type Hasher func() hash.Hash +type SwarmHasher func() SwarmHash // Peer is the recorded as Source on the chunk // should probably not be here? but network should wrap chunk object @@ -78,12 +79,18 @@ func IsZeroKey(key Key) bool { var ZeroKey = Key(common.Hash{}.Bytes()) -func MakeHashFunc(hash string) Hasher { +func MakeHashFunc(hash string) SwarmHasher { switch hash { case "SHA256": - return crypto.SHA256.New + return func() SwarmHash { return &HashWithLength{crypto.SHA256.New()} } case "SHA3": - return sha3.NewKeccak256 + return func() SwarmHash { return &HashWithLength{sha3.NewKeccak256()} } + case "BMT": + return func() SwarmHash { + hasher := sha3.NewKeccak256 + pool := bmt.NewTreePool(hasher, bmt.DefaultSegmentCount, bmt.DefaultPoolSize) + return bmt.New(pool) + } } return nil } @@ -192,6 +199,13 @@ type Splitter interface { A closed error signals process completion at which point the key can be considered final if there were no errors. */ Split(io.Reader, int64, chan *Chunk, *sync.WaitGroup, *sync.WaitGroup) (Key, error) + + /* This is the first step in making files mutable (not chunks).. + Append allows adding more data chunks to the end of the already existsing file. + The key for the root chunk is supplied to load the respective tree. + Rest of the parameters behave like Split. + */ + Append(Key, io.Reader, chan *Chunk, *sync.WaitGroup, *sync.WaitGroup) (Key, error) } type Joiner interface { From 673007d7aed1d2678ea3277eceb7b55dc29cf092 Mon Sep 17 00:00:00 2001 From: cdetrio Date: Fri, 22 Sep 2017 04:22:56 -0400 Subject: [PATCH 174/272] core/vm: standard vm traces (#15035) --- cmd/evm/json_logger.go | 2 +- core/vm/interpreter.go | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cmd/evm/json_logger.go b/cmd/evm/json_logger.go index 2cfeaa7952..eb7b0c4660 100644 --- a/cmd/evm/json_logger.go +++ b/cmd/evm/json_logger.go @@ -40,7 +40,7 @@ func (l *JSONLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cos log := vm.StructLog{ Pc: pc, Op: op, - Gas: gas + cost, + Gas: gas, GasCost: cost, MemorySize: memory.Len(), Storage: nil, diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index b0d796a44b..94b922c797 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -137,12 +137,17 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret // to be uint256. Practically much less so feasible. pc = uint64(0) // program counter cost uint64 + // copies used by tracer + stackCopy = newstack() // stackCopy needed for Tracer since stack is mutated by 63/64 gas rule + pcCopy uint64 // needed for the deferred Tracer + gasCopy uint64 // for Tracer to log gas remaining before execution + logged bool // deferred Tracer should ignore already logged steps ) contract.Input = input defer func() { - if err != nil && in.cfg.Debug { - in.cfg.Tracer.CaptureState(in.evm, pc, op, contract.Gas, cost, mem, stack, contract, in.evm.depth, err) + if err != nil && !logged && in.cfg.Debug { + in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, stackCopy, contract, in.evm.depth, err) } }() @@ -154,6 +159,16 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret // Get the memory location of pc op = contract.GetOp(pc) + if in.cfg.Debug { + logged = false + pcCopy = uint64(pc) + gasCopy = uint64(contract.Gas) + stackCopy = newstack() + for _, val := range stack.data { + stackCopy.push(val) + } + } + // get the operation from the jump table matching the opcode operation := in.cfg.JumpTable[op] if err := in.enforceRestrictions(op, operation, stack); err != nil { @@ -199,7 +214,8 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret } if in.cfg.Debug { - in.cfg.Tracer.CaptureState(in.evm, pc, op, contract.Gas, cost, mem, stack, contract, in.evm.depth, err) + in.cfg.Tracer.CaptureState(in.evm, pc, op, gasCopy, cost, mem, stackCopy, contract, in.evm.depth, err) + logged = true } // execute the operation From 9feec51e2dd754819e5c730ac5985d28d57adb48 Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Mon, 25 Sep 2017 09:08:07 +0100 Subject: [PATCH 175/272] p2p: add network simulation framework (#14982) This commit introduces a network simulation framework which can be used to run simulated networks of devp2p nodes. The intention is to use this for testing protocols, performing benchmarks and visualising emergent network behaviour. --- cmd/p2psim/main.go | 414 +++++++++ node/api.go | 42 +- node/config.go | 7 + node/node.go | 19 +- p2p/dial.go | 23 +- p2p/dial_test.go | 2 +- p2p/discover/node.go | 40 + p2p/discover/node_test.go | 30 + p2p/message.go | 66 ++ p2p/peer.go | 42 +- p2p/server.go | 56 +- p2p/server_test.go | 2 +- p2p/simulations/README.md | 181 ++++ p2p/simulations/adapters/docker.go | 182 ++++ p2p/simulations/adapters/exec.go | 504 +++++++++++ p2p/simulations/adapters/inproc.go | 314 +++++++ p2p/simulations/adapters/types.go | 215 +++++ p2p/simulations/events.go | 108 +++ p2p/simulations/examples/README.md | 39 + p2p/simulations/examples/ping-pong.go | 184 ++++ p2p/simulations/examples/ping-pong.sh | 40 + p2p/simulations/http.go | 680 +++++++++++++++ p2p/simulations/http_test.go | 823 ++++++++++++++++++ p2p/simulations/network.go | 680 +++++++++++++++ p2p/simulations/network_test.go | 159 ++++ p2p/simulations/simulation.go | 157 ++++ rpc/client.go | 66 +- rpc/client_test.go | 32 + .../julienschmidt/httprouter/LICENSE | 24 + .../julienschmidt/httprouter/README.md | 266 ++++++ .../julienschmidt/httprouter/path.go | 123 +++ .../julienschmidt/httprouter/router.go | 411 +++++++++ .../julienschmidt/httprouter/tree.go | 656 ++++++++++++++ vendor/vendor.json | 6 + 34 files changed, 6523 insertions(+), 70 deletions(-) create mode 100644 cmd/p2psim/main.go create mode 100644 p2p/simulations/README.md create mode 100644 p2p/simulations/adapters/docker.go create mode 100644 p2p/simulations/adapters/exec.go create mode 100644 p2p/simulations/adapters/inproc.go create mode 100644 p2p/simulations/adapters/types.go create mode 100644 p2p/simulations/events.go create mode 100644 p2p/simulations/examples/README.md create mode 100644 p2p/simulations/examples/ping-pong.go create mode 100755 p2p/simulations/examples/ping-pong.sh create mode 100644 p2p/simulations/http.go create mode 100644 p2p/simulations/http_test.go create mode 100644 p2p/simulations/network.go create mode 100644 p2p/simulations/network_test.go create mode 100644 p2p/simulations/simulation.go create mode 100644 vendor/github.com/julienschmidt/httprouter/LICENSE create mode 100644 vendor/github.com/julienschmidt/httprouter/README.md create mode 100644 vendor/github.com/julienschmidt/httprouter/path.go create mode 100644 vendor/github.com/julienschmidt/httprouter/router.go create mode 100644 vendor/github.com/julienschmidt/httprouter/tree.go diff --git a/cmd/p2psim/main.go b/cmd/p2psim/main.go new file mode 100644 index 0000000000..56b74d135b --- /dev/null +++ b/cmd/p2psim/main.go @@ -0,0 +1,414 @@ +// p2psim provides a command-line client for a simulation HTTP API. +// +// Here is an example of creating a 2 node network with the first node +// connected to the second: +// +// $ p2psim node create +// Created node01 +// +// $ p2psim node start node01 +// Started node01 +// +// $ p2psim node create +// Created node02 +// +// $ p2psim node start node02 +// Started node02 +// +// $ p2psim node connect node01 node02 +// Connected node01 to node02 +// +package main + +import ( + "context" + "encoding/json" + "fmt" + "io" + "os" + "strings" + "text/tabwriter" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" + "gopkg.in/urfave/cli.v1" +) + +var client *simulations.Client + +func main() { + app := cli.NewApp() + app.Usage = "devp2p simulation command-line client" + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "api", + Value: "http://localhost:8888", + Usage: "simulation API URL", + EnvVar: "P2PSIM_API_URL", + }, + } + app.Before = func(ctx *cli.Context) error { + client = simulations.NewClient(ctx.GlobalString("api")) + return nil + } + app.Commands = []cli.Command{ + { + Name: "show", + Usage: "show network information", + Action: showNetwork, + }, + { + Name: "events", + Usage: "stream network events", + Action: streamNetwork, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "current", + Usage: "get existing nodes and conns first", + }, + cli.StringFlag{ + Name: "filter", + Value: "", + Usage: "message filter", + }, + }, + }, + { + Name: "snapshot", + Usage: "create a network snapshot to stdout", + Action: createSnapshot, + }, + { + Name: "load", + Usage: "load a network snapshot from stdin", + Action: loadSnapshot, + }, + { + Name: "node", + Usage: "manage simulation nodes", + Action: listNodes, + Subcommands: []cli.Command{ + { + Name: "list", + Usage: "list nodes", + Action: listNodes, + }, + { + Name: "create", + Usage: "create a node", + Action: createNode, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "name", + Value: "", + Usage: "node name", + }, + cli.StringFlag{ + Name: "services", + Value: "", + Usage: "node services (comma separated)", + }, + cli.StringFlag{ + Name: "key", + Value: "", + Usage: "node private key (hex encoded)", + }, + }, + }, + { + Name: "show", + ArgsUsage: "", + Usage: "show node information", + Action: showNode, + }, + { + Name: "start", + ArgsUsage: "", + Usage: "start a node", + Action: startNode, + }, + { + Name: "stop", + ArgsUsage: "", + Usage: "stop a node", + Action: stopNode, + }, + { + Name: "connect", + ArgsUsage: " ", + Usage: "connect a node to a peer node", + Action: connectNode, + }, + { + Name: "disconnect", + ArgsUsage: " ", + Usage: "disconnect a node from a peer node", + Action: disconnectNode, + }, + { + Name: "rpc", + ArgsUsage: " []", + Usage: "call a node RPC method", + Action: rpcNode, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "subscribe", + Usage: "method is a subscription", + }, + }, + }, + }, + }, + } + app.Run(os.Args) +} + +func showNetwork(ctx *cli.Context) error { + if len(ctx.Args()) != 0 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + network, err := client.GetNetwork() + if err != nil { + return err + } + w := tabwriter.NewWriter(ctx.App.Writer, 1, 2, 2, ' ', 0) + defer w.Flush() + fmt.Fprintf(w, "NODES\t%d\n", len(network.Nodes)) + fmt.Fprintf(w, "CONNS\t%d\n", len(network.Conns)) + return nil +} + +func streamNetwork(ctx *cli.Context) error { + if len(ctx.Args()) != 0 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + events := make(chan *simulations.Event) + sub, err := client.SubscribeNetwork(events, simulations.SubscribeOpts{ + Current: ctx.Bool("current"), + Filter: ctx.String("filter"), + }) + if err != nil { + return err + } + defer sub.Unsubscribe() + enc := json.NewEncoder(ctx.App.Writer) + for { + select { + case event := <-events: + if err := enc.Encode(event); err != nil { + return err + } + case err := <-sub.Err(): + return err + } + } +} + +func createSnapshot(ctx *cli.Context) error { + if len(ctx.Args()) != 0 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + snap, err := client.CreateSnapshot() + if err != nil { + return err + } + return json.NewEncoder(os.Stdout).Encode(snap) +} + +func loadSnapshot(ctx *cli.Context) error { + if len(ctx.Args()) != 0 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + snap := &simulations.Snapshot{} + if err := json.NewDecoder(os.Stdin).Decode(snap); err != nil { + return err + } + return client.LoadSnapshot(snap) +} + +func listNodes(ctx *cli.Context) error { + if len(ctx.Args()) != 0 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodes, err := client.GetNodes() + if err != nil { + return err + } + w := tabwriter.NewWriter(ctx.App.Writer, 1, 2, 2, ' ', 0) + defer w.Flush() + fmt.Fprintf(w, "NAME\tPROTOCOLS\tID\n") + for _, node := range nodes { + fmt.Fprintf(w, "%s\t%s\t%s\n", node.Name, strings.Join(protocolList(node), ","), node.ID) + } + return nil +} + +func protocolList(node *p2p.NodeInfo) []string { + protos := make([]string, 0, len(node.Protocols)) + for name := range node.Protocols { + protos = append(protos, name) + } + return protos +} + +func createNode(ctx *cli.Context) error { + if len(ctx.Args()) != 0 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + config := &adapters.NodeConfig{ + Name: ctx.String("name"), + } + if key := ctx.String("key"); key != "" { + privKey, err := crypto.HexToECDSA(key) + if err != nil { + return err + } + config.ID = discover.PubkeyID(&privKey.PublicKey) + config.PrivateKey = privKey + } + if services := ctx.String("services"); services != "" { + config.Services = strings.Split(services, ",") + } + node, err := client.CreateNode(config) + if err != nil { + return err + } + fmt.Fprintln(ctx.App.Writer, "Created", node.Name) + return nil +} + +func showNode(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 1 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodeName := args[0] + node, err := client.GetNode(nodeName) + if err != nil { + return err + } + w := tabwriter.NewWriter(ctx.App.Writer, 1, 2, 2, ' ', 0) + defer w.Flush() + fmt.Fprintf(w, "NAME\t%s\n", node.Name) + fmt.Fprintf(w, "PROTOCOLS\t%s\n", strings.Join(protocolList(node), ",")) + fmt.Fprintf(w, "ID\t%s\n", node.ID) + fmt.Fprintf(w, "ENODE\t%s\n", node.Enode) + for name, proto := range node.Protocols { + fmt.Fprintln(w) + fmt.Fprintf(w, "--- PROTOCOL INFO: %s\n", name) + fmt.Fprintf(w, "%v\n", proto) + fmt.Fprintf(w, "---\n") + } + return nil +} + +func startNode(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 1 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodeName := args[0] + if err := client.StartNode(nodeName); err != nil { + return err + } + fmt.Fprintln(ctx.App.Writer, "Started", nodeName) + return nil +} + +func stopNode(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 1 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodeName := args[0] + if err := client.StopNode(nodeName); err != nil { + return err + } + fmt.Fprintln(ctx.App.Writer, "Stopped", nodeName) + return nil +} + +func connectNode(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 2 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodeName := args[0] + peerName := args[1] + if err := client.ConnectNode(nodeName, peerName); err != nil { + return err + } + fmt.Fprintln(ctx.App.Writer, "Connected", nodeName, "to", peerName) + return nil +} + +func disconnectNode(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 2 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodeName := args[0] + peerName := args[1] + if err := client.DisconnectNode(nodeName, peerName); err != nil { + return err + } + fmt.Fprintln(ctx.App.Writer, "Disconnected", nodeName, "from", peerName) + return nil +} + +func rpcNode(ctx *cli.Context) error { + args := ctx.Args() + if len(args) < 2 { + return cli.ShowCommandHelp(ctx, ctx.Command.Name) + } + nodeName := args[0] + method := args[1] + rpcClient, err := client.RPCClient(context.Background(), nodeName) + if err != nil { + return err + } + if ctx.Bool("subscribe") { + return rpcSubscribe(rpcClient, ctx.App.Writer, method, args[3:]...) + } + var result interface{} + params := make([]interface{}, len(args[3:])) + for i, v := range args[3:] { + params[i] = v + } + if err := rpcClient.Call(&result, method, params...); err != nil { + return err + } + return json.NewEncoder(ctx.App.Writer).Encode(result) +} + +func rpcSubscribe(client *rpc.Client, out io.Writer, method string, args ...string) error { + parts := strings.SplitN(method, "_", 2) + namespace := parts[0] + method = parts[1] + ch := make(chan interface{}) + subArgs := make([]interface{}, len(args)+1) + subArgs[0] = method + for i, v := range args { + subArgs[i+1] = v + } + sub, err := client.Subscribe(context.Background(), namespace, ch, subArgs...) + if err != nil { + return err + } + defer sub.Unsubscribe() + enc := json.NewEncoder(out) + for { + select { + case v := <-ch: + if err := enc.Encode(v); err != nil { + return err + } + case err := <-sub.Err(): + return err + } + } +} diff --git a/node/api.go b/node/api.go index 570cb9d98e..1b04b70938 100644 --- a/node/api.go +++ b/node/api.go @@ -17,6 +17,7 @@ package node import ( + "context" "fmt" "strings" "time" @@ -25,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/rpc" "github.com/rcrowley/go-metrics" ) @@ -73,6 +75,44 @@ func (api *PrivateAdminAPI) RemovePeer(url string) (bool, error) { return true, nil } +// PeerEvents creates an RPC subscription which receives peer events from the +// node's p2p.Server +func (api *PrivateAdminAPI) PeerEvents(ctx context.Context) (*rpc.Subscription, error) { + // Make sure the server is running, fail otherwise + server := api.node.Server() + if server == nil { + return nil, ErrNodeStopped + } + + // Create the subscription + notifier, supported := rpc.NotifierFromContext(ctx) + if !supported { + return nil, rpc.ErrNotificationsUnsupported + } + rpcSub := notifier.CreateSubscription() + + go func() { + events := make(chan *p2p.PeerEvent) + sub := server.SubscribeEvents(events) + defer sub.Unsubscribe() + + for { + select { + case event := <-events: + notifier.Notify(rpcSub.ID, event) + case <-sub.Err(): + return + case <-rpcSub.Err(): + return + case <-notifier.Closed(): + return + } + } + }() + + return rpcSub, nil +} + // StartRPC starts the HTTP RPC API server. func (api *PrivateAdminAPI) StartRPC(host *string, port *int, cors *string, apis *string) (bool, error) { api.node.lock.Lock() @@ -163,7 +203,7 @@ func (api *PrivateAdminAPI) StartWS(host *string, port *int, allowedOrigins *str } } - if err := api.node.startWS(fmt.Sprintf("%s:%d", *host, *port), api.node.rpcAPIs, modules, origins); err != nil { + if err := api.node.startWS(fmt.Sprintf("%s:%d", *host, *port), api.node.rpcAPIs, modules, origins, api.node.config.WSExposeAll); err != nil { return false, err } return true, nil diff --git a/node/config.go b/node/config.go index b9b5e5b922..be9e21b4fa 100644 --- a/node/config.go +++ b/node/config.go @@ -128,6 +128,13 @@ type Config struct { // If the module list is empty, all RPC API endpoints designated public will be // exposed. WSModules []string `toml:",omitempty"` + + // WSExposeAll exposes all API modules via the WebSocket RPC interface rather + // than just the public ones. + // + // *WARNING* Only set this if the node is running in a trusted network, exposing + // private APIs to untrusted users is a major security risk. + WSExposeAll bool `toml:",omitempty"` } // IPCEndpoint resolves an IPC endpoint based on a configured value, taking into diff --git a/node/node.go b/node/node.go index 86cfb29baf..6f189d8fe5 100644 --- a/node/node.go +++ b/node/node.go @@ -261,7 +261,7 @@ func (n *Node) startRPC(services map[reflect.Type]Service) error { n.stopInProc() return err } - if err := n.startWS(n.wsEndpoint, apis, n.config.WSModules, n.config.WSOrigins); err != nil { + if err := n.startWS(n.wsEndpoint, apis, n.config.WSModules, n.config.WSOrigins, n.config.WSExposeAll); err != nil { n.stopHTTP() n.stopIPC() n.stopInProc() @@ -412,7 +412,7 @@ func (n *Node) stopHTTP() { } // startWS initializes and starts the websocket RPC endpoint. -func (n *Node) startWS(endpoint string, apis []rpc.API, modules []string, wsOrigins []string) error { +func (n *Node) startWS(endpoint string, apis []rpc.API, modules []string, wsOrigins []string, exposeAll bool) error { // Short circuit if the WS endpoint isn't being exposed if endpoint == "" { return nil @@ -425,7 +425,7 @@ func (n *Node) startWS(endpoint string, apis []rpc.API, modules []string, wsOrig // Register all the APIs exposed by the services handler := rpc.NewServer() for _, api := range apis { - if whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) { + if exposeAll || whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) { if err := handler.RegisterName(api.Namespace, api.Service); err != nil { return err } @@ -441,7 +441,7 @@ func (n *Node) startWS(endpoint string, apis []rpc.API, modules []string, wsOrig return err } go rpc.NewWSServer(wsOrigins, handler).Serve(listener) - log.Info(fmt.Sprintf("WebSocket endpoint opened: ws://%s", endpoint)) + log.Info(fmt.Sprintf("WebSocket endpoint opened: ws://%s", listener.Addr())) // All listeners booted successfully n.wsEndpoint = endpoint @@ -556,6 +556,17 @@ func (n *Node) Attach() (*rpc.Client, error) { return rpc.DialInProc(n.inprocHandler), nil } +// RPCHandler returns the in-process RPC request handler. +func (n *Node) RPCHandler() (*rpc.Server, error) { + n.lock.RLock() + defer n.lock.RUnlock() + + if n.inprocHandler == nil { + return nil, ErrNodeStopped + } + return n.inprocHandler, nil +} + // Server retrieves the currently running P2P network layer. This method is meant // only to inspect fields of the currently running server, life cycle management // should be left to this Node entity. diff --git a/p2p/dial.go b/p2p/dial.go index b779713963..2d9e3a0edc 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -47,6 +47,24 @@ const ( maxResolveDelay = time.Hour ) +// NodeDialer is used to connect to nodes in the network, typically by using +// an underlying net.Dialer but also using net.Pipe in tests +type NodeDialer interface { + Dial(*discover.Node) (net.Conn, error) +} + +// TCPDialer implements the NodeDialer interface by using a net.Dialer to +// create TCP connections to nodes in the network +type TCPDialer struct { + *net.Dialer +} + +// Dial creates a TCP connection to the node +func (t TCPDialer) Dial(dest *discover.Node) (net.Conn, error) { + addr := &net.TCPAddr{IP: dest.IP, Port: int(dest.TCP)} + return t.Dialer.Dial("tcp", addr.String()) +} + // dialstate schedules dials and discovery lookups. // it get's a chance to compute new tasks on every iteration // of the main loop in Server.run. @@ -318,14 +336,13 @@ func (t *dialTask) resolve(srv *Server) bool { // dial performs the actual connection attempt. func (t *dialTask) dial(srv *Server, dest *discover.Node) bool { - addr := &net.TCPAddr{IP: dest.IP, Port: int(dest.TCP)} - fd, err := srv.Dialer.Dial("tcp", addr.String()) + fd, err := srv.Dialer.Dial(dest) if err != nil { log.Trace("Dial error", "task", t, "err", err) return false } mfd := newMeteredConn(fd, false) - srv.setupConn(mfd, t.flags, dest) + srv.SetupConn(mfd, t.flags, dest) return true } diff --git a/p2p/dial_test.go b/p2p/dial_test.go index 08e863bae0..ad18ef9abe 100644 --- a/p2p/dial_test.go +++ b/p2p/dial_test.go @@ -597,7 +597,7 @@ func TestDialResolve(t *testing.T) { } // Now run the task, it should resolve the ID once. - config := Config{Dialer: &net.Dialer{Deadline: time.Now().Add(-5 * time.Minute)}} + config := Config{Dialer: TCPDialer{&net.Dialer{Deadline: time.Now().Add(-5 * time.Minute)}}} srv := &Server{ntab: table, Config: config} tasks[0].Do(srv) if !reflect.DeepEqual(table.resolveCalls, []discover.NodeID{dest.ID}) { diff --git a/p2p/discover/node.go b/p2p/discover/node.go index d9cbd9448e..fc928a91af 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -225,6 +225,11 @@ func (n *Node) UnmarshalText(text []byte) error { // The node identifier is a marshaled elliptic curve public key. type NodeID [NodeIDBits / 8]byte +// Bytes returns a byte slice representation of the NodeID +func (n NodeID) Bytes() []byte { + return n[:] +} + // NodeID prints as a long hexadecimal number. func (n NodeID) String() string { return fmt.Sprintf("%x", n[:]) @@ -240,6 +245,41 @@ func (n NodeID) TerminalString() string { return hex.EncodeToString(n[:8]) } +// MarshalText implements the encoding.TextMarshaler interface. +func (n NodeID) MarshalText() ([]byte, error) { + return []byte(hex.EncodeToString(n[:])), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (n *NodeID) UnmarshalText(text []byte) error { + id, err := HexID(string(text)) + if err != nil { + return err + } + *n = id + return nil +} + +// BytesID converts a byte slice to a NodeID +func BytesID(b []byte) (NodeID, error) { + var id NodeID + if len(b) != len(id) { + return id, fmt.Errorf("wrong length, want %d bytes", len(id)) + } + copy(id[:], b) + return id, nil +} + +// MustBytesID converts a byte slice to a NodeID. +// It panics if the byte slice is not a valid NodeID. +func MustBytesID(b []byte) NodeID { + id, err := BytesID(b) + if err != nil { + panic(err) + } + return id +} + // HexID converts a hex string to a NodeID. // The string may be prefixed with 0x. func HexID(in string) (NodeID, error) { diff --git a/p2p/discover/node_test.go b/p2p/discover/node_test.go index 3d1662d0b9..ed8db4dc65 100644 --- a/p2p/discover/node_test.go +++ b/p2p/discover/node_test.go @@ -17,6 +17,7 @@ package discover import ( + "bytes" "fmt" "math/big" "math/rand" @@ -192,6 +193,35 @@ func TestHexID(t *testing.T) { } } +func TestNodeID_textEncoding(t *testing.T) { + ref := NodeID{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60, + 0x61, 0x62, 0x63, 0x64, + } + hex := "01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364" + + text, err := ref.MarshalText() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(text, []byte(hex)) { + t.Fatalf("text encoding did not match\nexpected: %s\ngot: %s", hex, text) + } + + id := new(NodeID) + if err := id.UnmarshalText(text); err != nil { + t.Fatal(err) + } + if *id != ref { + t.Fatalf("text decoding did not match\nexpected: %s\ngot: %s", ref, id) + } +} + func TestNodeID_recover(t *testing.T) { prv := newkey() hash := make([]byte, 32) diff --git a/p2p/message.go b/p2p/message.go index 1292d21213..5690494bf4 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -27,6 +27,8 @@ import ( "sync/atomic" "time" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/rlp" ) @@ -271,3 +273,67 @@ func ExpectMsg(r MsgReader, code uint64, content interface{}) error { } return nil } + +// msgEventer wraps a MsgReadWriter and sends events whenever a message is sent +// or received +type msgEventer struct { + MsgReadWriter + + feed *event.Feed + peerID discover.NodeID + Protocol string +} + +// newMsgEventer returns a msgEventer which sends message events to the given +// feed +func newMsgEventer(rw MsgReadWriter, feed *event.Feed, peerID discover.NodeID, proto string) *msgEventer { + return &msgEventer{ + MsgReadWriter: rw, + feed: feed, + peerID: peerID, + Protocol: proto, + } +} + +// ReadMsg reads a message from the underlying MsgReadWriter and emits a +// "message received" event +func (self *msgEventer) ReadMsg() (Msg, error) { + msg, err := self.MsgReadWriter.ReadMsg() + if err != nil { + return msg, err + } + self.feed.Send(&PeerEvent{ + Type: PeerEventTypeMsgRecv, + Peer: self.peerID, + Protocol: self.Protocol, + MsgCode: &msg.Code, + MsgSize: &msg.Size, + }) + return msg, nil +} + +// WriteMsg writes a message to the underlying MsgReadWriter and emits a +// "message sent" event +func (self *msgEventer) WriteMsg(msg Msg) error { + err := self.MsgReadWriter.WriteMsg(msg) + if err != nil { + return err + } + self.feed.Send(&PeerEvent{ + Type: PeerEventTypeMsgSend, + Peer: self.peerID, + Protocol: self.Protocol, + MsgCode: &msg.Code, + MsgSize: &msg.Size, + }) + return nil +} + +// Close closes the underlying MsgReadWriter if it implements the io.Closer +// interface +func (self *msgEventer) Close() error { + if v, ok := self.MsgReadWriter.(io.Closer); ok { + return v.Close() + } + return nil +} diff --git a/p2p/peer.go b/p2p/peer.go index fb4b39e950..ebf7490c68 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -25,6 +25,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/rlp" @@ -60,6 +61,38 @@ type protoHandshake struct { Rest []rlp.RawValue `rlp:"tail"` } +// PeerEventType is the type of peer events emitted by a p2p.Server +type PeerEventType string + +const ( + // PeerEventTypeAdd is the type of event emitted when a peer is added + // to a p2p.Server + PeerEventTypeAdd PeerEventType = "add" + + // PeerEventTypeDrop is the type of event emitted when a peer is + // dropped from a p2p.Server + PeerEventTypeDrop PeerEventType = "drop" + + // PeerEventTypeMsgSend is the type of event emitted when a + // message is successfully sent to a peer + PeerEventTypeMsgSend PeerEventType = "msgsend" + + // PeerEventTypeMsgRecv is the type of event emitted when a + // message is received from a peer + PeerEventTypeMsgRecv PeerEventType = "msgrecv" +) + +// PeerEvent is an event emitted when peers are either added or dropped from +// a p2p.Server or when a message is sent or received on a peer connection +type PeerEvent struct { + Type PeerEventType `json:"type"` + Peer discover.NodeID `json:"peer"` + Error string `json:"error,omitempty"` + Protocol string `json:"protocol,omitempty"` + MsgCode *uint64 `json:"msg_code,omitempty"` + MsgSize *uint32 `json:"msg_size,omitempty"` +} + // Peer represents a connected remote node. type Peer struct { rw *conn @@ -71,6 +104,9 @@ type Peer struct { protoErr chan error closed chan struct{} disc chan DiscReason + + // events receives message send / receive events if set + events *event.Feed } // NewPeer returns a peer for testing purposes. @@ -297,9 +333,13 @@ func (p *Peer) startProtocols(writeStart <-chan struct{}, writeErr chan<- error) proto.closed = p.closed proto.wstart = writeStart proto.werr = writeErr + var rw MsgReadWriter = proto + if p.events != nil { + rw = newMsgEventer(rw, p.events, p.ID(), proto.Name) + } p.log.Trace(fmt.Sprintf("Starting protocol %s/%d", proto.Name, proto.Version)) go func() { - err := proto.Run(p, proto) + err := proto.Run(p, rw) if err == nil { p.log.Trace(fmt.Sprintf("Protocol %s/%d returned", proto.Name, proto.Version)) err = errProtocolReturned diff --git a/p2p/server.go b/p2p/server.go index d7909d53a9..d1d578401b 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discv5" @@ -130,10 +131,14 @@ type Config struct { // If Dialer is set to a non-nil value, the given Dialer // is used to dial outbound peer connections. - Dialer *net.Dialer `toml:"-"` + Dialer NodeDialer `toml:"-"` // If NoDial is true, the server will not dial any peers. NoDial bool `toml:",omitempty"` + + // If EnableMsgEvents is set then the server will emit PeerEvents + // whenever a message is sent to or received from a peer + EnableMsgEvents bool } // Server manages all peer connections. @@ -166,6 +171,7 @@ type Server struct { addpeer chan *conn delpeer chan peerDrop loopWG sync.WaitGroup // loop, listenLoop + peerFeed event.Feed } type peerOpFunc func(map[discover.NodeID]*Peer) @@ -191,7 +197,7 @@ type conn struct { fd net.Conn transport flags connFlag - cont chan error // The run loop uses cont to signal errors to setupConn. + cont chan error // The run loop uses cont to signal errors to SetupConn. id discover.NodeID // valid after the encryption handshake caps []Cap // valid after the protocol handshake name string // valid after the protocol handshake @@ -291,6 +297,11 @@ func (srv *Server) RemovePeer(node *discover.Node) { } } +// SubscribePeers subscribes the given channel to peer events +func (srv *Server) SubscribeEvents(ch chan *PeerEvent) event.Subscription { + return srv.peerFeed.Subscribe(ch) +} + // Self returns the local node's endpoint information. func (srv *Server) Self() *discover.Node { srv.lock.Lock() @@ -358,7 +369,7 @@ func (srv *Server) Start() (err error) { srv.newTransport = newRLPX } if srv.Dialer == nil { - srv.Dialer = &net.Dialer{Timeout: defaultDialTimeout} + srv.Dialer = TCPDialer{&net.Dialer{Timeout: defaultDialTimeout}} } srv.quit = make(chan struct{}) srv.addpeer = make(chan *conn) @@ -536,7 +547,11 @@ running: c.flags |= trustedConn } // TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them. - c.cont <- srv.encHandshakeChecks(peers, c) + select { + case c.cont <- srv.encHandshakeChecks(peers, c): + case <-srv.quit: + break running + } case c := <-srv.addpeer: // At this point the connection is past the protocol handshake. // Its capabilities are known and the remote identity is verified. @@ -544,6 +559,11 @@ running: if err == nil { // The handshakes are done and it passed all checks. p := newPeer(c, srv.Protocols) + // If message events are enabled, pass the peerFeed + // to the peer + if srv.EnableMsgEvents { + p.events = &srv.peerFeed + } name := truncateName(c.name) log.Debug("Adding p2p peer", "id", c.id, "name", name, "addr", c.fd.RemoteAddr(), "peers", len(peers)+1) peers[c.id] = p @@ -552,7 +572,11 @@ running: // The dialer logic relies on the assumption that // dial tasks complete after the peer has been added or // discarded. Unblock the task last. - c.cont <- err + select { + case c.cont <- err: + case <-srv.quit: + break running + } case pd := <-srv.delpeer: // A peer disconnected. d := common.PrettyDuration(mclock.Now() - pd.created) @@ -665,16 +689,16 @@ func (srv *Server) listenLoop() { // Spawn the handler. It will give the slot back when the connection // has been established. go func() { - srv.setupConn(fd, inboundConn, nil) + srv.SetupConn(fd, inboundConn, nil) slots <- struct{}{} }() } } -// setupConn runs the handshakes and attempts to add the connection +// SetupConn runs the handshakes and attempts to add the connection // as a peer. It returns when the connection has been added as a peer // or the handshakes have failed. -func (srv *Server) setupConn(fd net.Conn, flags connFlag, dialDest *discover.Node) { +func (srv *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *discover.Node) { // Prevent leftover pending conns from entering the handshake. srv.lock.Lock() running := srv.running @@ -755,7 +779,23 @@ func (srv *Server) runPeer(p *Peer) { if srv.newPeerHook != nil { srv.newPeerHook(p) } + + // broadcast peer add + srv.peerFeed.Send(&PeerEvent{ + Type: PeerEventTypeAdd, + Peer: p.ID(), + }) + + // run the protocol remoteRequested, err := p.run() + + // broadcast peer drop + srv.peerFeed.Send(&PeerEvent{ + Type: PeerEventTypeDrop, + Peer: p.ID(), + Error: err.Error(), + }) + // Note: run waits for existing peers to be sent on srv.delpeer // before returning, so this send should not select on srv.quit. srv.delpeer <- peerDrop{p, err, remoteRequested} diff --git a/p2p/server_test.go b/p2p/server_test.go index 971faf002c..11dd83e5d6 100644 --- a/p2p/server_test.go +++ b/p2p/server_test.go @@ -435,7 +435,7 @@ func TestServerSetupConn(t *testing.T) { } } p1, _ := net.Pipe() - srv.setupConn(p1, test.flags, test.dialDest) + srv.SetupConn(p1, test.flags, test.dialDest) if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) { t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr) } diff --git a/p2p/simulations/README.md b/p2p/simulations/README.md new file mode 100644 index 0000000000..d1f8649eae --- /dev/null +++ b/p2p/simulations/README.md @@ -0,0 +1,181 @@ +# devp2p Simulations + +The `p2p/simulations` package implements a simulation framework which supports +creating a collection of devp2p nodes, connecting them together to form a +simulation network, performing simulation actions in that network and then +extracting useful information. + +## Nodes + +Each node in a simulation network runs multiple services by wrapping a collection +of objects which implement the `node.Service` interface meaning they: + +* can be started and stopped +* run p2p protocols +* expose RPC APIs + +This means that any object which implements the `node.Service` interface can be +used to run a node in the simulation. + +## Services + +Before running a simulation, a set of service initializers must be registered +which can then be used to run nodes in the network. + +A service initializer is a function with the following signature: + +```go +func(ctx *adapters.ServiceContext) (node.Service, error) +``` + +These initializers should be registered by calling the `adapters.RegisterServices` +function in an `init()` hook: + +```go +func init() { + adapters.RegisterServices(adapters.Services{ + "service1": initService1, + "service2": initService2, + }) +} +``` + +## Node Adapters + +The simulation framework includes multiple "node adapters" which are +responsible for creating an environment in which a node runs. + +### SimAdapter + +The `SimAdapter` runs nodes in-memory, connecting them using an in-memory, +synchronous `net.Pipe` and connecting to their RPC server using an in-memory +`rpc.Client`. + +### ExecAdapter + +The `ExecAdapter` runs nodes as child processes of the running simulation. + +It does this by executing the binary which is running the simulation but +setting `argv[0]` (i.e. the program name) to `p2p-node` which is then +detected by an init hook in the child process which runs the `node.Service` +using the devp2p node stack rather than executing `main()`. + +The nodes listen for devp2p connections and WebSocket RPC clients on random +localhost ports. + +### DockerAdapter + +The `DockerAdapter` is similar to the `ExecAdapter` but executes `docker run` +to run the node in a Docker container using a Docker image containing the +simulation binary at `/bin/p2p-node`. + +The Docker image is built using `docker build` when the adapter is initialised, +meaning no prior setup is necessary other than having a working Docker client. + +Each node listens on the external IP of the container and the default p2p and +RPC ports (`30303` and `8546` respectively). + +## Network + +A simulation network is created with an ID and default service (which is used +if a node is created without an explicit service), exposes methods for +creating, starting, stopping, connecting and disconnecting nodes, and emits +events when certain actions occur. + +### Events + +A simulation network emits the following events: + +* node event - when nodes are created / started / stopped +* connection event - when nodes are connected / disconnected +* message event - when a protocol message is sent between two nodes + +The events have a "control" flag which when set indicates that the event is the +outcome of a controlled simulation action (e.g. creating a node or explicitly +connecting two nodes together). + +This is in contrast to a non-control event, otherwise called a "live" event, +which is the outcome of something happening in the network as a result of a +control event (e.g. a node actually started up or a connection was actually +established between two nodes). + +Live events are detected by the simulation network by subscribing to node peer +events via RPC when the nodes start up. + +## Testing Framework + +The `Simulation` type can be used in tests to perform actions in a simulation +network and then wait for expectations to be met. + +With a running simulation network, the `Simulation.Run` method can be called +with a `Step` which has the following fields: + +* `Action` - a function which performs some action in the network + +* `Expect` - an expectation function which returns whether or not a + given node meets the expectation + +* `Trigger` - a channel which receives node IDs which then trigger a check + of the expectation function to be performed against that node + +As a concrete example, consider a simulated network of Ethereum nodes. An +`Action` could be the sending of a transaction, `Expect` it being included in +a block, and `Trigger` a check for every block that is mined. + +On return, the `Simulation.Run` method returns a `StepResult` which can be used +to determine if all nodes met the expectation, how long it took them to meet +the expectation and what network events were emitted during the step run. + +## HTTP API + +The simulation framework includes a HTTP API which can be used to control the +simulation. + +The API is initialised with a particular node adapter and has the following +endpoints: + +``` +GET / Get network information +POST /start Start all nodes in the network +POST /stop Stop all nodes in the network +GET /events Stream network events +GET /snapshot Take a network snapshot +POST /snapshot Load a network snapshot +POST /nodes Create a node +GET /nodes Get all nodes in the network +GET /nodes/:nodeid Get node information +POST /nodes/:nodeid/start Start a node +POST /nodes/:nodeid/stop Stop a node +POST /nodes/:nodeid/conn/:peerid Connect two nodes +DELETE /nodes/:nodeid/conn/:peerid Disconnect two nodes +GET /nodes/:nodeid/rpc Make RPC requests to a node via WebSocket +``` + +For convenience, `nodeid` in the URL can be the name of a node rather than its +ID. + +## Command line client + +`p2psim` is a command line client for the HTTP API, located in +`cmd/p2psim`. + +It provides the following commands: + +``` +p2psim show +p2psim events [--current] [--filter=FILTER] +p2psim snapshot +p2psim load +p2psim node create [--name=NAME] [--services=SERVICES] [--key=KEY] +p2psim node list +p2psim node show +p2psim node start +p2psim node stop +p2psim node connect +p2psim node disconnect +p2psim node rpc [] [--subscribe] +``` + +## Example + +See [p2p/simulations/examples/README.md](examples/README.md). diff --git a/p2p/simulations/adapters/docker.go b/p2p/simulations/adapters/docker.go new file mode 100644 index 0000000000..022314b3d7 --- /dev/null +++ b/p2p/simulations/adapters/docker.go @@ -0,0 +1,182 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package adapters + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + + "github.com/docker/docker/pkg/reexec" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p/discover" +) + +// DockerAdapter is a NodeAdapter which runs simulation nodes inside Docker +// containers. +// +// A Docker image is built which contains the current binary at /bin/p2p-node +// which when executed runs the underlying service (see the description +// of the execP2PNode function for more details) +type DockerAdapter struct { + ExecAdapter +} + +// NewDockerAdapter builds the p2p-node Docker image containing the current +// binary and returns a DockerAdapter +func NewDockerAdapter() (*DockerAdapter, error) { + // Since Docker containers run on Linux and this adapter runs the + // current binary in the container, it must be compiled for Linux. + // + // It is reasonable to require this because the caller can just + // compile the current binary in a Docker container. + if runtime.GOOS != "linux" { + return nil, errors.New("DockerAdapter can only be used on Linux as it uses the current binary (which must be a Linux binary)") + } + + if err := buildDockerImage(); err != nil { + return nil, err + } + + return &DockerAdapter{ + ExecAdapter{ + nodes: make(map[discover.NodeID]*ExecNode), + }, + }, nil +} + +// Name returns the name of the adapter for logging purposes +func (d *DockerAdapter) Name() string { + return "docker-adapter" +} + +// NewNode returns a new DockerNode using the given config +func (d *DockerAdapter) NewNode(config *NodeConfig) (Node, error) { + if len(config.Services) == 0 { + return nil, errors.New("node must have at least one service") + } + for _, service := range config.Services { + if _, exists := serviceFuncs[service]; !exists { + return nil, fmt.Errorf("unknown node service %q", service) + } + } + + // generate the config + conf := &execNodeConfig{ + Stack: node.DefaultConfig, + Node: config, + } + conf.Stack.DataDir = "/data" + conf.Stack.WSHost = "0.0.0.0" + conf.Stack.WSOrigins = []string{"*"} + conf.Stack.WSExposeAll = true + conf.Stack.P2P.EnableMsgEvents = false + conf.Stack.P2P.NoDiscovery = true + conf.Stack.P2P.NAT = nil + conf.Stack.NoUSB = true + + node := &DockerNode{ + ExecNode: ExecNode{ + ID: config.ID, + Config: conf, + adapter: &d.ExecAdapter, + }, + } + node.newCmd = node.dockerCommand + d.ExecAdapter.nodes[node.ID] = &node.ExecNode + return node, nil +} + +// DockerNode wraps an ExecNode but exec's the current binary in a docker +// container rather than locally +type DockerNode struct { + ExecNode +} + +// dockerCommand returns a command which exec's the binary in a Docker +// container. +// +// It uses a shell so that we can pass the _P2P_NODE_CONFIG environment +// variable to the container using the --env flag. +func (n *DockerNode) dockerCommand() *exec.Cmd { + return exec.Command( + "sh", "-c", + fmt.Sprintf( + `exec docker run --interactive --env _P2P_NODE_CONFIG="${_P2P_NODE_CONFIG}" %s p2p-node %s %s`, + dockerImage, strings.Join(n.Config.Node.Services, ","), n.ID.String(), + ), + ) +} + +// dockerImage is the name of the Docker image which gets built to run the +// simulation node +const dockerImage = "p2p-node" + +// buildDockerImage builds the Docker image which is used to run the simulation +// node in a Docker container. +// +// It adds the current binary as "p2p-node" so that it runs execP2PNode +// when executed. +func buildDockerImage() error { + // create a directory to use as the build context + dir, err := ioutil.TempDir("", "p2p-docker") + if err != nil { + return err + } + defer os.RemoveAll(dir) + + // copy the current binary into the build context + bin, err := os.Open(reexec.Self()) + if err != nil { + return err + } + defer bin.Close() + dst, err := os.OpenFile(filepath.Join(dir, "self.bin"), os.O_WRONLY|os.O_CREATE, 0755) + if err != nil { + return err + } + defer dst.Close() + if _, err := io.Copy(dst, bin); err != nil { + return err + } + + // create the Dockerfile + dockerfile := []byte(` +FROM ubuntu:16.04 +RUN mkdir /data +ADD self.bin /bin/p2p-node + `) + if err := ioutil.WriteFile(filepath.Join(dir, "Dockerfile"), dockerfile, 0644); err != nil { + return err + } + + // run 'docker build' + cmd := exec.Command("docker", "build", "-t", dockerImage, dir) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("error building docker image: %s", err) + } + + return nil +} diff --git a/p2p/simulations/adapters/exec.go b/p2p/simulations/adapters/exec.go new file mode 100644 index 0000000000..bdb92cc1d2 --- /dev/null +++ b/p2p/simulations/adapters/exec.go @@ -0,0 +1,504 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package adapters + +import ( + "bufio" + "context" + "crypto/ecdsa" + "encoding/json" + "errors" + "fmt" + "io" + "net" + "os" + "os/exec" + "os/signal" + "path/filepath" + "regexp" + "strings" + "sync" + "syscall" + "time" + + "github.com/docker/docker/pkg/reexec" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/rpc" + "golang.org/x/net/websocket" +) + +// ExecAdapter is a NodeAdapter which runs simulation nodes by executing the +// current binary as a child process. +// +// An init hook is used so that the child process executes the node services +// (rather than whataver the main() function would normally do), see the +// execP2PNode function for more information. +type ExecAdapter struct { + // BaseDir is the directory under which the data directories for each + // simulation node are created. + BaseDir string + + nodes map[discover.NodeID]*ExecNode +} + +// NewExecAdapter returns an ExecAdapter which stores node data in +// subdirectories of the given base directory +func NewExecAdapter(baseDir string) *ExecAdapter { + return &ExecAdapter{ + BaseDir: baseDir, + nodes: make(map[discover.NodeID]*ExecNode), + } +} + +// Name returns the name of the adapter for logging purposes +func (e *ExecAdapter) Name() string { + return "exec-adapter" +} + +// NewNode returns a new ExecNode using the given config +func (e *ExecAdapter) NewNode(config *NodeConfig) (Node, error) { + if len(config.Services) == 0 { + return nil, errors.New("node must have at least one service") + } + for _, service := range config.Services { + if _, exists := serviceFuncs[service]; !exists { + return nil, fmt.Errorf("unknown node service %q", service) + } + } + + // create the node directory using the first 12 characters of the ID + // as Unix socket paths cannot be longer than 256 characters + dir := filepath.Join(e.BaseDir, config.ID.String()[:12]) + if err := os.Mkdir(dir, 0755); err != nil { + return nil, fmt.Errorf("error creating node directory: %s", err) + } + + // generate the config + conf := &execNodeConfig{ + Stack: node.DefaultConfig, + Node: config, + } + conf.Stack.DataDir = filepath.Join(dir, "data") + conf.Stack.WSHost = "127.0.0.1" + conf.Stack.WSPort = 0 + conf.Stack.WSOrigins = []string{"*"} + conf.Stack.WSExposeAll = true + conf.Stack.P2P.EnableMsgEvents = false + conf.Stack.P2P.NoDiscovery = true + conf.Stack.P2P.NAT = nil + conf.Stack.NoUSB = true + + // listen on a random localhost port (we'll get the actual port after + // starting the node through the RPC admin.nodeInfo method) + conf.Stack.P2P.ListenAddr = "127.0.0.1:0" + + node := &ExecNode{ + ID: config.ID, + Dir: dir, + Config: conf, + adapter: e, + } + node.newCmd = node.execCommand + e.nodes[node.ID] = node + return node, nil +} + +// ExecNode starts a simulation node by exec'ing the current binary and +// running the configured services +type ExecNode struct { + ID discover.NodeID + Dir string + Config *execNodeConfig + Cmd *exec.Cmd + Info *p2p.NodeInfo + + adapter *ExecAdapter + client *rpc.Client + wsAddr string + newCmd func() *exec.Cmd + key *ecdsa.PrivateKey +} + +// Addr returns the node's enode URL +func (n *ExecNode) Addr() []byte { + if n.Info == nil { + return nil + } + return []byte(n.Info.Enode) +} + +// Client returns an rpc.Client which can be used to communicate with the +// underlying services (it is set once the node has started) +func (n *ExecNode) Client() (*rpc.Client, error) { + return n.client, nil +} + +// wsAddrPattern is a regex used to read the WebSocket address from the node's +// log +var wsAddrPattern = regexp.MustCompile(`ws://[\d.:]+`) + +// Start exec's the node passing the ID and service as command line arguments +// and the node config encoded as JSON in the _P2P_NODE_CONFIG environment +// variable +func (n *ExecNode) Start(snapshots map[string][]byte) (err error) { + if n.Cmd != nil { + return errors.New("already started") + } + defer func() { + if err != nil { + log.Error("node failed to start", "err", err) + n.Stop() + } + }() + + // encode a copy of the config containing the snapshot + confCopy := *n.Config + confCopy.Snapshots = snapshots + confCopy.PeerAddrs = make(map[string]string) + for id, node := range n.adapter.nodes { + confCopy.PeerAddrs[id.String()] = node.wsAddr + } + confData, err := json.Marshal(confCopy) + if err != nil { + return fmt.Errorf("error generating node config: %s", err) + } + + // use a pipe for stderr so we can both copy the node's stderr to + // os.Stderr and read the WebSocket address from the logs + stderrR, stderrW := io.Pipe() + stderr := io.MultiWriter(os.Stderr, stderrW) + + // start the node + cmd := n.newCmd() + cmd.Stdout = os.Stdout + cmd.Stderr = stderr + cmd.Env = append(os.Environ(), fmt.Sprintf("_P2P_NODE_CONFIG=%s", confData)) + if err := cmd.Start(); err != nil { + return fmt.Errorf("error starting node: %s", err) + } + n.Cmd = cmd + + // read the WebSocket address from the stderr logs + var wsAddr string + wsAddrC := make(chan string) + go func() { + s := bufio.NewScanner(stderrR) + for s.Scan() { + if strings.Contains(s.Text(), "WebSocket endpoint opened:") { + wsAddrC <- wsAddrPattern.FindString(s.Text()) + } + } + }() + select { + case wsAddr = <-wsAddrC: + if wsAddr == "" { + return errors.New("failed to read WebSocket address from stderr") + } + case <-time.After(10 * time.Second): + return errors.New("timed out waiting for WebSocket address on stderr") + } + + // create the RPC client and load the node info + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + client, err := rpc.DialWebsocket(ctx, wsAddr, "") + if err != nil { + return fmt.Errorf("error dialing rpc websocket: %s", err) + } + var info p2p.NodeInfo + if err := client.CallContext(ctx, &info, "admin_nodeInfo"); err != nil { + return fmt.Errorf("error getting node info: %s", err) + } + n.client = client + n.wsAddr = wsAddr + n.Info = &info + + return nil +} + +// execCommand returns a command which runs the node locally by exec'ing +// the current binary but setting argv[0] to "p2p-node" so that the child +// runs execP2PNode +func (n *ExecNode) execCommand() *exec.Cmd { + return &exec.Cmd{ + Path: reexec.Self(), + Args: []string{"p2p-node", strings.Join(n.Config.Node.Services, ","), n.ID.String()}, + } +} + +// Stop stops the node by first sending SIGTERM and then SIGKILL if the node +// doesn't stop within 5s +func (n *ExecNode) Stop() error { + if n.Cmd == nil { + return nil + } + defer func() { + n.Cmd = nil + }() + + if n.client != nil { + n.client.Close() + n.client = nil + n.wsAddr = "" + n.Info = nil + } + + if err := n.Cmd.Process.Signal(syscall.SIGTERM); err != nil { + return n.Cmd.Process.Kill() + } + waitErr := make(chan error) + go func() { + waitErr <- n.Cmd.Wait() + }() + select { + case err := <-waitErr: + return err + case <-time.After(5 * time.Second): + return n.Cmd.Process.Kill() + } +} + +// NodeInfo returns information about the node +func (n *ExecNode) NodeInfo() *p2p.NodeInfo { + info := &p2p.NodeInfo{ + ID: n.ID.String(), + } + if n.client != nil { + n.client.Call(&info, "admin_nodeInfo") + } + return info +} + +// ServeRPC serves RPC requests over the given connection by dialling the +// node's WebSocket address and joining the two connections +func (n *ExecNode) ServeRPC(clientConn net.Conn) error { + conn, err := websocket.Dial(n.wsAddr, "", "http://localhost") + if err != nil { + return err + } + var wg sync.WaitGroup + wg.Add(2) + join := func(src, dst net.Conn) { + defer wg.Done() + io.Copy(dst, src) + // close the write end of the destination connection + if cw, ok := dst.(interface { + CloseWrite() error + }); ok { + cw.CloseWrite() + } else { + dst.Close() + } + } + go join(conn, clientConn) + go join(clientConn, conn) + wg.Wait() + return nil +} + +// Snapshots creates snapshots of the services by calling the +// simulation_snapshot RPC method +func (n *ExecNode) Snapshots() (map[string][]byte, error) { + if n.client == nil { + return nil, errors.New("RPC not started") + } + var snapshots map[string][]byte + return snapshots, n.client.Call(&snapshots, "simulation_snapshot") +} + +func init() { + // register a reexec function to start a devp2p node when the current + // binary is executed as "p2p-node" + reexec.Register("p2p-node", execP2PNode) +} + +// execNodeConfig is used to serialize the node configuration so it can be +// passed to the child process as a JSON encoded environment variable +type execNodeConfig struct { + Stack node.Config `json:"stack"` + Node *NodeConfig `json:"node"` + Snapshots map[string][]byte `json:"snapshots,omitempty"` + PeerAddrs map[string]string `json:"peer_addrs,omitempty"` +} + +// execP2PNode starts a devp2p node when the current binary is executed with +// argv[0] being "p2p-node", reading the service / ID from argv[1] / argv[2] +// and the node config from the _P2P_NODE_CONFIG environment variable +func execP2PNode() { + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) + glogger.Verbosity(log.LvlInfo) + log.Root().SetHandler(glogger) + + // read the services from argv + serviceNames := strings.Split(os.Args[1], ",") + + // decode the config + confEnv := os.Getenv("_P2P_NODE_CONFIG") + if confEnv == "" { + log.Crit("missing _P2P_NODE_CONFIG") + } + var conf execNodeConfig + if err := json.Unmarshal([]byte(confEnv), &conf); err != nil { + log.Crit("error decoding _P2P_NODE_CONFIG", "err", err) + } + conf.Stack.P2P.PrivateKey = conf.Node.PrivateKey + + // use explicit IP address in ListenAddr so that Enode URL is usable + externalIP := func() string { + addrs, err := net.InterfaceAddrs() + if err != nil { + log.Crit("error getting IP address", "err", err) + } + for _, addr := range addrs { + if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() { + return ip.IP.String() + } + } + log.Crit("unable to determine explicit IP address") + return "" + } + if strings.HasPrefix(conf.Stack.P2P.ListenAddr, ":") { + conf.Stack.P2P.ListenAddr = externalIP() + conf.Stack.P2P.ListenAddr + } + if conf.Stack.WSHost == "0.0.0.0" { + conf.Stack.WSHost = externalIP() + } + + // initialize the devp2p stack + stack, err := node.New(&conf.Stack) + if err != nil { + log.Crit("error creating node stack", "err", err) + } + + // register the services, collecting them into a map so we can wrap + // them in a snapshot service + services := make(map[string]node.Service, len(serviceNames)) + for _, name := range serviceNames { + serviceFunc, exists := serviceFuncs[name] + if !exists { + log.Crit("unknown node service", "name", name) + } + constructor := func(nodeCtx *node.ServiceContext) (node.Service, error) { + ctx := &ServiceContext{ + RPCDialer: &wsRPCDialer{addrs: conf.PeerAddrs}, + NodeContext: nodeCtx, + Config: conf.Node, + } + if conf.Snapshots != nil { + ctx.Snapshot = conf.Snapshots[name] + } + service, err := serviceFunc(ctx) + if err != nil { + return nil, err + } + services[name] = service + return service, nil + } + if err := stack.Register(constructor); err != nil { + log.Crit("error starting service", "name", name, "err", err) + } + } + + // register the snapshot service + if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + return &snapshotService{services}, nil + }); err != nil { + log.Crit("error starting snapshot service", "err", err) + } + + // start the stack + if err := stack.Start(); err != nil { + log.Crit("error stating node stack", "err", err) + } + + // stop the stack if we get a SIGTERM signal + go func() { + sigc := make(chan os.Signal, 1) + signal.Notify(sigc, syscall.SIGTERM) + defer signal.Stop(sigc) + <-sigc + log.Info("Received SIGTERM, shutting down...") + stack.Stop() + }() + + // wait for the stack to exit + stack.Wait() +} + +// snapshotService is a node.Service which wraps a list of services and +// exposes an API to generate a snapshot of those services +type snapshotService struct { + services map[string]node.Service +} + +func (s *snapshotService) APIs() []rpc.API { + return []rpc.API{{ + Namespace: "simulation", + Version: "1.0", + Service: SnapshotAPI{s.services}, + }} +} + +func (s *snapshotService) Protocols() []p2p.Protocol { + return nil +} + +func (s *snapshotService) Start(*p2p.Server) error { + return nil +} + +func (s *snapshotService) Stop() error { + return nil +} + +// SnapshotAPI provides an RPC method to create snapshots of services +type SnapshotAPI struct { + services map[string]node.Service +} + +func (api SnapshotAPI) Snapshot() (map[string][]byte, error) { + snapshots := make(map[string][]byte) + for name, service := range api.services { + if s, ok := service.(interface { + Snapshot() ([]byte, error) + }); ok { + snap, err := s.Snapshot() + if err != nil { + return nil, err + } + snapshots[name] = snap + } + } + return snapshots, nil +} + +type wsRPCDialer struct { + addrs map[string]string +} + +// DialRPC implements the RPCDialer interface by creating a WebSocket RPC +// client of the given node +func (w *wsRPCDialer) DialRPC(id discover.NodeID) (*rpc.Client, error) { + addr, ok := w.addrs[id.String()] + if !ok { + return nil, fmt.Errorf("unknown node: %s", id) + } + return rpc.DialWebsocket(context.Background(), addr, "http://localhost") +} diff --git a/p2p/simulations/adapters/inproc.go b/p2p/simulations/adapters/inproc.go new file mode 100644 index 0000000000..c97188defc --- /dev/null +++ b/p2p/simulations/adapters/inproc.go @@ -0,0 +1,314 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package adapters + +import ( + "errors" + "fmt" + "math" + "net" + "sync" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/rpc" +) + +// SimAdapter is a NodeAdapter which creates in-memory simulation nodes and +// connects them using in-memory net.Pipe connections +type SimAdapter struct { + mtx sync.RWMutex + nodes map[discover.NodeID]*SimNode + services map[string]ServiceFunc +} + +// NewSimAdapter creates a SimAdapter which is capable of running in-memory +// simulation nodes running any of the given services (the services to run on a +// particular node are passed to the NewNode function in the NodeConfig) +func NewSimAdapter(services map[string]ServiceFunc) *SimAdapter { + return &SimAdapter{ + nodes: make(map[discover.NodeID]*SimNode), + services: services, + } +} + +// Name returns the name of the adapter for logging purposes +func (s *SimAdapter) Name() string { + return "sim-adapter" +} + +// NewNode returns a new SimNode using the given config +func (s *SimAdapter) NewNode(config *NodeConfig) (Node, error) { + s.mtx.Lock() + defer s.mtx.Unlock() + + // check a node with the ID doesn't already exist + id := config.ID + if _, exists := s.nodes[id]; exists { + return nil, fmt.Errorf("node already exists: %s", id) + } + + // check the services are valid + if len(config.Services) == 0 { + return nil, errors.New("node must have at least one service") + } + for _, service := range config.Services { + if _, exists := s.services[service]; !exists { + return nil, fmt.Errorf("unknown node service %q", service) + } + } + + n, err := node.New(&node.Config{ + P2P: p2p.Config{ + PrivateKey: config.PrivateKey, + MaxPeers: math.MaxInt32, + NoDiscovery: true, + Dialer: s, + EnableMsgEvents: true, + }, + NoUSB: true, + }) + if err != nil { + return nil, err + } + + simNode := &SimNode{ + ID: id, + config: config, + node: n, + adapter: s, + running: make(map[string]node.Service), + } + s.nodes[id] = simNode + return simNode, nil +} + +// Dial implements the p2p.NodeDialer interface by connecting to the node using +// an in-memory net.Pipe connection +func (s *SimAdapter) Dial(dest *discover.Node) (conn net.Conn, err error) { + node, ok := s.GetNode(dest.ID) + if !ok { + return nil, fmt.Errorf("unknown node: %s", dest.ID) + } + srv := node.Server() + if srv == nil { + return nil, fmt.Errorf("node not running: %s", dest.ID) + } + pipe1, pipe2 := net.Pipe() + go srv.SetupConn(pipe1, 0, nil) + return pipe2, nil +} + +// DialRPC implements the RPCDialer interface by creating an in-memory RPC +// client of the given node +func (s *SimAdapter) DialRPC(id discover.NodeID) (*rpc.Client, error) { + node, ok := s.GetNode(id) + if !ok { + return nil, fmt.Errorf("unknown node: %s", id) + } + handler, err := node.node.RPCHandler() + if err != nil { + return nil, err + } + return rpc.DialInProc(handler), nil +} + +// GetNode returns the node with the given ID if it exists +func (s *SimAdapter) GetNode(id discover.NodeID) (*SimNode, bool) { + s.mtx.RLock() + defer s.mtx.RUnlock() + node, ok := s.nodes[id] + return node, ok +} + +// SimNode is an in-memory simulation node which connects to other nodes using +// an in-memory net.Pipe connection (see SimAdapter.Dial), running devp2p +// protocols directly over that pipe +type SimNode struct { + lock sync.RWMutex + ID discover.NodeID + config *NodeConfig + adapter *SimAdapter + node *node.Node + running map[string]node.Service + client *rpc.Client + registerOnce sync.Once +} + +// Addr returns the node's discovery address +func (self *SimNode) Addr() []byte { + return []byte(self.Node().String()) +} + +// Node returns a discover.Node representing the SimNode +func (self *SimNode) Node() *discover.Node { + return discover.NewNode(self.ID, net.IP{127, 0, 0, 1}, 30303, 30303) +} + +// Client returns an rpc.Client which can be used to communicate with the +// underlying services (it is set once the node has started) +func (self *SimNode) Client() (*rpc.Client, error) { + self.lock.RLock() + defer self.lock.RUnlock() + if self.client == nil { + return nil, errors.New("node not started") + } + return self.client, nil +} + +// ServeRPC serves RPC requests over the given connection by creating an +// in-memory client to the node's RPC server +func (self *SimNode) ServeRPC(conn net.Conn) error { + handler, err := self.node.RPCHandler() + if err != nil { + return err + } + handler.ServeCodec(rpc.NewJSONCodec(conn), rpc.OptionMethodInvocation|rpc.OptionSubscriptions) + return nil +} + +// Snapshots creates snapshots of the services by calling the +// simulation_snapshot RPC method +func (self *SimNode) Snapshots() (map[string][]byte, error) { + self.lock.RLock() + services := make(map[string]node.Service, len(self.running)) + for name, service := range self.running { + services[name] = service + } + self.lock.RUnlock() + if len(services) == 0 { + return nil, errors.New("no running services") + } + snapshots := make(map[string][]byte) + for name, service := range services { + if s, ok := service.(interface { + Snapshot() ([]byte, error) + }); ok { + snap, err := s.Snapshot() + if err != nil { + return nil, err + } + snapshots[name] = snap + } + } + return snapshots, nil +} + +// Start registers the services and starts the underlying devp2p node +func (self *SimNode) Start(snapshots map[string][]byte) error { + newService := func(name string) func(ctx *node.ServiceContext) (node.Service, error) { + return func(nodeCtx *node.ServiceContext) (node.Service, error) { + ctx := &ServiceContext{ + RPCDialer: self.adapter, + NodeContext: nodeCtx, + Config: self.config, + } + if snapshots != nil { + ctx.Snapshot = snapshots[name] + } + serviceFunc := self.adapter.services[name] + service, err := serviceFunc(ctx) + if err != nil { + return nil, err + } + self.running[name] = service + return service, nil + } + } + + // ensure we only register the services once in the case of the node + // being stopped and then started again + var regErr error + self.registerOnce.Do(func() { + for _, name := range self.config.Services { + if err := self.node.Register(newService(name)); err != nil { + regErr = err + return + } + } + }) + if regErr != nil { + return regErr + } + + if err := self.node.Start(); err != nil { + return err + } + + // create an in-process RPC client + handler, err := self.node.RPCHandler() + if err != nil { + return err + } + + self.lock.Lock() + self.client = rpc.DialInProc(handler) + self.lock.Unlock() + + return nil +} + +// Stop closes the RPC client and stops the underlying devp2p node +func (self *SimNode) Stop() error { + self.lock.Lock() + if self.client != nil { + self.client.Close() + self.client = nil + } + self.lock.Unlock() + return self.node.Stop() +} + +// Services returns a copy of the underlying services +func (self *SimNode) Services() []node.Service { + self.lock.RLock() + defer self.lock.RUnlock() + services := make([]node.Service, 0, len(self.running)) + for _, service := range self.running { + services = append(services, service) + } + return services +} + +// Server returns the underlying p2p.Server +func (self *SimNode) Server() *p2p.Server { + return self.node.Server() +} + +// SubscribeEvents subscribes the given channel to peer events from the +// underlying p2p.Server +func (self *SimNode) SubscribeEvents(ch chan *p2p.PeerEvent) event.Subscription { + srv := self.Server() + if srv == nil { + panic("node not running") + } + return srv.SubscribeEvents(ch) +} + +// NodeInfo returns information about the node +func (self *SimNode) NodeInfo() *p2p.NodeInfo { + server := self.Server() + if server == nil { + return &p2p.NodeInfo{ + ID: self.ID.String(), + Enode: self.Node().String(), + } + } + return server.NodeInfo() +} diff --git a/p2p/simulations/adapters/types.go b/p2p/simulations/adapters/types.go new file mode 100644 index 0000000000..ed6cfc5046 --- /dev/null +++ b/p2p/simulations/adapters/types.go @@ -0,0 +1,215 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package adapters + +import ( + "crypto/ecdsa" + "encoding/hex" + "encoding/json" + "fmt" + "net" + "os" + + "github.com/docker/docker/pkg/reexec" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/rpc" +) + +// Node represents a node in a simulation network which is created by a +// NodeAdapter, for example: +// +// * SimNode - An in-memory node +// * ExecNode - A child process node +// * DockerNode - A Docker container node +// +type Node interface { + // Addr returns the node's address (e.g. an Enode URL) + Addr() []byte + + // Client returns the RPC client which is created once the node is + // up and running + Client() (*rpc.Client, error) + + // ServeRPC serves RPC requests over the given connection + ServeRPC(net.Conn) error + + // Start starts the node with the given snapshots + Start(snapshots map[string][]byte) error + + // Stop stops the node + Stop() error + + // NodeInfo returns information about the node + NodeInfo() *p2p.NodeInfo + + // Snapshots creates snapshots of the running services + Snapshots() (map[string][]byte, error) +} + +// NodeAdapter is used to create Nodes in a simulation network +type NodeAdapter interface { + // Name returns the name of the adapter for logging purposes + Name() string + + // NewNode creates a new node with the given configuration + NewNode(config *NodeConfig) (Node, error) +} + +// NodeConfig is the configuration used to start a node in a simulation +// network +type NodeConfig struct { + // ID is the node's ID which is used to identify the node in the + // simulation network + ID discover.NodeID + + // PrivateKey is the node's private key which is used by the devp2p + // stack to encrypt communications + PrivateKey *ecdsa.PrivateKey + + // Name is a human friendly name for the node like "node01" + Name string + + // Services are the names of the services which should be run when + // starting the node (for SimNodes it should be the names of services + // contained in SimAdapter.services, for other nodes it should be + // services registered by calling the RegisterService function) + Services []string +} + +// nodeConfigJSON is used to encode and decode NodeConfig as JSON by encoding +// all fields as strings +type nodeConfigJSON struct { + ID string `json:"id"` + PrivateKey string `json:"private_key"` + Name string `json:"name"` + Services []string `json:"services"` +} + +// MarshalJSON implements the json.Marshaler interface by encoding the config +// fields as strings +func (n *NodeConfig) MarshalJSON() ([]byte, error) { + confJSON := nodeConfigJSON{ + ID: n.ID.String(), + Name: n.Name, + Services: n.Services, + } + if n.PrivateKey != nil { + confJSON.PrivateKey = hex.EncodeToString(crypto.FromECDSA(n.PrivateKey)) + } + return json.Marshal(confJSON) +} + +// UnmarshalJSON implements the json.Unmarshaler interface by decoding the json +// string values into the config fields +func (n *NodeConfig) UnmarshalJSON(data []byte) error { + var confJSON nodeConfigJSON + if err := json.Unmarshal(data, &confJSON); err != nil { + return err + } + + if confJSON.ID != "" { + nodeID, err := discover.HexID(confJSON.ID) + if err != nil { + return err + } + n.ID = nodeID + } + + if confJSON.PrivateKey != "" { + key, err := hex.DecodeString(confJSON.PrivateKey) + if err != nil { + return err + } + privKey, err := crypto.ToECDSA(key) + if err != nil { + return err + } + n.PrivateKey = privKey + } + + n.Name = confJSON.Name + n.Services = confJSON.Services + + return nil +} + +// RandomNodeConfig returns node configuration with a randomly generated ID and +// PrivateKey +func RandomNodeConfig() *NodeConfig { + key, err := crypto.GenerateKey() + if err != nil { + panic("unable to generate key") + } + var id discover.NodeID + pubkey := crypto.FromECDSAPub(&key.PublicKey) + copy(id[:], pubkey[1:]) + return &NodeConfig{ + ID: id, + PrivateKey: key, + } +} + +// ServiceContext is a collection of options and methods which can be utilised +// when starting services +type ServiceContext struct { + RPCDialer + + NodeContext *node.ServiceContext + Config *NodeConfig + Snapshot []byte +} + +// RPCDialer is used when initialising services which need to connect to +// other nodes in the network (for example a simulated Swarm node which needs +// to connect to a Geth node to resolve ENS names) +type RPCDialer interface { + DialRPC(id discover.NodeID) (*rpc.Client, error) +} + +// Services is a collection of services which can be run in a simulation +type Services map[string]ServiceFunc + +// ServiceFunc returns a node.Service which can be used to boot a devp2p node +type ServiceFunc func(ctx *ServiceContext) (node.Service, error) + +// serviceFuncs is a map of registered services which are used to boot devp2p +// nodes +var serviceFuncs = make(Services) + +// RegisterServices registers the given Services which can then be used to +// start devp2p nodes using either the Exec or Docker adapters. +// +// It should be called in an init function so that it has the opportunity to +// execute the services before main() is called. +func RegisterServices(services Services) { + for name, f := range services { + if _, exists := serviceFuncs[name]; exists { + panic(fmt.Sprintf("node service already exists: %q", name)) + } + serviceFuncs[name] = f + } + + // now we have registered the services, run reexec.Init() which will + // potentially start one of the services if the current binary has + // been exec'd with argv[0] set to "p2p-node" + if reexec.Init() { + os.Exit(0) + } +} diff --git a/p2p/simulations/events.go b/p2p/simulations/events.go new file mode 100644 index 0000000000..f17958c689 --- /dev/null +++ b/p2p/simulations/events.go @@ -0,0 +1,108 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "fmt" + "time" +) + +// EventType is the type of event emitted by a simulation network +type EventType string + +const ( + // EventTypeNode is the type of event emitted when a node is either + // created, started or stopped + EventTypeNode EventType = "node" + + // EventTypeConn is the type of event emitted when a connection is + // is either established or dropped between two nodes + EventTypeConn EventType = "conn" + + // EventTypeMsg is the type of event emitted when a p2p message it + // sent between two nodes + EventTypeMsg EventType = "msg" +) + +// Event is an event emitted by a simulation network +type Event struct { + // Type is the type of the event + Type EventType `json:"type"` + + // Time is the time the event happened + Time time.Time `json:"time"` + + // Control indicates whether the event is the result of a controlled + // action in the network + Control bool `json:"control"` + + // Node is set if the type is EventTypeNode + Node *Node `json:"node,omitempty"` + + // Conn is set if the type is EventTypeConn + Conn *Conn `json:"conn,omitempty"` + + // Msg is set if the type is EventTypeMsg + Msg *Msg `json:"msg,omitempty"` +} + +// NewEvent creates a new event for the given object which should be either a +// Node, Conn or Msg. +// +// The object is copied so that the event represents the state of the object +// when NewEvent is called. +func NewEvent(v interface{}) *Event { + event := &Event{Time: time.Now()} + switch v := v.(type) { + case *Node: + event.Type = EventTypeNode + node := *v + event.Node = &node + case *Conn: + event.Type = EventTypeConn + conn := *v + event.Conn = &conn + case *Msg: + event.Type = EventTypeMsg + msg := *v + event.Msg = &msg + default: + panic(fmt.Sprintf("invalid event type: %T", v)) + } + return event +} + +// ControlEvent creates a new control event +func ControlEvent(v interface{}) *Event { + event := NewEvent(v) + event.Control = true + return event +} + +// String returns the string representation of the event +func (e *Event) String() string { + switch e.Type { + case EventTypeNode: + return fmt.Sprintf(" id: %s up: %t", e.Node.ID().TerminalString(), e.Node.Up) + case EventTypeConn: + return fmt.Sprintf(" nodes: %s->%s up: %t", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up) + case EventTypeMsg: + return fmt.Sprintf(" nodes: %s->%s proto: %s, code: %d, received: %t", e.Msg.One.TerminalString(), e.Msg.Other.TerminalString(), e.Msg.Protocol, e.Msg.Code, e.Msg.Received) + default: + return "" + } +} diff --git a/p2p/simulations/examples/README.md b/p2p/simulations/examples/README.md new file mode 100644 index 0000000000..822a48dcb6 --- /dev/null +++ b/p2p/simulations/examples/README.md @@ -0,0 +1,39 @@ +# devp2p simulation examples + +## ping-pong + +`ping-pong.go` implements a simulation network which contains nodes running a +simple "ping-pong" protocol where nodes send a ping message to all their +connected peers every 10s and receive pong messages in return. + +To run the simulation, run `go run ping-pong.go` in one terminal to start the +simulation API and `./ping-pong.sh` in another to start and connect the nodes: + +``` +$ go run ping-pong.go +INFO [08-15|13:53:49] using sim adapter +INFO [08-15|13:53:49] starting simulation server on 0.0.0.0:8888... +``` + +``` +$ ./ping-pong.sh +---> 13:58:12 creating 10 nodes +Created node01 +Started node01 +... +Created node10 +Started node10 +---> 13:58:13 connecting node01 to all other nodes +Connected node01 to node02 +... +Connected node01 to node10 +---> 13:58:14 done +``` + +Use the `--adapter` flag to choose the adapter type: + +``` +$ go run ping-pong.go --adapter exec +INFO [08-15|14:01:14] using exec adapter tmpdir=/var/folders/k6/wpsgfg4n23ddbc6f5cnw5qg00000gn/T/p2p-example992833779 +INFO [08-15|14:01:14] starting simulation server on 0.0.0.0:8888... +``` diff --git a/p2p/simulations/examples/ping-pong.go b/p2p/simulations/examples/ping-pong.go new file mode 100644 index 0000000000..6a0ead53a5 --- /dev/null +++ b/p2p/simulations/examples/ping-pong.go @@ -0,0 +1,184 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "net/http" + "os" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" +) + +var adapterType = flag.String("adapter", "sim", `node adapter to use (one of "sim", "exec" or "docker")`) + +// main() starts a simulation network which contains nodes running a simple +// ping-pong protocol +func main() { + flag.Parse() + + // set the log level to Trace + log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(false)))) + + // register a single ping-pong service + services := map[string]adapters.ServiceFunc{ + "ping-pong": func(ctx *adapters.ServiceContext) (node.Service, error) { + return newPingPongService(ctx.Config.ID), nil + }, + } + adapters.RegisterServices(services) + + // create the NodeAdapter + var adapter adapters.NodeAdapter + + switch *adapterType { + + case "sim": + log.Info("using sim adapter") + adapter = adapters.NewSimAdapter(services) + + case "exec": + tmpdir, err := ioutil.TempDir("", "p2p-example") + if err != nil { + log.Crit("error creating temp dir", "err", err) + } + defer os.RemoveAll(tmpdir) + log.Info("using exec adapter", "tmpdir", tmpdir) + adapter = adapters.NewExecAdapter(tmpdir) + + case "docker": + log.Info("using docker adapter") + var err error + adapter, err = adapters.NewDockerAdapter() + if err != nil { + log.Crit("error creating docker adapter", "err", err) + } + + default: + log.Crit(fmt.Sprintf("unknown node adapter %q", *adapterType)) + } + + // start the HTTP API + log.Info("starting simulation server on 0.0.0.0:8888...") + network := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ + DefaultService: "ping-pong", + }) + if err := http.ListenAndServe(":8888", simulations.NewServer(network)); err != nil { + log.Crit("error starting simulation server", "err", err) + } +} + +// pingPongService runs a ping-pong protocol between nodes where each node +// sends a ping to all its connected peers every 10s and receives a pong in +// return +type pingPongService struct { + id discover.NodeID + log log.Logger + received int64 +} + +func newPingPongService(id discover.NodeID) *pingPongService { + return &pingPongService{ + id: id, + log: log.New("node.id", id), + } +} + +func (p *pingPongService) Protocols() []p2p.Protocol { + return []p2p.Protocol{{ + Name: "ping-pong", + Version: 1, + Length: 2, + Run: p.Run, + NodeInfo: p.Info, + }} +} + +func (p *pingPongService) APIs() []rpc.API { + return nil +} + +func (p *pingPongService) Start(server *p2p.Server) error { + p.log.Info("ping-pong service starting") + return nil +} + +func (p *pingPongService) Stop() error { + p.log.Info("ping-pong service stopping") + return nil +} + +func (p *pingPongService) Info() interface{} { + return struct { + Received int64 `json:"received"` + }{ + atomic.LoadInt64(&p.received), + } +} + +const ( + pingMsgCode = iota + pongMsgCode +) + +// Run implements the ping-pong protocol which sends ping messages to the peer +// at 10s intervals, and responds to pings with pong messages. +func (p *pingPongService) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error { + log := p.log.New("peer.id", peer.ID()) + + errC := make(chan error) + go func() { + for range time.Tick(10 * time.Second) { + log.Info("sending ping") + if err := p2p.Send(rw, pingMsgCode, "PING"); err != nil { + errC <- err + return + } + } + }() + go func() { + for { + msg, err := rw.ReadMsg() + if err != nil { + errC <- err + return + } + payload, err := ioutil.ReadAll(msg.Payload) + if err != nil { + errC <- err + return + } + log.Info("received message", "msg.code", msg.Code, "msg.payload", string(payload)) + atomic.AddInt64(&p.received, 1) + if msg.Code == pingMsgCode { + log.Info("sending pong") + go p2p.Send(rw, pongMsgCode, "PONG") + } + } + }() + return <-errC +} diff --git a/p2p/simulations/examples/ping-pong.sh b/p2p/simulations/examples/ping-pong.sh new file mode 100755 index 0000000000..47936bd9a0 --- /dev/null +++ b/p2p/simulations/examples/ping-pong.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# Boot a ping-pong network simulation using the HTTP API started by ping-pong.go + +set -e + +main() { + if ! which p2psim &>/dev/null; then + fail "missing p2psim binary (you need to build cmd/p2psim and put it in \$PATH)" + fi + + info "creating 10 nodes" + for i in $(seq 1 10); do + p2psim node create --name "$(node_name $i)" + p2psim node start "$(node_name $i)" + done + + info "connecting node01 to all other nodes" + for i in $(seq 2 10); do + p2psim node connect "node01" "$(node_name $i)" + done + + info "done" +} + +node_name() { + local num=$1 + echo "node$(printf '%02d' $num)" +} + +info() { + echo -e "\033[1;32m---> $(date +%H:%M:%S) ${@}\033[0m" +} + +fail() { + echo -e "\033[1;31mERROR: ${@}\033[0m" >&2 + exit 1 +} + +main "$@" diff --git a/p2p/simulations/http.go b/p2p/simulations/http.go new file mode 100644 index 0000000000..3fa8b92925 --- /dev/null +++ b/p2p/simulations/http.go @@ -0,0 +1,680 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" + "github.com/julienschmidt/httprouter" + "golang.org/x/net/websocket" +) + +// DefaultClient is the default simulation API client which expects the API +// to be running at http://localhost:8888 +var DefaultClient = NewClient("http://localhost:8888") + +// Client is a client for the simulation HTTP API which supports creating +// and managing simulation networks +type Client struct { + URL string + + client *http.Client +} + +// NewClient returns a new simulation API client +func NewClient(url string) *Client { + return &Client{ + URL: url, + client: http.DefaultClient, + } +} + +// GetNetwork returns details of the network +func (c *Client) GetNetwork() (*Network, error) { + network := &Network{} + return network, c.Get("/", network) +} + +// StartNetwork starts all existing nodes in the simulation network +func (c *Client) StartNetwork() error { + return c.Post("/start", nil, nil) +} + +// StopNetwork stops all existing nodes in a simulation network +func (c *Client) StopNetwork() error { + return c.Post("/stop", nil, nil) +} + +// CreateSnapshot creates a network snapshot +func (c *Client) CreateSnapshot() (*Snapshot, error) { + snap := &Snapshot{} + return snap, c.Get("/snapshot", snap) +} + +// LoadSnapshot loads a snapshot into the network +func (c *Client) LoadSnapshot(snap *Snapshot) error { + return c.Post("/snapshot", snap, nil) +} + +// SubscribeOpts is a collection of options to use when subscribing to network +// events +type SubscribeOpts struct { + // Current instructs the server to send events for existing nodes and + // connections first + Current bool + + // Filter instructs the server to only send a subset of message events + Filter string +} + +// SubscribeNetwork subscribes to network events which are sent from the server +// as a server-sent-events stream, optionally receiving events for existing +// nodes and connections and filtering message events +func (c *Client) SubscribeNetwork(events chan *Event, opts SubscribeOpts) (event.Subscription, error) { + url := fmt.Sprintf("%s/events?current=%t&filter=%s", c.URL, opts.Current, opts.Filter) + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + req.Header.Set("Accept", "text/event-stream") + res, err := c.client.Do(req) + if err != nil { + return nil, err + } + if res.StatusCode != http.StatusOK { + response, _ := ioutil.ReadAll(res.Body) + res.Body.Close() + return nil, fmt.Errorf("unexpected HTTP status: %s: %s", res.Status, response) + } + + // define a producer function to pass to event.Subscription + // which reads server-sent events from res.Body and sends + // them to the events channel + producer := func(stop <-chan struct{}) error { + defer res.Body.Close() + + // read lines from res.Body in a goroutine so that we are + // always reading from the stop channel + lines := make(chan string) + errC := make(chan error, 1) + go func() { + s := bufio.NewScanner(res.Body) + for s.Scan() { + select { + case lines <- s.Text(): + case <-stop: + return + } + } + errC <- s.Err() + }() + + // detect any lines which start with "data:", decode the data + // into an event and send it to the events channel + for { + select { + case line := <-lines: + if !strings.HasPrefix(line, "data:") { + continue + } + data := strings.TrimSpace(strings.TrimPrefix(line, "data:")) + event := &Event{} + if err := json.Unmarshal([]byte(data), event); err != nil { + return fmt.Errorf("error decoding SSE event: %s", err) + } + select { + case events <- event: + case <-stop: + return nil + } + case err := <-errC: + return err + case <-stop: + return nil + } + } + } + + return event.NewSubscription(producer), nil +} + +// GetNodes returns all nodes which exist in the network +func (c *Client) GetNodes() ([]*p2p.NodeInfo, error) { + var nodes []*p2p.NodeInfo + return nodes, c.Get("/nodes", &nodes) +} + +// CreateNode creates a node in the network using the given configuration +func (c *Client) CreateNode(config *adapters.NodeConfig) (*p2p.NodeInfo, error) { + node := &p2p.NodeInfo{} + return node, c.Post("/nodes", config, node) +} + +// GetNode returns details of a node +func (c *Client) GetNode(nodeID string) (*p2p.NodeInfo, error) { + node := &p2p.NodeInfo{} + return node, c.Get(fmt.Sprintf("/nodes/%s", nodeID), node) +} + +// StartNode starts a node +func (c *Client) StartNode(nodeID string) error { + return c.Post(fmt.Sprintf("/nodes/%s/start", nodeID), nil, nil) +} + +// StopNode stops a node +func (c *Client) StopNode(nodeID string) error { + return c.Post(fmt.Sprintf("/nodes/%s/stop", nodeID), nil, nil) +} + +// ConnectNode connects a node to a peer node +func (c *Client) ConnectNode(nodeID, peerID string) error { + return c.Post(fmt.Sprintf("/nodes/%s/conn/%s", nodeID, peerID), nil, nil) +} + +// DisconnectNode disconnects a node from a peer node +func (c *Client) DisconnectNode(nodeID, peerID string) error { + return c.Delete(fmt.Sprintf("/nodes/%s/conn/%s", nodeID, peerID)) +} + +// RPCClient returns an RPC client connected to a node +func (c *Client) RPCClient(ctx context.Context, nodeID string) (*rpc.Client, error) { + baseURL := strings.Replace(c.URL, "http", "ws", 1) + return rpc.DialWebsocket(ctx, fmt.Sprintf("%s/nodes/%s/rpc", baseURL, nodeID), "") +} + +// Get performs a HTTP GET request decoding the resulting JSON response +// into "out" +func (c *Client) Get(path string, out interface{}) error { + return c.Send("GET", path, nil, out) +} + +// Post performs a HTTP POST request sending "in" as the JSON body and +// decoding the resulting JSON response into "out" +func (c *Client) Post(path string, in, out interface{}) error { + return c.Send("POST", path, in, out) +} + +// Delete performs a HTTP DELETE request +func (c *Client) Delete(path string) error { + return c.Send("DELETE", path, nil, nil) +} + +// Send performs a HTTP request, sending "in" as the JSON request body and +// decoding the JSON response into "out" +func (c *Client) Send(method, path string, in, out interface{}) error { + var body []byte + if in != nil { + var err error + body, err = json.Marshal(in) + if err != nil { + return err + } + } + req, err := http.NewRequest(method, c.URL+path, bytes.NewReader(body)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + res, err := c.client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { + response, _ := ioutil.ReadAll(res.Body) + return fmt.Errorf("unexpected HTTP status: %s: %s", res.Status, response) + } + if out != nil { + if err := json.NewDecoder(res.Body).Decode(out); err != nil { + return err + } + } + return nil +} + +// Server is an HTTP server providing an API to manage a simulation network +type Server struct { + router *httprouter.Router + network *Network +} + +// NewServer returns a new simulation API server +func NewServer(network *Network) *Server { + s := &Server{ + router: httprouter.New(), + network: network, + } + + s.OPTIONS("/", s.Options) + s.GET("/", s.GetNetwork) + s.POST("/start", s.StartNetwork) + s.POST("/stop", s.StopNetwork) + s.GET("/events", s.StreamNetworkEvents) + s.GET("/snapshot", s.CreateSnapshot) + s.POST("/snapshot", s.LoadSnapshot) + s.POST("/nodes", s.CreateNode) + s.GET("/nodes", s.GetNodes) + s.GET("/nodes/:nodeid", s.GetNode) + s.POST("/nodes/:nodeid/start", s.StartNode) + s.POST("/nodes/:nodeid/stop", s.StopNode) + s.POST("/nodes/:nodeid/conn/:peerid", s.ConnectNode) + s.DELETE("/nodes/:nodeid/conn/:peerid", s.DisconnectNode) + s.GET("/nodes/:nodeid/rpc", s.NodeRPC) + + return s +} + +// GetNetwork returns details of the network +func (s *Server) GetNetwork(w http.ResponseWriter, req *http.Request) { + s.JSON(w, http.StatusOK, s.network) +} + +// StartNetwork starts all nodes in the network +func (s *Server) StartNetwork(w http.ResponseWriter, req *http.Request) { + if err := s.network.StartAll(); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) +} + +// StopNetwork stops all nodes in the network +func (s *Server) StopNetwork(w http.ResponseWriter, req *http.Request) { + if err := s.network.StopAll(); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) +} + +// StreamNetworkEvents streams network events as a server-sent-events stream +func (s *Server) StreamNetworkEvents(w http.ResponseWriter, req *http.Request) { + events := make(chan *Event) + sub := s.network.events.Subscribe(events) + defer sub.Unsubscribe() + + // stop the stream if the client goes away + var clientGone <-chan bool + if cn, ok := w.(http.CloseNotifier); ok { + clientGone = cn.CloseNotify() + } + + // write writes the given event and data to the stream like: + // + // event: + // data: + // + write := func(event, data string) { + fmt.Fprintf(w, "event: %s\n", event) + fmt.Fprintf(w, "data: %s\n\n", data) + if fw, ok := w.(http.Flusher); ok { + fw.Flush() + } + } + writeEvent := func(event *Event) error { + data, err := json.Marshal(event) + if err != nil { + return err + } + write("network", string(data)) + return nil + } + writeErr := func(err error) { + write("error", err.Error()) + } + + // check if filtering has been requested + var filters MsgFilters + if filterParam := req.URL.Query().Get("filter"); filterParam != "" { + var err error + filters, err = NewMsgFilters(filterParam) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + } + + w.Header().Set("Content-Type", "text/event-stream; charset=utf-8") + w.WriteHeader(http.StatusOK) + fmt.Fprintf(w, "\n\n") + if fw, ok := w.(http.Flusher); ok { + fw.Flush() + } + + // optionally send the existing nodes and connections + if req.URL.Query().Get("current") == "true" { + snap, err := s.network.Snapshot() + if err != nil { + writeErr(err) + return + } + for _, node := range snap.Nodes { + event := NewEvent(&node.Node) + if err := writeEvent(event); err != nil { + writeErr(err) + return + } + } + for _, conn := range snap.Conns { + event := NewEvent(&conn) + if err := writeEvent(event); err != nil { + writeErr(err) + return + } + } + } + + for { + select { + case event := <-events: + // only send message events which match the filters + if event.Msg != nil && !filters.Match(event.Msg) { + continue + } + if err := writeEvent(event); err != nil { + writeErr(err) + return + } + case <-clientGone: + return + } + } +} + +// NewMsgFilters constructs a collection of message filters from a URL query +// parameter. +// +// The parameter is expected to be a dash-separated list of individual filters, +// each having the format ':', where is the name of a +// protocol and is a comma-separated list of message codes. +// +// A message code of '*' or '-1' is considered a wildcard and matches any code. +func NewMsgFilters(filterParam string) (MsgFilters, error) { + filters := make(MsgFilters) + for _, filter := range strings.Split(filterParam, "-") { + protoCodes := strings.SplitN(filter, ":", 2) + if len(protoCodes) != 2 || protoCodes[0] == "" || protoCodes[1] == "" { + return nil, fmt.Errorf("invalid message filter: %s", filter) + } + proto := protoCodes[0] + for _, code := range strings.Split(protoCodes[1], ",") { + if code == "*" || code == "-1" { + filters[MsgFilter{Proto: proto, Code: -1}] = struct{}{} + continue + } + n, err := strconv.ParseUint(code, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid message code: %s", code) + } + filters[MsgFilter{Proto: proto, Code: int64(n)}] = struct{}{} + } + } + return filters, nil +} + +// MsgFilters is a collection of filters which are used to filter message +// events +type MsgFilters map[MsgFilter]struct{} + +// Match checks if the given message matches any of the filters +func (m MsgFilters) Match(msg *Msg) bool { + // check if there is a wildcard filter for the message's protocol + if _, ok := m[MsgFilter{Proto: msg.Protocol, Code: -1}]; ok { + return true + } + + // check if there is a filter for the message's protocol and code + if _, ok := m[MsgFilter{Proto: msg.Protocol, Code: int64(msg.Code)}]; ok { + return true + } + + return false +} + +// MsgFilter is used to filter message events based on protocol and message +// code +type MsgFilter struct { + // Proto is matched against a message's protocol + Proto string + + // Code is matched against a message's code, with -1 matching all codes + Code int64 +} + +// CreateSnapshot creates a network snapshot +func (s *Server) CreateSnapshot(w http.ResponseWriter, req *http.Request) { + snap, err := s.network.Snapshot() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusOK, snap) +} + +// LoadSnapshot loads a snapshot into the network +func (s *Server) LoadSnapshot(w http.ResponseWriter, req *http.Request) { + snap := &Snapshot{} + if err := json.NewDecoder(req.Body).Decode(snap); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + if err := s.network.Load(snap); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusOK, s.network) +} + +// CreateNode creates a node in the network using the given configuration +func (s *Server) CreateNode(w http.ResponseWriter, req *http.Request) { + config := adapters.RandomNodeConfig() + err := json.NewDecoder(req.Body).Decode(config) + if err != nil && err != io.EOF { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + node, err := s.network.NewNodeWithConfig(config) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusCreated, node.NodeInfo()) +} + +// GetNodes returns all nodes which exist in the network +func (s *Server) GetNodes(w http.ResponseWriter, req *http.Request) { + nodes := s.network.GetNodes() + + infos := make([]*p2p.NodeInfo, len(nodes)) + for i, node := range nodes { + infos[i] = node.NodeInfo() + } + + s.JSON(w, http.StatusOK, infos) +} + +// GetNode returns details of a node +func (s *Server) GetNode(w http.ResponseWriter, req *http.Request) { + node := req.Context().Value("node").(*Node) + + s.JSON(w, http.StatusOK, node.NodeInfo()) +} + +// StartNode starts a node +func (s *Server) StartNode(w http.ResponseWriter, req *http.Request) { + node := req.Context().Value("node").(*Node) + + if err := s.network.Start(node.ID()); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusOK, node.NodeInfo()) +} + +// StopNode stops a node +func (s *Server) StopNode(w http.ResponseWriter, req *http.Request) { + node := req.Context().Value("node").(*Node) + + if err := s.network.Stop(node.ID()); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusOK, node.NodeInfo()) +} + +// ConnectNode connects a node to a peer node +func (s *Server) ConnectNode(w http.ResponseWriter, req *http.Request) { + node := req.Context().Value("node").(*Node) + peer := req.Context().Value("peer").(*Node) + + if err := s.network.Connect(node.ID(), peer.ID()); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusOK, node.NodeInfo()) +} + +// DisconnectNode disconnects a node from a peer node +func (s *Server) DisconnectNode(w http.ResponseWriter, req *http.Request) { + node := req.Context().Value("node").(*Node) + peer := req.Context().Value("peer").(*Node) + + if err := s.network.Disconnect(node.ID(), peer.ID()); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + s.JSON(w, http.StatusOK, node.NodeInfo()) +} + +// Options responds to the OPTIONS HTTP method by returning a 200 OK response +// with the "Access-Control-Allow-Headers" header set to "Content-Type" +func (s *Server) Options(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + w.WriteHeader(http.StatusOK) +} + +// NodeRPC forwards RPC requests to a node in the network via a WebSocket +// connection +func (s *Server) NodeRPC(w http.ResponseWriter, req *http.Request) { + node := req.Context().Value("node").(*Node) + + handler := func(conn *websocket.Conn) { + node.ServeRPC(conn) + } + + websocket.Server{Handler: handler}.ServeHTTP(w, req) +} + +// ServeHTTP implements the http.Handler interface by delegating to the +// underlying httprouter.Router +func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s.router.ServeHTTP(w, req) +} + +// GET registers a handler for GET requests to a particular path +func (s *Server) GET(path string, handle http.HandlerFunc) { + s.router.GET(path, s.wrapHandler(handle)) +} + +// POST registers a handler for POST requests to a particular path +func (s *Server) POST(path string, handle http.HandlerFunc) { + s.router.POST(path, s.wrapHandler(handle)) +} + +// DELETE registers a handler for DELETE requests to a particular path +func (s *Server) DELETE(path string, handle http.HandlerFunc) { + s.router.DELETE(path, s.wrapHandler(handle)) +} + +// OPTIONS registers a handler for OPTIONS requests to a particular path +func (s *Server) OPTIONS(path string, handle http.HandlerFunc) { + s.router.OPTIONS("/*path", s.wrapHandler(handle)) +} + +// JSON sends "data" as a JSON HTTP response +func (s *Server) JSON(w http.ResponseWriter, status int, data interface{}) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + json.NewEncoder(w).Encode(data) +} + +// wrapHandler returns a httprouter.Handle which wraps a http.HandlerFunc by +// populating request.Context with any objects from the URL params +func (s *Server) wrapHandler(handler http.HandlerFunc) httprouter.Handle { + return func(w http.ResponseWriter, req *http.Request, params httprouter.Params) { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") + + ctx := context.Background() + + if id := params.ByName("nodeid"); id != "" { + var node *Node + if nodeID, err := discover.HexID(id); err == nil { + node = s.network.GetNode(nodeID) + } else { + node = s.network.GetNodeByName(id) + } + if node == nil { + http.NotFound(w, req) + return + } + ctx = context.WithValue(ctx, "node", node) + } + + if id := params.ByName("peerid"); id != "" { + var peer *Node + if peerID, err := discover.HexID(id); err == nil { + peer = s.network.GetNode(peerID) + } else { + peer = s.network.GetNodeByName(id) + } + if peer == nil { + http.NotFound(w, req) + return + } + ctx = context.WithValue(ctx, "peer", peer) + } + + handler(w, req.WithContext(ctx)) + } +} diff --git a/p2p/simulations/http_test.go b/p2p/simulations/http_test.go new file mode 100644 index 0000000000..677a8fb147 --- /dev/null +++ b/p2p/simulations/http_test.go @@ -0,0 +1,823 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "context" + "fmt" + "math/rand" + "net/http/httptest" + "reflect" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" +) + +// testService implements the node.Service interface and provides protocols +// and APIs which are useful for testing nodes in a simulation network +type testService struct { + id discover.NodeID + + // peerCount is incremented once a peer handshake has been performed + peerCount int64 + + peers map[discover.NodeID]*testPeer + peersMtx sync.Mutex + + // state stores []byte which is used to test creating and loading + // snapshots + state atomic.Value +} + +func newTestService(ctx *adapters.ServiceContext) (node.Service, error) { + svc := &testService{ + id: ctx.Config.ID, + peers: make(map[discover.NodeID]*testPeer), + } + svc.state.Store(ctx.Snapshot) + return svc, nil +} + +type testPeer struct { + testReady chan struct{} + dumReady chan struct{} +} + +func (t *testService) peer(id discover.NodeID) *testPeer { + t.peersMtx.Lock() + defer t.peersMtx.Unlock() + if peer, ok := t.peers[id]; ok { + return peer + } + peer := &testPeer{ + testReady: make(chan struct{}), + dumReady: make(chan struct{}), + } + t.peers[id] = peer + return peer +} + +func (t *testService) Protocols() []p2p.Protocol { + return []p2p.Protocol{ + { + Name: "test", + Version: 1, + Length: 3, + Run: t.RunTest, + }, + { + Name: "dum", + Version: 1, + Length: 1, + Run: t.RunDum, + }, + { + Name: "prb", + Version: 1, + Length: 1, + Run: t.RunPrb, + }, + } +} + +func (t *testService) APIs() []rpc.API { + return []rpc.API{{ + Namespace: "test", + Version: "1.0", + Service: &TestAPI{ + state: &t.state, + peerCount: &t.peerCount, + }, + }} +} + +func (t *testService) Start(server *p2p.Server) error { + return nil +} + +func (t *testService) Stop() error { + return nil +} + +// handshake performs a peer handshake by sending and expecting an empty +// message with the given code +func (t *testService) handshake(rw p2p.MsgReadWriter, code uint64) error { + errc := make(chan error, 2) + go func() { errc <- p2p.Send(rw, code, struct{}{}) }() + go func() { errc <- p2p.ExpectMsg(rw, code, struct{}{}) }() + for i := 0; i < 2; i++ { + if err := <-errc; err != nil { + return err + } + } + return nil +} + +func (t *testService) RunTest(p *p2p.Peer, rw p2p.MsgReadWriter) error { + peer := t.peer(p.ID()) + + // perform three handshakes with three different message codes, + // used to test message sending and filtering + if err := t.handshake(rw, 2); err != nil { + return err + } + if err := t.handshake(rw, 1); err != nil { + return err + } + if err := t.handshake(rw, 0); err != nil { + return err + } + + // close the testReady channel so that other protocols can run + close(peer.testReady) + + // track the peer + atomic.AddInt64(&t.peerCount, 1) + defer atomic.AddInt64(&t.peerCount, -1) + + // block until the peer is dropped + for { + _, err := rw.ReadMsg() + if err != nil { + return err + } + } +} + +func (t *testService) RunDum(p *p2p.Peer, rw p2p.MsgReadWriter) error { + peer := t.peer(p.ID()) + + // wait for the test protocol to perform its handshake + <-peer.testReady + + // perform a handshake + if err := t.handshake(rw, 0); err != nil { + return err + } + + // close the dumReady channel so that other protocols can run + close(peer.dumReady) + + // block until the peer is dropped + for { + _, err := rw.ReadMsg() + if err != nil { + return err + } + } +} +func (t *testService) RunPrb(p *p2p.Peer, rw p2p.MsgReadWriter) error { + peer := t.peer(p.ID()) + + // wait for the dum protocol to perform its handshake + <-peer.dumReady + + // perform a handshake + if err := t.handshake(rw, 0); err != nil { + return err + } + + // block until the peer is dropped + for { + _, err := rw.ReadMsg() + if err != nil { + return err + } + } +} + +func (t *testService) Snapshot() ([]byte, error) { + return t.state.Load().([]byte), nil +} + +// TestAPI provides a test API to: +// * get the peer count +// * get and set an arbitrary state byte slice +// * get and increment a counter +// * subscribe to counter increment events +type TestAPI struct { + state *atomic.Value + peerCount *int64 + counter int64 + feed event.Feed +} + +func (t *TestAPI) PeerCount() int64 { + return atomic.LoadInt64(t.peerCount) +} + +func (t *TestAPI) Get() int64 { + return atomic.LoadInt64(&t.counter) +} + +func (t *TestAPI) Add(delta int64) { + atomic.AddInt64(&t.counter, delta) + t.feed.Send(delta) +} + +func (t *TestAPI) GetState() []byte { + return t.state.Load().([]byte) +} + +func (t *TestAPI) SetState(state []byte) { + t.state.Store(state) +} + +func (t *TestAPI) Events(ctx context.Context) (*rpc.Subscription, error) { + notifier, supported := rpc.NotifierFromContext(ctx) + if !supported { + return nil, rpc.ErrNotificationsUnsupported + } + + rpcSub := notifier.CreateSubscription() + + go func() { + events := make(chan int64) + sub := t.feed.Subscribe(events) + defer sub.Unsubscribe() + + for { + select { + case event := <-events: + notifier.Notify(rpcSub.ID, event) + case <-sub.Err(): + return + case <-rpcSub.Err(): + return + case <-notifier.Closed(): + return + } + } + }() + + return rpcSub, nil +} + +var testServices = adapters.Services{ + "test": newTestService, +} + +func testHTTPServer(t *testing.T) (*Network, *httptest.Server) { + adapter := adapters.NewSimAdapter(testServices) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + return network, httptest.NewServer(NewServer(network)) +} + +// TestHTTPNetwork tests interacting with a simulation network using the HTTP +// API +func TestHTTPNetwork(t *testing.T) { + // start the server + network, s := testHTTPServer(t) + defer s.Close() + + // subscribe to events so we can check them later + client := NewClient(s.URL) + events := make(chan *Event, 100) + var opts SubscribeOpts + sub, err := client.SubscribeNetwork(events, opts) + if err != nil { + t.Fatalf("error subscribing to network events: %s", err) + } + defer sub.Unsubscribe() + + // check we can retrieve details about the network + gotNetwork, err := client.GetNetwork() + if err != nil { + t.Fatalf("error getting network: %s", err) + } + if gotNetwork.ID != network.ID { + t.Fatalf("expected network to have ID %q, got %q", network.ID, gotNetwork.ID) + } + + // start a simulation network + nodeIDs := startTestNetwork(t, client) + + // check we got all the events + x := &expectEvents{t, events, sub} + x.expect( + x.nodeEvent(nodeIDs[0], false), + x.nodeEvent(nodeIDs[1], false), + x.nodeEvent(nodeIDs[0], true), + x.nodeEvent(nodeIDs[1], true), + x.connEvent(nodeIDs[0], nodeIDs[1], false), + x.connEvent(nodeIDs[0], nodeIDs[1], true), + ) + + // reconnect the stream and check we get the current nodes and conns + events = make(chan *Event, 100) + opts.Current = true + sub, err = client.SubscribeNetwork(events, opts) + if err != nil { + t.Fatalf("error subscribing to network events: %s", err) + } + defer sub.Unsubscribe() + x = &expectEvents{t, events, sub} + x.expect( + x.nodeEvent(nodeIDs[0], true), + x.nodeEvent(nodeIDs[1], true), + x.connEvent(nodeIDs[0], nodeIDs[1], true), + ) +} + +func startTestNetwork(t *testing.T, client *Client) []string { + // create two nodes + nodeCount := 2 + nodeIDs := make([]string, nodeCount) + for i := 0; i < nodeCount; i++ { + node, err := client.CreateNode(nil) + if err != nil { + t.Fatalf("error creating node: %s", err) + } + nodeIDs[i] = node.ID + } + + // check both nodes exist + nodes, err := client.GetNodes() + if err != nil { + t.Fatalf("error getting nodes: %s", err) + } + if len(nodes) != nodeCount { + t.Fatalf("expected %d nodes, got %d", nodeCount, len(nodes)) + } + for i, nodeID := range nodeIDs { + if nodes[i].ID != nodeID { + t.Fatalf("expected node %d to have ID %q, got %q", i, nodeID, nodes[i].ID) + } + node, err := client.GetNode(nodeID) + if err != nil { + t.Fatalf("error getting node %d: %s", i, err) + } + if node.ID != nodeID { + t.Fatalf("expected node %d to have ID %q, got %q", i, nodeID, node.ID) + } + } + + // start both nodes + for _, nodeID := range nodeIDs { + if err := client.StartNode(nodeID); err != nil { + t.Fatalf("error starting node %q: %s", nodeID, err) + } + } + + // connect the nodes + for i := 0; i < nodeCount-1; i++ { + peerId := i + 1 + if i == nodeCount-1 { + peerId = 0 + } + if err := client.ConnectNode(nodeIDs[i], nodeIDs[peerId]); err != nil { + t.Fatalf("error connecting nodes: %s", err) + } + } + + return nodeIDs +} + +type expectEvents struct { + *testing.T + + events chan *Event + sub event.Subscription +} + +func (t *expectEvents) nodeEvent(id string, up bool) *Event { + return &Event{ + Type: EventTypeNode, + Node: &Node{ + Config: &adapters.NodeConfig{ + ID: discover.MustHexID(id), + }, + Up: up, + }, + } +} + +func (t *expectEvents) connEvent(one, other string, up bool) *Event { + return &Event{ + Type: EventTypeConn, + Conn: &Conn{ + One: discover.MustHexID(one), + Other: discover.MustHexID(other), + Up: up, + }, + } +} + +func (t *expectEvents) expectMsgs(expected map[MsgFilter]int) { + actual := make(map[MsgFilter]int) + timeout := time.After(10 * time.Second) +loop: + for { + select { + case event := <-t.events: + t.Logf("received %s event: %s", event.Type, event) + + if event.Type != EventTypeMsg || event.Msg.Received { + continue loop + } + if event.Msg == nil { + t.Fatal("expected event.Msg to be set") + } + filter := MsgFilter{ + Proto: event.Msg.Protocol, + Code: int64(event.Msg.Code), + } + actual[filter]++ + if actual[filter] > expected[filter] { + t.Fatalf("received too many msgs for filter: %v", filter) + } + if reflect.DeepEqual(actual, expected) { + return + } + + case err := <-t.sub.Err(): + t.Fatalf("network stream closed unexpectedly: %s", err) + + case <-timeout: + t.Fatal("timed out waiting for expected events") + } + } +} + +func (t *expectEvents) expect(events ...*Event) { + timeout := time.After(10 * time.Second) + i := 0 + for { + select { + case event := <-t.events: + t.Logf("received %s event: %s", event.Type, event) + + expected := events[i] + if event.Type != expected.Type { + t.Fatalf("expected event %d to have type %q, got %q", i, expected.Type, event.Type) + } + + switch expected.Type { + + case EventTypeNode: + if event.Node == nil { + t.Fatal("expected event.Node to be set") + } + if event.Node.ID() != expected.Node.ID() { + t.Fatalf("expected node event %d to have id %q, got %q", i, expected.Node.ID().TerminalString(), event.Node.ID().TerminalString()) + } + if event.Node.Up != expected.Node.Up { + t.Fatalf("expected node event %d to have up=%t, got up=%t", i, expected.Node.Up, event.Node.Up) + } + + case EventTypeConn: + if event.Conn == nil { + t.Fatal("expected event.Conn to be set") + } + if event.Conn.One != expected.Conn.One { + t.Fatalf("expected conn event %d to have one=%q, got one=%q", i, expected.Conn.One.TerminalString(), event.Conn.One.TerminalString()) + } + if event.Conn.Other != expected.Conn.Other { + t.Fatalf("expected conn event %d to have other=%q, got other=%q", i, expected.Conn.Other.TerminalString(), event.Conn.Other.TerminalString()) + } + if event.Conn.Up != expected.Conn.Up { + t.Fatalf("expected conn event %d to have up=%t, got up=%t", i, expected.Conn.Up, event.Conn.Up) + } + + } + + i++ + if i == len(events) { + return + } + + case err := <-t.sub.Err(): + t.Fatalf("network stream closed unexpectedly: %s", err) + + case <-timeout: + t.Fatal("timed out waiting for expected events") + } + } +} + +// TestHTTPNodeRPC tests calling RPC methods on nodes via the HTTP API +func TestHTTPNodeRPC(t *testing.T) { + // start the server + _, s := testHTTPServer(t) + defer s.Close() + + // start a node in the network + client := NewClient(s.URL) + node, err := client.CreateNode(nil) + if err != nil { + t.Fatalf("error creating node: %s", err) + } + if err := client.StartNode(node.ID); err != nil { + t.Fatalf("error starting node: %s", err) + } + + // create two RPC clients + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + rpcClient1, err := client.RPCClient(ctx, node.ID) + if err != nil { + t.Fatalf("error getting node RPC client: %s", err) + } + rpcClient2, err := client.RPCClient(ctx, node.ID) + if err != nil { + t.Fatalf("error getting node RPC client: %s", err) + } + + // subscribe to events using client 1 + events := make(chan int64, 1) + sub, err := rpcClient1.Subscribe(ctx, "test", events, "events") + if err != nil { + t.Fatalf("error subscribing to events: %s", err) + } + defer sub.Unsubscribe() + + // call some RPC methods using client 2 + if err := rpcClient2.CallContext(ctx, nil, "test_add", 10); err != nil { + t.Fatalf("error calling RPC method: %s", err) + } + var result int64 + if err := rpcClient2.CallContext(ctx, &result, "test_get"); err != nil { + t.Fatalf("error calling RPC method: %s", err) + } + if result != 10 { + t.Fatalf("expected result to be 10, got %d", result) + } + + // check we got an event from client 1 + select { + case event := <-events: + if event != 10 { + t.Fatalf("expected event to be 10, got %d", event) + } + case <-ctx.Done(): + t.Fatal(ctx.Err()) + } +} + +// TestHTTPSnapshot tests creating and loading network snapshots +func TestHTTPSnapshot(t *testing.T) { + // start the server + _, s := testHTTPServer(t) + defer s.Close() + + // create a two-node network + client := NewClient(s.URL) + nodeCount := 2 + nodes := make([]*p2p.NodeInfo, nodeCount) + for i := 0; i < nodeCount; i++ { + node, err := client.CreateNode(nil) + if err != nil { + t.Fatalf("error creating node: %s", err) + } + if err := client.StartNode(node.ID); err != nil { + t.Fatalf("error starting node: %s", err) + } + nodes[i] = node + } + if err := client.ConnectNode(nodes[0].ID, nodes[1].ID); err != nil { + t.Fatalf("error connecting nodes: %s", err) + } + + // store some state in the test services + states := make([]string, nodeCount) + for i, node := range nodes { + rpc, err := client.RPCClient(context.Background(), node.ID) + if err != nil { + t.Fatalf("error getting RPC client: %s", err) + } + defer rpc.Close() + state := fmt.Sprintf("%x", rand.Int()) + if err := rpc.Call(nil, "test_setState", []byte(state)); err != nil { + t.Fatalf("error setting service state: %s", err) + } + states[i] = state + } + + // create a snapshot + snap, err := client.CreateSnapshot() + if err != nil { + t.Fatalf("error creating snapshot: %s", err) + } + for i, state := range states { + gotState := snap.Nodes[i].Snapshots["test"] + if string(gotState) != state { + t.Fatalf("expected snapshot state %q, got %q", state, gotState) + } + } + + // create another network + _, s = testHTTPServer(t) + defer s.Close() + client = NewClient(s.URL) + + // subscribe to events so we can check them later + events := make(chan *Event, 100) + var opts SubscribeOpts + sub, err := client.SubscribeNetwork(events, opts) + if err != nil { + t.Fatalf("error subscribing to network events: %s", err) + } + defer sub.Unsubscribe() + + // load the snapshot + if err := client.LoadSnapshot(snap); err != nil { + t.Fatalf("error loading snapshot: %s", err) + } + + // check the nodes and connection exists + net, err := client.GetNetwork() + if err != nil { + t.Fatalf("error getting network: %s", err) + } + if len(net.Nodes) != nodeCount { + t.Fatalf("expected network to have %d nodes, got %d", nodeCount, len(net.Nodes)) + } + for i, node := range nodes { + id := net.Nodes[i].ID().String() + if id != node.ID { + t.Fatalf("expected node %d to have ID %s, got %s", i, node.ID, id) + } + } + if len(net.Conns) != 1 { + t.Fatalf("expected network to have 1 connection, got %d", len(net.Conns)) + } + conn := net.Conns[0] + if conn.One.String() != nodes[0].ID { + t.Fatalf("expected connection to have one=%q, got one=%q", nodes[0].ID, conn.One) + } + if conn.Other.String() != nodes[1].ID { + t.Fatalf("expected connection to have other=%q, got other=%q", nodes[1].ID, conn.Other) + } + + // check the node states were restored + for i, node := range nodes { + rpc, err := client.RPCClient(context.Background(), node.ID) + if err != nil { + t.Fatalf("error getting RPC client: %s", err) + } + defer rpc.Close() + var state []byte + if err := rpc.Call(&state, "test_getState"); err != nil { + t.Fatalf("error getting service state: %s", err) + } + if string(state) != states[i] { + t.Fatalf("expected snapshot state %q, got %q", states[i], state) + } + } + + // check we got all the events + x := &expectEvents{t, events, sub} + x.expect( + x.nodeEvent(nodes[0].ID, false), + x.nodeEvent(nodes[0].ID, true), + x.nodeEvent(nodes[1].ID, false), + x.nodeEvent(nodes[1].ID, true), + x.connEvent(nodes[0].ID, nodes[1].ID, false), + x.connEvent(nodes[0].ID, nodes[1].ID, true), + ) +} + +// TestMsgFilterPassMultiple tests streaming message events using a filter +// with multiple protocols +func TestMsgFilterPassMultiple(t *testing.T) { + // start the server + _, s := testHTTPServer(t) + defer s.Close() + + // subscribe to events with a message filter + client := NewClient(s.URL) + events := make(chan *Event, 10) + opts := SubscribeOpts{ + Filter: "prb:0-test:0", + } + sub, err := client.SubscribeNetwork(events, opts) + if err != nil { + t.Fatalf("error subscribing to network events: %s", err) + } + defer sub.Unsubscribe() + + // start a simulation network + startTestNetwork(t, client) + + // check we got the expected events + x := &expectEvents{t, events, sub} + x.expectMsgs(map[MsgFilter]int{ + {"test", 0}: 2, + {"prb", 0}: 2, + }) +} + +// TestMsgFilterPassWildcard tests streaming message events using a filter +// with a code wildcard +func TestMsgFilterPassWildcard(t *testing.T) { + // start the server + _, s := testHTTPServer(t) + defer s.Close() + + // subscribe to events with a message filter + client := NewClient(s.URL) + events := make(chan *Event, 10) + opts := SubscribeOpts{ + Filter: "prb:0,2-test:*", + } + sub, err := client.SubscribeNetwork(events, opts) + if err != nil { + t.Fatalf("error subscribing to network events: %s", err) + } + defer sub.Unsubscribe() + + // start a simulation network + startTestNetwork(t, client) + + // check we got the expected events + x := &expectEvents{t, events, sub} + x.expectMsgs(map[MsgFilter]int{ + {"test", 2}: 2, + {"test", 1}: 2, + {"test", 0}: 2, + {"prb", 0}: 2, + }) +} + +// TestMsgFilterPassSingle tests streaming message events using a filter +// with a single protocol and code +func TestMsgFilterPassSingle(t *testing.T) { + // start the server + _, s := testHTTPServer(t) + defer s.Close() + + // subscribe to events with a message filter + client := NewClient(s.URL) + events := make(chan *Event, 10) + opts := SubscribeOpts{ + Filter: "dum:0", + } + sub, err := client.SubscribeNetwork(events, opts) + if err != nil { + t.Fatalf("error subscribing to network events: %s", err) + } + defer sub.Unsubscribe() + + // start a simulation network + startTestNetwork(t, client) + + // check we got the expected events + x := &expectEvents{t, events, sub} + x.expectMsgs(map[MsgFilter]int{ + {"dum", 0}: 2, + }) +} + +// TestMsgFilterPassSingle tests streaming message events using an invalid +// filter +func TestMsgFilterFailBadParams(t *testing.T) { + // start the server + _, s := testHTTPServer(t) + defer s.Close() + + client := NewClient(s.URL) + events := make(chan *Event, 10) + opts := SubscribeOpts{ + Filter: "foo:", + } + _, err := client.SubscribeNetwork(events, opts) + if err == nil { + t.Fatalf("expected event subscription to fail but succeeded!") + } + + opts.Filter = "bzz:aa" + _, err = client.SubscribeNetwork(events, opts) + if err == nil { + t.Fatalf("expected event subscription to fail but succeeded!") + } + + opts.Filter = "invalid" + _, err = client.SubscribeNetwork(events, opts) + if err == nil { + t.Fatalf("expected event subscription to fail but succeeded!") + } +} diff --git a/p2p/simulations/network.go b/p2p/simulations/network.go new file mode 100644 index 0000000000..06890ffcf2 --- /dev/null +++ b/p2p/simulations/network.go @@ -0,0 +1,680 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" +) + +// NetworkConfig defines configuration options for starting a Network +type NetworkConfig struct { + ID string `json:"id"` + DefaultService string `json:"default_service,omitempty"` +} + +// Network models a p2p simulation network which consists of a collection of +// simulated nodes and the connections which exist between them. +// +// The Network has a single NodeAdapter which is responsible for actually +// starting nodes and connecting them together. +// +// The Network emits events when nodes are started and stopped, when they are +// connected and disconnected, and also when messages are sent between nodes. +type Network struct { + NetworkConfig + + Nodes []*Node `json:"nodes"` + nodeMap map[discover.NodeID]int + + Conns []*Conn `json:"conns"` + connMap map[string]int + + nodeAdapter adapters.NodeAdapter + events event.Feed + lock sync.RWMutex + quitc chan struct{} +} + +// NewNetwork returns a Network which uses the given NodeAdapter and NetworkConfig +func NewNetwork(nodeAdapter adapters.NodeAdapter, conf *NetworkConfig) *Network { + return &Network{ + NetworkConfig: *conf, + nodeAdapter: nodeAdapter, + nodeMap: make(map[discover.NodeID]int), + connMap: make(map[string]int), + quitc: make(chan struct{}), + } +} + +// Events returns the output event feed of the Network. +func (self *Network) Events() *event.Feed { + return &self.events +} + +// NewNode adds a new node to the network with a random ID +func (self *Network) NewNode() (*Node, error) { + conf := adapters.RandomNodeConfig() + conf.Services = []string{self.DefaultService} + return self.NewNodeWithConfig(conf) +} + +// NewNodeWithConfig adds a new node to the network with the given config, +// returning an error if a node with the same ID or name already exists +func (self *Network) NewNodeWithConfig(conf *adapters.NodeConfig) (*Node, error) { + self.lock.Lock() + defer self.lock.Unlock() + + // create a random ID and PrivateKey if not set + if conf.ID == (discover.NodeID{}) { + c := adapters.RandomNodeConfig() + conf.ID = c.ID + conf.PrivateKey = c.PrivateKey + } + id := conf.ID + + // assign a name to the node if not set + if conf.Name == "" { + conf.Name = fmt.Sprintf("node%02d", len(self.Nodes)+1) + } + + // check the node doesn't already exist + if node := self.getNode(id); node != nil { + return nil, fmt.Errorf("node with ID %q already exists", id) + } + if node := self.getNodeByName(conf.Name); node != nil { + return nil, fmt.Errorf("node with name %q already exists", conf.Name) + } + + // if no services are configured, use the default service + if len(conf.Services) == 0 { + conf.Services = []string{self.DefaultService} + } + + // use the NodeAdapter to create the node + adapterNode, err := self.nodeAdapter.NewNode(conf) + if err != nil { + return nil, err + } + node := &Node{ + Node: adapterNode, + Config: conf, + } + log.Trace(fmt.Sprintf("node %v created", id)) + self.nodeMap[id] = len(self.Nodes) + self.Nodes = append(self.Nodes, node) + + // emit a "control" event + self.events.Send(ControlEvent(node)) + + return node, nil +} + +// Config returns the network configuration +func (self *Network) Config() *NetworkConfig { + return &self.NetworkConfig +} + +// StartAll starts all nodes in the network +func (self *Network) StartAll() error { + for _, node := range self.Nodes { + if node.Up { + continue + } + if err := self.Start(node.ID()); err != nil { + return err + } + } + return nil +} + +// StopAll stops all nodes in the network +func (self *Network) StopAll() error { + for _, node := range self.Nodes { + if !node.Up { + continue + } + if err := self.Stop(node.ID()); err != nil { + return err + } + } + return nil +} + +// Start starts the node with the given ID +func (self *Network) Start(id discover.NodeID) error { + return self.startWithSnapshots(id, nil) +} + +// startWithSnapshots starts the node with the given ID using the give +// snapshots +func (self *Network) startWithSnapshots(id discover.NodeID, snapshots map[string][]byte) error { + node := self.GetNode(id) + if node == nil { + return fmt.Errorf("node %v does not exist", id) + } + if node.Up { + return fmt.Errorf("node %v already up", id) + } + log.Trace(fmt.Sprintf("starting node %v: %v using %v", id, node.Up, self.nodeAdapter.Name())) + if err := node.Start(snapshots); err != nil { + log.Warn(fmt.Sprintf("start up failed: %v", err)) + return err + } + node.Up = true + log.Info(fmt.Sprintf("started node %v: %v", id, node.Up)) + + self.events.Send(NewEvent(node)) + + // subscribe to peer events + client, err := node.Client() + if err != nil { + return fmt.Errorf("error getting rpc client for node %v: %s", id, err) + } + events := make(chan *p2p.PeerEvent) + sub, err := client.Subscribe(context.Background(), "admin", events, "peerEvents") + if err != nil { + return fmt.Errorf("error getting peer events for node %v: %s", id, err) + } + go self.watchPeerEvents(id, events, sub) + return nil +} + +// watchPeerEvents reads peer events from the given channel and emits +// corresponding network events +func (self *Network) watchPeerEvents(id discover.NodeID, events chan *p2p.PeerEvent, sub event.Subscription) { + defer func() { + sub.Unsubscribe() + + // assume the node is now down + self.lock.Lock() + node := self.getNode(id) + node.Up = false + self.lock.Unlock() + self.events.Send(NewEvent(node)) + }() + for { + select { + case event, ok := <-events: + if !ok { + return + } + peer := event.Peer + switch event.Type { + + case p2p.PeerEventTypeAdd: + self.DidConnect(id, peer) + + case p2p.PeerEventTypeDrop: + self.DidDisconnect(id, peer) + + case p2p.PeerEventTypeMsgSend: + self.DidSend(id, peer, event.Protocol, *event.MsgCode) + + case p2p.PeerEventTypeMsgRecv: + self.DidReceive(peer, id, event.Protocol, *event.MsgCode) + + } + + case err := <-sub.Err(): + if err != nil { + log.Error(fmt.Sprintf("error getting peer events for node %v", id), "err", err) + } + return + } + } +} + +// Stop stops the node with the given ID +func (self *Network) Stop(id discover.NodeID) error { + node := self.GetNode(id) + if node == nil { + return fmt.Errorf("node %v does not exist", id) + } + if !node.Up { + return fmt.Errorf("node %v already down", id) + } + if err := node.Stop(); err != nil { + return err + } + node.Up = false + log.Info(fmt.Sprintf("stop node %v: %v", id, node.Up)) + + self.events.Send(ControlEvent(node)) + return nil +} + +// Connect connects two nodes together by calling the "admin_addPeer" RPC +// method on the "one" node so that it connects to the "other" node +func (self *Network) Connect(oneID, otherID discover.NodeID) error { + log.Debug(fmt.Sprintf("connecting %s to %s", oneID, otherID)) + conn, err := self.GetOrCreateConn(oneID, otherID) + if err != nil { + return err + } + if conn.Up { + return fmt.Errorf("%v and %v already connected", oneID, otherID) + } + if err := conn.nodesUp(); err != nil { + return err + } + client, err := conn.one.Client() + if err != nil { + return err + } + self.events.Send(ControlEvent(conn)) + return client.Call(nil, "admin_addPeer", string(conn.other.Addr())) +} + +// Disconnect disconnects two nodes by calling the "admin_removePeer" RPC +// method on the "one" node so that it disconnects from the "other" node +func (self *Network) Disconnect(oneID, otherID discover.NodeID) error { + conn := self.GetConn(oneID, otherID) + if conn == nil { + return fmt.Errorf("connection between %v and %v does not exist", oneID, otherID) + } + if !conn.Up { + return fmt.Errorf("%v and %v already disconnected", oneID, otherID) + } + client, err := conn.one.Client() + if err != nil { + return err + } + self.events.Send(ControlEvent(conn)) + return client.Call(nil, "admin_removePeer", string(conn.other.Addr())) +} + +// DidConnect tracks the fact that the "one" node connected to the "other" node +func (self *Network) DidConnect(one, other discover.NodeID) error { + conn, err := self.GetOrCreateConn(one, other) + if err != nil { + return fmt.Errorf("connection between %v and %v does not exist", one, other) + } + if conn.Up { + return fmt.Errorf("%v and %v already connected", one, other) + } + conn.Up = true + self.events.Send(NewEvent(conn)) + return nil +} + +// DidDisconnect tracks the fact that the "one" node disconnected from the +// "other" node +func (self *Network) DidDisconnect(one, other discover.NodeID) error { + conn, err := self.GetOrCreateConn(one, other) + if err != nil { + return fmt.Errorf("connection between %v and %v does not exist", one, other) + } + if !conn.Up { + return fmt.Errorf("%v and %v already disconnected", one, other) + } + conn.Up = false + self.events.Send(NewEvent(conn)) + return nil +} + +// DidSend tracks the fact that "sender" sent a message to "receiver" +func (self *Network) DidSend(sender, receiver discover.NodeID, proto string, code uint64) error { + msg := &Msg{ + One: sender, + Other: receiver, + Protocol: proto, + Code: code, + Received: false, + } + self.events.Send(NewEvent(msg)) + return nil +} + +// DidReceive tracks the fact that "receiver" received a message from "sender" +func (self *Network) DidReceive(sender, receiver discover.NodeID, proto string, code uint64) error { + msg := &Msg{ + One: sender, + Other: receiver, + Protocol: proto, + Code: code, + Received: true, + } + self.events.Send(NewEvent(msg)) + return nil +} + +// GetNode gets the node with the given ID, returning nil if the node does not +// exist +func (self *Network) GetNode(id discover.NodeID) *Node { + self.lock.Lock() + defer self.lock.Unlock() + return self.getNode(id) +} + +// GetNode gets the node with the given name, returning nil if the node does +// not exist +func (self *Network) GetNodeByName(name string) *Node { + self.lock.Lock() + defer self.lock.Unlock() + return self.getNodeByName(name) +} + +func (self *Network) getNode(id discover.NodeID) *Node { + i, found := self.nodeMap[id] + if !found { + return nil + } + return self.Nodes[i] +} + +func (self *Network) getNodeByName(name string) *Node { + for _, node := range self.Nodes { + if node.Config.Name == name { + return node + } + } + return nil +} + +// GetNodes returns the existing nodes +func (self *Network) GetNodes() []*Node { + self.lock.Lock() + defer self.lock.Unlock() + return self.Nodes +} + +// GetConn returns the connection which exists between "one" and "other" +// regardless of which node initiated the connection +func (self *Network) GetConn(oneID, otherID discover.NodeID) *Conn { + self.lock.Lock() + defer self.lock.Unlock() + return self.getConn(oneID, otherID) +} + +// GetOrCreateConn is like GetConn but creates the connection if it doesn't +// already exist +func (self *Network) GetOrCreateConn(oneID, otherID discover.NodeID) (*Conn, error) { + self.lock.Lock() + defer self.lock.Unlock() + if conn := self.getConn(oneID, otherID); conn != nil { + return conn, nil + } + + one := self.getNode(oneID) + if one == nil { + return nil, fmt.Errorf("node %v does not exist", oneID) + } + other := self.getNode(otherID) + if other == nil { + return nil, fmt.Errorf("node %v does not exist", otherID) + } + conn := &Conn{ + One: oneID, + Other: otherID, + one: one, + other: other, + } + label := ConnLabel(oneID, otherID) + self.connMap[label] = len(self.Conns) + self.Conns = append(self.Conns, conn) + return conn, nil +} + +func (self *Network) getConn(oneID, otherID discover.NodeID) *Conn { + label := ConnLabel(oneID, otherID) + i, found := self.connMap[label] + if !found { + return nil + } + return self.Conns[i] +} + +// Shutdown stops all nodes in the network and closes the quit channel +func (self *Network) Shutdown() { + for _, node := range self.Nodes { + log.Debug(fmt.Sprintf("stopping node %s", node.ID().TerminalString())) + if err := node.Stop(); err != nil { + log.Warn(fmt.Sprintf("error stopping node %s", node.ID().TerminalString()), "err", err) + } + } + close(self.quitc) +} + +// Node is a wrapper around adapters.Node which is used to track the status +// of a node in the network +type Node struct { + adapters.Node `json:"-"` + + // Config if the config used to created the node + Config *adapters.NodeConfig `json:"config"` + + // Up tracks whether or not the node is running + Up bool `json:"up"` +} + +// ID returns the ID of the node +func (self *Node) ID() discover.NodeID { + return self.Config.ID +} + +// String returns a log-friendly string +func (self *Node) String() string { + return fmt.Sprintf("Node %v", self.ID().TerminalString()) +} + +// NodeInfo returns information about the node +func (self *Node) NodeInfo() *p2p.NodeInfo { + // avoid a panic if the node is not started yet + if self.Node == nil { + return nil + } + info := self.Node.NodeInfo() + info.Name = self.Config.Name + return info +} + +// MarshalJSON implements the json.Marshaler interface so that the encoded +// JSON includes the NodeInfo +func (self *Node) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Info *p2p.NodeInfo `json:"info,omitempty"` + Config *adapters.NodeConfig `json:"config,omitempty"` + Up bool `json:"up"` + }{ + Info: self.NodeInfo(), + Config: self.Config, + Up: self.Up, + }) +} + +// Conn represents a connection between two nodes in the network +type Conn struct { + // One is the node which initiated the connection + One discover.NodeID `json:"one"` + + // Other is the node which the connection was made to + Other discover.NodeID `json:"other"` + + // Up tracks whether or not the connection is active + Up bool `json:"up"` + + one *Node + other *Node +} + +// nodesUp returns whether both nodes are currently up +func (self *Conn) nodesUp() error { + if !self.one.Up { + return fmt.Errorf("one %v is not up", self.One) + } + if !self.other.Up { + return fmt.Errorf("other %v is not up", self.Other) + } + return nil +} + +// String returns a log-friendly string +func (self *Conn) String() string { + return fmt.Sprintf("Conn %v->%v", self.One.TerminalString(), self.Other.TerminalString()) +} + +// Msg represents a p2p message sent between two nodes in the network +type Msg struct { + One discover.NodeID `json:"one"` + Other discover.NodeID `json:"other"` + Protocol string `json:"protocol"` + Code uint64 `json:"code"` + Received bool `json:"received"` +} + +// String returns a log-friendly string +func (self *Msg) String() string { + return fmt.Sprintf("Msg(%d) %v->%v", self.Code, self.One.TerminalString(), self.Other.TerminalString()) +} + +// ConnLabel generates a deterministic string which represents a connection +// between two nodes, used to compare if two connections are between the same +// nodes +func ConnLabel(source, target discover.NodeID) string { + var first, second discover.NodeID + if bytes.Compare(source.Bytes(), target.Bytes()) > 0 { + first = target + second = source + } else { + first = source + second = target + } + return fmt.Sprintf("%v-%v", first, second) +} + +// Snapshot represents the state of a network at a single point in time and can +// be used to restore the state of a network +type Snapshot struct { + Nodes []NodeSnapshot `json:"nodes,omitempty"` + Conns []Conn `json:"conns,omitempty"` +} + +// NodeSnapshot represents the state of a node in the network +type NodeSnapshot struct { + Node Node `json:"node,omitempty"` + + // Snapshots is arbitrary data gathered from calling node.Snapshots() + Snapshots map[string][]byte `json:"snapshots,omitempty"` +} + +// Snapshot creates a network snapshot +func (self *Network) Snapshot() (*Snapshot, error) { + self.lock.Lock() + defer self.lock.Unlock() + snap := &Snapshot{ + Nodes: make([]NodeSnapshot, len(self.Nodes)), + Conns: make([]Conn, len(self.Conns)), + } + for i, node := range self.Nodes { + snap.Nodes[i] = NodeSnapshot{Node: *node} + if !node.Up { + continue + } + snapshots, err := node.Snapshots() + if err != nil { + return nil, err + } + snap.Nodes[i].Snapshots = snapshots + } + for i, conn := range self.Conns { + snap.Conns[i] = *conn + } + return snap, nil +} + +// Load loads a network snapshot +func (self *Network) Load(snap *Snapshot) error { + for _, n := range snap.Nodes { + if _, err := self.NewNodeWithConfig(n.Node.Config); err != nil { + return err + } + if !n.Node.Up { + continue + } + if err := self.startWithSnapshots(n.Node.Config.ID, n.Snapshots); err != nil { + return err + } + } + for _, conn := range snap.Conns { + if err := self.Connect(conn.One, conn.Other); err != nil { + return err + } + } + return nil +} + +// Subscribe reads control events from a channel and executes them +func (self *Network) Subscribe(events chan *Event) { + for { + select { + case event, ok := <-events: + if !ok { + return + } + if event.Control { + self.executeControlEvent(event) + } + case <-self.quitc: + return + } + } +} + +func (self *Network) executeControlEvent(event *Event) { + log.Trace("execute control event", "type", event.Type, "event", event) + switch event.Type { + case EventTypeNode: + if err := self.executeNodeEvent(event); err != nil { + log.Error("error executing node event", "event", event, "err", err) + } + case EventTypeConn: + if err := self.executeConnEvent(event); err != nil { + log.Error("error executing conn event", "event", event, "err", err) + } + case EventTypeMsg: + log.Warn("ignoring control msg event") + } +} + +func (self *Network) executeNodeEvent(e *Event) error { + if !e.Node.Up { + return self.Stop(e.Node.ID()) + } + + if _, err := self.NewNodeWithConfig(e.Node.Config); err != nil { + return err + } + return self.Start(e.Node.ID()) +} + +func (self *Network) executeConnEvent(e *Event) error { + if e.Conn.Up { + return self.Connect(e.Conn.One, e.Conn.Other) + } else { + return self.Disconnect(e.Conn.One, e.Conn.Other) + } +} diff --git a/p2p/simulations/network_test.go b/p2p/simulations/network_test.go new file mode 100644 index 0000000000..2a062121be --- /dev/null +++ b/p2p/simulations/network_test.go @@ -0,0 +1,159 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" +) + +// TestNetworkSimulation creates a multi-node simulation network with each node +// connected in a ring topology, checks that all nodes successfully handshake +// with each other and that a snapshot fully represents the desired topology +func TestNetworkSimulation(t *testing.T) { + // create simulation network with 20 testService nodes + adapter := adapters.NewSimAdapter(adapters.Services{ + "test": newTestService, + }) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + defer network.Shutdown() + nodeCount := 20 + ids := make([]discover.NodeID, nodeCount) + for i := 0; i < nodeCount; i++ { + node, err := network.NewNode() + if err != nil { + t.Fatalf("error creating node: %s", err) + } + if err := network.Start(node.ID()); err != nil { + t.Fatalf("error starting node: %s", err) + } + ids[i] = node.ID() + } + + // perform a check which connects the nodes in a ring (so each node is + // connected to exactly two peers) and then checks that all nodes + // performed two handshakes by checking their peerCount + action := func(_ context.Context) error { + for i, id := range ids { + peerID := ids[(i+1)%len(ids)] + if err := network.Connect(id, peerID); err != nil { + return err + } + } + return nil + } + check := func(ctx context.Context, id discover.NodeID) (bool, error) { + // check we haven't run out of time + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + } + + // get the node + node := network.GetNode(id) + if node == nil { + return false, fmt.Errorf("unknown node: %s", id) + } + + // check it has exactly two peers + client, err := node.Client() + if err != nil { + return false, err + } + var peerCount int64 + if err := client.CallContext(ctx, &peerCount, "test_peerCount"); err != nil { + return false, err + } + switch { + case peerCount < 2: + return false, nil + case peerCount == 2: + return true, nil + default: + return false, fmt.Errorf("unexpected peerCount: %d", peerCount) + } + } + + timeout := 30 * time.Second + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + // trigger a check every 100ms + trigger := make(chan discover.NodeID) + go triggerChecks(ctx, ids, trigger, 100*time.Millisecond) + + result := NewSimulation(network).Run(ctx, &Step{ + Action: action, + Trigger: trigger, + Expect: &Expectation{ + Nodes: ids, + Check: check, + }, + }) + if result.Error != nil { + t.Fatalf("simulation failed: %s", result.Error) + } + + // take a network snapshot and check it contains the correct topology + snap, err := network.Snapshot() + if err != nil { + t.Fatal(err) + } + if len(snap.Nodes) != nodeCount { + t.Fatalf("expected snapshot to contain %d nodes, got %d", nodeCount, len(snap.Nodes)) + } + if len(snap.Conns) != nodeCount { + t.Fatalf("expected snapshot to contain %d connections, got %d", nodeCount, len(snap.Conns)) + } + for i, id := range ids { + conn := snap.Conns[i] + if conn.One != id { + t.Fatalf("expected conn[%d].One to be %s, got %s", i, id, conn.One) + } + peerID := ids[(i+1)%len(ids)] + if conn.Other != peerID { + t.Fatalf("expected conn[%d].Other to be %s, got %s", i, peerID, conn.Other) + } + } +} + +func triggerChecks(ctx context.Context, ids []discover.NodeID, trigger chan discover.NodeID, interval time.Duration) { + tick := time.NewTicker(interval) + defer tick.Stop() + for { + select { + case <-tick.C: + for _, id := range ids { + select { + case trigger <- id: + case <-ctx.Done(): + return + } + } + case <-ctx.Done(): + return + } + } +} diff --git a/p2p/simulations/simulation.go b/p2p/simulations/simulation.go new file mode 100644 index 0000000000..28886e924a --- /dev/null +++ b/p2p/simulations/simulation.go @@ -0,0 +1,157 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "context" + "time" + + "github.com/ethereum/go-ethereum/p2p/discover" +) + +// Simulation provides a framework for running actions in a simulated network +// and then waiting for expectations to be met +type Simulation struct { + network *Network +} + +// NewSimulation returns a new simulation which runs in the given network +func NewSimulation(network *Network) *Simulation { + return &Simulation{ + network: network, + } +} + +// Run performs a step of the simulation by performing the step's action and +// then waiting for the step's expectation to be met +func (s *Simulation) Run(ctx context.Context, step *Step) (result *StepResult) { + result = newStepResult() + + result.StartedAt = time.Now() + defer func() { result.FinishedAt = time.Now() }() + + // watch network events for the duration of the step + stop := s.watchNetwork(result) + defer stop() + + // perform the action + if err := step.Action(ctx); err != nil { + result.Error = err + return + } + + // wait for all node expectations to either pass, error or timeout + nodes := make(map[discover.NodeID]struct{}, len(step.Expect.Nodes)) + for _, id := range step.Expect.Nodes { + nodes[id] = struct{}{} + } + for len(result.Passes) < len(nodes) { + select { + case id := <-step.Trigger: + // skip if we aren't checking the node + if _, ok := nodes[id]; !ok { + continue + } + + // skip if the node has already passed + if _, ok := result.Passes[id]; ok { + continue + } + + // run the node expectation check + pass, err := step.Expect.Check(ctx, id) + if err != nil { + result.Error = err + return + } + if pass { + result.Passes[id] = time.Now() + } + case <-ctx.Done(): + result.Error = ctx.Err() + return + } + } + + return +} + +func (s *Simulation) watchNetwork(result *StepResult) func() { + stop := make(chan struct{}) + done := make(chan struct{}) + events := make(chan *Event) + sub := s.network.Events().Subscribe(events) + go func() { + defer close(done) + defer sub.Unsubscribe() + for { + select { + case event := <-events: + result.NetworkEvents = append(result.NetworkEvents, event) + case <-stop: + return + } + } + }() + return func() { + close(stop) + <-done + } +} + +type Step struct { + // Action is the action to perform for this step + Action func(context.Context) error + + // Trigger is a channel which receives node ids and triggers an + // expectation check for that node + Trigger chan discover.NodeID + + // Expect is the expectation to wait for when performing this step + Expect *Expectation +} + +type Expectation struct { + // Nodes is a list of nodes to check + Nodes []discover.NodeID + + // Check checks whether a given node meets the expectation + Check func(context.Context, discover.NodeID) (bool, error) +} + +func newStepResult() *StepResult { + return &StepResult{ + Passes: make(map[discover.NodeID]time.Time), + } +} + +type StepResult struct { + // Error is the error encountered whilst running the step + Error error + + // StartedAt is the time the step started + StartedAt time.Time + + // FinishedAt is the time the step finished + FinishedAt time.Time + + // Passes are the timestamps of the successful node expectations + Passes map[discover.NodeID]time.Time + + // NetworkEvents are the network events which occurred during the step + NetworkEvents []*Event +} diff --git a/rpc/client.go b/rpc/client.go index f02366a39c..8aa84ec982 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -349,85 +349,49 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { return err } -// ShhSubscribe calls the "shh_subscribe" method with the given arguments, -// registering a subscription. Server notifications for the subscription are -// sent to the given channel. The element type of the channel must match the -// expected type of content returned by the subscription. -// -// The context argument cancels the RPC request that sets up the subscription but has no -// effect on the subscription after ShhSubscribe has returned. -// -// Slow subscribers will be dropped eventually. Client buffers up to 8000 notifications -// before considering the subscriber dead. The subscription Err channel will receive -// ErrSubscriptionQueueOverflow. Use a sufficiently large buffer on the channel or ensure -// that the channel usually has at least one reader to prevent this issue. -func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { - // Check type of channel first. - chanVal := reflect.ValueOf(channel) - if chanVal.Kind() != reflect.Chan || chanVal.Type().ChanDir()&reflect.SendDir == 0 { - panic("first argument to ShhSubscribe must be a writable channel") - } - if chanVal.IsNil() { - panic("channel given to ShhSubscribe must not be nil") - } - if c.isHTTP { - return nil, ErrNotificationsUnsupported - } - - msg, err := c.newMessage("shh"+subscribeMethodSuffix, args...) - if err != nil { - return nil, err - } - op := &requestOp{ - ids: []json.RawMessage{msg.ID}, - resp: make(chan *jsonrpcMessage), - sub: newClientSubscription(c, "shh", chanVal), - } - - // Send the subscription request. - // The arrival and validity of the response is signaled on sub.quit. - if err := c.send(ctx, op, msg); err != nil { - return nil, err - } - if _, err := op.wait(ctx); err != nil { - return nil, err - } - return op.sub, nil +// EthSubscribe registers a subscripion under the "eth" namespace. +func (c *Client) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { + return c.Subscribe(ctx, "eth", channel, args...) } -// EthSubscribe calls the "eth_subscribe" method with the given arguments, +// ShhSubscribe registers a subscripion under the "shh" namespace. +func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { + return c.Subscribe(ctx, "shh", channel, args...) +} + +// Subscribe calls the "_subscribe" method with the given arguments, // registering a subscription. Server notifications for the subscription are // sent to the given channel. The element type of the channel must match the // expected type of content returned by the subscription. // // The context argument cancels the RPC request that sets up the subscription but has no -// effect on the subscription after EthSubscribe has returned. +// effect on the subscription after Subscribe has returned. // // Slow subscribers will be dropped eventually. Client buffers up to 8000 notifications // before considering the subscriber dead. The subscription Err channel will receive // ErrSubscriptionQueueOverflow. Use a sufficiently large buffer on the channel or ensure // that the channel usually has at least one reader to prevent this issue. -func (c *Client) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { +func (c *Client) Subscribe(ctx context.Context, namespace string, channel interface{}, args ...interface{}) (*ClientSubscription, error) { // Check type of channel first. chanVal := reflect.ValueOf(channel) if chanVal.Kind() != reflect.Chan || chanVal.Type().ChanDir()&reflect.SendDir == 0 { - panic("first argument to EthSubscribe must be a writable channel") + panic("first argument to Subscribe must be a writable channel") } if chanVal.IsNil() { - panic("channel given to EthSubscribe must not be nil") + panic("channel given to Subscribe must not be nil") } if c.isHTTP { return nil, ErrNotificationsUnsupported } - msg, err := c.newMessage("eth"+subscribeMethodSuffix, args...) + msg, err := c.newMessage(namespace+subscribeMethodSuffix, args...) if err != nil { return nil, err } op := &requestOp{ ids: []json.RawMessage{msg.ID}, resp: make(chan *jsonrpcMessage), - sub: newClientSubscription(c, "eth", chanVal), + sub: newClientSubscription(c, namespace, chanVal), } // Send the subscription request. diff --git a/rpc/client_test.go b/rpc/client_test.go index 10d74670b7..4f354d389e 100644 --- a/rpc/client_test.go +++ b/rpc/client_test.go @@ -251,6 +251,38 @@ func TestClientSubscribe(t *testing.T) { } } +func TestClientSubscribeCustomNamespace(t *testing.T) { + namespace := "custom" + server := newTestServer(namespace, new(NotificationTestService)) + defer server.Stop() + client := DialInProc(server) + defer client.Close() + + nc := make(chan int) + count := 10 + sub, err := client.Subscribe(context.Background(), namespace, nc, "someSubscription", count, 0) + if err != nil { + t.Fatal("can't subscribe:", err) + } + for i := 0; i < count; i++ { + if val := <-nc; val != i { + t.Fatalf("value mismatch: got %d, want %d", val, i) + } + } + + sub.Unsubscribe() + select { + case v := <-nc: + t.Fatal("received value after unsubscribe:", v) + case err := <-sub.Err(): + if err != nil { + t.Fatalf("Err returned a non-nil error after explicit unsubscribe: %q", err) + } + case <-time.After(1 * time.Second): + t.Fatalf("subscription not closed within 1s after unsubscribe") + } +} + // In this test, the connection drops while EthSubscribe is // waiting for a response. func TestClientSubscribeClose(t *testing.T) { diff --git a/vendor/github.com/julienschmidt/httprouter/LICENSE b/vendor/github.com/julienschmidt/httprouter/LICENSE new file mode 100644 index 0000000000..b829abc8a1 --- /dev/null +++ b/vendor/github.com/julienschmidt/httprouter/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2013 Julien Schmidt. All rights reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of the contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL JULIEN SCHMIDT BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/github.com/julienschmidt/httprouter/README.md b/vendor/github.com/julienschmidt/httprouter/README.md new file mode 100644 index 0000000000..92885470b9 --- /dev/null +++ b/vendor/github.com/julienschmidt/httprouter/README.md @@ -0,0 +1,266 @@ +# HttpRouter [![Build Status](https://travis-ci.org/julienschmidt/httprouter.svg?branch=master)](https://travis-ci.org/julienschmidt/httprouter) [![Coverage Status](https://coveralls.io/repos/github/julienschmidt/httprouter/badge.svg?branch=master)](https://coveralls.io/github/julienschmidt/httprouter?branch=master) [![GoDoc](https://godoc.org/github.com/julienschmidt/httprouter?status.svg)](http://godoc.org/github.com/julienschmidt/httprouter) + +HttpRouter is a lightweight high performance HTTP request router (also called *multiplexer* or just *mux* for short) for [Go](https://golang.org/). + +In contrast to the [default mux](https://golang.org/pkg/net/http/#ServeMux) of Go's `net/http` package, this router supports variables in the routing pattern and matches against the request method. It also scales better. + +The router is optimized for high performance and a small memory footprint. It scales well even with very long paths and a large number of routes. A compressing dynamic trie (radix tree) structure is used for efficient matching. + +## Features + +**Only explicit matches:** With other routers, like [`http.ServeMux`](https://golang.org/pkg/net/http/#ServeMux), a requested URL path could match multiple patterns. Therefore they have some awkward pattern priority rules, like *longest match* or *first registered, first matched*. By design of this router, a request can only match exactly one or no route. As a result, there are also no unintended matches, which makes it great for SEO and improves the user experience. + +**Stop caring about trailing slashes:** Choose the URL style you like, the router automatically redirects the client if a trailing slash is missing or if there is one extra. Of course it only does so, if the new path has a handler. If you don't like it, you can [turn off this behavior](https://godoc.org/github.com/julienschmidt/httprouter#Router.RedirectTrailingSlash). + +**Path auto-correction:** Besides detecting the missing or additional trailing slash at no extra cost, the router can also fix wrong cases and remove superfluous path elements (like `../` or `//`). Is [CAPTAIN CAPS LOCK](http://www.urbandictionary.com/define.php?term=Captain+Caps+Lock) one of your users? HttpRouter can help him by making a case-insensitive look-up and redirecting him to the correct URL. + +**Parameters in your routing pattern:** Stop parsing the requested URL path, just give the path segment a name and the router delivers the dynamic value to you. Because of the design of the router, path parameters are very cheap. + +**Zero Garbage:** The matching and dispatching process generates zero bytes of garbage. In fact, the only heap allocations that are made, is by building the slice of the key-value pairs for path parameters. If the request path contains no parameters, not a single heap allocation is necessary. + +**Best Performance:** [Benchmarks speak for themselves](https://github.com/julienschmidt/go-http-routing-benchmark). See below for technical details of the implementation. + +**No more server crashes:** You can set a [Panic handler](https://godoc.org/github.com/julienschmidt/httprouter#Router.PanicHandler) to deal with panics occurring during handling a HTTP request. The router then recovers and lets the `PanicHandler` log what happened and deliver a nice error page. + +**Perfect for APIs:** The router design encourages to build sensible, hierarchical RESTful APIs. Moreover it has builtin native support for [OPTIONS requests](http://zacstewart.com/2012/04/14/http-options-method.html) and `405 Method Not Allowed` replies. + +Of course you can also set **custom [`NotFound`](https://godoc.org/github.com/julienschmidt/httprouter#Router.NotFound) and [`MethodNotAllowed`](https://godoc.org/github.com/julienschmidt/httprouter#Router.MethodNotAllowed) handlers** and [**serve static files**](https://godoc.org/github.com/julienschmidt/httprouter#Router.ServeFiles). + +## Usage + +This is just a quick introduction, view the [GoDoc](http://godoc.org/github.com/julienschmidt/httprouter) for details. + +Let's start with a trivial example: + +```go +package main + +import ( + "fmt" + "github.com/julienschmidt/httprouter" + "net/http" + "log" +) + +func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + fmt.Fprint(w, "Welcome!\n") +} + +func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name")) +} + +func main() { + router := httprouter.New() + router.GET("/", Index) + router.GET("/hello/:name", Hello) + + log.Fatal(http.ListenAndServe(":8080", router)) +} +``` + +### Named parameters + +As you can see, `:name` is a *named parameter*. The values are accessible via `httprouter.Params`, which is just a slice of `httprouter.Param`s. You can get the value of a parameter either by its index in the slice, or by using the `ByName(name)` method: `:name` can be retrived by `ByName("name")`. + +Named parameters only match a single path segment: + +``` +Pattern: /user/:user + + /user/gordon match + /user/you match + /user/gordon/profile no match + /user/ no match +``` + +**Note:** Since this router has only explicit matches, you can not register static routes and parameters for the same path segment. For example you can not register the patterns `/user/new` and `/user/:user` for the same request method at the same time. The routing of different request methods is independent from each other. + +### Catch-All parameters + +The second type are *catch-all* parameters and have the form `*name`. Like the name suggests, they match everything. Therefore they must always be at the **end** of the pattern: + +``` +Pattern: /src/*filepath + + /src/ match + /src/somefile.go match + /src/subdir/somefile.go match +``` + +## How does it work? + +The router relies on a tree structure which makes heavy use of *common prefixes*, it is basically a *compact* [*prefix tree*](https://en.wikipedia.org/wiki/Trie) (or just [*Radix tree*](https://en.wikipedia.org/wiki/Radix_tree)). Nodes with a common prefix also share a common parent. Here is a short example what the routing tree for the `GET` request method could look like: + +``` +Priority Path Handle +9 \ *<1> +3 ├s nil +2 |├earch\ *<2> +1 |└upport\ *<3> +2 ├blog\ *<4> +1 | └:post nil +1 | └\ *<5> +2 ├about-us\ *<6> +1 | └team\ *<7> +1 └contact\ *<8> +``` + +Every `*` represents the memory address of a handler function (a pointer). If you follow a path trough the tree from the root to the leaf, you get the complete route path, e.g `\blog\:post\`, where `:post` is just a placeholder ([*parameter*](#named-parameters)) for an actual post name. Unlike hash-maps, a tree structure also allows us to use dynamic parts like the `:post` parameter, since we actually match against the routing patterns instead of just comparing hashes. [As benchmarks show](https://github.com/julienschmidt/go-http-routing-benchmark), this works very well and efficient. + +Since URL paths have a hierarchical structure and make use only of a limited set of characters (byte values), it is very likely that there are a lot of common prefixes. This allows us to easily reduce the routing into ever smaller problems. Moreover the router manages a separate tree for every request method. For one thing it is more space efficient than holding a method->handle map in every single node, for another thing is also allows us to greatly reduce the routing problem before even starting the look-up in the prefix-tree. + +For even better scalability, the child nodes on each tree level are ordered by priority, where the priority is just the number of handles registered in sub nodes (children, grandchildren, and so on..). This helps in two ways: + +1. Nodes which are part of the most routing paths are evaluated first. This helps to make as much routes as possible to be reachable as fast as possible. +2. It is some sort of cost compensation. The longest reachable path (highest cost) can always be evaluated first. The following scheme visualizes the tree structure. Nodes are evaluated from top to bottom and from left to right. + +``` +├------------ +├--------- +├----- +├---- +├-- +├-- +└- +``` + +## Why doesn't this work with `http.Handler`? + +**It does!** The router itself implements the `http.Handler` interface. Moreover the router provides convenient [adapters for `http.Handler`](https://godoc.org/github.com/julienschmidt/httprouter#Router.Handler)s and [`http.HandlerFunc`](https://godoc.org/github.com/julienschmidt/httprouter#Router.HandlerFunc)s which allows them to be used as a [`httprouter.Handle`](https://godoc.org/github.com/julienschmidt/httprouter#Router.Handle) when registering a route. The only disadvantage is, that no parameter values can be retrieved when a `http.Handler` or `http.HandlerFunc` is used, since there is no efficient way to pass the values with the existing function parameters. Therefore [`httprouter.Handle`](https://godoc.org/github.com/julienschmidt/httprouter#Router.Handle) has a third function parameter. + +Just try it out for yourself, the usage of HttpRouter is very straightforward. The package is compact and minimalistic, but also probably one of the easiest routers to set up. + +## Where can I find Middleware *X*? + +This package just provides a very efficient request router with a few extra features. The router is just a [`http.Handler`](https://golang.org/pkg/net/http/#Handler), you can chain any http.Handler compatible middleware before the router, for example the [Gorilla handlers](http://www.gorillatoolkit.org/pkg/handlers). Or you could [just write your own](https://justinas.org/writing-http-middleware-in-go/), it's very easy! + +Alternatively, you could try [a web framework based on HttpRouter](#web-frameworks-based-on-httprouter). + +### Multi-domain / Sub-domains + +Here is a quick example: Does your server serve multiple domains / hosts? +You want to use sub-domains? +Define a router per host! + +```go +// We need an object that implements the http.Handler interface. +// Therefore we need a type for which we implement the ServeHTTP method. +// We just use a map here, in which we map host names (with port) to http.Handlers +type HostSwitch map[string]http.Handler + +// Implement the ServerHTTP method on our new type +func (hs HostSwitch) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Check if a http.Handler is registered for the given host. + // If yes, use it to handle the request. + if handler := hs[r.Host]; handler != nil { + handler.ServeHTTP(w, r) + } else { + // Handle host names for wich no handler is registered + http.Error(w, "Forbidden", 403) // Or Redirect? + } +} + +func main() { + // Initialize a router as usual + router := httprouter.New() + router.GET("/", Index) + router.GET("/hello/:name", Hello) + + // Make a new HostSwitch and insert the router (our http handler) + // for example.com and port 12345 + hs := make(HostSwitch) + hs["example.com:12345"] = router + + // Use the HostSwitch to listen and serve on port 12345 + log.Fatal(http.ListenAndServe(":12345", hs)) +} +``` + +### Basic Authentication + +Another quick example: Basic Authentication (RFC 2617) for handles: + +```go +package main + +import ( + "fmt" + "log" + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func BasicAuth(h httprouter.Handle, requiredUser, requiredPassword string) httprouter.Handle { + return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Get the Basic Authentication credentials + user, password, hasAuth := r.BasicAuth() + + if hasAuth && user == requiredUser && password == requiredPassword { + // Delegate request to the given handle + h(w, r, ps) + } else { + // Request Basic Authentication otherwise + w.Header().Set("WWW-Authenticate", "Basic realm=Restricted") + http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) + } + } +} + +func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + fmt.Fprint(w, "Not protected!\n") +} + +func Protected(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + fmt.Fprint(w, "Protected!\n") +} + +func main() { + user := "gordon" + pass := "secret!" + + router := httprouter.New() + router.GET("/", Index) + router.GET("/protected/", BasicAuth(Protected, user, pass)) + + log.Fatal(http.ListenAndServe(":8080", router)) +} +``` + +## Chaining with the NotFound handler + +**NOTE: It might be required to set [`Router.HandleMethodNotAllowed`](https://godoc.org/github.com/julienschmidt/httprouter#Router.HandleMethodNotAllowed) to `false` to avoid problems.** + +You can use another [`http.Handler`](https://golang.org/pkg/net/http/#Handler), for example another router, to handle requests which could not be matched by this router by using the [`Router.NotFound`](https://godoc.org/github.com/julienschmidt/httprouter#Router.NotFound) handler. This allows chaining. + +### Static files + +The `NotFound` handler can for example be used to serve static files from the root path `/` (like an `index.html` file along with other assets): + +```go +// Serve static files from the ./public directory +router.NotFound = http.FileServer(http.Dir("public")) +``` + +But this approach sidesteps the strict core rules of this router to avoid routing problems. A cleaner approach is to use a distinct sub-path for serving files, like `/static/*filepath` or `/files/*filepath`. + +## Web Frameworks based on HttpRouter + +If the HttpRouter is a bit too minimalistic for you, you might try one of the following more high-level 3rd-party web frameworks building upon the HttpRouter package: + +* [Ace](https://github.com/plimble/ace): Blazing fast Go Web Framework +* [api2go](https://github.com/manyminds/api2go): A JSON API Implementation for Go +* [Gin](https://github.com/gin-gonic/gin): Features a martini-like API with much better performance +* [Goat](https://github.com/bahlo/goat): A minimalistic REST API server in Go +* [goMiddlewareChain](https://github.com/TobiEiss/goMiddlewareChain): An express.js-like-middleware-chain +* [Hikaru](https://github.com/najeira/hikaru): Supports standalone and Google AppEngine +* [Hitch](https://github.com/nbio/hitch): Hitch ties httprouter, [httpcontext](https://github.com/nbio/httpcontext), and middleware up in a bow +* [httpway](https://github.com/corneldamian/httpway): Simple middleware extension with context for httprouter and a server with gracefully shutdown support +* [kami](https://github.com/guregu/kami): A tiny web framework using x/net/context +* [Medeina](https://github.com/imdario/medeina): Inspired by Ruby's Roda and Cuba +* [Neko](https://github.com/rocwong/neko): A lightweight web application framework for Golang +* [River](https://github.com/abiosoft/river): River is a simple and lightweight REST server +* [Roxanna](https://github.com/iamthemuffinman/Roxanna): An amalgamation of httprouter, better logging, and hot reload +* [siesta](https://github.com/VividCortex/siesta): Composable HTTP handlers with contexts +* [xmux](https://github.com/rs/xmux): xmux is a httprouter fork on top of xhandler (net/context aware) diff --git a/vendor/github.com/julienschmidt/httprouter/path.go b/vendor/github.com/julienschmidt/httprouter/path.go new file mode 100644 index 0000000000..486134db37 --- /dev/null +++ b/vendor/github.com/julienschmidt/httprouter/path.go @@ -0,0 +1,123 @@ +// Copyright 2013 Julien Schmidt. All rights reserved. +// Based on the path package, Copyright 2009 The Go Authors. +// Use of this source code is governed by a BSD-style license that can be found +// in the LICENSE file. + +package httprouter + +// CleanPath is the URL version of path.Clean, it returns a canonical URL path +// for p, eliminating . and .. elements. +// +// The following rules are applied iteratively until no further processing can +// be done: +// 1. Replace multiple slashes with a single slash. +// 2. Eliminate each . path name element (the current directory). +// 3. Eliminate each inner .. path name element (the parent directory) +// along with the non-.. element that precedes it. +// 4. Eliminate .. elements that begin a rooted path: +// that is, replace "/.." by "/" at the beginning of a path. +// +// If the result of this process is an empty string, "/" is returned +func CleanPath(p string) string { + // Turn empty string into "/" + if p == "" { + return "/" + } + + n := len(p) + var buf []byte + + // Invariants: + // reading from path; r is index of next byte to process. + // writing to buf; w is index of next byte to write. + + // path must start with '/' + r := 1 + w := 1 + + if p[0] != '/' { + r = 0 + buf = make([]byte, n+1) + buf[0] = '/' + } + + trailing := n > 2 && p[n-1] == '/' + + // A bit more clunky without a 'lazybuf' like the path package, but the loop + // gets completely inlined (bufApp). So in contrast to the path package this + // loop has no expensive function calls (except 1x make) + + for r < n { + switch { + case p[r] == '/': + // empty path element, trailing slash is added after the end + r++ + + case p[r] == '.' && r+1 == n: + trailing = true + r++ + + case p[r] == '.' && p[r+1] == '/': + // . element + r++ + + case p[r] == '.' && p[r+1] == '.' && (r+2 == n || p[r+2] == '/'): + // .. element: remove to last / + r += 2 + + if w > 1 { + // can backtrack + w-- + + if buf == nil { + for w > 1 && p[w] != '/' { + w-- + } + } else { + for w > 1 && buf[w] != '/' { + w-- + } + } + } + + default: + // real path element. + // add slash if needed + if w > 1 { + bufApp(&buf, p, w, '/') + w++ + } + + // copy element + for r < n && p[r] != '/' { + bufApp(&buf, p, w, p[r]) + w++ + r++ + } + } + } + + // re-append trailing slash + if trailing && w > 1 { + bufApp(&buf, p, w, '/') + w++ + } + + if buf == nil { + return p[:w] + } + return string(buf[:w]) +} + +// internal helper to lazily create a buffer if necessary +func bufApp(buf *[]byte, s string, w int, c byte) { + if *buf == nil { + if s[w] == c { + return + } + + *buf = make([]byte, len(s)) + copy(*buf, s[:w]) + } + (*buf)[w] = c +} diff --git a/vendor/github.com/julienschmidt/httprouter/router.go b/vendor/github.com/julienschmidt/httprouter/router.go new file mode 100644 index 0000000000..bb1733005b --- /dev/null +++ b/vendor/github.com/julienschmidt/httprouter/router.go @@ -0,0 +1,411 @@ +// Copyright 2013 Julien Schmidt. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be found +// in the LICENSE file. + +// Package httprouter is a trie based high performance HTTP request router. +// +// A trivial example is: +// +// package main +// +// import ( +// "fmt" +// "github.com/julienschmidt/httprouter" +// "net/http" +// "log" +// ) +// +// func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { +// fmt.Fprint(w, "Welcome!\n") +// } +// +// func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { +// fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name")) +// } +// +// func main() { +// router := httprouter.New() +// router.GET("/", Index) +// router.GET("/hello/:name", Hello) +// +// log.Fatal(http.ListenAndServe(":8080", router)) +// } +// +// The router matches incoming requests by the request method and the path. +// If a handle is registered for this path and method, the router delegates the +// request to that function. +// For the methods GET, POST, PUT, PATCH and DELETE shortcut functions exist to +// register handles, for all other methods router.Handle can be used. +// +// The registered path, against which the router matches incoming requests, can +// contain two types of parameters: +// Syntax Type +// :name named parameter +// *name catch-all parameter +// +// Named parameters are dynamic path segments. They match anything until the +// next '/' or the path end: +// Path: /blog/:category/:post +// +// Requests: +// /blog/go/request-routers match: category="go", post="request-routers" +// /blog/go/request-routers/ no match, but the router would redirect +// /blog/go/ no match +// /blog/go/request-routers/comments no match +// +// Catch-all parameters match anything until the path end, including the +// directory index (the '/' before the catch-all). Since they match anything +// until the end, catch-all parameters must always be the final path element. +// Path: /files/*filepath +// +// Requests: +// /files/ match: filepath="/" +// /files/LICENSE match: filepath="/LICENSE" +// /files/templates/article.html match: filepath="/templates/article.html" +// /files no match, but the router would redirect +// +// The value of parameters is saved as a slice of the Param struct, consisting +// each of a key and a value. The slice is passed to the Handle func as a third +// parameter. +// There are two ways to retrieve the value of a parameter: +// // by the name of the parameter +// user := ps.ByName("user") // defined by :user or *user +// +// // by the index of the parameter. This way you can also get the name (key) +// thirdKey := ps[2].Key // the name of the 3rd parameter +// thirdValue := ps[2].Value // the value of the 3rd parameter +package httprouter + +import ( + "net/http" +) + +// Handle is a function that can be registered to a route to handle HTTP +// requests. Like http.HandlerFunc, but has a third parameter for the values of +// wildcards (variables). +type Handle func(http.ResponseWriter, *http.Request, Params) + +// Param is a single URL parameter, consisting of a key and a value. +type Param struct { + Key string + Value string +} + +// Params is a Param-slice, as returned by the router. +// The slice is ordered, the first URL parameter is also the first slice value. +// It is therefore safe to read values by the index. +type Params []Param + +// ByName returns the value of the first Param which key matches the given name. +// If no matching Param is found, an empty string is returned. +func (ps Params) ByName(name string) string { + for i := range ps { + if ps[i].Key == name { + return ps[i].Value + } + } + return "" +} + +// Router is a http.Handler which can be used to dispatch requests to different +// handler functions via configurable routes +type Router struct { + trees map[string]*node + + // Enables automatic redirection if the current route can't be matched but a + // handler for the path with (without) the trailing slash exists. + // For example if /foo/ is requested but a route only exists for /foo, the + // client is redirected to /foo with http status code 301 for GET requests + // and 307 for all other request methods. + RedirectTrailingSlash bool + + // If enabled, the router tries to fix the current request path, if no + // handle is registered for it. + // First superfluous path elements like ../ or // are removed. + // Afterwards the router does a case-insensitive lookup of the cleaned path. + // If a handle can be found for this route, the router makes a redirection + // to the corrected path with status code 301 for GET requests and 307 for + // all other request methods. + // For example /FOO and /..//Foo could be redirected to /foo. + // RedirectTrailingSlash is independent of this option. + RedirectFixedPath bool + + // If enabled, the router checks if another method is allowed for the + // current route, if the current request can not be routed. + // If this is the case, the request is answered with 'Method Not Allowed' + // and HTTP status code 405. + // If no other Method is allowed, the request is delegated to the NotFound + // handler. + HandleMethodNotAllowed bool + + // If enabled, the router automatically replies to OPTIONS requests. + // Custom OPTIONS handlers take priority over automatic replies. + HandleOPTIONS bool + + // Configurable http.Handler which is called when no matching route is + // found. If it is not set, http.NotFound is used. + NotFound http.Handler + + // Configurable http.Handler which is called when a request + // cannot be routed and HandleMethodNotAllowed is true. + // If it is not set, http.Error with http.StatusMethodNotAllowed is used. + // The "Allow" header with allowed request methods is set before the handler + // is called. + MethodNotAllowed http.Handler + + // Function to handle panics recovered from http handlers. + // It should be used to generate a error page and return the http error code + // 500 (Internal Server Error). + // The handler can be used to keep your server from crashing because of + // unrecovered panics. + PanicHandler func(http.ResponseWriter, *http.Request, interface{}) +} + +// Make sure the Router conforms with the http.Handler interface +var _ http.Handler = New() + +// New returns a new initialized Router. +// Path auto-correction, including trailing slashes, is enabled by default. +func New() *Router { + return &Router{ + RedirectTrailingSlash: true, + RedirectFixedPath: true, + HandleMethodNotAllowed: true, + HandleOPTIONS: true, + } +} + +// GET is a shortcut for router.Handle("GET", path, handle) +func (r *Router) GET(path string, handle Handle) { + r.Handle("GET", path, handle) +} + +// HEAD is a shortcut for router.Handle("HEAD", path, handle) +func (r *Router) HEAD(path string, handle Handle) { + r.Handle("HEAD", path, handle) +} + +// OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle) +func (r *Router) OPTIONS(path string, handle Handle) { + r.Handle("OPTIONS", path, handle) +} + +// POST is a shortcut for router.Handle("POST", path, handle) +func (r *Router) POST(path string, handle Handle) { + r.Handle("POST", path, handle) +} + +// PUT is a shortcut for router.Handle("PUT", path, handle) +func (r *Router) PUT(path string, handle Handle) { + r.Handle("PUT", path, handle) +} + +// PATCH is a shortcut for router.Handle("PATCH", path, handle) +func (r *Router) PATCH(path string, handle Handle) { + r.Handle("PATCH", path, handle) +} + +// DELETE is a shortcut for router.Handle("DELETE", path, handle) +func (r *Router) DELETE(path string, handle Handle) { + r.Handle("DELETE", path, handle) +} + +// Handle registers a new request handle with the given path and method. +// +// For GET, POST, PUT, PATCH and DELETE requests the respective shortcut +// functions can be used. +// +// This function is intended for bulk loading and to allow the usage of less +// frequently used, non-standardized or custom methods (e.g. for internal +// communication with a proxy). +func (r *Router) Handle(method, path string, handle Handle) { + if path[0] != '/' { + panic("path must begin with '/' in path '" + path + "'") + } + + if r.trees == nil { + r.trees = make(map[string]*node) + } + + root := r.trees[method] + if root == nil { + root = new(node) + r.trees[method] = root + } + + root.addRoute(path, handle) +} + +// Handler is an adapter which allows the usage of an http.Handler as a +// request handle. +func (r *Router) Handler(method, path string, handler http.Handler) { + r.Handle(method, path, + func(w http.ResponseWriter, req *http.Request, _ Params) { + handler.ServeHTTP(w, req) + }, + ) +} + +// HandlerFunc is an adapter which allows the usage of an http.HandlerFunc as a +// request handle. +func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc) { + r.Handler(method, path, handler) +} + +// ServeFiles serves files from the given file system root. +// The path must end with "/*filepath", files are then served from the local +// path /defined/root/dir/*filepath. +// For example if root is "/etc" and *filepath is "passwd", the local file +// "/etc/passwd" would be served. +// Internally a http.FileServer is used, therefore http.NotFound is used instead +// of the Router's NotFound handler. +// To use the operating system's file system implementation, +// use http.Dir: +// router.ServeFiles("/src/*filepath", http.Dir("/var/www")) +func (r *Router) ServeFiles(path string, root http.FileSystem) { + if len(path) < 10 || path[len(path)-10:] != "/*filepath" { + panic("path must end with /*filepath in path '" + path + "'") + } + + fileServer := http.FileServer(root) + + r.GET(path, func(w http.ResponseWriter, req *http.Request, ps Params) { + req.URL.Path = ps.ByName("filepath") + fileServer.ServeHTTP(w, req) + }) +} + +func (r *Router) recv(w http.ResponseWriter, req *http.Request) { + if rcv := recover(); rcv != nil { + r.PanicHandler(w, req, rcv) + } +} + +// Lookup allows the manual lookup of a method + path combo. +// This is e.g. useful to build a framework around this router. +// If the path was found, it returns the handle function and the path parameter +// values. Otherwise the third return value indicates whether a redirection to +// the same path with an extra / without the trailing slash should be performed. +func (r *Router) Lookup(method, path string) (Handle, Params, bool) { + if root := r.trees[method]; root != nil { + return root.getValue(path) + } + return nil, nil, false +} + +func (r *Router) allowed(path, reqMethod string) (allow string) { + if path == "*" { // server-wide + for method := range r.trees { + if method == "OPTIONS" { + continue + } + + // add request method to list of allowed methods + if len(allow) == 0 { + allow = method + } else { + allow += ", " + method + } + } + } else { // specific path + for method := range r.trees { + // Skip the requested method - we already tried this one + if method == reqMethod || method == "OPTIONS" { + continue + } + + handle, _, _ := r.trees[method].getValue(path) + if handle != nil { + // add request method to list of allowed methods + if len(allow) == 0 { + allow = method + } else { + allow += ", " + method + } + } + } + } + if len(allow) > 0 { + allow += ", OPTIONS" + } + return +} + +// ServeHTTP makes the router implement the http.Handler interface. +func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if r.PanicHandler != nil { + defer r.recv(w, req) + } + + path := req.URL.Path + + if root := r.trees[req.Method]; root != nil { + if handle, ps, tsr := root.getValue(path); handle != nil { + handle(w, req, ps) + return + } else if req.Method != "CONNECT" && path != "/" { + code := 301 // Permanent redirect, request with GET method + if req.Method != "GET" { + // Temporary redirect, request with same method + // As of Go 1.3, Go does not support status code 308. + code = 307 + } + + if tsr && r.RedirectTrailingSlash { + if len(path) > 1 && path[len(path)-1] == '/' { + req.URL.Path = path[:len(path)-1] + } else { + req.URL.Path = path + "/" + } + http.Redirect(w, req, req.URL.String(), code) + return + } + + // Try to fix the request path + if r.RedirectFixedPath { + fixedPath, found := root.findCaseInsensitivePath( + CleanPath(path), + r.RedirectTrailingSlash, + ) + if found { + req.URL.Path = string(fixedPath) + http.Redirect(w, req, req.URL.String(), code) + return + } + } + } + } + + if req.Method == "OPTIONS" { + // Handle OPTIONS requests + if r.HandleOPTIONS { + if allow := r.allowed(path, req.Method); len(allow) > 0 { + w.Header().Set("Allow", allow) + return + } + } + } else { + // Handle 405 + if r.HandleMethodNotAllowed { + if allow := r.allowed(path, req.Method); len(allow) > 0 { + w.Header().Set("Allow", allow) + if r.MethodNotAllowed != nil { + r.MethodNotAllowed.ServeHTTP(w, req) + } else { + http.Error(w, + http.StatusText(http.StatusMethodNotAllowed), + http.StatusMethodNotAllowed, + ) + } + return + } + } + } + + // Handle 404 + if r.NotFound != nil { + r.NotFound.ServeHTTP(w, req) + } else { + http.NotFound(w, req) + } +} diff --git a/vendor/github.com/julienschmidt/httprouter/tree.go b/vendor/github.com/julienschmidt/httprouter/tree.go new file mode 100644 index 0000000000..a8fa98b04f --- /dev/null +++ b/vendor/github.com/julienschmidt/httprouter/tree.go @@ -0,0 +1,656 @@ +// Copyright 2013 Julien Schmidt. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be found +// in the LICENSE file. + +package httprouter + +import ( + "strings" + "unicode" + "unicode/utf8" +) + +func min(a, b int) int { + if a <= b { + return a + } + return b +} + +func countParams(path string) uint8 { + var n uint + for i := 0; i < len(path); i++ { + if path[i] != ':' && path[i] != '*' { + continue + } + n++ + } + if n >= 255 { + return 255 + } + return uint8(n) +} + +type nodeType uint8 + +const ( + static nodeType = iota // default + root + param + catchAll +) + +type node struct { + path string + wildChild bool + nType nodeType + maxParams uint8 + indices string + children []*node + handle Handle + priority uint32 +} + +// increments priority of the given child and reorders if necessary +func (n *node) incrementChildPrio(pos int) int { + n.children[pos].priority++ + prio := n.children[pos].priority + + // adjust position (move to front) + newPos := pos + for newPos > 0 && n.children[newPos-1].priority < prio { + // swap node positions + n.children[newPos-1], n.children[newPos] = n.children[newPos], n.children[newPos-1] + + newPos-- + } + + // build new index char string + if newPos != pos { + n.indices = n.indices[:newPos] + // unchanged prefix, might be empty + n.indices[pos:pos+1] + // the index char we move + n.indices[newPos:pos] + n.indices[pos+1:] // rest without char at 'pos' + } + + return newPos +} + +// addRoute adds a node with the given handle to the path. +// Not concurrency-safe! +func (n *node) addRoute(path string, handle Handle) { + fullPath := path + n.priority++ + numParams := countParams(path) + + // non-empty tree + if len(n.path) > 0 || len(n.children) > 0 { + walk: + for { + // Update maxParams of the current node + if numParams > n.maxParams { + n.maxParams = numParams + } + + // Find the longest common prefix. + // This also implies that the common prefix contains no ':' or '*' + // since the existing key can't contain those chars. + i := 0 + max := min(len(path), len(n.path)) + for i < max && path[i] == n.path[i] { + i++ + } + + // Split edge + if i < len(n.path) { + child := node{ + path: n.path[i:], + wildChild: n.wildChild, + nType: static, + indices: n.indices, + children: n.children, + handle: n.handle, + priority: n.priority - 1, + } + + // Update maxParams (max of all children) + for i := range child.children { + if child.children[i].maxParams > child.maxParams { + child.maxParams = child.children[i].maxParams + } + } + + n.children = []*node{&child} + // []byte for proper unicode char conversion, see #65 + n.indices = string([]byte{n.path[i]}) + n.path = path[:i] + n.handle = nil + n.wildChild = false + } + + // Make new node a child of this node + if i < len(path) { + path = path[i:] + + if n.wildChild { + n = n.children[0] + n.priority++ + + // Update maxParams of the child node + if numParams > n.maxParams { + n.maxParams = numParams + } + numParams-- + + // Check if the wildcard matches + if len(path) >= len(n.path) && n.path == path[:len(n.path)] && + // Check for longer wildcard, e.g. :name and :names + (len(n.path) >= len(path) || path[len(n.path)] == '/') { + continue walk + } else { + // Wildcard conflict + var pathSeg string + if n.nType == catchAll { + pathSeg = path + } else { + pathSeg = strings.SplitN(path, "/", 2)[0] + } + prefix := fullPath[:strings.Index(fullPath, pathSeg)] + n.path + panic("'" + pathSeg + + "' in new path '" + fullPath + + "' conflicts with existing wildcard '" + n.path + + "' in existing prefix '" + prefix + + "'") + } + } + + c := path[0] + + // slash after param + if n.nType == param && c == '/' && len(n.children) == 1 { + n = n.children[0] + n.priority++ + continue walk + } + + // Check if a child with the next path byte exists + for i := 0; i < len(n.indices); i++ { + if c == n.indices[i] { + i = n.incrementChildPrio(i) + n = n.children[i] + continue walk + } + } + + // Otherwise insert it + if c != ':' && c != '*' { + // []byte for proper unicode char conversion, see #65 + n.indices += string([]byte{c}) + child := &node{ + maxParams: numParams, + } + n.children = append(n.children, child) + n.incrementChildPrio(len(n.indices) - 1) + n = child + } + n.insertChild(numParams, path, fullPath, handle) + return + + } else if i == len(path) { // Make node a (in-path) leaf + if n.handle != nil { + panic("a handle is already registered for path '" + fullPath + "'") + } + n.handle = handle + } + return + } + } else { // Empty tree + n.insertChild(numParams, path, fullPath, handle) + n.nType = root + } +} + +func (n *node) insertChild(numParams uint8, path, fullPath string, handle Handle) { + var offset int // already handled bytes of the path + + // find prefix until first wildcard (beginning with ':'' or '*'') + for i, max := 0, len(path); numParams > 0; i++ { + c := path[i] + if c != ':' && c != '*' { + continue + } + + // find wildcard end (either '/' or path end) + end := i + 1 + for end < max && path[end] != '/' { + switch path[end] { + // the wildcard name must not contain ':' and '*' + case ':', '*': + panic("only one wildcard per path segment is allowed, has: '" + + path[i:] + "' in path '" + fullPath + "'") + default: + end++ + } + } + + // check if this Node existing children which would be + // unreachable if we insert the wildcard here + if len(n.children) > 0 { + panic("wildcard route '" + path[i:end] + + "' conflicts with existing children in path '" + fullPath + "'") + } + + // check if the wildcard has a name + if end-i < 2 { + panic("wildcards must be named with a non-empty name in path '" + fullPath + "'") + } + + if c == ':' { // param + // split path at the beginning of the wildcard + if i > 0 { + n.path = path[offset:i] + offset = i + } + + child := &node{ + nType: param, + maxParams: numParams, + } + n.children = []*node{child} + n.wildChild = true + n = child + n.priority++ + numParams-- + + // if the path doesn't end with the wildcard, then there + // will be another non-wildcard subpath starting with '/' + if end < max { + n.path = path[offset:end] + offset = end + + child := &node{ + maxParams: numParams, + priority: 1, + } + n.children = []*node{child} + n = child + } + + } else { // catchAll + if end != max || numParams > 1 { + panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'") + } + + if len(n.path) > 0 && n.path[len(n.path)-1] == '/' { + panic("catch-all conflicts with existing handle for the path segment root in path '" + fullPath + "'") + } + + // currently fixed width 1 for '/' + i-- + if path[i] != '/' { + panic("no / before catch-all in path '" + fullPath + "'") + } + + n.path = path[offset:i] + + // first node: catchAll node with empty path + child := &node{ + wildChild: true, + nType: catchAll, + maxParams: 1, + } + n.children = []*node{child} + n.indices = string(path[i]) + n = child + n.priority++ + + // second node: node holding the variable + child = &node{ + path: path[i:], + nType: catchAll, + maxParams: 1, + handle: handle, + priority: 1, + } + n.children = []*node{child} + + return + } + } + + // insert remaining path part and handle to the leaf + n.path = path[offset:] + n.handle = handle +} + +// Returns the handle registered with the given path (key). The values of +// wildcards are saved to a map. +// If no handle can be found, a TSR (trailing slash redirect) recommendation is +// made if a handle exists with an extra (without the) trailing slash for the +// given path. +func (n *node) getValue(path string) (handle Handle, p Params, tsr bool) { +walk: // outer loop for walking the tree + for { + if len(path) > len(n.path) { + if path[:len(n.path)] == n.path { + path = path[len(n.path):] + // If this node does not have a wildcard (param or catchAll) + // child, we can just look up the next child node and continue + // to walk down the tree + if !n.wildChild { + c := path[0] + for i := 0; i < len(n.indices); i++ { + if c == n.indices[i] { + n = n.children[i] + continue walk + } + } + + // Nothing found. + // We can recommend to redirect to the same URL without a + // trailing slash if a leaf exists for that path. + tsr = (path == "/" && n.handle != nil) + return + + } + + // handle wildcard child + n = n.children[0] + switch n.nType { + case param: + // find param end (either '/' or path end) + end := 0 + for end < len(path) && path[end] != '/' { + end++ + } + + // save param value + if p == nil { + // lazy allocation + p = make(Params, 0, n.maxParams) + } + i := len(p) + p = p[:i+1] // expand slice within preallocated capacity + p[i].Key = n.path[1:] + p[i].Value = path[:end] + + // we need to go deeper! + if end < len(path) { + if len(n.children) > 0 { + path = path[end:] + n = n.children[0] + continue walk + } + + // ... but we can't + tsr = (len(path) == end+1) + return + } + + if handle = n.handle; handle != nil { + return + } else if len(n.children) == 1 { + // No handle found. Check if a handle for this path + a + // trailing slash exists for TSR recommendation + n = n.children[0] + tsr = (n.path == "/" && n.handle != nil) + } + + return + + case catchAll: + // save param value + if p == nil { + // lazy allocation + p = make(Params, 0, n.maxParams) + } + i := len(p) + p = p[:i+1] // expand slice within preallocated capacity + p[i].Key = n.path[2:] + p[i].Value = path + + handle = n.handle + return + + default: + panic("invalid node type") + } + } + } else if path == n.path { + // We should have reached the node containing the handle. + // Check if this node has a handle registered. + if handle = n.handle; handle != nil { + return + } + + if path == "/" && n.wildChild && n.nType != root { + tsr = true + return + } + + // No handle found. Check if a handle for this path + a + // trailing slash exists for trailing slash recommendation + for i := 0; i < len(n.indices); i++ { + if n.indices[i] == '/' { + n = n.children[i] + tsr = (len(n.path) == 1 && n.handle != nil) || + (n.nType == catchAll && n.children[0].handle != nil) + return + } + } + + return + } + + // Nothing found. We can recommend to redirect to the same URL with an + // extra trailing slash if a leaf exists for that path + tsr = (path == "/") || + (len(n.path) == len(path)+1 && n.path[len(path)] == '/' && + path == n.path[:len(n.path)-1] && n.handle != nil) + return + } +} + +// Makes a case-insensitive lookup of the given path and tries to find a handler. +// It can optionally also fix trailing slashes. +// It returns the case-corrected path and a bool indicating whether the lookup +// was successful. +func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPath []byte, found bool) { + return n.findCaseInsensitivePathRec( + path, + strings.ToLower(path), + make([]byte, 0, len(path)+1), // preallocate enough memory for new path + [4]byte{}, // empty rune buffer + fixTrailingSlash, + ) +} + +// shift bytes in array by n bytes left +func shiftNRuneBytes(rb [4]byte, n int) [4]byte { + switch n { + case 0: + return rb + case 1: + return [4]byte{rb[1], rb[2], rb[3], 0} + case 2: + return [4]byte{rb[2], rb[3]} + case 3: + return [4]byte{rb[3]} + default: + return [4]byte{} + } +} + +// recursive case-insensitive lookup function used by n.findCaseInsensitivePath +func (n *node) findCaseInsensitivePathRec(path, loPath string, ciPath []byte, rb [4]byte, fixTrailingSlash bool) ([]byte, bool) { + loNPath := strings.ToLower(n.path) + +walk: // outer loop for walking the tree + for len(loPath) >= len(loNPath) && (len(loNPath) == 0 || loPath[1:len(loNPath)] == loNPath[1:]) { + // add common path to result + ciPath = append(ciPath, n.path...) + + if path = path[len(n.path):]; len(path) > 0 { + loOld := loPath + loPath = loPath[len(loNPath):] + + // If this node does not have a wildcard (param or catchAll) child, + // we can just look up the next child node and continue to walk down + // the tree + if !n.wildChild { + // skip rune bytes already processed + rb = shiftNRuneBytes(rb, len(loNPath)) + + if rb[0] != 0 { + // old rune not finished + for i := 0; i < len(n.indices); i++ { + if n.indices[i] == rb[0] { + // continue with child node + n = n.children[i] + loNPath = strings.ToLower(n.path) + continue walk + } + } + } else { + // process a new rune + var rv rune + + // find rune start + // runes are up to 4 byte long, + // -4 would definitely be another rune + var off int + for max := min(len(loNPath), 3); off < max; off++ { + if i := len(loNPath) - off; utf8.RuneStart(loOld[i]) { + // read rune from cached lowercase path + rv, _ = utf8.DecodeRuneInString(loOld[i:]) + break + } + } + + // calculate lowercase bytes of current rune + utf8.EncodeRune(rb[:], rv) + // skipp already processed bytes + rb = shiftNRuneBytes(rb, off) + + for i := 0; i < len(n.indices); i++ { + // lowercase matches + if n.indices[i] == rb[0] { + // must use a recursive approach since both the + // uppercase byte and the lowercase byte might exist + // as an index + if out, found := n.children[i].findCaseInsensitivePathRec( + path, loPath, ciPath, rb, fixTrailingSlash, + ); found { + return out, true + } + break + } + } + + // same for uppercase rune, if it differs + if up := unicode.ToUpper(rv); up != rv { + utf8.EncodeRune(rb[:], up) + rb = shiftNRuneBytes(rb, off) + + for i := 0; i < len(n.indices); i++ { + // uppercase matches + if n.indices[i] == rb[0] { + // continue with child node + n = n.children[i] + loNPath = strings.ToLower(n.path) + continue walk + } + } + } + } + + // Nothing found. We can recommend to redirect to the same URL + // without a trailing slash if a leaf exists for that path + return ciPath, (fixTrailingSlash && path == "/" && n.handle != nil) + } + + n = n.children[0] + switch n.nType { + case param: + // find param end (either '/' or path end) + k := 0 + for k < len(path) && path[k] != '/' { + k++ + } + + // add param value to case insensitive path + ciPath = append(ciPath, path[:k]...) + + // we need to go deeper! + if k < len(path) { + if len(n.children) > 0 { + // continue with child node + n = n.children[0] + loNPath = strings.ToLower(n.path) + loPath = loPath[k:] + path = path[k:] + continue + } + + // ... but we can't + if fixTrailingSlash && len(path) == k+1 { + return ciPath, true + } + return ciPath, false + } + + if n.handle != nil { + return ciPath, true + } else if fixTrailingSlash && len(n.children) == 1 { + // No handle found. Check if a handle for this path + a + // trailing slash exists + n = n.children[0] + if n.path == "/" && n.handle != nil { + return append(ciPath, '/'), true + } + } + return ciPath, false + + case catchAll: + return append(ciPath, path...), true + + default: + panic("invalid node type") + } + } else { + // We should have reached the node containing the handle. + // Check if this node has a handle registered. + if n.handle != nil { + return ciPath, true + } + + // No handle found. + // Try to fix the path by adding a trailing slash + if fixTrailingSlash { + for i := 0; i < len(n.indices); i++ { + if n.indices[i] == '/' { + n = n.children[i] + if (len(n.path) == 1 && n.handle != nil) || + (n.nType == catchAll && n.children[0].handle != nil) { + return append(ciPath, '/'), true + } + return ciPath, false + } + } + } + return ciPath, false + } + } + + // Nothing found. + // Try to fix the path by adding / removing a trailing slash + if fixTrailingSlash { + if path == "/" { + return ciPath, true + } + if len(loPath)+1 == len(loNPath) && loNPath[len(loPath)] == '/' && + loPath[1:] == loNPath[1:len(loPath)] && n.handle != nil { + return append(ciPath, n.path...), true + } + } + return ciPath, false +} diff --git a/vendor/vendor.json b/vendor/vendor.json index a9de0ec728..15eda52090 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -182,6 +182,12 @@ "revision": "1fa385a6f45828c83361136b45b1a21a12139493", "revisionTime": "2016-06-03T03:41:37Z" }, + { + "checksumSHA1": "gKyBj05YkfuLFruAyPZ4KV9nFp8=", + "path": "github.com/julienschmidt/httprouter", + "revision": "975b5c4c7c21c0e3d2764200bf2aa8e34657ae6e", + "revisionTime": "2017-04-30T22:20:11Z" + }, { "checksumSHA1": "UpjhOUZ1+0zNt+iIvdtECSHXmTs=", "path": "github.com/karalabe/hid", From d6a6180366e613deaa5ce9c36e80bb0fac5430f6 Mon Sep 17 00:00:00 2001 From: Derek Chiang Date: Mon, 25 Sep 2017 01:36:13 -0700 Subject: [PATCH 176/272] contracts/chequebook: fix two contract issues (#15086) This patch fixes the following issues: * The contract executes send() when it does not have enough balance. * The contract always sends a total amount of zero. --- contracts/chequebook/contract/chequebook.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol index eefe6c0637..845ba464b3 100644 --- a/contracts/chequebook/contract/chequebook.sol +++ b/contracts/chequebook/contract/chequebook.sol @@ -27,10 +27,11 @@ contract chequebook is mortal { if(owner != ecrecover(hash, sig_v, sig_r, sig_s)) return; // Attempt sending the difference between the cumulative amount on the cheque // and the cumulative amount on the last cashed cheque to beneficiary. - if (amount - sent[beneficiary] >= this.balance) { + uint256 diff = amount - sent[beneficiary]; + if (diff <= this.balance) { // update the cumulative amount before sending sent[beneficiary] = amount; - if (!beneficiary.send(amount - sent[beneficiary])) { + if (!beneficiary.send(diff)) { // Upon failure to execute send, revert everything throw; } From 2b4a5f2677fdf0d8a34a2d19fddc203b973dfe02 Mon Sep 17 00:00:00 2001 From: slumber1122 Date: Mon, 25 Sep 2017 16:38:42 +0800 Subject: [PATCH 177/272] internal/ethapi: remove code duplication around tx sending (#15158) --- internal/ethapi/api.go | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 6eb37e6840..8d1a6f7462 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1081,7 +1081,10 @@ func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c } if tx.To() == nil { signer := types.MakeSigner(b.ChainConfig(), b.CurrentBlock().Number()) - from, _ := types.Sender(signer, tx) + from, err := types.Sender(signer, tx) + if err != nil { + return common.Hash{}, err + } addr := crypto.CreateAddress(from, tx.Nonce()) log.Info("Submitted contract creation", "fullhash", tx.Hash().Hex(), "contract", addr.Hex()) } else { @@ -1129,29 +1132,12 @@ func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args Sen // SendRawTransaction will add the signed transaction to the transaction pool. // The sender is responsible for signing the transaction and using the correct nonce. -func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encodedTx hexutil.Bytes) (string, error) { +func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encodedTx hexutil.Bytes) (common.Hash, error) { tx := new(types.Transaction) if err := rlp.DecodeBytes(encodedTx, tx); err != nil { - return "", err + return common.Hash{}, err } - - if err := s.b.SendTx(ctx, tx); err != nil { - return "", err - } - - signer := types.MakeSigner(s.b.ChainConfig(), s.b.CurrentBlock().Number()) - if tx.To() == nil { - from, err := types.Sender(signer, tx) - if err != nil { - return "", err - } - addr := crypto.CreateAddress(from, tx.Nonce()) - log.Info("Submitted contract creation", "fullhash", tx.Hash().Hex(), "contract", addr.Hex()) - } else { - log.Info("Submitted transaction", "fullhash", tx.Hash().Hex(), "recipient", tx.To()) - } - - return tx.Hash().Hex(), nil + return submitTransaction(ctx, s.b, tx) } // Sign calculates an ECDSA signature for: From 2ee885958b49f8a58c0a7fae8bc62f4561f8ab3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 26 Sep 2017 16:54:49 +0300 Subject: [PATCH 178/272] p2p: snappy encoding for devp2p (version bump to 5) (#15106) * p2p: snappy encoding for devp2p (version bump to 5) * p2p: remove lazy decompression, enforce 16MB limit --- p2p/peer.go | 4 +++- p2p/rlpx.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/p2p/peer.go b/p2p/peer.go index ebf7490c68..1d2b726e8b 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -32,10 +32,12 @@ import ( ) const ( - baseProtocolVersion = 4 + baseProtocolVersion = 5 baseProtocolLength = uint64(16) baseProtocolMaxMsgSize = 2 * 1024 + snappyProtocolVersion = 5 + pingInterval = 15 * time.Second ) diff --git a/p2p/rlpx.go b/p2p/rlpx.go index b2775cacdc..24037ecc13 100644 --- a/p2p/rlpx.go +++ b/p2p/rlpx.go @@ -29,6 +29,7 @@ import ( "fmt" "hash" "io" + "io/ioutil" mrand "math/rand" "net" "sync" @@ -40,6 +41,7 @@ import ( "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/rlp" + "github.com/golang/snappy" ) const ( @@ -68,6 +70,10 @@ const ( discWriteTimeout = 1 * time.Second ) +// errPlainMessageTooLarge is returned if a decompressed message length exceeds +// the allowed 24 bits (i.e. length >= 16MB). +var errPlainMessageTooLarge = errors.New("message length >= 16MB") + // rlpx is the transport protocol used by actual (non-test) connections. // It wraps the frame encoder with locks and read/write deadlines. type rlpx struct { @@ -127,6 +133,9 @@ func (t *rlpx) doProtoHandshake(our *protoHandshake) (their *protoHandshake, err if err := <-werr; err != nil { return nil, fmt.Errorf("write error: %v", err) } + // If the protocol version supports Snappy encoding, upgrade immediately + t.rw.snappy = their.Version >= snappyProtocolVersion + return their, nil } @@ -556,6 +565,8 @@ type rlpxFrameRW struct { macCipher cipher.Block egressMAC hash.Hash ingressMAC hash.Hash + + snappy bool } func newRLPXFrameRW(conn io.ReadWriter, s secrets) *rlpxFrameRW { @@ -583,6 +594,17 @@ func newRLPXFrameRW(conn io.ReadWriter, s secrets) *rlpxFrameRW { func (rw *rlpxFrameRW) WriteMsg(msg Msg) error { ptype, _ := rlp.EncodeToBytes(msg.Code) + // if snappy is enabled, compress message now + if rw.snappy { + if msg.Size > maxUint24 { + return errPlainMessageTooLarge + } + payload, _ := ioutil.ReadAll(msg.Payload) + payload = snappy.Encode(nil, payload) + + msg.Payload = bytes.NewReader(payload) + msg.Size = uint32(len(payload)) + } // write header headbuf := make([]byte, 32) fsize := uint32(len(ptype)) + msg.Size @@ -668,6 +690,26 @@ func (rw *rlpxFrameRW) ReadMsg() (msg Msg, err error) { } msg.Size = uint32(content.Len()) msg.Payload = content + + // if snappy is enabled, verify and decompress message + if rw.snappy { + payload, err := ioutil.ReadAll(msg.Payload) + if err != nil { + return msg, err + } + size, err := snappy.DecodedLen(payload) + if err != nil { + return msg, err + } + if size > int(maxUint24) { + return msg, errPlainMessageTooLarge + } + payload, err = snappy.Decode(nil, payload) + if err != nil { + return msg, err + } + msg.Size, msg.Payload = uint32(size), bytes.NewReader(payload) + } return msg, nil } From f3c9585f2ec84efa2dcce5c56a69440697ff2f36 Mon Sep 17 00:00:00 2001 From: ayeowch Date: Wed, 27 Sep 2017 10:28:26 +1000 Subject: [PATCH 179/272] cmd/geth: fix --password typo --- cmd/utils/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 5ab6047e83..a62b4940ba 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -305,7 +305,7 @@ var ( } PasswordFileFlag = cli.StringFlag{ Name: "password", - Usage: "Password file to use for non-inteactive password input", + Usage: "Password file to use for non-interactive password input", Value: "", } From 2ab2a9f13116748ca343892f851e3632861c994e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 27 Sep 2017 13:14:52 +0300 Subject: [PATCH 180/272] core/bloombits, eth/filters: handle null topics (#15195) When implementing the new bloombits based filter, I've accidentally broke null topics by removing the special casing of common.Hash{} filter rules, which acted as the wildcard topic until now. This PR fixes the regression, but instead of using the magic hash common.Hash{} as the null wildcard, the PR reworks the code to handle nil topics during parsing, converting a JSON null into nil []common.Hash topic. --- core/bloombits/matcher.go | 16 ++++++++++++++-- core/bloombits/matcher_test.go | 28 ++++++++++++++++++++++++++++ eth/filters/api.go | 9 ++++++--- eth/filters/api_test.go | 24 ++++++------------------ eth/filters/filter.go | 22 +++++++--------------- eth/filters/filter_system.go | 5 ----- eth/filters/filter_system_test.go | 12 +++++++----- 7 files changed, 68 insertions(+), 48 deletions(-) diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index f3ed405a61..e33de018a5 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -80,7 +80,8 @@ type Matcher struct { } // NewMatcher creates a new pipeline for retrieving bloom bit streams and doing -// address and topic filtering on them. +// address and topic filtering on them. Setting a filter component to `nil` is +// allowed and will result in that filter rule being skipped (OR 0x11...1). func NewMatcher(sectionSize uint64, filters [][][]byte) *Matcher { // Create the matcher instance m := &Matcher{ @@ -95,11 +96,22 @@ func NewMatcher(sectionSize uint64, filters [][][]byte) *Matcher { m.filters = nil for _, filter := range filters { + // Gather the bit indexes of the filter rule, special casing the nil filter + if len(filter) == 0 { + continue + } bloomBits := make([]bloomIndexes, len(filter)) for i, clause := range filter { + if clause == nil { + bloomBits = nil + break + } bloomBits[i] = calcBloomIndexes(clause) } - m.filters = append(m.filters, bloomBits) + // Accumulate the filter rules if no nil rule was within + if bloomBits != nil { + m.filters = append(m.filters, bloomBits) + } } // For every bit, create a scheduler to load/download the bit vectors for _, bloomIndexLists := range m.filters { diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index f0198c4e38..f95d0ea9e0 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -21,10 +21,38 @@ import ( "sync/atomic" "testing" "time" + + "github.com/ethereum/go-ethereum/common" ) const testSectionSize = 4096 +// Tests that wildcard filter rules (nil) can be specified and are handled well. +func TestMatcherWildcards(t *testing.T) { + matcher := NewMatcher(testSectionSize, [][][]byte{ + [][]byte{common.Address{}.Bytes(), common.Address{0x01}.Bytes()}, // Default address is not a wildcard + [][]byte{common.Hash{}.Bytes(), common.Hash{0x01}.Bytes()}, // Default hash is not a wildcard + [][]byte{common.Hash{0x01}.Bytes()}, // Plain rule, sanity check + [][]byte{common.Hash{0x01}.Bytes(), nil}, // Wildcard suffix, drop rule + [][]byte{nil, common.Hash{0x01}.Bytes()}, // Wildcard prefix, drop rule + [][]byte{nil, nil}, // Wildcard combo, drop rule + [][]byte{}, // Inited wildcard rule, drop rule + nil, // Proper wildcard rule, drop rule + }) + if len(matcher.filters) != 3 { + t.Fatalf("filter system size mismatch: have %d, want %d", len(matcher.filters), 3) + } + if len(matcher.filters[0]) != 2 { + t.Fatalf("address clause size mismatch: have %d, want %d", len(matcher.filters[0]), 2) + } + if len(matcher.filters[1]) != 2 { + t.Fatalf("combo topic clause size mismatch: have %d, want %d", len(matcher.filters[1]), 2) + } + if len(matcher.filters[2]) != 1 { + t.Fatalf("singletone topic clause size mismatch: have %d, want %d", len(matcher.filters[2]), 1) + } +} + // Tests the matcher pipeline on a single continuous workflow without interrupts. func TestMatcherContinuous(t *testing.T) { testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 100000, false, 75) diff --git a/eth/filters/api.go b/eth/filters/api.go index 6e1d48adb6..03c1d6afc8 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -498,7 +498,6 @@ func (args *FilterCriteria) UnmarshalJSON(data []byte) error { switch topic := t.(type) { case nil: // ignore topic when matching logs - args.Topics[i] = []common.Hash{{}} case string: // match specific topic @@ -507,12 +506,16 @@ func (args *FilterCriteria) UnmarshalJSON(data []byte) error { return err } args.Topics[i] = []common.Hash{top} + case []interface{}: // or case e.g. [null, "topic0", "topic1"] for _, rawTopic := range topic { if rawTopic == nil { - args.Topics[i] = append(args.Topics[i], common.Hash{}) - } else if topic, ok := rawTopic.(string); ok { + // null component, match all + args.Topics[i] = nil + break + } + if topic, ok := rawTopic.(string); ok { parsed, err := decodeTopic(topic) if err != nil { return err diff --git a/eth/filters/api_test.go b/eth/filters/api_test.go index 068a5ea243..4ae37f9779 100644 --- a/eth/filters/api_test.go +++ b/eth/filters/api_test.go @@ -34,7 +34,6 @@ func TestUnmarshalJSONNewFilterArgs(t *testing.T) { topic0 = common.HexToHash("3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1ca") topic1 = common.HexToHash("9084a792d2f8b16a62b882fd56f7860c07bf5fa91dd8a2ae7e809e5180fef0b3") topic2 = common.HexToHash("6ccae1c4af4152f460ff510e573399795dfab5dcf1fa60d1f33ac8fdc1e480ce") - nullTopic = common.Hash{} ) // default values @@ -150,11 +149,8 @@ func TestUnmarshalJSONNewFilterArgs(t *testing.T) { if test6.Topics[0][0] != topic0 { t.Fatalf("got %x, expected %x", test6.Topics[0][0], topic0) } - if len(test6.Topics[1]) != 1 { - t.Fatalf("expected 1 topic, got %d", len(test6.Topics[1])) - } - if test6.Topics[1][0] != nullTopic { - t.Fatalf("got %x, expected empty hash", test6.Topics[1][0]) + if len(test6.Topics[1]) != 0 { + t.Fatalf("expected 0 topic, got %d", len(test6.Topics[1])) } if len(test6.Topics[2]) != 1 { t.Fatalf("expected 1 topic, got %d", len(test6.Topics[2])) @@ -180,18 +176,10 @@ func TestUnmarshalJSONNewFilterArgs(t *testing.T) { topic0, topic1, test7.Topics[0][0], test7.Topics[0][1], ) } - if len(test7.Topics[1]) != 1 { - t.Fatalf("expected 1 topic, got %d topics", len(test7.Topics[1])) + if len(test7.Topics[1]) != 0 { + t.Fatalf("expected 0 topic, got %d topics", len(test7.Topics[1])) } - if test7.Topics[1][0] != nullTopic { - t.Fatalf("expected empty hash, got %x", test7.Topics[1][0]) - } - if len(test7.Topics[2]) != 2 { - t.Fatalf("expected 2 topics, got %d topics", len(test7.Topics[2])) - } - if test7.Topics[2][0] != topic2 || test7.Topics[2][1] != nullTopic { - t.Fatalf("invalid topics expected [%x,%x], got [%x,%x]", - topic2, nullTopic, test7.Topics[2][0], test7.Topics[2][1], - ) + if len(test7.Topics[2]) != 0 { + t.Fatalf("expected 0 topics, got %d topics", len(test7.Topics[2])) } } diff --git a/eth/filters/filter.go b/eth/filters/filter.go index 4f6c30058e..026cbf95ca 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -60,7 +60,9 @@ type Filter struct { // New creates a new filter which uses a bloom filter on blocks to figure out whether // a particular block is interesting or not. func New(backend Backend, begin, end int64, addresses []common.Address, topics [][]common.Hash) *Filter { - // Flatten the address and topic filter clauses into a single filter system + // Flatten the address and topic filter clauses into a single bloombits filter + // system. Since the bloombits are not positional, nil topics are permitted, + // which get flattened into a nil byte slice. var filters [][][]byte if len(addresses) > 0 { filter := make([][]byte, len(addresses)) @@ -235,32 +237,24 @@ Logs: if len(addresses) > 0 && !includes(addresses, log.Address) { continue } - - logTopics := make([]common.Hash, len(topics)) - copy(logTopics, log.Topics) - // If the to filtered topics is greater than the amount of topics in logs, skip. if len(topics) > len(log.Topics) { continue Logs } - for i, topics := range topics { - var match bool + match := len(topics) == 0 // empty rule set == wildcard for _, topic := range topics { - // common.Hash{} is a match all (wildcard) - if (topic == common.Hash{}) || log.Topics[i] == topic { + if log.Topics[i] == topic { match = true break } } - if !match { continue Logs } } ret = append(ret, log) } - return ret } @@ -273,16 +267,15 @@ func bloomFilter(bloom types.Bloom, addresses []common.Address, topics [][]commo break } } - if !included { return false } } for _, sub := range topics { - var included bool + included := len(sub) == 0 // empty rule set == wildcard for _, topic := range sub { - if (topic == common.Hash{}) || types.BloomLookup(bloom, topic) { + if types.BloomLookup(bloom, topic) { included = true break } @@ -291,6 +284,5 @@ func bloomFilter(bloom types.Bloom, addresses []common.Address, topics [][]commo return false } } - return true } diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go index 00ade0ffb2..e08cedb274 100644 --- a/eth/filters/filter_system.go +++ b/eth/filters/filter_system.go @@ -212,7 +212,6 @@ func (es *EventSystem) subscribeMinedPendingLogs(crit FilterCriteria, logs chan installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -230,7 +229,6 @@ func (es *EventSystem) subscribeLogs(crit FilterCriteria, logs chan []*types.Log installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -248,7 +246,6 @@ func (es *EventSystem) subscribePendingLogs(crit FilterCriteria, logs chan []*ty installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -265,7 +262,6 @@ func (es *EventSystem) SubscribeNewHeads(headers chan *types.Header) *Subscripti installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -282,7 +278,6 @@ func (es *EventSystem) SubscribePendingTxEvents(hashes chan common.Hash) *Subscr installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index 664ce07a5f..bc3511f23a 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -363,7 +363,7 @@ func TestLogFilter(t *testing.T) { // match all 0: {FilterCriteria{}, allLogs, ""}, // match none due to no matching addresses - 1: {FilterCriteria{Addresses: []common.Address{{}, notUsedAddress}, Topics: [][]common.Hash{allLogs[0].Topics}}, []*types.Log{}, ""}, + 1: {FilterCriteria{Addresses: []common.Address{{}, notUsedAddress}, Topics: [][]common.Hash{nil}}, []*types.Log{}, ""}, // match logs based on addresses, ignore topics 2: {FilterCriteria{Addresses: []common.Address{firstAddr}}, allLogs[:2], ""}, // match none due to no matching topics (match with address) @@ -384,6 +384,8 @@ func TestLogFilter(t *testing.T) { 10: {FilterCriteria{FromBlock: big.NewInt(1), ToBlock: big.NewInt(2), Topics: [][]common.Hash{{secondTopic}}}, allLogs[3:4], ""}, // all "mined" and pending logs with topic firstTopic 11: {FilterCriteria{FromBlock: big.NewInt(rpc.LatestBlockNumber.Int64()), ToBlock: big.NewInt(rpc.PendingBlockNumber.Int64()), Topics: [][]common.Hash{{firstTopic}}}, expectedCase11, ""}, + // match all logs due to wildcard topic + 12: {FilterCriteria{Topics: [][]common.Hash{nil}}, allLogs[1:], ""}, } ) @@ -459,7 +461,7 @@ func TestPendingLogsSubscription(t *testing.T) { firstTopic = common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111") secondTopic = common.HexToHash("0x2222222222222222222222222222222222222222222222222222222222222222") thirdTopic = common.HexToHash("0x3333333333333333333333333333333333333333333333333333333333333333") - forthTopic = common.HexToHash("0x4444444444444444444444444444444444444444444444444444444444444444") + fourthTopic = common.HexToHash("0x4444444444444444444444444444444444444444444444444444444444444444") notUsedTopic = common.HexToHash("0x9999999999999999999999999999999999999999999999999999999999999999") allLogs = []core.PendingLogsEvent{ @@ -471,7 +473,7 @@ func TestPendingLogsSubscription(t *testing.T) { {Logs: []*types.Log{ {Address: thirdAddress, Topics: []common.Hash{firstTopic}, BlockNumber: 5}, {Address: thirdAddress, Topics: []common.Hash{thirdTopic}, BlockNumber: 5}, - {Address: thirdAddress, Topics: []common.Hash{forthTopic}, BlockNumber: 5}, + {Address: thirdAddress, Topics: []common.Hash{fourthTopic}, BlockNumber: 5}, {Address: firstAddr, Topics: []common.Hash{firstTopic}, BlockNumber: 5}, }}, } @@ -493,7 +495,7 @@ func TestPendingLogsSubscription(t *testing.T) { // match all {FilterCriteria{}, convertLogs(allLogs), nil, nil}, // match none due to no matching addresses - {FilterCriteria{Addresses: []common.Address{{}, notUsedAddress}, Topics: [][]common.Hash{{}}}, []*types.Log{}, nil, nil}, + {FilterCriteria{Addresses: []common.Address{{}, notUsedAddress}, Topics: [][]common.Hash{nil}}, []*types.Log{}, nil, nil}, // match logs based on addresses, ignore topics {FilterCriteria{Addresses: []common.Address{firstAddr}}, append(convertLogs(allLogs[:2]), allLogs[5].Logs[3]), nil, nil}, // match none due to no matching topics (match with address) @@ -505,7 +507,7 @@ func TestPendingLogsSubscription(t *testing.T) { // block numbers are ignored for filters created with New***Filter, these return all logs that match the given criteria when the state changes {FilterCriteria{Addresses: []common.Address{firstAddr}, FromBlock: big.NewInt(2), ToBlock: big.NewInt(3)}, append(convertLogs(allLogs[:2]), allLogs[5].Logs[3]), nil, nil}, // multiple pending logs, should match only 2 topics from the logs in block 5 - {FilterCriteria{Addresses: []common.Address{thirdAddress}, Topics: [][]common.Hash{{firstTopic, forthTopic}}}, []*types.Log{allLogs[5].Logs[0], allLogs[5].Logs[2]}, nil, nil}, + {FilterCriteria{Addresses: []common.Address{thirdAddress}, Topics: [][]common.Hash{{firstTopic, fourthTopic}}}, []*types.Log{allLogs[5].Logs[0], allLogs[5].Logs[2]}, nil, nil}, } ) From a660685746db17a41cd67b05c614cdb29e49340c Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Wed, 27 Sep 2017 15:30:41 +0200 Subject: [PATCH 181/272] tests: add ethash difficulty tests (#15191) --- tests/difficulty_test.go | 87 +++++++++++++++++++++++++++++++++++ tests/difficulty_test_util.go | 70 ++++++++++++++++++++++++++++ tests/gen_difficultytest.go | 66 ++++++++++++++++++++++++++ tests/init_test.go | 1 + tests/state_test.go | 18 ++++---- tests/testdata | 2 +- 6 files changed, 235 insertions(+), 9 deletions(-) create mode 100644 tests/difficulty_test.go create mode 100644 tests/difficulty_test_util.go create mode 100644 tests/gen_difficultytest.go diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go new file mode 100644 index 0000000000..a449b1cfa6 --- /dev/null +++ b/tests/difficulty_test.go @@ -0,0 +1,87 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . +// + +package tests + +import ( + "testing" + + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" +) + +var ( + mainnetChainConfig = params.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(1150000), + DAOForkBlock: big.NewInt(1920000), + DAOForkSupport: true, + EIP150Block: big.NewInt(2463000), + EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), + EIP155Block: big.NewInt(2675000), + EIP158Block: big.NewInt(2675000), + ByzantiumBlock: big.NewInt(4370000), + } +) + +func TestDifficulty(t *testing.T) { + t.Parallel() + + dt := new(testMatcher) + // Not difficulty-tests + dt.skipLoad("hexencodetest.*") + dt.skipLoad("crypto.*") + dt.skipLoad("blockgenesistest\\.json") + dt.skipLoad("genesishashestest\\.json") + dt.skipLoad("keyaddrtest\\.json") + dt.skipLoad("txtest\\.json") + + // files are 2 years old, contains strange values + dt.skipLoad("difficultyCustomHomestead\\.json") + dt.skipLoad("difficultyMorden\\.json") + dt.skipLoad("difficultyOlimpic\\.json") + + dt.config("Ropsten", *params.TestnetChainConfig) + dt.config("Morden", *params.TestnetChainConfig) + dt.config("Frontier", params.ChainConfig{}) + + dt.config("Homestead", params.ChainConfig{ + HomesteadBlock: big.NewInt(0), + }) + + dt.config("Byzantium", params.ChainConfig{ + ByzantiumBlock: big.NewInt(0), + }) + + dt.config("Frontier", *params.TestnetChainConfig) + dt.config("MainNetwork", mainnetChainConfig) + dt.config("CustomMainNetwork", mainnetChainConfig) + dt.config("difficulty.json", mainnetChainConfig) + + dt.walk(t, difficultyTestDir, func(t *testing.T, name string, test *DifficultyTest) { + cfg := dt.findConfig(name) + if test.ParentDifficulty.Cmp(params.MinimumDifficulty) < 0 { + t.Skip("difficulty below minimum") + return + } + if err := dt.checkFailure(t, name, test.Run(cfg)); err != nil { + t.Error(err) + } + }) +} diff --git a/tests/difficulty_test_util.go b/tests/difficulty_test_util.go new file mode 100644 index 0000000000..7541477933 --- /dev/null +++ b/tests/difficulty_test_util.go @@ -0,0 +1,70 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . +// + +package tests + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +//go:generate gencodec -type DifficultyTest -field-override difficultyTestMarshaling -out gen_difficultytest.go + +type DifficultyTest struct { + ParentTimestamp *big.Int `json:"parentTimestamp"` + ParentDifficulty *big.Int `json:"parentDifficulty"` + UncleHash common.Hash `json:"parentUncles"` + CurrentTimestamp *big.Int `json:"currentTimestamp"` + CurrentBlockNumber uint64 `json:"currentBlockNumber"` + CurrentDifficulty *big.Int `json:"currentDifficulty"` +} + +type difficultyTestMarshaling struct { + ParentTimestamp *math.HexOrDecimal256 + ParentDifficulty *math.HexOrDecimal256 + CurrentTimestamp *math.HexOrDecimal256 + CurrentDifficulty *math.HexOrDecimal256 + UncleHash common.Hash + CurrentBlockNumber math.HexOrDecimal64 +} + +func (test *DifficultyTest) Run(config *params.ChainConfig) error { + parentNumber := big.NewInt(int64(test.CurrentBlockNumber - 1)) + parent := &types.Header{ + Difficulty: test.ParentDifficulty, + Time: test.ParentTimestamp, + Number: parentNumber, + UncleHash: test.UncleHash, + } + + actual := ethash.CalcDifficulty(config, test.CurrentTimestamp.Uint64(), parent) + exp := test.CurrentDifficulty + + if actual.Cmp(exp) != 0 { + return fmt.Errorf("parent[time %v diff %v unclehash:%x] child[time %v number %v] diff %v != expected %v", + test.ParentTimestamp, test.ParentDifficulty, test.UncleHash, + test.CurrentTimestamp, test.CurrentBlockNumber, actual, exp) + } + return nil + +} diff --git a/tests/gen_difficultytest.go b/tests/gen_difficultytest.go new file mode 100644 index 0000000000..88f36ce999 --- /dev/null +++ b/tests/gen_difficultytest.go @@ -0,0 +1,66 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package tests + +import ( + "encoding/json" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" +) + +var _ = (*difficultyTestMarshaling)(nil) + +func (d DifficultyTest) MarshalJSON() ([]byte, error) { + type DifficultyTest struct { + ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` + ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` + UncleHash common.Hash `json:"parentUncles"` + CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` + CurrentBlockNumber math.HexOrDecimal64 `json:"currentBlockNumber"` + CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` + } + var enc DifficultyTest + enc.ParentTimestamp = (*math.HexOrDecimal256)(d.ParentTimestamp) + enc.ParentDifficulty = (*math.HexOrDecimal256)(d.ParentDifficulty) + enc.UncleHash = d.UncleHash + enc.CurrentTimestamp = (*math.HexOrDecimal256)(d.CurrentTimestamp) + enc.CurrentBlockNumber = math.HexOrDecimal64(d.CurrentBlockNumber) + enc.CurrentDifficulty = (*math.HexOrDecimal256)(d.CurrentDifficulty) + return json.Marshal(&enc) +} + +func (d *DifficultyTest) UnmarshalJSON(input []byte) error { + type DifficultyTest struct { + ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` + ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` + UncleHash *common.Hash `json:"parentUncles"` + CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` + CurrentBlockNumber *math.HexOrDecimal64 `json:"currentBlockNumber"` + CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` + } + var dec DifficultyTest + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.ParentTimestamp != nil { + d.ParentTimestamp = (*big.Int)(dec.ParentTimestamp) + } + if dec.ParentDifficulty != nil { + d.ParentDifficulty = (*big.Int)(dec.ParentDifficulty) + } + if dec.UncleHash != nil { + d.UncleHash = *dec.UncleHash + } + if dec.CurrentTimestamp != nil { + d.CurrentTimestamp = (*big.Int)(dec.CurrentTimestamp) + } + if dec.CurrentBlockNumber != nil { + d.CurrentBlockNumber = uint64(*dec.CurrentBlockNumber) + } + if dec.CurrentDifficulty != nil { + d.CurrentDifficulty = (*big.Int)(dec.CurrentDifficulty) + } + return nil +} diff --git a/tests/init_test.go b/tests/init_test.go index 0adbb533dd..ebb0d32c34 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -39,6 +39,7 @@ var ( transactionTestDir = filepath.Join(baseDir, "TransactionTests") vmTestDir = filepath.Join(baseDir, "VMTests") rlpTestDir = filepath.Join(baseDir, "RLPTests") + difficultyTestDir = filepath.Join(baseDir, "BasicTests") ) func readJson(reader io.Reader, value interface{}) error { diff --git a/tests/state_test.go b/tests/state_test.go index 9a7430fbeb..5a67b290db 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -39,14 +39,16 @@ func TestState(t *testing.T) { st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test") st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/Byzantium`, "bug in test") - st.fails( `^stRandom/randomStatetest645\.json/EIP150/.*`, "known bug #15119") - st.fails( `^stRandom/randomStatetest645\.json/Frontier/.*`, "known bug #15119") - st.fails( `^stRandom/randomStatetest645\.json/Homestead/.*`, "known bug #15119") - st.fails( `^stRandom/randomStatetest644\.json/EIP150/.*`, "known bug #15119") - st.fails( `^stRandom/randomStatetest644\.json/Frontier/.*`, "known bug #15119") - st.fails( `^stRandom/randomStatetest644\.json/Homestead/.*`, "known bug #15119") - - + st.fails(`^stRandom/randomStatetest645\.json/EIP150/.*`, "known bug #15119") + st.fails(`^stRandom/randomStatetest645\.json/Frontier/.*`, "known bug #15119") + st.fails(`^stRandom/randomStatetest645\.json/Homestead/.*`, "known bug #15119") + st.fails(`^stRandom/randomStatetest644\.json/EIP150/.*`, "known bug #15119") + st.fails(`^stRandom/randomStatetest644\.json/Frontier/.*`, "known bug #15119") + st.fails(`^stRandom/randomStatetest644\.json/Homestead/.*`, "known bug #15119") + st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/EIP158/2`, "known bug ") + st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/EIP158/3`, "known bug ") + st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/Byzantium/2`, "known bug ") + st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/Byzantium/3`, "known bug ") st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { for _, subtest := range test.Subtests() { subtest := subtest diff --git a/tests/testdata b/tests/testdata index ca41e90635..37f555fbc0 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit ca41e906351209481bce3a1b35501f25a79023c5 +Subproject commit 37f555fbc091fbf761aa6f02227132fb31f0681c From d78ad226c26c84635c60fad233de9e6e438a5599 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sun, 1 Oct 2017 11:03:28 +0200 Subject: [PATCH 182/272] ethclient, mobile: add TransactionSender (#15127) * core/types: make Signer derive address instead of public key There are two reasons to do this now: The upcoming ethclient signer doesn't know the public key, just the address. EIP 208 will introduce a new signer which derives the 'entry point' address for transactions with zero signature. The entry point has no public key. Other changes to the interface ease the path make to moving signature crypto out of core/types later. * ethclient, mobile: add TransactionSender The new method can get the right signer without any crypto, and without knowledge of the signature scheme that was used when the transaction was included. --- core/types/transaction.go | 14 +-- core/types/transaction_signing.go | 174 ++++++++++-------------------- core/types/transaction_test.go | 5 +- ethclient/ethclient.go | 85 +++++++++++---- ethclient/signer.go | 59 ++++++++++ mobile/ethclient.go | 7 ++ mobile/types.go | 9 +- 7 files changed, 204 insertions(+), 149 deletions(-) create mode 100644 ethclient/signer.go diff --git a/core/types/transaction.go b/core/types/transaction.go index 7f54860fc0..a46521236c 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -209,12 +209,6 @@ func (tx *Transaction) Hash() common.Hash { return v } -// SigHash returns the hash to be signed by the sender. -// It does not uniquely identify the transaction. -func (tx *Transaction) SigHash(signer Signer) common.Hash { - return signer.Hash(tx) -} - func (tx *Transaction) Size() common.StorageSize { if size := tx.size.Load(); size != nil { return size.(common.StorageSize) @@ -249,7 +243,13 @@ func (tx *Transaction) AsMessage(s Signer) (Message, error) { // WithSignature returns a new transaction with the given signature. // This signature needs to be formatted as described in the yellow paper (v+27). func (tx *Transaction) WithSignature(signer Signer, sig []byte) (*Transaction, error) { - return signer.WithSignature(tx, sig) + r, s, v, err := signer.SignatureValues(tx, sig) + if err != nil { + return nil, err + } + cpy := &Transaction{data: tx.data} + cpy.data.R, cpy.data.S, cpy.data.V = r, s, v + return cpy, nil } // Cost returns amount + gasprice * gaslimit. diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index ba4f2aa03a..dfc84fdac7 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -29,9 +29,6 @@ import ( var ( ErrInvalidChainId = errors.New("invalid chain id for signer") - - errAbstractSigner = errors.New("abstract signer") - abstractSignerAddress = common.HexToAddress("ffffffffffffffffffffffffffffffffffffffff") ) // sigCache is used to cache the derived sender and contains @@ -62,12 +59,9 @@ func SignTx(tx *Transaction, s Signer, prv *ecdsa.PrivateKey) (*Transaction, err if err != nil { return nil, err } - return s.WithSignature(tx, sig) + return tx.WithSignature(s, sig) } -// Sender derives the sender from the tx using the signer derivation -// functions. - // Sender returns the address derived from the signature (V, R, S) using secp256k1 // elliptic curve and an error if it failed deriving or upon an incorrect // signature. @@ -86,33 +80,30 @@ func Sender(signer Signer, tx *Transaction) (common.Address, error) { } } - pubkey, err := signer.PublicKey(tx) + addr, err := signer.Sender(tx) if err != nil { return common.Address{}, err } - var addr common.Address - copy(addr[:], crypto.Keccak256(pubkey[1:])[12:]) tx.from.Store(sigCache{signer: signer, from: addr}) return addr, nil } +// Signer encapsulates transaction signature handling. Note that this interface is not a +// stable API and may change at any time to accommodate new protocol rules. type Signer interface { - // Hash returns the rlp encoded hash for signatures + // Sender returns the sender address of the transaction. + Sender(tx *Transaction) (common.Address, error) + // SignatureValues returns the raw R, S, V values corresponding to the + // given signature. + SignatureValues(tx *Transaction, sig []byte) (r, s, v *big.Int, err error) + // Hash returns the hash to be signed. Hash(tx *Transaction) common.Hash - // PubilcKey returns the public key derived from the signature - PublicKey(tx *Transaction) ([]byte, error) - // WithSignature returns a copy of the transaction with the given signature. - // The signature must be encoded in [R || S || V] format where V is 0 or 1. - WithSignature(tx *Transaction, sig []byte) (*Transaction, error) - // Checks for equality on the signers + // Equal returns true if the given signer is the same as the receiver. Equal(Signer) bool } -// EIP155Transaction implements TransactionInterface using the -// EIP155 rules +// EIP155Transaction implements Signer using the EIP155 rules. type EIP155Signer struct { - HomesteadSigner - chainId, chainIdMul *big.Int } @@ -131,55 +122,32 @@ func (s EIP155Signer) Equal(s2 Signer) bool { return ok && eip155.chainId.Cmp(s.chainId) == 0 } -func (s EIP155Signer) PublicKey(tx *Transaction) ([]byte, error) { - // if the transaction is not protected fall back to homestead signer +var big8 = big.NewInt(8) + +func (s EIP155Signer) Sender(tx *Transaction) (common.Address, error) { if !tx.Protected() { - return (HomesteadSigner{}).PublicKey(tx) + return HomesteadSigner{}.Sender(tx) } - if tx.ChainId().Cmp(s.chainId) != 0 { - return nil, ErrInvalidChainId + return common.Address{}, ErrInvalidChainId } - - V := byte(new(big.Int).Sub(tx.data.V, s.chainIdMul).Uint64() - 35) - if !crypto.ValidateSignatureValues(V, tx.data.R, tx.data.S, true) { - return nil, ErrInvalidSig - } - // encode the signature in uncompressed format - R, S := tx.data.R.Bytes(), tx.data.S.Bytes() - sig := make([]byte, 65) - copy(sig[32-len(R):32], R) - copy(sig[64-len(S):64], S) - sig[64] = V - - // recover the public key from the signature - hash := s.Hash(tx) - pub, err := crypto.Ecrecover(hash[:], sig) - if err != nil { - return nil, err - } - if len(pub) == 0 || pub[0] != 4 { - return nil, errors.New("invalid public key") - } - return pub, nil + V := new(big.Int).Sub(tx.data.V, s.chainIdMul) + V.Sub(V, big8) + return recoverPlain(s.Hash(tx), tx.data.R, tx.data.S, V, true) } // WithSignature returns a new transaction with the given signature. This signature // needs to be in the [R || S || V] format where V is 0 or 1. -func (s EIP155Signer) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { - if len(sig) != 65 { - panic(fmt.Sprintf("wrong size for signature: got %d, want 65", len(sig))) +func (s EIP155Signer) SignatureValues(tx *Transaction, sig []byte) (R, S, V *big.Int, err error) { + R, S, V, err = HomesteadSigner{}.SignatureValues(tx, sig) + if err != nil { + return nil, nil, nil, err } - - cpy := &Transaction{data: tx.data} - cpy.data.R = new(big.Int).SetBytes(sig[:32]) - cpy.data.S = new(big.Int).SetBytes(sig[32:64]) - cpy.data.V = new(big.Int).SetBytes([]byte{sig[64]}) if s.chainId.Sign() != 0 { - cpy.data.V = big.NewInt(int64(sig[64] + 35)) - cpy.data.V.Add(cpy.data.V, s.chainIdMul) + V = big.NewInt(int64(sig[64] + 35)) + V.Add(V, s.chainIdMul) } - return cpy, nil + return R, S, V, nil } // Hash returns the hash to be signed by the sender. @@ -205,44 +173,14 @@ func (s HomesteadSigner) Equal(s2 Signer) bool { return ok } -// WithSignature returns a new transaction with the given signature. This signature +// SignatureValues returns signature values. This signature // needs to be in the [R || S || V] format where V is 0 or 1. -func (hs HomesteadSigner) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { - if len(sig) != 65 { - panic(fmt.Sprintf("wrong size for snature: got %d, want 65", len(sig))) - } - cpy := &Transaction{data: tx.data} - cpy.data.R = new(big.Int).SetBytes(sig[:32]) - cpy.data.S = new(big.Int).SetBytes(sig[32:64]) - cpy.data.V = new(big.Int).SetBytes([]byte{sig[64] + 27}) - return cpy, nil +func (hs HomesteadSigner) SignatureValues(tx *Transaction, sig []byte) (r, s, v *big.Int, err error) { + return hs.FrontierSigner.SignatureValues(tx, sig) } -func (hs HomesteadSigner) PublicKey(tx *Transaction) ([]byte, error) { - if tx.data.V.BitLen() > 8 { - return nil, ErrInvalidSig - } - V := byte(tx.data.V.Uint64() - 27) - if !crypto.ValidateSignatureValues(V, tx.data.R, tx.data.S, true) { - return nil, ErrInvalidSig - } - // encode the snature in uncompressed format - r, s := tx.data.R.Bytes(), tx.data.S.Bytes() - sig := make([]byte, 65) - copy(sig[32-len(r):32], r) - copy(sig[64-len(s):64], s) - sig[64] = V - - // recover the public key from the snature - hash := hs.Hash(tx) - pub, err := crypto.Ecrecover(hash[:], sig) - if err != nil { - return nil, err - } - if len(pub) == 0 || pub[0] != 4 { - return nil, errors.New("invalid public key") - } - return pub, nil +func (hs HomesteadSigner) Sender(tx *Transaction) (common.Address, error) { + return recoverPlain(hs.Hash(tx), tx.data.R, tx.data.S, tx.data.V, true) } type FrontierSigner struct{} @@ -252,20 +190,19 @@ func (s FrontierSigner) Equal(s2 Signer) bool { return ok } -// WithSignature returns a new transaction with the given signature. This signature +// SignatureValues returns signature values. This signature // needs to be in the [R || S || V] format where V is 0 or 1. -func (fs FrontierSigner) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { +func (fs FrontierSigner) SignatureValues(tx *Transaction, sig []byte) (r, s, v *big.Int, err error) { if len(sig) != 65 { - panic(fmt.Sprintf("wrong size for snature: got %d, want 65", len(sig))) + panic(fmt.Sprintf("wrong size for signature: got %d, want 65", len(sig))) } - cpy := &Transaction{data: tx.data} - cpy.data.R = new(big.Int).SetBytes(sig[:32]) - cpy.data.S = new(big.Int).SetBytes(sig[32:64]) - cpy.data.V = new(big.Int).SetBytes([]byte{sig[64] + 27}) - return cpy, nil + r = new(big.Int).SetBytes(sig[:32]) + s = new(big.Int).SetBytes(sig[32:64]) + v = new(big.Int).SetBytes([]byte{sig[64] + 27}) + return r, s, v, nil } -// Hash returns the hash to be sned by the sender. +// Hash returns the hash to be signed by the sender. // It does not uniquely identify the transaction. func (fs FrontierSigner) Hash(tx *Transaction) common.Hash { return rlpHash([]interface{}{ @@ -278,32 +215,35 @@ func (fs FrontierSigner) Hash(tx *Transaction) common.Hash { }) } -func (fs FrontierSigner) PublicKey(tx *Transaction) ([]byte, error) { - if tx.data.V.BitLen() > 8 { - return nil, ErrInvalidSig - } +func (fs FrontierSigner) Sender(tx *Transaction) (common.Address, error) { + return recoverPlain(fs.Hash(tx), tx.data.R, tx.data.S, tx.data.V, false) +} - V := byte(tx.data.V.Uint64() - 27) - if !crypto.ValidateSignatureValues(V, tx.data.R, tx.data.S, false) { - return nil, ErrInvalidSig +func recoverPlain(sighash common.Hash, R, S, Vb *big.Int, homestead bool) (common.Address, error) { + if Vb.BitLen() > 8 { + return common.Address{}, ErrInvalidSig + } + V := byte(Vb.Uint64() - 27) + if !crypto.ValidateSignatureValues(V, R, S, homestead) { + return common.Address{}, ErrInvalidSig } // encode the snature in uncompressed format - r, s := tx.data.R.Bytes(), tx.data.S.Bytes() + r, s := R.Bytes(), S.Bytes() sig := make([]byte, 65) copy(sig[32-len(r):32], r) copy(sig[64-len(s):64], s) sig[64] = V - // recover the public key from the snature - hash := fs.Hash(tx) - pub, err := crypto.Ecrecover(hash[:], sig) + pub, err := crypto.Ecrecover(sighash[:], sig) if err != nil { - return nil, err + return common.Address{}, err } if len(pub) == 0 || pub[0] != 4 { - return nil, errors.New("invalid public key") + return common.Address{}, errors.New("invalid public key") } - return pub, nil + var addr common.Address + copy(addr[:], crypto.Keccak256(pub[1:])[12:]) + return addr, nil } // deriveChainId derives the chain id from the given v parameter diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index df9d7ffd18..30ecb84ddb 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -52,10 +52,11 @@ var ( ) func TestTransactionSigHash(t *testing.T) { - if emptyTx.SigHash(HomesteadSigner{}) != common.HexToHash("c775b99e7ad12f50d819fcd602390467e28141316969f4b57f0626f74fe3b386") { + var homestead HomesteadSigner + if homestead.Hash(emptyTx) != common.HexToHash("c775b99e7ad12f50d819fcd602390467e28141316969f4b57f0626f74fe3b386") { t.Errorf("empty transaction hash mismatch, got %x", emptyTx.Hash()) } - if rightvrsTx.SigHash(HomesteadSigner{}) != common.HexToHash("fe7a79529ed5f7c3375d06b26b186a8644e0e16c373d7a12be41c62d6042b77a") { + if homestead.Hash(rightvrsTx) != common.HexToHash("fe7a79529ed5f7c3375d06b26b186a8644e0e16c373d7a12be41c62d6042b77a") { t.Errorf("RightVRS transaction hash mismatch, got %x", rightvrsTx.Hash()) } } diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 48639d9492..7f73ab113c 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -20,6 +20,7 @@ package ethclient import ( "context" "encoding/json" + "errors" "fmt" "math/big" @@ -70,9 +71,9 @@ func (ec *Client) BlockByNumber(ctx context.Context, number *big.Int) (*types.Bl } type rpcBlock struct { - Hash common.Hash `json:"hash"` - Transactions []*types.Transaction `json:"transactions"` - UncleHashes []common.Hash `json:"uncles"` + Hash common.Hash `json:"hash"` + Transactions []rpcTransaction `json:"transactions"` + UncleHashes []common.Hash `json:"uncles"` } func (ec *Client) getBlock(ctx context.Context, method string, args ...interface{}) (*types.Block, error) { @@ -129,7 +130,13 @@ func (ec *Client) getBlock(ctx context.Context, method string, args ...interface } } } - return types.NewBlockWithHeader(head).WithBody(body.Transactions, uncles), nil + // Fill the sender cache of transactions in the block. + txs := make([]*types.Transaction, len(body.Transactions)) + for i, tx := range body.Transactions { + setSenderFromServer(tx.tx, tx.From, body.Hash) + txs[i] = tx.tx + } + return types.NewBlockWithHeader(head).WithBody(txs, uncles), nil } // HeaderByHash returns the block header with the given hash. @@ -153,25 +160,62 @@ func (ec *Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.H return head, err } +type rpcTransaction struct { + tx *types.Transaction + txExtraInfo +} + +type txExtraInfo struct { + BlockNumber *string + BlockHash common.Hash + From common.Address +} + +func (tx *rpcTransaction) UnmarshalJSON(msg []byte) error { + if err := json.Unmarshal(msg, &tx.tx); err != nil { + return err + } + return json.Unmarshal(msg, &tx.txExtraInfo) +} + // TransactionByHash returns the transaction with the given hash. func (ec *Client) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { - var raw json.RawMessage - err = ec.c.CallContext(ctx, &raw, "eth_getTransactionByHash", hash) + var json *rpcTransaction + err = ec.c.CallContext(ctx, &json, "eth_getTransactionByHash", hash) if err != nil { return nil, false, err - } else if len(raw) == 0 { + } else if json == nil { return nil, false, ethereum.NotFound - } - if err := json.Unmarshal(raw, &tx); err != nil { - return nil, false, err - } else if _, r, _ := tx.RawSignatureValues(); r == nil { + } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { return nil, false, fmt.Errorf("server returned transaction without signature") } - var block struct{ BlockNumber *string } - if err := json.Unmarshal(raw, &block); err != nil { - return nil, false, err + setSenderFromServer(json.tx, json.From, json.BlockHash) + return json.tx, json.BlockNumber == nil, nil +} + +// TransactionSender returns the sender address of the given transaction. The transaction +// must be known to the remote node and included in the blockchain at the given block and +// index. The sender is the one derived by the protocol at the time of inclusion. +// +// There is a fast-path for transactions retrieved by TransactionByHash and +// TransactionInBlock. Getting their sender address can be done without an RPC interaction. +func (ec *Client) TransactionSender(ctx context.Context, tx *types.Transaction, block common.Hash, index uint) (common.Address, error) { + // Try to load the address from the cache. + sender, err := types.Sender(&senderFromServer{blockhash: block}, tx) + if err == nil { + return sender, nil } - return tx, block.BlockNumber == nil, nil + var meta struct { + Hash common.Hash + From common.Address + } + if err = ec.c.CallContext(ctx, &meta, "eth_getTransactionByBlockHashAndIndex", block, hexutil.Uint64(index)); err != nil { + return common.Address{}, err + } + if meta.Hash == (common.Hash{}) || meta.Hash != tx.Hash() { + return common.Address{}, errors.New("wrong inclusion block/index") + } + return meta.From, nil } // TransactionCount returns the total number of transactions in the given block. @@ -183,16 +227,17 @@ func (ec *Client) TransactionCount(ctx context.Context, blockHash common.Hash) ( // TransactionInBlock returns a single transaction at index in the given block. func (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { - var tx *types.Transaction - err := ec.c.CallContext(ctx, &tx, "eth_getTransactionByBlockHashAndIndex", blockHash, hexutil.Uint64(index)) + var json *rpcTransaction + err := ec.c.CallContext(ctx, &json, "eth_getTransactionByBlockHashAndIndex", blockHash, hexutil.Uint64(index)) if err == nil { - if tx == nil { + if json == nil { return nil, ethereum.NotFound - } else if _, r, _ := tx.RawSignatureValues(); r == nil { + } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { return nil, fmt.Errorf("server returned transaction without signature") } } - return tx, err + setSenderFromServer(json.tx, json.From, json.BlockHash) + return json.tx, err } // TransactionReceipt returns the receipt of a transaction by transaction hash. diff --git a/ethclient/signer.go b/ethclient/signer.go new file mode 100644 index 0000000000..74a93f1e2f --- /dev/null +++ b/ethclient/signer.go @@ -0,0 +1,59 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package ethclient + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// senderFromServer is a types.Signer that remembers the sender address returned by the RPC +// server. It is stored in the transaction's sender address cache to avoid an additional +// request in TransactionSender. +type senderFromServer struct { + addr common.Address + blockhash common.Hash +} + +var errNotCached = errors.New("sender not cached") + +func setSenderFromServer(tx *types.Transaction, addr common.Address, block common.Hash) { + // Use types.Sender for side-effect to store our signer into the cache. + types.Sender(&senderFromServer{addr, block}, tx) +} + +func (s *senderFromServer) Equal(other types.Signer) bool { + os, ok := other.(*senderFromServer) + return ok && os.blockhash == s.blockhash +} + +func (s *senderFromServer) Sender(tx *types.Transaction) (common.Address, error) { + if s.blockhash == (common.Hash{}) { + return common.Address{}, errNotCached + } + return s.addr, nil +} + +func (s *senderFromServer) Hash(tx *types.Transaction) common.Hash { + panic("can't sign with senderFromServer") +} +func (s *senderFromServer) SignatureValues(tx *types.Transaction, sig []byte) (R, S, V *big.Int, err error) { + panic("can't sign with senderFromServer") +} diff --git a/mobile/ethclient.go b/mobile/ethclient.go index 4e83285017..7f31a89989 100644 --- a/mobile/ethclient.go +++ b/mobile/ethclient.go @@ -77,6 +77,13 @@ func (ec *EthereumClient) GetTransactionByHash(ctx *Context, hash *Hash) (tx *Tr return &Transaction{rawTx}, err } +// GetTransactionSender returns the sender address of a transaction. The transaction must +// be included in blockchain at the given block and index. +func (ec *EthereumClient) GetTransactionSender(ctx *Context, tx *Transaction, blockhash *Hash, index int) (sender *Address, _ error) { + addr, err := ec.client.TransactionSender(ctx.context, tx.tx, blockhash.hash, uint(index)) + return &Address{addr}, err +} + // GetTransactionCount returns the total number of transactions in the given block. func (ec *EthereumClient) GetTransactionCount(ctx *Context, hash *Hash) (count int, _ error) { rawCount, err := ec.client.TransactionCount(ctx.context, hash.hash) diff --git a/mobile/types.go b/mobile/types.go index 088c7c6b33..b7f8a3bc15 100644 --- a/mobile/types.go +++ b/mobile/types.go @@ -261,10 +261,13 @@ func (tx *Transaction) GetGasPrice() *BigInt { return &BigInt{tx.tx.GasPrice()} func (tx *Transaction) GetValue() *BigInt { return &BigInt{tx.tx.Value()} } func (tx *Transaction) GetNonce() int64 { return int64(tx.tx.Nonce()) } -func (tx *Transaction) GetHash() *Hash { return &Hash{tx.tx.Hash()} } -func (tx *Transaction) GetSigHash() *Hash { return &Hash{tx.tx.SigHash(types.HomesteadSigner{})} } -func (tx *Transaction) GetCost() *BigInt { return &BigInt{tx.tx.Cost()} } +func (tx *Transaction) GetHash() *Hash { return &Hash{tx.tx.Hash()} } +func (tx *Transaction) GetCost() *BigInt { return &BigInt{tx.tx.Cost()} } +// Deprecated: GetSigHash cannot know which signer to use. +func (tx *Transaction) GetSigHash() *Hash { return &Hash{types.HomesteadSigner{}.Hash(tx.tx)} } + +// Deprecated: use EthereumClient.TransactionSender func (tx *Transaction) GetFrom(chainID *BigInt) (address *Address, _ error) { var signer types.Signer = types.HomesteadSigner{} if chainID != nil { From a31835c8b4086582879a4e7a48e4bdb5e4dccc3d Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Sat, 26 Aug 2017 15:30:56 +0800 Subject: [PATCH 183/272] internal/ethapi: add status code to receipt rpc return --- internal/ethapi/api.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 8d1a6f7462..a7cb08466a 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -44,8 +44,10 @@ import ( ) const ( - defaultGas = 90000 - defaultGasPrice = 50 * params.Shannon + defaultGas = 90000 + defaultGasPrice = 50 * params.Shannon + receiptStatusSuccessful = 1 + receiptStatusFailed = 0 ) // PublicEthereumAPI provides an API to access Ethereum related information. @@ -991,7 +993,6 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[ from, _ := types.Sender(signer, tx) fields := map[string]interface{}{ - "root": hexutil.Bytes(receipt.PostState), "blockHash": blockHash, "blockNumber": hexutil.Uint64(blockNumber), "transactionHash": hash, @@ -1004,6 +1005,16 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[ "logs": receipt.Logs, "logsBloom": receipt.Bloom, } + + // Assign receipt status or post state. + if len(receipt.PostState) > 0 { + fields["root"] = hexutil.Bytes(receipt.PostState) + } else { + fields["status"] = hexutil.Uint(receiptStatusSuccessful) + if receipt.Failed { + fields["status"] = hexutil.Uint(receiptStatusFailed) + } + } if receipt.Logs == nil { fields["logs"] = [][]*types.Log{} } From 7514e8a24d3dc332e58be4b26f893aff8c24a9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 2 Oct 2017 13:01:40 +0300 Subject: [PATCH 184/272] cmd/puppeth, params: enable Byzantium on all networks --- cmd/puppeth/wizard_genesis.go | 1 + params/config.go | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index 705e010314..43dae9c20e 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -42,6 +42,7 @@ func (w *wizard) makeGenesis() { EIP150Block: big.NewInt(2), EIP155Block: big.NewInt(3), EIP158Block: big.NewInt(3), + ByzantiumBlock: big.NewInt(4), }, } // Figure out which consensus engine to choose diff --git a/params/config.go b/params/config.go index fff168a8c2..bff701f092 100644 --- a/params/config.go +++ b/params/config.go @@ -18,7 +18,6 @@ package params import ( "fmt" - "math" "math/big" "github.com/ethereum/go-ethereum/common" @@ -40,7 +39,7 @@ var ( EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), EIP155Block: big.NewInt(2675000), EIP158Block: big.NewInt(2675000), - ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ByzantiumBlock: big.NewInt(4370000), Ethash: new(EthashConfig), } @@ -70,7 +69,7 @@ var ( EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), EIP155Block: big.NewInt(3), EIP158Block: big.NewInt(3), - ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ByzantiumBlock: big.NewInt(1035301), Clique: &CliqueConfig{ Period: 15, From 7e9e3a134b9607209def42279db081973b5e0ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 2 Oct 2017 11:42:08 +0300 Subject: [PATCH 185/272] core/types, internal: swap Receipt.Failed to Status --- core/database_util_test.go | 2 +- core/types/gen_receipt_json.go | 10 ++++---- core/types/receipt.go | 42 ++++++++++++++++++++++------------ internal/ethapi/api.go | 11 +++------ 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/core/database_util_test.go b/core/database_util_test.go index 940221a299..36f43cf50a 100644 --- a/core/database_util_test.go +++ b/core/database_util_test.go @@ -336,7 +336,7 @@ func TestBlockReceiptStorage(t *testing.T) { db, _ := ethdb.NewMemDatabase() receipt1 := &types.Receipt{ - Failed: true, + Status: types.ReceiptStatusFailed, CumulativeGasUsed: big.NewInt(1), Logs: []*types.Log{ {Address: common.BytesToAddress([]byte{0x11})}, diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index 1e6880c223..b95d99c951 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -14,7 +14,7 @@ import ( func (r Receipt) MarshalJSON() ([]byte, error) { type Receipt struct { PostState hexutil.Bytes `json:"root"` - Failed bool `json:"failed"` + Status hexutil.Uint `json:"status"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -24,7 +24,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { } var enc Receipt enc.PostState = r.PostState - enc.Failed = r.Failed + enc.Status = hexutil.Uint(r.Status) enc.CumulativeGasUsed = (*hexutil.Big)(r.CumulativeGasUsed) enc.Bloom = r.Bloom enc.Logs = r.Logs @@ -37,7 +37,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { func (r *Receipt) UnmarshalJSON(input []byte) error { type Receipt struct { PostState hexutil.Bytes `json:"root"` - Failed *bool `json:"failed"` + Status *hexutil.Uint `json:"status"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom *Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -52,8 +52,8 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { if dec.PostState != nil { r.PostState = dec.PostState } - if dec.Failed != nil { - r.Failed = *dec.Failed + if dec.Status != nil { + r.Status = uint(*dec.Status) } if dec.CumulativeGasUsed == nil { return errors.New("missing required field 'cumulativeGasUsed' for Receipt") diff --git a/core/types/receipt.go b/core/types/receipt.go index e179fe0cfd..bc3c996b4f 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -30,15 +30,23 @@ import ( //go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go var ( - receiptStatusFailed = []byte{} - receiptStatusSuccessful = []byte{0x01} + receiptStatusFailedRLP = []byte{} + receiptStatusSuccessfulRLP = []byte{0x01} +) + +const ( + // ReceiptStatusFailed is the status code of a transaction if execution failed. + ReceiptStatusFailed = uint(0) + + // ReceiptStatusSuccessful is the status code of a transaction if execution succeeded. + ReceiptStatusSuccessful = uint(1) ) // Receipt represents the results of a transaction. type Receipt struct { // Consensus fields PostState []byte `json:"root"` - Failed bool `json:"failed"` + Status uint `json:"status"` CumulativeGasUsed *big.Int `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -51,6 +59,7 @@ type Receipt struct { type receiptMarshaling struct { PostState hexutil.Bytes + Status hexutil.Uint CumulativeGasUsed *hexutil.Big GasUsed *hexutil.Big } @@ -75,7 +84,13 @@ type receiptStorageRLP struct { // NewReceipt creates a barebone transaction receipt, copying the init fields. func NewReceipt(root []byte, failed bool, cumulativeGasUsed *big.Int) *Receipt { - return &Receipt{PostState: common.CopyBytes(root), Failed: failed, CumulativeGasUsed: new(big.Int).Set(cumulativeGasUsed)} + r := &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: new(big.Int).Set(cumulativeGasUsed)} + if failed { + r.Status = ReceiptStatusFailed + } else { + r.Status = ReceiptStatusSuccessful + } + return r } // EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt @@ -100,10 +115,10 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { func (r *Receipt) setStatus(postStateOrStatus []byte) error { switch { - case bytes.Equal(postStateOrStatus, receiptStatusSuccessful): - r.Failed = false - case bytes.Equal(postStateOrStatus, receiptStatusFailed): - r.Failed = true + case bytes.Equal(postStateOrStatus, receiptStatusSuccessfulRLP): + r.Status = ReceiptStatusSuccessful + case bytes.Equal(postStateOrStatus, receiptStatusFailedRLP): + r.Status = ReceiptStatusFailed case len(postStateOrStatus) == len(common.Hash{}): r.PostState = postStateOrStatus default: @@ -114,19 +129,18 @@ func (r *Receipt) setStatus(postStateOrStatus []byte) error { func (r *Receipt) statusEncoding() []byte { if len(r.PostState) == 0 { - if r.Failed { - return receiptStatusFailed - } else { - return receiptStatusSuccessful + if r.Status == ReceiptStatusFailed { + return receiptStatusFailedRLP } + return receiptStatusSuccessfulRLP } return r.PostState } // String implements the Stringer interface. func (r *Receipt) String() string { - if r.PostState == nil { - return fmt.Sprintf("receipt{failed=%t cgas=%v bloom=%x logs=%v}", r.Failed, r.CumulativeGasUsed, r.Bloom, r.Logs) + if len(r.PostState) == 0 { + return fmt.Sprintf("receipt{status=%d cgas=%v bloom=%x logs=%v}", r.Status, r.CumulativeGasUsed, r.Bloom, r.Logs) } return fmt.Sprintf("receipt{med=%x cgas=%v bloom=%x logs=%v}", r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs) } diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index a7cb08466a..ab8478929f 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -44,10 +44,8 @@ import ( ) const ( - defaultGas = 90000 - defaultGasPrice = 50 * params.Shannon - receiptStatusSuccessful = 1 - receiptStatusFailed = 0 + defaultGas = 90000 + defaultGasPrice = 50 * params.Shannon ) // PublicEthereumAPI provides an API to access Ethereum related information. @@ -1010,10 +1008,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[ if len(receipt.PostState) > 0 { fields["root"] = hexutil.Bytes(receipt.PostState) } else { - fields["status"] = hexutil.Uint(receiptStatusSuccessful) - if receipt.Failed { - fields["status"] = hexutil.Uint(receiptStatusFailed) - } + fields["status"] = hexutil.Uint(receipt.Status) } if receipt.Logs == nil { fields["logs"] = [][]*types.Log{} From 94903d572b4ee72c7ea62ce9856f51def85fdd2a Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Thu, 24 Aug 2017 11:18:21 +0800 Subject: [PATCH 186/272] internal, accounts, eth: utilize vm failed flag to help gas estimation --- accounts/abi/bind/backends/simulated.go | 24 +++++++++--------- eth/api.go | 4 +-- internal/ethapi/api.go | 33 ++++++++++++++----------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index d6d16eb3f9..0621e81c2b 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -168,7 +168,7 @@ func (b *SimulatedBackend) CallContract(ctx context.Context, call ethereum.CallM if err != nil { return nil, err } - rval, _, err := b.callContract(ctx, call, b.blockchain.CurrentBlock(), state) + rval, _, _, err := b.callContract(ctx, call, b.blockchain.CurrentBlock(), state) return rval, err } @@ -178,7 +178,7 @@ func (b *SimulatedBackend) PendingCallContract(ctx context.Context, call ethereu defer b.mu.Unlock() defer b.pendingState.RevertToSnapshot(b.pendingState.Snapshot()) - rval, _, err := b.callContract(ctx, call, b.pendingBlock, b.pendingState) + rval, _, _, err := b.callContract(ctx, call, b.pendingBlock, b.pendingState) return rval, err } @@ -204,8 +204,11 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs defer b.mu.Unlock() // Binary search the gas requirement, as it may be higher than the amount used - var lo, hi uint64 - if call.Gas != nil { + var ( + lo uint64 = params.TxGas - 1 + hi uint64 + ) + if call.Gas != nil && call.Gas.Uint64() >= params.TxGas { hi = call.Gas.Uint64() } else { hi = b.pendingBlock.GasLimit().Uint64() @@ -216,11 +219,11 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs call.Gas = new(big.Int).SetUint64(mid) snapshot := b.pendingState.Snapshot() - _, gas, err := b.callContract(ctx, call, b.pendingBlock, b.pendingState) + _, _, failed, err := b.callContract(ctx, call, b.pendingBlock, b.pendingState) b.pendingState.RevertToSnapshot(snapshot) - // If the transaction became invalid or used all the gas (failed), raise the gas limit - if err != nil || gas.Cmp(call.Gas) == 0 { + // If the transaction became invalid or execution failed, raise the gas limit + if err != nil || failed { lo = mid continue } @@ -232,7 +235,7 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs // callContract implemens common code between normal and pending contract calls. // state is modified during execution, make sure to copy it if necessary. -func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallMsg, block *types.Block, statedb *state.StateDB) ([]byte, *big.Int, error) { +func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallMsg, block *types.Block, statedb *state.StateDB) ([]byte, *big.Int, bool, error) { // Ensure message is initialized properly. if call.GasPrice == nil { call.GasPrice = big.NewInt(1) @@ -254,9 +257,8 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM // about the transaction and calling mechanisms. vmenv := vm.NewEVM(evmContext, statedb, b.config, vm.Config{}) gaspool := new(core.GasPool).AddGas(math.MaxBig256) - // TODO utilize returned failed flag to help gas estimation. - ret, gasUsed, _, _, err := core.NewStateTransition(vmenv, msg, gaspool).TransitionDb() - return ret, gasUsed, err + ret, gasUsed, _, failed, err := core.NewStateTransition(vmenv, msg, gaspool).TransitionDb() + return ret, gasUsed, failed, err } // SendTransaction updates the pending block to include the given transaction. diff --git a/eth/api.go b/eth/api.go index d64e4e6c75..e91f51bb99 100644 --- a/eth/api.go +++ b/eth/api.go @@ -523,8 +523,7 @@ func (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, txHash common. // Run the transaction with tracing enabled. vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{Debug: true, Tracer: tracer}) - // TODO utilize failed flag - ret, gas, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())) + ret, gas, failed, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())) if err != nil { return nil, fmt.Errorf("tracing failed: %v", err) } @@ -532,6 +531,7 @@ func (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, txHash common. case *vm.StructLogger: return ðapi.ExecutionResult{ Gas: gas, + Failed: failed, ReturnValue: fmt.Sprintf("%x", ret), StructLogs: ethapi.FormatLogs(tracer.StructLogs()), }, nil diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index ab8478929f..1ffb5a1803 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -580,12 +580,12 @@ type CallArgs struct { Data hexutil.Bytes `json:"data"` } -func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config) ([]byte, *big.Int, error) { +func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config) ([]byte, *big.Int, bool, error) { defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) state, header, err := s.b.StateAndHeaderByNumber(ctx, blockNr) if state == nil || err != nil { - return nil, common.Big0, err + return nil, common.Big0, false, err } // Set sender address or use a default if none specified addr := args.From @@ -623,7 +623,7 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr // Get a new instance of the EVM. evm, vmError, err := s.b.GetEVM(ctx, msg, state, header, vmCfg) if err != nil { - return nil, common.Big0, err + return nil, common.Big0, false, err } // Wait for the context to be done and cancel the evm. Even if the // EVM has finished, cancelling may be done (repeatedly) @@ -635,26 +635,28 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr // Setup the gas pool (also for unmetered requests) // and apply the message. gp := new(core.GasPool).AddGas(math.MaxBig256) - // TODO utilize failed flag to help gas estimation - res, gas, _, err := core.ApplyMessage(evm, msg, gp) + res, gas, failed, err := core.ApplyMessage(evm, msg, gp) if err := vmError(); err != nil { - return nil, common.Big0, err + return nil, common.Big0, false, err } - return res, gas, err + return res, gas, failed, err } // Call executes the given transaction on the state for the given block number. // It doesn't make and changes in the state/blockchain and is useful to execute and retrieve values. func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { - result, _, err := s.doCall(ctx, args, blockNr, vm.Config{DisableGasMetering: true}) + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{DisableGasMetering: true}) return (hexutil.Bytes)(result), err } // EstimateGas returns an estimate of the amount of gas needed to execute the given transaction. func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (*hexutil.Big, error) { // Binary search the gas requirement, as it may be higher than the amount used - var lo, hi uint64 - if (*big.Int)(&args.Gas).Sign() != 0 { + var ( + lo uint64 = params.TxGas - 1 + hi uint64 + ) + if (*big.Int)(&args.Gas).Uint64() >= params.TxGas { hi = (*big.Int)(&args.Gas).Uint64() } else { // Retrieve the current pending block to act as the gas ceiling @@ -669,10 +671,10 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (* mid := (hi + lo) / 2 (*big.Int)(&args.Gas).SetUint64(mid) - _, gas, err := s.doCall(ctx, args, rpc.PendingBlockNumber, vm.Config{}) + _, _, failed, err := s.doCall(ctx, args, rpc.PendingBlockNumber, vm.Config{}) - // If the transaction became invalid or used all the gas (failed), raise the gas limit - if err != nil || gas.Cmp((*big.Int)(&args.Gas)) == 0 { + // If the transaction became invalid or execution failed, raise the gas limit + if err != nil || failed { lo = mid continue } @@ -683,10 +685,11 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (* } // ExecutionResult groups all structured logs emitted by the EVM -// while replaying a transaction in debug mode as well as the amount of -// gas used and the return value +// while replaying a transaction in debug mode as well as transaction +// execution status, the amount of gas used and the return value type ExecutionResult struct { Gas *big.Int `json:"gas"` + Failed bool `json:"failed"` ReturnValue string `json:"returnValue"` StructLogs []StructLogRes `json:"structLogs"` } From 8d126a49818810e274e946357bbbccc76fa09cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 3 Oct 2017 12:18:50 +0300 Subject: [PATCH 187/272] accounts/usbwallet: handle bad interface number on macOS --- accounts/usbwallet/hub.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/accounts/usbwallet/hub.go b/accounts/usbwallet/hub.go index 7069d25311..61fc98ccc8 100644 --- a/accounts/usbwallet/hub.go +++ b/accounts/usbwallet/hub.go @@ -47,6 +47,8 @@ type Hub struct { scheme string // Protocol scheme prefixing account and wallet URLs. vendorID uint16 // USB vendor identifier used for device discovery productIDs []uint16 // USB product identifiers used for device discovery + usageID uint16 // USB usage page identifier used for macOS device discovery + endpointID int // USB endpoint identifier used for non-macOS device discovery makeDriver func(log.Logger) driver // Factory method to construct a vendor specific driver refreshed time.Time // Time instance when the list of wallets was last refreshed @@ -66,16 +68,16 @@ type Hub struct { // NewLedgerHub creates a new hardware wallet manager for Ledger devices. func NewLedgerHub() (*Hub, error) { - return newHub(LedgerScheme, 0x2c97, []uint16{0x0000 /* Ledger Blue */, 0x0001 /* Ledger Nano S */}, newLedgerDriver) + return newHub(LedgerScheme, 0x2c97, []uint16{0x0000 /* Ledger Blue */, 0x0001 /* Ledger Nano S */}, 0xffa0, 0, newLedgerDriver) } // NewTrezorHub creates a new hardware wallet manager for Trezor devices. func NewTrezorHub() (*Hub, error) { - return newHub(TrezorScheme, 0x534c, []uint16{0x0001 /* Trezor 1 */}, newTrezorDriver) + return newHub(TrezorScheme, 0x534c, []uint16{0x0001 /* Trezor 1 */}, 0xff00, 0, newTrezorDriver) } // newHub creates a new hardware wallet manager for generic USB devices. -func newHub(scheme string, vendorID uint16, productIDs []uint16, makeDriver func(log.Logger) driver) (*Hub, error) { +func newHub(scheme string, vendorID uint16, productIDs []uint16, usageID uint16, endpointID int, makeDriver func(log.Logger) driver) (*Hub, error) { if !hid.Supported() { return nil, errors.New("unsupported platform") } @@ -83,6 +85,8 @@ func newHub(scheme string, vendorID uint16, productIDs []uint16, makeDriver func scheme: scheme, vendorID: vendorID, productIDs: productIDs, + usageID: usageID, + endpointID: endpointID, makeDriver: makeDriver, quit: make(chan chan error), } @@ -133,7 +137,7 @@ func (hub *Hub) refreshWallets() { } for _, info := range hid.Enumerate(hub.vendorID, 0) { for _, id := range hub.productIDs { - if info.ProductID == id && info.Interface == 0 { + if info.ProductID == id && (info.UsagePage == hub.usageID || info.Interface == hub.endpointID) { devices = append(devices, info) break } From 629b5837e99ced620e71f5d750f2c1abc3537ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 3 Oct 2017 19:59:53 +0300 Subject: [PATCH 188/272] core: revert invalid block dedup code (#15235) --- core/blockchain.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 235c1f3da2..57a881f384 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -796,11 +796,6 @@ func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.R bc.mu.Lock() defer bc.mu.Unlock() - if bc.HasBlock(block.Hash(), block.NumberU64()) { - log.Trace("Block existed", "hash", block.Hash()) - return - } - localTd := bc.GetTd(bc.currentBlock.Hash(), bc.currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) From 05101641455a754936acc5ddff92f35f5e33181c Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 3 Oct 2017 19:18:39 +0200 Subject: [PATCH 189/272] params: v1.7.1 stable --- params/version.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params/version.go b/params/version.go index 80329c91d9..522194dea0 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 1 // Patch version component of the current release - VersionMeta = "unstable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 1 // Patch version component of the current release + VersionMeta = "stable" // Version metadata to append to the version string ) // Version holds the textual version string. From c0a1f1c9076608cb98f9cbd02a896e966cc2a93b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 3 Oct 2017 19:19:37 +0200 Subject: [PATCH 190/272] params, VERSION: v1.7.2 unstable --- VERSION | 2 +- params/version.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 943f9cbc4e..f8a696c8dc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.7.1 +1.7.2 diff --git a/params/version.go b/params/version.go index 522194dea0..1abbae98a3 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 1 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 2 // Patch version component of the current release + VersionMeta = "unstable" // Version metadata to append to the version string ) // Version holds the textual version string. From edba5e9854dcef9b4dcb6d75c06d5b5c7e5b8856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 4 Oct 2017 12:15:58 +0300 Subject: [PATCH 191/272] cmd/puppeth: support managing fork block in the chain config --- cmd/puppeth/wizard.go | 22 ++++++++++++++ cmd/puppeth/wizard_genesis.go | 52 ++++++++++++++++++++++++++++++++++ cmd/puppeth/wizard_intro.go | 12 ++------ cmd/puppeth/wizard_netstats.go | 2 +- 4 files changed, 77 insertions(+), 11 deletions(-) diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 5187412797..3fdd639f80 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -161,6 +161,28 @@ func (w *wizard) readDefaultInt(def int) int { } } +// readDefaultBigInt reads a single line from stdin, trimming if from spaces, +// enforcing it to parse into a big integer. If an empty line is entered, the +// default value is returned. +func (w *wizard) readDefaultBigInt(def *big.Int) *big.Int { + for { + fmt.Printf("> ") + text, err := w.in.ReadString('\n') + if err != nil { + log.Crit("Failed to read user input", "err", err) + } + if text = strings.TrimSpace(text); text == "" { + return def + } + val, ok := new(big.Int).SetString(text, 0) + if !ok { + log.Error("Invalid input, expected big integer") + continue + } + return val + } +} + /* // readFloat reads a single line from stdin, trimming if from spaces, enforcing it // to parse into a float. diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index 43dae9c20e..222fc2a7ca 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -18,7 +18,9 @@ package main import ( "bytes" + "encoding/json" "fmt" + "io/ioutil" "math/big" "math/rand" "time" @@ -135,3 +137,53 @@ func (w *wizard) makeGenesis() { // All done, store the genesis and flush to disk w.conf.genesis = genesis } + +// manageGenesis permits the modification of chain configuration parameters in +// a genesis config and the export of the entire genesis spec. +func (w *wizard) manageGenesis() { + // Figure out whether to modify or export the genesis + fmt.Println() + fmt.Println(" 1. Modify existing fork rules") + fmt.Println(" 2. Export genesis configuration") + + choice := w.read() + switch { + case choice == "1": + // Fork rule updating requested, iterate over each fork + fmt.Println() + fmt.Printf("Which block should Homestead come into effect? (default = %v)\n", w.conf.genesis.Config.HomesteadBlock) + w.conf.genesis.Config.HomesteadBlock = w.readDefaultBigInt(w.conf.genesis.Config.HomesteadBlock) + + fmt.Println() + fmt.Printf("Which block should EIP150 come into effect? (default = %v)\n", w.conf.genesis.Config.EIP150Block) + w.conf.genesis.Config.EIP150Block = w.readDefaultBigInt(w.conf.genesis.Config.EIP150Block) + + fmt.Println() + fmt.Printf("Which block should EIP155 come into effect? (default = %v)\n", w.conf.genesis.Config.EIP155Block) + w.conf.genesis.Config.EIP155Block = w.readDefaultBigInt(w.conf.genesis.Config.EIP155Block) + + fmt.Println() + fmt.Printf("Which block should EIP158 come into effect? (default = %v)\n", w.conf.genesis.Config.EIP158Block) + w.conf.genesis.Config.EIP158Block = w.readDefaultBigInt(w.conf.genesis.Config.EIP158Block) + + fmt.Println() + fmt.Printf("Which block should Byzantium come into effect? (default = %v)\n", w.conf.genesis.Config.ByzantiumBlock) + w.conf.genesis.Config.ByzantiumBlock = w.readDefaultBigInt(w.conf.genesis.Config.ByzantiumBlock) + + out, _ := json.MarshalIndent(w.conf.genesis.Config, "", " ") + fmt.Printf("Chain configuration updated:\n\n%s\n", out) + + case choice == "2": + // Save whatever genesis configuration we currently have + fmt.Println() + fmt.Printf("Which file to save the genesis into? (default = %s.json)\n", w.network) + out, _ := json.MarshalIndent(w.conf.genesis, "", " ") + if err := ioutil.WriteFile(w.readDefaultString(fmt.Sprintf("%s.json", w.network)), out, 0644); err != nil { + log.Error("Failed to save genesis file", "err", err) + } + log.Info("Exported existing genesis block") + + default: + log.Error("That's not something I can do") + } +} diff --git a/cmd/puppeth/wizard_intro.go b/cmd/puppeth/wizard_intro.go index c3eaf53244..2d9a097ee7 100644 --- a/cmd/puppeth/wizard_intro.go +++ b/cmd/puppeth/wizard_intro.go @@ -98,7 +98,7 @@ func (w *wizard) run() { if w.conf.genesis == nil { fmt.Println(" 2. Configure new genesis") } else { - fmt.Println(" 2. Save existing genesis") + fmt.Println(" 2. Manage existing genesis") } if len(w.servers) == 0 { fmt.Println(" 3. Track new remote server") @@ -118,18 +118,10 @@ func (w *wizard) run() { w.networkStats(false) case choice == "2": - // If we don't have a genesis, make one if w.conf.genesis == nil { w.makeGenesis() } else { - // Otherwise just save whatever we currently have - fmt.Println() - fmt.Printf("Which file to save the genesis into? (default = %s.json)\n", w.network) - out, _ := json.MarshalIndent(w.conf.genesis, "", " ") - if err := ioutil.WriteFile(w.readDefaultString(fmt.Sprintf("%s.json", w.network)), out, 0644); err != nil { - log.Error("Failed to save genesis file", "err", err) - } - log.Info("Exported existing genesis block") + w.manageGenesis() } case choice == "3": if len(w.servers) == 0 { diff --git a/cmd/puppeth/wizard_netstats.go b/cmd/puppeth/wizard_netstats.go index ab80786986..c069721982 100644 --- a/cmd/puppeth/wizard_netstats.go +++ b/cmd/puppeth/wizard_netstats.go @@ -129,7 +129,7 @@ func (w *wizard) networkStats(tips bool) { } } // If a genesis block was found, load it into our configs - if protips.genesis != "" { + if protips.genesis != "" && w.conf.genesis == nil { genesis := new(core.Genesis) if err := json.Unmarshal([]byte(protips.genesis), genesis); err != nil { log.Error("Failed to parse remote genesis", "err", err) From 41d361565bb4c4043e866ec4cf06282958dc2c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 5 Oct 2017 15:57:33 +0300 Subject: [PATCH 192/272] vendor: update liner to fix docker and mips bugs --- vendor/github.com/peterh/liner/common.go | 7 +- vendor/github.com/peterh/liner/input.go | 4 +- vendor/github.com/peterh/liner/line.go | 87 ++++++++++++++++++++---- vendor/vendor.json | 6 +- 4 files changed, 84 insertions(+), 20 deletions(-) diff --git a/vendor/github.com/peterh/liner/common.go b/vendor/github.com/peterh/liner/common.go index e5b8fc2807..e16ecbc069 100644 --- a/vendor/github.com/peterh/liner/common.go +++ b/vendor/github.com/peterh/liner/common.go @@ -64,6 +64,11 @@ var ErrNotTerminalOutput = errors.New("standard output is not a terminal") // be colour codes on some platforms). var ErrInvalidPrompt = errors.New("invalid prompt") +// ErrInternal is returned when liner experiences an error that it cannot +// handle. For example, if the number of colums becomes zero during an +// active call to Prompt +var ErrInternal = errors.New("liner: internal error") + // KillRingMax is the max number of elements to save on the killring. const KillRingMax = 60 @@ -156,7 +161,7 @@ func (s *State) getHistoryByPrefix(prefix string) (ph []string) { return } -// Returns the history lines matching the inteligent search +// Returns the history lines matching the intelligent search func (s *State) getHistoryByPattern(pattern string) (ph []string, pos []int) { if pattern == "" { return diff --git a/vendor/github.com/peterh/liner/input.go b/vendor/github.com/peterh/liner/input.go index 904fbf6638..95dd5d1435 100644 --- a/vendor/github.com/peterh/liner/input.go +++ b/vendor/github.com/peterh/liner/input.go @@ -113,7 +113,7 @@ func (s *State) nextPending(timeout <-chan time.Time) (rune, error) { select { case thing, ok := <-s.next: if !ok { - return 0, errors.New("liner: internal error") + return 0, ErrInternal } if thing.err != nil { return 0, thing.err @@ -137,7 +137,7 @@ func (s *State) readNext() (interface{}, error) { select { case thing, ok := <-s.next: if !ok { - return 0, errors.New("liner: internal error") + return 0, ErrInternal } if thing.err != nil { return nil, thing.err diff --git a/vendor/github.com/peterh/liner/line.go b/vendor/github.com/peterh/liner/line.go index cc147d608a..d61f0696b0 100644 --- a/vendor/github.com/peterh/liner/line.go +++ b/vendor/github.com/peterh/liner/line.go @@ -3,10 +3,12 @@ package liner import ( + "bufio" "container/ring" "errors" "fmt" "io" + "os" "strings" "unicode" "unicode/utf8" @@ -90,6 +92,10 @@ const ( ) func (s *State) refresh(prompt []rune, buf []rune, pos int) error { + if s.columns == 0 { + return ErrInternal + } + s.needRefresh = false if s.multiLineMode { return s.refreshMultiLine(prompt, buf, pos) @@ -351,8 +357,8 @@ func (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interf } hl := utf8.RuneCountInString(head) if len(list) == 1 { - s.refresh(p, []rune(head+list[0]+tail), hl+utf8.RuneCountInString(list[0])) - return []rune(head + list[0] + tail), hl + utf8.RuneCountInString(list[0]), rune(esc), nil + err := s.refresh(p, []rune(head+list[0]+tail), hl+utf8.RuneCountInString(list[0])) + return []rune(head + list[0] + tail), hl + utf8.RuneCountInString(list[0]), rune(esc), err } direction := tabForward @@ -366,7 +372,10 @@ func (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interf if err != nil { return line, pos, rune(esc), err } - s.refresh(p, []rune(head+pick+tail), hl+utf8.RuneCountInString(pick)) + err = s.refresh(p, []rune(head+pick+tail), hl+utf8.RuneCountInString(pick)) + if err != nil { + return line, pos, rune(esc), err + } next, err := s.readNext() if err != nil { @@ -392,7 +401,10 @@ func (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interf // reverse intelligent search, implements a bash-like history search. func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, interface{}, error) { p := "(reverse-i-search)`': " - s.refresh([]rune(p), origLine, origPos) + err := s.refresh([]rune(p), origLine, origPos) + if err != nil { + return origLine, origPos, rune(esc), err + } line := []rune{} pos := 0 @@ -478,7 +490,10 @@ func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, inter case action: return []rune(foundLine), foundPos, next, err } - s.refresh(getLine()) + err = s.refresh(getLine()) + if err != nil { + return []rune(foundLine), foundPos, rune(esc), err + } } } @@ -535,7 +550,10 @@ func (s *State) yank(p []rune, text []rune, pos int) ([]rune, int, interface{}, line = append(line, lineEnd...) pos = len(lineStart) + len(value) - s.refresh(p, line, pos) + err := s.refresh(p, line, pos) + if err != nil { + return line, pos, 0, err + } next, err := s.readNext() if err != nil { @@ -577,6 +595,11 @@ func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (strin if s.inputRedirected || !s.terminalSupported { return s.promptUnsupported(prompt) } + p := []rune(prompt) + const minWorkingSpace = 10 + if s.columns < countGlyphs(p)+minWorkingSpace { + return s.tooNarrow(prompt) + } if s.outputRedirected { return "", ErrNotTerminalOutput } @@ -585,7 +608,6 @@ func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (strin defer s.historyMutex.RUnlock() fmt.Print(prompt) - p := []rune(prompt) var line = []rune(text) historyEnd := "" var historyPrefix []string @@ -600,7 +622,10 @@ func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (strin pos = len(text) } if len(line) > 0 { - s.refresh(p, line, pos) + err := s.refresh(p, line, pos) + if err != nil { + return "", err + } } restart: @@ -624,7 +649,10 @@ mainLoop: switch v { case cr, lf: if s.needRefresh { - s.refresh(p, line, pos) + err := s.refresh(p, line, pos) + if err != nil { + return "", err + } } if s.multiLineMode { s.resetMultiLine(p, line, pos) @@ -958,7 +986,10 @@ mainLoop: s.needRefresh = true } if s.needRefresh && !s.inputWaiting() { - s.refresh(p, line, pos) + err := s.refresh(p, line, pos) + if err != nil { + return "", err + } } if !historyAction { historyStale = true @@ -978,7 +1009,7 @@ func (s *State) PasswordPrompt(prompt string) (string, error) { return "", ErrInvalidPrompt } } - if !s.terminalSupported { + if !s.terminalSupported || s.columns == 0 { return "", errors.New("liner: function not supported in this terminal") } if s.inputRedirected { @@ -988,6 +1019,12 @@ func (s *State) PasswordPrompt(prompt string) (string, error) { return "", ErrNotTerminalOutput } + p := []rune(prompt) + const minWorkingSpace = 1 + if s.columns < countGlyphs(p)+minWorkingSpace { + return s.tooNarrow(prompt) + } + defer s.stopPrompt() restart: @@ -995,7 +1032,6 @@ restart: s.getColumns() fmt.Print(prompt) - p := []rune(prompt) var line []rune pos := 0 @@ -1014,7 +1050,10 @@ mainLoop: switch v { case cr, lf: if s.needRefresh { - s.refresh(p, line, pos) + err := s.refresh(p, line, pos) + if err != nil { + return "", err + } } if s.multiLineMode { s.resetMultiLine(p, line, pos) @@ -1032,7 +1071,10 @@ mainLoop: s.restartPrompt() case ctrlL: // clear screen s.eraseScreen() - s.refresh(p, []rune{}, 0) + err := s.refresh(p, []rune{}, 0) + if err != nil { + return "", err + } case ctrlH, bs: // Backspace if pos <= 0 { fmt.Print(beep) @@ -1068,3 +1110,20 @@ mainLoop: } return string(line), nil } + +func (s *State) tooNarrow(prompt string) (string, error) { + // Docker and OpenWRT and etc sometimes return 0 column width + // Reset mode temporarily. Restore baked mode in case the terminal + // is wide enough for the next Prompt attempt. + m, merr := TerminalMode() + s.origMode.ApplyMode() + if merr == nil { + defer m.ApplyMode() + } + if s.r == nil { + // Windows does not always set s.r + s.r = bufio.NewReader(os.Stdin) + defer func() { s.r = nil }() + } + return s.promptUnsupported(prompt) +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 15eda52090..daa2f72d3d 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -256,10 +256,10 @@ "revisionTime": "2017-01-12T15:04:04Z" }, { - "checksumSHA1": "4SfJoLxQlfSSQjBIMqK+IgNxLMk=", + "checksumSHA1": "lSRg5clrIZUxq4aaExbpnpAgtWA=", "path": "github.com/peterh/liner", - "revision": "bf27d3ba8e1d9899d45a457ffac16c953eb2d647", - "revisionTime": "2017-02-11T19:53:22Z" + "revision": "a37ad39843113264dae84a5d89fcee28f50b35c6", + "revisionTime": "2017-09-02T20:46:57Z" }, { "checksumSHA1": "WbbxCn2jUYIL5viqLo0BKXEdPrQ=", From 605c2b261f89c8398f2003a24e18a121d042cead Mon Sep 17 00:00:00 2001 From: ligi Date: Thu, 5 Oct 2017 20:08:14 +0200 Subject: [PATCH 193/272] mobile: fix variadic argument expansion --- mobile/bind.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/bind.go b/mobile/bind.go index 084d6ef4c7..7b79bedafd 100644 --- a/mobile/bind.go +++ b/mobile/bind.go @@ -165,7 +165,7 @@ func (c *BoundContract) Call(opts *CallOpts, out *Interfaces, method string, arg // Transact invokes the (paid) contract method with params as input values. func (c *BoundContract) Transact(opts *TransactOpts, method string, args *Interfaces) (tx *Transaction, _ error) { - rawTx, err := c.contract.Transact(&opts.opts, method, args.objects) + rawTx, err := c.contract.Transact(&opts.opts, method, args.objects...) if err != nil { return nil, err } From 5df0b240ae35b5c525323fff355922df44616150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lio=E6=9D=8E=E6=AC=A7?= Date: Fri, 6 Oct 2017 18:55:18 +0800 Subject: [PATCH 194/272] eth: fix typo (#15252) --- eth/backend.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/backend.go b/eth/backend.go index 99a1928fec..6a06bd829b 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -327,7 +327,7 @@ func (s *Ethereum) StartMining(local bool) error { wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) if wallet == nil || err != nil { log.Error("Etherbase account unavailable locally", "err", err) - return fmt.Errorf("singer missing: %v", err) + return fmt.Errorf("signer missing: %v", err) } clique.Authorize(eb, wallet.SignHash) } From d54e3539d453c78e30d950706f6465743723a33c Mon Sep 17 00:00:00 2001 From: Darrel Herbst Date: Fri, 6 Oct 2017 07:39:47 -0400 Subject: [PATCH 195/272] p2p/nat: delete port mapping before adding (#15222) Fixes #1024 --- p2p/nat/natupnp.go | 1 + 1 file changed, 1 insertion(+) diff --git a/p2p/nat/natupnp.go b/p2p/nat/natupnp.go index 6b3fa3f7a0..69099ac043 100644 --- a/p2p/nat/natupnp.go +++ b/p2p/nat/natupnp.go @@ -62,6 +62,7 @@ func (n *upnp) AddMapping(protocol string, extport, intport int, desc string, li } protocol = strings.ToUpper(protocol) lifetimeS := uint32(lifetime / time.Second) + n.DeleteMapping(protocol, extport, intport) return n.client.AddPortMapping("", uint16(extport), protocol, uint16(intport), ip.String(), true, desc, lifetimeS) } From 1ae0411d419d2178727048021f8dc09b6ccd1d82 Mon Sep 17 00:00:00 2001 From: holisticode Date: Fri, 6 Oct 2017 08:45:54 -0500 Subject: [PATCH 196/272] swarm/api: fixed 404 handling on missing default entry (#15139) --- swarm/api/api.go | 10 +- swarm/api/http/error.go | 46 +++++++- swarm/api/http/error_templates.go | 181 +++++++++++++++++++++++++++++- swarm/api/http/server.go | 66 +++++++---- swarm/api/manifest.go | 32 +++++- swarm/api/manifest_test.go | 15 ++- 6 files changed, 311 insertions(+), 39 deletions(-) diff --git a/swarm/api/api.go b/swarm/api/api.go index a5941fb5cd..79de29a1cf 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -144,9 +144,13 @@ func (self *Api) Get(key storage.Key, path string) (reader storage.LazySectionRe if entry != nil { key = common.Hex2Bytes(entry.Hash) status = entry.Status - mimeType = entry.ContentType - log.Trace(fmt.Sprintf("content lookup key: '%v' (%v)", key, mimeType)) - reader = self.dpa.Retrieve(key) + if status == http.StatusMultipleChoices { + return + } else { + mimeType = entry.ContentType + log.Trace(fmt.Sprintf("content lookup key: '%v' (%v)", key, mimeType)) + reader = self.dpa.Retrieve(key) + } } else { status = http.StatusNotFound err = fmt.Errorf("manifest entry for '%s' not found", path) diff --git a/swarm/api/http/error.go b/swarm/api/http/error.go index ebb5e3ebe2..b4d46b3c48 100644 --- a/swarm/api/http/error.go +++ b/swarm/api/http/error.go @@ -25,9 +25,11 @@ import ( "fmt" "html/template" "net/http" + "strings" "time" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/swarm/api" ) //templateMap holds a mapping of an HTTP error code to a template @@ -51,12 +53,14 @@ func initErrHandling() { //pages are saved as strings - get these strings genErrPage := GetGenericErrorPage() notFoundPage := GetNotFoundErrorPage() + multipleChoicesPage := GetMultipleChoicesErrorPage() //map the codes to the available pages tnames := map[int]string{ - 0: genErrPage, //default - 400: genErrPage, - 404: notFoundPage, - 500: genErrPage, + 0: genErrPage, //default + http.StatusBadRequest: genErrPage, + http.StatusNotFound: notFoundPage, + http.StatusMultipleChoices: multipleChoicesPage, + http.StatusInternalServerError: genErrPage, } templateMap = make(map[int]*template.Template) for code, tname := range tnames { @@ -65,6 +69,40 @@ func initErrHandling() { } } +//ShowMultipeChoices is used when a user requests a resource in a manifest which results +//in ambiguous results. It returns a HTML page with clickable links of each of the entry +//in the manifest which fits the request URI ambiguity. +//For example, if the user requests bzz://read and that manifest containes entries +//"readme.md" and "readinglist.txt", a HTML page is returned with this two links. +//This only applies if the manifest has no default entry +func ShowMultipleChoices(w http.ResponseWriter, r *http.Request, list api.ManifestList) { + msg := "" + if list.Entries == nil { + ShowError(w, r, "Internal Server Error", http.StatusInternalServerError) + return + } + //make links relative + //requestURI comes with the prefix of the ambiguous path, e.g. "read" for "readme.md" and "readinglist.txt" + //to get clickable links, need to remove the ambiguous path, i.e. "read" + idx := strings.LastIndex(r.RequestURI, "/") + if idx == -1 { + ShowError(w, r, "Internal Server Error", http.StatusInternalServerError) + return + } + //remove ambiguous part + base := r.RequestURI[:idx+1] + for _, e := range list.Entries { + //create clickable link for each entry + msg += "" + e.Path + "
" + } + respond(w, r, &ErrorParams{ + Code: http.StatusMultipleChoices, + Details: template.HTML(msg), + Timestamp: time.Now().Format(time.RFC1123), + template: getTemplate(http.StatusMultipleChoices), + }) +} + //ShowError is used to show an HTML error page to a client. //If there is an `Accept` header of `application/json`, JSON will be returned instead //The function just takes a string message which will be displayed in the error page. diff --git a/swarm/api/http/error_templates.go b/swarm/api/http/error_templates.go index 29bd3bfbb1..2c20ba8f99 100644 --- a/swarm/api/http/error_templates.go +++ b/swarm/api/http/error_templates.go @@ -165,7 +165,7 @@ func GetGenericErrorPage() string { - {{.Msg}} + {{.Msg}} @@ -339,7 +339,184 @@ func GetNotFoundErrorPage() string { - {{.Msg}} + {{.Msg}} + + + + + + Error code: + + + + + {{.Code}} + + + + + + + + +
+

+ Swarm: Serverless Hosting Incentivised Peer-To-Peer Storage And Content Distribution
+ Swarm +

+
+ + + + + + +` + return page +} + +//This returns the HTML for a page listing disambiguation options +//i.e. if user requested bzz://read and the manifest contains "readme.md" and "readinglist.txt", +//this page is returned with a clickable list the existing disambiguation links in the manifest +func GetMultipleChoicesErrorPage() string { + page := ` + + + + + + + + + + + + Swarm::HTTP Disambiguation Page + + + + +
+ +
+
+ +
+
+

Swarm: disambiguation

+
+
+
{{.Timestamp}}
+
+
+ + +
+ + + + + + + + + + diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index a637b87351..65f6afab72 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -441,14 +441,37 @@ func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) { return } - walker, err := s.api.NewManifestWalker(key, nil) + list, err := s.getManifestList(key, r.uri.Path) + if err != nil { s.Error(w, r, err) return } - var list api.ManifestList - prefix := r.uri.Path + // if the client wants HTML (e.g. a browser) then render the list as a + // HTML index with relative URLs + if strings.Contains(r.Header.Get("Accept"), "text/html") { + w.Header().Set("Content-Type", "text/html") + err := htmlListTemplate.Execute(w, &htmlListData{ + URI: r.uri, + List: &list, + }) + if err != nil { + s.logError("error rendering list HTML: %s", err) + } + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(&list) +} + +func (s *Server) getManifestList(key storage.Key, prefix string) (list api.ManifestList, err error) { + walker, err := s.api.NewManifestWalker(key, nil) + if err != nil { + return + } + err = walker.Walk(func(entry *api.ManifestEntry) error { // handle non-manifest files if entry.ContentType != api.ManifestType { @@ -495,27 +518,8 @@ func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) { // so just skip it return api.SkipManifest }) - if err != nil { - s.Error(w, r, err) - return - } - // if the client wants HTML (e.g. a browser) then render the list as a - // HTML index with relative URLs - if strings.Contains(r.Header.Get("Accept"), "text/html") { - w.Header().Set("Content-Type", "text/html") - err := htmlListTemplate.Execute(w, &htmlListData{ - URI: r.uri, - List: &list, - }) - if err != nil { - s.logError("error rendering list HTML: %s", err) - } - return - } - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(&list) + return list, nil } // HandleGetFile handles a GET request to bzz:/// and responds @@ -544,6 +548,22 @@ func (s *Server) HandleGetFile(w http.ResponseWriter, r *Request) { return } + //the request results in ambiguous files + //e.g. /read with readme.md and readinglist.txt available in manifest + if status == http.StatusMultipleChoices { + list, err := s.getManifestList(key, r.uri.Path) + + if err != nil { + s.Error(w, r, err) + return + } + + s.logDebug(fmt.Sprintf("Multiple choices! --> %v", list)) + //show a nice page links to available entries + ShowMultipleChoices(w, &r.Request, list) + return + } + // check the root chunk exists by retrieving the file's size if _, err := reader.Size(nil); err != nil { s.NotFound(w, r, fmt.Errorf("File not found %s: %s", r.uri, err)) diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index 90f287677b..d3eced1980 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -22,6 +22,8 @@ import ( "errors" "fmt" "io" + "net/http" + "strings" "sync" "time" @@ -422,25 +424,47 @@ func (self *manifestTrie) findPrefixOf(path string, quitC chan bool) (entry *man return self.entries[256], 0 } + //see if first char is in manifest entries b := byte(path[0]) entry = self.entries[b] if entry == nil { return self.entries[256], 0 } + epl := len(entry.Path) log.Trace(fmt.Sprintf("path = %v entry.Path = %v epl = %v", path, entry.Path, epl)) - if (len(path) >= epl) && (path[:epl] == entry.Path) { + if len(path) <= epl { + if entry.Path[:len(path)] == path { + if entry.ContentType == ManifestType { + entry.Status = http.StatusMultipleChoices + } + pos = len(path) + return + } + return nil, 0 + } + if path[:epl] == entry.Path { log.Trace(fmt.Sprintf("entry.ContentType = %v", entry.ContentType)) - if entry.ContentType == ManifestType { + //the subentry is a manifest, load subtrie + if entry.ContentType == ManifestType && (strings.Contains(entry.Path, path) || strings.Contains(path, entry.Path)) { err := self.loadSubTrie(entry, quitC) if err != nil { return nil, 0 } - entry, pos = entry.subtrie.findPrefixOf(path[epl:], quitC) - if entry != nil { + sub, pos := entry.subtrie.findPrefixOf(path[epl:], quitC) + if sub != nil { + entry = sub pos += epl + return sub, pos + } else if path == entry.Path { + entry.Status = http.StatusMultipleChoices } + } else { + //entry is not a manifest, return it + if path != entry.Path { + return nil, 0 + } pos = epl } } diff --git a/swarm/api/manifest_test.go b/swarm/api/manifest_test.go index 0208848a36..f048627c51 100644 --- a/swarm/api/manifest_test.go +++ b/swarm/api/manifest_test.go @@ -17,7 +17,6 @@ package api import ( - // "encoding/json" "bytes" "encoding/json" "fmt" @@ -72,11 +71,21 @@ func TestGetEntry(t *testing.T) { testGetEntry(t, "/a", "", "") testGetEntry(t, "/a/b", "a/b", "a/b") // longest/deepest math - testGetEntry(t, "a/b", "-", "a", "a/ba", "a/b/c") + testGetEntry(t, "read", "read", "readme.md", "readit.md") + testGetEntry(t, "rf", "-", "readme.md", "readit.md") + testGetEntry(t, "readme", "readme", "readme.md") + testGetEntry(t, "readme", "-", "readit.md") + testGetEntry(t, "readme.md", "readme.md", "readme.md") + testGetEntry(t, "readme.md", "-", "readit.md") + testGetEntry(t, "readmeAmd", "-", "readit.md") + testGetEntry(t, "readme.mdffff", "-", "readme.md") + testGetEntry(t, "ab", "ab", "ab/cefg", "ab/cedh", "ab/kkkkkk") + testGetEntry(t, "ab/ce", "ab/ce", "ab/cefg", "ab/cedh", "ab/ceuuuuuuuuuu") + testGetEntry(t, "abc", "abc", "abcd", "abczzzzef", "abc/def", "abc/e/g") + testGetEntry(t, "a/b", "a/b", "a", "a/bc", "a/ba", "a/b/c") testGetEntry(t, "a/b", "a/b", "a", "a/b", "a/bb", "a/b/c") testGetEntry(t, "//a//b//", "a/b", "a", "a/b", "a/bb", "a/b/c") } - func TestDeleteEntry(t *testing.T) { } From 36243c7ed8c53e9de92d21bbcf0378d7e1c7a07e Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Fri, 6 Oct 2017 15:53:29 +0200 Subject: [PATCH 197/272] internal/web3ext: make whisper v5 methods work (#15111) --- internal/jsre/deps/bindata.go | 2 +- internal/jsre/deps/web3.js | 3227 ++++----------------------------- internal/web3ext/web3ext.go | 103 -- 3 files changed, 353 insertions(+), 2979 deletions(-) diff --git a/internal/jsre/deps/bindata.go b/internal/jsre/deps/bindata.go index 782d4df808..c7dde71373 100644 --- a/internal/jsre/deps/bindata.go +++ b/internal/jsre/deps/bindata.go @@ -89,7 +89,7 @@ func bignumberJs() (*asset, error) { return a, nil } -var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xf9\x7a\xdb\x38\xb2\x38\xfa\xbf\x9f\x02\xd6\x3d\x37\x92\x62\x46\xf2\xd6\xe9\x34\xdd\xee\x8c\xb3\x74\xc7\x73\x92\x38\x5f\x12\x4f\xcf\x1c\x8f\x4f\x3e\x4a\x84\x24\x74\x28\x52\x3f\x92\xf2\xd2\xb1\xdf\xe5\x3e\xcb\x7d\xb2\xdf\x87\xc2\xbe\x70\x91\xed\xf4\x36\xf6\x1f\x89\x08\x14\xb6\x42\xa1\x50\x28\x14\xaa\x72\xfc\x7f\x96\x24\xc7\xfb\xbd\xc9\x32\x1d\x97\x24\x4b\x11\xee\x95\x41\x1a\xe4\xfd\x2f\x32\xa5\xe8\x65\xc1\xb2\xff\x85\x4c\x7a\xeb\xe9\x49\x76\xca\x7e\x95\xf0\xeb\x2c\xca\x51\xb4\x5f\x5e\x2e\x70\x36\x41\xa2\xae\xfd\x8e\x28\xda\x79\xf0\x80\x27\xee\xd1\x32\xcb\x07\x0f\xa2\x7e\x8e\xcb\x65\x9e\xa2\xa8\x97\x05\xeb\x9b\x7d\x9a\x4e\x44\x1a\xe1\x69\xb4\xd6\xc9\x7e\x8a\xcf\xd1\xcb\x3c\xcf\xf2\x5e\xe7\x79\x94\xa6\x59\x89\x26\x24\x8d\xd1\x3c\x8b\x97\x09\x46\xdd\xce\x46\xb6\xd1\xe9\x76\xfa\x7b\xe5\x2c\xcf\xce\xd1\x64\x30\xce\x62\xbc\xdf\x79\x73\xf4\xe2\xf8\xf5\xcb\x4f\x6f\x8f\x3e\x7e\xfa\xf1\xe8\xf8\xed\x8b\x4e\x30\xb9\xa6\xf5\x25\xfb\xb4\xef\xfb\x5f\xf0\xc5\x22\xcb\xcb\x22\xfc\x72\x7d\xbd\x47\xc7\x70\xb2\x79\x3a\x18\x47\x49\xd2\x4b\x06\x3c\x2b\x10\xbd\xef\x61\x36\xc0\x74\x1f\x00\xb7\x4e\x4f\xf0\xe9\x1e\xef\x6a\xd1\x4b\x9f\xa6\x21\xee\x5f\x07\x49\xa0\x4a\xe2\x80\xe1\xee\x9a\x43\xd1\x26\x45\x26\xf4\x82\xb4\xc2\xd5\x24\xcb\x7b\x14\x3a\xdb\xdf\xdc\xcb\xbe\xcf\x07\x09\x4e\xa7\xe5\x6c\x2f\xdb\xd8\xe8\x17\xbd\x9c\x22\x5e\x76\xe3\xba\xdf\xfb\xb2\x15\x9e\xc8\x2e\xf3\x2a\x02\x86\xa5\x80\xb7\xdd\xff\xb2\xc6\x12\x44\x67\xf6\x4f\xd6\x10\xfa\xb2\x86\x10\x42\x9d\x71\x96\x16\x65\x94\x96\x9d\x10\x95\xf9\x12\x07\x2c\x95\xa4\x8b\x65\x59\x74\x42\x74\x02\xdf\x02\x1a\xf2\xd2\x68\x8e\x3b\x21\xea\x7c\xca\xce\x53\x9c\x77\x02\x95\x43\x47\x47\x73\xa2\x38\xce\x71\x51\x74\x78\xce\x35\xfc\x7f\xca\xab\x16\xc5\xe1\x7f\x9e\x96\x2d\xcb\xe6\xf6\xb2\x4f\x5a\x11\xa3\xbd\xd1\x65\x89\x8b\x9d\x6d\x7f\x7b\x02\x48\x62\x7a\x0d\xa1\xeb\xe0\x4e\x10\x70\xa3\xfe\xc8\xe1\x68\xd8\x6b\x87\x80\x95\x51\xfd\x47\x1d\xfa\x38\x4b\x4b\x9c\x96\xb7\x1e\xfc\x9f\x72\xde\xe9\x8c\xfd\x61\xa6\x7d\x12\x25\xc5\x6f\x37\xf4\x1c\x17\x38\x3f\xf3\xad\xfa\x3f\xfa\xa4\x15\xcb\xd1\x7b\x3c\x25\x45\x99\x47\xff\x01\x93\x17\xd4\xd5\x81\xcf\x8f\x6e\xc5\xf7\xcb\x3c\x4a\x8b\x89\x97\xf5\xfd\x59\x70\x90\x5b\xa4\xb0\x3a\x12\x0a\x5c\x7e\xa8\x27\xa9\x3b\xc3\x85\xdd\xf4\x6f\xd2\xe8\x57\x9e\x80\xa8\x0d\xe2\xeb\x2a\x58\xe4\x64\x1e\xe5\x97\xde\x7e\x64\x59\xd2\x38\x79\x07\xbc\xad\x3f\x2f\x0a\xcd\x3d\xb8\xb6\x9a\x2a\x24\x3c\xaf\xdc\xc6\xff\x48\x48\xf0\xf6\x3e\x26\x45\x76\x9e\xde\xa2\xe7\x51\x9a\xa5\x97\xf3\x6c\x59\xac\xd0\x75\x92\xc6\xf8\x02\xc7\xc6\xde\x75\x67\x13\xab\x2a\xd7\xba\x63\xd6\x7e\x4e\xd2\xdb\x30\xee\x83\x25\x60\xe2\x65\x1a\xe3\xb8\x63\xa1\x09\x9f\x51\x42\xf8\x0b\xe0\x68\x44\xe2\xb8\x1d\x8e\x6e\x56\xff\x59\x94\x2c\xbd\xdd\x5f\x92\xb4\xdc\xfe\xe6\x71\xfd\x14\xbc\xc5\xe7\xcf\xc8\xef\x88\xfc\x5b\xad\xb9\xe7\xb3\x28\x9d\xfe\x9e\xa4\x73\x27\x94\x53\x51\xb7\x26\xd5\xd7\x52\x8d\x17\x33\xef\xd8\x6e\xd4\x88\xa0\xb5\xd3\xb5\xb5\xeb\xe0\xcb\xf5\x69\xb0\xfd\xbb\x1d\xfa\xff\x42\x67\xde\xdf\x49\x76\x9c\x2c\xd3\xf8\xc6\xa4\x72\xeb\x8d\xeb\xfe\xd8\xfb\xe7\x3e\xf6\xde\x1f\xfa\xfe\xc8\x67\x0e\xef\xe0\xf9\x79\xe1\x8f\x26\x6d\x7e\xdd\xcd\x5c\xed\x55\x3b\x77\xb6\x57\xad\x3a\xef\x93\x3c\x9b\xdf\x72\xda\xcb\xec\x96\x47\xcd\xdb\x09\x7c\xbf\xef\xba\xf9\x23\xe0\x8f\xa4\x31\xc9\xf1\xb8\x3c\xf4\xee\x99\x2b\xf4\xe4\x76\x13\x41\xc6\xd1\xe2\xe3\xef\x3a\x19\x7e\x4c\xb6\x3b\xed\xe2\x45\x56\x90\xba\x83\xfa\x22\xba\x8c\x46\x09\x36\x85\x82\xdf\x85\x2b\x55\xd1\xdc\x9d\x1c\xbf\x6e\x47\x03\x07\x62\xbc\x2f\x4c\x7c\xfe\xf6\x27\x99\x3b\x41\x52\x45\xdd\xed\xe8\xec\x77\x40\xff\x1f\x16\xeb\x77\x71\x7e\xbc\x31\x9f\xfc\xda\x58\xb7\x99\xde\x3d\xda\x5b\xa2\xfd\xd6\x1b\xd7\xd7\x9e\xd9\x43\xcf\x96\x56\x27\xc7\xed\xb6\x91\xe3\xc0\x78\x03\xed\x0b\x0b\x87\x5e\x77\x30\x9c\x64\xf9\x3c\x2a\x4b\x9c\x17\xdd\xfe\x1e\x00\x7c\xc8\x12\x12\x93\xf2\xf2\xe3\xe5\x02\x9b\xb0\xb4\x7d\x0a\xb5\x36\x7c\xf8\x70\x0d\x3d\x34\x20\xb9\xce\x1d\x91\x02\x45\x68\x91\x67\x19\x05\x46\xe5\x2c\x2a\x51\x8e\x17\xf4\x90\x95\x96\x05\xe2\x73\x87\x68\x26\xad\xe1\xb0\x44\xf3\xa8\x1c\xcf\x70\x11\xd2\x4f\x9e\xad\xfd\x3c\x39\xd5\x3f\x76\x8d\xaf\x53\x33\x73\xc7\xfa\x3e\x3d\x79\x7c\x7a\x72\x1a\xa0\xc1\x60\xb0\x86\x1e\x0e\x9d\xb1\x89\x1e\xef\x23\x69\x4d\xd3\xeb\xf3\x29\x2e\x67\xa4\x18\x7c\x82\x85\xf1\xa3\x40\x10\x05\x1c\x30\x74\x1d\xd2\x8c\xc3\xb4\xdc\xd3\x80\xd9\xbe\xed\x83\x3e\x82\x1c\xde\xdc\xde\xda\xf5\xde\xda\x9a\xa7\x1f\x83\x45\x9e\x95\x0c\x6b\xfb\x28\xc5\xe7\x46\x5f\x7b\x5f\xae\xfb\x7b\xf5\xa5\x06\x20\xbd\xe4\xcb\x71\x99\xd1\xc6\x3d\xb0\x4d\xed\x0e\x48\xc1\xe7\x5c\x21\x84\x92\xa3\x40\x0a\xb7\x6b\x59\x5f\xa7\x89\x03\x98\xb7\xde\x90\x63\xbb\xf7\xef\x93\xde\xc9\xe6\xa3\xef\x4e\x1f\xf6\xff\x7d\xda\x7f\x3a\xec\xb3\x71\x9a\x07\x87\xca\x6e\x5d\x07\x5f\x3a\x3a\x29\x76\xc2\xef\x82\x0e\xa3\xb7\x4e\xb8\xb5\x7b\x7d\x1a\x7c\xf3\x3b\x93\xf7\xb3\x2c\x4b\x1a\x68\x7b\x44\x41\x2a\x08\x9b\xe6\x89\xff\x19\x95\xc2\xaf\x5d\xf5\xf3\x54\x4b\xde\xd1\x3f\x9a\xc8\x18\x7a\x76\x53\x1a\xa6\x85\x57\x21\x62\x06\x6f\x53\x30\x4d\x5d\x91\x7c\xcd\x22\x35\xb4\xcb\x5a\xac\x2b\x7b\x13\xaa\xfd\x5f\x8a\x5a\x93\x66\x1f\xfe\x57\x2b\xa2\xe5\xfd\x69\xa6\xd8\xc7\xbf\x37\xc5\xd2\x3d\x4c\x92\x6c\xe9\xa7\xd9\x72\x86\x11\x6c\x76\x40\xb8\x03\x1f\xe5\xd2\x5c\xf9\x83\xd3\x25\xfc\xdc\xd5\x7e\x9f\xea\x19\x3b\xc6\x97\x49\xbf\x88\x6f\xad\xf2\xe7\x13\xa3\x1e\x5e\xd4\x43\xe5\xd0\xc9\x1b\x93\x39\x2d\xbd\x12\x9d\xb3\x02\x0e\xa1\xd3\xe4\x55\x29\xdd\x2c\x53\x47\xea\xac\xd1\xda\xd2\x37\x23\x76\x5a\x09\x23\xf5\x2f\x5b\xc1\x75\xff\x66\x84\xcf\x7b\xd7\x4c\xf9\xdf\xb6\xa1\xfc\xe1\x43\xe8\xf0\xc7\x19\x29\xd0\x84\x24\x98\x52\xea\x22\xca\x4b\x94\x4d\xd0\x39\x1e\xed\x0c\x7e\x29\x06\x6b\x00\xc2\xbf\x28\xc0\x24\xc7\x18\x15\xd9\xa4\x3c\x8f\x72\x1c\xa2\xcb\x6c\x89\xc6\x51\x8a\x72\x1c\x93\xa2\xcc\xc9\x68\x59\x62\x44\x4a\x14\xa5\xf1\x30\xcb\xd1\x3c\x8b\xc9\xe4\x12\xea\x20\x25\x5a\xa6\x31\xce\x81\xe0\x4b\x9c\xcf\x0b\xda\x0e\xfd\xf8\xe9\xed\x31\x7a\x8d\x8b\x02\xe7\xe8\x27\x9c\xe2\x3c\x4a\xd0\xbb\xe5\x28\x21\x63\xf4\x9a\x8c\x71\x5a\x60\x14\x15\x68\x41\x53\x8a\x19\x8e\xd1\xe8\x92\x53\x11\x46\x3f\xd2\xce\x7c\xe0\x9d\x41\x3f\x66\xcb\x34\x8e\xe8\x98\x03\x84\x49\x39\xc3\x39\x3a\xc3\x79\x41\x67\x68\x47\xb4\xc5\x6b\x0c\x50\x96\x43\x2d\xbd\xa8\xa4\x63\xc8\x51\xb6\xa0\x05\xfb\x28\x4a\x2f\x51\x12\x95\xaa\xac\x8b\x02\x35\xd2\x18\x91\x14\xaa\x9d\x65\x62\x65\x93\x12\x9d\x93\x24\x41\x23\x8c\x96\x05\x9e\x2c\x13\x26\x38\x8e\x96\x25\xfa\xf9\xf0\xe3\xab\xa3\xe3\x8f\xe8\xe0\xed\xbf\xd0\xcf\x07\xef\xdf\x1f\xbc\xfd\xf8\xaf\x3d\x74\x4e\xca\x59\xb6\x2c\x11\x95\x28\xa1\x2e\x32\x5f\x24\x04\xc7\xe8\x3c\xca\xf3\x28\x2d\x2f\x51\x36\x81\x2a\xde\xbc\x7c\xff\xfc\xd5\xc1\xdb\x8f\x07\xcf\x0e\x5f\x1f\x7e\xfc\x17\xca\x72\xf4\xe3\xe1\xc7\xb7\x2f\x3f\x7c\x40\x3f\x1e\xbd\x47\x07\xe8\xdd\xc1\xfb\x8f\x87\xcf\x8f\x5f\x1f\xbc\x47\xef\x8e\xdf\xbf\x3b\xfa\xf0\x72\x80\xd0\x07\x4c\x3b\x86\xa1\x86\x66\x44\x4f\x60\xce\x72\x8c\x62\x5c\x46\x24\x11\xf3\xff\xaf\x6c\x89\x8a\x59\xb6\x4c\x62\x34\x8b\xce\x30\xca\xf1\x18\x93\x33\x1c\xa3\x08\x8d\xb3\xc5\x65\xeb\x89\x84\xca\xa2\x24\x4b\xa7\x30\x6c\x49\x65\x08\x1d\x4e\x50\x9a\x95\x01\x2a\x30\x46\xdf\xcf\xca\x72\x11\x0e\x87\xe7\xe7\xe7\x83\x69\xba\x1c\x64\xf9\x74\x98\xb0\x0a\x8a\xe1\x0f\x83\xb5\x87\x43\xc1\x6c\xff\x06\x64\x3b\xce\x62\x9c\x0f\x7e\x01\x16\xf9\xb7\x68\x59\xce\xb2\x1c\xbd\x89\x72\xfc\x19\xfd\x77\x56\xe2\x73\x32\xfe\x15\x7d\x3f\xa7\xdf\x7f\xc3\xe5\x2c\xc6\x67\x83\x71\x36\xff\x01\x80\xe3\xa8\xc4\x68\x7b\x73\xeb\x1b\x60\x78\xcd\x5b\x41\x8d\x00\xab\x95\xe1\xf2\x98\x6f\xef\xe0\x92\x82\x06\x4c\x77\x41\x1f\xe4\x61\x5a\x9a\x80\x24\x2d\x7d\x70\xc7\x0e\xe0\xb2\x02\xf2\xc5\x65\x1a\xcd\xc9\x58\xb0\x71\xad\x44\xcc\x72\x80\x47\xf9\x4a\x7e\x28\x73\x92\x4e\xcd\x32\x05\xa4\xf9\xa0\xdf\xe3\xc8\x1a\x63\x8e\x23\xef\x18\x8f\x5d\xd0\x65\x15\xac\xa7\xdb\xb2\xbf\x00\x4c\x0a\x3e\x40\x83\x33\x17\x5a\x15\x01\xec\xb0\x9c\x4f\x0b\x0b\x71\x2d\x7f\x20\xab\x80\x6d\x84\x01\x5f\x5d\xc9\xd3\x23\xaa\x80\x3e\xc8\xf3\xe8\x92\x81\x33\x26\x6e\x89\x02\xcf\x29\x7d\x6a\x12\x00\x5f\x49\x8c\x43\xc4\xa8\xcc\x10\x4e\x29\x0d\x0f\x63\x4c\xff\x93\xad\x50\x66\x1c\x31\x36\x49\xb9\x12\x97\x6b\xcd\x8d\x99\xd5\xad\x8f\x98\x82\x15\xe6\xce\x0c\x49\x68\x1f\x6a\x28\x8c\x2e\x02\xef\x9f\xe3\x72\x96\xc5\x9e\x6e\x31\xe5\x7a\x96\xcf\x11\x93\x5c\x32\x63\x46\xd6\x10\x5b\x83\xbc\xf8\x27\x3e\x33\x3c\x0b\xfd\x0d\x7a\x8f\xbe\x30\xe2\xb9\x96\x62\xf9\xdf\x18\xe6\x0b\xf4\x45\xaf\xec\x1a\xb2\xe0\xad\x42\x81\xbe\xc0\xbb\x86\x6b\xc4\x3f\x09\xe5\x0d\x4c\x22\xa2\x64\x08\x7d\xa1\x3b\x11\x65\xf7\x80\x10\x03\x19\xda\x4e\xad\x77\xc9\xc1\x91\x40\x11\xc5\x66\x61\x8a\x77\x1a\xd6\x06\x13\x92\x94\x38\xef\x69\x65\xfb\x9a\x0e\x82\x53\x51\xc9\x85\x02\x41\x04\xa0\x53\xe8\x9f\x6c\x9e\xee\x31\xfe\x49\x26\xa8\xb7\xae\x37\xa2\xd7\xc1\x1e\x68\xb0\xa7\x1c\x5d\x92\x9e\x45\x09\x89\x15\x0d\xd0\x1a\xd7\x43\xd4\x45\x1b\x48\xaf\x7c\x4d\x97\x35\xf4\x9a\x4d\x0a\xac\xa0\x34\xb4\x48\x22\x92\x32\xfa\xb2\xa6\x91\x01\xbc\xe3\x39\xd5\xb3\xc8\xd3\x8f\x46\xbf\xe0\x71\x79\x6d\x55\x28\x26\x59\x95\x63\xd5\xc6\x16\x5c\xf5\xd4\x69\xdd\x70\x66\x2e\x60\xe5\x2d\x81\x0b\x26\x4d\x2b\x56\xf4\x4e\x28\xf0\x69\x80\x4e\x00\xfc\xb4\xdf\x0e\x35\x09\x29\x40\x02\x62\x8b\xaf\x1a\x3b\x85\x8e\x06\x60\x01\x0c\x3b\xbe\xf4\x85\x2a\x50\x85\x18\xa7\xd9\x56\xb8\x29\xdc\xa5\xcf\xb1\x53\x54\xd1\x77\x21\x08\x7c\x8a\x4b\x7d\x05\x16\x9c\x73\x70\x92\xa5\xc5\x78\xdf\x68\x09\xa3\x86\xc1\x3c\x5a\xf4\xaa\x78\x2c\x68\xe5\x3c\x6b\xc4\xe0\x9d\xac\xe6\x1e\xeb\xe9\x09\x14\x39\x65\xec\x59\x7c\xc9\x55\xa4\xf5\x87\xef\x53\x47\x93\x49\x81\x4b\xa7\x53\x39\x8e\x97\x63\xac\xf5\x2b\x1a\x8f\x03\xd4\xd0\x39\xc0\x4e\x19\x95\x64\xfc\x2e\xca\xcb\xd7\xf0\x92\xc8\xaa\x79\x60\xe7\xf7\x3c\xfd\x14\x75\xe5\x94\x29\xe1\xf8\x83\x5b\xe5\x9b\xa8\x9c\x0d\x26\x49\x96\xe5\xbd\x9e\xd3\xe2\x06\xda\xd9\xea\xa3\x21\xda\xd9\xee\xa3\x87\x68\x67\x9b\x0f\x5a\x43\x5f\x34\x1e\xa3\x0d\xd4\x93\x9b\x8e\x81\xf5\x0a\x14\xa2\xa7\xda\xde\x85\xd0\xce\x36\x0a\x8d\x84\x8a\xce\x0a\xd4\x07\x68\x53\xc7\x7e\x8e\x8b\x65\x52\x0a\xea\x61\x33\xf8\x66\x99\x94\xe4\x67\x52\xce\xd8\x9c\x08\x0a\x34\xfa\x16\x48\x3a\x0a\xcc\x19\x14\x95\xf3\x11\xb2\xfa\xcd\x13\x9f\x9f\xf4\xad\x56\x7d\x6b\xa0\x65\x0f\xb4\x35\x22\x87\xd7\xe9\xec\xa9\x85\x83\x93\x09\x1f\x31\xef\x2c\xdf\x15\xb2\xfc\x65\x34\x9e\xf5\x6c\xc6\x44\x74\xda\xa2\x5c\xbf\x72\xbe\xd4\x5c\x9d\xf6\xf5\x42\x0c\x21\xd0\x95\x0d\x57\xdb\xd9\x33\xbb\x2f\xd6\x91\x46\x84\x72\xed\x52\x2a\xc6\xc9\x84\x83\xd8\x73\x04\x1d\x70\xbb\x24\xf0\x04\x1f\xf6\x64\xe9\x4d\x98\x4b\x71\x63\x1f\x61\xfe\x0c\x0f\x0d\xd1\xb6\x02\xbd\x46\x38\x29\xb0\x35\xbc\xe1\x10\xc5\x59\xda\x2d\x51\x14\xc7\x88\x97\x2a\x33\xb3\xca\x01\x22\x65\xb7\x40\x51\x92\xe3\x28\xbe\x44\xe3\x6c\x99\x96\x38\xae\xc0\xd2\x57\x1a\xe7\xb5\x5a\x84\xc3\x21\xfa\x78\xf4\xe2\x28\x44\x13\x32\x5d\xe6\x18\xd1\x03\x5b\x8a\x0b\x7a\x02\xa4\xa7\xb4\xcb\xc2\x64\x56\xbf\x05\x91\xfc\x71\x26\xd9\x9c\x0c\xac\x23\x50\x60\xa5\x62\x99\x4b\xb4\xe6\x78\x12\x81\x3a\xe6\x7c\x96\x25\x98\xf5\x90\xa4\xd3\xf5\x06\x46\x50\xc3\x03\x6c\xce\xcf\x07\x1d\xa0\xcc\x59\xf9\xc6\x22\x17\x73\xd2\x28\xea\x7b\xb6\xb8\x9e\xab\x1a\xd3\x08\x88\x35\x8c\xce\x23\x45\xd6\x05\x2e\x9d\x39\x65\x64\xf5\x36\x9a\x63\x7b\x1f\x52\x39\xba\x9c\xe9\x96\xf5\x6c\x3e\xf5\xfb\x99\xaa\xd8\x53\xa7\xe4\x8b\x1c\x83\x4a\xaa\x15\x7f\x35\xc3\x16\x95\x2c\x72\x7c\x46\xb2\x65\x21\x3b\xb4\xbd\x47\x51\x42\x52\x44\xd2\xd2\x29\xd1\x84\x7f\xad\xbf\xbe\x06\xe9\xdf\x24\xcb\x11\x3c\x12\x26\x68\x1f\x6d\xed\x21\x82\xbe\x17\x03\x10\xef\x85\x11\xd9\xd8\xa8\x2a\x4e\xff\xac\x3e\x6f\xec\xa3\x8d\x9e\xc0\x01\x41\x8f\xd0\xd6\x29\x95\xf0\xd1\xd5\x15\xda\xdc\xab\xac\xa4\x86\x95\x73\x7a\xd8\x40\x04\x3d\xac\x9a\xb9\x0d\xbb\x17\x54\x38\xa8\x62\xfb\xe2\xef\xda\x49\x35\x53\xae\xfb\xbd\xbe\x35\x85\xc3\x21\x9a\x90\xbc\x28\x11\x4e\xf0\x1c\xa7\x25\x3d\x5f\x31\x34\x05\xa8\xf8\x4c\x16\x88\x94\xab\x4c\xb9\x81\xfd\x4d\x1f\xf6\x29\xfe\x6a\x67\x00\x9e\xce\xc7\x31\xa1\x8d\x44\x89\x5c\xe4\x1c\x9f\x0e\xff\x71\xf1\xed\xe7\x8b\x8a\x74\x2a\x18\xc4\x09\x41\x1b\x68\xeb\x54\xf0\x09\xb4\x81\x9c\x6e\x78\xd0\xde\x88\x60\x8b\xf9\x79\x20\xf9\x56\xe9\xa1\x7d\x46\x15\x37\x66\x3d\x7f\x68\xa6\x42\x85\x2d\x13\x53\xb7\x5c\xfc\x0d\x94\x89\xaa\x18\xd2\x66\x1d\x43\x42\xad\x68\xba\x91\xa3\x0c\x87\x68\x1c\x25\xe3\x65\x12\x95\x58\x08\x3e\xf4\xc8\xc7\xfb\x82\x48\x89\xe7\xb7\x60\x47\x94\x15\x9d\xfc\x89\x98\x52\xdf\x86\xbd\x5e\x69\x5f\xb9\xe5\x84\xfc\x7e\x0c\x46\x67\x2e\x5f\x9d\xb7\x20\x47\x5b\xc4\xfb\xd1\xa0\x0d\xe1\xba\x48\x7e\x33\x99\xd5\x68\x8c\x18\x64\x6b\x8d\x91\x48\x97\xb7\x9a\x52\x25\xe2\xd7\x25\x55\xeb\x41\xb4\x86\x3d\xe2\x1f\xd4\xef\xd3\x11\x69\xc5\x94\x8e\x88\x41\x83\x6c\xd3\x06\x2d\xb5\x4a\xa2\x0a\x84\x54\xe9\x88\xaa\x11\xc2\x4b\xc0\x09\x03\x5a\x53\x88\xa9\xd7\x10\xe9\x43\xf4\x9d\x8e\x0d\xdc\xac\xae\x20\x12\xa5\x18\x15\xeb\xf0\x8c\x88\x0b\xef\x29\xdc\x3a\xee\xdf\xb1\x46\x89\x0d\xb9\x07\x23\x13\xeb\x4b\xa9\x45\x0c\xbd\x88\xa8\x51\x69\x98\xea\x54\x0e\x6a\x54\x8d\x7a\x06\x1d\xa3\x8c\x03\xd1\x32\x77\x3d\xd2\x36\xea\x28\x79\x12\xf5\xc9\xc1\xbc\x6b\x95\x4c\x72\x38\x44\xc5\x72\xce\x6e\xe8\x3c\xbb\x14\x17\x11\x25\x3c\xaf\xee\x84\x9c\x52\xae\x28\xbf\x60\x4b\xf2\xf1\x1f\xd1\xbc\x89\x08\x21\x6d\x3a\x28\x18\x0e\x51\x8e\xe7\xd9\x19\x5c\x63\xa2\xf1\x32\xcf\xa9\x7c\x2a\x85\xd3\x0c\x92\x79\x37\x49\x01\x3d\xf7\xf4\xb6\x58\x45\xe3\x27\x90\xd9\x5a\xf3\x67\x8c\x0c\x3d\x72\xea\x6f\x4d\x69\x1f\xac\x75\x58\x71\xad\xe3\x3d\xb5\x0a\x1e\xe7\xa1\xb2\xd2\xba\x72\x10\x64\x45\x77\x30\xfd\x92\xc4\xbc\xbf\x60\xbd\xa5\x6d\x8d\xf9\x2d\x93\x6e\x6a\x01\xbd\xef\x31\x7b\x55\xdb\x04\x83\x5f\x8b\xf6\xfa\x81\x37\xfb\x59\x96\x25\x55\x79\x54\x08\xa9\xc8\x3a\xae\xc9\xd3\x2f\x37\x2b\x9b\xad\xcb\x64\x5c\xb8\x2a\xf7\x3d\x8e\x2a\x7b\x7c\xcc\x32\xd7\x28\x41\xb8\xf6\x1b\x80\x3a\x69\xb3\x21\x0c\x67\xc3\xdd\xa0\xc3\xee\x7e\x3b\xe1\x37\xf0\x93\xf6\xad\x13\x3e\xa6\xbf\xf5\xeb\xd8\x4e\xf8\x24\xf0\xd9\x7a\x90\xb4\xec\x84\x5b\x9b\xf4\x67\x8e\xa3\xa4\x13\x6e\x6d\xd3\xdf\xec\x56\xb6\x13\x6e\xed\xd0\xaf\x25\x83\x82\x06\x96\x1c\xec\xf1\xf5\x69\xf0\xe4\xb7\xb4\x8b\x6a\xb8\x86\xbe\x99\x35\x91\x5e\xc9\x2a\x46\x45\x66\x39\xdb\xb6\x48\xcf\x5d\xd1\xc4\xc8\x5f\xb4\xc6\xd2\xc8\xec\x49\x9b\xba\x6e\x61\x77\x54\x61\x6c\xd4\xaa\x51\xed\x4a\xdc\x3b\x5d\x82\xed\xe4\x4b\xdc\xc2\x84\xc9\x1a\x76\xb3\x25\xd3\x77\xf7\x96\x4c\xf7\x96\x4c\xff\x29\x96\x4c\x6a\x21\xdc\x95\x39\xd3\x33\x32\x7d\xbb\x9c\x8f\x80\x15\x4a\xee\x3c\x22\xd3\x14\x12\x07\xbf\x48\x4e\xbe\x2c\x49\x62\xda\xd7\x0c\x86\x90\xc6\xfe\x15\x60\x63\x2f\xc8\x38\x4b\x27\xc4\x31\x06\x12\x27\x33\x6d\x57\x80\xb3\x0b\x6c\x0b\x62\xe0\x8c\x57\x17\x08\xf8\x3d\x82\x07\x1b\xf4\x9c\x45\xf9\x96\xb2\x92\x85\xa5\x40\xe7\x06\x94\x33\x0f\x29\x8e\x19\x24\x29\x50\x8a\xa7\x51\x49\xce\x70\x20\x38\x11\x5c\x1c\x95\xe7\x59\xb7\x40\xe3\x6c\xbe\x10\xd2\x2a\x94\xa2\x73\x2b\x4b\x4e\x92\x2c\x2a\x49\x3a\x45\x8b\x8c\xa4\x65\xc0\xae\x43\x29\xd9\xc7\xd9\x79\x6a\x9d\xe9\x4c\x35\x89\x7b\x7c\xbb\x62\x58\xbe\x92\xf8\xbe\x16\x63\xa1\x4b\x29\xc5\x38\x86\x53\xf4\x48\xcd\x71\xec\x37\x86\x01\xa4\x5d\x4b\x3b\x1f\xb3\x5d\x83\x01\x43\xfd\x82\x0b\xcb\x76\x07\x6c\x2e\x7a\xe3\xc1\xcb\x8f\xaf\x3e\x3d\x3b\xfc\xe9\xed\xf1\x9b\x67\x2f\xdf\x7f\x7a\x7f\x74\xfc\xf6\xc5\xe1\xdb\x9f\x3e\xbd\x39\x7a\xf1\x52\x3b\xc3\x49\x4d\x1c\xcc\xe4\x60\x11\xc5\xaf\xf1\xa4\xec\xb1\xaf\x32\xfb\x78\x9e\x15\xcf\x25\x16\x79\x9b\x83\x32\xe3\xe2\xd2\xd6\xe3\x7e\x80\x1e\xef\x9a\x37\x3c\xfa\x6e\x09\xc3\xe9\xb1\x46\x4c\x03\x0c\x73\xe2\xc5\xe1\xb7\x02\xe7\xcf\xe4\xd9\xd8\x3c\x34\xaf\x8a\x43\x57\xea\x30\xb0\xe8\x41\x48\x99\xbd\xc2\x17\x62\xdc\xc5\x72\x54\x94\x79\x6f\x5b\xc3\x5f\x62\x5d\xed\xb3\xe2\x42\xcb\xbd\x81\x1e\xef\xf4\xd1\x50\x47\x91\x8d\xee\xf7\x64\x3a\x2b\x79\xb1\x00\x25\xe8\xe1\x57\xc6\x27\xdf\x81\xef\x14\xad\x95\x32\xdd\xad\xb1\x2b\x8e\x67\x26\x5a\xa5\x76\xee\x77\x9b\x01\x4b\x6d\xca\x1a\xeb\x0f\xd8\x9a\xdf\x40\xcd\x13\xd4\xc4\xe9\x98\x24\x5f\xbd\x22\x3e\x88\xfc\xdb\xce\x9d\x34\xee\x6c\x3f\x6b\x93\x3c\x9b\x1f\x97\x93\x27\xf7\x13\xe7\x99\x38\xfe\xce\xa8\x8a\x91\xf1\x57\x48\x62\xd2\xe8\x37\x8e\xd2\xd5\x19\x99\xfd\xe4\xa8\x7a\xce\xba\x9b\xb7\xfb\xeb\xa2\x0d\x5e\x3d\x7a\x8a\x50\x77\xab\x8b\x42\xd4\xdd\xec\xde\x9e\x47\x35\x61\x92\x9e\x58\x69\xa9\x7f\x50\xb8\x02\x51\xc1\x78\xbe\x4c\x4a\xc2\x84\xca\xd1\x25\xda\xfe\xdf\x39\x15\xcf\xa5\x0d\x5d\x44\x6b\x2e\xf1\x14\xe7\x35\x5b\xc9\x7b\x5e\x6b\xd3\xfe\xbd\xea\x8c\x70\x5b\xe6\x8a\x19\xe1\x68\xb2\xa8\x8f\x62\x4d\xb6\x28\x37\x57\x32\xc7\x85\x95\xb5\xdd\x1f\x2c\xb2\xf3\xde\xd6\xf6\x93\x7e\xdf\x44\xe9\xf3\x19\x1e\x7f\x46\x64\x62\xe0\x54\x13\x8b\x2c\x44\x14\x64\x9a\xe2\xf8\xb0\x78\xab\xb2\x1d\x45\xb4\xac\x63\x86\x2f\x78\x8f\x4d\x64\x08\xa2\x85\x43\x1f\xb4\x5d\x9a\x92\x58\x46\x8f\x2c\xe7\x84\x8a\xe1\x51\x52\x28\xab\x65\xbb\xf5\x46\x7c\xf9\x30\x24\xd8\xcd\x66\x80\xb6\xfa\x01\xda\x7a\xac\xc9\x23\xdb\x7d\x23\xb7\x8f\xf6\xf7\xf7\x29\xc9\x7a\xa9\x30\xa7\xec\xe3\x51\x94\x40\xa7\x10\x53\x1d\xa8\x0b\x0f\x26\x6a\xba\x44\xc4\x14\x09\xb6\x10\x68\x90\x87\x63\x07\x4b\x71\xa6\x04\xc3\x9a\x76\xa5\x70\x08\xcb\x82\x4c\x11\x93\xd3\x2d\x7a\x93\x5d\x30\xf0\x67\x18\xc5\x52\x60\x36\x8f\xfb\xac\x37\x9a\x2e\xb3\xd7\x47\x57\x57\xa8\xb3\xd9\xe1\x3a\xe2\xe1\x10\x8d\x25\x15\x51\xe1\x59\x4c\xa4\x6c\x9d\x01\x91\x92\x4d\xb4\x94\xb4\x5d\x21\x5b\xdc\xdf\x5a\xf3\xcc\xe7\xd6\xa3\x82\xf4\xcc\x2f\x9b\xd2\x39\x49\x97\xf6\x2a\xe8\x4e\x6e\xf9\xd7\x85\xba\x45\xe5\x5b\xf2\x7a\xac\x45\x87\x6e\x40\x41\xcb\x7a\x12\x3a\xae\xa5\x21\x1f\xf5\xe0\x95\xc8\x87\x37\xef\x12\xce\xf1\x5d\x50\xce\xd7\x41\x19\x67\xf9\x55\x28\x73\x78\x77\x23\xca\x00\x63\x9a\x48\x6c\xa2\x88\x37\xe7\xa2\xc8\x61\xe6\x3e\x8b\x73\x6b\x31\x72\x98\x41\x4c\xce\x48\x8c\xe3\x67\x97\x35\x3c\xfc\x26\xd4\xd4\x80\x9b\xe3\xbb\x46\xce\xb2\x12\x3b\xc7\x2b\xa3\xe7\xf8\x36\xf8\x71\x6f\x61\x59\xd5\x12\x45\x55\x12\x97\x7a\x30\xdd\x1a\x2f\x62\x67\x33\xe7\xa2\x12\x47\xbc\x69\x17\x45\x8e\x7c\xe6\xc3\x90\x67\x79\xc1\x7e\x75\x4b\x81\x6d\xab\x8b\x9e\xb2\xad\x99\x7b\xc6\x58\x0d\x9b\x95\x27\x47\xed\x5d\x6e\xcd\xde\x97\xe0\x89\x42\x1c\x95\x20\x6a\xce\x36\x8e\xe8\x91\x46\x73\xcc\x1e\xf8\xd0\x5f\x96\x08\xc6\x61\x68\x9d\xb2\x06\x0f\xe6\x9d\x43\x28\xb4\x11\x20\x5d\x59\x4e\x0b\xf1\x27\xd6\x68\x1f\x55\xbd\xd4\x7d\xd8\x1f\x6a\x47\x9a\x82\xfc\xca\x79\x62\x01\xb7\x54\xbc\xfc\xc9\xd6\xa9\x29\x0a\x77\x37\x2f\xa8\xc8\xec\x4e\xee\xa0\x48\xc8\x18\x53\xc9\x64\x1b\x3d\x84\xea\x56\xa4\xf3\x86\x99\xd1\x4f\xe1\x77\x36\x41\xab\xa2\xbf\x52\x15\xe0\x6c\x32\xf2\x88\x68\xf1\x01\x86\x38\x7e\x09\x66\x63\xee\xf1\x6e\x9f\xef\xe1\x65\xc6\xe1\xfb\xe8\xa1\x38\x55\xfa\x66\xc0\xaa\x88\x49\x87\x8f\x77\x03\xde\xfe\x6a\x53\x50\x73\x2a\x67\xc3\xf7\x1c\xcb\xef\x14\xfb\x51\x31\x26\xa4\x0e\xff\x9e\xe3\xfc\x6f\x88\x79\xa1\xd5\x01\xed\x40\x3b\xfc\xaf\x36\x01\xca\x3d\x4d\xd5\x0c\x1c\x28\x07\x36\x15\x53\x50\xc9\xdb\x2b\x50\x2e\x2b\x74\xb1\xed\x73\x60\xb3\x82\x34\x65\xe0\xae\xb3\x79\xd1\x41\x1b\x88\x9f\x71\x00\xed\xec\xb7\x34\x2b\xd8\xdd\x0c\x90\x9e\x54\xe5\x33\xe0\x8b\x30\xfd\xd0\xce\x9a\xa1\xf5\x1d\xd8\x30\xb0\x62\x43\x27\xc5\x81\xd3\x17\x78\x58\x95\xe1\x94\x62\xc8\x0c\xdd\x24\xb7\x1f\x59\x96\x84\x76\x82\x03\x45\x25\x90\xd0\x4e\xd0\xa1\xa4\x58\x16\xda\x09\x2e\xd4\xb1\x03\x76\xec\x85\xd3\x1b\x55\x29\x9e\xfa\x5c\xc0\x63\x3f\xa4\x3e\x58\x95\xe2\x81\xd3\xb1\xad\x25\xb9\x90\xbe\xe9\x71\x73\xdc\x72\xe6\x04\xe9\x69\x2e\x2c\xa7\xfa\xd0\xbb\xee\xae\xc5\xb5\xae\x79\x39\xd4\x09\xb7\x9e\x04\x1d\xf3\x52\xa9\x13\x6e\x83\x05\x03\x2c\x8c\x4e\xb8\xb5\x15\x74\xf4\xab\xa9\x4e\x68\x7e\x5e\x9f\x06\x5b\x9b\xbf\xb3\x4b\x97\x43\x66\x1b\x5f\xe3\x83\x88\xa4\x65\x95\x0b\x22\x7e\x7b\x45\xd2\x92\x79\x67\xa1\x3f\x76\xe5\xaf\x53\x95\xb8\xa3\xfd\xb6\x9c\xb7\x90\xb4\x64\xae\x5b\x48\x5a\x3e\xde\x95\x60\x4f\x54\x45\xdb\xdf\x3c\xae\xa8\x8b\xc2\x37\xb8\x32\xb2\x8f\x86\x5f\xd1\x1b\x17\x80\xdb\x66\x08\x87\x69\xb9\xa2\xe5\x85\x51\xa2\xc6\xe0\x02\x9a\xab\x29\x79\x23\xf3\x0a\x92\x96\x42\x54\x7c\x7a\x23\x97\x2e\xac\x57\xcd\x66\x10\x5b\xad\xa2\xd8\xdd\xdb\x41\xdc\xdb\x41\xfc\x79\xed\x20\x90\x32\x84\x60\xa2\xd2\x1d\xd9\x40\xb4\x30\x6d\xb0\x59\x3d\x33\x5d\xc8\xc0\x20\x5d\x79\xee\x18\x78\x24\xd4\xf3\x19\x4e\xe5\x7b\xc5\x80\xd9\x7e\x53\x01\x5c\x3a\x70\x10\x92\xe5\xd0\x6b\x1b\x61\xa9\xbf\xed\xe7\x89\xc0\x49\x85\xfc\xc8\xfe\xbf\xba\x42\xdd\xae\xc6\x67\x33\xf1\x72\x81\xfd\xd8\xd3\x9e\x1a\x92\x94\xb7\xde\xda\xe3\xc7\x14\x97\xba\xc9\x2f\x18\x90\x77\x0b\xf1\x10\x14\x78\x09\xad\xc4\xb0\x76\x57\xf2\x3d\x33\x76\x35\xa5\x68\xa1\x66\x52\xb5\xea\x95\xa1\x9e\xe8\x63\xdf\x30\x68\x07\xf4\xe8\x06\xed\x76\x23\xb5\xa6\x68\x60\xe5\x6f\x1c\x3b\xf4\xeb\xc7\xd6\xc8\x18\xe7\x98\x12\x93\x58\x0f\xa6\x5b\x16\x46\xee\x31\x99\x4c\x30\x18\x24\x33\x94\x5b\xe7\x92\x73\xf9\x2e\x44\x3f\x8e\x08\x94\xf0\x59\x12\xb6\xcb\xa9\xf7\x10\x62\x1e\x5d\xe8\x76\xe8\xeb\x47\xb4\x60\x1c\x46\xf6\xa2\x1a\x95\xe7\xfe\x37\xb3\x26\xdd\x55\xde\xea\x29\x82\x94\xa4\xba\x0a\x46\xb3\xf9\x88\xa4\xae\x87\x9b\x32\x9b\x62\xca\xdd\x69\x0d\x78\x3a\x60\x8b\x2a\x5a\x2c\x70\x0a\x6b\x29\x4a\xd9\x1b\x08\x0b\xbb\xbc\xb6\xa6\x7b\x18\xce\x98\x66\x64\x4c\xd9\x93\xe8\x55\x73\x61\x7e\x81\x9a\x4d\x38\x2c\xec\x43\xb5\xa8\x15\xc3\x6b\xd2\xfb\xd5\xa1\x55\xea\x2d\xd8\x95\xc9\x1e\x6a\xc6\xee\x38\x4a\x12\x8e\x5f\x71\x8d\xc3\x46\x34\x8b\xd4\xd2\x2d\xc8\xaf\xdc\xb9\x20\x5c\xd7\xcd\xa2\x22\xa0\xff\x0b\x42\x03\xf7\xbf\x9e\x7b\x3b\x1d\xdf\xd2\x16\xd4\xaf\x33\xad\x45\x8d\xdf\x3b\x93\x6f\xe1\xf2\x55\xb1\xbe\xbf\x0f\xd2\xc5\x84\xa4\xd6\x5b\xa5\x26\x24\x28\xaf\x45\xbc\x2a\x7e\xc3\x6c\x2b\x0d\x58\xee\x41\xf1\xac\xfa\xe8\xcf\x34\xbe\xae\x86\xa6\xc5\x32\x33\x6a\xaf\x1b\xf4\x3a\x8c\x5a\xb9\x00\xe8\xa3\xa7\xa8\xdb\x45\x61\x3b\x83\x2c\x0d\x65\x5e\xb3\xac\x15\xf0\x46\x79\x3f\x53\x4e\x48\x99\xd1\xf7\xdc\x4b\xe9\x2f\xfc\x38\x13\x7b\x8f\xb8\x15\x8e\x74\x86\x1f\xcd\x75\x22\x03\x12\xaf\xc5\xa2\x6a\xcc\x8b\x42\xf0\xab\x64\xe3\xcf\xe7\x9f\x49\x2e\xaf\x3d\xc4\xae\xfc\x50\x05\xdd\xf1\x09\xeb\xad\x8e\x3a\x63\x5b\xab\xc0\x9d\xb6\x29\xf9\x91\x27\x12\x22\x71\x09\xdf\x02\x8b\x78\xbe\x28\x2f\x75\x95\x60\x8b\x4d\xb4\x71\x15\x9a\xf4\xa8\xb1\xa7\x10\xa4\x8f\x15\x70\x23\x3c\x4e\x55\xfa\x9a\xf2\x62\xa2\x76\x20\xbc\xca\xa6\x31\x18\x17\x2b\x1b\x1e\xb1\xe0\x26\xe3\x50\x8f\xf1\xaa\xfd\x43\xbd\x26\x45\xe9\xbc\xfc\x3b\x31\x46\x73\xea\x71\x0a\x55\x3b\x7a\x55\xb3\xbb\xbd\xc8\x77\x41\xe2\xa6\x7e\xb9\x88\x99\x65\x2b\x7f\x07\x27\x55\x91\x65\x56\x6a\x6f\x5d\x59\x61\x21\x1c\x31\xbf\x43\xc8\x78\xdb\x27\x9f\x10\x72\x50\xf3\x59\x91\xb1\xb7\xc9\xf5\xc8\xb6\xaf\x8a\x05\x69\xdf\x7e\xd9\xce\x42\xcc\xe6\xd1\xbe\xde\x63\x05\xab\x0f\x63\x63\xdf\x55\xf4\xf3\xd7\x5a\xee\x0b\x2d\x06\xa9\x44\xa0\x5e\xa6\xbf\xba\x95\xaf\xe6\x86\x43\x31\xdd\xf8\x0c\xe7\x97\xe5\x0c\x7c\x91\x68\xf5\xe8\xd8\x71\x1d\x4f\x09\x8b\x34\x07\x3f\xc6\x4b\x5d\xff\x0d\x85\xf4\xbd\x74\xa7\x4d\xb8\x4a\xe7\xeb\x00\x75\xbb\x42\xf9\x5e\xa3\xa4\x78\xc7\x66\xc9\xd2\xe9\x49\xf5\xdd\xf5\x69\xb0\xd5\x2a\xd6\xde\x57\xd4\xc9\xc1\x6d\x74\xbd\x52\x2e\xa7\x20\x15\x5a\x39\x61\x66\x46\xff\x67\xaa\x32\xf8\xb5\xab\x7e\x9e\x6a\xc9\x3b\xfa\x87\xa5\x9b\xa3\x69\x4c\x39\x47\x7f\x09\xed\x1c\xfd\xfd\x44\xab\x4e\xd3\xcf\x39\x35\xb6\xd0\xd0\x39\x77\xef\xab\xa8\xe8\x68\xe1\x55\x74\x74\x0c\xde\x56\xd2\xd1\xd4\x15\xb5\x74\x66\x91\x1a\x35\x1d\x6b\xb1\xae\xec\x4d\x14\x75\x14\xb7\x15\x8a\xba\x76\x8e\xf2\x79\xb7\x5a\x28\xea\x5a\x45\xf3\xfa\x5a\x8f\xeb\x3c\xb7\x7f\xab\x90\x07\x2b\xbe\x0a\x81\x88\x12\x36\x89\xb0\xf4\x15\x89\xc4\x2e\x54\x43\x26\xa2\xdd\xfa\xf2\x37\xd2\xe9\x32\x49\xaa\xcd\x9b\x39\x4f\x7b\x77\xfb\x5a\x4e\x8e\xb2\x05\xdd\xdd\x7d\xf4\x91\xda\xf7\x3b\x1e\x3e\xac\xb9\xb8\x25\x45\x7b\xdf\xb6\x63\x9c\x97\x11\x49\xfd\xfe\x6d\x1d\x44\xb2\xdb\xa4\x06\xa2\x66\x40\x03\x33\xbd\x9e\xac\x79\x11\x2b\xa3\xd1\x1b\x44\x89\xf3\x39\x3d\xf2\x93\x09\xd4\x6c\xf6\x3b\xe6\x5e\x6b\xd1\x94\x9c\xe1\x54\x98\xb4\x98\x47\xea\x2a\x77\xb9\x96\xfd\x0b\x3b\x66\x2b\x8b\x5b\xc0\x32\xab\xdc\x69\xd7\x6f\x7f\xab\x43\xb4\x5f\x22\xcc\x39\x6d\xa7\xf4\x0a\xc7\xd9\x19\xce\xf3\xf3\x9c\x94\x25\x06\x73\x2f\xd6\xab\x0e\xda\x80\xde\xb7\xc6\xdd\x39\x68\xd9\x0b\xfd\x21\x3f\x58\x41\xa8\xa3\x28\x49\x39\x0a\x4b\xd7\xef\xb0\xfd\xd6\xbe\x15\x32\x5d\xad\xa4\xd5\x9c\xd2\xda\x56\xe0\xcd\xe3\x42\xc0\x8f\xc1\xe1\x10\x54\xe1\xd1\x9c\xae\x0a\xf0\x7a\xc8\xb5\x59\x74\xbc\x94\x13\x60\x76\xc7\x90\x90\xcf\x18\x45\xa8\x20\xe9\x34\xc1\xd2\x0f\x17\x40\x0e\x0c\x93\x68\xa0\x60\xe6\x66\x86\xb9\xe5\x60\xad\x5d\x5d\xa1\x93\xee\xc9\xd6\x69\xf7\xb4\x2f\x85\xc1\x06\x37\x00\xbc\x7b\x26\xde\xe9\x97\xee\xda\xb0\x42\x74\x67\x36\x50\x0c\x15\x60\xab\xb0\x15\xa0\x47\x60\x8f\xbd\x09\x7d\xd9\xd2\x1d\xd1\xa8\x0e\x39\x82\xac\x70\xd4\x10\x08\xd7\x0e\x55\xa7\x05\xe1\xd0\xe1\xa1\x00\x54\x0d\x0c\x87\x28\x4a\x12\x34\x8a\x0a\x32\x66\xfe\x0f\xe0\xb1\xc0\xce\x36\x57\xe0\x24\x19\x3d\x19\x8b\xde\x04\x68\x67\xbb\xc9\xe8\xc4\x5c\xd8\x9c\xa3\x89\x13\xb8\xd0\x45\x22\x3c\x05\x01\x12\x82\x42\x9d\x9c\x76\xd0\xfe\x0f\xb0\x3e\x55\xda\x2e\x4b\xac\x55\xa6\x1d\x88\xda\x56\xe5\x00\x33\x5c\xd9\xb3\x9a\xd5\xae\xb7\x5a\x49\xb3\xca\xed\x97\xe1\x10\xc6\x21\xba\x3d\x6b\x1b\xd5\x8a\x3c\x78\x80\xf4\xef\x13\xed\xb7\xe6\x02\xee\x54\xec\xba\x32\x32\xc6\x70\x7a\xa3\xb9\xe1\xcb\xb7\x6e\x6a\xc4\x2c\x98\x73\xc3\x27\xcc\x9c\x1a\xcd\xe3\xda\x2d\x67\xc6\xea\x57\xcd\xc4\x68\x6d\x7e\xed\x79\xb9\xcb\x89\x31\x5d\x9f\x28\x46\xaa\xcd\x04\x9c\x8d\x3a\x60\x8b\xb0\xcd\x90\xce\x0e\x49\x1d\x6e\xac\xb0\xc5\xa7\x62\x6b\x57\x02\x6e\x9f\x9e\xec\x70\x50\x91\xc6\x40\x24\xc4\xd6\xa9\x95\xa0\xbe\xdd\xdd\x01\xb0\x7a\x83\xed\x41\x1f\x0b\x1f\x62\xf3\x9e\xa0\x35\x76\x47\x13\x49\x26\xa8\xa7\x65\x69\x1c\xd2\xe6\xc7\x37\x9c\x58\x60\xd8\xbe\xd7\x10\x5b\x35\x53\xce\x37\x09\x71\xaa\xf6\xcd\x33\xcc\x9b\x6f\xaa\x3b\x32\xfe\x9e\x33\xe1\xfc\xb3\x63\xcc\xbb\x51\xd1\x89\x59\xb9\x3e\xdd\xca\xfb\x5a\xab\x79\x96\x19\x6c\x28\x3c\xbf\x72\x7e\x0d\x2f\x8a\x95\xbb\x3d\xf7\x56\x94\x44\x45\x89\x4e\x4e\xa9\x30\xc1\xea\xbd\xd1\xb4\xaf\xfb\xe7\x5d\xce\x01\xc8\x59\xc8\xf1\xb1\x04\x07\x1a\xf5\x12\x0a\x3e\x25\x0d\xb4\x21\x92\x1a\xe3\x58\xed\x08\x23\x39\xb0\x7d\xd3\x84\x46\x97\x28\xc6\x93\x68\x99\x80\x22\xb4\x58\x52\x39\x55\x6e\xcc\x1d\xee\xa6\x26\xe0\x61\x1e\xed\x59\x34\x8e\x51\x37\x60\xc0\x6a\x47\x5c\x51\x14\x6e\x79\x7a\xab\x34\xaa\x17\xbe\xda\x85\x8e\x58\x5b\x22\x85\xbd\x46\x80\xe2\x39\x29\x9f\x74\x28\xc5\x07\xa8\x43\x17\x01\xfd\xef\xb4\x73\xaa\xa8\x9d\x43\x68\x69\x50\x28\x5d\x26\xf6\xb3\x07\x6d\x36\x5b\xa1\xcd\x76\x30\x67\xf5\xb7\x61\x21\xb8\x4e\xaa\x9c\x95\xc0\xf6\x06\xee\x2c\x8f\xcd\x7a\x01\x37\xbc\x74\x38\xc6\x78\xe9\xbf\xb0\xea\x2d\x22\xe6\xdc\xaa\xf7\xef\x13\x76\x1a\xff\xf7\x69\xbf\x59\x44\xe0\xca\x5b\xe9\xed\xa1\xfa\xde\xc1\x0a\x63\x21\xa0\xdb\xb3\x0e\xf1\xf6\xd4\xbd\xcb\xb2\x70\xe6\xb9\xb4\xe0\xf7\xe8\xf6\xc6\xe0\xf5\x47\x6d\xde\xca\x70\x57\xa8\xc2\x09\xaa\xcd\x16\x1a\xbc\xc1\x4a\xfb\x6f\xdd\x98\x78\x0f\x55\xfe\xf9\x1d\xa3\xba\x7e\x65\x71\x32\xd1\xfd\xc9\x72\x56\xe6\x14\x92\x2f\x93\x4f\x4e\x7d\x4e\xc4\x07\x8b\x65\x31\xeb\x39\x9e\x49\xc5\x4b\x6d\xe1\x66\xd4\xad\x99\x8e\xc5\xf5\xb9\x7e\xe6\x73\x00\xaa\xb7\xa4\xf9\xf1\xec\x9d\x05\x48\xf7\x2f\x6b\xb9\x27\xbd\x95\x53\x5f\x3e\x81\xba\x33\xdf\x5b\xcf\x1f\x74\xdd\x91\x3a\x38\xe2\x7f\xfb\xf9\xf3\x79\x64\x6d\xf0\xc4\x5a\x39\x11\x74\x36\xc1\x55\x6a\xcd\x7c\xac\x3c\x1b\x6b\xce\x1d\xa1\xa5\x3b\x32\x96\xa4\xe6\xd1\xb6\x8d\x4f\x50\x76\x3f\x3a\xc9\xb3\xb9\xd7\xdc\x80\x41\xf9\x78\xcb\xc8\x7e\xb0\x63\x19\x08\x19\x96\x41\x2b\x3c\x98\x12\x4c\x8d\xb5\xdc\x82\x45\xf1\x81\xe8\x2c\xca\xf0\xa7\xd9\xc0\xaa\xbe\x0a\xaf\x82\xbd\x49\xbf\xb1\x64\x82\x2e\x7f\xe2\x03\xdd\x13\x82\x0e\x47\xd7\x43\xb4\x0d\xc6\x0f\x7d\xe1\xd1\x99\x23\xaf\x6a\x11\xd5\xd6\xa9\x37\xef\x54\xec\x5b\x51\x50\xe0\x43\xc9\xee\xd8\xf5\xd2\x1b\x68\x87\x39\xbd\x67\xbb\x6d\x41\x41\x0a\x14\x4d\x4a\x9c\xcb\x45\xa2\xf7\xf7\x46\x6b\xd5\x5f\xc6\xe7\xbb\x5b\x71\x8e\x0a\x9f\xdd\xa8\x16\x7b\x3c\x74\xcc\xdb\xaa\xfa\x75\xbf\x1e\x95\x6e\xa4\xed\x98\x37\xb5\x8c\xa6\x25\xa7\x41\x0f\xeb\xfb\x46\x61\x37\xf6\xeb\x61\x5a\x31\x2a\xd3\xe1\xac\x36\xed\x1b\x88\xdc\x2d\xd7\xfa\x43\xec\x21\xfa\x5f\x4b\xea\x17\x06\xa9\x2d\xff\xfe\x50\xc4\x7f\x4f\xfb\xda\xdf\xef\x42\xfb\xc8\x4b\xfa\x7a\x80\xc6\x9b\x92\xbe\x1d\x46\x6c\xc5\x4d\xc5\x21\x56\xbb\xfe\x76\x3b\x8b\xd9\x8b\x55\xea\xe7\xf3\xe7\xa5\xb7\xc4\xa1\x2f\xff\xfa\xab\x5e\xc2\x0b\x7e\xeb\xe7\x1a\xa9\x36\x75\xbf\x87\xb6\xd0\x86\xd9\xbb\x3e\xf3\xc9\xc4\x22\x89\x79\xa6\x9e\x79\x20\xb6\x2e\xdd\x8c\x07\xdb\x35\xfe\xec\x0d\x5c\x5b\x16\x5f\x06\x17\x5b\x5b\x71\x6c\xfa\x9c\xcb\x95\xb5\xdd\x37\xd5\xaa\xde\x8b\x44\xab\xeb\x8d\x17\xbc\xd5\x57\xbb\xf2\x4d\xdc\xf5\x69\xb0\xf5\x7b\x87\xde\x3f\x6e\x7e\xf6\xb6\xac\x79\xf7\xc6\x3d\x91\xc0\xff\xcc\xd6\x65\xa9\x9e\xbe\x2d\xb5\xb7\x6f\x4b\xfd\xc1\xda\xd2\xf3\xfa\x6d\x29\x9f\xbf\x2d\xb5\xf7\x6f\x4b\xed\x01\xdc\xd2\x7c\x01\xe7\xd4\xd8\xc2\xc2\xc6\xf1\x8f\xf2\x15\x1f\xc1\x1d\x7b\x5f\xc1\x1d\xaf\xfe\x0c\xee\xb8\xed\x3b\xb8\x63\xf7\x21\xdc\xf1\x1d\xbc\x84\x5b\xde\xfa\x29\xdc\x71\xeb\xb7\x70\xbf\x77\x5c\xff\xe3\x16\x16\x67\xcb\x3a\x93\x33\xe1\x5a\x85\xfd\xe0\xc4\xa9\x59\x9d\x2d\x75\xb3\xb3\xa5\x61\x25\xb6\xf4\x19\x9e\x2d\x95\xe5\xd9\x52\x37\x3d\x5b\xea\xb6\x67\x4b\xcb\xf8\xcc\x53\x6f\x9b\xc5\xf1\x9b\xda\x9f\x1d\xfb\x0d\xd0\x8e\x6f\x60\x81\x76\xdc\xda\x04\xed\xd8\x63\x83\x66\x97\xbe\xd9\x1a\xa9\x31\x43\x6b\xbb\x48\xda\x1b\xa2\x7d\xdb\x66\x95\x74\x97\x05\x06\xc5\xec\xb8\xec\xb2\x80\x7c\xd3\x0c\xe1\xf4\x0c\xc5\x19\x06\x6b\x05\x78\x1d\x18\xa5\x31\xf8\xb0\x45\xff\x7c\xf3\xfa\x55\x59\x2e\xde\xe3\xff\xb3\xc4\x45\xb9\x06\x82\xd9\xe5\x02\x67\x13\x2b\x87\xf9\xb1\x91\xef\x37\xba\x02\x2f\xbc\xe1\x81\x0d\x8d\xbe\x5c\xef\xad\x19\xc1\x22\x2b\x21\xcd\x04\x90\xd4\x7f\x29\x66\x74\xf7\x21\xd3\x34\xcb\x71\x98\x90\x14\xaf\x5d\x33\x8b\x55\x8a\x87\x56\xde\xee\xef\x5f\xce\xde\xbf\x9c\xfd\x13\xbf\x9c\x65\xaf\x66\xb9\x0d\x9b\xf1\x6c\x96\x6d\x38\xe8\x66\xaf\x67\xf9\xde\x77\x5c\x92\x04\xea\x64\xfa\x4c\x58\x3b\xec\x79\x92\x03\x46\xca\x4b\xc9\x12\x55\x91\x71\x12\x15\x05\x3a\x81\x22\xa7\xbc\x9b\x2c\x43\x31\x61\x56\xd5\xda\x10\xee\x8d\x60\x95\x72\xe5\x2a\xe5\x20\xa8\xc6\x99\x75\x7b\x3f\xe7\x00\x49\x6b\x3a\x7e\x7b\xf8\xf1\x03\x3d\x5b\xc3\x24\x74\xcf\x31\xe9\x32\xd2\xec\x7e\xd6\x7e\xbf\xd1\x7e\xff\xa4\xfd\x2e\x7e\x8d\x46\x99\xf8\x98\x90\x34\xc5\x97\xf2\x0b\xcf\xcb\x0c\x9e\x32\x8a\x94\x05\x19\x9b\x09\x69\x94\x9a\x09\x73\x32\xce\xed\x94\x24\x21\x4e\x21\x03\xde\x00\x15\x1f\x46\x91\x69\x1e\xa5\xb1\x1c\x8a\x91\xf5\x93\xf1\xf5\xd1\xf8\x7a\x67\x7c\xbd\x34\xbe\xfe\xc7\xf8\xfa\x97\xf1\xf5\xd6\xf8\x7a\x61\x7c\xfd\xc3\xf8\x3a\x66\x5f\x6b\xa7\xd5\xae\x6b\xe8\x1c\xbd\x3b\x78\x41\xa7\x38\x44\x3b\xdb\x81\x4c\xfc\x70\xf8\xd3\xdb\x83\x8f\xc7\xef\x5f\x7e\x7a\xfd\xf2\xed\x4f\x1f\x5f\x85\x68\x57\x65\xc2\xac\x86\xea\xa7\xca\xa9\xa0\x9c\x10\x7d\x41\x56\x82\xf2\xa3\x0e\x19\x9f\x5e\x1c\xfd\xfc\x16\x5d\xab\x9a\xde\x1d\xbd\x7e\x4d\xa1\x3f\x1e\xbe\x79\x79\x74\xfc\x31\x44\x5b\x9b\x9b\x9b\x43\xde\x43\x7e\xe3\xfd\x2c\xc9\xc6\x9f\x43\xd4\xa5\xac\xb3\x28\xbb\x46\xde\xc1\x18\x42\x19\x87\xea\x6d\x23\x7b\x80\x41\xf7\xf3\x26\xdf\x27\xf7\xa1\x30\xee\x37\xb2\xbf\xfa\x46\xb6\x26\x5d\x40\x14\xb3\x68\xe7\xae\x3c\x40\x3c\xcf\x2f\x17\x65\xf6\xf7\x0f\xfa\xe6\x30\x86\xb4\x47\x2a\x02\x06\x6d\xd0\x0b\x30\xa4\x39\x5d\x6f\x74\x27\xd7\x7d\x03\x50\x5c\xa1\x3f\x50\xe5\x49\xe8\xc1\x03\x91\x3b\x10\xfe\x22\x98\x98\x3c\xc3\x17\x5d\xfb\x15\x9d\xe1\xf9\xeb\x07\xb4\x4d\x4b\xdb\xde\x8f\xb7\x85\xbb\x48\xb3\x38\x12\x97\xe1\xf2\x82\xdf\xf2\xcf\x8e\xac\xd7\x76\x0c\x54\xe0\x88\x76\x6e\xf0\x0a\x5f\x0c\x40\x7b\xc9\x3d\xf7\xfa\x6c\x8c\x28\x56\xc4\xb0\x55\xeb\xec\x44\xc7\xd4\x6f\x21\xda\xfe\xe6\x31\x2b\xa9\x3d\x4e\x16\x6f\xce\x28\xcb\x93\x38\xee\x84\xdf\x7c\x17\x74\x4c\x94\x77\xc2\x27\x9b\xd7\xa7\xc1\x76\x2b\x9f\x4f\xf7\x7c\xef\x9e\xef\xfd\x79\xf9\x9e\x62\x7b\xec\x9d\xff\x1d\xf0\x3d\x4b\x76\x5f\x5d\x74\xf7\x48\xee\xa2\xa0\x4f\x70\x5f\x29\xda\x90\xcd\x6b\x07\x43\xce\xee\x55\x38\xa2\xc9\x13\x1d\x80\x7e\x4b\x11\x7e\x99\x92\xf2\x4d\xb4\x90\xe2\x62\x57\x48\xd4\x21\xe3\x41\xdd\xcd\x6e\x80\xc4\x73\x68\x90\xee\x43\xc5\x1a\xbb\x5b\x86\xac\x1f\x6a\x19\x9b\x9b\x9b\x22\xef\xbf\x6b\xf2\x46\xd1\x68\x14\x4d\xb1\x6c\x4d\xcf\xd3\x0e\x00\xa1\x9d\x37\xf7\xd4\xa9\x65\xbf\xa9\xcf\x4e\xb2\x33\x9c\x44\x63\xd1\xac\x9d\xad\xce\x19\xa1\x2f\x7b\xea\xaf\x5c\x83\xf8\xa9\x11\xa2\x98\x45\x69\x9a\xa5\xc6\xb8\x4d\x08\x75\xb6\x09\x6b\x20\x1a\x5a\x81\xd3\x55\xe8\x81\xd0\x51\xa9\xce\x4c\x61\x3d\x50\x53\x4d\xfc\xfc\x16\x7a\x81\x8c\xca\xe4\x99\xcc\x1e\x9b\x07\xd0\x3f\x44\x13\xd0\x20\x59\x0f\x9c\x06\xfa\xd9\x84\xf5\x81\xea\x73\x0d\x27\xbf\xda\x8a\xf5\xfe\xb6\xaa\x5b\xaf\xbe\x6d\x01\xad\x4c\xb9\x42\x19\x5a\xcc\x6f\x70\xa5\x9c\x31\x2c\xa2\x98\x9b\x93\x82\xb9\xe7\xc5\x02\x8f\xe9\x06\x26\x4d\xf4\x75\xc3\x2b\xee\x41\xc5\x67\x3d\xa5\xaa\x18\x61\x0a\x17\xf3\xa8\x5c\x96\x1d\xd6\x78\x16\xe5\xd1\xb8\xc4\x79\x21\xd4\xfc\x70\x37\xcf\x4b\x6b\x7b\x89\xb7\x0d\x32\x4d\x03\xcd\x1e\x1a\x6d\xae\xf9\x5d\x7f\x90\xe9\xac\x44\xc2\x2b\xad\xe5\xe1\x97\x8f\xc1\x90\x38\x19\x48\x00\xbd\x2b\x02\x68\xc7\xe3\x67\x88\x59\x89\x00\x0c\x04\xa6\x85\x17\xab\xf2\x96\x78\xab\x3f\xf8\x25\x23\x29\x04\x6c\x40\x4f\xa1\x0e\x14\xa2\xce\x66\xa7\x8f\x36\x38\x70\x85\xf1\xdb\x8d\xe7\x02\x82\xf6\xfc\xd9\x27\x03\x06\xb1\xe2\x6c\xf0\x1e\x6e\x30\xaf\xcb\x37\x9d\x97\x2a\x63\x44\xd3\x19\x0d\x6c\x9f\x60\x8a\x08\x01\x3d\x5c\x3f\xd3\xd6\xbc\x30\x8f\xcd\x35\xb3\x42\x52\x5a\x89\x1f\x59\xba\x4f\x6a\x8f\xb3\x24\xda\xb8\x32\x3d\x64\x5e\x48\x8e\xd9\xf6\x2e\xc5\xfa\x19\x8b\xf9\x3c\x1c\xa2\x1f\x49\x1a\x23\xf6\xc0\x8b\x77\x54\xc6\x6c\xa6\x52\x45\xa7\xa3\x6e\xf3\xc1\xfe\x25\x80\x30\x52\x33\x7c\x21\xcc\x98\xe5\xb9\x8b\xa6\xb1\x93\x0f\x3d\x75\x54\x9f\x97\x68\x35\xdb\xfa\xdb\x17\x30\xb0\xe1\x76\x35\x7b\x88\x6c\xec\x6f\xeb\xe0\x22\x1e\xb2\x6e\xdf\xa1\x9a\xea\x11\xda\x0e\x0f\x7f\x21\x5b\x98\xa0\x1e\x2b\xb2\xbf\x8f\x36\xfb\xc6\x49\x6d\x94\xe3\xe8\xb3\x02\xa5\xa3\xdc\xd8\x47\xfc\x65\x39\x9d\xc1\xe7\xb3\x28\x7f\x9e\xc5\x18\x6a\xf0\x1e\xc4\xe8\x64\x0b\x93\x9c\xa2\xcc\xdb\x51\x08\x9b\xb4\x95\x48\xe4\x80\x16\xf9\xed\x68\x04\x9a\xfb\xcf\x21\x92\x9b\xcc\x7c\x51\x56\xbd\x50\x37\x27\xdb\xe3\x67\xbe\xb7\xc8\xf1\x84\x5c\xb0\x40\x5a\x9b\x17\x7d\x3a\x0b\xc0\x35\xfc\x2e\xee\x79\xc4\xb7\xea\xd9\xf7\xda\x2f\xc3\x31\x34\x4a\x80\x9b\xd7\x06\x14\xf0\x45\xfa\x34\xfc\xed\x73\xd7\xeb\xbc\x1b\x3a\x55\x50\x8a\xe7\x98\x67\xb3\x0f\xcb\x81\x9b\x6e\xb3\xe5\x20\x66\x84\xb6\xa4\xa8\x63\x92\xe5\xb6\x19\x5d\x51\xe6\x55\x51\xf1\xb5\x19\xa5\x50\x63\x3e\x37\x07\x65\x8f\xdc\x6c\xa5\x83\x85\x22\x0f\x10\x6e\x78\x6e\x53\x20\xb4\xbf\x1b\xfb\x28\x15\xfb\xc2\xf7\x68\x1b\x3d\xa5\xa7\x1b\xb4\x81\xe8\x7e\x90\xfa\x68\x82\xbb\x91\x9f\xe1\x8b\xbb\x24\x0d\x2b\xee\x80\x4d\x1b\x0d\xac\xe1\x37\x23\x0e\x87\x67\x68\xd4\xf1\xdb\x50\xc0\xef\x36\xad\x96\xd7\xd2\xc9\x32\x49\x24\x1a\x86\xf8\x0c\xa7\x25\x7b\x2c\x00\x2c\xff\x97\x22\x4b\x51\x34\x22\x36\x8f\x17\xae\x13\x3f\x66\x3f\x2e\x93\xc4\x7e\x47\x29\x1e\x14\xd0\xd2\x8f\x58\x69\xf7\x41\x14\x6b\xd8\x69\x57\x31\x76\xb7\x0d\x43\x90\xa2\x95\xeb\xea\x53\xfa\x3d\x00\x33\x0a\x92\xc6\xf8\xe2\x68\xd2\xeb\xf6\xba\x7d\xf0\x0f\xf9\x68\xcb\xf3\x24\x52\xc2\x3b\xb6\x82\xe5\xe5\x02\xf3\xe6\x00\x08\xa8\xc8\xf4\x69\xd6\x23\xfd\x2f\x22\x8c\xf0\x80\xc2\xef\xa1\x6b\x2e\x8a\x99\xd6\x7f\xb2\x15\xb4\x81\xba\x3d\x3a\x73\xb2\xf6\x0d\xd4\xed\x77\x5b\xad\xbd\x98\x14\x8b\x24\xba\x64\xf3\x02\x7e\x46\xd3\x92\xca\xb6\x12\x1b\xf6\xbb\xb5\x0b\xc8\x7e\xc1\x8a\xd5\xbd\x72\xa5\xb5\x99\x93\xef\x5f\x5e\x46\x0f\xe8\x96\x66\x51\x0c\x9e\x0e\x44\xcc\xc5\xcb\x1e\x37\xad\xeb\xa3\x47\x3f\xc8\x44\x39\xad\x6e\xdf\x6a\x1f\x3f\x4b\xbb\x4d\x67\x66\x0d\x34\x73\x30\x36\xd9\xe8\xa9\xfd\xae\x95\xbf\x09\xa3\x6b\x46\x39\x1c\x19\x0e\xd5\x40\xb3\x33\x9c\x27\x59\x14\xe3\x58\x2a\x83\x3d\x6b\x42\x1f\xc0\x47\x45\x24\x55\xef\x1a\x87\xe8\xe3\xd1\x8b\xa3\x10\xcd\xa3\xcf\xa0\x1e\x26\xe9\xd9\x32\x49\x71\x1e\x8d\x12\x7c\x97\x03\x54\xa7\x01\xfb\x05\xef\x16\x7a\x84\xb4\xec\x7e\x7f\x90\xe3\x45\x12\x8d\x71\xaf\x8b\xba\xe0\xd8\x8d\x9e\x16\x3a\x66\xa0\xc8\x2c\x3d\xc3\x79\x59\xa8\xb0\x9b\x20\xf7\xc5\x78\x4c\xe6\x51\x62\x33\x59\x92\xfa\x99\x7d\x99\xbd\x60\x05\x5c\xca\xab\x0d\xa1\x69\xba\x36\x64\x02\x1e\xaf\xa9\x31\x08\x64\x99\xb9\x31\x32\x65\x08\x9a\x36\x63\x6c\x94\x6d\x29\x4f\xbc\xab\x71\x69\x75\xd5\x07\x68\x4d\x85\xa6\xd4\x1d\x9f\x27\x3c\x37\x57\xa1\x9a\x3b\x8a\x71\xd8\x67\x00\x09\x2e\x8a\x8f\xb3\x28\xed\x6d\x82\x23\xd9\x47\xcc\xf2\x9c\x5b\xf0\x73\xc2\xda\xea\x43\x08\x57\x2d\xc7\xc0\xe2\xc1\x12\x5c\x35\x73\x54\x46\xe9\x25\x77\xbe\xc3\x5d\x92\xa6\xd5\x68\x1d\x70\xbc\x1e\xa4\x31\xbb\x02\x60\x34\x44\x26\x97\x05\x77\xa6\x5e\xa0\x11\x9e\x64\x39\x1e\x38\x74\xf5\x8a\x1f\x1d\xea\x71\x7f\xc5\xf7\xa0\x06\xd2\x7a\x05\xfb\xbc\x81\x7c\xb9\x7e\x1f\x72\x73\xb1\x79\x74\xc1\x42\x57\x5e\x90\xf2\x32\x44\x4f\x40\x8d\x2d\x76\x1d\x52\x70\xb7\xc6\x50\xb4\x6f\x6f\x32\xda\x24\xf7\x36\x28\xc4\x9e\x51\x54\x9f\xce\xfa\xc2\x4e\x59\x36\xbe\xea\x82\x10\x59\xe9\xef\x1f\x8e\xde\x0e\x24\x6e\x19\xb0\x72\x5d\x09\x4e\x63\x0b\x14\xd9\x71\x3c\x03\xb4\x88\x8a\x82\x72\xac\x72\x96\x67\xcb\xe9\xcc\xa4\x7b\xd9\x05\x4e\x61\x50\xab\x7b\x2d\xa9\x78\xd9\x23\x38\x23\x79\x24\xdd\xca\x71\x0a\x00\xfe\xaa\xc3\xac\xae\xa1\xb6\x33\x61\x39\xaa\x55\x80\x7a\xeb\xa4\xf8\x91\xa4\xa4\xc4\x16\xc6\xac\x6e\x80\x5c\xa8\x75\xc2\x94\xad\xdc\x8e\x6a\xab\xe1\x3d\xdf\x4a\x18\xf5\xd3\x53\x52\x0a\x3c\x1f\xfd\x8c\x6d\xf1\x69\x8a\x4b\x88\x55\x7c\x34\x39\x4e\x89\x57\xc7\x05\x65\xcb\x19\xe6\x3f\xe4\x32\x43\x65\x16\x48\x9d\x94\x74\x85\xee\x8d\xd7\x28\xfb\x21\xab\xe9\xb1\xce\xf4\xa1\x08\x38\xec\x2a\x10\xce\xf3\x2c\x17\xce\x68\x58\x8f\x0b\x94\x66\x25\x1a\x67\x79\x8e\xc7\x65\x78\x2e\x57\x8b\xd9\x6b\x63\xd9\xd0\x82\x82\x04\x96\x2c\x13\xfe\x7b\x0a\xff\x0d\xca\xec\x75\x76\x8e\xf3\xe7\x51\x81\x7b\xc0\x52\x98\x96\x57\x71\x2f\x0a\xf5\x0f\x7e\xbf\xcc\x2f\x6d\x4e\xe8\xff\xa7\xea\x00\xae\x81\xe8\x1e\xbf\x75\xc2\x63\x3e\xc8\x52\x7c\x8e\x5e\xd2\x51\xf5\xba\x70\xc9\x0b\x1d\x01\x2b\xd5\x7f\x77\x4b\x84\x2f\x48\x51\x16\x01\x5a\x24\x38\x2a\x40\x18\x86\x91\x67\xa9\x44\xd5\x24\x4b\x92\xec\x9c\xa4\x53\x28\x59\x50\xde\x67\x2d\x23\xde\xc3\x00\x3c\x2b\x04\xea\xc1\x47\x4d\x7c\x58\xd9\x7b\xf0\x7b\x65\xfa\x13\x8e\x3e\x63\x58\x84\x8c\xcd\xc3\x35\x34\x01\x4b\x5a\xc9\x5a\x19\x09\x50\x06\x0b\x5e\x2a\xd8\xc4\x33\xd4\x72\xca\x7a\x97\x15\x05\x19\x25\x6c\x0a\xc1\x79\x06\x37\xe7\xfb\x70\x48\xa5\xca\xbc\x64\x3f\xa9\x20\x2d\xb0\xf5\x72\x32\x21\xd3\x4b\xfe\x71\x24\x48\xe9\x11\xfa\x4c\x9b\x67\x7f\xea\x92\x0a\x3e\xf9\x7d\x16\x03\x9b\x2b\x30\x79\xa5\xc4\x3e\xc5\x05\x14\x83\x9b\x2a\x38\x79\xeb\xc3\x3e\xf9\x35\x91\xca\x63\x05\x1e\x3d\x92\x0b\x53\xdd\xde\xb0\x02\xbf\x46\xa3\xcc\xc8\xf3\x94\x10\xb7\x2f\x6c\x00\x70\x69\xa3\xe7\xb1\x12\x5a\x2f\xb4\xc2\xec\x93\x63\x41\x03\x41\x16\x84\xf6\x01\x57\x28\x1c\x21\x58\xe1\x70\xaa\xfd\x2e\xc5\x6f\x5b\x90\x60\x7c\xc1\x3a\xef\x5e\x49\xe9\x9c\x91\xc3\x38\x4a\xe9\x79\x20\x92\xac\x99\xa7\x73\x0d\x59\x96\xa3\x08\xbd\x7a\xf9\x4f\x38\x7a\x0b\x19\xed\xce\x18\x8a\xdc\x5d\xc5\x81\xee\xe7\x19\x16\x1e\xf6\x22\xed\x12\x97\xc7\x3f\xd1\xc2\x04\xd0\xf5\x14\x15\xe8\x1c\xd3\x05\xa2\x5c\xab\x88\x61\xac\x69\x32\xd0\xcf\xd8\x38\x88\x8b\x71\xea\x2c\x85\x09\x38\xb4\x66\xc1\x24\x74\x51\x88\x95\xd0\xe3\xc5\x9a\x9c\x8a\x71\x27\x4b\x0a\xd2\x37\x5f\x5e\x01\x7a\x6a\x34\x12\xea\x5f\x9a\x3c\xd5\xb8\x7c\x23\x86\x63\xcf\x0a\x3e\xc7\xe4\x7e\xc1\xfe\xa7\x2c\xf1\x32\xab\x5b\xe0\xda\x29\xe1\x37\x5b\xea\x74\xb5\xfd\x8e\x8b\x1d\x10\x72\x37\x4b\xbd\x24\x73\x5c\xfc\x1e\xcb\x3c\xe5\x2a\x45\xba\xb8\xa5\x82\xaa\x60\x87\x7b\xd8\xa2\x91\xb4\x62\x71\xc8\x41\xf6\xa4\x15\x51\x28\x32\x10\x37\x86\x74\xee\x15\x2d\x98\xb5\x49\xff\x56\xaa\x02\x05\x20\xf1\xaf\x9b\xdd\x58\xb3\xd0\x70\xea\xf9\x86\x0a\x81\xb0\xec\x45\x79\xfe\xe3\xea\x0a\x6d\xee\x79\x8f\x34\xbc\x5e\xe7\x70\xc2\xd2\x8d\xb3\x0c\xc7\xb9\xe8\xc9\x83\x07\x88\xff\xf6\x09\xfd\xb4\x49\x3b\x57\x3f\x61\xf8\xbc\x9f\x19\xb2\x18\x2f\x2c\x35\x21\x9b\x17\xdd\xa0\xdb\xd5\xaf\x59\x2c\x1f\x69\xbe\xd2\x3a\xa1\x54\xca\x74\xa9\x88\x1a\xeb\x21\x15\x49\x27\x0c\x4c\xc4\xef\x90\x47\x31\x6e\x30\x09\xb0\xe5\x79\xd6\x2d\xd0\x58\x46\x73\x71\x48\xcb\x0c\xf6\xd2\x86\xbe\x2a\xa8\x46\x3b\x1a\x9b\x75\x9a\x6a\x2e\x83\x64\x28\xf8\x48\xa3\x2c\xdf\x82\x85\xc7\xde\x3d\xcd\x5f\x9d\x2c\xa0\x2b\x22\x1a\xa7\xae\x33\xb9\xe5\x5f\x07\x66\x79\xb0\x48\x96\x85\xea\x02\xff\xf6\x3a\x36\x94\x40\xa6\xfe\x68\x86\xc7\x9f\x0b\x71\x6c\x62\x3c\x52\x5c\x6e\x16\xfc\x99\x5c\x72\x09\x1e\x7c\xbd\x71\x88\x19\xc9\x8f\xbd\x31\x88\xcd\x68\xc2\x5a\x03\x74\xfd\x47\x0a\x5e\x77\x69\x07\x61\x95\xf8\xcc\x59\x75\x1b\x13\xc7\x2b\xb5\xf4\x66\xc3\xff\xdd\xbc\x38\xd9\x7c\xf4\x5d\xf4\x68\x72\xfa\x65\x77\xf3\xfa\xbf\x86\x64\x50\xe2\xa2\x94\xe0\x2b\x8c\xbd\x66\xc8\x5f\x67\xb0\x2d\x86\x09\xe7\xff\xe1\xff\xf6\x36\x2f\xfa\x4f\x6b\xc7\xa9\xd3\xdf\x70\xa8\xa2\x64\xb1\x38\x58\xd0\x3b\xe6\x3b\x98\x9b\x1b\xce\xe1\x05\x2f\xdd\x8f\xb5\x51\x9b\xf4\xcb\x5d\x00\x22\xd3\x49\x85\xb7\x33\x66\x5f\x28\x9b\xd3\xc0\x0e\x1e\xfd\xe8\x05\xb3\xba\x0c\x41\xbb\xba\x05\xb8\x39\x2e\xe6\xf4\xdf\x71\xb4\x28\x40\x76\x48\x12\x24\xbe\x03\xdd\x37\xa3\xdd\x63\xe6\x72\x5e\xeb\xb0\xd1\xc0\x91\xdc\xde\x19\x76\x70\x34\x9e\xa1\x71\x54\x38\xd5\x90\x82\x11\xca\x72\xce\x67\x48\xa3\x26\xb6\xca\x58\x40\x91\x76\x54\xc5\x5a\x2b\x96\xf3\x39\x8e\x2b\x09\xcc\x6a\xf0\x8e\x09\xcd\xaa\xbd\x82\xe0\x90\x16\x5d\xe7\xb9\x07\x43\x91\x2c\xcd\x7f\x39\xfb\x90\xd2\x8a\x70\x88\x57\x51\x01\xce\x68\x66\xd1\x8e\x68\xc8\xd4\xa8\x08\x99\xc7\xe7\xf0\x65\x77\x13\xee\x27\x11\xed\x9a\x3e\x8f\xe0\xbd\xbb\x9c\xa1\x04\xc3\x7b\x6a\x2d\x04\xdf\x62\x81\x73\xda\x5d\x31\x17\x29\x84\x2f\x9c\x12\x16\xe1\x2e\x2a\xf0\x3c\x5a\xd0\x39\xd9\x32\x14\x7e\x3d\x69\xbe\xa0\xf5\x1a\xfc\xb2\x6d\x3d\xee\xa3\x1f\xd0\xb7\x74\x57\xe7\x59\x27\xe4\x74\x50\x66\xc7\xb4\x21\xae\x12\x5a\xdf\xdf\xd7\x32\x81\xf6\xeb\x2b\xfc\x7e\xdf\x53\xa3\xae\x64\xb2\x6a\xac\x70\x16\xae\xad\x4e\xc5\xf9\x0d\xfe\x0f\xab\x01\x26\xd5\x20\xd7\x37\xfc\xd4\x27\xc8\xb2\x82\x26\xcb\xec\x2e\x69\x52\xa8\xaf\xe5\x16\xdd\x92\x24\x25\x13\xe4\x4f\xb0\x25\x0d\xda\x6f\xaf\x79\x43\xdd\x2e\x27\x28\x97\x58\x0d\x24\xdf\x88\x74\x35\xa0\xb1\xd3\x7d\x5a\x51\x0d\x31\x8b\x5e\x68\x17\xef\x0e\x61\x03\x07\x9c\x29\xeb\x3f\x4a\xaa\xdf\xd1\x53\xd0\x84\xf9\xd1\x17\x97\x71\x8a\xce\x0d\x3a\x6e\x22\x63\x93\x90\xec\x11\x6c\xec\x57\xd2\xb8\x46\x65\x36\x5b\x6d\xac\xa9\x96\x42\xad\x92\xa6\x1c\xaa\xe4\x4e\x83\xa5\x96\x19\x95\x2f\x49\x8c\xb6\x37\x99\xef\xa0\x47\xfc\x92\x90\xb5\xc9\xde\x29\x6c\x5e\x20\x66\xe0\xe1\x1a\x78\x35\x12\xb3\xff\xc6\x9f\x7b\x21\xd0\x39\xb8\x34\xe2\x6a\xb7\x8d\x5b\xc2\x8d\x77\x1b\x14\xce\x75\x05\x3e\x34\x89\x9e\xed\xbd\x75\xdb\xae\xa7\x22\x7e\x01\xe6\xab\xcf\x84\x10\x21\x18\xe1\x5a\x49\xd6\xa8\x5e\x55\x05\x68\x77\xd3\x7f\x67\x20\x1c\x12\x8b\xb3\x75\xa1\x64\xde\xe6\x60\x9b\xde\x73\xa5\xef\xfa\xcb\x08\xc0\xc9\x36\x35\xdf\x89\x10\xf5\x58\x37\x2c\x29\x51\xf4\x2d\x2d\xca\x28\x1d\x53\x3e\xa2\x0a\x5f\x5d\x49\xa4\xf1\xc2\xf0\x8a\x0d\x7e\x19\x0e\x34\xbc\xa9\xcc\x3e\x02\xb8\x91\xac\xb2\xdb\x16\x51\xe2\x74\xdc\x84\xa5\x0f\x8e\x81\x51\x4b\x14\x79\x42\x25\x79\xf1\xc3\x99\x2b\xef\x19\x8c\x86\xf5\xad\x7b\x77\xe8\x61\x7d\x69\x8d\x1b\xd1\xe3\x66\xec\xfc\xa8\x0c\x49\x56\xc5\x8f\x28\x7a\x23\x0c\x89\x12\xdd\x96\x23\xa2\x7d\x2a\x9b\x87\xc3\xba\x7e\x83\xc1\x1c\xf1\xbe\xdd\x60\x28\xec\x77\xdb\x81\x8c\x58\xdb\x2d\x56\x37\x03\xbc\xc9\xda\x66\x49\x37\x1a\x0c\xef\x5e\xdb\xd1\x80\x67\xbf\xe6\xb1\x38\x81\x32\x5a\x8e\xc4\x0d\x76\xd1\x92\x43\x41\xc1\xda\x31\xd8\x27\x0d\xb6\x2d\x82\xd9\x5b\x26\x88\xc8\x1c\xc4\xdf\x0b\x73\x99\x28\xa3\x82\xda\x31\xd0\x62\xf6\x43\x00\xe9\x11\x29\xbf\x74\xb7\x9d\xf5\x75\xb8\x76\x64\xaf\x6b\x95\x7d\xea\x35\x1a\x43\x34\xa7\x1e\xf6\x6c\x55\xfa\x69\xd3\xef\x23\x88\x15\xe1\x3b\x55\x28\x7e\x04\x22\x15\xde\x2b\x84\xf2\x17\x4b\x87\xfd\x2c\x64\xff\x89\x14\x7e\x0d\x1e\xaa\x9f\x2c\x47\xbb\x22\x0f\xf5\x0f\x51\xee\xb8\x9c\x3c\x09\xf9\xff\x22\x0d\x2e\xdd\x43\xf1\x43\xd5\xc3\x60\xc5\x2f\x95\xce\xe1\xe5\x4f\x5e\x8f\x6b\x2f\x18\xfa\x12\x19\xb4\x6b\x86\x16\x7a\xd2\x0c\x58\x61\xf1\x15\xda\x09\x62\x1c\x3f\x63\x18\xc5\xcf\x58\x1b\x03\xa4\xf1\x1f\x02\x4e\x6e\x72\xa1\xfe\x21\x72\x4d\xbd\x5b\xe8\xa4\x48\xac\x31\xf9\x22\x54\x3f\x59\x8e\xb6\xa9\x87\xfa\x87\xc8\x35\x04\xa8\xd0\x4e\x10\x50\x5a\xbe\x95\x63\x1d\x3a\x42\x37\x49\xf4\xd0\x81\x74\x92\x44\x9d\x62\x0f\x09\xb5\xdf\x7a\x7f\xd3\x69\x28\x7f\x89\x74\xc6\x3b\x42\xf9\x4b\x8e\x9e\xad\xbd\x50\xfd\x94\x63\xa2\xdc\x20\x14\x3f\x44\x2a\x5d\x98\xa1\x58\xd7\xd7\xd2\x65\x16\x7f\x67\xda\x09\xb7\xbe\x0b\x6a\x3d\x6e\x04\x9d\x65\x39\x79\xd2\x09\x9f\x7c\x73\x7d\x1a\x6c\x6f\xb5\x79\x83\x6e\xae\xca\x7d\xb6\x26\x3b\xfc\xe9\x75\x27\x44\x9d\xcd\xc1\xd6\x93\xc1\x56\x67\xed\x5a\x38\xa7\xda\x6e\x15\x3b\xf5\xfe\x6d\xfb\xfd\xdb\xf6\xbf\xc2\xdb\x76\x5e\xcb\x9a\xeb\x9d\xea\xef\x78\x32\xc9\xf1\x25\xfa\x99\x24\xe3\xcf\x18\x7d\xff\x0b\x9e\x4c\xec\x07\xee\x2d\x7d\x58\x01\x18\x89\x52\x74\x44\x85\x85\x08\xa0\x48\x94\xba\x60\x3f\x46\x23\x0a\xf6\x8f\x6c\x8a\x93\xa2\xc4\x49\x82\x73\xf4\xfd\x04\x12\x5d\xe0\x9f\xa2\x33\xf4\x73\x96\xc5\xe8\xfb\x69\xe5\xc3\xfb\x5d\xe5\x70\x84\x7b\xa7\x7b\x13\xa5\xd1\xd4\x7c\x0d\x3f\x18\x52\x2c\x0c\x73\x06\x30\x67\x00\xe2\xd5\xfb\xe1\x08\xe4\x3a\x1b\x98\x8c\xa2\x54\x80\xbc\x04\xa3\x62\x1b\x82\x49\x31\xc5\x10\x97\x33\x01\xf8\xe2\x59\x0d\x5c\x3c\x92\x1e\x30\x67\x75\xf5\x15\x33\x59\xdf\x5b\xf0\x95\x5c\x05\x98\xe2\x52\x00\xbe\xc3\x79\x01\x0f\x3b\xaa\xa1\x17\x1c\x44\x76\xe2\x3c\xca\xe7\x75\xdd\xa0\xf9\x12\x18\x97\x25\xc4\x91\x71\xe1\x0b\x9e\x25\x40\x05\x57\x31\x20\x05\xbb\xa0\xc2\xa0\x72\x37\x40\x12\xab\x42\x2d\xd0\x75\xb5\xd7\x02\x06\x24\xfc\xc3\x70\x33\x72\x9c\xc6\x9e\xbe\xb1\x0c\x01\xf6\x0c\x84\x3d\x17\x6a\x44\xd3\x25\x26\xf3\x6c\x81\xf3\xf2\xd2\x03\xb7\xe0\x59\x02\xf4\x55\x59\x2e\xde\xe5\xd9\x19\x89\xbd\xe4\x46\x17\xea\x82\x67\x4b\x62\x5b\x8c\x6b\x4a\x90\xc5\xd8\x2e\xd0\xce\xc7\xda\xda\x9a\x94\x85\x7f\xc6\xa3\x1d\xd4\x13\xd5\x98\x7e\x42\x73\x7b\x85\xa4\xf8\xdc\x5a\x36\xaa\xa4\xe6\x32\x94\x07\x7f\xd4\x7a\x2e\xa0\x34\x20\xcc\x2c\xef\xf1\x39\x5d\x2e\xe0\x3a\x5c\xaf\x22\x1e\xf1\xcc\x17\xcf\x9c\xbc\x62\x26\x4a\x7e\x98\xb9\x25\x53\x58\x03\x34\xf7\x2d\x2e\x9d\xdc\x85\x22\x7c\x0a\x22\xd6\x81\x03\x37\xfa\xf5\x57\xd1\x06\xa5\x6b\xb7\x0f\x8a\xc0\x01\x88\x7f\xf6\x74\x18\x45\xd9\xea\xb0\x10\x2d\x48\x28\x37\x43\xfe\x3f\x3b\x33\xe8\x9d\xe4\xd8\x2a\x8c\xa2\x3a\xf9\x84\xc6\x57\x20\x61\x34\x7a\x09\xf5\x0f\xa7\x89\x4f\x72\x0d\xb0\x1f\xce\x00\x39\x40\x4f\xb5\xcf\xc9\x99\xe0\x22\xd4\x7e\xf7\x98\x91\xc1\x75\x7f\x8f\x4a\x4c\xc3\x21\x38\x05\x2d\x30\x52\x63\xc8\xd8\x4e\x0c\x5e\x4a\xd6\x28\xb9\x79\xc6\xd7\x34\xb6\xca\x71\x51\xa1\x51\xd4\x29\x22\xfc\x61\x9d\xf2\xf4\x28\xa6\xcd\x34\xae\x17\x5e\x99\xb4\x3d\x7d\xc9\x31\x73\x5f\xaf\x7a\xf1\x19\xe3\xc5\x61\xf1\xe1\x32\x1d\x93\x74\x5a\xdb\x15\x28\x6b\xc1\xb7\xa3\x40\x4f\x47\x74\xbe\xf0\x4c\xdd\xab\x5b\x50\xc2\x28\x9f\x39\xb8\x81\x2f\x0f\x8c\x78\xc0\x27\xa0\xe0\xdb\x03\xc7\x5f\x81\x0a\x30\xfa\xe9\x40\xe9\x0f\x02\x19\xa0\x4c\xf1\xc2\x1a\x75\x8a\x04\x4f\xdb\xea\x75\x87\x68\x9e\xa7\x78\x6b\xb5\xa1\xb5\x34\x4f\xdd\x3a\x2e\x45\xed\x75\x38\x65\xa6\x57\x02\xf2\x67\xec\x1f\x99\x0e\xc5\xbf\x1d\x38\xfd\xca\x9d\x41\xca\x14\x0f\xac\x7b\x45\x25\xca\x3c\xb7\xef\x2d\x9c\x3e\x57\x95\x75\x72\x3c\xed\x1e\x3e\x3b\x78\xab\x35\x46\x3f\xe9\x9e\x63\x2f\x53\xb6\x51\xeb\xaf\x40\x99\x32\xd9\xf4\xce\x66\xaa\xf9\xe1\x36\xcb\x86\xac\xba\x76\x89\x49\x0e\x3a\xa9\x71\xb4\x00\x1b\x6e\xed\xe2\xc3\x83\xff\xc3\xe7\x07\xef\x8c\x95\x4a\xcb\xe9\x76\x36\x84\x09\x7e\x74\xb1\x51\x19\x90\xe5\x1b\x0f\xc5\x28\xc4\x80\x37\x23\xd6\x21\x38\xa3\x90\xdc\xb2\x2e\x62\xe1\x89\xe4\xb4\xb0\x33\x71\xe1\xa1\x67\xde\x55\xa5\xa0\x04\xe9\x8a\x1d\x24\xcd\x62\xdc\x0d\x0c\x88\x29\xdc\x2a\x87\xa8\x4b\x45\x84\x4f\xe3\x84\xe0\xb4\xfc\x07\x03\xef\xaa\xbb\xac\x7e\x70\x93\xd6\x70\x79\x9e\xe5\x9f\xab\x1a\x4c\x71\xf9\x89\x83\x5a\x20\xa6\xc3\xf1\xd0\x5e\x93\xb7\xec\x16\x58\x53\xe2\xe5\xbc\xaa\x5f\xb8\x9c\x7d\x82\xb9\x1e\x67\xc9\x3f\x7e\x87\xfe\x9d\xcf\x48\xb1\x90\xbe\x55\x9d\xee\x15\xb3\xd9\xad\xd1\x06\x3f\x4f\xbd\x9c\x9f\x14\xcf\xb3\x34\x65\xfe\x5e\xb4\xe5\xd6\x37\x68\xaf\xe7\xdd\xdc\x1e\x3c\xf0\x6e\x7a\x7a\x95\xbd\xbe\x7f\xbf\x61\x2f\x9c\x85\x04\x5d\x49\xf3\x60\x62\x06\x9e\xd7\xb9\xfc\xe1\x55\x9c\xd2\xba\x85\x37\x42\x5d\x9e\x67\x0a\x22\xe3\x18\xd0\x09\xb7\x37\x69\x92\x7e\x80\xe8\x84\xdb\x5b\x34\x4d\x09\xef\x9d\x70\x7b\x57\xa6\x30\x41\xa7\x13\x6e\x3f\x91\x49\xba\x28\xde\x09\x77\xb6\x65\x06\x5d\xe1\x9d\x70\x67\x47\x25\x28\x11\xbc\x13\xee\xa8\x4a\xd5\x21\xae\x13\xee\x7c\xeb\x24\xe3\x72\xd6\x09\x77\x9e\x38\xe9\x29\x2e\x3b\xe1\xce\x77\x4e\xba\x10\x5b\x3b\xe1\xee\xa6\x93\x59\xcc\x66\x9d\x70\x77\xcb\x4d\xa7\x92\x6b\x27\xdc\x55\xdd\x17\x27\x92\x4e\xb8\xfb\x8d\x4c\x34\x8f\xb9\x9d\x70\xf7\xb1\xcc\x12\x32\x46\x27\xdc\xfd\xb6\x5e\x13\x77\x7d\x1a\x6c\xef\xdc\xeb\xc9\xee\xf5\x64\x7f\x6d\x3d\x99\xe6\xfb\x36\x4a\x12\x78\x9d\x7e\x3b\x47\x90\x9a\x3e\xca\xd1\x5c\xf8\x54\x17\x22\xce\xc4\xcb\x33\x66\x18\xac\xa9\x04\xa0\x37\x02\x4e\x45\x9d\x68\x0a\xaf\xe2\xaa\x55\xbc\x7a\x95\x1f\x49\x52\xda\x4a\x88\x09\xa4\x09\x88\x73\x16\x3c\xc5\x04\x11\xbc\x88\x67\x4a\xf7\x90\x07\x49\x62\x0c\xc5\x94\x8c\xcc\x93\x50\x00\x77\x82\x01\xb2\x6c\x52\x2a\x74\x14\x66\x82\x7e\xa2\xfd\x85\x5d\x03\xd2\xff\xf4\x64\xc7\xd2\x8a\xed\x42\x4e\x0f\xeb\xe3\x04\x5b\x62\xab\x70\x28\xbc\x2f\x7f\x5d\x5d\x41\x00\x0d\x64\x3f\x1a\xa7\x89\x90\x7a\xd2\xa5\x62\x28\x38\x26\xef\x06\xa8\x5b\x66\xec\xe7\xe9\x80\xa1\x59\x0b\x98\x36\xf1\x5c\x3f\xf2\x66\x4e\x26\xa7\x60\x7f\x27\x4d\xcb\xf8\x8d\x64\xdf\x13\x75\xd7\xaa\x86\xf6\x87\x16\xdf\xd7\x88\x87\xf9\xdf\x80\x8e\xb0\xe3\x8d\x8a\xa2\xa5\x1a\x14\xb7\xa3\xea\xfd\x07\x3c\x64\x57\x78\x35\xf0\x6c\x3e\x12\xd1\x9f\xb6\xd7\x61\xdc\x13\xf6\x34\x8e\xca\x48\x8c\x80\xfe\x1e\xd0\x7f\xd0\xbe\xf6\xfb\xea\x0a\xec\xe9\x24\x40\x99\x2d\xc8\xb8\x10\x20\xfc\xeb\xea\x4a\x85\xef\x03\xe5\x20\x6d\xfa\x23\xcd\x33\x01\x4f\x36\x4f\x07\x05\xe5\x08\xd2\x47\x33\x85\x9e\x73\x09\x47\x51\x98\x3b\x5d\xbf\x78\xa6\x4b\x6f\x65\x9f\x5b\xe9\x71\xf1\xce\xbd\x36\xed\xfd\x22\x9f\xb9\xf6\x4f\x36\x4f\xb5\xf7\x1b\xeb\xd0\x7e\x1f\x7d\x01\x9b\xe9\x28\x4d\xb3\x12\x4d\x48\x1a\xb3\x7e\x91\x74\xca\x1a\x7a\x2a\x9b\x1f\x67\x69\x91\x25\x78\x70\x1e\xe5\x69\xaf\xab\x97\x60\xae\x36\x28\x2f\x4e\xb2\x69\x57\xb3\x99\xe3\x3d\xa6\xa8\x70\xdc\xb5\x60\xce\x86\xf4\xd0\x3e\x30\x77\x3d\xdf\xea\x0c\x58\xb7\x02\x93\x20\xcc\x33\x14\xd4\x28\x3c\xa5\xc1\x14\xb7\x58\x8e\x17\x78\x4c\x45\x00\xcf\x7a\x0c\xc0\x9d\xcb\x28\x1a\x7f\x96\x41\x08\xe1\x45\x33\x3f\x9b\x8a\x0b\xcf\x5e\x94\x4f\x97\x60\x52\x7e\x22\x7f\xe9\xb1\xf6\x0d\xdb\x34\x51\x23\x04\x8f\xad\x2d\xa6\x3b\x9d\xea\x39\x10\x74\xe2\xb7\xcc\xe7\xf0\x8a\x6d\xa4\xcb\x24\x71\xd0\x9d\x09\x4a\xe3\xae\xb3\xd4\x09\x58\x40\x4c\xb4\x30\x4d\x4c\x91\x0a\x98\x1c\x8c\x88\xa9\xe3\xd3\xe4\x6f\xc6\xd9\x2b\x26\x2c\x0b\x04\x5f\xa7\xc7\xac\x5e\x3f\x50\x2d\x68\xa8\x6d\x9e\xa2\xa8\x2c\xa3\xf1\xec\x63\xf6\x5c\xb8\xcf\xd1\xe7\x4a\xf8\xd4\xd1\x4f\xdb\x6a\x4e\xd9\x80\xd9\xa7\x33\x0e\x51\x74\x10\x25\x89\xdc\x48\x38\x70\xc5\x69\xc2\xe9\xa6\x3c\x5a\x78\xce\x16\xde\xc3\x05\xd0\x68\x27\xdc\x06\xb9\x9e\x2d\xf7\x4e\xb8\x0d\x52\xbb\x1e\xed\x69\x07\x80\xad\x1d\xb0\x13\xee\xee\x50\x61\x79\xf7\x5e\x58\xbe\x17\x96\xff\x63\x84\x65\x38\x75\xdf\x55\xa4\x88\xbf\x17\x59\x9a\x2f\xc6\xa6\xa0\xf9\x0b\x4b\x94\x57\x7c\x79\x9e\xd9\xb2\x2f\x4b\x93\x22\xa8\xab\x9c\xa0\x83\x35\xa4\x4b\x47\xb8\x04\x74\x7c\xaa\x14\x31\x79\x46\xc1\x43\x02\x37\xb8\x17\x8b\xe2\x58\x78\x82\xa3\x7c\x98\x17\x06\xe7\xba\xd0\x35\x9e\x60\x59\xc1\x45\x71\xec\x31\xe3\x43\x7c\xfc\xac\x50\xa9\x0c\xe8\x86\x6b\x30\x4e\x9d\x15\xc7\xb1\x4f\xd8\xf6\x0d\xbc\x60\xf1\x84\x05\x44\xe3\x88\x04\xd3\xae\xeb\x3f\x87\xf1\x76\xcd\xb7\x91\x9b\xaf\x93\x25\x7e\x8d\x6e\xba\x53\xa0\xee\x73\xd2\x98\x29\x98\x04\x6c\xa0\xd5\x8d\xf3\x3c\xe0\x22\x68\xe1\x0a\xc3\x8c\x7c\xd8\x2f\x2e\x25\x2a\x00\x8e\x1f\xdd\x31\x9d\x44\x65\x80\xe0\x75\x6c\xc5\xc3\x17\x5e\xe5\x09\xc0\x9c\xea\xe7\x82\x4a\x49\x9d\x15\xa9\xa8\x96\xca\x33\xa2\x3f\xbc\xd2\x81\x23\xf4\xd8\x05\xd6\xf9\x22\x1a\x90\xe2\x1f\x51\x42\xe2\xf7\xb8\x58\x64\x69\x81\x79\x53\xce\xa3\x1d\x67\x0c\xfe\xf6\x7a\x6c\x8d\x0d\x0e\xd3\x33\x6f\xad\x7b\x4e\xa5\xd7\x6e\xff\x2a\x2b\x67\x3e\x5f\x9c\xc1\xb2\x3d\x17\xde\x96\xfb\x32\x78\xe3\x03\xde\x07\x78\x75\xae\x27\x38\xf1\xaf\xd5\x54\xc8\x83\x0d\xf2\x8b\x12\x40\x59\x4a\x33\xc9\x06\xdf\x09\xb7\x41\x83\xc6\x57\x64\x27\xdc\x01\xeb\xb4\x56\xf1\x81\xef\x37\xfc\xfb\x0d\xff\xcf\xbb\xe1\xab\xfd\x5e\x8a\xe5\x77\xa4\x1b\x6b\xa9\xa4\xa2\x47\x9d\xdc\x02\x2b\xb8\xac\x3f\x84\xcc\x55\xf5\x68\x02\x4e\x7b\x69\xa1\x2b\xc0\xc4\x13\x0a\x0e\x7d\xa0\x1d\x42\x34\x30\xa9\x2a\x34\x82\x15\xfb\xf6\x4f\xa6\x57\xd2\x9f\xa5\xc0\x36\x6f\xbf\x6d\x64\x70\xcf\x15\xd8\x3b\x01\x25\xe5\x02\xb0\xb3\xbd\x46\xc2\x03\xac\x99\xea\x6d\x80\xfb\x08\xf5\x57\x6d\x3e\x0e\x1b\x91\x80\x97\xb3\xee\x73\xa2\x11\xf1\xe8\x3f\x34\x6f\xb1\xc8\x72\xcf\xca\x42\x03\xef\xef\xa3\xae\xd6\xa7\x2e\x7a\xf0\xc0\x70\xff\xaa\x1d\x98\x59\xb3\x86\x8f\xf0\xeb\xbe\xb5\x0d\xd7\x35\xe8\x71\x28\x8b\x7a\x90\x58\xb1\x5d\x43\x1e\xf3\x33\xeb\xd9\x19\xac\x8a\x28\x58\xe1\x69\x1a\x68\x8f\x9f\xda\x19\x42\x19\xa8\x44\xa3\xa6\xde\x11\x6a\xab\x16\xd2\xa3\x0c\x05\xc4\x5d\xcd\xb0\xa3\xb5\xf7\xf1\x44\x14\xc7\x82\x86\x0b\x75\x0c\xd7\x69\x43\xa4\x5d\xcb\x9a\x2a\xe9\x89\x91\x8a\xbf\xca\xda\x93\xbd\x3a\xae\xdf\x9c\x50\xb4\x77\x4b\xab\xcc\xbe\xae\xa2\x92\x6a\x1f\xd9\x9f\x4f\xb8\x9c\x09\x3d\xb3\xea\xa4\xf9\x6a\xbe\x51\x87\x3a\x71\xd4\x1c\x0a\x01\x4a\x47\xda\x62\x5e\x19\xb7\x68\x35\xa9\x8c\xdf\xdc\xdd\x8c\xda\xf5\x35\x2b\x6a\x04\xc3\xbb\x8b\xb9\x65\xbc\xd7\xd2\x27\x73\xce\xca\xd5\x8c\x92\xc7\x9a\x93\xe7\xaa\xae\x58\xc7\x2a\xa7\xf3\x20\x49\x6a\xa7\x0b\x80\xf8\x0d\xcf\xca\x04\xc6\x74\xa0\x0d\x1d\x5c\x9d\xda\x8c\x77\x47\xae\x52\xad\x8a\xda\xea\xc8\x4d\x3a\xda\x00\x1b\x3d\x31\xe9\x53\x5c\x16\xdc\x6c\x25\xb9\x44\x31\x5e\x24\xd9\x25\x8e\x85\x29\xdf\x28\xc9\xc6\x9f\xc7\xb3\x88\xa4\xb6\x8b\x58\xa8\xed\xc7\x2c\x17\x3d\xf2\xbc\x56\x16\x07\x56\x1f\x49\x8a\x75\x79\x2d\x55\x8b\x6b\x86\x8b\xcd\x63\x71\xab\xa1\x5e\x77\x55\xb4\xa8\x9b\x3a\x88\x96\x34\x85\xa5\x22\x5f\x08\xf5\x0a\xf1\x27\x1c\xfd\xee\x8f\x10\xdf\x78\x5f\xbc\xec\x82\xfc\xe1\x10\x9d\x47\x84\xe9\xc9\x41\xe4\x5a\x94\x4a\xf7\x2a\xae\xc8\xcc\x79\xe7\x4b\x41\x86\x9a\x55\x1d\xc3\x7d\xd3\x73\xeb\x3a\xa6\x1b\xdf\xba\xd1\xbe\xbd\x2b\x41\x7f\x37\x36\xf6\xcc\x63\xd3\x70\x88\x8a\x32\x5b\x30\x5d\x2d\x49\xa7\x28\x9a\xd0\xae\x7c\xb3\xc9\xe6\xaa\x40\xbd\x92\xcc\x71\xb6\x2c\xfb\xce\xd1\x91\x21\xe0\x07\xf4\xcd\xa6\xf7\xb0\xc8\x7a\x3f\xa0\xb5\xff\xcc\x2b\x57\x9e\xd8\xfb\xe8\xcb\xb5\xe7\x4c\x67\x23\x90\xb9\x35\xf1\x9e\x43\xe5\x8c\x78\x4f\x9b\xea\xe4\xa7\x1c\x8b\x4a\xc6\x04\x17\x25\x11\x5b\x19\x63\x4a\xd8\xe0\x64\x74\x44\x25\xe6\x65\x1a\xdb\x18\xe8\xfa\x0e\x9f\x38\xd1\x9c\xa7\xe8\x7f\x8e\x3b\xd3\x1b\xb7\x4a\x97\x9f\x5e\xb3\xf4\x40\xe0\x62\xcd\xa0\x9a\x29\x2e\x3f\xaa\xa6\xde\x33\x52\x53\x1c\x45\xeb\xc6\xab\xa8\x98\xe9\x44\x15\x08\xc2\xec\xfb\x8f\xf0\x64\xd2\xe3\x00\x7e\x6a\xf3\x16\xf2\x76\x10\x02\x9f\xf0\xba\x06\x63\x73\x01\x9a\x3d\x82\xe8\x28\xfe\xee\x88\xbf\x2a\x9f\xcf\x8f\xa5\xcf\xe7\xaa\x3f\x32\xe9\x99\x14\x77\x75\x85\xd6\xa1\xc5\xda\x62\x48\xb2\x6e\x0f\x6d\xea\x7f\x37\x59\x02\xfa\x5f\xcb\xe5\x60\x0f\x29\x8b\xb5\xe0\xb2\x3b\xb5\x33\x23\xfe\x86\x43\x79\xc1\x97\x64\x53\x8d\x6a\xe1\x58\x21\xd8\xf8\x7a\xb7\xdf\xd0\x3c\x32\x44\x35\xc9\x51\x2b\xa6\xba\x45\x65\xc3\x21\x62\x9b\x95\x10\x17\xa2\x34\x46\xfc\x66\x04\x45\xd3\x88\xa4\x7c\xe5\x9c\x63\x1e\x17\xac\xe1\xcf\x2f\x7b\xda\x1b\x60\x43\x0d\xb6\xac\xe3\x6c\xff\x0d\x43\x1a\x33\xa7\x4e\xfc\x36\x90\x6e\x09\x74\x77\x2c\xf0\x38\x4b\x63\x44\x19\x6e\x63\x25\x1a\xe9\x36\x13\x2b\x32\x38\x22\xe8\xc2\xda\x76\xd8\xeb\xf7\xe4\x8e\x3b\xa4\xfb\x7e\xd6\x44\x09\x7e\xa2\xd5\x38\x65\x51\x66\x39\x8e\xa5\x1f\x68\x26\x81\x80\xc6\x67\x1a\x15\x28\x9a\xd3\x0d\x69\xe0\xe5\xd7\xf6\x5f\x25\xff\xb6\xff\x3c\xee\xa9\xef\xa2\x8b\xf5\x3d\xbc\xae\xcc\xad\xe2\x18\x6e\x09\x1b\x52\xd3\x4e\xb6\x3d\x50\x68\x57\x0c\x82\xd0\x7f\x8c\xe8\x31\xfb\x52\x3e\xd7\xb7\xa4\x38\x0b\xac\xe1\xd0\x60\x57\xaa\x1f\x18\xe0\x54\x15\x8d\x88\x71\xb9\xc0\x5e\xfe\x60\x71\x7c\x87\xb4\x68\x44\xd0\x3e\x85\x14\x72\xd6\x43\xa6\x09\x6d\x1e\x93\x3a\x21\xa5\x28\xd2\x44\x53\x5e\x5c\xd4\x22\xc6\x96\xe2\x73\x99\x24\xc6\x94\x5e\x5e\xeb\xc4\x60\xe9\x46\xb6\x84\x31\x41\x94\xf4\x57\x2c\xba\x5d\x53\xd4\x96\x83\x0d\xc9\x82\xbb\x53\x10\x8a\xe2\xd8\x29\xed\x93\x94\x39\x84\x94\x96\xd5\xf1\x4f\x24\xc9\xb6\xd4\xc4\x43\xa1\xa1\x9a\x08\x8a\x52\xdf\xf5\x0b\x92\xf2\xb2\x3c\x17\xea\x14\xd5\x13\x33\x1b\xc8\xf9\xd4\x79\xd2\x70\xc8\x62\xac\x29\x83\x09\xa3\x52\x65\xf6\xf0\xe5\x7a\x8f\x02\x8b\x71\xaf\x9b\x6d\xf3\xa1\x6a\x15\xc3\xa9\x35\x87\x57\x30\x40\x9a\xfa\x03\x83\x84\x8c\x31\x5c\x1e\x28\xd3\x0b\x2b\x0c\x98\xcf\x0c\x04\x4c\x39\xaa\x8d\x3f\x90\x63\x00\x52\x0c\x16\xd9\xc2\x70\x32\x65\x76\x2f\x89\x8a\x92\x43\x3a\x55\xfb\xbb\xc3\xe3\x4b\xd0\x82\xe0\x91\x75\x5d\xbe\xf5\x80\x80\x94\x90\x6e\xf7\x49\xa1\xb0\xa1\x4b\x5a\xb8\xfb\x01\x8b\x53\xf0\x03\xda\x74\x63\xd3\xe7\x3a\x35\x1f\x88\xd5\xd9\x7c\xae\x17\x7f\xb7\x52\xf2\x69\x68\xb2\xd8\x1f\x57\x90\xfd\xff\xff\x9f\x34\x9b\xd3\xc7\xb5\x6e\xf6\x79\xb0\x88\x2e\xa3\x51\x82\x7d\xfd\x73\x25\x7c\x66\x0b\x55\xe0\x34\x56\xa1\x69\xd2\x2c\x7d\xc4\x2b\xd1\xf1\x61\x73\xfe\xeb\xaa\xb9\x07\x07\x5f\x94\xd9\xf9\xb5\xaa\x3d\xb1\x56\x02\x18\xb2\x56\xab\x98\x21\xb0\x63\xdb\xd8\x67\x15\xed\x99\xb3\x58\x79\xc9\xa7\x1f\x52\x8d\x63\xbd\x10\xe5\xa2\x38\xb5\x0f\xfe\x31\x46\xe7\x51\x21\x65\xc4\x35\x13\x57\x6c\x6d\xc3\x6d\xaa\x76\x2a\x51\x46\x56\xd6\x95\xea\x2c\x2a\x66\x3e\xa4\xd3\x5e\xe3\x3c\xaf\xba\x5c\xd4\x6f\x11\x7d\x57\x85\x75\x42\x0c\x95\x30\xe3\x98\xdd\x64\x69\x8c\x94\xf6\xc4\xdf\x56\xc5\x49\x0a\xed\x43\x99\x0a\x79\xaa\x52\xe8\x9b\x90\xbc\x28\xab\x65\xbe\x15\xc5\xb6\x0a\xa5\x86\x4f\x93\xe1\xbb\x51\x35\xbe\x9a\xbc\xdf\x41\xc8\x3d\x36\xf0\xa6\x79\xb6\x1a\x6b\x8b\xf2\x46\x54\xaf\x32\x74\x3f\x53\x93\x6a\x76\x06\xc4\xd5\x5f\x1c\xbb\x62\x5f\xa3\x47\xd6\x17\xcc\x46\x14\x92\xf8\xa7\x61\x53\x76\x63\x59\xca\x56\x84\x35\x29\x5c\x3d\xfb\x34\xaf\xe9\xda\x14\x6b\x26\xb2\xfe\xe1\xda\x70\x68\x6d\xc1\xc6\x9d\x8c\x8a\x7e\xa6\x69\x24\xad\xca\x7b\x6c\x63\x1e\x0e\x0d\x97\x9a\x95\x01\x68\xc7\x63\xf0\x8e\x99\xb1\xd8\x2d\x24\x9d\xd6\x88\x5b\xa6\x66\xda\x1c\x39\x9b\xc4\x6b\x97\x13\xe9\x12\x4e\x9d\x74\x83\xbe\x68\x82\x54\x5b\x21\x67\x82\xd2\x4c\xd5\x40\xd9\xdb\x22\x2a\x0a\x1c\x07\xb4\x0a\xe5\x30\x8b\x42\x14\xda\x92\x36\x79\x99\x24\x3c\x98\x01\x0b\x9d\x86\x85\xa3\xcf\x81\xa2\x69\x7f\x8a\x56\x16\xa2\x94\xd5\xbb\x52\x40\x96\x33\xcd\xbf\x1c\xc4\xaf\x80\xa8\x41\xc2\x4e\x40\x76\x29\x10\x05\x46\x78\x1c\x2d\x0b\x4c\x0f\xd7\x71\x96\x96\xe8\x3c\x4a\xc1\xcc\xa8\x58\x64\x24\x61\x17\xdc\x69\x89\xf3\x49\x34\x96\x8e\x72\x5b\x1c\xae\xdb\x1c\xa0\xed\x6d\xaa\x99\x1f\x22\xc7\xc7\xa6\x5c\xd3\xda\xda\xfc\x09\x97\xcc\x69\x2b\xdd\x1f\x03\x74\x3e\x23\xe3\x19\xd8\x01\xd0\xe5\x5d\x66\x7c\x1b\x43\x8b\x64\x59\x34\xdf\xa6\x72\x3e\xd0\x30\xbf\x8a\x79\xf8\x6d\x93\x1a\x64\xd8\xd5\x05\x55\x59\xac\x59\x80\xbc\x8d\xf0\x58\x2d\x38\x6a\x86\xc7\x37\x92\x63\xea\x64\x18\xf3\xd5\xc2\x80\x19\x97\xb7\x67\xbe\x9e\x83\x8c\xf7\x04\xdb\xe2\x46\xbc\x8a\x35\x39\xe7\x5b\xef\xc1\xb6\xe2\x55\x8a\xef\x88\xeb\xee\x7e\xca\xc6\x9b\xe1\xcf\x7d\x88\x82\x3c\xe7\x63\xaf\x25\x92\x45\xb7\x7b\xd2\xa2\xd9\x34\x7f\xe8\x84\xdf\x56\x19\x35\x4b\x23\x85\x4e\xb8\xbd\xe3\x5a\x39\xf3\x91\x77\xc2\x9d\xad\xeb\xd3\x60\xfb\xf1\xbd\x35\xd3\xbd\x35\xd3\x5f\xdb\x9a\x49\x33\x5f\xe6\x56\x8d\x77\x60\xbf\x5c\xe1\x14\x92\xdb\x4b\xb2\x37\x56\x47\x13\xc6\x55\xc3\x0a\x35\x8c\x26\xdd\xf1\xb3\x2b\x2f\xae\x05\xc2\x62\xb1\x4f\x80\xc7\x61\xf1\xda\x0f\x78\x7a\xa0\xb7\xc7\x9f\x71\x83\xf7\x3f\xd5\xd6\x2c\x2b\xf4\xbb\x23\xb7\xb9\xe7\x47\x6f\xdf\xbe\x7c\xfe\xf1\xf0\xe8\x2d\x7a\xf9\xfe\xfd\xd1\xfb\x10\x3d\x97\xca\xd3\x31\xab\x92\x1d\x9e\x63\x8c\xba\x1b\x88\xd6\x87\x36\xba\x03\x7f\x1f\x94\x5f\x97\xb6\xa3\x95\xef\xd3\xd9\x79\xbd\xa4\x84\x4a\x58\x65\xfe\x26\x84\x19\x6a\x88\x6c\x93\xda\xbe\xa9\xdc\x9a\xe3\xa2\x88\xa6\x18\xed\xa3\xf5\x75\xfe\x40\x8f\xee\xa0\xfc\xf7\x80\x05\x6c\x74\x52\x06\xa2\xd8\x53\xe4\x4d\x0e\x91\x9c\xa0\xbf\x7f\x38\x7a\x8b\xde\xbf\x7b\x4e\x01\x79\x97\x3c\x41\x0e\x79\xdf\x9c\x27\x58\x0a\x07\xbc\x6a\x73\xb4\x6a\x36\x3f\xb2\xcb\x5e\x7d\xbc\xf3\xa2\xed\x94\x7e\x3c\x7c\xf3\xf2\xe8\xf8\x63\x88\xf8\x95\x31\x25\x27\xda\xc9\x79\x81\x36\x50\x97\xfe\x17\x8d\x67\x74\x71\x76\x8d\x70\x12\xdc\x59\xe2\xb7\xf7\x1b\xc3\xfd\xc6\xf0\x9f\xb3\x31\xc0\x6b\xc5\x3f\xaa\x91\x6b\xfb\x47\xe0\xad\xde\x9e\xdf\xe1\x13\x70\xe1\xac\x87\x32\x00\x79\x10\xd2\x23\xa1\x14\x86\xc8\xcf\xdf\xa6\x42\x5b\x4a\x30\xb7\x6d\x78\xbf\xf6\xfb\xf1\x85\xb0\x84\xd5\xb4\xd6\x7a\x3e\xf3\x15\x8f\x6a\x9e\xf1\x16\x59\xda\x6f\x78\x7a\xae\x65\xa6\x59\x7a\x39\xcf\x96\xb2\x45\x99\x50\x71\x52\x12\x48\x9b\x62\x81\x2b\x16\x52\x3f\x9a\x83\x9b\x71\x27\x40\x0a\x4f\x93\x47\xa1\x67\x59\x96\x5c\x43\x74\xc3\x18\xfc\x73\xb3\x5d\x02\x33\xc8\x58\x9b\x1d\x78\x5e\x81\x63\xc3\xed\xb6\x38\x5d\x81\xbb\x70\xba\x2a\x79\xed\xc3\x35\x63\x9a\x74\x27\x53\x14\xc2\xf4\xb8\xc4\xea\xb5\x5d\xa4\x6b\xc8\x77\xef\x1f\x88\x47\x56\x20\x03\x5e\x13\x5c\x26\xf0\xdf\x15\xd6\xa2\xfe\xf2\xca\xdc\xb7\xf2\x82\x55\xc7\x36\xa3\xcf\x98\x39\xaf\x06\xf7\x3f\x16\xae\x63\xe5\xd7\xda\x1b\x9e\xc3\x5b\x41\x35\xea\xb4\xea\xea\xbc\xeb\x30\x4a\x74\x5d\x6b\xf7\x14\xbd\xb6\x1f\x1d\xac\x50\xcf\xd0\x4a\xee\x89\xbb\x66\x5c\x7a\xd1\x7a\x7a\x58\x69\x44\xc2\x07\xf8\x8d\x86\x53\x90\x69\x1a\x95\xcb\xdc\x1e\x8e\x9e\x5e\x35\x1e\x1d\xa6\x7a\x3c\x12\xaa\x6e\x40\xf0\xf0\xbf\x7d\xff\xf9\x03\x01\x41\xde\x9c\x23\x45\x69\x2c\xd5\x38\x65\x06\x31\x41\x27\x24\x8d\x12\x65\x34\x8c\xdc\xd7\x03\x3e\x9b\x4c\x7d\x61\x5b\x59\xbc\x7e\x03\x2b\x22\x0f\x9f\xe1\xfc\xb2\x9c\x31\xf5\xf0\x7c\x44\x80\x67\x64\x2c\x4a\x2b\x74\x8e\xb5\x18\xd7\xa2\xcb\xe3\x53\x83\x77\xc7\xf1\x09\x27\x57\xb7\xfc\xa5\x3d\xa2\xbb\xf7\xbc\xa1\xfc\x5c\x48\xc7\x16\x4d\x2e\x39\x84\x12\x71\xdd\xda\x7a\xdc\x7e\xf2\xca\xd9\xc3\x50\xee\x95\x8f\xf9\xa3\x14\xe4\xde\xeb\xbb\xfa\x43\x3e\x4f\x1f\x45\xc7\x6e\xcb\xd3\xb5\x40\x79\xb5\x0c\x1d\x1c\x0c\xf3\x60\xb6\xbc\xfc\x09\x81\xa0\x2e\xd6\xd5\xfb\x99\x1b\xde\x9e\xd2\x8d\x4a\x4e\x97\x49\x52\xf1\x42\x44\xa9\xf1\x90\x71\xfd\x66\x34\x60\x6a\x61\xa1\xde\xaa\xc8\x68\x90\x69\x8d\xea\xac\xe6\x8e\x9d\xcf\x82\xf3\xc6\xa4\xc7\xf6\xb1\x00\x9d\xd9\xd7\xd5\x7d\x5f\x77\x5b\xd7\x06\x7d\x6f\xa0\x3c\x93\x58\xc6\x59\x3a\x8e\xca\x9e\x41\x05\xfd\x6a\x47\x30\x95\xec\x8f\x7b\x81\xa9\x66\x7f\xf6\xb6\x8b\xab\x38\x5d\xcc\x14\xfe\x2e\x2f\xe3\xdc\x81\x1b\xe0\xc0\x59\x81\xd5\x12\xcb\x66\x1f\x3c\x00\xcd\x83\xd9\x8b\xfa\xfd\xba\xc6\x7b\x0d\x20\xe1\x0e\xfd\xd7\x44\xf9\xd4\x5a\x66\x4a\x90\x7c\x6a\x94\x0c\xf5\x2f\xee\xdb\x66\x4b\xf3\x25\xc2\x07\xc8\x6f\x3d\x64\xbd\xf6\x93\x27\x36\x9b\xe8\x8b\x94\xd7\xf4\xfa\xb6\xfb\x7b\x74\x89\xfe\x92\x91\xb4\xd7\xe9\xb8\x95\xcb\xd7\x65\x8c\xde\x18\xa2\xf4\x4b\x05\x90\x12\x7b\x74\xbd\xf7\x03\xbd\x47\xfd\x3d\xa4\xc6\x9c\x66\xe5\xa1\xd1\x59\x89\x43\x8f\xcb\x1e\x05\xdc\xb2\x71\xb0\xff\xef\x07\x56\x2b\xbc\x46\x77\x5b\xd1\x78\x78\xb6\x2c\x17\xcb\xf2\x75\x36\x55\xcc\x3b\x56\x45\x85\xb2\x88\x1f\x5f\x98\xbb\x16\x4d\x4a\x33\xc1\x14\xef\x86\x71\xd9\xde\x94\x18\x0c\xbb\x60\x32\xb8\x6b\x8e\xe3\xe5\x18\x6b\x13\x16\x8d\xc7\x01\xe2\x2e\x1d\x75\xae\x12\x8d\xc7\x27\x3c\x99\x71\x48\x8a\x18\xfe\x2d\x68\xfd\xa9\x39\x6f\x83\x62\x46\x26\x65\xaf\x8f\x42\x07\xab\x22\xcb\x51\x62\x45\xe3\xb1\xd0\x5a\x31\xd3\x69\x46\xdf\x38\xc1\x25\x16\xe3\x50\xbe\x86\xcc\x74\x46\x5a\x37\x60\x1c\xda\xd5\x11\x7f\xa5\xc1\x17\x38\xdd\xf8\x99\x54\x57\xe9\xa6\xe0\xae\xa4\x24\xa3\xe1\x7a\x51\xc8\xe3\x06\xc1\x96\x85\xfe\xe8\x8e\x8d\xb6\x9b\x1d\x1b\xd5\x15\xdf\xaa\xb6\x6f\x33\x2b\x40\x86\x3c\x68\x78\x52\xd0\xee\x92\xd5\x2d\xad\xe5\x41\xc9\x11\x31\xff\x18\xae\x94\x2a\x09\x59\xb7\xa2\x6f\xf1\x3e\xd0\x7a\x20\xe6\x7d\x1c\x58\x4b\x8a\x5f\xcb\x6f\x13\x05\x35\x4f\xb1\x55\xec\x4f\xd8\xf5\x41\x4b\x27\x1a\xc0\xa9\x41\xba\x3e\x00\xdd\x15\x94\xa2\x05\x2f\xe8\x89\xe4\xf7\xac\xed\xd3\xca\x01\x18\xd6\x0a\xde\xbb\x58\x03\x97\x9a\x73\xa9\xba\xab\xd8\x26\x97\x53\x37\xf4\x32\xf5\xa4\x8d\x36\xfe\xb6\xfe\x22\x87\x7e\x3d\xe5\x1b\x46\x83\x1e\x5d\x60\x7d\xec\x0c\x3d\x6c\xc6\xda\x70\x88\x3e\x1e\xbd\x38\x0a\x51\x8e\x99\x21\x54\x80\x8a\x8c\x9b\xac\xc8\x1b\x2e\x65\x03\x13\x31\xad\xd7\x80\x96\x83\x60\xdc\x29\x1e\xe3\xa2\x88\xf2\x4b\xba\x58\x20\xfe\x6c\x41\xc9\xad\x0b\x4e\x7f\xc1\xe5\x32\x3a\xcf\xf2\xcf\x4c\xd0\x9b\x2f\x93\x92\x2c\x12\x2d\x78\x81\x19\x2e\xc4\xef\x29\x68\xf8\x10\x79\x5f\x2e\x7d\x23\xec\xaa\x59\x1d\xa6\xf9\x80\x68\xde\xb0\xdd\x54\x8d\xe1\x98\xed\x1a\xe6\x21\x45\x96\x1a\x08\x1c\xf9\x7c\xc1\xac\xd3\xce\x9d\xb8\xb0\xa7\xbe\x23\x44\x15\xac\xc5\x4b\x91\x63\x57\x68\xf6\x93\xbb\x46\xf2\xd5\xd4\x60\x7e\xe8\xad\xa7\xd2\x70\x59\xd5\xcf\x09\xde\x1e\x93\x03\xe0\x39\x7d\xb3\x1c\x1f\x36\x58\x8e\x64\x7a\xdc\x94\xc6\xec\xa2\xc7\xe2\x92\x17\x2b\x70\x69\x05\x47\xf1\xb9\x8b\xaa\x3d\x8b\xd5\x4f\x37\xc1\x35\xe3\x55\x30\x9e\x21\x57\xd1\x0b\x52\x71\x3d\x2e\x57\x1e\xb6\x2c\x78\x07\x03\x47\x9a\xbd\x26\xbe\x18\x18\xec\x48\x7d\xec\x21\x01\x20\xb8\x10\xfc\xbf\x27\x52\x25\xcb\x61\x3f\x64\xba\xc6\x68\xc4\x4f\x53\x88\xc4\x17\xfc\xa5\xb4\xcb\xcd\x19\x1a\x94\x93\x9f\x0a\xfe\x5c\xc1\x91\x3b\xe1\x0e\x38\x03\xd2\x3d\x6f\x53\xc6\xfc\xdd\xfd\x35\xe9\xfd\x35\xe9\x5f\xfc\x9a\x94\x5d\x91\xf2\xd7\xb3\xff\x11\x21\xe5\xee\xd4\xeb\x36\x1c\x02\x1e\xa2\xe7\x59\x7a\x86\x29\x2b\x8a\x78\xc0\x5c\x38\x04\xc3\x59\x00\xcd\xf0\x85\x0c\xc2\x4d\x09\x38\x4a\x8a\x0c\x45\x49\x92\x9d\x17\x70\x4c\x62\xba\xba\x62\xb0\x46\x2b\x12\x82\xff\x1b\x72\x81\xe3\x6b\x96\xb5\xe6\xde\x71\xac\xc9\xb8\xf0\xc2\x09\xb2\x64\x54\x4c\xf3\x27\x4f\x9b\x3d\x53\x3b\x8a\xae\xae\x44\x38\x63\x95\xd1\x95\xea\xd4\x6e\xdf\xd6\x04\xb0\x83\x1c\x17\x91\x98\x8e\x96\xf5\xa1\x27\x54\x8c\x46\x43\x4c\x09\x71\x34\x01\xad\x73\x1f\x6a\xdf\x74\xea\x04\x48\xce\xf7\xf5\xc7\xa1\xc6\xfd\x91\x88\x1b\x24\xdb\x81\x23\x17\x15\x35\x29\xa7\x15\x17\x41\xb6\x05\x6a\x26\x55\xfd\xfc\xb0\x15\x40\x2c\x7f\x9c\x93\x09\xb8\xc8\xc8\xf1\x38\xa2\x1c\x47\x8b\xf6\xf2\xe0\x01\x4a\xa2\x5f\x2f\x51\x92\x45\x31\x8a\x2f\xd3\x68\x4e\xc6\x28\x4b\x71\x01\xad\xf1\x09\x51\x0d\xf1\x50\xc8\x99\x54\x12\x00\x94\xb0\x6b\x17\x8d\x3b\x50\x74\xb6\xa6\xb8\x3c\x92\x27\x64\xaf\x57\x72\x47\x45\xc0\x71\x2d\x40\xaa\x6f\x36\x0c\x6d\x7e\xe5\xf5\x0a\x93\x85\x87\x5c\xc8\x5e\xe6\x98\x2b\x02\x03\xb8\x74\x1b\x33\x2a\x66\x87\xd8\x19\xbe\xd0\xeb\x52\x7a\x4d\x2b\x41\x73\xba\xd8\x00\x6a\xe8\x24\x99\x4a\xd2\x35\x77\xb2\x74\xf0\x0c\xaa\x8f\x9e\xb2\x8e\x42\x15\x9c\xe8\xfb\x28\x14\xf4\xcf\xc1\x1c\x75\x37\x5b\x33\xb2\x09\xd6\x8d\xd0\xea\x96\xf2\x29\x42\x49\x4e\xe5\xd2\xaf\x40\x2b\xab\x97\x53\xe9\x91\x88\xdd\x2b\x32\x23\x3d\x72\xaf\xa8\x15\xae\x88\xc2\x95\x6e\x8e\x06\xb2\x5c\x5f\xef\xc5\x4d\x6a\xe2\xa5\xfa\x42\x80\x13\xca\x8b\x83\x38\x66\x06\xfa\x52\xa7\x14\xa5\x31\x2a\x70\x59\xa0\xe5\x02\x32\xb8\x7c\x0e\x8b\x88\x94\x38\xa7\xdc\x34\x3b\xe3\xe2\x07\xf7\x91\x39\x58\x5b\xd3\x8c\xf4\x5f\x67\xd3\xe2\xa0\xfc\x50\x46\x79\xb9\x66\x2b\xde\x0a\x9c\x4c\x64\x22\x25\x04\x52\x66\xa9\xe4\x65\x66\x61\x23\xea\x14\x4e\x26\x8e\x5f\x18\xf1\xca\x6b\x8a\x4b\xa6\xd1\xa1\x85\xad\xa7\x5e\x70\xd0\x56\xa3\x2b\xa0\x57\x62\x89\xad\x5b\x6b\x8c\xb6\x32\xf0\x2d\x34\xc8\x98\xe2\xb2\x67\x3d\x3a\xe1\xf6\x7d\x8e\xb8\x3f\x1c\xa2\x38\x4b\xbb\xfc\x99\x22\xed\x23\xc7\x16\x18\x13\xc2\xed\xaf\x48\x14\xb6\x38\xe0\x5d\x61\x30\x18\xa0\x5f\x96\xcc\xb9\x2c\x6d\x93\x32\x21\xe7\xe0\x58\xf1\x32\xaf\xe6\x55\xde\xb5\xfd\x04\xd3\x5a\x62\x72\x18\xfe\xc3\x16\xcb\xf4\x9e\xd0\x98\x79\x63\xd3\x3b\x41\xf6\x7a\xc4\x34\x86\x34\xfa\xd7\xec\xdb\xf3\xeb\x51\xec\x22\x4b\x12\x46\x3e\x7e\x6a\xe5\xb4\xa9\xc0\x6c\xba\x94\x5c\x1b\x14\x97\xe9\x1b\x69\x9c\x6a\x10\x4b\x56\x41\x2e\x7c\x46\x33\x67\x4e\x85\xe5\x01\x25\x3d\x31\x56\xdf\x24\xf8\xde\xed\xf8\x68\x22\x6b\x7d\xa4\x6d\x4b\x1d\x37\xa3\x0c\x65\xbc\x0b\x43\x53\xea\xdb\xa7\x56\x82\xaa\x24\x14\x85\x5c\xd2\xb9\x15\x7a\x6e\x47\xa4\x95\x07\x63\xe8\x93\xed\xe0\x98\x32\x9e\x77\x59\x92\x50\x3e\xa3\x7a\xc2\x68\x30\x64\x45\x88\x88\x5f\x0f\x67\xaf\x01\xa5\x38\x18\x9a\x62\xfe\x0b\x6e\x70\x7e\xc2\x30\x05\xe4\x78\x18\x9f\x06\xe2\xa2\xc6\x48\x0e\x14\x31\xf2\x1c\xdd\x35\x0e\xd3\x94\x02\xfd\xd2\xdd\x52\xc4\xc0\x73\x48\xdc\xb5\xd2\x93\x37\x1b\x72\xa1\x79\x14\xe4\x01\x3f\x50\x3c\xcf\x31\x8c\x06\xec\x97\x9f\x7b\xde\xd8\x01\x9b\x63\x4a\x5c\xed\xd6\xd1\xc0\x84\xa6\xe4\x5a\x45\x5b\x54\xa9\xee\xa9\xd4\x77\xf8\xf5\x4a\x66\x67\x34\x11\x03\x55\xfa\x1f\xaf\x34\x4e\x54\x62\x99\x92\x04\xad\x67\xbb\x00\xe7\x20\xc0\x4c\xd0\x20\xc5\x6c\xbb\xef\x94\xe4\xaa\xe0\x16\x26\x32\x83\x6f\xb3\xcf\xab\xf2\x15\xab\x73\xb2\xf4\xcb\x16\xf9\xbb\xb2\xdf\x83\x14\x9f\xeb\x77\x2d\xce\x3b\x74\xc1\x18\x49\x6c\xb8\x58\xf3\x33\xc4\x86\xa5\xde\x1b\x8f\x3c\xae\xab\xc6\xa3\x46\xde\x87\xa4\xef\x28\x2f\xb1\x3a\xe5\xbd\xfa\x51\x63\xe5\xd1\xf9\x8a\x5d\xd7\x6f\xfa\x53\xfe\x1c\x83\x32\x9c\xca\xdc\x0b\x9c\xc6\x60\x93\x25\xe7\x23\x2a\x40\x21\x90\x16\x94\x8c\xa4\xfb\x0f\x55\x51\x36\x01\x60\x5a\x88\x0a\x25\x7d\xa6\x04\x90\xad\x2f\xd3\xa8\x28\xc8\x34\xc5\xf1\xc0\xed\xa3\x3d\xf9\x3e\x96\xe9\x43\xa4\x14\x81\xc6\xa3\x06\x5c\x7a\x9b\xd1\xad\x9c\xb4\x91\x28\x1b\x58\x94\xe8\xc2\x5b\x94\xe4\x38\x8a\x2f\xd5\x7b\x66\x25\xc7\x15\xb7\x27\x0a\x53\xce\x14\xc2\x65\xd3\xb8\xc8\xa4\x67\xb5\x26\xdd\x7e\x6d\xba\x4e\x98\xd4\x22\x62\x4c\xd6\xe7\x09\x90\x0a\xb9\x65\xc6\xc7\x46\xe6\x73\x1c\x93\xa8\xc4\xc9\xa5\xdd\x2c\x3f\xae\xab\x7b\x5f\xc3\xbf\x6a\x8d\xc9\x11\xf4\x17\xaa\xef\x55\x78\x22\xf0\x39\x2a\xd2\x8f\x4e\x8c\x2f\xd3\xdd\x81\x0d\x46\xbb\x73\x3c\x77\x02\x33\xd8\x7b\xad\xc9\x86\x98\x2d\x9a\xd6\x0f\xa1\x36\x30\xf8\x98\x3e\x1a\x6b\x9e\xf8\xb5\x9e\x3b\x10\x0d\xd7\xda\xdd\xe5\x75\xdb\x81\xe8\xdb\x62\xf3\x78\x9c\x8d\x3d\x5b\x88\x7d\xdd\x1c\x48\x03\x2b\x86\xa7\xc7\xf3\xec\x4c\xa8\xde\x50\x54\x5c\xa6\x63\x79\x36\xf1\xc9\x2d\x3e\x16\xbb\x4c\xe1\x6d\xad\x81\x00\x4d\x04\xb0\xb0\xe5\xf0\x2e\xdd\x78\x7b\x95\x9a\x0d\xb9\xdc\xc1\xe8\xd4\x8a\xa6\xed\x7b\x5c\xef\x6c\xfc\x5e\xbb\x08\x59\xd2\x96\x99\xad\xcd\xaf\xc2\xf4\x6f\x38\x44\x87\x13\xc5\x19\x49\x21\x1f\xa3\x5d\x62\xee\x9e\x03\x91\x12\x29\xc7\x4c\xaa\xdc\xf9\x0c\x83\xb5\x00\x1f\x7d\x1f\x31\xa6\x5a\x20\x52\x9a\x6c\xd5\xbb\xa7\x3a\xc4\x2e\x97\x99\x6f\xf7\xf0\xa1\x9f\xd7\x68\x4f\xa8\xbe\x75\x42\x50\x0c\x0f\x7f\xfb\x8a\xfe\x5b\x2c\x71\x39\xc7\xb6\x9d\x59\x92\x4d\xab\xda\x45\x16\x63\xaa\x11\xfd\xa1\x96\x90\xee\x09\x15\x1e\xd8\xfc\x31\x2a\x4c\x10\x47\x3e\xb7\x07\xd6\x9e\x8e\x1c\x37\x44\x5c\x4e\x3e\x7c\xc1\x12\x42\x4e\x63\xbd\xfe\x80\xed\xc8\xe3\x48\xf8\xa8\x03\xb7\x1b\x38\x46\x74\x75\xcf\xf2\x2c\xcd\x96\x85\x74\x58\xc7\x2f\xb0\xe9\x6e\x6f\x7b\xaa\x61\xd5\x70\x89\xb4\xeb\xb5\x04\x05\xa7\x03\x99\x32\x25\x6b\x43\x40\xae\xa1\x17\xad\xa1\x79\x0e\x6f\x31\x6f\xd7\x0d\xfc\xd8\xb9\xca\x63\xb8\x75\xc2\x7d\xd5\x5c\xe4\x5d\x9f\x06\x3b\x9b\xf7\x57\x75\xf7\x57\x75\x7f\xed\xab\x3a\xf5\xa0\x51\x53\xfe\xde\xe4\x55\x23\x07\x5e\xe1\x8e\xcd\x17\xe0\xab\xf5\x43\xc8\x74\x42\xa6\x5e\x38\x96\x25\x00\x0f\x59\xe4\x7e\xed\x42\x8e\x8c\xa2\xd4\x13\x8c\x03\xd4\xbb\x2c\x9a\x10\x33\xdd\x65\xd7\x6c\x23\x32\xe5\x4f\xeb\x2d\xfb\x3a\x06\xf4\x8c\x4c\x2d\xf5\xb8\x6e\x67\xc7\x54\xc0\x57\x0c\xe2\x4a\xc2\x5e\x9b\x6e\x8c\x54\xba\x6e\x20\x0a\x8a\xbf\x8a\x36\x0c\x39\x88\xf5\xce\xfb\x58\xaa\xcc\x64\x59\x01\xb6\x27\xb5\x32\xa4\x78\x97\x63\x7e\x41\xa7\xe9\xf9\x8d\xba\x47\x2a\xdd\x6a\x60\xa4\x97\xa0\x47\x07\xee\xe2\x1c\x5d\x5d\xb9\x79\xfc\x34\xea\xcf\xc4\x51\x9e\x10\x5a\x54\xeb\x5a\xba\x58\x96\x2f\xf0\x24\x5a\x26\xde\x2b\x88\xa6\x3e\xd2\x3d\xd8\x6e\x47\x5e\x46\x7a\x43\x74\x50\x92\x19\xc4\x5a\x8b\x1e\x6f\x44\xd5\x37\x22\x7a\x17\xac\x51\xfc\x16\xdd\xb7\x9f\x1d\x31\x91\x84\xd6\x52\x31\xc7\x46\xa3\x9e\x0a\xb5\x6c\x0f\x1e\x04\x6d\xbd\xc2\x17\x9e\x91\xf3\x55\xc5\x06\x5b\x68\xe6\x7a\xd9\x04\x45\x86\xb3\xb8\x28\x8d\xc5\xdd\x60\x01\x57\x17\xec\xc6\x9a\xae\xbb\x57\x2f\xff\x69\x2d\x37\xa8\x83\x4a\xc2\xde\x85\x26\x94\xeb\x86\x1f\x55\xc7\x1e\x5b\x5c\xde\x0a\xf5\xbb\x5b\xa7\xf7\x02\xf5\x8b\x71\xfb\x09\x17\x68\xda\x25\x24\x7c\x5e\x5d\x59\x34\x74\x30\x06\xdf\xfa\x9a\x2b\x2c\x1d\xde\xe3\x83\x49\x54\x0b\x7d\xe2\x8e\x89\xfc\x97\x77\xa6\xe4\xa3\x57\x5d\x66\x3c\x1a\x30\x29\xd1\x9c\x4c\x67\x4c\x54\x94\x1e\x6a\xb9\x22\xca\x69\xb9\xcc\x1a\xdb\x2d\x33\xb3\xd5\x93\xee\x34\x2a\xde\xe5\x64\x8c\xbb\x01\xa2\xbf\xe9\x7f\x30\x7d\xf4\x47\x9a\xa5\x63\xec\x7b\x42\xf7\x19\x5f\xd6\x3c\xa2\xfb\x8c\x2f\xdb\x3e\xa3\x83\x9a\x1c\x1c\xb2\x1a\xf6\xb5\x9b\xfe\x17\x78\x4c\xe6\x51\xd2\xd3\x01\x2a\xee\x73\xe5\x85\xf7\xd7\x26\x62\xcd\xb9\xe2\x5d\xd3\xb2\xaf\xea\xbb\x27\xe9\x9b\x52\xed\x3d\xbd\xfe\x96\xf4\xca\x85\x18\x87\x60\xe1\x02\x53\x04\x78\xe1\xd4\xea\x15\x6d\x5a\xd3\xe9\x85\x29\xce\xf0\xf4\x35\x43\x86\x69\xa4\xcc\xf2\xa2\xff\x45\xea\xee\x2e\x06\xfa\xf6\xb7\x2e\xce\xcf\x4a\x67\x65\x02\x48\xbf\x0b\x99\xc0\x9f\x09\x20\x5f\x13\xd0\x74\x0d\x17\xf0\x68\xc9\x5f\xbd\x03\xe5\x6d\xc3\x86\x12\xea\xb9\x8b\x01\x90\x94\xbf\x10\x64\x29\xc8\x69\x54\xf8\xe1\xa6\x51\x61\x40\x01\xf9\x6a\xa0\x4a\xb4\xd3\xf2\x55\x09\x61\x56\xe5\x05\xd7\xdf\x71\x8a\xb3\xf3\xc5\xca\xa4\x24\x42\x89\xdc\x84\xa4\x78\x54\x93\x5a\xca\x92\x41\x76\x56\x21\x2f\xbb\x62\xeb\xda\x51\x8f\x8e\xa2\xa2\xa1\x34\xd0\x9b\x0f\xca\x9d\x33\x0f\x94\xa2\x3c\x91\xd9\x82\xfc\x2a\x41\xab\x9b\xac\x20\x44\x19\xb4\x63\x39\x5f\x26\x51\x49\xce\xf0\x4f\x51\x71\x5c\xc0\x73\xa9\xaa\xaa\x1c\x58\xab\xae\x69\x63\x0d\x53\x59\x4e\x0c\xde\xbc\xfb\x17\x70\x49\x36\xb5\x4d\xcf\x54\x86\x16\x72\xc4\x51\x26\x81\x46\xc8\xab\x4a\xf2\x3c\xba\xa4\xb0\x4d\x7a\x23\xde\x52\xab\x05\x00\xb3\xdb\x9e\xe4\x41\xea\xae\xa5\x72\xa8\xb0\x05\x8d\x9b\x35\xe9\x06\x23\x50\x83\xb4\x18\x19\x0e\x91\x74\x40\x03\xae\xd8\xf8\xe9\x15\x21\xd6\x14\x9d\x9f\xd7\x64\x4e\x4a\xcf\x14\x9a\x00\x1c\x57\x32\xb1\x62\xde\x8d\x7c\xa3\x4c\x41\x7e\xf5\x31\x41\x95\x69\x40\x97\x64\x8e\x8b\x32\x9a\x2f\x2a\x8b\x48\x08\xb5\xae\x58\x46\x5a\xb5\x72\x8d\xec\xaa\x6a\xe5\xd1\x58\xeb\x4c\x4c\x26\x13\x32\x5e\x26\xf0\x70\xc0\xe5\xa1\x36\x90\x39\x90\xac\x8c\x92\x17\x6d\x2a\xb0\x20\x75\x21\xc9\x5c\x33\x1c\x5c\x2d\x73\x73\xe5\xb8\xd9\xae\x08\x42\x4a\x3c\xef\xdb\x4f\x86\x1c\x73\x35\x80\x72\x6f\x1e\x8d\xf5\xe5\xdb\xcc\x59\xc1\xa6\x85\x36\x62\x47\xeb\x16\xcb\x2c\xc9\xa6\xde\xf5\xa4\xaf\x6d\xdf\x6a\x4a\xb2\xa9\xe6\xfa\xc4\x59\x52\x50\xaf\xb1\xac\xf4\x0a\xf5\x45\xa5\xe9\xab\xc9\x84\x7e\x35\xec\x11\x36\x84\x4b\x6c\x16\x84\xa2\x61\x9a\xd1\x62\x5f\xf0\x82\xf9\x9b\xa9\xd8\x0f\x78\x5b\x49\x36\xad\x6b\x43\x66\xfb\xeb\x16\xd9\x96\x3c\x0a\xea\xf9\xe6\xb3\xd3\xf9\x8c\x14\x94\x65\x2e\xb2\xa2\xbc\xc1\xe1\xe9\x5d\x56\xd4\xcb\x0c\x6e\x24\x95\x5a\xd6\xea\x56\xaa\xd3\x00\xed\xa4\xce\x57\xe9\xf7\x60\x11\x5d\x82\x4d\xf7\xbe\xa1\x08\xd1\xb3\x38\xb6\x21\xa9\x2c\x13\xaf\x84\x2f\x32\x75\xd8\xf3\x2c\xff\xfc\x31\x7b\x97\x67\x67\xb8\xba\x8c\x06\xa4\x97\x5d\xe4\x24\xcb\x89\xc6\x6c\x9c\x82\x02\x42\xf3\x26\x3e\xd1\xe3\xc7\x18\xc6\xab\x8c\xeb\xb0\x4e\x32\x27\x0f\x3a\xbb\xd1\xd2\xd1\xbe\xf1\xf5\x14\x9d\x68\x9f\xa7\x28\x94\x57\xd3\xd7\xaa\x55\xa6\x65\x65\x0a\xd7\x24\xc9\xce\xc1\xa4\x5d\x9c\x70\xeb\xaa\xaf\x37\xf5\x66\x11\xd0\x28\x31\xa1\x2c\x4d\x2e\x99\x0f\xf8\x52\x5a\x9c\x6b\xb4\xca\x8a\x7a\x1f\x15\x08\x93\x70\x14\xda\x0f\x06\xea\x8c\xc1\x69\x1f\x5b\xb1\x35\xa9\xf1\x07\xfa\xe7\x86\x81\x5e\x46\xd7\x44\xe9\x7e\xb2\x36\x35\xc7\xf5\x84\xcd\xe9\x1a\xf0\x8b\x2f\x16\x24\xbf\xf4\xac\x78\x2d\x57\x27\xb7\x82\xf9\xad\xf0\x42\xd3\xbc\xaa\x25\x60\x81\x7a\x16\x00\x50\xb6\x4f\xcc\xb0\x20\xfa\x7b\xbe\x55\xf9\x3e\x3a\x17\x24\xc3\x53\xbc\x60\x5a\xf5\x07\xc5\x98\x10\x7b\xf9\x8a\x32\xfa\x46\xfc\xf7\x82\x23\x4e\xc2\xa9\xa0\x0b\x6a\x55\xa8\x06\xc0\xb1\x2b\x44\x3e\xf2\x31\x87\xe1\x70\x95\x15\x01\x6b\x53\x5f\x8d\x95\x8b\x51\x2d\xb7\x5b\xac\x24\x4b\xd1\xcb\x50\xd4\x8e\xfe\x25\x53\xb5\x75\x33\xbe\x08\x09\xba\xe9\x06\x61\x17\x35\x29\x3e\x87\x3b\x9b\x9e\x19\x12\x17\x94\xd9\xa3\x28\x1d\x90\xe2\x1f\x51\x42\xe2\x1e\xf8\xb7\xe7\x29\x2f\x48\x8e\xc7\x65\xcf\xa7\xc9\xe6\x1e\x8d\x00\x90\xd7\xd8\xeb\x3b\x6a\x72\x5d\x06\x52\x61\x47\x44\x0f\x3c\xd5\x1a\xce\xb3\x3c\x15\xb5\xa8\x82\xf7\xcc\xac\x89\xdf\xc8\x5a\x76\x01\xdc\xc1\xb1\x80\xed\x8a\xd0\xbe\x6a\xa1\x7f\xb8\x4c\xc7\x24\xf5\x0b\x32\xdc\xa3\xb0\xd8\xc6\xb8\x3b\x15\x30\x14\x23\xe9\x14\x4e\x15\xde\xc3\x9c\x0b\x66\x3a\xa5\xe1\xfe\x61\x1a\x2a\xd0\xa1\xcc\xf2\x33\x32\x9d\xe1\xa2\xa9\xbc\x0e\xa5\xd1\x02\xcf\xfd\x9c\x66\xe7\xe9\x87\x32\x2a\xed\xc8\xeb\x76\x6e\x75\x03\x7a\x15\x7b\x76\x0d\x8b\x65\x92\xe0\xb8\xa9\x0a\x1d\xaa\xe2\x7c\xa9\xfc\xd4\x54\x78\x01\x6f\xba\xf2\x0a\x1b\x21\x02\x55\x4f\x4d\x05\x0d\x25\x8d\xdb\x90\xd0\x93\xa6\xc1\xfa\x8e\x01\x61\x75\x96\x56\xd2\xe6\x0d\xa1\x3f\x59\x2b\x61\xec\x64\xa1\x27\x8d\xc1\x56\x5d\x98\x86\x95\x39\x7a\x39\xff\x80\xaa\xf3\x2a\xca\xda\x1a\x28\x4f\x15\x36\x88\xd1\x7b\xe3\x9c\x1f\x7a\x53\x75\x78\xfd\x00\x13\x7a\xd2\x74\x58\x0b\x8d\x9e\x44\x1d\xda\xe6\x2a\x61\x45\x3a\xe3\x46\x86\x5d\x0d\xbb\x3a\xe8\x84\x5b\x4f\xaa\xbc\x9a\x50\x96\xdc\x09\x77\x76\xae\x4f\x83\x9d\xad\x7b\x33\x9b\x7b\x33\x9b\xff\x18\x33\x1b\x4e\xe9\x77\x11\x52\x62\x35\x9f\xe0\x2d\x6d\x6b\xee\xd0\x75\x78\x7b\x67\xdf\x51\x92\x0c\xad\xd0\x73\xf0\x60\x91\x0f\x44\xc5\xbc\x72\x5c\x80\x0b\xb3\x5e\x37\x46\x4f\x8d\xeb\x6f\x5f\x90\x9e\x4f\x6c\xeb\xe2\xae\xa9\xf5\xf0\x94\xab\xbb\x8d\x56\x95\x72\xde\xaf\xd7\xca\x92\x6e\x57\x2d\x44\xb6\x8a\xe0\x10\x06\x75\x8a\x6f\x1d\x46\x44\xaf\xe4\x20\xfc\x53\x87\xb8\x13\xb7\xe5\x94\xfb\xdb\x93\x61\x78\xb4\x83\xfb\xdc\xe7\xca\xc1\x9c\x76\x0e\xc8\xa7\x85\x6e\xf5\x72\x83\xa0\xac\x42\x22\x57\x01\xac\xe0\x25\x3a\x70\x72\xf6\xec\x23\x9f\x16\xcc\x37\xf9\x3a\x17\xcd\xda\x75\x58\x17\xb5\x6a\x3b\xad\x77\xef\x07\x87\x94\x44\x8e\x1e\x8e\x8b\x3f\x02\x73\x07\xe7\x1f\x9b\xfd\x2a\xbb\x46\x08\xec\x29\x3c\xb4\x44\x44\x93\xdf\x44\x71\xa0\x85\x9b\x7e\x2d\x84\xaf\xe9\x08\x3c\x7b\xc7\xc0\x3c\x41\xb7\x9c\x25\xac\xbc\xa6\x56\xf8\x50\x8c\x12\xd9\xaa\x32\x7c\x18\xd6\x4d\x99\x6c\xbf\x72\xa2\x9c\x30\x6d\xab\x4f\xdf\xaa\xb3\x67\x46\x57\xab\x08\xdf\xc6\x8e\x7c\x86\x69\x83\xc7\x3f\xb3\x11\x4e\x6d\x1f\x55\xf8\x5e\xf6\xb9\xee\xe5\xa6\xda\xda\x88\x8c\x38\x6d\x35\xc6\x04\x15\xc1\x05\x04\x76\x6f\xe6\x44\xdd\x5b\xbc\x76\x6a\x6f\xe4\x4a\x9d\xbb\x7e\xdd\x0c\xd0\x13\x71\x58\xae\x69\x62\x99\x2e\xa2\xf1\xe7\x23\xa6\xa6\x33\xcc\x65\x20\x49\x5f\xeb\xeb\x66\x92\xea\x82\xe9\x28\x43\x54\xc5\x7e\x48\xea\xda\x47\xdb\xe8\xa9\x48\x14\xde\x69\x91\x10\xab\xd5\x53\x55\xe9\x4f\xb6\xca\x39\xad\xbe\xab\x04\xbc\xb8\x39\xa3\xfc\x68\xaa\xbb\xd5\x94\x31\x8a\x4e\x36\x4f\x51\xe8\x73\x9e\xfa\x1c\xa2\x61\x46\x5a\x00\x52\x81\x2c\x3b\xc4\x69\x94\x24\xfa\xfa\x1d\x0c\x06\x62\x09\x3f\xb7\xcb\x1a\x4c\x03\xe9\x7e\x1a\x4a\x08\xf3\x79\xc8\xa4\x31\x88\x74\x28\x40\xa9\xdc\x1a\xc9\x1a\x02\x33\x92\xb1\x48\x66\x6e\x7a\xe0\xb9\x8d\x90\x61\x23\xe3\x41\x44\x94\xc6\xe6\xab\x7e\x01\xc6\x42\x81\x32\x41\x93\xd6\xc1\x82\x3b\x51\x70\x8e\x36\x2f\xed\xf2\x59\x85\x50\x86\x4d\x54\x0b\xbd\xaa\x0a\x17\xb9\x4a\x2c\x48\xd7\x28\x29\xea\xa3\x2f\x62\xd3\xb3\xcc\x8f\xa4\x8c\xa0\x47\x4c\x57\xde\x2c\x8d\x7d\xb8\xa7\x71\x01\xf0\xc8\x69\x6e\x77\x7a\x11\x7d\xbf\xb1\x8b\x29\x7d\x27\xf3\xa2\x29\x18\xb1\x80\x53\x17\x9a\xeb\xbe\xd7\x67\x4a\x85\x25\x19\x1f\x2e\x67\x0c\x09\xbc\xea\xc0\xe8\x9a\xfb\xd6\x04\x4a\xe9\x4b\xb8\x67\xac\x07\xcd\x13\xbd\xf3\x3a\xac\x4d\x83\x81\xeb\x72\xc1\xe5\x01\x9a\xc3\x05\x61\x52\x6c\xbc\xf4\x0d\xd8\x35\x9b\x15\xbc\x9e\x75\x1a\xc7\x8e\x63\xdb\x32\xbf\xb4\x9e\xca\x68\xa0\xf0\x3a\xa6\x7a\xbc\xc8\x78\xce\x33\x86\xf7\x94\x3d\xc7\x69\x02\xa3\xf8\x7d\x84\xbd\xee\x1a\xec\xce\x8b\xd6\x35\xed\x6f\xed\x46\xd1\x46\x90\xb7\xb7\x0d\xb3\x48\xe3\xae\x60\xb5\xf0\xa7\x5a\x6a\x8d\x6b\x46\x90\x14\x07\x54\xb1\xfa\x41\x8a\x34\x84\x7b\xf3\x29\xe7\xaa\x71\xed\xd5\x7b\x5f\xc7\xa8\xd8\xbb\x5c\x8d\xb0\x3c\xbe\x68\xe1\xe6\x25\xc7\xf5\x9a\xb5\xcc\x2a\xc0\xdb\xfb\x40\xc6\x45\x49\xe6\x51\x89\x7f\x8a\x40\x1f\xd3\x44\x55\x1a\x78\x13\x45\xe9\x35\xdf\x05\x35\x7d\x7d\xea\x68\x37\x43\xda\xb8\x9a\x66\xc7\x03\x5a\x35\x33\xef\x45\x33\x58\x04\x78\x61\xf1\x97\xb9\x6a\x85\xcb\x07\xfe\x48\xcb\xee\xce\x6a\x57\xd3\x34\x57\x4d\xf1\x98\x6f\x36\x4f\xad\x10\x2f\x2e\xbc\xf8\xca\xac\x09\x5e\xec\x95\x9a\x6f\x11\x27\x4a\x2f\x2a\xf0\xac\x91\x7d\x2d\xc2\x7e\xdb\xa0\x51\xb2\xfe\x1b\xc5\x8d\x92\x85\x56\x1d\xe4\xd7\x0c\x22\x65\xc6\xc6\xcf\x17\x63\xe1\x8e\xa5\x60\x07\xe3\x26\x46\xc4\xa1\xab\x2f\xed\x6b\xc6\xc5\xcb\xfe\xb1\xb9\x12\x32\x3c\xe7\x0b\x30\x5d\x4c\x31\xfc\xc0\xeb\x73\xe2\x7a\x2e\xb2\x54\x5c\x4f\x51\x17\x97\xb3\x4f\xb4\xc7\x5d\x14\xb2\x0f\x6b\x27\xe9\x06\x8e\xf0\x12\x2a\xbf\x41\xea\xae\x5c\xf8\x3a\xe2\xc3\x39\xd5\xfc\xe9\x41\xc7\x85\x0b\x3c\xc6\x20\x1b\x89\x41\x78\xbc\xaf\xda\x7e\x64\x20\x89\xfa\xad\xc7\x13\xf3\x41\x9f\xe0\xd2\x10\x74\xd6\x4d\xec\x28\x63\x05\xd8\xe6\x4b\x5d\x86\x12\xcf\xd1\x55\x5a\xd5\x56\x61\xa1\x73\x10\x2d\x16\xc9\x25\x77\x8e\xd1\x8a\xb0\xfa\xb6\x95\x0f\xdb\x02\xac\x66\x68\xe2\x8d\xea\x6e\x98\x07\x1e\x1a\x41\x31\x1e\x15\x1d\xe1\xd6\x61\x11\x3c\x13\xf6\xb5\x22\x23\x88\x74\xb5\xe2\x75\xef\x20\x95\xe0\xfc\xb0\xa9\x30\x5c\x05\xe8\x4a\xcd\xde\xc9\xaf\x2a\x6e\x8a\x48\x6c\x24\x2a\xa9\xb2\x98\xda\xad\x85\x57\x0b\xfa\xf9\xa7\x0c\x0b\x21\xca\x02\x81\x93\x7c\xbc\x4c\xa2\x7c\x7d\x7d\x7d\xbd\x3e\x18\x84\xa0\xa0\xbb\x8a\x07\xe1\xb8\x29\xd8\xbe\xbf\x3f\xbd\xbf\x3f\xfd\x6b\xdf\x9f\xf2\xcb\x53\x0a\x2b\x22\x74\xf8\xfd\x8a\xff\x6e\x1e\xc3\xed\xbb\xd9\xce\xb2\x60\x6e\x9d\xc7\x65\x87\x1b\xc6\x81\x3a\xc5\xba\x55\x65\x69\x22\xe0\xc9\x79\x96\x7f\x8e\x72\x4a\xd9\x74\x0f\xa3\x35\xe8\x23\xa6\xf4\x17\x93\xc9\x04\xe7\x38\x2d\x11\x4e\xcf\x0a\x5a\x86\xd6\xfc\xcf\x37\xaf\x5f\x95\xe5\x82\x3b\x25\x04\xfe\xc4\x03\x93\x90\x69\x9a\xd1\xa5\x9b\x90\x14\x43\x13\xa3\x3c\x3b\x2f\x70\xbe\x06\x92\x01\x73\x02\x76\x4e\xd2\x38\x3b\x07\x0d\x87\xe6\xb4\x1b\x3d\x78\xc0\x73\x06\x66\xf5\x82\xcb\x9a\xa9\x68\xdf\x0f\x5d\xd9\x99\xe1\x10\xa5\x59\x8c\xd7\x0c\x17\x3a\x4e\x9d\x12\x55\x17\xf3\x84\xe2\x82\x6f\x86\xdd\x7e\xdb\x66\xae\x19\xee\xff\xf9\xea\xfd\xb6\x51\xdd\x2c\xdf\xee\xf6\x6b\x30\xc5\xa4\x0d\xda\xc2\x3b\x81\x7e\xf7\xde\x1a\x64\x2e\x7a\x1c\x00\x2f\x72\xcc\x25\x2c\xed\xa5\xbc\xa5\x36\xca\xeb\x62\xc2\x2c\x2b\xca\x40\xc4\xd9\x37\x2e\xa7\x69\x0e\xda\x47\xf0\xdf\xd5\x15\xea\xf2\xf5\x91\x64\xe3\x28\xa1\x89\xe1\x93\x6f\x76\xbf\xe9\x6a\x1a\x4c\x11\xac\x7f\x5f\x86\xed\xbf\xba\x42\x9b\x8d\x42\xd3\x22\xc7\x0b\x08\x9e\x83\xcf\x2d\xb4\x5b\x32\x13\x07\x7c\xaf\x9d\x61\xb4\xb0\xd1\x38\x4a\xaf\x21\x28\x27\x8b\x1b\xcd\xe6\x4d\x61\x8a\x7b\x20\xd3\x0e\x7a\x66\x5b\x86\xd3\x0b\x1d\x5b\x9a\xbc\x65\x76\xc0\xbc\xe3\xa3\xd5\xeb\xa2\x16\xef\x81\xa6\x27\x31\x40\x10\x52\xc2\x15\x0c\xfc\xd5\xfb\x6d\x15\xa9\x4e\x48\x5a\x1a\x46\x35\x04\x73\x91\xc1\x70\xf8\x64\xd5\x66\x0c\xad\x67\x1b\x03\xb2\xca\xb3\x05\x4e\x7b\xdd\x77\x47\x1f\x3e\x76\x03\x35\xe3\x01\xc3\x94\xbc\xc5\x61\xb0\xca\xd1\xe8\x2b\x1c\xc5\x38\xef\x75\xa9\xcc\x89\xd3\xf2\x11\x3d\xbc\x76\x83\x2e\x15\xa6\xc9\x18\xb6\xc1\xe1\x2f\x85\xd2\xe4\xc9\x6b\x20\x8e\x8d\x06\x5a\x60\x9e\xdb\x2f\xd3\xb1\x76\x52\xb5\xd5\xb3\xbe\x0b\xdb\x85\x76\xed\xeb\x0f\xa7\x59\x37\xaf\x85\x1d\x5b\x49\x28\xa8\xdc\xf9\x14\x53\x61\x92\x02\x8f\xcf\xc8\x27\xdb\x54\x9b\x2b\x14\xa6\x71\x0f\x8c\xb1\x99\xf7\x7c\x32\xb9\x94\xed\x48\x53\x60\xd0\x93\xbb\x2e\x42\x99\x46\x95\xb1\xe8\xc1\x21\x33\xc3\x7d\x9e\xa5\x29\xe6\x76\xd3\x62\xf2\xdc\xbb\x06\x79\x85\x27\xba\x21\x1c\x75\x7f\xc4\x17\x65\x45\x7f\x79\x09\xcd\x70\x9c\xdb\xee\x5a\xbd\x6c\xea\xe1\x7b\xde\x54\xcf\xd7\x76\xa3\x81\x6a\xa5\x6a\x07\x68\x24\x6a\x20\x92\x03\xb9\xdc\x6b\x28\x85\x67\xfd\x28\xef\x00\xa5\x32\xa2\xcc\xc9\x74\x0a\xc1\xeb\xb3\x14\x51\xea\x00\xc1\x41\xfa\xa5\xa3\xc8\x68\x22\x28\xe8\x81\x8f\xaa\xcc\xb0\x89\xed\xe8\x0b\x82\x8f\xee\x59\xeb\x37\x05\x3f\xa2\x45\x19\x95\x78\x3c\x8b\x52\xc3\x2f\x77\xcf\xbe\x16\x52\x73\x10\xc5\x97\x60\x23\x0c\xb7\xb1\xbb\x74\x77\xb5\xd9\xcd\xba\x2f\xfa\x61\x0b\x6a\xb2\xc1\xc5\xed\x8e\x16\x65\x43\xd2\x8b\x73\xb5\xd4\x8a\xf6\xc4\x9f\x97\x06\xc5\x9f\xbc\x54\x5a\x99\x1a\x65\xf5\x66\x67\xed\x7b\x28\xa7\x4b\xa6\x8f\x6c\x35\x41\x8a\x7f\x7b\xe6\xc5\xac\xb5\x18\xa8\x05\xfd\x91\x15\xeb\xe9\x4c\x5f\xf2\x88\xaf\xc6\x64\xec\xfe\xd4\xf1\x19\xc7\x75\x3d\x5d\xa9\xea\xce\x3b\xb9\xa4\x2b\x88\xbd\xa0\x83\xe5\x4a\xd7\x49\xc5\x6a\x25\x05\x6f\x01\x9b\xec\x5b\xee\xe9\x42\x4f\x69\xef\xed\xf4\x4c\x90\x76\x4b\x34\x89\x48\x82\xe3\x01\x3a\xa2\x67\xaf\x73\x42\xcf\x13\x11\xc4\x5d\xa9\x5e\x9f\x5a\x9b\xbe\xb9\x31\x71\x2b\x75\x13\x3d\xeb\xd5\x6a\x1c\xa2\xef\xe4\x5f\x60\xe4\xd1\x2d\x30\x5f\x8c\x43\xd4\xdd\x1e\x6c\x76\xcd\x3c\xa1\x5d\xec\xa6\xb8\xfc\x94\x90\xa2\xc4\x29\x49\xa7\x16\x90\xd4\x10\x9e\x2a\x22\xf3\xdc\x39\xab\x18\xe4\xbe\x05\x21\xec\xb6\x28\x3a\xf4\x09\x73\x34\x04\x3a\x9a\xf6\x44\x94\x31\x46\x06\x9d\x70\xfb\x71\xd0\xa1\x52\x6a\x27\x7c\x42\x7f\x19\xe2\x6f\x27\xdc\xfa\x96\x9e\xfc\x77\xee\x4f\xfe\xf7\x27\xff\xbf\xf8\xc9\x5f\x99\x4e\xc3\x33\xae\x3b\x32\x9b\x96\x4f\x41\xf4\x43\xe1\x88\x4c\x99\x33\x80\xc1\x2f\xec\x48\xce\xae\x3e\xe2\xd7\x78\x62\x1e\x3b\x64\xe4\xad\x4b\xed\xe9\x91\xb1\x53\x33\x08\xb6\xfa\xcf\x67\xb4\xf7\x3d\xd3\x26\xeb\x7b\x56\x18\x3d\x44\xdb\xee\xdb\x25\x30\xf2\xeb\xa2\x0d\x29\x99\x21\xdb\x0b\x9b\x47\x64\x7b\xc7\x0f\x74\x51\x8a\x0e\x9f\x1d\xbc\xe5\x93\x1c\xa3\xef\xbe\x45\xe3\x6c\xbe\x58\x72\xc7\xff\xa3\x4b\x34\xcf\xce\x48\x3a\xd5\x42\xda\xec\xa2\xf1\x2c\xca\x61\xdf\x60\x97\xb1\x31\xb3\x9e\x12\x26\xc1\x02\x3a\xc1\xcc\x30\xbc\xcc\x68\x83\x0c\x57\x05\xea\x1d\xa0\x7d\xb4\xb5\x19\xa0\x67\xf4\xff\xad\x00\x0d\x06\x83\x00\xfd\x0f\xda\x47\x3b\xdf\xf4\xe9\xc1\x06\x15\x0b\x3c\x26\x13\xc2\x16\xd2\xe1\x87\xa3\xad\x9d\xc7\x5b\x8f\x6d\xab\x32\x52\x64\x90\xce\xc7\xe1\x7a\x52\xbc\x66\xaf\x04\x69\x47\xe8\x00\xcd\xdb\x34\xfd\x32\x99\x4b\x71\xb1\x00\xe3\x8f\xbd\xcd\xfa\xcd\x18\xdb\xa3\x28\xd5\xe7\x91\x8e\xa8\x7b\xd0\x1d\x50\xb4\x3c\xcf\x62\x7c\x50\xf6\x36\x35\x45\x35\x1d\x5b\xf7\x7f\x9c\x6c\xc6\x00\xd9\x4b\x46\x20\xd6\x32\x3b\x5e\x2c\x70\xfe\x3c\x2a\x94\xf6\x5a\xcb\x2e\x96\xa3\xa2\xcc\x7b\xbb\x7d\xf1\x46\x91\x27\x6c\x06\xbb\xd6\x25\x19\xcb\x5d\x24\xa4\xec\x75\xbb\x7d\xf3\xf9\x66\xda\x37\x0d\xaa\xc6\x59\x4c\x07\x97\xfa\x3a\x8f\x84\x2b\x70\x0a\xf3\xc3\x3e\x3a\xa0\x72\x28\x7c\x7c\xbf\x8f\xfe\xa7\xef\x78\xba\xf6\xcc\x2c\x9f\x58\x03\x52\x3a\x52\x8c\x31\x7a\x84\x0e\xd0\x06\xda\xda\xd4\xc4\x34\x9f\xf7\x67\x11\x09\xce\x91\xe6\xfa\x83\x5f\x32\x92\xd2\x61\xda\xc6\x89\xe3\x25\x78\x99\x84\x29\x7e\x73\xf4\x82\x12\xf6\xd6\xa6\x60\x4a\xdc\xa8\x0f\x28\xdf\x43\x71\xdf\x6e\x3e\xde\xb5\x09\x6e\x9e\xc5\xdf\x7d\xbb\xb5\x59\x45\x68\x26\x7d\x29\xdf\x9d\x8c\x9a\x78\xe1\x5a\x2a\xca\xf1\x3c\x22\x29\x53\xfd\xd0\x3c\x25\x6b\x70\x4f\x18\x26\x7b\xe0\xc0\xca\x1a\x79\xbb\x6f\xf9\xf8\x00\x66\x25\xc0\xa4\x91\xeb\x77\x86\x84\xa2\x9a\x04\x41\xfe\x30\x2d\x99\xfb\x90\x00\x6d\x6d\xf6\xd1\xff\x4b\xb1\xb6\xe1\xd4\xc2\x3c\x88\xb0\x86\xbd\x47\x44\x59\x97\x2c\xa9\xea\x33\xe6\xa9\xf9\xad\x07\x33\x2c\x87\x75\xa0\x87\xe2\x87\x84\x71\x96\xe7\x34\x85\xb1\x4f\x31\x5f\xfe\xc9\x19\xea\x1e\x5e\xfd\x93\xc0\x8d\x9f\xd5\x92\x73\xbb\xea\xc4\xfc\x6b\xea\x27\x86\x50\x1b\xcb\xb9\x78\x01\x61\x11\x15\x85\x39\x90\x39\x4e\xdf\x23\x2d\x4b\x88\xdc\x74\x08\xd7\x92\xad\xe9\x0a\x31\x9a\x33\xd0\x6a\x6c\x7a\x45\x1d\x15\xcf\xc4\x2b\x6a\xe5\x6b\x46\xc4\x8e\x43\x5b\x8f\x35\x16\x36\x8a\x0a\xbc\xf3\x18\xed\x43\x99\x41\x99\x71\x07\x30\x3b\x8f\x8d\x5b\xff\x38\x06\x51\x9d\xef\x81\x3d\x56\x28\x40\x5b\xdf\x98\x7a\x26\xd9\xcf\x67\xa3\x28\xed\xb1\x62\x26\xf3\xb3\x16\x33\x77\xd4\xa0\x2d\xdc\x67\x74\xe8\x65\x66\xec\x5e\x74\xfa\x10\xb8\x1d\xcc\x2f\xc5\x8a\x66\xca\x2e\x30\xd1\x7d\xc7\x3c\x9e\xa7\x59\xc9\x85\xb2\xef\xc9\x0f\x9d\x29\x48\x24\xcc\x01\xc8\x44\x21\xb5\x98\x45\x4c\x5a\x83\xfd\xed\x62\x9c\x2c\x0b\x72\x26\xe3\xa7\x91\x11\x49\x48\x29\x05\x9c\x51\x94\x7e\x1e\x8e\xf2\x28\x1d\xcf\x50\x81\xf3\x33\x32\x16\x1b\x60\xc4\xbc\x20\x76\xbe\x1f\x92\x1f\x06\x36\x0d\x49\x67\xe9\x85\xd8\x85\x26\x38\xa7\xdb\x50\x94\x4c\xb3\x9c\x94\xb3\x39\x8a\x71\x31\xce\xc9\x88\xb1\x25\x2e\xff\xe0\x74\x70\x4e\x3e\x93\x05\x8e\x49\x04\x42\x10\xfd\x1a\x1e\xa6\x25\xce\xd3\x88\x3d\x88\xf8\xf4\x2c\x4a\x3f\x7f\xe2\x2e\x18\x3f\xb1\x79\xfd\x7f\x7e\xe2\x23\x4d\xa7\x9f\xe8\x10\x3f\x41\x2c\x98\x4f\x31\x99\x12\xe7\x81\x86\x98\x1a\x1f\x45\x8e\xc4\x9e\x2a\x66\x40\x78\xd1\x28\x33\xcf\x36\xdb\x82\x56\x9f\xd9\x2b\x72\x64\xb1\x45\x3e\xa3\xcf\xd9\x3e\xd5\xfd\xe7\xcb\xee\xde\x9a\x97\x67\x72\x1e\xdb\xb3\x76\xee\x9e\x5e\xc1\x06\xea\x6e\x82\xa8\x04\xad\xe8\x16\x2e\x14\x1d\x2f\x28\x36\xd0\x3e\xea\x31\x71\xaa\xf7\xdd\x13\xf4\x48\x35\xd1\x17\x2f\x05\x1e\x6d\x5b\xfb\xad\xf4\x43\x60\x36\xa5\xd5\xc9\x1b\x6c\x50\x9a\x71\x26\xa2\xe1\x0a\x08\x9b\x85\x73\x25\x69\x51\x92\x72\x59\x0a\x47\xa2\x24\xc6\x69\x49\x37\x2d\xdb\xd9\x34\xab\xe5\x30\x8d\xc1\xd3\x41\xf5\xcb\x99\x22\x10\xb2\xac\x7c\x3a\x03\x21\x81\x3a\x5a\x4b\x1d\x68\xaa\xa3\xda\xea\xac\xc2\x8b\xcc\x9e\x54\x05\x1c\xad\xe4\x0c\xdd\x97\x1f\x5f\xd1\x79\x10\x0f\x5a\x74\x0c\x68\xa9\xb2\x6f\x7d\x8b\x5f\x67\x75\xfc\x5a\x84\x42\x62\xc8\xe5\xb1\x52\x49\x81\x98\xf7\x04\x8d\x8f\x3b\x72\x27\xf8\x94\xa8\x94\x37\xe5\x5e\xe4\x51\x92\x08\xe5\x08\x29\x55\x4b\x52\xe8\x3c\xd4\x3c\x56\xd4\xca\x09\x44\xf7\x7c\x41\x18\x59\xe9\xc2\x9f\x72\x7b\xd1\xa8\xc9\x97\x58\x80\xae\x03\xfb\xcc\xf3\xfa\x31\x2b\x4f\xe4\xde\x51\x05\x28\xf3\x68\x78\x60\x6c\xba\x66\xc7\x1d\xa5\x45\x09\xc3\xff\xfd\xe7\xcb\x93\xcd\x47\xdf\x9d\x7e\xd9\xbe\xee\xbd\xfc\xf8\x8a\xfe\x3e\x78\xf4\x3f\xa7\x5f\xb6\x76\xae\xaf\xe4\xc7\xce\x66\xb0\xb3\x75\xdd\xff\xaf\xe1\xa0\x04\x05\xac\xdc\xc0\xfb\xe8\xc1\x03\x29\xe5\x54\x31\x06\x0d\x9c\x79\xf4\xd9\x5a\x11\x61\xdc\x55\x1c\x9c\xfe\xbd\x68\x7b\xa1\x96\xe0\xdd\xe0\xed\x85\xbb\x92\x2c\xc4\xa9\x41\xe9\xef\x79\x76\x76\x21\xea\xb2\x3f\xef\x9b\x1b\x0e\x7b\x82\x48\x5a\x31\x70\x83\xfb\xdc\xcd\xd0\xbd\x6c\xa4\xd5\xe0\xb7\x9b\xaf\x37\xa7\xb8\xe4\x22\x25\x1d\x69\xb1\x9c\x53\xc0\xe3\x82\x1f\x1f\xe6\x59\xfc\xe8\xbb\x6f\x1f\x6d\x6d\xca\x6c\x38\xe3\x42\xef\xc6\x59\x82\x7a\x87\x1f\x8e\x86\x87\x2f\x9f\x23\x7a\x6e\x08\xb7\x37\x37\x77\xfa\x36\x4f\xd6\xaa\x75\x4f\xa1\x5a\xae\x33\x70\x91\xd7\x72\xd8\xfc\x4c\xb8\x1d\xa0\xed\x76\xe6\xa9\x3a\x53\x35\xb6\x14\x84\xa7\x03\xf4\xcf\xf7\x2f\x7f\x72\x5c\xab\xc9\x02\xfe\xd1\x54\xd6\xe8\x4e\xaa\x06\xd9\x34\x3c\x45\x00\x3d\xf0\xbb\xe5\x0c\xf9\xdb\x00\xed\xf6\x51\x88\xba\xdd\x56\xe3\x1e\x27\x04\xde\x8e\xc9\x0e\x82\xf2\x89\xa4\xf6\xf8\x28\x16\x7e\x3a\xf8\xc7\xd1\x8f\xff\x3a\x7a\xff\xdf\xf6\xac\x42\x1d\x15\x73\x6a\xd7\xef\x9d\x5c\x06\x74\xeb\xb1\x6f\x6d\xad\x3e\x72\xbe\x9a\xfc\xe7\x12\xf7\xe0\xe1\x0e\xcd\xa9\xc0\x19\x5e\xe4\x39\x87\xe8\x0f\x24\xf9\xe0\x7c\x2e\x99\x8c\x43\x87\x3b\xe0\x5d\xed\x10\x5b\x79\x94\x11\xe7\x0f\x79\x4a\x31\x4e\xa8\xec\x8c\x62\x9e\x67\xb6\x1e\xf7\x03\xb4\xbd\x29\x2f\x61\x0c\x29\x4f\xa0\xd7\x1a\xa4\x28\xdc\x6e\x81\x56\xf8\xf5\x39\x84\x2c\xa6\xd4\xd7\xf5\x8a\x9d\xd0\xfc\xbc\x3e\x0d\x76\x76\xef\xd5\xf8\xf7\x6a\xfc\xbf\xb8\x1a\x9f\xab\xf0\x17\xe3\x7a\xfb\xbd\xbb\xb5\xb8\x6b\xe9\xf2\xa4\xc1\x30\x8f\xe9\x99\x16\x63\xaf\x21\xd7\x22\x2a\x67\x01\x4a\xb1\x61\xf0\xfd\x09\x34\x17\xce\x5b\x53\x71\xf5\xad\x87\x30\x15\xbe\x08\x98\xf9\x41\x04\x8e\x49\xe8\x7f\x2c\x55\x65\x8d\xe5\x7d\x30\x70\xc5\x52\x24\xf4\xbe\x50\xe8\x50\x95\x97\xce\xf9\xac\x62\x83\x2c\xed\x75\x61\x54\x5d\x3d\xe4\x5f\xdf\x30\x99\x2e\x32\xca\xc4\xd8\xf3\xc1\xc3\x77\xcf\x91\xba\x85\x66\x8f\x0a\xbb\x01\xd2\x03\x59\x7f\x62\x6c\x90\xdf\x95\xf7\x6c\xf7\x80\xde\x1e\xa4\xb1\xde\xbe\xd6\x7c\x65\x65\x68\x4d\x3e\x2b\x78\x7d\xf8\xe1\xe3\xcb\xb7\xb0\x82\x9e\x1f\xbd\x7d\xfb\xf2\xf9\xc7\xc3\xa3\xb7\xe8\xfd\xcb\x0f\xef\x8e\xde\x7e\x78\xf9\xa1\xb2\xd5\x38\x2a\x23\xbd\x59\xfa\xad\x6f\x4e\xc3\x87\xdc\x0a\x70\x1e\x5d\x8c\xb3\xf9\x22\xc1\x17\xa4\xbc\x0c\xd1\x63\xa0\x2c\xab\x87\xa0\x0b\x95\x76\x0d\xb4\x2a\xb5\xdf\xf4\x3d\xd1\x1f\xb8\xdd\xc2\x97\x35\xc7\x52\x83\xc4\x7e\x33\x0d\x1e\xc6\x16\xf8\x4b\x8c\xce\x67\x64\x3c\x43\x73\x1e\xd5\x9f\x85\x9c\xa7\x9b\x10\x65\x68\xb1\x79\x37\xee\x3a\x5b\x87\xa6\xfd\xf1\x5c\xe1\x3a\xca\xe9\x2d\x18\x2d\xf8\xa3\x2d\x92\x49\xef\x93\x9f\x90\x4f\xe0\x39\x1c\x89\x4f\x5d\xdf\xd1\xb2\x30\x1d\x2b\x07\xdb\x73\xa0\x9c\x50\xe8\x55\x11\x23\xa1\x1a\xde\x77\xbb\xa2\x6b\x07\x8b\x13\x92\x63\xc3\x09\x80\x8d\xae\xaa\xf1\xd0\xa1\x78\x5a\xaf\x01\x57\xe1\x2b\x5d\xbb\x19\xfa\x17\xe3\x04\x97\xb8\xae\x06\x7b\x30\x36\x6e\xf4\x87\xd7\x3f\xd3\x5d\x0b\x08\x91\x13\x04\xab\x0f\x94\x3b\xcc\x52\x2b\x65\xce\x5e\x50\xc6\x9c\xcf\x92\x72\xb0\xb6\x26\x84\x41\x93\x84\xd7\x6c\xb5\x07\x3c\xc2\xa4\xc2\x9f\xe2\x79\x9a\x78\x64\x16\xd6\x0d\x39\xf4\x55\x65\xb3\xc1\xc0\x92\xd7\xfe\xc1\x7c\x3d\x2b\x97\xa5\x62\x89\xbf\x78\xf9\xe8\xf9\xab\xe3\xb7\xff\xfd\xf2\xbd\xac\x27\xc6\xe3\xd9\x32\xfd\x8c\x63\xfe\x90\x84\x3d\x12\xe5\x7f\x83\x1c\x2f\x92\x68\x8c\x7b\xc3\x7f\x5f\x9f\xfc\x3b\xfd\x77\x7e\xfa\xf4\xdf\x5f\x86\xd3\xa0\x7b\x7d\xf5\xe8\xd1\xd5\x97\x6e\x1f\x9c\xad\x7e\xf1\xc2\xff\xfb\x54\x94\x38\xe1\x65\x4e\x69\xa1\x13\x51\xea\xf4\xc4\x5f\xce\x2e\x65\x14\xaa\x28\xa3\xda\xd2\x5a\x92\x0d\x69\x65\xf8\x35\x1f\xcd\xee\x0a\x4e\x6a\x60\xc0\x5d\xb3\x80\x78\x8d\xbf\x0c\x87\x70\x07\x8a\xb9\x07\x0c\x70\xae\x01\x15\xac\x39\xa4\x4f\xf3\x9e\xd3\x2c\x73\xe5\x72\x57\x33\x16\x0c\xda\x40\xec\xc9\xab\x21\xaa\xcb\x3b\x6b\x8b\x93\xb9\xc6\x66\x3e\x43\x33\xe8\xbb\x56\xca\x30\xa9\x59\x73\x17\x9f\xea\xcc\xbe\xdd\x19\x64\x44\xc1\xe6\x46\x60\xe0\x5e\x2c\x1d\xe3\x04\x5c\x8c\x8b\x77\x9b\x46\x99\x71\x82\xa3\x5c\x58\x7f\x59\xad\xf0\x64\x6b\x41\xfb\x81\xc0\x3d\x43\x29\x2a\xf2\xed\x71\x66\x79\x7b\xaf\xd3\xff\x6a\x2d\x3b\x39\xce\x74\xf8\xeb\x00\x6d\x6d\x6e\x6e\xa2\x87\xec\x72\xc6\x73\xd7\xea\xf5\xf5\x00\x4f\xf5\x00\x3b\x02\x5f\x94\x83\x14\x98\xd3\x0b\x8b\x20\xc1\x9f\xf2\xad\x8e\x2a\x77\xc6\x2c\x12\x81\xd0\x28\xdc\xae\xd3\xe9\x30\x63\x11\x2c\xec\xb1\x69\x0a\x6b\x69\xeb\x75\x70\xee\xef\x87\xf2\xc8\x9f\xf8\x16\x1a\xc5\x71\xa1\xc7\xc3\xe5\x56\x0e\xae\x34\xc6\xd4\xc3\xc1\x1a\xdb\x70\xc5\xc1\x80\x9f\xb5\x09\x73\xe0\xcd\xb9\xde\x5c\x04\xf7\x36\xb8\xef\x61\xcc\x4a\x45\x79\x4e\xce\xb0\xce\x70\xa3\x58\xce\x9e\x68\xaf\x86\xc3\x7a\xa0\x0d\xff\xdd\x75\x16\xad\x84\x5d\xd8\x5d\xf2\xad\x16\x5d\x5d\x89\xaf\x93\xcd\x53\xb9\x65\xc2\x15\x36\xeb\x9b\x82\xe6\x09\x66\x09\x96\xa8\x4b\x74\xde\xcd\x0b\xed\xcb\xde\xd4\x49\xbc\x14\x74\x20\x1b\x16\x75\x8b\x5d\x4d\xac\x23\x7d\xa5\xb2\xa8\xd9\xdc\x2c\x85\x89\xe5\x70\xfa\x02\x8d\x3b\xdd\xdf\x63\x0d\xcd\x9c\x88\x6b\x50\x5b\x63\x1b\x3a\xc9\xf2\x1e\xc5\xcb\x67\x7c\xc9\x4e\x8a\xbe\x01\x98\x06\xbe\x3d\x3f\xd0\x60\x16\x15\x47\xe7\xe9\x3b\x88\x0f\x53\x5e\x42\xfc\xaf\xbe\x1d\xfe\xd9\x8b\x9e\xcf\xf8\xf2\xb4\xda\x12\xb4\x9b\xa5\xe8\xf0\xdd\xf3\xae\x1d\xaa\x9a\xcb\x16\x35\x75\x3a\x66\x16\x6a\x99\x3c\x17\xaa\x60\x90\x93\x98\xc3\x66\xa4\x1d\x37\x48\x81\x8a\x92\xb0\xf0\x0c\x24\xd6\x88\x5a\x37\x21\xad\x44\x78\x83\xcd\xa7\x7b\x5a\x12\x72\x00\xdd\x3d\x72\xcc\xfb\x11\x30\x2a\x30\x7b\x35\xcd\x52\xcc\x35\x4f\xbd\xf5\x4f\xb6\xd8\x7f\x9e\x93\x12\x5c\xa4\x58\xdc\x48\x03\xb1\x8e\x50\x9f\xdc\x33\x14\x67\x30\xeb\xeb\x55\xb5\x73\x05\x92\x77\xe8\x75\xef\x1b\xd6\x74\xfa\xb1\xea\xc5\x1f\x8c\x17\x2b\xfa\x26\xbb\x67\x70\xee\x15\x50\x24\xd0\xd4\x8c\x25\xe4\x39\x42\x35\x9e\x35\x45\x2f\x63\xed\xa5\xaf\x6f\x54\x35\x46\xd2\x37\x13\x1b\x24\x55\x57\x59\xa6\xb7\xd8\x47\x91\xf5\xe7\xdb\x27\x2d\xb3\x3b\xae\x4d\xb4\xce\x28\x8e\x07\x9e\x7f\x65\x4b\xb0\xc8\x56\x8f\xc5\x3a\xdd\x0d\x9b\xdd\x6e\x74\x3b\x7a\x24\xf7\xe4\x72\xa0\xdb\x74\x2b\x3e\x08\x8f\xb5\xb2\x12\x15\xcb\xc5\x22\xcb\x4b\xd0\xad\xb1\x9b\xda\x77\xcf\x91\xd4\xaa\x74\x0d\x1b\xf1\x6a\xc2\x5c\xe1\x9d\xc4\xea\x8b\xb1\x99\xca\x56\xa2\x30\xef\xb1\x1e\x68\xaa\xc1\xe8\x5e\xfa\x52\xb4\x77\xd3\x4a\x07\x37\xae\x1e\x57\x61\xb0\x3e\x7c\xbc\xb2\xdb\xbe\x3e\x0d\x76\xbe\xb9\x57\xe9\xde\xab\x74\xff\x23\x54\xba\xfc\xcd\xc5\xad\x9e\x63\x1f\x44\x79\x96\xa2\xff\x5e\xce\xa3\x33\x52\xa0\xef\x23\xfa\xf9\xb7\xcf\xec\x73\x30\xc7\x5e\x75\xef\x70\x88\x0e\x53\x52\x92\x28\x21\xbf\x62\xf4\x77\xd6\x0b\x4a\xa8\x11\x2a\xc0\x12\x4b\x18\xdc\xc0\x40\xe9\x52\x35\x1c\x49\x0f\x40\xab\x2b\x8a\x89\x38\x0c\x3c\x24\xcf\x61\x1c\xa2\xcd\xa6\x9b\x37\x66\xed\x41\x87\x6f\x3b\xcb\xf5\x9a\x99\x78\x9d\xe4\xaa\x37\x70\x22\xfa\xcf\x44\x20\x14\x5a\x52\x06\x3d\x1e\xd7\xba\xec\xb1\x4a\xa0\xa9\x7a\x26\xa2\x1a\x91\x25\x3c\xea\x7a\x3d\x0f\x69\x23\xa0\xed\x39\xbd\x1f\xae\x71\xf4\x54\x38\xd8\x65\x6d\x05\xbc\x31\xc3\x4f\x2a\xcb\xea\x57\xa9\x96\x45\x93\x8e\x31\x8f\x34\xdb\x5d\xef\x6a\x71\x78\xa2\xf8\x8c\x9e\x51\xc5\xec\xa0\xc3\x17\x90\x23\x7a\x27\x27\x6d\x63\xa3\xca\xb5\x50\xd5\xc3\x20\x12\x87\x6e\x35\x2a\x5b\xbc\x19\xe2\x23\x95\xe9\xe2\x99\x10\xfb\x9f\x1e\x98\xf8\x83\xa1\x66\x9f\x41\xd2\xf0\x42\xe0\x40\x1e\x1e\x85\x01\x91\xdf\x54\x47\x2a\xeb\x9a\x62\x41\x79\x1e\x65\x5b\x0d\xf8\xcd\x33\x04\x1a\xac\xf6\xac\x00\xaa\x2c\xd1\xba\x0c\x65\x6e\x7c\x34\x9d\x33\x07\x7a\x2a\xdb\x1e\xe0\x33\x9c\x5f\xf6\xa0\xf9\xa8\xc4\x1f\x48\x3a\x4d\xf0\x1b\x86\xf0\x3e\x0a\x91\x37\x43\xd5\xc4\xa7\x55\x76\xc4\x0f\xce\x27\xb0\xaf\x1e\x67\x73\xe1\x5d\xd0\x8d\x66\x41\x24\xd2\x18\x45\x1a\xb6\x45\x3c\x43\xcc\xcf\xfe\xfe\x3e\xa3\x1a\x1d\x88\x7b\x4e\x10\xb0\xf4\xcc\x4d\xc1\xd8\xb5\x6e\xd7\x57\x1d\x97\x61\x2d\x37\x92\xc3\x21\x0b\x56\x26\x93\xe8\x24\x51\x21\x4f\x63\x2e\x62\x3d\x56\xfb\xec\xd6\xa8\x8b\x31\xa2\x11\xf8\xfd\x6c\x60\x47\xcf\x28\x50\xb5\xe3\x6e\xde\x71\x8b\xbf\xb0\xba\x0a\xc6\x54\x79\x55\x42\xc0\x89\xfb\xa0\x3c\xe2\x8b\xa2\x27\x78\x4f\x1f\x4d\x08\x4e\x62\xcb\xf4\x80\xb7\x62\xf4\xd4\xe2\x39\x7a\x07\x2d\xc6\xc3\xba\x66\x91\xa1\x48\xb6\x3c\xeb\x0b\xb2\x70\x5f\xe8\x39\xec\x4d\xc0\x0e\x04\x6b\x13\xdf\x9c\xc5\x99\x7a\x78\x47\x56\xe4\xf5\x71\x39\x91\x8a\x81\x8f\xef\xc5\xc0\x7b\x31\xf0\xaf\x2d\x06\xaa\xf7\x79\x6c\xd1\xdc\xd5\x0b\xbd\xbb\xb9\xbb\xa7\x20\x6f\x84\xba\xb1\xd2\x58\x19\xce\x89\x3c\x1a\x86\xb0\x42\xa6\x9f\xda\x29\x92\x7b\x59\x13\xb9\xf4\xd3\xb8\xb8\x07\x9e\xa7\xf2\x95\x64\xb0\xa9\x81\x81\x1b\x7e\x3d\x4c\x9b\x32\x84\xd6\x33\xb4\x12\xcc\xb9\xb3\xaf\x88\x95\x63\x28\x5d\x41\x63\xf0\x26\x4a\xa3\x29\x56\x8e\x00\x28\xcb\x62\xa8\x30\x54\x01\xc2\xc3\x88\x02\xd7\xf6\xfb\xb9\x81\x21\xa7\xe2\x7c\xde\x60\xff\x1e\x63\xca\x61\x48\x6a\xba\xf4\xb4\xc4\xbf\x51\x54\x30\x8f\x0f\x55\xf1\x25\xa6\x18\x1c\x53\x7a\x36\x29\xd3\xb9\xbc\xed\x4b\x54\xb4\x69\xb6\x07\x24\xe6\x20\x82\xb7\x51\x19\x41\xc2\xf0\x20\xaa\x85\x28\x91\xc4\x21\xed\xf8\x84\xfb\xc2\x82\x0a\x36\x32\xa5\xc9\xb3\x31\xf3\xbf\xa9\x2e\x29\x78\xc0\x0d\xbe\xed\xca\x71\x0e\xd0\x1b\xca\xca\x09\x2e\x78\x58\x5d\xc0\x87\xe3\x78\xd2\x70\xe6\xd9\x1a\x6f\x62\x50\x57\x6f\x97\x49\xa2\xdc\x72\x04\x54\x8a\xc4\x17\x04\xae\xcd\x7c\xb8\xfb\x63\xc6\x78\x69\x23\x84\xd3\xd2\xdc\xf8\x59\xc7\xb2\x69\x38\x8f\x74\xdc\x0a\xd1\xf3\x20\x9f\x16\x8d\x88\x05\x85\x60\x81\xbe\x80\x3a\xf0\x5a\x3d\x14\x48\xb3\xd2\x8f\x49\xbd\xf6\xd6\x51\x67\xa8\x4c\xa9\x71\xa1\x26\xff\x30\xcc\x96\xf2\x68\xc2\x23\x4a\x78\x7d\x4a\x78\x70\xc6\x5d\xbb\x32\xaa\x03\x8c\xcb\xe3\xa6\x8d\x23\x06\x7a\x48\x21\x5d\x14\x19\x14\x27\x93\x3c\xb8\xd0\x6a\xa9\x45\xc5\xba\x87\xb5\x56\x90\x8f\xef\x65\xa3\xa7\xb4\x25\x40\x4a\x8f\x8b\x01\x82\x98\xc1\x75\x31\x7a\xd0\x53\xf5\x9b\x91\x36\x14\x39\xa5\xbc\x40\xfb\x6c\xf0\xa4\xef\x60\x9d\x31\x7b\x19\xcc\x53\xc7\xbc\x8b\x78\xe6\x70\xb7\xfe\xa0\x68\xba\x1f\xae\xc0\xbd\x27\x26\x8a\x0a\x27\x6a\xa3\xd0\xde\xa9\xc0\xc1\x0d\x9c\x79\x9e\x7a\x01\x64\x55\xde\x58\x24\x1c\x17\xbe\x28\x44\xe2\xf1\x94\xa0\xc3\x15\x82\x11\x45\x62\xd1\xb6\x42\x42\xbb\xb0\x42\xba\xfb\x55\xbe\x89\xd8\x5e\x91\x57\x76\xb6\xcc\x85\x09\x00\xd6\x96\x81\x0e\x08\x79\x3a\xbb\xe8\xc9\x33\x8a\x5f\x05\x22\x74\x19\xa0\x56\xaa\xd0\x64\xd4\xb9\x51\xd6\xf5\x1b\x0e\xaa\x84\x4b\x5c\x86\x4f\x53\xd4\x1a\xfd\xa2\xa3\x8b\x66\x88\xa1\x8d\x96\x24\x89\x01\x61\x7c\x50\x34\xd3\xf1\x67\x0b\xdc\xfe\xe3\xd1\x8b\xa3\xf5\xf5\x75\x90\xed\xbb\x05\x5a\x4e\x93\xcb\x01\x62\x11\x1b\xe8\x69\x60\x59\xd0\x0d\xb1\x94\xad\xa4\x9a\x0b\x59\xfa\x5b\x18\xd5\xc8\xeb\x11\xca\x38\x20\x43\x3e\xb6\x36\x3c\x2f\x65\xa3\x5f\x4e\x68\xf6\xc9\xe6\xe9\x29\x95\xb9\xf4\xcf\xab\x2b\x69\xb4\x69\x83\xb2\x1f\x5b\x50\x86\x8e\x65\xcf\x7f\x4f\x64\xd5\x0e\x90\x48\xe3\xc2\x0e\x7a\x25\xa2\xaa\xae\x50\xe5\x8d\xba\xb2\x38\x65\x21\x4f\x52\xff\x9b\x2c\xe4\xf8\xf5\xe6\xc2\xbb\x3a\x0a\xaf\xe2\xf7\x19\x59\x11\x2b\x7c\xa1\x09\x8c\x83\x3a\xb4\x65\x8a\x93\xea\x56\x4a\x5d\xce\x18\xb1\x57\xa4\x6d\x9d\xc7\x2e\xcf\x6e\x98\xc1\xf3\x76\x74\x66\x26\x2d\x22\x2d\xeb\x19\x6f\xf8\x14\xb3\xbb\x46\x35\xd5\x43\x70\x1c\x3f\xb1\xff\x68\x56\x5b\xcf\xce\x22\xac\x15\x4e\xe3\x66\x7d\x22\xe7\x90\xcb\x1c\xc3\xf5\xe8\xfb\x77\xcf\xa5\xab\x26\x66\xc7\x32\x8e\x52\x29\x69\x92\x94\x6b\x5c\xfc\x4e\xa1\x72\xd7\xc7\xe3\x60\x30\xb8\xd6\x43\xb6\xd9\x6e\xfe\x94\x1a\x53\x14\xf5\x70\xd2\x26\x1f\xf6\x95\xee\xe5\x57\x21\x42\x41\x03\xa6\x0f\x7a\x7d\xd6\xaa\x10\x2d\x63\xc5\x7b\xb5\x3a\x6f\x84\x01\x4c\xeb\xcb\xbf\x6f\xef\xb5\x3e\xf7\x5a\x9f\xbf\xb6\xd6\x87\xab\x7c\xe2\xd1\x2d\xee\xfd\x7c\x5a\x1f\xa9\xab\xd1\xd5\x3e\x8c\x3b\x49\x7d\xce\x8b\x67\x06\x23\xa1\xc3\x30\x1d\x7e\x38\x7a\x0a\x18\xa9\x95\xbc\x57\x13\x19\x6c\x4d\x09\x4c\x45\xcf\x63\xd1\xcf\xaf\xb7\xd0\x17\x64\x89\x57\x96\x20\xd4\xa3\x35\x6b\x5b\x0b\x07\x72\x94\x2e\x3d\x5f\x07\x2d\x6d\xb3\xda\xe6\xab\x23\x14\x2d\x96\xa5\x7c\xba\x96\xe2\x73\x8e\x4d\xcd\x81\x1e\x95\x3a\x42\xd4\x95\x70\x56\xe0\x8c\x10\x75\xe3\xd1\x27\x5f\xae\x90\x13\x77\x64\x9f\x64\xa3\x53\xdc\xae\x51\x09\xe7\x6d\xd4\x97\x2b\x1a\xdd\x76\x1b\x5d\x2c\xcb\x57\xf8\xa2\x79\x98\xaf\xf0\x45\xd5\x18\xcd\xac\xfa\x01\x36\xb7\xc5\x80\xaa\x86\xe6\x6f\xcb\x1a\x17\xdf\x8d\x4e\x14\x9c\x98\x88\x40\x21\x39\xe0\x43\x0f\x78\xb7\x00\xf8\xb4\x62\xeb\x7a\xf1\x6c\x4f\xee\x5a\x8c\x76\x3a\xe1\x0e\x6c\x51\x4f\xee\xb7\xa8\xfb\x2d\xea\xaf\xbd\x45\xa9\x8b\x09\x5c\xce\x6e\x74\x2b\xc1\x81\xef\xf6\x4d\x62\x45\x7c\x75\x5f\x80\x75\xdf\x15\x88\xff\x16\xa4\x61\xdb\xa4\x20\xc2\x18\xd9\x02\x5a\xf0\x64\x01\x36\xae\x6a\x6f\x9c\xa5\x13\x32\x15\x60\x5a\xec\x1b\x1d\x5a\x84\x52\x11\x60\xe7\xfc\xd1\x9a\x71\x3d\xc3\x13\x05\xcc\x8f\x70\x8a\xb7\x91\x01\x89\x02\xe4\xb0\xf8\x70\x99\x8e\xd9\x16\x63\x04\xba\x67\xa9\x02\x8c\xb2\xe2\x1c\xdb\x40\x3c\x55\xd6\xc5\xdc\x13\xe9\x10\x64\x14\xa5\x22\x9b\xf9\x3c\x74\xfa\x23\x92\xa5\x10\x02\x1e\xd3\xda\xdc\x18\x48\x8d\x37\x7f\x21\x08\x5a\xc0\xcd\xd3\x3e\x7a\xf0\x00\xf1\xdf\x03\x50\x0a\x1e\x4d\x7a\xdd\xcd\x8b\x2e\x73\x5c\xb2\xd9\x47\x4f\x51\x07\x97\x33\xba\x7b\x40\x24\xd2\x67\x97\xaf\xa2\x62\xd6\x41\xa1\x9d\xcc\xf4\xb9\x1d\x25\x25\x68\x01\x9f\x7e\xcc\xb3\xf9\xb3\xdf\xa0\xa7\x5d\xde\x25\x2d\x8e\xd0\xb3\x4b\x68\x98\x76\xfa\x20\x8d\x0f\x69\x39\x19\xbe\xcb\x0b\xc9\xc6\x21\x61\xd5\x78\x96\xe9\x38\xc1\xbf\xd1\x00\x8e\x69\x5b\x0d\x5d\xd7\x61\x2a\x3b\x2d\xe6\x47\x1b\xe7\xf3\x6c\x99\xb6\xba\x64\xba\x83\x71\x78\xdb\x66\x24\xa4\x0f\xa5\x02\x8c\x8d\xca\x99\x82\xdf\xb0\xff\xc7\xb2\x41\x6d\x32\x9c\x49\xd0\x01\x8c\x3e\xcb\xee\xbd\x2c\x67\x77\x7d\x40\xf8\xcd\x0f\x07\x10\xf2\xb7\xfa\x70\xc0\x94\x1f\x8c\x8d\x13\xec\xed\xd2\xc2\xe8\xcd\xa2\xa1\x23\x8b\x1b\xf4\x41\xbb\xe3\x66\xfc\x95\xf9\xbf\x40\xba\x23\xef\xc3\x67\x07\x6f\xad\xf8\x63\x9c\xab\x32\xc5\x0c\x7b\x40\xcb\xd5\x33\xd7\x6b\x6b\xac\x77\x03\x66\x19\x25\xdf\xd2\xbc\x2c\x67\x4a\x21\x14\xa0\xae\x1e\xad\xb9\x1b\xf0\x69\x9e\xe2\x32\xac\x50\x7b\x0a\x5f\xa5\x03\xbd\x20\x1f\x49\xc0\x55\x75\x46\xe1\xb3\x28\x31\xfc\xb5\x0f\xac\x58\xd9\x67\x51\xe2\x38\x23\x91\x69\xd7\x6b\x80\x9e\x95\x86\xc2\xfd\xfc\xdd\x64\x30\xbc\xe8\x4d\x86\xc3\x8b\xb6\x1c\x50\x9b\xd3\x28\xe5\x2f\x51\x02\x96\x9b\x8d\x67\x27\x0e\xe8\x9e\x9f\x04\xa3\x72\xf2\xe5\x21\x4a\xb3\xe6\x34\x6e\xf1\x42\x74\xa2\x44\x2a\x76\xc3\xc7\xdd\x68\xfe\xa8\x2e\xf4\x6c\x08\x3d\xd8\x39\xe3\x28\x12\x58\x8b\x16\x69\x5d\x65\x85\x7a\x35\x2c\x4f\xfa\xac\x91\x40\x15\x07\xe7\x2c\x8f\xa6\xf8\xa0\x6c\x73\x76\xe6\xa0\x95\x38\xf2\x41\xc8\x63\x6d\x0d\x96\xd8\xba\x63\x3c\xbb\xcc\xe0\x6c\xb9\x0a\x5a\xbc\x03\xe3\xce\x1d\x1b\xc6\x44\xa1\x2a\x87\x63\x65\xfe\xf6\xf3\xed\x1d\x98\x58\xf5\x4d\xf4\xcc\xd8\x91\x35\x34\x29\x34\xde\x6e\x58\xbe\xde\x06\xce\x12\x57\xf6\xaf\x74\xf1\xa2\xeb\xd5\xe8\x97\x36\x51\x4f\xbb\xb0\x03\x37\x63\x02\xc0\x1c\x4c\x48\x99\xee\x6b\x60\x42\x23\xe5\x5b\x0c\x3a\x58\xab\xa0\xec\xf9\x82\x24\xec\xf8\xd6\x48\xde\x1c\xb4\x86\xc6\x5d\x08\x81\x87\xcd\x6a\xfa\xb3\x25\xb6\x96\xf4\x68\x17\x73\xba\x55\x27\xb4\xba\x1d\xdc\xba\xe5\x44\xd5\xcd\x8d\x98\xc2\x17\x78\x4c\xe6\x51\x52\x8d\x0a\x25\x07\xb6\x44\x82\x2a\x50\x41\x94\x7f\xdc\x01\x9b\xc2\x53\xc3\x60\xab\xc3\x23\x57\x1c\xc2\x40\xc2\xae\x1d\x74\xf3\x0a\xd2\x2a\xac\x67\x1e\x1f\x3d\x67\xd4\x95\xc6\x24\x4b\x39\x83\xab\x3a\xfe\xfe\x91\x38\xcd\x4d\xf0\xf4\x1e\x8f\x31\x59\xb4\x20\x73\xb7\x4c\x1b\x02\x70\x41\x6f\x4b\x01\xbc\xc6\xd6\x03\x6c\xb9\x8a\x1b\xb9\x98\x67\x70\x36\x60\x1b\x0a\x60\x62\xd1\x1d\x09\x88\x8d\xcb\x9b\x1e\x90\xde\x47\xe7\xed\x97\xb8\x5b\xc0\x8f\x88\x5a\xb8\x36\x9c\x8d\xe2\xc1\x23\x0b\xb9\xd1\xa4\x9b\x7a\xdb\xaa\xab\x37\xef\xa7\x3d\x53\xbe\x35\xe6\x1b\x07\x99\x36\x76\x9e\x4c\xab\x7a\x6c\xe6\xdc\x8d\x8c\x5a\x81\x70\x6e\x17\x55\xd7\x51\x88\x91\xef\xed\xa8\x95\x73\x93\x8e\x52\x1e\x7a\x67\x92\xb4\x19\x4c\xbc\x6e\x4c\x1a\xa4\x7f\x68\x7e\x80\x9b\x50\x8c\x31\xc2\x5b\xad\xe6\x31\x93\xeb\x44\x08\xf0\xa6\x69\x63\xd0\x03\x11\x16\xbc\x62\x0a\xcd\x3a\x7d\x63\xad\xec\xc8\xeb\xd7\xaf\x5b\xf6\x21\xa9\xa4\x20\x59\xd3\x4a\x2d\x7f\xc0\xf9\x02\x37\xb2\x75\x89\x01\x06\x5d\x8f\x00\x07\xa6\xa6\x17\xc5\x72\x34\x27\xe5\xcf\x59\xde\x24\x5d\x28\xc0\x8a\x95\xee\xcb\xaf\xbf\x34\x6e\xd1\x2a\x87\xaa\xdc\xc2\x2a\xda\xb3\x8e\x06\xce\xc5\xb1\x52\x98\x04\x7a\x9a\x54\x10\x18\xa9\xf4\x9c\x6d\x24\xc0\x12\x36\x52\x40\x66\xb6\x0a\xf1\x83\x8b\x5b\xd2\xde\x76\x5d\x08\x25\x82\x1b\x79\x5a\xc1\xaa\x74\x29\xd0\x55\x01\x70\x99\xa3\x2a\xdb\x6a\xd4\xb4\x85\xd5\x18\x89\x4a\x74\xb7\x4f\x33\xcf\x9f\x41\xa6\xda\x97\xb5\x70\x9d\x8c\xd7\xaf\x5f\xbb\xc0\x8c\xc8\xb5\x2a\x25\xfd\x19\x63\xa3\x09\xf0\xcd\x4d\x00\x58\xc8\x32\xa9\x0c\xae\x73\x61\xac\xc8\x85\x52\xa8\x54\x4a\x9a\xc6\x95\x72\x7d\x92\x74\x14\x15\xd8\x0a\x97\x38\xc5\x8c\x1f\xf2\xe5\xc9\x61\x24\xc8\x75\x3f\x58\xa1\x8d\x39\xf1\x04\x64\x34\x5a\xe0\x10\x37\xac\x7f\x16\x15\xb3\x3c\x2a\x6b\xc7\x50\x01\xd3\x6a\x03\x58\xbd\x47\xe2\xfa\xb2\xa6\x43\x7e\x90\x66\x31\x9c\xdf\x97\x9a\xb2\xf7\xea\x3d\x9c\x46\xc5\xbb\x9c\x8c\x6b\x71\x56\x01\x73\x63\x1d\xe9\xea\xbd\xe4\x51\x79\x8a\xba\x5e\x4a\x98\x1b\xb6\x31\xd2\xee\x98\x6a\x9a\xa9\x06\xfb\x4a\x34\x24\x42\x16\xfc\x83\x19\xa3\xd4\xf5\xcd\x06\xd5\x5a\xd4\x59\x88\x71\x2b\x31\x18\xab\x8b\x7e\xed\xce\x6f\x44\x0c\x9b\xfe\x68\x5c\x66\xb9\x90\x72\x84\x69\x00\x18\xda\x06\x88\xc2\x1a\xd6\xb6\x1c\xda\xd7\xd8\x44\x98\x02\x68\x8f\x6f\x48\xe2\x7a\x24\xd2\xa2\xf4\x30\xeb\x81\x9e\xef\x5e\x2f\x40\x50\x98\x9b\x1b\x0c\x70\x39\xeb\xf5\x03\x97\x0c\x5f\x67\x53\x4d\xac\xb5\xfc\x01\x99\xfd\x53\x06\x06\xf5\x8e\xe1\x05\xd2\x7a\xbc\xc0\x60\x9a\x64\xa3\x28\x19\x50\x5c\x0c\x22\x37\x99\x47\xf2\xf2\x35\x49\xc6\xd1\xe2\xed\x4d\x9b\xa5\x85\x9d\x46\x59\x62\x5d\x93\x9a\xb5\x85\x6a\xb0\x66\x0e\xa4\x79\x46\xc5\x34\x34\xf9\x58\x7a\x59\xce\x34\xf3\x6a\xcb\xe2\xa4\x13\x6e\x3d\x09\x3a\x8e\xe5\x0b\xb7\xbc\x56\x26\x27\x9d\x70\xfb\x1b\x48\x60\x44\xd4\x09\xb7\xbf\x63\x9f\x72\xbe\x3b\xe1\x0e\x2b\x42\x46\x51\xda\x09\x77\x76\x02\xd3\x2e\x0e\x3e\x39\x96\x3a\xe1\xee\x2e\x7c\x0b\xfb\x98\x4e\xb8\xcb\xaa\xe7\x1c\xb9\x13\xee\xb2\x6e\x89\x3b\xcc\x4e\xb8\x4b\x1b\x14\xd6\x2d\x9d\x70\x77\xe7\xfa\x34\xd8\xf9\xee\xde\xd0\xee\xde\xd0\xee\xaf\x6d\x68\x57\x65\x65\x77\x6b\x63\xf0\xf6\xf6\x6f\x2d\x8c\xdb\x00\xee\x2d\x2e\xbf\xa6\xed\x38\xa4\x7e\x6d\x53\x8c\x16\xb6\xe2\xc3\xe1\x50\xb9\x5a\xf1\xb9\x6f\xe1\x71\x08\x29\x8f\x87\xea\x70\x39\x43\xd1\x82\x68\x7d\xff\x4a\x07\x89\xaa\xc0\xeb\x52\x50\x31\xa3\xb3\xdf\x54\x28\xc2\x38\xb7\x55\xbe\x4e\x2b\x55\x40\x2b\x08\x6a\xba\xd8\xe4\xec\x6a\x6f\x71\xb9\xe7\x6e\x6a\xe6\xe6\xa5\xef\x2e\xd7\xa7\xc1\xee\xe6\xfd\x6e\x71\xbf\x5b\xfc\xb5\x77\x8b\x3f\xa8\x59\xf6\xdd\x59\x50\xb7\x34\xf0\x56\x36\x8a\xef\x70\x5e\x64\x69\x94\xfc\x6e\x86\x8a\x92\xa3\xfd\x11\xec\x14\x6f\xb5\x37\x36\x74\xe1\xba\x9d\xe1\x5a\x8a\xcf\x95\x35\x5c\x9d\xfa\x56\x01\xba\x1a\xdc\x05\x9f\xd5\x4f\x5e\xa0\x5b\x5c\xbc\x2d\xd3\x24\x1b\x7f\x6e\xd7\x41\x03\xb6\xa6\x8f\x55\x70\x6d\xcc\xc7\xda\x5d\x68\x55\x5e\x6b\xdd\xf1\x3d\xa2\x1c\x52\xf3\x65\xe2\x2a\x97\x5f\xbe\xcb\xc4\xca\x21\xb5\x9f\x9f\x76\xb3\x53\x3f\x37\xab\xdc\x70\xd9\x73\x63\x75\xde\x27\xd0\xf1\x86\x55\x23\x06\xad\xb4\x50\x86\x6b\xd0\xba\xbc\xf4\xf5\xe4\xcb\x83\x06\x75\xa0\xc2\xab\x0e\x5c\x21\xd6\xb9\x72\x9d\x60\xd7\x4a\xb8\xf3\xa8\x18\x2c\xad\x82\x2d\xe7\x6d\xdd\xcb\x79\xf7\x72\xde\x5f\x5b\xce\xe3\x42\x5e\x31\xbb\x6b\xad\x40\x0b\x49\x6d\x85\x37\x76\x2d\x5e\x9f\x35\x3d\x62\x03\xa0\x0f\xb3\xd9\x57\xd7\x2c\xfc\x81\x1e\x9d\x50\xd6\xf8\x61\xf6\x9b\xe9\xee\x8b\x99\x5f\x77\xff\x2e\x2b\xca\x6a\xe5\x7d\x8d\xac\x87\xb4\xa7\xe4\x59\xd1\xb4\x4d\x53\x90\x6e\x80\xec\x0d\xba\x98\xcd\x3e\xd9\x59\x37\xd9\x95\x8d\x51\x78\xe4\x89\x14\x9f\x1f\x42\xd4\xe1\x46\x4b\x12\x0d\xd2\x95\x27\x68\x77\xfd\x00\x35\x26\xc7\xb3\xa8\x68\xd9\xb6\x06\xe9\x6f\xdb\x0f\x50\x63\xbc\x91\xe2\xf3\x9f\xf2\x6c\xb9\x68\x1e\x34\x80\x55\x8e\xd8\xce\xad\x19\x6e\x14\xc7\x1f\xb3\x36\x8d\x2a\x40\x7f\xb3\xde\xfc\xb6\xf6\x1b\x94\xa8\x0c\x7d\x97\xc0\x9b\x4a\xd4\x90\x69\x40\x42\x93\x2a\x45\x75\xa3\x56\x57\xf5\x61\xa6\xdf\xc0\x34\xdf\xa0\x18\xe2\x8d\x75\xe5\xb1\xbb\x7d\x2f\xdc\xdc\x0b\x37\x7f\x6d\xe1\x46\x29\xb1\x46\xbf\xfe\x6a\x29\xb1\x0e\x12\x7c\x81\x9e\xe1\x1c\x4f\x8b\x5f\xa3\xe2\x57\x82\xbe\x8f\x12\x7c\xf1\xb7\xbc\x9c\x14\x83\xd9\xd2\x14\x6b\x1e\x73\x07\x5c\xef\xf1\x04\xe7\x38\x1d\xe3\x10\xd1\xf6\x8b\x70\x38\x9c\x92\x72\xb6\x1c\x51\x49\x68\x88\x29\x39\xe1\xe5\x7c\x38\xcd\x1e\xc9\xdf\xff\x97\xbd\x77\x5f\x6f\xdb\x56\x16\x47\xff\x4e\x9e\x02\xed\xef\xac\x46\x8a\x69\x5b\xd4\xcd\x97\xc4\xdd\xdb\x91\xed\xd8\x2b\x17\xe7\x67\x3b\x6d\xd7\xf6\xe7\xe6\xa3\x44\xc8\x66\x23\x91\x5a\x24\x65\xcb\x6d\xbc\xdf\xe7\x3c\xc7\x79\xb1\xf3\x61\x70\x21\xae\x14\xe5\x4b\x9a\x76\xd9\x6b\xef\x54\x24\x81\xc1\x00\x18\x0c\x06\x83\xb9\xf4\x47\x49\x7f\x35\xbb\x0a\xd2\xf1\x6a\x14\xe7\x38\x8d\x83\xd1\x2a\xe9\x12\x9e\xe5\xfc\xbf\x2b\xe7\xc9\xff\x79\xdb\x6a\x3d\xb0\xce\xab\x50\x64\x1d\x13\x6c\x1e\xb5\x58\xdf\x88\x16\x8b\x9a\xa2\xe0\xfc\x2a\x49\x3f\x1f\x61\x88\xae\x56\xb6\xa1\xe9\xc5\xcd\x6d\xad\xff\xfb\xef\x9f\x4a\x4a\xdd\xc5\x96\xfc\x3a\x1e\xec\xc6\x41\x7f\x84\xe7\x61\x29\x95\xb4\x23\x68\x2f\x70\x17\xdc\xae\x82\x49\x45\xdc\x8a\x92\x0e\xdc\xac\x05\xee\x80\x5b\x98\x5c\xc5\x2c\x70\x5e\x19\x62\xbc\x98\x1d\x2b\xcb\xd7\xea\xee\x11\x2e\x1d\xe5\xa4\x02\x5a\xb4\x90\x1d\x29\xe3\xdb\x9d\x51\x4a\x71\x9e\x46\xf8\x72\x9e\xc7\x22\x2f\x66\x47\xcb\xf2\xf5\x2e\xa4\x95\x93\xdd\x6e\x0e\x51\x91\x32\x0e\x72\xd2\x3e\xdd\x79\x88\xce\x71\x05\xf7\x1b\x3b\x2e\xea\x87\x3b\x8c\x09\x0d\x38\x3c\x27\xaa\x97\x1d\x07\xf5\xc3\x9d\x47\x83\x05\x18\x2f\x47\x86\x16\xb2\xe3\x63\x7c\xe3\x28\xb5\x2b\xa1\x54\xa2\x37\x37\x0e\x0c\x3a\x5b\x96\xd4\xb2\x05\x3f\x94\x5e\x16\x8c\xa8\x78\xc9\xf9\x80\xa4\xe9\x9d\xa8\xcf\x9c\xfa\x25\x40\x84\x04\x15\x83\x64\xa9\xb7\x53\xe9\x41\x92\xc5\x1f\x54\xff\x7b\x11\x5d\x3a\x8d\x55\xc9\x9c\xc0\x77\xf1\x79\x31\xab\x82\x28\x1e\x26\x65\xb0\xe1\xbb\x04\x5b\xee\xad\xe5\xc8\x45\x84\x25\x5b\x78\x36\xab\xc2\xb8\xf5\x78\xa6\x7a\x3c\x53\xfd\xbd\xcf\x54\xec\x40\xc5\x55\x7e\x5f\x37\xae\xe8\x6d\x2c\xa6\xb8\xca\x33\x98\x44\x5c\x18\xa7\x29\x69\xf2\x8b\xb2\xab\x65\xaa\xf5\x2c\x8d\xa3\xc4\x4b\xe7\xd7\x13\x22\x1f\xb0\x98\x49\x52\x8e\xdc\xec\x2a\xca\x07\x17\x35\xf2\x5d\x0f\x87\x3d\x08\x32\x8c\x9e\x11\x8a\xcf\xf2\x67\x9b\xca\x27\x98\xac\xf4\x3c\x5b\xc9\x2e\xa2\xa1\x23\xeb\xbc\x9c\xcc\xa6\x61\x16\x60\x2c\x19\xec\xc9\x63\x7c\x45\x23\x26\x50\x6d\xf9\x0b\x0b\x1a\x13\x1c\x87\x51\x7c\xfe\xe0\x78\x7c\xa0\xed\xc8\xb7\xb4\x36\xa4\x58\xa8\x1b\x13\x1b\x0d\x9c\x51\x99\x25\xcd\x56\x75\x93\xe2\xea\x60\x8e\x72\x92\x41\xd3\x65\x04\x85\x14\x2a\xe9\x43\xa7\x71\x14\x67\x79\x30\x1a\x55\x6a\x59\x2b\x6d\xf7\x31\x73\x17\x2a\xc1\xe3\x1c\xe7\x6f\x93\xf3\x0a\x01\x30\x48\x29\xa7\x6f\x1b\x6d\x51\x2b\x52\xd2\xea\x24\x99\xeb\xff\x4a\x8a\xcc\x69\xaf\x77\x11\xc4\xe7\xb8\x42\x93\x36\xe1\x83\x82\x90\xaf\xc2\x95\xd1\x53\x04\x21\xd2\x31\xa9\x91\x64\x34\x92\xe5\x81\x85\xf9\x4d\x76\x71\xb1\x02\xac\xd1\x60\x37\xd9\x45\x05\x76\x73\x6b\x2a\xe5\x3a\xf4\x45\xe8\xe3\x9e\xe9\x94\x60\xf0\x67\xd0\x29\x69\xf7\x1c\xe7\x2c\xbd\xe4\x43\x53\x29\x6b\xed\x9b\xa2\x52\x43\x68\xa5\x7d\xc1\xf9\xc5\x26\xf9\x87\x56\xcc\x2e\x2e\x36\xc9\x3f\x54\xce\xb5\x45\x1b\x6e\xb7\x1f\xa5\xd7\x47\xe9\xf5\x6f\x2e\xbd\x16\x57\x02\xdc\xd1\xea\x9e\x12\x21\x52\x27\xb1\x23\x7c\x4e\xe6\x39\x48\xb7\xfb\x91\x23\xe8\x6e\xb6\xfa\x5a\x2d\x0a\x39\x6c\xb9\x26\x3f\x1a\x04\x13\x19\x88\x0b\xc6\x41\x6f\xfb\x83\x09\x41\xc2\x84\x79\xa3\x31\x53\x32\xb4\x85\x9e\x35\x66\x83\x6e\xb8\x11\x36\x07\x61\xbb\xbd\x11\xac\x75\xda\x83\xf6\x46\xbb\xd9\x6d\x63\x7f\xbd\xb1\x31\xe8\x34\x70\xab\x1d\x76\xdb\x9d\x6e\xb3\xff\xac\xc0\xc5\x06\x26\xf0\x03\xdf\xf7\xfb\x83\xc6\x5a\x7b\xb0\x31\x18\x06\x6b\xeb\xfe\xb0\x31\x68\xad\xe3\x6e\xab\x1f\x76\xfc\xc1\x86\xdf\x5f\x0f\x86\x8d\xc6\x33\x37\x6f\xa2\x38\x6e\x4a\x42\x71\xd0\x8f\x36\x2d\x83\xa8\xdc\x91\x12\x14\x36\xad\xfd\xa3\xec\x96\x16\x26\x68\x1b\x90\xf5\x71\xb5\xc0\x35\xbb\x4b\xa1\x2a\x1c\xb3\x7c\x16\xbf\xdf\xf4\xbd\xef\xe7\xcc\xd3\xf7\x9b\x4d\xc2\x6c\x3b\x8f\xcc\xf6\x91\xd9\xfe\xbd\x99\x6d\xc1\x6b\xb9\x9e\x4c\x63\xb6\x65\xbe\x01\xc3\x34\xf9\x1d\x8f\x83\x78\x25\xc4\x3f\x7e\xad\x4c\xb5\xfa\x5d\xea\x5d\x32\xd1\x52\x9d\xa3\xf4\x9d\xbe\x50\x82\xed\x6a\x25\x32\xbd\xc4\x6d\xd2\xca\x2e\x9e\xbc\xb6\x24\x11\x2d\x1f\x8b\x87\x4f\x45\x5b\x35\x83\xe5\x9d\x13\x58\x5a\xba\x54\x92\xc2\xd2\xe6\xbf\xad\x8d\xf0\x7f\xd9\xde\xd2\xba\x90\x4c\xf2\x1b\x49\x1e\xe9\xec\xf7\x3d\xa5\x8f\xfc\x6e\x8b\x12\x8e\xf6\xaa\x48\x99\x7f\x87\xfc\x92\x7f\xd1\x0c\xbc\x96\x21\xff\x36\x73\xf0\x6a\xc3\x4d\x4d\x21\x0a\xcc\xf2\xc4\x4e\x8a\xaa\xc9\x84\x8b\x18\xd9\x2b\xde\x0b\x27\x35\x56\x4f\x4e\x09\x75\x84\x28\x89\x78\xec\xed\x22\x59\xe5\x6b\x9c\xd7\xa4\x3b\x23\x1c\x4f\xc7\x38\x0d\xfa\x23\xbc\x89\xf2\x74\x8a\x4d\x2d\x61\x30\xc6\x59\x69\x22\x4a\x29\x5b\x25\x14\x06\x3d\x2f\x92\x32\x54\x66\x73\x52\x54\x66\x5a\x8e\xca\xcc\x91\xa4\x52\x2f\xf2\x42\x51\x4b\x88\xe6\xfd\x33\x25\x49\xae\x3d\x70\x79\xd2\xff\xcd\x83\xf2\x1e\x1d\x32\xd6\x17\x02\x3f\xc8\xae\xe3\xc1\x6b\xd8\x6f\x88\xc8\x0b\x5d\xa8\x9f\x29\x19\x3f\xb7\x59\x91\x9a\x64\xa6\xab\x55\x53\x26\x09\x40\xa8\x2c\x03\x2e\xa2\xd1\x12\xe0\xb0\x32\xb8\x08\xd2\xed\xbc\xd6\xa8\xaf\xe4\xc9\xc7\xc9\x04\xa7\xbd\x20\xc3\xb5\x3a\xff\x0c\x39\x03\x6b\x7e\xdd\xb9\xf1\xf0\x99\x75\xa7\xd5\x2a\x36\xee\x22\x47\x18\x8f\x66\xc2\x6b\x9c\x93\x0e\x99\x2b\x46\x08\x28\x4a\xfa\x48\xf1\xd6\x96\x40\x52\xd5\xe7\xf3\xbc\xad\xa2\x0a\xdd\xee\x0b\xd5\xb4\x94\x68\xb2\xac\x83\x7c\xd4\x17\xeb\x65\x61\x16\xe0\x8e\x04\x82\x0a\x8b\x28\x6b\x87\x68\x52\xcf\x05\x7b\x55\x31\xf9\xa7\x9a\xf0\xd3\x3e\xd8\x66\xca\xcf\x1b\x35\x37\xe7\x39\xce\x17\x4c\xcd\x79\x8e\x5d\xdb\xc9\xb7\x9d\x99\xd3\x42\x1c\xd5\x73\x73\xea\x16\x76\x9b\xb2\x3c\x6a\x6a\x2a\x4f\xcf\x54\x1d\x27\x4d\x27\x6c\x4d\x80\x5c\x2d\xcd\xa7\x3c\x65\x0f\x95\xec\x93\x0f\x90\x3b\xdd\x27\x39\x62\x77\x1f\x8f\xd8\x8f\x47\xec\xbf\xf7\x11\x5b\xd2\x67\x32\x0e\x31\x66\x2c\x5d\x3d\x69\xff\x13\x0f\x87\x29\xbe\x46\x3f\x47\xa3\xc1\x67\x8c\x5e\xfe\x86\x87\x43\x97\xc7\xfe\x42\xee\xfd\xef\x82\x94\x1c\xe1\x0f\x83\x78\x80\x03\x28\x6b\x73\xec\xbf\x45\x2c\x00\x56\xe5\x75\x70\x89\x7e\x4e\x92\x10\xbd\x3c\x77\x1e\xf2\xdb\xc5\x21\xff\x9f\x8c\x9b\x2a\x4e\x60\x8c\xc5\x96\xe5\x6b\xb3\x04\xab\xd1\x53\xac\xd9\xf2\xab\xd1\x84\xc2\x6a\x6b\xf4\x1d\x35\x57\xa0\xdb\xce\x41\xfe\x2c\x23\x1b\xe3\x24\x89\xb3\xa8\x3f\xa2\x04\x36\x09\xb2\x2c\x8a\xcf\xd1\x98\xdd\x5b\x91\xbd\x68\x92\x26\x97\x51\x88\xd3\x4c\xd4\x0a\x46\x59\x62\x56\x4d\x46\x23\x52\x95\x50\x1b\x37\x34\x47\x71\x12\xd2\xaf\x51\x3c\x48\xc6\x32\x64\x02\x8c\x85\xfd\xa5\xf7\x5e\x79\x34\xc6\x64\xb1\x45\x19\xf2\x51\x86\x07\x49\x0c\x59\xf8\x8f\xa3\xf8\x7c\x84\xf3\x24\x86\xe1\x24\xdd\x2b\x39\xe8\x73\x54\x95\xe3\x3e\x7f\x89\xb6\x44\x57\x24\x3d\x03\x69\x1b\x34\xc0\x37\xd2\x4b\x8e\x8b\xac\x75\x70\x1e\xfe\x88\x84\x72\x91\x26\x71\x32\xcd\x46\xd7\x34\x6d\xba\x7d\x1f\x26\x9f\x2c\xe7\x11\x14\x06\x79\xe0\x3c\x21\xab\xbd\x55\x54\x1e\x5a\x7e\x76\x02\x46\x3e\xa9\x7d\xa7\xf4\x5e\xc9\xdb\x93\xc4\x59\x42\xb6\x2e\x42\x14\x35\x4a\x1a\x2b\x07\xf1\x65\x30\x8a\xc2\x0f\xac\x7c\x4d\x96\x79\xb8\xdf\x1d\x0c\x86\x24\xe1\xab\x7b\x3c\x23\x73\x29\x05\x37\x41\x69\x85\xf6\xde\x83\x6e\x32\xbb\x0c\xe9\xfc\xc2\x4e\xe5\x5b\xea\x5c\xa9\xd9\xd0\xd9\xa1\x08\x3a\xc5\x1b\x89\xb2\x9f\x08\xba\x47\x94\x0a\xb1\x10\xd4\xa4\x6e\xe6\x17\x69\x72\x85\xd4\xee\xe9\xe5\x95\xee\xb0\x6e\xd2\x4f\x2b\x95\x4e\xfe\xc1\x42\xb3\x0f\xd2\x6c\x29\x09\xe8\xe7\x52\x21\xfd\xcc\x27\x06\x00\x6e\x50\x84\xe9\x44\x59\x4e\x1b\x3c\x2b\x94\x24\x1b\x97\x51\xc7\xfd\x10\x82\x39\xf7\x8b\x26\xf3\x27\x9d\xc2\x69\xaa\x8b\xf8\x96\xde\x58\xb3\xf5\x2b\x70\x16\xa1\xb1\xf9\x43\x66\xd4\x96\xdb\x37\x84\x5c\x96\xc8\x4c\x21\x41\x3d\x40\x97\xfb\xd8\x60\xa3\xc6\xb2\x93\x01\x29\xf0\x8a\x7c\xb7\x28\x99\x68\xbd\xfb\x20\x4c\x68\xe1\x1b\x23\x4c\xc0\x49\xa6\x4e\xce\x64\x6e\x47\x8a\xd9\x3d\xd0\xa2\x4a\x83\x5c\xcf\x06\xb3\x51\xe3\xad\xdc\x89\xf4\xb2\x79\xb4\xa7\x74\x48\x10\x1d\x9a\xb3\xfd\xe1\x5c\xec\xab\x44\xda\xe4\x67\x42\x26\xf2\x19\x14\x97\xf3\xa9\xb2\xab\xe6\x4a\x69\x49\xd4\x55\x77\x7d\xe7\x76\x3f\x6f\xe7\xce\xc9\x91\x8a\x09\x2e\x3a\xa2\xe4\xdb\x07\xf1\x69\x2e\xc7\xa6\x71\x7b\x6f\x00\xda\x41\x38\x77\xc9\x58\xbe\x0a\x53\x1b\x8e\x49\x9e\x84\x09\x1a\x8c\x70\x10\x4f\x27\x28\x06\xf8\x64\x80\xc5\xb1\xbd\x6c\xa8\x24\xec\x2d\x2b\x8f\x22\xe9\x49\x3a\x62\xd1\xb8\x3a\x96\x44\x38\x3a\xa5\xa5\xcf\x88\x90\x44\xaa\x6f\x22\x0a\x24\x0a\x37\x0d\x40\x9b\x36\x90\x9b\xc5\xcf\x1b\x9e\xee\x71\x75\x55\x1f\x7d\x85\x01\x30\x01\x4c\xdd\xcd\x19\x42\x35\xb1\xc2\xe7\x4c\x6e\x32\x11\x42\x29\x11\x41\x99\xc5\x2d\x9c\x6e\xce\x23\x72\xa4\x8b\x74\xdd\x31\xa9\x63\x99\x73\x63\x6e\x4b\x47\x5e\x80\x50\x89\x14\xea\xf2\x0e\x85\x78\x84\x73\x6c\x19\xe4\x17\xd2\xf0\x14\xf8\xb3\xd1\xa9\x31\x8d\xea\x67\x7c\x9d\xd5\x8a\xba\x75\xae\xe5\x85\x4c\xa8\xe8\x87\x1f\x90\x6b\x0c\x09\x31\xa5\x27\xf4\x7d\x4d\x29\xf4\x42\x1d\x67\x5d\x00\x2e\x19\xef\x62\xf7\x49\x31\xe1\x05\x44\xfe\xe7\xc3\x3e\xc6\x83\x8b\x20\x8e\xb2\x31\x3f\x86\x96\x33\x07\x00\x50\x3e\xbc\xb4\x0d\x79\x60\x3f\x63\x3c\x11\x41\x84\x79\x67\x57\x9f\xff\x96\x5d\x44\x31\x69\x68\x36\x48\xc6\x93\x11\x9e\x45\xf9\xf5\x66\x07\x8e\x64\xa4\x00\x21\x88\x1a\xd9\x1c\x3e\xe3\x6b\xaa\x29\x10\xa3\x29\x8d\xd7\xea\x2a\x4a\xf1\x38\xb9\xc4\x28\x18\x8d\xa0\x57\x99\x87\xf0\x6c\x80\x27\x39\x88\xfd\xec\x95\x5c\x3e\xbf\xc0\xd7\x28\xc6\x74\x44\xfa\x98\xd5\x0f\x49\x8f\xa7\xc1\x68\x74\x8d\xfa\xd7\x30\x64\x64\x78\x58\x38\x60\xa0\x99\x9f\xc9\x86\x14\xc5\xe7\xb5\xba\xb4\x0f\xd4\xbe\x53\x7a\x87\xbe\x7c\x21\xf8\x16\xf9\x6f\x09\x00\x42\x6c\x9f\x58\x1a\xdc\x65\x5f\xdf\x20\x24\x0a\xfb\x8c\xaf\xcf\x56\xc4\x4a\xd4\x2d\xa7\x4d\x8a\x24\xe5\x0d\x2b\xe6\xbf\x30\x79\xc2\x29\x93\xcc\xfb\x80\x1a\x48\xa2\x24\xae\xc2\x13\xa8\x5d\x63\x19\x4d\x32\xb3\x4d\x53\x05\xea\xa0\x42\xd4\x25\xe0\x2c\x9d\xc9\x70\xae\xf4\x9e\x00\x96\x54\x91\x1e\x1a\xac\xec\x9e\xec\x7f\xfa\x70\xf8\xf6\xed\xc1\xfb\xd7\x9f\x4e\x0e\xde\xed\x1e\x7e\x3c\x91\x8f\x47\x55\x66\xc0\x14\xaa\x14\x89\xe9\x41\x8e\x8e\xa6\x4c\x46\xf0\xda\x09\xf2\x00\x6d\xa1\xd3\xb3\x17\xea\xfb\x03\xf0\x4c\xe6\xaf\xab\x2d\x55\x01\x70\x65\x32\xcd\x2e\x6a\x3a\xdd\x33\x11\x4f\x29\x7d\x10\x66\xb4\xf0\x67\x7c\x5d\x37\xc6\xa0\x00\xb8\xc0\xe0\x55\x12\x37\x05\x64\xd6\x28\x5f\x52\xe3\x60\xa2\x30\xc9\x08\xc8\x16\x18\x0a\x90\x18\x21\x4d\x75\x98\xde\x05\x13\x49\x75\x21\xe9\xb5\x55\xa7\x72\x2a\xb8\x02\xd7\xa8\xff\xa1\x8f\xc1\xbb\x60\x72\x0a\xd5\x22\xd8\xe2\xf9\xc8\x9c\x42\xf1\x33\x3d\x4d\xb3\xe1\x62\x8f\x16\x96\x99\x13\x55\x6a\x7e\x2a\x73\xcf\x93\xc3\x9d\xc3\x4d\x4e\x64\x68\x94\x9c\xff\x97\x2e\x55\x27\x0e\xb9\xfa\xae\x92\x74\x05\x65\x41\x66\x3d\x3a\xb2\x6f\x2b\xe3\x60\x52\x73\x19\x2b\xf0\x3f\xb0\x5f\x0c\x8b\x51\x26\x63\xcf\x8e\x7a\x51\x28\xfb\xe8\x08\x8a\xf8\x8c\x51\x36\x4d\x41\x4f\xcc\x99\x55\x94\xa1\x2c\x8f\x08\x3d\x50\x4e\x8e\x43\x14\x0c\xc1\x97\x28\x4d\xa3\xcb\x60\xa4\xed\xb5\x0a\x4c\x32\x20\x10\x21\x80\x2e\x8d\x28\x3c\xd3\x51\x2c\xba\xb4\x32\x28\xec\x01\xd4\x3a\xe2\x8b\xd3\xb7\x86\xeb\x4e\xe4\x4f\x37\x08\x8f\x98\x9e\xd9\x52\x63\x18\x8c\x32\x2c\xdf\xb2\x31\x0f\xa9\xb9\x63\x2a\x32\xd5\xb2\x36\xd1\x2d\x60\x90\x79\x81\x19\x97\x16\xad\xe3\xf0\xff\xc2\x18\xcf\xef\xa0\x66\x85\x71\xac\xae\x18\x40\x0a\x85\x21\x25\x95\x76\x14\xaa\xa3\xa4\x2d\x76\xf7\x30\xa9\xb8\xb8\xf5\x0c\x48\xbe\xe4\x74\xa5\x5d\x38\xd2\xe3\x6f\xa8\x37\x5e\x5a\xfa\x05\x33\x7c\x35\x53\x48\x7f\xbf\xd9\x84\x28\x40\x4c\x19\xfe\xfd\x66\x0b\x3c\x56\xd7\xaa\xdc\x91\xb1\xd8\x69\x38\xcf\xa3\xf8\xdc\xee\x04\x0c\x8c\x49\x4b\xb9\xce\xdd\xdb\x5e\x18\x25\x8a\xb0\x9b\xc2\x3e\xc8\x15\xf2\x88\x35\xca\xfa\x4d\x50\x5e\x7f\xbc\xd6\x7b\xbc\xd6\xfb\x9b\x5f\xeb\xb1\xa8\x8c\xec\xd4\x62\x75\xb2\xbd\x43\x60\xed\x92\xe0\x8b\x96\xd8\x8b\x55\x0d\x67\xf9\x92\xf6\xd9\xe1\x60\x3b\x0c\x33\x18\x3a\xb1\xbb\x05\x31\xa8\xa5\x32\x34\xa5\xe2\x17\xf3\x8f\xf3\x88\xf0\x15\xe5\x38\x25\x58\x26\x97\x6c\x19\xf1\xdd\xfe\xe9\x53\xf9\x7c\xc0\xce\x67\x4f\x75\x25\x11\xd9\x36\x9f\xb2\x6b\x2b\xa9\x9c\xc4\xab\x68\x48\x1f\x22\x06\xf1\x7d\x28\x89\x99\xd3\x98\xc2\xd1\x98\xdc\x44\xc6\xde\xa2\x6a\x74\x09\x45\x74\xdf\xe6\x3d\xcd\x2c\x9b\x85\xcd\x1e\x87\xff\xa9\xfb\x96\xbe\x3d\xb9\x74\x97\xc2\x42\x90\xc7\x2c\x02\x94\x7f\xf8\x01\x70\xa7\x8a\xa9\x28\x3e\x07\x6e\x5c\x57\x20\xf2\xeb\x8b\x79\xe9\xc8\x28\x44\xd9\xa1\xf9\xb6\x9d\x14\xd2\xd0\x28\xc8\xa0\x99\xe3\x9c\x4c\xf6\x77\x5b\x5b\xc6\x40\xf3\x3f\xe3\xc5\xea\x2a\x4d\xae\xaa\x90\x14\x2c\xb5\x3c\x9d\x12\x99\x2d\xcd\x72\x94\x25\xd4\xce\x71\x32\x01\xd6\x0d\x67\xe7\x20\xbe\xce\xc9\x81\xdf\x43\x7d\x3c\x24\x0c\x80\x2e\x71\x7e\x85\x0a\xa3\x41\x95\x8c\xda\x5f\x34\xac\x7d\x67\xc1\xfa\x87\x1f\x90\x6d\xe4\xeb\x46\x7d\x64\x5e\x37\x10\x54\x2d\x9e\xd4\xce\xce\x26\x94\x6f\xc6\x78\x96\xa3\xde\x87\x8f\x68\x70\x3d\x18\x61\x4f\x74\x13\x86\x5d\x6c\x36\xd0\x13\xe8\x32\xb3\x59\x9a\xa4\xc9\x80\xf0\xac\x8c\x8e\x8e\xd1\x8a\x74\x0c\x16\xcb\xc4\x36\x17\x96\x8e\x30\xd2\xd0\x4b\xdd\x78\xa8\x51\xa5\x7f\x96\x61\xa5\xa4\xe0\x12\xcd\x24\x63\xb0\xa7\x02\x80\x6e\xc6\x26\xe9\x62\x6b\xa6\x1d\x94\x23\x55\x9f\x6e\x09\x75\xe3\x15\x42\xf8\x41\xe8\x15\x6c\x82\xbd\x97\x75\x48\x54\x67\x00\x9c\x85\xac\x13\x6e\x27\x79\x60\xcd\xcd\xe5\x4c\xb8\x55\x6e\x32\xaf\xc9\x7f\x48\xd6\x35\x1d\x10\x39\x5a\x52\x4e\x2d\x51\x2e\xbc\xb4\x24\x95\x13\xeb\x55\x3a\xe9\xc3\x87\x20\x0c\x85\x6d\x97\x14\x93\x55\x7c\xd7\xa7\x47\x3a\x38\x48\x2c\x96\x1b\x6f\xc1\x7b\xc9\x56\x9c\x0a\x74\x62\x24\x64\x4b\xdf\xa2\xdd\x52\x8b\xc5\x68\x58\xbc\x52\xb5\x52\x05\x0b\x02\xad\x82\x86\x7c\x25\x24\xe4\x59\x74\x4b\xb4\x06\x81\x09\x95\x73\x4d\x9a\x83\x7a\xc9\x68\x5b\xa5\x5a\x81\x90\xdb\x80\x8d\xc8\xea\x6a\x48\x4f\x22\xfb\x3e\xe6\x29\x7b\x94\x7d\xff\xee\xb2\x6f\x61\xd2\xc6\x93\xf6\xdd\x97\x8f\xee\x41\x3f\x88\x55\x69\x37\xea\x07\xc2\xf5\x16\xcf\xa8\xba\xba\xcc\x75\xf7\x78\x1c\xa4\xf9\x2e\x2b\x58\xb8\xdd\x3a\xaf\xc6\x40\xad\x04\xcd\xf2\xbe\x68\x3a\x6f\xe9\xb5\xb8\x04\x3b\xce\xd3\x28\x3e\xbf\x01\xd7\x16\xdb\x7b\x22\x2d\xf7\x83\x58\xfe\xf4\x53\x30\x9a\xe2\x1b\x74\x49\xfe\xc3\xae\x43\x08\xe4\x21\x4e\xf1\x9c\x1b\x52\x4f\x35\x2f\x80\x78\x36\x0c\x27\x55\x2c\xce\x2f\x3c\xc0\x88\x48\xeb\x1e\x6d\xc9\xdc\xc2\x40\xed\x46\x47\x19\x52\x4e\xf6\x83\xb8\x96\x27\x75\xa6\x2a\x02\x1d\x0e\xf9\xcc\x55\x3e\x35\x8b\x15\x11\xa9\xb7\x0b\x3a\xef\x67\x11\x55\xdf\x50\x88\xcc\x4f\xf7\x99\xa9\x3f\x66\x10\x77\xa2\x94\xc8\x62\x36\x87\x18\xde\xa3\x93\x84\x79\xf6\xca\xdd\x81\xea\x0c\x7a\xad\x6e\x76\x8d\xb7\x27\xe4\x18\xe8\x86\x4d\xd2\x65\xa1\xa9\x99\xa7\x34\xce\x2f\xe4\xbc\xa0\xb5\x3a\x34\xc2\xb0\x8d\xb3\x3c\xca\xa7\x54\xe0\x32\xcd\xbf\x42\x3c\x49\xb2\x28\x97\xb1\x64\x70\x05\x7a\x00\x66\x30\x8a\x70\x9c\xeb\x96\x18\x95\x1b\x36\x4c\x2c\x78\xbe\x51\x73\x04\x17\xc5\xc8\x1c\x3f\xae\x82\x2f\xbd\x4a\x16\xa4\x37\x9c\xc6\x21\xd8\x44\x0e\x70\x9a\x07\x91\x98\x7e\xc7\xf2\x11\x13\xbb\xd8\x3a\x7a\xf0\x25\x24\xf0\xba\xc5\x5a\x62\x23\x4f\x66\x53\xcb\xda\x22\xc9\xb6\xc2\x7b\x3d\x4f\x0a\x89\x96\x80\xde\xa4\x0d\x48\xb4\x39\x9a\xe2\x4d\xfa\x1f\x2e\xe6\x6a\x81\xf8\x9d\xb3\xc2\x26\xbf\x98\x94\x73\xb2\x0b\x44\x03\xc4\x39\x21\x12\xf9\x87\x6b\xe3\x69\x96\xc3\x56\x87\xc7\x38\xce\x05\xdd\xf4\xaf\x73\x9c\xb5\x9a\x75\x26\x8c\x7f\x57\xd7\x26\x92\x95\xbb\xf7\xe9\xcb\x8c\xf9\xe3\xd5\x29\xa5\xa2\x69\x1c\xfd\x7b\x8a\x51\x04\x51\xda\x87\x91\xca\x89\x2b\xcd\x35\x1f\x9d\x0a\x33\x0c\x4d\xda\xb9\x66\x00\xbb\x8e\xb4\x07\xbd\xd0\x89\x40\xe4\x0d\xe6\xa9\x82\xf3\xa4\xbe\xc2\xc7\x97\x83\xfe\xe3\xae\x44\x60\xc8\xaa\x7c\x14\xad\x41\x10\xcc\xfd\xf0\xfb\xcd\x16\x11\x5d\x79\xf2\xde\x9b\x33\xaf\x53\x29\x5d\x22\xd3\xee\x76\x2a\xe5\xdc\x79\x21\x2b\xe1\x13\x22\x5f\xb0\x74\xd5\x1e\x55\x28\x93\x81\x7d\x42\xd8\x34\x11\xf5\x93\x21\x12\xbd\xd9\xda\x42\xdf\xd3\xd8\x4d\xdf\x43\x99\x27\xab\xab\xa8\x97\x8c\xc7\x49\xfc\xcf\xe3\xa7\x4f\x9e\x18\x9d\x2f\x7e\xb1\x06\x38\x4e\xb5\xef\xc9\x30\xa4\xf8\xfb\xba\x87\xa4\x57\x38\x1e\x2c\xf7\x83\x0c\x77\xdb\xda\x87\x71\xd8\xd1\x8b\x5e\x4e\x3e\x87\x43\xed\xe5\x20\x9a\x5c\xe0\x74\x99\x42\xae\xbf\x78\xfa\xe4\xe6\xe9\x13\x3c\xca\x30\x92\x3a\x43\x15\xe6\xb4\x2f\x7c\x18\xbe\x47\x3f\xfc\xc0\x3e\xac\x04\xe3\x50\xf4\x6d\xfb\xdd\xce\xd3\x27\x4f\xe8\x87\xda\x29\xc7\xd9\x43\x2a\xaa\xf0\x4c\x30\xa4\x1f\x28\x62\xf0\x5b\xc6\xe7\x4c\x8c\xb2\x8c\x18\x6b\x88\x46\xc3\x40\xb5\x7e\x9a\x5c\x65\x38\xad\x3f\x7d\xf2\x44\x8c\x58\x92\xe4\x2b\xbd\xf4\x7a\x92\x27\xff\x3c\xa6\x55\x6f\x58\xd6\xf1\x62\x16\xc5\x77\xf4\xc7\xd3\xa7\x4f\x6a\xea\x71\xec\x09\xa2\x1a\x91\xe3\x8b\x24\xcd\x07\xd3\x3c\xa3\x6f\xc8\xb2\xe9\xa1\x2d\xc4\xeb\xbe\x90\x5e\x7f\x1a\x45\x7d\xf2\x69\x65\x14\xf5\xa5\xf7\xa0\x0c\xeb\x41\xa7\xc8\x57\x52\x6a\x45\x7a\xa7\x40\x08\x46\xe7\x09\x80\x20\x3f\x5e\x3c\x15\x58\xbc\x4d\x92\xcf\xd3\x09\xca\x83\xfe\x08\x4b\x98\x1c\xbf\x3a\xfc\x85\x9d\xf9\xc4\xbb\x83\xf7\x3f\x7d\xb2\xbd\x3f\xfe\xf8\xea\xd3\xbb\x83\x5f\x3e\x35\x5c\x1f\x7c\xd7\x87\xa6\xeb\x43\xcb\xda\xb6\xab\x1d\xf9\xa3\xd1\x96\xfc\xd1\x68\x4f\xfe\xc8\xdb\x14\x43\xd3\x4b\xc6\x13\x72\x50\x1c\x99\x43\x64\x9b\x52\xad\x56\x98\x4c\xfb\x44\xea\x27\xb5\x8a\x02\xc0\x62\x65\x2c\x90\x6c\xa9\x10\x41\xe0\x41\x14\xa1\x97\xa8\xd9\xe9\xbe\x40\xd1\xd2\x92\x02\x5e\xc8\x88\xe8\x25\xf2\x9b\xeb\xc6\x37\xf2\x17\x9e\x46\x67\x68\x8b\xc0\x78\x89\xfc\x17\xea\x77\x7a\x95\x5a\x52\xab\x46\xab\xd5\xd1\xaf\xa8\x31\xf3\xfd\xbe\x5e\xbf\x78\xbc\x79\xaa\xf4\xfa\xe7\x60\xf4\x19\xbd\xde\xab\x35\x7f\x5d\xaf\xab\xbd\x9d\xd1\x60\x8a\xea\xbb\x48\x7b\xb9\xd0\x08\x48\x83\x9c\xf5\x93\x99\xfa\x11\x0c\x0d\x48\x9b\xb3\x08\xfd\x8a\x6a\xb3\xa2\x43\xec\x77\x53\xfa\xdd\x92\x7e\xb7\xeb\x5a\x67\x01\x4a\x2d\x9b\xa1\x1f\x7f\xfc\x11\xad\x43\xc9\x6c\x86\x7e\x40\x8d\xd9\x70\x48\x07\xa8\xdb\xd2\xaa\x90\xd5\x71\x3a\x23\x03\x99\xcd\xb4\x4f\x7c\xf1\x9c\x66\xf0\x7d\xf6\xe2\xa9\xb3\x53\xe3\xe9\x28\x8f\x26\xa3\x68\x00\x5a\x02\xb3\x7b\x33\x42\xc6\xe1\xe9\xec\xec\x85\xe5\x5b\x9b\x7e\x6b\x5a\x3f\xae\xd3\x8f\xed\xb3\x92\xd6\xb3\x69\x1f\x81\x7c\xe3\xa1\x71\x34\x43\x83\x64\x34\x1d\xc7\x99\x42\xfd\x32\x4c\x22\x29\xd4\x42\xe8\xd5\x73\x42\x33\x0d\x9f\x8f\x14\x7b\x6c\xf8\x8d\x86\x3e\xb4\x62\x25\xd3\xc1\xaa\xe5\x30\x31\xed\x3a\xfa\x42\x7e\xd3\xf1\x76\x54\xf1\xe5\x2a\x7e\x57\xaa\xe2\x77\x5d\x75\x9a\x72\x9d\xf5\x3a\x2a\xea\x34\x8d\x59\x17\xdc\x80\xd6\xc9\x4b\x46\x2a\x8a\x2f\xe5\xd1\x22\x8f\x95\x47\x6c\xb6\x2e\x8d\x0f\x23\xcf\x36\x7b\xd5\xe0\x2f\x9a\xca\x90\x96\x8e\xa8\xc2\x1f\x19\x8d\x55\x19\x56\x85\x75\x2a\xf5\xe6\x8c\xad\xc2\x56\x95\x8a\x73\x06\x58\x61\xb9\xac\x62\xd9\x28\xc3\x65\x01\xe8\x81\x71\x6a\x72\xc2\xef\x66\x56\x26\xc8\x18\xc0\xd6\x02\x1c\x10\xaa\x34\xd1\xaf\x28\x3c\x25\xff\x9b\xad\xa3\x5f\xd1\xac\x79\x76\xa6\x2f\x24\x28\x1b\xa1\x5f\xb7\xa0\xe0\x2c\x32\x0a\x28\x4c\x12\x7e\xde\xc0\x99\x56\xec\x2b\x1f\x52\x3c\xa0\x9d\x0b\xd1\xd1\x20\x89\xd9\x06\x53\xec\x4a\x47\xbd\xc3\xf7\x64\x8f\x68\xcc\x1a\x0d\x0f\x35\x66\x0d\x1f\xfe\x6d\xc2\xbf\x6d\xf8\x77\xdd\x03\x5a\x20\xff\x36\xe1\xdf\x36\xfc\xbb\x0e\xff\xfa\x7d\xf2\x6f\xab\x5b\x6c\x66\xcf\x9f\x33\xa4\x9e\xa3\xed\xdd\x63\x1a\xba\x1d\x51\x71\x08\x11\x81\x20\x8d\xf2\x8b\xf1\x0a\x2f\xb3\x5a\xa0\x42\x4a\x6f\x31\xf1\x61\x85\x3e\x48\x12\xc6\x0a\x9e\xe5\x34\x7a\x80\xe8\xf2\xa7\x30\x39\xc2\x19\xce\x37\x91\x63\x8b\x64\x83\x70\xfc\x39\x9a\x30\xcb\xdf\x64\x88\xe2\xa3\x04\x4e\x63\x17\x41\x86\xfa\x18\xc7\xe0\x1d\xc0\xee\xb7\x82\x38\x04\x13\xbe\x30\x0a\x51\x9c\xe4\xcc\x0c\xd3\x24\x05\x9a\xf7\x85\x43\xe2\xe6\xa2\x9f\x3e\xe3\xeb\x0f\x69\x94\xa4\x47\xd4\x02\x78\x6b\xab\x78\x6f\x25\x1d\x6e\x16\xa6\xcd\xa9\xd9\x01\x55\x7c\xe3\x7f\xdc\xe0\x70\xcb\xde\x7c\xf1\xd6\xc2\x9f\x3f\xe3\xeb\x9f\x93\x14\x8c\x18\x3f\xe3\xeb\x95\x2b\xf2\xdb\x5e\xec\x38\xfa\x1d\xb3\x52\x59\x74\xfe\x8a\x30\x20\xb4\x8a\xda\x65\xcb\x48\xf8\x01\xa4\x30\x40\x26\x58\x3e\x72\x1c\xc7\xe2\x99\x37\xb8\x84\xba\x95\x5a\x20\xfd\xcf\x06\x17\x98\x1c\x3f\x10\x11\xa1\x2d\x7d\xc8\x8e\x92\x2b\x02\xbb\xc6\x9b\x59\x22\xbb\xf4\xf3\xd2\x3e\xc8\x70\xed\xc3\xc2\x1b\x95\xc6\x59\x7a\x77\xaa\x2f\xd5\xc2\x44\x94\xa0\x43\x45\x0f\xfa\xf3\x25\xc3\x90\x3d\x5b\xa4\x10\xc4\xc8\x4e\x94\xa7\x83\x64\x2d\x47\xfe\x24\x54\x4e\xa1\xce\x19\x1d\x59\x98\x71\xf6\xc6\xc2\x6a\xdc\x0c\x0b\x49\xfb\x89\x01\x1c\xa2\xe9\xe8\x43\x29\xa3\xfd\x1d\x43\xfc\x1f\x02\x71\x27\xe6\x6c\x16\x8e\x92\x1c\x11\x92\x74\x17\xca\xe5\x3d\x40\xdd\x02\x4a\x21\x1f\x4f\xfb\x55\x20\x83\xf8\xc4\x61\x9e\x49\x7b\x1b\x7c\x28\x76\x2a\x26\xa3\x9d\x49\xbb\x98\x5c\x62\x5d\x29\x00\x98\x32\xc8\xec\xf5\x1c\x6c\xdf\x45\x33\x60\xdb\x65\xd8\xfe\xba\x05\x4c\xfc\x94\x0d\xf2\x6a\x41\x1d\x5f\x50\x83\xa1\x6e\x99\x6c\x54\x4c\x38\x90\x16\x5b\x77\x3f\xa2\x2e\xe1\x67\xda\x84\xa1\xad\x2d\xd4\x9e\x37\x69\xdf\xdc\xd0\xda\xfb\xec\x18\x71\xd7\x9a\x31\x68\x9d\x0d\xc9\x19\xfa\x95\xc8\x12\xe6\x22\x9a\xcb\xcd\x65\x99\xae\x9c\xcd\x44\xf1\xe5\x1b\x0b\xa7\x31\x5e\xbb\x99\x0d\x29\x5a\xf0\x1b\xf1\x54\xb0\x1c\xfe\xca\xc1\x75\x64\x86\xc5\xf8\xe8\xb2\xa8\x63\x23\x5e\x38\x32\xf2\x66\xfe\x51\x42\x34\x4e\x76\x72\xbf\x9c\xa9\x6d\x05\x37\x0f\xf1\x97\xa8\x0d\x8e\x2c\xf4\xa1\x8c\xf6\xd5\xb9\x38\xe5\x10\x98\xa4\xb9\x60\x47\x4a\x80\xa9\x42\xb7\xba\x86\x08\x29\xaa\xc2\xb5\x63\x29\x9d\xa1\x5f\xdd\x8b\xd3\xf1\xa7\x0a\xdf\xf6\x15\xa8\x23\xd0\x3a\x55\x97\xa2\x7d\x0e\x9c\x92\xac\x27\x4d\x0f\x8e\x07\xe9\xf5\x84\x5a\xc6\xca\x72\xde\x3b\x0f\x25\xc3\x61\x86\x73\x63\x66\xe8\x1a\x09\x93\x9e\xa8\x57\x14\xf6\xcc\xbd\xda\x2b\x4e\x88\xc5\x4f\xbf\xf8\xd9\x2c\x7e\xb6\x3c\x60\x31\xf2\x29\x43\xc1\x35\xc4\x8b\xe2\x4a\xb8\xe6\x55\x30\x41\xcd\x38\x04\xd9\xb3\x9d\x5f\x38\x84\x18\x42\xdf\xef\x4e\x29\x18\x22\xbf\xe8\x43\xaa\x7c\x53\xcb\xb6\x4a\xca\xb6\xac\x47\xa2\x2a\x43\xa8\xd2\xaa\xa7\x12\xa8\xfa\xe8\xab\x8f\x4d\xf5\xb1\xe5\x09\x85\x85\xb1\x79\xaf\xae\xa2\x03\x72\xf2\xfd\x26\xc6\xc8\x3e\xe9\xca\x30\x59\x67\xdd\x43\x77\x23\x37\x1b\xd1\xb0\x03\x41\x65\xc9\xda\x32\xb0\xaf\x31\x8b\x15\x0a\x17\x92\x54\x54\x27\x98\x5a\x74\x5c\x0d\x69\xb0\xce\xe0\xf5\xaf\x0a\xb3\x6d\xd8\x34\x40\x99\xaf\x4f\x87\x56\xcb\x98\x1f\xa8\xd5\x54\x6b\x35\xf5\x5a\x56\x6d\x53\xd6\xd2\xa7\x53\xab\xd5\xb2\xa9\xa1\xde\x68\x67\x07\xfb\xd1\x5f\xde\x02\x6d\x27\x86\x23\xcb\x19\x47\xec\xbf\x74\x54\xb7\x90\xff\x82\xfd\x7c\xc9\x67\x88\xbd\x70\xec\xbb\x30\xc7\xd1\x30\x07\x4a\xf7\x1c\x8a\xb2\xd2\x89\xe3\xa8\xe7\x64\xf2\x24\x75\x4d\x43\x48\x5e\xbf\x4a\x8a\xae\x5a\xe6\x1b\x72\xd7\xaf\x92\x52\xab\x96\x35\x75\xa9\xeb\x57\x49\x7f\x95\xb5\xa4\xd7\xc6\x36\xbc\xb4\x64\xdb\x00\x00\x39\x5f\x45\xce\x77\x20\xd7\x9c\x83\x5c\xab\x14\xb9\xc6\x2d\x91\x6b\xaa\xc8\x35\x1d\xc8\xb5\xe6\x20\xd7\x28\x45\xce\xbf\x25\x72\x2d\x15\xb9\x96\x03\xb9\xc6\x1c\xe4\xfc\x52\xe4\x9a\x73\x91\xb3\x92\xee\xc7\x09\xd8\x10\x65\x79\x90\x63\xb3\x00\xb0\x93\xbc\x61\xe9\x18\xb0\x8c\x5c\xd7\xa3\xc1\x17\x32\x17\x79\xd3\xf6\x85\x0c\x44\xae\x6b\xc7\xad\x4a\x14\xeb\x7a\x9a\xc3\xfb\x60\xf9\xd4\xe8\xc9\x43\x5a\x3b\xfa\xa9\xc5\xb2\x7c\xf4\x63\x8b\xb9\x82\x94\x73\x4b\xb1\x84\xea\xd5\x28\x41\xac\x1f\x8e\x9d\xef\xc6\xce\x5c\x3f\x06\x76\xc6\x12\x52\xb1\x6b\xdc\x06\xbb\xa6\x84\x5d\xd3\x8d\x9d\xb9\x80\x0c\xec\x8c\x35\xa4\x62\xe7\xdf\x06\xbb\x96\x84\x5d\xcb\x8d\x9d\xb9\x82\x0c\xec\x8c\x45\xa4\x62\xd7\x9c\x8f\x9d\x49\xad\x98\x07\xb6\xb6\xcb\x25\x74\x1b\xb6\xac\x23\x5d\xc8\x31\x96\x93\xba\xb9\x5a\x56\x95\x21\xfa\xb4\x5c\xb2\x0f\x3b\x0a\x6f\xa2\x66\xa7\xbb\xda\x6a\x32\x0d\x74\xdd\xa6\x0a\xe6\x12\x8b\x10\x90\x32\xe6\x38\xcc\x54\xc3\xcf\x32\x96\x1a\x0a\x41\xb6\xef\x61\x30\xc0\x42\x47\x2c\x80\xfc\x37\x9e\x05\xe3\x89\x38\x29\x17\x1f\xf8\x9c\x52\x58\x39\x9e\xe5\xd2\xed\xf6\xca\xf6\xee\xf1\x0a\x3b\x47\xd4\xc6\xdc\x22\xfd\x33\xbe\xf6\xd0\x60\x78\x2e\xa4\xf9\x02\xca\x64\x14\x10\x24\x66\x39\xd2\xa1\x30\x09\xbf\x56\xb4\x63\x03\xc4\x74\xda\x3d\x8b\x12\xfb\x13\x8d\x9a\xba\x8f\x47\x13\x9c\xd6\xb6\x77\xe9\xb5\x3e\xd5\xd9\x3f\x7d\xc2\x6c\x56\xe4\x26\x5f\x3c\x7d\x0a\x11\x70\xc1\x80\x44\xb1\x2a\xd8\xec\x34\x3d\x6e\x97\xb0\xd9\x01\xdb\x11\xc9\x32\x61\xb3\xd3\xf6\x0a\x93\x84\xcd\x0e\xb8\x30\x8e\xc3\xce\xf7\x9b\x5d\xff\xe6\xcc\xeb\x34\xef\x64\x2d\xf2\x35\xcd\x44\x1e\xcc\x98\xe3\x2b\x9a\x65\xd0\x95\xf0\x1c\x31\x03\x0a\xd2\x3c\x1a\x24\xe3\x49\x12\x43\xc8\x75\xf2\x6d\xf5\xe9\x13\x31\xef\xa3\xa8\xbf\xc2\x8a\x7e\xf9\x22\x1b\x00\x08\xa7\xcf\x7b\x36\xee\x08\x32\x5c\x58\x75\x04\x19\x96\xbe\xfd\x9c\xa4\x21\xb8\xa5\x8b\x02\xe2\x8d\x0c\x61\x3a\x04\x7b\x31\xa0\xf5\x6d\x7e\xcb\x53\xc0\xb4\x7e\x56\x30\xc3\xe0\x59\xd5\x23\x0b\x55\x7a\xff\x31\x1f\xae\x03\x14\x1c\x0f\x56\xc8\x83\x86\x75\xb7\x2d\xbe\xd2\xc7\x32\x43\x14\xf1\x65\xf7\x72\xf2\x66\x67\xaf\xb8\x6c\xa2\xcf\xd6\x1b\xac\x7e\x46\xcd\xf3\xc8\xb2\xe2\xb7\x58\x39\x1e\x4f\x46\x41\x6e\x63\x50\x22\xc8\xf4\x1f\x31\x0b\xc8\xc3\x35\xa8\xe0\x54\x20\x78\x1d\xe8\xfd\xa2\xdf\xf1\x0a\x0f\x30\xb9\x89\xda\xa8\xe6\x37\xd7\x51\x3f\xca\xb3\x7a\x19\xc0\xe8\xd2\x02\xef\xe0\xa7\xdb\x82\xfb\xb4\xfb\xbe\xf7\xe9\x97\xbd\xc3\xa3\x77\x9f\xde\x1d\xee\xec\xa2\x6d\x08\x6d\x90\x07\x71\x8e\x52\x3c\x49\x71\x86\xe3\x3c\x8a\xcf\xb9\x22\x86\x90\xe1\x38\x09\x8b\xbe\x5b\x61\xee\xec\x56\x82\xc9\xd8\xa9\x01\x53\xba\x14\xd4\x4c\x8e\xc4\xa3\x9d\xa2\x2c\x97\x84\xc5\x6c\x52\x74\x7b\xe0\xf6\x3d\x4d\xc1\xe0\x41\xe4\xf8\x90\x8b\x28\xc5\xa5\xde\x09\xba\x27\x73\x80\x4e\x2e\x30\x19\xf5\x3c\x41\x53\xe6\x26\x40\x58\x00\x22\x85\x01\xb4\x02\x72\xb5\x78\x18\x0c\xcf\x37\x81\x74\x39\xae\x75\x79\x47\x35\xb0\x85\xed\x22\xa3\xb0\x19\xf9\x45\xb1\x6b\x32\x6c\xe8\x53\x7b\x4c\x09\x77\x42\x7a\x04\xf9\xcf\xf8\x7a\xc5\x5a\x96\x7b\x86\x0e\x86\xe7\xa8\x76\x08\xad\x04\xa3\x3a\xd4\x19\xd8\x06\xaf\xe2\x18\xa8\x6d\xf1\x38\xa2\x74\x42\x6f\x08\x89\xf0\xde\x11\x42\x19\x94\xf5\x89\x9c\x2b\xa2\x81\xfb\xbb\x2a\x25\x98\x05\x90\x22\x2d\xc8\x7b\x3c\xbf\x7a\x5e\xa1\xdb\xf4\x2e\x1d\xe6\x24\xad\xb1\xcb\x33\x18\x42\x0f\xfd\x81\xa2\xcb\x4d\x14\x5d\x16\xbc\xf1\x46\x31\x3d\x50\xe6\x5b\x85\xb4\xa9\x84\x85\x62\x92\x83\xae\x01\x90\x13\x87\xd0\xfa\xec\xc6\x59\x5d\xab\x16\xd9\x43\x97\xd0\x2a\xd2\x93\x63\x21\x3e\xd2\xd3\xfd\xd2\xd3\x0e\xbe\x2f\x7a\x12\x90\xee\x46\x4f\x2a\x9f\xbe\x05\x3d\x1d\xc4\x51\x1e\x05\xa3\xe8\x77\x9c\xa1\x00\xc5\xf8\x6a\x74\xcd\x30\x0c\xd9\x70\xcc\xa7\x25\xbe\x6b\xcc\x86\x49\x3a\x7e\x97\x84\x18\xed\x52\x5f\x35\x08\xd3\x5c\x70\xba\x24\x95\xe9\x14\xac\xab\xc1\xcd\x8f\x53\xad\xd8\x64\xec\x64\xf8\xcd\x91\xec\xbd\x91\x55\xcd\xfc\x60\xe3\x14\xb7\x24\xb8\x28\x8e\x14\x0b\x1b\x31\x4d\x12\xb9\x58\x54\xd4\xdb\x93\x09\xa1\x05\x18\x2d\x9e\x98\x3a\xb3\x5c\x33\x90\x21\xde\x12\x3f\xf9\xa6\x48\x69\xd0\x3c\x15\xe7\x44\x72\xa6\x86\xf5\x49\x3a\xa6\xd3\x1e\xd8\x74\x37\x94\xbe\x0b\x92\xda\x2a\xc8\xeb\x85\xad\x24\xb5\xa3\x01\x5b\x19\xeb\x59\x3c\xa2\x84\x4e\x3d\x00\x6c\xfd\x00\xfb\xa2\x5a\xe5\x85\x03\x36\x3a\x2a\x1f\x86\x58\x0e\x99\x68\x09\xb4\x67\x77\x24\x1f\xb6\x04\x4d\xdc\x94\x19\x4e\xab\x18\x51\x51\xa3\xa2\x30\xc8\x03\xd4\x07\xd9\x4b\x2d\xe1\x90\xc7\x00\x34\xcd\x74\xc1\xbd\x9d\x75\xc0\x1f\x70\x0a\x73\x39\x48\xe2\x41\x8a\x73\xbc\xcc\x86\x63\x94\x9c\x2b\x4c\x59\xba\x97\x3a\x5a\x6c\xac\x21\x9e\x06\x60\x4e\xdd\x5b\x18\x4f\xc1\xa1\xc4\x52\x70\xb8\xc0\xa6\xf7\x25\x63\xae\x30\x04\x28\x53\x76\x12\xde\xc0\xdb\x60\x0d\x48\xe0\x2b\xec\x5c\x12\x7f\x12\xb0\x68\xd0\x2c\x16\x8c\x20\x8a\xcf\xef\x81\x9b\x14\x9d\xdf\xe2\xe4\xc1\xe0\xd7\x9e\x91\x36\x9f\xa9\x64\x52\xa5\xde\x15\xc7\xdc\x49\x61\xac\xe4\xa6\x16\xe5\x95\x0e\x9d\x83\x7b\xe0\x38\xb4\xcd\x7e\x00\x5f\xe4\xea\x36\x9a\xa2\xed\xa1\xe0\x32\x88\x46\x41\x7f\x84\xa9\x19\x62\xe6\xde\x16\x3f\xf1\xce\x54\xa6\xaa\xbd\x28\x66\x1b\x5f\xe9\x3e\xc5\xe0\xaa\xfb\xcc\xfb\x24\x67\xde\xd1\x34\x68\x1a\x85\x54\xec\x1a\x28\xca\x10\x1e\x0e\xf1\x20\x8f\x2e\xf1\xe8\x1a\x05\x28\xc4\x59\x9e\x4e\xe1\xd9\x43\x29\x0e\xc2\xe5\x24\x1e\xe0\x4a\xfb\x4c\x55\xea\x05\x34\x1e\x8a\x86\x29\xf0\x87\xa6\x64\x3e\x92\xb5\xea\x44\x2c\xaa\x2c\x4a\xfd\xa2\xe2\x7c\xf2\xe7\x45\xab\xd3\xff\x5e\x31\x17\x53\x28\xa4\x96\x88\x86\xa5\x00\x50\xe9\x6a\x51\x8a\x5a\x2e\x4a\x16\x60\xc8\x10\x0f\x89\xa0\xca\x16\x1c\x0e\x59\xbc\x4c\xce\xa9\xf7\xa4\x09\xb1\x2e\x3e\xb3\xf6\x5c\x65\xb3\xdf\x5c\x5f\x6d\x35\xe5\x4f\x54\x25\x62\xfb\xa2\xc9\x41\x9b\xc8\x57\xbe\xaa\xf2\xef\x26\x6a\x56\x39\x3b\x65\x56\x55\x76\x30\x5f\x91\x8d\x9c\x6b\x93\x9f\x5a\xd8\x48\x9f\x5c\x60\x49\x28\x60\x89\xb6\x02\x74\x01\x5a\x63\x22\x64\x56\x58\x8a\x5c\x84\xdd\x8e\x39\x3e\x10\x60\x80\x2f\x6b\x22\x34\xb1\x75\x6d\xe9\xd0\x57\x38\x2c\x31\x6b\x6f\x53\xe5\xa9\xe9\xc8\x0d\xd9\xd6\xb9\xca\x94\x7a\x9b\x4e\xbf\x29\xf2\x27\x3e\x65\x78\x84\x07\x39\x6d\xf8\x38\x4f\x83\x1c\x9f\x5f\xd7\x5c\xe6\xda\x92\xf6\x19\xc4\xc5\x2d\xf4\x8c\xb2\xd2\x67\x4e\xf3\x30\x36\x1b\x1f\x82\x2c\x23\x6c\xe2\x55\x90\xe1\x50\xf1\x98\x93\xff\xca\x8d\xc3\x18\xa8\x63\x9c\xc2\x81\x8b\xec\x6a\x6e\x48\xe5\x8b\x5c\xcf\xed\xc7\xee\x33\x4a\x6c\xd4\x5d\x48\x31\x72\x92\x19\x9b\x79\xc3\x52\x66\x37\x5a\x04\x01\xb3\xcf\x83\xb8\xb8\xa1\x28\x7a\xc8\x7d\x81\xa3\x8f\x81\xe7\xb0\xf4\x64\x64\xbf\x69\xf4\x5f\xbb\xcf\xb9\x13\xda\xea\x4d\x91\x87\x4a\x6f\x8c\x74\xcc\x2d\x13\xaa\xb3\x6d\x99\x4b\xd6\xea\x4c\xc3\x6b\xbf\x7a\x53\x75\xd8\x59\x9e\xe2\x60\x7c\x2b\x55\x36\xc8\x50\x4c\xf9\x2c\xdb\xe0\xb7\x9a\xcb\xfd\x88\x1a\x6c\xab\x27\x1a\x2a\x9d\x40\x18\x6b\x49\x33\xed\xa3\x5a\xab\xa9\x2a\xa6\x25\x85\xef\x31\xe0\xa7\xa9\x7d\xf5\x97\x25\x1e\x21\x7b\x96\xbd\xd6\xb6\xc3\x72\x11\x71\x12\xa4\x70\xdc\xb2\x09\x88\xe6\xf6\x06\xc7\x9b\xc2\xba\x8a\x0b\x8d\xdf\x7d\xf7\x6c\x38\x9a\x66\x17\xcf\xaa\x6d\x73\x14\x8a\x6b\xa3\x13\xc3\xbc\x89\xfc\xb2\x79\x85\x73\x2d\x64\x35\x9d\xc8\xb7\xa5\xb2\xf2\xfc\xd3\x98\x9e\x7d\x7b\x2b\xec\xc7\x1f\x37\xf3\x29\x44\xf1\xd8\x81\x7a\x06\x95\x48\x6d\x48\xb7\x9b\xec\xa0\x6d\x38\x07\xb3\xf7\xb2\xd2\xbb\x4c\x41\x2f\xab\x28\xc7\x3c\x39\x57\x21\x5f\x2f\xbc\x9b\x6e\xab\x3d\xb2\x2a\x04\xf5\xcc\x32\x85\x82\x1f\xa8\xfa\x2b\xec\x87\x7c\xa6\xf8\x76\x07\x7a\xd8\xde\xab\x9e\xa1\x8a\xe6\x1c\x25\xba\xa4\x5e\x3b\xb7\xd1\x3c\x17\x30\x4a\x75\x85\xa2\x2e\x57\x34\x49\xf5\x6e\xa5\x71\x16\xd3\x59\x1c\x90\xfe\x33\xa7\xb3\xd0\x04\x2f\x38\x9d\x56\xc5\x6f\xc5\xe9\x14\x75\xef\x30\x9d\x65\x0a\xdf\x6a\x57\x07\x5f\x75\x3a\xef\x3c\x5d\x25\x4b\x60\xce\x7c\xe9\x7a\xd3\x92\x49\xa2\x9b\x89\xd0\xf3\x0e\x6c\x62\x1d\xb3\xba\xbe\x44\x5b\x28\xba\x94\x67\xab\x6c\x8b\x60\x3b\x26\x8d\x2b\xdd\xbb\x08\xa2\x18\x52\x9e\xb8\xee\x5a\x5f\x81\xdd\xc0\x27\xde\x79\xb4\xe5\x0e\x3e\xa0\xab\xd8\x94\x1d\x84\xd4\x35\x88\x41\x1a\x9a\xa2\x31\x6d\x97\x10\x77\xa2\x2f\xca\x38\xca\xab\x1e\xdf\x0e\xb4\x93\x90\xd4\x84\x32\x77\xa4\x57\xaf\x7a\x96\xbd\xc7\x04\x4f\x9b\xf8\x20\xc2\x7f\xe6\x5c\x8d\x41\xa9\x34\xc8\x99\x51\xf7\x8a\x5e\xc7\x80\xa1\xd1\x2c\x95\x8e\x84\x56\x84\x09\x4b\x09\x97\x91\x90\xca\x09\x91\xf5\x86\x84\xd9\x65\x11\x20\xec\xe7\xd5\x05\x66\x91\xf7\x29\x7e\x10\xc8\x33\xab\x80\x9c\xb9\x30\xec\x05\xc9\x1f\x4c\x25\x13\x75\xa8\x37\x00\xa4\xc7\x83\x2e\x08\xd7\x06\x5d\x96\x95\x27\x03\x15\x2a\x40\xc3\x4c\x5e\x85\xe2\xb4\x85\xb6\x3a\xc0\x22\xfd\x86\x44\x5e\x48\x0e\xc3\xd9\x42\x88\x15\x9a\x1c\xf1\xca\x61\xce\xfa\xcb\xe1\x11\x9c\x97\x19\xd1\x99\x65\x66\x49\x0a\xfd\x2a\x14\xdd\x1e\x52\xfa\xe5\x15\xcd\xda\x84\x7e\x86\x87\xec\xeb\x52\xd3\x47\xd7\x8a\xd9\x11\x1e\x63\x90\xc2\x61\x77\xa5\x24\xc0\xae\xa2\xe0\xb4\x0f\x0e\xed\xf0\xda\xac\xce\x25\x58\x7c\xc9\xc3\xce\x53\x66\x4a\xf3\xc9\x73\xbc\x85\x29\xa0\xb3\x03\xb2\xe7\xce\xdc\x75\x1b\xe2\x0a\xeb\x56\xec\x53\x8f\xeb\xf6\x71\xdd\xa2\xdb\xaf\xdb\xbb\xac\x0e\xb0\x10\xbe\x88\xb2\x85\xd7\x86\x15\x13\x46\xd1\xc0\x45\x7e\x39\x3c\x72\x72\x00\xd9\x83\xcc\xe0\x00\x77\x65\x3b\x56\xcc\x4e\x8a\xa1\xe9\xe3\x41\x32\x66\x4b\x87\xb0\x85\x28\x99\x66\xd5\x99\x87\x18\xac\xaa\xec\x41\x90\x12\xef\x46\xcd\x89\xfb\x42\x1e\x50\x20\x22\x71\x69\xc9\xe6\xe1\x7f\x91\x24\x19\x46\xe3\x68\x46\x64\x21\x4b\xff\xc0\x13\xd4\x14\xd2\x90\x4c\x88\x4c\x0a\x73\x91\x5d\x72\x09\xd2\x29\x39\xe9\x64\xd3\x7e\x86\xff\x3d\xc5\x71\x6e\x55\x31\x20\x55\xb4\x93\xb2\x7a\xa8\xa3\xe8\x54\x0d\xca\x28\x69\xb3\x32\x5f\xd5\x4f\x76\x36\x1b\x56\xb6\x18\x49\xc5\x6a\xb3\x46\x4a\x22\x7f\x30\x81\x85\xf5\x78\x74\x86\x7e\xdd\xa2\xf5\x4e\xa3\xd2\xd0\x25\xc5\x6f\x6e\x02\xfd\xaa\xc7\xca\x2b\x01\x4d\x24\xd1\xf6\x43\x10\x86\x64\x02\xe7\x28\x40\x26\x90\xe5\xaa\xb7\x42\xff\x6b\x57\x7f\x7c\x78\xd3\x3b\x46\xff\xa7\xb3\xba\x86\x26\x0c\x68\xc6\x74\x79\x36\x98\x1f\x3e\x0f\xb2\x35\x90\x93\x27\x41\xb8\xc2\x9f\x4a\x64\xe3\x0f\x01\xbf\x7e\x9e\x66\x3c\x74\xbe\x08\x84\xc2\xcc\x95\x21\x6e\xb2\xc0\x63\x21\xfb\x2b\x80\x2c\xdf\x3e\x13\xb4\xac\x95\xec\x7a\x3c\x16\x02\x4a\xba\x8f\x04\x40\x99\x08\x66\x49\x06\x05\xc2\x59\x3e\xf0\xb1\x59\x1c\xbe\xc4\xb8\x92\x5f\xc5\xf5\x9a\xa7\xc5\xcd\x52\x2e\x98\x83\x50\xbf\x5c\xbb\x35\x03\x11\xd5\x68\xac\x93\x2d\x69\xbc\x5c\x31\x43\xa6\x71\x2e\x68\x07\xfc\x8a\x4c\xa8\x31\x23\x58\x03\x28\x7d\xb1\x4c\x53\x4e\x8b\x08\x2b\xff\xd0\x0a\xd8\x9a\xa5\xf7\x42\xbc\x5d\x33\xf4\x02\xcd\xf4\x06\x5f\x09\xbd\x40\x04\x14\x05\x8b\xc2\xd7\xc5\x78\xcf\x1c\x5c\x8c\xf7\xe0\xd6\xa2\xbc\x9d\x8b\x59\x29\x52\x59\x79\xf8\x82\x82\xfd\xa8\x6d\xa2\x08\x2d\xb9\xdc\xf2\x65\xe8\x34\xcc\xbd\xf4\xa6\x44\x7a\xd5\xb0\x43\x5b\x85\xed\x3b\x3f\xfc\xcb\xa0\x3d\x15\x25\x9b\x19\xc2\x76\x18\xda\x07\x01\xe6\x7a\x90\xc4\x83\x20\xe7\x30\x2b\x6b\x60\x3e\xc6\x13\xc1\x50\x60\xc9\x5e\x04\x21\x0d\x64\xc4\x16\xea\xd7\xe1\x32\xd3\x58\xe7\x33\x5f\x85\x23\x40\xb3\x15\xae\xdc\xa1\x9c\xce\x12\x6c\x7c\xe0\x35\xce\x95\xc4\xc5\xd2\x22\x86\x18\xb0\x68\x14\x64\x39\x3c\xcf\x5f\xd3\x85\x78\x7d\x5a\x53\x97\xf3\x32\xf2\xeb\xd4\xc5\xec\x8c\x39\x83\xd9\x3c\x89\xa9\xe0\xe0\xa6\x98\x02\xdc\x96\xbe\x06\xa5\xcd\x94\x6e\x9b\x0b\xea\xf9\xff\x8c\x8b\x20\x9b\x8b\x82\xfd\x66\xc1\x76\xab\x50\x76\x0f\x74\x7f\x46\xff\xef\x92\x10\xdf\x50\xf5\xe0\x89\x38\xad\xd1\x4b\x11\x38\x49\x48\xdd\xe9\xbd\xea\xb9\xa0\xb0\xb9\xba\x11\xf4\x45\x60\xe9\xc2\x86\x09\x11\x48\xde\x41\xe0\xe0\x47\xc0\x06\x40\x32\x9c\xd4\x08\x9c\x60\x0a\x98\x79\xda\xa9\x8e\xb6\x6d\x34\x71\xa3\x78\x23\x2c\x60\x18\x48\x27\x5a\xfd\xd8\x93\xac\x0f\xcb\x6d\x00\x4b\x02\x9c\xa9\xf6\xa1\x16\x3f\x4e\x90\x9b\xc9\x08\x28\x6a\x51\xa4\x2a\x76\xc9\xf7\x31\xd8\x7e\x3a\xf0\x2f\x26\xd6\x3c\x0c\x18\xb6\xa4\x5c\xd2\x56\x8d\x4b\x9c\x27\x06\x02\x15\xb6\x44\xd0\x68\xc0\xa9\x5c\xbb\x9b\xb1\x4b\xfb\xab\xcf\xcb\x9b\x57\xad\x57\xea\xe8\xf9\xea\xc2\x18\x08\x55\x8b\xe3\x2c\xf3\x06\xe3\x09\x0a\x72\x34\xc2\x84\x0b\x26\x31\x5f\x01\x2c\xcb\x07\xb5\x04\x85\xfd\x1a\x18\xae\xc9\xb7\x90\x38\xdf\x8c\xa3\x98\x1a\x89\xb2\x43\xbc\x11\x2e\x51\x7d\x64\x95\xe8\xf4\x49\xf8\x53\x42\x1a\x83\xfd\x31\x3d\xf2\x46\x97\xe8\x87\x1f\xac\xfa\x78\x3d\x50\xc7\x87\x5b\xe9\x32\x0a\x4c\x54\x65\x8a\xf3\x7c\xae\x37\x5b\xf5\x4a\xda\x2d\x92\x16\x22\x89\x30\x94\x66\xaf\x2c\x04\xcd\x9b\xbb\x5f\x42\x5e\x5d\x25\x07\x19\x9a\xee\xcb\x25\x72\x81\xbc\xce\x4c\xbf\x40\x02\x87\xdf\x73\x75\x10\xfc\x2a\x9e\xda\x08\xba\x4e\xc9\xb7\xba\x8c\x7f\xb8\x65\xf5\xb0\x78\x5b\xdb\x03\xc9\x6f\xce\x0c\x50\xf9\xc8\xd6\xde\x3c\xcb\xbf\x3b\x5a\x2a\x80\xe9\x1d\x93\x3d\xec\x66\x28\x68\x90\x8c\x46\x98\xd2\x7f\x32\xe4\xa2\x01\x88\x9a\x18\x72\xe9\x95\x89\x1e\x92\x28\x2a\x39\x79\x93\x6d\x34\x0d\xae\xa4\x57\x56\xbf\x44\xbb\xeb\x07\x75\x40\x17\x42\x4a\x95\xda\xc5\xc5\x23\x64\x78\x60\x5c\x90\xd6\x27\xeb\xd3\x30\xc7\x75\x01\xca\x82\x11\xc5\x1e\x7e\x00\x30\x50\x49\x06\x34\xfc\x28\x4e\xa3\x4b\x2a\xab\x70\x8e\x61\x05\xc8\xaf\x52\x0b\x39\x5f\xb2\x1c\x34\x63\xad\x56\x93\x6b\x6e\xd3\xb3\x72\xf9\x66\x70\x81\xc7\xb7\x83\x6b\x17\x38\x99\xca\x1c\x2c\xa6\x87\x12\x3c\x2b\x08\x9a\x93\xf1\xa6\xc8\xd9\x48\x4f\x31\x54\xc4\xe2\x6f\x75\x31\x6c\x90\xc4\x97\x38\xcd\x15\x19\x96\x66\xbb\xe3\xc6\x94\x60\xf1\x49\xad\xff\xdc\x6e\xab\x1f\x68\x15\xd5\x79\x55\xbc\xac\x68\x0f\x33\xdf\xc5\x4a\x45\x6d\xfe\xb1\x4e\x78\x37\xc9\xf8\x68\x76\xa2\x41\x2c\x92\x58\x4d\x92\x2c\x8b\xfa\x23\xec\x5e\xb1\x96\xa6\x16\x73\x6e\x2a\x06\xca\xb4\x07\xa5\xdf\xf8\x09\xfc\x0f\x03\x0a\x12\xea\x73\xb2\x82\x37\xa5\xdf\x85\xc3\x93\xb5\xd2\x67\x7c\xbd\xa9\xfa\x45\x59\x8b\x69\x9e\x52\xf6\x42\x64\x19\x6f\xc2\xbf\x73\x0a\x8a\x55\xb9\x69\xba\x73\xd9\x6b\x30\x11\x5e\xb7\x4c\xb0\x17\x16\x72\xbd\x7a\x74\x7e\xd3\x3b\x5e\xb3\x57\x90\x58\x78\xdb\x5e\x42\x2c\x1c\x09\x28\x7d\xb7\x72\x38\xc1\xf1\xf1\xf1\x5b\xa3\x5a\x75\x67\x32\x79\xfa\xed\x82\xd7\x38\x9a\x1d\xc4\x6a\xb9\xca\xa6\x47\x74\x15\x67\x8b\x2d\x63\xe4\x5c\x37\x26\x2b\xd1\x7c\x03\x1d\xdc\x84\x1c\xea\xdc\xc0\xb9\x81\x2d\xf7\xca\x80\x5d\x01\x7e\x47\xc3\x48\x5f\xe3\x25\x70\x20\x09\x58\x46\x33\x80\x41\xf6\x38\x5c\x78\x51\x16\x18\xc7\x09\x7d\xa3\x31\x40\x96\xb3\x1f\x97\x71\x8f\xaa\x4b\x9a\x22\x2f\xae\xe9\xd8\xda\x5e\x42\xcf\x9e\xd9\x7d\x2b\xac\xe5\x57\xf2\x84\xe6\x1b\x72\xb9\x72\xcc\xa9\xe5\x20\x55\x27\x61\xf2\x8a\x32\x71\x8a\xb1\x71\x59\x55\x15\x25\xd0\x97\x2f\x94\x5c\x8b\x3a\x2b\x7c\x12\xaf\xf9\xb1\xd7\xd0\xd1\x58\xe5\x24\x4a\x65\xf3\xee\x35\x68\x3b\x70\xb5\x21\x7e\xda\x6f\x37\x58\xcf\x6d\xc4\x69\x03\xcd\x8a\x8b\x54\xc6\xb0\x7b\xa9\x83\x58\x7e\xdd\x21\x56\x5d\xe0\x5e\x72\x31\x6f\x66\x79\x90\x8c\x27\x41\x0e\xdb\x4b\xd5\x65\x28\x6f\x0b\xda\x26\x26\x89\x3f\x55\xf7\x44\xdb\xf2\xbb\x0d\x72\xf7\x65\x38\x98\xd0\xb6\x8f\x39\x79\x3b\x08\x59\xa2\x2e\x17\x6f\x54\xe8\x5b\x14\xaf\xcc\x7d\xe7\xa8\x65\xe4\x48\x4b\xca\x12\x2c\xbe\xd8\x02\x35\x12\x71\x57\xab\x40\xde\xd9\x8e\xb1\xd0\x5f\xf3\x10\x4b\x8a\x3b\x55\x2d\x57\x52\xb4\x1a\x43\x7b\x7f\xda\x98\x75\x5a\x5d\xbf\x3b\x58\x83\xc4\x06\xdd\x4e\xb7\xdd\x19\x76\x86\x67\x75\xae\x8a\x07\xd0\xfc\xa1\xe8\x87\xe3\x1c\x59\x01\x05\xe7\x58\x38\x0e\x5f\xa2\x6e\xc1\xc8\x68\x58\x9b\xc5\xf7\xbc\xb2\x35\x26\xfb\x2b\x2d\x2a\x3c\xf2\x75\x52\xd0\xe9\xad\x97\x8c\x1a\xb3\x81\x2f\xe8\x5b\xac\xe1\xfb\x0d\xe0\x60\x0a\xa3\xda\xd2\x9b\x04\x69\x86\x6b\xca\x42\x2d\xb9\x98\x4c\x33\x45\xf1\x53\x54\xb3\x7a\x25\x90\xe2\x88\xc6\xf0\x9a\xb3\xe8\x28\x61\x18\xc8\x94\xa9\x57\xcb\x20\xf2\xcb\x38\xe9\x30\xcc\x92\x42\x18\xe0\x4e\x70\x96\x53\xdb\x86\x60\x64\x59\xa0\x1a\xcc\xd3\xc6\x19\xda\xda\x42\xc5\xda\x43\x3f\xfc\xa0\xb7\x7b\xea\xb3\x32\x7c\x4d\xba\x54\x50\xbb\x33\x7a\x81\x61\xb6\x8c\x54\x0e\x63\x2c\x7e\xad\x45\x66\xca\xd3\xf4\x50\xbb\x5e\x62\x5d\x97\x5c\xb2\x23\x3a\x5c\x05\x15\x30\xcc\xf2\x06\xfc\x09\x34\xd0\xd0\x6f\xad\x8d\xe2\xca\xad\x8e\xdf\xad\xc6\x28\xac\x47\x23\xc7\x31\xc8\x93\x4e\x27\xaa\x68\x5e\x7a\x57\xc4\x17\xe1\x55\x1a\x4c\x26\x20\x47\x06\x39\x6b\x5e\x56\x99\xa0\x80\xec\xf4\x99\xe4\x95\x56\xba\x7a\x15\x57\x1f\xc3\x95\xad\x70\xf8\xb1\x7d\xaa\xea\x40\x72\xeb\xcb\x1e\x21\xf4\x70\x19\xbf\x4c\xaa\xe7\x3a\x02\xb9\xb7\xac\xb3\xd4\x21\x34\x0e\x29\xd5\x88\x03\x46\x71\xb1\x63\x39\x38\x95\x85\x88\xd2\xbd\x17\x01\xa1\x4d\x43\x54\x93\x26\xb6\x34\xa8\x14\xbb\x76\x20\xf3\xc6\xbc\xe9\xee\xe2\xa1\x5a\x28\x9f\x2c\x47\x9d\x12\xef\x73\xd6\x34\xb5\x41\x61\xbf\x0b\xbf\xf3\xbf\x48\x0c\x17\xfb\x16\xb6\xfd\xe7\x6e\x60\x64\x59\xda\x35\x2a\xe6\xb2\x12\xfe\x95\xa6\x36\x42\x71\xb5\x74\x9c\xc2\x1e\xae\xc1\x22\x48\x8d\xae\x4e\xf8\xaa\x8d\x7b\x62\xb5\x39\xa4\x81\x12\x65\x87\xc5\x39\xd6\xed\xc5\x7a\xbb\x10\x3a\x0b\x45\xcf\xd9\xb5\xd9\xaf\x4b\xd1\x0d\x92\xc2\xf9\xc4\x16\x00\xcd\xea\xb3\x6a\x88\x25\x85\x67\x86\x08\x90\xc0\x3a\x7b\x1b\xc9\xa4\x07\xfd\x2b\x60\xc2\x15\xb0\x01\x85\xd9\x1b\x11\x8e\x2b\x1c\x73\x5d\xfb\x51\xf5\xed\xb4\x6c\xd3\x56\xf6\x57\xb3\x20\x57\x2d\x5a\x3e\x11\xb2\x12\x7d\x5b\x89\x2e\x2d\x45\x24\x1d\x21\xa3\x17\xb3\x0c\xd5\x0a\x16\x80\xe0\x42\xd4\x2c\x26\xf4\x81\x45\x49\xf6\xca\x52\x58\xd2\x05\xea\x16\xd6\x96\xd2\x92\x5e\x90\x90\xde\xd0\x72\x5c\xbb\xa9\x7c\x6c\x61\xf7\xd0\x99\x98\x38\xa1\xf8\x92\xaf\x65\xd0\x83\x6d\x4f\x32\x01\x88\x1d\x4a\xbb\x68\x92\x1e\x21\xb5\xf7\x5f\x71\x9f\xd2\x02\xb4\x88\x48\xc7\x5f\x61\x6f\x2a\xa2\x2a\xcf\x67\xd3\xdc\x7b\xde\xc2\xa6\x39\xd9\xb1\x30\x0a\x92\x47\xfd\xad\x59\xf6\x7d\xa3\xa8\xef\x4b\xf7\xb8\xa5\x38\x63\x17\x38\x22\x0c\x7c\x85\x5d\x85\x69\x1c\x24\xd5\x82\xbc\x98\x34\xc0\xf2\x4e\xc1\x6e\xbf\xe1\xfc\x2a\x23\x5f\x70\x13\x5b\x73\x8c\x53\x98\x1b\x86\x3c\x79\xca\x26\xa6\x44\x5d\xa4\xc3\x52\xec\x4d\x12\x93\x51\x14\x3e\xd6\x6d\x42\x34\xb1\xb0\x36\xc6\xca\xd6\xf4\xb1\x52\xef\x5f\x40\xc7\x14\x64\xd9\x74\x8c\x43\xf5\x3e\x31\x18\xa5\x38\x08\xaf\xa5\xfd\x4e\x39\x90\x4d\x63\x9a\xb6\xb2\x42\x44\xb3\xc5\xd8\x9e\x9d\x7f\x2d\x74\x68\x22\x8c\x0b\x4c\xd4\xd3\x0c\x2f\xcc\xeb\xdd\xfa\xa2\x69\xbc\x28\xac\x3f\x51\xe2\x36\x48\x9e\xaa\x90\x0e\x39\x15\x20\x41\xfc\x76\x1e\xf0\xc9\xd0\x29\xc9\xab\x87\x55\xb6\xa5\xf2\x66\xb1\x6b\xe4\x45\x38\x27\x84\x0d\xb7\x09\xa1\xec\xc9\x5c\xaa\xfa\xc5\x06\x2a\xd5\x8e\x32\x68\x25\x4a\x51\x43\x33\x61\xbd\x21\x79\x63\x37\x91\x98\x77\x65\xf2\x39\x1c\xc2\x7d\x09\xfd\x6f\xf9\x65\xc9\x3c\x2b\x0c\xf3\xc2\xe4\x0d\x85\x4e\x5a\xa9\x76\x4f\xb2\x43\xc0\xc3\x9d\x3e\x69\x8c\xac\xe5\x83\x9f\xb8\xc2\x60\xc2\xe2\x05\x55\x57\xc7\xf2\x1a\xcc\xf2\x82\x3d\x80\x9c\x42\x9a\x01\xc0\xe5\x5e\x21\x45\xa0\x72\x4c\x6d\x2b\xa2\x98\x59\xf2\x32\x3b\x00\x66\x32\x73\x8e\x63\x30\xe6\x2d\x87\x26\xa2\x94\x3b\x80\xd1\xd0\xd9\xe5\xb0\x4c\x9d\x01\xa8\xb0\x24\x21\x69\x1b\x75\xdb\x60\x72\x0c\x1f\xb8\xfd\xec\xc1\x10\x25\xe3\x88\xc8\x08\x1e\x0a\xe8\xa7\xab\x68\x34\x42\x7d\x2c\x1a\x0c\x51\x1a\xc4\x61\x32\x1e\x5d\xdf\xd3\xe1\x9e\x5a\x4d\xb0\x61\xf2\xd0\xc1\x4f\x1e\x4c\x29\x69\xfc\x2b\x70\x21\x3a\xc9\xa1\xc9\x82\x24\x6a\x5c\xc1\x33\x3c\x98\xe6\xb8\xf6\x8c\x47\xa3\x7a\xe6\xb1\xc4\x1d\x1e\x33\xdf\x72\x88\x45\xf7\x04\xdd\x43\xcf\xc8\x70\x90\xff\x7f\xe6\x3e\x33\x53\x30\x32\x77\xe3\xd4\xec\x71\x12\xf5\x18\x75\x51\xc5\xa6\xdd\xa8\x9f\x4e\x33\x9b\x65\x87\xa2\xfa\x3b\xe7\x55\x92\xa1\x44\xa6\x70\x6a\xdd\xf6\xaa\x91\xd6\xdc\xe2\x56\x47\x97\xb6\xb4\xae\x4d\x69\x85\xc6\x9b\xa5\x89\x07\x0a\x05\xae\x88\x71\x57\xa4\x41\x66\x0b\xe9\xa6\xbe\xc2\x12\x79\x4b\xe3\x01\xf8\x5b\x03\xd6\x12\xda\xcc\xcb\x31\x00\xbb\x69\x43\x4d\x2e\x92\x41\x33\x05\x39\x4f\x26\xcb\xc7\x1c\x3d\x37\xf5\xd9\x4a\x6a\xe8\x22\x85\xb3\xdd\x59\xea\x88\x89\x52\x0b\x1e\xc6\x8b\x23\xb5\x90\xa2\x6f\xa7\xd5\xb6\x69\x06\x14\x15\x77\xc8\xf8\x32\x67\x79\x1a\x4b\xf6\x04\x2c\x87\xf8\x75\x7b\x7d\xb8\x25\x4a\x9c\x50\x88\xdb\xbf\xd9\x34\x5c\x0f\xa8\x1f\x7f\xb3\xb3\x77\x83\xc8\xf6\xc9\x2d\x28\x6d\xbb\x70\x21\xe5\x71\x66\x5b\xbe\xc5\x2d\xa4\x15\xb7\x74\xd8\xed\xfc\xf0\x39\x1c\x6e\x4a\xdb\xb3\x44\x21\x0b\xaa\xc7\x99\x4b\xd5\x22\xfb\xf2\xb7\xa1\x2f\x2f\x95\x0e\xbe\x01\x75\xc4\x5f\x44\x6d\x6e\x59\x7c\x95\x34\xc9\xcf\xf8\x50\xbb\xc2\xca\x3e\x7c\xc3\x1e\xfa\xe3\x81\x35\xd8\xc5\x76\xf4\x95\x14\x0e\xda\xee\x9a\xe4\x2e\xe5\xae\x4d\x76\x21\xe0\x89\xd8\xc2\xc5\x15\x09\x7b\x3a\xbc\x42\xc6\x60\xcf\x74\xdb\x73\x79\x77\x52\x31\x96\xf6\xcd\xe8\xd2\x0a\x6c\xb1\x0a\x06\x2b\xd6\x90\x04\x4e\xc5\xbc\xa2\x2f\x71\x5f\x67\xc8\x01\x20\x8c\xf9\x51\xdb\x97\xf4\xf8\x06\x1a\xef\xa2\x19\x4d\x06\x02\x15\xac\x43\x2a\x9d\xad\xa9\x61\xa6\x02\xdd\xa5\x37\xb1\x9e\xf8\xee\xa0\x0f\xfe\x13\xf8\xf1\x3d\x2b\x88\xbf\x75\xc6\xfc\x2d\xea\x89\x6d\xcc\x70\x51\x45\xf1\x9d\x18\xe3\xbd\xa3\x68\x2a\x8a\xef\x8b\x71\x57\xd4\x13\x7f\x75\xde\xfd\xd5\x95\xc5\x5f\x7f\xab\xf0\x14\xdb\x1e\xc7\x09\xed\xfe\xf6\x8e\x4a\xfa\x70\xf7\xfd\x85\x6d\xeb\x90\xc7\xb7\xe2\xee\x51\xa6\x20\x2f\x54\x79\x22\xd3\xa5\x9c\xd2\x92\xe5\xaf\xbc\x39\xf3\x3a\xad\x6f\x35\x29\xe5\xbd\xe7\xa0\x5c\x34\xf7\xa4\x92\x73\xd2\x40\xcc\x4c\x3f\xa9\xa5\x9d\xe4\x15\x1d\x89\x27\x41\x3f\x5a\x00\x17\x3f\xd5\xe4\x93\xef\x82\xfc\xc2\x43\x96\x14\x94\xc5\xf1\xfa\x6d\x32\x08\x46\x68\x92\x8c\xae\x87\xd1\x08\x25\x43\x44\x37\x2d\x76\x8a\xb7\x1c\x79\x59\x6c\xfb\x2d\xb5\xa0\xd6\xb0\xc2\x98\xc4\xeb\x3d\xf2\xfe\xe6\x85\x19\x3b\x48\xb2\xb5\xec\xff\x66\x30\x35\xb0\x11\x9c\xf6\xc9\x0c\xea\x44\xbc\xb7\x32\x49\x93\x3c\x21\x9f\xd0\x16\x39\x7d\xe8\x05\x58\x3d\xb4\x85\x62\x7c\x45\x10\x28\x87\x10\x4f\x47\x23\xc7\x42\x11\x18\x14\xcb\x44\x8a\x77\x64\x8b\xe4\xc9\xe7\xa4\x5c\xc9\xed\x54\x6c\xbf\x8d\xfa\x69\x90\x5e\xcf\xd3\x91\x4b\xf9\x41\x9d\xa0\x20\x5b\x28\xd3\x7a\x12\xe1\x82\x77\x39\x18\xa1\x28\xbe\xc0\x69\xa4\x04\x70\x55\x22\x3a\xe8\x79\x46\xcd\x08\xa3\xe6\x74\x56\x08\xfb\xc7\x63\x0c\x83\x7b\x9c\xf0\x33\xb8\x08\x72\x8e\x10\x0b\xe5\x41\xc5\x20\xe3\x54\x89\x50\x59\x1c\x40\x2e\x77\x25\x97\x38\x4d\xa3\x10\x67\xe8\x03\x55\x88\x44\x38\xa3\x0c\x7c\x72\x8d\xa2\x98\x65\x33\x2e\x10\xa8\xd0\x82\x9e\xab\xe1\x64\x51\x00\x86\xcc\xe5\x28\xb7\x48\xd4\x40\x32\x51\xef\xae\x4f\x28\x09\x2b\xd2\x4d\x89\x49\xa2\xec\x2f\x16\xe1\x51\xb8\x89\x9e\x41\xa6\xac\x67\xba\xe1\x88\xbd\x4d\xf2\x37\xc6\xf9\x45\x12\x96\xfa\xc8\x4b\xa5\xf5\x18\xf9\x36\xc7\x33\x84\xcc\x70\x86\x14\x7d\xc5\x20\x9b\xcf\xab\x33\x88\xe1\x24\xb8\x8a\xcd\x2f\x12\x23\x21\xc2\x42\x91\x56\xcf\x65\x4e\xbc\x3d\x3d\x1f\xe3\xd8\x62\x3a\x4c\x76\x94\x72\x2c\x50\xc1\x7c\xd8\xb9\xab\x28\x6f\x4d\xff\x60\x45\x80\x99\x49\x71\xd7\xaf\x48\x38\x96\xa6\x76\x9c\xbe\xe3\x4d\x5e\x04\xd9\xe1\x55\xcc\xc8\xfe\xba\xf6\x8c\xd4\x7c\x56\x17\x3e\x4f\xe4\x11\x36\x41\x5e\x9e\xbc\x98\xdb\x0f\x5a\xab\x74\xba\x2d\xb5\xfe\x9f\x6c\x3a\x21\xa2\x56\x1c\xe5\x2b\x01\x11\x4e\xd9\xd6\x17\xa4\xe7\x53\x32\xba\xd6\xf1\x40\x96\x0c\x0a\x25\xe3\x54\x78\xdc\xa6\xcf\x32\x54\x70\xf4\x88\x2a\x85\xf9\xa4\xd3\x55\x6a\x42\x90\x3b\xa8\xec\x07\x8e\x6d\x07\x71\xc5\xf8\x10\xa7\x38\x1e\x90\x06\x60\x9c\x27\xfa\x7a\x35\x86\x81\xc9\xc5\x36\x80\xce\x7d\x06\xd9\x52\x63\xd8\x98\xea\x2e\xac\x94\x4c\x66\x9a\x54\xe5\x3d\x8d\xe9\x38\xc0\x04\xd2\x55\x6b\x86\x40\xdd\xe6\xf3\x51\x64\xb0\xa9\xd5\xc5\x35\x1c\x11\xa5\x21\xa4\x1c\x00\xa9\xd5\xff\xca\xbc\x92\x47\x2c\x47\x5b\x8c\x6d\xf2\x3b\x8b\xb9\xbc\x88\x96\x2b\xe7\x78\x66\x23\xb0\xe4\x8a\x38\xd9\xe6\xca\xe5\x11\xd4\xa5\x35\xc2\xdf\xa9\xeb\xc4\x49\x35\xbc\xf8\x6d\xc8\xa6\xcc\x5d\xdd\x31\x57\xe8\x90\x31\x33\x96\x24\x00\x48\x0a\x4c\xe8\xc3\x10\x65\xc9\x18\xd3\xd4\x53\xe8\xea\x02\xc7\xe8\x3a\x99\xa6\xc2\xcc\x3e\x20\xe2\x2c\x05\x7e\xcf\xb1\x73\xef\xba\x0b\xea\x8e\xce\x65\x7b\x19\xa2\x0c\x60\x65\xc5\x1c\x19\x31\xf4\xb7\xdc\xee\xe6\xa2\x51\x69\x4e\x7b\xc9\x84\x08\x3b\x93\x42\xee\x61\xf2\xce\x1d\xc4\x29\x09\x18\x68\x98\x14\x99\x6a\x0c\x9a\xc8\x7b\x9e\x52\xb6\x3a\xe9\xfe\x59\x55\x7e\xb9\xe5\xb8\x43\x23\xca\x25\xb6\xe8\x9f\x75\x8d\x8b\x88\x87\xfc\xb2\xed\x7d\x30\x06\xa3\x89\x39\xf5\x10\xdb\xaa\x8b\x62\xfa\x66\x2d\x03\xac\x97\x6e\xb1\x64\x3a\x4f\xe5\xe2\x67\x68\x4b\x6a\x5f\xfd\xb4\x40\xea\x22\xc7\x26\xbb\x8b\xae\x92\xf8\x59\x4e\xe5\x67\xee\xee\x28\x05\x2f\x1c\x25\xc9\x04\x05\xfd\xe4\xd2\xb2\x0d\x96\x77\xf9\x19\x87\xf6\xcc\xdd\x61\xe0\xa2\xa2\x55\xb9\x9f\xe2\x6d\x85\xbc\x5a\x95\x16\x8f\x38\x9c\x40\x4f\xc1\xfe\x65\x91\x75\x63\xdb\xf8\x06\xa3\x24\xc6\x0f\xc0\xf1\x00\x2e\xda\x2a\xf6\x10\x78\x51\x61\x27\x23\xc5\xe6\x6e\x64\x72\x2e\x12\x55\x38\xe2\xfc\xd4\x6a\x4f\x66\x3f\x23\x5b\x6f\xf7\x63\x14\x80\xe7\xad\x16\x8b\xb0\x34\xb2\x90\x11\xe7\xbd\x1c\x84\x2d\x3c\x8d\x30\x7e\x50\xc3\x21\x66\xd1\x79\x1c\x0d\xa3\x41\x10\xe7\x2c\xa0\x64\x44\x7b\x0f\x20\x69\x3b\xb6\x63\xf2\xcf\x92\x07\x31\x3d\x2b\xcb\x6f\xee\x21\x6c\x8c\xd9\xbc\x4e\x16\x8e\x30\xf8\xb2\xe9\xd5\x9c\xb1\x46\x56\xb3\x30\x31\x52\xda\x0d\xc6\xdc\x41\xc3\xf7\x96\xea\x45\xf6\xcf\x56\x36\x76\xc3\x16\xc6\xa1\xfd\xaf\x0e\xe0\xb4\x31\x6b\x34\x1a\x7e\xa3\xd9\x68\x79\xa8\x31\x6b\xb4\x1b\x9d\x46\xb7\xb1\x76\xf6\x60\x80\x3d\xd4\xad\x1c\x7a\x85\x85\xaf\xe3\x33\x62\xac\xd8\x2b\xe6\x10\x0c\xcb\x95\x3f\xd0\xff\x7e\xf9\x02\x31\x7b\x35\x51\x63\x88\x6a\x62\x7a\xbf\xdb\xb2\x28\x0a\xe5\x3f\x80\x2a\x19\x0d\xf1\x9f\x95\x8d\x49\x75\x00\x94\x3c\x46\x38\x3e\xcf\x2f\xa8\xe9\x91\x93\x8b\x54\x8f\x19\x53\x2c\x94\xc5\x22\xc5\xec\xc6\x83\x24\x24\xf4\x8e\xe9\x0f\x9d\xdc\xe1\x75\x79\xec\x4f\x41\x00\x38\x1e\xac\xec\xe3\x99\xbb\xcd\x79\x01\x64\x2a\xad\xf6\x85\x83\xbb\x14\xc4\x5a\x21\xb2\x8b\x25\xae\xc1\xbc\xb0\x2e\x96\x2a\xca\x90\x7c\xcc\x87\xeb\x0b\x45\x73\x61\x53\xe1\x8c\xe5\xc2\xa7\xea\xcb\x17\xb4\x8f\x67\xa5\xe1\x5b\xe6\x10\xd0\x20\xc8\x71\xcc\xf6\x7c\x95\x82\x1c\xcc\xdf\x4d\x48\xd2\x3d\x6c\x31\xe0\x27\x8c\x1b\x4a\x94\x09\x69\x7e\x17\xbd\xd7\xad\x8a\x4b\x15\xda\x10\xd8\xf9\x3c\x7e\x86\x78\xd3\x74\xa7\x34\x83\x92\x3a\x53\xa2\x81\x9d\x17\x0b\x47\x42\x06\xf6\x67\x83\x61\x59\x7c\x15\xf3\x8b\x40\x84\x3a\x28\x48\xcc\x5d\x3a\xca\x8e\x0b\x1e\xa3\xf0\x1c\x07\xf0\x63\x95\x25\x51\xf8\x45\x1d\xa3\x53\xbd\x51\x30\x9e\x20\x3c\x83\x48\x92\xfd\x48\xef\x1c\xbd\x57\x25\x65\xcc\xdb\x06\x7a\x9f\x3a\xb0\x05\x49\x51\x10\xff\x87\x23\x50\x3a\xd4\x27\x22\x69\x8c\x61\xab\x45\x41\x8e\x02\x94\x47\x63\x8b\xc4\x6d\x0b\xc9\x2e\x77\xd7\x9d\x14\x42\x1e\x1c\x52\x14\x6d\x11\xf4\xd8\x2c\x9c\x46\x3c\x2a\x36\xf9\x4f\xad\xd9\x46\xcb\xa8\x16\x51\x8c\x9f\xa3\xf5\x7a\x5d\x44\xcb\x76\x4a\xf1\x14\x8e\xda\xe3\x25\x14\x89\x70\xdb\x5f\xb6\x8a\xa6\x5f\xbe\xe4\x6d\x58\xca\x8b\x46\x2b\x08\xfe\xce\x6d\x49\x1e\x53\xba\xb8\xee\x34\xa6\xee\x28\xf7\x55\xbb\xbf\x85\xcc\xc1\xae\x92\x31\xd8\xa4\x42\xb1\xd9\x2e\x6d\xa9\x68\xda\x72\xac\x04\x51\x1c\xf4\xf5\x93\x87\x74\x00\xa8\xca\x4e\x69\x0c\x0e\x22\x04\x2a\x82\x61\x94\xdf\x55\x14\x2c\x16\xa7\x58\x5d\x0e\x26\x45\x3e\x57\x0d\xdd\x6b\x61\x4d\xa6\x1c\x65\x8b\x8b\xe4\x64\x32\x76\x86\x61\x11\xd5\x4e\x05\x0c\x1e\x67\x7e\x0b\x96\x0e\xfd\x03\xd2\x6f\x35\x09\xe9\x67\x0a\x5f\xb0\x10\xbc\x22\x4a\x6d\xa1\x77\x41\x7e\xb1\x32\xc0\xd1\xa8\xa8\xb9\x8a\x16\x88\x48\x64\x3f\xff\x56\xda\x79\x1c\xe6\x48\xc6\xf1\xf7\xb6\x76\x9f\xec\xb8\x2b\xd3\x82\x71\xde\x55\x69\x61\xde\x39\x57\x06\x0b\x27\x35\x8a\xab\x1c\xfd\xdc\x3c\x39\xaf\x98\x34\xc2\xcc\xef\x1b\x4e\x93\x3a\x52\x6f\xf1\x29\x90\xc4\x86\x61\x34\x1a\xf1\xb0\xb3\xcc\x4d\x02\xce\x5b\xf3\x85\x12\x7e\x98\x8b\x6d\x87\x5e\x19\x94\xd3\xc5\xa7\xd2\x2c\x33\x48\x95\x08\xe5\xbe\x8c\xcf\x2a\x1c\xc1\x98\x2b\x88\xef\x3e\x69\xd1\x12\x32\x99\xc4\xf6\x23\x96\xcc\x1e\xcc\x03\x15\xf9\x9a\xaa\x37\xe4\xe3\x4f\x57\xee\x28\xf3\x9f\xae\xd0\x16\xf9\xd7\x91\x40\x6d\xfc\xe9\x77\xb2\xcd\xcc\x5a\x41\x88\xbb\xeb\x7d\x3d\xfc\xba\x28\x16\x64\x9f\x91\xcc\x39\x4a\xee\x09\x2a\xdc\xdd\xd1\x56\x6b\x8d\xd9\x46\xa3\xbb\x81\x9e\x93\x2e\xfc\x0e\x7b\xfa\xde\xde\xde\x5e\x1d\x2d\xd1\x17\x3f\xfe\x88\x1a\x33\xbf\x01\xdb\x3d\x41\xc0\xb1\xdd\xd3\x2e\xd6\x1a\xb3\x76\xb7\xd3\xa0\xc0\xae\x74\x60\x57\x55\x81\xc1\xf0\xe2\x6c\x0a\x9e\x3e\x35\x40\xe3\xe5\x4b\x5a\x13\x2d\x21\x18\xe9\xd2\xfa\xac\xee\xea\x16\xd4\x61\x7f\xe5\x65\x97\xb6\x50\x63\xa5\xe3\x2c\x03\x63\xca\x8a\x3e\xa7\xf6\x36\x9c\xda\xea\xe8\x47\xb4\xd2\x41\xff\x85\x7c\xb4\x89\x96\xfd\x2a\x22\x8a\xc1\x39\x54\x71\xc3\x43\xe9\x20\x18\x5c\x60\x96\x5d\x67\xbe\xc0\x41\x6a\x7e\x22\xf4\x98\xd6\x6a\xb4\x2a\x39\x2a\x29\x48\x92\xdd\x44\x1a\x0c\xfb\x15\x13\xad\xba\x85\x3e\xa5\x35\x5a\x1e\x08\x72\xad\xbf\x66\xe9\xd3\x55\x91\xc3\xa7\x26\xca\x17\xf0\xd1\x17\xd4\xa8\x18\xd6\x3c\xc6\x57\x92\xb3\x13\xdc\x3a\x32\x05\x48\xcc\xd3\xf7\x3c\xd1\x46\xd2\xee\x7c\xca\x8e\xf6\xf3\x0c\x69\x70\x3c\x00\x43\x1a\xfa\x5f\xbb\x21\xcd\x3e\x9e\x99\x9a\x00\x1b\x38\x52\x70\x8b\x02\x5d\xa1\xbf\xab\xc5\xdf\xd4\xd5\x17\x17\x78\x56\x59\x85\x51\xe1\xe4\xb9\x60\x54\xcd\x4a\xad\xdf\x17\x23\xbf\xc0\x33\x33\x84\x26\x1b\x3f\xe9\x68\x3f\x3f\x91\x90\x35\x70\xe6\x6d\x8f\xa9\x57\x95\x4f\x9e\xd9\xa2\xc7\x48\x3a\xeb\x26\xa0\x0b\x3c\xeb\x5d\x04\x69\xe5\x3c\x5b\xd9\xdc\x03\x1d\xe4\x48\x8b\xe8\x41\xee\xea\x8e\x87\x38\x8e\x1d\x5b\xe3\x00\x96\x00\x69\xd7\x0b\xb5\x8f\xdf\xad\xdb\xf8\x9d\xad\x2a\x69\xa7\x31\x2c\xaf\xeb\x60\x10\x02\xdc\x6f\x49\x14\xd7\x9e\x3d\xbb\x45\xc4\x4d\x89\xc2\xe9\x7a\x5b\x44\xd3\xc3\x57\x0a\x25\xdc\xea\x0b\xc6\x21\x3c\xfd\xf9\x52\x13\x5f\x6c\xd4\x66\x5b\xac\xc7\xea\x91\x32\x69\x95\xc5\x12\xa5\xd0\x3a\x6f\xf9\xd1\x85\x3e\xb2\xa3\xcc\x22\xab\xe6\x6a\x91\xd4\x74\x72\xa3\x6c\x0b\x6d\x96\xe4\xc7\xa4\xab\xa5\x05\x9a\x09\xe8\xf4\x41\x9c\xb3\xce\xae\x64\xd3\x7e\x96\xa7\xb5\xc8\x43\xcd\xba\x07\x49\xf8\x0a\x95\x05\x59\x51\xeb\x75\x9b\x03\xee\xc2\x7b\x9e\x32\x4c\xab\xa8\x59\xd5\x7d\xf6\x6d\x90\x47\xb1\x5f\x6d\xd3\x62\x65\xf9\xbe\x25\x1e\x6f\xb7\x75\xb1\xea\x7f\xde\xee\x55\x15\x81\xfb\x5a\x53\x23\x68\xcf\xbe\x87\x51\x5c\xfe\xa3\xb6\x31\x3a\x1c\xdf\xf0\x4e\x26\x21\x48\x77\x24\x3a\x75\x2b\xc3\x34\x19\x93\xb7\xbd\x24\xc4\xb0\x49\x55\xdd\x90\x64\x80\x77\xd8\x93\x14\xba\xbd\xfd\xb6\x24\xc8\x71\xa1\xc5\xf0\x4d\x6f\x4e\x6c\x15\xd1\xfd\x49\x5e\x6e\xd5\xb7\x28\x51\x6b\xb1\x5d\x4a\x54\x13\x1b\x95\x78\xf3\xd0\x7b\x95\xd6\xf4\xbc\x5c\xce\x91\xa4\x45\x2f\x7a\xbb\x32\x60\x04\xbd\x9d\xd7\x22\xbe\x26\xf4\xad\xca\xae\x5b\x5c\x78\xab\xd2\x10\xae\xba\x53\x7d\x3c\xd9\x5b\x5e\xaf\xb6\x51\x7d\xcc\x87\xeb\x62\x9b\x62\x0f\xb7\xdb\xa4\x68\xa3\x7f\xde\x1e\x55\xb1\xfd\xfb\x5a\x59\xd3\x7c\xb8\x6e\xdf\xa0\xc8\x28\x3e\xe4\xf6\x94\xa7\xd7\x25\x06\x46\x21\x26\x47\xf4\x8f\x47\x07\x3d\xee\xe9\x54\xc3\xd9\x20\x98\xe0\x5a\xc9\xc6\x69\xb2\x65\x34\x08\xf2\xc1\x05\xaa\x99\xe9\xa3\x01\x85\x8b\x34\xb9\x02\xba\x85\x8c\x2b\xb5\x67\xef\x82\xd1\x30\x49\xc7\x38\x64\xd3\x10\x06\x79\x60\xa6\xa0\x5b\x9c\x81\xcb\x93\x7a\x7b\xfe\xcd\xe6\x6a\x11\x32\xf9\xa6\x99\x37\x50\x18\x65\xdd\x05\x19\x56\x67\xdc\xac\x8e\xcb\x18\x40\xd9\x1a\xa6\x31\xa3\x1e\x6a\x21\xa0\xd0\x15\x87\x53\xaf\x1c\x80\x46\xa4\xe0\x85\x5c\x98\x38\x64\xd9\xcc\x24\x2f\x74\x67\x26\x5e\xc9\x4e\xf6\x5a\x4a\x89\x36\x9e\x66\x39\xea\x63\x14\x91\x11\x1d\xe3\x38\xa7\x79\xd6\x02\xb8\x5e\x4f\x71\x2e\x3c\x16\x2a\xe5\xf6\xd5\xf2\x74\xaa\xca\x7d\x9a\xe3\x90\xba\x56\x15\x09\xe2\x3f\xe3\x49\x8e\xa6\xf1\x84\x27\x0d\x54\xb3\x83\x4a\x36\x2d\x0d\x0b\xf7\x7d\xc5\xc6\x01\x32\x0d\x6e\x8b\x51\x10\x5e\x62\xae\xcf\x15\xcd\xe0\x20\xbb\x2b\xb3\xe6\xd1\x46\xfa\x19\x4b\xa2\xcd\x92\x98\xe6\x09\x8a\xf2\x8c\x7b\xc5\x20\x42\xc1\x77\xbd\x63\xea\x5b\x91\xa7\x09\x71\xdd\x97\x4c\x95\xb2\xee\x32\xf3\x3e\x04\x56\xca\x36\x9b\x01\xc8\xc0\xc9\x3c\x15\xb5\x9d\x55\x67\x4a\xb4\x7c\xbc\x13\xe4\x01\x17\xd6\x1b\x55\x25\xcd\xed\x30\xcc\xa0\x0d\x9e\x17\xdc\x31\xd2\x8c\x16\xaa\x6f\x8a\x22\xc8\x82\x91\x79\x9c\x19\xbb\x20\xba\xe6\x99\x13\x00\xe5\x97\xd4\xa7\x24\x90\x2c\x28\xa9\x3d\x31\x70\xbc\x87\x99\xcc\x4f\x14\x9d\xda\x33\x93\xdf\x57\xaa\x37\x7f\x6f\x64\x25\xab\x24\x33\x37\xdd\xeb\x8b\x74\x74\x72\x40\x51\x69\x80\x58\x30\x51\x15\x94\xec\xe3\x0c\x64\x34\x27\x4e\x24\xa3\x35\x89\x29\x03\x86\xf3\x23\xa5\x6d\x43\xd7\x5c\xe4\xcb\x4d\x89\x6c\xc0\x0c\xa2\x5d\xda\x52\x93\xa4\x57\xa5\x60\x9e\xeb\x34\x43\xc1\x65\x10\x8d\x20\x62\x17\xe5\x0b\xc0\xec\xdc\x54\x73\x22\x39\xab\x44\xf1\x65\xf2\x19\x67\x7a\x92\xe1\x1a\x4b\x0e\xec\xa1\xab\x8b\x68\x70\x61\x65\xd5\xfd\xeb\x12\x56\x6d\xb6\xca\x17\x4a\x3f\x49\x46\x38\x88\x6f\x50\x98\xec\x8d\xa6\xd9\x05\xfa\xf9\x02\xe7\x34\x9e\x09\xcf\x45\x0b\xee\x5a\x93\x20\x05\x46\xc1\x5e\x15\x5c\x5b\xb0\xeb\x5b\x84\x03\x11\x9c\x1e\x46\xfc\xee\xdb\xbc\x00\xb8\x43\x09\xc9\xb5\x66\x78\xaa\x5c\x57\x5c\x8e\x05\xc1\xd8\x33\x05\xab\xb1\x56\x69\x51\x65\xf1\xd1\x01\x5f\x50\x67\xc2\x96\x48\x41\xdc\x16\x6d\x09\x79\xcd\x8d\xd3\x60\x64\x5d\x6a\x15\xf2\x51\x32\x34\x73\xd1\x3d\x2f\x5e\xc8\x0a\x5b\x5a\x4a\xe6\xb2\xc2\x1c\x7a\x51\xdb\x1e\xd1\xaf\x97\x4c\xe3\x9c\xd3\x97\x85\x99\x10\xa0\x31\x4d\x24\x7c\x04\x71\x8b\xb7\x54\xfc\x57\xb5\x26\x5f\x98\xbc\xc8\x35\xe4\x0c\x83\xa3\x64\x1a\x87\x68\x3a\xa1\x0e\x85\x83\xd1\x34\xc4\x1a\xdd\x9b\xd5\x34\x8c\x0a\x23\x17\xf9\x43\xf5\xd8\xb6\x02\x8b\x30\xb9\x8a\x65\x3c\x92\x78\x74\x8d\x86\x53\xb1\x28\x2d\x91\xf4\x57\x57\xd1\x08\x67\xd4\xa9\xd2\x2e\x6b\x01\xdf\x48\xf1\x38\x88\x62\x55\xb8\xaa\xd6\xaf\x71\x30\xab\x29\xfd\x82\x8b\x53\xb4\x6c\xcb\xcc\xee\xcd\xbf\x52\x15\x73\x4e\x35\x0f\xae\x29\x07\x4a\xe6\x78\x28\xad\x3f\x47\x12\x01\xba\xe8\x09\x68\xc3\x49\x4e\xe4\xab\xda\xc7\x28\xae\xc9\x4d\x3e\x47\x6d\x4f\xa1\x33\x9b\xf9\x24\xcf\xe0\x6d\x23\x12\x42\x77\x12\xc0\x72\xb7\x2d\xca\xe7\xa9\x9a\x85\xfd\x7e\x29\x8f\x80\x78\xbb\x24\xad\x27\xa7\xd1\x04\xc1\x0c\xa7\xe4\x34\x29\x36\x86\xe5\xe2\x80\x00\xce\x90\xf6\x8a\x8c\xbb\xa8\x7b\x90\xe0\x2a\xb6\x5c\xf5\xae\x39\x46\x4a\x0a\xac\x82\xe1\xc3\x94\x9b\x45\x15\xee\x2b\xb3\x30\x3d\x19\x96\x3c\xa2\x16\x34\x14\x4e\x86\x96\xb7\xe4\x99\x9e\x4f\x95\x3c\xb6\x68\x19\xb6\x6e\x85\x93\x8a\xbf\x27\x37\x7d\x57\x63\xb7\xca\x59\x28\x4b\x9d\xbc\xee\x68\xe5\xe6\xd8\x0d\xff\x24\x93\xb7\x4f\xc6\x86\x58\x60\x62\x9d\xb1\x52\x8b\x37\x95\x87\x89\x93\xa6\x23\x13\x3d\x3f\x83\x5f\x04\x19\x64\xc8\x75\x9e\xb8\xe7\xa6\x22\x2f\xd8\xb5\xec\x03\x45\x27\x9d\x41\xa7\x61\xd7\x70\x86\x92\x58\x3a\x0a\xfb\x5d\x54\xeb\xf8\x4d\xb0\x64\xad\x5b\x8e\xc5\xfb\xb4\x32\x3f\x06\x8b\x47\xfb\x79\xf8\x5e\xa2\xbe\x96\x65\x20\x2b\x0d\x98\x5a\xe6\x6a\x46\x07\x61\x81\x9c\xe4\xb7\x8d\x6e\x47\x1a\x42\x34\x44\xf2\xbc\x20\x77\x95\x6d\x48\xc4\x1c\x28\xa1\xdb\x8e\xf7\xb7\x9b\x9d\xae\xdd\x49\xac\x2c\xd5\xf5\xad\x23\xac\xf1\xd8\x6a\xd5\xc3\xac\x1d\x63\x11\xde\xc3\xad\x21\x30\xd5\x10\x73\x2c\xb1\x0b\x4d\x0a\x5f\x38\xf7\xaf\x32\x61\xf4\x72\x1f\x2a\x12\x40\x58\x56\xf1\xa8\x25\x1c\x2b\x09\x40\x2b\xcc\xcb\x94\x1a\xf4\xbd\x99\x0d\x87\x65\x63\xe6\x1b\xf2\xd1\x62\x63\xfd\x71\x12\x02\xcb\x90\x07\x9b\xa6\xe5\xaf\x9e\xb1\xcf\x19\x41\x98\x02\xd7\xe3\x08\x57\x76\x21\xa2\xac\x88\xf9\x0f\xcd\x5d\xde\x0b\xcc\xf9\x14\xf0\xaa\x3d\x63\x48\xd9\x74\x29\x6a\xc9\xf9\xaa\x13\x5a\x50\x26\x14\x65\x0c\x1c\xeb\xd1\xa1\x91\x60\x0a\x1b\x15\x82\x85\x3c\xd8\xf8\x12\x21\x9d\xe0\x6b\x03\x25\x9d\x63\x4d\xf1\xf7\xde\x7c\x27\xf6\x58\x92\x9b\x4c\xe0\xe2\x64\x90\xe8\x7d\x02\x28\x07\x39\xcd\x17\xcf\x6a\x16\x31\x43\x51\x94\x21\x3c\x1c\xe2\x41\x1e\x5d\xe2\xd1\x35\x0a\x50\x88\xb3\x3c\x9d\xc2\xb3\x07\x72\xfa\x72\x12\x0f\x70\xa5\x28\xa3\x15\x29\x54\x49\xf4\x00\x28\x15\x01\xb9\xa1\xc4\xe2\x9a\x0b\x32\x08\xf7\xb4\x33\xa0\x2d\x4e\x8e\x22\x99\x90\x43\x2d\xe1\x28\x5d\x46\xe8\x25\xd5\xe6\x53\x3d\x2f\xba\x10\xdd\xef\x59\xc6\xd7\x3c\x10\x95\x83\x41\xf3\xd6\xca\x3c\x01\x7e\x01\xce\x2a\x8d\x10\x67\xb2\x7b\xd2\x3c\x58\x17\x0f\x29\xef\x5a\x3c\x52\xf2\xbb\x8e\xdf\x5c\x6d\x35\xab\x89\xf9\x19\xd3\xf8\x28\xf1\xef\x03\x36\x69\xcf\x44\xe0\xa4\x28\xce\x71\x3a\x94\xac\x85\x91\x73\x55\x70\xfe\xca\xba\xce\xa9\x96\x6e\xb7\x2c\x3e\x62\x80\x2e\xf0\x68\x82\x53\x22\xfe\x54\x58\x04\x7b\x0c\x37\xe6\x1b\xac\xa3\xfc\x15\xee\xf1\xa8\xcc\xa4\x3b\x55\xd0\xae\xae\x7c\xa2\xbd\xda\x87\x2e\xd5\x6c\xc2\x96\x5b\x3f\x27\x57\x55\x8c\x07\x01\xb4\xeb\x7e\xcf\x58\x17\xf6\x00\xb8\x48\x3d\x2f\xb2\x95\x08\x87\x45\x35\x8b\x58\x91\xe1\x52\xa5\xf0\xc5\x8f\x8d\x56\x7a\x22\x2c\x79\xff\xdd\x76\xef\xfe\xe9\x89\x88\xd0\x3c\x28\x05\x69\x81\xd1\xd5\x5f\x82\xa6\xf6\xc7\xc1\xa0\x12\x5d\x8d\x83\xc1\x5d\x68\x4b\x54\xbf\x13\x7d\x7d\xc6\x76\x15\x92\x44\x5f\xbd\x4f\x80\x16\x99\x07\x4a\x64\xb4\x11\x5a\x77\x31\x62\x2b\x3d\xfe\x0a\x4d\xd2\x1c\x1f\x06\x82\x0d\x38\x31\xb0\x1f\x85\x17\x03\xcf\xd4\x02\x21\x7d\xdf\x05\xf9\x05\x0d\xeb\xfb\x84\xbf\x67\xc3\xfc\xa2\x88\xf4\x7b\x73\xe6\x75\xda\xdf\x6a\x78\x5f\x86\x4c\x8d\x87\x23\xae\xdf\x7b\xbc\x5f\x0e\x79\xd1\xb8\xbf\x02\x43\x39\xfe\xaf\x2b\xe8\xaf\xf8\x0e\xc1\x7f\x6d\x01\x74\xcd\x2b\x0a\x1e\x35\xb6\x98\x32\x89\x00\xa4\x68\xb0\xd2\xfb\x92\xf0\x34\x4a\x6d\xc9\x05\xc6\x15\x46\xb6\xdb\xae\x66\xa2\xc5\xca\x72\x23\x2d\xf1\x78\x3b\x33\x2d\x56\xfd\xcf\xb3\xd3\xaa\x8a\xc0\x7d\x71\xca\x3e\xb4\x67\x37\xd5\xa2\xb8\xfc\x0d\x6c\x89\x8d\xf2\xe3\x60\x22\x84\xc3\x71\x30\x59\x3c\xf6\x82\xc5\x45\xdc\x04\xe1\xb2\xca\xa4\x63\x7e\x5b\x83\x65\xb4\xb4\x85\x5a\x6e\x9b\xe5\xeb\x1c\xfb\x16\xa3\x65\xfa\xe7\x32\x5d\xa6\x7f\x4e\x03\x66\x0e\xb8\x59\x00\xae\x45\x68\x09\xf9\x75\x8b\x4d\x34\xff\x52\xc5\x32\x9a\x03\x6e\x69\x80\x9b\x4e\xc0\x4d\x2b\x60\x3b\xe4\x3c\x8d\x26\x23\xb8\x7a\xa9\xd1\x61\x79\xf9\x12\xfc\x26\xbe\xd0\xe7\x26\x79\x5e\x27\x8f\x80\x82\x0d\x8a\x98\x8a\xdf\xe8\x54\xd4\x7e\x43\x2f\x49\xeb\x3f\xfc\x80\x00\x9b\xdf\xd0\x73\xd4\x58\x59\xeb\x48\x33\x54\x7f\x81\x7e\x2b\x09\x77\x21\xcd\x3d\xb5\x05\x1f\x07\x13\xb0\x99\xdd\xce\x6b\x35\x8e\x30\x74\xba\x8b\x9e\xa3\x5a\x0b\x2d\xa3\xdf\xea\xac\xa7\xad\xa1\xd5\xdb\xc9\x88\xcf\x60\x2a\x2e\xc2\x90\xa7\xfb\x36\xa9\x91\x7d\x20\x28\xa1\x2d\x24\xa1\xd3\x35\x9c\x49\x20\xb6\x5e\x51\xdc\x6e\x1c\x7c\x11\x8d\x30\xaa\xc9\xfd\x64\xe1\x02\x5c\xb1\x46\xac\xc3\x22\x37\xb3\x78\x9f\x19\x67\x95\xa1\xde\xc1\x4e\x5e\xe1\xc9\xb7\xb7\xb3\x14\xac\x76\x21\x46\xff\x4d\x9b\x5a\xb2\x1d\x82\xda\xf5\xc8\x5b\x49\x75\x73\x4b\x51\x6b\xc1\xcd\x41\xd4\x13\x86\xf2\xe2\x8d\x30\x94\x9f\xcf\xf7\x8d\x12\x29\xbe\xc4\x69\x86\xdf\x49\x05\x8b\x57\xb6\xb8\x66\xdf\x15\x9f\x9d\xd4\x5d\x0a\xd4\xb6\x05\xf0\x3f\x9d\xff\x10\xf6\x43\x56\x28\xeb\x60\x29\xa7\x51\x1b\x3e\xe5\x0b\x9b\xd9\xe6\xff\x56\x3f\x43\x5b\xe8\xb7\x6a\xb1\x3a\x2d\x2c\xe5\xe0\x3c\x4e\x52\xfc\xd5\xb8\x8a\x04\xf2\x20\x0e\xc1\xcf\xb9\x98\xee\x88\xbc\x39\x1c\xce\xe3\x19\x52\x3b\x14\xc6\x77\x5b\x5b\x68\xd9\x9f\xc3\x93\x64\x0a\x93\x6b\xdf\x8a\x11\x5b\x45\x82\x54\xa4\xbd\xcc\xf0\xdb\x24\x99\x14\x4b\xc2\xd3\x71\xf0\xa4\x19\x55\x44\x0e\xed\xc6\x33\x98\x6c\xa2\x67\xdb\xaf\x7a\x3b\xbb\x7b\xaf\xf7\x0f\xfe\xf9\xe6\xed\xbb\xf7\x87\x1f\xfe\xef\xd1\xf1\xc9\xc7\x9f\x7e\xfe\xe5\x5f\xff\x13\xf4\x07\x21\x1e\x9e\x5f\x44\xbf\x7d\x1e\x8d\xe3\x64\xf2\xef\x34\xcb\xa7\x97\x57\xb3\xeb\xdf\x1b\x7e\xb3\xd5\xee\x74\xd7\xd6\x37\x96\x56\xb7\x58\x84\x5b\x71\xb4\x13\x8b\x76\x61\x54\x8b\x21\x76\x78\xa5\x14\x96\x1b\x8a\x85\xa9\x4d\x14\xd2\xda\xb1\xb9\xa9\x90\x99\x8e\x1c\xfb\x0d\x73\xec\xca\x88\x90\x24\x2d\x8f\x82\x9a\x64\x07\x16\xb4\x8c\xfc\xfa\x19\x78\xaf\x14\x02\x53\xd3\x24\x2e\x0e\xb4\x59\x05\x68\xfd\x8c\x6f\xf0\xb2\x18\x66\x81\x4a\x05\xa2\x58\x89\xdc\xf3\x85\x08\x33\x80\xfe\x17\xda\xa2\xec\x5b\x13\x97\x07\xef\x41\x6c\x88\x97\x96\x94\x0f\x82\x6c\xc5\x0f\x46\x91\x46\x6c\x49\x6b\x58\x84\x9b\x22\x77\x8f\x7e\xc8\x97\xf6\x88\x17\xce\xcc\x3e\x9d\xc7\xa3\xff\xe3\xd1\x5f\x1c\xfd\x3f\x9e\xec\x2d\xfb\x5d\xf4\x6a\xb7\xb2\x83\x96\xdf\x7d\xb5\x2b\xfb\x68\xf9\x5d\xf5\x09\xbe\xde\xde\x69\x8b\x22\xf3\xe7\x3a\x6e\x55\xc4\xe1\x1e\x9d\xb7\xfc\xae\xd3\x7b\xcb\xef\xfe\x0d\x34\x02\xd5\x0f\xeb\x30\x18\x77\x39\xab\xdb\xfd\xfd\xc1\x32\x2a\x09\xf1\x87\x24\x8a\x73\x97\x93\xb1\xdf\x75\x38\x19\x5b\x0f\xd3\x05\xa6\x6e\x2f\x63\xd1\x64\x55\x57\x63\x09\xe8\x1d\x4e\x50\x3a\x11\xdf\xc9\x59\x0d\x68\x73\xd1\xb5\xf1\x4d\x1f\xa3\xe8\xaa\x12\x2e\x6b\x7c\xf1\x2d\xe4\xb3\x06\x95\x16\xf3\x35\xe6\xb5\x84\x7c\xcb\x5f\x3c\xb4\xa7\xb1\xda\x70\x35\x47\x63\x1f\x64\x1f\x81\xa1\xea\x66\x4c\x44\xa0\x62\xb1\x34\xc9\x62\xd1\x82\xb0\xb9\x29\xdc\x25\xe5\x68\xa3\xf3\xbc\x7a\x28\x0c\x46\x96\x6f\x2b\xec\x61\xd2\x3e\xf5\xf6\xce\xfb\xd4\xdb\x6f\x60\x9f\xaa\x82\xc3\x7d\xef\x53\xd6\xe5\xf4\x76\xf7\x71\x9b\x12\x7f\xf7\xb6\x4d\x65\x57\xc1\x64\x37\x0e\xa3\x20\xae\x2d\xba\x63\xd9\x8e\xe4\xdf\xfe\x96\xf5\xf6\x61\xb6\xac\x2a\xcb\xe4\xdb\xdf\xb2\xde\xee\x6a\x9b\xd6\xe3\x8e\x65\xec\x58\xd2\x8a\x59\x68\xf3\xfa\xaa\xbb\x97\x98\x17\x09\x5b\x02\x48\xe9\x23\x8f\x86\x0f\x5f\xd8\xdd\x09\x5d\xdc\x8d\x06\xf9\x7f\xb8\x58\xa1\x1f\x49\xf7\xd9\x57\xfa\xad\x58\xfe\xf3\xd4\x05\x40\x58\x6e\x6d\x41\xf7\x4e\xda\x02\x96\xa3\xf6\x6b\x2a\x0d\x3c\x24\xbd\xca\x2e\x02\x5f\x7b\x75\x31\x0e\x06\x0f\xa8\x5a\xf0\x10\x6f\x16\x7e\x41\x6b\x7f\x07\x75\x83\x91\x2f\xf6\x16\xaa\x08\xc5\x88\x45\xfa\xf2\x6e\xa7\x03\x35\xc1\xe4\xe6\xdd\x4e\xc7\x26\xe3\x81\x89\xf3\x67\x7c\x4d\xb3\x60\x53\x3b\x58\xd1\x57\x70\xfe\x0d\xe2\x9c\x27\xf1\x4e\xd2\x31\xb5\xd1\xde\xfd\xe9\xc3\x27\xd8\x74\x4f\x92\x37\xb8\x10\x06\xd1\xd5\xd5\xd5\x4a\x32\xc1\x71\x96\x8d\x56\x92\xf4\x7c\x35\x4c\x06\xd9\x2a\x24\xe1\x4e\x56\xb5\x3a\x17\xf9\x78\x64\x51\x84\xec\x5e\x4e\xde\xec\xec\x15\x68\x8b\xe7\x8a\xc1\x10\xe6\xfb\x80\x68\x7b\x9c\xe1\xfd\xc2\x52\x9e\xc3\x1e\x45\x06\x26\x23\x0f\x51\xcc\xdd\x5e\xa4\x70\xcf\x85\xab\x4b\x1b\xd5\xfc\xe6\xba\xe2\xe9\x62\xc0\x77\x18\xa9\xc9\x61\x31\xf4\x04\x29\xef\x76\x3a\xf3\xb0\x8d\x72\x66\x8b\xac\x07\xa9\x96\x3e\xe4\x09\x9a\x50\xab\x53\xd9\x3b\xc7\xb1\xc3\x19\x7e\x31\xda\xee\xc0\x86\x67\x13\xf9\xcd\x75\x30\x21\x55\xbe\xd2\xce\x01\xe6\xda\x97\x02\x1f\xa5\xed\x9b\x5b\xbb\xdd\x38\x88\xf6\xa1\xfd\x70\xb0\xd4\xe8\x3d\x98\x59\x7f\x0e\x87\x86\xf7\x0d\xa5\xf9\x39\x29\x9a\xe6\x57\xfc\xa3\x98\xab\x75\x2d\x9f\xdf\x6d\xc1\x78\xea\x34\x36\x1a\x0d\x1d\xf0\x82\xde\x41\x73\xfd\x7e\xaa\xc9\xbb\x3b\x90\xc2\x9f\xd0\x08\xa1\x0a\x48\x84\x1d\x40\x06\x56\xb2\x68\x6f\x63\xa5\xcf\xeb\xd2\x58\x00\x36\x40\x25\x95\xb3\x60\x94\xa3\x6d\xf8\xcf\xe2\x62\x31\x50\x17\x25\xef\xfb\x20\x2f\x4c\x36\x8f\xcf\xe1\x70\x85\xba\x45\xe0\x1a\xef\x8c\x07\xf8\x95\xe4\xad\x81\xe2\x4a\x7e\x47\xb5\xe6\x42\x02\xaf\x3a\xc5\x16\xf1\x96\xac\x74\xc6\x3d\xcc\xda\xc2\x4b\x8d\x90\x07\x33\x51\x2e\x56\x87\x15\x96\xcb\x2d\x0c\x42\x0b\xd0\x21\x7e\x03\x63\x63\x4b\x89\xb6\xc8\x19\xb9\x00\x26\x7c\x82\xc5\x1b\xe7\x71\x99\xef\x31\xb4\x47\xec\xc9\x52\x4e\x62\xe2\xb4\x68\xf1\xc2\x82\xe5\x6b\xb6\x31\x11\xf0\xea\x47\x66\xcc\xa2\xe1\xca\x0d\x5a\x5e\x72\x7c\xac\x47\x01\x22\xc6\x81\xe7\x80\xf3\x82\x59\x75\x59\xa2\x65\xe7\x5f\x2b\x23\x39\x18\x43\xe1\x04\xc2\xa0\x70\x62\x93\x8c\x82\x0d\x7a\x55\x9b\x17\xfe\x74\x66\x09\x42\x13\x62\xe0\xcc\xcf\xca\x41\xc9\xa7\x07\x25\x69\xa0\x4b\xd3\xfe\x68\xd8\x0b\x64\x9d\xa3\x60\xc3\xd8\x32\x54\xe6\x3b\x89\xac\x58\xcc\x18\x6b\x1b\xda\x28\x4b\xb5\x24\x1d\x0d\xa7\x3f\x4b\xb4\x0b\x11\x60\x8e\xd7\xab\x6a\x73\x5d\x89\x07\xcb\x7e\xc7\xb7\xe2\xbd\x0b\xf2\xdd\x7b\xf4\xbe\xb5\xf8\x95\x49\xbd\xa9\xce\xcd\xa5\x4a\x8a\x76\x43\x7a\xaf\x72\xf7\xe2\x03\x52\xb8\xba\xd8\xb4\xe9\x7e\xed\xe2\xec\x8b\x55\xf3\x90\x43\x6c\xb8\x0b\x98\x52\xb1\x41\xa8\x90\x0b\x59\xdf\xb5\xe7\x98\x2e\x2c\x6c\xd8\x55\x89\x05\x1c\x57\xca\xf7\xbb\x9b\x17\x25\xc7\x77\x0a\xcd\x7e\x76\xf7\xf8\xe1\x73\xb3\xb3\xee\xf1\x23\xe9\xe6\xda\x1a\x39\xd3\xaf\xfd\xa5\xcf\xf4\x83\x68\x72\x81\xd3\xe5\x07\x36\x11\x80\xd3\xbb\xdc\xd4\x9f\x73\x88\x37\x33\x77\xde\xcb\x69\xbe\x07\x1d\xfb\x40\x38\x4e\x26\x0e\xed\xf2\x4b\xb7\x09\x81\x78\xaf\x65\xc2\x50\x6a\x90\x33\x5c\x90\x43\x25\xfa\x93\x33\x62\x56\x71\x0f\x5e\xe6\x2c\xaa\x02\x2d\xb2\x40\x3a\x0d\x72\xba\xa1\x73\x93\xe3\x59\x4e\x4e\x91\x01\x7b\x46\x13\xda\x27\xe6\x9b\xc5\x53\x6d\x04\x21\x1e\x44\xe3\x60\x34\xba\x66\x69\x40\xc3\xca\x37\x37\xf2\xa8\xdc\xb0\x56\xd8\xc0\x9d\x08\x34\xd4\x66\x17\x4f\xc6\x71\x1b\xfc\x1e\x34\x3d\x47\x31\x25\xd2\xad\x8e\xdc\xf9\xc5\x2e\x76\x94\x9a\x0e\x47\x2d\xb9\xcc\x4a\x31\xbb\x45\x02\x89\x7d\x3c\xbb\x65\x26\x08\xcb\xf0\x4a\xe4\x23\xdf\x37\x2c\x38\x9d\xda\xcd\x43\x14\x4f\xa6\xf9\x5d\xe6\x94\x93\x87\x4a\x74\xb7\xa0\xb3\xfb\x22\x8e\x81\xc6\x28\x2c\xf4\x71\xeb\xa4\x12\x30\x5a\xf6\x10\x36\xc5\xe4\x6c\xa1\xa2\x0d\x5a\xe1\x85\x95\x7a\x7a\x0a\xf5\x70\x8d\x40\x01\x68\x53\x06\x7a\x63\xd7\xcd\xbb\x77\xda\xa2\xbb\xda\x6e\x2b\x6d\x10\x9b\x9d\xa6\xa7\x29\xcf\xd7\x1f\x4d\xed\xfe\xee\xba\x6f\xd7\xee\x68\x44\x32\x2f\xd3\x84\x9b\x87\x14\x70\x00\x16\x1a\x57\x6b\x22\x2a\x52\x62\x4b\x76\x54\xbd\x9f\x84\xf4\xe0\xf2\x3a\x97\xe3\x55\x56\x12\x57\x54\x45\x11\x59\x1d\x9c\x97\xf1\x20\xc5\xf9\x3d\x29\x95\x88\xfc\xbb\x6f\x0f\x1c\x04\xbd\x64\x6c\xc2\xe6\x89\x4c\x1d\x7d\xab\x6a\x0c\x65\xe7\x60\x47\x80\x60\xab\xce\x48\xe8\x8b\xa8\x8f\x82\x78\xd4\x3d\xdc\x4b\xbc\xdd\xee\x33\xbe\x2c\x1c\x98\xe6\x84\x97\xa5\x87\x2a\x29\xba\xac\x3e\x4e\x76\x43\xfc\x12\xc5\x14\xed\xe8\x2b\x29\x2e\x26\xeb\x7a\x59\x64\x4c\xad\x12\xd7\x17\xe8\xb0\xec\x51\x32\xb7\x47\xa3\xe4\x0a\x05\x69\x3f\xca\xd3\x20\xbd\x46\x4c\xbd\xf4\x19\x5f\x5b\xe2\x0e\x7e\x96\x35\x12\x3f\x5a\x1b\x2e\x19\x28\x5d\xdd\x52\x6d\xb4\xe6\x38\x43\x12\x94\x4a\xdc\x20\x21\xfe\x1b\xe8\x36\x92\x14\x45\x71\x8c\x53\x88\x3e\x9b\x4c\x73\x10\x20\xf4\x28\x7c\x10\x33\x91\xea\x18\x29\x19\xb2\x07\xda\x8a\x11\x90\x8e\x6b\xfc\xe4\x1a\x91\xa5\xc6\x22\x24\x90\x48\x5a\xc9\xa4\x4c\x1f\x19\x49\x05\x23\xa9\xa0\xd1\xd8\x2f\x87\x47\x30\x9f\xf4\x1a\x70\x12\x84\x68\x90\xc4\x59\x1e\xc4\x7a\xf3\xd6\x24\x52\xea\x1c\xbb\x15\x6b\x02\xef\xd3\xe8\x0c\xfd\xba\x85\x1a\xb3\xce\x80\xfe\xcf\xe6\x0e\x63\x14\x6e\x75\xe9\xff\xca\x35\x63\x89\xa6\x13\x8b\xb4\x67\x1b\x45\xfe\x09\x71\xc8\x60\x07\x7a\x88\x28\x64\x82\x89\xdf\x4b\x24\xb2\x92\x7c\x65\x36\x66\x6c\x19\x48\xe8\xb4\x8d\x8f\x3b\xf4\xa4\xaa\xbe\xb8\x58\x30\xb7\x8b\x40\x06\xc3\xfc\xcd\xc4\x1f\x7b\xb7\xdd\x63\xd1\xc7\x00\xaf\x08\x96\x58\x69\x24\x94\x05\xa7\xbc\x4a\x20\x32\xa3\xf4\xfd\x07\x23\x93\x49\x82\xb7\x32\x37\xf8\xd8\x43\x45\x0f\x83\xa1\xfe\x4f\x8f\x1e\x36\x47\x4c\x5d\x44\x44\x24\x3c\xb4\xa0\xa1\xb9\x11\xc4\xdc\x35\xe6\x46\x11\x73\x57\x7d\xa0\x48\x62\x77\xe7\x76\x3d\xaa\x9e\x86\xf1\xb6\xec\xc7\x44\xba\xd8\xb7\x07\x47\x2b\x0d\x38\x56\xca\x31\xe5\xb1\xd2\x80\x16\x12\x0a\x97\x34\xf8\x25\x93\x40\xa5\xee\x0c\x39\x36\x0e\x06\xf6\x4b\x22\x71\xf0\x77\x18\xc1\x6d\xfc\xa5\x15\xe6\xb3\x6e\x7b\xd9\xf2\x7a\x14\xf5\x97\x09\x2a\x21\xd8\xb6\x66\xda\x57\x1c\x0f\x96\xc1\xa6\xd1\xf2\x9e\xba\x59\x6a\x1f\xc6\x61\x67\xbe\xf1\x5d\x76\x11\x34\x3b\x3a\x48\xf2\xb2\xa9\x83\xcb\x2e\x82\x8e\xdf\x34\x5f\xb6\xd6\x2d\x25\x5b\xda\xab\x34\x9a\xe0\x71\xe8\x77\x1b\x56\xdb\x3f\xe5\xd5\xa4\xff\x39\x1c\xea\xed\xe0\xcb\xc9\xe7\x70\x58\x76\xef\xa0\x76\x3d\x09\xf1\xf2\x60\xd8\xb7\xbe\xce\x53\xc7\xeb\xe5\xf3\x51\x10\x8e\x83\xd8\xf6\x39\xb1\x03\xc3\x03\xfd\xf5\x24\x08\x97\x83\x38\x8b\x66\x1b\x4d\x7d\x10\xc8\xa7\x28\x4b\xfc\x86\xdf\xd4\x47\x9c\x7d\xda\x58\xdb\x58\xd3\x67\x88\x7c\xfa\x1d\xa7\x09\x73\xbd\xb6\x7c\x8d\x1d\xdf\xa8\x8e\x6c\xf9\x02\xcf\xb4\x0f\x01\xd6\x89\x8b\xc6\xdd\x08\x8d\xf7\xe9\x40\x9f\xdc\x34\xe8\xf7\xa3\xdc\xfa\x72\x79\x84\xcf\x83\xc1\xf5\x43\xdf\x01\x89\xd5\x03\x4f\xfa\xa2\x81\x97\xc5\x5a\x11\x8f\x6c\x89\xc0\x33\x59\x19\x9a\x59\x28\x5b\x07\xe2\x77\xb3\x2d\x7e\x13\xaa\xe7\xbf\x09\xb1\x8b\xdf\xf4\x57\x41\xda\x85\x7d\x29\xfc\x62\x84\x4c\x31\xa0\xf4\x6b\xdc\x61\x51\x74\x38\xb5\x4a\x4f\x79\xaa\x3e\x09\xda\x2c\xde\x26\x4a\x0d\x42\x89\xb4\x59\x99\x00\xc5\x1b\x41\x77\xf2\x1b\x4a\x6e\xe2\x8d\x4c\x65\xe2\x65\xac\xbe\x92\x68\x0a\x9e\x09\x29\xc1\x8f\x82\x82\xe8\xa8\x0c\xd8\x40\x31\x7a\x91\x7e\x73\x32\x59\x54\x11\xa9\x28\x20\x65\x5e\xbb\xb8\x62\xd2\x1d\x8a\x8d\x75\x69\xb3\xe3\x7b\xe5\xda\x64\x4f\xa5\xab\xcd\x4e\xdb\x53\x08\x6f\xb3\xd3\xf1\x8a\x89\xdf\xec\x74\x3d\x75\xf4\x36\x3b\x6b\xfa\x8d\xb0\x4e\xca\x9b\xdd\x86\xc7\xa8\x75\xb3\x0b\xf8\x08\x4a\xd9\xec\x36\x3d\x99\x56\x36\xbb\x6d\xcf\x46\x2d\x9b\xdd\x96\x27\x53\xc8\x66\xb7\xe3\xc9\xf4\xb3\xd9\x05\xbc\x14\x9a\xd9\xec\xae\x79\x3a\xd5\x6c\x76\xd7\x3d\x9d\x6e\x36\xbb\x1b\x9e\x41\x24\x9b\x6b\x0d\xcf\x42\x4e\x9b\x6b\x80\x3f\x5b\x12\x9b\x6b\x80\x3d\x23\x8d\xcd\xb5\xb6\x67\x10\xc7\xe6\x1a\x20\x4e\xc8\x68\x73\x0d\x70\x2e\xd6\xd9\xe6\x5a\x57\xbe\x40\xf7\x8a\x25\xbb\xb9\xc6\xaf\xd6\xc9\x62\xde\x5c\xdb\xf0\xf8\x52\xdd\x5c\x6f\x78\xc5\x12\xde\x5c\xf7\xbd\x62\x71\x6f\xae\x03\x3a\x05\x05\x6f\xae\x43\xe3\x82\xd1\x6c\xae\xb7\x6f\xce\xbc\x6e\xe3\xf1\xf2\xe0\xcf\xbf\x3c\xe8\x5d\xe0\xc1\x67\xd2\x29\x58\x29\xd4\x0d\x88\xa6\x39\xcb\xa6\x13\x32\x30\x98\xc5\xa7\x96\xfa\x0d\x72\x3c\x0d\x69\x8e\xbe\xdb\x42\xcf\x38\xe4\x67\x16\x8b\x10\xe1\xa4\x71\x8f\xd7\x15\xa5\xe6\xf8\xa2\x9d\x23\x3c\xc4\x29\x86\x83\x5e\x1a\x9d\xc3\x99\x2c\x8a\xa3\xbc\x00\x93\x4d\x27\x38\x05\xd5\xf5\x96\x96\x9e\x43\x82\xb2\x3d\x3d\x1f\xe3\x38\xd7\x0a\xa0\x3c\x41\x17\x41\x1c\x8e\xb0\x32\x6e\x32\xec\xbe\x15\xb2\x62\x53\x03\x55\x4d\x77\x40\x49\xf7\x4d\x63\xc9\x53\x13\xa8\x28\xce\xd7\x25\x0d\xfd\x50\xae\x2f\x14\x13\xea\xec\x98\xc7\xfc\xa2\x06\x55\xc2\x7f\x24\x50\xe1\x85\x8c\x8d\x72\x88\xb0\x22\x96\xd0\xf4\x5f\x00\xe9\x32\xc2\x57\x2e\x14\x9d\xcd\x4b\x08\x1f\x70\x14\xd0\x97\x2f\x6a\x79\x4e\x70\x80\x25\xe8\x8c\x79\xf5\xef\xc8\x9a\x13\xb6\x23\xb0\xe8\xec\xc0\x8d\xaa\x75\xa3\x15\x27\x56\x7e\xd7\x8e\x96\xbb\xa5\xc5\x6a\x1c\xc4\x79\xab\xb9\x68\x13\x8b\xd5\xd8\x1b\x25\xc1\x6d\xaa\x74\xdb\xf0\xbe\x28\x7f\x4b\x52\x5a\xa1\x14\xec\x21\xf9\xd5\x75\x8e\x0f\x21\x39\x90\xf1\xda\x96\x77\x59\xa1\xbf\x7d\xba\xe8\x8a\xb6\xaa\xac\x88\xa2\xf4\x62\x2a\x84\x02\xda\x2b\x81\x1b\xda\xb2\xe3\x6c\xd1\x2c\xec\xce\x58\xf6\xd5\xeb\xdc\x66\xfc\xbc\x90\xbb\xa0\x0d\x95\x45\xf2\x69\x17\xf5\x4f\xa3\xb3\x5b\x25\xcf\x2e\xcc\xb9\xa3\xdf\x31\x55\xd5\x16\x8e\xa3\x6a\x51\xc1\x58\x8b\xd4\x16\x1e\x62\x6e\x84\xb6\x8e\x28\xf3\x6d\xcd\x7a\x46\x46\x93\xbc\x26\xf0\x50\x4c\xa4\x3e\x99\x99\x9b\xed\x06\x93\xc9\xe8\x9a\x35\x1c\xa4\xe7\x53\xc2\xc2\xb3\x32\x7f\x45\xc6\xaf\x57\x26\x69\x92\x27\x04\x47\x99\x73\x97\x19\x4e\xe8\xbb\x8f\x5d\xc1\xd2\xf5\x1f\x65\x9d\x3f\x47\xd6\x81\x80\xd1\x7f\x42\x5c\x22\x6b\x4e\xa5\x0a\x26\x12\xb0\xc5\xd2\x7b\x3c\x94\x17\xba\x75\x52\xe5\x84\x31\x0b\xa9\x24\x55\x5d\x6a\x37\x7f\x36\x49\xcf\xc5\x57\xba\x6d\x3b\x17\x39\x21\x6c\x62\x8b\x0e\xdf\x4a\xd0\xcf\xe8\x8f\x2c\x8a\x59\x30\x56\xc2\x32\x1a\x33\xbf\xc1\xfe\xea\xe8\x8b\x9a\xc6\x97\x2d\xaf\x5a\xdd\x6a\xa1\xfe\x6e\xa7\xa3\x59\x53\xd8\x0c\x40\x74\xaf\x49\xb4\xc5\x46\xd5\x62\x00\xc2\xd3\xde\x94\xde\x8e\x15\x9a\x60\x7b\xae\xe2\x53\x93\x93\x36\x66\xdd\xb5\x76\xa7\xd9\x6a\xf8\x1e\x6a\xcc\xf0\x70\x10\x06\xfd\xf5\x0d\x4b\x5e\xc5\xc6\x6c\x63\xbd\x1f\x84\x83\x21\xf6\x60\x60\x5a\xcd\x4e\x7b\xad\xab\x96\x3b\x73\xde\x88\x69\x69\xf4\xe4\x5e\xbc\x13\x99\xf4\x6c\x7b\xd7\x55\x30\x41\x18\xdc\xab\xe7\xef\x21\x7e\xd7\xbd\x63\xb8\xaf\xaf\xf9\x6c\x50\x24\x3e\x11\x78\x3c\xbd\x20\x8a\x1c\x11\x78\xdf\x7d\x92\x4a\xbf\x3b\xe5\x0f\x67\x36\x97\x10\xe9\x33\x21\x38\xb3\x00\xf9\xab\xd5\x6a\x12\x4c\xea\x29\x8e\xbe\x20\xf9\x25\xec\x75\xed\xba\xe6\x23\x8e\xbe\x54\x04\xd8\x6c\xd7\x2d\x00\x21\x94\xb1\xe2\x92\x6e\x82\xbb\x9b\x71\xc8\xbe\x72\x43\x61\xbf\xee\x57\x86\xb4\x81\xa4\x31\x45\x4b\xa8\xa1\x8b\x0f\x4a\x69\x5f\x2b\xed\x97\x96\x6e\x6a\xa5\x9b\xa5\xa5\x5b\x5a\xe9\x56\x69\xe9\xb6\x56\xba\x5d\x5a\xba\xa3\x95\xee\x94\x96\xee\x6a\xa5\xbb\xa5\xa5\xd7\xb4\xd2\x6b\xa5\xa5\xd7\xb5\xd2\xeb\xa5\xa5\x37\xb4\xd2\x1b\xe5\xb3\xd3\xd0\x66\x67\xce\x64\xfa\x5a\xf1\xf2\xd9\xf4\x9b\x5a\xf1\xf2\xe9\xf4\x5b\x5a\xf1\xf2\xf9\xf4\xdb\x5a\xf1\xf2\x09\xf5\x3b\x5a\xf1\x8e\xc1\x0d\x56\x57\x09\x43\xfe\x1c\xc5\xe7\xa4\x6a\x14\x8c\xfa\x36\xb1\x39\x20\xdb\xc0\xa9\x75\xa0\xfa\xf0\xc9\x3a\x28\x03\xf8\x64\x1d\x80\x10\x3e\xb5\x6c\xe8\xf4\x8a\x3b\x68\xf5\x1b\x41\x62\x6f\xaf\x16\x78\xa8\xef\xa1\x81\x87\x42\x4f\x5a\xa0\x1e\x42\x6b\x1e\xd9\x42\x1b\x67\x3a\x6f\x08\x69\xbd\xd0\x43\xa2\x6a\x31\x42\x1e\x42\x7e\xd3\x43\x27\xa7\xbe\x51\x6f\x40\xeb\xd1\x96\x68\xd5\x62\xd1\x92\x7a\x6b\xa4\x5e\xd3\xa8\xd7\xa7\xf5\x04\x92\x81\x54\xaf\xe5\x21\xd4\x84\xf6\x5a\x46\xbd\xb2\xfe\xb5\x45\xff\xda\x0b\xf5\xaf\x23\xfa\xd7\x59\xa8\x7f\x5d\xd1\xbf\xee\x42\xfd\x5b\x13\xfd\x5b\x5b\xa8\x7f\xeb\xa2\x7f\xeb\x0b\xf5\x6f\x43\xf4\x6f\x63\xa1\xfe\xf9\x0d\x8f\xf5\xcf\x37\x09\xa6\xac\x83\xbe\xef\xb1\x0e\xfa\x26\xc5\x94\xf5\x90\x60\x49\x7b\xe8\x9b\x24\x53\x4a\xa2\x2d\x8f\x93\xa8\x49\x33\xa5\x7d\x6c\x8b\x3e\x9a\x44\x53\xda\xc7\x8e\xe8\x23\x50\x8d\xd9\xc9\xd7\xaf\x1d\x9d\xf4\x10\xea\xd0\x4e\x9a\x74\x13\xd2\x8a\xd6\x4e\x12\x7a\xdb\xa0\x15\x4d\xc2\x19\xd0\x8a\xf6\x4e\xfa\x1e\x22\x1d\x3d\x39\xf5\x4d\xca\xe9\xd3\x8a\xd6\x4e\x12\x8e\xd1\x6c\x40\x45\x93\x74\xca\xfa\xd8\x11\x7d\x6c\xda\x79\x8d\xab\x8f\x84\xe6\x68\x1f\x9b\x76\x66\xe3\xec\x63\x87\xf7\xb1\x69\xe7\x36\xae\x3e\xb6\x45\x1f\x9b\x76\x76\xe3\xea\xe3\x46\xd1\x47\x3b\xbf\x71\xf6\xb1\x2d\xfa\x68\x67\x38\xae\x3e\x12\xc6\xc8\xfa\x68\xe7\x38\xae\x3e\xae\x17\x7d\xb4\xb3\x1c\x27\xad\xb6\x3c\xde\x47\x3b\xcf\x71\xf5\xb1\x29\x68\xb5\x69\x67\x3a\xae\x3e\xae\x89\x3e\xb6\xec\x4c\xc7\xd5\x47\xb2\xfc\x69\x1f\x5b\xbe\x7d\x41\xee\xef\xbb\x89\xb5\x0d\xb8\xb6\xec\x5c\x67\x7f\xdf\xde\x49\x32\xac\x64\x6d\x9d\x9c\xb6\xec\x5c\x67\x7f\xbf\x64\x41\x76\xa1\xa2\x9d\xeb\xec\xef\x3b\x3a\xd9\xf6\x50\xb3\x05\x15\x4d\xd2\x29\xeb\xa3\x5f\xf4\xd1\xce\x74\x5c\x7d\x6c\x17\x7d\xb4\x33\x1d\x57\x1f\x61\x22\x69\x1f\xed\x4c\xc7\xd9\xc7\x86\xe8\xa3\x9d\xe9\x38\xfb\xd8\xf2\x58\x1f\xdb\x76\xa6\xe3\xea\x63\x43\xf4\xb1\x6d\x67\x3a\xae\x3e\xb6\x44\x1f\xdb\x76\xa6\xe3\xea\x23\x61\xe5\xb4\x8f\x6d\x3b\xd3\x71\xf5\x71\x43\xcc\x63\xdb\xce\x74\x5c\x7d\x24\xcb\x83\xf5\xd1\xce\x74\x9c\xb4\xda\xe1\xb4\xda\xb6\x33\x1d\x57\x1f\x9b\x45\x1f\xd7\xec\x0b\xf2\xe0\xc0\x2d\xa8\x76\x69\x27\xed\x5c\xe7\xe0\xc0\xde\x49\xa0\x39\xe0\x01\x6d\x3b\xd7\x39\x38\x28\x11\x03\x3a\x20\x02\xda\xb9\xce\xc1\x81\xbd\x93\x84\x77\x34\x61\x58\x3b\x76\x51\xc7\xd5\x47\x32\x1f\xb4\x8f\x1d\x3b\xd3\x71\xf5\xb1\x25\xfa\xd8\xb1\x33\x1d\x67\x1f\x1b\xa2\x8f\x76\xa6\xe3\xea\xa3\x5f\xf4\xd1\xce\x74\x5c\x7d\x5c\x17\xf3\xd8\xb1\x33\x1d\x57\x1f\x81\xe6\x68\x1f\xed\x4c\xc7\xd5\x47\x10\xc9\x69\x1f\xed\x4c\xc7\xd9\xc7\x96\xc7\xfb\x68\x67\x3a\xae\x3e\xb6\x45\x1f\xbb\x76\xa6\xe3\xec\xa3\xcf\xfb\xd8\xb5\x33\x1d\x57\x1f\x9b\xa2\x8f\x5d\x3b\xd3\x71\xf5\x71\x43\xcc\x63\xb7\x65\x2e\x48\xb8\x46\xc9\x71\x3a\xc6\x61\x14\xe4\xcc\xa9\x0c\xdc\x15\xd4\x72\xe4\x88\x8b\xb6\x50\x0d\xfe\xbb\x84\x02\x5d\xc3\x4a\xcb\xf8\xac\x8c\x4f\xca\xf4\xed\x65\x9a\xac\x4c\x93\x94\x19\xd8\xcb\xb4\x58\x99\x16\x29\x13\x1a\xda\x5c\x4d\x55\xb9\x67\xb1\xd4\x5d\x30\xa0\x2d\x64\x4a\x17\xd9\x74\x83\x3c\xb0\x1d\xcc\x83\x3c\x10\xa1\x7c\x82\x3c\x70\x2b\xc7\xe2\x57\x51\x9e\x9d\x24\x79\x30\x12\x30\xe3\x9d\x20\x0f\xa8\x07\xc9\x73\xb4\x6e\x81\x0e\x75\xde\xe2\x61\xce\xa1\x0b\x8f\x13\x28\x6f\x74\xc6\x99\xf2\x4a\xa0\x79\x5a\x80\xfc\xf1\xc7\x1f\x51\x07\x2e\xde\x1a\xb3\xf5\x46\x71\xdf\x56\x94\xf8\x07\x6a\x35\x0d\xe2\x50\xfb\xb2\x8f\xb6\x10\xa8\xdd\x87\xa3\x24\x49\x6b\x52\x27\x57\x15\xdd\xbb\xab\x73\x50\xf6\x2d\xda\x92\x9e\xf4\x85\x23\x50\xaf\xd5\x6a\x05\x6e\x4b\xa8\xdb\xa6\xf9\xd2\x36\x20\x98\x68\xbb\x4e\x15\x36\x76\xfd\x2c\xaf\xca\x70\x2e\x94\xb3\xf2\xdb\xea\xda\x59\x13\x1c\x53\xcd\xea\xe0\xe6\xe9\x66\x0d\x2e\xb1\x48\x67\xdb\x55\x3a\xfb\xd6\xda\xd9\xb7\xb7\xed\xec\x5b\x6b\x67\xdf\x56\xed\xac\xd9\x5b\xd9\x89\xaa\x26\xba\xcf\x83\x4d\x41\x4e\x3d\xbb\xff\x20\x18\xbc\x53\x37\x06\xf0\x51\xb4\x79\x52\x95\xe6\x95\x9f\xe3\x0d\xa9\xe8\xbc\x2d\xe4\xbb\xcf\x0c\xe3\x9d\xde\x6f\x0b\xdd\x7b\x38\xae\xb8\x50\xd9\xf5\xbf\xc0\x04\xae\x30\xf6\x4f\xed\x77\x17\xfb\xec\x96\xac\x56\xdb\x57\xae\x25\xf6\x17\xbe\x8f\xa0\xb4\xb0\xaf\xdc\x45\xec\x3b\x2f\x21\xe6\xdf\x38\x1c\xb1\xdc\xc0\x30\x87\x2c\x02\x4f\x08\x63\xaa\x16\xad\x90\xac\x1c\xdc\x10\x4a\x59\x3d\x28\x58\xc1\x29\x53\xdc\xd0\xc1\x63\x71\xfd\x6f\x6c\xbc\xf0\xf9\x93\x41\x0b\x2e\xef\x4a\x1e\x41\x83\x7c\xb5\x7b\x38\xd0\x5f\x02\x49\x4d\xf5\x35\xf3\x50\xe6\x21\xf5\x0a\x0d\xf8\x24\xda\x42\x01\x5a\x42\xb5\x5a\x1f\xfd\x40\x37\xc7\xda\xff\x92\x9f\x61\x9d\xb0\x81\x19\x5a\x42\xb9\xd4\x9e\x08\x58\x1c\x93\x69\xca\xe8\x4a\xa5\x71\xca\x5b\x4d\xb4\x8c\xb2\x3a\x54\xeb\x6b\x46\x6f\x02\x2b\xed\xfc\x5f\x0d\x2b\xd8\x8e\x6b\x03\xf4\x03\xfa\xdf\x87\xc1\x4a\x3b\x04\xcd\xc5\xaa\x8f\x7e\x45\x03\xf4\x2b\x41\xec\xfe\x91\xd1\x04\xc0\xb9\xc8\x10\x44\x6a\x7d\xf4\xe5\x9e\x07\x47\xbe\xad\x3e\x76\xa5\x49\x9f\x9b\x78\xbf\x4a\x90\x35\xee\x27\xa6\xb9\x28\xc2\x6a\x30\xc1\x38\x9c\xc5\x1c\xa5\x6f\x1b\xd6\x8c\xad\x4b\x61\xe4\xf2\x6e\xa7\x63\xf1\xfd\x2a\x2f\x6f\x3a\x7c\x15\xf1\xc5\x94\xcb\x7c\x35\x23\xff\xbb\x9d\x8e\xd5\x64\xc0\x39\x09\x73\x72\xd5\xdf\xd7\x14\xdc\x2a\xb4\xc3\xfc\x89\x93\xbd\xfc\xee\x63\xe2\xa8\x53\x99\x98\x88\xfd\x71\x30\x20\x93\xa1\x64\x86\x37\xe7\x83\x15\x33\xe7\xa4\xc8\x66\x4f\xe7\xa5\x34\x03\x3b\x8b\x6c\xed\xb0\x80\x6a\xfe\xa5\x5d\xcc\xfe\xfe\x31\xd9\xe8\x62\x7b\xce\xe2\x0c\xa1\x3d\x8c\xc3\x7e\x30\xf8\xcc\xe2\x6a\x8e\x93\x10\x96\x14\xa1\x19\x31\xdf\xf0\xb2\xb7\xf7\x8a\x88\x40\x16\xf1\x00\xcc\x9c\xe0\xab\x62\x2d\x07\x16\x2e\xb4\x95\x77\x04\x00\x33\xe6\x11\xab\xbe\xb7\xf7\x6a\x65\x37\xa6\xb1\xca\xc1\x80\x6a\xef\x95\xc5\xe0\x67\xe2\x30\x97\x61\x66\x86\x25\x26\x33\x6e\xd1\x94\x85\xa0\xe2\x02\x09\x7d\xb4\xdd\x33\x4b\xa1\x3c\x68\x21\x39\x94\x87\x5a\x9e\xc7\x28\x7f\x83\xaf\xb3\x3c\xc5\xc1\x78\x3b\x0e\x59\xef\x2c\xd6\x91\x09\x33\x8b\x15\xe0\x3c\xd6\x80\x4d\xc8\x3e\xc2\x63\x0c\x41\xc6\xc1\x18\x93\xce\x13\x8b\x95\x09\xfe\xf3\x31\x9e\xe5\xf4\xb5\x5d\x7c\xc7\x97\xaf\x58\xcc\x54\x68\x7d\x25\x1b\x45\x03\x5c\xe3\x28\x88\x9b\x7a\x81\x8b\xcd\x7e\x52\x99\xb5\x1d\xfc\x77\x99\xb5\x3b\x8c\x2e\x18\x0e\x5f\x44\xd9\xc2\x63\xfb\xd5\xe8\xe6\xa4\xe8\x50\x1f\x0f\x92\x31\xf3\xba\x27\x04\x11\x25\xd3\xac\x1a\xc9\x88\x2e\x56\x12\xc7\x4b\x7a\x53\x9b\xdb\x05\xcd\x37\xc2\x3c\xb0\xc1\x79\xef\xb2\x08\xd6\x72\xf9\x42\x35\x1a\x97\xc3\x31\xd3\xe6\x8b\xcf\x90\xd9\xf5\xd2\x7a\xa4\x11\xa5\xd1\x16\x8a\x2e\xd9\x14\x36\x1c\x2b\x31\xb9\xc4\xe8\xe0\x27\x38\x7f\x66\xd3\x7e\x86\xff\x3d\xc5\x71\x5e\x72\x7a\x06\x7c\x85\x03\xc3\x5c\x03\x68\x1d\x1f\x6d\x42\xcc\x49\x20\x7f\x8c\xca\x31\x1d\x68\x28\x58\x13\x40\x3c\xa4\x76\x65\x75\x15\xb1\x19\x29\xde\x59\xb3\xe5\x96\x47\x8d\xa1\xa6\xe7\x85\x85\x20\x44\x82\x11\x8d\xc2\x39\xda\xa0\x17\x86\x05\x17\x27\xf6\x5e\x95\x19\x5c\xf3\x4d\x67\x91\x38\x75\xdd\xd6\xa3\xf0\xf1\xad\x0b\x1f\xe8\xbf\x27\x29\xce\x70\x7a\x89\xa9\x18\x92\x4c\x89\x28\x2f\x89\x1f\xa0\xc6\x08\xf2\xa8\x3f\x62\x1c\x18\xed\xa4\xe8\x55\x1a\x05\x31\x7a\x4d\xdd\x33\xd1\x30\x1a\x61\x1c\x0f\x56\x06\x00\x82\x87\x7c\x86\x08\xd8\x1a\xfd\x9c\x1c\x41\x91\x7f\x06\x31\xda\x4f\xa7\xfd\x6b\xf4\xdb\x05\xf9\xcf\xca\x15\xee\xff\xf7\xf9\x38\x88\x46\x2b\x83\x64\x6c\x97\x77\x4e\x8e\x78\x73\x25\x62\x8f\x5c\xa8\xb2\xf4\xf3\xa4\xc8\xf7\x12\x0f\xc8\x41\x81\xa6\x4c\x7a\xfa\xe4\x09\x19\x74\x20\x3d\x91\x0e\x09\x94\x44\x54\x29\x54\x87\x59\xa7\xbf\xfe\x40\xab\xab\xc9\x25\x4e\x87\xa3\xe4\x8a\xd4\x81\x8d\xcf\xe7\xe9\x40\x49\x3d\xbf\x5b\xff\x81\x94\x7d\x21\x3e\x37\xe5\xcf\xeb\xfa\xd7\x16\xdb\xc3\x58\x63\x80\x27\xa0\x42\xc0\x8a\x76\x57\x57\x11\x6f\x16\xf5\x7d\x52\x04\x50\x86\xa6\x1b\x2f\x44\x95\x66\x51\x45\x94\x79\x02\x08\xd0\x42\xb4\x54\x4b\x2d\xc5\x8a\x3d\x01\x54\x58\xb9\x1b\xf8\x97\x10\xa4\x5c\x62\x69\xa9\xdf\x92\xbe\xc3\x3f\xbc\x0c\x2d\xb2\xb4\xd4\x6f\xbe\x78\xea\x2e\xb0\xb4\xd4\xf7\xd9\x77\xf2\x2f\x74\x9c\x37\x0a\x0f\x4b\x5b\xd0\xf3\x97\x2f\x59\x3e\x48\xf9\x75\x93\xaa\x00\x95\xb7\x0c\x21\xb3\x25\x51\xad\x31\x6b\xf8\x4c\xeb\x57\x14\x65\x5c\x8f\x14\x22\x2f\x6f\x74\xea\x60\xcb\xa3\x36\xa0\xff\x55\x69\x84\xbd\xa4\x37\x48\x9c\x94\x8a\x97\x75\x46\x30\xd2\x14\xac\xae\x22\xb2\x4b\xc0\x4d\x0c\x8a\xa4\x85\x44\x17\x8f\xb1\xd2\x9e\x65\x08\xe0\x65\x28\x89\x47\xd7\x74\x39\xee\xfc\x7c\x78\xb4\x83\x7e\x43\x2f\xd1\x3a\xc0\xe4\x0d\xfa\x36\x2c\xe8\x5d\x9c\xda\x59\xf6\x8d\xf7\x97\xaf\x25\xe5\x2c\x20\xd6\xd5\x8a\xe3\xf5\x9f\x28\x73\x2e\x2a\x72\x1a\xc5\x35\x19\xc6\x6c\x95\xf1\x44\xd1\x2c\x1f\x30\x03\xf5\x32\x89\x07\xb9\xa5\x1e\x10\x1a\xec\x8d\x94\xcb\x40\xe8\x16\x72\x10\x9a\x2f\x0b\x71\xe9\x80\x10\xb6\x49\xf3\x94\x15\x3d\xd1\x45\x23\xf6\x59\xc2\x55\x55\x3d\x2f\x22\x14\x21\x87\x60\x84\x6e\x27\x1c\xa1\x05\x05\x24\xa4\xca\x73\xe6\xa1\xab\xa0\x7b\xf9\xec\x25\x96\xc6\x0b\x4d\xb2\x12\xc5\x25\x01\xcb\x29\x62\x49\x85\x17\x90\xb4\xda\x8f\x92\xd6\xb7\x2e\x69\x39\xe4\x2b\x87\x7a\xe7\xe4\xa8\x5c\xce\x59\x54\xbd\x63\x61\xe9\x3a\x2f\x7f\x64\xe2\x7f\x3f\x26\x5e\x7a\x9a\x7d\x00\x96\x7d\x10\x0f\x52\x0c\x91\x1b\x18\x70\x0d\x24\x93\x43\x8a\xc9\x5d\x46\xd4\x98\xc6\xf1\x05\x6e\xcb\xbf\xa0\xc6\x5f\x6a\x73\xa8\xba\x2b\xcc\x3f\x6f\x93\x32\x0b\xec\x02\x9d\xc7\x5d\xe0\x2f\xb1\x0b\xec\x8e\xf0\x20\x4f\x93\x38\x1a\xa0\x5e\x12\xe2\x7e\x92\xcc\x57\xf8\xef\xf6\xca\x14\xfe\xf4\xeb\x42\x3b\xc2\x6e\x4f\x55\xf8\x93\xe7\xfb\xda\x01\x64\xd6\xae\x32\x10\xb5\x5e\x99\x16\x93\xe0\xa3\x2c\xa4\x87\xc2\x2f\xc4\xb7\xc2\x8f\xa7\x5e\xea\xcd\xd7\x9b\x41\x99\x05\xd6\xf1\x5f\x3b\x39\xf2\x7f\xce\x3a\x3e\x9c\xe6\x93\x69\x5e\xfd\xd2\xee\xb0\xf4\xd2\xee\x70\xf1\x4b\x3b\x5d\xaa\x3b\xd4\x2e\xf1\x0e\xff\xdc\xeb\xa0\x07\x97\xea\x4c\xdd\xbc\x78\x73\xbf\x92\x5d\x49\x43\xdf\x8a\x74\xf7\x77\x3a\x61\x1f\x6a\xd7\x9a\x2e\x21\xea\xb0\xc2\xa5\xc5\xe1\x82\x97\x16\x8f\x59\xec\xfe\x1a\xcc\x77\xfb\xfd\xf1\x01\xfa\x65\x65\xa3\xd9\xe2\x06\xe2\x28\xcb\xc9\xf2\x3e\xbf\x36\xb8\xef\x24\x08\x57\xb6\xe3\x2c\xfa\x85\x94\x16\xb9\xe0\x26\x41\x28\xb3\xbf\x30\xc8\x03\xe9\x22\xd4\x75\x01\x9a\xa9\x37\xa0\xa4\xd6\x71\x61\xf0\xab\x18\x00\xbf\x50\x8b\xf6\xf5\xb4\x22\x7d\x57\x42\x11\x20\x8a\x69\x9c\x8b\x9e\x69\xc1\xac\xc0\x16\xef\x03\xfd\x66\x00\xa3\x2f\x96\x55\xcc\xfe\xa1\x7d\x37\x5a\xa3\x31\x6d\x46\x41\x46\x23\x67\xa1\x49\x92\x45\xaa\x07\x3e\x69\x94\x7c\x27\xf5\x3f\x24\xbc\xb3\xa2\x85\x25\x0d\xa3\x65\xe4\x6b\x8d\x7c\x08\xc2\xe2\x19\x06\x4a\x64\x1b\x51\x5f\x53\x56\x22\xb7\x55\x84\xd4\x52\x1b\x29\x42\x6a\xc9\xa5\x6d\xc1\xb5\x54\xcb\xec\x25\x0d\x10\xb7\x43\xe4\x16\xb8\xd3\xd8\x42\x1c\x3a\x45\xbc\xc6\xb9\x94\x70\x5e\x99\x2a\xaa\xc0\x17\xa3\x59\x3e\x73\x52\x9f\x6b\x2a\x9a\xcb\xe4\xf8\xcb\xfa\x5e\x5c\x04\x49\x28\xb0\x7d\xc5\xf0\x90\xd0\xc0\x38\x7a\xfb\xf4\xc9\x8d\x95\x6f\xf2\xe5\x32\xdb\x68\xb6\x16\xe2\x9d\x77\x4b\x4c\xf6\xc8\x3b\xbf\x16\xef\x3c\x38\x3e\x44\x10\x12\xb7\x1a\xeb\x3c\x60\x01\x74\xef\xca\x3a\xff\x74\x76\x58\x2c\x89\x39\xfc\xd0\xc2\xaa\x68\x3a\x00\x7b\x04\xba\x95\x34\x88\xc3\x64\x5c\x33\x38\x60\xbd\xbe\xa2\x49\x4a\xe5\x70\x58\xea\xb0\x53\x83\xcb\x35\xdb\x67\x1e\x01\xf7\xc8\xa8\x74\x46\xc5\x89\x73\x21\x46\xf5\xd7\xce\xbc\xf0\x1f\xc5\xa8\x56\x0f\x76\x7b\x68\x63\x6d\x63\x6d\xd9\x47\x8c\x36\xd0\x3b\x9c\x5f\x24\x21\x6a\xba\xb8\x15\x84\xf6\xbe\x2d\xb7\xda\x0e\x43\xea\x3f\xa8\x2e\x88\x0a\x5c\x80\xaf\x5e\x52\x9b\xfe\xf1\x45\xab\x34\xf0\x3f\x38\x4d\x20\x77\x58\x7e\x81\x51\x8a\x33\x89\x2f\x2a\x1d\x21\xe5\x58\x8f\xc9\xb3\x81\xf7\xad\x78\x01\x5b\x88\xbf\x33\x1c\xd4\xd5\xe8\x6c\x1e\x40\x53\x78\xf6\x85\x9d\xc4\x18\x8d\x93\x14\x53\xe1\x71\x79\x19\xfa\xe6\x1a\x45\xbe\xde\x97\x97\x2b\x2e\x70\x98\xcf\x45\x16\xf8\xda\xdd\xa2\x9c\x3f\x2e\xf0\xaf\x76\x8a\x43\x71\x92\x4c\xaa\x89\x21\xef\x39\x39\x3a\x57\xb6\x20\x76\xf7\x9a\x28\x8a\x94\xd1\x9c\x68\x6a\x21\xa2\xbb\x5b\xb8\xd9\x47\xa2\xfb\x5a\x44\xf7\x3f\x12\xf3\x2b\x27\x39\x89\x07\xfe\x89\xc2\x6f\xe5\x83\xb3\x7c\xbe\x35\x04\xe0\x5a\xad\x5c\x04\xae\xa3\x2f\x5f\xf4\x57\xb7\xda\x62\xec\x3d\x9e\x1f\x57\x60\x75\x15\x7d\x24\xf0\xd5\x7a\x91\x11\x29\x00\x34\x0b\xa2\xcc\xd5\x45\x34\xc2\xa8\xf6\x5d\xad\xf0\xb5\x2e\x62\x70\x83\xc7\xa1\x11\x73\x5b\x98\x70\x1a\x8a\xcc\x48\x6c\x49\x48\x55\x51\xea\x8e\xdd\x10\x8f\xb7\xca\xee\x25\x51\xd0\x42\xbc\xe4\xaf\xed\xb8\x65\xc9\xd1\x45\x93\x64\x3d\x2c\x5f\x29\x32\x21\x41\x6b\x7f\x7e\x9e\x8f\x87\x4d\x12\x5e\x2d\x26\xb6\x11\xf3\x5a\x7c\x39\xde\xdf\xf6\x8b\x58\xcf\xe4\x49\xfa\x68\x26\x02\xb7\x39\x88\x7e\x08\xb2\x8c\x2c\xe4\x65\x82\x5a\x88\xde\xe0\x6b\xb4\x83\xd3\xe8\x92\xe6\x84\xdc\xe3\x83\xd2\x2c\x8f\x39\xfd\xe1\xd5\x9b\x9d\xbd\x66\xd1\x9a\x78\xae\x98\x78\xbc\x97\xc4\xc3\xe8\x7c\xca\x32\x51\x26\x90\x15\x32\x2b\xcb\x2f\x99\x26\x13\x9c\xe6\xd7\xe8\x0f\x7a\x2c\x06\x6f\x52\x60\xbe\x27\x17\x34\xc7\x71\x46\x1e\xa2\x98\xa5\x0b\xc8\x13\xe1\x4b\xb3\x82\x76\xf0\x30\x98\x8e\xf2\x4d\xd4\x46\x35\xbf\xb9\x0e\x89\x94\xeb\x2e\xf8\x8e\x84\xe6\x38\xe5\x89\xcc\x0b\x70\x64\xfc\xe7\xa1\x19\xe5\x2c\x79\x66\x06\xa0\x8a\x43\xbd\xf4\x21\x4f\xd0\x04\xa7\xc3\x24\x1d\x4b\xc0\x15\xc8\x52\xfa\xc7\xc1\xf0\x7c\xd3\x35\xca\x88\x5e\x7c\x1d\x43\xcc\x19\xbf\xb9\xbe\xda\x6a\x6a\x21\xb8\x69\x57\x28\xea\xda\xa7\x02\x21\xa5\xf1\x9b\x7a\x59\x42\xd2\xb2\x04\xf2\x64\x56\xc2\x82\xb4\xf8\x7a\x9b\x9f\x45\xf4\x10\xf8\xdc\x0d\xe9\xaa\x9c\x31\x94\x8c\xdf\xc0\x46\x37\xdc\xdf\x6c\x98\xa4\x70\x8a\x29\x1a\xbd\x87\xc4\xa0\x9f\xc3\xa1\x91\x34\x9e\x52\x3b\x3f\x3d\x2a\x66\x58\x8b\x54\xfc\xa3\x98\xac\x75\x9a\x7e\xf2\xce\x60\x3c\x75\x1a\x1b\x8d\x86\x0e\xb8\x24\x7b\xfd\x60\x78\x6e\x37\xbc\x20\x13\xb1\x25\x7e\x72\xc2\x23\xc5\x5d\xc1\x30\xcc\xf5\x0e\xd7\x15\xd4\x83\xae\x2a\x0b\xba\x4d\xbe\xd9\x09\x83\x0d\xd4\xc2\x1f\x56\x2a\x56\xce\x82\x51\x8e\xb6\xe1\x3f\x8b\x27\xa2\xe5\x6e\x34\x92\x5f\xfb\x5d\xc8\x8e\x26\x52\x0f\x87\x2b\x2c\x2a\x49\x8d\x77\xc6\x03\xfc\x9c\x93\xca\x8a\xcb\xf3\xaa\xd5\x5c\x28\xb7\x8b\x3a\xf5\x56\x03\xc2\x28\x77\x24\x85\x65\x5e\xf6\xe0\xbb\xcf\x68\x95\x90\x0f\xe5\x41\x9e\x98\x1d\xbb\x59\xa2\x3b\x41\x39\xc8\xa6\x74\xb0\x69\xba\x79\x43\x9f\x63\x0b\xf5\x04\x72\xf2\x41\x1c\xe2\x99\xad\xc6\x69\x63\xc6\x14\x40\x96\x68\x9d\x73\x42\x74\x09\x54\x84\xb0\x2c\xde\x38\xf3\xd7\x17\xd8\xf0\x4a\xc5\x1b\x67\x25\xbe\xe5\x6d\x91\x59\x59\x61\x4f\x36\x23\x8c\x62\x6b\xa1\x45\x8b\x17\x73\x8c\x2c\xd4\x8f\x4c\x50\xd7\x3a\xc8\xe3\x22\xbd\xe4\xf8\x58\x8d\x0b\x44\x27\x59\x9e\x63\x9e\x2c\x1b\x28\xb0\x48\xe3\x5b\xf4\x5a\x9f\x33\xc4\x32\x7a\x17\xa9\x81\xcd\xef\xf3\xb3\x31\x00\x7c\x65\x88\xad\xa3\x6b\x16\x17\x59\x8c\x8a\x57\xac\xe3\x0e\x44\x0e\xc4\x18\xdb\x41\x47\x72\x34\x3b\x06\xd6\x82\x85\x62\xcb\xe1\x53\x5b\x0e\x69\xfa\x9c\xc6\x1c\x08\xf8\xb9\xd2\x04\x8c\x9e\x18\x69\xf9\xa3\x6d\xac\xab\x8c\x37\x9a\x17\x0a\xca\xd6\x59\x3e\xfa\xf2\x3b\x7b\xc0\x2a\xa9\x89\x5f\x0e\x8f\xd4\xee\x80\xeb\x94\xc5\xe3\xda\x18\xb7\xdf\xa8\x0d\xcc\x6f\xdc\x06\x46\x9a\xcd\x17\xe8\xb7\x92\xd1\x23\x7f\x45\x8d\xd3\xdf\xc0\x1c\xc6\xe8\xc8\xe9\x6f\xba\x59\x0c\xff\xbb\x31\x5f\xeb\x01\xa7\xc8\x9f\xc4\x1c\x98\x6e\x1a\x1a\xb5\x4d\x89\xc6\x24\x4e\x1b\x67\x4b\x4b\xe5\x26\x45\x12\x70\xe9\xe8\xcb\xf9\x86\x25\x88\x19\xdb\xcb\x8a\x7a\x65\x06\x94\xf2\x31\xe2\x4e\x1b\x7a\x95\x60\x33\xa5\x1b\xf9\x82\x9b\xf8\x7d\x89\x96\x51\x66\x4b\xb7\x3f\x3f\x7a\x8d\x45\x34\xb8\x87\x20\x36\x54\x44\x10\x92\x21\x15\x0a\x5d\x62\xc2\x62\xd5\x3c\xe4\x90\x4d\xef\x02\xa6\x54\x36\x2d\x82\xec\x88\xa3\xa4\x4b\x80\xf1\x90\x2e\xa8\xb2\x61\x57\xc5\x62\x52\x68\x8e\xf0\x74\x53\x66\x8b\x46\xa1\xd9\x03\xf5\xe8\x29\x74\x79\x4e\xd8\x9b\x33\x6f\xed\xaf\xed\x43\xbf\x40\x5a\xf7\xf9\xc9\xd1\x1f\x56\x77\xe4\x4c\xaf\xed\xca\x7a\xfd\x77\xd0\x2e\x1d\x83\x71\x66\x8f\x1b\xef\x52\x25\x92\xfc\xb2\x4c\x8f\x24\xf0\x38\xc2\xd3\x2c\xe8\x8f\x30\x0b\x07\x26\xa1\x73\x8c\xe4\x54\x8b\x14\x8a\xfe\xe6\x35\x52\x33\xac\x49\xdb\xc2\x11\x64\x53\x46\xcc\xd0\x96\xd9\x18\x9b\x9a\x24\x51\x1e\x62\xac\x44\x19\x0a\x10\x4d\xc0\x8c\x2e\x71\x9a\x41\xd4\xb2\x8b\x20\x47\x31\x3e\x1f\xe1\x41\x8e\x43\xc2\x86\x07\x2c\xa5\x6a\xce\x14\x3e\x79\x82\x46\x51\x9e\x8f\xf0\x32\x0d\x70\xb9\xa2\x02\xc5\x69\x9a\xa4\x28\x4c\x70\x16\x3f\xcb\x51\x30\x1c\xe2\x01\xad\x4b\x91\x7a\x96\xa1\x0c\x0f\xa6\x69\x94\x5f\x7b\xa2\x62\x7f\x9a\xa3\x28\x87\x4a\xbc\x46\x94\x67\x22\xa0\x42\x34\x8a\x72\xe6\xc4\x4d\xf3\xba\x46\x84\x3f\x8f\x71\x4c\xf7\x83\xcc\xa6\x28\xa3\x03\xf2\x96\x76\x4e\xa8\xcb\xb4\xb7\xf2\xfc\xdd\x36\x69\x5b\xf9\x21\xe5\x8d\x6c\x06\xed\x3c\x60\x14\xd6\xdb\x70\x6a\xb8\x2c\x3b\x2d\x44\xec\x84\x46\x76\x2f\xec\x3c\xa7\xfd\x22\xda\x25\xbf\x2c\x89\xe3\xde\x9c\x36\xce\x3c\x54\x7b\x73\xda\x3a\x63\xc1\x02\xd0\x17\xf2\xc8\xae\x02\xfc\x6e\xdd\x92\x44\xee\xcd\xa9\x4f\x2b\x35\xd4\x4a\xad\xf2\x4a\x4d\x5a\xc9\x57\x2b\x35\xca\x2b\xb5\x68\xa5\xa6\x5a\xc9\x17\x95\xd4\x3a\xb6\xec\x48\xc6\x90\x71\x2f\x43\xd7\xa0\xf5\xc4\xa0\xf5\xec\x83\x66\xe2\x23\x0d\x17\xeb\x13\xbd\x30\x19\x0e\x79\xda\x41\x8a\x34\x0d\xb2\xda\x68\x90\x2f\xb6\xfe\x9a\x13\xd1\x52\x21\xfb\x56\xc8\xcd\x4a\x90\x1b\xce\x81\x97\x60\x68\x90\x5b\x95\x20\xfb\xae\xd9\xf1\x24\x18\x1a\xe4\x86\x06\x79\xfe\x44\xf6\x82\x34\xbd\x46\x7d\x3d\x9d\x2a\x9d\xaa\x3e\x8d\x7f\x61\x6a\x32\x72\x3a\xf9\x84\xf5\x64\xd7\x59\x8e\xc7\x68\x98\x4c\x53\x94\x47\x63\x7d\xee\x17\x0c\xca\x1b\xe3\x59\x7e\x4c\x56\x9f\x3b\x7e\xac\x25\xe2\xed\xbb\x24\x8c\x86\xd7\x94\x13\x52\x3a\xac\x80\xc5\xba\x1b\x8b\xde\x29\x75\x1c\xf8\xe5\x14\x52\x5e\x42\xb4\x15\x23\x53\x9c\x2d\x49\xee\x4f\x28\xc3\xf9\x74\xa2\x7e\x28\xf1\xe8\x98\x7f\xd8\x3f\xf8\x89\xba\x76\x94\x9d\xf0\x0f\x7e\xfa\xd4\x40\x5b\xe8\xe0\x27\x33\x35\x9a\x54\xc4\xa7\x45\x7c\x6b\x34\x63\x79\x49\xc3\x54\x66\xd3\xfe\x25\x26\xa2\x82\xeb\xe8\xdf\xa0\xc1\x8f\xa1\x6d\x1a\xfd\xf8\x0b\xa2\x4f\xae\xe8\xc7\x72\x71\x16\xe6\x58\x94\x2f\xae\x43\xed\x61\x8e\x45\xb3\x4d\xd1\xac\xaf\x34\xeb\xcf\x6b\xd6\x57\x9b\xf5\x17\x6b\x16\xc2\xe8\x44\x0d\xbe\x04\x09\x90\xa8\xa9\xae\x40\x57\xd5\x16\x54\x6d\xf2\xc5\x0c\x55\x1b\xea\x32\x75\xcc\x08\x23\xeb\x32\xd6\x8a\x80\x5a\x1b\xf4\x5c\xaf\xc7\xf6\xa7\x1f\x7d\xfa\xd1\xb7\x7e\x6c\xd2\x8f\x4d\xeb\xc7\x16\xfd\xd8\xb2\x7e\x6c\x97\xb5\xd9\x29\x6b\xb3\x5b\xd6\xe6\x9a\x68\xb3\x44\x23\x55\x89\xf3\xa0\xc5\xb9\x0f\xaa\xc6\x81\x90\xa9\xa4\x90\xfd\x88\xee\x25\xb9\xab\x53\x79\x2d\x49\x1f\x95\x38\xb3\x5a\xc4\xde\x3b\xf7\xf6\x0e\x83\x5b\x78\x99\x01\x17\x52\x4b\x1f\xd3\x50\x43\xbf\x00\x11\xa2\xda\x2f\x64\xee\xf9\x2a\x81\x67\xb1\xf7\xbe\xd0\x2b\xfa\xb4\x62\x93\x55\x5c\xd3\x2a\x76\x9c\x15\x9b\xb4\x62\x9b\x55\xf4\xb5\x8a\x6b\xce\x8a\x2d\x5a\xb1\x7b\x26\x50\x53\x2a\xfa\x45\xc5\x3b\xed\x62\x65\x51\xea\x29\x22\x3c\x76\xfc\x31\x4b\xc9\xce\x82\xc7\xc3\xe3\x6d\xa2\xc7\x73\x38\x8c\xc1\x09\x38\xb6\xf8\xf1\x56\x7c\xad\x4e\x78\x48\xca\xd1\x2b\xbc\xe9\x8e\xcb\xbd\xe8\x64\xea\x17\x76\x3c\xc5\xcd\x6d\xf1\x31\xba\xa4\x5f\xba\xed\xd5\x56\x53\x57\xcb\x89\x65\x22\x08\xb6\x56\xd1\x15\x4a\x59\x1f\xca\x17\x49\x04\xd5\x0c\x7e\x8e\x83\x4b\x8c\x92\x51\xe8\x64\xb5\x0b\xc8\x0f\xbd\x4f\x74\x72\x7b\x7a\xbc\x43\xa5\xc5\x5e\x30\x1a\x4c\x47\x64\x85\xc5\xf8\xca\xd9\x6c\x8f\x25\x82\xe9\xd1\x44\x30\x8d\x59\x3b\x6c\xc1\xff\xa1\x25\x2e\xa1\xe9\xf9\x5a\x7a\x2c\x2f\x4c\x8f\xe6\x85\x69\xcc\x58\x8d\x16\xc4\x94\xef\x71\x01\xb5\x51\x47\x2f\x51\xad\xf7\x49\x7a\xfe\x2f\xe4\xa3\x4d\xd4\xa8\x9b\x10\x9b\x0c\x62\x93\x42\x64\x00\xdb\x0c\xa2\xaf\x41\xf4\x2b\x40\x6c\x31\x88\x2d\xa3\x5b\x35\xda\x8e\x02\xb1\x59\x01\x62\x9b\x41\x6c\x5b\x7b\xdd\xd2\x20\xb6\x2a\x40\xec\x30\x88\x1d\x6b\xaf\xdb\x1a\xc4\x76\x05\x88\x5d\x06\xb1\x6b\xed\x75\x47\x83\xd8\xa9\x00\x71\x8d\x41\x5c\xb3\xf6\xba\xab\x41\xec\xce\x85\x58\x88\xfd\x14\xa8\x52\x7d\x4d\xaf\xae\x7b\xc7\x08\x9a\x26\xbb\xcf\xf9\xf2\x1d\x16\x11\x29\x75\x3e\x03\x5e\x1d\x91\xae\xf5\x2c\x49\x38\x78\xba\xfc\x74\x3a\xc8\xd1\x45\x74\x7e\x81\x82\x38\x44\xa3\xe4\x0a\x05\xe9\xf9\x14\xc2\xbf\x80\x9b\xf3\xbf\xa7\x41\x6a\x24\xee\x81\x06\x02\xb4\x45\x5a\xe1\x52\x9c\x45\x79\x70\xde\xa7\x45\xe8\x2e\x61\x3d\x3e\xf1\x3e\x2b\x18\xa4\x38\x9b\x8e\x72\x94\x0c\xcb\x9a\xbf\xa0\x5b\x40\xed\x3c\x40\xcf\xd1\x79\x40\x5d\x57\xfc\xb5\x3a\x5a\x42\xf4\x55\x9f\xbd\xea\xc0\xab\x3e\xbc\xb2\x21\x39\xa2\x80\xa4\xae\xd0\x23\xe1\x73\x74\x3e\x83\x19\xae\x03\x41\xf0\x02\x42\xec\x94\x0a\xd8\x12\xc1\x90\x0e\xfd\x72\x78\x84\x20\x9c\xa4\xfc\xf1\x35\xe5\x70\xe7\x17\xe8\x57\x74\x3e\xaa\xca\xe4\xec\x4a\x95\x5f\x18\x8b\x7b\x4d\x59\x5c\xad\xf6\xba\xd8\xbe\xc9\x4e\xf6\x5a\x12\x0b\xea\xac\x40\x57\x2d\xd0\x2d\x0a\xe8\xf4\xfc\x0b\xe3\x86\xaf\x29\x37\xac\xd1\x66\x8a\xfd\xf6\x35\xe7\x7f\xb0\xdf\x2e\x21\xd2\x9a\x09\xa3\xc9\x60\x34\x39\x0c\x5f\x45\xc0\x37\x30\x6c\xa8\x05\x1a\x65\x18\xb6\x18\xf4\x16\x87\xde\x54\x31\x6c\x6a\x18\xfa\x16\x0c\xdb\x0c\x46\x9b\xc3\x68\xa9\x08\xb4\x0c\x0c\x9b\x6a\x81\x66\x19\x86\x1d\x06\xbd\xc3\xa1\xb7\x55\x0c\xdb\x1a\x86\x2d\x0b\x86\x5d\x06\xa3\xcb\x61\x74\x54\x04\x3a\x06\x86\x6d\xb5\x40\xbb\x0c\xc3\x35\x06\x7d\xed\x4c\x21\x11\x81\x61\x57\xc3\xb0\xa3\x60\x58\x29\xf1\x47\xc6\x93\x4e\x08\x5d\x6b\x85\xb4\x13\xf3\xae\xbb\x28\xac\x1c\xcf\x72\xf9\xde\x49\xd6\xa4\xf2\x50\x0a\x4a\x1a\x07\x7a\x5b\x64\xde\x5f\x4d\x46\x01\xc1\x66\x96\x23\x27\x38\x16\x67\xa6\x56\xb4\x6c\x83\x28\x2e\xae\xca\x94\xba\x6a\xf2\x0e\xb9\x64\xbd\xec\x0e\x4a\x2e\x58\xd9\x18\xd9\x53\xef\x46\x36\x3b\x6d\xaf\xb8\x14\xd9\xec\x74\x3d\x76\x57\xb2\xd9\xf5\x6f\xce\xbc\xb5\xbf\x76\x24\xc2\xc7\xfb\xaa\xc7\xfb\xaa\x07\xbb\xaf\xd2\x96\x78\x71\x9f\xa3\xdf\xe4\xfc\xb5\xee\x70\xee\x2b\x2b\xdc\x1b\x71\x34\x7f\xa3\x1e\xcd\xdf\xdc\xf6\x68\xfe\x46\x3d\x9a\xbf\x29\x3b\x9a\xcf\x53\x30\x3f\xde\x54\x3d\xde\x54\x3d\xde\x54\x29\x5f\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\x8a\x66\x1f\x6f\xaa\xf4\x8f\x8f\x37\x55\x8e\xc7\xc7\x9b\xaa\xc7\x9b\xaa\xc7\x9b\x2a\xf8\x7b\xbc\xa9\xaa\xa6\xc4\x7d\xbc\xa9\x7a\xbc\xa9\x7a\xbc\xa9\x92\xfe\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\xfe\x93\x6f\xaa\xee\xed\x8e\xea\x76\xb7\x53\x55\xee\xa5\x2a\xdc\x48\x3d\xd4\x5d\xd4\x5f\x3b\x1f\xca\xe3\x5d\xd4\xdf\xff\x2e\x4a\xbe\x3b\xea\xb5\xe7\x3a\x3a\xc9\x37\x47\xbd\xb6\x74\x6d\x04\x0f\x0f\x7f\x67\x44\xbd\x34\xc5\xad\x91\x3d\xa8\x00\xf7\xd0\x2e\xbb\x56\x02\x37\x4e\xd9\xa3\x58\x8a\x99\x6e\xea\x2b\xe2\x28\x47\x59\x3f\x99\x99\x70\x8e\x05\x3a\xc7\xf2\x35\x1d\xff\xb3\x49\x93\xcd\x4e\xd7\x7d\x28\x67\x87\xee\x68\xbe\x1a\xf7\x0d\xbe\xb6\xe9\x71\xd5\x16\x3d\xee\x3f\x3e\xb7\x61\x36\x28\x64\x08\x78\x54\x89\x08\xfd\x43\x1e\x27\x87\xea\x90\x55\x22\x5b\x1b\x1f\xfb\x53\x05\x90\x19\x09\x4d\xf9\x6c\x04\x45\xb3\x9d\xfd\x49\x2f\x6a\xbf\xa1\x25\x3a\x3e\x4b\xbc\xd1\x3a\xfa\x07\xf4\xca\x11\x4b\xe1\x2a\x98\xd8\x71\x86\x7d\xc3\xd4\x10\x48\x13\x70\x6c\x77\x8c\x27\xaf\xc9\x8c\xcf\x9f\x9e\x9e\x55\xc5\xcf\xb2\x6a\x08\xa2\xf9\x8d\x65\x99\x15\x80\xee\xac\x96\xe3\x9a\x10\xd0\x82\x18\xf9\xd7\xc9\xf4\xd8\x55\x86\x4a\xcb\xc2\xc9\xb9\xd9\xe9\x3a\x14\x22\x0d\xa7\x32\xc4\xda\x68\x55\xc5\x88\xb4\x9e\x34\xc5\x48\x31\x68\x91\xf6\xe5\xb7\x62\x38\xe7\x66\x80\x07\xe5\xa0\x5a\xfd\xb3\x8c\xa7\x36\x1f\x62\x35\xc5\x74\x19\xc5\x54\xa5\x16\x5b\x16\x51\x04\x1a\x74\x9a\x30\x8e\x51\xa5\xf2\x5d\x21\x61\x07\xe1\x5a\x89\xb6\x84\x60\xdd\xc4\x5a\x10\xaa\xfa\x5e\xed\xec\x17\x52\xb7\xc6\xd6\x14\xa9\xc2\xf0\x3a\x2b\xf2\x1a\xc4\x7a\x1e\x03\xed\xf8\xf4\x11\xe2\xa0\x58\x6e\xb4\x0a\x52\x8f\x8c\xb3\x3b\x19\x0b\x65\xae\x98\x58\xa6\x60\xf7\xad\xca\xbd\xbd\xf6\x7d\x08\xbd\xbd\xf6\xc2\x12\xaf\xb9\xc7\x6a\xe2\x6e\xaf\x6d\x8d\x6d\x01\x37\x34\x11\x0e\x6f\xb1\xc3\xef\xa4\xc9\x44\xd9\xe5\xd9\x0b\x18\x84\xaf\x10\x15\x2f\x24\xcd\xa9\x81\xe6\x34\x3d\x3f\x99\x78\x52\x4a\x84\x9a\x43\xfe\x46\x53\x06\xab\xc7\x9a\x23\xa8\x4b\x51\xbf\xb4\x55\x4c\x40\x6d\xaa\x20\xd4\x88\x71\x95\x84\x18\xd2\x06\x2f\x58\x7e\x87\x41\xc6\xb3\x64\x03\x17\x86\x2f\x04\x2f\xb2\x8b\xff\x08\x9b\xf9\xf2\xb2\x75\x0f\x5f\x80\xdd\xa3\x39\x09\x90\xbe\xa1\xd5\x46\x86\xe8\x7e\x56\x1c\x40\x5a\x7c\xd5\x31\x9a\x2f\x5f\x79\xa4\x50\xf9\x49\xb3\xd7\x7e\xa8\x63\xe6\xdd\xd2\xf5\x7d\xcd\xf3\xe5\x83\x9d\x02\xbf\x6e\x10\x67\xc2\xaa\x70\x86\xd3\x4b\xfc\xf4\x49\x6d\x50\x47\xcd\x86\xdf\x44\xfd\x6b\xd4\xfb\xff\xfe\xdf\x30\x8d\x06\xe8\x1d\xce\xe2\x68\xb4\x82\xb6\x47\x23\x94\x46\xe7\x17\x79\x86\x58\xf9\x70\xe5\xe9\xd3\x27\x47\x38\x8c\xb2\x3c\x8d\xfa\x53\x80\x1f\xc4\x21\x04\xe5\x89\x62\x94\x25\xd3\x74\x80\xe1\x4d\x3f\x8a\x83\xf4\x9a\xb0\x83\x71\xe6\xb1\x28\x0d\x29\xfc\x37\x99\xe6\x68\x0c\x3c\x7d\x00\x9c\xd5\x43\x41\x8a\xd1\x04\xa7\xe3\x28\xcf\x71\x88\x26\x69\x72\x19\x85\x38\xa4\x41\x27\xc8\x3a\x1d\x26\xa3\x51\x72\x15\xc5\xe7\x68\x90\xc4\x61\x44\xd7\x30\xa9\x34\xc6\xf9\x26\x5b\xf1\xcb\x48\x45\x2b\x03\xc5\x30\xc5\x67\x90\x84\x18\x8d\xa7\x59\x4e\x36\xea\x20\x8a\x01\x68\xd0\x4f\x2e\xc9\xa7\xc9\x35\x74\x11\xc5\x49\x1e\x0d\xb0\x47\xe3\x0a\x8d\xa2\x0c\x34\xcb\x72\x7b\x71\xa8\x21\x13\x46\xd9\x60\x14\x44\x63\x9c\xae\xb8\x70\x88\x62\x79\x20\x38\x0e\x93\x34\x09\xa7\x03\x7c\xef\x68\x20\xd6\xb5\x30\x19\x4c\x45\x1c\x0c\x52\x63\x35\x49\x59\x8c\x8c\x71\x90\xe3\x34\x0a\x46\x59\x31\xcc\x30\x37\x50\x4d\x42\x9d\xcc\xf3\xc9\xfe\xc1\x31\x3a\x3e\xdc\x3b\xf9\x79\xfb\x68\x17\x1d\x1c\xa3\x0f\x47\x87\x3f\x1d\xec\xec\xee\xa0\x57\xff\x42\x27\xfb\xbb\xa8\x77\xf8\xe1\x5f\x47\x07\xaf\xf7\x4f\xd0\xfe\xe1\xdb\x9d\xdd\xa3\x63\xb4\xfd\x7e\x07\xf5\x0e\xdf\x9f\x1c\x1d\xbc\xfa\x78\x72\x78\x74\x8c\xbe\xdf\x3e\x46\x07\xc7\xdf\xc3\x87\xed\xf7\xff\x42\xbb\xbf\x7c\x38\xda\x3d\x3e\x46\x87\x47\xe8\xe0\xdd\x87\xb7\x07\xbb\x3b\xe8\xe7\xed\xa3\xa3\xed\xf7\x27\x07\xbb\xc7\x1e\x3a\x78\xdf\x7b\xfb\x71\xe7\xe0\xfd\x6b\x0f\xbd\xfa\x78\x82\xde\x1f\x9e\xa0\xb7\x07\xef\x0e\x4e\x76\x77\xd0\xc9\xa1\x07\x8d\x9a\xd5\xd0\xe1\x1e\x7a\xb7\x7b\xd4\xdb\xdf\x7e\x7f\xb2\xfd\xea\xe0\xed\xc1\xc9\xbf\xa0\xbd\xbd\x83\x93\xf7\xa4\xad\xbd\xc3\x23\xb4\x8d\x3e\x6c\x1f\x9d\x1c\xf4\x3e\xbe\xdd\x3e\x42\x1f\x3e\x1e\x7d\x38\x3c\xde\x45\xa4\x5b\x3b\x07\xc7\xbd\xb7\xdb\x07\xef\x76\x77\x56\xd0\xc1\x7b\xf4\xfe\x10\xed\xfe\xb4\xfb\xfe\x04\x1d\xef\x6f\xbf\x7d\x6b\xed\x25\xc1\x5d\xe9\xe3\xab\x5d\xf4\xf6\x60\xfb\xd5\xdb\x5d\xda\xd2\xfb\x7f\xa1\x9d\x83\xa3\xdd\xde\x09\xe9\x4e\xf1\xab\x77\xb0\xb3\xfb\xfe\x64\xfb\xad\x87\x8e\x3f\xec\xf6\x0e\xc8\x8f\xdd\x5f\x76\xdf\x7d\x78\xbb\x7d\xf4\x2f\x8f\xc1\x3c\xde\xfd\xbf\x1f\x77\xdf\x9f\x1c\x6c\xbf\x45\x3b\xdb\xef\xb6\x5f\xef\x1e\xa3\xda\x9c\x21\xf9\x70\x74\xd8\xfb\x78\xb4\xfb\x8e\xe0\x7c\xb8\x87\x8e\x3f\xbe\x3a\x3e\x39\x38\xf9\x78\xb2\x8b\x5e\x1f\x1e\xee\xc0\x40\x1f\xef\x1e\xfd\x74\xd0\xdb\x3d\x7e\x81\xde\x1e\x1e\xc3\x68\x7d\x3c\xde\xf5\xd0\xce\xf6\xc9\x36\x34\xfc\xe1\xe8\x70\xef\xe0\xe4\xf8\x05\xf9\xfd\xea\xe3\xf1\x01\x0c\xda\xc1\xfb\x93\xdd\xa3\xa3\x8f\x1f\x4e\x0e\x0e\xdf\xd7\xd1\xfe\xe1\xcf\xbb\x3f\xed\x1e\xa1\xde\xf6\xc7\xe3\xdd\x1d\x18\xdd\xc3\xf7\xd0\xd5\x93\xfd\xdd\xc3\xa3\x7f\x11\xa0\x64\x0c\x60\xf0\x3d\xf4\xf3\xfe\xee\xc9\xfe\xee\x11\x19\x50\x18\xa9\x6d\x32\x04\xc7\x27\x47\x07\xbd\x13\xb9\xd8\xe1\x11\x3a\x39\x3c\x3a\x91\xfa\x88\xde\xef\xbe\x7e\x7b\xf0\x7a\xf7\x7d\x6f\x97\x7c\x3d\x24\x50\x7e\x3e\x38\xde\xad\xa3\xed\xa3\x83\x63\x52\xe0\x80\x36\xfb\xf3\xf6\xbf\xd0\xe1\x47\xe8\x32\x99\xa3\x8f\xc7\xbb\xf4\xa7\x44\xb1\x1e\xcc\x24\x3a\xd8\x43\xdb\x3b\x3f\x1d\x10\xb4\x59\xe1\x0f\x87\xc7\xc7\x07\x8c\x4e\x60\xc8\x7a\xfb\x6c\xb8\x57\x9e\x3e\x79\xbe\xaa\xea\xbc\xde\x05\xf9\xc5\xfd\xea\xbd\xaa\x45\x9d\xa6\x81\x8f\x45\x11\xfa\x58\xc9\x3a\x1b\x2e\xec\x82\x38\xcf\x50\x1e\xf4\xb9\xc4\x42\xaa\x7c\xfa\x7d\x64\x0d\xb6\x59\xc8\x51\x0d\x0f\x21\xdf\x43\xa8\xe9\x21\xd4\xf2\x10\x6a\x7b\x08\x75\x3c\x84\xba\x1e\x42\x6b\x1e\x42\xeb\x1e\x42\x1b\x1e\xf2\x1b\x1e\xf2\x7d\x0f\xf9\x4d\x0f\xf9\x2d\x0f\xf9\x6d\x0f\xf9\x1d\xc9\xc2\x72\x8d\xd6\x25\xdf\x08\x3c\x52\x9e\xc0\xf0\x3b\x14\x2e\xa9\x07\x6d\x6d\x30\xf8\x4d\x06\xc3\x87\x36\x0a\x38\x2d\xd6\x56\x9b\xe1\xb2\xc1\x60\xac\x4b\x78\xae\x31\x58\x5d\x86\x8b\x4f\x61\xfa\x72\xac\x65\x9f\xd5\xe5\xb8\x34\x28\x0c\xc0\x83\xe3\xd9\xa2\xb0\x08\x7c\x5f\xee\xb7\x0c\xa7\xcd\xea\x76\x18\xee\x6b\x0c\x46\x53\xc2\xd3\x67\xb0\xd6\x19\x2e\xac\xdf\x7e\xeb\xac\xfe\x42\x9e\x8b\x74\xce\x5c\x70\x3c\xd6\xa4\xb1\x6a\x32\x98\x1c\xe7\xae\x3a\x1e\xd0\xb7\x96\xd6\xf7\x2e\xab\xd3\x2a\x60\x41\xdd\x4e\x81\x33\x87\xc1\xc7\x03\xda\xf2\xb5\xbe\x43\xa1\x8e\xd4\xc1\x35\x86\x60\xb7\x18\x5c\x01\xa4\x29\x0d\x34\x45\xb6\x00\xb4\xce\xea\x48\x83\x05\x13\xd3\x29\x06\x57\xc0\x68\x49\x03\x4d\x91\x95\x10\x6a\xb2\x91\x6d\x48\xc0\xf8\x68\xac\x89\xd9\x13\x14\x8a\xd8\xe8\x50\x64\xd5\xd9\xc8\xe6\xad\x0c\x8a\x22\x1b\x2b\x40\x4f\x6e\x89\xd3\x56\x4b\x1a\xcf\x6e\xf1\x4d\xa1\xe9\x35\x0f\x3e\xc1\x50\x71\x7a\xdd\x28\x68\x8f\xd3\x94\xdf\x91\x86\x75\x8d\x95\x55\xe6\xc3\x2f\x88\x40\xcc\xc5\x06\x2b\xc8\x89\x67\x5d\x2a\xc3\x11\x5f\x83\xdf\xf2\x59\x4a\xac\xe5\x76\x51\x95\xb7\x2f\xd6\xbc\xbc\x26\xd6\x15\x90\x05\x28\xbe\x3e\x3b\x05\xed\x8b\x7e\x36\x0b\x14\xc4\x38\x31\x92\xa1\x70\x91\x36\x25\xf3\x16\x08\x43\x4c\x19\xfc\x4e\x81\x00\xf4\x73\xad\x58\x88\xd0\x60\x9b\x21\xd2\xd5\x90\x6e\xa9\x83\x2f\x3a\xed\x17\x70\xc4\xd8\x89\x05\x0d\xdf\x15\x38\x82\x81\xf8\xd2\x20\x75\x8b\x76\xc5\xc2\x63\x0b\xd8\x6f\x59\xe6\x43\x74\x40\x43\x9c\x03\x12\x0b\xae\x29\xfd\xb7\x23\x56\xb1\x3a\x40\x1d\x4b\xb9\xb6\x3a\x33\x62\x26\x8b\x4e\x21\xdf\x47\x67\x4a\x96\xec\x4f\x17\x64\x85\x58\xe6\x03\x89\x50\xcd\x0d\x0f\x35\x66\x9d\xed\xf5\xe6\xda\xc6\xc6\x06\xf9\xdd\xdd\xdd\xd9\xd8\x7d\xb5\xed\x93\xdf\xeb\x7b\xfe\xab\x57\xbd\x9d\x1e\xf9\xbd\xbd\xd1\x69\xed\xed\xb4\x77\xd5\xf9\xbe\x48\x9d\x0d\x74\x1a\xdb\xcd\xf5\x57\xbb\x5d\x68\xa0\xd7\xde\xd9\xf1\x9b\x6d\x68\x60\x67\xad\xd1\xda\xdd\x6b\x91\xdf\x6b\xdb\xdd\x9d\xb5\xee\x2e\x34\xcc\x11\x3a\xb3\xea\x03\x8e\x0e\x3e\xec\xbe\xdb\xf1\xbb\x0d\x08\xbf\x3f\x47\x87\x24\xca\x16\x5a\x24\xe9\x15\xdd\x95\x6f\x7b\x57\x44\x95\x89\x80\x84\x23\x08\x76\x77\xad\xdd\x69\xb6\x1a\x30\x82\xbb\x7b\xbd\x9d\xed\x57\xeb\xd0\xc1\x8d\xf5\x57\xdb\x3b\xbd\xbd\x5d\xf2\xdb\x6f\xb4\x9a\x9d\xf6\x1a\x0c\x4e\xaf\xb5\xd3\xdc\xf5\xf7\x1a\x67\x4e\xd5\x78\x55\xa5\xbc\x55\xb1\x5b\xd9\x4b\xc9\x2f\xb9\xa9\x99\x6f\x8e\x4f\xb1\x00\xdd\x6b\x61\x16\xe9\xb8\xbe\x79\xf7\x49\x2a\xcd\x2f\x0f\x3e\x99\x86\x4c\xa8\xec\x4e\x45\xaa\x87\xb6\x50\xcd\x2c\x80\xa8\x01\xa8\xd4\x58\x61\xf8\x20\xbd\x5c\xcc\xa8\xd4\x00\xc8\xec\x4a\x35\x80\xa6\x75\xa9\x09\xae\x44\x35\x86\xe6\xd9\x3a\xef\x23\x71\xff\x40\x48\xd1\x79\xe5\x08\x0c\xe0\xd3\xc5\xc8\x5d\x20\x85\x02\xa9\xb3\x00\x88\x9f\x9f\x7e\x77\x43\x00\x99\xe8\xd3\xef\x6e\x08\xb0\x4d\x7f\xca\xdc\x10\x60\xd3\xf8\x94\xa5\xf6\x88\xd6\xab\xab\x64\x95\x7d\x26\x87\xe6\xcb\x20\x8d\x88\x74\x6c\xb9\xa4\x0d\x46\x1e\xea\x8f\x3c\x34\x18\x79\x28\x1c\x79\x08\x8f\x2c\x0d\x05\xa9\x87\xfa\xa9\x87\x06\xa9\x87\xc2\xd4\x43\x38\xd5\x1b\x0b\x08\x2a\x01\x41\x78\xdf\x74\x19\xe9\xa7\x10\x74\x1c\x3e\xfa\xfa\xc7\x01\xf9\x38\xa0\x1f\x9b\xfa\xc7\x90\x7c\x0c\xe9\xc7\x96\xfe\x11\x0e\x0c\x98\x7e\x6c\xeb\x1f\x45\x9a\xea\x40\xcd\x4b\xcd\xbb\xa4\xdf\x0a\x5a\x4d\x09\xe1\xbf\x4b\x5b\xc8\xb7\xae\xed\x9c\x2c\x9f\x60\x84\x96\x8a\x35\xb5\xf4\xfb\xe8\x34\x3a\x3b\xab\x7f\xb1\x39\x31\x80\xd7\xce\x4b\xbf\x5b\xff\xe3\xe9\x13\x95\x35\x92\x36\xd0\xd0\xaf\xf5\x47\xde\x60\xe4\x85\xa3\x3a\x5a\x42\x17\x23\xbb\xef\xcd\x0d\x12\x0a\xb9\xe8\x65\xab\x49\x55\x6d\x16\x68\x4d\x1d\x9a\x31\xf2\x06\xb4\xf6\xba\x13\x5a\x4b\x87\x66\x4c\x95\x01\xad\xdb\x76\x42\x6b\xeb\xd0\x8c\xb9\x95\xa0\xfd\xb1\xba\xca\x20\xae\x37\x9c\x10\x3b\x3a\x44\x83\x20\x90\x3d\x4c\x3a\x99\xc4\xdc\x3a\x5d\xe4\x0b\x4a\x93\x7c\x54\xcb\xbd\x8c\x4c\xab\xcd\x69\x03\x68\x20\x5f\xc2\x23\xfb\x94\xc3\x8a\x30\x96\x14\xf9\x03\xba\x0d\x6d\x5f\x80\xdc\xa1\x5d\xb2\x26\x7d\xab\x1b\x10\xac\x97\xbe\xad\x36\x2c\x33\xe3\x26\x51\xa0\x1a\xa4\x68\x49\xa2\xd6\xf4\xf6\xd4\xda\xa9\xf5\x53\x6f\x90\x7a\x61\x0a\x23\x9e\xde\x8d\x5a\xdb\x3a\xb4\xbb\x52\xab\x0a\xed\x4e\xd4\xda\xd4\xa1\xdd\x99\x5a\x7d\x1d\xe2\x3d\x53\x6b\x0a\xb7\xd6\x25\xe4\x9a\x3a\xc8\x15\x38\x6a\x6a\x23\x57\x60\xc4\xb6\x2f\xc0\xa2\x29\xb9\xa6\x4e\x72\x85\x0d\xc0\x56\x1b\xb6\x06\xd3\x42\x43\x67\xe5\x07\x72\x3a\x06\x90\x21\xc1\xea\x57\x93\x30\xc9\x3f\x5b\xa8\xb6\x4f\x4d\x73\x07\x84\x33\x87\x96\x9e\xee\x33\x13\xde\x7d\x6a\x7e\x1b\x92\x72\xb6\x11\xd9\x67\x66\xba\xfb\xd4\x90\x16\x93\x72\x81\xb5\x5c\x8b\x95\x03\x63\x59\xd8\x11\xfa\xd6\x72\x6d\x56\x0e\x0c\x93\xfb\xa4\xdc\xc0\x5a\x0e\x0c\x98\x95\x61\xd1\xc5\xda\x3d\x96\x5a\xe3\x0e\xe6\x59\x61\x90\x07\x42\x18\x22\x0f\x96\x8d\x7f\x7e\x1a\x46\x5e\x32\x7e\x15\xe5\xd9\x49\x92\x03\xc7\xa3\x30\xe3\x9d\x20\x0f\xa8\xd5\xd6\x73\xb4\x6e\x81\x0e\x75\xde\xe2\x61\x6e\x24\x6d\x84\xf2\x46\x67\xb6\xc3\xd0\xcc\x42\x8c\x58\xbe\x45\x6a\xcc\x54\x80\x24\xd2\x64\xe7\x0c\x7d\xd9\xa2\x89\x85\x0b\x1b\x09\x51\xe2\x1f\xa8\xd5\xd4\xa9\xb5\x80\x54\xab\xd5\x8a\xa2\x4b\x88\xf0\x07\x02\x72\xa3\x4e\x40\xb5\xc9\xba\xf5\xdb\x0e\x01\x9a\x57\xa5\xc3\x51\x08\xcf\xd2\xcb\xea\xc2\xb3\x01\x8c\x09\xce\x1a\xb0\x79\x82\xb3\xad\xa3\x72\x9e\x8e\x22\x1f\x26\xcf\xb1\x03\xc6\x31\x96\xb4\x1d\xab\xab\x70\x12\x44\x90\xdd\x85\x3a\x64\x59\x0d\xa7\x26\xf4\xe4\x65\x66\x73\x29\x27\x4b\x58\xdd\xb2\x8c\x6e\x21\x9c\x7d\xb4\x85\x64\xf1\xfd\x6e\xe7\xb7\x4e\xa5\xe3\x9b\xfd\x44\xb6\x0f\x47\xb1\x7d\x8b\x33\x09\x2a\x3b\x83\xed\x0b\x77\xbd\x7d\xe5\x78\xb5\xbf\xf0\xb9\x8a\x52\xc8\xbe\x72\xa6\xda\x77\x1e\xa6\xe6\x9b\xc2\x1d\xd1\x9b\x70\x3a\xb9\x2c\x83\x45\x08\x83\xad\x16\x65\x37\xe6\xda\x04\x29\x6c\x6a\x30\x4a\xe2\x72\x06\x05\xa6\x04\xa4\x54\xa1\x5d\x80\x47\xb7\x19\x04\xfd\xfc\xc9\x20\x12\x5a\xcf\xa4\x35\x86\x26\x7c\x55\xec\xa2\xe0\xe7\x0d\xbd\xfd\x47\xb2\x45\xdc\xd0\xaf\xcd\x3c\x74\xed\xa1\xdf\x6d\x69\x3e\x6a\xb5\x19\x78\x76\x5e\xc3\xbf\xbf\x17\xd9\xda\x6f\x0c\x38\xcd\x72\x38\xb5\x59\xfd\x87\xda\x75\x9d\xba\x93\xff\x2f\x79\xf8\xbd\x5e\xaf\xbf\x70\x41\x6b\xcd\x85\x46\x00\xfd\x2f\x81\x58\xa0\xe6\x80\xd5\x9e\x0f\xeb\x07\x80\x00\xb8\x5d\xd7\x7f\xa8\xfd\x2f\x20\xe7\x86\xd8\xa9\x32\x66\x64\xd0\xbe\x14\xa0\x1c\xb0\x40\x94\x98\x79\xb1\x15\xd2\xec\xe5\xcb\x18\xb0\x9a\xfd\xf8\xe3\x8f\xb5\x56\x73\x39\x96\x91\xa2\x3f\x4a\xad\x61\xb8\x31\x0c\xcd\x03\x57\xcd\x18\xc6\x99\xed\x87\xd9\xb7\x80\xcd\x13\xff\x9d\x27\x94\x33\x99\x60\x1c\xf9\x79\x1c\xa5\x6f\x9b\x98\x87\xad\x8c\xc2\x92\x85\x2b\xf0\x6a\xcf\x18\x8a\xcf\x2c\x56\x38\xee\x5a\x57\x1c\x5b\x9b\xb9\x8d\xa9\x1c\xd4\x4c\x6d\x78\x81\x6a\xa6\x4a\x7c\x72\xf6\xdf\x6d\xf7\xbe\xc2\xd4\x94\x54\xff\x8c\xaf\xa1\x6a\x86\x07\x29\xce\x1d\xb9\x93\x1c\x13\x0a\x29\x07\xef\x71\x42\x69\x22\x43\x31\x35\xfb\xe3\x60\x50\x4c\x8f\x6c\x62\x65\x99\x21\xa5\xb0\x39\x4b\xe3\x60\x60\x99\xa9\x27\x37\xf4\x1e\xd8\x61\x1a\xc5\x4b\xda\xb3\x13\xdd\x9c\x79\x6b\x6b\x8f\x26\x4e\x7f\x07\x97\x95\x87\xbe\xba\xd7\x02\xab\x49\x0d\x3b\x43\xa6\x1d\xef\x6f\x2f\xfb\x15\x6e\x32\xcc\x5c\xd5\xf7\x79\x7f\xb1\x05\xde\xa7\xc5\x15\x46\x14\x47\x79\xcd\x12\x80\x4a\xbd\xd2\xc0\xc3\x41\x18\xf4\xd7\x37\x2c\xb1\x99\x1a\xb3\x8d\xf5\x7e\x10\x0e\x86\x58\xb9\xe3\xb0\x15\x1c\xb4\xc2\x26\xf6\x87\x0d\xf5\xdb\xdd\xaf\x40\x5c\x12\xba\x5d\xf8\x36\x35\xe8\x06\x80\x2a\xba\x67\xbb\xba\x98\x7c\xea\xdb\x95\xc5\x20\x30\xda\x55\xc5\x70\x5c\xb5\x2b\x8a\xc9\x27\x2c\xd4\xc4\x06\xa6\x4e\x3d\xb1\x53\x27\xec\x38\x2d\x80\xde\x07\x51\x0f\x53\x47\x2c\x98\x9f\xa9\xe0\xaf\x86\xc0\x50\x7d\x4f\xf9\x1f\x57\x28\xd9\x01\x71\x3f\x87\x9f\x4f\x23\xb4\x8c\x5a\x67\xe8\x57\xf6\x73\xbd\xf8\xe9\xb7\xa5\xdf\x5d\x57\xee\x48\x86\x52\x2d\x06\xe7\x58\x7a\xb6\x84\xe3\x43\xcb\xb7\x87\xa9\xb1\x9f\x84\x40\xb5\x54\x0b\x08\x90\x0e\x00\x09\xe8\x49\x66\x0d\x1c\x64\x31\x5a\x82\x86\x5c\x8a\x46\xf4\x12\x35\x1b\xce\x51\x03\xb5\x59\xad\xd6\x47\x3f\xa0\x01\x95\x73\xc9\xcf\x10\x20\x37\x66\x9d\x80\xde\xc2\xce\x51\xf1\xa1\x97\xa8\x3d\xaf\x89\x3e\xfa\x15\x0d\xd0\xaf\x28\xa4\x90\xbb\x38\xdc\xc0\xfd\xc0\x16\x74\x48\x83\xdc\x5d\x00\x79\x8a\x3b\xf9\x35\x60\xbd\x58\x46\x8d\xd9\x5a\x03\xb7\xdb\xad\x66\xdb\xdd\xd6\xea\x73\xd1\xdc\x7a\xa3\x8e\x9e\xaf\x56\xee\x0b\x81\xdf\xea\x6c\x84\x2d\xdc\xd4\xb5\x3c\xc8\x31\xa5\x64\xbd\x84\x36\x75\x1f\xda\x42\x03\x9b\x8a\x0f\x41\x93\x2f\x5f\xa2\x56\x83\xf5\x12\xa6\xdf\x9a\x5b\x14\x6d\x21\x1b\x1e\x41\x35\x6f\xad\x4a\xca\x40\xa6\x44\xe3\xca\xb6\x40\xf7\xf0\x46\x8a\x22\x10\x14\x86\x46\xe4\x13\xa4\x28\x01\x41\x59\x38\xb0\x97\x69\xc9\x8a\xc2\xd0\x5e\xa6\x2d\x2b\x09\xb1\x5e\xe6\x51\xc1\xf7\xad\x2a\xf8\x88\x2c\xbc\x32\x1c\x25\x49\x2a\xeb\xdc\x56\x61\xa3\x66\x7f\x77\x6a\x04\x62\x21\x14\x90\xe7\xe8\xe9\x0c\x35\xdd\x03\x69\xe8\x16\xd4\x03\x59\xd5\x75\x7f\x45\x6d\xd0\xa3\x0a\xc1\x50\x06\x10\xf1\x79\x21\xed\x01\x54\x28\x53\x1c\xa8\x02\xb9\xaa\x33\x20\xdf\x1e\xd5\x05\xf7\xaa\x2e\x80\xf9\xa8\xa0\x29\xb0\x4f\x4b\xa1\x24\x60\x53\xe3\x76\x9b\x22\x05\xdc\x6a\x81\xf5\xbf\x74\x80\x8d\xec\x22\x68\x76\xba\x0f\x1d\x1b\x83\xb5\xf2\x9f\xa3\x3e\x30\xd4\x03\xf2\x19\xbe\xd9\xe9\x2a\xa7\x78\xc9\x0b\x5b\xd7\x0a\x34\x9b\xed\x6a\x7a\x01\x52\x50\x81\x09\xcf\x14\xf8\x57\xd5\x0d\x0c\xfc\x46\x67\x03\x87\xeb\xe4\xc8\xdf\xea\xae\x0d\xc2\x4e\x63\x0d\x7e\x37\xd6\x1a\x61\xe8\xc3\xef\xe1\x5a\x03\x77\x36\x5a\x76\x9d\xc1\x70\x38\x68\x34\xfa\x2d\x50\x2e\x74\xd7\x3b\xeb\x7e\xc7\xa7\xbf\xdb\xc3\x8d\xf5\x61\x00\x00\xfa\x78\x18\xb4\x87\x41\x7b\x01\x75\x41\x25\xc9\x53\x62\xfb\x6c\xe8\xa4\x9a\x25\x5e\xb4\xc0\x51\x85\x38\xb3\xbc\x65\x0a\x2f\x8e\x8b\xa5\xc7\x2d\x7a\xce\x8e\xdb\x6c\xb6\x17\xdd\xa4\x49\x95\x39\xdb\xb4\xb2\x3a\x8c\x8d\xba\xd9\xb4\x3b\xb1\x3f\x6e\xd5\x77\xd8\xaa\xc9\xac\x54\xdb\xac\xad\x93\xa3\x6c\xd7\x74\x82\x4a\x37\xec\x66\x53\x77\x75\x96\xfc\x9a\xd9\x76\xb4\xb9\xb6\x41\x36\xf0\x8d\x47\xbd\xfe\x9f\xb3\x31\xff\xf5\xdc\xf2\x0e\x68\x12\x87\xe8\x77\xe1\x95\x8b\xd2\x64\x1a\x87\x68\xa0\xfa\xeb\x49\x3d\xd8\xd7\x53\xa7\xbc\x51\xaf\x01\xb8\xa2\x16\x17\x30\xe8\x17\x9b\x04\x83\xe4\x2b\xe5\x28\xfb\x90\x46\x63\x5c\x8b\xad\xdb\x58\xf6\xef\x34\x7f\xcf\xcf\xf9\xe4\xa1\x16\xeb\xe7\x4c\xa1\x08\xa6\xd3\x89\xb6\x50\xf3\x05\xff\xfd\x72\x8b\x42\xe0\x2f\x4a\x74\xc3\xdf\xfd\xff\xec\xbd\xff\x7a\xdb\x36\xb6\x28\xfa\xf7\xf4\x29\x56\xf6\x37\x8d\xa5\x98\x96\x09\x92\x92\x28\x27\x4e\x4e\x9a\x38\x6d\xce\x38\x4e\x4e\xe2\x4e\xbb\x8f\xeb\x74\xf3\x07\x64\xb1\x91\x48\x85\xa4\x6d\x79\x26\x99\xef\xbe\xc6\x7d\x8c\xfb\x0a\xf7\x51\xee\x93\xdc\x0f\x0b\x20\x09\x92\x00\x29\x3b\xe9\xec\x3d\xfb\x54\xfd\xea\x48\x24\xb0\xb0\xb0\x7e\x61\x61\x01\x58\x18\xc4\xf0\xad\x28\x36\xd4\xc6\x0b\x85\x8e\xce\xbd\x65\x46\xfb\x77\x05\x36\xe3\x63\xc5\x7c\x3c\xbd\xac\xcf\x70\x15\x64\xb9\xa0\xf9\x8b\xd4\xc3\xef\xde\xf2\xbb\x28\xcf\x14\x04\x2a\x97\xf0\x63\xd8\x83\x41\x8c\x99\x3d\x87\xf0\xa0\x16\xfc\x68\x46\xb2\xa4\xb6\x8a\x28\xb5\x9c\x99\x1d\x9f\x21\x43\x1a\xf9\x7b\xae\x17\xd1\x92\xc2\x40\xbc\x7b\x04\x62\x4b\x66\x93\x8a\x15\x37\xb5\x84\x2e\x41\xb8\x5a\x2a\xff\x70\xc6\x0b\x61\xda\xd1\x16\x21\x50\x16\xd6\xc9\xf5\x20\x36\x80\xc0\x3e\x58\xc3\x2d\x32\xb6\x03\xde\x84\x72\x1b\xb0\xf6\x50\x99\x3c\x9b\x83\xd8\xdd\xed\x09\x85\xc6\xb5\x12\x85\x87\x34\xa8\x60\xde\x7d\x8d\x8d\x39\xde\xdb\x79\xd3\x6d\x0f\xfd\x77\x5f\x69\xfb\x61\x94\x2d\xa3\x80\x0e\xcc\xe1\x1f\xab\x5e\x5b\xaf\x7a\xb5\x5e\xcd\xf1\xd5\x58\xf5\xea\x02\x5f\xb5\x16\x8c\xd0\x67\xc1\x57\xd3\x2f\x5e\x46\x9b\x74\xe4\xba\xff\x67\x2f\xa3\x5d\x78\xab\x95\x67\x6e\xca\xc5\x34\xd2\x22\x4a\xbb\x34\x6e\x34\x1e\x14\x35\x1f\x3d\x02\x8b\x2f\x7a\x15\x4f\x1e\x3f\x7e\x0c\xd3\xe1\x10\xe0\xbd\x1a\x52\xfd\x53\x83\x44\x9c\x16\x24\xe2\x0e\x87\xdb\x41\xaa\xd7\xb3\x95\xe6\xa5\xd6\x13\x52\xf5\x5b\xb9\x49\xbe\x5e\x58\xea\x36\xe1\xc8\x4a\xdd\x26\x9b\x22\xdf\xf4\x96\xc8\xd6\x21\xd9\x6d\x48\xb3\x5b\x76\xbb\xa8\xa7\xbe\x93\x00\x2a\xc1\x11\x4c\xdc\x15\x3d\xc7\x24\xbf\xa2\x87\xbb\x9d\x0b\xa6\xba\xd5\xcf\x00\x4f\x35\x0e\x28\xdc\x87\x39\x6e\x76\xfb\x07\xfb\x7a\xa1\xbb\xc2\x65\xe5\x61\x86\x39\x0f\xee\x83\x8f\xc5\x3d\xbe\x3a\xf8\x1e\xc4\x3a\xa1\x0a\x7f\x74\x56\xa2\x0b\x86\x78\xb9\xd4\x2a\x16\xdb\xc4\x5a\x2b\xdf\xfa\xc7\xdf\x90\x99\xf4\x86\xd8\xb5\x57\xb5\x4a\xea\xb1\xad\x6c\x0c\xef\xa9\x19\x50\x94\x71\x9e\x39\x99\x62\xbd\x89\x80\xc8\xdf\x10\xe9\x0d\x21\xf2\xab\x29\xdf\xd9\xca\x5f\x59\x63\xf5\x88\x87\x0b\xc8\xac\xa5\x05\xec\x16\xcd\xee\x32\xa2\xee\xf2\x8b\xde\xb4\x8b\xc7\x58\xd1\x82\xc3\x82\x30\xbb\x8c\xb4\xaa\x16\x98\xe1\xba\x50\x00\x60\xb6\xae\x99\xa7\x9d\x7d\x98\x79\x54\xb9\x5f\x98\x3b\x13\x6f\x4b\x20\xaa\x65\x3e\xe8\x59\x22\x6d\x66\x5b\x87\x9e\xe5\xd0\x41\xce\x08\x91\x5b\xaa\xb6\xfe\x4f\x59\x1a\xe5\x65\xc6\xa2\x0c\xa6\x0c\x9f\xab\xcb\x4c\x44\x19\x4c\x09\x7e\xa1\x2e\x33\x15\x65\x50\xe7\x17\x7f\x2c\xc3\xfe\xb1\x0c\xfb\xc7\x32\x6c\xdb\xdb\xfc\x63\x19\xf6\xbf\x64\x8c\x77\x3c\xb9\x75\x8c\x77\x3c\xe9\x8d\xf1\xca\x73\xb6\x76\x8c\x77\x3c\xf9\x23\xc6\xfb\xd5\x63\xbc\xe3\xc9\xb6\x31\x5e\x15\x73\xea\x31\x5e\x64\x50\xf7\xa6\xed\x72\xed\x4c\xbd\x34\xeb\x9a\xff\xd2\x4b\xb3\x9b\x89\xf3\x4f\xb9\xb8\xa0\x6c\xe7\x8f\x28\x70\x3d\x0a\xbc\x99\xe0\x9a\xea\x68\x33\x71\xa4\xe7\x3f\x4f\x1c\x91\xa5\x1b\x4b\x8c\xa4\x3c\xd1\xb7\xca\xe9\x26\xf5\xef\xed\x0f\xaf\x7f\x7d\xfd\xe2\xc5\xbb\xa3\xd3\x77\xcd\x68\xf1\x9b\x97\xbf\xbe\x3c\x79\x7e\xf4\xf3\x51\xfb\x56\xee\xb7\xaf\x7f\x3c\x79\xfe\xeb\xb3\xd7\x27\xef\x4e\x9f\x9e\x94\x35\xa5\xe6\x78\x58\xf9\xd9\x76\x61\x65\xa9\x46\xba\x48\x8a\xa4\x2d\x8d\x98\x74\xd1\x34\x9b\x5d\x13\x03\x6e\x74\xa9\xca\x73\x1e\x12\xc9\xe1\x11\x58\xce\x43\xc8\x15\x21\x11\xa9\xcf\x67\x1b\xd8\x85\x31\x3c\x80\x1b\x7e\x7a\x30\x2f\x0e\x69\xe2\x37\x6b\x88\x91\x4a\xf8\x16\x26\x2d\x5f\x04\xdd\x40\x7a\xfd\x33\x1c\xc2\x0d\x7c\x0b\x63\x95\x97\x48\xaf\xff\x9d\x41\xb5\xe0\x01\xb0\x76\x6c\xd6\xce\x50\x51\x78\xc3\xc3\x72\x3f\x37\x1e\xdf\xf0\xc7\xff\xae\x09\x05\x4b\x64\x5b\x47\x10\xe1\x75\x02\x0a\xa2\x95\x94\xd9\x70\xca\x6c\xf8\x01\xcd\x8d\x82\x30\x65\x51\x4e\x5d\xb8\xe1\x45\x6f\x34\x61\xa5\x4a\x40\xea\x64\xbc\xc1\x0b\x7e\xda\xbd\x66\x74\x6d\x76\xfd\x73\x6f\xdf\x1a\xab\x1c\x75\x69\x38\x7e\xf1\xee\x2d\xc3\x75\x63\x12\x95\x30\xc8\xf7\x4e\x68\xe2\x63\xac\x18\x36\x51\x08\xeb\xab\xec\xba\x21\x5b\xca\x62\xc7\x45\x31\x0d\x09\xc5\xcd\x13\xbf\xc1\x23\x98\x3e\x84\xdf\x3a\x22\x73\xd8\x07\x3c\x9a\xaa\xce\x8a\x52\x34\xef\x47\xf9\x9b\x24\xc3\x3c\xae\x4c\xaa\xf0\xb2\xdc\xdf\x86\xb0\x07\xaa\xdd\xd4\x05\x70\xb9\xd2\x23\x10\xf9\x22\x54\x85\xd9\xa7\xd5\xc1\xf7\x87\x80\xcd\x48\x50\x34\x6d\xd5\x77\x54\xcb\xad\x3e\x3e\xc4\x66\xf5\x9b\xab\x5b\x2d\xbf\x92\x5a\xae\x81\xda\x53\xcc\x7b\x4a\x04\xb6\x0b\x2d\x49\x82\x15\xd3\x4d\x8e\x02\xd4\xc3\x16\x57\xbf\x13\x7d\x7f\x1f\xde\xa4\xd1\x2a\xca\xa3\x2b\x0a\xeb\x64\x79\x13\x27\xab\xc8\x5b\x42\x72\x45\x53\xf8\xfe\xc5\xc0\x1a\x1e\xc0\xe6\xbd\x0b\xbb\xb0\x79\x3f\xc1\xbf\x63\xfc\xeb\x30\x33\xa3\x06\x29\x24\x9a\x37\xcf\xcf\x0f\xbc\x07\x73\x33\xed\xd8\x32\xaf\x41\x4e\x40\x38\x54\xca\x47\xcf\xa2\x57\xc3\xc0\xf3\x18\x9f\x18\x7e\x8a\x04\x63\x4d\x9e\x19\x2d\xf9\x19\xde\x76\x35\x25\x43\xfd\xc9\xe9\x6a\x9d\xa4\x5e\x7a\x53\xbb\x89\x8e\xa9\xc0\xa9\x3c\x10\x69\x57\x29\x95\xb7\xce\xa8\xb5\xff\x54\xd9\xb3\x3e\xbc\x1b\x6b\x3b\xf6\x76\x2b\x3b\x76\x6d\x5d\xc7\xee\x5a\xd5\xf9\xfa\x57\x09\x24\x97\xf9\xfa\x32\x3f\xc6\xa9\x75\xad\x2c\xa0\x93\x1e\xd2\x2c\x4a\x69\x28\x5d\x34\xe0\x47\x79\x56\x24\x84\xe6\x95\x6b\xb3\x85\xa2\xf2\xeb\x78\x59\xb0\x49\xca\xc1\xed\xa5\xf4\x00\x2c\xcb\x31\xc0\x1a\x4f\x0c\xb0\x5d\xc7\x80\x31\xb1\x9a\x95\xc5\x9d\x05\x07\xec\x9d\xfc\xaa\x79\x69\x41\x31\x69\xd6\xde\x5b\x20\xf7\xae\x01\xed\x0e\xf7\x17\x60\xa4\x16\x6f\x42\x2c\xe6\xde\xc5\xaf\xb3\x73\x8d\xb5\xdf\x42\xd4\xd8\x07\xe1\x70\x91\x8b\xe9\x75\x29\x76\xb8\x08\xd7\x97\x4a\x00\x31\x29\x6f\xeb\xc5\x11\x60\x62\x9a\xb0\x07\x6c\xa0\x2d\x6f\x4a\x90\x29\xc1\xbc\x17\xdb\xfa\xbd\x56\xf4\x14\x81\x39\x05\xd1\x94\xc1\xb3\xa2\x13\xc7\x5e\x8c\xb1\x9f\x46\xd7\xf6\xc1\x52\xc5\xd0\xfc\x2c\x49\xfd\x7e\xfa\x37\xc0\x7f\x49\x26\xc1\x57\x56\x04\xf5\x45\x31\x46\x6b\x6d\xd8\xfc\x95\x85\x77\xd0\x37\x8b\x33\x5b\xdf\x95\xcc\x42\x7b\x05\x35\x6b\xbe\x33\x9f\xa0\x55\x4b\x24\x68\xdd\x25\x83\xa0\x55\x4b\x1d\x68\xdd\x3d\x67\xa0\x40\x98\xf4\x61\x4c\xea\x28\x93\x3b\xe1\x4c\xea\x48\x93\xdb\x60\xad\xe4\x03\x17\xae\x32\x34\x12\xc5\x79\xc2\xa5\x59\xcd\xe9\xa5\x87\xc1\xbc\x42\x9d\x15\xa4\x60\x25\x46\x78\xdf\xec\xfb\x43\xa4\x8b\xae\xcc\x32\xb9\x06\x51\xa6\x7f\x35\xe2\x2d\x1b\x60\x33\x8d\x0e\x70\x47\x19\xf5\x80\x7f\xe5\x4e\x2f\x7e\xd7\xab\xc0\xe9\x82\xe6\x5e\xfb\xcd\x2d\x66\x0d\x12\xb0\x57\x11\x9b\x82\x2c\x2f\x57\x31\x76\x4e\xa1\x56\x05\x05\x0b\x37\xdb\x80\xca\x93\x56\x16\xbe\xe5\x9c\x44\x6e\xa3\xc6\xa5\x6a\x86\xa2\x69\x88\x7d\x0a\xd7\xb3\xe4\x5e\x57\xd9\x63\xa9\xec\x32\xb9\xd6\xfa\xa5\x5a\x6a\x9d\x2a\xfd\x1c\x55\x4f\x4e\x19\x17\x4e\xcf\x36\x3a\xdc\x4f\x37\x5c\xd6\x0e\xb1\x07\xfa\x42\x28\x6c\x87\x88\xfa\x76\xbb\x6f\xee\x26\x06\x1d\x66\xb5\xea\x91\x83\x5d\x1a\x30\xbe\x38\x38\x3d\xec\x5a\x2c\x3f\xdd\x90\xaa\x38\xd9\xa6\x38\x97\xaf\xd3\x0d\xe9\xe2\xa3\x28\x7b\x5c\x96\x45\x3e\x76\x8a\x77\x76\x99\xa2\x46\xf1\xeb\x44\x98\xa8\xf7\x4b\xf9\xe9\xc6\x11\xb6\x00\x06\x03\x81\x5b\x79\x34\x58\xb4\x2f\xce\x07\xeb\xa6\x37\x08\xed\xb8\x84\xc6\xad\x06\x87\x76\xdc\x80\xf6\xaa\x1f\xda\x3f\x55\xa9\x6a\xa6\xb0\x43\x3e\xa1\x69\x12\x35\x62\x0a\xb7\x9a\xed\xbd\x5d\x24\xf0\x26\xea\x90\x6c\xd6\x64\x71\xe7\x23\x79\x28\xfd\xe4\xae\x5c\xf9\xfb\x8b\x45\xbe\x46\xb9\x12\x6c\x97\x18\xb3\x42\x5c\x82\xfa\x0c\x52\x51\xfa\xb8\x2a\xad\x37\x49\x38\x58\x2c\x92\xd7\xdc\x4b\x39\xac\xc5\xc3\x64\xbc\xb4\x9d\x7d\x9b\xa0\xa3\xd7\x61\xe2\xd9\x04\xba\x6a\xa2\x37\xf0\x20\xe9\xca\xa0\xe8\xf4\xa3\x47\x15\x92\x28\xda\x45\xff\xf0\x2a\x4d\xdb\x82\x3d\xe9\xbd\x4e\xd0\xa1\xae\x3a\x25\x0c\x25\xf0\x57\xb7\x04\x5e\x8f\x79\x54\xdd\xdd\x2a\xe2\xd1\xec\xb2\xc0\x4a\x02\x83\xd1\x8e\x36\x72\x13\xe7\xce\x3d\x7f\xd5\xd3\xc6\xf1\x2d\xdb\xe8\x1a\xdb\x52\x2f\xce\xd6\x49\xd6\x29\x25\x68\x7e\xdf\x44\xc7\x5c\x31\x4e\xcf\xa4\x80\x62\x25\x87\xda\x31\x8f\x57\xdc\x66\xe0\x13\x25\xfb\x46\x3f\xad\xfd\x58\x47\xe0\xe5\x38\x04\xa2\xbd\x54\xfb\x84\xa7\x26\xf6\x41\x99\xb4\xb5\x9c\x1c\x99\xa5\x01\x50\x96\x3b\x35\x8b\xee\xf0\xd2\x3a\x95\x3f\x35\x8b\xce\x88\x72\x9a\x71\x6b\x7f\x1f\x9e\x2d\xba\x8c\xdf\xf6\xc3\xfa\x1d\x87\x8c\x7e\xd3\x08\x92\xf9\x2a\xec\x70\x39\xae\xf4\x08\xf7\xed\x4c\x6a\x51\xeb\xb4\x14\xb8\xed\xab\x6c\x48\x59\x69\x20\x39\x21\xc3\x6d\x06\x40\x0e\xc0\x6a\x00\xb0\x5a\x00\x3a\xa9\xc8\x7c\x8f\x34\xb9\xee\x20\xe2\x52\xd2\x86\xd3\x4a\x35\xde\xc3\xe0\x1f\x02\x7d\xfe\xe0\x7e\x81\x0c\xfe\xec\xb2\x1f\x4b\x49\x6b\x4e\x2b\x15\x92\x21\xe2\x83\x0a\xe2\x32\xb9\xfe\xf2\x00\xed\xcb\x44\x35\x23\x69\xf1\x5b\xab\x69\xb5\x30\x24\x1b\xdf\x1a\xc1\x4c\x7c\xdf\x3b\x69\xab\x41\xd1\x29\x62\xcd\x5f\xa9\xd7\x60\x2a\xd9\xb1\xd8\xf1\x5f\x6b\x5b\x94\x22\x48\xf3\xd5\x77\x45\xb5\xca\x97\x11\x1f\x56\xaf\x1d\x06\x7a\x80\xc1\xab\x76\x1c\xe8\xae\x7b\xa9\xc8\x5d\xb6\x52\xe1\x26\xa9\x80\x46\xcb\xfa\x7e\x27\x32\x84\xfd\x3a\xfe\x43\x78\xd0\x7c\x80\x8d\xe3\x02\x4d\xb9\x9b\xeb\xbf\xc8\x26\xa8\x2f\x8e\xe1\xc9\x61\xc6\x02\x79\x65\x0c\x12\xf6\x95\xac\x97\x8b\x14\x51\xc0\x36\xcc\x7d\xe5\x66\xba\x77\x1f\x2f\x29\xfd\x1b\x6d\x03\x5d\x78\xd9\xa2\x10\xee\xad\xee\xa2\x6f\x61\xf1\x25\xc1\xc2\xfe\x98\xd0\xf6\x2e\xbd\xce\x9d\xbf\x7d\x0c\xb1\x6a\x4f\x1f\x95\x93\x5c\x43\x11\x98\x93\x1d\xce\x5b\xc5\xe6\x24\x50\x22\x3c\x27\x83\xba\x6b\x5c\xb1\x22\x45\x77\x27\x8e\x5b\x9d\x38\xbe\x6b\x27\x8e\x5b\x9d\x38\xbe\x5d\x27\xd4\xac\xe2\xa2\x2b\x94\x2c\x4f\x20\xa5\x79\x1a\xd1\x2b\xaa\xd8\x80\x08\xe2\x70\x37\xb7\x07\xeb\xcb\x6c\x51\xa0\xa1\x22\x91\xa2\xe4\xab\x76\xc9\x2f\x4f\x4f\xac\x38\x3d\x54\x36\x6d\xb4\x55\x58\x7b\x9e\xe8\x2b\xed\x9a\xd4\xdb\x2f\xb1\x85\x52\x61\xce\xca\xc3\x4e\x5b\x58\x88\x2d\x17\x73\x8a\xaf\xd5\xfe\xcc\x4e\xb2\xff\xb1\x5d\xf3\x8e\xdb\x35\xed\xdb\x6e\xd6\xb4\xfb\xb6\x6a\xda\x1d\x1b\x35\xed\x3f\xb6\x69\x7e\xed\x6d\x9a\xf6\x96\x9b\x34\x15\x6c\xa9\x6d\xd1\xb4\xb7\xd9\xa0\x69\xeb\x8f\xe1\x97\x1b\x0f\x0f\x5c\xe7\xf3\xb9\xe1\x92\xff\x26\xdb\x35\x9b\x09\x76\xc6\xc4\xfa\xa7\xed\xe1\x2c\xd2\xed\xb0\x36\xff\xb5\xd2\xed\xdc\x69\xb7\xa5\x78\x5d\xed\xf6\x2c\xca\xdc\x2a\x21\xcf\x98\x58\xb5\x6d\x21\x63\x62\x69\xb7\x99\xb8\x5b\x26\xe4\x61\x05\x6b\x5b\x4d\x5c\x91\xd5\x62\x4c\xac\xaf\x76\x84\x58\xee\xbe\x36\x27\x4f\x6b\x93\x83\xb9\x09\x7c\xdf\x9f\x85\xe3\xd0\x90\x12\xf6\x0c\x0d\x55\xc9\x89\x35\xf3\xac\x99\xe5\xc9\xe9\x7c\x86\x8a\xbc\x3d\x8a\xaa\x33\x32\x9e\x99\x64\xec\xc9\xd9\x7f\xd4\x8d\x90\xb1\x35\xa7\x01\xcf\x19\x54\xe4\x06\xda\xb2\x91\xc9\xd4\xb6\xad\xc9\x84\xa7\x15\x12\x99\x83\xd4\x8d\xb8\xd4\x77\x1c\xcf\x9d\xca\x79\x85\xb6\x6c\x24\xf4\xcd\xc0\xa2\x66\x28\xa7\x21\x52\x37\xe2\x4c\xfd\xb1\xe3\x92\x50\x4e\x52\xd4\x70\x4d\xbf\x76\x96\x22\x26\x4f\x77\xcc\x52\x44\x26\x7f\xa4\x29\xfa\x4a\x3e\x91\x7b\xeb\x34\x45\xac\x4a\x9f\x5f\x24\xdb\x8c\xb6\x67\xe4\xfe\x91\xa6\xe8\xeb\xfb\x46\xee\xb6\x69\x8a\x94\xcc\xa9\xfb\x47\x6e\x6f\x9a\x22\xdb\xed\x4e\x53\xc4\x86\xf1\x03\xd7\x52\x79\x4b\xd6\x7f\x13\x6f\xe9\xbf\xf5\xe1\x96\xaf\x7b\xb0\xe5\x77\x3a\xb2\x72\x77\x27\x8a\xbf\x2a\xbb\x2b\x00\xfd\x5a\xec\xe0\x55\xdc\x75\x53\xdf\xe4\x3b\xf2\xd6\xeb\xe5\xcd\x40\x3c\x34\xc0\x4b\x2f\x2e\x57\x34\xce\xb3\xe6\x9d\x3c\xf2\xf1\x99\x0a\x1f\x4c\xa5\x54\x35\xd1\x68\xde\xdc\x38\x96\xeb\x59\xf3\x19\xfa\x15\xe1\xd4\x72\x3d\x6a\x59\x43\xa3\x5d\x6e\x4a\xec\xa9\xe3\xcc\x30\xcd\xa0\x65\xd3\xf9\x64\x1c\x84\xb2\x6b\xd0\xaa\xe0\x8f\x03\x73\xee\x07\x73\xbc\x00\x21\x70\x42\xdb\xb7\xe6\x2a\xc0\x74\xe6\x8f\x43\xdf\x1b\xe3\xed\xd9\xc4\x9d\x85\xbe\x1f\x74\x02\xb6\x67\xe3\x49\x60\x8d\x7d\x74\x67\x6c\xc7\xf5\xc7\xb6\xab\x02\x3c\x9e\xcd\x09\x21\x73\xc4\xd8\x9f\x98\xe3\xd0\x24\xb3\x4e\xc0\x33\xcb\x9e\xbb\x96\x87\x57\x6e\x7b\x73\x32\x73\xe6\x33\x5f\x05\xd8\xf3\x49\x30\xa6\x21\x62\x1c\x7a\x93\xd0\x25\xc4\xed\x04\x1c\xba\xe6\xd4\xf3\x38\x8d\x3d\xdb\xb4\x4d\xcb\x51\xd2\x98\x58\xae\x3d\xf6\xf9\x9d\x11\xce\x78\x6a\x4e\xe6\x3e\xed\x04\x6c\x39\x36\x71\xc7\x3e\xde\x1d\xe1\x50\xea\xf8\x96\x1b\x28\x49\x31\x36\x83\x69\x18\xe0\x05\xe2\xe1\x78\x3e\xf7\x1d\x6a\x75\x02\x9e\x5a\x3e\x1d\x87\x53\x24\xc5\xdc\x9a\xfa\xee\x6c\xa2\x64\x9e\x6b\x86\xd4\x27\xfc\xf2\x0a\xdb\x27\x93\xd9\xc4\x27\xdd\x34\xf6\xc3\xc0\x9c\xf0\x0c\x95\xd6\x38\x98\x12\xcb\x1e\xab\x00\x07\x64\xe6\xcf\x09\x47\x20\x98\x4f\x66\xd6\x64\xe6\x74\x02\xa6\xce\xcc\x9f\xcc\x02\xa4\xdd\x8c\xce\x89\xe3\x85\x4a\x1a\xd3\xb9\x4f\x9d\xa9\x8b\xd7\x88\xdb\xae\x33\xb7\xc6\xd4\xee\x04\x6c\xce\x03\x32\x0b\x03\xac\xe0\xfa\x6e\x10\x8e\x7d\x25\xc6\x96\x63\x06\x1e\x09\x02\xbc\xa4\x7d\xea\x05\xb3\x60\x32\xee\x66\x5e\x48\x67\x56\x30\x41\x05\x19\xcf\x2c\xdf\xb4\xa6\x4a\xc0\x8e\x37\x75\x5c\xc7\xc3\x39\xc2\x84\x7a\x13\xea\xb8\xdd\x18\x8f\x03\xdf\xf4\x66\x21\x62\xe2\x87\x0e\x99\xfb\xa1\xa3\x54\xe9\xc9\x7c\xe6\xba\x21\x02\x76\x6d\x42\xc6\xb6\xdf\x8d\xf1\xcc\xb5\xe9\x98\x8c\x2d\x54\x69\x3a\x99\x84\x73\x4f\xad\x20\xae\x4d\x82\xc9\x04\x3d\x7c\x2b\xf4\x1d\xdb\x22\x66\xb7\xad\x30\x4d\xdb\x9a\x06\x2e\xbf\xf3\x7d\xee\x5b\xc4\x56\x8a\x9b\x3f\x1f\xcf\xa6\xf3\x40\xe4\x37\xa5\x73\x93\xd2\x6e\xa9\x08\x26\xd4\x34\xfd\x39\x0a\xbe\x1d\x7a\xae\x3b\x0f\x94\x52\x11\x8e\xbd\xe9\x8c\x38\x08\x78\x66\x9b\x9e\x37\xb5\xba\x49\x61\x4e\x02\x6f\x62\x8f\xf9\xf5\x2e\xa6\x69\xbb\x96\x5a\x41\x88\x63\xcd\xac\x19\x9f\x7b\x99\x9e\x49\x27\x74\xda\x4d\x0a\x6b\xea\x4f\x4d\xcf\x45\xe3\xe2\x4c\x42\xcb\x9a\xcf\x95\x2a\x6d\x51\xc2\xc8\x84\x24\x1b\x07\xd6\x24\x98\x59\x93\x4e\xc0\x4e\x68\x05\x93\x70\x8e\x52\x31\xf6\x02\xc7\xf2\x68\xa8\xb4\x15\xb6\xed\x9a\x21\x41\x92\xcd\xc2\xd9\xd8\xb7\xc3\x79\x27\xe0\xc9\xd8\xf4\xa6\xf6\xd8\xe1\x0a\xe2\xcd\x27\x76\x48\xd5\xe2\x36\xf1\x4c\xcf\x47\xbb\x6d\x07\xd3\xa9\x6f\x79\xdd\x66\xd3\x25\x81\x15\xcc\x2c\x6e\xdd\xa6\x34\xf4\x28\x9d\xa8\x00\xcf\xac\xa9\x65\x05\x9c\x64\xc4\x71\x2d\x7b\x6c\xfb\x9d\x80\x3d\xcb\x9f\x53\xd7\xe3\x76\x36\x98\x13\xd3\x9e\x28\x15\xc4\x73\x89\x37\x99\x38\x88\xb1\x1f\x38\x96\x6d\x9a\xdd\xd6\x2d\xb0\x1c\xdf\xf5\xa7\x26\xda\x59\x73\xee\xce\xa6\x33\xa2\xb4\x6e\xd3\x49\x30\x26\x1e\xd2\xd8\x9c\x8c\x1d\x9f\xda\xdd\x52\x11\x92\x99\x45\x5d\x32\x43\xc0\x13\x3a\x1f\x5b\x44\x39\xe6\x85\x93\xd9\xcc\x9c\x58\xc8\x8b\xf1\x78\x32\xf6\x66\x3d\x9a\x37\x77\x4c\x6a\x8f\x39\xed\xc6\xd3\x29\xb1\x4c\xcb\x53\xca\xb1\x39\xf1\x3c\x93\xf7\xcc\xb6\x7c\x3f\x24\x7e\x37\xf3\xc8\xcc\x73\x02\x42\xd0\x6c\xfa\x6e\x68\x85\x66\xa0\xc4\x98\x50\x7b\x3a\x09\x4c\x2e\xc7\xc4\x21\x9e\x3f\xee\xb6\x6e\xd6\xd4\x71\xa7\x53\x07\xe5\x38\x9c\xbb\x94\xfa\xb3\x99\x0a\xb0\xed\xf8\xa6\x1f\xf8\xd8\x33\x4a\x66\xbe\xe3\xf6\x88\x9b\x3d\x23\x81\x19\xf8\xc8\x94\x60\x1c\xcc\xc6\xde\xc4\x56\xda\x63\x1a\xba\x9e\xe7\xa0\xd9\xa4\xb6\x43\x5c\x2f\xe8\x16\xb7\xb1\x3f\x0b\x02\xcf\x99\xf3\x91\x61\x62\x53\x7b\xaa\x04\x3c\x71\x2d\x3a\x99\x73\x63\x15\x4e\x7c\xcb\x77\xbd\x6e\x52\x4c\x1d\x77\xee\x5a\x14\x15\x64\x1c\xd2\xb9\x6f\xa9\x6d\xc5\xd4\xf5\xc6\x13\x9b\x8f\x34\x8e\x4d\xa6\xd6\x7c\xd2\x2d\x15\xae\x13\xb8\x53\x97\x70\x4f\x88\xcc\x4d\xcf\x9f\x2a\xcd\xa6\x1b\x04\x53\xd3\xe2\xcc\x23\xde\xc4\xb1\x67\xb4\xdb\x77\x9b\x99\x3e\x9d\xcf\xe7\x1e\xf7\x22\x27\x36\xa1\x96\x52\x2a\x3c\x67\x6c\x4e\x02\x8a\x9a\x17\x52\xd7\xf2\x43\xda\xed\xbb\xf9\x74\x3e\xf3\xec\x39\x1f\x19\xac\x60\x32\x9d\x11\xb5\x5f\x31\x99\x92\xa9\x3b\xe7\x43\x98\x3d\xb5\xc6\xb6\xd5\xcd\xbc\xc0\xb3\xa6\x36\x0d\x90\xc6\xd4\xb3\x26\x13\x32\x53\xd2\x38\x24\xee\xc4\x77\xf9\xd0\x64\x31\x41\xb2\xea\x41\xc0\xb6\x23\xe2\x85\xde\x34\x0c\x51\x41\x82\x90\x9a\xd4\x27\x4a\xb3\x39\x1f\x4f\x43\x67\x3e\x9d\x8b\x41\x97\x86\x64\xda\x2d\xc7\xe6\x64\x6e\x4e\xa6\xdc\x5f\x98\x5a\x64\x3a\x99\xfb\x4a\x95\x36\xbd\x89\x3d\x0d\x03\x54\x10\xcf\x0a\xdc\x99\xeb\x75\x8f\x20\x84\xd8\xf3\x99\x6b\x3a\x22\x70\x37\x33\x43\x4f\x89\x31\xf1\xa7\xc4\xf4\x6d\x6e\x8f\x6d\x12\x38\x53\xd2\x4d\x63\xcb\x0d\xfd\xe9\x74\x3e\xe6\x52\x61\x3a\xd3\xd0\x55\xda\x63\xdb\x0a\x3c\xcf\x9f\xa2\x54\x38\x66\x30\xb5\x9c\x59\xb7\x82\xd8\xc1\x8c\xfa\xd4\x44\x52\x90\x71\x30\xf3\xa9\xaf\x64\x9e\x63\x93\x70\x32\x0d\xb0\x67\xb3\x80\x98\x66\xe8\x74\xcb\xb1\x13\x04\xe3\xd0\xe1\x8e\x77\xe0\xdb\xd4\xb1\x7c\xe5\xd0\xc4\xdc\x15\x6b\x36\x43\x63\x35\x0f\x26\xe3\x29\x65\xe6\xb5\xcb\x56\xcc\x03\x7f\x32\xf7\xf8\x20\xe9\x85\x93\xb9\x47\x95\x18\x4f\x02\xc7\x21\x33\x17\x01\x3b\x9e\x33\x1d\xbb\x64\x2a\x82\xa8\xe7\x1d\xc7\x56\xab\x79\xe1\x4f\x77\x3d\xa1\xaa\xbb\x06\xed\xa7\xda\x09\xd5\x5f\xef\x76\x42\x75\x4c\xac\xed\x96\x0e\x14\xcb\x11\x5f\x3f\xfb\xe8\x5d\x97\x0e\x26\x9e\x39\xa3\x45\xc0\xdd\xf6\x83\x60\x66\x6a\x96\x0e\x7c\x7f\x32\xf5\x28\x1f\x7e\x5d\x27\xf0\xbc\x69\xdd\x75\xe9\x68\xc4\x0e\x26\x74\x6e\x4f\xd1\x92\xcd\xe9\xcc\x99\xbb\xcc\x92\xa9\x4a\x7a\x63\x67\x3e\x1f\xdb\xa8\x05\xe3\x39\x09\xed\xc9\x7c\xdb\xa8\xfe\x98\x98\x74\x6c\x71\xe3\xe3\x85\x74\xe2\x5a\xa1\x66\xe9\x60\xe6\x9b\xe3\x89\xcb\x05\xd2\xf2\x6d\x3a\x09\xc8\x7c\xcb\x46\xc8\xdc\xb5\xc3\x19\x97\xf9\xb9\xef\x10\x3f\x9c\x68\x7a\x32\xf6\xa9\x19\x84\xdc\x0d\x22\xf6\x94\x5a\x64\x3a\xbb\xcd\xd2\xc1\xd7\x3e\x47\xba\x4d\x6a\x58\x2c\x67\xea\x33\xbf\xfe\x40\xf4\xa9\x5f\x7f\xb0\xf4\xb9\x5f\x7f\xb0\xf5\xc9\x5f\x7f\x70\xf4\xd9\x5f\x7f\x18\xeb\xd3\xbf\xfe\x30\xd1\xe7\x7f\xfd\x61\xaa\x49\x00\xcb\x3b\x88\xe9\x61\x95\xfb\xc0\xf9\xfb\x25\x7f\xdf\x3e\xec\xc1\x69\x80\xd5\x95\x47\xa0\xf8\xfb\x25\x7f\xaf\xa9\x6e\x61\x75\x4b\x5b\xdd\x5a\xf2\xf7\x9a\xea\x36\x56\xb7\xb5\xd5\xed\x25\x7f\xaf\xa9\xee\x60\x75\x47\x5b\xdd\x59\xf2\xf7\x9a\xea\x63\xac\x3e\xd6\x56\x1f\x2f\xf9\x7b\x4d\xf5\x09\x56\x9f\x68\xab\x4f\x96\xfc\xbd\xa6\xfa\x14\xab\x4f\xb5\xd5\xa7\x4b\xfe\x5e\xb1\xad\x6f\xcb\xa4\xc7\x5c\x32\x54\xc0\x3d\x2e\x14\xcd\x8c\x7b\xb8\xe5\x96\x0b\x84\xaa\x96\xcf\x65\x41\x55\x2b\xe0\x72\xa0\xaa\x15\x70\x11\x50\xd5\x0a\x39\xfb\x55\xb5\x42\xce\x79\x55\x2d\xca\xb9\xae\xaa\x45\x39\xc3\x55\xb5\xe6\x9c\xd9\xaa\x5a\x73\xce\x67\x55\xad\x0b\xce\x63\x55\xad\x0b\xce\x5e\x55\xad\x05\x67\xad\xaa\xd6\x82\x73\x75\xa9\xca\x3b\xd8\x75\x74\x77\xcb\xeb\x50\xb5\xf9\xb4\x8b\xf6\x7f\x8a\x78\xee\x61\xdd\x71\xf3\x23\x1c\xc1\x8b\xe5\xb3\x76\x91\x2d\x12\x45\xf3\x66\x18\x09\x7e\x8a\x8a\xd3\x06\x72\xd6\x68\x78\x00\xd6\x39\x96\x54\xe7\x72\xad\x60\x2c\x39\x0c\x71\xbe\xa0\x09\x03\x4f\xcd\xdf\x29\x03\xf5\xfe\x3e\x7c\x8f\xd9\x88\xf5\x8d\x17\x29\x9d\x6f\x95\xa1\x7a\xb3\x28\xf3\x1c\x6f\xfa\xce\xe2\x89\x62\x4b\xa9\x46\xf7\x79\x3c\x5e\x6a\x51\xcb\x82\xbd\xe0\xc9\x7f\xe5\xe4\xd5\x4b\x4c\x51\x5c\xa4\x03\xae\x95\x73\x5b\xe5\x70\xd3\xeb\x7b\xa8\x17\x9b\x76\x9d\x30\xe5\x25\x97\x35\x2c\x96\x6d\x2c\x16\x2a\x2c\x96\x6d\x2c\x16\x32\x16\xf5\x72\xd3\x76\x39\x4d\x26\x63\x99\xa5\x9a\x9c\x39\x57\x52\xee\xed\xdb\x24\xdf\xae\x38\x4a\xb6\xe3\x28\xa9\x38\x4a\xb6\xe2\x28\x59\xd4\x12\x7c\x2f\x8a\x2c\xdc\x52\x62\xee\xa5\xc8\xd5\x2d\x11\x89\x08\x0a\xd7\x8b\xe1\x3e\xe6\x99\xc4\xd2\x02\xde\xa4\x97\xa5\x64\x59\x43\x63\xa9\x40\x63\xa1\x42\x63\xd9\x42\x63\x51\x43\xa3\x0e\x70\xd2\x82\x67\x4d\x3a\x79\x7a\xab\xdc\xe1\x5d\xa6\x64\x5a\xb1\x7d\xda\xc5\xf6\x9f\xa2\x29\xb7\x5c\xca\x81\xb9\x51\x72\x29\x4a\x76\x9c\x09\xe7\x25\xc9\x44\x32\x24\xda\x5b\xa1\x8b\xb2\x1c\x01\xa2\xf4\x2c\x9a\x65\x97\x45\xd9\x5e\x1c\x2a\x4b\xb3\x64\x44\x8b\xa6\xcd\x91\xab\x5e\xbc\x32\x65\x0b\x5e\x7c\x81\x39\xdb\x18\x1c\xc6\x49\x73\x08\x8f\x0a\xed\x2c\x9f\x3c\x01\x02\x07\xd0\xda\x36\xdd\xc6\x83\xfd\x2d\x38\xd8\x8f\x06\xfb\xbb\x5b\x6a\x8b\x06\x0b\x72\x57\x2c\x90\x8a\x5b\xe2\xc0\xb9\xd3\xc6\x80\x73\xa2\xd5\xbe\x1a\x68\x35\x2a\xfe\x14\xe9\xd8\x5b\x8d\x7a\x3f\x45\x2a\xe4\xf4\x39\xf1\x45\x52\xfc\x05\xdc\x87\xf9\x42\xa4\xc5\x67\x3f\xd4\xe7\xf8\x78\x1d\xae\xfb\x74\xc9\xea\x2c\x45\x1d\xf6\xe3\x62\xd9\x91\x4c\x7f\x81\xd9\xf4\x19\x68\x9f\xb7\x83\xdf\x03\xfe\xdd\x17\xdf\xf5\xd5\x97\x58\x9d\xb5\xe2\xf3\x26\xf1\x7b\xc0\xbf\xfb\xe2\x7b\x77\x4a\xfe\x05\xcf\xc9\x2f\x0c\x0e\x1f\x57\xbc\x25\x4f\x2f\x3d\xe4\xc9\x0f\xbc\x45\x91\xb1\x5f\xbc\xac\xe5\xec\x5f\x48\xb7\x48\x78\xc5\xa8\xd3\x99\x99\x1f\x67\x53\x83\x12\x90\x68\x73\x51\x6f\x73\x59\x6b\x73\x51\x6f\x73\x29\xb7\xb9\xd8\xa6\x4d\xc2\xfb\x49\xc5\xd0\xc0\xcf\x9b\x50\x3e\x28\xb8\x45\xda\xff\x45\x71\x69\x85\xf4\xd2\xa9\x5e\xb2\x36\xed\xe2\x1d\x4f\xc3\xdd\xdd\x26\xef\xa7\x28\x5c\xb4\xb9\xa8\xb7\xb9\xac\xb5\xb9\xa8\xb7\xb9\x94\xdb\x5c\x54\x6d\x2a\xbd\xce\xfe\x7b\x08\xd4\xb8\xfe\x05\xb3\x2f\xfd\x45\x7f\x98\xea\x2f\xa8\xbc\x7f\x89\xba\x8e\x51\xfd\x05\x8d\xc1\x5f\x22\x9d\x09\xbd\xc2\x8b\x12\x58\x99\xc5\xb2\x44\x51\xa5\x94\xbc\x20\x6b\x70\x51\xf5\x85\x9b\x8b\x9c\xc8\xe6\x62\xb1\x8d\xad\xaa\x9a\x65\x7f\x19\x45\xba\xdb\xcc\xb1\xa9\x60\xa1\x6a\x30\xb8\x53\x8b\x7f\x51\x9a\x9e\x66\x8b\x7f\x89\x54\x2d\xfe\x25\xba\x4b\x8b\x6a\x63\xd7\x6c\xf1\x27\x65\x8b\x3f\xa9\x5a\x54\x4b\x5b\xf3\xf2\x0a\x4d\x93\x18\xbc\x28\xd4\x1e\x0b\x6a\xb1\xc3\x38\x48\x61\x95\x76\xb9\x79\x44\x14\x2d\x19\xc5\x02\xd6\x76\x68\xfe\xb8\x0e\xbd\x9c\xc2\x75\xf7\x4c\x9f\x7d\x70\xbe\xa9\x94\x6f\x9c\x6e\x5e\xa8\xd0\xc6\x01\x68\xae\xaa\x83\x13\xdb\xb9\xaa\x0e\xce\xa1\xa9\xaa\x0e\x4e\xa1\xa9\xaa\x0e\x4e\xc9\x07\xe1\x12\xaf\xef\x58\xea\xee\xef\xc0\x39\xfd\x20\x5c\x60\x29\x4e\x3a\x2a\x53\x2e\x6c\x11\x4d\x7b\x13\x08\x83\x14\xa8\x70\xc4\x90\x42\xa0\xc2\x11\xa3\x17\xbe\xaa\x0e\x06\x2f\x7c\x55\x1d\x8c\x93\x78\xaa\x3a\x18\x26\x69\xdd\x66\xc0\x3e\x18\x76\x19\x70\x51\xcf\x2d\x2d\x31\x30\x70\x33\xe0\x74\x60\x92\xb5\x5b\x8d\x38\x9c\x1a\x79\xdb\xd9\xf9\xaa\x97\x95\x48\x31\x43\xf4\x0c\x7e\x40\xf9\xf7\x5a\xde\xc0\x0f\x65\x32\x8a\xc1\x0f\x28\xf7\x1e\x47\xf6\x07\x53\xc6\xd6\x6b\x23\xdb\x84\x23\x45\x19\x79\x83\x48\x22\xbf\xdd\x20\xa9\x1a\x44\xf2\xf8\xa2\xc1\x9a\x25\xf0\xfb\x1b\x94\xe2\x92\xbc\x41\x0b\x4d\x6c\xbb\x41\xab\x6a\xd0\x5a\x14\xe3\xd2\x00\xcb\x4b\xe6\xb5\xbf\x41\x29\x92\xc9\x1b\xb4\x59\x83\x61\xbb\x41\xbb\x6a\xd0\x66\x6d\x85\xa2\x41\xbb\x47\x1d\x9a\x70\xa4\xd8\x27\x6f\xd0\x61\x0d\xd2\x76\x83\x4e\xd5\xa0\xc3\xda\xa2\xa2\x41\x47\x6e\x90\xf6\x37\x28\x45\x4b\x79\x83\x63\xd6\xe0\xbc\xdd\xe0\xb8\x6a\x70\xcc\xda\x9a\x8b\x06\xc7\x72\x83\xf3\xfe\x06\xa5\xf8\x2a\x6f\x70\x82\x93\x8a\x76\x83\x93\xaa\x41\xf4\xde\x2f\x44\x83\x93\xda\x24\xa2\xbf\x41\x29\x22\xcb\x1b\x9c\xb2\x06\x17\xed\x06\xa7\x55\x83\x38\x6d\x12\x63\x32\x2b\xdf\xe5\x04\x7c\xf1\xd9\x8b\x3f\x2e\xc5\xf9\x7a\x97\xe2\x10\xe6\xdc\x8b\x9b\xcd\x18\x30\xcc\xc3\x62\x9b\x5f\xfb\x5a\x1c\x75\x33\xe4\xbf\xe4\xc5\x38\xcf\x92\xf8\x8a\xa6\x3c\xcb\x2f\xe4\x09\xd8\xd6\x9e\x1f\xe5\xcc\x41\x09\xc1\xc3\xfd\xd9\x3e\x9d\x27\x29\x15\xdb\xa9\x5b\x5c\x93\xce\x9a\x48\x6b\x77\x79\xf2\xb3\x6d\x7d\x8d\x8b\x78\xfe\x55\xaf\xe0\x91\xf1\x2c\xf3\x83\x1c\x00\x31\x2d\x67\xdf\x16\x79\x8a\xff\x38\xdd\xa4\x3d\xaa\x34\x26\xd6\x6d\x4f\x37\xb1\x2a\x3d\xa7\x9b\x6a\xdb\x1a\x5a\xa7\x9b\xc6\xc4\xfa\xe3\x74\xd3\xd7\x3e\xdd\xc4\xb8\xb2\xdd\xe9\x26\x25\x73\x6a\xa7\x9b\x38\x83\x3a\x4f\x37\xf1\x73\xb4\x5b\x9e\xfe\xb6\xff\xa5\xcf\x33\xd1\x38\xd8\xf3\xbd\x8c\x4e\x9c\xc6\x8b\x55\x38\x6e\x16\xbd\x5a\x7f\x08\xe7\x8d\x87\x41\xb4\x5e\xd0\xf4\x9f\x72\x24\x4a\x42\x15\x7f\x33\x0c\xf9\x0b\x8e\x18\x7e\x97\xf1\xf9\xef\x70\x74\xea\xa7\xad\xee\x04\xc2\xcd\x33\xcf\xb0\xeb\x65\x39\xe9\x59\xff\x51\xa8\xfd\x7d\x78\x43\xd3\x15\x8e\xa2\xcf\x16\x49\x14\x50\x20\xcd\x6b\x53\x58\xf5\x37\xcf\x48\xfd\xec\xd2\x78\x6a\x80\x33\x33\xc0\x21\x06\xd8\xb6\x01\xd6\xd8\x00\x32\x35\x60\x66\x00\x10\x69\xab\xd1\xd8\x35\x60\x6c\x1a\xe0\x58\x06\xd8\x8e\x01\xd6\xc4\x00\xe2\x1a\x40\x4c\x03\x2c\xb9\xdc\xcc\x80\x31\x31\xc0\xb1\x0d\xb0\xc7\x06\x58\x53\x03\xc8\xcc\x00\xc2\xe0\x4b\xe5\x26\xa6\x01\x63\xcb\x00\xc7\x31\xc0\x9e\x18\x30\xb1\x0d\x18\x8f\x0d\x70\xa6\x06\xd8\x33\xa9\xa0\x4d\x0c\xb0\x6c\x03\xc8\xd8\x80\xa9\x01\x30\xb1\x0c\x18\x3b\x06\x38\x78\xb5\x80\x5c\x90\x61\x62\x19\x40\x1c\x03\x26\xac\x20\x31\x60\x6c\x1b\xe0\x8c\x0d\xb0\xa7\x52\x41\x6b\x66\x80\x45\x0c\x20\xac\x49\x03\xc0\x72\x0d\xb0\x4c\x03\x08\x43\x87\x17\x3b\xef\xa0\xab\xa5\xa6\xab\x55\xa7\x2b\xc3\x82\xd1\x91\xf5\xdb\x62\xdf\x0d\x80\xb1\x8c\xad\x68\x98\x75\x8b\x61\x8b\x08\x99\x32\x96\xb6\x20\x1c\xc3\x8a\x15\x98\x18\x20\x77\x97\x4c\x38\x3d\x18\x81\x11\x7b\xbb\xce\x08\xc6\x50\x46\x60\x46\x3f\x7b\xca\x09\x3b\x1e\x37\xe8\xe5\x98\x82\x5b\x63\xce\x7d\x47\x6e\x81\xb1\x86\x89\x86\xcd\x58\x3a\xe1\x6c\x1f\xcb\x3c\x64\x2c\x60\xf2\xc0\xe4\x82\xf1\x90\x11\xb6\xf0\x6a\x6a\x37\x42\x5d\xae\x2e\x97\x1e\x5e\x93\xc2\x9c\xca\x6c\x11\xcd\x5b\x37\x3c\xa1\x16\xbc\x3c\xfd\xf5\xdd\x0f\x2f\x5f\xf0\x3b\xa5\x18\xc5\x2c\x03\xb0\xf3\x8c\x42\x2e\x93\x48\xc1\x26\xa4\xae\x90\x54\x22\xd8\x69\x09\xe9\x45\x82\xb8\x72\xfb\xef\xbe\x7b\xfd\x33\xcd\xc0\x8b\x43\x91\x1b\x7d\x8d\x2c\xe5\xf7\x69\x28\xf0\x60\xe5\x7f\x7d\x53\xe7\x67\xc3\xa5\x34\x37\xe6\x01\x4e\x46\x5c\xcb\x34\x8d\xe6\xbb\x62\xae\xc0\x8b\x28\x0a\x58\xb5\x02\xae\x69\x5a\xad\x22\xb6\x54\xa4\xfd\xd6\x91\xdf\x2a\x1a\x18\xd7\x1b\xb0\x14\x0d\x4c\xea\x48\xaa\x8a\x4c\x1b\xfd\x50\x34\xe4\xd6\x10\x69\x83\x98\x35\x5b\x69\x83\xf0\xe4\x22\xaa\x02\x7e\x93\x5a\xed\x22\x41\xa3\x99\x56\x81\xb0\xd9\x95\x76\x11\x2a\x15\x69\xb7\x30\xaf\x63\xd9\xae\xee\x76\xd5\x26\x6e\x2f\x3f\x2c\xb7\xa7\x01\xdb\xed\x91\x2a\xa7\xd9\x88\x42\x2e\xdc\x6e\xb9\x99\xb8\xbd\x82\x39\x75\xbb\x04\xd3\x75\x7b\xf9\x3d\x73\x7b\xf8\xed\x35\x91\x50\x88\x44\xb3\x99\x36\x26\x81\xdb\xcb\xf1\xd0\xed\x91\x1a\xea\x76\x4b\xf7\xbc\xd9\x86\x82\xf3\x5a\x76\x09\x2b\x41\xd4\x84\xb4\xa4\xb7\x1a\x66\xda\xb5\x22\xca\xd6\x9d\x3a\x14\x55\x1f\xc7\x72\x11\xa5\x4c\xc8\x78\x2a\xde\x4f\xeb\x68\x74\xe8\x06\xe9\x10\xff\x59\x13\x53\xad\xa1\x20\x1d\x1c\xf5\xeb\x9d\x51\x48\x45\xad\x33\x5a\x3b\x41\x3a\xe4\x97\x36\x8a\xe8\x4c\x05\x51\x9b\x02\xb7\x97\x14\xc4\xed\x25\x85\xe5\xf6\xb2\xde\x76\xbb\xd9\xe6\x34\x40\xe8\x6c\x45\x17\xb9\x27\x6e\x97\x08\x4f\xdd\x1e\x66\xb8\x6e\x0f\x25\x67\x6e\xaf\x68\x79\x6e\x37\x43\xfd\x26\xbd\x15\x83\x47\xb3\x95\x76\x91\xd0\xed\x62\x29\x75\x7b\x54\x68\xde\xe4\xa8\x7c\x47\x95\xd1\xe7\x65\x38\xa6\xe9\x3a\x26\xd1\x5a\x10\x51\x46\xeb\x66\x94\x0c\xd4\x59\x90\xa2\x11\x53\xd5\x88\x53\x6f\x44\x59\x66\x5c\x87\xa3\x44\x66\x52\x87\xa3\x2c\x33\xad\xca\x28\x5a\x91\x8d\xad\xb2\xfa\xac\xd9\x84\x02\x88\xd7\xec\x8e\xde\xe1\x10\x0d\x29\x80\x04\x35\xc2\x2a\x0a\x84\x55\x01\xad\x01\xe1\x28\x28\x2a\xcf\x9b\x5c\xd1\xfa\x5d\x9d\xc4\x24\x6e\x4f\x2f\x2c\xb7\x8b\xda\x76\xb3\x09\x95\x6c\xb8\x0d\xbe\xab\x64\xc3\xed\x27\xf8\xc4\xed\x11\xd4\xa9\xdb\x2f\xa8\xae\xdb\xc3\x94\x99\xdb\xc1\x14\xcf\xed\xd6\x25\xbf\x89\x81\xde\x90\x74\xaa\x4a\xe8\xf6\x08\x31\x6d\xd2\x54\x6f\x4f\xb4\x12\x24\x4f\x40\x14\x6f\xc9\x16\x6a\x4f\xac\x2d\x94\x89\xd8\x5b\x28\x3e\x71\xb6\x90\x67\x32\xee\x54\x7d\x32\xe9\x53\x49\x32\xed\x31\x86\xb2\x0b\xae\x86\x30\xeb\x33\x97\xc4\xeb\xd3\x7b\xe2\x6f\x61\x2d\x49\xd0\x67\xc8\x48\xb8\x85\xb1\x24\x74\x0b\x53\x46\xe6\x4d\x0e\x29\xc5\xa5\xcf\x54\x10\xd2\xa7\xa1\xc4\xda\x42\x41\x88\xdd\xa3\x65\xc4\xd9\xc6\xb0\x8d\xb7\x30\x3b\x64\xd2\x69\xdd\xc8\x74\x0b\xb3\x44\xdc\x2d\x74\x91\xcc\xb6\xd0\x7a\xe2\x6d\x61\x4d\x89\xdf\x67\xc1\x48\xd0\x65\xc2\x48\xd8\x67\x16\xe8\x16\x66\x94\xcc\x1b\x16\xea\x36\xae\x0a\x31\x1d\x8d\x31\x52\xa3\x6c\xd5\xa8\x42\xb4\x2e\x0a\x87\xad\x82\xee\x48\xef\x4d\xc5\xfb\x71\x83\x39\xed\x12\x93\x1a\xd1\x54\x6d\x4c\x6b\x25\xfa\x87\x63\xbd\x6f\x52\xb5\xa2\xf3\x4c\x8a\x9e\xea\xbc\x92\x0a\x8b\x36\x9e\x41\x83\x9a\xed\x12\x61\x8d\x5a\x3a\xd7\x04\x21\x68\xdc\x12\x51\x57\x4d\x81\xae\xee\x11\xb7\x0f\x7d\xcb\xd5\x0b\x8a\xed\xf6\x09\x8a\xe3\xf6\x31\x7a\xec\x76\x77\x7e\xe2\x76\x8b\xd2\x54\x7a\xdf\x7e\xeb\xba\x7a\xd2\xcd\xdc\x2e\xd2\x79\x6e\x9f\x78\xf9\x6e\xb7\x12\x04\x6e\xb7\xe8\x84\x6e\x9f\x60\x50\xb7\x4f\x09\xe6\x6e\x9f\x88\xd7\xdc\x0a\x8d\x10\x90\x1e\x75\x25\x56\x8f\x84\x12\xbb\xd7\x64\x10\xa7\x53\x52\xc9\xb8\x57\xe1\xc9\xa4\xd7\x6a\x90\x69\x97\x25\x76\x7b\x35\x91\xcc\x7a\x4d\x06\xf1\x3a\xb4\x91\xf8\x3d\xe6\x82\x04\xbd\x56\x8b\xc8\xe6\x40\xd1\x04\xed\xb1\xbd\x64\xde\x6b\x92\x84\x6b\xd1\xd9\x4d\xd2\xa9\x57\xc4\xea\x37\x2d\x76\x87\xe5\x20\x4e\x8f\x5a\x93\x71\xaf\x6d\x21\x93\x4e\x05\x26\xd3\x5e\xdb\x46\xdc\x1e\xe3\x43\x66\xbd\x1a\x48\xbc\x1e\x33\x40\xfc\x5e\x1b\x48\x82\x5e\x53\x40\xc2\x5e\x7b\x44\x68\x87\xb1\x23\xf3\xba\x35\xba\x8d\xff\xe0\x9a\xbc\x49\xb5\x6d\x29\xbc\x4f\x62\x3a\x1a\x57\xa2\x40\x5a\xf1\xde\xae\x20\x38\x6a\x41\x74\xf4\x42\x34\xae\x53\x44\xed\x43\x94\xce\xb1\xaa\xf9\xa9\x59\x73\xff\xf4\xe3\x67\xb1\xa2\xa2\xf6\x20\x2a\xde\xaa\xfd\x07\xfe\x5e\xed\x3b\x54\xe4\xd3\xad\xa0\x54\xe4\x51\xc0\x08\x25\x2d\xd5\x78\x0e\x85\x78\xab\x7d\x87\x8a\xc1\x9a\xfe\x77\xf2\x97\xb8\xfa\xee\x59\x6e\x1f\xf2\xb6\xdb\x47\x00\xc7\xed\x66\xf1\xd8\xed\xeb\xc2\xc4\xd5\xca\xcf\xd4\xed\x13\x3e\xd7\xed\xa2\xdf\xac\xde\xb8\xce\x89\xe8\x90\x0e\xdf\xed\xe2\x5e\xe0\xf6\x49\x5f\xe8\x76\xcb\x2f\x75\xbb\xd5\x6f\xee\xf6\x69\x08\x31\x7b\x54\x84\x90\x1e\x2d\x24\x56\xaf\x1a\x12\xbb\x6b\xa4\xe8\x94\x70\x32\xee\x55\x11\x32\x31\xfb\xf8\x44\xa6\xbd\x96\x8c\xb8\xbd\xda\x42\x66\xbd\xe6\x82\x78\xbd\x06\x8f\xf8\x3d\x36\x93\x04\xbd\x76\x83\x84\x3d\x66\x89\xd0\x0e\xbb\x44\xe6\x9d\x66\x83\x7b\x0f\xdd\x7d\x20\xbd\x7a\x49\x2c\xbd\x62\x12\xbb\x47\xed\x89\xd3\x23\xf8\x64\xdc\xab\x3b\x64\xd2\x6f\xdd\xa6\x1d\xe6\x8d\xb8\xfd\xca\x33\xeb\xb4\x1f\xc4\xeb\xb5\x7f\xc4\xef\x35\xa2\x24\xe8\x34\x22\x24\xec\xb5\x52\x84\xf6\x98\x29\x32\xaf\xdb\x91\xdb\x39\x0f\x4a\x9b\x52\xe0\xab\x5b\x21\x29\xb1\x51\xba\x0c\x07\xd2\x76\x0d\xa5\xc7\x20\x0a\x60\x3c\x45\xe9\x37\x94\x3e\x9f\xe2\xfd\xa4\x00\xa0\x2b\x30\xad\x10\x54\xbc\x95\x79\xae\x73\x19\x2a\xfc\x34\x3e\x43\xd5\x43\x45\x0b\x7e\x85\xa0\x1a\x85\xa0\x56\x40\x35\x70\x68\x75\x8f\xca\xcc\x51\x80\x9e\xd7\x88\xa3\x8e\x39\x74\xd5\x27\x6e\x0f\x71\x2d\xd7\xd4\x09\x8e\xed\x76\x0b\x8e\xe3\x76\x09\xce\xd8\xed\x91\x8b\x89\xdb\x43\xb5\xa9\xdb\x23\x7a\xae\xdb\xc3\xda\x99\xab\xa3\xbb\xe7\xf6\xf0\xd4\x77\xbb\xa5\x36\x70\x7b\xa4\x26\x74\x7b\x38\x47\xdd\x6e\xc1\x9d\xbb\x5d\x62\x4f\xcc\x4e\xb5\x25\xc4\xd4\xf2\x95\x58\x7d\x3a\x4d\xec\x3e\x9d\x24\x4e\x8f\x56\x93\x71\x9f\x52\x90\x49\x9f\xe5\x20\xd3\x1e\xdd\x2e\xc7\x3d\x2d\x1b\xc9\xac\x4f\x81\x88\xd7\x63\x1f\x89\xdf\x67\x41\x48\xd0\x69\xa1\x48\xd8\x67\x61\x08\xd5\x0f\xce\xf3\x1e\x0b\x81\xfe\x41\x37\xaf\x48\x8f\xa4\x11\xab\x47\xd3\x89\xdd\xa7\xcc\xc4\xe9\x53\x56\x32\xee\x33\x55\x13\xbd\x29\x22\xd3\x3e\x63\x41\xdc\x6e\x75\x99\xf5\x29\x3c\xf1\xb4\xc6\x82\xf8\x7d\xba\x4c\x82\x1e\x73\x41\xc2\x4e\x63\x49\x68\x9f\x29\x23\xf3\x86\xc1\xb9\x8d\x57\x20\xd0\x76\x55\x56\xa4\x80\xa9\xf2\x0b\x78\x5d\x4b\xdd\x67\xbb\x7a\x6f\xa9\x60\x3b\x15\x45\x94\xf0\xc7\x72\x7f\x54\x5e\x41\xf9\xb6\x0d\x7b\x5a\x13\x68\xed\xa8\xa8\xf4\x06\x24\xa4\xda\x80\xbd\xa2\x59\x25\xca\xbe\x10\x50\x95\x07\x20\xd1\xaa\xfd\x3e\x94\xc0\xb6\xdf\xd2\xb2\xaf\xed\x77\xf3\x1a\x95\x55\x3d\xed\x64\x12\x71\xbb\x99\x64\xb9\x9a\x1e\xd9\x6e\x17\x77\x1c\xb7\xab\x3f\x63\xb7\x5b\xea\x26\x6e\xb7\x64\x4c\x5d\x3d\x3d\x5c\xb7\x4b\x2e\x66\xae\x5e\x9e\x3d\xb7\x9b\xf5\xbe\xdb\xcd\xc3\xc0\xd5\xc8\x54\xe8\x76\xb3\x88\xba\x5d\x32\x35\x77\xbb\x45\x99\x98\x3d\x7a\x44\x48\x8f\xf0\x11\xab\x47\x53\x89\xdd\x21\x80\xc4\xe9\xd4\x53\x32\xee\x51\x45\x32\x31\x7b\x6c\xd0\xb4\x53\xe7\x4a\x0f\x56\x83\xfb\x4c\x6b\xb5\x3d\x9d\xb6\x12\xbf\xc7\xb4\x91\xa0\xc3\x2e\x92\xb0\xc7\x86\x10\xda\xa3\xb3\x64\xde\x69\xdc\xd8\x88\xae\x41\x9c\x74\x8a\x12\xb1\x3a\x95\x96\xd8\x3d\x7a\x49\x9c\x1e\xc5\x24\xe3\x0e\xcd\x24\x93\x1e\x5b\x43\xa6\xbd\xc6\xaa\x47\x93\xc8\xac\x47\x47\x89\xd7\x61\x00\x88\xdf\x69\xb5\x48\xd0\x69\x5a\x48\xa8\xd3\x7f\x42\xfb\x54\x78\x5e\x37\x3d\xb7\x1f\xba\x15\x32\x52\xa0\xea\x98\x44\x31\x74\x0b\x57\x43\x31\x68\x0b\xa0\xaa\x6a\x4e\xe9\xe4\xa8\xde\x8e\x35\xdd\x9f\x70\x90\x8a\x31\xba\x72\x99\xda\x6f\x5d\xa9\x03\xaa\x61\xba\xec\x7b\xbb\xaa\x27\x09\x79\xfb\xad\x2f\x75\x42\x35\x55\x97\xfc\x38\xc5\x30\xcd\xe9\xd6\x86\x4a\x2b\xba\xa9\x26\xe9\x92\xe7\xdb\xee\x69\x17\x19\x88\xab\x26\xaa\xe5\x76\xf1\xd7\x76\xbb\xfa\xe8\xb8\x1d\x82\x33\x76\xbb\x88\x37\x71\xbb\x7a\x32\x75\x75\xe4\x71\xdd\x0e\xb1\x9a\xb9\x5d\xac\xf6\xdc\x2e\x8e\xf8\x6e\x87\x20\x04\xae\x4e\xcc\x43\xb7\x4b\x92\xa9\xab\x96\xd8\xb9\xdb\xc1\x64\x62\x76\x72\x99\x90\x4e\x75\xb5\x3a\xf5\x95\xd8\x9d\xba\x42\x9c\x2e\x75\x20\xe3\x4e\x55\x22\x93\x4e\x85\x20\xd3\x2e\x8b\x20\xc6\x1b\xe5\xab\x59\xa7\xb5\x20\x5e\x97\xc6\x10\x5f\x63\x34\x48\xa0\x33\xb2\x61\xa7\xe6\x12\xda\x69\x14\xc8\x5c\x6b\x11\x89\xd9\xc9\x75\xd2\xa9\x88\xc4\xea\xd6\x6e\x5b\x23\x69\xc4\xe9\x54\x34\x32\xee\x52\x61\x32\xd1\xea\x21\x99\x76\x5a\x06\xe2\x76\x6a\x3f\x99\x75\xea\x22\xf1\x34\xc6\x8a\xf8\x9d\xea\x46\x82\x2e\xeb\x40\x42\xad\x16\x13\xda\x69\x39\xc8\x5c\x32\x0e\xb7\x19\x53\x5d\x36\xc0\x5b\x0a\x80\x25\x71\xda\xf6\xf8\xa0\x5a\xdc\x68\x9b\x63\x5e\xaf\x6d\x88\x05\x3c\xc5\xab\x31\x87\x67\x29\xf1\x98\x94\x2f\x55\x46\x58\x60\xa2\x1e\x67\x5c\x53\x8d\xff\xac\xec\xb7\xca\x04\x73\x3c\x55\xaf\xfc\x12\xa8\x02\xcf\xe0\x80\x1f\xf6\x68\x9b\x5f\xb5\x9c\xd0\x92\x88\x8a\x3a\x73\x81\x84\xe2\x55\xb1\xa8\xa4\xed\x39\x7f\x4d\xba\x68\x2a\xca\x58\x5d\xfc\x17\x65\xec\x2e\x5e\x8b\xe7\x4e\x17\xb1\x45\x99\xb1\x9e\xac\xa2\xc4\xa4\xb7\xcf\x53\x8d\x68\x89\xd7\x6e\x17\x45\x45\x99\x99\x8e\x4b\xe2\xbd\xa7\x97\x52\x51\xc2\xef\x92\x47\x51\x26\x50\xb3\x5c\xbc\x0d\xbb\xc4\x48\x94\xa1\x5d\x22\x2a\xca\xcc\xf5\x1a\x5a\x78\xc4\x4a\xc5\x26\x5d\x3d\x20\x96\x86\xc8\xc4\xd6\x49\x1c\x71\xba\x90\x25\xe3\x2e\xb6\x90\x49\x17\x31\xc8\xb4\xa3\x8b\x3a\xfb\x3b\xd3\xb3\x90\x78\x5d\x92\x4a\xfc\x4e\x7b\x18\x74\x69\x14\x09\xf5\xf2\x4d\xa8\x4e\xe8\xc8\xbc\x5f\xbb\xaa\xc9\x8d\xb6\x04\xe9\xb6\x05\xc4\xea\x17\x38\x62\xf7\x69\x1f\x71\x3a\xb5\x8f\x8c\xfb\x8d\x40\xc1\xec\xce\xee\x4e\xfb\x8d\x12\x71\xfb\x8d\x1b\x99\xf5\x5b\x83\x42\x1c\xba\xb4\x8c\x0b\x85\xf6\x6d\xd0\x67\xd6\xb8\x60\x74\xe0\x49\xfb\x2c\x4e\x21\x24\xd8\x8a\x34\xb2\xf3\xaf\x72\x5e\x83\x57\x5e\xf6\x21\x83\x7c\xe1\xe5\x90\xd1\x25\x0d\x72\xcc\x47\xf4\xee\xbb\xd7\x3f\x43\x14\xaf\x8b\x6b\x22\xca\x8c\x06\xaf\x9e\xbe\x6b\x5c\x5c\x5c\x1d\x4c\x34\xa0\xda\xf8\x8f\x17\x28\x8a\x1f\xf8\x5d\xfc\x30\xe4\x8a\xa6\x78\xca\x0b\xf0\x1f\xc5\x77\xf6\xc3\x90\xfa\xd3\xc4\x5c\xca\xaa\xf4\xfc\xe8\x1d\x4f\x8c\x05\x3c\xf1\x4b\xf7\x1d\x55\xac\x74\x79\x41\x15\xff\x21\x65\x49\xb9\xeb\x15\x55\xdd\xa9\xf5\x3e\xd0\x9b\x32\x05\xd8\x07\x7a\xa3\x48\x7d\xf7\x81\xde\x14\x79\xf5\x3e\xd0\x1b\x75\x5a\x3d\xd6\x06\x67\xd1\x78\x02\x7e\x94\x67\xe0\x05\x41\x92\x86\x51\x7c\x01\x79\x02\x6f\x9e\x11\x25\xdc\xef\x22\x4c\x05\x74\xd6\xcc\x81\xac\xba\x3b\x64\x3c\xd1\xdf\x1d\x52\x81\x7b\x93\x30\x80\x6f\x9e\x91\xb3\xe8\x1c\xf6\x80\x28\x72\x94\x8a\x76\x79\x7a\xfe\x41\xd1\xbb\xb3\xaa\xbe\x48\xc7\xc7\xfe\x19\xd8\x04\xf6\x24\xd0\x98\x87\x6f\x08\xf7\x5b\x80\x15\x09\x4b\x9f\x66\x19\x5d\xf9\x4b\x0a\x64\x02\xd9\xa5\xff\x81\xde\x28\xc8\x9f\x5d\xfa\x7f\xa1\x37\x59\xc9\x82\xea\xb7\x9e\x28\xf1\x3b\x2c\xc4\x49\x53\xfc\x78\x04\x64\x52\xfe\xd2\x5f\xb1\xf2\x0c\x33\x4e\x09\x7c\xd4\x84\xcc\x0a\xe8\x02\x97\x33\x01\xf4\x5c\x20\xa5\x84\xdb\x7d\x75\x8b\x1f\xe5\xef\x30\x2b\xca\xa1\x94\x04\xa5\x84\xab\x03\xc9\x05\xca\x71\x95\x02\x65\xb5\xeb\xa8\xa4\xc6\x72\xf4\x52\x53\x6f\x67\x9e\x26\x2b\x34\x30\x4b\x3a\xcf\xc1\x72\x51\x33\x58\xcb\xea\x8a\x9c\x38\x67\x83\x08\xf6\xf9\xdd\x10\x26\x26\x70\x2c\x84\x6b\x30\x78\xf3\xcc\x12\x32\x38\x84\xdd\x92\x02\x43\xf8\x16\x2c\xf7\x1c\x73\x3c\xa2\x6c\x45\xf0\x2d\xde\x71\xb1\x35\x7a\x69\x74\xb1\xd8\x1e\x3f\x07\xd3\x77\x56\x48\x0e\x6b\x58\x5a\x2e\xbe\xe6\xb8\xc2\x2e\x58\x8e\x06\xe1\xa1\x02\xe3\x56\xb3\xaa\xcc\xfe\xac\x03\x51\x1c\x50\xa0\x5e\xb0\x10\x62\x07\x51\x06\xde\x7a\xbd\x8c\x68\xc8\x78\xe9\xc5\x40\x37\x6b\x2f\x0e\x69\x58\xe4\x65\x44\xf3\x6e\x28\xa1\x31\x12\x08\x30\x81\x17\x83\x4f\xc1\x4f\x93\x0f\x34\x86\x28\xce\x13\x70\x79\x52\xe0\x0c\xb2\xc0\x5b\x72\xf0\x1c\x64\xa6\x86\x76\xbd\x88\x82\x05\x78\xcb\x65\x72\x9d\x21\x68\x06\x37\x4f\x18\xd8\xcb\x8c\x86\x70\x1d\xe5\x8b\xe4\x32\xe7\x08\x66\x51\x12\xb7\xa1\x08\x42\x63\x7a\xcd\x41\xf5\xe3\xd1\x23\x71\xad\x4c\xf5\x88\x19\x14\x9b\xa8\x28\x57\x93\x5c\xc2\x25\x77\xda\x2d\xb8\x02\x2c\x1a\xb1\xea\x3b\xda\xac\x41\xc4\x99\xf8\x00\x18\xf7\x6d\x35\xab\x74\xfd\x98\xca\xfd\x98\x9e\x8b\xc4\x9e\x9f\xe4\x47\x78\x29\x40\xeb\xaa\x1d\x85\x05\x7c\xc6\x13\x5f\x42\x14\x5f\xd1\x34\xa3\x7a\x2b\x18\xc5\x57\xef\x1a\x86\xb0\xf6\x68\xab\x01\x82\x74\x0c\x10\x15\x34\x99\x62\xd9\x19\x19\x33\x81\x6e\x42\xff\x5c\x0b\x38\x54\x3f\x68\x1c\xa4\x37\xeb\xfc\x16\x57\x01\x8a\x8c\xb5\xc9\xb3\xb2\x5e\x55\xd8\xa8\x9b\x7c\x6d\x0a\xdd\x90\xfe\x1e\xad\x56\x14\xe9\xca\xdd\xfb\xac\xbb\x65\xa3\x20\xa4\xca\xe9\xf8\x9e\xe6\xb2\x9f\x56\x47\x6e\x89\x40\xa5\xab\xb1\x9a\x3c\xe0\xc5\xd2\x66\x31\xbc\x39\x4b\xe1\x7d\xbc\x8c\xa3\x3c\xf2\x96\x72\xea\xab\x7a\x19\xba\x09\x16\x5e\x7c\x41\x8f\xdf\x56\x69\x51\x79\xe6\x31\x73\x63\xce\xf9\x7f\x4d\x91\x56\xd7\xe1\xf7\x53\xe3\x8c\x75\x3e\xd7\xd6\x79\x7b\x2c\xd7\xb1\xb0\x1d\x5b\x7c\xb6\xab\xe3\x72\xdc\xcc\xf9\x9c\xfd\xbf\x25\x6e\x58\x67\x2c\x3e\xca\xcc\xb4\x5d\x57\xb5\xf1\xf4\x61\xa8\x51\xfc\x2b\xd7\x2a\xfc\xde\x7f\x6d\x9b\x62\x24\x52\xfa\x13\x08\x4e\x77\xed\x45\x29\x18\xb2\x9c\x68\xca\xa6\xf5\xb2\xa9\x28\xab\x44\xf2\x05\x8d\xb2\x9c\x2e\x4b\x29\x56\x43\x9c\x63\xe7\xb7\x73\x2d\xdc\x6e\x03\x3d\x67\x03\x2d\x4f\xb5\x76\x16\x9d\x9f\x0d\x06\x02\xdb\xf7\x95\xb9\x66\x8e\x64\x39\x75\xc1\xdf\x98\x56\x5b\x45\x1a\x85\xc1\x6e\x28\x52\xaa\xa3\x54\x43\x93\x96\x05\x1a\xf3\x7e\x03\xfe\x63\x1c\x26\x90\x5d\x7b\x6b\xee\x7e\x2c\xbd\x2c\xe7\xc2\xd0\x36\xe1\x79\x37\xcb\x1a\xc8\xd6\x19\xd6\xa5\xf8\xb9\x42\x86\x31\xa3\xf8\x6d\x55\xbd\xa5\x1a\x5f\x4d\x05\xef\xa2\xea\x77\x31\x29\x3d\xa6\x4b\x31\x23\xcb\x21\xb9\xcc\x5b\x16\xb8\x34\xb9\xdd\x2c\xab\x99\x5c\x3d\xcf\x6a\x43\xc6\x07\x7a\xc3\x53\x40\x4f\x9c\x7d\xdb\x92\xdf\x44\x57\x9a\x17\x52\xde\xe8\x89\x32\x6b\xf4\x3e\xbc\x63\x12\x28\x26\x01\x69\x92\x65\x95\x9b\x8e\x39\x0f\xd1\x21\xc6\x69\x29\xaf\x51\x0e\x54\x15\xe1\x06\xc5\x78\xb5\xf2\xb2\x0f\x35\x95\x2d\x64\x77\x30\xa8\x89\x28\x53\xc4\x62\x74\x7d\x5f\xeb\x3a\x53\x5a\x06\x45\x22\x41\x4d\x64\xdf\xa3\xcc\xfe\x49\x29\xf8\xec\x1d\xf3\xa8\x38\x64\x51\xaa\xd0\xbb\x16\xda\x6f\x8f\xb7\x47\x3b\xd5\xa3\xbd\xec\x46\x7b\xd9\x81\x76\xba\x05\xda\x9d\x49\xa4\xb3\x22\x8b\x34\x0f\x7f\x6c\x97\x47\xba\x2f\x09\x33\x87\x95\xd3\x4d\x2e\xa7\x62\x7e\x7e\xf4\x6e\x24\x1c\xb4\x5a\x2e\x66\x03\x82\xf9\x85\x22\xb9\xf6\x7a\xe9\x31\x24\x36\x39\x34\xa1\x08\x87\x6b\x50\xb5\xa3\x02\x54\x66\x76\x6e\x07\x6a\xea\x49\xb7\x9f\x1f\xbd\x53\x66\xdc\x3e\x4d\xa3\xf5\x92\xee\xdd\x2e\x44\xc4\x2b\xd5\x02\x45\xf2\xa3\x7f\x9d\x70\x91\x08\x44\x30\xb4\x23\xcc\x50\x1a\x34\xaf\x07\x12\x5e\x2c\xcd\x08\x1c\xb2\x72\x23\x4e\xd5\x23\xce\xe3\x24\x1d\x54\xf7\xac\x8b\x8b\xe3\x8b\xa6\x47\xd9\x32\x0a\xe8\xc0\x34\xc0\x1a\xb6\xee\xc2\x28\xc1\x5a\x77\x04\x6b\x19\xe0\x74\x80\xb5\xef\x08\xd6\x31\x60\x32\xd4\x5f\xa4\x71\xe7\xb9\x07\xcd\xc8\x48\xae\x2c\xd5\xd0\x52\x66\x24\xcf\x39\xb6\xa8\x60\x6f\xd1\xc2\xd7\x99\xd3\xb0\xb6\x6e\x89\x9c\x75\xdb\xee\x93\x2d\x5a\x50\x8f\x7a\x64\x66\x7d\xb5\x61\xef\xbf\x88\x59\x2d\xad\xcb\x57\x30\xae\x15\xac\x5b\x9a\x58\x9d\x89\xab\x1b\xda\xb2\x54\x67\xfe\xfc\xb2\x54\x23\x85\xbe\x94\x98\xfd\x60\x6c\x19\x8d\xac\xfa\x52\x72\xf7\x83\xb1\x63\x54\x59\xdd\x0f\xc6\x13\x43\x24\x7b\x3f\x98\x90\xcf\xe7\x86\xeb\x7c\x51\xc2\xfd\x7f\x66\xa6\xfd\xdf\x2d\x1f\xfe\x7f\x4e\x66\x7b\xbc\xa9\x20\x8a\x69\xf8\x75\x53\xdc\x7f\xe7\x65\xb4\xca\x5a\xef\x65\x54\x7a\xf7\xb3\x6d\x75\x66\xc0\x6f\xeb\xf2\x66\xe2\x40\xec\xad\x68\xb6\x96\xb5\x74\x5f\x46\x83\x15\x61\x68\xf0\x7f\xff\xfe\x59\x05\xe6\x29\x4c\x9c\xf2\x0a\x1b\x15\x98\x9f\x27\x0e\xc3\x03\x91\xda\x4c\x9c\x91\xf8\xc1\xf0\x57\x78\x06\x15\x68\x0e\x5e\x84\x53\xa2\xbf\xd1\x0c\x3c\x88\xe9\xf5\xf2\x06\xb8\xae\x85\xaa\x86\x65\x83\x02\xb5\xdb\x3c\xe2\xcb\x95\x4f\xd3\xcf\x80\xb7\x4a\xe1\xad\x2a\xec\x8b\x6d\xa1\x3b\x3f\xea\xac\xb2\x4c\xae\xb1\x06\xfb\x57\x55\xa1\x5e\xb9\x6e\xdd\xda\x05\x0a\xba\x6c\x2a\xba\x14\x16\xa1\x20\x4f\x31\x30\xf3\xd5\x3f\xd3\x32\x6d\x9c\x95\x39\xe6\xd8\x9c\x98\xf5\x78\x67\x41\x69\x34\xf1\x71\x54\xf3\xa8\x58\x0f\x0d\x86\xb5\x7a\x0c\x13\xf7\x6b\x29\x6e\xf5\xc4\xd7\xac\xb7\x87\x50\xbf\x7d\x5b\x9e\x99\x37\x39\xf5\x5d\x94\x5f\x47\x19\x85\x93\xd7\xa7\x19\x42\xe8\x63\x4c\x71\x51\x8a\x10\x90\xcf\xf0\x94\xf1\x97\xd1\x65\x0f\x09\x23\x46\x12\x6f\x9e\xd3\x14\x62\x7a\xe1\xe5\x51\x7c\xf1\x15\x08\x8f\xa0\x28\x23\xbc\x60\xc1\x28\x4e\xf2\x81\x96\xaa\xfb\xfb\x10\x27\xbd\x9e\x2a\xde\xc9\xc2\x09\xfa\x8f\x92\xba\x0f\x95\xc5\x38\x61\xff\x51\x10\x59\xe1\x92\x0a\xca\x08\xc2\x14\xd2\x50\xb1\xf3\x61\x0d\xbb\x9a\x07\xa0\xe3\xca\xd3\x93\xe7\x12\x57\x70\x39\x01\xc7\xed\xb5\x97\xe1\xf2\xc2\x56\x3a\x54\x72\x0a\x61\x30\x95\x28\x99\x95\x27\xac\x89\x02\xee\x57\x66\xfe\xd3\x93\xe7\x5f\x87\xf5\x7c\x6d\xa7\x62\xbc\x17\x87\x03\x2f\x4e\xf2\x05\x4d\x05\x22\x5d\x62\xe0\xc5\xa1\x2c\x06\xac\x87\x3d\xa2\x50\xe9\xd9\x7d\x4e\x90\x3e\xa9\x28\x35\x4f\x94\xff\xa7\xc9\xc7\xeb\xb7\xbf\xb7\x78\xbc\x7e\xfb\x3b\x49\xc7\xeb\xb7\x5f\x47\x38\x92\xb4\x26\x1b\x49\x7a\x0b\xd1\x48\xd2\x3b\x4b\xc6\xa7\x5b\x4a\xc6\xa7\x7f\xb2\x64\xfc\xfc\xfb\x8b\xc6\xcf\xbf\x9b\x6c\xfc\xfc\xb5\x84\x63\xd3\x90\x8e\xcd\xad\xc4\x63\xf3\x05\xf2\xf1\xfe\x96\xf2\xf1\xfe\x9f\x24\x1f\xb8\x28\x2f\x4b\x46\xcc\x23\xa3\x62\x42\xb8\xa4\xf3\x7c\x7b\xaf\x2c\x46\x99\xe0\xbf\x20\x99\x97\x90\xf0\x0a\x9b\xaf\x25\x0c\x08\xec\xeb\x88\x03\x82\xaa\x09\x04\x3e\x39\x1e\x58\xe3\x2e\x39\xe0\x85\x64\x51\x88\x55\x72\xc0\xa6\x40\x31\x3c\x02\xdb\xd2\xad\x74\x49\x92\x32\xa8\x44\xe5\xd1\x23\x88\x71\x89\xbc\x14\x06\xbe\x75\xc8\x82\x3d\x88\x95\x97\xd5\xab\x45\x88\xc1\x69\xcb\xda\x67\x28\x26\x4f\xdd\x08\xc9\x60\x06\x31\xec\x29\x6e\x0c\x6d\x35\xdd\x5c\xea\x62\xcd\xfd\x67\x4a\x2f\x86\xf2\xff\x8f\x13\xdf\xb7\x03\xfd\xe4\xa2\x90\xde\xb7\x5f\x49\x7a\x39\xdf\xeb\x92\x2a\x09\x6f\x21\xcf\x5b\x08\x6f\xcb\x62\x22\xa8\x3b\xc8\xaf\xa4\x05\x25\x9c\x7e\x01\x16\xcd\xff\xd3\x25\xf8\x6d\x92\x7b\x39\xfd\xbd\x0d\x70\x8a\xad\x7c\x2d\x11\x46\x68\x5f\x47\x84\x39\x62\xb2\x08\xa7\x49\xaf\xfd\x65\x45\x7a\xe5\x57\xf4\x08\xe5\x40\x58\xf5\x78\xc8\xdc\xc1\xea\xc9\xdb\xc1\xc4\x69\x89\xe5\x97\x32\xec\x2b\xd9\x9c\x7f\x2d\x8e\xf5\x98\x1c\x56\xe2\xf6\x0c\x7b\xdb\x62\xd8\xf1\x5d\x18\xf6\x34\x0c\x7f\x6f\xcf\xd7\x0b\xc3\xdf\xc9\xf3\xe5\x57\x7e\x7f\x8d\x39\x73\xd8\x98\x33\x87\xb7\x9a\x33\x87\x5b\xcf\x99\x9b\x23\xc2\x6e\xe9\xc8\xe2\x86\x51\xb5\xf3\x1b\x78\x69\x7a\xc3\xaa\x15\x63\x08\xbf\x18\xbe\x36\xac\x54\xd7\xc3\xab\x61\xb4\x1d\xa9\xdd\xca\xe7\x86\x5d\xde\x86\xc0\xe1\x4b\x2d\x3a\xff\xa5\x5e\x5d\x79\x1a\x8b\x2b\xc0\x93\xb9\x1c\xdb\xcc\x54\x37\x1c\xa7\xc9\x9a\xa6\xf9\x0d\xfc\x5d\x5c\x31\x8c\x05\x51\xbc\x4a\x10\xad\xb0\xa2\x10\x90\x6c\xa4\x82\x53\x98\x95\xf2\x4e\xf4\xba\x75\xc9\xa2\x8b\x38\x9a\x47\x81\x17\xe7\xe0\xe3\xfb\x28\x96\x74\x03\x1b\xed\x88\xfe\x56\x71\xe9\x02\x99\xe2\xc9\x57\x88\x03\xb7\x31\xd0\xab\x63\x8d\x5c\x83\xd7\x6b\x26\x96\xde\x72\x58\xa3\x7d\x2f\xe1\x40\x69\x90\x4b\xca\x49\x60\xb7\x22\x22\xad\xb3\xf9\x0b\x74\xf5\x5a\x26\x75\xb3\x17\xb5\x35\xdf\xba\xce\x7e\x21\xb0\xb3\x56\x7d\xf6\xb9\x6d\x58\xdb\xb8\x2d\x14\xe2\x92\x19\xf1\x88\x8f\x67\x6a\x02\x12\x12\x4a\xe6\xc3\x16\x90\xf3\xff\x83\xba\x6a\x00\x31\xb7\x5e\x1e\x40\xa1\x33\x4a\xb1\x6d\x99\xe5\x6b\xb1\x79\x02\xcd\x62\xf1\x83\xff\xfb\xe9\x93\xe2\x00\x06\xf3\xfb\x4b\x1d\xb8\x77\x08\xed\x55\x30\xf9\xc3\xc7\xe6\xa2\xf8\x61\x89\x46\x73\x2f\xa0\xd6\x69\x6f\x02\xe0\x3a\xb4\xa4\xf1\x45\xbe\x80\x07\xe0\x6e\xb9\x95\xba\x69\x68\x9e\x25\xf1\x15\x4d\x8b\xa9\xa1\x64\x86\x85\x7d\x60\x83\x76\x71\x3a\x60\x2b\xc3\x53\x8c\xda\x25\x77\x6b\x2b\x73\x9f\xe1\xb4\x6e\x44\x77\x32\x08\xbd\xdc\x03\x2f\xbb\x65\x3b\x5b\x47\xb2\xea\x2b\x85\x1b\xc9\x40\x8f\xf2\xe4\x67\xdb\xd2\x2f\x85\xe0\xeb\x2f\xd8\xb3\x23\xda\xaa\x0b\x95\x62\xe7\x4e\x51\xee\x98\x33\xb3\x44\xb2\x60\xaf\x6a\x17\x0f\x67\x9b\x02\x16\xef\xee\xd6\x9b\xf7\xeb\x6d\x77\x9f\xf4\xaa\x96\xf0\x8a\x5a\x67\xad\x2d\xfc\xec\x53\xe0\x30\x5a\x5f\x66\x8b\x41\xe1\x48\x31\x1f\x41\x35\xaf\x54\x97\x6e\xf8\x12\xa0\xd8\x27\x5b\xb8\x22\x12\x83\x0b\x0b\x52\xc0\x34\xea\x6a\xa3\xdd\x48\xd2\xd2\x0a\x04\xc3\x44\x32\x48\xd6\x38\x48\x6a\xc6\x7e\xe8\x75\x5b\x4b\xb1\xa7\x10\x2c\x93\xb8\x6b\xa6\xb2\xad\x48\x23\x9c\xa6\x2c\xe3\x43\xbd\x2c\xe3\xeb\x4e\x59\x96\x21\xa3\x97\xc2\xd1\x2d\x77\xbe\xaa\x76\xba\x3e\xc3\xf2\xff\x86\x82\xfd\x6f\x9c\x32\x6d\xa0\x85\x2d\xe5\xf0\xda\x66\xb6\xd8\x35\xa6\x6f\x00\xcf\x30\x15\x0b\xeb\xdc\x39\xd1\x34\x53\xaa\xd0\x75\x4d\x7f\x7a\xd5\xe0\x7a\x1b\x1d\xb8\x16\x22\x5f\x80\x3f\x8b\xce\x55\x64\xd7\x8b\x2a\x16\xae\xad\x2f\x97\xee\xb1\x76\xdf\x4c\x63\xb7\x8c\xd8\x1a\xf3\xf9\xdc\x70\xc7\xdb\xec\x77\xd9\x7f\x70\x0f\x16\x79\xbe\xce\x0e\xf6\xf7\x57\xf9\x22\x1b\xf9\x74\xff\x32\x9f\xbb\xbf\x65\x70\x65\x8d\xc8\xc8\x02\xff\x06\xfe\xc7\xca\xcb\x17\x91\x97\x31\x89\xa9\x36\xc8\xe0\xae\x10\xbe\xd9\x63\x7f\x1f\x9e\xd3\x9c\x1f\x87\xa3\x94\x91\x3b\xf2\xfc\x25\xcd\xe0\x3f\x44\x4b\xff\xf1\xcd\x9f\x70\x1b\x7f\x4a\xe9\x51\xb9\xff\xa5\xb5\x93\x06\x76\x38\xf3\x76\xe0\xfe\xfd\xe2\xf1\x43\x3d\x78\xf8\x0f\xde\x1d\x09\xf8\x2b\x7c\x50\xc1\x5e\x89\xdf\x75\xd0\xe2\xe9\xfd\xfb\x8a\xfd\x39\x87\x35\x24\xcb\xc2\x9d\x68\x5c\xe0\xce\x99\xff\x30\xf8\x6e\xfc\x93\x24\xa4\xa3\xdf\x32\x48\x52\xf8\x8e\x6f\xa5\x89\xe6\x11\x0d\x21\x48\x42\x6a\x20\x14\x2f\x0e\xe1\x32\xa3\x10\xe5\x6c\x5c\xfb\x0f\x46\x47\xa9\x0f\x62\x1f\x4e\xd9\x87\x0b\xf1\xbb\xde\x07\xfe\xf4\x21\xdf\x93\x54\x55\x1b\x95\xa5\x0f\x65\x60\x9f\x3e\x49\xbf\x46\xd7\x51\x1c\xb2\xd9\x65\xad\x0c\xdf\x3a\xc4\x70\x01\xf9\x31\x6e\xf6\xf9\xe6\x4f\xfb\x0f\xf6\xbe\xda\xe7\xc1\xfe\x37\xbc\xb7\x59\x9e\x46\xf1\xc5\x8b\x34\x59\x3d\x5b\x78\xe9\xb3\x24\x64\x9c\x7b\x87\x0f\x47\x73\xe9\xa9\x20\xfe\xa9\xf7\x81\xc6\x9c\xc6\x4d\x91\x5d\x5f\xc6\x37\x8c\xbe\xdf\xfc\xa9\xb4\x60\x97\x41\x66\x85\x94\x3d\x1c\xf0\x76\x78\x07\x71\x69\x13\x37\xdf\x17\x43\x20\x3e\x0a\x92\xcb\x38\xa7\xa9\x88\x5c\xe2\xa3\x65\x61\x2b\x78\xf5\xca\x58\xe0\x5b\x3c\xcf\x58\xfc\xa0\x9b\x3c\xf5\xd8\x8f\xeb\x45\xb4\xa4\x30\x28\xa0\x3d\x12\x40\x78\xd3\x7f\xc2\x3a\x15\xc0\x40\x74\xef\x69\x5e\x54\xd8\xdd\x65\xaa\xfe\x27\xe4\x29\x2f\xfc\xf8\x10\xcc\xcd\x73\xd7\x34\x19\xcf\xf9\xa3\x47\xf8\xe8\xbb\x17\x2f\xd8\x23\x4d\x4b\x8c\x5c\x38\x5d\xcf\x2e\xd3\x34\xb9\xf0\x72\x6a\xa0\xd4\xe5\x0b\x9a\x52\x3c\xe7\x09\x31\xdd\xe4\xc0\x50\xf0\x82\x9c\xa6\x58\x09\xbb\xb1\x0d\x7e\x88\xe0\x80\x17\xbf\x0f\xe6\xe6\xc5\x33\xd3\x1c\x32\x09\x35\x37\xcf\xf1\xeb\xdf\x99\x71\x5e\x26\xd7\x55\xfb\x58\xed\x4f\x9c\xf2\x7c\x28\x1f\x88\x2e\x32\x00\xf6\x8b\x17\x43\x3c\x9a\x69\x0e\x61\x17\x24\xc8\xf8\x62\xb7\xc8\x38\x24\x5a\xaf\xbc\x60\xd1\xd5\xcb\x78\xe5\xe5\xc1\x82\x86\x55\x7b\x0f\x21\x89\x97\x37\xe0\xad\xd7\x14\xfb\x1d\x65\xa8\x80\x70\x19\x47\xb9\xc1\x26\x9a\x81\x97\x51\x9c\x6d\x32\x42\x94\x90\xca\x32\x8c\x48\x79\xb1\x2f\xaa\x84\xca\x86\x7a\x4f\xfa\xb9\xf6\xa2\xb4\xdd\x33\xec\x97\xc0\xf5\x4f\x82\x74\x7b\x7b\x02\xf7\x6f\x9a\x1d\xd0\xd4\x64\x05\xd9\xff\xc2\xde\xf3\x52\x85\x36\xde\x45\x19\x68\x8c\xca\x80\xa3\x70\xa5\x0b\xa5\x94\x73\xbf\xa5\x2e\xe4\x51\x1c\xd2\x0d\x1c\xc2\x1e\x51\x8a\x7d\xa9\x47\x3b\x3b\x92\xf0\xef\xee\xf2\x6a\x1a\xe1\xc7\x76\xce\xb0\xc8\x79\x53\xd8\x99\x28\xbd\x60\x1c\xe7\x94\xe1\x4f\xf7\x0e\x0b\xf6\x3f\x94\xe8\x05\xbb\x87\x0a\xfb\x51\x00\x7a\xfc\x18\x88\x59\x08\x10\x7c\x12\x3a\x24\x58\x52\x60\xc2\x85\x15\x3e\x41\x4d\x0e\x4b\xe2\x6f\xd1\x10\x02\xd4\x31\xa9\x24\x7e\xb0\xa0\xc1\x87\x77\x81\xb7\xf4\xd2\xbf\xb2\x5a\x03\xc6\x87\x37\x49\x14\xf3\xdd\xd4\x48\x80\xf2\x51\x5d\xe3\xab\xc7\x5c\xeb\x2b\xe2\xe4\x8b\x34\xb9\x86\xa3\x34\x4d\xd2\x01\xf6\x6a\xe7\x98\xb9\x42\x95\x68\xfe\xb8\xbb\x03\xbb\x15\x80\x51\x9e\x70\xcb\x3a\x20\x93\xe1\x28\x4f\x7e\x5c\xaf\x69\xfa\xcc\xcb\xe8\x60\x08\xbb\x1c\x00\x13\xf9\x38\xc9\x99\x80\x23\xb2\x9c\x2e\x3b\xec\x65\xd1\xd1\xcf\xbf\xc3\x48\x50\xd1\x09\xbd\x6a\xe6\x89\x57\xe4\x30\xf8\x32\x9b\x18\x9c\x38\x95\x15\xdc\x18\xc8\x04\x7c\x5c\xd4\xe1\x1c\xc5\x50\xe5\xc6\x35\x87\x4d\xbe\x70\x85\x78\x56\x54\x54\xb1\x45\x02\x7b\x5f\x08\xe7\x8b\x17\xae\xb0\x75\xc2\xcc\x91\x3d\xff\x26\xa7\x90\xd1\x8f\x97\x34\x0e\xd0\xd0\xe9\x11\xad\xda\x28\x44\x07\x07\xc2\x9b\x95\x9f\x2c\x4b\x45\xd2\xb5\xec\x9a\xf5\x96\xad\x76\xcb\x25\xa4\x7e\x22\x4d\x38\x81\x88\x20\xd0\x33\xb3\x44\xa9\xdc\x78\xac\x40\x02\xcd\xb0\x8c\x84\xdd\x46\xa2\x43\xe0\x1f\xde\x12\x49\x62\x71\x2c\x4d\x81\xe5\x91\x59\x03\xb1\x7b\xa8\x91\x9a\xc9\x16\x9d\x39\x32\x5b\x9d\x71\xbe\x88\xa2\xc4\x15\xc8\x4e\x39\xb2\x2f\xb6\x44\x96\x58\xb7\xed\x54\x55\x52\x85\x55\xbd\xa3\x75\x0d\x28\x65\x13\x21\x34\x55\x82\xb9\xfe\x62\x9c\x68\x3a\x4d\x25\x50\xe6\xba\xb7\x9d\xab\x96\xd7\x54\x95\xef\x1d\x54\xca\xa2\xc5\x03\xc6\x04\x6e\xad\xb6\x1c\x5c\xaa\x1e\xcb\x0d\xcb\xa3\x8c\x04\x72\xf7\xb0\x43\xf5\x1b\x16\xbd\xaa\xf6\x7b\x39\xc2\x25\xed\x53\xea\x85\xcf\x92\x38\x8f\xe2\x4b\x3c\x3c\x8b\xdc\xaf\x4c\x11\xc3\xe4\x25\xf6\xfd\xf1\x21\xa2\xf5\x8c\x39\x16\x8a\xd1\x60\xe7\x65\x7c\xe5\x2d\xa3\x10\x0b\x71\x6a\xef\x88\x6e\x95\xf4\xae\xb7\x02\x1c\x20\x06\x0a\xce\xca\x76\xce\x85\x9a\xb0\xaa\xe5\xc3\xdd\x5d\xe6\x8c\x17\x16\xaa\x01\xe6\x3e\x37\x23\xdc\x11\x64\x56\xf2\xef\x92\x31\x54\x96\xb6\x5f\x94\x88\xed\xef\xc3\xcb\x39\x5c\x53\x60\xfe\xda\xe5\x1a\x98\xa7\x6a\x40\x94\xff\x7f\xff\xd7\xff\x5d\x0c\x4b\x32\x08\xc4\xf8\x1b\x4d\xcf\x5b\x05\x77\x5a\xc6\x9f\x4b\xef\x3b\xd4\x82\x41\x25\xe5\xac\x30\x91\xc5\xd0\x92\x7f\xd8\xf2\x0f\x47\x21\xbe\x6d\x5e\x7d\x01\xab\xea\x90\x0e\xdb\x5c\x17\x94\x9d\x7b\x4b\x3c\xfc\x50\xd2\xf1\x2d\xf5\x42\x98\x47\x69\x96\x17\x54\xc2\x6e\xdd\x9e\xcd\xed\xd1\x0d\x06\x71\xd2\x26\x6f\x36\x2c\x64\x82\x37\x74\x5f\xf0\x5f\x58\x56\x09\xd7\x92\xbe\x05\xae\xed\x31\xac\x01\xe7\xa8\x10\xa8\x67\x05\x28\x64\x0b\x1c\x6a\x14\xe6\x61\xd3\x1e\xc8\xc0\x08\x9f\x66\x60\xce\x9d\x92\xbb\x2a\x07\xac\x94\xde\x4a\x7c\x25\x1b\x55\x77\xe0\x6f\x21\x82\x85\x5b\xcf\xfb\x6e\x37\x69\xbb\xf2\x6e\x20\x8a\x83\xe5\x25\x4e\x42\xd8\xe4\x42\x9e\xd2\xa8\xa8\xfc\xa2\xa0\xce\xd1\x2d\xa8\x83\xa2\x7c\x37\x02\x9a\x62\x9e\x66\xe1\xde\x24\xde\x96\x4c\x50\x5b\x47\x50\x13\x9d\x17\x4e\xb0\x3e\xff\xe0\xf7\xa4\x79\x7b\x84\x6f\x52\xd4\x15\x14\x7d\xf1\x75\x29\x8a\x26\xe3\x8e\x44\x9f\x22\xd1\xcd\x4d\x93\xec\xe6\xc6\x7c\x36\x84\x4f\x48\x91\x01\xc7\x81\x3f\x2d\xf9\xe1\x68\xf9\x81\x33\x2a\xc5\x1c\x83\x98\xf2\x14\x4c\xcd\x89\x82\x9e\x4a\x2e\xfc\x78\xfa\x62\xcf\x85\x10\x23\x65\x34\x2c\x2d\x6f\x61\x36\xc5\x09\xac\xf2\x37\x1a\x34\xe9\x37\xda\x9f\x87\x0d\x9f\x44\xf8\x1a\xd5\x68\xcc\xf1\x2b\xe1\xd5\x5d\x12\xa9\x58\x61\xd5\xb0\x15\xd9\x00\x4a\x4e\x89\x64\x63\xab\xe8\x4f\xcd\xdd\xa9\xe2\x44\xf9\x6a\x2d\x79\x23\x83\x7c\xb5\x86\xc3\xc6\x58\x32\x84\x7b\x87\x87\xdc\x28\x37\xbd\x13\xb1\x88\x91\xaf\xd6\x4d\x3f\x43\x9a\xa0\x57\xa5\x87\xbf\x67\xf0\x8d\x91\x15\x0e\x11\xc1\x9d\x2b\x9a\x66\x51\x12\xef\x1c\xc0\x0e\x06\x7d\x77\x0c\xf6\x94\xe3\xb3\x73\x20\x79\x85\xf8\x9c\x77\x57\x3c\xe7\x3f\xbe\xf9\xd3\x67\x11\xa4\x7b\x97\xac\x28\x3c\x7d\xf5\x1c\xfc\xcb\x68\x19\x42\xb2\xce\xa3\x55\xf4\x37\x9a\x66\x06\x2c\xa3\x0f\x14\xd2\xd1\x6f\x99\xc1\xa7\xc4\x18\x69\xcf\xd6\x34\x88\xe6\x51\xc0\x94\x37\x8c\x90\xe1\x6b\x2f\xcf\x69\x1a\x67\x08\x0f\x2b\xe5\x0b\x0a\xf3\x64\xb9\x4c\xae\xa3\xf8\xe2\x80\xc7\x3c\x99\xf8\x35\xce\x45\xc2\x4e\x21\x34\x3b\x3c\xb8\x5b\x2b\x30\xf2\x56\x61\x23\x8a\x5a\x1e\x91\x64\xef\xbe\xf9\x13\x67\x97\x38\x34\x59\x86\xb9\xeb\x03\x18\xeb\x33\xf2\x0e\x99\x53\xcd\x2e\x1a\x51\xe3\x7b\xd2\xef\x51\x9c\x84\xf4\xf4\x66\x4d\x2b\x67\xae\x8a\x55\x8b\x89\x47\x14\xcb\x71\xe3\xb7\x51\x7c\x91\xfc\xcf\x77\x70\x65\x8e\xdc\x91\x89\xd3\xf3\xaa\x86\x74\x96\xb4\x44\x46\x98\xc6\x02\x92\x97\x5e\x2f\xbc\x65\x03\xd2\x74\x64\xee\xf1\x40\x4c\x5a\xec\x8d\xe2\xa7\x18\xc5\xb3\x85\x97\xbd\xbe\x8e\xdf\x14\x5b\x60\x0e\x45\xa1\x51\xfd\x39\x16\x2f\x97\x48\x30\x6b\x1c\x27\x4a\x61\x31\xea\xc5\xf9\xfa\x10\x7b\x8f\x07\x89\x87\x8c\x36\x32\xad\xce\x3e\xf0\x04\x86\xac\x04\x7e\xaf\x05\xbf\x1a\xfd\x7a\xbb\x88\xe2\x84\xf5\xca\x83\x6b\xea\x83\x38\xa8\x2a\xa2\xd6\x23\x21\xd0\x82\x26\x9f\xbf\x11\x47\x54\x71\xd9\xe4\xb3\xf1\xf7\xcf\xe7\x86\x3b\xd9\x66\x49\xa4\x75\x62\xf7\xe7\x57\xc7\x3f\xe4\xf9\xfa\x2d\x1b\x32\xb2\xbc\x84\xf6\x6f\x7e\x74\xc1\x37\xb3\x8c\x7e\xcb\xfe\x6d\xdb\xc5\x16\xb9\x12\x5c\x59\x23\x73\x34\x2d\x03\x78\x17\x51\xbe\xb8\xf4\x47\x41\xb2\xda\x7f\x15\x7d\xa0\xaf\x82\xe5\xbe\x5c\x7c\xff\xf8\xe5\xb3\xa3\x93\x67\x47\xc0\x74\x58\x3e\xa8\x7c\x51\x06\xf0\x01\x00\x76\x2e\x33\x8a\xd3\xc2\x20\xdf\x79\xf8\x0d\x3e\xda\x7f\xf0\x0d\x5f\x51\x52\xb4\x2e\xde\x3c\x85\xff\xe9\x5d\x79\xef\x82\x34\x5a\xe7\xb0\x8c\xfc\xd4\x4b\x6f\x50\x41\xbd\xd4\x8f\x72\xf6\x6b\x6f\x9d\xd2\x20\x62\x76\x02\x3c\xcc\x83\x41\xf3\x28\x18\x89\xea\x5b\x76\x41\x94\x7e\x96\xac\x6f\x78\x7a\x98\x41\x30\x04\xcb\x24\x63\x78\x15\x05\x0b\x8f\x2e\xe1\x55\xb0\xf4\x2e\x2f\x16\xcb\x28\x86\x47\xaf\xdc\x60\xe1\xba\xcb\xff\x71\xb1\xf2\xa2\x25\x83\xf9\x58\xd4\x7f\xf5\xf2\x14\x8e\x36\x6b\x2f\x87\xe3\x28\xc0\x61\x5c\xac\x67\xf2\xee\xe2\xe9\xe0\xe8\xe2\x04\x5b\x35\x80\x67\x7a\x30\x60\xed\xa5\x19\x3d\xb9\x5c\xd1\x34\x0a\x8c\x6f\x8a\x45\xb6\x28\x13\x8f\xe0\x10\xf6\xdf\xef\x3d\x19\xfc\x12\xee\x0e\x7e\x19\xfd\x12\x3e\x18\x3e\xf9\xc4\xfe\xdd\x1d\x0e\xe8\xd9\xee\xde\xf9\x13\xf6\xf5\xc9\x9f\xf7\xa3\xaa\xee\xca\xcb\x17\x01\x8d\x96\x70\x08\xaf\xbc\x7c\x31\x62\xdf\xeb\x6f\xe7\xcb\x24\x49\x8b\xd7\xf8\xa3\x7a\x1f\x27\xf9\x77\x09\x0f\xfb\x88\x09\x8e\x9f\x24\x4b\xea\xc5\x4c\xc4\xfd\x28\x66\x1c\x08\xa3\x8b\x28\xdf\xa9\xea\x60\x96\xa7\x28\xbe\x78\xc5\x17\x4b\x76\x8a\xdf\xb0\x62\x26\xb9\x2a\x97\x27\xc9\x2b\x2f\xbe\x79\xce\xaa\x33\x19\xde\x11\xdb\xae\x98\x45\x64\x9a\x0e\xab\x24\x65\x76\xd5\x8b\x81\x8c\x6b\x3b\xb1\xb0\xc5\x4c\x02\xf5\xf4\xf8\xcd\x0f\x4f\xbf\x3b\x3a\x65\x50\x4c\x62\xd9\xce\x78\x32\x75\x67\x9e\x1f\x84\x74\x7e\xb1\x88\x7e\xfb\xb0\x5c\xc5\xc9\xfa\x63\x9a\xe5\x97\x57\xd7\x9b\x9b\xbf\x3d\xfd\xee\xd9\xf3\xa3\x17\xdf\xff\xf0\xf2\x7f\xfe\xe5\xf8\xd5\xc9\xeb\x37\xff\xeb\xed\xbb\xd3\x1f\xff\xfa\xd3\xcf\xff\xfe\xbf\xff\xfc\xab\x04\xf6\xbb\xa7\xef\x8e\xe0\x10\x08\x25\x4e\xf5\xf0\xf8\xf5\xf7\xbf\x16\x2f\xa4\xc7\xaf\x9e\xfe\xfc\xeb\xbb\xa7\x2f\x8e\x7e\x7d\x79\x72\x7a\xf4\xfd\xd1\x5b\x0c\xde\x92\xb9\xfc\x31\xca\xc5\x54\x36\xa9\x78\x3f\xb6\x61\x0f\xc8\x37\xd2\x33\x06\xe3\xe5\xc9\xa9\x6d\x61\xe5\x69\xab\x1a\xd4\x01\x60\x4a\xcd\x0a\xc0\x9b\xd7\x3f\xbd\xfb\xf5\xf4\xe8\x84\x39\x03\xc4\x00\x62\xb2\xff\xd9\x1f\x6a\xb3\x3f\x0e\xfb\x33\x66\x7f\x26\xec\xcf\x94\xfd\x71\xd9\x9f\x19\xfb\x83\xa5\x29\x21\xf8\xd7\xc2\xbf\xf6\x79\xd5\xbb\x77\xff\xeb\xed\x69\xd9\x6b\x3a\x35\xbe\xa9\xd0\x7e\x50\x7e\x85\x07\xfc\xd0\x75\xb4\x8a\x72\x48\xf8\x3e\x39\x1e\xb7\x4e\xe6\xf0\xfc\xe8\xd9\xcb\x57\x4f\x8f\x7f\x7d\x73\xfc\xf4\xd9\xd1\x3b\x03\x4e\x5f\xff\x7a\xf4\xf3\x9b\x5f\x4f\x8e\xbe\x2f\xbf\xbf\x79\xfd\xce\x80\x57\x2f\x4f\xd8\x0f\x03\x89\x81\x5f\xbc\x38\x94\x9b\xc8\x71\xc7\xe4\xc5\xe5\x8a\xc6\x62\x27\x76\xc2\x0c\x75\x4c\xe3\x3c\xf2\x96\x06\xe4\xc9\x8b\x68\x43\x43\xfc\x92\xa4\x2b\x2f\x17\xcb\x4a\xc9\x9b\xc2\x36\x18\xe0\xd3\x9b\x24\x0e\x8b\x14\x9e\xb1\x0c\x9e\x6e\x02\x8a\x9b\x01\xf9\xea\x4a\x9a\x5c\xc7\x30\x88\xe6\x70\xf4\xf6\xed\xeb\xb7\xef\xf0\x61\x7a\x49\x87\x23\xa9\xce\xbe\x2c\x04\x8c\x40\x47\xb3\x87\x0a\x9e\x29\x78\x68\x32\xfc\x4b\xae\x7f\x53\xb7\x84\xc5\x1e\x0e\x9e\xa9\x8a\x0f\xed\x5e\x65\x34\x98\x37\x92\xe5\xe9\x65\x90\x27\xa9\xc0\x46\x60\x52\x5a\x5d\xb1\xe9\x77\x10\x24\xf1\x3c\xba\x78\xed\xff\x56\xd8\x5f\x10\x16\x28\x8c\xae\x24\x56\x0a\xa4\xa2\x10\xf2\xd4\x0b\x3e\xf0\xc5\x25\x36\x38\xd2\xb4\x84\x69\x40\x96\x00\xd3\xd7\xd8\x5b\xd1\x22\x8d\xaa\x98\x0f\x86\x6c\x00\xa4\xcc\xd3\x06\x91\xe8\x23\x1b\xd5\x80\x47\x98\x20\xd0\xa8\x3d\x7b\x03\x87\x55\x9f\x46\xeb\x34\xc9\x13\x66\x00\xea\x85\x5e\x9f\x30\xc1\x8b\xe9\x75\x55\x74\x40\x86\xc6\x37\x0d\xdc\x1f\xf4\x7d\xe0\xe8\xf9\xcb\xd3\xa7\xdf\x1d\x1f\xc1\xf3\xa3\x17\x4f\x7f\x3c\x3e\x7d\x07\xbd\x75\x4a\x93\xad\x92\x78\x28\xa5\x3e\xa4\x73\xef\x72\x99\x17\x49\x64\x7d\xba\x4c\xae\x61\x75\x99\xe5\x9c\x40\x39\xbd\xa0\x69\x86\x3b\xc7\xc5\x0e\x52\x24\x5a\x16\x5d\x51\x48\xbd\xf8\x82\x66\x90\xe1\x66\xfb\x91\x0a\xb8\x00\xca\xc8\xed\x2d\x33\xcc\x31\xcb\xf3\x7c\x85\xe0\xe5\x90\x5e\xc6\x7b\x79\xb4\xa2\x70\x99\x31\x33\x5b\x51\x93\xf3\xbd\x09\x71\xbf\xc5\x71\xd6\xc4\xca\xdb\x44\xab\xcb\x95\xb4\xf7\x35\xa4\x41\xb4\xf2\x96\xb0\x5e\x7a\x01\xcd\x70\xa0\x65\x0e\x93\xc7\xb3\xc8\x44\xf1\x55\xb2\xbc\x62\xed\x85\xd1\x15\xaa\x55\xbd\x9d\xba\xbe\xc3\x21\x58\xa6\xca\x90\xd5\xd4\x60\x1b\x3a\xd7\x46\x13\x91\x69\x77\x41\xe3\xea\xb9\x38\x9b\xe1\xf9\xc9\x15\x6d\xf4\x81\x5b\x02\x2c\x8e\xa4\x6a\xc2\xef\xb3\x24\x6d\x43\x82\xaa\x89\xe9\x2e\x07\x35\x01\x18\xb6\xd8\xf8\xe3\x9b\xf2\x87\x09\x4f\xaf\xbd\x1b\xbe\x30\xfa\x37\x9a\x26\xad\xb2\xcf\x5f\xff\x74\x22\x7e\x10\x38\x4d\xae\xbd\x34\xcc\xd4\x25\x9f\x1d\xbd\x3c\x16\x3f\xac\xb2\xe4\xee\xcb\x78\x1e\xc5\x51\x7e\xd3\x2a\xfe\xe2\xf8\xf5\xeb\xb7\xfc\x87\x5d\x16\xdf\xd3\x16\xff\xe1\xe9\xf1\x8b\x5f\x39\xe2\x4e\x59\x3c\xa6\x5e\x4a\xb3\x1c\x62\x1a\x5d\x2c\xfc\xe4\x32\x1d\xc1\xcb\x39\x30\x7f\x32\x8c\xb2\xdc\x8b\x73\x03\x2e\xd7\x6a\x50\xbc\x5f\xe3\xdb\x80\x0a\x93\xeb\x58\x0d\xec\xe8\xaf\x47\x27\x00\x93\xdb\x00\xcb\x45\x51\x7a\x45\x63\xa9\x9c\x12\x3c\xa7\xec\xf4\x2e\xe0\xf5\xf4\x47\xc8\x9c\x09\xee\x5d\x20\x6b\x59\xb5\x5f\xfb\xfd\xf6\xf5\x8f\x27\xcf\x5f\x9e\x7c\xff\xeb\xab\xd7\xcf\x99\xe1\x74\xd4\x9a\x57\xe9\x9e\xdb\x32\x09\x47\x3f\xbf\x79\x7d\x72\x74\x72\xfa\xf2\xe9\xf1\xaf\x4f\x4f\xe1\x00\xce\xaa\x01\x1b\xe4\x11\xfb\x5c\x69\x4d\xa8\xd0\x23\x31\xfe\x0b\xd5\xf1\x69\x4c\xbd\x7c\x21\xc6\xdd\x62\xb5\x57\x8c\x6d\x59\x59\x29\xf2\x96\xcc\xd9\x44\x43\x33\x6a\x42\x3f\xa9\x9c\xc4\x03\xd8\x9b\xd6\x5e\x4b\x28\x1e\xc2\xde\x54\xd7\xeb\xaa\xdf\x7b\x6d\xa3\xd3\x85\x3f\xb7\x29\x5f\x0d\x7b\x8b\xa8\xb0\x7f\xf3\x1a\xad\x25\xe9\xc7\x5e\x85\xfc\xdb\xa7\x27\xdf\x1f\x31\x76\x35\xfd\x28\x35\x9f\x56\x51\x8c\x56\xbf\xde\x5f\xa3\xc1\xa9\xcb\x38\xa4\xe9\x9c\x0d\x68\x79\x82\x76\x08\x92\x20\xb8\x4c\xb3\x1e\xe6\xd8\x96\x03\x30\x18\x53\xf6\x65\x58\x2b\x2a\x90\xc3\x15\x36\xda\xc1\x27\x06\x73\x8f\x74\x72\xaa\x18\xb7\x9a\x3d\x90\x79\x95\x5c\x55\xe8\x17\x1a\xb4\x55\x17\xc0\x36\x5d\x80\x01\x19\x4d\x67\xd3\xc9\xcc\x26\xb6\xe3\x4e\x2c\x9b\x8c\xa7\x74\xd7\x36\xdd\x61\xb3\xee\x8b\x24\x2d\xc8\x0d\x8f\xb9\x8f\x4d\x47\x17\xa3\x86\xe3\xb2\xc3\xbc\x6d\xf1\xd9\x19\x8e\xd6\xcb\xcb\x6c\x40\x86\xb0\xf2\x6e\xd8\xb8\x9e\x2d\x93\xeb\x3a\x52\x05\x44\xee\x79\xeb\x69\x85\x0b\xfd\x3a\xb9\xf8\x69\x41\x99\x2b\x28\xb9\x8f\x18\x12\xcd\xc0\x4b\x29\xb3\x87\xa9\xf0\x75\xeb\x4d\x0b\xa7\xf7\x10\x7d\xde\x9e\xa6\x59\x11\x36\x2b\xc4\xa8\x62\xab\xfd\x67\xe8\xae\x30\xec\xa2\x38\xff\xab\xb7\x8c\x42\x2f\x4f\xd2\x93\x44\x60\x51\x73\xb0\x11\x42\xc3\x73\xcc\xb0\xce\x4b\x0c\x90\xca\x10\x7e\x8a\xf2\x05\x87\x61\x14\x4d\xa9\x5f\xef\xab\xda\xd5\x92\x29\x4f\x70\xf7\x23\x9f\x96\x5f\xa4\xde\x7a\x11\x31\x47\xf8\x66\x2f\xa3\xc1\x65\x8a\x2e\x5b\x98\x94\xce\xd2\x05\x8d\x85\x5f\x64\xb0\x9e\x78\x57\x5e\xb4\xf4\xfc\x65\xa3\x0f\xcf\xde\xfe\xfb\x9b\xd3\xd7\x20\xe2\xae\xdd\x42\xdf\x45\x4c\xa5\x5b\x84\x81\x9c\xa4\xe9\x14\x05\xde\x32\xb8\x5c\xe2\x71\x50\x74\x8a\xb0\xd4\x65\x76\x00\x1e\xfb\x0a\xed\x91\x95\x81\xfa\x78\x99\xe4\x11\xd3\xa4\xc1\x47\x38\x04\x0f\xf6\x21\x1e\x32\xb6\x14\xc0\x98\xd3\x29\x5f\xa8\x81\xb3\x84\x24\x4d\x69\xb6\x4e\xb8\x0b\x56\xf3\xd1\x94\x6d\xa4\x74\xe5\x45\xcc\xaa\xc0\x20\x6d\x01\xcf\x0e\x20\xc5\x96\xf7\x20\x86\x07\xf0\xb1\x09\x41\xef\x5a\x99\x0d\xe0\x51\x06\xeb\x24\x8b\x72\xe6\x65\x47\x73\xc4\x94\x79\xab\x21\x8d\x43\xdc\x49\x84\x29\xaa\xae\xa8\xc1\x63\x78\xd2\x93\x0e\x97\x8c\x34\xda\x58\x78\x7c\xa2\x94\xb1\x09\x51\x16\x5d\xc4\x20\x1e\x14\x2d\xb5\x60\xc9\x1f\x3c\x4b\x22\x33\x0f\x37\x01\xae\x56\xb8\x33\xf0\x43\xcc\x66\x9f\x5e\x06\x3b\x79\x7a\x19\x07\x48\x9d\xc2\xdb\xde\xc1\x11\x29\xca\xba\x80\x33\x1f\xe2\xca\x5b\x32\x5e\xe6\x09\x0c\x3c\xf8\x16\x59\x19\x4b\x71\xb4\x0e\x17\xd1\xbe\x4d\x47\xb3\x24\x85\xc1\x9b\x9b\x7c\x91\xc4\xf0\x6d\xdb\xfb\xad\x3c\xb6\x89\xa2\xcb\xab\xf5\x92\x8a\xe9\xfc\x82\xc2\xcb\xa3\xa3\x23\x98\x8e\x1d\xa9\xe9\x62\xf6\xd9\x82\x7b\xf4\xe3\xb3\xe3\x97\xcf\xd9\xf7\x19\x1c\x5d\x06\xcb\x28\x8c\xbc\xb8\x9a\x91\xc0\x47\x7e\x4e\x29\x1e\xc4\x43\x78\x00\x18\xdc\x1a\x30\x89\xf6\xfc\x6c\x10\x0f\xdb\x78\xd6\x59\xd3\x10\x25\x6f\x79\xed\xdd\x54\x12\xd5\x27\x96\xac\x7e\x9b\x6f\x06\xc7\xa2\xf6\xa4\x8d\x39\x32\xb7\x4d\x88\x66\x13\x8c\x7c\xdc\x84\x97\x32\x83\xca\xcf\xe6\x6a\x92\xbe\x57\xf3\xb6\x56\x87\x9f\x2e\xf3\x45\x72\x79\xc1\x8f\x49\x63\xb4\xa0\xae\xbd\xf5\x49\x27\x03\x6e\xb0\xa2\x37\x38\x5c\xc5\x49\x0e\x17\x4c\xb7\x2e\x33\x3a\xbf\x5c\x42\x4a\xb3\xcb\x65\x9e\x75\x3b\xa7\xaf\x5e\x3f\xff\xf1\xf8\x75\xe1\x9a\x6e\xe1\xe6\xcc\xb6\x9c\xaf\xb6\x23\x84\xfc\xd4\x0b\x15\x78\x15\xbf\xf2\xe4\x4d\x72\x4d\x53\x1d\x51\xf8\x26\x8f\x37\xaf\x7f\xfa\xf5\xcd\xdb\xa3\x67\x2f\xdf\xbd\x7c\x7d\xc2\x98\x6f\x1a\x62\x67\xf2\x75\xb4\x5c\x22\x2d\x62\x0c\x74\xd1\x50\xd1\x70\x1d\x62\x1d\xd6\x21\x8f\xca\x75\xf5\x58\xe7\xeb\xcc\xf9\x2c\xb4\x58\x8f\xe2\x8b\xc8\xc8\x70\xff\x06\xbb\xa6\x08\xa4\x8c\xca\xc9\xeb\x8a\xe6\x8b\xa4\x61\x8d\x5e\xbc\x7e\xfb\xea\xe9\x29\xae\xb1\x35\x91\x11\x53\xe7\x77\x74\xed\xa5\x6c\xcc\x3c\x80\x9d\xd1\x8e\xd1\x2a\x76\x91\x26\x97\x6b\xb9\x90\xa1\x2d\x84\x19\x6b\xed\xf6\xdb\x8c\x06\x49\x1c\x7a\xe9\xcd\xf7\x55\x31\xb3\x5d\x6c\x9e\x7a\x68\x04\xbe\x6f\xb6\xf8\xcb\xe6\xa9\xb9\x63\x94\x94\x8a\x93\x78\xcf\x4f\xa9\xf7\x81\xc9\x30\xe6\xca\xec\x01\xc5\x1b\xac\x15\xfa\xfc\xf0\x1b\x39\xc4\xf9\xbb\x7d\xe4\xd8\x12\xf3\x92\x5e\x9f\xbc\x3b\x7d\xfb\xe3\xb3\xd3\xd7\x6f\xbf\xe9\x0a\xb1\x2a\x83\x80\x68\x33\xf8\x4a\x0e\x33\x01\x6d\x93\xa9\x0e\x28\x32\xe7\xb4\x48\xa3\xcd\xf7\x8e\x57\xd0\xc5\xf2\x9a\x04\x42\x86\x16\x17\x27\xa9\x3f\xf1\x0d\x76\x9f\xca\x8a\x98\xe8\x40\x2c\x59\xa0\x3f\x5e\xc3\xe2\xcc\x3f\xaf\xce\x60\xb3\xee\xf8\x5e\x86\x4d\xc7\x23\x78\xc9\x23\x65\x06\x58\x4c\x11\x26\x4e\x15\x26\x53\x47\x5c\xcb\x58\x67\xe5\x5f\x43\x6c\x80\x0f\xc3\x86\x48\xe3\x82\xb9\x01\xd4\x80\xc8\x60\xb8\x19\xb0\xa4\xb1\x01\x59\x9e\xb6\x25\x6d\x23\x0e\x77\x3d\x6c\x4f\x8b\x63\x3c\x4e\x23\x53\xfd\x32\xf3\x2e\x68\x79\xdb\x53\x4c\x1b\xde\x7b\x34\x87\x01\xdc\x1b\xc0\xa6\x24\x72\x32\x97\x28\x3c\x44\x44\x5b\x18\xec\xef\xc3\x4e\xd5\xa3\x61\xad\x41\xe6\x88\xca\xed\x1d\xc0\xdf\xe3\xcf\x3b\x2d\x10\xac\x61\xee\x53\x0f\x21\xf5\xa2\x8c\x0e\xc0\x9a\x18\xb0\xd3\x05\x6a\xc7\x80\x18\x86\x0f\x5b\xb0\x84\xb0\xd4\xe7\x31\x82\xce\xf5\xd2\x9f\x5b\x24\xdb\xa9\xd7\x1a\x72\x6e\xe3\x62\x52\x5c\x04\x46\x0f\xe0\xef\x7e\xa3\x0b\xda\x9a\x0c\xd5\x64\xce\x83\xa6\x8a\x7a\x48\x6f\x1f\x0e\x0f\x21\xbe\x5c\xe2\xa9\xa2\x7b\xd5\xe4\x61\x00\x3e\xde\xb2\x31\x71\x0c\x88\x42\x03\x76\x18\xc4\x9d\x0e\x26\x3c\xbf\x5c\x2f\x99\xa1\x6d\x0e\xf6\x45\x43\xb1\x8e\xab\x6d\x7b\xca\x3e\x9b\x51\x06\x87\x10\x8f\xb2\x36\x89\xf9\x6b\x8a\xaf\xa9\xee\x75\x00\x87\xd8\x28\x2b\x14\xc0\x10\x9e\x30\x58\x78\xf4\x70\x08\x07\x10\xab\xab\xf1\xa8\xbb\xfa\x1d\x67\x6c\xfb\xdd\xe7\x36\x35\xb0\xbf\x03\xa6\x3a\xd5\xb9\xaf\x18\x37\x2b\x70\x55\x66\x64\xbc\x7f\x1f\x3d\x76\x13\x77\x27\xf5\x50\x81\xb0\x89\x05\x3c\x02\x13\x9e\x88\x3e\xed\xc5\x06\x9b\xed\xb3\xae\x90\x87\x6d\x04\x40\x4c\xb2\xbd\x2c\x87\xb5\x97\x2f\xd0\xcb\x29\x22\xeb\x6d\xfe\x40\xc5\xa3\xc3\xc3\x43\xf8\xc7\x3f\x62\x2d\x42\x50\x1c\xa9\x04\x3c\x73\x61\xe0\xb1\xca\xf8\x21\x44\xf0\x98\x8d\xd6\xec\xcb\xfe\x21\x2e\xa8\xd1\xdd\x5d\x95\x7e\x54\x3d\x63\x00\x34\xec\x83\x92\x85\x67\xf1\xb9\xbe\x48\x17\xbb\xa0\x83\x65\xa0\x66\x1b\xfb\x64\x39\x9b\x4f\xc5\xb0\x8b\x1b\x95\x5b\x95\x8a\x4d\x6b\x4a\x6c\xd0\x7c\x95\x0b\xd0\xa3\x9c\x66\xf9\xa0\x06\x10\xb5\x47\x18\x08\x79\xf9\x7a\x00\x1b\x6e\x5e\x51\x64\x34\x44\xe3\xa2\x90\xe5\xa9\x7c\x92\x0b\xf7\x0b\x1e\x82\x33\x46\xc9\xe0\x6d\xb1\x22\x5c\xd2\xc9\x50\x96\x92\x36\x05\xb6\xea\x9a\x0f\x87\xe0\xf3\xfc\x30\xdd\xc4\x52\x19\x85\xa3\x38\xc3\x18\x00\xef\x33\x8f\x10\x46\x19\xf7\x9b\xf9\xc5\x81\x8d\xc5\x0f\x8f\x2f\xfc\x08\xff\x9a\xd9\x1c\x85\xbc\xee\xef\xc3\xd3\xe5\x32\xb9\x56\x06\x12\x9b\x17\x0b\x72\x53\x48\xcc\x72\x25\x54\x63\x9f\xd0\x10\x92\x0e\x55\x6c\x2d\xab\xe9\x4c\xda\x13\x88\xe1\x00\x89\xa3\x61\xa5\x20\x07\x52\x01\x79\xdf\x20\xc2\x2e\x6a\xc7\x2e\xf3\xf8\xeb\xf1\x69\x05\x3c\x85\x1c\x33\xf2\x5c\x25\x51\x08\xeb\x24\x17\xc4\xc1\x1b\x0b\xd6\x29\x15\x24\x4a\xe6\x55\x70\x8f\x79\x38\x27\xde\x09\xa3\x3c\x52\xca\x71\x76\xc5\x22\x9a\x9a\xf0\xf1\x4d\x31\x91\x88\xe2\x1a\x03\x98\xcb\xcd\x5d\xfe\xb9\x17\x2d\x21\xbc\xa4\x45\xc8\xe3\xec\x88\x9e\x9f\xed\xee\x9d\x6b\x28\xbf\xad\xa5\xbc\xc7\x2c\xe5\xa7\x4f\x0a\x92\xde\x1b\x20\x6b\xde\xd2\x8b\xa3\xcd\x7a\x00\x3b\xef\xf7\x9e\xec\xc0\x2e\x0c\x80\x99\x90\x9d\x33\xf6\xbd\xd8\xf7\x20\x54\x83\x99\x2e\xe6\xf9\xec\xc2\xce\xf9\x2e\x6b\x65\x57\xc9\xa9\x9d\xc1\x93\x83\x5f\x7e\x19\xe1\xd9\x2b\x56\x76\xf8\xe4\xcf\x3b\x86\x0f\x8f\xc0\x9e\xc2\x13\xd8\x89\x76\xe0\x40\xe8\x35\x57\xf7\x2c\x4f\x87\x5a\x09\xea\xd3\x7c\x85\x8f\xa0\xe1\x30\x66\x21\xbc\x5c\xdd\x66\xd4\xe8\xb6\x0d\x7a\x83\x26\x62\x8d\xf7\xef\x63\xdd\x94\xe2\xf2\xe0\x00\xf6\xdf\x9b\xbf\x8c\xcc\x07\x9f\x7e\x19\xed\x1b\x48\x81\x22\x39\xc9\x63\x20\x63\xb5\x8f\x50\x7c\x54\xee\xca\x2d\xf7\xb3\x68\xfc\xb8\x92\xd0\xdc\x87\x8b\x70\x3d\x52\xda\x39\xa3\x71\xd9\x34\x44\x16\xb8\xbe\x49\xe9\x15\x8d\x73\x58\x7a\x39\x9b\x44\x94\x5b\x1d\x45\x7f\x13\x3c\x0b\x71\x45\x71\x26\x21\x76\x46\x29\x41\x71\x19\x17\xbb\xfb\x5b\xcd\x77\x0d\x2c\xbf\x83\xe5\xd7\x98\x72\xd1\x93\xef\x3c\x46\x3e\x14\x4b\x36\x92\xfb\x06\xa2\xd0\xeb\xbe\x3e\x2f\x56\x90\x93\x28\xce\x9f\xb4\x5d\x4d\xee\x33\x30\x24\xf1\x6c\xc4\xeb\xf9\x60\x67\xb4\xc3\xd4\xe5\x31\xc7\xb5\xea\x44\x29\x66\x6c\x1e\x8d\xe2\xa5\x98\x5f\x34\x4c\x8f\xb2\xc1\xa8\xa0\x0a\xf5\xd2\x60\x31\x80\x7d\xba\x1f\x01\x6f\xd2\xd4\x7b\xb2\x34\xa7\xe9\x2a\x8a\xab\xb5\x2d\x8d\xe1\xa2\xa8\x5d\x43\xec\x56\xd4\x26\x33\x85\xdd\x43\xd8\xad\x98\x02\x11\xb3\xe9\x2a\x09\x94\xd8\x77\xe9\xf3\x19\xe2\x80\x3b\x57\x4d\xa2\x43\xb9\x45\xb5\x6c\x5d\xdd\x09\x31\x3b\x6c\x63\x5e\xf0\xa0\xd8\x31\x5d\x03\xaf\xe0\x69\x41\x8b\x25\xf5\x30\xd4\xf5\x37\x9a\x26\x8d\xa1\x81\x3b\x84\x22\xc1\x46\x43\x4e\x23\x21\xa7\xfc\x1e\x47\x15\x23\xab\x26\xf2\xd4\x8b\x96\x9d\x6d\x2c\x69\x5c\x47\xbf\xd9\xdc\xde\xde\x92\xc6\x55\x93\x0d\xf2\x35\xd5\x84\x4d\x70\x19\x48\xc1\x96\x96\x04\xa1\x39\x6f\x2b\x65\x0b\x0b\xb5\x18\x45\x19\x5e\x79\x2c\xac\x42\xe1\xd8\x5c\xd1\x54\x6d\xd4\x58\x8b\x92\x1d\x54\x8e\xbe\xbf\x93\xe1\xe4\xce\xff\xe5\x8a\x99\xf9\xca\xe0\xb3\x6e\x0a\x73\xae\xb7\xa8\xcc\x32\x3c\xe0\x76\x55\x29\x6a\x14\xef\xb2\xde\x53\x0f\x32\xfb\xfb\xf0\x5a\x2c\x38\x3e\xd1\xa9\xd8\xe3\x72\x55\x4f\x3b\xaa\xa0\xb8\x2b\x57\xfb\xc5\x87\xcf\x25\xc4\x9c\xf1\x72\xb9\x54\x33\xec\xc7\x62\xed\xb6\x8d\x4b\x53\xef\x8a\x55\xd9\x2e\x94\xfe\x77\x7b\x17\x4a\x0d\x9d\x33\x81\x90\x09\x8a\x29\x4e\xcf\x80\xd0\x31\x77\x12\xc0\xcf\xf5\xd3\xc2\xd3\xd4\x8b\x33\xf4\xd6\x98\xc3\xa7\x2d\x46\x8b\xa4\x09\x85\x03\xad\xb7\x86\xa2\x46\xc4\x6a\x5c\x63\xe8\x37\x4f\x00\x55\x0c\x55\x2e\x4f\xe0\x82\xe6\x7c\xdf\x3f\x9e\x63\xa3\x7c\x11\xa3\x08\x33\x07\x09\x9d\xcf\xa3\x00\x57\xd2\x44\xc2\x25\x55\x0b\x11\x4e\xe9\x29\xd7\x56\xf8\xb6\xdc\x5e\xaa\x99\xcb\xcb\x36\x32\x62\xa6\xb8\x2a\xaf\xaf\x10\xf1\xb3\xa8\x9d\xf3\x5f\x56\x30\x1a\x32\x42\xf3\x03\x20\x35\x1b\xcf\xad\xb6\x52\x1d\x8a\x4f\x65\xca\xf6\x24\xa4\x8a\xa6\x1f\x76\xb6\x0d\x9c\xc3\x8a\x86\x23\xa3\xde\x4b\x8e\x84\x0e\x86\xc6\xdf\x01\x85\x91\x8c\x3a\xc0\x30\x96\x94\x0d\xee\x69\xc7\x95\xb2\xd5\x2e\xa9\xe6\xf0\xf6\x0e\x91\x08\xb7\x71\xd2\x38\x3d\x1f\x42\xb4\xb7\x87\xe3\x01\xa3\xc2\x8e\xb9\xa3\x9f\x48\xcb\xe4\x53\x7b\xdc\x4a\xa4\x55\x36\x43\xad\xe4\x3d\x0a\xde\xe8\x47\x33\x8c\xf1\x59\x1b\xe9\x86\x37\x6f\x5f\xbf\x39\x7a\x7b\xfa\xf2\xe8\x9d\x54\xa6\x5a\xca\x10\xbb\x58\xe1\xb0\xd8\xcf\xfa\x50\x55\x0a\xe7\x94\xbf\xfe\xf8\xa6\xde\x6a\xf3\x3d\x2e\xe3\x1e\xca\xee\x63\xb3\x04\xee\xfb\x3a\x04\x4b\x5f\x82\xaf\x90\x1e\x82\xad\x2f\x52\x6c\x9c\x3b\x04\xa7\xa7\x90\x40\x68\xdc\x53\x0c\x97\x4e\x0f\x61\xd2\x53\x4c\x20\x3f\xed\x29\x56\xf4\xc0\x55\x95\x13\x4b\xaa\x87\x30\x7b\xa8\x5d\x83\x78\x86\x1b\x4b\x2f\x53\x0a\x51\x3c\x4f\xf1\x9c\x62\xbe\xbc\xd9\xc3\x3d\xa9\xcc\xd5\x11\x87\x33\xf6\xae\xa3\x90\x42\x46\xf3\x3c\x8a\x2f\x32\xdd\x32\xc2\xd3\x20\xa0\x6b\x8c\x06\x8b\x23\x3f\xb8\x94\x51\x46\x36\x60\x19\x65\xb9\x21\xfc\x8c\x18\x77\x45\xac\xbc\xf8\xa6\x30\xb3\xe5\x99\x2b\x10\x99\x71\x23\x9a\x41\x92\xca\x0d\x60\xd6\x57\xe6\x8f\x65\x90\xd2\x6c\x4d\x83\x3c\xba\xa2\xcb\x9b\x03\x0d\x3e\xad\xbd\xab\xd5\x62\x45\xb5\x3c\x51\xac\xd3\x55\xeb\x13\x75\x10\xf5\x10\x87\x1e\x84\xab\x03\xd0\xd8\x80\x57\x2e\xb5\xf0\x7f\xce\xce\x65\x48\x7b\x0c\x91\x26\x3e\x0d\x22\x6c\xf5\x39\x13\xe1\xd4\x12\xa2\x89\xf0\x46\x8d\xfe\x8e\xce\x1b\x9d\xc5\x4d\x67\xd5\x47\x81\xeb\x49\x12\xef\xe1\xce\xb1\xe8\xf7\x47\x7a\x8f\x14\x58\x17\x6f\x48\x17\xf6\xc2\x37\xac\xb0\x17\x47\x5c\x3e\x95\x2c\x13\xdb\x9f\xc4\xbe\x1d\xc2\x44\xd0\xac\xc3\x10\x7b\x7b\xbe\x08\x86\xbc\x30\x0e\x35\x91\x29\x3f\x7c\x3d\x5c\x27\x32\xf5\x75\x66\x3d\x80\x0e\xb1\x15\xeb\xc1\x55\x3f\xb8\x4a\xca\x20\xde\xd1\xee\x75\xe6\x16\xff\x9a\x0b\xc9\x05\x68\x3e\x25\xfc\xdc\x2a\x5f\x5f\x51\xae\x50\xe9\x2e\x1f\xfd\x8d\xd6\xc5\xa2\xe8\x7d\xab\x7c\x7b\xb9\xb9\xbb\xbc\x7a\xdd\x59\x8f\x4f\x6b\x71\x59\x8b\x8f\x5c\x75\x20\xed\xf3\xf7\x32\x36\xc9\xe1\xa1\xe4\x6a\x2f\xbb\xe0\x8d\x30\x92\x92\xb5\xf3\x52\xbe\x9e\x86\x61\x1c\xb1\xfb\x03\xcf\x39\xb3\xa9\xc3\x50\xd3\xde\xd1\xe8\xa2\xb6\x28\xdb\x3c\x35\x30\xb0\x4c\x03\x1c\xdc\x9b\x55\xdb\x46\xd4\x59\xe7\xef\x4d\xd3\x79\x80\xdb\xfe\xeb\xc6\xf0\x00\x1c\xf8\xac\x43\xeb\xe5\x45\xcc\x26\x7b\x55\xef\xf6\x25\xeb\x9d\x51\xdc\xc8\x84\x0b\x7b\x49\x5a\xa5\x2b\xae\x75\xe4\xad\x58\xd8\x2e\x87\x93\xea\x16\x80\x8a\x64\xc1\x65\x9a\x96\x9b\x45\x33\xf5\xd2\x72\xb3\x77\x70\xd8\xc8\x3d\x2a\x4b\x1b\x26\x1e\x33\x60\xdd\x5e\x4c\x8e\xda\x67\x5e\xd8\x27\xc5\x93\xad\xed\xe7\x1e\xe6\x1f\x13\xc7\x9b\xda\xaf\x13\xf6\xfa\xcc\x3c\x6f\xbf\x61\x13\xe5\x43\x48\xd8\x1c\x57\xc4\x9c\x13\xf9\x28\xb1\xc2\x6b\x7c\x52\xef\x0f\x9f\x2b\x24\x8d\xc3\xb4\x83\xb5\xb4\xbe\x33\x80\x2b\xd6\xc6\xd9\xfa\x1c\x86\x70\x4f\x4c\x3b\x1b\x9e\x25\xff\x1c\xa8\x60\x7b\x55\x3c\x35\x6a\x02\xf5\xce\xa2\xdd\xdd\x3a\x58\x45\x54\xa5\x2e\x5d\xa5\x81\xeb\x18\x96\x5b\x9b\x7b\x76\x84\xac\x0e\x9b\xd0\x5a\x4b\xd2\x57\x8a\x25\x69\x5d\xe5\xc6\xaa\x74\xb3\x2a\x76\x7f\xe1\x65\x03\x58\xc3\x21\xec\xd4\x2b\x8b\xf5\x00\x79\x99\xfa\xca\x60\x73\xae\x57\x4f\x7f\xc6\xe5\xea\x35\xa8\xe3\xef\xad\x33\x36\x57\xed\x25\xad\x3a\x73\x52\xc6\xba\xc3\x46\xc5\x36\x9d\xeb\x0a\xab\x21\xb3\xbb\x15\x91\xeb\xa0\x6e\x47\xe3\x7a\xdd\xdb\x91\xb8\x56\x57\x4b\x61\xb7\x93\xbe\xcd\x73\x14\xdb\x92\xb7\x56\x4f\x11\xe4\xad\xbb\x76\x2d\x6f\xa9\x59\xbe\xd7\xcf\xd3\xf9\x6d\xf8\x5e\xa5\x14\xe7\x1d\x0c\x6b\x60\x77\x3b\x8e\x35\x2a\xdf\x8e\x65\xf5\xca\xda\x6d\x19\x3c\xa4\x91\x61\x8a\x8c\xc1\x95\x7e\x65\x4a\x94\x93\x58\xce\xec\x26\x92\x08\x79\x2f\x18\xdf\x94\x8b\x33\x72\xbe\x95\xf2\x15\x9f\xda\xa1\x13\xd6\x84\x7a\x59\xb9\x51\x9c\x9f\xf2\x60\x8d\xe9\x8b\xb7\xed\xaa\x1c\xb1\x6b\x08\x33\xef\xd6\x36\x48\xd7\x4f\xc9\x0c\xea\x18\x31\x63\xcc\x57\xd7\xf6\xae\xe0\x00\xae\x00\x13\xb3\x6d\x11\x4f\x50\xe9\xc1\x99\xe6\x94\x2f\x34\xe3\x78\xe5\xc1\x95\xf6\xcc\xe1\x2e\x13\x07\x0e\x51\x37\x2f\x10\x5a\xa1\x9c\x1b\xf4\x6a\x07\x47\xf3\x96\x66\x0c\xeb\x04\x5e\xcc\xaa\xf9\x14\x17\x02\xb6\xab\x73\x4b\x93\xc7\xea\xfc\xbe\x6a\xb3\x47\xba\xf5\x86\x6c\xaf\x37\xd5\x19\xa0\x7e\xa5\xa9\x8e\xc0\xfc\xa7\x68\x0c\xd6\xbe\xe2\x8a\x20\x9f\x5d\x1a\x48\x88\x6d\xaf\x38\xec\x53\x22\xd5\xdc\xa1\xc7\x10\xd9\x85\x9d\x86\xb4\xec\x18\x0c\xe0\x1d\x75\xb0\x79\x12\x4c\xa5\x7d\x62\x0e\xdc\x9a\xb6\x2a\x26\xad\x5d\x43\x07\x87\xd2\x99\x28\x62\x8b\x61\x00\xa1\x74\xcb\xf1\x15\x2e\x86\xdd\xbb\x77\x05\x9f\x3e\x89\x1f\xa4\xfa\xaa\xdf\xef\xd2\xb5\xb9\xaa\x76\xc6\x68\x50\x9d\x7d\x62\xad\x0c\xe1\x89\xe6\x5c\x11\x1c\x28\x4f\x34\x69\x17\x3f\x64\xa6\x6b\x76\x54\xd4\x44\x41\x64\xe0\xb8\xbb\x00\xf0\xc6\xda\x2c\x17\x21\x8b\x2f\x64\xb9\x80\x72\x5b\x96\xd7\x60\xf0\x53\x56\x70\x19\x97\x07\xa7\x0e\xe0\xef\xfc\x61\xb7\xa4\xf0\xc6\x7f\x1f\x49\x29\x4f\x6b\xdd\xbb\xc7\x80\xdc\xbf\x5f\xa0\x59\xcd\xaf\xc4\x03\x39\x5f\x93\x46\xdd\x05\x26\xf7\xef\xc3\x3d\x01\xb7\x5a\x93\x94\x75\x7f\xa7\x4d\x8a\x9d\x22\x39\x8c\x92\xfd\xff\x49\x32\xc5\x3b\xd1\x96\x29\x39\x84\xa5\x99\x35\xcc\xb6\x9a\x35\xc8\x80\x6e\x37\xd8\xca\x35\x6f\x37\x7c\x4a\x35\xb5\xf3\x85\x59\xe7\x58\x51\x3f\xda\xb2\xed\x6c\x41\xaa\xd5\xa6\x68\x3d\xa6\xf7\x85\x13\xde\x3a\xb0\xdb\xd1\xb5\x5e\xf7\x76\x94\xad\xd5\xbd\xf3\x6c\xb7\x79\x8c\x66\x5b\xfa\xd6\xea\xb5\x29\x2c\xc2\x6a\x45\xa4\x53\x4f\x01\x51\x50\x90\x8d\x17\xef\xef\x3b\xaf\xd5\x6d\xa3\x84\x3d\xb9\xaa\x9b\x12\x8d\x2a\x97\x47\x76\xae\xbe\x9a\x3d\xd8\xa9\x77\xea\x0b\xbc\x0d\x8e\x5c\x83\xc8\xc5\xce\x50\x69\x31\x50\xbf\xb4\xf4\x56\x3e\x97\x52\x6d\x3f\xbd\x5e\x24\x19\xad\xf6\xda\xe6\xd2\x09\x30\xb1\x10\x54\x06\xcd\x74\xeb\x4c\x55\xd2\x20\xed\xb1\x95\x9e\x38\xe0\xca\xdb\x34\x83\x80\x45\xe7\x56\xde\xe6\x75\xfa\x2a\x8a\x07\x52\xf0\x0e\xde\x8c\x96\x39\x0c\x1f\x7e\xa5\xee\x8a\xa3\xfa\xff\xc4\xee\x46\xf1\x2d\xbb\x7b\x71\xd7\xee\x46\xf9\x02\xbc\xe2\x54\x35\xef\x36\xfd\x78\xe9\x2d\x99\x75\x4b\x52\xb8\xc0\x73\x4b\x29\xdf\x03\x64\xe2\xee\xde\x25\xcd\x32\xb1\x27\xc8\xa8\x75\x3b\x16\x3b\xa4\xc3\xb5\xc1\xaa\x36\x62\x64\xd1\x1c\xc2\x35\x23\x69\xb2\x8a\xf2\x9c\x86\x46\x33\xcd\xcd\x00\x77\x41\x66\xb8\x71\xa9\xd8\xba\x25\xc3\xc7\x5d\x5c\x18\x72\x5f\xa7\x49\x78\x19\xd0\x70\xa8\xe3\xc0\x59\xb8\x96\x0e\x3a\x3d\xaf\xb5\x33\xda\xd2\x84\xd7\x00\xee\x70\x02\x0d\x86\x4d\xa4\x5b\xa6\x3c\x5c\xcb\x56\xa9\xa3\x66\xc3\x90\xeb\xeb\x6d\xe9\xa4\x29\x05\x49\xf0\xf5\x10\x06\xdd\x01\xf4\x75\x72\x6d\xfd\x3a\xb6\x31\xfb\x99\x65\xca\x1f\x45\xbc\xa0\x90\xa4\xb1\x0d\x7e\x94\x97\xd3\xf9\xd8\x10\x9b\x75\x4c\x78\x74\x88\x5b\x85\x67\xa6\x39\x25\xb3\x99\x35\x76\xa6\x8e\x39\x9b\x59\xad\x01\xf2\x19\x6e\x7f\x8d\xe6\x3c\x03\x5e\xd9\x63\xc1\x5f\x79\xfb\x99\x6d\xf1\x4b\x9b\x39\xc5\xc2\x64\x15\xd3\xac\x9d\x42\xe2\xe5\x1c\xa2\x1c\xc2\x04\x13\x0e\x65\xd9\xe5\x0a\x13\x88\x2c\xa9\x97\xe5\x02\xdb\xba\x00\x19\xfc\x60\xc0\x75\x94\xd1\x56\x79\xdb\xc4\xf2\xad\x36\xcc\x8d\x23\x48\xc3\x84\xd9\x7a\x6f\x9b\x06\xa6\x84\xae\x9e\x58\x78\x81\x25\xcf\x40\x27\x9e\x60\xbe\xb8\x51\x8b\xec\xbc\x2b\x63\xdb\x8f\x72\x31\xf9\xa9\x13\xe2\x41\xc1\x18\x71\x1b\x03\x82\x6c\x8c\x0e\xcd\xb5\x84\xd2\x4e\x88\xfc\x82\x03\xd0\xc0\x44\x83\xd1\x00\xd6\x5c\x3c\x28\x16\x0a\x5a\x78\x49\x54\xf8\x04\x26\x7f\xe2\x8a\x2b\x13\x54\x7b\xdf\x15\x00\xdc\xaa\x7a\x7b\xc9\xa1\xc8\x5e\x5e\x62\x13\xae\x55\x23\x2a\x5e\xba\x8c\x5b\x8a\xa9\x01\x1f\x0c\xb8\x6a\xaf\xce\x80\x7e\x25\x88\x7d\xf8\xee\x36\xf5\x3b\x86\x6e\xeb\x98\xc6\xeb\x93\x23\xd5\x6e\xac\x10\x73\xfd\xae\xb5\xc7\xdf\x98\x51\x2c\x5c\x2d\xe2\xe0\xb4\xb6\xb5\x62\x17\xae\xd5\x01\x96\x0f\x70\x58\x66\x93\x64\x90\x60\x5f\xda\x96\xa5\xc0\x85\x79\x21\x7c\xa2\xd0\xb5\xa1\x50\xdc\x3f\x96\x41\x76\xb9\x5e\x27\x29\xa6\xaa\xe0\x66\x65\x74\x41\xf3\xb7\xc8\xaa\xbf\x6a\x4e\x6e\x14\xad\x48\x53\x33\x75\xd5\xee\xbd\xfb\x1e\x1c\x6a\xea\xf1\x13\x18\x3f\x46\x71\x6e\x5b\x3c\x70\x06\x1f\xe0\xc1\x21\x58\x5b\x6d\x86\xe3\xbb\xdf\x3e\x3c\xec\x6e\x5d\xd0\x41\x18\x86\x83\xbe\x72\x42\x09\xd6\xc9\xf5\xc0\x32\xc0\xb6\x86\x4c\xa7\x99\x28\xcb\x8f\x2d\x32\x1c\x56\xb7\xe9\x58\xc3\x3e\xa0\x84\x7d\xf8\x5f\xed\x17\xae\x27\x85\x41\x2e\xbf\xdc\x11\x5f\xbc\xfe\x88\xdc\x0a\xc9\x6d\x3e\x1a\xfc\xfb\x40\x8b\xe1\xa6\x30\x93\x6a\x49\x2b\x3e\x62\xb5\xf2\x1c\xcd\x07\xaf\xb7\x0b\x03\xef\x0c\x37\xc2\x9f\x17\x3d\xeb\x90\x0e\x28\x46\x30\xe6\x6c\x33\xb3\x92\x79\xab\xf5\x12\xd3\x46\xf7\xe1\xc9\xc6\xb4\x2b\xc5\x98\xd6\x57\xf1\x4d\x9a\xf8\x9e\x1f\x2d\xa3\xfc\x86\x8d\x64\x39\x5c\xc1\xe3\x43\x98\x51\x32\x36\x5a\x39\x44\xda\xb5\x6b\x4d\xc1\x7e\xab\x75\xf8\xc7\x21\x98\x23\xd3\x34\x5d\x03\xa2\x11\x1d\x01\x81\x28\x06\x62\x8d\xbb\x09\x2f\xa2\x22\x02\x91\xde\x1d\xa2\x20\xce\xed\x6d\xab\xaa\x56\xe7\x5e\xd1\xe2\xe3\xf1\xdb\x30\xfd\x33\xb3\xe3\x4c\xa6\x54\x98\x33\x99\x55\x20\x3d\x15\xf4\x5b\x2c\x9b\x1f\x89\xb3\x87\xe0\xce\xea\x9f\xad\x6b\x0f\xae\xe0\x5b\xcc\x55\x3b\x64\xbf\x6e\x09\xa4\xd8\x3d\x5a\xc0\xd8\x86\x74\xb8\x33\xd7\xea\x21\x82\xf6\xad\xfe\x0d\x1b\x27\x3f\xc0\x3e\x03\xad\x1b\x35\x8a\x44\xe4\xed\x41\x83\x0f\xee\x78\x57\xae\x5a\x8d\xe5\x15\x81\xd6\xb8\x21\xd5\xee\x3d\xef\xe5\x5f\xce\xe7\xcd\x94\x2c\xd2\x47\x1a\x55\x24\xa8\x62\x00\x99\x7e\xed\xe1\x43\x5c\x3f\x67\xd6\x9c\x42\xc7\x35\xea\x2f\xc4\xe3\x5e\xa3\x2d\x55\x12\xee\xa5\x25\x41\x12\x66\xd2\xf9\x1a\xa3\xca\x5d\x0d\xf6\x9d\x0c\xe1\x15\x06\xf6\x07\x5c\xe7\xef\x83\x4d\x80\xfb\x80\x75\xd2\xe1\xf5\x8e\x95\xaa\x37\x0a\x68\x4f\x55\xd6\x3f\x05\x00\xab\x01\xa0\x06\xdd\xae\xbd\xbc\x25\x64\xe7\x1c\x6f\x39\x99\xd4\x20\x8e\xf1\xa1\x8b\xcf\xf8\x93\x89\xee\xcc\x44\xf1\xb9\x83\x15\x56\x88\xf5\x74\x38\x0a\x92\xf5\xcd\x80\xf9\xc1\xad\x03\x5e\xcd\xcf\xed\x2d\xe3\x7f\x8e\x6d\x9b\xfe\x7e\xb6\x4d\x03\x7a\xeb\x00\x1e\x54\x41\x3c\xe2\xdc\x7e\xe1\x40\x8d\xa4\xfa\xd8\xf5\x8f\x19\x95\x27\x6f\x07\xc5\xd2\x48\x91\xa9\x0f\x92\xb4\x68\x29\xca\x64\x0c\x30\x16\xd3\x99\xd6\x0f\x84\xfc\xdd\x8b\xb4\x36\x4e\x61\x0b\x75\xf4\x60\xea\x5d\x9f\xcb\x0e\xba\x4e\x79\xcc\xc5\x9a\xad\x10\xfb\x80\x6f\x40\x3b\x2c\xc5\xe4\x0b\xa8\xc6\xa6\x4a\xc1\xd9\xde\x5e\xa4\x70\x11\xc2\x35\x7c\xdb\x79\x6c\xa7\xba\x1b\xbf\x3a\x3b\x28\x0e\xd3\x89\xf4\x9b\x59\x3d\x01\x5f\xd8\x4c\xb7\x5b\xf4\xee\x03\x1b\xd9\xc2\xb5\x96\x68\x57\x3c\x3a\x8e\x59\xe3\xcf\xa4\x13\x2f\xe1\x5a\xe3\xda\x04\xdc\x59\x92\x66\xf5\x4c\x96\xaf\xd0\x8c\xaa\xc2\xd1\xca\xce\xbd\xa5\xab\xe4\x4a\x3a\x17\x49\x8b\xe4\x6f\x22\x1d\x7b\x4a\x55\xb9\x8e\x25\x51\xe0\x58\x1c\xe2\xc1\xcc\x60\xb4\x4e\xd6\x83\xa1\x01\xd1\xde\x9e\x72\x4c\x15\xc7\x59\x34\x27\xf1\xa2\xf2\xb8\xa9\xb2\xbb\xb8\x7e\xde\x7f\x9c\x4d\xe7\xa5\x88\x9e\x16\x87\x4c\x35\x1d\xe5\xa9\x65\xc3\xdf\x2e\xb3\xbc\xca\x62\x5a\x32\x78\xa9\x39\x37\x56\xe5\x2b\xd9\x23\x48\x13\x53\xa2\x09\x5e\x2e\xca\xa8\x42\xe5\xd3\x58\x3a\x97\x03\x05\xee\x32\xce\x45\x32\x3f\x39\x73\x5a\xeb\x64\x5b\x80\x02\xa7\x3e\x3f\x8b\xe9\xb0\x47\xa3\x2e\x7c\x23\x9e\xf2\xed\x0a\xf5\xc3\x3c\x7f\xc8\x07\x1e\x62\xb2\x2f\x22\xc5\x4a\x84\x37\x38\xeb\x10\x15\x74\xca\xe5\x1c\xbd\xbd\xb4\x2a\x59\x2d\x1d\x23\xab\x51\x06\xf6\x54\x47\x9d\x15\xe2\xcb\xcc\x8b\xee\x9c\x22\xbe\x63\x22\x13\x68\x13\x28\xb1\x22\x8d\x15\x2b\x69\x51\x64\x38\x18\x3e\xac\x9f\x92\x7a\xf3\xf6\xe5\x5f\x9f\x9e\x1e\xc1\x8b\x1f\x4f\x9e\x9d\xbe\x7c\x7d\xf2\xae\x71\x88\x4a\x98\x09\xaf\x4c\xb6\xc5\x43\xfc\x8c\x51\xbe\x97\xd1\x97\x98\x37\x44\xf7\xf6\xf5\xa5\x74\xe8\xb1\xba\xe1\xb6\x75\x5a\x5e\x94\x35\x04\x48\x83\xe7\x7e\x54\xc5\x6f\xc3\x22\x00\x96\x1a\xb0\x31\x60\x13\x18\x70\xa3\xde\x10\x2d\x9f\x97\x87\x9d\xd1\x0e\x0c\xdb\xe5\x30\x96\xd5\xb8\x36\xa2\x4d\xd8\x55\xcf\x7e\x4b\x9e\x06\x85\x13\x03\x33\x5c\xc8\x47\xf2\xf3\xe4\x38\xb9\x2e\xee\x18\x6e\xc7\x98\x4f\x92\x78\x2f\x52\x1d\x39\x17\x02\xf5\x58\xb7\x81\xe0\x43\xcf\xb2\x23\x14\x67\x73\x8b\x14\x82\xe5\xbd\x35\x6d\x01\x6e\x2e\x7b\x6a\x53\xd6\xe8\x72\x0c\x34\x4b\xdf\xb4\x82\x89\x9c\x3c\x8a\xa2\x1b\x38\x84\x1b\x8c\xdd\x48\xa7\x20\xf1\xec\xb3\xa2\x70\x13\xd1\x0f\xdd\x63\x1b\x43\xda\xc3\x65\x96\x6a\xe5\x02\x73\x2c\xc6\x90\xd2\x2c\xe7\x31\x77\x5a\x9e\xa6\x80\xb5\x97\xe6\xe0\xdf\xf0\xb4\xaa\x22\xa1\xad\x0a\xbe\x48\xf6\xe8\xdf\xe0\x35\x15\x78\xcc\x17\x1d\xa5\x90\xeb\xc2\x9a\x31\xbc\x4d\xe5\x1b\xd4\xdc\x3c\xf9\x8e\x0b\xfb\xa0\x48\xfe\xcf\xef\x5e\xe5\x87\x79\x4f\x8b\x58\x15\x1e\x85\x1c\x1a\x78\x12\x72\x28\xd2\x49\xf0\x7a\x4a\x7a\xa3\xc1\xb8\x19\x05\x5b\x66\x27\x28\x07\xff\x05\x2d\x4e\xc2\x33\x3a\xa9\xe4\x70\xd3\x40\xba\xd4\x57\xa6\xa6\x1a\x94\x28\x7a\xa0\x87\xb0\x09\xd4\x07\xfd\x15\x23\xb4\x36\x73\xc1\x43\xd8\x30\x37\xe7\xc3\x39\xf0\x91\x67\x23\x86\xe3\x66\x9b\x3c\x8b\xd4\x06\x07\xa9\x72\xdf\xff\x8e\xd9\xcc\xaf\xd4\x33\x24\xef\xed\x51\x65\xe2\x88\x76\x49\x71\x34\x5e\x61\x88\xcb\x53\xe6\x2a\xd1\x41\xc3\x86\x59\x80\x69\x28\xce\xd1\x60\x62\xe3\x20\x2f\x93\xa2\xaa\x8e\xc5\x66\x22\xc9\xac\x5a\x7f\xc2\xe8\x0a\x13\xe2\xdc\x18\x18\x7d\x4f\x57\x9d\xc2\xb2\xe1\x67\xfa\x55\x43\x08\xbe\x48\x55\x19\x39\x30\x0b\x40\xa7\x58\x85\x98\xb4\x60\x97\xd9\xd4\xdd\x56\xd6\x02\x91\x5d\xb4\xcc\xfb\x8a\x2e\x80\x88\xe4\x95\x2e\x41\x71\x16\x89\xdf\x89\x95\xcc\xe5\x37\x0b\x2f\x2f\xd2\x97\x17\x49\xb0\x9a\x57\x40\x44\xc8\x8f\xb3\xb0\xe1\x46\x31\x41\x2c\xa8\xb1\xdf\x8c\x25\xb1\x1e\xa7\xf0\xe9\x13\x84\x28\x12\x9f\x3e\x21\x04\x3e\x2b\xbf\xa7\xcc\x79\x80\x35\x56\xf0\x08\x1c\x4c\x20\x13\x15\xc5\x58\xdd\x94\xef\x3b\x19\xe0\x90\xc1\x93\x2e\x89\xaf\x03\xe4\x21\xdf\xbc\x69\xc3\x01\x8f\xee\xeb\xe6\x0d\x07\xcc\xee\xc3\x07\x56\x3b\x62\x95\x99\x8f\x5d\xc0\x74\x78\x3b\x25\xe0\x09\x6b\x10\x71\xde\x63\x38\xdf\xc7\x9d\x67\xfa\x29\x65\x1b\x1b\x17\x0e\x60\xaa\x58\x6b\x40\x45\x61\x54\xc1\xad\x6c\xa5\x62\xa9\x4f\x73\x93\xf7\x7b\xe1\x5a\xb1\x8f\x0f\xca\x91\x23\x85\x27\x0d\x7b\xb7\x43\x76\x0c\xd8\xc3\xa9\xc3\x01\x57\x54\xb9\x96\x5e\xef\x0a\x9b\xc2\xe4\x5e\xb3\x24\x94\x76\xad\x06\xbd\x2d\x64\xf0\x72\x8d\x12\xb5\xa2\x5e\x2c\xce\x6e\xd1\xab\x28\xb9\xcc\x84\xc8\x61\x2e\xea\xa4\x2e\x70\xe8\x47\x67\x09\xa8\x06\x51\x28\x4d\xd6\xde\x9e\x90\xb7\x87\xb0\xbb\x8b\xd6\x2b\x3c\x87\xc7\x50\x3e\xec\x9a\x60\xa2\x00\xf3\x21\xb8\x7b\x5a\x79\x2f\xec\x8d\xa3\xec\xee\x76\xa4\x09\xe4\x8d\x8d\x2e\x63\xee\xc8\x93\xce\x9c\x07\xdb\x3d\x55\xcf\xc5\xb6\x4b\x53\x03\x25\xf5\xea\x03\x07\x4a\x1e\x33\xff\x0f\x75\x53\xaf\xa3\xd1\xc5\x08\xce\x1c\x03\xf0\x66\xb1\xf1\x39\xf8\x34\x48\x56\x34\x03\xc7\x9f\xeb\xda\xe0\xcb\xa4\x42\x34\x77\x76\x70\xea\xcf\xbc\x89\x22\x0b\x42\x99\xf4\x2c\x58\x78\xe9\xd3\x7c\xc0\xd8\x22\xce\x8e\x69\xb3\x10\xd5\xa5\x1b\x87\x49\xda\x9f\xfb\xe9\xb4\xba\xff\x0a\x53\xc0\x79\x61\xc8\x33\xa0\x47\x17\x0d\x19\x2b\x6e\xac\xcf\x53\x6d\xc6\x83\x37\x34\xc5\xf4\x24\x65\x8a\x6f\x71\x0f\x94\xc8\xe6\x4c\x43\x94\xc1\x11\x3c\x63\x0d\x86\xc2\xd3\x41\x99\x96\x5c\xf2\xaa\x55\xf6\xb2\xb5\xa1\xa2\xd9\x81\xa7\x7c\x37\x41\x5c\x9c\xa1\xd8\x20\xbc\x0f\x8d\xa1\xbc\x00\xb1\xba\x5c\xe6\xd1\x7a\x79\x83\xc3\xd5\x07\x3e\x4c\x29\xe5\x98\xf9\xfa\x2b\x03\x72\xba\x5a\x1b\xb0\x59\x26\x06\x6c\x16\x91\x66\x61\xdb\x4b\xd3\x1b\xfd\xba\x37\x0e\x0b\x42\x9c\xd4\x25\x3e\x2c\x13\x74\x58\xbe\xad\xee\xa0\xd3\x14\x5c\x14\xb1\xb5\xea\xb2\xba\x4f\x4a\x55\xe5\x62\xb6\xc1\xa6\x45\xf6\x54\x91\x67\x43\x9b\x7b\x0e\x91\xd8\x9c\x45\xe7\x32\x1e\x9a\x4c\x1c\x88\x07\x96\x6d\xa1\xa2\x2a\xcf\x26\x30\x0c\xf7\x07\xd8\xca\x2e\xd6\x7f\xc0\xba\xad\x2e\xce\x88\xce\x6a\x2c\x93\xb2\xc6\x00\x06\xb0\x92\x11\xc3\x78\x8c\xfc\x6b\x97\xf3\x41\x13\xd4\x11\x2c\x1a\x70\xd8\xfb\x9c\xef\xfc\xb0\xc3\x2e\x82\x6e\xf4\x03\x9f\x0b\x94\x17\x8a\x79\x33\x52\x81\x47\x8a\x10\xe2\xb7\x08\x71\xeb\x1c\x80\x88\xcf\x10\x36\xa5\xf9\xe3\x0f\x14\x8c\x14\x5a\xb7\xe9\xd4\x63\x69\x66\xbb\x5a\x7b\x29\x1d\x88\xad\x1a\xde\xb1\x01\xfe\xb1\x56\xbe\x23\x03\x82\xd5\x5a\x33\x86\x81\x77\xcc\x5c\x0b\x4d\x75\x24\x2a\x72\xc9\x3b\x66\x43\xcb\x31\x3c\x01\x02\x07\xb0\xa7\xca\x5a\xd7\x19\x43\xaa\x0c\x22\x87\x67\xf2\x38\xa8\x77\x2c\xf2\x8e\x75\x85\xd0\x39\x9e\x8c\x0d\x0c\x53\xf6\x6f\xdf\x90\x24\x70\x66\x45\x1f\xf3\x1a\x7a\xbc\xe5\x0f\x26\x5b\xff\x1a\x23\x54\xf3\x49\x71\xb3\x37\xe3\x43\xbd\xa4\x9a\xc3\xd9\xa5\x9f\xb3\xe9\x62\x8d\xc5\x5d\x46\x2c\xd2\x0c\xe6\xfb\xfb\xf0\x4e\xc0\x02\x9f\x5f\xd4\xe6\xe9\xe3\x91\xde\x71\x97\xed\xf0\xce\xbc\xe3\x73\xd8\x53\x26\xd3\x03\x61\x02\x79\x99\x47\xe0\xe3\xbf\x9c\xea\x1a\x73\xc1\x8b\x1e\x02\xd3\x3e\xec\xdb\x6e\xd1\x02\xaf\x7d\xcb\x28\x6c\x47\x02\x3c\xb9\x8b\xf7\x3c\xe6\x61\xde\xbf\x2f\x1f\xe1\x26\x0f\xc1\x2b\x22\x8d\xfd\x63\xe9\xe6\xa0\xbc\x10\xc5\x80\x9b\x83\xe2\xd2\x10\xe5\x30\x5a\x0d\x6a\x8a\x89\x93\x96\x99\x01\x1b\x8d\x78\x7e\xf7\x55\x92\x52\x03\x62\x03\xb7\xd8\xf1\xbf\xc7\x06\x7c\x34\xe0\x63\x60\x40\x4a\x57\xf8\xe7\x18\xff\x9a\x06\x6c\x22\x03\x36\xc7\x06\xdc\x04\x9a\x51\xea\x86\xbd\xfc\x9b\xfa\x5d\xc6\x87\x11\xe6\xb9\xdf\x8c\xb2\x52\x63\xd4\x85\x8b\xd9\x9d\xa6\x99\x80\xc7\x09\x34\xae\x54\x84\x59\x90\x4e\xbc\x13\x43\xba\xc4\x2a\x05\x53\x13\xda\xbe\xb7\x09\xa4\xc9\x01\xfb\x76\x13\x88\x7f\xb4\xb3\x05\xd0\xe5\x7a\xd7\x99\x99\x6a\x23\xe6\x89\x77\xc2\xda\xa5\x12\x96\x49\x0a\x7e\x92\x2f\xea\xd8\xea\xf6\xd6\xdc\x63\x44\x44\xf4\xf8\xbf\xcc\xad\x83\x27\x8c\x26\x7c\x0e\x85\xe1\x6d\xe0\xb8\x1f\x60\x5f\x86\xf0\x04\x5b\x3d\xe8\x5c\xa5\x17\xe8\xfd\xbf\xff\x8f\xc9\xd0\xdb\xb0\xe9\x3d\xfb\x9e\xa4\x70\xc3\xbf\x17\xd8\x21\xbe\x69\x51\xba\xca\x24\x9c\x15\x05\xb5\xa8\x23\x5f\x65\x2c\xcd\x82\xdc\x4f\x20\xc3\x24\xbf\x07\x90\xc1\x3e\xa8\x97\xdd\xb7\x4b\x8e\xfb\xb1\x15\xb4\xcb\x14\x15\x3f\x32\x09\xfa\x58\xe6\xca\x6b\xbe\x16\x91\x02\xd8\x83\x1b\x55\x8e\xf9\x8c\xef\x1d\xdc\xe5\xd9\xe8\x74\x43\xdf\x3d\xad\x12\xb2\x0f\xbe\x3c\x04\xbd\x7b\xc4\xde\xfa\x51\xfe\x82\x2f\x1f\x31\x6c\xe4\x6d\x84\xcc\x8a\x95\x2f\x6f\x1a\x2f\xd5\x00\x31\xfa\x22\x97\x53\x7a\x5a\x3a\x23\x88\xb1\xc2\x72\x25\x41\x04\x31\x12\x5c\xd9\xc0\xfd\xe5\x94\x3b\xe9\xb5\x7c\x21\x90\xcc\x41\x9d\xc9\xf2\xb4\x9e\xf7\xaf\x5c\x46\x29\xb9\x96\xf1\xc1\x44\xf2\xe8\xb1\xcd\x85\xd7\x13\x6e\x83\x66\x42\xd2\x1b\xb1\x08\x06\x7c\xfa\x83\x0a\x6e\xc2\xb0\xcc\x47\xaa\x64\x1d\xaf\xf4\xb8\x51\x07\x86\x40\xf7\xf6\x74\xec\xce\x3a\x57\xc8\x3e\x8a\xb5\x75\xdd\x0c\x15\xb7\x4e\xf3\xeb\xe3\x6e\x9b\x0e\xf2\xb8\x1e\xa3\x54\x95\xb9\x61\x65\x6e\xba\xcb\x44\xfa\x03\x9f\x99\xd8\xbf\xa4\x0b\x46\x9c\x24\xe9\xca\x5b\x46\x19\x65\xfa\xcd\x26\x4e\x37\x01\x64\x09\x2c\xa2\x8b\x05\xcd\x72\x48\xd2\x90\xa6\x22\x1e\x91\xcc\xd9\xcb\x28\x83\xc7\x3c\x9e\x05\xfb\x60\x8d\xd4\x80\xe3\xfa\x02\xaa\x28\x3d\x10\xa6\x8d\xa7\x81\xec\x58\x00\x3b\x49\x72\x88\x69\x40\xb3\xcc\x4b\x6f\x0c\xf0\x2f\x31\x32\xb7\xf0\xe2\x70\x49\x21\x09\xf9\x2c\xb2\x48\x58\x79\x53\x58\xa4\xb2\x1d\x0b\x75\x4c\xb3\xc3\x71\x7f\xbf\xb8\x31\xe1\x31\x8f\x2c\xc5\xbb\xbb\x98\x40\x9e\x59\x37\x0e\xeb\x91\x0c\xa8\xe3\xb4\x34\x07\xd1\xe5\x71\xe2\x68\x57\x4d\x39\x6f\x02\x1c\xb0\xb9\x71\xd1\x3b\x93\x9b\x7a\xad\xcd\x76\xb5\xb6\x11\x14\xd8\x52\xe8\x34\xf9\x1a\x37\x4c\xd0\x6e\x8e\xd5\x75\x52\xba\xe2\x80\xab\x7c\x9a\x37\xc7\xfa\x44\xfa\x2b\x86\x46\x4a\x57\xfa\x4c\xbc\x20\xe6\xf7\x61\x28\x36\x04\xe4\x09\xac\xbc\x0f\xf2\x85\x65\x5e\x06\xcb\x24\xbe\x60\xff\x2a\x7d\xad\xe2\x53\xb8\x78\xd8\xec\x23\xd6\x05\xf6\xf5\x8c\xfd\xe4\xfb\x21\xb4\x87\xd8\x6f\xfe\xc6\xa9\x5a\xcc\xa1\x35\x85\xca\x79\x9c\xa9\x2b\x12\x98\x20\x86\xf6\x8e\xe3\xb3\x37\xc1\x19\x39\x97\xf5\x0b\x86\xac\xe6\xee\xae\xba\x8e\x56\x55\xd6\x22\xf5\x79\x9e\x46\xde\x52\xa8\x6f\x2c\x22\x80\x86\x74\x39\x34\x6f\xc7\xd6\x6a\x4a\xb5\x8b\x90\x8f\x79\x87\x60\x73\x35\x31\xb9\xca\x0c\x45\xbf\x08\xd3\x69\xba\x47\xc6\x1a\x36\x86\x49\x87\x92\xc4\x3d\xd1\x46\x5c\x2e\xc2\x69\x6d\x79\x0b\x1f\xbf\xdc\x49\x48\x81\xde\x65\xe1\x93\xbd\x72\x4e\x7c\x53\x38\xc6\x37\xdc\x2d\x3e\xee\xdc\xa0\xc8\x0f\xb9\x14\x2d\x3e\xda\xa6\x3d\xbe\xdf\x72\xb5\xd6\xe7\xf7\x6e\xf6\xab\xb8\x11\x52\xe6\x94\x01\xb1\xc6\xac\x16\x1f\xe6\xd2\x73\xed\xe9\xdd\xd1\xcb\xc5\x0a\x67\xf2\xbc\xc7\x52\x65\xb3\x9a\x5e\x0d\x10\x18\x29\x87\xd8\x5e\xcc\x71\x0d\x69\x91\x5c\xf3\x3c\x95\x79\xb4\xa2\xf5\x7b\x12\x2f\x12\x8a\xeb\x79\x49\xcd\xb5\xd8\x82\x86\xd0\x1e\x3e\x10\xd5\x7d\x14\xb5\x2d\x30\x83\xa7\xcb\x8b\x24\x8d\xf2\xc5\xaa\x77\xab\x39\x90\x91\x38\xa0\x94\xf3\x45\x2c\x44\xfd\x41\x4d\x6d\x06\x71\xff\xa6\x7d\x6b\xc4\xe8\x5c\x40\x7a\x5c\x75\xf3\xa0\x7c\xb8\x57\xc2\x37\x20\xde\xdb\xeb\x05\x69\x8f\x24\x33\xb7\x77\x58\xc0\xe9\xad\xe7\xd4\x50\xb9\xf6\x32\x59\x72\xc1\xcb\xc1\xea\xa7\x0a\xc0\x78\x54\x68\x0d\x3a\xe4\x12\x80\x38\x2c\xfa\xb1\x05\x98\x09\xde\xf2\x5d\xd5\x7e\x5c\xd4\x3d\xa8\x77\xae\xa2\xcc\xee\xee\x16\x1b\x39\xab\x71\xb7\xb3\x2c\x14\x92\x2a\x3c\xde\xc7\xe2\x6e\xad\x78\x79\xc3\x4d\x20\xfe\x8c\x32\x9d\xfd\x6b\xb6\x1b\x17\x86\x79\x88\x02\x8a\xb5\x35\xe9\xd1\xdb\x58\xf4\x88\x59\x3f\x06\x0c\xc0\x5d\x9c\x09\xb9\x3e\x1b\x72\xd9\xbf\xbd\x3e\x42\xf1\xd9\x76\x98\x6e\x74\xb6\x30\xd7\x45\xa7\xb7\x34\xd7\x12\x84\x97\x4a\x75\xda\xaa\xea\x69\x6d\xcc\xcb\x13\xee\xcc\x6e\x55\x15\x8d\x1a\x29\xeb\x80\xe7\x27\x97\x39\x8c\xbf\x2d\x6f\xd5\x8c\x56\xd4\x10\x77\xd2\xe2\x79\x54\x7e\x79\x2d\xfa\xa6\x57\xed\x8d\x1a\x8a\x16\xf0\x16\x6a\x9f\xd2\x58\xce\xf7\x7f\x0b\x24\xaf\x17\xd1\x92\xb2\x41\xa6\x18\xd3\x78\xf0\x07\x47\x35\x11\x01\x12\x66\x5e\x8c\xcf\xfd\x1b\x9d\xd9\x27\x56\xce\x8d\x34\x7d\x28\xa3\x86\x85\x24\xe3\x74\x4f\xb0\xab\xbf\x0b\xec\x53\x05\x31\x39\xfe\x37\xcc\x2b\xe3\x12\xfa\x84\xb9\x5c\x07\x28\xdd\xa2\x43\xdb\x4a\x38\xdc\x55\xca\xa1\x74\x15\x7a\x82\xc0\xd0\xb9\xed\x19\x6e\xbb\xeb\x1b\xc5\x0d\xc3\x34\x04\x03\xf1\xec\xe7\x5e\xcf\xc1\x2c\x28\xf5\x23\xae\xdd\xd8\x8a\x02\x89\x9b\x3a\x98\x38\x16\xc6\xfb\x26\x28\x74\x0f\xbc\x0b\x2f\x8a\xc1\xa7\xcb\xe4\x5a\x1d\x99\x6b\xb4\x90\x25\x10\xf0\xfb\xcc\x19\x66\x79\xc2\x73\x88\x79\x78\x3d\xd5\x36\xf6\x4a\x42\x92\x18\xb0\xa4\x6c\xf6\xcf\x20\x79\x19\x26\xd8\xca\x92\x1a\x72\xfc\x76\x5f\x86\x73\xc8\x31\xdd\xce\x24\xf3\x2b\xa7\xb6\xf0\xb5\x24\xac\x14\x1e\x1d\xa2\x13\xc3\xea\x32\xc3\x6c\x54\xe5\xc1\xe4\x2d\x78\x01\xa5\xec\xc4\xdb\xca\xcf\x9d\x86\x8b\x6d\xc7\x87\xbe\xa9\x4a\xb3\xca\xad\x94\xa5\x07\x77\xe4\x08\x07\xfa\xa8\x30\x43\x08\x5b\x9e\x1c\xf5\xb9\x0d\xa5\x75\x29\x48\x80\xd6\x65\xcb\x21\xa0\xb2\x2b\xa5\x45\x2c\xc2\xe0\xdb\x58\x91\x5b\x0f\x77\xf5\x91\xaa\xe1\x6d\x75\xa3\x5a\xce\x15\x0e\x0f\xf9\x25\x4a\xdb\xd9\x0c\xd5\x4c\xa8\xe6\xa2\x6d\xab\x99\x95\x1a\xd4\xaa\x1b\x25\x0d\xeb\xe6\xfd\x4b\xc7\xe0\x65\x72\x7d\xdb\x21\x78\x99\x5c\x77\x8c\xc0\x57\x34\xbd\x81\xd4\x4b\xe9\xf2\x06\xef\xd1\xdd\xb2\x89\xd6\x00\xaa\x98\x14\xe2\x9e\xa3\xad\x87\x4e\x36\x39\xff\xb2\xa1\xf3\x16\xb4\x85\xb6\x90\xdf\x94\xda\x26\x0d\x9d\xdb\xcb\x7c\xf1\x51\xc8\x7e\x5f\x95\x9e\xa1\x50\xfb\xb6\x76\x3a\x11\x35\xa0\x2b\x49\x59\xf1\x89\x75\x51\x10\xa9\x07\x70\x08\x9d\x33\xe2\xcf\x65\x50\xa3\x68\x97\x70\x0d\x2a\x6f\x3c\x37\x3b\x03\x02\x4f\xc5\xe6\x98\x98\x6e\xf2\x72\xb2\x6e\x94\xdb\x06\x79\xa4\xbd\xe3\x22\x1c\xc0\x70\x72\x71\x08\x27\xee\x8e\x3e\xfc\xb8\x0e\x31\x32\x20\x5f\xd1\xdf\x13\x7b\xe0\x11\x81\x5e\x52\xd6\x63\x5f\x9b\xe0\x6c\x23\x02\xe5\x5d\x94\xeb\xb9\x00\x06\x2a\x0e\x14\x10\x7b\x42\x13\x42\xe2\x3a\xc6\x4c\xcd\xaa\x7a\xa9\xc4\x03\xd8\x44\xbb\xbb\xf0\x08\x36\xc7\xb8\x21\x91\xf7\xbe\xd8\x0f\x89\x5b\x21\x33\xcd\x91\x19\xa8\x02\xf7\xf5\x6a\xfa\x40\xe4\xb1\xb4\x8c\xdc\x5e\x8f\x84\x72\xed\xe8\xa3\x58\x7b\xfc\x58\x9e\x51\xd9\x7a\x5b\x48\x19\x66\x13\x2b\x45\xfa\x4d\x84\xa7\x09\x04\x65\xf0\xe8\xe3\x88\x1a\xe2\x18\x4b\x71\x5d\x93\xd8\x54\x9d\xcc\xa5\xc3\x2e\x88\xd8\x16\x27\x57\x32\x38\xe4\x65\x1f\x42\x56\x1c\x5d\xc9\xa4\xa3\x2b\xda\xa0\x2e\xbf\x16\xf5\xa3\xc1\x57\xd8\x06\x0c\x2f\x5c\xc5\xdf\x05\x0a\x0f\xe4\x83\x28\x04\xb7\xd7\x10\xbe\xe0\x8d\x6c\xd0\xec\xad\x7b\xc6\x77\xa6\x45\x99\x7a\x83\x58\x49\xce\x2e\xe9\xfc\xd8\x75\xe9\xd6\xc7\x51\x0a\x87\xb0\xcb\x70\xd8\xee\x70\x0c\x5f\x3c\xfd\xb8\xfd\x09\x17\x75\x6e\x28\x71\x4c\x25\xa5\xeb\x94\x66\x34\xce\xc5\x66\xff\x6a\xf1\xad\x4a\x1c\x85\xbb\xe8\xe6\xd1\x86\x86\x7b\x78\x41\x23\x9b\x30\x48\xd7\xb7\xca\xe0\xcb\xab\x74\xa5\x7b\x7a\xeb\xfb\xef\x9a\xa9\x91\x52\xc5\x5d\x73\xfa\xbb\xf0\xa3\x4c\xbe\x3a\xbf\x76\x25\x41\x54\xe4\xf0\xc2\x23\x2f\xc5\x78\xbd\x64\x6e\x34\xf7\x03\x52\xfa\xf1\x32\x62\xfe\xfd\xa0\xb9\xe9\x5a\xb9\xb5\xba\x96\x71\x0a\xd2\x55\x01\xbe\xdc\xc1\xbd\x4a\xc2\xfa\x95\xfb\x41\x25\x2b\xe2\x5b\x78\x00\x79\x22\x5f\x37\x49\x66\x46\xb1\x4d\x12\x2f\x6d\x28\xee\xf3\x00\x8b\xb0\x1f\x6f\x8a\x13\x2a\x60\x39\x3d\x57\xf1\xcf\xb1\x1e\xde\x0f\x1f\x71\x31\x16\x8d\x2a\xef\xe4\x37\x71\xd3\x46\x4c\xab\x0b\xf9\x9b\x9b\xba\x57\x7c\x57\x77\x61\xbb\x1a\xc9\x03\x19\x7c\x9e\xc9\x9d\xb7\x62\x94\x64\x78\x95\x84\xb4\xb5\x91\xfb\x09\x03\xf5\x09\xd7\xe4\x7b\x8f\x0d\xdd\xe3\xb7\xac\x17\x3b\x22\xaa\x64\x25\x0d\x25\xc7\x38\x7f\x3c\x6a\x2f\x60\xc4\xe5\x7d\xee\x6d\xe0\x51\x99\xa4\x47\x35\x24\x15\x57\x97\xd6\x8e\x9d\x20\x3a\xba\x2d\xae\x82\xc6\x6c\xdc\x9e\x31\x8b\x5f\xfd\xb6\x1c\xbc\x6e\x98\xc2\xa3\x43\x29\x21\xb7\x42\xe5\x9f\xd4\x45\x42\x6c\x94\x8d\xdb\x44\x04\xdc\x08\xaf\xd8\x54\x1b\xb7\x77\xd5\xea\xcc\x0f\x9b\x13\x0a\xab\x58\xdf\xd8\x10\x0f\x85\xdc\xe8\x0c\x5f\x3c\x92\x56\xcd\xf9\x44\x3c\xc4\x74\x6d\xa5\x8d\x60\xb3\x0d\xdd\x49\x04\x10\x9b\x10\xda\x6c\xb9\x2d\xdd\xb7\xbb\x31\x53\x56\x1d\x2e\x49\x99\xfa\x8a\x6f\xd1\x83\x6a\x74\x6a\x5b\x1f\x15\xfc\xca\x7e\x45\x99\x94\x15\x4f\x39\xd0\x95\xab\x61\xcc\xf8\x95\xf6\x55\x98\x26\x3c\x5f\xa4\x6a\x01\x4f\x5e\x25\x32\x7d\x1b\x46\xb7\xe8\x82\x62\x69\xa6\x71\xa7\x6d\x55\xb2\x59\x90\x7b\xbc\x3d\x32\x3c\xe0\x7b\xc1\x29\x7b\xd7\x10\x67\x5d\x82\x4d\x81\xc4\xd3\xf5\x9a\xc6\x62\xb1\x54\xed\xa0\x14\xeb\xa0\x8c\xab\x8f\x20\x92\x2f\xdd\x43\xd3\xa4\x1f\xdb\x8b\x2d\xe6\x6d\xd5\xd1\x8e\xdd\x2f\x94\xd4\x6b\x16\xec\xbe\x99\x1f\xf6\x0e\x21\xd6\x0c\xdd\xdd\xbb\xde\xef\x4e\x24\x71\xff\xe4\x2e\x10\x78\xbc\xd5\x95\x92\xb0\xb7\x17\x89\x7b\x89\x39\x81\x0b\xaa\x8e\x76\xb6\xbe\xdb\x70\x8b\x0b\x16\x77\xf9\x9d\xac\xda\x4b\x16\x41\x3a\xb4\xb9\xc5\x7c\x4a\xea\xe6\xe1\xa1\xe8\xa7\x84\x78\x67\xdd\x5b\x5e\xdc\x08\x77\xde\x21\xfb\x59\x99\xab\x2e\x16\x87\x87\xee\xdf\x67\xc3\xd2\x13\xd8\xd9\xdb\x81\x5d\xc4\xe3\xa0\xf3\x78\xc2\x0f\x7c\x07\x49\x3d\xd9\x29\x9b\xff\xd5\xf2\x81\x2a\x0e\x0c\xd7\x52\x81\x66\x06\xac\x68\xbe\x48\xda\xe7\x5f\xc4\x99\x81\x58\x73\x41\x92\x72\x84\x14\x97\x15\x20\x60\x3e\x6f\x18\xe2\x77\x7e\x45\x52\xd6\x1a\x6e\x57\xad\x4d\x72\x55\xd5\x46\x03\x05\x97\x76\x77\x71\x43\x75\x7a\x91\x95\x87\x5a\x54\xc2\x11\x6b\x20\x47\x6d\xc8\x50\x86\x91\xbc\xf8\xa6\x30\xc1\x51\xc6\xb7\x44\xa6\xe5\x66\x49\x8d\x05\xbc\xc7\xf8\xa7\x13\xcf\x15\x9f\x18\xab\x5e\x69\xf6\x60\xcb\xe1\x04\xce\x98\x11\xb3\xa9\x03\x64\x45\xc7\x8d\x07\x9a\x96\xb6\x11\xc0\x95\x46\xc4\x54\xbe\x7e\x9e\x5e\x22\x72\xdc\x7b\x2e\x8f\x01\xb3\xf1\x05\x33\x92\xca\x99\x31\xf3\x45\x5a\x0b\x62\x3d\xc0\xc4\x24\x8c\x8f\xe5\x4d\x91\x57\x3c\x0b\x3f\x93\x4a\x5c\xc4\xac\x72\x8f\xb0\x86\x7a\xbc\x56\x75\x7a\x7f\xf4\x62\x57\x11\xfb\xe3\x6d\x2a\x17\x33\xf6\x56\xed\x3d\x90\x22\xea\xfe\x88\x95\xc7\xdd\x53\xf0\x98\xd5\xe2\x5f\xef\xe1\x2e\xb8\x38\xf0\x72\x3a\x88\xd5\x84\x17\xf9\x5c\x8a\x36\x06\xbc\x95\x4f\x9f\x60\xa7\x3e\x33\xd9\xd1\x64\x0a\x52\x36\xfe\x04\x76\x6a\x49\x5e\x77\xe0\xa0\xca\xf7\x2c\xe8\xbd\x03\x43\x83\xdf\x76\xdd\xcf\xde\xfa\x56\x3e\x3d\x87\x99\xef\xb4\x6e\xec\x69\x34\xa4\x79\x79\xf3\xfe\x65\x7e\xd2\x09\x33\xb1\xe2\x22\x47\x96\x97\x37\x6d\xb0\x37\xe2\xee\x8a\x1a\xff\xab\x93\x52\xab\x28\xbe\xcc\x0c\x58\x2f\x2f\x33\x2c\x8d\x7b\x2e\x7a\xf8\x1d\x17\xbb\xfb\x90\xc5\x01\x0e\x8d\x0a\x9b\xc5\xe7\xfd\x2d\x6a\xff\xc6\xbc\x44\x8d\xdf\x77\xbb\x13\xd4\xf7\x82\xb3\xbd\xbd\xdf\xce\xcb\x54\x26\xaa\xdb\xe4\xa5\xbd\x30\xaa\xab\xab\xe1\x45\x6f\x7c\xa3\x1d\xde\xe0\xed\xff\x56\x66\xe2\xf8\xad\x08\x67\xfc\xd6\x08\x67\x34\x91\x51\x5f\x6e\x8e\xc2\xcf\x13\x92\x68\x82\x1a\x3d\x77\x9e\x77\xde\x77\x1e\xe3\x9e\xe6\x58\x77\xd7\xb9\xfe\x9e\xf3\x5b\xdd\x71\xae\xbd\xfa\x38\x16\x57\x1f\xc7\x9a\xab\x8f\xb5\x73\x1c\x5d\x78\x25\x56\x25\x0a\xd1\x0c\xe8\x7d\x43\xb6\xb8\x34\x12\x43\x05\x73\x2f\x5a\x16\x7e\x3a\xde\xff\x08\x39\xcd\x72\x66\x4f\x15\x91\x89\xb5\x97\x66\xf4\x44\xe4\x06\xe9\x4d\xce\xcc\xa4\xee\x4d\x4a\xe7\xd1\x06\x0e\x61\xff\xfd\x60\xef\xc9\xd0\x1c\x9c\x6d\xfc\xe4\x7c\xb8\xaf\x38\xfc\x17\x26\xf9\xd3\x79\x8e\xd7\x36\xef\xbf\x1f\x9c\xbd\x1f\x9d\xef\x0e\x7f\x19\xfd\x79\x5f\x59\xf2\x3b\x3a\xe7\xf1\xc6\xfd\xf7\xbf\x8c\x44\x61\x55\xd1\x28\x2b\x44\xe4\x75\x7a\xe2\x9d\x60\x85\xbd\x27\x83\xe2\xe1\xa7\x13\xef\x44\x59\xef\x7a\x11\xe5\x34\x5b\x7b\x01\x7d\x9d\xbe\x61\x46\x02\x5b\xca\x1e\xfc\xb2\xfb\xe9\xfd\x2f\xd9\xee\xa7\x5f\xb2\xdd\x3f\xef\x5f\xf4\x25\xff\x85\x8d\x21\x66\xb9\x97\x2b\x03\x7c\xed\x41\x14\xdc\x49\xa8\x76\xcb\x51\x7c\x57\xf0\xa4\x72\xc8\xaa\x94\x1d\x4d\x24\x8b\xfc\x1d\x2a\x31\x3d\x49\x80\x6e\x02\xba\x46\xc4\x92\xda\x81\x85\x24\xed\x70\x2f\x1a\x04\x1c\x31\xe9\x18\x64\x7a\x3f\x80\x27\x37\x88\xb2\x13\xef\x84\x15\x7b\xc2\x03\x16\x07\x50\x1c\x50\xdf\x23\x70\xa0\x8a\x52\x77\xcf\x5c\xb8\xa3\x73\xb9\xea\x4f\xb1\xa8\x97\xb9\xc1\x93\xc3\x5f\xae\xcf\x7e\xb9\x1e\x9d\x3f\xf8\xf3\x70\x3f\xd2\x42\xc1\xe3\x01\x15\x91\x2b\x88\x86\xcc\xd9\x95\x01\x6b\x62\xc0\x5a\xbf\xab\xb9\xf8\x88\x03\x0e\x03\x56\xf6\x10\xd6\x56\x3d\x87\x0c\xdf\x5c\xb2\xb3\xd9\x81\x27\x40\x26\x70\x80\xa5\x0e\x61\xc7\x67\x0f\x2c\x38\x90\xaf\xdc\x56\x7d\x84\xcc\xdd\xf3\xd9\x10\xee\xb3\xaa\xd8\xde\x13\x58\x33\x42\xaf\x3a\xa6\x10\x5d\xcb\xc7\x8c\xe0\xfe\x96\x1d\xf3\xfb\x97\xa1\xf1\x50\xf7\x0e\x19\xed\x40\x9e\xf0\x4c\x01\x3b\x23\xc2\x7f\x98\x23\xa2\xba\x69\xb4\xfa\x34\xd8\x51\x58\x09\x03\x76\xfe\x4c\x76\x60\x58\x7b\xc3\xad\x82\xc1\xa0\xe2\xcb\xae\x09\x54\xf7\xac\x8f\x69\xdb\xbd\x43\xc8\xa4\x60\x5e\xdd\x99\xcf\xba\x17\x04\x35\xf0\xf7\xf7\x61\xa7\x0e\x68\x28\x6e\x42\xe2\x43\xf0\x01\xfc\x3d\xfe\xac\xa6\x87\xbe\x2a\xe2\xf1\x77\xff\x73\x3f\x0c\xc5\xfd\x61\x51\x68\xc0\x0e\xc2\xd9\xc1\x55\x06\x1f\xfd\x3f\x04\xc9\x1e\xf8\xcc\xf9\x43\xf7\x91\xf9\x80\x08\x7f\x87\x9f\xb4\xd7\x74\x9c\xeb\x3f\x1f\x71\xb7\x20\x8a\xc8\xbb\x22\x0d\xd3\x2d\x9c\x15\x17\x70\x55\xb3\x0a\x45\x0a\xac\x53\xe6\xf6\xcb\x91\x75\x40\xc7\x5c\x31\x11\x6d\xb8\xcf\xab\xec\xc2\x60\xc3\xa0\xd2\xab\xa3\x0c\x86\x98\xd3\x21\xbc\x01\x9c\xb5\x70\xad\x33\x68\xc7\x28\x50\x6a\x9f\xe3\xda\x09\x56\x6b\xf1\xbe\xfa\xec\xef\x43\x3b\x8f\xa9\xb8\x4e\xa6\x5e\x78\x7f\x1f\xda\x89\x4b\x77\xc2\xe8\x4a\x05\xd3\x56\x96\x3c\x4d\x5e\xc6\xb9\x5c\x7c\x7f\x1f\xda\x09\x5a\x77\xe8\xc7\x16\x48\x4c\x3e\xde\x2e\x79\x91\x2b\x4b\x4e\x54\x25\xa9\x0a\xcf\x69\xbb\xe4\x52\x0d\xd3\x55\x95\x54\xc2\x6c\xe7\xfa\xdc\x41\xd7\xbf\x51\x96\x51\x5e\xc1\xa4\x55\x12\x2a\x99\xa4\xe0\x12\x9b\x49\x34\xcb\xb2\xa2\x0a\x36\x95\xa9\xbb\xa4\xf2\xac\xa8\x82\x4f\x3c\x39\x65\x8b\xf7\x44\xc1\x28\x8c\x5e\x2b\xba\xa5\xe0\x14\x2e\xa4\x2a\x8a\x2a\x58\x85\xf3\x22\x45\x51\x05\xaf\xf2\xe4\x39\x4e\x1e\x1a\x32\x45\x14\xcc\xaa\x45\x3e\x2b\x35\x21\x0a\x6e\x89\x88\x64\x0d\x05\x26\xfd\x0a\x6e\x15\xeb\x4f\x0d\x04\x2c\x05\xb7\xf2\xe4\x85\xc8\x12\x56\x15\x66\x45\x55\xdc\x4a\xae\x55\x32\x60\x29\xb8\x25\x05\xee\xcb\x2a\xac\xa8\x82\x5b\xc5\xc2\x50\x13\x57\x05\xb7\x2a\x7b\x52\x2f\x5a\xe7\xd6\xf9\x19\x37\x63\xe7\xcc\x52\x0f\x86\x68\xbc\x57\xd9\x05\xfb\x75\x80\x3f\xd0\xb0\x35\x86\x6a\x34\x6a\x23\x0c\x1a\x1c\x4a\x0d\x71\x03\xd7\x88\x5a\xaa\xec\x30\x46\x58\x38\x94\xad\x62\x38\x4c\x44\x61\xc3\xc6\xfd\x2c\x54\x2c\x56\x88\x63\x34\xb5\x45\x49\x48\x57\x23\x71\xdf\x0a\x9b\x7f\x26\x57\x34\xdd\xbf\x64\x33\xb7\xbd\xf9\xb2\x11\xdd\x79\x39\x87\x54\x84\x6e\xf2\xc5\x8d\x01\x51\xce\x7e\x89\x5d\xc5\x6c\xae\xc3\x37\x77\x7a\x29\xe5\xab\xe4\xa2\x51\x6f\xce\x2f\x0a\x6a\xe6\xb3\xea\x89\x06\x88\x95\x28\xe6\xe1\x87\x7c\xcd\x52\xbd\x5c\x19\xe2\xda\xd4\x6f\x98\x1f\x25\x36\x20\x8e\x0c\x48\xc3\xb6\xb3\xaf\x3f\xe8\xbd\x4e\xae\x33\x62\x4a\x89\x57\xdb\x53\xd9\xe2\x9c\x32\x1b\xc7\x9b\x6e\xfd\xa8\x9d\x88\x70\x13\xe8\x26\xb3\x69\xd8\x5a\x19\x56\xe7\xf6\xaa\x88\xb6\x7d\x46\x2f\x90\x36\xa5\x09\xaf\x05\x93\x2b\x73\xb7\xc2\xa8\xaf\xd8\x63\xbe\xce\x2a\x8b\x28\x6e\x03\x42\x6f\x21\x48\xe2\xdc\x8b\x62\x14\x94\x50\xdd\x40\x7b\xf5\x3c\xc6\x1b\x9e\xa2\x98\x41\x50\xd6\x29\xfb\xad\x0a\x85\x28\x16\x5a\x18\xd1\x5b\xad\xa4\x61\xd1\x4c\xcc\xaf\x66\x42\x02\xf6\x24\x4c\xd8\xdf\x87\xdf\x0a\x48\x5e\x90\x5f\x7a\x4b\x35\xc0\x41\x34\x67\x53\x28\x43\xf0\xc8\xab\xc1\x1d\xb6\xe1\x26\x97\xf9\x41\xc7\xf2\xd6\xf7\x1d\xa1\x1f\x65\x1e\xd7\x8d\x82\x70\x50\x46\x85\x42\xbe\xd9\x85\x67\x7b\xc2\xe8\xd0\x87\x22\x3a\xf4\xa1\x88\x0e\x85\xfa\x05\x31\xcc\xf0\x19\xc2\x9e\x32\x07\x18\x94\xf1\xf1\xb6\x60\x32\x52\x88\xb4\x48\x2a\x8c\x35\xa9\x65\xb7\xc8\xe4\x0b\xc5\x2a\x51\x95\x77\x59\x57\xec\x37\x44\x5e\xff\x3e\xe6\x44\x61\x72\x29\x42\x41\x5d\x33\xd8\x82\x31\x8d\x7e\x7a\xb9\x10\x8b\xdf\x34\x12\x59\x7c\x52\xbc\xfa\x07\xf6\x85\xdd\x38\x03\x46\xd6\xdf\x30\xa2\x76\x0e\xdf\x02\x31\x3b\x2e\x43\xee\x5b\x36\xc3\x1e\x54\x37\xfa\x0c\x30\x70\x47\x60\xd8\x77\xb1\x4f\xf1\xe1\xf1\x6e\x4c\x83\x5a\x25\x7e\xeb\xdd\xac\xdb\x9d\x03\x4e\xfe\xec\xef\xc3\x09\xcf\xc4\xe8\xdf\x40\xf6\x31\xdd\x62\x67\x7d\x95\x96\xb2\xc0\xe7\xd1\x21\xc4\x11\xcf\x4c\x79\x99\x2d\x06\xe6\x56\x97\x82\xe0\xde\x84\x8e\xab\x82\xe5\x4f\xb8\xdd\xde\xf6\xa8\x9e\xf5\xbb\xaf\xf8\x6f\x18\x47\xdd\xab\x18\xb1\xdb\xd7\xc8\x56\xbb\x10\xa1\x58\x2a\x62\x06\xa5\x6f\x43\xfb\x17\xb5\x14\x97\x69\x46\xcf\xe2\xa8\xef\x0e\x82\x1e\x0b\xd6\x73\xe2\x41\xb2\x59\x1d\x86\x6a\x5b\x04\x54\xe6\xba\x67\xbb\x7a\x4f\x42\xf7\x5b\x34\x64\x88\x04\xd7\x22\xfb\x68\xcf\x60\xd3\x00\x7c\x5a\x23\x5f\xad\x2e\x1f\x35\xa3\x0c\x2e\xa2\x2b\x1a\x33\x7d\x92\xd3\xbd\x77\x43\x56\x88\xa2\xce\xae\x2b\x7a\x79\x57\xc3\x07\x85\xf1\xfb\xff\xb9\xfb\xba\xed\xb6\x91\x24\xcd\xfb\x7a\x8a\x70\xef\xba\x48\x9a\x00\x09\xd2\x52\xd9\x96\x4c\xeb\xd8\xd5\xaa\x6e\xcd\x71\x51\x5a\x5b\x35\x3d\xbb\x2a\x6d\x1f\x90\x48\x49\x90\x48\x80\x06\x40\x89\x94\xe5\x79\xa7\x79\x85\x79\xb2\x3d\x19\x99\x09\xe4\x2f\x08\xaa\xe4\xde\xe9\xd1\x85\x2d\x01\xc8\xc8\xc8\xbf\xc8\xc8\xc8\x88\x2f\xae\xb9\xa9\x31\x80\xbd\x47\x0a\x42\xa8\xb9\x62\xb7\x3e\x2e\x81\x47\x73\x81\x3c\xea\x76\x99\x60\x30\xc5\x54\x11\x4d\xd6\x15\xd0\xde\x06\x65\xd4\xee\x5c\xc1\x87\x90\xac\x16\x19\xc9\xd1\x5f\x08\x12\x78\x6e\x6d\x70\xe9\x49\x14\xce\x66\xf2\x42\x51\x50\x5a\x5d\x95\x28\xe0\xad\x61\x41\xb5\x59\xd2\xbb\xec\x95\x17\xb1\x6f\x82\xd7\xaf\x06\x3b\x78\x91\x86\xba\xcc\xd0\x13\x78\xeb\x82\x2f\x3a\x8b\x72\x78\x35\xd8\x71\x8d\x1f\xae\x7a\x05\xa9\x95\x61\xfa\x88\xc1\x4c\x70\x30\xed\x6d\x73\xad\xd5\x0a\xdc\xd5\x51\xe9\x01\xb4\xe9\x94\x79\x32\xac\xd7\x3d\x4a\xed\x1d\xec\x62\xe9\x88\x96\xde\x95\xa9\xda\xd0\x5e\xeb\x23\xf5\xf1\xdc\x73\x77\x45\x10\x22\xc9\x40\xd6\x9d\x91\x8b\xd2\xcd\xca\x54\x8b\xd2\xa8\x66\x99\xb6\x4b\xcf\x96\x03\xb8\xe6\xff\x9b\x6b\xe5\x1c\xf6\x70\x15\xb1\xc1\x41\x48\xda\x0e\x5b\x3a\x9d\x8d\xd8\xb4\x5b\x80\xd3\x8a\x1f\x66\x79\xb5\xa1\xd4\xba\xea\x90\xe1\x63\x37\x61\xac\x6e\x56\x21\x64\xac\xf1\x88\xa5\x2d\x50\x32\xb0\xd6\xdb\xa9\x23\xf0\x99\x25\xd3\x0e\x85\xa4\x55\x34\xf0\x20\xe8\xe1\x3f\x01\xfb\x57\xfc\x17\x0c\x80\x14\x0e\x5d\xbb\x6a\x36\xa2\xb4\x94\xa3\x95\x47\xf0\xbc\x92\xb6\x1b\x22\x05\x98\xb1\xd5\xcf\xa3\xa6\x41\x0a\x9b\x9a\x62\xbf\x01\xb5\xf1\xcb\xaa\xae\x15\xba\x6e\xbd\xd6\x0a\xdd\xb8\xa1\x60\x75\xb1\x4e\x56\x53\x92\xe7\xa6\x4f\xb6\xf4\x53\x39\xd9\xd6\x1f\x0b\xe4\x49\x97\x38\x30\xfa\x80\x43\x55\xd7\xa8\x60\x49\xec\xfb\x8f\xd4\xc3\x55\x0e\xea\x35\xbd\x1b\x69\x9e\xc8\xd9\x2b\x36\x9d\x43\xf0\xce\x66\xf7\xa7\x57\x41\x50\x42\xf0\xee\xfe\x84\xb9\xbc\x2e\xe0\x95\xdd\x4a\xe0\x9e\x04\x78\xc8\xa5\x52\x66\x4e\xc2\x24\x47\xc9\x53\xa7\x77\xd4\xe1\xa6\x51\xe5\x10\x37\x79\x26\xb4\x24\x64\x0b\x9b\xfc\x2a\x37\x8c\xeb\x73\xc4\x38\xbd\x71\xe3\x24\xd6\x4c\x21\xb4\x5b\x2d\x17\x6e\x0f\xc7\x7a\xd9\x22\xce\x18\xcd\x12\xb3\x1d\x5d\xa8\x92\x5e\x85\xac\x7e\xd4\x79\x57\x66\x15\x0f\x71\x8d\xc3\x7c\xd1\xce\x21\xc2\xb9\xd8\x9e\x83\xf3\x0e\xab\xa3\x8b\x7a\xc2\x2e\xe2\x6f\xd0\x26\x11\x45\x64\x83\x6a\x08\x7a\x78\xcc\x75\x65\x31\x70\xfa\x93\x6c\x22\x58\xd2\xa0\xe7\xf5\x1a\x5c\x51\x95\x01\xb6\x3c\x2d\xb5\xde\x34\x50\xff\xa1\x34\xbc\x21\x64\xfc\x8d\xdc\x37\x57\x98\x7c\x61\x9a\x91\x30\x6f\xd2\x1d\x5c\xec\x20\x95\xa6\x71\x92\xab\x1e\xd9\x14\xc0\xa7\x90\x2f\x81\x06\x79\x28\x94\x10\xc8\x4f\x13\x62\xbd\x01\xce\x15\xb6\x39\x6b\xf2\x05\xde\x6c\x20\x45\xdb\x12\x86\x59\xcb\x1b\xd7\x80\x9d\xb2\x26\xdf\x3f\x6f\x76\x68\xdf\x20\xcc\xe1\x11\xd9\xdd\x36\xee\x59\x9b\xf0\xfd\x40\x59\x4c\x12\xca\xfa\x8a\xa5\x12\x13\xe9\x9d\x5c\x49\x36\x1c\x4c\xc8\x1e\x5b\x35\x1e\x56\xac\xf3\x7b\x44\x73\xd3\xb2\x31\x69\xde\xf2\xda\x2a\xad\x1c\xb2\x1c\x2a\x85\xec\x9a\x45\x89\xa9\xce\x59\xee\x8a\xcf\x84\xe2\x61\xcd\xc9\xf5\x43\x4d\x77\x98\x4a\x87\x8e\xd1\xfe\xe9\xf8\xf4\xf8\xf4\x7f\x9f\x1c\xf6\x8f\xc6\x9f\x4f\xdf\x8f\x7f\x3e\x84\x5f\x0f\x4f\xff\x7a\xfc\xe7\xcf\x9b\xa3\xd6\x94\xcb\x62\xb8\xbb\x4a\xf3\x32\x5a\x82\x9b\x83\x27\x79\x3a\x5b\x16\x8a\x55\x3c\xce\xed\x21\x63\xd5\x0d\xc5\x49\x4f\x94\xc3\x3c\xb7\x30\x62\x4f\x60\x04\xf5\xee\x5a\x2b\xc3\x63\x99\xd6\x66\xcb\xcb\x22\x34\xfa\x0e\xbf\xed\xd7\xd6\x85\xa5\xd3\x1a\xc4\xf0\x6d\xec\x0d\x47\x27\xc8\xd1\x79\x21\x2d\x37\x23\x32\x7d\xe1\x4e\x9d\xf0\x4d\x35\xe3\x19\x94\xd3\x0b\xdb\xd4\x56\xba\x71\x4a\xe2\x59\x6d\xaf\x89\x1c\x5d\xb6\x98\x24\xec\x3b\x0f\x79\x65\x47\x02\x8f\x9e\x1c\xb7\xe8\x12\xf9\xc9\x40\x0d\x56\x32\xfb\x20\xce\xe1\x32\x23\x21\xb3\x1d\xf0\x58\x1e\x33\xf8\xb1\xbd\xf6\x60\x22\xe7\xcd\x7a\x01\x7e\x13\xd2\x6a\x8c\x50\x23\xba\x01\x27\x2b\x90\x4a\xaf\x08\xe4\xe1\x9c\x17\x56\xbe\x4c\x33\x76\xda\xd7\xd9\xe0\xb8\xc0\xcc\x0f\xde\x39\x44\x1c\xe6\xe4\x34\xc5\x69\xce\xb0\x43\x24\x2f\xad\xb5\xcd\xeb\x2e\xb6\x18\x60\x05\x70\xb8\x00\x32\xa0\x9d\xe0\xe9\x3e\x3f\x9c\xda\x36\xa3\xa8\x5b\x28\xb5\x80\xd1\xda\xae\xf7\xac\x7d\xa3\xf4\x9d\x6d\xb4\xea\x3c\xfb\x94\xce\xe3\xcc\x9c\x30\x5e\x68\xff\x45\x8b\x8d\x52\x22\xf1\xe0\xd6\xbc\xa3\xc4\xac\x52\x74\xaa\xeb\x50\xd4\xcc\x73\x4f\x8e\x89\x34\x9c\x7c\x12\x9e\x63\xf7\x56\x72\x90\xe6\x0e\xc0\x32\xb6\x2f\x5f\x49\x0a\xf6\x6f\x47\xf2\x19\x36\x6f\x45\x4b\x7c\x08\x75\x0c\xd4\x5d\x55\x89\xad\x4d\x74\xb1\x5a\x65\xfd\x1c\xc1\xf4\xec\xf6\xbc\x0c\x4a\xda\x67\x49\x3f\x03\x9e\xc6\xaa\xcc\x45\x98\xb0\x08\x79\x83\x40\xc2\x05\xa6\x0d\x9e\xd1\xe2\xb6\xeb\x9e\x56\x78\xca\x09\x60\x04\x47\xc6\xd3\x31\x8c\x60\x6c\x3c\x3d\xa2\x35\x2a\x4f\x03\xe8\x33\x3e\x8c\xa7\x81\x41\x21\xb0\xd2\x0d\xac\x74\xc7\x9c\xee\xd8\x78\x6a\xd2\x1d\x5b\xe9\x8e\x39\x5d\xf5\xe9\x11\xa7\x7b\x64\x3c\x35\xfb\xe1\xc8\x4a\xf7\xc8\x42\xf7\x69\x37\x21\x86\x54\x8f\xf7\x4e\xf2\x67\x72\x25\xba\xb8\x2c\x37\x2e\x25\x35\xab\x9a\xbe\x10\x4d\xaa\x4a\xd4\xb1\x73\x31\x33\x06\x3e\xac\xd9\x42\xc6\x5c\x2f\x8d\x04\xe1\x4b\xab\x20\xc4\x1c\x64\x35\x42\xd0\xd3\xf3\x2c\xaa\x5c\x6e\x27\x23\x1b\xf4\xbb\x88\xf3\x11\x91\xa5\x72\x4e\x3f\x75\x50\xac\x5d\xae\x8f\x8b\x3e\x18\x1b\x7a\x15\x7d\xe5\x68\xfd\x55\xf7\xe2\xa3\xa6\x7d\xbc\xf3\xc8\x3e\x0e\x3c\x2a\x06\xb7\xda\x6e\x78\x7c\xd4\x86\x1d\x9d\x7c\x59\x86\x33\x61\x46\x6e\xb4\xa1\x57\x61\x55\xe2\x22\x41\xcf\xce\xac\x74\x1c\x56\xc0\x36\x15\xf2\xa5\x69\x37\xed\xfe\x81\x3d\x99\x9f\x75\xfe\x8b\xab\x9c\xfe\x26\x9d\x13\x4d\x59\x4f\xa9\x74\xbe\xfc\x2e\xf3\xe7\x71\xca\xe6\x96\x73\x88\x57\x72\x4a\xeb\xa0\x13\xe9\xb2\xf1\x7a\xfb\xe9\x8f\x4c\xa4\x77\xdb\x4d\xa3\xc7\xf4\x58\x9a\xd9\x57\x60\xed\x76\xf1\xf8\xde\x3b\xce\x0e\x69\x6d\x5c\x49\xbe\x2c\x48\xd3\x7e\x7c\x65\xed\xc7\x36\x4c\x64\x20\xe8\xfa\xde\xec\x70\x60\x28\x1e\x9d\xa0\x6a\x3f\x4f\xd6\xbb\x21\xe0\xb2\x22\xa5\x2f\xd9\x96\x9d\x15\xe7\xbf\xb0\xf2\x0d\x56\xde\xb3\x67\x42\xd3\x7d\xfa\x66\x48\x79\x6d\xf5\x16\x6c\x6a\x00\xdf\xa1\x70\x88\xf1\xaf\x6d\xda\x02\x3f\xfe\xb8\x41\xd5\x7e\xc7\xf5\xfb\x4a\x41\x1f\x7e\x87\x0e\x60\x59\x60\xb6\x1d\x3b\x16\xd8\xb5\xb9\xb1\xd8\x82\xfc\x3b\xb0\x9d\x90\xcb\xb0\x88\x6f\xc9\x63\x78\xe7\x45\xf9\xb8\x8d\xc9\x65\x93\xa6\xb0\x96\xd0\x33\xc5\x77\x68\x0d\x82\xa8\xfa\xc1\x23\x1a\xf3\x7f\x48\x96\x6e\x3b\xed\xd8\x6f\x22\x0f\xce\x77\x68\xce\x23\xac\x17\x5b\x36\x9c\xd6\x50\xee\x52\xb3\xc6\xbb\xd4\xeb\x3f\xb2\x4b\x7d\x9f\xa1\xaf\xfa\xea\x1f\xb1\x45\x89\x7e\x53\xf7\xa7\x59\xf3\xfd\xe9\xcd\x53\xed\x4f\xbe\xba\x41\x35\xe8\x57\x48\xc0\xc7\xf3\x67\x62\x3c\xb5\x9d\xc3\x7d\x3c\x7f\xfa\x47\xda\x31\xda\xc7\x83\xad\x9f\x18\x8f\x03\xcb\xf9\xdc\x46\x39\xb0\x53\x1e\x73\xca\xfa\xf1\xda\xb7\x1e\xc5\x6d\x84\xc7\x9c\xb0\x7e\x90\xf6\xad\x47\x71\xdf\x7a\x14\xb7\xd1\x3d\xb2\xd0\x7d\x5a\xe5\x1c\xe3\x7b\x9a\xce\x59\xd7\xd4\x64\x44\xe8\x74\xcc\x97\x93\x06\xd3\x91\x27\x80\xbc\xf6\xa0\xf0\x60\xf5\xf1\x74\x6d\xf1\xf0\xe7\x36\x32\xf3\x4d\xc8\x32\xc2\xe9\xa6\x33\x34\x53\x6a\x57\x53\x66\x2a\x7e\xce\x8f\xfa\xd9\x04\xf3\xc2\xe9\x14\x95\x9c\x70\x96\x60\xfc\x67\x21\xba\xdd\x4c\x5c\x41\x8f\xe3\x70\x6c\x89\xee\xff\x1c\x5f\x26\x39\x44\xf1\xc5\x05\xc9\x2c\x44\x43\xcc\x26\x69\xbd\xa1\x59\xe3\xed\x81\x3f\x31\x2f\x65\xc4\x15\x42\x6f\x31\x5b\xe6\xed\x75\x3d\xce\x04\x5e\x5e\x88\x4c\x65\x95\xd2\x62\xf6\xf3\x9a\xa5\xd5\xaf\xff\xc8\x1d\x88\xe1\xc8\xb6\xc7\x73\xe7\x11\x96\xc2\x8d\x38\x81\x02\x78\xd7\x8b\x13\xe0\x86\x24\x7c\x6b\xc9\x66\x8a\x79\xed\xda\x65\x77\x79\xb0\xc6\x2c\xdb\xfa\x3c\xa0\x5f\xad\x60\x0f\x53\xdc\xb9\xb2\x2b\x33\x1e\xec\xa0\x9b\x72\xce\xfd\x06\x69\xff\xaa\x54\x79\x6b\x5a\x74\xcd\x02\x50\x98\x3b\xa3\x07\x2b\x29\x28\x45\x3c\x4b\x59\xcd\xf4\x0d\xa6\xf9\x0b\x33\x82\x0f\xec\x37\x9b\xbc\xf1\x8c\x8b\x06\xed\x5f\xf1\x0f\x57\xee\xfc\x7e\xfd\x3e\x1c\x1d\x1e\x1e\xc2\xab\xdd\x1d\x68\x0f\x83\xe0\x75\x07\x7e\xea\xbd\xdc\x43\xf9\x8c\x82\x38\x60\x30\x30\xa5\x5b\x4b\x91\x56\x47\x76\x07\x4d\xd5\xee\x85\x49\x7d\x0e\x28\xa1\x3d\x7b\x1a\xa4\xda\xeb\xc6\x95\x92\xeb\x6e\x45\xb4\xf2\x6b\xe5\xf5\x5a\x7f\xcd\x66\xae\x04\x59\xae\xaf\xd4\x2a\x77\xf7\xdd\x55\x3c\xbd\x12\x82\x74\x12\x5f\xd2\x83\x83\xd3\xf8\x8d\xe2\x09\x73\x00\x3a\x26\x37\xbb\x14\xfc\x78\x4a\x85\x53\x58\x1b\x55\x41\x49\xf9\xa1\xfd\x1a\xbd\x40\xee\xb7\x44\x06\xc0\x2e\x59\x39\x30\xcd\x0a\x84\x70\x6f\x74\xe7\x5d\xf4\x32\x72\x4b\xb2\xdc\xec\x37\xe0\x17\xbd\x19\xa9\xa0\xce\xe8\xbc\x40\xed\x88\xaa\x3a\x02\x54\xc5\x99\x80\x8f\x0a\xe3\x70\x1f\x26\xbe\xbf\x0f\x45\x5d\x50\x81\xc2\x84\xb5\x0b\xac\x6b\x5a\xd4\xcf\x58\x12\xd1\x72\xcc\x7f\x08\x93\x82\x5b\x5d\xb3\xae\xf1\xda\x85\x8f\x1a\x1f\x64\x29\x26\xe3\x2d\x67\x7c\x2d\x3d\xeb\xc0\x01\x84\xb0\x67\x8d\xf8\x67\x4d\xa5\x54\x26\x2c\xdf\xe0\x04\xde\xc2\xf5\x3e\x4c\xea\xb2\x0e\x0b\xff\x8d\x09\xba\x6f\xac\xf1\x97\x5a\xcf\x3b\xc6\x2d\x2b\xf1\x96\x15\x70\xfb\x64\xd4\xf8\x81\x6c\x89\x94\xd6\xef\xc3\x8a\xd6\x77\x00\x88\x8c\x47\x57\x1a\x57\x8b\x59\x5c\x1a\xbf\x43\xda\xb0\x90\x28\xf7\x1d\x3e\xcd\x3d\xb6\x5a\xd7\x53\x8f\x6d\x2b\x85\x27\xc4\x9b\xb9\x6d\x4f\x70\x80\xae\xb5\xc1\xf0\x75\xb7\x0f\x1b\xf2\x8e\x8c\xcf\x47\x59\x5e\x4d\x29\x27\xf9\x55\x9a\x15\x3a\x87\x0c\x23\x44\xe4\xbc\x08\xe5\x3c\x71\x6b\xb9\x14\x84\x79\x85\x6a\x8f\xe9\x7f\x68\x19\xfc\x2e\x2f\xc2\x0c\xfd\xc3\x4b\x3e\x2d\xd2\x64\xa2\x80\xfb\xf1\x65\xb1\x2a\x61\xbc\x0d\xa1\x39\xe1\xc9\x41\x2d\xd9\x81\xe4\x3b\xbe\xf5\x94\xc1\xbf\xeb\x61\x6a\xa2\x9a\x6b\x78\x47\x17\x61\x8d\xfc\x62\xa8\x4a\x6c\x5a\x5d\xbb\xe7\x61\xe5\x70\x73\xbd\x0f\x31\x3d\xc1\x3e\xe3\xee\x36\xfb\x3c\x49\xe6\xc8\xd4\xc7\xc4\x8f\xef\xe3\x27\x0e\xe8\x04\xac\xb7\xeb\xca\x85\x6a\x43\x4f\xc0\x12\xfe\x88\xb1\x5c\xab\x24\x39\x12\x38\xe3\x05\x13\x8b\x20\x91\x80\xb5\xc4\x85\xd4\x6c\x6d\xef\xcc\x2a\x6f\x2d\x3a\x17\x71\x60\x6e\x0f\x7c\x7f\x6d\xc2\x45\x72\x0f\x61\x9b\xbe\xb9\x72\x6b\x18\xfd\x3e\xfc\x92\xce\x66\xe9\x1d\x65\xd5\xb2\x69\x9b\xea\x19\x86\x96\xb2\x7d\xbc\x1b\x00\x26\xef\x93\x37\x76\x63\x67\xbf\x0b\xb3\x28\xb7\x5a\xe4\xf9\x0f\x5b\x90\xf6\xfd\xdd\x81\x62\xb3\xe6\xfe\x46\x6b\xb7\xbf\x91\x50\x6b\x36\x8d\x96\xb4\x18\xa7\x65\xf8\xb3\x9c\x64\xb8\xbb\x02\x1f\xba\x6b\x2a\x39\xcb\xc7\x3f\xfe\x08\x3e\x7d\xec\x2b\x8f\x75\xd2\x94\x12\xb7\x97\x32\xc4\xc6\xb5\x35\xa9\xb6\x84\x77\xb6\xf6\x50\x66\xad\x49\xc3\xdb\x04\x16\x87\x42\xcf\x84\xda\xf1\x0f\x9f\x8f\x1d\xcf\xe9\xb9\x50\x3b\x4f\x43\x00\xcf\x71\x04\xb5\xd3\xb0\x2f\x9e\xfb\x81\xf9\xbd\xad\xde\xc0\x51\x6f\x20\xea\xd5\xe8\x8c\x45\xbd\x63\xf3\xb9\x8d\xfe\xd8\x41\x7f\x2c\xe8\x6b\xcf\x8f\x1c\xf4\x8f\x1c\xf4\x8f\x1c\xf4\x8f\x6c\xf4\x9f\xf8\x40\x9d\x46\xcb\x59\x63\x2b\x50\x0f\x43\x92\x78\xf6\x86\x08\x95\xa6\x1c\x52\xcd\xf8\xf6\xeb\xf1\x9f\x7f\xfb\x78\x5c\x7b\xa1\xcd\x6b\x1d\xb1\x5f\x1b\x1e\xc1\xbf\x78\x60\x39\x5f\x8b\x93\xb7\xf5\x80\x3d\x68\x7c\xc0\x36\xe5\xa9\x9c\xc7\x1c\xcf\x3a\x9a\xe7\x8d\x57\x66\x0d\xa7\x1f\xf1\xe3\x8f\x65\x4f\x7c\xb6\xea\x4d\xe5\x54\xe6\x6b\x66\x1a\x7d\xb6\xee\x39\x23\x60\xb6\x38\xa0\x73\x3e\x57\xe5\x29\x4d\xe6\x12\xd9\x36\xd9\x92\x5d\x2d\x29\x1b\x94\xab\x15\xe7\x6a\xb5\x25\x57\xab\xfa\xe3\x3b\xd6\x21\x4d\x08\x2a\x63\xdf\xb8\x4f\xd1\xcb\xe9\x2c\x8e\xe2\x30\x61\x59\x5f\xe2\x34\xd9\xc3\x54\xe7\x79\x7c\x99\xb4\xd7\x1d\x78\x01\x2c\x1a\x60\x05\x7d\x08\x27\x79\x7b\xdd\x31\x83\xb5\xfa\x7d\x0c\x0d\xa3\x82\xf2\xcb\x1a\x10\xed\x8d\x64\x84\xca\x82\xb7\x23\xc8\xe0\x2d\x2f\x68\x94\xcb\x85\x55\x45\x7f\xb1\xb6\xb9\x41\x02\x4f\xc2\x8e\xd7\xfc\x2b\x8f\x4e\xa3\x40\xbb\x8f\x55\xcb\x5b\x08\x7f\xe9\xe5\xf0\xc2\x78\xe3\x3c\x11\x99\xd5\xc9\xfd\xda\x08\xad\x73\xc5\x4c\x5f\x6d\xf8\xd2\x43\xec\x17\xda\xa7\x4f\xed\xcc\xe1\x12\x34\x78\x8d\x42\x22\xc5\x14\x8f\xb8\x13\x3c\x4f\x63\xcc\x1c\x6c\x94\xac\x6e\x8a\xcc\xe0\x04\x50\x68\x24\x1b\x6e\x52\x1a\xbb\xbc\x32\x1f\x57\x7f\xc5\x96\xa6\xe9\xbf\xb6\x95\xbb\x2b\x24\xd0\xb5\x9a\x8d\xbb\x56\xb3\x71\x17\x65\xbb\x6e\x35\xee\x32\x74\x61\xe3\xa9\xcd\x68\x6c\xa3\x1b\x58\xe9\x8e\x39\x5d\xdd\x0e\xdc\xb5\xda\x8c\x6d\x74\xc7\x9c\xae\x6e\xf1\xed\x5a\x6d\xc6\x5d\xab\xcd\xd8\x46\xf7\xc8\xc2\xef\xd3\xce\x3c\xc4\x81\xfd\x83\x26\xe3\xc5\x8c\x5b\x8c\xe9\xd9\xa9\xd9\x76\x55\x3c\x95\x95\x78\xf8\x4f\x6c\x25\x7e\x0a\x33\x31\x93\x59\xff\x3d\xec\xc4\x7c\x36\x4b\x6e\xbc\x71\xe9\x0d\x5d\x3d\x74\xa1\x81\x5b\xcc\xc7\x3a\x0c\x39\x3a\x4e\x3e\xc6\x40\xfc\x3d\x2d\xbe\x2e\xe3\xb3\x66\x05\x5e\xd7\xda\x7d\x21\x44\xd7\xf3\xfa\x69\xf0\x9d\x8d\xac\x4d\x0c\x85\xf0\x4b\x98\xa3\x33\x50\x0a\x4b\xbc\x2c\x45\xab\x1f\x15\x40\x09\x44\x29\xf0\x0c\x8f\x79\x03\x5b\xac\xb5\x1b\xc3\xda\x94\x05\x8f\x33\x99\xd6\x19\x61\x1f\x65\xd5\xdd\x60\x83\xd5\x5f\x0a\xd3\x43\xf8\x07\xac\xa8\x6a\x95\x8a\xc5\xd3\x22\x18\x1d\x60\xdd\x74\x88\x35\x23\xe0\x2c\x4d\x2e\x49\xc6\x6c\x81\x2c\x9f\xe2\xa4\xcc\x15\xc5\x8d\x66\x4e\x73\x58\x08\x3e\x9a\x4a\xe9\x78\x15\xb2\x45\xb0\xb4\x11\x16\x1e\xb7\x20\x9b\xb8\xda\xc9\x6c\x2d\x8c\x6e\x11\x5a\x35\x64\xdb\x1b\xfa\xd0\x87\x6c\x5b\xbb\x58\x66\xb8\xae\x2b\xe0\x87\xd5\x14\xa6\x61\x02\x13\x02\xf1\x65\x92\x66\x7a\xa0\x62\x65\xce\x0d\xf6\x61\x62\x4f\x71\x10\x32\x0b\xf2\xf4\xcc\xf7\x27\xe7\xa5\x59\xb6\xcb\xed\xb8\x5d\x08\x11\x18\x08\x6d\x77\xd6\x40\x73\xf6\xfd\x73\x9b\xbd\xcb\x72\x44\x08\x6d\x2c\xac\xa6\x65\x3a\xd4\xd0\x32\x15\xba\xdd\x35\x79\x94\x9d\x85\x49\x2f\x66\x64\xe9\x72\x23\x4b\xc0\xad\x2b\x5d\x6e\x5d\x09\x74\x4a\xb8\xb0\x44\x28\x5c\x17\x06\xb0\x48\xf3\x3c\x9e\xcc\x88\x4d\x5d\xfc\x03\xc6\x15\x6b\x64\x89\x05\x4d\xaf\x3e\xba\xc4\x95\x97\xec\xec\xfe\x1c\xbe\x4e\xd2\x74\x46\xc2\xe4\x81\xd1\xff\x06\x7f\x13\x10\x14\x29\x4c\xd3\x65\x52\x08\x37\x35\x1f\xfd\xb1\xd5\x88\x8a\x3d\x74\x36\xf1\x98\xeb\x87\x07\x03\xba\x09\x04\x4e\xa5\xa9\xcc\x74\x84\x77\xed\xaa\xe2\x74\xdf\x3c\x00\xc5\xad\x36\xf1\x6d\xda\x5c\x3d\x15\x0e\x67\xbb\x53\x65\x84\xe0\x90\xba\xac\xfd\x94\xf5\x49\x9c\x84\x19\xbf\x45\xd9\x83\xaf\xf7\x1a\xb4\x2e\x2e\xe2\x7b\x39\xd5\x18\xfd\x63\x04\xcf\x9e\xdd\x57\x7f\x0c\xaa\x5f\xed\x72\xd9\x02\xcc\x3b\x78\xe9\x41\x4b\xb0\xd5\xa2\x3a\x74\x5a\x7c\x48\xd3\x99\x07\xf7\x36\xa9\x57\xf1\x41\x6b\xee\xc0\xbd\x15\x50\xd7\x76\xf4\xae\x8f\xce\xd1\xa3\x72\xcc\xd8\x9d\x5b\x19\xb8\xdf\xc4\xbe\xd0\xe3\x67\xec\x4a\xcf\xf6\xb1\x3a\x3c\xf0\xdd\x75\xe9\xb6\x21\x40\xc7\xc6\x43\x99\x8f\xb4\x09\x24\x9e\xab\xde\xdb\x32\x3d\xc2\xad\x08\x2c\xaf\xea\x36\xc3\xd9\x6d\x03\x82\x13\x87\x03\x89\xc0\x3b\xcc\xba\x92\x80\x0b\x5a\x64\xab\xe0\xa1\x27\xf6\x7c\x9f\x87\xab\x78\xbe\x9c\x6b\xc7\xa5\x68\xa1\x87\xb9\xd9\x61\x3d\x51\x3b\x2c\x52\x08\xcc\x20\x17\xc8\x48\xbe\x20\xd3\x22\xbe\x25\x33\xaa\x6a\xca\xe4\xd3\x79\x5c\x14\xca\x76\xa5\x8a\xaf\x68\x71\x0e\x5f\x85\xdc\xfa\xb3\x0a\xe0\x02\x47\xc2\xbb\x36\xa0\x35\xff\xfa\xfe\xdf\x18\x4e\x63\x1e\xdf\xaa\xd9\x0f\xcf\xb2\xb9\x44\xe5\x93\x92\x25\x51\x23\xf2\xda\x4e\x42\xa6\xc6\xb0\x79\xdb\x1d\x23\xfc\x4f\xca\xb2\xb2\x07\x5f\xa3\x85\x2c\x5b\xdc\xc5\xd4\x54\x2c\x75\x05\xd5\x2e\x37\xca\x65\xf3\x46\xe5\x34\x36\xb5\x52\xb2\x34\xc7\x72\xea\xd9\x37\x5a\xb0\xc4\x7c\x36\x49\xee\xb2\xbe\x98\x4b\x22\x5a\x94\xb9\x0f\x1f\x1e\x94\x64\x8e\x94\x7e\xe0\xd1\xa1\xf4\x60\xb0\xeb\x48\x50\x24\x82\x25\x3c\xf8\xf7\x7f\xc7\x6c\xaa\x72\x84\x04\xc3\x29\xe2\xb4\x2d\x3a\xec\x33\x7b\xee\xc8\xc1\xae\x9e\x37\x12\x0e\xb4\x59\xbc\x27\x32\x47\x36\xb2\xbc\xfd\xa3\x96\x30\xaa\x4b\xcc\x92\x76\xc3\xa7\x94\x5c\x41\x7b\x91\xde\x91\x0c\x85\xde\x20\xe8\xf4\xe0\x33\xfd\x5c\x41\x09\x63\xb0\x5f\xef\x68\x3f\x60\xea\x1c\x09\x8c\x0a\xdf\xbc\x55\xb7\x7b\x99\xf8\x4d\xb5\xa8\xca\x55\xe4\x53\x95\xe9\xf3\xfb\x5f\x0e\xff\x7e\x34\x3e\x3d\xfc\xcb\xe1\x27\xbe\x34\xd5\x67\x1b\x17\xd9\xd1\x05\x03\x21\x91\x67\x2b\xf2\x57\xe5\x74\xe2\x1a\x89\x94\x5d\x5a\x20\x9b\xfc\xe7\x7f\x60\xc0\xf2\x0d\x43\x58\x4d\xe5\x83\xb6\x22\x7b\x84\x7f\xab\x73\xa5\xf3\xab\x50\x4d\x9f\x90\x17\xdd\x8d\xb6\xe6\x8c\x12\xda\x72\xbb\x71\xae\x36\x2c\xa9\xac\xb6\x1b\xd7\x32\x63\xb7\x1f\x96\x49\x27\xcf\xed\x1b\xcb\x58\x78\xc6\x48\x78\x30\xf8\x49\xd1\x4c\x3a\xfa\x66\xda\xef\x63\x47\x0e\x48\x77\x38\x60\x42\x5e\xa4\xb1\xba\xe9\xb0\x1e\x67\x39\xfe\x89\x35\xab\xa5\xbe\xb1\x1e\x40\xc2\x2d\xd1\xd0\x1a\x10\xaa\x08\xc9\xe4\x74\x23\xbd\x61\x1d\x48\xd8\xa5\x05\xcb\xb5\xca\xc0\xd8\x28\x73\xe6\xa4\x7b\x78\x80\x1b\x0e\x65\xa1\x3c\x37\xaf\x01\x0e\x30\x65\xde\x0b\x4e\x49\x20\x0d\x0e\x98\x59\xc5\xf8\x7a\x4f\xcd\x93\x55\x67\x1b\xce\xbf\x64\x45\xdb\x4f\x3a\xe6\x35\x1f\xbe\x81\xb1\xeb\x8d\x7f\xe4\x2c\xc3\xde\x1c\x59\xde\x04\x1d\xf3\xda\x93\x51\xc3\x37\xca\xc5\xea\xe3\x24\x50\xfe\x65\x19\x66\x04\xb2\x34\x2d\x36\x85\xba\xcb\x15\x3c\x69\x5c\x2c\xe3\xe1\x13\x65\x01\x4f\x18\x5f\xb2\xfa\xc0\x98\x32\xeb\x20\x64\x1e\x64\x64\xe1\x6d\x67\xa4\x75\x1a\x05\x73\x66\xbd\x35\x5f\x70\x83\xa4\x25\xcb\xd1\x02\x46\x7a\xb3\xbb\xb0\x63\x7e\x78\x15\xce\x2e\x8c\xad\xb4\x15\xf4\x76\x5b\x16\xf3\x94\x88\x37\xe9\x8f\xc3\x71\x5f\xc8\xb8\xbe\x69\xef\x63\x58\x7c\xfc\xf4\xf2\xf0\x40\x4f\x09\xf8\xef\x56\x37\x7f\xf0\x0c\xef\x4c\xca\xfc\x92\x6d\x4e\x86\x53\x39\xc0\x6b\xd1\x3d\x10\x8e\xab\x03\x61\x99\x94\x09\x9b\x27\xf6\xa3\x24\x46\x89\x41\xf2\x22\x9e\x87\x85\x96\xc1\x9c\x76\xf4\xaf\x61\x71\xd5\x63\xb3\xbc\xbb\xb2\x5d\xdd\x96\x1f\xc0\x52\x80\xce\xf4\x53\x6b\x96\xb2\x7e\x1f\x4e\xc2\x3c\x67\xa8\xf5\x55\x31\x84\x78\xe2\x1b\x18\x9a\xed\xb8\x0f\x0d\x87\xbd\x64\x7e\x34\x02\x9a\x11\xf7\x1a\x8b\xed\x27\x2f\xa1\x26\xf1\x37\xde\x7c\x47\x32\x49\x35\xc3\xf0\xd4\x75\x04\xa4\x12\x8f\x9f\xd6\xba\x98\xa0\xee\x39\x0c\x05\xde\x57\xc2\x33\x8b\x9a\x45\xd5\x4e\x4b\x2c\xc4\x15\xab\x68\x99\xeb\xb4\x03\x7d\x04\xc4\xf4\x79\xb2\xb4\x80\xe5\xd9\x7d\xce\xb0\x4e\xec\x1c\x6e\x68\xab\x68\x2f\x17\xf6\xb6\x44\xf2\x75\xb6\x48\x4c\xb0\xdc\x53\x53\xeb\x3a\x9c\xb1\x50\xff\xe4\x86\x5c\xba\xed\x27\x3d\x04\x9a\x3d\xbe\x68\xb7\x48\xab\xc3\xdb\x67\xe7\xc0\x6c\x5a\x66\xac\x40\xbd\x17\x9d\x6c\x9b\x45\x21\x87\x2e\xcf\xe5\x55\x53\x6d\x09\x10\x7a\x61\xf5\x2c\xc0\x5b\xee\x69\xba\x9c\x45\x54\xc3\x11\x66\x78\x81\x98\x14\xe7\x65\x22\xec\x0a\x73\x16\x85\x72\x95\x10\x7b\x8a\x21\xa4\x91\x41\xf6\x94\x7e\x76\x87\x94\xa7\xe1\x32\x27\x10\x96\x97\xf1\x54\xab\xc4\xaa\xda\xab\x7e\xd1\x41\x31\x7d\x45\x92\x29\xa9\x7c\x0e\x26\x64\x96\xde\x79\xdc\x03\x59\x22\xa2\x57\xa2\xcc\x77\xa6\x64\xaa\xe9\x3c\xc5\x7c\xca\xdc\xee\x08\x74\xd2\x66\x3d\xcb\x00\xd2\xf9\x4e\x67\x70\xb4\x70\x2c\x23\x2a\xb2\x5e\x42\x07\x3f\xb4\x01\x8b\xa2\x24\xbd\x2b\xd2\xc4\xff\x14\x2e\xae\xf2\x34\x81\xb8\x20\x99\x23\x2b\xb3\x8a\xff\xa7\xbf\x05\x6e\x25\xcf\xec\xb3\x94\xce\x0e\x2a\xe1\x85\x12\x54\xb0\x98\x88\xf2\x9e\xbf\xf0\xf0\x0c\x34\x60\xd1\x4c\x75\xc8\xaa\x5a\x8e\xf2\xa2\x37\x05\x80\x8e\xb4\x00\x72\x1e\x0d\xd5\xa6\x4b\xc3\x4a\x07\x7f\x34\x3a\x19\xa6\xbc\xd7\xe9\x6c\x4a\xd4\x76\xaa\x09\xca\x8c\x25\x68\x27\x19\xa1\xb3\x35\x4d\x88\x16\xb7\x77\x11\x27\xe1\x4c\xa8\xed\xa2\xa0\x3d\x67\x1e\xaf\x81\xf4\x2e\x19\xa0\xea\x9b\x37\x6f\xde\x40\x9b\xf8\x3b\x1d\xf0\xfd\x77\x0c\x6b\x95\xfe\xfd\xb2\xe3\x41\x9e\x0a\xc9\x9d\xd3\xdf\x4d\x4c\x4b\x33\x83\xba\x54\x05\xd5\x6e\x50\x66\x90\x08\xa6\x69\x96\x91\x69\xa1\xbb\x4c\x1a\xa3\x90\x21\x70\x19\x95\xcc\xbe\x6f\xf1\xf8\x10\x3f\x8a\x70\xca\xc1\x87\x97\x1e\x4a\x85\x41\x2d\x34\x21\xef\xd8\x9d\xe2\x4a\x07\x04\xe6\xb9\x39\xe2\x84\x67\xb2\x42\x3f\x0a\xda\x64\x1e\x14\xb8\xb3\x6d\xbb\xb1\x57\xd3\x0c\x76\xb0\x77\xd1\x4d\x23\x5c\x2c\xb2\x34\x9c\x5e\xe1\x4d\x44\x45\x6f\x42\x7f\x09\xb3\x75\x07\x73\x77\xc4\xc9\x12\x6f\xba\xea\xe8\xd7\xac\x25\xa5\x2f\x13\x4c\x95\x47\x39\x69\xa1\x76\x92\x91\x05\x2a\xfb\xf8\x78\x07\x1f\x37\x41\xdc\x3c\x96\x01\x35\xcb\xba\xd1\xb9\xd9\xe3\x97\x02\x45\x0a\x39\x41\x7f\xa8\xb2\x59\xcb\x05\x47\xb5\xae\x6b\x0c\xaf\x81\xac\xc2\x69\x21\x66\x2f\xbf\x93\x49\xe2\x84\xe4\x38\x2e\x31\x93\x8d\x64\xb6\xa6\x1a\x27\x09\x37\xa4\x2d\x60\x56\x5b\xda\xd6\x26\x70\x91\xdc\xf6\x51\x78\x50\xa0\xc5\xc3\xd0\x28\x87\x9e\xe3\x3a\xd8\x5a\x6f\xc1\xe5\x50\xd1\xe9\x91\x2f\xed\x95\x3b\x11\xa4\xc1\x07\xd5\x99\x9b\x41\x56\x36\x04\x70\x74\xe3\x2d\xc2\x66\xdc\xca\x68\x41\x95\xa1\x9d\xfa\x5a\xf2\x06\xdf\xd0\x71\xa8\x85\x86\x6c\x8c\xa3\x7c\x74\xa1\xaf\x41\x5c\x68\xc9\x72\x36\xf3\x20\xf8\x1a\x78\x3b\xdf\xe8\x82\xdb\xa5\xbf\xbe\xfc\xe6\x49\xd7\x55\x38\xbd\x36\x91\xe7\x6a\x28\xad\x26\x49\x0b\xae\xb6\x56\x29\x91\xb4\x2b\x42\xba\x73\xcf\x2b\xe4\x57\x4c\xa9\xd4\x64\x5a\x76\x31\x97\xf4\xb3\xae\x90\x5d\x83\x0e\x3f\x7e\x5f\x85\xd9\xfb\xa2\x1d\xb0\x74\x97\xbb\x0d\x16\x26\x67\xfb\x94\x9f\xf6\x85\x9d\x89\xad\xd2\xa6\xc0\xc3\xe2\x87\xaf\x02\x7a\xa6\x73\xae\x82\x41\x13\xac\xd9\x39\x8c\xe0\x59\xc6\x17\x41\xc6\x17\xc1\x26\x5c\xd0\xda\xd7\x1b\x66\xfb\x53\xa6\xfa\xdf\xd8\x0b\x03\x0d\xc7\xc9\x83\x79\x53\xe3\x45\x82\xae\x17\xba\x03\x1a\x7d\x6a\x73\x6c\x7b\x61\x75\x6c\x7b\x61\xc5\x25\xb3\xd1\x0d\xac\x74\x03\x4e\x57\x77\x4b\x7b\x61\x75\x6c\x7b\x61\x75\x6c\xb3\xd1\x1d\x5b\xe9\x1e\x71\xba\xba\x0b\x9b\x8d\xee\x91\x95\xee\x91\xa5\x1f\x1e\x67\x6a\x71\x19\x7b\x71\x9e\xfe\x51\xcf\x36\x46\x04\x3d\xb1\x97\xb3\x86\xae\x6d\x53\x0f\x88\x94\xf9\x6c\xee\xc1\x6a\xfa\xd1\x83\xd5\x2c\xf5\x60\x75\x15\x7b\xb0\xa6\x7f\xae\xe9\x9f\x6b\xfa\xe7\xbd\xc5\x66\x82\x69\x91\xd1\x26\xf5\xc1\x9a\x20\xd9\x6d\x86\xd9\xe0\x9c\xd5\xe6\x6e\x73\xaf\x3c\xb7\xab\x1c\x74\x6c\x97\xc6\x95\x67\x9c\xa7\x01\x2d\xfe\xe7\x7f\x04\xf6\x10\x17\xe1\x8f\x55\x65\x34\xd8\x10\x5c\x6b\xb8\x96\x2b\x50\x98\x68\x51\xa5\xfa\x31\x22\x75\xa0\x01\xfe\x8a\x30\xcb\xb4\xec\xdb\xed\xf4\xb0\x62\x6e\xac\xc2\xd3\x7c\x35\x15\x11\x4c\xcc\x3a\xca\x19\x5d\x73\xff\xf3\xf2\xf1\x6a\xea\xf6\x27\xea\x4d\xb9\xbb\xdc\x88\xbb\xea\x39\xb2\xbf\xd6\xc6\x71\x32\x47\x67\xd3\xbf\xd1\xec\x14\xab\x63\x9c\x82\x7b\x59\x03\xef\xaf\xf8\xc7\xb9\x15\x17\xb9\x4d\x0e\xc0\x62\x9d\xa9\x40\xe7\x26\xb0\xb3\xb1\x11\x09\x9b\xc7\x10\x05\x35\x91\x8d\xeb\xba\x3c\x0a\xb6\xad\xc1\x65\xae\xab\x8f\x42\x52\x6d\x3e\x2b\x1d\x12\xa8\x2b\xbd\x5c\x6b\x2f\x35\x9f\x3a\x69\x74\xe5\xe7\xab\xe9\x47\xb7\x13\xd6\x1a\x5f\xd6\xb8\x61\x1d\x26\xf9\x32\x23\x74\x0a\x2f\xd2\x38\x29\xd0\xd9\x4e\x76\xc5\xc2\xc5\x41\xab\x28\x52\xa0\x2a\x8d\xd3\x07\x8b\x7e\xf3\x16\xeb\xeb\xc0\xfd\xd4\x1a\x9f\x79\x3f\xf5\x78\xb4\xe5\x47\x8f\xb3\xcd\x04\x18\xfe\x1a\x9b\xcc\x71\x23\x65\xcc\xdc\xfa\x4a\xd5\x1f\xf9\xba\x8b\x8b\x2b\x1b\xa6\xb7\x8c\xe5\xfd\x11\x1d\xa9\x3e\x7a\x8c\xa1\xb3\xf3\x7d\x88\x7d\x7f\x1f\xee\x95\xac\x64\x4a\x69\x9e\x8e\xdb\x74\xa6\x12\x02\x14\x46\xf0\xf9\x7f\x7d\x3a\xb5\xa1\xa5\x56\x35\xaf\xa7\x1f\xf7\xc1\xf7\x31\x47\x5b\x60\x37\x58\x4c\xed\x73\x6f\x8d\xd1\x3a\x6b\x0c\x81\x7c\x5e\x56\x6a\xf9\xee\x2a\x2e\xbf\xeb\x57\xcc\x3d\x58\xed\x2c\x15\x54\x3f\xf6\x3c\xcb\x2c\xd5\x85\x1b\x16\xd0\x19\xbb\x2d\x2a\x2b\xe4\x06\x9d\xd3\x6e\xea\xf9\xc1\xaf\xaf\x58\xaf\x9f\xdd\x98\x3c\xd9\xbe\xa7\x5a\x20\x6d\xc7\x0b\xac\xa7\x8b\xe5\x5f\xd0\x1e\x70\x90\x67\x5d\x33\x4b\xcb\x02\x6d\x68\xc3\x5c\x62\x0b\xa1\x6c\xa5\x3f\xba\x70\xcf\xa2\x41\xc1\xe2\x3b\x29\x06\xa1\x8d\xc4\x58\xd2\x7b\x76\xcf\x8c\x94\xe7\x5a\x13\xf0\x31\xe7\xf6\xca\x91\xaf\x84\xd6\xc6\xb0\xf0\x29\xc9\xe7\x48\xb2\x91\xdd\x93\xb1\x39\xd2\xd9\xb4\xf8\xb5\x4c\x6d\x43\xd5\xed\xea\x0e\x7a\x2e\xf1\x78\x5f\xc6\x99\x36\xba\x4c\x57\xdc\xeb\xe8\xea\xdd\xd2\xbb\xee\xfb\xfa\xc8\x6c\x93\xfe\x16\x37\x7c\xd5\xb1\x20\xbe\x80\x6c\x8e\x97\xdd\x1b\x9c\x61\xf2\x48\x72\x63\xf9\x6c\xd4\x28\xf9\xb2\x0c\xfe\xa1\x0e\x31\x22\x57\x74\xbb\x03\x95\x07\xa0\x76\xf1\x9d\x47\xda\x4d\xb9\xb5\x90\x71\xbf\x5e\x57\x6c\x5b\x7f\x18\x67\xd1\xe6\x2e\x31\x82\x84\xaa\x36\xb3\x94\xc1\xdb\x79\xc5\xc8\x1f\xa2\xa3\x64\x1e\xc9\x4e\x31\x8a\x9b\x0a\xa5\x3f\x10\x5e\x31\xaf\x3d\x39\xe7\x38\xde\xbb\x61\xa1\x3d\x4a\xc1\x10\x71\xd9\x9c\x65\x4d\x73\x91\x96\x3c\x60\x5e\x37\xf6\x80\xb1\xfa\x1e\xe4\x11\x1c\x48\xae\x39\x65\x9f\xec\x6d\xeb\x0a\x93\xb3\x3b\x82\x8c\x2c\x32\x92\x93\xa4\xb0\xe2\x02\xcb\x40\x67\x89\xd5\xf3\x80\xea\x0b\x32\xfd\x32\xeb\x0e\x2e\x4b\xb5\x61\x45\x0a\xd1\x02\x2e\xe2\x15\x89\xdc\x59\xc2\xfe\xeb\x3b\xa6\x69\xf7\x64\xdb\x7b\x9a\x6d\x20\xb0\xc9\xc3\x4d\x2f\xbe\xfd\x02\xad\x2b\xbf\xcd\x2a\x95\xe8\x34\x72\x60\x13\xa0\x9c\x98\x71\xbe\x6d\x3d\x86\x46\x0b\xd9\x2d\xd8\xe9\xb4\xf6\x06\xd7\x0d\x77\x4c\x1b\xd0\xd9\x8f\x06\x3f\xba\xce\xe8\xbb\xef\xbe\x14\x70\x12\xfb\xa8\x42\x57\x4b\x41\x74\xa4\x5c\x89\x7b\xce\x3f\xfd\xce\x35\x4e\x0b\xb2\x07\x61\xce\x74\xe5\x7f\x09\x6f\xc3\xcf\xd3\x2c\x5e\x14\xad\x5c\xb8\xe7\x16\xeb\x05\xf1\xa0\xed\x07\x9d\x5e\x91\xfe\x42\x99\xa2\x4a\x71\x9c\x43\x2b\x68\x29\xee\x24\x93\x65\xc1\xb2\x55\xb6\x7d\xbc\x0e\x0a\x06\x46\x09\x3f\x68\xfd\x93\x2d\x5b\xc6\xfe\xa3\x16\xac\xa3\xe8\xe6\xa5\x2a\x0a\x6e\xbf\x48\xed\x25\xb7\x59\x9e\x48\xe1\xd1\x0b\xb3\xe1\x52\x1c\x9a\xfe\x5b\x07\xa6\xc7\xa8\xb2\x42\x87\xc1\xff\xd7\x15\x4a\x94\x0d\x8b\xaf\xc2\xb9\xb9\xec\xd8\xd2\x55\x47\x9c\x79\x6f\xb2\x7e\x2a\x74\x77\x2b\xca\xd1\x22\x4b\x17\x24\x2b\x62\xd5\x3f\x94\x3b\xb5\xfc\x72\xfc\xe9\xd7\xf7\xa7\x90\x4e\xae\xc9\xb4\x80\x76\x4e\x88\x14\x5a\x32\x4d\x93\x8b\xf8\xb2\xe3\x9a\xbf\xbc\xec\x48\x1e\xb9\x17\xec\x3f\xce\xe2\x67\xb2\x08\xb3\xb0\x48\x33\xd8\x83\x56\x4f\x5d\xcf\xf8\x73\x99\xa5\xcb\x85\xf2\x95\xe7\xfc\x2a\xbe\x27\xb0\x07\x2f\xcd\xd7\x39\x99\xa6\x78\x33\xf9\x17\xe9\xbb\xc0\xfc\xee\x22\x0b\x71\xd2\xfd\xc5\xa8\xf4\xf7\xd5\xfb\xa0\xe5\x01\x47\x9f\x49\x13\x1f\x8d\xf9\xb4\x0f\xf3\x45\x38\x25\x1b\x28\xf1\x0a\xe5\xaf\xbe\xed\xff\x93\xc9\x21\xb6\xcc\x1e\x27\x88\x1c\x65\x1b\x48\x22\x51\xf2\x11\xa2\xc8\x5e\x74\x2b\x59\x84\x24\x1a\xbb\xb9\xe7\x05\x02\xfa\x3f\x46\x1e\x0d\xb6\x97\x47\xa6\x7f\x00\xbb\xb6\x65\x78\xcb\xb6\x23\x38\x83\x2e\xb5\x5a\x05\xc2\x8c\xb2\x9e\x17\x59\x2f\x5f\xcc\xe2\xa2\xdd\xea\xb5\x3a\xf6\x2f\x2f\x07\x30\x82\x2e\x5b\xd8\xbd\x72\xd9\x39\xbe\x1d\x4a\xdf\x9a\x6b\xd0\x51\x48\x5d\x7b\x23\x50\xea\x12\xcf\xed\x65\xe3\xa4\x38\x09\xd1\xef\x33\xcc\xb2\xb3\xe0\xdc\xfe\x95\x58\x9b\xd2\xa7\x03\xc7\xa7\x02\xa7\xbb\x82\xe1\x76\x56\x5c\x9e\xfe\x58\x99\x03\xc1\x4c\x75\x3d\xba\x27\x1e\xd9\x69\xcc\x08\x3d\x11\x96\x94\xec\xd6\x50\xe0\xe3\x7c\x39\xec\xa0\x15\xef\x72\xe0\xb1\x21\xb9\x1c\x7a\xac\xbf\x63\x0f\x29\xf9\xa6\xb1\x52\x94\xa5\x05\xde\x31\x3f\x4d\xfa\x65\x5d\x08\x31\xad\x82\x7e\xf3\x9c\x96\x79\x78\x80\x4b\xc7\xf5\x77\xd5\xf1\x15\xff\xf9\x72\x92\x17\x19\xfa\x09\xc5\x4e\xb7\x03\xe1\x31\x15\xc3\x5b\x5a\x11\xfd\xa5\x4b\x5b\x55\x6b\xb4\x17\xb5\xd1\x2f\xd5\xd9\xd2\xb5\xd4\x1f\x63\x0f\x39\xae\x6e\x1d\x57\xb6\xac\x9b\x86\xbc\x6f\x1a\xd6\x87\xe3\x1c\x3b\x2a\xa2\x14\x71\x66\x74\xa4\xce\x6a\xf9\x2d\x46\x82\xfe\xdd\xc8\x0a\xc7\x65\x8c\x34\x83\x2d\xb5\x1d\x54\x1c\x8b\xd5\x63\x6c\xb7\xcc\x32\xa9\xac\x50\x73\xcf\xb2\xa7\x3f\x3f\x50\xea\xef\x65\x04\xc5\x39\x4b\x51\xf2\x89\x5c\x1e\xae\x16\x6d\x68\xfd\xfe\x7b\xf4\x95\x36\xee\x72\x08\x5d\x68\x7d\xfb\xfd\xf7\x0f\x2d\x0f\x5a\x97\x2d\x70\xc8\x15\x80\xd6\xff\xfc\xb1\x55\x31\xec\xd8\x8a\xed\x1c\xed\xa9\x6b\xda\xf6\xd1\x9e\xbd\x9b\xed\x46\xc5\xbc\xc8\x1e\xa5\xeb\x31\xab\x7f\x63\x8d\x2f\xcc\x69\xd1\x78\xbe\x98\x91\xb2\x01\x78\x0e\x92\xeb\xa8\xf6\x39\x7a\x20\x22\xac\x1b\x10\xcc\xaf\x7a\x11\x91\x24\x9d\xc7\x09\x7d\xc5\x50\xb9\xa4\x07\xa5\x6b\x47\x08\x8b\x34\x8f\x8b\xf8\x56\xcd\x61\xc3\x21\x1c\x38\x93\x6e\x5c\xf8\x7c\x41\xa6\xf1\x45\x4c\xa2\xd2\xd2\xa9\xd4\x7a\x74\x51\xd9\x40\x65\xfa\x32\x27\x31\x53\x17\x4a\x4a\x2c\x42\xc7\xc6\x2b\x0b\xb6\xbf\x23\x79\xc1\xf9\x4a\xc8\x94\xe4\x79\x98\xad\xa1\x48\x15\xd3\x8d\xe8\x6b\x39\xa0\x13\xbd\x64\x14\xff\x3c\x55\xc3\x9a\x57\xc6\xd2\x07\x36\x72\x0f\xe5\xa0\x94\xf1\x4a\x18\xd4\x89\x1d\xfd\xb6\xba\x6b\xc5\xce\xb5\xb5\xbf\x46\x71\xe2\x03\xdb\xee\xd0\x82\x4a\x6b\x0d\x35\x66\x6e\x9a\x34\x6b\x8a\x6b\xaa\x8c\x56\x58\x53\x65\xc4\xf4\x92\x95\x99\x79\x64\x53\x63\xc2\x2c\xf3\x20\x0a\x3c\x88\x86\x78\xb5\x4f\x56\x0b\x0c\x93\x48\x02\xcf\x01\xbb\x76\x03\x23\x1e\x7c\xf5\x34\x57\xf7\x91\x61\x19\x3d\x1e\x1f\x5a\xe4\x46\x42\x37\xbe\x28\x68\xf8\x75\x44\xbf\x4e\xec\x5f\xdb\x34\xa9\x79\x54\xaa\x6e\xb6\xcd\x88\x47\x9b\x8d\x58\xb0\x99\x29\xbc\x4d\xf3\xee\x3c\xb2\xec\x0d\x25\x99\x1b\xd7\x6e\xfd\x8c\x5d\x8b\x25\x2c\xd9\x4b\xbb\x03\x1d\x84\xa7\xea\xcd\x0a\x64\xbd\x1e\x74\x57\xc4\x9a\xbb\x37\x53\x1e\x85\x3e\x1c\xba\x7d\x6c\x01\x5a\xfa\xdc\x6b\xe1\x06\x72\x03\x07\xd0\x92\xa7\x61\x8b\x9e\x95\xd4\x69\x4d\x25\x3e\xed\xcb\xed\x36\xe0\x7e\x5f\x0f\xe7\xdb\x73\x7d\x77\x74\x41\xc9\x2b\xb9\x81\xd2\xc4\x8f\xa5\x55\xcc\xad\xd7\xc0\xd2\xac\x4b\x72\x93\xae\xee\x65\x4e\xc0\xe5\x58\x36\xa7\x33\xf1\xd9\x0d\x77\x6c\xa3\xff\x55\x56\xec\x44\x84\x95\x0e\xa0\xd3\xbb\x2c\x08\x1b\x8c\x03\x48\xb8\x9a\xbe\x25\x22\x78\xe9\xb4\x50\x81\xc1\xf7\x0a\xe1\x7a\xad\x5f\x0a\x18\x51\x22\xab\x69\x2d\x0a\x78\xcc\x03\x69\xec\x12\x8b\x7d\xcd\xbb\x10\x83\x42\x59\x4c\x68\xe9\x73\x32\x8f\x13\x14\x78\xfa\x24\x28\xae\xc2\x4a\x9a\xcb\x57\x65\xa6\x00\xe6\x4e\x06\x11\xfa\x33\xe4\x15\xcc\xc0\xaa\x47\x4c\xb0\x81\x88\xa7\x89\x81\x93\xe3\xbf\x7d\xfe\xfb\xe9\xe1\xf8\x0c\xda\x54\x0c\xa1\x2f\xff\x73\xd9\x33\x81\x45\xe5\x49\xa0\x04\xf4\xab\x3d\xfc\x57\xf3\xaa\x60\x43\x39\x8f\xd8\xda\x99\xce\x17\xed\x08\x33\x80\x21\xe0\x3c\xe1\xbf\x45\x74\xec\x06\xe2\x66\x42\xe5\x1e\xab\xe7\xa0\x1f\x2a\x69\x81\x04\xc2\x83\x5d\x4c\xe0\x04\x55\x0c\x18\x81\xcf\xfd\x3e\x13\x4b\x28\xa0\x54\xb0\x91\x24\x10\x5d\xa1\xdf\x99\xcb\xa1\x06\x75\x00\x81\x89\x07\x91\x99\x5f\xb0\xec\xe9\x21\x4a\x50\x1e\x69\x20\x90\x00\xa3\x81\x15\x6f\x87\x05\x68\x0f\xb1\xf3\xe8\xd6\x81\xd1\x3d\xce\x2c\xec\x11\x6b\x92\xe5\x05\x4a\xed\xa1\x45\x62\x32\x01\xad\x31\xc3\x78\xc4\x51\xb1\xf0\xc4\x3a\xce\x42\x0c\xf7\x10\x1d\xe2\x90\xb7\xd7\x41\xca\x42\x49\x5b\xa4\xac\x38\xed\xd6\x79\xc4\x69\x47\x41\xc7\x83\x68\x60\xef\x62\xb6\xdb\x88\x16\x45\x43\xce\x46\x62\xf6\x2f\xeb\x2d\xe3\x4b\xcb\x48\x24\x01\x73\xbd\x1a\xf4\x72\xb0\x78\xda\x10\x78\x31\x82\xe1\xe6\x94\x00\xa5\xbe\x19\xe7\x30\x9d\xa5\x39\xc3\x7c\x59\xd1\x6d\xbe\x1f\x61\x62\xa8\x64\xd0\x8f\x06\x0a\x19\x66\x25\x60\xd3\x6a\xc0\x5a\x4d\x8c\x7c\xa0\xbc\x5f\x56\x9d\x5e\x38\xc9\xdb\x1d\x9c\x2d\x16\xe1\xca\xa8\x04\x4c\xd3\xd8\x48\x05\x97\xfa\xc0\x71\x1a\x39\xa3\x9d\x51\xc9\x4a\xca\x98\xf4\x27\x9c\x3b\x8e\x0c\x67\xb4\x2b\x95\x62\x81\x52\x4c\xeb\xc3\x6a\x95\x93\xd5\xc2\x7a\xcd\x19\x66\x5b\x9d\x1a\xea\x4e\x06\xd3\x34\xb9\x25\x59\x21\x7c\x0b\xb8\x5e\xbb\xc8\xe2\x39\x2a\xf0\x4e\xff\xcd\x94\x97\x6f\x82\x87\x69\x01\xca\xad\x7c\xad\xf0\x48\x70\x15\xe6\x22\xda\x05\xbd\x18\xac\xe0\xd1\xdd\x15\x15\xa9\x2c\x57\xfc\x01\xfe\xfb\x02\xc3\xa4\x79\x72\x92\xe6\xfd\x11\x3e\xd2\x09\x83\xea\x2f\x25\x38\x01\xdb\xbe\x12\xc5\x16\x7a\x74\x01\x89\x9c\xbc\x8d\x6b\x03\x8f\x8e\x3a\xa6\x04\x4f\x8e\xff\xf6\xf7\x93\x4f\x87\x3f\x1f\x7d\x3e\x3a\x1e\x8b\x83\x4d\x20\x14\x8d\x22\xd5\x3e\xb0\xdc\x2c\xbb\x8e\x0c\x89\x0d\x39\xe1\x4d\x10\xbc\x1a\xbc\x79\x33\xdc\xdd\x79\xb5\x13\xbc\x79\x33\xa4\x35\x18\xcf\xec\x96\xe0\xf6\x09\xc9\x2e\xd2\x6c\x9e\xc3\xee\x0e\xcc\xd2\x74\x51\x05\xbe\xe4\xb8\x8b\x60\xbe\x52\x9d\x58\xaf\xe3\x3a\xd1\x2c\xd2\xbb\x76\xa7\x8a\xe8\x32\xce\x30\x89\x76\x84\xd1\xbe\xd7\x0e\x2d\x49\xcd\x99\xe5\x04\xc7\x72\x04\x27\xbd\x45\x7a\xa7\x4c\xe9\xc4\x36\xa7\x6f\x3c\xb0\x24\x63\x8a\x61\x04\xf3\xb0\xb8\x62\x60\xc1\x3c\x3d\xf7\x01\xf8\x54\x4d\xeb\x26\x36\x6b\x84\x7b\x6d\x60\x7c\xb0\xe4\x95\x2a\x02\x85\x29\x7b\xf1\x45\xd5\x46\x0d\x9c\xc2\x86\x03\x2d\x5b\x82\x93\x86\x70\x0c\xc3\x97\x1e\xb4\x44\x25\x2d\xe8\xc0\x8f\x3f\x6a\xcc\x23\x61\x96\xe0\x92\xf6\xd1\xc3\x03\xc4\x36\xa4\x03\x0c\xd0\x4e\xa0\xcf\x82\x85\x2d\x58\x28\x8b\x30\xcb\xc9\x2f\xb3\x34\x2c\x28\x19\x7a\x0a\x42\xdf\xe0\x36\xf3\xae\xa7\x0b\xdb\x85\xbf\x62\x0d\x0e\x17\x9d\xd4\x86\x2e\xdd\x60\xcc\xed\xd7\x8c\x77\xe5\xc1\x20\x74\xd5\x90\x70\x7a\xc5\xd4\xdd\x78\x1a\x63\xd6\x02\xb4\xb2\xa0\x60\xe4\x7a\x64\x7a\x01\x37\x3c\xba\x15\xbf\x16\x30\xc2\x53\x76\x83\x46\xbe\x2c\xc3\x82\xe4\x7a\x1d\x54\x64\x54\xd5\x58\xdc\xb4\x8c\x65\xdc\x85\xb3\xe1\x6b\x0f\x76\x06\xe7\x1e\xc3\x2b\x66\x51\x35\xa5\x85\x45\xaf\x41\x28\xce\xe9\x05\x0c\x5f\xc3\xe5\x32\xcc\x22\x41\x3b\x23\x45\x18\x27\x24\xea\x41\xfb\x37\x14\x0e\x5d\x18\xf4\x76\x79\x9c\xec\x25\x95\x52\x67\x6f\x3c\x18\x0e\xce\x95\x62\x3d\xd5\xb4\x75\xc3\x74\x64\x89\xc3\x03\x9c\xec\x53\x12\xcf\xda\xda\x9b\xbe\xac\x26\x0f\x51\xc7\xdd\x98\x72\xcc\x72\x34\x56\x43\x5c\xed\x3a\x62\xcc\xe2\xc2\x5d\x1e\xe0\xe8\x70\xcd\xf4\x1b\x57\x44\x4d\x05\x47\xee\xd4\x2f\xcb\xcf\xf0\x78\xb6\xae\x12\x96\xbe\x83\x1b\xe8\xc8\x0f\xf0\x6c\xad\x17\xb5\x9c\x3b\x35\x51\x11\xb3\x90\x77\x87\x1e\xfc\x2c\xae\x58\xb3\x8a\x90\x55\x4d\x13\x2b\xbe\x39\xd4\xfa\x4a\x67\x7f\x55\xc3\xbe\xed\xe4\x98\x70\x64\x49\xda\xb9\xc7\xe3\xc3\x1e\x55\xaf\x74\x94\x5c\xbe\x38\x6f\x2a\x67\xac\xb5\xa7\x4e\x12\x43\x0d\x83\x3d\xd9\x73\xfc\x7b\xdc\x7a\x4b\x3e\x94\x56\x5f\x49\xb9\x12\xbb\xf3\x89\x71\x09\x8e\xc6\xc8\x3c\x32\x53\x82\xea\x78\x6f\xca\xb6\x2b\x19\x18\x35\xab\xa2\x9e\x92\xbe\x6a\x8e\xe3\xca\x9e\x87\xdc\x29\xb1\xee\x2f\x36\x61\xe0\xfc\xb3\xf8\x73\x9e\x48\x60\x8a\xdb\x79\x67\xda\x4b\x6e\x76\x06\x95\xcb\x6d\x7f\x0f\xec\x2e\xbd\xcd\x55\xf0\x89\x04\x5f\xb9\xd9\xbd\xd3\xea\x9a\x92\x47\xae\xab\x60\xd9\x89\x73\xb8\xa3\x39\x71\x6a\xc2\xe3\x80\xfb\x72\xaa\x97\xc1\x3b\xff\x00\xe7\x14\x74\x3e\x9f\xa0\xab\x17\xfe\x3a\xc0\x40\x98\x09\xc4\xaa\xd7\x08\x77\xf7\x62\x17\x02\xf8\x61\x9c\xcb\x26\x7f\x9c\x63\x2c\x5c\x9c\x51\xf1\x9a\xe9\xe3\x4a\x33\x8c\xe5\x5e\x55\xa5\xdd\x30\x30\x1b\x96\xd2\x96\xab\x30\x97\x2e\x43\xca\x75\x29\x57\x80\x96\xad\x38\xaf\x6e\x40\xd2\x4c\x4d\xec\x7e\x7a\x4c\x0f\x83\x7f\x3f\x39\xfe\x8c\x1d\x12\x56\x87\x8b\x52\x0b\x94\xcb\x96\x72\x48\xae\x84\xd3\x18\x1f\xfe\xc5\x13\x33\x66\x2b\x19\x31\x39\xb7\x1c\x15\xf0\x68\xf0\xd3\x4e\xa3\xa5\x5c\x9e\x75\xb1\xef\x8c\xc5\x34\x31\xd6\x92\x5a\x40\x5b\x3f\x93\x9a\xe5\xc3\xc1\x3d\xe4\xb5\x33\x71\xb8\x50\x58\xcc\xfc\xce\x2b\x84\x9c\x61\x27\xd8\xb1\x96\x92\x1e\xb1\x45\xeb\x28\x79\x5b\x2c\x81\x7c\x04\x91\x31\x4a\xb3\xbf\x75\xef\xce\x5d\xba\x0d\xbb\x9e\x6d\x89\x5a\x2c\x00\x3c\x20\x03\x8f\xd0\x1d\x9b\x17\xc1\x9b\x60\xe5\xde\x51\xfc\xd4\xc6\x91\xf1\xd2\xe3\x70\x6c\xa9\x4b\x33\x38\xbb\xe8\x30\x1a\x1a\xd8\x47\x42\x75\x2f\xd7\x95\xc4\xc4\xe9\x34\x3e\xf1\x60\xe8\xc1\x4f\x3b\x1e\x0c\x77\x3d\x68\xd1\x79\xd2\x72\x9c\x15\xaa\xaa\x09\xbc\x1d\x49\xab\x81\x41\x0b\xbd\x1b\x49\x8b\xcc\x5a\x98\x0a\x43\xd5\x2f\x18\xe7\x0f\xb8\xee\xad\x01\xf6\x80\x3b\x18\x22\xb0\x77\xf5\xf9\xa3\x3a\x9d\xdb\x68\x3e\x84\x39\x69\x3b\xe8\x7a\x30\xa1\xb2\xda\x43\x29\x97\xdb\xb3\x84\xda\x7b\xb8\x44\xd2\x4a\x04\xe8\x4d\xed\x3c\x79\xa2\x6b\xec\xc7\x47\x1f\xf3\xd8\x7d\x6e\xaf\xba\xbb\x4a\x67\xea\x2d\xb3\x81\x44\xad\xc8\x87\xb2\xf4\x48\xfc\xd5\x24\xb9\xbc\xb8\x8b\x31\x63\x28\x3c\x05\xf7\x73\x60\x6c\x8e\x1b\xfa\x81\x9e\xfc\xd8\x3a\xf0\xd0\xa9\x38\x4a\x99\x70\x9c\x4e\xc9\xa2\x10\x5b\x8d\xc0\x45\x74\x35\x0a\xbb\xea\xf8\x82\x35\x29\xfd\x97\xcf\xc7\xe3\xc6\xf9\xfe\x6d\xf7\x3e\xea\xf0\xf5\xe1\xfd\x2c\x0e\x73\xc2\x2c\x38\x1f\xe2\x4b\xe1\x27\x38\x27\xc5\x55\x1a\x49\xb1\x09\xfd\xbe\xc8\x53\xc2\x12\x97\xec\x83\x44\x84\xbd\x62\x3b\x32\x89\x20\x9c\xa4\x92\x73\x00\x2d\x59\xe6\x7f\x1c\x89\x54\xd9\xfb\xa2\x64\xbe\x9c\xd4\x95\xe4\x47\xf0\x35\x6b\x3f\x3d\x09\x95\x25\xe7\xcb\x59\x5d\xc9\x28\xbe\x8d\x23\x82\xe5\xa2\xf8\x76\x5f\x79\x97\x91\x79\x18\x27\x11\x37\x0b\xcd\xd3\x48\x7d\xcd\x53\xc1\xf3\xfc\xf2\xd3\xf9\x42\x7d\xcd\xb2\x06\x89\xa4\x41\x72\x87\x72\xd8\xa4\xe4\x22\xbe\x3c\x9e\x5c\x4b\xf7\xbe\xba\xab\x6b\xbb\xfc\x48\x16\x8e\x7c\xf0\xca\x8f\x59\xb5\xdf\x78\x05\xb4\xd1\x9f\x8e\xfe\xf5\xfd\xe9\x21\xfc\xf5\xf0\xe3\xc9\xe1\x27\xf8\xe5\xb7\xf1\xcf\xa7\x47\xc7\xe3\xcf\xfc\x8b\x72\x5a\x94\x71\xb6\x8a\x85\x0b\x1d\xf7\xe8\x8e\xa6\x46\xd8\x08\x63\x0b\x5e\x5e\x3d\x3c\x20\x1a\xce\x08\x62\x38\x80\x18\xf6\x20\xae\xee\xd5\x24\x46\xca\xa5\x6e\x1a\x54\x98\x37\x0a\xdb\xa8\xd3\x8b\x52\xc7\xe3\x07\x0e\x95\x4f\x75\xb3\x08\x75\x66\x73\x0f\xee\xd5\x4d\x99\xb2\x3f\x50\x1f\x5d\xc3\x08\x42\x7e\xc8\x55\xdf\xd0\xd1\x0d\xa9\xd4\xeb\x42\xab\x25\x75\xb3\xec\x2c\x76\x6d\x46\x84\xe6\x58\x0c\xd3\x8b\xb2\x82\xf2\xcb\x7b\x18\x55\x06\x10\x1f\x72\x6b\x24\xb2\xa8\xe0\xde\xf7\xf7\x91\x5c\x2b\x40\x71\xab\x4b\xee\x0c\xba\x4a\xae\xae\x6f\xca\xd2\xac\xae\x5a\x54\x54\xf3\x9e\xd6\x90\x6b\x04\x2d\xe3\x7c\x40\x86\xc8\x29\x3f\xa7\x11\x79\x5f\xb4\x7d\xff\x9a\x21\x74\xed\xbc\xde\x97\x2b\x17\x92\x4f\xc2\xe0\xba\x46\xd7\xd0\x87\x87\x4a\xcc\x49\xc3\xfd\x33\x5b\x10\xaa\xec\x2e\xa7\x69\xae\x66\x85\x94\x46\x17\x4b\xb1\xec\x62\xa0\x0f\x6e\xe8\xc1\x44\x1d\x2f\xbb\x27\x87\xc8\x8e\x63\x4e\x04\x03\x1e\xf3\x9a\x21\x0a\x78\x86\x71\xcb\xc0\xcb\x9c\xb1\x68\xfd\x7d\xa5\xc3\x6d\x59\x8c\x84\x91\x86\x2a\x28\xd7\x3a\xee\x7d\xf9\x15\x4b\x0d\x52\x21\x23\x54\x3d\xcd\x32\x83\x54\xe0\x08\xd6\x1a\x55\x34\x4d\x9e\xe6\xe3\xe1\x01\xa4\x94\x49\x21\x1c\xc0\x84\x23\xc7\xfa\xd7\x74\x5d\xaa\x94\xec\xe9\x92\xb8\x19\xed\xd9\x08\x24\xde\x63\x8d\x71\xba\x0c\x02\x95\xe3\x1b\xaa\x98\xcd\xac\xbc\x9a\xe9\xe8\x9d\x79\x84\x04\xbf\xf4\xdd\xff\xc5\x16\x0c\x28\xf7\x03\x95\xae\x98\x5b\x96\xb4\xd8\x8c\xb2\xd4\x0b\x37\xf0\x0e\x66\x2e\x5a\x2c\x41\xf5\x8d\x25\x2f\xf5\x4c\x4b\x85\x7c\x00\x37\xb0\xa7\xb7\x4f\xf0\xe1\xca\x83\x5d\x85\xbc\x07\xa5\xe8\x88\x31\x59\xb5\x48\x07\x1c\x8b\xac\xd4\xf1\xb9\x9c\x8b\x9f\xfe\xf9\x8e\x3f\xde\xdc\x0d\x8c\x49\xa9\x13\xca\xa6\xd3\x21\xe1\x3d\x6a\xeb\x07\x90\x97\x2c\xd7\x47\xaa\x4b\xc2\x6c\x49\x18\xd8\x36\x7a\x67\xdc\x52\x45\x5b\xd8\xb1\xe2\x84\x9d\xbd\xbc\x0a\xae\x9a\xb9\xca\xf4\x04\x91\xdf\xe8\x13\x7a\x3c\x15\x90\xd3\x58\x9e\x19\xc5\x31\x4b\xae\xe6\x63\x53\x16\x64\x51\x59\x78\x0d\x40\xd5\xfa\xd6\x80\x74\x07\x2d\x7e\xe3\x4f\x35\x22\xe9\x82\x40\x7e\x27\x90\x30\xb8\x22\x54\x0a\x94\x38\x29\xfe\x95\xd5\x9c\x66\xe3\xf4\x30\xcb\xd2\x2c\xc7\x7b\x8f\x79\x4c\xff\x09\x57\x8a\x90\xe1\x1d\xc7\x6e\x1b\x4a\x0c\xe8\x84\x9e\x22\xde\x8d\x68\x11\x06\xfd\xf6\x76\x44\x4b\xaa\xfd\x57\xd5\x98\xbf\xa7\x9b\x5a\x3b\x9d\x5c\x5b\x48\x1f\x63\x30\x4b\x6f\x91\xa5\x45\x5a\xac\x17\xa4\xd4\xb8\x7a\xd3\x70\x36\x63\x85\x46\x23\x68\x9d\xf1\xa8\x17\xa4\x75\xde\x72\x8d\xd5\xcf\xec\x24\xa0\x6d\x9e\x47\x09\xf7\x36\x2a\x53\x87\x27\x5c\xea\xf2\x0f\x8e\x97\x45\xd9\xe1\x87\x97\x3d\xe5\x40\xd1\x1a\xee\xee\xb6\xd8\xb9\x61\xf0\x93\x98\x93\x39\x9c\x0d\x76\x3d\x18\xec\x9e\xbb\xcb\x5d\x5c\xb4\x18\x70\xf7\x20\x90\x8a\x0d\x3d\xd8\xf5\xa0\x2a\xa7\x8d\x4f\x91\x7e\x60\xfc\xf0\xa3\x0b\x63\xdf\x13\x5c\x1a\x5b\xc0\xb5\x2a\x94\x99\x5f\x80\xe1\x6f\x1f\x66\xd9\x47\x53\xf8\x6b\x1e\xf4\xcc\xeb\x3d\x2f\x32\xd3\xdf\xdd\xf0\x0d\xd7\x37\x7c\x9e\xbb\x28\xcb\x3e\x32\x37\xfe\x72\x2f\xa5\x8f\xe8\x16\x1e\x66\xd9\x19\xfd\xfd\x1c\x5e\x8c\xc4\x98\x68\x5b\x39\xfd\x04\x25\x50\x00\x98\x92\xfb\xfd\xc7\x93\xbf\xbe\xff\x70\x78\x5a\x42\xc4\x22\x6f\x1c\xd4\x8c\xcb\x0d\xd7\x9d\xc8\x35\xbc\x55\xd8\xb8\x76\xa5\xc4\x67\x3b\x45\x96\x9d\x5d\x53\x09\x23\x7a\xd9\x07\xb7\xdb\x7b\x55\x82\x6e\xf7\xe7\x50\x99\x28\xe4\x87\x2e\x14\x0b\xe9\x9b\xee\x48\x54\xdc\x2f\x2b\x76\xa2\x5f\xf0\x2f\x9f\x8f\xc4\xa7\x9b\x9d\xda\xaa\xdf\xf4\x45\x47\x7b\x46\x4b\xd8\x65\x2c\x5b\xc7\x71\xde\x26\x1c\xaa\x29\x03\xef\x60\x00\x07\xf2\x38\x05\x1d\xaa\x01\xf6\xf8\x51\x59\x8e\xc0\xa0\xa7\xe8\x0e\x74\x25\xa6\x05\x9e\xf1\x01\xb4\x98\xfb\x22\xe9\xb6\x64\x38\x60\x0b\x8f\xb6\xa3\xbe\xb6\x42\x66\x24\xf1\xe0\x5e\xdd\x29\xc6\xba\x89\x50\xdb\x8a\x09\xb7\x08\x7d\xad\x4f\x35\x67\x83\x92\xb9\x47\x5d\xb5\xd7\xda\x47\x9c\x0d\xb8\xe7\xf8\xcf\xfa\x64\x67\x36\x84\x7b\x61\x41\x90\x99\x3b\x71\x9a\x43\xad\xa6\x90\x9a\x65\xcb\x09\xbe\x5f\xb8\x58\xc6\xc6\x76\xbb\x84\xee\x85\x24\xb1\x4e\x79\xb9\x55\x2d\xda\xbf\xfe\x88\x89\x00\xdf\xaf\x69\x9e\x68\x62\x77\x44\xbb\x5e\x7e\x2a\x67\x39\x26\x4c\x9c\x58\xeb\x65\x1d\x54\xcd\x19\xaa\x60\x33\x94\x16\x7d\x36\xe9\xe9\x02\xeb\x66\x7e\x69\x87\x31\xe7\x92\xb4\xbb\x55\xdc\xd0\xae\x55\xae\xe0\x2d\x67\x3e\x36\x65\xcb\xcb\xde\x84\x4e\xee\xea\xf2\x32\x31\x8f\x02\x87\xff\x76\x72\xfc\xe9\x94\xff\x5d\x59\x6e\x46\x10\x26\xa8\x3e\x94\x29\x0e\xe9\xd8\xfd\xfa\x67\x36\x64\x2c\xa4\x6c\xbd\x20\xe9\x05\x44\xe4\x82\x9e\x69\xe8\xbe\x28\xf8\x6f\xd1\x9d\x98\x3d\xef\x85\xf3\x48\xe9\x52\xf6\xb8\xad\x9a\x3c\xcc\x93\x32\x7c\x03\xa9\xe2\x71\x1a\xb1\x5c\x1e\x0c\xe6\x8c\x24\xb7\x71\x96\x26\x54\x75\xc9\xb9\xb7\xe9\x72\xb1\x48\xb3\x82\xa5\x2a\x27\x3d\x3a\x59\x33\xa1\x79\xca\x83\xcc\x79\x66\x9f\x51\xed\xae\xb5\x4c\x18\x47\x11\x32\xad\x96\x57\x18\xd7\x5e\x8d\xf4\x63\x3d\x54\xf9\xb4\xb2\xf5\xa2\x48\xa1\x03\x45\xb6\x86\xaf\xc0\xff\x1c\x41\x46\xbe\x2c\xe3\x8c\xb4\x5b\xec\x49\xab\x43\x5b\x39\x0d\x8b\xe9\x15\xb4\x49\x07\xbe\x7e\x2b\xdb\xfb\x21\x4b\xef\x72\x61\x18\x33\x16\xda\xe5\x2c\x9d\x84\xb3\x9e\x3c\x58\x86\x89\xe1\x5b\xa7\x4c\xa6\xf3\xcd\xfb\xfa\x27\x56\xe3\x9f\xf6\x76\x83\x6f\xe7\xde\x9f\xee\xc8\xe4\xe5\x9f\xf6\xce\xc4\x10\xb4\x39\x63\x1e\x6b\xa2\xc7\x9b\xd8\xf9\xfa\x03\x15\x59\x7f\x23\x93\x97\x32\xf3\xbd\xfe\x2c\x9e\xf4\x29\x09\x4c\x2f\xd0\xef\x43\x94\x26\x05\xa4\xb7\x24\xcb\xe2\x88\x70\xee\xa8\xb4\x8b\xc3\xc9\x8c\xfc\x40\xfb\x84\x77\xfb\x5d\x9c\x44\xe9\x1d\xe6\x14\xd0\xfa\x5d\xf9\xa0\xc7\xaa\x54\xbf\x12\x43\xa1\x7c\x82\xcc\xed\xff\xf0\xed\x87\x1f\x8c\xd1\x61\x6f\xb0\xf1\x15\xc7\x7f\xda\x1b\x0e\xbf\x9d\x7f\xf3\xbe\x7e\xf3\xce\x58\x2f\x9c\x77\x7e\xe8\xf7\xff\x07\xe4\xe9\x32\x9b\x92\x5f\xc3\xc5\x22\x4e\x2e\x7f\xfb\xf4\x71\x44\x5f\xf6\xae\xf3\xde\x3c\x5c\xfc\xf0\xff\x02\x00\x00\xff\xff\xd2\x48\xd8\x13\xdc\x80\x07\x00") +var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x7b\x13\x39\xd2\x38\x0e\xbf\xcf\xa7\x50\xfc\xdc\x0f\xb6\x49\x63\xe7\x34\x0c\xd3\x99\x0c\x1b\x02\x33\x64\x6f\x20\x5c\x40\x76\x76\xef\x6c\x96\xab\xed\x96\x6d\x0d\xed\x6e\xff\xba\xdb\x09\x19\x92\xef\xfe\xbf\x54\x3a\x1f\xfa\xe0\x24\xcc\x69\x93\x17\xe0\x96\x4a\xa7\x52\xa9\x54\x2a\x95\xaa\x72\xfc\xff\x96\x24\xc7\xfb\xbd\xc9\x32\x1d\x97\x24\x4b\x11\xee\x95\x41\x1a\xe4\xfd\x2f\x32\xa5\xe8\x65\xc1\xb2\xff\x85\x4c\x7a\xeb\xe9\x69\x76\xc6\x7e\x95\xf0\xeb\x3c\xca\x51\xb4\x5f\x5e\x2e\x70\x36\x41\xa2\xae\xfd\x8e\x28\xda\x79\xf0\x80\x27\xee\xd1\x32\xcb\x07\x0f\xa2\x7e\x8e\xcb\x65\x9e\xa2\xa8\x97\x05\xeb\x9b\x7d\x9a\x4e\x44\x1a\xe1\x69\xb4\xd6\xc9\x7e\x8a\x2f\xd0\x8b\x3c\xcf\xf2\x5e\xe7\x30\x4a\xd3\xac\x44\x13\x92\xc6\x68\x9e\xc5\xcb\x04\xa3\x6e\x67\x23\xdb\xe8\x74\x3b\xfd\xbd\x72\x96\x67\x17\x68\x32\x18\x67\x31\xde\xef\xbc\x3e\x7e\x7e\xf2\xea\xc5\xc7\x37\xc7\x1f\x3e\xfe\x78\x7c\xf2\xe6\x79\x27\x98\x5c\xd3\xfa\x92\x7d\xda\xf7\xfd\x2f\xf8\xf3\x22\xcb\xcb\x22\xfc\x72\x7d\xbd\x47\xc7\x70\xba\x79\x36\x18\x47\x49\xd2\x4b\x06\x3c\x2b\x10\xbd\xef\x61\x36\xc0\x74\x1f\x00\xb7\xce\x4e\xf1\xd9\x1e\xef\x6a\xd1\x4b\x9f\xa6\x21\xee\x5f\x07\x49\xa0\x4a\xe2\x80\xe1\xee\x9a\x43\xd1\x26\x45\x26\xf4\x82\xb4\xc2\xd5\x24\xcb\x7b\x14\x3a\xdb\xdf\xdc\xcb\xbe\xcf\x07\x09\x4e\xa7\xe5\x6c\x2f\xdb\xd8\xe8\x17\xbd\x9c\x22\x5e\x76\xe3\xba\xdf\xfb\xb2\x15\x9e\xca\x2e\xf3\x2a\x02\x86\xa5\x80\xb7\xdd\xff\xb2\xc6\x12\x44\x67\xf6\x4f\xd7\x10\xfa\xb2\x86\x10\x42\x9d\x71\x96\x16\x65\x94\x96\x9d\x10\x95\xf9\x12\x07\x2c\x95\xa4\x8b\x65\x59\x74\x42\x74\x0a\xdf\x02\x1a\xf2\xd2\x68\x8e\x3b\x21\xea\x7c\xcc\x2e\x52\x9c\x77\x02\x95\x43\x47\x47\x73\xa2\x38\xce\x71\x51\x74\x78\xce\x35\xfc\x7f\xc6\xab\x16\xc5\xe1\x7f\x9e\x96\x2d\xcb\xe6\xf6\xb2\x8f\x5a\x11\xa3\xbd\xd1\x65\x89\x8b\x9d\x6d\x7f\x7b\x02\x48\x62\x7a\x0d\xa1\xeb\xe0\x4e\x10\x70\xa3\xfe\xc8\xe1\x68\xd8\x6b\x87\x80\x95\x51\xfd\x47\x1d\xfa\x38\x4b\x4b\x9c\x96\xb7\x1e\xfc\x9f\x72\xde\xe9\x8c\xfd\x61\xa6\x7d\x12\x25\xc5\x6f\x37\xf4\x1c\x17\x38\x3f\xf7\xad\xfa\x3f\xfa\xa4\x15\xcb\xd1\x3b\x3c\x25\x45\x99\x47\xff\x05\x93\x17\xd4\xd5\x81\x2f\x8e\x6f\xc5\xf7\xcb\x3c\x4a\x8b\x89\x97\xf5\xfd\x59\x70\x90\x5b\xa4\xb0\x3a\x12\x0a\x5c\xbe\xaf\x27\xa9\x3b\xc3\x85\xdd\xf4\x6f\xd2\xe8\x57\x9e\x80\xa8\x0d\xe2\xeb\x2a\x58\xe4\x64\x1e\xe5\x97\xde\x7e\x64\x59\xd2\x38\x79\x07\xbc\xad\x3f\x2f\x0a\xcd\x3d\xb8\xb6\x9a\x2a\x24\x1c\x56\x6e\xe3\x7f\x24\x24\x78\x7b\x1f\x93\x22\xbb\x48\x6f\xd1\xf3\x28\xcd\xd2\xcb\x79\xb6\x2c\x56\xe8\x3a\x49\x63\xfc\x19\xc7\xc6\xde\x75\x67\x13\xab\x2a\xd7\xba\x63\xd6\x7e\x41\xd2\xdb\x30\xee\x83\x25\x60\xe2\x45\x1a\xe3\xb8\x63\xa1\x09\x9f\x53\x42\xf8\x0b\xe0\x68\x44\xe2\xb8\x1d\x8e\x6e\x56\xff\x79\x94\x2c\xbd\xdd\x5f\x92\xb4\xdc\xfe\xe6\x71\xfd\x14\xbc\xc1\x17\xcf\xc8\xef\x88\xfc\x5b\xad\xb9\xc3\x59\x94\x4e\x7f\x4f\xd2\xb9\x13\xca\xa9\xa8\x5b\x93\xea\x6b\xa9\xc6\x8b\x99\xb7\x6c\x37\x6a\x44\xd0\xda\xd9\xda\xda\x75\xf0\xe5\xfa\x2c\xd8\xfe\xdd\x0e\xfd\x7f\xa1\x33\xef\xef\x24\x3b\x4e\x96\x69\x7c\x63\x52\xb9\xf5\xc6\x75\x7f\xec\xfd\x73\x1f\x7b\xef\x0f\x7d\x7f\xe4\x33\x87\x77\xf0\xfc\xbc\xf0\x47\x93\x36\xbf\xee\x66\xae\xf6\xaa\x9d\x3b\xdb\xab\x56\x9d\xf7\x49\x9e\xcd\x6f\x39\xed\x65\x76\xcb\xa3\xe6\xed\x04\xbe\xdf\x77\xdd\xfc\x11\xf0\x47\xd2\x98\xe4\x78\x5c\x1e\x79\xf7\xcc\x15\x7a\x72\xbb\x89\x20\xe3\x68\xf1\xe1\x77\x9d\x0c\x3f\x26\xdb\x9d\x76\xf1\x22\x2b\x48\xdd\x41\x7d\x11\x5d\x46\xa3\x04\x9b\x42\xc1\xef\xc2\x95\xaa\x68\xee\x4e\x8e\x5f\xb7\xa3\x81\x03\x31\xde\xe7\x26\x3e\x7f\xfb\x93\xcc\x9d\x20\xa9\xa2\xee\x76\x74\xf6\x3b\xa0\xff\x0f\x8b\xf5\xbb\x38\x3f\xde\x98\x4f\x7e\x6d\xac\xdb\x4c\xef\x1e\xed\x2d\xd1\x7e\xeb\x8d\xeb\x6b\xcf\xec\x91\x67\x4b\xab\x93\xe3\x76\xdb\xc8\x71\x60\xbc\x81\xf6\x85\x85\x43\xaf\x3b\x18\x4e\xb2\x7c\x1e\x95\x25\xce\x8b\x6e\x7f\x0f\x00\xde\x67\x09\x89\x49\x79\xf9\xe1\x72\x81\x4d\x58\xda\x3e\x85\x5a\x1b\x3e\x7c\xb8\x86\x1e\x1a\x90\x5c\xe7\x8e\x48\x81\x22\xb4\xc8\xb3\x8c\x02\xa3\x72\x16\x95\x28\xc7\x0b\x7a\xc8\x4a\xcb\x02\xf1\xb9\x43\x34\x93\xd6\x70\x54\xa2\x79\x54\x8e\x67\xb8\x08\xe9\x27\xcf\xd6\x7e\x9e\x9e\xe9\x1f\xbb\xc6\xd7\x99\x99\xb9\x63\x7d\x9f\x9d\x3e\x3e\x3b\x3d\x0b\xd0\x60\x30\x58\x43\x0f\x87\xce\xd8\x44\x8f\xf7\x91\xb4\xa6\xe9\xf5\xf9\x14\x97\x33\x52\x0c\x3e\xc2\xc2\xf8\x51\x20\x88\x02\x0e\x18\xba\x8e\x68\xc6\x51\x5a\xee\x69\xc0\x6c\xdf\xf6\x41\x1f\x43\x0e\x6f\x6e\x6f\xed\x7a\x6f\x6d\xcd\xd3\x8f\xc1\x22\xcf\x4a\x86\xb5\x7d\x94\xe2\x0b\xa3\xaf\xbd\x2f\xd7\xfd\xbd\xfa\x52\x03\x90\x5e\xf2\xe5\xb8\xcc\x68\xe3\x1e\xd8\xa6\x76\x07\xa4\xe0\x73\xae\x10\x42\xc9\x51\x20\x85\xdb\xb5\xac\xaf\xd3\xc4\x01\xcc\x5b\x6f\xc8\xb1\xdd\xfb\xf7\x69\xef\x74\xf3\xd1\x77\x67\x0f\xfb\xff\x3e\xeb\x3f\x1d\xf6\xd9\x38\xcd\x83\x43\x65\xb7\xae\x83\x2f\x1d\x9d\x14\x3b\xe1\x77\x41\x87\xd1\x5b\x27\xdc\xda\xbd\x3e\x0b\xbe\xf9\x9d\xc9\xfb\x59\x96\x25\x0d\xb4\x3d\xa2\x20\x15\x84\x4d\xf3\xc4\xff\x8c\x4a\xe1\xd7\xae\xfa\x79\xa6\x25\xef\xe8\x1f\x4d\x64\x0c\x3d\xbb\x29\x0d\xd3\xc2\xab\x10\x31\x83\xb7\x29\x98\xa6\xae\x48\xbe\x66\x91\x1a\xda\x65\x2d\xd6\x95\xbd\x09\xd5\xfe\x87\xa2\xd6\xa4\xd9\x87\xff\xd3\x8a\x68\x79\x7f\x9a\x29\xf6\xf1\xef\x4d\xb1\x74\x0f\x93\x24\x5b\xfa\x69\xb6\x9c\x61\x04\x9b\x1d\x10\xee\xc0\x47\xb9\x34\x57\xfe\xe0\x74\x09\x3f\x77\xb5\xdf\x67\x7a\xc6\x8e\xf1\x65\xd2\x2f\xe2\x5b\xab\xfc\xf9\xc4\xa8\x87\x17\xf5\x50\x39\x74\xf2\xc6\x64\x4e\x4b\xaf\x44\xe7\xac\x80\x43\xe8\x34\x79\x55\x4a\x37\xcb\xd4\x91\x3a\x6b\xb4\xb6\xf4\xcd\x88\x9d\x56\xc2\x48\xfd\xcb\x56\x70\xdd\xbf\x19\xe1\xf3\xde\x35\x53\xfe\xb7\x6d\x28\x7f\xf8\x10\x3a\xfc\x61\x46\x0a\x34\x21\x09\xa6\x94\xba\x88\xf2\x12\x65\x13\x74\x81\x47\x3b\x83\x5f\x8a\xc1\x1a\x80\xf0\x2f\x0a\x30\xc9\x31\x46\x45\x36\x29\x2f\xa2\x1c\x87\xe8\x32\x5b\xa2\x71\x94\xa2\x1c\xc7\xa4\x28\x73\x32\x5a\x96\x18\x91\x12\x45\x69\x3c\xcc\x72\x34\xcf\x62\x32\xb9\x84\x3a\x48\x89\x96\x69\x8c\x73\x20\xf8\x12\xe7\xf3\x82\xb6\x43\x3f\x7e\x7a\x73\x82\x5e\xe1\xa2\xc0\x39\xfa\x09\xa7\x38\x8f\x12\xf4\x76\x39\x4a\xc8\x18\xbd\x22\x63\x9c\x16\x18\x45\x05\x5a\xd0\x94\x62\x86\x63\x34\xba\xe4\x54\x84\xd1\x8f\xb4\x33\xef\x79\x67\xd0\x8f\xd9\x32\x8d\x23\x3a\xe6\x00\x61\x52\xce\x70\x8e\xce\x71\x5e\xd0\x19\xda\x11\x6d\xf1\x1a\x03\x94\xe5\x50\x4b\x2f\x2a\xe9\x18\x72\x94\x2d\x68\xc1\x3e\x8a\xd2\x4b\x94\x44\xa5\x2a\xeb\xa2\x40\x8d\x34\x46\x24\x85\x6a\x67\x99\x58\xd9\xa4\x44\x17\x24\x49\xd0\x08\xa3\x65\x81\x27\xcb\x84\x09\x8e\xa3\x65\x89\x7e\x3e\xfa\xf0\xf2\xf8\xe4\x03\x3a\x78\xf3\x2f\xf4\xf3\xc1\xbb\x77\x07\x6f\x3e\xfc\x6b\x0f\x5d\x90\x72\x96\x2d\x4b\x44\x25\x4a\xa8\x8b\xcc\x17\x09\xc1\x31\xba\x88\xf2\x3c\x4a\xcb\x4b\x94\x4d\xa0\x8a\xd7\x2f\xde\x1d\xbe\x3c\x78\xf3\xe1\xe0\xd9\xd1\xab\xa3\x0f\xff\x42\x59\x8e\x7e\x3c\xfa\xf0\xe6\xc5\xfb\xf7\xe8\xc7\xe3\x77\xe8\x00\xbd\x3d\x78\xf7\xe1\xe8\xf0\xe4\xd5\xc1\x3b\xf4\xf6\xe4\xdd\xdb\xe3\xf7\x2f\x06\x08\xbd\xc7\xb4\x63\x18\x6a\x68\x46\xf4\x04\xe6\x2c\xc7\x28\xc6\x65\x44\x12\x31\xff\xff\xca\x96\xa8\x98\x65\xcb\x24\x46\xb3\xe8\x1c\xa3\x1c\x8f\x31\x39\xc7\x31\x8a\xd0\x38\x5b\x5c\xb6\x9e\x48\xa8\x2c\x4a\xb2\x74\x0a\xc3\x96\x54\x86\xd0\xd1\x04\xa5\x59\x19\xa0\x02\x63\xf4\xfd\xac\x2c\x17\xe1\x70\x78\x71\x71\x31\x98\xa6\xcb\x41\x96\x4f\x87\x09\xab\xa0\x18\xfe\x30\x58\x7b\x38\x14\xcc\xf6\x6f\x40\xb6\xe3\x2c\xc6\xf9\xe0\x17\x60\x91\x7f\x8b\x96\xe5\x2c\xcb\xd1\xeb\x28\xc7\x9f\xd0\xff\x66\x25\xbe\x20\xe3\x5f\xd1\xf7\x73\xfa\xfd\x37\x5c\xce\x62\x7c\x3e\x18\x67\xf3\x1f\x00\x38\x8e\x4a\x8c\xb6\x37\xb7\xbe\x01\x86\xd7\xbc\x15\xd4\x08\xb0\x5a\x19\x2e\x8f\xf9\xf6\x0e\x2e\x29\x68\xc0\x74\x17\xf4\x41\x1e\xa5\xa5\x09\x48\xd2\xd2\x07\x77\xe2\x00\x2e\x2b\x20\x9f\x5f\xa6\xd1\x9c\x8c\x05\x1b\xd7\x4a\xc4\x2c\x07\x78\x94\xaf\xe4\xfb\x32\x27\xe9\xd4\x2c\x53\x40\x9a\x0f\xfa\x1d\x8e\xac\x31\xe6\x38\xf2\x8e\xf1\xc4\x05\x5d\x56\xc1\x7a\xba\x2d\xfb\x0b\xc0\xa4\xe0\x03\x34\x38\x73\xa1\x55\x11\xc0\x0e\xcb\xf9\xb4\xb0\x10\xd7\xf2\x07\xb2\x0a\xd8\x46\x18\xf0\xd5\x95\x3c\x3d\xa2\x0a\xe8\x83\x3c\x8f\x2e\x19\x38\x63\xe2\x96\x28\x70\x48\xe9\x53\x93\x00\xf8\x4a\x62\x1c\x22\x46\x65\x86\x70\x4a\x69\x78\x18\x63\xfa\x9f\x6c\x85\x32\xe3\x88\xb1\x49\xca\x95\xb8\x5c\x6b\x6e\xcc\xac\x6e\x7d\xc4\x14\xac\x30\x77\x66\x48\x42\xfb\x50\x43\x61\x74\x11\x78\xff\x1c\x97\xb3\x2c\xf6\x74\x8b\x29\xd7\xb3\x7c\x8e\x98\xe4\x92\x19\x33\xb2\x86\xd8\x1a\xe4\xc5\x3f\xf2\x99\xe1\x59\xe8\x6f\xd0\x7b\xf4\x85\x11\xcf\xb5\x14\xcb\xff\xc6\x30\x5f\xa0\x2f\x7a\x65\xd7\x90\x05\x6f\x15\x0a\xf4\x05\xde\x35\x5c\x23\xfe\x49\x28\x6f\x60\x12\x11\x25\x43\xe8\x0b\xdd\x89\x28\xbb\x07\x84\x18\xc8\xd0\x76\x6a\xbd\x4b\x0e\x8e\x04\x8a\x28\x36\x0b\x53\xbc\xd3\xb0\x36\x98\x90\xa4\xc4\x79\x4f\x2b\xdb\xd7\x74\x10\x9c\x8a\x4a\x2e\x14\x08\x22\x00\x9d\x42\xff\x74\xf3\x6c\x8f\xf1\x4f\x32\x41\xbd\x75\xbd\x11\xbd\x0e\xf6\x40\x83\x3d\xe5\xe8\x92\xf4\x3c\x4a\x48\xac\x68\x80\xd6\xb8\x1e\xa2\x2e\xda\x40\x7a\xe5\x6b\xba\xac\xa1\xd7\x6c\x52\x60\x05\xa5\xa1\x45\x12\x91\x94\xd1\x97\x35\x8d\x0c\xe0\x2d\xcf\xa9\x9e\x45\x9e\x7e\x3c\xfa\x05\x8f\xcb\x6b\xab\x42\x31\xc9\xaa\x1c\xab\x36\xb6\xe0\xaa\xa7\x4e\xeb\x86\x33\x73\x01\x2b\x6f\x09\x5c\x30\x69\x5a\xb1\xa2\x77\x4a\x81\xcf\x02\x74\x0a\xe0\x67\xfd\x76\xa8\x49\x48\x01\x12\x10\x5b\x7c\xd5\xd8\x29\x74\x34\x00\x0b\x60\xd8\xf1\xa5\x2f\x54\x81\x2a\xc4\x38\xcd\xb6\xc2\x4d\xe1\x2e\x7d\x8e\x9d\xa2\x8a\xbe\x0b\x41\xe0\x53\x5c\xea\x2b\xb0\xe0\x9c\x83\x93\x2c\x2d\xc6\xfb\x46\x4b\x18\x35\x0c\xe6\xd1\xa2\x57\xc5\x63\x41\x2b\xe7\x59\x23\x06\xef\x64\x35\xf7\x58\x4f\x4f\xa1\xc8\x19\x63\xcf\xe2\x4b\xae\x22\xad\x3f\x7c\x9f\x3a\x9e\x4c\x0a\x5c\x3a\x9d\xca\x71\xbc\x1c\x63\xad\x5f\xd1\x78\x1c\xa0\x86\xce\x01\x76\xca\xa8\x24\xe3\xb7\x51\x5e\xbe\x82\x97\x44\x56\xcd\x03\x3b\xbf\xe7\xe9\xa7\xa8\x2b\xa7\x4c\x09\xc7\xef\xdd\x2a\x5f\x47\xe5\x6c\x30\x49\xb2\x2c\xef\xf5\x9c\x16\x37\xd0\xce\x56\x1f\x0d\xd1\xce\x76\x1f\x3d\x44\x3b\xdb\x7c\xd0\x1a\xfa\xa2\xf1\x18\x6d\xa0\x9e\xdc\x74\x0c\xac\x57\xa0\x10\x3d\xd5\xf6\x2e\x84\x76\xb6\x51\x68\x24\x54\x74\x56\xa0\x3e\x40\x9b\x3a\xf6\x73\x5c\x2c\x93\x52\x50\x0f\x9b\xc1\xd7\xcb\xa4\x24\x3f\x93\x72\xc6\xe6\x44\x50\xa0\xd1\xb7\x40\xd2\x51\x60\xce\xa0\xa8\x9c\x8f\x90\xd5\x6f\x9e\xf8\xfc\xa4\x6f\xb5\xea\x5b\x03\x2d\x7b\xa0\xad\x11\x39\xbc\x4e\x67\x4f\x2d\x1c\x9c\x4c\xf8\x88\x79\x67\xf9\xae\x90\xe5\x2f\xa2\xf1\xac\x67\x33\x26\xa2\xd3\x16\xe5\xfa\x95\xf3\xa5\xe6\xea\xac\xaf\x17\x62\x08\x81\xae\x6c\xb8\xda\xce\x9e\xd9\x7d\xb1\x8e\x34\x22\x94\x6b\x97\x52\x31\x4e\x26\x1c\xc4\x9e\x23\xe8\x80\xdb\x25\x81\x27\xf8\xb0\x27\x4b\x6f\xc2\x5c\x8a\x1b\xfb\x08\xf3\x67\x78\x68\x88\xb6\x15\xe8\x35\xc2\x49\x81\xad\xe1\x0d\x87\x28\xce\xd2\x6e\x89\xa2\x38\x46\xbc\x54\x99\x99\x55\x0e\x10\x29\xbb\x05\x8a\x92\x1c\x47\xf1\x25\x1a\x67\xcb\xb4\xc4\x71\x05\x96\xbe\xd2\x38\xaf\xd5\x22\x1c\x0e\xd1\x87\xe3\xe7\xc7\x21\x9a\x90\xe9\x32\xc7\x88\x1e\xd8\x52\x5c\xd0\x13\x20\x3d\xa5\x5d\x16\x26\xb3\xfa\x2d\x88\xe4\x8f\x33\xc9\xe6\x64\x60\x1d\x81\x02\x2b\x15\xcb\x5c\xa2\x35\xc7\x93\x08\xd4\x31\x17\xb3\x2c\xc1\xac\x87\x24\x9d\xae\x37\x30\x82\x1a\x1e\x60\x73\x7e\x3e\xe8\x00\x65\xce\xca\x37\x16\xb9\x98\x93\x46\x51\xdf\xb3\xc5\xf5\x5c\xd5\x98\x46\x40\xac\x61\x74\x11\x29\xb2\x2e\x70\xe9\xcc\x29\x23\xab\x37\xd1\x1c\xdb\xfb\x90\xca\xd1\xe5\x4c\xb7\xac\x67\xf3\xa9\xdf\xcf\x54\xc5\x9e\x3a\x25\x5f\xe4\x18\x54\x52\xad\xf8\xab\x19\xb6\xa8\x64\x91\xe3\x73\x92\x2d\x0b\xd9\xa1\xed\x3d\x8a\x12\x92\x22\x92\x96\x4e\x89\x26\xfc\x6b\xfd\xf5\x35\x48\xff\x26\x59\x8e\xe0\x91\x30\x41\xfb\x68\x6b\x0f\x11\xf4\xbd\x18\x80\x78\x2f\x8c\xc8\xc6\x46\x55\x71\xfa\x67\xf5\x79\x63\x1f\x6d\xf4\x04\x0e\x08\x7a\x84\xb6\xce\xa8\x84\x8f\xae\xae\xd0\xe6\x5e\x65\x25\x35\xac\x9c\xd3\xc3\x06\x22\xe8\x61\xd5\xcc\x6d\xd8\xbd\xa0\xc2\x41\x15\xdb\x17\x7f\xd7\x4e\xaa\x99\x72\xdd\xef\xf5\xad\x29\x1c\x0e\xd1\x84\xe4\x45\x89\x70\x82\xe7\x38\x2d\xe9\xf9\x8a\xa1\x29\x40\xc5\x27\xb2\x40\xa4\x5c\x65\xca\x0d\xec\x6f\xfa\xb0\x4f\xf1\x57\x3b\x03\xf0\x74\x3e\x8e\x09\x6d\x24\x4a\xe4\x22\xe7\xf8\x74\xf8\x8f\x8b\x6f\x3f\x5f\x54\xa4\x53\xc1\x20\x4e\x09\xda\x40\x5b\x67\x82\x4f\xa0\x0d\xe4\x74\xc3\x83\xf6\x46\x04\x5b\xcc\xcf\x03\xc9\xb7\x4a\x0f\xed\x33\xaa\xb8\x31\xeb\xf9\x43\x33\x15\x2a\x6c\x99\x98\xba\xe5\xe2\x6f\xa0\x4c\x54\xc5\x90\x36\xeb\x18\x12\x6a\x45\xd3\x8d\x1c\x65\x38\x44\xe3\x28\x19\x2f\x93\xa8\xc4\x42\xf0\xa1\x47\x3e\xde\x17\x44\x4a\x3c\xbf\x05\x3b\xa2\xac\xe8\xf4\x4f\xc4\x94\xfa\x36\xec\xf5\x4a\xfb\xca\x2d\x27\xe4\xf7\x63\x30\x3a\x73\xf9\xea\xbc\x05\x39\xda\x22\xde\x8f\x06\x6d\x08\xd7\x45\xf2\x9b\xc9\xac\x46\x63\xc4\x20\x5b\x6b\x8c\x44\xba\xbc\xd5\x94\x2a\x11\xbf\x2e\xa9\x5a\x0f\xa2\x35\xec\x11\xff\xa0\x7e\x9f\x8e\x48\x2b\xa6\x74\x44\x0c\x1a\x64\x9b\x36\x68\xa9\x55\x12\x55\x20\xa4\x4a\x47\x54\x8d\x10\x5e\x02\x4e\x18\xd0\x9a\x42\x4c\xbd\x86\x48\x1f\xa2\xef\x74\x6c\xe0\x66\x75\x05\x91\x28\xc5\xa8\x58\x87\x67\x44\x5c\x78\x4f\xe1\xd6\x71\xff\x8e\x35\x4a\x6c\xc8\x3d\x18\x99\x58\x5f\x4a\x2d\x62\xe8\x45\x44\x8d\x4a\xc3\x54\xa7\x72\x50\xa3\x6a\xd4\x33\xe8\x18\x65\x1c\x88\x96\xb9\xeb\x91\xb6\x51\x47\xc9\x93\xa8\x4f\x0e\xe6\x5d\xab\x64\x92\xc3\x21\x2a\x96\x73\x76\x43\xe7\xd9\xa5\xb8\x88\x28\xe1\x79\x75\xa7\xe4\x8c\x72\x45\xf9\x05\x5b\x92\x8f\xff\x88\xe6\x4d\x44\x08\x69\xd3\x41\xc1\x70\x88\x72\x3c\xcf\xce\xe1\x1a\x13\x8d\x97\x79\x4e\xe5\x53\x29\x9c\x66\x90\xcc\xbb\x49\x0a\xe8\xb9\xa7\xb7\xc5\x2a\x1a\x3f\x81\xcc\xd6\x9a\x3f\x63\x64\xe8\x91\x53\x7f\x6b\x4a\x7b\x6f\xad\xc3\x8a\x6b\x1d\xef\xa9\x55\xf0\x38\x0f\x95\x95\xd6\x95\x83\x20\x2b\xba\x83\xe9\x97\x24\xe6\xfd\x05\xeb\x2d\x6d\x6b\xcc\x6f\x99\x74\x53\x0b\xe8\x7d\x8f\xd9\xab\xda\x26\x18\xfc\x5a\xb4\xd7\x0f\xbc\xd9\xcf\xb2\x2c\xa9\xca\xa3\x42\x48\x45\xd6\x49\x4d\x9e\x7e\xb9\x59\xd9\x6c\x5d\x26\xe3\xc2\x55\xb9\xef\x70\x54\xd9\xe3\x13\x96\xb9\x46\x09\xc2\xb5\xdf\x00\xd4\x49\x9b\x0d\x61\x38\x1b\xee\x06\x1d\x76\xf7\xdb\x09\xbf\x81\x9f\xb4\x6f\x9d\xf0\x31\xfd\xad\x5f\xc7\x76\xc2\x27\x81\xcf\xd6\x83\xa4\x65\x27\xdc\xda\xa4\x3f\x73\x1c\x25\x9d\x70\x6b\x9b\xfe\x66\xb7\xb2\x9d\x70\x6b\x87\x7e\x2d\x19\x14\x34\xb0\xe4\x60\x8f\xaf\xcf\x82\x27\xbf\xa5\x5d\x54\xc3\x35\xf4\xcd\xac\x89\xf4\x4a\x56\x31\x2a\x32\xcb\xd9\xb6\x45\x7a\xee\x8a\x26\x46\xfe\xa2\x35\x96\x46\x66\x4f\xda\xd4\x75\x0b\xbb\xa3\x0a\x63\xa3\x56\x8d\x6a\x57\xe2\xde\xe9\x12\x6c\x27\x5f\xe2\x16\x26\x4c\xd6\xb0\x9b\x2d\x99\xbe\xbb\xb7\x64\xba\xb7\x64\xfa\x6f\xb1\x64\x52\x0b\xe1\xae\xcc\x99\x9e\x91\xe9\x9b\xe5\x7c\x04\xac\x50\x72\xe7\x11\x99\xa6\x90\x38\xf8\x45\x72\xf2\x65\x49\x12\xd3\xbe\x66\x30\x84\x34\xf6\xaf\x00\x1b\x7b\x41\xc6\x59\x3a\x21\x8e\x31\x90\x38\x99\x69\xbb\x02\x9c\x5d\x60\x5b\x10\x03\x67\xbc\xba\x40\xc0\xef\x11\x3c\xd8\xa0\xe7\x2c\xca\xb7\x94\x95\x2c\x2c\x05\x3a\x37\xa0\x9c\x79\x48\x71\xcc\x20\x49\x81\x52\x3c\x8d\x4a\x72\x8e\x03\xc1\x89\xe0\xe2\xa8\xbc\xc8\xba\x05\x1a\x67\xf3\x85\x90\x56\xa1\x14\x9d\x5b\x59\x72\x92\x64\x51\x49\xd2\x29\x5a\x64\x24\x2d\x03\x76\x1d\x4a\xc9\x3e\xce\x2e\x52\xeb\x4c\x67\xaa\x49\xdc\xe3\xdb\x15\xc3\xf2\x95\xc4\xf7\xb5\x18\x0b\x5d\x4a\x29\xc6\x31\x9c\xa2\x47\x6a\x8e\x63\xbf\x31\x0c\x20\xed\x5a\xda\xf9\x98\xed\x1a\x0c\x18\xea\x17\x5c\x58\xb6\x3b\x60\x73\xd1\x1b\x0f\x5e\x7c\x78\xf9\xf1\xd9\xd1\x4f\x6f\x4e\x5e\x3f\x7b\xf1\xee\xe3\xbb\xe3\x93\x37\xcf\x8f\xde\xfc\xf4\xf1\xf5\xf1\xf3\x17\xda\x19\x4e\x6a\xe2\x60\x26\x07\x8b\x28\x7e\x85\x27\x65\x8f\x7d\x95\xd9\x87\x8b\xac\x38\x94\x58\xe4\x6d\x0e\xca\x8c\x8b\x4b\x5b\x8f\xfb\x01\x7a\xbc\x6b\xde\xf0\xe8\xbb\x25\x0c\xa7\xc7\x1a\x31\x0d\x30\xcc\x89\x17\x87\xdf\x0a\x9c\x3f\x93\x67\x63\xf3\xd0\xbc\x2a\x0e\x5d\xa9\xc3\xc0\xa2\x07\x21\x65\xf6\x12\x7f\x16\xe3\x2e\x96\xa3\xa2\xcc\x7b\xdb\x1a\xfe\x12\xeb\x6a\x9f\x15\x17\x5a\xee\x0d\xf4\x78\xa7\x8f\x86\x3a\x8a\x6c\x74\xbf\x23\xd3\x59\xc9\x8b\x05\x28\x41\x0f\xbf\x32\x3e\xf9\x0e\x7c\xa7\x68\xad\x94\xe9\x6e\x8d\x5d\x71\x3c\x33\xd1\x2a\xb5\x73\xbf\xdb\x0c\x58\x6a\x53\xd6\x58\x7f\xc0\xd6\xfc\x06\x6a\x9e\xa0\x26\x4e\xc7\x24\xf9\xea\x15\xf1\x5e\xe4\xdf\x76\xee\xa4\x71\x67\xfb\x59\x9b\xe4\xd9\xfc\xa4\x9c\x3c\xb9\x9f\x38\xcf\xc4\xf1\x77\x46\x55\x8c\x8c\xbf\x42\x12\x93\x46\xbf\x71\x94\xae\xce\xc8\xec\x27\x47\xd5\x73\xd6\xdd\xbc\xdd\x5f\x17\x6d\xf0\xea\xd1\x53\x84\xba\x5b\x5d\x14\xa2\xee\x66\xf7\xf6\x3c\xaa\x09\x93\xf4\xc4\x4a\x4b\xfd\x83\xc2\x15\x88\x0a\xc6\xf3\x65\x52\x12\x26\x54\x8e\x2e\xd1\xf6\x7f\xe6\x54\x3c\x97\x36\x74\x11\xad\xb9\xc4\x53\x9c\xd7\x6c\x25\xef\x78\xad\x4d\xfb\xf7\xaa\x33\xc2\x6d\x99\x2b\x66\x84\xa3\xc9\xa2\x3e\x8a\x35\xd9\xa2\xdc\x5c\xc9\x1c\x17\x56\xd6\x76\x7f\xb0\xc8\x2e\x7a\x5b\xdb\x4f\xfa\x7d\x13\xa5\x87\x33\x3c\xfe\x84\xc8\xc4\xc0\xa9\x26\x16\x59\x88\x28\xc8\x34\xc5\xf1\x51\xf1\x46\x65\x3b\x8a\x68\x59\xc7\x0c\x7f\xe6\x3d\x36\x91\x21\x88\x16\x0e\x7d\xd0\x76\x69\x4a\x62\x19\x3d\xb2\x5c\x10\x2a\x86\x47\x49\xa1\xac\x96\xed\xd6\x1b\xf1\xe5\xc3\x90\x60\x37\x9b\x01\xda\xea\x07\x68\xeb\xb1\x26\x8f\x6c\xf7\x8d\xdc\x3e\xda\xdf\xdf\xa7\x24\xeb\xa5\xc2\x9c\xb2\x8f\x47\x51\x02\x9d\x42\x4c\x75\xa0\x2e\x3c\x98\xa8\xe9\x12\x11\x53\x24\xd8\x42\xa0\x41\x1e\x8e\x1d\x2c\xc5\x99\x12\x0c\x6b\xda\x95\xc2\x21\x2c\x0b\x32\x45\x4c\x4e\xb7\xe8\x4d\x76\xc1\xc0\x9f\x61\x14\x4b\x81\xd9\x3c\xee\xb3\xde\x68\xba\xcc\x5e\x1f\x5d\x5d\xa1\xce\x66\x87\xeb\x88\x87\x43\x34\x96\x54\x44\x85\x67\x31\x91\xb2\x75\x06\x44\x4a\x36\xd1\x52\xd2\x76\x85\x6c\x71\x7f\x6b\xcd\x33\x9f\x5b\x8f\x0a\xd2\x33\xbf\x6c\x4a\xe7\x24\x5d\xda\xab\xa0\x3b\xb9\xe5\x5f\x17\xea\x16\x95\x6f\xc9\xeb\xb1\x16\x1d\xba\x01\x05\x2d\xeb\x49\xe8\xa4\x96\x86\x7c\xd4\x83\x57\x22\x1f\xde\xbc\x4b\x38\x27\x77\x41\x39\x5f\x07\x65\x9c\xe5\x57\xa1\xcc\xe1\xdd\x8d\x28\x03\x8c\x69\x22\xb1\x89\x22\xde\x9c\x8b\x22\x87\x99\xfb\x2c\xce\xad\xc5\xc8\x61\x06\x31\x39\x27\x31\x8e\x9f\x5d\xd6\xf0\xf0\x9b\x50\x53\x03\x6e\x4e\xee\x1a\x39\xcb\x4a\xec\x9c\xac\x8c\x9e\x93\xdb\xe0\xc7\xbd\x85\x65\x55\x4b\x14\x55\x49\x5c\xea\xc1\x74\x6b\xbc\x88\x9d\xcd\x9c\x8b\x4a\x1c\xf1\xa6\x5d\x14\x39\xf2\x99\x0f\x43\x9e\xe5\x05\xfb\xd5\x2d\x05\xb6\xad\x2e\x7a\xca\xb6\x66\xee\x19\x63\x35\x6c\x56\x9e\x1c\xb5\x77\xb9\x35\x7b\x5f\x82\x27\x0a\x71\x54\x82\xa8\x39\xdb\x38\xa2\x47\x1a\xcd\x31\x7b\xe0\x43\x7f\x59\x22\x18\x87\xa1\x75\xca\x1a\x3c\x98\x77\x0e\xa1\xd0\x46\x80\x74\x65\x39\x2d\xc4\x9f\x58\xa3\x7d\x54\xf5\x52\xf7\x61\x7f\xa8\x1d\x69\x0a\xf2\x2b\xe7\x89\x05\xdc\x52\xf1\xf2\xa7\x5b\x67\xa6\x28\xdc\xdd\xfc\x4c\x45\x66\x77\x72\x07\x45\x42\xc6\x98\x4a\x26\xdb\xe8\x21\x54\xb7\x22\x9d\x37\xcc\x8c\x7e\x0a\xbf\xb3\x09\x5a\x15\xfd\x95\xaa\x00\x67\x93\x91\x47\x44\x8b\x0f\x30\xc4\xf1\x4b\x30\x1b\x73\x8f\x77\xfb\x7c\x0f\x2f\x33\x0e\xdf\x47\x0f\xc5\xa9\xd2\x37\x03\x56\x45\x4c\x3a\x7c\xbc\x1b\xf0\xf6\x57\x9b\x82\x9a\x53\x39\x1b\xbe\xe7\x58\x7e\xa7\xd8\x8f\x8a\x31\x21\x75\xf8\xf7\x1c\xe7\x7f\x43\xcc\x0b\xad\x0e\x68\x07\xda\xe1\x7f\xb5\x09\x50\xee\x69\xaa\x66\xe0\x40\x39\xb0\xa9\x98\x82\x4a\xde\x5e\x81\x72\x59\xa1\x8b\x6d\x9f\x03\x9b\x15\xa4\x29\x03\x77\x9d\xcd\xcf\x1d\xb4\x81\xf8\x19\x07\xd0\xce\x7e\x4b\xb3\x82\xdd\xcd\x00\xe9\x49\x55\x3e\x03\xbe\x08\xd3\x0f\xed\xac\x19\x5a\xdf\x81\x0d\x03\x2b\x36\x74\x52\x1c\x38\x7d\x81\x87\x55\x19\x4e\x29\x86\xcc\xd0\x4d\x72\xfb\x91\x65\x49\x68\x27\x38\x50\x54\x02\x09\xed\x04\x1d\x4a\x8a\x65\xa1\x9d\xe0\x42\x9d\x38\x60\x27\x5e\x38\xbd\x51\x95\xe2\xa9\xcf\x05\x3c\xf1\x43\xea\x83\x55\x29\x1e\x38\x1d\xdb\x5a\x92\x0b\xe9\x9b\x1e\x37\xc7\x2d\x67\x4e\x90\x9e\xe6\xc2\x72\xaa\x0f\xbd\xeb\xee\x5a\x5c\xeb\x9a\x97\x43\x9d\x70\xeb\x49\xd0\x31\x2f\x95\x3a\xe1\x36\x58\x30\xc0\xc2\xe8\x84\x5b\x5b\x41\x47\xbf\x9a\xea\x84\xe6\xe7\xf5\x59\xb0\xb5\xf9\x3b\xbb\x74\x39\x62\xb6\xf1\x35\x3e\x88\x48\x5a\x56\xb9\x20\xe2\xb7\x57\x24\x2d\x99\x77\x16\xfa\x63\x57\xfe\x3a\x53\x89\x3b\xda\x6f\xcb\x79\x0b\x49\x4b\xe6\xba\x85\xa4\xe5\xe3\x5d\x09\xf6\x44\x55\xb4\xfd\xcd\xe3\x8a\xba\x28\x7c\x83\x2b\x23\xfb\x68\xf8\x15\xbd\x71\x01\xb8\x6d\x86\x70\x94\x96\x2b\x5a\x5e\x18\x25\x6a\x0c\x2e\xa0\xb9\x9a\x92\x37\x32\xaf\x20\x69\x29\x44\xc5\xa7\x37\x72\xe9\xc2\x7a\xd5\x6c\x06\xb1\xd5\x2a\x8a\xdd\xbd\x1d\xc4\xbd\x1d\xc4\x9f\xd7\x0e\x02\x29\x43\x08\x26\x2a\xdd\x91\x0d\x44\x0b\xd3\x06\x9b\xd5\x33\xd3\x85\x0c\x0c\xd2\x95\xe7\x8e\x81\x47\x42\xbd\x98\xe1\x54\xbe\x57\x0c\x98\xed\x37\x15\xc0\xa5\x03\x07\x21\x59\x0e\xbd\xb6\x11\x96\xfa\xdb\x7e\x9e\x08\x9c\x54\xc8\x8f\xec\xff\xab\x2b\xd4\xed\x6a\x7c\x36\x13\x2f\x17\xd8\x8f\x3d\xed\xa9\x21\x49\x79\xeb\xad\x3d\x7e\x4c\x71\xa9\x9b\xfc\x82\x01\x79\xb7\x10\x0f\x41\x81\x97\xd0\x4a\x0c\x6b\x77\x25\xdf\x33\x63\x57\x53\x8a\x16\x6a\x26\x55\xab\x5e\x19\xea\x89\x3e\xf6\x0d\x83\x76\x40\x8f\x6e\xd0\x6e\x37\x52\x6b\x8a\x06\x56\xfe\xc6\xb1\x43\xbf\x7e\x6c\x8d\x8c\x71\x8e\x29\x31\x89\xf5\x60\xba\x65\x61\xe4\x1e\x93\xc9\x04\x83\x41\x32\x43\xb9\x75\x2e\xb9\x90\xef\x42\xf4\xe3\x88\x40\x09\x9f\x25\x61\xbb\x9c\x7a\x0f\x21\xe6\xd1\x85\x6e\x87\xbe\x7e\x44\x0b\xc6\x61\x64\x2f\xaa\x51\x79\xe1\x7f\x33\x6b\xd2\x5d\xe5\xad\x9e\x22\x48\x49\xaa\xab\x60\x34\x9b\x8f\x48\xea\x7a\xb8\x29\xb3\x29\xa6\xdc\x9d\xd6\x80\xa7\x03\xb6\xa8\xa2\xc5\x02\xa7\xb0\x96\xa2\x94\xbd\x81\xb0\xb0\xcb\x6b\x6b\xba\x87\xe1\x8c\x69\x46\xc6\x94\x3d\x89\x5e\x35\x17\xe6\x17\xa8\xd9\x84\xc3\xc2\x3e\x54\x8b\x5a\x31\xbc\x26\xbd\x5f\x1d\x5a\xa5\xde\x82\x5d\x99\xec\xa1\x66\xec\x8e\xa3\x24\xe1\xf8\x15\xd7\x38\x6c\x44\xb3\x48\x2d\xdd\x82\xfc\xca\x9d\x0b\xc2\x75\xdd\x2c\x2a\x02\xfa\xbf\x20\x34\x70\xff\xeb\xb9\xb7\xd3\xf1\x2d\x6d\x41\xfd\x3a\xd3\x5a\xd4\xf8\xbd\x33\xf9\x16\x2e\x5f\x15\xeb\xfb\xfb\x20\x5d\x4c\x48\x6a\xbd\x55\x6a\x42\x82\xf2\x5a\xc4\xab\xe2\x37\xcc\xb6\xd2\x80\xe5\x1e\x14\xcf\xaa\x8f\xfe\x4c\xe3\xeb\x6a\x68\x5a\x2c\x33\xa3\xf6\xba\x41\xaf\xc3\xa8\x95\x0b\x80\x3e\x7a\x8a\xba\x5d\x14\xb6\x33\xc8\xd2\x50\xe6\x35\xcb\x5a\x01\x6f\x94\xf7\x33\xe5\x84\x94\x19\x7d\xcf\xbd\x94\xfe\xc2\x8f\x33\xb1\xf7\x88\x5b\xe1\x48\x67\xf8\xd1\x5c\x27\x32\x20\xf1\x5a\x2c\xaa\xc6\xbc\x28\x04\xbf\x4a\x36\xfe\x7c\xfe\x99\xe4\xf2\xda\x43\xec\xca\x0f\x55\xd0\x1d\x9f\xb0\xde\xea\xa8\x33\xb6\xb5\x0a\xdc\x69\x9b\x92\x1f\x79\x22\x21\x12\x97\xf0\x2d\xb0\x88\xe7\x8b\xf2\x52\x57\x09\xb6\xd8\x44\x1b\x57\xa1\x49\x8f\x1a\x7b\x0a\x41\xfa\x58\x01\x37\xc2\xe3\x54\xa5\xaf\x29\x2f\x26\x6a\x07\xc2\xab\x6c\x1a\x83\x71\xb1\xb2\xe1\x11\x0b\x6e\x32\x0e\xf5\x18\xaf\xda\x3f\xd4\x2b\x52\x94\xce\xcb\xbf\x53\x63\x34\x67\x1e\xa7\x50\xb5\xa3\x57\x35\xbb\xdb\x8b\x7c\x17\x24\x6e\xea\x97\x8b\x98\x59\xb6\xf2\x77\x70\x52\x15\x59\x66\xa5\xf6\xd6\x95\x15\x16\xc2\x11\xf3\x3b\x84\x8c\xb7\x7d\xf2\x09\x21\x07\x35\x9f\x15\x19\x7b\x9b\x5c\x8f\x6c\xfb\xaa\x58\x90\xf6\xed\x97\xed\x2c\xc4\x6c\x1e\xed\xeb\x3d\x56\xb0\xfa\x30\x36\xf6\x5d\x45\x3f\x7f\xad\xe5\xbe\xd0\x62\x90\x4a\x04\xea\x65\xfa\xab\x5b\xf9\x6a\x6e\x38\x14\xd3\x8d\xcf\x71\x7e\x59\xce\xc0\x17\x89\x56\x8f\x8e\x1d\xd7\xf1\x94\xb0\x48\x73\xf0\x63\xbc\xd4\xf5\xdf\x50\x48\xdf\x4b\x77\xda\x84\xab\x74\xbe\x0e\x50\xb7\x2b\x94\xef\x35\x4a\x8a\xb7\x6c\x96\x2c\x9d\x9e\x54\xdf\x5d\x9f\x05\x5b\xad\x62\xed\x7d\x45\x9d\x1c\xdc\x46\xd7\x2b\xe5\x72\x0a\x52\xa1\x95\x13\x66\x66\xf4\x7f\xa6\x2a\x83\x5f\xbb\xea\xe7\x99\x96\xbc\xa3\x7f\x58\xba\x39\x9a\xc6\x94\x73\xf4\x97\xd0\xce\xd1\xdf\x4f\xb4\xea\x34\xfd\x9c\x53\x63\x0b\x0d\x9d\x73\xf7\xbe\x8a\x8a\x8e\x16\x5e\x45\x47\xc7\xe0\x6d\x25\x1d\x4d\x5d\x51\x4b\x67\x16\xa9\x51\xd3\xb1\x16\xeb\xca\xde\x44\x51\x47\x71\x5b\xa1\xa8\x6b\xe7\x28\x9f\x77\xab\x85\xa2\xae\x55\x34\xaf\xaf\xf5\xb8\xce\x73\xfb\xb7\x0a\x79\xb0\xe2\xab\x10\x88\x28\x61\x93\x08\x4b\x5f\x91\x48\xec\x42\x35\x64\x22\xda\xad\x2f\x7f\x23\x9d\x2e\x93\xa4\xda\xbc\x99\xf3\xb4\x77\xb7\xaf\xe5\xe4\x28\x5b\xd0\xdd\xdd\x47\x1f\xa9\x7d\xbf\xe3\xe1\xc3\x9a\x8b\x5b\x52\xb4\xf7\x6d\x3b\xc6\x79\x19\x91\xd4\xef\xdf\xd6\x41\x24\xbb\x4d\x6a\x20\x6a\x06\x34\x30\xd3\xeb\xc9\x9a\x17\xb1\x32\x1a\xbd\x41\x94\x38\x9f\xd3\x23\x3f\x99\x40\xcd\x66\xbf\x63\xee\xb5\x16\x4d\xc9\x39\x4e\x85\x49\x8b\x79\xa4\xae\x72\x97\x6b\xd9\xbf\xb0\x63\xb6\xb2\xb8\x05\x2c\xb3\xca\x9d\x76\xfd\xf6\xb7\x3a\x44\xfb\x25\xc2\x9c\xd3\x76\x4a\xaf\x70\x9c\x9d\xe3\x3c\xbf\xc8\x49\x59\x62\x30\xf7\x62\xbd\xea\xa0\x0d\xe8\x7d\x6b\xdc\x5d\x80\x96\xbd\xd0\x1f\xf2\x83\x15\x84\x3a\x8a\x92\x94\xa3\xb0\x74\xfd\x0e\xdb\x6f\xed\x5b\x21\xd3\xd5\x4a\x5a\xcd\x29\xad\x6d\x05\xde\x3c\x2e\x04\xfc\x18\x1c\x0e\x41\x15\x1e\xcd\xe9\xaa\x00\xaf\x87\x5c\x9b\x45\xc7\x4b\x39\x01\x66\x77\x0c\x09\xf9\x84\x51\x84\x0a\x92\x4e\x13\x2c\xfd\x70\x01\xe4\xc0\x30\x89\x06\x0a\x66\x6e\x66\x98\x5b\x0e\xd6\xda\xd5\x15\x3a\xed\x9e\x6e\x9d\x75\xcf\xfa\x52\x18\x6c\x70\x03\xc0\xbb\x67\xe2\x9d\x7e\xe9\xae\x0d\x2b\x44\x77\x66\x03\xc5\x50\x01\xb6\x0a\x5b\x01\x7a\x04\xf6\xd8\x9b\xd0\x97\x2d\xdd\x11\x8d\xea\x90\x23\xc8\x0a\x47\x0d\x81\x70\xed\x50\x75\x5a\x10\x0e\x1d\x1e\x0a\x40\xd5\xc0\x70\x88\xa2\x24\x41\xa3\xa8\x20\x63\xe6\xff\x00\x1e\x0b\xec\x6c\x73\x05\x4e\x92\xd1\x93\xb1\xe8\x4d\x80\x76\xb6\x9b\x8c\x4e\xcc\x85\xcd\x39\x9a\x38\x81\x0b\x5d\x24\xc2\x53\x10\x20\x21\x28\xd4\xe9\x59\x07\xed\xff\x00\xeb\x53\xa5\xed\xb2\xc4\x5a\x65\xda\x81\xa8\x6d\x55\x0e\x30\xc3\x95\x3d\xab\x59\xed\x7a\xab\x95\x34\xab\xdc\x7e\x19\x0e\x61\x1c\xa2\xdb\xb3\xb6\x51\xad\xc8\x83\x07\x48\xff\x3e\xd5\x7e\x6b\x2e\xe0\xce\xc4\xae\x2b\x23\x63\x0c\xa7\x37\x9a\x1b\xbe\x7c\xeb\xa6\x46\xcc\x82\x39\x37\x7c\xc2\xcc\xa9\xd1\x3c\xae\xdd\x72\x66\xac\x7e\xd5\x4c\x8c\xd6\xe6\xd7\x9e\x97\xbb\x9c\x18\xd3\xf5\x89\x62\xa4\xda\x4c\xc0\xd9\xa8\x03\xb6\x08\xdb\x0c\xe9\xec\x90\xd4\xe1\xc6\x0a\x5b\x7c\x2a\xb6\x76\x25\xe0\xf6\xd9\xe9\x0e\x07\x15\x69\x0c\x44\x42\x6c\x9d\x59\x09\xea\xdb\xdd\x1d\x00\xab\x37\xd8\x1e\xf4\xb1\xf0\x21\x36\xef\x09\x5a\x63\x77\x34\x91\x64\x82\x7a\x5a\x96\xc6\x21\x6d\x7e\x7c\xc3\x89\x05\x86\xed\x7b\x0d\xb1\x55\x33\xe5\x7c\x93\x10\xa7\x6a\xdf\x3c\xc3\xbc\xf9\xa6\xba\x23\xe3\xef\x39\x13\xce\x3f\x3b\xc6\xbc\x1b\x15\x9d\x9a\x95\xeb\xd3\xad\xbc\xaf\xb5\x9a\x67\x99\xc1\x86\xc2\xf3\x2b\xe7\xd7\xf0\xa2\x58\xb9\xdb\x73\x6f\x45\x49\x54\x94\xe8\xf4\x8c\x0a\x13\xac\xde\x1b\x4d\xfb\xba\x7f\xde\xe5\x1c\x80\x9c\x85\x1c\x1f\x4b\x70\xa0\x51\x2f\xa1\xe0\x53\xd2\x40\x1b\x22\xa9\x31\x8e\xd5\x8e\x30\x92\x03\xdb\x37\x4d\x68\x74\x89\x62\x3c\x89\x96\x09\x28\x42\x8b\x25\x95\x53\xe5\xc6\xdc\xe1\x6e\x6a\x02\x1e\xe6\xd1\x9e\x45\xe3\x18\x75\x03\x06\xac\x76\xc4\x15\x45\xe1\x96\xa7\xb7\x4a\xa3\x7a\xe1\xab\x5d\xe8\x88\xb5\x25\x52\xd8\x6b\x04\x28\x9e\x93\xf2\x69\x87\x52\x7c\x80\x3a\x74\x11\xd0\xff\xce\x3a\x67\x8a\xda\x39\x84\x96\x06\x85\xd2\x65\x62\x3f\x7b\xd0\x66\xb3\x15\xda\x6c\x07\x73\x56\x7f\x1b\x16\x82\xeb\xa4\xca\x59\x09\x6c\x6f\xe0\xce\xf2\xd8\xac\x17\x70\xc3\x4b\x87\x63\x8c\x97\xfe\x0b\xab\xde\x22\x62\xce\xad\x7a\xff\x3e\x65\xa7\xf1\x7f\x9f\xf5\x9b\x45\x04\xae\xbc\x95\xde\x1e\xaa\xef\x1d\xac\x30\x16\x02\xba\x3d\xeb\x10\x6f\x4f\xdd\xbb\x2c\x0b\x67\x9e\x4b\x0b\x7e\x8f\x6e\x6f\x0c\x5e\x7f\xd4\xe6\xad\x0c\x77\x85\x2a\x9c\xa0\xda\x6c\xa1\xc1\x1b\xac\xb4\xff\xd6\x8d\x89\xf7\x50\xe5\x9f\xdf\x31\xaa\xeb\x57\x16\x27\x13\xdd\x9f\x2c\x67\x65\x4e\x21\xf9\x32\xf9\xf4\xcc\xe7\x44\x7c\xb0\x58\x16\xb3\x9e\xe3\x99\x54\xbc\xd4\x16\x6e\x46\xdd\x9a\xe9\x58\x5c\x9f\xeb\xe7\x3e\x07\xa0\x7a\x4b\x9a\x1f\xcf\xde\x79\x80\x74\xff\xb2\x96\x7b\xd2\x5b\x39\xf5\xe5\x13\xa8\x3b\xf3\xbd\xf5\xfc\x41\xd7\x1d\xa9\x83\x23\xfe\xb7\x9f\x3f\x9f\x47\xd6\x06\x4f\xac\x95\x13\x41\x67\x13\x5c\xa5\xd6\xcc\xc7\xca\xb3\xb1\xe6\xdc\x11\x5a\xba\x23\x63\x49\x6a\x1e\x6d\xdb\xf8\x04\x65\xf7\xa3\x93\x3c\x9b\x7b\xcd\x0d\x18\x94\x8f\xb7\x8c\xec\x07\x3b\x96\x81\x90\x61\x19\xb4\xc2\x83\x29\xc1\xd4\x58\xcb\x2d\x58\x14\x1f\x88\xce\xa2\x0c\x7f\x9a\x0d\xac\xea\xab\xf0\x2a\xd8\x9b\xf4\x1b\x4b\x26\xe8\xf2\x27\x3e\xd0\x3d\x21\xe8\x70\x74\x3d\x44\xdb\x60\xfc\xd0\x17\x1e\x9d\x39\xf2\xaa\x16\x51\x6d\x9d\x7a\xf3\x4e\xc5\xbe\x15\x05\x05\xde\x97\xec\x8e\x5d\x2f\xbd\x81\x76\x98\xd3\x7b\xb6\xdb\x16\x14\xa4\x40\xd1\xa4\xc4\xb9\x5c\x24\x7a\x7f\x6f\xb4\x56\xfd\x65\x7c\xbe\xbb\x15\xe7\xa8\xf0\xd9\x8d\x6a\xb1\xc7\x43\xc7\xbc\xa9\xaa\x5f\xf7\xeb\x51\xe9\x46\xda\x8e\x79\x53\xcb\x68\x5a\x72\x1a\xf4\xb0\xbe\x6f\x14\x76\x63\xbf\x1e\xa6\x15\xa3\x32\x1d\xce\x6a\xd3\xbe\x81\xc8\xdd\x72\xad\x3f\xc4\x1e\xa2\xff\xb5\xa4\x7e\x61\x90\xda\xf2\xef\x0f\x45\xfc\xf7\xb4\xaf\xfd\xfd\x2e\xb4\x8f\xbc\xa4\xaf\x07\x68\xbc\x29\xe9\xdb\x61\xc4\x56\xdc\x54\x1c\x62\xb5\xeb\x6f\xb7\xb3\x98\xbd\x58\xa5\x7e\x3e\x7f\x5e\x7a\x4b\x1c\xfa\xf2\xaf\xbf\xea\x25\xbc\xe0\xb7\x7e\xae\x91\x6a\x53\xf7\x7b\x68\x0b\x6d\x98\xbd\xeb\x33\x9f\x4c\x2c\x92\x98\x67\xea\x99\x07\x62\xeb\xd2\xcd\x78\xb0\x5d\xe3\xcf\xde\xc0\xb5\x65\xf1\x65\x70\xb1\xb5\x15\xc7\xa6\xcf\xb9\x5c\x59\xdb\x7d\x53\xad\xea\xbd\x48\xb4\xba\xde\x78\xc1\x5b\x7d\xb5\x2b\xdf\xc4\x5d\x9f\x05\x5b\xbf\x77\xe8\xfd\x93\xe6\x67\x6f\xcb\x9a\x77\x6f\xdc\x13\x09\xfc\xcf\x6c\x5d\x96\xea\xe9\xdb\x52\x7b\xfb\xb6\xd4\x1f\xac\x2d\x3d\xaf\xdf\x96\xf2\xf9\xdb\x52\x7b\xff\xb6\xd4\x1e\xc0\x2d\xcd\x17\x70\x4e\x8d\x2d\x2c\x6c\x1c\xff\x28\x5f\xf1\x11\xdc\x89\xf7\x15\xdc\xc9\xea\xcf\xe0\x4e\xda\xbe\x83\x3b\x71\x1f\xc2\x9d\xdc\xc1\x4b\xb8\xe5\xad\x9f\xc2\x9d\xb4\x7e\x0b\xf7\x7b\xc7\xf5\x3f\x69\x61\x71\xb6\xac\x33\x39\x13\xae\x55\xd8\x0f\x4e\x9c\x9a\xd5\xd9\x52\x37\x3b\x5b\x1a\x56\x62\x4b\x9f\xe1\xd9\x52\x59\x9e\x2d\x75\xd3\xb3\xa5\x6e\x7b\xb6\xb4\x8c\xcf\x3c\xf5\xb6\x59\x1c\xbf\xa9\xfd\xd9\x89\xdf\x00\xed\xe4\x06\x16\x68\x27\xad\x4d\xd0\x4e\x3c\x36\x68\x76\xe9\x9b\xad\x91\x1a\x33\xb4\xb6\x8b\xa4\xbd\x21\xda\xb7\x6d\x56\x49\x77\x59\x60\x50\xcc\x8e\xcb\x2e\x0b\xc8\x37\xcd\x10\x4e\xcf\x51\x9c\x61\xb0\x56\x80\xd7\x81\x51\x1a\x83\x0f\x5b\xf4\xcf\xd7\xaf\x5e\x96\xe5\xe2\x1d\xfe\x7f\x4b\x5c\x94\x6b\x20\x98\x5d\x2e\x70\x36\xb1\x72\x98\x1f\x1b\xf9\x7e\xa3\x2b\xf0\xc2\x1b\x1e\xd8\xd0\xe8\xcb\xf5\xde\x9a\x11\x2c\xb2\x12\xd2\x4c\x00\x49\xfd\x97\x62\x46\x77\x1f\x32\x4d\xb3\x1c\x87\x09\x49\xf1\xda\x35\xb3\x58\xa5\x78\x68\xe5\xed\xfe\xfe\xe5\xec\xfd\xcb\xd9\x3f\xf1\xcb\x59\xf6\x6a\x96\xdb\xb0\x19\xcf\x66\xd9\x86\x83\x6e\xf6\x7a\x96\xef\x7d\x27\x25\x49\xa0\x4e\xa6\xcf\x84\xb5\xc3\x9e\x27\x39\x60\xa4\xbc\x94\x2c\x51\x15\x19\x27\x51\x51\xa0\x53\x28\x72\xc6\xbb\xc9\x32\x14\x13\x66\x55\xad\x0d\xe1\xde\x08\x56\x29\x57\xae\x52\x0e\x82\x6a\x9c\x59\xb7\xf7\x73\x0e\x90\xb4\xa6\x93\x37\x47\x1f\xde\xd3\xb3\x35\x4c\x42\xf7\x02\x93\x2e\x23\xcd\xee\x27\xed\xf7\x6b\xed\xf7\x4f\xda\xef\xe2\xd7\x68\x94\x89\x8f\x09\x49\x53\x7c\x29\xbf\xf0\xbc\xcc\xe0\x29\xa3\x48\x59\x90\xb1\x99\x90\x46\xa9\x99\x30\x27\xe3\xdc\x4e\x49\x12\xe2\x14\x32\xe0\x0d\x50\xf1\x61\x14\x99\xe6\x51\x1a\xcb\xa1\x18\x59\x3f\x19\x5f\x1f\x8c\xaf\xb7\xc6\xd7\x0b\xe3\xeb\xff\x8c\xaf\x7f\x19\x5f\x6f\x8c\xaf\xe7\xc6\xd7\x3f\x8c\xaf\x13\xf6\xb5\x76\x56\xed\xba\x86\xce\xd1\xdb\x83\xe7\x74\x8a\x43\xb4\xb3\x1d\xc8\xc4\xf7\x47\x3f\xbd\x39\xf8\x70\xf2\xee\xc5\xc7\x57\x2f\xde\xfc\xf4\xe1\x65\x88\x76\x55\x26\xcc\x6a\xa8\x7e\xaa\x9c\x0a\xca\x09\xd1\x17\x64\x25\x28\x3f\xea\x90\xf1\xf1\xf9\xf1\xcf\x6f\xd0\xb5\xaa\xe9\xed\xf1\xab\x57\x14\xfa\xc3\xd1\xeb\x17\xc7\x27\x1f\x42\xb4\xb5\xb9\xb9\x39\xe4\x3d\xe4\x37\xde\xcf\x92\x6c\xfc\x29\x44\x5d\xca\x3a\x8b\xb2\x6b\xe4\x1d\x8c\x21\x94\x71\xa8\xde\x36\xb2\x07\x18\x74\x3f\x6f\xf2\x7d\x72\x1f\x0a\xe3\x7e\x23\xfb\xab\x6f\x64\x6b\xd2\x05\x44\x31\x8b\x76\xee\xca\x03\xc4\x61\x7e\xb9\x28\xb3\xbf\xbf\xd7\x37\x87\x31\xa4\x3d\x52\x11\x30\x68\x83\x5e\x80\x21\xcd\xe9\x7a\xa3\x3b\xb9\xee\x1b\x80\xe2\x0a\xfd\x81\x2a\x4f\x42\x0f\x1e\x88\xdc\x81\xf0\x17\xc1\xc4\xe4\x19\xfe\xdc\xb5\x5f\xd1\x19\x9e\xbf\x7e\x40\xdb\xb4\xb4\xed\xfd\x78\x5b\xb8\x8b\x34\x8b\x23\x71\x19\x2e\x2f\xf8\x2d\xff\xec\xc8\x7a\x6d\xc7\x40\x05\x8e\x68\xe7\x06\x2f\xf1\xe7\x01\x68\x2f\xb9\xe7\x5e\x9f\x8d\x11\xc5\x8a\x18\xb6\x6a\x9d\x9d\xe8\x98\xfa\x2d\x44\xdb\xdf\x3c\x66\x25\xb5\xc7\xc9\xe2\xcd\x19\x65\x79\x12\xc7\x9d\xf0\x9b\xef\x82\x8e\x89\xf2\x4e\xf8\x64\xf3\xfa\x2c\xd8\x6e\xe5\xf3\xe9\x9e\xef\xdd\xf3\xbd\x3f\x2f\xdf\x53\x6c\x8f\xbd\xf3\xbf\x03\xbe\x67\xc9\xee\xab\x8b\xee\x1e\xc9\x5d\x14\xf4\x09\xee\x2b\x45\x1b\xb2\x79\xed\x60\xc8\xd9\xbd\x0a\x47\x34\x79\xa2\x03\xd0\x6f\x29\xc2\x2f\x53\x52\xbe\x8e\x16\x52\x5c\xec\x0a\x89\x3a\x64\x3c\xa8\xbb\x29\x64\x4d\x2a\xb5\x87\x8a\x2d\x76\xb7\x0c\x39\x3f\xd4\x32\x36\x37\x65\xa1\xff\xad\xc9\x1b\x45\xa3\x51\x34\xc5\xb2\x25\x3d\x4f\x13\xfe\x43\x3b\x6f\xee\xa9\x53\xcb\x7e\x5d\x9f\x9d\x64\xe7\x38\x89\xc6\xa2\x59\x3b\x5b\x9d\x31\x42\x5f\xf6\xd4\x5f\xb9\x06\xf1\x53\x23\x44\x31\x8b\xd2\x34\x4b\x8d\x71\x9b\x10\xea\x5c\x13\xd6\x40\x34\xb4\x02\x27\xab\xd0\x03\xa1\xa3\x52\x9d\x97\xc2\x7a\xa0\xa6\x9a\xf8\xd9\x2d\xf4\x02\x19\x95\xc9\xf3\x98\x3d\x36\x0f\xa0\x7f\x88\x26\xa0\x41\xae\x1e\x38\x0d\xf4\x93\x09\xeb\x03\xd5\xe7\x1a\x4e\x7d\xb5\x15\xeb\xfd\x6d\x55\xb7\x5e\x7d\xdb\x02\x5a\x99\x72\x85\x32\xb4\x98\xdf\xd8\x4a\x39\x62\x58\x44\x31\x37\x25\x05\x53\xcf\xcf\x0b\x3c\xa6\x9b\x97\x34\xcf\xd7\x8d\xae\xb8\xf7\x14\x9f\xe5\x94\xaa\x62\x84\x29\x5c\xcc\x23\x72\x59\x36\x58\xe3\x59\x94\x47\xe3\x12\xe7\x85\x50\xf1\xc3\xbd\x3c\x2f\xad\xed\x23\xde\x36\xc8\x34\x0d\x34\x5b\x68\xb4\xb9\xe6\x77\xfb\x41\xa6\xb3\x12\x09\x8f\xb4\x96\x77\x5f\x3e\x06\x43\xda\x64\x20\x01\xf4\xae\x08\xa0\x1d\x8f\x8f\x21\x66\x21\x02\x30\x10\x94\x16\x5e\xab\xca\x1b\xe2\xad\xfe\xe0\x97\x8c\xa4\x10\xac\x01\x3d\x85\x3a\x50\x88\x3a\x9b\x9d\x3e\xda\xe0\xc0\x15\x86\x6f\x37\x9e\x0b\x08\xd8\xf3\x67\x9f\x0c\x18\xc4\x8a\xb3\xc1\x7b\xb8\xc1\x3c\x2e\xdf\x74\x5e\xaa\x0c\x11\x4d\x47\x34\xb0\x75\x82\x19\x22\x04\xf3\x70\x7d\x4c\x5b\xf3\xc2\xbc\x35\xd7\xcc\x0a\x49\x69\x25\x7e\x64\xe9\xfe\xa8\x3d\x8e\x92\x68\xe3\xca\xec\x90\x79\x20\x39\x61\x5b\xbb\x14\xe9\x67\x2c\xde\xf3\x70\x88\x7e\x24\x69\x8c\xd8\xe3\x2e\xde\x51\x19\xaf\x99\x4a\x14\x9d\x8e\xba\xc9\x07\xdb\x97\x00\x42\x48\xcd\xf0\x67\x61\xc2\x2c\xcf\x5c\x34\x8d\x9d\x7a\xe8\x89\xa3\xfa\xac\x44\xab\xd9\xd6\xdf\xbd\x80\x71\x0d\xb7\xa9\xd9\x43\x64\x63\x7f\x5b\x07\x17\xb1\x90\x75\xdb\x0e\xd5\x54\x8f\xd0\x76\x78\xe8\x0b\xd9\xc2\x04\xf5\x58\x91\xfd\x7d\xb4\xd9\x37\x4e\x69\xa3\x1c\x47\x9f\x14\x28\x1d\xe5\xc6\x3e\xe2\xaf\xca\xe9\x0c\x1e\xce\xa2\xfc\x30\x8b\x31\xd4\xe0\x3d\x84\xd1\xc9\x16\xe6\x38\x45\x99\xb7\xa3\x10\x36\x69\x2b\x91\xc8\x01\x2d\xf2\xdb\xd1\x08\x34\xf7\xdf\x43\x24\x37\x99\xf9\xa2\xac\x7a\x9d\x6e\x4e\xb6\xc7\xc7\x7c\x6f\x91\xe3\x09\xf9\xcc\x82\x68\x6d\x7e\xee\xd3\x59\x00\xae\xe1\x77\x6f\xcf\xa3\xbd\x55\xcf\xbe\xd7\x76\x19\x8e\xa0\x51\x02\xdc\xbc\x36\x98\x80\x2f\xca\xa7\xe1\x6b\x9f\xbb\x5d\xe7\xdd\xd0\xa9\x82\x52\x3c\xc7\x3c\x9b\x7d\x58\x0e\xdc\x6c\x9b\x2d\x07\x31\x23\xb4\x25\x45\x1d\x93\x2c\xb7\x4d\xe8\x8a\x32\xaf\x8a\x88\xaf\xcd\x28\x85\x1a\xf3\xb9\x39\x28\x7b\xe4\x66\x2b\x1d\xac\x13\x79\x70\x70\xc3\x6b\x9b\x02\xa1\xfd\xdd\xd8\x47\xa9\xd8\x17\xbe\x47\xdb\xe8\x29\x3d\xd9\xa0\x0d\x44\xf7\x83\xd4\x47\x13\xdc\x85\xfc\x0c\x7f\xbe\x4b\xd2\xb0\x62\x0e\xd8\xb4\xd1\xc0\x1a\x7e\x33\xe2\x70\x78\x86\x46\x1d\xbf\x0d\x05\xfc\x6e\xd3\x6a\x79\x2c\x9d\x2c\x93\x44\xa2\x61\x88\xcf\x71\x5a\xb2\x87\x02\xc0\xf2\x7f\x29\xb2\x14\x45\x23\x62\xf3\x78\xe1\x36\xf1\x43\xf6\xe3\x32\x49\xec\x37\x94\xe2\x31\x01\x2d\xfd\x88\x95\x76\x1f\x43\xb1\x86\x9d\x76\x15\x63\x77\xdb\x30\x04\x29\x5a\xb9\xae\x3a\xa5\xdf\x03\x30\xa1\x20\x69\x8c\x3f\x1f\x4f\x7a\xdd\x5e\xb7\x0f\xbe\x21\x1f\x6d\x79\x9e\x43\x4a\x78\xc7\x4e\xb0\xbc\x5c\x60\xde\x1c\x00\x01\x15\x99\xfe\xcc\x7a\xa4\xff\x45\x84\x10\x1e\x50\xf8\x3d\x74\xcd\x45\x31\xd3\xf2\x4f\xb6\x82\x36\x50\xb7\x47\x67\x4e\xd6\xbe\x81\xba\xfd\x6e\xab\xb5\x17\x93\x62\x91\x44\x97\x6c\x5e\xc0\xc7\x68\x5a\x52\xd9\x56\x62\xc3\x7e\xb3\xf6\x19\xb2\x9f\xb3\x62\x75\x2f\x5c\x69\x6d\xe6\xe4\xfb\x97\x97\xd1\x03\xba\xa5\x59\x14\x83\xa7\x03\x11\x6f\xf1\xb2\xc7\xcd\xea\xfa\xe8\xd1\x0f\x32\x51\x4e\xab\xdb\xb7\xda\x87\xcf\xd2\x66\xd3\x99\x59\x03\xcd\x1c\x8c\x4d\x36\x7a\x6a\xbf\x69\xe5\xef\xc1\xe8\x9a\x51\xce\x46\x86\x43\x35\xd0\xec\x1c\xe7\x49\x16\xc5\x38\x96\x8a\x60\xcf\x9a\xd0\x07\xf0\x41\x11\x49\xd5\x9b\xc6\x21\xfa\x70\xfc\xfc\x38\x44\xf3\xe8\x13\xa8\x86\x49\x7a\xbe\x4c\x52\x9c\x47\xa3\x04\xdf\xe5\x00\xd5\x69\xc0\x7e\xbd\xbb\x85\x1e\x21\x2d\xbb\xdf\x1f\xe4\x78\x91\x44\x63\xdc\xeb\xa2\x2e\x38\x75\xa3\xa7\x85\x8e\x19\x24\x32\x4b\xcf\x71\x5e\x16\x2a\xe4\x26\xc8\x7d\x31\x1e\x93\x79\x94\xd8\x4c\x96\xa4\x7e\x66\x5f\x66\xcf\x59\x01\x97\xf2\x6a\xc3\x67\x9a\x6e\x0d\x99\x80\xc7\x6b\x6a\x0c\x00\x59\x66\x6e\x7c\x4c\x19\x7e\xa6\xcd\x18\x1b\x65\x5b\xca\x13\xef\x6a\x5c\x5a\x5d\xf5\xc1\x59\x53\xa1\x25\x75\xc7\xe7\x09\xcd\xcd\xd5\xa7\xe6\x8e\x62\x1c\xf6\x19\x40\x82\x8b\xe2\xc3\x2c\x4a\x7b\x9b\xe0\x44\xf6\x11\xb3\x3a\xe7\xd6\xfb\x9c\xb0\xb6\xfa\x10\xbe\x55\xcb\x31\xb0\x78\xb0\x04\x37\xcd\x1c\x95\x51\x7a\xc9\x1d\xef\x70\x77\xa4\x69\x35\x5a\x07\x1c\xaf\x07\x69\xcc\xd4\xff\x8c\x86\xc8\xe4\xb2\xe0\x8e\xd4\x0b\x34\xc2\x93\x2c\xc7\x03\x87\xae\x5e\xf2\xa3\x43\x3d\xee\xaf\xf8\x1e\xd4\x40\x5a\x2f\x61\x9f\x37\x90\x2f\xd7\xef\x43\x6e\x2a\x36\x8f\x3e\xb3\xb0\x95\x9f\x49\x79\x19\xa2\x27\xa0\xc2\x16\xbb\x0e\x29\xb8\x4b\x63\x28\xda\xb7\x37\x19\x6d\x92\x7b\x1b\x14\x62\xcf\x28\xaa\x4f\x67\x7d\x61\xab\x2c\x37\xa4\x3b\xa7\xb4\x43\x4f\x21\x0c\x69\x5d\x6f\x15\x10\x5f\xe9\xef\xef\x8f\xdf\x0c\x24\x96\x59\x7b\xca\x81\x25\xb8\x8e\x2d\x50\x64\x47\xf3\x0c\xd0\x22\x2a\x0a\xca\xbb\xca\x59\x9e\x2d\xa7\x33\x73\x05\xc8\x81\x70\x5a\x83\x5a\xdd\xcb\x49\xc5\xd5\x1e\xc1\x69\xc9\x23\xf3\x56\x8e\x58\x00\xf0\xb7\x1d\x66\x75\x0d\xb5\x9d\x0b\xfb\x51\xad\x02\xd4\x5b\x27\xc5\x8f\x24\x25\x25\xb6\x90\x6e\x75\x03\x24\x44\xad\x13\xa6\x94\xe5\x76\x54\x5b\x17\xef\xf8\xa6\xc2\xd6\x01\x3d\x2f\xa5\xc0\xfd\xd1\xcf\xd8\x16\xa4\xa6\xb8\x84\x88\xc5\xc7\x93\x93\x94\x78\xb5\x5d\x50\xb6\x9c\x61\xfe\x43\x2e\x38\x54\x66\x81\xd4\x4e\x49\x87\xe8\xde\xa8\x8d\xb2\x1f\xb2\x9a\x1e\xeb\x4c\x1f\x8a\x80\xdb\xae\x02\xe1\x3c\xcf\x72\xe1\x92\x86\xf5\xb8\x40\x69\x56\xa2\x71\x96\xe7\x78\x5c\x86\x17\x72\xdd\x98\xbd\x36\x16\x10\x2d\x28\x48\x60\xc9\x32\xe1\xbf\xa7\xf0\xdf\xa0\xcc\x5e\x65\x17\x38\x3f\x8c\x0a\xdc\x03\xe6\xc2\xf4\xbd\x8a\x8f\x51\xa8\x7f\xf0\x5b\x66\x7e\x75\x73\x4a\xff\x3f\x53\x47\x71\x0d\x44\xf7\xfb\xad\x13\x1e\xf3\x44\x96\xe2\x0b\xf4\x82\x8e\xaa\xd7\x85\xab\x5e\xe8\x08\xd8\xaa\xfe\xbb\x5b\x22\xfc\x99\x14\x65\x11\xa0\x45\x82\xa3\x02\xc4\x62\x18\x79\x96\x4a\x54\x4d\xb2\x24\xc9\x2e\x48\x3a\x85\x92\x05\xe5\x82\xd6\x32\xe2\x3d\x0c\xc0\xbf\x42\xa0\x9e\x7d\xd4\x44\x89\x95\xbd\x07\xef\x57\xa6\x57\xe1\xe8\x13\x86\x45\xc8\x18\x3e\x5c\x46\x13\xb0\xa7\x95\x4c\x96\x91\x00\x65\xb5\xe0\xab\x82\x4d\x3c\x43\x2d\xa7\xac\xb7\x59\x51\x90\x51\xc2\xa6\x10\x5c\x68\x70\xa3\xbe\xf7\x47\x54\xbe\xcc\x4b\xf6\x93\x8a\xd4\x02\x5b\x2f\x26\x13\x32\xbd\xe4\x1f\xc7\x82\x94\x1e\xa1\x4f\xb4\x79\xf6\xa7\xae\xab\xe0\x93\xdf\x6c\x31\xb0\xb9\x02\x93\x97\x4b\xec\x53\x5c\x45\x31\xb8\xa9\x82\x93\xf7\x3f\xec\x93\x5f\x18\xa9\x3c\x56\xe0\xd1\x23\xb9\x30\xd5\x3d\x0e\x2b\xf0\x6b\x34\xca\x8c\x3c\x4f\x09\x71\x0f\xc3\x06\x00\xd7\x37\x7a\x1e\x2b\xa1\xf5\x42\x2b\xcc\x3e\x39\x16\x34\x10\x64\x41\x68\x1f\x70\x99\xc2\x11\x82\x15\x0e\xa7\xda\xef\x52\xfc\xb6\x45\x0a\xc6\x17\xac\x93\xef\x95\x94\xd3\x19\x39\x8c\xa3\x94\x9e\x0c\x22\xc9\x9a\x79\x3a\xd7\x95\x65\x39\x8a\xd0\xcb\x17\xff\x84\x43\xb8\x90\xd6\xee\x8c\xa1\xc8\x7d\x56\x1c\xed\x7e\x9e\x61\xe1\x67\x2f\xd2\xae\x72\x79\x14\x14\x2d\x58\x00\x5d\x4f\x51\x81\x2e\x30\x5d\x20\xca\xc1\x8a\x18\xc6\x9a\x26\x0d\xfd\x8c\x8d\x23\xb9\x18\xa7\xce\x52\x98\xa8\x43\x6b\x16\x4c\x42\x17\x8a\x58\x09\x3d\x6a\xac\xc9\xa9\x18\x77\xb2\xe4\x21\x7d\x1b\xe6\x15\xa0\xa7\x46\x23\xa1\xfe\xa5\x49\x56\x8d\xcb\x37\x62\x38\xf6\xac\xe0\x0b\x4c\xee\x17\xec\x7f\xcb\x12\x2f\xb3\xba\x05\xae\x9d\x17\x7e\xb3\xa5\x4e\x57\xdb\xef\xb8\xd8\x01\x21\x77\xb3\xd4\x4b\x32\xc7\xc5\xef\xb1\xcc\x53\xae\x5c\xa4\x8b\x5b\xaa\xaa\x0a\x76\xcc\x87\x2d\x1a\x49\x5b\x16\x87\x1c\x64\x4f\x5a\x11\x85\x22\x03\x71\x77\x48\xe7\x5e\xd1\x82\x59\x9b\xf4\x72\xa5\x2a\x50\x00\x12\xff\xba\xf1\x8d\x35\x0b\x0d\xe7\x9f\x6f\xa8\x10\x08\xcb\x5e\x94\xe7\x3f\xae\xae\xd0\xe6\x9e\xf7\x70\xc3\xeb\x75\x0e\x27\x2c\xdd\x38\x11\x71\x9c\x8b\x9e\x3c\x78\x80\xf8\x6f\x9f\xd0\x4f\x9b\xb4\x73\xf5\x13\x86\xcf\x07\x9a\x21\x8b\xf1\xc2\x52\x27\xb2\xf9\xb9\x1b\x74\xbb\xfa\x85\x8b\xe5\x29\xcd\x57\x5a\x27\x94\x4a\x99\x2e\x15\xb1\x63\x3d\xa4\x22\xe9\x84\x81\x89\x28\x1e\xf2\x28\xc6\xcd\x26\x01\xb6\xbc\xc8\xba\x05\x1a\xcb\x98\x2e\x0e\x69\x99\x21\x5f\xda\xd0\x57\x05\xd5\x68\x87\x64\xb3\x4e\x53\xe1\x65\x90\x0c\x05\x1f\x69\x94\xe5\x5b\xb0\xf0\xe4\xbb\xa7\x79\xad\x93\x05\x74\x95\x44\xe3\xd4\x75\x26\xb7\xfc\xeb\xc0\x2c\x0f\x16\xc9\xb2\x50\x5d\xe0\xdf\x5e\xf7\x86\x12\xc8\xd4\x24\xcd\xf0\xf8\x53\x21\x8e\x4d\x8c\x47\x8a\x6b\xce\x82\x3f\x96\x4b\x2e\xc1\x8f\xaf\x37\x1a\x31\x23\xf9\xb1\x37\x12\xb1\x19\x53\x58\x6b\x80\xae\xff\x48\xc1\xeb\x8e\xed\x20\xb8\x12\x9f\x39\xab\x6e\x63\xe2\x78\xa5\x96\x06\x6d\xf8\x9f\xcd\xcf\xa7\x9b\x8f\xbe\x8b\x1e\x4d\xce\xbe\xec\x6e\x5e\xff\xcf\x90\x0c\x4a\x5c\x94\x12\x7c\x85\xb1\xd7\x0c\xf9\xeb\x0c\xb6\xc5\x30\xe1\xfc\x3f\xfc\x4f\x6f\xf3\x73\xff\x69\xed\x38\x75\xfa\x1b\x0e\x55\xac\x2c\x16\x0d\x0b\x7a\xc7\x3c\x08\x73\xa3\xc3\x39\xbc\xe3\xa5\xfb\xb1\x36\x6a\x93\x7e\xb9\x23\x40\x64\xba\xaa\xf0\x76\xc6\xec\x0b\x65\x73\x1a\xd8\xc1\xa3\x1f\xbd\x60\x56\x97\x21\x74\x57\xb7\x00\x67\xc7\xc5\x9c\xfe\x3b\x8e\x16\x05\xc8\x0e\x49\x82\xc4\x77\xa0\x7b\x68\xb4\x7b\xcc\x1c\xcf\x6b\x1d\x36\x1a\x38\x96\xdb\x3b\xc3\x0e\x8e\xc6\x33\x34\x8e\x0a\xa7\x1a\x52\x30\x42\x59\xce\xf9\x0c\x69\xd4\xc4\x56\x59\x7b\x9a\x62\x6d\x15\xcb\xf9\x1c\xc7\x95\xe4\x65\x35\x77\xc7\x64\x66\xd5\x5e\x47\x6e\xc3\x21\x1b\x8f\x85\x9b\x48\x96\xe4\xbf\x9c\x1d\x48\xe9\x43\x38\xc4\xcb\xa8\x00\x67\x34\xb3\x68\x47\x34\x62\xea\x52\x84\xb4\xe3\x73\xf8\xb2\xbb\x09\x77\x94\xc8\xa2\x10\x70\xde\x5d\xce\x50\x82\xe1\x39\xb5\x16\x81\x6f\xb1\xc0\x39\xed\xad\x98\x86\x14\xa2\x17\x4e\x09\x0b\x70\x17\x15\x78\x1e\x2d\xe8\x74\x6c\x19\x9a\xbe\x9e\xb4\x60\xd0\x3a\x0d\x6e\xd9\xb6\x1e\xf7\xd1\x0f\xe8\x5b\xba\x9d\xf3\xac\x53\x72\x36\x28\xb3\x13\xda\x10\xd7\x05\xad\xef\xef\x6b\x99\x40\xf4\xf5\x15\x7e\xbf\xef\xa9\x51\xd7\x2e\x59\x35\x56\xf8\x0a\xd7\x96\xa5\x62\xf9\x06\xe3\x57\xf1\x17\x24\x95\xbe\xe6\x47\x3d\x41\x8d\x15\xa4\x58\x66\x77\x49\x8a\x42\x7b\x2d\xf7\xe5\x15\x28\x51\xd3\x19\x4b\xea\xb3\x5f\x5d\xf3\x76\xba\x5d\x4e\x4a\x2e\x99\x1a\xf8\xbd\x11\xd1\x6a\x40\x63\xa7\xf7\xb4\xa2\x1a\x32\x16\xbd\xd0\xae\xdd\x6d\x92\x06\xa6\x37\x53\xa6\x7f\x94\x48\xbf\xa3\x07\x9f\x09\x73\xa0\x2f\x6e\xe2\x24\x85\x1b\x04\xdc\x44\xbf\x26\x05\xd9\xfd\xdf\xd8\xaf\x24\x6e\x8d\xbc\x6c\x46\xda\x58\x53\x2d\x69\x5a\x25\x4d\xc9\x53\x49\x9a\x06\x1b\x2d\x33\x2a\x51\x92\x18\x6d\x6f\x32\x9f\x41\x8f\xf8\x05\x21\x6b\x93\xbd\x4f\xd8\xfc\x8c\x98\x71\x87\x6b\xdc\xd5\x48\xc9\xfe\xdb\x7e\xee\x7d\x40\xe7\xda\xd2\x80\xab\x1d\xfd\x5a\xe2\x8c\x77\xe3\x13\x4e\x75\x05\x3e\x34\x19\x9e\xed\xb6\x75\x1b\xad\xa7\x22\x7e\xf9\xe5\xab\xcf\x84\x10\xa1\x17\xe1\x4a\x49\xd6\xa8\x5e\x53\x05\x68\x77\xd3\x7f\x4b\x20\x1c\x11\x8b\xd3\x74\xa1\xa4\xdc\xe6\x20\x9b\xde\x93\xa4\xef\xea\xcb\x08\xbc\xc9\x36\x32\xdf\x19\x10\xf5\x58\x37\x2c\xb9\x50\xf4\x2d\x2d\xca\x28\x1d\x53\x2e\xa2\x0a\x5f\x5d\x49\xa4\xf1\xc2\xf0\x7a\x0d\x7e\x19\x8e\x33\xbc\xa9\xcc\x36\x02\x78\x91\xac\xb2\xdb\x16\x51\xe2\x3c\xdc\x84\xa5\xf7\x8e\x71\x51\x4b\x14\x79\x42\x24\x79\xf1\xc3\x59\x2b\xef\x19\x8c\x86\xf5\xad\x7b\x77\xe8\x61\x7d\x69\x8d\x1b\xd1\xe3\x66\xec\xfc\xa8\x8c\x48\x56\xc5\x8f\x28\x7a\x23\x0c\x89\x12\xdd\x96\x23\xa2\x7d\x2a\x9b\x87\xc3\xba\x7e\x83\xc1\x1c\xf3\xbe\xb5\x5c\x0c\x54\xbc\x48\x97\x49\x02\x51\x12\x7a\xee\x0a\x01\xc3\x6d\x50\x61\x78\xc6\xce\xef\x6b\x5b\x8e\x7c\xc4\x3a\xdb\x82\x1d\x30\xc0\x9b\x30\x03\x96\x74\xa3\x89\xe4\xdd\x6b\x3b\x1a\x70\x01\xd8\x3c\x16\x27\xa2\x46\xcb\x91\xb8\x51\x31\x5a\xb2\x34\x28\x58\x3b\x06\xfb\x38\xc2\xf6\x51\xb0\x91\xcb\x04\xd5\x99\x83\xf8\x7b\x61\xae\x2b\x65\x81\x50\x3b\x06\x5a\xcc\x7e\x35\x20\x5d\x27\xe5\x97\xee\x3e\xb5\xbe\x0e\x37\x93\xec\x19\xae\x32\x66\xbd\x46\x63\x08\xfb\xd4\xc3\x9e\xbd\x4d\x3f\x90\xae\x32\xea\x88\x8f\xfb\x05\x9d\x40\xbc\x9c\xa3\x51\x92\x8d\x3f\xa1\x19\x8e\x62\x9c\xd3\x8f\x6c\x6e\x5b\x6d\x90\xe2\x19\x4d\xf6\x09\x0d\x33\xfc\x59\xfa\x45\x87\xb2\x68\x42\x92\xd2\x56\x66\x7a\x08\x16\x60\x0d\xf7\xc3\x34\xa5\xf6\xa4\xff\xcd\xd6\xb6\x3a\xea\x33\xf0\x06\xbc\x54\x1f\xd4\x59\x5d\x7a\x55\xbe\x73\xba\x0b\xe5\x8b\x38\xac\xce\xd9\x6b\x6e\x3f\x6e\x30\x33\x49\x46\xc5\xbc\x05\x19\xbb\xf3\xf0\x81\x26\x37\xcd\x43\x29\x81\x6a\x26\x00\x6a\x32\x26\x00\x8a\xd5\x4e\xc0\xe3\x5d\x85\x7f\x06\x7d\x63\xfc\x43\x55\x7a\x4d\x3e\xf4\x3b\x40\x37\xc2\x7e\x85\xe3\x11\x2e\xf2\x85\xe2\x47\x20\x52\xe1\xd1\x4f\x28\x7f\xb1\x74\x10\x0c\x43\xf6\x9f\x48\xe1\x16\x24\xa1\xfa\xc9\x72\x34\xeb\x92\x50\xff\x10\xe5\x4e\xca\xc9\x93\x90\xff\x2f\xd2\xc0\x5e\x25\x14\x3f\x54\x3d\x0c\x56\xfc\x52\xe9\x1c\x5e\xfe\xe4\xf5\xb8\x46\xb7\xa1\x2f\x91\x41\xbb\xb6\x9c\xa1\x27\xcd\x80\x15\x66\x93\xa1\x9d\x20\xc6\xf1\x33\x86\x51\xfc\x8c\xb5\x31\x40\x1a\xff\x21\xe0\xa4\xb4\x18\xea\x1f\x22\xd7\x54\x59\x87\x4e\x8a\xc4\x1a\x13\xd4\x43\xf5\x93\xe5\x68\xd2\x71\xa8\x7f\x88\x5c\xe3\x24\x12\xda\x09\x02\x4a\xcb\xb7\x72\xac\xa3\x7b\xe8\x26\x89\x1e\x3a\x90\x4e\x92\xa8\x53\x08\x63\xa1\xf6\x5b\xef\x6f\x3a\x0d\xe5\x2f\x91\xce\xf6\xd4\x50\xfe\x92\xa3\x67\xeb\x3d\x54\x3f\xe5\x98\xe8\x2e\x19\x8a\x1f\x22\x95\x6e\x58\x21\xff\x5f\xd6\x41\xf9\x5d\x28\x7e\x88\x54\x60\x1b\xa1\xf8\x11\xc0\x02\x63\x0e\xea\xf8\xab\xee\x4e\xb8\xf5\x5d\x50\xeb\xdf\x26\xe8\x2c\xcb\xc9\x93\x4e\xf8\xe4\x9b\xeb\xb3\x60\x7b\xab\x8d\xc7\x07\x73\x09\xef\xb3\x05\xdc\xe1\x8e\x0e\x3a\x21\xea\x6c\x0e\xb6\x37\x07\x5b\x9d\xb5\x6b\xe1\x0a\x6e\xbb\x55\xa4\xe2\x7b\x4f\x12\xf7\x9e\x24\xfe\x0a\x9e\x24\x78\x2d\x6b\xae\x2f\xb8\xbf\xe3\xc9\x24\xc7\x97\xe8\x67\x92\x8c\x3f\x61\xf4\xfd\x2f\x78\x32\xb1\xdd\x49\xb4\xf4\x18\x07\x60\x24\x4a\xd1\x31\x95\xb8\x23\x80\x22\x51\xea\x82\xfd\x18\x8d\x28\xd8\x3f\xb2\x29\x4e\x8a\x12\x27\x09\xce\xd1\xf7\x13\x48\x74\x81\x7f\x8a\xce\xd1\xcf\x59\x16\xa3\xef\xa7\x95\x6e\x2e\x76\x95\x7b\x1f\xee\x0b\xf2\x75\x94\x46\x53\xd3\xf7\xc4\x60\x48\xb1\x30\xcc\x19\xc0\x9c\x01\x08\x1f\x13\x47\x23\x38\x1c\xd9\xc0\x64\x14\xa5\x02\xe4\x05\x98\xf1\xdb\x10\x4c\xf2\x2a\x86\xb8\x9c\x09\xc0\xe7\xcf\x6a\xe0\xe2\x91\xf4\x37\x3b\xab\xab\xaf\x98\xc9\xfa\xde\x80\x67\xf2\x2a\xc0\x14\x97\x02\xf0\x2d\xce\x0b\x78\x4a\x55\x0d\xbd\xe0\x20\xb2\x13\x17\x51\x3e\xaf\xeb\x06\xcd\x97\xc0\xb8\x2c\x21\x6a\x93\x0b\x5f\xf0\x2c\x01\x2a\xb8\x8a\x01\x29\xd8\x05\x3d\x51\x29\xe7\x1e\x24\xb1\x2a\xd4\xc2\xca\x57\xfb\x08\x61\x40\xc2\x1b\x13\x7f\xb8\x81\xd3\xd8\xd3\x37\x96\x21\xc0\x9e\xc1\x89\xc9\x85\x1a\xd1\x74\x89\xc9\x3c\x5b\xe0\xbc\xbc\xf4\xc0\x2d\x78\x96\x00\x7d\x59\x96\x8b\xb7\x79\x76\x4e\x62\x2f\xb9\xd1\x85\xba\xe0\xd9\x92\xd8\x16\xe3\x9a\x12\x64\x31\xb6\x0b\xb4\xf3\x68\xb8\xb6\x26\x65\xf5\x9f\xf1\x68\x07\xf5\x44\x35\xa6\x57\xde\xdc\x5e\x21\x29\xbe\xb0\x96\x8d\x2a\xa9\x39\xe8\xe5\xa1\x56\xb5\x9e\x0b\x28\x0d\x08\xb3\xb7\x2e\xf8\x82\x2e\x17\x70\xd4\xaf\x57\x11\x8f\x78\xe6\xf3\x67\x4e\x5e\x31\x13\x25\xdf\xcf\xdc\x92\x29\xac\x01\x9a\xfb\x06\x97\x4e\xee\x42\x11\x3e\x05\x11\xeb\xc0\x81\x1b\xfd\xfa\xab\x68\x83\xd2\xb5\xdb\x07\x45\xe0\x00\xc4\x3f\x7b\x3a\x8c\xa2\x6c\x75\xd4\x88\x16\x24\x94\x9b\x21\xff\x9f\x1d\x39\xf4\x4e\x72\x6c\x15\x46\x51\x9d\x7c\x42\xe3\x2b\x90\x30\x1a\xbd\x84\xfa\x87\xd3\xc4\x47\xb9\x06\xd8\x0f\x67\x80\x1c\xa0\xa7\xda\xe7\xe4\x4c\x70\x11\x6a\xbf\x7b\xcc\x98\xe7\xba\xbf\x47\x25\xa6\xe1\x10\x5c\xf0\x16\x18\xa9\x31\x64\x6c\x27\x06\x9f\x40\x6b\x94\xdc\x3c\xe3\x6b\x1a\x5b\xe5\xb8\xa8\xd0\x28\xea\x14\xf1\x34\xb1\x4e\x79\x7a\xcc\xe0\x66\x1a\xd7\x0b\xaf\x4c\xda\x9e\xbe\xe4\x98\x05\x8b\x50\xbd\xf8\x84\xf1\xe2\xa8\x78\x7f\x99\x8e\x49\x3a\xad\xed\x0a\x94\xb5\xe0\xdb\x51\xa0\xa7\x23\x3a\x5f\x78\xa6\xec\x57\x2c\x28\xf1\x0c\x86\xb9\x93\x82\x2f\x0f\x8c\x78\x32\x2b\xa0\xe0\xdb\x03\xc7\xdf\x5d\x0b\x30\xfa\xe9\x40\xe9\x4f\x70\x19\xa0\x4c\xf1\xc2\x1a\x75\x8a\x04\x4f\xdb\xea\x3d\x95\x68\x9e\xa7\x78\x6b\xb5\xa1\xb5\x34\x4f\xdd\x3a\x2e\x45\xed\x75\x38\x65\x26\x8e\x02\xf2\x67\xec\x1f\x99\x0e\xc5\xbf\x1d\x38\xdd\xb4\x85\x41\xca\x14\x0f\xac\x7b\x2b\x2c\xca\x1c\xda\xb7\x85\x4e\x9f\xab\xca\x3a\x39\x9e\x76\x8f\x9e\x1d\xbc\xd1\x1a\xa3\x9f\x0e\x94\x72\x4f\xc3\xc0\xf8\xb7\x0f\x4e\x78\x4e\x91\x80\x90\x40\x77\x31\x7b\xe1\xb3\xad\x5f\x7f\xc9\xcd\x2e\x85\x4c\xef\x8a\xe6\x75\x1d\xdc\x49\xdb\x90\x55\xd7\xa7\x31\xc9\x41\x55\x3c\x8e\x16\xf0\xfa\x42\xbb\xc0\xf4\xcc\xe8\xd1\xe1\xc1\x5b\x63\xed\xd3\x72\xba\x85\x1c\x61\xa2\x24\x5d\xbe\x54\xaa\x64\xf9\xc6\x63\x4f\x0a\x31\xe0\xcd\x88\x95\x0d\x0e\x65\x24\xff\xad\x8b\x38\x7a\x2a\x79\x37\xec\x75\x5c\x1c\xe9\x99\x77\xce\x29\xe8\x60\xba\x62\x4f\x4a\xb3\x18\x77\x03\x03\x62\x0a\x66\x21\x21\xea\x52\xa1\xe3\xe3\x38\x21\x38\x2d\xff\xc1\xc0\xbb\xea\x4e\xba\x1f\xdc\xa4\x35\x5c\x5e\x64\xf9\xa7\xaa\x06\x53\x5c\x7e\xe4\xa0\x16\x88\x19\x30\x20\xb4\x57\xf9\x2d\xbb\x85\xb9\x42\xbb\xaa\x5f\xb8\x9c\x7d\x84\xb9\x1e\x67\xc9\x3f\x7e\x87\xfe\x5d\xcc\x48\xb1\x90\xbe\x91\x9d\xee\x15\xb3\xd9\xad\xd1\x06\x3f\xcf\xbc\x7b\x09\x29\x0e\xb3\x34\x65\x3e\x9b\xb4\xe5\xd6\x37\x68\xaf\xe7\xdd\x2e\x1f\x3c\xf0\x6e\xa3\x7a\x95\xbd\xbe\x7f\x07\x63\x5e\x0a\x84\x4c\x5e\x49\xf3\x60\x1c\x0a\x91\x13\xb8\x44\xe3\xd5\xdb\xd2\xba\x85\x37\x51\xfd\x84\xc0\x54\x4e\xc6\xc1\xa2\x13\x6e\x6f\xd2\x24\xfd\x48\xd2\x09\xb7\xb7\x68\x9a\x3a\x0e\x74\xc2\xed\x5d\x99\xc2\x44\xa7\x4e\xb8\xfd\x44\x26\xe9\xc2\x7d\x27\xdc\xd9\x96\x19\x74\x85\x77\xc2\x9d\x1d\x95\xa0\x84\xfa\x4e\xb8\xa3\x2a\x55\xc7\xc2\x4e\xb8\xf3\xad\x93\x8c\xcb\x59\x27\xdc\x79\xe2\xa4\xa7\xb8\xec\x84\x3b\xdf\x39\xe9\x42\x10\xee\x84\xbb\x9b\x4e\x66\x31\x9b\x75\xc2\xdd\x2d\x37\x9d\xca\xc2\x9d\x70\x57\x75\x5f\x9c\x71\x3a\xe1\xee\x37\x32\xd1\x3c\x38\x77\xc2\xdd\xc7\x32\x4b\x48\x2d\x9d\x70\xf7\xdb\x7a\xdd\xde\xf5\x59\xb0\xbd\x73\xaf\x79\xbb\xd7\xbc\xfd\xb7\x68\xde\xa2\x24\x01\x07\x13\xb7\xf3\xe3\xaa\x29\xb8\x1c\x55\x88\x4f\x17\x22\xc2\xc4\xbc\x38\x67\x16\xfd\x9a\x8e\x01\x7a\x23\xe0\x54\xd0\x98\xa6\xe8\x48\xae\x9e\xc6\xab\xa8\xf9\x11\x2e\x77\xad\xca\x20\x4d\x40\x5c\xb0\xd8\x47\x26\x88\x60\x45\x3c\x53\x7a\x77\x3d\x48\x12\x63\x28\xa6\x60\x64\x1e\xad\x02\xb8\xa9\x0f\x90\x65\x5a\x56\xa1\xf4\x30\x13\xf4\x23\xf2\x2f\xec\x72\x9e\xfe\xa7\x27\x3b\xe6\x92\x6c\x13\x72\x7a\x58\x1f\xe6\xdb\x92\x5a\x85\x3f\xf0\x7d\xf9\xeb\xea\x0a\xe2\xdf\x20\xdb\xef\x03\x4d\x84\xd4\xd3\x2e\x95\x42\x21\xae\x40\x37\x40\xdd\x32\x63\x3f\xcf\x06\x0c\xcd\x5a\xbc\xc3\x89\xe7\x36\x94\x37\x73\x3a\x39\x03\x03\x17\x69\x1f\xca\x6f\x48\xfb\x9e\xa0\xd9\x56\x35\xb4\x3f\xb4\xf8\xbe\x46\x3c\xcc\x85\x0e\x74\x84\x9d\x97\x54\x10\x3c\xd5\xa0\xb0\x59\x50\x0f\xb7\xc0\x17\x85\xc2\xab\x81\x67\xf3\x75\x97\xee\x9d\xa2\x0e\xe3\x9e\xa8\xc5\x71\x54\x46\x62\x04\xf4\xf7\x80\xfe\x83\xf6\xb5\xdf\x57\x57\x60\x14\x2b\x01\xe0\x2a\xb9\x10\x20\xfc\xeb\xea\x4a\x45\xdf\x04\x6d\x23\x6d\x5a\xdc\x91\x6b\x80\xa7\x9b\x67\x83\x82\x32\x04\xe9\x62\x9d\x42\xcf\xb9\x80\xa3\x28\xcc\x9d\xae\x5f\x3c\xd3\xa5\xb7\xb2\xcf\x4d\x6d\xb9\x74\xe7\x5e\xda\xf6\x7e\x91\xef\xd3\xfb\xa7\x9b\x67\xda\xc3\xab\x75\x68\xbf\x8f\xbe\xc0\x63\x87\x28\x4d\xb3\x12\x4d\x48\x1a\xb3\x7e\x91\x74\xca\x1a\x7a\x2a\x9b\x1f\x67\x69\x91\x25\x78\x70\x11\xe5\x69\xaf\xab\x97\x60\xde\x72\x28\x2b\x4e\xb2\x69\x57\x33\x7d\xe5\x3d\xa6\xa8\x70\x3c\x2e\x61\xce\x86\xf4\xc8\x5c\x30\x77\x3d\xdf\xea\x0c\x58\xb7\x02\x93\x20\xcc\x23\x14\xd4\x28\x9c\x1d\xc2\x14\xb7\x58\x8e\x9f\xf1\x98\x4a\x00\x9e\xf5\x18\x80\x47\xa6\x51\x34\xfe\x24\x63\x88\x82\x2b\x02\x7e\xd8\x15\xd7\xad\xbd\x28\x9f\x2e\xe1\x2d\xc8\xa9\xfc\xa5\x79\xe3\x31\x8d\xd0\x45\x8d\x10\xfb\xb9\xb6\x98\xee\x37\xae\xe7\x40\xd0\x89\xdf\x32\xfd\x58\x28\xb6\x91\x2e\x93\xc4\x41\x77\x26\x28\x8d\x7b\xbf\x53\x07\x60\x01\x31\xd1\xa2\xac\x31\xcd\x2c\x60\x72\x30\x22\xa6\xd2\x50\x13\xbf\x19\x67\xef\x65\x01\x1c\x94\xba\x81\x97\xb1\x06\x82\xbd\xd3\xc3\x56\xaf\x1f\xa8\x86\x34\x0c\x37\xcf\x54\x54\x96\xd1\x78\xf6\x21\x3b\x14\x8e\xb0\xf4\x29\x13\xde\xb1\xf4\x33\xb7\x9a\x5a\x36\x6e\xf6\xe9\x0c\x47\x14\x1d\x44\x49\x22\xf7\x13\x0e\x5c\x71\xa6\x70\xba\x29\x0f\x18\x9e\x13\x86\xf7\x88\x01\xa4\xda\x09\xb7\x41\xba\x67\xab\xbe\x13\x6e\x83\xec\xae\xc7\x6c\xdb\x01\x60\x6b\x23\xec\x84\xbb\x3b\x54\x64\xde\xbd\x17\x99\xef\x45\xe6\xbf\xb6\xc8\xac\x85\x7b\x81\xb3\xf7\x5d\xc5\x7b\xf9\x7b\x91\xa5\xf9\x62\x6c\xca\x9b\xbf\xb0\x44\x79\x75\x98\xe7\x99\x2d\x02\xb3\x34\x29\x89\xba\x2a\x0a\x3a\x58\x43\xc8\x74\x64\x4c\x40\xc7\xc7\x4a\x49\x93\x67\x14\x3c\xb0\x77\x83\xa3\xc0\x28\x8e\x85\x4f\x47\xca\x8e\x79\x61\x70\x93\x0d\x5d\xe3\x09\x96\x45\x60\x14\xc7\x1e\x1b\x5b\xc4\xc7\xcf\x0a\x95\xca\xba\x75\xb8\x06\xe3\xd4\x59\x71\x1c\xfb\x64\x6e\xdf\xc0\x0b\x16\x15\x5c\x40\x34\x8e\x48\x30\xed\xba\xfe\x73\x18\x6f\xd7\x7c\xfb\xb9\xe9\x5d\x40\xe2\xd7\xe8\xa6\x3b\x05\xea\x9e\x28\x8d\x99\x9a\x49\xc0\x06\x5a\xdd\x38\xcf\x03\x2e\x89\x16\xae\x4c\xcc\xc8\x87\xfd\xe2\xc2\xa2\x02\xe0\xf8\xd1\x5d\x4c\x4a\x54\x06\x08\x5e\xb7\x57\xbc\x5f\xe3\x55\x9e\x02\xcc\x99\x7e\x3c\xa8\x14\xd8\x59\x91\x8a\x6a\xa9\x58\x23\xfa\xc3\x2b\x1d\x38\xb2\x8f\x5d\x60\x9d\x2f\xa2\x01\x29\xfe\x11\x25\x24\x7e\x87\x8b\x45\x96\x16\x98\x37\xe5\xbc\xbd\x73\xc6\xe0\x6f\xaf\xc7\xd6\xd8\xe0\x28\x3d\xf7\xd6\xba\xe7\x54\x7a\xed\xf6\xaf\xb2\x72\xe6\xb3\xc9\x19\x2c\xdb\x73\xc1\x37\x84\x2f\x83\x37\x3e\xe0\x7d\x00\xaf\x11\x7a\x82\x13\xc5\x5e\x4d\x85\x3c\xdf\x20\xbf\x28\x01\x94\xa5\xf4\x93\x6c\xf0\x9d\x70\x1b\xf4\x68\x7c\x45\x76\xc2\x1d\xb0\x7a\x6b\x15\xe5\xfb\x7e\xc3\xbf\xdf\xf0\xff\xbc\x1b\xbe\xda\xef\xa5\x58\x7e\x47\x2a\xb2\x96\xba\x2a\x7a\xe2\xc9\x2d\xb0\x82\xcb\xfa\x43\xc8\x5c\x55\x9d\x26\xe0\xb4\x77\x53\xba\x1e\x4c\x3c\x88\xe2\xd0\x07\xda\x21\x44\x03\x93\x1a\x43\x23\xe4\xb8\x6f\xff\x64\xea\x25\xfd\x91\x19\x6c\xf3\xf6\x33\x65\x06\x77\xa8\xc0\xde\x0a\x28\x29\x17\x80\xb1\xef\x35\x12\xbe\x9c\xcd\x54\x6f\x03\xdc\xdb\xaf\xbf\x6a\xf3\xa9\xe7\x88\x04\xbc\x9c\x75\xab\x13\x8d\x88\x47\x0d\xa2\xf9\x7d\x46\x96\xa3\x65\x16\xe0\x7b\x7f\x1f\x75\xb5\x3e\x75\xd1\x83\x07\x86\x23\x67\xed\xdc\xcc\x9a\x35\xbc\xfd\x5f\xf7\xad\x6d\xb8\xae\x41\x8f\x6b\x68\xd4\x83\xc4\x8a\xed\x1a\xf2\x98\xc7\x68\xcf\xce\x60\x55\x44\xc1\x0a\x4f\xd3\x40\x7b\xfc\xf0\xce\x10\xca\x40\x25\x1a\x35\x2d\x8f\xd0\x5e\xb5\x90\x1e\x65\x40\x2f\xee\x2a\x8a\x1d\xad\xbd\x2f\x9b\xa2\x38\x16\x34\x5c\xa8\x63\xb8\x4e\x1b\x22\xed\x5a\xd6\x54\x49\x4f\x8c\x54\xfc\x55\xd6\x9e\xec\xd5\x71\xfd\xe6\x84\xa2\xbd\x42\x5c\x65\xf6\x75\x4d\x95\xd4\xfe\xc8\xfe\x7c\xc4\xe5\x4c\xa8\x9b\x55\x27\x4d\xaf\x17\x8d\xaa\xd4\x89\xa3\xe6\x50\x08\x50\xaa\xd2\x16\xf3\xca\xb8\x45\xab\x49\x65\xfc\xe6\xee\x66\xd4\xae\xaf\x59\x51\x23\x18\xde\x5d\xcc\x2d\xe3\xbd\x96\x5a\x99\x73\x56\xae\x6d\x94\x3c\xd6\x9c\x3c\x57\x6f\xc5\x3a\x56\x39\x9d\x07\x49\x52\x3b\x5d\x00\xc4\x2f\x7a\x56\x26\x30\xa6\x0a\x6d\xe8\xe0\xea\xd4\x66\x3c\x0a\x74\x95\x6a\x55\xd4\x56\x47\x6e\xd2\x51\x0e\xd8\xfe\x89\x49\x9f\xe2\xb2\xe0\xc6\x2b\xc9\x25\x8a\xf1\x22\xc9\x2e\x71\x2c\x4c\x04\xe1\xf9\xe0\x78\x16\x91\xd4\x7e\xae\x06\xb5\xfd\x98\xe5\xa2\x47\x1e\xdf\x03\xe2\xc0\xea\x23\x49\xb1\x2e\xaf\xa5\x6a\x71\xcd\x70\x91\x7b\x22\x2e\x37\xd4\xb3\xb6\x8a\x16\x75\x83\x07\xd1\x92\xa6\xb0\x54\xe4\x0b\x01\x9b\x21\x92\x8c\xa3\xe6\xfd\x11\xa2\x94\xef\x8b\x87\x65\x90\x3f\x1c\xa2\x8b\x88\x30\x75\x39\x88\x5c\x8b\x52\xa9\x60\xc5\x4d\x99\x39\xef\x7c\x29\xc8\x80\xd1\xaa\x63\xb8\x6f\x7a\x5e\x5e\xc7\xf0\x34\xd9\x68\xdf\xde\x95\xa0\xbf\x1b\x1b\x7b\xe6\xb1\x69\x38\x44\x45\x99\x2d\x98\xae\x96\xa4\x53\x14\x4d\x68\x57\xbe\xd9\x64\x73\x55\xa0\x5e\x49\xe6\x38\x5b\x96\x7d\xe7\xe8\xc8\x10\xf0\x03\xfa\x66\xd3\x7b\x58\x64\xbd\x1f\xd0\xda\x7f\xe6\x95\xab\x98\x0a\x7d\xf4\xe5\xda\x73\xa6\xb3\x11\xc8\x1e\xec\x79\xcf\xa1\x72\x46\xbc\xa7\x4d\x75\xf2\x53\x8e\x81\x25\x63\x82\xfb\x92\x88\xad\x8c\x31\x25\x6c\x70\x12\x3c\xa2\x12\xf3\x32\x8d\x6d\x0c\x74\x7d\x87\x4f\x9c\x68\x0e\x45\xf4\x3f\xc7\x1d\xf1\x8d\x5b\xa5\xcb\x4f\xaf\x59\xfa\x13\x71\xb1\x66\x50\xcd\x14\x97\x1f\x54\x53\xef\x18\xa9\x29\x8e\xa2\x75\xe3\x65\x54\xcc\x74\xa2\x0a\x04\x61\xf6\xfd\x47\x78\x32\xe9\x71\x00\x3f\xb5\x79\x0b\x79\x3b\x08\x21\x8c\x78\x5d\x83\xb1\xb9\x00\xcd\x1e\x41\x9c\x23\x7f\x77\xc4\x5f\x95\xf7\xf6\xc7\xd2\x7b\x7b\xd5\x1f\x99\xf4\x4c\x8a\xbb\xba\x42\xeb\xd0\x62\x6d\x31\x24\x59\xb7\x87\x36\xf5\xbf\x9b\x2c\x01\xfd\xaf\xe5\x72\xb0\x87\x94\xc5\x5a\x88\xe8\x9d\xda\x99\x11\x7f\xc3\xa1\xbc\xe7\x4b\xb2\xa9\x46\xb5\x70\xac\x10\x6c\x7c\xbd\xdb\x6f\x68\x1e\x19\xa2\x9a\xe4\xa8\x15\x53\xdd\xa2\xb2\xe1\x10\xb1\xcd\x4a\x88\x0b\x51\x1a\x23\x7e\x33\x82\xa2\x69\x44\x52\xbe\x72\x2e\x30\x8f\xf0\xd7\xf0\xe7\x97\x3d\xed\x0d\xb0\xa1\x06\x5b\xd6\x71\xb6\xff\x86\x21\x8d\x99\x53\x36\x7e\x29\x48\xb7\x04\xba\x3b\x16\x78\x9c\xa5\x31\xa2\x0c\xb7\xb1\x12\x8d\x74\x9b\x89\x15\x19\x1c\x11\x74\x61\x6d\x3b\xec\xf5\x62\x74\xc7\x1d\xd2\x7d\xb7\x6b\xa2\x04\x3f\xd1\x6a\x9c\xb2\x28\xb3\x1c\xc7\xd2\x8f\x3b\x93\x40\x40\xe3\x33\x8d\x0a\x14\xcd\xe9\x86\x34\xf0\xf2\x6b\xfb\xaf\x92\x7f\xdb\x7f\x1e\xf7\xf2\x77\xd1\xc5\xfa\x1e\x5e\x57\xe6\x56\x71\x0c\xb7\x84\x0d\xa9\x69\x27\xdb\x1e\x28\xb4\x2b\x06\x41\xe8\x3f\x46\xf4\x98\x7d\x29\x7d\x69\x58\x52\x9c\x05\xd6\x70\x68\xb0\x2b\xd5\x0f\x0c\x70\xaa\x8a\x46\xc4\xb8\x5c\x60\x2f\x8a\xb0\x38\xbe\x43\x5a\x34\x22\x68\x9f\x42\x0a\x39\xeb\x21\xd3\x84\x36\x8f\x49\x9d\x90\x52\x14\x69\xa2\x29\x2f\x2e\x6a\x11\x63\x4b\xf1\x85\x4c\x12\x63\x4a\x2f\xaf\x75\x62\xb0\x74\x23\x5b\xc2\xa6\x20\x4a\xfa\x2b\x16\xdd\xae\x29\x6a\xcb\xc1\x86\x64\xc1\x7d\x9d\x08\x45\x71\xec\x94\xf6\x49\xca\x1c\x42\x4a\xcb\xea\xf8\x27\x92\x64\x5b\x6a\xe2\xa1\xd0\x50\x4d\x04\x45\xa9\xef\xfa\x05\xd5\x6c\xd1\xdf\x8a\x1a\xe8\x9f\xfc\xc1\xa4\x6b\x79\x8a\xd4\xe9\xaf\x27\xe8\x20\x90\xb3\xaf\x73\xb0\xe1\x90\xc5\x56\x54\x56\x16\x46\xa5\xca\x56\xe2\xcb\xf5\x1e\x05\x16\x58\x5a\x37\xdb\xe6\x88\xd1\x2a\x86\x33\x6e\x0e\x6f\x71\x80\x90\xf5\x47\x09\x09\x19\x63\xb8\x6a\x50\xf6\x1a\x56\xf8\x3f\x9f\xed\x08\xd8\x7f\x54\x5b\x8c\x20\xc7\x6a\xa4\x18\x2c\xb2\x85\xe1\x60\xce\xec\x5e\x12\x15\x25\x87\x74\xaa\xf6\x77\x87\x11\x52\x8f\x16\x04\xe7\x45\xeb\xf2\xc5\x09\x04\xa2\x85\x74\xbb\x4f\x0a\x85\x0d\x5d\xa2\x0d\x71\xe0\x01\x8b\x4a\xf2\x03\xda\xb4\x6b\xe3\x33\x2d\x68\xff\x40\xac\xe5\x66\x2d\x80\xf8\xbb\x95\x4a\x50\x43\x93\xc5\x2c\x85\x3a\x4d\x9a\xda\xe9\xc3\x5a\x37\xbb\x3c\x58\x44\x97\xd1\x28\xc1\xbe\xee\xb9\xc7\x01\x66\x3f\x55\xe0\x34\x56\x11\xa9\xd2\x2c\x7d\xc4\x2b\xd1\xd1\x61\x6f\x13\xd7\x55\x53\x0f\xbe\xfd\x28\x67\xf4\xab\x60\x7b\x62\xa9\x04\x30\x62\xad\x56\x31\x41\x60\xfb\xb6\xb1\xcf\x2a\xda\x33\x27\xb1\xf2\x46\x50\x3f\xd1\x1a\x3a\x00\x21\xf7\x45\x71\x6a\x6b\x09\x62\x8c\x2e\xa2\x42\x0a\x94\x6b\x26\xae\xd8\xd2\x86\xab\x57\xed\x08\xa3\x0c\xb3\xac\xfb\xd7\x59\x54\xcc\x7c\x48\xa7\xbd\xc6\x79\x5e\x75\x13\xa9\x5f\x39\xfa\xee\x15\xeb\x24\x1e\x2a\x8e\xc6\x31\xbb\xf6\xd2\xb8\x2e\xed\x89\xbf\xad\x8a\x63\x17\xda\x87\x32\x15\xc2\x57\xa5\x84\x38\x21\x79\x51\x56\x0b\x88\x2b\xca\x78\x15\x1a\x10\x9f\xda\xc3\x77\xfd\x6a\x7c\x35\x39\xbe\x84\x48\x9b\x6c\xe0\x4d\xf3\x6c\x35\xd6\x16\xe5\x8d\xa8\x5e\x65\xe8\x7e\x9e\x26\x75\xf2\x0c\x88\xeb\xca\x38\x76\xc5\x26\x48\xcf\xb7\xcf\x99\x5d\x29\x24\xf1\x4f\xc3\x00\xed\xc6\x82\x97\xad\x35\x6b\xd2\xce\x7a\x36\x75\x5e\xd3\xb5\x29\x03\x4d\x64\xfd\xc3\xb5\xe1\xd0\xda\x81\x8d\x0b\x1c\xe5\xf1\x58\x53\x5f\x5a\x95\xf7\xd8\xbe\x3c\x1c\x1a\xae\x74\x2b\xe3\x4e\x8f\xc7\xe0\x15\x37\x63\x81\x9a\x48\x3a\xad\x91\xcd\x4c\x35\xb6\x39\x72\x36\x89\xd7\x2e\x27\xd2\xc5\xa1\x3a\x51\x08\x7d\xd1\xa4\xae\xb6\x12\xd1\x04\xa5\x99\xaa\x81\xb2\xb7\x45\x54\x14\x38\x0e\x68\x15\xca\xf5\x1d\x85\x28\xb4\x25\x6d\xf2\x32\x49\x78\x30\x03\x16\x3a\x0d\x73\x48\x9f\xef\x54\xd3\x66\x15\xad\x2c\x43\x29\x4b\x79\xa5\xad\x2c\x67\x9a\x6b\x49\x08\x56\x03\x21\xc2\x84\x51\x81\xec\x52\x20\x0a\x8c\xf0\x38\x5a\x16\x98\x9e\xc4\xe3\x2c\x2d\xd1\x45\x94\x82\x4d\x52\xb1\xc8\x48\xc2\x6e\xc3\xd3\x12\xe7\x93\x68\x2c\x7d\x63\xb7\x38\x89\xb7\x39\x6d\xdb\xdb\x54\x33\x3f\x44\x8e\x7b\x5d\xb9\xa6\xb5\xb5\xf9\x13\x2e\x99\xb3\x66\xba\x3f\x06\xe8\x62\x46\xc6\x33\x30\x1a\xa0\xcb\xbb\xcc\xf8\x36\x86\x16\xc9\xb2\x68\xbe\x7a\xe5\x7c\xa0\x61\x7e\x15\xf3\xf0\x1b\x32\x35\x88\xb0\xab\xcb\xa9\xb2\x58\xb3\xfc\x78\x1b\xd9\xb1\x5a\x6e\xd4\x8c\x95\x6f\x24\xc7\xd4\xc9\x30\xe6\x4b\x87\x01\x33\x48\x6f\xcf\x7c\x3d\xa7\x1e\xef\x71\xb7\xc5\xf5\x79\x15\x6b\x72\x0e\xc3\xde\x53\x70\xc5\x4b\x16\xdf\x79\xd8\xdd\xfd\x94\x5d\x38\xc3\x9f\xfb\x78\x05\x79\x0e\xd3\x5e\xb3\x25\x8b\x6e\xf7\xa4\xf9\xb3\x69\x2b\xd1\x09\xbf\xad\xb2\x80\x96\x16\x0d\x9d\x70\x7b\xc7\x35\x89\xe6\x23\xef\x84\x3b\x5b\xd7\x67\xc1\xf6\xe3\x7b\xd3\xa7\x7b\xd3\xa7\xbf\xb6\xe9\x93\x66\xeb\xcc\x4d\x20\xef\xc0\xd8\xb9\xc2\x8d\x25\x37\xae\x64\xef\xb2\x8e\x27\xe2\xce\xf9\x20\x9f\x16\x61\x85\xe6\x46\x93\xf1\xf8\x09\x96\x57\xa2\xc7\xbe\x13\xdb\x09\x65\x9f\xa2\x52\xa4\x9b\x38\x01\x9f\x0f\x7c\x7d\x78\xf7\xf6\x90\x31\xf7\xdb\x74\x80\xc5\x5b\x02\x56\x8b\xe1\x01\x63\x99\xa1\x77\x6f\x0f\xf9\x3d\x81\xbf\x03\xfc\x39\x3a\x38\x51\x54\x2d\xcf\xb2\x42\xbf\xfd\x72\x1b\x3f\x3c\x7e\xf3\xe6\xc5\xe1\x87\xa3\xe3\x37\xe8\xc5\xbb\x77\xc7\xef\x42\x74\x28\xd5\xbf\x63\x56\x25\x3b\xd1\xc7\x18\x75\x37\x10\xad\x0f\x6d\x74\x07\xfe\x3e\x28\x8f\x37\x6d\xc7\x2e\xdf\xd9\x33\x25\x42\x49\x57\x0f\x61\x95\xf9\x9b\x10\x86\xb4\x21\xb2\x8d\x82\xb5\x61\xc2\xb3\x34\x5c\x14\xd1\x14\xa3\x7d\xb4\xbe\xce\x5f\x1a\xd2\x6d\x9d\xff\x1e\xb0\x90\xb1\x4e\xca\x40\x14\x7b\x8a\xbc\xc9\x21\x92\xd3\xf5\xf7\xf7\xc7\x6f\x60\x56\x72\xd9\x25\x4f\x98\x55\xde\x37\xe7\x2d\x99\xc2\x01\xaf\xda\x1c\xad\x9a\xcd\x0f\xec\xba\x5a\x1f\xef\xbc\x68\x3b\xa5\x1f\x8e\x5e\xbf\x38\x3e\xf9\x10\x22\x7e\xe9\x4d\x89\x8b\x76\x72\x5e\xa0\x0d\xd4\xa5\xff\x45\xe3\x19\xe5\x18\x5d\x23\xa0\x0d\x77\x23\xf9\xed\xfd\x6e\x75\xbf\x5b\xfd\xb5\x77\x2b\x6d\xb3\x82\x57\x97\x7f\x54\x2b\xdd\xf6\x8f\xd9\x5b\xbd\xa1\xbf\xc3\xa7\xec\xc2\xe7\x10\x5d\xff\xf2\x70\xa6\x47\x64\x2a\x8c\x63\x08\x7f\x63\x0b\x6d\xa9\xc3\x82\x6d\x84\xfc\xb5\xdf\xc1\x2f\x84\x29\xaf\xa6\x48\xd7\xf3\x59\xe8\x0a\x54\xf3\x1c\xb9\xc8\xd2\x7e\xc3\x13\x7a\x2d\x33\xcd\xd2\xcb\x79\xb6\x94\x2d\xca\x84\x8a\xd3\x9b\x40\xda\x14\x0b\x5c\xe1\x98\xc9\x03\x10\xc4\xc0\x09\xd6\xc4\xd3\xe4\xf1\xec\x59\x96\x25\xd7\x10\x5e\x35\x06\x17\xe4\x6c\x93\xc0\x0c\x32\xd6\x66\x07\xde\x87\xe0\xd8\x70\x98\x2e\x4e\x7c\x10\x8c\x80\x2e\x4a\x5e\xfb\x70\xcd\x98\x26\xdd\xfb\x16\x85\x30\x1d\x47\xb1\x7a\xed\x00\x0c\x1a\xf2\xdd\x2b\x11\xe2\x11\x15\xc8\x80\xd7\x04\xf7\x1b\xfc\x77\x85\xb9\xab\xbf\xbc\xb2\x57\xae\xbc\x21\xd6\xb1\xcd\xe8\x33\x66\x2e\xc0\xc1\x8b\x91\x85\xeb\x58\x79\x07\xf7\x46\x0b\xf2\x56\x50\x8d\x3a\xad\xba\x3a\x27\x41\x8c\x12\x5d\x07\xe5\x3d\x45\xaf\xed\x47\x07\x2b\xd4\x33\xb4\x92\xfb\x33\xaf\x19\x97\x5e\xb4\x9e\x1e\x56\x1a\x91\xf0\xa4\x7e\xa3\xe1\x14\x64\x9a\x46\xe5\x32\xb7\x87\xa3\xa7\x57\x8d\x47\x87\xa9\x1e\x8f\x84\xaa\x1b\x10\x38\x30\x68\xdf\x7f\xfe\xc2\x41\x90\x37\xe7\x48\x51\x1a\x4b\xd5\x52\x99\x41\x50\xe2\x09\x49\xa3\xc4\x6f\xf5\xcc\xea\xf0\xd9\x94\xea\xeb\xda\xca\xe2\xd5\x1b\x48\x11\x79\xf8\x1c\xe7\x97\xe5\x8c\x69\xac\xe7\x23\x02\x2c\x23\x63\x51\xa2\xa1\x6f\x3c\xcc\x42\x2d\xb6\x3c\xae\x41\x78\x77\x1c\xcf\x76\x72\x71\xcb\x5f\xda\x23\xc0\x7b\x07\x22\xca\x5d\x87\xf4\xcf\xd1\xe4\x59\x44\xe8\x35\xd7\xad\x9d\xc7\xed\x27\xaf\x9c\x3d\x6c\xe5\xbe\x05\x99\x9f\x4e\x41\xed\xbd\xbe\xab\xd2\xe4\xf3\xf4\x41\x74\xec\xb6\x2c\x5d\x0b\x61\x51\xcb\xcf\xc1\xf1\x32\x0f\xa6\xcd\xcb\x9f\x12\x08\x31\x65\x19\x03\x70\x20\x7d\xfe\x28\xdd\xa8\xe4\x74\x99\x24\x15\x2f\x5c\x94\x66\x11\xb9\x97\xff\xa6\x42\x18\xea\xab\x0a\xcc\x08\x99\xd6\x68\xce\x6b\x6e\xfb\x39\xf6\x9d\xb7\x31\x3d\xb6\x7d\x05\xe8\xdc\xbe\x39\xef\xdb\xb1\xf5\x56\xaa\x0d\xfa\xde\x40\x71\x26\x91\x8c\xb3\x74\x1c\x95\x3d\x63\xf6\xfb\xd5\x7e\x6c\x2a\xb9\x1e\x77\x62\x53\xcd\xf5\xec\xdd\x16\x57\x71\xb8\x98\xdd\x3d\xb8\x3c\x8c\x73\x05\x6e\x38\x04\x27\x04\x56\x4b\x2c\x9b\x7d\xf0\x00\xf4\x0d\x66\x2f\xea\xb7\xe9\x6a\xe7\x3b\x80\x83\x3b\xf4\xbe\x13\xe5\x53\x6b\x75\x29\xf1\xf1\xa9\x51\x32\xd4\xbf\xb8\x67\x9e\x2d\xcd\x13\x0a\x1f\x1f\xbf\x7f\x91\xf5\xda\x2f\xb5\xd8\x64\xa2\x2f\x52\x4a\xd3\xeb\xdb\xee\xef\xd1\x95\xf9\x4b\x46\xd2\x5e\xa7\xe3\x56\x2e\x1f\xc5\x31\x72\x63\x78\xd2\xaf\x37\x40\x36\xec\xd1\x65\xde\x0f\xf4\x1e\xe9\x57\x35\x69\x56\x1e\x19\x7d\x95\x28\xf4\xf8\x1b\x52\xc0\x2d\xdb\x86\x57\x0b\xfd\xc0\x6a\x45\x6f\x5f\x6e\x24\x1a\xd7\xce\x96\xe5\x62\x59\xbe\xca\xa6\x8a\x5d\x73\x5f\x3c\xda\x6a\x11\xce\x7f\x98\x9f\x19\x4d\x2c\x33\xc1\x14\xb7\x86\x31\xd9\x6e\xa0\x18\x0c\xbb\xe5\x32\xf8\x69\x8e\xe3\xe5\x18\x6b\x73\x15\x8d\xc7\x01\xe2\xae\x28\x75\x7e\x12\x8d\xc7\xa7\x3c\x99\xf1\x44\x8a\x14\xfe\x2d\xa8\xfc\xa9\x39\x65\x83\x62\x46\x26\x65\xaf\x8f\x42\x07\xa3\x22\xcb\x51\x5a\x45\xe3\xb1\xd0\x52\x31\x63\x6f\x46\xda\x38\xc1\x25\x16\xe3\x50\x4e\x92\xcc\x74\x46\x55\x37\x60\x19\xda\xfd\x15\x7f\x57\xc2\x97\x36\xdd\xea\x99\x18\x57\xe9\x58\xe1\xae\xe4\x22\xa3\xe1\x7a\xe1\xc7\xe3\xb8\xc1\x96\x7e\xfe\xe8\x1e\x99\xb6\x9b\x3d\x32\xd5\x15\xdf\xaa\xb6\xb1\x33\x2b\x40\x86\x04\x68\xf8\x7e\xb0\xc5\x0e\xdb\xed\x93\x23\x50\xfe\xa1\xfc\x3f\x55\xd2\xb2\x6e\xfa\xdf\xe2\x51\xa3\xf5\xaa\xcd\xfb\xa2\xb1\x96\x1a\xbf\x96\xb3\x29\x0a\x6a\x9e\x5c\xab\x38\xa0\xb0\x2f\x84\x96\x4e\x35\x80\x33\x83\x7a\x7d\x00\xba\xff\x2a\x45\x14\x5e\xd0\x53\xc9\xee\x59\xdb\x67\x95\x03\x30\xac\x26\xbc\x77\xc2\x06\x2e\x35\x8f\x58\x75\x57\xc2\x4d\x7e\xb2\x6e\xe8\x1a\xeb\x49\x1b\x05\xfc\x6d\x7d\x5d\x0e\xfd\xba\xc9\xd7\x8c\x06\x3d\xfa\xbf\xfa\x40\x22\x7a\x0c\x91\xb5\xe1\x10\x7d\x38\x7e\x7e\x1c\xa2\x1c\x33\x83\xac\x00\x15\x19\x37\x9d\x91\x57\x5c\xca\x16\x27\x62\x9a\xae\x01\x2d\x47\xca\x6e\x81\x52\x3c\xc6\x45\x11\xe5\x97\x74\xb1\x40\x04\xec\x82\x92\x5b\x17\xfc\x15\x83\xb7\x68\x74\x91\xe5\x9f\x98\x94\x37\x5f\x26\x25\x59\x24\x5a\x24\x07\x33\x76\x8a\xdf\xbd\xd1\xf0\x21\xf2\xda\x72\x7f\x23\x4c\xb9\x59\x1d\xa6\x19\x83\x68\xde\xb0\x21\x55\x8d\xe1\x98\x6d\x1c\xe6\xc9\x44\x96\x1a\x08\x1c\xf9\x1c\xd8\xac\xd3\xce\x9d\xba\xb0\x67\xbe\xf3\x43\x15\xac\xc5\x4e\x91\x63\xdf\x68\xf6\x93\xfb\x73\xf2\xd5\xd4\x60\x06\xe9\xad\xa7\xf2\x08\xa5\xea\xe7\x04\x6f\x8f\xc9\x01\xf0\x1c\xb9\x59\x8e\x0f\x1b\x2c\x47\x32\x3d\x6e\xd2\x63\x76\xd1\x63\xf9\xc9\x8b\x15\xb8\xb4\x22\xc5\xf8\x7c\x5c\xd5\x1e\xc4\xea\xa7\x9b\xe0\x9a\xf1\x2a\x18\xcf\x90\xab\xe8\x05\xa9\x20\x27\x97\x2b\x0f\x5b\x16\xbc\x83\x81\x23\xcd\x6e\x14\x7f\x1e\x18\xec\x48\x7d\xec\x21\x01\x20\xb8\x10\xfc\xbf\x27\x52\x25\xcb\x61\x3f\x64\xba\xc6\x68\xc4\x4f\x53\x8e\xc4\x9f\xf9\xf3\x6e\x97\x9b\x33\x34\x28\xcf\x44\x15\xfc\xb9\x82\x23\x77\xc2\x1d\xf0\x60\xa4\x3b\x0d\xa7\x8c\xf9\xbb\xfb\x9b\xd1\xfb\x9b\xd1\xbf\xf6\xcd\x28\xbf\x16\xe5\x4f\x7e\xff\x2b\xe2\xeb\xdd\xa9\xc7\x70\x38\x04\x3c\x44\x87\x59\x7a\x8e\x29\x2b\x8a\x78\xc8\x63\x38\x07\xc3\x59\x00\xe2\x16\x8b\x40\x2e\x94\x80\xa3\xa4\xc8\x50\x94\x24\xd9\x45\xc1\xc2\xb3\x83\xa2\xae\x18\xac\xd1\x8a\x84\xe0\xff\x9a\x7c\xc6\xf1\x35\xcb\x5a\x73\xef\x35\xd6\xf8\x8d\x6a\x99\xd9\x41\x8e\xb9\xca\x52\x1e\x38\x7b\xa6\x4a\x14\x5d\x5d\x89\x00\xe9\x2a\xa3\x2b\x75\xa8\xdd\xbe\xad\x0c\x60\x67\x39\x2e\x22\x31\xc5\x2c\xeb\x43\x4f\xe8\x17\x8d\x86\x98\x1e\xe2\x78\x02\xaa\xe6\x3e\xd4\xbe\xe9\xd4\x09\x90\x9c\xef\xeb\x2f\x5a\x8d\x3b\x23\x11\x44\x49\xb6\x03\x47\x2e\x2a\x6a\x52\x4e\x2b\x2e\x7f\x6c\x4b\xd8\x4c\xea\xf7\xf9\x61\x2b\xa0\x93\x70\x8e\x73\x32\x01\xbf\x1e\x39\x1e\x47\x94\xe3\x68\x81\x6a\x1e\x3c\x40\x49\xf4\xeb\x25\x4a\xb2\x28\x46\xf1\x65\x1a\xcd\xc9\x18\x65\x29\x2e\xa0\x35\x3e\x21\xaa\x21\x1e\xcc\x3a\x93\x7a\x02\x80\x12\xf6\xf5\xa2\x71\x07\x8a\xce\xd6\x14\x97\xc7\xf2\x90\xec\xf1\xe0\x4c\x27\x46\x09\xac\x4d\xee\x01\x74\x65\x02\x9f\x12\x71\x4c\xae\xbe\xf5\x30\x34\xfd\x95\x57\x2f\x2c\xbb\xb8\x20\x10\xaf\x44\xeb\x15\x02\x1d\x44\x81\xd9\x09\x3a\x74\x5e\x56\x31\xe1\x7d\x99\x63\xae\x5e\x0c\xe0\x02\x6f\xcc\x56\x07\x3b\x1c\xcf\xf0\x67\x9f\xda\x40\x69\x4d\xad\x04\xcb\x13\x65\x8b\x22\x86\xe6\x93\x87\xd5\xae\x54\xca\x5b\x0a\x7f\x11\x84\xfb\x29\x0f\x4f\x4e\xab\xe2\x8b\xac\x8f\x42\xb1\xde\x38\x98\x2b\x2b\xf9\xae\x09\x3c\xcf\xeb\xa0\x9b\xa1\xd5\xed\xc0\x81\xa3\x4b\x40\x41\xd1\x2f\x17\xa6\xcc\xf4\x7a\xdc\xfc\x48\x44\x65\x16\x40\x91\x1e\x93\xd9\x6e\x0d\xee\xaf\xc2\x95\xae\xb5\x06\xb2\x5c\xdf\xd7\xbb\x9b\xd4\xc8\x4b\x99\xfa\x29\xed\xa0\xc3\x28\xb0\x98\x51\x0a\xf4\x20\xdc\x22\x75\xa1\xaa\x39\x88\x63\xf6\x2c\x42\x2a\xd1\xa2\x34\x46\x05\x2e\x0b\xb4\x5c\x40\x06\x3f\x8d\x00\xcb\x20\x25\xce\xe9\xde\x91\x9d\x73\x61\x8b\xbb\x31\x1d\xac\xad\x69\x4f\x23\x5e\x65\xd3\xe2\xa0\x7c\x5f\x46\x79\xb9\x66\x6b\x1a\x0b\x9c\x4c\x64\xe2\xc4\x7d\xbf\xcc\x59\xb8\x59\x8b\x11\x27\x0c\x27\x13\xc7\x87\x8f\x78\x64\x37\xc5\x25\xd3\x67\xd1\xc2\xd6\x4b\x3b\xd0\x2f\xa8\x61\x16\xd0\x3d\x24\x4e\x9e\x16\xcf\xa0\xad\x0c\x7c\x8c\x03\x32\xa6\xb8\xec\x59\x6f\x7e\xb8\x25\xa3\x73\xca\x19\x0e\x51\x9c\xa5\x5d\xfe\x4a\x94\xf6\x91\xa3\x0d\xcc\x26\xe1\xa2\x5b\x24\x0a\xb3\x23\xf0\x84\x31\x18\x0c\xd0\x2f\x4b\xe6\x08\x98\xb6\x49\x79\xaf\x73\x5e\xae\x78\x18\x59\xf3\x28\xf2\xda\x7e\x01\x6b\xad\x74\x39\x0c\xff\x19\x93\x65\x7a\x0f\xa6\xcc\x90\xb3\xe9\x99\x26\x7b\xbc\x63\x9a\x7d\x1a\xfd\x6b\xf6\xc3\xfa\xf5\x48\x77\x91\x25\x09\x23\x1f\x3f\xd9\x72\xda\x54\x60\x36\x5d\x4a\x95\x08\xa8\x6d\xd3\xd7\xd2\x0c\xd7\x20\x96\xac\x82\x5c\xf8\x8c\x66\xce\x9c\x0a\x23\x0b\x4a\x7a\x62\xac\xbe\x49\xf0\x3d\x9b\xf2\xd1\x44\xd6\xfa\x24\xdf\x96\x3a\x6e\x46\x19\xca\x4c\x19\x86\xa6\x94\xd7\x4f\xad\x04\x55\x49\x28\x0a\xb9\xa4\x73\x2b\xf4\xdc\x8e\x48\x2b\xf5\x01\xd0\x27\xdb\x19\x35\x65\x3c\x6f\xb3\x24\xa1\x7c\x46\xf5\x84\xd1\x60\xc8\x8a\xd0\x73\x1a\x9e\xe3\xb4\x84\x23\xe7\x80\x52\x1c\x0c\x4d\xed\x25\x0b\x6e\x68\x7f\xca\x30\x05\xe4\x78\x14\x9f\x05\xe2\x8a\xca\x48\x0e\x14\x31\xf2\x1c\xdd\x8d\x11\x53\x10\x03\xfd\xd2\xcd\x5a\x44\x2d\x74\x48\xdc\x92\xc9\x02\xe4\x84\xf7\x10\xcb\xcd\x73\x3b\x10\xf0\xd3\xd4\x61\x8e\x61\x4c\x60\xaf\x7d\xe8\x79\xe8\x08\xcc\x8e\x69\xb0\xb5\x0b\x57\x03\x1f\x9a\x86\x6f\x15\x55\x59\xa5\xae\xab\x52\xd9\xe3\x57\xaa\x99\x9d\xd1\x6c\x09\x50\xa5\xc7\xf8\x4a\x6b\x4c\x25\x6c\x2a\x31\xd8\x12\x7d\x35\x68\x07\x0d\x66\x82\x06\x29\x66\xde\x7d\x32\x26\x57\x08\xb7\xac\x91\x19\x7c\xcb\x3d\xac\xca\x57\x6c\xcf\xc9\xd2\xaf\x9d\xe4\xef\xca\x7e\x0f\x52\x7c\xc1\x6f\x9d\x74\x1c\xe8\xbe\xc2\x18\x93\x24\xb1\xe1\x1a\xcf\xcf\x1c\x1b\x96\x7d\x6f\x3c\xf2\x88\xb9\xe3\x51\x23\x1f\x44\x9c\x23\xf3\x73\x61\x0d\xf5\x5a\x0e\x49\x5d\xf6\x52\x53\xd6\xdf\x8d\x7a\xbd\xb3\xb1\xb4\x29\x11\xc4\xae\x1f\x40\xdd\x55\x43\x8e\xe1\x92\x81\x9e\x39\x16\x38\x8d\xc1\xc0\x4d\x4e\x72\x54\x80\xa2\x25\x2d\x28\x85\x4a\x5f\x30\xaa\xa2\x6c\x02\xc0\xb4\x10\x95\x7a\xfa\x4c\xb9\x22\x5b\x5f\xa6\x51\x51\x90\x69\x8a\xe3\x81\xdb\x47\x9b\xa2\x7c\x3c\xd9\x37\x3b\x52\xc6\x1a\x8f\x1a\x26\xc8\xdb\x8c\x6e\x32\xa6\x8d\x44\xd9\x13\xa3\x44\x97\x0e\xa3\x24\xc7\x51\x7c\xa9\xde\xab\x2b\x41\xb1\xb8\x3d\xa5\x99\x82\xac\x90\x5e\x9b\xc6\x45\x26\x3d\xab\x35\xe9\x03\x6e\xd3\xf5\xc8\xa5\x56\x26\xe3\xe2\x3e\xb7\x90\x54\x8a\x2e\x33\x3e\x36\x32\x9f\xe3\x98\x44\x25\x4e\x2e\xed\x66\x39\xb9\x8f\xdb\xd2\xb6\x29\x9d\x40\xf5\xbd\x0a\x4f\x13\x3e\xaf\x55\xba\x26\x9b\xb1\x7c\xba\xfd\xb0\xc1\x68\x77\xb9\x17\x4e\x94\x0e\x7b\x33\x37\x79\x1b\x33\xec\xd3\xfa\x21\xd4\x31\x06\x73\xd4\x47\x63\xcd\x13\xbf\x2e\x75\x07\xa2\xe1\x5a\xbb\x13\xbe\x6e\x3b\x10\x7d\xdf\x6d\x1e\x8f\x23\x39\x64\x0b\x21\x38\x98\x03\x69\xe0\xef\xf0\xb4\x7c\x9e\x9d\x0b\x95\x26\x8a\x8a\xcb\x74\x2c\x0f\x3f\x3e\xc1\xc8\xc7\xb7\x97\x29\xbc\x9d\x36\x10\xa0\xc9\x18\x16\xb6\x1c\xde\xa5\x1b\xc2\xaf\x52\xb3\x21\xf8\x3b\x18\x9d\x5a\x21\xdb\x7d\xce\x13\x1c\x99\xc2\x6b\x72\x22\x4b\xda\x42\xb9\xb5\xa3\x56\xd8\x51\x0e\x87\xe8\x68\xa2\x38\x23\x29\xe4\xbb\xbe\x4b\xcc\xdd\xaf\x20\x52\x22\xe5\xa5\x4b\x95\xbb\x98\x61\x30\xc6\xe0\xa3\xef\x23\xc6\x54\x0b\x44\x4a\x93\xad\x7a\x37\x6a\x87\xd8\xe5\x32\xf3\xed\x1e\x3e\xf4\xf3\x1a\xed\x09\xd5\xf7\x63\x88\x90\xe2\xe1\x6f\x5f\xd1\x3f\x8f\x25\x8f\xe7\xd8\xb6\xde\x4b\xb2\x69\x55\xbb\xc8\x62\x4c\x35\x67\x0b\xa8\x25\xa4\x7b\x42\x85\x3b\x3e\x7f\xc0\x12\x13\xc4\x39\x00\xd8\x03\x6b\x4f\x47\x8e\x9b\x29\x2e\x88\x1f\x3d\x67\x09\x21\xa7\xb1\x5e\x7f\xc0\x76\xe4\x71\x24\x1c\x16\x82\x5b\x15\x1c\x23\xba\xba\x67\x79\x96\x66\xcb\x42\x7a\x2f\xe4\x86\x01\x74\xb7\xb7\x3d\x11\xb1\x6a\xb8\xb0\xdb\xf5\x9a\xd7\x82\x53\x89\x4c\x59\xe9\xb5\x21\x20\xd7\x86\x8e\xd6\xd0\x3c\x87\xb7\x98\xb7\xeb\x06\x7e\xec\x5c\x91\x32\xdc\x3a\xb1\xdf\x6a\x2e\x48\xaf\xcf\x82\x9d\xcd\x36\x57\xa0\xdd\x65\xc1\xf4\xe2\xe3\xb2\xbb\x76\x7f\x21\x7a\x7f\x21\xfa\x27\xbe\x10\x55\x4f\x45\x35\x95\xf5\x4d\xde\x8b\x72\xe0\x15\x6e\x32\x7d\xb1\xdf\x5a\x3f\x31\x4d\x27\x64\xea\x85\x63\x59\x02\xf0\x68\x14\x59\x31\x5d\xc8\x28\x4a\x3d\x71\x5a\x40\x9b\xcc\x02\x4d\x31\x1b\x69\x76\x99\x39\x22\x53\xee\xc1\xc0\xb2\x62\x64\x40\xcf\xc8\xd4\x52\xea\xeb\xd6\x8c\x4c\xe3\x7c\xc5\x20\xae\x24\xec\xb5\xe9\xb4\x4a\xa5\xeb\x96\xb8\xa0\x67\xac\x68\xc3\x90\x8a\x58\xef\xbc\xcf\xd0\xca\x4c\x96\x15\x60\x7b\x52\x09\x44\x8a\xb7\x39\xe6\xd7\xa0\xda\xed\x84\x51\xf7\x48\xa5\x5b\x0d\x8c\xf4\x12\xf4\x20\xc1\xbd\xdf\xa3\xab\x2b\x37\x8f\x9f\x4d\xfd\x99\x38\xca\x13\x42\x8b\x6a\x5d\x4b\x17\xcb\xf2\x39\x9e\x44\xcb\xc4\x7b\x71\xd2\xd4\x47\xba\x23\xdb\xed\xc8\x2b\x5f\x6f\xf4\x16\x4a\x32\x83\x58\x6b\xd1\xe3\x7b\xaa\xfa\x1e\x47\xef\x82\x35\x8a\xdf\xa2\xfb\xf6\x8b\x2e\x26\xa0\xd0\x5a\x2a\xe6\xd8\x68\xd4\x53\xa1\x96\xed\xc1\x83\xa0\xad\x97\xf8\xb3\x67\xe4\x7c\x55\xb1\xc1\x16\x9a\x51\x64\x36\x41\x91\xe1\x1a\x30\x4a\x63\x71\x53\x5a\xc0\x4d\x09\xb3\x0b\xa0\xeb\xee\xe5\x8b\x7f\x5a\xcb\x0d\xea\xa0\x72\xb1\x77\xa1\x09\x5d\xbe\xe1\x62\xd7\x31\x7c\x17\x57\xe4\x42\xdb\xef\xd6\xe9\x0d\xfc\xfd\xc5\xb8\x3c\x86\xeb\x3f\xed\x0a\x16\x3e\xaf\xae\x2c\x1a\x3a\x18\x43\xd8\x05\xcd\xf1\x99\x0e\xef\xf1\xb8\x25\xaa\x85\x3e\x71\x37\x54\xfe\xab\x47\x53\x0e\xd2\xab\x2e\x33\x1e\x2f\x9a\x94\x68\x4e\xa6\x33\x26\x38\x4a\xe7\xc5\x5c\x49\xe5\xb4\x5c\x66\x8d\xed\x96\x99\xd9\xea\x69\x77\x1a\x15\x6f\x73\x32\xc6\xdd\x00\xd1\xdf\xf4\x3f\x98\x3e\xfa\x23\xcd\xd2\x31\xf6\xbd\x4e\xfc\x84\x2f\x6b\xde\x27\x7e\xc2\x97\x6d\x5f\x28\x42\x4d\x0e\x0e\x59\x0d\xfb\x9a\x3d\xc5\x73\x3c\x26\xf3\x28\xe9\xe9\x00\xee\x0b\x31\xf3\x12\xf5\x6b\x13\xb1\xe6\x4a\xf3\xae\x69\xd9\x57\xf5\xdd\x93\xf4\x4d\xa9\xf6\x9e\x5e\x7f\x4b\x7a\xe5\x42\x8c\x43\xb0\x70\x5f\x2a\x62\xff\x70\x6a\xf5\x8a\x36\xad\xe9\xf4\xb3\x29\xce\xf0\xf4\x35\x43\x86\x69\xa4\xcc\xf2\x73\xff\x8b\xd4\xe4\x7d\x1e\xe8\xdb\xdf\xba\x38\x4d\x2b\x0d\x96\x09\x20\x3d\x5a\x64\x02\x7f\x26\x80\x7c\xb3\x41\xd3\x35\x5c\xc0\xeb\x30\x7f\xf5\x0e\x94\xb7\x0d\x1b\x4a\x28\xeb\x3e\x0f\x80\xa4\xfc\x85\x20\x4b\x41\x4e\xa3\xc2\x0f\x37\x8d\x0a\x03\x0a\xc8\x57\x03\x55\xa2\x9d\x96\xaf\x4a\x08\xe3\x35\x2f\xb8\xfe\x54\x56\x9c\xa4\x3f\xaf\x4c\x4a\x22\xca\xcc\x4d\x48\x8a\x07\xbc\xa9\xa5\x2c\x19\x7f\x69\x15\xf2\xb2\x2b\xb6\xdc\xae\xe8\x81\x73\x54\xa0\x9c\x06\x7a\xf3\x41\xb9\x73\xe6\x81\x52\x94\x27\x32\x5b\x90\x5f\x25\x68\x75\x93\x15\x84\x28\xe3\xb9\x2c\xe7\xcb\x24\x2a\xc9\x39\xfe\x29\x2a\x4e\x0a\x78\x97\x56\x55\x95\x03\x6b\xd5\x35\x6d\xac\x61\x2a\xcb\x89\xc1\x9b\xa6\x06\x02\x2e\xc9\xa6\xb6\xe5\x9e\xca\xd0\xa2\xd1\x38\xaa\x25\xd0\x0f\x79\x15\x4b\x9e\xd7\xad\x14\xb6\x49\x8b\xc4\x5b\x6a\xb5\x00\x60\x76\xdb\x93\x3c\x48\xdd\xb5\x54\x0e\x15\xb6\xa0\x71\xb3\x26\xdd\x3e\x05\x6a\x90\x06\x2a\xc3\x21\x92\xae\x7d\xc0\xc7\x1d\x3f\xbd\x22\xc4\x9a\xa2\xf3\xf3\x8a\xcc\x49\xe9\x99\x42\x13\x80\xe3\x4a\x26\x56\xcc\xbb\x91\x6f\x94\x29\xc8\xaf\x3e\x26\xa8\x32\x0d\xe8\x92\xcc\x71\x51\x46\xf3\x45\x65\x11\x09\xa1\xd6\x15\xcb\x48\xab\x56\xae\x91\x5d\x55\xad\x3c\x1a\x6b\x9d\x89\xc9\x64\x42\xc6\xcb\x04\x9e\x67\xb8\x3c\xd4\x06\x32\x07\x92\x95\x51\xf2\xbc\x4d\x05\x16\xa4\x2e\x24\x99\x6b\x86\x83\xab\x65\x6e\xae\x1c\x37\xdb\x15\x41\x48\x89\xe7\x7d\xfb\x61\x96\x63\x1d\x07\x50\xee\x3d\xa4\xb1\xbe\x7c\x9b\x39\x2b\xd8\xb4\xd0\x46\xec\x68\xdd\x62\x99\x25\xd9\xd4\xbb\x9e\xf4\xb5\xed\x5b\x4d\x49\x36\x55\x5a\x14\x77\x49\x41\xbd\xc6\xb2\xd2\x2b\xd4\x17\x95\xa6\xbd\x26\x13\xfa\x65\xf0\x75\x39\x4e\x2b\xc3\x43\x63\x76\xd1\x3d\xbd\x4e\x87\x71\x1b\x15\xb7\xd8\x01\xbc\x95\x18\x4d\x24\xd9\xd4\x53\xb5\x48\xad\xa8\x52\x16\x32\x85\x4e\xd0\xc8\x37\x1f\x90\x2e\x66\xa4\xa0\x7c\x71\x91\x15\xe5\x0d\x4e\x48\x6f\xb3\xa2\x5e\x30\x70\x23\xe9\xd4\xf2\x4f\xb7\x52\x7d\xa2\x69\x27\x75\xe6\x49\xbf\x07\x8b\xe8\x12\xcc\xe3\xf7\x0d\x6d\x87\x9e\xc5\x91\x0c\x49\x65\x99\x78\xc5\x78\x91\xa9\xc3\x5e\x64\xf9\xa7\x0f\xd9\xdb\x3c\x3b\xc7\xd5\x65\x34\x20\xbd\xec\x22\x27\x59\x4e\x34\x8e\xe2\x14\x14\x10\x9a\x83\xf8\x89\x1e\x3f\xc8\x30\x88\x65\xac\x85\x75\x92\x79\xcb\xd0\x79\x8a\x96\x8e\xf6\x8d\xaf\xa7\xe8\x54\xfb\x3c\x43\xa1\xbc\x8d\xbe\x56\xad\x32\x55\x2a\xd3\xaa\x26\x49\x76\x01\xaf\x03\xc4\x31\xb6\xae\xfa\x7a\x6b\x76\x16\x01\x8f\x12\x13\xca\xd2\xe4\x92\xb9\xf5\x2f\x0d\x23\x7b\x61\xe8\xce\x0c\xda\x7d\xef\x33\x84\xb5\x3b\x0a\xed\xb7\x17\xba\x9d\xbb\x7d\xe2\xa2\x7d\x6c\xc5\xbb\xa4\x5a\x1f\xe8\x9f\x1b\x1b\x7a\xb9\x59\x13\xa5\xfb\xc9\xda\x54\x0f\xd7\x13\x36\xa7\x6b\xc0\x2f\xfe\xbc\x20\xf9\xa5\x67\xc5\x6b\xb9\x3a\xb9\x15\xcc\x0b\x88\x17\x9a\xe6\x55\x2d\x01\x0b\xd4\xb3\x00\x80\xb2\x7d\xb2\x84\x05\xd1\xdf\xf3\xad\xca\x77\xd1\x85\x20\x19\x9e\xe2\x05\xd3\xaa\x3f\x28\xc6\x84\xd8\xcb\x57\x94\xd1\x77\xdb\xbf\x17\x1c\x71\x12\x4e\xc5\xd1\x50\xab\x42\x35\x00\x6e\x71\x21\x96\x95\x8f\x39\x0c\x87\xab\xac\x08\x58\x9b\xfa\x6a\xac\x5c\x8c\x6a\xb9\xdd\x62\x25\x59\xda\x5c\x86\xa2\x76\xf4\x2f\x99\xaa\xad\x80\xf1\x05\xbd\xd0\xad\x35\x08\xbb\x8d\x49\xf1\x05\x5c\xcc\xf4\xcc\x90\xc8\xa0\xb1\x1e\x45\xe9\x80\x14\xff\x88\x12\x12\xf7\x20\x64\x01\x4f\x79\x4e\x72\x3c\x2e\x7b\x3e\x75\x35\xf7\x0c\x05\x80\xbc\xc6\x5e\xdf\xd1\x85\xeb\x82\x8e\x8a\x24\x23\x7a\xe0\xa9\xd6\x70\x3e\xe6\xa9\xa8\x45\x15\xbc\x67\x66\x4d\xfc\xda\xd5\x32\x05\xe0\xee\xa1\x05\x6c\x57\x84\x76\x56\x0b\xfd\xfd\x65\x3a\x26\xa9\x5f\x5a\xe1\xfe\x98\xb5\x0b\x84\x75\x33\x09\xb9\xee\x69\x0c\xf1\x0c\x9c\xd9\x80\x2d\x19\x49\xa7\x70\xd4\xf0\x9e\xf0\x5c\x30\xd3\x25\x10\xf7\xce\xd3\x50\x81\x0e\x65\x96\x9f\x91\xe9\x0c\x17\x4d\xe5\x75\x28\x8d\x76\x78\xee\xa7\x34\xbb\x48\xdf\x97\x51\x69\x47\xea\xb7\x73\xab\x1b\xd0\xab\xd8\xb3\x6b\x58\x2c\x93\x04\xc7\x4d\x55\xe8\x50\x15\x87\x4e\xe5\x25\xa8\xc2\x11\x7c\xd3\x3d\x58\xd8\x08\x11\xa8\x7a\x6a\x2a\x68\x28\x69\x5c\x91\x84\x9e\x34\x0d\xd6\x77\x36\x08\xab\xb3\xb4\x92\x36\x2f\x09\xfd\xc9\x5a\x09\x63\xe7\x0b\x3d\x69\x0c\xb6\xea\x16\x35\xac\xcc\xd1\xcb\xf9\x07\x54\x9d\x57\x51\xd6\x56\x4b\x79\xaa\xb0\x41\x8c\xde\x1b\x87\xff\xd0\x9b\xaa\xc3\xeb\xa7\x9a\xd0\x93\xa6\xc3\x5a\x68\xf4\x24\xea\xd0\x36\x17\x0a\x2b\xd2\x19\xf7\x32\x4c\x6f\xd8\x7d\x42\x27\xdc\x7a\x52\xe5\x50\x86\xb2\xf0\x4e\xb8\xb3\x73\x7d\x16\xec\x6c\xdd\x3b\x23\xb8\xb7\xbd\xf9\xaf\xb1\xbd\xe1\x94\x7e\x17\x51\x45\x56\x73\xc1\xde\xd2\xe0\x86\x05\x3d\x31\x2d\x69\x58\xda\x57\xf0\xe5\xde\xde\xfb\x7a\x94\x24\x43\x2b\x3e\x21\x3c\xab\xb4\xa3\x9b\xb8\x3e\xd9\x85\x6d\xb0\x1b\xc8\xa9\xc6\x17\xbb\x2f\x92\xd3\x47\xb6\xb9\x71\x5f\xe1\x7a\x08\xd3\xd5\xfd\x78\xab\x4a\xf9\xee\xa0\xd7\xca\x92\x6e\x57\x2d\x84\x3f\x8b\xe0\x58\x07\x75\x8a\x6f\x1d\x46\x84\x38\xe5\x20\xfc\x53\x87\xb8\x13\x3f\xf2\x74\x7f\xb0\x27\xc3\xf0\x38\x08\xd7\xc0\xea\x25\x8e\x7e\xb2\xc8\xa7\x85\x2e\xeb\xde\x20\x70\xaf\x90\xf1\x55\x94\x33\x78\xce\x0f\xbc\x9e\xbd\x1d\xc9\xa7\x05\x73\x16\xbf\xce\x85\xb7\x76\x1d\xd6\x85\xb1\xda\x4e\xeb\xdd\xfb\xc1\x21\x25\x91\xa3\xc7\x6c\xe3\x8f\xd4\xdc\xc1\xf9\xc7\x66\x3f\x41\xaf\x11\x13\x7b\x0a\x0f\x2d\x11\x51\x17\x99\x4d\x8f\x25\xeb\x0b\x3f\x44\x0a\x34\xce\xf2\xdc\xf5\x0c\x08\x27\xa0\xa8\xc4\x07\xf9\xb4\xf0\x05\x6b\x53\xd1\xa2\x1f\xa2\xbf\xc1\x09\xaa\x40\x5f\xe0\xfc\x74\x4d\xdb\x23\x25\x37\xcd\x37\x9c\x07\x7a\xa6\x4a\x6f\xa7\x72\x8e\xd4\x21\x97\x41\x01\x8a\x1c\x13\x81\x48\x21\x9e\x9e\xf1\x99\x3d\x37\x28\x84\x0c\xaf\x1c\xb0\x79\x82\x2f\x38\x15\x84\x89\x6e\xb5\x11\xbc\xe0\xca\xa3\x4b\xf1\x1e\x89\xcf\xdd\x7a\xcf\x89\xe1\x17\xf5\xa5\x67\x69\x7a\x2e\x76\x54\xf4\xd6\x8d\x01\x07\x67\x5e\x62\x6b\xe1\xd5\xa5\x84\x51\xc6\x2a\x60\x3d\x86\x84\xb3\xba\xc0\x8e\x20\xc4\xf5\xfd\xfd\x2a\x42\x36\x1f\xa0\xd0\xb3\x2f\x0f\xa3\x55\x13\xec\xaa\xe7\xbc\x0b\xaf\xf3\xa4\x2a\x94\x32\x60\x92\xa2\x93\x8a\x11\x0b\x20\x7b\xcb\xc0\x3c\xe4\xe5\x6c\x1a\xca\x83\x72\x85\x57\xd5\x28\x91\xad\x2a\x0b\x9d\x5a\xca\x93\xed\xd7\x92\x9d\x11\x3d\x72\x75\x86\xb1\x2a\xbf\x30\x83\x3e\x56\x44\x95\xbc\x56\xdc\x5c\x5f\x3e\x3d\x4f\x88\xc7\x32\xf3\x3b\x70\x37\x42\x40\xee\xa3\x0a\xe7\xec\x3e\x1f\xdf\xfc\xf9\x81\x36\x5c\x23\xb6\x64\x8d\x49\x4c\x45\xf0\x11\x81\xfa\x9b\x05\x59\xf0\x16\xaf\x9d\xf7\x1b\x85\x5a\xe0\x5e\xa2\x37\x03\xf4\x44\x68\x83\x6a\x9a\x58\xa6\x8b\x68\xfc\xe9\x98\xe9\xa1\x0d\xa3\x2f\x48\x32\x74\x43\x66\x92\xea\x82\xe9\x2d\x47\x54\xc5\x7e\x48\xd2\xdb\x47\xdb\xe8\xa9\x48\x14\x8e\xac\x91\x38\x07\xaa\x97\xdd\xd2\xfd\x74\x95\x1f\x6b\x5d\xc8\x09\x78\x71\x73\x46\xb9\x2e\x45\xf7\xc2\x2b\x43\x98\x9d\x6e\x9e\xa1\xd0\xe7\x6b\xf9\x10\x22\xf8\x46\x5a\xd0\x64\x81\x2c\x3b\x2c\x73\x94\x24\xfa\xe2\x1e\x0c\x06\x62\x7d\x1f\xda\x65\xad\xcd\xc7\xf1\x72\x72\xc4\xb6\x3b\x88\xce\x2a\x40\xe9\x6e\x14\xc9\x1a\x02\x33\xfa\xba\x48\x66\x2e\xbd\xe0\x09\x99\x38\x74\x45\xc6\x23\x9f\x28\x8d\x4d\x57\x18\x02\x8c\x85\x2f\x66\x27\x23\x5a\x07\x8b\xfd\x46\xc1\x39\xda\xbc\xb4\xcb\x67\x15\xc2\xaf\x36\x51\x2d\xf4\xaa\x2a\xc4\xed\x2a\xf1\x6b\xfd\xfb\xa6\x90\xc1\x2c\x23\x3a\xb9\xc7\xc0\x41\x46\xc9\x7f\xdc\xf3\xad\x21\x16\xea\xec\x07\xbc\xf7\x9a\xd2\x97\x5e\x44\x17\x7f\xec\x62\x4a\xa1\xcf\x3c\xee\x0a\x2e\x2d\xe0\xd4\xb5\xfc\xba\xef\x45\xa5\xd2\xd1\x4a\xc6\x87\xcb\x19\x43\x02\xaf\x3a\x30\xba\xe6\xbe\x9f\x82\x52\xfa\x12\xee\x19\xeb\x41\xf3\x19\xed\xbc\x78\x6c\xd3\x60\xe0\xfa\x29\x71\x79\x80\xe6\xa5\x44\x18\xc6\x1b\x6f\xd9\x03\x66\x5c\xb1\x67\xfa\x86\x65\x9d\xc6\xb1\xe3\x07\xbb\xcc\x2f\xad\xe7\x5f\x1a\x28\xbc\xf8\xaa\x1e\x2f\x32\x9e\xa8\x8d\xe1\x8d\x70\xcf\xf1\x34\xc2\x28\x7e\x1f\x61\xaf\x8f\x13\xbb\xf3\xa2\x75\x4d\x92\xa9\xdd\x28\xda\x9c\x2b\xed\x6d\xc3\x2c\xd2\xb8\x2b\x58\x2d\xfc\xa9\x96\x5a\xe3\x9a\x11\x24\xc5\x01\xb9\x45\xe2\x0f\x68\x13\x0e\x35\xc6\x59\xd3\x95\x0e\xf5\xc0\x8f\x51\xca\x9e\xdb\xa6\x31\x77\xc9\x07\x91\x3b\xd3\x47\xe2\xa0\xea\x84\x30\x6d\x58\xae\x46\xd8\x2e\xba\x6e\xac\x79\xe8\x99\xb7\x78\xbc\xba\x46\xf0\xf6\xfe\xd2\x71\x51\x92\x79\x54\xe2\x9f\x22\x50\x20\x36\x51\x95\x06\xde\x44\x51\x7a\xcd\x77\x41\x4d\x5f\x9f\x3a\xda\xcd\x90\x36\xae\xa6\xd9\xf1\x80\x56\xcd\xcc\x3b\xd1\x0c\x16\x11\xa0\x58\xcc\x78\xae\x0b\xe4\xf2\x81\x3f\x3a\xbc\xbb\xb3\xda\xd5\x34\xcd\x55\x53\x0c\xf9\x9b\xcd\x53\x2b\xc4\x8b\x1b\x5d\xbe\x32\x6b\x02\xae\x7b\xa5\xe6\x5b\xc4\x91\xd3\x8b\x0a\x3c\x6b\x64\x5f\x8b\xb0\xdf\x36\xa8\x9c\xac\xff\x46\x71\xe5\x64\xa1\x55\x07\xf9\x35\x83\xcc\x29\x1d\x0d\x1d\x60\xbe\x18\x0b\xef\x45\x05\x3b\x35\x37\x31\x22\x0e\x5d\x6d\x95\x52\x33\x2e\x5e\xf6\x8f\xcd\x95\x90\x11\x6c\x43\x80\xe9\x62\x8a\x11\x33\x42\x9f\x13\xd7\xdd\x97\xa5\x71\x7d\x0a\x3e\x44\x3f\xd2\x1e\x77\x51\xc8\x3e\xac\x9d\xa4\x1b\x38\xc2\x4b\xa8\xdc\x6c\xc9\x3c\xe9\x20\x8c\x0f\xe7\x4c\x65\xb1\x8e\x0b\xf7\x93\x8c\x41\x36\x12\x83\x88\x8e\x51\xb5\xfd\xc8\xb8\x33\xf5\x5b\x8f\x27\x44\x8c\x3e\xc1\xa5\x21\xe8\xac\x9b\xd8\x51\xd6\x38\xb0\xcd\x97\xba\x0c\x25\x5c\x2c\xa8\xb4\xaa\xad\xc2\x42\xe7\x20\x5a\x2c\x92\x4b\xee\xf0\xa5\x15\x61\xf5\x6d\x33\x36\xb6\x05\x58\xcd\xd0\xc4\x1b\xd5\xdd\x30\x0f\x3c\x8c\x8a\x62\x3c\x2a\x92\xca\xad\x43\xa8\x78\x26\xec\x6b\x45\x51\x11\xe9\x6a\xc5\xeb\x1e\x6f\x2a\xc1\xf9\x61\x53\x61\xb8\x0a\xd0\x95\x9a\xbd\x93\x5f\x55\xdc\x14\x91\xd8\x48\x54\x52\x65\x31\xb5\x5b\x0b\x4f\x2d\xf4\xf3\x4f\x19\x42\x46\x94\x05\x02\x27\xf9\x78\x99\x44\xf9\xfa\xfa\xfa\x7a\x7d\xe0\x18\x41\x41\x7b\x77\x12\x3a\x86\x69\x7f\x3b\xe1\xf6\x63\xbf\x1f\x8e\xed\xfb\xdb\xff\xfb\xdb\xff\xbf\xf6\xed\x3f\xbf\xfa\xa7\xb0\x22\xb4\x8f\x3f\x20\xc1\xef\x16\x6a\xc0\x67\x59\x50\x6f\x08\xb0\x36\x1c\x42\xe8\xa2\x28\xa7\xa4\x4c\x77\xb0\x65\x61\x0e\x91\x12\x5c\x4c\x26\x13\x9c\xe3\xb4\x44\x38\x3d\x2f\xa0\xd0\x28\xcf\x2e\x0a\x9c\xaf\x69\x7e\x19\x2f\x48\x1a\x67\x17\xa0\xb1\xd0\x1c\xf6\xa3\x07\x0f\x78\xce\xe0\x9f\xaf\x5f\xbd\x2c\xcb\x05\x77\xf9\xc9\xb8\xa6\x99\x86\xf6\xfd\xb0\xc0\xfa\xb8\xbf\x79\x32\x4d\x33\xca\x08\x12\x92\x62\xda\x93\x34\x8b\xf1\x9a\xe6\xe4\xc9\xa9\x51\x0e\xfc\xf3\x3c\xa1\x23\xe3\x1b\x5b\xb7\xdf\xb6\x91\x6b\x86\xc9\x7f\xbe\x7c\xb7\x6d\x54\x37\xcb\xb7\xbb\xfd\xca\x52\x42\x72\xa0\x2d\xbc\x15\xc8\x74\x4d\x22\x40\x7e\xa2\xa2\x3d\x78\x39\x64\x3e\x91\x69\x2f\xa5\x01\x84\x51\x5e\xdf\xf2\x67\x59\x51\x06\xa8\x24\x73\x9c\x2d\xcb\x80\x56\x98\x07\xa0\x64\xbe\xc8\x72\xee\x76\x02\x36\x13\x0a\x87\xf6\x11\xfc\x77\x75\x85\xba\x9c\xd8\x93\x6c\x1c\x25\x34\x31\x7c\xf2\xcd\xee\x37\x10\x1f\x94\xed\x3d\xac\x42\xba\x13\xf2\x5f\x57\x57\x68\x53\x66\xd3\x66\xd0\x3e\xb4\x26\xd3\x44\xa3\x68\x5f\xb6\xdf\x28\x3c\x2d\x72\xbc\x80\x80\x5b\xf8\xc2\x9a\x32\x4b\x76\xe2\x80\xef\xb4\xb3\x8c\x16\x5e\x1e\x47\xe9\x35\xdc\xb1\xb2\xf8\xf2\x6c\xce\x15\x96\xb9\x77\x3d\xed\xc0\x67\xb6\x65\xb8\x70\xd1\x31\xad\xc9\x5d\x66\x07\xcc\x8b\x40\x5a\x3d\x43\x35\xbb\x41\x61\x84\x44\x79\x18\xdc\x00\xaa\x6c\x84\x94\x78\x05\x43\x7e\xf9\x6e\x5b\x85\xe7\x64\x92\x96\x86\x79\x6d\x22\x28\x8c\xe1\xc3\xcc\xaa\xc8\x18\x0f\xab\x12\xe4\x61\x51\x6b\xb6\xc0\x69\xaf\xfb\xf6\xf8\xfd\x07\x11\x51\x90\x11\x0e\xeb\xdc\xde\x9a\xe6\x10\x0d\xe6\xf6\xc1\x03\x73\x52\x8d\x43\xdf\x12\x0c\x6a\xba\xcf\xa2\x82\x8c\x51\x17\x6d\x40\x17\x9e\x2d\x29\x7b\xd0\xaa\xd8\x40\xdd\x50\x5e\x15\xca\x7a\x06\x65\xc6\x1f\xad\x75\x47\x51\x81\x1f\xef\x76\xad\xf1\x2b\x77\xc0\x2f\x71\x14\xe3\xbc\xd7\x3d\x00\xbe\x4a\x7e\x8d\xd8\x69\x0b\xda\x67\x23\xac\x29\x44\xe5\x63\x9c\x96\x8f\xe8\x41\xbb\x1b\xa0\x2e\x95\xfc\xc9\x18\xaa\x18\xfe\x52\x08\xb5\xa3\xbc\xb1\xe2\x53\xd6\x40\xae\x2c\x70\xc4\x65\x3a\xd6\x0e\xd5\xb6\x26\xd9\x77\xf1\xbc\xd0\xae\xaf\xfd\x21\x82\xeb\x48\xaf\xb0\x43\xc6\x09\x5d\x9a\x4d\x72\x82\x66\x4c\x5a\xe5\x31\x67\x81\x1e\x95\x76\x5f\x61\x2e\x8d\x7b\xf0\x20\x82\x05\x03\x21\x93\x4b\x59\x3f\x47\xb2\x50\xe4\xeb\xde\x7e\x7d\xd6\x00\x87\x59\x9a\x62\xfe\x6c\x41\x50\x98\xa2\x44\xe3\x72\x51\xb4\x2e\xfc\xee\x7f\xc0\x9f\x4b\xa7\x83\x1c\x56\x7b\xad\xc1\xad\xe3\xcd\x6e\xd5\x75\xe9\x1d\xaf\xbf\xe7\x6b\x50\x5f\x25\xed\x43\xc0\x02\x0d\x44\x0d\x44\x70\x20\x39\x4e\x0d\x25\xf0\xac\x1f\x9d\xa0\x0b\xa8\xcc\xc9\x74\x8a\x73\x16\x29\x86\xce\x3e\x88\x2d\xd2\xed\x23\xc5\x41\x13\xc1\x40\x0f\x7c\x54\x63\x06\x7c\x6d\x43\x3f\x60\xbc\xb2\x67\x70\x93\x14\x5c\xf4\x16\x65\x54\xe2\xf1\x2c\x4a\xa7\x7e\x05\x02\x33\xef\x17\x88\x8f\xe2\x4b\x30\xac\x87\x1b\xe1\x5d\xca\x61\x6c\x96\xb7\x6e\x06\x6c\x6d\x41\x31\x0a\x50\xdc\x2a\x69\x91\x80\xec\xcb\xac\x06\x8a\x82\x33\x99\xf7\xd6\x4a\xde\x58\xad\x48\x5b\x48\xbf\xda\xb2\x2f\xb6\x8c\x96\xe9\x59\xf0\xda\x42\xb1\xda\x08\x5c\xcc\x9a\x95\x15\x03\xb5\xf4\x3e\xb0\x52\x3d\x7d\xf3\xe0\x0b\xf9\x6e\x39\x80\xdd\x85\x3a\x26\xc0\x57\x9a\xbe\xae\xd4\x65\x79\x72\x49\xe9\x9d\xbd\x2d\x85\xc5\x45\xa9\xba\x62\x6d\x91\x82\xd7\x8f\x4d\x66\x2a\x85\x00\xa1\xe0\xb4\x85\x01\x7a\x7e\x48\xbb\x25\x9a\x44\x24\xc1\xf1\x00\x1d\xd3\x73\xda\x05\xa1\x67\x8f\x08\x82\x3b\x55\xaf\x26\xad\x4d\xcf\x5c\x28\x7c\x4a\x7d\x86\x0c\x22\x40\xe2\x10\x7d\x27\xff\x84\xbe\x8f\xee\x3e\xf9\x62\x1c\xa2\xee\xf6\x60\x53\x2a\x0f\x85\xfe\xb1\x9b\xe2\xf2\x63\x42\x8a\x12\xa7\x24\x9d\xca\x6c\xa9\x3d\x3c\x33\x0c\xba\x84\x82\x2b\x67\x91\xaa\x5c\xf2\x15\x56\x85\x74\x90\x6a\x12\x1c\x75\x81\x3e\x74\xa1\x2a\x30\x4e\xfb\x54\xcc\xed\x84\x4f\xe8\x2f\x43\x7e\xee\x84\x5b\xdf\xd2\x93\xff\xce\xfd\xc9\xff\xfe\xe4\xff\x17\x3f\xf9\x2b\xc3\x7f\x78\xb4\x78\x47\x46\xff\xd2\x90\x53\x3f\x55\x8e\xc8\x94\xd9\xe0\x0e\x7e\x61\x27\x74\x76\x0f\x12\xbf\xc2\x13\x73\x43\x90\x21\xfb\x2e\xb5\x87\x73\xc6\xc6\xc9\x20\x18\xbb\xb8\x98\xd1\xde\xf7\x4c\x03\xad\xef\x59\x61\xf4\x10\x6d\xbb\x2f\xef\xc0\xe2\x8f\x4a\xf1\xe6\xfb\x43\x54\x1b\x37\xff\x2d\x3f\xd5\x45\x29\x3a\x7a\x76\xf0\x86\x4f\x72\x8c\xbe\xfb\x16\x8d\xb3\xf9\x62\xc9\xc3\x65\x8c\x2e\xd1\x3c\x3b\x27\xe9\x54\x0b\x0a\xb5\x8b\xc6\xb3\x28\x87\xbd\x80\xdd\xcc\xc6\xcc\x94\x4a\x98\xab\x0b\xe8\x04\xb3\x47\x0b\x65\x46\x1b\x64\xb8\x2a\x50\xef\x00\xed\xa3\xad\xcd\x00\x3d\xa3\xff\x6f\x05\x68\x30\x18\x04\xe8\xff\xd0\x3e\xda\xf9\xa6\x4f\x0f\x3b\xa8\x58\xe0\x31\x99\x10\xb6\x90\x8e\xde\x1f\x6f\xed\x3c\xde\x7a\x6c\x9b\x98\x91\x22\x83\x74\x3e\x0e\xd7\x39\xe8\x35\x7b\x13\x4b\x3b\x42\x07\x68\x5e\xad\xe9\x37\xcb\x5c\x92\x8a\x05\x18\x77\x6d\x60\xd6\x6f\xc6\xe7\x1f\x45\xa9\x3e\x8f\x74\x44\xdd\x83\xee\x80\xa2\xe5\x30\x8b\xf1\x41\xd9\xdb\xd4\xb4\xd6\x74\x6c\xdd\xff\x73\xb2\x19\x03\x64\xef\x76\x81\x58\xcb\xec\x64\xb1\xc0\xf9\x61\x54\x28\x55\xb6\x96\x5d\x2c\x47\x45\x99\xf7\x76\xfb\xe2\x45\x2e\x4f\xd8\x0c\x76\xad\x1b\x33\x96\xbb\x48\x48\xd9\xeb\x76\xfb\xe6\x63\xe5\xb4\x6f\x5a\x57\x8d\xb3\x98\x0e\x2e\xf5\x75\x5e\xc8\x87\x00\xf3\xc3\x3e\x3a\xa0\x02\x21\x7c\x7c\xbf\x8f\xfe\xaf\xef\xb8\x72\xf7\xcc\x2c\x9f\x58\x03\x52\xfa\x06\x8d\x31\x7a\x84\x0e\xd0\x06\xda\xda\xd4\xec\x8c\x7c\xee\xcd\x45\x08\x49\xdb\x86\xe9\xba\x3f\xf8\x25\x23\x29\x1d\xa6\x6d\xa9\x38\x5e\x82\xe3\x54\x98\xe2\xd7\xc7\xcf\x29\x61\x6f\x6d\x0a\xa6\xc4\x2d\xfc\x80\xf2\x3d\x14\xf7\xed\xe6\xe3\x5d\x9b\xe0\xe6\x59\xfc\xdd\xb7\x5b\x9b\x55\x84\x66\xd2\x97\x72\x47\xcb\xa8\x89\x17\xae\xa5\xa2\x1c\xcf\x23\x92\x32\xdd\x11\xcd\x53\x77\x8f\xdc\xb9\x8b\xc9\x1e\x38\xb0\xb2\x5b\xde\xee\x5b\x6e\x6b\x80\x59\x09\x30\x69\xf1\xfa\x9d\x61\x22\xa7\x9a\x04\x59\xfb\x28\x2d\x99\x47\x9c\x00\x6d\x6d\xf6\xd1\xff\x9f\x62\x6d\xc3\xa9\x85\x39\xc5\xe1\xe6\xe7\xbe\x17\xb8\xb2\x2e\x59\x52\xd5\x67\xcc\x53\xf3\x3b\x24\x66\x82\x0e\xeb\x80\x1b\xfc\xc3\x85\x3a\x24\xf0\xb7\x0e\x9c\x7d\x8a\xf9\xf2\x4f\xce\x50\x77\x5a\xec\x9f\x04\x6e\x09\xad\x96\x9c\xdb\x55\x27\x58\x68\x53\x3f\x31\xc4\x92\x59\xce\xc5\xeb\x1c\x8b\xa8\x28\xcc\x81\xcc\x71\xfa\x1e\x69\x59\x42\x8c\xa6\x43\xb8\x96\x6c\x4d\xd7\x8a\xd1\x9c\x81\x56\x63\x93\xcf\x80\xa8\x78\x26\x7c\x06\x68\x2f\x15\x78\x50\x47\xb4\xf5\x58\x63\x61\xa3\xa8\xc0\x3b\x8f\xd1\x3e\x94\x51\xea\xa1\x9d\xc7\x86\x09\x40\x1c\x63\xa6\x59\x84\x3d\xb0\xc7\x0a\x05\x68\xeb\x1b\x53\x12\x96\xfd\x7c\x36\x8a\xd2\x1e\x2b\x66\x32\x3f\x6b\x31\x73\xb7\x24\xda\xc2\x7d\x46\x87\x5e\x66\xc6\xee\x45\xa7\x0f\x81\x27\xcd\xfc\x52\xac\x68\xa6\x4c\x02\x7b\xdd\xb7\xcc\xa5\x7f\x9a\x95\x5c\x28\xfb\x9e\xfc\xd0\x99\x82\x44\xc2\xdc\xdd\x4c\x14\x52\x8b\x59\xc4\xa4\x35\xd8\xdf\x3e\x8f\x93\x65\x41\xce\x65\x04\x42\x32\x22\x09\x29\xa5\x80\x33\x8a\xd2\x4f\xc3\x51\x1e\xa5\xe3\x19\x2a\x70\x7e\x4e\xc6\x62\x03\x8c\x98\x63\xcf\xce\xf7\x43\xf2\xc3\xc0\xa6\x21\x19\x0d\xa0\x10\xbb\xd0\x04\xe7\x74\x1b\x8a\x92\x69\x96\x93\x72\x36\x47\x31\x2e\xc6\x39\x19\x31\xb6\xc4\xe5\x1f\x9c\x0e\x2e\xc8\x27\xb2\xc0\x31\x89\x40\x08\xa2\x5f\xc3\xa3\xb4\xc4\x79\x1a\xb1\xa7\x13\x1f\x9f\x45\xe9\xa7\x8f\xdc\xab\xe8\x47\x36\xaf\xff\xbf\x9f\xf8\x48\xd3\xe9\x47\x3a\xc4\x8f\xf0\x96\xe8\x63\x4c\xa6\xc4\x79\xca\x21\xa6\xc6\x47\x91\x23\xb1\xa7\x8a\x19\x10\x3e\x63\xca\xcc\xb3\xcd\xb6\xa0\xd5\x67\xf6\x8a\x1c\x59\x6c\x91\xcf\xe8\x21\xdb\xa7\xba\xff\x7c\xd1\xdd\x5b\xf3\xf2\x4c\xce\x63\x7b\xd6\xce\xdd\xd3\x2b\xd8\x40\xdd\x4d\x10\x95\xa0\x15\xdd\xdc\x85\xa2\xe3\x39\xc5\x06\xda\x47\x3d\x26\x4e\xf5\xbe\x7b\x82\x1e\xa9\x26\xfa\xe2\xd9\xc0\xa3\x6d\x6b\xbf\x95\x5e\x37\xcc\xa6\xb4\x3a\x79\x83\x0d\x6a\x2b\xce\x44\x34\x5c\x01\x61\xb3\x38\xd0\x24\x2d\x4a\x52\x2e\x4b\xe1\x1b\x97\xc4\x38\x2d\xe9\xa6\x65\xfb\x4f\x67\xb5\x1c\xa5\x31\xc9\xb1\x69\xc0\x60\xbe\xb1\x29\x02\x21\xcb\xca\x47\x36\xf0\x6a\xaa\xa3\xb5\xd4\x81\xa6\x3a\xaa\xad\xce\x2a\xbc\xc8\xec\x89\xd7\x5f\xae\x79\x04\x36\x39\x43\xf7\xc5\x87\x97\x74\x1e\xc4\xeb\x16\x1d\x03\x5a\xaa\xec\x5b\xdf\xe2\xd7\x59\x1d\xbf\x16\x4f\xe9\x18\x72\x79\x90\x65\x52\xb0\x97\x72\x3a\x1f\x77\xe4\x4e\xf0\xa0\x52\x29\x6f\xca\xbd\xc8\xa3\xf8\x10\x0a\x0f\xf6\x9c\x8e\xb5\x24\x85\xce\x23\xcd\x3f\x4b\xad\x9c\x40\x74\x3f\x2f\x84\x91\x95\x2e\xfc\x29\x27\x2f\x8d\xba\x72\x89\x05\xe8\x7a\xe5\xeb\x41\x7d\xcc\xca\xb9\xbe\x77\x54\x01\xca\x3c\x5a\x1b\x18\x9b\xae\xad\x71\x47\x69\x51\xc2\xf0\x3f\xff\x7c\x71\xba\xf9\xe8\xbb\xb3\x2f\xdb\xd7\xbd\x17\x1f\x5e\xd2\xdf\x07\x8f\xfe\xef\xec\xcb\xd6\xce\xf5\x95\xfc\xd8\xd9\x0c\x76\xb6\xae\xfb\xff\x33\x1c\x94\xa0\x04\x95\x1b\xb8\xf1\x2e\xaf\x8a\x31\x68\xe0\xec\x79\xde\xd6\x8a\x08\xe3\x4f\x30\xe1\xf4\xef\x45\xdb\x73\xb5\x04\xef\x06\x6f\xcf\xdd\x95\x64\x21\x4e\x0d\x4a\x7f\xdc\xb3\xb3\x0b\xe1\xda\xfd\x79\xdf\xdc\x70\xd8\x13\x44\xd2\x8a\x81\x1b\xdc\xe7\x6e\x86\xee\x65\x23\xad\x06\xbf\xbd\xd9\xca\x6a\x93\x89\x94\x74\xa4\xc5\x72\x4e\x01\x4f\x0a\x7e\x7c\x98\x67\xf1\xa3\xef\xbe\x7d\xb4\xb5\x29\xb3\xe1\x8c\x0b\xbd\x1b\x67\x09\xea\x1d\xbd\x3f\x1e\x1e\xbd\x38\x44\xf4\xdc\x10\x6e\x6f\x6e\xee\xf4\x6d\x9e\xac\x55\xeb\x9e\x42\xb5\x5c\x67\xe0\x22\xaf\xe5\xb0\xf9\x99\x70\x3b\x40\xdb\xed\x6c\x55\x75\xa6\x6a\x6c\x29\x08\x4f\x07\xe8\x9f\xef\x5e\xfc\xe4\x38\x12\x94\x05\xfc\xa3\xa9\xac\xd1\x9d\x54\x0d\xb2\x69\x78\x8a\x00\x7a\xe0\x65\xce\x19\xf2\xb7\x01\xda\xed\xa3\x10\x75\xbb\xad\xc6\x3d\x4e\x08\x3c\x24\x93\x1d\x04\xe5\x13\x49\xed\xf1\x51\x2c\xfc\x74\xf0\x8f\xe3\x1f\xff\x75\xfc\xee\x7f\xed\x59\x85\x3a\x2a\xe6\xd4\xae\xdf\x3b\xb9\x0c\xe8\xd6\x63\xdf\xda\x5a\x7d\xe4\x7c\x35\xf9\xcf\x25\xee\xc1\xc3\x1d\x9a\x53\x81\x33\xbc\xc8\x73\x0e\xd1\xef\x9d\xf8\xe0\x7c\x0e\xc8\x8c\x43\x87\x3b\xe0\x5d\xed\x10\x5b\x79\x94\x11\xe7\x0f\x79\x4a\x31\x4e\xa8\xec\x8c\x62\x9e\x67\xb6\x1e\xf7\x03\xb4\xbd\x29\x5d\x9c\x19\x52\x9e\x40\xaf\x35\x48\x51\xb8\xdd\x02\xad\xf0\x4a\x75\x04\x59\x4c\xa9\xaf\xeb\x15\x3b\xa1\xf9\x79\x7d\x16\xec\xec\xde\xab\xf1\xef\xd5\xf8\x7f\x71\x35\x3e\x57\xe1\x2f\xc6\xf5\xf6\x7b\xb7\xb0\xb8\xeb\xa8\x48\x73\x9d\xbd\x95\x22\x64\x35\xd8\xe9\x31\x3d\xd3\x62\xec\xb5\x04\x5b\x44\xe5\x2c\x40\x29\x36\xac\xbf\x3f\x82\xe6\xc2\x79\x78\x2a\xae\xaa\xf5\x18\xbd\xc2\x6b\x01\xb7\xd7\x01\x1b\x1f\xfa\x1f\x4b\x55\x59\x63\x79\xc3\x0b\x5c\xb1\x14\x09\xbd\x2f\x14\x3a\x54\xe5\xa5\x2b\x4a\xab\xd8\x20\x4b\x7b\x5d\x18\x55\x57\x8f\x69\xd9\x37\xec\xa7\x8b\x8c\x32\x31\xf6\x96\xf0\xe8\xed\x21\x52\xf7\xca\xec\x85\x61\x37\x40\x7a\x28\xf8\x8f\x8c\x0d\xf2\x0b\xef\x9e\xed\x0c\xd3\xdb\x83\x34\xd6\xdb\xd7\x9a\xaf\xac\x0c\xad\xc9\x37\x06\xaf\x8e\xde\x7f\x78\xf1\x06\x56\xd0\xe1\xf1\x9b\x37\x2f\x0e\x3f\x1c\x1d\xbf\x41\xef\x5e\xbc\x7f\x7b\xfc\xe6\xfd\x8b\xf7\x95\xad\xc6\x51\x19\xe9\xcd\xd2\x6f\x7d\x73\x1a\x3e\xe4\x66\x84\xf3\xe8\xf3\x38\x9b\x2f\x12\xfc\x99\x94\x97\x21\x7a\x0c\x94\x65\xf5\x10\x74\xa1\xd2\x0e\x81\x56\xa5\xf6\x9b\xbe\x27\xa0\x09\xb7\x39\xf8\x62\xc6\x23\x86\x83\x5f\x6c\xdb\x4e\xf0\xee\xb0\x38\xcd\xc0\x5f\x62\x74\x31\x23\xe3\x19\x9a\x47\xe5\x78\xc6\xc5\x57\xb6\x09\x51\x86\x16\x1b\xe5\x3c\xf1\x03\xa0\x69\x7f\xc0\x62\xb8\x8e\x72\x7a\x0b\x16\x08\xfe\x70\xa2\x64\xd2\xfb\xe8\x27\xe4\x53\x78\x1b\x47\xe2\x33\xd7\x1d\xba\x2c\x4c\xc7\xca\xc1\xf6\x1c\x28\x3b\xf4\x73\x65\x48\x54\xa8\x86\xf7\xdd\xae\xe8\xda\xc1\xe2\x84\xe4\xd8\xf0\x08\x60\xa3\xab\x6a\x3c\x74\x28\x9e\xd6\x6b\xc0\x55\x7c\x56\xdd\xb4\x45\xfd\xc5\x38\xc1\x25\xae\xab\xc1\x1e\x8c\x8d\x1b\xfd\x15\xf6\xcf\x74\xd7\x02\x42\xe4\x04\xc1\xea\x03\xe5\x0e\xb3\x95\x4a\x99\xb3\x1c\x94\x31\x57\xcb\xa4\x1c\xac\xad\x09\x61\xd0\x24\xe1\x35\x5b\xed\x01\x2f\x32\xa9\xf0\xa7\x78\x9e\x26\x1e\x99\x85\x75\xcf\xaa\xfa\xaa\xb2\xd9\x60\x60\xc9\x6b\xff\x60\x9e\xcd\x95\x83\x5e\xb1\xc4\x9f\xbf\x78\x74\xf8\xf2\xe4\xcd\xff\xbe\x78\x27\xeb\x89\xf1\x78\xb6\x4c\x3f\xe1\x98\xbf\x2a\x61\x2f\x46\xf9\xdf\x20\xc7\x8b\x24\x1a\xe3\xde\xf0\xdf\xd7\xa7\xff\x4e\xff\x9d\x9f\x3d\xfd\xf7\x97\xe1\x34\xe8\x5e\x5f\x3d\x7a\x74\xf5\xa5\xdb\x07\xd7\xc2\x5f\xbc\xf0\xff\x3e\x13\x25\x4e\x79\x99\x33\x5a\xe8\x54\x94\x3a\x3b\xf5\x97\xb3\x4b\x19\x85\x2a\xca\xa8\xb6\xb4\x96\x64\x43\x5a\x19\x7e\xcd\x47\xb3\xbb\x82\x93\x1a\x18\x70\xd7\x2c\x20\x5e\xe3\x2f\xc3\x21\xdc\x81\x62\xee\x0e\x03\x3c\x6d\x40\x05\x6b\x0e\xe9\xd3\xbc\x43\x9a\x65\xae\x5c\xee\x77\xc6\x82\x41\x1b\x88\xbd\x7f\x35\x44\x75\x79\x67\x6d\x71\x32\xd7\xa9\x81\xcf\x16\x0c\xfa\xae\x95\xe2\xd6\x34\xcc\x98\x66\xcd\x5d\x7c\xaa\x33\xfb\x76\x67\x90\x11\xe6\x9d\x1b\x72\x81\xeb\xbb\x74\x8c\x13\x70\xa8\x2f\x1e\x71\x1a\x65\xc6\x09\x8e\x72\x61\xc2\x65\xb5\xc2\x93\xad\x05\xed\x07\x02\x5f\x0d\xa5\xa8\xc8\xb7\xc7\x99\xe5\xed\xbd\x4e\xff\xab\xb5\xab\xe4\x38\xd3\xe1\xaf\x03\xb4\xb5\xb9\xb9\x89\x1e\xb2\xcb\x19\xcf\x5d\xab\xd7\xf1\x03\xbc\xdb\x03\xec\x08\x7c\x51\x0e\x52\x60\x4e\x2f\x2c\x28\x0a\x7f\xd7\xb7\x3a\xaa\xdc\x19\xb3\x48\x04\xa2\xfd\x70\xcb\x4a\xa7\xc3\x8c\x45\xb0\xb8\xde\xa6\xdd\x9e\xa5\xad\xd7\xc1\xb9\xf3\x1f\xca\x23\x7f\xe2\x5b\x68\x14\xc7\x85\x1e\xf0\x99\x5b\x39\xb8\xd2\x18\x53\x0f\x07\x6b\x6c\xc3\x15\x07\x03\x7e\xd6\x26\xcc\x5d\x3d\xe7\x7a\x73\x11\xbd\xde\xe0\xbe\x47\x31\x2b\x15\xe5\x39\x39\xc7\x3a\xc3\x8d\x62\x39\x7b\xa2\xbd\x1a\x0e\xeb\x81\x36\xbc\xd5\xfb\x6d\x4a\x35\x99\x42\xbc\x56\x27\x31\xba\xba\x12\x5f\xa7\x9b\x67\x72\xcb\x84\x2b\x6c\xd6\x37\x05\xcd\x13\xcc\x12\x2c\x51\x97\xe8\xbc\x9b\x17\xda\x97\xbd\xa9\x93\x78\x29\xe8\x40\x36\x2c\xea\x16\xbb\x9a\x58\x47\xfa\x4a\x65\x61\xe1\xb9\x59\x0a\x13\xcb\xe1\xf4\x05\x1a\x77\xba\xbf\xc7\x1a\x9a\x39\x11\xd7\xa0\xd6\xb5\xef\x94\x47\xfb\x49\x96\xf7\x28\x5e\x3e\xe1\x4b\x76\x52\xf4\x0d\xc0\x74\x02\xd3\xf3\x03\x0d\x66\x51\x71\x7c\x91\xbe\x85\x90\x47\xe5\x25\x84\xb4\xb3\xb8\x40\x05\x7a\x3e\xe1\xcb\xb3\x6a\xdb\xce\x6e\x96\xa2\xa3\xb7\x87\x5d\x3b\x16\x3b\x97\x2d\x6a\xea\x74\xcc\x2c\xd4\x32\x39\xd4\x7d\x10\x72\x77\xe3\x48\x3b\x6e\x90\x02\x15\x25\x61\xc1\x48\x48\xac\x11\xb5\x6e\x16\x5a\x89\x70\xbf\x1d\x67\xaf\xfa\xb4\x24\xe4\x00\xba\x7b\xe4\x98\xf7\x23\x60\x54\x60\xf6\x6a\x9a\xa5\x98\x6b\x9e\x7a\xeb\x1f\x6d\xb1\xff\x22\x27\x25\xf8\x4b\xb1\xb8\x91\x06\x62\x1d\xa1\x3e\xba\x67\x28\xe1\x62\x70\xbd\xaa\x76\xae\x40\xf2\x0e\xbd\xee\x05\xc1\x9a\x4e\x3f\x56\xbd\xf8\xbd\xf6\x74\x05\x19\x9b\xec\x9e\xc1\xb9\x57\x40\x91\x40\x53\x33\x96\x90\xe7\x08\xd5\x78\xd6\x14\xbd\x8c\xb5\x67\xbf\xbe\x51\xd5\x58\x3c\xdf\x4c\x6c\x90\x54\xad\x4b\x0d\xe6\x50\x1a\xf7\x51\x64\xfd\xf9\xf6\x49\xcb\xec\x8e\x6b\x13\xad\x33\x8a\xe3\x8e\xe7\x5f\xd9\x12\xac\xac\xd5\x6b\xb3\x4e\x77\xc3\x66\xb7\x1b\xdd\x0e\x2a\x74\xc3\xec\x81\x6e\xa7\xad\xf8\x20\xbc\xd8\xca\x4a\x54\x2c\x17\x8b\x2c\x2f\x41\xb7\xc6\x6e\x6a\xdf\x1e\x22\xa9\x55\xe9\x1a\x8e\x20\xab\x09\xb3\xf5\x4b\x85\x9b\x2c\xc6\x66\x2a\x5b\x89\xc2\xbc\xc7\x7a\xa0\xa9\x5a\x0b\x7a\xcd\xa1\xae\xbd\x9b\x56\x7a\xbb\x71\xf5\xb8\x0a\x83\x8e\x93\xf6\x8a\x57\xda\xd7\x67\xc1\xce\x37\xf7\x2a\xdd\x7b\x95\xee\x7f\x85\x4a\x97\x3f\xac\xb8\xd5\x73\xec\x83\x28\xcf\x52\xf4\xbf\xcb\x79\x74\x4e\x0a\xf4\x7d\x44\x3f\xff\xf6\x89\x7d\x0e\xe6\xd8\xab\xee\x1d\x0e\xd1\x51\x4a\x4a\x12\x25\xe4\x57\x8c\xfe\xce\x7a\x41\x09\x35\x42\x05\x58\x62\x09\x83\x1b\x18\x28\x5d\xaa\x86\x93\xf3\x01\x68\x75\x45\x31\x11\x45\x84\x07\xa0\x3a\x8a\x43\xb4\xd9\x74\xf3\xc6\xac\x3d\xe8\xf0\x6d\xb7\xba\x5e\x33\x13\xaf\x3b\x5d\xf5\x0a\x4d\xc4\xba\x9a\x08\x84\x42\x4b\xca\xa0\xc7\xe3\x84\x97\xbd\x4e\x09\x34\x55\xcf\x44\x54\x23\xb2\x84\xef\x5d\xaf\x1b\x22\x6d\x04\xb4\x3d\xa7\xf7\xc3\x35\x8e\x9e\x0a\x57\xbc\xac\xad\x80\x37\x66\x38\x4d\x65\x59\xfd\x2a\xd5\xb2\x68\xd2\x31\xe6\x91\x66\xbb\xeb\x5d\x2d\xea\x54\x14\x9f\xd3\x33\xaa\x98\x1d\x74\xf4\x1c\x72\x44\xef\xe4\xa4\x6d\x6c\x54\xf9\x19\xf2\xbf\xfe\x61\x6f\x85\x9c\x6a\x54\xb6\x78\x1e\xc4\x47\x2a\xd3\xc5\xbb\x20\xf6\x3f\x3d\x30\x89\x17\x42\xed\x0d\x2f\x04\x0e\xe4\xe1\x51\x18\x10\xf9\x4d\x75\xa4\xb2\xae\x29\xf2\x99\xe7\x65\xb6\xd5\x80\xdf\x3c\x43\xa0\xc1\x6a\xcf\x8a\x09\xcc\x12\xad\xcb\x50\xe6\xd3\x47\xd3\x39\x73\xa0\xa7\xb2\xed\x01\x3e\xc7\xf9\x65\x4f\x78\x43\x7e\x4f\xd2\x69\x82\x5f\x33\x84\xf7\x51\x88\xbc\x19\xaa\x26\x3e\xad\xb2\x23\x7e\x70\x3e\x81\xf2\xa0\x25\x85\x77\x41\x37\x9a\x05\x91\x48\x63\x14\x69\xd8\x16\xf1\x0c\x31\x3f\xfb\xfb\xfb\x8c\x6a\x74\x20\xee\x76\x41\xc0\xd2\x33\x37\x05\x63\xd7\xba\x5d\x5f\x75\x5c\x86\xb5\x7c\x4a\x0e\x87\x2c\x34\x9f\x4c\xe2\x5e\xd9\x75\xe6\x22\xd6\x63\x2b\x7f\xf2\x8c\x11\x8d\xe0\x3d\x5a\x03\x3b\x7a\x46\x81\xaa\x5d\x7c\xf3\x8e\x5b\xfc\x85\xd5\x55\x30\xa6\xca\xab\x12\x02\x4e\xdc\x07\xe5\x11\x5f\x14\x3d\xc1\x7b\xfa\x68\x42\x70\x12\x5b\xa6\x07\xbc\x15\xa3\xa7\x16\xcf\xd1\x3b\x68\x31\x1e\xd6\x35\x8b\x0c\x45\xb2\x15\xf5\x41\x90\x85\xeb\x08\xcb\x61\x6f\x02\x76\x20\x58\x9b\xf8\xe6\x2c\xce\xd4\xc3\x3b\xb2\x22\xaf\x8f\xcb\x89\x54\x0c\x7c\x7c\x2f\x06\xde\x8b\x81\x7f\x6d\x31\x50\xbd\xcf\x63\x8b\xe6\xae\x5e\xe8\xdd\xcd\xdd\x3d\x05\x79\x2d\xd4\x8d\x95\xc6\xca\x70\x4e\xe4\x91\x5a\x84\x15\x32\xfd\xd4\x4e\x91\xdc\xe5\x9a\xc8\xa5\x9f\xc6\xc5\x3d\xf0\x3c\x95\xaf\x24\x83\x4d\x0d\x0c\x7c\xf2\xeb\x41\x09\x95\x21\xb4\x9e\xa1\x95\x60\x9e\x9e\x7d\x45\xac\x1c\x43\xe9\x0a\x1a\x83\xd7\x51\x1a\x4d\xb1\x7a\x9d\x4f\x59\x16\x43\x85\xa1\x0a\x10\x2e\x3c\x14\xb8\xb6\xdf\xcf\x0d\x0c\x39\x15\xe7\xf3\x06\xfb\xf7\x18\x53\x0e\x43\x52\xd3\xbf\xa7\x25\xfe\x8d\xa2\x82\xf9\x5c\xa8\x8a\x44\x31\xc5\xe0\xa5\xd2\xb3\x49\x99\x9e\xe6\x6d\xc7\xa2\xa2\x4d\xb3\x3d\x20\x31\x07\x11\xbc\x8d\xca\x58\x13\x86\x3b\x51\x2d\x7c\x8e\x24\x0e\x69\xc7\x27\x7c\x19\x16\x54\xb0\x91\x29\x4d\x6e\x8e\x99\x33\x4e\x75\x49\xc1\x43\x73\xf0\x6d\x57\x8e\x73\x80\x5e\x53\x56\x4e\x70\xc1\x83\x48\x03\x3e\x1c\x2f\x94\x86\x67\xcf\xd6\x78\x13\x83\xba\x7a\xb3\x4c\x12\xe5\x18\x23\xa0\x52\x24\xfe\x4c\xe0\xda\xcc\x87\xbb\x3f\x66\xfc\xa1\x3b\x0b\xbb\x83\xd6\xbe\x56\xdc\x1d\x07\x93\xad\xa2\xed\xd8\x01\x4e\x64\x28\x19\xf3\x20\x86\x1a\xc2\xc7\xbc\x7b\x7b\xc8\x23\x4c\xd4\xc7\x8e\x51\x68\xe3\xae\x5e\x19\xe1\x01\xd2\xe5\x89\xd3\x46\x13\x03\x3d\xa2\x90\x2e\x96\x0c\xa2\x93\x49\x1e\x74\x68\xb5\xd4\x62\x63\xdd\xc3\x5d\x2b\x28\xc8\xf7\xb8\xd1\x53\xda\x92\x21\xa5\xd3\xc5\x00\x41\x90\xec\xba\x10\x52\xe8\xa9\xfa\xcd\xa8\x1b\x8a\x9c\x51\x76\xa0\x7d\x36\x78\xd6\x77\xb0\xce\xf8\xbd\x8c\x5e\xab\x63\xde\x45\x3c\x73\xc0\x5b\x7f\x56\x34\xdd\x11\x57\xe0\xde\x13\x23\xc5\x0c\x96\xab\xa3\xd0\xde\xac\xc0\xd9\x0c\x1c\x7b\x9e\x7a\x01\x64\x55\xde\xd8\x24\x1c\x17\xbe\x90\x45\xe2\xfd\x94\xa0\xc3\x15\x22\x17\x45\x62\xdd\xb6\x42\x42\xbb\x18\x44\xba\x3b\x56\xbe\x8f\xd8\x5e\x92\x57\x76\xbe\xcc\xe5\x09\x00\xd6\x96\x81\x0e\x08\x79\x46\x80\x21\x79\x4c\xf1\x6b\x41\x84\x3a\x03\x34\x4b\x15\xca\x8c\x3a\xb7\xca\xba\x8a\xc3\x41\x95\x70\x91\xcb\xf0\x69\x4a\x5b\xa3\x5f\x74\x74\xd1\x0c\x31\xb4\xd1\x92\x24\x31\x20\x8c\x0f\x8a\x66\x3a\xfe\x6d\x81\xe1\x7f\x38\x7e\x7e\xbc\xbe\xbe\x0e\xe2\x7d\xb7\x40\xcb\x69\x72\x39\xe0\x51\xc4\xe8\x81\x60\x59\xd0\x3d\xb1\x94\xad\xa4\x9a\x4b\x59\xfa\x5b\xd8\xd5\xc8\x1b\x12\xca\x38\x20\x43\xbe\xb7\xde\x32\x22\x3d\x8d\x7e\x39\xa5\xd9\xa7\x9b\x67\x67\x54\xec\xd2\x3f\xaf\xae\xa4\xdd\xa6\x0d\xca\x7e\x6c\x41\x19\x3a\x96\x3d\xff\x55\x91\x55\x3b\x40\x22\x8d\x0b\x3b\xe8\x95\x88\xaa\xba\x45\x95\x97\xea\xca\xe8\x94\x85\x40\x49\xfd\xcf\xb2\x90\xe3\xe7\x9b\xcb\xef\xea\x34\xbc\x8a\x1f\x68\x64\x45\xb0\xf0\x85\x2a\x30\xce\xea\xd0\x96\x29\x51\xaa\x8b\x29\x75\x3f\x63\xc4\x62\x91\xe6\x75\x1e\xd3\x3c\xbb\x61\x06\xcf\xdb\xd1\x99\x99\x34\x8a\xb4\x0c\x68\xbc\xe1\x54\xcc\xee\x1a\xd5\x54\x0f\xc1\xbe\x86\xe2\xa4\x42\xb3\xda\x7a\x7a\x16\x61\xae\x70\xda\xec\xce\x51\x70\xc8\x65\x8e\xe1\x86\xf4\xdd\xdb\x43\xe9\x81\x89\x99\xb2\x8c\xa3\x54\x0a\x9b\x24\xe5\x4a\x17\xbf\xaf\xa7\xdc\xf5\xf5\x38\x18\x0c\xae\xf5\xf8\x6e\xb6\x2f\x3d\xa5\xc9\x14\x45\x3d\x9c\xb4\xc9\xa7\x7d\xa5\xbb\xf9\x55\x88\x50\xd0\x80\xe9\x93\x5e\x9f\xb5\x2a\x44\xf3\x92\x15\x8a\x9d\xd7\xc2\x06\xa6\xed\xf5\xdf\xb7\xf7\x7a\x9f\x7b\xbd\xcf\x5f\x5b\xef\xc3\x95\x3e\xf1\xe8\x16\x37\x7f\x3e\xbd\x8f\xd4\xd6\xe8\x8a\x1f\xc6\x9c\xa4\x46\xe7\xf9\x33\x83\x8f\xd0\x61\x98\x2e\x3f\x1c\x4d\x05\x8c\xd4\x4a\xde\xab\x09\x14\xb6\xa6\xe4\xa5\xa2\xe7\xb1\xe9\xe7\x17\x5c\xe8\x0b\xb2\xa4\x2b\x4b\x0e\xea\xd1\x9a\xb5\x9d\x85\x03\x39\x6a\x97\x9e\xaf\x83\x96\xbe\x59\xed\xf2\xd5\x01\x8b\x16\xcb\x52\x3e\x5e\x4b\xf1\x05\xc7\x66\x4f\x6d\x97\x54\xe8\x08\x51\x57\xc2\x59\x71\x34\x42\xd4\x8d\x47\x1f\x7d\xb9\x42\x4c\xdc\x91\x7d\x92\x8d\x4e\x71\xbb\x46\x25\x9c\xb7\x51\x5f\xae\x68\x74\xdb\x6d\x74\xb1\x2c\x5f\xe2\xcf\xcd\xc3\x7c\x89\x3f\x57\x8d\xd1\xcc\xaa\x1f\x60\x73\x5b\x0c\xa8\x6a\x68\xfe\xb6\xac\x71\xf1\xcd\xe8\x54\xc1\x89\x89\x08\x14\x92\x03\x3e\xf4\x80\x77\x0b\x80\xcf\x2a\x76\xae\xe7\xcf\xd4\xae\xc5\x68\xa7\x13\xee\xc0\x16\xf5\xe4\x7e\x8b\xba\xdf\xa2\xfe\xda\x5b\x94\xba\x9a\xc0\xe5\xec\x46\xf7\x12\x1c\xf8\x6e\x5f\x25\x56\x44\xff\xf7\x85\xff\xf7\x5d\x82\xf8\xef\x41\x1a\xb6\x4d\x0a\x22\xcc\x91\x2d\xa0\x05\x4f\x16\x60\xe3\xaa\xf6\xc6\x59\x3a\x21\x53\x01\xa6\x85\xc2\xd1\xa1\x45\x64\x15\x01\x76\xc1\x9f\xad\x19\x17\x34\x3c\x51\xc0\xfc\xc8\x42\x81\x5b\xc8\x80\x44\x01\x72\x54\xbc\xbf\x4c\xc7\x6c\x8b\xd1\xa1\x0a\x96\x2a\xc0\x28\x2b\xce\xb1\x0d\xc4\x53\x65\x5d\xcc\x41\x91\x0e\x41\x46\x51\x2a\xb2\x99\xd7\x43\xa7\x3f\x22\x59\x0a\x21\xe0\x33\xad\xcd\x9d\x81\xd4\x79\xf3\x37\x82\xa0\x04\xdc\x3c\xeb\xa3\x07\x0f\x10\xff\x3d\x00\x9d\xe0\xf1\xa4\xd7\xdd\xfc\xdc\x65\xae\x4b\x36\xfb\xe8\x29\xea\xe0\x72\x46\x77\x0f\x08\x4c\xfa\xec\xf2\x65\x54\xcc\x3a\x28\xb4\x93\x99\x46\xb7\xa3\xa4\x04\x2d\xfe\xd3\x8f\x79\x36\x7f\xf6\x1b\xf4\xb4\xcb\xbb\xa4\x85\x15\x7a\x76\x09\x0d\xd3\x4e\x1f\xa4\xf1\x11\x2d\x27\xa3\x79\x79\x21\xd9\x38\x24\xac\x1a\xcf\x32\x1d\x27\xf8\x37\x1a\xc0\x09\x6d\xab\xa1\xeb\x3a\x4c\x65\xa7\xc5\xfc\x68\xe3\x3c\xcc\x96\x69\xab\x6b\xa6\x3b\x18\x87\xb7\x6d\x46\x42\xfa\x50\x2a\xc0\xd8\xa8\x9c\x29\xf8\x0d\xfb\x7f\x22\x1b\xd4\x26\xc3\x99\x04\x1d\xc0\xe8\xb3\xec\xde\x8b\x72\x76\xd7\x07\x84\xd6\x87\x83\x3b\x3a\x1b\x40\x00\xe0\xea\xb3\x01\x53\x7d\x30\x2e\x4e\xb0\xb7\x47\x0b\xbd\x33\x8b\x86\x7e\x2c\x6e\xd0\x05\xed\x8e\x9b\x71\x57\xe6\xff\x02\xe9\x1e\xba\x8f\x9e\x1d\xbc\xb1\x82\x91\x71\x9e\xca\xb4\x32\xec\x01\x2d\xd7\xcd\x5c\xaf\xad\xb1\xde\x0d\x98\x65\x94\x7c\x4b\xf3\xa2\x9c\x29\x6d\x50\x80\xba\x7a\xe8\xe6\x6e\xc0\x87\x39\xc5\x65\x58\xa1\xf3\x14\xbe\x4a\x07\x7a\x41\x3e\x92\x80\xeb\xe9\x8c\xc2\xe7\x51\x62\x44\x19\x1b\x58\x81\xb3\xcf\xa3\xc4\x71\x46\x22\xd3\xae\xd7\x00\x3d\x2b\x0d\x85\xfb\xf9\xbb\xc9\x60\x78\xd1\x9b\x0c\x87\x17\x6d\x39\xa0\x36\x67\x51\xca\x5d\xa2\x04\x2c\x37\x1b\x4f\x4e\x1c\xd0\x3d\x3d\x09\x36\xe5\xe4\xcb\x23\x94\x66\xcd\x69\x5c\xe1\x85\xe8\x54\x09\x54\xec\x7a\x8f\xbb\xd1\xfc\x51\xdd\xe6\xd9\x10\x7a\xe4\x73\xc6\x4f\x24\xb0\x16\x3a\xd2\xba\xc7\x0a\xf5\x6a\x58\x9e\xf4\x59\x23\x81\x2a\x8e\xcd\x59\x1e\x4d\xf1\x41\xd9\xe6\xe4\xcc\x41\x2b\x71\xe4\x83\x90\x87\xda\x1a\x2c\xb1\x75\xc7\x38\x76\x99\xc1\xc9\x72\x15\xb4\x78\x07\xc6\x9d\x3b\x36\x8c\x89\x42\x55\x0e\xc7\xca\xfc\xed\xe7\xdb\x3b\x30\xb1\xea\x9b\xe8\x99\xb1\x23\x6b\x68\x52\x64\xbc\xdd\xb0\x7c\xbd\x0d\x9c\x25\xae\xec\x5f\xe9\xe2\x45\xd7\xab\xd1\x2f\x6d\xa2\x9e\x76\x61\xff\x6d\xc6\x04\x80\x39\x98\x90\x12\xdd\xd7\xc0\x84\x46\xca\xb7\x18\x74\xb0\x56\x41\xd9\xf3\x05\x49\xd8\xe1\xad\x91\xbc\x39\x68\x0d\x8d\xbb\x10\x02\x0f\x9b\xd5\xf4\x67\xcb\x6b\x2d\xe9\xd1\x2e\xe6\x74\xab\x4e\x64\x75\x3b\xb8\x75\xcb\x89\xaa\x9b\x1b\x31\x85\xcf\xf1\x98\xcc\xa3\xa4\x1a\x15\x4a\x0a\x6c\x89\x04\x55\xa0\x82\x28\xff\xb8\x03\x36\x85\xa7\x86\xc1\x56\xc7\x4a\xae\x38\x82\x81\x7c\x5d\x3b\xe8\xe6\x15\xa4\x55\x58\xcf\x3c\x3e\x78\x4e\xa8\x2b\x8d\x49\x96\x72\x06\x57\x75\xf8\xfd\x23\x71\x9a\x9b\xe0\xe9\x1d\x1e\x63\xb2\x68\x41\xe6\x6e\x99\x36\x04\xe0\x82\xde\x96\x02\x78\x8d\xad\x07\xd8\x72\x15\x37\x72\x31\xcf\xe0\x6c\xc0\x36\x14\xc0\xc4\xa2\x3b\x12\x10\x1b\x97\x37\x3d\x20\xbd\x8b\x2e\xda\x2f\x71\xb7\x80\x1f\x11\xb5\x70\x6d\x38\x1b\xc5\x83\x47\x16\x72\x43\x4b\x37\xf5\xb6\x55\x57\x6f\xde\x4f\x7b\xa6\x7c\x6b\xcc\x37\x0e\x32\x4d\x57\x18\x87\x09\x5d\x31\x8e\x4a\xa0\xaf\x3c\x8e\x16\x9d\xaf\xee\xf1\x9d\xcb\xda\x15\x84\xc3\x8d\xbb\xea\x3a\x0a\x81\xff\xbd\x1d\xb5\x72\x6e\xd2\x51\xba\x17\xdc\xd9\x89\xc0\x8c\x90\x5e\x37\x26\x0d\xd2\x3f\x34\x3f\xc0\x4d\x28\xc6\x18\xe1\xad\xb8\xd2\x98\xc9\xa7\x22\xae\x79\xd3\xb4\x31\xe8\x81\x08\x76\x5e\x31\x85\x66\x9d\xbe\xb1\x56\x76\xe4\xd5\xab\x57\x2d\xfb\x90\x54\x52\x90\xac\x69\xa5\x96\xdf\xe3\x7c\x81\x1b\xb7\x27\x89\x01\x06\x5d\x8f\x00\x07\xa6\xa6\x17\xc5\x72\x34\x27\xe5\xcf\x59\xde\x24\x25\x29\xc0\x8a\x95\xee\xcb\xaf\xbf\xfa\x6e\xd1\x2a\x87\xaa\xdc\x8a\x2b\xda\xb3\x8e\x38\xce\xf5\xb7\x52\xfc\x04\x7a\x9a\x54\x74\x18\xa9\x87\x59\x6c\x82\xc1\x12\x36\x52\x40\xf6\xb7\x0a\xf1\x03\x98\x5b\xd2\x16\x1f\x5c\x08\x75\x94\x30\xf2\xb4\x82\x55\xe9\x52\x30\xad\x02\xe0\xb2\x53\x55\xb6\xd5\xa8\x69\xd0\xab\x31\x12\x95\xe8\x8a\x01\x5a\x9e\xb9\x5f\x99\x85\x2a\x4b\x68\xcd\x9b\x2b\xda\xc9\x78\xf5\xea\x95\x0b\xcc\xa8\x5f\xab\x52\x12\xa6\x31\x68\x9a\x00\xdf\xdc\xc2\x81\xc5\x64\x93\xca\xee\x3a\x1f\xcd\x8a\x8e\x28\xe9\x4a\xad\xab\x69\x3a\x2a\x17\x2e\x49\x47\x51\xa1\x2b\x2a\x78\x07\x80\x51\xf2\x75\xcb\x61\x24\xc8\x75\x3f\x58\xa1\x8d\x39\x49\x4d\xeb\x16\xa7\x05\x0e\x71\xc3\xfa\x67\x51\x31\xcb\xa3\xb2\x76\x0c\x15\x30\xad\x76\x86\xd5\x7b\x24\x6e\x67\x6b\x3a\xe4\x07\x69\x3e\x67\xf0\xeb\x60\xf3\x70\xb1\x7a\x0f\xa7\x51\xf1\x36\x27\xe3\x5a\x9c\x55\xc0\xdc\x58\x09\xbc\x7a\x2f\x79\xd8\xa1\xa2\xae\x97\x12\xe6\x86\x6d\x8c\xb4\x2b\xb4\x9a\x66\xaa\xc1\xbe\x12\x0d\x89\x98\x0c\xff\x60\xb6\x36\x75\x7d\xb3\x41\xb5\x16\x75\x16\x62\x5c\xbb\x0c\xc6\xca\x8e\x41\xbb\xd2\x1c\x11\xe3\xc5\x42\x34\x2e\xb3\x5c\x88\x3f\xc2\xf2\x01\xcc\x88\x03\x44\x61\x0d\x5b\x62\x0e\xed\x6b\x6c\x22\x2c\x1d\x9c\xa7\xa8\x81\xf6\xdc\x8e\x41\x1d\xe6\x18\x2c\x95\xe0\xf1\xd8\xa1\x65\x4e\xaf\xc5\x29\x62\xd6\x13\xaa\x1e\x8a\x0a\x11\x6e\xde\xba\xb1\x0b\x84\x39\xc6\x00\x97\xb3\x5e\x3f\x70\x49\xf6\x55\x36\xd5\x64\xe3\x76\x5d\xf2\x0d\x54\x19\x62\xd4\xbb\xd0\x17\xd8\xef\xf1\x02\x83\x69\x92\x8d\xa2\x64\x40\x91\x3a\x88\xdc\x64\x1e\xf3\xcc\xd7\x24\x19\x47\x8b\x37\x37\x6d\x96\x16\x76\x1a\x65\x89\x75\x4d\x6a\x56\x29\xaa\x41\xfb\xe9\x83\x1e\x53\x4a\x14\xe8\xf9\xa7\xa7\xc9\x1b\xd5\x8b\x72\xa6\xec\xf9\x2c\xc3\x9c\x4e\xb8\xf5\x24\xe8\x38\x06\x42\xdc\x40\x5d\x59\xe6\x74\xc2\xed\x6f\x20\x81\xcd\x69\x27\xdc\xfe\x8e\x7d\x4a\x5a\xe8\x84\x3b\xac\x08\x19\x45\x69\x27\xdc\xd9\x09\x4c\xf3\x41\xf8\xe4\x48\xea\x84\xbb\xbb\xf0\x2d\xcc\x88\x3a\xe1\x2e\xab\x9e\x73\xf6\x4e\xb8\xcb\xba\x25\x2e\x7b\x3b\xe1\x2e\x6d\x50\x18\x01\x75\xc2\xdd\x9d\xeb\xb3\x60\xe7\xbb\x7b\x7b\xc4\x7b\x7b\xc4\xbf\xb6\x3d\x62\x95\x31\xe2\xad\x6d\xe6\xdb\x9b\x09\xb6\xb0\x01\x04\xb8\x37\xb8\xfc\x9a\x26\xf6\x90\xda\x6c\xb2\xa2\x8c\xeb\x6f\x62\xb3\xd2\xc2\xa4\x7e\x38\x1c\x2a\x9f\x34\x3e\x3f\x37\x3c\x60\x23\x65\xf1\x50\x1d\xfe\xff\xd8\x7b\xf7\xb5\xb6\x91\x65\x71\xf4\xef\xe4\x29\x7a\xe6\x77\xd6\xc4\x0e\x02\x7c\x87\x90\x30\x7b\x13\x03\x81\x95\x10\xf8\x01\x99\x99\xb5\xf9\x98\x7c\xb2\xd5\xc6\x4a\x6c\xc9\x5b\x92\xc1\x64\xc2\x7a\x9f\xf3\x1c\xe7\xc5\xce\xd7\xd5\x17\xf5\x55\x96\xb9\x64\x32\xb3\x60\xed\x9d\xb1\xa4\xee\xea\xea\xee\xea\xea\xea\xea\xba\x64\x43\xe4\x4f\x42\x09\xf7\x07\x3a\x90\x98\xc9\xe8\x35\x81\x47\xcd\x58\x7f\x5b\xe1\x0a\xe3\x44\xd7\x8d\x1b\xad\xb8\x0a\x2d\x20\xf0\xc9\xe2\x97\xb1\xa9\xbd\xc7\x99\x65\x53\x53\x37\x2f\x79\x77\xb9\x39\xf7\x5a\xb5\xc7\xdd\xe2\x71\xb7\xf8\x7b\xef\x16\xdf\xa9\xf5\xfa\xfd\x19\x9a\x97\xb4\x83\xcf\x4d\x39\x8f\x70\x92\xc6\x91\x3f\x7a\xb4\xe7\x7c\x68\x7b\xce\x9b\x72\x16\x7e\x11\xbe\xca\xcd\x06\x8b\xf4\xc3\x79\x41\x53\x45\x3c\x61\xb3\xfa\xd1\x5a\xe8\x0e\x37\x94\xe1\x98\x6c\x04\xc7\xfe\xd5\x5b\x3c\xef\xe6\x42\x2e\xfa\xcc\x7b\xfa\xe4\x89\x8e\x9b\x51\xa0\xc0\x33\xad\xfc\x4d\x9c\xd9\x8e\xf8\x20\x19\xee\x3d\x79\x52\xf2\x6e\xba\xf4\x15\x1c\xee\x1f\xe3\x7e\x7c\x49\x83\x43\x15\xdd\x59\xf1\x72\x56\x5c\xd5\xaf\x05\x03\x32\x8d\x46\x71\xff\x73\x39\x4a\x51\xca\x16\x10\x8b\xab\x5c\x19\x83\xc7\x72\xe3\xe6\x1c\xbd\x7b\xbe\xf9\xce\xe7\x7e\xee\xf5\xf7\x22\xd7\x9c\xb6\x6b\x63\x67\x97\xca\xcf\x4f\xb9\xd9\x29\x9e\x9b\x45\xee\x32\xf5\xb9\xd1\x90\xb7\x49\xd6\xac\x61\xa9\x11\x69\xf1\xe6\x6f\x15\x0a\x92\x6e\x4f\x38\x55\xbb\x6e\x3b\x9c\x97\x22\x12\x38\x59\xde\x7d\xb8\xf3\xc1\xd6\x1c\xb5\x70\x3e\x1d\x72\x61\x87\x58\x6e\xca\xe5\x7c\xbb\xcd\x85\x73\x8b\x8a\x48\xd3\x0a\xe9\x72\x7a\xfd\x51\x4e\x7f\x94\xd3\xff\xde\x72\x3a\x13\xd2\xd3\xa1\x43\xab\x33\x47\xfc\xc6\x09\x9e\x8e\x09\xe8\x9f\xe7\x28\x81\xfa\x71\x82\x57\xc2\x58\x95\xd3\xd7\x4a\x07\x4e\x28\xe9\x68\x39\xcf\x5f\x13\x0a\x9d\x0c\x87\x0f\xae\x1d\xfa\x7e\xe4\x71\xc2\x1d\x4f\x86\xca\xed\x06\xbe\x62\x41\xa7\x77\xbf\xc5\x85\x4e\x3a\x9c\x7f\xa1\x93\x0e\xe1\x42\x87\x0a\x2e\x8b\xdc\xdb\x14\xc9\xf9\xee\xcd\xc9\x10\x0f\xa4\xad\xe9\xd2\x7a\x53\xc7\x44\x84\x74\x38\xfc\x68\x2f\xa0\x1a\x85\x20\x8b\x2e\xab\xa8\xd1\x30\x1a\xc4\xee\x16\x2d\x5f\xef\xd6\x5c\x8a\xb3\x03\x7f\xc6\x88\xe0\x24\xfc\xa2\x5f\x0e\x4b\x6d\xcf\x2b\xaa\x5a\xfd\xdc\x06\x91\x30\x3a\x8a\x7f\x2d\x46\xc0\x56\xe4\x6e\x0d\x8f\xfd\xe4\xf3\x69\x32\x4d\x33\x1c\x1c\x61\xe3\x32\x58\x6a\xbe\xb8\xe0\xdd\x90\x88\x30\x91\xe9\x8e\xfc\xb0\xa0\x7d\x67\x99\xbb\x51\x80\x1f\x04\x47\x49\x78\xe9\x67\x98\x1e\x09\x1d\xad\x17\x15\xbb\x5b\xdf\x69\xd2\xaf\xb9\xdd\x2f\x2a\x76\x37\x04\x86\x7e\x3a\xb7\x75\x67\x99\xbb\x35\x7d\x81\x33\xba\xa1\x17\x8e\x7d\x41\xa9\xbb\x37\x5f\x62\xee\x8b\x8a\xdd\x99\xee\x4f\xae\xc7\x85\x8d\xbb\x8a\xdc\x99\xea\xe7\x35\xec\x2a\x72\xd7\x21\x27\x72\x5c\x86\x29\xe8\xdd\x24\x1e\x1f\xf9\x69\x7a\x15\x27\x41\xd1\xf8\x97\xac\x73\xe7\x75\x30\x6f\x4c\x5c\x45\xee\x4c\x86\xf3\x1a\x76\x15\xb9\x0f\xd6\x33\xaf\xed\x82\x52\xf6\xe6\xc5\xc3\xea\x2a\x4a\xa7\x3d\xb8\x79\xa3\x29\x8d\xa7\x51\xfe\x3c\x0e\xd3\x34\x8c\x2e\x9e\x96\xc6\x76\x12\xa7\xfa\xd5\x95\x84\xa5\xe5\xab\x45\x4f\x81\x8a\xf5\x8e\x68\xfe\x2d\xd7\xc9\x70\x28\x25\x10\xd3\x6c\x2f\x94\x53\xb4\x66\x19\xd1\x6a\x3c\x9e\xa1\x1f\xcf\xd0\x7f\xef\x33\x74\x7e\xd7\xd5\xfb\xf2\x45\xbb\xeb\xda\x1a\xe1\x19\x7a\x8d\x13\x7c\x91\x7e\xf1\xd3\x2f\x21\x7a\xe5\x8f\xf0\xec\xbf\x93\x6c\x90\xae\x0c\xa7\xea\x71\xb8\xc3\xa2\x99\x1e\xe3\x01\x4e\x70\xd4\xc7\x1b\x88\xb4\x9f\x6e\xac\xae\x5e\x84\xd9\x70\xda\x5b\xe9\xc7\xe3\x55\x7e\xea\x5e\xbd\x88\x97\xc5\xef\xde\x28\xee\xad\xa6\x57\x7e\x32\x5e\x0d\xa3\x0c\x27\x91\x3f\x5a\x25\x5d\xc2\xb3\x8c\xff\x77\xe5\x22\xfe\x3f\xef\x9a\xcd\x07\xbe\x1a\xcb\xef\xbb\x4e\x08\x36\x7f\xf3\xc3\x35\xfc\xf8\x4b\x5c\x76\x51\xcb\x57\x9c\x5d\xc5\xc9\xe7\x63\x0c\xa1\x6a\x8b\x14\xe5\x7a\x71\x53\x5b\xde\xfb\xf2\xe5\x63\x41\xa9\xbb\xf8\xe6\x5d\x47\xfd\x9d\xc8\xef\x8d\xf0\x3c\x2c\xa5\x92\x76\x04\xed\x05\xee\x82\xdb\x95\x3f\x29\x89\x5b\x5e\xd2\x81\x9b\xb5\xc0\x1d\x70\x0b\xe2\xab\x88\x45\x21\x2e\x42\x8c\x17\xb3\x63\x65\xf9\x5a\xde\xdd\xd4\x81\xd8\x74\x52\x02\x2d\x5a\xc8\x8e\x94\xf1\xed\xce\x28\x25\x38\x4b\x42\x7c\x39\x2f\x02\x04\x2f\x66\x47\xcb\xf2\xf5\x2e\xa4\x95\x91\xdd\x6e\x0e\x51\x91\x32\x0e\x72\xd2\x3e\xdd\x79\x88\x2e\x70\x09\x77\x66\x3b\x2e\xea\x87\x3b\x8c\x09\xcd\xde\x30\x27\x46\xaa\x1d\x07\xf5\xc3\x9d\x47\x83\x25\x6c\x29\x46\x86\x16\xb2\xe3\x63\x7c\xe3\x28\xb5\x4a\xa1\x54\x70\xab\x6b\xa8\x38\x75\xb6\x2c\xdd\xfe\xe5\xfc\x50\x7a\x99\x33\xa2\xfc\x25\xe7\x03\xd2\x8d\xe3\x44\x7d\xe6\xd4\x2f\x01\x22\x24\x98\x3f\x5e\x60\xe9\x62\x72\x32\x95\x1e\x24\x59\xfc\x41\xaf\x19\x87\xe1\xa5\xd3\x37\x86\xcc\x09\x7c\x77\x9e\x21\x8b\x61\x5b\x94\xb2\x0a\x6c\xf8\xee\x38\x5e\x59\xce\x57\x44\x58\xb2\x05\xbb\xb5\xde\x4b\x36\x1f\xcf\x54\x8f\x67\xaa\xbf\xf7\x99\x8a\x1d\xa8\xf8\x05\xd1\xb7\x8d\xd2\x7e\x1b\xc3\x6a\xee\x1d\xe5\x4f\x42\x2e\x8c\xd3\x14\x7f\xd9\xb0\xc8\x02\x8d\x5e\x97\x15\x46\xa5\xe4\xa5\xb3\xeb\x09\x91\x0f\x58\x04\xca\x97\x4f\x25\x06\x1e\x66\xfd\x61\x85\x7c\xd7\x73\x8b\xf4\xfd\x14\xa3\x67\x84\xe2\xd3\xec\xd9\x86\xf2\x09\x26\x2b\xb9\x48\x57\xd2\x61\x38\xc8\x2a\x5a\x42\x11\x64\x24\x07\xac\x99\x05\x18\x4b\x06\xf7\xb5\x08\x5f\xd1\x08\x54\xf4\x42\xf6\xa5\x05\x8d\x09\x8e\x82\x30\xba\x78\x70\x3c\x8e\x68\x3b\xb2\x0d\x91\x0d\x29\x16\x3a\xd0\xc4\x46\x03\x67\x54\xa6\x09\x56\x6e\x24\xe9\x40\x94\x9a\x6f\x49\xc8\xa0\xe9\x32\x82\x42\x0a\x16\xd9\xc9\x22\x55\x47\x61\x94\x66\xfe\x68\x54\xaa\x65\xad\xb4\xdd\xd7\xdd\x5d\xa8\x00\x8f\x0b\x9c\xbd\x8b\x2f\x4a\x04\x14\x23\xa5\x9c\x3e\xf6\xb4\x45\xad\x48\x41\xab\x93\x78\x6e\x1c\x0e\x52\x64\x4e\x7b\xdd\xa1\x1f\x5d\xe0\x12\x4d\xda\x84\x0f\x0a\x42\x36\xc9\x52\x46\x4f\x11\x84\x48\xc7\xa4\x46\xe2\xd1\x48\x96\x07\x16\xe6\x37\xe9\x70\xb8\x02\xac\xd1\x60\x37\xe9\xd0\x64\x37\x6e\xf1\x69\xce\x2d\x8d\x41\x06\xc8\xb8\xa5\x51\x2c\x09\xee\x55\x4d\xef\x26\x46\x64\xd3\xd4\x3f\x1c\x22\x26\xe9\x22\xe3\x9a\x82\x36\xcb\x70\xd0\x8b\xde\xad\x79\x8d\x8c\xef\xa1\x6d\x99\xf4\x0c\x49\x94\xe2\x80\xb3\xe1\x06\xf9\x87\x02\x4b\x87\xc3\x0d\xf2\x0f\x15\x5e\x6d\x09\x19\x5a\xad\x47\x91\xf4\x51\x24\xfd\x9b\x8b\xa4\xb9\x9e\x9f\xfb\x58\xdf\x53\xb6\x68\xea\x1f\x7e\x8c\x2f\xc8\x3c\xfb\xc9\x56\x2f\x74\xe4\x25\x48\x57\xdf\xa8\x45\x21\xd1\x3f\x57\xcf\x87\x7d\x7f\x22\x03\x71\xc1\xd8\xef\x6e\x1d\x99\x10\x24\x4c\x98\x23\x3a\xb3\x5e\x46\x9b\xe8\x59\x6d\xd6\xef\x04\x2f\x82\x46\x3f\x68\xb5\x5e\xf8\x6b\xed\x56\xbf\xf5\xa2\xd5\xe8\xb4\x70\x7d\xbd\xf6\xa2\xdf\xae\xe1\x66\x2b\xe8\xb4\xda\x9d\x46\xef\x59\x8e\x8b\x0d\x8c\x5f\xf7\xeb\xf5\x7a\xaf\x5f\x5b\x6b\xf5\x5f\xf4\x07\xfe\xda\x7a\x7d\x50\xeb\x37\xd7\x71\xa7\xd9\x0b\xda\xf5\xfe\x8b\x7a\x6f\xdd\x1f\xd4\x6a\xcf\xdc\xbc\x89\xe2\xb8\x21\x49\xba\x7e\x2f\xdc\xb0\x0c\x62\xce\x09\x99\x1b\xfc\x86\xb5\x7f\x74\xa7\xa7\x85\x09\xda\x06\x64\x7d\x5c\x2d\x70\xcd\xee\x52\xa8\x0a\xc7\x2c\x9e\xc5\x1f\x37\xea\xde\x8f\x73\xe6\xe9\xc7\x8d\x06\x61\xb6\xed\x47\x66\xfb\xc8\x6c\xff\xde\xcc\x36\xe7\xb5\x5c\xf9\xa5\x31\xdb\x22\xc3\xe4\x41\x12\x7f\xc1\x63\x3f\x5a\x09\xf0\xcf\xdf\x2a\x9d\xbf\x7e\x41\x7a\x97\x74\xfd\x54\x91\x28\x7d\xa7\x2f\x94\x8c\x04\x5a\x89\x54\x2f\x71\x9b\xdc\xfb\x8b\x67\xf8\x2f\xc8\xd6\xcf\xc7\xe2\xe1\xf3\xf5\x97\xcd\xf1\x7d\xe7\x14\xdf\x96\x2e\x15\x24\xf9\xb6\x85\x6e\xd1\x46\xf8\xbf\x6c\x6f\x69\x5d\x48\xb7\xfd\x9d\xa4\xd7\x76\xf6\xfb\x9e\x12\x6c\xff\xb0\x49\x09\x47\x7b\x45\x36\x94\x41\x18\xe1\xe0\x2e\x19\xb8\x79\xe6\xd8\x2c\x46\x2c\x6d\x75\x9e\xce\x1a\xd2\x71\x8b\xc3\xb6\x48\xc8\xba\x82\x0e\xc8\xc6\x16\xe2\x94\x51\x12\x0c\x93\x36\x96\x5a\x0e\xec\xb9\xd9\xf4\xf9\xb8\xee\xb2\x91\xfa\xfa\x7e\x3a\x1a\xdd\x48\xc6\xee\xe1\x00\xe1\x59\x98\x42\x71\xeb\x90\x6b\x2d\x16\xe6\x94\xe7\x19\x6c\x78\x6b\x34\x87\x8d\x9c\x77\x7f\x19\xd5\xcf\xab\x8e\x34\xf3\x2b\x93\x78\x52\xa9\x42\xde\x6a\x76\xef\x45\xf8\x3f\xac\x27\x18\xad\x1f\x64\xe1\x46\x1d\x6e\x6a\xdf\x90\x63\x96\xc5\x76\x52\x54\xed\x20\x5c\xc4\xc8\x5e\xf1\x5e\x38\xa9\xb1\x7c\xfa\x6e\xa8\x23\x44\x49\xc4\x13\x94\xe4\xe9\xbc\xdf\xe0\xac\x22\x9d\xce\x71\x34\x1d\xe3\xc4\xef\x8d\xf0\x06\xca\x92\x29\x36\x55\x7f\xfe\x18\xa7\x85\xa9\xba\xa5\x7c\xde\x50\x18\x94\xb7\x48\xca\xe1\x9d\xce\x49\xe2\x9d\x6a\x59\xbc\x53\x47\x1a\x6f\xbd\xc8\x4b\x45\x23\x26\x9a\xaf\xf3\xec\xfd\xb4\x13\xf6\xec\x2e\x71\xef\x93\x07\xe5\x3d\x3a\x64\xac\x2f\x04\xbe\x9f\x5e\x47\xfd\x37\xb0\xdf\x10\x91\x17\xba\x50\x3d\x57\x72\xa2\x6f\xb1\x22\x15\xc9\x4d\x43\xab\xa6\x4c\x12\x80\x50\x59\x06\xdc\x2e\xa3\x25\xc0\x61\xa5\x3f\xf4\x93\xad\xac\x52\xab\xae\x64\xf1\x87\xc9\x04\x27\x5d\x3f\xc5\x95\x2a\xff\x0c\x59\x95\x2b\xf5\xaa\x73\xe3\xe1\x33\xeb\xce\x3c\x9a\x6f\xdc\x79\x1a\x55\x1e\x11\x8d\xd7\xb8\x20\x1d\x32\x57\x8c\x10\x50\x94\x04\xdb\xe2\xad\x2d\xc5\xb6\xaa\xe8\xe1\x99\xed\x45\x15\xba\xdd\x4b\x1a\x9b\x3c\x15\x77\x51\x07\xf9\xa8\x2f\xd6\xcb\xfc\xae\xdf\x1d\x04\x0c\xe5\x66\x4e\xd6\x0e\xd1\xb4\xe7\x0b\xf6\xaa\x64\x7a\x74\x35\x25\xba\x7d\xb0\xcd\xa4\xe8\x37\x6a\xf6\xf2\x0b\x9c\x2d\x98\xbc\xfc\x02\xbb\xb6\x93\xef\x3b\x77\xb9\x85\x38\xca\x67\x2f\xd7\xcd\xe6\x36\x64\x79\xd4\x54\x92\x9f\x9d\xab\xea\x75\x32\x4d\xac\x8a\xb6\x59\x95\x4c\x84\x2e\x4f\xd9\x43\xa5\x43\xe7\x03\x24\x1d\xcc\xb5\x98\x3d\xe4\x88\xdd\x79\x3c\x62\x3f\x1e\xb1\xff\xde\x47\x6c\x49\x9f\xc9\x38\xc4\x98\xb1\x74\xf5\xa4\xfd\x4f\x3c\x18\x24\xf8\x1a\xfd\x1a\x8e\xfa\x9f\x31\x7a\xf5\x09\x0f\x06\xae\x68\x3d\x0b\x85\xf6\x39\xf0\x13\x72\x84\x3f\xf4\xa3\x3e\xf6\xa1\xac\x2d\xa8\xcf\x2d\xe2\x00\xb1\x2a\x6f\xfc\x4b\xf4\x6b\x1c\x07\xe8\xd5\x85\xf3\x90\xdf\xca\x0f\xf9\xff\x64\xdc\x54\x71\x1e\x66\x2c\xb6\x28\xa5\xad\x25\x50\x9d\x9e\x85\xd6\x96\x82\x16\x27\x49\xac\x05\x0f\x5a\xa5\xef\xa8\x0d\x02\xdd\x76\xf6\xb3\x67\x29\xd9\x18\x27\x71\x94\x86\xbd\x11\x25\xb0\x89\x0f\x4e\x24\x68\xcc\xee\x7c\xc8\x5e\x34\x49\xe2\xcb\x30\xc0\x49\x2a\x6a\xf9\xa3\x34\x36\xab\xc6\xa3\x11\xa9\x4a\xa8\x8d\x5b\x8f\xa3\x28\x0e\xe8\xd7\x30\xea\xc7\x63\x19\x32\x01\xc6\x72\x0a\xd0\x2b\xd7\x2c\x1c\x63\xb2\xd8\xc2\x14\xd5\x51\x8a\xfb\x71\x14\xc0\xee\x18\x46\x17\x23\x9c\xc5\x11\x0c\x27\xe9\x5e\xc1\x41\x9f\xa3\xaa\x1c\xf7\xf9\x4b\xb4\x29\xba\x22\xe9\x19\x48\xdb\xa0\x01\xbe\x91\x5e\x72\x5c\x64\xad\x83\xf3\xf0\x47\x24\x94\x61\x12\x47\xf1\x34\x1d\x5d\x43\x18\x0c\xc7\x3e\x4c\x3e\x59\xce\x23\x28\xf0\x33\xdf\x79\x42\x56\x7b\xab\xa8\x3c\xa2\x40\xe9\x3c\x01\x23\x9f\xd4\x7e\x50\x7a\xaf\x24\x37\x8c\xa3\x34\x26\x5b\x17\x21\x8a\x0a\x25\x8d\x95\xfd\xe8\xd2\x1f\x85\xc1\x11\x2b\x5f\x91\x65\x1e\xee\x85\x0d\x83\x21\x49\xf8\xea\x1e\xcf\xc8\x7c\x25\x8b\x8f\xe8\x3b\x40\x69\x85\xf6\xde\x83\x6e\x32\x63\x0b\xe9\xfc\xc2\x4e\xe5\x9b\xea\x5c\x51\x61\x96\x81\xe6\x57\xe5\xd0\x29\xde\x48\x98\xfe\x42\xd0\x3d\xa6\x54\x88\x85\xa0\x26\x75\x33\x1b\x26\xf1\x15\x52\xbb\xa7\x97\x57\xba\xc3\xba\x49\x3f\xad\x94\x3a\xf9\xfb\x0b\xcd\x3e\x48\xb3\x85\x24\xa0\x9f\x4b\x85\xf4\x33\x9f\x18\x00\xb8\x41\x11\x52\xf0\xdc\x52\xb4\xc1\x53\x67\x4a\xb2\x71\x11\x75\xdc\x0f\x21\x98\x73\x4f\xe5\x7e\x06\xb2\x84\x3c\x4f\x3a\x85\x93\x44\x17\xf1\x2d\xbd\xa9\xea\xe6\x36\xe4\x4f\x81\xb3\x08\x8d\xcd\x1f\x32\xa3\xb6\xdc\xbe\x21\xe4\xb2\x6c\xaf\x0a\x09\xea\xc1\x39\xdd\xc7\x06\x1b\x35\x16\x9d\x0c\x48\x81\xd7\xe4\xbb\x45\xc9\x44\xeb\xdd\x07\x61\x42\x0b\xdf\x19\x61\x02\x4e\x32\x75\x72\x26\x73\x3b\x52\x4c\xef\x81\x16\x55\x1a\xe4\x7a\x36\x98\x8d\x0a\x6f\xe5\x4e\xa4\x97\xce\xa3\x3d\xa5\x43\x82\xe8\xd0\x9c\xed\x0f\x67\x62\x5f\x25\xd2\x26\x3f\x13\x32\x91\xcf\xa0\xb8\x8c\x4f\x95\x5d\x35\x57\x48\x4b\xa2\xae\xba\xeb\x3b\xb7\xfb\x79\x3b\x77\x46\x8e\x54\x4c\x70\xd1\x11\x25\xdf\x8e\xc4\xa7\xb9\x1c\x9b\xc6\xfe\xbf\x01\x68\xfb\xc1\xdc\x25\x63\xf9\x2a\xcc\x92\x38\x26\x59\x1c\xc4\xa8\x3f\xc2\x7e\x34\x9d\xa0\x08\xe0\x93\x01\x16\xc7\xf6\xa2\xa1\x92\xb0\xb7\xac\x3c\x8a\xa4\x1c\x10\x45\x34\xae\x8e\x25\x11\x8e\xce\x68\xe9\x73\x22\x24\x91\xea\x1b\x88\x02\x09\x83\x0d\x03\xd0\x86\x0d\xe4\x46\xfe\xf3\x86\xe7\xc4\x5e\x5d\xd5\x47\x5f\x61\x00\x4c\x00\x53\x77\x73\x86\x50\x45\xac\xf0\x39\x93\x1b\x4f\x84\x50\x4a\x44\x50\x66\x46\x0b\xa7\x9b\x8b\x90\x1c\xe9\x42\x5d\x77\x4c\xea\x58\xe6\xdc\x98\xdb\xc2\x91\x17\x20\x54\x22\x85\xba\xbc\x43\xd4\xb2\xcc\x32\xc8\x2f\xa5\xe1\xc9\xf1\x67\xa3\x53\x61\x1a\xd5\xcf\xf8\x3a\xad\xe4\x75\xab\x5c\xcb\x0b\xc9\xe2\xd1\x4f\x3f\x21\xd7\x18\x12\x62\x4a\x4e\xe9\xfb\x8a\x52\xe8\xa5\x3a\xce\xba\x00\x5c\x30\xde\xf9\xee\x93\x60\xc2\x0b\x88\xfc\xcf\x87\x7d\x8c\xfb\x43\x3f\x0a\xd3\x31\x3f\x86\x16\x33\x07\x00\x50\x3c\xbc\xb4\x0d\x79\x60\x3f\x63\x3c\x11\xf9\x03\x78\x67\x57\x9f\x7f\x4a\x87\x61\x44\x1a\x9a\xf5\xe3\xf1\x64\x84\x67\x61\x76\xbd\xd1\x86\x23\x19\x29\x40\x08\xa2\x42\x36\x87\xcf\xf8\x9a\x6a\x0a\xc4\x68\x4a\xe3\xb5\xba\x8a\x12\x3c\x8e\x2f\x31\xf2\x47\x23\xe8\x55\xea\x21\x3c\xeb\xe3\x49\x06\x62\x3f\x7b\x25\x97\xcf\x86\xf8\x1a\x45\x98\x8e\x48\x0f\xb3\xfa\x01\xe9\xf1\xd4\x1f\x8d\xae\x51\xef\x1a\x86\x8c\x0c\x0f\x4b\x05\x00\x34\xf3\x2b\xd9\x90\xc2\xe8\xa2\x52\x95\xf6\x81\xca\x0f\x4a\xef\xd0\xd7\xaf\x04\xdf\x95\x30\x0a\xf0\xec\x70\x50\x01\x37\x45\x42\x6c\x1f\x9f\x55\x61\xf2\x97\xeb\xfa\x06\x21\x51\xd8\x67\x7c\x7d\xbe\x22\x56\xa2\x6e\x0e\x6d\x52\x24\x29\x6f\x98\x26\xff\x85\xc9\x13\x4e\x99\x64\xde\xfb\xd4\x36\x17\xc5\x51\x19\x9e\x40\x4d\x6a\x8b\x68\x92\x59\x0c\x9b\x2a\x50\x07\x15\xa2\x0e\x01\x67\xe9\x4c\x8a\x33\xa5\xf7\x04\xb0\xa4\x8a\xf4\x50\x7f\x65\xe7\x74\xef\xe3\xd1\xe1\xbb\x77\xfb\xef\xdf\x7c\x3c\xdd\x3f\xd8\x39\xfc\x70\x2a\x1f\x8f\xca\xcc\x80\x29\x54\x29\x12\xd3\x83\x1c\x1d\x4d\x99\x8c\xe0\xb5\xed\x67\x3e\xda\x44\x67\xe7\x2f\xd5\xf7\xfb\xe0\x6e\xcc\x5f\x97\x5b\xaa\x02\xe0\xca\x64\x9a\x0e\x2b\x3a\xdd\x33\x11\x4f\x29\xbd\x1f\xa4\xb4\xf0\x67\x7c\x5d\x35\xc6\x20\x07\xb8\xc0\xe0\x95\x12\x37\x05\x64\xd6\x28\x5f\x52\x63\x7f\xa2\x30\xc9\x10\xc8\x16\x18\x0a\x90\x18\x21\x4d\x75\x98\x0e\xfc\x89\xa4\xba\x90\xf4\xda\xaa\xa7\x38\x15\x5c\x81\x6b\x54\xff\xd0\xc7\xe0\xc0\x9f\x9c\x41\xb5\x10\xb6\x78\x3e\x32\x67\x50\xfc\x5c\xf2\x48\x17\x8d\x2b\x7e\xf3\x68\x61\x99\x39\x56\xa5\x66\x25\xbc\xc9\xe9\xe1\xf6\xe1\x06\x27\x32\x34\x8a\x2f\xfe\x4b\x97\xaa\x63\x87\x5c\x7d\x57\x49\xba\x84\xb2\x20\xb5\x1e\x1d\xd9\xb7\x95\xb1\x3f\xa9\xb8\x8c\x15\xf8\x1f\xd8\x2f\x06\xf9\x28\x93\xb1\x67\x47\xbd\x30\x90\x1d\x6f\x04\x45\x7c\xc6\x28\x9d\x26\xa0\x27\xe6\xcc\x2a\x4c\x51\x9a\x85\x84\x1e\x28\x27\xc7\x01\xf2\x07\xe0\x20\x94\x24\xe1\xa5\x3f\xd2\xf6\x5a\x05\x26\x19\x10\x70\xfb\xa7\x4b\x23\x0c\xce\x75\x14\xf3\x2e\xad\xf4\x73\x7b\x00\xb5\x8e\xf8\xe2\x74\x98\xe1\xba\x13\xf9\xd3\x0d\xc2\x23\xa6\x67\xb6\xd4\x18\xf8\xa3\x14\xcb\xb7\x6c\xcc\xed\x69\xee\x98\x8a\x74\xfe\xac\x4d\x74\x0b\x18\x64\x5e\x60\xc6\xa5\x45\xeb\x38\xfc\xbf\x34\xc6\xf3\x07\xa8\x59\x62\x1c\xcb\x2b\x06\x90\x42\x61\x52\x2f\xa1\xa2\x3a\x4a\xda\x62\x77\x0f\x93\x8a\x8b\x5b\xcf\x80\xe4\x4b\x4e\x57\xc6\xa5\x63\x3d\xa8\x86\x7a\xe3\xa5\xa5\x5e\x32\x53\x57\x30\x85\xf4\x8f\x1b\x0d\x08\xed\xc3\x94\xe1\x3f\x6e\x34\xc1\x0d\x75\xad\xcc\x1d\x19\x8b\xb9\x89\xb3\x2c\x8c\x2e\xec\x9e\xbd\xc0\x98\x02\x29\x73\x2d\xda\x14\x3e\x6b\x2f\x8d\x12\x79\xa4\x67\x61\x1f\xe4\x0a\x5a\xc4\x1a\x65\xfd\x26\x28\xaf\x3f\x5e\xeb\x3d\x5e\xeb\xfd\xcd\xaf\xf5\x58\x44\x5f\x76\x6a\xb9\x4d\x54\xdf\x79\xe6\xb0\x8e\xdc\x17\x5a\xea\x8b\x45\x0c\x67\xf9\x92\xae\xb3\xc3\xc1\x56\x10\xa4\x30\x74\x62\x77\xf3\x23\x50\x4b\xa5\x68\x4a\xc5\x2f\xe6\xf4\xe6\x11\xe1\x2b\xcc\x20\x52\x1e\x82\xa4\x00\x74\x53\xa5\xbb\xfd\xd3\xa7\xf2\xf9\x80\x9d\xcf\x9e\xea\x4a\x22\xb2\x6d\x3e\x65\xd7\x56\x52\x39\x89\x57\xd1\x38\x3d\xdc\x95\x8e\x94\x8b\x23\xe6\x70\xa5\x70\x34\x26\x37\x91\xb1\xb7\xa8\x1a\x5d\x42\x11\xdd\xb7\x79\x4f\x53\xcb\x66\x61\xb3\xc7\xe1\x7f\xea\xbe\xa5\x6f\x4f\x2e\xdd\xa5\xb0\x10\xe4\x81\x88\x00\xe5\x9f\x7e\x02\xdc\xa9\x62\x2a\x8c\x2e\x80\x1b\x57\x15\x88\xfc\xfa\x62\x5e\x4a\x53\x0a\x51\xf6\x52\xbe\x6d\x27\x85\x34\x34\xf2\x53\x68\xe6\x24\x23\x93\xfd\xc3\xe6\xa6\x31\xd0\xfc\xcf\x78\xb1\xba\x4a\x33\xb7\x2b\x24\x05\x4b\x2d\x4b\xa6\x44\x66\x4b\xd2\x0c\xa5\x31\xb5\x73\x9c\x4c\x80\x75\xc3\xd9\xd9\x8f\xae\x33\x72\xe0\xf7\x50\x0f\x0f\x08\x03\xa0\x4b\x9c\x5f\xa1\xc2\x68\x50\x25\xa3\xf6\x17\x0e\x2a\x3f\x58\xb0\xfe\xe9\x27\x64\x1b\xf9\xaa\x51\x1f\x99\xd7\x0d\x04\x55\x8b\x7b\xb4\xb3\xb3\x31\xe5\x9b\x11\x9e\x65\xa8\x7b\xf4\x01\xf5\xaf\xfb\x23\xec\x89\x6e\xc2\xb0\x8b\xcd\x06\x7a\x02\x5d\x66\x36\x4b\x93\x24\xee\x13\x9e\x95\xd2\xd1\x31\x5a\x91\x8e\xc1\x62\x99\xd8\xe6\xc2\xd2\x11\x46\x1a\x7a\xa9\x1b\x0f\xd5\xca\xf4\xcf\x32\xac\x94\x14\x5c\xa2\x99\x64\x0c\xf6\x54\x00\xd0\xcd\xd8\x24\x5d\x6c\xc5\xb4\x83\x72\xa4\xfb\xd5\x2d\xa1\x6e\xbc\x5c\x08\xdf\x0f\xbc\x9c\x4d\xb0\xf7\xb2\x0e\x89\xea\x0c\x80\xb3\x90\x75\xc2\xed\x24\xf7\xad\x69\x39\x9d\xb9\x36\x8b\x4d\xe6\x35\xf9\x0f\xc9\xba\xa6\x7d\x22\x47\x4b\xca\xa9\x25\xca\x85\x97\x96\xa4\x72\x62\xbd\x4a\x27\x7d\xf8\xe0\x07\x81\xb0\xed\x92\xf2\x7e\x8a\xef\xfa\xf4\x48\x07\x07\x89\xc5\x72\xe3\x2d\x78\x2f\xd9\x8a\x53\x81\x4e\x8c\x84\x6c\xe9\x9b\xb7\x5b\x68\xb1\x18\x0e\xf2\x57\xaa\x56\x2a\x67\x41\xa0\x55\xd0\x90\x2f\x85\x84\x3c\x8b\x6e\x89\xd6\x20\x30\xa1\x72\xae\x48\x73\x50\x2d\x18\x6d\xab\x54\x2b\x10\x72\x1b\xb0\x11\x59\x5d\xcd\x76\x41\x64\xdf\xc7\x1c\xa5\x8f\xb2\xef\xdf\x5d\xf6\xcd\x4d\xda\x78\xc2\xde\xfb\xf2\xd1\xdd\xef\xf9\x91\x2a\xed\x86\x3d\x5f\xb8\xde\xe2\x19\x55\x57\x17\xb9\xee\x9e\x8c\xfd\x24\xdb\x61\x05\x73\xb7\x5b\xe7\xd5\x18\xa8\x95\xa0\x59\xde\x17\x4d\xe7\x2d\xbd\x16\x97\x60\x27\x59\x12\x46\x17\x37\xe0\xda\x62\x7b\x4f\xa4\xe5\x9e\x1f\xc9\x9f\x7e\xf1\x47\x53\x7c\x83\x2e\xc9\x7f\xd8\x75\x08\x81\x3c\xc0\x09\x9e\x73\x43\xea\xa9\xe6\x05\x10\xa4\x86\xe1\xa4\x8a\xc5\xd9\xd0\x03\x8c\x88\xb4\xee\xd1\x96\xcc\x2d\x0c\xd4\x6e\x74\x94\x21\xdb\x74\xcf\x8f\x2a\x59\x5c\x65\xaa\x22\xd0\xe1\x90\xcf\x5c\xe5\x53\xb1\x58\x11\x91\x7a\x90\x26\xa2\xf2\x2c\xa4\xea\x1b\x0a\x91\xf9\xe9\x3e\x33\xf5\xc7\x0c\xe2\x76\x98\x10\x59\xcc\xe6\x10\xc3\x7b\x74\x1a\x33\xcf\x5e\xb9\x3b\x50\x9d\x41\xaf\x54\xcd\xae\xf1\xf6\x84\x1c\x03\xdd\xb0\x49\xba\xe0\x22\x21\x3c\xa5\x71\x36\x94\x53\x82\x57\xaa\xd0\x08\xc3\x36\x4a\xb3\x30\x9b\x52\x81\xcb\x34\xff\x0a\xf0\x24\x4e\xc3\x4c\xc6\x92\xc1\x15\xe8\x01\x98\xfe\x28\xc4\x51\xa6\x5b\x62\x94\x6e\xd8\x30\xb1\xe0\xa9\xc6\xcd\x11\x5c\x14\x23\x73\xfc\xb8\x0a\xbe\xf0\x2a\x59\x90\xde\x60\x1a\x05\x60\x13\xd9\xc7\x49\xe6\x87\x62\xfa\x1d\xcb\x47\x4c\xec\x62\xeb\xe8\xc1\x97\x90\xc0\xeb\x16\x6b\x89\x8d\x3c\x99\x4d\x2d\xe3\x97\x24\xdb\x0a\xef\xf5\x2c\xce\x25\x5a\x02\x7a\x83\x36\x20\xd1\xe6\x68\x8a\x37\xe8\x7f\xb8\x98\xab\x25\x7b\x77\xce\x0a\x9b\xfc\x7c\x52\x20\xae\x7d\xd8\x47\x9c\x13\x22\xce\x21\x51\x65\x3c\x4d\x33\xd8\xea\xf0\x18\x47\x99\xa0\x9b\xde\x75\x86\xd3\x66\xa3\xca\x84\xf1\x1f\xaa\xda\x44\xb2\x72\xf7\x3e\x7d\xa9\x31\x7f\xbc\x3a\xa5\x54\x34\x8d\xc2\xff\x9d\x62\x14\x06\x38\xca\xc2\x41\xa8\x72\xe2\x52\x73\xcd\x47\xa7\xc4\x0c\x43\x93\x76\xae\xe9\xc3\xae\x23\xed\x41\x2f\x75\x22\xe0\x63\x5c\xf1\x7b\x61\x75\xc5\xcf\x08\x63\x5d\xe1\xe3\xcb\x41\xff\x71\x57\x22\x30\x64\x55\x3e\x8a\xd6\x20\x08\xe6\x7e\xf8\xe3\x46\x93\x88\xae\x3c\x71\xff\xcd\xb9\xd7\x2e\x95\x2a\x99\x69\x77\xdb\xa5\xf2\xb5\xbd\x94\x95\xf0\x31\x91\x2f\x06\x7e\x3f\x8b\x93\x6b\x8f\x2a\x94\xc9\xc0\x3e\x21\x6c\x9a\x88\xfa\xf1\x00\x89\xde\x6c\x6e\xa2\x1f\x69\x40\xa6\x1f\xa1\xcc\x93\xd5\x55\xd4\x8d\xc7\xe3\x38\xfa\xe7\xc9\xd3\x27\x4f\x8c\xce\xe7\xbf\x58\x03\x1c\xa7\xca\x8f\x64\x18\x12\xfc\x63\xd5\x43\xd2\x2b\x1c\xf5\x97\x7b\x7e\x8a\x3b\x2d\xed\xc3\x38\x68\xeb\x45\x2f\x27\x9f\x83\x81\xf6\xb2\x1f\x4e\x86\x38\x59\xa6\x90\xab\x2f\x9f\x3e\xb9\x79\xfa\x04\x8f\x52\x8c\xa4\xce\x50\x85\x39\xed\x0b\x1f\x86\x1f\xd1\x4f\x3f\xb1\x0f\x2b\xfe\x38\x10\x7d\xdb\x3a\xd8\x7e\xfa\xe4\x09\xfd\x50\x39\xe3\x38\x7b\x48\x45\x15\x9e\x09\x86\xf4\x03\x45\x0c\x7e\xcb\xf8\x9c\x8b\x51\x96\x11\x63\x0d\xd1\x68\x18\xa8\xd2\x4b\xe2\xab\x14\x27\xd5\xa7\x4f\x9e\x88\x11\x8b\xe3\x6c\xa5\x9b\x5c\x4f\xb2\xf8\x9f\x27\xb4\xea\x0d\x9c\x9e\xe4\xed\x47\x7c\x47\x7f\x3c\x7d\xfa\xa4\xa2\x1e\xc7\x9e\x20\xaa\x11\x39\x19\xc6\x49\xd6\x9f\x66\x29\x7d\x43\x96\x4d\x17\x6d\x22\x5e\xf7\xa5\xf4\xfa\xe3\x28\xec\x91\x4f\x2b\xa3\xb0\x27\xbd\x07\x65\x58\x17\x3a\x45\xbe\x92\x52\x2b\xd2\x3b\x05\x82\x3f\xba\x88\x01\x04\xf9\xf1\xf2\xa9\xc0\xe2\x5d\x1c\x7f\x9e\x4e\x50\xe6\xf7\x46\x58\xc2\xe4\xe4\xf5\xe1\x6f\xec\xcc\x27\xde\xed\xbf\xff\xe5\xa3\xed\xfd\xc9\x87\xd7\x1f\x0f\xf6\x7f\xfb\x58\x73\x7d\xa8\xbb\x3e\x34\x5c\x1f\x9a\xd6\xb6\x5d\xed\xc8\x1f\x8d\xb6\xe4\x8f\x46\x7b\xf2\x47\xde\xa6\x18\x9a\x6e\x3c\x9e\x90\x83\xe2\xc8\x1c\x22\xdb\x94\x6a\xb5\x82\x78\xda\x23\x52\x3f\xa9\x95\x17\x00\x16\x2b\x63\x81\x64\x4b\x85\x10\xa2\x09\xa2\x10\xbd\x42\x8d\x76\xe7\x25\x0a\x97\x96\x14\xf0\x42\x46\x44\xaf\x50\xbd\xb1\x6e\x7c\x23\x7f\xc1\x59\x78\x8e\x36\x09\x8c\x57\xa8\xfe\x52\xfd\x4e\xaf\x52\x0b\x6a\x55\x68\xb5\x2a\xfa\x1d\xd5\x66\xf5\x7a\x4f\xaf\x9f\x3f\xde\x3c\x55\x7a\xfd\xab\x3f\xfa\x8c\xde\xec\x56\x1a\xbf\xaf\x57\xd5\xde\xce\x68\x84\x44\xf5\x5d\xa8\xbd\x5c\x68\x04\xa4\x41\x4e\x7b\xf1\x4c\xfd\x08\x86\x06\xa4\xcd\x59\x88\x7e\x47\x95\x59\xde\x21\xf6\xbb\x21\xfd\x6e\x4a\xbf\x5b\x55\xad\xb3\x00\xa5\x92\xce\xd0\xcf\x3f\xff\x8c\xd6\xa1\x64\x3a\x43\x3f\xa1\xda\x6c\x30\xa0\x03\xd4\x69\x6a\x55\xc8\xea\x38\x9b\x91\x81\x4c\x67\xda\x27\xbe\x78\xce\x52\xf8\x3e\x7b\xf9\xd4\xd9\xa9\xf1\x74\x94\x85\x93\x51\xd8\x07\x2d\x81\xd9\xbd\x19\x21\xe3\xe0\x6c\x76\xfe\xd2\xf2\xad\x45\xbf\x35\xac\x1f\xd7\xe9\xc7\xd6\x79\x41\xeb\xe9\xb4\x87\x40\xbe\xf1\xd0\x38\x9c\xa1\x7e\x3c\x9a\x8e\xa3\x54\xa1\x7e\x19\x26\x91\x14\x2a\x01\xf4\xea\x39\xa1\x99\x5a\x9d\x8f\x14\x7b\xac\xd5\x6b\x35\x7d\x68\xc5\x4a\xa6\x83\x55\xc9\x60\x62\x5a\x55\xf4\x95\xfc\xa6\xe3\xed\xa8\x52\x97\xab\xd4\x3b\x52\x95\x7a\xc7\x55\xa7\x21\xd7\x59\xaf\xa2\xbc\x4e\xc3\x98\x75\xc1\x0d\x68\x9d\xac\x60\xa4\xc2\xe8\x52\x1e\x2d\xf2\x58\x7a\xc4\x66\xeb\xd2\xf8\x30\xf2\x6c\xb1\x57\x35\xfe\xa2\xa1\x0c\x69\xe1\x88\x2a\xfc\x91\xd1\x58\x99\x61\x55\x58\xa7\x52\x6f\xce\xd8\x2a\x6c\x55\xa9\x38\x67\x80\x15\x96\xcb\x2a\x16\x8d\x32\x5c\x16\x80\x1e\x18\x27\x26\x27\xfc\x61\x66\x65\x82\x8c\x01\x6c\x2e\xc0\x01\xa1\x4a\x03\xfd\x8e\x82\x33\xf2\xbf\xd9\x3a\xfa\x1d\xcd\x1a\xe7\xe7\xfa\x42\x82\xb2\x21\xfa\x7d\x13\x0a\xce\x42\xa3\x80\xc2\x24\xe1\xe7\x0d\x9c\x69\xc5\xbe\x72\x94\xe0\x3e\xed\x5c\x80\x8e\xfb\x71\xc4\x36\x98\x7c\x57\x3a\xee\x1e\xbe\x27\x7b\x44\x6d\x56\xab\x79\xa8\x36\xab\xd5\xe1\xdf\x06\xfc\xdb\x82\x7f\xd7\x3d\xa0\x05\xf2\x6f\x03\xfe\x6d\xc1\xbf\xeb\xf0\x6f\xbd\x47\xfe\x6d\x76\xf2\xcd\xec\xf9\x73\x86\xd4\x73\xb4\xb5\x73\x42\xe3\xb1\x23\x2a\x0e\x21\x22\x10\x24\x61\x36\x1c\xaf\xf0\x32\xab\x39\x2a\xa4\xf4\x26\x13\x1f\x56\xe8\x83\x24\x61\xac\xe0\x59\x46\xa3\x07\x88\x2e\x7f\x0c\xe2\x63\x9c\xe2\x6c\x03\x39\xb6\x48\x36\x08\x27\x9f\xc3\x09\xb3\xfc\x8d\x07\x28\x3a\x8e\xe1\x34\x36\xf4\x53\xd4\xc3\x38\x02\xef\x00\x76\xbf\xe5\x47\x01\x98\xf0\x05\x61\x80\xa2\x38\x63\x66\x98\x26\x29\xd0\x64\x2e\x1c\x12\x37\x17\xfd\xf8\x19\x5f\x1f\x25\x61\x9c\x1c\x53\x0b\xe0\xcd\xcd\xfc\xbd\x95\x74\xb8\x59\x98\x36\xa7\x66\x07\x54\xf1\x8d\xff\x71\x83\xc3\x4d\x7b\xf3\xf9\x5b\x0b\x7f\xfe\x8c\xaf\x7f\x8d\x13\x30\x62\xfc\x8c\xaf\x57\xae\xc8\x6f\x7b\xb1\x93\xf0\x0b\x66\xa5\xd2\xf0\xe2\x35\x61\x40\x68\x15\xb5\x8a\x96\x91\xf0\x03\x48\x60\x80\x4c\xb0\x7c\xe4\x38\x8e\xf9\x33\x6f\x70\x09\x75\x4a\xb5\x40\xfa\x9f\xf6\x87\x98\x1c\x3f\x10\x11\xa1\x2d\x7d\x48\x8f\xe3\x2b\x02\xbb\xc2\x9b\x59\x22\xbb\xf4\xf3\xc2\x3e\xc8\x70\xed\xc3\xc2\x1b\x95\xc6\x59\x7a\x77\xa6\x2f\xd5\xdc\x44\x94\xa0\x43\x45\x0f\xfa\xf3\x15\xc3\x90\x3d\x5b\xa4\x10\xc4\xc8\x4e\x94\xa7\x83\x64\x2d\x47\xfe\x24\x54\xce\xa0\xce\x39\x1d\x59\x98\x71\xf6\xc6\xc2\x6a\xdc\x0c\x0b\x49\xfb\x89\x01\x1c\xa2\xe9\xe8\x43\x29\xa3\xfd\x03\x43\xfc\x1f\x02\x71\x27\xe6\x6c\x16\x8e\xe3\x0c\x11\x92\x74\x17\xca\xe4\x3d\x40\xdd\x02\x0a\x21\x9f\x4c\x7b\x65\x20\x83\xf8\xc4\x61\x9e\x4b\x7b\x1b\x7c\xc8\x77\x2a\x26\xa3\x9d\x4b\xbb\x98\x5c\x62\x5d\x29\x00\x98\x32\xc8\xec\xf5\x1c\x6c\x0f\xc2\x19\xb0\xed\x22\x6c\x7f\xdf\x04\x26\x7e\xc6\x06\x79\x35\xa7\x8e\xaf\xa8\xc6\x50\xb7\x4c\x36\xca\x27\x1c\x48\x8b\xad\xbb\x9f\x51\x87\xf0\x33\x6d\xc2\xd0\xe6\x26\x6a\xcd\x9b\xb4\xef\x6e\x68\xed\x7d\x76\x8c\xb8\x6b\xcd\x18\xb4\xce\x86\xe4\x1c\xfd\x4e\x64\x09\x73\x11\xcd\xe5\xe6\xb2\x4c\x57\xcc\x66\xc2\xe8\xf2\xad\x85\xd3\x18\xaf\xdd\xcc\x86\x14\xcd\xf9\x8d\x78\xca\x59\x0e\x7f\xe5\xe0\x3a\x32\xc3\x62\x7c\x74\x59\xd4\xb1\x11\x2f\x1c\x19\x79\x33\xff\x28\x20\x1a\x27\x3b\xb9\x5f\xce\xd4\xb2\x82\x9b\x87\xf8\x2b\xd4\x02\x47\x16\xfa\x50\x44\xfb\xea\x5c\x9c\x71\x08\x4c\xd2\x5c\xb0\x23\x05\xc0\x54\xa1\x5b\x5d\x43\x84\x14\x55\xe1\xda\xb1\x94\xce\xd1\xef\xee\xc5\xe9\xf8\x53\x85\x6f\xfb\x0a\xd4\x11\x68\x9e\xa9\x4b\xd1\x3e\x07\x4e\x49\xd6\x93\xa6\x07\x47\xfd\xe4\x7a\x42\x2d\x63\x65\x39\xef\xc0\x43\xf1\x60\x90\xe2\xcc\x98\x19\xba\x46\x82\xb8\x2b\xea\xe5\x85\x3d\x73\xaf\xf6\xf2\x13\x62\xfe\xb3\x9e\xff\x6c\xe4\x3f\x9b\x1e\xb0\x18\xf9\x94\xa1\xe0\x1a\xe0\x45\x71\x25\x5c\xf3\xca\x9f\xa0\x46\x14\x80\xec\xd9\xca\x86\x0e\x21\x86\xd0\xf7\xc1\x19\x05\x43\xe4\x17\x7d\x48\x95\x6f\x6a\xd9\x66\x41\xd9\xa6\xf5\x48\x54\x66\x08\x55\x5a\xf5\x54\x02\x55\x1f\xeb\xea\x63\x43\x7d\x6c\x7a\x42\x61\x61\x6c\xde\xab\xab\x68\x9f\x9c\x7c\xbf\x8b\x31\xb2\x4f\xba\x32\x4c\xd6\x59\xf7\xd0\xdd\xc8\xcd\x46\x34\xec\x40\x50\x5a\xb2\xb6\x0c\xec\x1b\xcc\x62\x85\xc2\x85\x24\x15\xd5\x09\xa6\x16\x1d\x57\x4d\x1a\xac\x73\x78\xfd\xbb\xc2\x6c\x6b\x36\x0d\x50\x5a\xd7\xa7\x43\xab\x65\xcc\x0f\xd4\x6a\xa8\xb5\x1a\x7a\x2d\xab\xb6\x29\x6d\xea\xd3\xa9\xd5\x6a\xda\xd4\x50\x6f\xb5\xb3\x83\xfd\xe8\x2f\x6f\x81\xb6\x13\xc3\xb1\xe5\x8c\x23\xf6\x5f\x3a\xaa\x9b\xa8\xfe\x92\xfd\x7c\xc5\x67\x88\xbd\x70\xec\xbb\x30\xc7\xe1\x20\x03\x4a\xf7\x1c\x8a\xb2\xc2\x89\xe3\xa8\x67\x64\xf2\x24\x75\x4d\x4d\x48\x5e\xbf\x4b\x8a\xae\x4a\x5a\x37\xe4\xae\xdf\x25\xa5\x56\x25\x6d\xe8\x52\xd7\xef\x92\xfe\x2a\x6d\x4a\xaf\x8d\x6d\x78\x69\xc9\xb6\x01\x00\x72\x75\x15\xb9\xba\x03\xb9\xc6\x1c\xe4\x9a\x85\xc8\xd5\x6e\x89\x5c\x43\x45\xae\xe1\x40\xae\x39\x07\xb9\x5a\x21\x72\xf5\x5b\x22\xd7\x54\x91\x6b\x3a\x90\xab\xcd\x41\xae\x5e\x88\x5c\x63\x2e\x72\x56\xd2\xfd\x30\x01\x1b\xa2\x34\xf3\x33\x6c\x16\x00\x76\x92\xd5\x2c\x1d\x03\x96\x91\xe9\x7a\x34\xf8\x42\xe6\x22\x6b\xd8\xbe\x90\x81\xc8\x74\xed\xb8\x55\x89\x62\x5d\x4f\x73\x78\x1f\x2c\x9f\x0a\x3d\x79\x48\x6b\x47\x3f\xb5\x58\x96\x8f\x7e\x6c\x31\x57\x90\x72\x6e\xc9\x97\x50\xb5\x1c\x25\x88\xf5\xc3\xb1\xab\xbb\xb1\x33\xd7\x8f\x81\x9d\xb1\x84\x54\xec\x6a\xb7\xc1\xae\x21\x61\xd7\x70\x63\x67\x2e\x20\x03\x3b\x63\x0d\xa9\xd8\xd5\x6f\x83\x5d\x53\xc2\xae\xe9\xc6\xce\x5c\x41\x06\x76\xc6\x22\x52\xb1\x6b\xcc\xc7\xce\xa4\x56\xcc\x03\x5b\xdb\xe5\x12\xba\x0d\x5b\xd6\x91\x2e\xe4\x18\xcb\x49\xdd\x5c\x2d\xab\xca\x10\x7d\x9a\x2e\xd9\x87\x1d\x85\x37\x50\xa3\xdd\x59\x6d\x36\x98\x06\xba\x6a\x53\x05\x73\x89\x45\x08\x48\x29\x73\x1c\x66\xaa\xe1\x67\x29\xcb\xf7\x84\x20\x85\xf7\xc0\xef\x63\xa1\x23\x16\x40\xfe\x1b\xcf\xfc\xf1\x44\x9c\x94\xf3\x0f\x7c\x4e\x29\xac\x0c\xcf\x32\xe9\x76\x7b\x65\x6b\xe7\x64\x85\x9d\x23\x2a\x63\x6e\x91\xfe\x19\x5f\x7b\xa8\x3f\xb8\x10\xd2\x7c\x0e\x65\x32\xf2\x09\x12\xb3\x0c\xe9\x50\x98\x84\x5f\xc9\xdb\xb1\x01\x62\x3a\xed\xae\x45\x89\xfd\x91\x46\x4d\xdd\xc3\xa3\x09\x4e\x2a\x5b\x3b\xf4\x5a\x9f\xea\xec\x9f\x3e\x61\x36\x2b\x72\x93\x2f\x9f\x3e\x85\x08\xb8\x60\x40\xa2\x58\x15\x6c\xb4\x1b\x1e\xb7\x4b\xd8\x68\x83\xed\x88\x64\x99\xb0\xd1\x6e\x79\xb9\x49\xc2\x46\x1b\x5c\x18\xc7\x41\xfb\xc7\x8d\x4e\xfd\xe6\xdc\x6b\x37\xee\x64\x2d\xf2\x2d\xcd\x44\x1e\xcc\x98\xe3\x1b\x9a\x65\xd0\x95\xf0\x1c\x31\x03\x0a\xd2\x3c\xea\xc7\xe3\x49\x1c\x41\xc8\x75\xf2\x6d\xf5\xe9\x13\x31\xef\xa3\xb0\xb7\xc2\x8a\x7e\xfd\x2a\x1b\x00\x08\xa7\xcf\x7b\x36\xee\xf0\x53\x9c\x5b\x75\xf8\x29\x96\xbe\xfd\x1a\x27\x01\xb8\xa5\x8b\x02\xe2\x8d\x0c\x61\x3a\x00\x7b\x31\xa0\xf5\x2d\x7e\xcb\x93\xc3\xb4\x7e\x56\x30\xc3\xe0\x59\xd5\x25\x0b\x55\x7a\xff\x21\x1b\xac\x03\x14\x1c\xf5\x57\xc8\x83\x86\x75\xa7\x25\xbe\xd2\xc7\x22\x43\x14\xf1\x65\xe7\x72\xf2\x76\x7b\x37\xbf\x6c\xa2\xcf\xd6\x1b\xac\x5e\x4a\xcd\xf3\xc8\xb2\xe2\xb7\x58\x19\x1e\x4f\x46\x7e\x66\x63\x50\x22\xc8\xf4\x1f\x11\x0b\xc8\xc3\x35\xa8\xe0\x54\x20\x78\x1d\xe8\xfd\xc2\x2f\x78\x85\x07\x98\xdc\x40\x2d\x54\xa9\x37\xd6\x51\x2f\xcc\xd2\x6a\x11\xc0\xf0\xd2\x02\x6f\xff\x97\xdb\x82\xfb\xb8\xf3\xbe\xfb\xf1\xb7\xdd\xc3\xe3\x83\x8f\x07\x87\xdb\x3b\x68\x0b\x42\x1b\x64\x7e\x94\xa1\x04\x4f\x12\x9c\xe2\x28\x0b\xa3\x0b\xae\x88\x21\x64\x38\x8e\x83\xbc\xef\x56\x98\xdb\x3b\xa5\x60\x32\x76\x6a\xc0\x94\x2e\x05\x35\x93\x23\xf1\x68\xa7\x28\xcb\x25\x61\x3e\x9b\x14\xdd\x2e\xb8\x7d\x4f\x13\x30\x78\x10\x39\x3e\xe4\x22\x4a\x71\xa9\x77\x82\xee\xc9\x1c\xa0\xd3\x21\x26\xa3\x9e\xc5\x68\xca\xdc\x04\x08\x0b\x40\xa4\x30\x80\x56\x40\xae\xe6\x0f\xfd\xc1\xc5\x06\x90\x2e\xc7\xb5\x2a\xef\xa8\x06\xb6\xb0\x5d\xa4\x14\x36\x23\xbf\x30\x72\x4d\x86\x0d\x7d\x6a\x8f\x29\xe1\x4e\x48\x8f\x20\xff\x19\x5f\xaf\x58\xcb\x72\xcf\xd0\xfe\xe0\x02\x55\x0e\xa1\x15\x7f\x54\x85\x3a\x7d\xdb\xe0\x95\x1c\x03\xb5\x2d\x1e\x47\x94\x4e\xe8\x0d\x21\x11\xde\x3b\x42\x28\xfd\xa2\x3e\x91\x73\x45\xd8\x77\x7f\x57\xa5\x04\xb3\x00\x52\xa4\x05\x79\x8f\xe7\x57\xcf\x2b\x74\x9b\xde\xa1\xc3\x1c\x27\x15\x76\x79\x06\x43\xe8\xa1\x3f\x50\x78\xb9\x81\xc2\xcb\x9c\x37\xde\x28\xa6\x07\xca\x7c\xab\x90\x36\x94\xb0\x50\x4c\x72\xd0\x35\x00\x72\xe2\x10\x5a\x9f\xdd\x38\xab\x6b\xd5\x22\x7b\xe8\x12\x5a\x49\x7a\x72\x2c\xc4\x47\x7a\xba\x5f\x7a\xda\xc6\xf7\x45\x4f\x02\xd2\xdd\xe8\x49\xe5\xd3\xb7\xa0\xa7\xfd\x28\xcc\x42\x7f\x14\x7e\xc1\x29\xf2\x51\x84\xaf\x46\xd7\x0c\xc3\x80\x0d\xc7\x7c\x5a\xe2\xbb\xc6\x6c\x10\x27\xe3\x83\x38\xc0\x68\x87\xfa\xaa\x41\x98\xe6\x9c\xd3\xc5\x89\x4c\xa7\x60\x5d\x0d\x6e\x7e\x9c\x6a\xc5\x26\x63\x27\xc3\xef\x8e\x64\xef\x8d\xac\x2a\xe6\x07\x1b\xa7\xb8\x25\xc1\x85\x51\xa8\x58\xd8\x88\x69\x92\xc8\xc5\xa2\xa2\xde\x9a\x4c\x08\x2d\xc0\x68\xf1\x6c\xd3\xa9\xe5\x9a\x81\x0c\xf1\xa6\xf8\xc9\x37\x45\x4a\x83\xe6\xa9\x38\x23\x92\x33\x35\xac\x8f\x93\x31\x9d\x76\xdf\xa6\xbb\xa1\xf4\x9d\x93\xd4\x66\x4e\x5e\x2f\x6d\x25\xa9\x1d\x0d\xd8\xca\x58\xcf\xe2\x21\x25\x74\xea\x01\x60\xeb\x07\xd8\x17\x55\x4a\x2f\x1c\xb0\xd1\x51\xf9\x30\xc4\x72\x48\x45\x4b\xa0\x3d\xbb\x23\xf9\xb0\x25\x68\xe2\xa6\xcc\x70\x52\xc6\x88\x8a\x1a\x15\x05\x7e\xe6\xa3\x1e\xc8\x5e\x6a\x09\x87\x3c\x06\xa0\x69\xa6\x0b\xee\xed\xac\x03\x3e\xc2\x09\xcc\x65\x3f\x8e\xfa\x09\xce\xf0\x32\x1b\x8e\x51\x7c\xa1\x30\x65\xe9\x5e\xea\x78\xb1\xb1\x86\x78\x1a\x80\x39\x75\x6f\x61\x3c\x05\x07\x12\x4b\xc1\xc1\x02\x9b\xde\xd7\x94\xb9\xc2\x10\xa0\x4c\xd9\x49\x78\x03\x6f\x83\x35\x20\x81\x2f\xb1\x73\x49\xfc\x49\xc0\xa2\x41\xb3\x58\x30\x82\x30\xba\xb8\x07\x6e\x92\x77\x7e\x93\x93\x07\x83\x5f\x79\x46\xda\x7c\xa6\x92\x49\x99\x7a\x57\x1c\x73\x27\x85\xb1\x92\x1b\x5a\x94\x57\x3a\x74\x0e\xee\x81\xa3\xc0\x36\xfb\x3e\x7c\x91\xab\xdb\x68\x8a\xb6\x87\xfc\x4b\x3f\x1c\xf9\xbd\x11\xa6\x66\x88\xa9\x7b\x5b\xfc\xc8\x3b\x53\x9a\xaa\x76\xc3\x88\x6d\x7c\x85\xfb\x14\x83\xab\xee\x33\xef\xe3\x8c\x79\x47\xd3\xa0\x69\x14\x52\xbe\x6b\xa0\x30\x45\x78\x30\xc0\xfd\x2c\xbc\xc4\xa3\x6b\xe4\xa3\x00\xa7\x59\x32\x85\x67\x0f\x25\xd8\x0f\x96\xe3\xa8\x8f\x4b\xed\x33\x65\xa9\x17\xd0\x78\x28\x1a\xa6\xc0\x1f\x9a\x92\xf9\x48\x56\xca\x13\xb1\xa8\xb2\x28\xf5\x8b\x8a\xf3\xc9\x9f\x17\x2d\x4f\xff\xbb\xf9\x5c\x4c\xa1\x90\x5a\x22\x1c\x14\x02\x40\x85\xab\x45\x29\x6a\xb9\x28\x59\x80\x21\x43\x3c\x24\x82\x2a\x5b\x70\x38\x60\xf1\x32\x39\xa7\xde\x95\x26\xc4\xba\xf8\xcc\xda\x73\x95\xcd\xf5\xc6\xfa\x6a\xb3\x21\x7f\xa2\x2a\x11\xdb\x17\x4d\x0e\xda\x40\x75\xe5\xab\x2a\xff\x6e\xa0\x46\x99\xb3\x53\x6a\x55\x65\xfb\xf3\x15\xd9\xc8\xb9\x36\xf9\xa9\x85\x8d\xf4\xe9\x10\x4b\x42\x01\x4b\xb4\xe5\xa3\x21\x68\x8d\x89\x90\x59\x62\x29\x72\x11\x76\x2b\xe2\xf8\x40\x80\x01\xbe\xac\x89\xd0\xc4\xd6\xb5\xa5\x43\xdf\xe0\xb0\xc4\xac\xbd\x4d\x95\xa7\xa6\x23\x37\x64\x5b\xe7\x2a\x53\xea\x6d\x38\xfd\xa6\xc8\x9f\xf8\x94\xe2\x11\xee\x67\xb4\xe1\x93\x2c\xf1\x33\x7c\x71\x5d\x71\x99\x6b\x4b\xda\x67\x10\x17\x37\xd1\x33\xca\x4a\x9f\x39\xcd\xc3\xd8\x6c\x1c\xf9\x69\x4a\xd8\xc4\x6b\x3f\xc5\x81\xe2\x31\x27\xff\x15\x1b\x87\x31\x50\x27\x38\x81\x03\x17\xd9\xd5\xdc\x90\x8a\x17\xb9\x9e\xdb\x8f\xdd\x67\x14\xd8\xa8\xbb\x90\x62\xe4\x24\x33\x36\xf3\x86\xa5\xc8\x6e\x34\x0f\x02\x66\x9f\x07\x71\x71\x43\x51\xf4\x90\xfb\x02\x47\x1f\x03\xcf\x61\xe9\xc9\xc8\x7e\xc3\xe8\xbf\x76\x9f\x73\x27\xb4\xd5\x9b\x22\x0f\x15\xde\x18\xe9\x98\x5b\x26\x54\x67\xdb\x32\x97\xac\x54\x99\x86\xd7\x7e\xf5\xa6\xea\xb0\xd3\x2c\xc1\xfe\xf8\x56\xaa\x6c\x90\xa1\x98\xf2\x59\xb6\xc1\x6f\x36\x96\x7b\x21\x35\xd8\x56\x4f\x34\x54\x3a\x81\x30\xd6\x92\x66\xba\x8e\x2a\xcd\x86\xaa\x98\x96\x14\xbe\x27\x80\x9f\xa6\xf6\xd5\x5f\x16\x78\x84\xec\x5a\xf6\x5a\xdb\x0e\xcb\x45\xc4\x89\x9f\xc0\x71\xcb\x26\x20\x9a\xdb\x1b\x1c\x6f\x72\xeb\x2a\x2e\x34\xfe\xf0\xc3\xb3\xc1\x68\x9a\x0e\x9f\x95\xdb\xe6\x28\x14\xd7\x46\x27\x86\x79\x03\xd5\x8b\xe6\x15\xce\xb5\x90\xd5\x74\x22\xdf\x96\xca\xca\xf3\x8f\x63\x7a\xf6\xed\xae\xb0\x1f\x7f\xdc\xcc\xa7\x10\xc5\x63\x07\xea\x19\x54\x22\xb5\x21\xdd\x6e\xb2\x83\xb6\xe1\x1c\xcc\xde\xcb\x4a\xef\x22\x05\xbd\xac\xa2\x1c\xf3\xe4\x5c\xb9\x7c\xbd\xf0\x6e\xba\xa5\xf6\xc8\xaa\x10\xd4\x33\xcb\xe4\x0a\x7e\xa0\xea\x6f\xb0\x1f\xf2\x99\xe2\xdb\x1d\xe8\x61\xbb\xaf\xbb\x86\x2a\x9a\x73\x94\xf0\x92\x7a\xed\xdc\x46\xf3\x9c\xc3\x28\xd4\x15\x8a\xba\x5c\xd1\x24\xd5\xbb\x95\xc6\x59\x4c\x67\x7e\x40\xfa\xcf\x9c\xce\x5c\x13\xbc\xe0\x74\x5a\x15\xbf\x25\xa7\x53\xd4\xbd\xc3\x74\x16\x29\x7c\xcb\x5d\x1d\x7c\xd3\xe9\xbc\xf3\x74\x15\x2c\x81\x39\xf3\xa5\xeb\x4d\x0b\x26\x89\x6e\x26\x42\xcf\xdb\xb7\x89\x75\xcc\xea\xfa\x12\x6d\xa2\xf0\x52\x9e\xad\xa2\x2d\x82\xed\x98\x34\xae\x74\x77\xe8\x87\x11\xa4\x3c\x71\xdd\xb5\xbe\x06\xbb\x81\x8f\xbc\xf3\x68\xd3\x1d\x7c\x40\x57\xb1\x29\x3b\x08\xa9\x6b\x10\x83\x34\x34\x79\x63\xda\x2e\x21\xee\x44\x5f\x16\x71\x94\xd7\x5d\xbe\x1d\x68\x27\x21\xa9\x09\x65\xee\x48\xaf\x5e\x77\x2d\x7b\x8f\x09\x9e\x36\x71\x24\xc2\x7f\x66\x5c\x8d\x41\xa9\xd4\xcf\x98\x51\xf7\x8a\x5e\xc7\x80\xa1\xd1\x2c\x95\x8e\x84\x56\x84\x09\x4b\x31\x97\x91\x90\xca\x09\x91\xf5\x86\x84\xd9\x65\x11\x20\xec\xe7\xd5\x10\xb3\xc8\xfb\x14\x3f\x08\xe4\x99\x96\x40\xce\x5c\x18\xf6\x82\xe4\x0f\xa6\x92\x89\x3a\xd4\x1b\x00\xd2\xe3\x41\x17\x84\x6b\x83\x2e\xcb\xca\x93\x81\x72\x15\xa0\x61\x26\xaf\x42\x71\xda\x42\x5b\x1d\x60\x91\x7e\x43\x22\x2f\x24\x87\xe1\x6c\x2e\xc4\x0a\x4d\x8e\x78\xe5\x30\x67\xfd\xed\xf0\x18\xce\xcb\x8c\xe8\xcc\x32\xb3\x38\x81\x7e\xe5\x8a\x6e\x0f\x29\xfd\xf2\xf2\x66\x6d\x42\x3f\xc3\x43\xf6\x75\xa9\xe8\xa3\x6b\xc5\xec\x18\x8f\x31\x48\xe1\xb0\xbb\x52\x12\x60\x57\x51\x70\xda\x07\x87\x76\x78\x6d\x56\xe7\x12\x2c\xbe\xe4\x61\xe7\x29\x33\xa5\xf9\xe4\x39\xde\xc2\x14\xd0\xd9\x01\xd9\x73\x67\xee\xba\x0d\x70\x89\x75\x2b\xf6\xa9\xc7\x75\xfb\xb8\x6e\xd1\xed\xd7\xed\x5d\x56\x07\x58\x08\x0f\xc3\x74\xe1\xb5\x61\xc5\x84\x51\x34\x70\x91\xdf\x0e\x8f\x9d\x1c\x40\xf6\x20\x33\x38\xc0\x5d\xd9\x8e\x15\xb3\xd3\x7c\x68\x7a\xb8\x1f\x8f\xd9\xd2\x21\x6c\x21\x8c\xa7\x69\x79\xe6\x21\x06\xab\x2c\x7b\x10\xa4\xc4\xbb\x51\x71\xe2\xbe\x90\x07\x14\x88\x48\x5c\x5a\xb2\x79\xf8\x0f\xe3\x38\xc5\x68\x1c\xce\x88\x2c\x64\xe9\x1f\x78\x82\x9a\x42\x1a\x92\x09\x91\x49\x61\x2e\xb2\x8b\x2f\x41\x3a\x25\x27\x9d\x74\xda\x4b\xf1\xff\x4e\x71\x94\x59\x55\x0c\x48\x15\xed\xa4\xac\x1e\xea\x28\x3a\x55\x83\x32\x4a\xda\xac\xcc\x57\xf5\x93\x9d\xcd\x86\x95\x2d\x46\x52\xbe\xda\xac\x91\x92\xc8\x1f\x4c\x60\x6e\x3d\x1e\x9e\xa3\xdf\x37\x69\xbd\xb3\xb0\x30\x74\x49\xfe\x9b\x9b\x40\xbf\xee\xb2\xf2\x4a\x40\x13\x49\xb4\x3d\xf2\x83\x80\x4c\xe0\x1c\x05\xc8\x04\xb2\x5c\x75\x57\xe8\x7f\xed\xea\x8f\xa3\xb7\xdd\x13\xf4\x7f\xda\xab\x6b\x68\xc2\x80\xa6\x4c\x97\x67\x83\x79\xf4\xb9\x9f\xae\x81\x9c\x3c\xf1\x83\x15\xfe\x54\x20\x1b\x1f\xf9\xfc\xfa\x79\x9a\xf2\xd0\xf9\x22\x10\x0a\x33\x57\x86\xb8\xc9\x02\x8f\x85\xec\xaf\x00\xb2\x7c\xfb\x4c\xd0\xb2\x56\xb2\xeb\xf1\x58\x08\x28\xe9\x3e\x12\x00\xa5\x22\x98\x25\x19\x14\x08\x67\xf9\xc0\xc7\x66\x71\xf8\x12\xe3\x4a\x7e\xe5\xd7\x6b\x9e\x16\x37\x4b\xb9\x60\xf6\x03\xfd\x72\xed\xd6\x0c\x44\x54\xa3\xb1\x4e\x36\xa5\xf1\x72\xc5\x0c\x99\x46\x99\xa0\x1d\xf0\x2b\x32\xa1\x46\x8c\x60\x0d\xa0\xf4\xc5\x32\x4d\x39\x2d\x22\xac\xfc\x43\x2b\x60\x6b\x96\xde\x0b\xf1\x76\xcd\xd0\x0b\x34\xd3\x1b\x7c\x25\xf4\x02\x11\x50\x14\x2c\x72\x5f\x17\xe3\x3d\x73\x70\x31\xde\x83\x5b\x8b\xf2\x76\x2e\x66\x85\x48\xa5\xc5\xe1\x0b\x72\xf6\xa3\xb6\x89\x42\xb4\xe4\x72\xcb\x97\xa1\xd3\x30\xf7\xd2\x9b\x02\xe9\x55\xc3\x0e\x6d\xe6\xb6\xef\xfc\xf0\x2f\x83\xf6\x54\x94\x6c\x66\x08\x5b\x41\x60\x1f\x04\x98\xeb\x7e\x1c\xf5\xfd\x8c\xc3\x2c\xad\x81\xf9\x10\x4d\x04\x43\x81\x25\x3b\xf4\x03\x1a\xc8\x88\x2d\xd4\x6f\xc3\x65\xa6\x91\xce\x67\xbe\x09\x47\x80\x66\x4b\x5c\xb9\x43\x39\x9d\x25\xd8\xf8\xc0\x1b\x9c\x29\x89\x8b\xa5\x45\x0c\x31\x60\xd1\xc8\x4f\x33\x78\x9e\xbf\xa6\x73\xf1\xfa\xac\xa2\x2e\xe7\x65\x54\xaf\x52\x17\xb3\x73\xe6\x0c\x66\xf3\x24\xa6\x82\x83\x9b\x62\x72\x70\x9b\xfa\x1a\x94\x36\x53\xba\x6d\x2e\xa8\xe7\xff\x33\x2e\x82\x6c\x2e\x0a\xf6\x9b\x05\xdb\xad\x42\xd1\x3d\xd0\xfd\x19\xfd\x1f\xc4\x01\xbe\xa1\xea\xc1\x53\x71\x5a\xa3\x97\x22\x70\x92\x90\xba\xd3\x7d\xdd\x75\x41\x61\x73\x75\x23\xe8\x8b\xc0\xd2\x85\x0d\x13\x22\x90\xbc\x83\xc0\xc1\x8f\x80\x0d\x80\x64\x38\xa9\x11\x38\xc1\x14\x30\xf3\xb4\x53\x1d\x6d\xdb\x68\xe2\x46\xf1\x46\x58\xc0\x30\x90\x4e\xb4\xfa\xb1\x2b\x59\x1f\x16\xdb\x00\x16\x04\x38\x53\xed\x43\x2d\x7e\x9c\x20\x37\x93\x11\x50\xd4\xa2\x48\x55\xec\x92\xef\x63\xb0\xfd\x74\xe0\x9f\x4f\xac\x79\x18\x30\x6c\x49\xb9\xa4\xad\x1a\x97\x38\x4f\x0c\x04\x2a\x6c\x89\xa0\xd1\x80\x53\xb9\x76\x37\x63\x97\xf6\x57\x9f\x17\x37\xaf\x5a\xaf\x54\xd1\xf3\xd5\x85\x31\x10\xaa\x16\xc7\x59\xe6\x2d\xc6\x13\xe4\x67\x68\x84\x09\x17\x8c\x23\xbe\x02\x58\x96\x0f\x6a\x09\x0a\xfb\x35\x30\x5c\x93\x6f\x21\x71\xbe\x19\x87\x11\x35\x12\x65\x87\x78\x23\x5c\xa2\xfa\xc8\x2a\xd1\xe9\x93\xf0\xa7\x84\x34\x06\xfb\x63\x7a\xe4\x0d\x2f\xd1\x4f\x3f\x59\xf5\xf1\x7a\xa0\x8e\xa3\x5b\xe9\x32\x72\x4c\x54\x65\x8a\xf3\x7c\xae\x37\x5b\xf6\x4a\xda\x2d\x92\xe6\x22\x89\x30\x94\x66\xaf\x2c\x04\xcd\x9b\xbb\x5f\x42\x5e\x5d\x25\x07\x19\x9a\xee\xcb\x25\x72\x81\xbc\xce\x4c\xbf\x40\x02\x87\xdf\x73\x75\x10\xfc\x2a\x9e\xda\x08\xba\x4e\xc9\xb7\xba\x8c\x7f\xb8\x65\xf5\xb0\x78\x5b\xdb\x03\xc9\x6f\xce\x0c\x50\xf9\xc8\xd6\xde\x3c\xcb\xbf\x3b\x5a\x2a\x80\xe9\x1d\x93\x3d\xec\x66\x28\xa8\x1f\x8f\x46\x98\xd2\x7f\x3c\xe0\xa2\x01\x88\x9a\x18\x72\xe9\x15\x89\x1e\x92\x28\x2a\x39\x79\x93\x6d\x34\xf1\xaf\xa4\x57\x56\xbf\x44\xbb\xeb\x07\x75\x40\x17\x42\x4a\x99\xda\xf9\xc5\x23\x64\x78\x60\x5c\x90\xd6\x27\xeb\xd3\x30\xc7\x75\x01\x4a\xfd\x11\xc5\x1e\x7e\x00\x30\x50\x49\xfa\x34\xfc\x28\x4e\xc2\x4b\x2a\xab\x70\x8e\x61\x05\xc8\xaf\x52\x73\x39\x5f\xb2\x1c\x34\x63\xad\x96\x93\x6b\x6e\xd3\xb3\x62\xf9\xa6\x3f\xc4\xe3\xdb\xc1\xb5\x0b\x9c\x4c\x65\x0e\x16\xd3\x03\x09\x9e\x15\x04\xcd\xc9\x78\x93\xe7\x6c\xa4\xa7\x18\x2a\x62\xf1\xb7\xba\x18\xd6\x8f\xa3\x4b\x9c\x64\x8a\x0c\x4b\xb3\xdd\x71\x63\x4a\xb0\xf8\xa4\xd6\x7f\x6e\xb7\xd5\x23\x5a\x45\x75\x5e\x15\x2f\x4b\xda\xc3\xcc\x77\xb1\x52\x51\x9b\x7f\xac\x13\xde\x4d\x32\x3e\x9a\x9d\xa8\x1f\x89\x24\x56\x93\x38\x4d\xc3\xde\x08\xbb\x57\xac\xa5\xa9\xc5\x9c\x9b\xf2\x81\x32\xed\x41\xe9\x37\x7e\x02\xff\xc3\x80\x82\x84\xfa\x9c\xac\xe0\x0d\xe9\x77\xee\xf0\x64\xad\xf4\x19\x5f\x6f\xa8\x7e\x51\xd6\x62\x9a\xa7\x94\xbd\x10\x59\xc6\x1b\xf0\xef\x9c\x82\x62\x55\x6e\x98\xee\x5c\xf6\x1a\x4c\x84\xd7\x2d\x13\xec\x85\x85\x5c\xaf\x1e\x9d\xdf\x76\x4f\xd6\xec\x15\x24\x16\xde\xb2\x97\x10\x0b\x47\x02\x4a\xdf\xad\x1c\x4e\x70\x74\x72\xf2\xce\xa8\x56\xde\x99\x4c\x9e\x7e\xbb\xe0\x35\x0e\x67\xfb\x91\x5a\xae\xb4\xe9\x11\x5d\xc5\xe9\x62\xcb\x18\x39\xd7\x8d\xc9\x4a\x34\xdf\x40\x07\x37\x21\x87\x3a\x37\x70\x6e\x60\xcb\xbd\x32\x60\x57\x80\xdf\xe1\x20\xd4\xd7\x78\x01\x1c\x48\x02\x96\xd2\x0c\x60\x90\x3d\x0e\xe7\x5e\x94\x39\xc6\x51\x4c\xdf\x68\x0c\x90\xe5\xec\xc7\x45\xdc\xa3\xec\x92\xa6\xc8\x8b\x6b\x3a\xb6\xb6\x97\xd0\xb3\x67\x76\xdf\x0a\x6b\xf9\x95\x2c\xa6\xf9\x86\x5c\xae\x1c\x73\x6a\x39\x48\xd5\x49\x98\xbc\xa2\x4c\x9c\x62\x6c\x5c\x56\x55\x79\x09\xf4\xf5\x2b\x25\xd7\xbc\xce\x0a\x9f\xc4\x6b\x7e\xec\x35\x74\x34\x56\x39\x89\x52\xd9\xbc\x7b\x0d\xda\x0e\x5c\x6d\x88\x9f\xf6\xdb\x0d\xd6\x73\x1b\x71\xda\x40\xb3\xe2\x22\x95\x31\xec\x5e\xea\x20\x16\x5f\x77\x88\x55\xe7\xbb\x97\x5c\xc4\x9b\x59\xee\xc7\xe3\x89\x9f\xc1\xf6\x52\x76\x19\xca\xdb\x82\xb6\x89\x49\xe2\x4f\xd9\x3d\xd1\xb6\xfc\x6e\x83\xdc\x7d\x19\x0e\xc6\xb4\xed\x13\x4e\xde\x0e\x42\x96\xa8\xcb\xc5\x1b\x15\xfa\x16\xc5\x4b\x73\xdf\x39\x6a\x19\x39\xd2\x92\xb2\x04\xf3\x2f\xb6\x40\x8d\x44\xdc\xd5\x2a\x90\x77\xb6\x63\x2c\xf4\xd7\x3c\xc4\x92\xe2\x4e\x55\xcb\x95\x14\xad\xc6\xd0\xde\x9f\xd5\x66\xed\x66\xa7\xde\xe9\xaf\x41\x62\x83\x4e\xbb\xd3\x6a\x0f\xda\x83\xf3\x2a\x57\xc5\x03\x68\xfe\x90\xf7\xc3\x71\x8e\x2c\x81\x82\x73\x2c\x1c\x87\x2f\x51\x37\x67\x64\x34\xac\xcd\xe2\x7b\x5e\xd1\x1a\x93\xfd\x95\x16\x15\x1e\xf9\x3a\xc9\xe9\xf4\xd6\x4b\x46\x8d\xd9\xc0\x17\xf4\x2d\xd6\xf0\xfd\x06\x70\x30\x85\x51\x6d\xe9\x4d\xfc\x24\xc5\x15\x65\xa1\x16\x5c\x4c\x26\xa9\xa2\xf8\xc9\xab\x59\xbd\x12\x48\x71\x44\x63\x78\xcd\x59\x74\x94\x30\x0c\x64\x8a\xd4\xab\x45\x10\xf9\x65\x9c\x74\x18\x66\x49\x21\x0c\x70\xa7\x38\xcd\xa8\x6d\x83\x3f\xb2\x2c\x50\x0d\xe6\x59\xed\x1c\x6d\x6e\xa2\x7c\xed\xa1\x9f\x7e\xd2\xdb\x3d\xab\xb3\x32\x7c\x4d\xba\x54\x50\x3b\x33\x7a\x81\x61\xb6\x8c\x54\x0e\x63\x2c\x7e\xad\x45\x66\xca\xd3\xf0\x50\xab\x5a\x60\x5d\x17\x5f\xb2\x23\x3a\x5c\x05\xe5\x30\xcc\xf2\x06\xfc\x09\x34\x50\xd3\x6f\xad\x8d\xe2\xca\xad\x4e\xbd\x53\x8e\x51\x58\x8f\x46\x8e\x63\x90\x27\x9d\x4e\x54\xd1\xbc\xf0\xae\x88\x2f\xc2\xab\xc4\x9f\x4c\x40\x8e\xf4\x33\xd6\xbc\xac\x32\x41\x3e\xd9\xe9\x53\xc9\x2b\xad\x70\xf5\x2a\xae\x3e\x86\x2b\x5b\xee\xf0\x63\xfb\x54\xd6\x81\xe4\xd6\x97\x3d\x42\xe8\xe1\x32\x7e\x91\x54\xcf\x75\x04\x72\x6f\x59\x67\xa9\x43\x68\x14\x50\xaa\x11\x07\x8c\xfc\x62\xc7\x72\x70\x2a\x0a\x11\xa5\x7b\x2f\x02\x42\x1b\x86\xa8\x26\x4d\x6c\x61\x50\x29\x76\xed\x40\xe6\x8d\x79\xd3\xdd\xc5\x43\x35\x57\x3e\x59\x8e\x3a\x05\xde\xe7\xac\x69\x6a\x83\xc2\x7e\xe7\x7e\xe7\x7f\x91\x18\x2e\xf6\x2d\x6c\xeb\xcf\xdd\xc0\xc8\xb2\xb4\x6b\x54\xcc\x65\x25\xfc\x2b\x4d\x6d\x84\xe2\x6a\xe9\x38\x85\x3d\x5c\x83\x79\x90\x1a\x5d\x9d\xf0\x4d\x1b\xf7\xc4\x6a\x73\x48\x03\x05\xca\x0e\x8b\x73\xac\xdb\x8b\xf5\x76\x21\x74\x16\x8a\x9e\xb3\x63\xb3\x5f\x97\xa2\x1b\xc4\xb9\xf3\x89\x2d\x00\x9a\xd5\x67\xd5\x10\x4b\x72\xcf\x0c\x11\x20\x81\x75\xf6\x36\x92\x49\x17\xfa\x97\xc3\x84\x2b\x60\x03\x0a\xb3\x37\x22\x1c\x57\x38\xe6\xba\xf6\xa3\xf2\xdb\x69\xd1\xa6\xad\xec\xaf\x66\x41\xae\x5a\xb4\x7c\x22\x64\x25\xfa\xb6\x12\x5e\x5a\x8a\x48\x3a\x42\x46\x2f\x66\x19\xaa\x15\xcc\x01\xc1\x85\xa8\x59\x4c\xe8\x03\xf3\x92\xec\x95\xa5\xb0\xa4\x0b\xd4\x2d\xac\x2d\xa5\x25\xbd\x20\x21\xbd\x81\xe5\xb8\x76\x53\xfa\xd8\xc2\xee\xa1\x53\x31\x71\x42\xf1\x25\x5f\xcb\xa0\x07\xdb\x9e\x64\x02\x10\x3b\x94\x76\xd1\x24\x3d\x42\x6a\xef\xbf\xe2\x3e\xa5\x05\x68\x11\x91\x8e\xbf\xc1\xde\x94\x47\x55\x9e\xcf\xa6\xb9\xf7\xbc\x85\x4d\x73\xb2\x63\x61\x14\x24\x8f\xfa\x5b\xb3\xec\xfb\x46\x51\xdf\x97\xee\x71\x4b\x71\xc6\x2e\x70\x44\x18\xf8\x06\xbb\x0a\xd3\x38\x48\xaa\x05\x79\x31\x69\x80\xe5\x9d\x82\xdd\x7e\xc3\xf9\x55\x46\x3e\xe7\x26\xb6\xe6\x18\xa7\x30\x37\x0c\x79\xf2\x94\x4d\x4c\x89\xba\x48\x87\x25\xdf\x9b\x24\x26\xa3\x28\x7c\xac\xdb\x84\x68\x62\x61\x6d\x8c\x95\xad\xe9\x63\xa5\xde\xbf\x80\x8e\xc9\x4f\xd3\xe9\x18\x07\xea\x7d\xa2\x3f\x4a\xb0\x1f\x5c\x4b\xfb\x9d\x72\x20\x9b\x46\x34\x6d\x65\x89\x88\x66\x8b\xb1\x3d\x3b\xff\x5a\xe8\xd0\x44\x18\x17\x98\xa8\x27\x29\x5e\x98\xd7\xbb\xf5\x45\xd3\x68\x51\x58\x7f\xa2\xc4\x6d\x90\x3c\x55\x21\x1d\x72\x2a\x40\x82\xf8\xed\x3c\xe0\xa3\xa1\x53\x92\x57\x0f\xab\x6c\x4b\xe5\xcd\x62\xd7\xc8\x8b\x70\x4e\x08\x1b\x6e\x13\x42\xd9\x93\xb9\x54\xf5\x8b\x0d\x54\xa8\x1d\x65\xd0\x0a\x94\xa2\x86\x66\xc2\x7a\x43\xf2\xd6\x6e\x22\x31\xef\xca\xe4\x73\x30\x80\xfb\x12\xfa\xdf\xe2\xcb\x92\x79\x56\x18\xe6\x85\xc9\x5b\x0a\x9d\xb4\x52\xee\x9e\x64\x9b\x80\x87\x3b\x7d\xd2\x18\x59\xcb\xfb\xbf\x70\x85\xc1\x84\xc5\x0b\x2a\xaf\x8e\xe5\x35\x98\xe5\x05\x7b\x00\x39\x85\x34\x03\x80\x8b\xbd\x42\xf2\x40\xe5\x98\xda\x56\x84\x11\xb3\xe4\x65\x76\x00\xcc\x64\xe6\x02\x47\x60\xcc\x5b\x0c\x4d\x44\x29\x77\x00\xa3\xa1\xb3\x8b\x61\x99\x3a\x03\x50\x61\x49\x42\xd2\x16\xea\xb4\xc0\xe4\x18\x3e\x70\xfb\xd9\xfd\x01\x8a\xc7\x21\x91\x11\x3c\xe4\xd3\x4f\x57\xe1\x68\x84\x7a\x58\x34\x18\xa0\xc4\x8f\x82\x78\x3c\xba\xbe\xa7\xc3\x3d\xb5\x9a\x60\xc3\xe4\xa1\xfd\x5f\x3c\x98\x52\xd2\xf8\x37\xe0\x42\x74\x92\x03\x93\x05\x49\xd4\xb8\x82\x67\xb8\x3f\xcd\x70\xe5\x19\x8f\x46\xf5\xcc\x63\x89\x3b\x3c\x66\xbe\xe5\x10\x8b\xee\x09\xba\x87\x9e\x91\xe1\x20\xff\xff\xcc\x7d\x66\xa6\x60\x64\xee\xc6\xa9\xd9\xe3\x24\xea\x31\xea\xa2\x8a\x4d\xbb\x51\x3f\x9d\x66\x36\xcb\x0e\x45\xf5\x0f\xce\xab\x24\x43\x89\x4c\xe1\x54\x3a\xad\x55\x23\xad\xb9\xc5\xad\x8e\x2e\x6d\x69\x5d\x9b\xd2\x0a\x8d\x37\x4b\x13\x0f\xe4\x0a\x5c\x11\xe3\x2e\x4f\x83\xcc\x16\xd2\x4d\x75\x85\x25\xf2\x96\xc6\x03\xf0\xb7\x06\xac\x25\xb4\x99\x15\x63\x00\x76\xd3\x86\x9a\x5c\x24\x83\x66\x0a\x72\x9e\x4c\x96\x8f\x39\x7a\x6e\xea\xb3\x95\xd4\xd0\x79\x0a\x67\xbb\xb3\xd4\x31\x13\xa5\x16\x3c\x8c\xe7\x47\x6a\x21\x45\xdf\x4e\xab\x6d\xd3\x0c\x28\x2a\xee\x80\xf1\x65\xce\xf2\x34\x96\xec\x09\x58\x0e\xf1\xeb\xf6\xfa\x70\x4b\x94\x38\xa1\x10\xb7\x7f\xb3\x69\xb8\x1e\x50\x3f\xfe\x76\x7b\xf7\x06\x91\xed\x93\x5b\x50\xda\x76\xe1\x5c\xca\xe3\xcc\xb6\x78\x8b\x5b\x48\x2b\x6e\xe9\xb0\xdb\xf9\xe1\x73\x30\xd8\x90\xb6\x67\x89\x42\x16\x54\x8f\x33\x97\xaa\x45\xf6\xe5\xef\x43\x5f\x5e\x28\x1d\x7c\x07\xea\x88\xbf\x88\xda\xdc\xb2\xf8\x4a\x69\x92\x9f\xf1\xa1\x76\x85\x95\x7d\xf8\x86\x3d\xf4\xc7\x03\x6b\xb0\xf3\xed\xe8\x1b\x29\x1c\xb4\xdd\x35\xce\x5c\xca\x5d\x9b\xec\x42\xc0\x13\xb1\x85\x8b\x2b\x12\xf6\x74\x78\x85\x8c\xc1\x9e\xe9\xb6\xe7\xf2\xee\xa4\x62\x2c\xed\x9b\xd1\xa5\x15\xd8\x62\x15\x0c\x56\xac\x21\x09\x9c\x8a\x79\x45\x5f\xe2\xbe\xce\x90\x03\x40\x18\xf3\xa3\xb6\x2f\xe9\xf1\x0d\x34\x0e\xc2\x19\x4d\x06\x02\x15\xac\x43\x2a\x9d\xad\xa9\x61\xa6\x02\xdd\xa5\x37\xb1\x9e\xf8\xee\xa0\x0f\xfe\x13\xf8\xf1\x3d\x2b\x88\xbf\x77\xc6\xfc\x3d\xea\x89\x6d\xcc\x70\x51\x45\xf1\x9d\x18\xe3\xbd\xa3\x68\x2a\x8a\xef\x8b\x71\x97\xd4\x13\x7f\x73\xde\xfd\xcd\x95\xc5\xdf\x7e\xab\xf0\x14\xdb\x1e\xc7\x09\xed\xfe\xf6\x8e\x52\xfa\x70\xf7\xfd\x85\x6d\xeb\x90\xc7\xb7\xe4\xee\x51\xa4\x20\xcf\x55\x79\x22\xd3\xa5\x9c\xd2\x92\xe5\xaf\xbc\x39\xf7\xda\xcd\xef\x35\x29\xe5\xbd\xe7\xa0\x5c\x34\xf7\xa4\x92\x73\xd2\x40\xcc\x4c\x3f\xa9\xa5\x9d\xe4\x15\x1d\x89\x27\x41\x3f\x9a\x03\x17\x3f\xd5\xe4\x93\x07\x7e\x36\xf4\x90\x25\x05\x65\x7e\xbc\x7e\x17\xf7\xfd\x11\x9a\xc4\xa3\xeb\x41\x38\x42\xf1\x00\xd1\x4d\x8b\x9d\xe2\x2d\x47\x5e\x16\xdb\x7e\x53\x2d\xa8\x35\xac\x30\x26\xf1\x7a\x97\xbc\xbf\x79\x69\xc6\x0e\x92\x6c\x2d\x7b\x9f\x0c\xa6\x06\x36\x82\xd3\x1e\x99\x41\x9d\x88\x77\x57\x26\x49\x9c\xc5\xe4\x13\xda\x24\xa7\x0f\xbd\x00\xab\x87\x36\x51\x84\xaf\x08\x02\xc5\x10\xa2\xe9\x68\xe4\x58\x28\x02\x83\x7c\x99\x48\xf1\x8e\x6c\x91\x3c\xf9\x9c\x14\x2b\xb9\x9d\x8a\xed\x77\x61\x2f\xf1\x93\xeb\x79\x3a\x72\x29\x3f\xa8\x13\x14\x64\x0b\x65\x5a\x4f\x22\x5c\xf0\x2e\xfb\x23\x14\x46\x43\x9c\x84\x4a\x00\x57\x25\xa2\x83\x9e\x67\xd4\x8c\x30\x6a\x4e\x67\x89\xb0\x7f\x3c\xc6\x30\xb8\xc7\x09\x3f\x83\xa1\x9f\x71\x84\x58\x28\x0f\x2a\x06\x19\xa7\x4a\x84\x8a\xe2\x00\x72\xb9\x2b\xbe\xc4\x49\x12\x06\x38\x45\x47\x54\x21\x12\xe2\x94\x32\xf0\xc9\x35\x0a\x23\x96\xcd\x38\x47\xa0\x44\x0b\x7a\xae\x86\xd3\x45\x01\x18\x32\x97\xa3\xdc\x22\x51\x03\xc9\x44\x1d\x5c\x9f\x52\x12\x56\xa4\x9b\x02\x93\x44\xd9\x5f\x2c\xc4\xa3\x60\x03\x3d\x83\x4c\x59\xcf\x74\xc3\x11\x7b\x9b\xe4\x6f\x8c\xb3\x61\x1c\x14\xfa\xc8\x4b\xa5\xf5\x18\xf9\x36\xc7\x33\x84\xcc\x70\x86\x14\x7d\xc5\x20\x9b\xcf\xab\x33\x88\xe1\xc4\xbf\x8a\xcc\x2f\x12\x23\x21\xc2\x42\x9e\x56\xcf\x65\x4e\xbc\x35\xbd\x18\xe3\xc8\x62\x3a\x4c\x76\x94\x62\x2c\x50\xce\x7c\xd8\xb9\x2b\x2f\x6f\x4d\xff\x60\x45\x80\x99\x49\x71\xd7\xaf\x50\x38\x96\x26\x76\x9c\x7e\xe0\x4d\x0e\xfd\xf4\xf0\x2a\x62\x64\x7f\x5d\x79\x46\x6a\x3e\xab\x0a\x9f\x27\xf2\x08\x9b\x20\x2f\x4f\x5e\xcc\xed\x07\xad\x55\x38\xdd\x96\x5a\xff\x4f\x3a\x9d\x10\x51\x2b\x0a\xb3\x15\x9f\x08\xa7\x6c\xeb\xf3\x93\x8b\x29\x19\x5d\xeb\x78\x20\x4b\x06\x85\x82\x71\xca\x3d\x6e\x93\x67\x29\xca\x39\x7a\x48\x95\xc2\x7c\xd2\xe9\x2a\x35\x21\xc8\x1d\x54\xf6\x03\xc7\xb6\x83\xb8\x62\x7c\x80\x13\x1c\xf5\x49\x03\x30\xce\x13\x7d\xbd\x1a\xc3\xc0\xe4\x62\x1b\x40\xe7\x3e\x83\x6c\xa9\x31\x6c\x4c\x75\x07\x56\x4a\x2a\x33\x4d\xaa\xf2\x9e\x46\x74\x1c\x60\x02\xe9\xaa\x35\x43\xa0\x6e\xf1\xf9\xc8\x33\xd8\x54\xaa\xe2\x1a\x8e\x88\xd2\x10\x52\x0e\x80\x54\xaa\x7f\x65\x5e\xc9\x23\x96\xa3\x4d\xc6\x36\xf9\x9d\xc5\x5c\x5e\x44\xcb\x15\x73\x3c\xb3\x11\x58\x72\x79\x9c\x6c\x73\xe5\xf2\x08\xea\xd2\x1a\xe1\xef\xd4\x75\xe2\xa4\x1a\x5e\xfc\x36\x64\x53\xe4\xae\xee\x98\x2b\x74\xc8\x98\x19\x4b\x12\x00\x24\x05\x26\xf4\x41\x80\xd2\x78\x8c\x69\xea\x29\x74\x35\xc4\x11\xba\x8e\xa7\x89\x30\xb3\xf7\x89\x38\x4b\x81\xdf\x73\xec\xdc\xbb\xee\x82\xba\xa3\x73\xd1\x5e\x86\x28\x03\x58\x59\x31\x47\x46\x0c\xfd\x2d\xb7\xbb\xb9\x68\x94\x9a\xd3\x6e\x3c\x21\xc2\xce\x24\x97\x7b\x98\xbc\x73\x07\x71\x4a\x02\x06\x1a\x26\x45\xa6\x1a\x83\x26\xf2\x9e\xa7\x94\xad\x4e\xba\x7f\x96\x95\x5f\x6e\x39\xee\xd0\x88\x72\x89\x2d\xfa\x67\x5d\xe3\x22\xe2\x21\xbf\x6c\x7b\xef\x8f\xc1\x68\x62\x4e\x3d\xc4\xb6\xea\xbc\x98\xbe\x59\xcb\x00\xab\x85\x5b\x2c\x99\xce\x33\xb9\xf8\x39\xda\x94\xda\x57\x3f\x2d\x90\xba\xc8\xb1\xc9\xee\xa0\xab\x38\x7a\x96\x51\xf9\x99\xbb\x3b\x4a\xc1\x0b\x47\x71\x3c\x41\x7e\x2f\xbe\xb4\x6c\x83\xc5\x5d\x7e\xc6\xa1\x3d\x73\x77\x18\xb8\xa8\x68\x55\xee\xa7\x78\x5b\x22\xaf\x56\xa9\xc5\x23\x0e\x27\xd0\x53\xb0\x7f\x59\x64\xdd\xd8\x36\xbe\xfe\x28\x8e\xf0\x03\x70\x3c\x80\x8b\x36\xf3\x3d\x04\x5e\x94\xd8\xc9\x48\xb1\xb9\x1b\x99\x9c\x8b\x44\x15\x8e\x38\x3f\xb5\xda\x93\xd9\xcf\xc8\xd6\xdb\xfd\x08\xf9\xe0\x79\xab\xc5\x22\x2c\x8c\x2c\x64\xc4\x79\x2f\x06\x61\x0b\x4f\x23\x8c\x1f\xd4\x70\x88\x69\x78\x11\x85\x83\xb0\xef\x47\x19\x0b\x28\x19\xd2\xde\x03\x48\xda\x8e\xed\x98\xfc\xab\xe4\x41\x4c\xcf\xca\xf2\x9b\x7b\x08\x1b\x63\x36\xaf\x93\x85\x23\x0c\xbe\x6c\x7a\x35\x67\xac\x91\xd5\x2c\x4c\x8c\x94\x76\x83\x31\x77\xd0\xf0\xbd\xa5\x7a\x91\xfd\xb3\x95\x8d\xdd\xb0\x85\x71\x68\xff\xcb\x03\x38\xab\xcd\x6a\xb5\x5a\xbd\xd6\xa8\x35\x3d\x54\x9b\xd5\x5a\xb5\x76\xad\x53\x5b\x3b\x7f\x30\xc0\x1e\xea\x94\x0e\xbd\xc2\xc2\xd7\xf1\x19\x31\x56\xec\x15\x73\x08\x86\xe5\xca\x1f\xe8\x7f\xbf\x7e\x85\x98\xbd\x9a\xa8\x31\x40\x15\x31\xbd\x3f\x6c\x5a\x14\x85\xf2\x1f\x40\x95\x8c\x86\xf8\xcf\xd2\xc6\xa4\x3a\x00\x4a\x1e\x23\x1c\x5d\x64\x43\x6a\x7a\xe4\xe4\x22\xe5\x63\xc6\xe4\x0b\x65\xb1\x48\x31\x3b\x51\x3f\x0e\x08\xbd\x63\xfa\x43\x27\x77\x78\x5d\x1c\xfb\x53\x10\x00\x8e\xfa\x2b\x7b\x78\xe6\x6e\x73\x5e\x00\x99\x52\xab\x7d\xe1\xe0\x2e\x39\xb1\x96\x88\xec\x62\x89\x6b\x30\x2f\xac\x8b\xa5\x8a\x32\x24\x1f\xb2\xc1\xfa\x42\xd1\x5c\xd8\x54\x38\x63\xb9\xf0\xa9\xfa\xfa\x15\xed\xe1\x59\x61\xf8\x96\x39\x04\xd4\xf7\x33\x1c\xb1\x3d\x5f\xa5\x20\x07\xf3\x77\x13\x92\x74\x0f\x9b\x0f\xf8\x29\xe3\x86\x12\x65\x42\x9a\xdf\x45\xef\x75\xcb\xe2\x52\x86\x36\x04\x76\x75\x1e\x3f\x43\xbc\x69\xb8\x53\x9a\x41\x49\x9d\x29\xd1\xc0\xce\x8b\x85\x23\x21\x03\xfb\xab\xc1\xb0\x2c\xbe\x8a\xd9\xd0\x17\xa1\x0e\x72\x12\x73\x97\x0e\xd3\x93\x9c\xc7\x28\x3c\xc7\x01\xfc\x44\x65\x49\x14\x7e\x5e\xc7\xe8\x54\x77\xe4\x8f\x27\x08\xcf\x20\x92\x64\x2f\xd4\x3b\x47\xef\x55\x49\x19\xf3\xb6\x81\xde\xa7\xf6\x6d\x41\x52\x14\xc4\xff\xe1\x08\x94\x0e\xf5\x89\x48\x1a\x61\xd8\x6a\x91\x9f\x21\x1f\x65\xe1\xd8\x22\x71\xdb\x42\xb2\xcb\xdd\x75\x27\x85\x90\x07\x87\x14\x45\x9b\x04\x3d\x36\x0b\x67\x21\x8f\x8a\x4d\xfe\x53\x69\xb4\xd0\x32\xaa\x84\x14\xe3\xe7\x68\xbd\x5a\x15\xd1\xb2\x9d\x52\x3c\x85\xa3\xf6\x78\x09\x85\x22\xdc\xf6\xd7\xcd\xbc\xe9\x57\xaf\x78\x1b\x96\xf2\xa2\xd1\x12\x82\xbf\x73\x5b\x92\xc7\x94\x2e\xae\x3b\x8d\xa9\x3b\xca\x7d\xd9\xee\x6f\x22\x73\xb0\xcb\x64\x0c\x36\xa9\x50\x6c\xb6\x4b\x9b\x2a\x9a\xb6\x1c\x2b\x7e\x18\xf9\x3d\xfd\xe4\x21\x1d\x00\xca\xb2\x53\x1a\x83\x83\x08\x81\x8a\x60\x18\x66\x77\x15\x05\xf3\xc5\x29\x56\x97\x83\x49\x91\xcf\x65\x43\xf7\x5a\x58\x93\x29\x47\xd9\xe2\x22\x39\x99\x8c\x9d\x61\x58\x44\xb5\x33\x01\x83\xc7\x99\xdf\x84\xa5\x43\xff\x80\xf4\x9b\x0d\x42\xfa\xa9\xc2\x17\x2c\x04\xaf\x88\x52\x9b\xe8\xc0\xcf\x86\x2b\x7d\x1c\x8e\xf2\x9a\xab\x68\x81\x88\x44\xf6\xf3\x6f\xa9\x9d\xc7\x61\x8e\x64\x1c\x7f\x6f\x6b\xf7\xc9\x8e\xbb\x32\x2d\x18\xe7\x5d\x95\x16\xe6\x9d\x73\x65\xb0\x70\x52\xa3\xb8\xca\xd1\xcf\xcd\x93\xf3\x8a\x49\x23\xcc\xfc\xbe\xe6\x34\xa9\x23\xf5\x16\x9f\x02\x49\x6c\x18\x84\xa3\x11\x0f\x3b\xcb\xdc\x24\xe0\xbc\x35\x5f\x28\xe1\x87\xb9\xc8\x76\xe8\x95\x41\x39\x5d\x7c\x4a\xcd\x32\x83\x54\x8a\x50\xee\xcb\xf8\xac\xc4\x11\x8c\xb9\x82\xd4\xdd\x27\x2d\x5a\x42\x26\x93\xc8\x7e\xc4\x92\xd9\x83\x79\xa0\x22\x5f\x13\xf5\x86\x7c\xfc\xf1\xca\x1d\x65\xfe\xe3\x15\xda\x24\xff\x3a\x12\xa8\x8d\x3f\x7e\x21\xdb\xcc\xac\xe9\x07\xb8\xb3\xde\xd3\xc3\xaf\x8b\x62\x7e\xfa\x19\xc9\x9c\xa3\xe0\x9e\xa0\xc4\xdd\x1d\x6d\xb5\x52\x9b\xbd\xa8\x75\x5e\xa0\xe7\xa4\x0b\x5f\x60\x4f\xdf\xdd\xdd\xdd\xad\xa2\x25\xfa\xe2\xe7\x9f\x51\x6d\x56\xaf\xc1\x76\x4f\x10\x70\x6c\xf7\xb4\x8b\x95\xda\xac\xd5\x69\xd7\x28\xb0\x2b\x1d\xd8\x55\x59\x60\x30\xbc\x38\x9d\x82\xa7\x4f\x05\xd0\x78\xf5\x8a\xd6\x44\x4b\x08\x46\xba\xb0\x3e\xab\xbb\xba\x09\x75\xd8\x5f\x71\xd9\xa5\x4d\x54\x5b\x69\x3b\xcb\xc0\x98\xb2\xa2\xcf\xa9\xbd\x0d\xa7\xb6\x2a\xfa\x19\xad\xb4\xd1\x7f\xa1\x3a\xda\x40\xcb\xf5\x32\x22\x8a\xc1\x39\x54\x71\xc3\x43\x49\xdf\xef\x0f\x31\xcb\xae\x33\x5f\xe0\x20\x35\x3f\x12\x7a\x4c\x2a\x15\x5a\x95\x1c\x95\x14\x24\xc9\x6e\x22\x0d\x86\xfd\x8a\x89\x56\xdd\x44\x1f\x93\x0a\x2d\x0f\x04\xb9\xd6\x5b\xb3\xf4\xe9\x2a\xcf\xe1\x53\x11\xe5\x73\xf8\xe8\x2b\xaa\x95\x0c\x6b\x1e\xe1\x2b\xc9\xd9\x09\x6e\x1d\x99\x02\x24\xe2\xe9\x7b\x9e\x68\x23\x69\x77\x3e\x65\x47\xfb\x79\x86\x34\x38\xea\x83\x21\x0d\xfd\xaf\xdd\x90\x66\x0f\xcf\x4c\x4d\x80\x0d\x1c\x29\xb8\x49\x81\xae\xd0\xdf\xe5\xe2\x6f\xea\xea\x8b\x21\x9e\x95\x56\x61\x94\x38\x79\x2e\x18\x55\xb3\x54\xeb\xf7\xc5\xc8\x87\x78\x66\x86\xd0\x64\xe3\x27\x1d\xed\xe7\x27\x12\xb2\x06\xce\xbc\xed\x31\xf5\xaa\xf4\xc9\x33\x5d\xf4\x18\x49\x67\xdd\x04\x34\xc4\xb3\xee\xd0\x4f\x4a\xe7\xd9\x4a\xe7\x1e\xe8\x20\x47\x5a\x48\x0f\x72\x57\x77\x3c\xc4\x71\xec\xd8\x1a\x07\xb0\x04\x48\xab\x9a\xab\x7d\xea\x9d\xaa\x8d\xdf\xd9\xaa\x92\x76\x6a\x83\xe2\xba\x0e\x06\x21\xc0\x7d\x8a\xc3\xa8\xf2\xec\xd9\x2d\x22\x6e\x4a\x14\x4e\xd7\xdb\x22\x9a\x1e\xbe\x52\x28\xe1\x96\x5f\x30\x0e\xe1\xe9\xcf\x97\x9a\xf8\x62\xa3\x36\xdb\x62\x3d\x96\x8f\x94\x49\xab\x2c\x96\x28\x85\xd6\x79\xc7\x8f\x2e\xf4\x91\x1d\x65\x16\x59\x35\x57\x8b\xa4\xa6\x93\x1b\x65\x5b\x68\xa3\x20\x3f\x26\x5d\x2d\x4d\xd0\x4c\x40\xa7\xf7\xa3\x8c\x75\x76\x25\x9d\xf6\xd2\x2c\xa9\x84\x1e\x6a\x54\x3d\x48\xc2\x97\xab\x2c\xc8\x8a\x5a\xaf\xda\x1c\x70\x17\xde\xf3\x94\x61\x5a\x45\x8d\xb2\xee\xb3\xef\xfc\x2c\x8c\xea\xe5\x36\x2d\x56\x96\xef\x5b\xe2\xf1\x76\x5b\x17\xab\xfe\xe7\xed\x5e\x65\x11\xb8\xaf\x35\x35\x82\xf6\xec\x7b\x18\xc5\xe5\x3f\x6a\x1b\xa3\xc3\xf1\x1d\xef\x64\x12\x82\x74\x47\xa2\x53\xb7\x32\x48\xe2\x31\x79\xdb\x8d\x03\x0c\x9b\x54\xd9\x0d\x49\x06\x78\x87\x3d\x49\xa1\xdb\xdb\x6f\x4b\x82\x1c\x17\x5a\x0c\xdf\xf5\xe6\xc4\x56\x11\xdd\x9f\xe4\xe5\x56\x7e\x8b\x12\xb5\x16\xdb\xa5\x44\x35\xb1\x51\x89\x37\x0f\xbd\x57\x69\x4d\xcf\xcb\xe5\x1c\x4a\x5a\xf4\xbc\xb7\x2b\x7d\x46\xd0\x5b\x59\x25\xe4\x6b\x42\xdf\xaa\xec\xba\xc5\x85\xb7\x2a\x0d\xe1\xb2\x3b\xd5\x87\xd3\xdd\xe5\xf5\x72\x1b\xd5\x87\x6c\xb0\x2e\xb6\x29\xf6\x70\xbb\x4d\x8a\x36\xfa\xe7\xed\x51\x25\xdb\xbf\xaf\x95\x35\xcd\x06\xeb\xf6\x0d\x8a\x8c\xe2\x43\x6e\x4f\x59\x72\x5d\x60\x60\x14\x60\x72\x44\xff\x70\xbc\xdf\xe5\x9e\x4e\x15\x9c\xf6\xfd\x09\xae\x14\x6c\x9c\x26\x5b\x46\x7d\x3f\xeb\x0f\x51\xc5\x4c\x1f\x0d\x28\x0c\x93\xf8\x0a\xe8\x16\x32\xae\x54\x9e\x1d\xf8\xa3\x41\x9c\x8c\x71\xc0\xa6\x21\xf0\x33\xdf\x4c\x41\xb7\x38\x03\x97\x27\xf5\xf6\xfc\x9b\xcd\xd5\x22\x64\xf2\x5d\x33\x6f\xa0\x30\xca\xba\x73\x32\x2c\xcf\xb8\x59\x1d\x97\x31\x80\xb2\x35\x4c\x23\x46\x3d\xd4\x42\x40\xa1\x2b\x0e\xa7\x5a\x3a\x00\x8d\x48\xc1\x0b\xb9\x30\x71\xc0\xb2\x99\x49\x5e\xe8\xce\x4c\xbc\x92\x9d\xec\xb5\x94\x12\x6d\x3c\x4d\x33\xd4\xc3\x28\x24\x23\x3a\xc6\x51\x46\xf3\xac\xf9\x70\xbd\x9e\xe0\x4c\x78\x2c\x94\xca\xed\xab\xe5\xe9\x54\x95\xfb\x34\xc7\x21\x75\xad\xca\x13\xc4\x7f\xc6\x93\x0c\x4d\xa3\x09\x4f\x1a\xa8\x66\x07\x95\x6c\x5a\x6a\x16\xee\xfb\x9a\x8d\x03\x64\x1a\xdc\x12\xa3\x20\xbc\xc4\x5c\x9f\x4b\x9a\xc1\x41\x76\x57\x66\xcd\xa3\x8d\xf4\x33\x96\x44\x9b\x25\x31\xcd\x62\x14\x66\x29\xf7\x8a\x41\x84\x82\xef\x7a\xc7\xd4\xb3\x22\x4f\x13\xe2\xba\x2f\x99\x4a\x65\xdd\x65\xe6\x7d\x08\xac\x94\x6d\x36\x03\x90\x81\x93\x79\x2a\x6a\x3b\xab\xce\x94\x68\xf9\x68\xdb\xcf\x7c\x2e\xac\xd7\xca\x4a\x9a\x5b\x41\x90\x42\x1b\x3c\x2f\xb8\x63\xa4\x19\x2d\x94\xdf\x14\x45\x90\x05\x23\xf3\x38\x33\x76\x41\x74\xcd\x33\x27\x00\xca\x2f\xa9\x4f\x89\x2f\x59\x50\x52\x7b\x62\xe0\x78\x0f\x33\x99\x1f\x29\x3a\x95\x67\x26\xbf\x2f\x55\x6f\xfe\xde\xc8\x4a\x96\x49\x66\x6e\xba\xd7\xe7\xe9\xe8\xe4\x80\xa2\xd2\x00\xb1\x60\xa2\x2a\x28\xd9\xc7\x19\xc8\x68\x4e\x9c\x48\x46\x6b\x12\x53\x06\x0c\xe7\x47\x4a\xdb\x82\xae\xb9\xc8\x97\x9b\x12\xd9\x80\x19\x44\xbb\xb4\xa9\x26\x49\x2f\x4b\xc1\x3c\xd7\x69\x8a\xfc\x4b\x3f\x1c\x41\xc4\x2e\xca\x17\x80\xd9\xb9\xa9\xe6\x54\x72\x56\x09\xa3\xcb\xf8\x33\x4e\xf5\x24\xc3\x15\x96\x1c\xd8\x43\x57\xc3\xb0\x3f\xb4\xb2\xea\xde\x75\x01\xab\x36\x5b\xe5\x0b\xa5\x17\xc7\x23\xec\x47\x37\x28\x88\x77\x47\xd3\x74\x88\x7e\x1d\xe2\x8c\xc6\x33\xe1\xb9\x68\xc1\x5d\x6b\xe2\x27\xc0\x28\xd8\xab\x9c\x6b\x0b\x76\x7d\x8b\x70\x20\x82\xd3\xc3\x88\xdf\x7d\x9b\x17\x00\xb7\x29\x21\xb9\xd6\x0c\x4f\x95\xeb\x8a\xcb\xb1\x20\x18\x7b\xa6\x60\x35\xd6\x2a\x2d\xaa\x2c\x3e\x3a\xe0\x0b\xea\x4c\xd8\x12\xc9\x89\xdb\xa2\x2d\x21\xaf\xb9\x71\x1a\x8c\xac\x4b\xad\x42\x3e\x4a\x86\x66\x2e\xba\xe7\xc5\x73\x59\x61\x53\x4b\xc9\x5c\x54\x98\x43\xcf\x6b\xdb\x23\xfa\x75\xe3\x69\x94\x71\xfa\xb2\x30\x13\x02\x34\xa2\x89\x84\x8f\x21\x6e\xf1\xa6\x8a\xff\xaa\xd6\xe4\x4b\x93\x17\xb9\x86\x9c\x61\x70\x1c\x4f\xa3\x00\x4d\x27\xd4\xa1\xb0\x3f\x9a\x06\x58\xa3\x7b\xb3\x9a\x86\x51\x6e\xe4\x22\x7f\x28\x1f\xdb\x56\x60\x11\xc4\x57\x91\x8c\x47\x1c\x8d\xae\xd1\x60\x2a\x16\xa5\x25\x92\xfe\xea\x2a\x1a\xe1\x94\x3a\x55\xda\x65\x2d\xe0\x1b\x09\x1e\xfb\x61\xa4\x0a\x57\xe5\xfa\x35\xf6\x67\x15\xa5\x5f\x70\x71\x8a\x96\x6d\x99\xd9\xbd\xf9\x57\xaa\x62\xce\xa9\xe6\xc1\x35\xe5\x40\xc9\x1c\x0f\xa5\xf5\xe7\x48\x22\x40\x17\x3d\x01\x6d\x38\xc9\x89\x7c\x55\xfb\x18\x46\x15\xb9\xc9\xe7\xa8\xe5\x29\x74\x66\x33\x9f\xe4\x19\xbc\x6d\x44\x42\xe8\x4e\x02\x58\xec\xb6\x45\xf9\x3c\x55\xb3\xb0\xdf\xaf\xe4\x11\x10\x6f\x97\xa4\xf5\xe4\x34\x9a\x20\x98\xe1\x84\x9c\x26\xc5\xc6\xb0\x9c\x1f\x10\xc0\x19\xd2\x5e\x91\x71\x17\x75\x0f\x12\x5c\xc5\x96\xab\xde\x35\xc7\x48\x49\x81\x95\x33\x7c\x98\x72\xb3\xa8\xc2\x7d\x65\x16\xa6\x27\xc3\x92\x47\xd4\x82\x86\xc2\xc9\xd0\xf2\xa6\x3c\xd3\xf3\xa9\x92\xc7\x16\x2d\xc2\xd6\xad\x70\x52\xf1\xf7\xe4\xa6\xef\x6a\xec\x56\x3a\x0b\x65\xa1\x93\xd7\x1d\xad\xdc\x1c\xbb\xe1\x9f\x64\xf2\xf6\xd1\xd8\x10\x73\x4c\xac\x33\x56\x68\xf1\xa6\xf2\x30\x71\xd2\x74\x64\xa2\xe7\x67\xf0\xa1\x9f\x42\x86\x5c\xe7\x89\x7b\x6e\x2a\xf2\x9c\x5d\xcb\x3e\x50\x74\xd2\x19\x74\x1a\x76\x0d\xa7\x28\x8e\xa4\xa3\x70\xbd\x83\x2a\xed\x7a\x03\x2c\x59\xab\x96\x63\xf1\x1e\xad\xcc\x8f\xc1\xe2\xd1\x7e\x1e\xbe\x97\xa8\xaf\x45\x19\xc8\x0a\x03\xa6\x16\xb9\x9a\xd1\x41\x58\x20\x27\xf9\x6d\xa3\xdb\x91\x86\x10\x0d\x91\x3c\x2f\xc8\x5d\x69\x1b\x12\x31\x07\x4a\xe8\xb6\x93\xbd\xad\x46\xbb\x63\x77\x12\x2b\x4a\x75\x7d\xeb\x08\x6b\x3c\xb6\x5a\xf9\x30\x6b\x27\x58\x84\xf7\x70\x6b\x08\x4c\x35\xc4\x1c\x4b\xec\x5c\x93\xc2\x17\xce\xfd\xab\x4c\x18\xbd\xdc\x87\x8a\x04\x10\x96\x55\x3c\x6a\x09\xc7\x4a\x02\xd0\x0a\xf3\x32\xa5\x06\x7d\x6f\x66\xc3\x61\xd9\x98\xf9\x86\x7c\xbc\xd8\x58\x7f\x98\x04\xc0\x32\xe4\xc1\xa6\x69\xf9\xcb\x67\xec\x73\x46\x10\xa6\xc0\xf5\x38\xc2\xa5\x5d\x88\x28\x2b\x62\xfe\x43\x73\x97\xf7\x02\x73\x3e\x05\xbc\x2a\xcf\x18\x52\x36\x5d\x8a\x5a\x72\xbe\xea\x84\x16\x94\x09\x45\x19\x03\xc7\x7a\x74\x68\x24\x98\xc2\x46\x85\x60\x21\x0f\x36\xbe\x44\x48\x27\xf8\xda\x40\x49\xe7\x58\x53\xfc\xbd\x37\xdf\x89\x5d\x96\xe4\x26\x15\xb8\x38\x19\x24\x7a\x1f\x03\xca\x7e\x46\xf3\xc5\xb3\x9a\x79\xcc\x50\x14\xa6\x08\x0f\x06\xb8\x9f\x85\x97\x78\x74\x8d\x7c\x14\xe0\x34\x4b\xa6\xf0\xec\x81\x9c\xbe\x1c\x47\x7d\x5c\x2a\xca\x68\x49\x0a\x55\x12\x3d\x00\x4a\x79\x40\x6e\x28\xb1\xb8\xe6\x82\x0c\xc2\x3d\xed\x0c\x68\x93\x93\xa3\x48\x26\xe4\x50\x4b\x38\x4a\x17\x11\x7a\x41\xb5\xf9\x54\xcf\x8b\x2e\x44\xf7\xbb\x96\xf1\x35\x0f\x44\xc5\x60\xd0\xbc\xb5\x32\x4f\x80\x5f\x80\xb3\x4a\x23\xc4\x99\xec\xae\x34\x0f\xd6\xc5\x43\xca\xbb\x16\x8f\x94\xfc\xae\x5d\x6f\xac\x36\x1b\xe5\xc4\xfc\x94\x69\x7c\x94\xf8\xf7\x3e\x9b\xb4\x67\x22\x70\x52\x18\x65\x38\x19\x48\xd6\xc2\xc8\xb9\x2a\x38\x7f\x65\x5d\xe7\x54\x4b\xb7\x5b\x16\x1f\xd1\x47\x43\x3c\x9a\xe0\x84\x88\x3f\x25\x16\xc1\x2e\xc3\x8d\xf9\x06\xeb\x28\x7f\x83\x7b\x3c\x2a\x33\xe9\x4e\x15\xb4\xab\x2b\x1f\x69\xaf\xf6\xa0\x4b\x15\x9b\xb0\xe5\xd6\xcf\xc9\x55\x15\xe3\x41\x00\xed\xba\xdf\x33\xd6\x85\x3d\x00\x2e\x52\xcf\x8b\x6c\x25\xc2\x61\x51\xcd\x22\x96\x67\xb8\x54\x29\x7c\xf1\x63\xa3\x95\x9e\x08\x4b\xde\x3b\xd8\xea\xde\x3f\x3d\x11\x11\x9a\x07\xa5\x20\x2d\x30\xba\xfa\x4b\xd0\xd4\xde\xd8\xef\x97\xa2\xab\xb1\xdf\xbf\x0b\x6d\x89\xea\x77\xa2\xaf\xcf\xd8\xae\x42\x92\xe8\xab\xfb\x11\xd0\x22\xf3\x40\x89\x8c\x36\x42\xeb\x2e\x46\x6c\x85\xc7\x5f\xa1\x49\x9a\xe3\xc3\x40\xb0\x01\x27\x06\xf6\x23\xf7\x62\xe0\x99\x5a\x20\xa4\xef\x81\x9f\x0d\x69\x58\xdf\x27\xfc\x3d\x1b\xe6\x97\x79\xa4\xdf\x9b\x73\xaf\xdd\xfa\x5e\xc3\xfb\x32\x64\x2a\x3c\x1c\x71\xf5\xde\xe3\xfd\x72\xc8\x8b\xc6\xfd\x15\x18\xca\xf1\x7f\x5d\x41\x7f\xc5\x77\x08\xfe\x6b\x0b\xa0\x6b\x5e\x51\xf0\xa8\xb1\xf9\x94\x49\x04\x20\x45\x83\x95\xde\x17\x84\xa7\x51\x6a\x4b\x2e\x30\xae\x30\xb2\x9d\x56\x39\x13\x2d\x56\x96\x1b\x69\x89\xc7\xdb\x99\x69\xb1\xea\x7f\x9e\x9d\x56\x59\x04\xee\x8b\x53\xf6\xa0\x3d\xbb\xa9\x16\xc5\xe5\x6f\x60\x4b\x6c\x94\x1f\xfb\x13\x21\x1c\x8e\xfd\xc9\xe2\xb1\x17\x2c\x2e\xe2\x26\x08\x97\x55\x26\x1d\xf3\xdb\x1a\x2c\xa3\xa5\x4d\xd4\x74\xdb\x2c\x5f\x67\xb8\x6e\x31\x5a\xa6\x7f\x2e\xd3\x65\xfa\xe7\x34\x60\xe6\x80\x1b\x39\xe0\x4a\x88\x96\x50\xbd\x6a\xb1\x89\xe6\x5f\xca\x58\x46\x73\xc0\x4d\x0d\x70\xc3\x09\xb8\x61\x05\x6c\x87\x9c\x25\xe1\x64\x04\x57\x2f\x15\x3a\x2c\xaf\x5e\x81\xdf\xc4\x57\xfa\xdc\x20\xcf\xeb\xe4\x11\x50\xb0\x41\x11\x53\xf1\x89\x4e\x45\xe5\x13\x7a\x45\x5a\xff\xe9\x27\x04\xd8\x7c\x42\xcf\x51\x6d\x65\xad\x2d\xcd\x50\xf5\x25\xfa\x54\x10\xee\x42\x9a\x7b\x6a\x0b\x3e\xf6\x27\x60\x33\xbb\x95\x55\x2a\x1c\x61\xe8\x74\x07\x3d\x47\x95\x26\x5a\x46\x9f\xaa\xac\xa7\xcd\x81\xd5\xdb\xc9\x88\xcf\x60\x2a\x2e\x82\x80\xa7\xfb\x36\xa9\x91\x7d\x20\x28\xa1\x4d\x24\xa1\xd3\x31\x9c\x49\x20\xb6\x5e\x5e\xdc\x6e\x1c\x3c\x0c\x47\x18\x55\xe4\x7e\xb2\x70\x01\xae\x58\x23\xd6\x61\x91\x9b\x59\xbc\xcf\x8c\xb3\xca\x50\xef\x60\x27\xaf\xf0\xe4\xdb\xdb\x59\x0a\x56\xbb\x10\xa3\xff\xae\x4d\x2d\xd9\x0e\x41\xed\x7a\xe4\xad\xa4\xbc\xb9\xa5\xa8\xb5\xe0\xe6\x20\xea\x09\x43\x79\xf1\x46\x18\xca\xcf\xe7\xfb\x46\x89\x04\x5f\xe2\x24\xc5\x07\x52\xc1\xfc\x95\x2d\xae\xd9\x0f\xf9\x67\x27\x75\x17\x02\xb5\x6d\x01\xfc\x4f\xe7\x3f\x84\xfd\x90\x15\xca\x3a\x58\xc8\x69\xd4\x86\xcf\xf8\xc2\x66\xb6\xf9\x9f\xaa\xe7\x68\x13\x7d\x2a\x17\xab\xd3\xc2\x52\xf6\x2f\xa2\x38\xc1\xdf\x8c\xab\x48\x20\xf7\xa3\x00\xfc\x9c\xf3\xe9\x0e\xc9\x9b\xc3\xc1\x3c\x9e\x21\xb5\x43\x61\xfc\xb0\xb9\x89\x96\xeb\x73\x78\x92\x4c\x61\x72\xed\x5b\x31\x62\xab\x48\x90\x88\xb4\x97\x29\x7e\x17\xc7\x93\x7c\x49\x78\x3a\x0e\x9e\x34\xa3\x8a\xc8\xa1\xdd\x78\xfa\x93\x0d\xf4\x6c\xeb\x75\x77\x7b\x67\xf7\xcd\xde\xfe\x3f\xdf\xbe\x3b\x78\x7f\x78\xf4\x7f\x8f\x4f\x4e\x3f\xfc\xf2\xeb\x6f\xff\xfa\x1f\xbf\xd7\x0f\xf0\xe0\x62\x18\x7e\xfa\x3c\x1a\x47\xf1\xe4\x7f\x93\x34\x9b\x5e\x5e\xcd\xae\xbf\xd4\xea\x8d\x66\xab\xdd\x59\x5b\x7f\xb1\xb4\xba\xc9\x22\xdc\x8a\xa3\x9d\x58\xb4\x0b\xa3\x9a\x0f\xb1\xc3\x2b\x25\xb7\xdc\x50\x2c\x4c\x6d\xa2\x90\xd6\x8e\xcd\x4d\x85\xcc\x74\xe8\xd8\x6f\x98\x63\x57\x4a\x84\x24\x69\x79\xe4\xd4\x24\x3b\xb0\xa0\x65\x54\xaf\x9e\x83\xf7\x4a\x2e\x30\x35\x4c\xe2\xe2\x40\x1b\x65\x80\x56\xcf\xf9\x06\x2f\x8b\x61\x16\xa8\x54\x20\x8a\x94\xc8\x3d\x5f\x89\x30\x03\xe8\x7f\xa5\x2d\xca\xbe\x35\x51\x71\xf0\x1e\xc4\x86\x78\x69\x49\xf9\x20\xc8\x56\xfc\x60\x14\x69\xc4\x96\xb4\x86\x45\xb8\xc9\x73\xf7\xe8\x87\x7c\x69\x8f\x78\xe9\xcc\xec\xd3\x7e\x3c\xfa\x3f\x1e\xfd\xc5\xd1\xff\xc3\xe9\xee\x72\xbd\x83\x5e\xef\x94\x76\xd0\xaa\x77\x5e\xef\xc8\x3e\x5a\xf5\x8e\xfa\x04\x5f\x6f\xef\xb4\x45\x91\xf9\x73\x1d\xb7\x4a\xe2\x70\x8f\xce\x5b\xf5\x8e\xd3\x7b\xab\xde\xf9\x1b\x68\x04\xca\x1f\xd6\x61\x30\xee\x72\x56\xb7\xfb\xfb\x83\x65\x54\x1c\xe0\xa3\x38\x8c\x32\x97\x93\x71\xbd\xe3\x70\x32\xb6\x1e\xa6\x73\x4c\xdd\x5e\xc6\xa2\xc9\xb2\xae\xc6\x12\xd0\x3b\x9c\xa0\x74\x22\xbe\x93\xb3\x1a\xd0\xe6\xa2\x6b\xe3\xbb\x3e\x46\xd1\x55\x25\x5c\xd6\xf8\xe2\x5b\xc8\x67\x0d\x2a\x2d\xe6\x6b\xcc\x6b\x09\xf9\x96\xbf\x78\x68\x4f\x63\xb5\xe1\x72\x8e\xc6\x75\x90\x7d\x04\x86\xaa\x9b\x31\x11\x81\xf2\xc5\xd2\x20\x8b\x45\x0b\xc2\xe6\xa6\x70\x97\x94\xa3\x8d\xce\xf3\xf2\xa1\x30\x18\x59\xbe\x2b\xb1\x87\x49\xfb\xd4\xbb\x3b\xef\x53\xef\xbe\x83\x7d\xaa\x0c\x0e\xf7\xbd\x4f\x59\x97\xd3\xbb\x9d\xc7\x6d\x4a\xfc\xdd\xdb\x36\x95\x5e\xf9\x93\x9d\x28\x08\xfd\xa8\xb2\xe8\x8e\x65\x3b\x92\x7f\xff\x5b\xd6\xbb\x87\xd9\xb2\xca\x2c\x93\xef\x7f\xcb\x7a\xb7\xa3\x6d\x5a\x8f\x3b\x96\xb1\x63\x49\x2b\x66\xa1\xcd\xeb\x9b\xee\x5e\x62\x5e\x24\x6c\x09\x20\xa5\x8f\x3c\x1a\x3e\x7c\x61\x77\x27\x74\x71\xd7\x6a\xe4\xff\xe1\x62\x85\x7e\x24\xdd\x67\x5f\xe9\xb7\x7c\xf9\xcf\x53\x17\x00\x61\xb9\xb5\x05\x9d\x3b\x69\x0b\x58\x8e\xda\x6f\xa9\x34\xf0\x90\xf4\x2a\x1d\xfa\x75\xed\xd5\x70\xec\xf7\x1f\x50\xb5\xe0\x21\xde\x2c\xfc\x82\xd6\xfe\x0e\xea\x06\x23\x5f\xec\x2d\x54\x11\x8a\x11\x8b\xf4\xe5\x60\xbb\x0d\x35\xc1\xe4\xe6\x60\xbb\x6d\x93\xf1\xc0\xc4\xf9\x33\xbe\xa6\x59\xb0\xa9\x1d\xac\xe8\x2b\x38\xff\xfa\x51\xc6\x93\x78\xc7\xc9\x98\xda\x68\xef\xfc\x72\xf4\x11\x36\xdd\xd3\xf8\x2d\xce\x85\x41\x74\x75\x75\xb5\x12\x4f\x70\x94\xa6\xa3\x95\x38\xb9\x58\x0d\xe2\x7e\xba\x0a\x49\xb8\xe3\x55\xad\xce\x30\x1b\x8f\x2c\x8a\x90\x9d\xcb\xc9\xdb\xed\xdd\x1c\x6d\xf1\x5c\x32\x18\xc2\x7c\x1f\x10\x6d\x8f\x33\xbc\x5f\x58\xca\x73\xd8\xa3\xc8\xc0\xa4\xe4\x21\x8c\xb8\xdb\x8b\x14\xee\x39\x77\x75\x69\xa1\x4a\xbd\xb1\xae\x78\xba\x18\xf0\x1d\x46\x6a\x72\x58\x0c\x3d\x41\xca\xc1\x76\x7b\x1e\xb6\x61\xc6\x6c\x91\xf5\x20\xd5\xd2\x87\x2c\x46\x13\x6a\x75\x2a\x7b\xe7\x38\x76\x38\xc3\x2f\x46\xdb\x1d\xd8\xf0\x6c\xa0\x7a\x63\x1d\x4c\x48\x95\xaf\xb4\x73\x80\xb9\xf6\x25\xc7\x47\x69\xfb\xe6\xd6\x6e\x37\x0e\xa2\x7d\x68\x3f\x1c\x2c\x35\x7a\x0f\x66\xd6\x9f\x83\x81\xe1\x7d\x43\x69\x7e\x4e\x8a\xa6\xf9\x15\xff\xc8\xe7\x6a\x5d\xcb\xe7\x77\x5b\x30\x9e\x3a\x8d\xb5\x5a\x4d\x07\xbc\xa0\x77\xd0\x5c\xbf\x9f\x72\xf2\xee\x36\xa4\xf0\x27\x34\x42\xa8\x02\x12\x61\xfb\x90\x81\x95\x2c\xda\xdb\x58\xe9\xf3\xba\x34\x16\x80\x0d\x50\x41\xe5\xd4\x1f\x65\x68\x0b\xfe\xb3\xb8\x58\x0c\xd4\x45\xc9\xfb\x3e\xc8\x0b\x93\xcd\xe3\x73\x30\x58\xa1\x6e\x11\xb8\xc2\x3b\xe3\x01\x7e\x05\x79\x6b\xa0\xb8\x92\xdf\x51\xad\xb9\x90\xc0\xab\x4e\xb1\x45\xbc\x25\x2b\x9d\x71\x0f\xb3\xb6\xf0\x52\x23\xe4\xc1\x4c\x94\xf3\xd5\x61\x85\xe5\x72\x0b\x83\xd0\x02\x74\x88\xdf\xc2\xd8\xd8\x52\xa2\x2d\x72\x46\xce\x81\x09\x9f\x60\xf1\xc6\x79\x5c\xe6\x7b\x0c\xed\x11\x7b\xb2\x94\x93\x98\x38\x2d\x9a\xbf\xb0\x60\xf9\x86\x6d\x4c\x04\xbc\xfa\x91\x19\xb3\x68\xb8\x72\x83\x96\x57\x1c\x1f\xeb\x51\x80\x88\x71\xe0\x39\xe0\xbc\x60\x56\x5d\x96\x68\xd9\xf9\xd7\xca\x48\x0e\xc6\x90\x3b\x81\x30\x28\x9c\xd8\x24\xa3\x60\x83\x5e\xd5\xe6\x85\x3f\x9d\x59\x82\xd0\x84\x18\x38\xf3\xb3\x72\x50\xaa\xd3\x83\x92\x34\xd0\x85\x69\x7f\x34\xec\x05\xb2\xce\x51\xb0\x61\x6c\x19\x2a\xf3\x9d\x44\x56\x2c\x66\x8c\xb5\x0d\x6d\x94\xa5\x5a\x92\x8e\x86\xd3\x9f\x25\xda\x85\x08\x30\xc7\xeb\x95\xb5\xb9\x2e\xc5\x83\x65\xbf\xe3\x5b\xf1\xde\x05\xf9\xee\x3d\x7a\xdf\x5a\xfc\xca\xa4\xde\x94\xe7\xe6\x52\x25\x45\xbb\x21\xbd\x57\xb9\x7b\xfe\x01\x29\x5c\x5d\x6c\xda\x74\xbf\x76\x71\xf6\xc5\xaa\x79\xc8\x21\x36\xdc\x05\x4c\xa1\xd8\x20\x54\xc8\xb9\xac\xef\xda\x73\x4c\x17\x16\x36\xec\xaa\xc4\x02\x8e\x2b\xc5\xfb\xdd\xcd\xcb\x82\xe3\x3b\x85\x66\x3f\xbb\x7b\xfc\xf0\xb9\xd1\x5e\xf7\xf8\x91\x74\x63\x6d\x8d\x9c\xe9\xd7\xfe\xd2\x67\xfa\x7e\x38\x19\xe2\x64\xf9\x81\x4d\x04\xe0\xf4\x2e\x37\xf5\xe7\x1c\xe2\xcd\xcc\x9d\xf7\x72\x9a\xef\x42\xc7\x8e\x08\xc7\x49\xc5\xa1\x5d\x7e\xe9\x36\x21\x10\xef\xb5\x4c\x18\x4a\x0d\x72\x86\xf3\x33\xa8\x44\x7f\x72\x46\xcc\x2a\xee\xc2\xcb\x8c\x45\x55\xa0\x45\x16\x48\xa7\x41\x4e\x37\x74\x6e\x32\x3c\xcb\xc8\x29\xd2\x67\xcf\x68\x42\xfb\xc4\x7c\xb3\x78\xaa\x0d\x3f\xc0\xfd\x70\xec\x8f\x46\xd7\x2c\x0d\x68\x50\xfa\xe6\x46\x1e\x95\x1b\xd6\x0a\x1b\xb8\x53\x81\x86\xda\xec\xe2\xc9\x38\x6e\x83\xdf\x83\xa6\xe7\xc8\xa7\x44\xba\xd5\x91\x3b\xbf\xd8\xc5\x8e\x52\xd3\xe1\xa8\x25\x97\x59\xc9\x67\x37\x4f\x20\xb1\x87\x67\xb7\xcc\x04\x61\x19\x5e\x89\x7c\xe4\xfb\x86\x05\xa7\x53\xbb\x79\x08\xa3\xc9\x34\xbb\xcb\x9c\x72\xf2\x50\x89\xee\x16\x74\x76\x5f\xc4\xd1\xd7\x18\x85\x85\x3e\x6e\x9d\x54\x02\x46\xcb\x1e\xc2\x26\x9f\x9c\x4d\x94\xb7\x41\x2b\xbc\xb4\x52\x4f\x57\xa1\x1e\xae\x11\xc8\x01\x6d\xc8\x40\x6f\xec\xba\x79\xf7\x4e\x9b\x77\x57\xdb\x6d\xa5\x0d\x62\xa3\xdd\xf0\x34\xe5\xf9\xfa\xa3\xa9\xdd\xdf\x5d\xf7\xed\xda\x1d\x8d\x48\xe6\x45\x9a\x70\xf3\x90\x02\x0e\xc0\x42\xe3\x6a\x4d\x44\x45\x4a\x6c\xca\x8e\xaa\xf7\x93\x90\x1e\x5c\x5e\xe7\x72\xbc\xd2\x4a\xe2\x92\xaa\x28\x22\xab\x83\xf3\x32\xee\x27\x38\xbb\x27\xa5\x12\x91\x7f\xf7\xec\x81\x83\xa0\x97\x8c\x4d\xd8\x3c\x91\xa9\xa3\x6f\x59\x8d\xa1\xec\x1c\xec\x08\x10\x6c\xd5\x19\x09\x7d\x11\xf5\x51\x10\x8f\xba\x87\x7b\x81\xb7\xdb\x7d\xc6\x97\x85\x03\xd3\x9c\xf0\xb2\xf4\x50\x25\x45\x97\xd5\xc7\xc9\x6e\x88\x5f\xa0\x98\xa2\x1d\x7d\x2d\xc5\xc5\x64\x5d\x2f\x8a\x8c\xa9\x55\xe2\xfa\x02\x1d\x96\x3d\x4a\xe6\xd6\x68\x14\x5f\x21\x3f\xe9\x85\x59\xe2\x27\xd7\x88\xa9\x97\x3e\xe3\x6b\x4b\xdc\xc1\xcf\xb2\x46\xe2\x67\x6b\xc3\x05\x03\xa5\xab\x5b\xca\x8d\xd6\x1c\x67\x48\x82\x52\x81\x1b\x24\xc4\x7f\x03\xdd\x46\x9c\xa0\x30\x8a\x70\x02\xd1\x67\xe3\x69\x06\x02\x84\x1e\x85\x0f\x62\x26\x52\x1d\x23\x25\x43\xf6\x40\x5b\x31\x02\xd2\x71\x8d\x9f\x5c\x23\xb4\xd4\x58\x84\x04\x62\x49\x2b\x19\x17\xe9\x23\x43\xa9\x60\x28\x15\x34\x1a\xfb\xed\xf0\x18\xe6\x93\x5e\x03\x4e\xfc\x00\xf5\xe3\x28\xcd\xfc\x48\x6f\xde\x9a\x44\x4a\x9d\x63\xb7\x62\x4d\xe0\x7d\x16\x9e\xa3\xdf\x37\x51\x6d\xd6\xee\xd3\xff\xd9\xdc\x61\x8c\xc2\xcd\x0e\xfd\x5f\xb1\x66\x2c\xd6\x74\x62\xa1\xf6\x6c\xa3\xc8\x3f\x21\x0e\x19\xec\x40\x0f\x11\x85\x4c\x30\xf1\x7b\x89\x44\x56\x90\xaf\xcc\xc6\x8c\x2d\x03\x09\x9d\xb6\xf1\x71\x87\x9e\x54\xd5\x17\xe7\x0b\xe6\x76\x11\xc8\x60\x98\xbf\x9b\xf8\x63\x07\x5b\x5d\x16\x7d\x0c\xf0\x0a\x61\x89\x15\x46\x42\x59\x70\xca\xcb\x04\x22\x33\x4a\xdf\x7f\x30\x32\x99\x24\x78\x2b\x73\x83\x8f\x3d\x54\xf4\x30\x18\xea\xff\xf4\xe8\x61\x73\xc4\xd4\x45\x44\x44\xc2\x43\x73\x1a\x9a\x1b\x41\xcc\x5d\x63\x6e\x14\x31\x77\xd5\x07\x8a\x24\x76\x77\x6e\xd7\xa5\xea\x69\x18\x6f\xcb\x7e\x4c\xa4\x8b\x3d\x7b\x70\xb4\xc2\x80\x63\x85\x1c\x53\x1e\x2b\x0d\x68\x2e\xa1\x70\x49\x83\x5f\x32\x09\x54\xaa\xce\x90\x63\x63\xbf\x6f\xbf\x24\x12\x07\x7f\x87\x11\xdc\x8b\xbf\xb4\xc2\x7c\xd6\x69\x2d\x5b\x5e\x8f\xc2\xde\x32\x41\x25\x00\xdb\xd6\x54\xfb\x8a\xa3\xfe\x32\xd8\x34\x5a\xde\x53\x37\x4b\xed\xc3\x38\x68\xcf\x37\xbe\x4b\x87\x7e\xa3\xad\x83\x24\x2f\x1b\x3a\xb8\x74\xe8\xb7\xeb\x0d\xf3\x65\x73\xdd\x52\xb2\xa9\xbd\x4a\xc2\x09\x1e\x07\xf5\x4e\xcd\x6a\xfb\xa7\xbc\x9a\xf4\x3e\x07\x03\xbd\x1d\x7c\x39\xf9\x1c\x0c\x8a\xee\x1d\xd4\xae\xc7\x01\x5e\xee\x0f\x7a\xd6\xd7\x59\xe2\x78\xbd\x7c\x31\xf2\x83\xb1\x1f\xd9\x3e\xc7\x76\x60\xb8\xaf\xbf\x9e\xf8\xc1\xb2\x1f\xa5\xe1\xec\x45\x43\x1f\x04\xf2\x29\x4c\xe3\x7a\xad\xde\xd0\x47\x9c\x7d\x7a\xb1\xf6\x62\x4d\x9f\x21\xf2\xe9\x0b\x4e\x62\xe6\x7a\x6d\xf9\x1a\x39\xbe\x51\x1d\xd9\xf2\x10\xcf\xb4\x0f\x3e\xd6\x89\x8b\xc6\xdd\x08\x8c\xf7\x49\x5f\x9f\xdc\xc4\xef\xf5\xc2\xcc\xfa\x72\x79\x84\x2f\xfc\xfe\xf5\x43\xdf\x01\x89\xd5\x03\x4f\xfa\xa2\x81\x97\xf9\x5a\x11\x8f\x6c\x89\xc0\x33\x59\x19\x9a\x59\x28\x5b\x07\xe2\x77\xa3\x25\x7e\x13\xaa\xe7\xbf\x09\xb1\x8b\xdf\xf4\x57\x4e\xda\xb9\x7d\x29\xfc\x62\x84\x4c\x31\xa0\xf4\x6b\xdc\x61\x51\x74\x38\xb5\x4a\x4f\x59\xa2\x3e\x09\xda\xcc\xdf\xc6\x4a\x0d\x42\x89\xb4\x59\x99\x00\xc5\x1b\x41\x77\xf2\x1b\x4a\x6e\xe2\x8d\x4c\x65\xe2\x65\xa4\xbe\x92\x68\x0a\x9e\x09\x29\xc1\x8f\x9c\x82\xe8\xa8\xf4\xd9\x40\x31\x7a\x91\x7e\x73\x32\x59\x54\x11\xa9\x28\x20\x65\x5e\xbb\xb8\x62\xd2\x1d\x8a\x8d\x75\x69\xa3\x5d\xf7\x8a\xb5\xc9\x9e\x4a\x57\x1b\xed\x96\xa7\x10\xde\x46\xbb\xed\xe5\x13\xbf\xd1\xee\x78\xea\xe8\x6d\xb4\xd7\xf4\x1b\x61\x9d\x94\x37\x3a\x35\x8f\x51\xeb\x46\x07\xf0\x11\x94\xb2\xd1\x69\x78\x32\xad\x6c\x74\x5a\x9e\x8d\x5a\x36\x3a\x4d\x4f\xa6\x90\x8d\x4e\xdb\x93\xe9\x67\xa3\x03\x78\x29\x34\xb3\xd1\x59\xf3\x74\xaa\xd9\xe8\xac\x7b\x3a\xdd\x6c\x74\x5e\x78\x06\x91\x6c\xac\xd5\x3c\x0b\x39\x6d\xac\x01\xfe\x6c\x49\x6c\xac\x01\xf6\x8c\x34\x36\xd6\x5a\x9e\x41\x1c\x1b\x6b\x80\x38\x21\xa3\x8d\x35\xc0\x39\x5f\x67\x1b\x6b\x1d\xf9\x02\xdd\xcb\x97\xec\xc6\x1a\xbf\x5a\x27\x8b\x79\x63\xed\x85\xc7\x97\xea\xc6\x7a\xcd\xcb\x97\xf0\xc6\x7a\xdd\xcb\x17\xf7\xc6\x3a\xa0\x93\x53\xf0\xc6\x3a\x34\x2e\x18\xcd\xc6\x7a\xeb\xe6\xdc\xeb\xd4\x1e\x2f\x0f\xfe\xfc\xcb\x83\xee\x10\xf7\x3f\x93\x4e\xc1\x4a\xa1\x6e\x40\x34\xcd\x59\x3a\x9d\x90\x81\xc1\x2c\x3e\xb5\xd4\x6f\x90\xe3\x69\x48\x73\xf4\xc3\x26\x7a\xc6\x21\x3f\xb3\x58\x84\x08\x27\x8d\x7b\xbc\xae\x28\x34\xc7\x17\xed\x1c\xe3\x01\x4e\x30\x1c\xf4\x92\xf0\x02\xce\x64\x61\x14\x66\x39\x98\x74\x3a\xc1\x09\xa8\xae\x37\xb5\xf4\x1c\x12\x94\xad\xe9\xc5\x18\x47\x99\x56\x00\x65\x31\x1a\xfa\x51\x30\xc2\xca\xb8\xc9\xb0\x7b\x56\xc8\x8a\x4d\x0d\x54\x35\xdd\x01\x25\xdd\x37\x8d\x25\x4f\x4d\xa0\xc2\x28\x5b\x97\x34\xf4\x03\xb9\xbe\x50\x4c\xa8\xb3\x63\x1e\xf3\xf3\x1a\x54\x09\xff\x81\x40\x85\x17\x32\x36\xca\x21\xc2\x8a\x58\x4c\xd3\x7f\x01\xa4\xcb\x10\x5f\xb9\x50\x74\x36\x2f\x21\xbc\xcf\x51\x40\x5f\xbf\xaa\xe5\x39\xc1\x01\x96\xa0\x33\xe6\xd5\x7f\x20\x6b\x4e\xd8\x8e\xc0\xa2\xb3\x03\x37\xaa\x56\x8d\x56\x9c\x58\xd5\x3b\x76\xb4\xdc\x2d\x2d\x56\x63\x3f\xca\x9a\x8d\x45\x9b\x58\xac\xc6\xee\x28\xf6\x6f\x53\xa5\xd3\x82\xf7\x79\xf9\x5b\x92\xd2\x0a\xa5\x60\x0f\xc9\xaf\xae\x33\x7c\x08\xc9\x81\x8c\xd7\xb6\xbc\xcb\x0a\xfd\xed\xd1\x45\x97\xb7\x55\x66\x45\xe4\xa5\x17\x53\x21\xe4\xd0\x5e\x0b\xdc\xd0\xa6\x1d\x67\x8b\x66\x61\x67\xc6\xb2\xaf\x5e\x67\x36\xe3\xe7\x85\xdc\x05\x6d\xa8\x2c\x92\x4f\x3b\xaf\x7f\x16\x9e\xdf\x2a\x79\x76\x6e\xce\x1d\x7e\xc1\x54\x55\x9b\x3b\x8e\xaa\x45\x05\x63\xcd\x53\x5b\x78\x88\xb9\x11\xda\x3a\xa2\xcc\xb7\x35\xeb\x19\x19\x4d\xf2\x9a\xc0\x43\x11\x91\xfa\x64\x66\x6e\xb6\xeb\x4f\x26\xa3\x6b\xd6\xb0\x9f\x5c\x4c\x09\x0b\x4f\x8b\xfc\x15\x19\xbf\x5e\x99\x24\x71\x16\x13\x1c\x65\xce\x5d\x64\x38\xa1\xef\x3e\x76\x05\x4b\xa7\xfe\x28\xeb\xfc\x39\xb2\x0e\x04\x8c\xfe\x13\xe2\x12\x59\x73\x2a\x95\x30\x91\x80\x2d\x96\xde\xe3\xa1\x2c\xd7\xad\x93\x2a\xa7\x8c\x59\x48\x25\xa9\xea\x52\xbb\xf9\xb3\x49\x7a\x2e\xbe\xd2\x69\xd9\xb9\xc8\x29\x61\x13\x9b\x74\xf8\x56\xfc\x5e\x4a\x7f\xa4\x61\xc4\x82\xb1\x12\x96\x51\x9b\xd5\x6b\xec\xaf\x8a\xbe\xaa\x69\x7c\xd9\xf2\xaa\x54\xad\x16\xea\x07\xdb\x6d\xcd\x9a\xc2\x66\x00\xa2\x7b\x4d\xa2\x4d\x36\xaa\x16\x03\x10\x9e\xf6\xa6\xf0\x76\x2c\xd7\x04\xdb\x73\x15\x9f\x99\x9c\xb4\x36\xeb\xac\xb5\xda\x8d\x66\xad\xee\xa1\xda\x0c\x0f\xfa\x81\xdf\x5b\x7f\x61\xc9\xab\x58\x9b\xbd\x58\xef\xf9\x41\x7f\x80\x3d\x18\x98\x66\xa3\xdd\x5a\xeb\xa8\xe5\xce\x9d\x37\x62\x5a\x1a\x3d\xb9\x17\x07\x22\x93\x9e\x6d\xef\xba\xf2\x27\x08\x83\x7b\xf5\xfc\x3d\xa4\xde\x71\xef\x18\xee\xeb\x6b\x3e\x1b\x14\x89\x8f\x04\x1e\x4f\x2f\x88\x42\x47\x04\xde\x83\x8f\x52\xe9\x83\x33\xfe\x70\x6e\x73\x09\x91\x3e\x13\x82\x33\x0b\x90\xbf\x4a\xa5\x22\xc1\xa4\x9e\xe2\xe8\x2b\x92\x5f\xc2\x5e\xd7\xaa\x6a\x3e\xe2\xe8\x6b\x49\x80\x8d\x56\xd5\x02\x10\x42\x19\x2b\x2e\xe9\x26\xb8\xbb\x19\x87\xec\x29\x37\x14\xf6\xeb\x7e\x65\x48\x6b\x48\x1a\x53\xb4\x84\x6a\xba\xf8\xa0\x94\xae\x6b\xa5\xeb\x85\xa5\x1b\x5a\xe9\x46\x61\xe9\xa6\x56\xba\x59\x58\xba\xa5\x95\x6e\x15\x96\x6e\x6b\xa5\xdb\x85\xa5\x3b\x5a\xe9\x4e\x61\xe9\x35\xad\xf4\x5a\x61\xe9\x75\xad\xf4\x7a\x61\xe9\x17\x5a\xe9\x17\xc5\xb3\x53\xd3\x66\x67\xce\x64\xd6\xb5\xe2\xc5\xb3\x59\x6f\x68\xc5\x8b\xa7\xb3\xde\xd4\x8a\x17\xcf\x67\xbd\xa5\x15\x2f\x9e\xd0\x7a\x5b\x2b\xde\x36\xb8\xc1\xea\x2a\x61\xc8\x9f\xc3\xe8\x82\x54\x0d\xfd\x51\xcf\x26\x36\xfb\x64\x1b\x38\xb3\x0e\x54\x0f\x3e\x59\x07\xa5\x0f\x9f\xac\x03\x10\xc0\xa7\xa6\x0d\x9d\x6e\x7e\x07\xad\x7e\x23\x48\xec\xee\x56\x7c\x0f\xf5\x3c\xd4\xf7\x50\xe0\x49\x0b\xd4\x43\x68\xcd\x23\x5b\x68\xed\x5c\xe7\x0d\x01\xad\x17\x78\x48\x54\xcd\x47\xc8\x43\xa8\xde\xf0\xd0\xe9\x59\xdd\xa8\xd7\xa7\xf5\x68\x4b\xb4\x6a\xbe\x68\x49\xbd\x35\x52\xaf\x61\xd4\xeb\xd1\x7a\x02\x49\x5f\xaa\xd7\xf4\x10\x6a\x40\x7b\x4d\xa3\x5e\x51\xff\x5a\xa2\x7f\xad\x85\xfa\xd7\x16\xfd\x6b\x2f\xd4\xbf\x8e\xe8\x5f\x67\xa1\xfe\xad\x89\xfe\xad\x2d\xd4\xbf\x75\xd1\xbf\xf5\x85\xfa\xf7\x42\xf4\xef\xc5\x42\xfd\xab\xd7\x3c\xd6\xbf\xba\x49\x30\x45\x1d\xac\xd7\x3d\xd6\xc1\xba\x49\x31\x45\x3d\x24\x58\xd2\x1e\xd6\x4d\x92\x29\x24\xd1\xa6\xc7\x49\xd4\xa4\x99\xc2\x3e\xb6\x44\x1f\x4d\xa2\x29\xec\x63\x5b\xf4\x11\xa8\xc6\xec\xe4\x9b\x37\x8e\x4e\x7a\x08\xb5\x69\x27\x4d\xba\x09\x68\x45\x6b\x27\x09\xbd\xbd\xa0\x15\x4d\xc2\xe9\xd3\x8a\xf6\x4e\xd6\x3d\x44\x3a\x7a\x7a\x56\x37\x29\xa7\x47\x2b\x5a\x3b\x49\x38\x46\xa3\x06\x15\x4d\xd2\x29\xea\x63\x5b\xf4\xb1\x61\xe7\x35\xae\x3e\x12\x9a\xa3\x7d\x6c\xd8\x99\x8d\xb3\x8f\x6d\xde\xc7\x86\x9d\xdb\xb8\xfa\xd8\x12\x7d\x6c\xd8\xd9\x8d\xab\x8f\x2f\xf2\x3e\xda\xf9\x8d\xb3\x8f\x2d\xd1\x47\x3b\xc3\x71\xf5\x91\x30\x46\xd6\x47\x3b\xc7\x71\xf5\x71\x3d\xef\xa3\x9d\xe5\x38\x69\xb5\xe9\xf1\x3e\xda\x79\x8e\xab\x8f\x0d\x41\xab\x0d\x3b\xd3\x71\xf5\x71\x4d\xf4\xb1\x69\x67\x3a\xae\x3e\x92\xe5\x4f\xfb\xd8\xac\xdb\x17\xe4\xde\x9e\x9b\x58\x5b\x80\x6b\xd3\xce\x75\xf6\xf6\xec\x9d\x24\xc3\x4a\xd6\xd6\xe9\x59\xd3\xce\x75\xf6\xf6\x0a\x16\x64\x07\x2a\xda\xb9\xce\xde\x9e\xa3\x93\x2d\x0f\x35\x9a\x50\xd1\x24\x9d\xa2\x3e\xd6\xf3\x3e\xda\x99\x8e\xab\x8f\xad\xbc\x8f\x76\xa6\xe3\xea\x23\x4c\x24\xed\xa3\x9d\xe9\x38\xfb\x58\x13\x7d\xb4\x33\x1d\x67\x1f\x9b\x1e\xeb\x63\xcb\xce\x74\x5c\x7d\xac\x89\x3e\xb6\xec\x4c\xc7\xd5\xc7\xa6\xe8\x63\xcb\xce\x74\x5c\x7d\x24\xac\x9c\xf6\xb1\x65\x67\x3a\xae\x3e\xbe\x10\xf3\xd8\xb2\x33\x1d\x57\x1f\xc9\xf2\x60\x7d\xb4\x33\x1d\x27\xad\xb6\x39\xad\xb6\xec\x4c\xc7\xd5\xc7\x46\xde\xc7\x35\xfb\x82\xdc\xdf\x77\x0b\xaa\x1d\xda\x49\x3b\xd7\xd9\xdf\xb7\x77\x12\x68\x0e\x78\x40\xcb\xce\x75\xf6\xf7\x0b\xc4\x80\x36\x88\x80\x76\xae\xb3\xbf\x6f\xef\x24\xe1\x1d\x0d\x18\xd6\xb6\x5d\xd4\x71\xf5\x91\xcc\x07\xed\x63\xdb\xce\x74\x5c\x7d\x6c\x8a\x3e\xb6\xed\x4c\xc7\xd9\xc7\x9a\xe8\xa3\x9d\xe9\xb8\xfa\x58\xcf\xfb\x68\x67\x3a\xae\x3e\xae\x8b\x79\x6c\xdb\x99\x8e\xab\x8f\x40\x73\xb4\x8f\x76\xa6\xe3\xea\x23\x88\xe4\xb4\x8f\x76\xa6\xe3\xec\x63\xd3\xe3\x7d\xb4\x33\x1d\x57\x1f\x5b\xa2\x8f\x1d\x3b\xd3\x71\xf6\xb1\xce\xfb\xd8\xb1\x33\x1d\x57\x1f\x1b\xa2\x8f\x1d\x3b\xd3\x71\xf5\xf1\x85\x98\xc7\x4e\xd3\x5c\x90\x70\x8d\x92\xe1\x64\x8c\x83\xd0\xcf\x98\x53\x19\xb8\x2b\xa8\xe5\xc8\x11\x17\x6d\xa2\x0a\xfc\x77\x09\xf9\xba\x86\x95\x96\xa9\xb3\x32\x75\x52\xa6\x67\x2f\xd3\x60\x65\x1a\xa4\x4c\xdf\x5e\xa6\xc9\xca\x34\x49\x99\xc0\xd0\xe6\x6a\xaa\xca\x5d\x8b\xa5\xee\x82\x01\x6d\x21\x53\xba\xc8\xa6\xeb\x67\xbe\xed\x60\xee\x67\xbe\x08\xe5\xe3\x67\xbe\x5b\x39\x16\xbd\x0e\xb3\xf4\x34\xce\xfc\x91\x80\x19\x6d\xfb\x99\x4f\x3d\x48\x9e\xa3\x75\x0b\x74\xa8\xf3\x0e\x0f\x32\x0e\x5d\x78\x9c\x40\x79\xa3\x33\xce\x94\x57\x02\xcd\xb3\x1c\xe4\xcf\x3f\xff\x8c\xda\x70\xf1\x56\x9b\xad\xd7\xf2\xfb\xb6\xbc\xc4\x3f\x50\xb3\x61\x10\x87\xda\x97\x3d\xb4\x89\x40\xed\x3e\x18\xc5\x71\x52\x91\x3a\xb9\xaa\xe8\xde\x5d\x9d\x83\xb2\xef\xd0\xa6\xf4\xa4\x2f\x1c\x81\x7a\xa5\x52\xc9\x71\x5b\x42\x9d\x16\xcd\x97\xf6\x02\x82\x89\xb6\xaa\x54\x61\x63\xd7\xcf\xf2\xaa\x0c\xe7\x5c\x39\x2b\xbf\x2d\xaf\x9d\x35\xc1\x31\xd5\xac\x0e\x6e\x9e\x6e\xd6\xe0\x12\x8b\x74\xb6\x55\xa6\xb3\xef\xac\x9d\x7d\x77\xdb\xce\xbe\xb3\x76\xf6\x5d\xd9\xce\x9a\xbd\x95\x9d\xa8\x2a\xa2\xfb\x3c\xd8\x14\xe4\xd4\xb3\xfb\x0f\x82\xc1\x3b\x75\x63\x00\x1f\x45\x9b\x27\x55\x61\x5e\xf9\x39\xde\x90\x8a\xce\xdb\x42\xbe\x7b\xcc\x30\xde\xe9\xfd\xb6\xd0\xbd\x87\xe3\x8a\x0b\x15\x5d\xff\x0b\x4c\xe0\x0a\x63\xef\xcc\x7e\x77\xb1\xc7\x6e\xc9\x2a\x95\x3d\xe5\x5a\x62\x6f\xe1\xfb\x08\x4a\x0b\x7b\xca\x5d\xc4\x9e\xf3\x12\x62\xfe\x8d\xc3\x31\xcb\x0d\x0c\x73\xc8\x22\xf0\x04\x30\xa6\x6a\xd1\x12\xc9\xca\xc1\x0d\xa1\x90\xd5\x83\x82\x15\x9c\x32\xc5\x0d\x1d\x3c\xe6\xd7\xff\xc6\xc6\x0b\x9f\x3f\x1a\xb4\xe0\xf2\xae\xe4\x11\x34\xc8\x57\xbb\x87\x03\xfd\x25\x90\xd4\x54\x5f\x33\x0f\xa5\x1e\x52\xaf\xd0\x80\x4f\xa2\x4d\xe4\xa3\x25\x54\xa9\xf4\xd0\x4f\x74\x73\xac\xfc\x9b\xfc\x0c\xaa\x84\x0d\xcc\xd0\x12\xca\xa4\xf6\x44\xc0\xe2\x88\x4c\x53\x4a\x57\x2a\x8d\x53\xde\x6c\xa0\x65\x94\x56\xa1\x5a\x4f\x33\x7a\x13\x58\x69\xe7\xff\x72\x58\xc1\x76\x5c\xe9\xa3\x9f\xd0\xbf\x1f\x06\x2b\xed\x10\x34\x17\xab\x1e\xfa\x1d\xf5\xd1\xef\x04\xb1\xfb\x47\x46\x13\x00\xe7\x22\x43\x10\xa9\xf4\xd0\xd7\x7b\x1e\x1c\xf9\xb6\xfa\xc4\x95\x26\x7d\x6e\xe2\xfd\x32\x41\xd6\xb8\x9f\x98\xe6\xa2\x08\xab\xc1\x04\xe3\x70\x16\x73\x94\xbe\x6d\x58\x33\xb6\x2e\x85\x91\xcb\xc1\x76\xdb\xe2\xfb\x55\x5c\xde\x74\xf8\xca\xe3\x8b\x29\x97\xf9\x6a\x46\xfe\x83\xed\xb6\xd5\x64\xc0\x39\x09\x73\x72\xd5\xdf\xd7\x14\xdc\x2a\xb4\xc3\xfc\x89\x93\xbd\xfc\xee\x63\xe2\xa8\x53\x99\x98\x88\xbd\xb1\xdf\x27\x93\xa1\x64\x86\x37\xe7\x83\x15\x33\xe7\x24\xcf\x66\x4f\xe7\xa5\x30\x03\x3b\x8b\x6c\xed\xb0\x80\x6a\xfc\xa5\x5d\xcc\xfe\xfe\x31\xd9\xe8\x62\x7b\xce\xe2\x0c\xa1\x5d\x8c\x83\x9e\xdf\xff\xcc\xe2\x6a\x8e\xe3\x00\x96\x14\xa1\x19\x31\xdf\xf0\xb2\xbb\xfb\x9a\x88\x40\x16\xf1\x00\xcc\x9c\xe0\xab\x62\x2d\x07\x16\x2e\xb4\x95\x03\x02\x80\x19\xf3\x88\x55\xdf\xdd\x7d\xbd\xb2\x13\xd1\x58\xe5\x60\x40\xb5\xfb\xda\x62\xf0\x33\x71\x98\xcb\x30\x33\xc3\x02\x93\x19\xb7\x68\xca\x42\x50\x71\x81\x84\x3e\xda\xee\x99\xa5\x50\x1e\xb4\x90\x1c\xca\x43\x2d\xcf\x63\x94\xbf\xc5\xd7\x69\x96\x60\x7f\xbc\x15\x05\xac\x77\x16\xeb\xc8\x98\x99\xc5\x0a\x70\x1e\x6b\xc0\x26\x64\x1f\xe3\x31\x86\x20\xe3\x60\x8c\x49\xe7\x89\xc5\xca\x04\xff\xf9\x08\xcf\x32\xfa\xda\x2e\xbe\xe3\xcb\xd7\x2c\x66\x2a\xb4\xbe\x92\x8e\xc2\x3e\xae\x70\x14\xc4\x4d\xbd\xc0\xc5\x66\x3f\xa9\xcc\xda\x36\xfe\xbb\xcc\xda\x1d\x46\x17\x0c\x87\x87\x61\xba\xf0\xd8\x7e\x33\xba\x39\xcd\x3b\xd4\xc3\xfd\x78\xcc\xbc\xee\x09\x41\x84\xf1\x34\x2d\x47\x32\xa2\x8b\xa5\xc4\xf1\x82\xde\x54\xe6\x76\x41\xf3\x8d\x30\x0f\x6c\x70\xde\xbb\xcc\x83\xb5\x5c\xbe\x54\x8d\xc6\xe5\x70\xcc\xb4\xf9\xfc\x33\x64\x76\xbd\xb4\x1e\x69\x44\x69\xb4\x89\xc2\x4b\x36\x85\x35\xc7\x4a\x8c\x2f\x31\xda\xff\x05\xce\x9f\xe9\xb4\x97\xe2\xff\x9d\xe2\x28\x2b\x38\x3d\x03\xbe\xc2\x81\x61\xae\x01\xb4\x8e\x8f\x36\x21\xe6\x24\x90\x3f\x46\xe5\x98\x0e\x34\x14\xac\x08\x20\x1e\x52\xbb\xb2\xba\x8a\xd8\x8c\xe4\xef\xac\xd9\x72\x8b\xa3\xc6\x50\xd3\xf3\xdc\x42\x10\x22\xc1\x88\x46\xe1\x1c\x6d\xd0\x0b\xc3\x82\x8b\x13\xbb\xaf\x8b\x0c\xae\xf9\xa6\xb3\x48\x9c\xba\x4e\xf3\x51\xf8\xf8\xde\x85\x0f\xf4\xdf\x93\x04\xa7\x38\xb9\xc4\x54\x0c\x89\xa7\x44\x94\x97\xc4\x0f\x50\x63\xf8\x59\xd8\x1b\x31\x0e\x8c\xb6\x13\xf4\x3a\x09\xfd\x08\xbd\xa1\xee\x99\x68\x10\x8e\x30\x8e\xfa\x2b\x7d\x00\xc1\x43\x3e\x43\x04\x6c\x8d\x7e\x4e\x8f\xa1\xc8\x3f\xfd\x08\xed\x25\xd3\xde\x35\xfa\x34\x24\xff\x59\xb9\xc2\xbd\xff\xbe\x18\xfb\xe1\x68\xa5\x1f\x8f\xed\xf2\xce\xe9\x31\x6f\xae\x40\xec\x91\x0b\x95\x96\x7e\x9e\xe4\xf9\x5e\xa2\x3e\x39\x28\xd0\x94\x49\x4f\x9f\x3c\x21\x83\x0e\xa4\x27\xd2\x21\x81\x92\x88\x2a\x85\xaa\x30\xeb\xf4\xd7\x1f\x68\x75\x35\xbe\xc4\xc9\x60\x14\x5f\x91\x3a\xb0\xf1\xd5\x79\x3a\x50\x52\xaf\xde\xa9\xfe\x44\xca\xbe\x14\x9f\x1b\xf2\xe7\x75\xfd\x6b\x93\xed\x61\xac\x31\xc0\x13\x50\x21\x60\x45\xbb\xab\xab\x88\x37\x8b\x7a\x75\x52\x04\x50\x86\xa6\x6b\x2f\x45\x95\x46\x5e\x45\x94\x79\x02\x08\xd0\x42\xb4\x54\x53\x2d\xc5\x8a\x3d\x01\x54\x58\xb9\x1b\xf8\x97\x10\xa4\x5c\x62\x69\xa9\xd7\x94\xbe\xc3\x3f\xbc\x0c\x2d\xb2\xb4\xd4\x6b\xbc\x7c\xea\x2e\xb0\xb4\xd4\xab\xb3\xef\xe4\x5f\xe8\x38\x6f\x14\x1e\x96\x36\xa1\xe7\xaf\x5e\xb1\x7c\x90\xf2\xeb\x06\x55\x01\x2a\x6f\x19\x42\x66\x4b\xa2\x5a\x6d\x56\xab\x33\xad\x5f\x5e\x94\x71\x3d\x52\x88\xbc\xbc\xd1\xa9\x83\x2d\x8f\x4a\x9f\xfe\x57\xa5\x11\xf6\x92\xde\x20\x71\x52\xca\x5f\x56\x19\xc1\x48\x53\xb0\xba\x8a\xc8\x2e\x01\x37\x31\x28\x94\x16\x12\x5d\x3c\xc6\x4a\x7b\x96\x22\x80\x97\xa2\x38\x1a\x5d\xd3\xe5\xb8\xfd\xeb\xe1\xf1\x36\xfa\x84\x5e\xa1\x75\x80\xc9\x1b\xac\xdb\xb0\xa0\x77\x71\x6a\x67\xd9\x37\xde\x5f\xbe\x96\x94\xb3\x80\x58\x57\x2b\x8e\xd7\x7f\xa2\xcc\xb9\xa8\xc8\x69\x14\xd7\x64\x18\xb3\x55\xc6\x13\x45\xb3\x7c\xc0\x0c\xd4\x8b\x24\x1e\xe4\x96\x7a\x40\x68\xb0\x37\x52\x2c\x03\xa1\x5b\xc8\x41\x68\xbe\x2c\xc4\xa5\x03\x42\xd8\x26\xcd\x53\x56\xf4\x44\x17\x8d\xd8\x67\x09\x57\x55\xf5\xbc\x88\x50\x84\x1c\x82\x11\xba\x9d\x70\x84\x16\x14\x90\x90\x2a\xcf\x99\x87\xae\x9c\xee\xe5\xb3\x97\x58\x1a\x2f\x35\xc9\x4a\x14\x97\x04\x2c\xa7\x88\x25\x15\x5e\x40\xd2\x6a\x3d\x4a\x5a\xdf\xbb\xa4\xe5\x90\xaf\x1c\xea\x9d\xd3\xe3\x62\x39\x67\x51\xf5\x8e\x85\xa5\xeb\xbc\xfc\x91\x89\xff\xfd\x98\x78\xe1\x69\xf6\x01\x58\xf6\x7e\xd4\x4f\x30\x44\x6e\x60\xc0\x35\x90\x4c\x0e\xc9\x27\x77\x19\x51\x63\x1a\xc7\x17\xb8\x2d\xff\x8a\x6a\x7f\xa9\xcd\xa1\xec\xae\x30\xff\xbc\x4d\xca\x2c\xb0\x0b\xb4\x1f\x77\x81\xbf\xc4\x2e\xb0\x33\xc2\xfd\x2c\x89\xa3\xb0\x8f\xba\x71\x80\x7b\x71\x3c\x5f\xe1\xbf\xd3\x2d\x52\xf8\xd3\xaf\x0b\xed\x08\x3b\x5d\x55\xe1\x4f\x9e\xef\x6b\x07\x90\x59\xbb\xca\x40\xd4\x7a\x45\x5a\x4c\x82\x8f\xb2\x90\x1e\x0a\xbf\x00\xdf\x0a\x3f\x9e\x7a\xa9\x3b\x5f\x6f\x06\x65\x16\x58\xc7\x7f\xed\xe4\xc8\xff\x39\xeb\xf8\x70\x9a\x4d\xa6\x59\xf9\x4b\xbb\xc3\xc2\x4b\xbb\xc3\xc5\x2f\xed\x74\xa9\xee\x50\xbb\xc4\x3b\xfc\x73\xaf\x83\x1e\x5c\xaa\x33\x75\xf3\xe2\xcd\xfd\x4a\x76\x05\x0d\x7d\x2f\xd2\xdd\xdf\xe9\x84\x7d\xa8\x5d\x6b\xba\x84\xa8\xc3\x12\x97\x16\x87\x0b\x5e\x5a\x3c\x66\xb1\xfb\x6b\x30\xdf\xad\xf7\x27\xfb\xe8\xb7\x95\x17\x8d\x26\x37\x10\x47\x69\x46\x96\xf7\xc5\xb5\xc1\x7d\x27\x7e\xb0\xb2\x15\xa5\xe1\x6f\xa4\xb4\xc8\x05\x37\xf1\x03\x99\xfd\x05\x7e\xe6\x4b\x17\xa1\xae\x0b\xd0\x54\xbd\x01\x25\xb5\x4e\x72\x83\x5f\xc5\x00\xf8\xa5\x5a\xb4\xa7\xa7\x15\xe9\xb9\x12\x8a\x00\x51\x4c\xa3\x4c\xf4\x4c\x0b\x66\x05\xb6\x78\x47\xf4\x9b\x01\x8c\xbe\x58\x56\x31\xfb\x87\xf6\xdd\x68\x8d\xc6\xb4\x19\xf9\x29\x8d\x9c\x85\x26\x71\x1a\xaa\x1e\xf8\xa4\x51\xf2\x9d\xd4\x3f\x8a\x79\x67\x45\x0b\x4b\x1a\x46\xcb\xa8\xae\x35\x72\xe4\x07\xf9\x33\x0c\x94\xc8\x36\xa2\xbe\xa6\xac\x44\x6e\x2b\x0f\xa9\xa5\x36\x92\x87\xd4\x92\x4b\xdb\x82\x6b\xa9\x96\xd9\x4b\x1a\x20\x6e\x87\xc8\x2d\x70\xa7\x91\x85\x38\x74\x8a\x78\x83\x33\x29\xe1\xbc\x32\x55\x54\x81\x2f\x46\xb3\x78\xe6\xa4\x3e\x57\x54\x34\x97\xc9\xf1\x97\xf5\x3d\xbf\x08\x92\x50\x60\xfb\x8a\xe1\x21\xa1\x81\x71\xf4\xf6\xe9\x93\x1b\x2b\xdf\xe4\xcb\x65\xf6\xa2\xd1\x5c\x88\x77\xde\x2d\x31\xd9\x23\xef\xfc\x56\xbc\x73\xff\xe4\x10\x41\x48\xdc\x72\xac\x73\x9f\x05\xd0\xbd\x2b\xeb\xfc\xd3\xd9\x61\xbe\x24\xe6\xf0\x43\x0b\xab\xa2\xe9\x00\xec\x11\xe8\x56\x12\x3f\x0a\xe2\x71\xc5\xe0\x80\xd5\xea\x8a\x26\x29\x15\xc3\x61\xa9\xc3\xce\x0c\x2e\xd7\x68\x9d\x7b\x04\xdc\x23\xa3\xd2\x19\x15\x27\xce\x85\x18\xd5\x5f\x3b\xf3\xc2\x7f\x14\xa3\x5a\xdd\xdf\xe9\xa2\x17\x6b\x2f\xd6\x96\xeb\x88\xd1\x06\x3a\xc0\xd9\x30\x0e\x50\xc3\xc5\xad\x20\xb4\xf7\x6d\xb9\xd5\x56\x10\x50\xff\x41\x75\x41\x94\xe0\x02\x7c\xf5\x92\xda\xf4\x8f\x2f\x5a\xa5\x81\xff\xc1\x49\x0c\xb9\xc3\xb2\x21\x46\x09\x4e\x25\xbe\xa8\x74\x84\x94\x63\x3d\x26\xcf\x06\xde\xb7\xe2\x05\x6c\x21\x7e\x61\x38\xa8\xab\xd1\xd9\x3c\x80\xa6\xf0\xec\x0b\x3b\x8e\x30\x1a\xc7\x09\xa6\xc2\xe3\xf2\x32\xf4\xcd\x35\x8a\x7c\xbd\x2f\x2f\x97\x5c\xe0\x30\x9f\x8b\x2c\xf0\xb5\xbb\x45\x39\x7f\x5c\xe0\xdf\xec\x14\x87\xa2\x38\x9e\x94\x13\x43\xde\x73\x72\x74\xae\x6c\x41\xec\xee\x35\x91\x17\x29\xa2\x39\xd1\xd4\x42\x44\x77\xb7\x70\xb3\x8f\x44\xf7\xad\x88\xee\x7f\x24\xe6\x57\x4c\x72\x12\x0f\xfc\x13\x85\xdf\xd2\x07\x67\xf9\x7c\x6b\x08\xc0\x95\x4a\xb1\x08\x5c\x45\x5f\xbf\xea\xaf\x6e\xb5\xc5\xd8\x7b\x3c\x3f\xae\xc0\xea\x2a\xfa\x40\xe0\xab\xf5\x42\x23\x52\x00\x68\x16\x44\x99\xab\x61\x38\xc2\xa8\xf2\x43\x25\xf7\xb5\xce\x63\x70\x83\xc7\xa1\x11\x73\x5b\x98\x70\x1a\x8a\xcc\x50\x6c\x49\x48\x55\x51\xea\x8e\xdd\x10\x8f\xb7\xcc\xee\x25\x51\xd0\x42\xbc\xe4\xaf\xed\xb8\x65\xc9\xd1\x45\x93\x64\x3d\x2c\x5f\xc9\x33\x21\x41\x6b\x7f\x7e\x9e\x8f\x87\x4d\x12\x5e\x2e\x26\xb6\x11\xf3\x5a\x7c\x39\xd9\xdb\xaa\xe7\xb1\x9e\xc9\x93\xf4\xd1\x4c\x04\x6e\x73\x10\x3d\xf2\xd3\x94\x2c\xe4\x65\x82\x5a\x80\xde\xe2\x6b\xb4\x8d\x93\xf0\x92\xe6\x84\xdc\xe5\x83\xd2\x28\x8e\x39\x7d\xf4\xfa\xed\xf6\x6e\x23\x6f\x4d\x3c\x97\x4c\x3c\xde\x8d\xa3\x41\x78\x31\x65\x99\x28\x63\xc8\x0a\x99\x16\xe5\x97\x4c\xe2\x09\x4e\xb2\x6b\xf4\x07\x3d\x16\x83\x37\x29\x30\xdf\xd3\x21\xcd\x71\x9c\x92\x87\x30\x62\xe9\x02\xb2\x58\xf8\xd2\xac\xa0\x6d\x3c\xf0\xa7\xa3\x6c\x03\xb5\x50\xa5\xde\x58\x87\x44\xca\x55\x17\x7c\x47\x42\x73\x9c\xf0\x44\xe6\x39\x38\x32\xfe\xf3\xd0\x0c\x33\x96\x3c\x33\x05\x50\xf9\xa1\x5e\xfa\x90\xc5\x68\x82\x93\x41\x9c\x8c\x25\xe0\x0a\x64\x29\xfd\x63\x7f\x70\xb1\xe1\x1a\x65\x44\x2f\xbe\x4e\x20\xe6\x4c\xbd\xb1\xbe\xda\x6c\x68\x21\xb8\x69\x57\x28\xea\xda\xa7\x1c\x21\xa5\xf1\x9b\x6a\x51\x42\xd2\xa2\x04\xf2\x64\x56\x82\x9c\xb4\xf8\x7a\x9b\x9f\x45\xf4\x10\xf8\xdc\x0d\xe9\xaa\x9c\x31\x94\x8c\x5f\xdf\x46\x37\xdc\xdf\x6c\x10\x27\x70\x8a\xc9\x1b\xbd\x87\xc4\xa0\x9f\x83\x81\x91\x34\x9e\x52\x3b\x3f\x3d\x2a\x66\x58\x8b\x54\xfc\x23\x9f\xac\x75\x9a\x7e\xf2\xce\x60\x3c\x75\x1a\x6b\xb5\x9a\x0e\xb8\x20\x7b\x7d\x7f\x70\x61\x37\xbc\x20\x13\xb1\x29\x7e\x72\xc2\x23\xc5\x5d\xc1\x30\xcc\xf5\x0e\xd7\x15\xd4\x83\xae\x2c\x0b\xba\x4d\xbe\xd9\x09\x83\x0d\xd4\xc2\x1f\x56\x4a\x56\x4e\xfd\x51\x86\xb6\xe0\x3f\x8b\x27\xa2\xe5\x6e\x34\x92\x5f\xfb\x5d\xc8\x8e\x26\x52\x0f\x06\x2b\x2c\x2a\x49\x85\x77\xc6\x03\xfc\x9c\x93\xca\x8a\xcb\xf3\xaa\xd5\x5c\x28\xb7\x8b\x3a\xf5\x56\x03\xc2\x30\x73\x24\x85\x65\x5e\xf6\xe0\xbb\xcf\x68\x95\x90\x0f\xe5\x41\x9e\x98\x1d\xbb\x59\xa2\x3b\x41\x39\xc8\xa6\x74\xb0\x69\xba\x79\x43\x9f\x63\x0b\xf5\x04\x72\xf2\x7e\x14\xe0\x99\xad\xc6\x59\x6d\xc6\x14\x40\x96\x68\x9d\x73\x42\x74\x09\x54\x84\xb0\x2c\xde\x38\xf3\xd7\xe7\xd8\xf0\x4a\xf9\x1b\x67\x25\xbe\xe5\x6d\x92\x59\x59\x61\x4f\x36\x23\x8c\x7c\x6b\xa1\x45\xf3\x17\x73\x8c\x2c\xd4\x8f\x4c\x50\xd7\x3a\xc8\xe3\x22\xbd\xe2\xf8\x58\x8d\x0b\x44\x27\x59\x9e\x63\x9e\x2c\x1b\x28\x30\x4f\xe3\x9b\xf7\x5a\x9f\x33\xc4\x32\x7a\xe7\xa9\x81\xcd\xef\xf3\xb3\x31\x00\x7c\x65\x88\xad\xa3\x6b\x16\x17\x59\x8c\xf2\x57\xac\xe3\x0e\x44\xf6\xc5\x18\xdb\x41\x87\x72\x34\x3b\x06\xd6\x82\x85\x62\xcb\x51\xa7\xb6\x1c\xd2\xf4\x39\x8d\x39\x10\xf0\x73\xa5\x09\x18\x3d\x31\xd2\xf2\x47\xdb\x58\x97\x19\x6f\x34\x2f\x14\x94\xad\xb3\x7c\xf4\xe5\x77\xf6\x80\x55\x52\x13\xbf\x1d\x1e\xab\xdd\x01\xd7\x29\x8b\xc7\xb5\x31\x6e\x9f\xa8\x0d\xcc\x27\x6e\x03\x23\xcd\xe6\x4b\xf4\xa9\x60\xf4\xc8\x5f\x5e\xe3\xec\x13\x98\xc3\x18\x1d\x39\xfb\xa4\x9b\xc5\xf0\xbf\x1b\xf3\xb5\x1e\x70\x8a\xfc\x49\xcc\x81\xe9\xa6\xa1\x51\xdb\x94\x68\x4c\xe2\xac\x76\xbe\xb4\x54\x6c\x52\x24\x01\x97\x8e\xbe\x9c\x6f\x58\x82\x98\xb1\xbd\x2c\xaf\x57\x64\x40\x29\x1f\x23\xee\xb4\xa1\x97\x09\x36\x53\xb8\x91\x2f\xb8\x89\xdf\x97\x68\x19\xa6\xb6\x74\xfb\xf3\xa3\xd7\x58\x44\x83\x7b\x08\x62\x43\x45\x04\x21\x19\x52\xa1\xd0\x25\x26\x2c\x56\xcd\x43\x0e\xd9\xf4\x2e\x60\x0a\x65\xd3\x3c\xc8\x8e\x38\x4a\xba\x04\x18\x0f\xe9\x82\x2a\x1b\x76\x55\x2c\x26\x85\xe6\x08\x4f\x37\x45\xb6\x68\x14\x9a\x3d\x50\x8f\x9e\x42\x97\xe7\x84\xbd\x39\xf7\xd6\xfe\xda\x3e\xf4\x0b\xa4\x75\x9f\x9f\x1c\xfd\x61\x75\x47\xce\xf4\xda\xae\xac\xd7\x7f\x07\xed\xd2\x09\x18\x67\x76\xb9\xf1\x2e\x55\x22\xc9\x2f\x8b\xf4\x48\x02\x8f\x63\x3c\x4d\xfd\xde\x08\xb3\x70\x60\x12\x3a\x27\x48\x4e\xb5\x48\xa1\xe8\x6f\xde\x20\x35\xc3\x9a\xb4\x2d\x1c\x43\x36\x65\xc4\x0c\x6d\x99\x8d\xb1\xa9\x49\x12\xe5\x21\xc6\x4a\x98\x22\x1f\xd1\x04\xcc\xe8\x12\x27\x29\x44\x2d\x1b\xfa\x19\x8a\xf0\xc5\x08\xf7\x33\x1c\x10\x36\xdc\x67\x29\x55\x33\xa6\xf0\xc9\x62\x34\x0a\xb3\x6c\x84\x97\x69\x80\xcb\x15\x15\x28\x4e\x92\x38\x41\x41\x8c\xd3\xe8\x59\x86\xfc\xc1\x00\xf7\x69\x5d\x8a\xd4\xb3\x14\xa5\xb8\x3f\x4d\xc2\xec\xda\x13\x15\x7b\xd3\x0c\x85\x19\x54\xe2\x35\xc2\x2c\x15\x01\x15\xc2\x51\x98\x31\x27\x6e\x9a\xd7\x35\x24\xfc\x79\x8c\x23\xba\x1f\xa4\x36\x45\x19\x1d\x90\x77\xb4\x73\x42\x5d\xa6\xbd\x95\xe7\xef\xb6\x49\xdb\x8a\x0f\x29\x6f\x65\x33\x68\xe7\x01\x23\xb7\xde\x86\x53\xc3\x65\xd1\x69\x21\x64\x27\x34\xb2\x7b\x61\xe7\x39\xed\x37\xd1\x2e\xf9\x65\x49\x1c\xf7\xf6\xac\x76\xee\xa1\xca\xdb\xb3\xe6\x39\x0b\x16\x80\xbe\x92\x47\x76\x15\x50\xef\x54\x2d\x49\xe4\xde\x9e\xd5\x69\xa5\x9a\x5a\xa9\x59\x5c\xa9\x41\x2b\xd5\xd5\x4a\xb5\xe2\x4a\x4d\x5a\xa9\xa1\x56\xaa\x8b\x4a\x6a\x1d\x5b\x76\x24\x63\xc8\xb8\x97\xa1\x6b\xd0\xba\x62\xd0\xba\xf6\x41\x33\xf1\x91\x86\x8b\xf5\x89\x5e\x98\x0c\x06\x3c\xed\x20\x45\x9a\x06\x59\xad\xd5\xc8\x17\x5b\x7f\xcd\x89\x68\xaa\x90\xeb\x56\xc8\x8d\x52\x90\x6b\xce\x81\x97\x60\x68\x90\x9b\xa5\x20\xd7\x5d\xb3\xe3\x49\x30\x34\xc8\x35\x0d\xf2\xfc\x89\xec\xfa\x49\x72\x8d\x7a\x7a\x3a\x55\x3a\x55\x3d\x1a\xff\xc2\xd4\x64\x64\x74\xf2\x09\xeb\x49\xaf\xd3\x0c\x8f\xd1\x20\x9e\x26\x28\x0b\xc7\xfa\xdc\x2f\x18\x94\x37\xc2\xb3\xec\x84\xac\x3e\x77\xfc\x58\x4b\xc4\xdb\x83\x38\x08\x07\xd7\x94\x13\x52\x3a\x2c\x81\xc5\xba\x1b\x8b\xee\x19\x75\x1c\xf8\xed\x0c\x52\x5e\x42\xb4\x15\x23\x53\x9c\x2d\x49\xee\x2f\x28\xc5\xd9\x74\xa2\x7e\x28\xf0\xe8\x98\x7f\xd8\xdf\xff\x85\xba\x76\x14\x9d\xf0\xf7\x7f\xf9\x58\x43\x9b\x68\xff\x17\x33\x35\x9a\x54\xa4\x4e\x8b\xd4\xad\xd1\x8c\xe5\x25\x0d\x53\x99\x4e\x7b\x97\x98\x88\x0a\xae\xa3\x7f\x8d\x06\x3f\x86\xb6\x69\xf4\xe3\xaf\x88\x3e\xb9\xa2\x1f\xcb\xc5\x59\x98\x63\x51\x3e\xbf\x0e\xb5\x87\x39\x16\xcd\x36\x44\xb3\x75\xa5\xd9\xfa\xbc\x66\xeb\x6a\xb3\xf5\xc5\x9a\x85\x30\x3a\x61\x8d\x2f\x41\x02\x24\x6c\xa8\x2b\xd0\x55\xb5\x09\x55\x1b\x7c\x31\x43\xd5\x9a\xba\x4c\x1d\x33\xc2\xc8\xba\x88\xb5\x22\xa0\xd6\x1a\x3d\xd7\xeb\xb1\xfd\xe9\xc7\x3a\xfd\x58\xb7\x7e\x6c\xd0\x8f\x0d\xeb\xc7\x26\xfd\xd8\xb4\x7e\x6c\x15\xb5\xd9\x2e\x6a\xb3\x53\xd4\xe6\x9a\x68\xb3\x40\x23\x55\x8a\xf3\xa0\xc5\xb9\x0f\x2a\xc7\x81\x90\xa9\xa4\x90\xfd\x88\xee\x25\xb9\xab\x53\x79\x2d\x49\x1f\xa5\x38\xb3\x5a\xc4\xde\x3b\xf7\xf6\x0e\x83\x9b\x7b\x99\x01\x17\x52\x4b\x9f\xd0\x50\x43\xbf\x01\x11\xa2\xca\x6f\x64\xee\xf9\x2a\x81\x67\xb1\xf7\xbe\xd4\x2b\xd6\x69\xc5\x06\xab\xb8\xa6\x55\x6c\x3b\x2b\x36\x68\xc5\x16\xab\x58\xd7\x2a\xae\x39\x2b\x36\x69\xc5\xce\xb9\x40\x4d\xa9\x58\xcf\x2b\xde\x69\x17\x2b\x8a\x52\x4f\x11\xe1\xb1\xe3\x4f\x58\x4a\x76\x16\x3c\x1e\x1e\x6f\x13\x3d\x9e\xc3\x61\x0c\x4e\xc0\xb1\xc5\x8f\xb7\xe2\x6b\x75\xc2\x43\x52\x8e\x5e\xe1\x4d\x77\x52\xec\x45\x27\x53\xbf\xb0\xe3\xc9\x6f\x6e\xf3\x8f\xe1\x25\xfd\xd2\x69\xad\x36\x1b\xba\x5a\x4e\x2c\x13\x41\xb0\x95\x92\xae\x50\xca\xfa\x50\xbe\x48\x22\xa8\x66\xf0\x73\xe2\x5f\x62\x14\x8f\x02\x27\xab\x5d\x40\x7e\xe8\x7e\xa4\x93\xdb\xd5\xe3\x1d\x2a\x2d\x76\xfd\x51\x7f\x3a\x22\x2b\x2c\xc2\x57\xce\x66\xbb\x2c\x11\x4c\x97\x26\x82\xa9\xcd\x5a\x41\x13\xfe\x0f\x2d\x71\x09\x4d\xcf\xd7\xd2\x65\x79\x61\xba\x34\x2f\x4c\x6d\xc6\x6a\x34\x21\xa6\x7c\x97\x0b\xa8\xb5\x2a\x7a\x85\x2a\xdd\x8f\xd2\xf3\x7f\xa1\x3a\xda\x40\xb5\xaa\x09\xb1\xc1\x20\x36\x28\x44\x06\xb0\xc5\x20\xd6\x35\x88\xf5\x12\x10\x9b\x0c\x62\xd3\xe8\x56\x85\xb6\xa3\x40\x6c\x94\x80\xd8\x62\x10\x5b\xd6\x5e\x37\x35\x88\xcd\x12\x10\xdb\x0c\x62\xdb\xda\xeb\x96\x06\xb1\x55\x02\x62\x87\x41\xec\x58\x7b\xdd\xd6\x20\xb6\x4b\x40\x5c\x63\x10\xd7\xac\xbd\xee\x68\x10\x3b\x73\x21\xe6\x62\x3f\x05\xaa\x54\x5f\xd3\xab\xeb\xde\x31\x82\xa6\xc9\xee\x73\xb1\x7c\x87\x45\x44\x4a\x5d\xcc\x80\x57\x87\xa4\x6b\x5d\x4b\x12\x0e\x9e\x2e\x3f\x99\xf6\x33\x34\x0c\x2f\x86\xc8\x8f\x02\x34\x8a\xaf\x90\x9f\x5c\x4c\x21\xfc\x0b\xb8\x39\xff\xef\xd4\x4f\x8c\xc4\x3d\xd0\x80\x8f\x36\x49\x2b\x5c\x8a\xb3\x28\x0f\x2e\x7a\xb4\x08\xdd\x25\xac\xc7\x27\xde\x67\x05\x83\x04\xa7\xd3\x51\x86\xe2\x41\x51\xf3\x43\xba\x05\x54\x2e\x7c\xf4\x1c\x5d\xf8\xd4\x75\xa5\xbe\x56\x45\x4b\x88\xbe\xea\xb1\x57\x6d\x78\xd5\x83\x57\x36\x24\x47\x14\x90\xd4\x15\x7a\x24\x7c\x8e\x2e\x66\x30\xc3\x55\x20\x08\x5e\x40\x88\x9d\x52\x01\x5b\x22\x18\xd2\xa1\xdf\x0e\x8f\x11\x84\x93\x94\x3f\xbe\xa1\x1c\xee\x62\x88\x7e\x47\x17\xa3\xb2\x4c\xce\xae\x54\xf9\x8d\xb1\xb8\x37\x94\xc5\x55\x2a\x6f\xf2\xed\x9b\xec\x64\x6f\x24\xb1\xa0\xca\x0a\x74\xd4\x02\x9d\xbc\x80\x4e\xcf\xbf\x31\x6e\xf8\x86\x72\xc3\x0a\x6d\x26\xdf\x6f\xdf\x70\xfe\x07\xfb\xed\x12\x22\xad\x99\x30\x1a\x0c\x46\x83\xc3\xa8\xab\x08\xd4\x0d\x0c\x6b\x6a\x81\x5a\x11\x86\x4d\x06\xbd\xc9\xa1\x37\x54\x0c\x1b\x1a\x86\x75\x0b\x86\x2d\x06\xa3\xc5\x61\x34\x55\x04\x9a\x06\x86\x0d\xb5\x40\xa3\x08\xc3\x36\x83\xde\xe6\xd0\x5b\x2a\x86\x2d\x0d\xc3\xa6\x05\xc3\x0e\x83\xd1\xe1\x30\xda\x2a\x02\x6d\x03\xc3\x96\x5a\xa0\x55\x84\xe1\x1a\x83\xbe\x76\xae\x90\x88\xc0\xb0\xa3\x61\xd8\x56\x30\x2c\x95\xf8\x23\xe5\x49\x27\x84\xae\xb5\x44\xda\x89\x79\xd7\x5d\x14\x56\x86\x67\x99\x7c\xef\x24\x6b\x52\x79\x28\x05\x25\x8d\x03\xbd\x2d\x32\xef\xaf\x26\x23\x9f\x60\x33\xcb\x90\x13\x1c\x8b\x33\x53\xc9\x5b\xb6\x41\x14\x17\x57\x45\x4a\x5d\x35\x79\x87\x5c\xb2\x5a\x74\x07\x25\x17\x2c\x6d\x8c\xec\xa9\x77\x23\x1b\xed\x96\x97\x5f\x8a\x6c\xb4\x3b\x1e\xbb\x2b\xd9\xe8\xd4\x6f\xce\xbd\xb5\xbf\x76\x24\xc2\xc7\xfb\xaa\xc7\xfb\xaa\x07\xbb\xaf\xd2\x96\x78\x7e\x9f\xa3\xdf\xe4\xfc\xb5\xee\x70\xee\x2b\x2b\xdc\x5b\x71\x34\x7f\xab\x1e\xcd\xdf\xde\xf6\x68\xfe\x56\x3d\x9a\xbf\x2d\x3a\x9a\xcf\x53\x30\x3f\xde\x54\x3d\xde\x54\x3d\xde\x54\x29\x5f\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\xf2\x66\x1f\x6f\xaa\xf4\x8f\x8f\x37\x55\x8e\xc7\xc7\x9b\xaa\xc7\x9b\xaa\xc7\x9b\x2a\xf8\x7b\xbc\xa9\x2a\xa7\xc4\x7d\xbc\xa9\x7a\xbc\xa9\x7a\xbc\xa9\x92\xfe\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\xfe\x93\x6f\xaa\xee\xed\x8e\xea\x76\xb7\x53\x65\xee\xa5\x4a\xdc\x48\x3d\xd4\x5d\xd4\x5f\x3b\x1f\xca\xe3\x5d\xd4\xdf\xff\x2e\x4a\xbe\x3b\xea\xb6\xe6\x3a\x3a\xc9\x37\x47\xdd\x96\x74\x6d\x04\x0f\x0f\x7f\x67\x44\xbd\x34\xc5\xad\x91\x3d\xa8\x00\xf7\xd0\x2e\xba\x56\x02\x37\x4e\xd9\xa3\x58\x8a\x99\x6e\xea\x2b\xa2\x30\x43\x69\x2f\x9e\x99\x70\x4e\x04\x3a\x27\xf2\x35\x1d\xff\xb3\x49\x93\x8d\x76\xc7\x7d\x28\x67\x87\xee\x70\xbe\x1a\xf7\x2d\xbe\xb6\xe9\x71\xd5\x16\x3d\xee\x3f\x3e\xb7\x61\x36\x28\x64\x08\x78\x54\x89\x10\xfd\x43\x1e\x27\x87\xea\x90\x55\x22\x5b\x1b\x1f\xfb\x33\x05\x90\x19\x09\x4d\xf9\x6c\x04\x45\xb3\x9d\xfd\x49\x2f\x2a\x9f\xd0\x12\x1d\x9f\x25\xde\x68\x15\xfd\x03\x7a\xe5\x88\xa5\x70\xe5\x4f\xec\x38\xc3\xbe\x61\x6a\x08\xa4\x09\x38\xb1\x3b\xc6\x93\xd7\x64\xc6\xe7\x4f\x4f\xd7\xaa\xe2\x67\x59\x35\x04\xd1\x7c\x62\x59\x66\x05\xa0\x3b\xab\xe5\xb8\x26\x04\xb4\x20\x46\xfe\x75\x32\x3d\x76\x95\xa1\xd2\xb2\x70\x72\x6e\xb4\x3b\x0e\x85\x48\xcd\xa9\x0c\xb1\x36\x5a\x56\x31\x22\xad\x27\x4d\x31\x92\x0f\x5a\xa8\x7d\xf9\x94\x0f\xe7\xdc\x0c\xf0\xa0\x1c\x54\xab\x7f\x96\xf1\xd4\xe6\x43\xac\xa6\x88\x2e\xa3\x88\xaa\xd4\x22\xcb\x22\x0a\x41\x83\x4e\x13\xc6\x31\xaa\x54\xbe\x2b\x24\xec\x20\x5c\x2b\xd1\x16\x10\xac\x9b\x58\x73\x42\x55\xdf\xab\x9d\xfd\x4a\xea\x56\xd8\x9a\x22\x55\x18\x5e\xe7\x79\x5e\x83\x48\xcf\x63\xa0\x1d\x9f\x3e\x40\x1c\x14\xcb\x8d\x56\x4e\xea\xa1\x71\x76\x27\x63\xa1\xcc\x15\x13\xcb\x14\xec\xbe\x57\xb9\xb7\xdb\xba\x0f\xa1\xb7\xdb\x5a\x58\xe2\x35\xf7\x58\x4d\xdc\xed\xb6\xac\xb1\x2d\xe0\x86\x26\xc4\xc1\x2d\x76\xf8\xed\x24\x9e\x28\xbb\x3c\x7b\x01\x83\xf0\x0d\xa2\xe2\x05\xa4\x39\x35\xd0\x9c\xa6\xe7\x27\x13\x4f\x4a\x89\x50\x73\xa8\xfe\xa2\x21\x83\xd5\x63\xcd\x11\xd4\xa5\xa8\x5f\xda\x2a\x26\xa0\x36\x54\x10\x6a\xc4\xb8\x52\x42\x0c\x69\x83\x17\x2c\xbe\xc3\x20\xe3\x59\xb0\x81\x0b\xc3\x17\x82\x17\xd9\xc5\x7f\x86\xcd\x7c\x79\xd9\xba\x87\x2f\xc0\xee\xd1\x9c\x04\x48\xdf\xd1\x6a\x23\x43\x74\x3f\x2b\x0e\x20\x2d\xbe\xea\x18\xcd\x17\xaf\x3c\x52\xa8\xf8\xa4\xd9\x6d\x3d\xd4\x31\xf3\x6e\xe9\xfa\xbe\xe5\xf9\xf2\xc1\x4e\x81\xdf\x36\x88\x33\x61\x55\x38\xc5\xc9\x25\x7e\xfa\xa4\xd2\xaf\xa2\x46\xad\xde\x40\xbd\x6b\xd4\xfd\xff\xfe\xdf\x20\x09\xfb\xe8\x00\xa7\x51\x38\x5a\x41\x5b\xa3\x11\x4a\xc2\x8b\x61\x96\x22\x56\x3e\x58\x79\xfa\xf4\xc9\x31\x0e\xc2\x34\x4b\xc2\xde\x14\xe0\xfb\x51\x00\x41\x79\xc2\x08\xa5\xf1\x34\xe9\x63\x78\xd3\x0b\x23\x3f\xb9\x26\xec\x60\x9c\x7a\x2c\x4a\x43\x02\xff\x8d\xa7\x19\x1a\x03\x4f\xef\x03\x67\xf5\x90\x9f\x60\x34\xc1\xc9\x38\xcc\x32\x1c\xa0\x49\x12\x5f\x86\x01\x0e\x68\xd0\x09\xb2\x4e\x07\xf1\x68\x14\x5f\x85\xd1\x05\xea\xc7\x51\x10\xd2\x35\x4c\x2a\x8d\x71\xb6\xc1\x56\xfc\x32\x52\xd1\x4a\x41\x31\x4c\xf1\xe9\xc7\x01\x46\xe3\x69\x9a\x91\x8d\xda\x0f\x23\x00\xea\xf7\xe2\x4b\xf2\x69\x72\x0d\x5d\x44\x51\x9c\x85\x7d\xec\xd1\xb8\x42\xa3\x30\x05\xcd\xb2\xdc\x5e\x14\x68\xc8\x04\x61\xda\x1f\xf9\xe1\x18\x27\x2b\x2e\x1c\xc2\x48\x1e\x08\x8e\xc3\x24\x89\x83\x69\x1f\xdf\x3b\x1a\x88\x75\x2d\x88\xfb\x53\x11\x07\x83\xd4\x58\x8d\x13\x16\x23\x63\xec\x67\x38\x09\xfd\x51\x9a\x0f\x33\xcc\x0d\x54\x93\x50\x27\xf3\x7c\xba\xb7\x7f\x82\x4e\x0e\x77\x4f\x7f\xdd\x3a\xde\x41\xfb\x27\xe8\xe8\xf8\xf0\x97\xfd\xed\x9d\x6d\xf4\xfa\x5f\xe8\x74\x6f\x07\x75\x0f\x8f\xfe\x75\xbc\xff\x66\xef\x14\xed\x1d\xbe\xdb\xde\x39\x3e\x41\x5b\xef\xb7\x51\xf7\xf0\xfd\xe9\xf1\xfe\xeb\x0f\xa7\x87\xc7\x27\xe8\xc7\xad\x13\xb4\x7f\xf2\x23\x7c\xd8\x7a\xff\x2f\xb4\xf3\xdb\xd1\xf1\xce\xc9\x09\x3a\x3c\x46\xfb\x07\x47\xef\xf6\x77\xb6\xd1\xaf\x5b\xc7\xc7\x5b\xef\x4f\xf7\x77\x4e\x3c\xb4\xff\xbe\xfb\xee\xc3\xf6\xfe\xfb\x37\x1e\x7a\xfd\xe1\x14\xbd\x3f\x3c\x45\xef\xf6\x0f\xf6\x4f\x77\xb6\xd1\xe9\xa1\x07\x8d\x9a\xd5\xd0\xe1\x2e\x3a\xd8\x39\xee\xee\x6d\xbd\x3f\xdd\x7a\xbd\xff\x6e\xff\xf4\x5f\xd0\xde\xee\xfe\xe9\x7b\xd2\xd6\xee\xe1\x31\xda\x42\x47\x5b\xc7\xa7\xfb\xdd\x0f\xef\xb6\x8e\xd1\xd1\x87\xe3\xa3\xc3\x93\x1d\x44\xba\xb5\xbd\x7f\xd2\x7d\xb7\xb5\x7f\xb0\xb3\xbd\x82\xf6\xdf\xa3\xf7\x87\x68\xe7\x97\x9d\xf7\xa7\xe8\x64\x6f\xeb\xdd\x3b\x6b\x2f\x09\xee\x4a\x1f\x5f\xef\xa0\x77\xfb\x5b\xaf\xdf\xed\xd0\x96\xde\xff\x0b\x6d\xef\x1f\xef\x74\x4f\x49\x77\xf2\x5f\xdd\xfd\xed\x9d\xf7\xa7\x5b\xef\x3c\x74\x72\xb4\xd3\xdd\x27\x3f\x76\x7e\xdb\x39\x38\x7a\xb7\x75\xfc\x2f\x8f\xc1\x3c\xd9\xf9\xbf\x1f\x76\xde\x9f\xee\x6f\xbd\x43\xdb\x5b\x07\x5b\x6f\x76\x4e\x50\x65\xce\x90\x1c\x1d\x1f\x76\x3f\x1c\xef\x1c\x10\x9c\x0f\x77\xd1\xc9\x87\xd7\x27\xa7\xfb\xa7\x1f\x4e\x77\xd0\x9b\xc3\xc3\x6d\x18\xe8\x93\x9d\xe3\x5f\xf6\xbb\x3b\x27\x2f\xd1\xbb\xc3\x13\x18\xad\x0f\x27\x3b\x1e\xda\xde\x3a\xdd\x82\x86\x8f\x8e\x0f\x77\xf7\x4f\x4f\x5e\x92\xdf\xaf\x3f\x9c\xec\xc3\xa0\xed\xbf\x3f\xdd\x39\x3e\xfe\x70\x74\xba\x7f\xf8\xbe\x8a\xf6\x0e\x7f\xdd\xf9\x65\xe7\x18\x75\xb7\x3e\x9c\xec\x6c\xc3\xe8\x1e\xbe\x87\xae\x9e\xee\xed\x1c\x1e\xff\x8b\x00\x25\x63\x00\x83\xef\xa1\x5f\xf7\x76\x4e\xf7\x76\x8e\xc9\x80\xc2\x48\x6d\x91\x21\x38\x39\x3d\xde\xef\x9e\xca\xc5\x0e\x8f\xd1\xe9\xe1\xf1\xa9\xd4\x47\xf4\x7e\xe7\xcd\xbb\xfd\x37\x3b\xef\xbb\x3b\xe4\xeb\x21\x81\xf2\xeb\xfe\xc9\x4e\x15\x6d\x1d\xef\x9f\x90\x02\xfb\xb4\xd9\x5f\xb7\xfe\x85\x0e\x3f\x40\x97\xc9\x1c\x7d\x38\xd9\xa1\x3f\x25\x8a\xf5\x60\x26\xd1\xfe\x2e\xda\xda\xfe\x65\x9f\xa0\xcd\x0a\x1f\x1d\x9e\x9c\xec\x33\x3a\x81\x21\xeb\xee\xb1\xe1\x5e\x79\xfa\xe4\xf9\xaa\xaa\xf3\x3a\xf0\xb3\xe1\xfd\xea\xbd\xca\x45\x9d\xa6\x81\x8f\x45\x11\xfa\x58\xca\x3a\x1b\x2e\xec\xfc\x28\x4b\x51\xe6\xf7\xb8\xc4\x42\xaa\x7c\xfc\x32\xb2\x06\xdb\xcc\xe5\xa8\x9a\x87\x50\xdd\x43\xa8\xe1\x21\xd4\xf4\x10\x6a\x79\x08\xb5\x3d\x84\x3a\x1e\x42\x6b\x1e\x42\xeb\x1e\x42\x2f\x3c\x54\xaf\x79\xa8\x5e\xf7\x50\xbd\xe1\xa1\x7a\xd3\x43\xf5\x96\x87\xea\x6d\xc9\xc2\x72\x8d\xd6\x25\xdf\x08\x3c\x52\x9e\xc0\xa8\xb7\x29\x5c\x52\x0f\xda\x7a\xc1\xe0\x37\x18\x8c\x3a\xb4\x91\xc3\x69\xb2\xb6\x5a\x0c\x97\x17\x0c\xc6\xba\x84\xe7\x1a\x83\xd5\x61\xb8\xd4\x29\xcc\xba\x1c\x6b\xb9\xce\xea\x72\x5c\x6a\x14\x06\xe0\xc1\xf1\x6c\x52\x58\x04\x7e\x5d\xee\xb7\x0c\xa7\xc5\xea\xb6\x19\xee\x6b\x0c\x46\x43\xc2\xb3\xce\x60\xad\x33\x5c\x58\xbf\xeb\xcd\xf3\xea\x4b\x79\x2e\x92\x39\x73\xc1\xf1\x58\x93\xc6\xaa\xc1\x60\x72\x9c\x3b\xea\x78\x40\xdf\x9a\x5a\xdf\x3b\xac\x4e\x33\x87\x05\x75\xdb\x39\xce\x1c\x06\x1f\x0f\x68\xab\xae\xf5\x1d\x0a\xb5\xa5\x0e\xae\x31\x04\x3b\xf9\xe0\x0a\x20\x0d\x69\xa0\x29\xb2\x39\xa0\x75\x56\x47\x1a\x2c\x98\x98\x76\x3e\xb8\x02\x46\x53\x1a\x68\x8a\xac\x84\x50\x83\x8d\x6c\x4d\x02\xc6\x47\x63\x4d\xcc\x9e\xa0\x50\xc4\x46\x87\x22\xab\xce\x46\x3a\x6f\x65\x50\x14\xd9\x58\x01\x7a\x72\x4b\x9c\xb6\x9a\xd2\x78\x76\xf2\x6f\x0a\x4d\xaf\x79\xf0\x09\x86\x8a\xd3\xeb\x8b\x9c\xf6\x38\x4d\xd5\xdb\xd2\xb0\xae\xb1\xb2\xca\x7c\xd4\x73\x22\x10\x73\xf1\x82\x15\xe4\xc4\xb3\x2e\x95\xe1\x88\xaf\xc1\x6f\xf9\x2c\x25\xd6\x72\x2b\xaf\xca\xdb\x17\x6b\x5e\x5e\x13\xeb\x0a\xc8\x1c\x14\x5f\x9f\xed\x9c\xf6\x45\x3f\x1b\x39\x0a\x62\x9c\x18\xc9\x50\xb8\x48\x9b\x92\x79\x0b\x84\x21\xa6\x0c\x7e\x3b\x47\x00\xfa\xb9\x96\x2f\x44\x68\xb0\xc5\x10\xe9\x68\x48\x37\xd5\xc1\x17\x9d\xae\xe7\x70\xc4\xd8\x89\x05\x0d\xdf\x15\x38\x82\x81\xd4\xa5\x41\xea\xe4\xed\x8a\x85\xc7\x16\x70\xbd\x69\x99\x0f\xd1\x01\x0d\x71\x0e\x48\x2c\xb8\x86\xf4\xdf\xb6\x58\xc5\xea\x00\xb5\x2d\xe5\x5a\xea\xcc\x88\x99\xcc\x3b\x85\xea\x75\x74\xae\x64\xc9\xfe\x38\x24\x2b\xc4\x32\x1f\x48\x84\x6a\xae\x79\xa8\x36\x6b\x6f\xad\x37\xd6\x5e\xbc\x78\x41\x7e\x77\x76\xb6\x5f\xec\xbc\xde\xaa\x93\xdf\xeb\xbb\xf5\xd7\xaf\xbb\xdb\x5d\xf2\x7b\xeb\x45\xbb\xb9\xbb\xdd\xda\x51\xe7\x7b\x98\x38\x1b\x68\xd7\xb6\x1a\xeb\xaf\x77\x3a\xd0\x40\xb7\xb5\xbd\x5d\x6f\xb4\xa0\x81\xed\xb5\x5a\x73\x67\xb7\x49\x7e\xaf\x6d\x75\xb6\xd7\x3a\x3b\xd0\x30\x47\xe8\xdc\xaa\x0f\x38\xde\x3f\xda\x39\xd8\xae\x77\x6a\x10\x7e\x7f\x8e\x0e\x49\x94\xcd\xb5\x48\xd2\x2b\xba\x2b\xdf\xf6\xae\x88\x2a\x13\x01\x09\x47\x10\xec\xce\x5a\xab\xdd\x68\xd6\x60\x04\x77\x76\xbb\xdb\x5b\xaf\xd7\xa1\x83\x2f\xd6\x5f\x6f\x6d\x77\x77\x77\xc8\xef\x7a\xad\xd9\x68\xb7\xd6\x60\x70\xba\xcd\xed\xc6\x4e\x7d\xb7\x76\xee\x54\x8d\x97\x55\xca\x5b\x15\xbb\xa5\xbd\x94\xea\x05\x37\x35\xf3\xcd\xf1\x29\x16\xa0\x7b\xcd\xcd\x22\x1d\xd7\x37\x07\x1f\xa5\xd2\xfc\xf2\xe0\xa3\x69\xc8\x84\x8a\xee\x54\xa4\x7a\x68\x13\x55\xcc\x02\x88\x1a\x80\x4a\x8d\xe5\x86\x0f\xd2\xcb\xc5\x8c\x4a\x0d\x80\xcc\xae\x54\x03\x68\x5a\x97\x9a\xe0\x0a\x54\x63\x68\x9e\xad\xf3\x1e\x12\xf7\x0f\x84\x14\x9d\x57\x8e\xc0\x00\x3e\x0e\x47\xee\x02\x09\x14\x48\x9c\x05\x40\xfc\xfc\xf8\xc5\x0d\x01\x64\xa2\x8f\x5f\xdc\x10\x60\x9b\xfe\x98\xba\x21\xc0\xa6\xf1\x31\x4d\xec\x11\xad\x57\x57\xc9\x2a\xfb\x4c\x0e\xcd\x97\x7e\x12\x12\xe9\xd8\x72\x49\xeb\x8f\x3c\xd4\x1b\x79\xa8\x3f\xf2\x50\x30\xf2\x10\x1e\x59\x1a\xf2\x13\x0f\xf5\x12\x0f\xf5\x13\x0f\x05\x89\x87\x70\xa2\x37\xe6\x13\x54\x7c\x82\xf0\x9e\xe9\x32\xd2\x4b\x20\xe8\x38\x7c\xac\xeb\x1f\xfb\xe4\x63\x9f\x7e\x6c\xe8\x1f\x03\xf2\x31\xa0\x1f\x9b\xfa\x47\x38\x30\x60\xfa\xb1\xa5\x7f\x14\x69\xaa\x7d\x35\x2f\x35\xef\x92\x7e\x2b\x68\x35\x25\x84\xff\x2e\x6d\xa2\xba\x75\x6d\x67\x64\xf9\xf8\x23\xb4\x94\xaf\xa9\xa5\x2f\xa3\xb3\xf0\xfc\xbc\xfa\xd5\xe6\xc4\x00\x5e\x3b\xaf\xea\x9d\xea\x1f\x4f\x9f\xa8\xac\x91\xb4\x81\x06\xf5\x4a\x6f\xe4\xf5\x47\x5e\x30\xaa\xa2\x25\x34\x1c\xd9\x7d\x6f\x6e\x90\x50\xc8\x85\xaf\x9a\x0d\xaa\x6a\xb3\x40\x6b\xe8\xd0\x8c\x91\x37\xa0\xb5\xd6\x9d\xd0\x9a\x3a\x34\x63\xaa\x0c\x68\x9d\x96\x13\x5a\x4b\x87\x66\xcc\xad\x04\xed\x8f\xd5\x55\x06\x71\xbd\xe6\x84\xd8\xd6\x21\x1a\x04\x81\xec\x61\xd2\xc9\x24\x66\xd6\xe9\x22\x5f\x50\x12\x67\xa3\x4a\xe6\xa5\x64\x5a\x6d\x4e\x1b\x40\x03\xd9\x12\x1e\xd9\xa7\x1c\x56\x84\xb1\xa4\xc8\x1f\xd0\x6d\x60\xfb\x02\xe4\x0e\xed\x92\x35\x59\xb7\xba\x01\xc1\x7a\xe9\xd9\x6a\xc3\x32\x33\x6e\x12\x05\xaa\x7e\x82\x96\x24\x6a\x4d\x6e\x4f\xad\xed\x4a\x2f\xf1\xfa\x89\x17\x24\x30\xe2\xc9\xdd\xa8\xb5\xa5\x43\xbb\x2b\xb5\xaa\xd0\xee\x44\xad\x0d\x1d\xda\x9d\xa9\xb5\xae\x43\xbc\x67\x6a\x4d\xe0\xd6\xba\x80\x5c\x13\x07\xb9\x02\x47\x4d\x6c\xe4\x0a\x8c\xd8\xf6\x05\x58\x34\x25\xd7\xc4\x49\xae\xb0\x01\xd8\x6a\xc3\xd6\x60\x5a\x68\xe8\xac\x7c\x5f\x4e\xc7\x00\x32\x24\x58\xfd\x6a\x12\x26\xf9\x67\x13\x55\xf6\xa8\x69\x6e\x9f\x70\xe6\xc0\xd2\xd3\x3d\x66\xc2\xbb\x47\xcd\x6f\x03\x52\xce\x36\x22\x7b\xcc\x4c\x77\x8f\x1a\xd2\x62\x52\xce\xb7\x96\x6b\xb2\x72\x60\x2c\x0b\x3b\x42\xcf\x5a\xae\xc5\xca\x81\x61\x72\x8f\x94\xeb\x5b\xcb\x81\x01\xb3\x32\x2c\xba\x58\xbb\xcb\x52\x6b\xdc\xc1\x3c\x2b\xf0\x33\x5f\x08\x43\xe4\xc1\xb2\xf1\xcf\x4f\xc3\xc8\x4b\x46\xaf\xc3\x2c\x3d\x8d\x33\xe0\x78\x14\x66\xb4\xed\x67\x3e\xb5\xda\x7a\x8e\xd6\x2d\xd0\xa1\xce\x3b\x3c\xc8\x8c\xa4\x8d\x50\xde\xe8\xcc\x56\x10\x98\x59\x88\x11\xcb\xb7\x48\x8d\x99\x72\x90\x44\x9a\x6c\x9f\xa3\xaf\x9b\x34\xb1\x70\x6e\x23\x21\x4a\xfc\x03\x35\x1b\x3a\xb5\xe6\x90\x2a\x95\x4a\x5e\x74\x09\x11\xfe\x40\x40\xbe\xa8\x12\x50\x2d\xb2\x6e\xeb\x2d\x87\x00\xcd\xab\xd2\xe1\xc8\x85\x67\xe9\x65\x79\xe1\xd9\x00\xc6\x04\x67\x0d\xd8\x3c\xc1\xd9\xd6\x51\x39\x4f\x47\x9e\x0f\x93\xe7\xd8\x01\xe3\x18\x4b\xda\x8e\xd5\x55\x38\x09\x22\xc8\xee\x42\x1d\xb2\xac\x86\x53\x13\x7a\xf2\x32\xb3\xb9\x14\x93\x25\xac\x6e\x59\x46\xb7\x10\xce\x1e\xda\x44\xb2\xf8\x7e\xb7\xf3\x5b\xbb\xd4\xf1\xcd\x7e\x22\xdb\x83\xa3\xd8\x9e\xc5\x99\x04\x15\x9d\xc1\xf6\x84\xbb\xde\x9e\x72\xbc\xda\x5b\xf8\x5c\x45\x29\x64\x4f\x39\x53\xed\x39\x0f\x53\xf3\x4d\xe1\x8e\xe9\x4d\x38\x9d\x5c\x96\xc1\x22\x80\xc1\x56\x8b\xb2\x1b\x73\x6d\x82\x14\x36\xd5\x1f\xc5\x51\x31\x83\x02\x53\x02\x52\x2a\xd7\x2e\xc0\xa3\xdb\x0c\x82\x7e\xfe\x68\x10\x09\xad\x67\xd2\x1a\x43\x13\xbe\x2a\x76\x51\xf0\xf3\x86\xde\xfe\x23\xd9\x22\x6e\x50\xaf\xcc\x3c\x74\xed\xa1\x2f\xb6\x34\x1f\x95\xca\x0c\x3c\x3b\xaf\xe1\xdf\x2f\x79\xb6\xf6\x1b\x03\x4e\xa3\x18\x4e\x65\x56\xfd\xa9\x72\x5d\xa5\xee\xe4\xff\x26\x0f\x5f\xaa\xd5\xea\x4b\x17\xb4\xe6\x5c\x68\x04\xd0\xbf\x09\xc4\x1c\x35\x07\xac\xd6\x7c\x58\x3f\x01\x04\xc0\xed\xba\xfa\x53\xe5\xdf\x80\x9c\x1b\x62\xbb\xcc\x98\x91\x41\xfb\x9a\x83\x72\xc0\x02\x51\x62\xe6\x45\x56\x48\xb3\x57\xaf\x22\xc0\x6a\xf6\xf3\xcf\x3f\x57\x9a\x8d\xe5\x48\x46\x8a\xfe\x28\xb4\x86\xe1\xc6\x30\x34\x0f\x5c\x39\x63\x18\x67\xb6\x1f\x66\xdf\x02\x36\x4f\xfc\x77\x16\xff\xff\xec\xbd\x7d\x77\xd4\x38\xd2\x28\xfe\xf7\xf0\x29\xb4\xfb\x3b\x0b\x1d\xd2\x49\x2c\xf9\x4d\x06\x32\xbf\xcb\x64\xe0\x61\xee\xc0\xc0\x81\xcc\x85\xe7\x70\x60\x56\xb6\xe5\xb4\x87\x4e\x77\x9e\x6e\x87\x24\xbb\xc3\x9e\xfb\x35\xee\xd7\xbb\x9f\xe4\x1e\x95\x64\x5b\xb6\x25\xb9\x3b\x84\x79\x76\x76\xc9\x9e\x65\xba\xdb\xa5\xaa\x52\xbd\xa9\xac\x97\x92\x8c\x4c\x43\x34\x96\xfb\x79\x2c\xd0\xd7\xbd\x98\x47\x79\x46\xbb\x93\xa5\x9e\xc0\x9b\xdc\x51\x2c\xde\x31\xec\xc2\xb1\xb7\xba\xa8\xb9\x35\x6d\xb7\x19\x4e\x0e\xf6\xb6\xda\xd4\x00\x9b\x6d\x55\xaa\x95\xf3\xe4\xd9\xc3\xa3\xdf\x41\x35\x8e\xe6\x1f\xf8\x15\x34\x5d\xf3\x6c\xc5\x2b\xcb\xdd\x49\x16\x85\xc2\x95\x83\x37\xa8\x50\x79\x91\x61\xa3\x9a\x27\xa7\x2c\x6b\xd5\xa3\x6f\xb1\x32\x68\xa8\x03\x3c\xd4\xd2\x29\xcb\x0c\x9a\xfa\xe6\x93\x5c\x07\xb6\x6c\x8d\xaa\x21\xcd\xb7\x13\x7d\x7a\x37\x8d\xe3\xaf\x5b\x9c\xfe\x15\x8e\xac\x7c\xe9\xa5\xfb\x5e\x61\x35\x8d\xb0\xb5\x64\xda\xab\x27\x0f\xf7\xf0\x06\x2b\x19\xc3\xbb\xaa\x6f\x72\xfd\xe2\x10\x4e\x9f\xb6\x4b\x18\xe5\xa2\xac\x26\x86\x02\x54\xdd\x25\x0d\x5e\x64\x39\x4b\x69\x62\xa8\xcd\xe4\x5d\x26\x34\x65\x79\x56\xf0\xce\x1a\x87\x09\x30\xf3\x73\xc2\x71\xe1\x75\x9f\x7d\xfe\x12\x88\x2d\x43\x37\x27\xdf\xc3\x19\xf4\x01\x82\x4d\xe6\x9e\xcd\xd3\xc5\xe2\x51\x6a\x9e\x2c\x86\x84\xd1\x3c\x55\x0c\xaf\xab\xe6\x89\x62\xf1\x88\x37\xd3\xc4\x03\x4e\xad\xf3\xc4\xd6\x39\x61\xcb\xdb\x02\xcc\xfb\x20\x79\xc2\xd4\x52\x0b\xe6\xb5\x4c\xfc\xbb\x25\x30\xba\x67\x4f\xeb\xbf\x7a\x42\xc9\x8c\xa8\x3e\xe7\xf0\xfa\x6d\x89\xf6\x90\xff\x0e\xbd\x57\x1f\x69\xfb\x11\x07\xda\xe7\xc8\x76\x77\xa4\x62\x69\xb2\x80\xc3\xb1\xf2\xdd\x12\x5e\x1f\x7c\x6c\x2e\x53\x63\x7e\x13\x82\xa9\xa5\x09\x13\x48\x42\x40\xc2\xe4\x9b\x4c\x0c\x07\x64\x39\xda\x05\x42\xb6\x89\x46\xf4\x00\x11\xcf\x2a\x35\x98\x36\x9b\x4c\x52\x74\x1b\x65\x32\xcf\x15\x1f\x73\xc0\xec\x5d\x86\x4c\xae\xc2\x8e\x4c\xf1\xa1\x07\x28\x18\x23\x91\xa2\xf7\x28\x43\xef\x51\x2e\x31\x47\x3c\x4f\x78\xca\x4c\x45\x87\x7a\x98\xa3\x2d\x98\x97\xbc\x8b\x4f\x99\xea\xc5\x1e\xf2\x2e\x63\x8f\x07\x81\x4f\x02\x3b\xad\x83\xbb\x0d\x39\xea\xed\xa0\xbb\x07\x1b\xf7\x45\xe0\xf7\xc3\x24\xf7\x39\xe9\xcf\xf2\x20\x8b\x4a\x85\xbf\xe4\xa6\xe9\x3e\x74\x88\x32\xd3\x14\x1f\x02\x92\x0f\x1e\x20\xdf\x53\xbd\x04\xf5\x1b\xef\x16\x45\x87\xc8\xc4\x07\xdb\xec\xb4\xd6\x46\x93\x81\x6a\x12\xad\x9e\x6c\x63\xfd\x13\xde\xa8\x33\x11\x08\x13\x86\x83\xca\x27\xa8\x33\x09\x08\x93\x85\x99\x19\xc6\xd7\x27\x0a\x73\x33\x4c\xa0\x4f\x12\xf2\x3e\xcc\xd7\x09\xbe\x7f\xd6\x09\x3e\x91\x0b\xef\x17\xf3\xe5\x72\xa5\xcf\xb9\x1d\xc0\x40\xad\xfe\x3e\x8b\x08\xd4\x42\x68\x31\x8f\xcc\xd3\x0d\xa6\xe9\xbe\xd0\x0c\xdd\x96\xf3\x40\xc6\xe9\xba\x3f\xe2\x6c\xd0\xd7\x29\x84\xc1\x64\x80\x48\x9f\xb7\x9a\x3d\x80\x06\xae\x89\x83\x6e\x42\xde\x9d\x33\x10\xcf\xbe\x4e\x17\xdc\xe8\x74\x01\xe8\x63\x83\x99\x02\xb3\x5a\xda\x49\x02\xa5\x1a\xfb\xb1\x29\x01\x60\x9f\x16\xa0\x7f\xe8\x02\x1b\xeb\x19\x23\x61\xf4\xa5\x6b\x63\x28\x2a\xff\x3e\xd3\x07\x83\xe9\x01\xfd\x1d\x9e\x84\x51\xe7\x2d\x5e\x3b\x85\xdd\x9f\x15\x20\x24\xd8\x6c\x5e\x40\x00\x76\x70\xc2\x77\x89\xfc\x77\x9d\x1b\xc8\xb0\x17\x26\x3c\xa7\xe2\x95\xdf\x8f\xe2\x2c\x0f\xbd\x18\x3e\x7b\xb1\x97\xe7\x18\x3e\x17\xb1\xc7\xc3\xc4\x37\xcf\x19\x14\x45\xe6\x79\xa9\x0f\x93\x0b\x11\x0d\x29\x0e\xb1\xfc\x1c\x14\x09\x2d\x18\x20\x48\x79\xc1\x82\x82\x05\x5b\x4c\x17\x6c\x94\x79\x6a\x61\x5f\x89\x4e\x6b\xe9\x38\x45\x0b\x11\xb5\x49\x67\xf6\x0e\x87\xc9\x8b\x65\x61\xe9\xeb\x10\x3d\x32\xe2\x12\x12\x6c\x3b\x48\x8b\x26\x23\xc3\x74\xc7\x3b\x06\x03\x35\x21\xe6\x43\xec\x5f\x87\xea\xcf\x18\xaa\x85\x56\x36\x1b\xac\x8d\xca\xe9\x0c\xd7\x52\x41\xce\x01\x9b\x90\xfe\x51\x67\xed\x5c\xb3\x1a\x8e\xee\xc5\x89\x18\xc0\x93\xaf\xf3\xfa\xff\x3d\x03\xf3\x1f\xef\x58\xde\x0f\xf2\x12\x87\xf2\x6f\xcd\xa9\x5c\xb4\x5a\x9e\x2f\x72\x94\x75\xcf\xeb\x69\x3d\x78\xd2\xbf\x3a\xe5\xc7\xee\x32\x40\x3d\x51\xcb\x5b\x1c\xf2\x89\x29\x83\x41\xfa\x92\x72\xb9\x7e\xb1\x2a\x4f\xf9\x64\x61\x1c\xc6\xd6\xff\xb5\xaa\x7e\xaa\xdf\xf3\xc5\x97\xc9\xa2\xff\x9e\xd9\x4c\x04\x4b\x75\xa2\x43\x44\xee\xd7\x9f\x1f\x1c\x4a\x0c\xf5\x0f\x8e\xb9\xe1\x3f\x4d\x16\xe8\x2f\x0a\x6c\xc7\x3a\x5f\xa8\x7c\xb4\x60\xf3\x35\x1f\xdf\x15\xd8\x9f\x1f\xab\xdf\xc7\x57\xe7\xdd\x37\x5c\x83\x58\x4e\x78\xf5\x78\xc5\xe0\x33\x9b\x7f\x57\x56\x6b\x83\x80\x9a\x25\xfc\x05\xda\x43\x93\x05\x54\xf6\xdc\x41\x77\x3b\x93\x1f\xfd\x99\x2c\x8d\x56\x3d\x4b\xad\x57\x66\x87\xdf\x40\x21\xbd\xfa\x3d\x17\xb3\x72\xce\xd1\x44\x3d\x7b\x80\xd4\x96\xcc\xbe\x14\x5b\x6d\x5a\x05\xdd\xa0\xa0\x56\x29\x3f\x79\x2b\x81\xa0\xec\xe8\x40\x10\x60\x0b\x67\xcb\x8b\xc9\x62\x8a\x30\x3a\x40\x64\x67\x83\x8a\xed\x08\x6e\x42\xd9\x06\xad\xbf\x63\x2c\x9e\x2d\x51\xec\xee\x8e\x4c\x85\x2e\x3a\x10\x75\x86\x34\x69\x71\x5e\x7f\x8d\x4d\x24\xde\x9b\x65\xd3\xc3\x0c\xfd\x8b\xaf\xb4\x3d\xd9\x5f\xcf\xcb\x8c\x4f\xbc\x9d\xaf\xab\x5e\x1b\xaf\x7a\x0d\x1e\x15\xf0\x28\x34\x3d\x3a\x81\x47\x83\x05\x23\xc8\x59\xe0\x51\xfc\xd9\xcb\x68\x91\xa3\xd6\xfd\xef\xbd\x8c\x76\xc2\x4e\x4f\x99\x77\xd9\x2c\xa6\xe1\x81\x50\x86\xd0\xb0\xd1\x78\x52\xb7\x7c\xf0\x00\x11\xb9\xe8\x55\xff\xf2\xed\xb7\xdf\xa2\x78\x67\x07\xa1\xf7\x66\x4c\xdd\xbf\x0e\x26\x1c\x0c\x30\x61\xba\xb3\xb3\x19\xa6\x6e\x3b\xdf\x18\x5e\x3a\x3d\xc1\x6d\xbf\x8d\x9b\xe4\xbb\xc0\x5a\xb7\xb1\x64\x56\xeb\x36\xbe\xac\xeb\x4d\x6f\xc8\x6c\x17\x93\x3f\xc4\x94\x6c\xd9\xed\xba\x9d\xf9\x4e\x02\xd4\x1a\x8e\x52\xe2\xae\xea\x39\x14\xf9\x55\x3d\xdc\x75\x2e\x98\xda\x56\x3f\x33\x38\xd5\x38\xe1\xe8\x36\x2a\x60\xb3\xdb\x3f\xc4\xc7\x13\xdb\x15\x2e\xa7\x0c\x2a\xcc\x31\x74\x1b\xa5\x00\xce\xe4\xea\xe0\x7b\xa4\xd6\x09\x4d\xfc\x43\xb2\x52\x9e\x08\xc6\x9b\xa5\x56\xb5\xd8\xa6\xd6\x5a\xe5\xd6\x3f\xf9\x04\x27\xda\x13\xec\x77\x1e\x75\x1a\x99\xc7\xb6\x86\x18\xdc\x53\x33\xe1\x60\xe3\xb2\x72\x32\x87\x76\x91\xc2\x28\x9f\x60\xed\x09\xc6\xfa\xa3\x58\xee\x6c\x95\x8f\x48\x68\x1e\xf1\x60\x01\x59\x50\x9a\xa1\xdd\x9a\xec\xae\x10\xea\xae\xbc\xe8\xcd\xba\x78\x0c\x0d\x09\x3a\xac\x05\xb3\x2b\x44\x6b\xa2\x20\x02\xd7\x89\x01\x81\x88\x75\xfd\x3a\xed\xe2\x4f\x84\x47\x53\xfa\x05\xb5\x33\xe1\xb6\x04\x6c\x5a\xe6\x43\x23\x4b\xa4\xfd\x6a\xeb\x68\x64\x39\x74\x52\x09\x41\x54\xc4\x44\xeb\xdf\x65\x69\x54\xc2\x84\x0a\x06\x4a\x86\x17\x66\x98\x48\xc1\x40\x49\xf0\x13\x33\x4c\xac\x60\xc0\xe7\x67\x5f\x97\x61\xbf\x2e\xc3\x7e\x5d\x86\x1d\x66\x9b\x5f\x97\x61\xff\x29\xe7\x78\xc3\x68\xeb\x39\xde\x30\x1a\x9d\xe3\xd5\xdf\xd9\x86\x73\xbc\x61\xf4\x75\x8e\xf7\xc6\xe7\x78\xc3\x68\xd3\x39\x5e\x93\x72\xba\x73\xbc\xa0\x20\xf7\xa6\xed\x66\xed\xcc\xbc\x34\x4b\xbd\x3f\xf4\xd2\xec\x65\x14\xfc\x2e\x17\x17\x34\x74\xbe\xce\x02\x77\x67\x81\x2f\x23\x58\x53\xdd\xbf\x8c\x02\xed\xf7\x37\x51\xa0\xaa\x74\x03\xc4\xbe\x56\x27\x7a\xab\x9a\x6e\x5a\xff\x5e\x3e\x79\xfe\xcb\xf3\xc7\x8f\x5f\x3d\x3a\x7e\xd5\x9f\x2d\x7e\xf1\xc3\x2f\x3f\xfc\xf4\xfd\xa3\x37\x8f\x86\xb7\x72\xbf\x7c\xfe\xf3\x4f\xdf\xff\x72\xf4\xfc\xa7\x57\xc7\x0f\x7f\x6a\x5a\x6a\xe4\xe4\xb4\xf2\xd1\x66\xd3\xca\x5a\x8b\xd5\x6c\x59\x17\x6d\xe9\xcd\x49\xd7\xa4\xc5\xdb\x35\x9e\xa2\x2b\x5b\xa9\xf2\x4a\x4e\x89\x54\xe8\x01\x22\xc1\x7d\x54\x19\xa6\x44\xb4\x3e\xbf\xbd\x44\xbb\x28\x44\x77\xd1\x95\x3c\x3d\x58\xd5\x87\x34\xe1\x13\xd9\x81\x99\x4a\xf4\x17\x14\x0d\x72\x11\x48\x03\xf9\xc5\x1b\x74\x88\xae\xd0\x5f\x50\x68\xca\x12\xf9\xc5\x7f\x0a\xac\x04\xdd\x45\x82\x8e\x2f\xe8\xec\x18\x80\x2f\xe5\xb4\xdc\x9b\xde\xcf\x57\xf2\xe7\xff\xb4\x4c\x05\x6b\x62\x3b\x2b\x51\x09\xd7\x09\x18\x84\xd6\x48\xe6\x52\x4a\xe6\x52\x1e\xd0\xbc\x34\x08\xa6\x01\x95\xd2\x45\x57\x12\xf4\xca\x32\xad\xd4\x1a\x48\x57\x8c\x57\x70\xc1\xcf\xb0\xd7\x42\xae\xfd\xae\x7f\x1a\xed\x5b\x6f\x95\xa3\x6b\x0d\x4f\x1f\xbf\x7a\x29\x78\xbd\xf4\xb0\xc9\x18\xf4\x7b\x27\x2c\xf3\x63\x02\x0c\x48\xd4\xc6\xfa\x6c\x7d\xd1\xb3\x2d\x23\xd8\xd3\x1a\xcc\x22\x42\x75\xf3\xc4\xaf\xe8\x01\x8a\xef\xa3\x5f\x1d\x33\x73\xd0\x07\x38\x9a\x6a\xae\x8a\x52\x93\x4f\xcb\xea\xc5\x72\x0d\x75\x5c\x85\x55\xc1\x65\xb9\xbf\xee\xa0\x3d\x64\xda\x4d\x5d\x23\xd7\x1b\x3d\x40\xaa\x5e\x84\x09\x58\xfc\x0d\x3a\xf8\xfe\x10\x01\x19\x0d\x8b\x85\x56\x77\x47\xb5\x4e\xf5\xdb\x43\x20\x6b\xdf\x5c\x3d\xa0\xfc\x4c\xa3\xdc\x41\xb5\x67\x78\xef\x69\x18\xd8\x6c\x6a\x49\x33\xac\x05\xbf\xac\xc0\x80\x46\xd4\x42\xed\x3b\xd1\x0f\x0e\xd0\x8b\x55\x79\x5a\x56\xe5\x47\x8e\xce\x96\xf3\xab\xc5\xf2\xb4\x64\x73\xb4\xfc\xc8\x57\xe8\x3f\x1e\x4f\xc8\xce\x3d\x74\xf9\x9e\xa2\x5d\x74\xf9\x3e\x82\x7f\x43\xf8\x37\x10\x61\xc6\x8c\x52\x59\xb4\x24\x2f\xcf\x0f\xbc\x47\xde\x65\xec\xd8\x32\x6f\x61\x4e\x61\x38\x34\xda\xc7\xc8\xa2\x57\x2f\xc0\xcb\x39\x3e\x35\xfc\xd4\x05\xc6\xfa\x3a\x9b\x0e\xec\x67\x67\xdb\xd5\x94\x35\xf8\x4f\xc5\x4f\xcf\x96\x2b\xb6\xba\xea\xdc\x44\x27\x5c\xe0\x58\x1f\x88\xac\xab\x94\xc6\x5b\x67\xcc\xde\x7f\x6c\xec\xd9\x18\xdf\xbd\xb5\x1d\x7f\xb3\x95\x1d\xbf\xb3\xae\xe3\xbb\x56\x75\x6e\xfe\x2a\x81\xe5\x79\x75\x76\x5e\x3d\x85\x57\xeb\x0e\x2c\x82\x24\x3d\xe7\xeb\x72\xc5\x73\xed\xa2\x81\xb4\xac\xd6\x75\x41\x68\xd9\xb8\xf3\xb6\x50\x37\x7e\xbe\x98\xd7\x6a\xd2\x6a\x70\xb3\x15\xbf\x87\x08\x09\xa6\x88\x84\xd1\x14\xf9\x34\x98\xa2\x10\x93\x7e\x63\x75\x67\xc1\x3d\xf1\x4c\x7f\xd4\xbf\xb4\xa0\x7e\x69\xb6\xde\x5b\xa0\xf7\xae\x87\xed\x1a\xf7\x17\xc0\x4c\x2d\xdc\x84\x58\xbf\x7b\xd7\xdf\xde\xbe\xb3\x44\xfb\x0d\x4c\x4d\xfc\x01\x1e\x69\x72\x0b\x7e\xd1\x98\x1d\x2c\xc2\x8d\x95\x12\x00\x4e\x9a\xdb\x7a\x61\x04\x88\x3c\x0f\xed\x21\x31\xd0\x36\x37\x25\xe8\x92\x10\xd9\x8b\x4f\xbe\xd4\x8a\x9e\x61\x62\xce\x20\x34\xe3\xe4\x59\xdd\x89\xa7\x6c\x01\x73\x3f\xbd\xae\x1d\x20\x62\x9a\x43\x4b\xd7\xcb\x55\x3a\x2e\xff\x1e\xfa\xcf\xa9\x24\xf8\x8c\x94\xa8\xbb\x28\x26\x64\x6d\x9d\x36\x7f\x46\xe0\x0e\xfa\x3e\xb8\x88\xf5\xae\x62\x16\xd6\x2b\xa8\x05\x79\x67\x3d\x41\xd2\x29\x24\x48\xae\x53\x41\x90\x74\x4a\x07\x92\xeb\xd7\x0c\x54\x0c\xe3\x31\x8e\x71\x97\x65\x7c\x2d\x9e\x71\x97\x69\xbc\x0d\xd7\x46\x3d\x48\xe3\x6a\xa6\x46\xca\x45\xb5\x94\xd6\x6c\xd6\xf4\x9c\xc1\x64\x5e\xed\xce\x06\x51\x08\x88\x7d\xb8\x6f\xf6\xfd\x21\xc8\xc5\x06\x33\x5f\x5e\x20\x05\x33\xbe\x1a\xf1\x52\x0c\xb0\x6b\x8b\x0f\xc8\x44\x19\xfc\x40\x7e\x94\x49\x2f\x7c\xb6\xbb\xc0\xf1\x8c\x57\x6c\xf8\x64\x8b\xb7\x06\x0d\xd9\xb3\x52\xbc\x82\xcc\xcf\x4f\x17\xd0\x39\x83\x5b\xd5\x12\xac\xd3\xec\x29\x6a\x33\x69\x23\xf0\x96\xef\x24\x3a\x8d\x8e\x96\xda\x37\x14\x0b\x21\xf1\x57\xa7\x9e\x8d\xf6\x5c\xb0\x4f\x35\xd8\xf9\xf2\xc2\x9a\x97\x5a\xa5\x75\x6c\xcc\x73\x4c\x3d\x39\x16\x5a\x38\x7e\x7b\x69\xe3\xfd\xf8\x52\xda\xda\x21\xf4\xc0\x0e\x04\xc6\x76\x08\xac\x6f\xb6\xfb\xe6\x7a\x66\xe0\x08\xab\x6d\x8f\x02\xe8\xd2\x44\xe8\x25\x80\xd7\x43\xd7\x62\xf9\xf1\x25\x6e\xc1\xf1\x26\xe0\xd2\xbe\x8e\x2f\xb1\x4b\x8f\x0a\xf6\x69\x03\x0b\x7a\x74\x9a\xf7\xfa\x7c\x05\x1e\x25\xaf\x13\x11\xa6\x3e\x6e\xe5\xc7\x97\x81\x8a\x05\x68\x32\x51\xbc\x35\x47\x83\x15\x7d\x75\x3e\xd8\xf6\x7a\x03\xd8\x9e\x36\xd8\x64\xd4\x90\xd8\x9e\xf6\xb0\x3d\x1b\xc7\xf6\xbb\x3a\x55\x27\x14\x3a\xec\x13\xf5\x43\xa2\xc5\x4c\xd1\x56\x6f\x7b\x2f\x67\x4b\xf4\xa2\x74\x58\xb6\x20\x59\xdf\xf9\x88\xef\x6b\x5f\x65\x2a\xd7\x7c\xff\x6c\x93\xef\x48\xae\x41\xeb\x32\x63\x01\x24\x2d\x68\x2c\x20\xd5\xd0\x4f\x5b\x68\x7b\x48\x82\xc1\x62\xb6\x7c\x2e\xb3\x94\xc3\xce\x7c\x98\xce\x97\xb5\xb3\x2f\x97\x90\xe8\x39\x42\xbc\x78\x81\x6e\x49\x8c\x4e\x3c\x68\xbe\x32\xa9\x3b\xfd\xe0\x41\xcb\x24\x98\x76\xdd\x3f\xb8\x4a\xd3\x27\x68\x4f\x7b\x6e\x33\x74\xd4\x75\x9d\x06\x87\x11\xf9\xb3\x2d\x91\x77\xe7\x3c\xda\xee\x6e\x34\xe3\xd1\xef\xb2\xe2\x4a\x43\x03\xb3\x1d\x43\xe6\xa2\xe0\xda\x3d\x7f\x36\x42\xe3\xe9\x96\x34\x5c\x63\xdb\x8a\x2d\xd6\x67\xcb\xb5\xd3\x4a\x20\xfc\xbe\x28\x9f\x4a\xc7\x38\x7e\xab\x4d\x28\xb6\x76\x68\x1d\xf3\x64\xc3\x4d\x06\x3e\x05\x39\x36\xfa\x59\xe3\xc7\x59\x89\x58\x05\x43\x20\xc4\x4b\x73\x4e\x78\xec\x41\x1f\x8c\x45\x5b\x9b\x97\x23\xaf\x09\x00\x46\xb8\x63\xaf\xee\x8e\x84\xb6\xb9\xfc\xb1\x57\x77\x46\xc1\x59\xc6\xad\x83\x03\x74\x34\x73\x05\xbf\xcd\x87\xf5\x6b\x0e\x19\xe3\xa1\x11\x69\xe1\xab\x8e\xc3\xcd\xb8\x32\x62\xdc\xdb\x85\xd4\xba\xd5\x71\x63\x70\x9b\x37\xb9\xc4\x4d\xa3\x89\x96\x84\xec\x6c\x32\x00\x4a\x04\xa4\x87\x80\x0c\x10\x38\xa5\x28\x72\x8f\xd5\xf2\xc2\x21\xc4\xb9\xe6\x0d\xc7\xad\x6b\xbc\x47\x93\x7f\x28\xf6\xe5\x0f\xb7\x6b\x66\xe0\xab\x2b\x7e\xcc\x35\xaf\x39\x6e\x5d\x48\xc7\x08\x3f\xb4\x18\xe7\xcb\x8b\xcf\x9f\xa0\xfd\x61\x69\x7a\x23\x19\xe8\xdb\xea\x69\x9d\x69\x48\x31\xbe\xf5\x26\x33\xe1\xf9\xe8\x4b\x5b\x07\x8b\xcd\x11\x3b\xf9\x4a\xb7\x85\x70\x49\xc7\x62\xc7\x3f\xd7\xb6\x28\xc3\x24\xcd\x8d\xef\x8a\x1a\xc0\x37\x33\x3e\xa2\xdd\x70\x1a\xe8\x2e\x4c\x5e\x0d\xe7\x81\xae\xbb\x97\x0a\x5f\x67\x2b\x15\x6c\x92\xca\x78\x39\xef\xee\x77\xc2\x3b\xe8\xa0\xcb\xff\x0e\xba\xdb\xff\x01\x88\xc3\x02\x4d\xb3\x9b\xeb\x9f\x64\x13\xd4\x67\xcf\xe1\xe9\xd3\x8c\x35\xf3\xc6\x39\x48\x74\x60\x54\xbd\x0e\x52\xcf\x02\x0e\x71\x1e\x18\x37\xd3\xbd\xfa\xaf\x73\xce\xff\xc6\x87\x48\x67\x6c\x3d\xab\x8d\x7b\xa3\xbb\xe8\x07\x5c\x7c\xce\x64\xe1\xf8\x9c\xd0\xe6\x29\xbd\x2d\x9d\xdf\x7e\x0e\xb1\xa5\x67\x9f\x95\xd3\x52\x43\x35\x31\xa7\x27\x9c\x5b\xcd\xcd\x69\xa8\xd4\xf4\x9c\x8e\xea\xba\xf3\x8a\xad\x28\xdc\x9d\x78\x3a\xe8\xc4\xd3\xeb\x76\xe2\xe9\xa0\x13\x4f\xb7\xeb\x84\x59\x55\xd2\x74\x95\x93\x55\x4b\xb4\xe2\xd5\xaa\xe4\x1f\xb9\x61\x03\x22\x52\x87\xbb\x65\x3c\x38\x3b\x5f\xcf\x6a\x36\x4c\x22\x32\x40\x3e\x1b\x42\x7e\x7e\x79\x62\xc3\xe9\xa1\x86\xf4\x74\xe8\xc2\xd6\xf3\x44\x37\xb4\x6b\xd2\x1e\xbf\xd4\x16\x4a\x43\x38\x6b\x0e\x3b\x6d\x10\x21\x36\x5c\xcc\xa9\x3f\xb6\xfb\x33\x9d\x62\xff\xba\x5d\xf3\x9a\xdb\x35\xfd\x6d\x37\x6b\xfa\x63\x5b\x35\x7d\xc7\x46\x4d\xff\xeb\x36\xcd\x9b\xde\xa6\xe9\x6f\xb8\x49\xd3\xa0\x96\xce\x16\x4d\x7f\x93\x0d\x9a\xbe\xfd\x18\x7e\xb3\xf1\xf0\x1e\x0d\x3e\xbd\x9b\x52\xfc\x2f\xb2\x5d\xb3\x5f\x60\x27\xc4\xe4\x77\xdb\xc3\x59\x97\xdb\x11\x34\xff\x58\xe5\x76\xae\xb5\xdb\x52\x3d\x6e\x77\x7b\xd6\x30\x5b\x15\xe4\x09\x31\xe9\x6c\x0b\x09\x31\xb1\x6e\x33\xa1\x1b\x16\xe4\x11\x80\x9d\xad\x26\x54\x55\xb5\x08\x31\xb9\xb1\x23\xc4\x7a\xf7\xad\x35\x79\x06\x9b\x1c\xbc\xcb\x2c\x4d\xd3\x24\x0f\xf3\xa9\x56\xb0\x67\x67\x6a\x82\x8c\x48\xc2\x48\x42\x98\x5e\xce\x67\xc7\x50\xb7\xc7\xd0\x34\xc1\x61\xe2\xe1\x90\xe9\xd5\x7f\xcc\x44\x70\x48\x0a\x9e\xc9\x9a\x41\x75\x6d\xa0\x0d\x89\x44\xb1\xef\x93\x28\x92\x65\x85\x54\xe5\x20\x33\x11\xca\xd3\x20\x60\x34\xd6\xeb\x0a\x6d\x48\x24\x4f\xbd\x8c\x70\x2f\xd7\xcb\x10\x99\x89\x04\x71\x1a\x06\x14\xe7\x7a\x91\xa2\x5e\x6a\x7a\xd3\x55\x8a\x84\x3d\x5d\xb3\x4a\x11\x8e\xbe\x96\x29\xba\xa1\x9c\x88\x6e\x5d\xa6\x48\x34\x19\xcb\x8b\xf4\x98\x31\xcc\x8c\xe8\xd7\x32\x45\x37\x9f\x1b\xd1\x4d\xcb\x14\x19\x95\xd3\xcd\x8f\xe8\x68\x99\x22\x9f\xba\xcb\x14\x89\x61\xfc\x1e\x25\xa6\x6c\x89\xfc\x8b\x64\x4b\xff\xd2\x87\x5b\x6e\xf6\x60\xcb\x17\x3a\xb2\x72\xfd\x24\x4a\x3e\x6a\xba\xab\x10\xfd\x52\xef\xe0\x35\xdc\x75\xd3\xdd\xe4\xbb\xcf\xce\xce\xe6\x57\x13\xf5\xe3\x14\xb1\xd5\xc9\xf9\x29\x5f\x54\xeb\xfe\x9d\x3c\xfa\xf1\x99\x96\x1f\x28\xa5\xd4\x92\xe8\x91\xf7\x2e\x03\x42\x19\x29\x12\xc8\x2b\xf2\x98\x50\xc6\x09\xd9\x99\x0e\xe1\x62\xec\xc7\x41\x90\x40\x99\x41\xe2\xf3\x22\x0a\xb3\x5c\x4f\x0d\x06\x0d\xd2\x30\xf3\x8a\x34\x2b\xe0\x02\x84\x2c\xc8\xfd\x94\x14\x26\xc4\x3c\x49\xc3\x3c\x65\x21\xdc\x9e\x8d\x69\x92\xa7\x69\xe6\x44\xec\x27\x61\x94\x91\x30\x85\x74\xc6\x0f\x68\x1a\xfa\xd4\x84\x38\x4c\x0a\x8c\x71\x01\x1c\xa7\x91\x17\xe6\x1e\x4e\x9c\x88\x13\xe2\x17\x94\x30\xb8\x72\x9b\x15\x38\x09\x8a\x24\x35\x21\x66\x29\xce\x42\x9e\x03\xc7\x39\x8b\x72\x8a\x31\x75\x22\xce\xa9\x17\x33\x26\x65\xcc\x7c\xcf\xf7\x48\x60\x94\x31\x26\xd4\x0f\x53\x79\x67\x44\x10\xc6\x5e\x54\xa4\xdc\x89\x98\x04\x3e\xa6\x61\x0a\x77\x47\x04\x9c\x07\x29\xa1\x99\x51\x14\xa1\x97\xc5\x79\x06\x17\x88\xe7\x61\x51\xa4\x01\x27\x4e\xc4\x31\x49\x79\x98\xc7\x20\x8a\x82\xc4\x29\x4d\x22\xa3\xf2\xa8\x97\xf3\x14\xcb\xcb\x2b\xfc\x14\x47\x49\x94\x62\xb7\x8c\xd3\x3c\xf3\x22\x59\xa1\x92\x84\x59\x8c\x89\x1f\x9a\x10\x67\x38\x49\x0b\x2c\x19\xc8\x8a\x28\x21\x51\x12\x38\x11\xf3\x20\x49\xa3\x24\x03\xd9\x25\xbc\xc0\x01\xcb\x8d\x32\xe6\x45\xca\x83\x98\xc2\x35\xe2\x3e\x0d\x0a\x12\x72\xdf\x89\xd8\x2b\x32\x9c\xe4\x19\x34\xa0\x29\xcd\xf2\x30\x35\x72\x4c\x02\x2f\x63\x38\xcb\xe0\x92\xf6\x98\x65\x49\x16\x85\x6e\xe5\xe5\x3c\x21\x59\x04\x0e\x12\x26\x24\xf5\x48\x6c\x44\x1c\xb0\x38\xa0\x01\x83\x77\x84\x88\xb3\x88\x07\xd4\xcd\x71\x98\xa5\x1e\x4b\x72\xe0\x24\xcd\x03\x5c\xa4\x79\x60\x74\xe9\xa8\x48\x28\xcd\x01\x31\xf5\x31\x0e\xfd\xd4\xcd\x71\x42\x7d\x1e\xe2\x90\x80\x4b\xf3\x28\xca\x0b\x66\x76\x10\xea\xe3\x2c\x8a\x20\xc3\x27\x79\x1a\xf8\x04\x7b\xee\x58\xe1\x79\x3e\x89\x33\x2a\xef\x7c\x2f\x52\x82\x7d\xa3\xb9\xa5\x45\x98\xc4\x45\xa6\xea\x9b\xf2\xc2\xe3\xdc\x6d\x15\x59\xc4\x3d\x2f\x2d\xc0\xf0\xfd\x9c\x51\x5a\x64\x46\xab\xc8\x43\x16\x27\x38\x00\xc4\x89\xef\x31\x16\x13\xb7\x28\xbc\x28\x63\x91\x1f\xca\xeb\x5d\x3c\xcf\xa7\xc4\xec\x20\x38\x20\x09\x49\xe4\xbb\x97\xc7\x3c\x1e\xf1\xd8\x2d\x0a\x12\xa7\xb1\xc7\x28\x04\x97\x20\xca\x09\x29\x0a\xa3\x4b\x13\x8e\x85\x98\x40\x64\x61\x46\xa2\x2c\x21\x91\x13\x71\x90\x93\x2c\xca\x0b\xb0\x8a\x90\x65\x01\x61\x3c\x37\xc6\x0a\xdf\xa7\x5e\x8e\x41\x64\x49\x9e\x84\xa9\x9f\x17\x4e\xc4\x51\xe8\xb1\xd8\x0f\x03\xe9\x20\xac\x88\xfc\x9c\x9b\xcd\x2d\x62\x1e\x4b\x21\x6e\xfb\x59\x1c\xa7\x84\xb9\xc3\x26\xc5\x19\xc9\x12\x22\xa3\x5b\xcc\x73\xc6\x79\x64\x42\x9c\x90\x98\x90\x4c\x8a\x0c\x07\x94\xf8\xa1\x9f\x3a\x11\x33\x92\x16\x9c\x32\x19\x67\xb3\x02\x7b\x7e\x64\x74\x10\x46\x31\x8b\xa2\x00\x38\x4e\xb3\x80\xf8\x9e\xe7\x8e\x6e\x19\x09\x52\x9a\xc6\x1e\xc4\x59\xaf\xa0\x49\x9c\x60\x63\x74\x8b\xa3\x2c\xc4\x0c\x64\xec\x45\x61\x90\x72\xdf\x6d\x15\x39\x4e\x08\xa7\x38\x01\xc4\x11\x2f\x42\x82\x8d\x63\x5e\x1e\x25\x89\x17\x11\xd0\x45\x18\x46\x21\x4b\x46\x3c\xaf\x08\x3c\xee\x87\x52\x76\x61\x1c\x63\xe2\x11\x66\xb4\x63\x2f\x62\xcc\x93\x3d\xf3\x49\x9a\xe6\x38\x75\x2b\x0f\x27\x2c\xc8\x30\x86\xb0\x99\xd2\x9c\xe4\x5e\x66\xe4\x18\x73\x3f\x8e\x32\x4f\xda\x31\x0e\x30\x4b\x43\x77\x74\x23\x71\x40\xe3\x38\x00\x3b\xce\x0b\xca\x79\x9a\x24\x26\xc4\x7e\x90\x7a\x69\x96\x42\xcf\x38\x4e\xd2\x80\x8e\x98\x9b\x9f\xe0\xcc\xcb\x52\x50\x4a\x16\x66\x49\xc8\x22\xdf\x18\x8f\x79\x4e\x19\x0b\x20\x6c\x72\x3f\xc0\x94\x65\x6e\x73\x0b\xd3\x24\xcb\x58\x50\xc8\x91\x21\xf2\xb9\x1f\x1b\x11\x47\x94\xf0\xa8\x90\xc1\x2a\x8f\x52\x92\x52\xe6\x16\x45\x1c\xd0\x82\x12\x0e\x0e\x12\xe6\xbc\x48\x89\x39\x56\xc4\x94\x85\x91\x2f\x47\x9a\xc0\xc7\x31\x29\x22\xb7\x55\xd0\x20\xa3\x31\xc5\x32\x13\xc2\x85\xc7\xd2\xd8\x18\x36\x69\x96\xc5\x1e\x91\xca\xc3\x2c\x0a\xfc\x84\xbb\x73\xb7\xc4\x4b\x79\x51\x14\x4c\x66\x91\x91\x8f\x39\x31\x5a\x05\x0b\x42\x2f\xca\x38\x78\x5e\xce\x29\x49\x73\xee\xce\xdd\x52\x5e\x24\xcc\x2f\xe4\xc8\x40\xb2\x28\x4e\xb0\x39\xaf\x88\x62\x1c\xd3\x42\x0e\x61\x7e\x4c\x42\x9f\xb8\x95\x97\x31\x12\xfb\x3c\x03\x19\x73\x46\xa2\x08\x27\x46\x19\xe7\x98\x46\x29\x95\x43\x13\x11\x86\x44\xba\x93\x80\xc3\x44\x84\xe5\x2c\xce\x73\x70\x90\x2c\xe7\x1e\x4f\xb1\x31\x6c\x16\x61\x9c\x07\x45\x5c\xa8\x41\x97\xe7\x38\x76\xdb\xb1\x17\x15\x5e\x14\xcb\x7c\x21\x26\x38\x8e\x8a\xd4\xe8\xd2\x1e\x8b\xfc\x38\xcf\xc0\x41\x18\xc9\x68\x42\x99\x7b\x04\xc1\xd8\x2f\x12\xea\x05\x6a\xe2\x2e\xf1\x72\x66\xe4\x18\xa7\x31\xf6\x52\x5f\xc6\x63\x1f\x67\x41\x8c\xdd\x32\x26\x34\x4f\xe3\xb8\x08\xa5\x55\x78\x41\x9c\x53\x63\x3c\xf6\x49\xc6\x58\x1a\x83\x55\x04\x5e\x16\x93\x20\x71\x3b\x88\x9f\x25\x3c\xe5\x1e\x88\x02\x87\x59\x92\xf2\xd4\xa8\xbc\xc0\xc7\x79\x14\x67\xd0\xb3\x24\xc3\x9e\x97\x07\x6e\x3b\x0e\xb2\x2c\xcc\x03\x99\x78\x67\xa9\xcf\x03\x92\x1a\x87\x26\x91\xae\x90\x24\x81\x60\x55\x64\x51\x18\x73\x11\x5e\x5d\xb1\xa2\xc8\xd2\xa8\x60\x72\x90\x64\x79\x54\x30\x6e\xe4\x38\xca\x82\x00\x27\x14\x10\x07\x2c\x88\x43\x8a\x63\x35\x89\xfa\xce\x71\x6c\xb5\x7d\x2f\x7c\x7d\xdd\x13\xaa\xb6\x6b\xd0\x5e\x77\x4e\xa8\xfe\x72\xbd\x13\xaa\x21\x26\x9b\x2d\x1d\x18\x96\x23\x6e\xbe\xfa\xe8\x75\x97\x0e\x22\xe6\x25\xbc\x9e\x70\xf7\xd3\x2c\x4b\x3c\xcb\xd2\x41\x9a\x46\x31\xe3\x72\xf8\xa5\x41\xc6\x58\xdc\x4d\x5d\x1c\x44\xfc\x2c\xe2\x85\x1f\x43\x24\x2b\x78\x12\x14\x54\x44\x32\x13\x24\x0b\x83\xa2\x08\x7d\xf0\x82\xb0\xc0\xb9\x1f\x15\x9b\xce\xea\x87\xd8\xe3\x21\x91\xc1\x87\xe5\x3c\xa2\x24\xb7\x2c\x1d\x24\xa9\x17\x46\x54\x1a\x24\x49\x7d\x1e\x65\xb8\xd8\x90\x08\x2e\xa8\x9f\x27\xd2\xe6\x8b\x34\xc0\x69\x1e\x59\x7a\x12\xa6\xdc\xcb\x72\x99\x06\x61\x3f\xe6\x04\xc7\xc9\x36\x4b\x07\x37\x7d\x8e\x74\x93\xd2\xb0\x00\xe7\xd9\x2b\xbf\x3e\xc1\xf6\xd2\xaf\x4f\x88\xbd\xf6\xeb\x13\xdf\x5e\xfc\xf5\x49\x60\xaf\xfe\xfa\x24\xb4\x97\x7f\x7d\x12\xd9\xeb\xbf\x3e\x89\x2d\x05\x60\x65\x07\xa1\x3c\xac\x71\x1f\xb8\x7c\x3e\x97\xcf\x87\x87\x3d\xa4\x0c\xa0\xb9\xf1\x08\x94\x7c\x3e\x97\xcf\x2d\xcd\x09\x34\x27\xd6\xe6\x64\x2e\x9f\x5b\x9a\xfb\xd0\xdc\xb7\x36\xf7\xe7\xf2\xb9\xa5\x79\x00\xcd\x03\x6b\xf3\x60\x2e\x9f\x5b\x9a\x87\xd0\x3c\xb4\x36\x0f\xe7\xf2\xb9\xa5\x79\x04\xcd\x23\x6b\xf3\x68\x2e\x9f\x5b\x9a\xc7\xd0\x3c\xb6\x36\x8f\xe7\xf2\xb9\x61\x5b\xdf\x86\x45\x8f\xa5\x65\x98\x90\x33\x69\x14\xfd\x8a\x7b\xb0\xe5\x56\x1a\x84\xa9\x55\x2a\x6d\xc1\xd4\x2a\x93\x76\x60\x6a\x95\x49\x13\x30\xb5\xca\xa5\xfa\x4d\xad\x72\xa9\x79\x53\x2b\x2e\xb5\x6e\x6a\xc5\xa5\xc2\x4d\xad\x0a\xa9\x6c\x53\xab\x42\xea\xd9\xd4\xea\x44\xea\xd8\xd4\xea\x44\xaa\xd7\xd4\x6a\x26\x55\x6b\x6a\x35\x93\x5a\x9d\x9b\xea\x0e\xba\x8e\xee\x6e\x78\x1d\xaa\xb5\x9e\x76\x4d\xff\x75\x29\x6b\x0f\xdb\x8e\x9b\x3f\x82\x11\xbc\x5e\x3e\x1b\x82\x6c\x50\x28\x5a\x92\x11\x22\x78\x5d\xd6\xa7\x0d\xf4\xaa\xd1\xe8\x2e\x22\xef\x00\xd2\x5c\xcb\xb5\xc5\x31\x97\x38\xd4\xf9\x82\x3e\x0e\x38\x35\x7f\xad\x0a\xd4\x07\x07\xe8\x3f\xa0\x1a\xb1\x9d\x78\x5d\xd2\x79\xab\x0a\xd5\x97\xb3\xa6\xce\xf1\xe5\xd8\x59\x3c\x05\x36\xd7\x5a\xb8\xcf\xe3\x49\xa8\x59\xa7\x0a\xf6\x4c\x16\xff\xd5\x8b\x57\xcf\xa1\x44\x71\x5d\x0e\xb8\x03\x47\x07\x70\xb0\xe9\xf5\x3d\xea\x82\xc5\xae\x13\xa6\x12\x72\xde\xe1\x62\x3e\xe4\x62\x66\xe2\x62\x3e\xe4\x62\xa6\x73\xd1\x85\x8b\x87\x70\x96\x4a\xc6\xba\x4a\x2d\x35\x73\x3e\x6a\xb5\xb7\xb7\x29\xbe\xdd\x6a\x14\x6f\xa6\x51\xdc\x6a\x14\x6f\xa4\x51\x3c\xeb\x14\xf8\x9e\xd5\x55\xb8\xb5\xc2\xdc\x73\x55\xab\x5b\x13\x12\x56\x12\xee\x82\xc1\x3e\xe6\x44\x53\x69\x8d\x2f\x1a\x55\x29\x9e\x77\xd8\x98\x1b\xd8\x98\x99\xd8\x98\x0f\xd8\x98\x75\xd8\xe8\x22\x8c\x06\xf8\x48\xe4\xd4\xe9\x56\xb5\xc3\x5d\xa1\x24\x6e\xd5\x1e\xbb\xd4\xfe\xba\x8c\x65\xe4\x32\x0e\xcc\x3d\xc8\xb9\x82\x74\x9c\x09\x97\x90\x38\xd2\x02\x89\xf5\x56\xe8\x1a\x56\x32\x80\x8d\x99\x45\x1f\x76\x5e\xc3\x8e\xf2\xd0\x46\x9a\xb9\x10\x5a\x19\xf7\x47\xae\x2e\x78\x1b\xca\x66\x12\x7c\x06\x35\xdb\x04\x1e\xa1\x49\x6f\x07\x3d\xa8\xbd\xb3\xf9\xe5\xff\x47\x18\xdd\x43\x83\x6d\xd3\x43\x3e\xc4\xbf\xb5\x06\xc7\xd9\x10\xff\xee\x36\xde\x62\xe1\x02\x5f\x97\x0b\x90\xe2\x86\x3c\x48\xed\x0c\x39\x90\x9a\x18\xd0\x37\x23\x6d\x47\xc5\xd7\xa5\x4d\xbd\xed\xa8\xf7\xba\x34\x31\x67\xaf\x89\xaf\x8a\xe2\xcf\xd0\x6d\x54\xcc\x54\x59\x7c\xf1\xc5\x7c\x8e\x4f\xb6\x91\xbe\xcf\xe7\xa2\xcd\x5c\xb5\x11\x5f\x4e\xe6\x8e\x62\xfa\x33\xa8\xa6\x2f\x50\xa7\x92\x0e\x7c\xce\xe4\xe7\x54\x7d\xb6\x37\x9f\x43\x73\x41\x25\x95\x24\xe1\x73\x26\x3f\xa7\xea\xb3\xbb\x24\xff\x4c\xd6\xe4\x57\x01\x47\x8e\x2b\x6c\x2e\xcb\x4b\xef\xc8\xe2\x07\x6c\x56\x57\xec\x57\x0f\x3b\x35\xfb\x67\xda\x2d\x12\xac\x1e\x75\x9c\x95\xf9\xe1\x6d\x6a\xd2\x20\x52\x34\x67\x5d\x9a\xf3\x0e\xcd\x59\x97\xe6\x5c\xa7\x39\xdb\x84\x26\x96\xfd\xe4\x6a\x68\x90\xe7\x4d\xb8\x1c\x14\x68\x5d\xf6\x7f\x56\x5f\x5a\xa1\x3d\x0c\xda\x87\x82\xa6\x5f\x3f\x93\x65\xb8\xdd\x34\x65\x3f\x15\x70\x4d\x73\xd6\xa5\x39\xef\xd0\x9c\x75\x69\xce\x75\x9a\xb3\x96\xa6\x31\xeb\x1c\xbf\x87\xc0\xcc\xeb\x8f\x50\x7d\xe9\x47\xfb\x61\xaa\x1f\xc1\x79\x7f\x2c\x5d\xc7\xa8\x7e\x84\x60\xf0\x63\x69\x0b\xa1\x1f\xe1\xa2\x04\x01\x33\x9b\x37\x2c\x9a\x9c\x52\x02\x0a\x82\xb3\xb6\x2f\x32\x5c\x54\x58\x0f\x17\xb3\x4d\x62\x55\x4b\x56\xfc\x2b\x24\xe2\xa6\x59\x01\xa9\x6c\x66\x22\x98\x5d\x8b\xe2\x8f\xc6\xd0\xd3\xa7\xf8\x63\x69\xa2\xf8\x63\x79\x1d\x8a\xe6\x60\xd7\xa7\xf8\xda\x48\xf1\xb5\x89\xa2\xd9\xda\xfa\x97\x57\x58\x48\xc2\xe4\x45\xed\xf6\x00\x68\xe5\x0e\xe6\x41\xea\xa8\xb4\x2b\xc3\x23\xb0\x48\x74\x16\x6b\x5c\x9b\xb1\xf9\xf3\x59\xce\x2a\x8e\x2e\xdc\x6f\xfa\xe2\x0f\xde\x37\x8d\xf6\x0d\xaf\x9b\x27\x26\xb6\x61\x00\x2a\x4c\x6d\xe0\xc5\xb6\x30\xb5\x81\x77\x68\x6e\x6a\x03\xaf\xd0\xdc\xd4\x06\x5e\xc9\x27\xf9\x1c\xae\xef\x98\xdb\xee\xef\x80\x77\xfa\x49\x3e\x03\x28\x29\x3a\xae\x4b\x2e\x1f\x08\xcd\x7a\x13\x88\xc0\x94\x99\x78\x84\x29\x85\xcc\xc4\x23\xcc\x5e\xa4\xa6\x36\x30\x79\x91\x9a\xda\xc0\x3c\x09\x33\xb5\x81\x69\x92\xc1\x6d\x06\xe2\x0f\xa6\x5d\x26\xd2\xd4\x2b\x62\x15\x06\x4c\xdc\x4c\xa4\x1c\x84\x65\xed\xb6\x23\x8e\x94\x46\x35\x4c\x76\x6e\xf4\xb2\x12\x6d\xce\x10\x32\x83\x27\x60\xff\x6c\x90\x0d\x3c\x69\x8a\x51\x4c\x9e\x80\xdd\x33\xc9\xec\x13\x4f\xe7\x96\x0d\x99\xed\xe3\xd1\x66\x19\x25\x41\x10\x51\x3a\x24\x88\x5b\x82\x20\x9e\x54\x11\xec\x44\x82\x74\x9c\xa0\x36\x2f\x29\x09\x12\x08\xb1\x43\x82\xa4\x25\x48\x66\xf5\xb8\x34\x01\x78\x2d\xbc\x8e\x13\xd4\x66\x32\x25\x41\x5f\x10\xcc\x87\x04\xfd\x96\xa0\x2f\x68\xe5\x8a\xa0\x3f\xe2\x0e\x7d\x3c\xda\xdc\xa7\x24\x18\x08\x82\x7c\x48\x30\x68\x09\x06\x82\x16\x57\x04\x03\x9d\x20\x1f\x27\xa8\xcd\x96\x4a\x82\xa1\x20\x58\x0c\x09\x86\x2d\xc1\x50\xd0\x2a\x14\xc1\x50\x27\x58\x8c\x13\xd4\xe6\x57\x25\xc1\x08\x5e\x2a\x86\x04\xa3\x96\x20\x64\xef\x27\x8a\x60\xd4\x79\x89\x18\x27\xa8\xcd\xc8\x4a\x82\xb1\x20\x38\x1b\x12\x8c\x5b\x82\xf0\xda\xa4\xc6\x64\x01\xef\x4a\x02\x3e\xfb\xec\xc5\xd7\x4b\x71\x6e\xee\x52\x1c\x2c\x92\x7b\x75\xb3\x99\x40\x06\x75\x58\x7c\xef\xa6\xaf\xc5\x31\x93\xc1\xff\x94\x17\xe3\x1c\x2d\x17\x1f\xf9\x4a\x56\xf9\x45\xd5\x12\xf9\x64\x2f\x2d\x2b\x91\xa0\xe4\x88\xc1\xfe\xec\x94\x17\xcb\x15\x57\xdb\xa9\x07\x5a\xd3\xce\x9a\x68\x6b\x77\xd5\xf2\x8d\x4f\x6e\xe2\x22\x9e\x3f\xea\x15\x3c\x3a\x9f\x4d\x7d\x90\x7b\x08\x7b\x24\x38\xf0\x55\x9d\xe2\xaf\xa7\x9b\xac\x47\x95\x42\x4c\xb6\x3d\xdd\x24\x9a\x8c\x9c\x6e\xea\x6c\x6b\x18\x9c\x6e\x0a\x31\xf9\x7a\xba\xe9\xa6\x4f\x37\x09\xad\x6c\x76\xba\xc9\xa8\x9c\xce\xe9\x26\xa9\x20\xe7\xe9\x26\x79\x8e\x76\xc3\xd3\xdf\xfe\x1f\xfa\x3c\x13\x5f\x64\x7b\x29\x5b\xf3\x28\xe8\x3d\x38\xcd\xc3\x3e\xe8\xc7\xb3\x0f\x79\xd1\xfb\x31\x2b\xcf\x66\x7c\xf5\xbb\x1c\x89\xd2\x58\x85\xef\x82\x43\xf9\x40\x32\x06\x9f\x75\x7e\xfe\x15\x8e\x4e\xbd\xde\xe8\x4e\x20\xd8\x3c\x73\x04\x5d\x6f\xe0\xb4\xdf\xc6\x8f\x42\x1d\x1c\xa0\x17\x7c\x75\x0a\xa3\xe8\xd1\x6c\x59\x66\x1c\xe1\xfe\xb5\x29\xa2\xf9\x8b\x23\xdc\x3d\xbb\x14\xc6\x53\x14\x24\x53\x14\xe0\x29\xf2\xfd\x29\x22\xe1\x14\xe1\x78\x8a\x92\x29\x42\x58\xdb\x6a\x14\xd2\x29\x0a\xbd\x29\x0a\xc8\x14\xf9\xc1\x14\x91\x68\x8a\x30\x9d\x22\xec\x4d\x11\xd1\xe1\x92\x29\x0a\xf1\x14\x05\xfe\x14\xf9\xe1\x14\x91\x78\x8a\x70\x32\x45\x58\xe0\xd7\xe0\x22\x6f\x8a\x42\x32\x45\x41\x30\x45\x7e\x34\x45\x91\x3f\x45\x61\x38\x45\x41\x3c\x45\x7e\xa2\x01\xfa\x78\x8a\x88\x3f\x45\x38\x9c\xa2\x78\x8a\x50\x44\xa6\x28\x0c\xa6\x28\x80\xab\x05\x74\x40\xc1\x09\x99\x22\x1c\x4c\x51\x24\x00\xf1\x14\x85\xfe\x14\x05\xe1\x14\xf9\xb1\x06\x48\x92\x29\x22\x78\x8a\xb0\x20\x39\x45\x88\xd0\x29\x22\xde\x14\x61\xc1\x8e\x04\x7b\xe7\x90\x2b\x31\xcb\x95\x74\xe5\x2a\xb8\x10\x72\x14\xfd\x26\xe2\xf3\x14\xa1\x50\xe7\x56\x11\x16\xdd\x12\xdc\x02\x43\x9e\xce\xa5\xaf\x04\x27\xb8\x12\x00\xd1\x14\xe9\xdd\xc5\x91\x94\x87\x10\x30\x70\xef\x77\x15\x21\x14\x2a\x04\x2c\xe4\xe7\xc7\x52\xb0\x61\xd8\x93\x57\xe0\x29\x6d\x85\x52\xfb\x81\x4e\x41\xa8\x46\x98\x86\x2f\x54\x1a\x49\xb5\x87\xba\x0e\x85\x0a\x84\x3d\x08\xbb\x10\x3a\x14\x82\xad\xb3\x9a\xce\x8d\x50\xe7\xa7\xe7\x73\x06\xd7\xa4\x88\xa4\x72\x3d\x2b\x8b\xc1\x0d\x4f\xe0\x05\x3f\x1c\xff\xf2\xea\xc9\x0f\x8f\xe5\x9d\x52\x42\x62\x64\x8a\xa0\xf3\x42\x42\x54\x58\xa4\x52\x13\x48\x57\x59\x2a\x56\xea\x24\xca\x7a\x41\x20\x54\xa7\xff\xea\xbb\xe7\x6f\xf8\x1a\xb1\x45\xae\x6a\xa3\x9f\x81\x4a\xe5\x7d\x1a\x06\x3e\x04\xfc\x2f\x2f\xba\xfa\xec\xa5\x94\xde\xa5\x77\x0f\x5e\x46\x28\xf1\xbc\x69\xff\x59\xfd\xae\x20\x41\x0c\x00\xa4\x03\x40\x3d\x8f\x0c\x40\x7c\x0d\x64\xf8\x34\xd0\x9f\x1a\x08\x84\x5d\x02\xc4\x40\x20\xea\x32\x69\x02\x89\x7b\xfd\x30\x10\xa2\x1d\x46\x86\x28\x92\x3e\x95\x21\x0a\xa6\x83\x98\x00\xd2\xbe\xb4\x86\x20\x59\x8f\xcc\x00\x20\xef\x77\x65\x08\xc2\x35\x90\x21\x85\xa2\xcb\xe5\xb0\x39\x75\xb5\xc6\x74\x54\x1f\x84\x8e\x10\xf0\xe9\x88\x55\x05\x7d\x22\x06\xbb\xa0\x6e\xbb\x89\xe8\xa8\x61\xc6\xd4\x65\x98\x94\x8e\xea\x3b\xa1\x23\xfa\x66\x7d\x26\x0c\x26\xd1\x27\x33\xe4\x24\xa3\xa3\x1a\xcf\xe9\x88\xd5\x70\xea\xb6\xee\xa2\x4f\xc3\xa0\x79\xab\xba\x54\x94\xc0\x66\x41\x12\xed\xa9\x45\x99\x7e\x07\xc4\x48\x3d\xe8\x62\x31\xf5\x31\xd4\x41\x8c\x36\xa1\xf3\x69\x78\x1e\x77\xd9\x70\xf8\x06\x76\x98\x7f\xd2\xe7\xd4\x1a\x28\xb0\x43\xa3\x69\xb7\x33\x06\xab\xe8\x74\xc6\x1a\x27\xb0\xc3\x7e\x79\x0f\xc4\x16\x2a\xb0\x39\x14\xd0\x51\x51\x60\x3a\x2a\x0a\x42\x47\x55\xef\x53\xb7\xda\x82\x1e\x0a\x5b\xac\x70\x89\x3b\xa2\x2e\x13\x8e\xe9\x88\x32\x28\x1d\x91\x64\x42\x47\x4d\x8b\x51\xb7\x42\xd3\xbe\xbc\x0d\x83\x47\x9f\xca\x10\x24\xa7\x2e\x95\x72\x3a\xe2\x42\x45\x5f\xa3\xfa\x1d\x55\xd3\xb1\x2c\x23\xf0\x3c\x1a\x78\xd8\x1a\x41\x14\x8c\x35\xcd\x68\x14\x68\x8b\x20\x35\x11\xcf\x44\x24\xe8\x12\x31\xc2\x84\x5d\x3c\x46\x66\xa2\x2e\x1e\x23\x4c\xdc\xc2\x18\xa8\xe8\xc1\xd6\xd8\x3c\xe9\x93\x30\x20\x61\xfd\xee\xd8\x13\x0e\x45\xc8\x80\x24\xeb\x08\xd6\x00\x90\xb7\x00\xd6\x00\x22\x59\x30\x34\x2e\xfa\x5a\xb1\xe6\x5d\x4e\x61\x62\x3a\xd2\x0b\x42\x5d\xd2\xf6\xfb\x24\x4c\xb6\x41\x7b\x7a\x37\xd9\x06\x1d\x17\x78\x44\x47\x0c\x35\xa6\xe3\x86\x4a\xe9\x88\x52\x12\xea\x50\x0a\xa3\x6e\x5f\x4a\xfb\x1c\xd8\x03\x89\xd3\x55\x72\x3a\x62\xc4\xbc\x2f\x53\x7b\x3c\xb1\x5a\x90\xfe\x02\x62\x78\x8a\x37\x70\x7b\x4c\x36\x70\x26\xec\x6f\xe0\xf8\x38\xd8\xc0\x9e\x71\xe8\x74\x7d\x1c\x8d\xb9\x24\x8e\x47\x82\xa1\x9e\x82\x9b\x31\x24\x63\xe1\x12\xb3\x31\xbf\xc7\xe9\x06\xd1\x12\x67\x63\x81\x0c\xe7\x1b\x04\x4b\xcc\x37\x08\x65\xb8\xe8\x6b\xc8\x68\x2e\x63\xa1\x02\xe3\x31\x0f\xc5\x64\x03\x07\xc1\xfe\x88\x97\xe1\x60\x93\xc0\x16\x6e\x10\x76\x70\xe4\x8c\x6e\x38\xde\x20\x2c\x61\xba\x81\x2f\xe2\x64\x03\xaf\xc7\x6c\x83\x68\x8a\xd3\xb1\x08\x86\x33\x57\x08\xc3\xf9\x58\x58\xe0\x1b\x84\x51\x5c\xf4\x22\xd4\x36\xa9\x0a\xf6\x02\x4b\x30\x32\xb3\x4c\x3a\x52\xc1\xd6\x14\x45\xe2\x36\x61\x0f\xb4\xe7\x9e\xe1\x79\xd8\x53\xce\x10\x22\xea\x08\xcd\x44\x23\xee\x40\x8c\x0f\xc7\xf6\xdc\xa4\xa5\x62\xcb\x4c\xea\x9e\xda\xb2\x92\x96\x8b\x21\x9f\x59\x4f\x9a\x43\x88\xbc\x23\x2d\x5b\x6a\x02\x18\x2c\x69\x89\x6a\x6b\x96\x80\xab\x7b\x98\x8e\xb1\x4f\xa8\xdd\x50\x7c\x3a\x66\x28\x01\x1d\x53\x74\x48\xdd\x9d\x8f\xa8\xdb\x94\x62\xed\xf9\xf0\x29\xa5\x76\xd1\x25\xd4\x25\x3a\x46\xc7\xcc\x2b\xa5\x6e\x27\xc8\xa8\xdb\x74\x72\x3a\x66\x18\x9c\x8e\x39\x41\x41\xc7\x4c\xbc\x93\x56\x58\x8c\x00\x8f\xb8\x2b\x26\x23\x16\x8a\xfd\xd1\x90\x81\x03\xa7\xa5\xe2\x70\xd4\xe1\x71\x34\x1a\x35\x70\xec\x8a\xc4\x74\xd4\x13\x71\x32\x1a\x32\x30\x73\x78\x23\x4e\x47\xc2\x05\xce\x46\xa3\x16\xd6\xc3\x81\x81\x04\x1f\x89\xbd\xb8\x18\x0d\x49\x2a\xb5\x70\x76\x13\x3b\xfd\x0a\x93\xf1\xd0\xe2\x3b\x22\x07\x0e\x46\xdc\x1a\x87\xa3\xb1\x05\x47\x4e\x07\xc6\xf1\x68\x6c\xc3\x74\x24\xf8\xe0\x64\xd4\x03\x31\x1b\x09\x03\x38\x1d\x8d\x81\x38\x1b\x0d\x05\x38\x1f\x8d\x47\x98\x3b\x82\x1d\x2e\xba\xd1\x68\x9b\xfc\x81\x7a\x92\xa4\x39\xb6\xd4\xd9\x27\xf6\x02\x4b\x2a\x51\x33\x6d\x78\xee\xb7\x18\x02\xb3\x21\x06\x76\x23\x0a\xbb\x12\x31\xe7\x10\x4d\x72\x6c\x22\x1f\x7b\x9d\xf4\xcf\x3e\x7e\xd6\x2b\x2a\xe6\x0c\xa2\xd5\xad\x39\x7f\x90\xcf\xcd\xb9\x43\x2b\x3e\xdb\x0a\x4a\x2b\x1e\x03\x8e\x5c\xf3\x52\x4b\xe6\x50\x9b\xb7\x39\x77\x68\x15\x6c\xe9\xbf\x53\xbf\x98\xda\xbb\x47\xe8\x18\xf3\x3e\x1d\x13\x40\x40\xdd\x2a\x0e\xe9\x58\x17\x22\x6a\xb5\x9f\x98\x8e\x19\x1f\xa5\x2e\xf9\x25\x5d\xe2\xb6\x24\xc2\x61\x1d\x29\x75\x69\x2f\xa3\x63\xd6\x97\x53\xb7\xfd\x72\xea\x76\xbf\x82\x8e\x79\x08\xf6\x46\x5c\x04\xe3\x11\x2f\xc4\x64\xd4\x0d\xb1\xef\x1a\x29\x9c\x16\x8e\xc3\x51\x17\xc1\x91\x37\xa6\x27\x1c\x8f\x46\x32\x4c\x47\xbd\x05\x27\xa3\xe1\x02\xb3\xd1\x80\x87\xd3\x91\x98\x89\xb3\xd1\xb8\x81\xf3\x91\xb0\x84\xb9\x23\x2e\xe1\xc2\x19\x36\x64\xf6\xe0\xee\x03\x1e\xf5\x4b\x4c\xec\x8e\x89\xfd\x11\xb7\xc7\xc1\x88\xe1\xe3\x70\xd4\x77\x70\x34\x1e\xdd\x62\x47\x78\xc3\x74\xdc\x79\x12\x67\xfc\xc0\x6c\x34\xfe\xe1\x74\x34\x88\xe2\xcc\x19\x44\x70\x3e\x1a\xa5\x30\x1f\x09\x53\xb8\xe8\xc6\x91\xed\x92\x07\x63\x4c\xa9\xf9\xb5\xad\x90\x34\xdc\x18\x53\x86\x7b\xda\x76\x0d\x63\xc6\xa0\x00\x60\x3e\xc5\x98\x37\x34\x39\x9f\xe1\x79\x54\x23\xb0\x01\xc4\x2d\x83\x86\xa7\xba\xce\x6d\x29\x43\xcb\x9f\x25\x67\x68\x7b\x68\xa0\x90\xb6\x0c\x9a\x59\xc8\x3a\x00\xa6\x81\xc3\xea\x7b\x5c\x57\x8e\x01\x75\xd1\x11\x8e\x79\xce\xc1\xd5\x1e\xd3\x11\xe1\x12\xea\xd9\x0c\xc7\xa7\x6e\xc3\x09\xa8\xcb\x70\x42\x3a\x62\x17\x11\x1d\x91\x5a\x4c\x47\x4c\x8f\xd2\x11\xd5\x26\xd4\x26\x77\x46\x47\x74\x9a\x52\xb7\xd5\x66\x74\xc4\x6a\x72\x3a\xa2\x39\x4e\xdd\x86\x5b\x50\x97\xd9\x63\xcf\xe9\xb6\x18\x7b\x56\xbd\x62\x32\xe6\xd3\xd8\x1f\xf3\x49\x1c\x8c\x78\x35\x0e\xc7\x9c\x02\x47\x63\x91\x03\xc7\x23\xbe\xdd\x8c\x7b\x56\x35\xe2\x64\xcc\x81\x30\x1b\x89\x8f\x38\x1d\x8b\x20\x38\x73\x46\x28\x9c\x8f\x45\x18\xcc\xed\x83\x73\x31\x12\x21\x20\x3f\x70\xeb\x0a\x8f\x58\x1a\x26\x23\x9e\x8e\xfd\x31\x67\xc6\xc1\x98\xb3\xe2\x70\x2c\x54\x45\xf6\x50\x84\xe3\xb1\x60\x81\xa9\xdb\x5d\x92\x31\x87\xc7\xcc\x1a\x2c\x70\x3a\xe6\xcb\x38\x1b\x09\x17\x38\x77\x06\x4b\xcc\xc7\x42\x19\x2e\x7a\x01\x67\x9b\xac\x40\xb1\x4d\x4d\x51\xa4\xc6\x69\xca\x0b\x64\x5b\x62\xee\xb3\xdf\x3e\x27\x26\xdc\x41\x2b\x11\x23\xfe\x50\xef\x8f\x29\x2b\x68\x9e\x0e\x71\xc7\x1d\x83\xb6\x8e\x8a\xc6\x6c\x40\x63\x6a\x88\x98\xd5\x64\x8d\x2c\xa7\xca\x40\x4d\x19\x80\x26\xab\xe1\xf3\x5c\x43\x3b\x7c\xca\x9b\xbe\x0e\x9f\x15\x1d\x29\x9b\x7a\xea\x54\x12\xa6\x6e\x25\x11\x6a\xe9\x91\x4f\x5d\xda\x09\xa8\xab\x3f\x21\x75\x5b\x5d\x44\xdd\x96\x11\x53\xbb\x3c\x28\x75\xd9\x45\x42\xed\xf6\xcc\xa8\x5b\xf5\x29\x75\xeb\x30\xa3\x16\x9b\xca\xa9\x5b\x45\x9c\xba\x6c\xaa\xa0\x6e\x53\xc6\xde\x88\x1f\x61\x3c\x62\x7c\x98\x8c\x78\x2a\xf6\x1d\x06\x88\x03\xa7\x9f\xe2\x70\xc4\x15\x71\xe4\x8d\xc4\xa0\xd8\xe9\x73\x4d\x06\x6b\xe1\x3d\xb1\x46\x6d\x66\xf3\x56\x9c\x8e\x84\x36\x9c\x39\xe2\x22\xce\x47\x62\x08\xe6\x23\x3e\x8b\x0b\x67\x70\x13\x23\xba\x85\x71\xec\x34\x25\x4c\x9c\x4e\x8b\xfd\x11\xbf\xc4\xc1\x88\x63\xe2\xd0\xe1\x99\x38\x1a\x89\x35\x38\x1e\x0d\x56\x23\x9e\x84\x93\x11\x1f\xc5\xcc\x11\x00\x70\xea\x8c\x5a\x38\x73\x86\x16\x9c\xdb\xfc\x1f\xf3\x31\x17\x2e\xba\xa1\x67\xfb\xa1\xdb\x60\x23\x35\xab\x81\x87\x0d\x43\xb7\x4a\x35\x0c\x83\xb6\x42\x6a\x6a\x16\x34\x49\x8e\xe9\x69\x68\xe9\x7e\x24\x51\x1a\xc6\xe8\x36\x65\x1a\x3e\xa5\x5a\x07\x4c\xc3\x74\xd3\xf7\x61\x53\xa6\x19\xf9\xf0\x69\xaa\x75\xc2\xf4\xaa\xae\xe5\x71\x86\x61\x5a\xca\x6d\x88\x95\xb7\x72\x33\xbd\xa4\x6b\x99\xef\xb0\xa7\x2e\x31\x60\x6a\x16\x2a\xa1\x2e\xfd\xfa\xd4\xd5\xc7\x80\x3a\x0c\x27\xa4\x2e\xe1\x45\xd4\xd5\x93\x98\xda\xc4\x43\xa9\xc3\xac\x12\xea\x52\x35\xa3\x2e\x8d\xa4\xd4\x61\x08\x19\xb5\x99\x79\x4e\x5d\x96\xcc\xa9\xd9\x62\x0b\xea\x50\x32\xf6\x9c\x5a\xc6\xd8\xe9\xae\xc4\xe9\xaf\xd8\x77\xfa\x0a\x0e\x5c\xee\x80\x43\xa7\x2b\xe1\xc8\xe9\x10\x38\x76\x45\x04\x35\xde\x18\x1f\x25\xce\x68\x81\x99\xcb\x63\x70\x6a\x09\x1a\x38\xb3\x05\xd9\xdc\xe9\xb9\x98\x3b\x83\x02\x2e\xac\x11\x11\x7b\x4e\xad\x63\xa7\x23\x62\xe2\xf6\x6e\xdf\x62\x69\x38\x70\x3a\x1a\x0e\x5d\x2e\x8c\x23\xab\x1f\xe2\xd8\x19\x19\x30\x75\x7a\x3f\x4e\x9c\xbe\x88\x99\x25\x58\xe1\xd4\xe9\x6e\x38\x73\x45\x07\x9c\x5b\xbd\x18\x73\x67\xe4\xc0\x85\x16\x1c\xb6\x19\x53\xa9\x18\xe0\x89\x01\x61\x23\x9c\x61\x3c\xbe\xd7\x2e\x6e\x0c\xc3\xb1\x6c\x37\x0c\xc4\x0a\x9f\xe1\x51\x28\xf1\x11\x23\x1f\x51\xf3\xd0\x14\x84\x15\x27\xe6\x71\x86\x7a\x66\xfe\x93\xa6\xdf\xa6\x10\x2c\xf9\x34\x3d\x4a\x1b\xa4\x06\x3e\xb3\x7b\xf2\xb0\xc7\x30\xfc\x9a\xed\x84\x37\x42\x34\xb4\x29\x14\x13\x86\x47\xf5\xa2\x92\xb5\xe7\xf2\x31\x76\xc9\x54\xc1\x10\x97\xfe\x15\x8c\xef\xd2\xb5\xfa\x3d\x70\x09\x5b\xc1\x84\x76\xb1\x2a\x88\x68\xb4\xcf\xb1\xc5\xb4\xd4\x63\xea\x92\xa8\x82\x49\x6c\x5a\x52\xcf\x99\xdd\x4a\x15\x44\xea\xb2\x47\x05\x93\x99\x55\xae\x9e\xe6\x2e\x33\x52\x30\xdc\x65\xa2\x0a\xa6\xb0\x7b\x68\x9d\x11\x1b\x1d\x1b\xbb\x7a\x80\x89\x45\xc8\xd8\xb7\x59\x1c\x0e\x5c\xcc\xe2\xd0\xa5\x16\x1c\xb9\x84\x81\x63\x47\x17\x6d\xf1\x37\xb1\xab\x10\x33\x97\xa5\xe2\xd4\x19\x0f\x33\x97\x47\xe1\xdc\x6e\xdf\x98\xdb\x8c\x0e\x17\xe3\xde\xd5\xbe\xdc\x58\x21\xb0\x3b\x16\x60\x32\x6e\x70\xd8\x1f\xf3\x3e\x1c\x38\xbd\x0f\x87\xe3\x41\xa0\x56\xb6\xb3\xbb\xf1\x78\x50\xc2\x74\x3c\xb8\xe1\x64\x3c\x1a\xd4\xe6\xe0\xf2\x32\x69\x14\xd6\xa7\xd9\x58\x58\x93\x86\xe1\xe0\x93\x8f\x45\x9c\xda\x48\x80\x8a\x36\xb2\xcb\x8f\x7a\x5d\x83\x67\x6c\xfd\x61\x8d\xaa\x19\xab\xd0\x9a\xcf\x79\x56\x41\x3d\xa2\x57\xdf\x3d\x7f\x83\xca\xc5\x59\x7d\x4d\x44\x53\xd1\xe0\xd9\xc3\x57\xbd\x8b\x8b\xdb\x83\x89\x53\xd4\x6e\xfc\x87\x0b\x14\xd5\x17\xf8\xac\xbe\x4c\xf5\x86\x9e\xfa\x55\x02\xc8\x2f\xf5\x67\xf1\x65\xaa\xf5\xa7\xcf\xb9\x56\x55\xe9\xfb\x47\xaf\x64\x61\x2c\x24\x0b\xbf\xb8\xef\xa8\x12\xd0\xcd\x05\x55\xf2\x8b\x56\x25\xe5\xba\x57\x54\xb9\x4b\xeb\x7d\xe0\x57\x4d\x09\xb0\x0f\xfc\xca\x50\xfa\xee\x03\xbf\xaa\xeb\xea\x7d\xe0\x57\xe6\xb2\x7a\x82\x86\x54\x51\x18\xa1\xb4\xac\xd6\x88\x65\xd9\x72\x95\x97\x8b\x13\x54\x2d\xd1\x8b\x23\x6c\xc4\xfb\x5d\x09\xa5\x80\xde\xf6\x6b\x20\x9b\xee\x0e\x09\x23\xfb\xdd\x21\x2d\xba\x17\x4b\x81\xf0\xc5\x11\x7e\x5b\xbe\x43\x7b\x08\x1b\x6a\x94\x2a\xba\xb2\x3c\xff\xa4\xee\xdd\xdb\xb6\xbd\x2a\xc7\x27\xfe\x33\xf1\x31\xda\xd3\x50\x43\x1d\xbe\x1d\x74\x7b\x80\xd8\x50\xb0\xf4\xe1\x7a\xcd\x4f\xd3\x39\x47\x38\x42\xeb\xf3\xf4\x03\xbf\x32\x88\x7f\x7d\x9e\xfe\xc8\xaf\xd6\x8d\x0a\xda\xef\x76\xa1\x2c\x5e\x01\x90\x14\x4d\xfd\xe5\x01\xc2\x51\xf3\xcd\x7e\xc5\xca\x11\x54\x9c\x52\xfc\x98\x05\xb9\xae\xb1\x2b\x5e\xde\x2a\xa4\xef\x14\x53\x46\xbc\xee\xab\x5b\xd2\xb2\x7a\x05\x55\x51\x0e\xb5\x22\x28\x0d\x5e\x1b\x4a\x69\x50\x01\x35\x1a\x14\x19\xb6\x31\x59\x0d\x09\xec\x56\xd3\xa5\x53\xac\x96\xa7\x10\x60\xe6\xbc\xa8\x10\xa1\xe0\x19\x82\xb2\xb9\xa1\x14\xce\xdb\x49\x89\x0e\xe4\xdd\x10\x1e\x14\x70\xac\x8d\x6b\x32\x79\x71\x44\x94\x0d\xee\xa0\xdd\x46\x02\x3b\xe8\x2f\x88\xd0\x77\x50\xe3\x11\x6c\xab\x44\x7f\x81\x3b\x2e\x36\x66\x6f\x55\x9e\xcc\x36\xe7\x2f\x80\xf2\x9d\x2d\x93\x3b\x1d\x2e\x09\x85\xc7\x92\x57\xb4\x8b\x48\x60\x61\x78\xc7\xc0\xf1\x80\xac\xa9\xb2\xbf\xe8\x40\xb9\xc8\x38\xe2\x2c\x9b\x29\xb3\x43\xe5\x1a\xb1\xb3\xb3\x79\xc9\x73\xa1\x4b\xb6\x40\xfc\xf2\x8c\x2d\x72\x9e\xd7\x75\x19\x21\xbc\x4f\x8d\xd8\x84\x08\x14\x9a\x8c\x2d\x50\xca\x51\xba\x5a\x7e\xe0\x0b\x54\x2e\xaa\x25\xa2\xb2\x28\xf0\x1a\xad\x33\x36\x97\xe8\x25\xca\xb5\x19\xdb\xc5\xac\xcc\x66\x88\xcd\xe7\xcb\x8b\x35\xa0\x16\x78\xab\xa5\x40\x7b\xbe\xe6\x39\xba\x28\xab\xd9\xf2\xbc\x92\x0c\xae\xcb\xe5\x62\x88\x45\x09\x1a\xca\x6b\x4e\xda\x2f\x0f\x1e\xa8\x6b\x65\xda\x9f\x44\x40\xf1\xb1\x49\x72\x1d\xcb\xc5\xd2\x72\x63\xb7\xe1\x2a\xb4\x10\xc4\xda\xcf\x10\xb3\x26\xa5\x54\xe2\x5d\x24\xb4\xef\x9b\x55\x65\xeb\x47\xac\xf7\x23\x7e\xa7\x0a\x7b\xfe\xa6\xff\x04\x97\x02\x0c\xae\xda\x31\x44\xc0\x23\x59\xf8\x12\x95\x8b\x8f\x7c\xb5\xe6\xf6\x28\x58\x2e\x3e\xbe\xea\x05\xc2\xce\x4f\x1b\x0d\x10\xd8\x31\x40\xb4\xd8\x74\x89\xad\xdf\xe2\x50\x18\x74\x1f\xfb\xa7\xce\x84\x43\xfb\x85\x2f\xb2\xd5\xd5\x59\xb5\xc5\x55\x80\xaa\x62\xed\xf2\xa8\x69\xd7\x02\x4f\xbb\x21\xdf\x5a\x42\x37\xe7\x5f\x82\x6a\x2b\x11\x57\xed\xde\x23\x37\xe5\x69\x2d\x48\x53\xd2\xf1\x1f\xbc\xd2\xf3\xb4\x2e\x73\x73\x40\xaa\x5d\x8d\xd5\xd7\x81\x04\x5b\xf5\xc1\xe0\xe6\x2c\x43\xf6\xf1\xc3\xa2\xac\x4a\x36\xd7\x4b\x5f\x75\x61\xf8\x65\x36\x63\x8b\x13\xfe\xf4\x65\x5b\x16\x55\x56\x1e\xf3\x2e\xbd\x42\xfe\xaf\x6f\xd2\xe6\x36\xf2\x7e\x6a\x78\x63\x2d\x0a\x6b\x9b\x97\x4f\xf5\x36\x04\xe8\xf8\xea\x6f\xb3\x36\x54\xf2\xe6\x15\x85\xf8\xff\x86\xbc\x41\x9b\x50\xfd\x19\x2b\xd3\xba\xae\x6a\x93\xe5\xc3\xc0\xa3\xe4\x47\xe9\x55\xf0\x79\xfc\xda\x36\xc3\x48\x64\xcc\x27\x00\x9d\xed\xda\x8b\xc6\x30\x74\x3b\xb1\xc0\xae\xba\xb0\x2b\x05\x6b\x64\xf2\x31\x2f\xd7\x15\x9f\x37\x56\x6c\xc6\x58\x40\xe7\x37\x4b\x2d\xa8\x3b\x40\x17\x62\xa0\x95\xa5\xd6\xde\x96\xef\xde\x4e\x26\x8a\xdb\xf7\x6d\xb8\x16\x89\x64\xf3\xea\x02\xdf\xa1\xac\xb6\x49\x34\x86\x80\xdd\x73\xa4\x95\x4d\x52\x3d\x4f\x9a\xd7\x6c\x14\xe3\x01\xfc\xe7\x45\xbe\x44\xeb\x0b\x76\x26\xd3\x8f\x39\x5b\x57\xd2\x18\x86\x21\xbc\x72\xab\xac\xc7\x6c\x57\x61\x2e\xc7\xaf\x0c\x36\x0c\x15\xc5\xb7\x75\xf5\x81\x6b\xdc\x98\x0b\x5e\xc7\xd5\xaf\x13\x52\x46\x42\x97\xe1\x8d\xac\x42\xcb\xf3\x6a\x10\x81\x9b\x90\xeb\x56\x59\x27\xe4\xda\x75\xd6\x19\x32\x3e\xf0\x2b\x59\x02\x3a\x0a\x0e\x7c\xa2\x3f\x29\x3f\x5a\x1e\x68\x75\xa3\x23\x63\xd5\xe8\x03\xf4\x4a\x58\xa0\x7a\x09\x58\x2d\xd7\xeb\x36\x4d\x87\x9a\x87\x90\x10\xc3\x6b\xa9\x6c\xd1\x0c\x54\xad\xe0\x26\xf5\x78\x75\xca\xd6\x1f\x3a\x2e\x5b\xdb\xee\x64\xd2\x31\x51\xe1\x88\xf5\xe8\xfa\xbe\xd3\x75\xe1\xb4\x02\x8b\x26\x82\x8e\xc9\xbe\x07\x9b\xfd\xc6\x68\xf8\xe2\x99\xc8\xa8\x24\x66\x05\x55\xfb\xdd\x80\xed\x97\x4f\x37\x67\x7b\x65\x67\x7b\xee\x66\x7b\xee\x60\x7b\xb5\x01\xdb\xce\x22\xd2\xeb\xba\x8a\xb4\x9c\xfe\xd8\xac\x8e\xf4\x58\x11\x66\x89\xab\xe2\x97\x95\x5e\x8a\xf9\xfb\x47\xaf\xf6\x55\x82\xd6\xa9\xc5\x3c\x45\x59\x71\x62\x28\xae\x7d\x36\x67\x82\x89\xcb\x0a\xf5\xb1\xa8\x84\x6b\xd2\xd2\x31\x21\x6a\x2a\x3b\x0f\x27\x6a\xba\x45\xb7\xbf\x7f\xf4\xca\x58\x71\xfb\x78\x55\x9e\xcd\xf9\xde\x76\x53\x44\xb2\x51\x67\xa2\x48\xff\xe9\x8f\x33\x5d\xa4\x26\x22\x04\xdb\x25\x54\x28\xcd\xfa\xd7\x03\xa9\x2c\x96\xaf\x31\x3a\x14\x70\xfb\x52\xaa\x8f\xa4\x8e\x97\xab\x49\x7b\xcf\xba\xba\x38\xbe\x26\xbd\xbf\x9e\x97\x19\x9f\x78\x53\x44\x76\x06\x77\x61\x34\x68\xc9\x35\xd1\x92\x29\x0a\x1c\x68\xfd\x6b\xa2\x0d\xa6\x28\xda\xb1\x5f\xa4\x71\xed\x77\x0f\xbe\xc6\xfb\x7a\x63\xad\x85\x55\x32\xfb\xfa\x3b\xc7\x06\x0d\xfc\x0d\x28\xdc\xcc\x3b\x8d\xa0\xb5\x25\x73\x64\xdb\xee\xe3\x0d\x28\x98\x47\x3d\x9c\x90\x1b\x1b\xf6\xfe\x49\xc2\x6a\x13\x5d\x6e\x20\xb8\xb6\xb8\xb6\x0c\xb1\xb6\x10\xd7\x0d\xb4\x0d\x94\xb3\x7e\x7e\x03\xd5\x2b\xa1\xaf\x15\x66\xbf\x17\x92\x69\xaf\xaa\xbe\x56\xdc\xfd\x5e\x18\x4c\xdb\xaa\xee\xf7\xc2\x68\xaa\x8a\xbd\xdf\x8b\xf0\xa7\x77\x53\x1a\x7c\x56\xc1\xfd\xdf\xb3\xd2\xfe\x17\xab\x87\xff\xdf\x53\xd9\x1e\x6e\x2a\x28\x17\x3c\xbf\xd9\x12\xf7\xdf\xb1\x35\x6f\xab\xd6\xb3\x35\xd7\x9e\xbd\xf1\x89\xb3\x02\xfe\xd0\x97\x2f\xa3\x00\x2d\xd8\x29\x5f\x9f\xe9\x5e\x7a\xa0\xb3\x21\x40\x04\x1b\xf2\xbf\x7f\xff\x64\x42\xf3\x10\x45\x41\x73\x85\x8d\x09\xcd\x9b\x28\x10\x7c\x00\x53\x97\x51\xb0\xaf\xbe\x08\xfe\x0d\x99\x41\x8b\x5a\xa2\x57\xd3\x29\xe5\xdf\xf8\x1a\x31\xb4\xe0\x17\xf3\x2b\x24\x7d\x2d\x37\x11\xd6\x03\x0a\xea\xdc\xe6\xb1\x38\x3f\x4d\xf9\xea\x13\x82\x5b\xa5\xe0\x56\x15\xf1\xc1\x27\x90\xce\xef\x3b\x9b\xcc\x97\x17\xd0\x42\xfc\xd7\xd4\xa0\xdb\xb8\x1b\xdd\x86\x00\xb5\x5c\x2e\x5b\xb9\xd4\x11\xa1\x16\x4f\x3d\x30\xcb\xd5\x3f\x8f\x78\x3e\xbc\x95\x05\x5e\xe8\x45\x5e\x77\xbe\xb3\x96\x34\x84\xf8\x45\xd9\xc9\xa8\x44\x0f\xa7\x82\x6b\xf3\x18\xa6\xee\xd7\x32\xdc\xea\x09\x8f\x45\x6f\x0f\x51\xf7\xf6\x6d\xfd\xcd\xbc\xaf\xa9\xef\xca\xea\xa2\x5c\x73\xf4\xd3\xf3\xe3\x35\x60\x18\x53\x4c\x7d\x51\x8a\x32\x90\x4f\xe8\xa1\xd0\xaf\x90\xcb\x1e\x08\x46\x8d\x24\xac\xa8\xf8\x0a\x2d\xf8\x09\xab\xca\xc5\xc9\x0d\x08\x1e\x50\x71\x21\x78\xa5\x82\xfd\xc5\xb2\x9a\x58\xa5\x7a\x70\x80\x16\xcb\xd1\x4c\x15\xee\x64\x91\x02\xfd\x47\x23\xdd\xfb\x46\x30\x29\xd8\x7f\xd4\x42\x36\xa4\xa4\x4a\x32\x4a\x30\xb5\x35\xb4\xea\xbc\xdf\xe1\xae\x93\x01\xd8\xb4\xf2\xf0\xa7\xef\x35\xad\xc0\x72\x02\x8c\xdb\x67\x6c\x0d\xcb\x0b\x1b\xf9\x50\xa3\x29\xc0\x21\x5c\xa2\x51\x56\xb5\x14\x24\x6a\xbc\x37\xac\xfc\x87\x3f\x7d\x7f\x33\xaa\x97\x6b\x3b\xad\xe2\xd9\x22\x9f\xb0\xc5\xb2\x9a\xf1\x95\x62\xc4\x65\x06\x6c\x91\xeb\x66\x20\x7a\x38\x62\x0a\xad\x9f\xdd\x96\x02\x19\xb3\x8a\xc6\xf3\x14\xfc\xef\x66\x1f\xcf\x5f\x7e\x69\xf3\x78\xfe\xf2\x0b\x59\xc7\xf3\x97\x37\x63\x1c\xcb\x55\xc7\x36\x96\xab\x2d\x4c\x63\xb9\xba\xb6\x65\xfc\xb6\xa5\x65\xfc\xf6\x3b\x5b\xc6\x9b\x2f\x6f\x1a\x6f\xbe\x98\x6d\xbc\xb9\x29\xe3\xb8\xec\x59\xc7\xe5\x56\xe6\x71\xf9\x19\xf6\xf1\x7e\x4b\xfb\x78\xff\x3b\xd9\x07\x2c\xca\xeb\x96\xb1\x90\x33\xa3\xea\x85\x70\xce\x8b\x6a\xf3\xac\x6c\x01\x36\x21\xbf\xa1\x65\xd1\x60\x82\x2b\x6c\x6e\xca\x18\x00\xd9\xcd\x98\x03\xa0\xea\x18\x04\xfc\xf2\x74\x42\x42\x97\x1d\x48\x20\xdd\x14\x16\x26\x3b\x10\xaf\x40\x0b\xf4\x00\xf9\xc4\xb6\xd2\xa5\x59\xca\xa4\x35\x95\x07\x0f\xd0\x02\x96\xc8\x1b\x63\x90\x5b\x87\x08\xda\x43\x0b\xe3\x65\xf5\x66\x13\x12\x78\x86\xb6\xf6\x09\xd5\x2f\x4f\x6e\x86\x74\x34\x93\x05\xda\x33\xdc\x18\x3a\x20\xdd\x5f\xea\x12\xe4\xfe\x3b\xad\x17\xa6\xf2\xff\xed\xcc\xf7\xe5\xc4\xfe\x72\x51\x5b\xef\xcb\x1b\xb2\x5e\xa9\xf7\xae\xa5\x6a\xc6\x5b\xdb\xf3\x06\xc6\x3b\x88\x98\x80\xea\x1a\xf6\xab\x79\x41\x83\x67\xdc\x80\x15\xf9\xdf\xdd\x82\x5f\x2e\x2b\x56\xf1\x2f\x1d\x80\x57\x40\xe5\xa6\x4c\x18\xb0\xdd\x8c\x09\x4b\xc6\x74\x13\x5e\x2d\x47\xe3\xaf\x00\x19\xb5\x5f\xd5\x23\xb0\x03\x15\xd5\x17\x3b\x22\x1d\x6c\x7f\x79\x39\x89\x82\x81\x59\x7e\xae\xc2\x6e\x28\xe6\xfc\xb1\x34\x36\x12\x72\x04\xc4\xf6\x0a\x7b\x39\x50\xd8\xd3\xeb\x28\xec\x61\x9e\x7f\xe9\xcc\x97\xe5\xf9\x17\xca\x7c\xe5\x95\xdf\x37\xf1\xce\x9c\xf7\xde\x99\xf3\xad\xde\x99\xf3\x8d\xdf\x99\xfb\x23\xc2\x6e\x93\xc8\xc2\x86\x51\x73\xf2\x9b\xb1\xd5\xea\x4a\x34\xab\xc7\x10\x79\x31\x7c\x67\x58\x69\xaf\x87\x37\xe3\x18\x26\x52\xbb\x6d\xce\x8d\x76\x25\x0d\xc5\xc3\xe7\x46\x74\xf9\xcd\xbc\xba\xf2\x70\xa1\xae\x00\x5f\x16\xfa\xdc\xe6\xda\x74\xc3\xf1\x6a\x79\xc6\x57\xd5\x15\xfa\xbb\xba\x62\x18\x00\xc1\xbc\x1a\x14\x83\x69\x45\x65\x20\xeb\x7d\x13\x9e\x3a\xac\x34\x77\xa2\x77\xa3\xcb\xba\x3c\x59\x94\x45\x99\xb1\x45\x85\x52\x78\x5e\x2e\x34\xdf\x00\xa2\x8e\xd9\xdf\x76\x5e\xba\x66\xa6\xfe\xe5\x06\xe6\x81\x87\x1c\xd8\xdd\xb1\x23\xae\xc9\xf3\x33\x61\x96\x6c\xbe\xd3\x91\xfd\xa8\xe0\x90\x31\x20\x37\x92\xd3\xd0\x6e\x24\x44\xde\x55\xf3\x67\xf8\xea\x85\x2e\xea\x7e\x2f\x3a\x6b\xbe\x5d\x9f\xfd\x4c\x64\x6f\x07\xed\xc5\xdf\xb6\xd3\xda\xd3\x6d\xb1\x60\x8a\x13\xcc\x70\x0a\x67\x6a\x32\x9c\x63\x8e\x8b\x9d\x01\x92\x77\xff\x46\x5d\x9d\x22\xec\x6d\xbc\x3c\x00\x46\x37\x6d\xcc\x76\x10\x96\x2f\xd4\xe6\x09\x08\x8b\xf5\x17\xf9\xdf\xdf\x7e\x33\x1c\xc0\x10\x79\x7f\xe3\x03\x7f\x3a\x44\xc3\x55\x30\xfd\x4f\x8e\xcd\x35\xf8\x61\xc3\x46\x7f\x2f\xa0\x35\x69\xef\x23\x90\x3e\x34\xe7\x8b\x93\x6a\x86\xee\x22\xba\xe1\x56\xea\x7e\xa0\x39\x5a\x2e\x3e\xf2\x55\xfd\x6a\xa8\x85\x61\x15\x1f\xc4\xa0\x5d\x9f\x0e\xd8\x28\xf0\xd4\xa3\x76\xa3\xdd\xce\xca\xdc\x27\x74\xdc\x0d\xa2\x77\xd6\x28\x67\x15\x43\x6c\xbd\x25\x9d\x8d\x67\xb2\xba\x2b\x85\x97\x5a\x80\xde\xaf\x96\x6f\x7c\x62\x5f\x0a\x81\xc7\x9f\xb1\x67\x47\xd1\xea\x1a\x95\x61\xe7\x4e\x0d\xf7\x54\x2a\xb3\x61\xb2\x56\xaf\x69\x17\x8f\x54\x9b\x01\x97\xec\xee\xc6\x9b\xf7\xbb\xb4\xdd\x27\xbd\xda\x25\xbc\xba\xd5\xdb\xc1\x16\x7e\xf1\x57\xf3\xb0\x7f\x76\xbe\x9e\x4d\xea\x44\x4a\xe4\x08\xa6\xf7\x4a\x33\x74\x2f\x97\x40\x86\x7d\xb2\x75\x2a\xa2\x29\xb8\x8e\x20\x35\xce\x69\xd7\x6d\xac\x1b\x49\x06\x5e\x01\x68\x84\x49\x66\xcb\x33\x18\x24\x2d\x63\x3f\x1a\x4d\x5b\x1b\xb3\xe7\x28\x9b\x2f\x17\xae\x37\x95\x4d\x4d\x1a\xf0\xf4\x6d\x19\x7e\xb4\xdb\x32\x3c\x76\xda\xb2\x8e\x19\xb2\x14\xc9\x6e\xb3\xf3\xd5\xb4\xd3\xf5\x08\xe0\xff\x0c\x86\xfd\x67\x29\x99\x21\xd2\x3a\x96\x4a\x7c\xc3\x30\x5b\xef\x1a\xb3\x13\x80\x33\x4c\xf5\xc2\xba\x4c\x4e\x2c\x64\x1a\x17\xba\xe8\xf8\xcf\xa8\x1b\x5c\x6c\xe2\x03\x17\xca\xe4\x6b\xf4\x6f\xcb\x77\x26\xb1\xdb\x4d\x15\x80\x3b\xeb\xcb\x4d\x7a\x6c\xdd\x37\xd3\xdb\x2d\xa3\xb6\xc6\x7c\x7a\x37\xa5\xe1\x26\xfb\x5d\x0e\xee\xfe\x09\xcd\xaa\xea\x6c\x7d\xef\xe0\xe0\xb4\x9a\xad\xf7\x53\x7e\x70\x5e\x15\xf4\xd7\x35\xfa\x48\xf6\xf1\x3e\x41\xe9\x15\xfa\x1f\xa7\xac\x9a\x95\x6c\x2d\x2c\xa6\xdd\x20\x03\xbb\x42\xe4\x66\x8f\x83\x03\xf4\x3d\xaf\xe4\x71\x38\xce\x85\xb8\x4b\x96\xce\xf9\x1a\xfd\x55\x51\xfa\xeb\xad\x6f\x60\x1b\xff\x8a\xf3\x47\xcd\xfe\x97\xc1\x4e\x1a\x74\x47\x2a\xef\x0e\xba\x7d\xbb\xfe\xf9\xbe\x1d\x3d\xfa\xab\xec\x8e\x86\xfc\x19\xfc\xd0\xe2\x3e\x55\xdf\xbb\xa8\xd5\xaf\xb7\x6f\x1b\xf6\xe7\x1c\x76\x98\x6c\x80\x9d\x6c\x9c\xc0\xce\x99\xbf\x4e\xe5\x6e\xfc\x9f\x96\x39\xdf\xff\x75\x8d\x96\x2b\xf4\x9d\xdc\x4a\x53\x16\x25\xcf\x51\xb6\xcc\xf9\x14\xb0\xb0\x45\x8e\xce\xd7\x1c\x95\x95\x18\xd7\xfe\x2a\xe4\xa8\xf5\x41\xed\xc3\x69\xfa\x70\xa2\xbe\x77\xfb\x20\x7f\xbd\x2f\xf7\x24\xb5\xcd\xf6\x1b\xe8\x43\x1d\xd9\x6f\xbf\x69\xdf\xf6\x2f\xca\x45\x2e\xde\x2e\x3b\x30\x72\xeb\x90\xe0\x05\xe9\x3f\xc3\x66\x9f\x5b\xdf\x1c\xdc\xdd\xbb\xb1\xbf\xbb\x07\xb7\x64\x6f\xd7\xd5\xaa\x5c\x9c\x3c\x5e\x2d\x4f\x8f\x66\x6c\x75\xb4\xcc\x85\xe6\x5e\xc1\x8f\xfb\x85\xf6\xab\x12\xfe\x31\xfb\xc0\x17\x52\xc6\x7d\x93\x3d\x3b\x5f\x5c\x09\xf9\xde\xfa\xa6\x89\x60\xe7\xd9\x9a\xe4\x5c\xfc\x38\x91\x74\x64\x07\x61\x69\x13\x36\xdf\xd7\x43\x20\xfc\x94\x2d\xcf\x17\x15\x5f\xa9\x99\x4b\xf8\x69\x5e\xc7\x0a\xd9\xbc\x0d\x16\xf0\x14\xce\x33\xd6\x5f\xf8\x65\xb5\x62\xe2\xcb\xc5\xac\x9c\x73\x34\xa9\xb1\x3d\x50\x48\x24\xe9\x6f\xa0\x4d\x8b\x30\x53\xdd\x7b\x58\xd5\x0d\x76\x77\x85\xab\x7f\x03\x3a\x95\xc0\xdf\x1e\x22\xef\xf2\x7b\xea\x79\x42\xe7\xf2\xa7\x07\xf0\xd3\x77\x8f\x1f\x8b\x9f\x2c\x94\x84\xb8\xe0\x75\x7d\x7d\xbe\x5a\x2d\x4f\x58\xc5\xa7\x60\x75\xd5\x8c\xaf\x38\x9c\xf3\x44\x0b\x7e\x59\x21\xc1\x02\xcb\x2a\xbe\x82\x46\xd0\x8d\x4d\xf8\x03\x06\x27\x12\xfc\x36\xf2\x2e\x1f\x1f\x79\xde\x8e\xb0\x50\xef\xf2\x7b\xf8\xf8\x77\x11\x9c\xe7\xcb\x8b\x96\x3e\x34\xfb\x46\x4a\x5e\x0e\xe5\x13\xd5\x45\x81\xc0\x7f\xfc\x78\x07\x8e\x66\x7a\x3b\x68\x17\x69\x98\xe1\xc1\x6e\x5d\x71\x48\x51\x6f\xb3\x60\xd5\xd5\xf3\xc5\x29\xab\xb2\x19\xcf\x5b\x7a\xf7\xd1\x72\x31\xbf\x42\xec\xec\x8c\x43\xbf\xcb\x35\x38\x20\x3a\x5f\x94\xd5\x54\xbc\x68\x66\x6c\xcd\xe1\x6d\x53\x08\xa2\xc1\xd4\xc0\x08\x21\x55\xf5\xbe\xa8\x06\xab\x18\xea\x99\xf6\xf5\x8c\x95\xab\x61\xcf\xa0\x5f\x8a\xd7\x6f\x94\xe8\xf6\xf6\x14\xef\xb7\xfa\x1d\xb0\xb4\x14\x80\xe2\xff\x2a\xde\x4b\xa8\xda\x1b\xaf\xe3\x0c\x7c\x01\xce\x00\xa3\x70\xeb\x0b\x8d\x95\xcb\xbc\xa5\x6b\xe4\xe5\x22\xe7\x97\xe8\x10\xed\x61\xa3\xd9\x37\x7e\x74\xe7\x8e\x66\xfc\xbb\xbb\xb2\x99\xc5\xf8\x81\xce\x5b\x00\x79\xd7\x37\x76\x61\x4a\x8f\x85\xc6\xa5\x64\xe4\xaf\x7b\x87\xb5\xfa\xef\x6b\xf2\x42\xbb\x87\x86\xf8\x51\x23\xfa\xf6\x5b\x84\xbd\xda\x80\xd0\x6f\xca\x87\x94\x4a\x6a\x4e\xa4\xb1\xa2\xdf\x50\xc7\x0e\x1b\xe1\x6f\x40\x08\x10\xda\x94\xd4\x08\x3f\x9b\xf1\xec\xc3\xab\x8c\xcd\xd9\xea\x7f\x89\x56\x13\xa1\x87\x17\xcb\x72\x21\x77\x53\x83\x00\x9a\x9f\xba\x1e\xdf\xfe\x2c\xbd\xbe\x15\x4e\x35\x5b\x2d\x2f\xd0\xa3\xd5\x6a\xb9\x9a\x40\xaf\xee\x3c\x15\xa9\x50\x6b\x9a\x3f\xef\xde\x41\xbb\x2d\x82\xfd\x6a\x29\x23\xeb\x04\x47\x3b\xfb\xd5\xf2\xe7\xb3\x33\xbe\x3a\x62\x6b\x3e\xd9\x41\xbb\x12\x81\x30\xf9\xc5\xb2\x12\x06\x0e\xcc\x4a\xb9\xdc\x11\x0f\xeb\x8e\x7e\xfa\x02\x23\x41\x2b\x27\xc8\xaa\x45\x26\xde\x8a\x63\x2a\x97\xd9\xd4\xe0\x24\xa5\x6c\xd0\xc6\x44\x17\xe0\xb7\x75\x1b\xa9\x51\x98\xaa\xbc\xa4\xde\x4e\x5f\x2f\xd2\x21\x8e\xea\x86\x26\xb5\x68\x68\x6f\x2b\xe3\x7c\xfc\x98\xaa\x58\xa7\xc2\x1c\xde\x4b\xaf\x2a\x8e\xd6\xfc\xbf\xce\xf9\x22\x83\x40\x67\x67\xb4\xa5\x51\x9b\x0e\x0c\x84\x57\xa7\xe9\x72\xde\x38\x92\x8d\x32\xf5\xba\x94\xc9\x90\x72\x83\x69\x5c\x48\x91\x14\x10\x56\x02\x3a\xf2\x1a\x96\x9a\x8d\xc7\x06\x26\x20\x0c\xeb\x4c\xf8\x43\x26\x1c\x06\x7f\x7f\x4b\x26\x31\x91\x5c\x7a\x8a\xcb\x47\x5e\x07\xc5\xee\xa1\xc5\x6a\xa2\x0d\x3a\xf3\xc8\x1b\x74\x26\xf8\x2c\x89\x62\xaa\x98\x8d\x25\xb3\x8f\x37\x64\x16\x93\x6d\x3b\xd5\x42\x9a\xb8\xea\x76\xb4\xeb\x01\x8d\x6d\x02\x86\xbe\x4b\x88\xd4\x5f\x8d\x13\xfd\xa4\xa9\x41\x2a\x52\xf7\x61\x72\x35\xc8\x9a\x5a\xf8\xd1\x41\xa5\x01\xad\x7f\x10\x4a\x90\xd1\x6a\xc3\xc1\xa5\xed\xb1\x4e\x58\x1f\x65\x34\x94\xbb\x87\x0e\xd7\xef\x45\xf4\xb6\xd9\x97\x4a\x84\x1b\xd9\xaf\x38\xcb\x8f\x96\x8b\xaa\x5c\x9c\xc3\xe1\x59\xd0\x7e\x1b\x8a\x04\x27\x3f\x40\xdf\xbf\x3d\x04\xb6\x8e\x44\x62\x61\x18\x0d\xee\xfc\xb0\xf8\xc8\xe6\x65\x0e\x40\x52\xda\x77\x54\xb7\x1a\x79\x77\xa9\x20\x89\x10\x26\x0a\xde\x36\x74\xde\x29\x37\x11\x4d\x9b\x1f\x77\x77\x45\x32\x5e\x47\xa8\x1e\x9a\xdb\x32\x8c\xc8\x44\x50\x44\xc9\xbf\x6b\xc1\xd0\x08\xed\x3f\x6e\x18\x3b\x38\x40\x3f\x14\xe8\x82\x23\x91\xaf\x9d\x9f\x21\x91\xa9\x4e\x51\x59\xfd\xdf\xff\xfd\x7f\xea\x61\x49\x47\x01\x1c\xdf\xb2\xf4\x7c\x00\x78\x67\x10\xfc\xa5\xf5\xbe\x02\x2f\x98\xb4\x56\x2e\x80\xb1\x6e\x86\x44\xff\xe2\xeb\x5f\x02\x83\xf9\x0e\x75\xf5\x19\xaa\xea\x62\x3a\x1c\x6a\x5d\x49\xb6\x60\x73\x38\xfc\xd0\xc8\xf1\x25\x67\x39\x2a\xca\xd5\xba\xaa\xa5\x04\xdd\xda\x5e\xcd\xc3\xd1\x0d\x4d\x16\xcb\xa1\x78\xd7\x3b\xb5\x4d\x48\x42\xb7\x95\xfe\x55\x64\xd5\x78\x6d\xe4\x5b\xf3\x3a\x1c\xc3\x7a\x78\x1e\xd5\x06\x75\x54\xa3\x02\xb5\xa0\x43\x8b\xc3\xdc\xef\xc7\x03\x1d\x19\x96\xaf\x19\x50\x73\xa7\xd1\xae\x29\x01\x6b\xac\xb7\x35\x5f\x2d\x46\x75\x13\xf8\x2d\x4c\xb0\x4e\xeb\x65\xdf\xfd\xbe\x6c\x4f\xd9\x15\x2a\x17\xd9\xfc\x1c\x5e\x42\xc4\xcb\x85\xfe\x4a\x63\x92\xf2\xe3\x5a\x3a\x8f\xb6\x90\x0e\x98\xf2\xf5\x04\xe8\xa9\xf7\x34\x02\x7b\x93\x24\x2d\x5d\xa0\xbe\x4d\xa0\x1e\x24\x2f\x52\x60\x63\xf9\xc1\x97\x94\xf9\x70\x84\xef\x4b\x94\x2a\x89\x3e\xbe\x59\x89\x42\xc8\xb8\xa6\xd0\x63\x10\xba\x77\xd9\x17\xbb\x77\xe9\x1d\xed\xa0\xdf\x40\x22\x13\xc9\x83\xfc\xb5\xd1\x47\x60\xd5\x07\xbc\x51\x19\xde\x31\xb0\xa7\xbf\x82\x99\x35\x51\xcb\xd3\xa8\x85\x9f\x8f\x1f\xef\x51\x94\xc3\x4c\x19\xcf\x9b\xc8\x5b\x87\x4d\x75\x02\xab\xf9\x0e\x01\x4d\xfb\x0e\xf1\xe7\x7e\x2f\x27\x51\xb9\x46\x3b\x1a\x4b\xfe\x1a\x7c\xdd\x94\x44\x03\xab\xa3\x1a\x50\xd1\x03\xa0\x96\x94\x68\x31\xb6\x9d\xfd\xe9\xa4\x3b\xed\x3c\x51\x75\x7a\xa6\x65\x23\x93\xea\xf4\x0c\x1d\xf6\xc6\x92\x1d\xf4\xa7\xc3\x43\x19\x94\xfb\xd9\x89\x5a\xc4\xa8\x4e\xcf\xfa\x79\x86\xf6\x82\xde\x42\xef\x7c\xc9\xc9\x37\x21\x56\x74\x08\x0c\xde\xf9\xc8\x57\xeb\x72\xb9\xb8\x73\x0f\xdd\x81\x49\xdf\x3b\x53\xf1\xab\xe4\xe7\xce\x3d\x2d\x2b\x84\xdf\x65\x77\xd5\xef\xf2\xcb\xad\x6f\x3e\xa9\x49\xba\x57\xcb\x53\x8e\x1e\x3e\xfb\x1e\xa5\xe7\xe5\x3c\x47\xcb\xb3\xaa\x3c\x2d\xff\xc6\x57\xeb\x29\x9a\x97\x1f\x38\x5a\xed\xff\xba\x9e\xca\x57\x62\x98\x69\x5f\x9f\xf1\xac\x2c\xca\x4c\x38\x6f\x5e\x82\xc2\xcf\x58\x55\xf1\xd5\x62\x0d\xf8\xa0\x51\x35\xe3\xa8\x58\xce\xe7\xcb\x8b\x72\x71\x72\x4f\xce\x79\x0a\xf3\xeb\x9d\x8b\x44\x77\x6a\xa3\xb9\x23\x27\x77\x3b\x00\xfb\xec\x34\xef\xcd\xa2\x36\x47\x24\xc5\xb3\x5b\xdf\x48\x75\xa9\x43\x93\xcd\x34\x77\x77\x00\x13\x7d\x06\xdd\x81\x72\xda\xb7\x8b\xde\xac\xf1\x9f\xb4\xef\xfb\x8b\x65\xce\x8f\xaf\xce\x78\x9b\xcc\xb5\x73\xd5\xea\xc5\xa3\x5c\xe8\xf3\xc6\x2f\xcb\xc5\xc9\xf2\x7f\xbe\x42\x1f\xbd\x7d\xba\xef\xc1\xeb\x79\xdb\x42\x3b\x4b\xda\x30\xa3\x42\x63\x8d\x89\xad\x2e\x66\x6c\xde\xc3\x14\xef\x7b\x7b\x72\x22\x66\x55\xef\x8d\x92\xa7\x18\xd5\x6f\x33\xb6\x7e\x7e\xb1\x78\x51\x6f\x81\x39\x54\x40\xfb\xdd\xdf\x01\xbc\x59\x22\x81\xaa\x71\x52\x28\x75\xc4\xe8\x82\xcb\xf5\x21\xf1\x1c\x0e\x12\xef\x08\xd9\xe8\xb2\x7a\xfb\x41\x16\x30\x14\x10\xf0\xb9\x33\xf9\xd5\xeb\xd7\xcb\x59\xb9\x58\x8a\x5e\x31\x74\xc1\x53\xa4\x0e\xaa\xaa\x59\xeb\x7d\x65\xd0\x4a\x26\x9f\x6e\xa9\x23\xaa\xb0\x6c\xf2\x69\xfa\xf7\x4f\xef\xa6\x34\xda\x64\x49\x64\x70\x62\xf7\xcd\xb3\xa7\x4f\xaa\xea\xec\xa5\x18\x32\xd6\x55\x83\xed\xcf\x69\x79\x22\x37\xb3\xec\xff\xba\xfe\xf3\x26\x98\xef\x9c\xaf\x39\xbc\xb0\x65\xd5\x9d\xfb\xb7\x86\x84\xbe\x2b\x4f\x7e\x02\x84\xf7\x45\x87\x7f\x5d\xcf\x44\x50\x2e\x4f\x16\xcb\x15\xbf\x37\x2f\x17\xfc\x56\x43\xfa\x82\xa7\xfe\x46\x24\x85\x92\x5e\xf3\x54\x8e\x4d\xf2\x98\xf1\x9d\xfd\x83\x79\x99\x1e\x08\x14\x22\x38\xdf\x3a\x38\x40\xf9\x72\x51\xa1\xe5\x47\xbe\x5a\x95\x39\xaf\x17\x1c\xea\xf5\x8d\x5b\xda\x11\x64\xb5\x72\x20\x02\xdc\x9d\x66\x43\x03\xac\x47\x74\x00\xf6\x25\xc9\x2e\x94\x30\x10\x58\x26\xd3\x41\x80\xb9\xfb\xb7\x3e\x19\xa4\x21\x9f\xa8\x85\xad\x9a\xe3\x3f\xdf\x23\xe4\xd3\x3b\x21\x85\xe9\x5b\x29\x85\x77\x3b\xb7\x0e\x0e\xfe\x3f\xb4\x5e\x9e\xaf\x32\xfe\x8c\x9d\x9d\x95\x8b\x93\x9f\x5f\x3e\x3d\x14\x0f\xf7\xe6\xb0\x89\xf4\xd7\xf5\xfe\x29\x3b\xbb\xf5\xff\x02\x00\x00\xff\xff\x64\xb1\xb4\x44\x52\x1f\x06\x00") func web3JsBytes() ([]byte, error) { return bindataRead( diff --git a/internal/jsre/deps/web3.js b/internal/jsre/deps/web3.js index 1aa6545281..9bb899384b 100644 --- a/internal/jsre/deps/web3.js +++ b/internal/jsre/deps/web3.js @@ -1884,7 +1884,7 @@ var sha3 = require('./sha3.js'); var utf8 = require('utf8'); var unitMap = { - 'noether': '0', + 'noether': '0', 'wei': '1', 'kwei': '1000', 'Kwei': '1000', @@ -2104,7 +2104,7 @@ var toHex = function (val) { if (isBigNumber(val)) return fromDecimal(val); - if (isObject(val)) + if (typeof val === 'object') return fromUtf8(JSON.stringify(val)); // if its a negative number, pass it through fromDecimal @@ -2258,8 +2258,6 @@ var isAddress = function (address) { } }; - - /** * Checks if the given string is a checksummed address * @@ -2267,18 +2265,18 @@ var isAddress = function (address) { * @param {String} address the given HEX adress * @return {Boolean} */ -var isChecksumAddress = function (address) { +var isChecksumAddress = function (address) { // Check each case address = address.replace('0x',''); var addressHash = sha3(address.toLowerCase()); - for (var i = 0; i < 40; i++ ) { + for (var i = 0; i < 40; i++ ) { // the nth letter should be uppercase if the nth digit of casemap is 1 if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) { return false; } } - return true; + return true; }; @@ -2290,15 +2288,15 @@ var isChecksumAddress = function (address) { * @param {String} address the given HEX adress * @return {String} */ -var toChecksumAddress = function (address) { +var toChecksumAddress = function (address) { if (typeof address === 'undefined') return ''; address = address.toLowerCase().replace('0x',''); var addressHash = sha3(address); var checksumAddress = '0x'; - for (var i = 0; i < address.length; i++ ) { - // If ith character is 9 to f then make it uppercase + for (var i = 0; i < address.length; i++ ) { + // If ith character is 9 to f then make it uppercase if (parseInt(addressHash[i], 16) > 7) { checksumAddress += address[i].toUpperCase(); } else { @@ -2370,7 +2368,7 @@ var isFunction = function (object) { * @return {Boolean} */ var isObject = function (object) { - return typeof object === 'object'; + return object !== null && !(object instanceof Array) && typeof object === 'object'; }; /** @@ -2410,6 +2408,38 @@ var isJson = function (str) { } }; +/** + * Returns true if given string is a valid Ethereum block header bloom. + * + * @method isBloom + * @param {String} hex encoded bloom filter + * @return {Boolean} + */ +var isBloom = function (bloom) { + if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) { + return false; + } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) { + return true; + } + return false; +}; + +/** + * Returns true if given string is a valid log topic. + * + * @method isTopic + * @param {String} hex encoded topic + * @return {Boolean} + */ +var isTopic = function (topic) { + if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) { + return false; + } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) { + return true; + } + return false; +}; + module.exports = { padLeft: padLeft, padRight: padRight, @@ -2438,12 +2468,14 @@ module.exports = { isObject: isObject, isBoolean: isBoolean, isArray: isArray, - isJson: isJson + isJson: isJson, + isBloom: isBloom, + isTopic: isTopic, }; },{"./sha3.js":19,"bignumber.js":"bignumber.js","utf8":85}],21:[function(require,module,exports){ module.exports={ - "version": "0.18.1" + "version": "0.20.1" } },{}],22:[function(require,module,exports){ @@ -2549,6 +2581,8 @@ Web3.prototype.isAddress = utils.isAddress; Web3.prototype.isChecksumAddress = utils.isChecksumAddress; Web3.prototype.toChecksumAddress = utils.toChecksumAddress; Web3.prototype.isIBAN = utils.isIBAN; +Web3.prototype.padLeft = utils.padLeft; +Web3.prototype.padRight = utils.padRight; Web3.prototype.sha3 = function(string, options) { @@ -2615,7 +2649,7 @@ module.exports = Web3; You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -/** +/** * @file allevents.js * @author Marek Kotewicz * @date 2014 @@ -2677,7 +2711,7 @@ AllSolidityEvents.prototype.execute = function (options, callback) { var o = this.encode(options); var formatter = this.decode.bind(this); - return new Filter(this._requestManager, o, watches.eth(), formatter, callback); + return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback); }; AllSolidityEvents.prototype.attachToContract = function (contract) { @@ -2936,6 +2970,8 @@ var ContractFactory = function (eth, abi) { * @returns {Contract} returns contract instance */ this.new = function () { + /*jshint maxcomplexity: 7 */ + var contract = new Contract(this.eth, this.abi); // parse arguments @@ -2955,7 +2991,7 @@ var ContractFactory = function (eth, abi) { if (options.value > 0) { var constructorAbi = abi.filter(function (json) { return json.type === 'constructor' && json.inputs.length === args.length; - })[0] || {}; + })[0] || {}; if (!constructorAbi.payable) { throw new Error('Cannot send value to non-payable constructor'); @@ -3090,8 +3126,11 @@ module.exports = ContractFactory; */ module.exports = { - InvalidNumberOfParams: function () { - return new Error('Invalid number of input parameters'); + InvalidNumberOfSolidityArgs: function () { + return new Error('Invalid number of arguments to Solidity function'); + }, + InvalidNumberOfRPCParams: function () { + return new Error('Invalid number of input parameters to RPC method'); }, InvalidConnection: function (host){ return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.'); @@ -3125,7 +3164,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -/** +/** * @file event.js * @author Marek Kotewicz * @date 2014 @@ -3196,7 +3235,7 @@ SolidityEvent.prototype.signature = function () { /** * Should be used to encode indexed params and options to one final object - * + * * @method encode * @param {Object} indexed * @param {Object} options @@ -3227,7 +3266,7 @@ SolidityEvent.prototype.encode = function (indexed, options) { if (value === undefined || value === null) { return null; } - + if (utils.isArray(value)) { return value.map(function (v) { return '0x' + coder.encodeParam(i.type, v); @@ -3249,17 +3288,17 @@ SolidityEvent.prototype.encode = function (indexed, options) { * @return {Object} result object with decoded indexed && not indexed params */ SolidityEvent.prototype.decode = function (data) { - + data.data = data.data || ''; data.topics = data.topics || []; var argTopics = this._anonymous ? data.topics : data.topics.slice(1); var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(""); - var indexedParams = coder.decodeParams(this.types(true), indexedData); + var indexedParams = coder.decodeParams(this.types(true), indexedData); var notIndexedData = data.data.slice(2); var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData); - + var result = formatters.outputLogFormatter(data); result.event = this.displayName(); result.address = data.address; @@ -3294,10 +3333,10 @@ SolidityEvent.prototype.execute = function (indexed, options, callback) { indexed = {}; } } - + var o = this.encode(indexed, options); var formatter = this.decode.bind(this); - return new Filter(this._requestManager, o, watches.eth(), formatter, callback); + return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback); }; /** @@ -3420,7 +3459,8 @@ var toTopic = function(value){ /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones /// @param should be string or object /// @returns options string or object -var getOptions = function (options) { +var getOptions = function (options, type) { + /*jshint maxcomplexity: 6 */ if (utils.isString(options)) { return options; @@ -3428,20 +3468,27 @@ var getOptions = function (options) { options = options || {}; - // make sure topics, get converted to hex - options.topics = options.topics || []; - options.topics = options.topics.map(function(topic){ - return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic); - }); - return { - topics: options.topics, - from: options.from, - to: options.to, - address: options.address, - fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), - toBlock: formatters.inputBlockNumberFormatter(options.toBlock) - }; + switch(type) { + case 'eth': + + // make sure topics, get converted to hex + options.topics = options.topics || []; + options.topics = options.topics.map(function(topic){ + return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic); + }); + + return { + topics: options.topics, + from: options.from, + to: options.to, + address: options.address, + fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), + toBlock: formatters.inputBlockNumberFormatter(options.toBlock) + }; + case 'shh': + return options; + } }; /** @@ -3449,7 +3496,7 @@ Adds the callback and sets up the methods, to iterate over the results. @method getLogsAtStart @param {Object} self -@param {funciton} +@param {function} callback */ var getLogsAtStart = function(self, callback){ // call getFilterLogs for the first watch callback start @@ -3501,7 +3548,7 @@ var pollFilter = function(self) { }; -var Filter = function (requestManager, options, methods, formatter, callback, filterCreationErrorCallback) { +var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) { var self = this; var implementation = {}; methods.forEach(function (method) { @@ -3509,7 +3556,7 @@ var Filter = function (requestManager, options, methods, formatter, callback, fi method.attachToObject(implementation); }); this.requestManager = requestManager; - this.options = getOptions(options); + this.options = getOptions(options, type); this.implementation = implementation; this.filterId = null; this.callbacks = []; @@ -3521,7 +3568,9 @@ var Filter = function (requestManager, options, methods, formatter, callback, fi self.callbacks.forEach(function(cb){ cb(error); }); - filterCreationErrorCallback(error); + if (typeof filterCreationErrorCallback === 'function') { + filterCreationErrorCallback(error); + } } else { self.filterId = id; @@ -3606,6 +3655,8 @@ module.exports = Filter; },{"../utils/utils":20,"./formatters":30}],30:[function(require,module,exports){ +'use strict' + /* This file is part of web3.js. @@ -3798,11 +3849,11 @@ var outputBlockFormatter = function(block) { * @returns {Object} log */ var outputLogFormatter = function(log) { - if(log.blockNumber !== null) + if(log.blockNumber) log.blockNumber = utils.toDecimal(log.blockNumber); - if(log.transactionIndex !== null) + if(log.transactionIndex) log.transactionIndex = utils.toDecimal(log.transactionIndex); - if(log.logIndex !== null) + if(log.logIndex) log.logIndex = utils.toDecimal(log.logIndex); return log; @@ -3881,6 +3932,9 @@ var inputAddressFormatter = function (address) { var outputSyncingFormatter = function(result) { + if (!result) { + return result; + } result.startingBlock = utils.toDecimal(result.startingBlock); result.currentBlock = utils.toDecimal(result.currentBlock); @@ -3935,6 +3989,7 @@ module.exports = { var coder = require('../solidity/coder'); var utils = require('../utils/utils'); +var errors = require('./errors'); var formatters = require('./formatters'); var sha3 = require('../utils/sha3'); @@ -3967,6 +4022,26 @@ SolidityFunction.prototype.extractDefaultBlock = function (args) { } }; +/** + * Should be called to check if the number of arguments is correct + * + * @method validateArgs + * @param {Array} arguments + * @throws {Error} if it is not + */ +SolidityFunction.prototype.validateArgs = function (args) { + var inputArgs = args.filter(function (a) { + // filter the options object but not arguments that are arrays + return !( (utils.isObject(a) === true) && + (utils.isArray(a) === false) && + (utils.isBigNumber(a) === false) + ); + }); + if (inputArgs.length !== this._inputTypes.length) { + throw errors.InvalidNumberOfSolidityArgs(); + } +}; + /** * Should be used to create payload from arguments * @@ -3979,6 +4054,7 @@ SolidityFunction.prototype.toPayload = function (args) { if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) { options = args[args.length - 1]; } + this.validateArgs(args); options.to = this._address; options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args); return options; @@ -4173,8 +4249,7 @@ SolidityFunction.prototype.attachToContract = function (contract) { module.exports = SolidityFunction; - -},{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./formatters":30}],32:[function(require,module,exports){ +},{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){ /* This file is part of web3.js. @@ -4199,19 +4274,16 @@ module.exports = SolidityFunction; * @date 2015 */ -"use strict"; - var errors = require('./errors'); // workaround to use httpprovider in different envs -// var XMLHttpRequest; // jshint ignore: line // browser if (typeof window !== 'undefined' && window.XMLHttpRequest) { - XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line + XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line // node } else { - XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line + XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line } var XHR2 = require('xhr2'); // jshint ignore: line @@ -4219,9 +4291,11 @@ var XHR2 = require('xhr2'); // jshint ignore: line /** * HttpProvider should be used to send rpc calls over http */ -var HttpProvider = function (host, timeout) { - this.host = host || 'http://localhost:8545'; - this.timeout = timeout || 0; +var HttpProvider = function (host, timeout, user, password) { + this.host = host || 'http://localhost:8545'; + this.timeout = timeout || 0; + this.user = user; + this.password = password; }; /** @@ -4232,18 +4306,21 @@ var HttpProvider = function (host, timeout) { * @return {XMLHttpRequest} object */ HttpProvider.prototype.prepareRequest = function (async) { - var request; + var request; - if (async) { - request = new XHR2(); - request.timeout = this.timeout; - }else { - request = new XMLHttpRequest(); - } + if (async) { + request = new XHR2(); + request.timeout = this.timeout; + } else { + request = new XMLHttpRequest(); + } - request.open('POST', this.host, async); - request.setRequestHeader('Content-Type','application/json'); - return request; + request.open('POST', this.host, async); + if (this.user && this.password) { + var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64'); + request.setRequestHeader('Authorization', auth); + } request.setRequestHeader('Content-Type', 'application/json'); + return request; }; /** @@ -4254,23 +4331,23 @@ HttpProvider.prototype.prepareRequest = function (async) { * @return {Object} result */ HttpProvider.prototype.send = function (payload) { - var request = this.prepareRequest(false); + var request = this.prepareRequest(false); - try { - request.send(JSON.stringify(payload)); - } catch(error) { - throw errors.InvalidConnection(this.host); - } + try { + request.send(JSON.stringify(payload)); + } catch (error) { + throw errors.InvalidConnection(this.host); + } - var result = request.responseText; + var result = request.responseText; - try { - result = JSON.parse(result); - } catch(e) { - throw errors.InvalidResponse(request.responseText); - } + try { + result = JSON.parse(result); + } catch (e) { + throw errors.InvalidResponse(request.responseText); + } - return result; + return result; }; /** @@ -4281,32 +4358,32 @@ HttpProvider.prototype.send = function (payload) { * @param {Function} callback triggered on end with (err, result) */ HttpProvider.prototype.sendAsync = function (payload, callback) { - var request = this.prepareRequest(true); + var request = this.prepareRequest(true); - request.onreadystatechange = function() { - if (request.readyState === 4 && request.timeout !== 1) { - var result = request.responseText; - var error = null; + request.onreadystatechange = function () { + if (request.readyState === 4 && request.timeout !== 1) { + var result = request.responseText; + var error = null; - try { - result = JSON.parse(result); - } catch(e) { - error = errors.InvalidResponse(request.responseText); - } + try { + result = JSON.parse(result); + } catch (e) { + error = errors.InvalidResponse(request.responseText); + } - callback(error, result); - } - }; - - request.ontimeout = function() { - callback(errors.ConnectionTimeout(this.timeout)); - }; - - try { - request.send(JSON.stringify(payload)); - } catch(error) { - callback(errors.InvalidConnection(this.host)); + callback(error, result); } + }; + + request.ontimeout = function () { + callback(errors.ConnectionTimeout(this.timeout)); + }; + + try { + request.send(JSON.stringify(payload)); + } catch (error) { + callback(errors.InvalidConnection(this.host)); + } }; /** @@ -4315,18 +4392,18 @@ HttpProvider.prototype.sendAsync = function (payload, callback) { * @method isConnected * @return {Boolean} returns true if request haven't failed. Otherwise false */ -HttpProvider.prototype.isConnected = function() { - try { - this.send({ - id: 9999999999, - jsonrpc: '2.0', - method: 'net_listening', - params: [] - }); - return true; - } catch(e) { - return false; - } +HttpProvider.prototype.isConnected = function () { + try { + this.send({ + id: 9999999999, + jsonrpc: '2.0', + method: 'net_listening', + params: [] + }); + return true; + } catch (e) { + return false; + } }; module.exports = HttpProvider; @@ -4928,7 +5005,7 @@ Method.prototype.extractCallback = function (args) { */ Method.prototype.validateArgs = function (args) { if (args.length !== this.params) { - throw errors.InvalidNumberOfParams(); + throw errors.InvalidNumberOfRPCParams(); } }; @@ -5022,7 +5099,6 @@ Method.prototype.request = function () { module.exports = Method; - },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){ /* This file is part of web3.js. @@ -5155,12 +5231,12 @@ function Eth(web3) { var self = this; - methods().forEach(function(method) { + methods().forEach(function(method) { method.attachToObject(self); method.setRequestManager(self._requestManager); }); - properties().forEach(function(p) { + properties().forEach(function(p) { p.attachToObject(self); p.setRequestManager(self._requestManager); }); @@ -5296,6 +5372,13 @@ var methods = function () { inputFormatter: [formatters.inputTransactionFormatter] }); + var signTransaction = new Method({ + name: 'signTransaction', + call: 'eth_signTransaction', + params: 1, + inputFormatter: [formatters.inputTransactionFormatter] + }); + var sign = new Method({ name: 'sign', call: 'eth_sign', @@ -5364,6 +5447,7 @@ var methods = function () { call, estimateGas, sendRawTransaction, + signTransaction, sendTransaction, sign, compileSolidity, @@ -5421,8 +5505,8 @@ Eth.prototype.contract = function (abi) { return factory; }; -Eth.prototype.filter = function (fil, callback) { - return new Filter(this._requestManager, fil, watches.eth(), formatters.outputLogFormatter, callback); +Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) { + return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback); }; Eth.prototype.namereg = function () { @@ -5439,7 +5523,6 @@ Eth.prototype.isSyncing = function (callback) { module.exports = Eth; - },{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":44,"../property":45,"../syncing":48,"../transfer":49,"./watches":43}],39:[function(require,module,exports){ /* This file is part of web3.js. @@ -5548,6 +5631,25 @@ var methods = function () { inputFormatter: [null] }); + var importRawKey = new Method({ + name: 'importRawKey', + call: 'personal_importRawKey', + params: 2 + }); + + var sign = new Method({ + name: 'sign', + call: 'personal_sign', + params: 3, + inputFormatter: [null, formatters.inputAddressFormatter, null] + }); + + var ecRecover = new Method({ + name: 'ecRecover', + call: 'personal_ecRecover', + params: 2 + }); + var unlockAccount = new Method({ name: 'unlockAccount', call: 'personal_unlockAccount', @@ -5571,7 +5673,10 @@ var methods = function () { return [ newAccount, + importRawKey, unlockAccount, + ecRecover, + sign, sendTransaction, lockAccount ]; @@ -5608,12 +5713,12 @@ module.exports = Personal; */ /** @file shh.js * @authors: - * Marek Kotewicz - * @date 2015 + * Fabian Vogelsteller + * Marek Kotewicz + * @date 2017 */ var Method = require('../method'); -var formatters = require('../formatters'); var Filter = require('../filter'); var watches = require('./watches'); @@ -5622,62 +5727,120 @@ var Shh = function (web3) { var self = this; - methods().forEach(function(method) { + methods().forEach(function(method) { method.attachToObject(self); method.setRequestManager(self._requestManager); }); }; -Shh.prototype.filter = function (fil, callback) { - return new Filter(this._requestManager, fil, watches.shh(), formatters.outputPostFormatter, callback); +Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) { + return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback); }; -var methods = function () { - - var post = new Method({ - name: 'post', - call: 'shh_post', - params: 1, - inputFormatter: [formatters.inputPostFormatter] - }); - - var newIdentity = new Method({ - name: 'newIdentity', - call: 'shh_newIdentity', - params: 0 - }); - - var hasIdentity = new Method({ - name: 'hasIdentity', - call: 'shh_hasIdentity', - params: 1 - }); - - var newGroup = new Method({ - name: 'newGroup', - call: 'shh_newGroup', - params: 0 - }); - - var addToGroup = new Method({ - name: 'addToGroup', - call: 'shh_addToGroup', - params: 0 - }); +var methods = function () { return [ - post, - newIdentity, - hasIdentity, - newGroup, - addToGroup + new Method({ + name: 'version', + call: 'shh_version', + params: 0 + }), + new Method({ + name: 'info', + call: 'shh_info', + params: 0 + }), + new Method({ + name: 'setMaxMessageSize', + call: 'shh_setMaxMessageSize', + params: 1 + }), + new Method({ + name: 'setMinPoW', + call: 'shh_setMinPoW', + params: 1 + }), + new Method({ + name: 'markTrustedPeer', + call: 'shh_markTrustedPeer', + params: 1 + }), + new Method({ + name: 'newKeyPair', + call: 'shh_newKeyPair', + params: 0 + }), + new Method({ + name: 'addPrivateKey', + call: 'shh_addPrivateKey', + params: 1 + }), + new Method({ + name: 'deleteKeyPair', + call: 'shh_deleteKeyPair', + params: 1 + }), + new Method({ + name: 'hasKeyPair', + call: 'shh_hasKeyPair', + params: 1 + }), + new Method({ + name: 'getPublicKey', + call: 'shh_getPublicKey', + params: 1 + }), + new Method({ + name: 'getPrivateKey', + call: 'shh_getPrivateKey', + params: 1 + }), + new Method({ + name: 'newSymKey', + call: 'shh_newSymKey', + params: 0 + }), + new Method({ + name: 'addSymKey', + call: 'shh_addSymKey', + params: 1 + }), + new Method({ + name: 'generateSymKeyFromPassword', + call: 'shh_generateSymKeyFromPassword', + params: 1 + }), + new Method({ + name: 'hasSymKey', + call: 'shh_hasSymKey', + params: 1 + }), + new Method({ + name: 'getSymKey', + call: 'shh_getSymKey', + params: 1 + }), + new Method({ + name: 'deleteSymKey', + call: 'shh_deleteSymKey', + params: 1 + }), + + // subscribe and unsubscribe missing + + new Method({ + name: 'post', + call: 'shh_post', + params: 1, + inputFormatter: [null] + }) ]; }; module.exports = Shh; -},{"../filter":29,"../formatters":30,"../method":36,"./watches":43}],42:[function(require,module,exports){ +},{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){ /* This file is part of web3.js. @@ -5902,35 +6065,28 @@ var eth = function () { /// @returns an array of objects describing web3.shh.watch api methods var shh = function () { - var newFilter = new Method({ - name: 'newFilter', - call: 'shh_newFilter', - params: 1 - }); - - var uninstallFilter = new Method({ - name: 'uninstallFilter', - call: 'shh_uninstallFilter', - params: 1 - }); - - var getLogs = new Method({ - name: 'getLogs', - call: 'shh_getMessages', - params: 1 - }); - - var poll = new Method({ - name: 'poll', - call: 'shh_getFilterChanges', - params: 1 - }); return [ - newFilter, - uninstallFilter, - getLogs, - poll + new Method({ + name: 'newFilter', + call: 'shh_newMessageFilter', + params: 1 + }), + new Method({ + name: 'uninstallFilter', + call: 'shh_deleteMessageFilter', + params: 1 + }), + new Method({ + name: 'getLogs', + call: 'shh_getFilterMessages', + params: 1 + }), + new Method({ + name: 'poll', + call: 'shh_getFilterMessages', + params: 1 + }) ]; }; @@ -13453,2691 +13609,12 @@ module.exports = transfer; module.exports = XMLHttpRequest; },{}],"bignumber.js":[function(require,module,exports){ -/*! bignumber.js v2.0.7 https://github.com/MikeMcl/bignumber.js/LICENCE */ +'use strict'; -;(function (global) { - 'use strict'; +module.exports = BigNumber; // jshint ignore:line - /* - bignumber.js v2.0.7 - A JavaScript library for arbitrary-precision arithmetic. - https://github.com/MikeMcl/bignumber.js - Copyright (c) 2015 Michael Mclaughlin - MIT Expat Licence - */ - - var BigNumber, crypto, parseNumeric, - isNumeric = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, - mathceil = Math.ceil, - mathfloor = Math.floor, - notBool = ' not a boolean or binary digit', - roundingMode = 'rounding mode', - tooManyDigits = 'number type has more than 15 significant digits', - ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', - BASE = 1e14, - LOG_BASE = 14, - MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 - // MAX_INT32 = 0x7fffffff, // 2^31 - 1 - POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], - SQRT_BASE = 1e7, - - /* - * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and - * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an - * exception is thrown (if ERRORS is true). - */ - MAX = 1E9; // 0 to MAX_INT32 - - - /* - * Create and return a BigNumber constructor. - */ - function another(configObj) { - var div, - - // id tracks the caller function, so its name can be included in error messages. - id = 0, - P = BigNumber.prototype, - ONE = new BigNumber(1), - - - /********************************* EDITABLE DEFAULTS **********************************/ - - - /* - * The default values below must be integers within the inclusive ranges stated. - * The values can also be changed at run-time using BigNumber.config. - */ - - // The maximum number of decimal places for operations involving division. - DECIMAL_PLACES = 20, // 0 to MAX - - /* - * The rounding mode used when rounding to the above decimal places, and when using - * toExponential, toFixed, toFormat and toPrecision, and round (default value). - * UP 0 Away from zero. - * DOWN 1 Towards zero. - * CEIL 2 Towards +Infinity. - * FLOOR 3 Towards -Infinity. - * HALF_UP 4 Towards nearest neighbour. If equidistant, up. - * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. - * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. - * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. - * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. - */ - ROUNDING_MODE = 4, // 0 to 8 - - // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] - - // The exponent value at and beneath which toString returns exponential notation. - // Number type: -7 - TO_EXP_NEG = -7, // 0 to -MAX - - // The exponent value at and above which toString returns exponential notation. - // Number type: 21 - TO_EXP_POS = 21, // 0 to MAX - - // RANGE : [MIN_EXP, MAX_EXP] - - // The minimum exponent value, beneath which underflow to zero occurs. - // Number type: -324 (5e-324) - MIN_EXP = -1e7, // -1 to -MAX - - // The maximum exponent value, above which overflow to Infinity occurs. - // Number type: 308 (1.7976931348623157e+308) - // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. - MAX_EXP = 1e7, // 1 to MAX - - // Whether BigNumber Errors are ever thrown. - ERRORS = true, // true or false - - // Change to intValidatorNoErrors if ERRORS is false. - isValidInt = intValidatorWithErrors, // intValidatorWithErrors/intValidatorNoErrors - - // Whether to use cryptographically-secure random number generation, if available. - CRYPTO = false, // true or false - - /* - * The modulo mode used when calculating the modulus: a mod n. - * The quotient (q = a / n) is calculated according to the corresponding rounding mode. - * The remainder (r) is calculated as: r = a - n * q. - * - * UP 0 The remainder is positive if the dividend is negative, else is negative. - * DOWN 1 The remainder has the same sign as the dividend. - * This modulo mode is commonly known as 'truncated division' and is - * equivalent to (a % n) in JavaScript. - * FLOOR 3 The remainder has the same sign as the divisor (Python %). - * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. - * EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). - * The remainder is always positive. - * - * The truncated division, floored division, Euclidian division and IEEE 754 remainder - * modes are commonly used for the modulus operation. - * Although the other rounding modes can also be used, they may not give useful results. - */ - MODULO_MODE = 1, // 0 to 9 - - // The maximum number of significant digits of the result of the toPower operation. - // If POW_PRECISION is 0, there will be unlimited significant digits. - POW_PRECISION = 100, // 0 to MAX - - // The format specification used by the BigNumber.prototype.toFormat method. - FORMAT = { - decimalSeparator: '.', - groupSeparator: ',', - groupSize: 3, - secondaryGroupSize: 0, - fractionGroupSeparator: '\xA0', // non-breaking space - fractionGroupSize: 0 - }; - - - /******************************************************************************************/ - - - // CONSTRUCTOR - - - /* - * The BigNumber constructor and exported function. - * Create and return a new instance of a BigNumber object. - * - * n {number|string|BigNumber} A numeric value. - * [b] {number} The base of n. Integer, 2 to 64 inclusive. - */ - function BigNumber( n, b ) { - var c, e, i, num, len, str, - x = this; - - // Enable constructor usage without new. - if ( !( x instanceof BigNumber ) ) { - - // 'BigNumber() constructor call without new: {n}' - if (ERRORS) raise( 26, 'constructor call without new', n ); - return new BigNumber( n, b ); - } - - // 'new BigNumber() base not an integer: {b}' - // 'new BigNumber() base out of range: {b}' - if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) { - - // Duplicate. - if ( n instanceof BigNumber ) { - x.s = n.s; - x.e = n.e; - x.c = ( n = n.c ) ? n.slice() : n; - id = 0; - return; - } - - if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) { - x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1; - - // Fast path for integers. - if ( n === ~~n ) { - for ( e = 0, i = n; i >= 10; i /= 10, e++ ); - x.e = e; - x.c = [n]; - id = 0; - return; - } - - str = n + ''; - } else { - if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num ); - x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; - } - } else { - b = b | 0; - str = n + ''; - - // Ensure return value is rounded to DECIMAL_PLACES as with other bases. - // Allow exponential notation to be used with base 10 argument. - if ( b == 10 ) { - x = new BigNumber( n instanceof BigNumber ? n : str ); - return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE ); - } - - // Avoid potential interpretation of Infinity and NaN as base 44+ values. - // Any number in exponential form will fail due to the [Ee][+-]. - if ( ( num = typeof n == 'number' ) && n * 0 != 0 || - !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) + - '(?:\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) { - return parseNumeric( x, str, num, b ); - } - - if (num) { - x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1; - - if ( ERRORS && str.replace( /^0\.0*|\./, '' ).length > 15 ) { - - // 'new BigNumber() number type has more than 15 significant digits: {n}' - raise( id, tooManyDigits, n ); - } - - // Prevent later check for length on converted number. - num = false; - } else { - x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; - } - - str = convertBase( str, 10, b, x.s ); - } - - // Decimal point? - if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' ); - - // Exponential form? - if ( ( i = str.search( /e/i ) ) > 0 ) { - - // Determine exponent. - if ( e < 0 ) e = i; - e += +str.slice( i + 1 ); - str = str.substring( 0, i ); - } else if ( e < 0 ) { - - // Integer. - e = str.length; - } - - // Determine leading zeros. - for ( i = 0; str.charCodeAt(i) === 48; i++ ); - - // Determine trailing zeros. - for ( len = str.length; str.charCodeAt(--len) === 48; ); - str = str.slice( i, len + 1 ); - - if (str) { - len = str.length; - - // Disallow numbers with over 15 significant digits if number type. - // 'new BigNumber() number type has more than 15 significant digits: {n}' - if ( num && ERRORS && len > 15 ) raise( id, tooManyDigits, x.s * n ); - - e = e - i - 1; - - // Overflow? - if ( e > MAX_EXP ) { - - // Infinity. - x.c = x.e = null; - - // Underflow? - } else if ( e < MIN_EXP ) { - - // Zero. - x.c = [ x.e = 0 ]; - } else { - x.e = e; - x.c = []; - - // Transform base - - // e is the base 10 exponent. - // i is where to slice str to get the first element of the coefficient array. - i = ( e + 1 ) % LOG_BASE; - if ( e < 0 ) i += LOG_BASE; - - if ( i < len ) { - if (i) x.c.push( +str.slice( 0, i ) ); - - for ( len -= LOG_BASE; i < len; ) { - x.c.push( +str.slice( i, i += LOG_BASE ) ); - } - - str = str.slice(i); - i = LOG_BASE - str.length; - } else { - i -= len; - } - - for ( ; i--; str += '0' ); - x.c.push( +str ); - } - } else { - - // Zero. - x.c = [ x.e = 0 ]; - } - - id = 0; - } - - - // CONSTRUCTOR PROPERTIES - - - BigNumber.another = another; - - BigNumber.ROUND_UP = 0; - BigNumber.ROUND_DOWN = 1; - BigNumber.ROUND_CEIL = 2; - BigNumber.ROUND_FLOOR = 3; - BigNumber.ROUND_HALF_UP = 4; - BigNumber.ROUND_HALF_DOWN = 5; - BigNumber.ROUND_HALF_EVEN = 6; - BigNumber.ROUND_HALF_CEIL = 7; - BigNumber.ROUND_HALF_FLOOR = 8; - BigNumber.EUCLID = 9; - - - /* - * Configure infrequently-changing library-wide settings. - * - * Accept an object or an argument list, with one or many of the following properties or - * parameters respectively: - * - * DECIMAL_PLACES {number} Integer, 0 to MAX inclusive - * ROUNDING_MODE {number} Integer, 0 to 8 inclusive - * EXPONENTIAL_AT {number|number[]} Integer, -MAX to MAX inclusive or - * [integer -MAX to 0 incl., 0 to MAX incl.] - * RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or - * [integer -MAX to -1 incl., integer 1 to MAX incl.] - * ERRORS {boolean|number} true, false, 1 or 0 - * CRYPTO {boolean|number} true, false, 1 or 0 - * MODULO_MODE {number} 0 to 9 inclusive - * POW_PRECISION {number} 0 to MAX inclusive - * FORMAT {object} See BigNumber.prototype.toFormat - * decimalSeparator {string} - * groupSeparator {string} - * groupSize {number} - * secondaryGroupSize {number} - * fractionGroupSeparator {string} - * fractionGroupSize {number} - * - * (The values assigned to the above FORMAT object properties are not checked for validity.) - * - * E.g. - * BigNumber.config(20, 4) is equivalent to - * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) - * - * Ignore properties/parameters set to null or undefined. - * Return an object with the properties current values. - */ - BigNumber.config = function () { - var v, p, - i = 0, - r = {}, - a = arguments, - o = a[0], - has = o && typeof o == 'object' - ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; } - : function () { if ( a.length > i ) return ( v = a[i++] ) != null; }; - - // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. - // 'config() DECIMAL_PLACES not an integer: {v}' - // 'config() DECIMAL_PLACES out of range: {v}' - if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) { - DECIMAL_PLACES = v | 0; - } - r[p] = DECIMAL_PLACES; - - // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. - // 'config() ROUNDING_MODE not an integer: {v}' - // 'config() ROUNDING_MODE out of range: {v}' - if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) { - ROUNDING_MODE = v | 0; - } - r[p] = ROUNDING_MODE; - - // EXPONENTIAL_AT {number|number[]} - // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive]. - // 'config() EXPONENTIAL_AT not an integer: {v}' - // 'config() EXPONENTIAL_AT out of range: {v}' - if ( has( p = 'EXPONENTIAL_AT' ) ) { - - if ( isArray(v) ) { - if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) { - TO_EXP_NEG = v[0] | 0; - TO_EXP_POS = v[1] | 0; - } - } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { - TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 ); - } - } - r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; - - // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or - // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. - // 'config() RANGE not an integer: {v}' - // 'config() RANGE cannot be zero: {v}' - // 'config() RANGE out of range: {v}' - if ( has( p = 'RANGE' ) ) { - - if ( isArray(v) ) { - if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) { - MIN_EXP = v[0] | 0; - MAX_EXP = v[1] | 0; - } - } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { - if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 ); - else if (ERRORS) raise( 2, p + ' cannot be zero', v ); - } - } - r[p] = [ MIN_EXP, MAX_EXP ]; - - // ERRORS {boolean|number} true, false, 1 or 0. - // 'config() ERRORS not a boolean or binary digit: {v}' - if ( has( p = 'ERRORS' ) ) { - - if ( v === !!v || v === 1 || v === 0 ) { - id = 0; - isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors; - } else if (ERRORS) { - raise( 2, p + notBool, v ); - } - } - r[p] = ERRORS; - - // CRYPTO {boolean|number} true, false, 1 or 0. - // 'config() CRYPTO not a boolean or binary digit: {v}' - // 'config() crypto unavailable: {crypto}' - if ( has( p = 'CRYPTO' ) ) { - - if ( v === !!v || v === 1 || v === 0 ) { - CRYPTO = !!( v && crypto && typeof crypto == 'object' ); - if ( v && !CRYPTO && ERRORS ) raise( 2, 'crypto unavailable', crypto ); - } else if (ERRORS) { - raise( 2, p + notBool, v ); - } - } - r[p] = CRYPTO; - - // MODULO_MODE {number} Integer, 0 to 9 inclusive. - // 'config() MODULO_MODE not an integer: {v}' - // 'config() MODULO_MODE out of range: {v}' - if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) { - MODULO_MODE = v | 0; - } - r[p] = MODULO_MODE; - - // POW_PRECISION {number} Integer, 0 to MAX inclusive. - // 'config() POW_PRECISION not an integer: {v}' - // 'config() POW_PRECISION out of range: {v}' - if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) { - POW_PRECISION = v | 0; - } - r[p] = POW_PRECISION; - - // FORMAT {object} - // 'config() FORMAT not an object: {v}' - if ( has( p = 'FORMAT' ) ) { - - if ( typeof v == 'object' ) { - FORMAT = v; - } else if (ERRORS) { - raise( 2, p + ' not an object', v ); - } - } - r[p] = FORMAT; - - return r; - }; - - - /* - * Return a new BigNumber whose value is the maximum of the arguments. - * - * arguments {number|string|BigNumber} - */ - BigNumber.max = function () { return maxOrMin( arguments, P.lt ); }; - - - /* - * Return a new BigNumber whose value is the minimum of the arguments. - * - * arguments {number|string|BigNumber} - */ - BigNumber.min = function () { return maxOrMin( arguments, P.gt ); }; - - - /* - * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, - * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing - * zeros are produced). - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * - * 'random() decimal places not an integer: {dp}' - * 'random() decimal places out of range: {dp}' - * 'random() crypto unavailable: {crypto}' - */ - BigNumber.random = (function () { - var pow2_53 = 0x20000000000000; - - // Return a 53 bit integer n, where 0 <= n < 9007199254740992. - // Check if Math.random() produces more than 32 bits of randomness. - // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. - // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. - var random53bitInt = (Math.random() * pow2_53) & 0x1fffff - ? function () { return mathfloor( Math.random() * pow2_53 ); } - : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + - (Math.random() * 0x800000 | 0); }; - - return function (dp) { - var a, b, e, k, v, - i = 0, - c = [], - rand = new BigNumber(ONE); - - dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0; - k = mathceil( dp / LOG_BASE ); - - if (CRYPTO) { - - // Browsers supporting crypto.getRandomValues. - if ( crypto && crypto.getRandomValues ) { - - a = crypto.getRandomValues( new Uint32Array( k *= 2 ) ); - - for ( ; i < k; ) { - - // 53 bits: - // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) - // 11111 11111111 11111111 11111111 11100000 00000000 00000000 - // ((Math.pow(2, 32) - 1) >>> 11).toString(2) - // 11111 11111111 11111111 - // 0x20000 is 2^21. - v = a[i] * 0x20000 + (a[i + 1] >>> 11); - - // Rejection sampling: - // 0 <= v < 9007199254740992 - // Probability that v >= 9e15, is - // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 - if ( v >= 9e15 ) { - b = crypto.getRandomValues( new Uint32Array(2) ); - a[i] = b[0]; - a[i + 1] = b[1]; - } else { - - // 0 <= v <= 8999999999999999 - // 0 <= (v % 1e14) <= 99999999999999 - c.push( v % 1e14 ); - i += 2; - } - } - i = k / 2; - - // Node.js supporting crypto.randomBytes. - } else if ( crypto && crypto.randomBytes ) { - - // buffer - a = crypto.randomBytes( k *= 7 ); - - for ( ; i < k; ) { - - // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 - // 0x100000000 is 2^32, 0x1000000 is 2^24 - // 11111 11111111 11111111 11111111 11111111 11111111 11111111 - // 0 <= v < 9007199254740992 - v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) + - ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) + - ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6]; - - if ( v >= 9e15 ) { - crypto.randomBytes(7).copy( a, i ); - } else { - - // 0 <= (v % 1e14) <= 99999999999999 - c.push( v % 1e14 ); - i += 7; - } - } - i = k / 7; - } else if (ERRORS) { - raise( 14, 'crypto unavailable', crypto ); - } - } - - // Use Math.random: CRYPTO is false or crypto is unavailable and ERRORS is false. - if (!i) { - - for ( ; i < k; ) { - v = random53bitInt(); - if ( v < 9e15 ) c[i++] = v % 1e14; - } - } - - k = c[--i]; - dp %= LOG_BASE; - - // Convert trailing digits to zeros according to dp. - if ( k && dp ) { - v = POWS_TEN[LOG_BASE - dp]; - c[i] = mathfloor( k / v ) * v; - } - - // Remove trailing elements which are zero. - for ( ; c[i] === 0; c.pop(), i-- ); - - // Zero? - if ( i < 0 ) { - c = [ e = 0 ]; - } else { - - // Remove leading elements which are zero and adjust exponent accordingly. - for ( e = -1 ; c[0] === 0; c.shift(), e -= LOG_BASE); - - // Count the digits of the first element of c to determine leading zeros, and... - for ( i = 1, v = c[0]; v >= 10; v /= 10, i++); - - // adjust the exponent accordingly. - if ( i < LOG_BASE ) e -= LOG_BASE - i; - } - - rand.e = e; - rand.c = c; - return rand; - }; - })(); - - - // PRIVATE FUNCTIONS - - - // Convert a numeric string of baseIn to a numeric string of baseOut. - function convertBase( str, baseOut, baseIn, sign ) { - var d, e, k, r, x, xc, y, - i = str.indexOf( '.' ), - dp = DECIMAL_PLACES, - rm = ROUNDING_MODE; - - if ( baseIn < 37 ) str = str.toLowerCase(); - - // Non-integer. - if ( i >= 0 ) { - k = POW_PRECISION; - - // Unlimited precision. - POW_PRECISION = 0; - str = str.replace( '.', '' ); - y = new BigNumber(baseIn); - x = y.pow( str.length - i ); - POW_PRECISION = k; - - // Convert str as if an integer, then restore the fraction part by dividing the - // result by its base raised to a power. - y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut ); - y.e = y.c.length; - } - - // Convert the number as integer. - xc = toBaseOut( str, baseIn, baseOut ); - e = k = xc.length; - - // Remove trailing zeros. - for ( ; xc[--k] == 0; xc.pop() ); - if ( !xc[0] ) return '0'; - - if ( i < 0 ) { - --e; - } else { - x.c = xc; - x.e = e; - - // sign is needed for correct rounding. - x.s = sign; - x = div( x, y, dp, rm, baseOut ); - xc = x.c; - r = x.r; - e = x.e; - } - - d = e + dp + 1; - - // The rounding digit, i.e. the digit to the right of the digit that may be rounded up. - i = xc[d]; - k = baseOut / 2; - r = r || d < 0 || xc[d + 1] != null; - - r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) - : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 || - rm == ( x.s < 0 ? 8 : 7 ) ); - - if ( d < 1 || !xc[0] ) { - - // 1^-dp or 0. - str = r ? toFixedPoint( '1', -dp ) : '0'; - } else { - xc.length = d; - - if (r) { - - // Rounding up may mean the previous digit has to be rounded up and so on. - for ( --baseOut; ++xc[--d] > baseOut; ) { - xc[d] = 0; - - if ( !d ) { - ++e; - xc.unshift(1); - } - } - } - - // Determine trailing zeros. - for ( k = xc.length; !xc[--k]; ); - - // E.g. [4, 11, 15] becomes 4bf. - for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) ); - str = toFixedPoint( str, e ); - } - - // The caller will add the sign. - return str; - } - - - // Perform division in the specified base. Called by div and convertBase. - div = (function () { - - // Assume non-zero x and k. - function multiply( x, k, base ) { - var m, temp, xlo, xhi, - carry = 0, - i = x.length, - klo = k % SQRT_BASE, - khi = k / SQRT_BASE | 0; - - for ( x = x.slice(); i--; ) { - xlo = x[i] % SQRT_BASE; - xhi = x[i] / SQRT_BASE | 0; - m = khi * xlo + xhi * klo; - temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry; - carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi; - x[i] = temp % base; - } - - if (carry) x.unshift(carry); - - return x; - } - - function compare( a, b, aL, bL ) { - var i, cmp; - - if ( aL != bL ) { - cmp = aL > bL ? 1 : -1; - } else { - - for ( i = cmp = 0; i < aL; i++ ) { - - if ( a[i] != b[i] ) { - cmp = a[i] > b[i] ? 1 : -1; - break; - } - } - } - return cmp; - } - - function subtract( a, b, aL, base ) { - var i = 0; - - // Subtract b from a. - for ( ; aL--; ) { - a[aL] -= i; - i = a[aL] < b[aL] ? 1 : 0; - a[aL] = i * base + a[aL] - b[aL]; - } - - // Remove leading zeros. - for ( ; !a[0] && a.length > 1; a.shift() ); - } - - // x: dividend, y: divisor. - return function ( x, y, dp, rm, base ) { - var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, - yL, yz, - s = x.s == y.s ? 1 : -1, - xc = x.c, - yc = y.c; - - // Either NaN, Infinity or 0? - if ( !xc || !xc[0] || !yc || !yc[0] ) { - - return new BigNumber( - - // Return NaN if either NaN, or both Infinity or 0. - !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN : - - // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. - xc && xc[0] == 0 || !yc ? s * 0 : s / 0 - ); - } - - q = new BigNumber(s); - qc = q.c = []; - e = x.e - y.e; - s = dp + e + 1; - - if ( !base ) { - base = BASE; - e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE ); - s = s / LOG_BASE | 0; - } - - // Result exponent may be one less then the current value of e. - // The coefficients of the BigNumbers from convertBase may have trailing zeros. - for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ ); - if ( yc[i] > ( xc[i] || 0 ) ) e--; - - if ( s < 0 ) { - qc.push(1); - more = true; - } else { - xL = xc.length; - yL = yc.length; - i = 0; - s += 2; - - // Normalise xc and yc so highest order digit of yc is >= base / 2. - - n = mathfloor( base / ( yc[0] + 1 ) ); - - // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1. - // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) { - if ( n > 1 ) { - yc = multiply( yc, n, base ); - xc = multiply( xc, n, base ); - yL = yc.length; - xL = xc.length; - } - - xi = yL; - rem = xc.slice( 0, yL ); - remL = rem.length; - - // Add zeros to make remainder as long as divisor. - for ( ; remL < yL; rem[remL++] = 0 ); - yz = yc.slice(); - yz.unshift(0); - yc0 = yc[0]; - if ( yc[1] >= base / 2 ) yc0++; - // Not necessary, but to prevent trial digit n > base, when using base 3. - // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15; - - do { - n = 0; - - // Compare divisor and remainder. - cmp = compare( yc, rem, yL, remL ); - - // If divisor < remainder. - if ( cmp < 0 ) { - - // Calculate trial digit, n. - - rem0 = rem[0]; - if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 ); - - // n is how many times the divisor goes into the current remainder. - n = mathfloor( rem0 / yc0 ); - - // Algorithm: - // 1. product = divisor * trial digit (n) - // 2. if product > remainder: product -= divisor, n-- - // 3. remainder -= product - // 4. if product was < remainder at 2: - // 5. compare new remainder and divisor - // 6. If remainder > divisor: remainder -= divisor, n++ - - if ( n > 1 ) { - - // n may be > base only when base is 3. - if (n >= base) n = base - 1; - - // product = divisor * trial digit. - prod = multiply( yc, n, base ); - prodL = prod.length; - remL = rem.length; - - // Compare product and remainder. - // If product > remainder. - // Trial digit n too high. - // n is 1 too high about 5% of the time, and is not known to have - // ever been more than 1 too high. - while ( compare( prod, rem, prodL, remL ) == 1 ) { - n--; - - // Subtract divisor from product. - subtract( prod, yL < prodL ? yz : yc, prodL, base ); - prodL = prod.length; - cmp = 1; - } - } else { - - // n is 0 or 1, cmp is -1. - // If n is 0, there is no need to compare yc and rem again below, - // so change cmp to 1 to avoid it. - // If n is 1, leave cmp as -1, so yc and rem are compared again. - if ( n == 0 ) { - - // divisor < remainder, so n must be at least 1. - cmp = n = 1; - } - - // product = divisor - prod = yc.slice(); - prodL = prod.length; - } - - if ( prodL < remL ) prod.unshift(0); - - // Subtract product from remainder. - subtract( rem, prod, remL, base ); - remL = rem.length; - - // If product was < remainder. - if ( cmp == -1 ) { - - // Compare divisor and new remainder. - // If divisor < new remainder, subtract divisor from remainder. - // Trial digit n too low. - // n is 1 too low about 5% of the time, and very rarely 2 too low. - while ( compare( yc, rem, yL, remL ) < 1 ) { - n++; - - // Subtract divisor from remainder. - subtract( rem, yL < remL ? yz : yc, remL, base ); - remL = rem.length; - } - } - } else if ( cmp === 0 ) { - n++; - rem = [0]; - } // else cmp === 1 and n will be 0 - - // Add the next digit, n, to the result array. - qc[i++] = n; - - // Update the remainder. - if ( rem[0] ) { - rem[remL++] = xc[xi] || 0; - } else { - rem = [ xc[xi] ]; - remL = 1; - } - } while ( ( xi++ < xL || rem[0] != null ) && s-- ); - - more = rem[0] != null; - - // Leading zero? - if ( !qc[0] ) qc.shift(); - } - - if ( base == BASE ) { - - // To calculate q.e, first get the number of digits of qc[0]. - for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ ); - round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more ); - - // Caller is convertBase. - } else { - q.e = e; - q.r = +more; - } - - return q; - }; - })(); - - - /* - * Return a string representing the value of BigNumber n in fixed-point or exponential - * notation rounded to the specified decimal places or significant digits. - * - * n is a BigNumber. - * i is the index of the last digit required (i.e. the digit that may be rounded up). - * rm is the rounding mode. - * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24. - */ - function format( n, i, rm, caller ) { - var c0, e, ne, len, str; - - rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode ) - ? rm | 0 : ROUNDING_MODE; - - if ( !n.c ) return n.toString(); - c0 = n.c[0]; - ne = n.e; - - if ( i == null ) { - str = coeffToString( n.c ); - str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG - ? toExponential( str, ne ) - : toFixedPoint( str, ne ); - } else { - n = round( new BigNumber(n), i, rm ); - - // n.e may have changed if the value was rounded up. - e = n.e; - - str = coeffToString( n.c ); - len = str.length; - - // toPrecision returns exponential notation if the number of significant digits - // specified is less than the number of digits necessary to represent the integer - // part of the value in fixed-point notation. - - // Exponential notation. - if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) { - - // Append zeros? - for ( ; len < i; str += '0', len++ ); - str = toExponential( str, e ); - - // Fixed-point notation. - } else { - i -= ne; - str = toFixedPoint( str, e ); - - // Append zeros? - if ( e + 1 > len ) { - if ( --i > 0 ) for ( str += '.'; i--; str += '0' ); - } else { - i += e - len; - if ( i > 0 ) { - if ( e + 1 == len ) str += '.'; - for ( ; i--; str += '0' ); - } - } - } - } - - return n.s < 0 && c0 ? '-' + str : str; - } - - - // Handle BigNumber.max and BigNumber.min. - function maxOrMin( args, method ) { - var m, n, - i = 0; - - if ( isArray( args[0] ) ) args = args[0]; - m = new BigNumber( args[0] ); - - for ( ; ++i < args.length; ) { - n = new BigNumber( args[i] ); - - // If any number is NaN, return NaN. - if ( !n.s ) { - m = n; - break; - } else if ( method.call( m, n ) ) { - m = n; - } - } - - return m; - } - - - /* - * Return true if n is an integer in range, otherwise throw. - * Use for argument validation when ERRORS is true. - */ - function intValidatorWithErrors( n, min, max, caller, name ) { - if ( n < min || n > max || n != truncate(n) ) { - raise( caller, ( name || 'decimal places' ) + - ( n < min || n > max ? ' out of range' : ' not an integer' ), n ); - } - - return true; - } - - - /* - * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. - * Called by minus, plus and times. - */ - function normalise( n, c, e ) { - var i = 1, - j = c.length; - - // Remove trailing zeros. - for ( ; !c[--j]; c.pop() ); - - // Calculate the base 10 exponent. First get the number of digits of c[0]. - for ( j = c[0]; j >= 10; j /= 10, i++ ); - - // Overflow? - if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) { - - // Infinity. - n.c = n.e = null; - - // Underflow? - } else if ( e < MIN_EXP ) { - - // Zero. - n.c = [ n.e = 0 ]; - } else { - n.e = e; - n.c = c; - } - - return n; - } - - - // Handle values that fail the validity test in BigNumber. - parseNumeric = (function () { - var basePrefix = /^(-?)0([xbo])/i, - dotAfter = /^([^.]+)\.$/, - dotBefore = /^\.([^.]+)$/, - isInfinityOrNaN = /^-?(Infinity|NaN)$/, - whitespaceOrPlus = /^\s*\+|^\s+|\s+$/g; - - return function ( x, str, num, b ) { - var base, - s = num ? str : str.replace( whitespaceOrPlus, '' ); - - // No exception on ±Infinity or NaN. - if ( isInfinityOrNaN.test(s) ) { - x.s = isNaN(s) ? null : s < 0 ? -1 : 1; - } else { - if ( !num ) { - - // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i - s = s.replace( basePrefix, function ( m, p1, p2 ) { - base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8; - return !b || b == base ? p1 : m; - }); - - if (b) { - base = b; - - // E.g. '1.' to '1', '.1' to '0.1' - s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' ); - } - - if ( str != s ) return new BigNumber( s, base ); - } - - // 'new BigNumber() not a number: {n}' - // 'new BigNumber() not a base {b} number: {n}' - if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str ); - x.s = null; - } - - x.c = x.e = null; - id = 0; - } - })(); - - - // Throw a BigNumber Error. - function raise( caller, msg, val ) { - var error = new Error( [ - 'new BigNumber', // 0 - 'cmp', // 1 - 'config', // 2 - 'div', // 3 - 'divToInt', // 4 - 'eq', // 5 - 'gt', // 6 - 'gte', // 7 - 'lt', // 8 - 'lte', // 9 - 'minus', // 10 - 'mod', // 11 - 'plus', // 12 - 'precision', // 13 - 'random', // 14 - 'round', // 15 - 'shift', // 16 - 'times', // 17 - 'toDigits', // 18 - 'toExponential', // 19 - 'toFixed', // 20 - 'toFormat', // 21 - 'toFraction', // 22 - 'pow', // 23 - 'toPrecision', // 24 - 'toString', // 25 - 'BigNumber' // 26 - ][caller] + '() ' + msg + ': ' + val ); - - error.name = 'BigNumber Error'; - id = 0; - throw error; - } - - - /* - * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. - * If r is truthy, it is known that there are more digits after the rounding digit. - */ - function round( x, sd, rm, r ) { - var d, i, j, k, n, ni, rd, - xc = x.c, - pows10 = POWS_TEN; - - // if x is not Infinity or NaN... - if (xc) { - - // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. - // n is a base 1e14 number, the value of the element of array x.c containing rd. - // ni is the index of n within x.c. - // d is the number of digits of n. - // i is the index of rd within n including leading zeros. - // j is the actual index of rd within n (if < 0, rd is a leading zero). - out: { - - // Get the number of digits of the first element of xc. - for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ ); - i = sd - d; - - // If the rounding digit is in the first element of xc... - if ( i < 0 ) { - i += LOG_BASE; - j = sd; - n = xc[ ni = 0 ]; - - // Get the rounding digit at index j of n. - rd = n / pows10[ d - j - 1 ] % 10 | 0; - } else { - ni = mathceil( ( i + 1 ) / LOG_BASE ); - - if ( ni >= xc.length ) { - - if (r) { - - // Needed by sqrt. - for ( ; xc.length <= ni; xc.push(0) ); - n = rd = 0; - d = 1; - i %= LOG_BASE; - j = i - LOG_BASE + 1; - } else { - break out; - } - } else { - n = k = xc[ni]; - - // Get the number of digits of n. - for ( d = 1; k >= 10; k /= 10, d++ ); - - // Get the index of rd within n. - i %= LOG_BASE; - - // Get the index of rd within n, adjusted for leading zeros. - // The number of leading zeros of n is given by LOG_BASE - d. - j = i - LOG_BASE + d; - - // Get the rounding digit at index j of n. - rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0; - } - } - - r = r || sd < 0 || - - // Are there any non-zero digits after the rounding digit? - // The expression n % pows10[ d - j - 1 ] returns all digits of n to the right - // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. - xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] ); - - r = rm < 4 - ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) - : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 && - - // Check whether the digit to the left of the rounding digit is odd. - ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 || - rm == ( x.s < 0 ? 8 : 7 ) ); - - if ( sd < 1 || !xc[0] ) { - xc.length = 0; - - if (r) { - - // Convert sd to decimal places. - sd -= x.e + 1; - - // 1, 0.1, 0.01, 0.001, 0.0001 etc. - xc[0] = pows10[ sd % LOG_BASE ]; - x.e = -sd || 0; - } else { - - // Zero. - xc[0] = x.e = 0; - } - - return x; - } - - // Remove excess digits. - if ( i == 0 ) { - xc.length = ni; - k = 1; - ni--; - } else { - xc.length = ni + 1; - k = pows10[ LOG_BASE - i ]; - - // E.g. 56700 becomes 56000 if 7 is the rounding digit. - // j > 0 means i > number of leading zeros of n. - xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0; - } - - // Round up? - if (r) { - - for ( ; ; ) { - - // If the digit to be rounded up is in the first element of xc... - if ( ni == 0 ) { - - // i will be the length of xc[0] before k is added. - for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ ); - j = xc[0] += k; - for ( k = 1; j >= 10; j /= 10, k++ ); - - // if i != k the length has increased. - if ( i != k ) { - x.e++; - if ( xc[0] == BASE ) xc[0] = 1; - } - - break; - } else { - xc[ni] += k; - if ( xc[ni] != BASE ) break; - xc[ni--] = 0; - k = 1; - } - } - } - - // Remove trailing zeros. - for ( i = xc.length; xc[--i] === 0; xc.pop() ); - } - - // Overflow? Infinity. - if ( x.e > MAX_EXP ) { - x.c = x.e = null; - - // Underflow? Zero. - } else if ( x.e < MIN_EXP ) { - x.c = [ x.e = 0 ]; - } - } - - return x; - } - - - // PROTOTYPE/INSTANCE METHODS - - - /* - * Return a new BigNumber whose value is the absolute value of this BigNumber. - */ - P.absoluteValue = P.abs = function () { - var x = new BigNumber(this); - if ( x.s < 0 ) x.s = 1; - return x; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole - * number in the direction of Infinity. - */ - P.ceil = function () { - return round( new BigNumber(this), this.e + 1, 2 ); - }; - - - /* - * Return - * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), - * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), - * 0 if they have the same value, - * or null if the value of either is NaN. - */ - P.comparedTo = P.cmp = function ( y, b ) { - id = 1; - return compare( this, new BigNumber( y, b ) ); - }; - - - /* - * Return the number of decimal places of the value of this BigNumber, or null if the value - * of this BigNumber is ±Infinity or NaN. - */ - P.decimalPlaces = P.dp = function () { - var n, v, - c = this.c; - - if ( !c ) return null; - n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE; - - // Subtract the number of trailing zeros of the last number. - if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- ); - if ( n < 0 ) n = 0; - - return n; - }; - - - /* - * n / 0 = I - * n / N = N - * n / I = 0 - * 0 / n = 0 - * 0 / 0 = N - * 0 / N = N - * 0 / I = 0 - * N / n = N - * N / 0 = N - * N / N = N - * N / I = N - * I / n = I - * I / 0 = I - * I / N = N - * I / I = N - * - * Return a new BigNumber whose value is the value of this BigNumber divided by the value of - * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. - */ - P.dividedBy = P.div = function ( y, b ) { - id = 3; - return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE ); - }; - - - /* - * Return a new BigNumber whose value is the integer part of dividing the value of this - * BigNumber by the value of BigNumber(y, b). - */ - P.dividedToIntegerBy = P.divToInt = function ( y, b ) { - id = 4; - return div( this, new BigNumber( y, b ), 0, 1 ); - }; - - - /* - * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), - * otherwise returns false. - */ - P.equals = P.eq = function ( y, b ) { - id = 5; - return compare( this, new BigNumber( y, b ) ) === 0; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole - * number in the direction of -Infinity. - */ - P.floor = function () { - return round( new BigNumber(this), this.e + 1, 3 ); - }; - - - /* - * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), - * otherwise returns false. - */ - P.greaterThan = P.gt = function ( y, b ) { - id = 6; - return compare( this, new BigNumber( y, b ) ) > 0; - }; - - - /* - * Return true if the value of this BigNumber is greater than or equal to the value of - * BigNumber(y, b), otherwise returns false. - */ - P.greaterThanOrEqualTo = P.gte = function ( y, b ) { - id = 7; - return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0; - - }; - - - /* - * Return true if the value of this BigNumber is a finite number, otherwise returns false. - */ - P.isFinite = function () { - return !!this.c; - }; - - - /* - * Return true if the value of this BigNumber is an integer, otherwise return false. - */ - P.isInteger = P.isInt = function () { - return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2; - }; - - - /* - * Return true if the value of this BigNumber is NaN, otherwise returns false. - */ - P.isNaN = function () { - return !this.s; - }; - - - /* - * Return true if the value of this BigNumber is negative, otherwise returns false. - */ - P.isNegative = P.isNeg = function () { - return this.s < 0; - }; - - - /* - * Return true if the value of this BigNumber is 0 or -0, otherwise returns false. - */ - P.isZero = function () { - return !!this.c && this.c[0] == 0; - }; - - - /* - * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), - * otherwise returns false. - */ - P.lessThan = P.lt = function ( y, b ) { - id = 8; - return compare( this, new BigNumber( y, b ) ) < 0; - }; - - - /* - * Return true if the value of this BigNumber is less than or equal to the value of - * BigNumber(y, b), otherwise returns false. - */ - P.lessThanOrEqualTo = P.lte = function ( y, b ) { - id = 9; - return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0; - }; - - - /* - * n - 0 = n - * n - N = N - * n - I = -I - * 0 - n = -n - * 0 - 0 = 0 - * 0 - N = N - * 0 - I = -I - * N - n = N - * N - 0 = N - * N - N = N - * N - I = N - * I - n = I - * I - 0 = I - * I - N = N - * I - I = N - * - * Return a new BigNumber whose value is the value of this BigNumber minus the value of - * BigNumber(y, b). - */ - P.minus = P.sub = function ( y, b ) { - var i, j, t, xLTy, - x = this, - a = x.s; - - id = 10; - y = new BigNumber( y, b ); - b = y.s; - - // Either NaN? - if ( !a || !b ) return new BigNumber(NaN); - - // Signs differ? - if ( a != b ) { - y.s = -b; - return x.plus(y); - } - - var xe = x.e / LOG_BASE, - ye = y.e / LOG_BASE, - xc = x.c, - yc = y.c; - - if ( !xe || !ye ) { - - // Either Infinity? - if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN ); - - // Either zero? - if ( !xc[0] || !yc[0] ) { - - // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. - return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x : - - // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity - ROUNDING_MODE == 3 ? -0 : 0 ); - } - } - - xe = bitFloor(xe); - ye = bitFloor(ye); - xc = xc.slice(); - - // Determine which is the bigger number. - if ( a = xe - ye ) { - - if ( xLTy = a < 0 ) { - a = -a; - t = xc; - } else { - ye = xe; - t = yc; - } - - t.reverse(); - - // Prepend zeros to equalise exponents. - for ( b = a; b--; t.push(0) ); - t.reverse(); - } else { - - // Exponents equal. Check digit by digit. - j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b; - - for ( a = b = 0; b < j; b++ ) { - - if ( xc[b] != yc[b] ) { - xLTy = xc[b] < yc[b]; - break; - } - } - } - - // x < y? Point xc to the array of the bigger number. - if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s; - - b = ( j = yc.length ) - ( i = xc.length ); - - // Append zeros to xc if shorter. - // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. - if ( b > 0 ) for ( ; b--; xc[i++] = 0 ); - b = BASE - 1; - - // Subtract yc from xc. - for ( ; j > a; ) { - - if ( xc[--j] < yc[j] ) { - for ( i = j; i && !xc[--i]; xc[i] = b ); - --xc[i]; - xc[j] += BASE; - } - - xc[j] -= yc[j]; - } - - // Remove leading zeros and adjust exponent accordingly. - for ( ; xc[0] == 0; xc.shift(), --ye ); - - // Zero? - if ( !xc[0] ) { - - // Following IEEE 754 (2008) 6.3, - // n - n = +0 but n - n = -0 when rounding towards -Infinity. - y.s = ROUNDING_MODE == 3 ? -1 : 1; - y.c = [ y.e = 0 ]; - return y; - } - - // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity - // for finite x and y. - return normalise( y, xc, ye ); - }; - - - /* - * n % 0 = N - * n % N = N - * n % I = n - * 0 % n = 0 - * -0 % n = -0 - * 0 % 0 = N - * 0 % N = N - * 0 % I = 0 - * N % n = N - * N % 0 = N - * N % N = N - * N % I = N - * I % n = N - * I % 0 = N - * I % N = N - * I % I = N - * - * Return a new BigNumber whose value is the value of this BigNumber modulo the value of - * BigNumber(y, b). The result depends on the value of MODULO_MODE. - */ - P.modulo = P.mod = function ( y, b ) { - var q, s, - x = this; - - id = 11; - y = new BigNumber( y, b ); - - // Return NaN if x is Infinity or NaN, or y is NaN or zero. - if ( !x.c || !y.s || y.c && !y.c[0] ) { - return new BigNumber(NaN); - - // Return x if y is Infinity or x is zero. - } else if ( !y.c || x.c && !x.c[0] ) { - return new BigNumber(x); - } - - if ( MODULO_MODE == 9 ) { - - // Euclidian division: q = sign(y) * floor(x / abs(y)) - // r = x - qy where 0 <= r < abs(y) - s = y.s; - y.s = 1; - q = div( x, y, 0, 3 ); - y.s = s; - q.s *= s; - } else { - q = div( x, y, 0, MODULO_MODE ); - } - - return x.minus( q.times(y) ); - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber negated, - * i.e. multiplied by -1. - */ - P.negated = P.neg = function () { - var x = new BigNumber(this); - x.s = -x.s || null; - return x; - }; - - - /* - * n + 0 = n - * n + N = N - * n + I = I - * 0 + n = n - * 0 + 0 = 0 - * 0 + N = N - * 0 + I = I - * N + n = N - * N + 0 = N - * N + N = N - * N + I = N - * I + n = I - * I + 0 = I - * I + N = N - * I + I = I - * - * Return a new BigNumber whose value is the value of this BigNumber plus the value of - * BigNumber(y, b). - */ - P.plus = P.add = function ( y, b ) { - var t, - x = this, - a = x.s; - - id = 12; - y = new BigNumber( y, b ); - b = y.s; - - // Either NaN? - if ( !a || !b ) return new BigNumber(NaN); - - // Signs differ? - if ( a != b ) { - y.s = -b; - return x.minus(y); - } - - var xe = x.e / LOG_BASE, - ye = y.e / LOG_BASE, - xc = x.c, - yc = y.c; - - if ( !xe || !ye ) { - - // Return ±Infinity if either ±Infinity. - if ( !xc || !yc ) return new BigNumber( a / 0 ); - - // Either zero? - // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. - if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 ); - } - - xe = bitFloor(xe); - ye = bitFloor(ye); - xc = xc.slice(); - - // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. - if ( a = xe - ye ) { - if ( a > 0 ) { - ye = xe; - t = yc; - } else { - a = -a; - t = xc; - } - - t.reverse(); - for ( ; a--; t.push(0) ); - t.reverse(); - } - - a = xc.length; - b = yc.length; - - // Point xc to the longer array, and b to the shorter length. - if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a; - - // Only start adding at yc.length - 1 as the further digits of xc can be ignored. - for ( a = 0; b; ) { - a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0; - xc[b] %= BASE; - } - - if (a) { - xc.unshift(a); - ++ye; - } - - // No need to check for zero, as +x + +y != 0 && -x + -y != 0 - // ye = MAX_EXP + 1 possible - return normalise( y, xc, ye ); - }; - - - /* - * Return the number of significant digits of the value of this BigNumber. - * - * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. - */ - P.precision = P.sd = function (z) { - var n, v, - x = this, - c = x.c; - - // 'precision() argument not a boolean or binary digit: {z}' - if ( z != null && z !== !!z && z !== 1 && z !== 0 ) { - if (ERRORS) raise( 13, 'argument' + notBool, z ); - if ( z != !!z ) z = null; - } - - if ( !c ) return null; - v = c.length - 1; - n = v * LOG_BASE + 1; - - if ( v = c[v] ) { - - // Subtract the number of trailing zeros of the last element. - for ( ; v % 10 == 0; v /= 10, n-- ); - - // Add the number of digits of the first element. - for ( v = c[0]; v >= 10; v /= 10, n++ ); - } - - if ( z && x.e + 1 > n ) n = x.e + 1; - - return n; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of - * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if - * omitted. - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'round() decimal places out of range: {dp}' - * 'round() decimal places not an integer: {dp}' - * 'round() rounding mode not an integer: {rm}' - * 'round() rounding mode out of range: {rm}' - */ - P.round = function ( dp, rm ) { - var n = new BigNumber(this); - - if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) { - round( n, ~~dp + this.e + 1, rm == null || - !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 ); - } - - return n; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber shifted by k places - * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. - * - * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. - * - * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity - * otherwise. - * - * 'shift() argument not an integer: {k}' - * 'shift() argument out of range: {k}' - */ - P.shift = function (k) { - var n = this; - return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' ) - - // k < 1e+21, or truncate(k) will produce exponential notation. - ? n.times( '1e' + truncate(k) ) - : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER ) - ? n.s * ( k < 0 ? 0 : 1 / 0 ) - : n ); - }; - - - /* - * sqrt(-n) = N - * sqrt( N) = N - * sqrt(-I) = N - * sqrt( I) = I - * sqrt( 0) = 0 - * sqrt(-0) = -0 - * - * Return a new BigNumber whose value is the square root of the value of this BigNumber, - * rounded according to DECIMAL_PLACES and ROUNDING_MODE. - */ - P.squareRoot = P.sqrt = function () { - var m, n, r, rep, t, - x = this, - c = x.c, - s = x.s, - e = x.e, - dp = DECIMAL_PLACES + 4, - half = new BigNumber('0.5'); - - // Negative/NaN/Infinity/zero? - if ( s !== 1 || !c || !c[0] ) { - return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 ); - } - - // Initial estimate. - s = Math.sqrt( +x ); - - // Math.sqrt underflow/overflow? - // Pass x to Math.sqrt as integer, then adjust the exponent of the result. - if ( s == 0 || s == 1 / 0 ) { - n = coeffToString(c); - if ( ( n.length + e ) % 2 == 0 ) n += '0'; - s = Math.sqrt(n); - e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 ); - - if ( s == 1 / 0 ) { - n = '1e' + e; - } else { - n = s.toExponential(); - n = n.slice( 0, n.indexOf('e') + 1 ) + e; - } - - r = new BigNumber(n); - } else { - r = new BigNumber( s + '' ); - } - - // Check for zero. - // r could be zero if MIN_EXP is changed after the this value was created. - // This would cause a division by zero (x/t) and hence Infinity below, which would cause - // coeffToString to throw. - if ( r.c[0] ) { - e = r.e; - s = e + dp; - if ( s < 3 ) s = 0; - - // Newton-Raphson iteration. - for ( ; ; ) { - t = r; - r = half.times( t.plus( div( x, t, dp, 1 ) ) ); - - if ( coeffToString( t.c ).slice( 0, s ) === ( n = - coeffToString( r.c ) ).slice( 0, s ) ) { - - // The exponent of r may here be one less than the final result exponent, - // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits - // are indexed correctly. - if ( r.e < e ) --s; - n = n.slice( s - 3, s + 1 ); - - // The 4th rounding digit may be in error by -1 so if the 4 rounding digits - // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the - // iteration. - if ( n == '9999' || !rep && n == '4999' ) { - - // On the first iteration only, check to see if rounding up gives the - // exact result as the nines may infinitely repeat. - if ( !rep ) { - round( t, t.e + DECIMAL_PLACES + 2, 0 ); - - if ( t.times(t).eq(x) ) { - r = t; - break; - } - } - - dp += 4; - s += 4; - rep = 1; - } else { - - // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact - // result. If not, then there are further digits and m will be truthy. - if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) { - - // Truncate to the first rounding digit. - round( r, r.e + DECIMAL_PLACES + 2, 1 ); - m = !r.times(r).eq(x); - } - - break; - } - } - } - } - - return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m ); - }; - - - /* - * n * 0 = 0 - * n * N = N - * n * I = I - * 0 * n = 0 - * 0 * 0 = 0 - * 0 * N = N - * 0 * I = N - * N * n = N - * N * 0 = N - * N * N = N - * N * I = N - * I * n = I - * I * 0 = N - * I * N = N - * I * I = I - * - * Return a new BigNumber whose value is the value of this BigNumber times the value of - * BigNumber(y, b). - */ - P.times = P.mul = function ( y, b ) { - var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, - base, sqrtBase, - x = this, - xc = x.c, - yc = ( id = 17, y = new BigNumber( y, b ) ).c; - - // Either NaN, ±Infinity or ±0? - if ( !xc || !yc || !xc[0] || !yc[0] ) { - - // Return NaN if either is NaN, or one is 0 and the other is Infinity. - if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) { - y.c = y.e = y.s = null; - } else { - y.s *= x.s; - - // Return ±Infinity if either is ±Infinity. - if ( !xc || !yc ) { - y.c = y.e = null; - - // Return ±0 if either is ±0. - } else { - y.c = [0]; - y.e = 0; - } - } - - return y; - } - - e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE ); - y.s *= x.s; - xcL = xc.length; - ycL = yc.length; - - // Ensure xc points to longer array and xcL to its length. - if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i; - - // Initialise the result array with zeros. - for ( i = xcL + ycL, zc = []; i--; zc.push(0) ); - - base = BASE; - sqrtBase = SQRT_BASE; - - for ( i = ycL; --i >= 0; ) { - c = 0; - ylo = yc[i] % sqrtBase; - yhi = yc[i] / sqrtBase | 0; - - for ( k = xcL, j = i + k; j > i; ) { - xlo = xc[--k] % sqrtBase; - xhi = xc[k] / sqrtBase | 0; - m = yhi * xlo + xhi * ylo; - xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c; - c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi; - zc[j--] = xlo % base; - } - - zc[j] = c; - } - - if (c) { - ++e; - } else { - zc.shift(); - } - - return normalise( y, zc, e ); - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of - * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted. - * - * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toDigits() precision out of range: {sd}' - * 'toDigits() precision not an integer: {sd}' - * 'toDigits() rounding mode not an integer: {rm}' - * 'toDigits() rounding mode out of range: {rm}' - */ - P.toDigits = function ( sd, rm ) { - var n = new BigNumber(this); - sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0; - rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0; - return sd ? round( n, sd, rm ) : n; - }; - - - /* - * Return a string representing the value of this BigNumber in exponential notation and - * rounded using ROUNDING_MODE to dp fixed decimal places. - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toExponential() decimal places not an integer: {dp}' - * 'toExponential() decimal places out of range: {dp}' - * 'toExponential() rounding mode not an integer: {rm}' - * 'toExponential() rounding mode out of range: {rm}' - */ - P.toExponential = function ( dp, rm ) { - return format( this, - dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 ); - }; - - - /* - * Return a string representing the value of this BigNumber in fixed-point notation rounding - * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. - * - * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', - * but e.g. (-0.00001).toFixed(0) is '-0'. - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toFixed() decimal places not an integer: {dp}' - * 'toFixed() decimal places out of range: {dp}' - * 'toFixed() rounding mode not an integer: {rm}' - * 'toFixed() rounding mode out of range: {rm}' - */ - P.toFixed = function ( dp, rm ) { - return format( this, dp != null && isValidInt( dp, 0, MAX, 20 ) - ? ~~dp + this.e + 1 : null, rm, 20 ); - }; - - - /* - * Return a string representing the value of this BigNumber in fixed-point notation rounded - * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties - * of the FORMAT object (see BigNumber.config). - * - * FORMAT = { - * decimalSeparator : '.', - * groupSeparator : ',', - * groupSize : 3, - * secondaryGroupSize : 0, - * fractionGroupSeparator : '\xA0', // non-breaking space - * fractionGroupSize : 0 - * }; - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toFormat() decimal places not an integer: {dp}' - * 'toFormat() decimal places out of range: {dp}' - * 'toFormat() rounding mode not an integer: {rm}' - * 'toFormat() rounding mode out of range: {rm}' - */ - P.toFormat = function ( dp, rm ) { - var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 ) - ? ~~dp + this.e + 1 : null, rm, 21 ); - - if ( this.c ) { - var i, - arr = str.split('.'), - g1 = +FORMAT.groupSize, - g2 = +FORMAT.secondaryGroupSize, - groupSeparator = FORMAT.groupSeparator, - intPart = arr[0], - fractionPart = arr[1], - isNeg = this.s < 0, - intDigits = isNeg ? intPart.slice(1) : intPart, - len = intDigits.length; - - if (g2) i = g1, g1 = g2, g2 = i, len -= i; - - if ( g1 > 0 && len > 0 ) { - i = len % g1 || g1; - intPart = intDigits.substr( 0, i ); - - for ( ; i < len; i += g1 ) { - intPart += groupSeparator + intDigits.substr( i, g1 ); - } - - if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i); - if (isNeg) intPart = '-' + intPart; - } - - str = fractionPart - ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize ) - ? fractionPart.replace( new RegExp( '\\d{' + g2 + '}\\B', 'g' ), - '$&' + FORMAT.fractionGroupSeparator ) - : fractionPart ) - : intPart; - } - - return str; - }; - - - /* - * Return a string array representing the value of this BigNumber as a simple fraction with - * an integer numerator and an integer denominator. The denominator will be a positive - * non-zero value less than or equal to the specified maximum denominator. If a maximum - * denominator is not specified, the denominator will be the lowest value necessary to - * represent the number exactly. - * - * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator. - * - * 'toFraction() max denominator not an integer: {md}' - * 'toFraction() max denominator out of range: {md}' - */ - P.toFraction = function (md) { - var arr, d0, d2, e, exp, n, n0, q, s, - k = ERRORS, - x = this, - xc = x.c, - d = new BigNumber(ONE), - n1 = d0 = new BigNumber(ONE), - d1 = n0 = new BigNumber(ONE); - - if ( md != null ) { - ERRORS = false; - n = new BigNumber(md); - ERRORS = k; - - if ( !( k = n.isInt() ) || n.lt(ONE) ) { - - if (ERRORS) { - raise( 22, - 'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md ); - } - - // ERRORS is false: - // If md is a finite non-integer >= 1, round it to an integer and use it. - md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null; - } - } - - if ( !xc ) return x.toString(); - s = coeffToString(xc); - - // Determine initial denominator. - // d is a power of 10 and the minimum max denominator that specifies the value exactly. - e = d.e = s.length - x.e - 1; - d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ]; - md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n; - - exp = MAX_EXP; - MAX_EXP = 1 / 0; - n = new BigNumber(s); - - // n0 = d1 = 0 - n0.c[0] = 0; - - for ( ; ; ) { - q = div( n, d, 0, 1 ); - d2 = d0.plus( q.times(d1) ); - if ( d2.cmp(md) == 1 ) break; - d0 = d1; - d1 = d2; - n1 = n0.plus( q.times( d2 = n1 ) ); - n0 = d2; - d = n.minus( q.times( d2 = d ) ); - n = d2; - } - - d2 = div( md.minus(d0), d1, 0, 1 ); - n0 = n0.plus( d2.times(n1) ); - d0 = d0.plus( d2.times(d1) ); - n0.s = n1.s = x.s; - e *= 2; - - // Determine which fraction is closer to x, n0/d0 or n1/d1 - arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp( - div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1 - ? [ n1.toString(), d1.toString() ] - : [ n0.toString(), d0.toString() ]; - - MAX_EXP = exp; - return arr; - }; - - - /* - * Return the value of this BigNumber converted to a number primitive. - */ - P.toNumber = function () { - var x = this; - - // Ensure zero has correct sign. - return +x || ( x.s ? x.s * 0 : NaN ); - }; - - - /* - * Return a BigNumber whose value is the value of this BigNumber raised to the power n. - * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. - * If POW_PRECISION is not 0, round to POW_PRECISION using ROUNDING_MODE. - * - * n {number} Integer, -9007199254740992 to 9007199254740992 inclusive. - * (Performs 54 loop iterations for n of 9007199254740992.) - * - * 'pow() exponent not an integer: {n}' - * 'pow() exponent out of range: {n}' - */ - P.toPower = P.pow = function (n) { - var k, y, - i = mathfloor( n < 0 ? -n : +n ), - x = this; - - // Pass ±Infinity to Math.pow if exponent is out of range. - if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) && - ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) || - parseFloat(n) != n && !( n = NaN ) ) ) { - return new BigNumber( Math.pow( +x, n ) ); - } - - // Truncating each coefficient array to a length of k after each multiplication equates - // to truncating significant digits to POW_PRECISION + [28, 41], i.e. there will be a - // minimum of 28 guard digits retained. (Using + 1.5 would give [9, 21] guard digits.) - k = POW_PRECISION ? mathceil( POW_PRECISION / LOG_BASE + 2 ) : 0; - y = new BigNumber(ONE); - - for ( ; ; ) { - - if ( i % 2 ) { - y = y.times(x); - if ( !y.c ) break; - if ( k && y.c.length > k ) y.c.length = k; - } - - i = mathfloor( i / 2 ); - if ( !i ) break; - - x = x.times(x); - if ( k && x.c && x.c.length > k ) x.c.length = k; - } - - if ( n < 0 ) y = ONE.div(y); - return k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y; - }; - - - /* - * Return a string representing the value of this BigNumber rounded to sd significant digits - * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits - * necessary to represent the integer part of the value in fixed-point notation, then use - * exponential notation. - * - * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toPrecision() precision not an integer: {sd}' - * 'toPrecision() precision out of range: {sd}' - * 'toPrecision() rounding mode not an integer: {rm}' - * 'toPrecision() rounding mode out of range: {rm}' - */ - P.toPrecision = function ( sd, rm ) { - return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' ) - ? sd | 0 : null, rm, 24 ); - }; - - - /* - * Return a string representing the value of this BigNumber in base b, or base 10 if b is - * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and - * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent - * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than - * TO_EXP_NEG, return exponential notation. - * - * [b] {number} Integer, 2 to 64 inclusive. - * - * 'toString() base not an integer: {b}' - * 'toString() base out of range: {b}' - */ - P.toString = function (b) { - var str, - n = this, - s = n.s, - e = n.e; - - // Infinity or NaN? - if ( e === null ) { - - if (s) { - str = 'Infinity'; - if ( s < 0 ) str = '-' + str; - } else { - str = 'NaN'; - } - } else { - str = coeffToString( n.c ); - - if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) { - str = e <= TO_EXP_NEG || e >= TO_EXP_POS - ? toExponential( str, e ) - : toFixedPoint( str, e ); - } else { - str = convertBase( toFixedPoint( str, e ), b | 0, 10, s ); - } - - if ( s < 0 && n.c[0] ) str = '-' + str; - } - - return str; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole - * number. - */ - P.truncated = P.trunc = function () { - return round( new BigNumber(this), this.e + 1, 1 ); - }; - - - - /* - * Return as toString, but do not accept a base argument. - */ - P.valueOf = P.toJSON = function () { - return this.toString(); - }; - - - // Aliases for BigDecimal methods. - //P.add = P.plus; // P.add included above - //P.subtract = P.minus; // P.sub included above - //P.multiply = P.times; // P.mul included above - //P.divide = P.div; - //P.remainder = P.mod; - //P.compareTo = P.cmp; - //P.negate = P.neg; - - - if ( configObj != null ) BigNumber.config(configObj); - - return BigNumber; - } - - - // PRIVATE HELPER FUNCTIONS - - - function bitFloor(n) { - var i = n | 0; - return n > 0 || n === i ? i : i - 1; - } - - - // Return a coefficient array as a string of base 10 digits. - function coeffToString(a) { - var s, z, - i = 1, - j = a.length, - r = a[0] + ''; - - for ( ; i < j; ) { - s = a[i++] + ''; - z = LOG_BASE - s.length; - for ( ; z--; s = '0' + s ); - r += s; - } - - // Determine trailing zeros. - for ( j = r.length; r.charCodeAt(--j) === 48; ); - return r.slice( 0, j + 1 || 1 ); - } - - - // Compare the value of BigNumbers x and y. - function compare( x, y ) { - var a, b, - xc = x.c, - yc = y.c, - i = x.s, - j = y.s, - k = x.e, - l = y.e; - - // Either NaN? - if ( !i || !j ) return null; - - a = xc && !xc[0]; - b = yc && !yc[0]; - - // Either zero? - if ( a || b ) return a ? b ? 0 : -j : i; - - // Signs differ? - if ( i != j ) return i; - - a = i < 0; - b = k == l; - - // Either Infinity? - if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1; - - // Compare exponents. - if ( !b ) return k > l ^ a ? 1 : -1; - - j = ( k = xc.length ) < ( l = yc.length ) ? k : l; - - // Compare digit by digit. - for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1; - - // Compare lengths. - return k == l ? 0 : k > l ^ a ? 1 : -1; - } - - - /* - * Return true if n is a valid number in range, otherwise false. - * Use for argument validation when ERRORS is false. - * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10. - */ - function intValidatorNoErrors( n, min, max ) { - return ( n = truncate(n) ) >= min && n <= max; - } - - - function isArray(obj) { - return Object.prototype.toString.call(obj) == '[object Array]'; - } - - - /* - * Convert string of baseIn to an array of numbers of baseOut. - * Eg. convertBase('255', 10, 16) returns [15, 15]. - * Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. - */ - function toBaseOut( str, baseIn, baseOut ) { - var j, - arr = [0], - arrL, - i = 0, - len = str.length; - - for ( ; i < len; ) { - for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn ); - arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) ); - - for ( ; j < arr.length; j++ ) { - - if ( arr[j] > baseOut - 1 ) { - if ( arr[j + 1] == null ) arr[j + 1] = 0; - arr[j + 1] += arr[j] / baseOut | 0; - arr[j] %= baseOut; - } - } - } - - return arr.reverse(); - } - - - function toExponential( str, e ) { - return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) + - ( e < 0 ? 'e' : 'e+' ) + e; - } - - - function toFixedPoint( str, e ) { - var len, z; - - // Negative exponent? - if ( e < 0 ) { - - // Prepend zeros. - for ( z = '0.'; ++e; z += '0' ); - str = z + str; - - // Positive exponent - } else { - len = str.length; - - // Append zeros. - if ( ++e > len ) { - for ( z = '0', e -= len; --e; z += '0' ); - str += z; - } else if ( e < len ) { - str = str.slice( 0, e ) + '.' + str.slice(e); - } - } - - return str; - } - - - function truncate(n) { - n = parseFloat(n); - return n < 0 ? mathceil(n) : mathfloor(n); - } - - - // EXPORT - - - BigNumber = another(); - - // AMD. - if ( typeof define == 'function' && define.amd ) { - define( function () { return BigNumber; } ); - - // Node and other environments that support module.exports. - } else if ( typeof module != 'undefined' && module.exports ) { - module.exports = BigNumber; - if ( !crypto ) try { crypto = require('crypto'); } catch (e) {} - - // Browser. - } else { - global.BigNumber = BigNumber; - } -})(this); - -},{"crypto":50}],"web3":[function(require,module,exports){ +},{}],"web3":[function(require,module,exports){ var Web3 = require('./lib/web3'); // dont override global variable @@ -16148,4 +13625,4 @@ if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') { module.exports = Web3; },{"./lib/web3":22}]},{},["web3"]) -//# sourceMappingURL=web3.js.map +//# sourceMappingURL=web3-light.js.map diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 215eae7010..1ae6e2d738 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -528,109 +528,6 @@ const Shh_JS = ` web3._extend({ property: 'shh', methods: [ - new web3._extend.Method({ - name: 'setMaxMessageLength', - call: 'shh_setMaxMessageLength', - params: 1 - }), - new web3._extend.Method({ - name: 'setMinimumPoW', - call: 'shh_setMinimumPoW', - params: 1 - }), - new web3._extend.Method({ - name: 'markTrustedPeer', - call: 'shh_markTrustedPeer', - params: 1 - }), - new web3._extend.Method({ - name: 'hasKeyPair', - call: 'shh_hasKeyPair', - params: 1 - }), - new web3._extend.Method({ - name: 'deleteKeyPair', - call: 'shh_deleteKeyPair', - params: 1 - }), - new web3._extend.Method({ - name: 'newKeyPair', - call: 'shh_newKeyPair' - }), - new web3._extend.Method({ - name: 'getPublicKey', - call: 'shh_getPublicKey', - params: 1 - }), - new web3._extend.Method({ - name: 'getPrivateKey', - call: 'shh_getPrivateKey', - params: 1 - }), - new web3._extend.Method({ - name: 'newSymKey', - call: 'shh_newSymKey', - }), - new web3._extend.Method({ - name: 'addSymKey', - call: 'shh_addSymKey', - params: 1 - }), - new web3._extend.Method({ - name: 'generateSymKeyFromPassword', - call: 'shh_generateSymKeyFromPassword', - params: 1 - }), - new web3._extend.Method({ - name: 'hasSymKey', - call: 'shh_hasSymKey', - params: 1 - }), - new web3._extend.Method({ - name: 'getSymKey', - call: 'shh_getSymKey', - params: 1 - }), - new web3._extend.Method({ - name: 'deleteSymKey', - call: 'shh_deleteSymKey', - params: 1 - }), - new web3._extend.Method({ - name: 'subscribe', - call: 'shh_subscribe', - params: 2 - }), - new web3._extend.Method({ - name: 'unsubscribe', - call: 'shh_unsubscribe', - params: 1 - }), - new web3._extend.Method({ - name: 'post', - call: 'shh_post', - params: 1 - }), - new web3._extend.Method({ - name: 'publicKey', - call: 'shh_getPublicKey', - params: 1 - }), - new web3._extend.Method({ - name: 'getFilterMessages', - call: 'shh_getFilterMessages', - params: 1 - }), - new web3._extend.Method({ - name: 'deleteMessageFilter', - call: 'shh_deleteMessageFilter', - params: 1 - }), - new web3._extend.Method({ - name: 'newMessageFilter', - call: 'shh_newMessageFilter', - params: 1 - }), ], properties: [ From 7a045af05b93c323f63c7af41423ded701ce3890 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Fri, 6 Oct 2017 16:04:21 +0200 Subject: [PATCH 198/272] whisper/whisperv5: set filter SymKeyHash on creation (#15165) --- whisper/whisperv5/api.go | 2 +- whisper/whisperv5/config.go | 2 - whisper/whisperv5/filter.go | 12 +- whisper/whisperv5/filter_test.go | 107 ++++++++++++-- whisper/whisperv5/whisper_test.go | 225 ++++++++++++++++++++++++++++++ 5 files changed, 331 insertions(+), 17 deletions(-) diff --git a/whisper/whisperv5/api.go b/whisper/whisperv5/api.go index ec22f0d1d0..96c4b0e6c4 100644 --- a/whisper/whisperv5/api.go +++ b/whisper/whisperv5/api.go @@ -104,7 +104,7 @@ func (api *PublicWhisperAPI) Info(ctx context.Context) Info { stats := api.w.Stats() return Info{ Memory: stats.memoryUsed, - Messages: len(api.w.messageQueue) + len(api.w.p2pMsgQueue), + Messages: len(api.w.messageQueue) + len(api.w.p2pMsgQueue), MinPow: api.w.MinPow(), MaxMessageSize: api.w.MaxMessageSize(), } diff --git a/whisper/whisperv5/config.go b/whisper/whisperv5/config.go index 290bf8962b..fcc2307046 100644 --- a/whisper/whisperv5/config.go +++ b/whisper/whisperv5/config.go @@ -25,5 +25,3 @@ var DefaultConfig = Config{ MaxMessageSize: DefaultMaxMessageSize, MinimumAcceptedPOW: DefaultMinimumPoW, } - -var () diff --git a/whisper/whisperv5/filter.go b/whisper/whisperv5/filter.go index d571160d7f..b5e893e0ff 100644 --- a/whisper/whisperv5/filter.go +++ b/whisper/whisperv5/filter.go @@ -22,6 +22,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" ) @@ -68,6 +69,10 @@ func (fs *Filters) Install(watcher *Filter) (string, error) { return "", fmt.Errorf("failed to generate unique ID") } + if watcher.expectsSymmetricEncryption() { + watcher.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym) + } + fs.watchers[id] = watcher return id, err } @@ -119,7 +124,9 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) { if match && msg != nil { log.Trace("processing message: decrypted", "hash", env.Hash().Hex()) - watcher.Trigger(msg) + if watcher.Src == nil || IsPubKeyEqual(msg.Src, watcher.Src) { + watcher.Trigger(msg) + } } } } @@ -172,9 +179,6 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool { if f.PoW > 0 && msg.PoW < f.PoW { return false } - if f.Src != nil && !IsPubKeyEqual(msg.Src, f.Src) { - return false - } if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() { return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic) diff --git a/whisper/whisperv5/filter_test.go b/whisper/whisperv5/filter_test.go index 4ce87eee22..bd35e7f20f 100644 --- a/whisper/whisperv5/filter_test.go +++ b/whisper/whisperv5/filter_test.go @@ -132,6 +132,103 @@ func TestInstallFilters(t *testing.T) { } } +func TestInstallSymKeyGeneratesHash(t *testing.T) { + InitSingleTest() + + w := New(&Config{}) + filters := NewFilters(w) + filter, _ := generateFilter(t, true) + + // save the current SymKeyHash for comparison + initialSymKeyHash := filter.SymKeyHash + + // ensure the SymKeyHash is invalid, for Install to recreate it + var invalid common.Hash + filter.SymKeyHash = invalid + + _, err := filters.Install(filter) + + if err != nil { + t.Fatalf("Error installing the filter: %s", err) + } + + for i, b := range filter.SymKeyHash { + if b != initialSymKeyHash[i] { + t.Fatalf("The filter's symmetric key hash was not properly generated by Install") + } + } +} + +func TestInstallIdenticalFilters(t *testing.T) { + InitSingleTest() + + w := New(&Config{}) + filters := NewFilters(w) + filter1, _ := generateFilter(t, true) + + // Copy the first filter since some of its fields + // are randomly gnerated. + filter2 := &Filter{ + KeySym: filter1.KeySym, + Topics: filter1.Topics, + PoW: filter1.PoW, + AllowP2P: filter1.AllowP2P, + Messages: make(map[common.Hash]*ReceivedMessage), + } + + _, err := filters.Install(filter1) + + if err != nil { + t.Fatalf("Error installing the first filter with seed %d: %s", seed, err) + } + + _, err = filters.Install(filter2) + + if err != nil { + t.Fatalf("Error installing the second filter with seed %d: %s", seed, err) + } + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("Error generating message parameters with seed %d: %s", seed, err) + } + + params.KeySym = filter1.KeySym + params.Topic = BytesToTopic(filter1.Topics[0]) + + filter1.Src = ¶ms.Src.PublicKey + filter2.Src = ¶ms.Src.PublicKey + + sentMessage, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := sentMessage.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + msg := env.Open(filter1) + if msg == nil { + t.Fatalf("failed to Open with filter1") + } + + if !filter1.MatchEnvelope(env) { + t.Fatalf("failed matching with the first filter") + } + + if !filter2.MatchEnvelope(env) { + t.Fatalf("failed matching with the first filter") + } + + if !filter1.MatchMessage(msg) { + t.Fatalf("failed matching with the second filter") + } + + if !filter2.MatchMessage(msg) { + t.Fatalf("failed matching with the second filter") + } +} + func TestComparePubKey(t *testing.T) { InitSingleTest() @@ -345,11 +442,6 @@ func TestMatchMessageSym(t *testing.T) { t.Fatalf("failed Open with seed %d.", seed) } - // Src mismatch - if f.MatchMessage(msg) { - t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed) - } - // Src: match *f.Src.X = *params.Src.PublicKey.X *f.Src.Y = *params.Src.PublicKey.Y @@ -443,11 +535,6 @@ func TestMatchMessageAsym(t *testing.T) { t.Fatalf("failed to open with seed %d.", seed) } - // Src mismatch - if f.MatchMessage(msg) { - t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed) - } - // Src: match *f.Src.X = *params.Src.PublicKey.X *f.Src.Y = *params.Src.PublicKey.Y diff --git a/whisper/whisperv5/whisper_test.go b/whisper/whisperv5/whisper_test.go index 025be5b544..8af085292a 100644 --- a/whisper/whisperv5/whisper_test.go +++ b/whisper/whisperv5/whisper_test.go @@ -22,6 +22,8 @@ import ( mrand "math/rand" "testing" "time" + + "github.com/ethereum/go-ethereum/common" ) func TestWhisperBasic(t *testing.T) { @@ -624,3 +626,226 @@ func TestCustomization(t *testing.T) { t.Fatalf("failed to get whisper messages") } } + +func TestSymmetricSendCycle(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + filter1, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + filter1.PoW = DefaultMinimumPoW + + // Copy the first filter since some of its fields + // are randomly gnerated. + filter2 := &Filter{ + KeySym: filter1.KeySym, + Topics: filter1.Topics, + PoW: filter1.PoW, + AllowP2P: filter1.AllowP2P, + Messages: make(map[common.Hash]*ReceivedMessage), + } + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + filter1.Src = ¶ms.Src.PublicKey + filter2.Src = ¶ms.Src.PublicKey + + params.KeySym = filter1.KeySym + params.Topic = BytesToTopic(filter1.Topics[2]) + params.PoW = filter1.PoW + params.WorkTime = 10 + params.TTL = 50 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter1) + if err != nil { + t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter2) + if err != nil { + t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 200; j++ { + time.Sleep(10 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + time.Sleep(5 * time.Millisecond) + mail1 := filter1.Retrieve() + mail2 := filter2.Retrieve() + if len(mail2) == 0 { + t.Fatalf("did not receive any email for filter 2") + } + if len(mail1) == 0 { + t.Fatalf("did not receive any email for filter 1") + } + +} + +func TestSymmetricSendWithoutAKey(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + filter, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + filter.PoW = DefaultMinimumPoW + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + filter.Src = nil + + params.KeySym = filter.KeySym + params.Topic = BytesToTopic(filter.Topics[2]) + params.PoW = filter.PoW + params.WorkTime = 10 + params.TTL = 50 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter) + if err != nil { + t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 200; j++ { + time.Sleep(10 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + time.Sleep(5 * time.Millisecond) + mail := filter.Retrieve() + if len(mail) == 0 { + t.Fatalf("did not receive message in spite of not setting a public key") + } +} + +func TestSymmetricSendKeyMismatch(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + filter, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + filter.PoW = DefaultMinimumPoW + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + params.KeySym = filter.KeySym + params.Topic = BytesToTopic(filter.Topics[2]) + params.PoW = filter.PoW + params.WorkTime = 10 + params.TTL = 50 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter) + if err != nil { + t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 200; j++ { + time.Sleep(10 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + time.Sleep(5 * time.Millisecond) + mail := filter.Retrieve() + if len(mail) > 0 { + t.Fatalf("received a message when keys weren't matching") + } +} From 88b1db728826efd499ea407579f41e8b683d6b53 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 9 Oct 2017 12:40:50 +0200 Subject: [PATCH 199/272] accounts/keystore: scan key directory without locks held (#15171) The accountCache contains a file cache, and remembers from scan to scan what files were present earlier. Thus, whenever there's a change, the scan phase only bothers processing new and removed files. --- accounts/keystore/account_cache.go | 169 ++++++++++++++++++------ accounts/keystore/account_cache_test.go | 99 ++++++++++++++ accounts/keystore/keystore_test.go | 116 +++++++++------- accounts/keystore/watch.go | 25 ++-- 4 files changed, 302 insertions(+), 107 deletions(-) diff --git a/accounts/keystore/account_cache.go b/accounts/keystore/account_cache.go index dc6ac6ccb3..4b08cc2029 100644 --- a/accounts/keystore/account_cache.go +++ b/accounts/keystore/account_cache.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" + "gopkg.in/fatih/set.v0" ) // Minimum amount of time between cache reloads. This limit applies if the platform does @@ -71,6 +72,14 @@ type accountCache struct { byAddr map[common.Address][]accounts.Account throttle *time.Timer notify chan struct{} + fileC fileCache +} + +// fileCache is a cache of files seen during scan of keystore +type fileCache struct { + all *set.SetNonTS // list of all files + mtime time.Time // latest mtime seen + mu sync.RWMutex } func newAccountCache(keydir string) (*accountCache, chan struct{}) { @@ -78,6 +87,7 @@ func newAccountCache(keydir string) (*accountCache, chan struct{}) { keydir: keydir, byAddr: make(map[common.Address][]accounts.Account), notify: make(chan struct{}, 1), + fileC: fileCache{all: set.NewNonTS()}, } ac.watcher = newWatcher(ac) return ac, ac.notify @@ -127,6 +137,23 @@ func (ac *accountCache) delete(removed accounts.Account) { } } +// deleteByFile removes an account referenced by the given path. +func (ac *accountCache) deleteByFile(path string) { + ac.mu.Lock() + defer ac.mu.Unlock() + i := sort.Search(len(ac.all), func(i int) bool { return ac.all[i].URL.Path >= path }) + + if i < len(ac.all) && ac.all[i].URL.Path == path { + removed := ac.all[i] + ac.all = append(ac.all[:i], ac.all[i+1:]...) + if ba := removeAccount(ac.byAddr[removed.Address], removed); len(ba) == 0 { + delete(ac.byAddr, removed.Address) + } else { + ac.byAddr[removed.Address] = ba + } + } +} + func removeAccount(slice []accounts.Account, elem accounts.Account) []accounts.Account { for i := range slice { if slice[i] == elem { @@ -167,15 +194,16 @@ func (ac *accountCache) find(a accounts.Account) (accounts.Account, error) { default: err := &AmbiguousAddrError{Addr: a.Address, Matches: make([]accounts.Account, len(matches))} copy(err.Matches, matches) + sort.Sort(accountsByURL(err.Matches)) return accounts.Account{}, err } } func (ac *accountCache) maybeReload() { ac.mu.Lock() - defer ac.mu.Unlock() if ac.watcher.running { + ac.mu.Unlock() return // A watcher is running and will keep the cache up-to-date. } if ac.throttle == nil { @@ -184,12 +212,15 @@ func (ac *accountCache) maybeReload() { select { case <-ac.throttle.C: default: + ac.mu.Unlock() return // The cache was reloaded recently. } } + // No watcher running, start it. ac.watcher.start() - ac.reload() ac.throttle.Reset(minReloadInterval) + ac.mu.Unlock() + ac.scanAccounts() } func (ac *accountCache) close() { @@ -205,54 +236,76 @@ func (ac *accountCache) close() { ac.mu.Unlock() } -// reload caches addresses of existing accounts. -// Callers must hold ac.mu. -func (ac *accountCache) reload() { - accounts, err := ac.scan() +// scanFiles performs a new scan on the given directory, compares against the already +// cached filenames, and returns file sets: new, missing , modified +func (fc *fileCache) scanFiles(keyDir string) (set.Interface, set.Interface, set.Interface, error) { + t0 := time.Now() + files, err := ioutil.ReadDir(keyDir) + t1 := time.Now() if err != nil { - log.Debug("Failed to reload keystore contents", "err", err) + return nil, nil, nil, err } - ac.all = accounts - sort.Sort(ac.all) - for k := range ac.byAddr { - delete(ac.byAddr, k) - } - for _, a := range accounts { - ac.byAddr[a.Address] = append(ac.byAddr[a.Address], a) - } - select { - case ac.notify <- struct{}{}: - default: - } - log.Debug("Reloaded keystore contents", "accounts", len(ac.all)) -} + fc.mu.RLock() + prevMtime := fc.mtime + fc.mu.RUnlock() -func (ac *accountCache) scan() ([]accounts.Account, error) { - files, err := ioutil.ReadDir(ac.keydir) - if err != nil { - return nil, err - } - - var ( - buf = new(bufio.Reader) - addrs []accounts.Account - keyJSON struct { - Address string `json:"address"` - } - ) + filesNow := set.NewNonTS() + moddedFiles := set.NewNonTS() + var newMtime time.Time for _, fi := range files { - path := filepath.Join(ac.keydir, fi.Name()) + modTime := fi.ModTime() + path := filepath.Join(keyDir, fi.Name()) if skipKeyFile(fi) { log.Trace("Ignoring file on account scan", "path", path) continue } - logger := log.New("path", path) + filesNow.Add(path) + if modTime.After(prevMtime) { + moddedFiles.Add(path) + } + if modTime.After(newMtime) { + newMtime = modTime + } + } + t2 := time.Now() + fc.mu.Lock() + // Missing = previous - current + missing := set.Difference(fc.all, filesNow) + // New = current - previous + newFiles := set.Difference(filesNow, fc.all) + // Modified = modified - new + modified := set.Difference(moddedFiles, newFiles) + fc.all = filesNow + fc.mtime = newMtime + fc.mu.Unlock() + t3 := time.Now() + log.Debug("FS scan times", "list", t1.Sub(t0), "set", t2.Sub(t1), "diff", t3.Sub(t2)) + return newFiles, missing, modified, nil +} + +// scanAccounts checks if any changes have occurred on the filesystem, and +// updates the account cache accordingly +func (ac *accountCache) scanAccounts() error { + newFiles, missingFiles, modified, err := ac.fileC.scanFiles(ac.keydir) + t1 := time.Now() + if err != nil { + log.Debug("Failed to reload keystore contents", "err", err) + return err + } + var ( + buf = new(bufio.Reader) + keyJSON struct { + Address string `json:"address"` + } + ) + readAccount := func(path string) *accounts.Account { fd, err := os.Open(path) if err != nil { - logger.Trace("Failed to open keystore file", "err", err) - continue + log.Trace("Failed to open keystore file", "path", path, "err", err) + return nil } + defer fd.Close() buf.Reset(fd) // Parse the address. keyJSON.Address = "" @@ -260,15 +313,45 @@ func (ac *accountCache) scan() ([]accounts.Account, error) { addr := common.HexToAddress(keyJSON.Address) switch { case err != nil: - logger.Debug("Failed to decode keystore key", "err", err) + log.Debug("Failed to decode keystore key", "path", path, "err", err) case (addr == common.Address{}): - logger.Debug("Failed to decode keystore key", "err", "missing or zero address") + log.Debug("Failed to decode keystore key", "path", path, "err", "missing or zero address") default: - addrs = append(addrs, accounts.Account{Address: addr, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}}) + return &accounts.Account{Address: addr, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}} } - fd.Close() + return nil } - return addrs, err + + for _, p := range newFiles.List() { + path, _ := p.(string) + a := readAccount(path) + if a != nil { + ac.add(*a) + } + } + for _, p := range missingFiles.List() { + path, _ := p.(string) + ac.deleteByFile(path) + } + + for _, p := range modified.List() { + path, _ := p.(string) + a := readAccount(path) + ac.deleteByFile(path) + if a != nil { + ac.add(*a) + } + } + + t2 := time.Now() + + select { + case ac.notify <- struct{}{}: + default: + } + log.Trace("Handled keystore changes", "time", t2.Sub(t1)) + + return nil } func skipKeyFile(fi os.FileInfo) bool { diff --git a/accounts/keystore/account_cache_test.go b/accounts/keystore/account_cache_test.go index ab8aa9e6c3..e3dc310656 100644 --- a/accounts/keystore/account_cache_test.go +++ b/accounts/keystore/account_cache_test.go @@ -18,6 +18,7 @@ package keystore import ( "fmt" + "io/ioutil" "math/rand" "os" "path/filepath" @@ -295,3 +296,101 @@ func TestCacheFind(t *testing.T) { } } } + +func waitForAccounts(wantAccounts []accounts.Account, ks *KeyStore) error { + var list []accounts.Account + for d := 200 * time.Millisecond; d < 8*time.Second; d *= 2 { + list = ks.Accounts() + if reflect.DeepEqual(list, wantAccounts) { + // ks should have also received change notifications + select { + case <-ks.changes: + default: + return fmt.Errorf("wasn't notified of new accounts") + } + return nil + } + time.Sleep(d) + } + return fmt.Errorf("\ngot %v\nwant %v", list, wantAccounts) +} + +// TestUpdatedKeyfileContents tests that updating the contents of a keystore file +// is noticed by the watcher, and the account cache is updated accordingly +func TestUpdatedKeyfileContents(t *testing.T) { + t.Parallel() + + // Create a temporary kesytore to test with + rand.Seed(time.Now().UnixNano()) + dir := filepath.Join(os.TempDir(), fmt.Sprintf("eth-keystore-watch-test-%d-%d", os.Getpid(), rand.Int())) + ks := NewKeyStore(dir, LightScryptN, LightScryptP) + + list := ks.Accounts() + if len(list) > 0 { + t.Error("initial account list not empty:", list) + } + time.Sleep(100 * time.Millisecond) + + // Create the directory and copy a key file into it. + os.MkdirAll(dir, 0700) + defer os.RemoveAll(dir) + file := filepath.Join(dir, "aaa") + + // Place one of our testfiles in there + if err := cp.CopyFile(file, cachetestAccounts[0].URL.Path); err != nil { + t.Fatal(err) + } + + // ks should see the account. + wantAccounts := []accounts.Account{cachetestAccounts[0]} + wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} + if err := waitForAccounts(wantAccounts, ks); err != nil { + t.Error(err) + return + } + + // Now replace file contents + if err := forceCopyFile(file, cachetestAccounts[1].URL.Path); err != nil { + t.Fatal(err) + return + } + wantAccounts = []accounts.Account{cachetestAccounts[1]} + wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} + if err := waitForAccounts(wantAccounts, ks); err != nil { + t.Errorf("First replacement failed") + t.Error(err) + return + } + + // Now replace file contents again + if err := forceCopyFile(file, cachetestAccounts[2].URL.Path); err != nil { + t.Fatal(err) + return + } + wantAccounts = []accounts.Account{cachetestAccounts[2]} + wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} + if err := waitForAccounts(wantAccounts, ks); err != nil { + t.Errorf("Second replacement failed") + t.Error(err) + return + } + // Now replace file contents with crap + if err := ioutil.WriteFile(file, []byte("foo"), 0644); err != nil { + t.Fatal(err) + return + } + if err := waitForAccounts([]accounts.Account{}, ks); err != nil { + t.Errorf("Emptying account file failed") + t.Error(err) + return + } +} + +// forceCopyFile is like cp.CopyFile, but doesn't complain if the destination exists. +func forceCopyFile(dst, src string) error { + data, err := ioutil.ReadFile(src) + if err != nil { + return err + } + return ioutil.WriteFile(dst, data, 0644) +} diff --git a/accounts/keystore/keystore_test.go b/accounts/keystore/keystore_test.go index 132b74439e..6fb0a78088 100644 --- a/accounts/keystore/keystore_test.go +++ b/accounts/keystore/keystore_test.go @@ -272,82 +272,104 @@ func TestWalletNotifierLifecycle(t *testing.T) { t.Errorf("wallet notifier didn't terminate after unsubscribe") } +type walletEvent struct { + accounts.WalletEvent + a accounts.Account +} + // Tests that wallet notifications and correctly fired when accounts are added // or deleted from the keystore. func TestWalletNotifications(t *testing.T) { - // Create a temporary kesytore to test with dir, ks := tmpKeyStore(t, false) defer os.RemoveAll(dir) - // Subscribe to the wallet feed - updates := make(chan accounts.WalletEvent, 1) - sub := ks.Subscribe(updates) + // Subscribe to the wallet feed and collect events. + var ( + events []walletEvent + updates = make(chan accounts.WalletEvent) + sub = ks.Subscribe(updates) + ) defer sub.Unsubscribe() + go func() { + for { + select { + case ev := <-updates: + events = append(events, walletEvent{ev, ev.Wallet.Accounts()[0]}) + case <-sub.Err(): + close(updates) + return + } + } + }() - // Randomly add and remove account and make sure events and wallets are in sync - live := make(map[common.Address]accounts.Account) + // Randomly add and remove accounts. + var ( + live = make(map[common.Address]accounts.Account) + wantEvents []walletEvent + ) for i := 0; i < 1024; i++ { - // Execute a creation or deletion and ensure event arrival if create := len(live) == 0 || rand.Int()%4 > 0; create { // Add a new account and ensure wallet notifications arrives account, err := ks.NewAccount("") if err != nil { t.Fatalf("failed to create test account: %v", err) } - select { - case event := <-updates: - if event.Kind != accounts.WalletArrived { - t.Errorf("non-arrival event on account creation") - } - if event.Wallet.Accounts()[0] != account { - t.Errorf("account mismatch on created wallet: have %v, want %v", event.Wallet.Accounts()[0], account) - } - default: - t.Errorf("wallet arrival event not fired on account creation") - } live[account.Address] = account + wantEvents = append(wantEvents, walletEvent{accounts.WalletEvent{Kind: accounts.WalletArrived}, account}) } else { - // Select a random account to delete (crude, but works) + // Delete a random account. var account accounts.Account for _, a := range live { account = a break } - // Remove an account and ensure wallet notifiaction arrives if err := ks.Delete(account, ""); err != nil { t.Fatalf("failed to delete test account: %v", err) } - select { - case event := <-updates: - if event.Kind != accounts.WalletDropped { - t.Errorf("non-drop event on account deletion") - } - if event.Wallet.Accounts()[0] != account { - t.Errorf("account mismatch on deleted wallet: have %v, want %v", event.Wallet.Accounts()[0], account) - } - default: - t.Errorf("wallet departure event not fired on account creation") - } delete(live, account.Address) + wantEvents = append(wantEvents, walletEvent{accounts.WalletEvent{Kind: accounts.WalletDropped}, account}) } - // Retrieve the list of wallets and ensure it matches with our required live set - liveList := make([]accounts.Account, 0, len(live)) - for _, account := range live { - liveList = append(liveList, account) - } - sort.Sort(accountsByURL(liveList)) + } - wallets := ks.Wallets() - if len(liveList) != len(wallets) { - t.Errorf("wallet list doesn't match required accounts: have %v, want %v", wallets, liveList) - } else { - for j, wallet := range wallets { - if accs := wallet.Accounts(); len(accs) != 1 { - t.Errorf("wallet %d: contains invalid number of accounts: have %d, want 1", j, len(accs)) - } else if accs[0] != liveList[j] { - t.Errorf("wallet %d: account mismatch: have %v, want %v", j, accs[0], liveList[j]) - } + // Shut down the event collector and check events. + sub.Unsubscribe() + <-updates + checkAccounts(t, live, ks.Wallets()) + checkEvents(t, wantEvents, events) +} + +// checkAccounts checks that all known live accounts are present in the wallet list. +func checkAccounts(t *testing.T, live map[common.Address]accounts.Account, wallets []accounts.Wallet) { + if len(live) != len(wallets) { + t.Errorf("wallet list doesn't match required accounts: have %d, want %d", len(wallets), len(live)) + return + } + liveList := make([]accounts.Account, 0, len(live)) + for _, account := range live { + liveList = append(liveList, account) + } + sort.Sort(accountsByURL(liveList)) + for j, wallet := range wallets { + if accs := wallet.Accounts(); len(accs) != 1 { + t.Errorf("wallet %d: contains invalid number of accounts: have %d, want 1", j, len(accs)) + } else if accs[0] != liveList[j] { + t.Errorf("wallet %d: account mismatch: have %v, want %v", j, accs[0], liveList[j]) + } + } +} + +// checkEvents checks that all events in 'want' are present in 'have'. Events may be present multiple times. +func checkEvents(t *testing.T, want []walletEvent, have []walletEvent) { + for _, wantEv := range want { + nmatch := 0 + for ; len(have) > 0; nmatch++ { + if have[0].Kind != wantEv.Kind || have[0].a != wantEv.a { + break } + have = have[1:] + } + if nmatch == 0 { + t.Fatalf("can't find event with Kind=%v for %x", wantEv.Kind, wantEv.a.Address) } } } diff --git a/accounts/keystore/watch.go b/accounts/keystore/watch.go index f4d6477912..602300b107 100644 --- a/accounts/keystore/watch.go +++ b/accounts/keystore/watch.go @@ -70,7 +70,6 @@ func (w *watcher) loop() { return } defer notify.Stop(w.ev) - logger.Trace("Started watching keystore folder") defer logger.Trace("Stopped watching keystore folder") @@ -82,9 +81,9 @@ func (w *watcher) loop() { // When an event occurs, the reload call is delayed a bit so that // multiple events arriving quickly only cause a single reload. var ( - debounce = time.NewTimer(0) - debounceDuration = 500 * time.Millisecond - inCycle, hadEvent bool + debounce = time.NewTimer(0) + debounceDuration = 500 * time.Millisecond + rescanTriggered = false ) defer debounce.Stop() for { @@ -92,22 +91,14 @@ func (w *watcher) loop() { case <-w.quit: return case <-w.ev: - if !inCycle { + // Trigger the scan (with delay), if not already triggered + if !rescanTriggered { debounce.Reset(debounceDuration) - inCycle = true - } else { - hadEvent = true + rescanTriggered = true } case <-debounce.C: - w.ac.mu.Lock() - w.ac.reload() - w.ac.mu.Unlock() - if hadEvent { - debounce.Reset(debounceDuration) - inCycle, hadEvent = true, false - } else { - inCycle, hadEvent = false, false - } + w.ac.scanAccounts() + rescanTriggered = false } } } From 89860f4197cb9bd2249c9ac4d854f3bc401a7926 Mon Sep 17 00:00:00 2001 From: Darrel Herbst Date: Mon, 9 Oct 2017 06:45:30 -0400 Subject: [PATCH 200/272] swarm/fuse: return amount of data written if the file exists (#15261) If the file already existed, the WriteResponse.Size was being set as the length of the entire file, not just the amount that was written to the existing file. Fixes #15216 --- swarm/fuse/fuse_file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swarm/fuse/fuse_file.go b/swarm/fuse/fuse_file.go index 0cb59dfb38..32c85d02f7 100644 --- a/swarm/fuse/fuse_file.go +++ b/swarm/fuse/fuse_file.go @@ -134,7 +134,7 @@ func (sf *SwarmFile) Write(ctx context.Context, req *fuse.WriteRequest, resp *fu if err != nil { return err } - resp.Size = int(sf.fileSize) + resp.Size = len(req.Data) } else { log.Warn("Invalid write request size(%v) : off(%v)", sf.fileSize, req.Offset) return errInvalidOffset From 40a3856af9d28fce6550509a01cf926525da5d22 Mon Sep 17 00:00:00 2001 From: Miya Chen Date: Tue, 10 Oct 2017 16:53:05 +0800 Subject: [PATCH 201/272] eth/fetcher: check the origin of filter tasks (#14975) * eth/fetcher: check the origin of filter task * eth/fetcher: add some details to fetcher logs --- eth/fetcher/fetcher.go | 18 +++++---- eth/fetcher/fetcher_test.go | 79 +++++++++++++++++++++---------------- eth/handler.go | 4 +- 3 files changed, 56 insertions(+), 45 deletions(-) diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 98cc1a76b6..50966f5eeb 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -83,6 +83,7 @@ type announce struct { // headerFilterTask represents a batch of headers needing fetcher filtering. type headerFilterTask struct { + peer string // The source peer of block headers headers []*types.Header // Collection of headers to filter time time.Time // Arrival time of the headers } @@ -90,6 +91,7 @@ type headerFilterTask struct { // headerFilterTask represents a batch of block bodies (transactions and uncles) // needing fetcher filtering. type bodyFilterTask struct { + peer string // The source peer of block bodies transactions [][]*types.Transaction // Collection of transactions per block bodies uncles [][]*types.Header // Collection of uncles per block bodies time time.Time // Arrival time of the blocks' contents @@ -218,8 +220,8 @@ func (f *Fetcher) Enqueue(peer string, block *types.Block) error { // FilterHeaders extracts all the headers that were explicitly requested by the fetcher, // returning those that should be handled differently. -func (f *Fetcher) FilterHeaders(headers []*types.Header, time time.Time) []*types.Header { - log.Trace("Filtering headers", "headers", len(headers)) +func (f *Fetcher) FilterHeaders(peer string, headers []*types.Header, time time.Time) []*types.Header { + log.Trace("Filtering headers", "peer", peer, "headers", len(headers)) // Send the filter channel to the fetcher filter := make(chan *headerFilterTask) @@ -231,7 +233,7 @@ func (f *Fetcher) FilterHeaders(headers []*types.Header, time time.Time) []*type } // Request the filtering of the header list select { - case filter <- &headerFilterTask{headers: headers, time: time}: + case filter <- &headerFilterTask{peer: peer, headers: headers, time: time}: case <-f.quit: return nil } @@ -246,8 +248,8 @@ func (f *Fetcher) FilterHeaders(headers []*types.Header, time time.Time) []*type // FilterBodies extracts all the block bodies that were explicitly requested by // the fetcher, returning those that should be handled differently. -func (f *Fetcher) FilterBodies(transactions [][]*types.Transaction, uncles [][]*types.Header, time time.Time) ([][]*types.Transaction, [][]*types.Header) { - log.Trace("Filtering bodies", "txs", len(transactions), "uncles", len(uncles)) +func (f *Fetcher) FilterBodies(peer string, transactions [][]*types.Transaction, uncles [][]*types.Header, time time.Time) ([][]*types.Transaction, [][]*types.Header) { + log.Trace("Filtering bodies", "peer", peer, "txs", len(transactions), "uncles", len(uncles)) // Send the filter channel to the fetcher filter := make(chan *bodyFilterTask) @@ -259,7 +261,7 @@ func (f *Fetcher) FilterBodies(transactions [][]*types.Transaction, uncles [][]* } // Request the filtering of the body list select { - case filter <- &bodyFilterTask{transactions: transactions, uncles: uncles, time: time}: + case filter <- &bodyFilterTask{peer: peer, transactions: transactions, uncles: uncles, time: time}: case <-f.quit: return nil, nil } @@ -444,7 +446,7 @@ func (f *Fetcher) loop() { hash := header.Hash() // Filter fetcher-requested headers from other synchronisation algorithms - if announce := f.fetching[hash]; announce != nil && f.fetched[hash] == nil && f.completing[hash] == nil && f.queued[hash] == nil { + if announce := f.fetching[hash]; announce != nil && announce.origin == task.peer && f.fetched[hash] == nil && f.completing[hash] == nil && f.queued[hash] == nil { // If the delivered header does not match the promised number, drop the announcer if header.Number.Uint64() != announce.number { log.Trace("Invalid block number fetched", "peer", announce.origin, "hash", header.Hash(), "announced", announce.number, "provided", header.Number) @@ -523,7 +525,7 @@ func (f *Fetcher) loop() { txnHash := types.DeriveSha(types.Transactions(task.transactions[i])) uncleHash := types.CalcUncleHash(task.uncles[i]) - if txnHash == announce.header.TxHash && uncleHash == announce.header.UncleHash { + if txnHash == announce.header.TxHash && uncleHash == announce.header.UncleHash && announce.origin == task.peer { // Mark the body matched, reassemble if still unknown matched = true diff --git a/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go index 85d2f8645e..9889e6cc53 100644 --- a/eth/fetcher/fetcher_test.go +++ b/eth/fetcher/fetcher_test.go @@ -153,7 +153,7 @@ func (f *fetcherTester) dropPeer(peer string) { } // makeHeaderFetcher retrieves a block header fetcher associated with a simulated peer. -func (f *fetcherTester) makeHeaderFetcher(blocks map[common.Hash]*types.Block, drift time.Duration) headerRequesterFn { +func (f *fetcherTester) makeHeaderFetcher(peer string, blocks map[common.Hash]*types.Block, drift time.Duration) headerRequesterFn { closure := make(map[common.Hash]*types.Block) for hash, block := range blocks { closure[hash] = block @@ -166,14 +166,14 @@ func (f *fetcherTester) makeHeaderFetcher(blocks map[common.Hash]*types.Block, d headers = append(headers, block.Header()) } // Return on a new thread - go f.fetcher.FilterHeaders(headers, time.Now().Add(drift)) + go f.fetcher.FilterHeaders(peer, headers, time.Now().Add(drift)) return nil } } // makeBodyFetcher retrieves a block body fetcher associated with a simulated peer. -func (f *fetcherTester) makeBodyFetcher(blocks map[common.Hash]*types.Block, drift time.Duration) bodyRequesterFn { +func (f *fetcherTester) makeBodyFetcher(peer string, blocks map[common.Hash]*types.Block, drift time.Duration) bodyRequesterFn { closure := make(map[common.Hash]*types.Block) for hash, block := range blocks { closure[hash] = block @@ -191,7 +191,7 @@ func (f *fetcherTester) makeBodyFetcher(blocks map[common.Hash]*types.Block, dri } } // Return on a new thread - go f.fetcher.FilterBodies(transactions, uncles, time.Now().Add(drift)) + go f.fetcher.FilterBodies(peer, transactions, uncles, time.Now().Add(drift)) return nil } @@ -282,8 +282,8 @@ func testSequentialAnnouncements(t *testing.T, protocol int) { hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) // Iteratively announce blocks until all are imported imported := make(chan *types.Block) @@ -309,22 +309,28 @@ func testConcurrentAnnouncements(t *testing.T, protocol int) { // Assemble a tester with a built in counter for the requests tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + firstHeaderFetcher := tester.makeHeaderFetcher("first", blocks, -gatherSlack) + firstBodyFetcher := tester.makeBodyFetcher("first", blocks, 0) + secondHeaderFetcher := tester.makeHeaderFetcher("second", blocks, -gatherSlack) + secondBodyFetcher := tester.makeBodyFetcher("second", blocks, 0) counter := uint32(0) - headerWrapper := func(hash common.Hash) error { + firstHeaderWrapper := func(hash common.Hash) error { atomic.AddUint32(&counter, 1) - return headerFetcher(hash) + return firstHeaderFetcher(hash) + } + secondHeaderWrapper := func(hash common.Hash) error { + atomic.AddUint32(&counter, 1) + return secondHeaderFetcher(hash) } // Iteratively announce blocks until all are imported imported := make(chan *types.Block) tester.fetcher.importedHook = func(block *types.Block) { imported <- block } for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("first", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), headerWrapper, bodyFetcher) - tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout+time.Millisecond), headerWrapper, bodyFetcher) - tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout-time.Millisecond), headerWrapper, bodyFetcher) + tester.fetcher.Notify("first", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), firstHeaderWrapper, firstBodyFetcher) + tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout+time.Millisecond), secondHeaderWrapper, secondBodyFetcher) + tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout-time.Millisecond), secondHeaderWrapper, secondBodyFetcher) verifyImportEvent(t, imported, true) } verifyImportDone(t, imported) @@ -347,8 +353,8 @@ func testOverlappingAnnouncements(t *testing.T, protocol int) { hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) // Iteratively announce blocks, but overlap them continuously overlap := 16 @@ -381,8 +387,8 @@ func testPendingDeduplication(t *testing.T, protocol int) { // Assemble a tester with a built in counter and delayed fetcher tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("repeater", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("repeater", blocks, 0) delay := 50 * time.Millisecond counter := uint32(0) @@ -425,8 +431,8 @@ func testRandomArrivalImport(t *testing.T, protocol int) { skip := targetBlocks / 2 tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) // Iteratively announce blocks, skipping one entry imported := make(chan *types.Block, len(hashes)-1) @@ -456,8 +462,8 @@ func testQueueGapFill(t *testing.T, protocol int) { skip := targetBlocks / 2 tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) // Iteratively announce blocks, skipping one entry imported := make(chan *types.Block, len(hashes)-1) @@ -486,8 +492,8 @@ func testImportDeduplication(t *testing.T, protocol int) { // Create the tester and wrap the importer with a counter tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) counter := uint32(0) tester.fetcher.insertChain = func(blocks types.Blocks) (int, error) { @@ -570,8 +576,8 @@ func testDistantAnnouncementDiscarding(t *testing.T, protocol int) { tester.blocks = map[common.Hash]*types.Block{head: blocks[head]} tester.lock.Unlock() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("lower", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("lower", blocks, 0) fetching := make(chan struct{}, 2) tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- struct{}{} } @@ -603,14 +609,14 @@ func testInvalidNumberAnnouncement(t *testing.T, protocol int) { hashes, blocks := makeChain(1, 0, genesis) tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + badHeaderFetcher := tester.makeHeaderFetcher("bad", blocks, -gatherSlack) + badBodyFetcher := tester.makeBodyFetcher("bad", blocks, 0) imported := make(chan *types.Block) tester.fetcher.importedHook = func(block *types.Block) { imported <- block } // Announce a block with a bad number, check for immediate drop - tester.fetcher.Notify("bad", hashes[0], 2, time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) + tester.fetcher.Notify("bad", hashes[0], 2, time.Now().Add(-arriveTimeout), badHeaderFetcher, badBodyFetcher) verifyImportEvent(t, imported, false) tester.lock.RLock() @@ -620,8 +626,11 @@ func testInvalidNumberAnnouncement(t *testing.T, protocol int) { if !dropped { t.Fatalf("peer with invalid numbered announcement not dropped") } + + goodHeaderFetcher := tester.makeHeaderFetcher("good", blocks, -gatherSlack) + goodBodyFetcher := tester.makeBodyFetcher("good", blocks, 0) // Make sure a good announcement passes without a drop - tester.fetcher.Notify("good", hashes[0], 1, time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) + tester.fetcher.Notify("good", hashes[0], 1, time.Now().Add(-arriveTimeout), goodHeaderFetcher, goodBodyFetcher) verifyImportEvent(t, imported, true) tester.lock.RLock() @@ -645,8 +654,8 @@ func testEmptyBlockShortCircuit(t *testing.T, protocol int) { hashes, blocks := makeChain(32, 0, genesis) tester := newTester() - headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher(blocks, 0) + headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) // Add a monitoring hook for all internal events fetching := make(chan []common.Hash) @@ -697,12 +706,12 @@ func testHashMemoryExhaustionAttack(t *testing.T, protocol int) { // Create a valid chain and an infinite junk chain targetBlocks := hashLimit + 2*maxQueueDist hashes, blocks := makeChain(targetBlocks, 0, genesis) - validHeaderFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) - validBodyFetcher := tester.makeBodyFetcher(blocks, 0) + validHeaderFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) + validBodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) attack, _ := makeChain(targetBlocks, 0, unknownBlock) - attackerHeaderFetcher := tester.makeHeaderFetcher(nil, -gatherSlack) - attackerBodyFetcher := tester.makeBodyFetcher(nil, 0) + attackerHeaderFetcher := tester.makeHeaderFetcher("attacker", nil, -gatherSlack) + attackerBodyFetcher := tester.makeBodyFetcher("attacker", nil, 0) // Feed the tester a huge hashset from the attacker, and a limited from the valid peer for i := 0; i < len(attack); i++ { diff --git a/eth/handler.go b/eth/handler.go index cee719ddb6..bec5126dc8 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -450,7 +450,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return nil } // Irrelevant of the fork checks, send the header to the fetcher just in case - headers = pm.fetcher.FilterHeaders(headers, time.Now()) + headers = pm.fetcher.FilterHeaders(p.id, headers, time.Now()) } if len(headers) > 0 || !filter { err := pm.downloader.DeliverHeaders(p.id, headers) @@ -503,7 +503,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { // Filter out any explicitly requested bodies, deliver the rest to the downloader filter := len(trasactions) > 0 || len(uncles) > 0 if filter { - trasactions, uncles = pm.fetcher.FilterBodies(trasactions, uncles, time.Now()) + trasactions, uncles = pm.fetcher.FilterBodies(p.id, trasactions, uncles, time.Now()) } if len(trasactions) > 0 || len(uncles) > 0 || !filter { err := pm.downloader.DeliverBodies(p.id, trasactions, uncles) From d3beff7e209cd82bcd044f51501886d926ce1b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 10 Oct 2017 11:54:47 +0300 Subject: [PATCH 202/272] consensus/clique: add fork hash enforcement (#15236) --- consensus/clique/clique.go | 5 +++++ consensus/clique/snapshot_test.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index d2fb6934b9..8d6cf653d5 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -313,6 +314,10 @@ func (c *Clique) verifyHeader(chain consensus.ChainReader, header *types.Header, return errInvalidDifficulty } } + // If all checks passed, validate any special fields for hard forks + if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil { + return err + } // All basic checks passed, verify cascading fields return c.verifyCascadingFields(chain, header, parents) } diff --git a/consensus/clique/snapshot_test.go b/consensus/clique/snapshot_test.go index f18934b890..a1717d799f 100644 --- a/consensus/clique/snapshot_test.go +++ b/consensus/clique/snapshot_test.go @@ -74,7 +74,7 @@ type testerChainReader struct { db ethdb.Database } -func (r *testerChainReader) Config() *params.ChainConfig { panic("not supported") } +func (r *testerChainReader) Config() *params.ChainConfig { return params.AllProtocolChanges } func (r *testerChainReader) CurrentHeader() *types.Header { panic("not supported") } func (r *testerChainReader) GetHeader(common.Hash, uint64) *types.Header { panic("not supported") } func (r *testerChainReader) GetBlock(common.Hash, uint64) *types.Block { panic("not supported") } From 3680cd5926c1185b2338648bad29fae15e5f34b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 10 Oct 2017 11:56:33 +0300 Subject: [PATCH 203/272] params: explain EIP150Hash (#15237) --- params/config.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/params/config.go b/params/config.go index bff701f092..18579666b6 100644 --- a/params/config.go +++ b/params/config.go @@ -99,17 +99,18 @@ type ChainConfig struct { ChainId *big.Int `json:"chainId"` // Chain id identifies the current chain and is used for replay protection HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead) + DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO hard-fork switch block (nil = no fork) DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork // EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150) EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork) - EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (fast sync aid) + EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (needed for header only clients as only gas pricing changed) EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block - ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = alraedy on homestead) + ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium) // Various consensus engines Ethash *EthashConfig `json:"ethash,omitempty"` From b45cc0c9e8c8724f9db6420a0ea7fbf6d5401fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 10 Oct 2017 12:35:09 +0300 Subject: [PATCH 204/272] cmd/puppeth: use dumb textual IP filtering --- cmd/puppeth/wizard.go | 13 +++++++------ cmd/puppeth/wizard_ethstats.go | 31 ++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 3fdd639f80..5fbc11cb98 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -302,8 +302,10 @@ func (w *wizard) readJSON() string { } // readIPAddress reads a single line from stdin, trimming if from spaces and -// converts it to a network IP address. -func (w *wizard) readIPAddress() net.IP { +// returning it if it's convertible to an IP address. The reason for keeping +// the user input format instead of returning a Go net.IP is to match with +// weird formats used by ethstats, which compares IPs textually, not by value. +func (w *wizard) readIPAddress() string { for { // Read the IP address from the user fmt.Printf("> ") @@ -312,14 +314,13 @@ func (w *wizard) readIPAddress() net.IP { log.Crit("Failed to read user input", "err", err) } if text = strings.TrimSpace(text); text == "" { - return nil + return "" } // Make sure it looks ok and return it if so - ip := net.ParseIP(text) - if ip == nil { + if ip := net.ParseIP(text); ip == nil { log.Error("Invalid IP address, please retry") continue } - return ip + return text } } diff --git a/cmd/puppeth/wizard_ethstats.go b/cmd/puppeth/wizard_ethstats.go index 504d8fd9cb..8bfa1d6e52 100644 --- a/cmd/puppeth/wizard_ethstats.go +++ b/cmd/puppeth/wizard_ethstats.go @@ -18,6 +18,7 @@ package main import ( "fmt" + "sort" "github.com/ethereum/go-ethereum/log" ) @@ -64,17 +65,37 @@ func (w *wizard) deployEthstats() { fmt.Println() fmt.Printf("Keep existing IP %v blacklist (y/n)? (default = yes)\n", infos.banned) if w.readDefaultString("y") != "y" { - infos.banned = nil - + // The user might want to clear the entire list, although generally probably not fmt.Println() - fmt.Println("Which IP addresses should be blacklisted?") + fmt.Printf("Clear out blacklist and start over (y/n)? (default = no)\n") + if w.readDefaultString("n") != "n" { + infos.banned = nil + } + // Offer the user to explicitly add/remove certain IP addresses + fmt.Println() + fmt.Println("Which additional IP addresses should be blacklisted?") for { - if ip := w.readIPAddress(); ip != nil { - infos.banned = append(infos.banned, ip.String()) + if ip := w.readIPAddress(); ip != "" { + infos.banned = append(infos.banned, ip) continue } break } + fmt.Println() + fmt.Println("Which IP addresses should not be blacklisted?") + for { + if ip := w.readIPAddress(); ip != "" { + for i, addr := range infos.banned { + if ip == addr { + infos.banned = append(infos.banned[:i], infos.banned[i+1:]...) + break + } + } + continue + } + break + } + sort.Strings(infos.banned) } // Try to deploy the ethstats server on the host trusted := make([]string, 0, len(w.servers)) From cefeb5859866f2fe119b7936f7c97137b7efb7b6 Mon Sep 17 00:00:00 2001 From: Jia Chenhui Date: Tue, 10 Oct 2017 20:11:15 +0800 Subject: [PATCH 205/272] event: fix typo (#15270) --- event/event.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/event/event.go b/event/event.go index d3e84f0f7f..20d20d1f57 100644 --- a/event/event.go +++ b/event/event.go @@ -56,7 +56,7 @@ func (mux *TypeMux) Subscribe(types ...interface{}) *TypeMuxSubscription { defer mux.mutex.Unlock() if mux.stopped { // set the status to closed so that calling Unsubscribe after this - // call will short curuit + // call will short circuit. sub.closed = true close(sub.postC) } else { From 345332906c213203b90b0d59c9a1127e46d8ca85 Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Mon, 10 Jul 2017 15:48:42 +0100 Subject: [PATCH 206/272] cmd: Added support for copying data to another DB instance --- cmd/geth/chaincmd.go | 196 ++++++++++++++++++++++++++++++++++++++++++- cmd/geth/main.go | 1 + 2 files changed, 196 insertions(+), 1 deletion(-) diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 12bc1d7c66..f9fd8c013b 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -19,6 +19,7 @@ package main import ( "encoding/json" "fmt" + "math/big" "os" "runtime" "strconv" @@ -31,7 +32,9 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/trie" "github.com/syndtr/goleveldb/leveldb/util" @@ -71,7 +74,7 @@ It expects the genesis file as argument.`, The import command imports blocks from an RLP-encoded form. The form can be one file with several RLP-encoded blocks, or several files can be used. -If only one file is used, import error will result in failure. If several files are used, +If only one file is used, import error will result in failure. If several files are used, processing will proceed even if an individual RLP-file import failure occurs.`, } exportCommand = cli.Command{ @@ -90,6 +93,21 @@ Requires a first argument of the file to write to. Optional second and third arguments control the first and last block to write. In this mode, the file will be appended if already existing.`, + } + copydbCommand = cli.Command{ + Action: utils.MigrateFlags(copyDb), + Name: "copydb", + Usage: "Copy from one chain DB into another using the downloader", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + utils.FakePoWFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The first argument must be the directory containing the blockchain to download from`, } removedbCommand = cli.Command{ Action: utils.MigrateFlags(removeDB), @@ -268,6 +286,182 @@ func exportChain(ctx *cli.Context) error { return nil } +type localPeer struct { + chainDb ethdb.Database + hc *core.HeaderChain + dl *downloader.Downloader +} + +func (lp *localPeer) Head() (common.Hash, *big.Int) { + header := lp.hc.CurrentHeader() + return header.Hash(), header.Number +} + +func (lp *localPeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, reverse bool) error { + var ( + headers []*types.Header + unknown bool + ) + + for !unknown && len(headers) < amount { + origin := lp.hc.GetHeaderByHash(hash) + if origin == nil { + break + } + + number := origin.Number.Uint64() + headers = append(headers, origin) + if reverse { + for i := 0; i < int(skip)+1; i++ { + if header := lp.hc.GetHeader(hash, number); header != nil { + hash = header.ParentHash + number-- + } else { + unknown = true + break + } + } + } else { + var ( + current = origin.Number.Uint64() + next = current + uint64(skip) + 1 + ) + if header := lp.hc.GetHeaderByNumber(next); header != nil { + if lp.hc.GetBlockHashesFromHash(header.Hash(), uint64(skip+1))[skip] == hash { + hash = header.Hash() + } else { + unknown = true + } + } else { + unknown = true + } + } + } + + lp.dl.DeliverHeaders("local", headers) + return nil +} + +func (lp *localPeer) RequestHeadersByNumber(num uint64, amount int, skip int, reverse bool) error { + var ( + headers []*types.Header + unknown bool + ) + + for !unknown && len(headers) < amount { + origin := lp.hc.GetHeaderByNumber(num) + if origin == nil { + break + } + + if reverse { + if num >= uint64(skip+1) { + num -= uint64(skip + 1) + } else { + unknown = true + } + } else { + num += uint64(skip + 1) + } + headers = append(headers, origin) + } + + lp.dl.DeliverHeaders("local", headers) + return nil +} + +func (lp *localPeer) RequestBodies(hashes []common.Hash) error { + var ( + transactions [][]*types.Transaction + uncles [][]*types.Header + ) + + for _, hash := range hashes { + block := core.GetBlock(lp.chainDb, hash, lp.hc.GetBlockNumber(hash)) + transactions = append(transactions, block.Transactions()) + uncles = append(uncles, block.Uncles()) + } + + lp.dl.DeliverBodies("local", transactions, uncles) + return nil +} + +func (lp *localPeer) RequestReceipts(hashes []common.Hash) error { + var receipts [][]*types.Receipt + + for _, hash := range hashes { + receipts = append(receipts, core.GetBlockReceipts(lp.chainDb, hash, lp.hc.GetBlockNumber(hash))) + } + + lp.dl.DeliverReceipts("local", receipts) + return nil +} + +func (lp *localPeer) RequestNodeData(hashes []common.Hash) error { + var data [][]byte + + for _, hash := range hashes { + if entry, err := lp.chainDb.Get(hash.Bytes()); err == nil { + data = append(data, entry) + } + } + + lp.dl.DeliverNodeData("local", data) + return nil +} + +func copyDb(ctx *cli.Context) error { + if len(ctx.Args()) != 1 { + utils.Fatalf("This command requires an argument.") + } + + stack := makeFullNode(ctx) + chain, chainDb := utils.MakeChain(ctx, stack) + start := time.Now() + + syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) + mux := new(event.TypeMux) + dl := downloader.New(syncmode, chainDb, mux, chain, nil, nil) + + var err error + filename := ctx.Args().First() + cache := ctx.GlobalInt(utils.CacheFlag.Name) + handles := 256 + localdb, err := ethdb.NewLDBDatabase(filename, cache, handles) + if err != nil { + return err + } + + hc, err := core.NewHeaderChain(localdb, chain.Config(), chain.Engine(), func() bool { return false }) + if err != nil { + return err + } + + peer := &localPeer{localdb, hc, dl} + if err := dl.RegisterPeer("local", 63, peer); err != nil { + return err + } + + currentHeader := hc.CurrentHeader() + if err := dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil { + return err + } + for dl.Synchronising() { + time.Sleep(10 * time.Millisecond) + } + + fmt.Printf("Database copy done in %v", time.Since(start)) + + start = time.Now() + fmt.Println("Compacting entire database...") + if err = chainDb.(*ethdb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil { + utils.Fatalf("Compaction failed: %v", err) + } + fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) + + return nil +} + func removeDB(ctx *cli.Context) error { stack, _ := makeConfigNode(ctx) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 8166c9ce80..88f3528f39 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -146,6 +146,7 @@ func init() { initCommand, importCommand, exportCommand, + copydbCommand, removedbCommand, dumpCommand, // See monitorcmd.go: From 35767dfd0c468872acf99c3fccc3a206ce709128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 10 Oct 2017 15:51:09 +0300 Subject: [PATCH 207/272] cmd, eth: separate out FakePeer for future reuse --- cmd/geth/chaincmd.go | 163 ++++--------------------------------- cmd/utils/flags.go | 21 +++-- eth/downloader/fakepeer.go | 160 ++++++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 152 deletions(-) create mode 100644 eth/downloader/fakepeer.go diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index f9fd8c013b..4a9a7b11b5 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -19,7 +19,6 @@ package main import ( "encoding/json" "fmt" - "math/big" "os" "runtime" "strconv" @@ -97,13 +96,15 @@ if already existing.`, copydbCommand = cli.Command{ Action: utils.MigrateFlags(copyDb), Name: "copydb", - Usage: "Copy from one chain DB into another using the downloader", - ArgsUsage: "", + Usage: "Create a local chain from a target chaindata folder", + ArgsUsage: "", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, utils.SyncModeFlag, utils.FakePoWFlag, + utils.TestnetFlag, + utils.RinkebyFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` @@ -286,172 +287,44 @@ func exportChain(ctx *cli.Context) error { return nil } -type localPeer struct { - chainDb ethdb.Database - hc *core.HeaderChain - dl *downloader.Downloader -} - -func (lp *localPeer) Head() (common.Hash, *big.Int) { - header := lp.hc.CurrentHeader() - return header.Hash(), header.Number -} - -func (lp *localPeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, reverse bool) error { - var ( - headers []*types.Header - unknown bool - ) - - for !unknown && len(headers) < amount { - origin := lp.hc.GetHeaderByHash(hash) - if origin == nil { - break - } - - number := origin.Number.Uint64() - headers = append(headers, origin) - if reverse { - for i := 0; i < int(skip)+1; i++ { - if header := lp.hc.GetHeader(hash, number); header != nil { - hash = header.ParentHash - number-- - } else { - unknown = true - break - } - } - } else { - var ( - current = origin.Number.Uint64() - next = current + uint64(skip) + 1 - ) - if header := lp.hc.GetHeaderByNumber(next); header != nil { - if lp.hc.GetBlockHashesFromHash(header.Hash(), uint64(skip+1))[skip] == hash { - hash = header.Hash() - } else { - unknown = true - } - } else { - unknown = true - } - } - } - - lp.dl.DeliverHeaders("local", headers) - return nil -} - -func (lp *localPeer) RequestHeadersByNumber(num uint64, amount int, skip int, reverse bool) error { - var ( - headers []*types.Header - unknown bool - ) - - for !unknown && len(headers) < amount { - origin := lp.hc.GetHeaderByNumber(num) - if origin == nil { - break - } - - if reverse { - if num >= uint64(skip+1) { - num -= uint64(skip + 1) - } else { - unknown = true - } - } else { - num += uint64(skip + 1) - } - headers = append(headers, origin) - } - - lp.dl.DeliverHeaders("local", headers) - return nil -} - -func (lp *localPeer) RequestBodies(hashes []common.Hash) error { - var ( - transactions [][]*types.Transaction - uncles [][]*types.Header - ) - - for _, hash := range hashes { - block := core.GetBlock(lp.chainDb, hash, lp.hc.GetBlockNumber(hash)) - transactions = append(transactions, block.Transactions()) - uncles = append(uncles, block.Uncles()) - } - - lp.dl.DeliverBodies("local", transactions, uncles) - return nil -} - -func (lp *localPeer) RequestReceipts(hashes []common.Hash) error { - var receipts [][]*types.Receipt - - for _, hash := range hashes { - receipts = append(receipts, core.GetBlockReceipts(lp.chainDb, hash, lp.hc.GetBlockNumber(hash))) - } - - lp.dl.DeliverReceipts("local", receipts) - return nil -} - -func (lp *localPeer) RequestNodeData(hashes []common.Hash) error { - var data [][]byte - - for _, hash := range hashes { - if entry, err := lp.chainDb.Get(hash.Bytes()); err == nil { - data = append(data, entry) - } - } - - lp.dl.DeliverNodeData("local", data) - return nil -} - func copyDb(ctx *cli.Context) error { + // Ensure we have a source chain directory to copy if len(ctx.Args()) != 1 { - utils.Fatalf("This command requires an argument.") + utils.Fatalf("Source chaindata directory path argument missing") } - + // Initialize a new chain for the running node to sync into stack := makeFullNode(ctx) chain, chainDb := utils.MakeChain(ctx, stack) - start := time.Now() syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) - mux := new(event.TypeMux) - dl := downloader.New(syncmode, chainDb, mux, chain, nil, nil) + dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil) - var err error - filename := ctx.Args().First() - cache := ctx.GlobalInt(utils.CacheFlag.Name) - handles := 256 - localdb, err := ethdb.NewLDBDatabase(filename, cache, handles) + // Create a source peer to satisfy downloader requests from + db, err := ethdb.NewLDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256) if err != nil { return err } - - hc, err := core.NewHeaderChain(localdb, chain.Config(), chain.Engine(), func() bool { return false }) + hc, err := core.NewHeaderChain(db, chain.Config(), chain.Engine(), func() bool { return false }) if err != nil { return err } - - peer := &localPeer{localdb, hc, dl} - if err := dl.RegisterPeer("local", 63, peer); err != nil { + peer := downloader.NewFakePeer("local", db, hc, dl) + if err = dl.RegisterPeer("local", 63, peer); err != nil { return err } + // Synchronise with the simulated peer + start := time.Now() currentHeader := hc.CurrentHeader() - if err := dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil { + if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil { return err } for dl.Synchronising() { time.Sleep(10 * time.Millisecond) } + fmt.Printf("Database copy done in %v\n", time.Since(start)) - fmt.Printf("Database copy done in %v", time.Since(start)) - + // Compact the entire database to remove any sync overhead start = time.Now() fmt.Println("Compacting entire database...") if err = chainDb.(*ethdb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index a62b4940ba..bfef619f6c 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -31,6 +31,8 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" @@ -1086,17 +1088,22 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai var err error chainDb = MakeChainDatabase(ctx, stack) - engine := ethash.NewFaker() - if !ctx.GlobalBool(FakePoWFlag.Name) { - engine = ethash.New( - stack.ResolvePath(eth.DefaultConfig.EthashCacheDir), eth.DefaultConfig.EthashCachesInMem, eth.DefaultConfig.EthashCachesOnDisk, - stack.ResolvePath(eth.DefaultConfig.EthashDatasetDir), eth.DefaultConfig.EthashDatasetsInMem, eth.DefaultConfig.EthashDatasetsOnDisk, - ) - } config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx)) if err != nil { Fatalf("%v", err) } + var engine consensus.Engine + if config.Clique != nil { + engine = clique.New(config.Clique, chainDb) + } else { + engine = ethash.NewFaker() + if !ctx.GlobalBool(FakePoWFlag.Name) { + engine = ethash.New( + stack.ResolvePath(eth.DefaultConfig.EthashCacheDir), eth.DefaultConfig.EthashCachesInMem, eth.DefaultConfig.EthashCachesOnDisk, + stack.ResolvePath(eth.DefaultConfig.EthashDatasetDir), eth.DefaultConfig.EthashDatasetsInMem, eth.DefaultConfig.EthashDatasetsOnDisk, + ) + } + } vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} chain, err = core.NewBlockChain(chainDb, config, engine, vmcfg) if err != nil { diff --git a/eth/downloader/fakepeer.go b/eth/downloader/fakepeer.go new file mode 100644 index 0000000000..ebdb9c3342 --- /dev/null +++ b/eth/downloader/fakepeer.go @@ -0,0 +1,160 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package downloader + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" +) + +// FakePeer is a mock downloader peer that operates on a local database instance +// instead of being an actual live node. It's useful for testing and to implement +// sync commands from an xisting local database. +type FakePeer struct { + id string + db ethdb.Database + hc *core.HeaderChain + dl *Downloader +} + +// NewFakePeer creates a new mock downloader peer with the given data sources. +func NewFakePeer(id string, db ethdb.Database, hc *core.HeaderChain, dl *Downloader) *FakePeer { + return &FakePeer{id: id, db: db, hc: hc, dl: dl} +} + +// Head implements downloader.Peer, returning the current head hash and number +// of the best known header. +func (p *FakePeer) Head() (common.Hash, *big.Int) { + header := p.hc.CurrentHeader() + return header.Hash(), header.Number +} + +// RequestHeadersByHash implements downloader.Peer, returning a batch of headers +// defined by the origin hash and the associaed query parameters. +func (p *FakePeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, reverse bool) error { + var ( + headers []*types.Header + unknown bool + ) + for !unknown && len(headers) < amount { + origin := p.hc.GetHeaderByHash(hash) + if origin == nil { + break + } + number := origin.Number.Uint64() + headers = append(headers, origin) + if reverse { + for i := 0; i < int(skip)+1; i++ { + if header := p.hc.GetHeader(hash, number); header != nil { + hash = header.ParentHash + number-- + } else { + unknown = true + break + } + } + } else { + var ( + current = origin.Number.Uint64() + next = current + uint64(skip) + 1 + ) + if header := p.hc.GetHeaderByNumber(next); header != nil { + if p.hc.GetBlockHashesFromHash(header.Hash(), uint64(skip+1))[skip] == hash { + hash = header.Hash() + } else { + unknown = true + } + } else { + unknown = true + } + } + } + p.dl.DeliverHeaders(p.id, headers) + return nil +} + +// RequestHeadersByNumber implements downloader.Peer, returning a batch of headers +// defined by the origin number and the associaed query parameters. +func (p *FakePeer) RequestHeadersByNumber(number uint64, amount int, skip int, reverse bool) error { + var ( + headers []*types.Header + unknown bool + ) + for !unknown && len(headers) < amount { + origin := p.hc.GetHeaderByNumber(number) + if origin == nil { + break + } + if reverse { + if number >= uint64(skip+1) { + number -= uint64(skip + 1) + } else { + unknown = true + } + } else { + number += uint64(skip + 1) + } + headers = append(headers, origin) + } + p.dl.DeliverHeaders(p.id, headers) + return nil +} + +// RequestBodies implements downloader.Peer, returning a batch of block bodies +// corresponding to the specified block hashes. +func (p *FakePeer) RequestBodies(hashes []common.Hash) error { + var ( + txs [][]*types.Transaction + uncles [][]*types.Header + ) + for _, hash := range hashes { + block := core.GetBlock(p.db, hash, p.hc.GetBlockNumber(hash)) + + txs = append(txs, block.Transactions()) + uncles = append(uncles, block.Uncles()) + } + p.dl.DeliverBodies(p.id, txs, uncles) + return nil +} + +// RequestReceipts implements downloader.Peer, returning a batch of transaction +// receipts corresponding to the specified block hashes. +func (p *FakePeer) RequestReceipts(hashes []common.Hash) error { + var receipts [][]*types.Receipt + for _, hash := range hashes { + receipts = append(receipts, core.GetBlockReceipts(p.db, hash, p.hc.GetBlockNumber(hash))) + } + p.dl.DeliverReceipts(p.id, receipts) + return nil +} + +// RequestNodeData implements downloader.Peer, returning a batch of state trie +// nodes corresponding to the specified trie hashes. +func (p *FakePeer) RequestNodeData(hashes []common.Hash) error { + var data [][]byte + for _, hash := range hashes { + if entry, err := p.db.Get(hash.Bytes()); err == nil { + data = append(data, entry) + } + } + p.dl.DeliverNodeData(p.id, data) + return nil +} From c599b78f62cda1ab91117b966f88f79fe4778f4f Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Wed, 11 Oct 2017 11:35:44 +0100 Subject: [PATCH 208/272] core/types: fix test for TransactionsByPriceAndNonce --- core/types/transaction_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index 30ecb84ddb..82d74e3b34 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -147,12 +147,12 @@ func TestTransactionPriceNonceSort(t *testing.T) { txset := NewTransactionsByPriceAndNonce(signer, groups) txs := Transactions{} - for { - if tx := txset.Peek(); tx != nil { - txs = append(txs, tx) - txset.Shift() - } - break + for tx := txset.Peek(); tx != nil; tx = txset.Peek() { + txs = append(txs, tx) + txset.Shift() + } + if len(txs) != 25*25 { + t.Errorf("expected %d transactions, found %d", 25*25, len(txs)) } for i, txi := range txs { fromi, _ := Sender(signer, txi) From e9382c6e9ffa03df2e59e441a55eb7aad15e3016 Mon Sep 17 00:00:00 2001 From: terasum Date: Thu, 12 Oct 2017 10:19:23 +0800 Subject: [PATCH 209/272] miner: fix typo --- miner/remote_agent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miner/remote_agent.go b/miner/remote_agent.go index aac7ce8655..287e7530c3 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -163,7 +163,7 @@ func (a *RemoteAgent) SubmitWork(nonce types.BlockNonce, mixDigest, hash common. } // loop monitors mining events on the work and quit channels, updating the internal -// state of the rmeote miner until a termination is requested. +// state of the remote miner until a termination is requested. // // Note, the reason the work and quit channels are passed as parameters is because // RemoteAgent.Start() constantly recreates these channels, so the loop code cannot From 2e83c82f80f104e8073ec4a80c51800e10b37496 Mon Sep 17 00:00:00 2001 From: Ernesto del Toro Date: Fri, 13 Oct 2017 01:13:52 -0400 Subject: [PATCH 210/272] ethash: fix typo --- consensus/ethash/algorithm.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/consensus/ethash/algorithm.go b/consensus/ethash/algorithm.go index a737bc636b..76f19252fa 100644 --- a/consensus/ethash/algorithm.go +++ b/consensus/ethash/algorithm.go @@ -102,7 +102,7 @@ func generateCache(dest []uint32, epoch uint64, seed []byte) { header.Cap *= 4 cache := *(*[]byte)(unsafe.Pointer(&header)) - // Calculate the number of thoretical rows (we'll store in one buffer nonetheless) + // Calculate the number of theoretical rows (we'll store in one buffer nonetheless) size := uint64(len(cache)) rows := int(size) / hashBytes @@ -187,7 +187,7 @@ func fnvHash(mix []uint32, data []uint32) { // generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, // and hashes that to compute a single dataset node. func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte { - // Calculate the number of thoretical rows (we use one buffer nonetheless) + // Calculate the number of theoretical rows (we use one buffer nonetheless) rows := uint32(len(cache) / hashWords) // Initialize the mix @@ -287,7 +287,7 @@ func generateDataset(dest []uint32, epoch uint64, cache []uint32) { // hashimoto aggregates data from the full dataset in order to produce our final // value for a particular header hash and nonce. func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte) { - // Calculate the number of thoretical rows (we use one buffer nonetheless) + // Calculate the number of theoretical rows (we use one buffer nonetheless) rows := uint32(size / mixBytes) // Combine header+nonce into a 64 byte seed From a5fcaa55ac12a1861f13ab0096db1afecbc15904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 13 Oct 2017 11:10:02 +0300 Subject: [PATCH 211/272] trie: make hasher benchmark meaningful post-caches --- trie/trie_test.go | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/trie/trie_test.go b/trie/trie_test.go index 1c90950703..1e28c3bc48 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "io/ioutil" + "math/big" "math/rand" "os" "reflect" @@ -30,7 +31,9 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rlp" ) func init() { @@ -505,8 +508,6 @@ func BenchmarkGet(b *testing.B) { benchGet(b, false) } func BenchmarkGetDB(b *testing.B) { benchGet(b, true) } func BenchmarkUpdateBE(b *testing.B) { benchUpdate(b, binary.BigEndian) } func BenchmarkUpdateLE(b *testing.B) { benchUpdate(b, binary.LittleEndian) } -func BenchmarkHashBE(b *testing.B) { benchHash(b, binary.BigEndian) } -func BenchmarkHashLE(b *testing.B) { benchHash(b, binary.LittleEndian) } const benchElemCount = 20000 @@ -549,18 +550,39 @@ func benchUpdate(b *testing.B, e binary.ByteOrder) *Trie { return trie } -func benchHash(b *testing.B, e binary.ByteOrder) { - trie := newEmpty() - k := make([]byte, 32) - for i := 0; i < benchElemCount; i++ { - e.PutUint64(k, uint64(i)) - trie.Update(k, k) - } +// Benchmarks the trie hashing. Since the trie caches the result of any operation, +// we cannot use b.N as the number of hashing rouns, since all rounds apart from +// the first one will be NOOP. As such, we'll use b.N as the number of account to +// insert into the trie before measuring the hashing. +func BenchmarkHash(b *testing.B) { + // Make the random benchmark deterministic + random := rand.New(rand.NewSource(0)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - trie.Hash() + // Create a realistic account trie to hash + addresses := make([][20]byte, b.N) + for i := 0; i < len(addresses); i++ { + for j := 0; j < len(addresses[i]); j++ { + addresses[i][j] = byte(random.Intn(256)) + } } + accounts := make([][]byte, len(addresses)) + for i := 0; i < len(accounts); i++ { + var ( + nonce = uint64(random.Int63()) + balance = new(big.Int).Rand(random, new(big.Int).Exp(common.Big2, common.Big256, nil)) + root = emptyRoot + code = crypto.Keccak256(nil) + ) + accounts[i], _ = rlp.EncodeToBytes([]interface{}{nonce, balance, root, code}) + } + // Insert the accounts into the trie and hash it + trie := newEmpty() + for i := 0; i < len(addresses); i++ { + trie.Update(crypto.Keccak256(addresses[i][:]), accounts[i]) + } + b.ResetTimer() + b.ReportAllocs() + trie.Hash() } func tempDB() (string, Database) { From a91e6822349b6daa30a311f75b7d824739e5823d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sat, 14 Oct 2017 15:42:48 +0300 Subject: [PATCH 212/272] core/vm: check opcode stack before readonly enforcement --- core/vm/interpreter.go | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 94b922c797..516438509f 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -138,10 +138,10 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret pc = uint64(0) // program counter cost uint64 // copies used by tracer - stackCopy = newstack() // stackCopy needed for Tracer since stack is mutated by 63/64 gas rule - pcCopy uint64 // needed for the deferred Tracer - gasCopy uint64 // for Tracer to log gas remaining before execution - logged bool // deferred Tracer should ignore already logged steps + stackCopy = newstack() // stackCopy needed for Tracer since stack is mutated by 63/64 gas rule + pcCopy uint64 // needed for the deferred Tracer + gasCopy uint64 // for Tracer to log gas remaining before execution + logged bool // deferred Tracer should ignore already logged steps ) contract.Input = input @@ -169,22 +169,19 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret } } - // get the operation from the jump table matching the opcode + // Get the operation from the jump table matching the opcode and validate the + // stack and make sure there enough stack items available to perform the operation operation := in.cfg.JumpTable[op] - if err := in.enforceRestrictions(op, operation, stack); err != nil { - return nil, err - } - - // if the op is invalid abort the process and return an error if !operation.valid { return nil, fmt.Errorf("invalid opcode 0x%x", int(op)) } - - // validate the stack and make sure there enough stack items available - // to perform the operation if err := operation.validateStack(stack); err != nil { return nil, err } + // If the operation is valid, enforce and write restrictions + if err := in.enforceRestrictions(op, operation, stack); err != nil { + return nil, err + } var memorySize uint64 // calculate the new memory size and expand the memory to fit From 1db4ecdc0b9e828ff65777fb466fc7c1d04e0de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sat, 14 Oct 2017 15:58:53 +0300 Subject: [PATCH 213/272] params: bump to 1.7.2 stable --- params/version.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params/version.go b/params/version.go index 1abbae98a3..bde6d7b371 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 2 // Patch version component of the current release - VersionMeta = "unstable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 2 // Patch version component of the current release + VersionMeta = "stable" // Version metadata to append to the version string ) // Version holds the textual version string. From e9295163aa25479e817efee4aac23eaeb7554bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sat, 14 Oct 2017 16:00:46 +0300 Subject: [PATCH 214/272] VERSION, params: start 1.7.3 release cycle --- VERSION | 2 +- params/version.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index f8a696c8dc..661e7aeadf 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.7.2 +1.7.3 diff --git a/params/version.go b/params/version.go index bde6d7b371..40d4591625 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 2 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 3 // Patch version component of the current release + VersionMeta = "unstable" // Version metadata to append to the version string ) // Version holds the textual version string. From 0bb194c956ac41eed5445c962b33f56d904b7759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 16 Oct 2017 16:30:13 +0300 Subject: [PATCH 215/272] cmd/faucet: support twitter, google+ and facebook auth too --- cmd/faucet/faucet.go | 255 +++++++++++++++++++++++++++++++---------- cmd/faucet/faucet.html | 25 +++- cmd/faucet/website.go | 2 +- 3 files changed, 215 insertions(+), 67 deletions(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 8cd62441ed..6b2987315a 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -21,8 +21,10 @@ package main import ( "bytes" + "compress/zlib" "context" "encoding/json" + "errors" "flag" "fmt" "html/template" @@ -33,6 +35,7 @@ import ( "net/url" "os" "path/filepath" + "regexp" "strconv" "strings" "sync" @@ -181,10 +184,10 @@ func main() { // request represents an accepted funding request. type request struct { - Username string `json:"username"` // GitHub user for displaying an avatar - Account common.Address `json:"account"` // Ethereum address being funded - Time time.Time `json:"time"` // Timestamp when te request was accepted - Tx *types.Transaction `json:"tx"` // Transaction funding the account + Avatar string `json:"avatar"` // Avatar URL to make the UI nicer + Account common.Address `json:"account"` // Ethereum address being funded + Time time.Time `json:"time"` // Timestamp when te request was accepted + Tx *types.Transaction `json:"tx"` // Transaction funding the account } // faucet represents a crypto faucet backed by an Ethereum light client. @@ -344,15 +347,16 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { if err := websocket.JSON.Receive(conn, &msg); err != nil { return } - if !strings.HasPrefix(msg.URL, "https://gist.github.com/") { - websocket.JSON.Send(conn, map[string]string{"error": "URL doesn't link to GitHub Gists"}) + if !strings.HasPrefix(msg.URL, "https://gist.github.com/") && !strings.HasPrefix(msg.URL, "https://twitter.com/") && + !strings.HasPrefix(msg.URL, "https://plus.google.com/") && !strings.HasPrefix(msg.URL, "https://www.facebook.com/") { + websocket.JSON.Send(conn, map[string]string{"error": "URL doesn't link to supported services"}) continue } if msg.Tier >= uint(*tiersFlag) { websocket.JSON.Send(conn, map[string]string{"error": "Invalid funding tier requested"}) continue } - log.Info("Faucet funds requested", "gist", msg.URL, "tier", msg.Tier) + log.Info("Faucet funds requested", "url", msg.URL, "tier", msg.Tier) // If captcha verifications are enabled, make sure we're not dealing with a robot if *captchaToken != "" { @@ -381,65 +385,37 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { continue } } - // Retrieve the gist from the GitHub Gist APIs - parts := strings.Split(msg.URL, "/") - req, _ := http.NewRequest("GET", "https://api.github.com/gists/"+parts[len(parts)-1], nil) - if *githubUser != "" { - req.SetBasicAuth(*githubUser, *githubToken) + // Retrieve the Ethereum address to fund, the requesting user and a profile picture + var ( + username string + avatar string + address common.Address + ) + switch { + case strings.HasPrefix(msg.URL, "https://gist.github.com/"): + username, avatar, address, err = authGitHub(msg.URL) + case strings.HasPrefix(msg.URL, "https://twitter.com/"): + username, avatar, address, err = authTwitter(msg.URL) + case strings.HasPrefix(msg.URL, "https://plus.google.com/"): + username, avatar, address, err = authGooglePlus(msg.URL) + case strings.HasPrefix(msg.URL, "https://www.facebook.com/"): + username, avatar, address, err = authFacebook(msg.URL) + default: + err = errors.New("Something funky happened, please open an issue at https://github.com/ethereum/go-ethereum/issues") } - res, err := http.DefaultClient.Do(req) if err != nil { websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) continue } - var gist struct { - Owner struct { - Login string `json:"login"` - } `json:"owner"` - Files map[string]struct { - Content string `json:"content"` - } `json:"files"` - } - err = json.NewDecoder(res.Body).Decode(&gist) - res.Body.Close() - if err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) - continue - } - if gist.Owner.Login == "" { - websocket.JSON.Send(conn, map[string]string{"error": "Anonymous Gists not allowed"}) - continue - } - // Iterate over all the files and look for Ethereum addresses - var address common.Address - for _, file := range gist.Files { - content := strings.TrimSpace(file.Content) - if len(content) == 2+common.AddressLength*2 { - address = common.HexToAddress(content) - } - } - if address == (common.Address{}) { - websocket.JSON.Send(conn, map[string]string{"error": "No Ethereum address found to fund"}) - continue - } - // Validate the user's existence since the API is unhelpful here - if res, err = http.Head("https://github.com/" + gist.Owner.Login); err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) - continue - } - res.Body.Close() + log.Info("Faucet request valid", "url", msg.URL, "tier", msg.Tier, "user", username, "address", address) - if res.StatusCode != 200 { - websocket.JSON.Send(conn, map[string]string{"error": "Invalid user... boom!"}) - continue - } // Ensure the user didn't request funds too recently f.lock.Lock() var ( fund bool timeout time.Time ) - if timeout = f.timeouts[gist.Owner.Login]; time.Now().After(timeout) { + if timeout = f.timeouts[username]; time.Now().After(timeout) { // User wasn't funded recently, create the funding transaction amount := new(big.Int).Mul(big.NewInt(int64(*payoutFlag)), ether) amount = new(big.Int).Mul(amount, new(big.Int).Exp(big.NewInt(5), big.NewInt(int64(msg.Tier)), nil)) @@ -459,12 +435,12 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { continue } f.reqs = append(f.reqs, &request{ - Username: gist.Owner.Login, - Account: address, - Time: time.Now(), - Tx: signed, + Avatar: avatar, + Account: address, + Time: time.Now(), + Tx: signed, }) - f.timeouts[gist.Owner.Login] = time.Now().Add(time.Duration(*minutesFlag*int(math.Pow(3, float64(msg.Tier)))) * time.Minute) + f.timeouts[username] = time.Now().Add(time.Duration(*minutesFlag*int(math.Pow(3, float64(msg.Tier)))) * time.Minute) fund = true } f.lock.Unlock() @@ -474,7 +450,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { websocket.JSON.Send(conn, map[string]string{"error": fmt.Sprintf("%s left until next allowance", common.PrettyDuration(timeout.Sub(time.Now())))}) continue } - websocket.JSON.Send(conn, map[string]string{"success": fmt.Sprintf("Funding request accepted for %s into %s", gist.Owner.Login, address.Hex())}) + websocket.JSON.Send(conn, map[string]string{"success": fmt.Sprintf("Funding request accepted for %s into %s", username, address.Hex())}) select { case f.update <- struct{}{}: default: @@ -542,3 +518,162 @@ func (f *faucet) loop() { } } } + +// authGitHub tries to authenticate a faucet request using GitHub gists, returning +// the username, avatar URL and Ethereum address to fund on success. +func authGitHub(url string) (string, string, common.Address, error) { + // Retrieve the gist from the GitHub Gist APIs + parts := strings.Split(url, "/") + req, _ := http.NewRequest("GET", "https://api.github.com/gists/"+parts[len(parts)-1], nil) + if *githubUser != "" { + req.SetBasicAuth(*githubUser, *githubToken) + } + res, err := http.DefaultClient.Do(req) + if err != nil { + return "", "", common.Address{}, err + } + var gist struct { + Owner struct { + Login string `json:"login"` + } `json:"owner"` + Files map[string]struct { + Content string `json:"content"` + } `json:"files"` + } + err = json.NewDecoder(res.Body).Decode(&gist) + res.Body.Close() + if err != nil { + return "", "", common.Address{}, err + } + if gist.Owner.Login == "" { + return "", "", common.Address{}, errors.New("Anonymous Gists not allowed") + } + // Iterate over all the files and look for Ethereum addresses + var address common.Address + for _, file := range gist.Files { + content := strings.TrimSpace(file.Content) + if len(content) == 2+common.AddressLength*2 { + address = common.HexToAddress(content) + } + } + if address == (common.Address{}) { + return "", "", common.Address{}, errors.New("No Ethereum address found to fund") + } + // Validate the user's existence since the API is unhelpful here + if res, err = http.Head("https://github.com/" + gist.Owner.Login); err != nil { + return "", "", common.Address{}, err + } + res.Body.Close() + + if res.StatusCode != 200 { + return "", "", common.Address{}, errors.New("Invalid user... boom!") + } + // Everything passed validation, return the gathered infos + return gist.Owner.Login + "@github", fmt.Sprintf("https://github.com/%s.png?size=64", gist.Owner.Login), address, nil +} + +// authTwitter tries to authenticate a faucet request using Twitter posts, returning +// the username, avatar URL and Ethereum address to fund on success. +func authTwitter(url string) (string, string, common.Address, error) { + // Ensure the user specified a meaningful URL, no fancy nonsense + parts := strings.Split(url, "/") + if len(parts) < 4 || parts[len(parts)-2] != "status" { + return "", "", common.Address{}, errors.New("Invalid Twitter status URL") + } + username := parts[len(parts)-3] + + // Twitter's API isn't really friendly with direct links. Still, we don't + // want to do ask read permissions from users, so just load the public posts and + // scrape it for the Ethereum address and profile URL. + res, err := http.Get(url) + if err != nil { + return "", "", common.Address{}, err + } + defer res.Body.Close() + + reader, err := zlib.NewReader(res.Body) + if err != nil { + return "", "", common.Address{}, err + } + body, err := ioutil.ReadAll(reader) + if err != nil { + return "", "", common.Address{}, err + } + address := common.HexToAddress(string(regexp.MustCompile("0x[0-9a-fA-F]{40}").Find(body))) + if address == (common.Address{}) { + return "", "", common.Address{}, errors.New("No Ethereum address found to fund") + } + var avatar string + if parts = regexp.MustCompile("src=\"([^\"]+twimg.com/profile_images[^\"]+)\"").FindStringSubmatch(string(body)); len(parts) == 2 { + avatar = parts[1] + } + return username + "@twitter", avatar, address, nil +} + +// authGooglePlus tries to authenticate a faucet request using GooglePlus posts, +// returning the username, avatar URL and Ethereum address to fund on success. +func authGooglePlus(url string) (string, string, common.Address, error) { + // Ensure the user specified a meaningful URL, no fancy nonsense + parts := strings.Split(url, "/") + if len(parts) < 4 || parts[len(parts)-2] != "posts" { + return "", "", common.Address{}, errors.New("Invalid Google+ post URL") + } + username := parts[len(parts)-3] + + // Google's API isn't really friendly with direct links. Still, we don't + // want to do ask read permissions from users, so just load the public posts and + // scrape it for the Ethereum address and profile URL. + res, err := http.Get(url) + if err != nil { + return "", "", common.Address{}, err + } + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", common.Address{}, err + } + address := common.HexToAddress(string(regexp.MustCompile("0x[0-9a-fA-F]{40}").Find(body))) + if address == (common.Address{}) { + return "", "", common.Address{}, errors.New("No Ethereum address found to fund") + } + var avatar string + if parts = regexp.MustCompile("src=\"([^\"]+googleusercontent.com[^\"]+photo.jpg)\"").FindStringSubmatch(string(body)); len(parts) == 2 { + avatar = parts[1] + } + return username + "@google+", avatar, address, nil +} + +// authFacebook tries to authenticate a faucet request using Facebook posts, +// returning the username, avatar URL and Ethereum address to fund on success. +func authFacebook(url string) (string, string, common.Address, error) { + // Ensure the user specified a meaningful URL, no fancy nonsense + parts := strings.Split(url, "/") + if len(parts) < 4 || parts[len(parts)-2] != "posts" { + return "", "", common.Address{}, errors.New("Invalid Facebook post URL") + } + username := parts[len(parts)-3] + + // Facebook's Graph API isn't really friendly with direct links. Still, we don't + // want to do ask read permissions from users, so just load the public posts and + // scrape it for the Ethereum address and profile URL. + res, err := http.Get(url) + if err != nil { + return "", "", common.Address{}, err + } + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", common.Address{}, err + } + address := common.HexToAddress(string(regexp.MustCompile("0x[0-9a-fA-F]{40}").Find(body))) + if address == (common.Address{}) { + return "", "", common.Address{}, errors.New("No Ethereum address found to fund") + } + var avatar string + if parts = regexp.MustCompile("src=\"([^\"]+fbcdn.net[^\"]+)\"").FindStringSubmatch(string(body)); len(parts) == 2 { + avatar = parts[1] + } + return username + "@facebook", avatar, address, nil +} diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index 56dd376236..3b928d6367 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -5,7 +5,7 @@ - {{.Network}}: GitHub Faucet + {{.Network}}: Authenticated Faucet @@ -43,13 +43,13 @@
-

{{.Network}} GitHub Authenticated Faucet

+

{{.Network}} Authenticated Faucet

- +
"; + content += ""; } $("#requests").html("" + content + ""); } diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index 3151ab5842..5a80cb0a79 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\x6d\x6f\xdc\x36\x12\xfe\xec\xfc\x8a\xa9\x2e\xad\x77\x61\x4b\xb2\xe3\x20\x2d\xd6\xd2\x16\x41\x9a\x4b\x7b\x38\xb4\x45\x9b\xe2\xae\x68\x8b\x03\x25\xcd\x4a\x8c\x29\x52\x25\x87\xbb\xde\x1a\xfb\xdf\x0f\x24\x25\xad\x76\x6d\xa7\xb9\x4b\xf3\x61\x23\x92\x33\xcf\xbc\x51\xf3\x22\x67\x9f\x7c\xf5\xdd\xab\xb7\x3f\x7f\xff\x1a\x1a\x6a\xc5\xf2\x49\xe6\xfe\x03\xc1\x64\x9d\x47\x28\xa3\xe5\x93\x93\xac\x41\x56\x2d\x9f\x9c\x9c\x64\x2d\x12\x83\xb2\x61\xda\x20\xe5\x91\xa5\x55\xfc\x45\xb4\x3f\x68\x88\xba\x18\x7f\xb7\x7c\x9d\x47\xff\x8e\x7f\x7a\x19\xbf\x52\x6d\xc7\x88\x17\x02\x23\x28\x95\x24\x94\x94\x47\xdf\xbc\xce\xb1\xaa\x71\xc2\x27\x59\x8b\x79\xb4\xe6\xb8\xe9\x94\xa6\x09\xe9\x86\x57\xd4\xe4\x15\xae\x79\x89\xb1\x5f\x9c\x03\x97\x9c\x38\x13\xb1\x29\x99\xc0\xfc\x32\x5a\x3e\x71\x38\xc4\x49\xe0\xf2\xee\x2e\xf9\x16\x69\xa3\xf4\xcd\x6e\xb7\x80\x37\x9c\xbe\xb6\x05\xfc\x9d\xd9\x12\x29\x4b\x03\x89\xa7\x16\x5c\xde\x40\xa3\x71\x95\x47\x4e\x67\xb3\x48\xd3\xb2\x92\xef\x4c\x52\x0a\x65\xab\x95\x60\x1a\x93\x52\xb5\x29\x7b\xc7\x6e\x53\xc1\x0b\x93\xd2\x86\x13\xa1\x8e\x0b\xa5\xc8\x90\x66\x5d\x7a\x95\x5c\x25\x9f\xa7\xa5\x31\xe9\xb8\x97\xb4\x5c\x26\xa5\x31\x11\x68\x14\x79\x64\x68\x2b\xd0\x34\x88\x14\x41\xba\xfc\xff\xe4\xae\x94\xa4\x98\x6d\xd0\xa8\x16\xd3\xe7\xc9\xe7\xc9\x85\x17\x39\xdd\x7e\xbf\x54\x27\xd6\x94\x9a\x77\x04\x46\x97\x1f\x2c\xf7\xdd\xef\x16\xf5\x36\xbd\x4a\x2e\x93\xcb\x7e\xe1\xe5\xbc\x33\xd1\x32\x4b\x03\xe0\xf2\xa3\xb0\x63\xa9\x68\x9b\x3e\x4b\x9e\x27\x97\x69\xc7\xca\x1b\x56\x63\x35\x48\x72\x47\xc9\xb0\xf9\x97\xc9\x7d\x2c\x86\xef\x8e\x43\xf8\x57\x08\x6b\x55\x8b\x92\x92\x77\x26\x7d\x96\x5c\x7e\x91\x5c\x0c\x1b\xf7\xf1\xbd\x00\x17\x34\x27\xea\x24\x59\xa3\x26\x5e\x32\x11\x97\x28\x09\x35\xdc\xb9\xdd\x93\x96\xcb\xb8\x41\x5e\x37\xb4\x80\xcb\x8b\x8b\x4f\xaf\x1f\xda\x5d\x37\x61\xbb\xe2\xa6\x13\x6c\xbb\x80\x95\xc0\xdb\xb0\xc5\x04\xaf\x65\xcc\x09\x5b\xb3\x80\x80\xec\x0f\x76\x5e\x66\xa7\x55\xad\xd1\x98\x5e\x58\xa7\x0c\x27\xae\xe4\xc2\xdd\x28\x46\x7c\x8d\x0f\xd1\x9a\x8e\xc9\x7b\x0c\xac\x30\x4a\x58\xc2\x23\x45\x0a\xa1\xca\x9b\xb0\xe7\x5f\xe3\xa9\x11\xa5\x12\x4a\x2f\x60\xd3\xf0\x9e\x0d\xbc\x20\xe8\x34\xf6\xf0\xd0\xb1\xaa\xe2\xb2\x5e\xc0\x8b\xae\xb7\x07\x5a\xa6\x6b\x2e\x17\x70\xb1\x67\xc9\xd2\xc1\x8d\x59\x1a\x32\xd6\x93\x93\xac\x50\xd5\xd6\xc7\xb0\xe2\x6b\x28\x05\x33\x26\x8f\x8e\x5c\xec\x33\xd1\x01\x81\x4b\x40\x8c\xcb\xe1\xe8\xe0\x4c\xab\x4d\x04\x5e\x50\x1e\x05\x25\xe2\x42\x11\xa9\x76\x01\x97\x4e\xbd\x9e\xe5\x08\x4f\xc4\xa2\x8e\x2f\x9f\x0d\x87\x27\x59\x73\x39\x80\x10\xde\x52\xec\xe3\x33\x46\x26\x5a\x66\x7c\xe0\x5d\x31\x58\xb1\xb8\x60\xd4\x44\xc0\x34\x67\x71\xc3\xab\x0a\x65\x1e\x91\xb6\xe8\xee\x11\x5f\xc2\x34\xef\x0d\x69\xef\xa5\xa5\x06\xa5\xb3\x93\xb0\xea\x93\x20\x1c\xc3\xd6\x9c\x1a\x5b\xc4\x4c\xd0\xa3\xe0\x59\xda\x5c\x0e\x26\xa5\x15\x5f\xf7\x1e\x99\x3c\x1e\x39\xe7\x71\xfb\xbf\x80\xfe\x41\xad\x56\x06\x29\x9e\xb8\x63\x42\xcc\x65\x67\x29\xae\xb5\xb2\xdd\x78\x7e\x92\xf9\x5d\xe0\x55\x1e\xd5\xdc\x50\x04\xb4\xed\x7a\xdf\x45\xa3\x49\x4a\xb7\xb1\x0b\x9d\x56\x22\x82\x4e\xb0\x12\x1b\x25\x2a\xd4\x79\xd4\xfb\xe4\x0d\x37\x04\x3f\xfd\xf0\x4f\xe8\x03\xcc\x65\x0d\x5b\x65\x35\xbc\xa6\x06\x35\xda\x16\x58\x55\xb9\xcb\x9d\x24\xc9\x44\xb6\xbf\xe9\xf7\xb5\x8b\x0b\x92\x7b\xaa\x93\xac\xb0\x44\x6a\x24\x2c\x48\x42\x41\x32\xae\x70\xc5\xac\x20\xa8\xb4\xea\x2a\xb5\x91\x31\xa9\xba\x76\x05\x31\x58\x10\x98\x22\xa8\x18\xb1\xfe\x28\x8f\x06\xda\x21\x28\xcc\x74\xaa\xb3\x5d\x1f\x96\xb0\x89\xb7\x1d\x93\x15\x56\x2e\x94\xc2\x60\xb4\x7c\xc3\xd7\x08\x2d\x06\x5b\x4e\x8e\x23\x5d\x32\x8d\x14\x4f\x41\x1f\x88\x74\x50\x26\x98\x04\xfd\xbf\xcc\x8a\x01\x69\x34\xa1\x45\x69\xe1\x60\x15\x6b\x97\x85\xa2\xe5\xdd\x9d\x66\xb2\x46\x78\xca\xab\xdb\x73\x78\xca\x5a\x65\x25\xc1\x22\x87\xe4\xa5\x7f\x34\xbb\xdd\x01\x3a\x40\x26\xf8\x32\x63\xef\x7b\x19\x40\xc9\x52\xf0\xf2\x26\x8f\x88\xa3\xce\xef\xee\x1c\xf8\x6e\x77\x0d\x77\x77\x7c\x05\x4f\x93\x1f\xb0\x64\x1d\x95\x0d\xdb\xed\x6a\x3d\x3c\x27\x78\x8b\xa5\x25\x9c\xcd\xef\xee\x50\x18\xdc\xed\x8c\x2d\x5a\x4e\xb3\x81\xdd\xed\xcb\x6a\xb7\x73\x3a\xf7\x7a\xee\x76\x90\x3a\x50\x59\xe1\x2d\x3c\x4d\xbe\x47\xcd\x55\x65\x20\xd0\x67\x29\x5b\x66\xa9\xe0\xcb\x9e\xef\xd0\x49\xa9\x15\xfb\xfb\x92\xba\x0b\x33\x5e\x6d\xff\xa6\x78\x55\xa7\x9a\x3e\x70\xf1\xeb\x78\xd4\xbe\xbf\x0f\x86\x13\xde\xe0\x36\x8f\xee\xee\xa6\xbc\xfd\x69\xc9\x84\x28\x98\xf3\x4b\x30\x6d\x64\xfa\x03\xdd\x3d\x5d\x73\xe3\x3b\xaf\xe5\xa0\xc1\x5e\xed\x0f\x7c\x93\x8f\xd2\x1c\xa9\x6e\x01\x57\xcf\x26\x39\xee\xa1\x97\xfc\xc5\xd1\x4b\x7e\xf5\x20\x71\xc7\x24\x0a\xf0\xbf\xb1\x69\x99\x18\x9e\xfb\xb7\x65\xf2\xf2\x1d\x33\xc5\x2e\xa3\x8f\xaa\x8d\x95\xe1\xe2\x1a\xd4\x1a\xf5\x4a\xa8\xcd\x02\x98\x25\x75\x0d\x2d\xbb\x1d\xab\xe3\xd5\xc5\xc5\x54\x6f\xd7\x31\xb2\x42\xa0\x4f\x28\x1a\x7f\xb7\x68\xc8\x8c\x89\x24\x1c\xf9\x5f\x97\x4f\x2a\x94\x06\xab\x23\x6f\x38\x89\xce\xb5\x9e\x6a\x12\xfa\xd1\x99\x0f\xea\xbe\x52\x6a\x2c\x38\x53\x35\x7a\xe8\x49\x6d\x8c\x96\x19\xe9\x3d\xdd\x49\x46\xd5\xff\x54\x30\xb4\x6b\x08\x1f\xab\x17\x21\xa3\x39\xdb\x3b\x44\x1d\xba\x11\x77\x65\xc1\x2f\xb3\x94\xaa\x8f\x90\xec\x2e\x61\xc1\x0c\x7e\x88\x78\xdf\x17\xec\xc5\xfb\xe5\xc7\xca\x6f\x90\x69\x2a\x90\x3d\x5e\xd2\x26\x0a\xac\xac\xac\x26\xf6\xfb\xdc\xf9\xb1\x0a\x58\xc9\xd7\xa8\x0d\xa7\xed\x87\x6a\x80\xd5\x5e\x85\xb0\x3e\x54\x21\x4b\x49\xbf\xff\xae\x4d\x17\x7f\xd1\xcb\xfd\x67\x0d\xcc\xd5\xf2\x6b\xb5\x81\x4a\xa1\x01\x6a\xb8\x01\xd7\x7e\x7c\x99\xa5\xcd\xd5\x48\xd2\x2d\xdf\xba\x03\xef\x54\x58\x85\x0e\x84\x1b\xd0\x56\xfa\xca\xab\x24\x50\x83\x87\xcd\x8b\x0c\x4f\x09\xbc\x55\xae\x01\x5c\xa3\x24\x68\x99\xe0\x25\x57\xd6\x00\x2b\x49\x69\x03\x2b\xad\x5a\xc0\xdb\x86\x59\x43\x0e\xc8\xa5\x0f\xb6\x66\x5c\xf8\x77\xc9\x87\x14\x94\x06\x56\x96\xb6\xb5\xae\x81\x95\x35\xa0\x54\xb6\x6e\x7a\x5d\x48\x41\x28\x4c\x42\xc9\x7a\xd4\xc7\x74\xac\x05\x46\xc4\xca\x1b\x73\x0e\x43\x56\x00\xa6\x11\x88\x63\xe5\xb8\xfa\x3e\x82\x95\xa5\x2f\x66\x09\xbc\x94\x5b\x25\x11\x1a\xb6\xf6\x8a\x1c\x11\x40\xcb\xb6\x03\x50\xaf\xd7\x86\x53\xc3\x83\xe1\x1d\xea\xd6\x4d\x24\x15\x08\xde\x72\x32\x49\x96\x76\x53\xdf\xa9\x43\xd6\x73\x30\xbc\xed\xc4\x16\x4a\x8d\x8c\x10\x18\x64\xec\x68\x98\x74\xad\x51\x12\x7a\x3a\x3f\x8e\x44\x40\x4c\xd7\x6e\x54\xff\x0f\x2b\x94\xa5\x45\x21\x98\xbc\x71\xad\xc2\xd8\x0e\xb9\xb2\xe6\x95\x7a\xb8\x11\x82\x8e\x19\xa7\x21\x97\xa4\xbc\xd2\xfd\x6c\x6e\x60\xe6\x56\x2b\x2e\xd0\x8f\xef\xfe\x1e\xc8\x53\x67\xb1\x9b\xb1\xe6\xe7\x50\xaa\x6e\x1b\xb8\x3d\x9f\x53\xcd\xf8\xde\x6b\x84\x62\x85\x5a\x23\x84\xc6\xae\x50\xb7\xc0\x64\x05\x2b\xae\x11\xd8\x86\x6d\x3f\x81\x9f\x95\x85\x92\x49\x20\xcd\xca\x9b\x20\xdb\x6a\xed\x2e\x44\x87\xd2\x25\xfd\x7d\x88\x0a\x14\x6a\xe3\x49\x02\xda\x8a\xa3\xf0\xf1\x32\x88\xd0\xa8\x0d\xb4\xb6\xf4\x06\xba\x40\xa1\x3b\xd8\x30\x4e\x60\x25\x71\x11\xec\x26\xab\x25\x94\xaa\xc5\x83\x28\xdc\xab\xda\x19\xb6\xcb\xb7\xce\xee\x7b\x97\x79\xac\xb7\xa0\xf1\x55\x20\x87\x4e\x2b\xc2\xd2\x0d\x46\xc0\x6a\xc6\xa5\x71\x76\xfa\x38\x63\xfb\x01\xf5\x78\x7c\xea\x1f\xf6\x93\xa8\x3f\x4e\x53\x78\x23\x54\xc1\x04\xac\x5d\x96\x29\x84\x7b\x11\x15\xb8\x96\xf7\xc0\x5b\x86\x18\x59\x03\x6a\xe5\x77\x83\xe6\x8e\x7f\xcd\xb4\xbb\xed\xd8\x76\x04\x79\x3f\x47\xb9\x3d\x83\x7a\xdd\x4f\x87\x6e\xe9\x7a\xae\x70\xde\x0b\xfd\x0a\x57\x5c\x86\xa0\xae\xac\x0c\xe6\x51\xc3\x08\x42\x17\x62\x80\xf9\x60\x83\xd5\x02\xfa\x48\x07\xc8\x51\x80\xa7\x83\x7c\x64\x9f\xdd\xf3\x73\xff\xd0\xfb\x68\xde\xcf\x81\x01\x26\x31\x28\xab\xd9\x3f\x7e\xfc\xee\xdb\xc4\x90\xe6\xb2\xe6\xab\xed\xec\xce\x6a\xb1\x80\xa7\xb3\xe8\x6f\x7e\x3c\x98\xff\x72\xf1\x5b\xb2\x66\xc2\xe2\xb9\x37\x60\xe1\x7f\xef\x89\x39\x87\xfe\x71\x01\x87\x12\x77\xf3\xf9\xf5\xc3\x2d\xdb\xa4\xc3\xd4\x68\x90\x66\x8e\x70\x8c\xe4\xee\xfa\xd0\x49\x0c\x5a\xa4\x46\xf9\xbb\xa8\xb1\x54\x52\x62\x49\x60\x3b\x25\x7b\x9f\x80\x50\xc6\x0c\x8e\xd9\x53\x4c\x7c\x33\x18\xcf\x57\x30\x1b\xc2\xf5\x29\x3c\x83\x3c\x87\x8b\xe1\xac\xf7\x0c\xe4\x20\x71\x03\xff\xc2\xe2\x47\x55\xde\x20\xcd\xa2\x8d\x71\x69\x21\x82\x33\x10\xaa\x64\x0e\x2f\x69\x94\x21\x38\x83\x28\x65\x1d\x8f\xe6\x61\x9a\xde\x81\x6b\x91\xff\x1c\xec\x83\xb0\xc2\xf7\x86\xa0\xe9\xd9\x59\xb8\x36\x43\xe8\x94\x6c\xd1\x18\x56\xe3\xd4\x42\x9f\xe5\x47\x53\x9c\x23\x5a\x53\x43\x0e\x3e\xc4\x1d\xd3\x06\x03\x49\xe2\x3a\x8b\x5e\x8a\x77\x87\x27\xcb\x73\x90\x56\x88\x91\xff\x44\xa3\x7b\x99\x7b\xb2\xdd\x93\x03\xf2\x24\x24\xe1\x4f\xf2\x1c\x5c\x99\x75\x31\xaa\xf6\x9c\xee\xfa\x84\x86\x60\x9e\xb8\x4a\xbf\xe7\x98\x8f\x70\xf7\xd0\xb0\xfa\x33\x38\xac\x8e\xf1\xb0\x7a\x04\xd0\xf7\x5f\xef\xc3\x0b\xfd\xda\x04\xce\x6f\x3c\x82\x26\x6d\x5b\xa0\x7e\x1f\x5c\xe8\xbf\x7a\x38\xef\xea\x6f\x24\x4d\x78\xcf\xe1\xf2\xc5\xfc\x11\x74\xd4\x5a\x3d\x0a\x2e\x15\x6d\x67\x77\x82\x6d\x5d\xd5\x81\x53\x52\xdd\x2b\xdf\x2e\x9d\x9e\x83\x93\xb5\x80\x11\xe1\xdc\x0f\xc2\x0b\x38\xf5\xab\xd3\xdd\x23\xd2\x8c\x2d\x4b\x57\x8f\x3e\x46\x5e\x8f\x31\x4a\xec\xd7\x8f\xca\x1c\xeb\xcb\x81\x50\xf8\xec\x33\xb8\x77\x7a\x78\x05\xdd\x1d\xee\x0b\x25\xe4\x10\x45\x3d\xfc\xc9\x4a\x69\x98\xb9\x43\x9e\x5f\x5c\x03\xcf\xa6\x30\x89\x40\x59\x53\x73\x0d\xfc\xec\x6c\x8f\x74\x32\xc0\x9c\xe5\x10\xb9\x89\x20\xa3\x6a\xe9\x3b\xb3\xd0\xbe\xfd\x1a\xb9\x09\xb0\xd6\xca\xca\x6a\xe1\x52\xee\xec\x74\xdf\x0c\x4c\xfa\x80\xb3\x03\x95\x7f\xe1\xbf\x25\xd6\xa0\xf6\x95\xfb\x0c\xa2\xa4\x93\xf5\x97\x7e\x6e\x7c\xf1\xfc\x74\x7e\x0d\x7b\x4c\x3f\x4d\x2e\xa0\x74\xb3\xd5\x35\x84\xf9\xc4\x77\x89\x30\x4e\x56\x7e\x55\x28\x5d\xa1\x8e\x35\xab\xb8\x35\x0b\x78\xde\xdd\x5e\xff\x3a\x4c\x9e\xbe\x97\xf5\x7a\x77\x1a\x97\x0f\xe9\x32\xb4\x4b\x67\x10\x65\xa9\x23\x1a\x58\x46\x2b\xa7\x5f\x0d\xe1\x81\x2e\x1c\xc6\x6f\x7a\xfd\x7e\xcb\xab\x4a\xa0\x53\xc2\x0b\x0c\x1f\x5f\x2b\xab\x7d\xe2\x9a\x85\xf5\xec\x58\x0f\xe2\x2d\xce\x13\x2b\xf9\xed\x6c\x1e\xf7\x34\xc3\xfa\x1c\x4e\x8d\xcb\xcf\x95\x39\x9d\x27\x8d\x6d\x99\xe4\x7f\xe0\xcc\xb5\xf4\xf3\xa0\xb7\xd3\xd8\xf5\xe9\x63\xb4\x77\x93\x17\x6d\x9c\x31\xe7\x49\x43\xad\x98\x45\x19\xf9\x2f\x93\x4e\xb9\x31\xc4\x1e\x25\x6c\x1f\xde\xc8\xdd\x61\x0e\x2d\x85\x32\x78\x54\x23\xc0\x20\xbd\xe5\x2d\x2a\x4b\xb3\xb1\x8e\x9c\xbb\xb9\xf7\x62\x7e\x0d\xbb\xfd\x07\xdc\x34\x85\xd7\xc6\x4d\x12\xdc\x34\xc0\x60\x83\x85\xf1\xf9\x1d\x7a\x1e\x5f\xce\x43\xd9\x7e\xf9\xfd\x37\x93\xd2\x3d\xa2\xce\xbc\x72\xe3\x07\xec\x87\xea\xe4\x83\x5f\xcc\x37\x9b\x4d\x52\x2b\x55\x8b\xf0\xad\x7c\x2c\xa4\xae\x7a\x24\xef\xdc\xb8\x6a\xb6\xb2\x84\x0a\x57\xa8\x97\x13\xf8\xbe\xba\x66\x69\xf8\x96\x9b\xa5\xe1\xef\x54\xff\x0d\x00\x00\xff\xff\x71\x50\x77\xf3\xb8\x1a\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3a\x7f\x73\xe3\xb6\xb1\x7f\xfb\x3e\xc5\x86\xef\x5c\x4b\x63\x93\x94\xe5\xcb\xd5\x4f\x26\x95\xb9\xb9\xa6\x69\xde\xbc\x69\x6f\x92\xeb\xbc\xd7\x69\x3b\x6f\x40\x72\x45\xe2\x0c\x02\x0c\xb0\x94\xac\x78\xf4\xdd\xdf\x00\x20\x29\x4a\xb6\xef\x9c\xbb\x4c\x9b\xfb\xc3\x21\x80\xfd\xbd\x8b\xdd\xc5\x2a\xc9\x57\x7f\xf8\xcb\xdb\xf7\x7f\x7b\xf7\x2d\x54\x54\x8b\xe5\x8b\xc4\xfe\x07\x04\x93\x65\x1a\xa0\x0c\x96\x2f\x4e\x92\x0a\x59\xb1\x7c\x71\x72\x92\xd4\x48\x0c\xf2\x8a\x69\x83\x94\x06\x2d\xad\xc2\xeb\x60\x7f\x50\x11\x35\x21\xfe\xd4\xf2\x75\x1a\xfc\x6f\xf8\xd7\x37\xe1\x5b\x55\x37\x8c\x78\x26\x30\x80\x5c\x49\x42\x49\x69\xf0\xfd\xb7\x29\x16\x25\x8e\xf0\x24\xab\x31\x0d\xd6\x1c\x37\x8d\xd2\x34\x02\xdd\xf0\x82\xaa\xb4\xc0\x35\xcf\x31\x74\x8b\x0b\xe0\x92\x13\x67\x22\x34\x39\x13\x98\x5e\x06\xcb\x17\x96\x0e\x71\x12\xb8\xbc\xbf\x8f\xfe\x8c\xb4\x51\xfa\x76\xb7\x5b\xc0\x9b\x96\x2a\x94\xc4\x73\x46\x58\xc0\x1f\x59\x9b\x23\x25\xb1\x87\x74\x48\x82\xcb\x5b\xa8\x34\xae\xd2\xc0\x8a\x6e\x16\x71\x9c\x17\xf2\x83\x89\x72\xa1\xda\x62\x25\x98\xc6\x28\x57\x75\xcc\x3e\xb0\xbb\x58\xf0\xcc\xc4\xb4\xe1\x44\xa8\xc3\x4c\x29\x32\xa4\x59\x13\x5f\x45\x57\xd1\xef\xe3\xdc\x98\x78\xd8\x8b\x6a\x2e\xa3\xdc\x98\x00\x34\x8a\x34\x30\xb4\x15\x68\x2a\x44\x0a\x20\x5e\x7e\x1e\xdf\x95\x92\x14\xb2\x0d\x1a\x55\x63\xfc\x2a\xfa\x7d\x34\x73\x2c\xc7\xdb\x1f\xe7\x6a\xd9\x9a\x5c\xf3\x86\xc0\xe8\xfc\xd9\x7c\x3f\xfc\xd4\xa2\xde\xc6\x57\xd1\x65\x74\xd9\x2d\x1c\x9f\x0f\x26\x58\x26\xb1\x27\xb8\xfc\x22\xda\xa1\x54\xb4\x8d\xe7\xd1\xab\xe8\x32\x6e\x58\x7e\xcb\x4a\x2c\x7a\x4e\xf6\x28\xea\x37\x7f\x35\xbe\x4f\xf9\xf0\xc3\xb1\x0b\x7f\x0d\x66\xb5\xaa\x51\x52\xf4\xc1\xc4\xf3\xe8\xf2\x3a\x9a\xf5\x1b\x0f\xe9\x3b\x06\xd6\x69\x96\xd5\x49\xb4\x46\x6d\x23\x57\x84\x39\x4a\x42\x0d\xf7\x76\xf7\xa4\xe6\x32\xac\x90\x97\x15\x2d\xe0\x72\x36\x3b\xbd\x79\x6c\x77\x5d\xf9\xed\x82\x9b\x46\xb0\xed\x02\x56\x02\xef\xfc\x16\x13\xbc\x94\x21\x27\xac\xcd\x02\x3c\x65\x77\xb0\x73\x3c\x1b\xad\x4a\x8d\xc6\x74\xcc\x1a\x65\x38\x71\x25\x17\x36\xa2\x18\xf1\x35\x3e\x06\x6b\x1a\x26\x1f\x20\xb0\xcc\x28\xd1\x12\x1e\x09\x92\x09\x95\xdf\xfa\x3d\x77\x9b\xc7\x4a\xe4\x4a\x28\xbd\x80\x4d\xc5\x3b\x34\x70\x8c\xa0\xd1\xd8\x91\x87\x86\x15\x05\x97\xe5\x02\x5e\x37\x9d\x3e\x50\x33\x5d\x72\xb9\x80\xd9\x1e\x25\x89\x7b\x33\x26\xb1\x4f\x5c\x2f\x4e\x92\x4c\x15\x5b\xe7\xc3\x82\xaf\x21\x17\xcc\x98\x34\x38\x32\xb1\x4b\x48\x07\x00\x36\x0f\x31\x2e\xfb\xa3\x83\x33\xad\x36\x01\x38\x46\x69\xe0\x85\x08\x33\x45\xa4\xea\x05\x5c\x5a\xf1\x3a\x94\x23\x7a\x22\x14\x65\x78\x39\xef\x0f\x4f\x92\xea\xb2\x27\x42\x78\x47\xa1\xf3\xcf\xe0\x99\x60\x99\xf0\x1e\x77\xc5\x60\xc5\xc2\x8c\x51\x15\x00\xd3\x9c\x85\x15\x2f\x0a\x94\x69\x40\xba\x45\x1b\x47\x7c\x09\xe3\xf4\xf7\x44\xf6\xab\x2e\x7b\xb9\xe2\x82\xaf\x3b\xb5\x46\x9f\x47\x1a\x3e\xad\xc4\x35\x74\x1f\x6a\xb5\x32\x48\xe1\x48\xa7\x11\x30\x97\x4d\x4b\x61\xa9\x55\xdb\x0c\xe7\x27\x89\xdb\x05\x5e\xa4\x41\xc9\x0d\x05\x40\xdb\xa6\x33\x40\x30\xa8\xab\x74\x1d\x5a\xfb\x6b\x25\x02\x68\x04\xcb\xb1\x52\xa2\x40\x9d\x06\x3f\xaa\x9c\x33\x01\xd2\x6b\x0a\x7f\xfd\xe1\xbf\xa1\x73\x14\x97\x25\x6c\x55\xab\xe1\x5b\xaa\x50\x63\x5b\x03\x2b\x0a\x1b\xa4\x51\x14\x8d\xd8\xbb\x88\x7d\x28\x60\x98\x91\xdc\x43\x9d\x24\x59\x4b\xa4\x06\xc0\x8c\x24\x64\x24\xc3\x02\x57\xac\x15\x04\x85\x56\x4d\xa1\x36\x32\x24\x55\x96\xb6\xbe\x79\x25\x3c\x52\x00\x05\x23\xd6\x1d\xa5\x41\x0f\xdb\x7b\x8e\x99\x46\x35\x6d\xd3\xf9\xce\x6f\xe2\x5d\xc3\x64\x81\x85\xf5\xb4\x30\x18\x2c\xbf\xe3\x6b\x84\x1a\xbd\x2e\x27\xc7\x81\x90\x33\x8d\x14\x8e\x89\x3e\x08\x87\x24\xf6\xc2\x78\x95\xa0\xfb\x97\xb4\xa2\xa7\x34\xa8\x50\xa3\x6c\xe1\x60\x15\x6a\x9b\x4d\x82\xe5\xfd\xbd\x66\xb2\x44\x78\xc9\x8b\xbb\x0b\x78\xc9\x6a\xd5\x4a\x82\x45\x0a\xd1\x1b\xf7\x69\x76\xbb\x03\xea\x00\x89\xe0\xcb\x84\x7d\x2c\xa8\x41\xc9\x5c\xf0\xfc\x36\x0d\x88\xa3\x4e\xef\xef\x2d\xf1\xdd\xee\x06\xee\xef\xf9\x0a\x5e\x46\x3f\x60\xce\x1a\xca\x2b\xb6\xdb\x95\xba\xff\x8e\xf0\x0e\xf3\x96\x70\x32\xbd\xbf\x47\x61\x70\xb7\x33\x6d\x56\x73\x9a\xf4\xe8\x76\x5f\x16\xbb\x9d\x95\xb9\x93\x73\xb7\x83\xd8\x12\x95\x05\xde\xc1\xcb\xe8\x1d\x6a\xae\x0a\x03\x1e\x3e\x89\xd9\x32\x89\x05\x5f\x76\x78\x87\x46\x8a\x5b\xb1\x8f\x97\xd8\x06\xcc\x10\xdd\xee\xb2\x38\x51\xc7\x92\x3e\x12\xfb\x65\x38\x48\xdf\xc5\x83\xe1\x84\xb7\xb8\x4d\x83\xfb\xfb\x31\x6e\x77\x9a\x33\x21\x32\x66\xed\xe2\x55\x1b\x90\x7e\x46\x1b\xa7\x6b\x6e\x5c\x23\xb5\xec\x25\xd8\x8b\xfd\xcc\xcb\x7c\x94\xae\x48\x35\x0b\xb8\x9a\x8f\x72\xd5\x63\xf7\xfc\xf5\xd1\x3d\xbf\x7a\x14\xb8\x61\x12\x05\xb8\xbf\xa1\xa9\x99\xe8\xbf\xbb\xdb\x32\xba\x7c\xc7\x48\xa1\xcd\xcc\x83\x68\x43\x86\x9f\xdd\x80\x5a\xa3\x5e\x09\xb5\x59\x00\x6b\x49\xdd\x40\xcd\xee\x86\x2a\x77\x35\x9b\x8d\xe5\xb6\x0d\x20\xcb\x04\xba\x9c\xa2\xf1\xa7\x16\x0d\x99\x21\x97\xf8\x23\xf7\xd7\xa6\x94\x02\xa5\xc1\xe2\xc8\x1a\x96\xa3\x35\xad\x83\x1a\xb9\x7e\x30\xe6\xa3\xb2\xaf\x94\x1a\x0a\xc7\x58\x8c\x8e\xf4\xa8\xc6\x05\xcb\x84\xf4\x1e\xee\x24\xa1\xe2\x17\x25\x7e\x6d\x1b\xbb\xa7\xf2\xbe\xcf\x68\x56\xf7\x06\x51\xfb\xae\xc2\x86\x2c\xb8\x65\x12\x53\xf1\x05\x9c\x6d\x10\x66\xcc\xe0\x73\xd8\xbb\xfa\xbe\x67\xef\x96\x5f\xca\xbf\x42\xa6\x29\x43\x46\xcf\x11\x60\xd5\xca\x62\xa4\xbf\xcb\x9d\x5f\x2a\x40\x2b\xf9\x1a\xb5\xe1\xb4\x7d\xae\x04\x58\xec\x45\xf0\xeb\x43\x11\x92\x98\xf4\xc7\x63\x6d\xbc\xf8\x95\x2e\xf7\xa7\x1a\x91\xab\xe5\x9f\xd4\x06\x0a\x85\x06\xa8\xe2\x06\x6c\x71\xfd\x26\x89\xab\xab\x01\xa4\x59\xbe\xb7\x07\xce\xa8\xb0\x72\x0d\x05\x70\x03\xba\x95\xae\xf2\x2a\x09\x54\xe1\x61\x13\xd2\x15\xe9\x08\xde\x2b\xdb\xc8\xad\x51\x12\xd4\x4c\xf0\x9c\xab\xd6\x00\xcb\x49\x69\x03\x2b\xad\x6a\xc0\xbb\x8a\xb5\x86\x2c\x21\x9b\x3e\xd8\x9a\x71\xe1\xee\x92\x73\x29\x28\x0d\x2c\xcf\xdb\xba\xb5\x8d\xa8\x2c\x01\xa5\x6a\xcb\xaa\x93\x85\x14\xf8\xc2\x24\x94\x2c\x07\x79\x4c\xc3\x6a\x60\x44\x2c\xbf\x35\x17\xd0\x67\x05\x60\x1a\x81\x38\x16\x16\x2b\x47\x6d\xfb\x06\xc8\x55\x5d\x2b\x09\x57\xba\x80\x86\x69\xda\x5a\x5e\xae\xbc\x45\xf0\x46\x6e\x95\x44\xa8\xd8\xda\x89\x06\xdf\x71\xfa\x53\x9b\x5d\xc0\x7b\xff\x8a\xb8\x80\xef\x94\x2a\x05\x9e\x5b\x09\xff\xc8\x72\xcc\x94\xba\xed\xd1\xa1\x66\xdb\x9e\x71\xa7\xc7\x86\x53\xc5\xbd\xa1\x1a\xd4\xb5\xa5\x51\x80\xe0\x35\x27\x13\x25\x71\xb3\xcf\xad\xfb\x2a\x2d\xc2\x4a\x69\xfe\xb3\x6d\x71\xc4\xe0\x2f\x80\xa4\xa0\xa3\x3c\xd3\xa7\x49\x17\x00\x02\x57\xb4\x80\x57\x3e\x4d\x1e\x87\x74\xc9\xa9\x6a\xb3\x90\x89\x47\x2f\x55\x4f\xd6\xbd\x2e\x6d\xf9\x59\xc0\x95\x6f\x69\x7d\x5b\x51\xd0\x28\x25\x16\x47\x81\xe7\xf9\x5e\x5f\x37\x77\x83\x28\x43\x5f\x3c\x1b\x88\xd8\x78\x38\x34\xcc\x9a\xef\x6d\x9b\x6b\x64\x84\xc0\x20\x61\x47\xcf\x64\xdb\x2f\x46\x5e\x7a\xf7\xd0\x0a\x80\x98\x2e\x91\xd2\xe0\xff\x58\xa6\x5a\x5a\x64\x82\xc9\xdb\x60\x69\xe1\x6c\x85\x77\xf6\x7e\xbc\x27\x04\xac\x33\x2c\x0a\x2c\x80\x4b\x52\xce\x23\xdd\xdc\x01\x26\x76\xb1\xe2\x02\xdd\x64\xc2\xdd\x09\x79\x66\xbd\x69\x3d\x3e\x8d\x92\x4c\xc7\xcb\xb7\xaa\xd9\x86\x0d\x33\x84\x0e\xd5\x32\x34\xae\x17\x1d\xa8\xb1\x4c\xad\x11\x7c\xaf\x9b\xa9\x3b\x60\xb2\x80\x15\xd7\x08\x6c\xc3\xb6\x5f\x25\x71\xe1\x5e\x26\xbd\x1d\x3f\xdf\x99\xdd\x7b\xf6\x37\xe5\xc9\xe1\x76\xd4\xec\xf6\x51\x47\x76\x42\x3b\x27\x72\x67\xf5\x98\x36\x88\xf4\x8d\x4d\xc9\xe9\x0f\x9e\x20\x97\xe5\xe9\x7c\xe6\x33\x8d\xfd\xb0\xe4\x4f\xe7\x33\x6b\xe1\xd3\xf9\x6c\x76\x37\x7b\xe6\xbf\xd3\xf9\x4c\xc9\xd3\xf9\x8c\x2a\x3c\x9d\xcf\x4e\xe7\x57\xe3\x1c\xe5\x77\xfa\xe8\xb0\x50\x68\x2c\xb7\x3e\x75\x3d\x15\x62\x4e\xdc\x4f\xc5\x98\x0b\x90\x87\x11\x66\x60\x62\x5a\xad\x55\x2b\x6d\xb7\x03\x56\xe7\x67\x45\xd9\x03\x33\x9a\xb6\x69\x94\xa6\x68\x6c\x4e\x66\x5f\xb5\x02\x4d\x7c\x3d\xfb\xfa\xfa\xf5\x47\xc5\x77\x11\xeb\x74\xf8\x97\x47\x6d\xe9\xd2\x66\xd8\x88\xd6\xd8\xd6\x92\xdb\x37\xdd\x6f\x2a\x84\x7d\x5e\x87\x77\xa2\x35\x17\xd0\xb4\x99\xe0\xa6\x02\x06\x12\x37\x90\x18\xd2\x4a\x96\x4b\xb7\x9b\x27\x71\xb7\x84\x46\x19\xfa\xcc\x8c\xf3\x59\xe1\x60\xf9\xfd\x9b\x92\xce\xaa\x2b\x75\xbf\x29\x97\xf5\xf5\xf7\x17\xf9\x4b\xc9\x7f\xa5\xcb\x1e\xdc\xe0\xcd\x66\x13\xf5\xc6\x74\xd7\xb7\x42\xd1\xc4\xb6\x21\x69\x25\xa7\x6d\xec\x13\xa1\x92\xf1\x37\xbc\x48\xe7\xd7\xf3\xd7\xaf\xe7\xaf\xfe\xf3\xfa\xeb\xaf\xe7\xd7\xaf\xbe\x7e\xea\x6e\x0f\x71\xf1\xcb\xaf\xf6\xd0\x7e\x8a\x51\xdb\xf7\x37\xd5\x42\xce\x24\x90\x66\xf9\xad\x37\x42\xab\xb5\x35\x42\x83\x5e\xff\xa1\xbb\xca\x50\xa8\x8d\x03\xf1\x7c\x56\x1c\x85\x6b\xb5\x0c\x22\x54\x6a\x03\x75\x9b\x3b\x5b\xdb\x8e\x0a\xed\xc1\x86\x71\x82\x56\x12\x17\xde\x05\xd4\x6a\xd7\x90\xe1\x41\x43\xf4\xe0\xc1\x9d\x60\xbd\x7c\x6f\xcb\xf4\x83\x3e\x74\x78\x2a\x83\xc6\xb7\x1e\x1c\x1a\xad\x08\x73\x6b\x47\x60\x25\xe3\xd2\x58\x0b\xb8\x96\x0b\xeb\x67\x3c\xa5\x87\xaf\xee\x63\x3f\x0c\x76\xc7\x71\x0c\xdf\x09\x95\x31\x01\x6b\x7b\x1b\x32\x61\x7b\x68\x05\x95\xb2\xaa\x8f\xac\x65\x88\x51\x6b\x40\xad\xdc\xae\x97\xdc\xe2\xaf\x99\xb6\x8d\x2a\xd6\x0d\x41\xda\x8d\x32\xed\x9e\x41\xbd\xee\x06\xb4\x76\x49\x1c\xb5\x3f\xef\x98\xfe\x01\x57\x5c\xfa\xb8\x5a\xb5\xd2\xab\x47\x15\x23\xf0\x03\x04\x03\xcc\xf5\x25\xd0\x6a\x01\x5d\x0c\x78\x92\x03\x03\x07\x07\xe9\x80\x3e\x79\x60\xe7\xee\xa3\xb3\xd1\xb4\x1b\xc5\x7a\x32\x91\x41\x59\x4c\xfe\xeb\xc7\xbf\xfc\x39\x32\xa4\xb9\x2c\xf9\x6a\x3b\xb9\x6f\xb5\x58\xc0\xcb\x49\xf0\x1f\x6e\xb8\x37\xfd\xfb\xec\x9f\xd1\x9a\x89\x16\x2f\x9c\x02\x0b\xf7\xf7\x01\x9b\x0b\xe8\x3e\x17\x70\xc8\x71\x37\x9d\xde\x3c\x3e\x6d\x19\x0d\x87\x34\x1a\xa4\x89\x05\x1c\x3c\xb9\xbb\x39\x34\x12\x83\x1a\xa9\x52\x2e\x16\x35\xe6\x4a\x4a\xcc\x09\xda\x46\xc9\xce\x26\x20\x94\x31\xbd\x61\xf6\x10\x23\xdb\xf4\xca\xf3\x15\x4c\x7a\x77\x9d\xc2\x1c\xd2\x14\x66\xfd\x59\x67\x19\x48\x5d\xe2\xf9\x1f\xcc\x7e\x54\xf9\x2d\xd2\x24\xd8\x18\x7b\xdb\x03\x38\x07\xa1\x72\x66\xe9\x45\x95\x4d\x3f\xe7\x10\xc4\xac\xe1\xc1\xd4\x0f\xb4\x77\x80\xc2\xe0\xa7\x89\x3d\x8b\x96\x1f\xf9\x7b\x49\xcf\xcf\x7d\xd8\xf4\xae\x53\xb2\x46\x63\x58\x89\x63\x0d\xdd\x03\x6d\x50\xc5\x1a\xa2\x36\x25\xa4\xe0\x5c\xdc\x30\x6d\xd0\x83\x44\x05\x23\xd6\x71\x71\xe6\x70\x60\x69\x0a\xb2\x15\x62\xc0\x3f\xd1\x68\x2f\x73\x07\xb6\x7b\x71\x00\x1e\xf9\xb4\xfd\x55\x9a\x82\x7d\x21\x5b\x1f\x15\x7b\x4c\x1b\x3e\xfe\x2d\x3f\x8d\x6c\x6e\xdd\x63\x4c\x07\x72\x0f\xa8\x61\xf1\x29\x72\x58\x1c\xd3\xc3\xe2\x09\x82\x6e\x74\xf2\x31\x7a\x7e\xd4\x32\x22\xe7\x36\x9e\xa0\x26\xdb\x3a\x43\xfd\x31\x72\x7e\x74\xd2\x91\x73\xa6\xfe\x5e\xd2\x08\xf7\x02\x2e\x5f\x4f\x9f\xa0\x8e\x5a\xab\x27\x89\x4b\x45\xdb\xc9\xbd\x60\x5b\x5b\x20\xe0\x8c\x54\xf3\xd6\x4d\x3a\xce\x2e\x5c\xd5\x5a\xc0\x40\xe1\xc2\xcd\xb0\x17\x70\xe6\x56\x67\xbb\x27\xb8\x99\x36\xcf\x6d\x69\xfc\x12\x7e\x1d\x8d\x81\x63\xb7\x7e\x92\xe7\x50\x5f\x0e\x98\xc2\xef\x7e\x07\x0f\x4e\x0f\x43\xd0\xc6\x70\x5f\xb1\x53\x08\x82\x8e\xfc\xc9\x4a\x69\x98\xd8\x43\x9e\xce\x6e\x80\x27\x63\x32\x91\x40\x59\x52\x75\x03\xfc\xfc\x7c\x4f\xe9\xa4\x27\x73\x9e\x42\x90\x90\x5e\x26\x54\x2c\xdd\x50\xc5\x37\x30\xff\x08\x32\x96\xdf\x96\xae\x25\x58\xd8\x94\x3b\x39\xb3\x37\x74\x4c\xf8\xef\xfc\x9f\x11\x5b\x33\x62\xda\x5e\xd5\xb3\xe9\x0d\xec\x51\xba\x46\x29\x57\x36\xe3\x83\xef\xc7\xdc\xfc\x06\x86\x99\xa7\x5b\x65\x4a\x17\xa8\x43\xcd\x0a\xde\x9a\x05\xbc\x6a\xee\x6e\xfe\xd1\xcf\x84\xdd\x94\xc9\x89\xd5\x68\x5c\x3e\xca\xbd\x1b\x4c\x9c\x43\x90\xc4\x16\xa8\x47\x19\x94\x18\xff\x2e\x07\x8f\xcc\xc7\x60\xf8\xd5\xac\xdb\xaf\x79\x51\x08\xb4\x42\x38\x86\xfe\xe7\xcd\xa2\xd5\x2e\x2f\x4d\xfc\x7a\x72\x2c\x07\xf1\x1a\xa7\x51\x2b\xf9\xdd\x64\x1a\x76\x30\xfd\xfa\x02\xce\x8c\x4d\xbf\x85\x39\x9b\x46\x55\x5b\x33\xc9\x7f\xc6\x89\xed\x2c\xa7\x5e\x6e\x2b\x71\x4c\x7a\x39\x38\x73\x37\xba\x47\xc3\xf4\x77\x1a\x55\x54\x8b\x49\x90\x90\xfb\xed\xcf\x0a\x37\x78\xd0\x51\xf1\xdb\x87\x01\xb7\x3b\x4c\x91\xb9\x50\x06\x8f\x4a\x00\x18\xa4\xf7\xbc\x46\xd5\xd2\x64\x28\x13\x17\x70\x35\x9b\xcd\xa6\x37\xb0\xdb\xff\x44\x1a\xc7\xf0\xad\x21\xd6\x37\xa2\x1b\xcc\x8c\x4b\xdf\xd0\xe1\xb8\x6a\xed\xab\xf2\x9b\x77\xdf\x8f\x2a\xf3\x40\x75\xe2\x84\x1b\x7e\x22\x7e\xac\x0c\x3e\xfa\x9b\xb4\xed\x29\xfd\xfb\xca\x75\x94\x43\x9d\xb4\xc5\x21\xfa\x60\x02\x60\x66\x2b\x73\x28\x70\x85\x7a\x39\x22\xdf\x15\xcf\x24\xf6\xbf\x96\x26\xb1\xff\x1f\x42\xfe\x3f\x00\x00\xff\xff\x1f\xb2\x73\x97\x21\x22\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( From 7f7abfe4d1d7c51d968c0ead48b93fdb3cf2909f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 17 Oct 2017 12:08:57 +0300 Subject: [PATCH 216/272] cmd/faucet: proper error handling all over --- cmd/faucet/faucet.go | 165 ++++++++++++++++++++++++++++++++--------- cmd/faucet/faucet.html | 4 +- cmd/faucet/website.go | 2 +- 3 files changed, 135 insertions(+), 36 deletions(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 6b2987315a..715f3dec94 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -302,6 +302,8 @@ func (f *faucet) webHandler(w http.ResponseWriter, r *http.Request) { // apiHandler handles requests for Ether grants and transaction statuses. func (f *faucet) apiHandler(conn *websocket.Conn) { // Start tracking the connection and drop at the end + defer conn.Close() + f.lock.Lock() f.conns = append(f.conns, conn) f.lock.Unlock() @@ -316,25 +318,50 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { } f.lock.Unlock() }() - // Send a few initial stats to the client - balance, _ := f.client.BalanceAt(context.Background(), f.account.Address, nil) - nonce, _ := f.client.NonceAt(context.Background(), f.account.Address, nil) + // Gather the initial stats from the network to report + var ( + head *types.Header + balance *big.Int + nonce uint64 + err error + ) + for { + // Attempt to retrieve the stats, may error on no faucet connectivity + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + head, err = f.client.HeaderByNumber(ctx, nil) + if err == nil { + balance, err = f.client.BalanceAt(ctx, f.account.Address, head.Number) + if err == nil { + nonce, err = f.client.NonceAt(ctx, f.account.Address, nil) + } + } + cancel() - websocket.JSON.Send(conn, map[string]interface{}{ + // If stats retrieval failed, wait a bit and retry + if err != nil { + if err = sendError(conn, errors.New("Faucet offline: "+err.Error())); err != nil { + log.Warn("Failed to send faucet error to client", "err", err) + return + } + time.Sleep(3 * time.Second) + continue + } + // Initial stats reported successfully, proceed with user interaction + break + } + // Send over the initial stats and the latest header + if err = send(conn, map[string]interface{}{ "funds": balance.Div(balance, ether), "funded": nonce, "peers": f.stack.Server().PeerCount(), "requests": f.reqs, - }) - // Send the initial block to the client - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - header, err := f.client.HeaderByNumber(ctx, nil) - cancel() - - if err != nil { - log.Error("Failed to retrieve latest header", "err", err) - } else { - websocket.JSON.Send(conn, header) + }, 3*time.Second); err != nil { + log.Warn("Failed to send initial stats to client", "err", err) + return + } + if err = send(conn, head, 3*time.Second); err != nil { + log.Warn("Failed to send initial header to client", "err", err) + return } // Keep reading requests from the websocket until the connection breaks for { @@ -344,16 +371,22 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { Tier uint `json:"tier"` Captcha string `json:"captcha"` } - if err := websocket.JSON.Receive(conn, &msg); err != nil { + if err = websocket.JSON.Receive(conn, &msg); err != nil { return } if !strings.HasPrefix(msg.URL, "https://gist.github.com/") && !strings.HasPrefix(msg.URL, "https://twitter.com/") && !strings.HasPrefix(msg.URL, "https://plus.google.com/") && !strings.HasPrefix(msg.URL, "https://www.facebook.com/") { - websocket.JSON.Send(conn, map[string]string{"error": "URL doesn't link to supported services"}) + if err = sendError(conn, errors.New("URL doesn't link to supported services")); err != nil { + log.Warn("Failed to send URL error to client", "err", err) + return + } continue } if msg.Tier >= uint(*tiersFlag) { - websocket.JSON.Send(conn, map[string]string{"error": "Invalid funding tier requested"}) + if err = sendError(conn, errors.New("Invalid funding tier requested")); err != nil { + log.Warn("Failed to send tier error to client", "err", err) + return + } continue } log.Info("Faucet funds requested", "url", msg.URL, "tier", msg.Tier) @@ -366,7 +399,10 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { res, err := http.PostForm("https://www.google.com/recaptcha/api/siteverify", form) if err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) + if err = sendError(conn, err); err != nil { + log.Warn("Failed to send captcha post error to client", "err", err) + return + } continue } var result struct { @@ -376,12 +412,18 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { err = json.NewDecoder(res.Body).Decode(&result) res.Body.Close() if err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) + if err = sendError(conn, err); err != nil { + log.Warn("Failed to send captcha decode error to client", "err", err) + return + } continue } if !result.Success { log.Warn("Captcha verification failed", "err", string(result.Errors)) - websocket.JSON.Send(conn, map[string]string{"error": "Beep-bop, you're a robot!"}) + if err = sendError(conn, errors.New("Beep-bop, you're a robot!")); err != nil { + log.Warn("Failed to send captcha failure to client", "err", err) + return + } continue } } @@ -404,7 +446,10 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { err = errors.New("Something funky happened, please open an issue at https://github.com/ethereum/go-ethereum/issues") } if err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) + if err = sendError(conn, err); err != nil { + log.Warn("Failed to send prefix error to client", "err", err) + return + } continue } log.Info("Faucet request valid", "url", msg.URL, "tier", msg.Tier, "user", username, "address", address) @@ -424,14 +469,20 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { tx := types.NewTransaction(f.nonce+uint64(len(f.reqs)), address, amount, big.NewInt(21000), f.price, nil) signed, err := f.keystore.SignTx(f.account, tx, f.config.ChainId) if err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) f.lock.Unlock() + if err = sendError(conn, err); err != nil { + log.Warn("Failed to send transaction creation error to client", "err", err) + return + } continue } // Submit the transaction and mark as funded if successful if err := f.client.SendTransaction(context.Background(), signed); err != nil { - websocket.JSON.Send(conn, map[string]string{"error": err.Error()}) f.lock.Unlock() + if err = sendError(conn, err); err != nil { + log.Warn("Failed to send transaction transmission error to client", "err", err) + return + } continue } f.reqs = append(f.reqs, &request{ @@ -447,10 +498,16 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { // Send an error if too frequent funding, othewise a success if !fund { - websocket.JSON.Send(conn, map[string]string{"error": fmt.Sprintf("%s left until next allowance", common.PrettyDuration(timeout.Sub(time.Now())))}) + if err = sendError(conn, fmt.Errorf("%s left until next allowance", common.PrettyDuration(timeout.Sub(time.Now())))); err != nil { + log.Warn("Failed to send funding error to client", "err", err) + return + } continue } - websocket.JSON.Send(conn, map[string]string{"success": fmt.Sprintf("Funding request accepted for %s into %s", username, address.Hex())}) + if err = sendSuccess(conn, fmt.Sprintf("Funding request accepted for %s into %s", username, address.Hex())); err != nil { + log.Warn("Failed to send funding success to client", "err", err) + return + } select { case f.update <- struct{}{}: default: @@ -473,11 +530,31 @@ func (f *faucet) loop() { select { case head := <-heads: // New chain head arrived, query the current stats and stream to clients - balance, _ := f.client.BalanceAt(context.Background(), f.account.Address, nil) - balance = new(big.Int).Div(balance, ether) + var ( + balance *big.Int + nonce uint64 + price *big.Int + err error + ) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + balance, err = f.client.BalanceAt(ctx, f.account.Address, head.Number) + if err == nil { + nonce, err = f.client.NonceAt(ctx, f.account.Address, nil) + if err == nil { + price, err = f.client.SuggestGasPrice(ctx) + } + } + cancel() - price, _ := f.client.SuggestGasPrice(context.Background()) - nonce, _ := f.client.NonceAt(context.Background(), f.account.Address, nil) + // If querying the data failed, try for the next block + if err != nil { + log.Warn("Failed to update faucet state", "block", head.Number, "hash", head.Hash(), "err", err) + continue + } else { + log.Info("Updated faucet state", "block", head.Number, "hash", head.Hash(), "balance", balance, "nonce", nonce, "price", price) + } + // Faucet state retrieved, update locally and send to clients + balance = new(big.Int).Div(balance, ether) f.lock.Lock() f.price, f.nonce = price, nonce @@ -488,17 +565,17 @@ func (f *faucet) loop() { f.lock.RLock() for _, conn := range f.conns { - if err := websocket.JSON.Send(conn, map[string]interface{}{ + if err := send(conn, map[string]interface{}{ "funds": balance, "funded": f.nonce, "peers": f.stack.Server().PeerCount(), "requests": f.reqs, - }); err != nil { + }, time.Second); err != nil { log.Warn("Failed to send stats to client", "err", err) conn.Close() continue } - if err := websocket.JSON.Send(conn, head); err != nil { + if err := send(conn, head, time.Second); err != nil { log.Warn("Failed to send header to client", "err", err) conn.Close() } @@ -509,7 +586,7 @@ func (f *faucet) loop() { // Pending requests updated, stream to clients f.lock.RLock() for _, conn := range f.conns { - if err := websocket.JSON.Send(conn, map[string]interface{}{"requests": f.reqs}); err != nil { + if err := send(conn, map[string]interface{}{"requests": f.reqs}, time.Second); err != nil { log.Warn("Failed to send requests to client", "err", err) conn.Close() } @@ -519,6 +596,28 @@ func (f *faucet) loop() { } } +// sends transmits a data packet to the remote end of the websocket, but also +// setting a write deadline to prevent waiting forever on the node. +func send(conn *websocket.Conn, value interface{}, timeout time.Duration) error { + if timeout == 0 { + timeout = 60 * time.Second + } + conn.SetWriteDeadline(time.Now().Add(timeout)) + return websocket.JSON.Send(conn, value) +} + +// sendError transmits an error to the remote end of the websocket, also setting +// the write deadline to 1 second to prevent waiting forever. +func sendError(conn *websocket.Conn, err error) error { + return send(conn, map[string]string{"error": err.Error()}, time.Second) +} + +// sendSuccess transmits a success message to the remote end of the websocket, also +// setting the write deadline to 1 second to prevent waiting forever. +func sendSuccess(conn *websocket.Conn, msg string) error { + return send(conn, map[string]string{"success": msg}, time.Second) +} + // authGitHub tries to authenticate a faucet request using GitHub gists, returning // the username, avatar URL and Ethereum address to fund on success. func authGitHub(url string) (string, string, common.Address, error) { diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index 3b928d6367..75dad0bdfe 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -140,10 +140,10 @@ $("#block").text(parseInt(msg.number, 16)); } if (msg.error !== undefined) { - noty({layout: 'topCenter', text: msg.error, type: 'error'}); + noty({layout: 'topCenter', text: msg.error, type: 'error', timeout: 5000, progressBar: true}); } if (msg.success !== undefined) { - noty({layout: 'topCenter', text: msg.success, type: 'success'}); + noty({layout: 'topCenter', text: msg.success, type: 'success', timeout: 15000, progressBar: true}); } if (msg.requests !== undefined && msg.requests !== null) { var content = ""; diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index 5a80cb0a79..f99c69abfd 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3a\x7f\x73\xe3\xb6\xb1\x7f\xfb\x3e\xc5\x86\xef\x5c\x4b\x63\x93\x94\xe5\xcb\xd5\x4f\x26\x95\xb9\xb9\xa6\x69\xde\xbc\x69\x6f\x92\xeb\xbc\xd7\x69\x3b\x6f\x40\x72\x45\xe2\x0c\x02\x0c\xb0\x94\xac\x78\xf4\xdd\xdf\x00\x20\x29\x4a\xb6\xef\x9c\xbb\x4c\x9b\xfb\xc3\x21\x80\xfd\xbd\x8b\xdd\xc5\x2a\xc9\x57\x7f\xf8\xcb\xdb\xf7\x7f\x7b\xf7\x2d\x54\x54\x8b\xe5\x8b\xc4\xfe\x07\x04\x93\x65\x1a\xa0\x0c\x96\x2f\x4e\x92\x0a\x59\xb1\x7c\x71\x72\x92\xd4\x48\x0c\xf2\x8a\x69\x83\x94\x06\x2d\xad\xc2\xeb\x60\x7f\x50\x11\x35\x21\xfe\xd4\xf2\x75\x1a\xfc\x6f\xf8\xd7\x37\xe1\x5b\x55\x37\x8c\x78\x26\x30\x80\x5c\x49\x42\x49\x69\xf0\xfd\xb7\x29\x16\x25\x8e\xf0\x24\xab\x31\x0d\xd6\x1c\x37\x8d\xd2\x34\x02\xdd\xf0\x82\xaa\xb4\xc0\x35\xcf\x31\x74\x8b\x0b\xe0\x92\x13\x67\x22\x34\x39\x13\x98\x5e\x06\xcb\x17\x96\x0e\x71\x12\xb8\xbc\xbf\x8f\xfe\x8c\xb4\x51\xfa\x76\xb7\x5b\xc0\x9b\x96\x2a\x94\xc4\x73\x46\x58\xc0\x1f\x59\x9b\x23\x25\xb1\x87\x74\x48\x82\xcb\x5b\xa8\x34\xae\xd2\xc0\x8a\x6e\x16\x71\x9c\x17\xf2\x83\x89\x72\xa1\xda\x62\x25\x98\xc6\x28\x57\x75\xcc\x3e\xb0\xbb\x58\xf0\xcc\xc4\xb4\xe1\x44\xa8\xc3\x4c\x29\x32\xa4\x59\x13\x5f\x45\x57\xd1\xef\xe3\xdc\x98\x78\xd8\x8b\x6a\x2e\xa3\xdc\x98\x00\x34\x8a\x34\x30\xb4\x15\x68\x2a\x44\x0a\x20\x5e\x7e\x1e\xdf\x95\x92\x14\xb2\x0d\x1a\x55\x63\xfc\x2a\xfa\x7d\x34\x73\x2c\xc7\xdb\x1f\xe7\x6a\xd9\x9a\x5c\xf3\x86\xc0\xe8\xfc\xd9\x7c\x3f\xfc\xd4\xa2\xde\xc6\x57\xd1\x65\x74\xd9\x2d\x1c\x9f\x0f\x26\x58\x26\xb1\x27\xb8\xfc\x22\xda\xa1\x54\xb4\x8d\xe7\xd1\xab\xe8\x32\x6e\x58\x7e\xcb\x4a\x2c\x7a\x4e\xf6\x28\xea\x37\x7f\x35\xbe\x4f\xf9\xf0\xc3\xb1\x0b\x7f\x0d\x66\xb5\xaa\x51\x52\xf4\xc1\xc4\xf3\xe8\xf2\x3a\x9a\xf5\x1b\x0f\xe9\x3b\x06\xd6\x69\x96\xd5\x49\xb4\x46\x6d\x23\x57\x84\x39\x4a\x42\x0d\xf7\x76\xf7\xa4\xe6\x32\xac\x90\x97\x15\x2d\xe0\x72\x36\x3b\xbd\x79\x6c\x77\x5d\xf9\xed\x82\x9b\x46\xb0\xed\x02\x56\x02\xef\xfc\x16\x13\xbc\x94\x21\x27\xac\xcd\x02\x3c\x65\x77\xb0\x73\x3c\x1b\xad\x4a\x8d\xc6\x74\xcc\x1a\x65\x38\x71\x25\x17\x36\xa2\x18\xf1\x35\x3e\x06\x6b\x1a\x26\x1f\x20\xb0\xcc\x28\xd1\x12\x1e\x09\x92\x09\x95\xdf\xfa\x3d\x77\x9b\xc7\x4a\xe4\x4a\x28\xbd\x80\x4d\xc5\x3b\x34\x70\x8c\xa0\xd1\xd8\x91\x87\x86\x15\x05\x97\xe5\x02\x5e\x37\x9d\x3e\x50\x33\x5d\x72\xb9\x80\xd9\x1e\x25\x89\x7b\x33\x26\xb1\x4f\x5c\x2f\x4e\x92\x4c\x15\x5b\xe7\xc3\x82\xaf\x21\x17\xcc\x98\x34\x38\x32\xb1\x4b\x48\x07\x00\x36\x0f\x31\x2e\xfb\xa3\x83\x33\xad\x36\x01\x38\x46\x69\xe0\x85\x08\x33\x45\xa4\xea\x05\x5c\x5a\xf1\x3a\x94\x23\x7a\x22\x14\x65\x78\x39\xef\x0f\x4f\x92\xea\xb2\x27\x42\x78\x47\xa1\xf3\xcf\xe0\x99\x60\x99\xf0\x1e\x77\xc5\x60\xc5\xc2\x8c\x51\x15\x00\xd3\x9c\x85\x15\x2f\x0a\x94\x69\x40\xba\x45\x1b\x47\x7c\x09\xe3\xf4\xf7\x44\xf6\xab\x2e\x7b\xb9\xe2\x82\xaf\x3b\xb5\x46\x9f\x47\x1a\x3e\xad\xc4\x35\x74\x1f\x6a\xb5\x32\x48\xe1\x48\xa7\x11\x30\x97\x4d\x4b\x61\xa9\x55\xdb\x0c\xe7\x27\x89\xdb\x05\x5e\xa4\x41\xc9\x0d\x05\x40\xdb\xa6\x33\x40\x30\xa8\xab\x74\x1d\x5a\xfb\x6b\x25\x02\x68\x04\xcb\xb1\x52\xa2\x40\x9d\x06\x3f\xaa\x9c\x33\x01\xd2\x6b\x0a\x7f\xfd\xe1\xbf\xa1\x73\x14\x97\x25\x6c\x55\xab\xe1\x5b\xaa\x50\x63\x5b\x03\x2b\x0a\x1b\xa4\x51\x14\x8d\xd8\xbb\x88\x7d\x28\x60\x98\x91\xdc\x43\x9d\x24\x59\x4b\xa4\x06\xc0\x8c\x24\x64\x24\xc3\x02\x57\xac\x15\x04\x85\x56\x4d\xa1\x36\x32\x24\x55\x96\xb6\xbe\x79\x25\x3c\x52\x00\x05\x23\xd6\x1d\xa5\x41\x0f\xdb\x7b\x8e\x99\x46\x35\x6d\xd3\xf9\xce\x6f\xe2\x5d\xc3\x64\x81\x85\xf5\xb4\x30\x18\x2c\xbf\xe3\x6b\x84\x1a\xbd\x2e\x27\xc7\x81\x90\x33\x8d\x14\x8e\x89\x3e\x08\x87\x24\xf6\xc2\x78\x95\xa0\xfb\x97\xb4\xa2\xa7\x34\xa8\x50\xa3\x6c\xe1\x60\x15\x6a\x9b\x4d\x82\xe5\xfd\xbd\x66\xb2\x44\x78\xc9\x8b\xbb\x0b\x78\xc9\x6a\xd5\x4a\x82\x45\x0a\xd1\x1b\xf7\x69\x76\xbb\x03\xea\x00\x89\xe0\xcb\x84\x7d\x2c\xa8\x41\xc9\x5c\xf0\xfc\x36\x0d\x88\xa3\x4e\xef\xef\x2d\xf1\xdd\xee\x06\xee\xef\xf9\x0a\x5e\x46\x3f\x60\xce\x1a\xca\x2b\xb6\xdb\x95\xba\xff\x8e\xf0\x0e\xf3\x96\x70\x32\xbd\xbf\x47\x61\x70\xb7\x33\x6d\x56\x73\x9a\xf4\xe8\x76\x5f\x16\xbb\x9d\x95\xb9\x93\x73\xb7\x83\xd8\x12\x95\x05\xde\xc1\xcb\xe8\x1d\x6a\xae\x0a\x03\x1e\x3e\x89\xd9\x32\x89\x05\x5f\x76\x78\x87\x46\x8a\x5b\xb1\x8f\x97\xd8\x06\xcc\x10\xdd\xee\xb2\x38\x51\xc7\x92\x3e\x12\xfb\x65\x38\x48\xdf\xc5\x83\xe1\x84\xb7\xb8\x4d\x83\xfb\xfb\x31\x6e\x77\x9a\x33\x21\x32\x66\xed\xe2\x55\x1b\x90\x7e\x46\x1b\xa7\x6b\x6e\x5c\x23\xb5\xec\x25\xd8\x8b\xfd\xcc\xcb\x7c\x94\xae\x48\x35\x0b\xb8\x9a\x8f\x72\xd5\x63\xf7\xfc\xf5\xd1\x3d\xbf\x7a\x14\xb8\x61\x12\x05\xb8\xbf\xa1\xa9\x99\xe8\xbf\xbb\xdb\x32\xba\x7c\xc7\x48\xa1\xcd\xcc\x83\x68\x43\x86\x9f\xdd\x80\x5a\xa3\x5e\x09\xb5\x59\x00\x6b\x49\xdd\x40\xcd\xee\x86\x2a\x77\x35\x9b\x8d\xe5\xb6\x0d\x20\xcb\x04\xba\x9c\xa2\xf1\xa7\x16\x0d\x99\x21\x97\xf8\x23\xf7\xd7\xa6\x94\x02\xa5\xc1\xe2\xc8\x1a\x96\xa3\x35\xad\x83\x1a\xb9\x7e\x30\xe6\xa3\xb2\xaf\x94\x1a\x0a\xc7\x58\x8c\x8e\xf4\xa8\xc6\x05\xcb\x84\xf4\x1e\xee\x24\xa1\xe2\x17\x25\x7e\x6d\x1b\xbb\xa7\xf2\xbe\xcf\x68\x56\xf7\x06\x51\xfb\xae\xc2\x86\x2c\xb8\x65\x12\x53\xf1\x05\x9c\x6d\x10\x66\xcc\xe0\x73\xd8\xbb\xfa\xbe\x67\xef\x96\x5f\xca\xbf\x42\xa6\x29\x43\x46\xcf\x11\x60\xd5\xca\x62\xa4\xbf\xcb\x9d\x5f\x2a\x40\x2b\xf9\x1a\xb5\xe1\xb4\x7d\xae\x04\x58\xec\x45\xf0\xeb\x43\x11\x92\x98\xf4\xc7\x63\x6d\xbc\xf8\x95\x2e\xf7\xa7\x1a\x91\xab\xe5\x9f\xd4\x06\x0a\x85\x06\xa8\xe2\x06\x6c\x71\xfd\x26\x89\xab\xab\x01\xa4\x59\xbe\xb7\x07\xce\xa8\xb0\x72\x0d\x05\x70\x03\xba\x95\xae\xf2\x2a\x09\x54\xe1\x61\x13\xd2\x15\xe9\x08\xde\x2b\xdb\xc8\xad\x51\x12\xd4\x4c\xf0\x9c\xab\xd6\x00\xcb\x49\x69\x03\x2b\xad\x6a\xc0\xbb\x8a\xb5\x86\x2c\x21\x9b\x3e\xd8\x9a\x71\xe1\xee\x92\x73\x29\x28\x0d\x2c\xcf\xdb\xba\xb5\x8d\xa8\x2c\x01\xa5\x6a\xcb\xaa\x93\x85\x14\xf8\xc2\x24\x94\x2c\x07\x79\x4c\xc3\x6a\x60\x44\x2c\xbf\x35\x17\xd0\x67\x05\x60\x1a\x81\x38\x16\x16\x2b\x47\x6d\xfb\x06\xc8\x55\x5d\x2b\x09\x57\xba\x80\x86\x69\xda\x5a\x5e\xae\xbc\x45\xf0\x46\x6e\x95\x44\xa8\xd8\xda\x89\x06\xdf\x71\xfa\x53\x9b\x5d\xc0\x7b\xff\x8a\xb8\x80\xef\x94\x2a\x05\x9e\x5b\x09\xff\xc8\x72\xcc\x94\xba\xed\xd1\xa1\x66\xdb\x9e\x71\xa7\xc7\x86\x53\xc5\xbd\xa1\x1a\xd4\xb5\xa5\x51\x80\xe0\x35\x27\x13\x25\x71\xb3\xcf\xad\xfb\x2a\x2d\xc2\x4a\x69\xfe\xb3\x6d\x71\xc4\xe0\x2f\x80\xa4\xa0\xa3\x3c\xd3\xa7\x49\x17\x00\x02\x57\xb4\x80\x57\x3e\x4d\x1e\x87\x74\xc9\xa9\x6a\xb3\x90\x89\x47\x2f\x55\x4f\xd6\xbd\x2e\x6d\xf9\x59\xc0\x95\x6f\x69\x7d\x5b\x51\xd0\x28\x25\x16\x47\x81\xe7\xf9\x5e\x5f\x37\x77\x83\x28\x43\x5f\x3c\x1b\x88\xd8\x78\x38\x34\xcc\x9a\xef\x6d\x9b\x6b\x64\x84\xc0\x20\x61\x47\xcf\x64\xdb\x2f\x46\x5e\x7a\xf7\xd0\x0a\x80\x98\x2e\x91\xd2\xe0\xff\x58\xa6\x5a\x5a\x64\x82\xc9\xdb\x60\x69\xe1\x6c\x85\x77\xf6\x7e\xbc\x27\x04\xac\x33\x2c\x0a\x2c\x80\x4b\x52\xce\x23\xdd\xdc\x01\x26\x76\xb1\xe2\x02\xdd\x64\xc2\xdd\x09\x79\x66\xbd\x69\x3d\x3e\x8d\x92\x4c\xc7\xcb\xb7\xaa\xd9\x86\x0d\x33\x84\x0e\xd5\x32\x34\xae\x17\x1d\xa8\xb1\x4c\xad\x11\x7c\xaf\x9b\xa9\x3b\x60\xb2\x80\x15\xd7\x08\x6c\xc3\xb6\x5f\x25\x71\xe1\x5e\x26\xbd\x1d\x3f\xdf\x99\xdd\x7b\xf6\x37\xe5\xc9\xe1\x76\xd4\xec\xf6\x51\x47\x76\x42\x3b\x27\x72\x67\xf5\x98\x36\x88\xf4\x8d\x4d\xc9\xe9\x0f\x9e\x20\x97\xe5\xe9\x7c\xe6\x33\x8d\xfd\xb0\xe4\x4f\xe7\x33\x6b\xe1\xd3\xf9\x6c\x76\x37\x7b\xe6\xbf\xd3\xf9\x4c\xc9\xd3\xf9\x8c\x2a\x3c\x9d\xcf\x4e\xe7\x57\xe3\x1c\xe5\x77\xfa\xe8\xb0\x50\x68\x2c\xb7\x3e\x75\x3d\x15\x62\x4e\xdc\x4f\xc5\x98\x0b\x90\x87\x11\x66\x60\x62\x5a\xad\x55\x2b\x6d\xb7\x03\x56\xe7\x67\x45\xd9\x03\x33\x9a\xb6\x69\x94\xa6\x68\x6c\x4e\x66\x5f\xb5\x02\x4d\x7c\x3d\xfb\xfa\xfa\xf5\x47\xc5\x77\x11\xeb\x74\xf8\x97\x47\x6d\xe9\xd2\x66\xd8\x88\xd6\xd8\xd6\x92\xdb\x37\xdd\x6f\x2a\x84\x7d\x5e\x87\x77\xa2\x35\x17\xd0\xb4\x99\xe0\xa6\x02\x06\x12\x37\x90\x18\xd2\x4a\x96\x4b\xb7\x9b\x27\x71\xb7\x84\x46\x19\xfa\xcc\x8c\xf3\x59\xe1\x60\xf9\xfd\x9b\x92\xce\xaa\x2b\x75\xbf\x29\x97\xf5\xf5\xf7\x17\xf9\x4b\xc9\x7f\xa5\xcb\x1e\xdc\xe0\xcd\x66\x13\xf5\xc6\x74\xd7\xb7\x42\xd1\xc4\xb6\x21\x69\x25\xa7\x6d\xec\x13\xa1\x92\xf1\x37\xbc\x48\xe7\xd7\xf3\xd7\xaf\xe7\xaf\xfe\xf3\xfa\xeb\xaf\xe7\xd7\xaf\xbe\x7e\xea\x6e\x0f\x71\xf1\xcb\xaf\xf6\xd0\x7e\x8a\x51\xdb\xf7\x37\xd5\x42\xce\x24\x90\x66\xf9\xad\x37\x42\xab\xb5\x35\x42\x83\x5e\xff\xa1\xbb\xca\x50\xa8\x8d\x03\xf1\x7c\x56\x1c\x85\x6b\xb5\x0c\x22\x54\x6a\x03\x75\x9b\x3b\x5b\xdb\x8e\x0a\xed\xc1\x86\x71\x82\x56\x12\x17\xde\x05\xd4\x6a\xd7\x90\xe1\x41\x43\xf4\xe0\xc1\x9d\x60\xbd\x7c\x6f\xcb\xf4\x83\x3e\x74\x78\x2a\x83\xc6\xb7\x1e\x1c\x1a\xad\x08\x73\x6b\x47\x60\x25\xe3\xd2\x58\x0b\xb8\x96\x0b\xeb\x67\x3c\xa5\x87\xaf\xee\x63\x3f\x0c\x76\xc7\x71\x0c\xdf\x09\x95\x31\x01\x6b\x7b\x1b\x32\x61\x7b\x68\x05\x95\xb2\xaa\x8f\xac\x65\x88\x51\x6b\x40\xad\xdc\xae\x97\xdc\xe2\xaf\x99\xb6\x8d\x2a\xd6\x0d\x41\xda\x8d\x32\xed\x9e\x41\xbd\xee\x06\xb4\x76\x49\x1c\xb5\x3f\xef\x98\xfe\x01\x57\x5c\xfa\xb8\x5a\xb5\xd2\xab\x47\x15\x23\xf0\x03\x04\x03\xcc\xf5\x25\xd0\x6a\x01\x5d\x0c\x78\x92\x03\x03\x07\x07\xe9\x80\x3e\x79\x60\xe7\xee\xa3\xb3\xd1\xb4\x1b\xc5\x7a\x32\x91\x41\x59\x4c\xfe\xeb\xc7\xbf\xfc\x39\x32\xa4\xb9\x2c\xf9\x6a\x3b\xb9\x6f\xb5\x58\xc0\xcb\x49\xf0\x1f\x6e\xb8\x37\xfd\xfb\xec\x9f\xd1\x9a\x89\x16\x2f\x9c\x02\x0b\xf7\xf7\x01\x9b\x0b\xe8\x3e\x17\x70\xc8\x71\x37\x9d\xde\x3c\x3e\x6d\x19\x0d\x87\x34\x1a\xa4\x89\x05\x1c\x3c\xb9\xbb\x39\x34\x12\x83\x1a\xa9\x52\x2e\x16\x35\xe6\x4a\x4a\xcc\x09\xda\x46\xc9\xce\x26\x20\x94\x31\xbd\x61\xf6\x10\x23\xdb\xf4\xca\xf3\x15\x4c\x7a\x77\x9d\xc2\x1c\xd2\x14\x66\xfd\x59\x67\x19\x48\x5d\xe2\xf9\x1f\xcc\x7e\x54\xf9\x2d\xd2\x24\xd8\x18\x7b\xdb\x03\x38\x07\xa1\x72\x66\xe9\x45\x95\x4d\x3f\xe7\x10\xc4\xac\xe1\xc1\xd4\x0f\xb4\x77\x80\xc2\xe0\xa7\x89\x3d\x8b\x96\x1f\xf9\x7b\x49\xcf\xcf\x7d\xd8\xf4\xae\x53\xb2\x46\x63\x58\x89\x63\x0d\xdd\x03\x6d\x50\xc5\x1a\xa2\x36\x25\xa4\xe0\x5c\xdc\x30\x6d\xd0\x83\x44\x05\x23\xd6\x71\x71\xe6\x70\x60\x69\x0a\xb2\x15\x62\xc0\x3f\xd1\x68\x2f\x73\x07\xb6\x7b\x71\x00\x1e\xf9\xb4\xfd\x55\x9a\x82\x7d\x21\x5b\x1f\x15\x7b\x4c\x1b\x3e\xfe\x2d\x3f\x8d\x6c\x6e\xdd\x63\x4c\x07\x72\x0f\xa8\x61\xf1\x29\x72\x58\x1c\xd3\xc3\xe2\x09\x82\x6e\x74\xf2\x31\x7a\x7e\xd4\x32\x22\xe7\x36\x9e\xa0\x26\xdb\x3a\x43\xfd\x31\x72\x7e\x74\xd2\x91\x73\xa6\xfe\x5e\xd2\x08\xf7\x02\x2e\x5f\x4f\x9f\xa0\x8e\x5a\xab\x27\x89\x4b\x45\xdb\xc9\xbd\x60\x5b\x5b\x20\xe0\x8c\x54\xf3\xd6\x4d\x3a\xce\x2e\x5c\xd5\x5a\xc0\x40\xe1\xc2\xcd\xb0\x17\x70\xe6\x56\x67\xbb\x27\xb8\x99\x36\xcf\x6d\x69\xfc\x12\x7e\x1d\x8d\x81\x63\xb7\x7e\x92\xe7\x50\x5f\x0e\x98\xc2\xef\x7e\x07\x0f\x4e\x0f\x43\xd0\xc6\x70\x5f\xb1\x53\x08\x82\x8e\xfc\xc9\x4a\x69\x98\xd8\x43\x9e\xce\x6e\x80\x27\x63\x32\x91\x40\x59\x52\x75\x03\xfc\xfc\x7c\x4f\xe9\xa4\x27\x73\x9e\x42\x90\x90\x5e\x26\x54\x2c\xdd\x50\xc5\x37\x30\xff\x08\x32\x96\xdf\x96\xae\x25\x58\xd8\x94\x3b\x39\xb3\x37\x74\x4c\xf8\xef\xfc\x9f\x11\x5b\x33\x62\xda\x5e\xd5\xb3\xe9\x0d\xec\x51\xba\x46\x29\x57\x36\xe3\x83\xef\xc7\xdc\xfc\x06\x86\x99\xa7\x5b\x65\x4a\x17\xa8\x43\xcd\x0a\xde\x9a\x05\xbc\x6a\xee\x6e\xfe\xd1\xcf\x84\xdd\x94\xc9\x89\xd5\x68\x5c\x3e\xca\xbd\x1b\x4c\x9c\x43\x90\xc4\x16\xa8\x47\x19\x94\x18\xff\x2e\x07\x8f\xcc\xc7\x60\xf8\xd5\xac\xdb\xaf\x79\x51\x08\xb4\x42\x38\x86\xfe\xe7\xcd\xa2\xd5\x2e\x2f\x4d\xfc\x7a\x72\x2c\x07\xf1\x1a\xa7\x51\x2b\xf9\xdd\x64\x1a\x76\x30\xfd\xfa\x02\xce\x8c\x4d\xbf\x85\x39\x9b\x46\x55\x5b\x33\xc9\x7f\xc6\x89\xed\x2c\xa7\x5e\x6e\x2b\x71\x4c\x7a\x39\x38\x73\x37\xba\x47\xc3\xf4\x77\x1a\x55\x54\x8b\x49\x90\x90\xfb\xed\xcf\x0a\x37\x78\xd0\x51\xf1\xdb\x87\x01\xb7\x3b\x4c\x91\xb9\x50\x06\x8f\x4a\x00\x18\xa4\xf7\xbc\x46\xd5\xd2\x64\x28\x13\x17\x70\x35\x9b\xcd\xa6\x37\xb0\xdb\xff\x44\x1a\xc7\xf0\xad\x21\xd6\x37\xa2\x1b\xcc\x8c\x4b\xdf\xd0\xe1\xb8\x6a\xed\xab\xf2\x9b\x77\xdf\x8f\x2a\xf3\x40\x75\xe2\x84\x1b\x7e\x22\x7e\xac\x0c\x3e\xfa\x9b\xb4\xed\x29\xfd\xfb\xca\x75\x94\x43\x9d\xb4\xc5\x21\xfa\x60\x02\x60\x66\x2b\x73\x28\x70\x85\x7a\x39\x22\xdf\x15\xcf\x24\xf6\xbf\x96\x26\xb1\xff\x1f\x42\xfe\x3f\x00\x00\xff\xff\x1f\xb2\x73\x97\x21\x22\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3a\xed\x72\xdb\x38\x92\xbf\x9d\xa7\xe8\xe1\xc5\x6b\xa9\x6c\x92\xb2\x9c\x64\x7d\x32\xa9\xa9\x5c\x76\x76\x76\xae\xae\x76\xa7\x66\xb2\x75\xb7\xb5\xbb\x75\x05\x92\x2d\x12\x31\x08\x70\x80\xa6\x64\x8d\x4b\xef\x7e\x05\x80\xa4\x28\xd9\xce\x78\x92\xa9\xdb\xf8\x87\x42\x02\xfd\xdd\x8d\xee\x46\x33\xc9\x57\x7f\xf8\xcb\xbb\xf7\x7f\xfb\xfe\x1b\xa8\xa8\x16\xcb\x17\x89\xfd\x07\x04\x93\x65\x1a\xa0\x0c\x96\x2f\x4e\x92\x0a\x59\xb1\x7c\x71\x72\x92\xd4\x48\x0c\xf2\x8a\x69\x83\x94\x06\x2d\xad\xc2\xeb\x60\xbf\x51\x11\x35\x21\xfe\xd4\xf2\x75\x1a\xfc\x4f\xf8\xd7\xb7\xe1\x3b\x55\x37\x8c\x78\x26\x30\x80\x5c\x49\x42\x49\x69\xf0\xdd\x37\x29\x16\x25\x8e\xf0\x24\xab\x31\x0d\xd6\x1c\x37\x8d\xd2\x34\x02\xdd\xf0\x82\xaa\xb4\xc0\x35\xcf\x31\x74\x2f\x17\xc0\x25\x27\xce\x44\x68\x72\x26\x30\xbd\x0c\x96\x2f\x2c\x1d\xe2\x24\x70\x79\x7f\x1f\xfd\x19\x69\xa3\xf4\xed\x6e\xb7\x80\xb7\x2d\x55\x28\x89\xe7\x8c\xb0\x80\x3f\xb2\x36\x47\x4a\x62\x0f\xe9\x90\x04\x97\xb7\x50\x69\x5c\xa5\x81\x15\xdd\x2c\xe2\x38\x2f\xe4\x07\x13\xe5\x42\xb5\xc5\x4a\x30\x8d\x51\xae\xea\x98\x7d\x60\x77\xb1\xe0\x99\x89\x69\xc3\x89\x50\x87\x99\x52\x64\x48\xb3\x26\xbe\x8a\xae\xa2\xdf\xc7\xb9\x31\xf1\xb0\x16\xd5\x5c\x46\xb9\x31\x01\x68\x14\x69\x60\x68\x2b\xd0\x54\x88\x14\x40\xbc\xfc\x34\xbe\x2b\x25\x29\x64\x1b\x34\xaa\xc6\xf8\x55\xf4\xfb\x68\xe6\x58\x8e\x97\x3f\xce\xd5\xb2\x35\xb9\xe6\x0d\x81\xd1\xf9\xb3\xf9\x7e\xf8\xa9\x45\xbd\x8d\xaf\xa2\xcb\xe8\xb2\x7b\x71\x7c\x3e\x98\x60\x99\xc4\x9e\xe0\xf2\xb3\x68\x87\x52\xd1\x36\x9e\x47\xaf\xa2\xcb\xb8\x61\xf9\x2d\x2b\xb1\xe8\x39\xd9\xad\xa8\x5f\xfc\xcd\xf8\x3e\xe5\xc3\x0f\xc7\x2e\xfc\x2d\x98\xd5\xaa\x46\x49\xd1\x07\x13\xcf\xa3\xcb\xeb\x68\xd6\x2f\x3c\xa4\xef\x18\x58\xa7\x59\x56\x27\xd1\x1a\xb5\x8d\x5c\x11\xe6\x28\x09\x35\xdc\xdb\xd5\x93\x9a\xcb\xb0\x42\x5e\x56\xb4\x80\xcb\xd9\xec\xf4\xe6\xb1\xd5\x75\xe5\x97\x0b\x6e\x1a\xc1\xb6\x0b\x58\x09\xbc\xf3\x4b\x4c\xf0\x52\x86\x9c\xb0\x36\x0b\xf0\x94\xdd\xc6\xce\xf1\x6c\xb4\x2a\x35\x1a\xd3\x31\x6b\x94\xe1\xc4\x95\x5c\xd8\x88\x62\xc4\xd7\xf8\x18\xac\x69\x98\x7c\x80\xc0\x32\xa3\x44\x4b\x78\x24\x48\x26\x54\x7e\xeb\xd7\xdc\x69\x1e\x2b\x91\x2b\xa1\xf4\x02\x36\x15\xef\xd0\xc0\x31\x82\x46\x63\x47\x1e\x1a\x56\x14\x5c\x96\x0b\x78\xd3\x74\xfa\x40\xcd\x74\xc9\xe5\x02\x66\x7b\x94\x24\xee\xcd\x98\xc4\x3e\x71\xbd\x38\x49\x32\x55\x6c\x9d\x0f\x0b\xbe\x86\x5c\x30\x63\xd2\xe0\xc8\xc4\x2e\x21\x1d\x00\xd8\x3c\xc4\xb8\xec\xb7\x0e\xf6\xb4\xda\x04\xe0\x18\xa5\x81\x17\x22\xcc\x14\x91\xaa\x17\x70\x69\xc5\xeb\x50\x8e\xe8\x89\x50\x94\xe1\xe5\xbc\xdf\x3c\x49\xaa\xcb\x9e\x08\xe1\x1d\x85\xce\x3f\x83\x67\x82\x65\xc2\x7b\xdc\x15\x83\x15\x0b\x33\x46\x55\x00\x4c\x73\x16\x56\xbc\x28\x50\xa6\x01\xe9\x16\x6d\x1c\xf1\x25\x8c\xd3\xdf\x13\xd9\xaf\xba\xec\xe5\x8a\x0b\xbe\xee\xd4\x1a\x3d\x1e\x69\xf8\xb4\x12\xd7\xd0\x3d\xa8\xd5\xca\x20\x85\x23\x9d\x46\xc0\x5c\x36\x2d\x85\xa5\x56\x6d\x33\xec\x9f\x24\x6e\x15\x78\x91\x06\x25\x37\x14\x00\x6d\x9b\xce\x00\xc1\xa0\xae\xd2\x75\x68\xed\xaf\x95\x08\xa0\x11\x2c\xc7\x4a\x89\x02\x75\x1a\xfc\xa8\x72\xce\x04\x48\xaf\x29\xfc\xf5\x87\xff\x82\xce\x51\x5c\x96\xb0\x55\xad\x86\x6f\xa8\x42\x8d\x6d\x0d\xac\x28\x6c\x90\x46\x51\x34\x62\xef\x22\xf6\xa1\x80\x61\x46\x72\x0f\x75\x92\x64\x2d\x91\x1a\x00\x33\x92\x90\x91\x0c\x0b\x5c\xb1\x56\x10\x14\x5a\x35\x85\xda\xc8\x90\x54\x59\xda\xfa\xe6\x95\xf0\x48\x01\x14\x8c\x58\xb7\x95\x06\x3d\x6c\xef\x39\x66\x1a\xd5\xb4\x4d\xe7\x3b\xbf\x88\x77\x0d\x93\x05\x16\xd6\xd3\xc2\x60\xb0\xfc\x96\xaf\x11\x6a\xf4\xba\x9c\x1c\x07\x42\xce\x34\x52\x38\x26\xfa\x20\x1c\x92\xd8\x0b\xe3\x55\x82\xee\x2f\x69\x45\x4f\x69\x50\xa1\x46\xd9\xc2\xc1\x5b\xa8\x6d\x36\x09\x96\xf7\xf7\x9a\xc9\x12\xe1\x25\x2f\xee\x2e\xe0\x25\xab\x55\x2b\x09\x16\x29\x44\x6f\xdd\xa3\xd9\xed\x0e\xa8\x03\x24\x82\x2f\x13\xf6\xb1\xa0\x06\x25\x73\xc1\xf3\xdb\x34\x20\x8e\x3a\xbd\xbf\xb7\xc4\x77\xbb\x1b\xb8\xbf\xe7\x2b\x78\x19\xfd\x80\x39\x6b\x28\xaf\xd8\x6e\x57\xea\xfe\x39\xc2\x3b\xcc\x5b\xc2\xc9\xf4\xfe\x1e\x85\xc1\xdd\xce\xb4\x59\xcd\x69\xd2\xa3\xdb\x75\x59\xec\x76\x56\xe6\x4e\xce\xdd\x0e\x62\x4b\x54\x16\x78\x07\x2f\xa3\xef\x51\x73\x55\x18\xf0\xf0\x49\xcc\x96\x49\x2c\xf8\xb2\xc3\x3b\x34\x52\xdc\x8a\x7d\xbc\xc4\x36\x60\x86\xe8\x76\x87\xc5\x89\x3a\x96\xf4\x91\xd8\x2f\xc3\x41\xfa\x2e\x1e\x0c\x27\xbc\xc5\x6d\x1a\xdc\xdf\x8f\x71\xbb\xdd\x9c\x09\x91\x31\x6b\x17\xaf\xda\x80\xf4\x33\xda\x38\x5d\x73\xe3\x1a\xa9\x65\x2f\xc1\x5e\xec\x67\x1e\xe6\xa3\x74\x45\xaa\x59\xc0\xd5\x7c\x94\xab\x1e\x3b\xe7\x6f\x8e\xce\xf9\xd5\xa3\xc0\x0d\x93\x28\xc0\xfd\x86\xa6\x66\xa2\x7f\xee\x4e\xcb\xe8\xf0\x1d\x23\x85\x36\x33\x0f\xa2\x0d\x19\x7e\x76\x03\x6a\x8d\x7a\x25\xd4\x66\x01\xac\x25\x75\x03\x35\xbb\x1b\xaa\xdc\xd5\x6c\x36\x96\xdb\x36\x80\x2c\x13\xe8\x72\x8a\xc6\x9f\x5a\x34\x64\x86\x5c\xe2\xb7\xdc\xaf\x4d\x29\x05\x4a\x83\xc5\x91\x35\x2c\x47\x6b\x5a\x07\x35\x72\xfd\x60\xcc\x47\x65\x5f\x29\x35\x14\x8e\xb1\x18\x1d\xe9\x51\x8d\x0b\x96\x09\xe9\x3d\xdc\x49\x42\xc5\xaf\x4a\xfc\xda\x36\x76\x4f\xe5\x7d\x9f\xd1\xac\xee\x0d\xa2\xf6\x5d\x85\x0d\x59\x70\xaf\x49\x4c\xc5\x67\x70\xb6\x41\x98\x31\x83\xcf\x61\xef\xea\xfb\x9e\xbd\x7b\xfd\x5c\xfe\x15\x32\x4d\x19\x32\x7a\x8e\x00\xab\x56\x16\x23\xfd\x5d\xee\xfc\x5c\x01\x5a\xc9\xd7\xa8\x0d\xa7\xed\x73\x25\xc0\x62\x2f\x82\x7f\x3f\x14\x21\x89\x49\x7f\x3c\xd6\xc6\x2f\xbf\xd1\xe1\xfe\xa5\x46\xe4\x6a\xf9\x27\xb5\x81\x42\xa1\x01\xaa\xb8\x01\x5b\x5c\xbf\x4e\xe2\xea\x6a\x00\x69\x96\xef\xed\x86\x33\x2a\xac\x5c\x43\x01\xdc\x80\x6e\xa5\xab\xbc\x4a\x02\x55\x78\xd8\x84\x74\x45\x3a\x82\xf7\xca\x36\x72\x6b\x94\x04\x35\x13\x3c\xe7\xaa\x35\xc0\x72\x52\xda\xc0\x4a\xab\x1a\xf0\xae\x62\xad\x21\x4b\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb3\xe4\x5c\x0a\x4a\x03\xcb\xf3\xb6\x6e\x6d\x23\x2a\x4b\x40\xa9\xda\xb2\xea\x64\x21\x05\xbe\x30\x09\x25\xcb\x41\x1e\xd3\xb0\x1a\x18\x11\xcb\x6f\xcd\x05\xf4\x59\x01\x98\x46\x20\x8e\x85\xc5\xca\x51\xdb\xbe\x01\x72\x55\xd7\x4a\xc2\x95\x2e\xa0\x61\x9a\xb6\x96\x97\x2b\x6f\x11\xbc\x95\x5b\x25\x11\x2a\xb6\x76\xa2\xc1\xb7\x9c\xfe\xd4\x66\x17\xf0\xde\xdf\x22\x2e\xe0\x5b\xa5\x4a\x81\xe7\x56\xc2\x3f\xb2\x1c\x33\xa5\x6e\x7b\x74\xa8\xd9\xb6\x67\xdc\xe9\xb1\xe1\x54\x71\x6f\xa8\x06\x75\x6d\x69\x14\x20\x78\xcd\xc9\x44\x49\xdc\xec\x73\xeb\xbe\x4a\x8b\xb0\x52\x9a\xff\x6c\x5b\x1c\x31\xf8\x0b\x20\x29\xe8\x28\xcf\xf4\x69\xd2\x05\x80\xc0\x15\x2d\xe0\x95\x4f\x93\xc7\x21\x5d\x72\xaa\xda\x2c\x64\xe2\xd1\x43\xd5\x93\x75\xb7\x4b\x5b\x7e\x16\x70\xe5\x5b\x5a\xdf\x56\x14\x34\x4a\x89\xc5\x51\xe0\x79\xbe\xd7\xd7\xcd\xdd\x20\xca\xd0\x17\xcf\x06\x22\x36\x1e\x0e\x0d\xb3\xe6\x7b\xdb\xe6\x1a\x19\x21\x30\x48\xd8\xd1\x35\xd9\xf6\x8b\x91\x97\xde\x5d\xb4\x02\x20\xa6\x4b\xa4\x34\xf8\x5f\x96\xa9\x96\x16\x99\x60\xf2\x36\x58\x5a\x38\x5b\xe1\x9d\xbd\x1f\xef\x09\x01\xeb\x0c\x8b\x02\x0b\xe0\x92\x94\xf3\x48\x37\x77\x80\x89\x7d\x59\x71\x81\x6e\x32\xe1\xce\x84\x3c\xb3\xde\xb4\x1e\x9f\x46\x49\xa6\xe3\xe5\x3b\xd5\x6c\xc3\x86\x19\x42\x87\x6a\x19\x1a\xd7\x8b\x0e\xd4\x58\xa6\xd6\x08\xbe\xd7\xcd\xd4\x1d\x30\x59\xc0\x8a\x6b\x04\xb6\x61\xdb\xaf\x92\xb8\x70\x37\x93\xde\x8e\x9f\xee\xcc\xee\x3e\xfb\x45\x79\x72\x38\x1d\x35\xbb\x7d\xd4\x91\x9d\xd0\xce\x89\xdc\x59\x3d\xa6\x0d\x22\x7d\x6d\x53\x72\xfa\x83\x27\xc8\x65\x79\x3a\x9f\xf9\x4c\x63\x1f\x2c\xf9\xd3\xf9\xcc\x5a\xf8\x74\x3e\x9b\xdd\xcd\x9e\xf9\x77\x3a\x9f\x29\x79\x3a\x9f\x51\x85\xa7\xf3\xd9\xe9\xfc\x6a\x9c\xa3\xfc\x4a\x1f\x1d\x16\x0a\x8d\xe5\xd6\xa7\xae\xa7\x42\xcc\x89\xfb\x4b\x31\xe6\x02\xe4\x61\x84\x19\x98\x98\x56\x6b\xd5\x4a\xdb\xed\x80\xd5\xf9\x59\x51\xf6\xc0\x8c\xa6\x6d\x1a\xa5\x29\x1a\x9b\x93\xd9\x5b\xad\x40\x13\x5f\xcf\x5e\x5f\xbf\xf9\xa8\xf8\x2e\x62\x9d\x0e\xff\xef\x51\x5b\xba\xb4\x19\x36\xa2\x35\xb6\xb5\xe4\xf6\x4e\xf7\x45\x85\xb0\xcf\xeb\xf0\xbd\x68\xcd\x05\x34\x6d\x26\xb8\xa9\x80\x81\xc4\x0d\x24\x86\xb4\x92\xe5\xd2\xad\xe6\x49\xdc\xbd\x42\xa3\x0c\x7d\x62\xc6\xf9\xa4\x70\xb0\xfc\xfe\x45\x49\x67\xd5\x95\xba\x2f\xca\x65\x7d\xfd\xfd\x52\xfd\xf5\xe0\xf8\x6e\x36\x9b\xa8\xb7\xa4\x3b\xbb\x15\x8a\x26\xb6\xdd\x48\x2b\x39\x6d\x63\x9f\x05\x95\x8c\xbf\xe6\x45\x3a\xbf\x9e\xbf\x79\x33\x7f\xf5\xef\xd7\xaf\x5f\xcf\xaf\x5f\xbd\x7e\xea\x60\x0f\x41\xf1\xeb\xcf\xf5\xd0\x7b\x8a\x51\xcf\xf7\x37\xd5\x42\xce\x24\x90\x66\xf9\xad\x37\x42\xab\xb5\x35\x42\x83\x5e\xff\xa1\xb5\xca\x50\xa8\x8d\x03\xf1\x7c\x56\x1c\x85\xeb\xb3\x0c\x22\x54\x6a\x03\x75\x9b\x3b\x5b\xdb\x76\x0a\xed\xc6\x86\x71\x82\x56\x12\x17\xde\x05\xd4\x6a\xd7\x8d\xe1\x41\x37\xf4\xe0\xb6\x9d\x60\xbd\x7c\x6f\x6b\xf4\x83\x26\x74\xb8\x27\x83\xc6\x77\x1e\x1c\x1a\xad\x08\x73\x6b\x47\x60\x25\xe3\xd2\x58\x0b\xb8\x7e\x0b\xeb\x67\xdc\xa3\x87\xa7\xee\x61\x3f\x09\x76\xdb\x71\x0c\xdf\x0a\x95\x31\x01\x6b\x7b\x14\x32\x61\x1b\x68\x05\x95\xb2\xaa\x8f\xac\x65\x88\x51\x6b\x40\xad\xdc\xaa\x97\xdc\xe2\xaf\x99\xb6\x5d\x2a\xd6\x0d\x41\xda\xcd\x31\xed\x9a\x41\xbd\xee\xa6\xb3\xf6\x95\x38\x6a\xbf\xdf\x31\xfd\x03\xae\xb8\xf4\x71\xb5\x6a\xa5\x57\x8f\x2a\x46\xe0\xa7\x07\x06\x98\x6b\x4a\xa0\xd5\x02\xba\x18\xf0\x24\x07\x06\x0e\x0e\xd2\x01\x7d\xf2\xc0\xce\xdd\x43\x67\xa3\x69\x37\x87\xf5\x64\x22\x83\xb2\x98\xfc\xe7\x8f\x7f\xf9\x73\x64\x48\x73\x59\xf2\xd5\x76\x72\xdf\x6a\xb1\x80\x97\x93\xe0\xdf\xdc\x64\x6f\xfa\xf7\xd9\x3f\xa3\x35\x13\x2d\x5e\x38\x05\x16\xee\xf7\x01\x9b\x0b\xe8\x1e\x17\x70\xc8\x71\x37\x9d\xde\x3c\x3e\x6a\x19\x4d\x86\x34\x1a\xa4\x89\x05\x1c\x3c\xb9\xbb\x39\x34\x12\x83\x1a\xa9\x52\x2e\x16\x35\xe6\x4a\x4a\xcc\x09\xda\x46\xc9\xce\x26\x20\x94\x31\xbd\x61\xf6\x10\x23\xdb\xf4\xca\xf3\x15\x4c\x7a\x77\x9d\xc2\x1c\xd2\x14\x66\xfd\x5e\x67\x19\x48\x5d\xd6\xf9\x6f\xcc\x7e\x54\xf9\x2d\xd2\x24\xd8\x18\x7b\xda\x03\x38\x07\xa1\x72\x66\xe9\x45\x95\xcd\x3d\xe7\x10\xc4\xac\xe1\xc1\xd4\x4f\xb3\x77\x80\xc2\xe0\x2f\x13\x7b\x16\x2d\x3f\xef\xf7\x92\x9e\x9f\xfb\xb0\xe9\x5d\xa7\x64\x8d\xc6\xb0\x12\xc7\x1a\xba\xdb\xd9\xa0\x8a\x35\x44\x6d\x4a\x48\xc1\xb9\xb8\x61\xda\xa0\x07\x89\x0a\x46\xac\xe3\xe2\xcc\xe1\xc0\xd2\x14\x64\x2b\xc4\x80\x7f\xa2\xd1\x1e\xe6\x0e\x6c\xf7\xe2\x00\x3c\xf2\x39\xfb\xab\x34\x05\x7b\x3d\xb6\x3e\x2a\xf6\x98\x36\x7c\xfc\x45\x7e\x1a\xd9\xdc\xba\xc7\x98\x0e\xe4\x1e\x50\xc3\xe2\x97\xc8\x61\x71\x4c\x0f\x8b\x27\x08\xba\xb9\xc9\xc7\xe8\xf9\x39\xcb\x88\x9c\x5b\x78\x82\x9a\x6c\xeb\x0c\xf5\xc7\xc8\xf9\xb9\x49\x47\xce\x99\xfa\x3b\x49\x23\xdc\x0b\xb8\x7c\x33\x7d\x82\x3a\x6a\xad\x9e\x24\x2e\x15\x6d\x27\xf7\x82\x6d\x6d\x81\x80\x33\x52\xcd\x3b\x37\xe6\x38\xbb\x70\x55\x6b\x01\x03\x85\x0b\x37\xc0\x5e\xc0\x99\x7b\xb3\xfb\xbc\x46\x87\xf5\x7a\x36\x9b\x5d\x40\xff\xbd\xe7\x3f\x98\x3d\xc5\xba\xc5\xdd\x13\xf2\x98\x36\xcf\x6d\xf1\xfc\x1c\x89\x3a\x1a\x83\x4c\xdd\xfb\x58\xaa\xcb\x5f\x29\xd6\x50\xa4\x0e\xe4\x82\xdf\xfd\x0e\x1e\xec\x1e\xc6\xb1\x3d\x08\x7d\xd9\x4f\x21\x08\x3a\xf2\x27\x2b\xa5\x61\x62\x37\x79\x3a\xbb\x01\x9e\x8c\xc9\x44\x02\x65\x49\xd5\x0d\xf0\xf3\xf3\x3d\xa5\x93\x9e\xcc\x79\x0a\x41\x42\x7a\x99\x50\xb1\x74\x63\x19\xdf\x02\xfd\x23\xc8\x58\x7e\x5b\xba\xbe\x62\x61\xf3\xf6\xe4\xcc\x1e\xf3\x31\xe1\xbf\xf3\x7f\x46\x6c\xcd\x88\x69\x7b\xde\xcf\xa6\x37\xb0\x47\xe9\x5a\xad\x5c\xd9\xb2\x01\xbe\xa3\x73\x13\x20\x18\xa6\xa6\xee\x2d\x53\xba\x40\x1d\x6a\x56\xf0\xd6\x2c\xe0\x55\x73\x77\xf3\x8f\x7e\xaa\xec\xe6\x54\x4e\xac\x46\xe3\xf2\x51\xee\xdd\x68\xe3\x1c\x82\x24\xb6\x40\x3d\xca\xa0\xc4\xf8\xcb\x1e\x3c\x32\x61\x83\xe1\xbb\x5b\xb7\x5e\xf3\xa2\x10\x68\x85\x70\x0c\xfd\x07\xd2\xa2\xd5\x2e\xb9\x4d\xfc\xfb\xe4\x58\x0e\x1b\x08\xd3\xa8\x95\xfc\x6e\x32\x0d\x3b\x98\xfe\xfd\x02\xce\x8c\xcd\xe1\x85\x39\x9b\x46\x55\x5b\x33\xc9\x7f\xc6\x89\x8d\x8e\xa9\x97\xdb\x4a\x1c\x93\x5e\x0e\xce\xdc\x8d\x0e\xe3\x30\x3f\x9e\x46\x15\xd5\x62\x12\x24\xe4\xbe\x1e\x5a\xe1\x06\x0f\x3a\x2a\x7e\xf9\x30\xe0\x76\x87\x79\x36\x17\xca\xe0\x51\x1d\x01\x83\xf4\xde\xc7\xf1\x64\xa8\x35\x17\x70\x35\x9b\xcd\xa6\x37\xb0\xdb\x7f\x64\x8d\x63\xf8\xc6\x10\xeb\x5b\xd9\x0d\x66\xc6\xd5\x00\xe8\x70\x5c\xc9\xf7\xa5\xfd\xed\xf7\xdf\x8d\xca\xfb\x40\x75\xe2\x84\x1b\x3e\x32\x3f\x56\x4b\x1f\xfd\xaa\x6d\x1b\x53\x7f\x43\x73\x6d\xe9\x50\x6c\x6d\x85\x89\x3e\x98\x00\x98\xd9\xca\x1c\x0a\x5c\xa1\x5e\x8e\xc8\x77\x15\x38\x89\xfd\xf7\xd6\x24\xf6\xff\xa5\xe4\xff\x02\x00\x00\xff\xff\x06\xe6\xbb\xe1\x63\x22\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( From dec8bba9d4c5fcb3dd7e51f0f794b3e895c7f52d Mon Sep 17 00:00:00 2001 From: RJ Catalano Date: Tue, 17 Oct 2017 06:07:08 -0500 Subject: [PATCH 217/272] accounts/abi: improve type handling, add event support (#14743) --- accounts/abi/abi.go | 115 +----- accounts/abi/abi_test.go | 21 +- accounts/abi/bind/bind_test.go | 2 +- accounts/abi/error.go | 26 +- accounts/abi/event.go | 91 +++++ accounts/abi/event_test.go | 2 +- accounts/abi/method.go | 79 ++++ accounts/abi/numbers.go | 47 +-- accounts/abi/pack.go | 7 +- accounts/abi/pack_test.go | 7 +- accounts/abi/reflect.go | 10 +- accounts/abi/type.go | 210 ++++++----- accounts/abi/type_test.go | 215 ++++++++--- accounts/abi/unpack.go | 279 +++++++------- accounts/abi/unpack_test.go | 645 ++++++++++++++------------------- 15 files changed, 906 insertions(+), 850 deletions(-) diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 2a06d474b8..205dc300b0 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -20,10 +20,6 @@ import ( "encoding/json" "fmt" "io" - "reflect" - "strings" - - "github.com/ethereum/go-ethereum/common" ) // The ABI holds information about a contract's context and available @@ -76,106 +72,27 @@ func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) { return append(method.Id(), arguments...), nil } -// these variable are used to determine certain types during type assertion for -// assignment. -var ( - r_interSlice = reflect.TypeOf([]interface{}{}) - r_hash = reflect.TypeOf(common.Hash{}) - r_bytes = reflect.TypeOf([]byte{}) - r_byte = reflect.TypeOf(byte(0)) -) - // Unpack output in v according to the abi specification -func (abi ABI) Unpack(v interface{}, name string, output []byte) error { - var method = abi.Methods[name] - - if len(output) == 0 { - return fmt.Errorf("abi: unmarshalling empty output") +func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error) { + if err = bytesAreProper(output); err != nil { + return err } - - // make sure the passed value is a pointer - valueOf := reflect.ValueOf(v) - if reflect.Ptr != valueOf.Kind() { - return fmt.Errorf("abi: Unpack(non-pointer %T)", v) - } - - var ( - value = valueOf.Elem() - typ = value.Type() - ) - - if len(method.Outputs) > 1 { - switch value.Kind() { - // struct will match named return values to the struct's field - // names - case reflect.Struct: - for i := 0; i < len(method.Outputs); i++ { - marshalledValue, err := toGoType(i, method.Outputs[i], output) - if err != nil { - return err - } - reflectValue := reflect.ValueOf(marshalledValue) - - for j := 0; j < typ.NumField(); j++ { - field := typ.Field(j) - // TODO read tags: `abi:"fieldName"` - if field.Name == strings.ToUpper(method.Outputs[i].Name[:1])+method.Outputs[i].Name[1:] { - if err := set(value.Field(j), reflectValue, method.Outputs[i]); err != nil { - return err - } - } - } - } - case reflect.Slice: - if !value.Type().AssignableTo(r_interSlice) { - return fmt.Errorf("abi: cannot marshal tuple in to slice %T (only []interface{} is supported)", v) - } - - // if the slice already contains values, set those instead of the interface slice itself. - if value.Len() > 0 { - if len(method.Outputs) > value.Len() { - return fmt.Errorf("abi: cannot marshal in to slices of unequal size (require: %v, got: %v)", len(method.Outputs), value.Len()) - } - - for i := 0; i < len(method.Outputs); i++ { - marshalledValue, err := toGoType(i, method.Outputs[i], output) - if err != nil { - return err - } - reflectValue := reflect.ValueOf(marshalledValue) - if err := set(value.Index(i).Elem(), reflectValue, method.Outputs[i]); err != nil { - return err - } - } - return nil - } - - // create a new slice and start appending the unmarshalled - // values to the new interface slice. - z := reflect.MakeSlice(typ, 0, len(method.Outputs)) - for i := 0; i < len(method.Outputs); i++ { - marshalledValue, err := toGoType(i, method.Outputs[i], output) - if err != nil { - return err - } - z = reflect.Append(z, reflect.ValueOf(marshalledValue)) - } - value.Set(z) - default: - return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ) - } - + // since there can't be naming collisions with contracts and events, + // we need to decide whether we're calling a method or an event + var unpack unpacker + if method, ok := abi.Methods[name]; ok { + unpack = method + } else if event, ok := abi.Events[name]; ok { + unpack = event } else { - marshalledValue, err := toGoType(0, method.Outputs[0], output) - if err != nil { - return err - } - if err := set(value, reflect.ValueOf(marshalledValue), method.Outputs[0]); err != nil { - return err - } + return fmt.Errorf("abi: could not locate named method or event.") } - return nil + // requires a struct to unpack into for a tuple return... + if unpack.isTupleReturn() { + return unpack.tupleUnpack(v, output) + } + return unpack.singleUnpack(v, output) } func (abi *ABI) UnmarshalJSON(data []byte) error { diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go index a3aa9446ef..79c4d4a163 100644 --- a/accounts/abi/abi_test.go +++ b/accounts/abi/abi_test.go @@ -29,25 +29,6 @@ import ( "github.com/ethereum/go-ethereum/crypto" ) -// formatSilceOutput add padding to the value and adds a size -func formatSliceOutput(v ...[]byte) []byte { - off := common.LeftPadBytes(big.NewInt(int64(len(v))).Bytes(), 32) - output := append(off, make([]byte, 0, len(v)*32)...) - - for _, value := range v { - output = append(output, common.LeftPadBytes(value, 32)...) - } - return output -} - -// quick helper padding -func pad(input []byte, size int, left bool) []byte { - if left { - return common.LeftPadBytes(input, size) - } - return common.RightPadBytes(input, size) -} - const jsondata = ` [ { "type" : "function", "name" : "balance", "constant" : true }, @@ -191,7 +172,7 @@ func TestMethodSignature(t *testing.T) { t.Errorf("expected ids to match %x != %x", m.Id(), idexp) } - uintt, _ := NewType("uint") + uintt, _ := NewType("uint256") m = Method{"foo", false, []Argument{{"bar", uintt, false}}, nil} exp = "foo(uint256)" if m.Sig() != exp { diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 43ed53b922..17b2216426 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -472,7 +472,7 @@ func TestBindings(t *testing.T) { t.Fatalf("failed to create temporary workspace: %v", err) } defer os.RemoveAll(ws) - + pkg := filepath.Join(ws, "bindtest") if err = os.MkdirAll(pkg, 0700); err != nil { t.Fatalf("failed to create package: %v", err) diff --git a/accounts/abi/error.go b/accounts/abi/error.go index 420acf4182..9d8674ad08 100644 --- a/accounts/abi/error.go +++ b/accounts/abi/error.go @@ -39,22 +39,23 @@ func formatSliceString(kind reflect.Kind, sliceSize int) string { // type in t. func sliceTypeCheck(t Type, val reflect.Value) error { if val.Kind() != reflect.Slice && val.Kind() != reflect.Array { - return typeErr(formatSliceString(t.Kind, t.SliceSize), val.Type()) - } - if t.IsArray && val.Len() != t.SliceSize { - return typeErr(formatSliceString(t.Elem.Kind, t.SliceSize), formatSliceString(val.Type().Elem().Kind(), val.Len())) + return typeErr(formatSliceString(t.Kind, t.Size), val.Type()) } - if t.Elem.IsSlice { + if t.T == ArrayTy && val.Len() != t.Size { + return typeErr(formatSliceString(t.Elem.Kind, t.Size), formatSliceString(val.Type().Elem().Kind(), val.Len())) + } + + if t.Elem.T == SliceTy { if val.Len() > 0 { return sliceTypeCheck(*t.Elem, val.Index(0)) } - } else if t.Elem.IsArray { + } else if t.Elem.T == ArrayTy { return sliceTypeCheck(*t.Elem, val.Index(0)) } if elemKind := val.Type().Elem().Kind(); elemKind != t.Elem.Kind { - return typeErr(formatSliceString(t.Elem.Kind, t.SliceSize), val.Type()) + return typeErr(formatSliceString(t.Elem.Kind, t.Size), val.Type()) } return nil } @@ -62,20 +63,19 @@ func sliceTypeCheck(t Type, val reflect.Value) error { // typeCheck checks that the given reflection value can be assigned to the reflection // type in t. func typeCheck(t Type, value reflect.Value) error { - if t.IsSlice || t.IsArray { + if t.T == SliceTy || t.T == ArrayTy { return sliceTypeCheck(t, value) } // Check base type validity. Element types will be checked later on. if t.Kind != value.Kind() { return typeErr(t.Kind, value.Kind()) + } else if t.T == FixedBytesTy && t.Size != value.Len() { + return typeErr(t.Type, value.Type()) + } else { + return nil } - return nil -} -// varErr returns a formatted error. -func varErr(expected, got reflect.Kind) error { - return typeErr(expected, got) } // typeErr returns a formatted type casting error. diff --git a/accounts/abi/event.go b/accounts/abi/event.go index 51ab842418..44ed7b8df2 100644 --- a/accounts/abi/event.go +++ b/accounts/abi/event.go @@ -18,6 +18,7 @@ package abi import ( "fmt" + "reflect" "strings" "github.com/ethereum/go-ethereum/common" @@ -44,3 +45,93 @@ func (e Event) Id() common.Hash { } return common.BytesToHash(crypto.Keccak256([]byte(fmt.Sprintf("%v(%v)", e.Name, strings.Join(types, ","))))) } + +// unpacks an event return tuple into a struct of corresponding go types +// +// Unpacking can be done into a struct or a slice/array. +func (e Event) tupleUnpack(v interface{}, output []byte) error { + // make sure the passed value is a pointer + valueOf := reflect.ValueOf(v) + if reflect.Ptr != valueOf.Kind() { + return fmt.Errorf("abi: Unpack(non-pointer %T)", v) + } + + var ( + value = valueOf.Elem() + typ = value.Type() + ) + + if value.Kind() != reflect.Struct { + return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ) + } + + j := 0 + for i := 0; i < len(e.Inputs); i++ { + input := e.Inputs[i] + if input.Indexed { + // can't read, continue + continue + } else if input.Type.T == ArrayTy { + // need to move this up because they read sequentially + j += input.Type.Size + } + marshalledValue, err := toGoType((i+j)*32, input.Type, output) + if err != nil { + return err + } + reflectValue := reflect.ValueOf(marshalledValue) + + switch value.Kind() { + case reflect.Struct: + for j := 0; j < typ.NumField(); j++ { + field := typ.Field(j) + // TODO read tags: `abi:"fieldName"` + if field.Name == strings.ToUpper(e.Inputs[i].Name[:1])+e.Inputs[i].Name[1:] { + if err := set(value.Field(j), reflectValue, e.Inputs[i]); err != nil { + return err + } + } + } + case reflect.Slice, reflect.Array: + if value.Len() < i { + return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(e.Inputs), value.Len()) + } + v := value.Index(i) + if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface { + return fmt.Errorf("abi: cannot unmarshal %v in to %v", v.Type(), reflectValue.Type()) + } + reflectValue := reflect.ValueOf(marshalledValue) + if err := set(v.Elem(), reflectValue, e.Inputs[i]); err != nil { + return err + } + default: + return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ) + } + } + return nil +} + +func (e Event) isTupleReturn() bool { return len(e.Inputs) > 1 } + +func (e Event) singleUnpack(v interface{}, output []byte) error { + // make sure the passed value is a pointer + valueOf := reflect.ValueOf(v) + if reflect.Ptr != valueOf.Kind() { + return fmt.Errorf("abi: Unpack(non-pointer %T)", v) + } + + if e.Inputs[0].Indexed { + return fmt.Errorf("abi: attempting to unpack indexed variable into element.") + } + + value := valueOf.Elem() + + marshalledValue, err := toGoType(0, e.Inputs[0].Type, output) + if err != nil { + return err + } + if err := set(value, reflect.ValueOf(marshalledValue), e.Inputs[0]); err != nil { + return err + } + return nil +} diff --git a/accounts/abi/event_test.go b/accounts/abi/event_test.go index b5054a0329..7e2f13f763 100644 --- a/accounts/abi/event_test.go +++ b/accounts/abi/event_test.go @@ -31,7 +31,7 @@ func TestEventId(t *testing.T) { }{ { definition: `[ - { "type" : "event", "name" : "balance", "inputs": [{ "name" : "in", "type": "uint" }] }, + { "type" : "event", "name" : "balance", "inputs": [{ "name" : "in", "type": "uint256" }] }, { "type" : "event", "name" : "check", "inputs": [{ "name" : "t", "type": "address" }, { "name": "b", "type": "uint256" }] } ]`, expectations: map[string]common.Hash{ diff --git a/accounts/abi/method.go b/accounts/abi/method.go index 62b3d29575..d8838e9ed6 100644 --- a/accounts/abi/method.go +++ b/accounts/abi/method.go @@ -77,6 +77,85 @@ func (method Method) pack(args ...interface{}) ([]byte, error) { return ret, nil } +// unpacks a method return tuple into a struct of corresponding go types +// +// Unpacking can be done into a struct or a slice/array. +func (method Method) tupleUnpack(v interface{}, output []byte) error { + // make sure the passed value is a pointer + valueOf := reflect.ValueOf(v) + if reflect.Ptr != valueOf.Kind() { + return fmt.Errorf("abi: Unpack(non-pointer %T)", v) + } + + var ( + value = valueOf.Elem() + typ = value.Type() + ) + + j := 0 + for i := 0; i < len(method.Outputs); i++ { + toUnpack := method.Outputs[i] + if toUnpack.Type.T == ArrayTy { + // need to move this up because they read sequentially + j += toUnpack.Type.Size + } + marshalledValue, err := toGoType((i+j)*32, toUnpack.Type, output) + if err != nil { + return err + } + reflectValue := reflect.ValueOf(marshalledValue) + + switch value.Kind() { + case reflect.Struct: + for j := 0; j < typ.NumField(); j++ { + field := typ.Field(j) + // TODO read tags: `abi:"fieldName"` + if field.Name == strings.ToUpper(method.Outputs[i].Name[:1])+method.Outputs[i].Name[1:] { + if err := set(value.Field(j), reflectValue, method.Outputs[i]); err != nil { + return err + } + } + } + case reflect.Slice, reflect.Array: + if value.Len() < i { + return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(method.Outputs), value.Len()) + } + v := value.Index(i) + if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface { + return fmt.Errorf("abi: cannot unmarshal %v in to %v", v.Type(), reflectValue.Type()) + } + reflectValue := reflect.ValueOf(marshalledValue) + if err := set(v.Elem(), reflectValue, method.Outputs[i]); err != nil { + return err + } + default: + return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ) + } + } + return nil +} + +func (method Method) isTupleReturn() bool { return len(method.Outputs) > 1 } + +func (method Method) singleUnpack(v interface{}, output []byte) error { + // make sure the passed value is a pointer + valueOf := reflect.ValueOf(v) + if reflect.Ptr != valueOf.Kind() { + return fmt.Errorf("abi: Unpack(non-pointer %T)", v) + } + + value := valueOf.Elem() + + marshalledValue, err := toGoType(0, method.Outputs[0].Type, output) + if err != nil { + return err + } + if err := set(value, reflect.ValueOf(marshalledValue), method.Outputs[0]); err != nil { + return err + } + return nil +} + // Sig returns the methods string signature according to the ABI spec. // // Example diff --git a/accounts/abi/numbers.go b/accounts/abi/numbers.go index 5d3efff52e..9ad99f90d2 100644 --- a/accounts/abi/numbers.go +++ b/accounts/abi/numbers.go @@ -25,36 +25,23 @@ import ( ) var ( - big_t = reflect.TypeOf(big.Int{}) - ubig_t = reflect.TypeOf(big.Int{}) - byte_t = reflect.TypeOf(byte(0)) - byte_ts = reflect.TypeOf([]byte(nil)) - uint_t = reflect.TypeOf(uint(0)) - uint8_t = reflect.TypeOf(uint8(0)) - uint16_t = reflect.TypeOf(uint16(0)) - uint32_t = reflect.TypeOf(uint32(0)) - uint64_t = reflect.TypeOf(uint64(0)) - int_t = reflect.TypeOf(int(0)) - int8_t = reflect.TypeOf(int8(0)) - int16_t = reflect.TypeOf(int16(0)) - int32_t = reflect.TypeOf(int32(0)) - int64_t = reflect.TypeOf(int64(0)) - hash_t = reflect.TypeOf(common.Hash{}) - address_t = reflect.TypeOf(common.Address{}) - - uint_ts = reflect.TypeOf([]uint(nil)) - uint8_ts = reflect.TypeOf([]uint8(nil)) - uint16_ts = reflect.TypeOf([]uint16(nil)) - uint32_ts = reflect.TypeOf([]uint32(nil)) - uint64_ts = reflect.TypeOf([]uint64(nil)) - ubig_ts = reflect.TypeOf([]*big.Int(nil)) - - int_ts = reflect.TypeOf([]int(nil)) - int8_ts = reflect.TypeOf([]int8(nil)) - int16_ts = reflect.TypeOf([]int16(nil)) - int32_ts = reflect.TypeOf([]int32(nil)) - int64_ts = reflect.TypeOf([]int64(nil)) - big_ts = reflect.TypeOf([]*big.Int(nil)) + big_t = reflect.TypeOf(&big.Int{}) + derefbig_t = reflect.TypeOf(big.Int{}) + uint8_t = reflect.TypeOf(uint8(0)) + uint16_t = reflect.TypeOf(uint16(0)) + uint32_t = reflect.TypeOf(uint32(0)) + uint64_t = reflect.TypeOf(uint64(0)) + int_t = reflect.TypeOf(int(0)) + int8_t = reflect.TypeOf(int8(0)) + int16_t = reflect.TypeOf(int16(0)) + int32_t = reflect.TypeOf(int32(0)) + int64_t = reflect.TypeOf(int64(0)) + address_t = reflect.TypeOf(common.Address{}) + int_ts = reflect.TypeOf([]int(nil)) + int8_ts = reflect.TypeOf([]int8(nil)) + int16_ts = reflect.TypeOf([]int16(nil)) + int32_ts = reflect.TypeOf([]int32(nil)) + int64_ts = reflect.TypeOf([]int64(nil)) ) // U256 converts a big Int into a 256bit EVM number. diff --git a/accounts/abi/pack.go b/accounts/abi/pack.go index 4d8a3f0318..072e805368 100644 --- a/accounts/abi/pack.go +++ b/accounts/abi/pack.go @@ -61,8 +61,9 @@ func packElement(t Type, reflectValue reflect.Value) []byte { reflectValue = mustArrayToByteSlice(reflectValue) } return common.RightPadBytes(reflectValue.Bytes(), 32) + default: + panic("abi: fatal error") } - panic("abi: fatal error") } // packNum packs the given number (using the reflect value) and will cast it to appropriate number representation @@ -74,6 +75,8 @@ func packNum(value reflect.Value) []byte { return U256(big.NewInt(value.Int())) case reflect.Ptr: return U256(value.Interface().(*big.Int)) + default: + panic("abi: fatal error") } - return nil + } diff --git a/accounts/abi/pack_test.go b/accounts/abi/pack_test.go index c6cfb56ea0..36401ee677 100644 --- a/accounts/abi/pack_test.go +++ b/accounts/abi/pack_test.go @@ -322,12 +322,12 @@ func TestPack(t *testing.T) { } { typ, err := NewType(test.typ) if err != nil { - t.Fatal("unexpected parse error:", err) + t.Fatalf("%v failed. Unexpected parse error: %v", i, err) } output, err := typ.pack(reflect.ValueOf(test.input)) if err != nil { - t.Fatal("unexpected pack error:", err) + t.Fatalf("%v failed. Unexpected pack error: %v", i, err) } if !bytes.Equal(output, test.output) { @@ -435,7 +435,4 @@ func TestPackNumber(t *testing.T) { t.Errorf("test %d: pack mismatch: have %x, want %x", i, packed, tt.packed) } } - if packed := packNum(reflect.ValueOf("string")); packed != nil { - t.Errorf("expected 'string' to pack to nil. got %x instead", packed) - } } diff --git a/accounts/abi/reflect.go b/accounts/abi/reflect.go index 8fa75df07f..e953b77c18 100644 --- a/accounts/abi/reflect.go +++ b/accounts/abi/reflect.go @@ -24,7 +24,7 @@ import ( // indirect recursively dereferences the value until it either gets the value // or finds a big.Int func indirect(v reflect.Value) reflect.Value { - if v.Kind() == reflect.Ptr && v.Elem().Type() != big_t { + if v.Kind() == reflect.Ptr && v.Elem().Type() != derefbig_t { return indirect(v.Elem()) } return v @@ -73,15 +73,9 @@ func mustArrayToByteSlice(value reflect.Value) reflect.Value { func set(dst, src reflect.Value, output Argument) error { dstType := dst.Type() srcType := src.Type() - switch { - case dstType.AssignableTo(src.Type()): + case dstType.AssignableTo(srcType): dst.Set(src) - case dstType.Kind() == reflect.Array && srcType.Kind() == reflect.Slice: - if dst.Len() < output.Type.SliceSize { - return fmt.Errorf("abi: cannot unmarshal src (len=%d) in to dst (len=%d)", output.Type.SliceSize, dst.Len()) - } - reflect.Copy(dst, src) case dstType.Kind() == reflect.Interface: dst.Set(src) case dstType.Kind() == reflect.Ptr: diff --git a/accounts/abi/type.go b/accounts/abi/type.go index 5f20babb3f..fba10b96d2 100644 --- a/accounts/abi/type.go +++ b/accounts/abi/type.go @@ -21,6 +21,7 @@ import ( "reflect" "regexp" "strconv" + "strings" ) const ( @@ -29,6 +30,7 @@ const ( BoolTy StringTy SliceTy + ArrayTy AddressTy FixedBytesTy BytesTy @@ -39,9 +41,6 @@ const ( // Type is the reflection of the supported argument type type Type struct { - IsSlice, IsArray bool - SliceSize int - Elem *Type Kind reflect.Kind @@ -53,118 +52,116 @@ type Type struct { } var ( - // fullTypeRegex parses the abi types - // - // Types can be in the format of: - // - // Input = Type [ "[" [ Number ] "]" ] Name . - // Type = [ "u" ] "int" [ Number ] [ x ] [ Number ]. - // - // Examples: - // - // string int uint fixed - // string32 int8 uint8 uint[] - // address int256 uint256 fixed128x128[2] - fullTypeRegex = regexp.MustCompile(`([a-zA-Z0-9]+)(\[([0-9]*)\])?`) // typeRegex parses the abi sub types typeRegex = regexp.MustCompile("([a-zA-Z]+)(([0-9]+)(x([0-9]+))?)?") ) // NewType creates a new reflection type of abi type given in t. func NewType(t string) (typ Type, err error) { - res := fullTypeRegex.FindAllStringSubmatch(t, -1)[0] - // check if type is slice and parse type. - switch { - case res[3] != "": - // err is ignored. Already checked for number through the regexp - typ.SliceSize, _ = strconv.Atoi(res[3]) - typ.IsArray = true - case res[2] != "": - typ.IsSlice, typ.SliceSize = true, -1 - case res[0] == "": - return Type{}, fmt.Errorf("abi: type parse error: %s", t) + // check that array brackets are equal if they exist + if strings.Count(t, "[") != strings.Count(t, "]") { + return Type{}, fmt.Errorf("invalid arg type in abi") } - if typ.IsArray || typ.IsSlice { - sliceType, err := NewType(res[1]) + + typ.stringKind = t + + // if there are brackets, get ready to go into slice/array mode and + // recursively create the type + if strings.Count(t, "[") != 0 { + i := strings.LastIndex(t, "[") + // recursively embed the type + embeddedType, err := NewType(t[:i]) if err != nil { return Type{}, err } - typ.Elem = &sliceType - typ.stringKind = sliceType.stringKind + t[len(res[1]):] - // Although we know that this is an array, we cannot return - // as we don't know the type of the element, however, if it - // is still an array, then don't determine the type. - if typ.Elem.IsArray || typ.Elem.IsSlice { - return typ, nil - } - } + // grab the last cell and create a type from there + sliced := t[i:] + // grab the slice size with regexp + re := regexp.MustCompile("[0-9]+") + intz := re.FindAllString(sliced, -1) - // parse the type and size of the abi-type. - parsedType := typeRegex.FindAllStringSubmatch(res[1], -1)[0] - // varSize is the size of the variable - var varSize int - if len(parsedType[3]) > 0 { - var err error - varSize, err = strconv.Atoi(parsedType[2]) - if err != nil { - return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) - } - } - // varType is the parsed abi type - varType := parsedType[1] - // substitute canonical integer - if varSize == 0 && (varType == "int" || varType == "uint") { - varSize = 256 - t += "256" - } - - // only set stringKind if not array or slice, as for those, - // the correct string type has been set - if !(typ.IsArray || typ.IsSlice) { - typ.stringKind = t - } - - switch varType { - case "int": - typ.Kind, typ.Type = reflectIntKindAndType(false, varSize) - typ.Size = varSize - typ.T = IntTy - case "uint": - typ.Kind, typ.Type = reflectIntKindAndType(true, varSize) - typ.Size = varSize - typ.T = UintTy - case "bool": - typ.Kind = reflect.Bool - typ.T = BoolTy - case "address": - typ.Kind = reflect.Array - typ.Type = address_t - typ.Size = 20 - typ.T = AddressTy - case "string": - typ.Kind = reflect.String - typ.Size = -1 - typ.T = StringTy - case "bytes": - sliceType, _ := NewType("uint8") - typ.Elem = &sliceType - if varSize == 0 { - typ.IsSlice = true - typ.T = BytesTy - typ.SliceSize = -1 + if len(intz) == 0 { + // is a slice + typ.T = SliceTy + typ.Kind = reflect.Slice + typ.Elem = &embeddedType + typ.Type = reflect.SliceOf(embeddedType.Type) + } else if len(intz) == 1 { + // is a array + typ.T = ArrayTy + typ.Kind = reflect.Array + typ.Elem = &embeddedType + typ.Size, err = strconv.Atoi(intz[0]) + if err != nil { + return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) + } + typ.Type = reflect.ArrayOf(typ.Size, embeddedType.Type) } else { - typ.IsArray = true - typ.T = FixedBytesTy - typ.SliceSize = varSize + return Type{}, fmt.Errorf("invalid formatting of array type") + } + return typ, err + } else { + // parse the type and size of the abi-type. + parsedType := typeRegex.FindAllStringSubmatch(t, -1)[0] + // varSize is the size of the variable + var varSize int + if len(parsedType[3]) > 0 { + var err error + varSize, err = strconv.Atoi(parsedType[2]) + if err != nil { + return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) + } + } else { + if parsedType[0] == "uint" || parsedType[0] == "int" { + // this should fail because it means that there's something wrong with + // the abi type (the compiler should always format it to the size...always) + return Type{}, fmt.Errorf("unsupported arg type: %s", t) + } + } + // varType is the parsed abi type + varType := parsedType[1] + + switch varType { + case "int": + typ.Kind, typ.Type = reflectIntKindAndType(false, varSize) + typ.Size = varSize + typ.T = IntTy + case "uint": + typ.Kind, typ.Type = reflectIntKindAndType(true, varSize) + typ.Size = varSize + typ.T = UintTy + case "bool": + typ.Kind = reflect.Bool + typ.T = BoolTy + typ.Type = reflect.TypeOf(bool(false)) + case "address": + typ.Kind = reflect.Array + typ.Type = address_t + typ.Size = 20 + typ.T = AddressTy + case "string": + typ.Kind = reflect.String + typ.Type = reflect.TypeOf("") + typ.T = StringTy + case "bytes": + if varSize == 0 { + typ.T = BytesTy + typ.Kind = reflect.Slice + typ.Type = reflect.SliceOf(reflect.TypeOf(byte(0))) + } else { + typ.T = FixedBytesTy + typ.Kind = reflect.Array + typ.Size = varSize + typ.Type = reflect.ArrayOf(varSize, reflect.TypeOf(byte(0))) + } + case "function": + typ.Kind = reflect.Array + typ.T = FunctionTy + typ.Size = 24 + typ.Type = reflect.ArrayOf(24, reflect.TypeOf(byte(0))) + default: + return Type{}, fmt.Errorf("unsupported arg type: %s", t) } - case "function": - sliceType, _ := NewType("uint8") - typ.Elem = &sliceType - typ.IsArray = true - typ.T = FunctionTy - typ.SliceSize = 24 - default: - return Type{}, fmt.Errorf("unsupported arg type: %s", t) } return @@ -183,7 +180,7 @@ func (t Type) pack(v reflect.Value) ([]byte, error) { return nil, err } - if (t.IsSlice || t.IsArray) && t.T != BytesTy && t.T != FixedBytesTy && t.T != FunctionTy { + if t.T == SliceTy || t.T == ArrayTy { var packed []byte for i := 0; i < v.Len(); i++ { @@ -193,18 +190,17 @@ func (t Type) pack(v reflect.Value) ([]byte, error) { } packed = append(packed, val...) } - if t.IsSlice { + if t.T == SliceTy { return packBytesSlice(packed, v.Len()), nil - } else if t.IsArray { + } else if t.T == ArrayTy { return packed, nil } } - return packElement(t, v), nil } // requireLengthPrefix returns whether the type requires any sort of length // prefixing. func (t Type) requiresLengthPrefix() bool { - return t.T != FixedBytesTy && (t.T == StringTy || t.T == BytesTy || t.IsSlice) + return t.T == StringTy || t.T == BytesTy || t.T == SliceTy } diff --git a/accounts/abi/type_test.go b/accounts/abi/type_test.go index 984a5bb4c1..e55af12939 100644 --- a/accounts/abi/type_test.go +++ b/accounts/abi/type_test.go @@ -21,6 +21,7 @@ import ( "reflect" "testing" + "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/common" ) @@ -34,51 +35,58 @@ func TestTypeRegexp(t *testing.T) { blob string kind Type }{ - {"bool", Type{Kind: reflect.Bool, T: BoolTy, stringKind: "bool"}}, - {"bool[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Bool, T: BoolTy, Elem: &Type{Kind: reflect.Bool, T: BoolTy, stringKind: "bool"}, stringKind: "bool[]"}}, - {"bool[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Bool, T: BoolTy, Elem: &Type{Kind: reflect.Bool, T: BoolTy, stringKind: "bool"}, stringKind: "bool[2]"}}, + {"bool", Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}}, + {"bool[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool(nil)), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}}, + {"bool[2]", Type{Size: 2, Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}}, + {"bool[2][]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][]"}}, + {"bool[][]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][]"}}, + {"bool[][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][2]"}}, + {"bool[2][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][2]"}}, + {"bool[2][][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][][2]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][]"}, stringKind: "bool[2][][2]"}}, + {"bool[2][2][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][2]"}, stringKind: "bool[2][2][2]"}}, + {"bool[][][]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][]"}, stringKind: "bool[][][]"}}, + {"bool[][2][]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][2][]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][2]"}, stringKind: "bool[][2][]"}}, {"int8", Type{Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, stringKind: "int8"}}, {"int16", Type{Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, stringKind: "int16"}}, {"int32", Type{Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, stringKind: "int32"}}, {"int64", Type{Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, stringKind: "int64"}}, {"int256", Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, stringKind: "int256"}}, - {"int8[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, Elem: &Type{Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[]"}}, - {"int8[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, Elem: &Type{Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[2]"}}, - {"int16[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, Elem: &Type{Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[]"}}, - {"int16[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, Elem: &Type{Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[2]"}}, - {"int32[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, Elem: &Type{Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[]"}}, - {"int32[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, Elem: &Type{Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[2]"}}, - {"int64[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, Elem: &Type{Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[]"}}, - {"int64[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, Elem: &Type{Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[2]"}}, - {"int256[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[]"}}, - {"int256[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[2]"}}, + {"int8[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int8{}), Elem: &Type{Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[]"}}, + {"int8[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int8{}), Elem: &Type{Kind: reflect.Int8, Type: int8_t, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[2]"}}, + {"int16[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int16{}), Elem: &Type{Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[]"}}, + {"int16[2]", Type{Size: 2, Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]int16{}), Elem: &Type{Kind: reflect.Int16, Type: int16_t, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[2]"}}, + {"int32[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int32{}), Elem: &Type{Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[]"}}, + {"int32[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int32{}), Elem: &Type{Kind: reflect.Int32, Type: int32_t, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[2]"}}, + {"int64[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int64{}), Elem: &Type{Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[]"}}, + {"int64[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int64{}), Elem: &Type{Kind: reflect.Int64, Type: int64_t, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[2]"}}, + {"int256[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[]"}}, + {"int256[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[2]"}}, {"uint8", Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}}, {"uint16", Type{Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, stringKind: "uint16"}}, {"uint32", Type{Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, stringKind: "uint32"}}, {"uint64", Type{Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, stringKind: "uint64"}}, {"uint256", Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, stringKind: "uint256"}}, - {"uint8[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[]"}}, - {"uint8[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[2]"}}, - {"uint16[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, Elem: &Type{Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[]"}}, - {"uint16[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, Elem: &Type{Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[2]"}}, - {"uint32[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, Elem: &Type{Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[]"}}, - {"uint32[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, Elem: &Type{Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[2]"}}, - {"uint64[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, Elem: &Type{Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[]"}}, - {"uint64[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, Elem: &Type{Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[2]"}}, - {"uint256[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[]"}}, - {"uint256[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[2]"}}, - {"bytes32", Type{IsArray: true, SliceSize: 32, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, T: FixedBytesTy, stringKind: "bytes32"}}, - {"bytes[]", Type{IsSlice: true, SliceSize: -1, Elem: &Type{IsSlice: true, SliceSize: -1, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, T: BytesTy, stringKind: "bytes"}, stringKind: "bytes[]"}}, - {"bytes[2]", Type{IsArray: true, SliceSize: 2, Elem: &Type{IsSlice: true, SliceSize: -1, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, T: BytesTy, stringKind: "bytes"}, stringKind: "bytes[2]"}}, - {"bytes32[]", Type{IsSlice: true, SliceSize: -1, Elem: &Type{IsArray: true, SliceSize: 32, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, T: FixedBytesTy, stringKind: "bytes32"}, stringKind: "bytes32[]"}}, - {"bytes32[2]", Type{IsArray: true, SliceSize: 2, Elem: &Type{IsArray: true, SliceSize: 32, Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, T: FixedBytesTy, stringKind: "bytes32"}, stringKind: "bytes32[2]"}}, - {"string", Type{Kind: reflect.String, Size: -1, T: StringTy, stringKind: "string"}}, - {"string[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.String, T: StringTy, Size: -1, Elem: &Type{Kind: reflect.String, T: StringTy, Size: -1, stringKind: "string"}, stringKind: "string[]"}}, - {"string[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.String, T: StringTy, Size: -1, Elem: &Type{Kind: reflect.String, T: StringTy, Size: -1, stringKind: "string"}, stringKind: "string[2]"}}, + {"uint8[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]uint8{}), Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[]"}}, + {"uint8[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint8{}), Elem: &Type{Kind: reflect.Uint8, Type: uint8_t, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[2]"}}, + {"uint16[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint16{}), Elem: &Type{Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[]"}}, + {"uint16[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint16{}), Elem: &Type{Kind: reflect.Uint16, Type: uint16_t, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[2]"}}, + {"uint32[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint32{}), Elem: &Type{Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[]"}}, + {"uint32[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint32{}), Elem: &Type{Kind: reflect.Uint32, Type: uint32_t, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[2]"}}, + {"uint64[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint64{}), Elem: &Type{Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[]"}}, + {"uint64[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint64{}), Elem: &Type{Kind: reflect.Uint64, Type: uint64_t, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[2]"}}, + {"uint256[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[]"}}, + {"uint256[2]", Type{Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]*big.Int{}), Size: 2, Elem: &Type{Kind: reflect.Ptr, Type: big_t, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[2]"}}, + {"bytes32", Type{Kind: reflect.Array, T: FixedBytesTy, Size: 32, Type: reflect.TypeOf([32]byte{}), stringKind: "bytes32"}}, + {"bytes[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][]byte{}), Elem: &Type{Kind: reflect.Slice, Type: reflect.TypeOf([]byte{}), T: BytesTy, stringKind: "bytes"}, stringKind: "bytes[]"}}, + {"bytes[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]byte{}), Elem: &Type{T: BytesTy, Type: reflect.TypeOf([]byte{}), Kind: reflect.Slice, stringKind: "bytes"}, stringKind: "bytes[2]"}}, + {"bytes32[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][32]byte{}), Elem: &Type{Kind: reflect.Array, Type: reflect.TypeOf([32]byte{}), T: FixedBytesTy, Size: 32, stringKind: "bytes32"}, stringKind: "bytes32[]"}}, + {"bytes32[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][32]byte{}), Elem: &Type{Kind: reflect.Array, T: FixedBytesTy, Size: 32, Type: reflect.TypeOf([32]byte{}), stringKind: "bytes32"}, stringKind: "bytes32[2]"}}, + {"string", Type{Kind: reflect.String, T: StringTy, Type: reflect.TypeOf(""), stringKind: "string"}}, + {"string[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]string{}), Elem: &Type{Kind: reflect.String, Type: reflect.TypeOf(""), T: StringTy, stringKind: "string"}, stringKind: "string[]"}}, + {"string[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]string{}), Elem: &Type{Kind: reflect.String, T: StringTy, Type: reflect.TypeOf(""), stringKind: "string"}, stringKind: "string[2]"}}, {"address", Type{Kind: reflect.Array, Type: address_t, Size: 20, T: AddressTy, stringKind: "address"}}, - {"address[]", Type{IsSlice: true, SliceSize: -1, Kind: reflect.Array, Type: address_t, T: AddressTy, Size: 20, Elem: &Type{Kind: reflect.Array, Type: address_t, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[]"}}, - {"address[2]", Type{IsArray: true, SliceSize: 2, Kind: reflect.Array, Type: address_t, T: AddressTy, Size: 20, Elem: &Type{Kind: reflect.Array, Type: address_t, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[2]"}}, - + {"address[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]common.Address{}), Elem: &Type{Kind: reflect.Array, Type: address_t, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[]"}}, + {"address[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]common.Address{}), Elem: &Type{Kind: reflect.Array, Type: address_t, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[2]"}}, // TODO when fixed types are implemented properly // {"fixed", Type{}}, // {"fixed128x128", Type{}}, @@ -87,13 +95,14 @@ func TestTypeRegexp(t *testing.T) { // {"fixed128x128[]", Type{}}, // {"fixed128x128[2]", Type{}}, } - for i, tt := range tests { + + for _, tt := range tests { typ, err := NewType(tt.blob) if err != nil { - t.Errorf("type %d: failed to parse type string: %v", i, err) + t.Errorf("type %q: failed to parse type string: %v", tt.blob, err) } if !reflect.DeepEqual(typ, tt.kind) { - t.Errorf("type %d: parsed type mismatch:\n have %+v\n want %+v", i, typeWithoutStringer(typ), typeWithoutStringer(tt.kind)) + t.Errorf("type %q: parsed type mismatch:\nGOT %s\nWANT %s ", tt.blob, spew.Sdump(typeWithoutStringer(typ)), spew.Sdump(typeWithoutStringer(tt.kind))) } } } @@ -104,15 +113,90 @@ func TestTypeCheck(t *testing.T) { input interface{} err string }{ - {"uint", big.NewInt(1), ""}, - {"int", big.NewInt(1), ""}, - {"uint30", big.NewInt(1), ""}, + {"uint", big.NewInt(1), "unsupported arg type: uint"}, + {"int", big.NewInt(1), "unsupported arg type: int"}, + {"uint256", big.NewInt(1), ""}, + {"uint256[][3][]", [][3][]*big.Int{{{}}}, ""}, + {"uint256[][][3]", [3][][]*big.Int{{{}}}, ""}, + {"uint256[3][][]", [][][3]*big.Int{{{}}}, ""}, + {"uint256[3][3][3]", [3][3][3]*big.Int{{{}}}, ""}, + {"uint8[][]", [][]uint8{}, ""}, + {"int256", big.NewInt(1), ""}, + {"uint8", uint8(1), ""}, + {"uint16", uint16(1), ""}, + {"uint32", uint32(1), ""}, + {"uint64", uint64(1), ""}, + {"int8", int8(1), ""}, + {"int16", int16(1), ""}, + {"int32", int32(1), ""}, + {"int64", int64(1), ""}, + {"uint24", big.NewInt(1), ""}, + {"uint40", big.NewInt(1), ""}, + {"uint48", big.NewInt(1), ""}, + {"uint56", big.NewInt(1), ""}, + {"uint72", big.NewInt(1), ""}, + {"uint80", big.NewInt(1), ""}, + {"uint88", big.NewInt(1), ""}, + {"uint96", big.NewInt(1), ""}, + {"uint104", big.NewInt(1), ""}, + {"uint112", big.NewInt(1), ""}, + {"uint120", big.NewInt(1), ""}, + {"uint128", big.NewInt(1), ""}, + {"uint136", big.NewInt(1), ""}, + {"uint144", big.NewInt(1), ""}, + {"uint152", big.NewInt(1), ""}, + {"uint160", big.NewInt(1), ""}, + {"uint168", big.NewInt(1), ""}, + {"uint176", big.NewInt(1), ""}, + {"uint184", big.NewInt(1), ""}, + {"uint192", big.NewInt(1), ""}, + {"uint200", big.NewInt(1), ""}, + {"uint208", big.NewInt(1), ""}, + {"uint216", big.NewInt(1), ""}, + {"uint224", big.NewInt(1), ""}, + {"uint232", big.NewInt(1), ""}, + {"uint240", big.NewInt(1), ""}, + {"uint248", big.NewInt(1), ""}, + {"int24", big.NewInt(1), ""}, + {"int40", big.NewInt(1), ""}, + {"int48", big.NewInt(1), ""}, + {"int56", big.NewInt(1), ""}, + {"int72", big.NewInt(1), ""}, + {"int80", big.NewInt(1), ""}, + {"int88", big.NewInt(1), ""}, + {"int96", big.NewInt(1), ""}, + {"int104", big.NewInt(1), ""}, + {"int112", big.NewInt(1), ""}, + {"int120", big.NewInt(1), ""}, + {"int128", big.NewInt(1), ""}, + {"int136", big.NewInt(1), ""}, + {"int144", big.NewInt(1), ""}, + {"int152", big.NewInt(1), ""}, + {"int160", big.NewInt(1), ""}, + {"int168", big.NewInt(1), ""}, + {"int176", big.NewInt(1), ""}, + {"int184", big.NewInt(1), ""}, + {"int192", big.NewInt(1), ""}, + {"int200", big.NewInt(1), ""}, + {"int208", big.NewInt(1), ""}, + {"int216", big.NewInt(1), ""}, + {"int224", big.NewInt(1), ""}, + {"int232", big.NewInt(1), ""}, + {"int240", big.NewInt(1), ""}, + {"int248", big.NewInt(1), ""}, {"uint30", uint8(1), "abi: cannot use uint8 as type ptr as argument"}, + {"uint8", uint16(1), "abi: cannot use uint16 as type uint8 as argument"}, + {"uint8", uint32(1), "abi: cannot use uint32 as type uint8 as argument"}, + {"uint8", uint64(1), "abi: cannot use uint64 as type uint8 as argument"}, + {"uint8", int8(1), "abi: cannot use int8 as type uint8 as argument"}, + {"uint8", int16(1), "abi: cannot use int16 as type uint8 as argument"}, + {"uint8", int32(1), "abi: cannot use int32 as type uint8 as argument"}, + {"uint8", int64(1), "abi: cannot use int64 as type uint8 as argument"}, {"uint16", uint16(1), ""}, {"uint16", uint8(1), "abi: cannot use uint8 as type uint16 as argument"}, {"uint16[]", []uint16{1, 2, 3}, ""}, {"uint16[]", [3]uint16{1, 2, 3}, ""}, - {"uint16[]", []uint32{1, 2, 3}, "abi: cannot use []uint32 as type []uint16 as argument"}, + {"uint16[]", []uint32{1, 2, 3}, "abi: cannot use []uint32 as type [0]uint16 as argument"}, {"uint16[3]", [3]uint32{1, 2, 3}, "abi: cannot use [3]uint32 as type [3]uint16 as argument"}, {"uint16[3]", [4]uint16{1, 2, 3}, "abi: cannot use [4]uint16 as type [3]uint16 as argument"}, {"uint16[3]", []uint16{1, 2, 3}, ""}, @@ -122,20 +206,61 @@ func TestTypeCheck(t *testing.T) { {"address[1]", [1]common.Address{{1}}, ""}, {"address[2]", [1]common.Address{{1}}, "abi: cannot use [1]array as type [2]array as argument"}, {"bytes32", [32]byte{}, ""}, + {"bytes31", [31]byte{}, ""}, + {"bytes30", [30]byte{}, ""}, + {"bytes29", [29]byte{}, ""}, + {"bytes28", [28]byte{}, ""}, + {"bytes27", [27]byte{}, ""}, + {"bytes26", [26]byte{}, ""}, + {"bytes25", [25]byte{}, ""}, + {"bytes24", [24]byte{}, ""}, + {"bytes23", [23]byte{}, ""}, + {"bytes22", [22]byte{}, ""}, + {"bytes21", [21]byte{}, ""}, + {"bytes20", [20]byte{}, ""}, + {"bytes19", [19]byte{}, ""}, + {"bytes18", [18]byte{}, ""}, + {"bytes17", [17]byte{}, ""}, + {"bytes16", [16]byte{}, ""}, + {"bytes15", [15]byte{}, ""}, + {"bytes14", [14]byte{}, ""}, + {"bytes13", [13]byte{}, ""}, + {"bytes12", [12]byte{}, ""}, + {"bytes11", [11]byte{}, ""}, + {"bytes10", [10]byte{}, ""}, + {"bytes9", [9]byte{}, ""}, + {"bytes8", [8]byte{}, ""}, + {"bytes7", [7]byte{}, ""}, + {"bytes6", [6]byte{}, ""}, + {"bytes5", [5]byte{}, ""}, + {"bytes4", [4]byte{}, ""}, + {"bytes3", [3]byte{}, ""}, + {"bytes2", [2]byte{}, ""}, + {"bytes1", [1]byte{}, ""}, {"bytes32", [33]byte{}, "abi: cannot use [33]uint8 as type [32]uint8 as argument"}, {"bytes32", common.Hash{1}, ""}, - {"bytes31", [31]byte{}, ""}, + {"bytes31", common.Hash{1}, "abi: cannot use common.Hash as type [31]uint8 as argument"}, {"bytes31", [32]byte{}, "abi: cannot use [32]uint8 as type [31]uint8 as argument"}, {"bytes", []byte{0, 1}, ""}, - {"bytes", [2]byte{0, 1}, ""}, - {"bytes", common.Hash{1}, ""}, + {"bytes", [2]byte{0, 1}, "abi: cannot use array as type slice as argument"}, + {"bytes", common.Hash{1}, "abi: cannot use array as type slice as argument"}, {"string", "hello world", ""}, + {"string", string(""), ""}, + {"string", []byte{}, "abi: cannot use slice as type string as argument"}, {"bytes32[]", [][32]byte{{}}, ""}, {"function", [24]byte{}, ""}, + {"bytes20", common.Address{}, ""}, + {"address", [20]byte{}, ""}, + {"address", common.Address{}, ""}, } { typ, err := NewType(test.typ) - if err != nil { + if err != nil && len(test.err) == 0 { t.Fatal("unexpected parse error:", err) + } else if err != nil && len(test.err) != 0 { + if err.Error() != test.err { + t.Errorf("%d failed. Expected err: '%v' got err: '%v'", i, test.err, err) + } + continue } err = typeCheck(typ, reflect.ValueOf(test.input)) diff --git a/accounts/abi/unpack.go b/accounts/abi/unpack.go index fc41c88ac7..ffa14ccd3b 100644 --- a/accounts/abi/unpack.go +++ b/accounts/abi/unpack.go @@ -25,118 +25,16 @@ import ( "github.com/ethereum/go-ethereum/common" ) -// toGoSliceType parses the input and casts it to the proper slice defined by the ABI -// argument in T. -func toGoSlice(i int, t Argument, output []byte) (interface{}, error) { - index := i * 32 - // The slice must, at very least be large enough for the index+32 which is exactly the size required - // for the [offset in output, size of offset]. - if index+32 > len(output) { - return nil, fmt.Errorf("abi: cannot marshal in to go slice: insufficient size output %d require %d", len(output), index+32) - } - elem := t.Type.Elem - - // first we need to create a slice of the type - var refSlice reflect.Value - switch elem.T { - case IntTy, UintTy, BoolTy: - // create a new reference slice matching the element type - switch t.Type.Kind { - case reflect.Bool: - refSlice = reflect.ValueOf([]bool(nil)) - case reflect.Uint8: - refSlice = reflect.ValueOf([]uint8(nil)) - case reflect.Uint16: - refSlice = reflect.ValueOf([]uint16(nil)) - case reflect.Uint32: - refSlice = reflect.ValueOf([]uint32(nil)) - case reflect.Uint64: - refSlice = reflect.ValueOf([]uint64(nil)) - case reflect.Int8: - refSlice = reflect.ValueOf([]int8(nil)) - case reflect.Int16: - refSlice = reflect.ValueOf([]int16(nil)) - case reflect.Int32: - refSlice = reflect.ValueOf([]int32(nil)) - case reflect.Int64: - refSlice = reflect.ValueOf([]int64(nil)) - default: - refSlice = reflect.ValueOf([]*big.Int(nil)) - } - case AddressTy: // address must be of slice Address - refSlice = reflect.ValueOf([]common.Address(nil)) - case HashTy: // hash must be of slice hash - refSlice = reflect.ValueOf([]common.Hash(nil)) - case FixedBytesTy: - refSlice = reflect.ValueOf([][]byte(nil)) - default: // no other types are supported - return nil, fmt.Errorf("abi: unsupported slice type %v", elem.T) - } - - var slice []byte - var size int - var offset int - if t.Type.IsSlice { - // get the offset which determines the start of this array ... - offset = int(binary.BigEndian.Uint64(output[index+24 : index+32])) - if offset+32 > len(output) { - return nil, fmt.Errorf("abi: cannot marshal in to go slice: offset %d would go over slice boundary (len=%d)", len(output), offset+32) - } - - slice = output[offset:] - // ... starting with the size of the array in elements ... - size = int(binary.BigEndian.Uint64(slice[24:32])) - slice = slice[32:] - // ... and make sure that we've at the very least the amount of bytes - // available in the buffer. - if size*32 > len(slice) { - return nil, fmt.Errorf("abi: cannot marshal in to go slice: insufficient size output %d require %d", len(output), offset+32+size*32) - } - - // reslice to match the required size - slice = slice[:size*32] - } else if t.Type.IsArray { - //get the number of elements in the array - size = t.Type.SliceSize - - //check to make sure array size matches up - if index+32*size > len(output) { - return nil, fmt.Errorf("abi: cannot marshal in to go array: offset %d would go over slice boundary (len=%d)", len(output), index+32*size) - } - //slice is there for a fixed amount of times - slice = output[index : index+size*32] - } - - for i := 0; i < size; i++ { - var ( - inter interface{} // interface type - returnOutput = slice[i*32 : i*32+32] // the return output - err error - ) - // set inter to the correct type (cast) - switch elem.T { - case IntTy, UintTy: - inter = readInteger(t.Type.Kind, returnOutput) - case BoolTy: - inter, err = readBool(returnOutput) - if err != nil { - return nil, err - } - case AddressTy: - inter = common.BytesToAddress(returnOutput) - case HashTy: - inter = common.BytesToHash(returnOutput) - case FixedBytesTy: - inter = returnOutput - } - // append the item to our reflect slice - refSlice = reflect.Append(refSlice, reflect.ValueOf(inter)) - } - - // return the interface - return refSlice.Interface(), nil +// unpacker is a utility interface that enables us to have +// abstraction between events and methods and also to properly +// "unpack" them; e.g. events use Inputs, methods use Outputs. +type unpacker interface { + tupleUnpack(v interface{}, output []byte) error + singleUnpack(v interface{}, output []byte) error + isTupleReturn() bool } +// reads the integer based on its kind func readInteger(kind reflect.Kind, b []byte) interface{} { switch kind { case reflect.Uint8: @@ -160,13 +58,10 @@ func readInteger(kind reflect.Kind, b []byte) interface{} { } } +// reads a bool func readBool(word []byte) (bool, error) { - if len(word) != 32 { - return false, fmt.Errorf("abi: fatal error: incorrect word length") - } - - for i, b := range word { - if b != 0 && i != 31 { + for _, b := range word[:31] { + if b != 0 { return false, errBadBool } } @@ -178,58 +73,144 @@ func readBool(word []byte) (bool, error) { default: return false, errBadBool } +} + +// A function type is simply the address with the function selection signature at the end. +// This enforces that standard by always presenting it as a 24-array (address + sig = 24 bytes) +func readFunctionType(t Type, word []byte) (funcTy [24]byte, err error) { + if t.T != FunctionTy { + return [24]byte{}, fmt.Errorf("abi: invalid type in call to make function type byte array.") + } + if garbage := binary.BigEndian.Uint64(word[24:32]); garbage != 0 { + err = fmt.Errorf("abi: got improperly encoded function type, got %v", word) + } else { + copy(funcTy[:], word[0:24]) + } + return +} + +// through reflection, creates a fixed array to be read from +func readFixedBytes(t Type, word []byte) (interface{}, error) { + if t.T != FixedBytesTy { + return nil, fmt.Errorf("abi: invalid type in call to make fixed byte array.") + } + // convert + array := reflect.New(t.Type).Elem() + + reflect.Copy(array, reflect.ValueOf(word[0:t.Size])) + return array.Interface(), nil } -// toGoType parses the input and casts it to the proper type defined by the ABI -// argument in T. -func toGoType(i int, t Argument, output []byte) (interface{}, error) { - // we need to treat slices differently - if (t.Type.IsSlice || t.Type.IsArray) && t.Type.T != BytesTy && t.Type.T != StringTy && t.Type.T != FixedBytesTy && t.Type.T != FunctionTy { - return toGoSlice(i, t, output) +// iteratively unpack elements +func forEachUnpack(t Type, output []byte, start, size int) (interface{}, error) { + if start+32*size > len(output) { + return nil, fmt.Errorf("abi: cannot marshal in to go array: offset %d would go over slice boundary (len=%d)", len(output), start+32*size) } - index := i * 32 + // this value will become our slice or our array, depending on the type + var refSlice reflect.Value + slice := output[start : start+size*32] + + if t.T == SliceTy { + // declare our slice + refSlice = reflect.MakeSlice(t.Type, size, size) + } else if t.T == ArrayTy { + // declare our array + refSlice = reflect.New(t.Type).Elem() + } else { + return nil, fmt.Errorf("abi: invalid type in array/slice unpacking stage") + } + + for i, j := start, 0; j*32 < len(slice); i, j = i+32, j+1 { + // this corrects the arrangement so that we get all the underlying array values + if t.Elem.T == ArrayTy && j != 0 { + i = start + t.Elem.Size*32*j + } + inter, err := toGoType(i, *t.Elem, output) + if err != nil { + return nil, err + } + // append the item to our reflect slice + refSlice.Index(j).Set(reflect.ValueOf(inter)) + } + + // return the interface + return refSlice.Interface(), nil +} + +// toGoType parses the output bytes and recursively assigns the value of these bytes +// into a go type with accordance with the ABI spec. +func toGoType(index int, t Type, output []byte) (interface{}, error) { if index+32 > len(output) { return nil, fmt.Errorf("abi: cannot marshal in to go type: length insufficient %d require %d", len(output), index+32) } - // Parse the given index output and check whether we need to read - // a different offset and length based on the type (i.e. string, bytes) - var returnOutput []byte - switch t.Type.T { - case StringTy, BytesTy: // variable arrays are written at the end of the return bytes - // parse offset from which we should start reading - offset := int(binary.BigEndian.Uint64(output[index+24 : index+32])) - if offset+32 > len(output) { - return nil, fmt.Errorf("abi: cannot marshal in to go type: length insufficient %d require %d", len(output), offset+32) - } - // parse the size up until we should be reading - size := int(binary.BigEndian.Uint64(output[offset+24 : offset+32])) - if offset+32+size > len(output) { - return nil, fmt.Errorf("abi: cannot marshal in to go type: length insufficient %d require %d", len(output), offset+32+size) - } + var ( + returnOutput []byte + begin, end int + err error + ) - // get the bytes for this return value - returnOutput = output[offset+32 : offset+32+size] - default: + // if we require a length prefix, find the beginning word and size returned. + if t.requiresLengthPrefix() { + begin, end, err = lengthPrefixPointsTo(index, output) + if err != nil { + return nil, err + } + } else { returnOutput = output[index : index+32] } - // convert the bytes to whatever is specified by the ABI. - switch t.Type.T { + switch t.T { + case SliceTy: + return forEachUnpack(t, output, begin, end) + case ArrayTy: + return forEachUnpack(t, output, index, t.Size) + case StringTy: // variable arrays are written at the end of the return bytes + return string(output[begin : begin+end]), nil case IntTy, UintTy: - return readInteger(t.Type.Kind, returnOutput), nil + return readInteger(t.Kind, returnOutput), nil case BoolTy: return readBool(returnOutput) case AddressTy: return common.BytesToAddress(returnOutput), nil case HashTy: return common.BytesToHash(returnOutput), nil - case BytesTy, FixedBytesTy, FunctionTy: - return returnOutput, nil - case StringTy: - return string(returnOutput), nil + case BytesTy: + return output[begin : begin+end], nil + case FixedBytesTy: + return readFixedBytes(t, returnOutput) + case FunctionTy: + return readFunctionType(t, returnOutput) + default: + return nil, fmt.Errorf("abi: unknown type %v", t.T) + } +} + +// interprets a 32 byte slice as an offset and then determines which indice to look to decode the type. +func lengthPrefixPointsTo(index int, output []byte) (start int, length int, err error) { + offset := int(binary.BigEndian.Uint64(output[index+24 : index+32])) + if offset+32 > len(output) { + return 0, 0, fmt.Errorf("abi: cannot marshal in to go slice: offset %d would go over slice boundary (len=%d)", len(output), offset+32) + } + length = int(binary.BigEndian.Uint64(output[offset+24 : offset+32])) + if offset+32+length > len(output) { + return 0, 0, fmt.Errorf("abi: cannot marshal in to go type: length insufficient %d require %d", len(output), offset+32+length) + } + start = offset + 32 + + //fmt.Printf("LENGTH PREFIX INFO: \nsize: %v\noffset: %v\nstart: %v\n", length, offset, start) + return +} + +// checks for proper formatting of byte output +func bytesAreProper(output []byte) error { + if len(output) == 0 { + return fmt.Errorf("abi: unmarshalling empty output") + } else if len(output)%32 != 0 { + return fmt.Errorf("abi: improperly formatted output") + } else { + return nil } - return nil, fmt.Errorf("abi: unknown type %v", t.Type.T) } diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go index 8e3afee4e6..9c7c339f3f 100644 --- a/accounts/abi/unpack_test.go +++ b/accounts/abi/unpack_test.go @@ -18,6 +18,7 @@ package abi import ( "bytes" + "encoding/hex" "fmt" "math/big" "reflect" @@ -27,260 +28,258 @@ import ( "github.com/ethereum/go-ethereum/common" ) -func TestSimpleMethodUnpack(t *testing.T) { - for i, test := range []struct { - def string // definition of the **output** ABI params - marshalledOutput []byte // evm return data - expectedOut interface{} // the expected output - outVar string // the output variable (e.g. uint32, *big.Int, etc) - err string // empty or error if expected - }{ - { - `[ { "type": "bool" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - bool(true), - "bool", - "", - }, - { - `[ { "type": "uint32" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - uint32(1), - "uint32", - "", - }, - { - `[ { "type": "uint32" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - nil, - "uint16", - "abi: cannot unmarshal uint32 in to uint16", - }, - { - `[ { "type": "uint17" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - nil, - "uint16", - "abi: cannot unmarshal *big.Int in to uint16", - }, - { - `[ { "type": "uint17" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - big.NewInt(1), - "*big.Int", - "", - }, +type unpackTest struct { + def string // ABI definition JSON + enc string // evm return data + want interface{} // the expected output + err string // empty or error if expected +} - { - `[ { "type": "int32" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - int32(1), - "int32", - "", - }, - { - `[ { "type": "int32" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - nil, - "int16", - "abi: cannot unmarshal int32 in to int16", - }, - { - `[ { "type": "int17" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - nil, - "int16", - "abi: cannot unmarshal *big.Int in to int16", - }, - { - `[ { "type": "int17" } ]`, - common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), - big.NewInt(1), - "*big.Int", - "", - }, +func (test unpackTest) checkError(err error) error { + if err != nil { + if len(test.err) == 0 { + return fmt.Errorf("expected no err but got: %v", err) + } else if err.Error() != test.err { + return fmt.Errorf("expected err: '%v' got err: %q", test.err, err) + } + } else if len(test.err) > 0 { + return fmt.Errorf("expected err: %v but got none", test.err) + } + return nil +} - { - `[ { "type": "address" } ]`, - common.Hex2Bytes("0000000000000000000000000100000000000000000000000000000000000000"), - common.Address{1}, - "address", - "", - }, - { - `[ { "type": "bytes32" } ]`, - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - "bytes", - "", - }, - { - `[ { "type": "bytes32" } ]`, - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - "hash", - "", - }, - { - `[ { "type": "bytes32" } ]`, - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - "interface", - "", - }, - { - `[ { "type": "function" } ]`, - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - [24]byte{1}, - "function", - "", - }, - } { - abiDefinition := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def) - abi, err := JSON(strings.NewReader(abiDefinition)) +var unpackTests = []unpackTest{ + { + def: `[{ "type": "bool" }]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: true, + }, + { + def: `[{"type": "uint32"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: uint32(1), + }, + { + def: `[{"type": "uint32"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: uint16(0), + err: "abi: cannot unmarshal uint32 in to uint16", + }, + { + def: `[{"type": "uint17"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: uint16(0), + err: "abi: cannot unmarshal *big.Int in to uint16", + }, + { + def: `[{"type": "uint17"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: big.NewInt(1), + }, + { + def: `[{"type": "int32"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: int32(1), + }, + { + def: `[{"type": "int32"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: int16(0), + err: "abi: cannot unmarshal int32 in to int16", + }, + { + def: `[{"type": "int17"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: int16(0), + err: "abi: cannot unmarshal *big.Int in to int16", + }, + { + def: `[{"type": "int17"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001", + want: big.NewInt(1), + }, + { + def: `[{"type": "address"}]`, + enc: "0000000000000000000000000100000000000000000000000000000000000000", + want: common.Address{1}, + }, + { + def: `[{"type": "bytes32"}]`, + enc: "0100000000000000000000000000000000000000000000000000000000000000", + want: [32]byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, + { + def: `[{"type": "bytes"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000", + want: common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), + }, + { + def: `[{"type": "bytes"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000", + want: [32]byte{}, + err: "abi: cannot unmarshal []uint8 in to [32]uint8", + }, + { + def: `[{"type": "bytes32"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000", + want: []byte(nil), + err: "abi: cannot unmarshal [32]uint8 in to []uint8", + }, + { + def: `[{"type": "bytes32"}]`, + enc: "0100000000000000000000000000000000000000000000000000000000000000", + want: common.HexToHash("0100000000000000000000000000000000000000000000000000000000000000"), + }, + { + def: `[{"type": "function"}]`, + enc: "0100000000000000000000000000000000000000000000000000000000000000", + want: [24]byte{1}, + }, + // slices + { + def: `[{"type": "uint8[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []uint8{1, 2}, + }, + { + def: `[{"type": "uint8[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]uint8{1, 2}, + }, + // multi dimensional, if these pass, all types that don't require length prefix should pass + { + def: `[{"type": "uint8[][]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [][]uint8{{1, 2}, {1, 2}}, + }, + { + def: `[{"type": "uint8[2][2]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2][2]uint8{{1, 2}, {1, 2}}, + }, + { + def: `[{"type": "uint8[][2]"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + want: [2][]uint8{{1}, {1}}, + }, + { + def: `[{"type": "uint8[2][]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [][2]uint8{{1, 2}}, + }, + { + def: `[{"type": "uint16[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []uint16{1, 2}, + }, + { + def: `[{"type": "uint16[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]uint16{1, 2}, + }, + { + def: `[{"type": "uint32[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []uint32{1, 2}, + }, + { + def: `[{"type": "uint32[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]uint32{1, 2}, + }, + { + def: `[{"type": "uint64[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []uint64{1, 2}, + }, + { + def: `[{"type": "uint64[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]uint64{1, 2}, + }, + { + def: `[{"type": "uint256[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []*big.Int{big.NewInt(1), big.NewInt(2)}, + }, + { + def: `[{"type": "uint256[3]"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + want: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, + }, + { + def: `[{"type": "int8[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []int8{1, 2}, + }, + { + def: `[{"type": "int8[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]int8{1, 2}, + }, + { + def: `[{"type": "int16[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []int16{1, 2}, + }, + { + def: `[{"type": "int16[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]int16{1, 2}, + }, + { + def: `[{"type": "int32[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []int32{1, 2}, + }, + { + def: `[{"type": "int32[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]int32{1, 2}, + }, + { + def: `[{"type": "int64[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []int64{1, 2}, + }, + { + def: `[{"type": "int64[2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [2]int64{1, 2}, + }, + { + def: `[{"type": "int256[]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: []*big.Int{big.NewInt(1), big.NewInt(2)}, + }, + { + def: `[{"type": "int256[3]"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + want: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, + }, +} + +func TestUnpack(t *testing.T) { + for i, test := range unpackTests { + def := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def) + abi, err := JSON(strings.NewReader(def)) if err != nil { - t.Errorf("%d failed. %v", i, err) + t.Fatalf("invalid ABI definition %s: %v", def, err) + } + encb, err := hex.DecodeString(test.enc) + if err != nil { + t.Fatalf("invalid hex: %s" + test.enc) + } + outptr := reflect.New(reflect.TypeOf(test.want)) + err = abi.Unpack(outptr.Interface(), "method", encb) + if err := test.checkError(err); err != nil { + t.Errorf("test %d (%v) failed: %v", i, test.def, err) continue } - - var outvar interface{} - switch test.outVar { - case "bool": - var v bool - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "uint8": - var v uint8 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "uint16": - var v uint16 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "uint32": - var v uint32 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "uint64": - var v uint64 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "int8": - var v int8 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "int16": - var v int16 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "int32": - var v int32 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "int64": - var v int64 - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "*big.Int": - var v *big.Int - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "address": - var v common.Address - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "bytes": - var v []byte - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "hash": - var v common.Hash - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v.Bytes()[:] - case "function": - var v [24]byte - err = abi.Unpack(&v, "method", test.marshalledOutput) - outvar = v - case "interface": - err = abi.Unpack(&outvar, "method", test.marshalledOutput) - default: - t.Errorf("unsupported type '%v' please add it to the switch statement in this test", test.outVar) - continue + out := outptr.Elem().Interface() + if !reflect.DeepEqual(test.want, out) { + t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.want, out) } - - if err != nil && len(test.err) == 0 { - t.Errorf("%d failed. Expected no err but got: %v", i, err) - continue - } - if err == nil && len(test.err) != 0 { - t.Errorf("%d failed. Expected err: %v but got none", i, test.err) - continue - } - if err != nil && len(test.err) != 0 && err.Error() != test.err { - t.Errorf("%d failed. Expected err: '%v' got err: '%v'", i, test.err, err) - continue - } - - if err == nil { - if !reflect.DeepEqual(test.expectedOut, outvar) { - t.Errorf("%d failed. Output error: expected %v, got %v", i, test.expectedOut, outvar) - } - } - } -} - -func TestUnpackSetInterfaceSlice(t *testing.T) { - var ( - var1 = new(uint8) - var2 = new(uint8) - ) - out := []interface{}{var1, var2} - abi, err := JSON(strings.NewReader(`[{"type":"function", "name":"ints", "outputs":[{"type":"uint8"}, {"type":"uint8"}]}]`)) - if err != nil { - t.Fatal(err) - } - marshalledReturn := append(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")...) - err = abi.Unpack(&out, "ints", marshalledReturn) - if err != nil { - t.Fatal(err) - } - if *var1 != 1 { - t.Error("expected var1 to be 1, got", *var1) - } - if *var2 != 2 { - t.Error("expected var2 to be 2, got", *var2) - } - - out = []interface{}{var1} - err = abi.Unpack(&out, "ints", marshalledReturn) - - expErr := "abi: cannot marshal in to slices of unequal size (require: 2, got: 1)" - if err == nil || err.Error() != expErr { - t.Error("expected err:", expErr, "Got:", err) - } -} - -func TestUnpackSetInterfaceArrayOutput(t *testing.T) { - var ( - var1 = new([1]uint32) - var2 = new([1]uint32) - ) - out := []interface{}{var1, var2} - abi, err := JSON(strings.NewReader(`[{"type":"function", "name":"ints", "outputs":[{"type":"uint32[1]"}, {"type":"uint32[1]"}]}]`)) - if err != nil { - t.Fatal(err) - } - marshalledReturn := append(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")...) - err = abi.Unpack(&out, "ints", marshalledReturn) - if err != nil { - t.Fatal(err) - } - - if *var1 != [1]uint32{1} { - t.Error("expected var1 to be [1], got", *var1) - } - if *var2 != [1]uint32{2} { - t.Error("expected var2 to be [2], got", *var2) } } @@ -337,101 +336,6 @@ func TestMultiReturnWithStruct(t *testing.T) { } } -func TestMultiReturnWithSlice(t *testing.T) { - const definition = `[ - { "name" : "multi", "constant" : false, "outputs": [ { "name": "Int", "type": "uint256" }, { "name": "String", "type": "string" } ] }]` - - abi, err := JSON(strings.NewReader(definition)) - if err != nil { - t.Fatal(err) - } - - // using buff to make the code readable - buff := new(bytes.Buffer) - buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) - buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) - buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005")) - stringOut := "hello" - buff.Write(common.RightPadBytes([]byte(stringOut), 32)) - - var inter []interface{} - err = abi.Unpack(&inter, "multi", buff.Bytes()) - if err != nil { - t.Error(err) - } - - if len(inter) != 2 { - t.Fatal("expected 2 results got", len(inter)) - } - - if num, ok := inter[0].(*big.Int); !ok || num.Cmp(big.NewInt(1)) != 0 { - t.Error("expected index 0 to be 1 got", num) - } - - if str, ok := inter[1].(string); !ok || str != stringOut { - t.Error("expected index 1 to be", stringOut, "got", str) - } -} - -func TestMarshalArrays(t *testing.T) { - const definition = `[ - { "name" : "bytes32", "constant" : false, "outputs": [ { "type": "bytes32" } ] }, - { "name" : "bytes10", "constant" : false, "outputs": [ { "type": "bytes10" } ] } - ]` - - abi, err := JSON(strings.NewReader(definition)) - if err != nil { - t.Fatal(err) - } - - output := common.LeftPadBytes([]byte{1}, 32) - - var bytes10 [10]byte - err = abi.Unpack(&bytes10, "bytes32", output) - if err == nil || err.Error() != "abi: cannot unmarshal src (len=32) in to dst (len=10)" { - t.Error("expected error or bytes32 not be assignable to bytes10:", err) - } - - var bytes32 [32]byte - err = abi.Unpack(&bytes32, "bytes32", output) - if err != nil { - t.Error("didn't expect error:", err) - } - if !bytes.Equal(bytes32[:], output) { - t.Error("expected bytes32[31] to be 1 got", bytes32[31]) - } - - type ( - B10 [10]byte - B32 [32]byte - ) - - var b10 B10 - err = abi.Unpack(&b10, "bytes32", output) - if err == nil || err.Error() != "abi: cannot unmarshal src (len=32) in to dst (len=10)" { - t.Error("expected error or bytes32 not be assignable to bytes10:", err) - } - - var b32 B32 - err = abi.Unpack(&b32, "bytes32", output) - if err != nil { - t.Error("didn't expect error:", err) - } - if !bytes.Equal(b32[:], output) { - t.Error("expected bytes32[31] to be 1 got", bytes32[31]) - } - - output[10] = 1 - var shortAssignLong [32]byte - err = abi.Unpack(&shortAssignLong, "bytes10", output) - if err != nil { - t.Error("didn't expect error:", err) - } - if !bytes.Equal(output, shortAssignLong[:]) { - t.Errorf("expected %x to be %x", shortAssignLong, output) - } -} - func TestUnmarshal(t *testing.T) { const definition = `[ { "name" : "int", "constant" : false, "outputs": [ { "type": "uint256" } ] }, @@ -450,6 +354,29 @@ func TestUnmarshal(t *testing.T) { } buff := new(bytes.Buffer) + // marshall mixed bytes (mixedBytes) + p0, p0Exp := []byte{}, common.Hex2Bytes("01020000000000000000") + p1, p1Exp := [32]byte{}, common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000ddeeff") + mixedBytes := []interface{}{&p0, &p1} + + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000ddeeff")) + buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000a")) + buff.Write(common.Hex2Bytes("0102000000000000000000000000000000000000000000000000000000000000")) + + err = abi.Unpack(&mixedBytes, "mixedBytes", buff.Bytes()) + if err !=nil { + t.Error(err) + } else { + if bytes.Compare(p0, p0Exp) != 0 { + t.Errorf("unexpected value unpacked: want %x, got %x", p0Exp, p0) + } + + if bytes.Compare(p1[:], p1Exp) != 0 { + t.Errorf("unexpected value unpacked: want %x, got %x", p1Exp, p1) + } + } + // marshal int var Int *big.Int err = abi.Unpack(&Int, "int", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) @@ -473,6 +400,7 @@ func TestUnmarshal(t *testing.T) { } // marshal dynamic bytes max length 32 + buff.Reset() buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) bytesOut := common.RightPadBytes([]byte("hello"), 32) @@ -504,11 +432,11 @@ func TestUnmarshal(t *testing.T) { t.Errorf("expected %x got %x", bytesOut, Bytes) } - // marshall dynamic bytes max length 63 + // marshall dynamic bytes max length 64 buff.Reset() buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000003f")) - bytesOut = common.RightPadBytes([]byte("hello"), 63) + bytesOut = common.RightPadBytes([]byte("hello"), 64) buff.Write(bytesOut) err = abi.Unpack(&Bytes, "bytes", buff.Bytes()) @@ -516,8 +444,8 @@ func TestUnmarshal(t *testing.T) { t.Error(err) } - if !bytes.Equal(Bytes, bytesOut) { - t.Errorf("expected %x got %x", bytesOut, Bytes) + if !bytes.Equal(Bytes, bytesOut[:len(bytesOut)-1]) { + t.Errorf("expected %x got %x", bytesOut[:len(bytesOut)-1], Bytes) } // marshal dynamic bytes output empty @@ -569,29 +497,6 @@ func TestUnmarshal(t *testing.T) { t.Error("expected error") } - // marshal mixed bytes - buff.Reset() - buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) - fixed := common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001") - buff.Write(fixed) - buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) - bytesOut = common.RightPadBytes([]byte("hello"), 32) - buff.Write(bytesOut) - - var out []interface{} - err = abi.Unpack(&out, "mixedBytes", buff.Bytes()) - if err != nil { - t.Fatal("didn't expect error:", err) - } - - if !bytes.Equal(bytesOut, out[0].([]byte)) { - t.Errorf("expected %x, got %x", bytesOut, out[0]) - } - - if !bytes.Equal(fixed, out[1].([]byte)) { - t.Errorf("expected %x, got %x", fixed, out[1]) - } - buff.Reset() buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) From e5c19b6f98b788e6b8e7b092507a44b3808c10b8 Mon Sep 17 00:00:00 2001 From: Sumit Sarin Date: Tue, 17 Oct 2017 16:45:42 +0530 Subject: [PATCH 218/272] README: fix typo (#15312) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab741fcc90..a13476517e 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The go-ethereum project comes with several wrappers/executables found in the `cm | **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default) archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | | `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow insolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | +| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | | `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | | `swarm` | swarm daemon and tools. This is the entrypoint for the swarm network. `swarm --help` for command line options and subcommands. See https://swarm-guide.readthedocs.io for swarm documentation. | From 5d2c947060b55089adc64dbe0b3cbbe1644f73ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 17 Oct 2017 14:55:21 +0300 Subject: [PATCH 219/272] cmd/faucet: dynamic funding progress and visual feedback --- cmd/faucet/faucet.go | 2 +- cmd/faucet/faucet.html | 86 +++++++++++++++++++++++++++++++++++++++--- cmd/faucet/website.go | 2 +- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 715f3dec94..72098e68d2 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -186,7 +186,7 @@ func main() { type request struct { Avatar string `json:"avatar"` // Avatar URL to make the UI nicer Account common.Address `json:"account"` // Ethereum address being funded - Time time.Time `json:"time"` // Timestamp when te request was accepted + Time time.Time `json:"time"` // Timestamp when the request was accepted Tx *types.Transaction `json:"tx"` // Transaction funding the account } diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index 75dad0bdfe..5d3b8741ba 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -49,7 +49,7 @@
- +
"; + for (var i=0; i"; + content += " "; + content += " "; + content += " "; + content += ""; } $("#requests").html("" + content + ""); } } server.onclose = function() { setTimeout(reconnect, 3000); }; } + // Start a UI updater to push the progress bars forward until they are done + setInterval(function() { + $('.progress-bar').each(function() { + var progress = Number($(this).attr('aria-valuenow')) + 1; + if (progress < 30) { + $(this).attr('aria-valuenow', progress); + $(this).css('width', (progress * 100 / 30) + '%'); + } else if (progress == 30) { + $(this).css('width', '100%'); + $(this).addClass("progress-bar-danger"); + } + }) + $('.timer').each(function() { + var index = Number($(this).attr('id').substring(5)); + $(this).html(moment.duration(moment(requests[index].time).unix()-moment().unix(), 'seconds').humanize(true)); + }) + }, 1000); + // Establish a websocket connection to the API server reconnect(); {{if .Recaptcha}} diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index f99c69abfd..eeb8e410e4 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3a\xed\x72\xdb\x38\x92\xbf\x9d\xa7\xe8\xe1\xc5\x6b\xa9\x6c\x92\xb2\x9c\x64\x7d\x32\xa9\xa9\x5c\x76\x76\x76\xae\xae\x76\xa7\x66\xb2\x75\xb7\xb5\xbb\x75\x05\x92\x2d\x12\x31\x08\x70\x80\xa6\x64\x8d\x4b\xef\x7e\x05\x80\xa4\x28\xd9\xce\x78\x92\xa9\xdb\xf8\x87\x42\x02\xfd\xdd\x8d\xee\x46\x33\xc9\x57\x7f\xf8\xcb\xbb\xf7\x7f\xfb\xfe\x1b\xa8\xa8\x16\xcb\x17\x89\xfd\x07\x04\x93\x65\x1a\xa0\x0c\x96\x2f\x4e\x92\x0a\x59\xb1\x7c\x71\x72\x92\xd4\x48\x0c\xf2\x8a\x69\x83\x94\x06\x2d\xad\xc2\xeb\x60\xbf\x51\x11\x35\x21\xfe\xd4\xf2\x75\x1a\xfc\x4f\xf8\xd7\xb7\xe1\x3b\x55\x37\x8c\x78\x26\x30\x80\x5c\x49\x42\x49\x69\xf0\xdd\x37\x29\x16\x25\x8e\xf0\x24\xab\x31\x0d\xd6\x1c\x37\x8d\xd2\x34\x02\xdd\xf0\x82\xaa\xb4\xc0\x35\xcf\x31\x74\x2f\x17\xc0\x25\x27\xce\x44\x68\x72\x26\x30\xbd\x0c\x96\x2f\x2c\x1d\xe2\x24\x70\x79\x7f\x1f\xfd\x19\x69\xa3\xf4\xed\x6e\xb7\x80\xb7\x2d\x55\x28\x89\xe7\x8c\xb0\x80\x3f\xb2\x36\x47\x4a\x62\x0f\xe9\x90\x04\x97\xb7\x50\x69\x5c\xa5\x81\x15\xdd\x2c\xe2\x38\x2f\xe4\x07\x13\xe5\x42\xb5\xc5\x4a\x30\x8d\x51\xae\xea\x98\x7d\x60\x77\xb1\xe0\x99\x89\x69\xc3\x89\x50\x87\x99\x52\x64\x48\xb3\x26\xbe\x8a\xae\xa2\xdf\xc7\xb9\x31\xf1\xb0\x16\xd5\x5c\x46\xb9\x31\x01\x68\x14\x69\x60\x68\x2b\xd0\x54\x88\x14\x40\xbc\xfc\x34\xbe\x2b\x25\x29\x64\x1b\x34\xaa\xc6\xf8\x55\xf4\xfb\x68\xe6\x58\x8e\x97\x3f\xce\xd5\xb2\x35\xb9\xe6\x0d\x81\xd1\xf9\xb3\xf9\x7e\xf8\xa9\x45\xbd\x8d\xaf\xa2\xcb\xe8\xb2\x7b\x71\x7c\x3e\x98\x60\x99\xc4\x9e\xe0\xf2\xb3\x68\x87\x52\xd1\x36\x9e\x47\xaf\xa2\xcb\xb8\x61\xf9\x2d\x2b\xb1\xe8\x39\xd9\xad\xa8\x5f\xfc\xcd\xf8\x3e\xe5\xc3\x0f\xc7\x2e\xfc\x2d\x98\xd5\xaa\x46\x49\xd1\x07\x13\xcf\xa3\xcb\xeb\x68\xd6\x2f\x3c\xa4\xef\x18\x58\xa7\x59\x56\x27\xd1\x1a\xb5\x8d\x5c\x11\xe6\x28\x09\x35\xdc\xdb\xd5\x93\x9a\xcb\xb0\x42\x5e\x56\xb4\x80\xcb\xd9\xec\xf4\xe6\xb1\xd5\x75\xe5\x97\x0b\x6e\x1a\xc1\xb6\x0b\x58\x09\xbc\xf3\x4b\x4c\xf0\x52\x86\x9c\xb0\x36\x0b\xf0\x94\xdd\xc6\xce\xf1\x6c\xb4\x2a\x35\x1a\xd3\x31\x6b\x94\xe1\xc4\x95\x5c\xd8\x88\x62\xc4\xd7\xf8\x18\xac\x69\x98\x7c\x80\xc0\x32\xa3\x44\x4b\x78\x24\x48\x26\x54\x7e\xeb\xd7\xdc\x69\x1e\x2b\x91\x2b\xa1\xf4\x02\x36\x15\xef\xd0\xc0\x31\x82\x46\x63\x47\x1e\x1a\x56\x14\x5c\x96\x0b\x78\xd3\x74\xfa\x40\xcd\x74\xc9\xe5\x02\x66\x7b\x94\x24\xee\xcd\x98\xc4\x3e\x71\xbd\x38\x49\x32\x55\x6c\x9d\x0f\x0b\xbe\x86\x5c\x30\x63\xd2\xe0\xc8\xc4\x2e\x21\x1d\x00\xd8\x3c\xc4\xb8\xec\xb7\x0e\xf6\xb4\xda\x04\xe0\x18\xa5\x81\x17\x22\xcc\x14\x91\xaa\x17\x70\x69\xc5\xeb\x50\x8e\xe8\x89\x50\x94\xe1\xe5\xbc\xdf\x3c\x49\xaa\xcb\x9e\x08\xe1\x1d\x85\xce\x3f\x83\x67\x82\x65\xc2\x7b\xdc\x15\x83\x15\x0b\x33\x46\x55\x00\x4c\x73\x16\x56\xbc\x28\x50\xa6\x01\xe9\x16\x6d\x1c\xf1\x25\x8c\xd3\xdf\x13\xd9\xaf\xba\xec\xe5\x8a\x0b\xbe\xee\xd4\x1a\x3d\x1e\x69\xf8\xb4\x12\xd7\xd0\x3d\xa8\xd5\xca\x20\x85\x23\x9d\x46\xc0\x5c\x36\x2d\x85\xa5\x56\x6d\x33\xec\x9f\x24\x6e\x15\x78\x91\x06\x25\x37\x14\x00\x6d\x9b\xce\x00\xc1\xa0\xae\xd2\x75\x68\xed\xaf\x95\x08\xa0\x11\x2c\xc7\x4a\x89\x02\x75\x1a\xfc\xa8\x72\xce\x04\x48\xaf\x29\xfc\xf5\x87\xff\x82\xce\x51\x5c\x96\xb0\x55\xad\x86\x6f\xa8\x42\x8d\x6d\x0d\xac\x28\x6c\x90\x46\x51\x34\x62\xef\x22\xf6\xa1\x80\x61\x46\x72\x0f\x75\x92\x64\x2d\x91\x1a\x00\x33\x92\x90\x91\x0c\x0b\x5c\xb1\x56\x10\x14\x5a\x35\x85\xda\xc8\x90\x54\x59\xda\xfa\xe6\x95\xf0\x48\x01\x14\x8c\x58\xb7\x95\x06\x3d\x6c\xef\x39\x66\x1a\xd5\xb4\x4d\xe7\x3b\xbf\x88\x77\x0d\x93\x05\x16\xd6\xd3\xc2\x60\xb0\xfc\x96\xaf\x11\x6a\xf4\xba\x9c\x1c\x07\x42\xce\x34\x52\x38\x26\xfa\x20\x1c\x92\xd8\x0b\xe3\x55\x82\xee\x2f\x69\x45\x4f\x69\x50\xa1\x46\xd9\xc2\xc1\x5b\xa8\x6d\x36\x09\x96\xf7\xf7\x9a\xc9\x12\xe1\x25\x2f\xee\x2e\xe0\x25\xab\x55\x2b\x09\x16\x29\x44\x6f\xdd\xa3\xd9\xed\x0e\xa8\x03\x24\x82\x2f\x13\xf6\xb1\xa0\x06\x25\x73\xc1\xf3\xdb\x34\x20\x8e\x3a\xbd\xbf\xb7\xc4\x77\xbb\x1b\xb8\xbf\xe7\x2b\x78\x19\xfd\x80\x39\x6b\x28\xaf\xd8\x6e\x57\xea\xfe\x39\xc2\x3b\xcc\x5b\xc2\xc9\xf4\xfe\x1e\x85\xc1\xdd\xce\xb4\x59\xcd\x69\xd2\xa3\xdb\x75\x59\xec\x76\x56\xe6\x4e\xce\xdd\x0e\x62\x4b\x54\x16\x78\x07\x2f\xa3\xef\x51\x73\x55\x18\xf0\xf0\x49\xcc\x96\x49\x2c\xf8\xb2\xc3\x3b\x34\x52\xdc\x8a\x7d\xbc\xc4\x36\x60\x86\xe8\x76\x87\xc5\x89\x3a\x96\xf4\x91\xd8\x2f\xc3\x41\xfa\x2e\x1e\x0c\x27\xbc\xc5\x6d\x1a\xdc\xdf\x8f\x71\xbb\xdd\x9c\x09\x91\x31\x6b\x17\xaf\xda\x80\xf4\x33\xda\x38\x5d\x73\xe3\x1a\xa9\x65\x2f\xc1\x5e\xec\x67\x1e\xe6\xa3\x74\x45\xaa\x59\xc0\xd5\x7c\x94\xab\x1e\x3b\xe7\x6f\x8e\xce\xf9\xd5\xa3\xc0\x0d\x93\x28\xc0\xfd\x86\xa6\x66\xa2\x7f\xee\x4e\xcb\xe8\xf0\x1d\x23\x85\x36\x33\x0f\xa2\x0d\x19\x7e\x76\x03\x6a\x8d\x7a\x25\xd4\x66\x01\xac\x25\x75\x03\x35\xbb\x1b\xaa\xdc\xd5\x6c\x36\x96\xdb\x36\x80\x2c\x13\xe8\x72\x8a\xc6\x9f\x5a\x34\x64\x86\x5c\xe2\xb7\xdc\xaf\x4d\x29\x05\x4a\x83\xc5\x91\x35\x2c\x47\x6b\x5a\x07\x35\x72\xfd\x60\xcc\x47\x65\x5f\x29\x35\x14\x8e\xb1\x18\x1d\xe9\x51\x8d\x0b\x96\x09\xe9\x3d\xdc\x49\x42\xc5\xaf\x4a\xfc\xda\x36\x76\x4f\xe5\x7d\x9f\xd1\xac\xee\x0d\xa2\xf6\x5d\x85\x0d\x59\x70\xaf\x49\x4c\xc5\x67\x70\xb6\x41\x98\x31\x83\xcf\x61\xef\xea\xfb\x9e\xbd\x7b\xfd\x5c\xfe\x15\x32\x4d\x19\x32\x7a\x8e\x00\xab\x56\x16\x23\xfd\x5d\xee\xfc\x5c\x01\x5a\xc9\xd7\xa8\x0d\xa7\xed\x73\x25\xc0\x62\x2f\x82\x7f\x3f\x14\x21\x89\x49\x7f\x3c\xd6\xc6\x2f\xbf\xd1\xe1\xfe\xa5\x46\xe4\x6a\xf9\x27\xb5\x81\x42\xa1\x01\xaa\xb8\x01\x5b\x5c\xbf\x4e\xe2\xea\x6a\x00\x69\x96\xef\xed\x86\x33\x2a\xac\x5c\x43\x01\xdc\x80\x6e\xa5\xab\xbc\x4a\x02\x55\x78\xd8\x84\x74\x45\x3a\x82\xf7\xca\x36\x72\x6b\x94\x04\x35\x13\x3c\xe7\xaa\x35\xc0\x72\x52\xda\xc0\x4a\xab\x1a\xf0\xae\x62\xad\x21\x4b\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb3\xe4\x5c\x0a\x4a\x03\xcb\xf3\xb6\x6e\x6d\x23\x2a\x4b\x40\xa9\xda\xb2\xea\x64\x21\x05\xbe\x30\x09\x25\xcb\x41\x1e\xd3\xb0\x1a\x18\x11\xcb\x6f\xcd\x05\xf4\x59\x01\x98\x46\x20\x8e\x85\xc5\xca\x51\xdb\xbe\x01\x72\x55\xd7\x4a\xc2\x95\x2e\xa0\x61\x9a\xb6\x96\x97\x2b\x6f\x11\xbc\x95\x5b\x25\x11\x2a\xb6\x76\xa2\xc1\xb7\x9c\xfe\xd4\x66\x17\xf0\xde\xdf\x22\x2e\xe0\x5b\xa5\x4a\x81\xe7\x56\xc2\x3f\xb2\x1c\x33\xa5\x6e\x7b\x74\xa8\xd9\xb6\x67\xdc\xe9\xb1\xe1\x54\x71\x6f\xa8\x06\x75\x6d\x69\x14\x20\x78\xcd\xc9\x44\x49\xdc\xec\x73\xeb\xbe\x4a\x8b\xb0\x52\x9a\xff\x6c\x5b\x1c\x31\xf8\x0b\x20\x29\xe8\x28\xcf\xf4\x69\xd2\x05\x80\xc0\x15\x2d\xe0\x95\x4f\x93\xc7\x21\x5d\x72\xaa\xda\x2c\x64\xe2\xd1\x43\xd5\x93\x75\xb7\x4b\x5b\x7e\x16\x70\xe5\x5b\x5a\xdf\x56\x14\x34\x4a\x89\xc5\x51\xe0\x79\xbe\xd7\xd7\xcd\xdd\x20\xca\xd0\x17\xcf\x06\x22\x36\x1e\x0e\x0d\xb3\xe6\x7b\xdb\xe6\x1a\x19\x21\x30\x48\xd8\xd1\x35\xd9\xf6\x8b\x91\x97\xde\x5d\xb4\x02\x20\xa6\x4b\xa4\x34\xf8\x5f\x96\xa9\x96\x16\x99\x60\xf2\x36\x58\x5a\x38\x5b\xe1\x9d\xbd\x1f\xef\x09\x01\xeb\x0c\x8b\x02\x0b\xe0\x92\x94\xf3\x48\x37\x77\x80\x89\x7d\x59\x71\x81\x6e\x32\xe1\xce\x84\x3c\xb3\xde\xb4\x1e\x9f\x46\x49\xa6\xe3\xe5\x3b\xd5\x6c\xc3\x86\x19\x42\x87\x6a\x19\x1a\xd7\x8b\x0e\xd4\x58\xa6\xd6\x08\xbe\xd7\xcd\xd4\x1d\x30\x59\xc0\x8a\x6b\x04\xb6\x61\xdb\xaf\x92\xb8\x70\x37\x93\xde\x8e\x9f\xee\xcc\xee\x3e\xfb\x45\x79\x72\x38\x1d\x35\xbb\x7d\xd4\x91\x9d\xd0\xce\x89\xdc\x59\x3d\xa6\x0d\x22\x7d\x6d\x53\x72\xfa\x83\x27\xc8\x65\x79\x3a\x9f\xf9\x4c\x63\x1f\x2c\xf9\xd3\xf9\xcc\x5a\xf8\x74\x3e\x9b\xdd\xcd\x9e\xf9\x77\x3a\x9f\x29\x79\x3a\x9f\x51\x85\xa7\xf3\xd9\xe9\xfc\x6a\x9c\xa3\xfc\x4a\x1f\x1d\x16\x0a\x8d\xe5\xd6\xa7\xae\xa7\x42\xcc\x89\xfb\x4b\x31\xe6\x02\xe4\x61\x84\x19\x98\x98\x56\x6b\xd5\x4a\xdb\xed\x80\xd5\xf9\x59\x51\xf6\xc0\x8c\xa6\x6d\x1a\xa5\x29\x1a\x9b\x93\xd9\x5b\xad\x40\x13\x5f\xcf\x5e\x5f\xbf\xf9\xa8\xf8\x2e\x62\x9d\x0e\xff\xef\x51\x5b\xba\xb4\x19\x36\xa2\x35\xb6\xb5\xe4\xf6\x4e\xf7\x45\x85\xb0\xcf\xeb\xf0\xbd\x68\xcd\x05\x34\x6d\x26\xb8\xa9\x80\x81\xc4\x0d\x24\x86\xb4\x92\xe5\xd2\xad\xe6\x49\xdc\xbd\x42\xa3\x0c\x7d\x62\xc6\xf9\xa4\x70\xb0\xfc\xfe\x45\x49\x67\xd5\x95\xba\x2f\xca\x65\x7d\xfd\xfd\x52\xfd\xf5\xe0\xf8\x6e\x36\x9b\xa8\xb7\xa4\x3b\xbb\x15\x8a\x26\xb6\xdd\x48\x2b\x39\x6d\x63\x9f\x05\x95\x8c\xbf\xe6\x45\x3a\xbf\x9e\xbf\x79\x33\x7f\xf5\xef\xd7\xaf\x5f\xcf\xaf\x5f\xbd\x7e\xea\x60\x0f\x41\xf1\xeb\xcf\xf5\xd0\x7b\x8a\x51\xcf\xf7\x37\xd5\x42\xce\x24\x90\x66\xf9\xad\x37\x42\xab\xb5\x35\x42\x83\x5e\xff\xa1\xb5\xca\x50\xa8\x8d\x03\xf1\x7c\x56\x1c\x85\xeb\xb3\x0c\x22\x54\x6a\x03\x75\x9b\x3b\x5b\xdb\x76\x0a\xed\xc6\x86\x71\x82\x56\x12\x17\xde\x05\xd4\x6a\xd7\x8d\xe1\x41\x37\xf4\xe0\xb6\x9d\x60\xbd\x7c\x6f\x6b\xf4\x83\x26\x74\xb8\x27\x83\xc6\x77\x1e\x1c\x1a\xad\x08\x73\x6b\x47\x60\x25\xe3\xd2\x58\x0b\xb8\x7e\x0b\xeb\x67\xdc\xa3\x87\xa7\xee\x61\x3f\x09\x76\xdb\x71\x0c\xdf\x0a\x95\x31\x01\x6b\x7b\x14\x32\x61\x1b\x68\x05\x95\xb2\xaa\x8f\xac\x65\x88\x51\x6b\x40\xad\xdc\xaa\x97\xdc\xe2\xaf\x99\xb6\x5d\x2a\xd6\x0d\x41\xda\xcd\x31\xed\x9a\x41\xbd\xee\xa6\xb3\xf6\x95\x38\x6a\xbf\xdf\x31\xfd\x03\xae\xb8\xf4\x71\xb5\x6a\xa5\x57\x8f\x2a\x46\xe0\xa7\x07\x06\x98\x6b\x4a\xa0\xd5\x02\xba\x18\xf0\x24\x07\x06\x0e\x0e\xd2\x01\x7d\xf2\xc0\xce\xdd\x43\x67\xa3\x69\x37\x87\xf5\x64\x22\x83\xb2\x98\xfc\xe7\x8f\x7f\xf9\x73\x64\x48\x73\x59\xf2\xd5\x76\x72\xdf\x6a\xb1\x80\x97\x93\xe0\xdf\xdc\x64\x6f\xfa\xf7\xd9\x3f\xa3\x35\x13\x2d\x5e\x38\x05\x16\xee\xf7\x01\x9b\x0b\xe8\x1e\x17\x70\xc8\x71\x37\x9d\xde\x3c\x3e\x6a\x19\x4d\x86\x34\x1a\xa4\x89\x05\x1c\x3c\xb9\xbb\x39\x34\x12\x83\x1a\xa9\x52\x2e\x16\x35\xe6\x4a\x4a\xcc\x09\xda\x46\xc9\xce\x26\x20\x94\x31\xbd\x61\xf6\x10\x23\xdb\xf4\xca\xf3\x15\x4c\x7a\x77\x9d\xc2\x1c\xd2\x14\x66\xfd\x5e\x67\x19\x48\x5d\xd6\xf9\x6f\xcc\x7e\x54\xf9\x2d\xd2\x24\xd8\x18\x7b\xda\x03\x38\x07\xa1\x72\x66\xe9\x45\x95\xcd\x3d\xe7\x10\xc4\xac\xe1\xc1\xd4\x4f\xb3\x77\x80\xc2\xe0\x2f\x13\x7b\x16\x2d\x3f\xef\xf7\x92\x9e\x9f\xfb\xb0\xe9\x5d\xa7\x64\x8d\xc6\xb0\x12\xc7\x1a\xba\xdb\xd9\xa0\x8a\x35\x44\x6d\x4a\x48\xc1\xb9\xb8\x61\xda\xa0\x07\x89\x0a\x46\xac\xe3\xe2\xcc\xe1\xc0\xd2\x14\x64\x2b\xc4\x80\x7f\xa2\xd1\x1e\xe6\x0e\x6c\xf7\xe2\x00\x3c\xf2\x39\xfb\xab\x34\x05\x7b\x3d\xb6\x3e\x2a\xf6\x98\x36\x7c\xfc\x45\x7e\x1a\xd9\xdc\xba\xc7\x98\x0e\xe4\x1e\x50\xc3\xe2\x97\xc8\x61\x71\x4c\x0f\x8b\x27\x08\xba\xb9\xc9\xc7\xe8\xf9\x39\xcb\x88\x9c\x5b\x78\x82\x9a\x6c\xeb\x0c\xf5\xc7\xc8\xf9\xb9\x49\x47\xce\x99\xfa\x3b\x49\x23\xdc\x0b\xb8\x7c\x33\x7d\x82\x3a\x6a\xad\x9e\x24\x2e\x15\x6d\x27\xf7\x82\x6d\x6d\x81\x80\x33\x52\xcd\x3b\x37\xe6\x38\xbb\x70\x55\x6b\x01\x03\x85\x0b\x37\xc0\x5e\xc0\x99\x7b\xb3\xfb\xbc\x46\x87\xf5\x7a\x36\x9b\x5d\x40\xff\xbd\xe7\x3f\x98\x3d\xc5\xba\xc5\xdd\x13\xf2\x98\x36\xcf\x6d\xf1\xfc\x1c\x89\x3a\x1a\x83\x4c\xdd\xfb\x58\xaa\xcb\x5f\x29\xd6\x50\xa4\x0e\xe4\x82\xdf\xfd\x0e\x1e\xec\x1e\xc6\xb1\x3d\x08\x7d\xd9\x4f\x21\x08\x3a\xf2\x27\x2b\xa5\x61\x62\x37\x79\x3a\xbb\x01\x9e\x8c\xc9\x44\x02\x65\x49\xd5\x0d\xf0\xf3\xf3\x3d\xa5\x93\x9e\xcc\x79\x0a\x41\x42\x7a\x99\x50\xb1\x74\x63\x19\xdf\x02\xfd\x23\xc8\x58\x7e\x5b\xba\xbe\x62\x61\xf3\xf6\xe4\xcc\x1e\xf3\x31\xe1\xbf\xf3\x7f\x46\x6c\xcd\x88\x69\x7b\xde\xcf\xa6\x37\xb0\x47\xe9\x5a\xad\x5c\xd9\xb2\x01\xbe\xa3\x73\x13\x20\x18\xa6\xa6\xee\x2d\x53\xba\x40\x1d\x6a\x56\xf0\xd6\x2c\xe0\x55\x73\x77\xf3\x8f\x7e\xaa\xec\xe6\x54\x4e\xac\x46\xe3\xf2\x51\xee\xdd\x68\xe3\x1c\x82\x24\xb6\x40\x3d\xca\xa0\xc4\xf8\xcb\x1e\x3c\x32\x61\x83\xe1\xbb\x5b\xb7\x5e\xf3\xa2\x10\x68\x85\x70\x0c\xfd\x07\xd2\xa2\xd5\x2e\xb9\x4d\xfc\xfb\xe4\x58\x0e\x1b\x08\xd3\xa8\x95\xfc\x6e\x32\x0d\x3b\x98\xfe\xfd\x02\xce\x8c\xcd\xe1\x85\x39\x9b\x46\x55\x5b\x33\xc9\x7f\xc6\x89\x8d\x8e\xa9\x97\xdb\x4a\x1c\x93\x5e\x0e\xce\xdc\x8d\x0e\xe3\x30\x3f\x9e\x46\x15\xd5\x62\x12\x24\xe4\xbe\x1e\x5a\xe1\x06\x0f\x3a\x2a\x7e\xf9\x30\xe0\x76\x87\x79\x36\x17\xca\xe0\x51\x1d\x01\x83\xf4\xde\xc7\xf1\x64\xa8\x35\x17\x70\x35\x9b\xcd\xa6\x37\xb0\xdb\x7f\x64\x8d\x63\xf8\xc6\x10\xeb\x5b\xd9\x0d\x66\xc6\xd5\x00\xe8\x70\x5c\xc9\xf7\xa5\xfd\xed\xf7\xdf\x8d\xca\xfb\x40\x75\xe2\x84\x1b\x3e\x32\x3f\x56\x4b\x1f\xfd\xaa\x6d\x1b\x53\x7f\x43\x73\x6d\xe9\x50\x6c\x6d\x85\x89\x3e\x98\x00\x98\xd9\xca\x1c\x0a\x5c\xa1\x5e\x8e\xc8\x77\x15\x38\x89\xfd\xf7\xd6\x24\xf6\xff\xa5\xe4\xff\x02\x00\x00\xff\xff\x06\xe6\xbb\xe1\x63\x22\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3a\x7f\x73\xdb\xb6\x92\x7f\x3b\x9f\x62\xcb\x8b\x9f\xa4\xb3\x48\xca\x76\x92\xe7\x93\x48\x75\x72\x79\x7d\x7d\xb9\xb9\xeb\xeb\xb4\xe9\xdc\xbd\x69\x3b\x37\x20\xb1\x12\x11\x83\x00\x0b\x80\x92\x55\x8f\xbe\xfb\x0d\x00\x92\xa2\x7e\xd8\x71\x9a\xdc\x5d\xfc\x87\x4c\x00\x8b\xdd\xc5\xfe\xc6\x92\xc9\x57\x7f\xf9\xfb\x9b\x77\xff\xf8\xfe\x1b\x28\x4c\xc9\xe7\xcf\x12\xfb\x0f\x38\x11\xcb\x34\x40\x11\xcc\x9f\x9d\x25\x05\x12\x3a\x7f\x76\x76\x96\x94\x68\x08\xe4\x05\x51\x1a\x4d\x1a\xd4\x66\x11\xde\x04\xbb\x85\xc2\x98\x2a\xc4\xdf\x6a\xb6\x4a\x83\xff\x0a\x7f\x7a\x1d\xbe\x91\x65\x45\x0c\xcb\x38\x06\x90\x4b\x61\x50\x98\x34\x78\xfb\x4d\x8a\x74\x89\xbd\x7d\x82\x94\x98\x06\x2b\x86\xeb\x4a\x2a\xd3\x03\x5d\x33\x6a\x8a\x94\xe2\x8a\xe5\x18\xba\xc1\x18\x98\x60\x86\x11\x1e\xea\x9c\x70\x4c\x2f\x83\xf9\x33\x8b\xc7\x30\xc3\x71\x7e\x7f\x1f\x7d\x87\x66\x2d\xd5\xed\x76\x3b\x85\xd7\xb5\x29\x50\x18\x96\x13\x83\x14\xfe\x4a\xea\x1c\x4d\x12\x7b\x48\xb7\x89\x33\x71\x0b\x85\xc2\x45\x1a\x58\xd6\xf5\x34\x8e\x73\x2a\xde\xeb\x28\xe7\xb2\xa6\x0b\x4e\x14\x46\xb9\x2c\x63\xf2\x9e\xdc\xc5\x9c\x65\x3a\x36\x6b\x66\x0c\xaa\x30\x93\xd2\x68\xa3\x48\x15\x5f\x47\xd7\xd1\x9f\xe3\x5c\xeb\xb8\x9b\x8b\x4a\x26\xa2\x5c\xeb\x00\x14\xf2\x34\xd0\x66\xc3\x51\x17\x88\x26\x80\x78\xfe\xc7\xe8\x2e\xa4\x30\x21\x59\xa3\x96\x25\xc6\x2f\xa2\x3f\x47\x13\x47\xb2\x3f\xfd\x38\x55\x4b\x56\xe7\x8a\x55\x06\xb4\xca\x9f\x4c\xf7\xfd\x6f\x35\xaa\x4d\x7c\x1d\x5d\x46\x97\xcd\xc0\xd1\x79\xaf\x83\x79\x12\x7b\x84\xf3\x4f\xc2\x1d\x0a\x69\x36\xf1\x55\xf4\x22\xba\x8c\x2b\x92\xdf\x92\x25\xd2\x96\x92\x5d\x8a\xda\xc9\xcf\x46\xf7\x21\x1d\xbe\x3f\x54\xe1\xe7\x20\x56\xca\x12\x85\x89\xde\xeb\xf8\x2a\xba\xbc\x89\x26\xed\xc4\x31\x7e\x47\xc0\x2a\xcd\x92\x3a\x8b\x56\xa8\xac\xe5\xf2\x30\x47\x61\x50\xc1\xbd\x9d\x3d\x2b\x99\x08\x0b\x64\xcb\xc2\x4c\xe1\x72\x32\x39\x9f\x9d\x9a\x5d\x15\x7e\x9a\x32\x5d\x71\xb2\x99\xc2\x82\xe3\x9d\x9f\x22\x9c\x2d\x45\xc8\x0c\x96\x7a\x0a\x1e\xb3\x5b\xd8\x3a\x9a\x95\x92\x4b\x85\x5a\x37\xc4\x2a\xa9\x99\x61\x52\x4c\xad\x45\x11\xc3\x56\x78\x0a\x56\x57\x44\x1c\x6d\x20\x99\x96\xbc\x36\x78\xc0\x48\xc6\x65\x7e\xeb\xe7\x9c\x37\xf7\x0f\x91\x4b\x2e\xd5\x14\xd6\x05\x6b\xb6\x81\x23\x04\x95\xc2\x06\x3d\x54\x84\x52\x26\x96\x53\x78\x55\x35\xe7\x81\x92\xa8\x25\x13\x53\x98\xec\xb6\x24\x71\x2b\xc6\x24\xf6\x81\xeb\xd9\x59\x92\x49\xba\x71\x3a\xa4\x6c\x05\x39\x27\x5a\xa7\xc1\x81\x88\x5d\x40\xda\x03\xb0\x71\x88\x30\xd1\x2e\xed\xad\x29\xb9\x0e\xc0\x11\x4a\x03\xcf\x44\x98\x49\x63\x64\x39\x85\x4b\xcb\x5e\xb3\xe5\x00\x1f\x0f\xf9\x32\xbc\xbc\x6a\x17\xcf\x92\xe2\xb2\x45\x62\xf0\xce\x84\x4e\x3f\x9d\x66\x82\x79\xc2\xda\xbd\x0b\x02\x0b\x12\x66\xc4\x14\x01\x10\xc5\x48\x58\x30\x4a\x51\xa4\x81\x51\x35\x5a\x3b\x62\x73\xe8\x87\xbf\x07\xa2\x5f\x71\xd9\xf2\x15\x53\xb6\x6a\x8e\xd5\x7b\x3c\x38\xe1\xc3\x87\xb8\x81\xe6\x41\x2e\x16\x1a\x4d\xd8\x3b\x53\x0f\x98\x89\xaa\x36\xe1\x52\xc9\xba\xea\xd6\xcf\x12\x37\x0b\x8c\xa6\x41\xad\x78\xd0\x84\x7f\xf7\x68\x36\x55\x23\x8a\xa0\x3b\xb8\x54\x65\x68\x35\xa1\x24\x0f\xa0\xe2\x24\xc7\x42\x72\x8a\x2a\x0d\x7e\x94\x39\x23\x1c\x84\x3f\x33\xfc\xf4\xc3\xbf\x43\xa3\x32\x26\x96\xb0\x91\xb5\x82\x6f\x4c\x81\x0a\xeb\x12\x08\xa5\xd6\x5c\xa3\x28\xea\x31\xe2\x6c\xf7\x98\xd5\x30\x33\x62\x07\x75\x96\x64\xb5\x31\xb2\x03\xcc\x8c\x80\xcc\x88\x90\xe2\x82\xd4\xdc\x00\x55\xb2\xa2\x72\x2d\x42\x23\x97\x4b\x9b\xe9\xfc\x21\xfc\xa6\x00\x28\x31\xa4\x59\x4a\x83\x16\xb6\xd5\x21\xd1\x95\xac\xea\xaa\xd1\xa2\x9f\xc4\xbb\x8a\x08\x8a\xd4\xea\x9c\x6b\x0c\xe6\xdf\xb2\x15\x42\x89\xfe\x2c\x67\x87\x26\x91\x13\x85\x26\xec\x23\x3d\x32\x8c\x24\xf6\xcc\xf8\x23\x41\xf3\x97\xd4\xbc\xc5\xd4\x1d\xa1\x44\x51\xc3\xde\x28\x54\x36\xae\x04\xf3\xfb\x7b\x45\xc4\x12\xe1\x39\xa3\x77\x63\x78\x4e\x4a\x59\x0b\x03\xd3\x14\xa2\xd7\xee\x51\x6f\xb7\x7b\xd8\x01\x12\xce\xe6\x09\x79\xcc\xbc\x41\x8a\x9c\xb3\xfc\x36\x0d\x0c\x43\x95\xde\xdf\x5b\xe4\xdb\xed\x0c\xee\xef\xd9\x02\x9e\x47\x3f\x60\x4e\x2a\x93\x17\x64\xbb\x5d\xaa\xf6\x39\xc2\x3b\xcc\x6b\x83\xc3\xd1\xfd\x3d\x72\x8d\xdb\xad\xae\xb3\x92\x99\x61\xbb\xdd\xce\x0b\xba\xdd\x5a\x9e\x1b\x3e\xb7\x5b\x88\x2d\x52\x41\xf1\x0e\x9e\x47\xdf\xa3\x62\x92\x6a\xf0\xf0\x49\x4c\xe6\x49\xcc\xd9\xbc\xd9\xb7\x2f\xa4\xb8\xe6\x3b\x7b\x89\xad\xc1\x74\x76\xee\xdc\xc6\xb1\xda\xe7\xf4\x84\x17\x2c\xc3\x8e\xfb\xc6\x1e\x34\x33\x78\x8b\x9b\x34\xb8\xbf\xef\xef\x6d\x56\x73\xc2\x79\x46\xac\x5c\xfc\xd1\xba\x4d\xbf\xa3\xb5\xd3\x15\xd3\xae\xa4\x9a\xb7\x1c\xec\xd8\x7e\xa2\x5b\x1f\x04\x2e\x23\xab\x29\x5c\x5f\xf5\xa2\xd6\x29\x8f\x7f\x75\xe0\xf1\xd7\x27\x81\x2b\x22\x90\x83\xfb\x0d\x75\x49\x78\xfb\xdc\x78\x4b\xcf\xf9\x0e\x37\x85\x36\x46\x77\xac\x75\xb1\x7e\x32\x03\xb9\x42\xb5\xe0\x72\x3d\x05\x52\x1b\x39\x83\x92\xdc\x75\xf9\xee\x7a\x32\xe9\xf3\x6d\x4b\x41\x92\x71\x74\xd1\x45\xe1\x6f\x35\x6a\xa3\xbb\x58\xe2\x97\xdc\xaf\x0d\x29\x14\x85\x46\x7a\x20\x0d\x4b\xd1\x8a\xd6\x41\xf5\x54\xdf\x09\xf3\x24\xef\x0b\x29\xbb\x14\xd2\x67\xa3\x41\xdd\xcb\x76\xc1\x3c\x31\x6a\x07\x77\x96\x18\xfa\x51\x29\x40\xd9\x12\xef\xa1\x0c\xe0\x23\x9a\x3d\x7b\x85\xa8\x7c\x7d\x61\x4d\x16\xdc\x30\x89\x0d\xfd\x04\xca\xd6\x08\x33\xa2\xf1\x29\xe4\x5d\xa6\xdf\x91\x77\xc3\x4f\xa5\x5f\x20\x51\x26\x43\x62\x9e\xc2\xc0\xa2\x16\xb4\x77\x7e\x17\x3b\x3f\x95\x81\x5a\xb0\x15\x2a\xcd\xcc\xe6\xa9\x1c\x20\xdd\xb1\xe0\xc7\xfb\x2c\x24\xb1\x51\x8f\xdb\x5a\x7f\xf0\x99\x9c\xfb\x43\x25\xc9\xf5\xfc\x6f\x72\x0d\x54\xa2\x06\x53\x30\x0d\x36\xb9\x7e\x9d\xc4\xc5\x75\x07\x52\xcd\xdf\xd9\x05\x27\x54\x58\xb8\xd2\x02\x98\x06\x55\x0b\x97\x79\xa5\x00\x53\xe0\x7e\x39\xd2\x24\xe9\x08\xde\x49\x5b\xd2\xad\x50\x18\x28\x09\x67\x39\x93\xb5\x06\x92\x1b\xa9\x34\x2c\x94\x2c\x01\xef\x0a\x52\x6b\x63\x11\xd9\xf0\x41\x56\x84\x71\xe7\x4b\x4e\xa5\x20\x15\x90\x3c\xaf\xcb\xda\x96\xa4\x62\x09\x28\x64\xbd\x2c\x1a\x5e\x8c\x04\x9f\x98\xb8\x14\xcb\x8e\x1f\x5d\x91\x12\x88\x31\x24\xbf\xd5\x63\x68\xa3\x02\x10\x85\x60\x18\x52\xbb\x2b\x47\x65\xeb\x06\xc8\x65\x59\x4a\x01\xd7\x8a\x42\x45\x94\xd9\x58\x5a\x2e\xbd\x45\xf0\x5a\x6c\xa4\x40\x28\xc8\xca\xb1\x06\xdf\x32\xf3\xb7\x3a\x1b\xc3\x3b\x7f\x9f\x18\xc3\xb7\x52\x2e\x39\x5e\x58\x0e\xff\x4a\x72\xcc\xa4\xbc\x6d\xb7\x43\x49\x36\x2d\xe1\xe6\x1c\x6b\x66\x0a\xe6\x05\x55\xa1\x2a\x2d\x0e\x0a\x9c\x95\xcc\xe8\x28\x89\xab\x5d\x6c\xdd\x65\x69\x1e\x16\x52\xb1\xdf\x6d\x89\xc3\x3b\x7d\x01\x24\xd4\x1c\xc4\x99\x36\x4c\x3a\x03\xe0\xb8\x30\x53\x78\xe1\xc3\xe4\xa1\x49\x2f\x99\x29\xea\x2c\x24\xfc\xa4\x53\xb5\x68\xdd\x3d\xd3\xa6\x9f\x29\x5c\xfb\xe2\xd6\x97\x15\xd4\xf4\x42\x22\x3d\x30\x3c\x4f\xf7\xe6\xa6\xba\xeb\x58\xe9\x2a\xe4\x49\x87\xc4\xda\xc3\xbe\x60\x56\x6c\x27\xdb\x5c\x21\x31\x08\x04\x12\x72\x70\x61\x5e\x32\x6d\x22\xcf\xbd\xbb\x72\x05\x60\x88\x5a\xa2\x49\x83\xff\x26\x99\xac\xcd\x34\xe3\x44\xdc\x06\x73\x0b\x67\x33\xbc\x93\xf7\xe9\x9a\x10\xb0\xcc\x90\x52\xa4\xc0\x84\x91\x4e\x23\x4d\x07\x02\x86\x76\xb0\x60\x1c\x5d\x91\xea\x7c\x42\x0c\xac\x36\xad\xc6\x47\x51\x92\xa9\x78\xfe\x46\x56\x9b\xb0\x22\xda\xa0\xdb\x6a\x09\x6a\x57\x8b\x76\xd8\x48\x26\x57\x08\xbe\xea\xcd\xe4\x1d\x10\x41\x61\xc1\x14\x02\x59\x93\xcd\x57\x49\x4c\xdd\x1d\xa5\x95\xe3\x1f\x57\x66\x73\xb3\xfd\xa2\x34\xd9\x79\x47\x49\x6e\x4f\x2a\xb2\x61\xda\x29\x91\x39\xa9\xc7\x66\x8d\x68\xbe\xb6\x21\x39\xfd\xc1\x23\x64\x62\x79\x7e\x35\xf1\x91\xc6\x3e\x58\xf4\xe7\x57\x13\x2b\xe1\xf3\xab\xc9\xe4\x6e\xf2\xc4\xbf\xf3\xab\x89\x14\xe7\x57\x13\x53\xe0\xf9\xd5\xe4\xfc\xea\xba\x1f\xa3\xfc\x4c\x6b\x1d\x16\x0a\xb5\xa5\xd6\x86\xae\x87\x4c\xcc\xb1\xfb\x21\x1b\x73\x06\x72\x6c\x61\x1a\x86\xba\x56\x4a\xd6\xc2\x56\x3b\x60\xcf\xfc\x24\x2b\x3b\x12\xa3\xae\xab\x4a\x2a\x13\xf5\xc5\x49\xec\xfd\x96\xa3\x8e\x6f\x26\x2f\x6f\x5e\x3d\xca\xbe\xb3\x58\x77\x86\xff\x73\xab\x5d\xba\xb0\x19\x56\xbc\xd6\xb6\xb4\x64\xf6\x4e\xf7\x45\x99\xb0\x8f\xeb\xf0\x3d\xaf\xf5\x18\xaa\x3a\xe3\x4c\x17\x40\x40\xe0\x1a\x12\x6d\x94\x14\xcb\xb9\x9b\xcd\x93\xb8\x19\x42\x25\xb5\xf9\x83\x11\xe7\x0f\x99\x83\xa5\xf7\xff\x14\x74\x16\x4d\xaa\xfb\xa2\x54\xd6\xe6\xdf\x2f\x55\x5f\x47\xee\xbb\x5e\xaf\xa3\x56\x92\xce\x77\x0b\xe4\x55\x6c\xab\x91\x5a\x30\xb3\x89\x7d\x14\x94\x22\xfe\x9a\xd1\xf4\xea\xe6\xea\xd5\xab\xab\x17\xff\x72\xf3\xf2\xe5\xd5\xcd\x8b\x97\x0f\x39\x76\x67\x14\x1f\xef\xd7\x5d\xed\xc9\x7b\x35\xdf\x3f\x64\x0d\x39\x11\x60\x14\xc9\x6f\xbd\x10\x6a\xa5\xac\x10\x2a\xf4\xe7\xef\x4a\xab\x0c\xb9\x5c\x3b\x10\x4f\x67\xc1\x90\xbb\x3a\x4b\x23\x42\x21\xd7\x50\xd6\xb9\x93\xb5\x2d\xa7\xd0\x2e\xac\x09\x33\x50\x0b\xc3\xb8\x57\x81\xa9\x95\xab\xc6\x70\xaf\x1a\x3a\xba\x6d\x27\x58\xce\xdf\xd9\x1c\x7d\x54\x84\x76\xf7\x64\x50\xf8\xc6\x83\x43\xa5\xa4\xc1\xdc\xca\x11\xc8\x92\x30\xa1\xad\x04\x5c\xbd\x85\xe5\x13\xee\xd1\xdd\x53\xf3\xb0\xeb\x09\xbb\xe5\x38\x86\x6f\xb9\xcc\x08\x87\x95\x75\x85\x8c\xdb\x02\x5a\x42\x21\xed\xd1\x7b\xd2\xd2\x86\x98\x5a\x83\x5c\xb8\x59\xcf\xb9\xdd\xbf\x22\xca\x56\xa9\x58\x56\x06\xd2\xa6\xa3\x69\xe7\x34\xaa\x55\xd3\xa7\xb5\x43\xc3\x50\xed\xad\x77\x52\x4f\xe1\xe7\x5f\x67\xcf\x1a\x56\xfe\x82\x0b\x26\x6c\xc6\x5d\xd4\xc2\x1f\xd9\x14\xc4\x34\x15\x95\x86\x9c\x4b\x5d\x2b\xcf\x21\x55\xb2\x02\xcb\x65\x8b\xa9\xc5\x6c\x17\x2a\x47\xad\x45\x32\x2c\x88\x2e\x46\x4d\x43\x56\xa1\xd3\x52\xb7\xd6\xce\x9f\x2d\xa4\x82\xa1\x45\xc0\xd2\xc9\x0c\x58\xd2\xe2\x8d\x38\x8a\xa5\x29\x66\xc0\x2e\x2e\x3a\xe0\x33\xb6\x80\x61\x0b\xf1\x33\xfb\x35\x32\x77\x91\xa5\x02\x69\x0a\x7d\x6a\x8e\x60\x83\x47\x57\x9c\xe5\x38\x64\x63\xb8\x1c\xcd\xda\xd5\x4c\x21\xb9\x6d\x47\x8d\x1e\xfd\x3f\xf7\xbb\x9d\xed\x4b\xc6\x09\x7f\x4f\x36\xbe\xdb\xa2\x81\xb8\x22\x0e\x6a\xc5\xa1\xf1\x19\xaf\x82\x4e\x21\x0e\xae\x2f\x95\x23\xbb\x6c\x1e\x1a\x9b\x6a\x8f\xe0\xd1\x44\x1a\x05\x1d\xfe\xdb\x8f\x7f\xff\x2e\xd2\x46\x31\xb1\x64\x8b\xcd\xf0\xbe\x56\x7c\x0a\xcf\x87\xc1\x3f\xd5\x8a\x07\xa3\x9f\x27\xbf\x46\x2b\xc2\x6b\x1c\x3b\x7d\x4f\xdd\xef\x11\x95\x31\x34\x8f\x53\xd8\x27\xb8\x1d\x8d\x66\xa7\x3b\x53\xbd\x46\x9a\x42\x8d\x66\x68\x01\x3b\xc3\x3f\x94\x11\x81\x12\x4d\x21\x9d\xeb\x2a\xcc\xa5\x10\x98\x1b\xa8\x2b\x29\x1a\x91\x00\x97\x5a\xef\x0c\xb1\x85\x48\x8f\x8d\xc2\x6a\xb9\xb5\xee\x73\xb8\xb2\xda\x9d\x74\xaa\x6d\x90\xa5\x2e\x48\xff\x27\x66\x3f\xca\xfc\x16\xcd\x30\x58\x6b\x1b\x1c\x03\xb8\x00\x2e\x73\x62\xf1\x45\x85\x0d\xd5\x17\x10\xc4\xa4\x62\x41\xa3\xfc\x2d\x20\xd7\xf8\x61\x64\x4f\xc2\xe5\x5f\x94\x78\x4e\x2f\x2e\xbc\x3f\xb5\x9a\x93\xa2\x44\xad\xc9\x12\xfb\x27\x74\x97\xd9\xee\x28\x56\x10\xa5\x5e\x42\x0a\x4e\xc3\x15\x51\x1a\x3d\x48\x44\x89\x21\xad\xb9\x5a\x71\x38\xb0\x34\x05\x51\x73\xbe\xb3\x72\xef\x55\xb3\xd6\x7e\xf7\xc0\x23\x9f\xe2\xbe\x4a\x53\xa8\x05\x75\x3a\xa2\xbb\x9d\xd6\x7a\x7c\xdf\x63\x14\xd9\x54\xb4\xdb\x31\x9a\xf5\xdd\x61\x0f\x1b\xd2\x0f\xa1\x43\x7a\x88\x0f\xe9\x03\x08\x5d\x9b\xe9\x31\x7c\xbe\x2d\xd5\x43\xe7\x26\x1e\xc0\x26\xea\x32\x43\xf5\x18\x3a\xdf\x66\x6a\xd0\x39\x51\xbf\x15\xa6\xb7\x77\x0c\x97\xaf\x46\x0f\x60\x47\xa5\xe4\x83\xc8\x85\x34\x9b\xe1\x3d\x27\x1b\x9b\x4f\x61\x60\x64\xf5\xc6\x75\x85\x06\x63\x97\xe4\xa7\xd0\x61\x18\xbb\x7e\xff\x14\x06\x6e\x64\xd7\x59\x89\x6e\xd7\xcb\xc9\x64\x32\x86\xf6\x45\xd9\xbf\x12\xeb\xc5\xaa\xc6\xed\x03\xfc\xe8\x3a\xcf\x6d\xad\xf1\x29\x1c\x35\x38\x3a\x9e\x9a\xf1\x27\x70\xd5\x25\x97\x3d\xb6\xe0\x4f\x7f\x82\xa3\xd5\x7d\x33\x8e\x63\xf8\x0f\xa2\x6e\x5d\x0f\xa7\x52\xb8\x72\x7d\x9e\x0e\xbe\x64\x5a\xbb\x36\x8a\x06\x2a\x05\x36\x7b\x3e\x2e\x6f\x1c\xf1\xd8\x80\xc1\x1c\x26\x87\x0c\xda\x78\xda\xcb\x2b\x27\xd2\x4d\x0f\xef\x7e\x26\x69\x25\x72\x22\x51\xb1\x12\xe1\xab\x14\x82\xa0\xbf\xf9\x08\xc2\x02\x74\xc8\xce\x34\x9a\x77\x5e\x17\xc3\x26\xbd\x9e\x4a\x7e\xa3\x31\x5c\x4f\x26\x93\xd1\x11\x13\xdb\x9d\x78\x5f\x57\xb6\xee\x02\x22\x36\x2e\xd2\x75\xb2\x75\x95\x9e\xad\xa1\x6c\x9c\xe3\x90\x4b\xce\x7d\xd1\xd3\x6c\xb5\x02\x6e\xfa\x5c\x29\x84\x97\xb3\x13\x69\xb8\x27\xc9\xde\xd1\x0e\xd5\x73\x42\xf6\x87\x2a\xda\x97\xd9\x01\x70\x78\xb9\xa7\x94\x3d\x7d\x9d\x56\xcc\x59\xc7\x37\xdb\x49\xf4\x40\x5d\x3b\x7d\x1d\xca\xac\xc7\xbf\xc7\x73\x71\xf9\xc4\x63\x74\xcb\x55\xad\x8b\xe1\x01\xa3\xa3\xd9\xb1\x6e\xde\x1a\x54\xc4\xa0\x7b\x75\xe1\x74\x81\xc2\xd8\x1a\xfb\x50\x25\xae\xfa\x56\x18\x2a\x14\x14\x55\x5b\x93\xf8\xcb\x84\xad\x20\xf7\x54\xe6\x6f\x1c\x7d\x73\xfa\x48\x87\x71\x35\x9d\x14\x08\x00\x70\xe0\x04\xce\x50\xf7\x2c\xd5\x02\x23\x27\x95\x46\x0a\x29\xf8\xef\x16\x86\xa3\xa8\x16\xec\x6e\x38\x0a\x9b\xf1\x21\x8e\x76\x7d\xd6\xdd\x2d\x5b\xb6\x2f\x52\x08\x12\xa3\x80\xd1\x74\x60\x93\xf0\xa9\x8a\xef\x02\x82\xc1\x7c\xc7\x41\x7f\x2b\x40\x62\xe8\xdc\xb5\xae\xfd\x35\xf1\x97\x20\x23\xf9\xed\xd2\xdd\xbd\xa6\xb6\x56\x1b\x1e\xa1\x25\x2b\x62\x88\x72\x58\x47\x33\xd8\x81\x37\x57\xd1\xdc\x2a\x67\x06\xfe\xc6\xeb\x3a\xe4\xd0\xbd\x55\x72\xa3\x4c\x2a\x8a\x2a\x54\x84\xb2\x5a\x4f\xe1\x45\x75\x37\xfb\xa5\x7d\xeb\xe6\xfa\xf8\x8f\xb2\x5a\x29\x9c\x1f\x71\xd4\xb4\x83\x2f\x20\x48\x62\x0b\xf0\x21\x34\xdd\x61\xfb\xdf\x4b\xc0\x89\xb7\x15\xd0\x7d\xcd\xd0\xcc\x97\x8c\x52\x8e\x96\xe1\x1d\x7a\xeb\x8c\x56\xff\x7d\x97\xda\x27\x09\xcd\x6b\x8a\xdd\x9e\xfd\xda\xea\xc4\x86\xee\x8d\xc7\xc0\x1a\x40\x68\x8f\xcc\x9c\xcc\x9b\x3e\x81\x9b\x56\x03\x27\x8b\xe6\xeb\x17\x5a\x2b\x57\x80\x0d\xc3\xc6\xc0\xc6\x30\xd0\xb6\x78\xa4\x7a\x30\x8a\x8a\xba\x24\x82\xfd\x8e\x43\x9b\x97\x46\x5e\x56\xee\x15\x4a\x70\x1c\x92\x8f\x98\xd9\xbd\xdb\x18\xb4\x39\x6e\xd0\x08\x71\xd0\x6a\xf7\xc5\xae\xa5\x30\x85\xc9\x6c\xf0\x91\x12\x3a\x4d\x25\xcc\x88\x82\xfe\x20\x6c\x93\x2f\x28\x69\xa9\xb7\x6b\x19\x51\x03\xdf\x2b\x71\x05\xbe\x90\xeb\x74\x70\x3d\xe9\x98\xf4\x8a\x76\x7a\x1e\x34\xb6\x76\xa4\x0c\xcb\x65\xeb\x9a\x73\xb8\x9e\x7c\x0e\x6e\x29\x11\x4b\x3c\x3c\x81\x51\xac\x42\x0a\x24\x37\x6c\x85\xff\x0b\x07\xf9\x0c\x42\xfe\x68\x16\xad\x1d\xb6\xc2\x73\x66\xba\xc7\xaf\x5d\xed\x64\xfb\xcf\xd6\xdf\x20\x76\x12\xbe\x80\xe0\xe4\x41\x1e\xb4\xc4\x03\xc0\x03\xd7\x7e\xd8\xef\xdd\x3b\xc1\xe0\x30\xa7\xd8\x6a\xb7\x7b\x9f\x3d\x8a\x0a\x53\xf2\x61\x90\x18\xf7\x5d\x93\xe5\xb9\xc3\xe0\x10\xf8\xe9\xfd\x92\x6e\xbb\x7f\x91\xc9\xb9\xd4\x78\x70\x51\x83\x5e\x71\xd2\x5d\xe6\xda\x4a\x04\xb6\xbb\xcf\xbf\xe2\x18\x7e\x34\x44\x19\x20\xf0\xd3\x5b\xa8\x2b\x4a\x8c\x7f\xfb\x66\xf3\xa3\xef\x48\xb6\xdf\x87\x65\x44\x69\x58\x48\xb5\x26\x8a\x36\x0d\x1e\x53\xe0\xc6\xbd\x7d\x6b\x4b\x3f\x8d\xe6\xad\x8d\x62\x2b\xc2\x87\x47\x17\xc7\xe7\xc3\x41\xd4\x57\xf9\x60\x14\x21\xc9\x8b\x63\x40\x97\xb1\x3a\xba\x29\x7c\xe7\xae\x00\xc3\xe7\x43\x53\x30\x3d\x8a\x88\x31\x6a\x38\xd8\x33\x86\xc1\xc8\xea\xf5\xb2\x77\x25\xeb\xb6\x27\x7b\x6e\xf5\x18\x8e\x5d\x31\xdd\x15\x02\x2d\x78\xae\xf5\xd0\xdb\xd5\x60\xdc\xc3\xbd\x6f\x56\x83\xf3\x41\xa7\xa8\x9d\x7b\xef\xce\x91\x9e\xe4\x64\x0f\xf5\xc0\x7a\xd9\xe0\x88\x3c\xa1\xf4\x8d\xf5\x9f\x61\x70\xc2\xd3\x0f\xad\x63\xd4\x09\xdb\xc7\xeb\x47\xa5\xec\xbf\xa4\x79\x40\xc4\x8c\x0e\x46\x91\xae\x33\xdf\xdc\x18\xbe\xec\x2e\x60\x2d\x98\x33\xde\xc3\x54\x70\x54\x50\x58\x12\xfb\x45\x45\x78\x50\x84\x3c\x92\x35\xda\xcb\xbc\x3b\xd5\x76\x6c\x05\x3e\x19\x75\xbd\xb1\x6f\xb4\x2d\xae\x7c\x5b\x78\x8d\x99\x76\x0d\x02\x68\xec\xdd\xb5\x83\x7c\xdb\xe7\xf5\xf7\x6f\x7b\xad\x9f\xce\x23\x86\x0e\x7b\xf7\xe9\xe6\xa9\x46\xcb\xc9\x6f\x45\xd7\xeb\x75\xe4\xdf\x76\xb8\x16\x6f\xd7\x89\x89\x49\xc5\xa2\xf7\x3a\x00\xa2\x37\x22\x07\x8a\x0b\x54\xf3\x1e\xfa\xa6\x3d\x93\xc4\xfe\x2b\xc6\x24\xf6\x1f\x6a\xff\x4f\x00\x00\x00\xff\xff\xf1\xa6\xb6\xb8\xb9\x2d\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( From eea996e4e1820d32a8ec82b03ff6bd17574770e7 Mon Sep 17 00:00:00 2001 From: baizhenxuan Date: Wed, 18 Oct 2017 17:16:12 +0800 Subject: [PATCH 220/272] whisper/shhclient: fix Version return type (#15306) --- whisper/shhclient/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whisper/shhclient/client.go b/whisper/shhclient/client.go index 61c1b7ab72..61b4775d95 100644 --- a/whisper/shhclient/client.go +++ b/whisper/shhclient/client.go @@ -45,8 +45,8 @@ func NewClient(c *rpc.Client) *Client { } // Version returns the Whisper sub-protocol version. -func (sc *Client) Version(ctx context.Context) (uint, error) { - var result uint +func (sc *Client) Version(ctx context.Context) (string, error) { + var result string err := sc.c.CallContext(ctx, &result, "shh_version") return result, err } From ba2201981a77438b0ff380bc2e75f7deb8066153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 20 Oct 2017 12:49:32 +0300 Subject: [PATCH 221/272] build: start shipping Ubuntu Artful Aardvark binaries --- build/ci.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ci.go b/build/ci.go index 6fe03db713..a4f5616bc7 100644 --- a/build/ci.go +++ b/build/ci.go @@ -120,7 +120,7 @@ var ( // Note: vivid is unsupported because there is no golang-1.6 package for it. // Note: wily is unsupported because it was officially deprecated on lanchpad. // Note: yakkety is unsupported because it was officially deprecated on lanchpad. - debDistros = []string{"trusty", "xenial", "zesty"} + debDistros = []string{"trusty", "xenial", "zesty", "artful"} ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) From 0900aae412ed11914fc698dd6ca5646ac4085d25 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Fri, 20 Oct 2017 12:22:06 +0200 Subject: [PATCH 222/272] cmd/evm: print stateroot in evm utility (#15341) --- cmd/evm/staterunner.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index 3a4cc51c03..071ea94ad0 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -94,7 +94,8 @@ func stateTestCmd(ctx *cli.Context) error { for _, st := range test.Subtests() { // Run the test and aggregate the result result := &StatetestResult{Name: key, Fork: st.Fork, Pass: true} - if state, err := test.Run(st, cfg); err != nil { + state, err := test.Run(st, cfg) + if err != nil { // Test failed, mark as so and dump any state to aid debugging result.Pass, result.Error = false, err.Error() if ctx.GlobalBool(DumpFlag.Name) && state != nil { @@ -102,6 +103,11 @@ func stateTestCmd(ctx *cli.Context) error { result.State = &dump } } + // print state root for evmlab tracing (already committed above, so no need to delete objects again + if ctx.GlobalBool(MachineFlag.Name) && state != nil { + fmt.Fprintf(os.Stderr, "{\"stateRoot\": \"%x\"}\n", state.IntermediateRoot(false)) + } + results = append(results, *result) // Print any structured logs collected From 0e7d019e0eb3a4929c504ac5899fbe55c4227f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 20 Oct 2017 12:34:43 +0300 Subject: [PATCH 223/272] core: fire tx event on replace, expand tests --- core/bloombits/matcher_test.go | 2 +- core/tx_pool.go | 5 + core/tx_pool_test.go | 188 ++++++++++++++++++++++++++++++++- 3 files changed, 191 insertions(+), 4 deletions(-) diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index f95d0ea9e0..2e15e7aac0 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -85,7 +85,7 @@ func TestWildcardMatcher(t *testing.T) { } // makeRandomIndexes generates a random filter system, composed on multiple filter -// criteria, each having one bloom list component for the address and arbitrarilly +// criteria, each having one bloom list component for the address and arbitrarily // many topic bloom list components. func makeRandomIndexes(lengths []int, max int) [][]bloomIndexes { res := make([][]bloomIndexes, len(lengths)) diff --git a/core/tx_pool.go b/core/tx_pool.go index 0ad7651795..a705e36d66 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -640,6 +640,10 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.journalTx(from, tx) log.Trace("Pooled new executable transaction", "hash", hash, "from", from, "to", tx.To()) + + // We've directly injected a replacement transaction, notify subsystems + go pool.txFeed.Send(TxPreEvent{tx}) + return old != nil, nil } // New transaction isn't replacing a pending one, push into queue @@ -729,6 +733,7 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T // Set the potentially new pending nonce and notify any subsystems of the new tx pool.beats[addr] = time.Now() pool.pendingState.SetNonce(addr, tx.Nonce()+1) + go pool.txFeed.Send(TxPreEvent{tx}) } diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 17d7368774..eec128cbaf 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -117,6 +117,28 @@ func validateTxPoolInternals(pool *TxPool) error { return nil } +// validateEvents checks that the correct number of transaction addition events +// were fired on the pool's event feed. +func validateEvents(events chan TxPreEvent, count int) error { + for i := 0; i < count; i++ { + select { + case <-events: + case <-time.After(time.Second): + return fmt.Errorf("event #%d not fired", i) + } + } + select { + case tx := <-events: + return fmt.Errorf("more than %d events fired: %v", count, tx.Tx) + + case <-time.After(50 * time.Millisecond): + // This branch should be "default", but it's a data race between goroutines, + // reading the event channel and pushng into it, so better wait a bit ensuring + // really nothing gets injected. + } + return nil +} + func deriveSender(tx *types.Transaction) (common.Address, error) { return types.Sender(types.HomesteadSigner{}, tx) } @@ -149,7 +171,9 @@ func (c *testChain) State() (*state.StateDB, error) { // This test simulates a scenario where a new block is imported during a // state reset and tests whether the pending state is in sync with the // block head event that initiated the resetState(). -func TestStateChangeDuringPoolReset(t *testing.T) { +func TestStateChangeDuringTransactionPoolReset(t *testing.T) { + t.Parallel() + var ( db, _ = ethdb.NewMemDatabase() key, _ = crypto.GenerateKey() @@ -201,6 +225,8 @@ func TestStateChangeDuringPoolReset(t *testing.T) { } func TestInvalidTransactions(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -236,6 +262,8 @@ func TestInvalidTransactions(t *testing.T) { } func TestTransactionQueue(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -287,7 +315,9 @@ func TestTransactionQueue(t *testing.T) { } } -func TestNegativeValue(t *testing.T) { +func TestTransactionNegativeValue(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -300,6 +330,8 @@ func TestNegativeValue(t *testing.T) { } func TestTransactionChainFork(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -328,6 +360,8 @@ func TestTransactionChainFork(t *testing.T) { } func TestTransactionDoubleNonce(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -376,7 +410,9 @@ func TestTransactionDoubleNonce(t *testing.T) { } } -func TestMissingNonce(t *testing.T) { +func TestTransactionMissingNonce(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -398,6 +434,8 @@ func TestMissingNonce(t *testing.T) { } func TestTransactionNonceRecovery(t *testing.T) { + t.Parallel() + const n = 10 pool, key := setupTxPool() defer pool.Stop() @@ -422,6 +460,8 @@ func TestTransactionNonceRecovery(t *testing.T) { // Tests that if an account runs out of funds, any pending and queued transactions // are dropped. func TestTransactionDropping(t *testing.T) { + t.Parallel() + // Create a test account and fund it pool, key := setupTxPool() defer pool.Stop() @@ -515,6 +555,8 @@ func TestTransactionDropping(t *testing.T) { // of fund), all consecutive (still valid, but not executable) transactions are // postponed back into the future queue to prevent broadcasting them. func TestTransactionPostponing(t *testing.T) { + t.Parallel() + // Create a test account and fund it pool, key := setupTxPool() defer pool.Stop() @@ -586,9 +628,68 @@ func TestTransactionPostponing(t *testing.T) { } } +// Tests that if the transaction pool has both executable and non-executable +// transactions from an origin account, filling the nonce gap moves all queued +// ones into the pending pool. +func TestTransactionGapFilling(t *testing.T) { + t.Parallel() + + // Create a test account and fund it + pool, key := setupTxPool() + defer pool.Stop() + + account, _ := deriveSender(transaction(0, big.NewInt(0), key)) + pool.currentState.AddBalance(account, big.NewInt(1000000)) + + // Keep track of transaction events to ensure all executables get announced + events := make(chan TxPreEvent, testTxPoolConfig.AccountQueue+5) + sub := pool.txFeed.Subscribe(events) + defer sub.Unsubscribe() + + // Create a pending and a queued transaction with a nonce-gap in between + if err := pool.AddRemote(transaction(0, big.NewInt(100000), key)); err != nil { + t.Fatalf("failed to add pending transaction: %v", err) + } + if err := pool.AddRemote(transaction(2, big.NewInt(100000), key)); err != nil { + t.Fatalf("failed to add queued transaction: %v", err) + } + pending, queued := pool.Stats() + if pending != 1 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 1) + } + if queued != 1 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) + } + if err := validateEvents(events, 1); err != nil { + t.Fatalf("original event firing failed: %v", err) + } + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } + // Fill the nonce gap and ensure all transactions become pending + if err := pool.AddRemote(transaction(1, big.NewInt(100000), key)); err != nil { + t.Fatalf("failed to add gapped transaction: %v", err) + } + pending, queued = pool.Stats() + if pending != 3 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) + } + if queued != 0 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) + } + if err := validateEvents(events, 2); err != nil { + t.Fatalf("gap-filling event firing failed: %v", err) + } + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } +} + // Tests that if the transaction count belonging to a single account goes above // some threshold, the higher transactions are dropped to prevent DOS attacks. func TestTransactionQueueAccountLimiting(t *testing.T) { + t.Parallel() + // Create a test account and fund it pool, key := setupTxPool() defer pool.Stop() @@ -632,6 +733,8 @@ func TestTransactionQueueGlobalLimitingNoLocals(t *testing.T) { } func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { + t.Parallel() + // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -782,6 +885,8 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { // above some threshold, as long as the transactions are executable, they are // accepted. func TestTransactionPendingLimiting(t *testing.T) { + t.Parallel() + // Create a test account and fund it pool, key := setupTxPool() defer pool.Stop() @@ -789,6 +894,11 @@ func TestTransactionPendingLimiting(t *testing.T) { account, _ := deriveSender(transaction(0, big.NewInt(0), key)) pool.currentState.AddBalance(account, big.NewInt(1000000)) + // Keep track of transaction events to ensure all executables get announced + events := make(chan TxPreEvent, testTxPoolConfig.AccountQueue+5) + sub := pool.txFeed.Subscribe(events) + defer sub.Unsubscribe() + // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil { @@ -804,6 +914,12 @@ func TestTransactionPendingLimiting(t *testing.T) { if len(pool.all) != int(testTxPoolConfig.AccountQueue+5) { t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), testTxPoolConfig.AccountQueue+5) } + if err := validateEvents(events, int(testTxPoolConfig.AccountQueue+5)); err != nil { + t.Fatalf("event firing failed: %v", err) + } + if err := validateTxPoolInternals(pool); err != nil { + t.Fatalf("pool internal state corrupted: %v", err) + } } // Tests that the transaction limits are enforced the same way irrelevant whether @@ -812,6 +928,8 @@ func TestTransactionQueueLimitingEquivalency(t *testing.T) { testTransactionLi func TestTransactionPendingLimitingEquivalency(t *testing.T) { testTransactionLimitingEquivalency(t, 0) } func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { + t.Parallel() + // Add a batch of transactions to a pool one by one pool1, key1 := setupTxPool() defer pool1.Stop() @@ -859,6 +977,8 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { // some hard threshold, the higher transactions are dropped to prevent DOS // attacks. func TestTransactionPendingGlobalLimiting(t *testing.T) { + t.Parallel() + // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -904,6 +1024,8 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { // Tests that if transactions start being capped, transactions are also removed from 'all' func TestTransactionCapClearsFromAll(t *testing.T) { + t.Parallel() + // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -937,6 +1059,8 @@ func TestTransactionCapClearsFromAll(t *testing.T) { // some hard threshold, if they are under the minimum guaranteed slot count then // the transactions are still kept. func TestTransactionPendingMinimumAllowance(t *testing.T) { + t.Parallel() + // Create the pool to test the limit enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -984,6 +1108,8 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { // // Note, local transactions are never allowed to be dropped. func TestTransactionPoolRepricing(t *testing.T) { + t.Parallel() + // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -992,6 +1118,11 @@ func TestTransactionPoolRepricing(t *testing.T) { pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() + // Keep track of transaction events to ensure all executables get announced + events := make(chan TxPreEvent, 32) + sub := pool.txFeed.Subscribe(events) + defer sub.Unsubscribe() + // Create a number of test accounts and fund them keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { @@ -1022,6 +1153,9 @@ func TestTransactionPoolRepricing(t *testing.T) { if queued != 3 { t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 3) } + if err := validateEvents(events, 4); err != nil { + t.Fatalf("original event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1035,6 +1169,9 @@ func TestTransactionPoolRepricing(t *testing.T) { if queued != 3 { t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 3) } + if err := validateEvents(events, 0); err != nil { + t.Fatalf("reprice event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1045,6 +1182,9 @@ func TestTransactionPoolRepricing(t *testing.T) { if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced { t.Fatalf("adding underpriced queued transaction error mismatch: have %v, want %v", err, ErrUnderpriced) } + if err := validateEvents(events, 0); err != nil { + t.Fatalf("post-reprice event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1056,6 +1196,9 @@ func TestTransactionPoolRepricing(t *testing.T) { if pending, _ = pool.Stats(); pending != 3 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) } + if err := validateEvents(events, 1); err != nil { + t.Fatalf("post-reprice local event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1064,6 +1207,8 @@ func TestTransactionPoolRepricing(t *testing.T) { // Tests that setting the transaction pool gas price to a higher value does not // remove local transactions. func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { + t.Parallel() + // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -1125,6 +1270,8 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { // // Note, local transactions are never allowed to be dropped. func TestTransactionPoolUnderpricing(t *testing.T) { + t.Parallel() + // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -1137,6 +1284,11 @@ func TestTransactionPoolUnderpricing(t *testing.T) { pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() + // Keep track of transaction events to ensure all executables get announced + events := make(chan TxPreEvent, 32) + sub := pool.txFeed.Subscribe(events) + defer sub.Unsubscribe() + // Create a number of test accounts and fund them keys := make([]*ecdsa.PrivateKey, 3) for i := 0; i < len(keys); i++ { @@ -1164,6 +1316,9 @@ func TestTransactionPoolUnderpricing(t *testing.T) { if queued != 1 { t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) } + if err := validateEvents(events, 3); err != nil { + t.Fatalf("original event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1188,6 +1343,9 @@ func TestTransactionPoolUnderpricing(t *testing.T) { if queued != 2 { t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2) } + if err := validateEvents(events, 2); err != nil { + t.Fatalf("additional event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1203,6 +1361,9 @@ func TestTransactionPoolUnderpricing(t *testing.T) { if queued != 2 { t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2) } + if err := validateEvents(events, 1); err != nil { + t.Fatalf("local event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1211,6 +1372,8 @@ func TestTransactionPoolUnderpricing(t *testing.T) { // Tests that the pool rejects replacement transactions that don't meet the minimum // price bump required. func TestTransactionReplacement(t *testing.T) { + t.Parallel() + // Create the pool to test the pricing enforcement with db, _ := ethdb.NewMemDatabase() statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -1219,6 +1382,11 @@ func TestTransactionReplacement(t *testing.T) { pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() + // Keep track of transaction events to ensure all executables get announced + events := make(chan TxPreEvent, 32) + sub := pool.txFeed.Subscribe(events) + defer sub.Unsubscribe() + // Create a test account to add transactions with key, _ := crypto.GenerateKey() pool.currentState.AddBalance(crypto.PubkeyToAddress(key.PublicKey), big.NewInt(1000000000)) @@ -1236,6 +1404,9 @@ func TestTransactionReplacement(t *testing.T) { if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(2), key)); err != nil { t.Fatalf("failed to replace original cheap pending transaction: %v", err) } + if err := validateEvents(events, 2); err != nil { + t.Fatalf("cheap replacement event firing failed: %v", err) + } if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(price), key)); err != nil { t.Fatalf("failed to add original proper pending transaction: %v", err) @@ -1246,6 +1417,9 @@ func TestTransactionReplacement(t *testing.T) { if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { t.Fatalf("failed to replace original proper pending transaction: %v", err) } + if err := validateEvents(events, 2); err != nil { + t.Fatalf("proper replacement event firing failed: %v", err) + } // Add queued transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), key)); err != nil { t.Fatalf("failed to add original queued transaction: %v", err) @@ -1266,6 +1440,10 @@ func TestTransactionReplacement(t *testing.T) { if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { t.Fatalf("failed to replace original queued transaction: %v", err) } + + if err := validateEvents(events, 0); err != nil { + t.Fatalf("queued replacement event firing failed: %v", err) + } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } @@ -1277,6 +1455,8 @@ func TestTransactionJournaling(t *testing.T) { testTransactionJournaling func TestTransactionJournalingNoLocals(t *testing.T) { testTransactionJournaling(t, true) } func testTransactionJournaling(t *testing.T, nolocals bool) { + t.Parallel() + // Create a temporary file for the journal file, err := ioutil.TempFile("", "") if err != nil { @@ -1335,6 +1515,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { pool.Stop() statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + pool = NewTxPool(config, params.TestChainConfig, blockchain) pending, queued = pool.Stats() @@ -1358,6 +1539,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { pool.lockedReset(nil, nil) time.Sleep(2 * config.Rejournal) pool.Stop() + statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} pool = NewTxPool(config, params.TestChainConfig, blockchain) From 65738c1eb37c789294124cc9b4bbe6d55d50a77f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 20 Oct 2017 14:01:38 +0300 Subject: [PATCH 224/272] event: fix datarace between Subscribe and Send --- event/feed.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/event/feed.go b/event/feed.go index b1b597f17b..78fa3d98d8 100644 --- a/event/feed.go +++ b/event/feed.go @@ -127,6 +127,8 @@ func (f *Feed) remove(sub *feedSub) { // Send delivers to all subscribed channels simultaneously. // It returns the number of subscribers that the value was sent to. func (f *Feed) Send(value interface{}) (nsent int) { + rvalue := reflect.ValueOf(value) + f.once.Do(f.init) <-f.sendLock @@ -134,14 +136,14 @@ func (f *Feed) Send(value interface{}) (nsent int) { f.mu.Lock() f.sendCases = append(f.sendCases, f.inbox...) f.inbox = nil - f.mu.Unlock() - // Set the sent value on all channels. - rvalue := reflect.ValueOf(value) if !f.typecheck(rvalue.Type()) { f.sendLock <- struct{}{} panic(feedTypeError{op: "Send", got: rvalue.Type(), want: f.etype}) } + f.mu.Unlock() + + // Set the sent value on all channels. for i := firstSubSendCase; i < len(f.sendCases); i++ { f.sendCases[i].Send = rvalue } From 0af1ab0c86975201349d92e0943485c3534d8c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 20 Oct 2017 14:31:29 +0300 Subject: [PATCH 225/272] core: avoid warning when loading the transaction journal --- core/tx_journal.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/tx_journal.go b/core/tx_journal.go index 94a9ff9b8c..3fd8ece49e 100644 --- a/core/tx_journal.go +++ b/core/tx_journal.go @@ -31,6 +31,15 @@ import ( // into the journal, but no such file is currently open. var errNoActiveJournal = errors.New("no active journal") +// devNull is a WriteCloser that just discards anything written into it. Its +// goal is to allow the transaction journal to write into a fake journal when +// loading transactions on startup without printing warnings due to no file +// being readt for write. +type devNull struct{} + +func (*devNull) Write(p []byte) (n int, err error) { return len(p), nil } +func (*devNull) Close() error { return nil } + // txJournal is a rotating log of transactions with the aim of storing locally // created transactions to allow non-executed ones to survive node restarts. type txJournal struct { @@ -59,6 +68,10 @@ func (journal *txJournal) load(add func(*types.Transaction) error) error { } defer input.Close() + // Temporarilly discard any journal additions (don't double add on load) + journal.writer = new(devNull) + defer func() { journal.writer = nil }() + // Inject all transactions from the journal into the pool stream := rlp.NewStream(input, 0) total, dropped := 0, 0 From ea5f2da39ad198e58107a79214419e31988c5e5a Mon Sep 17 00:00:00 2001 From: Anton Markelov Date: Tue, 24 Oct 2017 16:55:20 +1000 Subject: [PATCH 226/272] README: add docker RPC access docs (#15362) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a13476517e..57b0ea92bc 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,8 @@ docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \ This will start geth in fast sync mode with a DB memory allowance of 512MB just as the above command does. It will also create a persistent volume in your home directory for saving your blockchain as well as map the default ports. There is also an `alpine` tag available for a slim version of the image. +Do not forget `--rpcaddr 0.0.0.0`, if you want to access RPC from other containers and/or hosts. By default, `geth` binds to the local interface and RPC endpoints is not accessible from the outside. + ### Programatically interfacing Geth nodes As a developer, sooner rather than later you'll want to start interacting with Geth and the Ethereum From 6d6a5a93370371a33fb815d7ae47b60c7021c86a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 24 Oct 2017 13:40:42 +0300 Subject: [PATCH 227/272] cmd, consensus, core, miner: instatx clique for --dev (#15323) * cmd, consensus, core, miner: instatx clique for --dev * cmd, consensus, clique: support configurable --dev block times * cmd, core: allow --dev to use persistent storage too --- accounts/abi/bind/backends/simulated.go | 2 +- cmd/geth/accountcmd_test.go | 14 ++++---- cmd/geth/config.go | 2 +- cmd/geth/main.go | 5 +-- cmd/geth/usage.go | 7 +++- cmd/utils/flags.go | 48 +++++++++++++++++-------- consensus/clique/clique.go | 12 +++++-- consensus/clique/snapshot_test.go | 2 +- console/console_test.go | 2 +- core/chain_makers.go | 2 +- core/genesis.go | 36 +++++++++++++------ core/genesis_alloc.go | 1 - core/genesis_test.go | 2 +- miner/worker.go | 5 +++ params/config.go | 25 +++++++------ params/config_test.go | 8 ++--- 16 files changed, 115 insertions(+), 58 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 0621e81c2b..e1d5745caa 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -59,7 +59,7 @@ type SimulatedBackend struct { // for testing purposes. func NewSimulatedBackend(alloc core.GenesisAlloc) *SimulatedBackend { database, _ := ethdb.NewMemDatabase() - genesis := core.Genesis{Config: params.AllProtocolChanges, Alloc: alloc} + genesis := core.Genesis{Config: params.AllEthashProtocolChanges, Alloc: alloc} genesis.MustCommit(database) blockchain, _ := core.NewBlockChain(database, genesis.Config, ethash.NewFaker(), vm.Config{}) backend := &SimulatedBackend{database: database, blockchain: blockchain, config: genesis.Config} diff --git a/cmd/geth/accountcmd_test.go b/cmd/geth/accountcmd_test.go index 66e3e02a4e..3ea22ccfab 100644 --- a/cmd/geth/accountcmd_test.go +++ b/cmd/geth/accountcmd_test.go @@ -134,7 +134,7 @@ Fatal: could not decrypt key with given passphrase func TestUnlockFlag(t *testing.T) { datadir := tmpDatadirWithKeystore(t) geth := runGeth(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a", "js", "testdata/empty.js") geth.Expect(` @@ -158,7 +158,7 @@ Passphrase: {{.InputLine "foobar"}} func TestUnlockFlagWrongPassword(t *testing.T) { datadir := tmpDatadirWithKeystore(t) geth := runGeth(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a") defer geth.ExpectExit() geth.Expect(` @@ -177,7 +177,7 @@ Fatal: Failed to unlock account f466859ead1932d743d622cb74fc058882e8648a (could func TestUnlockFlagMultiIndex(t *testing.T) { datadir := tmpDatadirWithKeystore(t) geth := runGeth(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "0,2", "js", "testdata/empty.js") geth.Expect(` @@ -204,7 +204,7 @@ Passphrase: {{.InputLine "foobar"}} func TestUnlockFlagPasswordFile(t *testing.T) { datadir := tmpDatadirWithKeystore(t) geth := runGeth(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--password", "testdata/passwords.txt", "--unlock", "0,2", "js", "testdata/empty.js") geth.ExpectExit() @@ -224,7 +224,7 @@ func TestUnlockFlagPasswordFile(t *testing.T) { func TestUnlockFlagPasswordFileWrongPassword(t *testing.T) { datadir := tmpDatadirWithKeystore(t) geth := runGeth(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--password", "testdata/wrong-passwords.txt", "--unlock", "0,2") defer geth.ExpectExit() geth.Expect(` @@ -235,7 +235,7 @@ Fatal: Failed to unlock account 0 (could not decrypt key with given passphrase) func TestUnlockFlagAmbiguous(t *testing.T) { store := filepath.Join("..", "..", "accounts", "keystore", "testdata", "dupes") geth := runGeth(t, - "--keystore", store, "--nat", "none", "--nodiscover", "--dev", + "--keystore", store, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a", "js", "testdata/empty.js") defer geth.ExpectExit() @@ -273,7 +273,7 @@ In order to avoid this warning, you need to remove the following duplicate key f func TestUnlockFlagAmbiguousWrongPassword(t *testing.T) { store := filepath.Join("..", "..", "accounts", "keystore", "testdata", "dupes") geth := runGeth(t, - "--keystore", store, "--nat", "none", "--nodiscover", "--dev", + "--keystore", store, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a") defer geth.ExpectExit() diff --git a/cmd/geth/config.go b/cmd/geth/config.go index d3600f1416..d55a5e08d8 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -155,7 +155,7 @@ func makeFullNode(ctx *cli.Context) *node.Node { // Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode shhEnabled := enableWhisper(ctx) - shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DevModeFlag.Name) + shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DeveloperFlag.Name) if shhEnabled || shhAutoEnabled { if ctx.GlobalIsSet(utils.WhisperMaxMessageSizeFlag.Name) { cfg.Shh.MaxMessageSize = uint32(ctx.Int(utils.WhisperMaxMessageSizeFlag.Name)) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 88f3528f39..8bd27b5c6a 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -99,7 +99,8 @@ var ( utils.NetrestrictFlag, utils.NodeKeyFileFlag, utils.NodeKeyHexFlag, - utils.DevModeFlag, + utils.DeveloperFlag, + utils.DeveloperPeriodFlag, utils.TestnetFlag, utils.RinkebyFlag, utils.VMEnableDebugFlag, @@ -270,7 +271,7 @@ func startNode(ctx *cli.Context, stack *node.Node) { } }() // Start auxiliary services if enabled - if ctx.GlobalBool(utils.MiningEnabledFlag.Name) { + if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) { // Mining only makes sense if a full Ethereum node is running var ethereum *eth.Ethereum if err := stack.Service(ðereum); err != nil { diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 80861d8525..5bb2255f3b 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -72,7 +72,6 @@ var AppHelpFlagGroups = []flagGroup{ utils.NetworkIdFlag, utils.TestnetFlag, utils.RinkebyFlag, - utils.DevModeFlag, utils.SyncModeFlag, utils.EthStatsURLFlag, utils.IdentityFlag, @@ -81,6 +80,12 @@ var AppHelpFlagGroups = []flagGroup{ utils.LightKDFFlag, }, }, + {Name: "DEVELOPER CHAIN", + Flags: []cli.Flag{ + utils.DeveloperFlag, + utils.DeveloperPeriodFlag, + }, + }, { Name: "ETHASH", Flags: []cli.Flag{ diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index bfef619f6c..a996b9d0a4 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -137,9 +137,13 @@ var ( Name: "rinkeby", Usage: "Rinkeby network: pre-configured proof-of-authority test network", } - DevModeFlag = cli.BoolFlag{ + DeveloperFlag = cli.BoolFlag{ Name: "dev", - Usage: "Developer mode: pre-configured private network with several debugging flags", + Usage: "Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled", + } + DeveloperPeriodFlag = cli.IntFlag{ + Name: "dev.period", + Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", } IdentityFlag = cli.StringFlag{ Name: "identity", @@ -796,7 +800,7 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) { cfg.NetRestrict = list } - if ctx.GlobalBool(DevModeFlag.Name) { + if ctx.GlobalBool(DeveloperFlag.Name) { // --dev mode can't use p2p networking. cfg.MaxPeers = 0 cfg.ListenAddr = ":0" @@ -817,8 +821,8 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { switch { case ctx.GlobalIsSet(DataDirFlag.Name): cfg.DataDir = ctx.GlobalString(DataDirFlag.Name) - case ctx.GlobalBool(DevModeFlag.Name): - cfg.DataDir = filepath.Join(os.TempDir(), "ethereum_dev_mode") + case ctx.GlobalBool(DeveloperFlag.Name): + cfg.DataDir = "" // unless explicitly requested, use memory databases case ctx.GlobalBool(TestnetFlag.Name): cfg.DataDir = filepath.Join(node.DefaultDataDir(), "testnet") case ctx.GlobalBool(RinkebyFlag.Name): @@ -924,7 +928,7 @@ func SetShhConfig(ctx *cli.Context, stack *node.Node, cfg *whisper.Config) { // SetEthConfig applies eth-related command line flags to the config. func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { // Avoid conflicting network flags - checkExclusive(ctx, DevModeFlag, TestnetFlag, RinkebyFlag) + checkExclusive(ctx, DeveloperFlag, TestnetFlag, RinkebyFlag) checkExclusive(ctx, FastSyncFlag, LightModeFlag, SyncModeFlag) ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) @@ -985,14 +989,30 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.NetworkId = 4 } cfg.Genesis = core.DefaultRinkebyGenesisBlock() - case ctx.GlobalBool(DevModeFlag.Name): - cfg.Genesis = core.DevGenesisBlock() - if !ctx.GlobalIsSet(GasPriceFlag.Name) { - cfg.GasPrice = new(big.Int) + case ctx.GlobalBool(DeveloperFlag.Name): + // Create new developer account or reuse existing one + var ( + developer accounts.Account + err error + ) + if accs := ks.Accounts(); len(accs) > 0 { + developer = ks.Accounts()[0] + } else { + developer, err = ks.NewAccount("") + if err != nil { + Fatalf("Failed to create developer account: %v", err) + } } - cfg.PowTest = true - } + if err := ks.Unlock(developer, ""); err != nil { + Fatalf("Failed to unlock developer account: %v", err) + } + log.Info("Using developer account", "address", developer.Address) + cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer.Address) + if !ctx.GlobalIsSet(GasPriceFlag.Name) { + cfg.GasPrice = big.NewInt(1) + } + } // TODO(fjl): move trie cache generations into config if gen := ctx.GlobalInt(TrieCacheGenFlag.Name); gen > 0 { state.MaxTrieCacheGen = uint16(gen) @@ -1077,8 +1097,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { genesis = core.DefaultTestnetGenesisBlock() case ctx.GlobalBool(RinkebyFlag.Name): genesis = core.DefaultRinkebyGenesisBlock() - case ctx.GlobalBool(DevModeFlag.Name): - genesis = core.DevGenesisBlock() + case ctx.GlobalBool(DeveloperFlag.Name): + Fatalf("Developer chains are ephemeral") } return genesis } diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index 8d6cf653d5..6892d83906 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -125,6 +125,11 @@ var ( // errUnauthorized is returned if a header is signed by a non-authorized entity. errUnauthorized = errors.New("unauthorized") + + // errWaitTransactions is returned if an empty block is attempted to be sealed + // on an instant chain (0 second period). It's important to refuse these as the + // block reward is zero, so an empty block just bloats the chain... fast. + errWaitTransactions = errors.New("waiting for transactions") ) // SignerFn is a signer callback function to request a hash to be signed by a @@ -211,9 +216,6 @@ func New(config *params.CliqueConfig, db ethdb.Database) *Clique { if conf.Epoch == 0 { conf.Epoch = epochLength } - if conf.Period == 0 { - conf.Period = blockPeriod - } // Allocate the snapshot caches and create the engine recents, _ := lru.NewARC(inmemorySnapshots) signatures, _ := lru.NewARC(inmemorySignatures) @@ -599,6 +601,10 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, stop <-ch if number == 0 { return nil, errUnknownBlock } + // For 0-period chains, refuse to seal empty blocks (no reward but would spin sealing) + if c.config.Period == 0 && len(block.Transactions()) == 0 { + return nil, errWaitTransactions + } // Don't hold the signer fields for the entire sealing procedure c.lock.RLock() signer, signFn := c.signer, c.signFn diff --git a/consensus/clique/snapshot_test.go b/consensus/clique/snapshot_test.go index a1717d799f..8b51e6e094 100644 --- a/consensus/clique/snapshot_test.go +++ b/consensus/clique/snapshot_test.go @@ -74,7 +74,7 @@ type testerChainReader struct { db ethdb.Database } -func (r *testerChainReader) Config() *params.ChainConfig { return params.AllProtocolChanges } +func (r *testerChainReader) Config() *params.ChainConfig { return params.AllCliqueProtocolChanges } func (r *testerChainReader) CurrentHeader() *types.Header { panic("not supported") } func (r *testerChainReader) GetHeader(common.Hash, uint64) *types.Header { panic("not supported") } func (r *testerChainReader) GetBlock(common.Hash, uint64) *types.Block { panic("not supported") } diff --git a/console/console_test.go b/console/console_test.go index 8ac499bd12..a159b62bbf 100644 --- a/console/console_test.go +++ b/console/console_test.go @@ -94,7 +94,7 @@ func newTester(t *testing.T, confOverride func(*eth.Config)) *tester { t.Fatalf("failed to create node: %v", err) } ethConf := ð.Config{ - Genesis: core.DevGenesisBlock(), + Genesis: core.DeveloperGenesisBlock(15, common.Address{}), Etherbase: common.HexToAddress(testAddress), PowTest: true, } diff --git a/core/chain_makers.go b/core/chain_makers.go index dd3e2fb192..59af633dfd 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -235,7 +235,7 @@ func newCanonical(n int, full bool) (ethdb.Database, *BlockChain, error) { db, _ := ethdb.NewMemDatabase() genesis := gspec.MustCommit(db) - blockchain, _ := NewBlockChain(db, params.AllProtocolChanges, ethash.NewFaker(), vm.Config{}) + blockchain, _ := NewBlockChain(db, params.AllEthashProtocolChanges, ethash.NewFaker(), vm.Config{}) // Create and inject the requested chain if n == 0 { return db, blockchain, nil diff --git a/core/genesis.go b/core/genesis.go index fd6ed61159..26b1c9f63f 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -151,7 +151,7 @@ func (e *GenesisMismatchError) Error() string { // The returned chain configuration is never nil. func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) { if genesis != nil && genesis.Config == nil { - return params.AllProtocolChanges, common.Hash{}, errGenesisNoConfig + return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig } // Just commit the new block if there is no stored genesis block. @@ -216,7 +216,7 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { case ghash == params.TestnetGenesisHash: return params.TestnetChainConfig default: - return params.AllProtocolChanges + return params.AllEthashProtocolChanges } } @@ -285,7 +285,7 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { } config := g.Config if config == nil { - config = params.AllProtocolChanges + config = params.AllEthashProtocolChanges } return block, WriteChainConfig(db, block.Hash(), config) } @@ -342,14 +342,30 @@ func DefaultRinkebyGenesisBlock() *Genesis { } } -// DevGenesisBlock returns the 'geth --dev' genesis block. -func DevGenesisBlock() *Genesis { +// DeveloperGenesisBlock returns the 'geth --dev' genesis block. Note, this must +// be seeded with the +func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { + // Override the default period to the user requested one + config := *params.AllCliqueProtocolChanges + config.Clique.Period = period + + // Assemble and return the genesis with the precompiles and faucet pre-funded return &Genesis{ - Config: params.AllProtocolChanges, - Nonce: 42, - GasLimit: 4712388, - Difficulty: big.NewInt(131072), - Alloc: decodePrealloc(devAllocData), + Config: &config, + ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, 65)...), + GasLimit: 6283185, + Difficulty: big.NewInt(1), + Alloc: map[common.Address]GenesisAccount{ + common.BytesToAddress([]byte{1}): GenesisAccount{Balance: big.NewInt(1)}, // ECRecover + common.BytesToAddress([]byte{2}): GenesisAccount{Balance: big.NewInt(1)}, // SHA256 + common.BytesToAddress([]byte{3}): GenesisAccount{Balance: big.NewInt(1)}, // RIPEMD + common.BytesToAddress([]byte{4}): GenesisAccount{Balance: big.NewInt(1)}, // Identity + common.BytesToAddress([]byte{5}): GenesisAccount{Balance: big.NewInt(1)}, // ModExp + common.BytesToAddress([]byte{6}): GenesisAccount{Balance: big.NewInt(1)}, // ECAdd + common.BytesToAddress([]byte{7}): GenesisAccount{Balance: big.NewInt(1)}, // ECScalarMul + common.BytesToAddress([]byte{8}): GenesisAccount{Balance: big.NewInt(1)}, // ECPairing + faucet: GenesisAccount{Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}, + }, } } diff --git a/core/genesis_alloc.go b/core/genesis_alloc.go index ce3652e0df..6ba711cfc6 100644 --- a/core/genesis_alloc.go +++ b/core/genesis_alloc.go @@ -23,4 +23,3 @@ package core const mainnetAllocData = "\xfa\x04]X\u0793\r\x83b\x011\x8e\u0189\x9agT\x06\x908'\x80t2\x80\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0793\x17bC\x0e\xa9\u00e2nWI\xaf\xdbp\xda_x\u077b\x8c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0793\x1d\x14\x80K9\x9cn\xf8\x0edWoev`\x80O\xec\v\x89\u3bb5sr@\xa0\x00\x00\u07932@5\x87\x94{\x9f\x15b*h\xd1\x04\xd5M3\xdb\xd1\u0349\x043\x87Oc,\xc6\x00\x00\u0793I~\x92\xcd\xc0\xe0\xb9c\xd7R\xb2)j\u02c7\u0682\x8b$\x89\n\x8fd\x9f\xe7\xc6\x18\x00\x00\u0793K\xfb\xe1Tk\xc6\xc6[\\~\xaaU0K8\xbb\xfe\xc6\u04c9lk\x93[\x8b\xbd@\x00\x00\u0793Z\x9c\x03\xf6\x9d\x17\xd6l\xbb\x8a\xd7!\x00\x8a\x9e\xbb\xb86\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u0793]\x0e\xe8\x15^\xc0\xa6\xffh\bU,\xa5\xf1k\xb5\xbe2:\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u0793v\"\xd8J#K\xb8\xb0x#\x0f\u03c4\xb6z\u9a2c\xae\x89%\xe1\xccQ\x99R\xf8\x00\x00\u0793{\x9f\xc3\x19\x05\xb4\x99K\x04\xc9\xe2\xcf\xdc^'pP?B\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u0793\u007fJ#\xca\x00\xcd\x04=%\u0088\x8c\x1a\xa5h\x8f\x81\xa3D\x89)\xf0\xa9[\xfb\xf7)\x00\x00\u0793\x869\u06bb\u3bac\x88{]\xc0\xe4>\x13\xbc\u0487\xd7l\x89\x10\xd0\xe3\xc8}n,\x00\x00\u0793\x89P\x86y\xab\xf8\xc7\x1b\xf6x\x16\x87\x12\x0e>j\x84XM\x89a\x94\x04\x9f0\xf7 \x00\x00\u0793\x8f\xc7\u02ed\xff\xbd\r\u007f\xe4O\x8d\xfd`\xa7\x9dr\x1a\x1c\x9c\x8965\u026d\xc5\u07a0\x00\x00\u0793\x95`\xa3\xdebxh\xf9\x1f\xa8\xbf\xe1\xc1\xb7\xaf\xaf\b\x18k\x89\x1cg\xf5\xf7\xba\xa0\xb0\x00\x00\u0793\x96\x97G\xf7\xa5\xb3\x06E\xfe\x00\xe4I\x01CZ\xce$\xcc7\x89\\(=A\x03\x94\x10\x00\x00\u0793\x9am}\xb3&g\x9bw\xc9\x03\x91\xa7Gm#\x8f;\xa3>\x89\n\xdaUGK\x814\x00\x00\u0793\x9e\xef\n\b\x86\x05n?i!\x18S\xb9\xb7E\u007f7\x82\u4262\xa8x\x06\x9b(\xe0\x00\x00\u0793\x9f\xdb\xf4N\x1fJcb\xb7i\u00daG_\x95\xa9l+\u01c9\x1e\x93\x12\x83\xcc\xc8P\x00\x00\u07d3\xa5y\u007fR\xc9\u054f\x18\x9f6\xb1\xd4]\x1b\xf6\x04\x1f/k\x8a\x01'\u0473F\x1a\xcd\x1a\x00\x00\u0793\xaaS\x81\xb2\x13\x8e\xbe\xff\xc1\x91\xd5\xd8\u00d1u;p\x98\u04895\xab\xb0\x9f\xfe\u07b6\x80\x00\u0793\xaa\xda%\xea\"\x86p\x9a\xbbB-A\x92?\u04c0\xcd\x04\u01c9#=\xf3)\x9far\x00\x00\u0793\xac\xbf\xb2\xf2ZT\x85\xc79\xefp\xa4N\xee\xeb|e\xa6o\x89\x05k\xc7^-c\x10\x00\x00\u07d3\xac\xc6\xf0\x82\xa4B\x82\x87d\xd1\x1fX\u0589J\xe4\b\xf0s\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u0793\xb2w\xb0\x99\xa8\xe8f\xca\x0e\xc6[\u02c7(O\xd1B\xa5\x82\x89j\xcb=\xf2~\x1f\x88\x00\x00\u0753\xbd\xd4\x01:\xa3\x1c\x04al+\xc9x_'\x88\xf9\x15g\x9b\x88\xb9\xf6]\x00\xf6<\x00\x00\u0793\xc2}c\xfd\xe2K\x92\xee\x8a\x1e~\xd5\xd2m\x8d\xc5\xc8;\x03\x89lk\x93[\x8b\xbd@\x00\x00\u0553\xc4\x0f\xe2\tT#P\x9b\x9f\u0677T21X\xaf#\x10\xf3\x80\u0793\xd7^\xd6\fwO\x8b:ZQs\xfb\x183\xadq\x05\xa2\u0649l\xb7\xe7Hg\xd5\xe6\x00\x00\u07d3\u05cd\x89\xb3_G'\x16\xec\xea\xfe\xbf`\x05'\u04e1\xf9i\x8a\x05\xe0T\x9c\x962\xe1\xd8\x00\x00\u0793\xda\xe2{5\v\xae \xc5e!$\xaf]\x8b\\\xba\x00\x1e\xc1\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u0793\xdc\x01\xcb\xf4Ix\xa4.\x8d\xe8\xe46\xed\xf9B\x05\u03f6\xec\x89O\x0f\xeb\xbc\u068c\xb4\x00\x00\u07d3\u607c-\x10\xdbb\u0785\x84\x83$I\"P4\x8e\x90\xbf\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d3\xf4c\xe17\xdc\xf6%\xfb\U000fc8de\u0298\u04b9h\xcf\u007f\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\x01\x00\a9K\x8bue\xa1e\x8a\xf8\x8c\xe4cI\x915\u05b7\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x01\r\xf1\xdfK\xed#v\r-\x1c\x03x\x15\x86\xdd\xf7\x91\x8eT\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\x01\x0fJ\x98\u07e1\xd9y\x9b\xf5\u01d6\xfbU\x0e\xfb\xe7\xec\xd8w\x8a\x01\xb2\xf2\x92#b\x92\xc7\x00\x00\u07d4\x01\x15PW\x00/k\r\x18\xac\xb98\x8d;\xc8\x12\x9f\x8fz \x89H\xa4\xa9\x0f\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x01k`\xbbmg\x92\x8c)\xfd\x03\x13\xc6f\u068f\x16\x98\xd9\u0149lk\x93[\x8b\xbd@\x00\x00\u07d4\x01l\x85\xe1a;\x90\x0f\xa3W\xb8(;\x12\x0ee\xae\xfc\xdd\b\x89+]\x97\x84\xa9|\xd5\x00\x00\u07d4\x01\x84\x92H\x8b\xa1\xa2\x924\"G\xb3\x18U\xa5Y\x05\xfe\xf2i\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x01\x8f \xa2{'\xecD\x1a\xf7#\xfd\x90\x99\xf2\u02f7\x9dbc\x89uy*\x8a\xbd\xef|\x00\x00\u07d4\x01\x91\xebT~{\xf6\x97k\x9b\x1bWuFv\x1d\xe6V\"\xe2\x89lkLM\xa6\u077e\x00\x00\u07d4\x01\x9dp\x95y\xffK\xc0\x9f\xdc\xdd\xe41\xdc\x14G\xd2\xc2`\xbc\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x01\xa2Z_Z\xf0\x16\x9b0\x86L;\xe4\xd7V<\xcdD\xf0\x9e\x89M\x85<\x8f\x89\b\x98\x00\x00\xe0\x94\x01\xa7\xd9\xfa}\x0e\xb1\x18\\g\xe5M\xa8<.u\xdbi\u37ca\x01\x9dJ\xdd\xd0\u063c\x96\x00\x00\u07d4\x01\xa8\x18\x13ZAB\x10\xc3|b\xb6%\xac\xa1\xa5F\x11\xac6\x89\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\x01\xb1\xca\xe9\x1a;\x95Y\xaf\xb3<\xdcmh\x94B\xfd\xbf\xe07\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x01\xb5\xb5\xbcZ\x11\u007f\xa0\x8b4\xed\x1d\xb9D\x06\bYz\xc5H\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x01\xbb\xc1Og\xaf\x069\xaa\xb1D\x1ej\b\xd4\xceqb\t\x0f\x89F\xfc\xf6\x8f\xf8\xbe\x06\x00\x00\xe0\x94\x01\xd08\x15\xc6\x1fAkq\xa2a\n-\xab\xa5\x9f\xf6\xa6\xde[\x8a\x02\x05\xdf\xe5\v\x81\xc8.\x00\x00\u07d4\x01\u0559\xee\r_\x8c8\xab-9.,e\xb7L<\xe3\x18 \x89\x1b\xa5\xab\xf9\xe7y8\x00\x00\u07d4\x01\xe4\x05!\x12%0\u066c\x91\x11<\x06\xa0\x19\vmc\x85\v\x89Hz\x9a0E9D\x00\x00\u07d4\x01\xe6A]X{\x06T\x90\xf1\xed\u007f!\xd6\xe0\xf3\x86\xeegG\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x01\xe8d\xd3Tt\x1bB>oB\x85\x17$F\x8ct\xf5\xaa\x9c\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x01\xed_\xba\x8d.\xabg:\xec\x04-0\xe4\xe8\xa6\x11\xd8\xc5Z\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x01\xfb\x8e\xc1$%\xa0O\x81>F\xc5L\x05t\x8c\xa6\xb2\x9a\xa9\x89\x0e\x15s\x03\x85F|\x00\x00\u07d4\x01\xff\x1e\xb1\u07adP\xa7\xf2\xf9c\x8f\xde\xe6\xec\xcf:{*\u0209 \x86\xac5\x10R`\x00\x00\u07d4\x02\x03b\u00ed\xe8x\u0290\u05b2\u0609\xa4\xccU\x10\xee\xd5\xf3\x898\x88\xe8\xb3\x11\xad\xb3\x80\x00\u07d4\x02\x03\xae\x01\xd4\xc4\x1c\xae\x18e\xe0K\x1f[S\xcd\xfa\xec\xae1\x896\x89\xcd\u03b2\x8c\xd7\x00\x00\u07d4\x02\b\x93a\xa3\xfetQ\xfb\x1f\x87\xf0\x1a-\x86fS\xdc\v\a\x89\x02*\xc7H2\xb5\x04\x00\x00\u07d4\x02\x1fi\x04=\xe8\x8cI\x17\xca\x10\xf1\x84(\x97\xee\xc0X\x9c|\x89kD\u03f8\x14\x87\xf4\x00\x00\u07d4\x02)\x0f\xb5\xf9\xa5\x17\xf8(E\xac\xde\xca\x0f\xc8F\x03\x9b\xe23\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x029\xb4\xf2\x1f\x8e\x05\xcd\x01Q++\xe7\xa0\xe1\x8am\x97F\a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x02Gr\x12\xff\xddu\xe5\x15VQ\xb7e\x06\xb1dfq\xa1\xeb\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\x02J\t\x8a\xe7\x02\xbe\xf5@l\x9c\"\xb7\x8b\xd4\xeb,\u01e2\x93\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x02K\xdd,{\xfdP\x0e\xe7@O\u007f\xb3\xe9\xfb1\xdd \xfb\u0449\t\xc2\x00vQ\xb2P\x00\x00\u07d4\x02Sg\x96\x03\x04\xbe\xee4Y\x11\x18\xe9\xac-\x13X\xd8\x02\x1a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x02V\x14\x9f[Pc\xbe\xa1N\x15f\x1f\xfbX\xf9\xb4Y\xa9W\x89&)\xf6n\fS\x00\x00\x00\u07d4\x02`=z;\xb2\x97\xc6|\x87~]4\xfb\u0579\x13\xd4\xc6:\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x02a\xad:\x17*\xbf\x13\x15\xf0\xff\xec2p\x98j\x84\t\xcb%\x89\v\b!;\u03cf\xfe\x00\x00\u07d4\x02d2\xaf7\xdcQ\x13\xf1\xf4mH\nM\u0c80R#~\x89\x13I\xb7\x86\xe4\v\xfc\x00\x00\u07d4\x02f\xab\x1ck\x02\x16#\v\x93\x95D=_\xa7^hEh\u018965\u026d\xc5\u07a0\x00\x00\u07d4\x02u\x1d\u018c\xb5\xbdsp'\xab\xf7\u0777s\x90\xcdw\xc1k\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x02w\x8e9\x0f\xa1u\x10\xa3B\x8a\xf2\x87\fBsT}8l\x8a\x03lw\x80\x18\x8b\xf0\xef\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x037|\x0eUkd\x01\x03(\x9aa\x89\u1baecI4g\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x03IcM\u00a9\xe8\f?w!\xee+PF\xae\xaa\xed\xfb\xb5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x03U\xbc\xac\xbd!D\x1e\x95\xad\xee\xdc0\xc1r\x18\u0224\b\u0389\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x03n\xef\xf5\xba\x90\xa6\x87\x9a\x14\xdf\xf4\xc5\x04;\x18\xca\x04`\u0249\x05k\xc7^-c\x10\x00\x00\xe0\x94\x03qKA\u04a6\xf7Q\x00\x8e\xf8\xddM+)\xae\u02b8\xf3n\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x03r\xe8RX.\t44J\x0f\xed!x0M\xf2]F(\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x03r\xeeU\b\xbf\x81c\xed(N^\xef\x94\xceMsg\xe5\"\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x03}\xd0V\xe7\xfd\xbdd\x1d\xb5\xb6\xbe\xa2\xa8x\n\x83\xfa\u1009\a\x96\xe3\xea?\x8a\xb0\x00\x00\xe0\x94\x03\x83#\xb1\x84\xcf\xf7\xa8*\xe2\u1f67y?\xe41\x9c\xa0\xbf\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x03\x87y\xca-\xbef>c\xdb?\xe7V\x83\xea\x0e\xc6.#\x83\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\x03\x8eE\xea\xdd=\x88\xb8\u007f\xe4\u06b0fh\x05\"\xf0\xdf\xc8\xf9\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x03\x92T\x9ar\u007f\x81eT)\u02d2\x8bR\x9f%\xdfM\x13\x85\x89\x01lC\xa0\xee\xa0t\x00\x00\u07d4\x03\x94\xb9\x0f\xad\xb8`O\x86\xf4?\xc1\xe3]1$\xb3*Y\x89\x89)j\xa1@'\x8ep\x00\x00\u0794\x03\x9ezN\xbc(N,\xcdB\xb1\xbd\xd6\v\xd6Q\x1c\x0fw\x06\x88\xf0\x15\xf2W6B\x00\x00\u07d4\x03\x9e\xf1\xceR\xfeyc\xf1f\u0562u\u0131\x06\x9f\xe3\xa82\x89\x15\xaf9\u4ab2t\x00\x00\u07d4\x03\xa2l\xfcL\x181op\u055e\x9e\x1ay\xee>\x8b\x96/L\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x03\xaab(\x81#m\xd0\xf4\x94\f$\xc3$\xff\x8b{~!\x86\x89\xadx\xeb\u016cb\x00\x00\x00\u07d4\x03\xafz\xd9\xd5\"<\xf7\xc8\xc1? \xdfg\xeb\xe5\xff\u017bA\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x03\xb0\xf1|\xd4F\x9d\xdc\u03f7\xdai~\x82\xa9\x1a_\x9ewt\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x03\xb4\x1bQ\xf4\x1d\xf2\r\xd2y\xba\xe1\x8c\x12w_w\xadw\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x03\xbe[F)\xae\xfb\xbc\xab\x9d\xe2m9Wl\xb7\xf6\x91\xd7d\x89\n\xdf0\xbap\u0217\x00\x00\u07d4\x03\xc6G\xa9\xf9)\xb0x\x1f\xe9\xae\x01\u02a3\xe1\x83\xe8vw~\x89\x18*\xb7\xc2\f\xe5$\x00\x00\u07d4\x03\xc9\x1d\x92\x946\x03\xe7R >\x054\x0eV`\x13\xb9\x00E\x89+|\xc2\xe9\xc3\"\\\x00\x00\u07d4\x03\xcbLOE\x16\xc4\xffy\xa1\xb6$O\xbfW.\x1c\u007f\xeay\x89\x94\x89#z\u06daP\x00\x00\u07d4\x03\u02d8\u05ec\xd8\x17\u079d\x88m\"\xfa\xb3\xf1\xb5}\x92\xa6\b\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x03\u031d-!\xf8k\x84\xac\x8c\xea\xf9q\u06e7\x8a\x90\xe6%p\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\x03\xd1rO\xd0\x0eT\xaa\xbc\xd2\xde*\x91\xe8F+\x10I\xdd:\x89\x8f\x1d\\\x1c\xae7@\x00\x00\u07d4\x03\xde\xdf\xcd\v<.\x17\xc7\x05\xda$\x87\x90\uf626\xbdWQ\x89Hz\x9a0E9D\x00\x00\u07d4\x03\u8c04SuW\xe7\t\xea\xe2\xe1\u1966\xbc\xe1\xef\x83\x14\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x03\xeam&\u0400\xe5z\xee9&\xb1\x8e\x8e\xd7:N[(&\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x03\xeb<\xb8`\xf6\x02\x8d\xa5T\xd3D\xa2\xbbZP\n\xe8\xb8o\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x03\xeb\xc6?\xdaf`\xa4e\x04^#_\xben\\\xf1\x95s_\x89\a\xb0l\xe8\u007f\xddh\x00\x00\xe0\x94\x03\xefj\xd2\x0f\xf7\xbdO\x00+\xacX\xd4uD\u03c7\x9a\xe7(\x8a\x01u\xc7X\u0439n\\\x00\x00\u07d4\x03\xf7\xb9 \b\x81:\xe0\xa6v\xeb!(\x14\xaf\xab5\"\x10i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04\x11p\xf5\x81\u0780\xe5\x8b*\x04\\\x8f|\x14\x93\xb0\x01\xb7\u02c90\xc8\xeca2\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\x04i\xe8\xc4@E\v\x0eQ&&\xfe\x81~gT\xa8\x15(0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04m'K\x1a\xf6\x15\xfbPZvJ\xd8\u0767p\xb1\xdb/=\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x04}Z&\u05ed\x8f\x8ep`\x0fp\xa3\x98\u076a\x1c-\xb2o\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x04~\x87\xc8\xf7\xd1\xfc\xe3\xb0\x13S\xa8Xb\xa9H\xac\x04\x9f>\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\x04\u007f\x9b\xf1R\x9d\xaf\x87\xd4\a\x17^o\x17\x1b^Y\xe9\xff>\x89#<\x8f\xe4'\x03\xe8\x00\x00\xe0\x94\x04\x85'2\xb4\xc6R\xf6\xc2\u53b3e\x87\xe6\nb\xda\x14\u06ca\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x04\x8a\x89p\xeaAE\xc6MU\x17\xb8\xde[F\xd0YZ\xad\x06\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x04\x9c]K\xc6\xf2]NEli{R\xa0x\x11\xcc\u045f\xb1\x89\x10D\x00\xa2G\x0eh\x00\x00\u07d4\x04\xa1\xca\xda\x1c\xc7Q\b/\xf8\u0692\x8e<\xfa\x00\b \xa9\xe9\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x04\xa8\n\xfa\xd5>\xf1\xf8Ae\xcf\xd8R\xb0\xfd\xf1\xb1\xc2K\xa8\x89\x03$\xe9d\xb3\xec\xa8\x00\x00\u07d4\x04\xaa\xfc\x8a\xe5\xceoI\x03\u021d\u007f\xac\x9c\xb1\x95\x12\"Gw\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x04\xbaK\xb8q@\x02,!Jo\xacB\xdbZ\x16\u0755@E\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x04\xba\x8a?\x03\xf0\x8b\x89P\x95\x99M\xdaa\x9e\u06ac\xee>z\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04\xc2\xc6K\xb5L>\xcc\xd0U\x85\xe1\x0e\xc6\xf9\x9a\f\xdb\x01\xa3\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x04\xceE\xf6\x00\xdb\x18\xa9\u0405\x1b)\xd99>\xbd\xaa\xfe=\u0149\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x04\u05b8\xd4\u0686t\a\xbb\x99wI\u07bb\xcd\xc0\xb3XS\x8a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x04\xd78\x96\xcfe\x93\xa6\x91\x97*\x13\xa6\xe4\x87\x1f\xf2\xc4+\x13\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04\xd8*\xf9\xe0\x1a\x93m\x97\xf8\xf8Y@\xb9p\xf9\xd4\u06d96\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x04\xe5\xf5\xbc|\x92?\xd1\xe3\x175\xe7.\xf9h\xfdg\x11\fn\x89WU\x1d\xbc\x8ebL\x00\x00\u07d4\x04\xec\xa5\x01c\n\xbc\xe3R\x18\xb1t\x95k\x89\x1b\xa2^\xfb#\x8966\x9e\xd7t}&\x00\x00\u07d4\x05\x05\xa0\x8e\"\xa1\t\x01Z\"\xf6\x850STf*U1\u0549\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4\x05\x14\x95L\xe8\x81\xc807\x03d\x00\x89lO\xd1\xee$nx\x00\x00\u07d4\x05\x1dBBv\xb2\x129fQ\x86\x13=e;\xb8\xb1\x86/\x89\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x05!\xbc:\x9f\x87\x11\xfe\xcb\x10\xf5\a\x97\xd7\x10\x83\xe3A\ub749\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x05#mL\x90\xd0e\xf9\u34c3X\xaa\xff\xd7w\xb8j\xecI\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x05*X\xe05\xf1\xfe\x9c\xdd\x16\x9b\xcf \x97\x03E\xd1+\x9cQ\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\x05.\xab\x1fa\xb6\xd4U\x17(?A\xd1D\x18$\x87\x87I\u0409\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x053n\x9ar'(\xd9c\xe7\xa1\xcf'Y\xfd\x02tS\x0f\u02891\xa2D?\x88\x8ay\x80\x00\u07d4\x054q\u035aA\x92[9\x04\xa5\xa8\xff\xca6Y\xe04\xbe#\x89\n\xd2\x01\xa6yO\xf8\x00\x00\u07d4\x056\x1d\x8e\xb6\x94\x1dN\x90\xfb~\x14\x18\xa9Z2\xd5%w2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x05B:T\xc8\xd0\xf9p~pAs\xd9#\xb9F\xed\xc8\xe7\x00\x89\x06\xea\x03\u00bf\x8b\xa5\x80\x00\u07d4\x05D\f[\a;R\x9bH) \x9d\xff\x88\t\x0e\a\xc4\xf6\xf5\x89E\u04977\xe2/ \x00\x00\u07d4\x05Z\xb6X\xc6\xf0\xedO\x87^\xd6t.K\xc7)-\x1a\xbb\xf0\x89\x04\x86\u02d7\x99\x19\x1e\x00\x00\u07d4\x05[\xd0,\xaf\x19\xd6 +\xbc\u0703m\x18{\xd1\xc0\x1c\xf2a\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x05^\xacO\x1a\xd3\xf5\x8f\v\xd0$\u058e\xa6\r\xbe\x01\u01af\xb3\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x05fQU\xccI\xcb\xf6\xaa\xbd\u056e\x92\xcb\xfa\xad\x82\xb8\xc0\xc1\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x05f\x86\a\x8f\xb6\xbc\xf9\xba\n\x8a\x8d\xc6:\x90o_\xea\xc0\xea\x89\x1b\x18\x1eK\xf24<\x00\x00\u07d4\x05iks\x91k\xd3\x03>\x05R\x1e2\x11\xdf\xec\x02n\x98\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x05k\x15F\x89O\x9a\x85\xe2\x03\xfb3m\xb5i\xb1l%\xe0O\x89\t.\xdb\t\xff\b\u0600\x00\u07d4\x05yI\xe1\xca\x05pF\x9eL\xe3\u0190\xaea:k\x01\xc5Y\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x05}\u049f-\x19\xaa=\xa4#'\xeaP\xbc\xe8o\xf5\xc9\x11\u0649\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x05\u007f\u007f\x81\xcdz@o\xc4Y\x94@\x8bPI\x91,Vdc\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x05\x91]N\"Zf\x81b\xae\xe7\xd6\xc2_\xcf\xc6\xed\x18\xdb\x03\x89\x03\x98\xc3ry%\x9e\x00\x00\u07d4\x05\x96\xa2}\xc3\xee\x11_\xce/\x94\xb4\x81\xbc z\x9e&\x15%\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x05\xa80rC\x02\xbc\x0fn\xbd\xaa\x1e\xbe\xee\xb4nl\xe0\v9\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4\x05\xae\u007f\u053b\u0300\xca\x11\xa9\n\x1e\u01e3\x01\xf7\xcc\u0303\u06c91T\xc9r\x9d\x05x\x00\x00\u07d4\x05\xbbd\xa9\x16\xbef\xf4`\xf5\xe3\xb6C2\x11\r \x9e\x19\xae\x89\u3bb5sr@\xa0\x00\x00\xe0\x94\x05\xbfO\xcf\xe7r\xe4[\x82dC\x85.l5\x13P\xcer\xa2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94\x05\xc6@\x04\xa9\xa8&\xe9N^N\xe2g\xfa*v2\xddNo\x8a\x03m\xc4.\xbf\xf9\v\u007f\x80\x00\xe0\x94\x05\xc76\xd3e\xaa7\xb5\xc0\xbe\x9c\x12\u022d\\\xd9\x03\xc3,\xf9\x8a\x01E^{\x80\n\x86\x88\x00\x00\xe0\x94\x05\xcbl;\x00r\xd3\x11ga\xb52\xb2\x18D;S\xe8\xf6\u014a\x1e\x02\xc3\xd7\xfc\xa9\xb6(\x00\x00\u07d4\x05\xd0\xf4\xd7(\xeb\xe8.\x84\xbfYu\x15\xadA\xb6\v\xf2\x8b9\x89\u3bb5sr@\xa0\x00\x00\u07d4\x05\u058d\xada\u04fb\u07f3\xf7y&\\IGJ\xff?\xcd0\x89\x02\"\xc5]\xc1Q\x9d\x80\x00\u07d4\x05\xe6q\xdeU\xaf\xec\x96K\aM\xe5t\xd5\x15\x8d]!\xb0\xa3\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x05\xe9{\tI,\u058fc\xb1+\x89.\xd1\xd1\x1d\x15,\x0e\u02897\b\xba\xed=h\x90\x00\x00\u07d4\x05\xf3c\x1fVd\xbd\xad]\x012\xc88\x8d6\xd7\u0612\t\x18\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x06\t\xd8:l\xe1\xff\u0276\x90\xf3\xe9\xa8\x1e\x98>\x8b\xdcM\x9d\x8a\x0e\u04b5%\x84\x1a\xdf\xc0\x00\x00\u07d4\x06\x1e\xa4\x87|\u0409D\xebd\u0096n\x9d\xb8\xde\xdc\xfe\xc0k\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x06%\xd0`V\x96\x8b\x00\"\x06\xff\x91\x98\x01@$+\xfa\xa4\x99\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x06(\xbf\xbeU5x/\xb5\x88@k\xc9f`\xa4\x9b\x01\x1a\xf5\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4\x061\u044b\xbb\xbd0\xd9\xe1s+\xf3n\xda\xe2\u0389\x01\xab\x80\x89\xa3\xf9\x88U\xec9\x90\x00\x00\u07d4\x061\xdc@\xd7NP\x95\xe3r\x9e\xdd\xf4\x95D\xec\xd49og\x89\b\xacr0H\x9e\x80\x00\x00\xe0\x94\x067Y\xdd\x1cN6.\xb1\x93\x98\x95\x1f\xf9\xf8\xfa\xd1\xd3\x10h\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x06_\xf5u\xfd\x9c\x16\xd3\xcbo\u058f\xfc\x8fH?\xc3.\xc85\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x06a\x8e\x9dWb\xdfb\x02\x86\x01\xa8\x1dD\x87\u05a0\xec\xb8\x0e\x89Hz\x9a0E9D\x00\x00\xe0\x94\x06fG\xcf\xc8]#\xd3v\x05W= \x8c\xa1T\xb2D\xd7l\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x06xeJ\xc6v\x1d\xb9\x04\xa2\xf7\xe8Y^\xc1\xea\xacsC\b\x89/\x98\xb2\x9c(\x18\xf8\x00\x00\u07d4\x06\x86\n\x93RYU\xffbI@\xfa\xdc\xff\xb8\xe1I\xfdY\x9c\x89lh\xcc\u041b\x02,\x00\x00\xe0\x94\x06\x8c\xe8\xbdn\x90*E\u02c3\xb5\x15A\xb4\x0f9\xc4F\x97\x12\x8a\x01\x1c\x0f\x9b\xadJF\xe0\x00\x00\u07d4\x06\x8e)\xb3\xf1\x91\xc8\x12\xa699\x18\xf7\x1a\xb93\xaehG\xf2\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x06\x8eeWf\xb9D\xfb&6\x19e\x87@\xb8P\xc9J\xfa1\x89\x01\xe8\u007f\x85\x80\x9d\xc0\x00\x00\u0794\x06\x96N-\x17\xe9\x18\x9f\x88\xa8 96\xb4\n\xc9nS<\x06\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x06\x99L\xd8:\xa2d\n\x97\xb2`\vA3\x9d\x1e\r>\xdel\x89\r\x8drkqw\xa8\x00\x00\u07d4\x06\x9e\u042bz\xa7}\xe5q\xf1a\x06\x05\x1d\x92\xaf\xe1\x95\xf2\u0409\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x06\xac&\xad\x92\u02c5\x9b\u0550]\xdc\xe4&j\xa0\xecP\xa9\u0149*\x03I\x19\u07ff\xbc\x00\x00\u07d4\x06\xb0\xc1\xe3\u007fZ^\u013b\xf5\b@T\x8f\x9d:\xc0(\x88\x97\x89\xd8\u0602\u148e}\x00\x00\u07d4\x06\xb0\xff\x83@s\xcc\xe1\xcb\xc9\xeaU~\xa8{`Yc\u8d09\x10CV\x1a\x88)0\x00\x00\xe0\x94\x06\xb1\x06d\x9a\xa8\xc4!\xdd\xcd\x1b\x8c2\xcd\x04\x18\xcf0\xda\x1f\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x06\xb5\xed\xe6\xfd\xf1\xd6\xe9\xa3G!7\x9a\xea\xa1|q=\xd8*\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x06\xcb\xfa\b\xcd\xd4\xfb\xa77\xba\xc4\a\xbe\x82$\xf4\xee\xf3X(\x89 +\xe5\xe88.\x8b\x80\x00\u07d4\x06\xd6\xcb0\x84\x81\xc36\xa6\xe1\xa2%\xa9\x12\xf6\xe65Y@\xa1\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\x06\xdc\u007f\x18\xce\xe7\xed\xab[yS7\xb1\xdfj\x9e\x8b\u062eY\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x06\xf6\x8d\xe3\xd79\xdbA\x12\x1e\xac\xf7y\xaa\xda=\xe8v!\a\x89\x01\x84\x93\xfb\xa6N\xf0\x00\x00\u07d4\x06\xf7\u070d\x1b\x94b\xce\xf6\xfe\xb13h\xa7\xe3\x97K\t\u007f\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\a\x01\xf9\xf1G\xecHhV\xf5\xe1\xb7\x1d\xe9\xf1\x17\xe9\x9e!\x05\x89\te\xdaq\u007f\u0578\x00\x00\u07d4\a\r]6L\xb7\xbb\xf8\"\xfc,\xa9\x1a5\xbd\xd4A\xb2\x15\u0549lk\x93[\x8b\xbd@\x00\x00\xe0\x94\a\x1d\xd9\r\x14\xd4\x1fO\xf7\xc4\x13\xc2B8\xd35\x9c\xd6\x1a\a\x8a\a\xb5?y\xe8\x88\xda\xc0\x00\x00\u07d4\a&\xc4.\x00\xf4T\x04\x83n\xb1\xe2\x80\xd0s\xe7\x05\x96\x87\xf5\x89X\x00>?\xb9G\xa3\x80\x00\xe0\x94\a'\xbe\n*\x00! H\xb5R\x0f\xbe\xfb\x95>\xbc\x9dT\xa0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\a)\xa8\xa4\xa5\xba#\xf5y\xd0\x02[\x1a\xd0\xf8\xa0\xd3\\\xdf\u048a\x02\r\u058a\xaf2\x89\x10\x00\x00\u07d4\a)\xb4\xb4|\t\xeb\x16\x15\x84d\u022a\u007f\xd9i\vC\x889\x89lh\xcc\u041b\x02,\x00\x00\u0794\a4\xa0\xa8\x1c\x95b\xf4\xd9\xe9\xe1\n\x85\x03\xda\x15\xdbF\xd7n\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\a\xa7\xef[G\x00\x00\xe0\x94\ap\xc6\x1b\xe7\x87r#\f\xb5\xa3\xbb$)\xa7&\x14\xa0\xb36\x8a\x01n\u0899\xb7\x13A\x80\x00\u07d4\ar><0\xe8\xb71\xeeEj)\x1e\xe0\u7630 Jw\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\as\xee\xac\xc0P\xf7G \xb4\xa1\xbdW\x89[\x1c\xce\xebI]\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\a\x80\r/\x80h\xe4H\u01daOi\xb1\xf1^\xf6\x82\xaa\xe5\xf6\x8a\x04\x1b\xad\x15^e\x12 \x00\x00\u07d4\a\xa8\xda\xde\xc1BW\x1a}S\xa4)pQxm\a,\xbaU\x89\x01;m\xa1\x13\x9b\u0680\x00\u07d4\a\xaf\x93\x8c\x127\xa2|\x900\tM\xcf$\aP$n=,\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\a\xb1\xa3\x06\xcbC\x12\xdffH,,\xaer\xd1\xe0a@\x0f\u034a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\a\xb7\xa5p3\xf8\xf1\x130\xe4f^\x18]#N\x83\xec\x14\v\x89\xea~\xe9*\f\x9a\v\x80\x00\u07d4\a\xbc,\xc8\xee\xdc\x01\x97\a\x00\xef\xc9\xc4\xfb6s^\x98\xcdq\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\a\xd4\x12\x17\xba\u0725\xe0\xe6\x03'\xd8E\xa3FO\x0f'\xf8J\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\a\xd43N\u00c5\xe8\xaaT\xee\xda\xea\xdb0\x02/\f\u07e4\xab\x89\x8e\x91\xd5 \xf2\xeby\x00\x00\u07d4\a\xda\xe6\"c\r\x1168\x193\u04adk\"\xb89\xd8!\x02\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\a\xdc+\xf8;\u01af\x19\xa8B\xff\xeaf\x1a\xf5\xb4\x1bg\xfd\xa1\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\a\u070c\x8b\x92z\xdb\xed\xfa\x8f]c\x9bCR5\x1f/6\u0489\x11\n\xed;U0\xdb\x00\x00\u07d4\a\xdd\xd0B,\x86\xefe\xbf\f\u007f\xc3E(b\xb1\"\x8b\b\xb8\x89o\xf5\u04aa\x8f\x9f\xcf\x00\x00\u07d4\a\xe1\x16,\xea\xe3\xcf!\xa3\xf6-\x10Y\x900.0\u007fN;\x89R\xf1\x03\xed\xb6k\xa8\x00\x00\u07d4\a\xe2\xb4\xcd\xee\xd9\u0407\xb1.Um\x9ew\f\x13\xc0\x99a_\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\a\xfe\xefT\xc16\x85\b)\xba\xdcKI\xc3\xf2\xa7<\x89\xfb\x9e\x89\x06hZ\xc1\xbf\xe3,\x00\x00\u07d4\b\x05FP\x8a=&\x82\u0239\x88O\x13c{\x88G\xb4M\xb3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\b\t\bv\xba\xad\xfe\xe6\\=6;\xa5S\x12t\x8c\xfa\x87=\x89\\*\x997\x1c\xff\xe1\x00\x00\u07d4\b\x16o\x021?\xea\u12f0D\xe7\x87|\x80\x8bU\xb5\xbfX\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\b)\xd0\xf7\xbb|Dl\xfb\xb0\u07ad\xb29M\x9d\xb7$\x9a\x87\x89\x02,\xa3X|\xf4\xeb\x00\x00\u07d4\b0m\xe5\x19\x81\u7b21\x85hY\xb7\xc7xijki\xf9\x89\xadx\xeb\u016cb\x00\x00\x00\xe0\x94\b7S\x9b_jR*H,\xdc\u04e9\xbbpC\xaf9\xbd\u048a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\b8\xa7v\x8d\x9c*\u028b\xa2y\xad\xfe\xe4\xb1\xf4\x91\xe3&\xf1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\bA\x16R\xc8qq6\t\xaf\x00b\xa8\xa1(\x1b\xf1\xbb\xcf\u0649K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\bM\x102Tu\x9b4<\xb2\xb9\xc2\xd8\xff\x9e\x1a\xc5\xf1E\x96\x8a\x01\x9b\xff/\xf5yh\xc0\x00\x00\u07d4\bPO\x05d?\xabY\x19\xf5\xee\xa5Y%\u05e3\xed}\x80z\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\b[J\xb7]\x83b\xd9\x14C\\\xed\xee\x1d\xaa+\x1e\xe1\xa2;\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\b[\xa6_\xeb\xe2>\xef\xc2\xc8\x02fj\xb1&#\x82\xcf\u0114\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\bt\x98\xc0FFh\xf3\x11P\xf4\xd3\u013c\u0765\"\x1b\xa1\x02\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\bw\uebabx\xd5\xc0\x0e\x83\xc3+-\x98\xfay\xadQH/\x89\x17\xd2-q\xdab&\x00\x00\u0794\b\x93j7\u07c5\xb3\xa1X\xca\xfd\x9d\xe0!\xf5\x817h\x13G\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\b\xa9\xa4N\x1fA\xde=\xbb\xa7\xa3c\xa3\xabA,\x12L\xd1^\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\b\xb7\xbd\u03d4MUp\x83\x8b\xe7\x04`$:\x86\x94HXX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\b\xb8E6\xb7L\x8c\x01T=\xa8\x8b\x84\u05cb\xb9WG\xd8\"\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\b\xc2\xf26\xacJ\xdc\xd3\xfd\xa9\xfb\xc6\xe4S\"S\xf9\xda;\xec\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\b\xc8\x02\xf8wX4\x9f\xa0>k\xc2\xe2\xfd\a\x91\x19~\ua689lk\x93[\x8b\xbd@\x00\x00\u07d4\b\xc9\U0007fd89\xfd\xf8\x04\xd7i\xf8!#6\x02\x15\xaf\xf9;\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\b\xca\u0215&A\xd8\xfcRn\xc1\xabO-\xf8&\xa5\xe7q\x0f\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\b\xcc\xdaP\xe4\xb2j\x0f\xfc\x0e\xf9.\x92\x051\a\x06\xbe\xc2\u01ca\x01Iul8W\xc6\x00\x00\x00\u07d4\b\u0406M\xc3/\x9a\xcb6\xbfN\xa4G\xe8\xddg&\x90j\x15\x89lnY\xe6|xT\x00\x00\u07d4\b\xd4&\u007f\xeb\x15\u0697\x00\xf7\xcc\xc3\xc8J\x89\x18\xbf\x17\xcf\u0789a\t=|,m8\x00\x00\xe0\x94\b\xd41\x1c\x9c\x1b\xba\xf8\u007f\xab\xe1\xa1\xd0\x14c\x82\x8d]\x98\u038a\x13\x0e\xe8\xe7\x17\x90D@\x00\x00\u07d4\b\xd5N\x83\xadHj\x93L\xfa\xea\u20e3>\xfd\"|\x0e\x99\x898S\x05\x83$^\xdc\x00\x00\u07d4\b\xd9~\xad\xfc\xb7\xb0d\xe1\xcc\xd9\u0217\x9f\xbe\xe5\xe7z\x97\x19\x89\x0el]\xa8\xd6z\xc1\x80\x00\u07d4\b\xda:z\x0fE!a\u03fc\xec1\x1b\xb6\x8e\xbf\xde\xe1~\x88\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\b\xe3\x8e\xe0\xceH\xc9\xcad\\\x10\x19\xf7;SUX\x1cV\xe6\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\b\xef?\xa4\xc4<\xcd\xc5{\"\xa4\xb9\xb23\x1a\x82\xe58\x18\xf2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\t\td\x8c\x18\xa3\xce[\xaez\x04~\xc2\xf8h\xd2L\u0768\x1d\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4\t\f\xd6{`\xe8\x1dT\xe7\xb5\xf6\a\x8f>\x02\x1b\xa6[\x9a\x1e\x8965\u026d\xc5\u07a0\x00\x00\u07d4\t\f\xeb\xef),>\xb0\x81\xa0_\u062a\xf7\u04db\xf0{\x89\u0509\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\t\x0f\xa96{\xdaW\xd0\xd3%:\n\x8f\xf7l\xe0\xb8\xe1\x9as\x8965\u026d\xc5\u07a0\x00\x00\u07d4\t\x14n\xa3\x88Qv\xf0w\x82\xe1\xfe0\xdc\xe3\xce$\u011e\x1f\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\t!`_\x99\x16N;\xcc(\xf3\x1c\xae\xcex\x971\x82V\x1d\x89+\ai*\x90e\xa8\x00\x00\xe0\x94\t&\x1f\x9a\xcbE\x1c7\x88\x84O\f\x14Q\xa3[\xadP\x98\xe3\x8a\x01\u056d'P) `\x00\x00\xe0\x94\t'\"\x04\x92\x19K.\u069f\u013b\xe3\x8f%\u0581\xdf\xd3l\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794\t*\xcbbK\b\xc0U\x10\x18\x9b\xbb\xe2\x1ee$\xd6D\u032d\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\t.\x81UX@-g\xf9\rk\xfem\xa0\xb2\xff\xfa\x91EZ\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\tP0\xe4\xb8&\x92\xdc\xf8\xb8\u0411$\x94\xb9\xb3x\xec\x93(\x89H\xa4zu\x80\x00\u07d4\t\x89\xc2\x00D\v\x87\x89\x91\xb6\x9d`\x95\xdf\xe6\x9e3\xa2.p\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\t\x90\xe8\x1c\u05c5Y\x9e\xa26\xbd\x19f\xcfRc\x02\xc3[\x9c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\t\x98\xd8'1\x15\xb5j\xf4%\xff\xc8>!\x8c\x1e\n\xfe\x89(\u01c8\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\t\xaeI\xe3\u007f\x12\x1d\xf5\xdc\x15\x8c\xfd\xe8\x06\xf1s\xa0k\f\u007f\x89\xd80\x9e&\xab\xa1\xd0\x00\x00\u07d4\t\xaf\xa7;\xc0G\xefF\xb9w\xfd\x97c\xf8r\x86\xa6\xbeh\u0189\x1b/\xb5\xe8\xf0jf\x00\x00\u07d4\t\xb4f\x86\x96\xf8j\b\x0f\x8b\xeb\xb9\x1d\xb8\xe6\xf8p\x15\x91Z\x89#\x8f\xf7\xb3O`\x01\x00\x00\xe0\x94\t\xb5\x9b\x86\x98\xa7\xfb\xd3\xd2\xf8\xc7:\x00\x89\x88\xde>@k+\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94\t\xb7\xa9\x88\xd1?\xf8\x91\x86so\x03\xfd\xf4au\xb5=\x16\xe0\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\t\xc1w\xf1\xaeD$\x11\u076c\xf1\x87\xd4m\xb9V\x14\x83`\xe7\x8a\x01\xe5.3l\xde\"\x18\x00\x00\xe0\x94\t\u020f\x91~Mj\xd4s\xfa\x12\u93a3\xc4G*^\xd6\u068a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\t\u0438\xcd\a|i\xd9\xf3-\x9c\xcaC\xb3\xc2\b\xa2\x1e\u050b\x89\b!\xd2!\xb5)\x1f\x80\x00\xe0\x94\t\xd6\xce\xfdu\xb0\u0133\xf8\xf1\u0587\xa5\"\xc9a#\xf1\xf59\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\t\xe47\xd4H\x86\x12(\xa22\xb6.\xe8\xd3ye\xa9\x04\ud70a\x04\x98\xcf@\x1d\xf8\x84.\x80\x00\u07d4\t\xee\x12\xb1\xb4+\x05\xaf\x9c\xf2\a\xd5\xfc\xac%[.\xc4\x11\xf2\x89\x031\xcd\xddG\xe0\xfe\x80\x00\u07d4\t\xf3\xf6\x01\xf6\x05D\x11@Xl\xe0eo\xa2J\xa5\xb1\u066e\x89Sswo\xe8\xc4T\x00\x00\u07d4\t\xf9W[\xe5}\x00G\x93\u01e4\ub137\x15\x87\xf9|\xbbj\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\n\x06P\x86\x1fx^\xd8\xe4\xbf\x10\x05\xc4P\xbb\xd0n\xb4\x8f\xb6\x89\xa6A;y\x14N~\x00\x00\u07d4\n\x06\xfa\xd7\xdc\u05e4\x92\xcb\xc0S\xee\xab\xdei4\xb3\x9d\x867\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\n\a}\xb1?\xfe\xb0\x94\x84\xc2\x17p\x9dX\x86\xb8\xbf\x9cZ\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\n\x0e\u0366cow\x16\xef\x19saF\x87\xfd\x89\xa8 \xa7\x06\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\n)\xa8\xa4\xd5\xfd\x95\x00u\xff\xb3Mw\xaf\xeb-\x82;\u0589\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\n*\u0795\xb2\xe8\xc6m\x8a\xe6\xf0\xbad\xcaW\u05c3\xbemD\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\n+O\xc5\xd8\x1a\xceg\xdcK\xba\x03\xf7\xb4UA=F\xfe=\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\n-\xcbzg\x17\x01\u06f8\xf4\x95r\x80\x88&Xs5l\x8e\x89\b?\x16\xce\b\xa0l\x00\x00\u07d4\n=\xe1U\xd5\xec\xd8\xe8\x1c\x1f\xf9\xbb\xf07\x83\x01\xf8\xd4\xc6#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\nG\xad\x90Y\xa2I\xfc\x93k&b5=\xa6\x90_u\u00b9\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\nH)ov1p\x8c\x95\u04b7Iu\xbcJ\xb8\x8a\xc19*\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94\nJ\x01\x19\x95\u0181\xbc\x99\x9f\xddyuN\x9a2J\xe3\xb3y\x8a\b\xc1\x9a\xb0n\xb8\x9a\xf6\x00\x00\u07d4\nX\xfd\xddq\x89\x8d\xe7s\xa7O\xda\xe4^{\xd8N\xf46F\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\n[y\xd8\xf2;d\x83\xdb\u2f6ab\xb1\x06L\xc7cf\xae\x89j\u0202\x10\tR\u01c0\x00\u07d4\ne.*\x8bw\xbd\x97\xa7\x90\xd0\xe9\x13a\u0248\x90\u06f0N\x8965\u026d\xc5\u07a0\x00\x00\u07d4\nn\xber;n\xd1\xf9\xa8ji\xdd\xdah\xdcGF\\+\x1b\x89@=-\xb5\x99\xd5\xe4\x00\x00\u07d4\nw\xe7\xf7+C{WO\x00\x12\x8b!\xf2\xac&Q3R\x8c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\n\x91\u007f;\\\xb0\xb8\x83\x04\u007f\u0676Y=\xbc\xd5W\xf4S\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\n\x93\x1bD\x9e\xa8\xf1,\xdb\xd5\xe2\xc8\xccv\xba\xd2\xc2|\x069\x89\x01?\x9e\x8cy\xfe\x05\x80\x00\u0794\n\x98\x04\x13x\x03\xbahh\xd9:U\xf9\x98_\xcdT\x04Q\u4239\x8b\xc8)\xa6\xf9\x00\x00\u07d4\n\x9a\xb2c\x8b\x1c\xfdeM%\u06b0\x18\xa0\xae\xbd\u07c5\xfdU\x89\x01.\x8c\xb5\xfeLJ\x80\x00\u07d4\n\xb3f\xe6\xe7\u056b\xbc\xe6\xb4JC\x8di\xa1\u02bb\x90\xd13\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\n\xb4(\x1e\xbb1\x85\x90\xab\xb8\x9a\x81\xdf\a\xfa:\xf9\x04%\x8a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794\n\xb5\x9d9\a\x02\xc9\xc0Y\xdb\x14\x8e\xb4\xf3\xfc\xfa}\x04\xc7\xe7\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\n\xbf\xb3\x9b\x11HmyW(f\x19[\xa2lc\vg\x84\u06ca\x19\xba\x877\xf9i(\xf0\x00\x00\u07d4\n\u029aV&\x91;\b\xcf\u0266m@P\x8d\xceR\xb6\x0f\x87\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\n\xd3\xe4M<\x00\x1f\xa2\x90\xb3\x93ap0TA\b\xacn\xb9\x89j\xbd\xa0\xbc0\xb2\u07c0\x00\u07d4\n\xec.Bn\xd6\xcc\f\xf3\xc2I\xc1\x89~\xacG\xa7\xfa\xa9\xbd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\n\xf6_\x14xNU\xa6\xf9Vg\xfds%*\x1c\x94\a-*\x89\nv;\x8e\x02\xd4O\x80\x00\u07d4\n\xf6\xc8\xd59\xc9mP%\x9e\x1b\xa6q\x9e\x9c\x80`\xf3\x88\u008965\u026d\xc5\u07a0\x00\x00\u07d4\v\x069\x0f$7\xb2\x0e\u0123\xd3C\x1b2y\xc6X>^\u05c9\n\x84Jt$\xd9\xc8\x00\x00\u07d4\v\v8b\x11*\xee\u00e04\x92\xb1\xb0_D\x0e\xcaT%n\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\v\x0e\x05[(\xcb\xd0=\xc5\xffD\xaad\xf3\xdc\xe0O^c\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\x11\x9d\xf9\x9ck\x8d\xe5\x8a\x1e,?)zgD\xbfU\"w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\x14\x89\x19\x99\xa6\\\x9e\xf73\b\xef\xe3\x10\f\xa1\xb2\x0e\x81\x92\x89+^:\xf1k\x18\x80\x00\x00\u07d4\v!\x13PE4d*\x1d\xaf\x10.\xee\x10\xb9\xeb\xdev\xe2a\x89\x94,\xdd|\x95\xf2\xbd\x80\x00\xe0\x94\v(\x8aZ\x8bu\xf3\xdcA\x91\xeb\x04W\xe1\xc8=\xbd M%\x8a\x01\a\x14\xe7{\xb4:\xb4\x00\x00\u07d4\v6\x9e\x00.\x1bLy\x13\xfc\xf0\x0f-^\x19\u0141eG\x8f\x89\x03\u007fe\x16(\x8c4\x00\x00\u07d4\vC\xbd#\x91\x02U\x81\u0615l\xe4*\a%y\u02ff\xcb\x14\x89\x01\x04\xe7\x04d\xb1X\x00\x00\u07d4\vP|\xf5SV\x8d\xaa\xf6U\x04\xaeN\xaa\x17\xa8\xea<\xdb\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v]f\xb1<\x87\xb3\x92\xe9M\x91\xd5\xf7l\rE\nU(C\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v^ \x11\xeb\xc2Z\x00\u007f!6)`I\x8a\xfb\x8a\xf2\x80\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\vd\x9d\xa3\xb9j\x10,\xdcm\xb6R\xa0\xc0}e\xb1\xe4C\xe6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\vi \xa6K6;\x8d]\x90\x80$\x94\xcfVKT|C\r\x89A\rXj \xa4\xc0\x00\x00\u07d4\vp\x11\x01\xa4\x10\x9f\x9c\xb3`\xdcW\xb7tBg=^Y\x83\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\vq\xf5T\x12$i\uf5ce/\x1f\xef\xd7\u02f4\x10\x98'r\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\xe0\x94\v{\xb3B\xf0\x1b\u0248\x8ej\x9a\xf4\xa8\x87\xcb\xf4\xc2\xdd,\xaf\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\v}3\x93q\xe5\xbeg'\xe6\xe31\xb5\x82\x1f\xa2K\u06ddZ\x89.\u007f\x81\x86\x82b\x01\x00\x00\u07d4\v\u007f\xc9\xdd\xf7\x05v\xf63\x06i\xea\xaaq\xb6\xa81\xe9\x95(\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\v\x80\xfcp(,\xbd\xd5\xfd\xe3[\xf7\x89\x84\xdb;\xdb\x12\x01\x88\x8968\x02\x1c\xec\u06b0\x00\x00\u07d4\v\x92M\xf0\a\xe9\xc0\x87\x84\x17\xcf\xe6;\x97n\xa1\xa3\x82\xa8\x97\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\v\x93\xfc\xa4\xa4\xf0\x9c\xac \xdb`\xe0e\xed\xcc\xcc\x11\u0976\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\v\x9d\xf8\x0f\xbe# \t\xda\xcf\n\xa8\xca\u0153v\xe2Gb\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xa6\xe4j\xf2Z\x13\xf5qi%Z4\xa4\xda\xc7\xce\x12\xbe\x04\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\v\xa8p[\xf5\\\xf2\x19\xc0\x95k^?\xc0\x1cDt\xa6\xcd\xc1\x89\x05%\xe0Y]Mk\x80\x00\u07d4\v\xafn\u0379\x1a\xcb6\x06\xa85|\v\xc4\xf4\\\xfd-~o\x8965\u026d\xc5\u07a0\x00\x00\u07d4\v\xb0_r$\xbbX\x04\x85eV\xc0~\xea\xdb\ud1fa\x8f|\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\v\xb0\xc1&\x82\xa2\xf1\\\x9bWA\xb28\\\xbeA\xf04\x06\x8e\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\v\xb2\\\xa7\u0448\xe7\x1eMi={\x17\a\x17\xd6\xf8\xf0\xa7\n\x89\x12C\x02\xa8/\xad\xd7\x00\x00\u07d4\v\xb2e\x0e\xa0\x1a\xcau[\xc0\xc0\x17\xb6K\x1a\xb5\xa6m\x82\xe3\x89Hz\x9a0E9D\x00\x00\u07d4\v\xb5Lr\xfdf\x10\xbf\xa463\x97\xe0 8K\x02+\fI\x89Hz\x9a0E9D\x00\x00\u07d4\v\xb7\x16\n\xba)7b\xf8sO>\x03&\xff\u0264\xca\xc1\x90\x8965\u026d\xc5\u07a0\x00\x00\u07d4\v\xc9\\\xb3-\xbbWL\x83/\xa8\x17J\x815m8\xbc\x92\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xd6}\xbd\xe0z\x85n\xbd\x89;^\xdcO:[\xe4 &\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xdb\xc5L\u023d\xbb\xb4\x02\xa0\x89\x11\xe2#*T`\u0386k\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\v\xddX\xb9n|\x91m\xd2\xfb05o*\xeb\xfa\xaf\x1d\x860\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\v\u1f39\x03C\xfa\xe501s\xf4a\xbd\x91JH9\x05l\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\v\xe1\xfd\xf6&\xeea\x89\x10-p\xd1;1\x01,\x95\xcd\x1c\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xe2\xb9J\xd9P\xa2\xa6&@\xc3[\xfc\xcdlg\xda\xe4P\xf6\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\v\u681eC\a\xfeH\xd4\x12\xb8\u0461\xa8(M\xceHba\x8a\x04\x0f\xbf\xf8\\\x0180\x00\x00\u07d4\v\xef\xb5G\a\xf6\x1b,\x9f\xb0G\x15\xab\x02n\x1b\xb7 B\xbd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\v\xf0dB\x8f\x83bg\"\xa7\xb5\xb2j\x9a\xb2\x04!\xa7r>\x89\a?u\u0460\x85\xba\x00\x00\u07d4\v\xfb\xb6\x92]\xc7^R\xcf&\x84\"K\xbe\x05P\xfe\xa6\x85\u04c9j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\f\b\x80\x06\xc6K0\xc4\u076f\xbc6\xcb_\x05F\x9e\xb6(4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\f s\xbaD\xd3\u077d\xb69\xc0N\x19\x109\xa7\x17\x16#\u007f\x89M\x85<\x8f\x89\b\x98\x00\x00\xe0\x94\f\",|A\u0270H\xef\xcc\xe0\xa22CCb\xe1-g;\x8a\x02\x1e\x83Yivw8\x00\x00\xe0\x94\f(\b\xb9Q\ud787-{2y\x0f\xccY\x94\xaeA\xff\u070a\x15\x99n[<\u05b3\xc0\x00\x00\u07d4\f(\x84~O\t\xdf\xce_\x9b%\xaf|NS\x0fY\u0200\xfe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\f-\\\x92\x058\xe9S\u02af$\xf0s\u007fUL\u0192wB\x8965\u026d\xc5\u07a0\x00\x00\u07d4\f0\xca\xcc?r&\x9f\x8bO\x04\xcf\a=+\x05\xa8=\x9a\u0449lyt\x12?d\xa4\x00\x00\u07d4\f29\xe2\xe8A$-\xb9\x89\xa6\x15\x18\xc2\"G\xe8\xc5R\b\x89\x0eJ\xf6G\x174d\x00\x00\xe0\x94\fH\r\xe9\xf7F\x10\x02\x90\x8bI\xf6\x0f\xc6\x1e+b\xd3\x14\v\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\fH\xaeb\xd1S\x97\x88\xeb\xa0\x13\xd7^\xa6\vd\xee\xbaN\x80\x89w\xfb\xdcC\xe00\x99\x80\x00\u07d4\fU\x89\xa7\xa8\x9b\x9a\xd1[\x02u\x190AYH\xa8u\xfb\xef\x89\x06\u0519\xeclc8\x00\x00\u07d4\fg\x03=\xd8\xee\u007f\f\x8a\xe54\xd4*Q\xf7\xd9\xd4\xf7\x97\x8f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\fhE\xbfA\xd5\xee'<>\u6d70\u059fo\xd5\xea\xbb\xf7\x89\xa2\xa1\xb9h.X\t\x00\x00\xe0\x94\f\u007f\x86\x9f\x8e\x90\xd5?\xdc\x03\u8c81\x9b\x01k\x9d\x18\xeb&\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\f\x86\x92\xee\xff*S\xd6\xd1h\x8e\xd5j\x9d\u06fdh\u06bb\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\f\x8ff\xc6\x01{\xce[ 4r\x04\xb6\x02\xb7C\xba\u05cd`\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\f\x8f\xd7w^T\xa6\xd9\u0263\xbf\x89\x0ev\x1fewi?\xf0\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\f\x92Z\xd5\xeb5,\x8e\xf7m\f\"-\x11[\a\x91\xb9b\xa1\x89\xacc]\u007f\xa3N0\x00\x00\u07d4\f\x96~0a\xb8zu>\x84P~\xb6\t\x86x,\x8f0\x13\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\f\xa1*\xb0\xb9fl\xf0\xce\xc6g\x1a\x15)/&SGj\xb2\x8a,x'\xc4-\"\xd0|\x00\x00\u07d4\f\xa6p\xeb,\x8b\x96\u02e3y!\u007fY)\u00b8\x92\xf3\x9e\xf6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\f\xae\x10\x8em\xb9\x9b\x9ecxv\xb0d\xc60>\u068ae\u0209\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\f\xbd\x92\x1d\xbe\x12\x15c\xb9\x8ahq\xfe\xcb\x14\xf1\xcc~\x88\u05c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\f\xbf\x87p\xf0\xd1\b.\\ \u016e\xad4\xe5\xfc\xa9\xaez\xe2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\f\xc6\u007f\x82s\xe1\xba\xe0\x86\u007f\xd4.\x8b\x81\x93\xd7&y\xdb\xf8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\f\u05a1A\x91\x8d\x12k\x10m\x9f.\xbfi\xe1\x02\xdeM2w\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\f\xda\x12\xbfr\xd4a\xbb\xc4y\xeb\x92\xe6I\x1d\x05~kZ\u044a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\f\u0716\v\x99\x8c\x14\x19\x98\x16\r\xc1y\xb3l\x15\u0484p\xed\x89\x1b\x1bk\u05efd\xc7\x00\x00\xe0\x94\f\xfb\x17#5\xb1l\x87\xd5\x19\xcd\x14uS\r W\u007f^\x0e\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\r\x1f*Wq>\xbcn\x94\xde)\x84n\x88D\xd3vfWc\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\r2e\xd3\u7f79=^\x8e\x8b\x1c\xa4\u007f!\ny>\u030e\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\r5@\x8f\"ef\x11o\xb8\xac\u06a9\xe2\xc9\u055bvh?\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\rU\x1e\xc1\xa2\x13<\x98\x1d_\u01a8\xc8\x17?\x9e|OG\xaf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\r]\x98V\\d|\xa5\xf1w\xa2\xad\xb9\xd3\x02/\xac(\u007f!\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\re\x80\x14\xa1\x99\x06\x1c\xf6\xb3\x943\x14\x03\x03\xc2\x0f\xfdNZ\x8a\x01\xbc\x85\xdc*\x89\xbb \x00\x00\u07d4\rg\x87\x06\xd07\x18\u007f>\"\xe6\xf6\x9b\x99\xa5\x92\xd1\x1e\xbcY\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\ri\x10\f9\\\xe6\xc5\xea\xad\xf9]\x05\xd8r\x83~\xde\xdd!\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\rt~\u559b\xf7\x9dW8\x1do\xe3\xa2@l\xd0\xd8\xce'\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\r\x80#\x92\x9d\x91r4\xae@Q+\x1a\xab\xb5\xe8\xa4Q'q\x89\b\x05\xe9\x9f\xdc\xc5\xd0\x00\x00\xe0\x94\r\x8a\xab\x8ft\xea\x86,\xdfvh\x05\x00\x9d?>B\xd8\xd0\v\x8a\x01;\x80\xb9\x9cQ\x85p\x00\x00\u07d4\r\x8c@\xa7\x9e\x18\x99O\xf9\x9e\xc2Q\xee\x10\u0408\u00d1.\x80\x89\x066d\xfc\u04bb\xc4\x00\x00\u07d4\r\x8e\xd7\xd0\xd1V83\x0e\xd7\xe4\xea\u032b\x8aE\x8dus~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\r\x92X/\u06e0^\xab\xc3\xe5\x158\xc5m\xb8\x817\x85\xb3(\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\r\x94C\xa7\x94h\xa5\xbb\xf7\xc1\xe5\xb9\x15\xb3d\x87\xf9\x16\x1f\x19\x84m\x10\x1431\x8a\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\r\xbdA|7+\x8b\r\x01\xbc\xd9Dpk\xd3.`\xae(\u0449\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\r\xc1\x00\xb1\a\x01\x1c\u007f\xc0\xa13\x96\x12\xa1l\xce\xc3(R\b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\r\u03dd\x8c\x98\x04E\x9fd|\x14\x13\x8e\xd5\x0f\xadV;AT\x89\t`\xdbwh\x1e\x94\x00\x00\u07d4\r\xcf\xe87\xea\x1c\xf2\x8ce\xfc\xce\u00fe\xf1\xf8NY\xd1P\xc0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\r\xd4\xe6t\xbb\xad\xb1\xb0\u0702D\x98q=\xce;QV\xda)\x89\t79SM(h\x00\x00\u07d4\r\xfb\u0501pP\xd9\x1d\x9db\\\x02\x05<\xf6\x1a>\xe2\x85r\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\x0e\x02N\u007f\x02\x9cj\xaf:\x8b\x91\x0f^\b\bs\xb8W\x95\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x0e\tdl\x99\xafC\x8e\x99\xfa'L\xb2\xf9\xc8V\xcbe\xf76\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x0e\f\x9d\x00^\xa0\x16\u0095\xcdy\\\xc9!>\x87\xfe\xbc3\xeb\x89\n\xbb\xcdN\xf3wX\x00\x00\u07d4\x0e\rf3\xdb\x1e\f\u007f#Jm\xf1c\xa1\x0e\n\xb3\x9c \x0f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x0e\x11\xd7z\x89w\xfa\xc3\r&\x84E\xe51\x14\x9b1T\x1a$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e\x12=}\xa6\xd1\xe6\xfa\xc2\u072d\xd2p)$\v\xb3\x90R\xfe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x0e\x18\x01\xe7\vbb\x86\x1b\x114\u033c9\x1fV\x8a\xfc\x92\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x0e \x94\xac\x16T\xa4k\xa1\xc4\u04e4\v\xb8\xc1}\xa7\U000d6209\x13h?\u007f<\x15\xd8\x00\x00\u07d4\x0e!\xaf\x1b\x8d\xbf'\xfc\xf6?7\xe0G\xb8z\x82\\\xbe|'\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x0e.PJ-\x11\"\xb5\xa9\xfe\xee\\\xb1E\x1b\xf4\u00ac\xe8{\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x0e/\x8e(\xa6\x81\xf7|X;\xd0\xec\xde\x16cK\xdd~\x00\u0349\x05'8\xf6Y\xbc\xa2\x00\x00\u07d4\x0e2\x02\x19\x83\x8e\x85\x9b/\x9f\x18\xb7.=@s\xcaP\xb3}\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e3\xfc\xbb\xc0\x03Q\v\xe3W\x85\xb5*\x9c]!k\xc0\x05\xf4\x89e\xea=\xb7UF`\x00\x00\u07d4\x0e6\x96\xcf\x1fB\x17\xb1c\u047c\x12\xa5\xeas\x0f\x1c2\xa1J\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x0e9\x0fD\x05=\xdf\xce\xf0\xd6\b\xb3^M\x9c,\xbe\x98q\xbb\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x0e:(\xc1\u07ef\xb0P[\xdc\xe1\x9f\xe0%\xf5\x06\xa6\xd0\x1c\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e=\xd7\xd4\xe4)\xfe90\xa6A@5\xf5+\xdcY\x9dxM\x89\x02,\xa3X|\xf4\xeb\x00\x00\u07d4\x0eGey\x03Rek\xc6Vh,$\xfc^\xf3\xe7j#\u01c9\x02\x86\xd7\xfc\f\xb4\xf5\x00\x00\u07d4\x0eI\x88\x00Dqw\xb8\u022f\xc3\xfd\xfa\u007fi\xf4\x05\x1b\xb6)\x89t\x05\xb6\x9b\x8d\xe5a\x00\x00\u07d4\x0ek\xaa\xa3\u07b9\x89\xf2\x89b\x00vf\x86\x18\xe9\xac3(e\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x0el\xd6d\xad\x9c\x1e\xd6K\xf9\x87I\xf4\x06D\xb6&\xe3y,\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\xe0\x94\x0em\xfdU;.\x87=*\xec\x15\xbd_\xbb?\x84r\xd8\u04d4\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\x0en\xc3\x137bq\xdf\xf5T#\xabT\"\xcc:\x8b\x06\xb2+\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x0en\u0399\x11\x1c\xad\x19a\xc7H\xed=\xf5\x1e\xddi\u04a3\xb1\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x0e\x83\xb8PH\x1a\xb4MI\xe0\xa2)\xa2\xe4d\x90,iS\x9b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x0e\x89\xed\xdd?\xa0\xd7\x1d\x8a\xb0\xff\x8d\xa5X\x06\x86\xe3\xd4\xf7O\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e\x90\x96\xd3C\xc0`\xdbX\x1a\x12\x01\x12\xb2x`~\xc6\xe5+\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x0e\x9cQ\x18d\xa1w\xf4\x9b\xe7\x82\x02w?`H\x9f\xe0NR\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x0e\xa2\xa2\x101+>\x86~\xe0\xd1\xcch,\xe1\xd6f\xf1\x8e\u054a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x0e\xb1\x89\xef,-Wb\xa9c\u05b7\xbd\xf9i\x8e\xa8\u7d0a\x89Hz\x9a0E9D\x00\x00\xe0\x94\x0e\xb5\xb6b\xa1\xc7\x18`\x8f\xd5/\f%\xf97\x880\x17\x85\x19\x8a\x01J7(\x1aa.t\x00\x00\xe0\x94\x0e\xc4f\x96\xff\xac\x1fX\x00_\xa8C\x98$\xf0\x8e\xed\x1d\xf8\x9b\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x0e\xc5\n\xa8#\xf4e\xb9FK\v\xc0\u0125w$\xa5U\xf5\u058a\f\x83\xd1Bj\u01f1\xf0\x00\x00\u07d4\x0e\xc50\x8b1(.!\x8f\xc9\xe7Y\xd4\xfe\xc5\xdb7\b\xce\u01096C\xaady\x86\x04\x00\x00\u07d4\x0e\xcc\xf6\x17\x84O\xd6\x1f\xbab\xcb\x0eD[z\u018b\xcc\x1f\xbe\x89\x14\xfeO\xe65e\xc6\x00\x00\u07d4\x0e\u04fb:N\xb5T\xcf\u0297\x94}WU\a\xcd\xfdm!\u0609\x1d\xb3 _\xcc#\u0540\x00\u07d4\x0e\xd7l,;]P\xff\x8f\xb5\v>\xea\xcdh\x15\x90\xbe\x1c-\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x0e\u0680\xf4\xed\aJ\xeaiz\xed\xdf(;c\xdb\xca=\xc4\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e\xddKX\x0f\xf1\x0f\xe0lJ\x03\x11b9\xef\x96b+\xae5\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\x0e\xe3\x91\xf0^\u038a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x0f\x92\x9c\xf8\x95\xdb\x01z\xf7\x9f>\xad\"\x16\xb1\xbdi\xc3}\u01c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x0f\xa0\x10\xce\fs\x1d;b\x8e6\xb9\x1fW\x13\x00\u477e\xab\x8963\x03\"\xd5#\x8c\x00\x00\u07d4\x0f\xa5\xd8\u0173\xf2\x94\xef\u0515\xabi\xd7h\xf8\x18rP\x85H\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0f\xa6\u01f0\x97=\v\xae)@T\x0e$}6'\xe3|\xa3G\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x0f\xad\x05P|\u070f$\xb2\xbeL\xb7\xfa]\x92}\u06d1\x1b\x88\x89\xa2\xdf\x13\xf4A\xf0\t\x80\x00\u07d4\x0f\xb5\xd2\xc6s\xbf\xb1\xdd\xca\x14\x1b\x98\x94\xfdm?\x05\xdag \x89\x05k\xc7^-c\x10\x00\x00\u07d4\x0f\u0260\xe3AE\xfb\xfd\xd2\xc9\u04a4\x99\xb6\x17\u05e0)i\xb9\x89\t\xc2\x00vQ\xb2P\x00\x00\xe0\x94\x0f\xcf\xc4\x06P\b\xcf\xd3#0_b\x86\xb5zM\xd7\xee\xe2;\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x0f\xdde@#\x95\u07db\u045f\xeeE\a\xefSE\xf7E\x10L\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x0f\xecN\xe0\xd7\xca\x18\x02\x90\xb6\xbd \xf9\x99#B\xf6\x0f\xf6\x8d\x89\x12 \u007f\x0e\xdc\xe9q\x80\x00\u07d4\x0f\ue06c3\x1e\xfd\x8f\x81\x16\x1cW8+\xb4P{\xb9\xeb\xec\x89\x15\xaf\x88\r\x8c\u06c3\x00\x00\u07d4\x0f\xfe\xa0mq\x13\xfbj\xec(i\xf4\xa9\u07f0\x90\a\xfa\xce\xf4\x89\f8F\x81\xb1\xe1t\x00\x00\u07d4\x10\tq\x98\xb4\xe7\xee\x91\xff\x82\xcc/;\xd9_\xeds\xc5@\xc0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x10\vM\tw\xfc\xba\xd4\u07bd^d\xa0Iz\xea\xe5\x16\x8f\xab\x89\x11\f\x90s\xb5$Z\x00\x00\xe0\x94\x10\x1a\nd\xf9\xaf\xccD\x8a\x8a\x13\rM\xfc\xbe\xe8\x957\xd8T\x8a\x037\xfe_\xea\xf2\u0440\x00\x00\u07d4\x10,G}i\xaa\u06e9\xa0\xb0\xf6+tY\xe1\u007f\xbb\x1c\x15a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x101\xe0\xec\xb5I\x85\xae!\xaf\x17\x93\x95\r\xc8\x11\x88\x8f\xde|\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x104d\x14\xbe\xc6\xd3\xdc\xc4NP\xe5MT\u00b8\xc3sN>\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x108\x98X\xb8\x00\xe8\xc0\xec2\xf5\x1e\xd6\x1a5YF\xcc@\x9b\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x10Y\xcb\xc6>6\xc4>\x88\xf3\x00\b\xac\xa7\xce\x05\x8e\ua816\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\x10n\xd5\xc7\x19\xb5&\x14w\x89\x04%\xaeuQ\xdcY\xbd%\\\x8a\x02\x89jX\xc9[\xe5\x88\x00\x00\u07d4\x10q\x1c=\xda21x\x85\xf0\xa2\xfd\x8a\xe9.\x82\x06\x9b\r\v\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x10sy\xd4\xc4gFO#[\xc1\x8eU\x93\x8a\xad>h\x8a\u05c9\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\x10v!-Ou\x8c\x8e\xc7\x12\x1c\x1c}t%I&E\x92\x84\x8a\ai[Y\xb5\xc1{L\x00\x00\u07d4\x10x\xd7\xf6\x1b\x0eV\xc7N\xe6c[.\x18\x19\xef\x1e=\x87\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x10z\x03\xcf\bB\xdb\u07b0a\x8f\xb5\x87\xcai\x18\x9e\xc9/\xf5\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x10\x80\xc1\xd85\x8a\x15\xbc\x84\xda\xc8%\x89\u0392\xb9\x81\x89t\xc1\xfa\xb8\xad\xb4T\x00\x00\u07d4\x10\xe1\xe37x\x85\xc4-}\xf2\x18R.\xe7vh\x87\xc0^j\x89\x10C\xc4<\xde\x1d9\x80\x00\u07d4\x10\u342d+\xa3=\x82\xb3s\x88\u041cED\u01b0\"]\xe5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x10\xf4\xbf\xf0\u02a5\x02|\nj-\xcf\xc9R\x82M\xe2\x94\t\t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11\x00\x1b\x89\xed\x87>:\xae\xc1\x15V4\xb4h\x16C\x98c#\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x11\x027\u03d1\x17\xe7g\x92/\u0121\xb7\x8dyd\u0682\xdf \x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x11\x11\xe5\xdb\xf4^o\x90mb\x86o\x17\b\x10\x17\x88\xdd\xd5q\x89F{\xe6S>\xc2\xe4\x00\x00\xe0\x94\x11\x17+'\x8d\xddD\xee\xa2\xfd\xf4\xcb\x1d\x16\x96#\x91\xc4S\u064a\xc6/=\x9b\xfdH\x95\xf0\x00\x00\u07d4\x11&4\xb4\xec0\xffxn\x02AY\xf7\x96\xa5y9\xea\x14N\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x110l}WX\x867x\x0f\xc9\xfd\xe8\xe9\x8e\xcb\x00\x8f\x01d\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\x116\x12\xbc;\xa0\xeeH\x98\xb4\x9d\xd2\x023\x90_/E\x8fb\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x11A_\xaba\xe0\xdf\u0539\x06v\x14\x1aUz\x86\x9b\xa0\xbd\xe9\x89o\x05\xb5\x9d; \x00\x00\x00\u07d4\x11L\xbb\xbfo\xb5*\xc4\x14\xbe~\xc6\x1f{\xb7\x14\x95\xce\x1d\xfa\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x11L\xfe\xfeP\x17\r\xd9z\xe0\x8f\nDTIx\u0159T\x8d\x89.\u0207\xe7\xa1J\x1c\x00\x00\u07d4\x11a\b\xc1 \x84a.\xed\xa7\xa9=\xdc\xf8\xd2`.'\x9e\\\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11d\u02aa\x8c\u0157z\xfe\x1f\xad\x8a}`(\xce-W)\x9b\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x11gZ%UF\a\xa3\xb6\xc9*\x9e\xe8\xf3ou\xed\xd3\xe36\x89\b\xa9\xab\xa5W\xe3l\x00\x00\u07d4\x11j\t\xdff\xcb\x15\x0e\x97W\x8e)\u007f\xb0n\x13\x04\f\x89<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11o\xef^`\x16B\xc9\x18\u02c9\x16\x0f\xc2);\xa7\x1d\xa96\x89+|\xc2\xe9\xc3\"\\\x00\x00\u07d4\x11xP\x1f\xf9J\xdd\x1cX\x81\xfe\x88a6\xf6\xdf\xdb\xe6\x1a\x94\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x11y\xc6\r\xbd\x06\x8b\x15\v\aM\xa4\xbe#\x03; \u0185X\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4\x11}\x9a\xa3\xc4\xd1;\xee\x12\xc7P\x0f\t\xf5\xdd\x1cf\xc4e\x04\x89\v*\xd3\x04\x90\xb2x\x00\x00\xe0\x94\x11}\xb867\u007f\xe1TU\xe0,.\xbd\xa4\v\x1c\xebU\x1b\x19\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x11\x8c\x18\xb2\xdc\xe1p\xe8\xf4Eu;\xa5\xd7Q<\xb7cm-\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4\x11\x8f\xbdu;\x97\x929Z\xefzMx\xd2c\xcd\u02ab\xd4\xf7\x8963\x03\"\xd5#\x8c\x00\x00\xe0\x94\x11\x92\x83x\xd2}U\xc5 \xce\xed\xf2L\xeb\x1e\x82-\x89\r\xf0\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x11\x9a\xa6M[}\x18\x1d\xae\x9d<\xb4I\x95\\\x89\xc1\xf9c\xfa\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94\x11\xc05\x8a\xa6G\x9d\xe2\x18f\xfe!\a\x19$\xb6^p\xf8\xb9\x8a\a\xb5?y\xe8\x88\xda\xc0\x00\x00\xe0\x94\x11\xd2$z\"\x1ep\xc2\xd6m\x17\xee\x13\x8d8\xc5_\xfb\x86@\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x11\u05c4JG\x1e\xf8\x9a\x8d\x87uUX<\xee\xbd\x149\xea&\x8a\x02#i\u6e80\u0188\x00\x00\u07d4\x11\xdda\x85\u0668\xd7=\xdf\u06a7\x1e\x9bwtC\x1cM\xfe\u008965\u026d\xc5\u07a0\x00\x00\u07d4\x11\xe7\x99~\u0750E\x03\xd7}\xa6\x03\x8a\xb0\xa4\xc84\xbb\xd5c\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4\x11\xec\x00\xf8I\xb61\x9c\xf5\x1a\xa8\u074ff\xb3U)\xc0\xbew\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11\ufe22\x04Q\x16\x1bdJ\x8c\u03bb\xc1\xd3C\xa3\xbb\xcbR\x89\xadx\xeb\u016cb\x00\x00\x00\xe0\x94\x11\xfe\xfb]\xc1\xa4Y\x8a\xa7\x12d\fQwu\u07e1\xd9\x1f\x8c\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x12\x0f\x9d\xe6\xe0\xaf~\xc0*\a\xc6\t\u0284G\xf1W\xe64L\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x12\x10\xf8\v\u06c2l\x17Tb\xab\a\x16\xe6\x9eF\xc2J\xd0v\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x12\x13N\u007fk\x01{\xf4\x8e\x85Z9\x9c\xa5\x8e.\x89/\xa5\u020965\u026d\xc5\u07a0\x00\x00\u07d4\x12\x170t\x98\x01S\xae\xaaK\r\xcb\xc7\x13.\xad\xce\xc2\x1bd\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4\x12\x1f\x85[p\x14\x9a\xc84s\xb9po\xb4MG\x82\x8b\x98;\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x12'\xe1\nM\xbf\x9c\xac\xa3\x1b\x17\x80#\x9fUv\x15\xfc5\xc1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x12-\xcf\xd8\x1a\u0779}\x1a\x0eI%\u0135I\x80n\x9f;\xeb\x89R 5\xccn\x01!\x00\x00\u07d4\x12/V\x12%I\xd1h\xa5\xc5\xe2g\xf5&b\xe5\xc5\xcc\xe5\u0209\n\ad\a\xd3\xf7D\x00\x00\xe0\x94\x121o\xc7\xf1x\xea\xc2.\xb2\xb2Z\xed\xea\xdf=u\xd0\x01w\x8a\x04<3\xbe\x05\xf6\xbf\xb9\x80\x00\xe0\x94\x127Y\xf33\xe1>0i\xe2\x03KO\x059\x89\x18\x11\x9d6\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x12\\\xc5\xe4\xd5k+\xcc.\xe1\xc7\t\xfb\x9eh\xfb\x17t@\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x12c#\x88\xb2v^\xe4E+P\x16\x1d\x1f\xff\xd9\x1a\xb8\x1fJ\x89(\x1d\x90\x1fO\xdd\x10\x00\x00\u07d4\x12h\x97\xa3\x11\xa1J\xd4;x\xe0\x92\x01\x00\xc4Bk\xfdk\u07494\xc7&\x89?-\x94\x80\x00\u07d4\x12m\x91\xf7\xad\x86\u07bb\x05W\xc6\x12\xca'n\xb7\xf9m\x00\xa1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x12}?\xc5\x00;\xf6<\r\x83\xe99W\x83e\x15\xfd'\x90E\x89\x06\x10\xc9\".nu\x00\x00\xe0\x94\x12}\xb1\xca\xdf\x1bw\x1c\xbdtu\xe1\xb2ri\x0fU\x8c\x85e\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x12\x84\xf0\xce\xe9\xd2\xff)\x89\xb6Ut\xd0o\xfd\x9a\xb0\xf7\xb8\x05\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x12\x8b\x90\x8f\xe7C\xa44 =\xe2\x94\xc4A\xc7\xe2\n\x86\xeag\x89&\xab\x14\xe0\xc0\xe1<\x00\x00\xe0\x94\x12\x93\u01cc}jD;\x9dt\xb0\xba^\xe7\xbbG\xfdA\x85\x88\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\x12\x96\xac\xde\xd1\xe0c\xaf9\xfe\x8b\xa0\xb4\xb6=\xf7\x89\xf7\x05\x17\x89\x05k\xf9\x1b\x1ae\xeb\x00\x00\u07d4\x12\xaa}\x86\xdd\xfb\xad0\x16\x92\xfe\xac\x8a\b\xf8A\xcb!\\7\x89\amA\xc6$\x94\x84\x00\x00\xe0\x94\x12\xaf\xbc\xba\x14'\xa6\xa3\x9e{\xa4\x84\x9fz\xb1\xc45\x8a\xc3\x1b\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x12\xb5\xe2\x89E\xbb)i\xf9\xc6Lc\xcc\x05\xb6\xf1\xf8\xd6\xf4\u054a\x01\xa2\x9e\x86\x91;t\x05\x00\x00\u0794\x12\u03cb\x0eFR\x13!\x1a[S\u07f0\xdd'\x1a(,\x12\u0248\xd2\xf1?w\x89\xf0\x00\x00\u07d4\x12\xd2\a\x90\xb7\xd3\xdb\u060c\x81\xa2y\xb8\x12\x03\x9e\x8a`;\u0409V\xf9\x85\u04c6D\xb8\x00\x00\xe0\x94\x12\xd6\re\xb7\xd9\xfcH\x84\v\xe5\xf8\x91\xc7E\xcev\xeeP\x1e\x8a\x04\x85\xe58\x8d\fv\x84\x00\x00\u0794\x12\xd9\x1a\x92\xd7O\xc8a\xa7)dm\xb1\x92\xa1%\xb7\x9fSt\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\x12\u992d*\xd5t\x84\xddp\x05e\xbd\xdbFB;\u067d1\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\x12\xf3,\n\x1f-\xaa\xb6v\xfei\xab\xd9\xe0\x185-L\xcdE\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x12\xf4`\xaedl\xd2x\x0f\xd3\\P\xa6\xafK\x9a\xcc\xfa\x85\u018965\u026d\xc5\u07a0\x00\x00\u07d4\x12\xff\xc1\x12\x86\x05\xcb\f\x13p\x9ar\x90Po&\x90\x97q\x93\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\x13\x03$F\xe7\xd6\x10\xaa\x00\xec\x8cV\u0275t\xd3l\xa1\xc0\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13\x1cy,\x19}\x18\xbd\x04]p$\x93|\x1f\x84\xb6\x0fD8\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13\x1d\xf8\xd30\xeb|\xc7\x14}\nUWo\x05\u078d&\xa8\xb7\x89\n1\x06+\xee\xedp\x00\x00\u07d4\x13\x1f\xae\xd1%a\xbbz\xee\x04\xe5\x18Z\xf8\x02\xb1\xc3C\x8d\x9b\x89\v\xdf\x0e\u0733\x90\xc9\xc8V\b\xb7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13!\xcc\xf2\x979\xb9t\xe5\xa5\x16\xf1\x8f:\x846q\xe3\x96B\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13'\xd7Y\xd5n\n\xb8z\xf3~\xcfc\xfe\x01\xf3\x10\xbe\x10\n\x89#\xbc<\xdbh\xa1\x80\x00\x00\u07d4\x13)\xdd\x19\xcdK\xaa\x9f\xc6C\x10\xef\xec\xea\xb2!\x17%\x1f\x12\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x137\x1f\x92\xa5n\xa88\x1eC\x05\x9a\x95\x12\x8b\xdcMC\u0166\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x13O\x15\xe1\xe3\x9cSCY0\xaa\xed\xf3\xe0\xfeV\xfd\xe8C\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x13Ac\xbe\x9f\xbb\xe1\xc5in\xe2U\xe9\v\x13%C\x95\xc3\x18\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x13\\\xec\xd9U\xe5y\x83pv\x920\x15\x93\x03\u0671\x83\x9ff\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x13]\x17\x19\xbf\x03\xe3\xf8f1$y\xfe3\x81\x18\xcd8~p\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x13^\xb8\xc0\xe9\xe1\x01\xde\xed\xec\x11\xf2\xec\xdbf\xae\x1a\xae\x88g\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x13`\xe8}\xf2Li\xeemQ\xc7nsv\u007f\xfe\x19\xa2\x13\x1c\x89\x04\xfc\xc1\xa8\x90'\xf0\x00\x00\u07d4\x13l\x83K\xf1\x112m s\x95)[.X>\xa7\xf35r\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x13mKf+\xbd\x10\x80\xcf\xe4D[\x0f\xa2\x13\x86D5\xb7\xf1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13oI\a\u02b4\x1e'\bK\x98E\x06\x9f\xf2\xfd\f\x9a\xdey\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13t\xfa\xcd{?\x8dhd\x9d`\xd4U\x0e\xe6\x9f\xf0HA3\x89\x0e\x9e\xd6\xe1\x11r\xda\x00\x00\u07d4\x13|\xf3A\xe8Ql\x81X\x14\xeb\xcds\xe6V\x9a\xf1L\xf7\xbc\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x13\x84\x8bF\xeau\xbe\xb7\xea\xa8_Y\xd8f\xd7\u007f\xd2L\xf2\x1a\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\x13\x9d51\u0252*\xd5bi\xf60\x9a\xa7\x89\xfb$\x85\xf9\x8c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13\x9eG\x97d\xb4\x99\xd6f \x8cJ\x8a\x04z\x97\x041c\u0749 w!*\xffm\xf0\x00\x00\u07d4\x13\xa5\xee\xcb80]\xf9Iq\xef-\x9e\x17\x9a\xe6\u03ba\xb37\x89\x11\u3ac3\x95\xc6\xe8\x00\x00\u07d4\x13\xac\xad\xa8\x98\n\xff\xc7PI!\xbe\x84\xebID\xc8\xfb\xb2\xbd\x89V\u04aa:\\\t\xa0\x00\x00\u07d4\x13\xb9\xb1\a\x15qL\t\xcf\xd6\x10\u03dc\x98F\x05\x1c\xb1\xd5\x13\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x13\xce3-\xffe\xa6\xab\x938\x97X\x8a\xa2>\x00\t\x80\xfa\x82\x89\x0e\x02\x056\xf0(\xf0\x00\x00\u07d4\x13\xd6z~%\xf2\xb1,\u06c5XP\t\xf8\xac\u011b\x96s\x01\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x13\xde\xe0>7\x99\x95-\a8\x84=K\xe8\xfc\n\x80?\xb2\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13\xe0/\xb4H\xd6\xc8J\xe1}\xb3\x10\xad(m\x05a`\u0695\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13\xe3!r\x8c\x9cWb\x80X\xe9?\xc8f\xa02\xdd\v\u0690\x89&\xbc\xca#\xfe.\xa2\x00\x00\u07d4\x13\xec\x81\"\x84\x02n@\x9b\xc0f\xdf\xeb\xf9\u0564\xa2\xbf\x80\x1e\x89WG=\x05\u06ba\xe8\x00\x00\xe0\x94\x14\x01)\xea\xa7f\xb5\xa2\x9f[:\xf2WND\t\xf8\xf6\xd3\xf1\x8a\x01Z\xf1\u05cbX\xc4\x00\x00\x00\u07d4\x14\x05\x18\xa3\x19K\xad\x13P\xb8\x94\x9ee\x05e\u07bem\xb3\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x14\x06\x85M\x14\x9e\b\x1a\xc0\x9c\xb4\xcaV\r\xa4c\xf3\x120Y\x89Hz\x9a0E9D\x00\x00\u07d4\x14\f\xa2\x8f\xf3;\x9ff\xd7\xf1\xfc\x00x\xf8\xc1\xee\xf6\x9a\x1b\xc0\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x14\x0f\xbaX\xdb\xc0H\x03\xd8L!0\xf0\x19x\xf9\xe0\xc71)\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\x14\x1a^9\xee/h\n`\x0f\xbfo\xa2\x97\u0790\xf3\"\\\u074a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x14%N\xa1&\xb5-\x01B\xda\n~\x18\x8c\xe2U\xd8\xc4qx\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4\x14+\x87\xc5\x04?\xfbZ\x91\xdf\x18\xc2\xe1\t\xce\xd6\xfeJq\u06c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x14\x87\xf5\xa5$\u0288Q^\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4\x14\xa75 f6D\x04\xdbP\xf0\xd0\u05cduJ\"\x19\x8e\xf4\x89e\xea=\xb7UF`\x00\x00\u07d4\x14\xab\x16K;RL\x82\u05ab\xfb\xc0\u0783\x11&\xae\x8d\x13u\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x14\xb1`>\xc6+ \x02 3\xee\xc4\xd6\xd6eZ\xc2J\x01Z\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\x14\xc6;\xa2\u0731\xddM\xf3=\u06b1\x1cO\x00\a\xfa\x96\xa6-\x8a\x03HA\xb6\x05z\xfa\xb0\x00\x00\xe0\x94\x14\xcd\u077c\x8b\t\xe6gZ\x9e\x9e\x05\t\x1c\xb9\"8\u00de\x1e\x8a\x01\x14x\xb7\xc3\n\xbc0\x00\x00\u07d4\x14\xd0\n\xad9\xa0\xa7\u045c\xa0SP\xf7\xb07'\xf0\x8d\xd8.\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x14\xee\xc0\x9b\xf0>5+\xd6\xff\x1b\x1e\x87k\xe6d\xce\xff\xd0\u03c9\x01\x16\xdc:\x89\x94\xb3\x00\x00\u07d4\x14\xf2!\x15\x95\x18x;\u0127\x06go\xc4\xf3\xc5\xee@X)\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x14\xfc\xd19\x1e}s/Avl\xda\u0344\xfa\x1d\xeb\x9f\xfd\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4\x15\x0e=\xbc\xbc\xfc\x84\xcc\xf8\x9bsBwc\xa5e\xc2>`\u0409\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\x15\x18b{\x885\x1f\xed\xe7\x96\xd3\xf3\b3d\xfb\u0508{\f\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u0794\x15\"J\xd1\xc0\xfa\xceF\xf9\xf5V\xe4wJ0%\xad\x06\xbdR\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\x15/+\xd2)\xdd\xf3\xcb\x0f\xda\xf4U\xc1\x83 \x9c\x0e\x1e9\xa2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x15/N\x86\x0e\xf3\xee\x80jP'w\xa1\xb8\xdb\xc9\x1a\x90vh\x89 \x86\xac5\x10R`\x00\x00\u07d4\x15<\b\xaa\x8b\x96\xa6\x11\xefc\xc0%>*C4\x82\x9eW\x9d\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\x15<\xf2\x84,\xb9\u0787l'o\xa6Gg\u0468\xec\xf5s\xbb\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15>\xf5\x8a\x1e.z>\xb6\xb4Y\xa8\n\xb2\xa5G\xc9A\x82\xa2\x8a\x14T+\xa1*3|\x00\x00\x00\u07d4\x15DY\xfa/!1\x8e44D\x97\x89\xd8&\xcd\xc1W\f\xe5\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15G\xb9\xbfz\xd6bt\xf3A8'#\x1b\xa4\x05\ue308\xc1\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\x15H\xb7p\xa5\x11\x8e\u0787\u06e2\xf6\x903\u007fam\u60eb\x89\x1c\x99V\x85\u0fc7\x00\x00\u07d4\x15R\x83P\xe0\xd9g\n.\xa2\u007f{J3\xb9\xc0\xf9b\x1d!\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\x15[7y\xbbmV4./\u0681{[-\x81\xc7\xf4\x13'\x89\x02\xb8\xaa:\al\x9c\x00\x00\u07d4\x15e\xaf\x83~\xf3\xb0\xbdN+#V\x8dP#\xcd4\xb1d\x98\x89\x15Q\xe9rJ\u013a\x00\x00\u07d4\x15f\x91\x80\xde\u2558\x86\x9b\b\xa7!\xc7\xd2LL\x0e\xe6?\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x15r\xcd\xfa\xb7*\x01\u0396\x8ex\xf5\xb5D\x8d\xa2\x98S\xfb\u074a\x01\x12blI\x06\x0f\xa6\x00\x00\xe0\x94\x15uY\xad\xc5Wd\xccm\xf7\x93#\t%4\xe3\xd6dZf\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x15x\xbd\xbc7\x1bM$8E3\x05V\xff\xf2\xd5\xefM\xffg\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x15~\xb3\xd3\x11;\u04f5\x97qM:\x95N\xdd\x01\x89\x82\xa5\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x15\x84\xa2\xc0f\xb7\xa4U\xdb\u05ae(\a\xa73N\x83\xc3_\xa5\x89\a\f\x1c\xc7;\x00\xc8\x00\x00\u07d4\x15\x87F\x86\xb6s=\x10\xd7\x03\xc9\xf9\xbe\xc6\xc5.\xb8b\x8dg\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x15\x8a\ra\x92S\xbfD2\xb5\xcd\x02\u01f8b\xf7\u00b7V6\x89\a[\xac|[\x12\x18\x80\x00\u07d4\x15\x98\x12y\x82\xf2\xf8\xad;k\x8f\xc3\xcf'\xbfax\x01\xba+\x89\t`\xdbwh\x1e\x94\x00\x00\xe0\x94\x15\x9a\xdc\xe2z\xa1\vG#d)\xa3JZ\xc4,\xad[d\x16\x8a\x06\xbf\x90\xa9n\xdb\xfaq\x80\x00\u07d4\x15\xa0\xae\xc3\u007f\xf9\xff=T\t\xf2\xa4\xf0\xc1!*\xac\xcb\x02\x96\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x15\xaaS\r\xc3iX\xb4\xed\xb3\x8e\xeem\xd9\xe3\xc7}L\x91E\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15\xac\xb6\x15h\xecJ\xf7\xea(\x198a\x81\xb1\x16\xa6\xc5\xeep\x8a\x06\x90\x83l\n\xf5\xf5`\x00\x00\u07d4\x15\xb9o0\xc2;\x86d\xe7I\x06Q\x06k\x00\xc49\x1f\xbf\x84\x89\x16B\xe9\xdfHv)\x00\x00\u07d4\x15\xc7\xed\xb8\x11\x8e\xe2{4\"\x85\xebY&\xb4z\x85[\u01e5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x15\u0654hPz\xa0A?\xb6\r\xca*\xdc\u007fV\x9c\xb3kT\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15\u06f4\x8c\x980\x97d\xf9\x9c\xed6\x92\xdc\xca5\xee0k\xac\x8a\x1f\u00c4+\xd1\xf0q\xc0\x00\x00\xe0\x94\x15\u072f\xcc+\xac\xe7\xb5[T\xc0\x1a\x1cQF&\xbfa\xeb\u060a\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4\x15\u3d44\x05kb\xc9s\xcf^\xb0\x96\xf1s>T\xc1\\\x91\x892\xc7Z\x02#\xdd\xf3\x00\x00\u07d4\x15\xeb\xd1\xc7\xca\u04af\xf1\x92u\xc6W\xc4\xd8\b\xd0\x10\xef\xa0\xf5\x89\n\xdf0\xbap\u0217\x00\x00\u07d4\x15\xee\x0f\xc6>\xbf\x1b\x1f\u011d{\xb3\x8f\x88c\x82:.\x17\u0489g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x15\xf1\xb3R\x11\rh\x90\x1d\x8fg\xaa\xc4jl\xfa\xfe\x03\x14w\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x15\xf2\xb7\xb1d2\xeeP\xa5\xf5[A#/c4\xedX\xbd\xc0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x16\x01\x9aM\xaf\xabC\xf4\u067fAc\xfa\xe0\x84}\x84\x8a\xfc\xa2\x89\x01[\xc7\x019\xf7J\x00\x00\u07d4\x16\x02&\xef\xe7\xb5:\x8a\xf4b\xd1\x17\xa0\x10\x80\x89\xbd\xec\xc2\u0449\n\xdf0\xbap\u0217\x00\x00\u07d4\x16\f\xebo\x98\x0e\x041_S\xc4\xfc\x98\x8b+\xf6\x9e(M}\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\xe0\x94\x16\x1c\xafZ\x97*\u0383y\xa6\u0420J\xe6\xe1c\xfe!\xdf+\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x16\x1d&\xefgY\xba[\x9f \xfd\xcdf\xf1a2\xc3RA^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16!\x10\xf2\x9e\xac_}\x02\xb5C\xd8\xdc\u057bY\xa5\xe3;s\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x16+\xa5\x03'b\x14\xb5\t\xf9u\x86\xbd\x84!\x10\xd1\x03\xd5\x17\x8a\x01\xe7\xff\u0609\\\"h\x00\x00\u07d4\x16-v\xc2\xe6QJ:\xfbo\xe3\xd3\u02d3\xa3\\Z\xe7\x83\xf1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16;\xadJ\x12+E}d\xe8\x15\nA>\xaeM\a\x02>k\x89\x01\x04\xe7\x04d\xb1X\x00\x00\u07d4\x16<\u023e\"vF\xcb\tq\x91Y\xf2\x8e\u041c]\xc0\xdc\xe0\x89Hz\x9a0E9D\x00\x00\u07d4\x16=\xcas\xd7\xd6\xea?>`b2*\x874\x18\f\vx\uf25ft \x03\xcb}\xfc\x00\x00\u07d4\x16Mz\xac>\xec\xba\uc86dQ\x91\xb7S\xf1s\xfe\x12\xec3\x89(VR\xb8\xa4hi\x00\x00\u07d4\x16Rl\x9e\u07d4>\xfaOm\x0f\v\xae\x81\xe1\x8b1\xc5@y\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x16S\x05\xb7\x872.%\xdcj\xd0\xce\xfelo3Fx\xd5i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16e\xab\x179\xd7\x11\x19\xeea2\xab\xbd\x92j'\x9f\xe6yH\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x16k\xf6\u06b2-\x84\x1bHl8\xe7\xbaj\xb3:\x14\x87\ud30a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x16v\x99\xf4\x8ax\xc6\x15Q%\x15s\x99X\x993\x12WO\a\x89\x02\x1d;\xd5^\x80<\x00\x00\u07d4\x16x\xc5\xf2\xa5\"92%\x19ca\x89OS\xccu/\xe2\xf3\x89h\xf3e\xae\xa1\xe4@\x00\x00\u07d4\x16|\xe7\xdee\xe8G\bYZRT\x97\xa3\xeb^ZfPs\x89\x1f1Gsfo\xc4\x00\x00\u07d4\x16~>:\xe2\x003HE\x93\x92\xf7\xdf\xceD\xaf|!\xadY\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x16\x80\xce\xc5\x02\x1e\xe90P\xf8\xae\x12rQ\x83\x9et\xc1\xf1\xfd\x8a\x02\xc6\x14a\xe5\xd7C\u0580\x00\u07d4\x16\x81j\xac\x0e\xde\r-<\xd4B\xday\xe0c\x88\x0f\x0f\x1dg\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x16\x8bP\x19\xb8\x18i\x16D\x83_\xe6\x9b\xf2)\xe1q\x12\xd5,\x8a\x05\xed\xe2\x0f\x01\xa4Y\x80\x00\x00\u07d4\x16\x8b\xde\xc8\x18\xea\xfcm)\x92\xe5\xefT\xaa\x0e\x16\x01\xe3\xc5a\x8967Pz0\xab\xeb\x00\x00\u07d4\x16\x8d0\xe5?\xa6\x81\t+R\xe9\xba\xe1Z\r\xcbA\xa8\u027b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x16\x9b\xbe\xfcA\xcf\xd7\xd7\u02f8\xdf\xc60 \xe9\xfb\x06\u0515F\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xa5\x8e\x98]\xcc\xd7\a\xa5\x94\u0453\xe7\u0327\x8b]\x02xI\x89I\xb9\u029aiC@\x00\x00\u07d4\x16\xa9\xe9\xb7:\u92c6M\x17(y\x8b\x87f\xdb\xc6\xea\x8d\x12\x893\xe7\xb4K\r\xb5\x04\x00\x00\u07d4\x16\xaaR\xcb\vUG#\xe7\x06\x0f!\xf3'\xb0\xa6\x83\x15\xfe\xa3\x89\r\x8drkqw\xa8\x00\x00\u07d4\x16\xab\xb8\xb0!\xa7\x10\xbd\u01ce\xa54\x94\xb2\x06\x14\xffN\xaf\xe8\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x16\xaf\xa7\x87\xfc\x9f\x94\xbd\xffiv\xb1\xa4/C\n\x8b\xf6\xfb\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xba\xe5\xd2N\xff\x91w\x8c\u064bM:\x1c\xc3\x16/D\xaaw\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\x16\xbc@!Z\xbb\u066e](\v\x95\xb8\x01\vE\x14\xff\x12\x92\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x16\xbeu\u9299Z9R\"\xd0\v\u05df\xf4\xb6\xe68\u144a\a\x9f\x90\\o\xd3N\x80\x00\x00\u07d4\x16\xc1\xbf[}\xc9\xc8<\x17\x9e\xfa\xcb\xcf.\xb1t\xe3V\x1c\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x16\u01f3\x1e\x8c7b\x82\xac\"qr\x8c1\xc9^5\xd9R\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xf3\x13\u03ca\xd0\x00\x91J\n\x17m\u01a44+y\xec%8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xff\xac\x84\x03)@\xf0\x12\x1a\tf\x8b\x85\x8a~y\xff\xa3\xbb\x89\xd2J\xdan\x10\x87\x11\x00\x00\xe0\x94\x17\x03\xb4\xb2\x92\xb8\xa9\xde\xdd\xed\xe8\x1b\xb2]\x89\x17\x9fdF\xb6\x8a\x04+e\xa4U\xe8\xb1h\x00\x00\u07d4\x17\x04\x93\x11\x10\x1d\x81~\xfb\x1de\x91\x0ff6b\xa6\x99\u024c\x89lh\xcc\u041b\x02,\x00\x00\u07d4\x17\x04\xce\xfc\xfb\x131\xeczx8\x8b)9>\x85\xc1\xafy\x16\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x17\n\x88\xa8\x99\u007f\x92\xd287\x0f\x1a\xff\xde\xe64pP\xb0\x13\x89\xa2\xacw5\x14\x880\x00\x00\u07d4\x17\x10\x8d\xab,P\xf9\x9d\xe1\x10\u1cf3\xb4\u0342\xf5\xdf(\xe7\x895 ;g\xbc\xca\xd0\x00\x00\xe0\x94\x17\x12[Y\xacQ\xce\xe0)\xe4\xbdx\xd7\xf5\x94}\x1e\xa4\x9b\xb2\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4\x17\x1a\u0660K\xed\u0238a\xe8\xedK\xdd\xf5qx\x13\xb1\xbbH\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x17\x1c\xa0*\x8bmb\xbfL\xa4~\x90i\x14\a\x98a\x97,\xb2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x17\"\xc4\xcb\xe7\n\x94\xb6U\x9dBP\x84\xca\xee\xd4\xd6\xe6n!\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x17X\vvotSR\\\xa4\u01a8\x8b\x01\xb5\x05p\xea\b\x8c\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x17X\x9al\x00jT\xca\xd7\x01\x03\x12:\xae\n\x82\x13_\u07b4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x17Z\x18::#_\xfb\xb0;\xa85gRg\"\x94\x17\xa0\x91\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\x17_\xee\xea*\xa4\xe0\xef\xda\x12\xe1X\x8d/H2\x90\xed\xe8\x1a\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x17e6\x1c.\xc2\xf86\x16\u0383c\xaa\xe2\x10%\xf2Vo@\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x17gR\\_Z\"\xed\x80\xe9\xd4\xd7q\x0f\x03b\u049e\xfa3\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x17v%`\xe8*\x93\xb3\xf5\"\xe0\xe5$\xad\xb8a,:tp\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x17}\xaex\xbc\x01\x13\xd8\u04dcD\x02\xf2\xa6A\xae*\x10Z\xb8\x89b\x92BV \xb4H\x00\x00\xe0\x94\x17\x84\x94\x8b\xf9\x98H\u021eDV8PM\u0598'\x1bY$\x8a\x01GLA\r\x87\xba\xee\x00\x00\u07d4\x17\x88\u069bW\xfd\x05\xed\xc4\xff\x99\xe7\xfe\xf3\x01Q\x9c\x8a\n\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\x8e\xafk\x85T\xc4]\xfd\xe1kx\xce\f\x15\u007f.\xe3\x13Q\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\x17\x96\x1dc;\xcf \xa7\xb0)\xa7\xd9K}\xf4\xda.\xc5B\u007f\x89\fo\xf0p\U000532c0\x00\u07d4\x17\x96\xbc\xc9{\x8a\xbcq\u007fKJ|k\x106\xea!\x82c\x9f\x89\x13A\xf9\x1c\xd8\xe3Q\x00\x00\u07d4\x17\x99=1*\xa1\x10iW\x86\x8fjU\xa5\xe8\xf1/w\xc8C\x89\x18e\xe8\x14\xf4\x14.\x80\x00\u07d4\x17\x9a\x82^\x0f\x1fn\x98S\tf\x84e\xcf\xfe\xd46\xf6\xae\xa9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x17\xb2\xd6\xcfe\xc6\xf4\xa3G\xdd\xc6W&U5M\x8aA+)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\xb8\a\xaf\xa3\xdd\xd6G\xe7#T.{R\xfe\xe3\x95'\xf3\x06\x89\x15\xaf@\xff\xa7\xfc\x01\x00\x00\u07d4\x17\xc0G\x86W\xe1\xd3\xd1z\xaa3\x1d\xd4)\xce\u03d1\xf8\xae]\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\x17\xc0\xfe\xf6\x98l\xfb.@A\xf9\x97\x9d\x99@\xb6\x9d\xff=\xe2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x17\u0511\x8d\xfa\xc1]w\xc4\u007f\x9e\xd4\x00\xa8P\x19\rd\xf1Q\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\xd5!\xa8\xd9w\x90#\xf7\x16M#<;d \xff\xd2#\xed\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x17\xd91\xd4\xc5b\x94\u073ew\xc8e[\xe4i_\x00mJ<\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x17\xdfIQ\x8ds\xb1)\xf0\xda6\xb1\u0274\f\xb6d \xfd\u01ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x17\xe4\xa0\xe5+\xac>\xe4N\xfe\tT\xe7S\u0538]dN\x05\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x17\xe5\x84\xe8\x10\xe5gp,a\xd5]CK4\u0375\xee0\xf6\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x17\xe8.px\xdcO\xd9\xe8y\xfb\x8aPf\u007fS\xa5\xc5E\x91\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x17\xe8o;[0\xc0\xbaY\xf2\xb2\xe8XB[\xa8\x9f\n\x10\xb0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x17\xee\x9fT\xd4\xdd\xc8Mg\x0e\xff\x11\xe5Je\x9f\xd7/DU\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\xe0\x94\x17\xefJ\xcc\x1b\xf1G\xe3&t\x9d\x10\xe6w\xdc\xff\xd7o\x9e\x06\x8a\bwQ\xf4\xe0\xe1\xb50\x00\x00\u07d4\x17\xf1F2\xa7\xe2\x82\v\xe6\xe8\xf6\u07c25X(=\xad\xab-\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\xf5#\xf1\x17\xbc\x9f\xe9x\xaaH\x1e\xb4\xf5V\x17\x117\x1b\u0209li\xf7>)\x13N\x00\x00\u07d4\x17\xfd\x9bU\x1a\x98\xcba\xc2\xe0\u007f\xbfA\xd3\xe8\u02650\u02e5\x89\x01v\x8c0\x81\x93\x04\x80\x00\u07d4\x18\x04x\xa6U\u05cd\x0f;\fO +aH[\xc4\x00/\u0549lk\x93[\x8b\xbd@\x00\x00\u07d4\x18\x13l\x9d\xf1g\xaa\x17\xb6\xf1\x8e\"\xa7\x02\u020fK\u0082E\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x18\x15'\x9d\xff\x99R\xda;\xe8\xf7rI\xdb\xe2\"C7{\xe7\x8a\x01\x01|\xb7n{&d\x00\x00\u07d4\x18\x1f\xbb\xa8R\xa7\xf5\x01x\xb1\xc7\xf0>\xd9\xe5\x8dT\x16))\x89$\x1a\x9bOaz(\x00\x00\xe0\x94\x18'\x03\x9f\tW\x02\x94\b\x8f\xdd\xf0G\x16\\3\u65a4\x92\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\x18-\xb8R\x93\xf6\x06\u8248\xc3pL\xb3\xf0\xc0\xbb\xbf\xcaZ\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x18H\x00<%\xbf\u052a\x90\xe7\xfc\xb5\u05f1k\xcd\f\xff\xc0\u060965\u026d\xc5\u07a0\x00\x00\xe0\x94\x18JO\v\xebq\xff\xd5X\xa6\xb6\xe8\xf2(\xb7\x87\x96\xc4\xcf>\x8a\x02\x8a\x85t%Fo\x80\x00\x00\xe0\x94\x18M\x86\xf3Fj\xe6h;\x19r\x99\x82\xe7\xa7\u1903G\xb2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x18Q\xa0c\xcc\xdb0T\x90w\xf1\xd19\xe7-\xe7\x97\x11\x97\u0549lk\x93[\x8b\xbd@\x00\x00\u07d4\x18UF\xe8v\x8dPhs\x81\x8a\xc9u\x1c\x1f\x12\x11j;\xef\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x18X\xcf\x11\xae\xa7\x9fS\x98\xad+\xb2\"g\xb5\xa3\xc9R\xeat\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\xe0\x94\x18Z\u007f\u012c\xe3h\xd23\xe6 \xb2\xa4Y5f\x12\x92\xbd\xf2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x18d\xa3\u01f4\x81UD\x8cT\u020cp\x8f\x16g\tsm1\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x18j\xfd\xc0\x85\xf2\xa3\xdc\xe4a^\xdf\xfb\xad\xf7\x1a\x11x\x0fP\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x18k\x95\xf8\xe5\xef\xfd\xdc\xc9O\x1a1[\xf0)];\x1e\xa5\x88\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x18}\x9f\f\a\xf8\xebt\xfa\xaa\xd1^\xbc{\x80Dt\x17\xf7\x82\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x18\x95\xa0\xebJCrr/\xcb\u016f\xe6\x93o(\x9c\x88\xa4\x19\x891T\xc9r\x9d\x05x\x00\x00\u07d4\x18\x99\xf6\x9fe;\x05\xa5\xa6\xe8\x1fH\a\x11\u041b\xbf\x97X\x8c\x89i\xfb\x13=\xf7P\xac\x00\x00\u07d4\x18\xa6\xd2\xfcR\xbes\b@#\xc9\x18\x02\xf0[\xc2JK\xe0\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x18\xb0@|\xda\xd4\xceR`\x06#\xbd^\x1fj\x81\xaba\xf0&\x89\x11Q\xcc\xf0\xc6T\u0180\x00\u07d4\x18\xb8\xbc\xf9\x83!\xdaa\xfbN>\xac\xc1\xecT\x17'-\xc2~\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\x18\xc6r:gS)\x9c\xb9\x14G}\x04\xa3\xbd!\x8d\xf8\xc7u\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x18\xe1\x13\xd8\x17|i\x1aa\xbexXR\xfa[\xb4z\uef6f\x89Hz\x9a0E9D\x00\x00\xe0\x94\x18\xe4\xceGH;S\x04\n\u06eb5\x17,\x01\xefdPn\f\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\xe0\x94\x18\xe52C\x98\x1a\xab\xc8v}\xa1\fsD\x9f\x13\x91V\x0e\xaa\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x18\xfa\x86%\xc9\u0704>\x00\x15\x9e\x892\xf5\x1e\u06ea\xa30\x00\x00\xe0\x94\x193\xe34\xc4\x0f:\u02ed\f\v\x85\x11X i$\xbe\xca:\x8a\x01\x99^\xaf\x01\xb8\x96\x18\x80\x00\xe0\x94\x197\xc5\xc5\x15\x05uS\u033dF\u0546dU\xcef)\x02\x84\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\u07d4\x19:\xc6Q\x83e\x18\x00\xe25\x80\xf8\xf0\xea\u04fbY~\xb8\xa4\x89\x02\xb6*\xbc\xfb\x91\n\x00\x00\u07d4\x19=7\xed4}\x1c/N55\r\x9aDK\xc5|\xa4\xdbC\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\x19@\u0713d\xa8R\x16_GAN'\xf5\x00$E\xa4\xf1C\x8a\x02L-\xffj<|H\x00\x00\u07d4\x19E\xfe7\u007f\xe6\u0537\x1e>y\x1fo\x17\xdb$<\x9b\x8b\x0f\x89vy\u7fb9\x886\x00\x00\u07d4\x19Jk\xb3\x02\xb8\xab\xa7\xa5\xb5y\u07d3\xe0\xdf\x15t\x96v%\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x19L\ubd12\x98\x82\xbf;K\xf9\x86L+\x1b\x0fb\u0083\xf9\x89\x1e\xf8aS\x1ft\xaa\x00\x00\u07d4\x19O\xf4J\xef\xc1{\xd2\x0e\xfdz LG\xd1b\f\x86\xdb]\x89\xa2\x99\th\u007fj\xa4\x00\x00\xe0\x94\x19O\xfex\xbb\xf5\xd2\r\u044a\x1f\x01\xdaU.\x00\xb7\xb1\x1d\xb1\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\x19S1>*\xd7F#\x9c\xb2'\x0fH\xaf4\u063b\x9cDe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x19W\x1a+\x8f\x81\u01bc\xf6j\xb3\xa1\x00\x83)V\x17\x15\x00\x03\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\xe0\x94\x19h}\xaa9\xc3h\x13\x9bn{\xe6\r\xc1u:\x9f\f\xbe\xa3\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x19l\x02!\nE\n\xb0\xb3cpe_qz\xa8{\xd1\xc0\x04\x89\x0e\x10\xac\xe1W\xdb\xc0\x00\x00\u07d4\x19n\x85\xdf~s+J\x8f\x0e\xd06#\xf4\u06dd\xb0\xb8\xfa1\x89\x01%\xb9/\\\xef$\x80\x00\u07d4\x19s+\xf9s\x05]\xbd\x91\xa4S:\u06a2\x14\x9a\x91\u04c3\x80\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x19vr\xfd9\xd6\xf2F\xcef\xa7\x90\xd1:\xa9\"\xd7\x0e\xa1\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x19y\x8c\xbd\xa7\x15\ua69b\x9dj\xab\x94,U\x12\x1e\x98\xbf\x91\x89A\rXj \xa4\xc0\x00\x00\u07d4\x19\x8b\xfc\xf1\xb0z\xe3\b\xfa,\x02\x06\x9a\xc9\xda\xfeq5\xfbG\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x19\x8e\xf1\xec2Z\x96\xcc5Lrf\xa08\xbe\x8b\\U\x8fg\x8a\x80\xd1\xe47>\u007f!\xda\x00\x00\xe0\x94\x19\x91\x8a\xa0\x9e}IN\x98\xff\xa5\xdbP5\b\x92\xf7\x15j\u018a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x19\xb3k\f\x87\xeafN\xd8\x03\x18\xdcw\xb6\x88\xdd\xe8}\x95\xa5\x89i\x9fI\x98\x020=\x00\x00\u07d4\x19\u07d4E\xa8\x1c\x1b=\x80J\xea\xebon NB6f?\x89\x02\x06\xd9NjI\x87\x80\x00\u07d4\x19\xe5\u07a37\n,tj\xae4\xa3|S\x1fA\xda&N\x83\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x19\xe7\xf3\xeb{\xf6\u007f5\x99 \x9e\xbe\b\xb6*\xd32\u007f\x8c\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\x19\xe9Nb\x00P\xaa\xd7f\xb9\xe1\xba\xd91#\x83\x12\u053fI\x89\x81\xe3-\xf9r\xab\xf0\x00\x00\u07d4\x19\xec\xf2\xab\xf4\f\x9e\x85{%/\xe1\xdb\xfd=L]\x8f\x81n\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x19\xf5\xca\xf4\xc4\x0ei\b\x81<\aE\xb0\xae\xa9Xm\x9d\xd91\x89#\xfe\xd9\xe1\xfa+`\x00\x00\u07d4\x19\xf6C\xe1\xa8\xfa\x04\xae\x16\x00`(\x13\x833\xa5\x9a\x96\u0787\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x19\xf9\x9f,\vF\u0389\x06\x87]\xc9\xf9\n\xe1\x04\xda\xe3U\x94\x89\xf4WZ]M\x16*\x00\x00\u07d4\x19\xff$O\xcf\xe3\xd4\xfa/O\u065f\x87\xe5[\xb3\x15\xb8\x1e\xb6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1a\x04\xce\xc4 \xadC\"\x15$mw\xfe\x17\x8d3\x9e\u0435\x95\x89\x11!a\x85\u009fp\x00\x00\xe0\x94\x1a\x04\xd58\x9e\xb0\x06\xf9\u0388\f0\xd1SS\xf8\xd1\x1cK1\x8a\x03\x9d\x84\xb2\x18m\xc9\x10\x00\x00\u07d4\x1a\bA\xb9*\u007fpuV\x9d\xc4b~kv\u02b0Z\u0791\x89Rf<\u02b1\xe1\xc0\x00\x00\xe0\x94\x1a\b]C\xec\x92AN\xa2{\x91O\xe7g\xb6\xd4k\x1e\xefD\x8a\x06A\xe8\xa15c\xd8\xf8\x00\x00\u07d4\x1a\t\xfd\xc2\u01e2\x0e#WK\x97\u019e\x93\u07bag\xd3r \x89lO\xd1\xee$nx\x00\x00\u07d4\x1a\n\x1d\u07f01\xe5\xc8\xcc\x1dF\xcf\x05\x84-P\xfd\xdcq0\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1a\x1c\x9a&\xe0\xe0$\x18\xa5\xcfh}\xa7Z'\\b,\x94@\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x1a \x1bC'\u03a7\xf3\x99\x04bF\xa3\xc8~n\x03\xa3\u0368\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1a$4\xccwD\"\u050dS\u055c]V,\u0384\a\xc9K\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\x1a%\xe1\u017c~_P\xec\x16\xf8\x88_!\x0e\xa1\xb98\x80\x0e\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x1a&\x94\xec\a\xcf^Mh\xba@\xf3\xe7\xa1LS\xf3\x03\x8cn\x8966\xcd\x06\xe2\xdb:\x80\x00\u07d4\x1a5 E5\x82\xc7\x18\xa2\x1cB7[\xc5\as%RS\xe1\x89*\xd3s\xcef\x8e\x98\x00\x00\xe0\x94\x1a7n\x1b-/Y\ai\xbb\x85\x8dEu2\rN\x14\x99p\x8a\x01\x06q%v9\x1d\x18\x00\x00\u07d4\x1a:3\x0eO\xcbi\xdb\xef^i\x01x;\xf5\x0f\xd1\xc1SB\x89\u3bb5sr@\xa0\x00\x00\u07d4\x1aN\u01a0\xae\u007fZ\x94'\xd2=\xb9rL\r\f\xff\xb2\xab/\x89\t\xb4\x1f\xbf\x9e\n\xec\x00\x00\u07d4\x1aP^b\xa7N\x87\xe5wG>O:\xfa\x16\xbe\xdd<\xfaR\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x1a^\xe53\xac\xbf\xb3\xa2\xd7m[hRw\xb7\x96\xc5j\x05+\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1adJP\xcb\u00ae\xe8#\xbd+\xf2C\xe8%\xbeMG\xdf\x02\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4\x1apD\xe28?\x87\b0[I[\xd1\x17k\x92\xe7\xef\x04:\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1ay\xc7\xf4\x03\x9cg\xa3\x9du\x13\x88L\xdc\x0e,4\"$\x90\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1a\x89\x89\x9c\xbe\xbd\xbbd\xbb&\xa1\x95\xa6<\bI\x1f\u035e\xee\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1a\x8a\\\xe4\x14\u079c\xd1r\x93~7\xf2\u055c\xffq\xceW\xa0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x1a\x95\xa8\xa8\b.FR\xe4\x17\r\xf9'\x1c\xb4\xbbC\x05\xf0\xb2\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x1a\x95\u0277Tk]\x17\x86\u00c5\x8f\xb1#dF\xbc\f\xa4\u0389j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x1a\x98~?\x83\xdeu\xa4/\x1b\xde|\x99|\x19!{J_$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1a\x9ep/8]\xcd\x10^\x8b\x9f\xa4(\xee\xa2\x1cW\xffR\x8a\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x1a\xa1\x02\x1fU\n\xf1X\xc7Gf\x8d\xd1;F1`\xf9Z@\x89O\xb0Y\x1b\x9b08\x00\x00\u07d4\x1a\xa2v\x99\xca\u068d\u00e7oy3\xaaf\xc7\x19\x19\x04\x0e\x88\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x1a\xa4\x02p\xd2\x1e\\\u0786\xb61m\x1a\xc3\xc53IKy\xed\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1a\xb5:\x11\xbc\xc6=\u07ea@\xa0+\x9e\x18d\x96\u037b\x8a\xff\x89l?*\xac\x80\f\x00\x00\x00\u07d4\x1a\xbcN%;\b\n\xebCy\x84\xab\x05\xbc\xa0\x97\x9a\xa4>\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1a\xc0\x89\u00fcM\x82\xf0j \x05\x1a\x9ds-\xc0\xe74\xcba\x89%\xf6\x9dc\xa6\xce\x0e\x00\x00\xe0\x94\x1a\xd4V>\xa5xk\xe1\x15\x995\xab\xb0\xf1\u0547\x9c>sr\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x1a\xd7- \xa7n\u007f\xcckv@X\xf4\x8dA}Io\xa6\u0349lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1a\xda\xf4\xab\xfa\x86}\xb1\u007f\x99\xafj\xbe\xbfpz<\xf5]\xf6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x1a\xf6\x03C6\x0e\v-u%R\x107W \xdf!\xdb\\}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1a\xfc\u0145\x89l\xd0\xed\xe1)\xee-\xe5\xc1\x9e\xa8\x11T\vd\x89\xaf*\xba\f\x8e[\xef\x80\x00\u07d4\x1b\x05\xeajj\u022f|\xb6\xa8\xb9\x11\xa8\xcc\xe8\xfe\x1a*\xcf\u0209lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\v1\xaf\xffKm\xf3e:\x94\xd7\xc8yx\xae5\xf3J\xae\x89\x139\x10E?\xa9\x84\x00\x00\u07d4\x1b\r\ah\x17\xe8\u058e\xe2\xdfN\x1d\xa1\xc1\x14-\x19\x8cD5\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\x1b\x13\ro\xa5\x1d\\H\xec\x8d\x1dR\u070a\"{\xe8s\\\x8a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b#\u02c6cUHq\xfb\xbe\r\x9e`9~\xfbo\xae\xdc>\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1b&9X\x8bU\xc3D\xb0#\xe8\xde_\xd4\b{\x1f\x04\x03a\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\x1b9 \xd0\x01\xc4>r\xb2N|\xa4o\x0f\xd6\xe0\xc2\n_\xf2\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1b<\xb8\x1eQ\x01\x1bT\x9dx\xbfr\v\r\x92J\xc7c\xa7\u008av\x95\xa9, \xd6\xfe\x00\x00\x00\u07d4\x1bC#,\xcdH\x80\xd6\xf4o\xa7Q\xa9l\xd8$s1XA\x89\x04V9\x18$O@\x00\x00\u07d4\x1bK\xbc\xb1\x81e!\x1b&[(\a\x16\xcb?\x1f!!v\xe8\x89\x19\x9a\xd3}\x03\xd0`\x80\x00\u07d4\x1bM\a\xac\u04c1\x83\xa6\x1b\xb2x=+{\x17\x8d\xd5\x02\xac\x8d\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1bckzIo\x04MsYYn5:\x10F\x16Cok\x89\x13\x88\xea\x95\xc3?\x1d\x00\x00\u07d4\x1bd\x95\x89\x12@\xe6NYD\x93\xc2f!q\xdb^0\xce\x13\x89\tX\x87\u0595\xedX\x00\x00\u07d4\x1bf\x10\xfbh\xba\xd6\xed\x1c\xfa\xa0\xbb\xe3:$\xeb.\x96\xfa\xfb\x89\b=lz\xabc`\x00\x00\u07d4\x1by\x903\xefm\xc7\x12x\"\xf7EB\xbb\"\xdb\xfc\t\xa3\b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x1b~\xd9t\xb6\xe24\u0381$t\x98B\x9a[\u0520\xa2\xd19\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\x82o\xb3\xc0\x12\xb0\xd1Y\u253a[\x8aI\x9f\xf3\xc0\xe0<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\x8a\xa0\x16\f\u05df\x00_\x88Q\nqI\x13\xd7\n\u04fe3\x89\n\xef\xfb\x83\a\x9a\xd0\x00\x00\xe0\x94\x1b\x8b\xd6\xd2\xec\xa2\x01\x85\xa7\x8e}\x98\xe8\xe1\x85g\x8d\xacH0\x8a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\x1b\x9b-\u0096\x0eL\xb9@\x8ft\x05\x82|\x9bY\a\x16\x12\xfd\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1b\xa9\"\x8d8\x87'\xf3\x89\x15\x0e\xa0;s\xc8-\xe8\xeb.\t\x8a\x01\x89t\xfb\xe1w\xc9(\x00\x00\u07d4\x1b\xa9\xf7\x99~S\x87\xb6\xb2\xaa\x015\xac$R\xfe6\xb4\xc2\r\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\x1b\xba\x03\xffkJ\u057f\x18\x18J\xcb!\xb1\x88\xa3\x99\xe9\xebJ\x89a\t=|,m8\x00\x00\u07d4\x1b\xbc\x19\x9eXg\x90\xbe\x87\xaf\xed\xc8I\xc0G&t\\]{\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x1b\xbc`\xbc\xc8\x0e\\\xdc5\xc5Aj\x1f\n@\xa8=\xae\x86{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\xc4L\x87a#\x1b\xa1\xf1\x1f_\xaa@\xfaf\x9a\x01>\x12\u0389\v\tR\xc4Z\xea\xad\x00\x00\u07d4\x1b\xcf4A\xa8f\xbd\xbe\x960\t\xce3\xc8\x1c\xbb\x02a\xb0,\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\x1b\u048c\xd5\u01ca\xeeQ5|\x95\xc1\xef\x925\xe7\xc1\x8b\xc8T\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\xd8\xeb\xaavt\xbb\x18\u1458\xdb$OW\x03\x13\a_C\x89\b!\xab\rD\x14\x98\x00\x00\u07d4\x1b\xd9\t\xac\rJ\x11\x02\xec\x98\xdc\xf2\u0329j\n\xdc\u05e9Q\x89\x01\x16Q\xac>zu\x80\x00\u07d4\x1b\xe3T,6\x13hte\xf1Zp\xae\xeb\x81f+e\u0328\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\xeaM\xf5\x12/\xaf\u07b3`~\xdd\xda\x1e\xa4\xff\u06da\xbf*\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\u07d4\x1b\xecM\x02\u0385\xfcH\xfe\xb6$\x89\x84\x1d\x85\xb1pXj\x9b\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\x1b\xf9t\u0650OE\u0381\xa8E\xe1\x1e\xf4\xcb\xcf'\xafq\x9e\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x1c\x04VI\xcdS\xdc#T\x1f\x8e\xd4\xd3A\x81(\b\xd5\u075c\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\x1c\x12\x8b\xd6\u0365\xfc\xa2uu\xe4\xb4;2S\xc8\xc4\x17*\xfe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\x13\u04c67\xb9\xa4|\xe7\x9d7\xa8oP\xfb@\x9c\x06\a(\x89Hz\x9a0E9D\x00\x00\u07d4\x1c \x10\xbdf-\xf4\x17\xf2\xa2q\x87\x9a\xfb\x13\xefL\x88\xa3\xae\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x1c%z\u0525Q\x05\xea;X\xed7K\x19\x8d\xa2f\xc8_c\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x1c.6\a\xe1'\xca\xca\x0f\xbd\\YH\xad\xad}\xd80\xb2\x85\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\x1c5l\xfd\xb9_\xeb\xb7\x14c;(\xd5\xc12\u0744\xa9\xb46\x89\x01Z\xf1\u05cbX\xc4\x00\x00\u07d4\x1c5\xaa\xb6\x88\xa0\u034e\xf8.vT\x1b\xa7\xac9R\u007ft;\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x1c>\xf0]\xae\x9d\xcb\u0509\xf3\x02D\bf\x9d\xe2D\xc5*\x02\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x1cJ\xf0\xe8c\xd2el\x865\xbco\xfe\xc8\u0759(\x90\x8c\xb5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c`\x19\x93x\x92\a\xf9e\xbb\x86\\\xbbL\xd6W\xcc\xe7o\xc0\x89\x05T\x1ap7P?\x00\x00\u07d4\x1cc\xfa\x9e,\xbb\xf21a\xda3\xa1\xda}\xf7\r\x1b\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1c\xb6\xb2\xd7\xcf\xc5Y\xb7\xf4\x1eoV\xab\x95\xc7\xc9X\xcd\x0eL\x89Hz\x9a0E9D\x00\x00\u07d4\x1c\xc1\xd3\xc1O\x0f\xb8d\x0e6rM\xc42)\xd2\xeaz\x1eH\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x1c\xc9\bv\x00A\t\xcdy\xa3\u07a8f\u02c4\n\xc3d\xba\x1b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\xd1\xf0\xa3\x14\u02f2\x00\xde\n\f\xb1\xef\x97\xe9 p\x9d\x97\u0089lk\x93[\x8b\xbd@\x00\x00\u0794\x1c\xdaA\x1b\xd5\x16;\xae\xca\x1eU\x85c`\x1c\xe7 \xe2N\xe1\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x1c\xe8\x1d1\xa7\x920\"\xe1%\xbfH\xa3\xe06\x93\xb9\x8d\xc9\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\xeb\xf0\x98]\u007fh\n\xaa\x91\\D\xccb\xed\xb4\x9e\xab&\x9e\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1c\xedg\x15\xf8b\xb1\xff\x86\x05\x82\x01\xfc\xceP\x82\xb3nb\xb2\x8a\x01j^`\xbe\xe2s\xb1\x00\x00\u07d4\x1c\xf0L\xb1C\x80\x05\x9e\xfd?#\x8be\u057e\xb8j\xfa\x14\u0609\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1c\xf1\x05\xab#\x02;ULX>\x86\u05d2\x11y\xee\x83\x16\x9f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x1c\xf2\xebz\x8c\xca\u00ad\xea\xef\x0e\xe8sG\xd55\u04f9@X\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\xfc\xf7Q\u007f\f\bE\x97 \x94+dz\u0452\xaa\x9c\x88(\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94\x1d\t\xad$\x12i\x1c\u0141\xc1\xab6\xb6\xf9CL\xd4\xf0\x8bT\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\x1d\x15|Xv\xc5\xca\xd5S\xc9\x12\xca\xf6\xce-Rw\xe0\\s\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1d&\x15\xf8\xb6\xcaP\x12\xb6c\xbd\u0414\xb0\xc5\x13|w\x8d\u07ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x1d)\u01ea\xb4+ H\u04b2R%\u0518\u06e6z\x03\xfb\xb2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0794\x1d4\x1f\xa5\xa3\xa1\xbd\x05\x1f}\xb8\a\xb6\xdb/\u01faO\x9bE\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x1d4N\x96%g\xcb'\xe4M\xb9\xf2\xfa\u01f6\x8d\xf1\xc1\xe6\xf7\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x1d6h0c\xb7\xe9\xeb\x99F-\xab\xd5i\xbd\xdc\xe7\x16\x86\xf2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1d7aky?\x94\x91\x188\xac\x8e\x19\xee\x94I\u07d2\x1e\u0109QP\xae\x84\xa8\xcd\xf0\x00\x00\xe0\x94\x1d9[0\xad\xda\x1c\xf2\x1f\t\x1aOJ{u3q\x18\x94A\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x1dEXn\xb8\x03\xca!\x90e\v\xf7H\xa2\xb1t1+\xb5\a\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x1dW.\xdd-\x87\xca'\x1ag\x14\xc1Z;7v\x1d\u0320\x05\x89\x06\xeb\xd5*\x8d\xdd9\x00\x00\u07d4\x1dc0\x97\xa8R%\xa1\xffC!\xb1)\x88\xfd\xd5\\+8D\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x1di\xc8=(\xff\x04t\xce\xeb\xea\xcb:\xd2'\xa1D\xec\u78ca\x01(\xcc\x03\x92\nb\u0480\x00\u07d4\x1d\x96\xbc\u0544W\xbb\xf1\xd3\u00a4o\xfa\xf1m\xbf}\x83hY\x89\tIr\t\xd8F~\x80\x00\u07d4\x1d\x9ej\xaf\x80\x19\xa0_#\x0e]\xef\x05\xaf]\x88\x9b\xd4\xd0\xf2\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x1d\xab\x17.\xff\xa6\xfb\xeeSL\x94\xb1~yN\xda\xc5OU\xf8\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x1d\xb9\xac\x9a\x9e\xae\xec\nR7W\x05\fq\xf4rx\xc7-P\x89Hz\x9a0E9D\x00\x00\u07d4\x1d\xbe\x8e\x1c+\x8a\x00\x9f\x85\xf1\xad<\xe8\r.\x055\x0e\u3709\aW\rn\x9e\xbb\xe4\x00\x00\u07d4\x1d\xc7\xf7\xda\xd8]\xf5?\x12q\x15$\x03\xf4\xe1\xe4\xfd\xb3\xaf\xa0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1d\u03bc\xb7em\xf5\u072a3h\xa0U\xd2/\x9e\xd6\xcd\xd9@\x89\x1b\x18\x1eK\xf24<\x00\x00\xe0\x94\x1d\xd7tA\x84J\xfe\x9c\xc1\x8f\x15\xd8\xc7{\xcc\xfbe^\xe04\x8a\x01\x06\xebEW\x99D\x88\x00\x00\u07d4\x1d\xde\xfe\xfd5\xab\x8fe\x8b$q\xe5G\x90\xbc\x17\xaf\x98\u07a4\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1d\xee\xc0\x1a\xbe\\\r\x95-\xe9\x10l=\xc3\x069\xd8P\x05\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\x1d\xf6\x91\x16rg\x9b\xb0\xef5\t\x03\x8c\f'\xe3\x94\xfd\xfe0\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\u07d4\x1d\xfa\xee\ar\x12\xf1\xbe\xaf\x0eo/\x18@Sz\xe1T\xad\x86\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1e\x06\r\xc6\xc5\xf1\u02cc\xc7\xe1E.\x02\xee\x16u\b\xb5eB\x8a\x02\xb1O\x02\xc8d\xc7~\x00\x00\xe0\x94\x1e\x13\xecQ\x14,\ubde2`\x83A,<\xe3QD\xbaV\xa1\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x1e\x1aH(\x11\x9b\xe3\t\xbd\x88#nMH+PM\xc5W\x11\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\x1e\x1a\ud178leb\u02cf\xa1\xebo\x8f;\xc9\u072eny\x89\xf4\xd2\u0744%\x9b$\x00\x00\u07d4\x1e\x1ccQwj\xc3\x10\x919~\xcf\x16\x00-\x97\x9a\x1b-Q\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x1e\x1dz_$h\xb9N\xa8&\x98-\xbf!%yR*\xb7\xdf\n\u02ac\x9e\xee\xd3Y09\xe5\xacuy\x8a+\x14F\xddj\xef\xe4\x1c\x00\x00\u07d4\x1e{^M\x1fW+\xec\xf2\xc0\x0f\xc9\f\xb4v{Jn3\u0509\x06\x1f\xc6\x10u\x93\xe1\x00\x00\u07d4\x1e\x8eh\x9b\x02\x91|\xdc)$]\f\x9ch\xb0\x94\xb4\x1a\x9e\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\x1e\xa34\xb5u\b\a\xeat\xaa\u016b\x86\x94\xec_(\xaaw\u03c9\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4\x1e\xa4qU\x04\u01af\x10{\x01\x94\xf4\xf7\xb1\xcbo\xcc\xcdoK\x89 \x041\x97\xe0\xb0'\x00\x00\u07d4\x1e\xa4\x92\xbc\xe1\xad\x10~3\u007fK\u0527\xac\x9a{\xab\xcc\u036b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x1e\xa6\xbf/\x15\xae\x9c\x1d\xbcd\u06a7\xf8\xeaM\r\x81\xaa\xd3\xeb\x89\u3bb5sr@\xa0\x00\x00\u07d4\x1e\xb4\xbfs\x15j\x82\xa0\xa6\x82 \x80\xc6\xed\xf4\x9cF\x9a\xf8\xb9\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\x1e\xba\xcbxD\xfd\xc3\"\xf8\x05\x90O\xbf\x19b\x80-\xb1S|\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x1e\xc4\xecKw\xbf\x19\u0411\xa8h\xe6\xf4\x91T\x18\x05A\xf9\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1e\xd0n\xe5\x16b\xa8lcE\x88\xfbb\xdcC\xc8\xf2~|\x17\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1e\u063b?\x06w\x8b\x03\x9e\x99a\xd8\x1c\xb7\x1as\xe6x|\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1e\xda\bNye\x00\xba\x14\xc5\x12\x1c\r\x90\x84of\xe4\xbeb\x89\x1c\xfd\xd7F\x82\x16\xe8\x00\x00\u07d4\x1e\xeel\xbe\xe4\xfe\x96\xadaZ\x9c\xf5\x85zdy@\u07ccx\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4\x1e\xf2\u073f\xe0\xa5\x00A\x1d\x95n\xb8\u0213\x9c=l\xfef\x9d\x89*\x11)\u0413g \x00\x00\xe0\x94\x1e\xf5\xc9\xc76P\u03fb\xde\\\x88U1\xd4'\xc7\xc3\xfeUD\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x1f\x04\x12\xbf\xed\u0356N\x83}\t,q\xa5\xfc\xba\xf3\x01&\xe2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1f\x17O@\xa0Dr4\xe6fS\x91Mu\xbc\x00>V\x90\u0709\b\xacr0H\x9e\x80\x00\x00\u07d4\x1f!\x86\xde\xd2>\f\xf9R\x16\x94\xe4\xe1dY>i\n\x96\x85\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x1f*\xfc\n\xed\x11\xbf\xc7\x1ew\xa9\ae{6\xeav\xe3\xfb\x99\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u0794\x1f9Y\xfc)\x11\x10\xe8\x822\xc3kvg\xfcx\xa3ya?\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x1f=\xa6\x8f\xe8~\xafC\xa8)\xabm~\u0166\xe0\t\xb2\x04\xfb\x89\x1e\x16\x01u\x8c,~\x00\x00\u07d4\x1fI\xb8m\r9EY\x06\x98\xa6\xaa\xf1g<7u\\\xa8\r\x89%\xf2s\x93=\xb5p\x00\x00\u07d4\x1f_;4\xbd\x13K'\x81\xaf\xe5\xa0BJ\u0144l\xde\xfd\x11\x89\x05]\xe6\xa7y\xbb\xac\x00\x00\u07d4\x1fo\x0004\x97R\x06\x1c\x96\a+\xc3\xd6\xeb5I \x8dk\x89\x01K\x8d\xe1\xeb\x88\u06c0\x00\u07d4\x1f}\x8e\x86\xd6\xee\xb0%E\xaa\xd9\x0e\x912{\xd3i\xd7\xd2\xf3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1f\x81\x16\xbd\n\xf5W\x0e\xaf\fV\u011cz\xb5\xe3zX\x04X\x89lk\x93[\x8b\xbd@\x00\x00\u0794\x1f\x88\xf8\xa13\x8f\xc7\xc1\tv\xab\xcd?\xb8\u04c5T\xb5\uc708\xb9\xf6]\x00\xf6<\x00\x00\u07d4\x1f\x9c2hE\x8d\xa3\x01\xa2\xbeZ\xb0\x82W\xf7{\xb5\xa9\x8a\xa4\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1f\xa21\x9f\xed\x8c-F*\xdf.\x17\xfe\xecjo0Qn\x95\x89\x06\xca\xe3\x06!\xd4r\x00\x00\u07d4\x1f\xb4c\xa08\x99\x83\xdf}Y?{\xddmxI\u007f\xed\x88y\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1f\xb7\xbd1\r\x95\xf2\xa6\u067a\xaf\x8a\x8aC\n\x9a\x04E:\x8b\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x1f\xcc|\xe6\xa8HX\x95\xa3\x19\x9e\x16H\x1fr\xe1\xf7b\xde\xfe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1f\xcf\xd1\xd5\u007f\x87\"\x90V\f\xb6-`\x0e\x1d\xef\xbe\xfc\xcc\x1c\x89P\xc5\xe7a\xa4D\b\x00\x00\u0794\x1f\u0496\xbe\x03\xads|\x92\xf9\u0186\x9e\x8d\x80\xa7\x1cW\x14\xaa\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\x1f\xdd\xd8_\u024b\xe9\xc4\x04Ya\xf4\x0f\x93\x80^\xccEI\xe5\x89\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4 \x01\xbe\xf7{f\xf5\x1e\x15\x99\xb0/\xb1\x10\x19J\x00\x99\xb7\x8d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4 \x02d\xa0\x9f\x8ch\xe3\xe6b\x97\x95(\x0fV%O\x86@\u0409\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4 \x03qy\a\xa7%`\xf40\u007f\x1b\xee\xccT6\xf4=!\xe7\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4 \r\xfc\vq\xe3Y\xb2\xb4eD\n6\xa6\xcd\xc3Rw0\a\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4 \x13L\xbf\xf8\x8b\xfa\xdcFkR\xec\ua9d8W\x89\x1d\x83\x1e\x8965\u026d\xc5\u07a0\x00\x00\u07d4 \x14&\x1f\x01\b\x9fSyV0\xba\x9d\xd2O\x9a4\xc2\xd9B\x89Hz\x9a0E9D\x00\x00\u07d4 \x16\x89]\xf3,\x8e\xd5G\x82iF\x84#\xae\xa7\xb7\xfb\xceP\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4 \x18\x1cKA\xf6\xf9r\xb6iX!_\x19\xf5p\xc1]\xdf\xf1\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4 \x18d\xa8\xf7\x84\xc2'{\v|\x9e\xe74\xf7\xb3w\xea\xb6H\x89\xf2(\x14\x00\xd1\xd5\xec\x00\x00\u07d4 \xb8\x1a\xe59&\xac\xe9\xf7\xd7AZ\x05\f\x03\x1dX_ \x89\x12\u007f\x19\xe8>\xb3H\x00\x00\xe0\x94 \x1d\x9e\xc1\xbc\v\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4 \xa1RV\xd5\f\xe0X\xbf\x0e\xacC\xaaS:\xa1n\u0273\x80\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4 \xa2\x9cPy\xe2k?\x181\x8b\xb2\xe5\x0e\x8e\x8b4n[\xe8\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4 \xa8\x16\x80\xe4e\xf8\x87\x90\xf0\aO`\xb4\xf3_]\x1ej\xa5\x89Ea\x80'\x8f\fw\x80\x00\u07d4 \xb9\xa9\u6f48\x80\u0659J\xe0\r\u0439(*\v\xea\xb8\x16\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4 \u0084\xba\x10\xa2\b0\xfc=i\x9e\xc9}-\xfa'\xe1\xb9^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4 \xd1A\u007f\x99\xc5i\u3fb0\x95\x85e0\xfe\x12\xd0\xfc\uaa89@\x15\xf9K\x11\x83i\x80\x00\u07d4 \u074f\u02f4n\xa4o\u3066\x8b\x8c\xa0\xea[\xe2\x1f\u9949lk\x93[\x8b\xbd@\x00\x00\xe0\x94 \xff>\u078c\xad\xb5\xc3{H\xcb\x14X\x0f\xb6^#\t\n{\x8a\b\xe4\xd3\x16\x82v\x86@\x00\x00\xe0\x94!\x008\x1d`\xa5\xb5J\xdc\t\u0456\x83\xa8\xf6\u057bK\xfb\u02ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94!\x18\xc1\x16\xab\f\xdfo\xd1\x1dT\xa40\x93\a\xb4w\xc3\xfc\x0f\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94!\x1b)\xce\xfcy\xae\x97gD\xfd\xeb\u03bd<\xbb2\xc5\x13\x03\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4! l\xe2.\xa4\x80\xe8Y@\xd3\x13\x14\xe0\xd6ONM:\x04\x8965\u026d\xc5\u07a0\x00\x00\u07d4!2\xc0Qj.\x17\x17J\xc5G\xc4;{\x00 \xd1\xebLY\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94!@\x8bMz,\x0en\xcaAC\xf2\xca\u037b\u033a\x12\x1b\u060a\x04<3\xc1\x93ud\x80\x00\x00\u07d4!Kt9U\xa5\x12\xden\r\x88j\x8c\xbd\x02\x82\xbe\xe6\u04a2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!L\x89\u017d\x8e}\"\xbcWK\xb3^H\x95\x02\x11\xc6\xf7v\x89\x01\x06T\xf2X\xfd5\x80\x00\xe0\x94!Ti\x14\xdf\u04ef*\xddA\xb0\xff>\x83\xff\xdat\x14\xe1\xe0\x8a\x01C\x95\xe78ZP.\x00\x00\u07d4!X.\x99\xe5\x02\xcb\xf3\xd3\xc2;\xdf\xfbv\xe9\x01\xacmV\xb2\x89\x05k\xc7^-c\x10\x00\x00\u07d4!Y$\b\x13\xa70\x95\xa7\xeb\xf7\u00f3t>\x80(\xae_\t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!`\xb4\xc0,\xac\n\x81\u0791\b\xdeCE\x90\xa8\xbf\xe6\x875\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94!nA\x86N\xf9\x8f\x06\r\xa0\x8e\xca\xe1\x9a\xd1\x16j\x17\xd06\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4!\x84o/\xdfZA\xed\x8d\xf3n^\xd8TM\xf7Y\x88\xec\xe3\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94!\xa6\xdbe'F{\xc6\xda\xd5K\xc1n\x9f\xe2\x95;g\x94\xed\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4!\xa6\xfe\xb6\xab\x11\xc7f\xfd\xd9w\xf8\xdfA!\x15_G\xa1\xc0\x89\x03\x19\xcf8\xf1\x00X\x00\x00\u07d4!\xb1\x82\xf2\xda+8D\x93\xcf_5\xf8=\x9d\x1e\xe1O*!\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!\xbf\xe1\xb4\\\xac\xdebt\xfd\x86\b\u0661x\xbf>\xebn\u0709l\xee\x06\u077e\x15\xec\x00\x00\u07d4!\xc0s\x80HOl\xbc\x87$\xad2\xbc\x86L;Z\xd5\x00\xb7\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94!\u00e8\xbb\xa2g\xc8\u0322{\x1a\x9a\xfa\xba\xd8o`z\xf7\b\x8a\x01\xe4\xa3lI\u06580\x00\x00\u07d4!\xcem[\x90\x18\xce\xc0J\u0596yD\xbe\xa3\x9e\x800\xb6\xb8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4!\xd0'\x05\xf3\xf6I\x05\xd8\x0e\xd9\x14y\x13\xea\x8cs\a\u0595\x89I\xed\xb1\xc0\x98\x876\x00\x00\u07d4!\xd1?\f@$\xe9g\xd9G\a\x91\xb5\x0f\"\xde:\xfe\xcf\x1b\x89\xf1Z\xd3^.1\xe5\x00\x00\xe0\x94!\xdb\u06c1z\r\x84\x04\u01bd\xd6\x15\x047N\x9cC\xc9!\x0e\x8a\x02\x1e\x18\xb9\xe9\xabE\xe4\x80\x00\xe0\x94!\xdf\x1e\xc2KNK\xfey\xb0\xc0\x95\u03ba\xe1\x98\xf2\x91\xfb\u044a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94!\xdf-\u036ft\xb2\xbf\x804\x04\xddM\xe6\xa3^\xab\xec\x1b\xbd\x8a\x01w\"J\xa8D\xc7 \x00\x00\u07d4!\xe2\x19\u021c\xa8\xac\x14\xaeL\xbaa0\xee\xb7}\x9em9b\x89*\u035f\xaa\xa08\xee\x00\x00\u07d4!\xe5\u04ba\xe9\x95\xcc\xfd\b\xa5\xc1k\xb5$\xe1\xf60D\x8f\x82\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4!\xe5\xd7s 0L \x1c\x1eS\xb2a\xa1#\u0421\x06>\x81\x89\x04\xb6\xfa\x9d3\xddF\x00\x00\xe0\x94!\xea\xe6\xfe\xff\xa9\xfb\xf4\u0347OG9\xac\xe50\u033eY7\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4!\xec\xb2\u07e6Wy\xc7Y-\x04\x1c\xd2\x10Z\x81\xf4\xfdNF\x8965\u026d\xc5\u07a0\x00\x00\u07d4!\uff20\x9b5\x80\xb9\x8es\xf5\xb2\xf7\xf4\xdc\v\xf0,R\x9c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!\xfd\v\xad\xe5\xf4\xeftt\xd0X\xb7\xf3\xd8T\xcb\x13\x00RN\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94!\xfdG\xc5%`\x12\x19\x8f\xa5\xab\xf11\xc0mj\xa1\x96_u\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4!\xfdl]\x97\xf9\xc6\x00\xb7h!\xdd\xd4\xe7v5\x0f\xce+\xe0\x89lj\u04c2\xd4\xfba\x00\x00\u07d4\"\r\u018d\xf0\x19\xb6\xb0\u033f\xfbxKZZ\xb4\xb1]@`\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\"\x0e+\x92\xc0\xf6\xc9\x02\xb5\x13\xd9\xf1\xe6\xfa\xb6\xa8\xb0\xde\xf3\u05c9+^:\xf1k\x18\x80\x00\x00\u07d4\"V\x1cY1\x14560\x9c\x17\xe82X{b\\9\v\x9a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\"W\xfc\xa1jn\\*d|<)\xf3l\xe2)\xab\x93\xb1~\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\"]5\xfa\xed\xb3\x91\u01fc-\xb7\xfa\x90q\x16\x04\x05\x99m\x00\x89\t\x18T\xfc\x18bc\x00\x00\u07d4\"_\x9e\xb3\xfbo\xf3\xe9\xe3\xc8D~\x14\xa6n\x8dO7y\xf6\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\"r\x18n\xf2}\xcb\xe2\xf5\xfc70P\xfd\xae\u007f*\xce#\x16\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4\"s\xba\u05fcNHv\"\xd1u\xefzf\x98\x8bj\x93\xc4\xee\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\"v&K\xec\x85&\xc0\xc0\xf2pgz\xba\xf4\xf0\xe4A\xe1g\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\"\x82B\xf83n\xec\xd8$.\x1f\x00\x0fA\x93~q\xdf\xfb\xbf\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\"\x84*\xb80\xdaP\x99\x13\xf8\x1d\xd1\xf0O\x10\xaf\x9e\xdd\x1cU\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\"\x94O\xbc\xa9\xb5yc\bN\xb8M\xf7\xc8_\xb9\xbc\u07f8V\x89\xfc\x11\x8f\uf43a8\x80\x00\u07d4\"\x9c\xc4q\x1bbu^\xa2\x96DZ\u00f7\u007f\xc63\x82\x1c\xf2\x89\x02#\xe8\xb0R\x192\x80\x00\u0794\"\x9eC\r\xe2\xb7OD&Q\xdd\u0377\x01v\xbc\x05L\xadT\x88\xbb\xf9\x81\xbcJ\xaa\x80\x00\u07d4\"\x9fO\x1a*OT\atP[G\a\xa8\x1d\xe4D\x10%[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\"\x9f\xf8\v\xf5p\x80\t\xa9\xf79\xe0\xf8\xb5`\x91@\x16\u0566\x89\x12\x11\xec\xb5m\x13H\x80\x00\u07d4\"\xa2X\x12\xabV\xdc\xc4#\x17^\xd1\u062d\xac\xce3\xcd\x18\x10\x89dI\xe8NG\xa8\xa8\x00\x00\xe0\x94\"\xb9j\xb2\xca\xd5]\xb1\x00\xb50\x01\xf9\xe4\xdb7\x81\x04\xc8\a\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\"\xbd\xff\xc2@\xa8\x8f\xf7C\x1a\xf3\xbf\xf5\x0e\x14\xda7\xd5\x18>\x8965\u026d\xc5\u07a0\x00\x00\u07d4\"\xce4\x91Y\xee\xb1D\xef\x06\xff&6X\x8a\xefy\xf6(2\x89\n1\x06+\xee\xedp\x00\x00\u07d4\"\xdbU\x9f,<\x14u\xa2\xe6\xff\xe8:YyY\x91\x96\xa7\xfa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\"\xe1QX\xb5\xee>\x86\xeb\x032\xe3\u6a6cl\u0675^\u0349\b\xacr0H\x9e\x80\x00\x00\u07d4\"\xe2H\x8e-\xa2jI\xae\x84\xc0\x1b\xd5K!\xf2\x94x\x91\u0189]\u0212\xaa\x111\xc8\x00\x00\u07d4\"\xe5\x12\x14\x9a\x18\xd3i\xb7\x86\xc9\xed\xab\xaf\x1d\x89N\xe0.g\x14a\\\x00\x00\u07d4\"\xeb}\xb0\xbaV\xb0\xf8\xb8\x16\u0332\x06\xe6\x15\xd9)\x18[\r\x89\x04])s~\"\xf2\x00\x00\u07d4\"\xee\xd3'\xf8\xeb\x1d\x138\xa3\xcb{\x0f\x8aK\xaaY\a\u0355\x89\x01E]_Hw\b\x80\x00\xe0\x94\"\xf0\x04\u07cd\xe9\xe6\xeb\xf5#\u032c\xe4W\xac\xcb&\xf9r\x81\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794\"\xf2\xdc\xffZ\u05cc>\xb6\x85\v\\\xb9Q\x12{e\x95\"\u623e -j\x0e\xda\x00\x00\u07d4\"\xf3\xc7y\xddy\x02>\xa9*x\xb6\\\x1a\x17\x80\xf6-\\J\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\"\xfe\x88M\x907)\x1bMR\xe6(Z\xe6\x8d\xea\v\xe9\xff\xb5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\x06\u07d3\x1a\x94\rX\xc0\x16e\xfaM\b\x00\x80,\x02\xed\xfe\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94#\t\xd3@\x91D[22Y\v\xd7\x0fO\x10\x02[,\x95\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4#\x12\x00F\xf6\x83!\x02\xa7R\xa7fVi\x1c\x86>\x17\u5709\x11\xe0\xe4\xf8\xa5\v\xd4\x00\x00\u07d4#\x1a\x15\xac\xc1\x99\u021f\xa9\xcb\"D\x1c\xc7\x030\xbd\xcc\xe6\x17\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4#\x1d\x94\x15]\xbc\xfe*\x93\xa3\x19\xb6\x17\x1fc\xb2\v\u04b6\xfa\x89\xcf\x14{\xb9\x06\xe2\xf8\x00\x00\u07d4#(2\xcdYw\xe0\nL0\xd0\x16?.$\xf0\x88\xa6\xcb\t\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4#,m\x03\xb5\xb6\xe6q\x1e\xff\xf1\x90\xe4\x9c(\xee\xf3l\x82\xb0\x89Hz\x9a0E9D\x00\x00\xe0\x94#,\xb1\xcdI\x99<\x14J?\x88\xb3a\x1e#5i\xa8k\u058a\x03L`lB\u042c`\x00\x00\u07d4#,\xe7\x82Pb%\xfd\x98`\xa2\xed\xc1Jz0Gsm\xa2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4#/R]U\x85\x9b}N`\x8d H\u007f\xaa\xdb\x00)15\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94#4\u0150\u01e4\x87i\x100E\u0176SL\x8a4i\xf4J\x8a\x03\xb1\x99\a=\xf7-\xc0\x00\x00\u07d4#7n\u02bftl\xe53!\xcfB\xc8fI\xb9+g\xb2\xff\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#7\x8fB\x92m\x01\x84\xb7\x93\xb0\xc8'\xa6\xdd>=3O\u0349\x03\t'\xf7L\x9d\xe0\x00\x00\u07d4#8B\xb1\xd0i/\xd1\x11@\xcfZ\u0364\xbf\x960\xba\xe5\xf8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#9\xe9I(p\xaf\xea%7\xf3\x89\xac/\x83\x83\x02\xa3<\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#;\xdd\xdd]\xa9HR\xf4\xad\xe8\xd2\x12\x88V\x82\xd9\ak\u0189\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4#OF\xba\xb7?\xe4]1\xbf\x87\xf0\xa1\xe0Fa\x99\xf2\ubb09\x1aJ\xba\"\\ t\x00\x00\u07d4#U\x1fV\x97_\xe9+1\xfaF\x9cI\xeaf\xeefb\xf4\x1e\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4#V\x95B\xc9}V`\x18\xc9\a\xac\xfc\xf3\x91\xd1@g\xe8~\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94#_\xa6l\x02^\xf5T\x00p\xeb\xcf\r7-\x81w\xc4g\xab\x8a\a\x12\x9e\x1c\xdf7>\xe0\x00\x00\xe0\x94#r\xc4\xc1\u0253\x9fz\xafl\xfa\xc0@\x90\xf0\x04t\x84\n\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4#s\f5z\x91\x02nD\xb1\xd0\xe2\xfc*Q\xd0q\xd8\xd7{\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4#v\xad\xa9\x033\xb1\u0441\bL\x97\xe6E\xe8\x10\xaa[v\xf1\x89(\xa8WBTf\xf8\x00\x00\u07d4#x\xfdC\x82Q\x1e\x96\x8e\u0452\x10g7\xd3$\xf4T\xb55\x8965\u026d\xc5\u07a0\x00\x00\u07d4#\x82\xa9\u050e\xc8>\xa3e(\x90\xfd\x0e\u7710{[-\xc1\x89\a?u\u0460\x85\xba\x00\x00\u07d4#\x83\xc2\"\xe6~\x96\x91\x90\xd3!\x9e\xf1M\xa3xP\xe2lU\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\x8akv5%/RDHl\n\xf0\xa7: s\x85\xe09\x89JD\x91\xbdm\xcd(\x00\x00\u07d4#\x9as>k\x85Z\u0152\xd6c\x15a\x86\xa8\xa1t\xd2D\x9e\x89X\xbe7X\xb2A\xf6\x00\x00\xe0\x94#\xab\t\xe7?\x87\xaa\x0f;\xe0\x13\x9d\xf0\xc8\xebk\xe5cO\x95\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94#\xab\xd9\xe9>yW\xe5\xb66\xbeey\x05\x1c\x15\xe5\xce\v\x0e\x8a\x03\xa3\xc8\xf7\xcb\xf4,8\x00\x00\u07d4#\xb1\u0111\u007f\xbd\x93\xee=H8\x93\x06\x95s\x84\xa5Il\xbf\x89\xd8\xd8X?\xa2\xd5/\x00\x00\xe0\x94#\xba8d\xdaX=\xabV\xf4 \x87<7g\x96\x90\xe0/\x00\x8a\x02\x13BR\r_\xec \x00\x00\u07d4#\xc5Z\xebW9\x87o\n\xc8\xd7\xeb\xea\x13\xber\x96\x85\xf0\x00\x89Hz\x9a0E9D\x00\x00\u07d4#\u025b\xa0\x87D\x8e\x19\xc9p\x1d\xf6n\f\xabR6\x831\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\xcc\xc3\u01ac\xd8\\.F\fO\xfd\xd8+\xc7]\xc8I\xea\x14\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4#\xcd%\x98\xa2\x0e\x14\x9e\xad*\u0593yWn\xce\xdb`\u3389lk\x93[\x8b\xbd@\x00\x00\u07d4#\u07cfH\xee\x00\x92V\xeay~\x1f\xa3i\xbe\xeb\xcfk\xc6c\x89|\xd3\xfa\xc2m\x19\x81\x80\x00\u07d4#\xe2\u01a8\xbe\x8e\n\u03e5\xc4\xdf^6\x05\x8b\xb7\u02ecZ\x81\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\xeaf\x9e5d\x81\x9a\x83\xb0\xc2l\x00\xa1m\x9e\x82olF\x89M\x8dl\xa9h\xca\x13\x00\x00\u07d4#\xebo\xd8Vq\xa9\x06:\xb7g\x8e\xbe&Z \xf6\x1a\x02\xb3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\xf9\xec\xf3\xe5\xdd\u0723\x88\x15\xd3\xe5\x9e\xd3K[\x90\xb4\xa3S\x89\v\x17\x81\xa3\xf0\xbb \x00\x00\u07d4#\xfa~\xb5\x1aH\"\x95\x98\xf9~v+\xe0\x86\x96R\xdf\xfcf\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94$\x03\x05rs\x13\xd0\x1esT,w_\xf5\x9d\x11\xcd5\xf8\x19\x8a\x01A\x88Vf\x80\u007f\\\x80\x00\u07d4$\x04k\x91\u069ba\xb6)\u02cb\x8e\xc0\xc3Q\xa0~\a\x03\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4$\x0eU\x9e'J\xae\xf0\xc2X\x99\x8c\x97\x9fg\x1d\x11s\xb8\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94$\x13aU\x9f\xee\xf8\x0e\xf170!S\xbd\x9e\xd2\xf2]\xb3\xef\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94$;;\xcaj)\x93Y\xe8\x86\xce3\xa3\x03A\xfa\xfeMW=\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4$<\x84\xd1$ W\f\xc4\xef;\xab\xa1\xc9Y\u0083$\x95 \x89\u007f\x1fi\x93\xa8S\x04\x00\x00\xe0\x94$CJ>2\xe5N\xcf'/\xe3G\v_oQ/gU \x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4$HYo\x91\xc0\x9b\xaa0\xbc\x96\x10j-7\xb5p^](\x89lk\x93[\x8b\xbd@\x00\x00\u0794$Xn\xc5E\x175\xee\xaa\xebG\r\xc8sj\xaeu/\x82\xe5\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4$X\xd6U_\xf9\x8a\x12\x9c\xce@7\x95=\x00 n\xffB\x87\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4$b\x91\x16[Y3-\xf5\xf1\x8c\xe5\u0248V\xfa\xe9X\x97\u0589\\(=A\x03\x94\x10\x00\x00\u07d4$g\u01a5\u0196\xed\xe9\xa1\xe5B\xbf\x1a\xd0k\xccK\x06\xac\xa0\x89\x01\x00\xbd3\xfb\x98\xba\x00\x00\u07d4$v\xb2\xbbu\x1c\xe7H\xe1\xa4\xc4\xff{#\v\xe0\xc1]\"E\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4$z\n\x11\xc5\u007f\x03\x83\xb9I\xdeT\vf\xde\xe6\x86\x04\xb0\xa1\x899\xfb\xae\x8d\x04-\xd0\x00\x00\u07d4$\x87\xc3\u013e\x86\xa2r=\x91|\x06\xb4XU\x01p\xc3\xed\xba\x8965\u026d\xc5\u07a0\x00\x00\u07d4$\x89\xac\x12i4\xd4\u05a9M\xf0\x87C\xda{v\x91\xe9y\x8e\x8965\u026d\xc5\u07a0\x00\x00\u07d4$\x9d\xb2\x9d\xbc\x19\xd1#]\xa7)\x8a\x04\b\x1c1WB\u9b09a\xac\xff\x81\xa7\x8a\xd4\x00\x00\u07d4$\xa4\xeb6\xa7\xe4\x98\xc3o\x99\x97\\\x1a\x8dr\x9f\u05b3\x05\u05c9\r\xfcx!\x0e\xb2\xc8\x00\x00\u07d4$\xa7P\xea\xe5\x87G\x11\x11m\xd7\xd4{q\x86\u0399\r1\x03\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4$\xaa\x11Q\xbbv_\xa3\xa8\x9c\xa5\x0e\xb6\xe1\xb1\xc7\x06A\u007f\u0509\xa8\r$g~\xfe\xf0\x00\x00\u0794$\xac\xa0\x8d[\xe8^\xbb\x9f12\xdf\xc1\xb6 \x82N\xdf\xed\xf9\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4$\xb2\xbe\x11\x8b\x16\u0632\x17Gi\xd1{L\xf8O\a\u0294m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4$\xb8\xb4F\u07bd\x19G\x95]\u0404\xf2\xc5D\x933F\u04ed\x89\xeaim\x90@9\xbd\x80\x00\u07d4$\xb9^\xbe\xf7\x95\x00\xba\xa0\xed\xa7.w\xf8wA]\xf7\\3\x891T\xc9r\x9d\x05x\x00\x00\u07d4$\xb9\xe6dOk\xa4\xcd\xe1&'\r\x81\xf6\xab`\xf2\x86\xdf\xf4\x89\a?u\u0460\x85\xba\x00\x00\u07d4$\xbdY\x04\x05\x90\x91\xd2\xf9\xe1-j&\xa0\x10\xca\"\xab\x14\xe8\x89e\xea=\xb7UF`\x00\x00\u07d4$\xc0\u020bT\xa3TG\t\x82\x8a\xb4\xab\x06\x84\x05Y\xf6\xc5\u2250\xf54`\x8ar\x88\x00\x00\u07d4$\xc1\x17\xd1\u04b3\xa9z\xb1\x1aFy\u025awJ\x9e\xad\xe8\u044965\u026d\xc5\u07a0\x00\x00\u07d4$\xcf\xf0\xe93j\x9f\x80\xf9\xb1\u02d6\x8c\xafk\x1d\x1cI2\xa4\x89\n\xdaUGK\x814\x00\x00\u07d4$\u06aa\xdd\xf7\xb0k\xbc\ua6c0Y\x00\x85\xa8\x85gh+N\x89\x11K \x15\u04bb\xd0\x00\x00\u07d4$\xdc\xc2K\xd9\xc7!\f\xea\u03f3\r\xa9\x8a\xe0JM{\x8a\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4$\xf7E\r\xdb\xf1\x8b\x02\x0f\xeb\x1a 2\xd9\xd5Kc>\xdf7\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4$\xfcs\xd2\a\x93\t\x8e\t\u076bW\x98Pb$\xfa\x1e\x18P\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4$\xfd\x9al\x87L/\xab?\xf3n\x9a\xfb\xf8\xce\r2\xc7\u0792\x89Hz\x9a0E9D\x00\x00\u07d4%\n@\xce\xf3 #\x97\xf2@F\x95H\xbe\xb5bj\xf4\xf2<\x89\x05\x03\xb2\x03\xe9\xfb\xa2\x00\x00\u07d4%\niC\av\xf64w\x03\xf9R\x97\x83\x95Za\x97\xb6\x82\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4%\x0e\xb7\xc6o\x86\x9d\xdfI\u0685\xf39>\x98\f\x02\x9a\xa44\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4%\x10j\xb6u]\xf8mkc\xa1\x87p;\f\xfe\xa0\u5520\x89\x01|@Z\xd4\x1d\xb4\x00\x00\xe0\x94%\x18_2Z\xcf-dP\x06\x98\xf6\\v\x9d\xdfh0\x16\x02\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4%\x1c\x12r,hy\"y\x92\xa3\x04\xeb5v\xcd\x18CN\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4%\x1eh8\xf7\xce\u0173\x83\xc1\xd9\x01F4\x12t\xda\xf8\xe5\x02\x89\a\xff\x1c\xcbua\xdf\x00\x00\u07d4%%\x9d\x97Z!\xd8:\xe3\x0e3\xf8\x00\xf5?7\u07e0\x198\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4%({\x81_\\\x828\ns\xb0\xb1?\xba\xf9\x82\xbe$\xc4\u04c9\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94%+eU\xaf\u0700\xf2\xd9m\x97-\x17\u06c4\xeaZ\xd5!\xac\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4%8S)6\x81<\x91\xe6S(O\x01|\x80\u00f8\xf8\xa3o\x89l\x87T\xc8\xf3\f\b\x00\x00\xe0\x94%>2\xb7N\xa4I\n\xb9&\x06\xfd\xa0\xaa%{\xf2=\u02cb\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94%?\x1et*,\uc1b0\u05f3\x06\xe5\xea\xcbl\xcb/\x85T\x8a\x04>^\xde\x1f\x87\x8c \x00\x00\u07d4%A1J\v@\x8e\x95\xa6\x94DIwq*Pq5\x91\xab\x89X\x9e\x1a]\xf4\u05f5\x00\x00\u07d4%L\x1e\xccc\f(w\u0780\x95\xf0\xa8\u06e1\xe8\xbf\x1fU\f\x89\\(=A\x03\x94\x10\x00\x00\u07d4%Z\xbc\x8d\b\xa0\x96\xa8\x8f=j\xb5_\xbcsR\xbd\u0739\u0389\x04t6\x821>\u0780\x00\u07d4%[\xdddt\u0302b\xf2j\"\u00cfE\x94\x0e\x1c\ue99b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4%`\xb0\x9b\x89\xa4\xaehI\xedZ<\x99XBf1qDf\x89\\(=A\x03\x94\x10\x00\x00\u07d4%a\xa18\xdc\xf8;\xd8\x13\xe0\xe7\xf1\bd+\xe3\xde=o\x05\x8964\xf4\x84\x17@\x1a\x00\x00\u0794%a\xec\x0f7\x92\x18\xfe^\xd4\xe0(\xa3\xf7D\xaaAuLr\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u0794%b\x92\xa1\x91\xbd\xda4\xc4\xdakk\u0591G\xbfu\u2a6b\x88\xc2\xff.\r\xfb\x03\x80\x00\u07d4%i~\xf2\f\u032ap\xd3-7o\x82r\xd9\xc1\a\f=x\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4%o\xa1P\u0307\xb5\x05j\a\xd0\x04\xef\xc8E$s\x9eb\xb5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4%r\x1c\x87\xb0\xdc!7|r\x00\xe5$\xb1J\"\xf0\xafi\xfb\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4%\x899\xbb\xf0\f\x9d\xe9\xafS8\xf5\xd7\x14\xab\xf6\xd0\xc1\xc6q\x89T\x06\x923\xbf\u007fx\x00\x00\xe0\x94%\x90\x12hp\xe0\xbd\xe8\xa6c\xab\x04\nr\xa5W=\x8dA\u008a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4%\x9e\xc4\xd2e\xf3\xabSk|p\xfa\x97\xac\xa1Bi,\x13\xfc\x89\x01\x1b\x1b[\xea\x89\xf8\x00\x00\xe0\x94%\xa5\x00\xee\xeczf*\x84\x15R\xb5\x16\x8bp{\r\xe2\x1e\x9e\x8a\x02\x1f/o\x0f\xc3\xc6\x10\x00\x00\xe0\x94%\xa5\xa4M8\xa2\xf4Lj\x9d\xb9\u037ck\x1e.\x97\xab\xb5\t\x8a\x03\x99\x92d\x8a#\u0220\x00\x00\u07d4%\xa7L*\xc7]\u023a\xa8\xb3\x1a\x9c|\xb4\xb7\x82\x9b$V\u0689lk\x93[\x8b\xbd@\x00\x00\xe0\x94%\xad\xb8\xf9o9I,\x9b\xb4|^\u0708bNF\aV\x97\x8a\x05\xa9\x94\v\xc5hyP\x00\x00\u07d4%\xae\xe6\x8d\t\xaf\xb7\x1d\x88\x17\xf3\xf1\x84\xecV/x\x97\xb74\x89lk\x93[\x8b\xbd@\x00\x00\u07d4%\xb0S;\x81\xd0*a{\x92)\xc7\xec]o/g.[Z\x8965\u026d\xc5\u07a0\x00\x00\u07d4%\xb7\x8c\x9f\xad\x85\xb43C\xf0\xbf\xcd\x0f\xac\x11\u0254\x9c\xa5\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4%\xbcI\xef(\x8c\xd1e\xe5%\xc6a\xa8\x12\u03c4\xfb\xec\x8f3\x89\x12Y!\xae\xbd\xa9\xd0\x00\x00\u07d4%\xbd\xfa>\xe2o8Ia{#\x00bX\x8a\x97\xe3\xca\xe7\x01\x8965\xe6\x19\xbb\x04\xd4\x00\x00\u07d4%\xc1\xa3~\xe5\xf0\x82e\xa1\xe1\r=\x90\xd5G)U\xf9x\x06\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4%\xc6\xe7O\xf1\xd9(\u07d8\x13z\xf4\u07c40\xdf$\xf0|\u05c9\x15$VU\xb1\x02X\x00\x00\xe0\x94%\xcf\xc4\xe2\\5\xc1;i\xf7\xe7}\xbf\xb0\x8b\xafXuk\x8d\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94%\xda\u0515\xa1\x1a\x86\xb9\xee\xec\xe1\xee\xec\x80^W\xf1W\xfa\xff\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\xe0\x94%\xe07\xf0\n\x18'\v\xa5\xec4 \"\x9d\xdb\n,\u33e2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4%\xe6a\xc99\x86:\xcc\x04No\x17\xb5i\x8c\xce7\x9e\xc3\u0309JD\x91\xbdm\xcd(\x00\x00\u07d4&\x04\x8f\xe8M\x9b\x01\nb\xe71b~I\xbc.\xb7?@\x8f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4&\x06\u00f3\xb4\xca\x1b\t\x14\x98`,\xb1\x97\x8b\xf3\xb9R!\xc0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4&\n#\x0eDe\a~\v\x14\xeeDB\xa4\x82\u0570\xc9\x14\xbf\x89Z\xf6\x06\xa0k[\x11\x80\x00\u07d4&\r\xf8\x94:\x8c\x9a]\xbayE2\u007f\xd7\xe0\x83|\x11\xad\a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4&\x14\xf4-]\xa8D7ux\xe6\xb4H\xdc$0[\xef+\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\x15\x10\x0e\xa7\xe2[\xba\x9b\xcat`X\xaf\xbb\xb4\xff\xbeBD\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4&\x15u\xe9\xcfY\xc8\"o\xa7\xaa\xf9\x1d\xe8o\xb7\x0fZ\u00ee\x89\x10C\xa4CjR?\x00\x00\xe0\x94&\x1e\x0f\xa6LQ\x13te\xee\xcf[\x90\xf1\x97\xf7\x93\u007f\xdb\x05\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4&*\x8b\xfd}\x9d\xc5\xdd:\u05c1a\xb6\xbbV\b$76U\x89?j\x83\x84\a+v\x00\x00\xe0\x94&*\xedK\xc0\xf4\xa4\xb2\xc6\xfb5y>\x83ZI\x18\x9c\xdf\xec\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94&-\xc16L\xcfm\xf8\\C&\x8e\xe1\x82UM\xaei.)\x8a\x01\v /\xect\xce\xd8\x00\x00\u07d4&8\x140\x9d\xe4\xe65\xcfX^\r6Tw\xfc@\xe6l\xf7\x89\a\xea(2uw\b\x00\x00\u07d4&9\xee\xe9\x87<\xee\xc2o\u0314T\xb5H\xb9\xe7\xc5J\xa6\\\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94&>W\xda\xcb\xe0\x14\x9f\x82\xfee\xa2fH\x98\x86o\xf5\xb4c\x8a\b\v\xfb\xef\xcb_\v\xc0\x00\x00\u07d4>\x19\xc0m_\x14z\xa5\x97$\x8e\xb4l\xf7\xbe\xfad\xa5\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4&L\xc8\bj\x87\x10\xf9\x1b!r\t\x05\x91,\u05d6J\xe8h\x89\x01s\x17\x90SM\xf2\x00\x00\xe0\x94&S\x83\u058bR\xd04\x16\x1b\xfa\xb0\x1a\xe1\xb0G\x94/\xbc2\x8a\x04rq\xde\xe2\rt\\\x00\x00\u07d4&Y\xfa\xcb\x1e\x83CeS\xb5\xb4)\x89\xad\xb8\a_\x99S\xed\x89\x01\x97evw\x1a^\x00\x00\xe0\x94&o-\xa7\xf0\b^\xf3\xf3\xfa\t\xba\xee#+\x93\xc7D\xdb.\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4&qH\xfdr\xc5Ob\nY/\xb9'\x991\x9c\xc4S+\\\x89\x169\u46fa\x16(\x00\x00\xe0\x94&xJ\u0791\u0228:\x8e9e\x8c\x8d\x82wA<\u0319T\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4&z~n\x82\xe1\xb9\x1dQ\xde\u0776D\xf0\xe9m\xbb\x1f\u007f~\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4&\x80q=@\x80\x8e*P\xed\x011P\xa2\xa6\x94\xb9j\u007f\x1d\x89a\t=|,m8\x00\x00\u07d4&\x97\xb39\x81;\f-\x96K$q\xeb\x1c`oN\u02d6\x16\x89>\x8e\xf7\x95\u0610\xc8\x00\x00\u07d4&\xa6\x8e\xab\x90Z\x8b=\xce\x00\xe3\x170\x82%\u06b1\xb9\xf6\xb8\x89kV\x05\x15\x82\xa9p\x00\x00\u07d4&\xb1\x1d\x06e\x88\xcet\xa5r\xa8Zc(s\x92\x12\xaa\x8b@\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\xba\xbfB\xb2g\xfd\xcf8a\xfd\xd4#j^GHH\xb3X\x8965\u026d\xc5\u07a0\x00\x00\u07d4&\xc0\x05Kp\r:|-\xcb\xe2uh\x9dOL\xad\x16\xa35\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\xc2\xff\xc3\x0e\xfd\xc5'>v\x18:\x16\xc2i\x8dnS\x12\x86\x89*\x11)\u0413g \x00\x00\u07d4&\u025f\x88I\u0240+\x83\xc8a!\u007f\xd0z\x9e\x84\u0377\x9d\x89\x10CV\x1a\x88)0\x00\x00\u07d4&\xcf\xff\xd0R\x15+\xb3\xf9W\xb4x\xd5\xf9\x8b#:|+\x92\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4&\u0521h\x91\xf5)\"x\x92\x17\xfc\u0606\xf7\xfc\xe2\x96\xd4\x00\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\xd4\xec\x17\xd5\u03b2\u0214\xbd\u015d\nji]\xad+C\u0309\x9f\x1fxv\x1d4\x1a\x00\x00\u07d4&\xe8\x01\xb6,\x82q\x91\xddh\xd3\x1a\x01\x19\x90\x94\u007f\xd0\xeb\xe0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4&\xe9\xe2\xadr\x97\x02bd\x17\xef%\xde\r\xc8\x00\xf7\xa7y\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4&\xf9\xf7\xce\xfd~9K\x9d9$A+\xf2\u0083\x1f\xaf\x1f\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94&\xfe\x17L\xbfRfP\xe0\xcd\x00\x9b\xd6\x12e\x02\u038ehM\x8a\x02w\x01s8\xa3\n\xe0\x00\x00\xe0\x94&\xff\nQ\xe7\xce\u0384\x00'ix\xdb\xd6#n\xf1b\xc0\xe6\x8a\x15.\x18V'T\nP\x00\x00\u07d4'\x10\x1a\x0fV\u04da\x88\u0168O\x9b2L\xdd\xe3>\\\xb6\x8c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'\x14L\xa9\xa7w\x1a\x83j\xd5\x0f\x80?d\xd8i\xb2\xae+ \x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4'\x14i\x13V:\xa7E\xe2X\x840\xd94\x8e\x86\xea|5\x10\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4'\x1d=H\x1c\xb8\x8evq\xad!iI\xb66^\x060=\xe0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4' \xf9\xcaBn\xf2\xf2\xcb\xd2\xfe\xcd9\x92\fO\x1a\x89\xe1m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'*\x13\x1aZejz:\xca5\u023d \"\"\xa7Y\"X\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4'D\xffgFA!\xe3Z\xfc)\"\x17qd\xfa/\xcb\x02g\x89\x05k\xc7^-c\x10\x00\x00\u07d4'J=w\x1a=p\x97\x96\xfb\xc4\xd5\xf4\x8f\xce/\xe3\x8cy\u0589\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4'Mi\x17\x0f\xe7\x14\x14\x01\x88+\x88j\xc4a\x8cj\xe4\x0e\u06c93\xc5I\x901r\f\x00\x00\u07d4'R\x1d\xeb;n\xf1An\xa4\u01c1\xa2\xe5\u05f3n\xe8\x1ca\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'Xu\xffO\xbb\f\xf3\xa40!1'H\u007fv\b\xd0L\xba\x89\x1b\x1c\x01\x0evmX\x00\x00\u07d4'j\x00n0(\xec\xd4L\xdbb\xba\nw\u0394\xeb\xd9\xf1\x0f\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4'k\x05!\xb0\xe6\x8b'}\xf0\xbb2\xf3\xfdH2cP\xbf\xb2\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4'o\xd7\xd2O\x8f\x88?Zz()[\xf1qQ\u01e8K\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'p\xf1N\xfb\x16]\u07bay\xc1\v\xb0\xaf1\xc3\x1eY3L\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4'vw\xab\xa1\xe5,;S\xbf\xa2\a\x1dN\x85\x9a\n\xf7\xe8\xe1\x8965\u026d\xc5\u07a0\x00\x00\u07d4'\x82Ff\xd2x\xd7\x04#\xf0=\xfe\x1d\u01e3\xf0/C\u2d4966\xc2^f\xec\xe7\x00\x00\u07d4'\x83\f_`#\xaf\xaa\xf7\x97Egl J\x0f\xac\u0360\xba\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94'\x84\x90?\x1d|\x1b\\\xd9\x01\xf8\x87]\x14\xa7\x9b<\xbe*V\x8a\x04\xbd\xa7\xe9\xd7J\xd5P\x00\x00\u07d4'\x8c\v\xdec\x0e\u00d3\xb1\xe7&\u007f\xc9\xd7\xd9p\x19\xe4\x14[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'\x98q\x10\"\x1a\x88\b&\xad\xb2\xe7\xab^\xcax\xc6\xe3\x1a\xec\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94'\xac\a;\xe7\x9c\xe6W\xa9:\xa6\x93\xeeC\xbf\x0f\xa4\x1f\xef\x04\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4'\xb1iN\xaf\xa1e\xeb\xd7\xcc{\u025et\x81J\x95\x14\x19\u0709+^:\xf1k\x18\x80\x00\x00\u07d4'\xb6(\x16\xe1\xe3\xb8\u045by\xd1Q=]\xfa\x85[\f:*\x89\x05j\xf5\xc1\xfdiP\x80\x00\u07d4'\xbf\x94<\x163\xfe2\xf8\xbc\xcc\xdbc\x02\xb4\a\xa5rND\x892\xf8Lm\xf4\b\xc0\x80\x00\u07d4'\xbf\x9fD\xba}\x05\xc35@\u00e5;\xb0,\xbb\xff\xe7\xc3\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4'\xc2\xd7\xcaPM\xaa=\x90f\xdc\t\x13}\xc4/:\xaa\xb4R\x89 \x86\xac5\x10R`\x00\x00\u07d4'\xd1X\xac=>\x11\t\xabnW\x0e\x90\xe8]8\x92\xcdv\x80\x89\x05k\xc7^-c\x10\x00\x00\u07d4'\xe69\x89\xca\x1e\x90;\xc6 \xcf\x1b\x9c?g\xb9\xe2\xaee\x81\x89Hz\x9a0E9D\x00\x00\xe0\x94'\xf0<\xf1\xab\xc5\xe1\xb5\x1d\xbcDK(\x9eT,\x9d\u07f0\xe6\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4'\xfc\x85\xa4\x9c\xff\x90\xdb\xcf\xda\u071d\xdd@\u05b9\xa2!\nl\x89\x05k\xc7^-c\x10\x00\x00\u07d4(\x05A^\x1d\u007f\xde\xc6\xde\u07f8\x9eR\x1d\x10Y-t<\x10\x89\x05k\xc7^-c\x10\x00\x00\u07d4(\a>\xfc\x17\xd0\\\xab1\x95\xc2\xdb3+a\x98Gw\xa6\x12\x8965\u026d\xc5\u07a0\x00\x00\u07d4(\x12P\xa2\x91!'\nN\xe5\u05cd$\xfe\xaf\xe8,p\xba:\x8965\u026d\xc5\u07a0\x00\x00\u07d4(\x13\xd2c\xfc_\xf2G\x9e\x97\x05\x95\u05b6\xb5`\xf8\xd6\xd6\u0449lk\x93[\x8b\xbd@\x00\x00\u07d4(.\x80\xa5T\x87ZVy\x9f\xa0\xa9\u007fU\x10\u7557LN\x8965\u026d\xc5\u07a0\x00\x00\u07d4(3\x96\xce<\xac9\x8b\xcb\xe7\"\u007f2>x\xff\x96\u0407g\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4(4\x9f~\xf9t\xeaU\xfe6\xa1X;4\xce\xc3\xc4Pe\xf0\x89\f\xb63\u051eeY\x00\x00\u07d4(6\x120F\xb2\x84\xe5\xef\x10+\xfd\"\xb1v^P\x81\x16\xad\x89\x16S\xfb\xb5\xc4'\xe4\x00\x00\u07d4(<#\x14(<\x92\u0530d\xf0\xae\xf9\xbbRF\xa7\x00\u007f9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4(>\x11 7I\xb1\xfaO2\xfe\xbbq\xe4\x9d\x13Y\x198*\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94(>bR\xb4\xef\xcfFT9\x1a\xcbu\xf9\x03\u015bx\xc5\xfb\x8a\x02\x8a\x85t%Fo\x80\x00\x00\xe0\x94(Q\x0en\xff\x1f\xc8)\xb6WoC(\xbc98\xecze\x80\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4(X\xac\xac\xaf!\xea\x81\u02b7Y\x8f\xdb\xd8kE.\x9e\x8e\x15\x89$\x1a\x9bOaz(\x00\x00\u07d4(Z\xe5\x1b\x95\x00\u014dT\x13e\xd9ui\xf1K\xb2\xa3p\x9b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4(f\xb8\x1d\xec\xb0.\xe7\n\xe2P\xce\xe5\xcd\xc7{Y\u05f6y\x89lk\x93[\x8b\xbd@\x00\x00\u07d4(i\x06\xb6\xbdIr\xe3\xc7\x16U\xe0K\xaf6&\f|\xb1S\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4(k\x18ma\xea\x1f\u05cd\x990\xfe\x12\xb0e7\xb0\\=Q\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94(t\xf3\xe2\x98]_{@f'\xe1{\xaaw+\x01\xab\u031e\x8a\x01F\x05\x04\x10v_8\x00\x00\xe0\x94(|\xf9\u0410.\xf8\x19\xa7\xa5\xf1ID[\xf1w^\xe8\xc4|\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4(\x81\x8e\x18\xb6\x10\x00\x13!\xb3\x1d\xf6\xfe}(\x15\u036d\xc9\xf5\x8965\u026d\xc5\u07a0\x00\x00\u07d4(\x86\x83$3~\x11\xba\x10l\xb4\x81\u0696/:\x84S\x80\x8d\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94(\x90K\xb7\xc40)C\xb7\t\xb1Myp\xe4+\x83$\u184a\x02\x1f\x97\x84j\a-~\x00\x00\u07d4(\x95\xe8\t\x99\xd4\x06\xadY.+&'7\xd3_}\xb4\xb6\x99\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4(\x96r\x80!N!\x8a\x12\f]\xda7\x04\x1b\x11\x1e\xa3mt\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4(\xa3\xda\t\xa8\x19H\x19\xae\x19\x9f.m\x9d\x13\x04\x81~(\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4(\xab\x16_\xfbi\xed\xa0\xc5I\xae8\xe9\x82o_\u007f\x92\xf8S\x89FM\xf6\xd7\xc8DY\x00\x00\u07d4(\xb7u\x85\xcb=U\xa1\x99\xab)\x1d:\x18\u018f\u8684\x8a\x89j@v\xcfy\x95\xa0\x00\x00\xe0\x94(\xd4\xeb\xf4\x1e=\x95\xf9\xbb\x9a\x89u#\\\x1d\x009>\x80\x00\u07d4)\nV\xd4\x1fn\x9e\xfb\xdc\xea\x03B\u0dd2\x9a\x8c\xdf\xcb\x05\x89\x12\xa5\xf5\x81h\xee`\x00\x00\u07d4)\x15bK\xcbg\x917\xb8\xda\xe9\xabW\xd1\x1bI\x05\xea\xeeK\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4)\x1e\xfe\x00\x81\xdc\xe8\xc1G\x99\xf7\xb2\xa46\x19\xc0\u00f3\xfc\x1f\x89A\rXj \xa4\xc0\x00\x00\u07d4)\x1f\x92\x9c\xa5\x9bT\xf8D>=Mu\xd9]\xee$<\xefx\x89\x1b\x1a\b\x927\a=\x00\x00\xe0\x94))\x8c\xcb\xdf\xf6\x89\xf8\u007f\xe4\x1a\xa6\xe9\x8f\u07f5=\xea\xf3z\x8a\x041\\2\xd7\x1a\x9e`\x00\x00\u07d4)/\"\x8b\n\x94t\x8c\x8e\xeca-$o\x98\x93c\xe0\x8f\b\x89\n\ad\a\xd3\xf7D\x00\x00\u07d4)3\x84\xc4+o\x8f)\x05\xceR\xb7 \\\"t7la+\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4)4\xc0\xdf{\xbc\x17+l\x18k\vrTz\u038b\xf7TT\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4)<#\x06\xdf6\x04\xaeO\xda\r z\xbasog\xde\a\x92\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94)I\xfd\x1d\xef\\v\xa2\x86\xb3\x87$$\x80\x9a\a\xdb9f\xf3\x8a\x01\x1b\xd9\x06\u06a0\xc9C\x80\x00\u07d4)OIK?.\x14\xa3\xf8\xab\x00\x00\x00\u07d4)U\xc3W\xfd\x8fu\xd5\x15\x9a=\xfai\u0178z5\x9d\ua309lk\x93[\x8b\xbd@\x00\x00\u07d4)a\xfb9\x1ca\x95|\xb5\xc9\xe4\a\u0762\x938\u04f9,\x80\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4)h\x1d\x99\x12\xdd\xd0~\xaa\xbb\x88\xd0]\x90\xf7f\xe8bA}\x8965\u026d\xc5\u07a0\x00\x00\u07d4)kq\xc0\x01X\x19\xc2B\xa7\x86\x1eo\xf7\xed\xed\x8a_q\xe3\x89lh\xcc\u041b\x02,\x00\x00\u07d4)mf\xb5!W\x1aNA\x03\xa7\xf5b\xc5\x11\xe6\xaas-\x81\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4)o\x00\xde\x1d\u00fb\x01\xd4z\x8c\xcd\x1e]\x1d\u0661\xebw\x91\x8965\u026d\xc5\u07a0\x00\x00\u07d4)s\x85\xe8\x864FV\x85\xc21\xa3\x14\xa0\xd5\xdc\xd1F\xaf\x01\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4)v=\xd6\u069a|\x16\x11s\x88\x83!\ub9b6<\x8f\xb8E\x89\x11\xc7\xea\x16.x \x00\x00\u07d4)yt\x11t\xa8\xc1\xea\v\u007f\x9e\xdfe\x81w\x85\x94\x17\xf5\x12\x89\x19\x01\x96l\x84\x96\x83\x80\x00\u07d4)z\x88\x92\x1b_\xca\x10\u5edd\xed`\x02T7\xae\"\x16\x94\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94)}]\xbe\"//\xb5%1\xac\xbd\v\x01=\xc4F\xacsh\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4)\x82N\x94\xccCH\xbc\x962y\xdc\xdfG9\x17\x152L\u04c9i*\xe8\x89p\x81\xd0\x00\x00\u07d4)\x82\xd7j\x15\xf8G\xddA\xf1\x92*\xf3h\xfeg\x8d\x0eh\x1e\x89\x05k\xc7^-c\x10\x00\x00\u07d4)\x88\x87\xba\xb5|[\xa4\xf0aR)\xd7R_\xa1\x13\xb7\ua249\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94)\x8e\xc7kD\r\x88\a\xb3\xf7\x8b_\x90\x97\x9b\xeeB\xedC\u06ca\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4)\x93h`\x90B\xa8X\xd1\xec\xdf\x1f\xc0\xad\xa5\xea\xce\xca)\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4)\x9e\v\xcaU\xe0i\u0785\x04\xe8\x9a\xcan\xca!\u04ca\x9a]\x89\x03\x027\x9b\xf2\xca.\x00\x00\u07d4)\xac+E\x84T\xa3l~\x96\xc7:\x86g\"*\x12$,q\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94)\xad\u03c3\xb6\xb2\n\u01a44\xab\xb1\x99<\xbd\x05\xc6\x0e\xa2\xe4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94)\xae\xf4\x8d\xe8\xc9\xfb\xadK\x9eL\xa9pyzU3\xebr-\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4)\xb3\xf5a\xeezn%\x94\x1e\x98\xa52[x\xad\u01d7\x85\xf3\x89\x05k\xc7^-c\x10\x00\x00\u07d4)\xbd\xc4\xf2\x8d\xe0\x18\x0fC<&\x94\xebt\xf5PL\xe9C7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4)\u0300M\x92+\xe9\x1fY\t\xf3H\xb0\xaa\xa5\xd2\x1b`x0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94)\xda>5\xb2;\xb1\xf7/\x8e\"X\xcf\u007fU3Y\xd2K\xac\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94)\xe6y\x90\xe1\xb6\xd5.\x10U\xff\xe0I\xc51\x95\xa8\x15B\u03ca\x04<3\xc1\x93ud\x80\x00\x00\u07d4)\uab82v\x17b\xf4\xd2\xdbS\xa9\u018b\x0fk\vmNf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4)\xeb~\xef\xda\xe9\xfe\xb4I\xc6?\xf5\xf2y\xd6u\x10\xeb\x14\"\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4)\xf0\xed\xc6\x038\xe7\x11 \x85\xa1\xd1\x14\u068cB\u038fU\u0589\xa0Z\u007f\x0f\xd8%x\x00\x00\u07d4)\xf8\xfb\xa4\xc3\ar\xb0W\xed\xbb\xe6*\xe7B\f9\x05r\xe1\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94)\xf9(l\x0es\x8d\x17!\xa6\x91\u01b9Z\xb3\u0667\x97\xed\xe8\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4*\b^%\xb6Hb\xf5\xe6\x8dv\x8e+\x0fz\x85)\x85\x8e\xee\x89k\x88:\xcdWf\xcd\x00\x00\u07d4**\xb6\xb7Lz\xf1\xd9Gk\xb5\xbc\xb4RG\x97\xbe\xdc5R\x8965\u026d\xc5\u07a0\x00\x00\u07d4*9\x19\nO\u0783\u07f3\xdd\xcbL_\xbb\x83\xaclIu\\\x8965\u026d\xc5\u07a0\x00\x00\u07d4*@\r\xff\x85\x94\xder(\xb4\xfd\x15\xc3#\"\xb7[\xb8}\xa8\x89\x051\xa1\u007f`z-\x00\x00\xe0\x94*D\xa7!\x8f\xe4Me\xa1\xb4\xb7\xa7\u0671\xc2\xc5,\x8c>4\x8a\r-\x06\xc3\x05\xa1\xebW\x80\x00\u07d4*F\xd3Swqv\xff\x8e\x83\xff\xa8\x00\x1fOp\xf9s:\xa5\x89\x05\xbf\v\xa6cOh\x00\x00\u07d4*Y_\x16\xee\xe4\xcb\f\x17\u0662\xd99\xb3\xc1\x0flgrC\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4*Y\xe4~\xa5\xd8\xf0\xe7\xc0(\xa3\xe8\xe0\x93\xa4\x9c\x1bP\xb9\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4*[\xa9\xe3L\u054d\xa5L\x9a'\x12f:;\xe2t\xc8\xe4{\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94*^:@\xd2\xcd\x03%vm\xe7:=g\x18\x96\xb3b\xc7;\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94*cY\x0e\xfe\x99\x86\xc3\xfe\xe0\x9b\n\n3\x8b\x15\xbe\xd9\x1f!\x8a\x01^\x1cN\x05\xee&\xd0\x00\x00\u07d4*gf\n\x13h\xef\xcdbn\xf3k+\x1b`\x19\x80\x94\x1c\x05\x89\a?u\u0460\x85\xba\x00\x00\u07d4*t+\x89\x10\x94\x1e\t2\x83\n\x1d\x96\x92\xcf\u0484\x94\xcf@\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4*tl\xd4@'\xaf>\xbd7\xc3x\xc8^\xf7\xf7T\xab_(\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4*\x81\xd2|\xb6\xd4w\x0f\xf4\xf3\u0123\xba\x18\xe5\xe5\u007f\aQ|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4*\x91\xa9\xfe\xd4\x1b}\x0e\\\xd2\xd81X\xd3\xe8\xa4\x1a\x9a-q\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94*\x9cW\xfe{k\x13\x8a\x92\rgo{\x1a%\x10\x80\xff\xb9\x8a4\xf0\x86\xf3\xb3;h@\x00\x00\u07d4+p\x1d\x16\xc0\xd3\xcc\x1eL\xd8TE\xe6\xad\x02\ue92c\x01-\x89 \x86\xac5\x10R`\x00\x00\xe0\x94+q|\xd42\xa3#\xa4e\x909\x84\x8d;\x87\xde&\xfc\x95F\x8ai\xe1\r\xe7fv\u0400\x00\x00\u07d4+t\xc3s\xd0K\xfb\x0f\xd6\n\x18\xa0\x1a\x88\xfb\xe8Gp\u5309\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4+w\xa4\u060c\rV\xa3\xdb\xe3\xba\xe0J\x05\xf4\xfc\u0477W\xe1\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94+\x84\x88\xbd-<\x19z=&\x15\x18\x15\xb5\xa7\x98\xd2qh\u070a\x01j\x1f\x9f_\xd7\xd9`\x00\x00\u07d4+\x8a\r\xee\\\xb0\xe1\xe9~\x15\xcf\xcan\x19\xad!\xf9\x95\ufb49\x1bUC\x8d\x9a$\x9b\x00\x00\xe0\x94+\x8f\xe4\x16n#\xd1\x19c\xc0\x93+\x8a\u078e\x01E\xea\ap\x8a\t(\x96R\x9b\xad\u0708\x00\x00\xe0\x94+\x99\xb4.OBa\x9e\xe3k\xaa~J\xf2\xd6^\xac\xfc\xba5\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4+\xab\x0f\xbe(\u0544 \xb5 6w\n\x12\xf9\x95*\xeai\x11\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4+\xad\xe9\x1d\x15E\x17b\x0f\u05349\xac\x97\x15zA\x02\xa9\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4+\xaf\x8dn\"\x11t\x12H \xeeI+\x94Y\xecO\xad\xaf\xbb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4+\xaf\xbf\x9e\x9e\xd2\xc2\x19\xf7\xf2y\x13t\xe7\xd0\\\xb0gw\xe7\x89\v\xed\x1d\x02c\xd9\xf0\x00\x00\xe0\x94+\xb3f\xb9\xed\xcb\r\xa6\x80\xf0\xe1\v;n(t\x81\x90\xd6\u00ca\x01:b\u05f5v@d\x00\x00\xe0\x94+\xb6\xf5x\xad\xfb\u7ca1\x16\xb3UO\xac\xf9\x96\x98\x13\xc3\x19\x8a\x01\x91'\xa19\x1e\xa2\xa0\x00\x00\u07d4+\xbeb\xea\xc8\f\xa7\xf4\xd6\xfd\xee~}\x8e(\xb6:\xcfw\x0e\x89\x81\xe3-\xf9r\xab\xf0\x00\x00\u07d4+\xbeg*\x18WP\x8fc\x0f*^\xdbV=\x9e\x9d\xe9(\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4+\xc4)\xd6\x18\xa6jL\xf8-\xbb-\x82N\x93V\xef\xfa\x12j\x89lj\xccg\u05f1\xd4\x00\x00\u07d4+\xd2R\xe0\xd72\xff\x1d|x\xf0\xa0.l\xb2T#\xcf\x1b\x1a\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4+\xdd\x03\xbe\xbb\xee';l\xa1\x05\x9b4\x99\x9a[\xbda\xbby\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4,\x04\x11\\>R\x96\x1b\r\xc0\xb0\xbf1\xfb\xa4ToYf\xfd\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94,\x06\u0752+aQJ\xaf\xed\xd8D\x88\xc0\u008em\xcf\x0e\x99\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94,\f\xc3\xf9QH,\u0222\x92X\x15hN\xb9\xf9N\x06\x02\x00\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4,\x0e\xe14\u0633aE\xb4{\xee\u7bcd'8\xdb\xda\b\xe8\x89\n\xe5os\x0em\x84\x00\x00\u07d4,\x0f[\x9d\xf46%y\x8e~\x03\xc1\xa5\xfdjm\t\x1a\xf8+\x89\x01\xb0\xfc\xaa\xb2\x000\x00\x00\u07d4,\x12\x8c\x95\xd9W!Q\x01\xf0C\u074f\u0142EmA\x01m\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4,\x18\x00\xf3_\xa0->\xb6\xff[%(_^J\xdd\x13\xb3\x8d\x891\"\u04ed\xaf\xde\x10\x00\x00\u07d4,\x1c\x19\x11N=m\xe2xQHK\x8d'\x15\xe5\x0f\x8a\x10e\x89\x05k\xc7^-c\x10\x00\x00\u07d4,\x1c\xc6\xe1\x8c\x15$\x88\xba\x11\xc2\xcc\x1b\xce\xfa-\xf3\x06\xab\u0449Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94,\x1d\xf8\xa7oH\xf6\xb5K\u03dc\xafV\xf0\xee\x1c\xf5z\xb3=\x8a\x02$\u007fu\x00\x89\xdaX\x00\x00\u07d4,!G\x94z\xe3?\xb0\x98\xb4\x89\xa5\xc1k\xff\xf9\xab\xcdN*\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4,#OP\\\xa8\xdc\xc7}\x9b~\x01\xd2W\xc3\x18\xcc\x199m\x89\x05k\xc7^-c\x10\x00\x00\u07d4,$(\xe4\xa6it\xed\xc8\"\xd5\xdb\xfb$\x1b'(\aQX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4,-\x15\xff9V\x1c\x1br\xed\xa1\xcc\x02\u007f\xfe\xf27C\xa1D\x89\u0500\xed\x9e\xf3+@\x00\x00\u07d4,-\xb2\x8c3\t7^\xea1\x82\x1b\x84\xd4\b\x93\x0e\xfa\x1a\u01c9lk\x93[\x8b\xbd@\x00\x00\u07d4,Z-\n\xbd\xa0;\xbe!W\x81\xb4\xff)l\x8ca\xbd\xba\xf6\x89\x01\xa8\xe5oH\xc0\"\x80\x00\u07d4,[}{\x19Z7\x1b\xf9\xab\u0774/\xe0O/\x1d\x9a\x99\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4,]\xf8ffj\x19K&\u03bb@~J\x1f\xd7> \x8d^\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94,`?\xf0\xfe\x93alCW>\xf2y\xbf\xea@\x88\x8dj\xe7\x8a\x01\x00\xf4\xb6\xd6gW\x90\x00\x00\xe0\x94,hF\xa1\xaa\x99\x9a\"F\xa2\x87\x05`\x00\xbaM\u02e8\xe6=\x8a\x02\x1f/o\x0f\xc3\xc6\x10\x00\x00\u0794,j\xfc\xd4\x03|\x1e\xd1O\xa7O\xf6u\x8e\tE\xa1\x85\xa8\xe8\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4,ki\x9d\x9e\xad4\x9f\x06\u007fEq\x1a\aJd\x1d\xb6\xa8\x97\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4,o\\\x12L\u01c9\xf8\xbb9\x8e?\x88\x97Q\xbcK`-\x9e\x89\x01Y\xf2\v\xed\x00\xf0\x00\x00\u07d4,\x83\xae\xb0/\xcf\x06}e\xa4p\x82\xfd\x97x3\xab\x1c\uc449\b'8#%\x8a\xc0\x00\x00\xe0\x94,\x89\xf5\xfd\xca=\x15T\t\xb68\xb9\x8at.U\xebFR\xb7\x8a\x14\u06f2\x19\\\xa2(\x90\x00\x00\u07d4,\x96HI\xb1\xf6\x9c\xc7\u03a4D%8\xed\x87\xfd\xf1l\xfc\x8f\x89lk\x93[\x8b\xbd@\x00\x00\u0794,\x9f\xa7,\x95\xf3}\b\xe9\xa3`\t\u7930\u007f)\xba\xd4\x1a\x88\xdfn\xb0\xb2\xd3\xca\x00\x00\u07d4,\xafk\xf4\xec}Z\x19\xc5\xe0\x89z^\xeb\x01\x1d\xce\xceB\x10\x89\a\x93H5\xa01\x16\x00\x00\u07d4,\xb4\xc3\xc1k\xb1\xc5^|kz\x19\xb1'\xa1\xac\x93\x90\xcc\t\x89\xb8'\x94\xa9$O\f\x80\x00\xe0\x94,\xb5IZPS6\xc2FT\x10\xd1\xca\xe0\x95\xb8\xe1\xba\\\u074a\x04<3\xc1\x93ud\x80\x00\x00\u07d4,\xb6\x15\a:@\xdc\u06d9\xfa\xa8HW.\x98{;\x05n\xfb\x89+X\xad\u06c9\xa2X\x00\x00\u07d4,\xbam]\r\xc2\x04\xea\x8a%\xad\xa2\xe2oVu\xbd_/\u0709H#\xef}\u06da\xf3\x80\x00\u07d4,\xbb\fs\u07d1\xb9\x17@\xb6i;wJ}\x05\x17~\x8eX\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4,\xcbfIM\n\xf6\x89\xab\xf9H=6]x$D\xe7\u07ad\x8965\u026d\xc5\u07a0\x00\x00\u07d4,\xcc\x1f\x1c\xb5\xf4\xa8\x00.\x18k \x88]\x9d\xbc\x03\f\b\x94\x89lk\x93[\x8b\xbd@\x00\x00\u07d4,\u03c0\xe2\x18\x98\x12^\xb4\xe8\a\u0342\xe0\x9b\x9d(Y/n\x89lk\x93[\x8b\xbd@\x00\x00\u07d4,\u0456\x94\u0452j\x0f\xa9\x18\x9e\u07ba\xfcg\x1c\xf1\xb2\u02a5\x8965\u026d\xc5\u07a0\x00\x00\u07d4,\u04d34\xac~\xacyrW\xab\xe3sa\x95\xf5\xb4\xb5\xce\x0f\x89\x05kGx^7&\x00\x00\u07d4,\u05de\xb5 '\xb1,\x18\x82\x8e>\xaa\xb2\x96\x9b\xfc\u0487\xe9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4,\xd8xfV\x8d\xd8\x1a\xd4}\x9d:\u0404nZePss\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4,\xdb9De\x06\x16\xe4|\xb1\x82\xe0`2/\xa1Hyx\u0389b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4,\xe1\x1a\x92\xfa\xd0$\xff+>\x87\xe3\xb5B\xe6\xc6\r\xcb\u0656\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4-\x03&\xb2?\x04\t\xc0\xc0\xe9#hc\xa13\aZ\x94\xba\x18\x89\vg\x9b\xe7[\xe6\xae\x00\x00\u07d4-\r\xecQ\xa6\xe8s0\xa6\xa8\xfa*\x0fe\u060dJ\xbc\xdfs\x89\n\ad\a\xd3\xf7D\x00\x00\u07d4-#vkok\x05s}\xad\x80\xa4\x19\xc4\x0e\xdaMw\x10>\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4-+\x03#Y\xb3c\x96O\xc1\x1aQ\x82c\xbf\xd0T1\xe8g\x89\b\x1c\x1d\xf7b\x9ep\x00\x00\u07d4-4\x80\xbf\be\aJr\xc7u\x9e\xe5\x13{Mp\xc5\x1c\xe9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4-5\xa9\xdfbu\u007f\u007f\xfa\xd1\x04\x9a\xfb\x06\xcaJ\xfcFLQ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4-@U\x8b\x06\xf9\n9#\x14U\x92\x12;gt\xe4n1\xf4\x8965\u026d\xc5\u07a0\x00\x00\u07d4-Bi\x12\xd0Y\xfa\xd9t\v.9\n.\xea\xc0To\xf0\x1b\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4-S-\xf4\xc69\x11\xd1\u0391\xf6\xd1\xfc\xbf\xf7\x96\x0fx\xa8\x85\x89Z\x85\x96\x8aXx\u0680\x00\u07d4-S\x91\xe98\xb3HX\u03d6[\x84\x051\xd5\xef\xdaA\v\t\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94-[B\xfcY\xeb\xda\r\xfdf\xae\x91K\u008c\x1b\nn\xf8:\x8a+\u0235\x9f\xdc\xd86c\x80\x00\u07d4-]s5\xac\xb06+G\u07e3\xa8\xa4\xd3\xf5\x94\x95D\u04c0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94-a\xbf\xc5hs\x92<+\x00\t]\xc3\xea\xa0\xf5\x90\u062e\x0f\x8a\x04ef\xdf\xf8\xceU`\x00\x00\u07d4-e\x11\xfdz8\x00\xb2hT\xc7\xec9\xc0\u0735\xf4\xc4\xe8\xe8\x89\x15\xad\u077a/\x9ew\x00\x00\u07d4-}\\@\u076f\xc4P\xb0Jt\xa4\u06bc+\xb5\xd6e\x00.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4-\x89\xa8\x00jO\x13z \xdc+\xecF\xfe.\xb3\x12\xea\x96T\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4-\x8cR2\x9f8\u04a2\xfa\x9c\xba\xf5\u0143\xda\xf1I\v\xb1\x1c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4-\x8e\x06\x18\x92\xa5\xdc\xce!\x96j\xe1\xbb\a\x88\xfd>\x8b\xa0Y\x89\r\x8e\\\xe6\x17\xf2\xd5\x00\x00\u07d4-\x8e[\xb8\xd3R\x16\x95\xc7~|\x83N\x02\x91\xbf\xac\xeet\b\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4-\x90\xb4\x15\xa3\x8e.\x19\xcd\xd0/\U000ed069z\xf7\xcb\xf6r\x89\x05\xf3\xc7\xf6A1\xe4\x00\x00\u07d4-\x9b\xado\x1e\xe0*p\xf1\xf1=\xef\\\u0332z\x9a'@1\x89a\t=|,m8\x00\x00\u07d4-\x9c_\xec\u04b4O\xbbj\x1e\xc72\xea\x05\x9fO\x1f\x9d+\\\x896\xca2f\x1d\x1a\xa7\x00\x00\xe0\x94-\xa6\x17iP\t\xccW\xd2j\u0510\xb3*]\xfb\xeb\x93N^\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4-\xa7k|9\xb4 \u323a,\x10 \xb0\x85k\x02pd\x8a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4-\u01ddn\u007fU\xbc\xe2\xe2\xd0\xc0*\xd0|\uca3bR\x93T\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\xe0\x94-\xca\x0eD\x9a\xb6F\xdb\xdf\u04d3\xa9fb\x96\v\u02b5\xae\x1e\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4-\xd3%\xfd\xff\xb9{\x19\x99R\x84\xaf\xa5\xab\xdbWJ\x1d\xf1j\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4-\xd5x\xf7@}\xfb\xd5H\xd0^\x95\xcc\u00dcHT)bj\x89\u3bb5sr@\xa0\x00\x00\u07d4-\xd8\xee\xef\x87\x19J\xbc,\xe7X]\xa1\xe3[|\xeax\f\xb7\x8965\xc6 G9\u0640\x00\u07d4-\xdf@\x90Wi\xbc\xc4&\xcb,)8\xff\xe0w\xe1\u8758\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4-\xe0\x96D\x00\u0082\xbd\u05ca\x91\x9ck\xf7|k_yay\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94-\xe3\x1a\xfd\x18\x9a\x13\xa7o\xf6\xfes\xea\xd9\xf7K\xb5\u0126)\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4-\xec\x982\x9d\x1f\x96\u00e5\x9c\xaay\x81uTR\xd4\xdaI\u0549\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94-\ue422\x8f\x19-gj\x87s#+V\xf1\x8f#\x9e/\xad\x8a\x03\xef\xa7\xe7G\xb6\u046d\x00\x00\xe0\x94.\b\x80\xa3E\x96#\a \xf0Z\xc8\xf0e\xaf\x86\x81\u0736\u008a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4.\fW\xb4qP\xf9Z\xa6\xa7\xe1j\xb9\xb1\xcb\xf5C(\x97\x9a\x89\x05k\xc7^-c\x10\x00\x00\u07d4.\x10\x91\v\xa6\xe0\xbc\x17\xe0UUf\x14\u02c7\t\x0fM~[\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94.$\xb5\x97\x87;\xb1A\xbd\xb27\xea\x8aZ\xb7Gy\x9a\xf0-\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4.(\x10\xde\xe4J\xe4\xdf\xf3\xd8cB\xab\x12fW\xd6S\xc36\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4.,\xbdz\xd8%G\xb4\xf5\xff\x8b:\xb5o\x94*dE\xa3\xb0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4.-~\xa6k\x9fG\xd8\xccR\xc0\x1cR\xb6\u147c}G\x86\x89\xd8\xd4`,&\xbfl\x00\x00\u07d4.C\x93H\u07caBw\xb2*v\x84W\xd1\x15\x8e\x97\xc4\t\x04\x89*\x1e\x9f\xf2o\xbfA\x00\x00\xe0\x94.F\xfc\xeej;\xb1E\xb5\x94\xa2C\xa3\x91?\xce]\xado\xba\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794.G\xf2\x87\xf4\x98#7\x13\x85\r1&\x82<\xc6}\xce\xe2U\x88\u029d\x9e\xa5X\xb4\x00\x00\u07d4.N\u1b99j\xa0\xa1\xd9$(\xd0fR\xa6\xbe\xa6\xd2\xd1]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4.R\x91+\xc1\x0e\xa3\x9dT\xe2\x93\xf7\xae\u05b9\x9a\x0fLs\xbe\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4.a\x9fW\xab\xc1\u91ea\x93j\xe3\xa2&Ib\xe7\xeb-\x9a\x89(\xfb\x9b\x8a\x8aSP\x00\x00\u07d4.d\xa8\xd7\x11\x11\xa2/L]\xe1\xe09\xb36\xf6\x8d9\x8a|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4.i3T=O,\xc0\vSP\xbd\x80h\xba\x92C\u05be\xb0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94.~\x05\xe2\x9e\u0767\xe4\xae%\xc5\x175C\xef\xd7\x1fm=\x80\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4.\u007fFU \xec5\xcc#\u058eue\x1b\xb6h\x95D\xa1\x96\x898\xec[r\x1a\x1a&\x80\x00\u07d4.\x8e\xb3\nqn_\xe1\\t#>\x03\x9b\xfb\x11\x06\xe8\x1d\x12\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94.\x98$\xb5\xc12\x11\x1b\xca$\xdd\xfb\xa7\xe5u\xa5\xcdr\x96\xc1\x8a\x03\xa4\x84Qnm\u007f\xfe\x00\x00\u07d4.\xa5\xfe\xe6?3z7nK\x91\x8e\xa8!H\xf9MH\xa6&\x89e\x0f\x8e\r\u0493\xc5\x00\x00\u07d4.\xafN*F\xb7\x89\xcc\u0088\xc8\xd1\xd9)N?\xb0\x858\x96\x89lk\x93[\x8b\xbd@\x00\x00\u07d4.\xaf\xf9\xf8\xf8\x110d\u04d5z\xc6\xd6\xe1\x1e\xeeB\xc8\x19]\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4.\xba\fn\xe5\xa1\x14\\\x1cW9\x84\x96:`]\x88\nz \x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4.\xc9X\"\xeb\x88{\xc1\x13\xb4q*M\xfd\u007f\x13\xb0\x97\xb5\xe7\x8965\u026d\xc5\u07a0\x00\x00\u07d4.\xcaj<]\x9fD\x9d\tV\xbdC\xfa{M{\xe8CYX\x89lk\xdaip\x9c\xc2\x00\x00\xe0\x94.\xca\xc5\x04\xb23\x86n\xb5\xa4\xa9\x9e{\u0490\x13Y\xe4;=\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4.\xeb\xf5\x942\xb5(\x92\xf98\v\xd1@\xaa\x99\xdc\xf8\xad\f\x0f\x89\b=lz\xabc`\x00\x00\u07d4.\xee\xd5\x04q\xa1\xa2\xbfS\xee0\xb1#.n\x9d\x80\xef\x86m\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4.\xefk\x14\x17\u05f1\x0e\xcf\xc1\x9b\x12:\x8a\x89\xe7>RlX\x89 \x86\xac5\x10R`\x00\x00\u07d4.\xf8i\xf05\vW\xd54x\xd7\x01\xe3\xfe\xe5)\xbc\x91\x1cu\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4.\xf9\xe4eqj\xca\u03f8\xc8%/\xa8\xe7\xbcyi\xeb\xf6\u4255\x9e\xb1\xc0\xe4\xae \x00\x00\xe0\x94.\xfcLd}\xacj\xca\xc3Uw\xad\"\x17X\xfe\xf6ao\xaa\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4/\x13eu&\xb1w\xca\xd5G\u00d0\x8c\x84\x0e\xffd{E\u0649?v\x84\x9c\xf1\xee,\x80\x00\u07d4/\x18}ZpMZ3\x8c[(v\xa0\x90\xdc\xe9d(N)\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94/%#\u0303O\x00\x86\x05$\x02bb\x96gQ\x86\xa8\u508a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4/(*\xbb\xb6\u0523\xc3\xcd;\\\xa8\x12\xf7d>\x800_\x06\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4/+\xba\x1b\x17\x96\x82\x1avo\xced\xb8O(\xech\xf1Z\xea\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4/1]\x90\x16\xe8\xee_Sf\x81 /\x90\x84\xb02TMM\x898<\xd1+\x9e\x86<\x00\x00\u07d4/M\xa7SC\x0f\xc0\x9es\xac\xbc\xcd\xcd\xe9\xdad\u007f+]7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4/P\x80\xb8?~-\xc0\xa1\xdd\x11\xb0\x92\xad\x04+\xffx\x8fL\x89\xb4\xf8\xfby#\x1d+\x80\x00\u07d4/a\uf941\x9dp_+\x1eN\xe7T\xae\xb8\xa8\x19Pju\x89O%\x91\xf8\x96\xa6P\x00\x00\xe0\x94/f\xbf\xbf\"b\xef\u030d+\xd0DO\u0170ib\x98\xff\x1e\x8a\x02\x1a\xd95\xf7\x9fv\xd0\x00\x00\u07d4/m\xce\x130\u015e\xf9!`!TW-MK\xac\xbd\x04\x8a\x8965\u026d\xc5\u07a0\x00\x00\u07d4/}2\x90\x85\x1b\xe5\u01b4\xb4?}Et2\x9fa\xa7\x92\u00c9\x05k\xc7^-c\x10\x00\x00\u07d4/\x858\x17\xaf\u04f8\xf3\xb8n\x9f`\xeew\xb5\xd9ws\xc0\xe3\x89N\xae\xeaD\xe3h\xb9\x00\x00\u07d4/\xa4\x91\xfbY \xa6WN\xbd(\x9f9\xc1\xb2C\r-\x9aj\x89lk\x93[\x8b\xbd@\x00\x00\u07d4/\xb5f\xc9K\xbb\xa4\xe3\xcbg\xcd\xda}_\xadq1S\x91\x02\x89lk\x93[\x8b\xbd@\x00\x00\u07d4/\xbbPJ]\xc5'\xd3\xe3\xeb\x00\x85\xe2\xfc<}\xd58\xcbz\x89C\u00b1\x8a\xec<\n\x80\x00\u07d4/\xbc\x85y\x8aX5\x98\xb5\"\x16mn\x9d\xda\x12\x1db}\xbc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4/\xbc\xef3\x84\xd4 \xe4\xbfa\xa0f\x99\x90\xbcpT\U00065bc9lk\x93[\x8b\xbd@\x00\x00\xe0\x94/\xc8.\xf0v\x93#A&Oaz\f\x80\xddW\x1ej\xe99\x8a\x01\x84$\xf5\xf0\xb1\xb4\xe0\x00\x00\u07d4/\u075by\u07cd\xf50\xadc\xc2\x0eb\xafC\x1a\xe9\x92\x16\xb8\x89\x01#n\xfc\xbc\xbb4\x00\x00\u07d4/\xe0\x02?W\"e\x0f:\x8a\xc0\x10\t\x12^t\xe3\xf8.\x9b\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4/\xe0\xccBKS\xa3\x1f\t\x16\xbe\b\xec\x81\xc5\v\xf8\xea\xb0\xc1\x89 \x86\xac5\x10R`\x00\x00\u07d4/\xe1:\x8d\a\x85\u0787X\xa5\xe4\x18v\xc3n\x91l\xf7Pt\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4/\xea\x1b/\x83O\x02\xfcT3?\x8a\x80\x9f\x048\xe5\x87\n\xa9\x89\x01\x18T\xd0\xf9\xce\xe4\x00\x00\u07d4/\xee6\xa4\x9e\xe5\x0e\xcfqo\x10G\x91VFw\x9f\x8b\xa0?\x899B\"\xc4\u0686\xd7\x00\x00\u07d4/\xef\x81G\x8aK.\x80\x98\xdb_\xf3\x87\xba!S\xf4\xe2+y\x896'\xe8\xf7\x127<\x00\x00\u07d4/\xf1`\xc4Or\xa2\x99\xb5\xec-q\xe2\x8c\xe5Dm/\u02ef\x89\x13\x84\x00\xec\xa3d\xa0\x00\x00\u07d4/\xf1\xcaU\xfd\x9c\xec\x1b\x1f\xe9\U00029af7LQ<\x1e*\xaa\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94/\xf5\u02b1,\r\x95\u007f\xd33\xf3\x82\xee\xb7Q\a\xa6L\xb8\xe8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94/\xf80\xcfU\xfb\x00\u0560\xe05\x14\xfe\xcdD1K\xd6\xd9\xf1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4/\xfe\x93\xec\x1aV6\xe9\xee4\xafp\xdf\xf5&\x82\xe6\xffpy\x89lk\x93[\x8b\xbd@\x00\x00\u07d40\x03y\x88p&q\xac\xbe\x89,\x03\xfeW\x88\xaa\x98\xaf(z\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d40$\x8dX\xe4\x14\xb2\x0f\xed:lH+Y\xd9\xd8\xf5\xa4\xb7\xe2\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4019\xbcYd\x03\xd5\u04d3\x1fwLf\u013aFtT\u06c9\\%\xe1J\xea(?\x00\x00\u079408\x00\x87xie\x14\x9e\x81B;\x15\xe3\x13\xba2\xc5\u01c3\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d40:0\xacB\x86\xae\x17\xcfH=\xad{\x87\fk\xd6M{J\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d40?\xba\xeb\xbeF\xb3[n[t\x94j_\x99\xbc\x15\x85\xca\xe7\x89/\x9a\xc0i_[\xba\x00\x00\u07d40ADZ3\xba\x15\x87A\x16\r\x9c4N\xb8\x8e\\0o\x94\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d40H\x01d\xbc\xd8It\xeb\xc0\xd9\f\x9b\x9a\xfa\xb6&\xcd\x1cs\x89+^:\xf1k\x18\x80\x00\x00\u07d40N\u019atTW!\xd71j\xefM\u03f4\x1a\u015e\xe2\xf0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x940Q\x182\x91\x8d\x804\xa7\xbe\xe7.\xf2\xbf\xeeD\x0e\u02fc\xf6\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d40Q?\u029f6\xfdx\x8c\xfe\xa7\xa3@\xe8m\xf9\x82\x94\xa2D\x89\x18;_\x03\xb1G\x9c\x00\x00\u07d40U\xef\xd2`)\xe0\xd1\x1b\x93\r\xf4\xf5;\x16,\x8c?\xd2\u0389\x1b\x1a\b\x927\a=\x00\x00\u07d40]&\xc1\v\xdc\x10?k\x9c!'.\xb7\xcb-\x91\b\xc4~\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d40_x\xd6\x18\xb9\x90\xb4)[\xac\x8a-\xfa&(\x84\xf8\x04\xea\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x940d\x89\x9a\x96\x1a>\x1d\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d40\x98\xb6]\xb9>\xca\xca\xf75\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d40\uc4d2$J!\b\u0247\xbc\\\xdd\xe0\ud7c3z\x81{\x89T\x99%\xf6\xc9\xc5%\x00\x00\xe0\x940\xed\x11\xb7{\xc1~^f\x94\u023c[nG\x98\xf6\x8d\x9c\xa7\x8a\x1eo\xb3B\x1f\xe0)\x9e\x00\x00\u07d40\xf7\xd0%\xd1o{\xee\x10U\x80Ho\x9fV\x1c{\xae?\xef\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x940\xfb\xe5\x88_\x9f\xcc\xe9\xea^\u06c2\xedJ\x11\x96\xdd%\x9a\xed\x8a\x01\x19\xe4\u007f!8\x1f@\x00\x00\u07d41\x04}p?c\xb94$\xfb\xbdn/\x1f\x9et\xde\x13\xe7\t\x89\x9a\x81f\xf7\u6ca7\x80\x00\u07d411?\xfdc[\xf2\xf32HA\xa8\x8c\a\xed\x14aD\xce\xeb\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d41Y\xe9\fH\xa9\x15\x90J\xdf\u24b2/\xa5\xfd^ryk\x896\xaf\xe9\x8f&\x06\x10\x00\x00\u07d41]\xb7C\x9f\xa1\u0574#\xaf\xa7\xddq\x98\xc1\xcft\xc9\x18\xbc\x89 \x86\xac5\x10R`\x00\x00\u07d41^\xf2\xdab\x0f\xd30\xd1.\xe5]\xe5\xf3)\xa6\x96\xe0\xa9h\x89\b!\xab\rD\x14\x98\x00\x00\u07d41n\x92\xa9\x1b\xbd\xa6\x8b\x9e/\x98\xb3\xc0H\x93N<\xc0\xb4\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d41n\xb4\xe4}\xf7\x1bB\xe1mo\xe4h%\xb72{\xaf1$\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d41q\x87~\x9d\x82\f\xc6\x18\xfc\t\x19\xb2\x9e\xfd3?\xdaI4\x8965\u026d\xc5\u07a0\x00\x00\u07d41|\xf4\xa2<\xb1\x91\xcd\xc5c\x12\u009d\x15\xe2\x10\xb3\xb9\xb7\x84\x89\a\xcef\xc5\x0e(@\x00\x00\u07d41\x8b.\xa5\xf0\xaa\xa8y\xc4\xd5\xe5H\xac\x9d\x92\xa0\xc6t\x87\xb7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d41\x8cv\xec\xfd\x8a\xf6\x8dpUSR\xe1\xf6\x01\xe3Y\x88\x04-\x89\x1b1\x19.h\xc7\xf0\x00\x00\u07d41\x8f\x1f\x8b\xd2 \xb0U\x8b\x95\xfb3\x10\x0f\xfd\xbbd\r|\xa6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d41\xaa;\x1e\xbe\x8cM\xbc\xb6\xa7\b\xb1\xd7H1\xe6\x0eIv`\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d41\xab\b\x89f\xec\xc7\"\x92X\xf6\t\x8f\xceh\xcf9\xb3\x84\x85\x8965\u026d\xc5\u07a0\x00\x00\xe0\x941\xadM\x99F\xef\t\xd8\xe9\x88\xd9F\xb1\"\u007f\x91A\x90\x176\x8a\x04\xd8S\xc8\xf8\x90\x89\x80\x00\x00\xe0\x941\xb4;\x01]\x00\x81d~h\x00\x00\u07d424\x86\xcad\xb3uGO\xb2\xb7Y\xa9\xe7\xa15\x85\x9b\xd9\xf6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d427I\xa3\xb9q\x95\x9eF\u0234\x82-\xca\xfa\xf7\xaa\xf9\xbdn\x89\x01\x16q\xa5\xb2Ep\x00\x00\u07d42:\xadA\xdfKo\xc8\xfe\u038c\x93\x95\x8a\xa9\x01\xfah\bC\x894\x95tD\xb8@\xe8\x00\x00\xe0\x942;<\xfe>\xe6+\xbd\xe2\xa2a\xe5<\xb3\xec\xc0X\x10\xf2\u018a\x02\ub3b1\xa1r\u0738\x00\x00\u07d42?\xca^\xd7\u007fi\x9f\x9d\x990\xf5\xce\xef\xf8\xe5oY\xf0<\x89Hz\x9a0E9D\x00\x00\u07d42H\\\x81\x87(\xc1\x97\xfe\xa4\x87\xfb\xb6\xe8)\x15\x9e\xba\x83p\x899!\xb4\x13\xbcN\xc0\x80\x00\xe0\x942P\xe3\xe8X\xc2j\xde\u032d\xf3jVc\xc2*\xa8LAp\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x942Y\xbd/\xdd\xfb\xbco\xba\u04f6\xe8t\xf0\xbb\xc0,\xda\x18\xb5\x8a\x02\x84`VI[\r\x18\x80\x00\u07d42uIo\xd4\u07491\xfdi\xfb\n\v\x04\xc4\xd1\xff\x87\x9e\xf5\x89\x18-~L\xfd\xa08\x00\x00\u07d42{\xb4\x9euOo\xb4\xf73\xc6\xe0o9\x89\xb4\xf6]K\xee\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d42\x82y\x1do\xd7\x13\xf1\xe9OK\xfdV^\xaax\xb3\xa0Y\x9d\x89Hz\x9a0E9D\x00\x00\u07d42\x83\xeb\u007f\x917\xdd9\xbe\xd5_\xfek\x8d\xc8E\xf3\xe1\xa0y\x89\x03\x97\n\xe9!Ux\x00\x00\u07d42\x86\t\x97\xd70\xb2\xd8;s$\x1a%\xd3f}Q\xc9\b\xef\x89\x1b\x1a\b\x927\a=\x00\x00\xe0\x942\x86\u047cez1,\x88G\xd9<\xb3\xcbyP\xf2\xb0\xc6\xe3\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x942\xa2\r\x02\x8e,b\x18\xb9\xd9[D\\w\x15$cj\"\xef\x8a\x02\x02\xfe\xfb\xf2\xd7\xc2\xf0\x00\x00\u07d42\xa7\x06\x91%\\\x9f\xc9y\x1aOu\u0238\x1f8\x8e\n%\x03\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d42\xb7\xfe\xeb\xc5\u015b\xf6^\x86\x1cL\v\xe4*v\x11\xa5T\x1a\x89w\u9aa8R\\\x10\x00\x00\xe0\x942\xba\x9a}\x04#\xe0:R_\xe2\xeb\xebf\x1d \x85w\x8b\u060a\x04<3\xc1\x93ud\x80\x00\x00\u07d42\xbb.\x96\x93\xe4\xe0\x854M/\r\xbdF\xa2\x83\u3807\xfd\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x942\xc2\xfd\u2daa\xbb\x80\u5ba2\xb9I\xa2\x17\xf3\xcb\t\"\x83\x8a\x010a`\xaf\xdf 7\x80\x00\u07d42\xd9P\xd5\xe9>\xa1\u0574\x8d\xb4qO\x86{\x03 \xb3\x1c\x0f\x897\b\xba\xed=h\x90\x00\x00\u07d42\u06f6qlT\xe81e\x82\x9aJ\xbb6uxI\xb6\xe4}\x8965\u026d\xc5\u07a0\x00\x00\u07d42\xebd\xbe\x1b]\xed\xe4\b\u01bd\xef\xben@\\\x16\xb7\xed\x02\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d42\xef\\\xdcg\x1d\xf5V*\x90\x1a\xee]\xb7\x16\xb9\xbev\xdc\xf6\x89lk\x93[\x8b\xbd@\x00\x00\u07d42\xf2\x9e\x87'\xa7LkC\x01\xe3\xff\xff\x06\x87\xc1\xb8p\xda\xe9\x8965\u026d\xc5\u07a0\x00\x00\u07d42\xfa\x0e\x86\xcd\b}\u058di1\x90\xf3-\x931\t\t\xedS\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d42\xfb\xee\xd6\xf6&\xfc\xdf\xd5\x1a\xca\xfbs\v\x9e\xef\xf6\x12\xf5d\x89lk\x93[\x8b\xbd@\x00\x00\u07943\x00\xfb\x14\x9a\xde\xd6[\u02e6\xc0N\x9c\u05b7\xa0;\x89;\xb1\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x943\x01\xd9\xca/;\xfe\x02by\xcdh\x19\xf7\x9a)=\x98\x15n\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\xe0\x943\b\xb04f\xc2z\x17\xdf\xe1\xaa\xfc\xeb\x81\xe1m)4Vo\x8a\x03\x99\x92d\x8a#\u0220\x00\x00\u07943\x1a\x1c&\xcci\x94\xcd\xd3\xc1K\xec\xe2v\xff\xffK\x9d\xf7|\x88\xfaz\xed\xdfO\x06\x80\x00\xe0\x943&\xb8\x8d\xe8\x06\x18DT\xc4\v'\xf3\t\xd9\xddm\u03f9x\x8a\x03\xca\\f\u067cD0\x00\x00\xe0\x943)\xeb;\xafCE\xd6\x00\xce\xd4\x0en\x99ueo\x117B\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d432\r\xd9\x0f+\xaa\x11\r\xd34\x87*\x99\x8f\x14\x84&E<\x8965f3\xeb\xd8\xea\x00\x00\u07d436\xc3\xefn\x8bP\xee\x90\xe07\xb1d\xb7\xa8\xea_\xaa\xc6]\x89\x0e\u0223\xa7\x1c\"T\x00\x00\xe0\x9438\fo\xffZ\xcd&Q0\x96)\u06daq\xbf? \u017a\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d43:\xd1Yd\x01\xe0Z\xea-6\xcaG1\x8e\xf4\xcd,\xb3\u07c9\x9d\xc0\\\xce(\u00b8\x00\x00\u07d43C@\xeeK\x9c\u0701\xf8P\xa7Q\x16\xd5\x0e\u9d98%\xbf\x89lk\x93[\x8b\xbd@\x00\x00\u07d43H\x1e\x85n\xbe\u050e\xa7\b\xa2t&\xef(\xe8g\xf5|\u0449\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x943V[\xa9\xda,\x03\xe7x\xce\x12)O\b\x1d\xfe\x81\x06M$\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07943X\x1c\xee#0\x88\xc0\x86\r\x94N\f\xf1\u03ab\xb8&\x1c.\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d43XX\xf7I\xf1i\u02bc\xfeR\xb7\x96\xe3\xc1\x1e\xc4~\xa3\u0089\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x943^\"\x02[zw\u00e0t\u01cb\x8e=\xfe\a\x13A\x94n\x8a\x02'\xcas\n\xb3\xf6\xac\x00\x00\u07d43b\x9b\xd5/\x0e\x10{\xc0q\x17ld\xdf\x10\x8fdw}I\x89\x01\xcf\xddth!n\x80\x00\u07d43{;\u07c6\xd7\x13\xdb\xd0{]\xbf\xcc\x02+z{\x19F\xae\x89\xd7\xc1\x98q\x0ef\xb0\x00\x00\u07d43|\xfe\x11W\xa5\u0191 \x10\xddV\x153y\x17i\u00b6\xa6\x8965\u026d\xc5\u07a0\x00\x00\u07d43\xb36\xf5\xba^\xdb{\x1c\xcc~\xb1\xa0\u0644\xc1#\x1d\x0e\u0709lk\x93[\x8b\xbd@\x00\x00\u07d43\xc4\a\x13;\x84\xb3\xcaL=\xed\x1fFX\x90\f8\x10\x16$\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\xe0\x943\xd1r\xab\a\\Q\xdb\x1c\xd4\n\x8c\xa8\xdb\xff\r\x93\xb8C\xbb\x8a\x016x\x05\x10\xd1-\xe3\x80\x00\u07d43\xe9\xb7\x18#\x95.\x1ff\x95\x8c'\x8f\u008b\x11\x96\xa6\u0164\x89\x05k\xc7^-c\x10\x00\x00\u07d43\xeakxU\xe0[\a\xab\x80\u06b1\xe1M\xe9\xb6I\xe9\x9bl\x89\x1c\xd6\xfb\xadW\xdb\xd0\x00\x00\u07d43\xf1R#1\rD\u078bf6h_:L=\x9cVU\xa5\x89\r\x94b\xc6\xcbKZ\x00\x00\u07d43\xf4\xa6G\x1e\xb1\xbc\xa6\xa9\xf8[;Hr\xe1\aU\xc8+\xe1\x89lk\x93[\x8b\xbd@\x00\x00\u07d43\xfbWzM!O\xe0\x10\xd3,\xca|>\xed\xa6?\x87\xce\xef\x8965\u026d\xc5\u07a0\x00\x00\u07d43\xfdq\x8f\v\x91\xb5\xce\u020a]\xc1^\xec\xf0\xec\xef\xa4\xef=\x89\x17r$\xaa\x84Lr\x00\x00\u07d44\x14\x80\u030c\xb4v\xf8\xd0\x1f\xf3\b\x12\xe7\xc7\x0e\x05\xaf\xaf]\x89lk\x93[\x8b\xbd@\x00\x00\u07d44'-^ut1]\xca\u9afd1{\xac\x90(\x9dGe\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x9440\xa1c\x81\xf8i\xf6\xeaT#\x91XU\xe8\x00\x885%\xa9\x8a\x03\xca\\f\u067cD0\x00\x00\u07d441\x86%\x81\x8e\xc1?\x11\x83Z\xe9sS\xce7}oY\n\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d449<]\x91\xb9\xdeYr\x03\xe7[\xacC\t\xb5\xfa=(\u00c9\n\x84Jt$\xd9\xc8\x00\x00\u07d449\x99\x8b$|\xb4\xbf\x8b\xc8\nm+5'\xf1\xdf\xe9\xa6\u0489\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d44C}\x14ed\v\x13l\xb5\x84\x1c?\x93O\x9b\xa0\xb7\t}\x89\t`\xdbwh\x1e\x94\x00\x00\u07d44J\x8d\xb0\x86\xfa\xedN\xfc7\x13\x1b:\"\xb0x-\xadp\x95\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x944fM\"\x0f\xa7\xf3yX\x02J32\u0584\xbc\xc6\xd4\u023d\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d44f\xf6~9cl\x01\xf4;:!\xa0\xe8R\x93%\xc0\x86$\x89-\xb1\x16vP\xac\xd8\x00\x00\u07d44\x856\x1e\xe6\xbf\x06\xefe\b\xcc\xd2=\x94d\x1f\x81M>/\x89lk\x93[\x8b\xbd@\x00\x00\u07d44\x85\xf6!%d3\xb9\x8aB\x00\xda\xd8W\xef\xe5Y7\uc609lk\x93[\x8b\xbd@\x00\x00\u07d44\x95\x8aF\xd3\x0e0\xb2s\xec\xc6\xe5\xd3X\xa2\x12\xe50~\x8c\x89lk\x93[\x8b\xbd@\x00\x00\u07d44\x97\xddf\xfd\x11\x80q\xa7\x8c,\xb3n@\xb6e\x1c\xc8%\x98\x89\x05\xf1\x01kPv\xd0\x00\x00\xe0\x944\x9a\x81k\x17\xab='\xbb\xc0\xae\x00Q\xf6\xa0p\xbe\x1f\xf2\x9d\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d44\x9d,\x91\x8f\u041e(\a1\x8ef\xceC)\t\x17k\xd5\v\x89<\xb7\x1fQ\xfcU\x80\x00\x00\u07d44\xa0C\x1f\xff^\xad\x92\u007f\xb6`\f\x1e\xa8\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d44\xff&\xeb`\xa8\u0469ZH\x9f\xae\x13n\xe9\x1dNX\bL\x89 \x86\xac5\x10R`\x00\x00\u07d44\xffX)R\xff$E\x8f{\x13\xd5\x1f\vO\x98p\"\xc1\xfe\x89\x98\x06\xde=\xa6\xe9x\x00\x00\u07d45\x10k\xa9N\x85c\u0533\xcb<\\i,\x10\xe6\x04\xb7\xce\u0609lk\x93[\x8b\xbd@\x00\x00\xe0\x945\x14_b\x03\x97\u019c\xb8\xe0\tb\x96\x1f\x0fH\x86d9\x89\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d45\x14t0\xc3\x10e\x00\u77e2\xf5\x02F.\x94p<#\xb1\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x945\x17\x87\x845\x05\xf8\xe4\xef\xf4ef\xcc\u695fM\x1c_\xe7\x8a\x01\xf5q\x89\x87fKH\x00\x00\xe0\x945\x1f\x16\xe5\xe0sZ\xf5gQ\xb0\xe2%\xb2B\x11q9@\x90\x8a\x02\xd4\xca\x05\xe2\xb4<\xa8\x00\x00\xe0\x945$\xa0\x00#N\xba\xaf\a\x89\xa14\xa2\xa4\x178<\xe5(*\x8a\x011yU\x94}\x8e,\x00\x00\u07d45&\xee\xce\x1ak\xdc>\xe7\xb4\x00\xfe\x93[HF?1\xbe\u05c9\x04w\x87\x9bm\x140\x00\x00\u07d45*x_J\x92\x162PL\xe5\xd0\x15\xf8\xd7FO\xa3\xdb\x14\xe7r\x92\x13\u03aa7\x8c\t^\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d45\xaf\x04\n\f\xc23zv\xaf(\x81T\xc7V\x1e\x1a#3I\x8965\u026d\xc5\u07a0\x00\x00\u07d45\xb0>\xa4$W6\xf5{\x85\xd2\xebyb\x8f\x03m\xdc\xd7\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d45\xbd$he\xfa\xb4\x90\xac\bz\xc1\xf1\xd4\xf2\xc1\r\f\xda\x03\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x945\xbff\x88R/5Fz\u007fu0#\x14\xc0+\xa1v\x80\x0e\x8a\x03\xafA\x82\x02\xd9T\xe0\x00\x00\u07d45\u022d\xc1\x11%C+;w\xac\xd6F%\xfeX\xeb\xee\x9df\x89lk\x93[\x8b\xbd@\x00\x00\u07d45\u0497\x0fI\xdc\xc8\x1e\xa9\xeep~\x9c\x8a\n\xb2\xa8\xbbtc\x89N\x10\x03\xb2\x8d\x92\x80\x00\x00\u07d45\xe0\x96\x12\r\xea\xa5\xc1\xec\xb1d^,\u02cbN\xdb\xd9)\x9a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d45\xea!c\xa3\x8c\u07da\x12?\x82\xa5\xec\x00%\x8d\xae\v\xc7g\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d45\xf1\xda\x12{\x837o\x1b\x88\xc8*3Y\xf6z^g\xddP\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d45\xf2\x94\x9c\xf7\x8b\xc2\x19\xbbO\x01\x90|\xf3\xb4\xb3\u04c6T\x82\x89\x0f\xb5\xc8l\x92\xe44\x00\x00\u07d45\xf5\x86\x01I\xe4\xbb\xc0K\x8a\u0172r\xbeU\xad\x1a\xcaX\xe0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d46\x02E\x8d\xa8omj\x9d\x9e\xb0=\xaf\x97\xfeV\x19\xd4B\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d46\x057-\x93\xa9\x01\t\x88\x01\x8f\x9f1]\x03.\u0448\x0f\xa1\x89\x1b\x1b\xcfQ\x89j}\x00\x00\u07d46\x16\xd4H\x98_]2\xae\xfa\x8b\x93\xa9\x93\xe0\x94\xbd\x85I\x86\x89\v\"\u007fc\xbe\x81<\x00\x00\u07d46\x16\xfbF\xc8\x15x\xc9\xc8\xebM;\xf8\x80E\x1a\x887\x9d}\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d46\x1cu\x93\x16\x96\xbc=B}\x93\xe7lw\xfd\x13\xb2A\xf6\xf4\x89\x1d\xc5\xd8\xfc&m\xd6\x00\x00\u07d46\x1d\x9e\xd8\v[\xd2|\xf9\xf1\"o&u2X\xee_\x9b?\x89\xbfi\x14\xba}r\xc2\x00\x00\u07d46\x1f;\xa9\xed\x95kw\x0f%}6r\xfe\x1f\xf9\xf7\xb0$\f\x89 \x86\xac5\x10R`\x00\x00\u07d46\"|\u07e0\xfd;\x9d~jtF\x85\xf5\xbe\x9a\xa3f\xa7\xf0\x89\n\xc2s\x0e\xe9\xc6\xc1\x80\x00\u07d46/\xbc\xb1\x06b7\n\x06\x8f\xc2e&\x02\xa2Wy7\xcc\xe6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d460\xc5\xe5e\u03aa\x8a\x0f\x0f\xfe2\x87^\xae*l\xe6<\x19\x89\t7r+7t\xd0\x00\x00\u07d463\x9f\x84\xa5\u00b4L\xe5=\xfd\xb6\xd4\xf9}\xf7\x82\x12\xa7\u07c9\x11o\x18\xb8\x17\x15\xa0\x00\x00\u07d464:\xec\xa0{n\u054a\x0eb\xfaN\xcbI\x8a\x12O\xc9q\x89\x10CV\x1a\x88)0\x00\x00\u07d46au@4\x81\xe0\xab\x15\xbbQF\x15\u02f9\x89\xeb\u018f\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d46ro;\x88Z$\xf9)\x96\u0681b^\u022d\x16\xd8\xcb\xe6\x89S\xafu\u0441HW\x80\x00\xe0\x946s\x95C\x99\xf6\u07feg\x18\x18%\x9b\xb2x\xe2\xe9.\xe3\x15\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d46u\x8e\x04\x9c\u064b\u03a1\"w\xa6v\xf9)sb\x89\x00#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d46\u007fY\u0302yS)8NA\xe1(1\x15\xe7\x91\xf2j\x01\x89lk\x93[\x8b\xbd@\x00\x00\u07d46\x81\x0f\xf9\xd2\x13\xa2q\xed\xa2\xb8\xaay\x8b\xe6T\xfaK\xbe\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d46\x8cT\x14\xb5k\x84U\x17\x1f\xbf\ab \xc1\u02e4\xb5\xca1\x89\x1e>\xf9\x11\xe8=r\x00\x00\xe0\x946\x90$k\xa3\xc8\x06y\xe2.\xacD\x12\xa1\xae\xfc\xe6\xd7\u0342\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d46\x92\x8bU\xbc\x86\x15\t\xd5\x1c\x8c\xf1\xd5F\xbf\xecn>\x90\xaf\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d46\x98\"\xf5W\x8b@\xdd\x1fDqpk\"\u0357\x13R\xdak\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\u07d46\x9e\xf7a\x19_:7>$\xec\xe6\xcd\"R\x0f\xe0\xb9\xe8n\x89\x1c\xff\xaf\xc9M\xb2\b\x80\x00\u07d46\xa0\x8f\xd6\xfd\x1a\xc1|\xe1^\xd5~\xef\xb1*+\u2048\xbf\x89Hz\x9a0E9D\x00\x00\u07d46\xa0\xe6\x1e\x1b\xe4\u007f\xa8~0\xd3(\x88\xee\x030\x90\x1c\xa9\x91\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x946\xb2\xc8^:\xee\xeb\xb7\rc\u0124s\f\xe2\xe8\xe8\x8a6$\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x946\xbfC\xff5\u07d0\x90\x88$3l\x9b1\xce3\x06~/P\x8aIr\x15\x10\xc1\xc1\xe9H\x00\x00\u07d46\xbf\xe1\xfa;{p\xc1r\xeb\x04/h\x19\xa8\x97%\x95A>\x8965\u026d\xc5\u07a0\x00\x00\xe0\x946\xc5\x10\xbf\x8dnV\x9b\xf2\xf3}G&]\xbc\xb5\x02\xff+\u038a\x06ZM\xa2]0\x16\xc0\x00\x00\xe0\x946\xd8]\xc3h1V\xe6;\xf8\x80\xa9\xfa\xb7x\x8c\xf8\x14:'\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d46\u07cf\x88<\x12s\xec\x8a\x17\x1fz3\xcf\xd6I\xb1\xfe`u\x89\fRHJ\xc4\x16\x89\x00\x00\xe0\x946\xe1Va\f\xd8\xffd\xe7\x80\u061d\x00T8\\\xa7gU\xaa\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d46\xfe\xc6,,B^!\x9b\x18D\x8a\xd7W\x00\x9d\x8cT\x02o\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d47\x00\xe3\x02t$\xd99\xdb\xde]B\xfbx\xf6\xc4\xdb\xec\x1a\x8f\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d47\x02\xe7\x04\xcc!at9\xadN\xa2zW\x14\xf2\xfd\xa1\xe92\x8965\u026d\xc5\u07a0\x00\x00\u07d47\x035\fMo\xe374,\xdd\xc6[\xf1\xe28k\xf3\xf9\xb2\x89m\x81!\xa1\x94\xd1\x10\x00\x00\xe0\x947\b\xe5\x9d\xe6\xb4\x05P\x88x)\x02\xe0W\x9cr\x01\xa8\xbfP\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d47\x126~^U\xa9mZ\x19\x16\x8fn\xb2\xbc~\x99q\xf8i\x8965\u026d\xc5\u07a0\x00\x00\u07d47\x19Zc]\xccb\xf5jq\x80I\xd4~\x8f\x9f\x96\x83(\x91\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d47'4\x1f&\xc1 \x01\xe3x@^\xe3\x8b-\x84d\xecq@\x89lk\x93[\x8b\xbd@\x00\x00\u07d47.E:kb\x9f'g\x8c\u022e\xb5\xe5|\xe8^\xc0\xae\xf9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d474\xcb\x18t\x91\xed\xe7\x13\xae[;-\x12(J\xf4k\x81\x01\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d477!n\xe9\x1f\x17w2\xfbX\xfa@\x97&r\a\xe2\xcfU\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d47M;\xbb\x057Q\xf9\xf6\x8d\xdb\a\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d48r\xf4\x8d\xc5\xe3\xf8\x17\xbck*\xd2\xd00\xfc^\x04q\x19=\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d48~\xea\xfdk@\t\u07af\x8b\u0578Zr\x98:\x8d\xcc4\x87\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d48\x81\xde\xfa\xe1\xc0{<\xe0Lx\xab\xe2k\f\u070ds\xf0\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d48\x83\xbe\xcc\b\xb9\xbeh\xad;\b6\xaa\u00f6 \xdc\x00\x17\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d48\x85\xfe\xe6q\a\xdc:\xa9\x8a\x1d\x99:t\xdf\\\xd7T\xb9\x8dR\x9a\x89a\t=|,m8\x00\x00\u07d48\xe4m\xe4E<8\xe9A\xe7\x93\x0fC0O\x94\xbb{+\xe8\x89l\xb7\xe7Hg\xd5\xe6\x00\x00\u07d48\xe7\u06e8\xfdO\x1f\x85\r\xbc&I\xd8\xe8O\tR\xe3\xeb<\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d48\xe8\xa3\x1a\xf2\xd2e\xe3\x1a\x9f\xff-\x8fF(m\x12E\xa4g\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d48\xeao[Z{\x88AuQ\xb4\x12=\xc1'\xdf\xe94-\xa6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d48\xee\xc6\xe2\x17\xf4\xd4\x1a\xa9 \xe4$\xb9RQ\x97\x04\x1c\xd4\u0189\xf0\r%\xeb\x92.g\x00\x00\xe0\x948\xf3\x87\xe1\xa4\xedJs\x10n\xf2\xb4b\xe4t\xe2\xe3\x14:\u040a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d49\x11a\xb0\xe4<0 f\u898d,\xe7\xe1\x99\xec\xdb\x1dW\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x949\x15\uad6b.Yw\xd0u\xde\xc4}\x96\xb6\x8bK\\\xf5\x15\x8a\r\a\x01\x81\x85\x12\x0f@\x00\x00\u07d49\x1aw@\\\t\xa7+^\x846#z\xaa\xf9]h\xda\x17\t\x89\x02\xa9&J\xf3\u0479\x00\x00\u07d49\x1f \x17m\x126\rrMQG\n\x90p6uYJM\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d49$3\xd2\u0383\xd3\xfbJv\x02\u0323\xfa\xcaN\xc1@\xa4\xb0\x89\x02\xc3\xc4e\xcaX\xec\x00\x00\xe0\x949?x;\\\u06c6\"\x1b\xf0)O\xb7\x14\x95\x9c{E\x89\x9c\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d49?\xf4%^\\e\x8f.\u007f\x10\xec\xbd)%rg\x1b\xc2\u0489lk\x93[\x8b\xbd@\x00\x00\u07d49A2`\x0fAU\xe0\u007fME\xbc>\xb8\xd9\xfbr\xdc\u05c4\x89\x9fn\x92\xed\xea\a\xd4\x00\x00\u07d49Q\xe4\x8e<\x86\x9ekr\xa1C\xb6\xa4Ph\u0379\xd4f\u0409\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x949T\xbd\xfe\v\xf5\x87\u0195\xa3\x05\xd9$L=[\xdd\xda\u027b\x8a\x04\x10'\x83'\xf9\x85`\x80\x00\u07d49]m%U \xa8\xdb)\xab\xc4}\x83\xa5\u06ca\x1a}\xf0\x87\x89\x05k\xc7^-c\x10\x00\x00\u07d49ck%\x81\x1b\x17j\xbf\xcf\xee\xcad\xbc\x87E/\x1f\xdf\xf4\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d49i\xb4\xf7\x1b\xb8u\x1e\xdeC\xc0\x166:zaOv\x11\x8e\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x949x/\xfe\x06\xacx\x82*<:\x8a\xfe0^P\xa5a\x88\u038a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d49zn\xf8v:\x18\xf0\x0f\xac!~\x05\\\r0\x94\x10\x10\x11\x89lk\x93[\x8b\xbd@\x00\x00\u07d49|\u06cc\x80\xc6yP\xb1\x8deB)a\x0e\x93\xbf\xa6\xee\x1a\x89?\x95\xc8\xe0\x82\x15!\x00\x00\u07d49\x82O\x8b\xce\xd1v\xfd>\xa2.\u01a4\x93\xd0\xcc\xc3?\xc1G\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d49\x93l'\x19E\v\x94 \xcc%\"\u03d1\xdb\x01\xf2'\xc1\xc1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d49\x95\xe0\x96\xb0\x8aZrh\x00\xfc\xd1}\x9cd\xc6N\b\x8d+\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d49\x9a\xa6\xf5\xd0x\xcb\tp\x88+\u0259 \x06\xf8\xfb\xdf4q\x8965\u026d\xc5\u07a0\x00\x00\u07d49\xaa\x05\xe5m}28T!\u03d36\xe9\r=\x15\xa9\xf8Y\x89\x01h\u048e?\x00(\x00\x00\u07d49\xaa\xf0\x85M\xb6\xeb9\xbc{.C\x84jv\x17\x1c\x04E\u0789dI\xe8NG\xa8\xa8\x00\x00\u07d49\xb1\xc4q\xae\x94\xe1!dE.\x81\x1f\xbb\xe2\xb3\xcdru\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d49\xb2\x992t\x90\xd7/\x9a\x9e\xdf\xf1\x1b\x83\xaf\xd0\xe9\xd3\xc4P\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d49\xba\u018d\x94xY\xf5\x9e\x92&\b\x9c\x96\xd6.\x9f\xbe<\u0789\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x949\xbf\xd9xh\x9b\xec\x04\x8f\xc7v\xaa\x15$\u007f^\x1d|9\xa2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d49\xc7s6|\x88%\xd3YlhoB\xbf\r\x141\x9e?\x84\x89\a?u\u0460\x85\xba\x00\x00\u07d49\u05291@,\fy\xc4W\x18o$\u07c7)\u03d5p1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d49\xd6\xca\xca\"\xbc\xcdjr\xf8~\xe7\u05b5\x9e\v\xde!\xd7\x19\x89l\x87T\xc8\xf3\f\b\x00\x00\u07d49\xe0\xdbM`V\x8c\x80\v\x8cU\x00\x02l%\x94\xf5v\x89`\x8965\u026d\xc5\u07a0\x00\x00\xe0\x949\xeeO\xe0\x0f\xbc\xeddph\xd4\xf5|\x01\xcb\"\xa8\v\xcc\u044a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d49\xf1\x983\x1eK!\xc1\xb7`\xa3\x15_J\xb2\xfe\x00\xa7F\x19\x89lk\x93[\x8b\xbd@\x00\x00\u07d49\xf4Fc\xd9%a\t\x1b\x82\xa7\r\xcfY=u@\x05\x97:\x89\n\u05cb.\xdc!Y\x80\x00\u07d4:\x03U\x94\xc7GGmB\xd1\xee\x96l6\"L\xdd\"I\x93\x89\x13J\xf7Ei\xf9\xc5\x00\x00\u07d4:\x04W(G\xd3\x1e\x81\xf7v\\\xa5\xbf\xc9\xd5W\x15\x9f6\x83\x89\a6-\r\xab\xea\xfd\x80\x00\xe0\x94:\x06\xe3\xbb\x1e\xdc\xfd\fD\xc3\aM\xe0\xbb`k\x04\x98\x94\xa2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794:\x10\x88\x8b~\x14\x9c\xae',\x010,2}\n\xf0\x1a\v$\x88\xeb\xec!\xee\x1d\xa4\x00\x00\u07d4:1\b\xc1\u6023;3l!\x13\x134@\x9d\x97\xe5\xad\xec\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4:6\x8e\xfeJ\u05c6\xe2c\x95\xec\x9f\u01adi\x8c\xae)\xfe\x01\x89\"E\x89\x96u\xf9\xf4\x00\x00\u07d4:=\xd1\x04\xcd~\xb0O!\x93/\xd43\xeaz\xff\u04d3i\xf5\x89\x13aO#\xe2B&\x00\x00\u07d4:B\x97\xda\xc4.\x1eO\xb8\xcb1\xec\xddC\xaew<\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94:\x99`&m\xf6I cS\x8a\x99\xf4\x87\xc9P\xa3\xa5\uc78a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4:\x9b\x11\x10)\xce\x1f \xc9\x10\x9czt\xee\xee\xf3OO.\xb2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4:\x9eTA\xd4K$;\xe5[u\x02z\x1c\ub7ac\xf5\r\xf2\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94:\xa0z4\xa1\xaf\u0216}=\x13\x83\xb9kb\u03d6\xd5\xfa\x90\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94:\xa4,!\xb9\xb3\x1c>'\xcc\xd1~\t\x9a\xf6y\xcd\xf5i\a\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4:\xa9H\xea\x029wU\xef\xfb/\x9d\xc99-\xf1\x05\x8f~3\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4:\xad\xf9\x8ba\xe5\u0216\xe7\xd1\x00\xa39\x1d2P\"]a\u07c9\f\xafg\x007\x01h\x00\x00\u07d4:\xaeHr\xfd\x90\x93\xcb\xca\xd1@o\x1e\x80x\xba\xb5\x03Y\xe2\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4:\xbb\x8a\xdf\xc6\x04\xf4\x8dY\x84\x81\x1d\u007f\x1dR\xfe\xf6u\x82p\x89\xf2\x97\x19\xb6o\x11\f\x00\x00\u07d4:\xc2\xf0\xff\x16\x12\xe4\xa1\xc3F\xd53\x82\xab\xf6\u0622[\xaaS\x89lk\x93[\x8b\xbd@\x00\x00\u07d4:\xc9\xdczCj\xe9\x8f\xd0\x1cz\x96!\xaa\x8e\x9d\v\x8bS\x1d\x89a\t=|,m8\x00\x00\xe0\x94:\xd0aI\xb2\x1cU\xff\x86|\xc3\xfb\x97@\u04bc\xc7\x10\x121\x8a)\xb7d2\xb9DQ \x00\x00\u07d4:\xd7\x02C\u060b\xf0@\x0fW\xc8\xc1\xfdW\x81\x18H\xaf\x16*\x89.\x9e\xe5\u00c6S\xf0\x00\x00\u07d4:\xd9\x15\xd5P\xb7#AV \xf5\xa9\xb5\xb8\x8a\x85\xf3\x82\xf05\x8965\u026d\xc5\u07a0\x00\x00\u07d4:\xe1`\xe3\xcd`\xae1\xb9\xd6t-h\xe1Nv\xbd\x96\xc5\x17\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4:\xe6+\xd2q\xa7`c\u007f\xady\xc3\x1c\x94\xffb\xb4\xcd\x12\xf7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4:\xeaN\x82\xd2@\x02H\xf9\x98q\xa4\x1c\xa2W\x06\r:\"\x1b\x8965\u026d\xc5\u07a0\x00\x00\u07d4:\xf6[>(\x89ZJ\x00\x11S9\x1d\x1ei\xc3\x1f\xb9\xdb9\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4;\a\xdbZ5\u007fZ\xf2HL\xbc\x9dw\xd7;\x1f\xd0Q\x9f\u01c9\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4;\n\u032fK`|\xfea\xd1s4\xc2\x14\xb7\\\xde\xfd\xbd\x89\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\x13c\x1a\x1b\x89\xcbVeH\x89\x9a\x1d`\x91\\\xdc\xc4 [\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\x15\x90\x99\aR\a\u0180vc\xb1\xf0\xf7\xed\xa5J\xc8\xcc\xe3\x89j\xc4\xe6[i\xf9-\x80\x00\u07d4;\x197\xd5\u74f8\x9bc\xfb\x8e\xb5\xf1\xb1\xc9\xcak\xa0\xfa\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\"\xda*\x02q\xc8\xef\xe1\x02S'scji\xb1\xc1~\t\x89\x1b6\xa6DJ>\x18\x00\x00\u07d4;\"\u07a3\xc2_\x1bY\u01fd'\xbb\x91\u04e3\xea\xec\xef9\x84\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94;#g\xf8IK_\xe1\x8dh<\x05]\x89\x99\x9c\x9f=\x1b4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4;,E\x99\x0e!GDQ\xcfOY\xf0\x19U\xb31\xc7\xd7\u0249lk\x93[\x8b\xbd@\x00\x00\xe0\x94;A\x00\xe3\ns\xb0\xc74\xb1\x8f\xfa\x84&\u045b\x191/\x1a\x8a\v\xb5\u046ap\n\xfd\x90\x00\x00\u07d4;B\xa6m\x97\x9fX(4tz\x8b`B\x8e\x9bN\xec\xcd#\x89!\xa1\u01d0\xfa\xdcX\x00\x00\u07d4;Gh\xfdq\xe2\xdb,\xbe\u007f\xa0PH<'\xb4\xeb\x93\x1d\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;Vj\x8a\xfa\u0456\x82\xdc,\xe8g\x9a<\xe4D\xa5\xb0\xfdO\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94;\\%\x1d\u007f\u05c9;\xa2\t\xfeT\x1c\xec\xd0\xce%:\x99\r\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4;^\x8b\x17w\xca\x18A\x896\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94;\x93\xb1a6\xf1\x1e\xaf\x10\x99l\x95\x99\r;'9\xcc\xea_\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4;\xabK\x01\xa7\xc8K\xa1?\uea70\xbb\x19\x1bw\xa3\xaa\u0723\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4;\xb55\x98\xcc \xe2\x05]\xc5S\xb0I@J\u0277\xdd\x1e\x83\x89!W\x1d\xf7|\x00\xbe\x00\x00\u07d4;\xbc\x13\xd0J\xcc\xc0pz\xeb\u072e\xf0\x87\u0438~\v^\u327e\xd1\xd0&=\x9f\x00\x00\x00\u07d4;\xc6\xe3\xeezV\u038f\x14\xa3u2Y\x0fcqk\x99f\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\xc8]ls[\x9c\xdaK\xba_H\xb2K\x13\xe7\x0600{\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4;\xd6$\xb5H\xcbe\x976\x90~\u062a<\fp^$\xb5u\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\u0660m\x1b\xd3lN\xdd'\xfc\r\x1f[\b\x8d\xda\xe3\xc7*\x89\x1b\x1azB\v\xa0\r\x00\x00\u0794;\u077c\x814\xf7}UY\u007f\xc9|&\xd2f\x98\t\x06\x04\ub23e -j\x0e\xda\x00\x00\xe0\x94;\xf8n\u0623\x15>\xc93xj\x02\xac\t\x03\x01\x85^Wk\x8a_J\x8c\x83u\xd1U@\x00\x00\u07d4;\xfb\u04c4|\x17\xa6\x1c\xf3\xf1{R\xf8\ub879`\xb3\U000df262\xa1]\tQ\x9b\xe0\x00\x00\u07d4<\x03\xbb\xc0#\xe1\xe9?\xa3\xa3\xa6\xe4(\xcf\f\xd8\xf9^\x1e\u0189Rf<\u02b1\xe1\xc0\x00\x00\u07d4<\f=\ufb1c\xeaz\xcc1\x9a\x96\xc3\v\x8e\x1f\xed\xabEt\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4<\x15\xb3Q\x1d\xf6\xf04.sH\u0309\xaf9\xa1h\xb7s\x0f\x8965\u026d\xc5\u07a0\x00\x00\u07d4<\x1f\x91\xf3\x01\xf4\xb5e\xbc\xa2GQ\xaa\x1fv\x13\"p\x9d\u0749a\t=|,m8\x00\x00\xe0\x94<(l\xfb0\x14n_\u05d0\xc2\xc8T\x15RW\x8d\xe34\u060a\x02)\x1b\x11\xaa0n\x8c\x00\x00\u07d4<2.a\x1f\u06c2\rG\xc6\xf8\xfcd\xb6\xfa\xd7L\xa9_^\x89\r%\x8e\xce\x1b\x13\x15\x00\x00\u07d4\xa5\xe5\xbfb\xbb\u0309\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4<\x86\x9c\tie#\xce\xd8$\xa0pAF\x05\xbbv#\x1f\xf2\x8965\u026d\xc5\u07a0\x00\x00\u07d4<\x92V\x19\u02731DF?\x057\u06165\x87\x06\xc5 \xb0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4<\x98YK\xf6\x8bW5\x1e\x88\x14\xae\x9em\xfd-%J\xa0o\x89\x10CV\x1a\x88)0\x00\x00\u07d4<\xad\xeb=>\xed?b1\x1dRU>p\xdfJ\xfc\xe5o#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94<\xae\xdbS\x19\xfe\x80eC\xc5nP!\xd3r\xf7\x1b\xe9\x06.\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4<\xaf\xaf^bPV\x15\x06\x8a\xf8\xeb\"\xa1:\u0629\xe5Pp\x89lf\x06E\xaaG\x18\x00\x00\u07d4<\xb1y\xcbH\x01\xa9\x9b\x95\u00f0\xc3$\xa2\xbd\xc1\x01\xa6S`\x89\x01h\u048e?\x00(\x00\x00\u07d4<\xb5a\u0386BK5\x98\x91\xe3d\xec\x92_\xfe\xff'}\xf7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4<\xcbq\xaah\x80\xcb\v\x84\x01-\x90\xe6\a@\xec\x06\xac\u05cf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4<\xce\xf8\x86yW9G\xe9I\x97y\x8a\x1e2~\b`:e\x89+\xc9\x16\u059f;\x02\x00\x00\xe0\x94<\xd1\xd9s\x1b\xd5H\xc1\xddo\u03a6\x1b\xebu\xd9\x17T\xf7\u04ca\x01\x16\x1d\x01\xb2\x15\xca\xe4\x80\x00\u07d4<\u04e6\xe95y\xc5mIAq\xfcS>z\x90\xe6\xf5\x94d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4<\u05b7Y<\xbe\xe7x0\xa8\xb1\x9d\b\x01\x95\x8f\xcdK\xc5z\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4<\xd7\xf7\xc7\xc257\x80\xcd\xe0\x81\xee\xecE\x82+%\xf2\x86\f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4<\xe1\u0717\xfc\u05f7\xc4\u04e1\x8aI\xd6\xf2\xa5\xc1\xb1\xa9\x06\u05c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4<\xea0*G*\x94\x03y\xdd9\x8a$\xea\xfd\xba\u07c8\xady\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94<\xec\xa9k\xb1\xcd\xc2\x14\x02\x9c\xbc^\x18\x1d9\x8a\xb9M=A\x8a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4<\xf4\x84RO\xbd\xfa\xda\xe2m\xc1\x85\xe3++c\x0f\xd2\xe7&\x89\x18TR\xcb*\x91\xc3\x00\x00\u07d4<\xf9\xa1\xd4e\xe7\x8bp9\xe3iDx\xe2b{6\xfc\xd1A\x89J`S*\xd5\x1b\xf0\x00\x00\u07d4<\xfb\xf0fVYpc\x9e\x13\r\xf2\xa7\xd1k\x0e\x14\xd6\t\x1c\x89\\(=A\x03\x94\x10\x00\x00\xe0\x94=\th\x8d\x93\xad\a\xf3\xab\xe6\x8cr'#\xcdh\t\x90C^\x8a\x06ZL\xe9\x9fv\x9en\x00\x00\u07d4=1X{_\u0546\x98Ex\x87%\xa6c)\nI\xd3g\x8c\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4=?\xadI\xc9\xe5\xd2u\x9c\x8e\x8eZzM`\xa0\xdd\x13V\x92\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4=WO\xcf\x00\xfa\xe1\u064c\u023f\x9d\u07e1\xb3\x95;\x97A\xbc\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4=Z\x8b+\x80\xbe\x8b5\xd8\xec\xf7\x89\xb5\xedz\au\xc5\al\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4=f\xcdK\xd6M\\\x8c\x1b^\xea(\x1e\x10m\x1cZ\xad#s\x89i\xc4\xf3\xa8\xa1\x10\xa6\x00\x00\u0794=j\xe0S\xfc\xbc1\x8do\xd0\xfb\xc3S\xb8\xbfT.h\r'\x88\xc6s\xce<@\x16\x00\x00\u07d4=o\xf8,\x93w\x05\x9f\xb3\r\x92\x15r?`\xc7u\u0211\xfe\x89\r\x8e\\\xe6\x17\xf2\xd5\x00\x00\u07d4=y\xa8S\xd7\x1b\xe0b\x1bD\xe2\x97Yel\xa0u\xfd\xf4\t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4=~\xa5\xbf\x03R\x81\x00\xed\x8a\xf8\xae\xd2e>\x92\x1bng%\x8965\u026d\xc5\u07a0\x00\x00\u07d4=\x81?\xf2\xb6\xedW\xb97\u06bf+8\x1d\x14\x8aA\x1f\xa0\x85\x89\x05k\xc7^-c\x10\x00\x00\u07d4=\x88\x143\xf0J}\r'\xf8ID\xe0\x8aQ-\xa3UR\x87\x89A\rXj \xa4\xc0\x00\x00\u07d4=\x89\xe5\x05\xcbF\xe2\x11\xa5?2\xf1g\xa8w\xbe\xc8\u007fK\n\x89\x01[5W\xf1\x93\u007f\x80\x00\xe0\x94=\x8d\a#r\x1es\xa6\xc0\xd8`\xaa\x05W\xab\xd1L\x1e\xe3b\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4=\x8f9\x88\x1b\x9e\xdf\xe9\x12'\xc3?\xa4\xcd\xd9\x1eg\x85D\xb0\x89\x04\xab\a\xbaC\xad\xa9\x80\x00\u07d4=\x9dk\xe5\u007f\xf8>\x06Y\x85fO\x12VD\x83\xf2\xe6\x00\xb2\x89n\xac\xe4?#\xbd\x80\x00\x00\u07d4=\xa3\x9c\xe3\xefJz9f\xb3.\xe7\xeaN\xbc#5\xa8\xf1\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4=\xaa\x01\u03b7\x0e\xaf\x95\x91\xfaR\x1b\xa4\xa2~\xa9\xfb\x8e\xdeJ\x89Zc\xd2\u027cvT\x00\x00\u07d4=\xb5\xfejh\xbd6\x12\xac\x15\xa9\x9aa\xe5U\x92\x8e\xec\xea\xf3\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4=\xb9\xed\u007f\x02L~&7/\xea\xcf+\x05\b\x03D^8\x10\x89E\xb1H\xb4\x99j0\x00\x00\u07d4=\xbf\r\xbf\xd7x\x90\x80\x053\xf0\x9d\xea\x83\x01\xb9\xf0%\u04a6\x8965\u026d\xc5\u07a0\x00\x00\u07d4=\xce\U0005c18b\x15\xd3N\xdaBn\xc7\xe0K\x18\xb6\x01p\x02\x89lh\xcc\u041b\x02,\x00\x00\xe0\x94=\xd1.Uj`76\xfe\xbaJo\xa8\xbdJ\xc4]f*\x04\x8a#u{\x91\x83\xe0x(\x00\x00\u07d4=\u078b\x15\xb3\u033a\xa5x\x01\x12\xc3\xd6t\xf3\x13\xbb\xa6\x80&\x89`\x1dQZ>O\x94\x00\x00\xe0\x94=\xde\xdb\xe4\x89#\xfb\xf9\xe56\xbf\x9f\xfb\aG\xc9\xcd\u04de\xef\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4=\xea\xe43'\x91?b\x80\x8f\xaa\x1bbv\xa2\xbdch\xea\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4=\xf7b\x04\x9e\u068a\u0192}\x90Lz\xf4/\x94\xe5Q\x96\x01\x89lk\x93[\x8b\xbd@\x00\x00\u07d4>\x04\r@\u02c0\xba\x01%\xf3\xb1_\xde\xfc\xc8?0\x05\xda\x1b\x898E$\xccp\xb7x\x00\x00\u07d4>\v\x8e\xd8n\xd6i\xe1'#\xafur\xfb\xac\xfe\x82\x9b\x1e\x16\x89QM\xe7\xf9\xb8\x12\xdc\x00\x00\xe0\x94>\f\xbejm\xcba\xf1\x10\xc4[\xa2\xaa6\x1d\u007f\xca\xd3\xdas\x8a\x01\xb2\u07dd!\x9fW\x98\x00\x00\u07d4>\x19KN\xce\xf8\xbbq\x1e\xa2\xff$\xfe\xc4\xe8{\xd02\xf7\u0449\x8b\x9d\xc1\xbc\x1a\x03j\x80\x00\xe0\x94>\x1b\"0\xaf\xbb\xd3\x10\xb4\x92jLwmZ\u705cf\x1d\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4>\x1cS0\x0eL\x16\x89\x12\x16<~\x99\xb9]\xa2h\xad(\n\x896b2\\\u044f\xe0\x00\x00\u07d4>\x1c\x96 c\xe0\xd5)YA\xf2\x10\u0723\xabS\x1e\xec\x88\t\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4>,\xa0\xd24\xba\xf6\a\xadFj\x1b\x85\xf4\xa6H\x8e\xf0\n\xe7\x89\x04\xda!\xa3H=V\x80\x00\u07d4>/&#^\x13zs$\xe4\xdc\x15K]\xf5\xafF\xea\x1aI\x89\x017\xaa\xd8\x03-\xb9\x00\x00\xe0\x94>1a\xf1\xea/\xbf\x12ny\xda\x18\x01\u0695\x12\xb3y\x88\u024a\nm\xd9\f\xaeQ\x14H\x00\x00\xe0\x94>6\xc1rS\xc1\x1c\xf3\x89t\xed\r\xb1\xb7Y\x16\r\xa67\x83\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4><\u04fe\xc0e\x91\xd64o%Kb\x1e\xb4\x1c\x89\x00\x8d1\x895\u07fe\u069f74\x00\x00\u07d4>E\xbdU\u06d0`\xec\xed\x92;\xb9\xcbs<\xb3W?\xb51\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4>M\x13\xc5Z\x84\xe4n\xd7\xe9\u02d0\xfd5^\x8a\u0651\u33c965\u026d\xc5\u07a0\x00\x00\u07d4>N\x92e\"<\x9782L\xf2\v\xd0`\x06\xd0\a>\u06cc\x89\a?u\u0460\x85\xba\x00\x00\xe0\x94>O\xbdf\x10\x15\xf6F\x1e\xd6s\\\xef\xef\x01\xf3\x14E\xde:\x8a\x03n4)\x98\xb8\xb0 \x00\x00\xe0\x94>S\xff!\a\xa8\u07be3(I:\x92\xa5\x86\xa7\xe1\xf4\x97X\x8a\x04\xe6\x9c*q\xa4\x05\xab\x00\x00\u07d4>Z9\xfd\xdap\xdf\x11&\xab\r\u011asx1\x1aSz\x1f\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\xe0\x94>Z\xbd\t\xceZ\xf7\xba\x84\x87\xc3Y\xe0\xf2\xa9:\x98k\v\x18\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4>\\\xb8\x92\x8cAx%\xc0:;\xfc\xc5!\x83\xe5\xc9\x1eB\u05c9\xe71\xd9\xc5,\x96/\x00\x00\u07d4>^\x93\xfbL\x9c\x9d\x12F\xf8\xf2G5\x8e\"\xc3\xc5\xd1{j\x89\b!\xab\rD\x14\x98\x00\x00\u07d4>a\x83P\xfa\x01ez\xb0\xef>\xba\xc8\xe3p\x12\xf8\xfc+o\x89\x98\x06\xde=\xa6\xe9x\x00\x00\u07d4>c\xce;$\xca(e\xb4\u0166\x87\xb7\xae\xa3Y~\xf6\xe5H\x89lk\x93[\x8b\xbd@\x00\x00\u07d4>f\xb8GiVj\xb6yE\xd5\xfa\x8175V\xbc\u00e1\xfa\x89\b=lz\xabc`\x00\x00\xe0\x94>v\xa6-\xb1\x87\xaat\xf68\x17S;0l\xea\xd0\xe8\u03be\x8a\x06\x9bZ\xfa\xc7P\xbb\x80\x00\x00\u07d4>z\x96k]\xc3W\xff\xb0~\x9f\xe0g\xc4W\x91\xfd\x8e0I\x89\x034-`\xdf\xf1\x96\x00\x00\xe0\x94>\x81w!u#~\xb4\xcb\xe0\xfe-\xca\xfd\xad\xff\xebj\x19\x99\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4>\x83I\xb6\u007fWED\x9fe\x93g\u066dG\x12\xdb[\x89Z\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4>\x83TO\x00\x82U%r\u01c2\xbe\xe5\xd2\x18\xf1\xef\x06J\x9d\x89\x05l\xd5_\xc6M\xfe\x00\x00\u07d4>\x84\xb3\\[\"ePpa\xd3\vo\x12\xda\x03?\xe6\xf8\xb9\x89a\t=|,m8\x00\x00\u07d4>\x86A\xd4\x87E\xba2/_\xd6\xcbP\x12N\xc4f\x88\u01e6\x9a\u007f\xae\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\u07d4>\x91N0\x18\xac\x00D\x93A\u011d\xa7\x1d\x04\xdf\xee\xedb!\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4>\x94\x10\u04f9\xa8~\xd5\xe4Q\xa6\xb9\x1b\xb8\x92?\xe9\x0f\xb2\xb5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4>\x94\xdfS\x13\xfaR\x05p\xef#+\xc31\x1d_b/\xf1\x83\x89lk\x93[\x8b\xbd@\x00\x00\u0794>\x9b4\xa5\u007f3u\xaeY\xc0\xa7^\x19\u0136A\"\x8d\x97\x00\x88\xf8i\x93)g~\x00\x00\u07d4>\xad\xa8\xc9/V\x06~\x1b\xb7<\xe3x\xdaV\xdc,\xdf\xd3e\x89w\xcd\xe9:\xeb\rH\x00\x00\xe0\x94>\xaf\by\xb5\xb6\xdb\x15\x9bX\x9f\x84W\x8bjt\xf6\xc1\x03W\x8a\x01\x898\xb6q\xfae\xa2\x80\x00\u07d4>\xaf1k\x87a]\x88\xf7\xad\xc7|X\xe7\x12\xedMw\x96k\x89\x05m\xbcL\xee$d\x80\x00\u07d4>\xb8\xb3;!\xd2<\u0686\xd8(\x88\x84\xabG\x0e\x16F\x91\xb5\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4>\xb9\xef\x06\xd0\xc2Y\x04\x03\x19\x94~\x8czh\x12\xaa\x02S\u0609\t\r\x97/22<\x00\x00\u07d4>\u030e\x16h\xdd\xe9\x95\xdcW\x0f\xe4\x14\xf4B\x11\xc54\xa6\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4>\u03752\xe3\x97W\x96b\xb2\xa4aA\u73c25\x93j_\x89\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\u07d4>\xeeo\x1e\x966\vv\x89\xb3\x06\x9a\xda\xf9\xaf\x8e\xb6\f\u404965\u026d\xc5\u07a0\x00\x00\xe0\x94?\b\u066d\x89O\x81>\x8e!H\xc1`\xd2K5:\x8et\xb0\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4?\f\x83\xaa\xc5qybsN\\\xea\xea\xec\u04db(\xad\x06\xbe\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94?\x10\x80\x02\x82\u0477\xdd\u01cf\xa9-\x820\aN\x1b\xf6\xae\xae\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\u07d4?\x123qO M\xe9\xdeN\xe9m\a;6\x8d\x81\x97\x98\x9f\x89\x02\x17\xc4\x10t\xe6\xbb\x00\x00\u07d4?\x17:\xa6\xed\xf4i\u0445\xe5\x9b\xd2j\xe4#k\x92\xb4\xd8\xe1\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4?\x1b\xc4 \xc5<\x00,\x9e\x90\x03|D\xfej\x8e\xf4\xdd\xc9b\x89\t`\xdbwh\x1e\x94\x00\x00\u07d4?#a\b\xee\xc7\"\x89\xba\u00e6\\\u0483\xf9^\x04\x1d\x14L\x8964\xbf9\xab\x98x\x80\x00\u07d4?-\xa0\x93\xbb\x16\xeb\x06O\x8b\xfa\x9e0\xb9)\xd1_\x8e\x1cL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4?-\xd5]\xb7\xea\xb0\xeb\xeee\xb3>\xd8 ,\x1e\x99.\x95\x8b\x89,s\xc97t,P\x00\x00\u07d4?/8\x14\x91y|\xc5\xc0\u0502\x96\xc1O\xd0\xcd\x00\xcd\xfa-\x89+\x95\xbd\xcc9\xb6\x10\x00\x00\u07d4?0\u04fc\x9f`\"2\xbcrB\x88\xcaF\xcd\v\a\x88\xf7\x15\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4?<\x8ea\xe5`L\xef\x06\x05\xd46\xdd\"\xac\u0346\"\x17\xfc\x89Hz\x9a0E9D\x00\x00\u07d4??F\xb7\\\xab\xe3{\xfa\u0307`(\x1fCA\xca\u007fF=\x89 \xacD\x825\xfa\xe8\x80\x00\u07d4?G)c\x19x\x83\xbb\xdaZ\x9b}\xfc\xb2-\xb1\x14@\xad1\x89\x1a\x19d<\xb1\xef\xf0\x80\x00\u07d4?L\xd19\x9f\x8a4\xed\u06da\x17\xa4q\xfc\x92+Xp\xaa\xfc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4?U\x1b\xa9<\xd5F\x93\xc1\x83\xfb\x9a\xd6\re\xe1`\x96s\u0249lk\x93[\x8b\xbd@\x00\x00\xe0\x94?bzv\x9ej\x95\x0e\xb8p\x17\xa7\u035c\xa2\bq\x13h1\x8a\x02\ub3b1\xa1r\u0738\x00\x00\u07d4?m\xd3e\x0e\xe4(\u0737u\x95S\xb0\x17\xa9j\x94(j\u0249Hz\x9a0E9D\x00\x00\u07d4?tr7\x80o\xed?\x82\x8ahR\xeb\bg\xf7\x90'\xaf\x89\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4?u\xaea\xcc\x1d\x80Be;[\xae\xc4D>\x05\x1c^z\xbd\x89\x05-T(\x04\xf1\xce\x00\x00\u07d4?\xb7\u0457\xb3\xbaO\xe0E\xef\xc2=P\xa1E\x85\xf5X\u0672\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94?\xbc\x1eE\x18\xd74\x00\xc6\xd0F5\x949\xfbh\xea\x1aI\xf4\x8a\x03y\v\xb8U\x13v@\x00\x00\u07d4?\xbe\xd6\xe7\xe0\u029c\x84\xfb\xe9\xeb\u03ddN\xf9\xbbIB\x81e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4?\u043bGy\x8c\xf4L\u07feM3=\xe67\xdfJ\x00\xe4\\\x89\x05lUy\xf7\"\x14\x00\x00\xe0\x94?\xe4\x0f\xbd\x91\x9a\xad(\x18\xdf\x01\xeeM\xf4lF\x84*\xc59\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4?\xe8\x01\xe6\x135\xc5\x14\r\xc7\xed\xa2\xefR\x04F\nP\x120\x89lk\x93[\x8b\xbd@\x00\x00\u07d4?\xf86\xb6\xf5{\x90\x1bD\f0\xe4\xdb\xd0e\xcf7\xd3\u050c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4?\xfc\xb8p\xd4\x02=%]Qg\u0625\a\xce\xfc6kh\xba\x89#4^\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4@s\xfaI\xb8q\x17\u02d0\x8c\xf1\xabQ-\xa7T\xa92\xd4w\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4@\x8ai\xa4\a\x15\xe1\xb3\x13\xe15N`\b\x00\xa1\xe6\xdc\x02\xa5\x89\x01\u7e11\u0312T\x00\x00\u07d4@\x9b\xd7P\x85\x82\x1c\x1d\xe7\f\xdc;\x11\xff\xc3\xd9#\xc7@\x10\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4@\x9dZ\x96.\xde\uefa1x\x01\x8c\x0f8\xb9\u0372\x13\xf2\x89\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4@\xa31\x19[\x97s%\u00aa(\xfa/B\xcb%\xec<%<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4@\xa7\xf7(g\xa7\u0706w\v\x16+uW\xa44\xedP\xcc\xe9\x8965\u026d\xc5\u07a0\x00\x00\u07d4@\xab\n>\x83\xd0\u022c\x93f\x91\x05 \xea\xb1w+\xac;\x1a\x894\xf1\f-\xc0^|\x00\x00\u07d4@\xabf\xfe!>\xa5l:\xfb\x12\xc7[\xe3?\x8e2\xfd\b]\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94@\xadt\xbc\v\xce*E\xe5/6\xc3\u07bb\x1b:\xda\x1bv\x19\x8a\x01p\x16-\xe1\t\xc6X\x00\x00\u07d4@\u03c9\x05\x91\xea\u484f\x81*)T\xcb)_c3'\xe6\x89\x02\x9b\xf76\xfcY\x1a\x00\x00\u07d4@\u03d0\xef[v\x8c]\xa5\x85\x00,\xcb\xe6avP\xd8\xe87\x8963\x03\"\xd5#\x8c\x00\x00\xe0\x94@\xd4]\x9dv%\xd1QV\xc92\xb7q\xca{\x05'\x13\tX\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4@\xdb\x1b\xa5\x85\xce4S\x1e\xde\xc5IHI9\x13\x81\xe6\xcc\u04c9a\t=|,m8\x00\x00\xe0\x94@\xdfI^\xcf?\x8bL\xef*l\x18\x99W$\x8f\u813c+\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4@\xe0\xdb\xf3\xef\uf404\xea\x1c\xd7\xe5\x03\xf4\v;J\x84C\xf6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4@\xe2D\n\xe1B\u02006j\x12\xc6\xd4\x10/K\x844\xb6*\x8965\u026d\xc5\u07a0\x00\x00\u07d4@\xe3\u0083\xf7\xe2M\xe0A\f\x12\x1b\xee`\xa5`\u007f>)\xa6\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94@\xeaPD\xb2\x04\xb20v\xb1\xa5\x80;\xf1\xd3\f\x0f\x88\x87\x1a\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94@\xed\xdbD\x8di\x0e\xd7.\x05\xc2%\xd3O\xc85\x0f\xa1\xe4\u014a\x01{x\x83\xc0i\x16`\x00\x00\xe0\x94@\xf4\xf4\xc0ls,\xd3[\x11\x9b\x89;\x12~}\x9d\aq\xe4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4A\x01\x0f\u023a\xf8C}\x17\xa0Ci\x80\x9a\x16\x8a\x17\xcaV\xfb\x89\x05k\xc7^-c\x10\x00\x00\u07d4A\x03)\x96q\xd4gc\x97\x8f\xa4\xaa\x19\xee4\xb1\xfc\x95'\x84\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4A\x03<\x1bm\x05\xe1\u0289\xb0\x94\x8f\xc6DS\xfb\xe8z\xb2^\x89Hz\x9a0E9D\x00\x00\u07d4A\t\x8a\x81E#\x17\xc1\x9e>\xef\v\xd1#\xbb\xe1x\xe9\xe9\u0289\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4A\x16\x10\xb1x\xd5a}\xfa\xb94\u0493\xf5\x12\xa9>\\\x10\xe1\x89\t79SM(h\x00\x00\u07d4A\x1c\x83\x1c\xc6\xf4O\x19e\xecWW\xabN[<\xa4\xcf\xfd\x1f\x89\x17\n\x0fP@\xe5\x04\x00\x00\xe0\x94A*h\xf6\xc6EU\x9c\xc9w\xfcId\x04z \x1d\x1b\xb0\xe2\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4A?K\x02f\x9c\xcf\xf6\x80k\xc8&\xfc\xb7\xde\xca;\x0e\xa9\xbc\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4AE\x99\t.\x87\x9a\xe2Sr\xa8MsZ\xf5\xc4\xe5\x10\xcdm\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4AHV\x12\xd04F\xecL\x05\xe5$NV?\x1c\xba\xe0\xf1\x97\x894\x95tD\xb8@\xe8\x00\x00\u07d4A]\tj\xb0b\x93\x18?<\x03=%\xf6\xcfqx\xac;\u01c9\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4Af\xfc\b\u0285\xf7f\xfd\xe81F\x0e\x9d\xc9<\x0e!\xaal\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94Ag\x84\xaf`\x960\xb0p\u051a\x8b\xcd\x12#\\d(\xa4\b\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Ag\xcdH\xe73A\x8e\x8f\x99\xff\xd14\x12\x1cJJ\xb2x\u0109\xc5S%\xcat\x15\xe0\x00\x00\u07d4Al\x86\xb7 \x83\xd1\xf8\x90}\x84\xef\xd2\xd2\u05c3\xdf\xfa>\xfb\x89lj\xccg\u05f1\xd4\x00\x00\u07d4AsA\x9d\\\x9fc)U\x1d\xc4\xd3\xd0\u03ac\x1bp\x1b\x86\x9e\x89\x04\xc5>\xcd\xc1\x8a`\x00\x00\u07d4At\xfa\x1b\xc1*;q\x83\u02eb\xb7z\vYU{\xa5\xf1\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4Axj\x10\xd4G\xf4\x84\xd32D\u0337\xfa\u034bB{[\x8c\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94Az<\u0454\x96S\nmB\x04\u00f5\xa1|\xe0\xf2\a\xb1\xa5\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4A~N&\x88\xb1\xfdf\xd8!R\x9eF\xedOB\xf8\xb3\xdb=\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94A\x9aq\xa3l\x11\xd1\x05\xe0\xf2\xae\xf5\xa3\xe5\x98\a\x8e\x85\xc8\v\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94A\x9b\xdes\x16\xcc\x1e\u0495\u0205\xac\xe3B\u01db\xf7\xee3\xea\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4A\xa2\xf2\xe6\xec\xb8c\x94\xec\x0e3\x8c\x0f\xc9~\x9cU\x83\xde\u0489l\xee\x06\u077e\x15\xec\x00\x00\u07d4A\xa8\u0083\x00\x81\xb1\x02\xdfn\x011e|\a\xabc[T\u0389lj\xccg\u05f1\xd4\x00\x00\u07d4A\xa8\xe26\xa3\x0emc\xc1\xffdM\x13*\xa2\\\x89S~\x01\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4A\xa9\xa4\x04\xfc\x9f[\xfe\xe4\x8e\xc2e\xb1%#3\x8e)\xa8\xbf\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4A\xad6\x9fu\x8f\xef8\xa1\x9a\xa3\x14\x93y\x83,\x81\x8e\xf2\xa0\x8966\x9e\xd7t}&\x00\x00\u07d4A\xb2\xd3O\xde\v\x10)&+Ar\xc8\x1c\x15\x90@[\x03\xae\x8965\u026d\xc5\u07a0\x00\x00\u07d4A\xb2\xdb\u05dd\u069b\x86Ojp0'T\x19\u00dd>\xfd;\x89\xadx\xeb\u016cb\x00\x00\x00\u07d4A\xc3\xc26u4\xd1;\xa2\xb3?\x18\\\xdb\xe6\xacC\xc2\xfa1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4A\u02d8\x96D_p\xa1\n\x14!R\x96\xda\xf6\x14\xe3,\xf4\u0549g\x8a\x93 b\xe4\x18\x00\x00\u07d4A\xcey\x95\t5\xcf\xf5[\xf7\x8eL\xce\xc2\xfec\x17\x85\u06d5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4A\u04f71\xa3&\xe7hX\xba\xa5\xf4\xbd\x89\xb5{6\x93#C\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\xe0\x94A\xe4\xa2\x02u\xe3\x9b\xdc\xef\xebe\\\x03\"tKvQ@\u008a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4A\xed-\x8ep\x81H,\x91\x9f\xc2=\x8f\x00\x91\xb3\xc8,F\x85\x89F:\x1ev[\u05ca\x00\x00\xe0\x94A\xf2~tK\u049d\xe2\xb0Y\x8f\x02\xa0\xbb\x9f\x98\xe6\x81\ua90a\x01\xa4\xab\xa2%\xc2\a@\x00\x00\u07d4A\xf4\x89\xa1\xect{\u009c>_\x9d\x8d\xb9xw\xd4\u0474\xe9\x89\a?u\u0460\x85\xba\x00\x00\u07d4B\x0f\xb8n}+Q@\x1f\xc5\xe8\xc7 \x15\xde\xcbN\xf8\xfc.\x8965\u026d\xc5\u07a0\x00\x00\u07d4B\x16\x84\xba\xa9\xc0\xb4\xb5\xf5S8\xe6\xf6\xe7\xc8\xe1F\xd4\x1c\xb7\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4B9\x96Y\xac\xa6\xa5\xa8c\xea\"E\xc93\xfe\x9a5\xb7\x88\x0e\x89n\xce2\xc2l\x82p\x00\x00\xe0\x94B;\xcaG\xab\xc0\fpW\xe3\xad4\xfc\xa6>7_\xbd\x8bJ\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4B<1\a\xf4\xba\xceANI\x9cd9\nQ\xf7F\x15\xca^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4B<\xc4YL\xf4\xab\xb66\x8d\xe5\x9f\u04b1#\a4a!C\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94BD\xf13\x11X\xb9\xce&\xbb\xe0\xb9#k\x92\x03\xca5\x144\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794BQw\xebt\xad\n\x9d\x9aWR\"\x81G\xeemcV\xa6\u6239\x8b\xc8)\xa6\xf9\x00\x00\u07d4BW%\xc0\xf0\x8f\b\x11\xf5\xf0\x06\xee\xc9\x1c\\\\\x12k\x12\xae\x89\b!\xab\rD\x14\x98\x00\x00\xe0\x94BX\xfdf/\xc4\xce2\x95\xf0\xd4\xed\x8f{\xb1D\x96\x00\xa0\xa9\x8a\x01lE.\xd6\b\x8a\xd8\x00\x00\xe0\x94B\\\x18\x16\x86\x8fww\xcc+\xa6\xc6\u048c\x9e\x1eylR\xb3\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4B\\3\x8a\x13%\xe3\xa1W\x8e\xfa)\x9eW\u0646\xebGO\x81\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94BbY\xb0\xa7Vp\x1a\x8bf5(R!V\xc0(\x8f\x0f$\x8a\x02\x18\xae\x19k\x8dO0\x00\x00\u07d4Bm\x15\xf4\a\xa0\x115\xb1:kr\xf8\xf2R\v51\xe3\x02\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Box\xf7\r\xb2Y\xac\x854\x14[)4\xf4\xef\x10\x98\xb5\u0609\x13\x84\x00\xec\xa3d\xa0\x00\x00\u07d4Bs-\x8e\xf4\x9f\xfd\xa0K\x19x\x0f\xd3\xc1\x84i\xfb7A\x06\x89\x17\v\x00\xe5\u4a7e\x00\x00\u07d4Bt\x17\xbd\x16\xb1\xb3\xd2-\xbb\x90-\x8f\x96W\x01o$\xa6\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Btj\xee\xa1O'\xbe\xff\f\r\xa6BS\xf1\xe7\x97\x18\x90\xa0\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4B{F*\xb8NP\x91\xf4\x8aF\xeb\f\u0712\xdd\xcb&\xe0x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4B~GQ\u00fa\xbex\xcf\xf8\x83\b\x86\xfe\xbc\x10\xf9\x90\x8dt\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94B~\xc6h\xac\x94\x04\xe8\x95\u0306\x15\x11\xd1b\nI\x12\xbe\x98\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4B\x80\xa5\x8f\x8b\xb1\v\x94@\u0794\xf4+OY! \x82\x01\x91\x89lk\x93[\x8b\xbd@\x00\x00\u07d4B\x8a\x1e\xe0\xed3\x1dyR\u033e\x1cyt\xb2\x85+\u0453\x8a\x89w\xb7JN\x8d\xe5e\x00\x00\u0794B\x9c\x06\xb4\x87\xe8Tj\xbd\xfc\x95\x8a%\xa3\xf0\xfb\xa5?o\x00\x88\xbbdJ\xf5B\x19\x80\x00\xe0\x94B\xa9\x8b\xf1`'\xceX\x9cN\xd2\xc9X1\xe2rB\x05\x06N\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4B\xc6\xed\xc5\x15\xd3UW\x80\x8d\x13\xcdD\xdc\xc4@\v%\x04\xe4\x89\n\xba\x14\u015b\xa72\x00\x00\u07d4B\xce\xcf\u0492\x10y\xc2\xd7\xdf?\b\xb0z\xa3\xbe\xee^!\x9a\x8965\u026d\xc5\u07a0\x00\x00\u07d4B\u04669\x9b0\x16\xa8Y\u007f\x8bd\t'\xb8\xaf\xbc\xe4\xb2\x15\x89\xa1\x8b\xce\xc3H\x88\x10\x00\x00\u07d4B\xd3I@\xed\xd2\xe7\x00]F\xe2\x18\x8eL\xfe\u0383\x11\xd7M\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4B\u04e5\xa9\x01\xf2\xf6\xbd\x93V\xf1\x12\xa7\x01\x80\xe5\xa1U\v`\x892$\xf4'#\xd4T\x00\x00\u07d4B\u05b2c\xd9\xe9\xf4\x11lA\x14$\xfc\x99Ux;\xa1\xc5\x1b\x81\x0f\xc4g\u057aM\xeaB\xf7\xa9\x88^i\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94C>\xb9J3\x90\x86\xed\x12\u067d\xe9\xcd\x1dE\x86\x03\xc9}\u058a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4CI\"Zb\xf7\n\xeaH\n\x02\x99\x15\xa0\x1eSy\xe6O\xa5\x89\x8c\xd6~#4\xc0\xd8\x00\x00\u07d4CT\"\x1eb\xdc\t\xe6@d6\x16:\x18^\xf0m\x11J\x81\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94CTC\xb8\x1d\xfd\xb9\xbd\x8cg\x87\xbc%\x18\xe2\xd4~W\xc1_\x8a\x01C\x8d\x93\x97\x88\x1e\xf2\x00\x00\u07d4Ca\u0504o\xaf\xb3w\xb6\xc0\xeeI\xa5\x96\xa7\x8d\xdf5\x16\xa3\x89\xc2\x12z\xf8X\xdap\x00\x00\xe0\x94Cd0\x9a\x9f\xa0p\x95`\x0fy\xed\xc6Q \xcd\xcd#\xdcd\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Cg\xaeK\f\xe9d\xf4\xa5J\xfdK\\6\x84\x96\xdb\x16\x9e\x9a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Ct\x89(\xe8\xc3\xecD6\xa1\u0412\xfb\xe4:\xc7I\xbe\x12Q\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4Cv{\xf7\xfd*\xf9[r\xe91-\xa9D<\xb1h\x8eCC\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94Cy\x838\x8a\xb5\x9aO\xfc!_\x8e\x82iF\x10)\xc3\xf1\xc1\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4C\x89\x8cI\xa3MP\x9b\xfe\xd4\xf7`A\xee\x91\xca\xf3\xaaj\xa5\x89\x10CV\x1a\x88)0\x00\x00\u07d4C\x8c/T\xff\x8eb\x9b\xab6\xb1D+v\v\x12\xa8\x8f\x02\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\x98b\x8e\xa6c-9>\x92\x9c\xbd\x92\x84d\xc5h\xaaJ\f\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4C\x9d//Q\x10\xa4\u054b\x17W\x93P\x15@\x87@\xfe\xc7\xf8\x89\u03e5\xc5\x15\x0fL\x88\x80\x00\u07d4C\x9d\xee?vy\xff\x100s?\x93@\xc0\x96hkI9\v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xb0y\xba\xf0ry\x99\xe6k\xf7C\u057c\xbfwl;\t\"\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xbc-M\xdc\xd6X;\xe2\u01fc\tK(\xfbr\xe6+\xa8;\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xc7\xeb\u0173\xe7\xaf\x16\xf4}\xc5az\xb1\x0e\x0f9\xb4\xaf\xbb\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4C\u02d6R\x81\x8coMg\x96\xb0\xe8\x94\t0ly\xdbcI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xcc\b\xd0s*\xa5\x8a\xde\xf7a\x9b\xedFU\x8a\xd7wAs\x89\xf0\xe7\u0730\x12*\x8f\x00\x00\xe0\x94C\u0567\x1c\xe8\xb8\xf8\xae\x02\xb2\xea\xf8\xea\xf2\xca(@\xb9?\xb6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794C\xdb\u007f\xf9Z\bm(\ubff8/\xb8\xfb_#\n^\xbc\u0348\xdfn\xb0\xb2\xd3\xca\x00\x00\u07d4C\xe7\xec\x84cX\xd7\xd0\xf97\xad\x1c5\v\xa0i\u05ffr\xbf\x89\x06p\xaeb\x92\x14h\x00\x00\u07d4C\xf1o\x1eu\xc3\xc0j\x94x\xe8\u0157\xa4\n<\xb0\xbf\x04\u0309\x9d\xf7\u07e8\xf7`H\x00\x00\u07d4C\xf4p\xede\x9e)\x91\xc3u\x95~]\xde\u017d\x1d8\"1\x89\x05k\xc7^-c\x10\x00\x00\u07d4C\xf7\xe8n8\x1e\xc5\x1e\u0110m\x14v\u02e9z=\xb5\x84\xe4\x8965\u026d\xc5\u07a0\x00\x00\u07d4C\xff8t>\xd0\xcdC0\x8c\x06e\t\u030e~r\xc8b\xaa\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94C\xff\x88S\xe9\x8e\xd8@k\x95\x00\n\u0684\x83b\u05a09*\x8a\x04\xae\v\x1cM.\x84\xd0\x00\x00\u07d4D\t\x88f\xa6\x9bh\xc0\xb6\xbc\x16\x82)\xb9`5\x87\x05\x89g\x89\n1\x06+\xee\xedp\x00\x00\u07d4D\x19\xaca\x8d]\xea|\xdc`w o\xb0}\xbd\xd7\x1c\x17\x02\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4D\x1aR\x00\x16a\xfa\xc7\x18\xb2\u05f3Q\xb7\xc6\xfbR\x1az\xfd\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94D\x1a\u0282c\x13$\xac\xbf\xa2F\x8b\xda2[\xbdxG{\xbf\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4D\x1f7\xe8\xa0)\xfd\x02H/(\x9cI\xb5\xd0m\x00\xe4\b\xa4\x89\x12\x11\xec\xb5m\x13H\x80\x00\u07d4D \xaa5F[\xe6\x17\xad$\x98\xf3p\xde\n<\xc4\xd20\xaf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4D#/\xf6m\xda\xd1\xfd\x84\x12f8\x006\xaf\xd7\xcf}\u007fB\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4D%\rGn\x06$\x84\xe9\b\n9g\xbf:Js*\xd7?\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4D)\xa2\x9f\xee\x19\x84Pg,\f\x1d\a1b%\v\xecdt\x896*\xaf\x82\x02\xf2P\x00\x00\u07d4D5RS\xb2wH\xe3\xf3O\xe9\xca\xe1\xfbq\x8c\x8f$\x95)\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4D8\xe8\x80\xcb'f\xb0\xc1\u03ae\xc9\xd2A\x8f\u03b9R\xa0D\x89\a?\xa0s\x90?\b\x00\x00\u07d4DL\xafy\xb7\x138\ue6a7\xc73\xb0*\u02a7\xdc\x02YH\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4D\\\xb8\xde^=\xf5 \xb4\x99\xef\u0240\xf5+\xff@\xf5\\v\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Dj\x809\xce\u03dd\xceHy\xcb\xca\xf3I;\xf5E\xa8\x86\x10\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4Dt)\x9d\x0e\xe0\x90\u0710x\x9a\x14\x86H\x9c=\rd^m\x8965\u026d\xc5\u07a0\x00\x00\u07d4D\x8b\xf4\x10\xad\x9b\xbc/\xec\xc4P\x8d\x87\xa7\xfc.K\x85a\xad\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4D\x90\x1e\r\x0e\b\xac=^\x95\xb8\xec\x9d^\x0f\xf5\xf1.\x03\x93\x89\x16\xa1\xf9\xf5\xfd}\x96\x00\x00\xe0\x94D\x93\x12<\x02\x1e\xce;3\xb1\xa4R\xc9&\x8d\xe1@\a\xf9\u04ca\x01je\x02\xf1Z\x1eT\x00\x00\xe0\x94D\x9a\xc4\xfb\xe3\x83\xe3g8\x85^6JW\xf4q\xb2\xbf\xa11\x8a)\xb7d2\xb9DQ \x00\x00\u07d4D\xa0\x1f\xb0J\xc0\xdb,\xce]\xbe(\x1e\x1cF\xe2\x8b9\xd8x\x89lj\xccg\u05f1\xd4\x00\x00\u07d4D\xa6=\x18BE\x87\xb9\xb3\a\xbf\xc3\xc3d\xae\x10\xcd\x04\xc7\x13\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94D\xa8\x98\x9e20\x81!\xf7$f\x97\x8d\xb3\x95\xd1\xf7l:K\x8a\x01\x88P)\x9fB\xb0j\x00\x00\u07d4D\xc1\x11\v\x18\x87\x0e\xc8\x11x\xd9=!X8\xc5Q\u050ed\x89\n\xd6\xf9\x85\x93\xbd\x8f\x00\x00\u07d4D\xc1Ge\x12|\xde\x11\xfa\xb4l],\xf4\u0532\x89\x00#\xfd\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94D\xc5N\xaa\x8a\xc9@\xf9\xe8\x0f\x1et\xe8/\xc1O\x16v\x85j\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4D\xcdwSZ\x89?\xa7\xc4\xd5\xeb:$\x0ey\u0419\xa7--\x89,s\xc97t,P\x00\x00\u07d4D\u07faP\xb8)\xbe\xcc_O\x14\u0470J\xab3 \xa2\x95\xe5\x8965\u026d\xc5\u07a0\x00\x00\u07d4D\xe2\xfd\xc6y\xe6\xbe\xe0\x1e\x93\xefJ:\xb1\xbc\xce\x01*\xbc|\x89\x16=\x19I\x00\xc5E\x80\x00\xe0\x94D\xf6/*\xaa\xbc)\xad:k\x04\xe1\xffo\x9c\xe4R\xd1\xc1@\x8a\x03\x99\x92d\x8a#\u0220\x00\x00\u07d4D\xff\xf3{\xe0\x1a8\x88\u04f8\xb8\u1200\xa7\xdd\xef\xee\xea\u04c9\x0e\f[\xfc}\xae\x9a\x80\x00\u07d4E\x06\xfe\x19\xfaK\x00k\xaa9\x84R\x9d\x85\x16\xdb++P\xab\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E\x1b6\x99G[\xed]y\x05\xf8\x90Z\xa3Eo\x1e\u05c8\xfc\x89\x8a\xc7#\x04\x89\xe8\x00\x00\x00\u0794E\x1bpp%\x9b\u06e2q\x00\xe3n#B\x8aS\xdf\xe3\x04\u9239\x8b\xc8)\xa6\xf9\x00\x00\u07d4E'+\x8fb\xe9\xf9\xfa\x8c\xe0D \u1ba3\xeb\xa9hn\xac\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94E+d\u06ce\xf7\xd6\u07c7\u01c8c\x9c\"\x90\xbe\x84\x82\xd5u\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4E>5\x9a3\x97\x94LZ'Z\xb1\xa2\xf7\n^Z?i\x89\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4EI\xb1Yy%_~e\xe9\x9b\rV\x04\u06d8\xdf\xca\u023f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4EKa\xb3D\xc0\xef\x96Qy#\x81U\xf2w\u00c2\x9d\v8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94EO\x01A\xd7!\xd3<\xbd\xc4\x10\x18\xbd\x01\x11\x9a\xa4xH\x18\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4ES3\x90\xe3@\xfe\r\xe3\xb3\xcf_\xb9\xfc\x8e\xa5R\xe2\x9eb\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4ES\x96\xa4\xbb\u067a\u8bdf\xb7\xc4\xd6MG\x1d\xb9\xc2E\x05\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4E[\x92\x96\x92\x1at\xd1\xfcAa\u007fC\xb80>o>\xd7l\x89\u3bb5sr@\xa0\x00\x00\u07d4E\\\xb8\xee9\xff\xbcu#1\xe5\xae\xfcX\x8e\xf0\xeeY4T\x8965F:x\r\xef\x80\x00\u07d4Ej\u0b24\x8e\xbc\xfa\xe1f\x06\x02PR_c\x96^v\x0f\x89\x10CV\x1a\x88)0\x00\x00\u07d4Eo\x8dtf\x82\xb2$g\x93I\x06M\x1b6\x8c|\x05\xb1v\x89\u0213\u041c\x8fQP\x00\x00\u07d4Ep)\xc4i\xc4T\x8d\x16\x8c\xec>e\x87.D(\xd4+g\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Eq\xdeg+\x99\x04\xba\xd8t6\x92\xc2\x1cO\xdc\xeaL.\x01\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4Ex\x1b\xbew\x14\xa1\xc8\xf7;\x1cty!\xdfO\x84'\x8bp\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E{\xce\xf3}\xd3\xd6\v-\xd0\x19\xe3\xfea\xd4k?\x1erR\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94E\x8e<\u025e\x94xD\xa1\x8ejB\x91\x8f\xef~\u007f_^\xb3\x8a\a\xb5?y\xe8\x88\xda\xc0\x00\x00\u07d4E\x93\x93\xd6:\x06>\xf3r\x1e\x16\xbd\x9f\xdeE\ue77dw\xfb\x89j\xba\u05a3\xc1S\x05\x00\x00\u07d4E\xa5p\xdc\xc2\t\f\x86\xa6\xb3\xea)\xa6\bc\xdd\xe4\x1f\x13\xb5\x89\f\x9a\x95\xee)\x86R\x00\x00\u07d4E\xa8 \xa0g/\x17\xdct\xa0\x81\x12\xbcd?\xd1\x16w6\u00c9\n\xd6\xc4;(\x15\xed\x80\x00\u07d4E\xb4q\x05\xfeB\xc4q-\xcen*!\xc0[\xff\xd5\xeaG\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E\xbb\x82\x96R\u063f\xb5\x8b\x85'\xf0\xec\xb6!\u009e!.\u00c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94E\xc0\u045f\v\x8e\x05O\x9e\x8986\xd5\xec\xaey\x01\xaf(\x12\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4E\xc4\xec\xb4\xee\x89\x1e\xa9\x84\xa7\xc5\xce\xfd\x8d\xfb\x001\v(P\x89kV\x05\x15\x82\xa9p\x00\x00\u07d4E\u028d\x95f\b\xf9\xe0\n/\x99t\x02\x86@\x88\x84ef\x8f\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94E\u0298b\x00;N@\xa3\x17\x1f\xb5\xca\xfa\x90(\xca\xc8\xde\x19\x8a\x02\ub3b1\xa1r\u0738\x00\x00\u07d4E\xd1\xc9\xee\xdf|\xabA\xa7y\x05{y9_T(\xd8\x05(\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E\u0535M7\xa8\xcfY\x98!#_\x06/\xa9\xd1p\xed\u8909\x11\x90g;_\u0690\x00\x00\xe0\x94E\xdb\x03\xbc\xcf\u05a5\xf4\xd0&k\x82\xa2*6\x87\x92\xc7}\x83\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4E\xe3\xa9>r\x14J\u0686\f\xbcV\xff\x85\x14Z\xda8\xc6\u0689WG=\x05\u06ba\xe8\x00\x00\u07d4E\u6378\u06fa\xba_\xc2\xcb3|b\xbc\xd0\xd6\x1b\x05\x91\x89\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94E\u6379L}\n\xb7\xacA\x85zq\xd6qG\x87\x0fNq\x8aT\xb4\v\x1f\x85+\xda\x00\x00\x00\u07d4E\xf4\xfc`\xf0\x8e\xac\xa1\x05\x98\xf03c)\x80\x1e<\x92\xcbF\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4F\rSU\xb2\xce\xebnb\x10}\x81\xe5\x12p\xb2k\xf4V \x89l\xb7\xe7Hg\xd5\xe6\x00\x00\xe0\x94F\"O2\xf4\xec\xe5\u0206p\x90\xd4@\x9dU\xe5\v\x18C-\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4F'\xc6\x06\x84&q\xab\u0782\x95\xee]\xd9L\u007fT\x954\xf4\x89\x0f\x89_\xbd\x872\xf4\x00\x00\u07d4F+g\x8bQ\xb5\x84\xf3\xedz\xda\a\v\\\u065c\v\xf7\xb8\u007f\x89\x05k\xc7^-c\x10\x00\x00\u07d4FM\x9c\x89\xcc\xe4\x84\xdf\x00\x02w\x19\x8e\xd8\a_\xa65r\u0449\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4FPNj!Z\xc8;\xcc\xf9V\xbe\xfc\x82\xabZg\x93q\u0209\x1c!(\x05\u00b4\xa5\x00\x00\xe0\x94FQ\xdcB\x0e\b\xc3);'\xd2Ix\x90\xebP\":\xe2\xf4\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4FS\x1e\x8b\x1b\xde\t\u007f\u07c4\x9dm\x11\x98\x85`\x8a\x00\x8d\xf7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4Fb\x92\xf0\xe8\rC\xa7\x87t'u\x90\xa9\xebE\x96\x12\x14\xf4\x894\x95tD\xb8@\xe8\x00\x00\xe0\x94Fb\xa1v^\xe9!\x84-\u0708\x89\x8d\x1d\xc8bu\x97\xbd~\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Fe\xe4s\x96\xc7\u06d7\xeb*\x03\xd9\bc\xd5\u053a1\x9a\x94\x89 \x86\xac5\x10R`\x00\x00\u07d4Fo\xdak\x9bX\xc5S'P0j\x10\xa2\xa8\xc7h\x10;\a\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4Fq$\xae\u007fE/&\xb3\xd5t\xf6\b\x88\x94\xfa]\x1c\xfb;\x89\x92^\x06\xee\xc9r\xb0\x00\x00\u0794Fr*6\xa0\x1e\x84\x1d\x03\xf7\x80\x93^\x91}\x85\u0566z\xbd\x88\xce\xc7o\x0eqR\x00\x00\u07d4Fw\x9aVV\xff\x00\xd7>\xac:\xd0\u00cbl\x850\x94\xfb@\x89\f\x82S\xc9lj\xf0\x00\x00\u07d4Fw\xb0N\x03C\xa3!1\xfdj\xbb9\xb1\xb6\x15k\xba=[\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4F}Y\x88$\x9ahaG\x16e\x98@\xed\n\xe6\xf6\xf4W\xbc\x89\x15\x01\xa4\x8c\xef\xdf\xde\x00\x00\u07d4F~\x0e\xd5O;v\xae\x066\x17n\aB\b\x15\xa0!sn\x89lk\x93[\x8b\xbd@\x00\x00\u07d4F~\xa1\x04E\x82~\xf1\xe5\x02\xda\xf7k\x92\x8a \x9e\r@2\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94F\u007f\xbfAD\x16\x00u\u007f\xe1X0\xc8\xcd_O\xfb\xbb\xd5`\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94F\x93Xp\x932\xc8+\x88~ \xbc\xdd\xd0\"\x0f\x8e\u06e7\u040a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4F\x97\xba\xaf\x9c\xcb`?\xd3\x040h\x9dCTE\xe9\u024b\xf5\x89\n\xd2\x01\xa6yO\xf8\x00\x00\u07d4F\xa3\v\x8a\x80\x891!tE\xc3\xf5\xa9>\x88,\x03E\xb4&\x89\r\x8d\xb5\xeb\u05f2c\x80\x00\u07d4F\xa40\xa2\u0528\x94\xa0\u062a?\xea\xc6\x156\x14\x15\xc3\xf8\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4F\xaaP\x18pg~\u007f\nPHv\xb4\xe8\x80\x1a\n\xd0\x1cF\x89+^:\xf1k\x18\x80\x00\x00\u07d4F\xbf\u0172\a\xeb \x13\xe2\xe6\x0fw_\xec\xd7\x18\x10\u0159\f\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4F\xc1\xaa\"D\xb9\u0229W\u028f\xacC\x1b\x05\x95\xa3\xb8h$\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4F\xd8\x061(B\x03\xf6(\x8e\xcdNWX\xbb\x9dA\xd0]\xbe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4G\n\xc5\xd1\xf3\xef\xe2\x8f8\x02\xaf\x92[W\x1ec\x86\x8b9}\x89lk\x93[\x8b\xbd@\x00\x00\u07d4G\x10\x10\xdaI/@\x18\x83;\b\x8d\x98r\x90\x1e\x06\x12\x91t\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4G\x12T\x02e\xcb\xee\u00c4p\"\u015f\x1b1\x8dC@\n\x9e\x89\xbd\xbcA\xe04\x8b0\x00\x00\xe0\x94G\x14\u03e4\xf4k\u05bdps}u\x87\x81\x97\xe0\x8f\x88\xe61\x8a\x02\u007f>\u07f3Nn@\x00\x00\u07d4G H\xcc`\x9a\xeb$!e\uaa87\x05\x85\f\xf3\x12]\xe0\x8965\u026d\xc5\u07a0\x00\x00\u07d4G!\x92)\xe8\xcdVe\x9ae\u00a9C\xe2\u075a\x8fK\xfd\x89\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4G7\xd0B\xdcj\xe7>\xc7:\xe2Qz\u03a2\xfd\xd9d\x87\u014965\u026d\xc5\u07a0\x00\x00\u07d4GAX\xa1\xa9\xdci<\x13?e\xe4{\\:\xe2\xf7s\xa8o\x89\n\xdaUGK\x814\x00\x00\u07d4GE\xab\x18\x1a6\xaa\x8c\xbf\"\x89\xd0\xc4Qe\xbc~\xbe#\x81\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4GPf\xf9\xad&eQ\x96\xd5SS'\xbb\xeb\x9by)\xcb\x04\x89\xa4\xccy\x95c\u00c0\x00\x00\xe0\x94GR!\x8eT\xdeB?\x86\xc0P\x193\x91z\xea\b\xc8\xfe\u054a\x04<3\xc1\x93ud\x80\x00\x00\u07d4GZa\x93W-JNY\u05fe\t\u02d6\r\u074cS\x0e/\x89$,\xf7\x8c\xdf\a\xff\x80\x00\u07d4Gd\x8b\xed\x01\xf3\xcd2I\bNc]\x14\u06a9\xe7\xec<\x8a\x89\n\x84Jt$\xd9\xc8\x00\x00\u07d4Gh\x84\x10\xff%\xd6T\xd7.\xb2\xbc\x06\xe4\xad$\xf83\xb0\x94\x89\b\xb2\x8da\xf3\u04ec\x00\x00\u07d4GkU\x99\b\x9a?\xb6\xf2\x9clr\xe4\x9b.G@\ua00d\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4Gs\x0f_\x8e\xbf\x89\xacr\xef\x80\xe4l\x12\x19P8\xec\xdcI\x89\xabM\xcf9\x9a:`\x00\x00\xe0\x94G{$\xee\u80deO\u045d\x12P\xbd\vfEyJa\u028a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4G\x81\xa1\nM\xf5\uef02\xf4\xcf\xe1\a\xba\x1d\x8av@\xbdf\x89a\t=|,m8\x00\x00\u07d4G\x88Z\xba\xbe\xdfM\x92\x8e\x1c\x88\x83\xa6a\x9cl(\x11\x84\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94G\xe2]\xf8\x82%8\xa8Yk(\xc67\x89kM\x14<5\x1d\x8a\x11\v\xe9\xeb$\xb8\x81P\x00\x00\u07d4G\xf4ik\xd4b\xb2\r\xa0\x9f\xb8>\xd2\x03\x98\x18\xd7v%\xb3\x89\b\x13\xcaV\x90m4\x00\x00\u07d4G\xfe\xf5\x85\x84FRH\xa0\x81\r`F>\xe9>Zn\xe8\u04c9\x0fX\xcd>\x12i\x16\x00\x00\u07d4G\xffo\xebC! `\xbb\x15\x03\u05e3\x97\xfc\b\xf4\xe7\x03R\x89lk\x93[\x8b\xbd@\x00\x00\u07d4G\xff\xf4,g\x85Q\xd1A\xebu\xa6\xee9\x81\x17\xdf>J\x8d\x89\x05k\xea\xe5\x1f\xd2\xd1\x00\x00\u07d4H\x01\x0e\xf3\xb8\xe9^?0\x8f0\xa8\xcb\u007fN\xb4\xbf`\xd9e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4H\n\xf5 v\x00\x9c\xa77\x81\xb7\x0eC\xb9Y\x16\xa6\"\x03\xab\x892\x19r\xf4\b=\x87\x80\x00\u07d4H\x0f1\xb9\x891\x1eA$\u01a7F_ZD\tM6\xf9\u04097\x90\xbb\x85Q7d\x00\x00\xe0\x94H\x11\x15)j\xb7\xdbRI/\xf7\xb6G\xd63)\xfb\\\xbck\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4H\x1e:\x91\xbf\xdc/\x1c\x84(\xa0\x11\x9d\x03\xa4\x16\x01A~\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4H(\xe4\xcb\xe3N\x15\x10\xaf\xb7,+\ueb0aE\x13\xea\xeb\u0649\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94H)\x82\xac\x1f\x1cm\x17!\xfe\xec\u0679\xc9l\xd9I\x80PU\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4H0,1\x1e\xf8\xe5\xdcfAX\xddX<\x81\x19Mn\rX\x89\xb6gl\xe0\xbc\xcb\\\x00\x00\u07d4H;\xa9\x904\xe9\x00\xe3\xae\xdfaI\x9d;+\xce9\xbe\xb7\xaa\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4HT\x8bK\xa6+\xcb/\r4\xa8\x8d\u019ah\x0eS\x9c\xf0F\x89\x05l\xf1\u02fbt2\x00\x00\u07d4Hc\x84\x979&Zc\xb0\xa2\xbf#jY\x13\xe6\xf9Y\xce\x15\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4He\x9d\x8f\x8c\x9a/\xd4Oh\u06a5]#\xa6\b\xfb\xe5\x00\u0709lk\x93[\x8b\xbd@\x00\x00\xe0\x94Hf\x9e\xb5\xa8\x01\u0637_\xb6\xaaX\xc3E\x1bpX\xc2C\xbf\x8a\x06\x8dB\xc18\u06b9\xf0\x00\x00\u07d4Hjl\x85\x83\xa8D\x84\xe3\xdfC\xa1#\x83\u007f\x8c~#\x17\u0409\x11\x87\xc5q\xab\x80E\x00\x00\u07d4Hz\xdf}p\xa6t\x0f\x8dQ\xcb\xddh\xbb?\x91\u0125\xceh\x89\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\u07d4H~\x10\x85\x02\xb0\xb1\x89\uf70cm\xa4\xd0\xdbba\xee\xc6\xc0\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94H\x88\xfb%\xcdP\u06f9\xe0H\xf4\x1c\xa4}x\xb7\x8a'\xc7\u064a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u0794H\x934\u00b6\x95\xc8\xee\a\x94\xbd\x86B\x17\xfb\x9f\xd8\xf8\xb15\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4H\xa3\r\xe1\xc9\x19\xd3\xfd1\x80\xe9}_+*\x9d\xbd\x96M-\x89\x02b\x9ff\xe0\xc50\x00\x00\u07d4H\xbf\x14\u05f1\xfc\x84\xeb\xf3\xc9k\xe1/{\xce\x01\xaai\xb0>\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4H\xc2\ue465\aV\xd8\u039a\xbe\xebu\x89\xd2,o\xee]\xfb\x89\xae\x8ez\v\xb5u\xd0\x00\x00\u07d4H\xc5\u0197\v\x91a\xbb\x1c{z\xdf\xed\x9c\xde\u078a\x1b\xa8d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94H\xd2CKz}\xbb\xff\b\";c\x87\xb0]\xa2\xe5\t1&\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4H\xd4\xf2F\x8f\x96?\u05da\x00a\x98\xbbg\x89]-Z\xa4\u04c9K\xe4\xe7&{j\xe0\x00\x00\u07d4H\xe0\xcb\xd6\u007f\x18\xac\xdbzb\x91\xe1%M\xb3.\trs\u007f\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4H\xf6\n5HO\xe7y+\u030a{c\x93\xd0\u0761\xf6\xb7\x17\x89\xc3(\t>a\xee@\x00\x00\u07d4H\xf8\x83\xe5g\xb46\xa2{\xb5\xa3\x12M\xbc\x84\xde\xc7u\xa8\x00\x89)\xd7n\x86\x9d\u0340\x00\x00\xe0\x94I\x01E\xaf\xa8\xb5E\"\xbb!\xf3R\xf0m\xa5\xa7\x88\xfa\x8f\x1d\x8a\x01\xf4lb\x90\x1a\x03\xfb\x00\x00\u07d4I\t\xb3\x19\x98\xea\xd4\x14\xb8\xfb\x0e\x84k\xd5\xcb\xde995\xbe\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4I\x12\xd9\x02\x93\x16v\xff9\xfc4\xfe<<\xc8\xfb!\x82\xfaz\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4I\x13o\xe6\xe2\x8btS\xfc\xb1kk\xbb\u9aac\xba\x837\xfd\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94I\x15a\u06cbo\xaf\xb9\x00~b\xd0P\u0082\xe9,Kk\u020a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4I\x18]\xd7\xc262\xf4lu\x94s\ubb96`\b\xcd5\x98\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4I,\xb5\xf8a\xb1\x87\xf9\xdf!\xcdD\x85\xbe\xd9\vP\xff\xe2-\x89\x1b\x19\xe5\vD\x97|\x00\x00\u07d4I-\xe4j\xaf\x8f\x1dp\x8dY\u05da\xf1\xd0:\xd2\xcb`\x90/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4I.p\xf0M\x18@\x8c\xb4\x1e%`70Pk5\xa2\x87k\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4I:g\xfe#\xde\xccc\xb1\r\xdau\xf3(v\x95\xa8\x1b\u056b\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4I=H\xbd\xa0\x15\xa9\xbf\xcf\x16\x03\x93n\xabh\x02L\xe5Q\xe0\x89\x018\xa3\x88\xa4<\x00\x00\x00\xe0\x94IBV\xe9\x9b\x0f\x9c\xd6\xe5\xeb\xca8\x99\x862R\x90\x01e\u020a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4IM\xecM^\xe8\x8a'q\xa8\x15\xf1\xeerd\x94/\xb5\x8b(\x89lk\x93[\x8b\xbd@\x00\x00\u07d4I[d\x1b\x1c\u07a3b\u00f4\u02fd\x0f\\\xc5\v\x1e\x17k\x9c\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94Ih\xa2\xce\xdbEuU\xa19)Z\xea(wnT\x00<\x87\x8a\x02#\x1a\xef\u0266b\x8f\x00\x00\u07d4Im6U4S\n_\xc1W|\nRA\u02c8\xc4\xdapr\x89a\t=|,m8\x00\x00\xe0\x94In1\x95\x92\xb3A\xea\xcc\xd7x\u0767\xc8\x19mT\xca\xc7u\x8a\x01\xf5q\x89\x87fKH\x00\x00\u07d4IoXC\xf6\xd2L\u064d%^L#\xd1\xe1\xf0#\"uE\x89_\x17\x9f\u0526\xee\t\x80\x00\xe0\x94Ip\u04ec\xf7+[\x1f2\xa7\x00<\xf1\x02\xc6N\xe0TyA\x8a\x1d\xa5jK\b5\xbf\x80\x00\x00\u07d4Iw\xa7\x93\x9d\t9h\x94U\xce&9\xd0\xeeZL\xd9\x10\xed\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4Iy\x19N\xc9\xe9}\xb9\xbe\xe84;|w\xd9\xd7\xf3\xf1\u071f\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Iy4c\xe1h\x10\x83\u05ab\xd6\xe7%\u057b\xa7E\xdc\xcd\xe8\x89\x1d\x98\xe9LNG\x1f\x00\x00\u07d4I\x81\xc5\xfff\xccN\x96\x80%\x1f\xc4\xcd/\xf9\a\xcb2xe\x89(\xa8WBTf\xf8\x00\x00\u07d4I\x89\u007f\xe92\xbb\xb3\x15L\x95\u04fc\xe6\xd9;ms)\x04\u0749\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4I\x89\xe1\xab^|\xd0\aF\xb3\x93\x8e\xf0\xf0\xd0d\xa2\x02[\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4I\x8a\xbd\xeb\x14\xc2k{r4\xd7\x0f\u03ae\xf3a\xa7m\xffr\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4I\xa6E\xe0f}\xfd{2\xd0u\xcc$g\u074ch\t\a\u0109\a\x06\x01\x95\x8f\u02dc\x00\x00\xe0\x94I\xb7N\x16\x92e\xf0\x1a\x89\xecL\x90r\u0164\xcdr\xe4\xe85\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4I\xbd\xbc{\xa5\xab\xeb\xb68\x9e\x91\xa3(R \xd3E\x1b\xd2S\x8965\u026d\xc5\u07a0\x00\x00\u07d4I\xc9A\xe0\xe5\x01\x87&\xb7)\x0f\xc4s\xb4q\xd4\x1d\xae\x80\u0449\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94I\xc9w\x1f\xca\x19\u0579\xd2E\u0211\xf8\x15\x8f\xe4\x9fG\xa0b\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4I\xcf\x1eT\xbe61\x06\xb9 r\x9d-\v\xa4o\bg\x98\x9a\x89\x0e\x87?D\x13<\xb0\x00\x00\u07d4I\xd2\u008e\xe9\xbcT^\xaa\xf7\xfd\x14\xc2|@s\xb4\xbb_\x1a\x89O\xe9\xb8\x06\xb4\r\xaf\x00\x00\u07d4I\xdd\xee\x90.\x1d\f\x99\u0471\x1a\xf3\u030a\x96\xf7\x8eM\xcf\x1a\x89\n\u03a5\xe4\xc1\x8cS\x00\x00\u07d4I\xf0(9[Z\x86\xc9\xe0\u007fwxc\x0eL.=7:w\x89\x06\xa7JP8\u06d1\x80\x00\xe0\x94J\x19 5\xe2a\x9b$\xb0p\x9dVY\x0e\x91\x83\xcc\xf2\xc1\u064a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4J@S\xb3\x1d\x0e\xe5\u06ef\xb1\xd0k\u05ec\u007f\xf3\",G\u0589K\xe4\xe7&{j\xe0\x00\x00\u07d4JC\x01p\x15-\xe5\x17&3\u0742b\xd1\a\xa0\xaf\xd9j\x0f\x89\xabM\xcf9\x9a:`\x00\x00\u07d4JG\xfc>\x17\u007fVz\x1e8\x93\xe0\x00\xe3k\xba#R\n\xb8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4JR\xba\xd2\x03W\"\x8f\xaa\x1e\x99k\xedy\f\x93gK\xa7\u0409Hz\x9a0E9D\x00\x00\u07d4JS\xdc\xdbV\xceL\xdc\xe9\xf8.\xc0\xeb\x13\xd6sR\xe7\u020b\x89\u3bb5sr@\xa0\x00\x00\u07d4J_\xae;\x03r\xc20\xc1%\xd6\xd4p\x14\x037\xab\x91VV\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4Jq\x90a\xf5(T\x95\xb3{\x9d~\xf8\xa5\x1b\a\xd6\u6b2c\x89\n\xd4\xc81j\v\f\x00\x00\u07d4Js8\x92\x98\x03\x1b\x88\x16\u0329FB\x1c\x19\x9e\x18\xb3C\u0589\"8h\xb8y\x14o\x00\x00\u07d4Js]\"G\x927m3\x13g\xc0\x93\xd3\x1c\x87\x944\x15\x82\x89f\xff\xcb\xfd^Z0\x00\x00\u07d4Jt\x94\xcc\xe4HU\u0300X(B\xbe\x95\x8a\r\x1c\x00r\ue242\x1a\xb0\xd4AI\x80\x00\x00\u07d4Ju\xc3\xd4\xfao\u033d]\u0567\x03\xc1Sy\xa1\xe7\x83\u9dc9b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94J\x81\xab\xe4\x98L|k\xefc\u0598 \xe5WC\xc6\x1f \x1c\x8a\x03d\x01\x00N\x9a\xa3G\x00\x00\u07d4J\x82iO\xa2\x9d\x9e!2\x02\xa1\xa2\t(]\xf6\xe7E\xc2\t\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4J\x83\\%\x82LG\xec\xbf\u01d49\xbf?\\4\x81\xaau\u0349K\xe4\xe7&{j\xe0\x00\x00\u07d4J\x91\x802C\x91Y\xbb1[g%\xb6\x83\r\xc86\x97s\x9f\x89\x12\xa3.\xf6x3L\x00\x00\u07d4J\x97\xe8\xfc\xf4c^\xa7\xfc^\x96\xeeQu.\u00c8qk`\x89\x1d\x99E\xab+\x03H\x00\x00\u07d4J\x9a&\xfd\n\x8b\xa1\x0f\x97}\xa4\xf7|1\x90\x8d\xabJ\x80\x16\x89a\t=|,m8\x00\x00\u07d4J\xa1H\xc2\xc34\x01\xe6j+Xnew\u0132\x92\xd3\xf2@\x89\v\xb8`\xb2\x85\xf7t\x00\x00\u07d4J\xa6\x93\xb1\"\xf3\x14H*G\xb1\x1c\xc7|h\xa4\x97\x87ab\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4J\xb2\xd3O\x04\x83O\xbftyd\x9c\xab\x92=,G%\xc5S\x89\xbe\xd1\xd0&=\x9f\x00\x00\x00\u07d4J\xc0vs\xe4/d\xc1\xa2^\xc2\xfa-\x86\xe5\xaa+4\xe09\x89lk\x93[\x8b\xbd@\x00\x00\u07d4J\u016c\xad\x00\v\x88w!L\xb1\xae\x00\xea\u0263}Y\xa0\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4J\u0250ZL\xb6\xab\x1c\xfdbTn\xe5\x91s\x00\xb8|O\u07897\b\xba\xed=h\x90\x00\x00\u07d4J\u03e9\xd9N\xdaf%\xc9\u07e5\xf9\xf4\xf5\xd1\a\xc4\x03\x1f\u07c9\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4J\xd0G\xfa\xe6~\xf1b\xfeh\xfe\xdb\xc2};e\xca\xf1\f6\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4J\xd9]\x18\x8dddp\x9a\xdd%U\xfbM\x97\xfe\x1e\xbf1\x1f\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\u07d4J\xdb\xf4\xaa\xe0\xe3\xefD\xf7\xddM\x89\x85\u03ef\tn\u010e\x98\x89\b!\xab\rD\x14\x98\x00\x00\u07d4J\xe2\xa0M9\t\xefENTL\xcf\xd6\x14\xbf\xef\xa7\x10\x89\xae\x89\x18\x01\x15\x9d\xf1\xee\xf8\x00\x00\xe0\x94J\xe90\x82\xe4Q\x87\xc2a`\xe6g\x92\xf5\u007f\xad5Q\xc7:\x8a\x04\x96\x15 \xda\xff\x82(\x00\x00\u07d4J\xf0\xdb\a{\xb9\xba^D>!\xe1H\xe5\x9f7\x91\x05\u0152\x89 \x86\xac5\x10R`\x00\x00\u07d4K\x06\x19\xd9\u062a1:\x951\xac}\xbe\x04\xca\rjZ\u0476\x89lk\x93[\x8b\xbd@\x00\x00\u07d4K\v\u062c\xfc\xbcS\xa6\x01\v@\xd4\u040d\xdd-\x9dib-\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4K\x19\xeb\f5K\xc199`\xeb\x06\x06;\x83\x92o\rg\xb2\x89\x01\x92t\xb2Y\xf6T\x00\x00\u07d4K)C|\x97\xb4\xa8D\xbeq\u0323\xb6H\xd4\xca\x0f\u075b\xa4\x89\b$q\x984\u03ec\x00\x00\u07d4K1\xbfA\xab\xc7\\\x9a\xe2\u034f\u007f5\x16;n+tPT\x89\x14\xb5P\xa0\x13\xc78\x00\x00\u07d4K:|\u00e7\u05f0\x0e\xd5(\"!\xa6\x02Y\xf2[\xf6S\x8a\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94K:\xab3^\xbb\xfa\xa8p\xccM`^}.t\xc6h6\x9f\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4K\xcd\xc1\x8a`\x00\x00\u07d4K`\xa3\xe2S\xbf8\xc8\xd5f \x10\xbb\x93\xa4s\xc9e\xc3\xe5\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4Kt\xf5\xe5\x8e.\xdfv\xda\xf7\x01Q\x96J\v\x8f\x1d\xe0f<\x89\x11\x90\xaeID\xba\x12\x00\x00\u07d4Kv!f\xdd\x11\x18\xe8Ci\xf8\x04\xc7_\x9c\xd6W\xbfs\f\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Ky.)h>\xb5\x86\u353b3Rl`\x01\xb3\x97\x99\x9e\x89 \x86\xac5\x10R`\x00\x00\u07d4K\x90N\x93K\xd0\u030b p_\x87\x9e\x90[\x93\xea\f\xcc0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94K\x92\x06\xbakT\x9a\x1a\u007f\x96\x9e\x1d]\xba\x86u9\xd1\xfag\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4K\x98N\xf2lWn\x81Z.\xae\xd2\xf5\x17\u007f\a\u06f1\xc4v\x89T\x91YV\xc4\t`\x00\x00\u07d4K\x9e\x06\x8f\xc4h\tv\xe6\x15\x04\x91)\x85\xfd\\\xe9K\xab\r\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4K\xa0\xd9\xe8\x96\x01w+IhG\xa2\xbbC@\x18g\x87\xd2e\x8965\u026d\xc5\u07a0\x00\x00\u07d4K\xa5:\xb5I\xe2\x01m\xfa\"<\x9e\u0563\x8f\xad\x91(\x8d\a\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94K\xa8\xe0\x11\u007f\xc0\xb6\xa3\xe5k$\xa3\xa5\x8f\xe6\xce\xf4B\xff\x98\x8a\x011\xbe\xb9%\xff\xd3 \x00\x00\u07d4K\xac\x84j\xf4\x16\x9f\x1d\x95C\x1b4\x1d\x88\x00\xb2!\x80\xaf\x1a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4K\xb6\xd8k\x83\x14\xc2-\x8d7\xeaQm\x00\x19\xf1V\xaa\xe1-\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94K\xb9e\\\xfb*6\xea|cz{\x85\x9bJ1T\xe2n\xbe\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\xe0\x94K\xbc\xbf8\xb3\xc9\x01c\xa8K\x1c\u04a9;X\xb2\xa34\x8d\x87\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94K\xd6\xdd\f\xff#@\x0e\x170\xba{\x89E\x04W}\x14\xe7J\x8a+\xa0\xcc\xdd\xd0\xdfs\xb0\x00\x00\u07d4K\xe8b\x8a\x81T\x87N\x04\x8d\x80\xc1B\x18\x10\"\xb1\x80\xbc\xc1\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4K\xe9\rA!)\u0564\xd0BCa\xd6d\x9dNG\xa6#\x16\x897\b\xba\xed=h\x90\x00\x00\xe0\x94K\xea(\x8e\xeaB\u0115^\xb9\xfa\xad*\x9f\xafG\x83\xcb\u076c\x8a\x06\x18\xbe\x16c\u012fI\x00\x00\u07d4K\xf4G\x97\x99\xef\x82\xee\xa2\tC7OV\xa1\xbfT\x00\x1e^\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4K\xf8\xbf\x1d5\xa211Wd\xfc\x80\x01\x80\x9a\x94\x92\x94\xfcI\x89\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\u07d4K\xf8\xe2oL'\x90\xdae3\xa2\xac\x9a\xba\xc3\u019a\x19\x943\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0794L\n\xcaP\x8b<\xaf^\xe0(\xbcp}\xd1\xe8\x00\xb88\xf4S\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94L\v\x15\x15\xdf\xce\u05e1>\x13\xee\x12\xc0\xf5#\xaePO\x03+\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4L\x13\x98\f2\xdc\xf3\x92\vx\xa4\xa7\x903\x12\x90|\x1b\x12?\x89\x03A\x00\x15\xfa\xae\f\x00\x00\u07d4L\x15y\xaf3\x12\xe4\xf8\x8a\xe9\x95\xcc9W\xd2R\xce\v\xf0\xc8}[O\"4g.p\x89\x87\x86x2n\xac\x90\x00\x00\u07d4LB1y\x82i\x1d\x10\x89\x05k\xc7^-c\x10\x00\x00\u07d4LZ\xfe@\xf1\x8f\xfcH\u04e1\xae\xc4\x1f\u009d\xe1y\xf4\u0497\x89lk\x93[\x8b\xbd@\x00\x00\u07d4L[=\xc0\xe2\xb96\x0f\x91(\x9b\x1f\xe1<\xe1,\x0f\xbd\xa3\xe1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Lfk\x86\xf1\xc5\ue324\x12\x85\xf5\xbd\xe4\xf7\x90R\b\x14\x06\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Lik\xe9\x9f:i\x04@\xc3CjY\xa7\xd7\xe97\u05ba\r\x89\xbb\x91%T\"c\x90\x00\x00\u07d4Lj$\x8f\xc9}p]\xefI\\\xa2\aY\x16\x9e\xf0\xd3dq\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4Lj\x9d\xc2\u02b1\n\xbb.|\x13p\x06\xf0\x8f\ucd77y\xe1\x89\x1b\r\x04 /G\xec\x00\x00\u07d4Lk\x93\xa3\xbe\xc1cIT\f\xbf\xca\xe9l\x96!\xd6dP\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Lu\x98\x13\xad\x13\x86\xbe\xd2\u007f\xfa\xe9\xe4\x81^60\u0323\x12\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Lv\f\xd9\xe1\x95\xeeO-k\xce%\x00\xff\x96\xda|C\ue44a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4Lv{e\xfd\x91\x16\x1fO\xbd\xccji\xe2\xf6\xadq\x1b\xb9\x18\x89'\b\x01\xd9F\xc9@\x00\x00\u07d4L~.+w\xad\f\xd6\xf4J\xcb(a\xf0\xfb\x8b(u\x0e\xf9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4L\x85\xed6/$\xf6\xb9\xf0L\xdf\xcc\xd0\"\xaeSQG\u02f9\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4L\x93[\xb2Pw\x8b0\x9b==\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4L\xee\x90\x1bJ\u0231V\xc5\xe2\xf8\xa6\xf1\xbe\xf5r\xa7\xdc\xeb~\x8965\u026d\xc5\u07a0\x00\x00\u07d4L\xef\xbe#\x98\xe4}R\u73743L\x8bivu\U00053b89\xd9o\u0390\u03eb\xcc\x00\x00\u07d4L\xf5S{\x85\x84/\x89\xcf\xee5\x9e\xaeP\x0f\xc4I\xd2\x11\x8f\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94M\bG\x1dh\x00z\xff*\xe2y\xbc^?\xe4\x15o\xbb\xe3\u078a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4M \x01\x10\x12@\b\xd5ov\x98\x12VB\f\x94jo\xf4\\\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4M$\xb7\xacG\xd2\xf2}\xe9\tt\xba=\xe5\xea\xd2\x03TK\u0349\x05k\xc7^-c\x10\x00\x00\u0794M)\xfcR:,\x16)S!!\u0699\x98\u9d6b\x9d\x1bE\x88\xdbD\xe0I\xbb,\x00\x00\u07d4M8\xd9\x0f\x83\xf4Q\\\x03\xccx2j\x15M5\x8b\u0602\xb7\x89\n\ad\a\xd3\xf7D\x00\x00\u07d4ML\xf5\x80t)a^0\xcd\xfa\xce\x1eZ\xaeM\xad0U\xe6\x89 \x86\xac5\x10R`\x00\x00\u07d4MW\xe7\x16\x87l\f\x95\xef^\xae\xbd5\xc8\xf4\x1b\x06\x9bk\xfe\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Mg\U000ab159\xfe\xf5\xfcA9\x99\xaa\x01\xfd\u007f\xcep\xb4=\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Mn\x8f\xe1\t\xcc\xd2\x15\x8eM\xb1\x14\x13/\xe7_\xec\u023e[\x89\x01[5W\xf1\x93\u007f\x80\x00\xe0\x94Mq\xa6\xeb=\u007f2~\x184'\x8e(\v\x03\x9e\xdd\xd3\x1c/\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4M|\xfa\xa8L\xb31\x06\x80\n\x8c\x80/\xb8\xaaF8\x96\u0159\x89a\t=|,m8\x00\x00\u07d4M\x80\x10\x93\xc1\x9c\xa9\xb8\xf3B\xe3<\xc9\xc7{\xbdL\x83\x12\u03c9\x12\xb3\xe7\xfb\x95\u0364\x80\x00\u07d4M\x82\x88\x94u/o%\x17]\xaf!w\tD\x87\x95Ko\x9f\x89O!+\xc2\u011c\x83\x80\x00\xe0\x94M\x82\xd7p\f\x12;\xb9\x19A\x9b\xba\xf0Fy\x9ck\x0e,f\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4M\x83m\x9d;\x0e,\xbdM\xe0PYo\xaaI\f\xff\xb6\r]\x89\x10CV\x1a\x88)0\x00\x00\u07d4M\x86\x97\xaf\x0f\xbf,\xa3n\x87h\xf4\xaf\"\x135phZ`\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4M\x92y\x96 )\xa8\xbdEc\x977\xe9\x8bQ\x1e\xff\aL!\x89Hz\x9a0E9D\x00\x00\u07d4M\x93io\xa2HY\xf5\u0493\x9a\xeb\xfaT\xb4\xb5\x1a\xe1\xdc\u0309\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4M\x9cw\xd0u\f^o\xbc$\u007f/\u05d2thl\xb3S\u0589\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4M\xa5\xed\u0188\xb0\xcbb\xe1@=\x17\x00\xd9\u0739\x9f\xfe?\u04c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94M\xa8\x03\ai\x84K\xc3A\x86\xb8\\\xd4\xc74\x88I\xffI\xe9\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4M\xb1\xc4:\x0f\x83M}\x04x\xb8\x96\ag\xec\x1a\xc4L\x9a\xeb\x89/Q\x810V'7\x00\x00\u07d4M\xb2\x12\x84\xbc\xd4\xf7\x87\xa7Ue\x00\xd6\xd7\xd8\xf3f#\xcf5\x89i(7Ow\xa3c\x00\x00\u07d4M\xc3\xda\x13\xb2\xb4\xaf\xd4O]\r1\x89\xf4D\xd4\xdd\xf9\x1b\x1b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4M\u013f^u\x89\xc4{(7\x8du\x03\u03d6H\x80a\u06fd\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4M\xc9\u057bK\x19\xce\u0354\xf1\x9e\xc2] \x0e\xa7/%\xd7\xed\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94M\xcd\x11\x81X\x18\xae)\xb8]\x016sI\xa8\xa7\xfb\x12\xd0k\x8a\x01\xacB\x86\x10\x01\x91\xf0\x00\x00\u07d4M\xcfb\xa3\xde?\x06\x1d\xb9\x14\x98\xfda\x06\x0f\x1fc\x98\xffs\x89lj\xccg\u05f1\xd4\x00\x00\u07d4M\xd11\xc7J\x06\x8a7\xc9\n\xde\xd4\xf3\t\xc2@\x9fdx\u04c9\x15\xaf9\u4ab2t\x00\x00\xe0\x94M\u0767Xk\"7\xb0S\xa7\xf3(\x9c\xf4`\xdcW\xd3z\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4M\xe3\xfe4\xa6\xfb\xf64\xc0Q\x99\u007fG\xcc\u007fHy\x1fX$\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4M\xf1@\xbaye\x85\xddT\x891[\xcaK\xbah\n\u06f8\x18\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4N\x02\ay\xb5\xdd\xd3\xdf\"\x8a\x00\xcbH\xc2\xfc\x97\x9d\xa6\xae8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4N\v\xd3$s\xc4\xc5\x1b\xf2VT\xde\xf6\x9fy|k)\xa22\x89V\xc9]\xe8\xe8\xca\x1d\x00\x00\u07d4N\"%\xa1\xbbY\xbc\x88\xa21ft\xd33\xb9\xb0\xaf\xcafU\x89\bg\x0e\x9e\xc6Y\x8c\x00\x00\u07d4N#\x10\x19\x1e\xad\x8d;\xc6H\x98s\xa5\xf0\xc2\xeck\x87\u1f8965\u026d\xc5\u07a0\x00\x00\u07d4N#-S\xb3\u6f8f\x89Sa\xd3\x1c4\xd4v+\x12\xc8.\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4N+\xfaJFo\x82g\x1b\x80\x0e\xeeBj\xd0\f\a\x1b\xa1p\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4N>\xda\u0506M\xabd\xca\xe4\xc5Azvw@S\xdcd2\x89 \b\xfbG\x8c\xbf\xa9\x80\x00\u07d4NC\x18\xf5\xe1>\x82JT\xed\xfe0\xa7\xedO&\xcd=\xa5\x04\x89lk\x93[\x8b\xbd@\x00\x00\u07d4N[w\xf9\x06aY\xe6\x15\x93?-\xdatw\xfaNG\xd6H\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94Nf\x00\x80b\x89EJ\u03630\xa2\xa3U`\x10\u07ec\xad\xe6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4Ns\xcf#y\xf1$\x86\x0fs\xd6\xd9\x1b\xf5\x9a\xcc\\\xfc\x84[\x89\x02,\xa3X|\xf4\xeb\x00\x00\xe0\x94Nz\xa6~\x12\x18>\xf9\xd7F\x8e\xa2\x8a\xd29\xc2\xee\xf7\x1bv\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\xe0\x94N{TGM\x01\xfe\xfd8\x8d\xfc\xd5;\x9ff&$A\x8a\x05\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94N\x89.\x80\x81\xbf6\xe4\x88\xfd\xdb;&0\xf3\xf1\xe8\xda0\u048a\x02\x8a\xba0u$Q\xfc\x00\x00\xe0\x94N\x8amcH\x9c\xcc\x10\xa5\u007f\x88_\x96\xeb\x04\xec\xbbT`$\x8a\x03\xea\xe3\x13\x0e\u0316\x90\x00\x00\u07d4N\x8eG\xae;\x1e\xf5\f\x9dT\xa3\x8e\x14 \x8c\x1a\xbd6\x03\u0089y(\xdb\x12vf\f\x00\x00\u0794N\x90\u03312X\xac\xaa\x9fO\xeb\xc0\xa3B\x92\xf9Y\x91\xe20\x88\xdbD\xe0I\xbb,\x00\x00\u07d4N\xa5n\x11\x12d\x1c\x03\x8d\x05e\xa9\u0096\xc4c\xaf\xef\xc1~\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\xe0\x94N\xa7\x0f\x041?\xaee\xc3\xff\"J\x05\\=-\xab(\xdd\u07ca\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4N\xb1EKW8\x05\u022c\xa3~\xde\xc7\x14\x9aA\xf6\x12\x02\xf4\x89\x10CV\x1a\x88)0\x00\x00\u07d4N\xb8{\xa8x\x8e\xba\r\xf8~[\x9b\xd5\n\x8eE6\x80\x91\xc1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4N\xbcV)\xf9\xa6\xa6k,\xf36:\u0109\\\x03H\u8fc7\x8967\tlK\xcci\x00\x00\u07d4N\xc7h)^\xea\xba\xfcB\x95\x84\x15\xe2+\xe2\x16\xcd\xe7v\x18\x89\x03;\x1d\xbc9\xc5H\x00\x00\u07d4N\xcc\x19\x94\x8d\xd9\u0347\xb4\xc7 \x1a\xb4\x8eu\x8f(\xe7\xccv\x89\x1b\x1d\xaba\u04ead\x00\x00\u07d4N\xd1M\x81\xb6\v#\xfb%\x05M\x89%\u07e5s\u072eah\x89\x12nr\xa6\x9aP\xd0\x00\x00\xe0\x94N\xe1<\rA \vF\u045d\xee\\K\xce\xc7\x1d\x82\xbb\x8e8\x8a\x01\xab\xee\x13\u033e\ufbc0\x00\u07d4N\xea\xd4\n\xad\x8cs\xef\b\xfc\x84\xbc\n\x92\xc9\t/j6\xbf\x89\x01s\x17\x90SM\xf2\x00\x00\u07d4N\xeb\xe8\f\xb6\xf3\xaeY\x04\xf6\xf4\xb2\x8d\x90\u007f\x90q\x89\xfc\xab\x89lj\xccg\u05f1\xd4\x00\x00\u07d4N\xeb\xf1 ]\f\xc2\f\xeel\u007f\x8f\xf3\x11_V\u050f\xba&\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4N\xf1\xc2\x14c:\xd9\xc0p;N#t\xa2\xe3>>B\x92\x91\x89Hz\x9a0E9D\x00\x00\u07d4N\xfc\xd9\u01df\xb43L\xa6${\n3\xbd\x9c\xc32\b\xe2r\x89Hz\x9a0E9D\x00\x00\xe0\x94O\x06$k\x8dK\u0496a\xf4>\x93v\"\x01\u0486\x93Z\xb1\x8a\x01\x059O\xfcF6\x11\x00\x00\u07d4O\x15+/\xb8e\x9dCwn\xbb\x1e\x81g:\xa8Ai\xbe\x96\x89lk\x93[\x8b\xbd@\x00\x00\u07d4O\x17\u007f\x9dV\x95=\xedq\xa5a\x1f93\"\xc3\x02y\x89\\\x89\rU\uf422\xda\x18\x00\x00\u07d4O\x1a-\xa5JLm\xa1\x9d\x14$\x12\xe5n\x81WA\xdb#%\x89\x05k\xc7^-c\x10\x00\x00\u07d4O#\xb6\xb8\x17\xff\xa5\xc6d\xac\xda\u05db\xb7\xb7&\xd3\n\xf0\xf9\x89_h\xe8\x13\x1e\u03c0\x00\x00\xe0\x94O&i\f\x99+z1*\xb1.\x13\x85\xd9J\xcdX(\x8e{\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4O+G\xe2wZ\x1f\xa7\x17\x8d\xad\x92\x98Z[\xbeI;\xa6\u0589\n\u05ce\xbcZ\xc6 \x00\x00\u07d4O:HT\x91\x11E\xea\x01\xc6D\x04K\xdb.Z\x96\n\x98/\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4O?,g0i\xac\x97\xc2\x026\a\x15)\x81\xf5\xcd`c\xa0\x89 \x86\xac5\x10R`\x00\x00\xe0\x94OJ\x9b\xe1\f\xd5\xd3\xfb]\xe4\x8c\x17\xbe)o\x89V\x90d[\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4OR\xadap\xd2[*.\x85\x0e\xad\xbbRA?\xf20>\u007f\x89\xa4\xccy\x95c\u00c0\x00\x00\u07d4OX\x01\xb1\xeb0\xb7\x12\u0620WZ\x9aq\xff\x96]O4\xeb\x89\x10CV\x1a\x88)0\x00\x00\u07d4O]\xf5\xb9CW\u0794\x86\x04\xc5\x1bx\x93\xcd\xdf`v\xba\xad\x89\xcb\xd4{n\xaa\x8c\xc0\x00\x00\u07d4Od\xa8^\x8e\x9a@I\x8c\fu\xfc\xeb\x037\xfbI\b>^\x8965\u026d\xc5\u07a0\x00\x00\u07d4Og9m%S\xf9\x98x_pN\a\xa69\x19}\u0454\x8d\x89\x10DrR\x1b\xa78\x00\x00\u07d4OmG7\u05e9@8$\x87&H\x86i|\xf7c\u007f\x80\x15\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4Os0\toy\xed&N\xe0\x12\u007f]0\xd2\xf7?!\xcb\u007f\x04\x89\x04\x82\xfe&\f\xbc\xa9\x00\x00\u07d4O\xeeP\xc5\xf9\x88 k\t\xa5sF\x9f\xb1\u0434.\xbbm\u0389l\xee\x06\u077e\x15\xec\x00\x00\u07d4O\xf6v\xe2\u007fh\x1a\x98-\x8f\xd9\xd2\x0ed\x8b=\xce\x05\xe9E\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4O\xf6\u007f\xb8\u007fn\xfb\xa9'\x990\u03fd\x1bz4L\u057a\x8bN\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94PFf\u03891\x17^\x11\xa5\xed\x11\xc1\u072a\x06\xe5\u007fNf\x8a\x02\u007f>\u07f3Nn@\x00\x00\u0794PXM\x92\x06\xa4l\xe1\\0\x11\x17\xee(\xf1\\0\xe6\x0eu\x88\xb9\xf6]\x00\xf6<\x00\x00\xe0\x94PZ3\xa1\x864\xddH\x00i)\x13N\x00\x00\u07d4P\u0286\xb5\xeb\x1d\x01\x87M\xf8\xe5\xf3IE\u051cl\x1a\xb8H\x8965\u026d\xc5\u07a0\x00\x00\u07d4P\u0357\xe97\x8b\\\xf1\x8f\x179c#l\x99Q\xeft8\xa5\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4P\u073c'\xbc\xad\x98@\x93\xa2\x12\xa9\xb4\x17\x8e\xab\xe9\x01ua\x89\a\xe3by\v\\\xa4\x00\x00\u07d4P\xe10#\xbd\x9c\xa9j\xd4\xc5?\xdf\xd4\x10\xcbk\x1fB\v\u07c9\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94P\xe1\xc8\xec\x98A[\xefD&\x18p\x87\x99C{\x86\xe6\xc2\x05\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4P\xf8\xfaK\xb9\xe2g|\x99\nN\xe8\xcep\xdd\x15#%\x1eO\x89\x01i=#\x16Ok\x00\x00\u07d4P\xfb6\xc2q\a\xee,\xa9\xa3#n'F\u0321\x9a\xcekI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4P\xfe\xf2\x96\x95U\x88\u02aet\xc6.\xc3*#\xa4T\xe0\x9a\xb8\x89A\x1d\xff\xab\xc5\a8\x00\x00\u07d4Q\x02\xa4\xa4 w\xe1\x1cX\xdfGs\u3b14F#\xa6m\x9f\x89lp\x15\xfdR\xed@\x80\x00\u07d4Q\x03\x93w\xee\xd0\xc5s\xf9\x86\xc5\xe8\xa9_\xb9\x9aY\xe93\x0f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4Q\x03\xbc\t\x93>\x99!\xfdS\xdcSo\x11\xf0]\rG\x10}\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94Q\x04\xec\xc0\xe30\xdd\x1f\x81\xb5\x8a\xc9\u06f1\xa9\xfb\xf8\x8a<\x85\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4Q\r\x81Y\u0314Wh\xc7E\a\x90\xba\a>\xc0\xd9\xf8\x9e0\x89\x8a\xc7#\x04\x89\xe8\x00\x00\x00\u07d4Q\x0e\xdaV\x01I\x9a\r^\x1a\x00k\xff\xfd\x836r\xf2\xe2g\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\x12dF\xab=\x802U~\x8e\xbaeY}u\xfa\u0701\\\x89\x11t\xa5\xcd\xf8\x8b\xc8\x00\x00\xe0\x94Q\x18U}`\r\x05\xc2\xfc\xbf8\x06\xff\xbd\x93\xd0 %\xd70\x8a\x02g\u04ebd#\xf5\x80\x00\x00\u07d4Q\x1e\x0e\xfb\x04\xacN?\xf2\xe6U\x0eI\x82\x95\xbf\xcdV\xff\u0549$=M\x18\"\x9c\xa2\x00\x00\u07d4Q!\x16\x81{\xa9\xaa\xf8C\xd1P|e\xa5\xead\n{\x9e\xec\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4Q&F\ri,q\u026fo\x05WM\x93\x99\x83h\xa27\x99\x89\x02\u0465\x1c~\x00P\x00\x00\u07d4Q'\u007f\xe7\xc8\x1e\xeb\xd2R\xa0=\xf6\x9ak\x9f2n'\"\a\x89\x03@.y\u02b4L\x80\x00\u07d4Q)oPD'\r\x17pvF\x12\x9c\x86\xaa\xd1d^\xad\xc1\x89H|r\xb3\x10\xd4d\x80\x00\xe0\x94Q+\x91\xbb\xfa\xa9\xe5\x81\xefh?\xc9\r\x9d\xb2*\x8fI\xf4\x8b\x8aA\xa5\"8m\x9b\x95\xc0\x00\x00\u07d4Q5\xfb\x87W`\f\xf4tTbR\xf7M\xc0tm\x06&,\x89lk\x93[\x8b\xbd@\x00\x00\u07d4QF2\xef\xbdd,\x04\xdel\xa3B1]@\u0750\xa2\u06e6\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4QKu\x12\u026e^\xa6<\xbf\x11q[c\xf2\x1e\x18\u0496\xc1\x89lj\xccg\u05f1\xd4\x00\x00\u07d4QS\xa0\xc3\u0211(\x81\xbf\x1c5\x01\xbfd\xb4VI\xe4\x82\"\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94QVQ\xd6\xdbO\xaf\x9e\xcd\x10:\x92\x1b\xbb\xbej\xe9p\xfd\u050a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94Q_0\xbc\x90\xcd\xf4W~\xe4}e\u05c5\xfb\xe2\xe87\u01bc\x8a\x02'\x1b^\x01\x8b\xa0X\x00\x00\u07d4Q`\xeda.\x1bH\xe7??\xc1[\xc42\x1b\x8f#\xb8\xa2K\x89\x1e\x82kB(e\xd8\x00\x00\u07d4Qa\xfdI\xe8G\xf6tU\xf1\u023bz\xbb6\xe9\x85&\r\x03\x89A\rXj \xa4\xc0\x00\x00\u07d4QiT\x02_\xca&\b\xf4}\xa8\x1c!^\xed\xfd\x84J\t\xff\x89\x14\xb5P\xa0\x13\xc78\x00\x00\u07d4Qi\xc6\n\xeeL\xee\u0444\x9a\xb3mfL\xff\x97\x06\x1e\x8e\xa8\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4Q|uC\r\xe4\x01\xc3A\x03&\x86\x11'\x90\xf4mM6\x9e\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4Q|\xd7`\x8e]\r\x83\xa2kq\u007f6\x03\xda\xc2'}\u00e4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\x86]\xb1H\x88\x19Q\xf5\x12Qq\x0e\x82\xb9\xbe\r~\xad\xb2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\x89\x1b,\xcd\xd2\xf5\xa4K*\x8b\u011a]\x9b\xcadw%\x1c\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4Q\x8c\xef'\xb1\x05\x82\xb6\xd1OiH=\u06a0\xdd<\x87\xbb\\\x89 \x86\xac5\x10R`\x00\x00\u07d4Q\xa6\xd6'\xf6j\x89#\u060d`\x94\xc4qS\x80\xd3\x05|\xb6\x89>s\xd2z5\x94\x1e\x00\x00\u07d4Q\xa8\xc2\x166\x02\xa3.\xe2L\xf4\xaa\x97\xfd\x9e\xa4\x14QiA\x89\x03h\xf7\xe6\xb8g,\x00\x00\u07d4Q\xb4u\x8e\x9e\x14P\xe7\xafBh\xc3\u01f1\xe7\xbdo\\uP\x8965\u026d\xc5\u07a0\x00\x00\u07d4Q\u028b\xd4\xdcdO\xacG\xafgUc\u0540J\r\xa2\x1e\xeb\x89*\xb7\xb2`\xff?\xd0\x00\x00\u07d4Q\xd2K\xc3so\x88\xddc\xb7\" &\x88f0\xb6\ub1cd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\u05cb\x17\x8dp~9n\x87\x10\x96\\OA\xb1\xa1\xd9\x17\x9d\x89\x05\xfe\xe2\"\x04\x1e4\x00\x00\u07d4Q\xe3/\x14\xf4\xca^(|\xda\xc0W\xa7y^\xa9\xe0C\x99S\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Q\xe4?\xe0\xd2\\x(`\xaf\x81\xea\x89\xddy<\x13\xf0\u02f1\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4Q\xe7\xb5\\/\x98 \xee\xd78\x846\x1bPf\xa5\x9boE\u0189lk\x93[\x8b\xbd@\x00\x00\xe0\x94Q\xea\x1c\t4\xe3\xd0@\"\ud715\xa0\x87\xa1P\xefp^\x81\x8a\x01Tp\x81\xe7\"M \x00\x00\u07d4Q\xee\f\xca;\xcb\x10\xcd>\x987\"\xce\xd8I=\x92l\bf\x8965f3\xeb\xd8\xea\x00\x00\xe0\x94Q\xf4f:\xb4O\xf7\x93E\xf4'\xa0\xf6\xf8\xa6\u0225?\xf24\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Q\xf5^\xf4~dV\xa4\x18\xab2\xb9\"\x1e\xd2}\xbaf\b\xee\x89\u3bb5sr@\xa0\x00\x00\xe0\x94Q\xf9\xc42\xa4\xe5\x9a\xc8b\x82\u05ad\xabL.\xb8\x91\x91`\xeb\x8ap;[\x89\u00e6\xe7@\x00\x00\u07d4R\x0ff\xa0\xe2e\u007f\xf0\xacA\x95\xf2\xf0d\xcf/\xa4\xb2BP\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4R\x10#T\xa6\xac\xa9]\x8a.\x86\xd5\u07bd\xa6\xdei4`v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R\x13\xf4Y\xe0x\xad:\xb9Z\t #\x9f\xcf\x163\xdc\x04\u0289\x8c\xf2\x18|*\xfb\x18\x80\x00\u07d4R\x15\x18;\x8f\x80\xa9\xbc\x03\xd2l\xe9\x12\a\x83*\r9\xe6 \x8965\u026d\xc5\u07a0\x00\x00\xe0\x94R!Cx\xb5@\x04\x05j|\xc0\x8c\x89\x13'y\x8a\u01b2H\x8a\x037\xfe_\xea\xf2\u0440\x00\x00\xe0\x94R##\xaa\xd7\x1d\xbc\x96\xd8Z\xf9\x0f\bK\x99\xc3\xf0\x9d\ucdca\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4R>\x14\r\xc8\x11\xb1\x86\xde\xe5\xd6\u020b\xf6\x8e\x90\xb8\xe0\x96\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R?mdi\x0f\xda\u0354(SY\x1b\xb0\xff \xd3em\x95\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4RO\xb2\x10R,^#\xbbg\u07ff\x8c&\xaaam\xa4\x99U\x8965b\xa6m4#\x80\x00\u07d4RU\xdci\x15ZE\xb9p\xc6\x04\xd3\x00G\xe2\xf50i\x0e\u007f\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4R`\xdcQ\xee\a\xbd\u06ab\xab\xb9\xeetK9<\u007fG\x93\xa6\x89\x01\xd8f_\xa5\xfaL\x00\x00\u07d4Rg\xf4\xd4\x12\x92\xf3p\x86<\x90\u05d3)i\x03\x846%\u01c9K\xe4\xe7&{j\xe0\x00\x00\u07d4Rk\xb53\xb7n \xc8\xee\x1e\xbf\x12?\x1e\x9f\xf4\x14\x8e@\xbe\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4Rl\xb0\x9c\u3b63g.\xec\x1d\xebF [\xe8\x9aKV>\x89\x85\xcaa[\xf9\xc0\x10\x00\x00\u07d4Rs\x8c\x90\xd8`\xe0L\xb1/I\x8d\x96\xfd\xb5\xbf6\xfc4\x0e\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4Rz\x8c\xa1&\x863\xa6\xc99\xc5\xde\x1b\x92\x9a\ue4ae\xac\x8d\x890\xca\x02O\x98{\x90\x00\x00\u07d4R\x81\x01\xceF\xb7 \xa2!M\u036ef\x18\xa51w\xff\xa3w\x89\x1b\x96\x12\xb9\xdc\x01\xae\x00\x00\xe0\x94R\x81s4s\xe0\r\x87\xf1\x1e\x99U\u5275\x9fJ\u008ez\x8a\x8b\xd6/\xf4\xee\xc5Y \x00\x00\u07d4R\x98\xab\x18*\x195\x9f\xfc\xec\xaf\xd7\u0475\xfa!-\xed\xe6\u0749\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4R\x9a\xa0\x02\u0196*:\x85E\x02\u007f\u0630_\"\xb5\xbf\x95d\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4R\x9e\x82O\xa0rX+@2h:\xc7\xee\xcc\x1c\x04\xb4\xca\xc1\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94R\xa5\xe4\xdeC\x93\xee\xcc\xf0X\x1a\xc1\x1bR\u0183\xc7n\xa1]\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4R\xb4%|\xf4\x1bn(\x87\x8dP\xd5{\x99\x91O\xfa\x89\x87:\x89\xd5\r\u026a,Aw\x00\x00\u07d4R\xb8\xa9Y&4\xf70\v|\\Y\xa34[\x83_\x01\xb9\\\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R\xbd\u066fYx\x85\v\xc2A\x10q\x8b7#u\x9bC~Y\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4R\xcd @;\xa7\xed\xa6\xbc0z=c\xb5\x91\x1b\x81|\x12c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794R\u04c0Q\x1d\xf1\x9d^\u0080{\xbc\xb6vX\x1bg\xfd7\xa3\x88\xb9\xf6]\x00\xf6<\x00\x00\xe0\x94R\xe1s\x13P\xf9\x83\xcc,A\x89\x84/\xde\x06\x13\xfa\xd5\f\xe1\x8a\x02w\x01s8\xa3\n\xe0\x00\x00\u07d4R\xe4g\x832\x9av\x93\x01\xb1u\x00\x9d4gh\xf4\xc8~\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R\xf0X\xd4aG\xe9\x00m)\xbf,\t0J\xd1\xcd\xddn\x15\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4R\xf1T#2<$\xf1\x9a\xe2\xabg7\x17\"\x9d?t}\x9b\x897\xa04\xcb\xe8\xe3\xf3\x80\x00\u07d4R\xf8\xb5\t\xfe\xe1\xa8t\xabo\x9d\x876\u007f\xbe\xaf\x15\xac\x13\u007f\x8965\u026d\xc5\u07a0\x00\x00\u07d4R\xfbF\xac]\x00\xc3Q\x8b,:\x1c\x17}D/\x81eU_\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4S\x00w\xc9\xf7\xb9\a\xff\x9c\xec\fw\xa4\x1ap\xe9\x02\x9a\xddJ\x89lk\x93[\x8b\xbd@\x00\x00\u07d4S\x03\x19\xdb\n\x8f\x93\xe5\xbb}M\xbfH\x161O\xbe\xd86\x1b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4S\x04}\u022c\x90\x83\xd9\x06r\xe8\xb3G<\x10\f\xcd'\x83#\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4S\va\xe4/9Bm$\b\xd4\bR\xb9\xe3J\xb5\xeb\xeb\u0149\x0e~\xeb\xa3A\vt\x00\x00\u07d4S\x0f\xfa\u00fc4\x12\xe2\xec\x0e\xa4{y\x81\xc7p\xf5\xbb/5\x89\a?u\u0460\x85\xba\x00\x00\u07d4S\x17\xec\xb0#\x05,\xa7\xf5e+\xe2\xfa\x85L\xfeEc\xdfM\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4S\x19M\x8a\xfa>\x885\x02v~\xdb\xc3\x05\x86\xaf3\xb1\x14\u04c9lk\x93[\x8b\xbd@\x00\x00\u07d4S*}\xa0\xa5\xadt\aF\x8d;\xe8\xe0~i\xc7\xddd\xe8a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4S-2\xb0\x0f0[\xcc$\xdc\xefV\x81}b/4\xfb,$\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4S4DX@\x82\xeb\xa6T\xe1\xad0\xe1Is\\o{\xa9\"\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4S8\xefp\xea\xc9\u075a\xf5\xa0P;^\xfa\xd1\x03\x9eg\xe7%\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94S9oJ&\u00b4`D\x960lTB\xe7\xfc\xba'.6\x8a\x04?/\b\xd4\x0eZ\xfc\x00\x00\xe0\x94S:s\xa4\xa2\"\x8e\xee\x05\xc4\xff\xd7\x18\xbb\xf3\xf9\xc1\xb1)\xa7\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4S<\x06\x92\x8f\x19\u0429V\xcc(\x86k\xf6\xc8\xd8\xf4\x19\x1a\x94\x89\x0f\xd8\xc1C8\xe60\x00\x00\u07d4S@e6\x1c\xb8T\xfa\xc4+\xfb\\\x9f\xcd\xe0`J\xc9\x19\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4SC\u007f\xec\xf3J\xb9\xd45\xf4\u07b8\xca\x18\x15\x19\xe2Y 5\x89\n1\x06+\xee\xedp\x00\x00\u07d4SR\x01\xa0\xa1\xd74\"\x80\x1fU\xde\xd4\u07ee\xe4\xfb\xaan;\x89\x02&!\x1fy\x15B\x80\x00\xe0\x94S`\x81\x05\xceK\x9e\x11\xf8k\xf4\x97\xff\xca;x\x96{_\x96\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4SnM\x80)\xb7?Uy\u0723>p\xb2N\xba\x89\xe1\x1d~\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4Sp\rS%MC\x0f\"x\x1aJv\xa4c\x93;]k\b\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94S\u007f\x9dM1\xefp\x83\x9d\x84\xb0\xd9\u0377+\x9a\xfe\xdb\xdf5\x8a\x0e\u04b5%\x84\x1a\xdf\xc0\x00\x00\xe0\x94S\x81D\x85\x03\xc0\xc7\x02T+\x1d\xe7\xcc_\xb5\xf6\xab\x1c\xf6\xa5\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94S\x94.yI\xd6x\x8b\xb7\x80\xa7\xe8\xa0y'\x81\xb1aK\x84\x8a\x03]\xebFhO\x10\xc8\x00\x00\u07d4S\x95\xa4E]\x95\xd1x\xb4S*\xa4r[\x19?\xfeQ)a\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94S\x98\x9e\xd30V?\xd5}\xfe\u027d4<7`\xb0y\x93\x90\x8a\x01P\x89N\x84\x9b9\x00\x00\x00\u07d4S\xa2Dg(\x95H\x0fJ+\x1c\xdf}\xa5\xe5\xa2B\xecM\xbc\x8965\u026d\xc5\u07a0\x00\x00\u07d4S\xa7\x14\xf9\x9f\xa0\x0f\xefu\x8e#\xa2\xe7F2m\xad$|\xa7\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4S\xaf2\xc2/\uf640?\x17\x8c\xf9\v\x80/\xb5q\xc6\x1c\xb9\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4S\xc0\xbb\u007f\u020e\xa4\"\xd2\xef~T\x0e-\x8f(\xb1\xbb\x81\x83\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94S\xc5\xfe\x01\x19\xe1\xe8Hd\f\xee0\xad\ua594\x0f*]\x8b\x8a\x04\x9a\xda_\xa8\xc1\f\x88\x00\x00\u07d4S\xc9\xec\xa4\ts\xf6;\xb5\x92{\xe0\xbcj\x8a\x8b\xe1\x95\x1ft\x89lk\x93[\x8b\xbd@\x00\x00\u07d4S\u0388\xe6lZ\xf2\U0009bf4fY*V\xa3\xd1_ l2\x89\a\xa2\x8c1\xcc6\x04\x00\x00\u07d4S\xce\xc6\u0200\x92\xf7V\xef\xe5o}\xb1\x12(\xa2\xdbE\xb1\"\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4S\xe3[\x12#\x1f\x19\xc3\xfdwL\x88\xfe\xc8\xcb\xee\xdf\x14\b\xb2\x89\x1b\xc1mgN\xc8\x00\x00\x00\u07d4S\xe4\xd9im\xcb?M{?p\u072aN\xec\xb7\x17\x82\xff\\\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4S\xfa\xf1e\xbe\x03\x1e\xc1\x830\xd9\xfc\xe5\xbd\x12\x81\xa1\xaf\b\u06c9\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4T\n\x18\x19\xbd|5\x86\x1ey\x18\x04\xe5\xfb\xb3\xbc\x97\u026b\xb1\x89N\xd7\xda\xc6B0 \x00\x00\xe0\x94T\f\a(\x02\x01N\xf0\xd5a4Z\xecH\x1e\x8e\x11\xcb5p\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94T\f\xf2=\xd9\\MU\x8a'\x9dw\x8d+75\xb3\x16A\x91\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4T\x10`\xfcX\xc7P\xc4\x05\x12\xf83i\xc0\xa63@\xc1\"\xb6\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4T\x13\xc9\u007f\xfaJn*{\xba\x89a\u071f\u03850\xa7\x87\u05c965\u026d\xc5\u07a0\x00\x00\u07d4T\x1d\xb2\n\x80\xcf;\x17\xf1b\x1f\x1b?\xf7\x9b\x88/P\xde\xf3\x8965\u026d\xc5\u07a0\x00\x00\u07d4T.\x80\x96\xba\xfb\x88\x16&\x06\x00.\x8c\x8a>\u0458\x14\xae\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T1\v:\xa8\x87\x03\xa7%\u07e5}\xe6\xe6F\x93Qd\x80,\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4T1\xb1\u0447Q\xb9\x8f\xc9\u220a\xc7u\x9f\x155\xa2\xdbG\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T1\xcaB~ae\xa6D\xba\xe3&\xbd\tu\n\x17\x8ce\r\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T5\xc6\xc1y3\x17\xd3,\xe1;\xbaLO\xfe\xb9s\xb7\x8a\u0709\r\x8ek\x1c\x12\x85\xef\x00\x00\xe0\x94T6)\xc9\\\xde\xf4(\xad7\xd4S\u02958\xa9\xf9\t\x00\xac\x8a\t(\x96R\x9b\xad\u0708\x00\x00\u07d4T9\x1bM\x17mGl\xea\x16N_\xb55\u0197\x00\xcb%5\x89\x05l\xd5_\xc6M\xfe\x00\x00\xe0\x94T:\x8c\x0e\xfb\x8b\xcd\x15\xc5C\u29a4\xf8\aYv1\xad\xef\x8a\x01?\x80\xe7\xe1O-D\x00\x00\u07d4T?\x8cgN$b\xd8\xd5\u06a0\xe8\x01\x95\xa8p\x8e\x11\xa2\x9e\x89\x03wX\x83;:z\x00\x00\xe0\x94TK[5\x1d\x1b\xc8.\x92\x97C\x99H\xcfHa\xda\u026e\x11\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4TM\xdaB\x1d\xc1\xebs\xbb$\xe3\xe5j$\x80\x13\xb8|\x0fD\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4TW\\1\x14u\x1e\x14o\xfe\u00c7nE\xf2\x0e\xe8AJ\u07ba\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4T\xb4B\x9b\x18/\x03w\xbe~bi9\xc5\xdbd@\xf7]z\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4T\xbc\xb8\xe7\xf7<\xda=s\xf4\u04cb-\bG\xe6\x00\xba\r\xf8\x89:pAX\x82\xdf\x18\x00\x00\u07d4T\xc9>\x03\xa9\xb2\xe8\xe4\xc3g(5\xa9\xeev\xf9a[\xc1N\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4T\u0388'YV\xde\xf5\xf9E\x8e;\x95\xde\xca\xcdH@!\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T\xdb^\x06\xb4\x81]1\xcbV\xa8q\x9b\xa3:\xf2\xd7>rR\x89$R\x1e*0\x17\xb8\x00\x00\xe0\x94T\xe0\x12\x83\u030b8E8\xdddgp\xb3W\xc9`\xd6\xca\u034a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4T\xecs\x00\xb8\x1a\xc8C3\xed\x1b\x03<\xd5\u05e39r\xe24\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4T\xfe\xbc\xce \xfez\x90\x98\xa7U\xbd\x90\x98\x86\x02\xa4\x8c\b\x9e\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\u07d4U\n\xad\xae\x12!\xb0z\xfe\xa3\x9f\xba.\xd6.\x05\u5df5\xf9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4U\f0o\x81\xef]\x95\x80\xc0l\xb1\xab \x1b\x95\xc7H\xa6\x91\x89$\x17\xd4\xc4p\xbf\x14\x00\x00\xe0\x94U\x19\x99\xdd\xd2\x05V3'\xb9\xb50xZ\xcf\xf9\xbcs\xa4\xba\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4U\x1ew\x84w\x8e\xf8\xe0H\xe4\x95\xdfI\xf2aO\x84\xa4\xf1\u0709 \x86\xac5\x10R`\x00\x00\xe0\x94U)\x83\na\xc1\xf1<\x19~U\v\xed\xdf\u05bd\x19\\\x9d\x02\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4U)\x87\xf0e\x1b\x91[.\x1eS(\xc1!\x96\rK\xddj\xf4\x89a\t=|,m8\x00\x00\u07d4U;k\x1cW\x05\x0e\x88\xcf\f1\x06{\x8dL\xd1\xff\x80\xcb\t\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4U?7\xd9$fU\x0e\x9f\xd7u\xaet6-\xf00\x17\x912\x89lk\x93[\x8b\xbd@\x00\x00\u07d4UC6\xeeN\xa1U\xf9\xf2O\x87\xbc\xa9\xcar\xe2S\xe1,\u0489\x05k\xc7^-c\x10\x00\x00\u0794UC\xddm\x16\x9e\xec\x8a!;\xbfz\x8a\xf9\xff\xd1]O\xf7Y\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4UG\xfd\xb4\xae\x11\x95>\x01)+x\a\xfa\x92#\xd0\xe4`j\x89\x05]\x11}\xcb\x1d&\x00\x00\u07d4UR\xf4\xb3\xed>\x1d\xa7\x9a/x\xbb\x13\xe8\xaeZh\xa9\xdf;\x8965\u026d\xc5\u07a0\x00\x00\u07d4U\\\xa9\xf0\\\xc14\xabT\xae\x9b\xea\x1c?\xf8z\xa8Q\x98\u0289\x05k\xc7^-c\x10\x00\x00\xe0\x94U]\x8d<\xe1y\x8a\u0290'T\xf1d\xb8\xbe*\x022\x9cl\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4U]\xf1\x93\x90\xc1m\x01)\x87r\xba\xe8\xbc:\x11R\x19\x9c\xbd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4U^\xbe\x84\u06a4+\xa2V\xeax\x91\x05\xce\u0136\x93\xf1/\x18\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94U\u007f^e\xe0\xda3\x99\x82\x19\xadN\x99W\x05E\xb2\xa9\xd5\x11\x8a\x02U\x9c\xbb\x98XB@\x00\x00\u07d4U\x83` h\x83\xdd\x1bmJYc\x9eV)\xd0\xf0\xc6u\u0409lk\x93[\x8b\xbd@\x00\x00\u07d4U\x84B0P\xe3\xc2\x05\x1f\v\xbd\x8fD\xbdm\xbc'\xec\xb6,\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4U\x85)CI)p\xf8\xd6)\xa1Sf\xcd\xda\x06\xa9OE\x13\x89lk\x93[\x8b\xbd@\x00\x00\u0794U\x86d\x86\xec\x16\x8fy\xdb\xe0\u1af1\x88d\u0649\x91\xae,\x88\xdfn\xb0\xb2\xd3\xca\x00\x00\u07d4U\x8cTd\x9a\x8an\x94r+\xd6\xd2\x1d\x14qOqx\x054\x89lk\x93[\x8b\xbd@\x00\x00\u07d4U\x91\x940O\x14\xb1\xb9:\xfeDO\x06$\xe0S\xc2:\x00\t\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4U\x93\xc9\u0536ds\x0f\xd9<\xa6\x01Q\xc2\\.\xae\xd9<;\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4U\x97\x06\xc32\xd2\ay\xc4_\x8am\x04ji\x91Y\xb7I!\x89\x14\x9bD.\x85\xa3\u03c0\x00\u07d4U\x98\xb3\xa7\x9aH\xf3+\x1f_\xc9\x15\xb8{d]\x80]\x1a\xfe\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4U\xa3\xdfW\xb7\xaa\xec\x16\xa1b\xfdS\x16\xf3[\xec\b(!\u03c9j\xcb=\xf2~\x1f\x88\x00\x00\u07d4U\xa4\xca\xc0\u02cbX-\x9f\xef8\xc5\xc9\xff\xf9\xbdS\t=\x1f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4U\xa6\x1b\x10\x94\x80\xb5\xb2\xc4\xfc\xfd\xef\x92\xd9\x05\x84\x16\f\r5\x89\x02lVM+S\xf6\x00\x00\u07d4U\xaa]1>\xbb\bM\xa0\xe7\x80\x10\x91\u2792\xc5\xde\u00ea\x89lk\x93[\x8b\xbd@\x00\x00\u07d4U\xab\x99\xb0\xe0\xe5]{\xb8t\xb7\xcf\xe84\xdec\x1c\x97\xec#\x897\xe9\x8c\xe3h\x99\xe4\x00\x00\u07d4U\xaf\t/\x94\xbajy\x91\x8b\f\xf99\xea\xb3\xf0\x1b?Q\u01c9\b \xd5\xe3\x95v\x12\x00\x00\u07d4U\xc5dfAf\xa1\xed\xf3\x91>\x01i\xf1\xcdE\x1f\xdb]\f\x89\x82\x17\xeaIP\x8el\x00\x00\xe0\x94U\xcaj\xbey\xea$\x97\xf4o\u06f804`\x10\xfeF\x9c\xbe\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4U\xca\xffK\xba\x04\xd2 \u0265\xd2\x01\x86r\xec\x85\xe3\x1e\xf8>\x89lk\x93[\x8b\xbd@\x00\x00\u07d4U\xd0W\xbc\xc0K\xd0\xf4\xaf\x96BQ:\xa5\t\v\xb3\xff\x93\xfe\x89;\xfeE,\x8e\xddL\x00\x00\u07d4U\xd4.\xb4\x95\xbfF\xa64\x99{_.\xa3b\x81I\x18\u2c09\x05\xc0\xd2e\xb5\xb2\xa8\x00\x00\u07d4U\u069d\xcd\xcaa\xcb\xfe\x1f\x13<{\xce\xfc\x86{\x9c\x81\"\xf9\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4U\xe2 \x87bb\xc2\x18\xafOVxG\x98\xc7\xe5]\xa0\x9e\x91\x89\a=\x99\xc1VE\xd3\x00\x00\u07d4U\xfd\b\u0440d\xbd ,\x0e\xc3\xd2\xcc\xe0\xce\v\x9d\x16\x9cM\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4V\x00s\nU\xf6\xb2\x0e\xbd$\x81\x1f\xaa=\xe9m\x16b\xab\xab\x89e\xea=\xb7UF`\x00\x00\u07d4V\x03$\x1e\xb8\xf0\x8fr\x1e4\x8c\x9d\x9a\xd9/H\u342a$\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4V\x056yJ\x9e+\x00I\xd1\x023\xc4\x1a\xdc_A\x8a&J\x8965\u026d\xc5\u07a0\x00\x00\u07d4V\aY\x00Y\xa9\xfe\xc1\x88\x11I\xa4K6\x94\x9a\xef\x85\xd5`\x89lk\x93[\x8b\xbd@\x00\x00\u07d4V\v\xec\xdfR\xb7\x1f=\x88'\xd9'a\x0f\x1a\x98\x0f3qo\x89\x17GMp_V\u0400\x00\xe0\x94V\r\xa3~\x95m\x86/\x81\xa7_\u0540\xa7\x13\\\x1b$cR\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94V\x0f\xc0\x8d\a\x9f\x04~\xd8\xd7\xdfuU\x1a\xa55\x01\xf5p\x13\x8a\x01\x9b\xff/\xf5yh\xc0\x00\x00\u07d4V\x1b\xe9)\x9b>k>c\xb7\x9b\t\x16\x9d\x1a\x94\x8a\xe6\xdb\x01\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94V \xe3\xedy-/\x185\xfe_UA}Q\x11F\fj\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4V \xf4m\x14Q\xc25=bC\xa5\u0534'\x13\v\xe2\xd4\a\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94V!\x05\xe8+\t\x975\xdeI\xf6&\x92\u0307\xcd8\xa8\xed\u034a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94V*\x8d\u02fe\xee\xf7\xb3`h]'0;\u059e\tJ\xcc\xf6\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4V+\xce\u04ca\xb2\xabl\b\x0f;\x05A\xb8Enp\x82K?\x89\"\xca5\x87\xcfN\xb0\x00\x00\xe0\x94V+\xe9Z\xba\x17\xc57\x1f\u2e82\x87\x99\xb1\xf5]!w\u058a\b\x16\xd3~\x87\xb9\xd1\xe0\x00\x00\u07d4V/\x16\u05da\xbf\xce\u00d4>4\xb2\x0f\x05\xf9{\xdf\u0366\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4V7=\xaa\xb4c\x16\xfd~\x15v\xc6\x1ej\xff\xcbeY\xdd\u05c9\v\xacq]\x14l\x9e\x00\x00\u07d4V9v8\xbb<\xeb\xf1\xf6 byK^\xb9B\xf9\x16\x17\x1d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4V:\x03\xab\x9cV\xb6\x00\xf6\xd2[f\f!\xe1c5Qzu\x8965\u026d\xc5\u07a0\x00\x00\u07d4V<\xb8\x80<\x1d2\xa2['\xb6A\x14\x85+\xd0M\x9c \u0349\v\x14\x9e\xad\n\xd9\xd8\x00\x00\u07d4VXc\x91\x04\fW\xee\xc6\xf5\xaf\xfd\x8c\u052b\xde\x10\xb5\n\u0309\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4Vl\x10\xd68\u8e0bG\xd6\xe6\xa4\x14Iz\xfd\xd0\x06\x00\u0509\x05k9Bc\xa4\f\x00\x00\u07d4Vl(\xe3L8\b\xd9vo\xe8B\x1e\xbfO+\x1cO}w\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4V\x8d\xf3\x18Vi\x9b\xb5\xac\xfc\x1f\xe1\u0580\u07d9`\xcaCY\x89J\xcfUR\xf3\xb2I\x80\x00\u07d4V\x91\xdd/gE\xf2\x0e\"\xd2\xe1\u0479U\xaa)\x03\xd6VV\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4V\xa1\xd6\r@\xf5\u007f0\x8e\xeb\xf0\x87\xde\xe3\xb3\u007f\x1e|,\xba\x89>\u072e\xc8-\x06\xf8\x00\x00\u07d4V\xac \xd6;\xd8\x03Y\\\xec\x03m\xa7\xed\x1d\xc6n\n\x9e\a\x89\x03w*S\xcc\xdce\x80\x00\u07d4V\xb6\xc2=\xd2\uc434r\x8f;\xb2\xe7d\xc3\xc5\f\x85\xf1D\x8965\u026d\xc5\u07a0\x00\x00\u07d4V\xdf\x05\xba\xd4l?\x00\xaeGn\xcf\x01{\xb8\xc8w8?\xf1\x89\n\xb1]\xaa\xefp@\x00\x00\u07d4V\xee\x19\u007fK\xbf\x9f\x1b\x06b\xe4\x1c+\xbd\x9a\xa1\xf7\x99\xe8F\x8965\u026d\xc5\u07a0\x00\x00\u07d4V\xf4\x93\xa3\xd1\b\xaa\xa2\u044d\x98\x92/\x8e\xfe\x16b\u03f7=\x89m\x81!\xa1\x94\xd1\x10\x00\x00\u07d4V\xfc\x1a{\xad@G#|\xe1\x16\x14b\x96#\x8e\a\x8f\x93\xad\x89\t\xa6?\b\xeac\x88\x00\x00\u07d4V\xfe\xbf\x9e\x10\x03\xaf\x15\xb1\xbdI\a\xec\b\x9aJ\x1b\x91\xd2h\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4W\x17\u0313\x01Q\x1dJ\x81\xb9\xf5\x83\x14\x8b\xee\xd3\xd3\u0303\t\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4W\x17\xf2\xd8\xf1\x8f\xfc\xc0\xe5\xfe$}:B\x19\x03|:d\x9c\x89\u063beI\xb0+\xb8\x00\x00\u07d4W\x19P\xea,\x90\xc1B}\x93\x9da\xb4\xf2\xdeL\xf1\u03ff\xb0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4W\x19\xf4\x9br\r\xa6\x88V\xf4\xb9\xe7\b\xf2VE\xbd\xbcKA\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\u07d4W*\xc1\xab\xa0\xde#\xaeA\xa7\xca\xe1\xdc\bB\u062b\xfc\x10;\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94W-\xd8\xcd?\xe3\x99\xd1\xd0\xec(\x121\xb7\xce\xfc \xb9\u4eca\x023\xc8\xfeBp>\x80\x00\x00\xe0\x94WI!\x83\x8c\xc7}l\x98\xb1}\x90::\xe0\xee\r\xa9[\u040a\vS(\x17\x8a\xd0\xf2\xa0\x00\x00\u07d4WJ\xd95S\x90\u421e\xf4*\xcd\x13\x8b*'\xe7\x8c\x00\xae\x89Tg\xb72\xa9\x134\x00\x00\u07d4WM\xe1\xb3\xf3\x8d\x91XF\xae7\x18VJZ\xda \xc2\xf3\xed\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94W\\\x00\u0081\x82\x10\u0085U\xa0\xff)\x01\x02\x89\xd3\xf8#\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94Ws\xb6\x02g!\xa1\xdd\x04\xb7\x82\x8c\xd6+Y\x1b\xfb4SL\x8a\x05\xb7\xacES\xdez\xe0\x00\x00\xe0\x94WwD\x1c\x83\xe0?\v\xe8\xdd4\v\xdechP\x84|b\v\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Wx\xff\u071b\x94\u0165\x9e\"N\xb9e\xb6\u0790\xf2\"\xd1p\x89\x12-\u007f\xf3f\x03\xfc\x00\x00\u07d4Wz\xee\xe8\u053c\b\xfc\x97\xab\x15n\xd5\u007f\xb9p\x92Sf\xbe\x89\x12\r\xf1\x14rX\xbf\x00\x00\u07d4W{-\a\xe9\xcfRJ\x18\u04c9\x15Vak\x96\x06g\x00\x00\u07d4W\xd5\xfd\x0e=0I3\x0f\xfc\xdc\xd0 Ei\x17e{\xa2\u0689k\xf2\x01\x95\xf5T\xd4\x00\x00\u07d4W\u0754q\xcb\xfa&'\t\xf5\U00106f37t\xc5\xf5'\xb8\xf8\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4W\xdf#\xbe\xbd\xc6^\xb7_\ub732\xfa\xd1\xc0si++\xaf\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4X\x00\u03410\x83\x9e\x94I]-\x84\x15\xa8\xea,\x90\xe0\xc5\u02c9\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94X\x03\xe6\x8b4\xda\x12\x1a\xef\b\xb6\x02\xba\u06ef\xb4\xd1$\x81\u028a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\xe0\x94X\x16\xc2hww\xb6\xd7\u04a2C-Y\xa4\x1f\xa0Y\xe3\xa4\x06\x8a\x1cO\xe4:\xdb\n^\x90\x00\x00\u07d4X\x1a:\xf2\x97\xef\xa4Cj)\xaf\x00r\x92\x9a\xbf\x98&\xf5\x8b\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94X\x1b\x9f\xd6\xea\xe3r\xf3P\x1fB\xeb\x96\x19\xee\xc8 \xb7\x8a\x84\x8a\x04+\xe2\xc0\f\xa5;\x8d\x80\x00\u07d4X\x1b\xdf\x1b\xb2v\xdb\u0746\xae\xdc\xdb9z\x01\xef\xc0\xe0\f[\x8965\u026d\xc5\u07a0\x00\x00\u07d4X\x1f4\xb5#\xe5\xb4\x1c\t\xc8|)\x8e)\x9c\xbc\x0e)\xd0f\x89=X3\xaa\xfd9u\x80\x00\xe0\x94X$\xa7\xe2(8'q40\x8c_KP\u06b6^C\xbb1\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4X+pf\x9c\x97\xaa\xb7\u0581H\xd8\xd4\xe9\x04\x11\xe2\x81\rV\x8965f3\xeb\xd8\xea\x00\x00\u07d4X.|\xc4o\x1d{Nn\x9d\x95\x86\x8b\xfd7\x05s\x17\x8fL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4X>\x83\xbaU\xe6~\x13\xe0\xe7o\x83\x92\xd8s\xcd!\xfb\xf7\x98\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Xi\xfb\x86}q\xf18\u007f\x86;i\x8d\t\xfd\xfb\x87\u011b\\\x89\u01bb\xf8X\xb3\x16\b\x00\x00\u07d4X}hI\xb1h\xf6\xc33+z\xba\xe7\xeblB\xc3\u007fH\xbf\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4X\x87\xdcj3\xdf\xedZ\xc1\xed\xef\xe3^\xf9\x1a!b1\xac\x96\x89\r\x8drkqw\xa8\x00\x00\xe0\x94X\x8e\u0650\xa2\xaf\xf4J\x94\x10]X\xc3\x05%w5\xc8h\xac\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4X\xae-\xdc_L\x8a\u0697\xe0l\x00\x86\x17\x17g\xc4#\xf5\u05c9WG=\x05\u06ba\xe8\x00\x00\u07d4X\xae\xd6gJ\xff\xd9\xf6B3'*W\x8d\xd98k\x99\xc2c\x89\xb8Pz\x82\a( \x00\x00\xe0\x94X\xb8\b\xa6[Q\xe63\x89i\xaf\xb9^\xc7\a5\xe4Q\xd5&\x8a\bxK\xc1\xb9\x83z8\x00\x00\u07d4X\xb8\xae\x8fc\xef5\xed\ab\xf0\xb6#=J\xc1Nd\xb6M\x89lk\x93[\x8b\xbd@\x00\x00\u07d4X\xba\x15ie\x0e[\xbb\xb2\x1d5\xd3\xe1u\xc0\u05b0\xc6Q\xa9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4X\xc5U\xbc)<\xdb\x16\xc66.\xd9z\xe9U\v\x92\xea\x18\x0e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4X\xc6P\xce\xd4\v\xb6VA\xb8\xe8\xa9$\xa09\xde\xf4hT\u07c9\x01\x00\xbd3\xfb\x98\xba\x00\x00\u07d4X\xc9\aT\xd2\xf2\n\x1c\xb1\xdd3\x06%\xe0KE\xfaa\x9d\\\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94X\xe2\xf1\x12#\xfc\x827\xf6\x9d\x99\xc6(\x9c\x14\x8c\x06\x04\xf7B\x8a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4X\xe5T\xaf=\x87b\x96 \xdaa\xd58\xc7\xf5\xb4\xb5LJ\xfe\x89FP\x9diE4r\x80\x00\u07d4X\xe5\xc9\xe3D\xc8\x06e\r\xac\xfc\x90M3\xed\xbaQ\a\xb0\u0789\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4X\xe6a\u043as\xd6\xcf$\t\x9aUb\xb8\b\xf7\xb3g;h\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94X\xf0[&%`P<\xa7a\xc6\x18\x90\xa4\x03_Lsr\x80\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4X\xfb\x94sd\xe7iWe6\x1e\xbb\x1e\x80\x1f\xfb\x8b\x95\xe6\u0409\n\u05ce\xbcZ\xc6 \x00\x00\u07d4Y\x01\x81\xd4E\x00{\u0407Z\xaf\x06\x1c\x8dQ\x159\x00\x83j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Y\x02\xe4J\xf7i\xa8rF\xa2\x1e\a\x9c\b\xbf6\xb0n\xfe\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4Y\n\xcb\xda7)\f\r>\xc8O\xc2\x00\rv\x97\xf9\xa4\xb1]\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94Y\f\xcbY\x11\xcfx\xf6\xf6\"\xf55\xc4t7_J\x12\xcf\u03ca\x04<3\xc1\x93ud\x80\x00\x00\u07d4Y\x10\x10m\xeb\u0491\xa1\u0340\xb0\xfb\xbb\x8d\x8d\x9e\x93\xa7\xcc\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Y\x16\x17I\xfe\xdc\xf1\xc7!\xf2 -\x13\xad\xe2\xab\xcfF\v=\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Y\x1b\xef1q\xd1\u0155w\x17\xa4\xe9\x8d\x17\xeb\x14,!NV\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Y <\xc3u\x99\xb6H1*|\xc9\xe0m\xac\xb5\x89\xa9\xaej\x89\b\x0fyq\xb6@\x0e\x80\x00\u07d4Y&\x81q\xb83\xe0\xaa\x13\xc5KR\xcc\xc0B.O\xa0:\ub262\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94Y'w&\x1e;\xd8R\u010e\u0295\xb3\xa4L[\u007f-B,\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Y0Dg\x0f\xae\xff\x00\xa5[Z\xe0Q\xeb{\xe8p\xb1\x16\x94\x89\a?u\u0460\x85\xba\x00\x00\xe0\x94Y;E\xa1\x86J\xc5\xc7\xe8\xf0\u02ae\xba\r\x87<\xd5\xd1\x13\xb2\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4Y_^\xdajV\xf1N%\xe0\xc6\xf3\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Z\x1a3ib\xd6\xe0\xc601\u0303\u01a5\u01a6\xf4G\x8e\u02c965\u026d\xc5\u07a0\x00\x00\u07d4Z\x1d--\x1dR\x03\x04\xb6 \x88IW\x047\xeb0\x91\xbb\x9f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4Z&s1\xfa\xcb&-\xaa\xec\xd9\xddc\xa9p\f_RY\u07c9\x05k\xc7^-c\x10\x00\x00\xe0\x94Z(WU9\x1e\x91NX\x02_\xaaH\xcch_O\xd4\xf5\xb8\x8a\x05\x81v{\xa6\x18\x9c@\x00\x00\u07d4Z)\x16\xb8\xd2\xe8\xcc\x12\xe2\a\xabFMC>#p\xd8#\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4Z+\x1c\x85:\xeb(\xc4U9\xafv\xa0\n\xc2\u0628$(\x96\x89\x01Z\xf1\u05cbX\xc4\x00\x00\u07d4Z-\xaa\xb2\\1\xa6\x1a\x92\xa4\xc8,\x99%\xa1\xd2\xefXX^\x89\f8\r\xa9\u01d5\f\x00\x00\u07d4Z0\xfe\xac7\xac\x9fr\u05f4\xaf\x0f+\xc79R\xc7O\xd5\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4ZTh\xfa\\\xa2&\xc7S.\xcf\x06\xe1\xbc\x1cE\"]~\u0249g\x8a\x93 b\xe4\x18\x00\x00\u07d4ZVR\x857JI\xee\xddPL\x95}Q\bt\xd0\x04U\xbc\x89\x05k\xc7^-c\x10\x00\x00\u07d4Z^\xe8\xe9\xbb\x0e\x8a\xb2\xfe\xcbK3\u0494x\xbeP\xbb\xd4K\x89*\x11)\u0413g \x00\x00\xe0\x94Z_\x85\b\xda\x0e\xbe\xbb\x90\xbe\x903\xbdM\x9e'A\x05\xae\x00\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4Z`q\xbc\xeb\xfc\xbaJ\xb5\u007fM\xb9o\u01e6\x8b\xec\xe2\xba[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Z`\xc9$\x16(s\xfc~\xa4\xda\u007f\x97.5\x01g7`1\x89\x04\x87\xf2w\xa8\x85y\x80\x00\u07d4Zf\x86\xb0\xf1~\a\xed\xfcY\xb7Y\xc7}[\xef\x16M8y\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4Zp\x10o \xd6?\x87Re\xe4\x8e\r5\xf0\x0e\x17\xd0+\u0249\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794Zt\xbab\xe7\xc8\x1a4t\xe2}\x89O\xed3\xdd$\xad\x95\xfe\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94Zw5\x00}p\xb0hD\u0699\x01\xcd\xfa\xdb\x11\xa2X,/\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4Z\x82\xf9l\u0537\xe2\xd9=\x10\xf3\x18]\xc8\xf4=Ku\xaai\x89lc?\xba\xb9\x8c\x04\x00\x00\u07d4Z\x87\xf04\xe6\xf6\x8fNt\xff\xe6\fd\x81\x946\x03l\xf7\u05c9\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94Z\x89\x11U\xf5\x0eB\aCt\xc79\xba\xad\xf7\xdf&Q\x15:\x8a\x01\x02\xdao\xd0\xf7:<\x00\x00\u07d4Z\x9c\x8bi\xfcaMiVI\x99\xb0\r\xcbB\xdbg\xf9~\x90\x89\xb9\xe6\x15\xab\xad:w\x80\x00\xe0\x94Z\xaf\x1c1%Jn\x00_\xba\u007fZ\xb0\xecy\xd7\xfc+c\x0e\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4Z\xb1\xa5aSH\x00\x1c|w]\xc7WHf\x9b\x8b\xe4\xde\x14\x89%jr\xfb)\xe6\x9c\x00\x00\xe1\x94Z\xbf\xec%\xf7L\u06047c\x1aw1\x90i2wcV\xf9\x8b\t\xd8<\xc0\u07e1\x11w\xff\x80\x00\u07d4Z\u0090\x8b\x0f9\x8c\r\xf5\xba\xc2\xcb\x13\xcas\x14\xfb\xa8\xfa=\x89\n\xd4\xc81j\v\f\x00\x00\xe0\x94Z\u025a\u05c1j\xe9\x02\x0f\xf8\xad\xf7\x9f\xa9\x86\x9b|\xeaf\x01\x8a\x04ri\x8bA;C \x00\x00\u07d4Z\xd1,^\xd4\xfa\x82~!P\u03e0\u058c\n\xa3{\x17i\xb8\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94Z\xd5\xe4 uV\x13\x88o5\xaaV\xac@>\xeb\xdf\xe4\xb0\u040a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4Z\xdew\xfd\x81\xc2\\\n\xf7\x13\xb1\a\x02v\x8c\x1e\xb2\xf9u\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Z\xe6N\x85;\xa0\xa5\x12\x82\u02cd\xb5.Aa^|\x9fs?\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Z\xed\x0el\xfe\x95\xf9\u0580\xc7dr\xa8\x1a+h\n\u007f\x93\xe2\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4Z\xef\x16\xa2&\xddh\a\x1f$\x83\xe1\xdaBY\x83\x19\xf6\x9b,\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Z\xf4j%\xac\t\xcbsakS\xb1O\xb4/\xf0\xa5\x1c\u0772\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4Z\xf7\xc0r\xb2\u016c\xd7\x1cv\xad\xdc\xceS\\\xf7\xf8\xf95\x85\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94Z\xfd\xa9@\\\x8e\x976QEt\u0692\x8d\xe6tV\x01\t\x18\x8a\x01E\xb8\xb0#\x9aF\x92\x00\x00\u07d4[\x06\xd1\xe6\x93\f\x10Ti+y\xe3\xdb\xe6\xec\xceS\x96d \x89\v\"\u007fc\xbe\x81<\x00\x00\u07d4[%\xca\xe8m\xca\xfa*`\xe7r61\xfc_\xa4\x9c\x1a\xd8}\x89\x87\fXQ\x0e\x85 \x00\x00\u07d4[(|~sB\x99\xe7'bo\x93\xfb\x11\x87\xa6\rPW\xfe\x89\x05|\xd94\xa9\x14\xcb\x00\x00\u07d4[)\f\x01\x96|\x81.M\xc4\xc9\v\x17L\x1b@\x15\xba\xe7\x1e\x89\b \xeb4\x8dR\xb9\x00\x00\u07d4[+d\xe9\xc0X\u30a8\xb2\x99\"N\xec\xaa\x16\xe0\x9c\x8d\x92\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\xe0\x94[./\x16\x18U.\xab\r\xb9\x8a\xddUc|)Q\xf1\xfb\x19\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4[0`\x8cg\x8e\x1a\xc4d\xa8\x99L;3\xe5\xcd\xf3Iq\x12\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4[36\x96\xe0L\xca\x16\x92\xe7\x19\x86W\x9c\x92\rk)\x16\xf9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94[C\rw\x96\x96\xa3e?\xc6\x0et\xfb\u02ec\xf6\xb9\u00ba\xf1\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4[Cse\xae:\x9a/\xf9|h\xe6\xf9\nv \x18\x8c}\x19\x89l\x87T\xc8\xf3\f\b\x00\x00\u07d4[I\xaf\xcduDx8\xf6\xe7\xce\u068d!w}O\xc1\xc3\xc0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4[L\f`\xf1\x0e\u0489K\xdbB\xd9\xdd\x1d!\x05\x87\x81\n\r\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4[N\xa1m\xb6\x80\x9b\x03R\u0536\xe8\x1c9\x13\xf7jQ\xbb2\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4[[\xe0\xd8\xc6rv\xba\xab\xd8\xed\xb3\rH\xeaud\v\x8b)\x89,\xb1\xf5_\xb7\xbe\x10\x00\x00\u07d4[]Qp)2\x15b\x11\x1bC\bm\v\x045\x91\x10\x9ap\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\xe0\x94[]\x8c\x8e\xedl\x85\xac!Va\xde\x02fv\x82?\xaa\n\f\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4[mU\xf6q)g@\\e\x91)\xf4\xb1\xde\t\xac\xf2\xcb{\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4[p\u011c\u024b=\xf3\xfb\xe2\xb1Y\u007f\\\x1bcG\xa3\x88\xb7\x894\x95tD\xb8@\xe8\x00\x00\u07d4[sn\xb1\x83Sb\x9b\u0796v\xda\xdd\x16P4\xce^\xcch\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4[u\x9f\xa1\x10\xa3\x1c\x88F\x9fT\xd4K\xa3\x03\xd5}\xd3\xe1\x0f\x89[F\xdd/\x0e\xa3\xb8\x00\x00\u07d4[w\x84\xca\xea\x01y\x9c\xa3\x02'\x82vg\xce |\\\xbcv\x89lk\x93[\x8b\xbd@\x00\x00\u07d4[x\xec\xa2\u007f\xbd\xeao&\xbe\xfb\xa8\x97+)^x\x146K\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94[\x80\v\xfd\x1b>\u0525}\x87Z\xed&\xd4/\x1aw\b\xd7*\x8a\x01Z\x82\xd1\u057b\x88\xe0\x00\x00\u07d4[\x85\xe6\x0e*\xf0TO/\x01\xc6N 2\x90\x0e\xbd8\xa3\u01c9lk\x93[\x8b\xbd@\x00\x00\u07d4[\xa2\xc6\xc3]\xfa\xec)h&Y\x19\x04\xd5DFJ\xea\xbd^\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94[\xafmt\x96 \x80>\x83H\xaf7\x10\xe5\xc4\xfb\xf2\x0f\u0214\x8a\x01\x0f@\x02a]\xfe\x90\x00\x00\u07d4[\xc1\xf9U\a\xb1\x01\x86B\xe4\\\xd9\xc0\xe2'3\xb9\xb1\xa3&\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94[\xd25GG\u007fm\t\u05f2\xa0\x05\xc5\xeee\fQ\fV\u05ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4[\xd2J\xac6\x12\xb2\f`\x9e\xb4gy\xbf\x95i\x84\a\xc5|\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4[\u0586-Q}M\xe4U\x9dN\xec\n\x06\xca\xd0^/\x94n\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4[\xe0EQ*\x02n?\x1c\xeb\xfdZ~\xc0\xcf\xc3o-\xc1k\x89\x06\x81U\xa46v\xe0\x00\x00\xe0\x94[\xf9\xf2\"nZ\xea\xcf\x1d\x80\xae\nY\xc6\xe3\x808\xbc\x8d\xb5\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4[\xfa\xfe\x97\xb1\xdd\x1dq+\xe8mA\xdfy\x89SE\x87Z\x87\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\\\x0f.Q7\x8fk\r{\xabas1X\vn9\xad<\xa5\x8a\x02\bj\xc3Q\x05&\x00\x00\x00\u07d4\\)\xf9\xe9\xa5#\xc1\xf8f\x94H\xb5\\H\xcb\xd4|%\xe6\x10\x894F\xa0\xda\xd0L\xb0\x00\x00\xe0\x94\\0\x8b\xacHW\xd3;\xae\xa0t\xf3\x95m6!\xd9\xfa(\xe1\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d4\\1*V\u01c4\xb1\"\t\x9bvM\x05\x9c!\xec\xe9^\x84\u0289\x05&c\u032b\x1e\x1c\x00\x00\u07d4\\1\x99m\xca\xc0\x15\xf9\xbe\x98[a\x1fF\x870\xef$M\x90\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\\24W\xe1\x87v\x1a\x82v\xe3Y\xb7\xb7\xaf?;n=\xf6\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\\<\x1cd[\x91uC\x11;>l\x1c\x05M\xa1\xfet+\x9a\x89+^:\xf1k\x18\x80\x00\x00\u0794\\=\x19D\x1d\x19l\xb4Cf \xfc\xad\u007f\xbby\xb2\x9ex\x88\xc6s\xce<@\x16\x00\x00\u07d4\\?V\u007f\xaf\xf7\xba\u0475\x12\x00\"\xe8\xcb\u02a8+I\x17\xb3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\\Ch\x91\x8a\xced\t\u01de\u0280\u036a\xe49\x1d+bN\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\\FA\x97y\x1c\x8a=\xa3\xc9%Co'z\xb1;\xf2\xfa\xa2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\\H\x81\x16\\\xb4+\xb8.\x979l\x8e\xf4J\xdb\xf1s\xfb\x99\x89\x05\xfe\xe2\"\x04\x1e4\x00\x00\xe0\x94\\H\x92\x90z\a \xdfo\xd3A>c\xffv}k9\x80#\x8a\x02\xcb\x00\x9f\u04f5y\x0f\x80\x00\u07d4\\O$\xe9\x94\ud3c5\x0e\xa7\x81\x8fG\x1c\x8f\xac;\xcf\x04R\x89]\x80h\x8d\x9e1\xc0\x00\x00\u07d4\\T\x19V\\:\xadNqN\a92\x8e5!\u024f\x05\u0309\x1c\x9fx\u0489>@\x00\x00\u07d4\\a6\xe2\x18\xde\na\xa17\xb2\xb3\x96-*a\x12\xb8\t\u05c9\x0f\xf3\u06f6_\xf4\x86\x80\x00\xe0\x94\\a\xaby\xb4\b\xdd2)\xf6bY7\x05\xd7/\x1e\x14{\xb8\x8a\x04\xd0$=4\x98\u0344\x00\x00\u07d4\\m\x04\x1d\xa7\xafD\x87\xb9\xdcH\xe8\xe1\xf6\af\u0425m\xbc\x89O\a\n\x00>\x9ct\x00\x00\u07d4\\o6\xaf\x90\xab\x1aeln\xc8\xc7\xd5!Q'b\xbb\xa3\xe1\x89lh\xcc\u041b\x02,\x00\x00\u07d4\\{\x9e\u01e2C\x8d\x1eD*\x86\x0f\x8a\x02\x1e\x18\x99\xf07z\xea\x00\x00\u07d4\\\xcc\xf1P\x8b\xfd5\xc2\x050\xaad%\x00\xc1\r\xeee\xea\xed\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\\\xcer\xd0h\xc7\xc3\xf5[\x1d(\x19T^w1|\xae\x82@\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\\\xd0\xe4u\xb5D!\xbd\xfc\f\x12\xea\x8e\b+\u05e5\xaf\nj\x89\x032\xca\x1bg\x94\f\x00\x00\u07d4\\\u0548\xa1N\xc6H\xcc\xf6G)\xf9\x16z\xa7\xbf\x8b\xe6\xeb=\x8965\u026d\xc5\u07a0\x00\x00\u07d4\\\u062f`\xdee\xf2M\xc3\xceW0\xba\x92e0\"\xdcYc\x89a\t=|,m8\x00\x00\u07d4\\\xdcG\b\xf1O@\xdc\xc1Zy_}\xc8\xcb\v\u007f\xaa\x9en\x89\x1d\x1c_>\xda \xc4\x00\x00\u07d4\\\u0d86,\u0391b\xe8~\bI\xe3\x87\xcb]\xf4\xf9\x11\x8c\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\\\xe2\xe7\u03aa\xa1\x8a\xf0\xf8\xaa\xfa\u007f\xba\xd7L\u021e<\xd46\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\\\xe4@h\xb8\xf4\xa3\xfey\x9ej\x83\x11\xdb\xfd\xed\xa2\x9d\xee\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u0794\\\xeb\xe3\v*\x95\xf4\xae\xfd\xa6ee\x1d\xc0\xcf~\xf5u\x81\x99\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\\\xf1\x8f\xa7\u0227\xc0\xa2\xb3\xd5\xef\u0459\x0fd\xdd\xc5i$,\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\\\xf4N\x10T\reqd#\xb1\xbc\xb5B\xd2\x1f\xf8:\x94\u034a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\\\xf8\xc0>\xb3\xe8r\xe5\x0f|\xfd\f/\x8d;?,\xb5\x18:\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\\\xfa\x8dV\x85ue\x8c\xa4\xc1\xa5\x93\xacL]\x0eD\xc6\aE\x89\x0f\xc6o\xae7F\xac\x00\x00\u07d4\\\xfa\x98w\xf7\x19\u01dd\x9eIJ\b\xd1\xe4\x1c\xf1\x03\xfc\x87\u0249\n\u05ce\xbcZ\xc6 \x00\x00\u07d4]\x1d\xc38{G\xb8E\x1eU\x10l\f\xc6}m\xc7+\u007f\v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4]#\x1ap\xc1\xdf\xeb6\n\xbd\x97\xf6\x16\xe2\xd1\r9\xf3\u02b5\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4]$\xbd\xbc\x1cG\xf0\xeb\x83\xd1(\xca\xe4\x8a\xc3\xf4\xb5\x02bt\a\xda'/g\x81Jk\xec\u0509\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4]\x83\xb2\x1b\xd2q#`Ckg\xa5\x97\xee3x\xdb>z\xe4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94]\x87+\x12.\x99N\xf2|q\xd7\u07b4W\xbfeB\x9e\xcal\x8a\x01\xb1\xad\xed\x81\u04d4\x10\x80\x00\xe0\x94]\x8d1\xfa\xa8d\xe2!Y\xcdoQu\xcc\xec\xc5?\xa5Mr\x8a\x05\xb6\x96\xb7\r\xd5g\x10\x00\x00\xe0\x94]\x95\x8a\x9b\u0449\u0098_\x86\u014a\x8ci\xa7\xa7\x88\x06\xe8\u068a\x02(\xf1o\x86\x15x`\x00\x00\u07d4]\xa2\xa9\xa4\xc2\xc0\xa4\xa9$\xcb\xe0\xa5:\xb9\xd0\xc6'\xa1\u03e0\x89'\xbf8\xc6TM\xf5\x00\x00\u07d4]\xa4\u0288\x93\\'\xf5\\1\x10H\x84\x0eX\x9e\x04\xa8\xa0I\x89\x04V9\x18$O@\x00\x00\u07d4]\xa5G\x85\u027d0W\\\x89\u07b5\x9d A\xd2\n9\xe1{\x89j\xa2\t\xf0\xb9\x1de\x80\x00\xe0\x94]\xb6\x9f\xe9>o\xb6\xfb\xd4P\x96k\x97#\x8b\x11\n\xd8'\x9a\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4]\xb7\xbb\xa1\xf9W?$\x11]\x8c\x8cb\xe9\u0388\x95\x06\x8e\x9f\x89\x02\xb5\xaa\xd7,e \x00\x00\xe0\x94]\xb8D\x00W\x00i\xa9W<\xab\x04\xb4\u6d955\xe2\x02\xb8\x8a\x02\r\u058a\xaf2\x89\x10\x00\x00\u07d4]\xc3m\xe55\x94P\xa1\xec\t\xcb\fD\xcf+\xb4+:\xe45\x89<\x94m\x89;3\x06\x00\x00\u07d4]\xc6\xf4_\xef&\xb0n3\x021?\x88M\xafH\xe2to\xb9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94]\u0376\xb8zP\xa9\xde\x02C\x80\x00\x00\u07d4^Q\xb8\xa3\xbb\t\xd3\x03\xea|\x86\x05\x15\x82\xfd`\x0f\xb3\xdc\x1a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794^X\xe2U\xfc\x19\x87\n\x040_\xf2\xa0F1\xf2\xff)K\xb1\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4^ZD\x19t\xa8=t\u0187\xeb\xdcc?\xb1\xa4\x9e{\x1a\u05c9\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4^eE\x8b\xe9d\xaeD\x9fqw7\x04\x97\x97f\xf8\x89\x87a\x89\x1c\xa7\xccs[o|\x00\x00\u07d4^g\u07c9i\x10\x1a\u06bd\x91\xac\xcdk\xb1\x99\x12t\xaf\x8d\xf2\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4^n\x97G\xe1b\xf8\xb4\\en\x0fl\xaez\x84\xba\xc8\x0eN\x89lk\x93[\x8b\xbd@\x00\x00\u07d4^s\x1bU\xce\xd4R\xbb??\xe8q\xdd\xc3\xed~\xe6Q\n\x8f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4^t\xed\x80\xe9eW\x88\xe1\xbb&\x97R1\x96g\xfeuNZ\x89\x03\t'\xf7L\x9d\xe0\x00\x00\u07d4^w.'\xf2\x88\x00\xc5\r\u0697;\xb3>\x10v.n\xea \x89a\t=|,m8\x00\x00\u07d4^{\x8cT\xdcW\xb0@ bq\x9d\xee~\xf5\xe3~\xa3]b\x89\x9b\xf9\x81\x0f\xd0\\\x84\x00\x00\u07d4^\u007fp7\x87uX\x9f\xc6j\x81\xd3\xf6S\xe9T\xf5U`\ub243\xf2\x89\x18\x1d\x84\xc8\x00\x00\xe0\x94^\x80n\x84W0\xf8\a>l\xc9\x01\x8e\xe9\x0f\\\x05\xf9\t\xa3\x8a\x02\x01\xe9m\xac\u03af \x00\x00\u07d4^\x8eM\xf1\x8c\xf0\xafw\tx\xa8\u07cd\xac\x90\x93\x15\x10\xa6y\x89lk\x93[\x8b\xbd@\x00\x00\u07d4^\x90\xc8Xw\x19\x87V\xb06l\x0e\x17\xb2\x8eR\xb4FPZ\x89\x14JJ\x18\xef\xebh\x00\x00\u07d4^\x95\xfe_\xfc\xf9\x98\xf9\xf9\xac\x0e\x9a\x81\u06b8>\xadw\x00=\x89\x1dB\xc2\r2y\u007f\x00\x00\u07d4^\xad)\x03z\x12\x89dx\xb1)j\xb7\x14\xe9\u02d5B\x8c\x81\x89\x03\xe0C\a-@n\x00\x00\u07d4^\xb3q\xc4\a@lB{;}\xe2q\xad<\x1e\x04&\x95y\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4^\u037a\xea\xb9\x10o\xfe]{Q\x96\x96`\x9a\x05\xba\ub16d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4^\xd0\xd63\x85Y\xefD\xdcza\xed\xeb\x89?\xa5\xd8?\xa1\xb5\x89\v\xed\x1d\x02c\xd9\xf0\x00\x00\xe0\x94^\u04fb\xc0R@\xe0\u04d9\xebm\xdf\xe6\x0fb\xdeM\x95\t\xaf\x8a)\x14\xc0$u\xf9\xd6\xd3\x00\x00\u0594^\xd3\xf1\xeb\xe2\xaegV\xb5\xd8\xdc\x19\xca\xd0,A\x9a\xa5w\x8b\x80\u07d4^\xd5a\x15\xbde\x05\xa8\x82s\xdf\\V\x83\x94p\xd2J-\xb7\x89\x03\x8ee\x91\xeeVf\x80\x00\xe0\x94^\xf8\xc9a\x86\xb3y\x84\xcb\xfe\x04\u0158@n;\n\xc3\x17\x1f\x8a\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4^\xfb\xdf\xe58\x99\x99c<&`Z[\xfc,\x1b\xb5\x95\x93\x93\x89\x03\xc0W\xc9\\\xd9\b\x00\x00\xe0\x94_\x13\x15F1Fm\xcb\x13S\u0210\x93*|\x97\xe0\x87\x8e\x90\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4_\x16z\xa2B\xbcL\x18\x9a\xde\xcb:\u0127\xc4R\xcf\x19/\u03c9lkLM\xa6\u077e\x00\x00\xe0\x94_\x1c\x8a\x04\xc9\rs[\x8a\x15)\t\xae\xaeco\xb0\xce\x16e\x8a\x01{x'a\x8cZ7\x00\x00\u07d4_#\xba\x1f7\xa9lE\xbcI\x02YS\x8aT\u008b\xa3\xb0\u0549A\rXj \xa4\xc0\x00\x00\u07d4_&\xcf4Y\x9b\xc3n\xa6{\x9ez\x9f\x9bC0\xc9\xd5B\xa3\x8965\u026d\xc5\u07a0\x00\x00\u07d4_)\xc9\xdev]\xde%\x85*\xf0}3\xf2\xceF\x8f\xd2\t\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d4_/\a\xd2\u0597\xe8\xc5g\xfc\xfd\xfe\x02\x0fI\xf3`\xbe!9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4_2\x1b=\xaa\xa2\x96\xca\xdf)C\x9f\x9d\xab\x06*K\xff\xed\u0589\x04p%\x90>\xa7\xae\x00\x00\u07d4_3:;#\x10vZ\r\x182\xb9\xbeL\n\x03pL\x1c\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4_4K\x01\xc7\x19\x1a2\xd0v*\xc1\x88\xf0\xec-\xd4`\x91\x1d\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94_6>\n\xb7G\xe0-\x1b;f\xab\xb6\x9e\xa5<{\xafR:\x8a\x02w\x01s8\xa3\n\xe0\x00\x00\u07d4_7[\x86`\f@\u0328\xb2gkz\x1a\x1d\x16D\xc5\xf5,\x89\x04F\x18\xd7Lb?\x00\x00\u07d4_>\x1eg9\xb0\xc6\"\x00\xe0\n\x006\x91\xd9\xef\xb28\u061f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4_H?\xfb\x8fh\n\xed\xf2\xa3\x8fx3\xaf\xdc\xdeY\xb6\x1eK\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94_J\xceL\x1c\xc13\x91\xe0\x1f\x00\xb1\x98\xe1\xf2\v_\x91\xcb\xf5\x8a\x01\x0f\x0f\xa8\xb9\u04c1\x1a\x00\x00\xe0\x94_R\x12\x82\xe9\xb2x\u070c\x03Lr\xafS\xee)\xe5D=x\x8a\x01as-/\x8f:\xe0\x00\x00\u07d4_h\xa2L~\xb4\x11vgs{39?\xb3\xc2\x14\x8aS\xb6\x89\x02\xce\u0791\x8dE<\x00\x00\u07d4_p\x8e\xaf9\xd8#\x94lQ\xb3\xa3\u9df3\xc0\x03\xe2cA\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4_t.H~:\xb8\x1a\xf2\xf9J\xfd\xbe\x1b\x9b\x8f\\\u0301\xbc\x89u\xc4E\xd4\x11c\xe6\x00\x00\u07d4_t\xed\x0e$\xff\x80\u0672\u0124K\xaa\x99uB\x8c\u05b95\x89\xa1\x8b\xce\xc3H\x88\x10\x00\x00\u07d4_v\xf0\xa3\x06&\x9cx0k=e\r\xc3\xe9\xc3p\x84\xdba\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4_w\xa1\a\xab\x12&\xb3\xf9_\x10\ue0ee\xfcl]\xff>\u0709\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4_{;\xba\xc1m\xab\x83\x1aJ\x0f\xc5;\fT\x9d\xc3l1\u0289i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94_\x93\xff\x83't\xdbQ\x14\xc5[\xb4\xbfD\xcc\U000f53d0?\x8a(\xa9\xc9\x1a&4X)\x00\x00\u07d4_\x96\x16\xc4{Jg\xf4\x06\xb9Z\x14\xfeo\xc2h9o\x17!\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4_\x98\x109\xfc\xf5\x02%\xe2\xad\xf7bu!\x12\xd1\xcc&\xb6\xe3\x89\x1b\x1aAj!S\xa5\x00\x00\u07d4_\x99\u070eI\xe6\x1dW\xda\xef`j\xcd\xd9\x1bMp\a2j\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4_\xa6\x1f\x15-\xe6\x125\x16\xc7Q$)y(_yj\u01d1\x89\v\x0f\x11\x97)c\xb0\x00\x00\u07d4_\xa7\xbf\xe0C\x88a'\xd4\x01\x1d\x83V\xa4~\x94yc\xac\xa8\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94_\xa8\xa5Nh\x17lO\xe2\xc0\x1c\xf6q\xc5\x15\xbf\xbd\xd5(\xa8\x8aE\xe1U\xfa\x01\x10\xfa@\x00\x00\u07d4_\xad\x96\x0fk,\x84V\x9c\x9fMG\xbf\x19\x85\xfc\xb2\xc6]\xa6\x8965f3\xeb\xd8\xea\x00\x00\u07d4_\xc6\xc1\x14&\xb4\xa1\xea\xe7\xe5\x1d\xd5\x12\xad\x10\x90\xc6\xf1\xa8[\x89\x93\xfe\\W\xd7\x10h\x00\x00\u07d4_\u0344Th\x96\xdd\b\x1d\xb1\xa3 \xbdM\x8c\x1d\xd1R\x8cL\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4_\u0368G\xaa\xf8\xd7\xfa\x8b\xca\b\x02\x9c\xa2\x84\x91f\xaa\x15\xa3\x89!\u02b8\x12Y\xa3\xbf\x00\x00\u07d4_\xd1\xc3\xe3\x17x'l\xb4.\xa7@\xf5\xea\xe9\xc6A\xdb\xc7\x01\x89\n\x84Jt$\xd9\xc8\x00\x00\u07d4_\xd3\xd6w~\xc2b\n\xe8:\x05R\x8e\xd4%\a-<\xa8\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4_\xd9s\xaf6j\xa5\x15|Te\x9b\u03f2|\xbf\xa5\xac\x15\u0589\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4_\xe7w\x03\x80\x8f\x82>l9\x93R\x10\x8b\xdb,R|\xb8|\x89j@v\xcfy\x95\xa0\x00\x00\xe0\x94_\xecI\xc6e\xe6N\xe8\x9d\xd4A\xeet\x05n\x1f\x01\xe9(p\x8a\x01V\x9b\x9es4t\xc0\x00\x00\u07d4_\xf3&\xcd`\xfd\x13k$^)\xe9\bzj\u04e6R\u007f\r\x89e\xea=\xb7UF`\x00\x00\u07d4_\xf9=\xe6\xee\x05L\xadE\x9b-^\xb0\xf6\x87\x03\x89\xdf\xcbt\x89\v\xed\x1d\x02c\xd9\xf0\x00\x00\u07d4`\x06\xe3m\x92\x9b\xf4]\x8f\x16#\x1b\x12j\x01\x1a\xe2\x83\xd9%\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4`!\xe8Z\x88\x14\xfc\xe1\xe8*A\xab\xd1\u04f2\xda\xd2\xfa\xef\xe0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4`8t\n\xe2\x8df\xba\x93\xb0\xbe\bH+2\x05\xa0\xf7\xa0{\x89\x11!a\x85\u009fp\x00\x00\u07d4`?/\xabz\xfbn\x01{\x94v`i\xa4\xb4;8\x96I#\x89Y\xd2\xdb$\x14\u0699\x00\x00\u07d4`B'm\xf2\x98?\xe2\xbcGY\xdc\x19C\xe1\x8f\xdb\xc3Ow\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4`B\xc6D\xba\xe2\xb9o%\xf9M1\xf6x\xc9\r\xc9f\x90\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4`L\xdf\x18b\x8d\xbf\xa82\x91\x94\xd4x\xddR\x01\xee\xccK\xe7\x89\x01?0j$\t\xfc\x00\x00\u07d4`N\x94w\xeb\xf4r|t[\u02bb\xed\xcbl\xcf)\x99@\"\x8966\x9e\xd7t}&\x00\x00\u07d4`gm\x1f\xa2\x1f\xca\x05\"\x97\xe2K\xf9c\x89\u0171*p\u05c9\r\x17|Zzh\xd6\x00\x00\u07d4`gn\x92\u044b\x00\x05\t\xc6\x1d\xe5@\xe6\xc5\u0776v\xd5\t\x89A\rXj \xa4\xc0\x00\x00\u07d4`o\x17q!\xf7\x85\\!\xa5\x06#0\xc8v\"d\xa9{1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4`\x86B6\x93\r\x04\xd8@+]\xcb\xeb\x80\u007f<\xafa\x1e\xa2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4`\xabq\xcd&\xeamnY\xa7\xa0\xf6'\xee\a\x9c\x88^\xbb\xf6\x89\x01s\x17\x90SM\xf2\x00\x00\u07d4`\xaf\x0e\xe1\x18D<\x9b7\xd2\xfe\xadw\xf5\xe5!\u07be\x15s\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4`\xb3X\xcb=\xbe\xfa7\xf4}\xf2\xd76X@\u068e;\u024c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4`\xb8\u05b7;ySO\xb0\x8b\xb8\xcb\xce\xfa\xc7\xf3\x93\xc5{\xfe\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4`\xbeo\x95?*M%\xb6%o\xfd$#\xac\x148%.N\x89\b!\xab\rD\x14\x98\x00\x00\u0794`\xc3qO\xdd\xdbcFY\u48b1\xeaB\xc4r\x8c\u01f8\xba\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4`\xcc=D^\xbd\xf7j}z\xe5q\u0197\x1d\xffh\u0305\x85\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94`\xd5fq@\xd1&\x14\xb2\x1c\x8e^\x8a3\b.2\xdf\xcf#\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4`\xde\"\xa1Pt2\xa4{\x01\xcch\xc5*\v\xf8\xa2\xe0\u0418\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4`\xe0\xbd\u0422Y\xbb\x9c\xb0\x9d?7\xe5\u034b\x9d\xac\uafca\x89JD\x91\xbdm\xcd(\x00\x00\u07d4`\xe3\xccC\xbc\xdb\x02j\xadu\x9cpf\xf5U\xbb\xf2\xacf\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\x04+\x80\xfd`\x95\u0478{\xe2\xf0\x0f\x10\x9f\xab\xaf\xd1W\xa6\x89\x05k\xc7^-c\x10\x00\x00\u07d4a\a\xd7\x1d\xd6\xd0\xee\xfb\x11\xd4\xc9\x16@L\xb9\x8cu>\x11}\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\x0f\xd6\xeeN\xeb\xab\x10\xa8\xc5]\vK\xd2\xe7\xd6\xef\x81qV\x89\x01\x15\x95a\x06]]\x00\x00\u07d4a\x14\xb0\xea\xe5Wi\x03\xf8\v\xfb\x98\x84-$\xed\x92#\u007f\x1e\x89\x05k\xc7^-c\x10\x00\x00\u07d4a!\xaf9\x8a[-\xa6\x9fe\xc68\x1a\xec\x88\u039c\xc6D\x1f\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\u07d4a&g\xf1r\x13[\x95\v,\xd1\xde\x10\xaf\xde\xcehW\xb8s\x8965\u026d\xc5\u07a0\x00\x00\u07d4a,\xed\x8d\xc0\u071e\x89\x9e\xe4oyb33\x15\xf3\xf5^D\x89\x12^5\xf9\xcd=\x9b\x00\x00\u07d4a4\xd9B\xf07\xf2\xcc=BJ#\f`=g\xab\xd3\xed\xf7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a:\xc5;\xe5e\xd4e6\xb8 q[\x9b\x8d:\xe6\x8aK\x95\x89\xcb\xd4{n\xaa\x8c\xc0\x00\x00\u07d4a?\xabD\xb1k\xbeUMD\xaf\xd1x\xab\x1d\x02\xf3z\ua949lk\x93[\x8b\xbd@\x00\x00\u07d4aN\x8b\xef=\xd2\u015bY\xa4\x14Vt@\x10\x185\x18\x84\xea\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4aQ\x84d\xfd\u0637<\x1b\xb6\xacm\xb6\x00eI8\xdb\xf1z\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4aT}7nSi\xbc\xf9x\xfc\x16,1\xc9\b\"3\xb8%\xd0%\xbe?{\x10V\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4a\x91\xdd\u0276J\x8e\b\x90\xb427\t\u05e0|H\xb9*d\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4a\x96\xc3\xd3\xc0\x90\x8d%Cf\xb7\xbc\xa5WE\"-\x9dM\xb1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4a\x9f\x17\x14E\xd4+\x02\xe2\xe0p\x04\xad\x8a\xfeiO\xa5=j\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4a\xad\xf5\x92\x9a^)\x81hN\xa2C\xba\xa0\x1f}\x1f^\x14\x8a\x89\x05\xfa\xbfl\x98O#\x00\x00\u07d4a\xb1\xb8\xc0\x12\xcdLx\xf6\x98\xe4p\xf9\x02V\xe6\xa3\x0fH\u0749\n\u05ce\xbcZ\xc6 \x00\x00\u07d4a\xb3\xdf.\x9e\x9f\xd9h\x13\x1f\x1e\x88\xf0\xa0\xeb[\xd7eFM\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4a\xb9\x02\u0166s\x88X&\x82\r\x1f\xe1EI\xe4\x86_\xbd\u0089\x12$\xef\xed*\u1440\x00\u07d4a\xb9\x05\xdef?\xc1s\x86R;:(\xe2\xf7\xd07\xa6U\u0349\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4a\xba\x87\xc7~\x9bYm\xe7\xba\x0e2o\xdd\xfe\xec!c\xeff\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4a\xbf\x84\u056b\x02oX\xc8s\xf8o\xf0\xdf\u0282\xb5W3\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\xc4\xee|\x86LMk^7\xea\x131\xc2\x03s\x9e\x82k/\x89\x01\xa15;8*\x91\x80\x00\u07d4a\xc80\xf1eG\x18\xf0u\u032b\xa3\x16\xfa\xac\xb8[}\x12\v\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4a\xc8\xf1\xfaC\xbf\x84i\x99\xec\xf4{+2M\xfbkc\xfe:\x89+^:\xf1k\x18\x80\x00\x00\u07d4a\xc9\xdc\u8c98\x1c\xb4\x0e\x98\xb0@+\xc3\xeb(4\x8f\x03\xac\x89\n\xac\xac\u0679\xe2+\x00\x00\u07d4a\u03a7\x1f\xa4d\xd6*\a\x06?\x92\v\f\xc9\x17S\x973\u0609Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4a\xd1\x01\xa03\xee\x0e.\xbb1\x00\xed\xe7f\xdf\x1a\xd0$IT\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4a\xedU\x96\u0197 \u007f=U\xb2\xa5\x1a\xa7\xd5\x0f\a\xfa\t\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\xff\x8eg\xb3M\x9e\xe6\xf7\x8e\xb3o\xfe\xa1\xb9\xf7\xc1W\x87\xaf\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4b\x05\xc2\xd5dtp\x84\x8a8@\xf3\x88~\x9b\x01]4u\\\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4b(\xad\xe9^\x8b\xb1}\x1a\xe2;\xfb\x05\x18AMI~\x0e\xb8\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94b)\xdc\xc2\x03\xb1\xed\xcc\xfd\xf0n\x87\x91\fE*\x1fMzr\x8a\x06\xe1\xd4\x1a\x8f\x9e\xc3P\x00\x00\u0794b+\xe4\xb4T\x95\xfc\xd91C\xef\xc4\x12\u0599\xd6\xcd\xc2=\u0148\xf0\x15\xf2W6B\x00\x00\u07d4b3\x1d\xf2\xa3\xcb\xee5 \xe9\x11\u07a9\xf7>\x90_\x89%\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4bVD\xc9Z\x87>\xf8\xc0l\u06de\x9fm\x8dv\x80\x04=b\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4be\xb2\xe7s\x0f6\xb7v\xb5-\f\x9d\x02\xad\xa5]\x8e<\xb6\x8965\u026d\xc5\u07a0\x00\x00\u07d4bh\n\x15\xf8\u0338\xbd\xc0/s`\xc2Z\xd8\u03f5{\x8c\u034965\u026d\xc5\u07a0\x00\x00\u07d4b\x94\xea\xe6\xe4 \xa3\xd5`\n9\xc4\x14\x1f\x83\x8f\xf8\xe7\xccH\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4b\x97\x1b\xf2cL\xee\v\xe3\u0249\x0fQ\xa5`\x99\u06f9Q\x9b\x89#\x8f\xd4,\\\xf0@\x00\x00\u07d4b\x9b\xe7\xab\x12jS\x98\xed\xd6\u069f\x18D~x\u0192\xa4\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4b\xb4\xa9\"nah\a\x1el\xbea\x11\xfe\xf0\xbcc\x8a\x03\xba\x19\x10\xbf4\x1b\x00\x00\x00\xe0\x94c\n\x91:\x901\xc9I*\xbdLA\u06f1PT\xcf\xecD\x16\x8a\x014X\xdbg\xaf5\xe0\x00\x00\xe0\x94c\fRs\x12mQ|\xe6q\x01\x81\x1c\xab\x16\xb8SL\xf9\xa8\x8a\x01\xfe\xcc\xc6%s\xbb\u04c0\x00\u07d4c\x100\xa5\xb2{\a(\x8aEio\x18\x9e\x11\x14\xf1*\x81\xc0\x89\x1b\x1azB\v\xa0\r\x00\x00\u07d4c\x10\xb0 \xfd\x98\x04IW\x99P\x92\t\x0f\x17\xf0NR\xcd\xfd\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4c+\x91I\xd7\x01x\xa7364'^\x82\u0555?'\x96{\x89%\xf2s\x93=\xb5p\x00\x00\u07d4c,\xec\xb1\f\xfc\xf3\x8e\u0246\xb4;\x87p\xad\xec\xe9 \x02!\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4c1\x02\x8c\xbbZ!H[\xc5\x1bVQB\x99;\xdb%\x82\xa9\x89\x1c\xfd\xd7F\x82\x16\xe8\x00\x00\u07d4c3O\xcf\x17E\x84\x0eK\tJ;\xb4\v\xb7o\x96\x04\xc0L\x89\u05e5\xd7\x03\xa7\x17\xe8\x00\x00\u07d4c4\nWqk\xfac\xebl\xd13r\x12\x02W[\xf7\x96\xf0\x89\va\xe0\xa2\f\x12q\x80\x00\u07d4cN\xfc$7\x11\a\xb4\xcb\xf0?y\xa9=\xfd\x93\xe41\xd5\xfd\x89B5\x82\xe0\x8e\xdc\\\x80\x00\xe0\x94c\\\x00\xfd\xf05\xbc\xa1_\xa3a\r\xf38N\x0f\xb7\x90h\xb1\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\u07d4ca.xb\xc2{X|\xfbm\xaf\x99\x12\xcb\x05\x1f\x03\n\x9f\x89\x02[\x19\u053f\xe8\xed\x00\x00\u07d4cfgU\xbdA\xb5\x98i\x97x<\x13\x040\b$+<\xb5\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4c{\xe7\x1b:\xa8\x15\xffE=VB\xf70tE\vd\xc8*\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94c}g\xd8\u007fXo\nZG\x9e \xee\x13\xea1\n\x10\xb6G\x8a\n:Y&\xaf\xa1\xe70\x00\x00\u07d4c\u007fXi\xd6\xe4i_\x0e\xb9\xe2s\x11\u0107\x8a\xff33\x80\x89j\xc0Nh\xaa\xec\x86\x00\x00\u07d4c\x97|\xad}\r\xcd\xc5+\x9a\xc9\xf2\xff\xa16\xe8d(\x82\xb8\x89\x04\x10\u0546\xa2\nL\x00\x00\u07d4c\xa6\x1d\xc3\n\x8e;0\xa7c\xc4!<\x80\x1c\xbf\x98s\x81x\x8965\u026d\xc5\u07a0\x00\x00\u07d4c\xacT\\\x99\x12C\xfa\x18\xae\xc4\x1dOoY\x8eUP\x15\u0709 \x86\xac5\x10R`\x00\x00\u07d4c\xb9uMu\xd1-8@9\xeci\x06<\v\xe2\x10\xd5\xe0\u3252\v\x86\f\xc8\xec\xfd\x80\x00\u07d4c\xbbfO\x91\x17\x03v(YM\xa7\xe3\xc5\b\x9f\xd6\x18\xb5\xb5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4c\u00a3\xd25\xe5\xee\xab\xd0\u0526\xaf\u06c9\xd9F'9d\x95\x89CN\xf0[\x9d\x84\x82\x00\x00\u07d4c\xc8\xdf\xde\v\x8e\x01\xda\xdc.t\x8c\x82L\xc06\x9d\U00010cc9\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4c\xd5Z\u065b\x917\xfd\x1b \xcc+O\x03\xd4,\xba\xdd\xf34\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4c\xd8\x00H\x87u\x96\xe0\u0084\x89\xe6P\xcdJ\xc1\x80\tjI\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\xe0\x94c\xe4\x14`>\x80\xd4\xe5\xa0\xf5\xc1\x87t FB%\x82\b\xe4\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94c\xe8\x8e.S\x9f\xfbE\x03\x86\xb4\xe4g\x89\xb2#\xf5GlE\x8a\x01U\x17\nw\x8e%\xd0\x00\x00\u07d4c\xef/\xbc=\xaf^\xda\xf4\xa2\x95b\x9c\xcf1\xbc\xdf@8\xe5\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4c\xf0\xe5\xa7R\xf7\x9fg\x12N\xedc:\xd3\xfd'\x05\xa3\x97\u0509\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94c\xf5\xb5=y\xbf.A\x14\x89Re0\"8E\xfa\xc6\xf6\x01\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4c\xfc\x93\x00\x13\x05\xad\xfb\u0278])\xd9)\x1a\x05\xf8\xf1A\v\x8965\u026d\xc5\u07a0\x00\x00\u0794c\xfek\xccK\x8a\x98P\xab\xbeu\x8070\xc92%\x1f\x14[\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4d\x03\xd0bT\x96\x90\xc8\xe8\xb6>\xaeA\xd6\xc1\tGn%\x88\x89lk\x93[\x8b\xbd@\x00\x00\u07d4d\x04+\xa6\x8b\x12\xd4\xc1Qe\x1c\xa2\x81;sR\xbdV\xf0\x8e\x89 \x86\xac5\x10R`\x00\x00\u0794d\x05\xdd\x13\xe9:\xbc\xff7~p\x0e<\x1a\x00\x86\xec\xa2})\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94d\n\xbam\xe9\x84\xd9E\x177x\x03p^\xae\xa7\t_J\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4d\v\xf8t\x15\xe0\xcf@s\x01\xe5Y\x9ah6m\xa0\x9b\xba\u0209\x1a\xbc\x9fA`\x98\x15\x80\x00\u07d4d \xf8\xbc\xc8\x16JaR\xa9\x9dk\x99i0\x05\xcc\xf7\xe0S\x8965f3\xeb\xd8\xea\x00\x00\u07d4d$\x1axD)\x0e\n\xb8U\xf1\u052au\xb5SE\x03\"$\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4d&J\xed\xd5-\xca\xe9\x18\xa0\x12\xfb\xcd\f\x03\x0e\xe6\xf7\x18!\x8965\u026d\xc5\u07a0\x00\x00\u07d4d7\x0e\x87 &E\x12Z5\xb2\a\xaf\x121\xfb`r\xf9\xa7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4d=\x9a\xee\u0531\x80\x94~\u04b9 |\xceL=\xdcU\xe1\xf7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4dC\xb8\xaec\x9d\xe9\x1c\xf7\xf0p\xa5G\x03\xb7\x18NH'l\\\x00w\xefK4\x89\x11X\xe4`\x91=\x00\x00\x00\xe0\x94d\xe2\xde! \v\x18\x99\u00e0\xc0e;P@\x13m\r\xc8B\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4d\xec\x8a[t?4y\xe7\a\xda\xe9\xee \u076aO@\xf1\u0649\n\u05ce\xbcZ\xc6 \x00\x00\u07d4e\x03\x86\v\x19\x10\b\xc1U\x83\xbf\u0201X\t\x93\x01v((\x8965\u026d\xc5\u07a0\x00\x00\u07d4e\x051\x911\x9e\x06z%\xe66\x1dG\xf3\u007fc\x18\xf84\x19\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4e\t;#\x9b\xbf\xba#\xc7w\\\xa7\xdaZ\x86H\xa9\xf5L\xf7\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4e\t\xee\xb14~\x84/\xfbA>7\x15^,\xbcs\x82s\xfd\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94e\vBUU\xe4\xe4\xc5\x17\x18\x14h6\xa2\xc1\xeew\xa5\xb4!\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4e\f\xf6}\xb0`\xcc\xe1uh\xd5\xf2\xa4#h|Idv\t\x89\x05k\xc7^-c\x10\x00\x00\u07d4e\x10\xdfB\xa5\x99\xbc\xb0\xa5\x19\u0329a\xb4\x88u\x9aogw\x89lk\x93[\x8b\xbd@\x00\x00\u07d4e6u\xb8B\xd7\u0634a\xf7\"\xb4\x11|\xb8\x1d\xac\x8ec\x9d\x89\x01\xae6\x1f\xc1E\x1c\x00\x00\u07d4eK~\x80\x87\x99\xa8=r\x87\xc6w\x06\xf2\xab\xf4\x9aId\x04\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94eORHG\xb3\xa6\xac\xc0\xd3\xd5\xf1\xf3b\xb6\x03\xed\xf6_\x96\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4eY4\u068etN\xaa=\xe3M\xbb\xc0\x89LN\xda\va\xf2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4e]\\\xd7H\x96)\xe2ANIb?\xabb\xa1~M6\x11\x89\x05\fL\xb2\xa1\f`\x00\x00\u07d4e\xaf\x8d\x8b[\x1d\x1e\xed\xfaw\xbc\xbc\x96\xc1\xb13\xf83\x06\u07c9\x05P\x05\xf0\xc6\x14H\x00\x00\u07d4e\xaf\x90\x87\xe0QgqT\x97\u0265\xa7I\x18\x94\x89\x00M\xef\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u0794e\xb4/\xae\xcc\x1e\u07f1B\x83\u0297\x9a\xf5E\xf6;0\xe6\f\x88\xfc\x93c\x92\x80\x1c\x00\x00\u0794e\xd3>\xb3\x9c\xdadS\xb1\x9ea\xc1\xfeM\xb91p\xef\x9d4\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4e\xd8\xddN%\x1c\xbc\x02\x1f\x05\xb0\x10\xf2\xd5\xdcR\f8r\xe0\x89-CW\x9a6\xa9\x0e\x00\x00\u07d4e\xea&\xea\xbb\xe2\xf6L\xcc\xcf\xe0h)\xc2]F7R\x02%\x89%\xf2s\x93=\xb5p\x00\x00\u07d4e\xeag\xad?\xb5j\xd5\xfb\x948}\u04ce\xb3\x83\x00\x1d|h\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94e\xeb\xae\xd2~\u06dd\xcc\x19W\xae\xe5\xf4R\xac!\x05\xa6\\\x0e\x8a\t7\u07ed\xae%\u26c0\x00\u07d4e\xee \xb0m\x9a\u0549\xa7\xe7\xce\x04\xb9\xf5\xf7\x95\xf4\x02\xae\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4e\xf544m/\xfbx\u007f\xa9\xcf\x18]t[\xa4)\x86\xbdn\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94e\xf5\x87\x0f&\xbc\xe0\x89g}\xfc#\xb5\x00\x1e\xe4\x92H4(\x8a\x01\x12\xb1\xf1U\xaa2\xa3\x00\x00\u07d4e\xfd\x02\xd7\x04\xa1*M\xac\xe9G\x1b\x06E\xf9b\xa8\x96q\u0209\x01\x8d\x1c\xe6\xe4'\u0340\x00\u07d4e\xff\x87O\xaf\xceM\xa3\x18\xd6\xc9=W\xe2\u00ca\rs\xe8 \x8968\x02\x1c\xec\u06b0\x00\x00\xe0\x94f\x05W\xbbC\xf4\xbe:\x1b\x8b\x85\xe7\xdf{<[\xcdT\x80W\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4f\b,u\xa8\xde1\xa59\x13\xbb\xd4M\xe3\xa07O\u007f\xaaA\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4f\x11\xceY\xa9\x8b\a*\xe9Y\xdcI\xadQ\x1d\xaa\xaa\xa1\x9dk\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4f \x1b\xd2'\xaem\u01bd\xfe\xd5\xfb\u0781\x1f\xec\xfe^\x9d\u0649 >\x9e\x84\x92x\x8c\x00\x00\u07d4f#4\x81G$\x93[y1\xdd\xcaa\x00\xe0\rFw'\u0349\"\x88&\x9d\a\x83\xd4\x00\x00\u07d4f'O\xea\x82\xcd0\xb6\u009b#5\x0eOO=1\nX\x99\x89p7\x05P\xab\x82\x98\x00\x00\u07d4f,\xfa\x03\x8f\xab7\xa0\x17E\xa3d\u1e41'\xc5\x03tm\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4f5\xb4oq\x1d-\xa6\xf0\xe1cp\u034e\xe4>\xfb,-R\x89lk\x93[\x8b\xbd@\x00\x00\u07d4f6\x04\xb0P0F\xe6$\xcd&\xa8\xb6\xfbGB\xdc\xe0*o\x89\x03\x8b\x9by~\xf6\x8c\x00\x00\u07d4f6\u05ecczH\xf6\x1d8\xb1L\xfdHe\xd3m\x14(\x05\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4f@\xcc\xf0SU\\\x13\n\xe2\xb6Vd~\xa6\xe3\x167\xb9\xab\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4fBK\xd8x[\x8c\xb4a\x10*\x90\x02\x83\xc3]\xfa\a\xefj\x89\x02.-\xb2ff\xfc\x80\x00\u07d4fL\xd6}\xcc\u026c\x82(\xb4\\U\u06cdvU\ve\x9c\u0709\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4fNC\x11\x98p\xaf\x10zD\x8d\xb1'\x8b\x04H8\xff\u036f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4fQso\xb5\x9b\x91\xfe\xe9\xc9:\xa0\xbdn\xa2\xf7\xb2Pa\x80\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4f[\x00\x0f\vw'P\xcc\x89k\x91\x8a\xacIK\x16\x80\x00\xe0\x94g]\\\xaa`\x9b\xf7\n\x18\xac\xa5\x80F]\x8f\xb71\r\x1b\xbb\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4gc F\u0732ZT\x93i(\xa9oB?3 \xcb\ud489lk\x93[\x8b\xbd@\x00\x00\u07d4ge\xdf%(\x0e\x8eO8\u0531\xcfDo\xc5\xd7\xebe\x9e4\x89\x05k\xc7^-c\x10\x00\x00\u07d4gv\xe13\xd9\xdc5L\x12\xa9Q\b{c\x96P\xf59\xa43\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4g\x85Q<\xf72\xe4~\x87g\ap\xb5A\x9b\xe1\f\xd1\xfct\x89lk\x93[\x8b\xbd@\x00\x00\u07d4g\x947\xea\xcfCxx\xdc)=H\xa3\x9c\x87\xb7B\x1a!l\x89\x03\u007f\x81\x82\x1d\xb2h\x00\x00\u07d4g\x9b\x9a\x10\x990Q~\x89\x99\t\x9c\xcf*\x91LL\x8d\xd94\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4g\xa8\x0e\x01\x90r\x1f\x949\rh\x02r\x9d\xd1,1\xa8\x95\xad\x89lk\x13u\xbc\x91V\x00\x00\u07d4g\xb8\xa6\xe9\x0f\xdf\n\x1c\xacD\x17\x930\x1e\x87P\xa9\xfayW\x890\x84\x9e\xbe\x166\x9c\x00\x00\u07d4g\xbc\x85\xe8}\xc3LN\x80\xaa\xfa\x06k\xa8\u049d\xbb\x8eC\x8e\x89\x15\xd1\xcfAv\xae\xba\x00\x00\u07d4g\xc9&\t>\x9b\x89'\x938\x10\u0642\"\xd6.+\x82\x06\xbb\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4g\xcf\xdanp\xbfvW\u04d0Y\xb5\x97\x90\xe5\x14Z\xfd\xbea\x89#\x05\r\tXfX\x00\x00\u07d4g\u0582\xa2\x82\xefs\xfb\x8dn\x90q\xe2aOG\xab\x1d\x0f^\x8965\u026d\xc5\u07a0\x00\x00\u07d4g\u05a8\xaa\x1b\xf8\xd6\xea\xf78N\x99=\xfd\xf1\x0f\n\xf6\x8aa\x89\n\xbc\xbbW\x18\x97K\x80\x00\u07d4g\u0692.\xff\xa4r\xa6\xb1$\xe8N\xa8\xf8k$\xe0\xf5\x15\xaa\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4g\xdf$-$\r\u0538\a\x1dr\xf8\xfc\xf3[\xb3\x80\x9dq\xe8\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4g\xee@n\xa4\xa7\xaej:8\x1e\xb4\xed\xd2\xf0\x9f\x17KI(\x898)c_\th\xb0\x00\x00\u07d4g\xf2\xbbx\xb8\xd3\xe1\x1f|E\x8a\x10\xb5\xc8\xe0\xa1\xd3tF}\x89a\t=|,m8\x00\x00\u07d4g\xfcR}\xce\x17\x85\xf0\xfb\x8b\xc7\xe5\x18\xb1\xc6i\xf7\xec\u07f5\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4h\x02}\x19U\x8e\xd73\x9a\b\xae\xe8\xde5Y\xbe\x06>\xc2\xea\x89lk\x93[\x8b\xbd@\x00\x00\u07d4h\x06@\x83\x8b\xd0zD{\x16\x8dm\x92;\x90\xcflC\xcd\u0289]\u0212\xaa\x111\xc8\x00\x00\u07d4h\a\xdd\u020d\xb4\x89\xb03\xe6\xb2\xf9\xa8\x15SW\x1a\xb3\xc8\x05\x89\x01\x9f\x8euY\x92L\x00\x00\xe0\x94h\rY\x11\xed\x8d\xd9\xee\xc4\\\x06\f\"?\x89\xa7\xf6 \xbb\u054a\x04<3\xc1\x93ud\x80\x00\x00\u07d4h\x11\xb5L\u0456c\xb1\x1b\x94\xda\x1d\xe2D\x82\x85\u035fh\u0649;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4h\x19\f\xa8\x85\xdaB1\x87L\x1c\xfbB\xb1X\n!s\u007f8\x89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94h(\x97\xbcO\x8e\x89\x02\x91 \xfc\xff\xb7\x87\xc0\x1a\x93\xe6A\x84\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4h)^\x8e\xa5\xaf\xd9\t?\xc0\xa4e\xd1W\x92+]*\xe24\x89\x01\x15NS!}\xdb\x00\x00\u07d4h.\x96'oQ\x8d1\xd7\xe5n0\u07f0\t\xc1!\x82\x01\xbd\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4h5\xc8\xe8\xb7J,\xa2\xae?J\x8d\x0fk\x95J>*\x83\x92\x89\x03B\x9c3]W\xfe\x00\x00\u07d4h63\x01\n\x88hk\xeaZ\x98\xeaS\xe8y\x97\xcb\xf7>i\x89\x05k9Bc\xa4\f\x00\x00\u07d4h=\xba6\xf7\xe9O@\xeaj\xea\ry\xb8\xf5!\xdeU\an\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4hA\x9cm\xd2\xd3\xceo\u02f3\xc7>/\xa0y\xf0`Q\xbd\xe6\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4hG;z}\x96Y\x04\xbe\u06e5V\u07fc\x17\x13l\xd5\xd44\x89\x05k\xc7^-c\x10\x00\x00\u07d4hG\x82[\xde\xe8$\x0e(\x04,\x83\xca\xd6B\U000868fd\u0709QP\xae\x84\xa8\xcd\xf0\x00\x00\xe0\x94hJD\xc0i3\x9d\b\xe1\x9auf\x8b\u06e3\x03\xbe\x85S2\x8a\x0e\u04b5%\x84\x1a\xdf\xc0\x00\x00\u07d4hS\x1fM\u0680\x8fS vz\x03\x114(\xca\f\xe2\xf3\x89\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4hy'\xe3\x04\x8b\xb5\x16*\xe7\xc1\\\xf7k\xd1$\xf9I{\x9e\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94h\x80\x9a\xf5\xd52\xa1\x1c\x1aMn2\xaa\xc7\\LR\xb0\x8e\xad\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4h\x86\xad\xa7\xbb\xb0a{\u0684!\x91\u018c\x92.\xa3\xa8\xac\x82\x89>\xe2;\xde\x0e} \x00\x00\xe0\x94h\x88>\x15.V`\xfe\xe5\x96&\xe7\xe3\xb4\xf0Q\x10\xe6\"/\x8a\v\x94c;\xe9u\xa6*\x00\x00\u07d4h\x8aV\x9e\x96U$\xeb\x1d\n\xc3\xd3s>\xab\x90\x9f\xb3\xd6\x1e\x89G\x8e\xae\x0eW\x1b\xa0\x00\x00\xe0\x94h\x8e\xb3\x85;\xbc\xc5\x0e\xcf\xee\x0f\xa8\u007f\n\xb6\x93\u02bd\xef\x02\x8a\x06\xb1\n\x18@\x06G\xc0\x00\x00\u07d4h\xa7B_\xe0\x9e\xb2\x8c\xf8n\xb1y>A\xb2\x11\xe5{\u058d\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4h\xa8l@#\x88\xfd\xdcY\x02\x8f\xecp!\u933f\x83\x0e\xac\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\xe0\x94h\xac\u06a9\xfb\x17\xd3\xc3\t\x91\x1aw\xb0_S\x91\xfa\x03N\xe9\x8a\x01\xe5.3l\xde\"\x18\x00\x00\u07d4h\xad\xdf\x01\x9dk\x9c\xabp\xac\xb1?\v1\x17\x99\x9f\x06.\x12\x89\x02\xb5\x12\x12\xe6\xb7\u0200\x00\u07d4h\xb3\x186\xa3\n\x01j\xda\x15{c\x8a\xc1]\xa7?\x18\xcf\u0789\x01h\u048e?\x00(\x00\x00\xe0\x94h\xb6\x85G\x88\xa7\xc6Il\xdb\xf5\xf8K\x9e\xc5\xef9+x\xbb\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4h\xc0\x84\x90\u021b\xf0\u05b6\xf3 \xb1\xac\xa9\\\x83\x12\xc0\x06\b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4h\xc7\xd1q\x1b\x01\x1a3\xf1o\x1fU\xb5\xc9\x02\xcc\xe9p\xbd\u05c9\b=lz\xabc`\x00\x00\u07d4h\xc8y\x1d\xc3B\xc3sv\x9e\xa6\x1f\xb7\xb5\x10\xf2Q\xd3 \x88\x8965\u026d\xc5\u07a0\x00\x00\u07d4h\u07d4|I[\ubbb8\u8273\xf9S\xd53\x87K\xf1\x06\x89\x1d\x99E\xab+\x03H\x00\x00\u07d4h\xe8\x02'@\xf4\xaf)\xebH\xdb2\xbc\xec\xdd\xfd\x14\x8d=\xe3\x8965\u026d\xc5\u07a0\x00\x00\u07d4h\xecy\u057eqUql@\x94\x1cy\u05cd\x17\u079e\xf8\x03\x89\x1b#8w\xb5 \x8c\x00\x00\u07d4h\xee\xc1\u222c1\xb6\xea\xba~\x1f\xbdO\x04\xadW\x9ak]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4h\xf5%\x92\x1d\xc1\x1c2\x9buO\xbf>R\x9f\xc7#\xc84\u0349WG=\x05\u06ba\xe8\x00\x00\u07d4h\xf7\x19\xae4+\xd7\xfe\xf1\x8a\x05\u02f0/pZ\u04ce\u0572\x898\xeb\xad\\\u0710(\x00\x00\xe0\x94h\xf7W<\xd4W\xe1L\x03\xfe\xa4>0-04|\x10p\\\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4h\xf8\xf4QU\xe9\x8cP)\xa4\xeb\u0175'\xa9.\x9f\xa81 \x89\xf0{D\xb4\a\x93 \x80\x00\u07d4h\xfe\x13W!\x8d\tXI\xcdW\x98B\u012a\x02\xff\x88\x8d\x93\x89lk\x93[\x8b\xbd@\x00\x00\u07d4i\x02(\xe4\xbb\x12\xa8\u0535\u09d7\xb0\xc5\xcf*u\t\x13\x1e\x89e\xea=\xb7UF`\x00\x00\u07d4i\x05\x94\xd3\x06a<\xd3\xe2\xfd$\xbc\xa9\x99J\u064a=s\xf8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94i\a2ir\x9ed\x14\xb2n\xc8\xdc\x0f\xd95\xc7;W\x9f\x1e\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\xe0\x94i\x19\xdd^]\xfb\x1a\xfa@G\x03\xb9\xfa\xea\x8c\xee5\xd0\rp\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4i4\x92\xa5\xc5\x13\x96\xa4\x82\x88\x16i\xcc\xf6\xd8\xd7y\xf0\tQ\x89\x12\xbfPP:\xe3\x03\x80\x00\u07d4i=\x83\xbe\tE\x9e\xf89\v.0\xd7\xf7\u008d\xe4\xb4(N\x89lk\x93[\x8b\xbd@\x00\x00\u07d4iQp\x83\xe3\x03\xd4\xfb\xb6\xc2\x11E\x14!]i\xbcF\xa2\x99\x89\x05k\xc7^-c\x10\x00\x00\u07d4iUPel\xbf\x90\xb7]\x92\xad\x91\"\xd9\r#\xcah\xcaM\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94iX\xf8;\xb2\xfd\xfb'\xce\x04\t\xcd\x03\xf9\xc5\xed\xbfL\xbe\u074a\x04<3\xc1\x93ud\x80\x00\x00\u0794i[\x0fRBu7\x01\xb2d\xa6pq\xa2\u0708\b6\xb8\u06c8\u3601\x1b\xech\x00\x00\xe0\x94i[L\xce\bXV\xd9\xe1\xf9\xff>y\x94 #5\x9e_\xbc\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94if\x06:\xa5\xde\x1d\xb5\xc6q\xf3\xddi\x9dZ\xbe!>\xe9\x02\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4it\u0224\x14\u03ae\xfd<.M\xfd\xbe\xf40V\x8d\x9a\x96\v\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\xe0\x94iximQP\xa9\xa2cQ?\x8ft\u0196\xf8\xb19|\xab\x8a\x01g\xf4\x82\xd3\u0171\xc0\x00\x00\xe0\x94iy{\xfb\x12\u027e\u0582\xb9\x1f\xbcY5\x91\xd5\xe4\x027(\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94i\u007fUSk\xf8Z\xdaQ\x84\x1f\x02\x87b:\x9f\x0e\u041a\x17\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4i\x82\xfe\x8a\x86~\x93\xebJ\v\xd0QX\x93\x99\xf2\xec\x9aR\x92\x89lk\x93[\x8b\xbd@\x00\x00\u07d4i\x8a\x8ao\x01\xf9\xabh/c|yi\xbe\x88_lS\x02\xbf\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4i\x8a\xb9\xa2\xf33\x81\xe0|\fGC=\r!\xd6\xf36\xb1'\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4i\x94\xfb21\xd7\xe4\x1dI\x1a\x9dh\xd1\xfaL\xae,\xc1Y`\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4i\x9c\x9e\xe4q\x95Q\x1f5\xf8b\xcaL\"\xfd5\xae\x8f\xfb\xf4\x89\x04V9\x18$O@\x00\x00\u07d4i\x9f\xc6\u058aGuW<\x1d\u036e\xc80\xfe\xfdP9|N\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4i\xaf(\xb0tl\xac\r\xa1p\x84\xb99\x8c^6\xbb:\r\xf2\x896w\x03n\xdf\n\xf6\x00\x00\u07d4i\xb8\x0e\xd9\x0f\x84\x83J\xfa?\xf8.\xb9dp;V\tw\u0589\x01s\x17\x90SM\xf2\x00\x00\xe0\x94i\xb8\x1dY\x81\x14\x1e\u01e7\x14\x10`\xdf\u03cf5\x99\xff\xc6>\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4i\xbc\xfc\x1dC\xb4\xba\x19\xde{'K\xdf\xfb5\x13\x94\x12\xd3\u05c95e\x9e\xf9?\x0f\xc4\x00\x00\u07d4i\xbd%\xad\xe1\xa34lY\xc4\xe90\xdb*\x9dq^\xf0\xa2z\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4i\xc0\x8dtGT\xdep\x9c\xe9n\x15\xae\r\x1d9[:\"c\x8965\u026d\xc5\u07a0\x00\x00\u07d4i\xc2\xd85\xf1>\xe9\x05\x80@\x8ej2\x83\xc8\u0326\xa44\xa2\x89#\x8f\xd4,\\\xf0@\x00\x00\u07d4i\xc9N\a\u0129\xbe3\x84\xd9]\xfa<\xb9)\x00Q\x87;{\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4i\xcb>!S\x99\x8d\x86\xe5\xee \xc1\xfc\u0466\xba\uec86?\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4i\u04ddQ\b\x89\xe5R\xa3\x96\x13[\xfc\xdb\x06\xe3~8v3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94i\u064f8\xa3\xba=\xbc\x01\xfa\\,\x14'\xd8b\x83//p\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94i\xe2\xe2\xe7\x040|\xcc[\\\xa3\xf1d\xfe\xce.\xa7\xb2\xe5\x12\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4i\xffB\x90t\u02dblc\xbc\x91B\x84\xbc\xe5\xf0\xc8\xfb\xf7\u0409\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4i\xff\x89\x01\xb5Av?\x81|_)\x98\xf0-\xcf\xc1\xdf)\x97\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4j\x02:\xf5}XM\x84^i\x876\xf10\u06dd\xb4\r\xfa\x9a\x89\x05[ \x1c\x89\x00\x98\x00\x00\u07d4j\x04\xf5\xd5?\xc0\xf5\x15\xbe\x94+\x8f\x12\xa9\xcbz\xb0\xf3\x97x\x89\xa9\xaa\xb3E\x9b\xe1\x94\x00\x00\u07d4j\x05\xb2\x1cO\x17\xf9\xd7?_\xb2\xb0\u02c9\xffSV\xa6\xcc~\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\xe0\x94j\x0f\x05`f\xc2\xd5f(\x85\x02s\xd7\xec\xb7\xf8\xe6\xe9\x12\x9e\x8a\x01\x0f\r)<\u01e5\x88\x00\x00\u07d4j\x13\xd5\xe3,\x1f\xd2m~\x91\xffn\x051`\xa8\x9b,\x8a\xad\x89\x02\xe6/ \xa6\x9b\xe4\x00\x00\u07d4j.\x86F\x9a[\xf3|\xee\x82\xe8\x8bL8c\x89](\xfc\xaf\x89\x1c\"\x92f8[\xbc\x00\x00\u07d4j6\x94BL|\u01b8\xbc\u067c\u02baT\f\xc1\xf5\xdf\x18\u05c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94jB\u0297\x1cex\u056d\xe2\x95\xc3\xe7\xf4\xad3\x1d\xd3BN\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4jD\xaf\x96\xb3\xf02\xaed\x1b\xebg\xf4\xb6\xc83B\xd3|]\x89\x01\x92t\xb2Y\xf6T\x00\x00\u07d4jL\x89\a\xb6\x00$\x80W\xb1\xe4cT\xb1\x9b\u0705\x9c\x99\x1a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4jQNbB\xf6\xb6\x8c\x13~\x97\xfe\xa1\u73b5U\xa7\xe5\xf7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4jS\xd4\x1a\xe4\xa7R\xb2\x1a\xbe\xd57FI\x95:Q=\xe5\xe5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4jaY\aJ\xb5s\xe0\xeeX\x1f\x0f=\xf2\u05a5\x94b\x9bt\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4jc7\x83?\x8fjk\xf1\f\xa7\xec!\xaa\x81\x0e\xd4D\xf4\u02c97\xbd$4\\\xe8\xa4\x00\x00\u07d4jcS\xb9qX\x9f\x18\xf2\x95\\\xba(\xab\xe8\xac\xcejWa\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4jc\xfc\x89\xab\xc7\xf3n(-\x80x{{\x04\xaf\xd6U>q\x89\b\xacr0H\x9e\x80\x00\x00\u07d4jg\x9e7\x8f\xdc\xe6\xbf\xd9\u007f\xe6/\x04)Z$\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4j\x8c\xea-\xe8J\x8d\xf9\x97\xfd?\x84\xe3\b=\x93\xdeW\u0369\x89\x05k\xe0<\xa3\xe4}\x80\x00\xe0\x94j\x97Xt;`>\xea:\xa0RKB\x88\x97#\xc4\x159H\x8a\x02#\x85\xa8'\xe8\x15P\x00\x00\u07d4j\xa5s/;\x86\xfb\x8c\x81\xef\xbek[G\xb5cs\v\x06\u020965\u026d\xc5\u07a0\x00\x00\u07d4j\xb3#\xaePV\xed\nE0r\u016b\xe2\xe4/\xcf]q9\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4j\xb5\xb4\xc4\x1c\u0778)i\f/\xda\u007f \xc8^b\x9d\xd5\u0549d\u052fqL2\x90\x00\x00\u07d4j\xc4\x0fS-\xfe\xe5\x11\x81\x17\u04ad5-\xa7}Om\xa2\u0209\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4j\xc4\u053e-\xb0\u065d\xa3\xfa\xaa\xf7RZ\xf2\x82\x05\x1dj\x90\x89\x04X\xcaX\xa9b\xb2\x80\x00\u07d4j\xcd\u0723\xcd+I\x90\xe2\\\xd6\\$\x14\x9d\t\x12\t\x9ey\x89\xa2\xa1\xe0|\x9fl\x90\x80\x00\u07d4j\xd9\v\xe2R\xd9\xcdFM\x99\x81%\xfa\xb6\x93\x06\v\xa8\xe4)\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4j\u0753!\x93\xcd8IJ\xa3\xf0:\xec\xccKz\xb7\xfa\xbc\xa2\x89\x04\xdbs%Gc\x00\x00\x00\xe0\x94j\xe5\u007f'\x91|V*\x13*M\x1b\xf7\xec\n\u01c5\x83)&\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4j\xeb\x9ftt.\xa4\x91\x81=\xbb\xf0\xd6\xfc\xde\x1a\x13\x1dM\xb3\x89\x17\xe5T0\x8a\xa00\x00\x00\u07d4j\xf25\u04bb\xe0P\xe6)\x16\x15\xb7\x1c\xa5\x82\x96X\x81\x01B\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4j\xf6\xc7\xee\x99\xdf'\x1b\xa1[\xf3\x84\xc0\xb7d\xad\xcbM\xa1\x82\x8965f3\xeb\xd8\xea\x00\x00\u07d4j\xf8\xe5Yih,q_H\xadO\xc0\xfb\xb6~\xb5\x97\x95\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4j\xf9@\xf6>\u0278\xd8v'*\u0296\xfe\xf6\\\xda\xce\xcd\ua262\xa1]\tQ\x9b\xe0\x00\x00\u07d4j\xf9\xf0\xdf\uebbb_d\xbf\x91\xabw\x16i\xbf\x05)US\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4j\xff\x14f\xc2b6u\xe3\xcb\x0eu\xe4#\xd3z%\xe4B\xeb\x89]\u0212\xaa\x111\xc8\x00\x00\xe0\x94k\r\xa2Z\xf2g\u05c3l\"k\xca\xe8\xd8r\xd2\xceR\xc9A\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4k\x10\xf8\xf8\xb3\xe3\xb6\r\xe9\n\xa1-\x15_\x9f\xf5\xff\xb2,P\x89lk\x93[\x8b\xbd@\x00\x00\u07d4k\x17Y\x8a\x8e\xf5Oyz\xe5\x15\u0336Q}\x18Y\xbf\x80\x11\x89\x05k\xc7^-c\x10\x00\x00\u07d4k \xc0\x80`jy\xc7;\xd8\xe7[\x11qzN\x8d\xb3\xf1\u00c9\x10?sX\x03\xf0\x14\x00\x00\u07d4k\"\x84D\x02!\xce\x16\xa88-\xe5\xff\x02)G\"i\xde\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4k0\xf1\x829\x10\xb8m:\xcbZj\xfc\x9d\xef\xb6\xf3\xa3\v\xf8\x89\u3bb5sr@\xa0\x00\x00\u07d4k8\u0784\x1f\xad\u007fS\xfe\x02\xda\x11[\xd8j\xaff$f\xbd\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4kK\x99\xcb?\xa9\xf7\xb7L\u3903\x17\xb1\xcd\x13\t\n\x1az\x89\x03\x1b2~i]\xe2\x00\x00\u07d4kZ\xe7\xbfx\xecu\xe9\f\xb5\x03\xc7x\xcc\u04f2KO\x1a\xaf\x89+^:\xf1k\x18\x80\x00\x00\u07d4kc\xa2\u07f2\xbc\xd0\xca\xec\x00\"\xb8\x8b\xe3\f\x14Q\xeaV\xaa\x89+\xdbk\xf9\x1f\u007fL\x80\x00\u07d4kew\xf3\x90\x9aMm\xe0\xf4\x11R-Ep8d\x004\\\x89e\xea=\xb7UF`\x00\x00\u07d4kr\xa8\xf0a\xcf\xe6\x99j\xd4G\xd3\xc7,(\xc0\xc0\x8a\xb3\xa7\x89\xe7\x8cj\u01d9\x12b\x00\x00\u07d4kv\rHw\xe6\xa6'\xc1\xc9g\xbe\xe4Q\xa8P}\xdd\u06eb\x891T\xc9r\x9d\x05x\x00\x00\u07d4k\x83\xba\xe7\xb5e$EXU[\xcfK\xa8\xda \x11\x89\x1c\x17\x89lk\x93[\x8b\xbd@\x00\x00\u07d4k\x92]\xd5\xd8\xeda2\xabm\b`\xb8,D\xe1\xa5\x1f\x1f\xee\x89P; >\x9f\xba \x00\x00\xe0\x94k\x94a]\xb7Pej\u00cc~\x1c\xf2\x9a\x9d\x13g\u007fN\x15\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4k\x95\x1aC'N\xea\xfc\x8a\t\x03\xb0\xaf.\xc9+\xf1\xef\xc89\x89\x05k\xc7^-c\x10\x00\x00\u07d4k\x99%!\xec\x85#p\x84\x8a\u0597\xcc-\xf6Nc\xcc\x06\xff\x8965\u026d\xc5\u07a0\x00\x00\u07d4k\xa8\xf7\xe2_\xc2\xd8qa\x8e$\xe4\x01\x84\x19\x917\xf9\xf6\xaa\x89\x15\xafd\x86\x9ak\xc2\x00\x00\u07d4k\xa9\xb2\x1b5\x10k\xe1Y\xd1\xc1\xc2ez\xc5l\u049f\xfdD\x89\xf2\xdc}G\xf1V\x00\x00\x00\u07d4k\xafz*\x02\xaex\x80\x1e\x89\x04\xadz\xc0Q\b\xfcV\xcf\xf6\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94k\xb2\xac\xa2?\xa1bm\x18\xef\xd6w\u007f\xb9}\xb0-\x8e\n\xe4\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4k\xb4\xa6a\xa3:q\xd4$\u051b\xb5\xdf(b.\xd4\xdf\xfc\xf4\x89\",\x8e\xb3\xfff@\x00\x00\u07d4k\xb5\b\x13\x14j\x9a\xddB\xee\"\x03\x8c\x9f\x1fti\xd4\u007fG\x89\n\xdaUGK\x814\x00\x00\u07d4k\xbc?5\x8af\x8d\u0461\x1f\x03\x80\xf3\xf71\bBj\xbdJ\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4k\xbd\x1eq\x93\x90\xe6\xb9\x10C\xf8\xb6\xb9\u07c9\x8e\xa8\x00\x1b4\x89llO\xa6\xc3\xdaX\x80\x00\u07d4k\xc8Z\xcdY(r.\xf5\tS1\xee\x88\xf4\x84\xb8\u03c3W\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4k\xd3\xe5\x9f#\x9f\xaf\xe4wk\xb9\xbd\xddk\ue0fa]\x9d\x9f\x8965\u026d\xc5\u07a0\x00\x00\u07d4k\xd4W\xad\xe0Qy]\xf3\xf2F\\89\xae\xd3\xc5\xde\xe9x\x8964\xbf9\xab\x98x\x80\x00\u07d4k\xe1c\x13d>\xbc\x91\xff\x9b\xb1\xa2\xe1\x16\xb8T\xea\x93:E\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4k\xe7Y^\xa0\xf0hH\x9a'\x01\xecFI\x15\x8d\xdcC\xe1x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4k\xe9\x03\x0e\xe6\xe2\xfb\u0111\xac\xa3\xde@\"\xd3\x01w+{}\x89\x01s\x17\x90SM\xf2\x00\x00\xe0\x94k\xec1\x1a\xd0P\b\xb4\xaf5<\x95\x8c@\xbd\x06s\x9a?\xf3\x8a\x03w\xf6*\x0f\nbp\x00\x00\u07d4k\xf7\xb3\xc0e\xf2\xc1\xe7\xc6\xeb\t+\xa0\xd1Pf\xf3\x93\u0478\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4k\xf8o\x1e/+\x802\xa9\\Mw8\xa1\t\xd3\xd0\xed\x81\x04\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4l\x05\xe3N^\xf2\xf4.\u041d\xef\xf1\x02l\xd6k\xcbi`\xbb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4l\b\xa6\xdc\x01s\xc74)U\xd1\xd3\xf2\xc0e\xd6/\x83\xae\u01c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4l\n\xe9\xf0C\xc84\xd4Bq\xf14\x06Y=\xfe\tO8\x9f\x89RD*\xe13\xb6*\x80\x00\u07d4l\f\xc9\x17\xcb\xee}|\t\x97c\xf1Nd\xdf}4\xe2\xbf\t\x89\r\x8drkqw\xa8\x00\x00\xe0\x94l\x0eq/@\\Yr_\xe8)\xe9wK\xf4\xdf\u007fM\xd9e\x8a\f(h\x88\x9c\xa6\x8aD\x00\x00\xe0\x94l\x10\x12\x05\xb3#\xd7uD\xd6\xdcR\xaf7\xac\xa3\xce\xc6\xf7\xf1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4l\x15\xec5 \xbf\x8e\xbb\xc8 \xbd\x0f\xf1\x97x7T\x94\u03dd\x89l\xb7\xe7Hg\xd5\xe6\x00\x00\xe0\x94l\x1d\xdd3\xc8\x19f\u0706!w`q\xa4\x12\x94\x82\xf2\xc6_\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4l%2\u007f\x8d\u02f2\xf4^V\x1e\x86\xe3]\x88P\xe5:\xb0Y\x89;\xcd\xf9\xba\xfe\xf2\xf0\x00\x00\u07d4l.\x9b\xe6\u052bE\x0f\xd1%1\xf3?\x02\x8caFt\xf1\x97\x89\xc2\x12z\xf8X\xdap\x00\x00\u07d4l5\x9eX\xa1=Ex\xa93\x8e3\\g\xe7c\x9f_\xb4\u05c9\v\xd1[\x94\xfc\x8b(\x00\x00\u07d4l=\x18pA&\xaa\x99\xee3B\xce`\xf5\xd4\xc8_\x18g\u0349\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4lGK\xc6jTx\x00f\xaaOQ.\xef\xa7s\xab\xf9\x19\u01c9\x05\x18\x83\x15\xf7v\xb8\x00\x00\u07d4lNBn\x8d\xc0\x05\u07e3Ql\xb8\xa6\x80\xb0.\ua56e\x8e\x89Hz\x9a0E9D\x00\x00\u07d4lR\xcf\b\x95\xbb5\xe6V\x16\x1eM\xc4j\xe0\xe9m\xd3\xe6,\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4lT\"\xfbK\x14\xe6\u064b`\x91\xfd\xecq\xf1\xf0\x86@A\x9d\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4l\\:T\u0367\xc2\xf1\x18\xed\xbaCN\xd8\x1en\xbb\x11\xddz\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4lc\xf8EV\u0490\xbf\u0359\xe44\ue657\xbf\xd7yWz\x89lk\x93[\x8b\xbd@\x00\x00\u07d4lc\xfc\x85\x02\x9a&T\u05db+\xeaM\xe3I\xe4REw\u0149#\xc7W\a+\x8d\xd0\x00\x00\u07d4led\xe5\xc9\xc2N\xaa\xa7D\xc9\xc7\xc9h\xc9\xe2\xc9\xf1\xfb\xae\x89I\x9bB\xa2\x119d\x00\x00\xe0\x94lg\xd6\xdb\x1d\x03Ql\x12\x8b\x8f\xf24\xbf=I\xb2m)A\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4lg\xe0\u05f6.*\bPiE\xa5\xdf\xe3\x82c3\x9f\x1f\"\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4lj\xa0\xd3\vdr\x19\x90\xb9PJ\x86?\xa0\xbf\xb5\xe5}\xa7\x89\x92^\x06\xee\xc9r\xb0\x00\x00\u07d4lqJX\xff\xf6\xe9}\x14\xb8\xa5\xe3\x05\xeb$@eh\x8b\xbd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4l\x80\rKI\xba\a%\x04`\xf9\x93\xb8\xcb\xe0\v&j%S\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4l\x80\x8c\xab\xb8\xff_\xbbc\x12\xd9\xc8\xe8J\xf8\xcf\x12\xef\bu\x89\xd8\xd8X?\xa2\xd5/\x00\x00\xe0\x94l\x82 )!\x8a\xc8\xe9\x8a&\f\x1e\x06@)4\x889\x87[\x8a\x01\x0f\x97\xb7\x87\xe1\xe3\b\x00\x00\u07d4l\x84\u02e7|m\xb4\xf7\xf9\x0e\xf1=^\xe2\x1e\x8c\xfc\u007f\x83\x14\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94l\x86\x87\xe3Aw\x10\xbb\x8a\x93U\x90!\xa1F\x9ej\x86\xbcw\x8a\x02[-\xa2x\xd9k{\x80\x00\xe0\x94l\x88,'s,\xef\\|\x13\xa6\x86\xf0\xa2\xeawUZ\u0089\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4l\xa5\xde\x00\x81}\xe0\xce\xdc\xe5\xfd\x00\x01(\xde\xde\x12d\x8b<\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4l\xa6\xa12\xce\x1c\u0488\xbe\xe3\x0e\xc7\xcf\xef\xfb\x85\xc1\xf5\nT\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94l\xb1\x1e\xcb2\xd3\u0382\x96\x011\x066\xf5\xa1\f\xf7\u03db_\x8a\x04?\u851c8\x01\xf5\x00\x00\u07d4l\xc1\xc8x\xfal\u078a\x9a\v\x83\x11$~t\x1eFB\xfem\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94l\xcb\x03\xac\xf7\xf5<\xe8z\xad\xcc!\xa9\x93-\xe9\x15\xf8\x98\x04\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4l\xd2\x12\xae\xe0N\x01?=*\xba\u04a0#`k\xfb\\j\u01c9lj\xccg\u05f1\xd4\x00\x00\u07d4l\xd2(\xdcq!i0\u007f\xe2|\xebtw\xb4\x8c\xfc\x82r\xe5\x89\x044\xea\x94\u06caP\x00\x00\u07d4l\xe1\xb0\xf6\xad\xc4pQ\xe8\xab8\xb3\x9e\xdbA\x86\xb0;\xab\u0309Ay\x97\x94\xcd$\xcc\x00\x00\u07d4l\xea\xe3s=\x8f\xa4=l\xd8\f\x1a\x96\xe8\xeb\x93\x10\x9c\x83\xb7\x89\x10'\x94\xad \xdah\x00\x00\u07d4m\x05i\xe5U\x8f\xc7\xdf'f\xf2\xba\x15\u070a\xef\xfc[\xebu\x89\xd8\xe6\x00\x1el0+\x00\x00\u07d4m\x12\x0f\f\xaa\xe4O\xd9K\xca\xfeU\xe2\xe2y\uf5ba\\z\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4m\x14V\xff\xf0\x10N\xe8D\xa31G7\x8438\xd2L\xd6l\x89\a\xb0l\xe8\u007f\xddh\x00\x00\u07d4m \xef\x97\x04g\nP\v\xb2i\xb5\x83.\x85\x98\x02\x04\x9f\x01\x89\a\f\x1c\xc7;\x00\xc8\x00\x00\xe0\x94m/\x97g4\xb9\xd0\a\r\x18\x83\xcfz\u02b8\xb3\xe4\x92\x0f\xc1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4m9\xa9\u93c1\xf7i\xd7:\xad,\xea\xd2v\xac\x13\x87\xba\xbe\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4m;x6\xa2\xb9\u0619r\x1aM#{R#\x85\xdc\xe8\xdf\u034966\xc2^f\xec\xe7\x00\x00\u07d4m?+\xa8V\u033b\x027\xfava\x15k\x14\xb0\x13\xf2\x12@\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94m@\b\xb4\xa8\x88\xa8&\xf2H\xeej\v\r\xfd\xe9\xf92\x10\xb9\x8a\x01'\xfc\xb8\xaf\xae \xd0\x00\x00\u07d4m@\xca'\x82m\x97s\x1b>\x86\xef\xfc\u05f9*Aa\xfe\x89\x89lk\x93[\x8b\xbd@\x00\x00\u07d4mD\x97J1\u0447\xed\xa1m\xddG\xb9\xc7\xecP\x02\xd6\x1f\xbe\x892\xf5\x1e\u06ea\xa30\x00\x00\xe0\x94mK\\\x05\xd0j \x95~\x17H\xabm\xf2\x06\xf3C\xf9/\x01\x8a\x02\x1f6\x06\x99\xbf\x82_\x80\x00\xe0\x94mL\xbf=\x82\x84\x83:\xe9\x93D0>\b\xb4\xd6\x14\xbf\xda;\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4mY\xb2\x1c\xd0\xe2t\x88\x04\u066b\xe0d\xea\u00be\xf0\xc9_'\x89lk\x93[\x8b\xbd@\x00\x00\u07d4mc\u04ce\xe8\xb9\x0e\x0en\xd8\xf1\x92\xed\xa0Q\xb2\u05a5\x8b\xfd\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4mf4\xb5\xb8\xa4\x01\x95\xd9I\x02z\xf4\x82\x88\x02\t,\ued89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94m}\x1c\x94\x95\x11\xf8\x83\x03\x80\x8c`\xc5\xea\x06@\xfc\xc0&\x83\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4m\x84m\xc1&W\xe9\x1a\xf2P\bQ\x9c>\x85\u007fQp}\u0589\xf8\xd3\v\xc9#B\xf8\x00\x00\u07d4m\x91\x93\x99k\x19F\x17!\x11\x06\xd1c^\xb2l\u0136ll\x89\x15\xaa\x1e~\x9d\xd5\x1c\x00\x00\u07d4m\x99\x97P\x98\x82\x02~\xa9G#\x14$\xbe\xde\xde)e\u043a\x89l\x81\u01f3\x11\x95\xe0\x00\x00\u07d4m\xa0\xed\x8f\x1di3\x9f\x05\x9f*\x0e\x02G\x1c\xb4O\xb8\u00fb\x892\xbc8\xbbc\xa8\x16\x00\x00\u07d4m\xb7+\xfdC\xfe\xf4e\xcaV2\xb4Z\xabra@N\x13\xbf\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94m\xbe\x8a\xbf\xa1t(\x06&9\x817\x1b\xf3\xd3U\x90\x80kn\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4m\xc3\xf9+\xaa\x1d!\u06b78+\x892a\xa05o\xa7\xc1\x87\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4m\xc7\x05:q\x86\x16\xcf\u01cb\xeec\x82\xeeQ\xad\xd0\xc7\x030\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94m\xcc~d\xfc\xaf\xcb\xc2\xdcl\x0e^f,\xb3G\xbf\xfc\xd7\x02\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4m\xda_x\x8alh\x8d\u07d2\x1f\xa3\x85.\xb6\xd6\xc6\xc6)f\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4m\xdb`\x92w\x9dXB\xea\xd3x\xe2\x1e\x81 \xfdLk\xc12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4m\xdf\xefc\x91U\u06ab\n\\\xb4\x95:\xa8\u016f\xaa\x88\x04S\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4m\xe0/-\xd6~\xfd\xb794\x02\xfa\x9e\xaa\xcb\xcfX\x9d.V\x89@\x13\x8b\x91~\u07f8\x00\x00\u07d4m\u4d418\\\xf7\xfc\x9f\xe8\xc7}\x13\x1f\xe2\xeew$\xc7j\x89})\x97s=\xcc\xe4\x00\x00\u07d4m\xe4\xd1R\x19\x18/\xaf:\xa2\xc5\xd4\xd2Y_\xf20\x91\xa7'\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4m\xed\xf6.t?M,*K\x87\xa7\x87\xf5BJz\xeb9<\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4m\xf2Of\x85\xa6/y\x1b\xa37\xbf?\xf6~\x91\xf3\u053c:\x89ukI\xd4\nH\x18\x00\x00\u07d4m\xf5\xc8O{\x90\x9a\xab>a\xfe\x0e\xcb\x1b;\xf2`\"*\u0489\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4m\xff\x90\xe6\xdc5\x9d%\x90\x88+\x14\x83\xed\xbc\xf8\x87\xc0\xe4#\x8965\u026d\xc5\u07a0\x00\x00\u07d4n\x01\xe4\xadV\x9c\x95\xd0\a\xad\xa3\r^-\xb1(\x88I\"\x94\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\a;f\u0478\xc6gD\u0600\x96\xa8\u0759\xec~\x02(\u0689\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\x0e\xe7\x06\x12\xc9v(}I\x9d\u07e6\xc0\xdc\xc1,\x06\xde\xea\x89\a\v\u0579V!F\x00\x00\xe0\x94n\x12\xb5\x1e\"[JCr\xe5\x9a\u05e2\xa1\xa1>\xa3\u04e17\x8a\x03\x00F\xc8\xccw_\x04\x00\x00\u07d4n\x1a\x04l\xaf[JW\xf4\xfdK\xc1sb!&\xb4\xe2\xfd\x86\x89a\t=|,m8\x00\x00\u07d4n\x1e\xa4\xb1\x83\xe2R\u027bwg\xa0\x06\u05346\x96\u02ca\xe9\x89\x0f\xf3x<\x85\xee\u0400\x00\u07d4n%[p\n\xe7\x13\x8aK\xac\xf2(\x88\xa9\xe2\xc0\n(^\xec\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n'\n\xd5)\xf1\xf0\xb8\xd9\xcbm$'\xec\x1b~-\xc6Jt\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4n.\xab\x85\u0709\xfe)\xdc\n\xa1\x852G\u06b4:R=V\x89\x04V9\x18$O@\x00\x00\u07d4n:Q\xdbt=3M/\xe8\x82$\xb5\xfe|\x00\x8e\x80\xe6$\x89\x05\xbf\v\xa6cOh\x00\x00\u07d4nL*\xb7\xdb\x02i9\xdb\u04fch8J\xf6`\xa6\x18\x16\xb2\x89\t\r\x97/22<\x00\x00\u07d4nM.9\u0203f)\u5d07\xb1\x91\x8af\x9a\xeb\u07556\x8965\u026d\xc5\u07a0\x00\x00\u07d4n\\-\x9b\x1cTj\x86\xee\xfd]\nQ \xc9\xe4\xe70\x19\x0e\x89\n\xd2\x01\xa6yO\xf8\x00\x00\u07d4n`\xae\u19cf\x8e\u068bBLs\xe3S5J\xe6|0B\x89\xbd5\xa4\x8d\x99\x19\xe6\x00\x00\u07d4nd\xe6\x12\x9f\"N7\x8c\x0ensj~z\x06\xc2\x11\xe9\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4nm[\xbb\xb9\x05;\x89\xd7D\xa2s\x16\u00a7\xb8\xc0\x9bT}\x891Rq\n\x02>m\x80\x00\u07d4nr\xb2\xa1\x18j\x8e)\x16T;\x1c\xb3jh\x87\x0e\xa5\u0457\x89\n\x15D\xbe\x87\x9e\xa8\x00\x00\u07d4nv\x1e\xaa\x0f4_w{TA\xb7:\x0f\xa5\xb5k\x85\xf2-\x89lk\x93[\x8b\xbd@\x00\x00\u07d4ny\xed\u0504[\anL\u060d\x18\x8bnC-\xd9?5\xaa\x893\xc5I\x901r\f\x00\x00\u07d4n\x82\x12\xb7\"\xaf\xd4\b\xa7\xa7>\xd3\xe29^\xe6EJ\x030\x89\b\x9e\x91y\x94\xf7\x1c\x00\x00\u07d4n\x84\x87m\xbb\x95\xc4\vfV\xe4+\xa9\xae\xa0\x8a\x99;T\u0709;\xbc`\xe3\xb6\u02fe\x00\x00\u07d4n\x84\xc2\xfd\x18\xd8\tW\x14\xa9h\x17\x18\x9c\xa2\x1c\xcab\xba\xb1\x89\x12{lp&!\u0340\x00\u07d4n\x86m\x03-@Z\xbd\xd6\\\xf6QA\x1d\x807\x96\xc2#\x11\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94n\x89\x9eY\xa9\xb4\x1a\xb7\xeaA\xdfu\x17\x86\x0f*\xcbY\xf4\xfd\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4n\x89\xc5\x1e\xa6\xde\x13\xe0l\xdct\x8bg\xc4A\x0f\u9f2b\x03\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\x8a&h\x9fz/\xde\xfd\x00\x9c\xba\xaaS\x10%4P\u06ba\x89o!7\x17\xba\xd8\xd3\x00\x00\u07d4n\x96\xfa\xed\xa3\x05C\x02\xc4_X\xf1a2L\x99\xa3\xee\xbbb\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4n\xb0\xa5\xa9\xae\x96\xd2,\xf0\x1d\x8f\xd6H;\x9f8\xf0\x8c,\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\xb3\x81\x96\x17@@X&\x8f\f<\xff5\x96\xbf\xe9\x14\x8c\x1c\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94n\xb5W\x8ak\xb7\xc3!S\x19[\r\x80 \xa6\x91HR\xc0Y\x8a\x8b\u00ab\xf4\x02!\xf4\x80\x00\x00\u07d4n\xbb^iW\xaa\x82\x1e\xf6Y\xb6\x01\x8a9:PL\xaeDP\x89lk\x93[\x8b\xbd@\x00\x00\u07d4n\xbc\xf9\x95\u007f_\xc5\u916d\xd4u\";\x04\xb8\xc1Jz\xed\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4n\xc3e\x95q\xb1\x1f\x88\x9d\xd49\xbc\xd4\xd6u\x10\xa2[\xe5~\x89\x06\xaa\xf7\xc8Qm\f\x00\x00\u07d4n\u021b9\xf9\xf5'jU>\x8d\xa3\x0en\xc1z\xa4~\xef\u01c9\x18BO_\v\x1bN\x00\x00\u07d4n\xc9m\x13\xbd\xb2M\u01e5W)?\x02\x9e\x02\xddt\xb9zU\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\xca\xef\xa6\xfc>\xe54bm\xb0,o\x85\xa0\u00d5W\x1ew\x89 \x86\xac5\x10R`\x00\x00\u07d4n\u04a1+\x02\xf8\u0188\u01f5\u04e6\xea\x14\xd66\x87\u06b3\xb6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4n\u0604E\x9f\x80\x9d\xfa\x10\x16\xe7p\xed\xaf>\x9f\xefF\xfa0\x89\xb8R\xd6x \x93\xf1\x00\x00\xe0\x94n\xdf\u007fR\x83r\\\x95>\xe6C\x17\xf6a\x88\xaf\x11\x84\xb03\x8a\x01\xb4d1\x1dE\xa6\x88\x00\x00\u07d4n\xe8\xaa\xd7\xe0\xa0e\u0605-|;\x9an_\xdcK\xf5\f\x00\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4n\xef\u0705\x0e\x87\xb7\x15\xc7'\x91w<\x03\x16\xc3U\x9bX\xa4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\xf9\xe8\u0276!}Vv\x9a\xf9}\xbb\x1c\x8e\x1b\x8b\xe7\x99\u0489\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4n\xfb\xa8\xfb*\u0176s\a)\xa9r\xec\"D&\xa2\x87\u00ed\x89\x0fY\x85\xfb\xcb\xe1h\x00\x00\xe0\x94n\xfd\x90\xb55\xe0\v\xbd\x88\x9f\xda~\x9c1\x84\xf8y\xa1Q\u06ca\x02#\x85\xa8'\xe8\x15P\x00\x00\u07d4o\x05\x16f\xcbO{\u04b1\x90r!\xb8)\xb5U\u05e3\xdbt\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4o\x0e\xdd#\xbc\xd8_`\x15\xf9(\x9c(\x84\x1f\xe0L\x83\xef\xeb\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4o\x13zq\xa6\xf1\x97\xdf,\xbb\xf0\x10\u073d\x89a\t=|,m8\x00\x00\u07d4p\x10\xbe-\xf5{\u042b\x9a\xe8\x19l\xd5\n\xb0\xc5!\xab\xa9\xf9\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4p#\xc7\tV\xe0J\x92\xd7\x00%\xaa\u0497\xb59\xaf5Xi\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p%\x96]+\x88\xda\x19}DY\xbe=\xc98cD\xcc\x1f1\x89l\xb7\xe7Hg\xd5\xe6\x00\x00\u07d4p(\x02\xf3m\x00%\x0f\xabS\xad\xbc\u0596\xf0\x17oc\x8aI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4pH\x19\xd2\xe4Mn\xd1\xda%\xbf\u0384\u011f\u0322V\x13\xe5\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4pJn\xb4\x1b\xa3O\x13\xad\xdd\xe7\xd2\xdb}\xf0I\x15\u01e2!\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4pJ\xb1\x15\r^\x10\xf5\xe3I\x95\b\xf0\xbfpe\x0f\x02\x8dK\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4pJ\xe2\x1dv-n\x1d\xde(\xc25\xd11\x04Yr6\xdb\x1a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4pM$<)x\xe4l,\x86\xad\xbe\xcd$n;)_\xf63\x89m\x12\x1b\xeb\xf7\x95\xf0\x00\x00\u07d4pM]\xe4\x84m9\xb5<\xd2\x1d\x1cI\xf0\x96\xdb\\\x19\xba)\x89\b=lz\xabc`\x00\x00\u07d4p]\xdd85T\x82\xb8\xc7\u04f5\x15\xbd\xa1P\r\xd7\u05e8\x17\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94pan(\x92\xfa&\x97\x05\xb2\x04k\x8f\xe3\xe7/\xa5X\x16\u04ca\x04<3\xc1\x93ud\x80\x00\x00\u07d4pg\x0f\xbb\x05\xd30\x14DK\x8d\x1e\x8ew\x00%\x8b\x8c\xaam\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p\x81\xfak\xaa\xd6\u03f7\xf5\x1b,\xca\x16\xfb\x89p\x99\x1ad\xba\x89\f\xae\xc0\x05\xf6\xc0\xf6\x80\x00\xe0\x94p\x85\xae~~M\x93!\x97\xb5\u01c5\x8c\x00\xa3gF&\xb7\xa5\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4p\x86\xb4\xbd\xe3\xe3]J\xeb$\xb8%\xf1\xa2\x15\xf9\x9d\x85\xf7E\x89lh\xcc\u041b\x02,\x00\x00\u07d4p\x8a*\xf4%\u03b0\x1e\x87\xff\xc1\xbeT\xc0\xf52\xb2\x0e\xac\u0589\aE\u0503\xb1\xf5\xa1\x80\x00\u07d4p\x8e\xa7\a\xba\xe45\u007f\x1e\xbe\xa9Y\u00e2P\xac\u05aa!\xb3\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794p\x8f\xa1\x1f\xe3=\x85\xad\x1b\xef\u02ee8\x18\xac\xb7\x1fj}~\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4p\x9101\x16\xd5\xf28\x9b##\x8bMej\x85\x96\u0644\u04c9;N~\x80\xaaX3\x00\x00\u07d4p\x99\xd1/n\xc6V\x89\x9b\x04\x9avW\x06]b\x99h\x92\u0209\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4p\x9f\xe9\xd2\xc1\xf1\xceB |\x95\x85\x04J`\x89\x9f5\x94/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p\xa05I\xaaah\xe9~\x88\xa5\b3\nZ\v\xeatq\x1a\x89Hz\x9a0E9D\x00\x00\u07d4p\xa4\x06}D\x8c\xc2]\xc8\xe7\x0ee\x1c\xea|\xf8N\x92\x10\x9e\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4p\xab4\xbc\x17\xb6o\x9c;c\xf1Q'O*r|S\x92c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p\xc2\x13H\x8a\x02\f<\xfb9\x01N\xf5\xbad\x04rK\u02a3\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4p\xd2^\xd2\u022d\xa5\x9c\b\x8c\xf7\r\xd2+\xf2\u06d3\xac\xc1\x8a\x899GEE\u4b7c\x00\x00\u07d4p\xe5\xe9\xdas_\xf0w$\x9d\u02da\xaf=\xb2\xa4\x8d\x94\x98\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4p\xfe\xe0\x8b\x00\xc6\xc2\xc0Jp\xc0\xce=\x92\u03ca\x01Z\xf1\u05cbX\xc4\x00\x00\x00\u0794q\v\xe8\xfd^)\x18F\x8b\u2abe\xa8\r\x82\x845\u05d6\x12\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4q\x13]\x8f\x05\x96<\x90ZJ\a\x92)\t#Z\x89jR\ua262\xa1]\tQ\x9b\xe0\x00\x00\u07d4q\x1e\xcfw\xd7\x1b=\x0e\xa9\\\xe4u\x8a\xfe\u0379\xc11\a\x9d\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4q!?\xca14\x04 N\u02e8q\x97t\x1a\xa9\xdf\xe9c8\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94q+vQ\x02\x14\xdcb\x0fl:\x1d\u049a\xa2+\xf6\xd2\x14\xfb\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4q/\xf77\n\x13\xed6\ts\xfe\u071f\xf5\xd2\xc9:P^\x9e\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4q3\x84:x\xd99\u019dD\x86\xe1\x0e\xbc{`*4\x9f\xf7\x89\x11\xd5\xca\xcc\xe2\x1f\x84\x00\x00\u07d4qH\xae\xf32a\xd8\x03\x1f\xac?q\x82\xff5\x92\x8d\xafT\u0649\xdeB\xee\x15D\u0750\x00\x00\u07d4qcu\x8c\xbblLR^\x04\x14\xa4\n\x04\x9d\xcc\xcc\xe9\x19\xbb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4qh\xb3\xbb\x8c\x16s!\u067d\xb0#\xa6\xe9\xfd\x11\xaf\u026f\u0649a\t=|,m8\x00\x00\u07d4qirN\xe7\"q\xc54\xca\xd6B\x0f\xb0N\xe6D\u02c6\xfe\x89\x16<+@\u06e5R\x00\x00\u07d4qj\xd3\xc3:\x9b\x9a\n\x18\x96sW\x96\x9b\x94\xee}*\xbc\x10\x89\x1a!\x17\xfeA*H\x00\x00\xe0\x94qk\xa0\x1e\xad*\x91'\x065\xf9_%\xbf\xaf-\xd6\x10\xca#\x8a\ty\xe7\x01 V\xaax\x00\x00\u07d4qmP\u0320\x1e\x93\x85\x00\xe6B\x1c\xc0p\xc3P|g\u04c7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4qv,cg\x8c\x18\xd1\xc67\x8c\xe0h\xe6f8\x13\x15\x14~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4qxL\x10Q\x17\xc1\xf6\x895y\u007f\xe1Y\xab\xc7NC\xd1j\x89l\x81\u01f3\x11\x95\xe0\x00\x00\xe0\x94qyro\\q\xae\x1bm\x16\xa6\x84(\x17Nk4\xb26F\x8a\x01\x8e\xa2P\t|\xba\xf6\x00\x00\xe0\x94q|\xf9\xbe\xab680\x8d\xed~\x19^\f\x86\x13-\x16?\xed\x8a\x032n\xe6\xf8e\xf4\"\x00\x00\u07d4q\x80\xb8>\xe5WC\x17\xf2\x1c\x80r\xb1\x91\u0615\xd4aS\u00c9\x18\xef\xc8J\xd0\u01f0\x00\x00\u07d4q\x94kq\x17\xfc\x91^\xd1\a8_B\u065d\xda\xc62I\u0089lk\x93[\x8b\xbd@\x00\x00\xe0\x94q\x9e\x89\x1f\xbc\xc0\xa3>\x19\xc1-\xc0\xf0 9\xca\x05\xb8\x01\u07ca\x01OU8F:\x1bT\x00\x00\u07d4q\xc7#\n\x1d5\xbd\u0581\x9e\u0539\xa8\x8e\x94\xa0\xeb\a\x86\u0749\uc80b5=$\x14\x00\x00\u07d4q\xd2\xccm\x02W\x8ce\xf7\r\xf1\x1bH\xbe\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4r\x83\xcdFu\xdaX\u0116UaQ\xda\xfd\x80\xc7\xf9\x95\xd3\x18\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4r\x86\xe8\x9c\xd9\u078fz\x8a\x00\xc8o\xfd\xb59\x92\u0752Q\u0449i*\xe8\x89p\x81\xd0\x00\x00\u07d4r\x8f\x9a\xb0\x80\x15}\xb3\a1V\xdb\xca\x1a\x16\x9e\xf3\x17\x94\a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4r\x94\xc9\x18\xb1\xae\xfbM%\x92~\xf9\u05d9\xe7\x1f\x93\xa2\x8e\x85\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94r\x94\uc763\x10\xbckK\xbd\xf5C\xb0\xefE\xab\xfc>\x1bM\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4r\x9a\xadF'tNS\xf5\xd6c\t\xaatD\x8b:\xcd\xf4o\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xa2\xfc\x86u\xfe\xb9r\xfaA\xb5\r\xff\u06fa\xe7\xfa*\u07f7\x89\x9a\xb4\xfcg\xb5(\xc8\x00\x00\u07d4r\xa8&\b&)G&\xa7[\xf3\x9c\u066a\x9e\a\xa3\xea\x14\u0349lk\x93[\x8b\xbd@\x00\x00\u07d4r\xb0Yb\xfb*\u0549\xd6Z\xd1j\"U\x9e\xba\x14X\xf3\x87\x89\a?u\u0460\x85\xba\x00\x00\u07d4r\xb5c?\xe4w\xfeT.t/\xac\xfdi\f\x13xT\xf2\x16\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4r\xb7\xa0=\xda\x14\u029cf\x1a\x1dF\x9f\xd376\xf6s\xc8\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xb9\x04D\x0e\x90\xe7 \u05ac\x1c*\u05dc2\x1d\xcc\x1c\x1a\x86\x89T\x06\x923\xbf\u007fx\x00\x00\xe0\x94r\xb9\nM\xc0\x97#\x94\x92\u0179w}\xcd\x1eR\xba+\xe2\u008a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4r\xbb'\u02d9\xf3\xe2\xc2\u03d0\xa9\x8fp}0\xe4\xa2\x01\xa0q\x89X\xe7\x92n\xe8X\xa0\x00\x00\xe0\x94r\xc0\x83\xbe\xad\xbd\xc2'\xc5\xfbC\x88\x15\x97\xe3.\x83\xc2`V\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4r\xcd\x04\x8a\x11\x05tH)\x83I-\xfb\x1b\xd2yB\xa6\x96\xba\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xd0=M\xfa\xb3P\f\xf8\x9b\x86\x86o\x15\xd4R\x8e\x14\xa1\x95\x89\xf3K\x82\xfd\x8e\x91 \x00\x00\u07d4r\u06bb[n\ud799\xbe\x91X\x88\xf6V\x80V8\x16\b\xf8\x89\vL\x96\xc5,\xb4\xfe\x80\x00\u07d4r\xfbI\u009d#\xa1\x89P\u0132\xdc\r\xdfA\x0fS-oS\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xfe\xaf\x12EyR9Td[\u007f\xaf\xff\x03x\xd1\xc8$.\x8965\u026d\xc5\u07a0\x00\x00\u07d4s\x01\xdcL\xf2mq\x86\xf2\xa1\x1b\xf8\xb0\x8b\xf2)F?d\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4s\x04G\xf9|\xe9\xb2_\"\xba\x1a\xfb6\xdf'\xf9Xk\ub6c9,s\xc97t,P\x00\x00\u07d4s\x06\xde\x0e(\x8bV\xcf\u07d8~\xf0\xd3\xcc)f\a\x93\xf6\u0749\x1b\x8a\xbf\xb6.\xc8\xf6\x00\x00\xe0\x94s\r\x87c\u01a4\xfd\x82J\xb8\xb8Y\x16\x1e\xf7\xe3\xa9j\x12\x00\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4s\x12\x81sH\x95(\x01.v\xb4\x1a^(\u018b\xa4\xe3\xa9\u050965\u026d\xc5\u07a0\x00\x00\u07d4s\x13F\x12\bETUFTE\xa4Y\xb0l7s\xb0\xeb0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4s/\xea\xd6\x0f{\xfd\u05a9\xde\u0101%\xe3s]\xb1\xb6eO\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4sB#\xd2\u007f\xf2>Y\x06\xca\xed\"YW\x01\xbb4\x83\f\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4sG>r\x11Q\x10\xd0\xc3\xf1\x17\b\xf8nw\xbe+\xb0\x98<\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4sRXm\x02\x1a\xd0\xcfw\xe0\xe9(@JY\xf3t\xffE\x82\x89\xb8Pz\x82\a( \x00\x00\u07d4sU\v\xebs+\xa9\u076f\xdaz\xe4\x06\xe1\x8f\u007f\xeb\x0f\x8b\xb2\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4s[\x97\xf2\xfc\x1b\xd2K\x12\an\xfa\xf3\xd1(\x80s\xd2\f\x8c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4s^2\x86f\xedV7\x14+3\x06\xb7|\xccT`\xe7,=\x89j\xb8\xf3xy\u0251\x00\x00\u07d4sc\u0350\xfb\xab[\xb8\u011a\xc2\x0f\xc6,9\x8f\xe6\xfbtL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4skDP=\xd2\xf6\xddTi\xffL[-\xb8\xeaO\xece\u0409\x11\x04\xeeu\x9f!\xe3\x00\x00\xe0\x94sk\xf1@,\x83\x80\x0f\x89>X1\x92X*\x13N\xb52\xe9\x8a\x02\x1e\x19\u0493\xc0\x1f&\x00\x00\xe0\x94s\x8c\xa9M\xb7\u038b\xe1\xc3\x05l\u0598\x8e\xb3v5\x9f3S\x8a\x05f[\x96\xcf5\xac\xf0\x00\x00\u07d4s\x91K\"\xfc/\x13\x15\x84$}\x82\xbeO\ucfd7\x8a\u053a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4s\x93'\t\xa9\u007f\x02\u024eQ\xb0\x911(e\x12#\x85\xae\x8e\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4s\x93\xcb\xe7\xf9\xba!e\xe5\xa7U5\x00\xb6\xe7]\xa3\xc3:\xbf\x89\x05k\xc7^-c\x10\x00\x00\u07d4s\xb4\u0519\xde?8\xbf5\xaa\xf7i\xa6\xe3\x18\xbcm\x126\x92\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94s\xbe\xddo\xda{\xa3'!\x85\b{cQ\xfc\x13=HN7\x8a\x01\x12&\xbf\x9d\xceYx\x00\x00\u07d4s\xbf\xe7q\x0f1\u02b9I\xb7\xa2`O\xbfR9\xce\xe7\x90\x15\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94s\u03c0\xae\x96\x88\xe1X\x0eh\xe7\x82\xcd\b\x11\xf7\xaaIM,\x8a\x01\xa4\xab\xa2%\xc2\a@\x00\x00\xe0\x94s\xd7&\x9f\xf0l\x9f\xfd3uL\xe5\x88\xf7J\x96j\xbb\xbb\xba\x8a\x01e\xc9fG\xb3\x8a \x00\x00\u07d4s\xd8\xfe\xe3\u02c6M\xce\"\xbb&\u029c/\bm^\x95\xe6;\x8965\u026d\xc5\u07a0\x00\x00\u07d4s\xdf<>yU\xf4\xf2\xd8Y\x83\x1b\xe3\x80\x00\xb1\ak8\x84\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4s\u48b6\f\U0010e2ef+w~\x17Z[\x1eM\f-\x8f\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94t\n\xf1\xee\xfd3e\u05cb\xa7\xb1,\xb1\xa6s\xe0j\arF\x8a\x04+\xf0kx\xed;P\x00\x00\xe0\x94t\v\xfdR\xe0\x16g\xa3A\x9b\x02\x9a\x1b\x8eEWj\x86\xa2\u06ca\x03\x8e\xba\xd5\xcd\xc9\x02\x80\x00\x00\u07d4t\x0fd\x16\x14w\x9d\u03e8\x8e\xd1\xd4%\xd6\r\xb4*\x06\f\xa6\x896\"\xc6v\b\x10W\x00\x00\u07d4t\x12\u027c0\xb4\xdfC\x9f\x021\x00\xe69$\x06j\xfdS\xaf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4t\x16\x93\xc3\x03vP\x85\x13\b \xcc+c\xe9\xfa\x92\x13\x1b\x89A\rXj \xa4\xc0\x00\x00\u07d4t!\xce[\xe3\x81s\x8d\u0703\xf0&!\x97O\xf0hly\xb8\x89Xx\x8c\xb9K\x1d\x80\x00\x00\u07d4t1j\xdf%7\x8c\x10\xf5v\u0574\x1aoG\xfa\x98\xfc\xe3=\x89\x128\x13\x1e\\z\xd5\x00\x00\u07d4t6Q\xb5^\xf8B\x9d\xf5\f\xf8\x198\xc2P\x8d\xe5\u0207\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4t=\xe5\x00&\xcag\xc9M\xf5O\x06b`\xe1\xd1J\xcc\x11\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d4tE /\ft)z\x00N\xb3rj\xa6\xa8-\xd7\xc0/\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4tK\x03\xbb\xa8X*\xe5I\x8e-\xc2-\x19\x94\x94g\xabS\xfc\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4tL\fw\xba\u007f#i \xd1\xe44\xde]\xa3>H\xeb\xf0,\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4tP\xff\u007f\x99\xea\xa9\x11bu\u07ach\xe4(\xdf[\xbc\u0639\x89lk\x93[\x8b\xbd@\x00\x00\u07d4tV\u0172\xc5Cn>W\x10\b\x93?\x18\x05\xcc\xfe4\xe9\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4tZ\u04eb\xc6\xee\xeb$qh\x9bS\x9ex\x9c\xe2\xb8&\x83\x06\x89=A\x94\xbe\xa0\x11\x92\x80\x00\xe0\x94tZ\xec\xba\xf9\xbb9\xb7Jg\xea\x1c\xe6#\xde6\x84\x81\xba\xa6\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4t\\\xcf-\x81\x9e\u06fd\u07a8\x11{\\I\xed<*\x06n\x93\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4tb\u021c\xaa\x9d\x8dx\x91\xb2T]\xef!otd\u057b!\x89\x05\xea\xedT\xa2\x8b1\x00\x00\u07d4td\x8c\xaa\xc7H\xdd\x13\\\xd9\x1e\xa1L(\xe1\xbdM\u007f\xf6\xae\x89\xa8\r$g~\xfe\xf0\x00\x00\xe0\x94tq\xf7.\xeb0\x06$\xeb(.\xabM\x03r\x00\x00\x00\xe0\x94t\x84\xd2k\xec\xc1\xee\xa8\xc61^\xc3\xee\nE\x01\x17\u0706\xa0\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4t\x86:\xce\xc7]\x03\xd5>\x86\x0ed\x00/,\x16^S\x83w\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\x89\u030a\xbeu\u0364\xef\r\x01\xce\xf2`^G\xed\xa6z\xb1\x89\a?u\u0460\x85\xba\x00\x00\u07d4t\x8c(^\xf1#?\xe4\xd3\x1c\x8f\xb17\x833r\x1c\x12\xe2z\x89lk\x93[\x8b\xbd@\x00\x00\u07d4t\x90\x87\xac\x0fZ\x97\xc6\xfa\xd0!S\x8b\xf1\xd6\u0361\x8e\r\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\x95\xaex\xc0\xd9\x02a\xe2\x14\x0e\xf2\x061\x04s\x1a`\xd1\xed\x89\x01\xdbPq\x89%!\x00\x00\u07d4t\x9aJv\x8b_#rH\x93\x8a\x12\xc6#\x84{\xd4\xe6\x88\u0709\x03\xe73b\x87\x14 \x00\x00\u07d4t\x9a\xd6\xf2\xb5pk\xbe/h\x9aD\u0136@\xb5\x8e\x96\xb9\x92\x89\x05k\xc7^-c\x10\x00\x00\u07d4t\xa1\u007f\x06K4N\x84\xdbce\u0695\x91\xff\x16(%vC\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4t\xae\xec\x91]\xe0\x1c\u019b,\xb5\xa65o\xee\xa1FX\xc6\u0149\f\x9a\x95\xee)\x86R\x00\x00\u07d4t\xaf\xe5I\x02\xd6\x15x%v\xf8\xba\xac\x13\xac\x97\f\x05\x0fn\x89\t\xa1\xaa\xa3\xa9\xfb\xa7\x00\x00\u07d4t\xb7\xe0\"\x8b\xae\xd6YW\xae\xbbM\x91m3:\xae\x16O\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4t\xbcJ^ E\xf4\xff\x8d\xb1\x84\xcf:\x9b\f\x06Z\xd8\a\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4t\xbc\xe9\xec86-l\x94\u032c&\xd5\xc0\xe1:\x8b;\x1d@\x8965&A\x04B\xf5\x00\x00\u07d4t\xbfzZ\xb5\x92\x93\x14\x9b\\`\xcf6Bc\xe5\xeb\xf1\xaa\r\x89\x06G\f>w\x1e<\x00\x00\xe0\x94t\xc7<\x90R\x8a\x15s6\xf1\xe7\xea b\n\xe5?\xd2G(\x8a\x01\xe6:.S\x8f\x16\xe3\x00\x00\u07d4t\u0464\xd0\xc7RN\x01\x8dN\x06\xed;d\x80\x92\xb5\xb6\xaf,\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94t\xd3f\xb0{/VG}|pw\xaco\xe4\x97\xe0\xebeY\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4t\xd3zQt{\xf8\xb7q\xbf\xbfC\x9493\xd1\x00\xd2\x14\x83\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\xd6q\u065c\xbe\xa1\xabW\x90cu\xb6?\xf4+PE\x1d\x17\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\xeb\xf4BVF\xe6\u03c1\xb1\t\xce{\xf4\xa2\xa6=\x84\x81_\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4t\xed3\xac\xf4?5\xb9\x8c\x920\xb9\xe6d.\xcbS0\x83\x9e\x89$\xf6\xdf\xfbI\x8d(\x00\x00\u07d4t\xef(i\xcb\xe6\b\x85`E\xd8\xc2\x04\x11\x18W\x9f\"6\xea\x89\x03<\xd6E\x91\x95n\x00\x00\u07d4t\xfcZ\x99\xc0\xc5F\x05\x03\xa1;\x05\tE\x9d\xa1\x9c\xe7\u0350\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4u\v\xbb\x8c\x06\xbb\xbf$\bC\xccux.\xe0/\b\xa9tS\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4u\x14\xad\xbd\xc6?H?0M\x8e\x94\xb6\u007f\xf30\x9f\x18\v\x82\x89!\u0120n-\x13Y\x80\x00\u0794u\x17\xf1l(\xd12\xbb@\xe3\xba6\u01ae\xf11\xc4b\xda\x17\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4u\x1a,\xa3Nq\x87\xc1c\u048e6\x18\xdb(\xb1<\x19m&\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94u\x1a\xbc\xb6\xcc\x030Y\x91\x18\x15\xc9o\u04516\n\xb0D-\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4u&\xe4\x82R\x9f\n\x14\xee\u0248q\xdd\xdd\x0er\x1b\f\u0662\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4u)\xf3y{\xb6\xa2\x0f~\xa6I$\x19\xc8L\x86vA\xd8\x1c\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94u*^\xe22a,\xd3\x00_\xb2n[Y}\xe1\x9fwk\xe6\x8a\x01'\xfc\xb8\xaf\xae \xd0\x00\x00\u07d4u,\x9f\xeb\xf4/f\xc4x{\xfa~\xb1|\xf53;\xbaPp\x89j\x99\xf2\xb5O\xddX\x00\x00\u07d4u930F\u07b1\xef\x8e\u07b9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94u\xc1\xad#\xd2?$\xb3\x84\xd0\xc3\x14\x91w\xe8f\x97a\r!\x8a\x01\\[\xcdl(\x8b\xbd\x00\x00\u07d4u\xc2\xff\xa1\xbe\xf5I\x19\xd2\t\u007fz\x14-.\x14\xf9\xb0JX\x89\x90\xf3XP@2\xa1\x00\x00\u07d4u\xd6|\xe1N\x8d)\xe8\xc2\xff\u3051{\x93\v\x1a\xff\x1a\x87\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4u\xde~\x93R\xe9\v\x13\xa5\x9aXx\xff\xec\u01c3\x1c\xacM\x82\x89\x94\x89#z\u06daP\x00\x00\u07d4u\xf7S\x9d0\x9e\x909\x98\x9e\xfe.\x8b-\xbd\x86Z\r\xf0\x88\x89\x85[[\xa6\\\x84\xf0\x00\x00\u07d4v\b\xf47\xb3\x1f\x18\xbc\vd\u04c1\xae\x86\xfd\x97\x8e\u05f3\x1f\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94v\x0f\xf35N\x0f\u0793\x8d\x0f\xb5\xb8,\xef[\xa1\\=)\x16\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4v\x1an6,\x97\xfb\xbd|Yw\xac\xba-\xa7F\x876_I\x89\t\xf7J\xe1\xf9S\xd0\x00\x00\u07d4v\x1el\xae\xc1\x89\xc20\xa1b\xec\x00e0\x19>g\u03dd\x19\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94v\x1f\x8a:*\U00028f7e\x1d\xa0\t2\x1f\xb2\x97d\xebb\xa1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4v)\x98\xe1\xd7R'\xfc\xedzp\xbe\x10\x9aL\vN\xd8d\x14\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4v-o0\u06b9\x915\xe4\xec\xa5\x1dRC\xd6\xc8b\x11\x02\u0549\x0fI\x89A\xe6d(\x00\x00\u07d4v3\x1e0yl\xe6d\xb2p\x0e\rASp\x0e\u0706\x97w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4v8\x86\xe33\xc5o\xef\xf8[\xe3\x95\x1a\xb0\xb8\x89\xce&.\x95\x89lk\x93[\x8b\xbd@\x00\x00\u07d4v:|\xba\xb7\rzd\u0427\xe5)\x80\xf6\x81G%\x93I\f\x89 \x86\xac5\x10R`\x00\x00\u07d4v>\xec\u0c0a\u021e2\xbf\xa4\xbe\xcev\x95\x14\xd8\xcb[\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4v@\xa3\u007f\x80R\x98\x15\x15\xbc\xe0x\u0693\xaf\xa4x\x9bW4\x89lk\x93[\x8b\xbd@\x00\x00\u0794vA\xf7\xd2j\x86\xcd\xdb+\xe10\x81\x81\x0e\x01\xc9\xc8E\x89dI\xe8NG\xa8\xa8\x00\x00\xe0\x94vO\xc4mB\x8bm\xbc\"\x8a\x0f_U\xc9P\x8cw.\xab\x9f\x8a\x05\x81v{\xa6\x18\x9c@\x00\x00\u07d4vPn\xb4\xa7\x80\xc9Q\xc7J\x06\xb0=;\x83b\xf0\x99\x9dq\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94v[\xe2\xe1/b\x9ecI\xb9}!\xb6*\x17\xb7\xc80\xed\xab\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94vb\x81P\xe2\x99[['\x9f\xc8>\r\xd5\xf1\x02\xa6q\xdd\x1c\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4vk7Y\xe8yN\x92m\xacG=\x91:\x8f\xb6\x1a\xd0\xc2\u0249\x04\xb0m\xbb\xb4\x0fJ\x00\x00\u07d4vp\xb0/,<\xf8\xfdOG0\xf38\x1aq\xeaC\x1c3\u01c9\x0e~\xeb\xa3A\vt\x00\x00\u07d4vz\x03eZ\xf3`\x84\x1e\x81\r\x83\xf5\xe6\x1f\xb4\x0fL\xd1\x13\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4vz\u0190y\x1c.#E\x10\x89\xfelp\x83\xfeU\u07b6+\x89,s\xc97t,P\x00\x00\u07d4v\u007f\xd7y}Qi\xa0_sd2\x1c\x19\x84:\x8c4\x8e\x1e\x89\x01\x04\xe7\x04d\xb1X\x00\x00\u0794v\x84o\r\xe0;Zv\x97\x1e\xad)\x8c\xdd\b\x84:K\xc6\u0188\xd7\x1b\x0f\u088e\x00\x00\xe0\x94v\x84\x98\x93N7\xe9\x05\xf1\xd0\xe7{D\xb5t\xbc\xf3\xecJ\xe8\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4v\x8c\xe0\u06a0)\xb7\xde\xd0\"\xe5\xfcWM\x11\xcd\xe3\xec\xb5\x17\x89\x11t\xa5\xcd\xf8\x8b\xc8\x00\x00\xe0\x94v\x93\xbd\xebo\xc8+[\xcar\x13U\"1u\xd4z\bKM\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4v\xaa\xf8\xc1\xac\x01/\x87R\xd4\xc0\x9b\xb4f\a\xb6e\x1d\\\xa8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4v\xab\x87\xddZ\x05\xad\x83\x9aN/\xc8\xc8Z\xa6\xba\x05d\x170\x89lk\x93[\x8b\xbd@\x00\x00\u07d4v\xaf\xc2%\xf4\xfa0}\xe4\x84U+\xbe\x1d\x9d?\x15\aLJ\x89\xa2\x90\xb5\u01ed9h\x00\x00\xe0\x94v\xbe\xca\xe4\xa3\x1d6\xf3\xcbW\u007f*CYO\xb1\xab\xc1\xbb\x96\x8a\x05C\xa9\xce\x0e\x132\xf0\x00\x00\u07d4v\xc2u5\xbc\xb5\x9c\xe1\xfa-\x8c\x91\x9c\xab\xebJk\xba\x01\u0449lk\x93[\x8b\xbd@\x00\x00\u07d4v\xca\"\xbc\xb8y\x9eS'\u012a*}\tI\xa1\xfc\xce_)\x89R\xa0?\"\x8cZ\xe2\x00\x00\u07d4v\xca\u0108\x11\x1aO\u0555\xf5h\xae:\x85\x87p\xfc\x91]_\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94v\u02dc\x8bi\xf48vu\u0102S\xe24\xcb~\rt\xa4&\x8a\x01\x90\xf4H.\xb9\x1d\xae\x00\x00\u07d4v\xf8:\xc3\xda0\xf7\t&(\xc73\x9f \x8b\xfc\x14,\xb1\ue25a\x18\xff\xe7B}d\x00\x00\xe0\x94v\xf9\xad=\x9b\xbd\x04\xae\x05\\\x14w\xc0\xc3^u\x92\xcb* \x8a\b\x83?\x11\xe3E\x8f \x00\x00\u07d4v\xff\xc1W\xadk\xf8\xd5m\x9a\x1a\u007f\u077c\x0f\xea\x01\n\xab\xf4\x8965\u026d\xc5\u07a0\x00\x00\u07d4w\x02\x8e@\x9c\xc4:;\xd3=!\xa9\xfcS\xec`n\x94\x91\x0e\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4w\f/\xb2\u0128\x17S\xac\x01\x82\xeaF\x0e\xc0\x9c\x90\xa5\x16\xf8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4w\r\x98\xd3\x1bCS\xfc\xee\xe8V\fL\u03c0>\x88\xc0\xc4\xe0\x89 \x86\xac5\x10R`\x00\x00\xe0\x94w\x13\xab\x807A\x1c\t\xbah\u007fo\x93d\xf0\xd3#\x9f\xac(\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4w\x15\a\xae\xeej%]\xc2\u035d\xf5QT\x06-\b\x97\xb2\x97\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\u07d4w\x19\x88\x87\x95\xadtY$\xc7W`\u0771\x82}\xff\xd8\u0368\x89lkLM\xa6\u077e\x00\x00\u07d4w'\xaf\x10\x1f\n\xab\xa4\xd2:\x1c\xaf\xe1|n\xb5\u06b1\xc6\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4w,)\u007f\n\u0454H.\xe8\xc3\xf06\xbd\xeb\x01\xc2\x01\xd5\u0309\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94w0o\xfe.J\x8f<\xa8&\xc1\xa2I\xf7!-\xa4:\xef\xfd\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4w1A\x12}\x8c\xf3\x18\xae\xbf\x886Z\xdd=U'\xd8[j\x8966\u05ef^\u024e\x00\x00\u07d4wF\xb6\xc6i\x9c\x8f4\xca'h\xa8 \xf1\xff\xa4\xc2\a\xfe\x05\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4wQ\xf3c\xa0\xa7\xfd\x053\x19\b\t\u076f\x93@\xd8\xd1\x12\x91\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4wW\xa4\xb9\xcc=\x02G\u032a\xeb\x99\t\xa0\xe5n\x1d\xd6\xdc\u0089\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4w\\\x10\xc9>\r\xb7 [&CE\x823\xc6O\xc3?\xd7[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4wa~\xbcK\xeb\xc5\xf5\xdd\xeb\x1bzp\xcd\xebj\xe2\xff\xa0$\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4wiC\xff\xb2\xef\\\xdd5\xb8<(\xbc\x04k\xd4\xf4gp\x98\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94wp\x1e,I=\xa4|\x1bX\xf4!\xb5I]\xeeE\xbe\xa3\x9b\x8a\x01H\xf6I\xcfaB\xa5\x80\x00\u07d4wy\x8f \x12W\xb9\xc3R\x04\x95pW\xb5Ft\xae\xfaQ\u07c9\b\x13\xcaV\x90m4\x00\x00\u07d4w\x8cC\xd1\x1a\xfe;Xo\xf3t\x19-\x96\xa7\xf2=+\x9b\u007f\x89\x8b\xb4\xfc\xfa;}k\x80\x00\u07d4w\x8cy\xf4\xde\x19S\xeb\u0398\xfe\x80\x06\xd5:\x81\xfbQ@\x12\x8963\x03\"\xd5#\x8c\x00\x00\u07d4w\x92t\xbf\x18\x03\xa36\xe4\u04f0\r\u0753\xf2\xd4\xf5\xf4\xa6.\x8965\u026d\xc5\u07a0\x00\x00\u07d4w\xa1q\"\xfa1\xb9\x8f\x17\x11\xd3*\x99\xf0>\xc3&\xf3=\b\x89\\(=A\x03\x94\x10\x00\x00\u07d4w\xa3I\a\xf3\x05\xa5L\x85\xdb\t\xc3c\xfd\xe3\xc4~j\xe2\x1f\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4w\xa7i\xfa\xfd\xec\xf4\xa68v-[\xa3\x96\x9d\xf61 \xa4\x1d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4w\xbekd\xd7\xc73\xa46\xad\xec^\x14\xbf\x9a\xd7@+\x1bF\x8965\u026d\xc5\u07a0\x00\x00\u07d4w\xbf\xe9<\u0367P\x84~A\xa1\xaf\xfe\xe6\xb2\u0696\xe7!N\x89\x10CV\x1a\x88)0\x00\x00\u07d4w\u0126\x97\xe6\x03\xd4+\x12\x05l\xbb\xa7a\xe7\xf5\x1d\x04C\xf5\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4w\xcc\x02\xf6#\xa9\u03d8S\t\x97\xeag\xd9\\;I\x18Y\xae\x89Is\x03\xc3n\xa0\xc2\x00\x00\u07d4w\xd4?\xa7\xb4\x81\xdb\xf3\xdbS\f\xfb\xf5\xfd\xce\xd0\xe6W\x181\x89lk\x93[\x8b\xbd@\x00\x00\u07d4w\xda^lr\xfb6\xbc\xe1\xd9y\x8f{\xcd\xf1\u044fE\x9c.\x89\x016\x95\xbbl\xf9>\x00\x00\u07d4w\xf4\xe3\xbd\xf0V\x88<\xc8r\x80\xdb\xe6@\xa1\x8a\r\x02\xa2\a\x89\n\x81\x99:+\xfb[\x00\x00\u0794w\xf6\t\u0287 \xa0#&,U\xc4o-&\xfb90\xaci\x88\xf0\x15\xf2W6B\x00\x00\u07d4w\xf8\x1b\x1b&\xfc\x84\xd6\u0797\uf2df\xbdr\xa310\xccJ\x8965\u026d\xc5\u07a0\x00\x00\u07d4x\x19\xb0E\x8e1N+S\xbf\xe0\f8I_\u0539\xfd\xf8\u0589\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4x\x1b\x15\x01dz.\x06\xc0\xedC\xff\x19\u007f\xcc\xec5\xe1p\v\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4x/R\xf0\xa6v\xc7w\x16\xd5t\xc8\x1e\xc4hO\x9a\x02\n\x97\x89.\x14\xe2\x06\xb70\xad\x80\x00\u07d4x5]\xf0\xa20\xf8=\x03,p1TAM\xe3\xee\u06b5W\x89lk\x93[\x8b\xbd@\x00\x00\u07d4x6\xf7\xefk\u01fd\x0f\xf3\xac\xafD\x9c\x84\xddk\x1e,\x93\x9f\x89\xe0\x8d\xe7\xa9,\xd9|\x00\x00\u07d4x7\xfc\xb8v\xda\x00\xd1\xeb;\x88\xfe\xb3\xdf?\xa4\x04/\xac\x82\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4x>\uc2a5\xda\xc7{.f#\xedQ\x98\xa41\xab\xba\xee\a\x89\x17\xda:\x04\u01f3\xe0\x00\x00\u07d4x\\\x8e\xa7t\xd70D\xa74\xfay\n\x1b\x1et>w\xed|\x89\f\xf1Rd\f\\\x83\x00\x00\u07d4x`\xa3\xde8\xdf8*\xe4\xa4\xdc\xe1\x8c\f\a\xb9\x8b\xce=\xfa\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94xcCq\xe1s\x04\xcb\xf39\xb1E*L\xe48\xdcvL\u038a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4xd\u0719\x9f\xe4\xf8\xe0\x03\xc0\xf4=\xec\u00da\xae\x15\"\xdc\x0f\x89\x05\x1e\x10+\xd8\xec\xe0\x00\x00\u07d4xtj\x95\x8d\xce\xd4\xc7d\xf8vP\x8cAJh4,\uce49\x02\xbe7O\xe8\xe2\xc4\x00\x00\xe0\x94x}1?\xd3k\x05>\xee\xae\xdb\xcet\xb9\xfb\x06x32\x89\x8a\x05\xc0X\xb7\x84'\x19`\x00\x00\u07d4x\x85\x9c[T\x8bp\r\x92\x84\xce\xe4\xb6c=GJ\x8a\x04{\x92\xc4\x15B$-\n\b\xc7\x0f\x99\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4x\u03c36\xb3(\xdb=\x87\x81:G+\x9e\x89\xb7^\f\xf3\xbc\x8965\u026d\xc5\u07a0\x00\x00\u07d4x\xd4\xf8\xc7\x1c\x1eh\xa6\x9a\x98\xf5/\xcbE\u068a\xf5n\xa1\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4x\xdf&\x81\xd6\xd6\x02\xe2!B\xd5A\x16\u07a1]EIW\xaa\x89\x10'\x94\xad \xdah\x00\x00\u07d4x\xe0\x8b\xc53A<&\u2473\x14?\xfa|\u026f\xb9{x\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4x\xe8?\x80\xb3g\x8cz\nN>\x8c\x84\xdc\xcd\xe0dBbw\x89a\t=|,m8\x00\x00\u07d4x\xf5\xc7G\x85\xc5f\x8a\x83\x80r\x04\x8b\xf8\xb4SYM\u06ab\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4y\x0f\x91\xbd]\x1c\\\xc4s\x9a\xe9\x13\x00\u06c9\xe1\xc10<\x93\x89lk\x93[\x8b\xbd@\x00\x00\u07d4y\x17\u5f42\xa9y\x0f\xd6P\xd0C\xcd\xd90\xf7y\x963\u06c9\xd8\xd4`,&\xbfl\x00\x00\u07d4y\x19\xe7b\u007f\x9b}T\xea;\x14\xbbM\xd4d\x9fO9\xde\xe0\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4y\x1f`@\xb4\xe3\xe5\r\xcf5S\xf1\x82\u0357\xa9\x060\xb7]\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4y0\xc2\xd9\xcb\xfa\x87\xf5\x10\xf8\xf9\x87w\xff\x8a\x84H\xcaV)\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4yE)\u041d\x01rq5\x970\x02pu\xb8z\xd8=\xaen\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4yKQ\u00deS\xd9\xe7b\xb0a;\x82\x9aD\xb4r\xf4\xff\xf3\x89$5\xe0dxA\u0300\x00\xe0\x94yU\x1c\xed\xe3v\xf7G\xe3ql\x8dy@\rvm.\x01\x95\x8a\t\xcb7\xaf\xa4\xffxh\x00\x00\u07d4y^\xbc&&\xfc9\xb0\xc8b\x94\xe0\xe87\xdc\xf5#U0\x90\x8965\u026d\xc5\u07a0\x00\x00\u07d4yn\xbb\xf4\x9b>6\xd6v\x94\xady\xf8\xff6vz\xc6\xfa\xb0\x89\x03K\xc4\xfd\xde'\xc0\x00\x00\u07d4yo\x87\xbaaz)0\xb1g\v\xe9.\xd1(\x1f\xb0\xb3F\xe1\x89\x06\xf5\xe8o\xb5((\x00\x00\u07d4yt'\xe3\xdb\xf0\xfe\xaez%\x06\xf1-\xf1\xdc@2n\x85\x05\x8965\u026d\xc5\u07a0\x00\x00\u07d4yu\x10\xe3\x86\xf5c\x93\xce\xd8\xf4w7\x8aDLHO}\xad\x8965\u026d\xc5\u07a0\x00\x00\u07d4y{\xb7\xf1W\xd9\xfe\xaa\x17\xf7m\xa4\xf7\x04\xb7M\xc1\x03\x83A\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4y\x88\x90\x131\xe3\x87\xf7\x13\xfa\u03b9\x00\\\xb9\xb6Q6\xeb\x14\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4y\x89\u041f8&\xc3\u5bccu*\x81\x15r:\x84\xd8\tp\x89\x16\x86\xf8aL\xf0\xad\x00\x00\xe0\x94y\x95\xbd\x8c\xe2\xe0\xc6{\xf1\u01e51\xd4w\xbc\xa1\xb2\xb9ua\x8a\x01BH\xd6\x17\x82\x9e\xce\x00\x00\u07d4y\xae\xb3Ef\xb9t\xc3ZX\x81\xde\xc0 \x92}\xa7\xdf]%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4y\xb1 \xeb\x88\x06s#!(\x8fgZ'\xa9\"_\x1c\xd2\ub245\xa0\xbf7\xde\xc9\xe4\x00\x00\u07d4y\xb4\x8d-a7\u00c5Ma\x1c\x01\xeaBBz\x0fY{\xb7\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4y\xb8\xaa\xd8y\xdd0V~\x87x\xd2\xd21\xc8\xf3z\xb8sN\x89lk\x93[\x8b\xbd@\x00\x00\u07d4y\xbf/{n2\x8a\xaf&\xe0\xbb\t?\xa2-\xa2\x9e\xf2\xf4q\x89a\t=|,m8\x00\x00\u07d4y\xc10\xc7b\xb8v[\x19\u04ab\u0260\x83\xab\x8f:\xady@\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4y\xc1\xbe\x19q\x1fs\xbe\xe4\xe61j\xe7T\x94Y\xaa\u03a2\xe0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4y\xc6\x00/\x84R\xca\x15\u007f\x13\x17\xe8\n/\xaf$GUY\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4y\xca\xc6IO\x11\xef'\x98t\x8c\xb52\x85\xbd\x8e\"\xf9|\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4y\u03e9x\n\xe6\xd8{,1\x88?\t'i\x86\u021ag5\x8965\u026d\xc5\u07a0\x00\x00\u07d4y\u06e2VG-\xb4\xe0X\xf2\xe4\xcd\xc3\xeaN\x8aBw83\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4y\xed\x10\xcf\x1fm\xb4\x82\x06\xb5\t\x19\xb9\xb6\x97\b\x1f\xbd\xaa\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u0794y\xf0\x8e\x01\xce\t\x88\xe6<\u007f\x8f)\b\xfa\xdeC\xc7\xf9\xf5\u0248\xfc\x93c\x92\x80\x1c\x00\x00\u07d4y\xfdmH1Pf\xc2\x04\xf9e\x18i\xc1\tl\x14\xfc\x97\x81\x89lk\x93[\x8b\xbd@\x00\x00\u0794y\xff\xb4\xac\x13\x81*\vx\u0123{\x82u\">\x17k\xfd\xa5\x88\xf0\x15\xf2W6B\x00\x00\u07d4z\x05\x89\xb1C\xa8\xe5\xe1\a\u026cf\xa9\xf9\xf8Yz\xb3\u7ac9Q\xe92\xd7n\x8f{\x00\x00\u07d4z\nx\xa9\xcc9?\x91\xc3\xd9\xe3\x9ak\x8c\x06\x9f\a^k\xf5\x89Hz\x9a0E9D\x00\x00\u07d4z\x13p\xa7B\xec&\x87\xe7a\xa1\x9a\u0167\x942\x9e\xe6t\x04\x89\xa2\xa12ga\xe2\x92\x00\x00\xe0\x94z-\xfcw\x0e$6\x811\xb7\x84w\x95\xf2\x03\xf3\xd5\r[V\x8a\x02i\xfe\xc7\xf06\x1d \x00\x00\u07d4z3\x83N\x85\x83s>-R\xae\xadX\x9b\u046f\xfb\x1d\xd2V\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94z6\xab\xa5\xc3\x1e\xa0\xca~'{\xaa2\xecF\u0393\xcfu\x06\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94z8\x11\"\xba\xday\x1az\xb1\xf6\x03}\xac\x80C'S\xba\xad\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94zH\xd8w\xb6:\x8f\x8f\x93\x83\xe9\xd0\x1eS\xe8\fR\x8e\x95_\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4zO\x9b\x85\x06\x90\xc7\xc9F\x00\xdb\xee\f\xa4\xb0\xa4\x11\xe9\xc2!\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4zc\x86\x9f\xc7g\xa4\u01b1\xcd\x0e\x06I\xf3cL\xb1!\xd2K\x89\x043\x87Oc,\xc6\x00\x00\u07d4zg\xdd\x04:PO\xc2\xf2\xfcq\x94\xe9\xbe\xcfHL\xec\xb1\xfb\x89\r\x8drkqw\xa8\x00\x00\xe0\x94zk&\xf48\u0663RD\x91U\xb8\x87l\xbd\x17\xc9\u065bd\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4zmx\x1cw\u013a\x1f\xca\xdfhsA\xc1\xe3\x17\x99\xe9='\x89\x0e\u0683\x8cI)\b\x00\x00\u07d4zph\xe1\xc37\\\x0eY\x9d\xb1\xfb\xe6\xb2\xea#\xb8\xf4\a\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4zt\xce\xe4\xfa\x0fcp\xa7\x89O\x11l\xd0\f\x11G\xb8>Y\x89+^:\xf1k\x18\x80\x00\x00\u07d4zy\xe3\x0f\xf0W\xf7\n=\x01\x91\xf7\xf5?v\x157\xaf}\xff\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94zzO\x80sW\xa4\xbb\xe6\x8e\x1a\xa8\x0692\x10\xc4\x11\u0333\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4z\x85c\x86y\x01 o?+\xf0\xfa>\x1c\x81\t\u02bc\u0345\x89\amA\xc6$\x94\x84\x00\x00\xe0\x94z\x87\x97i\n\xb7{Tp\xbf|\f\x1b\xbaa%\b\xe1\xac}\x8a\x01\xe0\x92\x96\xc37\x8d\xe4\x00\x00\u07d4z\x8c\x89\xc0\x14P\x9dV\u05f6\x810f\x8f\xf6\xa3\xec\xecsp\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94z\x94\xb1\x99\x92\u03b8\xcec\xbc\x92\xeeKZ\xde\xd1\fM\x97%\x8a\x03\x8d\x1a\x80d\xbbd\xc8\x00\x00\u07d4z\xa7\x9a\xc0C\x16\u030d\b\xf2\x00e\xba\xa6\xd4\x14(\x97\xd5N\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4z\xadM\xbc\u04ec\xf9\x97\u07d3XiV\xf7+d\u062d\x94\xee\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94z\xb2V\xb2\x04\x80\n\xf2\x017\xfa\xbc\xc9\x16\xa22Xu%\x01\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4z\xbaV\xf6:H\xbc\b\x17\u05b9p9\x03\x9az\xd6/\xae.\x89 \x86\xac5\x10R`\x00\x00\xe0\x94z\xbb\x10\xf5\xbd\x9b\xc3;\x8e\xc1\xa8-d\xb5[k\x18wuA\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4z\u010d@\xc6d\u031am\x89\xf1\xc5\xf5\xc8\n\x1cp\xe7D\u6263\x10b\xbe\xee\xd7\x00\x00\x00\u07d4z\u014fo\xfcO\x81\a\xaen07\x8eN\x9f\x99\xc5\u007f\xbb$\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4z\xd3\xf3\aao\x19\u0731C\xe6DM\xab\x9c<3a\x1fR\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4z\xd8,\xae\xa1\xa8\xb4\xed\x051\x9b\x9c\x98p\x17<\x81N\x06\xee\x89!d\xb7\xa0J\u0220\x00\x00\u07d4z\xde]f\xb9D\xbb\x86\f\x0e\xfd\xc8bv\u054fFS\xf7\x11\x89lk\x93[\x8b\xbd@\x00\x00\u07d4z\xdf\xed\xb0m\x91\xf3\xccs\x90E\v\x85U\x02p\x88<{\xb7\x89\x11x\xfa@Q]\xb4\x00\x00\u07d4z\xe1\xc1\x9eS\xc7\x1c\xeeLs\xfa\xe2\xd7\xfcs\xbf\x9a\xb5\u348965\u026d\xc5\u07a0\x00\x00\u07d4z\xe6Y\xeb;\xc4hR\xfa\x86\xfa\xc4\xe2\x1cv\x8dP8\x89E\x89\x0f\x81\f\x1c\xb5\x01\xb8\x00\x00\u07d4z\xea%\xd4+&\x12(n\x99\xc56\x97\u01bcA\x00\xe2\u06ff\x89lk\x93[\x8b\xbd@\x00\x00\u07d4z\xef{U\x1f\v\x9cF\xe7U\xc0\xf3\x8e[:s\xfe\x11\x99\xf5\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4{\v1\xffn$t^\xad\x8e\u067b\x85\xfc\v\xf2\xfe\x1dU\u0509+^:\xf1k\x18\x80\x00\x00\xe0\x94{\x0f\xea\x11v\xd5!Y3:\x14<)IC\xda6\xbb\u0774\x8a\x01\xfc}\xa6N\xa1L\x10\x00\x00\u07d4{\x11g<\xc0\x19bk)\f\xbd\xce&\x04o~m\x14\x1e!\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4{\x12!b\xc9\x13\xe7\x14l\xad\v~\xd3z\xff\xc9*\v\xf2\u007f\x89Q\xaf\tk#\x01\u0440\x00\u07d4{\x1b\xf5:\x9c\xbe\x83\xa7\u07a44W\x9f\xe7*\xac\x8d*\f\u0409\n\xd4\xc81j\v\f\x00\x00\u07d4{\x1d\xaf\x14\x89\x1b\x8a\x1e\x1b\xd4)\u0633k\x9aJ\xa1\u066f\xbf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4{\x1f\xe1\xabM\xfd\x00\x88\xcd\xd7\xf6\x01c\xefY\xec*\xee\x06\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4{%\xbb\x9c\xa8\xe7\x02!~\x933\"RP\xe5<6\x80MH\x89e\xea=\xb7UF`\x00\x00\u07d4{'\xd0\xd1\xf3\xdd<\x14\x02\x94\xd0H\x8bx>\xbf@\x15'}\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94{@\a\xc4^ZW?\u06f6\xf8\xbdtk\xf9J\xd0J<&\x8a\x038!\xf5\x13]%\x9a\x00\x00\u07d4{C\xc7\xee\xa8\xd6#U\xb0\xa8\xa8\x1d\xa0\x81\xc6Dk3\xe9\xe0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4{M*8&\x90i\xc1\x85Ww\rY\x1d$\xc5\x12\x1f^\x83\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94{au\xec\x9b\xef\xc78$\x955\xdd\xde4h\x8c\xd3n\xdf%\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94{f\x12hy\x84M\xfa4\xfee\xc9\xf2\x88\x11\u007f\xef\xb4I\xad\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4{j\x84q\x8d\xd8nc3\x84)\xac\x81\x1d|\x8a\x86\x0f!\xf1\x89a\t=|,m8\x00\x00\xe0\x94{q,z\xf1\x16v\x00jf\xd2\xfc\\\x1a\xb4\xc4y\xce`7\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4{s$-u\u029a\xd5X\xd6P)\r\xf1v\x92\xd5L\u0638\x89lnY\xe6|xT\x00\x00\u07d4{v\x1f\xeb\u007f\u03e7\xde\xd1\xf0\xeb\x05\x8fJ`\v\xf3\xa7\b\u02c9\xf9]\xd2\xec'\xcc\xe0\x00\x00\xe0\x94{\x82|\xae\u007f\xf4t\t\x18\xf2\xe00\xab&\u02d8\xc4\xf4l\xf5\x8a\x01\x94hL\v9\xde\x10\x00\x00\xe0\x94{\x892\x86B~r\xdb!\x9a!\xfcM\xcd_\xbfY(<1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4{\x92&\xd4o\xe7Q\x94\v\xc4\x16\xa7\x98\xb6\x9c\xcf\r\xfa\xb6g\x89\u3bb5sr@\xa0\x00\x00\u07d4{\x98\xe2<\xb9k\xee\xe8\n\x16\x80i\ube8f \xed\xd5\\\u03c9\v\xa0\xc9\x15\x87\xc1J\x00\x00\u07d4{\xb0\xfd\xf5\xa6c\xb5\xfb\xa2\x8d\x9c\x90*\xf0\xc8\x11\xe2R\xf2\x98\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4{\xb9W\x1f9K\v\x1a\x8e\xbaVd\xe9\u0635\xe8@g{\xea\x89\x01\x11du\x9f\xfb2\x00\x00\xe0\x94{\xb9\x84\xc6\u06f9\xe2y\x96j\xfa\xfd\xa5\x9c\x01\xd0&'\xc8\x04\x8a\x01\xb4d1\x1dE\xa6\x88\x00\x00\u07d4{\xbb\xec^p\xbd\xea\u063b2\xb4(\x05\x98\x8e\x96H\xc0\xaa\x97\x8966\u05ef^\u024e\x00\x00\u07d4{\xca\x1d\xa6\xc8\nf\xba\xa5\xdbZ\u0245A\u013e'kD}\x89$\xcf\x04\x96\x80\xfa<\x00\x00\u07d4{\u0772\xee\x98\xde\x19\xeeL\x91\xf6a\xee\x8eg\xa9\x1d\x05K\x97\x8965\u026d\xc5\u07a0\x00\x00\u0794{\xe2\xf7h\f\x80-\xa6\x15L\x92\xc0\x19J\xe72Qzqi\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4{\xe7\xf2Eiq\x88;\x9a\x8d\xbeL\x91\xde\xc0\x8a\xc3N\x88b\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4{\xe8\u0334\xf1\x1bf\xcan\x1dW\xc0\xb59b!\xa3\x1b\xa5:\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94{\xeb\x81\xfb/^\x91Rk*\xc9y^v\u019b\xcf\xf0K\xc0\x8a\x0e\xb2.yO\n\x8d`\x00\x00\u07d4|\b\x83\x05L-\x02\xbcz\x85+\x1f\x86\xc4'w\xd0\xd5\xc8V\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4|\x0f^\a C\xc9\xeet\x02B\x19~x\xccK\x98\xcd\xf9`\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|\x1d\xf2JO\u007f\xb2\u01f4r\xe0\xbb\x00l\xb2}\xcd\x16AV\x8965\u026d\xc5\u07a0\x00\x00\u07d4|)\xd4}W\xa73\xf5k\x9b!pc\xb5\x13\xdc;1Y#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4|+\x96\x03\x88JO.FN\u03b9}\x17\x93\x8d\x82\x8b\xc0,\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4|8,\x02\x96a.N\x97\xe4@\xe0-8q';U\xf5;\x89\n\xb6@9\x12\x010\x00\x00\u07d4|>\xb7\x13\xc4\xc9\xe08\x1c\xd8\x15L|\x9a}\xb8d\\\xde\x17\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|D\x01\xae\x98\xf1.\xf6\xde9\xae$\u03df\xc5\x1f\x80\xeb\xa1k\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|E\xf0\xf8D*V\xdb\u04dd\xbf\x15\x99\x95A\\R\xedG\x9b\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94|S-\xb9\xe0\xc0l&\xfd@\xac\xc5j\xc5\\\x1e\xe9-<:\x8a?\x87\bW\xa3\xe0\xe3\x80\x00\x00\u07d4|`\xa0_zJ_\x8c\xf2xC\x916.uZ\x83A\xefY\x89f\x94\xf0\x18*7\xae\x00\x00\u07d4|`\xe5\x1f\v\xe2(\xe4\xd5o\xdd)\x92\xc8\x14\xdaw@\u01bc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|i$\xd0|>\xf5\x89\x19f\xfe\nxV\xc8{\xef\x9d 4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94|\x8b\xb6Zo\xbbI\xbdA3\x96\xa9\xd7\xe3\x10S\xbb\xb3z\xa9\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94|\x9a\x11\f\xb1\x1f%\x98\xb2\xb2\x0e,\xa4\x002^A\xe9\xdb3\x8a\x05\x81v{\xa6\x18\x9c@\x00\x00\u07d4|\xbc\xa8\x8f\xcaj\x00`\xb9`\x98\\\x9a\xa1\xb0%4\xdc\"\b\x89\x19\x12z\x13\x91\xea*\x00\x00\u07d4|\xbe\xb9\x992\xe9~n\x02\x05\x8c\xfcb\u0432k\xc7\u0325+\x89lk\x93[\x8b\xbd@\x00\x00\u07d4|\xc2Jj\x95\x8c \xc7\xd1$\x96`\xf7Xb&\x95\v\r\x9a\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4|\xd2\x0e\u0335\x18\xb6\f\xab\t[r\x0fW\x15p\u02aaD~\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4|\xd5\xd8\x1e\xab7\xe1\x1ebv\xa3\xa1\t\x12Q`~\r~8\x89\x03hM^\xf9\x81\xf4\x00\x00\u07d4|\xdft!9E\x95=\xb3\x9a\xd0\xe8\xa9x\x1a\xddy.M\x1d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4|\xe4hdF\U000547be\xd6r\x15\xeb\rZ\x1d\xd7,\x11\xb8\x89x9\xd3!\xb8\x1a\xb8\x00\x00\u07d4|\xefMC\xaaA\u007f\x9e\xf8\xb7\x87\xf8\xb9\x9dS\xf1\xfe\xa1\ue209g\x8a\x93 b\xe4\x18\x00\x00\u07d4}\x03P\xe4\v3\x8d\xdasfa\x87+\xe3?\x1f\x97R\xd7U\x89\x02\xb4\xf5\xa6\U00051500\x00\xe0\x94}\x04\xd2\xed\xc0X\xa1\xaf\xc7a\xd9\u025a\xe4\xfc\\\x85\xd4\u0226\x8aB\xa9\xc4g\\\x94g\xd0\x00\x00\u07d4}\v%^\xfbW\xe1\x0fp\b\xaa\"\xd4\x0e\x97R\xdf\xcf\x03x\x89\x01\x9f\x8euY\x92L\x00\x00\xe0\x94}\x13\xd6pX\x84\xab!W\u074d\xccpF\xca\xf5\x8e\xe9K\xe4\x8a\x1d\r\xa0|\xbb>\xe9\xc0\x00\x00\u07d4}'>c~\xf1\xea\u0101\x11\x94\x13\xb9\x1c\x98\x9d\xc5\xea\xc1\"\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4}*R\xa7\xcf\f\x846\xa8\xe0\a\x97kl&\xb7\"\x9d\x1e\x15\x89\x17\xbf\x06\xb3*$\x1c\x00\x00\u07d4}4\x805i\xe0\v\u05b5\x9f\xff\b\x1d\xfa\\\n\xb4\x19zb\x89\\\xd8|\xb7\xb9\xfb\x86\x00\x00\u07d4}4\xffY\xae\x84\nt\x13\u01baL[\xb2\xba,u\xea\xb0\x18\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4}9(R\xf3\xab\xd9/\xf4\xbb[\xb2l\xb6\bt\xf2\xbeg\x95\x8966\xc2^f\xec\xe7\x00\x00\u07d4}DRg\u015a\xb8\u04a2\xd9\xe7\t\x99\x0e\th%\x80\u011f\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94}U\x13\x97\xf7\x9a)\x88\xb0d\xaf\xd0\xef\xeb\xee\x80,w!\xbc\x8a\bW\xe0\xd6\xf1\xdav\xa0\x00\x00\u07d4}Z\xa3?\xc1KQ\x84\x1a\x06\x90n\xdb+\xb4\x9c*\x11ri\x89\x10D\x00\xa2G\x0eh\x00\x00\xe0\x94}]/s\x94\x9d\xad\xda\bV\xb2\x06\x98\x9d\xf0\a\x8dQ\xa1\xe5\x8a\x02\xc4:H\x1d\xf0M\x01wb\xed\xcb\\\xaab\x9bZ\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4~\x8f\x96\xcc)\xf5{\tu\x12\f\xb5\x93\xb7\u0743=`kS\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4~\x97*\x8a|*D\xc9;!Cl8\xd2\x1b\x92R\xc3E\xfe\x89a\t=|,m8\x00\x00\u07d4~\x99\u07fe\x98\x9d;\xa5)\u0457Q\xb7\xf41\u007f\x89S\xa3\xe2\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4~\xa0\xf9n\xe0\xa5s\xa30\xb5h\x97v\x1f=L\x010\xa8\xe3\x89Hz\x9a0E9D\x00\x00\u0794~\xa7\x91\xeb\xab\x04E\xa0\x0e\xfd\xfcNJ\x8e\x9a~ue\x13m\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4~\xab\xa05\xe2\xaf7\x93\xfdtgK\x10%@\xcf\x19\n\u0779\x89E\x02l\x83[`D\x00\x00\xe0\x94~\xb4\xb0\x18\\\x92\xb6C\x9a\b\xe72!h\xcb5<\x8awJ\x8a\x02'\x19l\xa0I\x83\xca\x00\x00\xe0\x94~\xbd\x95\xe9\xc4p\xf7(5\x83\xdcn\x9d,M\xce\v\ua3c4\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4~\u0425\xa8G\xbe\xf9\xa9\xda|\xba\x1dd\x11\xf5\xc3\x161&\x19\x89\x02(\xeb7\xe8u\x1d\x00\x00\u07d4~\xda\xfb\xa8\x98K\xafc\x1a\x82\vk\x92\xbb\xc2\xc56U\xf6\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4~\xdb\x02\xc6\x1a\"r\x87a\x1a\xd9Pici\xccNdzh\x89\x0e\u0683\x8cI)\b\x00\x00\u07d4~\xe5\u0280]\xce#\xaf\x89\xc2\xd4D\xe7\xe4\af\xc5Lt\x04\x89\r\v\xd4\x12\xed\xbd\x82\x00\x00\xe0\x94~\xe6\x04\u01e9\xdc)\t\xce2\x1d\u6e72OWgWuU\x8a\x01+\xf9\u01d8\\\xf6-\x80\x00\u07d4~\xf1o\xd8\xd1[7\x8a\x0f\xba0k\x8d\x03\u0758\xfc\x92a\x9f\x89%\xf2s\x93=\xb5p\x00\x00\u07d4~\xf9\x8bR\xbe\xe9S\xbe\xf9\x92\xf3\x05\xfd\xa0'\xf8\x91\x1cXQ\x89\x1b\xe7\" i\x96\xbc\x80\x00\u07d4~\xfc\x90vj\x00\xbcR7,\xac\x97\xfa\xbd\x8a<\x83\x1f\x8e\u0349\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4~\xfe\xc0\xc6%<\xaf9\u007fq(|\x1c\a\xf6\xc9X+[\x86\x89\x1a,\xbc\xb8O0\u0540\x00\u07d4\u007f\x01\xdc|7G\xca`\x8f\x98=\xfc\x8c\x9b9\xe7U\xa3\xb9\x14\x89\v8l\xad_zZ\x00\x00\u07d4\u007f\x06b\xb4\x10)\x8c\x99\xf3\x11\u04e1EJ\x1e\xed\xba/\xeav\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\u007f\x06\u021dY\x80\u007f\xa6\v\xc6\x016\xfc\xf8\x14\u02ef%C\xbd\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u007f\v\x90\xa1\xfd\u050f'\xb2h\xfe\xb3\x83\x82\xe5]\xdbP\xef\x0f\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\u007f\x0e\xc3\u06c0F\x92\xd4\xd1\xea2E6Z\xab\x05\x90\a[\u0109\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u007f\x0f\x04\xfc\xf3zS\xa4\xe2N\xden\x93\x10Nx\xbe\x1d<\x9e\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u007f\x13\xd7`I\x8dq\x93\xcahY\xbc\x95\xc9\x018d#\xd7l\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\u007f\x15\n\xfb\x1aw\u00b4Y(\xc2h\xc1\u9f74d\x1dG\u0609lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\x16\x19\x98\x8f7\x15\xe9O\xf1\xd2S&-\xc5X\x1d\xb3\xde\x1c\x890\xca\x02O\x98{\x90\x00\x00\u07d4\u007f\x1c\x81\xee\x16\x97\xfc\x14K|\v\xe5I;V\x15\xae\u007f\xdd\u0289\x1b\x1d\xaba\u04ead\x00\x00\u07d4\u007f#\x82\xff\xd8\xf89VFy7\xf9\xbar7F#\xf1\x1b8\x89 \x86\xac5\x10R`\x00\x00\u07d4\u007f7\t9\x1f?\xbe\xba5\x92\xd1u\xc7@\xe8z\tT\x1d\x02\x89\x1a\x05V\x90\xd9\u06c0\x00\x00\u07d4\u007f8\x9c\x12\xf3\xc6\x16OdFVlwf\x95\x03\xc2y%'\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\xe0\x94\u007f:\x1eE\xf6~\x92\u0200\xe5s\xb43y\xd7\x1e\xe0\x89\xdbT\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\u007f=r\x03\u0224G\xf7\xbf6\u060a\xe9\xb6\x06*^\xeex\xae\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\u007fF\xbb%F\r\xd7\xda\xe4!\x1c\xa7\xf1Z\xd3\x12\xfc}\xc7\\\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\u007fI\xe7\xa4&\x98\x82\xbd\x87\"\u0526\xf5f4v)b@y\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u007fI\xf2\a&G\x1a\xc1\u01e8>\xf1\x06\xe9w\\\xebf%f\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\u007fK^'\x85x\xc0F\xcc\xea\xf6W0\xa0\xe0h2\x9e\u0576\x89e\xea=\xb7UF`\x00\x00\u07d4\u007fOY;a\x8c3\v\xa2\xc3\xd5\xf4\x1e\xce\xeb\x92\xe2~Bl\x89\x96n\xdcuk|\xfc\x00\x00\u07d4\u007fT\x14\x91\u04ac\x00\xd2a/\x94\xaa\u007f\v\xcb\x01FQ\xfb\u0509\x14b\fW\xdd\xda\xe0\x00\x00\u07d4\u007fZ\xe0Z\xe0\xf8\xcb\xe5\xdf\xe7!\xf0D\u05e7\xbe\xf4\xc2y\x97\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\u007f`:\xec\x17Y\xea_\a\xc7\xf8\xd4\x1a\x14(\xfb\xba\xf9\xe7b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u007falo\x00\x8a\u07e0\x82\xf3M\xa7\xd0e\x04`6\x80u\xfb\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u007fa\xfal\xf5\xf8\x98\xb4@\xda\u016b\xd8`\rmi\x1f\xde\xf9\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\xe0\x94\u007fe\\g\x89\xed\xdfE\\\xb4\xb8\x80\x99r\x0698\x9e\ubb0a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\u007fk(\u0204!\xe4\x85~E\x92\x81\u05c4ai$\x89\xd3\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007fn\xfboC\x18\x87m.\xe6$\xe2u\x95\xf4DF\xf6\x8e\x93\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\u007fq\x92\xc0\xdf\x1c}\xb6\xd9\xede\xd7\x11\x84\xd8\xe4\x15Z\x17\xba\x89\x04Sr\x8d3\x94,\x00\x00\u07d4\u007fz:!\xb3\xf5\xa6]\x81\xe0\xfc\xb7\xd5-\xd0\n\x1a\xa3m\xba\x89\x05k\xc7^-c\x10\x00\x00\u07d4\u007f\x8d\xbc\xe1\x80\xed\x9cV65\xaa\xd2\xd9{L\xbcB\x89\x06\u0649\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\u007f\x99=\xdb~\x02\u0082\xb8\x98\xf6\x15_h\x0e\xf5\xb9\xaf\xf9\a\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\u007f\x9f\x9bV\xe4(\x9d\xfbX\xe7\x0f\xd5\xf1*\x97\xb5m5\u01a5\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u007f\xa3~\xd6x\x87u\x1aG\x1f\x0e\xb3\x06\xbeD\xe0\xdb\xcd`\x89\x899vt\u007f\xe1\x1a\x10\x00\x00\u07d4\u007f\xaa0\xc3\x15\x19\xb5\x84\xe9rP\xed*<\xf38^\xd5\xfdP\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\xcf[\xa6fo\x96lTH\xc1{\xf1\xcb\v\xbc\xd8\x01\x9b\x06\x89\x05k\xc3\u042e\xbeI\x80\x00\xe0\x94\u007f\xd6y\xe5\xfb\r\xa2\xa5\xd1\x16\x19M\xcbP\x83\x18\xed\u0140\xf3\x8a\x01c\x9eI\xbb\xa1b\x80\x00\x00\u07d4\u007f\u06e01\u01cf\x9c\tmb\xd0Z6\x9e\uac3c\xccU\u5257\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\u007f\xdb\u00e8D\xe4\r\x96\xb2\xf3\xa652.`e\xf4\xca\x0e\x84\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\xdf\u020dx\xbf\x1b(Z\xc6O\x1a\xdb5\xdc\x11\xfc\xb09Q\x89|\x06\xfd\xa0/\xb06\x00\x00\u07d4\u007f\xea\x19b\xe3]b\x05\x97h\xc7I\xbe\u0756\u02b90\xd3x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\xef\x8c8w\x9f\xb3\a\xeco\x04K\xeb\xe4\u007f<\xfa\xe7\x96\xf1\x89\t#@\xf8l\xf0\x9e\x80\x00\u07d4\u007f\xf0\xc6?p$\x1b\xec\xe1\x9bs~SA\xb1+\x10\x901\u0609\x12\xc1\xb6\xee\xd0=(\x00\x00\xe0\x94\u007f\xfa\xbf\xbc9\f\xbeC\u0389\x18\x8f\bh\xb2}\xcb\x0f\f\xad\x8a\x01YQ\x82\"K&H\x00\x00\xe0\x94\u007f\xfd\x02\xed7\fp`\xb2\xaeS\xc0x\xc8\x01!\x90\u07fbu\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794\x80\x02*\x12\a\xe9\x10\x91\x1f\xc9(I\xb0i\xab\f\xda\xd0C\u04c8\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\x80\t\xa7\xcb\u0452\xb3\xae\u052d\xb9\x83\xd5(ER\xc1ltQ\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80\x0e}c\x1cnW:\x903/\x17\xf7\x1f_\u045bR\x8c\xb9\x89\b=lz\xabc`\x00\x00\u07d4\x80\x15m\x10\ufa320\u0254\x10c\r7\xe2i\xd4\t<\xea\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\x172\xa4\x81\u00c0\xe5~\xd6-l)\u0799\x8a\xf3\xfa;\x13\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\x1de\xc5\x18\xb1\x1d\x0e?OG\x02!Ap\x13\xc8\xe5>\u0149\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80&CZ\xacr\x8dI{\x19\xb3\xe7\xe5|(\xc5c\x95O+\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\x80-\xc3\xc4\xff-}\x92^\u215fJ\x06\u05fa`\xf10\x8c\x89\x05P\x94\f\x8f\xd3L\x00\x00\u07d4\x800\xb1\x11\u0198?\x04\x85\u076c\xa7b$\xc6\x18\x064x\x9f\x89\x04V9\x18$O@\x00\x00\u07d4\x805\xbc\xff\xae\xfd\xee\xea5\x83\fI}\x14(\x9d6 #\u0789\x10CV\x1a\x88)0\x00\x00\u07d4\x805\xfeNkj\xf2z\u44a5xQ^\x9d9\xfao\xa6[\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80C\xed\"\xf9\x97\u58a4\xc1n6D\x86\xaed\x97V\x92\u0109=I\x04\xff\xc9\x11.\x80\x00\u07d4\x80C\xfd\u043cL\x97=\x16c\xd5_\xc15P\x8e\xc5\xd4\xf4\xfa\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x80L\xa9IrcOc:Q\xf3V\v\x1d\x06\xc0\xb2\x93\xb3\xb1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x80R-\u07d4N\xc5.'\xd7$\xedL\x93\xe1\xf7\xbe`\x83\u0589\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x80Y\x1aB\x17\x9f4\xe6M\x9d\xf7]\xcdF;(hoUt\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x80\\\xe5\x12\x97\xa0y;\x81 g\xf0\x17\xb3\xe7\xb2\u07db\xb1\xf9\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x80]\x84o\xb0\xbc\x02\xa73r&\u0585\xbe\x9e\xe7s\xb9\x19\x8a\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\x80c7\x9a{\xf2\u02d2:\x84\xc5\t>h\xda\xc7\xf7T\x81\u0149\x11v\x10.n2\xdf\x00\x00\u07d4\x80hTX\x8e\xcc\xe5AI_\x81\u008a)\x03s\xdf\x02t\xb2\x89\x1f\x8c\xdf\\n\x8dX\x00\x00\u07d4\x80oD\xbd\xebh\x807\x01^\x84\xff!\x80I\xe3\x823*3\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\x80tF\x18\xde9jT1\x97\xeeH\x94\xab\xd0c\x98\xdd|'\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80w\xc3\xe4\xc4EXn\tL\xe1\x02\x93\u007f\xa0[s{V\x8c\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\x90\u007fY1H\xb5|F\xc1w\xe2=%\xab\u012a\xe1\x83a\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\x97s\x16\x94NYB\xe7\x9b\x0e:\xba\u04cd\xa7F\be\x19\x89\x02\x1auJm\xc5(\x00\x00\xe0\x94\x80\xa0\xf6\xcc\x18l\xf6 \x14\x00sn\x06Z9\x1fR\xa9\xdfJ\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x80\xab\xecZ\xa3n\\\x9d\t\x8f\x1b\x94(\x81\xbdZ\xca\u0196=\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\xb2=8\v\x82\\F\xe098\x99\xa8UVF-\xa0\u1309lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\xb4-\xe1p\xdb\xd7#\xf4T\xe8\x8fw\x16E-\x92\x98P\x92\x89\x10F#\xc0v-\xd1\x00\x00\u07d4\x80\xb7\x9f3\x83\x90\u047a\x1b77\xa2\x9a\x02W\xe5\xd9\x1e\a1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x80\xbf\x99^\u063a\x92p\x1d\x10\xfe\u011f\x9e}\x01M\xbe\xe0&\x89\x1f\x047\xca\x1a~\x12\x80\x00\u07d4\x80\xc0N\xfd1\x0fD\x04\x83\xc7?tK[\x9edY\x9c\xe3\xec\x89A\rXj \xa4\xc0\x00\x00\u07d4\x80\u00e9\xf6\x95\xb1m\xb1Yr\x86\u0473\xa8\xb7il9\xfa'\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\xc5>\xe7\xe35\u007f\x94\xce\rxh\x00\x9c \x8bJ\x13\x01%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\xcc!\xbd\x99\xf3\x90\x05\u014f\xe4\xa4H\x90\x92 !\x8ff\u02c966\xc9yd6t\x00\x00\u07d4\x80\xd5\xc4\fY\xc7\xf5N\xa3\xa5_\xcf\xd1uG\x1e\xa3P\x99\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x80\xda/\u0762\x9a\x9e'\xf9\xe1\x15\x97^i\xae\x9c\xfb\xf3\xf2~\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x80\xe7\xb3 R0\xa5f\xa1\xf0a\xd9\"\x81\x9b\xb4\xd4\u04a0\xe1\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x80\xea\x1a\xcc\x13n\xcaKh\xc8B\xa9Z\xdfk\u007f\xee~\xb8\xa2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80\xf0z\xc0\x9e{,<\n=\x1e\x94\x13\xa5D\xc7:A\xbe\u02c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x81\r\xb2Vu\xf4^\xa4\xc7\xf3\x17\u007f7\xce)\xe2-g\x99\x9c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x81\x13\x9b\xfd\u0326V\xc40 ?r\x95\x8cT;e\x80\xd4\f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x81\x14a\xa2\xb0\u0290\xba\xda\xc0j\x9e\xa1nx{3\xb1\x96\u0309\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4\x81\x16M\xeb\x10\x81J\xe0\x83\x91\xf3,\bf{bH\xc2}z\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\x81\x18i1\x18A7\xd1\x19*\u020c\xd3\xe1\xe5\xd0\xfd\xb8jt\x89\x9d5\x95\xab$8\xd0\x00\x00\u0794\x81*U\xc4<\xae\xdcYr\x187\x90\x00\xceQ\rT\x886\xfd\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x81.\xa7\xa3\xb2\xc8n\xed2\xffO,sQL\xc6;\xac\xfb\u038965\u026d\xc5\u07a0\x00\x00\u07d4\x814\xdd\x1c\x9d\xf0\xd6\u0225\x81$&\xbbU\xc7a\u0283\x1f\b\x89\x06\xa2\x16\v\xb5|\xcc\x00\x00\u07d4\x81A5\u068f\x98\x11\aW\x83\xbf\x1a\xb6pb\xaf\x8d>\x9f@\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x81I\x8c\xa0{\x0f/\x17\xe8\xbb\xc7\xe6\x1a\u007fJ\xe7\xbef\xb7\x8b\x89\x05\x81\xfb\xb5\xb3;\xb0\x00\x00\u07d4\x81Um\xb2sI\xab\x8b'\x00ID\xedP\xa4n\x94\x1a\x0f_\x89\u063beI\xb0+\xb8\x00\x00\u07d4\x81U\xfalQ\xeb1\xd8\bA-t\x8a\xa0\x86\x10P\x18\x12/\x89e\xea=\xb7UF`\x00\x00\xe0\x94\x81V6\v\xbd7\ta\xce\xcakf\x91\xd7P\x06\xad L\xf2\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x81a\xd9@\xc3v\x01\x00\xb9\b\x05)\xf8\xa6\x03%\x03\x0fn\u0709\x10CV\x1a\x88)0\x00\x00\xe0\x94\x81d\xe7\x83\x14\xae\x16\xb2\x89&\xccU=,\xcb\x16\xf3V'\r\x8a\x01\xca\x13N\x95\xfb2\xc8\x00\x00\u07d4\x81e\u02b0\xea\xfbZ2\x8f\xc4\x1a\xc6M\xaeq[.\xef,e\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x81h\xed\xce\u007f)a\xcf)[\x9f\xcdZE\xc0l\xde\xdan\xf5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x81m\x97r\xcf\x119\x91\x16\xcc\x1er\xc2lgt\xc9\xed\xd79\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x81s\xc85djg.\x01R\xbe\x10\xff\xe8Ab\xdd%nL\x89\x1a\xab\xdf!E\xb40\x00\x00\u07d4\x81t\x93\u035b\xc6#p*$\xa5o\x9f\x82\xe3\xfdH\xf3\xcd1\x89\x9eK#\xf1-L\xa0\x00\x00\u07d4\x81y\xc8\tp\x18,\u0177\xd8*M\xf0n\xa9M\xb6:%\xf3\x89'o%\x9d\xe6k\xf4\x00\x00\u07d4\x81z\xc3;\xd8\xf8GVsr\x95\x1fJ\x10\u05e9\x1c\xe3\xf40\x89\n\xd7\xc4\x06\xc6m\xc1\x80\x00\xe0\x94\x81\x8f\xfe'\x1f\u00d75e\xc3\x03\xf2\x13\xf6\xd2\u0689\x89~\xbd\x8a\x016\xe0SB\xfe\u1e40\x00\u07d4\x81\x97\x94\x81!s.c\xd9\xc1H\x19N\xca\xd4n0\xb7I\u0209\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x81\x9a\xf9\xa1\xc2s2\xb1\xc3i\xbb\xda\x1b=\xe1\xc6\xe93\xd6@\x89\x11\t\xe6T\xb9\x8fz\x00\x00\xe0\x94\x81\x9c\u06a506x\xef|\xecY\u050c\x82\x16:\xcc`\xb9R\x8a\x03\x13QT_y\x81l\x00\x00\u07d4\x81\x9e\xb4\x99\vZ\xbaUG\t=\xa1+k<\x10\x93\xdfmF\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x81\xa8\x81\x96\xfa\xc5\xf2<>\x12\xa6\x9d\xecK\x88\x0e\xb7\xd9s\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x81\xbc\xcb\xff\x8fD4~\xb7\xfc\xa9['\xce|\x95$\x92\xaa\xad\x89\b@\xc1!e\xddx\x00\x00\u07d4\x81\xbdu\xab\xd8e\xe0\xc3\xf0J\vO\xdb\xcbt\xd3@\x82\xfb\xb7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x81\xc1\x8c*#\x8d\xdcL\xba#\n\a-\xd7\xdc\x10\x1eb\x02s\x89Hz\x9a0E9D\x00\x00\u07d4\x81\xc9\xe1\xae\xe2\xd36]S\xbc\xfd\u0356\xc7\xc58\xb0\xfd~\xec\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\x81\u03edv\t\x13\xd3\xc3\"\xfc\xc7{I\u00ae9\a\xe7On\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\x81\xd6\x19\xffW&\xf2@_\x12\x90Lr\xeb\x1e$\xa0\xaa\xeeO\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x81\xef\u25aev\xc8`\xd1\xc5\xfb\xd3=G\xe8\u0399\x96\xd1W\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x81\xf8\xde,(=_\u052f\xbd\xa8]\xed\xf9v\x0e\xab\xbb\xb5r\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x82\f\x19)\x11\x96P[e\x05\x9d\x99\x14\xb7\t\v\xe1\u06c7\u0789\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x82\x1c\xb5\xcd\x05\xc7\uf41f\xe1\xbe`s=\x89c\xd7`\xdcA\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x82\x1dy\x8a\xf1\x99\x89\u00ee[\x84\xa7\xa7(<\xd7\xfd\xa1\xfa\xbe\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x82\x1e\xb9\t\x94\xa2\xfb\xf9K\xdc23\x91\x02\x96\xf7o\x9b\xf6\xe7\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x82$\x9f\xe7\x0fa\u01b1o\x19\xa3$\x84\x0f\xdc\x02\x021\xbb\x02\x8a\x02\x036\xb0\x8a\x93c[\x00\x00\u07d4\x82(\xeb\xc0\x87H\x0f\xd6EG\xca(\x1f^\xac\xe3\x04\x14S\xb9\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\x82)\u03b9\xf0\xd7\b9I\x8dD\xe6\xab\xed\x93\xc5\xca\x05\x9f]\x8a\x1a\x1c\x1b<\x98\x9a \x10\x00\x00\u07d4\x82.\xdf\xf66V:a\x06\xe5.\x9a%\x98\xf7\xe6\xd0\xef'\x82\x89\x01\xf4\xf9i=B\u04c0\x00\u07d4\x822\x19\xa2Yv\xbb*\xa4\xaf\x8b\xadA\xac5&\xb4\x936\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x822\xd1\xf9t.\u07cd\xd9'\xda5;*\xe7\xb4\xcb\xceu\x92\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\x824\xf4c\u0444\x85P\x1f\x8f\x85\xac\xe4\x97,\x9bc-\xbc\u0309lk\x93[\x8b\xbd@\x00\x00\u07d4\x827htg7\xcem\xa3\x12\xd5>TSN\x10o\x96|\xf3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82;\xa7dr8\xd1\x13\xbc\xe9\x96JC\u0420\x98\x11\x8b\xfeM\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x82@t1(\x06\xdaGHCBf\xee\x00!@\u305a\u0089Q\xb1\u04c3\x92a\xac\x00\x00\u07d4\x82C\x8f\u04b3*\x9b\xddgKI\xd8\xcc_\xa2\xef\xf9x\x18G\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82HW(\xd0\xe2\x81V7X\xc7Z\xb2~\xd9\u80a0\x00-\x89\a\xf8\b\xe9)\x1el\x00\x00\u07d4\x82K<\x19)]~\xf6\xfa\xa7\xf3t\xa4y\x84\x86\xa8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82Q5\x8c\xa4\xe0`\u0775Y\xcaX\xbc\v\u077e\xb4\a\x02\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82Q5\xb1\xa7\xfc\x16\x05aL\x8a\xa4\u042cm\xba\u040fH\x0e\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\x82S\t\xa7\xd4]\x18\x12\xf5\x1en\x8d\xf5\xa7\xb9ol\x90\x88\x87\x89\x804\xf7\u0671f\xd4\x00\x00\u07d4\x82Z\u007fN\x10\x94\x9c\xb6\xf8\x96Bh\xf1\xfa_W\xe7\x12\xb4\u0109\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82a\xfa#\f\x90\x1dC\xffW\x9fG\x80\u04d9\xf3\x1e`v\xbc\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82b\x16\x9baXp\x13N\xb4\xacl_G\x1ck\xf2\xf7\x89\xfc\x89\x19\x12z\x13\x91\xea*\x00\x00\u07d4\x82c\xec\xe5\xd7\t\xe0\u05eeq\u0328h\xed7\xcd/\xef\x80{\x895\xab\x02\x8a\xc1T\xb8\x00\x00\xe0\x94\x82l\xe5y\x052\xe0T\x8ca\x02\xa3\r>\xac\x83k\xd68\x8f\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4\x82n\xb7\xcds\x19\xb8-\xd0z\x1f;@\x90q\xd9n9g\u007f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x82u1\xa6\u0141z\xe3_\x82\xb0\v\x97T\xfc\xf7LU\xe22\x89\xc3(\t>a\xee@\x00\x00\u0794\x82u\xcdhL6y\u0548}\x03fN3\x83E\xdc<\xdd\xe1\x88\xdbD\xe0I\xbb,\x00\x00\u07d4\x82\x84\x92;b\u62ff|+\x9f4\x14\xd1>\xf6\xc8\x12\xa9\x04\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\x82\x8b\xa6Q\u02d3\x0e\xd9xqV)\x9a=\xe4L\u040br\x12\x89Hz\x9a0E9D\x00\x00\u07d4\x82\xa1\\\xef\x1dl\x82`\xea\xf1Y\xea?\x01\x80\xd8g}\xce\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82\xa8\xb9kl\x9e\x13\xeb\xec\x1e\x9f\x18\xac\x02\xa6\x0e\xa8\x8aH\xff\x89lk\x8c@\x8es\xb3\x00\x00\u07d4\x82\xa8\u02ff\xdf\xf0+.8\xaeK\xbf\xca\x15\xf1\xf0\xe8;\x1a\xea\x89\x04\x9b\x99\x1c'\xefm\x80\x00\u07d4\x82\xe4F\x1e\xb9\xd8I\xf0\x04\x1c\x14\x04!\x9eBr\u0110\n\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82\xe5w\xb5\x15\xcb+\b`\xaa\xfe\x1c\xe0\x9aY\xe0\x9f\xe7\xd0@\x89 \x86\xac5\x10R`\x00\x00\u07d4\x82\xea\x01\xe3\xbf.\x83\x83nqpN\"\xa2q\x93w\xef\xd9\u00c9\xa4\xccy\x95c\u00c0\x00\x00\u07d4\x82\xf2\xe9\x91\xfd2L_]\x17v\x8e\x9fa3]\xb61\x9dl\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x82\xf3\x9b'X\xaeB'{\x86\u059fu\xe6(\xd9X\xeb\u02b0\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94\x82\xf8T\xc9\xc2\xf0\x87\xdf\xfa\x98Z\xc8 \x1ebl\xa5Fv\x86\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x82\xffqo\xdf\x03>\xc7\xe9B\xc9\t\u0643\x18g\xb8\xb6\xe2\xef\x89a\t=|,m8\x00\x00\u07d4\x83\b\xed\n\xf7\xf8\xa3\xc1u\x1f\xaf\xc8w\xb5\xa4*\xf7\xd3X\x82\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x83\x1cD\xb3\b@G\x18K*\xd2\x18h\x06@\x907P\xc4]\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x83!\x05\x83\xc1jN\x1e\x1d\xac\x84\xeb\xd3~=\x0f|W\ub909lk\x93[\x8b\xbd@\x00\x00\u07d4\x83,T\x17k\xdfC\xd2\u027c\u05f8\b\xb8\x95V\xb8\x9c\xbf1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x833\x16\x98]Gt+\xfe\xd4\x10`J\x91\x95<\x05\xfb\x12\xb0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x834vK{9zNW\x8fP6M`\xceD\x89\x9b\xff\x94\x89\x05\x03\xb2\x03\xe9\xfb\xa2\x00\x00\xe0\x94\x83;j\x8e\xc8\xda@\x81\x86\xac\x8a}*m\xd6\x15#\xe7\u0384\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\x83=?\xaeT*\xd5\xf8\xb5\f\xe1\x9b\xde+\xecW\x91\x80\u020c\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\xe0\x94\x83=\xb4,\x14\x16<{\xe4\u02b8j\u0153\xe0bf\u0599\u054a$\xe4\r+iC\xef\x90\x00\x00\xe0\x94\x83V;\xc3d\ud060\xc6\xda;V\xffI\xbb\xf2g\x82z\x9c\x8a\x03\xab\x91\xd1{ \xdeP\x00\x00\u07d4\x83zd]\xc9\\IT\x9f\x89\x9cN\x8b\u03c7S$\xb2\xf5|\x89 \x8c9J\xf1\u0208\x00\x00\u07d4\x83\x8b\xd5e\xf9\x9f\xdeH\x05?y\x17\xfe3<\xf8J\xd5H\xab\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x83\x90\x8a\xa7G\x8am\x1c\x9b\x9b\x02\x81\x14\x8f\x8f\x9f$+\x9f\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4\x83\x92\xe57vq5x\x01[\xffI@\xcfC\x84\x9d}\u02e1\x89\bM\xf05]V\x17\x00\x00\xe0\x94\x83\x97\xa1\xbcG\xac\xd6GA\x81Y\xb9\x9c\xeaW\xe1\xe6S-n\x8a\x01\xf1\x0f\xa8'\xb5P\xb4\x00\x00\u07d4\x83\x98\xe0~\xbc\xb4\xf7_\xf2\x11m\xe7|\x1c*\x99\xf3\x03\xa4\u03c9\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x83\xa3\x14\x883\xd9dI\x84\xf7\xc4u\xa7\x85\a\x16\ufd00\xff\x89\xb8Pz\x82\a( \x00\x00\u07d4\x83\xa4\x02C\x8e\x05\x19w=TH2k\xfba\xf8\xb2\f\xf5-\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4\x83\xa9;[\xa4\x1b\xf8\x87 \xe4\x15y\f\xdc\vg\xb4\xaf4\u0109\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x83\xc2=\x8aP!$\xee\x15\x0f\b\xd7\x1d\xc6rt\x10\xa0\xf9\x01\x8a\a3\x1f;\xfef\x1b\x18\x00\x00\u07d4\x83\u0217\xa8Ki^\xeb\xe4fy\xf7\xda\x19\xd7vb\x1c&\x94\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x83\xd52\u04cdm\xee?`\xad\u018b\x93a3\u01e2\xa1\xb0\u0749\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x83\xdb\xf8\xa1(S\xb4\n\xc6\x19\x96\xf8\xbf\x1d\xc8\xfd\xba\xdd\xd3)\x894\x95tD\xb8@\xe8\x00\x00\u07d4\x83\xdb\xfd\x8e\xda\x01\xd0\u078e\x15\x8b\x16\u0413_\xc28\n]\u01c9 \x86\xac5\x10R`\x00\x00\u07d4\x83\xe4\x80U2|(\xb5\x93o\xd9\xf4D~s\xbd\xb2\xdd3v\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\x83\xfeZ\x1b2\x8b\xaeD\a\x11\xbe\xafj\xad`&\xed\xa6\xd2 \x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x84\x00\x8ar\xf8\x03o?\xeb\xa5B\xe3Px\xc0W\xf3*\x88%\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x84\x0e\xc8>\xa96!\xf04\xe7\xbb7b\xbb\x8e)\xde\xd4\xc4y\x89\x87\x86x2n\xac\x90\x00\x00\xe0\x94\x84\x11E\xb4H@\xc9F\xe2\x1d\xbc\x19\x02d\xb8\xe0\xd5\x02\x93i\x8a?\x87\bW\xa3\xe0\xe3\x80\x00\x00\u07d4\x84#!\a\x93+\x12\xe01\x86X5%\xce\x02:p>\xf8\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4\x84$O\xc9ZiW\xed|\x15\x04\xe4\x9f0\xb8\xc3^\xcaKy\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x841'}{\xdd\x10E}\xc0\x17@\x8c\x8d\xbb\xbdAJ\x8d\xf3\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4\x847Z\xfb\xf5\x9b:\x1da\xa1\xbe2\xd0u\xe0\xe1ZO\xbc\xa5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x84;\xd3P/E\xf8\xbcM\xa3p\xb3#\xbd\xac?\xcf_\x19\xa6\x89P\x03\x9dc\xd1\x1c\x90\x00\x00\u07d4\x84P34c\rw\xf7AG\xf6\x8b.\bf\x13\xc8\xf1\xad\xe9\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x84R\x03u\x0fqH\xa9\xaa&)!\xe8mC\xbfd\x19t\xfd\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x84a\xec\u0126\xa4^\xb1\xa5\xb9G\xfb\x86\xb8\x80i\xb9\x1f\xcdo\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84g^\x91wrmE\xea\xa4k9\x92\xa3@\xba\u007fq\f\x95\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x84hl{\xadv,T\xb6g\u055f\x90\x94<\xd1M\x11z&\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x84\x89\xf6\xad\x1d\x9a\x94\xa2\x97x\x91V\x89\x9d\xb6AT\xf1\u06f5\x89\x13t\a\xc0<\x8c&\x80\x00\u07d4\x84\x8c\x99Jy\x00?\xe7\xb7\xc2l\xc62\x12\xe1\xfc/\x9c\x19\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84\x8f\xbd)\xd6|\xf4\xa0\x13\xcb\x02\xa4\xb1v\xef$N\x9e\u6349\x01\x17*ck\xbd\xc2\x00\x00\u07d4\x84\x94\x9d\xbaU\x9ac\xbf\xc8E\xde\xd0n\x9f-\x9b\u007f\x11\xef$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84\x9a\xb8\a\x90\xb2\x8f\xf1\xff\u05ba9N\xfctc\x10\\6\xf7\x89\x01\xe0+\xe4\xael\x84\x00\x00\u07d4\x84\x9b\x11oYc\x01\xc5\u063bb\xe0\xe9z\x82H\x12n9\xf3\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x84\xa7L\xee\xcf\xf6\\\xb9;/\x94\x9dw>\xf1\xad\u007f\xb4\xa2E\x89\x05\n\x9bDF\x85\xc7\x00\x00\u07d4\x84\xaa\xc7\xfa\x19\u007f\xf8\\0\xe0;zS\x82\xb9W\xf4\x1f:\xfb\x89\b\x8b#\xac\xff\u0650\x00\x00\u07d4\x84\xaf\x1b\x15sB\xd5Ch&\r\x17\x87b0\xa54\xb5K\x0e\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x84\xb0\xeek\xb87\u04e4\xc4\xc5\x01\x1c:\"\x8c\x0e\u06b4cJ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x84\xb4\xb7Nf#\xba\x9d\x15\x83\xe0\u03feId?\x168AI\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x84\xb6\xb6\xad\xbe/[>-h,f\xaf\x1b\u0110S@\xc3\xed\x89!\x92\xf8\xd2\"\x15\x00\x80\x00\xe0\x94\x84\xb9\x1e.)\x02\xd0^+Y\x1bA\b;\u05fe\xb2\xd5,t\x8a\x02\x15\xe5\x12\x8bE\x04d\x80\x00\u07d4\x84\xbc\xbf\"\xc0\x96\a\xac\x844\x1d.\xdb\xc0;\xfb\x179\xd7D\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x84\xbf\xce\xf0I\x1a\n\xe0iK7\u03ac\x02E\x84\xf2\xaa\x04g\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x84\xcb}\xa0P-\xf4\\\xf5a\x81{\xbd#b\xf4Q\xbe\x02\u0689Hz\x9a0E9D\x00\x00\u07d4\x84\xccxx\xda`_\xdb\x01\x9f\xab\x9bL\xcf\xc1Wp\x9c\u0765\x89Hy\x85\x13\xaf\x04\xc9\x00\x00\u07d4\x84\xdb\x14Y\xbb\x00\x81.\xa6~\xcb=\xc1\x89\xb7!\x87\xd9\xc5\x01\x89\b\x11\xb8\xfb\u0685\xab\x80\x00\u07d4\x84\u9516\x80\xbe\xcehA\xb9\xa7\xe5%\r\b\xac\xd8}\x16\u0349\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x84\xe9\u03c1f\xc3j\xbf\xa4\x90S\xb7\xa1\xad@6 &\x81\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84\xec\x06\xf2G\x00\xfeBAL\xb9\x89|\x15L\x88\xde/a2\x89Hz\x9a0E9D\x00\x00\xe0\x94\x84\xf5\"\xf0R\x0e\xbaR\xdd\x18\xad!\xfaK\x82\x9f+\x89\u02d7\x8a\x01\fQ\x06\xd5\x13O\x13\x00\x00\u07d4\x85\v\x9d\xb1\x8f\xf8K\xf0\xc7\xdaI\xea7\x81\xd9 \x90\xad~d\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4\x85\x10\xee\x93O\f\xbc\x90\x0e\x10\a\xeb8\xa2\x1e*Q\x01\xb8\xb2\x89\x05\xbf\v\xa6cOh\x00\x00\u07d4\x85\x16\xfc\xafw\u0213\x97\x0f\xcd\x1a\x95\x8b\xa9\xa0\x0eI\x04@\x19\x89\n\xa3\xeb\x16\x91\xbc\xe5\x80\x00\u07d4\x85\x1a\xa9\x1c\x82\xf4/\xad]\xd8\xe8\xbb^\xa6\x9c\x8f:Yw\u0449\b\x0eV\x1f%xy\x80\x00\u07d4\x85\x1c\rb\xbeF5\xd4w~\x805\xe3~K\xa8Q|a2\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x85\x1d\u00ca\xdbE\x93r\x9av\xf3:\x86\x16\u06b6\xf5\xf5\x9aw\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x852I\b\x97\xbb\xb4\u038b\u007fk\x83~L\xba\x84\x8f\xbe\x99v\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x85>j\xba\xf4Di\xc7/\x15\x1dN\"8\x19\xac\xedN7(\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x85F\x91\xceqO2\\\xedU\xceY(\u039b\xa1/\xac\u0478\x89\xedp\xb5\xe9\xc3\xf2\xf0\x00\x00\u07d4\x85L\fF\x9c$k\x83\xb5\u0473\xec\xa4C\xb3\x9a\xf5\xee\x12\x8a\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x85]\x9a\xef,9\xc6#\r\t\u025e\xf6II\x89\xab\u61c5\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4\x85c\u0113a\xb6%\xe7hw\x1c\x96\x15\x1d\xbf\xbd\x1c\x90iv\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x85fa\t\x01\xaa\xce8\xb82D\xf3\xa9\xc810jg\xb9\u0709\xb0\x82\x13\xbc\xf8\xff\xe0\x00\x00\xe0\x94\x85j\xa2<\x82\xd7![\xec\x8dW\xf6\n\xd7^\xf1O\xa3_D\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x85nZ\xb3\xf6L\x9a\xb5k\x00\x93\x93\xb0\x16d\xfc\x03$\x05\x0e\x89a\t=|,m8\x00\x00\u07d4\x85n\xb2\x04$\x1a\x87\x83\x0f\xb2)\x03\x13C\xdc0\x85OX\x1a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x85s,\x06\\\xbdd\x11\x99A\xae\xd40\xacYg\vlQ\u0109'\xa5sb\xab\n\x0e\x80\x00\xe0\x94\x85x\xe1\x02\x12\xca\x14\xff\a2\xa8$\x1e7F}\xb8V2\xa9\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x85y\xda\xdf\x1a9Z4q\xe2\vov=\x9a\x0f\xf1\x9a?o\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x85\u007f\x10\v\x1aY0\"^\xfc~\x90 \u05c3'\xb4\x1c\x02\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x85\x94mV\xa4\xd3q\xa93hS\x96\x90\xb6\x0e\xc8%\x10tT\x89]\u0212\xaa\x111\xc8\x00\x00\xe0\x94\x85\x99\xcb\u0566\xa9\xdc\u0539f\xbe8}iw]\xa5\xe3C'\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x86$_Yf\x91\t>\xce?=<\xa2&>\xac\xe8\x19A\u0649\n1\x06+\xee\xedp\x00\x00\u07d4\x86%i!\x1e\x8cc'\xb5A^:g\xe5s\x8b\x15\xba\xafn\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x86)}s\x0f\xe0\xf7\xa9\xee$\xe0\x8f\xb1\b{1\xad\xb3\x06\xa7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x86D\xcc(\x1b\xe32\xcc\xce\xd3m\xa4\x83\xfb*\aF\u067a.\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x86I\x9a\x12(\xff-~\xe3\au\x93dPo\x8e\x8c\x83\a\xa5\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x86K\xecPi\xf8U\xa4\xfdX\x92\xa6\xc4I\x1d\xb0|\x88\xff|\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x86W\n\xb2Y\u0271\xc3,\x97) /w\xf5\x90\xc0}\xd6\x12\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86c\xa2A\xa0\xa8\x9ep\xe1\x82\xc8E\xe2\x10\\\x8a\xd7&K\u03ca\x03#\xb1=\x83\x98\xf3#\x80\x00\u07d4\x86g\xfa\x11U\xfe\xd72\u03f8\u0725\xa0\xd7e\xce\r\a\x05\xed\x89\x04n\xc9e\u00d3\xb1\x00\x00\u07d4\x86h\xaf\x86\x8a\x1e\x98\x88_\x93\u007f&\x15\xde\xd6u\x18\x04\xeb-\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x86t\nFd\x8e\x84Z]\x96F\x1b\x18\t\x1f\xf5{\xe8\xa1o\x8a\x14\xc0\x974\x85\xbf9@\x00\x00\xe0\x94\x86~\xbaVt\x8aY\x045\r,\xa2\xa5\u039c\xa0\vg\n\x9b\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x86\x80dt\xc3X\x04}\x94\x06\xe6\xa0\u007f@\x94[\xc82\x8eg\x8a\x01u.\xb0\xf7\x01=\x10\x00\x00\u07d4\x86\x88=T\xcd9\x15\xe5I\tU0\xf9\xab\x18\x05\xe8\xc5C-\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x86\x8c#\xbe\x874f\xd4\xc7L\"\n\x19\xb2E\xd1x~\x80\u007f\x89J\x13\xbb\xbd\x92\u020e\x80\x00\xe0\x94\x86\x92O\xb2\x11\xaa\xd2<\xf5\xce`\x0e\n\xae\x80c\x96D@\x87\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x86\x93\u9e3e\x94B^\xefyi\xbci\xf9\xd4/|\xadg\x1e\x8967\tlK\xcci\x00\x00\xe0\x94\x86\x9f\x1a\xa3\x0eDU\xbe\xb1\x82 \x91\xde\\\xad\xecy\xa8\xf9F\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x86\xa1\xea\xde\xeb0F\x13E\xd9\xefk\xd0R\x16\xfa$|\r\f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x86\xa5\xf8%\x9e\u0570\x9e\x18\x8c\xe3F\xee\x92\xd3J\xa5\u0753\xfa\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86\xb7\xbdV<\uad86\xf9bD\xf9\xdd\xc0*\u05f0\xb1K\u008a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x86\u008bVx\xaf7\xd7'\xec\x05\xe4Dw\x90\xf1_q\xf2\xea\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86\xc4\xce\x06\u066c\x18[\xb1H\xd9o{z\xbes\xf4A\x00m\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x86\xc8\xd0\u0642\xb59\xf4\x8f\x980\xf9\x89\x1f\x9d`z\x94&Y\x8a\x02\xce\xd3wa\x82O\xb0\x00\x00\u07d4\x86\xc94\xe3\x8eS\xbe;3\xf2t\xd0S\x9c\xfc\xa1Y\xa4\xd0\u04494\x95tD\xb8@\xe8\x00\x00\xe0\x94\x86\xca\x01E\x95~k\r\xfe6\x87_\xbez\r\xecU\xe1z(\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x86\u02af\xac\xf3*\xa01|\x03*\xc3k\xab\xed\x97G\x91\xdc\x03\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x86\u0377\xe5\x1a\xc4Gr\xbe6\x90\xf6\x1d\x0eYvn\x8b\xfc\x18\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x86\xdfs\xbd7\u007f,\t\xdec\xc4]g\xf2\x83\xea\xef\xa0\xf4\xab\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x86\xe3\xfe\x86\xe9=\xa4\x86\xb1Bf\xea\xdf\x05l\xbf\xa4\xd9\x14C\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x86\xe8g\x0e'Y\x8e\xa0\x9c8\x99\xabw\x11\u04f9\xfe\x90\x1c\x17\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86\xefd&!\x19I\xcc7\xf4\xc7^xP6\x9d\f\xf5\xf4y\x8a\x02\xd6_2\xea\x04Z\xf6\x00\x00\u07d4\x86\xf0]\x19\x06>\x93i\xc6\x00N\xb3\xf1#\x94:|\xffN\xab\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x86\xf2>\x9c\n\xaf\u01cb\x9c@M\xcd`3\x9a\x92[\xff\xa2f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x86\xf4\xf4\n\u0644\xfb\xb8\t3\xaebn\x0eB\xf93?\xddA\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x86\xf9\\[\x11\xa2\x93\x94\x0e5\xc0\xb8\x98\u0637_\b\xaa\xb0m\x8a\x06D\xe3\xe8u\xfc\xcft\x00\x00\u07d4\x86\xff\xf2 \xe5\x93\x05\xc0\x9fH8`\xd6\xf9N\x96\xfb\xe3/W\x89\x02S[j\xb4\xc0B\x00\x00\u07d4\x87\a\x96\xab\xc0\u06c4\xaf\x82\xdaR\xa0\xedhsM\xe7\xe66\xf5\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x87\x0f\x15\xe5\u07cb\x0e\xab\xd0%iSz\x8e\xf9;Vx\\B\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4\x87\x181`\xd1r\xd2\xe0\x84\xd3'\xb8k\xcb|\x1d\x8eg\x84\xef\x89\xd8\xd8X?\xa2\xd5/\x00\x00\xe0\x94\x87\x1b\x8a\x8bQ\u07a1\x98\x9aY!\xf1>\xc1\xa9U\xa5\x15\xadG\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x87%\xe8\xc7S\xb3\xac\xbf\u0725_I\x13\\3\x91\x99\x10`)\n\xa7\xf6\u0338\xf8Zx\u06c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x87Pa\xee\x12\xe8 \x04\x1a\x01\x94,\xb0\xe6[\xb4'\xb0\x00`\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\x87XJ?a;\xd4\xfa\xc7L\x1ex\v\x86\xd6\xca\xeb\x89\f\xb2\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x87d\xd0'\"\x00\t\x96\xec\xd4u\xb43)\x8e\x9fT\v\x05\xbf\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x87l?!\x8bGv\xdf<\xa9\xdb\xfb'\r\xe1R\xd9N\xd2R\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x87u\xa6\x10\xc5\x02\xb9\xf1\xe6\xadL\xda\u06cc\xe2\x9b\xffu\xf6\xe4\x89 \x86\xac5\x10R`\x00\x00\u07d4\x87vN6w\xee\xf6\x04\xcb\u015a\xed$\xab\xdcVk\t\xfc%\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\x87\x87\xd1&w\xa5\xec)\x1eW\xe3\x1f\xfb\xfa\xd1\x05\xc32K\x87\x8a\x02\xa2N\xb52\b\xf3\x12\x80\x00\u07d4\x87\x94\xbfG\xd5E@\xec\xe5\xc7\"7\xa1\xff\xb5\x11\u0777Gb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x87\xa5>\xa3\x9fY\xa3[\xad\xa85%!dU\x94\xa1\xa7\x14\u02c9g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x87\xa7\xc5\b\xefqX-\u0665Cr\xf8\x9c\xb0\x1f%/\xb1\x80\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x87\xaf%\xd3\xf6\xf8\xee\xa1S\x13\xd5\xfeEW\xe8\x10\xc5$\xc0\x83\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\x87\xb1\x0f\x9c(\x00\x98\x17\x9a+v\xe9\u0390\xbea\xfc\x84M\r\x89Hz\x9a0E9D\x00\x00\u07d4\x87\xbf|\xd5\u0629)\xe1\u01c5\xf9\xe5D\x91\x06\xac#$c\u0249\x047\xb1\x1f\xccEd\x00\x00\u07d4\x87\u0118\x17\t4\xb8#=\x1a\xd1\xe7i1}\\G_/@\x897\b\xba\xed=h\x90\x00\x00\u07d4\x87\xcf6\xad\x03\xc9\xea\xe9\x05:\xbbRB\u0791\x17\xbb\x0f*\v\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x87\u05ec\x06S\xcc\xc6z\xa9\xc3F\x9e\xefCR\x19?}\xbb\x86\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\xe0\x94\x87\xe3\x06+#!\xe9\u07f0\x87\\\u311c\x9b.5\"\xd5\n\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x87\xe6\x03N\xcf#\xf8\xb5c\x9d_\x0e\xa7\n\"S\x8a\x92\x04#\x89\x11\xc7\xea\x16.x \x00\x00\u07d4\x87\xefm\x8bj|\xbf\x9b\\\x8c\x97\xf6~\xe2\xad\u00a7;?w\x89\n\xdd\x1b\xd2<\x00L\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x88F\x92\x8dh2\x89\xa2\xd1\x1d\xf8\xdbz\x94t\x98\x8e\xf0\x13H\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x88I\x80\xebEe\xc1\x04\x83\x17\xa8\xf4\u007f\u06f4a\x96[\u4049\xd8\xd6\x11\x9a\x81F\x05\x00\x00\xe0\x94\x88Jz9\u0411n\x05\xf1\xc2B\xdfU`\u007f7\u07cc_\u068a\x04\xf4\x84<\x15|\x8c\xa0\x00\x00\u07d4\x88T\x93\xbd\xa3j\x042\x97eF\xc1\xdd\xceq\xc3\xf4W\x00!\x89\v\xbfQ\r\xdf\xcb&\x00\x00\xe0\x94\x88`\x9e\nF[n\x99\xfc\xe9\a\x16mW\xe9\xda\b\x14\xf5\u020a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x88m\n\x9e\x17\xc9\xc0\x95\xaf.\xa25\x8b\x89\xecpR\x12\ue509\x01\x84\x93\xfb\xa6N\xf0\x00\x00\u07d4\x88y~Xg^\xd5\xccL\x19\x98\a\x83\xdb\xd0\xc9V\bQS\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x88|\xacA\xcdpo3E\xf2\xd3J\xc3N\x01u*nY\t\x89 F\\\ue7617\x00\x00\u07d4\x88\x88\x8aW\xbd\x96\x87\xcb\xf9P\xae\xea\u03d7@\xdc\xc4\xd1\xefY\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u0794\x88\x89D\x83\x16\xcc\xf1N\xd8m\xf8\xe2\xf4x\xdcc\xc43\x83@\x88\xd2\xf1?w\x89\xf0\x00\x00\u07d4\x88\x8c\x16\x14I3\x19|\xac&PM\xd7n\x06\xfdf\x00\u01c9\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x88\x8e\x94\x91p\x83\xd1R +S\x1699\x86\x9d'\x11u\xb4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x88\x90\x87\xf6o\xf2\x84\xf8\xb5\xef\xbd)I;pg3\xab\x14G\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\x88\x95\xebrb&\xed\xc3\xf7\x8c\u01a5\x15\a{2\x96\xfd\xb9^\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x88\x97Z_\x1e\xf2R\x8c0\v\x83\xc0\xc6\a\xb8\xe8}\u0593\x15\x89\x04\x86\u02d7\x99\x19\x1e\x00\x00\u07d4\x88\x9d\xa4\x0f\xb1\xb6\x0f\x9e\xa9\xbdzE>XL\xf7\xb1\xb4\xd9\xf7\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x88\x9d\xa6b\xebJ\n*\x06\x9d+\xc2K\x05\xb4\xee.\x92\xc4\x1b\x89Z,\x8cTV\xc9\xf2\x80\x00\u07d4\x88\xa1\"\xa28,R91\xfbQ\xa0\u032d;\xeb[rY\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x88\xa2\x15D0\xc0\xe4\x11G\xd3\xc1\xfe\u3cf0\x06\xf8Q\xed\xbd\x8965f3\xeb\xd8\xea\x00\x00\u07d4\x88\xb2\x17\u0337\x86\xa2T\xcfM\xc5\u007f]\x9a\xc3\xc4U\xa3\x04\x83\x892$\xf4'#\xd4T\x00\x00\xe0\x94\x88\xbcC\x01.\xdb\x0e\xa9\xf0b\xacCxC%\n9\xb7\x8f\xbb\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x88\xc2Qj|\xdb\t\xa6'mr\x97\xd3\x0fZM\xb1\xe8K\x86\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x88\xc3ad\rki7;\b\x1c\xe0\xc43\xbdY\x02\x87\xd5\xec\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\x88\xd5A\xc8@\xceC\xce\xfb\xafm\x19\xafk\x98Y\xb5s\xc1E\x89\t79SM(h\x00\x00\u07d4\x88\xde\x13\xb0\x991\x87|\x91\rY1e\xc3d\u0221d\x1b\u04c9\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x88\xde\u017d?N\xba-\x18\xb8\xaa\xce\xfa{r\x15H\xc3\x19\xba\x89JD\x91\xbdm\xcd(\x00\x00\u07d4\x88\xe6\xf9\xb2G\xf9\x88\xf6\xc0\xfc\x14\xc5o\x1d\xe5>\u019dC\u0309\x05k\xc7^-c\x10\x00\x00\u07d4\x88\xee\u007f\x0e\xfc\x8fw\x8ckh~\xc3+\xe9\xe7\xd6\xf0 \xb6t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x88\xf1\x04_\x19\xf2\xd3\x19\x18\x16\xb1\xdf\x18\xbbn\x145\xad\x1b8\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x89\x00\x9e\a\xe3\xfahc\xa7x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x89Wr~r\xcfb\x90 \xf4\xe0^\xdfy\x9a\xa7E\x80b\u0409wC\"\x17\xe6\x83`\x00\x00\u07d4\x89]iN\x88\v\x13\xcc\u0404\x8a\x86\xc5\xceA\x1f\x88Gk\xbf\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\x89^\xc5TVD\u0dc30\xff\xfa\xb8\xdd\xea\xc9\xe83\x15l\x89 \x86\xac5\x10R`\x00\x00\u07d4\x89`\tRj,{\f\t\xa6\xf6:\x80\xbd\U0009d707\u079c\x89\xbb\xb8k\x82#\xed\xeb\x00\x00\u07d4\x89g\u05f9\xbd\xb7\xb4\xae\xd2.e\xa1]\xc8\x03\xcbz!?\x10\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x89n3\\\xa4z\xf5yb\xfa\x0fM\xbf>E\xe6\x88\u02e5\x84\x89J/\xc0\xab`R\x12\x00\x00\u07d4\x89s\xae\xfd^\xfa\xee\x96\t]\x9e(\x8fj\x04l\x977KC\x89\a\xa4\u0120\xf32\x14\x00\x00\u07d4\x89\x8cr\xddseX\xef\x9eK\xe9\xfd\xc3O\xefT\xd7\xfc~\b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x89\x9b<$\x9f\fK\x81\xdfu\xd2\x12\x00M=m\x95/\xd2#\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x89\xab\x13\xee&mw\x9c5\xe8\xbb\x04\u034a\x90\xcc!\x03\xa9[\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4\x89\xc43\xd6\x01\xfa\xd7\x14\xdaci0\x8f\xd2l\x1d\u0254+\xbf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x89\xd7[\x8e\b1\xe4o\x80\xbc\x17A\x88\x18N\x00o\xde\x0e\xae\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x89\u3d5a\x15\x86G7\u0513\xc1\xd2<\xc5=\xbf\x8d\xcb\x13b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x89\xfc\x8eM8k\r\v\xb4\xa7\a\xed\xf3\xbdV\r\xf1\xad\x8fN\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\x89\xfe\xe3\r\x17(\xd9l\xec\xc1\u06b3\xda.w\x1a\xfb\u03eaA\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\x8a\x1c\u016c\x11\x1cI\xbf\xcf\xd8H\xf3}\xd7h\xaae\u0208\x02\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x8a \xe5\xb5\xce\xe7\xcd\x1fU\x15\xba\xce;\xf4\xf7\u007f\xfd\xe5\xcc\a\x89\x04V9\x18$O@\x00\x00\xe0\x94\x8a!}\xb3\x8b\xc3_!_\xd9)\x06\xbeBCo\xe7\xe6\xed\x19\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x8a$:\n\x9f\xeaI\xb89TwE\xff-\x11\xaf?K\x05\"\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x8a$}\x18e\x10\x80\x9fq\xcf\xfcEYG\x1c9\x10\x85\x81!\x89a\t=|,m8\x00\x00\u07d4\x8a4p(-^**\xef\u05e7P\x94\xc8\"\xc4\xf5\xae\uf289\r(\xbc`dx\xa5\x80\x00\u07d4\x8a6\x86\x9a\xd4x\x99|\xbfm\x89$\xd2\n<\x80\x18\xe9\x85[\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8aC\x14\xfba\u0353\x8f\xc3>\x15\xe8\x16\xb1\x13\U000ac267\xfb\x89\x17vNz\xede\x10\x00\x00\u07d4\x8aOJ\u007fR\xa3U\xba\x10_\xca r\xd3\x06_\xc8\xf7\x94K\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8aX1(,\xe1Jezs\r\xc1\x88&\xf7\xf9\xb9\x9d\xb9h\x89\uaf8a[A\xc16\x00\x00\u07d4\x8a_\xb7W\x93\xd0C\xf1\xbc\xd48\x85\xe07\xbd0\xa5(\xc9'\x89\x13Snm.\x9a\xc2\x00\x00\u07d4\x8af\xab\xbc-0\xce!\xa83\xb0\u06ceV\x1dQ\x05\xe0\xa7,\x89%\xf1\xde\\v\xac\xdf\x00\x00\u07d4\x8atl]g\x06G\x11\xbf\xcah[\x95\xa4\xfe)\x1a'\x02\x8e\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x8ax\n\xb8z\x91E\xfe\x10\xed`\xfaGjt\n\xf4\u02b1\u0489\x12\x1b.^ddx\x00\x00\u07d4\x8az\x06\xbe\x19\x9a:X\x01\x9d\x84j\xc9\xcb\xd4\xd9]\xd7W\u0789\xa2\xa4#\x94BV\xf4\x00\x00\u07d4\x8a\x81\x01\x14\xb2\x02]\xb9\xfb\xb5\x00\x99\xa6\xe0\u02de.\xfak\u0709g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x8a\x86\xe4\xa5\x1c\x01;\x1f\xb4\xc7k\xcf0f|x\xd5.\xed\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8a\x9e\u029cZ\xba\x8e\x13\x9f\x80\x03\xed\xf1\x16:\xfbp\xaa:\xa9\x89#\xc7W\a+\x8d\xd0\x00\x00\u07d4\x8a\xb89\xae\xaf*\xd3|\xb7\x8b\xac\xbb\xb63\xbc\xc5\xc0\x99\xdcF\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8a\u021b\u06780\x1ek\x06w\xfa%\xfc\xf0\xf5\x8f\f\u01f6\x11\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x8a\xdcS\xef\x8c\x18\xed0Qx]\x88\xe9\x96\xf3\xe4\xb2\x0e\xcdQ\x8a\b\xe4\xd3\x16\x82v\x86@\x00\x00\u07d4\x8a\xe6\xf8\vp\xe1\xf2<\x91\xfb\u0569f\xb0\xe4\x99\xd9]\xf82\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\x8a\xe9\uf30a\x8a\u07e6\xaby\x8a\xb2\xcd\xc4\x05\b*\x1b\xbbp\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8a\xf6&\xa5\xf3'\xd7Pe\x89\xee\xb7\x01\x0f\xf9\xc9D` \u0489K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\x8b\x01\xda4\xd4p\xc1\xd1\x15\xac\xf4\xd8\x11\xe1\x01\xdb\x1e\x14\xec\xc7\xd3\"\xc7+\x8c\x04s\x89\x18\xb2j1>\x8a\xe9\x00\x00\xe0\x94\x8bH\xe1\x9d9\xdd5\xb6nn\x1b\xb6\xb9\xc6W\xcb,\xf5\x9d\x04\x8a\x03\xc7U\xac\x9c\x02J\x01\x80\x00\xe0\x94\x8bP^(q\xf7\u07b7\xa68\x95 \x8e\x82'\u072a\x1b\xff\x05\x8a\f\xf6\x8e\xfc0\x8dy\xbc\x00\x00\u07d4\x8bW\xb2\xbc\x83\u030dM\xe31 N\x89?/;\x1d\xb1\a\x9a\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x8b\\\x91K\x12\x8b\xf1i\\\b\x89#\xfaF~y\x11\xf3Q\xfa\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\xe0\x94\x8b_)\xcc/\xaa&,\xde\xf3\x0e\xf5T\xf5\x0e\xb4\x88\x14n\xac\x8a\x01;hp\\\x97 \x81\x00\x00\u07d4\x8bpV\xf6\xab\xf3\xb1\x18\xd0&\xe9D\xd5\xc0sC<\xa4Q\u05c965\xc6 G9\u0640\x00\u07d4\x8bqE\"\xfa(9b\x04p\xed\xcf\fD\x01\xb7\x13f=\xf1\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x8bt\xa7\xcb\x1b\xb8\u014f\xce&tf\xa3\x03X\xad\xafR\u007fa\x8a\x02\xe2WxN%\xb4P\x00\x00\u07d4\x8b~\x9fo\x05\xf7\xe3dv\xa1n>q\x00\xc9\x03\x1c\xf4\x04\xaf\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8b\x81\x15ni\x869\x94<\x01\xa7Rr\xad=5\x85\x1a\xb2\x82\x89\x12\xb3\x16_e\xd3\xe5\x00\x00\u07d4\x8b\x95w\x92\x00S\xb1\xa0\x01\x890M\x88\x80\x10\xd9\xef,\xb4\xbf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8b\x98A\x86.w\xfb\xbe\x91\x94p\x93U\x83\xa9<\xf0'\xe4P\x89llS4B\u007f\x1f\x00\x00\u07d4\x8b\x99}\xbc\a\x8a\xd0)a5]\xa0\xa1Y\xf2\x92~\xd4=d\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\x8b\x9f\xda}\x98\x1f\xe9\xd6B\x87\xf8\\\x94\xd8?\x90t\x84\x9f\u030a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x8b\xb0!/2\x95\xe0)\u02b1\xd9a\xb0A3\xa1\x80\x9e{\x91\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8b\xbe\xac\xfc)\xcf\xe94\x02\xdb\xd6j\x1a\xcbvv\x85c7\xb9;\xf0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8b\xf3s\xd0v\x81L\xbcW\xe1\xc6\xd1j\x82\u017e\x13\xc7=7\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x8c\x10#\xfd\xe1WM\xb8\xbbT\xf1s\x96p\x15|\xa4}\xa6R\x8a\x01y\u03da\u00e1\xb1w\x00\x00\u07d4\x8c\x1f\xbe_\n\xea5\x9cZ\xa1\xfa\b\u0209T\x12\u028e\x05\xa6\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8c\"B`U\xb7o\x11\xf0\xa2\xde\x1a\u007f\x81\x9aa\x96\x85\xfe`\x89kV\x05\x15\x82\xa9p\x00\x00\u07d4\x8c+}\x8b`\x8d(\xb7\u007f\\\xaa\x9c\xd6E$*\x82>L\u0649b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\x8c/\xbe\ue3ac\xc5\xc5\xd7|\x16\xab\xd4b\ue701E\xf3K\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x8c:\x9e\xe7\x1fr\x9f#l\xba8g\xb4\u05dd\x8c\xee\xe2]\xbc\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x8cP\xaa*\x92\x12\xbc\xdeVA\x8a\xe2a\xf0\xb3^z\x9d\xbb\x82\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x8cT\xc7\xf8\xb9\x89nu\xd7\xd5\xf5\xc7`%\x86\x99\x95qB\xad\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x8c]\x16\xede\xe3\xed~\x8b\x96\u0297+\xc8as\xe3P\v\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8cj\xa8\x82\xee2,\xa8HW\x8c\x06\xcb\x0f\xa9\x11\xd3`\x83\x05\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\x8cj\xe7\xa0Z\x1d\xe5u\x82\xae'h Bv\xc0\xffG\xed\x03\x8a,\v\xb3\xdd0\xc4\xe2\x00\x00\x00\u07d4\x8co\x9fN[z\xe2v\xbfXI{\u05ff*}%$_d\x89\x93\xfe\\W\xd7\x10h\x00\x00\u07d4\x8cu\x95n\x8f\xedP\xf5\xa7\xdd|\xfd'\xda \x0fgF\xae\xa6\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8c|\xb4\xe4\x8b%\x03\x1a\xa1\xc4\xf9)%\xd61\xa8\xc3\xed\xc7a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8c\u007f\xa5\xca\xe8/\xed\xb6\x9a\xb1\x89\xd3\xff'\xae \x92\x93\xfb\x93\x89\x15\xaf\x88\r\x8c\u06c3\x00\x00\xe0\x94\x8c\x81A\x0e\xa85L\xc5\xc6\\A\xbe\x8b\xd5\xdes<\v\x11\x1d\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\x8c\x83\xd4$\xa3\xcf$\xd5\x1f\x01\x92=\xd5J\x18\u05b6\xfe\xde{\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8c\x90\n\x826\xb0\x8c+e@]9\xd7_ \x06*ua\xfd\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4\x8c\x93\xc3\xc6\u06dd7q}\xe1e\u00e1\xb4\xfeQ\x95,\b\u0789\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x8c\x99\x95\x91\xfdr\xefq\x11\xef\xcaz\x9e\x97\xa25k;\x00\n\x89\xddd\xe2\xaa\ngP\x00\x00\u07d4\x8c\xa6\x98\x97F\xb0n2\xe2Hta\xb1\u0399j':\xcf\u05c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8c\xb3\xaa?\xcd!(T\xd7W\x8f\xcc0\xfd\xed\xe6t*1*\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x8c\xc0\xd7\xc0\x16\xfaz\xa9P\x11J\xa1\xdb\tH\x82\xed\xa2t\xea\x89\b\xa9\xab\xa5W\xe3l\x00\x00\u07d4\x8c\xc6R\xdd\x13\xe7\xfe\x14\u06bb\xb3m]2\r\xb9\xff\xee\x8aT\x89a\t=|,m8\x00\x00\u07d4\x8c\u02bf%\a\u007f:\xa4\x15E4MS\xbe\x1b+\x9c3\x90\x00\x89[\xe8f\xc5b\xc5D\x00\x00\u07d4\x8c\xcf:\xa2\x1a\xb7BWj\xd8\xc4\"\xf7\x1b\xb1\x88Y\x1d\ua28965\u026d\xc5\u07a0\x00\x00\u07d4\x8c\xd0\xcd\"\xe6 \xed\xa7\x9c\x04a\xe8\x96\xc9\xd1b)\x12K_z\xfb\xec\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x8c\xe2/\x9f\xa3rD\x9aB\x06\x10\xb4z\xe0\xc8\xd5eH\x122\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x8c\u451d\x8a\x16T-B<\x17\x98Ng9\xfar\u03b1w\x8a\x05K@Y&\xf4\xa6=\x80\x00\u07d4\x8c\xe5\xe3\xb5\xf5\x91\xd5\uc8ca\xbf\"\x8f.<5\x13K\xda\xc0\x89}\xc3[\x84\x89|8\x00\x00\xe0\x94\x8c\xee8\xd6YW\x88\xa5n?\xb9F4\xb3\xff\xe1\xfb\xdb&\u058a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x8c\xee\xa1^\xec;\xda\xd8\x02?\x98\xec\xf2[+\x8f\xef'\xdb)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8c\xf3To\xd1\u0363=X\x84_\xc8\xfc\xfe\u02bc\xa7\xc5d*\x89\x1f\x1e9\x93,\xb3'\x80\x00\u07d4\x8c\xf6\xda\x02\x04\xdb\u0106\vF\xad\x97?\xc1\x11\x00\x8d\x9e\fF\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x8c\xfe\xde\xf1\x98\xdb\n\x91C\xf0\x91)\xb3\xfdd\u073b\x9bIV\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8d\x04\xa5\xeb\xfb]\xb4\t\xdb\x06\x17\xc9\xfaV1\xc1\x92\x86\x1fJ\x894\x95tD\xb8@\xe8\x00\x00\u07d4\x8d\x06\xe4d$\\\xadaI9\xe0\xaf\bE\xe6\xd70\xe2\x03t\x89\n\u070a(\xf3\xd8}\x80\x00\u07d4\x8d\a\xd4-\x83\x1c-|\x83\x8a\xa1\x87+:\xd5\xd2w\x17h#\x89\x12\xee\x1f\x9d\xdb\xeeh\x00\x00\u07d4\x8d\v\x9e\xa5?\xd2cA^\xac\x119\x1f|\xe9\x12V\xb9\xfb\x06`\xf6\xf0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8dy\\_JV\x89\xadb\u0696\x16q\xf0(\x06R\x86\xd5T\x89o\x05\xb5\x9d; \x00\x00\x00\u07d4\x8d\u007f>a)\x9c-\xb9\xb9\xc0H|\xf6'Q\x9e\xd0\n\x91#\x89^t\xa8P^\x80\xa0\x00\x00\xe0\x94\x8d\x89\x17\v\x92\xb2\xbe,\b\xd5|H\xa7\xb1\x90\xa2\xf1Fr\x0f\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\x8d\x93\xda\u01c5\xf8\x8f\x1a\x84\xbf\x92}Se+E\xa1T\xcc\u0749\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x8d\x99R\u043bN\xbf\xa0\xef\xd0\x1a:\xa9\xe8\xe8\u007f\x05%t.\x89\xbb\x91%T\"c\x90\x00\x00\u07d4\x8d\x9a\fp\xd2& B\xdf\x10\x17\xd6\xc3\x03\x13 $w'\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8d\x9e\xd7\xf4U0X\xc2ox6\xa3\x80-0d\xeb\x1b6=\x89\x04\xe1\x00;(\xd9(\x00\x00\u07d4\x8d\xa1\x17\x8fU\xd9wr\xbb\x1d$\x11\x1a@JO\x87\x15\xb9]\x89/\x9a\xc3\xf6\xde\x00\x80\x80\x00\u07d4\x8d\xa1\xd3Y\xbal\xb4\xbc\xc5}zCw \xd5]\xb2\xf0\x1cr\x89\x04V9\x18$O@\x00\x00\u07d4\x8d\xab\x94\x8a\xe8\x1d\xa3\x01\xd9r\xe3\xf6\x17\xa9\x12\xe5\xa7Sq.\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x8d\xad\xdfR\xef\xbdt\u0695\xb9i\xa5GoO\xbb\xb5c\xbf\u0489-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4\x8d\xb1\x85\xfe\x1bp\xa9Jj\b\x0e~#\xa8\xbe\xdcJ\xcb\xf3K\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x8d\xb5\x8e@n -\xf9\xbcpl\xb43\xe1\x94\xf4\x0f\x82\xb4\x0f\xaa\xdb\x1f\x8b\x85a\x16\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x8d\xc1\xd5\x11\x1d\t\xaf%\xfd\xfc\xacE\\|\xec(>mgu\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8d\u0504\xff\x8a0sd\xebf\xc5%\xa5q\xaa\xc7\x01\xc5\xc3\x18\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8d\u05a9\xba\xe5\u007fQ\x85I\xad\xa6wFo\ua2b0O\u0674\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8d\xde<\xb8\x11\x85h\xefE\x03\xfe\x99\x8c\xcd\xf56\xbf\x19\xa0\x98\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8d\xde`\xeb\b\xa0\x99\xd7\u06a3V\u06aa\xb2G\r{\x02Zk\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\x8d\xf39!Kj\u0472Fc\xceq`4t\x9dn\xf88\u064a\x02TO\xaaw\x80\x90\xe0\x00\x00\xe0\x94\x8d\xf5=\x96\x19\x14q\xe0Y\xdeQ\xc7\x18\xb9\x83\xe4\xa5\x1d*\xfd\x8a\x06\u01b95\xb8\xbb\xd4\x00\x00\x00\u07d4\x8d\xfb\xaf\xbc\x0e[\\\x86\xcd\x1a\u0597\xfe\xea\x04\xf41\x88\u0796\x89\x15%+\u007f_\xa0\xde\x00\x00\u07d4\x8e\a;\xad%\xe4\"\x18a_J\x0ek.\xa8\xf8\xde\"0\xc0\x89\x82=b\x9d\x02k\xfa\x00\x00\u07d4\x8e\x0f\xee8hZ\x94\xaa\xbc\xd7\u0385{k\x14\t\x82Ou\xb8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8e#\xfa\xcd\x12\xc7e\xc3j\xb8\x1am\xd3M\x8a\xa9\xe6\x89\x18\xae\x89\t\x11\u418d\xba\x9b\x00\x00\xe0\x94\x8e/\x904\xc9%G\x19\u00ceP\u026ad0^\u0596\xdf\x1e\x8a\x01\x00N.E\xfb~\xe0\x00\x00\u07d4\x8e2@\xb0\x81\x0e\x1c\xf4\a\xa5\x00\x80G@\u03cdad2\xa4\x89\x02/fU\xef\v8\x80\x00\u07d4\x8eHj\x04B\xd1q\xc8`[\xe3H\xfe\xe5~\xb5\b^\xff\r\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8eaV3k\xe2\u037e2\x14\r\xf0\x8a+\xa5_\u0425\x84c\x89\x04\t\x9e\x1dcW\x18\x00\x00\u07d4\x8eg\b\x15\xfbg\xae\xae\xa5{\x86SN\xdc\x00\xcd\xf5d\xfe\u5272\xe4\xb3#\xd9\xc5\x10\x00\x00\u07d4\x8emt\x85\xcb\u942c\xc1\xad\x0e\xe9\xe8\xcc\xf3\x9c\f\x93D\x0e\x893\xc5I\x901r\f\x00\x00\xe0\x94\x8et\xe0\u0477~\xbc\x82:\xca\x03\xf1\x19\x85L\xb1 '\xf6\u05ca\x16\xb3R\xda^\x0e\xd3\x00\x00\x00\u07d4\x8ex\xf3QE}\x01oJ\xd2u^\xc7BN\\!\xbamQ\x89\a\xea(2uw\b\x00\x00\u07d4\x8ey6\u0552\x00\x8f\xdcz\xa0N\xde\xebuZ\xb5\x13\u06f8\x9d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8e\u007f\xd28H\xf4\xdb\a\x90j}\x10\xc0K!\x80;\xb0\x82'\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8e\x92\xab\xa3\x8er\xa0\x98\x17\v\x92\x95\x92FSz.UV\xc0\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x8e\x98ve$\xb0\xcf'G\xc5\r\xd4;\x95gYM\x971\u0789lD\xb7\xc2a\x82(\x00\x00\u07d4\x8e\x9b5\xadJ\n\x86\xf7XDo\xff\xde4&\x9d\x94\f\xea\u0349\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8e\x9c\b\xf78f\x1f\x96v#n\xff\x82\xbaba\xdd?H\"\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x8e\x9cB\x92f\xdf\x05~\xfax\xdd\x1d_w\xfc@t*\xd4f\x89\x10D.\u0475l|\x80\x00\u07d4\x8e\xa6V\xe7\x1e\xc6Q\xbf\xa1|ZWY\xd8`1\xcc5\x99w\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x8e\xae)CU\x98\xba\x8f\x1c\x93B\x8c\xdb>+M1\a\x8e\x00\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8e\xb1\xfb\xe4\xe5\xd3\x01\x9c\xd7\xd3\r\xae\x9c\r[Lv\xfbc1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8e\xb5\x17t\xaf k\x96k\x89\t\xc4Z\xa6r'H\x80,\f\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8e\xb8\xc7\x19\x82\xa0\x0f\xb8Bu)2S\xf8\x04ED\xb6kI\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\x8e\xcb\u03ec\xbf\xaf\xe9\xf0\f9\"\xa2N,\xf0\x02gV\xca \x8a\x011\xbe\xb9%\xff\xd3 \x00\x00\u07d4\x8e\u03b2\xe1$Sl[_\xfcd\x0e\xd1O\xf1^\u0668\xcbq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8e\u042f\x11\xff(p\xda\x06\x81\x00J\xfe\x18\xb0\x13\xf7\xbd8\x82\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u0794\x8e\xd1Cp\x1f/r(\x0f\xd0J{Ad(\x19y\xea\x87\u0248\xc2I\xfd\xd3'x\x00\x00\u07d4\x8e\xd1R\x8bD~\xd4)y\x02\xf69\xc5\x14\u0414J\x88\xf8\u0209\n\xc6\xe7z\xb6c\xa8\x00\x00\u07d4\x8e\xd4(L\x0fGD\x9c\x15\xb8\u0673$]\u8fb6\u0380\xbf\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94\x8e\xde~=\xc5\aI\xc6\xc5\x0e.(\x16\x84x\xc3M\xb8\x19F\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\x8e\xe5\x843}\xdb\xc8\x0f\x9e4\x98\xdfU\xf0\xa2\x1e\xac\xb5\u007f\xb1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8e\xeb\xec\x1ab\xc0\x8b\x05\xa7\xd1\u0551\x80\xaf\x9f\xf0\u044e?6\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8e\xf4\u0622\xc2o\xf7\x14\xb6u\x89\x19\x80\x1c\x83\xb6\xc7\xc0\x00\x00\u07d4\x8fM\x1dAi>F,\xf9\x82\xfd\x81\u042ap\x1d:St\u0249\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8fM\x1e~Ea(J4\xfe\xf9g<\r4\xe1*\xf4\xaa\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8fO\xb1\xae\xa7\xcd\x0fW\x0e\xa5\xe6\x1b@\xa4\xf4Q\vbd\xe4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8fV\x1bA\xb2\t\xf2H\u0229\x9f\x85\x87\x887bP`\x9c\xf3\x89\\(=A\x03\x94\x10\x00\x00\xe0\x94\x8fX\xd84\x8f\xc1\xdcN\r\xd84;eC\xc8W\x04^\xe9@\x8a\x02\xe3\x03\x8d\xf4s\x03(\x00\x00\u07d4\x8f`\x89_\xbe\xbb\xb5\x01\u007f\xcb\xff<\u0763\x97)+\xf2[\xa6\x89\x17D\x06\xff\x9fo\u0480\x00\u07d4\x8fd\xb9\xc1$m\x85x1d1\a\xd3U\xb5\xc7_\xef]O\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\x8ff\x0f\x8b.L|\u00b4\xac\x9cG\xed(P\x8d_\x8f\x86P\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x8fi\xea\xfd\x023\xca\xdb@Y\xabw\x9cF\xed\xf2\xa0PnH\x89`\xf0f \xa8IE\x00\x00\xe0\x94\x8fq~\xc1U/LD\x00\x84\xfb\xa1\x15J\x81\xdc\x00>\xbd\xc0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x8f\x8a\xcb\x10v\a8\x84y\xf6K\xaa\xab\xea\x8f\xf0\a\xad\xa9}\x8a\x05\xc6\xf3\b\n\xd4#\xf4\x00\x00\u07d4\x8f\x8c\xd2n\x82\xe7\xc6\xde\xfd\x02\u07ed\a\x97\x90!\xcb\xf7\x15\f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x8f\x8f7\u042d\x8f3]*q\x01\xb4\x11V\xb6\x88\xa8\x1a\x9c\xbe\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4\x8f\x92\x84O(*\x92\x99\x9e\u5d28\xd7s\xd0kiM\xbd\x9f\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x8f\xact\x8fxJ\x0f\xedh\u06e43\x19\xb4*u\xb4d\x9cn\x891T\xc9r\x9d\x05x\x00\x00\u07d4\x8f\u0665\xc3:}\x9e\xdc\xe0\x99{\xdfw\xab0d$\xa1\x1e\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8f\xef\xfa\xdb8z\x15G\xfb(M\xa9\xb8\x14\u007f>|m\xc6\u0689-b{\xe4S\x05\b\x00\x00\u07d4\x8f\xf4`Ehw#\xdc3\xe4\u0419\xa0i\x04\xf1\ubd44\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4\x8f\xfa\x06!\"\xac0t\x18\x82\x1a\u06d3\x11\aZ7\x03\xbf\xa3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8f\xfe2)\x97\xb8\xe4\x04B-\x19\xc5J\xad\xb1\x8f[\xc8\u9dc9\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x90\x01\x94\u0131\aC\x05\u045d\xe4\x05\xb0\xacx(\x0e\xca\xf9g\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x90\x03\xd2p\x89\x1b\xa2\xdfd=\xa84\x15\x83\x195E\xe3\xe0\x00\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x90\x05z\xf9\xaaf0~\xc9\xf03\xb2\x97$\u04f2\xf4\x1e\xb6\xf9\x8a\x19\xd1\u05aa\xdb,R\xe8\x00\x00\u07d4\x90\x0f\v\x8e5\xb6h\xf8\x1e\xf2R\xb18U\xaaP\a\xd0\x12\xe7\x89\x17\n\x0fP@\xe5\x04\x00\x00\u07d4\x90\x18\xcc\x1fH\xd20\x8e%*\xb6\b\x9f\xb9\x9a|\x1dV\x94\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x90\x1d\x99\xb6\x99\xe5\u0191\x15\x19\xcb v\xb4\xc7c0\xc5M\"\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x90-t\xa1W\xf7\u04b9\xa37\x8b\x1fVp70\xe0:\x17\x19\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x904\x13\x87\x8a\xea;\xc1\bc\t\xa3\xfev\x8beU\x9e\x8c\xab\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x90If\xcc\"\x13\xb5\xb8\xcb[\xd6\b\x9e\xf9\xcd\xdb\xef~\xdf\u0309lk\x93[\x8b\xbd@\x00\x00\u07d4\x90L\xaaB\x9ca\x9d\x94\x0f\x8egA\x82j\r\xb6\x92\xb1\x97(\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x90R\xf2\xe4\xa3\xe3\xc1-\xd1\xc7\x1b\xf7\x8aN\xc3\x04=\u020b~\x89\x0e~\xeb\xa3A\vt\x00\x00\u0794\x90U&V\x8a\xc1#\xaf\xc0\xe8J\xa7\x15\x12O\xeb\xe8=\xc8|\x88\xf8i\x93)g~\x00\x00\u07d4\x90\x92\x91\x87\a\xc6!\xfd\xbd\x1d\x90\xfb\x80\xebx\u007f\xd2osP\x89\x85[[\xa6\\\x84\xf0\x00\x00\u07d4\x90\x9b^v:9\xdc\u01d5\"=s\xa1\u06f7\xd9L\xa7Z\u0209lk\x93[\x8b\xbd@\x00\x00\u07d4\x90\xac\xce\xd7\xe4\x8c\b\u01b94dm\xfa\n\xdf)\u0714\aO\x89\x03\vK\x15{\xbdI\x00\x00\u07d4\x90\xb1\xf3p\xf9\xc1\xeb\v\xe0\xfb\x8e+\x8a\xd9jAcq\u074a\x890\xca\x02O\x98{\x90\x00\x00\u07d4\x90\xb6/\x13\x1a_)\xb4UqQ>\xe7\xa7J\x8f\v#\"\x02\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x90\xbdb\xa0P\x84Ra\xfaJ\x9f|\xf2A\xeac\v\x05\ufe09\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x90\xc4\x1e\xba\x00\x8e \xcb\xe9'\xf3F`?\u0206\x98\x12Yi\x89\x02F\xdd\xf9yvh\x00\x00\u07d4\x90\u0480\x9a\xe1\xd1\xff\xd8\xf6>\xda\x01\xdeI\xddU-\xf3\u047c\x89\u063beI\xb0+\xb8\x00\x00\u07d4\x90\xdc\t\xf7\x17\xfc*[i\xfd`\xba\b\xeb\xf4\v\xf4\xe8$l\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\x90\xe3\x00\xacqE\x1e@\x1f\x88\u007fnw(\x85\x16G\xa8\x0e\a\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x90\xe3Z\xab\xb2\xde\xef@\x8b\xb9\xb5\xac\xefqDW\xdf\xdebr\x89\x05l\xd5_\xc6M\xfe\x00\x00\u07d4\x90\xe7\a\x0fM\x03?\xe6\x91\f\x9e\xfeZ'\x8e\x1f\xc6#M\xef\x89\x05q8\b\x19\xb3\x04\x00\x00\u07d4\x90\xe9>M\xc1q!HyR36\x14\x00+\xe4#VI\x8e\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x90\u9a68.\u06a8\x14\u0084\xd22\xb6\u9e90p\x1dIR\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4\x90\xf7t\xc9\x14}\u0790\x85=\xdcC\xf0\x8f\x16\xd4U\x17\x8b\x8c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x90\xfcS{!\x06Xf\n\x83\xba\xa9\xacJ\x84\x02\xf6WF\xa8\x89e\xea=\xb7UF`\x00\x00\u07d4\x91\x05\n\\\xff\xad\xed\xb4\xbbn\xaa\xfb\xc9\xe5\x014(\xe9l\x80\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x91\x05\x17d\xafk\x80\x8eB\x12\xc7~0\xa5W.\xaa1pp\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x91\v}Wz~9\xaa#\xac\xf6*\xd7\xf1\xef4)4\xb9h\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x91\x0e\x99eC4Lh\x15\xfb\x97\u0367\xafK\x86\x98vZ[\x89\x05\x9a\xf6\x98)\xcfd\x00\x00\u07d4\x91\x1f\xee\xa6\x1f\xe0\xedP\u0179\xe5\xa0\xd6`q9\x9d(\xbd\u0189\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\x91\x1f\xf23\xe1\xa2\x11\xc0\x17,\x92\xb4l\xf9\x97\x03\x05\x82\xc8:\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x91 \xe7\x11s\xe1\xba\x19\xba\x8f\x9fO\xdb\u072a4\xe1\u05bbx\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x91!\x17\x12q\x9f+\bM;8u\xa8Pi\xf4f61A\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x91#\x04\x11\x8b\x80G=\x9e\x9f\xe3\xeeE\x8f\xbea\x0f\xfd\xa2\xbb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x91Tky\xec\xf6\x9f\x93kZV\x15\b\xb0\xd7\xe5\f\u0159/\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x91V\u0440)5\x0eG\x04\b\xf1_\x1a\xa3\xbe\x9f\x04\ng\u018965\u026d\xc5\u07a0\x00\x00\u07d4\x91b\x0f>\xb3\x04\xe8\x13\u048b\x02\x97Ume\xdcN]\u5a89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94\x91k\xf7\xe3\xc5E\x92\x1d2\x06\xd9\x00\xc2O\x14\x12|\xbd^p\x8a\x03\xd0\u077c}\xf2\xbb\x10\x00\x00\u0794\x91l\xf1}qA(\x05\xf4\xaf\xc3DJ\v\x8d\xd1\xd93\x9d\x16\x88\xc6s\xce<@\x16\x00\x00\u07d4\x91{\x8f\x9f:\x8d\t\xe9 ,R\u009erA\x96\xb8\x97\xd3^\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4\x91\x89g\x91\x8c\u0617\xdd\x00\x05\xe3m\xc6\u0203\xefC\x8f\xc8\u01c9\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x91\x89\x8e\xab\x8c\x05\xc0\"(\x83\xcdM\xb2;w\x95\xe1\xa2J\u05c9lk\x93[\x8b\xbd@\x00\x00\u0794\x91\x91\xf9F\x98!\x05\x16\xcfc!\xa1B\a\x0e Yvt\xed\x88\xee\x9d[\xe6\xfc\x11\x00\x00\u07d4\x91\xa4\x14\x9a,{\x1b:g\xea(\xaf\xf3G%\u0fcdu$\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x91\xa7\x87\xbcQ\x96\xf3HW\xfe\f7/M\xf3v\xaa\xa7f\x13\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x91\xa8\xba\xae\xd0\x12\xea.c\x80;Y=\r\f*\xabL[\n\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\x91\xac\\\xfeg\xc5J\xa7\xeb\xfb\xa4HflF\x1a;\x1f\xe2\xe1\x89\x15\xc94\x92\xbf\x9d\xfc\x00\x00\u07d4\x91\xbb?y\x02+\xf3\xc4S\xf4\xff%n&\x9b\x15\xcf,\x9c\xbd\x89RX\\\x13\xfe:\\\x00\x00\u07d4\x91\xc7^<\xb4\xaa\x89\xf3F\x19\xa1d\xe2\xa4x\x98\xf5gM\x9c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x91\xc8\f\xaa\b\x1b85\x1d*\x0e\x0e\x00\xf8\n4\xe5dt\xc1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x91\xccF\xaa7\x9f\x85jf@\xdc\xcdZd\x8ay\x02\xf8I\u0649\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x91\u04a9\xee\x1am\xb2\x0fS\x17\u0327\xfb\xe218\x95\u06ce\xf8\x8a\x01\xcc\u00e5/0n(\x00\x00\u07d4\x91\xd6n\xa6(\x8f\xaaK=`l*\xa4\\{k\x8a%'9\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x91\u06f6\xaa\xad\x14\x95\x85\xbeG7\\]m\xe5\xff\t\x19\x15\x18\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x91\xe8\x81\x06R\xe8\xe6\x16\x15%\xd6;\xb7u\x1d\xc2\x0fg`v\x89'Mej\xc9\x0e4\x00\x00\u07d4\x91\xf5\x16\x14l\xda (\x17\x19\x97\x80`\u01beAI\x06|\x88\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x91\xf6$\xb2J\x1f\xa5\xa0V\xfeW\x12)\xe77\x9d\xb1K\x9a\x1e\x8a\x02\x8a\x85\x17\xc6i\xb3W\x00\x00\xe0\x94\x91\xfe\x8aLad\u07cf\xa6\x06\x99]k\xa7\xad\xca\xf1\u0213\u038a\x03\x99\x92d\x8a#\u0220\x00\x00\u07d4\x92\x1fRa\xf4\xf6\x12v\a\x06\x89&%\xc7^{\u0396\xb7\b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92!\xc9\xce\x01#&et\x10\x96\xac\a#Y\x03\xad\x1f\xe2\xfc\x89\x06\xdbc3U\"b\x80\x00\u07d4\x92%\x988`\xa1\xcbF#\xc7$\x80\xac\x16'+\f\x95\xe5\xf5\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x92%\xd4jZ\x80\x949$\xa3\x9e[\x84\xb9m\xa0\xacE\x05\x81\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x92* \u01da\x1d:&\xdd8)g{\xf1\xd4\\\x8fg+\xb6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x92C\x8eR\x03\xb64o\xf8\x86\xd7\xc3b\x88\xaa\xcc\xccx\xce\u028965\u026d\xc5\u07a0\x00\x00\u07d4\x92C\xd7v-w({\x12c\x86\x88\xb9\x85N\x88\xa7i\xb2q\x8965\u026d\xc5\u07a0\x00\x00\u0794\x92K\xcez\x85<\x97\v\xb5\xec{\xb7Y\xba\xeb\x9ct\x10\x85{\x88\xbe -j\x0e\xda\x00\x00\u07d4\x92N\xfam\xb5\x95\xb7\x93\x13'~\x881\x96%\akX\n\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92U\x82&\xb3\x84bl\xadH\xe0\x9d\x96k\xf19^\xe7\xea]\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\u07d4\x92`\x82\xcb~\xedK\x19\x93\xad$ZGrg\xe1\xc3<\xd5h\x89\x14Jt\xba\u07e4\xb6\x00\x00\u07d4\x92b\t\xb7\xfd\xa5N\x8d\u06dd\x9eM=\x19\xeb\u070e\x88\u009f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92h\xd6&FV6\x11\xdc;\x83*0\xaa#\x94\xc6F\x13\xe3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92i\x8e4Sx\xc6-\x8e\xda\x18M\x946j\x14K\f\x10[\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x92y:\u0173rhwJq0\xde+\xbd3\x04\x05f\x17s\x89\x02,\xa3X|\xf4\xeb\x00\x00\xe0\x94\x92y\xb2\"\x8c\xec\x8f{M\xda?2\x0e\x9a\x04f\xc2\xf5\x85\u028a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x92|\xb7\xdc\x18p6\xb5B{\xc7\xe2\x00\xc5\xecE\f\x1d'\u0509\v\xb5\x9a'\x95<`\x00\x00\u07d4\x92|\u00bf\xda\x0e\b\x8d\x02\xef\xf7\v8\xb0\x8a\xa5<\xc3\tA\x89do`\xa1\xf9\x866\x00\x00\xe0\x94\x92\x84\xf9m\xdbG\xb5\x18n\xe5X\xaa12M\xf56\x1c\x0fs\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\x92\x9d6\x8e\xb4j-\x1f\xbd\xc8\xff\xa0`~\xdeK\xa8\x8fY\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xa7\u0166Cb\xe9\xf8B\xa2=\xec\xa2\x105\x85\u007f\x88\x98\x00\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x92\xa8\x98\xd4o\x19q\x9c8\x12j\x8a<'\x86z\xe2\xce\u5589lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xa9q\xa79y\x9f\x8c\xb4\x8e\xa8G]r\xb2\xd2GAr\xe6\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x92\xaa\xe5\x97h\xed\xdf\xf8<\xfe`\xbbQ.s\n\x05\xa1a\u05c9\\\x97xA\fv\u0440\x00\u07d4\x92\xad\x1b=u\xfb\xa6}Tf=\xa9\xfc\x84\x8a\x8a\xde\x10\xfag\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xae[|~\xb4\x92\xff\x1f\xfa\x16\xddB\xad\x9c\xad@\xb7\xf8\u0709.\xe4IU\b\x98\xe4\x00\x00\u07d4\x92\xc0\xf5s\xec\xcfb\xc5H\x10\xeek\xa8\xd1\xf1\x13T+0\x1b\x89\xb7ro\x16\u0331\xe0\x00\x00\u07d4\x92\xc1?\xe0\xd6\u0387\xfdP\xe0=\uf7e6@\x05\t\xbdps\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x92\xc9L( \xdf\xcfqV\xe6\xf10\x88\xec\u754b6v\xfd\x89\x05-T(\x04\xf1\xce\x00\x00\u07d4\x92\xcf\xd6\x01\x88\xef\u07f2\xf8\xc2\xe7\xb1i\x8a\xbb\x95&\xc1Q\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\u062d\x9aMah;\x80\u0526g.\x84\xc2\rbB\x1e\x80\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x92\u0725\xe1\x02\xb3\xb8\x1b`\xf1\xa5\x04cIG\xc3t\xa8\x8c\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xe454\x0e\x9d%<\x00%c\x89\xf5+\x06}U\x97Nv\x89\x0e\x87?D\x13<\xb0\x00\x00\xe0\x94\x92\xe49(\x16\xe5\xf2\xef_\xb6X7\xce\xc2\xc22\\\xc6I\"\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x92\xe6X\x1e\x1d\xa1\xf9\xb8F\xe0\x93G3=\xc8\x18\xe2\u04acf\x89\xc5S%\xcat\x15\xe0\x00\x00\u07d4\x93\x1d\xf3M\x12%\xbc\xd4\"Nch\r\\L\t\xbc\xe75\xa6\x89\x03\xaf\xb0\x87\xb8v\x90\x00\x00\u07d4\x93\x1f\xe7\x12\xf6B\a\xa2\xfdP\"r\x88CT\x8b\xfb\x8c\xbb\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x93#_4\r(c\xe1\x8d/LR\x99e\x16\x13\x8d\"\x02g\x89\x04\x00.D\xfd\xa7\xd4\x00\x00\u07d4\x93%\x82U\xb3|\u007fX\xf4\xb1\x06s\xa92\xdd:\xfd\x90\xf4\xf2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x93(\xd5\\\xcb?\xceS\x1f\x19\x93\x823\x9f\x0eWn\xe8@\xa3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x93)\xff\xdc&\x8b\xab\u0788t\xb3f@l\x81D[\x9b-5\x89\x16\xe6/\x8cs\f\xa1\x80\x00\u07d4\x93+\x9c\x04\xd4\r*\xc80\x83\xd9B\x98\x16\x9d\xae\x81\xab.\u0409lk\x93[\x8b\xbd@\x00\x00\u07d4\x9346\xc8G&U\xf6L:\xfa\xaf|Lb\x1c\x83\xa6+8\x8965\u026d\xc5\u07a0\x00\x00\u0794\x93;\xf3?\x82\x99p+:\x90&B\xc3>\v\xfa\xea\\\x1c\xa3\x88\xd2\xf1?w\x89\xf0\x00\x00\u07d4\x93@4\\\xa6\xa3\uaf77sc\xf2X`C\xf2\x948\xce\v\x89\x1c\xc8\x05\xda\r\xff\xf1\x00\x00\xe0\x94\x93@\xb5\xf6x\xe4^\xe0^\xb7\b\xbbz\xbbn\xc8\xf0\x8f\x1bk\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x93J\xf2\x1b~\xbf\xa4g\xe2\xce\xd6Z\xa3N\xdd:\x0e\xc7\x132\x8a\a\x80\x1f>\x80\xcc\x0f\xf0\x00\x00\xe0\x94\x93PiDJj\x98M\xe2\bNFi*\xb9\x9fg\x1f\xc7'\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\xe0\x94\x93P~\x9e\x81\x19\xcb\xce\u068a\xb0\x87\xe7\xec\xb0q8=i\x81\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x93g\x8a\x00\x00\xe0\x94\x93m\xcf\x00\x01\x94\xe3\xbf\xf5\n\u0174$:;\xa0\x14\xd6a\u060a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x93o8\x13\xf5\xf6\xa1;\x8eO\xfe\xc8?\xe7\xf8&\x18jq\u0349\x1c0s\x1c\xec\x03 \x00\x00\u07d4\x93t\x86\x9dJ\x99\x11\xee\x1e\xafU\x8b\xc4\u00b6>\xc6:\xcf\u074965\u026d\xc5\u07a0\x00\x00\u07d4\x93uc\u0628\x0f\u05657\xb0\xe6m \xa0%%\xd5\u0606`\x89\x87\x86x2n\xac\x90\x00\x00\u07d4\x93v\xdc\xe2\xaf.\xc8\xdc\xdat\x1b~sEfF\x81\xd96h\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x93\x86\x8d\xdb*yM\x02\xeb\xda/\xa4\x80|v\xe3`\x98X\u0709m\xee\x15\xfc|$\xa7\x80\x00\xe0\x94\x93\x9cC\x13\xd2(\x0e\xdf^\a\x1b\xce\xd8F\x06?\n\x97]T\x8a\x19i6\x89t\xc0[\x00\x00\x00\xe0\x94\x93\xa6\xb3\xabB0\x10\xf9\x81\xa7H\x9dJ\xad%\xe2b\\WA\x8a\x04F\x80\xfej\x1e\xdeN\x80\x00\u07d4\x93\xaa\x8f\x92\xeb\xff\xf9\x91\xfc\x05^\x90ne\x1a\xc7h\xd3+\u02092\xf5\x1e\u06ea\xa30\x00\x00\u07d4\x93\xb4\xbf?\xdf\xf6\xde?NV\xbamw\x99\xdcK\x93\xa6T\x8f\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4\x93\xbc}\x9aJ\xbdD\u023b\xb8\xfe\x8b\xa8\x04\xc6\x1a\xd8\xd6Wl\x89\xd8\xd6\x11\x9a\x81F\x05\x00\x00\u07d4\x93\xc2\xe6N]\xe5X\x9e\xd2P\x06\xe8C\x19n\xe9\xb1\xcf\v>\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\x93\u020e-\x88b\x1e0\xf5\x8a\x95\x86\xbe\xd4\t\x89\x99\xebg\u074a\x06\x9bZ\xfa\xc7P\xbb\x80\x00\x00\u07d4\x93\xe0\xf3~\xcd\xfb\x00\x86\xe3\xe8b\xa9p4D{\x1eM\xec\x1a\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\xe0\x94\x93\xe3\x03A\x1a\xfa\xf6\xc1\a\xa4A\x01\u026c[6\xe9\xd6S\x8b\x8a\r\xf9\xdd\xfe\xcd\x03e@\x00\x00\u07d4\x93\xf1\x8c\xd2R`@v\x14\x88\xc5\x13\x17M\x1eycv\x8b,\x89\x82\xff\xac\x9a\u0553r\x00\x00\u07d4\x94\x0fqQ@P\x9f\xfa\xbf\x97EF\xfa\xb3\x90\"\xa4\x19R\u0489K\xe4\xe7&{j\xe0\x00\x00\u07d4\x94,k\x8c\x95[\xc0\u0608\x12g\x8a#g%\xb3'9\xd9G\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\x94=7\x86JJS}5\xc8\u0657#\xcdd\x06\xce%b\xe6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94C\x9c\xa9\xcc\x16\x9ay\u0520\x9c\xae^gvJo\x87\x1a!\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x94D\x9c\x01\xb3*\u007f\xa5Z\xf8\x10OB\xcd\xd8D\xaa\x8c\xbc@\x8a\x03\x81\x11\xa1\xf4\xf0<\x10\x00\x00\xe0\x94\x94E\xba\\0\xe9\x89a\xb8`$a\xd08]@\xfb\xd8\x03\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x94O\a\xb9o\x90\xc5\xf0\xd7\xc0\u0140S1I\xf3\xf5\x85\xa0x\x89\x04\x02\xf4\xcf\xeeb\xe8\x00\x00\u07d4\x94T\xb3\xa8\xbf\xf9p\x9f\xd0\u1407~l\xb6\u0219t\xdb\u0589\x90\xf54`\x8ar\x88\x00\x00\u07d4\x94]\x96\xeaW>\x8d\xf7&+\xbf\xa5r\"\x9bK\x16\x01k\x0f\x89\vX\x9e\xf9\x14\xc1B\x00\x00\u07d4\x94^\x18v\x9d~\xe7'\xc7\x01?\x92\xde$\xd1\x17\x96\u007f\xf3\x17\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94a'\x81\x03;W\xb1F\xeet\xe7S\xc6r\x01\u007fS\x85\xe4\x89\xc3(\t>a\xee@\x00\x00\xe0\x94\x94dJ\xd1\x16\xa4\x1c\xe2\xca\u007f\xbe\xc6\t\xbd\xefs\x8a*\xc7\u01ca\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x94p\xcc6YE\x86\x82\x18!\xc5\u0256\xb6\xed\xc8;mZ2\x89\x01M\x11 \u05f1`\x00\x00\xe0\x94\x94u\xc5\x10\xec\x9a&\x97\x92GtL=\x8c;\x0e\v_D\u04ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x94~\x11\xe5\xea)\ro\u00f3\x80H\x97\x9e\f\xd4N\xc7\xc1\u007f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94\x83\u064f\x14\xa3?\xdc\x11\x8d@9U\u00995\xed\xfc_p\x89\x18\xea;4\xefQ\x88\x00\x00\u07d4\x94\x911\xf2\x89C\x92\\\xfc\x97\xd4\x1e\f\xea\v&)s\xa70\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\x94\x9f\x84\xf0\xb1\xd7\u0127\xcfI\xee\u007f\x8b,J\x13M\xe3(x\x89%\"H\u07b6\xe6\x94\x00\x00\u07d4\x94\x9f\x8c\x10{\xc7\xf0\xac\xea\xa0\xf1pR\xaa\xdb\xd2\xf9s+.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94\xa7\u0368\xf4\x81\xf9\u061dB\xc3\x03\xae\x162\xb3\xb7\t\xdb\x1d\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x94\xa9\xa7\x16\x911| d'\x1bQ\xc95?\xbd\xed5\x01\xa8\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\x94\xadK\xad\x82K\xd0\ub7a4\x9cX\u03bc\xc0\xff^\b4k\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x94\xbb\xc6}\x13\xf8\x9e\xbc\xa5\x94\xbe\x94\xbcQp\x92\f0\xd9\xf3\x89\x04X\xff\xa3\x15\nT\x00\x00\u07d4\x94\xbe:\xe5Ob\xd6c\xb0\xd4\u031e\x1e\xa8\xfe\x95V\ua7bf\x89\x01C\x13,\xa8C\x18\x00\x00\xe0\x94\x94\xc0U\xe8X5z\xaa0\xcf A\xfa\x90Y\xce\x16J\x1f\x91\x8a\x04<%\xe0\xdc\xc1\xbd\x1c\x00\x00\xe0\x94\x94\xc7B\xfdz\x8by\x06\xb3\xbf\xe4\xf8\x90O\xc0\xbe\\v\x803\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x94\xcaV\xdew\u007f\xd4S\x17\u007f^\x06\x94\xc4x\xe6j\xff\x8a\x84\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x94\xd8\x10t\xdbZ\xe1\x97\u04bb\x13s\xab\x80\xa8}\x12\x1cK\u04ca\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4\x94\u06c0xs\x86\n\xac=Z\xea\x1e\x88^R\xbf\xf2\x86\x99T\x89\xae\x8ez\v\xb5u\xd0\x00\x00\u07d4\x94\xe1\xf5\u02db\x8a\xba\xce\x03\xa1\xa6B\x82VU;i\f#U\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x94\xef\x8b\xe4Pw\xc7\xd4\xc5e'@\u0794jbbOq?\x89\x05l\xf5Y:\x18\xf8\x80\x00\u07d4\x94\xf1?\x9f\b6\xa3\xee$7\xa8I\"\u0498M\xc0\xf7\xd5;\x89\xa2\xa02\x9b\u00ca\xbe\x00\x00\u07d4\x94\xf8\xf0W\xdb~`\xe6u\xad\x94\x0f\x15X\x85\u0464w4\x8e\x89\x15\xbeat\xe1\x91.\x00\x00\xe0\x94\x94\xfc\u03ad\xfe\\\x10\x9c^\xae\xafF-C\x871B\u020e\"\x8a\x01\x045a\xa8\x82\x93\x00\x00\x00\u07d4\x95\x03N\x16!\x86Q7\xcdG9\xb3F\xdc\x17\xda:'\xc3N\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\x95\fh\xa4\t\x88\x15M#\x93\xff\xf8\xda|\u0369\x96\x14\xf7,\x89\xf9AF\xfd\x8d\xcd\xe5\x80\x00\xe0\x94\x95\x0f\xe9\xc6\xca\xd5\f\x18\xf1\x1a\x9e\xd9\xc4W@\xa6\x18\x06\x12\u040a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x95!\x83\xcf\u04ce5.W\x9d6\xde\xce\u0171\x84P\xf7\xfb\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x95'\x8b\b\xde\xe7\xc0\xf2\xc8\xc0\xf7\"\xf9\xfc\xbb\xb9\xa5$\x1f\u0689\x82\x93\t\xf6O\r\xb0\x00\x00\u07d4\x95,W\xd2\xfb\x19Q\a\xd4\xcd\\\xa3\x00wA\x19\u07ed/x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x955r\xf0\xeam\xf9\xb1\x97\xca\xe4\x0eK\x8e\xcc\x05lCq\u014965\u026d\xc5\u07a0\x00\x00\u07d4\x95>\xf6R\xe7\xb7i\xf5=nxjX\x95/\xa9>\xe6\xab\u725b\ny\x1f\x12\x110\x00\x00\u07d4\x95DpF1;/:^\x19\xb9H\xfd;\x8b\xed\xc8,q|\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x95]\xb3\xb7C`\xb9\xa2hg~s\u03a8!f\x8a\xf6\xfa\u038a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\x95`\xe8\xacg\x18\xa6\xa1\xcd\xcf\xf1\x89\xd6\x03\xc9\x06>A=\xa6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x95g\xa0\u0781\x1d\xe6\xff\t[~\xe6N\u007f\x1b\x83\xc2a[\x80\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x95h\x1c\xda\xe6\x9b I\xce\x10\x1e2\\u\x98\x92\xca\xc3\xf8\x11\x89\x9a\xe9*\x9b\xc9L@\x00\x00\xe0\x94\x95h\xb7\xdeuV(\xaf5\x9a\x84T=\xe25\x04\xe1^A\xe6\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x95i\xc6:\x92\x84\xa8\x05bm\xb3\xa3.\x9d#c\x93GaQ\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x95\x80\x9e\x8d\xa3\xfb\xe4\xb7\xf2\x81\xf0\xb8\xb1q_B\x0f}}c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x95\x9fW\xfd\xedj\xe3y\x13\xd9\x00\xb8\x1e_H\xa7\x93\"\xc6'\x89\r\xdb&\x10GI\x11\x80\x00\u07d4\x95\x9f\xf1\u007f\x1dQ\xb4s\xb4@\x10\x05'U\xa7\xfa\x8cu\xbdT\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x95\xa5w\xdc.\xb3\xael\xb9\xdf\xc7z\xf6\x97\xd7\xef\xdf\xe8\x9a\x01\x89\a_a\x0fp\xed \x00\x00\u07d4\x95\xcbm\x8acy\xf9J\xba\x8b\x88ViV,MD\x8eV\xa7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x95\xd5PB{ZQLu\x1ds\xa0\xf6\u049f\xb6]\"\xed\x10\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x95\u064d\f\x10i\x90\x8f\x06zR\xac\xac+\x8bSM\xa3z\xfd\x89oY\xb60\xa9)p\x80\x00\xe0\x94\x95\xdfN4E\xd7f&$\u010e\xbat\u03de\nS\xe9\xf72\x8a\v\xdb\xc4\x1e\x03H\xb3\x00\x00\x00\u07d4\x95\xe6\xa5K-_g\xa2JHu\xafu\x10|\xa7\xea\x9f\xd2\xfa\x89Hz\x9a0E9D\x00\x00\xe0\x94\x95\xe6\xf9=\xac\"\x8b\xc7XZ%sZ\xc2\xd0v\xcc:@\x17\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x95\xe7ad$\xcd\ta\xa7\x17'$t7\xf0\x06\x92r(\x0e\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x95\xe8\n\x82\xc2\f\xbe= `$,\xb9-sX\x10\xd04\xa2\x89\x01\xc3.F?\u0539\x80\x00\u07d4\x95\xf6-\x02C\xed\xe6\x1d\xad\x9a1e\xf59\x05'\rT\xe2B\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\x95\xfbZ\xfb\x14\xc1\uf6b7\xd1y\xc5\xc3\x00P?\xd6j^\xe2\x89\x01\xda\xf7\xa0+\r\xbe\x80\x00\u07d4\x96\x10Y\"\x02\u0082\xab\x9b\u0628\x84Q\x8b>\v\xd4u\x817\x89\x0e\x87?D\x13<\xb0\x00\x00\xe0\x94\x96\x1cY\xad\xc7E\x05\u0446M\x1e\xcf\u02ca\xfa\x04\x12Y<\x93\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x96,\r\xec\x8a=FK\xf3\x9b\x12\x15\xea\xfd&H\n\xe4\x90\u0349l\x82\xe3\xea\xa5\x13\xe8\x00\x00\u07d4\x96,\xd2*\x8e\xdf\x1eONU\xb4\xb1]\xdb\xfb]\x9dT\x19q\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x963K\xfe\x04\xff\xfaY\x02\x13\xea\xb3e\x14\xf38\xb8d\xb76\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x967\xdc\x12r=\x9cxX\x85B\uac02fO?\x03\x8d\x9d\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x96N\xabK'kL\u0618>\x15\xcar\xb1\x06\x90\x0f\xe4\x1f\u0389\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x96b\xee\x02\x19&h+1\xc5\xf2\x00\xceEz\xbe\xa7ll\xe9\x89$Y\x0e\x85\x89\xebj\x00\x00\xe0\x94\x96l\x04x\x1c\xb5\xe6}\xde25\xd7\xf8b\x0e\x1a\xb6c\xa9\xa5\x8a\x10\r P\xdacQ`\x00\x00\u07d4\x96pv\xa8w\xb1\x8e\xc1ZA[\xb1\x16\xf0n\xf3&E\u06e3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x96{\xfa\xf7bC\u0379@\t\xae<\x8d5\x05\xe9\xc0\x80EK\xe0\xe8\x19\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x96\x92A\x91\xb7\xdfe[3\x19\xdcma7\xf4\x81\xa7:\x0f\xf3\x89\xd9\xec\xb4\xfd \x8eP\x00\x00\u07d4\x96\x96\x05!83\x8cr/\x11@\x81\\\xf7t\x9d\r;:t\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x96\xa5_\x00\xdf\xf4\x05\xdcM\xe5\xe5\x8cW\xf6\xf6\xf0\xca\xc5]/\x89jf\x167\x9c\x87\xb5\x80\x00\u07d4\x96\xaaW?\xed/#4\x10\u06eeQ\x80\x14[#\xc3\x1a\x02\xf0\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\x96\xadW\x9b\xbf\xa8\u06ce\xbe\xc9\u0486\xa7.Fa\xee\xd8\xe3V\x89:\v\xa4+\xeca\x83\x00\x00\u07d4\x96\xb44\xfe\x06W\xe4*\u0302\x12\xb6\x86Q9\xde\xde\x15\x97\x9c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x96\xb9\x06\xear\x9fFU\xaf\xe3\xe5}5'|\x96}\xfa\x15w\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x96\xd6-\xfdF\b\u007fb@\x9d\x93\xdd`a\x88\xe7\x0e8\x12W\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x96\xd9\u0328\xf5^\xea\x00@\xecn\xb3H\xa1wK\x95\xd9>\xf4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x96\xe7\xc0\xc9\u057f\x10\x82\x1b\xf1@\xc5X\xa1E\xb7\xca\xc2\x13\x97\x899>\xf1\xa5\x12|\x80\x00\x00\u07d4\x96\xeaj\u021a+\xac\x954{Q\u06e6=\x8b\xd5\xeb\xde\xdc\xe1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x96\xea\xfb\xf2\xfboM\xb9\xa46\xa7LE\xb5eDR\xe28\x19\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x96\xebR>\x83/P\n\x01}\xe1>\xc2\u007f]6lV\x0e\xff\x89\x10\xac\u03baC\xee(\x00\x00\u07d4\x96\xf0F*\xe6\xf8\xb9`\x88\xf7\xe9\u018ct\xb9\u062d4\xb3G\x89a\t=|,m8\x00\x00\u07d4\x96\xf8 P\vp\xf4\xa3\xe3#\x9da\x9c\xff\x8f\" u\xb15\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x96\xfeY\xc3\u06f3\xaa|\xc8\xcbbH\fe\xe5nb\x04\xa7\xe2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x96\xffoP\x99h\xf3l\xb4,\xbaH\xdb2\xf2\x1fVv\xab\xf8\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x97\t8R*\xfb^\x8f\x99Hs\xc9\xfb\xdc&\xe3\xb3~1L\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x97\n\xbdS\xa5O\xcaJd) |\x18-MW\xbb9\u0520\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x97\r\x8b\x8a\x00\x16\xd1C\x05O\x14\x9f\xb3\xb8\xe5P\xdc\a\x97\u01c965\u026d\xc5\u07a0\x00\x00\u07d4\x97,/\x96\xaa\x00\u03ca/ Z\xbc\xf8\x93|\fu\xf5\xd8\u0649\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x97?N6\x1f\xe5\xde\u0358\x9dL\x8f}|\xc9y\x908]\xaf\x89\x15\x0f\x85C\xa3\x87B\x00\x00\u07d4\x97M\x05A\xabJG\xec\u007fu6\x9c\x00i\xb6J\x1b\x81w\x10\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u0794\x97M/\x17\x89_)\x02\x04\x9d\xea\xae\xcf\t\xc3\x04e\a@-\x88\xcc\x19\u00947\xab\x80\x00\u07d4\x97R\xd1O^\x10\x93\xf0qq\x1c\x1a\xdb\xc4\xe3\xeb\x1e\\W\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x97V\xe1v\xc9\xefi>\xe1\xee\u01b9\xf8\xb1Q\xd3\x13\xbe\xb0\x99\x89A\rXj \xa4\xc0\x00\x00\u07d4\x97_7d\xe9{\xbc\xcfv|\xbd;y[\xa8m\x8b\xa9\x84\x0e\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\xe0\x94\x97j\x18Sj\xf4\x18tBc\b\x87\x1b\xcd\x15\x12\xa7u\xc9\xf8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x97n<\xea\xf3\xf1\xafQ\xf8\u009a\xff]\u007f\xa2\x1f\x03\x86\xd8\xee\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x97w\xcca\xcfuk\xe3\xb3\xc2\f\xd4I\x1ci\xd2u\xe7\xa1 \x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x97\x81\v\xaf\xc3~\x840c2\xaa\xcb5\xe9*\xd9\x11\xd2=$\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x97\x8cC\f\xe45\x9b\x06\xbc,\xdf\\)\x85\xfc\x95\x0eP\xd5\u0209\x1a\x05V\x90\xd9\u06c0\x00\x00\u07d4\x97\x95\xf6C\x19\xfc\x17\xdd\x0f\x82a\xf9\xd2\x06\xfbf\xb6L\xd0\u0249\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x97\x99\xca!\xdb\xcfi\xbf\xa1\xb3\xf7+\xacQ\xb9\xe3\xcaX|\xf9\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x97\x9c\xbf!\xdf\xec\x8a\xce?\x1c\x19m\x82\u07d6%4\xdf9O\x89\x99\x91\xd4x\xddM\x16\x00\x00\u07d4\x97\x9dh\x1ca}\xa1o!\xbc\xac\xa1\x01\xed\x16\xed\x01Z\xb6\x96\x89e\xea=\xb7UF`\x00\x00\u07d4\x97\x9f0\x15\x8bWK\x99\x9a\xab4\x81\a\xb9\xee\xd8[\x1f\xf8\xc1\x894\x95tD\xb8@\xe8\x00\x00\u07d4\x97\xa8o\x01\xce?|\xfdDA3\x0e\x1c\x9b\x19\xe1\xb1\x06\x06\xef\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x97\xb9\x1e\xfesP\xc2\xd5~~@k\xab\x18\xf3a{\xcd\xe1J\x8a\x02\x1e\x19\x99\xbb\xd5\u04be\x00\x00\u07d4\x97\xd0\xd9r^;p\xe6u\x841s\x93\x8e\xd3q\xb6,\u007f\xac\x89\t79SM(h\x00\x00\u07d4\x97\xd9\xe4jv\x04\u05f5\xa4\xeaN\xe6\x1aB\xb3\xd25\x0f\xc3\xed\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x97\xdc&\xecg\n1\xe0\"\x1d*u\xbc]\xc9\xf9\f\x1fo\u0509\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\x97\xde!\xe4!\xc3\u007f\xe4\xb8\x02_\x9aQ\xb7\xb3\x90\xb5\xdfx\x04\x8a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\x97\xe2\x89s\xb8`\xc5g@(\x00\xfb\xb6<\xe3\x9a\x04\x8a=y\x89\x05B%:\x12l\xe4\x00\x00\u07d4\x97\xe5\xcca'\xc4\xf8\x85\xbe\x02\xf4KB\xd1\u0230\xac\x91\u44c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x97\xf1\xfeL\x80\x83\xe5\x96!*\x18w(\xdd\\\xf8\n1\xbe\u0149\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x97\xf7v\x06W\xc1\xe2\x02u\x90\x86\x96>\xb4!\x1c_\x819\xb9\x8a\n\x8a\t\u007f\xcb=\x17h\x00\x00\xe0\x94\x97\xf9\x9bk\xa3\x13F\u0358\xa9\xfeL0\x8f\x87\u0165\x8cQQ\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x98\n\x84\xb6\x86\xfc1\xbd\xc8<\"\x10XTjq\xb1\x1f\x83\x8a\x89*AUH\xaf\x86\x81\x80\x00\u07d4\x98\x10\xe3J\x94\xdbn\xd1V\xd08\x9a\x0e+\x80\xf4\xfdk\n\x8a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98\x1d\xdf\x04\x04\xe4\xd2-\xdaUj\a&\xf0\v-\x98\xab\x95i\x8965f3\xeb\xd8\xea\x00\x00\xe0\x94\x98\x1fq'u\xc0\xda\xd9u\x18\xff\xed\xcbG\xb9\xad\x1dl'b\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\x984h!\x80\xb9\x82\xd1f\xba\u06dd\x9d\x1d\x9b\xbf\x01m\x87\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x986\xb4\xd3\x04sd\x1a\xb5j\xee\xe1\x92Bv\x1drrQx\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x989sB\xec_=L\xb8w\xe5N\xf5\xd6\xf1\xd3fs\x1b\u050a\x01@a\xb9\xd7z^\x98\x00\x00\xe0\x94\x98Fd\x886\xa3\a\xa0W\x18O\xd5\x1fb\x8a_\x8c\x12B|\x8a\x04\vi\xbfC\xdc\xe8\xf0\x00\x00\xe0\x94\x98Jy\x85\xe3\xcc~\xb5\xc96\x91\xf6\xf8\xcc{\x8f$]\x01\xb2\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x98]p\xd2\a\x89+\xed9\x85\x90\x02N$!\xb1\xcc\x11\x93Y\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x98m\xf4~v\xe4\u05e7\x89\xcd\xee\x91<\u0243\x16P\x93l\x9d\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x98t\x80?\xe1\xf3\xa06^y\"\xb1Bp\xea\xeb\x03,\xc1\xb5\x89<\xf5\x92\x88$\xc6\xc2\x00\x00\u07d4\x98ub4\x95\xa4l\xdb\xf2YS\x0f\xf88\xa1y\x9e\u00c9\x91\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98v\x18\xc8VV |{\xac\x15\a\xc0\xff\xef\xa2\xfbd\xb0\x92\x89\x03}\xfeC1\x89\xe3\x80\x00\u07d4\x98|\x9b\xcdn?9\x90\xa5+\xe3\xed\xa4q\f'Q\x8fOr\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x98\x82\x96|\xeeh\u04a89\xfa\u062bJ|=\xdd\xf6\xc0\xad\u0209Hx\xbe\x1f\xfa\xf9]\x00\x00\u07d4\x98\x85\\}\xfb\xee3SD\x90J\x12\xc4\fs\x17\x95\xb1:T\x899\xfb\xae\x8d\x04-\xd0\x00\x00\u07d4\x98\x9c\f\xcf\xf6T\xda\x03\xae\xb1\x1a\xf7\x01\x05Ea\xd6)~\x1d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x98\xa0\xe5Lm\x9d\u023e\x96'l\xeb\xf4\xfe\xc4`\xf6#]\x85\x89j\u0202\x10\tR\u01c0\x00\u07d4\x98\xb7i\xcc0\\\xec\xfbb\x9a\x00\xc9\a\x06\x9d~\xf9\xbc:\x12\x89\x01h\u048e?\x00(\x00\x00\xe0\x94\x98\xbaN\x9c\xa7/\xdd\xc2\fi\xb49ov\xf8\x18?z*N\x8a\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\x00\u07d4\x98\xbeimQ\xe3\x90\xff\x1cP\x1b\x8a\x0fc1\xb6(\xdd\u016d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98\xbe\u04e7.\xcc\xfb\xaf\xb9#H\x92\x93\xe4)\xe7\x03\xc7\xe2[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98\xbfJ\xf3\x81\v\x84#\x87\xdbp\xc1MF\t\x96&\x00=\x10\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x98\xc1\x0e\xbf,O\x97\u02e5\xa1\xab?*\xaf\xe1\xca\xc4#\xf8\u02c9\x10CV\x1a\x88)0\x00\x00\u07d4\x98\xc1\x9d\xba\x81\v\xa6\x11\xe6\x8f/\x83\xee\x16\xf6\xe7tO\f\x1f\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x98\xc5IJ\x03\xac\x91\xa7h\xdf\xfc\x0e\xa1\xdd\u0b3f\x88\x90\x19\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\x98\xd2\x04\xf9\b_\x8c\x8e}\xe2>X\x9bd\xc6\xef\xf6\x92\xccc\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x98\xd3s\x19\x92\xd1\xd4\x0e\x12\x11\xc7\xf75\xf2\x18\x9a\xfa\a\x02\xe0\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x98\xe2\xb6\xd6\x06\xfd-i\x91\xc9\xd6\xd4\a\u007f\xdf?\xddE\x85\u06890\xdf\x1ao\x8a\xd6(\x00\x00\u07d4\x98\xe3\xe9\v(\xfc\xca\ue087y\xb8\xd4\nUh\xc4\x11n!\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x98\xe6\xf5G\u06c8\xe7_\x1f\x9c\x8a\xc2\xc5\xcf\x16'\xbaX\v>\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x98\xf4\xaf:\xf0\xae\xde_\xaf\xdcB\xa0\x81\xec\xc1\xf8\x9e<\xcf \x8a\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4\x98\xf6\xb8\xe6!=\xbc\x9aU\x81\xf4\xcc\xe6e_\x95%+\xdb\a\x89\x11Xr\xb0\xbc\xa40\x00\x00\u07d4\x99\te\r\u05719{\x8b\x8b\x0e\xb6\x94\x99\xb2\x91\xb0\xad\x12\x13\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x99\x11s`\x19G\xc2\bJb\xd69R~\x96\x15\x12W\x9a\xf9\x89 \x86\xac5\x10R`\x00\x00\u07d4\x99\x12\x9d[<\f\xdeG\xea\r\xefM\xfc\a\r\x1fJY\x95'\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x99\x17\u058dJ\xf3A\xd6Q\xe7\xf0\a\\m\xe6\xd7\x14Nt\t\x8a\x012\xd4Gl\b\xe6\xf0\x00\x00\u07d4\x99\x1a\xc7\xcap\x97\x11_& ^\xee\x0e\xf7\xd4\x1e\xb4\xe3\x11\xae\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794\x99#e\xd7d\xc5\xce5@9\xdd\xfc\x91.\x02:u\xb8\xe1h\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x99&F\xac\x1a\u02ab\xf5\u076b\xa8\xf9B\x9a\xa6\xa9Nt\x96\xa7\x8967Pz0\xab\xeb\x00\x00\u07d4\x99&\x83'\xc3s3.\x06\xc3\xf6\x16B\x87\xd4U\xb9\xd5\xfaK\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99(\xffqZ\xfc:+`\xf8\xebL\u013aN\xe8\u06b6\u5749\x17\xda:\x04\u01f3\xe0\x00\x00\u07d4\x992\xef\x1c\x85\xb7Z\x9b*\x80\x05}P\x874\xc5\x10\x85\xbe\u0309\x02\xb8?\xa50\x1dY\x00\x00\xe0\x94\x99?\x14ax`^f\xd5\x17\xbex.\xf0\xb3\xc6\x1aN\x19%\x8a\x01|\x1f\x055\u05e5\x83\x00\x00\xe0\x94\x99A7\x04\xb1\xa3.p\xf3\xbc\ri\u0748\x1c8VkT\u02ca\x05\xcckiF1\xf7\x12\x00\x00\u07d4\x99AR\xfc\x95\xd5\xc1\u028b\x88\x11:\xbb\xadMq\x0e@\xde\xf6\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x99D\xfe\xe9\xd3JJ\x88\x00#\u01c92\xc0\vY\xd5\xc8*\x82\x89(\xa8\xa5k6\x90\a\x00\x00\u07d4\x99L\u00b5\"~\xc3\xcf\x04\x85\x12F|A\xb7\xb7\xb7H\x90\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99q\xdf`\xf0\xaef\xdc\xe9\xe8\xc8N\x17\x14\x9f\t\xf9\xc5/d\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x99v\x94~\xff_j\xe5\xda\b\xddT\x11\x92\xf3x\xb4(\xff\x94\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x99}e\x92\xa3\x15\x89\xac\xc3\x1b\x99\x01\xfb\xeb<\xc3\xd6[2\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\x82\xa5\x89\x0f\xfbT\x06\u04ec\xa8\u04bf\xc1\xddp\xaa\xa8\n\xe0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\x87\x8f\x9dn\n~\u066e\u01c2\x97\xb78y\xa8\x01\x95\xaf\xe0\x89\xd7\xc1\x98q\x0ef\xb0\x00\x00\u07d4\x99\x8c\x1f\x93\xbc\xdbo\xf2<\x10\xd0\u0712G(\xb7;\xe2\xff\x9f\x896[\xf3\xa43\xea\xf3\x00\x00\u07d4\x99\x91aL[\xaaG\xddl\x96\x87FE\xf9z\xdd,=\x83\x80\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x99\x92J\x98\x16\xbb}\xdf?\xec\x18D\x82\x8e\x9a\xd7\xd0k\xf4\xe6\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\x99\x99vh\xf7\xc1\xa4\xff\x9e1\xf9\x97z\xe3\"K\u02c8z\x85\x89\x0f\xc969(\x01\xc0\x00\x00\u07d4\x99\x9cI\xc1t\xca\x13\xbc\x83l\x1e\n\x92\xbf\xf4\x8b'\x15C\u0289\xb1\xcf$\xdd\u0431@\x00\x00\u07d4\x99\xa4\xde\x19\xde\u05d0\b\xcf\xdc\xd4]\x01M.XK\x89\x14\xa8\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\x99\xa9k\xf2$.\xa1\xb3\x9e\xceo\xcc\r\x18\xae\xd0\f\x01y\xf3\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x99\xb0\x18\x93+\xca\xd3U\xb6y+%]\xb6p-\xec\x8c\xe5\u0749\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\x99\xb7C\xd1\xd9\xef\xf9\r\x9a\x194\xb4\xdb!\xd5\x19\u061bJ8\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x99\xb8\xc8$\x86\x9d\xe9\xed$\xf3\xbf\xf6\x85L\xb6\xddE\xcc?\x9f\x89e\xea=\xb7UF`\x00\x00\u07d4\x99\xc0\x17L\xf8N\a\x83\xc2 \xb4\xebj\xe1\x8f\xe7\x03\x85J\u04c9py\xa2W=\fx\x00\x00\u07d4\x99\xc1\xd9\xf4\fj\xb7\xf8\xa9/\xce/\xdc\xe4zT\xa5\x86\xc5?\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x99\xc26\x14\x1d\xae\xc87\xec\xe0O\xda\xee\x1d\x90\u03cb\xbd\xc1\x04\x89ve\x16\xac\xac\r \x00\x00\u07d4\x99\xc3\x1f\xe7HX7\x87\xcd\xd3\xe5%\xb2\x81\xb2\x18\x96\x179\xe3\x897\b\xba\xed=h\x90\x00\x00\u07d4\x99\xc4u\xbf\x02\xe8\xb9!J\xda_\xad\x02\xfd\xfd\x15\xba6\\\f\x89 \t\xc5\u023fo\xdc\x00\x00\u07d4\x99\u0203%\x85F\xcc~N\x97\x1fR.8\x99\x18\xda^\xa6:\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x99\xc9\xf9>E\xfe<\x14\x18\xc3S\xe4\u016c8\x94\xee\xf8\x12\x1e\x89\x05\x85\xba\xf1E\x05\v\x00\x00\xe0\x94\x99\xd1W\x9c\xd4&\x82\xb7dN\x1dOq(D\x1e\xef\xfe3\x9d\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x99\u0475\x85\x96_@jB\xa4\x9a\x1c\xa7\x0fv\x9evZ?\x98\x8a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\x99\xdf\xd0PL\x06\xc7C\xe4e4\xfd{U\xf1\xf9\xc7\xec3)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\xf4\x14|\xcck\u02c0\u0304.i\xf6\xd0\x0e0\xfaA3\u0649\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x99\xf7\u007f\x99\x8b \xe0\xbc\xdc\xd9\xfc\x83\x86ARl\xf2Y\x18\xef\x89a\t=|,m8\x00\x00\u07d4\x99\xfa\xd5\x008\xd0\xd9\xd4\xc3\xfb\xb4\xbc\xe0V\x06\xec\xad\xcdQ!\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\xfe\r \x12(\xa7S\x14VU\xd4(\xeb\x9f\xd9I\x85\xd3m\x89i \xbf\xf3QZ:\x00\x00\u07d4\x9a\a\x9c\x92\xa6)\xca\x15\xc8\xca\xfa.\xb2\x8d[\xc1z\xf8(\x11\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x9a\r<\xee=\x98\x92\xea;7\x00\xa2\u007f\xf8A@\xd9\x02T\x93\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\x9a$\u038dH\\\xc4\xc8nI\u07b3\x90\"\xf9,t0\xe6~\x89Fy\x1f\xc8N\a\xd0\x00\x00\u07d4\x9a,\xe4;]\x89\u0593k\x8e\x8c5G\x91\xb8\xaf\xff\x96$%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9a9\x01bS^9\x88w\xe4\x16x}b9\xe0uN\x93|\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9a=\xa6P#\xa10 \xd2!E\xcf\xc1\x8b\xab\x10\xbd\x19\xceN\x89\x18\xbfn\xa3FJ:\x00\x00\xe0\x94\x9a>+\x1b\xf3F\xdd\a\v\x02sW\xfe\xacD\xa4\xb2\xc9}\xb8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9aL\xa8\xb8!\x17\x89NC\xdbr\xb9\xfax\xf0\xb9\xb9:\xce\t\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x9aR.R\xc1\x95\xbf\xb7\xcf_\xfa\xae\u06d1\xa3\xbath\x16\x1d\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9aZ\xf3\x1c~\x063\x9a\u0234b\x8d|M\xb0\xce\x0fE\u0224\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794\x9ac?\xcd\x11,\xce\xebv_\xe0A\x81ps*\x97\x05\u7708\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x9ac\u0445\xa7\x91)\xfd\xab\x19\xb5\x8b\xb61\xea6\xa4 TN\x89\x02F\xdd\xf9yvh\x00\x00\u07d4\x9ag\b\u0778\x90<(\x9f\x83\xfe\x88\x9c\x1e\xdc\xd6\x1f\x85D#\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9ao\xf5\xf6\xa7\xaf{z\xe0\xed\x9c \xec\xecP#\u0481\xb7\x86\x89\x8a\x12\xb9\xbdjg\xec\x00\x00\xe0\x94\x9a\x82\x82m<)H\x1d\xcc+\u0495\x00G\xe8\xb6\x04\x86\xc38\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x9a\x8e\xcaA\x89\xffJ\xa8\xff~\u0536\xb7\x03\x9f\t\x02!\x9b\x15\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9a\x95;[\xccp\x93y\xfc\xb5Y\u05f9\x16\xaf\u06a5\f\xad\u0309\x05k\xc7^-c\x10\x00\x00\u07d4\x9a\x99\v\x8a\xebX\x8d~\xe7\xec.\xd8\xc2\xe6Os\x82\xa9\xfe\xe2\x89\x01\xd1'\xdbi\xfd\x8b\x00\x00\u07d4\x9a\x9d\x1d\xc0\xba\xa7}n \xc3\xd8I\u01c8b\xdd\x1c\x05L\x87\x89/\xb4t\t\x8fg\xc0\x00\x00\xe0\x94\x9a\xa4\x8cf\xe4\xfbJ\u0419\x93N2\x02.\x82t'\xf2w\xba\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9a\xa80\x8fB\x91\x0eZ\xde\t\xc1\xa5\xe2\x82\xd6\xd9\x17\x10\xbd\xbf\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9a\xaa\xfa\x00gd~\u0659\x06kzL\xa5\xb4\xb3\xf3\xfe\xaao\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9a\xb9\x88\xb5\x05\xcf\xee\x1d\xbe\x9c\u044e\x9bTs\xb9\xa2\xd4\xf56\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\x9a\xb9\x8dm\xbb\x1e\xaa\xe1mE\xa0EhT\x1a\xd3\xd8\xfe\x06\u0309\x0e\xc5\x04d\xfe#\xf3\x80\x00\xe0\x94\x9a\xba+^'\xffx\xba\xaa\xb5\xcd\u0248\xb7\xbe\x85\\\xeb\xbd\u038a\x02\x1e\f\x00\x13\a\n\xdc\x00\x00\u07d4\x9a\xc4\xdaQ\xd2x\"\xd1\xe2\b\xc9n\xa6J\x1e[U)\x97#\x89\x05lUy\xf7\"\x14\x00\x00\u0794\x9a\xc8S\x97y*i\u05cf(k\x86C*\a\xae\u03b6\x0ed\x88\xc6s\xce<@\x16\x00\x00\xe0\x94\x9a\xc9\a\xee\x85\xe6\xf3\xe2#E\x99\x92\xe2V\xa4?\xa0\x8f\xa8\xb2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9a\xd4\u007f\xdc\xf9\u0354-(\xef\xfd[\x84\x11[1\xa6X\xa1>\x89\xb2Y\xec\x00\xd5;(\x00\x00\u07d4\x9a\xdb\u04fc{\n\xfc\x05\xd1\xd2\xed\xa4\x9f\xf8c\x93\x9cH\xdbF\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\x9a\xdfE\x8b\xff5\x99\xee\xe1\xa2c\x98\x85\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x9a\xf9\xdb\xe4t\"\xd1w\xf9E\xbd\xea\xd7\xe6\xd8)05b0\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x9a\xfaSkLf\xbc8\xd8u\u0133\x00\x99\xd9&\x1f\xdb8\xeb\x89\v*\x8f\x84*w\xbc\x80\x00\u07d4\x9b\x06\xad\x84\x1d\xff\xbeL\xcfF\xf1\x03\x9f\u00c6\xf3\xc3!Dn\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9b\x11h\u078a\xb6KGU/3\x89\x80\n\x9c\xc0\x8bFf\u03c9]\u0212\xaa\x111\xc8\x00\x00\u07d4\x9b\x18\x11\xc3\x05\x1fF\xe6d\xaeK\xc9\xc8$\u0445\x92\xc4WJ\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\x9b\x18G\x86U\xa4\x85\x1c\xc9\x06\xe6`\xfe\xaca\xf7\xf4\u023f\xfc\x89\xe2G\x8d8\x90}\x84\x00\x00\u07d4\x9b\"\xa8\r\\{3t\xa0[D`\x81\xf9}\n4\a\x9e\u007f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x9b+\xe7\xf5gT\xf5\x05\xe3D\x1a\x10\xf7\xf0\xe2\x0f\xd3\xdd\xf8I\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\x9b2\xcfOQ\x15\xf4\xb3J\x00\xa6La}\xe0c\x875C#\x89\x05\xb8\x1e\u0608 |\x80\x00\u07d4\x9bC\u0739_\xde1\x80u\xa5g\xf1\xe6\xb5v\x17\x05^\xf9\xe8\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x9bDO\xd37\xe5\xd7R\x93\xad\xcf\xffp\xe1\xea\x01\xdb\x022\"\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9bH$\xff\x9f\xb2\xab\xdaUM\xeeO\xb8\xcfT\x91eW\x061\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9bL'\x15x\f\xa4\xe9\x9e`\xeb\xf2\x19\xf1Y\f\x8c\xadP\n\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x9bY\xeb!;\x1eue\xe4PG\xe0N\xa07O\x10v-\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9b\\9\xf7\xe0\xac\x16\x8c\x8e\xd0\xed4\x04w\x11}\x1bh.\xe9\x89\x05P\x05\xf0\xc6\x14H\x00\x00\u07d4\x9b^\xc1\x8e\x83\x13\x88}\xf4a\u0490.\x81\xe6z\x8f\x11;\xb1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9bd\xd3\u034d+s\xf6hA\xb5\xc4k\xb6\x95\xb8\x8a\x9a\xb7]\x89\x01 :Ov\f\x16\x80\x00\u07d4\x9be\x8f\xb3a\xe0F\xd4\xfc\xaa\x8a\xefm\x02\xa9\x91\x11\"6%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9bfA\xb1>\x17/\xc0r\xcaK\x83'\xa3\xbc(\xa1[f\xa9\x89\x06\x81U\xa46v\xe0\x00\x00\xe0\x94\x9bh\xf6t\x16\xa6;\xf4E\x1a1\x16L\x92\xf6r\xa6\x87Y\xe9\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4\x9bw6i\xe8}v\x01\x8c\t\x0f\x82U\xe5D\t\xb9\u0728\xb2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9bw\xeb\xce\xd7\xe2\x15\xf0\x92\x0e\x8c+\x87\x00$\xf6\xec\xb2\xff1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9b|\x88\x10\xcc|\u021e\x80Nm>8\x12\x18PG(w\xfe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9b\xa5=\xc8\xc9^\x9aG/\xeb\xa2\xc4\xe3,\x1d\xc4\xdd{\xabF\x89Hz\x9a0E9D\x00\x00\xe0\x94\x9b\xac\xd3\xd4\x0f;\x82\xac\x91\xa2d\xd9\u060d\x90\x8e\xac\x86d\xb9\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x9b\xb7`\xd5\u0089\xa3\xe1\xdb\x18\xdb\tSE\xcaA;\x9aC\u0089\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\x9b\xb7b\x04\x18j\xf2\xf6;\xe7\x91h`\x16\x87\xfc\x9b\xadf\x1f\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x9b\xb9\xb0*&\xbf\xe1\xcc\xc3\xf0\xc6!\x9e&\x1c9\u007f\xc5\xcax\x89Hz\x9a0E9D\x00\x00\u07d4\x9b\xc5s\xbc\xda#\xb8\xb2o\x90s\xd9\f#\x0e\x8eq\xe0'\v\x896/u\xa40]\f\x00\x00\u07d4\x9b\xd7\u00caB\x100JMe>\xde\xff\x1b<\xe4_\xcexC\x89\x0fI\x89A\xe6d(\x00\x00\xe0\x94\x9b\u0600h\xe10u\xf3\xa8\xca\xc4d\xa5\xf9I\xd6\xd8\x18\xc0\xf6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x9b\xd9\x05\xf1q\x9f\u01ec\xd0\x15\x9dM\xc1\xf8\xdb/!G#8\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9b\xdb\u071b\x9741\xd1<\x89\xa3\xf9u~\x9b;bu\xbf\u01c9\x1b\x1a}\u03caD\u04c0\x00\u07d4\x9b\xe3\xc3)\xb6*(\xb8\xb0\x88l\xbd\x8b\x99\xf8\xbc\x93\f\xe3\xe6\x89\x04\t\xe5+H6\x9a\x00\x00\xe0\x94\x9b\xf5\x8e\xfb\xea\a\x84\xeb\x06\x8a\xde\u03e0\xbb!P\x84\xc7:5\x8a\x01:k+VHq\xa0\x00\x00\u07d4\x9b\xf6r\xd9y\xb3fR\xfcR\x82Tzjk\xc2\x12\xaeCh\x89#\x8f\xd4,\\\xf0@\x00\x00\xe0\x94\x9b\xf7\x03\xb4\x1c6$\xe1_@T\x96#\x90\xbc\xba0R\xf0\xfd\x8a\x01H>\x01S<.<\x00\x00\u07d4\x9b\xf7\x1f\u007f\xb57\xacT\xf4\xe5\x14\x94\u007f\xa7\xffg(\xf1m/\x89\x01\u03c4\xa3\n\n\f\x00\x00\u07d4\x9b\xf9\xb3\xb2\xf2<\xf4a\xebY\x1f(4\v\xc7\x19\x93\x1c\x83d\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x9b\xfce\x9c\x9c`\x1e\xa4*k!\xb8\xf1p\x84\xec\x87\xd7\x02\x12\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9b\xff\xf5\r\xb3jxUU\xf0vR\xa1S\xb0\xc4+\x1b\x8bv\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9c\x05\xe9\xd0\xf0u\x8eyS\x03q~1\xda!<\xa1W\u618965\u026d\xc5\u07a0\x00\x00\u07d4\x9c\x1bw\x1f\t\xaf\x88*\xf0d0\x83\xde*\xa7\x9d\xc0\x97\xc4\x0e\x89\x86p\xe9\xece\x98\xc0\x00\x00\u07d4\x9c(\xa2\xc4\b`\x91\xcb]\xa2&\xa6W\xce2H\xe8\xea{o\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\x9c/\xd5@\x89\xaff]\xf5\x97\x1ds\xb8\x04a`9dsu\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9c4@\x98\xbaaZ9\x8f\x11\xd0\t\x90[\x17|D\xa7\xb6\x02\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9c=\x06\x92\xce\xee\xf8\n\xa4\x96\\\xee\xd2b\xff\xc7\xf0i\xf2\u0709\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9c@\\\xf6\x97\x95a8\x06^\x11\xc5\xf7U\x9eg$[\u0465\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x9cE *%\xf6\xad\x00\x11\xf1\x15\xa5\xa7\"\x04\xf2\xf2\x19\x88f\x8a\x01\x0f\xcf:b\xb0\x80\x98\x00\x00\xe0\x94\x9cI\xde\xffG\b_\xc0\x97\x04\u02a2\u0728\u0087\xa9\xa17\u068a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x9cK\xbc\xd5\xf1dJo\aX$\xdd\xfe\x85\xc5q\u05ab\xf6\x9c\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4\x9cRj\x14\x06\x83\xed\xf1C\x1c\xfa\xa1(\xa95\xe2\xb6\x14\u060b\x89\x06\x04o7\xe5\x94\\\x00\x00\xe0\x94\x9cT\xe4\xedG\x9a\x85h)\u01bbB\u069f\vi*u\xf7(\x8a\x01\x97\xa8\xf6\xddU\x19\x80\x00\x00\xe0\x94\x9cX\x1a`\xb6\x10(\xd94\x16y)\xb2-p\xb3\x13\xc3O\u040a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\x9c\\\xc1\x11\t,\x12!\x16\xf1\xa8_N\xe3\x14\bt\x1a}/\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4\x9ck\u0264k\x03\xaeT\x04\xf0C\xdf\xcf!\x88>A\x10\xcc3\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x9cx\x96?\xbc&<\t\xbdr\xe4\xf8\xde\xf7J\x94u\xf7\x05\\\x8a\x02\ub3b1\xa1r\u0738\x00\x00\u07d4\x9cx\xfb\xb4\xdfv\x9c\xe2\xc1V\x92\f\xfe\xdf\xda\x03:\x0e%J\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x9c{m\xc5\x19\x0f\xe2\x91)c\xfc\xd5yh>\xc79Q\x16\xb0\x89*\x11)\u0413g \x00\x00\u07d4\x9c\x80\xbc\x18\xe9\xf8\u0516\x8b\x18]\xa8\u01df\xa6\xe1\x1f\xfc>#\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x9c\x98\xfd\xf1\xfd\u034b\xa8\xf4\u0170L:\xe8X~\xfd\xf0\xf6\xe6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x9c\x99\xa1\u0691\u0552\v\xc1N\f\xb9\x14\xfd\xf6+\x94\u02c3X\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x9c\x99\xb6&\x06(\x1b\\\xef\xab\xf3aV\xc8\xfeb\x83\x9e\xf5\xf3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x9c\x9a\a\xa8\xe5|1r\xa9\x19\xefdx\x94tI\x0f\r\x9fQ\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9c\x9d\xe4G$\xa4\x05M\xa0\xea\xa6\x05\xab\u0300&hw\x8b\xea\x89\n\xd7\xd5\xca?\xa5\xa2\x00\x00\u07d4\x9c\x9f;\x8a\x81\x1b!\xf3\xff?\xe2\x0f\xe9p\x05\x1c\xe6j\x82O\x89>\xc2\u07bc\a\u053e\x00\x00\xe0\x94\x9c\x9f\x89\xa3\x91\x0fj*\xe8\xa9\x10G\xa1z\xb7\x88\xbd\xde\xc1p\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9c\xa0B\x9f\x87O\x8d\xce\xe2\xe9\xc0b\xa9\x02\n\x84*Xz\xb9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9c\xa4.\u7838\x98\xf6\xa5\xcc`\xb5\xa5\u05f1\xbf\xa3\xc321\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9c\xb2\x8a\xc1\xa2\n\x10o\u007f76\x92\xc5\xceLs\xf172\xa1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9c\xcd\u0732\xcf\u00b2[\br\x9a\n\x98\xd9\xe6\xf0 .\xa2\xc1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9c\xe2\u007f$^\x02\xd1\xc3\x12\xc1\xd5\x00x\x8c\x9d\xefv\x90E;\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9c\xe56;\x13\xe8#\x8a\xa4\xdd\x15\xac\u0432\xe8\xaf\xe0\x872G\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x9c\xf2\x92\x8b\xee\xf0\x9a@\xf9\xbf\xc9S\xbe\x06\xa2Q\x11a\x82\xfb\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x9d\x06\x91\x97\xd1\xdeP\x04Z\x18o^\xc7D\xac@\u8bd1\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4\x9d\x0e}\x92\xfb0XS\u05d8&;\xf1^\x97\xc7+\xf9\xd7\xe0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9d\x0f4~\x82k}\u03aa\xd2y\x06\n5\xc0\x06\x1e\xcf3K\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d u\x17B,\xc0\xd6\r\xe7\xc27\tzMO\xce \x94\f\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x9d%\n\xe4\xf1\x10\xd7\x1c\xaf\u01f0\xad\xb5.\x8d\x9a\xcbfy\xb8\x8a\x02\x15mn\x99r\x13\xc0\x00\x00\xe0\x94\x9d+\xfc6\x10o\x03\x82P\xc0\x18\x01hW\x85\xb1l\x86\xc6\r\x8aPw\xd7]\xf1\xb6u\x80\x00\x00\xe0\x94\x9d0\xcb#{\xc0\x96\xf1p6\xfc\x80\xdd!\xcah\x99,\xa2\u064a\x06n\xe71\x8f\u070f0\x00\x00\u07d4\x9d2\x96.\xa9\x97\x00\xd92(\xe9\xdb\xda\xd2\xcc7\xbb\x99\xf0~\x89\xb4c+\xed\xd4\xde\xd4\x00\x00\u07d4\x9d4\xda\xc2[\xd1X(\xfa\xef\xaa\xf2\x8fq\aS\xb3\x9e\x89\u0709;\x1cV\xfe\xd0-\xf0\x00\x00\u07d4\x9d6\x91e\xfbp\xb8\x1a:v_\x18\x8f\xd6\f\xbe^{\th\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9d@\xe0\x12\xf6\x04%\xa3@\xd8-\x03\xa1\xc7W\xbf\xab\xc7\x06\xfb\x89\t4o:\xdd\u020d\x80\x00\u07d4\x9dAt\xaaj\xf2\x84v\xe2)\xda\xdbF\x18\b\b\xc6u\x05\xc1\x89B\x1a\xfd\xa4.\u0597\x00\x00\u07d4\x9dB\x133\x9a\x01U\x18avL\x87\xa9<\xe8\xf8_\x87\x95\x9a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9dF\f\x1b7\x9d\xdb\x19\xa8\xc8[LgG\x05\r\xdf\x17\xa8u\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\x9dG\xba[L\x85\x05\xad\x8d\xa4)4(\va\xa0\xe1\xe8\xb9q\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9dM2\x11w%n\xbd\x9a\xfb\xda0A5\xd5\x17\xc3\xdcV\x93\x89!d\xb7\xa0J\u0220\x00\x00\u07d4\x9dO\xf9\x89\xb7\xbe\u066b\x10\x9d\x10\xc8\xc7\xe5_\x02\xd7g4\xad\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x9dQ\x15C\xb3\xd9\xdc`\xd4\u007f\t\u051d\x01\xb6\u0118\xd8 x\x8a\x02a\x97\xb9Qo\u00d4\x00\x00\u07d4\x9dn\u03e0:\xf2\xc6\xe1D\xb7\xc4i*\x86\x95\x1e\x90.\x9e\x1f\x89\xa2\xa5\xaa`\xad$?\x00\x00\u07d4\x9dvU\xe9\xf3\xe5\xba]n\x87\xe4\x12\xae\xbe\x9e\xe0\u0512G\ue24e\t1\x1c\x1d\x80\xfa\x00\x00\u07d4\x9dx1\xe84\xc2\v\x1b\xaaiz\xf1\xd8\xe0\xc6!\u016f\xff\x9a\x89\x04\xb0m\xbb\xb4\x0fJ\x00\x00\u07d4\x9dx\xa9u\xb7\xdb^M\x8e(\x84\\\xfb\xe7\xe3\x14\x01\xbe\r\u0649H\xa40k\xa2\u5e5c\x8ahX\u02f5,\f\xf75\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\x9d\u007f\xdapp\xbf>\xe9\xbb\u0664\x1fU\xca\u0505J\xe6\xc2,\x8a\x02U\u02e3\xc4o\xcf\x12\x00\x00\u07d4\x9d\x81\xae\xa6\x9a\xedj\xd0p\x89\xd6\x14E4\x8c\x17\xf3K\xfc[\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x9d\x91\x1f6\x82\xf3/\xe0y.\x9f\xb6\xff<\xfcG\xf5\x89\xfc\xa5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d\x91;]3\x9c\x95\xd8wEV%c\xfe\xa9\x8b#\xc6\f\u0109\tA0,\u007fM#\x00\x00\u07d4\x9d\x93\xfa\xb6\xe2(E\xf8\xf4Z\aIo\x11\xdeqS\r\xeb\u01c9lO\xd1\xee$nx\x00\x00\u07d4\x9d\x99\xb1\x89\xbb\u0664\x8f\xc2\xe1n\x8f\u0363;\xb9\x9a1{\xbb\x89=\x16\xe1\vm\x8b\xb2\x00\x00\u07d4\x9d\x9cN\xfe\x9fC9\x89\xe2;\xe9@I!S)\xfaU\xb4\u02c9\r\u3c89\x03\u01b5\x80\x00\u07d4\x9d\x9eW\xfd\xe3\x0ePh\xc0>I\x84\x8e\xdc\xe3C\xb7\x02\x83X\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\x9d\xa30\"@\xaf\x05\x11\xc6\xfd\x18W\xe6\u07779Ow\xabk\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\x9d\xa4\xec@pw\xf4\xb9p{-\x9d.\xde^\xa5(+\xf1\u07c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d\xa6\t\xfa:~l\xf2\xcc\x0ep\u036b\xe7\x8d\xc4\xe3\x82\xe1\x1e\x89A\rXj \xa4\xc0\x00\x00\xe0\x94\x9d\xa6\x1c\xcdb\xbf\x86\x06V\xe02]qW\xe2\xf1`\xd9;\xb5\x8a\x01\x0f\f\xa9V\xf8y\x9e\x00\x00\xe0\x94\x9d\xa6\xe0u\x98\x9ct\x19\tL\xc9\xf6\xd2\u44d3\xbb\x19\x96\x88\x8a\x02Y\xbbq\u056d\xf3\xf0\x00\x00\u07d4\x9d\xa8\xe2,\xa1\x0eg\xfe\xa4NR^GQ\xee\xac6\xa3\x11\x94\x89\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\x9d\xb2\xe1\\\xa6\x81\xf4\xc6`H\xf6\xf9\xb7\x94\x1e\u040b\x1f\xf5\x06\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d\xc1\x0f\xa3\x8f\x9f\xb0h\x10\xe1\x1f`\x17>\xc3\xd2\xfdju\x1e\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x9d\xd2\x19f$\xa1\xdd\xf1J\x9d7^_\a\x15+\xaf\"\xaf\xa2\x89A\xb0^$c\xa5C\x80\x00\u07d4\x9d\xd4k\x1cm?\x05\u279co\x03~\xed\x9aYZ\xf4\xa9\xaa\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x9d\xdd5^cN\xe9\x92~K\u007fl\x97\xe7\xbf:/\x1ehz\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x9d\xe2\n\xe7j\xa0\x82c\xb2\x05\xd5\x14$a\x96\x1e$\b\xd2f\x89\r\xa93\xd8\xd8\xc6p\x00\x00\u07d4\x9d\xe2\v\xc3~\u007fH\xa8\x0f\xfdz\xd8O\xfb\xf1\xa1\xab\xe1s\x8c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9d\xe78m\xde@\x1c\xe4\xc6{q\xb6U?\x8a\xa3N\xa5\xa1}\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\x9d\xeb9\x02z\xf8w\x99+\x89\xf2\xecJ\x1f\x82.\xcd\xf1&\x93\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x9d\xef\xe5j\x0f\xf1\xa1\x94}\xba\t#\xf7\xdd%\x8d\x8f\x12\xfaE\x8a\x05\xb1*\ufbe8\x04\x00\x00\x00\u07d4\x9d\xf0W\xcd\x03\xa4\xe2~\x8e\x03/\x85y\x85\xfd\u007f\x01\xad\xc8\u05c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x9d\xf3*P\x1c\vx\x1c\x02\x81\x02/B\xa1)?\xfd{\x89*\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\u07d4\x9e\x01vZ\xff\b\xbc\"\x05P\xac\xa5\xea.\x1c\xe8\u5c19#\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9e \xe5\xfd6\x1e\xab\xcfc\x89\x1f[\x87\xb0\x92h\xb8\xeb7\x93\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9e#,\b\xc1M\xc1\xa6\xed\v\x8a;(h\x97{\xa5\xc1}\x10\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9e#\xc5\u4dc2\xb0\n_\xad\U0006eb47\xda\xcf[\x03g\xa1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9e59\x90q\xa4\xa1\x01\xe9\x19M\xaa?\t\xf0J\v_\x98p\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9e>\xb5\t'\x8f\xe0\xdc\xd8\xe0\xbb\xe7\x8a\x19N\x06\xb6\x809C\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\x9eBrrQk>g\xd4\xfc\xbf\x82\xf5\x93\x90\xd0L\x8e(\xe5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x9eL\xec5:\xc3\u3043^<\t\x91\xf8\xfa\xa5\xb7\u0428\xe6\x8a\x02\x1e\x18\xb9\xe9\xabE\xe4\x80\x00\u07d4\x9eX\x11\xb4\v\xe1\xe2\xa1\xe1\u048c;\at\xac\xde\n\t`=\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x9eZ1\x1d\x9fi\x89\x8a|j\x9dc`h\x048\xe6z{/\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\x9e| P\xa2'\xbb\xfd`\x93~&\x8c\xea>h\xfe\xa8\xd1\xfe\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9e\u007fe\xa9\x0e\x85\b\x86{\xcc\xc9\x14%j\x1e\xa5t\xcf\a\xe3\x89C8t\xf62\xcc`\x00\x00\xe0\x94\x9e\x81D\xe0\x8e\x89dx\x11\xfekr\xd4E\u05a5\xf8\n\xd2D\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9e\x8fd\xdd\xcd\u9e34Q\xba\xfa\xa25\xa9\xbfQ\x1a%\xac\x91\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\x9e\x95\x1fm\xc5\xe3R\xaf\xb8\xd0B\x99\xd2G\x8aE\x12Y\xbfV\x89\x03\xe7A\x98\x81\xa7:\x00\x00\u07d4\x9e\x96\r\xcd\x03\u057a\x99\xcb\x11]\x17\xffL\t$\x8a\xd4\u043e\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9e\xafj2\x8a@v\x02N\xfakg\xb4\x8b!\xee\xdc\xc0\xf0\xb8\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x9e\xb1\xffqy\x8f(\xd6\xe9\x89\xfa\x1e\xa0X\x8e'\xba\x86\xcb}\x89\a\xa1\xfe\x16\x02w\x00\x00\x00\u07d4\x9e\xb2\x81\xc3'\x19\xc4\x0f\xdb>!m\xb0\xf3\u007f\xbcs\xa0&\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9e\xb3\xa7\xcb^g&Bz:6\x1c\xfa\x8dad\xdb\u043a\x16\x89+\x95\xbd\xcc9\xb6\x10\x00\x00\u07d4\x9e\xb7\x83N\x17\x1dA\xe0i\xa7yG\xfc\xa8v\"\xf0\xbaNH\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x9e\xc0>\x02\u51f7v\x9d\xefS\x84\x13\xe9\u007f~U\xbeq\u060a\x04+\xf0kx\xed;P\x00\x00\u07d4\x9e\u02eb\xb0\xb2'\x82\xb3uD)\xe1uz\xab\xa0K\x81\x18\x9f\x89,\xa7\xbb\x06\x1f^\x99\x80\x00\u07d4\x9e\xce\x14\x00\x80\t6\xc7\xc6H_\xcd\xd3b`\x17\u041a\xfb\xf6\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4\x9e\xd4\xe6?ReB\xd4O\xdd\xd3MY\xcd%8\x8f\xfdk\u0689\u049b4\xa4cH\x94\x00\x00\u07d4\x9e\xd8\x0e\xda\u007fU\x05M\xb9\xfbR\x82E\x16\x88\xf2k\xb3t\xc1\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x9e\u0710\xf4\xbe!\be!J\xb5\xb3^Z\x8d\xd7t\x15'\x9d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9e\u07acL\x02k\x93\x05M\u0171\xd6a\fo9`\xf2\xads\x89A\rXj \xa4\xc0\x00\x00\u07d4\x9e\xe9?3\x9eg&\xece\xee\xa4O\x8aK\xfe\x10\xda=2\x82\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x9e\xe9v\f\xc2s\xd4pj\xa0\x83u\xc3\xe4o\xa20\xaf\xf3\u054a\x01\xe5.3l\xde\"\x18\x00\x00\u07d4\x9e\xeb\a\xbd+x\x90\x19^}F\xbd\xf2\a\x1bf\x17QM\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x9e\xefD-)\x1aD}t\xc5\xd2S\u011e\xf3$\xea\xc1\xd8\xf0\x89\xb9f\b\xc8\x10;\xf0\x00\x00\u07d4\x9e\xf1\x89k\x00|2\xa1Q\x14\xfb\x89\xd7=\xbdG\xf9\x12+i\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9f\x01w\x06\xb80\xfb\x9c0\ufc20\x9fPk\x91WEu4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9f\x10\xf2\xa0F;e\xae0\xb0p\xb3\xdf\x18\xcfF\xf5\x1e\x89\xbd\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x9f\x19\xfa\u0223$7\xd8\n\u0183z\v\xb7\x84\x17)\xf4\x97.\x89#=\xf3)\x9far\x00\x00\u07d4\x9f\x1a\xa8\xfc\xfc\x89\xa1\xa52\x8c\xbdcD\xb7\x1f'\x8a,\xa4\xa0\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x9f!0,\xa5\tk\xeat\x02\xb9\x1b\x0f\xd5\x06%O\x99\x9a=\x89C\x97E\x1a\x00=\xd8\x00\x00\u07d4\x9f'\x1d(U\x00\xd78F\xb1\x8fs>%\u074bO]J\x8b\x89'#\xc3F\xae\x18\b\x00\x00\u07d4\x9f4\x97\xf5\xef_\xe60\x95\x83l\x00N\xb9\xce\x02\xe9\x01;K\x89\"V\x86\x1b\xf9\xcf\b\x00\x00\xe0\x94\x9f:t\xfd^~\xdc\xc1\x16)\x93\x17\x13\x81\u02f62\xb7\xcf\xf0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9fF\xe7\xc1\xe9\a\x8c\xae\x860Z\xc7\x06\v\x01F}f\x85\xee\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\x9fIl\xb2\x06\x95c\x14M\b\x11g{\xa0\xe4q:\nAC\x89<\xd2\xe0\xbfc\xa4H\x00\x00\u07d4\x9fJq\x95\xac|\x15\x1c\xa2X\xca\xfd\xa0\u02b0\x83\xe0I\xc6\x02\x89SS\x8c2\x18\\\xee\x00\x00\u07d4\x9fJ\xc9\xc9\xe7\xe2L\xb2DJ\x04T\xfa[\x9a\xd9\xd9-8S\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4\x9f_D\x02kWjJ\xdbA\xe9YaV\x1dA\x03\x9c\xa3\x91\x89\r\x8drkqw\xa8\x00\x00\u07d4\x9f`{?\x12F\x9fDa!\u03bf4u5kq\xb42\x8c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9fa\xbe\xb4o^\x85=\n\x85!\xc7Dnh\xe3L}\ts\x89\x1e[\x8f\xa8\xfe*\xc0\x00\x00\u07d4\x9fd\xa8\xe8\xda\xcfJ\xde0\xd1\x0fMY\xb0\xa3\u056b\xfd\xbft\x8966\x9e\xd7t}&\x00\x00\u07d4\x9ff.\x95'A!\xf1wVncm#\x96L\xf1\xfdho\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9fj2*mF\x99\x81Bj\xe8D\x86]~\xe0\xbb\x15\u01f3\x89\x02\xb5\xeeW\x92\x9f\u06c0\x00\u07d4\x9fy\x86\x92J\xeb\x02h|\xd6A\x89\x18\x9f\xb1g\xde\xd2\xdd\\\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x9fz\x03\x92\xf8Ws.0\x04\xa3u\xe6\xb1\x06\x8dI\xd801\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9f\x82E\u00eb}\x171d\x86\x1c\u04d9\x1b\x94\xf1\xba@\xa9:\x89\x9b\ny\x1f\x12\x110\x00\x00\u07d4\x9f\x83\xa2\x93\xc3$\xd4\x10l\x18\xfa\xa8\x88\x8fd\u0499\x05L\xa0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9f\x86\xa0f\xed\xb6\x1f\xcbXV\u0793\xb7\\\x8cy\x18d\xb9{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9f\x98\xeb4\xd4iy\xb0\xa6\u078b\x05\xaaS:\x89\xb8%\xdc\xf1\x89\x04\xb0m\xbb\xb4\x0fJ\x00\x00\xe0\x94\x9f\x9f\xe0\xc9_\x10\xfe\xe8z\xf1\xaf r6\xc8\xf3aN\xf0/\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x9f\xae\xa1\xc5\xe8\x1ez\xcb?\x17\xf1\xc3Q\xee.\u0649\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa0\b\x01\x98c\xc1\xa7|\x14\x99\xeb9\xbb\u05ff-\u05e3\x1c\xb9\x89\amA\xc6$\x94\x84\x00\x00\u07d4\xa0\t\xbf\ao\x1b\xa3\xfaW\u04a7!r\x18\xbe\xd5VZzz\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa0\x1e\x94v\u07c4C\x18%\xc86\xe8\x80:\x97\xe2/\xa5\xa0\u034a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794\xa0\x1f\x12\xd7\x0fD\xaa{\x11;(\\\"\xdc\xdbE\x874T\xa7\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xa0\x1f\u0450j\x90\x85\x06\xde\xda\xe1\xe2\b\x12\x88r\xb5n\u7489\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa0\"\x82@\xf9\x9e\x1d\xe9\xcb2\xd8,\x0f/\xa9\xa3\xd4K\v\xf3\x89V\xbcu\xe2\xd61\x00\x00\x00\xe0\x94\xa0+\xdedahn\x19\xace\f\x97\r\x06r\xe7m\xcbO\u008a\x01\xe0\x92\x96\xc37\x8d\xe4\x00\x00\u07d4\xa0,\x1e4\x06O\x04u\xf7\xfa\x83\x1c\xcb%\x01L:\xa3\x1c\xa2\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xa0-\u01aa2\x8b\x88\r\u97acTh#\xfc\xcfw@G\xfb\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xa0.?\x8fYY\xa7\xaa\xb7A\x86\x12\x12\x9bp\x1c\xa1\xb8\x00\x10\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa04\u007f\n\x98wc\x90\x16\\\x16m2\x96;\xf7M\xcd\n/\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa05\xa3e$x\xf8-\xbdm\x11_\xaa\x8c\xa9F\xec\x9eh\x1d\x89\x05\xf4\xe4-\u052f\xec\x00\x00\u07d4\xa0:=\xc7\xc53\xd1tB\x95\xbe\x95]a\xaf?R\xb5\x1a\xf5\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xa0E\x9e\xf3i:\xac\xd1d|\xd5\u0612\x989 L\xefS\xbe\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa0O*\xe0*\xdd\x14\xc1/\xafe\xcb%\x90\"\u0403\n\x8e&\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xa0l\xd1\xf3\x969l\ndFFQ\xd7\xc2\x05\xef\xaf8|\xa3\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xa0ri\x1c\x8d\xd7\xcdB7\xffr\xa7\\\x1a\x95\x06\xd0\xce[\x9e\x89\x14\x0e\xc8\x0f\xa7\xee\x88\x00\x00\u07d4\xa0r\u03beb\xa9\xe9\xf6\x1c\xc3\xfb\xf8\x8a\x9e\xfb\xfe>\x9a\x8dp\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa0v\x82\x00\v\x1b\xcf0\x02\xf8\\\x80\xc0\xfa)I\xbd\x1e\x82\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa0z\xa1mt\xae\u8a63(\x8dR\xdb\x15Q\u0553\x882\x97\x89 \x86\xac5\x10R`\x00\x00\u07d4\xa0\x8d![[j\xacHa\xa2\x81\xac~@\vx\xfe\xf0L\xbf\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa0\x95\x19p\xdf\u0403/\xb8;\xda\x12\xc25E\xe7\x90Aul\x89 \x86\xac5\x10R`\x00\x00\u07d4\xa0\x9fM^\xaae\xa2\xf4\xcbu\nI\x924\x01\xda\u5410\xaf\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\xe0\x94\xa0\xa0\xe6R\x04T\x1f\u029b/\xb2\x82\u0355\x13\x8f\xae\x16\xf8\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa0\xaa_\x02\x01\xf0M;\xbe\xb8\x98\x13/|\x11g\x94f\xd9\x01\x89\x01\xfb\xedR\x15\xbbL\x00\x00\u07d4\xa0\xaa\xdb\xd9P\x97\"p_m#X\xa5\u01df7\x97\x0f\x00\xf6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa0\xb7q\x95\x1c\xe1\xde\xee6:\xe2\xb7q\xb7>\a\u0135\xe8\x00\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xa0\xde\\`\x1eif5\u0198\xb7\xae\x9c\xa4S\x9f\u01f9A\xec\x89\x12\xc3\xcb\xd7\x04\xc9w\x00\x00\u07d4\xa0\xe8\xbaf\x1bH\x15L\xf8C\xd4\u00a5\xc0\xf7\x92\xd5(\xee)\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa0\xfc~S\xc5\xeb\xd2z*\xbd\xacE&\x1f\x84\xab;Q\xae\xfb\x89\xa3\x13\xda\xec\x9b\xc0\xd9\x00\x00\xe0\x94\xa0\xff[L\xf0\x16\x02~\x83#I}D(\xd3\xe5\xa8;\x87\x95\x8a\x01e\x98\xd3\xc8>\xc0B\x00\x00\u07d4\xa1\x06F[\xbd\x19\u1dbc\xe5\r\x1b\x11W\xdcY\tZ60\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa1\x06\xe6\x92>\xddS\u028e\xd6P\x96\x8a\x91\b\xd6\xcc\xfd\x96p\x8a\x02\x02\xfe\x15\x05\xaf\uc240\x00\u07d4\xa1\t\u12f0\xa3\x9c\x9e\xf8/\xa1\x95\x97\xfc^\xd8\xe9\xebmX\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4\xa1\x1a\x03\u013b&\xd2\x1e\xffg}]U\\\x80\xb2TS\xeez\x89\x03\xcb'Y\xbcA\x0f\x80\x00\u07d4\xa1\x1e\xff\xabl\xf0\xf5\x97,\xff\xe4\xd5e\x96\xe9\x89h\x14J\x8f\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xa1 M\xad_V\a(\xa3\\\r\x8f\u01d4\x81\x05{\xf7s\x86\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa1&#\xe6)\u07d3\tg\x04\xb1`\x84\xbe,\u061dV-\xa4\x8a\x01\xcc\xc92E\x11\xe4P\x00\x00\xe0\x94\xa1*l-\x98]\xaf\x0eO_ z\xe8Q\xaa\xf7)\xb32\u034a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xa13m\xfb\x96\xb6\xbc\xbeK>\xdf2\x05\xbeW#\xc9\x0f\xadR\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xa1;\x9d\x82\xa9\x9b<\x9b\xbaZ\xe7.\xf2\x19\x9e\xdc};\xb3l\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xa1<\xfe\x82mm\x18A\u072eD;\xe8\u00c7Q\x816\xb5\xe8\x8a\x1d\xa5jK\b5\xbf\x80\x00\x00\xe0\x94\xa1C.\xd2\u01b7wz\x88\xe8\xd4m8\x8epG\u007f \x8c\xa5\x8a\x01\xb1\xa7\xe4\x13\xa1\x96\xc5\x00\x00\u07d4\xa1D\xf6\xb6\x0fr\xd6J!\xe30\xda\xdbb\u0619\n\xde+\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa1P%\xf5\x95\xac\xdb\xf3\x11\x0fw\u017f$G~eH\xf9\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1X\x14\x8a.\x0f>\x92\xdc,\xe3\x8f\xeb\xc2\x01\a\xe3%<\x96\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1a`\x85\x1d+\x9c4\x9b\x92\xe4o\x82\x9a\xbf\xb2\x10\x945\x95\x89a\t=|,m8\x00\x00\u07d4\xa1f\xf9\x11\xc6D\xac2\x13\u049e\x0e\x1a\xe0\x10\xf7\x94\u056d&\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1m\x9e=c\x98aY\xa8\x00\xb4h7\xf4^\x8b\xb9\x80\xee\v\x89n\x11u\xdaz\xd1 \x00\x00\u07d4\xa1pp\xc2\xe9\u0169@\xa4\xec\x0eIT\xc4\xd7\xd6C\xbe\x8fI\x89lk\x17\x03;6\x1c\x80\x00\u07d4\xa1|\x9eC#\x06\x95\x18\x18\x9dR\a\xa0r\x8d\u02d20j?\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa1\x83`\xe9\x85\xf2\x06.\x8f\x8e\xfe\x02\xad,\xbc\x91\xad\x9aZ\xad\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa1\x91\x14\x05\xcfn\x99\x9e\xd0\x11\xf0\xdd\xcd*O\xf7\u008f%&\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xa1\x92i\x80\a\xcc\x11\xaa`=\"\x1d_\xee\xa0v\xbc\xf7\xc3\r\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1\x92\xf0j\xb0R\xd5\xfd\u007f\x94\xee\xa81\x8e\x82x\x15\xfegz\x89\a\x1f\x8a\x93\xd0\x1eT\x00\x00\u07d4\xa1\x99\x81D\x96\x8a\\p\xa6AUT\xce\xfe\u0082F\x90\u0125\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa1\xa1\xf0\xfam \xb5\nyO\x02\xefR\b\\\x9d\x03j\xa6\u028965\u026d\xc5\u07a0\x00\x00\u07d4\xa1\xae\x8dE@\xd4\xdbo\xdd\xe7\x14oA[C\x1e\xb5\\y\x83\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xa1\xb4|M\x0e\xd6\x01\x88B\xe6\xcf\xc8c\n\u00e3\x14.^k\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xa1\xc4\xf4Z\x82\xe1\xc4x\xd8E\b.\xb1\x88u\xc4\xeae9\xab\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xa1\xdc\xd0\xe5\xb0Z\x97|\x96#\xe5\xae/Y\xb9\xad\xa2\xf3>1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa1\xe48\n;\x1ft\x96s\xe2p\"\x99\x93\xeeU\xf3Vc\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1\xf1\x93\xa0Y/\x1f\xeb\x9f\xdf\xc9\n\xa8\x13xN\xb8\x04q\u0249K\xe4\xe7&{j\xe0\x00\x00\u07d4\xa1\xf2\x85@P\xf8re\x8e\xd8.R\xb0\xad{\xbc\x1c\xb9!\xf6\x89m\x03\x17\xe2\xb3&\xf7\x00\x00\u07d4\xa1\xf5\xb8@\x14\rZ\x9a\xce\xf4\x02\xac<\u00c8jh\xca\xd2H\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1\xf7e\xc4O\xe4_y\x06w\x94HD\xbeO-B\x16_\xbd\x89\xc7\xe9\xcf\xdev\x8e\xc7\x00\x00\u07d4\xa1\xf7\xdd\xe1\xd78\xd8\xcdg\x9e\xa1\xee\x96[\xee\"K\xe7\xd0M\x89=\x18DP\xe5\xe9<\x00\x00\u07d4\xa1\xf8\u063c\xf9\x0ew\u007f\x19\xb3\xa6Iu\x9a\xd9P'\xab\xdf\u00c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\x02TrB\x80onp\xe7@X\xd6\xe5)-\xef\xc8\xc8\u0509l\x87T\xc8\xf3\f\b\x00\x00\u07d4\xa2\r\a\x1b\x1b\x000cI}y\x90\xe1$\x9d\xab\xf3l5\xf7\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa2\r\x8f\xf6\f\xaa\xe3\x1d\x02\xe0\xb6e\xfaC]v\xf7|\x94B\x89\x1a\x8a\x90\x9d\xfc\xef@\x00\x00\u07d4\xa2\x11\xda\x03\xcc\x0e1\xec\xceS\t\x99\x87\x18QU(\xa0\x90\u07c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\x14B\xab\x054\n\xdeh\xc9\x15\xf3\xc39\x9b\x99U\xf3\xf7\xeb\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4\xa2\"\"Y\u075c>=\xed\x12p\x84\xf8\b\xe9*\x18\x870,\x89\b\xc83\x9d\xaf\xedH\x00\x00\u07d4\xa2*\xde\r\xdb\\n\xf8\xd0\u034d\xe9M\x82\xb1\x10\x82\xcb.\x91\x897KW\xf3\xce\xf2p\x00\x00\u07d4\xa2L:\xb6!\x81\xe9\xa1[x\xc4b\x1eL|X\x81'\xbe&\x89\b\xcd\xe4:\x83\xd31\x00\x00\u07d4\xa2W\xadYK\u0603(\xa7\xd9\x0f\xc0\xa9\a\u07d5\xee\xca\xe3\x16\x89\x1c7\x86\xff8F\x93\x00\x00\u07d4\xa2[\bd7\xfd!\x92\u0420\xf6On\xd0D\xf3\x8e\xf3\xda2\x89\x12)\x0f\x15\x18\v\xdc\x00\x00\u07d4\xa2v\xb0X\u02d8\u060b\xee\xdbg\xe5CPl\x9a\r\x94p\u0609\x90\xaa\xfcv\xe0/\xbe\x00\x00\u07d4\xa2\x82\xe9i\xca\xc9\xf7\xa0\xe1\xc0\u0350\xf5\xd0\xc48\xacW\r\xa3\x89\"\a\xeb\x89\xfc'8\x00\x00\xe0\x94\xa2\x91\xe9\u01d9\rU-\u046e\x16\u03bc?\xca4,\xba\xf1\u044a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa2\x93\x19\xe8\x10i\xe5\xd6\r\xf0\x0f=\xe5\xad\xee5\x05\xec\xd5\xfb\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa2\x96\x8f\xc1\xc6K\xac\vz\xe0\u058b\xa9I\x87Mm\xb2S\xf4\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xa2\x9d[\xdat\xe0\x03GHr\xbdX\x94\xb8\x853\xffd\u00b5\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa2\x9df\x1acv\xf6m\vt\xe2\xfe\x9d\x8f&\xc0$~\xc8L\x89\xdf3\x04\a\x9c\x13\xd2\x00\x00\u07d4\xa2\xa45\xdeD\xa0\x1b\xd0\ucc9eD\xe4vD\xe4j\f\xdf\xfb\x89\x1b\x1dDZz\xff\xe7\x80\x00\u07d4\xa2\xac\xe4\u0253\xbb\x1eS\x83\xf8\xact\xe1y\x06n\x81O\x05\x91\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa2\xb7\x01\xf9\xf5\xcd\u041eK\xa6+\xae\xba\u3a02W\x10X\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa2\u0145O\xf1Y\x9f\x98\x89,W%\xd2b\xbe\x1d\xa9\x8a\xad\xac\x89\x11\t\xff30\x10\xe7\x80\x00\u07d4\xa2\xc7\xea\xff\xdc,\x9d\x93sE l\x90\x9aR\u07f1LG\x8f\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\u07d4\xa2\u04aabk\t\xd6\xd4\xe4\xb1?\u007f\xfcZ\x88\xbdz\xd3gB\x89\xfb\x80xPuS\x83\x00\x00\u07d4\xa2\u04cd\xe1\xc79\x06\xf6\xa7\xcan\xfe\xb9|\xf6\xf6\x9c\xc4!\xbe\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa2\xdce\xee%kY\xa5\xbdy)wO\x90K5\x8d\U000ed84a\x04\x83\xbc\xe2\x8b\xeb\t\xf8\x00\x00\u07d4\xa2\xe0h:\x80]\xe6\xa0^\xdb/\xfb\xb5\xe9o\x05p\xb67\u00c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa2\u1e2a\x90\x0e\x9c\x13\x9b?\xa1\"5OaV\xd9*\x18\xb1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa2\u2d54\x1e\f\x01\x94K\xfe\x1d_\xb4\xe8\xa3K\x92,\u03f1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\xe4`\xa9\x89\xcb\x15V_\x9e\u0327\xd1!\xa1\x8eN\xb4\x05\xb6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa2\xec\xce,I\xf7*\t\x95\xa0\xbd\xa5z\xac\xf1\xe9\xf0\x01\xe2*\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xa2\xf4r\xfeO\"\xb7}\xb4\x89!\x9e\xa4\x02=\x11X*\x93)\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xa2\xf7\x98\xe0w\xb0}\x86\x12N\x14\a\xdf2\x89\r\xbbKcy\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\xf8k\xc0a\x88N\x9e\xef\x05d\x0e\xddQ\xa2\xf7\xc0Yli\x89llD\xfeG\xec\x05\x00\x00\u07d4\xa2\xfa\x17\xc0\xfbPl\xe4\x94\x00\x8b\x95W\x84\x1c?d\x1b\x8c\xae\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa3\x04X\x8f\r\x85\f\xd8\u04cfv\xe9\xe8<\x1b\xf6>3>\u0789\x02(V\x01!l\x8c\x00\x00\u07d4\xa3\x05\x8cQszN\x96\xc5_.\xf6\xbd{\xb3X\x16~\u00a7\x89 \xdb:\xe4H\x1a\u0500\x00\u07d4\xa3\t\xdfT\u02bc\xe7\f\x95\xec03\x14\x9c\xd6g\x8ao\xd4\u03c9\f\x1f\x12\xc7Q\x01X\x00\x00\u07d4\xa3\nER\x0eR\x06\xd9\x00@p\xe6\xaf>{\xb2\xe8\xddS\x13\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa3\x0e\n\xcbSL\x9b0\x84\xe8P\x1d\xa0\x90\xb4\xeb\x16\xa2\xc0\u0349lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3 0\x95\xed\xb7\x02\x8ehq\xce\n\x84\xf5HE\x9f\x830\n\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa3!\t\x1d0\x18\x06By\xdb9\x9d+*\x88\xa6\xf4@\xae$\x89\xadx\xeb\u016cb\x00\x00\x00\u07d4\xa3#-\x06\x8dP\x06I\x03\xc9\xeb\xc5c\xb5\x15\xac\u0237\xb0\x97\x89l\x87T\xc8\xf3\f\b\x00\x00\xe0\x94\xa3$\x1d\x89\n\x92\xba\xf5)\b\xdcJ\xa0Irk\xe4&\xeb\u04ca\x04<-\xa6a\xca/T\x00\x00\u07d4\xa3)F&\xec)\x84\xc4;C\xdaM]\x8eFi\xb1\x1dKY\x896\xa4\xcfcc\x19\xc0\x00\x00\u07d4\xa3,\xf7\xdd\xe2\f=\xd5g\x9f\xf5\xe3%\x84\\p\u0156&b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa39\xa3\xd8\xca(\x0e'\xd2A[&\xd1\xfcy2(\xb6`C\x896\U00086577\x8f\xf0\x00\x00\u07d4\xa3<\xb4P\xf9[\xb4n%\xaf\xb5\x0f\xe0_\xee\xe6\xfb\x8c\xc8\xea\x89*\x11)\u0413g \x00\x00\u07d4\xa3?p\xdaru\xef\x05q\x04\u07e7\xdbd\xf4r\xe9\xf5\xd5S\x89\x04YF\xb0\xf9\xe9\xd6\x00\x00\u07d4\xa3@v\xf8K\xd9\x17\xf2\x0f\x83B\u024b\xa7\x9eo\xb0\x8e\xcd1\x89\u3bb5sr@\xa0\x00\x00\u07d4\xa3C\x0e\x1fd\u007f2\x1e\xd3G9V##\xc7\xd6#A\vV\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\xa3O\x9dV\x8b\xf7\xaf\xd9L*[\x8a_\xf5\\f\xc4\by\x99\x89\x84}P;\"\x0e\xb0\x00\x00\u07d4\xa3V\x06\xd5\x12 \xee\u007f!F\xd4\x11X.\xe4\xeeJEYn\x89\u062a\xbe\b\v\xc9@\x00\x00\u07d4\xa3VU\x1b\xb7}OE\xa6\xd7\xe0\x9f\n\b\x9ey\u0322I\u02c9\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xa3\\\x19\x13,\xac\x195Wj\xbf\xedl\x04\x95\xfb\a\x88\x1b\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3e\x91\x8b\xfe?&'\xb9\xf3\xa8gu\xd8un\x0f\u0629K\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa3n\r\x94\xb9Sd\xa8&q\xb6\b\xcb-72Ea)\t\x89\b!\xd2!\xb5)\x1f\x80\x00\u07d4\xa3u\xb4\xbc$\xa2N\x1fyu\x93\xcc0+/3\x10c\xfa\\\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa3v\"\xac\x9b\xbd\xc4\xd8+u\x01]t[\x9f\x8d\xe6Z(\uc25d\xc0\\\xce(\u00b8\x00\x00\xe0\x94\xa3y\xa5\a\fP=/\xac\x89\xb8\xb3\xaf\xa0\x80\xfdE\xedK\xec\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\xa3\x80-\x8ae\x9e\x89\xa2\xc4~\x90T0\xb2\xa8'\x97\x89P\xa7\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa3\x83\x06\xcbp\xba\xa8\u4446\xbdh\xaap\xa8=$/)\a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\x84vi\x1d4\x94.\xeak/v\x88\x92#\x04}\xb4az\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\x87\xceN\x96\x1axG\xf5`\a\\d\xe1YkVA\xd2\x1c\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xa3\x87\xec\xde\x0e\xe4\xc8\a\x94\x99\xfd\x8e\x03G;\u060a\xd7R*\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xa3\x88:$\xf7\xf1f _\x1aj\x99I\al&\xa7nqx\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94\xa3\x8b[\xd8\x1a\x9d\xb9\u04b2\x1d^\xc7\xc6\x05R\xcd\x02\xedV\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa3\x90\xca\x12+\x85\x01\xee>^\a\xa8\xcaKA\x9f~M\xae\x15\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xa3\x93*1\xd6\xffu\xfb;\x12q\xac\xe7\u02a7\xd5\xe1\xff\x10Q\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xa3\x94\xadO\xd9\xe6S\x0eo\\S\xfa\xec\xbe\u0781\xcb\x17-\xa1\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\xa3\x97\x9a\x92v\n\x13Z\xdfi\xd7/u\xe1gu_\x1c\xb8\u00c9\x05k\xc7^-c\x10\x00\x00\xe0\x94\xa3\x9b\xfe\xe4\xae\u027du\xbd\"\u01b6r\x89\x8c\xa9\xa1\xe9]2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa3\xa2b\xaf\u0493h\x19#\b\x92\xfd\xe8O-ZYJ\xb2\x83\x89e\xea=\xb7UF`\x00\x00\u07d4\xa3\xa2\xe3\x19\xe7\u04e1D\x8bZ\xa2F\x89S\x16\f-\xbc\xbaq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\xa5{\a\x16\x13(\x04\xd6\n\xac(\x11\x97\xff+=#{\x01\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xa3\xa9>\xf9\xdb\xea&6&=\x06\xd8I/jA\u0790|\"\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\xa3\xae\x18y\x00}\x80\x1c\xb5\xf3RqjM\u063a'!\xde=\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xa3\xba\r:6\x17\xb1\xe3\x1bNB,\xe2i\xe8s\x82\x8d]i\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\xa3\xbc\x97\x9bp\x80\t/\xa1\xf9/n\x0f\xb3G\u2359PE\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xa3\xbf\xf1\u07e9\x97\x16h6\f\r\x82\x82\x842\xe2{\xf5Ng\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa3\xc1J\xce(\xb1\x92\u02f0b\x14_\u02fdXi\xc6rq\xf6\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa3\xc3:\xfc\x8c\xb4pN#\x15=\xe2\x04\x9d5\xaeq3$r\x89+X\xad\u06c9\xa2X\x00\x00\u07d4\xa3\u0430<\xff\xbb&\x9fyj\u009d\x80\xbf\xb0}\xc7\u01ad\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\u0543\xa7\xb6[#\xf6\vy\x05\xf3\xe4\xaab\xaa\xc8\u007fB'\x898\xbe\xfa\x12mZ\x9f\x80\x00\u07d4\xa3\xdb6J3-\x88K\xa9;&\x17\xaeM\x85\xa1H\x9b\xeaG\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xa3\xe0Q\xfbtJ\xa3A\f;\x88\xf8\x99\xf5\xd5\u007f\x16\x8d\xf1-\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\xa3\xe3\xa6\xeaP\x95s\xe2\x1b\xd0#\x9e\xce\x05#\xa7\xb7\u061b/\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xa3\xf4\xad\x14\xe0\xbbD\xe2\xce,\x145\x9cu\xb8\xe72\xd3pT\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa3\xfa\xccP\x19\\\vI3\xc8X\x97\xfe\xcc[\xbd\x99\\4\xb8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa4\x03Z\xb1\xe5\x18\b!\xf0\xf3\x80\xf1\x13\x1bs\x87\xc8\u0641\u0349\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa4\n\xa2\xbb\xce\fr\xb4\xd0\xdf\xff\xccBq[+T\xb0\x1b\xfa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4\x19\xa9\x84\x14#c&uuV`\x894\x0e\xea\x0e\xa2\b\x19\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xa4!\u06f8\x9b:\aA\x90\x84\xad\x10\xc3\xc1]\xfe\x9b2\xd0\u008a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa4\"\xe4\xbf\v\xf7AG\u0309[\xed\x8f\x16\xd3\xce\xf3BaT\x89\x12\xef?b\xee\x116\x80\x00\u07d4\xa4%\x9f\x83E\xf7\u3a37+\x0f\xec,\xf7^2\x1f\xdaM\u0089g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xa4)\b\xe7\xfeS\x98\n\x9a\xbf@D\xe9W\xa5Kp\u973e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa4)\xfa\x88s\x1f\xdd5\x0e\x8e\xcdn\xa5B\x96\xb6HO\u6549j\xc5\xc6-\x94\x86\a\x00\x00\xe0\x94\xa40\x99]\xdb\x18[\x98e\xdb\xe6%9\xad\x90\xd2.Ks\u008a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa46\xc7TS\xcc\xcaJ\x1f\x1bb\xe5\u0123\r\x86\xdd\xe4\xbeh\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa47\xfen\xc1\x03\u028d\x15\x8fc\xb34\"N\u032c[>\xa3\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa4;m\xa6\xcbz\xacW\x1d\xff'\xf0\x9d9\xf8F\xf57i\xb1\x89\x14\x99\x8f2\xacxp\x00\x00\u07d4\xa4;\x81\xf9\x93V\xc0\xaf\x14\x1a\x03\x01\rw\xbd\x04,q\xc1\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa4>\x19G\xa9$+5Ua\xc3\n\x82\x9d\xfe\uc881Z\xf8\x89\xd2=\x99\x96\x9f\u0591\x80\x00\u07d4\xa4H\x9aP\xea\xd5\xd5DZ{\xeeM-U6\u00a7lA\xf8\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa4O\xe8\x00\xd9o\xca\xd7;qp\xd0\xf6\x10\u02cc\x06\x82\xd6\u0389\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa4T2\xa6\xf2\xac\x9dVW{\x93\x8a7\xfa\xba\xc8\xcc|F\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4f\xd7p\u0618\xd8\xc9\xd4\x05\xe4\xa0\xe5Q\xef\xaf\xcd\xe5<\xf9\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\xe0\x94\xa4g\a1\x17X\x93\xbb\xcf\xf4\xfa\x85\u0397\xd9O\xc5\x1cK\xa8\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa4kC\x87\xfbM\xcc\xe0\x11\xe7nMsT}D\x81\xe0\x9b\xe5\x89Hz\x9a0E9D\x00\x00\u07d4\xa4l\xd27\xb6>\xeaC\x8c\x8e;e\x85\xf6y\xe4\x86\b2\xac\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4wy\u063c\x1c{\xce\x0f\x01\x1c\xcb9\xefh\xb8T\xf8\u078f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa4\x82kl8\x82\xfa\xd0\xed\\\x8f\xbb%\xcc@\xccO3u\x9f\x89p\x1bC\xe3D3\xd0\x00\x00\u07d4\xa4\x87Y(E\x8e\xc2\x00]\xbbW\x8c\\\xd35\x80\xf0\xcf\x14R\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4\x9fR:\xa5\x13d\xcb\xc7\u0655\x16=4\xebY\r\xed/\b\x89\x90'B\x1b*\x9f\xbc\x00\x00\u07d4\xa4\xa4\x9f\v\xc8h\x8c\xc9\xe6\xdc\x04\xe1\xe0\x8dR\x10&\xe6Ut\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa4\xa7\xd3\x06\xf5\x10\xcdX5\x94(\xc0\xd2\xf7\xc3`\x9dVt\u05c9\xb5\x8c\xb6\x1c<\xcf4\x00\x00\u07d4\xa4\xa8:\a8y\x9b\x97\x1b\xf2\xdep\x8c.\xbf\x91\x1c\xa7\x9e\xb2\x89 \x86\xac5\x10R`\x00\x00\u07d4\xa4\xb0\x9d\xe6\xe7\x13\xdciTnv\xef\n\xcf@\xb9O\x02A\xe6\x89\x11}\xc0b~\xc8p\x00\x00\xe0\x94\xa4\u04b4)\xf1\xadSI\xe3\x17\x04\x96\x9e\xdc_%\xee\x8a\xca\x10\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xa4\xd6\xc8.\u076eYG\xfb\xe9\xcd\xfb\xd5H\xae3\xd9\x1aq\x91\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa4\xda4E\r\"\xec\x0f\xfc\xed\xe0\x00K\x02\xf7\x87.\xe0\xb7:\x89\x05\x0fafs\xf0\x83\x00\x00\xe0\x94\xa4\xddY\xab^Q}9\x8eI\xfaS\u007f\x89\x9f\xedL\x15\xe9]\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa4\xe6#E\x1e~\x94\xe7\u86e5\xed\x95\u0228:b\xff\xc4\xea\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa4\xed\x11\xb0r\u061f\xb16u\x9f\u019bB\x8cH\xaa]L\xed\x89\x0e?\x15'\xa0<\xa8\x00\x00\u07d4\xa4\xfb\x14@\x9ag\xb4V\x88\xa8Y>\\\xc2\xcfYl\xedo\x11\x89a\t=|,m8\x00\x00\xe0\x94\xa5\x14\xd0\x0e\xddq\b\xa6\xbe\x83\x9ac\x8d\xb2AT\x18\x17A\x96\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\xe0\x94\xa5\"\xde~\xb6\xae\x12PR*Q13\xa9;\xd4(IG\\\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa5$\xa8\xcc\xccIQ\x8d\x17\n2\x82p\xa2\xf8\x813\xfb\xaf]\x89\x0f\xf7\x02-\xac\x10\x8a\x00\x00\u07d4\xa59\xb4\xa4\x01\xb5\x84\xdf\xe0\xf3D\xb1\xb4\"\xc6UC\x16~.\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa5>\xadT\xf7\x85\n\xf2\x148\xcb\xe0z\xf6\x86'\x9a1[\x86\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa5C\xa0f\xfb2\xa8f\x8a\xa0sj\f\x9c\xd4\rx\t\x87'\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa5gw\vj\xe3 \xbd\xdeP\xf9\x04\xd6c\xe7F\xa6\x1d\xac\xe6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa5h\xdbMW\xe4\xd6tb\xd73\u019a\x9e\x0f\xe2n!\x83'\x89;k\xff\x92f\xc0\xae\x00\x00\u07d4\xa5i\x8059\x1eg\xa4\x90\x13\xc0\x00 yY1\x14\xfe\xb3S\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4\xa5p\":\xe3\u02a8QA\x8a\x98C\xa1\xacU\xdbH$\xf4\xfd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa5s`\xf0\x02\xe0\xd6M-tE}\x8c\xa4\x85~\xe0\v\xcd\u07c9\x123\xe22\xf6\x18\xaa\x00\x00\u07d4\xa5u\xf2\x89\x1d\xcf\u0368<\\\xf0\x14t\xaf\x11\xee\x01\xb7-\u0089\x05l\xd5_\xc6M\xfe\x00\x00\u07d4\xa5x;\xf342\xff\x82\xacI\x89\x85\xd7\xd4`\xaeg\xec6s\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xa5\x87MuF5\xa7b\xb3\x81\xa5\xc4\u01d2H:\xf8\xf2=\x1d\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\xa5\xa4\"\u007fl\xf9\x88%\xc0\u057a\xffS\x15u,\xcc\x1a\x13\x91\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa5\xabK\xd3X\x8fF\xcb'.V\xe9=\xee\u04c6\xba\x8bu=\x89HB\xf0A\x05\x87,\x80\x00\xe0\x94\xa5\xba\xd8e\t\xfb\xe0\xe0\xe3\xc0\xe9?m8\x1f\x1a\xf6\xe9\u0501\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa5\xc36\b;\x04\xf9G\x1b\x8cn\xd76y\xb7Mf\xc3c\uc263e\nL\x9d \xe2\x00\x00\u07d4\xa5\xcd\x129\x92\x19K4\xc4x\x13\x140;\x03\xc5IH\xf4\xb9\x89l\xfc\xc3\xd9\x1d\xa5c\x00\x00\u07d4\xa5\u0578\xb6-\x00-\xef\x92A7\x10\xd1;o\xf8\xd4\xfc}\u04c9\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xa5\xd9ni}F5\x8d\x11\x9a\xf7\x81\x9d\xc7\b\u007fj\xe4\u007f\xef\x8a\x03\x17\xbe\xe8\xaf3\x15\xa7\x80\x00\u07d4\xa5\xde^CO\xdc\xddh\x8f\x1c1\xb6\xfbQ,\xb1\x96rG\x01\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xa5\xe0\xfc<:\xff\xed=\xb6q\tG\xd1\xd6\xfb\x01\u007f>'m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa5\xe9;I\xea|P\x9d\xe7\xc4Ml\xfe\xdd\xefY\x10\u07aa\xf2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa5\xe9\xcdKt%]\"\xb7\u0672z\xe8\xddC\xedn\xd0%+\x89)\x8d\xb2\xf5D\x11\u0640\x00\xe0\x94\xa5\xf0\a{5\x1flP\\\xd5\x15\u07e6\xd2\xfa\u007f\\L\u0487\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xa5\xf0u\xfd@\x135W{f\x83\u0081\xe6\xd1\x01C-\xc6\xe0\x89\x91Hx\xa8\xc0^\xe0\x00\x00\u07d4\xa5\xfe,\xe9\u007f\x0e\x8c8V\xbe\r\xe5\xf4\u0732\xce]8\x9a\x16\x89\x01=\xb0\xb8\xb6\x86>\x00\x00\u07d4\xa5\xffb\"-\x80\xc0\x13\xce\xc1\xa0\xe8\x85\x0e\xd4\xd3T\xda\xc1m\x89\vA\a\\\x16\x8b\x18\x00\x00\u07d4\xa6\t\xc2m\xd3P\xc25\xe4K+\x9c\x1d\xdd\xcc\u0429\xd9\xf87\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa6\f\x12\tuO]\x87\xb1\x81\xdaO\b\x17\xa8\x18Y\xef\x9f\u0609\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\xa6\x10\x1c\x96\x1e\x8e\x1c\x15y\x8f\xfc\xd0\xe3 \x1dw\x86\xec7:\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xa6\x13Ei\x96@\x8a\xf1\xc2\xe9>\x17w\x88\xabU\x89^+2\x8a\x01Y\x19\xffG|\x88\xb8\x00\x00\u07d4\xa6\x18\x87\x81\x8f\x91J \xe3\x10w)\v\x83qZk-n\xf9\x89e\xea=\xb7UF`\x00\x00\u07d4\xa6\x1aT\xdfxJD\xd7\x1bw\x1b\x871u\t!\x13\x81\xf2\x00\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa6\x1c\u06ed\xf0K\x1eT\u0203\xde`\x05\xfc\xdf\x16\xbe\xb8\xeb/\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa69\xac\xd9k1\xbaS\xb0\u0407c\"\x9e\x1f\x06\xfd\x10^\x9d\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa6BP\x10\x04\xc9\x0e\xa9\xc9\xed\x19\x98\xba\x14\nL\xd6,o_\x89\r\x94\xfb\x8b\x10\xf8\xb1\x80\x00\u07d4\xa6D\xed\x92,\xc27\xa3\xe5\u0117\x9a\x99Tw\xf3nP\xbcb\x89\x1f\xa7=\x84]~\x96\x00\x00\u07d4\xa6F\xa9\\moY\xf1\x04\xc6T\x1dw`uz\xb3\x92\xb0\x8c\x89\u3bb5sr@\xa0\x00\x00\xe0\x94\xa6HL\u0184\xc4\xc9\x1d\xb5>\xb6\x8aM\xa4Zjk\xda0g\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa6N_\xfbpL,\x919\xd7~\xf6\x1d\x8c\u07e3\x1dz\x88\xe9\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\xe0\x94\xa6T&\xcf\xf3x\xed#%5\x13\xb1\x9fIm\xe4_\xa7\u13ca\x01\x86P\x12|\xc3\u0700\x00\x00\u07d4\xa6jIc\xb2\u007f\x1e\xe1\x93+\x17+\xe5\x96N\r:\xe5KQ\x89\t`\xdbwh\x1e\x94\x00\x00\u07d4\xa6\u007f8\x81\x95eB:\xa8_>:\xb6\x1b\xc7c\u02eb\x89\u0749sw\xb0\"\u01be\b\x00\x00\u07d4\xa6\x8c14E\xc2-\x91\x9e\xe4l\xc2\xd0\xcd\xff\x04:uX%\x89\x04\x13t\xfd!\xb0\u0600\x00\u07d4\xa6\x8e\f0\u02e3\xbcZ\x88>T\x03 \xf9\x99\xc7\xcdU\x8e\\\x89a\x9237b\xa5\x8c\x80\x00\u07d4\xa6\x90\xf1\xa4\xb2\n\xb7\xba4b\x86 \u079c\xa0@\xc4<\x19c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa6\x9d|\xd1}HB\xfe\x03\xf6*\x90\xb2\xfb\xf8\xf6\xaf{\xb3\x80\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa6\xa0\x82R\xc8YQw\xcc.`\xfc'Y>#y\xc8\x1f\xb1\x89\x01\x16Q\xac>zu\x80\x00\u07d4\xa6\xa0\xdeB\x1a\xe5Om\x17(\x13\b\xf5dm/9\xf7w]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa6\xb2\xd5s)s`\x10,\a\xa1\x8f\xc2\x1d\xf2\xe7I\x9f\xf4\xeb\x89\xd9o\u0390\u03eb\xcc\x00\x00\xe0\x94\xa6\xc9\x10\xceMIJ\x91\x9c\u036a\xa1\xfc;\x82\xaat\xba\x06\u03ca\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa6\u3ea3\x8e\x10J\x1e'\xa4\xd8(i\xaf\xb1\xc0\xaen\xff\x8d\x89\x01\x11@\ueb4bq\x00\x00\u07d4\xa6\xee\xbb\xe4d\u04d1\x87\xbf\x80\u029c\x13\xd7 '\xec[\xa8\xbe\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa6\xf6+\x8a=\u007f\x11\"\a\x01\xab\x9f\xff\xfc\xb3'\x95\x9a'\x85\x89\x1bn)\x1f\x18\u06e8\x00\x00\u07d4\xa6\xf93\a\xf8\xbc\xe01\x95\xfe\u0387 C\xe8\xa0?{\xd1\x1a\x89\x9csK\xadQ\x11X\x00\x00\u07d4\xa7\x01\xdfy\xf5\x94\x90\x1a\xfe\x14DH^k \u00fd\xa2\xb9\xb3\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa7\x02L\xfdt,\x1e\xc1<\x01\xfe\xa1\x8d0B\xe6_\x1d]\xee\x8a\x02c\x11\x9a(\xab\u0430\x80\x00\u07d4\xa7\x18\xaa\xadY\xbf9\\\xba+#\xe0\x9b\x02\xfe\f\x89\x81bG\x8960<\x97\xe4hx\x00\x00\u07d4\xa7$|S\xd0Y\xeb|\x93\x10\xf6(\xd7\xfclj\nw?\b\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xa7%7c\xcfJu\u07d2\xca\x1evm\xc4\xee\x8a'E\x14{\x8a\x02F7p\xe9\n\x8fP\x00\x00\u07d4\xa7.\xe6f\u0133^\x82\xa5\x06\x80\x8bD<\xeb\xd5\xc62\xc7\u0749+^:\xf1k\x18\x80\x00\x00\u07d4\xa7DD\xf9\x0f\xbbT\xe5o:\u0276\xcf\u032aH\x19\xe4aJ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa7GC\x9a\xd0\u04d3\xb5\xa08a\xd7r\x962m\u8edd\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa7`{BW;\xb6\xf6\xb4\xd4\xf2<~*&\xb3\xa0\xf6\xb6\xf0\x89WG=\x05\u06ba\xe8\x00\x00\xe0\x94\xa7i)\x89\n{G\xfb\x85\x91\x96\x01lo\u0742\x89\u03b7U\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u0794\xa7kt?\x98\x1bi0r\xa11\xb2+\xa5\x10\x96\\/\xef\u05c8\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xa7m?\x15bQ\xb7,\f\xcfKG\xa39<\xbdoI\xa9\u0149Hz\x9a0E9D\x00\x00\u07d4\xa7t(\xbc\xb2\xa0\xdbv\xfc\x8e\xf1\xe2\x0eF\x1a\n2\u016c\x15\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xa7u\x8c\xec\xb6\x0e\x8faL\u0396\x13~\xf7+O\xbd\awJ\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa7w^J\xf6\xa2:\xfa \x1f\xb7\x8b\x91^Q\xa5\x15\xb7\xa7(\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4\xa7\u007f>\u1793\x88\xbb\xbb\"\x15\xc6#\x97\xb9e`\x13#`\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa7\x85\x9f\xc0\u007fun\xa7\xdc\xeb\xbc\xcdB\xf0X\x17X-\x97?\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa7\x96lH\x9fLt\x8az\u902a'\xa5t%\x17g\xca\xf9\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa7\xa3\xbba9\xb0\xad\xa0\f\x1f\u007f\x1f\x9fV\u0654\xbaM\x1f\xa8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa7\xa3\xf1S\xcd\u00c8!\xc2\f]\x8c\x82A\xb2\x94\xa3\xf8+$\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa7\xa5\x17\u05ed5\x82\v\t\u0517\xfa~U@\xcd\xe9IXS\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa7\xc9\u04c8\xeb\xd8s\xe6k\x17\x13D\x83\x97\xd0\xf3\u007f\x8b\u04e8\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xa7\u073b\xa9\xb9\xbfgb\xc1EAlPjq\u3d17 \x9c\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xa7\xe7O\v\xdb'\x8f\xf0\xa8\x05\xa6Ha\x8e\xc5+\x16o\xf1\xbe\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa7\xe87r\xbc \x0f\x90\x06\xaa*&\r\xba\xa8H=\xc5+0\x89\vB\xd56f7\xe5\x00\x00\xe0\x94\xa7\xef5\u0387\xed\xa6\u008d\xf2HxX\x15\x05>\xc9zPE\x8a\x01\x0f\f\xe9I\xe0\x0f\x93\x00\x00\u07d4\xa7\xf9\"\f\x80G\x82k\xd5\xd5\x18?Ngjmw\xbf\xed6\x89\bPh\x97k\xe8\x1c\x00\x00\u07d4\xa8\a\x10O'\x03\xd6y\xf8\u07af\xc4B\xbe\xfe\x84\x9eB\x95\v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa8\f\xb1s\x8b\xac\b\xd4\xf9\xc0\x8bM\xef\xf5\x15T_\xa8XO\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa8\x19\xd2\xec\xe1\"\xe0(\xc8\xe8\xa0J\x06M\x02\xb9\x02\x9b\b\xb9\x8965\u026d\xc5\u07a0\x00\x00\u0794\xa8%\xfdZ\xbby&\xa6|\xf3k\xa2F\xa2K\xd2{\xe6\xf6\xed\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4\xa8(U9\x86\x9d\x88\xf8\xa9aS7Uq}~\xb6Uv\xae\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa83\x82\xb6\xe1Rg\x97J\x85P\xb9\x8fqv\xc1\xa3S\xf9\xbe\x89\xbf\xfd\xaf/\xc1\xb1\xa4\x00\x00\xe0\x94\xa8DlG\x81\xa77\xacC(\xb1\xe1[\x8a\v?\xbb\x0f\xd6h\x8a\x04\x87\x94\xd1\xf2F\x19*\x00\x00\u07d4\xa8E[A\x17e\u0590\x1e1\x1erd\x03\t\x1eB\xc5f\x83\x89\xb7:\xec;\xfe\x14P\x00\x00\xe0\x94\xa8f\x13\xe6\u0124\xc9\xc5_\\\x10\xbc\xda2\x17]\u02f4\xaf`\x8a\x02C\xd6\xc2\xe3k\xe6\xae\x00\x00\u07d4\xa8m\xb0}\x9f\x81/G\x96b-@\xe0=\x13Xt\xa8\x8at\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa8\u007fz\xbdo\xa3\x11\x94(\x96x\xef\xb6<\xf5\x84\xee^*a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xa8\x80\u2a3f\x88\xa1\xa8&H\xb4\x01W\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa8\x9d\xf3HY\xed\xd7\xc8 \u06c8w@\xd8\xff\x9e\x15\x15|{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa8\xa4<\x00\x91\x00al\xb4\xaeN\x03?\x1f\xc5\xd7\xe0\xb6\xf1R\x89\u0548\xd0x\xb4?M\x80\x00\u07d4\xa8\xa7\b\xe8O\x82\u06c6\xa3U\x02\x19;Ln\xe9\xa7n\xbe\x8f\x897\b\xba\xed=h\x90\x00\x00\xe0\x94\xa8\xa7\xb6\x8a\u06b4\xe3\xea\xdf\xf1\x9f\xfaX\xe3J?\xce\xc0\xd9j\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xa8\xa8\xdb\xdd\x1a\x85\u047e\xee%i\xe9\x1c\xccM\t\xae\u007fn\xa1\x8a\x01:k+VHq\xa0\x00\x00\u07d4\xa8\xac\xa7H\xf9\xd3\x12\xect\u007f\x8bex\x14&\x94\xc7\xe9\xf3\x99\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa8\xb6[\xa3\x17\x1a?w\xa65\v\x9d\xaf\x1f\x8dU\xb4\xd2\x01\xeb\x89(b\xf3\xb0\xd2\"\x04\x00\x00\u07d4\xa8\xbe\xb9\x1c+\x99\u0216J\xa9[kJ\x18K\x12i\xfc4\x83\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u0794\xa8\xc0\xb0/\xaf\x02\xcbU\x19\u0768\x84\xde{\xbc\x8c\x88\xa2\u0681\x88\xe7\xc2Q\x85\x05\x06\x00\x00\u07d4\xa8\xc1\u05aaA\xfe=e\xf6{\xd0\x1d\xe2\xa8f\xed\x1e\u066eR\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\xa8\xca\xfa\xc3\"\x80\xd0!\x02\v\xf6\xf2\xa9x(\x83\u05ea\xbe\x12\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa8\xdb\v\x9b \x14S3A<;\fb\xf5\xf5.\u0544\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa8\xf3\u007f\n\xb3\xa1\xd4H\xa9\xe3\xce@\x96_\x97\xa6F\b:4\x89\x11\xe0\xe4\xf8\xa5\v\xd4\x00\x00\u07d4\xa8\xf8\x9d\xd5\xccnd\u05f1\xee\xac\xe0\a\x02\x02,\xd7\xd2\xf0=\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94\xa9\x04v\xe2\xef\xdf\xeeO8{\x0f2\xa5\x06x\xb0\xef\xb5s\xb5\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa9\x14PF\xfa6(\xcf_\xd4\xc6\x13\x92{\xe51\xe6\xdb\x1f\u0749\x06\x12O\xee\x99;\xc0\x00\x00\u07d4\xa9\x14\u0375q\xbf\xd9=d\xdaf\xa4\xe1\b\xea\x13NP\xd0\x00\x89M\x878\x99G\x13y\x80\x00\xe0\x94\xa9\x1aZ{4\x1f\x99\xc55\x14N \xbe\x9ck;\xb4\u008eM\x8a\x01&u:\xa2$\xa7\v\x00\x00\u07d4\xa9%%Q\xa6$\xaeQ7\x19\u06beR\a\xfb\xef\xb2\xfdwI\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xa9'\u050b\xb6\u02c1K\xc6\t\xcb\u02a9\x15\x1f]E\x9a'\xe1\x89\x0e\xb95\t\x00d\x18\x00\x00\u07d4\xa9)\u023dq\xdb\f0\x8d\xac\x06\b\n\x17G\xf2\x1b\x14e\xaa\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa9K\xbb\x82\x14\u03cd\xa0\xc2\xf6h\xa2\xacs\xe8bHR\x8dK\x894\n\xad!\xb3\xb7\x00\x00\x00\u07d4\xa9Q\xb2D\xffP\u03eeY\x1d^\x1a\x14\x8d\xf6\xa98\xef*\x1a\x89^\x00\x15\x84\xdf\xcfX\x00\x00\u07d4\xa9`\xb1\xca\xdd;\\\x1a\x8el\xb3\xab\xca\xf5.\xe7\xc3\xd9\xfa\x88\x89R\x8b\xc3T^Rh\x00\x00\u07d4\xa9a\x17\x1fSB\xb1s\xddp\xe7\xbf\xe5\xb5\xca#\x8b\x13\xbc\u0749\xb8'\x94\xa9$O\f\x80\x00\u07d4\xa9u\xb0w\xfc\xb4\u030e\xfc\xbf\x83\x84Y\xb6\xfa$:AY\u0589\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xa9{\xeb:H\xc4_\x15((L\xb6\xa9_}\xe4S5\x8e\u018a\x06\x90\x83l\n\xf5\xf5`\x00\x00\u07d4\xa9~\a!DI\x9f\xe5\xeb\xbd5J\xcc~~\xfbX\x98]\b\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xa9\x86v/zO)O.\v\x172y\xad,\x81\xa2\"4X\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa9\x8f\x10\x985\xf5\xea\xcd\x05Cd|4\xa6\xb2i\xe3\x80/\xac\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa9\x97\xdf\u01d8j'\x05\bH\xfa\x1cd\u05e7\xd6\xe0z\u0322\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\u07d4\xa9\x99\x91\u03bd\x98\xd9\xc88\xc2_zt\x16\xd9\xe2D\xca%\r\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa9\xa1\xcd\xc3;\xfd7o\x1c\rv\xfbl\x84\xb6\xb4\xac'Mh\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xa9\xa8\xec\xa1\x1a#\xd6F\x89\xa2\xaa>A}\xbb=3k\xb5\x9a\x89\x0e4S\xcd;g\xba\x80\x00\u07d4\xa9\xac\xf6\x00\b\x1b\xb5[\xb6\xbf\xba\xb1\x81_\xfcN\x17\xe8Z\x95\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa9\xad\x19&\xbcf\xbd\xb31X\x8e\xa8\x197\x88SM\x98,\x98\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\xa9\xaf!\xac\xbeH/\x811\x89j\"\x806\xbaQ\xb1\x94S\u00c9\x02\xb5\xe0!\x98\f\xc1\x80\x00\xe0\x94\xa9\xb2\xd2\xe0IN\xab\x18\xe0}7\xbb\xb8V\xd8\x0e\x80\xf8L\u04ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa9\xbaoA;\x82\xfc\xdd\xf3\xaf\xfb\xbd\u0412\x87\xdc\xf5\x04\x15\u0289\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa9\xbe\x88\xad\x1eQ\x8b\v\xbb\x02J\xb1\xd8\xf0\xe7?y\x0e\fv\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xa9\xbf\xc4\x10\xdd\xdb q\x1eE\xc0s\x87\xea\xb3\n\x05N\x19\xac\x89>\x99`\x1e\xdfNS\x00\x00\u07d4\xa9\u0522\xbc\xbe[\x9e\bi\xd7\x0f\x0f\xe2\xe1\u05aa\xcdE\xed\u0149\n\xc6\xe7z\xb6c\xa8\x00\x00\xe0\x94\xa9\xd6KO;\xb7\x85\a\"\xb5\x8bG\x8b\xa6\x917^\"NB\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa9\xd6\xf8q\xcax\x1au\x9a \xac:\u06d7,\xf1()\xa2\b\x892$\xf4'#\xd4T\x00\x00\xe0\x94\xa9\xdc\x04$\u0196\x9dy\x83X\xb3\x93\xb1\x93:\x1fQ\xbe\xe0\n\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa9\xe1\x94f\x1a\xacpN\xe9\u07a0C\x97N\x96\x92\xde\xd8J]\x89\x1a&\xa5\x14\"\xa0p\x00\x00\u07d4\xa9\xe2\x837\xe65q\x93\xd9\xe2\xcb#k\x01\xbeD\xb8\x14'\u07c9wC\"\x17\xe6\x83`\x00\x00\u07d4\xa9\xe6\xe2^ekv%Xa\x9f\x14z!\x98[\x88t\xed\xfe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa9\xe9\xdb\xcez,\xb06\x94y\x98\x97\xbe\xd7\xc5M\x15_\u06a8\x89\n\xb5\xae\x8f\u025de\x80\x00\u07d4\xa9\xed7{}n\xc2Yq\xc1\xa5\x97\xa3\xb0\xf3\xbe\xadW\u024f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xaa\x02\x00\xf1\xd1~\x9cT\xda\x06G\xbb\x969]W\xa7\x858\u06099>\xf1\xa5\x12|\x80\x00\x00\u07d4\xaa\f\xa3ss7\x17\x8a\f\xaa\xc3\t\x9cXK\x05lV0\x1c\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xaa\x13kG\x96+\xb8\xb4\xfbT\r\xb4\xcc\xf5\xfd\xd0B\xff\xb8\u03c9\x1b\x1bk\u05efd\xc7\x00\x00\xe0\x94\xaa\x14B-o\n\xe5\xa7X\x19N\xd1W\x80\xc88\xd6\u007f\x1e\xe1\x8a\x06\t2\x05lD\x9d\xe8\x00\x00\u07d4\xaa\x16&\x9a\xac\x9c\r\x800h\xd8/\u01d1Q\xda\xdd3Kf\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xaa\x16p&\u04da\xb7\xa8V5\x94N\xd9\xed\xb2\xbf\xeb\xa1\x18P\x8a\x01\xc1\xd5\xe2\x1bO\xcfh\x00\x00\u07d4\xaa\x1b7h\xc1m\x82\x1fX\x0ev\xc8\xe4\xc8\xe8m}\u01c8S\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xaa\x1d\xf9.Q\xdf\xf7\v\x19s\xe0\xe9$\xc6b\x87\xb4\x94\xa1x\x89\x1c\xf8J0\xa0\xa0\xc0\x00\x00\u07d4\xaa,g\x00\x96\xd3\xf990S%B~\xb9U\xa8\xa6\r\xb3\u0149l\x95Y\x06\x99#-\x00\x00\u07d4\xaa15\xcbT\xf1\x02\xcb\xef\xe0\x9e\x96\x10:\x1ayg\x18\xffT\x89\x03\"\"\xd9\xc31\x94\x00\x00\u07d4\xaa2\x1f\xdb\xd4I\x18\r\xb8\xdd\xd3O\x0f\xe9\x06\xec\x18\xee\t\x14\x89%\"H\u07b6\xe6\x94\x00\x00\xe0\x94\xaa9%\xdc\"\v\xb4\xae!w\xb2\x880x\xb6\xdc4l\xa1\xb2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xaa?)`\x1a\x131t^\x05\xc4(0\xa1^q\x93\x8ab7\x89\\(=A\x03\x94\x10\x00\x00\xe0\x94\xaaG\xa4\xff\xc9y622\u025b\x99\xfa\xda\x0f'4\xb0\xae\xee\x8a\x01\xb8H\x9d\xf4\xdb\xff\x94\x00\x00\u07d4\xaaI=?O\xb8fI\x1c\xf8\xf8\x00\xef\xb7\xe22N\xd7\xcf\xe5\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xaaV\xa6]\u012b\xb7/\x11\xba\xe3+o\xbb\aDG\x91\xd5\u0249(\x94\xe9u\xbfIl\x00\x00\xe0\x94\xaaZ\xfc\xfd\x83\t\xc2\u07dd\x15\xbe^jPN}pf$\u014a\x01<\xf4\"\xe3\x05\xa17\x80\x00\u07d4\xaa\x8e\xb0\x82;\a\xb0\xe6\xd2\n\xad\xda\x0e\x95\xcf85\xbe\x19.\x89\x01\xbc\x16\xd6t\xec\x80\x00\x00\u07d4\xaa\x91#~t\r%\xa9/\u007f\xa1F\xfa\xa1\x8c\xe5m\xc6\xe1\xf3\x892$\xf4'#\xd4T\x00\x00\u07d4\xaa\x96\x0e\x10\xc5#\x91\xc5N\x158|\xc6z\xf8'\xb51m\u0309lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\x9b\xd4X\x955\xdb'\xfa+\xc9\x03\xca\x17\xd6y\xddeH\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\xa8\xde\xfe\x11\xe3a?\x11\x06\u007f\xb9\x83bZ\b\x99Z\x8d\xfc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xaa\xaa\xe6\x8b2\x14\x02\xc8\xeb\xc14h\xf3A\xc6<\f\xf0?\u0389Rf<\u02b1\xe1\xc0\x00\x00\u07d4\xaa\xad\x1b\xaa\xdeZ\xf0N+\x17C\x9e\x93Y\x87\xbf\x8c+\xb4\xb9\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xaa\xb0\n\xbfX(\xd7\xeb\xf2kG\u03ac\u0378\xba\x032Qf\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xaa\xbd\xb3\\\x15\x14\x98J\x03\x92\x13y?3E\xa1h\xe8\x1f\xf1\x89\x10\xca\u0216\xd29\x00\x00\x00\u07d4\xaa\xca`\xd9\xd7\x00\u7156\xbb\xbb\xb1\xf1\xe2\xf7\x0fF'\xf9\u060965\xbbw\xcbK\x86\x00\x00\u07d4\xaa\xce\u0629V;\x1b\xc3\x11\xdb\xdf\xfc\x1a\xe7\xf5u\x19\xc4D\f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\u04b7\xf8\x10f\x95\a\x8el\x13\x8e\xc8\x1at\x86\xaa\xca\x1e\xb2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xaa\xe6\x1eC\xcb\r\f\x96\xb3\x06\x99\xf7~\x00\xd7\x11\u0423\x97\x9b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xaa\xe72\xed\xa6Y\x88\u00e0\f\u007fG/5\x1cF;\x1c\x96\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\xf0#\xfe\U0009091b\xb7\x8b\xb7\xab\xc9]f\x9cP\xd5(\xb0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xaa\xf5\xb2\a\xb8\x8b\r\xe4\xac@\xd7G\xce\xe0n\x17-\xf6\xe7E\x8a\x06\xa7\xb7\x1d\u007fQ\u0410\x00\x00\u07d4\xaa\xf9\xeeK\x88lm\x1e\x95Io\xd2t#[\xf4\xec\xfc\xb0}\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xaa\xfb{\x01:\xa1\xf8T\x1c~2{\xf6P\xad\xbd\x19L \x8f\x89I\x9e\t-\x01\xf4x\x00\x00\xe0\x94\xab\t\x863\xee\xee\f\xce\xfd\xf62\xf9WTV\xf6\u0740\xfc\x86\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xab\f\xedv.\x16a\xfa\xe1\xa9*\xfb\x14\b\x88\x94\x13yH%\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\xab\x14\xd2!\xe3=TF)\x19\x8c\u0416\xedc\u07e2\x8d\x9fG\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xab \x9f\u0729y\u0426G\x01\n\xf9\xa8\xb5/\xc7\xd2\r\x8c\u044a\x01\xee\xe2S,|-\x04\x00\x00\u07d4\xab'\xbax\xc8\xe5\xe3\xda\xef1\xad\x05\xae\xf0\xff\x03%r\x1e\b\x89\x19^\xce\x00n\x02\xd0\x00\x00\u07d4\xab(q\xe5\a\u01fe9eI\x8e\x8f\xb4b\x02Z\x1a\x1cBd\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4\xab8a\"o\xfe\xc1(\x91\x87\xfb\x84\xa0\x8e\xc3\xed\x042d\xe8\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xab=\x86\xbc\x82\x92~\f\xd4!\xd1F\xe0\u007f\x91\x93'\xcd\xf6\xf9\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\xab>b\xe7z\x8b\"^A\x15\x92\xb1\xaf0\aR\xfeA$c\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xab>x)K\xa8\x86\xa0\xcf\xd5\xd3H\u007f\xb3\xa3\a\x8d3\x8dn\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xab@\x04\xc0@?~\xab\xb0\xeaXo!!V\xc4 =g\xf1\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xabAo\xe3\rX\xaf\xe5\xd9EL\u007f\xce\u007f\x83\v\xccu\x03V\x89\x0657\x01\xc6\x05\u06c0\x00\u07d4\xabEr\xfb\xb1\xd7+W]i\xecj\xd1s3\x87>\x85R\xfc\x89lj\xc5L\xdahG\x00\x00\u07d4\xabZy\x01av2\ts\xe8\xcd8\xf67U0\x02%1\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xab]\xfc\x1e\xa2\x1a\xdcB\u03cc?n6\x1e$?\xd0\xdaa\xe5\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xabke\xea\xb8\xdf\xc9\x17\xec\x02Q\xb9\xdb\x0e\u03e0\xfa\x03(I\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xabp\x91\x93.K\u00dd\xbbU#\x80\u0293O\xd7\x16m\x1en\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\xabt\x16\xff2%IQ\u02fcbN\xc7\xfbE\xfc~\u02a8r\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xab|B\xc5\xe5-d\x1a\a\xadu\t\x9cb\x92\x8b\u007f\x86b/\x89\x126\x1a\xa2\x1d\x14\xba\x00\x00\u07d4\xab}T\xc7\xc6W\x0e\xfc\xa5\xb4\xb8\xcep\xf5*Ws\xe5\xd5;\x89\x0f(:\xbe\x9d\x9f8\x00\x00\u07d4\xab~\v\x83\xed\x9aBLm\x1ejo\x87\xa4\xdb\xf0d\t\xc7\u0589\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xab\x84\xa0\xf1G\xad&T\x00\x00+\x85\x02\x9aA\xfc\x9c\xe5\u007f\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xab\x93\xb2n\xce\n\n\xa2\x13e\xaf\xed\x1f\xa9\xae\xa3\x1c\xd5Dh\x89W+{\x98sl \x00\x00\u07d4\xab\x94\x8aJ\xe3y\\\xbc\xa11&\xe1\x92S\xbd\xc2\x1d:\x85\x14\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xab\x9a\xd3n\\t\xce.\x969\x9fW\x83\x941\xd0\u77d6\xab\x89\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4\xab\xb2\xe6\xa7*@\xban\xd9\b\u037c\xec\x91\xac\xfdwx0\xd1dcG\x8a\xe0\xfcw \x89\a?u\u0460\x85\xba\x00\x00\xe0\x94\xab\u071f\x1b\xcfM\x19\xee\x96Y\x100\xe7r\xc340/}\x83\x8a\b~^\x11\xa8\x1c\xb5\xf8\x00\x00\u07d4\xab\xde\x14{*\xf7\x89\ua946T~f\xc4\xfa&d\xd3(\xa4\x89\rk`\x81\xf3L\x12\x80\x00\xe0\x94\xab\xe0|\xedj\xc5\xdd\xf9\x91\xef\xf6\xc3\xda\"jt\x1b\xd2C\xfe\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xab\xf1/\xa1\x9e\x82\xf7lq\x8f\x01\xbd\xca\x00\x03gE#\xef0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xab\xf7(\u03d3\x12\xf2!(\x02NpF\xc2Q\xf5\xdcY\x01\xed\x8a\x06A\xe8\xa15c\xd8\xf8\x00\x00\u07d4\xab\xf8\xff\xe0p\x8a\x99\xb5(\xcc\x1e\xd4\xe9\xceK\r\x060\xbe\x8c\x89z\xb5\u00ae\xee\xe68\x00\x00\u07d4\xab\xfc\xf5\xf2P\x91\xceW\x87_\xc6t\xdc\xf1\x04\xe2\xa7=\xd2\xf2\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xab\xfe\x93d%\xdc\u01f7K\x95P\x82\xbb\xaa\xf2\xa1\x1dx\xbc\x05\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xac\x02OYO\x95X\xf0ICa\x8e\xb0\xe6\xb2\xeeP\x1d\xc2r\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\x12*\x03\xcd\x05\x8c\x12._\xe1{\x87/Hw\xf9\u07d5r\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xac\x14.\xda\x11W\xb9\xa9\xa6C\x90\xdf~j\xe6\x94\xfa\u0249\x05\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xac\x1d\xfc\x98Kq\xa1\x99)\xa8\x1d\x81\xf0J|\xbb\x14\a7\x03\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xac!\xc1\xe5\xa3\xd7\xe0\xb5\x06\x81g\x9d\xd6\u01d2\xdb\u0287\xde\u02ca\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xac(\x89\xb5\x96o\f\u007f\x9e\xdbB\x89\\\xb6\x9d\x1c\x04\xf9#\xa2\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xac(\xb5\xed\xea\x05\xb7o\x8c_\x97\bEA'|\x96ijL\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xac,\x8e\t\xd0d\x93\xa68XC{\xd2\v\xe0\x19bE\x03e\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xac.vm\xac?d\x8fcz\xc6q?\u0770h\xe4\xa4\xf0M\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\xac9\x00)\x8d\xd1M|\xc9mJ\xbbB\x8d\xa1\xba\xe2\x13\xff\xed\x8a\x05<\xa1)t\x85\x1c\x01\x00\x00\u07d4\xac=\xa5&\xcf\u0388)s\x02\xf3LI\xcaR\r\xc2q\xf9\xb2\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xacD`\xa7nm\xb2\xb9\xfc\xd1R\xd9\xc7q\x8d\x9a\xc6\xed\x8co\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xacJ\xcf\xc3n\xd6\tJ'\xe1\x18\xec\xc9\x11\xcdG>\x8f\xb9\x1f\x89a\x91>\x14@<\f\x00\x00\u07d4\xacL\xc2V\xaet\xd6$\xac\xe8\r\xb0x\xb2 \u007fW\x19\x8fk\x89lyt\x12?d\xa4\x00\x00\u07d4\xacN\xe9\xd5\x02\xe7\xd2\xd2\xe9\x9eY\xd8\xca}_\x00\xc9KM\u058965\u026d\xc5\u07a0\x00\x00\u07d4\xacR\xb7~\x15fH\x14\xf3\x9eO'\x1b\xe6A0\x8d\x91\xd6\u0309\v\xed\x1d\x02c\xd9\xf0\x00\x00\u07d4\xacY\x99\xa8\x9d-\u0486\u0568\fm\xee~\x86\xaa\xd4\x0f\x9e\x12\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xac_br1H\r\r\x950.m\x89\xfc2\xcb\x1dO\xe7\xe3\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xac`\x8e+\xac\x9d\xd2\a(\u0494~\xff\xbb\xbf\x90\n\x9c\xe9K\x8a\x01EK\r\xb3uh\xfc\x00\x00\u07d4\xacm\x02\xe9\xa4k7\x9f\xacJ\u0271\u05f5\xd4{\xc8P\xce\x16\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xacoh\xe87\xcf\x19a\xcb\x14\xabGDm\xa1h\xa1m\u0789\x89Hz\x9a0E9D\x00\x00\u07d4\xacw\xbd\xf0\x0f\u0558[]\xb1+\xbe\xf8\x008\n\xbc*\x06w\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xac~\x03p'#\xcb\x16\xee'\xe2-\u0438\x15\xdc-\\\xae\x9f\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xac\x8bP\x9a\xef\xea\x1d\xbf\xaf+\xb35\x00\xd6W\vo\xd9mQ\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xac\x8e\x87\xdd\xda^x\xfc\xbc\xb9\xfa\u007f\xc3\xce\x03\x8f\x9f}.4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xac\x9f\xffh\xc6\x1b\x01\x1e\xfb\xec\xf08\xedr\u06d7\xbb\x9er\x81\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xac\xa1\xe6\xbcd\xcc1\x80\xf6 \xe9M\u0171\xbc\xfd\x81X\xe4]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\xa2\xa883\v\x170-\xa71\xd3\r\xb4\x8a\x04\xf0\xf2\a\xc1\x89Hz\x9a0E9D\x00\x00\u07d4\xac\xaa\xdd\xcb\xf2\x86\xcb\x0e!]\xdaUY\x8f\u007f\xf0\xf4\xad\xa5\u018965\u026d\xc5\u07a0\x00\x00\u07d4\xac\xb9C8UK\u0108\u0308\xae-\x9d\x94\b\rk\u07c4\x10\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xac\xbc-\x19\xe0l;\xab\xbb[o\x05+k\xf7\xfc7\xe0r)\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xac\xbd\x18U\x89\xf7\xa6\x8ag\xaaK\x1b\xd6Pw\xf8\xc6NN!\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xac\xc0bp,Ya]4D\xefb\x14\xb8\x86+\x00\x9a\x02\xed\x89QO\xcb$\xff\x9cP\x00\x00\u07d4\xac\xc0\x90\x9f\xda.\xa6\xb7\xb7\xa8\x8d\xb7\xa0\xaa\xc8h\t\x1d\xdb\xf6\x89\x013v_\x1e&\u01c0\x00\u07d4\xac\xc1\u01c7\x86\xabM+;'q5\xb5\xba\x12>\x04\x00Hk\x89\x04E\x91\xd6\u007f\xec\xc8\x00\x00\u07d4\xac\xc4j*U\\t\xde\u0522\xbd\tN\x82\x1b\x97\x84;@\xc0\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xac\u015f;0\xce\xff\xc5da\xcc[\x8d\xf4\x89\x02$\x0e\x0e{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\xce\x01\xe0\xa7\x06\x10\xdcp\xbb\x91\xe9\x92o\xa9\x95\u007f7/\xba\x89\x1d\x1c_>\xda \xc4\x00\x00\u07d4\xac\xd8\u0751\xf7\x14vLEg|c\xd8R\xe5n\xb9\xee\xce.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\u2af6;\x06\x04@\x9f\xbd\xe3\xe7\x16\u0487mD\xe8\xe5\u0749\b=lz\xabc`\x00\x00\xe0\x94\xac\xec\x91\xefiA\xcfc\v\xa9\xa3\u71e0\x12\xf4\xa2\xd9\x1d\u050a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\xad\nJ\xe4x\xe9cn\x88\xc6\x04\xf2B\xcfT9\xc6\xd4V9\x89\xbe\xd1\xd0&=\x9f\x00\x00\x00\u07d4\xad\x17\x99\xaa\xd7`+E@\u0343/\x9d\xb5\xf1\x11P\xf1hz\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xad\x1dh\xa08\xfd%\x86\x06~\xf6\xd15\xd9b\x8ey\xc2\xc9$\x89\xfe\t\xa5'\x9e*\xbc\x00\x00\u07d4\xad*\\\x00\xf9#\xaa\xf2\x1a\xb9\xf3\xfb\x06n\xfa\n\x03\xde/\xb2\x8965\xbbw\xcbK\x86\x00\x00\u07d4\xad5e\xd5+h\x8a\xdd\xed\b\x16\x8b-8r\xd1}\n&\xae\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xad7|\xd2^\xb5>\x83\xae\t\x1a\n\x1d+E\x16\xf4\x84\xaf\u0789i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\xadAM)\xcb~\xe9s\xfe\xc5N\"\xa3\x88I\x17\x86\xcfT\x02\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\xadD5~\x01~$OGi1\u01f8\x18\x9e\xfe\xe8\n]\n\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xadW\xaa\x9d\x00\xd1\fC\x9b5\xef\xcc\v\xec\xac.9U\xc3\x13\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xadY\xa7\x8e\xb9\xa7J\u007f\xbd\xae\xfa\xfa\x82\xea\u0684u\xf0\u007f\x95\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xadZ\x8dV\x01L\xfc\xb3`\xf4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xadr\x81!\x87?\x04V\xd0Q\x8b\x80\xabe\x80\xa2\x03pe\x95\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xads,\x97e\x93\xee\xc4x;N.\xcdy9yx\v\xfe\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xad}\xd0S\x85\x9e\xdf\xf1\xcbo\x9d*\xcb\xedm\xd5\xe32Bo\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xad\x80\xd8e\xb8\\4\xd2\xe6IK.z\xef\xeak\x9a\xf1\x84\u06c9\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xad\x8b\xfe\xf8\u018aH\x16\xb3\x91o5\xcb{\xfc\xd7\xd3\x04\tv\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xad\x8eH\xa3wi]\xe0\x146:R:(\xb1\xa4\fx\xf2\b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xad\x91\n#\u0585\x06\x13eJ\xf7\x863z\u04a7\bh\xacm\x89lh\xcc\u041b\x02,\x00\x00\u07d4\xad\x92~\x03\xd1Y\x9ax\xca+\xf0\xca\u04a1\x83\xdc\xebq\xea\xc0\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xad\x92\xca\x06n\xdb|q\x1d\xfc[\x16a\x92\xd1\xed\xf8\xe7q\x85\x8a\a\x9f\x90\\o\xd3N\x80\x00\x00\u07d4\xad\x94#_\u00f3\xf4z$\x13\xaf1\u8111I\b\xef\fE\x89\x1b\x1b\x01B\xd8\x15\x84\x00\x00\u07d4\xad\x9e\x97\xa0H/5:\x05\xc0\xf7\x92\xb9w\xb6\xc7\xe8\x11\xfa_\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xad\x9fL\x89\n;Q\x1c\xeeQ\xdf\xe6\xcf\xd7\xf1\t;vA,\x89\x1bv|\xbf\xeb\f\xe4\x00\x00\u07d4\xad\xaa\x0eT\x8c\x03Z\xff\xedd\xcag\x8a\x96?\xab\xe9\xa2k\xfd\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4\xad\xb9H\xb1\xb6\xfe\xfe }\xe6^\x9b\xbc-\xe9\x8e`]\vW\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xad\xc1\x9e\xc85\xaf\xe3\u5347\u0713\xa8\xa9!<\x90E\x13&\x89j\xdb\xe54\"\x82\x00\x00\x00\u07d4\xad\xc8\"\x8e\xf9(\xe1\x8b*\x80}\x00\xfb1\xfcgX\x15\xaa\x00\x00\u07d4\xad\xff\r\x1d\v\x97G\x1ev\u05c9\xd2\u470at\xf9\xbdT\xff\x89e\xea=\xb7UF`\x00\x00\u07d4\xae\x06,D\x86\x18d0u\xdez\x0004-\xce\xd6=\xba\u05c9,\xc6\u034c\u0082\xb3\x00\x00\xe0\x94\xae\x10\xe2z\x01O\r0k\xaf&mH\x97\u021a\xee\xe2\xe9t\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xae\x12k8,\xf2W\xfa\xd7\xf0\xbc}\x16)~T\xccrg\u0689\x10CV\x1a\x88)0\x00\x00\u07d4\xae\x13\xa0\x85\x11\x11\x0f2\xe5;\xe4\x12xE\xc8C\xa1\xa5|{\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xae\x17\x9aF\r\xb6c&t=$\xe6u#\xa5{$m\xaf\u007f\x8a\x01\x00\a\xae|\xe5\xbb\xe4\x00\x00\u07d4\xae\"(ey\x90y\xaa\xf4\xf0gJ\f\u06ab\x02\xa6\xd5p\xff\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xae#\x9a\xcf\xfdN\xbe.\x1b\xa5\xb4\x17\x05r\xdcy\xcce3\xec\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xae/\x9c\x19\xacv\x13e\x94C#\x93\xb0G\x1d\b\x90!d\u04c9%\xdf\x05\u01a8\x97\xe4\x00\x00\u07d4\xae4\x86\x1d4\"S\x19O\xfcfR\xdf\xdeQ\xabD\xca\xd3\xfe\x89\x19F\bhc\x16\xbd\x80\x00\u07d4\xae6\xf7E!!\x91>\x80\x0e\x0f\xcd\x1ae\xa5G\x1c#\x84o\x89\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4\xae?\x98\xa4C\xef\xe0\x0f>q\x1dR]\x98\x94\u071aa\x15{\x89\x10\x04\xe2\xe4_\xb7\xee\x00\x00\xe0\x94\xaeG\xe2`\x9c\xfa\xfe6\x9df\xd4\x15\xd99\xde\x05\b\x1a\x98r\x8a\x05\xba\xec\xf0%\xf9\xb6P\x00\x00\u07d4\xaeO\x12.5\xc0\xb1\xd1\xe4\x06\x92\x91E|\x83\xc0\u007f\x96_\xa3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xaePU\x81L\xb8\xbe\f\x11{\xb8\xb1\xc8\u04b6;F\x98\xb7(\x89\x01\xbc\x93.\xc5s\xa3\x80\x00\u07d4\xaeS\x8cs\u0173\x8d\x8dXM~\xbd\xad\xef\xb1\\\xab\xe4\x83W\x896'\xe8\xf7\x127<\x00\x00\u07d4\xaeW\xcc\x12\x9a\x96\xa8\x99\x81\xda\xc6\r/\xfb\x87}]\xc5\xe42\x89<:#\x94\xb3\x96U\x00\x00\u07d4\xaeZ\xa1\xe6\u00b6\x0fo\xd3\xef\xe7!\xbbJq\x9c\xbe=o]\x89+$\u01b5Z^b\x00\x00\u07d4\xae\\\x9b\xda\xd3\xc5\u0221\"\x04D\xae\xa5\xc2)\xc1\x83\x9f\x1dd\x89\x19\xe2\xa4\xc8\x18\xb9\x06\x00\x00\u07d4\xae\\\xe35Z{\xa9\xb32v\f\tP\u00bcE\xa8_\xa9\xa0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xae]\"\x1a\xfc\xd3\u0493U\xf5\b\xea\xdf\xca@\x8c\xe3<\xa9\x03\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xaec[\xf781\x11\x9d-)\xc0\xd0O\xf8\xf8\xd8\u0425zF\x89Hz\x9a0E9D\x00\x00\xe0\x94\xaed\x81U\xa6X7\x0f\x92\x9b\xe3\x84\xf7\xe0\x01\x04~I\xddF\x8a\x02\xdf$\xae2\xbe D\x00\x00\xe0\x94\xaeo\fs\xfd\xd7|H\x97'Q!t\u0675\x02\x96a\x1cL\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xaep\xe6\x9d,J\n\xf8\x18\x80{\x1a'\x05\xf7\x9f\u0435\xdb\u01095e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\xaew9\x12N\xd1S\x05%\x03\xfc\x10\x14\x10\xd1\xff\xd8\xcd\x13\xb7\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\xaex\xbb\x84\x919\xa6\xba8\xae\x92\xa0\x9ai`\x1c\xc4\xcbb\u0449\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xae\x84\"\x10\xf4M\x14\u0124\u06d1\xfc\x9d;;P\x01O{\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xae\x84.\x81\x85\x8e\xcf\xed\xf6Plhm\xc2\x04\xac\x15\xbf\x8b$\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xae\x89T\xf8\xd6\x16m\xe5\a\xcfa)}\x0f\xc7\xcak\x9eq(\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xae\x9e\xcdk\u0755.\xf4\x97\xc0\x05\n\u0aca\x82\xa9\x18\x98\u0389\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\xae\x9f\\?\xbb\xe0\u027c\xbf\x1a\xf8\xfft\xea(\v:]\x8b\b\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\xae\xad\x88\u0589Ak\x1c\x91\xf26D!7[}\x82\xd0RR\n\xfb\\Wm\x9f~\xb9>\u048a\r\xd0A \xba\t\xcf\xe6\x00\x00\u07d4\xae\xc2\u007f\xf5\xd7\xf9\xdd\u0691\x18?F\xf9\xd5%C\xb6\xcd+/\x89\x18e\x01'\xcc=\xc8\x00\x00\u07d4\xae\xe4\x9dh\xad\xed\xb0\x81\xfdCpZ_x\xc7x\xfb\x90\xdeH\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xae\xf5\xb1\"X\xa1\x8d\xec\a\xd5\xec.1et\x91\x9dy\xd6\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\xae\xfc\xfe\x88\xc8&\xcc\xf11\xd5N\xb4\ua7b8\x0ea\xe1\xee%\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xaf\x06\xf5\xfam\x12\x14\xecC\x96}\x1b\xd4\xdd\xe7J\xb8\x14\xa98\x89\x04\xc5>\xcd\xc1\x8a`\x00\x00\u07d4\xaf\x11H\xefl\x8e\x10=u0\xef\xc9\x16y\u026c'\x00\t\x93\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xaf >\"\x9d~mA\x9d\xf47\x8e\xa9\x87\x15Q_c\x14\x85\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xaf X\xc7(,\xf6|\x8c<\xf90\x13<\x89a|\xe7])\x8a\x01w\"J\xa8D\xc7 \x00\x00\u07d4\xaf&\xf7\u01bfE> x\xf0\x89S\u4c80\x04\xa2\xc1\xe2\t\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xaf0\x87\xe6.\x04\xbf\x90\rZT\xdc>\x94bt\u0692B;\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xaf6\x14\u0736\x8a6\xe4ZN\x91\x1ebybG\"-Y[\x89z\x81\x06_\x11\x03\xbc\x00\x00\u07d4\xaf6\x15\u01c9\u0431\x15*\xd4\xdb%\xfe]\xcf\"(\x04\xcfb\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xaf<\xb5\x96Y3\xe7\xda\u0603i;\x9c>\x15\xbe\xb6\x8aHs\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xafD\x93\xe8R\x1c\xa8\x9d\x95\xf5&|\x1a\xb6?\x9fEA\x1e\x1b\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xafL\xf4\x17\x85\x16\x1fW\x1d\f\xa6\x9c\x94\xf8\x02\x1fA)N\u028a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xafR\x9b\xdbE\x9c\xc1\x85\xbe\xe5\xa1\u014b\xf7\xe8\xcc\xe2\\\x15\r\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xafg\xfd>\x12\u007f\xd9\xdc6\xeb?\xcdj\x80\u01feOu2\xb2\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xafw\x1094Z40\x01\xbc\x0f\x8aY#\xb1&\xb6\rP\x9c\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94\xaf\u007fy\xcbAZ\x1f\xb8\u06fd\tF\a\xee\x8dA\xfb|Z;\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xaf\x87\xd27\x1e\xf3x\x95\u007f\xbd\x05\xba/\x1df\x93\x1b\x01\u2e09%\xf2s\x93=\xb5p\x00\x00\u07d4\xaf\x88\x0f\xc7V}U\x95\xca\xcc\xe1\\?\xc1L\x87B\xc2l\x9e\x89\a?u\u0460\x85\xba\x00\x00\u07d4\xaf\x8e\x1d\xcb1L\x95\r6\x87CM0\x98X\xe1\xa8s\x9c\u0509\x0e~\xeb\xa3A\vt\x00\x00\u07d4\xaf\x99-\xd6i\xc0\x88>U\x15\xd3\xf3\x11*\x13\xf6\x17\xa4\xc3g\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaf\xa1\u056d8\xfe\xd4GY\xc0[\x89\x93\xc1\xaa\r\xac\xe1\x9f@\x89\x04V9\x18$O@\x00\x00\xe0\x94\xaf\xa59XnG\x19\x17J;F\xb9\xb3\xe6c\xa7\u0475\xb9\x87\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xaf\xa6\x94n\xff\xd5\xffS\x15O\x82\x01\x02S\xdfG\xae(\f\u0309j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xaf\xc8\xeb\u860b\xd4\x10Z\xccL\x01\x8eTj\x1e\x8f\x9cx\x88\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xaf\xcc}\xbb\x83V\xd8B\xd4:\xe7\xe2<\x84\"\xb0\"\xa3\b\x03\x8a\x06o\xfc\xbf\xd5\xe5\xa3\x00\x00\x00\u07d4\xaf\xd0\x19\xff6\xa0\x91U4ki\x97H\x15\xa1\xc9\x12\xc9\n\xa4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaf\xda\xc5\xc1\xcbV\xe2E\xbfp3\x00f\xa8\x17\uabecL\u0449\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xaf\xdd\x1bxab\xb81~ \xf0\xe9y\xf4\xb2\xceHmv]\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xaf\xf1\x04Z\xdf'\xa1\xaa2\x94a\xb2M\xe1\xba\u950ai\x8b\x89\x01\u03c4\xa3\n\n\f\x00\x00\u07d4\xaf\xf1\a\x96\v~\xc3N\u0590\xb6e\x02M`\x83\x8c\x19\x0fp\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xaf\xf1\x1c\xcfi\x93\x04\xd5\xf5\x86*\xf8`\x83E\x1c&\xe7\x9a\xe5\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\xaf\xf1at\nm\x90\x9f\xe9\x9cY\xa9\xb7yE\xc9\x1c\xc9\x14H\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\xaf\xfc\x99\xd5\ubd28O\xe7x\x8d\x97\xdc\xe2t\xb08$\x048\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xaf\xfe\xa0G7\"\xcb\u007f\x0e\x0e\x86\xb9\xe1\x18\x83\xbfB\x8d\x8dT\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\xb0\t\x96\xb0Vn\xcb>rC\xb8\"y\x88\u0733R\xc2\x18\x99\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xb0\x1e8\x9b(\xa3\x1d\x8eI\x95\xbd\xd7\xd7\xc8\x1b\xee\xab\x1eA\x19\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb0-\x06(s3EE\u03a2\x92\x18\xe4\x05w`Y\x0ft#\x89\xac\xb6\xa1\xc7\xd9:\x88\x00\x00\u07d4\xb0/\xa2\x93\x87\xec\x12\xe3\u007fi\"\xacL\xe9\x8c[\t\xe0\xb0\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb06\x91k\xda\u03d4\xb6\x9eZ\x8ae`)u\xeb\x02a\x04\u0749\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb0A1\x0f\xe9\xee\u0586L\xed\u053e\xe5\x8d\xf8\x8e\xb4\xed<\xac\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xb0U\xafL\xad\xfc\xfd\xb4%\xcfe\xbad1\a\x8f\a\xec\u056b\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xb0W\x11S\xdb\x1cN\u05ec\xae\xfe\x13\xec\xdf\xdbr\xe7\xe4\xf0j\x8a\x11\f\xffyj\xc1\x95 \x00\x00\u07d4\xb0n\xab\t\xa6\x10\u01a5=V\xa9F\xb2\xc44\x87\xac\x1d[-\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb0rI\xe0U\x04J\x91U5\x9a@)7\xbb\xd9T\xfeH\xb6\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xb0v\x182\x8a\x90\x13\a\xa1\xb7\xa0\xd0X\xfc\xd5xn\x9er\xfe\x8a\x06gI]JC0\xce\x00\x00\u07d4\xb0y\xbbM\x98f\x14:m\xa7*\xe7\xac\x00\"\x06)\x811\\\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4\xb0{\xcc\bZ\xb3\xf7)\xf2D\x00Ah7\xb6\x996\xba\x88s\x89lm\x84\xbc\xcd\xd9\xce\x00\x00\u07d4\xb0{\xcf\x1c\xc5\xd4F.Q$\xc9e\xec\xf0\xd7\r\xc2z\xcau\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\xb0|\xb9\xc1$\x05\xb7\x11\x80uC\u0113De\xf8\u007f\x98\xbd-\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xb0\u007f\u07af\xf9\x1dD`\xfel\xd0\u8870\xbd\x8d\"\xa6.\x87\x8a\x01\x1d%)\xf3SZ\xb0\x00\x00\xe0\x94\xb0\x9f\xe6\xd44\x9b\x99\xbc7\x93\x80T\x02-T\xfc\xa3f\xf7\xaf\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\xe0\x94\xb0\xaa\x00\x95\f\x0e\x81\xfa2\x10\x17>r\x9a\xaf\x16:'\xcdq\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xb0\xacN\xfff\x80\xee\x14\x16\x9c\xda\xdb\xff\xdb0\x80Om%\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb0\xb3j\xf9\xae\xee\u07d7\xb6\xb0\"\x80\xf1\x14\xf19\x84\xea2`\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\xb0\xb7y\xb9K\xfa<.\x1fX{\u031c~!x\x92\"7\x8f\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xb0\xba\xeb0\xe3\x13wlLm$t\x02\xbaAg\xaf\u0361\u0309j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb0\xbb)\xa8a\xea\x1dBME\xac\u053f\u0112\xfb\x8e\xd8\t\xb7\x89\x04V9\x18$O@\x00\x00\xe0\x94\xb0\xc1\xb1w\xa2 \xe4\x1f|t\xd0|\u0785i\xc2\x1cu\xc2\xf9\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\xb0\xc7\xceL\r\xc3\u00bb\xb9\x9c\xc1\x85{\x8aE_a\x17\x11\u0389\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb0\xce\xf8\xe8\xfb\x89\x84\xa6\x01\x9f\x01\xc6y\xf2r\xbb\xe6\x8f\\w\x89\b=lz\xabc`\x00\x00\xe0\x94\xb0\xd3+\xd7\xe4\u6577\xb0\x1a\xa3\xd0Ao\x80U}\xba\x99\x03\x8a\x03s\x9f\xf0\xf6\xe6\x130\x00\x00\xe0\x94\xb0\xd3\u0247+\x85\x05n\xa0\xc0\xe6\xd1\xec\xf7\xa7~<\u6ac5\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d4\xb0\xe4i\u0206Y8\x15\xb3IV8Y]\xae\xf0f_\xaeb\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xb0\xe7`\xbb\a\xc0\x81wsE\xe0W\x8e\x8b\u0218\"mN;\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1\x040\x04\xec\x19A\xa8\xcfO+\x00\xb1W\x00\u076co\xf1~\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb1\x05\xdd=\x98|\xff\xd8\x13\xe9\xc8P\n\x80\xa1\xad%}V\u0189lj\xccg\u05f1\xd4\x00\x00\u07d4\xb1\x0f\u04a6G\x10/\x88\x1ft\xc9\xfb\xc3}\xa62\x94\x9f#u\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xb1\x15\xee:\xb7d\x1e\x1a\xa6\xd0\x00\xe4\x1b\xfc\x1e\xc7!\f/2\x8a\x02\xc0\xbb=\xd3\fN \x00\x00\u07d4\xb1\x17\x8a\xd4s\x83\xc3\x1c\x814\xa1\x94\x1c\xbc\xd4t\xd0bD\xe2\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xb1\x17\x95\x89\u1779\xd4\x15W\xbb\xec\x1c\xb2L\xcc-\xec\x1c\u007f\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xb1\x19\u76a9\xb9\x16Re\x81\xcb\xf5!\xefGJ\xe8M\xcf\xf4\x89O\xba\x10\x01\xe5\xbe\xfe\x00\x00\u07d4\xb1\x1f\xa7\xfb'\n\xbc\xdfZ.\xab\x95\xaa0\u013566\uffc9+^:\xf1k\x18\x80\x00\x00\u07d4\xb1$\xbc\xb6\xff\xa40\xfc\xae.\x86\xb4_'\xe3\xf2\x1e\x81\xee\b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1)\xa5\xcbq\x05\xfe\x81\v\u0615\xdcr\x06\xa9\x91\xa4TT\x88\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\xe0\x94\xb1.\xd0{\x8a8\xadU\x066?\xc0z\vmy\x996\xbd\xaf\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xb14\xc0\x049\x1a\xb4\x99(x3zQ\xec$/B(WB\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1?\x93\xaf0\xe8\xd7fs\x81\xb2\xb9[\xc1\xa6\x99\xd5\xe3\xe1)\x89\x16\u012b\xbe\xbe\xa0\x10\x00\x00\u07d4\xb1E\x92\x85\x86>\xa2\xdb7Y\xe5F\u03b3\xfb7a\xf5\x90\x9c\x89<\xd7*\x89@\x87\xe0\x80\x00\u07d4\xb1F\xa0\xb9%U<\xf0o\xca\xf5J\x1bM\xfe\xa6!)\aW\x89lnY\xe6|xT\x00\x00\xe0\x94\xb1Jz\xaa\x8fI\xf2\xfb\x9a\x81\x02\u05bb\xe4\u010a\xe7\xc0o\xb2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb1K\xbe\xffpr\tu\xdca\x91\xb2\xa4O\xf4\x9f&r\x87<\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\xe0\x94\xb1L\xc8\xde3\xd63\x826S\x9aH\x90 \xceFU\xa3+\u018a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb1M\xdb\x03\x86\xfb`c\x98\xb8\xccGVZ\xfa\xe0\x0f\xf1\xd6j\x89\xa1*\xff\b>f\xf0\x00\x00\u07d4\xb1S\xf8(\xdd\amJ|\x1c%t\xbb-\xee\x1aD\xa3\x18\xa8\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb1T\x0e\x94\xcf\xf3F\\\xc3\u0447\xe7\xc8\u3f6f\x98FY\u2262\x15\xe4C\x90\xe33\x00\x00\u07d4\xb1X\xdbC\xfab\xd3\x0ee\xf3\u041b\xf7\x81\u01f6sr\uba89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\xb1ar_\xdc\xed\xd1yR\xd5{#\xef([~K\x11i\xe8\x89\x02\xb6\xdf\xed6d\x95\x80\x00\u07d4\xb1dy\xba\x8e}\xf8\xf6>\x1b\x95\xd1I\u0345)\xd75\xc2\u0689-\xe3:j\xac2T\x80\x00\u07d4\xb1f\xe3}.P\x1a\xe7<\x84\x14+_\xfbZ\xa6U\xddZ\x99\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\xb1\x83\xeb\xeeO\xcbB\xc2 \xe4wt\xf5\x9dlT\xd5\xe3*\xb1\x89V\xf7\xa9\xc3<\x04\xd1\x00\x00\u07d4\xb1\x88\a\x84D\x02~8g\x98\xa8\xaehi\x89\x19\xd5\xcc#\r\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\xb1\x89j7\xe5\u0602Z-\x01vZ\xe5\xdeb\x99w\u0783R\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb1\x8eg\xa5\x05\n\x1d\xc9\xfb\x19\t\x19\xa3=\xa88\xefDP\x14\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb1\xa2\xb4:t3\xdd\x15\v\xb8\"'\xedQ\x9c\u05b1B\u04c2\x89\x94mb\rtK\x88\x00\x00\u07d4\xb1\xc0\u040b6\xe1\x84\xf9\x95*@7\xe3\xe5:f}\a\nN\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb1\xc3(\xfb\x98\xf2\xf1\x9a\xb6do\n|\x8cVo\xdaZ\x85@\x89\x87\x86x2n\xac\x90\x00\x00\xe0\x94\xb1\xc7Qxi9\xbb\xa0\xd6q\xa6w\xa1X\u01ab\xe7&^F\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xb1\xcdK\xdf\xd1\x04H\x9a\x02n\u025dYs\a\xa0By\xf1s\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb1\u03d4\xf8\t\x15\x05\x05_\x01\n\xb4\xba\u0196\xe0\xca\x0fg\xa1\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xb1\u05b0\x1b\x94\xd8T\xfe\x8b7J\xa6^\x89\\\xf2*\xa2V\x0e\x892\xf5\x1e\u06ea\xa30\x00\x00\xe0\x94\xb1\u06e5%\v\xa9bWU$n\x06yg\xf2\xad/\a\x91\u078a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\xb1\xe2\u0755\xe3\x9a\xe9w\\U\xae\xb1?\x12\xc2\xfa#0S\xba\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1\xe6\xe8\x10\xc2J\xb0H\x8d\xe9\xe0\x1eWH7\x82\x9f|w\u0409\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb1\xe9\xc5\xf1\xd2\x1eauzk.\xe7Y\x13\xfcZ\x1aA\x01\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\x03\u049elV\xb9&\x99\u0139-\x1fo\x84d\x8d\xc4\u03fc\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb2\x16\xdcY\xe2|=ry\xf5\xcd[\xb2\xbe\u03f2`n\x14\u0649\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb2\x1byy\xbf|\\\xa0\x1f\xa8-\xd6@\xb4\x1c9\xe6\u01bcu\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xb2#\xbf\x1f\xbf\x80H\\\xa2\xb5V}\x98\xdb{\xc3SM\xd6i\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb2-PU\xd9b15\x96\x1ej\xbd'<\x90\xde\xea\x16\xa3\xe7\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xb2-\xad\xd7\xe1\xe0R2\xa927\xba\xed\x98\xe0\u07d2\xb1\x86\x9e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb24\x03_uDF<\xe1\xe2+\xc5S\x06F\x84\xc5\x13\xcdQ\x89\r\x89\xfa=\u010d\xcf\x00\x00\u07d4\xb2G\u03dcr\xecH*\xf3\xea\xa7Ye\x8fy=g\nW\f\x891p\x8a\xe0\x04T@\x00\x00\u07d4\xb2ghA\xee\x9f-1\xc1r\xe8#\x03\xb0\xfe\x9b\xbf\x9f\x1e\t\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb2y\xc7\xd3U\u0088\x03\x92\xaa\u046a!\xee\x86|;5\a\u07c9D[\xe3\xf2\uf1d4\x00\x00\u07d4\xb2|\x1a$ L\x1e\x11\x8du\x14\x9d\xd1\t1\x1e\a\xc0s\xab\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\xb2\x81\x81\xa4X\xa4@\xf1\u01bb\x1d\xe8@\x02\x81\xa3\x14\x8fL5\x89\x14b\fW\xdd\xda\xe0\x00\x00\xe0\x94\xb2\x82E\x03|\xb1\x92\xf7W\x85\u02c6\xcb\xfe|\x93\r\xa2X\xb0\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xb2\x87\xf7\xf8\xd8\u00c7,\x1bXk\xcd}\n\xed\xbf~s'2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb2\x8b\xb3\x9f4fQ|\xd4o\x97\x9c\xf5\x96S\xee}\x8f\x15.\x89\x18e\x01'\xcc=\xc8\x00\x00\u07d4\xb2\x8d\xbf\xc6I\x98\x94\xf7:q\xfa\xa0\n\xbe\x0fK\xc9\u045f*\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xb2\x96\x8f}5\xf2\b\x87\x161\xc6h{?=\xae\xab\xc6al\x89\bu\xc4\u007f(\x9fv\x00\x00\u07d4\xb2\x9f[|\x190\xd9\xf9z\x11^\x06pf\xf0\xb5M\xb4K;\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb2\xa1D\xb1\xeag\xb9Q\x0f\"g\xf9\xda9\xd3\xf9=\xe2fB\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\xa2\xc2\x11\x16\x12\xfb\x8b\xbb\x8e}\xd97\x8dg\xf1\xa3\x84\xf0P\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb2\xa4\x98\xf0;\xd7\x17\x8b\u0627\x89\xa0\x0fR7\xafy\xa3\xe3\xf8\x8a\x04\x1b\xad\x15^e\x12 \x00\x00\u07d4\xb2\xaa/\x1f\x8e\x93\xe7\x97\x13\xd9,\xea\x9f\xfc\xe9\xa4\n\xf9\xc8-\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\xb5\x16\xfd\u045e\u007f8d\xb6\xd2\xcf\x1b%*AV\xf1\xb0;\x89\x02\xe9\x83\xc7a\x15\xfc\x00\x00\u07d4\xb2\xb7\u0374\xffKa\u0577\xce\v\"p\xbb\xb5&\x97C\xec\x04\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\xbd\xbe\u07d5\x90\x84v\xd7\x14\x8a7\f\u0193t6(\x05\u007f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb2\xbf\xaaX\xb5\x19l\\\xb7\xf8\x9d\xe1_G\x9d\x188\xdeq=\x89\x01#n\xfc\xbc\xbb4\x00\x00\u07d4\xb2\xc5>\xfa3\xfeJ:\x1a\x80 \\s\xec;\x1d\xbc\xad\x06\x02\x89h\x01\u06b3Y\x18\x93\x80\x00\xe0\x94\xb2\xd06\x05\x15\xf1}\xab\xa9\x0f\u02ec\x82\x05\xd5i\xb9\x15\u05ac\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xb2\xd1\xe9\x9a\xf9\x121\x85\x8epe\xdd\x19\x183\r\xc4\xc7G\u054a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\xb2\u066b\x96d\xbc\xf6\xdf <4o\u0192\xfd\x9c\xba\xb9 ^\x89\x17\xbex\x97`e\x18\x00\x00\u07d4\xb2\u0777\x86\xd3yN'\x01\x87\xd0E\x1a\xd6\u0237\x9e\x0e\x87E\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb2\xe0\x85\xfd\xdd\x14h\xba\aA['NsN\x11#\u007f\xb2\xa9\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xb2\xe9\xd7k\xf5\x0f\xc3k\xf7\u04d4Kc\xe9\u0288\x9bi\x99h\x89\x902\xeab\xb7K\x10\x00\x00\xe0\x94\xb2\xf9\xc9r\xc1\xe9swU\xb3\xff\x1b0\x88s\x83\x969[&\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xb2\xfc\x84\xa3\xe5\nP\xaf\x02\xf9M\xa08>\u055fq\xff\x01\u05ca\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\xb3\x05\v\xef\xf9\xde3\xc8\x0e\x1f\xa1R%\xe2\x8f,A:\xe3\x13\x89%\xf2s\x93=\xb5p\x00\x00\u07d4\xb3\x11\x96qJH\xdf\xf7&\xea\x943\xcd)\x12\xf1\xa4\x14\xb3\xb3\x89\x91Hx\xa8\xc0^\xe0\x00\x00\xe0\x94\xb3\x14[tPm\x1a\x8d\x04|\xdc\xdcU9*{SPy\x9a\x8a\x1bb)t\x1c\r=]\x80\x00\u07d4\xb3 \x83H6\xd1\xdb\xfd\xa9\xe7\xa3\x18M\x1a\xd1\xfdC \xcc\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3#\u073f.\xdd\xc58.\u4efb \x1c\xa3\x93\x1b\xe8\xb48\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xb3$\x00\xfd\x13\xc5P\t\x17\xcb\x03{)\xfe\"\xe7\xd5\"\x8f-\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xb3%gL\x01\xe3\xf7)\rR&3\x9f\xbe\xacg\xd2!'\x9f\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xb3(%\xd5\xf3\xdb$\x9e\xf4\xe8\\\xc4\xf31S\x95\x89v\u8f09\x1b-\xf9\xd2\x19\xf5y\x80\x00\u07d4\xb3*\xf3\xd3\xe8\xd0u4I&To.2\x88{\xf9;\x16\xbd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb3/\x1c&\x89\xa5\xcey\xf1\xbc\x97\v1XO\x1b\xcf\"\x83\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb3<\x03#\xfb\xf9\xc2l\x1d\x8a\xc4N\xf7C\x91\u0400F\x96\u0689\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb3O\x04\xb8\xdbe\xbb\xa9\xc2n\xfcL\xe6\xef\xc5\x04\x81\xf3\xd6]\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb3U}9\xb5A\x1b\x84D__T\xf3\x8fb\xd2qM\x00\x87\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xb3X\xe9|p\xb6\x05\xb1\xd7\xd7)\u07f6@\xb4<^\xaf\xd1\xe7\x8a\x04<3\xc1\x93ud\x80\x00\x00\u0794\xb3^\x8a\x1c\r\xac~\x0ef\u06ecsjY*\xbdD\x01%a\x88\xcf\xceU\xaa\x12\xb3\x00\x00\xe0\x94\xb3fx\x94\xb7\x86<\x06\x8a\xd3D\x87?\xcf\xf4\xb5g\x1e\x06\x89\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb3qw1\xda\xd6Q2\xday-\x87`0\xe4j\xc2'\xbb\x8a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3s\x1b\x04l\x8a\u0195\xa1'\xfdy\u0425\xd5\xfaj\xe6\xd1.\x89lO\xd1\xee$nx\x00\x00\u07d4\xb3|+\x9fPc{\xec\xe0\u0295\x92\b\xae\xfe\xe6F;\xa7 \x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb3\x88\xb5\xdf\xec\xd2\xc5\u4d56W|d%V\xdb\xfe'xU\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb3\x8cNS{]\xf90\xd6Zt\xd0C\x83\x1dkH[\xbd\xe4\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xb3\x919Wa\x94\xa0\x86a\x95\x15\x1f3\xf2\x14\n\xd1\u0306\u03ca\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xb3\x9fL\x00\xb2c\f\xab}\xb7)^\xf4=G\xd5\x01\xe1\u007f\u05c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb3\xa6K\x11vrOT\t\xe1AJ5#f\x1b\xae\xe7KJ\x89\x01ch\xffO\xf9\xc1\x00\x00\u07d4\xb3\xa6\xbdA\xf9\xd9\xc3 \x1e\x05\v\x87\x19\x8f\xbd\xa3\x994\"\x10\x89\xc4a\xe1\xdd\x10)\xb5\x80\x00\u07d4\xb3\xa8\xc2\xcb}5\x8eW9\x94\x1d\x94[\xa9\x04Z\x02:\x8b\xbb\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3\xaeT\xfb\xa0\x9d>\xe1\u05bd\xd1\xe9W\x929\x19\x02L5\xfa\x89\x03\x8d,\xeee\xb2*\x80\x00\u07d4\xb3\xb7\xf4\x93\xb4J,\x8d\x80\xecx\xb1\xcd\xc7Ze+s\xb0l\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb3\xc2(s\x1d\x18m-\xed[_\xbe\x00Lfl\x8eF\x9b\x86\x89\x01\x92t\xb2Y\xf6T\x00\x00\u07d4\xb3\xc2``\x9b\x9d\xf4\t^l]\xff9\x8e\xeb^-\xf4\x99\x85\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4\xb3\xc6[\x84Z\xbal\xd8\x16\xfb\xaa\xe9\x83\xe0\xe4l\x82\xaa\x86\"\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3\xc9H\x11\xe7\x17[\x14\x8b(\x1c\x1a\x84[\xfc\x9b\xb6\xfb\xc1\x15\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb3\xe2\x0e\xb4\xde\x18\xbd\x06\x02!h\x98\x94\xbe\u5bb2SQ\xee\x89\x03\xfc\x80\xcc\xe5\x16Y\x80\x00\u07d4\xb3\xe3\xc49\x06\x98\x80\x15f\x00\u0089.D\x8dA6\xc9-\x9b\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\xe0\x94\xb3\xf8*\x87\xe5\x9a9\xd0\u0480\x8f\aQ\xebr\xc22\x9c\xdc\u014a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xb3\xfc\x1dh\x81\xab\xfc\xb8\xbe\xcc\v\xb0!\xb8\xb7;r3\u0751\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xb4\x05\x94\xc4\xf3fN\xf8I\u0326\"{\x8a%\xaai\t%\xee\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb4\x1e\xaf]Q\xa5\xba\x1b\xa3\x9b\xb4\x18\u06f5O\xabu\x0e\xfb\x1f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4$\u058d\x9d\r\x00\xce\xc1\x93\x8c\x85N\x15\xff\xb8\x80\xba\x01p\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb4%bs\x96+\xf61\xd0\x14U\\\xc1\xda\r\xcc1akI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb40g\xfep\u0675Ys\xbaX\xdcd\xdd\u007f1\x1eUBY\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb46W\xa5\x0e\xec\xbc0w\xe0\x05\xd8\xf8\xd9O7xv\xba\u0509\x01\xec\x1b:\x1f\xf7Z\x00\x00\u07d4\xb4<'\xf7\xa0\xa1\"\bK\x98\xf4\x83\x92%A\u0203l\xee,\x89&\u009eG\u0104L\x00\x00\xe0\x94\xb4A5v\x86\x9c\b\xf9Q*\xd3\x11\xfe\x92Y\x88\xa5-4\x14\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xb4F\x05U$q\xa6\xee\xe4\u06abq\xff;\xb4\x13&\xd4s\xe0\x89-~=Q\xbaS\xd0\x00\x00\u07d4\xb4GW\x1d\xac\xbb>\u02f6\xd1\xcf\v\f\x8f88\xe5#$\xe2\x89\x01\xa3\x18f\u007f\xb4\x05\x80\x00\u07d4\xb4G\x83\xc8\xe5{H\a\x93\xcb\u059aE\xd9\f{O\fH\xac\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb4H\x15\xa0\xf2\x8eV\x9d\x0e\x92\x1aJ\u078f\xb2d%&Iz\x89\x03\x027\x9b\xf2\xca.\x00\x00\u07d4\xb4Im\xdb'y\x9a\"$W\xd79y\x11g(\u8844[\x89\x8d\x81\x9e\xa6_\xa6/\x80\x00\xe0\x94\xb4RL\x95\xa7\x86\x0e!\x84\x02\x96\xa6\x16$@\x19B\x1cJ\xba\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb4\\\xca\r6\x82fbh<\xf7\u0432\xfd\xach\u007f\x02\xd0\u010965\u026d\xc5\u07a0\x00\x00\u0794\xb4d@\u01d7\xa5V\xe0L}\x91\x04f\x04\x91\xf9k\xb0v\xbf\x88\xce\xc7o\x0eqR\x00\x00\u07d4\xb4j\u0386^,P\xeaF\x98\xd2\x16\xabE]\xffZ\x11\xcdr\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4m\x11\x82\xe5\xaa\xca\xff\r&\xb2\xfc\xf7/<\x9f\xfb\xcd\xd9}\x89\xaa*`<\xdd\u007f,\x00\x00\u07d4\xb4\x89!\xc9h}U\x10tE\x84\x93n\x88\x86\xbd\xbf-\xf6\x9b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4\x98\xbb\x0fR\x00\x05\xb6!jD%\xb7Z\xa9\xad\xc5-b+\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xb4\xb1\x1d\x10\x9f`\x8f\xa8\xed\xd3\xfe\xa9\xf8\xc3\x15d\x9a\xeb=\x11\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xb4\xb1K\xf4TU\u042b\b\x035\x8bu$\xa7+\xe1\xa2\x04[\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xb4\xb1\x85\xd9C\xee+Xc\x1e3\xdf\xf5\xafhT\xc1y\x93\xac\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4\xbf$\u02c3hk\xc4i\x86\x9f\xef\xb0D\xb9\tqi\x93\xe2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb4\xc2\x00@\xcc\u0661\xa3(=\xa4\u0522\xf3e\x82\bC\xd7\xe2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4\xc8\x17\x0f{*\xb56\xd1\u0662[\xdd :\xe1(\x8d\xc3\u0549\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb4\xd8/.i\x94?}\xe0\xf5\xf7t8y@o\xac.\x9c\xec\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xb4\xddF\f\xd0\x16rZd\xb2.\xa4\xf8\xe0n\x06gN\x03>\x8a\x01#\x1b\xb8t\x85G\xa8\x00\x00\u07d4\xb4\xddT\x99\xda\xeb%\a\xfb-\xe1\"\x97s\x1dLr\xb1k\xb0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb5\x04l\xb3\xdc\x1d\xed\xbd6E\x14\xa2\x84\x8eD\xc1\xdeN\xd1G\x8a\x03{}\x9b\xb8 @^\x00\x00\xe0\x94\xb5\b\xf9\x87\xb2\xde4\xaeL\xf1\x93\u0785\xbf\xf6\x13\x89b\x1f\x88\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xb5\tU\xaan4\x15q\x98f\b\xbd\u0211\xc2\x13\x9fT\f\u07c9j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb5\f\x14\x9a\x19\x06\xfa\xd2xo\xfb\x13Z\xabP\x177\xe9\xe5o\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4\xb5\f\x9fW\x89\xaeD\xe2\xdc\xe0\x17\xc7\x14\xca\xf0\f\x83\x00\x84\u0089\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xb5\x14\x88,\x97\x9b\xb6B\xa8\r\u04c7T\u0578\xc8)m\x9a\a\x893\xc5I\x901r\f\x00\x00\u07d4\xb5\x1d\u0734\xddN\x8a\xe6\xbe3m\xd9eIq\xd9\xfe\xc8kA\x89\x16\xd4d\xf8=\u2500\x00\u07d4\xb5\x1eU\x8e\xb5Q/\xbc\xfa\x81\xf8\u043d\x93\x8cy\xeb\xb5$+\x89&\u009eG\u0104L\x00\x00\u07d4\xb5#\xff\xf9t\x98q\xb3S\x88C\x887\xf7\xe6\xe0\u07a9\xcbk\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xb5-\xfbE\xde]t\xe3\xdf \x832\xbcW\x1c\x80\x9b\x8d\xcf2\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xb55\xf8\u06c7\x9f\xc6\u007f\xecX\x82J\\\xbenT\x98\xab\xa6\x92\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xb57\xd3jp\xee\xb8\xd3\xe5\xc8\r\xe8\x15\"\\\x11X\u02d2\u0109QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\xb5;\xcb\x17L%\x184\x8b\x81\x8a\xec\xe0 6E\x96Fk\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5I>\xf1srDE\xcf4\\\x03]'\x9b\xa7Y\xf2\x8dQ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb5S\xd2]kT!\xe8\x1c*\xd0^\v\x8b\xa7Q\xf8\xf0\x10\xe3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5Tt\xbaX\xf0\xf2\xf4\x0el\xba\xbe\xd4\xea\x17n\x01\x1f\xca\u0589j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb5U\xd0\x0f\x91\x90\xcc6w\xae\xf3\x14\xac\xd7?\xdc99\x92Y\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5W\xab\x949\xefP\xd27\xb5S\xf0%\b6JFj\\\x03\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb5jx\x00(\x03\x9c\x81\xca\xf3{gu\xc6 \u7195Gd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5j\u04ae\xc6\xc8\xc3\xf1\x9e\x15\x15\xbb\xb7\u0751(RV\xb69\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb5t\x13\x06\n\xf3\xf1N\xb4y\x06_\x1e\x9d\x19\xb3uz\xe8\u0309\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xb5uI\xbf\xbc\x9b\xdd\x18\xf76\xb2&P\xe4\x8as`\x1f\xa6\\\x89\x18-~L\xfd\xa08\x00\x00\xe0\x94\xb5w\xb6\xbe\xfa\x05N\x9c\x04\x04a\x85P\x94\xb0\x02\xd7\xf5{\u05ca\x18#\xf3\xcfb\x1d#@\x00\x00\u07d4\xb5{\x04\xfa#\xd1 ?\xae\x06\x1e\xacEB\xcb`\xf3\xa5v7\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\xb5\x87\f\xe3B\xd43C36s\x03\x8bGd\xa4n\x92_>\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb5\x87\xb4J,\xa7\x9eK\xc1\u074b\xfd\xd4: qP\xf2\xe7\xe0\x89\",\x8e\xb3\xfff@\x00\x00\u07d4\xb5\x89gm\x15\xa0DH4B0\xd4\xff'\xc9^\xdf\x12,I\x8965\u026d\xc5\u07a0\x00\x00\u0794\xb5\x8bR\x86^\xa5]\x806\xf2\xfa\xb2`\x98\xb3R\u0283~\x18\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xb5\x90k\n\u9881X\xe8\xacU\x0e9\xda\bn\xe3\x15v#\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb5\xa4g\x96\x85\xfa\x14\x19l.\x920\xc8\xc4\xe3;\xff\xbc\x10\xe2\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xb5\xa5\x89\u075f@q\u06f6\xfb\xa8\x9b?]]\xae}\x96\xc1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5\xa6\x06\xf4\xdd\u02f9G\x1e\xc6\u007fe\x8c\xaf+\x00\xees\x02^\x89\xeaun\xa9*\xfct\x00\x00\u07d4\xb5\xadQW\u0769!\xe6\xba\xfa\u0350\x86\xaes\xae\x1fa\x1d?\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5\xad\xd1\u701f}\x03\x06\x9b\xfe\x88;\n\x93\"\x10\xbe\x87\x12\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb5\xba)\x91|x\xa1\xd9\xe5\xc5\xc7\x13fl\x1eA\x1d\u007fi:\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\xb5\xc8\x16\xa8(<\xa4\xdfh\xa1\xa7=c\xbd\x80&\x04\x88\xdf\b\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb5\xca\xc5\xed\x03G}9\v\xb2g\xd4\xeb\xd4a\x01\xfb\xc2\xc3\u0689\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xb5\u037cA\x15@oR\u5a85\xd0\xfe\xa1p\u0497\x9c\u01fa\x89Hz\x9a0E9D\x00\x00\u0794\xb5\u0653M{)+\xcf`;(\x80t\x1e\xb7`(\x83\x83\xa0\x88\xe7\xc2Q\x85\x05\x06\x00\x00\u07d4\xb5\xddP\xa1]\xa3Ih\x89\nS\xb4\xf1?\xe1\xaf\b\x1b\xaa\xaa\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb5\xfa\x81\x84\xe4>\xd3\u0e2b\x91!da\xb3R\x8d\x84\xfd\t\x89\x91Hx\xa8\xc0^\xe0\x00\x00\u07d4\xb5\xfb~\xa2\xdd\xc1Y\x8bfz\x9dW\xdd9\xe8Z8\xf3]V\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xb6\x00B\x97R\xf3\x99\xc8\r\a4tK\xae\n\x02.\xcag\u0189\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb6\x00\xfe\xabJ\xa9lSu\x04\xd9`W\"1Ai,\x19:\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb6\x04|\u07d3-\xb3\xe4\x04_Iv\x12#AS~\u0556\x1e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb6\x15\xe9@\x14>\xb5\u007f\x87X\x93\xbc\x98\xa6\x1b=a\x8c\x1e\x8c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb6\x1c4\xfc\xac\xdap\x1aZ\xa8p$Y\u07b0\u4b83\x8d\xf8\x8a\aiZ\x92\xc2\ro\xe0\x00\x00\xe0\x94\xb60d\xbd3U\xe6\xe0~-7p$\x12Z3wlJ\xfa\x8a\b7Z*\xbc\xca$@\x00\x00\u07d4\xb65\xa4\xbcq\xfb(\xfd\xd5\xd2\xc3\"\x98:V\u0084Bni\x89\t79SM(h\x00\x00\u07d4\xb6F\u07d8\xb4\x94BtkaR\\\x81\xa3\xb0K\xa3\x10bP\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb6YA\xd4LP\xd2Ffg\r6Gf\xe9\x91\xc0.\x11\u0089 \x86\xac5\x10R`\x00\x00\xe0\x94\xb6[\u05c0\xc7CA\x15\x16 'VR#\xf4NT\x98\xff\x8c\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\xb6d\x11\xe3\xa0-\xed\xb7&\xfay\x10}\xc9\v\xc1\xca\xe6MH\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb6fu\x14.1\x11\xa1\xc2\xea\x1e\xb2A\x9c\xfaB\xaa\xf7\xa24\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xb6o\x92\x12K^c\x03XY\xe3\x90b\x88i\xdb\u07a9H^\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xb6rsJ\xfc\xc2$\xe2\xe6\t\xfcQ\xd4\xf0Ys'D\xc9H\x89\x10\x04\xe2\xe4_\xb7\xee\x00\x00\xe0\x94\xb6w\x1b\v\xf3B\u007f\x9a\xe7\xa9>|.a\xeec\x94\x1f\xdb\b\x8a\x03\xfb&i)T\xbf\xc0\x00\x00\u07d4\xb6z\x80\xf1p\x19}\x96\xcd\xccJ\xb6\u02e6'\xb4\xaf\xa6\xe1,\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xb6\x88\x99\xe7a\rL\x93\xa255\xbc\xc4H\x94[\xa1fo\x1c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb6\xa8)3\xc9\xea\u06bd\x98\x1e]m`\xa6\x81\x8f\xf8\x06\xe3k\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xb6\xaa\u02cc\xb3\v\xab*\xe4\xa2BF&\xe6\xe1+\x02\xd0F\x05\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb6\xb3J&?\x10\xc3\xd2\xec\xeb\n\xccU\x9a{*\xb8\\\xe5e\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb6\xbf\xe1\xc3\xef\x94\xe1\x84o\xb9\xe3\xac\xfe\x9bP\xc3\xe9\x06\x923\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xb6\xcdt2\xd5\x16\x1b\xe7\x97h\xadE\xde>Dz\a\x98 c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb6\xceM\xc5`\xfcs\xdci\xfbzb\xe3\x88\xdb~r\xeavO\x894]\xf1i\xe9\xa3X\x00\x00\u07d4\xb6\xde\u03c2\x96\x98\x19\xba\x02\xde)\xb9\xb5\x93\xf2\x1bd\xee\xda\x0f\x89(\x1d\x90\x1fO\xdd\x10\x00\x00\xe0\x94\xb6\xe6\xc3\"+ko\x9b\xe2\x87]*\x89\xf1'\xfbd\x10\x0f\xe2\x8a\x01\xb2\x1dS#\xcc0 \x00\x00\u07d4\xb6\xe8\xaf\xd9=\xfa\x9a\xf2\u007f9\xb4\xdf\x06\ag\x10\xbe\xe3\u07eb\x89\x01Z\xf1\u05cbX\xc4\x00\x00\xe0\x94\xb6\xf7\x8d\xa4\xf4\xd0A\xb3\xbc\x14\xbc[\xa5\x19\xa5\xba\f2\xf1(\x8a$}\xd3,?\xe1\x95\x04\x80\x00\xe0\x94\xb6\xfb9xbP\b\x14&\xa3B\xc7\rG\xeeR\x1e[\xc5c\x8a\x03-&\xd1.\x98\v`\x00\x00\u07d4\xb7\r\xba\x93\x91h+J6Nw\xfe\x99%c\x01\xa6\xc0\xbf\x1f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb7\x16#\xf3Q\a\xcft1\xa8?\xb3\xd2\x04\xb2\x9e\u0c67\xf4\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xb7\x1a\x13\xba\x8e\x95\x16{\x803\x1bR\u059e7\x05O\xe7\xa8&\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb7\x1bb\xf4\xb4H\xc0+\x12\x01\xcb^9J\xe6'\xb0\xa5`\xee\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xb7\" \xad\xe3d\xd06\x9f--\xa7\x83\xcaGM{\x9b4\u0389\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\xe0\x94\xb7#\r\x1d\x1f\xf2\xac\xa3f\x969\x14\xa7\x9d\xf9\xf7\xc5\xea,\x98\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94\xb7$\n\U000af433<\b\xae\x97d\x10>5\xdc\xe3c\x84(\x8a\x01\xca\xdd/\xe9hnc\x80\x00\u07d4\xb7'\xa9\xfc\x82\xe1\xcf\xfc\\\x17_\xa1HZ\x9b\xef\xa2\u037d\u04496'\xe8\xf7\x127<\x00\x00\u07d4\xb7,*\x01\x1c\r\xf5\x0f\xbbn(\xb2\n\xe1\xaa\xd2\x17\x88g\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb78-7\xdb\x03\x98\xacrA\f\xf9\x81=\xe9\xf8\xe1\uc36d\x8966\xc2^f\xec\xe7\x00\x00\u07d4\xb7;O\xf9\x9e\xb8\x8f\u061b\vmW\xa9\xbc3\x8e\x88o\xa0j\x89\x01\xbc\x16\xd6t\xec\x80\x00\x00\u07d4\xb7=jwU\x9c\x86\xcfet$)\x039K\xac\xf9n5p\x89\x04\xf1\xa7|\xcd;\xa0\x00\x00\u07d4\xb7Cr\xdb\xfa\x18\x1d\xc9$/9\xbf\x1d71\xdf\xfe+\xda\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xb7G\x9d\xabP\"\xc4\xd5\u06ea\xf8\xde\x17\x1bN\x95\x1d\u0464W\x89\x04V9\x18$O@\x00\x00\u07d4\xb7I\xb5N\x04\u0571\x9b\xdc\xed\xfb\x84\xdaw\x01\xabG\x8c'\xae\x89\x91Hx\xa8\xc0^\xe0\x00\x00\u07d4\xb7N\xd2f`\x01\xc1c3\xcfz\xf5\x9eJ=H`6;\x9c\x89\n~\xbd^Cc\xa0\x00\x00\u07d4\xb7QI\xe1\x85\xf6\xe3\x92pWs\x90s\xa1\x82*\xe1\xcf\r\xf2\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xb7S\xa7_\x9e\xd1\v!d:\n=\xc0Qz\xc9k\x1a@h\x89\x15\xc8\x18[,\x1f\xf4\x00\x00\xe0\x94\xb7V\xadR\xf3\xbft\xa7\xd2LgG\x1e\b\x87Ci6PL\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb7Wn\x9d1M\xf4\x1e\xc5Pd\x94):\xfb\x1b\xd5\xd3\xf6]\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb7X\x89o\x1b\xaa\x86O\x17\xeb\xed\x16\xd9S\x88o\xeeh\xaa\xe6\x8965\u026d\xc5\u07a0\x00\x00\u0794\xb7h\xb5#N\xba:\x99h\xb3Mm\xdbH\x1c\x84\x19\xb3e]\x88\xcf\xceU\xaa\x12\xb3\x00\x00\u07d4\xb7\x82\xbf\xd1\xe2\xdep\xf4gdo\x9b\xc0\x9e\xa5\xb1\xfc\xf4P\xaf\x89\x0e~\xeb\xa3A\vt\x00\x00\xe0\x94\xb7\xa2\xc1\x03r\x8bs\x05\xb5\xaen\x96\x1c\x94\xee\x99\xc9\xfe\x8e+\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xb7\xa3\x1a|8\xf3\xdb\t2.\xae\x11\xd2'!A\xea\"\x99\x02\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb7\xa6y\x1c\x16\xebN!b\xf1Ke7\xa0+=c\xbf\xc6\x02\x89*Rc\x91\xac\x93v\x00\x00\u07d4\xb7\xa7\xf7|4\x8f\x92\xa9\xf1\x10\fk\xd8)\xa8\xacm\u007f\u03d1\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xb7\xc0w\x94ft\xba\x93A\xfbLtz]P\xf5\xd2\xdad\x15\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb7\xc0\xd0\xcc\vM4-@b\xba\xc6$\xcc\xc3\xc7\f\xc6\xda?\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb7\xc9\xf1+\x03\x8esCm\x17\xe1\xc1/\xfe\x1a\xec\u0373\xf5\x8c\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\u07d4\xb7\xcck\x1a\xcc2\u0632\x95\xdfh\xed\x9d^`\xb8\xf6L\xb6{\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xb7\xcehK\t\xab\xdaS8\x9a\x87Si\xf7\x19X\xae\xac;\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\xb7\xd1.\x84\xa2\xe4\u01264Z\xf1\xdd\x1d\xa9\xf2PJ*\x99n\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb7\xd2R\xee\x94\x02\xb0\xee\xf1D)_\x0ei\xf0\xdbXl\bq\x89#\xc7W\a+\x8d\xd0\x00\x00\xe0\x94\xb7\u0541\xfe\n\xf1\xec8?;\xce\x00\xaf\x91\x99\xf3\xcf_\xe0\xcc\xe2\x8c\xd1J\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4\xb8R\x18\xf3B\xf8\x01.\u069f'Nc\xce!R\xb2\xdc\xfd\xab\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\xb8UP\x10wn<\\\xb3\x11\xa5\xad\xee\xfe\x9e\x92\xbb\x9ad\xb9\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xb8_&\xdd\x0er\xd9\u009e\xba\xf6\x97\xa8\xafwG,+X\xb5\x8a\x02\x85\x19\xac\xc7\x19\fp\x00\x00\u07d4\xb8_\xf0>{_\xc4\"\x98\x1f\xae^\x99A\xda\xcb\u06bau\x84\x89Hz\x9a0E9D\x00\x00\xe0\x94\xb8f\a\x02\x1bb\xd3@\xcf&R\xf3\xf9_\xd2\xdcgi\x8b\u07ca\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xb8}\xe1\xbc\u0492i\xd5!\xb8v\x1c\u00dc\xfbC\x19\xd2\xea\u054965\u026d\xc5\u07a0\x00\x00\u07d4\xb8\u007fSv\xc2\xde\vl\xc3\xc1y\xc0`\x87\xaaG=kFt\x89Hz\x9a0E9D\x00\x00\u07d4\xb8\x84\xad\u060d\x83\xdcVJ\xb8\xe0\xe0,\xbd\xb69\x19\xae\xa8D\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb8\x8a7\xc2\u007fx\xa6\x17\xd5\xc0\x91\xb7\u0577:7a\xe6_*\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb8\x94x\"\u056c\u79ad\x83&\xe9T\x96\"\x1e\v\xe6\xb7=\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb8\x9c\x03n\xd7\u0112\x87\x99!\xbeA\xe1\f\xa1i\x81\x98\xa7L\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94\xb8\x9fF2\xdfY\t\xe5\x8b*\x99d\xf7O\xeb\x9a;\x01\xe0\u014a\x04\x88u\xbc\xc6\xe7\xcb\xeb\x80\x00\u07d4\xb8\xa7\x9c\x84\x94^G\xa9\xc3C\x86\x83\u05b5\x84,\xffv\x84\xb1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb8\xa9y5'Y\xba\t\xe3Z\xa5\x93]\xf1u\xbf\xf6x\xa1\b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb8\xab9\x80[\xd8!\x18Ol\xbd=$s4{\x12\xbf\x17\\\x89\x06hZ\xc1\xbf\xe3,\x00\x00\xe0\x94\xb8\xac\x11}\x9f\r\xba\x80\x90\x14E\x82:\x92\x11\x03\xa51o\x85Zew\x9d\x1b\x8a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4\xb9\xe9\f\x11\x92\xb3\xd5\xd3\xe3\xab\a\x00\xf1\xbfe_]\xd44z\x89\x1b\x19\xe5\vD\x97|\x00\x00\u07d4\xb9\xfd83\xe8\x8e|\xf1\xfa\x98y\xbd\xf5Z\xf4\xb9\x9c\xd5\xce?\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xba\x02I\xe0\x1d\x94[\xef\x93\xee^\xc6\x19%\xe0<\\\xa5\t\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xba\x0f9\x02;\xdb)\xeb\x18b\xa9\xf9\x05\x9c\xab]0nf/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xba\x10\xf2vB\x90\xf8uCCr\xf7\x9d\xbfq8\x01\u02ac\x01\x893\xc5I\x901r\f\x00\x00\u07d4\xba\x151\xfb\x9ey\x18\x96\xbc\xf3\xa8\x05X\xa3Y\xf6\xe7\xc1D\xbd\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xba\x17m\xbe2I\xe3E\xcdO\xa9g\xc0\xed\x13\xb2LG\u5189\x15\xae\xf9\xf1\xc3\x1c\u007f\x00\x00\xe0\x94\xba\x1f\x0e\x03\u02da\xa0!\xf4\xdc\xeb\xfa\x94\xe5\u0209\xc9\u01fc\x9e\x8a\x06\u0450\xc4u\x16\x9a \x00\x00\u07d4\xba\x1f\xca\xf2#\x93~\xf8\x9e\x85gU\x03\xbd\xb7\xcaj\x92\x8bx\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\xe0\x94\xba$\xfcCgS\xa79\xdb,\x8d@\xe6\xd4\xd0LR\x8e\x86\xfa\x8a\x02\xc0\xbb=\xd3\fN \x00\x00\u07d4\xbaB\xf9\xaa\xceL\x18E\x04\xab\xf5BWb\xac\xa2oq\xfb\u0709\x02\a\a}\u0627\x9c\x00\x00\u07d4\xbaF\x9a\xa5\u00c6\xb1\x92\x95\u0521\xb5G;T\x03S9\f\x85\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbad@\xae\xb3s{\x8e\xf0\xf1\xaf\x9b\f\x15\xf4\xc2\x14\xff\xc7\u03c965\u026d\xc5\u07a0\x00\x00\xe0\x94\xbam1\xb9\xa2a\xd6@\xb5\u07a5\x1e\xf2\x16,1\t\xf1\uba0a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xbap\xe8\xb4u\x9c\f<\x82\xcc\x00\xacN\x9a\x94\xdd[\xaf\xb2\xb8\x890C\xfa3\xc4\x12\xd7\x00\x00\u07d4\xba\x8ac\xf3\xf4\r\u4a03\x88\xbcP!/\xea\x8e\x06O\xbb\x86\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xba\x8eF\u059d.#C\xd8l`\xd8,\xf4, A\xa0\xc1\u0089\x05k\xc7^-c\x10\x00\x00\u07d4\xba\xa4\xb6L+\x15\xb7\x9f_ BF\xfdp\xbc\xbd\x86\xe4\xa9*\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xba\u0212,J\xcc},\xb6\xfdY\xa1N\xb4\\\xf3\xe7\x02!K\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xba\xd25\xd5\b]\u01f0h\xa6|A&w\xb0>\x186\x88L\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xba\xd4B^\x17\x1c>r\x97^\xb4j\xc0\xa0\x15\xdb1Z]\x8f\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xba\xdc*\xef\x9fYQ\xa8\u05cak5\xc3\u0433\xa4\xe6\xe2\xe79\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xba\xdeCY\x9e\x02\xf8OL0\x14W\x1c\x97k\x13\xa3le\xab\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xba\xe9\xb8/r\x99c\x14\be\x9d\xd7N\x89\x1c\xb8\xf3\x86\x0f\xe5\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xbb\x03f\xa7\u03fd4E\xa7\r\xb7\xfeZ\xe3H\x85uO\xd4h\x8a\x01M\xef,B\xeb\xd6@\x00\x00\u07d4\xbb\aj\xac\x92 \x80i\xea1\x8a1\xff\x8e\xeb\x14\xb7\xe9\x96\xe3\x89\b\x13\xcaV\x90m4\x00\x00\u07d4\xbb\bW\xf1\xc9\x11\xb2K\x86\u0227\x06\x81G?\u6aa1\xcc\xe2\x89\x05k\xc7^-c\x10\x00\x00\u0794\xbb\x19\xbf\x91\u02edt\xcc\xeb_\x81\x1d\xb2~A\x1b\xc2\xea\x06V\x88\xf4?\xc2\xc0N\xe0\x00\x00\xe0\x94\xbb'\u01a7\xf9\x10uGZ\xb2)a\x90@\xf8\x04\xc8\xeczj\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xbb7\x1cr\xc9\xf01l\xea+\xd9\xc6\xfb\xb4\a\x9ewT)\xef\x89_h\xe8\x13\x1e\u03c0\x00\x00\xe0\x94\xbb;\x01\v\x18\xe6\xe2\xbe\x115\x87\x10&\xb7\xba\x15\xea\x0f\xde$\x8a\x02 |\x800\x9bwp\x00\x00\xe0\x94\xbb;\x90\x05\xf4o\xd2\xca;0\x16%\x99\x92\x8cw\xd9\xf6\xb6\x01\x8a\x01\xb1\xae\u007f+\x1b\xf7\xdb\x00\x00\u07d4\xbb?\xc0\xa2\x9c\x03Mq\b\x12\xdc\xc7u\xc8\u02b9\u048diu\x899\xd4\xe8D\xd1\xcf_\x00\x00\u07d4\xbbH\xea\xf5\x16\xce-\xec>A\xfe\xb4\xc6y\xe4\x95vA\x16O\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4\xbbKJKT\x80p\xffAC,\x9e\b\xa0\xcao\xa7\xbc\x9fv\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\xbbV\xa4\x04r<\xff \xd0hT\x88\xb0Z\x02\xcd\xc3Z\xac\xaa\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbba\x8e%\"\x1a\u0667@\xb2\x99\xed\x14\x06\xbc94\xb0\xb1m\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbba\xa0K\xff\xd5|\x10G\rE\u00d1\x03\xf6FP4v\x16\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbbh#\xa1\xbd\x81\x9f\x13QU8&J-\xe0R\xb4D\"\b\x89\x01ch\xffO\xf9\xc1\x00\x00\u07d4\xbbl(J\xac\x8ai\xb7\\\u0770\x0f(\xe1EX;V\xbe\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4\xbbu\xcbPQ\xa0\xb0\x94KFs\xcau*\x97\x03\u007f|\x8c\x15\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbb\x99;\x96\xee\x92Z\xda}\x99\u05c6W=?\x89\x18\f\u3a89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbb\xa3\u0180\x04$\x8eH\x95s\xab\xb2t6w\x06k$\u0227\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbb\xa4\xfa\xc3\xc4 9\xd8(\xe7B\xcd\xe0\xef\xff\xe7t\x94\x1b9\x89lj\u04c2\xd4\xfba\x00\x00\u07d4\xbb\xa8\xab\"\xd2\xfe\xdb\xcf\xc6?hL\b\xaf\xdf\x1c\x17P\x90\xb5\x89\x05_)\xf3~N;\x80\x00\u07d4\xbb\xa9v\xf1\xa1!_u\x12\x87\x18\x92\xd4_pH\xac\xd3V\u0209lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbb\xab\x00\v\x04\b\xed\x01Z7\xc0GG\xbcF\x1a\xb1N\x15\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xbb\xab\xf6d;\xebK\xd0\x1c\x12\v\xd0Y\x8a\t\x87\xd8)g\u0449\xb52\x81x\xad\x0f*\x00\x00\u07d4\xbb\xb4\xee\x1d\x82\xf2\xe1VD,\xc938\xa2\xfc(o\xa2\x88d\x89JD\x91\xbdm\xcd(\x00\x00\u07d4\xbb\xb5\xa0\xf4\x80,\x86H\x00\x9e\x8ai\x98\xaf5,\u0787TO\x89\x05-T(\x04\xf1\xce\x00\x00\u07d4\xbb\xb6C\xd2\x18{6J\xfc\x10\xa6\xfd6\x8d}U\xf5\r\x1a<\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbb\xb8\xff\xe4?\x98\u078e\xae\x18F#\xaeRd\xe4$\u0438\u05c9\x05\xd5?\xfd\xe9(\b\x00\x00\u07d4\xbb\xbdn\u02f5u(\x91\xb4\u03b3\xcc\xe7:\x8fGpY7o\x89\x01\xf3\x99\xb1C\x8a\x10\x00\x00\u07d4\xbb\xbf9\xb1\xb6y\x95\xa4\"APO\x97\x03\u04a1JQV\x96\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xbb\xc8\xea\xffc~\x94\xfc\u014d\x91\xdb\\\x89\x12\x1d\x06\xe1/\xff\x98\x80\x00\u07d4\xbc\u065e\xdc!`\xf2\x10\xa0^:\x1f\xa0\xb0CL\xed\x00C\x9b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbc\u07ec\xb9\xd9\x02<4\x17\x18.\x91\x00\xe8\xea\x1d73\x93\xa3\x89\x034-`\xdf\xf1\x96\x00\x00\u07d4\xbc\xe1>\"2*\u03f3U\xcd!\xfd\r\xf6\f\xf9:\xdd&\u0189\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xbc\xe4\x04u\xd3E\xb0q-\xeep=\x87\xcdvW\xfc\u007f;b\x8a\x01\xa4 \xdb\x02\xbd}X\x00\x00\u07d4\xbc\xed\xc4&|\u02c9\xb3\x1b\xb7d\xd7!\x11q\x00\x8d\x94\xd4M\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbc\xfc\x98\xe5\xc8+j\xdb\x18\n?\xcb\x12\v\x9av\x90\xc8j?\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbd\x04;g\xc6>`\xf8A\xcc\xca\x15\xb1)\xcd\xfee\x90\xc8\xe3\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbd\x04\u007f\xf1\xe6\x9c\u01b2\x9a\xd2d\x97\xa9\xa6\xf2z\x90?\xc4\u0749.\xe4IU\b\x98\xe4\x00\x00\u07d4\xbd\b\xe0\xcd\xde\xc0\x97\xdby\x01\ua05a=\x1f\xd9\u0789Q\xa2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbd\t\x12l\x89\x1cJ\x83\x06\x80Y\xfe\x0e\x15ylFa\xa9\xf4\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xbd\f\\\u05d9\xeb\u0106B\xef\x97\xd7N\x8eB\x90d\xfe\u4489\x11\xac(\xa8\xc7)X\x00\x00\u07d4\xbd\x17\xee\xd8+\x9a%\x92\x01\x9a\x1b\x1b<\x0f\xba\xd4\\@\x8d\"\x89\r\x8drkqw\xa8\x00\x00\u07d4\xbd\x18\x037\v\u0771)\xd29\xfd\x16\xea\x85&\xa6\x18\x8a\u5389\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xbd+p\xfe\xcc7d\x0fiQO\xc7\xf3@IF\xaa\xd8k\x11\x89A\rXj \xa4\xc0\x00\x00\u07d4\xbd0\x97\xa7\x9b<\r.\xbf\xf0\xe6\xe8j\xb0\xed\xad\xbe\xd4p\x96\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xbd2]@)\xe0\xd8r\x9fm9\x9cG\x82$\xae\x9ez\xe4\x1e\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xbdC*9\x16$\x9bG$):\xf9\x14nI\xb8(\n\u007f*\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xbdG\xf5\xf7n;\x93\x0f\xd9HR\t\xef\xa0\xd4v=\xa0uh\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbdK`\xfa\xect\n!\xe3\a\x13\x91\xf9j\xa54\xf7\xc1\xf4N\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xbdK\u0571\"\xd8\xef{|\x8f\x06gE\x03 \xdb!\x16\x14.\x89 \x86\xac5\x10R`\x00\x00\u07d4\xbdQ\xee.\xa1C\u05f1\u05b7~~D\xbd\xd7\xda\x12\U00105b09G~\x06\u0332\xb9(\x00\x00\u07d4\xbdY\tN\aO\x8dy\x14*\xb1H\x9f\x14\x8e2\x15\x1f \x89\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbdZ\x8c\x94\xbd\x8b\xe6G\x06D\xf7\f\x8f\x8a3\xa8\xa5\\cA\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbd^G:\xbc\xe8\xf9zi2\xf7|/\xac\xaf\x9c\xc0\xa0\x05\x14\x89<\x92X\xa1\x06\xa6\xb7\x00\x00\u07d4\xbd_F\u02ab,=K(\x93\x96\xbb\xb0\u007f *\x06\x11>\xd4\xc3\xfb\xa1\xa8\x91;\x19@~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\x9eV\xe9\x02\xf4\xbe\x1f\xc8v\x8d\x808\xba\xc6>*\u02ff\x8e\x8965f3\xeb\xd8\xea\x00\x00\u07d4\xbd\xa4\xbe1~~K\xed\x84\xc0I^\xee2\xd6\a\xec8\xcaR\x89}2'yx\xefN\x80\x00\u07d4\xbd\xb6\v\x82:\x11s\xd4Z\a\x92$_\xb4\x96\xf1\xfd3\x01\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\xba\xf6CM@\xd65[\x1e\x80\xe4\f\u012b\x9ch\xd9a\x16\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xbd\xc0,\xd43\f\x93\xd6\xfb\xdaOm\xb2\xa8]\xf2/C\xc23\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\xc4aF+c\"\xb4b\xbd\xb3?\"y\x9e\x81\b\xe2A}\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xbd\xc79\xa6\x99p\v.\x8e,JL{\x05\x8a\x0eQ=\u07be\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\xc7Hs\xaf\x92+\x9d\xf4t\x85;\x0f\xa7\xff\v\xf8\xc8&\x95\x89\xd8\xc9F\x00c\xd3\x1c\x00\x00\u07d4\xbd\xca*\x0f\xf3E\x88\xafb_\xa8\xe2\x8f\xc3\x01Z\xb5\xa3\xaa\x00\x89~\xd7?w5R\xfc\x00\x00\u07d4\xbd\xd3%N\x1b:m\xc6\xcc,i}Eq\x1a\xca!\xd5\x16\xb2\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbd\u07e3M\x0e\xbf\x1b\x04\xafS\xb9\x9b\x82IJ\x9e=\x8a\xa1\x00\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xbd\xe4\xc7?\x96\x9b\x89\xe9\u03aef\xa2\xb5\x18DH\x0e\x03\x8e\x9a\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xbd\xe9xj\x84\xe7[H\xf1\x8erm\u05cdp\xe4\xaf>\xd8\x02\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4\xbd\xed\x11a/\xb5\xc6\u0699\xd1\xe3\x0e2\v\xc0\x99Tf\x14\x1e\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xbd\xed~\a\xd0q\x1ehM\xe6Z\u0232\xabW\xc5\\\x1a\x86E\x89 \t\xc5\u023fo\xdc\x00\x00\u07d4\xbd\xf6\x93\xf83\xc3\xfeG\x17S\x18G\x88\xebK\xfeJ\xdc?\x96\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbd\xf6\xe6\x8c\f\xd7X@\x80\xe8G\xd7,\xbb#\xaa\xd4j\xeb\x1d\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbe\n/8_\t\xdb\xfc\xe9g2\xe1+\xb4\n\xc3I\x87\x1b\xa8\x89WL\x11^\x02\xb8\xbe\x00\x00\u07d4\xbe\f*\x80\xb9\xde\bK\x17(\x94\xa7l\xf4szOR\x9e\x1a\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xbe\x1c\xd7\xf4\xc4r\a\th\xf3\xbd\xe2h6k!\xee\xea\x83!\x89\xe9\x1a|\u045f\xa3\xb0\x00\x00\u07d4\xbe#F\xa2\u007f\xf9\xb7\x02\x04OP\r\xef\xf2\xe7\xff\xe6\x82EA\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbe$q\xa6\u007f`G\x91\x87r\xd0\xe3h9%^\xd9\u0591\xae\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xbe+\"\x80R7h\xea\x8a\xc3\\\xd9\xe8\x88\xd6\nq\x93\x00\u0509lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbe+2nx\xed\x10\xe5P\xfe\xe8\xef\xa8\xf8\a\x03\x96R/Z\x8a\bW\xe0\xd6\xf1\xdav\xa0\x00\x00\xe0\x94\xbe0Zyn3\xbb\xf7\xf9\xae\xaee\x12\x95\x90f\xef\xda\x10\x10\x8a\x02M\xceT\xd3J\x1a\x00\x00\x00\u07d4\xbeG\x8e\x8e=\xdek\xd4\x03\xbb-\x1ce|C\x10\xee\x19'#\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4\xbeN}\x98?.*ck\x11\x02\xecp9\xef\xeb\xc8B\u9349\x03\x93\xef\x1aQ'\xc8\x00\x00\u07d4\xbeO\xd0sap\"\xb6\u007f\\\x13I\x9b\x82\u007fv69\xe4\xe3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbeRZ3\xea\x91aw\xf1r\x83\xfc\xa2\x9e\x8b5\v\u007fS\v\x89\x8f\x01\x9a\xafF\xe8x\x00\x00\u07d4\xbeS2/C\xfb\xb5\x84\x94\xd7\xcc\xe1\x9d\xda'+$P\xe8'\x89\n\xd7\u03afB\\\x15\x00\x00\u07d4\xbeS\x82F\xddNo\f \xbfZ\xd17<;F:\x13\x1e\x86\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbeZ`h\x99\x98c\x9a\xd7[\xc1\x05\xa3qt>\xef\x0fy@\x89\x1b2|s\xe1%z\x00\x00\u07d4\xbe\\\xba\x8d7By\x86\xe8\xca&\x00\xe8X\xbb\x03\xc3YR\x0f\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\xbe`\x03~\x90qJK\x91~a\xf1\x93\xd84\x90g\x03\xb1:\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xbec:77\xf6\x849\xba\xc7\xc9\nR\x14 X\ue38ao\x894\n\xad!\xb3\xb7\x00\x00\x00\xe0\x94\xbee\x9d\x85\xe7\xc3O\x883\xea\u007fH\x8d\xe1\xfb\xb5\xd4\x14\x9b\xef\x8a\x01\xeb\xd2:\xd9\u057br\x00\x00\u07d4\xbes'M\x8cZ\xa4J<\xbe\xfc\x82c\xc3{\xa1!\xb2\n\u04c9\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xbe\x86\u0430C\x84\x19\u03b1\xa081\x927\xbaR\x06\xd7.F\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\xbe\x8d\u007f\x18\xad\xfe]l\xc7u9I\x89\xe1\x93\f\x97\x9d\x00}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbe\x91\x86\xc3JRQJ\xbb\x91\a\x86\x0fgO\x97\xb8!\xbd[\x89\x1b\xa0\x1e\xe4\x06\x03\x10\x00\x00\u07d4\xbe\x93W\x93\xf4[p\xd8\x04]&T\xd8\xdd:\xd2K[a7\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xbe\x98\xa7\u007f\xd4\x10\x97\xb3OY\xd7X\x9b\xaa\xd0!e\x9f\xf7\x12\x890\xca\x02O\x98{\x90\x00\x00\u07d4\xbe\x9b\x8c4\xb7\x8e\xe9G\xff\x81G.\xdaz\xf9\xd2\x04\xbc\x84f\x89\b!\xab\rD\x14\x98\x00\x00\u07d4\xbe\xa0\r\xf1pg\xa4:\x82\xbc\x1d\xae\xca\xfbl\x140\x0e\x89\xe6\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xbe\xa0\xaf\xc9:\xae!\b\xa3\xfa\xc0Yb;\xf8o\xa5\x82\xa7^\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xbe\xb35\x8cP\u03dfu\xff\xc7mD<,\u007fU\aZ\x05\x89\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xbe\xb4\xfd1UYC`E\u0739\x9dI\xdc\xec\x03\xf4\fB\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4\xbe\xc2\xe6\xde9\xc0|+\xaeUj\u03fe\xe2\xc4r\x8b\x99\x82\xe3\x89\x1f\x0f\xf8\xf0\x1d\xaa\xd4\x00\x00\u07d4\xbe\xc6d\x0fI\t\xb5\x8c\xbf\x1e\x80cB\x96\x1d`u\x95\tl\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xbe\xc8\xca\xf7\xeeIF\x8f\xeeU.\xff:\xc5#N\xb9\xb1}B\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbe\xce\xf6\x1c\x1cD+\xef|\xe0Ks\xad\xb2I\xa8\xba\x04~\x00\x896;V\u00e7T\xc8\x00\x00\u0794\xbe\xd4d\x9d\xf6F\u2052)\x03-\x88hUo\xe1\xe0S\u04c8\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\xbe\xd4\xc8\xf0\x06\xa2|\x1e_|\xe2\x05\xdeu\xf5\x16\xbf\xb9\xf7d\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xbe\xe8\u0430\bB\x19T\xf9-\x00\r9\x0f\xb8\xf8\xe6X\xea\xee\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbe\xec\u05af\x90\f\x8b\x06J\xfc\xc6\a?-\x85\u055a\xf1\x19V\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbe\xef\x94!8y\xe0&\"\x14+\xeaa)\tx\x93\x9a`\u05ca\x016\x85{2\xad\x86\x04\x80\x00\xe0\x94\xbe\xf0}\x97\xc3H\x1f\x9dj\xee\x1c\x98\xf9\xd9\x1a\x18\n2D+\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xbe\xfbD\x8c\f_h?\xb6~\xe5p\xba\xf0\xdbV\x86Y\x97Q\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbf\x05\a\f,4!\x93\x11\xc4T\x8b&\x14\xa48\x81\r\xedm\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbf\x05\xff^\xcf\r\xf2\u07c8wY\xfb\x82t\xd928\xac&}\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94\xbf\t\xd7pH\xe2p\xb6b3\x0e\x94\x86\xb3\x8bC\xcdx\x14\x95\x8a\\S\x9b{\xf4\xff(\x80\x00\x00\u07d4\xbf\x17\xf3\x97\xf8\xf4o\x1b\xaeE\u0447\x14\x8c\x06\xee\xb9Y\xfaM\x896I\u0156$\xbb0\x00\x00\u07d4\xbf\x186A\xed\xb8\x86\xce`\xb8\x19\x02a\xe1OB\xd9<\xce\x01\x89\x01[5W\xf1\x93\u007f\x80\x00\u07d4\xbf*\xeaZ\x1d\xcfn\u04f5\xe829D\xe9\x83\xfe\xdf\u046c\xfb\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xbf@\x96\xbcT}\xbf\xc4\xe7H\t\xa3\x1c\x03\x9e{8\x9d^\x17\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xbfI\xc1H\x981eg\u0637\t\xc2\xe5\x05\x94\xb3f\xc6\u04cc\x89'\xbf8\xc6TM\xf5\x00\x00\u07d4\xbfLs\xa7\xed\xe7\xb1d\xfe\a!\x14\x846T\xe4\xd8x\x1d\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xbfP\xce.&K\x9f\xe2\xb0h0az\xed\xf5\x02\xb25\x1bE\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbfY\xae\xe2\x81\xfaC\xfe\x97\x19CQ\xa9\x85~\x01\xa3\xb8\x97\xb2\x89 \x86\xac5\x10R`\x00\x00\u07d4\xbfh\u048a\xaf\x1e\xee\xfe\xf6F\xb6^\x8c\xc8\u0450\xf6\xc6\u069c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbfi%\xc0\aQ\x00\x84@\xa6s\x9a\x02\xbf+l\u06ab^:\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbfw\x01\xfcb%\u0561x\x15C\x8a\x89A\xd2\x1e\xbc]\x05\x9d\x89e\xea=\xb7UF`\x00\x00\u07d4\xbf\x8b\x80\x05\xd66\xa4\x96d\xf7Bu\xefBC\x8a\xcde\xac\x91\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbf\x92A\x8a\fl1$M\"\x02`\xcb>\x86}\u05f4\xefI\x89\x05i\x00\xd3<\xa7\xfc\x00\x00\u07d4\xbf\x9a\xcdDE\xd9\xc9UF\x89\u02bb\xba\xb1\x88\x00\xff\x17A\u008965\u026d\xc5\u07a0\x00\x00\u07d4\xbf\x9f'\x1fz~\x12\xe3m\xd2\xfe\x9f\xac\xeb\xf3\x85\xfeaB\xbd\x89\x03f\xf8O{\xb7\x84\x00\x00\u07d4\xbf\xa8\xc8X\xdf\x10,\xb1$!\x00\x8b\n1\xc4\xc7\x19\n\xd5`\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbf\xae\xb9\x10ga}\u03cbD\x17+\x02\xafaVt\x83]\xba\x89\b\xb5\x9e\x88H\x13\b\x80\x00\xe0\x94\xbf\xb0\xea\x02\xfe\xb6\x1d\xec\x9e\"\xa5\a\tY3\x02\x99\xc40r\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xbf\xbc\xa4\x18\xd3R\x9c\xb3\x93\b\x10b\x03*n\x11\x83\u01b2\u070a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xbf\xbe\x05\u831c\xbb\xcc\x0e\x92\xa4\x05\xfa\xc1\xd8]\xe2H\xee$\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xbf\xbf\xbc\xb6V\u0099+\xe8\xfc\u0782\x19\xfb\xc5J\xad\u055f)\x8a\x02\x1e\x18\xd2\xc8!\xc7R\x00\x00\u07d4\xbf\xc5z\xa6f\xfa\u239f\x10zI\xcbP\x89\xa4\xe2!Q\u074965\u026d\xc5\u07a0\x00\x00\u07d4\xbf\u02d70$c\x04p\r\xa9\vAS\xe7\x11Ab.\x1cA\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xbf\xd9<\x90\u009c\a\xbc_\xb5\xfcI\xae\xeaU\xa4\x0e\x13O5\x8a\x05\xed\xe2\x0f\x01\xa4Y\x80\x00\x00\xe0\x94\xbf\xe3\xa1\xfcn$\xc8\xf7\xb3%\x05`\x99\x1f\x93\u02e2\u03c0G\x8a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\xbf\u6f30\xf0\xc0xRd3$\xaa]\xf5\xfdb%\xab\xc3\u0289\x04\t\xe5+H6\x9a\x00\x00\u07d4\xbf\xf5\xdfv\x994\xb8\x94<\xa9\x13}\x0e\xfe\xf2\xfen\xbb\xb3N\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xbf\xfbi)$\x1fx\x86\x93'>p\"\xe6\x0e>\xab\x1f\xe8O\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc0\x06O\x1d\x94t\xab\x91]V\x90l\x9f\xb3 \xa2\xc7\t\x8c\x9b\x89\x13h?\u007f<\x15\xd8\x00\x00\u07d4\xc0\a\xf0\xbd\xb6\xe7\x00\x92\x02\xb7\xaf>\xa9\t\x02i|r\x14\x13\x89\xa2\xa0\xe4>\u007f\xb9\x83\x00\x00\u07d4\xc0\n\xb0\x80\xb6C\xe1\u00ba\xe3c\xe0\u0455\xde.\xff\xfc\x1cD\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794\xc0 wD\x9a\x13Jz\xd1\xef~M\x92z\xff\xec\ueb75\xae\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xc0$q\xe3\xfc.\xa0S&\x15\xa7W\x1dI2\x89\xc1<6\xef\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc0-n\xad\xea\xcf\x1bx\xb3\u0285\x03\\c{\xb1\xce\x01\xf4\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc03\xb12Z\n\xf4Tr\xc2U'\x85;\x1f\x1c!\xfa5\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xc03\xbe\x10\xcbHa;\xd5\xeb\xcb3\xedI\x02\xf3\x8bX0\x03\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xc04[3\xf4\x9c\xe2\u007f\xe8,\xf7\xc8M\x14\x1ch\xf5\x90\xcev\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc0=\xe4*\x10\x9bezd\xe9\"$\xc0\x8d\xc1'^\x80\u0672\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc0@i\u07f1\x8b\tlxg\xf8\xbe\xe7zm\xc7Gz\xd0b\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\xc0A?Z|-\x9aK\x81\b(\x9e\xf6\xec\xd2qx\x15$\xf4\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xc0C\xf2E-\u02d6\x02\xefb\xbd6\x0e\x03=\xd29q\xfe\x84\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc0OK\xd4\x04\x9f\x04F\x85\xb8\x83\xb6)Y\xaec\x1df~5\x8a\x01;\x80\xb9\x9cQ\x85p\x00\x00\u07d4\xc0V\u053dk\xf3\u02ec\xace\xf8\xf5\xa0\xe3\x98\v\x85'@\xae\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xc0[t\x06 \xf1s\xf1nRG\x1d\u00cb\x9cQJ\v\x15&\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\xc0i\xef\x0e\xb3B\x99\xab\xd2\xe3-\xab\xc4yD\xb2r3H$\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4\xc0l\xeb\xbb\xf7\xf5\x14\x9af\xf7\xeb\x97k>G\xd5e\x16\xda/\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc0r^\u00bd\xc3:\x1d\x82`q\u07a2\x9db\xd48Z\x8c%\x8a\b\xa0\x85\x13F:\xa6\x10\x00\x00\u07d4\xc0~8g\xad\xa0\x96\x80z\x05\x1al\x9c4\xcc;?J\xd3J\x89`\xf0f \xa8IE\x00\x00\u07d4\xc0\x89^\xfd\x05m\x9a:\x81\xc3\xdaW\x8a\xda1\x1b\xfb\x93V\u03c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc0\x90\xfe#\xdc\xd8k5\x8c2\xe4\x8d*\xf9\x10$%\x9fef\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc0\x9af\x17*\xea7\r\x9ac\xda\x04\xffq\xff\xbb\xfc\xff\u007f\x94\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc0\x9e<\xfc\x19\xf6\x05\xff>\xc9\xc9\xc7\x0e%@\xd7\xee\x97Cf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc0\xa0*\xb9N\xbeV\xd0E\xb4\x1bb\x9b\x98F.:\x02J\x93\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xc0\xa3\x93\b\xa8\x0e\x9e\x84\xaa\xaf\x16\xac\x01\xe3\xb0\x1dt\xbdk-\x89\afM\xddL\x1c\v\x80\x00\u07d4\xc0\xa6\u02edwi*=\x88\xd1A\xefv\x9a\x99\xbb\x9e<\x99Q\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xc0\xa7\xe8C]\xff\x14\xc2Uws\x9d\xb5\\$\u057fW\xa3\u064a\nm\xd9\f\xaeQ\x14H\x00\x00\u07d4\xc0\xae\x14\xd7$\x83./\xce'x\xde\u007f{\x8d\xaf{\x12\xa9>\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc0\xaf\xb7\u0637\x93p\xcf\xd6c\u018c\u01b9p*7\u035e\xff\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc0\xb0\xb7\xa8\xa6\xe1\xac\xdd\x05\xe4\u007f\x94\xc0\x96\x88\xaa\x16\u01ed\x8d\x89\x03{m\x02\xacvq\x00\x00\xe0\x94\xc0\xb3\xf2D\xbc\xa7\xb7\xde[H\xa5>\u06dc\xbe\xab\vm\x88\xc0\x8a\x01;\x80\xb9\x9cQ\x85p\x00\x00\u07d4\xc0\xc0M\x01\x06\x81\x0e>\xc0\xe5J\x19\U000ab157\xe6\x9aW=\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xc0\xca2w\x94.tE\x87K\xe3\x1c\xeb\x90)rqO\x18#\x89\r\x8drkqw\xa8\x00\x00\u07d4\xc0\u02ed<\xcd\xf6T\xda\"\xcb\xcf\\xe\x97\xca\x19U\xc1\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc0\xcb\xf6\x03/\xa3\x9e|F\xffw\x8a\x94\xf7\xd4E\xfe\"\xcf0\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4\xc0\xe0\xb9\x03\b\x8e\fc\xf5=\xd0iWTR\xaf\xf5$\x10\u00c9\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xc0\xe4W\xbdV\xec6\xa1$k\xfa20\xff\xf3\x8eY&\xef\"\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xc0\xed\rJ\xd1\r\xe045\xb1S\xa0\xfc%\xde;\x93\xf4R\x04\x89\xabM\xcf9\x9a:`\x00\x00\u07d4\xc0\xf2\x9e\xd0\af\x11\xb5\xe5^\x13\x05G\xe6\x8aH\xe2m\xf5\u4262\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xc1\x13(x#\\]\u06e5\xd9\xf3\"\x8bR6\xe4p \xdco\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc1\x17\r\xba\xad\xb3\xde\xe6\x19\x8e\xa5D\xba\xec\x93%\x18`\xfd\xa5\x89A\rXj \xa4\xc0\x00\x00\xe0\x94\xc1&W=\x87\xb0\x17ZR\x95\xf1\xdd\a\xc5u\u03cc\xfa\x15\xf2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xc1'\xaa\xb5\x90e\xa2\x86D\xa5k\xa3\xf1^.\xac\x13\xda)\x95\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xc1+\u007f@\u07da/{\xf9\x83f\x14\"\xab\x84\xc9\xc1\xf5\bX\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xc1,\xfb{=\xf7\x0f\xce\xca\x0e\xde&5\x00\xe2xs\xf8\xed\x16\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc1/\x88\x1f\xa1\x12\xb8\x19\x9e\xcb\xc7>\xc4\x18W\x90\xe6\x14\xa2\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc18Lnq~\xbeK#\x01NQ\xf3\x1c\x9d\xf7\xe4\xe2[1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc1C\x8c\x99\xddQ\xef\x1c\xa88j\xf0\xa3\x17\xe9\xb0AEx\x88\x89\f\x1d\xaf\x81\u0623\xce\x00\x00\u07d4\xc1c\x12(\xef\xbf*.:@\x92\xee\x89\x00\xc69\xed4\xfb\u02093\xc5I\x901r\f\x00\x00\u07d4\xc1u\xbe1\x94\xe6iB-\x15\xfe\xe8\x1e\xb9\xf2\xc5lg\xd9\u0249\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc1\x82v\x86\xc0\x16\x94\x85\xec\x15\xb3\xa7\xc8\xc0\x15\x17\xa2\x87M\xe1\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xc1\x8a\xb4g\xfe\xb5\xa0\xaa\xdf\xff\x91#\x0f\xf0VFMx\xd8\x00\x89lk\x93[\x8b\xbd@\x00\x00\u0794\xc1\x95\x05CUM\x8aq0\x03\xf6b\xbba,\x10\xadL\xdf!\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xc1\xa4\x1aZ'\x19\x92&\xe4\xc7\xeb\x19\x8b\x03\x1bY\x19o\x98B\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\xc1\xb2\xa0\xfb\x9c\xadE\xcdi\x91\x92\xcd'T\v\x88\xd38By\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc1\xb2\xaa\x8c\xb2\xbfb\xcd\xc1:G\xec\xc4e\u007f\xac\xaa\x99_\x98\x8967\x93\xfa\x96\u6980\x00\u07d4\xc1\xb5\x00\x01\x1c\xfb\xa9]|\xd66\xe9^l\xbfagFK%\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc1\xb9\xa5pM5\x1c\xfe\x98?y\xab\xee\xc3\u06fb\xae;\xb6)\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc1\xcb\xd2\xe23*RL\xf2\x19\xb1\r\x87\x1c\xcc \xaf\x1f\xb0\xfa\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xc1\xcd\xc6\x01\xf8\x9c\x04(\xb3\x13\x02\u0447\xe0\xdc\b\xad}\x1cW\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xc1\u052f8\xe9\xbay\x90@\x89HI\xb8\xa8!\x93u\xf1\xacx\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc1\xe1@\x9c\xa5,%CQ4\xd0\x06\u00a6\xa8T-\xfbrs\x89\x01\xdd\x1eK\xd8\xd1\xee\x00\x00\u07d4\xc1\xeb\xa5hJ\xa1\xb2L\xbac\x15\x02c\xb7\xa9\x13\x1a\xee\u008d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc1\xec\x81\xdd\x12=K|-\u0674\xd48\xa7\a,\x11\u0707L\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc1\xf3\x9b\xd3]\xd9\xce\xc37\xb9oG\xc6w\x81\x81`\xdf7\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794\xc1\xff\xad\a\u06d6\x13\x8cK*S\x0e\xc1\xc7\xde)\xb8\xa0Y,\x88\xf4?\xc2\xc0N\xe0\x00\x00\xe0\x94\xc2\x1f\xa6d:\x1f\x14\xc0)\x96\xadqD\xb7Y&\xe8~\xcbK\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc24\nL\xa9L\x96x\xb7IL<\x85%(\xed\xe5\xeeR\x9f\x89\x02\xa3k\x05\xa3\xfd|\x80\x00\u07d4\xc29\xab\u07ee>\x9a\xf5E\u007fR\xed+\x91\xfd\n\xb4\xd9\xc7\x00\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc2;/\x92\x1c\xe4\xa3z%\x9e\u4b4b!X\xd1]fOY\x89\x01`\x89\x95\xe8\xbd?\x80\x00\u07d4\xc2C\x99\xb4\xbf\x86\xf73\x8f\xbfd^;\"\xb0\u0dd79\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc2L\u03bc#D\xcc\xe5d\x17\xfbhL\xf8\x16\x13\xf0\xf4\xb9\xbd\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xc2Rf\xc7gf2\xf1>\xf2\x9b\xe4U\ud50a\xddVw\x92\x89Hz\x9a0E9D\x00\x00\u07d4\xc2\\\xf8&U\f\x8e\xaf\x10\xaf\"4\xfe\xf9\x04\u0779R\x13\xbe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc2f?\x81E\xdb\xfe\xc6\xc6F\xfc\\I\x96\x13E\xde\x1c\x9f\x11\x89%g\xacp9+\x88\x00\x00\u07d4\xc2pEh\x854+d\vL\xfc\x1bR\x0e\x1aTN\xe0\xd5q\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xc2sv\xf4]!\xe1^\xde;&\xf2e_\xce\xe0,\xcc\x0f*\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xc2w\x97q\xf0Smy\xa8p\x8fi1\xab\xc4K05\u964a\x047\u04ca\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xc2\xc1>r\xd2h\xe7\x15\r\u01d9\xe7\xc6\xcf\x03\u0209T\xce\u05c9%\xf2s\x93=\xb5p\x00\x00\u07d4\xc2\xcb\x1a\xda]\xa9\xa0B8s\x81G\x93\xf1aD\xef6\xb2\xf3\x89HU~;p\x17\xdf\x00\x00\u07d4\xc2\xd1w\x8e\xf6\xee_\xe4\x88\xc1E\xf3Xkn\xbb\xe3\xfb\xb4E\x89>\x1f\xf1\xe0;U\xa8\x00\x00\xe0\x94\xc2\xd9\xee\xdb\xc9\x01\x92c\xd9\xd1l\u016e\a-\x1d=\xd9\xdb\x03\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc2\xe0XJq4\x8c\xc3\x14\xb7; )\xb6#\v\x92\u06f1\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc2\xe2\u0518\xf7\r\xcd\bY\xe5\v\x02:q\nmK!3\xbd\x8989\x11\xf0\f\xbc\xe1\x00\x00\u07d4\xc2\xed_\xfd\u046d\xd8U\xa2i/\xe0b\xb5\xd6\x18t#`\u0509A\rXj \xa4\xc0\x00\x00\u07d4\xc2\xee\x91\xd3\xefX\xc9\u0465\x89\x84N\xa1\xae1%\xd6\u017ai\x894\x95tD\xb8@\xe8\x00\x00\u07d4\xc2\xfa\xfd\xd3\n\xcbmg\x06\xe9)<\xb0&A\xf9\xed\xbe\a\xb5\x89Q\x00\x86\vC\x0fH\x00\x00\u07d4\xc2\xfd\v\xf7\xc7%\xef>\x04~Z\xe1\u009f\xe1\x8f\x12\xa7)\x9c\x89Hz\x9a0E9D\x00\x00\u07d4\xc2\xfe}us\x1fcm\xcd\t\xdb\xda\x06q9;\xa0\xc8*}\x89wC\"\x17\xe6\x83`\x00\x00\u07d4\xc3\x10z\x9a\xf32-R8\xdf\x012A\x911b\x959W}\x89\x1a\xb4\xe4d\xd4\x141\x00\x00\xe0\x94\xc3\x11\v\xe0\x1d\xc9sL\xfcn\x1c\xe0\u007f\x87\xd7}\x13E\xb7\xe1\x8a\x01\x0f\f\xe9I\xe0\x0f\x93\x00\x00\u07d4\xc3 8\xcaR\xae\xe1\x97E\xbe\\1\xfc\xdcT\x14\x8b\xb2\xc4\u0409\x02\xb5\xaa\xd7,e \x00\x00\u07d4\xc3%\xc3R\x80\x1b\xa8\x83\xb3\"l_\xeb\r\xf9\xea\xe2\xd6\xe6S\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xc3.\xc7\xe4*\xd1l\xe3\xe2UZ\xd4\xc5C\x06\xed\xa0\xb2gX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc32\xdfP\xb1<\x014\x90\xa5\xd7\xc7]\xbf\xa3f\u0687\xb6\u0589\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc3:\u0373\xba\x1a\xab'P{\x86\xb1]g\xfa\xf9\x1e\xcfb\x93\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc3>\u0393Z\x8fN\xf98\xea~\x1b\xac\x87\u02d2]\x84\x90\u028a\a\x03\x8c\x16x\x1fxH\x00\x00\u07d4\xc3@\xf9\xb9\x1c&r\x8c1\xd1!\xd5\xd6\xfc;\xb5m=\x86$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3F\xcb\x1f\xbc\xe2\xab(]\x8eT\x01\xf4-\xd7#M7\xe8m\x89\x04\x86\u02d7\x99\x19\x1e\x00\x00\xe0\x94\xc3H=n\x88\xac\x1fJ\xe7<\xc4@\x8dl\x03\xab\xe0\xe4\x9d\u028a\x03\x99\x92d\x8a#\u0220\x00\x00\xe0\x94\xc3H\xfcZF\x13#\xb5{\xe3\x03\u02c96\x1b\x99\x19\x13\xdf(\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xc3N;\xa12.\xd0W\x11\x83\xa2O\x94 N\xe4\x9c\x18fA\x89\x03'\xaf\uf927\xbc\x00\x00\xe0\x94\xc3[\x95\xa2\xa3s|\xb8\xf0\xf5\x96\xb3E$\x87+\xd3\r\xa24\x8a\x01\x98\xbe\x85#^-P\x00\x00\xe0\x94\xc3c\x1cv\x98\xb6\xc5\x11\x19\x89\xbfE''\xb3\xf99Zm\xea\x8a\x02C'X\x96d\x1d\xbe\x00\x00\u07d4\xc3l\vc\xbf\xd7\\/\x8e\xfb\x06\b\x83\xd8h\xcc\xcdl\xbd\xb4\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\xc3uk\xcd\xcc~\xect\xed\x89j\xdf\xc35'Y0&n\b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\u00c4\xacn\xe2|9\xe2\xf2x\xc2 \xbd\xfa[\xae\xd6&\xd9\u04c9 \x86\xac5\x10R`\x00\x00\u07d4\u00e0F\xe3\u04b2\xbfh\x14\x88\x82n2\xd9\xc0aQ\x8c\xfe\x8c\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4\u00e9\"j\xe2u\xdf,\xab1+\x91\x10@cJ\x9c\x9c\x9e\xf6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u00f9(\xa7o\xadex\xf0O\x05U\xe69R\xcd!\xd1R\n\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc3\xc2)s)\xa6\xfd\x99\x11~T\xfcj\xf3y\xb4\xd5VT~\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc3\xc3\xc2Q\rg\x80 HZcs]\x13\a\xecL\xa60+\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc3\xcbk6\xafD?,n%\x8bJ9U:\x81\x87G\x81\x1f\x89WG=\x05\u06ba\xe8\x00\x00\xe0\x94\xc3\xdbVW\xbbr\xf1\rX\xf21\xfd\xdf\x11\x98\n\xffg\x86\x93\x8a\x01@a\xb9\xd7z^\x98\x00\x00\xe0\x94\xc3\u06df\xb6\xf4lH\n\xf3De\u05d7S\xb4\xe2\xb7Jg\u038a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc3\xddX\x908\x860;\x92\x86%%z\xe1\xa0\x13\xd7\x1a\xe2\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3\xe0G\x1cd\xff5\xfaR2\xcc1!\xd1\u04cd\x1a\x0f\xb7\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3\xe2\f\x96\u07cdN8\xf5\v&Z\x98\xa9\x06\xd6\x1b\xc5\x1aq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3\u31f0<\xe9\\\xcf\xd7\xfaQ\u0744\x01\x83\xbcCS(\t\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc3\xf8\xf6r\x95\xa5\xcd\x04\x93d\xd0]#P&#\xa3\xe5.\x84\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc4\x01\xc4'\xcc\xcf\xf1\r\xec\xb8d /6\xf5\x80\x83\"\xa0\xa8\x89\xb4{Q\xa6\x9c\xd4\x02\x00\x00\u07d4\xc4\b\x8c\x02_>\x85\x01?T9\xfb4@\xa1s\x01\xe5D\xfe\x89~\t\xdbM\x9f?4\x00\x00\u07d4\xc4\x14a\xa3\u03fd2\u0246UU\xa4\x8117\xc0v1#`\x8965\xc6 G9\u0640\x00\u07d4\xc4 8\x8f\xbe\xe8J\xd6V\xddh\xcd\xc1\xfb\xaa\x93\x92x\v4\x89\n-\xcac\xaa\xf4\u0140\x00\u07d4\xc4\"P\xb0\xfeB\xe6\xb7\xdc\xd5\u0210\xa6\xf0\u020f__\xb5t\x89\b\x1e\xe4\x82SY\x84\x00\x00\u07d4\xc4-j\xebq\x0e:P\xbf\xb4Ml1\t)i\xa1\x1a\xa7\xf3\x89\b\"c\xca\xfd\x8c\xea\x00\x00\xe0\x94\xc4@\xc7\xca/\x96Kir\xeffJ\"a\xdd\xe8\x92a\x9d\x9c\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xc4K\xde\xc8\xc3l\\h\xba\xa2\xdd\xf1\xd41i2)rlC\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xc4OJ\xb5\xbc`9|s~\xb0h3\x91\xb63\xf8\xa2G\x1b\x12\x1c\xa4\x89 .h\xf2\u00ae\xe4\x00\x00\u07d4\xc4h\x1es\xbb\x0e2\xf6\xb7& H1\xffi\xba\xa4\x87~2\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xc4k\xbd\xefv\xd4\xca`\xd3\x16\xc0\u007f]\x1ax\x0e;\x16_~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc4}a\v9\x92P\xf7\x0e\xcf\x13\x89\xba\xb6),\x91&O#\x89\x0f\xa7\xe7\xb5\xdf<\xd0\x00\x00\u07d4\u0100;\xb4\a\xc7b\xf9\vu\x96\xe6\xfd\u1513\x1ev\x95\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0106Q\xc1\xd9\xc1k\xffL\x95T\x88l??&C\x1foh\x89#\xab\x95\x99\xc4?\b\x00\x00\u07d4\u0109\xc8?\xfb\xb0%*\xc0\xdb\xe3R\x12\x17c\x0e\x0fI\x1f\x14\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u010bi<\xac\xef\xdb\xd6\xcb]x\x95\xa4.1\x962~&\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0113H\x9eV\u00fd\xd8)\x00}\xc2\xf9VA)\x06\xf7k\xfa\x89\x02\xa7\x91H\x8eqT\x00\x00\u07d4\u0116\u02f0E\x9aj\x01`\x0f\u0149\xa5Z2\xb4T!\u007f\x9d\x89\x0e\u0683\x8cI)\b\x00\x00\u07d4\u011c\xfa\xa9g\xf3\xaf\xbfU\x03\x10a\xfcL\xef\x88\xf8]\xa5\x84\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u0136\xe5\xf0\x9c\xc1\xb9\r\xf0x\x03\xce=M\x13vj\x9cF\xf4\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\u013e\xc9c\b\xa2\x0f\x90\u02b1\x83\x99\u0113\xfd=\x06Z\xbfE\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94\xc4\xc0\x1a\xfc>\x0f\x04R!\xda\x12\x84\u05c7\x85tD/\xb9\xac\x8a\x01\x92\xb5\u0249\x02J\x19\xc1\xbdo\x12\x80\x00\xe0\x94\xc5\x00\xb7 sN\xd2)8\u05cc^H\xb2\xba\x93g\xa5u\xba\x8a\a\x12\x9e\x1c\xdf7>\xe0\x00\x00\u07d4\xc5\x0f\xe4\x15\xa6A\xb0\x85lNu\xbf\x96\x05\x15D\x1a\xfa5\x8d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5\x13L\xfb\xb1\xdfz \xb0\xedpWb.\xee\u0480\x94}\xad\x89\xcd\xff\x97\xfa\xbc\xb4`\x00\x00\xe0\x94\xc5\x17\xd01\\\x87\x88\x13\xc7\x17\u132f\xa1\xea\xb2eN\x01\u068a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xc5\x18y\x9aY%Wb\x13\xe2\x18\x96\xe0S\x9a\xbb\x85\xb0Z\xe3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc5\"\xe2\x0f\xbf\x04\xed\u007fk\x05\xa3{G\x18\xd6\xfc\xe0\x14.\x1a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc5$\bmF\xc8\x11+\x12\x8b/\xafo|}\x81`\xa88l\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xc5-\x1a\fs\u00a1\xbe\x84\x91Q\x85\xf8\xb3O\xaa\n\xdf\x1d\xe3\x89K\xe4\xea\xb3\xfa\x0f\xa6\x80\x00\xe0\x94\xc55\x94\xc7\u03f2\xa0\x8f(L\xc9\u05e6;\xbd\xfc\v1\x972\x8a\nk#(\xff:b\xc0\x00\x00\u07d4\xc57I(\xcd\xf1\x93pTC\xb1L\xc2\r\xa4#G<\xd9\u03c9\a}\x10P\x9b\xb3\xaf\x80\x00\u07d4\xc58\xa0\xff(*\xaa_Ku\u03f6,p\x03~\xe6}O\xb5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5;P\xfd;+r\xbclC\v\xaf\x19JQU\x85\u04d8m\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xc5=y\xf7\u02dbp\x95/\xd3\x0f\xceX\xd5K\x9f\vY\xf6G\x8a\x01\x13\xe2\xd6tCE\xf8\x00\x00\u07d4\xc5I\u07c3\xc6\xf6^\xec\x0f\x1d\u0260\x93J\\_:P\xfd\x88\x89\x9d\xc0\\\xce(\u00b8\x00\x00\u07d4\xc5P\x05\xa6\xc3~\x8c\xa7\xe5C\xce%\x99s\xa3\xca\u0396\x1aJ\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5U\xb91V\xf0\x91\x01#\x80\x00\xe0\x94\u0166)\xa3\x96%R\u02ce\xde\u0609cj\xaf\xbd\f\x18\xcee\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u016e\x86\xb0\xc6\xc7\xe3\x90\x0f\x13h\x10\\VS\u007f\xaf\x8dt>\x89\n1\x06+\xee\xedp\x00\x00\u07d4\u0170\t\xba\xea\xf7\x88\xa2v\xbd5\x81:\xd6[@\v\x84\x9f;\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0175l\xd24&|(\xe8\x9cok\"f\xb0\x86\xa1/\x97\f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xc5\u01a4\x99\x8a3\xfe\xb7dCz\x8b\xe9)\xa7;\xa3J\ad\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\xe0\x94\xc5\xc7=a\xcc\xe7\xc8\xfeL\x8f\xce)\xf3\x90\x92\xcd\x19>\x0f\xff\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xc5\xc7Y\vV!\xec\xf85\x85\x88\u079bh\x90\xf2baC\U000498a1]\tQ\x9b\xe0\x00\x00\u07d4\xc5\xcd\xce\xe0\xe8]\x11}\xab\xbfSj?@i\xbfD?T\xe7\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xc5\u050c\xa2\xdb/\x85\xd8\xc5U\xcb\x0e\x9c\xfe\x82i6x?\x9e\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc5\xde\x12\x03\xd3\xcc,\xea1\xc8.\xe2\xdeY\x16\x88\a\x99\xea\xfd\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xc5\xe4\x88\xcf+Vw\x939q\xf6L\xb8 -\xd0WR\xa2\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc5\xe8\x12\xf7o\x15\xf2\xe1\xf2\xf9\xbcH#H<\x88\x04cog\x89\x03\xf5\x14\x19:\xbb\x84\x00\x00\u07d4\xc5\u94d34\xf1%.\u04ba&\x81D\x87\xdf\u0498+1(\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4\xc5\xebB)^\x9c\xad\xea\xf2\xaf\x12\xde\u078a\x8dS\xc5y\xc4i\x89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94\xc5\xed\xbb\xd2\xca\x03WeJ\xd0\xeaG\x93\xf8\xc5\xce\xcd0\xe2T\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc5\xf6K\xab\xb7\x031B\xf2\x0eF\u05eab\x01\xed\x86\xf6q\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5\xf6\x87qrF\u068a \r \xe5\u9f2c`\xb6\u007f8a\x89\x01\x8d\x99?4\xae\xf1\x00\x00\u07d4\xc6\x04[<5\vL\xe9\xca\fkuO\xb4\x1ai\xb9~\x99\x00\x892$\xf4'#\xd4T\x00\x00\u07d4\xc6\v\x04eN\x00;F\x83\x04\x1f\x1c\xbdk\u00cf\xda|\xdb\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\xc6\x14F\xb7T\xc2N;\x16B\xd9\xe5\x17e\xb4\xd3\xe4k4\xb6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc6\x18R\x13!\xab\xaf[&Q:J\x95(\bo\"\n\xdco\x89\x01v\xb3D\xf2\xa7\x8c\x00\x00\u07d4\xc6#FW\xa8\a8A&\xf8\x96\x8c\xa1p\x8b\xb0{\xaaI<\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc6%\xf8\u024d'\xa0\x9a\x1b\u02bdQ(\xb1\u00a9HV\xaf0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc65^\xc4v\x8cp\xa4\x9a\xf6\x95\x13\u0343\xa5\xbc\xa7\xe3\xb9\u034a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc6:\xc4\x17\x99.\x9f\x9b`8n\xd9S\xe6\xd7\xdf\xf2\xb0\x90\xe8\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xc6<\u05c8!\x18\xb8\xa9\x1e\aML\x8fK\xa9\x18Q0;\x9a\x89\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\xc6R\x87\x1d\x19$\"\u01bc#_\xa0c\xb4J~\x1dC\u3149\bg\x0e\x9e\xc6Y\x8c\x00\x00\xe0\x94\xc6gD\x1e\u007f)y\x9a\xbaadQ\xd5;?H\x9f\x9e\x0fH\x8a\x02\xf2\x9a\xceh\xad\u0740\x00\x00\u07d4\xc6j\xe4\xce\xe8\u007f\xb352\x19\xf7\u007f\x1dd\x86\u0140(\x032\x89\x01\x9a\x16\xb0o\xf8\xcb\x00\x00\u07d4\xc6t\xf2\x8c\x8a\xfd\a?\x8by\x96\x91\xb2\xf0XM\xf9B\xe8D\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u0197\xb7\x04w\u02b4.+\x8b&f\x81\xf4\xaesu\xbb%A\x8a\x01.W2\xba\xba\\\x98\x00\x00\u07d4\u019b\x85U9\xce\x1b\x04qG(\xee\xc2Z7\xf3g\x95\x1d\xe7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u019b\xe4@\x13Mb\x80\x98\x01D\xa9\xf6M\x84t\x8a7\xf3I\x89&\u009eG\u0104L\x00\x00\u07d4\u019df<\x8d`\x90\x83\x91\xc8\xd26\x19\x153\xfd\xf7wV\x13\x89\x1aJ\xba\"\\ t\x00\x00\u0794\u01a2\x86\xe0e\xc8_:\xf7H\x12\xed\x8b\u04e8\xce]%\xe2\x1d\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\u01a3\x0e\xf5\xbb3 \xf4\r\xc5\xe9\x81#\rR\xae:\xc1\x93\"\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\u01ae(}\xdb\xe1\x14\x9b\xa1m\xdc\xcaO\xe0j\xa2\uaa48\xa9\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xc6\xc7\xc1\x917\x98\x97\u075c\x9d\x9a3\x83\x9cJ_b\xc0\x89\r\x89\xd8\xd8T\xb2$0h\x80\x00\xe0\x94\xc6\xcdh\xec56,Z\xd8L\x82\xadN\xdc#!%\x91-\x99\x8a\x05\xe0T\x9c\x962\xe1\xd8\x00\x00\u07d4\xc6\u0615N\x8f?\xc53\xd2\xd20\xff\x02\\\xb4\xdc\xe1O4&\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xc6\xdb\u06de\xfd^\xc1\xb3xn\x06q\xeb\"y\xb2S\xf2\x15\xed\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc6\xdf u\xeb\xd2@\xd4Hi\u00bek\u07c2\xe6=N\xf1\xf5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc6\xe2\xf5\xaf\x97\x9a\x03\xfdr:\x1bn\xfar\x83\x18\u03dc\x18\x00\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xc6\xe3$\xbe\xeb[6v^\xcdFB`\xf7\xf2`\x06\xc5\xc6.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc6\xe4\xcc\fr\x83\xfc\x1c\x85\xbcH\x13\xef\xfa\xafr\xb4\x98#\xc0\x89\x0f\x03\x1e\xc9\xc8}\xd3\x00\x00\xe0\x94\xc6\xee5\x93B)i5)\xdcA\u067bq\xa2IfX\xb8\x8e\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\xc6\xfb\x1e\xe3t\x17\u0400\xa0\xd0H\x92;\u06ba\xb0\x95\xd0w\u0189\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc7\x05'\xd4D\u0110\xe9\xfc?\\\xc4Nf\xebO0k8\x0f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc7\r\x85mb\x1e\xc1E0<\nd\x00\xcd\x17\xbb\xd6\xf5\xea\xf7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc7\x0f\xa4Uv\xbf\x9c\x86_\x988\x93\x00,AI&\xf6\x10)\x89\x15\xb4\xaa\x8e\x97\x02h\x00\x00\u07d4\xc7\x11E\xe5)\u01e7\x14\xe6y\x03\xeeb\x06\xe4\xc3\x04+g'\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xc7\x1b*=q5\u04a8_\xb5\xa5q\u073ei^\x13\xfcC\u034965\u026d\xc5\u07a0\x00\x00\u07d4\xc7\x1f\x1du\x87?3\u0732\xddK9\x87\xa1-\a\x91\xa5\xce'\x897\b\xba\xed=h\x90\x00\x00\u07d4\xc7\x1f\x92\xa3\xa5J{\x8c/^\xa4C\x05\xfc\u02c4\xee\xe21H\x89\x02\xb5\x9c\xa11\xd2\x06\x00\x00\u07d4\xc7!\xb2\xa7\xaaD\xc2\x12\x98\xe8P9\xd0\x0e.F\x0eg\v\x9c\x89\a\xa1\xfe\x16\x02w\x00\x00\x00\u07d4\xc7,\xb3\x01%\x8e\x91\xbc\b\x99\x8a\x80]\u0452\xf2\\/\x9a5\x89 \t\xc5\u023fo\xdc\x00\x00\xe0\x94\xc76\x8b\x97\t\xa5\xc1\xb5\x1c\n\xdf\x18ze\xdf\x14\xe1+}\xba\x8a\x02\x02o\xc7\u007f\x03\u5b80\x00\u07d4\xc79%\x9e\u007f\x85\xf2e\x9b\xef_`\x9e\xd8k=Yl \x1e\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc7>!\x12(\"\x15\xdc\ab\xf3+~\x80}\xcd\x1az\xae>\x8a\x01v\f\xbcb;\xb3P\x00\x00\xe0\x94\xc7If\x80B\xe7\x11#\xa6H\x97^\b\xedc\x82\xf8>\x05\xe2\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\xc7J9\x95\xf8\a\xde\x1d\xb0\x1a.\xb9\xc6.\x97\xd0T\x8fio\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc7Pl\x10\x19\x12\x1f\xf0\x8a,\x8c\x15\x91\xa6^\xb4\xbd\xfbJ?\x89 \x86\xac5\x10R`\x00\x00\u07d4\xc7\\7\xce-\xa0k\xbc@\b\x11Y\u01ba\x0f\x97n9\x93\xb1\x89:y#\x15\x1e\xcfX\x00\x00\u07d4\xc7]\"Y0j\xec}\xf0\"v\x8ci\x89\x9ae!\x85\xdb\u0109\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc7`\x97\x1b\xbc\x18\x1cj|\xf7tA\xf2BG\u045c\xe9\xb4\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xc7a0\xc7<\xb9!\x028\x02\\\x9d\xf9]\v\xe5J\xc6\u007f\xbe\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\xc7e\xe0\x04v\x81\tG\x81j\xf1B\xd4m.\u7f28\xccO\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc7g^VG\xb9\xd8\xda\xf4\xd3\xdf\xf1\xe5R\xf6\xb0qT\xac8\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4\xc7{\x01\xa6\xe9\x11\xfa\x98\x8d\x01\xa3\xab3dk\xee\xf9\xc18\xf3\x89'\x1bo\xa5\xdb\xe6\xcc\x00\x00\u07d4\u01c3z\u0420\xbf\x14\x18i7\xac\xe0lUF\xa3j\xa5OF\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u01d8\x06\x03+\xc7\xd8(\xf1\x9a\u01a6@\u018e=\x82\x0f\xa4B\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u01d9\xe3N\x88\xff\x88\xbe}\xe2\x8e\x15\xe4\xf2\xa6=\v3\xc4\u02c9\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\u01ddPb\u01d6\xddwa\xf1\xf1>U\x8ds\xa5\x9f\x82\xf3\x8b\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\u01e0\x18\xf0\x96\x8aQ\xd1\xf6`<\\I\xdcT[\xcb\x0f\xf2\x93\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u01ef\xf9\x19)yt\x89UZ/\xf1\xd1M\\iZ\x10\x83U\x8965\u026d\xc5\u07a0\x00\x00\u0794\u01f1\xc8>c ?\x95G&>\xf6(.}\xa3;n\xd6Y\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\u01f3\x9b\x06\x04Q\x00\f\xa1\x04\x9b\xa1T\xbc\xfa\x00\xff\x8a\xf2b\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\u01ff\x17\xc4\xc1\x1f\x98\x94\x1fP~w\bO\xff\xbd-\xbd=\xb5\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\u01ff.\xd1\xed1)@\xeej\xde\xd1Qn&\x8eJ`HV\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc7\xd4O\xe3,\u007f\x8c\xd5\xf1\xa9t'\xb6\xcd:\xfc\x9eE\x02>\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xc7\xd5\xc7\x05@\x81\xe9\x18\xech{Z\xb3n\x97=\x18\x13)5\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xc7\xde^\x8e\xaf\xb5\xf6+\x1a\n\xf2\x19\\\xf7\x93\u01c9L\x92h\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc7\xe30\xcd\f\x89\n\u025f\xe7q\xfc\xc7\xe7\xb0\t\xb7A=\x8a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc7\xea\xc3\x1a\xbc\xe6\xd5\xf1\u07a4\"\x02\xb6\xa6t\x15=\xb4z)\x89 \t\xc5\u023fo\xdc\x00\x00\xe0\x94\xc7\xecb\xb8\x04\xb1\xf6\x9b\x1e0p\xb5\xd3b\xc6/\xb3\t\xb0p\x8a\x02\xc4k\xf5A`f\x11\x00\x00\u07d4\xc7\xf7+\xb7X\x01k7G\x14\u0509\x9b\xce\"\xb4\xae\xc7\n1\x89:&\xc9G\x8f^-\x00\x00\u0794\xc8\v6\u047e\xaf\xba_\xccdM`\xacnF\xed)'\xe7\u0708\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xc8\x11\xc2\xe9\xaa\x1a\xc3F.\xba^\x88\xfc\xb5\x12\x0e\x9fn,\xa2\x89K\xe6\u0607\xbd\x87n\x00\x00\u07d4\xc8\x17\xdf\x1b\x91\xfa\xf3\x0f\xe3%\x15qr|\x97\x11\xb4]\x8f\x06\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xc8\x1f\xb7\xd2\x0f\u0480\x01\x92\xf0\xaa\xc1\x98\xd6\u05a3}?\xcb}\x89\x0e\x11I3\x1c-\xde\x00\x00\u07d4\xc8 \xc7\x11\xf0w\x05'8\a\xaa\xaam\xe4M\x0eKH\xbe.\x89\bg\x0e\x9e\xc6Y\x8c\x00\x00\u07d4\xc8#\x1b\xa5\xa4\x11\xa1>\"+)\xbf\xc1\b?v1X\xf2&\x8967\tlK\xcci\x00\x00\u07d4\xc86\xe2Jo\xcf)\x94;6\b\xe6b)\n!_e)\xea\x89\x0f\xd4Pd\xea\xee\x10\x00\x00\xe0\x94\xc8;\xa6\u0755I\xbe\x1d2\x87\xa5\xa6T\xd1\x06\xc3Lk]\xa2\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xc8>\x9djX%;\uefb7\x93\xe6\xf2\x8b\x05JXI\x1bt\x89\x0fF\u00b6\xf5\xa9\x14\x00\x00\u07d4\xc8A\x88O\xa4x_\xb7s\xb2\x8e\x97\x15\xfa\xe9\x9aQ40]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc8M\x9b\xea\n{\x9f\x14\x02 \xfd\x8b\x90\x97\u03ff\xd5\xed\xf5d\x89\x06\xab\x9e\u0091\xad}\x80\x00\u07d4\xc8RB\x8d+Xd\x97\xac\xd3\fV\xaa\x13\xfbU\x82\xf8D\x02\x893B\xd6\r\xff\x19`\x00\x00\u07d4\xc8S![\x9b\x9f-,\xd0t\x1eX^\x98{_\xb8\f!.\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xc8S%\uaca5\x9b>\xd8c\xc8j_)\x06\xa0B)\xff\xa9\x89\x19=\u007f}%=\xe0\x00\x00\u07d4\xc8^\xf2}\x82\x04\x03\x80_\xc9\xed%\x9f\xffd\xac\xb8\xd64j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc8akN\xc0\x91(\xcd\xff9\xd6\u4e6c\x86\xee\xc4q\xd5\xf2\x89\x01\r:\xa56\xe2\x94\x00\x00\xe0\x94\xc8a\x90\x90K\x8d\a\x9e\xc0\x10\xe4b\xcb\xff\xc9\b4\xff\xaa\\\x8a\x02#\x85\xa8'\xe8\x15P\x00\x00\u07d4\xc8q\r~\x8bZ;\u059aB\xfe\x0f\xa8\xb8|5\u007f\xdd\xcd\u0209\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc8sR\u06e5\x82\xee f\xb9\xc0\x02\xa9b\xe0\x03\x13Ox\xb1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xc8|w\xe3\xc2J\xde\xcd\xcd\x108\xa3\x8bV\xe1\x8d\xea\u04f7\x02\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4\xc8}:\xe3\u0607\x04\u066b\x00\t\xdc\xc1\xa0\x06q1\xf8\xba<\x89j\xc5\xc6-\x94\x86\a\x00\x00\xe0\x94\u0201N4R>8\xe1\xf9'\xa7\xdc\xe8FjDz\t6\x03\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u0202U\xed\xdc\xf5!\xc6\xf8\x1d\x97\xf5\xa4!\x81\xc9\a=N\xf1\x89\x0f\u00d0D\xd0\n*\x80\x00\u07d4\u0205\xa1\x8a\xab\xf4T\x1b{{~\xcd0\xf6\xfa\u619d\x95i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u020c\xa1\xe6\xe5\xf4\xd5X\xd17\x80\xf4\x88\xf1\rJ\xd3\x13\r4\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\u020e\xecT\xd3\x05\xc9(\xcc(H\xc2\xfe\xe251\xac\xb9mI\x89lj\u04c2\xd4\xfba\x00\x00\xe0\x94\u021c\xf5\x04\xb9\xf3\xf85\x18\x1f\xd8BO\\\xcb\xc8\xe1\xbd\xdf}\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u0222\xc4\xe5\x9e\x1c\u007f\xc5H\x05X\x048\xae\xd3\xe4J\xfd\xf0\x0e\x89\x02b\x9ff\xe0\xc50\x00\x00\u07d4\u022aI\u301f\b\x99\xf2\x8a\xb5~gCp\x9dXA\x903\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\u022b\x1a<\xf4l\xb8\xb0d\xdf.\"-9`s\x94 2w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0231\x85\x05%\xd9F\xf2\xae\x84\xf3\x17\xb1Q\x88\xc56\xa5\u0706\x89\x91\x8d\xdc:B\xa3\xd4\x00\x00\u07d4\xc8\xd4\xe1Y\x9d\x03\xb7\x98\t\xe0\x13\n\x8d\u00c4\b\xf0^\x8c\u04c9\x9f\xad\x06$\x12y\x16\x00\x00\u07d4\xc8\xdd'\xf1k\xf2$P\xf5w\x1b\x9f\xe4\xedO\xfc\xb3\t6\xf4\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xc8\xdezVL\u007f@\x12\xa6\xf6\xd1\x0f\u040fG\x89\x0f\xbf\a\u0509\x10CV\x1a\x88)0\x00\x00\u07d4\xc8\xe2\xad\xebT^I\x9d\x98,\f\x11sc\u03b4\x89\u0171\x1f\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94\xc8\xe5X\xa3\xc5i~o\xb2:%\x94\u0200\xb7\xa1\xb6\x8f\x98`\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xc8\xf2\xb3 \xe6\xdf\xd7\t\x06\u0157\xba\xd2\xf9P\x13\x12\u01c2Y\x89Q\x93K\x8b:W\xd0\x00\x00\u07d4\xc9\x03\x00\xcb\x1d@w\xe6\xa6\xd7\xe1i\xa4`F\x8c\xf4\xa4\x92\u05c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xc9\f7e\x15k\u028eH\x97\xab\x80$\x19\x15<\xbeR%\xa9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc9\x10\xa9pUl\x97\x16\xeaS\xaff\xdd\xef\x93\x141$\x91=\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\xe0\x94\xc9\x12{\u007ff)\xee\x13\xfc?`\xbc/Dg\xa2\aE\xa7b\x8a\x03|\x9a\xa4\xe7\xceB\x1d\x80\x00\u07d4\xc9\x1b\xb5b\xe4+\xd4a0\xe2\u04eeFR\xb6\xa4\ub1bc\x0f\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\xe0\x94\xc90\x88y\x05m\xfe\x13\x8e\xf8 \x8fy\xa9\x15\u01bc~p\xa8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xc94\xbe\xca\xf7\x1f\"_\x8bJK\xf7\xb1\x97\xf4\xac\x9604\\\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc9?\xbd\xe8\xd4m+\xcc\x0f\xa9\xb3;\u063a\u007f\x80B\x12Ue\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xc9@\x89U:\xe4\xc2,\xa0\x9f\xbc\x98\xf5pu\xcf.\u0155\x04\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc9A\x10\xe7\x1a\xfeW\x8a\xa2\x18\xe4\xfc(d\x03\xb03\n\u038d\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc9F\u056c\xc14n\xba\nry\xa0\xac\x1dF\\\x99m\x82~\x8a\x03x=T_\xdf\n\xa4\x00\x00\u07d4\xc9J(\xfb20\xa9\xdd\xfa\x96Nw\x0f,\xe3\xc2S\xa7\xbeO\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc9JXR\x03\xda{\xba\xfd\x93\xe1X\x84\xe6`\u0531\xea\xd8T\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xc9O|5\xc0'\xd4}\xf8\xefO\x9d\xf8Z\x92H\xa1}\xd2;\x89\x01\x9f\x8euY\x92L\x00\x00\u07d4\xc9Q\x90\f4\x1a\xbb\xb3\xba\xfb\xf7\xee )7pq\xdb\xc3j\x89\x11\xc2]\x00M\x01\xf8\x00\x00\u07d4\xc9S\xf94\xc0\xeb-\x0f\x14K\u06b0\x04\x83\xfd\x81\x94\x86\\\xe7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc9f&r\x8a\xaaLO\xb3\xd3\x1c&\xdf:\xf3\x10\b\x17\x10\u0449\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\xc9gQel\n\x8e\xf45{sD2!4\xb9\x83PJ\u0289lk\x93[\x8b\xbd@\x00\x00\u07d4\u0240Hh\u007f+\xfc\u027d\x90\xed\x18slW\xed\xd3R\xb6]\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0241\xd3\x12\u0487\xd5X\x87\x1e\u0757:\xbbv\xb9y\xe5\xc3^\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u0242Xmc\xb0\xd7L \x1b\x1a\xf8A\x83r\xe3\fv\x16\xbe\x89\x05k\xc7^-c\x10\x00\x00\u07d4\u0249CO\x82Z\xaf\x9cU/h^\xba|\x11\xdbJ_\xc7:\x89\x1b(\u014d\x96\x96\xb4\x00\x00\u07d4\u0249\xee\xc3\a\u80db\x9dr7\xcf\xda\b\x82)b\xab\u41c9\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u0252\xbeY\xc6r\x1c\xafN\x02\x8f\x9e\x8f\x05\xc2\\UQ[\u0509\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u0255{\xa9L\x1b)\xe5'~\xc3f\"pI\x04\xc6=\xc0#\x89h>\xfcg\x82d,\x00\x00\xe0\x94\u025a\x9c\xd6\xc9\xc1\xbe54\xee\u0352\xec\xc2/\\8\xe9Q[\x8a\x01\x05Y;:\x16\x9dw\x00\x00\xe0\x94\u026c\x01\xc3\xfb\t)\x03?\f\xcc~\x1a\xcf\uaae7\x94]G\x8a\x02\xa3j\x9e\x9c\xa4\xd2\x03\x80\x00\u07d4\u0276\x98\xe8\x98\xd2\rMO@\x8eNM\x06\x19\"\xaa\x85c\a\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\u0276\xb6\x86\x11\x16\x91\xeej\xa1\x97\xc7#\x1a\x88\xdc`\xbd)]\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc9\u01ec\v\u0753B\xb5\xea\xd46\t#\xf6\x8cr\xa6\xbac:\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc9\xc8\r\xc1.{\xab\x86\xe9I\xd0\x1eL>\xd3_+\x9b\xba_\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc9\xd7dF\u056a\xdf\xf8\vh\xb9\x1b\b\u035b\xc8\xf5U\x1a\xc1\x89&\xb4\xbd\x91\x10\xdc\xe8\x00\x00\xe0\x94\xc9\u073b\x05oM\xb7\xd9\xda9\x93b\x02\u017d\x820\xb3\xb4w\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc9\xe0&\b\x06h(\x84\x8a\xeb(\xc76r\xa1)%\x18\x1fM\x89\x1b\x1bk\u05efd\xc7\x00\x00\u07d4\xca\x042\xcb\x15{Qy\xf0.\xbb\xa5\xc9\u0475O\xecM\x88\u028965\u026d\xc5\u07a0\x00\x00\u07d4\xca\x12,\xf0\U00094216\xb7HC\xf4\x9a\xfe\u043a\x16\x18\xee\u05c9\x1e[\x8f\xa8\xfe*\xc0\x00\x00\xe0\x94\xca\"\u0363`m\xa5\xca\xd0\x13\xb8\aG\x06\xd7\xe9\xe7!\xa5\f\x8a\x01q\x81\xc6\xfa9\x81\x94\x00\x00\u07d4\xca#\xf6-\xff\rd`\x03lb\xe8@\xae\xc5W~\v\xef\u0489\a\xa1\xfe\x16\x02w\x00\x00\x00\u07d4\xca%\xff4\x93L\x19B\xe2*N{\xd5o\x14\x02\x1a\x1a\xf0\x88\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xca7?\xe3\xc9\x06\xb8\xc6U\x9e\xe4\x9c\xcd\a\xf3|\xd4\xfbRf\x89a\t=|,m8\x00\x00\u07d4\xcaA\u032c0\x17 R\xd5\"\xcd//\x95}$\x81S@\x9f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xcaB\x88\x01N\xdd\xc5c/_\xac\xb5\xe3\x85\x17\xa8\xf8\xbc]\x98\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xcaB\x88c\xa5\xca06\x98\x92\xd6\x12\x18>\xf9\xfb\x1a\x04\xbc\xea\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4\xcaI\xa5\xf5\x8a\xdb\xef\xae#\xeeY\xee\xa2A\xcf\x04\x82b.\xaa\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xcaL\xa9\xe4w\x9dS\x0e\u02ec\xd4~j\x80X\xcf\xdee\u064f\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xcae~\xc0o\xe5\xbc\t\xcf#\xe5*\xf7\xf8\f\xc3h\x9en\u07890\xca\x02O\x98{\x90\x00\x00\u07d4\xcaf\xb2(\x0f\xa2\x82\u0176v1\xceU+b\xeeU\xad\x84t\x89j\xc4\"\xf54\x92\x88\x00\x00\xe0\x94\xcal\x81\x8b\xef\xd2Q6\x1e\x02t@h\xbe\x99\u062a`\xb8J\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcap\xf4\u077f\x06\x9d!C\xbdk\xbc\u007fikRx\x9b2\u7262\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\xcatuvDjL\x8f0\xb0\x83@\xfe\xe1\x98\xdec\xec\x92\u03ca\x01|\x8e\x12\x06r*0\x00\x00\u07d4\xca{\xa3\xffSl~_\x0e\x158\x00\xbd8=\xb81)\x98\xe0\x89\t1\xac=k\xb2@\x00\x00\xe0\x94\u0282v\xc4w\xb4\xa0{\x80\x10{\x845\x94\x18\x96\a\xb5;\xec\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\u0284\t\b>\x01\xb3\x97\xcf\x12\x92\x8a\x05\xb6\x84U\xceb\x01\u07c9V\xbcu\xe2\xd61\x00\x00\x00\u07d4\u0298\u01d8\x8e\xfa\b\xe9%\uf719ER\x03&\xe9\xf4;\x99\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u029a\x04*j\x80o\xfc\x92\x17\x95\x00\xd2D)\xe8\xabR\x81\x17\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4\u029d\xec\x02\x84\x1a\xdf\\\xc9 WjQ\x87\xed\u04bdCJ\x18\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u029f\xaa\x17T/\xaf\xbb8\x8e\xab!\xbcL\x94\u89f3G\x88\x89lk\x8f\xce\r\x18y\x80\x00\xe0\x94\u02aah\xeel\xdf\r4EJv\x9b\r\xa1H\xa1\xfa\xaa\x18e\x8a\x01\x87.\x1d\xe7\xfeR\xc0\x00\x00\u07d4\u02ad\x9d\xc2\rX\x9c\xe4(\xd8\xfd\xa3\xa9\xd5:`{y\x88\xb5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\u02b0\xd3,\xf3v\u007f\xa6\xb3S|\x842\x8b\xaa\x9fPE\x816\x8a\x01\xe5\xb8\xfa\x8f\xe2\xac\x00\x00\x00\u07d4\u02b9\xa3\x01\xe6\xbdF\xe9@5P(\xec\xcd@\xceMZ\x1a\u00c9\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u02b9\xa9z\xda\x06\\\x87\x81nh`\xa8\xf1Bo\xe6\xb3\xd7u\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\u02ba\xb6'N\xd1P\x89s~({\xe8x\xb7W\x93Hd\xe2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\u02bd\xaf5OG \xa4f\xa7d\xa5(\xd6\x0e:H*9<\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xca\xcbg^\t\x96#T\x04\ufbfb.\u02c1R'\x1bU\xe0\x89%\xf2s\x93=\xb5p\x00\x00\u07d4\xca\xd1O\x9e\xbb\xa7f\x80\xeb\x83k\a\x9c\u007f{\xaa\xf4\x81\xedm\x89\f\xef={\xd7\xd04\x00\x00\xe0\x94\xca\xe3\xa2S\xbc\xb2\xcfN\x13\xba\x80\u0098\xab\x04\x02\xda|*\xa0\x8a\x01$\xbc\r\u0752\xe5`\x00\x00\u07d4\xca\xef\x02{\x1a\xb5\x04\xc7?A\xf2\xa1\ty\xb4t\xf9~0\x9f\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xca\xf4H\x1d\x9d\xb7\x8d\xc4\xf2_{J\u023d;\x1c\xa0\x10k1\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94\xca\xfd\xe8U\x86L%\x98\xda<\xaf\xc0Z\u064d\U00089380H\x8a\x03\x00\xa8\xed\x96\xffJ\x94\x00\x00\xe0\x94\xcb\r\xd7\xcfN]\x86a\xf6\x02\x89C\xa4\xb9\xb7\\\x91D6\xa7\x8a\x19i6\x89t\xc0[\x00\x00\x00\u07d4\xcb\x1b\xb6\xf1\xda^\xb1\rH\x99\xf7\xe6\x1d\x06\xc1\xb0\x0f\u07f5-\x898E$\xccp\xb7x\x00\x00\u07d4\xcb=vl\x98?\x19+\xce\xca\xc7\x0fN\xe0=\xd9\xffqMQ\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xcbB\xb4N\xb5\xfd`\xb5\x83~O\x9e\xb4rgR=\x1a\"\x9c\x89.\xe4IU\b\x98\xe4\x00\x00\u07d4\xcbG\xbd0\u03e8\xecTh\xaa\xa6\xa9FB\xce\xd9\xc8\x19\xc8\u0509\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xcbH\xfe\x82e\u066fU\xebp\x06\xbc3VE\xb0\xa3\xa1\x83\xbe\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xcbJ\x91M+\xb0)\xf3._\xef\\#LO\xec--\xd5w\x89a\x94\x04\x9f0\xf7 \x00\x00\xe0\x94\xcbJ\xbf\u0082\xae\xd7n]W\xaf\xfd\xa5B\xc1\xf3\x82\xfc\xac\xf4\x8a\x01\xb9\x0f\x11\xc3\x18?\xaa\x00\x00\u07d4\xcbJ\xd0\xc7#\xdaF\xabV\xd5&\xda\f\x1d%\xc7=\xaf\xf1\n\x89\x1b\xa5\xab\xf9\xe7y8\x00\x00\u07d4\xcbK\xb1\xc6#\xba(\xdcB\xbd\xaa\xa6\xe7N\x1d*\xa1%l*\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xcbPXt\x12\x82#\x04\xeb\u02e0}\xab:\x0f\t\xff\xfe\u4189JD\x91\xbdm\xcd(\x00\x00\u07d4\xcbX\x99\v\u0350\u03ffm\x8f\t\x86\xf6\xfa`\x02v\xb9N-\x8964\xbf9\xab\x98x\x80\x00\u07d4\xcbh\xaeZ\xbe\x02\xdc\xf8\xcb\u016aq\x9c%\x81FQ\xaf\x8b\x85\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xcbty\x10\x9bC\xb2fW\xf4F_M\x18\xc6\xf9t\xbe_B\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94\xcb}+\x80\x89\xe91,\u026e\xaa's\xf3S\b\xecl*{\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u02c6\xed\xbc\x8b\xbb\x1f\x911\x02+\xe6IV^\xbd\xb0\x9e2\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u02d3\x19\x9b\x9c\x90\xbcI\x15\xbd\x85\x9e=B\x86m\xc8\xc1\x87I\x89\f\x90\xdf\a\xde\xf7\x8c\x00\x00\u07d4\u02d4\xe7o\xeb\xe2\b\x11g3\xe7n\x80]H\xd1\x12\xec\x9f\u028965\u026d\xc5\u07a0\x00\x00\u07d4\u02dbQ\x03\xe4\u0389\xafOd\x91aP\xbf\xf9\xee\u02df\xaa\\\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u02e2\\zP<\xc8\xe0\xd0Iq\xca\x05\xc7b\xf9\xb7b\xb4\x8b\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u02e2\x88\xcd<\x1e\xb4\u055d\xdb\x06\xa6B\x1c\x14\xc3E\xa4{$\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u02f3\x18\x9eK\xd7\xf4_\x17\x8b\x1c0\xc7n&1MJK\n\x89\x0f\xfe\vg|e\xa9\x80\x00\xe0\x94\u02f7\xbe\x17\x95?,\u0313\u1f19\x80[\xf4U\x11CNL\x8a\n\xae[\x9d\xf5m/ \x00\x00\xe0\x94\xcb\xc0KM\x8b\x82\xca\xf6p\x99o\x16\f6)@\xd6o\xcf\x1a\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcb\u07974\xb8\xe6\xaaS\x8c)\x1dm\u007f\xac\xed\xb0\xf38\xf8W\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xcb\xe1\xb9H\x86M\x84t\xe7e\x14XX\xfc\xa4U\x0fxK\x92\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcb\xe5/\xc53\xd7\xdd`\x8c\x92\xa2`\xb3|?E\u07b4\xeb3\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xcb\xe8\x10\xfe\x0f\xec\xc9dGJ\x1d\xb9w(\xbc\x87\xe9s\xfc\xbd\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcb\xf1j\x0f\xe2tRX\xcdR\xdb+\xf2\x19T\xc9u\xfcj\x15\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\xcb\xf3\u007f\xf8T\xa2\xf1\xceS\x93D\x94wx\x92\xd3\xeceW\x82\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcb\xfaj\xf6\u0083\xb0F\xe2w,`c\xb0\xb2\x15S\xc4\x01\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcb\xfav\xdb\x04\xce8\xfb ]7\xb8\xd3w\xcf\x13\x80\xda\x03\x17\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xcc\x03I\x85\xd3\xf2\x8c-9\xb1\xa3K\xce\xd4\u04f2\xb6\xca#N\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xcc\x04\x8d\u01f9]\xca%\xdf&\xee\xfac\x9d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcc+_D\x8f5(\xd3\xfeA\xcc}\x1f\xa9\xc0\xdcv\xf1\xb7v\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xcc-\x04\xf0\xa4\x01q\x89\xb3@\xcaw\x19\x86A\xdc\xf6Ek\x91\x89\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94\xccA\x9f\u0651+\x85\x13VY\xe7z\x93\xbc=\xf1\x82\xd4Q\x15\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xccE\xfb:U[\xad\x80{8\x8a\x03W\xc8U _|u\xe8\x89.\xe4IU\b\x98\xe4\x00\x00\u07d4\xccHAM*\xc4\xd4*Yb\xf2\x9e\xeeD\x97\t/C\x13R\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4\xccJ/,\xf8l\xf3\xe43u\xf3`\xa4sF\x91\x19_\x14\x90\x89I\x15\x05;\xd1)\t\x80\x00\u07d4\xccO\x0f\xf2\xae\xb6}T\xce;\xc8\xc6Q\v\x9a\xe8>\x9d2\x8b\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xccO\xaa\xc0\v\xe6b\x8f\x92\xefk\x8c\xb1\xb1\xe7j\xac\x81\xfa\x18\x89\v\"\xa2\xea\xb0\xf0\xfd\x00\x00\xe0\x94\xccO\xebr\u07d8\xff5\xa18\xe0\x17a\xd1 ?\x9b~\xdf\n\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xcc`oQ\x13\x97\xa3\x8f\u01c7+\u04f0\xbd\x03\xc7\x1b\xbdv\x8b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xcc`\xf86\xac\xde\xf3T\x8a\x1f\xef\u0321>\u01a97\xdbD\xa0\x89\x04\xb0m\xbb\xb4\x0fJ\x00\x00\u07d4\xccl\x03\xbd`>\t\xdeT\xe9\xc4\u056cmA\xcb\xceqW$\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4\xccl-\xf0\x0e\x86\xec\xa4\x0f!\xff\xda\x1ag\xa1i\x0fG|e\x89\xabM\xcf9\x9a:`\x00\x00\xe0\x94\xccm{\x12\x06\x1b\xc9m\x10M`me\xff\xa3+\x006\xeb\a\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xccs\xdd5kIy\xb5y\xb4\x01\xd4\xccz1\xa2h\xdd\xceZ\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xccu\x8d\a\x1d%\xa62\n\xf6\x8c]\xc9\xc4\xf6\x95[\xa9E \x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcc{\x04\x81\xcc2\xe6\xfa\xef#\x86\xa0p\"\xbc\xb6\xd2\u00f4\xfc\x89\xabM\xcf9\x9a:`\x00\x00\xe0\x94\u0314;\xe1\",\xd1@\n#\x99\xdd\x1bE\x94E\xcfmT\xa9\x8a\x02\xa7@\xaee6\xfc\x88\x00\x00\u07d4\u0315\x19\xd1\xf3\x98_k%^\xad\xed\x12\xd5bJ\x97'!\xe1\x8965\u026d\xc5\u07a0\x00\x00\u0794\u031a\xc7\x15\xcdo&\x10\xc5+XgdV\x88B\x97\x01\x8b)\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\u0320{\xb7\x94W\x1dJ\xcf\x04\x1d\xad\x87\xf0\xd1\xef1\x85\xb3\x19\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u032b\xc6\x04\x8aSFD$\xfc\xf7n\xeb\x9en\x18\x01\xfa#\u0509\x02\xab{&\x0f\xf3\xfd\x00\x00\u07d4\u032e\r=\x85*}\xa3\x86\x0f\x066\x15L\nl\xa3\x16(\u0509\x05\xc6\xd1+k\xc1\xa0\x00\x00\u07d4\xcc\xca$\xd8\xc5mn,\a\xdb\bn\xc0~X[\xe2g\xac\x8d\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xcc\xd5!\x13-\x98l\xb9hi\x84&\"\xa7\u0762l>\xd0W\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcc\xf49u\xb7k\xfes_\xec<\xb7\xd4\xdd$\xf8\x05\xba\tb\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xcc\xf6*f?\x13S\xba.\xf8\xe6R\x1d\xc1\xec\xb6s\xec\x8e\xf7\x89\b=lz\xabc`\x00\x00\u07d4\xcc\xf7\x11\r\x1b\u0667K\xfd\x1d}}-\x9dU`~{\x83}\x890\xca\x02O\x98{\x90\x00\x00\u07d4\xcc\xfdrW`\xa6\x88#\xff\x1e\x06/L\xc9~\x13`\xe8\u0657\x89\x15\xacV\xed\xc4\xd1,\x00\x00\u07d4\xcd\x02\x0f\x8e\xdf\xcfRG\x98\xa9\xb7:d\x034\xbb\xf7/\x80\xa5\x89\a?u\u0460\x85\xba\x00\x00\u07d4\xcd\x06\xf8\xc1\xb5\u037d(\xe2\xd9kcF\xc3\xe8Z\x04\x83\xba$\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xcd\a.n\x183\x13y\x95\x19m{\xb1r_\xef\x87a\xf6U\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcd\n\x16\x1b\xc3g\xae\t'\xa9*\xac\x9c\xf6\xe5\bg\x14\xef\u0289lk\x93[\x8b\xbd@\x00\x00\u07d4\xcd\n\xf3GN\"\xf0i\xec4\a\x87\r\xd7pD=[\x12\xb0\x89\x8e^\xb4\xeew\xb2\xef\x00\x00\u07d4\xcd\v\x02W\u70e3\xd2\xc2\u3e9dny\xb7^\xf9\x80$\u0509\x9f\xad\x06$\x12y\x16\x00\x00\u07d4\xcd\x10,\xd6\xdb=\xf1J\u05af\x0f\x87\xc7$y\x86\x1b\xfc=$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcd\x1ef\xedS\x9d\xd9/\xc4\v\xba\xa1\xfa\x16\u078c\x02\xc1ME\x89\fw\xe4%hc\xd8\x00\x00\u07d4\xcd\x1e\xd2c\xfb\xf6\xf6\xf7\xb4\x8a\xef\x8fs=2\x9dC\x82\xc7\u01c9\x01\x00\xbd3\xfb\x98\xba\x00\x00\u07d4\xcd*6\xd7S\xe9\xe0\xed\x01*XMqh\aX{A\xd5j\x89\x0e+\xa7[\v\x1f\x1c\x00\x00\u07d4\xcd2\xa4\xa8\xa2\u007f\x1c\xc69T\xaacOxW\x05s4\u01e3\x89:\xd1fWlr\xd4\x00\x00\u07d4\xcd5\xff\x01\x0e\xc5\x01\xa7!\xa1\xb2\xf0z\x9c\xa5\x87}\xfc\xf9Z\x89\xd9o\u0390\u03eb\xcc\x00\x00\u07d4\xcdC\x06\xd7\xf6\x94z\xc1tMN\x13\xb8\xef2\xcbe~\x1c\x00\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4\xcdC%\x8bs\x92\xa90\x83\x9aQ\xb2\xef\x8a\xd24\x12\xf7Z\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcdI\xbf\x18^p\xd0E\a\x99\x9f\x92\xa4\xdeDU1('\u040965\u026d\xc5\u07a0\x00\x00\u07d4\xcdU\x10\xa2B\u07f0\x18=\xe9%\xfb\xa8f\xe3\x12\xfa\xbc\x16W\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xcdVj\u05f8\x83\xf0\x1f\u04d9\x8a\x9aX\xa9\xde\xe4rM\u0725\x89\x030\xae\x185\xbe0\x00\x00\xe0\x94\xcdY\xf3\xdd\xe7~\t\x94\v\xef\xb6\xeeX\x03\x19e\xca\xe7\xa36\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcdr]p\xbe\x97\xe6w\xe3\xc8\xe8\\\v&\xef1\xe9\x95PE\x89Hz\x9a0E9D\x00\x00\xe0\x94\xcd~G\x90\x94d\xd8q\xb9\xa6\xdcv\xa8\xe9\x19]\xb3H^z\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xcd~\xce\bkKa\x9b;6\x93R\xee8\xb7\x1d\xdb\x06C\x9a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xcd\u007f\t\xd7\xedf\xd0\u00cb\u016dN2\xb7\xf2\xb0\x8d\xc1\xb3\r\x89>;\xb3M\xa2\xa4p\x00\x00\u07d4\u0355)I+\\)\xe4u\xac\xb9A@+=;\xa5\x06\x86\xb0\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u0355\xfaB=o\xc1 'J\xac\xde\x19\xf4\xee\xb7f\xf1\x04 \x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\u035bL\xefs9\f\x83\xa8\xfdq\u05f5@\xa7\xf9\u03cb\x8c\x92\x89\x04\xe1\x00;(\xd9(\x00\x00\u07d4\u0361t\x11\t\xc0&[?\xb2\xbf\x8d^\xc9\u00b8\xa34kc\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u0361\xb8\x86\u39d5\u027aw\x91N\n/\xe5go\x0f\\\u03c9\x05\xbf`\xeaB\xc2\x04\x00\x00\u07d4\u0364S\x0fK\x9b\xc5\t\x05\xb7\x9d\x17\u008f\xc4o\x954\x9b\u07c93\x10\xe0I\x11\xf1\xf8\x00\x00\u07d4\u036bF\xa5\x90 \x80do\xbf\x95B\x04 J\xe8\x84\x04\x82+\x89\x1d\x8a\x96\xe5\xc6\x06\xeb\x00\x00\u07d4\u0375\x97)\x900\x18?n-#\x853\xf4d*\xa5\x87T\xb6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xcd\xd5\u0601\xa76,\x90p\a;\u07fcu\xe7$S\xacQ\x0e\x89-\xa5\x18\xea\xe4\x8e\xe8\x00\x00\u07d4\xcd\xd6\rs\xef\xaa\xd8s\u027b\xfb\x17\x8c\xa1\xb7\x10Z\x81\xa6\x81\x89\x01\xbc\x16\xd6t\xec\x80\x00\x00\u07d4\xcd\xd9\xef\xacMm`\xbdq\xd9U\x85\xdc\xe5\u0557\x05\xc15d\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xcd\xe3m\x81\xd1(\u015d\xa1Ee!\x93\xee\u00bf\xd9e\x86\xef\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xcd\xea8o\x9d\x0f\xd8\x04\xd0(\x18\xf27\xb7\xd9\xfavF\xd3^\x89\xa3I\xd3m\x80\xecW\x80\x00\u07d4\xcd\xec\xf5gT3\u0370\xc2\xe5Zh\xdb]\x8b\xbexA\x9d\u0489\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xcd\xfd\x82\x173\x97%\xd7\xeb\xac\x11\xa66U\xf2e\xef\xf1\xcc=\x8a\x01\x0f\fid\x10\xe3\xa9\x00\x00\u07d4\xce\a\x9fQ\x88wt\xd8\x02\x1c\xb3\xb5u\xf5\x8f\x18\xe9\xac\xf9\x84\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4\xce\x18\x84\u077b\xb8\xe1\x0eM\xbanD\xfe\xee\u00a7\xe5\xf9/\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xce\x1b\f\xb4j\xae\xcf\u05db\x88\f\xad\x0f-\u068a\x8d\xed\u0431\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xce&\xf9\xa50_\x83\x81\tCT\xdb\xfc\x92fN\x84\xf9\x02\xb5\x89\fz\xaa\xb0Y\x1e\xec\x00\x00\u07d4\xce-\xea\xb5\x1c\n\x9a\xe0\x9c\xd2\x12\xc4\xfaL\xc5+S\xcc\r\xec\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xce.\r\xa8\x93F\x99\xbb\x1aU>U\xa0\xb8\\\x16\x945\xbe\xa3\x8a\x01\x0f\fid\x10\xe3\xa9\x00\x00\u07d4\xce:a\xf0F\x1b\x00\x93^\x85\xfa\x1e\xad\x82\xc4^Zd\u0508\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xceK\x06]\xbc\xb20G 2b\xfbH\xc1\x18\x83d\x97tp\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xceS\xc8\xcd\xd7B\x96\xac\xa9\x87\xb2\xbc\x19\u00b8u\xa4\x87I\u0409\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xce^\x04\xf0\x18Ci\xbc\xfa\x06\xac\xa6o\xfa\x91\xbfY\xfa\x0f\xb9\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xce^\xb6:{\xf4\xfb\xc2\xf6\u4ea0\u018a\xb1\xcbL\xf9\x8f\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xceb\x12Z\xde\xc37\n\xc5!\x10\x95:Nv\v\xe9E\x1e;\x89\b=lz\xabc`\x00\x00\xe0\x94\xceq\bmL`%T\xb8-\xcb\xfc\xe8\x8d cMS\xccM\x8a\t(\x96R\x9b\xad\u0708\x00\x00\u07d4\u038akmP3\xb1I\x8b\x1f\xfe\xb4\x1aAU\x04\x05\xfa\x03\xa2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0397\x86\xd3q/\xa2\x00\xe9\xf6\x857\xee\xaa\x1a\x06\xa6\xf4ZK\x89a\t=|,m8\x00\x00\u07d4\u039d!\u0192\xcd<\x01\xf2\x01\x1fP_\x87\x006\xfa\x8fl\u0489\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\u03a2\x89f#\xf4\x91\x02\x87\xa2\xbd\u017e\x83\xae\xa3\xf2\xe6\xde\b\x8a\x01\xfbZ7Q\xe4\x90\xdc\x00\x00\u07d4\u03a3JM\xd9=\u066e\xfd9\x90\x02\xa9}\x99z\x1bK\x89\u0349QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\u03a4?pu\x81k`\xbb\xfc\u62d9:\xf0\x88\x12p\xf6\u0109lk\x93[\x8b\xbd@\x00\x00\u07d4\u03a8t3AS<\xb2\xf0\xb9\xc6\xef\xb8\xfd\xa8\rw\x16(%\x89\x05k\xc7^-c\x10\x00\x00\u07d4\u03b0\x89\xec\x8ax3~\x8e\xf8\x8d\xe1\x1bI\xe3\u0751\x0ft\x8f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u03b3=x\xe7Tz\x9d\xa2\xe8}Q\xae\xc5\xf3D\x1c\x87\x92:\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u03b3\x898\x1dH\xa8\xaeO\xfcH:\u043b^ L\xfd\xb1\xec\x89('\xe6\xe4\xddb\xba\x80\x00\u07d4\xce\xc6\xfce\x85?\x9c\xce_\x8e\x84Fv6.\x15y\x01_\x02\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xce\xd3\u01fe\x8d\xe7XQ@\x95*\xebP\x1d\xc1\xf8v\ucbf0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xce\xd8\x1e\xc3S?\xf1\xbf\xeb\xf3\xe3\x84>\xe7@\xad\x11u\x8d>\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xce\u0733\xa1\u0584?\xb6\xbe\xf6Ca}\xea\U000cf398\xdd_\x89\x19\xe2\xa4\xc8\x18\xb9\x06\x00\x00\u07d4\xce\xe6\x99\xc0pzx6%+)/\x04|\xe8\xad(\x9b/U\x89\x11\x9a\x1e!\xaaiV\x00\x00\u07d4\xce\xedG\xca[\x89\x9f\xd1b?!\xe9\xbdM\xb6Z\x10\u5c1d\x89\a8w@L\x1e\xee\x00\x00\u07d4\xce\xf7tQ\u07e2\xc6C\xe0\v\x15mlo\xf8N#s\xebf\x89\n1\x06+\xee\xedp\x00\x00\u07d4\xcf\x11i\x04\x1c\x17E\xe4[\x17$5\xa2\xfc\x99\xb4\x9a\xce+\x00\x89\x01\xbb\x88\xba\xab-|\x00\x00\xe0\x94\xcf\x15v\x12vN\x0f\u0596\xc8\xcb_\xba\x85\xdfL\r\xdc<\xb0\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u0794\xcf\x1b\xdby\x9b.\xa6<\xe14f\x8b\xdc\x19\x8bT\x84\x0f\x18\v\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xcf\"\x88\xefN\xbf\x88\xe8m\xb1=\x8a\x0e\v\xf5*\x05e\x82\u00c9\x89Po\xbf\x97@t\x00\x00\u07d4\xcf&Ni%\x13\t\x06\xc4\xd7\xc1\x85\x91\xaaA\xb2\xa6\u007foX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcf&\xb4{\xd04\xbcP\x8elK\xcf\xd6\xc7\xd3\x004\x92Wa\x89a\x94\x04\x9f0\xf7 \x00\x00\xe0\x94\xcf.*\xd65\xe9\x86\x1a\xe9\\\xb9\xba\xfc\xca\x03kR\x81\xf5\u038a\at2!~h6\x00\x00\x00\u07d4\xcf.s@B\xa3U\xd0_\xfb.9\x15\xb1h\x11\xf4Zi^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcf4\x8f/\xe4{~A<\az{\xaf:u\xfb\xf8B\x86\x92\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xcf?\x91(\xb0r\x03\xa3\xe1\r}WU\xc0\u012b\xc6\xe2\xca\u008a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xcf?\xbf\xa1\xfd2\u05e6\xe0\xe6\xf8\xefN\xabW\xbe4\x02\\L\x899\xa1\xc0\xf7YMH\x00\x00\u07d4\xcfAftn\x1d;\xc1\xf8\xd0qK\x01\xf1~\x8ab\xdf\x14d\x896w\x03n\xdf\n\xf6\x00\x00\u07d4\xcfO\x118\xf1\xbdk\xf5\xb6\u0505\xcc\xe4\xc1\x01\u007f\u02c5\xf0}\x89/\u043cw\xc3+\xff\x00\x00\u07d4\xcfZo\x9d\xf7Uy\xc6D\xf7\x94q\x12\x15\xb3\rw\xa0\xce@\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcf^\x0e\xac\u0473\x9d\x06U\xf2\xf7u5\xeff\b\xeb\x95\v\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcfhM\xfb\x83\x04r\x93U\xb5\x83\x15\xe8\x01\x9b\x1a\xa2\xad\x1b\xac\x89\x17r$\xaa\x84Lr\x00\x00\u07d4\xcfi@\x81\xc7m\x18\xc6L\xa7\x13\x82\xbe\\\xd6;<\xb4v\xf8\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xcfnR\xe6\xb7t\x80\xb1\x86~\xfe\xc6Dm\x9f\xc3\xcc5w\xe8\x89\f\t\x01\xf6\xbd\x98y\x00\x00\u07d4\u03c8: 2\x96g\xea\"j\x1e\x9a\x92*\x12\xf2\x1f\xaa\x03\x81V\x91\x8cO\u02dc\x89\x04E\x91\xd6\u007f\xec\xc8\x00\x00\u07d4\xcf\xf7\xf8\x9aMB\x19\xa3\x82\x95%\x131V\x82\x10\xff\xc1\xc14\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xcf\xf8\xd0k\x00\xe3\xf5\f\x19\x10\x99\xadV\xbaj\xe2eq\u0348\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xcf\xfcI\xc1x~\ubcb5l\xab\xe9$\x04\xb66\x14}EX\x8a\x013\xe00\x8f@\xa3\u0680\x00\u07d4\xd0\bQ;'`J\x89\xba\x17c\xb6\xf8L\u6233F\x94[\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0\x0f\x06r\x86\xc0\xfb\u0402\xf9\xf4\xa6\x10\x83\xecv\u07b3\xce\xe6\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0\x15\xf6\xfc\xb8M\xf7\xbbA\x0e\x8c\x8f\x04\x89J\x88\x1d\xca\xc27\x898E$\xccp\xb7x\x00\x00\u07d4\xd0\x1a\xf9\x13O\xafRW\x17N\x8by\x18oB\xee5Nd-\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0!\b\u04ae<\xab\x10\xcb\xcf\x16W\xaf\">\x02|\x82\x10\xf6\x89lm\x84\xbc\xcd\xd9\xce\x00\x00\u07d4\xd0*\xfe\u03ce.\u00b6*\u022d Aa\xfd\x1f\xaew\x1d\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd01\x919\xfb\xab.\x8e*\xcc\xc1\xd9$\u0531\x1d\xf6ilZ\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd07\xd2\x15\xd1\x1d\x1d\xf3\xd5O\xbd2\x1c\u0495\xc5F^';\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xd0:-\xa4\x1e\x86\x8e\xd3\xfe\xf5t[\x96\xf5\xec\xa4b\xffo\u0689\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\xd0?\xc1eWj\xae\xd5%\xe5P,\x8e\x14\x0f\x8b.\x86\x969\x8a\x01sV\u0633%\x01\xc8\x00\x00\u07d4\xd0C\xa0\x11\xecBp\xee~\u0239hsu\x15\xe5\x03\xf80(\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd0K\x86\x1b=\x9a\xccV:\x90\x16\x89\x94\x1a\xb1\xe1\x86\x11a\xa2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd0ZD|\x91\x1d\xbb'[\xfb.Z7\xe5\xa7\x03\xa5o\x99\x97\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd0_\xfb+t\xf8g O\xe51e;\x02H\xe2\x1c\x13TN\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0bX\x81q\u03d9\xbb\xebX\xf1&\xb8p\xf9\xa3r\x8da\xec\x89\xf3\xf2\v\x8d\xfai\xd0\x00\x00\u07d4\xd0c\x8e\xa5q\x89\xa6\xa6\x99\x02J\u05ccq\xd99\xc1\xc2\xff\x8c\x89\x8e\xaeVg\x10\xfc \x00\x00\xe0\x94\xd0d\x8aX\x1b5\b\xe15\xa2\x93]\x12\xc9epE\xd8q\u028a\x01\xb2\u07dd!\x9fW\x98\x00\x00\u07d4\xd0q\x19)f\xebi\xc3R\x0f\xca:\xa4\xdd\x04)~\xa0KN\x89\x05\xf6\x8e\x811\xec\xf8\x00\x00\u07d4\xd0q\x85 \xea\xe0\xa4\xd6-p\xde\x1b\xe0\xcaC\x1c^\xea$\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd0w]\xba*\xf4\xc3\n:x6Y9\xcdq\xc2\xf9\u0795\u0489i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xd0{\xe0\xf9\t\x97\xca\xf9\x03\u022c\x1dS\xcd\xe9\x04\xfb\x19\aA\x8968\x908\xb6\x99\xb4\x00\x00\u07d4\xd0~Q\x18d\xb1\u03d9i\xe3V\x06\x02\x82\x9e2\xfcNq\xf5\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\u0400\x94\x98\xc5H\x04z\x1e**\xa6\xa2\x9c\xd6\x1a\x0e\xe2h\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0402'_tZ,\xac\x02v\xfb\xdb\x02\u0532\xa3\xab\x17\x11\xfe\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\u040f\xc0\x9a\x000\xfd\t(\xcd2\x11\x98X\x01\x82\xa7j\xae\x9f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0413\xe8)\x81\x9f\xd2\xe2[\x978\x00\xbb=XA\xdd\x15-\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0414J\xa1\x85\xa13pa\xae \u071d\xd9l\x83\xb2\xbaF\x02\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\u0416V[|t\a\xd0e6X\x03U\xfd\xd6\xd29\x14J\xa1\x89\r\x8drkqw\xa8\x00\x00\u07d4\u041c\xb2\xe6\b-i:\x13\xe8\xd2\xf6\x8d\xd1\u0744a\xf5X@\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0426\xc6\xf9\xe9\u0133\x83\xd7\x16\xb3\x1d\xe7\x8dVAM\xe8\xfa\x91\x89\x10CV\x1a\x88)0\x00\x00\u07d4\u0427 \x9b\x80\xcf`\xdbb\xf5}\n]}R\x1ai`fU\x89\b\xacr0H\x9e\x80\x00\x00\xe0\x94\u0428\xab\xd8\n\x19\x9bT\xb0\x8be\xf0\x1d \x9c'\xfe\xf0\x11[\x8a\x01a\xc6&\xdca\xa2\xef\x80\x00\xe0\x94\u042b\xccp\xc0B\x0e\x0e\x17/\x97\xd4;\x87\xd5\xe8\f3n\xa9\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u042es]\x91^\x94hf\xe1\xfe\xa7~^\xa4f\xb5\xca\xdd\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0431\x1do+\u0394^\fjP \u00f5'S\xf8\x03\xf9\u0449\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xd0\xc1\x01\xfd\x1f\x01\xc6?k\x1d\x19\xbc\x92\r\x9f\x93#\x14\xb16\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xd0\xc5Z\xbf\x97o\xdc=\xb2\xaf\u9f99\u0519HMWl\x02\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0\u0422\xadE\xf5\x9a\x9d\xcc\u0195\xd8_%\xcaF\xed1\xa5\xa3\x89-\x89W}}@ \x00\x00\u07d4\xd0\xd6,G\xea`\xfb\x90\xa3c\x92\t\xbb\xfd\xd4\xd93\x99\x1c\u0189\n\x84Jt$\xd9\xc8\x00\x00\u07d4\xd0\xdbEax o\\D0\xfe\x00Pc\x90<=zI\xa7\x89&I\x1eE\xa7S\xc0\x80\x00\u07d4\xd0\xe1\x94\xf3K\x1d\xb6\t(\x85\t\xcc\xd2\xe7;a1\xa2S\x8b\x8965f3\xeb\xd8\xea\x00\x00\u07d4\xd0\xe3^\x04vF\xe7Y\xf4Qp\x93\xd6@\x86BQ\u007f\bM\x89\u054f\xa4h\x18\xec\u02c0\x00\u07d4\xd0\xeeM\x02\xcf$8,0\x90\xd3\xe9\x95`\xde6xs\\\u07c9\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xd0\xf0OR\x10\x9a\xeb\xec\x9a{\x1e\x932v\x1e\x9f\xe2\xb9{\xb5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd0\xf9Yx\x11\xb0\xb9\x92\xbb}7W\xaa%\xb4\xc2V\x1d2\xe2\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\x03\x02\xfa\xa1\x92\x9a2i\x04\xd3v\xbf\v\x8d\xc9:\xd0LL\x89a\t=|,m8\x00\x00\xe0\x94\xd1\x10\r\xd0\x0f\xe2\xdd\xf1\x81c\xad\x96M\vi\xf1\xf2\xe9e\x8a\x8a\x01C\x12\tU\xb2Pk\x00\x00\u07d4\xd1\x16\xf3\xdc\xd5\xdbtK\xd0\b\x88v\x87\xaa\x0e\xc9\xfdr\x92\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd1\x19A|Fs,\xf3M\x1a\x1a\xfby\xc3\xe7\xe2\u034e\xec\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd1-w\xae\x01\xa9-5\x11{\xacpZ\xac\u0642\xd0.t\xc1\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd15yK\x14\x9a\x18\xe1G\xd1nb\x1ai1\xf0\xa4\n\x96\x9a\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xd1C%8\xe3[vd\x95j\u4563*\xbd\xf0A\xa7\xa2\x1c\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\xd1C\x82g#\x17\x04\xfcr\x80\xd5c\xad\xf4v8D\xa8\a\"\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd1S\x8e\x9a\x87\u5729\xec\x8eX&\xa5\xb7\x93\xf9\x9f\x96\xc4\u00c965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd1d\x85\x03\xb1\xcc\u0178\xbe\x03\xfa\x1e\xc4\xf3\xee&~j\xdf{\x8a\x01;\xef\xbfQ\xee\xc0\x90\x00\x00\xe0\x94\xd1h,!Y\x01\x8d\xc3\xd0\u007f\b$\n\x8c`m\xafe\xf8\xe1\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xd1q\xc3\xf2%\x8a\xef5\xe5\x99\xc7\xda\x1a\xa0s\x00#M\xa9\xa6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd1w\x8c\x13\xfb\xd9h\xbc\b<\xb7\xd1\x02O\xfe\x1fI\xd0,\xaa\x89\xd9\xec\xb4\xfd \x8eP\x00\x00\u07d4\xd1\u007f\xbe\"\xd9\x04b\xed7(\x06p\xa2\xea\v0\x86\xa0\xd6\u0589\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\u0441\x1cU\x97i\x80\xf0\x83\x90\x1d\x8a\r\xb2i\"-\xfb\\\xfe\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\u044e\xb9\xe1\u0485\u06be\x93\xe5\u053a\xe7k\xee\xfeC\xb5!\xe8\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\u0453\xe5\x83\xd6\a\x05c\xe7\xb8b\xb9aJG\u9509\xf3\xe5\x8965f3\xeb\xd8\xea\x00\x00\u07d4\u0457\x8f.4@\u007f\xab\x1d\xc2\x18=\x95\xcf\xdab`\xb3Y\x82\x89*\xb7\xb2`\xff?\xd0\x00\x00\u07d4\u045c\xaf9\xbb7\u007f\xdf,\xf1\x9b\xd4\xfbRY\x1c&1\xa6<\x8965\u026d\xc5\u07a0\x00\x00\u0794\u0463\x96\xdc\u06b2\xc7IA0\xb3\xfd0x 4\r\xfd\x8c\x1f\x88\xf9\"P\xe2\xdf\xd0\x00\x00\xe0\x94\u0467\x1b-\bX\xe82p\b]\x95\xa3\xb1T\x96P\x03^#\x8a\x03'\xbb\t\xd0j\xa8P\x00\x00\u07d4\u046c\xb5\xad\xc1\x189s%\x8dk\x85$\xff\xa2\x8f\xfe\xb2=\xe3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0473\u007f\x03\xcb\x10t$\xe9\xc4\xddW\\\xcdOL\xeeW\xe6\u0349lk\x93[\x8b\xbd@\x00\x00\u07d4\u0475\xa4T\xac4\x05\xbbAy \x8cl\x84\xde\x00k\u02db\xe9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\xc4YT\xa6+\x91\x1a\xd7\x01\xff.\x90\x13\x1e\x8c\xeb\x89\xc9\\\x89K\x91\xa2\xdeE~\x88\x00\x00\u07d4\xd1\xc9np\xf0Z\xe0\xe6\xcd`!\xb2\b7P\xa7q|\xdeV\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\u0571\u007f\xfe-{\xbby\xcc}y0\xbc\xb2\xe5\x18\xfb\x1b\xbf\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd1\xda\f\x8f\xb7\xc2\x10\xe0\xf2\xeca\x8f\x85\xbd\xae}>sK\x1c\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xd1\xddy\xfb\x15\x81`\xe5\xb4\xe8\xe2?1.j\x90\u007f\xbcMN\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\xdeZ\xad:_\xd8\x03\U00071bb6\x10<\xb8\xe1O\xe7#\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd1\xe1\xf2\xb9\xc1l0\x98t\xde\xe7\xfa\xc3&u\xaf\xf1)\u00d8\x89\x03\xf2M\x8eJ\x00p\x00\x00\xe0\x94\xd1\xe5\xe24\xa9\xf4Bf\xa4\xa6$\x1a\x84\u05e1\xa5Z\u0567\xfe\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xd1\xeaMr\xa6{[>\x0f1UY\xf5+\xd0aMq0i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd1\xee\x90YW\xfe|\xc7\x0e\xc8\xf2\x86\x8bC\xfeG\xb1?\xeb\xff\x89\x02b\x9ff\xe0\xc50\x00\x00\u07d4\xd1\xf1iM\"g\x1bZ\xadj\x94\x99\\6\x9f\xbea3go\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd1\xf4\xdc\x1d\u06ca\xbb\x88H\xa8\xb1N%\xf3\xb5Z\x85\x91\xc2f\x89\r\x8drkqw\xa8\x00\x00\u07d4\xd1\xfe\u042e\xe6\xf5\xdf\xd7\xe2Wi%L<\xfa\xd1Z\xde\u032a\x89'\x92\xc8\xfcKS(\x00\x00\u07d4\xd2\x05\x1c\xb3\xcbg\x04\xf0T\x8c\u0210\xab\n\x19\xdb4\x15\xb4*\x89\x12\x1b.^ddx\x00\x00\u07d4\xd2\x06\xaa\u07736\xd4^yr\xe9<\xb0uG\x1d\x15\x89{]\x89 \x86\xac5\x10R`\x00\x00\u07d4\xd2\tH+\xb5I\xab\xc4w{\xeam\u007fe\x00b\xc9\xc5z\x1c\x89\x11e\x1a\xc3\xe7\xa7X\x00\x00\u07d4\xd2\r\xcb\vxh+\x94\xbc0\x00(\x14H\xd5W\xa2\v\xfc\x83\x890\x84\x9e\xbe\x166\x9c\x00\x00\u07d4\xd2\x10{57&\u00e2\xb4ef\xea\xa7\xd9\xf8\v]!\xdb\xe3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd2\x11\xb2\x1f\x1b\x12\xb5\ta\x81Y\r\xe0~\xf8\x1a\x89S~\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd2\x18\xef\xb4\u06d8\x1c\xddjy\u007fK\u050c|&)<\xeb@\x89\xa1Fk1\xc6C\x1c\x00\x00\xe0\x94\xd2\x1asA\xeb\x84\xfd\x15\x10T\xe5\u31fb%\xd3nI\x9c\t\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94\xd2$\xf8\x80\xf9G\x9a\x89\xd3/\t\xe5+\u9432\x88\x13\\\xef\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\xd2/\f\xa4\xcdG\x9ef\x17u\x05;\xccI\xe3\x90\xf6p\u074a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd21\x92\x975\x13!\x02G\x1b\xa5\x90\a\xb6dL\xc0\xc1\xde>\x8967\tlK\xcci\x00\x00\u07d4\xd25\xd1\\\xb5\xec\xee\xbba)\x9e\x0e\x82\u007f\xa8'H\x91\x1d\x89\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd2:$\xd7\xf9F\x83C\xc1C\xa4\x1ds\xb8\x8f|\xbec\xbe^\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd2=z\xff\xac\xdc>\x9f=\xaez\xfc\xb4\x00oX\xf8\xa4F\x00\x89\xc3(\t>a\xee@\x00\x00\u07d4\xd2C\x18L\x80\x1e]y\xd2\x06?5x\u06ee\x81\u7ce9\u02c9k\u0722h\x1e\x1a\xba\x00\x00\u07d4\xd2KfD\xf49\xc8\x05\x1d\xfcd\u04c1\xb8\xc8lu\xc1u8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd2K\xf1--\xdfE}\xec\xb1xt\xef\xde R\xb6\\\xbbI\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94\xd2Q\xf9\x03\xae\x18rrY\xee\xe8A\xa1\x89\xa1\xf5i\xa5\xfdv\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xd2R\x96\v\v\xf6\xb2\x84\x8f\u07ad\x80\x13m\xb5\xf5\a\xf8\xbe\x02\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd2X\x1aU\xce#\xab\x10\u062d\x8cD7\x8fY\a\x9b\xd6\xf6X\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4\xd2Z\xec\xd7\xeb\x8b\xd64[\x06;]\xbd'\x1cw\xd3QD\x94\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xd2|#O\xf7\xac\xca\xce=\x99g\b\xf8\xf9\xb0Ip\xf9}6\x89Hz\x9a0E9D\x00\x00\u07d4\u0482\x98RM\xf5\xecK$\xb0\xff\xb9\u07c5\x17\n\x14Z\x9e\xb5\x89\x0f\x98\xa3\xb9\xb37\xe2\x00\x00\xe0\x94\u0483\xb8\xed\xb1\n%R\x8aD\x04\xde\x1ce\xe7A\r\xbc\xaag\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\u0484\xa5\x03\x82\xf8:am9\xb8\xa9\xc0\xf3\x96\xe0\ubfe9]\x8966\xc2^f\xec\xe7\x00\x00\u07d4\u0488\xe7\xcb{\xa9\xf6 \xab\x0ftR\xe5\bc=\x1cZ\xa2v\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\u049d\xc0\x8e\xfb\xb3\xd7.&?x\xabv\x10\xd0\"m\xe7k\x00\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\u04a00\xac\x89R2_\x9e\x1d\xb3x\xa7\x14\x85\xa2N\x1b\a\xb2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u04a4y@CG\xc5T:\xab)*\xe1\xbbJo\x15\x83W\xfa\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\u04a5\xa0$#\nW\xcc\xc6fv\v\x89\xb0\xe2l\xaf\u0449\u01ca\n\x96YZ\\n\x8a?\x80\x00\u07d4\u04a8\x03'\xcb\xe5\\L{\xd5\x1f\xf9\xdd\xe4\xcad\x8f\x9e\xb3\xf8\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\u04a8Oug\\b\xd8\f\x88ulB\x8e\xee+\xcb\x18T!\x89A\rXj \xa4\xc0\x00\x00\u07d4\u04ab\xd8J\x18\x10\x93\xe5\xe2)\x13oB\xd85\xe8#]\xe1\t\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4\u04ac\r:X`^\x1d\x0f\x0e\xb3\xde%\xb2\xca\xd1)\xed`X\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u04bfg\xa7\xf3\xc6\xceV\xb7\xbeAg]\xbb\xad\xfe~\xa9:3\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd2\xdb\xeb\xe8\x9b\x03W\xae\xa9\x8b\xbe\x8eIc8\u07bb(\xe8\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd2\xe2\x1e\xd5hh\xfa\xb2\x8e\tG\x92z\xda\xf2\x9f#\xeb\xadl\x89l\x18O\x13U\xd0\xe8\x00\x00\u07d4\xd2\xe8\x17s\x8a\xbf\x1f\xb4\x86X?\x80\xc3P1\x8b\xed\x86\f\x80\x89\r\x02\xce\xcf_]\x81\x00\x00\u07d4\xd2\xed\xd1\xdd\xd6\xd8m\xc0\x05\xba\xebT\x1d\"\xb6@\xd5\xc7\xca\xe5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd2\xf1\x99\x8e\x1c\xb1X\f\xecOl\x04}\xcd=\xce\xc5L\xf7<\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd2\xf2A%]\xd7\xc3\xf7<\a\x040q\xec\b\xdd\xd9\xc5\xcd\xe5\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd2\xffg \x16\xf6;/\x859\x8fJo\xed\xbb`\xa5\r<\u0389\x12\x91$o[sJ\x00\x00\u07d4\xd3\rLC\xad\xcfU\xb2\xcbS\u0583#&A4I\x8d\x89\u038965\u026d\xc5\u07a0\x00\x00\u07d4\xd3\x0e\xe9\xa1+Mh\xab\xac\xe6\xba\u029a\u05ff\\\xd1\xfa\xf9\x1c\x89QO\xcb$\xff\x9cP\x00\x00\u07d4\xd3\x11\x8e\xa3\xc85\x05\xa9\u0613\xbbg\xe2\xde\x14-Sz>\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd3\x11\xbc\u05eaN\x9bO8?\xf3\xd0\u05b6\xe0~!\xe3p]\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd3\x15\xde\xea\x1d\x8c\x12q\xf9\xd11\x12c\xabG\xc0\a\xaf\xb6\xf5\x89\x03\xc8\x1dNeK@\x00\x00\u07d4\xd3+,y\xc3dx\xc5C\x19\x01\xf6\xd7\x00\xb0M\xbe\x9b\x88\x10\x89\x15w\x9a\x9d\xe6\xee\xb0\x00\x00\u07d4\xd3+EVF\x14Ql\x91\xb0\u007f\xa9\xf7-\xcfx|\xceN\x1c\x89\x0f\xc6o\xae7F\xac\x00\x00\u07d4\xd30r\x811\xfe\x8e:\x15Hz4W<\x93E~*\xfe\x95\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd31\xc8#\x82Z\x9eRc\xd0R\u0611]M\xcd\xe0z\\7\x89\x1e\x93\x12\x83\xcc\xc8P\x00\x00\u07d4\xd33btE\xf2\u05c7\x90\x1e\xf3;\xb2\xa8\xa3g^'\xff\xec\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd3<\xf8+\xf1LY&@\xa0\x86\b\x91L#py\u057e4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd3Mp\x8ds\x98\x02E3\xa5\xa2\xb20\x9b\x19\xd3\xc5Qq\xbb\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd3N\x03\xd3j+\xd4\u045a_\xa1b\x18\xd1\xd6\x1e?\xfa\v\x15\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\xd3Pu\xcaa\xfeY\xd1#\x96\x9c6\xa8-\x1a\xb2\xd9\x18\xaa8\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xd3g\x00\x9a\xb6X&;b\xc23:\x1c\x9eA@I\x8e\x13\x89\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd3g\x9aG\xdf-\x99\xa4\x9b\x01\u024d\x1c>\f\x98|\xe1\xe1X\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\xe0\x94\u04cf\xa2\xc4\xcc\x14z\xd0j\u0562\xf7Uy(\x1f\"\xa7\xcc\x1f\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\u04da]\xa4`9+\x94\v\u01ee8\xf1e\u007f\x8a\x01f\xc5H\b\x89\xdbw\x00\x00\xe0\x94\xd3\xd6\xe9\xfb\x82T/\u049e\xd9\xea6\t\x89\x1e\x15\x13\x96\xb6\xf7\x8a\voX\x8a\xa7\xbc\xf5\xc0\x00\x00\xe0\x94\xd3\xda\u0476\u040dE\x81\u032ee\xa8s-\xb6\xaci\xf0\u019e\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xd3\xdf;S\xcb;GU\xdeT\xe1\x80E\x1c\xc4L\x9e\x8a\u0a89#\u0114\t\xb9w\x82\x80\x00\u07d4\xd3\xf8s\xbd\x99V\x13W\x89\xab\x00\xeb\xc1\x95\xb9\"\xe9K%\x9d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd4\x02\xb4\xf6\xa0\x99\xeb\xe7\x16\xcb\x14\xdfOy\xc0\xcd\x01\xc6\a\x1b\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd4\r\x00U\xfd\x9a8H\x8a\xff\x92?\xd0=5\xecF\xd7\x11\xb3\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d4\xd4\x0e\xd6j\xb3\xce\xff$\xca\x05\xec\xd4q\ufd12\xc1__\xfa\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd4\x18\x87\v\xc2\xe4\xfa{\x8aa!\xae\br\xd5RG\xb6%\x01\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xd4\x1d\u007f\xb4\x9f\xe7\x01\xba\xac%qpBl\u0273\x8c\xa3\xa9\xb2\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4\xd4 U\x92\x84@U\xb3\u01e1\xf8\f\xef\xe3\xb8\xebP\x9b\xcd\xe7\x89\t\xb3\xbf\xd3B\xa9\xfc\x80\x00\u07d4\xd4+ \xbd\x03\x11`\x8bf\xf8\xa6\xd1[*\x95\xe6\xde'\u017f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd44O}\\\xade\xd1~\\-\x0es#\x94=ob\xfe\x92\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\xd4>\xe48\xd8=\xe9\xa3ub\xbbN(l\xb1\xbd\x19\xf4\x96M\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd4C4\xb4\xe2:\x16\x9a\f\x16\xbd!\xe8f\xbb\xa5-\x97\x05\x87\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\xe0\x94\xd4M\x81\xe1\x8fF\xe2\u03f5\xc1\xfc\xf5\x04\x1b\xc8V\x97g\xd1\x00\x8a\a\xb4B\xe6\x84\xf6Z\xa4\x00\x00\u07d4\xd4OJ\xc5\xfa\xd7k\xdc\x157\xa3\xb3\xafdr1\x9bA\r\x9d\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\xd4O^\xdf+\xcf$3\xf2\x11\xda\xdd\f\xc4P\xdb\x1b\x00\x8e\x14\x89\x0e~\xeb\xa3A\vt\x00\x00\xe0\x94\xd4Oj\u00d2;_\xd71\xa4\xc4YD\xecO~\xc5*j\xe4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xd4[3A\xe8\xf1\\\x802\x93 \u00d7~;\x90\xe7\x82j~\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd4]]\xaa\x13\x8d\xd1\xd3t\xc7\x1b\x90\x19\x91h\x11\xf4\xb2\nN\x89\x1f9\x9b\x148\xa1\x00\x00\x00\u07d4\xd4`\xa4\xb9\b\xdd+\x05gY\xb4\x88\x85\vf\xa88\xfcw\xa8\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xd4g\xcf\x06L\bq\x98\x9b\x90\u0632\xeb\x14\xcc\xc6;6\b#\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd4k\xaea\xb0'\xe5\xbbB.\x83\xa3\xf9\xc9?<\x8f\xc7}'\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd4o\x82#E)\x82\xa1\xee\xa0\x19\xa8\x81n\xfc-o\xc0\ah\x89\amA\xc6$\x94\x84\x00\x00\u07d4\xd4uG\u007f\xa5c\x90\xd30\x17Q\x8dg\x11\x02\u007f\x05\U0008dfc9k\x11\x133\xd4\xfdL\x00\x00\u07d4\xd4|$.\xdf\xfe\xa0\x91\xbcT\xd5}\xf5\xd1\xfd\xb91\x01Gl\x89\x9d\xf7\u07e8\xf7`H\x00\x00\u07d4\xd4}\x86\x85\xfa\xee\x14|R\x0f\u0646p\x91u\xbf/\x88k\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd4\u007fP\u07c9\xa1\xcf\xf9e\x13\xbe\xf1\xb2\xae:)q\xac\xcf,\x89-\x89W}}@ \x00\x00\u07d4\u0502\xe7\xf6\x8eA\xf28\xfeQx)\xde\x15G\u007f\xe0\xf6\xdd\x1d\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u0507\x9f\xd1+\x1f:'\xf7\xe1\tv\x1b#\xca4\xfa#\x06K\x1c\xaf\x00Qn(pJ\x82\xa4\xf8\x89Hz\x9a0E9D\x00\x00\u07d4\xd5\x00\xe4\xd1\u0242K\xa9\xf5\xb65\u03e3\xa8\xc2\u00cb\xbdL\xed\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd5\b\u04dcp\x91oj\xbcL\xc7\xf9\x99\xf0\x11\xf0w\x10X\x02\x89\x05rM$\xaf\xe7\u007f\x00\x00\u07d4\xd5\x0f\u007f\xa0>8\x98v\u04d0\x8b`\xa57\xa6pc\x04\xfbV\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xd5\x13\xa4P\x80\xff/\xeb\xe6,\u0545J\xbe)\xeeDg\xf9\x96\x89\bN\x13\xbcO\xc5\xd8\x00\x00\u07d4\xd5'o\f\xd5\xff\xd5\xff\xb6?\x98\xb5p=U\x94\xed\xe0\x83\x8b\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd5)KfbB0;m\xf0\xb1\u020d7B\x9b\xc8\xc9e\xaa\x89\x10M\r\x00\u04b7\xf6\x00\x00\u07d4\xd5*\xec\xc6I98\xa2\x8c\xa1\xc3g\xb7\x01\xc2\x15\x98\xb6\xa0.\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4\xd5\x99x\xee \xa3\x8c?I\x8dc\xd5\u007f1\xa3\x9fj\x06\x8a\x022\xb3o\xfcg*\xb0\x00\x00\u07d4\u05568\xd3\xc5\xfa\xa7q\x1b\xf0\x85t_\x9d[\xdc#\u0518\u0609lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u055d\x92\xd2\xc8p\x19\x80\xcc\a<7]r\n\xf0dt<\f\x8a\x04\x05\xfd\xf7\u5bc5\xe0\x00\x00\u07d4\u0567\xbe\xc32\xad\xde\x18\xb3\x10KW\x92Tj\xa5\x9b\x87\x9bR\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0571\x17\xec\x11n\xb8FA\x89a\xeb~\xdbb\x9c\xd0\xddi\u007f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\u0572\x84\x04\x010\xab\xf7\xc1\xd1cq#q\xcc~(\xadf\u0689j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u0579\xd2w\u062a\xd2\x06\x97\xa5\x1fv\xe2\tx\x99k\xff\xe0U\x89\a\xc3\xfe<\aj\xb5\x00\x00\u07d4\u057d^\x84U\xc10\x16\x93W\xc4q\xe3\u6077\x99jrv\x89-\x9e(\x8f\x8a\xbb6\x00\x00\u07d4\xd5\u02e5\xb2k\xea]s\xfa\xbb\x1a\xba\xfa\xcd\xef\x85\xde\xf3h\u0309\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd5\xceU\u0476/YC\xc0?\x89\b\xe3\x1f\xe1h\x9d\x8a\x00\x00\u07d4\xd6\x06Q\xe3\x93x4#\xe5\xcc\x1b\xc5\xf8\x89\xe4N\xf7\xea$>\x89\x15\x9ev7\x11)\xc8\x00\x00\u07d4\xd6\t\xbfO\x14n\xeak\r\xc8\xe0m\xdc\xf4D\x8a\x1f\xcc\xc9\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd6\t\xec\v\xe7\r\n\xd2ong\xc9\xd4v+R\xeeQ\x12,\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd6\nRX\a(R\r\xf7Tk\xc1\xe2\x83)\x17\x88\u06ee\f\x8964\x89\xef?\xf0\xd7\x00\x00\u07d4\xd6\v$s!\xa3*Z\xff\xb9k\x1e'\x99'\xccXM\xe9C\x89z\xd0 \xd6\xdd\xd7v\x00\x00\u07d4\xd6\x11\x02v\xcf\xe3\x1eB\x82ZW\u007fkC]\xbc\xc1\f\xf7d\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd6\x12Y{\xc3\x17C\u01c63\xf63\xf29\xb1\xe9Bk\xd9%\x8a\x10\x17\xf7\u07d6\xbe\x17\x80\x00\x00\u07d4\xd6#J\xafE\xc6\xf2.f\xa2%\xff\xb9:\xddb\x9bN\xf8\x0f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd6.\u06d6\xfc\u259a\xaflT^\x96|\xf1\xc0\xbc\x80R\x05\x89\x04\xa5eSjZ\u0680\x00\u07d4\xd60\v2\x15\xb1\x1d\xe7b\xec\xdeKp\xb7\x92}\x01)\x15\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd69]\xb5\xa4\xbbf\xe6\x0fL\xfb\xcd\xf0\x05{\xb4\xd9xb\xe2\x891T\xc9r\x9d\x05x\x00\x00\xe0\x94\xd6J-P\xf8\x85\x857\x18\x8a$\xe0\xf5\r\xf1h\x1a\xb0~\u05ca\b7Z*\xbc\xca$@\x00\x00\u07d4\xd6X\n\xb5\xedL}\xfaPo\xa6\xfed\xad\\\xe1)pw2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd6Y\x8b\x13\x86\xe9<\\\u02d6\x02\xffK\xbb\xec\xdb\xd3p\x1d\u0109\f%\xf4\xec\xb0A\xf0\x00\x00\u07d4\xd6dM@\xe9\v\xc9\u007f\xe7\xdf\xe7\u02bd2i\xfdW\x9b\xa4\xb3\x89\b\x9e\x91y\x94\xf7\x1c\x00\x00\xe0\x94\xd6g\f\x03m\xf7T\xbeC\xda\u074fP\xfe\xea(\x9d\x06\x1f\u058a\x01D\xa2\x904H\xce\xf7\x80\x00\u07d4\xd6hR:\x90\xf0)=e\xc58\xd2\xddlWg7\x10\x19n\x89\x02$,0\xb8S\xee\x00\x00\u07d4\xd6j\xb7\x92\x94\aL\x8bb}\x84-\xabA\xe1}\xd7\f]\xe5\x8965\u026d\xc5\u07a0\x00\x00\u0794\xd6j\xcc\r\x11\xb6\x89\u03a6\xd9\xea_\xf4\x01L\"J]\xc7\u0108\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xd6m\xdf\x11Y\xcf\"\xfd\x8czK\xc8\u0540wV\xd43\xc4>\x89wC\"\x17\xe6\x83`\x00\x00\u07d4\u0587\xce\xc0\x05\x90\x87\xfd\xc7\x13\xd4\xd2\xd6^w\xda\xef\xed\xc1_\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\u0588\xe7\x85\u024f\x00\xf8K:\xa1S3U\u01e2X\xe8yH\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u05a2.Y\x8d\xab\u04ce\xa6\xe9X\xbdy\u050d\u0756\x04\xf4\u07c965\u026d\xc5\u07a0\x00\x00\u07d4\u05a7\xacM\xe7\xb5\x10\xf0\xe8\xdeQ\x9d\x97?\xa4\xc0\x1b\xa84\x00\x89e\xea=\xb7UF`\x00\x00\u07d4\u05ac\xc2 \xba.Q\xdf\xcf!\xd4C6\x1e\xeav\\\xbd5\u0609\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u05ac\xff\u043f\u065c8.{\xd5o\xf0\xe6\x14J\x9eR\xb0\x8e\x89\b\xacr0H\x9e\x80\x00\x00\u07d4\xd6\xc0\u043c\x93\xa6.%qtp\x0e\x10\xf0$\u0232?\x1f\x87\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd6\xcf\\\x1b\u03dd\xa6b\xbc\xea\"U\x90P\x99\xf9\xd6\xe8M\u030a\x01\u011eB\x01W\xd9\xc2\x00\x00\u07d4\xd6\xd05r\xa4RE\xdb\xd46\x8cO\x82\xc9W\x14\xbd!g\xe2\x89?\x00\xc3\xd6f\x86\xfc\x00\x00\u07d4\xd6\xd6wiX\xee#\x14:\x81\xad\xad\xeb\b8 \t\xe9\x96\u0089\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd6\xd9\xe3\x0f\bB\x01*qv\xa9\x17\xd9\xd2\x04\x8c\xa0s\x87Y\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd6\xe0\x9e\x98\xfe\x13\x003!\x04\xc1\xca4\xfb\xfa\xc5T6N\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4\xd6\xe8\xe9z\u90db\x9e\xe5\a\xee\xdb(\xed\xfbtw\x03\x149\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd6\uea18\u052e+q\x80'\xa1\x9c\xe9\xa5\xebs\x00\xab\xe3\u0289\x01}J\xce\xeec\u06c0\x00\xe0\x94\xd6\xf1\xe5[\x16\x94\b\x9e\xbc\xb4\xfe}x\x82\xaaf\u0217av\x8a\x04<#\xbd\xbe\x92\x9d\xb3\x00\x00\u07d4\xd6\xf4\xa7\xd0N\x8f\xaf \xe8\xc6\ub15c\xf7\xf7\x8d\xd2=z\x15\x89\a$\xde\xd1\xc7H\x14\x00\x00\u07d4\xd6\xfc\x04F\u01a8\xd4\n\xe3U\x1d\xb7\xe7\x01\xd1\xfa\x87nJI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\x03\u01a4\xf1\x1d`\x19Ey\u054c'f\xa7\xef\x16\xc3\n)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\x05%\x19uj\xf4%\x90\xf1S\x91\xb7#\xa0?\xa5d\xa9Q\x89\xfa61H\r\x01\xfd\x80\x00\u07d4\xd7\na+\xd6\u0769\xea\xb0\xdd\xdc\xffJ\xafA\"\u04cf\xea\xe4\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\u07d4\xd7\n\xd2\xc4\xe9\uefe67\xefV\xbdHj\u04a1\xe5\xbc\xe0\x93\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\x14\f\x8eZC\a\xfa\xb0\xcc'\xba\u0752\x95\x01\x8b\xf8yp\x89\x05\xf1\x01kPv\xd0\x00\x00\u07d4\xd7\x16J\xa2a\xc0\x9a\u0672\xb5\x06\x8dE>\xd8\xebj\xa10\x83\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd7\x1eC\xa4Qw\xadQ\xcb\xe0\xf7!\x84\xa5\xcbP9\x17(Z\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\x1f\xb10\xf0\x15\fVRi\xe0\x0e\xfbC\x90+R\xa4U\xa6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\"W8\xdc\xf3W\x848\xf8\xe7\u0233\x83~B\xe0J&/\x89\x18+\x8c\ubec3\xaa\x00\x00\u07d4\xd7'MP\x80M\x9cw\u0693\xfaH\x01V\xef\xe5{\xa5\x01\u0789i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xd71\xbbk_<79^\t\u03ac\xcd\x14\xa9\x18\xa6\x06\a\x89\x89\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94\xd7>\xd2\u0645\xb5\xf2\x1bU\xb2td;\xc6\xda\x03\x1d\x8e\u074d\x8a\nm\xd9\f\xaeQ\x14H\x00\x00\u07d4\xd7D\xac~S\x10\xbeijc\xb0\x03\xc4\v\xd097\x05a\u0189Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\xd7Jn\x8dj\xab4\u0385\x97h\x14\xc12{\xd6\xea\a\x84\u048a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xd7ZP*[gr\x87G\x0fe\u016aQ\xb8|\x10\x15\x05r\x8910\xb4dc\x85t\x00\x00\u07d4\xd7m\xba\xeb\xc3\rN\xf6{\x03\xe6\xe6\xec\xc6\xd8N\x00MP-\x89mv\xb9\x18\x8e\x13\x85\x00\x00\u07d4\xd7q\xd9\xe0\u028a\b\xa1\x13wW1CN\xb3'\x05\x99\xc4\r\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xd7x\x8e\xf2\x86X\xaa\x06\xccS\xe1\xf3\xf0\xdeX\xe5\xc3q\xbex\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xd7x\x92\xe2';#]v\x89\xe40\xe7\xae\ud73c\xe8\xa1\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u05c1\xf7\xfc\t\x18F\x11V\x85p\xb4\x98n,r\x87+~\u0409\x01\x15\x95a\x06]]\x00\x00\u07d4\u05c5\xa8\xf1\x8c8\xb9\xbcO\xfb\x9b\x8f\xa8\xc7r{\xd6B\xee\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u05ce\xcd%\xad\xc8k\xc2\x05\x1d\x96\xf6Sd\x86kB\xa4&\xb7\x89\xd20X\xbf/&\x12\x00\x00\xe0\x94\u05cf\x84\xe3\x89D\xa0\xe0%_\xae\xceH\xbaIP\u053d9\u048a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\u05d4\x83\xf6\xa8DO%I\xd6\x11\xaf\xe0,C-\x15\xe1\x10Q\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u05d85\xe4\x04\xfb\x86\xbf\x84_\xba\t\rk\xa2^\f\x88f\xa6\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\u05da\xff\x13\xba-\xa7]F$\f\xac\n$g\xc6V\x94\x98#\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\u05dd\xb5\xabCb\x1az=\xa7\x95\xe5\x89)\xf3\xdd%\xafg\u0649lj\xccg\u05f1\xd4\x00\x00\u07d4\u05e1C\x1e\xe4S\xd1\xe4\x9a\x05P\xd1%hy\xb4\xf5\xd1\x02\x01\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\u05ed\t\xc6\xd3&WhSU\xb5\xc6\uc39fW\xb4\ube42\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u05f7@\xdf\xf8\xc4Wf\x8f\xdft\xf6\xa2f\xbf\xc1\u0737#\xf9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xd7\u0080>\u05f0\xe0\x83sQA\x1a\x8ef7\xd1h\xbc[\x05\x8a\x06A\xda\xf5\xc9\x1b\xd95\x80\x00\u07d4\xd7\xc6&]\xea\x11\x87l\x90;q\x8eL\u062b$\xfe&[\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\xca\u007f\xdc\xfe\xbeE\x88\xef\xf5B\x1d\x15\"\xb6\x13(\xdf{\xf3\x89\xd8\xe6\x00\x1el0+\x00\x00\u07d4\xd7\u037dA\xff\xf2\r\xf7'\xc7\vbU\xc1\xbav\x06\x05Th\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\xd1W\xe4\xc0\xa9d7\xa6\u0485t\x1d\xd2>\xc46\x1f\xa3k\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\xd2\xc6\xfc\xa8\xad\x1fu9R\x10\xb5}\xe5\xdf\xd6s\x939\t\x89\x12nr\xa6\x9aP\xd0\x00\x00\xe0\x94\xd7\xd3\xc7Y Y\x048\xb8,>\x95\x15\xbe.\xb6\xedz\x8b\x1a\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4\xd7\xd7\xf2\u02a4b\xa4\x1b;0\xa3J\xeb;\xa6\x10\x10\xe2bo\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\xe7J\xfd\xba\xd5^\x96\u03bcZ7O,\x8bv\x86\x80\xf2\xb0\x89\x05]\xe6\xa7y\xbb\xac\x00\x00\xe0\x94\xd7\xeb\x901b'\x1c\x1a\xfa5\xfei\xe3s\"\u0224\u049b\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xd7\xeb\u0779\xf99\x87w\x9bh\x01U7T8\xdbe\xaf\xcbj\x89\x05t\x1a\xfe\xff\x94L\x00\x00\u07d4\xd7\xef4\x0ef\xb0\u05ef\xcc\xe2\n\x19\xcb{\xfc\x81\xda3\xd9N\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd7\xf3p\u053e\xd9\xd5|oI\u0259\xder\x9e\xe5i\xd3\xf4\xe4\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\xfa_\xfb`H\xf9o\xb1\xab\xa0\x9e\xf8{\x1c\x11\xddp\x05\xe4\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd8\x06\x9f\x84\xb5!I?G\x15\x03\u007f2&\xb2_3\xb6\x05\x86\x89g\x8a\x93 b\xe4\x18\x00\x00\u0794\xd8\x15\xe1\xd9\xf4\xe2\xb5\xe5~4\x82k|\xfd\x88\x81\xb8Th\x90\x88\xf0\x15\xf2W6B\x00\x00\u07d4\xd8\x1b\xd5K\xa2\xc4Jok\xeb\x15a\u058b\x80\xb5DNm\u0189?\x17\r~\xe4\"\xf8\x9c\x80-1({\x96q\xe8\x1c\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xd8K\x92/xA\xfcWt\xf0\x0e\x14`J\xe0\xdfB\xc8U\x1e\x89\xd9o\u0390\u03eb\xcc\x00\x00\u07d4\xd8U\xb0<\xcb\x02\x9awG\xb1\xf0s\x03\xe0\xa6dy59\u0209lk\x93[\x8b\xbd@\x00\x00\u07d4\xd8_\u07af*a\xf9]\xb9\x02\xf9\xb5\xa5<\x9b\x8f\x92f\u00ec\x89l\xf6Z~\x90G(\x00\x00\u07d4\xd8q^\xf9\x17o\x85\v.0\xeb\x8e8'\a\xf7w\xa6\xfb\xe9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd8t\xb9\u07eeEj\x92\x9b\xa3\xb1\xa2~W,\x9b,\xec\u07f3\x89\t79SM(h\x00\x00\u07d4\u0613\n9\xc7sW\xc3\n\u04e0`\xf0\v\x06\x04c1\xfdb\x89,s\xc97t,P\x00\x00\u07d4\u061b\xc2q\xb2{\xa3\xabib\xc9JU\x90\x06\xae8\xd5\xf5j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0637}\xb9\xb8\x1b\xbe\x90B{b\xf7\x02\xb2\x01\xff\u009f\xf6\x18\x892m\x1eC\x96\xd4\\\x00\x00\u07d4\xd8\xcdd\xe0(N\xecS\xaaF9\xaf\xc4u\b\x10\xb9\u007f\xabV\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd8\xd6C\x84$\x9bwg\x94\x06;V\x98x\xd5\xe3\xb50\xa4\xb2\x89\t\xa0C\u0432\xf9V\x80\x00\u07d4\xd8\xd6T \xc1\x8c#'\xccZ\xf9t%\xf8W\xe4\xa9\xfdQ\xb3\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xd8\xe5\xc9g^\xf4\xde\xed&k\x86\x95o\xc4Y\x0e\xa7\u0522}\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd8\xe8GB\x92\xe7\xa0Q`L\xa1d\xc0pw\x83\xbb(\x85\xe8\x8a\x02\xd4\xca\x05\xe2\xb4<\xa8\x00\x00\u07d4\xd8\xebxP>\xc3\x1aT\xa9\x016x\x1a\xe1\t\x00Lt2W\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd8\xee\xf4\xcfK\xeb\x01\xee \xd1\x11t\x8ba\xcbM?d\x1a\x01\x89\x94\x89#z\u06daP\x00\x00\u07d4\xd8\xf4\xba\xe6\xf8M\x91\rm}Z\xc9\x14\xb1\xe6\x83r\xf9A5\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xd8\xf6 6\xf0;v5\xb8X\xf1\x10?\x8a\x1d\x90\x19\xa8\x92\xb6\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xd8\xf6e\xfd\x8c\xd5\u00bc\xc6\xdd\xc0\xa8\xaeR\x1eM\u01aa``\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xd8\xf9$\fU\xcf\xf05RB\x80\xc0\x9e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd8\xfe\b\x8f\xff\u0394\x8fQ7\xee#\xb0\x1d\x95\x9e\x84\xacB#\x89\f[T\xa9O\xc0\x17\x00\x00\u07d4\xd9\x0f0\t\xdbC~N\x11\u01c0\xbe\u0209os\x8de\xef\r\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd9\x10;\xb6\xb6zU\xa7\xfe\xce-\x1a\xf6-E|!x\x94m\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd9\x13\xf0w\x19Iu\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xd9D\u0226\x9f\xf2\xca\x12Ii\f\x12)\xc7\x19/6%\x10b\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xd9JW\x88*Rs\x9b\xbe*\x06G\xc8\f$\xf5\x8a+O\x1c\x89H\xb5N*\xdb\xe1+\x00\x00\xe0\x94\xd9SB\x95<\x8a!\xe8\xb65\xee\xfa\u01c1\x9b\xea0\xf1pG\x8a\x13\xf0l\u007f\xfe\xf0]@\x00\x00\u07d4\xd9\\\x90\xff\xbeT\x84\x86G\x80\xb8gIJ\x83\u0212V\xd6\xe4\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4\xd9g\x11T\x0e.\x99\x83C\xd4\xf5\x90\xb6\xfc\x8f\xac;\xb8\xb3\x1d\x89_Z@h\xb7\x1c\xb0\x00\x00\u07d4\xd9j\xc2Pt\t\u01e3\x83\xab.\xee\x18\"\xa5\xd78\xb3kV\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd9m\xb3;{Z\x95\f>\xfa-\xc3\x1b\x10\xba\x10\xa52\uf1c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd9wYe\xb7\x16Gfu\xa8\xd5\x13\xeb\x14\xbb\xf7\xb0|\xd1J\x8a\x01\x13.m-#\xc5\xe4\x00\x00\u07d4\xd9{\xc8J\xbdG\xc0[\xbfE{.\xf6Y\xd6\x1c\xa5\xe5\u43c9\x06\x9d\x17\x11\x9d\u0168\x00\x00\u07d4\xd9\u007fE&\u07a9\xb1c\xf8\xe8\xe3:k\u03d2\xfb\x90}\xe6\xec\x89\x0feJ\xafM\xb2\xf0\x00\x00\u07d4\xd9\u007f\xe6\xf5?*X\xf6\xd7mu*\xdft\xa8\xa2\xc1\x8e\x90t\x89\x10\xcd\xf9\xb6\x9aCW\x00\x00\u07d4\u0659\x99\xa2I\r\x94\x94\xa50\xca\xe4\xda\xf3\x85T\xf4\xddc>\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4\u065d\xf7B\x1b\x93\x82\xe4,\x89\xb0\x06\xc7\xf0\x87p*\aW\xc0\x89\x1a\x05V\x90\xd9\u06c0\x00\x00\xe0\x94\u0677\x83\xd3\x1d2\xad\xc5\x0f\xa3\xea\u02a1]\x92\xb5h\xea\xebG\x8a\a3\xaf\x907L\x1b(\x00\x00\u07d4\xd9\xd3p\xfe\xc65v\xab\x15\xb3\x18\xbf\x9eX6M\u00a3U*\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xd9\xd4/\xd1>\xbdK\xf6\x9c\xac^\x9c~\x82H:\xb4m\xd7\xe9\x8a\x01!\xeah\xc1\x14\xe5\x10\x00\x00\u07d4\xd9\xe2~\xb0}\xfcq\xa7\x06\x06\f\u007f\a\x928\u0293\xe8\x859\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd9\xe3\x85~\xfd\x1e *D\x17p\xa7w\xa4\x9d\xccE\xe2\xe0\u04c9\f\x1d\xaf\x81\u0623\xce\x00\x00\u07d4\xd9\xec.\xfe\x99\xff\\\xf0\r\x03\xa81{\x92\xa2J\xefD\x1f~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd9\xec\x8f\xe6\x9bw\x16\xc0\x86Z\xf8\x88\xa1\x1b+\x12\xf7 \xed3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd9\xf1\xb2d\b\xf0\xecg\xad\x1d\ro\xe2.\x85\x15\xe1t\x06$\x89\x01M\x11 \u05f1`\x00\x00\u07d4\xd9\xf5G\xf2\xc1\xde\x0e\u064aS\xd1a\xdfWc]\xd2\x1a\x00\xbd\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4\xd9\xff\x11]\x01&l\x9fs\xb0c\xc1\xc28\xef5e\xe6;6\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4\xda\x06\x04N)#&\xffil\x0091h\xceF\xff\xac9\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xda*\x14\xf9r@\x15\u05d0\x14\xed\x8eY\th\x1dYaH\xf1\x89\x02\xa1\x0f\x0f\x8a\x91\xab\x80\x00\u07d4\xda*\u054ew\xde\xdd\xed\xe2\x18vF\xc4e\x94Z\x8d\xc3\xf6A\x89#\xc7W\a+\x8d\xd0\x00\x00\u07d4\xda0\x17\xc1P\xdd\r\xce\u007f\u03c8\x1b\nH\xd0\xd1\xc7V\xc4\u01c9\x05k\xf9\x1b\x1ae\xeb\x00\x00\u07d4\xda4\xb2\xea\xe3\v\xaf\xe8\xda\xec\xcd\xe8\x19\xa7\x94\u0349\xe0\x95I\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xdaJ_U\u007f;\xab9\n\x92\xf4\x9b\x9b\x90\n\xf3\fF\xae\x80\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xdaPU7S\u007f\xfb3\xc4\x15\xfe\xc6Ni\xba\xe0\x90\xc5\xf6\x0f\x89\b\xacr0H\x9e\x80\x00\x00\u07d4\xdai\x8dd\xc6\\\u007f+,rS\x05\x9c\xd3\u0441\u0619\xb6\xb7\x89\x10\x04\xe2\xe4_\xb7\xee\x00\x00\u07d4\xdaw2\xf0/.'.\xaf(\u07d7.\xcc\r\xde\xed\x9c\xf4\x98\x89\v \xbf\xbfig\x89\x00\x00\u07d4\xdaz\xd0%\xeb\xde%\xd2\"C\u02c3\x0e\xa1\xd3\xf6JVc#\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\u0685]SG\u007fP^\xc4\xc8\xd5\u8ed1\x80\u04c6\x81\x11\x9c\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\u0687^N/<\xab\xe4\xf3~\x0e\xae\xd7\xd1\xf6\xdc\xc6\xff\xefC\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u068b\xbe\xe1\x82\xe4U\xd2\t\x8a\xcb3\x8amE\xb4\xb1~\u0636\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0698.\x96C\xff\xec\xe7#\aZ@\xfewnZ\xce\x04\xb2\x9b\x89\b\xb8\xb6\u0259\x9b\xf2\x00\x00\u07d4\u069fUF\tF\u05ff\xb5p\xdd\xecu|\xa5w;XB\x9a\x89\x1b\x84]v\x9e\xb4H\x00\x00\u07d4\u06a1\xbdz\x91H\xfb\x86\\\xd6\x12\xdd5\xf1b\x86\x1d\x0f;\u0709\xa68\xabr\xd9,\x13\x80\x00\xe0\x94\u06a6<\xbd\xa4]\u0507\xa3\xf1\xcdJtj\x01\xbb^\x06\v\x90\x8a\x01\x04\x16\u0670*\x89$\x00\x00\u07d4\u06a7v\xa6uDi\u05f9&z\x89\xb8g%\xe7@\xda\x0f\xa0\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u06ac\x91\xc1\xe8Y\xd5\xe5~\xd3\bKP \x0f\x97f\xe2\xc5+\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u06ac\xda\xf4\"&\xd1\\\xb1\u03d8\xfa\x15\x04\x8c\u007fL\xee\xfei\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\u06b6\xbc\u06c3\xcf$\xa0\xae\x1c\xb2\x1b;[\x83\xc2\xf3\x82I'\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\u06bb\b\x89\xfc\x04)&\xb0^\xf5{% \x91\n\xbcKAI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u06bc\"PB\xa6Y,\xfa\x13\xeb\xe5N\xfaA\x04\bx\xa5\xa2\x89\x0e\x11\xfa\xd5\xd8\\\xa3\x00\x00\u07d4\xda\xc0\xc1w\xf1\x1c\\>>x\xf2\xef\xd6c\xd12!H\x85t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xda\xd16\xb8\x81x\xb4\x83zlx\x0f\xeb\xa2&\xb9\x85i\xa9L\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xda\xdb\xfa\xfd\x8bb\xb9*$\xef\xd7RV\u0743\xab\xdb\u05fb\u06c9\x01\x11du\x9f\xfb2\x00\x00\u07d4\xda\xdc\x00\xaby'`\xaa4\x15i\xfa\x9f\xf5\x98&\x84\x85JJ2\x8an\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xda\xe7 \x1e\xab\x8c\x063\x02\x93\ri9)\xd0\u007f\x95\xe7\x19b\x89\x91\xae\xc0(\xb4\x19\x81\x00\x00\u07d4\xda\xed\u052d\x10{'\x1e\x89Hl\xbf\x80\xeb\xd6!\u0757Ex\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb\x04\xfa\xd9\u011f\x9e\x88\v\xeb\x8f\xcf\x1d:8\x90\u4cc4o\x89CZ\xe6\xcc\fX\xe5\x00\x00\u07d4\xdb\f\u01cft\u0642{\u070ads'n\xb8O\u0717b\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb\x12\x93\xa5\x06\xe9\f\xad*Y\xe1\xb8V\x1f^f\x96\x1ag\x88\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb\x19\xa3\x98\"06\x8f\x01w!\x9c\xb1\f\xb2Y\u0372%|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb#\xa6\xfe\xf1\xaf{X\x1ew,\xf9\x18\x82\u07b2Qo\xc0\xa7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdb$O\x97\xd9\xc4K\x15\x8a@\xed\x96\x06\xd9\xf7\xbd8\x9131\x89\x05\x87\x88\u02d4\xb1\xd8\x00\x00\u07d4\xdb(\x8f\x80\xff\xe22\u00baG\u0314\xc7c\xcfo\u0278+\r\x89\x04\x9b\x9c\xa9\xa6\x944\x00\x00\u07d4\xdb*\f\x9a\xb6M\xf5\x8d\u07f1\u06ec\xf8\xba\r\x89\xc8[1\xb4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdb4t^\u0785v\xb4\x99\xdb\x01\xbe\xb7\xc1\xec\u0685\xcfJ\xbe\x89\x04V9\x18$O@\x00\x00\u07d4\xdb?%\x8a\xb2\xa3\xc2\xcf3\x9cD\x99\xf7ZK\xd1\xd3G.\x9e\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\xdbK\xc8;\x0ek\xaa\xdb\x11V\xc5\xcf\x06\xe0\xf7!\x80\x8cR\u01c9/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xdbc\x12-\xe7\x03}\xa4\x97\x151\xfa\u9bc5\x86x\x86\u0192\x89\x0f\x04%\xb0d\x1f4\x00\x00\u07d4\xdbl*s\xda\xc7BJ\xb0\xd01\xb6ga\x12%f\xc0\x10C\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xdbnV\f\x9b\xc6 \u053e\xa3\xa9MG\xf7\x88\v\xf4\u007f-_\x89\x04\xda\x0f\xdf\xcf\x05v\x00\x00\u07d4\xdbo\xf7\x1b=\xb0\x92\x8f\x83\x9e\x05\xa72;\xfbW\u049c\x87\xaa\x891T\xc9r\x9d\x05x\x00\x00\u07d4\xdbsF\vY\xd8\xe8PE\xd5\xe7R\xe6%Y\x87^BP.\x8963\x03\"\xd5#\x8c\x00\x00\u07d4\xdbw\xb8\x8d\xcbq/\xd1~\xe9\x1a[\x94t\x8dr\f\x90\xa9\x94\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb}@7\b\x1fle\xf9Gk\x06\x87\xd9\u007f\x1e\x04M\n\x1d\x89#\xc7W\a+\x8d\xd0\x00\x00\xe0\x94\u06c8.\xac\xed\xd0\xef\xf2cQ\x1b1*\u06fcY\u01b8\xb2[\x8a\x01\xedO\xdez\"6\xb0\x00\x00\u07d4\u06d3q\xb3\fL\x84NY\xe0>\x92K\xe6\x06\xa98\xd1\xd3\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u06e4ym\f\xebM:\x83k\x84\xc9o\x91\n\xfc\x10?[\xa0\x89\t\b\xf4\x93\xf77A\x00\x00\u07d4\u06ed\xc6\x1e\xd5\xf0F\n\u007f\x18\xe5\x1b/\xb2aM\x92d\xa0\xe0\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\u06f6\xacH@'\x04\x16B\xbb\xfd\x8d\x80\xf9\xd0\xc1\xcf3\xc1\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u06fc\xbby\xbfG\x9aB\xadq\xdb\u02b7{Z\u07ea\x87,X\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\xdb\xc1\xce\x0eI\xb1\xa7\x05\xd2. 7\xae\xc8x\xee\ru\xc7\x03\x89\r\x8drkqw\xa8\x00\x00\u07d4\xdb\xc1\xd0\xee+\xabS\x11@\xde\x13w\"\xcd6\xbd\xb4\xe4q\x94\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdb\u015e\u0609s\u07ad1\b\x84\":\xf4\x97c\xc0P0\xf1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794\xdb\xc6ie\xe4&\xff\x1a\xc8z\xd6\xebx\xc1\xd9Rq\x15\x8f\x9f\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xdb\xcb\xcdzW\ua7724\x9b\x87\x8a\xf3K\x1a\xd6B\xa7\xf1\u0449\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdb\xd5\x1c\xdf,;\xfa\xcd\xff\x10b!\xde.\x19\xadmB\x04\x14\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xdb\xd7\x1e\xfaK\x93\u0209\xe7e\x93\xde`\x9c;\x04\u02ef\xbe\b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xdb\xf5\xf0a\xa0\xf4\x8e^ia\x879\xa7}.\xc1\x97h\xd2\x01\x89\b=lz\xabc`\x00\x00\u07d4\xdb\xf8\xb19g\xf5Q%'-\xe0V%6\xc4P\xbaVU\xa0\x89n\xf5x\xf0n\f\xcb\x00\x00\u07d4\xdb\xfb\x1b\xb4d\xb8\xa5\x8eP\r.\xd8\u0797,E\xf5\xf1\xc0\xfb\x89V\xbcu\xe2\xd61\x00\x00\x00\xe0\x94\xdc\x06~\xd3\xe1-q\x1e\xd4u\xf5\x15n\xf7\xe7\x1a\x80\xd94\xb9\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xdc\b\u007f\x93\x90\xfb\x9e\x97j\xc2:\xb6\x89TJ\tB\xec !\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xdc\x1e\xb9\xb6\xe6CQ\xf5d$P\x96E\xf8>y\xee\xe7l\xf4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdc\x1f\x19ya_\b!@\xb8\xbbx\xc6{'\xa1\x94'\x13\xb1\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xdc#\xb2`\xfc\xc2n}\x10\xf4\xbd\x04J\xf7\x94W\x94`\xd9\u0689\x1b\x1bk\u05efd\xc7\x00\x00\u07d4\xdc)\x11\x97E\xd23s \xdaQ\xe1\x91\x00\xc9H\u0640\xb9\x15\x89\b\xacr0H\x9e\x80\x00\x00\u07d4\xdc-\x15\xa6\x9fk\xb3;$j\xef@E\aQ\xc2\xf6uj\u0489l4\x10\x80\xbd\x1f\xb0\x00\x00\u07d4\xdc=\xaeY\xed\x0f\xe1\x8bXQ\x1eo\xe2\xfbi\xb2\x19h\x94#\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xdc?\x0evr\xf7\x1f\xe7R[\xa3\v\x97U\x18: \xb9\x16j\x8a\x02\b\x9c\xf5{[>\x96\x80\x00\xe0\x94\xdcCE\u0581.\x87\n\xe9\fV\x8cg\xd2\xc5g\u03f4\xf0<\x8a\x01k5-\xa5\xe0\xed0\x00\x00\u07d4\xdcD'[\x17\x15\xba\xea\x1b\x03EsZ)\xacB\xc9\xf5\x1bO\x89?\x19\xbe\xb8\xdd\x1a\xb0\x00\x00\u07d4\xdcF\xc13%\u034e\xdf\x020\xd0h\x89d\x86\xf0\a\xbfN\xf1\x89Hz\x9a0E9D\x00\x00\u07d4\xdcQ\xb2\u071d$z\x1d\x0e[\xc3l\xa3\x15oz\xf2\x1f\xf9\xf6\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xdcS\x05\xb4\x02\n\x06\xb4\x9de||\xa3L5\xc9\x1c_,V\x8a\x01}\xf6\xc1\r\xbe\xba\x97\x00\x00\u07d4\xdcW4[8\xe0\xf0g\u0263\x1d\x9d\xea\xc5'Z\x10\x94\x93!\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdcWG}\xaf\xa4/p\\\u007f\xe4\x0e\xae\x9c\x81un\x02%\xf1\x89\x1b\x1b\x81(\xa7An\x00\x00\u07d4\xdc_Z\xd6c\xa6\xf2c2}d\xca\xc9\xcb\x13=,\x96\x05\x97\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdcp:_7\x94\xc8Ml\xb3TI\x18\xca\xe1J5\u00fdO\x89dI\xe8NG\xa8\xa8\x00\x00\xe0\x94\xdcs\x8f\xb2\x17\u03ad/iYL\b\x17\r\xe1\xaf\x10\xc4\x19\xe3\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xdcv\xe8[\xa5\v\x9b1\xec\x1e& \xbc\xe6\xe7\xc8\x05\x8c\x0e\xaf\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u0703\xb6\xfd\rQ!1 G\a\xea\xf7.\xa0\xc8\u027e\xf9v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u070c)\x12\xf0\x84\xa6\u0444\xaasc\x85\x13\u033c2n\x01\x02\x89F3\xbc6\xcb\xc2\xdc\x00\x00\u07d4\u0711\x1c\xf7\xdc]\u04016Vg\x05(\xe93\x8eg\x03G\x86\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0730;\xfal\x111#NV\xb7\xea|Or\x14\x87Tkz\x89Hz\x9a0E9D\x00\x00\xe0\x94\u0736M\xf47X\xc7\u03d7O\xa6`HO\xbbq\x8f\x8cg\xc1\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xdc\xc5-\x8f\x8d\x9f\xc7B\xa8\xb8'g\xf0US\x87\xc5c\xef\xff\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xdc\xcb7\x0e\u058a\xa9\"(0C\xef|\xad\x1b\x9d@?\xc3J\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdc\u0324 E\xec>\x16P\x8b`?\xd96\xe7\xfd}\xe5\xf3j\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xdc\xd1\fU\xbb\x85OuD4\xf1!\x9c,\x9a\x98\xac\xe7\x9f\x03\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xdc\u057c\xa2\x00S\x95\xb6u\xfd\xe5\x03VY\xb2k\xfe\xfcI\xee\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xdc\u06fdN&\x04\xe4\x0e\x17\x10\xccg0(\x9d\xcc\xfa\u04c9-\x89\xf9]\xd2\xec'\xcc\xe0\x00\x00\u07d4\xdc\xe3\f1\xf3\xcafr\x1e\xcb!<\x80\x9a\xabV\x1d\x9bR\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdc\xf39eS\x13\x80\x161h\xfc\x11\xf6~\x89\xc6\xf1\xbc\x17\x8a\x89\x12'v\x854\x06\xb0\x80\x00\u07d4\xdc\xf6\xb6W&n\x91\xa4\xda\xe6\x03=\xda\xc1S2\u074d+4\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xdc\xf9q\x9b\xe8|oFum\xb4\x89\x1d\xb9\xb6\x11\xd2F\x9cP\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xdc\xff\xf3\xe8\xd2<*4\xb5k\u0473\xbdE\u01d3tC\"9\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xdd\x04\xee\xe7N\v\xf3\f?\x8dl,\u007fR\xe0Q\x92\x10\u07d3\x89\x04V9\x18$O@\x00\x00\xe0\x94\xdd&\xb4)\xfdC\xd8N\xc1y\x82S$\xba\u057f\xb9\x16\xb3`\x8a\x01\x16\xbf\x95\xbc\x842\x98\x00\x00\u07d4\xdd*#:\xde\xdef\xfe\x11&\xd6\xc1h#\xb6*\x02\x1f\xed\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xdd+\u07e9\x17\xc1\xf3\x10\xe6\xfa5\xaa\x8a\xf1i9\xc23\xcd}\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xdd5\xcf\xdb\u02d93\x95Sz\xec\xc9\xf5\x90\x85\xa8\xd5\u0776\xf5\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xddG\x18\x9a>d9qg\xf0b\x0eHEe\xb7b\xbf\xbb\xf4\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4\xddM\xd6\xd3`3\xb0co\u030d\t8`\x9fM\xd6OJ\x86\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xddO_\xa2\x11\x1d\xb6\x8fk\xde5\x89\xb60)9[i\xa9-\x89\b\x96=\xd8\xc2\xc5\xe0\x00\x00\xe0\x94\xddc\x04/%\xed2\x88J\xd2n:\xd9Y\xeb\x94\xea6\xbfg\x8a\x04\x84\xd7\xfd\xe7\u0553\xf0\x00\x00\u07d4\xdde\xf6\xe1qc\xb5\xd2\x03d\x1fQ\xcc{$\xb0\x0f\x02\xc8\xfb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xddl\x06!\x93\xea\xc2=/\xdb\xf9\x97\xd5\x06:4k\xb3\xb4p\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xdd{\u0366Y$\xaa\xa4\x9b\x80\x98J\xe1su\x02X\xb9(G\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xdd\u007f\xf4A\xbao\xfe6q\xf3\xc0\u06bb\xff\x18#\xa5\x043p\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0742T\x12\x1an\x94/\xc9\b(\xf2C\x1fQ\x1d\xad\u007f2\u6263\x9b)\xe1\xf3`\xe8\x00\x00\xe0\x94\u074a\xf9\xe7vR#\xf4DoD\xd3\xd5\t\x81\x9a==\xb4\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\u0755\xdb\xe3\x0f\x1f\x18w\xc5\xddv\x84\xae\xef0*\xb6\x88Q\x92\x8a\x01\xc5\xd8\xd6\xeb>2P\x00\x00\xe0\x94\u0756|L_\x8a\xe4~&o\xb4\x16\xaa\u0456N\xe3\xe7\xe8\u00ca\x01\xa4 \xdb\x02\xbd}X\x00\x00\u07d4\u075bHZ;\x1c\xd3:j\x9cb\xf1\xe5\xbe\xe9'\x01\x85m%\x89\f3\x83\xed\x03\x1b~\x80\x00\xe0\x94\u0763q\xe6\x00\xd3\x06\x88\xd4q\x0e\b\x8e\x02\xfd\xf2\xb9RM_\x8a\x01w\"J\xa8D\xc7 \x00\x00\u07d4\u0764\xed*X\xa8\xdd \xa72u4{X\rq\xb9[\xf9\x9a\x89\x15\xa1<\xc2\x01\xe4\xdc\x00\x00\xe0\x94\u0764\xff}\xe4\x91\u0187\xdfEt\xdd\x1b\x17\xff\x8f$k\xa3\u044a\x04&\x84\xa4\x1a\xbf\xd8@\x00\x00\u07d4\u076bkQ\xa9\x03\v@\xfb\x95\xcf\vt\x8a\x05\x9c$\x17\xbe\u01c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u076bu\xfb/\xf9\xfe\u02c8\xf8\x94vh\x8e+\x00\xe3g\xeb\xf9\x8a\x04\x1b\xad\x15^e\x12 \x00\x00\xe0\x94\u076b\xf1<<\x8e\xa4\xe3\xd7=x\xecqz\xfa\xfaC\x0eTy\x8a\b\xcf#\xf9\t\xc0\xfa\x00\x00\x00\u07d4\u076c1*\x96UBj\x9c\f\x9e\xfa?\xd8%Y\xefE\x05\xbf\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\u076ck\xf4\xbb\xdd}Y}\x9chm\x06\x95Y;\xed\xcc\xc7\xfa\x89.\xe4IU\b\x98\xe4\x00\x00\xe0\x94\u077d+\x93,v;\xa5\xb1\xb7\xae;6.\xac>\x8d@\x12\x1a\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u077d\xdd\x1b\xbd8\xff\xad\xe00]0\xf0 (\xd9.\x9f:\xa8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u077e\xe6\xf0\x94\xea\xe64 \xb0\x03\xfbGW\x14*\xeal\xd0\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdd\u059c[\x9b\xf5\xebZ9\xce\xe7\xc34\x1a\x12\r\x97?\xdb4\x89k\xc1K\x8f\x8e\x1b5\x00\x00\xe0\x94\xdd\xdd{\x9en\xab@\x9b\x92&:\xc2r\u0680\x1bfO\x8aW\x8ai\xe1\r\xe7fv\u0400\x00\x00\u07d4\xdd\xe6p\xd0\x169fuv\xa2-\xd0]2F\xd6\x1f\x06\xe0\x83\x89\x01s\x17\x90SM\xf2\x00\x00\xe0\x94\xdd\xe7zG@\xba\b\xe7\xf7?\xbe:\x16t\x91)1t.\xeb\x8a\x044\xfeMC\x82\xf1\u0500\x00\u07d4\xdd\xe8\xf0\xc3\x1bt\x15Q\x1d\xce\xd1\xcd}F2>K\xd1\"2\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\xdd\xe9i\xae\xf3N\xa8z\u0099\xb7Y~)+J\x01U\u030a\x89\x102\xf2YJ\x01s\x80\x00\u07d4\xdd\xf0\xcc\xe1\xfe\x99m\x91v5\xf0\a\x12\xf4\x05 \x91\xdf\xf9\xea\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xdd\xf3\xadv58\x10\xbej\x89\xd71\xb7\x87\xf6\xf1q\x88a+\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xdd\xf5\x81\n\x0e\xb2\xfb.22;\xb2\u0255\t\xab2\x0f$\xac\x8a\x03\xca\\f\u067cD0\x00\x00\xe0\x94\xdd\xf9\\\x1e\x99\xce/\x9fV\x98\x05|\x19\xd5\xc9@'\xeeJn\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794\xdd\xfa\xfd\xbc|\x90\xf12\x0eT\xb9\x8f7F\x17\xfb\xd0\x1d\x10\x9f\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xdd\xfc\xca\x13\xf94\xf0\u03fe#\x1d\xa109\xd7\x04u\xe6\xa1\u040968\"\x16`\xa5\xaa\x80\x00\u07d4\xde\x02~\xfb\xb3\x85\x03\"n\xd8q\t\x9c\xb3\v\xdb\x02\xaf\x135\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xde\x06\xd5\xeawzN\xb1G^`]\xbc\xbfCDN\x807\xea\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xde\a\xfb[zFN;\xa7\xfb\xe0\x9e\x9a\xcb'\x1a\xf53\x8cX\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xde\x11!\x82\x9c\x9a\b(@\x87\xa4?\xbd/\xc1\x14*23\xb4\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xde\x17kR\x84\xbc\xee:\x83\x8b\xa2Og\xfc|\xbfg\u05ce\xf6\x89\x02\t\xce\b\xc9b\xb0\x00\x00\u07d4\xde!\"\x93\xf8\xf1\xd21\xfa\x10\xe6\tG\rQ,\xb8\xff\xc5\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xde0\xe4\x9eZ\xb3\x13!M/\x01\u072b\u0389@\xb8\x1b\x1cv\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xde3\xd7\b\xa3\xb8\x9e\x90\x9e\xafe;0\xfd\u00e5\xd5\u0334\xb3\x89\t\x9c\x88\"\x9f\xd4\xc2\x00\x00\u07d4\xde7B\x99\xc1\xd0}ySs\x85\x19\x0fD.\xf9\xca$\x06\x1f\x89\a?u\u0460\x85\xba\x00\x00\u07d4\xdeB\xfc\xd2L\xe4#\x93\x830CgY_\x06\x8f\fa\a@\x89\x02r*p\xf1\xa9\xa0\x00\x00\u07d4\xdeP\x86\x8e\xb7\xe3\xc7\x197\xecs\xfa\x89\u074b\x9e\xe1\rE\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xdeU\xde\x04X\xf8P\xb3~Mx\xa6A\xdd.\xb2\u074f8\u0389\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xde[\x00_\xe8\u06ae\x8d\x1f\x05\xde>\xda\x04 f\xc6\xc4i\x1c\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4\xdea-\a$\xe8N\xa4\xa7\xfe\xaa=!B\xbd^\xe8-2\x01\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xdem61\x06\xccb8\xd2\xf0\x92\xf0\xf07!6\xd1\xcdP\u018a\x01!\xeah\xc1\x14\xe5\x10\x00\x00\u07d4\xde}\xee\"\x0f\x04W\xa7\x18}V\xc1\xc4\x1f.\xb0\n\xc5`!\x89\"%\xf3\x9c\x85\x05*\x00\x00\u07d4\u0782\u030dJ\x1b\xb1\xd9CC\x92\x96[>\x80\xba\xd3\xc0=O\x89P\x18nu\u0797\xa6\x00\x00\u07d4\u0797\xf43\a\x00\xb4\x8cImC|\x91\xca\x1d\xe9\u0130\x1b\xa4\x89\x9d\xcc\x05\x15\xb5n\f\x00\x00\u07d4\u079e\xffLy\x88\x11\xd9h\xdc\xcbF\r\x9b\x06\x9c\xf3\x02x\xe0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u07b1\xbc4\xd8mJM\xde%\x80\u063e\xaf\aN\xb0\xe1\xa2D\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\u07b2I]j\xca{*j-\x13\x8bn\x1aB\xe2\xdc1\x1f\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\u07b9rTGL\r/Zyp\xdc\xdb/R\xfb\x10\x98\xb8\x96\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u07b9\xa4\x9aC\x870 \xf0u\x91\x85\xe2\v\xbbL\U000c1ecf\x89\vx\xed\xb0\xbf.^\x00\x00\u07d4\u07bb\u0743\x1e\x0f \xaen7\x82R\xde\xcd\xf9/|\xf0\xc6X\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xde\xc3\xee\xc2d\nu,Fn+~~\u616f\xe9\xacA\xf4\x89G\u0257SYk(\x80\x00\u07d4\xde\xc8#s\xad\xe8\xeb\xcf*\xcbo\x8b\xc2AM\u05eb\xb7\rw\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xde\u0221\xa8\x98\xf1\xb8\x95\xd80\x1f\xe6J\xb3\xad]\xe9A\xf6\x89\x89*\xb4\xf6~\x8as\x0f\x80\x00\u07d4\xde\u025e\x97/\xcaqwP\x8c\x8e\x1aG\xac\"\xd7h\xac\xab|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xde\xd8w7\x84\a\xb9Nx\x1cN\xf4\xaf|\xfc[\xc2 \xb5\x16\x89\x141y\xd8i\x11\x02\x00\x00\u07d4\xde\xe9B\xd5\xca\xf5\xfa\xc1\x14!\xd8k\x01\vE\x8e\\9)\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xde\xee&\x89\xfa\x90\x06\xb5\x9c\xf2\x85#}\xe5;:\u007f\xd0\x148\x89\x18ey\xf2\x9e %\x00\x00\u07d4\xde\xfd\xdf\u055b\x8d,\x15N\xec\xf5\xc7\xc1g\xbf\v\xa2\x90]>\x89\x05\x12\xcb^&GB\x00\x00\u07d4\xde\xfe\x91A\xf4pE\x99\x15\x9d{\"=\xe4+\xff\xd8\x04\x96\xb3\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xdf\t\x8f^N=\xff\xa5\x1a\xf27\xbd\xa8e,Os\ud726\x89\x1b6\xa6DJ>\x18\x00\x00\xe0\x94\xdf\r\ba{\xd2R\xa9\x11\u07cb\xd4\x1a9\xb8=\u07c0\x96s\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xdf\x0f\xf1\xf3\xd2z\x8e\xc9\xfb\x8fk\f\xb2T\xa6;\xba\x82$\xa5\x89\xec\xc5 )E\xd0\x02\x00\x00\u07d4\xdf\x1f\xa2\xe2\x0e1\x98^\xbe,\x0f\f\x93\xb5L\x0f\xb6z&K\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdf!\x1c\xd2\x12\x88\xd6\xc5o\xaef\xc3\xffTb]\u0531T'\x89\x87\x86\xcdvN\x1f,\x00\x00\u07d4\xdf#k\xf6\xab\xf4\xf3)7\x95\xbf\f(q\x8f\x93\u3c73k\x89Hz\x9a0E9D\x00\x00\u07d4\xdf1\x02_VI\xd2\xc6\xee\xa4\x1e\u04fd\xd3G\x1ay\x0fu\x9a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xdf7\xc2.`:\xed\xb6\nbrS\xc4}\x8b\xa8f\xf6\xd9r\x8a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4\xdf;r\u017dq\u0501N\x88\xa6#!\xa9=@\x11\xe3W\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdf?W\xb8\xeed4\xd0G\"=\xeft\xb2\x0fc\xf9\xe4\xf9U\x89\r\x94b\xc6\xcbKZ\x00\x00\u07d4\xdfD\xc4\u007f\xc3\x03\xacv\xe7O\x97\x19L\xcag\xb5\xbb<\x02?\x89 \t\xc5\u023fo\xdc\x00\x00\u07d4\xdfG\xa6\x1brSQ\x93\xc5a\xcc\xccu\xc3\xf3\xce\b\x04\xa2\x0e\x89\x15\x93\\\vN=x\x00\x00\u07d4\xdfG\xa8\xef\x95\xf2\xf4\x9f\x8eoX\x18AT\x14]\x11\xf7'\x97\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xdfS\x003F\xd6\\^zdk\xc04\xf2\xb7\xd3/\xcb\xe5j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdfW5:\xaf\xf2\xaa\xdb\n\x04\xf9\x01N\x8d\xa7\x88N\x86X\x9c\x89\bH\x86\xa6nO\xb0\x00\x00\u07d4\xdf`\xf1\x8c\x81*\x11\xedN'v\xe7\xa8\x0e\xcf^S\x05\xb3\u05890\xca\x02O\x98{\x90\x00\x00\u07d4\xdfd\x85\xc4)z\xc1R\xb2\x89\xb1\x9d\xde2\xc7~\xc4\x17\xf4}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xdff\n\x91\u06b9\xf70\xf6\x19\rP\xc89\x05aP\aV\u0289lk\x93[\x8b\xbd@\x00\x00\u07d4\xdfn\xd6\x00jj\xbe\x88n\xd3=\x95\xa4\xde(\xfc\x12\x189'\x891T\xc9r\x9d\x05x\x00\x00\u07d4\u07c5\x10y>\xee\x81\x1c-\xab\x1c\x93\xc6\xf4G?0\xfb\xef[\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u07cdH\xb1\xeb\a\xb3\xc2\x17y\x0el-\xf0M\xc3\x19\xe7\xe8H\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u07e6\xb8\xb8\xad1\x84\xe3W\xda()Q\u05d1a\u03f0\x89\xbc\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\u07ef1\xe6\"\xc0=\x9e\x18\xa0\u0778\xbe`\xfb\xe3\xe6a\xbe\n\x8a\x02\x1e\x17\x1a>\xc9\xf7,\x00\x00\u07d4\u07f1bn\xf4\x8a\x1d}uR\xa5\xe0)\x8f\x1f\xc2:;H-\x89\\\xe8\x95\u0754\x9e\xfa\x00\x00\xe0\x94\u07f4\u052d\xe5/\u0301\x8a\xccz,k\xb2\xb0\x02$e\x8fx\x8a\x01\xa4 \xdb\x02\xbd}X\x00\x00\u07d4\u07fdB2\xc1|@z\x98\r\xb8\u007f\xfb\u036060\xe5\xc4Y\x89\x1d\xfc\u007f\x92I#S\x00\x00\u07d4\xdf\xcb\xdf\tEN\x1a^J@\xd3\xee\xf7\xc5\xcf\x1c\xd3\u0794\x86\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdf\xdb\xce\xc1\x01K\x96\xda!X\xcaQ>\x9c\x8d;\x9a\xf1\xc3\u0409lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xdf\xde\xd2WK'\xd1a:}\x98\xb7\x15\x15\x9b\r\x00\xba\xab(\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xdf\xdfC9P\x8b\x0fnZ\xb1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe0\x06\x04b\xc4\u007f\xf9g\x9b\xae\xf0qY\xca\xe0\x8c)\xf2t\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\r\x15;\x106\x91C\xf9\u007fT\xb8\xd4\xca\"\x9e\xb3\xe8\xf3$\x89\b=lz\xabc`\x00\x00\u07d4\xe0\x12\xdbE8'\xa5\x8e\x16\xc16V\b\xd3n\xd6Xr\x05\a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x15G\xbaB\xfc\xaf\xaf\x93\x93\x8b\xec\xf7i\x9ft)\n\xf7O\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x16\xdc\x13\x8e%\x81[\x90\xbe?\xe9\xee\xe8\xff\xb2\xe1\x05bO\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe0\x18Y\xf2B\xf1\xa0\xec`/\xa8\xa3\xb0\xb5v@\xec\x89\a^\x89\x1e\x16,\x17{\xe5\xcc\x00\x00\xe0\x94\xe0 \xe8cb\xb4\x87u(6\xa6\xde\v\xc0,\xd8\u061a\x8bj\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xe0#\xf0\x9b(\x87a,|\x9c\xf1\x98\x8e::`+3\x94\u0249lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0'\"\x13\xe8\xd2\xfd>\x96\xbdb\x17\xb2KK\xa0\x1bapy\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe0+t\xa4v(\xbe1[\x1fv\xb3\x15\x05J\xd4J\xe9qo\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xe02 \u0197\xbc\u048f&\xef\vt@J\x8b\xeb\x06\xb2\xba{\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xe05/\u07c1\x9b\xa2e\xf1L\x06\xa61\\J\xc1\xfe\x13\x1b.\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe08\x8a\xed\xdd?\xe2\xadV\xf8WH\xe8\x0eq\n4\xb7\xc9.\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe0<\x00\xd0\x03\x88\xec\xbfO&=\n\xc7x\xbbA\xa5z@\u064966\xc9yd6t\x00\x00\u07d4\xe0I \xdcn\xcc\x1dn\xcc\bO\x88\xaa\n\xf5\u06d7\xbf\x89:\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xe0Ir\xa8<\xa4\x11+\xc8q\xc7-J\xe1al/\a(\u06c9\x0e\x81\xc7\u007f)\xa3/\x00\x00\u07d4\xe0O\xf5\xe5\xa7\u2bd9]\x88W\xce\x02\x90\xb5:+\x0e\xda]\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xe0P)\xac\xeb\axg[\xef\x17A\xab,\u0493\x1e\xf7\xc8K\x8a\x01\x0f\r\xba\xe6\x10\tR\x80\x00\u07d4\xe0V\xbf?\xf4\x1c&%o\xefQqf\x12\xb9\u04da\u0799\x9c\x89\x05k\xe7W\xa1.\n\x80\x00\u07d4\xe0a\xa4\xf2\xfcw\xb2\x96\u045a\xda#\x8eI\xa5\u02ce\xcb\xfap\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xe0f>\x8c\xd6g\x92\xa6A\xf5nP\x03f\x01G\x88\x0f\x01\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0f\x8f\xa8,\x14\xd6\xe8\xd9:S\x11>\xf2\x86/\xa8\x15\x81\xbc\x89//9\xfclT\x00\x00\x00\u07d4\xe0i\xc0\x173R\xb1\v\xf6\x83G\x19\xdb[\xed\x01\xad\xf9{\xbc\x89\x01\x064\xf8\xe52;\x00\x00\u07d4\xe0l)\xa8\x15\x17\xe0\u0507\xb6\u007f\xb0\xb6\xaa\xbcOW6\x83\x88\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xe0l\xb6)G\x04\xee\xa7C|/\xc3\xd3\as\xb7\xbf8\x88\x9a\x89\x01\x16\xdc:\x89\x94\xb3\x00\x00\u07d4\xe0q7\xae\r\x11m\x0353\xc4\uad16\xf8\xa9\xfb\tV\x9c\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\xe0v\xdb0\xabHoy\x19N\xbb\xc4]\x8f\xab\x9a\x92B\xf6T\x8a\x01\x06`~4\x94\xba\xa0\x00\x00\u07d4\xe0~\xbb\xc7\xf4\xdaAnB\xc8\xd4\xf8B\xab\xa1b3\xc1%\x80\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x81\xca\x1fH\x82\xdb`C\u0569\x19\a\x03\xfd\xe0\xab;\xf5m\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe0\x83\xd3Hc\xe0\xe1\u007f\x92ky(\xed\xff1~\x99\x8e\x9cK\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe0\x8b\x9a\xbak\xd9\u048b\xc2\x05gy\xd2\xfb\xf0\xf2\x85Z=\x9d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x8b\u009c+H\xb1i\xff+\xdc\x16qLXnl\xb8\\\u03c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe0\x8c`11\x06\xe3\xf93O\xe6\xf7\xe7bM!\x110\xc0w\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xe0\x9ch\xe6\x19\x98\xd9\xc8\x1b\x14\xe4\xee\x80+\xa7\xad\xf6\xd7L\u06c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xe0\x9f\xeauZ\xee\x1aD\xc0\xa8\x9f\x03\xb5\u07b7b\xba3\x00o\x89;\xa2\x89\xbc\x94O\xf7\x00\x00\xe0\x94\xe0\xa2T\xac\t\xb9r[\xeb\xc8\xe4`C\x1d\xd0s.\xbc\xab\xbf\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xe0\xaai6UU\xb7?(#3\xd1\xe3\f\x1b\xbd\a(T\xe8\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xe0\xba\u064e\ue598\xdb\xf6\xd7`\x85\xb7\x92=\xe5uN\x90m\x89\t\r\x97/22<\x00\x00\u07d4\xe0\u012b\x90r\xb4\xe6\xe3eJI\xf8\xa8\xdb\x02jK3\x86\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\u0380\xa4a\xb6H\xa5\x01\xfd\v\x82F\x90\u0206\x8b\x0eM\xe8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe0\xcfi\x8a\x053'\xeb\xd1k}w\x00\t/\xe2\xe8T$F\x89\x05*4\u02f6\x1fW\x80\x00\xe0\x94\xe0\xd21\xe1D\xec\x91\a8l|\x9b\x02\xf1p,\xea\xa4\xf7\x00\x8a\x01\x0f\r\xba\xe6\x10\tR\x80\x00\u07d4\xe0\xd7kqf\xb1\xf3\xa1+@\x91\xee+)\u078c\xaa}\a\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\xe0\xb2\xe2\x9d\xdes\xafu\x98~\xe4Dl\x82\x9a\x18\x9c\x95\xbc\x89\b\x13\xcaV\x90m4\x00\x00\xe0\x94\xe0\xe9xu=\x98/\u007f\x9d\x1d#\x8a\x18\xbdH\x89\xae\xfeE\x1b\x8a\x02\r\u058a\xaf2\x89\x10\x00\x00\u07d4\xe0\xf3r4|\x96\xb5_}C\x06\x03K\xeb\x83&o\xd9\tf\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe0\xf9\x03\xc1\xe4\x8a\xc4!\xabHR\x8f=J&H\b\x0f\xe0C\x897\b\xba\xed=h\x90\x00\x00\u07d4\xe0\xff\v\xd9\x15D9\u0125\xb7#>)\x1d}\x86\x8a\xf5?3\x89\x15y!jQ\xbb\xfb\x00\x00\xe0\x94\xe1\n\xc1\x9cTo\xc2T|a\xc19\xf5\xd1\xf4Zff\u0570\x8a\x01\x02\xdao\xd0\xf7:<\x00\x00\xe0\x94\xe1\fT\x00\x88\x11?\xa6\xec\x00\xb4\xb2\u0202O\x87\x96\xe9n\u010a2\x0fE\t\xab\x1e\xc7\xc0\x00\x00\xe0\x94\xe1\x17:$})\xd8#\x8d\xf0\x92/M\xf2Z\x05\xf2\xafw\u00ca\bx\xc9]V\x0f0G\x80\x00\xe0\x94\xe1 >\xb3\xa7#\xe9\x9c\" \x11|\xa6\xaf\xebf\xfaBOa\x8a\x02\x00\uf49e2V\xfe\x00\x00\xe0\x94\xe11\xf8~\xfc^\xf0~C\xf0\xf2\xf4\xa7G\xb5Q\xd7P\xd9\xe6\x8a\x04<%\xe0\xdc\xc1\xbd\x1c\x00\x00\u07d4\xe13N\x99\x83y\xdf\xe9\x83\x17pby\x1b\x90\xf8\x0e\xe2-\x8d\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe15@\xec\xee\x11\xb2\x12\xe8\xb7u\u070eq\xf3t\xaa\xe9\xb3\xf8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe1;=+\xbf\u073c\x87r\xa23\x15rL\x14%\x16|V\x88\x897\xf3y\x14\x1e\xd0K\x80\x00\u07d4\xe1D=\xbd\x95\xccA#\u007fa:HEi\x88\xa0Oh2\x82\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xe1F\x17\xf6\x02%\x01\xe9~{>-\x886\xaaa\xf0\xff-\xba\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe1I\xb5rl\xafm^\xb5\xbf*\xccA\xd4\xe2\xdc2\x8d\u1089i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\xe1T\xda\xea\xdbTX8\xcb\u01aa\fUu\x19\x02\xf5(h*\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\u07d4\xe1l\xe3Ya\xcdt\xbdY\r\x04\u012dJ\x19\x89\xe0V\x91\u0189\a\xea(2uw\b\x00\x00\u07d4\xe1r\xdf\xc8\xf8\f\xd1\xf8\u03459\xdc&\b \x14\xf5\xa8\xe3\u8262\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xe1w\xe0\xc2\x01\xd35\xba9V\x92\x9cW\x15\x88\xb5\x1cR#\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe1x\x12\xf6l^e\x94\x1e\x18lF\x92+n{/\x0e\xebF\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xe1\x80\u079e\x86\xf5{\xaf\xac\u05d0O\x98&\xb6\xb4\xb2c7\xa3\x89-\x04\x1dpZ,`\x00\x00\xe0\x94\xe1\x92H\x9b\x85\xa9\x82\xc1\x882F\xd9\x15\xb2)\xcb\x13 \u007f8\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xe1\x95\xbb\xc6,{tD\x04\x0e\xb9\x96#\x96Ovg\xb3v\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe2\x06\xfbs$\xe9\u07b7\x9e\x19\x904\x96\u0596\x1b\x9b\xe5f\x03\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xe2\aW\x8e\x1fM\u06cf\xf6\u0546{9X-q\xb9\x81*\u0149\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xe2\b\x81*h@\x98\xf3\xdaN\xfej\xba%bV\xad\xfe?\xe6\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe2\tT\xd0\xf4\x10\x8c\x82\xd4\u0732\x14\x8d&\xbb\xd9$\xf6\xdd$\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xe2\v\xb9\xf3\x96d\x19\xe1K\xbb\xaa\xaag\x89\xe9$\x96\u03e4y\x89\xbb\xd8%\x03\aRv\x00\x00\u07d4\xe2\r\x1b\xcbq(m\xc7\x12\x8a\x9f\xc7\xc6\xed\u007fs8\x92\xee\xf5\x896d\xf8\xe7\xc2J\xf4\x00\x00\u0794\xe2\x19\x12\x15\x98?3\xfd3\xe2,\u0522I\x00T\xdaS\xfd\u0708\xdbD\xe0I\xbb,\x00\x00\u07d4\xe2\x19\x8c\x8c\xa1\xb3\x99\xf7R\x15a\xfdS\x84\xa7\x13/\xbaHk\x897\b\xba\xed=h\x90\x00\x00\xe0\x94\xe2\x1cw\x8e\xf2\xa0\xd7\xf7Q\xea\x8c\aM\x1f\x81\"C\x86>N\x8a\x01\x1f\xc7\x0e,\x8c\x8a\xe1\x80\x00\xe0\x94\xe2)\xe7F\xa8?,\xe2S\xb0\xb0>\xb1G$\x11\xb5~W\x00\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4\xe2+ \xc7x\x94F;\xafwL\xc2V\u057d\u06ff}\xdd\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe20\xfe\x1b\xff\x03\x18m\x02\x19\xf1]LH\x1b}Y\xbe(j\x89\x01\xfdt\x1e\x80\x88\x97\x00\x00\u07d4\xe27\xba\xa4\xdb\u0252n2\xa3\xd8]\x12d@-T\xdb\x01/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe2A\t\xbe/Q=\x87I\x8e\x92j(d\x99uO\x9e\u051e\x890\x0e\xa8\xad\x1f'\xca\x00\x00\u07d4\xe2Fh<\u025d\xb7\u0125+\u02ec\xaa\xb0\xb3/k\xfc\x93\u05c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe2Z\x16{\x03\x1e\x84am\x0f\x01?1\xbd\xa9]\xcccP\xb9\x8a\x02\x8c*\xaa\u0243\xd0]\u0187st\xa8\xf4F\xee\xe9\x89\n\xb6@9\x12\x010\x00\x00\u07d4\xe2\x8b\x06\"Y\xe9n\xeb<\x8dA\x04\x94?\x9e\xb3%\x89<\xf5\x89Hz\x9a0E9D\x00\x00\xe0\x94\u237c\x8e\xfd^Ajv.\xc0\xe0\x18\x86K\xb9\xaa\x83({\x8a\x051\xf2\x00\xab>\x03\n\x80\x00\u07d4\xe2\x90K\x1a\xef\xa0V9\x8bb4\xcb5\x81\x12\x88\xd76\xdbg\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\u274a\xe4R\xdc\xf3\xb6\xacd^c\x04\t8UQ\xfa\xae\n\x89\x04Z\r\xa4\xad\xf5B\x00\x00\u07d4\xe2\xbb\xf8FA\xe3T\x1fl3\xe6\xedh:cZp\xbd\xe2\xec\x89\x1bA<\xfc\xbfY\xb7\x80\x00\u07d4\xe2\xcf6\n\xa22\x9e\xb7\x9d+\xf7\xca\x04\xa2z\x17\xc52\xe4\u0609\x05\x87\x88\u02d4\xb1\xd8\x00\x00\u07d4\xe2\xdf#\xf6\xea\x04\xbe\xcfJ\xb7\x01t\x8d\xc0\x961\x84U\\\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xe2\xe1\\`\xdd8\x1e:K\xe2Pq\xab$\x9aL\\Rd\u0689\u007fk\u011b\x81\xb57\x00\x00\u07d4\xe2\xe2nN\x1d\xcf0\xd0H\xccn\u03ddQ\xec\x12\x05\xa4\xe9&\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xe2\xeei\x1f#~\xe6R\x9beW\xf2\xfc\xdd=\xcf\fY\xecc\x8a\x01'r\x9c\x14h| \x00\x00\u07d4\xe2\xef\xa5\xfc\xa7\x958\xce`h\xbf1\xd2\xc5\x16\xd4\xd5<\b\xe5\x89\a\x1c\xc4\b\xdfc@\x00\x00\xe0\x94\xe2\xef\u0429\xbc@~\xce\x03\xd6~\x8e\xc8\xe9\u0483\xf4\x8d*I\x8a\x02\x99\xb3;\xf9\u0144\xe0\x00\x00\u07d4\xe2\xf4\r5\x8f^?\xe7F>\xc7\x04\x80\xbd.\u04d8\xa7\x06;\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe2\xf98=X\x10\xea{C\x18+\x87\x04\xb6+'\xf5\x92]9\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe2\xff\x9e\xe4\xb6\xec\xc1AA\xcct\xcaR\xa9\xe7\xa2\xee\x14\xd9\b\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\xe3\x02\x12\xb2\x01\x1b\xb5k\xdb\xf1\xbc5i\x0f:N\x0f\xd9\x05\xea\x8a\x01\xb2\u07dd!\x9fW\x98\x00\x00\u07d4\xe3\x03\x16\u007f=I`\xfe\x88\x1b2\x80\n+J\xef\xf1\xb0\x88\u0509lk\x93[\x8b\xbd@\x00\x00\u07d4\xe3\x04\xa3/\x05\xa87btJ\x95B\x97o\xf9\xb7#\xfa1\xea\x89Ur\xf2@\xa3F \x00\x00\u07d4\xe3\bCR\x04y7d\xf5\xfc\xbee\xebQ\x0fZtJeZ\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe3\t\x97L\xe3\x9d`\xaa\xdf.ig2Q\xbf\x0e\x04v\n\x10\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4\xe3\x1bN\xef\x18L$\xab\t\x8e6\xc8\x02qK\xd4t=\xd0\u0509\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe3!\xbbJ\x94j\xda\xfd\xad\xe4W\x1f\xb1\\\x00C\u04de\xe3_\x89Udu8+L\x9e\x00\x00\u07d4\xe3&<\xe8\xafm\xb3\xe4gXE\x02\xedq\t\x12^\xae\"\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe3+\x1cG%\xa1\x87TI\u93d7\x0e\xb3\xe5@b\xd1X\x00\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe3/\x95vmW\xb5\xcdK\x172\x89\u0587o\x9edU\x81\x94\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xe38@\u063c\xa7\u0698\xa6\xf3\u0416\xd8=\xe7\x8bp\xb7\x1e\xf8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe38\xe8Y\xfe.\x8c\x15UHH\xb7\\\xae\u0368w\xa0\xe82\x89a\xac\xff\x81\xa7\x8a\xd4\x00\x00\u07d4\xe3=\x98\x02 \xfa\xb2Y\xafj\x1fK8\xcf\x0e\xf3\xc6\xe2\xea\x1a\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe3=\xf4\u0380\u0336*v\xb1+\xcd\xfc\xec\xc4b\x89\x97:\xa9\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xe3?\xf9\x87T\x1d\xde\\\xde\u0a29m\xcc?3\xc3\xf2L\u008a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xe3A\v\xb7U|\xf9\x1dy\xfai\xd0\xdf\xea\n\xa0u@&Q\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe3Ad-@\u04af\xce.\x91\a\xc6py\xacz&`\bl\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe3TS\xee\xf2\xcc2\x89\x10CR\x8d\t\x84i\x80\x00\xe0\x94\xe5\x10\xd6y\u007f\xba=f\x93\x83Z\x84N\xa2\xadT\x06\x91\x97\x1b\x8a\x03\xae9\xd4s\x83\xe8t\x00\x00\u07d4\xe5\x14!\xf8\xee\"\x10\xc7\x1e\xd8p\xfea\x82v\u0215J\xfb\xe9\x89Hz\x9a0E9D\x00\x00\u07d4\xe5\x1e\xb8~\u007f\xb71\x1fR(\xc4y\xb4\x8e\u0247\x881\xacL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5!V1\xb1BH\xd4Z%R\x96\xbe\xd1\xfb\xfa\x030\xff5\x89G\x03\xe6\xebR\x91\xb8\x00\x00\xe0\x94\xe5(\xa0\xe5\xa2g\xd6g\xe99:e\x84\xe1\x9b4\u071b\xe9s\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\xe54%\xd8\xdf\x1f\x11\xc3A\xffX\xae_\x148\xab\xf1\xcaS\u03c9\x11t\xa5\xcd\xf8\x8b\xc8\x00\x00\u07d4\xe5No\x9c\xffV\xe1\x9cF\x1e\xb4T\xf9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe5A\x02SM\xe8\xf2>\xff\xb0\x93\xb3\x12B\xad;#?\xac\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xe5E\xee\x84\xeaH\xe5d\x16\x1e\x94\x82\u055b\xcf@j`,\xa2\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4\xe5H\x1a\u007f\xedB\xb9\x01\xbb\xed x\x9b\u052d\xe5\r_\x83\xb9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5Y\xb5\xfd3{\x9cUr\xa9\xbf\x9e\x0f%!\xf7\xd4F\xdb\xe4\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe5\\\x80R\n\x1b\x0fu[\x9a,\xd3\xce!Ov%e>\x8a\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe5mC\x13$\xc9)\x11\xa1t\x9d\xf2\x92p\x9c\x14\xb7ze\u034a\x01\xbc\x85\xdc*\x89\xbb \x00\x00\u07d4\xe5})\x95\xb0\xeb\xdf?<\xa6\xc0\x15\xeb\x04&\r\xbb\x98\xb7\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4\u51f1j\xbc\x8at\b\x1e6\x13\xe1CB\xc03u\xbf\bG\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\x89\xfav\x98M\xb5\xec@\x04\xb4n\u8954\x92\xc3\aD\u0389\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xe5\x8d\xd228\xeen\xa7\xc2\x13\x8d8]\xf5\x00\xc3%\xf3v\xbe\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xe5\x95?\xeaIq\x04\xef\x9a\xd2\xd4\xe5\x84\x1c'\x1f\a5\x19\u0089&)\xf6n\fS\x00\x00\x00\xe0\x94\u5587\x97F\x8e\xf7g\x10\x1bv\x1dC\x1f\xce\x14\xab\xff\u06f4\x8a\x01\xb3\xd9i\xfaA\x1c\xa0\x00\x00\u07d4\xe5\x97\xf0\x83\xa4i\xc4Y\x1c=+\x1d,w'\x87\xbe\xfe'\xb2\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xe5\x9b;\xd3\x00\x89?\x97#>\xf9G\xc4or\x17\xe3\x92\xf7\xe9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe5\xa3e4<\xc4\xeb\x1ew\x03h\xe1\xf1\x14Jw\xb82\xd7\xe0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe5\xa3\xd7\xeb\x13\xb1\\\x10\x01w#m\x1b\xeb0\xd1~\xe1T \x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xaa\v\x83;\xb9\x16\xdc\x19\xa8\xddh?\x0e\xde$\x1d\x98\x8e\xba\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\u5def\x14i\x86\xc0\xff\x8f\x85\xd2.l\xc34\a}\x84\xe8$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xb8&\x19l\x0e\x1b\xc1\x11\x9b\x02\x1c\xf6\xd2Y\xa6\x10\u0256p\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe5\xb9o\u026c\x03\xd4H\xc1a:\xc9\x1d\x15\x97\x81E\xdb\xdf\u0449\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\u5e40\u048e\xec\xe2\xc0o\xcal\x94s\x06\x8b7\u0526\xd6\xe9\x89%\xaf\u058c\xac+\x90\x00\x00\u07d4\u5eb4\xf0\xaf\u0629\u0463\x81\xb4Wa\xaa\x18\xf3\xd3\xcc\xe1\x05\x89Q\xbf\xd7\xc18x\xd1\x00\x00\u07d4\xe5\xbc\u020c;%on\xd5\xfeU\x0eJ\x18\x19\x8b\x943V\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xbd\xf3OL\xccH>L\xa50\xcc|\xf2\xbb\x18\xfe\xbe\x92\xb3\x89\x06\xd85\xa1\v\xbc\xd2\x00\x00\u07d4\xe5\u0713I\xcbR\xe1a\x19a\"\u03c7\xa3\x896\xe2\xc5\u007f4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xe38\x00\xa1\xb2\xe9k\xde\x101c\n\x95\x9a\xa0\a\xf2nQ\x89Hz\x9a0E9D\x00\x00\u07d4\xe5\xe3~\x19@\x8f,\xfb\xec\x834\x9d\u0501S\xa4\xa7\x95\xa0\x8f\x89\u3bb5sr@\xa0\x00\x00\u07d4\xe5\xed\xc7>bo]4A\xa4U9\xb5\xf7\xa3\x98\u0153\xed\xf6\x89.\xe4IU\b\x98\xe4\x00\x00\u07d4\xe5\xed\xf8\x12?$\x03\xce\x1a\x02\x99\xbe\xcfz\xactM\a_#\x89\n\xdaUGK\x814\x00\x00\u07d4\xe5\xf8\xefm\x97\x066\xb0\u072aO \x0f\xfd\xc9\xe7Z\xf1t\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xfb1\xa5\xca\xeej\x96\xde9;\xdb\xf8\x9f\xbee\xfe\x12[\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe5\xfb\xe3I\x84\xb67\x19o3\x1cg\x9d\f\fG\xd84\x10\xe1\x89llD\xfeG\xec\x05\x00\x00\u07d4\xe6\tU\xdc\v\xc1V\xf6\xc4\x18I\xf6\xbdwk\xa4K\x0e\xf0\xa1\x89\x10C\x16'\xa0\x93;\x00\x00\u07d4\xe6\nU\xf2\u07d9m\u00ee\xdbil\b\xdd\xe09\xb2d\x1d\xe8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe6\x11[\x13\xf9y_~\x95e\x02\xd5\aEg\u06b9E\xcek\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xe6\x1f(\t\x15\xc7t\xa3\x1d\"<\xf8\f\x06\x92f\xe5\xad\xf1\x9b\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xe6/\x98e\a\x12\xeb\x15\x87S\xd8)r\xb8\u9723\xf6\x18w\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe6/\x9d|d\xe8\xe2cZ\xeb\x88=\xd7;\xa6\x84\xee|\x10y\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xe6>xt\x14\xb9\x04\x84x\xa5\a35\x9e\xcd\xd7\xe3dz\xa6\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xe6FfXr\xe4\v\rz\xa2\xff\x82r\x9c\xaa\xba[\xc3\u8789\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe6N\xf0\x12e\x8dT\xf8\xe8`\x9cN\x90#\xc0\x9f\xe8e\xc8;\x89\x01\x84\x93\xfb\xa6N\xf0\x00\x00\u07d4\xe6On\x1dd\x01\xb5l\akd\xa1\xb0\x86}\v/1\rN\x89\x02\u02edq\xc5:\xe5\x00\x00\u07d4\xe6g\xf6R\xf9W\u008c\x0ef\u04364\x17\xc8\f\x8c\x9d\xb8x\x89 \x9d\x92/RY\xc5\x00\x00\xe0\x94\xe6w\xc3\x1f\xd9\xcbr\x00u\u0724\x9f\x1a\xbc\xcdY\xec3\xf74\x8a\x01\xa6\u05be\xb1\xd4.\xe0\x00\x00\u07d4\xe6|,\x16e\u02038h\x81\x87b\x9fI\xe9\x9b`\xb2\u04fa\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xe6\x9al\xdb:\x8a}\xb8\xe1\xf3\f\x8b\x84\xcds\xba\xe0+\xc0\xf8\x8a\x03\x94\xfd\xc2\xe4R\xf6q\x80\x00\u07d4\xe6\x9d\x1c7\x8bw\x1e\x0f\xef\xf0Q\xdbi\xd9f\xacgy\xf4\xed\x89\x1d\xfaj\xaa\x14\x97\x04\x00\x00\u07d4\xe6\x9f\xcc&\xed\"_{.7\x984\xc5$\xd7\f\x175\u5f09lk\x93[\x8b\xbd@\x00\x00\u07d4\xe6\xa3\x01\x0f\x02\x01\xbc\x94\xffg\xa2\xf6\x99\xdf\xc2\x06\xf9\xe7gB\x89/\xa7\xcb\xf6dd\x98\x00\x00\u07d4\xe6\xa6\xf6\xddop\xa4V\xf4\xec\x15\xefz\xd5\xe5\u06f6\x8b\xd7\u0709\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe6\xb2\x0f\x98\n\xd8S\xad\x04\xcb\xfc\x88|\xe6`\x1ck\xe0\xb2L\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u6cec?]M\xa5\xa8\x85}\v?0\xfcK+i+w\u05c9O%\x91\xf8\x96\xa6P\x00\x00\u07d4\xe6\xb9T_~\u0406\xe5R\x92F9\xf9\xa9\xed\xbb\xd5T\v>\x89\xcb\xd4{n\xaa\x8c\xc0\x00\x00\xe0\x94\xe6\xbc\xd3\n\x8f\xa18\xc5\xd9\xe5\xf6\xc7\xd2\u0680i\x92\x81-\u034a7\x0e\xa0\xd4|\xf6\x1a\x80\x00\x00\u07d4\xe6\xc8\x1f\xfc\xec\xb4~\xcd\xc5\\\vq\xe4\x85_>^\x97\xfc\x1e\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\u07d4\xe6\xcb&\vqmL\n\xb7&\xee\xeb\a\xc8pr\x04\xe2v\xae\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe6\xcb?1$\xc9\xc9\xcc84\xb1'K\xc33dV\xa3\x8b\xac\x89\x17+\x1d\xe0\xa2\x13\xff\x00\x00\xe0\x94\xe6\xd2\"\t\xff\u0438u\t\xad\xe3\xa8\xe2\xefB\x98y\u02c9\xb5\x8a\x03\xa7\xaa\x9e\x18\x99\xca0\x00\x00\u07d4\xe6\u051f\x86\xc2(\xf4sg\xa3^\x88l\xaa\xcb'\x1eS\x94)\x89\x16^\xc0\x9d\xa7\xa1\x98\x00\x00\u07d4\xe6\xe6!\xea\xab\x01\xf2\x0e\xf0\x83k|\xadGFL\xb5\xfd<\x96\x89\x11!\x93B\xaf\xa2K\x00\x00\u07d4\xe6\xe8\x861{jf\xa5\xb4\xf8\x1b\xf1d\xc58\xc2d5\x17e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe6\u98ddu\x0f\xe9\x949N\xb6\x82\x86\xe5\xeab\xa6\x99x\x82\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xe6\xec\\\xf0\u011b\x9c1~\x1epc\x15\uf7b7\xc0\xbf\x11\xa7\x8a\x03\xa4i\xf3F~\x8e\xc0\x00\x00\u07d4\xe6\xf5\xebd\x9a\xfb\x99Y\x9cAK'\xa9\xc9\xc8U5\u007f\xa8x\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\xe6\xfe\n\xfb\x9d\xce\xdd7\xb2\xe2,E\x1b\xa6\xfe\xabg4\x803\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xe7\x10\xdc\u041b\x81\x01\xf9C{\xd9}\xb9\ns\xef\x99=\v\xf4\x89\x14\xee6\xc0Z\xc2R\x00\x00\u07d4\xe7'\xe6~\xf9\x11\xb8\x1fl\xf9\xc7?\xcb\xfe\xbc+\x02\xb5\xbf\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4\xe7.\x1d3\\\u009a\x96\xb9\xb1\xc0/\x00:\x16\xd9q\xe9\v\x9d\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xe71\x1c\x953\xf0\t,rH\xc9s\x9b[,\x86J4\xb1\u0389\x97\xf9}l\xc2m\xfe\x00\x00\u07d4\xe7;\xfe\xad\xa6\xf0\xfd\x01o\xbc\x84>\xbc\xf6\xe3p\xa6[\xe7\f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xe7<\xcfCg%\xc1Q\xe2U\xcc\xf5!\f\xfc\xe5\xa4?\x13\xe3\x89\x01\x15NS!}\xdb\x00\x00\u07d4\xe7B\xb1\xe6\x06\x9a\x8f\xfc'\f\xc6\x1f\xa1d\xac\x15SE\\\x10]\x04\x88~\x14\x89\x06\x96\xd8Y\x00 \xbb\x00\x00\u07d4\xe7\\\x1f\xb1w\b\x9f>X\xb1\x06y5\xa6Yn\xf1s\u007f\xb5\x89\x05j\x87\x9f\xa7uG\x00\x00\u07d4\xe7\\;8\xa5\x8a?3\xd5V\x90\xa5\xa5\x97f\xbe\x18^\x02\x84\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe7a\xd2\u007f\xa3P,\xc7k\xb1\xa6\bt\x0e\x14\x03\u03dd\xfci\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xe7f\xf3O\xf1o<\xfc\xc9s!r\x1fC\xdd\xf5\xa3\x8b\f\xf4\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xe7m\x94Z\xa8\x9d\xf1\xe4W\xaa4+1\x02\x8a^\x910\xb2\u03897\b\xba\xed=h\x90\x00\x00\u07d4\xe7s^\xc7e\x18\xfcj\xa9-\xa8qZ\x9e\xe3\xf6%x\x8f\x13\x89lM\x16\v\xaf\xa1\xb7\x80\x00\xe0\x94\xe7z\x89\xbdE\xdc\x04\xee\xb4\xe4\x1d{Ykp~nQ\xe7L\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xe7}}\uac96\u0234\xfa\a\xca;\xe1\x84\x16=Zm`l\x89\x05\x049\x04\xb6q\x19\x00\x00\u07d4\xe7\u007f\xeb\xab\xdf\b\x0f\x0f]\xca\x1d?Wf\xf2\xa7\x9c\x0f\xfa|\x89K\"\x9d(\xa8Ch\x00\x00\xe0\x94\u7025c\x06\xba\x1ek\xb31\x95,\"S\x9b\x85\x8a\xf9\xf7}\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xe7\x81\xecs-@\x12\x02\xbb\x9b\xd18`\x91\r\xd6\u009a\xc0\xb6\x89C8t\xf62\xcc`\x00\x00\u07d4\xe7\x84\xdc\xc8s\xaa\x8c\x15\x13\xec&\xff6\xbc\x92\xea\xc6\xd4\xc9h\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe7\x91-L\xf4V,W=\xdc[q\xe3s\x10\xe3x\xef\x86\u0249\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xe7\x91\u0545\xb8\x996\xb2])\x8f\x9d5\xf9\xf9\xed\xc2Z)2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe7\x924\x9c\xe9\xf6\xf1O\x81\xd0g@\x96\xbe\xfa\x1f\x92!\xcd\xea\x89[]#J\r\xb48\x80\x00\u07d4\xe7\x96\xfdN\x83\x9bL\x95\xd7Q\x0f\xb7\xc5\xc7+\x83\xc6\xc3\xe3\u01c9\x1b\xc43\xf2?\x83\x14\x00\x00\xe0\x94\xe7\xa4/Y\xfe\xe0t\xe4\xfb\x13\xea\x9eW\xec\xf1\xccH(\"I\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xe7\xa4V\f\x84\xb2\x0e\x0f\xb5LIg\f)\x03\xb0\xa9lB\xa4\x89 j\xea\u01e9\x03\x98\x00\x00\u07d4\xe7\xa8\xe4q\xea\xfby\x8fET\xccnRg0\xfdV\xe6,}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u7f82\xc6Y<\x1e\xed\xdd*\xe0\xb1P\x01\xff \x1a\xb5{/\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4\xe7\u01b5\xfc\x05\xfct\x8e[C\x81rdI\xa1\xc0\xad\x0f\xb0\xf1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe7\xd1u$\xd0\v\xad\x82I|\x0f'\x15jd\u007f\xf5\x1d'\x92\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe7\xd2\x13\x94\u007f\u02d0J\xd78H\v\x1e\xed/\\2\x9f'\xe8\x89\x01\x03\u00f1\xd3\xe9\xc3\x00\x00\u07d4\xe7\xd6$\x06 \xf4,^\u06f2\xed\xe6\xae\xc4=\xa4\xed\x9bWW\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe7\xda`\x9d@\xcd\xe8\x0f\x00\xce[O\xfbj\xa9\u04304\x94\xfc\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe7\xf0oi\x9b\xe3\x1cD\vC\xb4\xdb\x05\x01\xec\x0e%&\x16D\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe7\xf4\xd7\xfeoV\x1f\u007f\xa1\xda0\x05\xfd6TQ\xad\x89\u07c9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe7\xfd\x8f\xd9Y\xae\xd2v~\xa7\xfa\x96\f\xe1\xdbS\xaf\x80%s\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe8\x0e\u007f\xef\x18\xa5\xdb\x15\xb0\x14s\xf3\xadkx\xb2\xa2\xf8\xac\u0649\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe8\x13\u007f\xc1\xb2\xec|\xc7\x10:\xf9!\x89\x9bJ9\xe1\xd9Y\xa1\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\xe8\x1c-4l\n\xdfL\xc5g\b\xf69K\xa6\xc8\u0226J\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe8,X\xc5yC\x1bg5F\xb5:\x86E\x9a\xca\xf1\u079b\x93\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe84\xc6C\x18 \\\xa7\xddJ!\xab\xcb\b&l\xb2\x1f\xf0,\x8965\xc6 G9\u0640\x00\u07d4\xe86\x04\xe4\xffk\xe7\xf9o`\x18\xd3\xec0r\xecR]\xffk\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\xe0\x94\xe8E\xe3\x87\xc4\xcb\u07d8\"\x80\xf6\xaa\x01\xc4\x0eK\xe9X\u0772\x8a\x05K@\xb1\xf8R\xbd\xa0\x00\x00\u07d4\xe8H\xca~\xbf\xf5\xc2O\x9b\x9c1g\x97\xa4;\xf7\xc3V)-\x89\x06.\x11\\\x00\x8a\x88\x00\x00\u07d4\xe8KU\xb5%\xf1\x03\x9etK\x91\x8c\xb33$\x92\xe4^\xcaz\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe8O\x80v\xa0\xf2\x96\x9e\xcd3>\xef\x8d\xe4\x10B\x98b\x91\xf2\x89\x17k4O*x\xc0\x00\x00\u07d4\xe8d\xfe\xc0~\xd1!Je1\x1e\x11\xe3)\xde\x04\r\x04\xf0\xfd\x89Y\u0283\xf5\xc4\x04\x96\x80\x00\u07d4\xe8}\xba\xc66\xa3w!\xdfT\xb0\x8a2\xefIY\xb5\xe4\xff\x82\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe8~\x9b\xbf\xbb\xb7\x1c\x1at\ft\xc7#Bm\xf5]\x06=\u064a\x01\xb1\x92\x8c\x00\u01e68\x00\x00\u07d4\xe8~\xacm`+A\t\xc9g\x1b\xf5{\x95\f,\xfd\xb9\x9dU\x89\x02\xb4\xf2\x19r\xec\xce\x00\x00\xe0\x94\u807b\xbeir-\x81\xef\xec\xaaH\u0455*\x10\xa2\xbf\xac\x8f\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xe8\x92Is\x8b~\xce\xd7\xcbfjf\xe4s\xbcv\x82/U\t\x8d\x89\xb9\x1c\u0149lk\x93[\x8b\xbd@\x00\x00\u07d4\xe8\xc3\u04f0\xe1\u007f\x97\xd1\xe7V\xe6\x84\xf9N\x14p\xf9\x9c\x95\xa1\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xe8\xc3\xf0E\xbb}8\xc9\xd2\U000d5c3a\x84\x92\xb2S#\t\x01\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\u07d4\xe8\xccC\xbcO\x8a\xcf9\xbf\xf0N\xbf\xbfB\xaa\xc0j2\x84p\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe8\xd9B\xd8/\x17^\xcb\x1c\x16\xa4\x05\xb1\x01C\xb3\xf4k\x96:\x89\x1e\xd2\xe8\xffm\x97\x1c\x00\x00\u07d4\xe8\u077e\xd72\xeb\xfeu@\x96\xfd\xe9\bk\x8e\xa4\xa4\xcd\xc6\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe8\xder^\xca]\xef\x80_\xf7\x94\x1d1\xac\x1c.4-\xfe\x95\x89\x85~\ro\x1d\xa7j\x00\x00\u07d4\xe8\xe9\x85\x05\x86\xe9OR\x99\xabIK\xb8!\xa5\xf4\f\x00\xbd\x04\x89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94\xe8\xea\u047b\x90\xcc\u00ee\xa2\xb0\xdc\u0175\x80VUFU\xd1\u054a\x01\xa4\xab\xa2%\xc2\a@\x00\x00\u07d4\xe8\xea\xf1)D\t-\xc3Y\x9b9S\xfa|\xb1\xc9v\x1c\xc2F\x89a\x94\x04\x9f0\xf7 \x00\x00\xe0\x94\xe8\xedQ\xbb\xb3\xac\xe6\x9e\x06\x02K3\xf8hD\xc4sH\u06de\x8a\"\xf9\xea\x89\xf4\xa7\xd6\xc4\x00\x00\u07d4\xe8\xef\x10\r|\xe0\x89X2\xf2g\x8d\xf7-J\u03cc(\xb8\xe3\x89\x1b\x1bk\u05efd\xc7\x00\x00\u07d4\xe8\xf2\x99i\xe7\\e\xe0\x1c\xe3\xd8aT }\n\x9e|v\xf2\x89\xa2/\xa9\xa7:'\x19\x80\x00\u07d4\xe8\xfc6\xb0\x13\x1e\xc1 \xac\x9e\x85\xaf\xc1\f\xe7\vV\u0636\xba\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe9\n5L\xec\x04\u059e]\x96\xdd\xc0\xc5\x13\x8d=3\x15\n\xa0\x89\x1b\x1a}\u03caD\u04c0\x00\xe0\x94\xe9\x13>}1\x84]_+f\xa2a\x87\x92\xe8i1\x1a\xcff\x8a\x05\x17\xc0\xcb\xf9\xa3\x90\x88\x00\x00\u07d4\xe9\x1d\xac\x01\x95\xb1\x9e7\xb5\x9bS\xf7\xc0\x17\xc0\xb29[\xa4L\x89e\xea=\xb7UF`\x00\x00\u07d4\xe9\x1f\xa0\xba\xda\u0779\xa9~\x88\xd3\xf4\xdb|U\u05bbt0\xfe\x89\x14b\fW\xdd\xda\xe0\x00\x00\u07d4\xe9#\xc0aw\xb3B~\xa4H\xc0\xa6\xff\x01\x9bT\xccT\x8d\x95\x89\x01\xf7\x80\x01Fg\xf2\x80\x00\xe0\x94\xe9=G\xa8\u0288]T\fNRo%\xd5\xc6\xf2\xc1\b\u0138\x8a\x17\xda:\x04\u01f3\xe0\x00\x00\x00\u07d4\xe9E\x8fh\xbb',\xb5g:\x04\xf7\x81\xb4\x03Uo\u04e3\x87\x89\x03N\x8b\x88\xce\xe2\xd4\x00\x00\u07d4\xe9IA\xb6\x03`\x19\xb4\x01j0\xc1\x03}Zi\x03\xba\xba\xad\x89*H\xac\xabb\x04\xb0\x00\x00\u07d4\xe9I[\xa5\x84'(\xc0\ud5fe7\xd0\xe4\"\xb9\x8di ,\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe9M\xed\x99\u0735r\xb9\xbb\x1d\u02e3/m\xee\x91\xe0W\x98N\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\xe0\x94\xe9QyR}\uc951l\xa9\xa3\x8f!\\\x1e\x9c\xe77\xb4\u024a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xe9U\x91\x85\xf1f\xfc\x95\x13\xccq\x11aD\xce-\xeb\x0f\x1dK\x8a\x04<3\xc1\x93ud\x80\x00\x00\u0794\xe9^\x92\xbb\xc6\xde\a\xbf:f\x0e\xbf_\xeb\x1c\x8a5'\xe1\u0148\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\xe9e\u06a3@9\xf7\xf0\xdfb7Z7\u5acar\xb3\x01\xe7\x8a\x01\x03\xfd\xde\u0373\xf5p\x00\x00\u07d4\xe9i\xea\x15\x95\xed\xc5\u0127\a\xcf\xde8\t)c2Q\xa2\xb0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe9k\x18N\x1f\x0fT\x92J\xc8t\xf6\v\xbfDptF\xb7+\x89\x9d\xcc\x05\x15\xb5n\f\x00\x00\xe0\x94\xe9m}L\xdd\x15U:NM1mmd\x80\xca<\xea\x1e8\x8a\x02\x95]\x02\xe1\xa15\xa0\x00\x00\u07d4\xe9n-8\x13\xef\xd1\x16_\x12\xf6\x02\xf9\u007fJb\x90\x9d\x1b;\xc0\xe9\xaa\"\u007f\x90\x89'\xcaK\xd7\x19\xf0\xb8\x00\x00\u07d4\xea,\x19}&\xe9\x8b\r\xa8>\x1br\u01c7a\x8c\x97\x9d=\xb0\x89\x01\x11du\x9f\xfb2\x00\x00\xe0\x94\xea7y\xd1J\x13\xf6\u01c5f\xbc\xde@5\x91A:b9\u06ca)\xb7d2\xb9DQ \x00\x00\u07d4\xeaN\x80\x9e&j\xe5\xf1<\xdb\u33dd\x04V\xe68m\x12t\x89\xf3\xf2\v\x8d\xfai\xd0\x00\x00\xe0\x94\xeaS\xc9T\xf4\xed\x97\xfdH\x10\x11\x1b\u06b6\x9e\xf9\x81\xef%\xb9\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\xeaS\xd2ed\x85\x9d\x9e\x90\xbb\x0eS\xb7\xab\xf5`\xe0\x16,8\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xea`Ci\x12\xdek\xf1\x87\u04e4r\xff\x8fS3\xa0\xf7\xed\x06\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xea`T\x9e\xc7U?Q\x1d!I\xf2\xd4fl\xbd\x92C\xd9<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xeaf\xe7\xb8M\u037f6\xee\xa3\xe7[\x858*u\xf1\xa1]\x96\x89]\xbc\x91\x91&o\x11\x80\x00\u07d4\xeahlPW\t<\x17\x1cf\u06d9\xe0\x1b\x0e\xce\xcb0\x86\x83\x89\x14\u0768],\xe1G\x80\x00\u07d4\xeaj\xfe,\xc9(\xac\x83\x91\xeb\x1e\x16_\xc4\x00@\xe3t!\u7262\u007f\xa0c\xb2\xe2\xe6\x80\x00\u07d4\xeay\x05}\xab\xef^d\xe7\xb4O\u007f\x18d\x8e~S7\x18\u0489\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xea|Mm\xc7)\xcdk\x15|\x03\xad#|\xa1\x9a \x93F\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\x81h\xfb\xf2%\xe7\x86E\x9c\xa6\xbb\x18\xd9c\xd2kPS\t\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xea\x81\u02868T\f\xd9\xd4\xd7=\x06\x0f,\xeb\xf2$\x1f\xfc>\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xea\x83\x17\x19yYB@A\xd9\xd7\xc6z>\xce\x1d\xbbx\xbbU\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xea\x85'\xfe\xbf\xa1\xad\xe2\x9e&A\x93)\u04d3\xb9@\xbb\xb7\u0709lj\xccg\u05f1\xd4\x00\x00\u07d4\xea\x8f0\xb6\xe4\xc5\xe6R\x90\xfb\x98d%\x9b\u0159\x0f\xa8\ue289\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xea\x94\xf3(\b\xa2\uf29b\xf0\x86\x1d\x1d$\x04\xf7\xb7\xbe%\x8a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xea\xa4\\\xea\x02\xd8},\xc8\xfd\xa9CN-\x98[\xd4\x03\x15\x84\x89h\x1f\xc2\xccn+\x8b\x00\x00\xe0\x94\uac3d\x14\x83\t\x18l\xf8\xcb\xd1;r2\xd8\tZ\u02c3:\x8a\x02C\x9a\x88\x1cjq|\x00\x00\u07d4\uaed0\xd3y\x89\xaa\xb3\x1f\xea\xe5G\xe0\xe6\xf3\x99\x9c\xe6\xa3]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\xc0\x82~\xff\fn?\xf2\x8a}JT\xf6\\\xb7h\x9d{\x99\x89\x9a\xd9\u67ddGR\x00\x00\u07d4\xea\xc1H(&\xac\xb6\x11\x1e\x19\xd3@\xa4_\xb8QWk\xed`\x89\x01\xbe\x8b\xab\x04\u067e\x80\x00\xe0\x94\xea\xc1{\x81\xedQ\x91\xfb\b\x02\xaaT3s\x13\x83A\a\xaa\xa4\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xea\u00efW\x84\x92\u007f\u9958\xfcN\xec8\xb8\x10/7\xbcX\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xea\u01b9\x88BT.\xa1\v\xb7O&\xd7\xc7H\x8fi\x8bdR\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xea\xc7h\xbf\x14\xb8\xf9C.i\xea\xa8*\x99\xfb\xeb\x94\xcd\f\x9c\x8a\x14\u06f2\x19\\\xa2(\x90\x00\x00\u07d4\xea\xd2\x1c\x1d\xec\u03ff\x1c\\\xd9f\x88\xa2Gki\xba\a\xceJ\x89\x03\xf2M\x8eJ\x00p\x00\x00\u07d4\xea\xd4\xd2\xee\xfbv\xab\xaeU3\x96\x1e\xdd\x11@\x04\x06\xb2\x98\xfc\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xea\xd6Rb\xed]\x12-\xf2\xb2u\x14\x10\xf9\x8c2\xd1#\x8fQ\x89\x05\x83\x17\xedF\xb9\xb8\x00\x00\u07d4\xea\xd7P\x16\u3801Pr\xb6\xb1\b\xbc\xc1\xb7\x99\xac\xf08>\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\xea#\xaa\x05r\x00\xe7\xc9\xc1^\x8f\xf1\x90\xd0\xe6l\f\x0e\x83\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\xed\x16\xea\xf5\u06ab[\xf0)^^\a\u007fY\xfb\x82U\x90\v\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xea\xed\xcck\x8bib\xd5\xd9(\x8c\x15lW\x9dG\xc0\xa9\xfc\xff\x89\x04\x9b\x9c\xa9\xa6\x944\x00\x00\u07d4\xea\xf5#\x88Tn\xc3Z\xcaolc\x93\xd8\xd6\t\xde:K\xf3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xeb\x10E\x8d\xac\xa7\x9eJk$\xb2\x9a\x8a\x8a\xdaq\x1b\u007f.\xb6\x89\u063beI\xb0+\xb8\x00\x00\u07d4\xeb\x1c\xea{E\u047dM\x0e*\x00{\u04ff\xb3Tu\x9e,\x16\x89\n\xbb\xcdN\xf3wX\x00\x00\u07d4\xeb%H\x1f\u035c\"\x1f\x1a\xc7\xe5\xfd\x1e\u0353\a\xa1b\x15\xb8\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\xeb.\xf3\u04cf\xe6R@<\xd4\xc9\xd8^\xd7\xf0h,\xd7\xc2\u078a\t\x0fSF\b\xa7(\x80\x00\x00\xe0\x94\xeb;\xddY\xdc\u0765\xa9\xbb*\xc1d\x1f\xd0!\x80\xf5\xf3e`\x8a\x01e\xc9fG\xb3\x8a \x00\x00\u07d4\xeb<\xe7\xfc8\x1cQ\xdb}_\xbdi/\x8f\x9e\x05\x8aLp=\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xebE?Z:\xdd\u074a\xb5gP\xfa\xdb\x0f\xe7\xf9M\x9c\x89\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xebO\x00\xe2\x836\xea\t\x94%\x88\ueb12\x18\x11\xc5\"\x14<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xebR\xab\x10U4\x922\x9c\x1cT\x83:\xe6\x10\xf3\x98\xa6[\x9d\x89\b=lz\xabc`\x00\x00\u07d4\xebW\r\xba\x97R'\xb1\xc4-n\x8d\xea,V\u026d\x96\x06p\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xebc\x94\xa7\xbf\xa4\u0489\x11\u0565\xb2>\x93\xf3^4\f\"\x94\x89\x04:w\xaa\xbd\x00x\x00\x00\u07d4\xebh\x10i\x1d\x1a\xe0\u045eG\xbd\"\u03be\u0cfa'\xf8\x8a\x89\x87\x85c\x15\xd8x\x15\x00\x00\u07d4\xebvBL\x0f\u0557\xd3\xe3A\xa9d*\xd1\xee\x11\x8b+W\x9d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xeb| +F+|\u0145]t\x84u_n&\xefC\xa1\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xeb\x83\\\x1a\x91\x18\x17\x87\x8a3\xd1gV\x9e\xa3\xcd\u04c7\xf3(\x8965\u026d\xc5\u07a0\x00\x00\u07d4\ub268\x82g\t\t\xcf7~\x9ex(n\xe9{\xa7\x8dF\u0089+|\xc2\xe9\xc3\"\\\x00\x00\xe0\x94\xeb\x90\u01d3\xb3S\x97a\xe1\xc8\x14\xa2\x96q\x14\x86\x92\x19>\xb4\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xeb\x9c\xc9\xfe\bi\xd2\u06b5,\u01ea\xe8\xfdW\xad\xb3_\x9f\xeb\x89j\x93\xbb\x17\xaf\x81\xf8\x00\x00\xe0\x94\ub8c8\xb0\xda'\xc8{\x1c\xc0\xea\xc6\xc5{,Z\vE\x9c\x1a\x8a\x01p\xa0\xf5\x04\x0eP@\x00\x00\u07d4\xeb\xaa!m\xe9\xccZC\x03\x17\a\xd3o\xe6\u057e\xdc\x05\xbd\xf0\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xeb\xac+D\b\xefT1\xa1;\x85\b\xe8bP\x98!\x14\xe1E\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xeb\xb6,\xf8\xe2,\x88K\x1b(\xc6\xfa\x88\xfb\xbc\x17\x93\x8a\xa7\x87\x89+By\x84\x03\u0278\x00\x00\u07d4\xeb\xb7\xd2\xe1\x1b\u01b5\x8f\n\x8dE\xc2\xf6\xde0\x10W\n\u0211\x89\x01s\x17\x90SM\xf2\x00\x00\u07d4\xeb\xbbO,=\xa8\xbe>\xb6-\x1f\xfb\x1f\x95\x02a\u03d8\xec\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4\xeb\xbdM\xb9\x01\x99R\u058b\x1b\x0fm\x8c\xf0h<\x008{\xb5\x89\x12\x04\x01V=}\x91\x00\x00\u07d4\xeb\xbe\xeb%\x91\x84\xa6\xe0\x1c\xcc\xfc\"\a\xbb\u0603xZ\xc9\n\x89!\x9b\xc1\xb0G\x83\xd3\x00\x00\u07d4\xeb\xd3V\x15j81#4=H\x84;\xff\xeda\x03\xe8f\xb3\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xeb\xd3{%ec\xe3\fo\x92\x89\xa8\xe2p/\bR\x88\b3\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xeb\xe4l\xc3\xc3L2\xf5\xad\xd6\xc3\x19[\xb4\x86\xc4q>\xb9\x18\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xeb\xff\x84\xbb\xefB0q\xe6\x04\xc3a\xbb\xa6w\xf5Y=\xefN\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xec\t'\xba\xc7\xdc6f\x9c(5J\xb1\xbe\x83\xd7\xee\xc3\t4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec\x0e\x18\xa0\x1d\xc4\xdc]\xaa\xe5g\xc3\xfaL\u007f\x8f\x9bY\x02\x05\x89\x11\x1f\xfe@JA\xe6\x00\x00\xe0\x94\xec\x116,\xec\x81\t\x85\xd0\xeb\xbd{sE\x14D\x98[6\x9f\x8a\x06ZNIWpW1\x80\x00\u07d4\xec,\xb8\xb97\x8d\xff1\xae\xc3\xc2.\x0em\xad\xff1J\xb5\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\xec0\xad\u0749[\x82\xee1\x9eT\xfb\x04\xcb+\xb09q\xf3k\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec;\x8bX\xa1'\x03\xe5\x81\xce_\xfd~!\xc5}\x1e\\f?\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xecHg\xd2\x17Z\xb5\xb9F\x93aYUFUF\x84\u0364`\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xecM\b\xaa.GIm\u0287\"]\xe3?+@\xa8\xa5\xb3o\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\xecX\xbc\r\f \xd8\xf4\x94efAS\xc5\xc1\x96\xfeY\u6f89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xec[\x19\x8a\x00\u03f5Z\x97\xb5\xd56D\xcf\xfa\x8a\x04\u04abE\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec]\xf2'\xbf\xa8]z\xd7kBn\x1c\xee\x96;\xc7\xf5\x19\u074965\u026d\xc5\u07a0\x00\x00\xe0\x94\xec_\xea\xfe!\f\x12\xbf\u0265\xd0Y%\xa1#\xf1\xe7?\xbe\xf8\x8a`\x8f\xcf=\x88t\x8d\x00\x00\x00\u07d4\xeci\x04\xba\xe1\xf6\x97\x90Y\x17\t\xb0`\x97\x83s?%s\xe3\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xecs\x11L^@o\u06fe\t\xb4\xfab\x1b\xd7\x0e\xd5N\xa1\xef\x8a\x050%\xcd!o\xceP\x00\x00\u07d4\xecs\x83=\xe4\xb8\x10\xbb\x02x\x10\xfc\x8fi\xf5D\xe8<\x12\u044965\u026d\xc5\u07a0\x00\x00\u07d4\xecu\xb4\xa4u\x13\x12\v\xa5\xf8`9\x81O\x19\x98\xe3\x81z\u00c9\t\xb0\xbc\xe2\xe8\xfd\xba\x00\x00\u07d4\xecv\xf1.W\xa6U\x04\x03?,\v\xceo\xc0;\xd7\xfa\n\u0109\xc2\x12z\xf8X\xdap\x00\x00\u0794\xec\x80\x14\xef\xc7\xcb\xe5\xb0\xceP\xf3V,\xf4\xe6\u007f\x85\x93\xcd2\x88\xf0\x15\xf2W6B\x00\x00\u07d4\xec\x82\xf5\r\x06G_hM\xf1\xb3\x92\xe0\r\xa3A\xaa\x14TD\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xec\x83\xe7\x98\u00d6\xb7\xa5^*\"$\xab\u0343K'\xeaE\x9c\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xec\x89\xf2\xb6x\xa1\xa1[\x914\xec^\xb7\fjb\a\x1f\xba\xf9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xec\x8c\x1d{j\xac\xcdB\x9d\xb3\xa9\x1e\xe4\xc9\xeb\x1c\xa4\xf6\xf7<\x89\xe6d\x99\"\x88\xf2(\x00\x00\xe0\x94\xec\x98Q\xbd\x91rpa\x02g\xd6\x05\x18\xb5M<\xa2\xb3[\x17\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xec\x99\xe9]\xec\xe4o\xff\xfb\x17^\xb6@\x0f\xbe\xbb\b\ue6d5\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xec\xa5\xf5\x87\x92\xb8\xc6-*\xf5Vq~\xe3\xee0(\xbeM\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4\xec\xabZ\xba[\x82\x8d\xe1pS\x81\xf3\x8b\xc7D\xb3+\xa1\xb47\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\xec\xaf3P\xb7\xce\x14M\x06\x8b\x18`\x10\x85,\x84\xdd\f\xe0\xf0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec\xb9LV\x8b\xfeY\xad\xe6Pd_O&0lsl\xac\xe4\x89\x0e~\xeb\xa3A\vt\x00\x00\xe0\x94\xec\xbeB^g\r9\tN \xfbVC\xa9\xd8\x18\xee\xd26\u078a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94\xec\xbe^\x1c\x9a\u04b1\xdc\xcf\n0_\xc9R/Fi\xdd:\xe7\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xec\xcfz\x04W\xb5f\xb3F\xcag:\x18\x0fDA0!j\u00c9\x05k\xc7^-c\x10\x00\x00\u07d4\xec\u0466(\x025\x1aAV\x8d#\x030\x04\xac\xc6\xc0\x05\xa5\u04c9\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xec\xd2v\xafd\u01dd\x1b\u0669+\x86\xb5\u835a\x95\xeb\x88\xf8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xec\u0506\xfc\x19g\x91\xb9,\xf6\x12\xd3HaO\x91VH\x8b~\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xec\xda\xf92)\xb4^\xe6r\xf6]\xb5\x06\xfb^\xca\x00\xf7\xfc\xe6\x89W\x01\xf9m\xcc@\xee\x80\x00\u07d4\xec\xe1\x11g\vV<\u037e\xbc\xa5#\x84)\x0e\xcdh\xfe\\\x92\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xec\xe1\x15&\x82\xb7Y\x8f\xe2\xd1\xe2\x1e\xc1U3\x88T5\xac\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xec\xe1)\bw\xb5\x83\xe3a\xa2\xd4\x1b\x00\x93F\xe6'N%8\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xec\xf0]\a\xea\x02n~\xbfIA\x00#5\xba\xf2\xfe\xd0\xf0\x02\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xec\xf2L\xdd|\"\x92\x8cD\x1eiM\xe4\xaa1\xb0\xfa\xb5\x97x\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xec\xfd\x00M\x02\xf3l\xd4\u0634\xa8\xc1\xa9S;j\xf8\\\xd7\x16\x8a\x01\x0fA\xac\xb4\xbb;\x9c\x00\x00\xe0\x94\xed\x02\x06\xcb#1Q(\xf8\xca\xff&\xf6\xa3\v\x98Tg\xd0\"\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xed\x10e\xdb\u03dds\xc0O\xfcy\b\x87\r\x88\x14h\xc1\xe12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xed\x12vQ;o\u0186(\xa7A\x85\xc2\xe2\f\xbb\xcax\x17\xbf\x89\nZ\xa8P\t\xe3\x9c\x00\x00\xe0\x94\xed\x12\xa1\xba\x1f\xb8\xad\xfc\xb2\r\xfa\x19X.RZ\xa3\xb7E$\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xed\x16\xce9\xfe\xef;\xd7\xf5\xd1b\x04^\x0fg\xc0\xf0\x00F\xbb\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xed\x1a\\C\xc5t\xd4\xe94)\x9b$\xf1G,\u071f\xd6\xf0\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xed\x1b$\xb6\x91-Q\xb34\xac\r\xe6\xe7q\xc7\xc0EF\x95\xea\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xed\x1f\x1e\x11Z\r`\xce\x02\xfb%\xdf\x01M(\x9e:\f\xbe}\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xed10\\1\x9f\x92s\u04d3m\x8f[/q\u9c72)c\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xed2z\x14\xd5\u03ed\u0641\x03\xfc\t\x99q\x8d~\xd7\x05(\xea\x89N\x10\x03\xb2\x8d\x92\x80\x00\x00\u07d4\xed<\xbc7\x82\u03bdg\x98\x9b0\\A3\xb2\xcd\xe3\"\x11\xeb\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xed@\x14S\x8c\xeefJ/\xbc\xb6\xdcf\x9fz\xb1m\v\xa5|\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xedA\u188f\\\xaa\x848\x80\xefN\x8b\b\xbdl3\x14\x1e\u07c9*\xd5\xdd\xfaz\x8d\x83\x00\x00\xe0\x94\xedK\xe0J\x05-z\u0333\xdc\u03901\x9d\xba@ \xab,h\x8a\a\xf3zp\xea\xf3b\x17\x80\x00\xe0\x94\xedR\xa2\xcc\bi\u071e\x9f\x84+\u0415|G\xa8\xe9\xb0\xc9\xff\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xed[LA\xe7b\xd9B@Cs\xca\xf2\x1e\xd4a]%\xe6\xc1\x89m-O=\x95%\xb4\x00\x00\u07d4\xed`\u012bnT\x02\x061~5\x94zc\xa9\xcak\x03\xe2\u02c9\x03\x1a\u066d\vF\u007f\x80\x00\u07d4\xedd\x1e\x066\x8f\xb0\xef\xaa\x17\x03\xe0\x1f\xe4\x8fJhS\t\xeb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xedfC\xc0\xe8\x88K-2\x11\x857\x85\xa0\x8b\xf8\xf3>\u049f\x89Hz\x9a0E9D\x00\x00\xe0\x94\xedp\xa3|\xdd\x1c\xbd\xa9tm\x93\x96X\xae*a\x81(\x85x\x8a\x02\bj\xc3Q\x05&\x00\x00\x00\u07d4\xedsFvn\x1agm\r\x06\xec\x82\x18g\xa2v\xa0\x83\xbf1\x89\u064a\t1\xcc-I\x00\x00\u07d4\xed\x86&\x16\xfc\xbf\xb3\xbe\xcbt\x06\xf7<\\\xbf\xf0\f\x94\aU\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xed\x9e\x03\f\xa7\\\xb1\u049e\xa0\x1d\rL\xdf\xdc\xcd8D\xb6\xe4\x89\x01\xac\xc1\x16\u03ef\xb1\x80\x00\xe0\x94\ud7bc\u02e4/\x98\x15\xe7\x823&m\xd6\xe85\xb6\xaf\xc3\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\ud7f1\xf5\xaf/\xbf\u007f\xfcP)\xce\xe4+p\xff\\'[\xf5\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xed\xa4\xb2\xfaY\u0584\xb2z\x81\r\xf8\x97\x8as\xdf0\x8ac\u0089\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xed\xb4s59y\xa2\x06\x87\x9d\xe1D\xc1\n:\xcf\x12\xa7'OV9a\xf57R\x9d\x89\xc7\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xeer\x88\xd9\x10\x86\xd9\xe2\xeb\x91\x00\x14\u066b\x90\xa0-x\u00a0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xee|=\xed|(\xf4Y\xc9/\xe1;M\x95\xba\xfb\xab\x026}\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94\xee\x86} \x91k\xd2\xe9\xc9\xec\xe0\x8a\xa0C\x85\xdbf|\x91.\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\ue25b\x02\xcb\xcb99\xcda\xde\x13B\xd5\x04\x82\xab\xb6\x852\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xee\x90m}_\x17H%\x81t\xbeL\xbc8\x93\x03\x02\xab{B\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\ue5ea\x8a\u019e\xdfz\x98}mp\x97\x9f\x8e\xc1\xfb\xcaz\x94\x89\x14b\fW\xdd\xda\xe0\x00\x00\u07d4\xee\xa1\xe9y\x88\xdeu\xd8!\xcd(\xadh\"\xb2,\u0398\x8b1\x89\x1c0s\x1c\xec\x03 \x00\x00\xe0\x94\xee\u048c?\x06\x8e\tJ0K\x85<\x95\nh\t\xeb\xcb\x03\xe0\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\xee\u04c4\xef-A\xd9\xd2\x03\x97NW\xc1#(\xeav\x0e\b\xea\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xee\xdflB\x80\xe6\xeb\x05\xb94\xac\xe4(\xe1\x1dB1\xb5\x90[\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xee\xe7a\x84~3\xfda\u0653\x87\xee\x14b\x86\x94\u047f\xd5%\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xee\xe9\xd0Rn\xda\x01\xe41\x16\xa3\x952-\u0689pW\x8f9\x8a\x02\x1e\x19\x99\xbb\xd5\u04be\x00\x00\u07d4\xee\xf1\xbb\xb1\xe5\xa8?\u0782H\xf8\x8e\xe3\x01\x8a\xfa-\x132\xeb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xee\xfb\xa1-\xfc\x99gB\xdby\x04d\xca}';\xe6\xe8\x1b>\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xee\xfd\x05\xb0\xe3\xc4\x17\xd5[3C\x06\x04\x86\xcd\xd5\xe9*\xa7\xa6\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xef\r\xc7\xddzS\xd6\x12r\x8b\xcb\u04b2|\x19\xddM}fo\x89&A\x1c[5\xf0Z\x00\x00\u07d4\xef\x11RR\xb1\xb8E\u0345\u007f\x00-c\x0f\x1bo\xa3zNP\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xef\x1c\x04w\xf1\x18M`\xac\u02b3t\xd3tUz\n>\x10\xf3\x89\b=lz\xabc`\x00\x00\u07d4\xef,4\xbbH}7b\xc3\u0327\x82\xcc\xddz\x8f\xbb\n\x991\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4\xef5\xf6\u0531\a^j\xa19\x15\x1c\x97K/FX\xf7\x058\x89<;\xc3?\x94\xe5\r\x80\x00\u07d4\xef9\u0291s\xdf\x15S\x1ds\xe6\xb7*hKQ\xba\x0f+\xb4\x89V\xa0\xb4un\xe28\x00\x00\u07d4\xefF<&y\xfb'\x91d\xe2\f=&\x915\x87s\xa0\xad\x95\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xefG\xcf\a>6\xf2q\xd5\"\xd7\xfaNq \xadP\a\xa0\xbc\x89\x87\x86x2n\xac\x90\x00\x00\u07d4\xefa\x15[\xa0\t\xdc\u07be\xf1\v(\xd9\xda=\x1b\xc6\xc9\xce\u0509\x034-`\xdf\xf1\x96\x00\x00\u0794\xefix\x1f2\xff\xce34o,\x9a\xe3\xf0\x84\x93\xf3\xe8/\x89\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xefv\xa4\u034f\xeb\xcb\u0278\x18\xf1x(\xf8\xd94s\xf3\xf3\u02c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\uf4c1\x8fhM\xb0\xc3g^\xc8\x132\xb3\x18>\xcc(\xa4\x95\x89T\x06\x923\xbf\u007fx\x00\x00\xe0\x94\xef\x9fY\xae\xdaA\x8c\x14\x94h-\x94\x1a\xabI$\xb5\xf4\x92\x9a\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\uf9b1\xf0\xdb`57\x82h\x91\xb8\xb4\xbc\x169\x84\xbb@\u03495e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\xef\xbdR\xf9}\xa5\xfd:g:F\xcb\xf30D{~\x8a\xad\\\x89\x05l<\x9b\x80\xa0\xa6\x80\x00\xe0\x94\xef\xc8\xcf\x19c\u0269Rg\xb2(\xc0\x86#\x98\x89\xf4\xdf\xd4g\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xef\u02ae\x9f\xf6M,\xd9[RI\xdc\xff\xe7\xfa\xa0\xa0\xc0\xe4M\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xef\xcc\xe0k\xd6\b\x9d\x0eE\x8e\xf5a\xf5\xa6\x89H\n\xfep\x00\x89 \x86\xac5\x10R`\x00\x00\u07d4\xef\xe0g]\xa9\x8a]\xdap\u0356\x19k\x87\xf4\xe7&\xb43H\x89?\x19\xbe\xb8\xdd\x1a\xb0\x00\x00\u07d4\xef\xe8\xff\x87\xfc&\x0e\agc\x8d\xd5\xd0/\xc4g.\x0e\xc0m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xef\xeb\x19\x97\xaa\xd2w\xcc3C\x0ea\x11\xed\tCY@H\xb8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xef\xee\xa0\x10uo\x81\xdaK\xa2[r\x17\x87\xf0X\x17\v\uff49\x01\u009c\x9c\xf7p\xef\x00\x00\u07d4\xef\xf5\x1dr\xad\xfa\xe1C\xed\xf3\xa4+\x1a\xecU\xa2\xcc\xdd\v\x90\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xef\xf8kQ#\xbc\xdc\x17\xedL\xe8\xe0[~\x12\xe5\x13\x93\xa1\xf7\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xef\xfc\x15\u41f1\xbe\xda\n\x8d\x13%\xbd\xb4\x17\"@\xdcT\n\x89\x03\x8599\xee\xe1\xde\x00\x00\xe0\x94\xf0\x11\x95\xd6W\xef<\x94.l\xb89I\xe5\xa2\v\\\xfa\x8b\x1e\x8a\x05ts\xd0]\xab\xae\x80\x00\x00\u07d4\xf0'\x96)Q\x01gB\x88\xc1\xd94g\x05=\x04\"\x19\xb7\x94\x89(\x1d\x90\x1fO\xdd\x10\x00\x00\u07d4\xf09h={=\"[\xc7\xd8\u07ed\xefc\x164A\xbeA\xe2\x89\x01\xdd\x1eK\xd8\xd1\xee\x00\x00\u07d4\xf0Jj7\x97\b\xb9B\x8dr*\xa2\xb0kw\xe8\x895\u03c9\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xf0M,\x91\xef\xb6\xe9\xc4_\xfb\xe7KCL\x8c_+\x02\x8f\x1f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf0W\xaaf\xcav~\xde\x12J\x1c[\x9c\xc5\xfc\x94\xef\v\x017\x89p\xa2K\u02b6\xf4]\x00\x00\u07d4\xf0[\xa8\u05f6\x859\xd930\v\xc9(\x9c=\x94t\xd0A\x9e\x89\x06\xda'\x02M\xd9`\x00\x00\u07d4\xf0\\\xee\xabeA\x05dp\x99Qw<\x84E\xad\x9fN\u01d7\x89\x10C\x16'\xa0\x93;\x00\x00\xe0\x94\xf0_\xcdL\rs\xaa\x16~US\xc8\xc0\xd6\xd4\xf2\xfa\xa3\x97W\x8a\x02\xd2\xd6l1p\xb2\x98\x00\x00\u07d4\xf0g\xe1\xf1\u0583UjL\xc4\xfd\f\x03\x13#\x9f2\xc4\xcf\u060965\u026d\xc5\u07a0\x00\x00\u07d4\xf0g\xfb\x10\u07f2\x93\u962b\xe5d\xc0U\xe34\x8f\x9f\xbf\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf0h\xdf\xe9]\x15\xcd:\u007f\x98\xff\xa6\x88\xb44hB\xbe&\x90\x89D\n\xd8\x19\xe0\x97L\x00\x00\xe0\x94\xf0j\x85J<]\xc3m\x1cI\xf4\xc8}m\xb33\xb5~J\u074a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf0y\xe1\xb1&_P\xe8\u0229\x8e\xc0\u01c1^\xb3\xae\xac\x9e\xb4\x89\x01\x16\xdc:\x89\x94\xb3\x00\x00\xe0\x94\xf0{\xd0\xe5\xc2\xcei\xc7\u0127$\xbd&\xbb\xfa\x9d*\x17\xca\x03\x8a\x01@a\xb9\xd7z^\x98\x00\x00\xe0\x94\xf0\x83*k\xb2U\x03\xee\xcaC[\xe3\x1b\v\xf9\x05\xca\x1f\xcfW\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xf0\x9b>\x87\xf9\x13\xdd\xfdW\xae\x80I\xc71\u06e9\xb66\xdf\u00c9 \xf5\xb1\uab4d\x80\x00\x00\u07d4\xf0\xb14\v\x99oo\v\xf0\xd9V\x1c\x84\x9c\xaf\u007fD0\xbe\xfa\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf0\xb1\xf9\xe2x2\xc6\xdei\x14\xd7\n\xfc#\x8ct\x99\x95\xac\xe4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xf0\xb4i\xea\xe8\x9d@\f\xe7\xd5\xd6j\x96\x95\x03p6\xb8\x89\x03\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xf0\xb9\u0583\u03a1+\xa6\x00\xba\xac\xe2\x19\xb0\xb3\xc9~\x8c\x00\xe4\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf0\xbe\x0f\xafMy#\xfcDF\"\u0458\f\xf2\u0650\xaa\xb3\a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf0\xc0\x81\xdaR\xa9\xae6d*\xdf^\b _\x05\xc5Ah\xa6\x89\x06\x04o7\xe5\x94\\\x00\x00\u07d4\xf0\xc7\r\rm\xabvc\xaa\x9e\xd9\xce\xeaV~\xe2\u01b0'e\x89qC\x8a\u0167\x91\xa0\x80\x00\u07d4\xf0\xcb\xef\x84\xe1ic\x00\x98\xd4\xe3\x01\xb2\x02\b\xef\x05\x84j\u0249\x0e\v\x83EPkN\x00\x00\u07d4\xf0\xd2\x16c\u0630\x17n\x05\xfd\xe1\xb9\x0e\xf3\x1f\x850\xfd\xa9_\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xf0\xd5\xc3\x1c\xcbl\xbe0\xc7\xc9\xea\x19\xf2h\xd1Y\x85\x1f\x8c\x9c\x8a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\xf0\xd6L\xf9\xdf\tt\x113\xd1pH_\xd2K\x00P\x11\xd5 \x89\x1b\b\x93A\xe1O\xcc\x00\x00\u07d4\xf0\xd8X\x10^\x1bd\x81\x01\xac?\x85\xa0\xf8\"+\xf4\xf8\x1dj\x89 \x86\xac5\x10R`\x00\x00\u07d4\xf0\xdcC\xf2\x05a\x91'P{+\x1c\x1c\xfd\xf3-(1\t \x89\x10^\xb7\x9b\x94\x17\b\x80\x00\u07d4\xf0\xe1\u07e4*\u07ac/\x17\xf6\xfd\xf5\x84\xc9Hb\xfdV3\x93\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf0\xe2d\x9c~j?,]\xfe3\xbb\xfb\xd9'\xca<5\nX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf0\xe7\xfb\x9eB\nS@\xd56\xf4\x04\b4O\xea\xef\xc0j\xef\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf1\x04b\xe5\x8f\xcc\a\U000d5121\x87c\x94Q\x16~\x85\x92\x01\x89\t4\xdd]3\xbc\x97\x00\x00\xe0\x94\xf1\x06a\xff\x94\x14\x0f >zH%rCy8\xbe\xc9\xc3\xf7\x8a\x04<3\xc1\x93ud\x80\x00\x00\u0794\xf1\x14\xff\r\x0f$\xef\xf8\x96\xed\xdeTq\u07a4\x84\x82J\x99\xb3\x88\xbe -j\x0e\xda\x00\x00\u07d4\xf1\x16\xb0\xb4h\x0fS\xabr\xc9h\xba\x80.\x10\xaa\x1b\xe1\x1d\u0209\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xf1\x1c\xf5\xd3cto\xeehd\xd3\xca3m\xd8\x06y\xbb\x87\xae\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xf1\x1e\x01\u01e9\xd1$\x99\x00_M\xaew\x16\tZ4\x17bw\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf1;\b0\x93\xbaVN-\xc61V\x8c\xf7T\r\x9a\x0e\xc7\x19\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xf1O\x0e\xb8m\xb0\xebhu?\x16\x91\x8e]K\x80t7\xbd>\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf1Qx\xff\xc4:\xa8\a\x0e\xce2~\x93\x0f\x80\x9a\xb1\xa5O\x9d\x89\n\xb6@9\x12\x010\x00\x00\u07d4\xf1V\xdc\v*\x98\x1e[U\xd3\xf2\xf0;\x814\xe31\u06ed\xb7\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf1]\x9dZ!\xb1\x92\x9ey\x03q\xa1\u007f\x16\xd9_\fie\\\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1^\x18,O\xbb\xady\xbd\x934\"B\xd4\xdc\xcf+\xe5\x89%\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xf1bM\x98\ve3o\xea\u0166\xd5A%\x00\\\xfc\xf2\xaa\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1g\xf5\x86\x8d\xcfB3\xa7\x83\x06\th,\xaf-\xf4\xb1\xb8\a\x89\x81\xe5B\xe1\xa78?\x00\x00\u07d4\xf1m\xe1\x89\x1d\x81\x96F\x13\x95\xf9\xb16&[;\x95F\xf6\xef\x89\x01\xb2\x8e\x1f\x98\xbb\u0380\x00\u07d4\xf1z\x92\xe06\x1d\xba\xce\xcd\xc5\xde\r\x18\x94\x95Z\xf6\xa9\xb6\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1z\xdbt\x0fE\u02fd\xe3\tN~\x13qo\x81\x03\xf5c\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1\x8b\x14\xcb\xf6iC6\xd0\xfe\x12\xac\x1f%\xdf-\xa0\xc0]\xbb\x89\xd8\xd4`,&\xbfl\x00\x00\u07d4\xf1\x9b98\x9dG\xb1\x1b\x8a,?\x1d\xa9\x12M\xec\xff\xbe\xfa\xf7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1\x9f\x195\b9>M*\x12{ \xb2\x03\x1f9\xc8%\x81\u0189\xbd\xbdz\x83\xbd/l\x00\x00\u07d4\xf1\xa1\xf3 @yd\xfd<\x8f.,\u0224X\r\xa9O\x01\xea\x89ll!wU|D\x00\x00\u07d4\xf1\xb4\xec\xc65%\xf7C,=\x83O\xfe+\x97\x0f\xbe\xb8r\x12\x89\xa2\xa2@h\xfa\u0340\x00\x00\u07d4\U000753ef\xfa\x87\x94\xf5\n\xf8\xe8\x83\t\u01e6&TU\xd5\x1a\x8963\x03\"\xd5#\x8c\x00\x00\u07d4\xf1\xc8\u0129A\xb4b\x8c\rl0\xfd\xa5dR\u065c~\x1bd\x89N\x8c\xea\x1e\xdeu\x04\x00\x00\u07d4\xf1\xda@so\x99\xd5\xdf;\x06\x8a]t_\xaf\xc6F?\u0271\x89\x06\x96\xca#\x05\x8d\xa1\x00\x00\u07d4\xf1\u070a\xc8\x10B\xc6z\x9c\\c2!\xa8\xf76>e\x87\f\x9f(t$\u04a9`\x89J\xcfX\xe0rW\x10\x00\x00\u07d4\xf2B\u0684]B\u053fw\x9a\x00\xf2\x95\xb4\aP\xfeI\xea\x13\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf2RY\xa5\xc99\xcd%\x96l\x9bc\x03\xd3s\x1cS\u077cL\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf2^Lp\xbcFV2\u021eV%\xa82\xa7r/k\xff\xab\x89\xf3K\x82\xfd\x8e\x91 \x00\x00\u07d4\xf2k\xce\xdc\xe3\xfe\xad\u03a3\xbc>\x96\xeb\x10@\xdf\xd8\xff\u1809*\x03I\x19\u07ff\xbc\x00\x00\u07d4\xf2py%v\xf0]QD\x93\xff\xd1\xf5\xe8K\xecK-\xf8\x10\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf2s,\xf2\xc1;\x8b\xb8\xe7I*\x98\x8f_\x89\xe3\x82s\xdd\u0209 \x86\xac5\x10R`\x00\x00\xe0\x94\xf2t.hY\xc5i\xd5\xf2\x10\x83Q\xe0\xbfM\xca5*H\xa8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf2\x81:d\xc5&]\x02\x025\u02dc1\x9bl\x96\xf9\x06\xc4\x1e\x89\x12\xf99\u025e\u06b8\x00\x00\u07d4\xf2\x87\xffR\xf4a\x11z\xdb>\x1d\xaaq\x93-\x14\x93\xc6_.\x89\xc5S%\xcat\x15\xe0\x00\x00\u07d4\xf2\xab\x11au\x02D\xd0\xec\xd0H\xee\r>Q\xab\xb1C\xa2\xfd\x89B\xfe+\x90ss\xbc\x00\x00\u07d4\xf2\xb4\xab,\x94'\xa9\x01^\xf6\xee\xff\xf5\xed\xb6\x019\xb7\x19\u0449&\u06d9*;\x18\x00\x00\x00\u07d4\xf2\xc0>*8\x99\x8c!d\x87`\xf1\xe5\xae~\xa3\a}\x85\"\x89\x8f?q\x93\xab\a\x9c\x00\x00\u0794\xf2\u0090N\x9f\xa6d\xa1\x1e\xe2VV\xd8\xfd,\xc0\u0665\"\xa0\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xf2\xc3b\xb0\xef\x99\x1b\xc8/\xb3nf\xffu\x93*\xe8\u0742%\x89\x04\x02\xf4\xcf\xeeb\xe8\x00\x00\u07d4\xf2\xd0\xe9\x86\xd8\x14\xea\x13\xc8\xf4f\xa0S\x8cS\u0712&Q\xf0\x89J\xcfX\xe0rW\x10\x00\x00\xe0\x94\xf2\u04775w$\xecL\x03\x18[\x87\x9bc\xf5~&X\x91S\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xf2\xd5v<\xe0s\x12~,\xed\xdeo\xab\xa7\x86\xc7<\xa9AA\x8a\x01\xacB\x86\x10\x01\x91\xf0\x00\x00\xe0\x94\xf2\u055c\x89#u\x90s\xd6\xf4\x15\xaa\xf8\xeb\x06_\xf2\U000f614a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4\xf2\xe9\x9f\\\xbb\x83kz\xd3bGW\x1a0,\xbeKH\x1ci\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf2\xed>w%J\u02c3#\x1d\xc0\x86\x0e\x1a\x11$+\xa6'\u06c9kV\x05\x15\x82\xa9p\x00\x00\xe0\x94\xf2\xed\xde7\xf9\xa8\u00dd\u07a2My\xf4\x01WW\xd0k\xf7\x86\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xf2\xef\xe9e`\xc9\xd9{r\xbd6DxC\x88\\\x1d\x90\xc21\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf2\xfb\xb6\u0607\xf8\xb8\xcc:\x86\x9a\xba\x84\u007f=\x1fd\xfcc\x97\xaae\xfbS\xa8\xf0z\x0f\x89:\xae0\xe8\xbc\xee\x89|\xf28\x1fa\x9f\x15\x00\x00\u07d4\xf3@\x83\xec\xea8P\x17\xaa@\xbd\xd3^\xf7\xef\xfbL\xe7v-\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf3F\xd7\u0792t\x1c\b\xfcX\xa6M\xb5[\x06-\xde\x01-\x14\x89\x0f\xffk\x1fv\x1em\x00\x00\xe0\x94\xf3U\xd3\xec\f\xfb\x90}\x8d\xbb\x1b\xf3FNE\x81(\x19\v\xac\x8a\x01\v\x04n\u007f\r\x80\x10\x00\x00\u07d4\xf3m\xf0/\xbd\x89`sG\xaf\xce)i\xb9\xc4#jX\xa5\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3s\xe9\u06ac\f\x86u\xf5;yz\x16\x0fo\xc04\xaek#\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf3{BeG\xa1d-\x8032H\x14\xf0\xed\xe3\x11O\xc2\x12\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xf3{\xf7\x8cXu\x15G\x11\xcbd\r7\xeam(\xcf\xcb\x12Y\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xf3\x82\xdfX1U\xd8T\x8f?\x93D\f\xd5\xf6\x8c\xb7\x9d`&\x8a8u}\x02\u007f\xc1\xfd\\\x00\x00\xe0\x94\xf3\x82\xe4\xc2\x04\x10\xb9Q\b\x9e\x19\xba\x96\xa2\xfe\xe3\xd9\x1c\xce~\x8a\x01\x11\xfaV\xee\u00a88\x00\x00\xe0\x94\xf3\x8al\xa8\x01hS~\x97M\x14\xe1\xc3\xd19\x90\xa4L,\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xf3\x9a\x9dz\xa3X\x1d\xf0~\xe4'\x9a\xe6\xc3\x12\xef!\x036X\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf3\xb6h\xb3\xf1M\x92\x0e\xbc7\x90\x92\u06d8\x03\x1bg\xb2\x19\xb3\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\U000fe679\x10<\xe7U\n\xa7O\xf1\xdb\x18\xe0\x9d\xfe2\xe0\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3\xc1\xab\u049d\xc5{A\xdc\x19-\x0e8M\x02\x1d\xf0\xb4\xf6\u0509\x97\xae\f\u07cf\x86\xf8\x00\x00\u07d4\xf3\xc4qm\x1e\xe5'\x9a\x86\xd0\x16:\x14a\x81\x81\xe1a6\u01c965\u026d\xc5\u07a0\x00\x00\xe0\x94\xf3\u030b\xcbU\x94e\xf8\x1b\xfeX;\u05eb\n#\x06E;\x9e\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xf3\u0588\xf0k\xbd\xbfP\xf9\x93,AE\xcb\xe4\x8e\xcd\xf6\x89\x04\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf3\xdb\xcf\x13Z\u02dd\xee\x1aH\x9cY<\x02O\x03\u00bb\xae\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3\xde_&\xefj\xde\xd6\xf0m;\x91\x13F\xeep@\x1d\xa4\xa0\x89\x13:\xb3}\x9f\x9d\x03\x00\x00\u07d4\xf3\xdfc\xa9q\x99\x93308;>\xd7W\v\x96\u0101#4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3\xe7OG\f}:?\x003x\x0fv\xa8\x9f>\xf6\x91\xe6\u02c9\xa3\xcf\xe61\xd1Cd\x00\x00\u07d4\xf3\xeb\x19H\xb9Q\xe2-\xf1ax)\xbf;\x8d\x86\x80\xeckh\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf3\xf1\xfa9\x18\xca4\xe2\xcf~\x84g\v\x1fM\x8e\xca\x16\r\xb3\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4\xf3\xf2O\u009e @?\xc0\xe8\xf5\xeb\xbbU4&\xf7\x82p\xa2\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf3\xfar5R\xa5\xd0Q.+b\xf4\x8d\xca{+\x81\x050[\x89\amA\xc6$\x94\x84\x00\x00\u07d4\xf3\xfeQ\xfd\xe3D\x13\xc73\x18\xb9\xc8T7\xfe~\x82\x0fV\x1a\x896b2\\\u044f\xe0\x00\x00\u07d4\xf4\x00\xf9=_\\~?\xc3\x03\x12\x9a\xc8\xfb\f/xd\a\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf4\v\x13O\xea\"\u01b2\x9c\x84W\xf4\x9f\x00\x0f\x9c\xdax\x9a\u06c9 \x86\xac5\x10R`\x00\x00\u07d4\xf4\x15W\xdf\u07f1\xa1\xbd\xce\xfe\xfe.\xba\x1e!\xfe\nJ\x99B\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf4\x17z\r\x85\u050b\x0e&B\x11\xce*\xa2\xef\xd3\xf1\xb4\u007f\b\x89\xc2\xcc\xca&\xb7\xe8\x0e\x80\x00\u07d4\xf4/\x90R1\xc7p\xf0\xa4\x06\xf2\xb7h\x87\u007f\xb4\x9e\xee\x0f!\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xf42\xb9\u06ef\x11\xbd\xbds\xb6Q\x9f\xc0\xa9\x04\x19\x87q\xaa\u0189\b=lz\xabc`\x00\x00\u07d4\xf4=\xa3\xa4\xe3\xf5\xfa\xb1\x04\u029b\xc1\xa0\xf7\xf3\xbbJV\xf3Q\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xf4G\x10\x8b\x98\xdfd\xb5~\x87\x103\x88\\\x1a\xd7\x1d\xb1\xa3\xf9\x8a\x01v\xf4\x9e\xad4\x83P\x80\x00\u07d4\xf4O\x85Q\xac\xe93r\a\x12\xc5\u0111\u0376\xf2\xf9Qsl\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u0794\xf4V\x05Z\x11\xab\x91\xfff\x8e.\xc9\"\x96\x1f*#\xe3\xdb%\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xf4V\xa7[\xb9\x96U\xa7A,\xe9}\xa0\x81\x81m\xfd\xb2\xb1\xf2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf4[\x1d\xcb.A\xdc'\xff\xa0$\u06ad\xf6\x19\xc1\x11u\xc0\x87\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xf4c\xa9\f\xb3\xf1>\x1f\x06CB66\xbe\xab\x84\xc1#\xb0m\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xf4h\x90n~\xdffJ\xb0\u063e=\x83\xebz\xb3\xf7\xff\xdcx\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xf4i\x80\u3929\u049ajn\x90`E7\xa3\x11K\xcb(\x97\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf4kk\x9c|\xb5R\x82\x9c\x1d=\xfd\x8f\xfb\x11\xaa\xba\xe7\x82\xf6\x89\x01#n\xfc\xbc\xbb4\x00\x00\u07d4\xf4v\xe1&\u007f\x86$|\xc9\b\x81o.z\xd58\x8c\x95-\xb0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf4v\xf2\xcbr\b\xa3.\x05\x1f\xd9N\xa8f)\x92c\x82\x87\xa2\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xf4{\xb14\xda0\xa8\x12\xd0\x03\xaf\x8d\u0338\x88\xf4K\xbfW$\x8a\x01\x19Y\xb7\xfe3\x95X\x00\x00\u07d4\xf4\x83\xf6\a\xa2\x1f\xcc(\x10\n\x01\x8cV\x8f\xfb\xe1@8\x04\x10\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf4\x8e\x1f\x13\xf6\xafM\x84\xb3q\xd7\xdeK'=\x03\xa2c'\x8e\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xf4\x9cG\xb3\xef\xd8knj[\xc9A\x8d\x1f\x9f\xec\x81Ki\xef\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xf4\x9fo\x9b\xaa\xbc\x01\x8c\x8f\x8e\x11\x9e\x01\x15\xf4\x91\xfc\x92\xa8\xa4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf4\xa3g\xb1f\u0499\x1a+\xfd\xa9\xf5dc\xa0\x9f%,\x1b\x1d\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf4\xa5\x1f\xceJ\x1d[\x94\xb0q\x83\x89\xbaNx\x14\x13\x9c\xa78\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xf4\xa9\xd0\f\xef\xa9{zX\xef\x94\x17\xfcbg\xa5\x06\x909\xee\x89\x01.\x89(\u007f\xa7\x84\x00\x00\u07d4\xf4\xaa\xa3\xa6\x16>7\x06W{I\xc0v~\x94\x8ah\x1e\x16\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf4\xb1bn$\xf3\v\xca\xd9'!\xb2\x93r\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xf5U\xa2{\xb1\xe2\xfdN,\u01c4\xca\ue493\x9f\xc0n/\u0249lk\x93[\x8b\xbd@\x00\x00\u07d4\xf5X\xa2\xb2\xdd&\u0755\x93\xaa\xe0E1\xfd<<\u00c5Kg\x89\n\xbb\xcdN\xf3wX\x00\x00\u07d4\xf5`H\xdd!\x81\u0523od\xfc\xec\xc6!T\x81\xe4*\xbc\x15\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf5dB\xf6\x0e!i\x13\x95\u043f\xfa\xa9\x19M\xca\xff\x12\u2dc9\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\xf5yqJE\xeb\x8fR\xc3\xd5{\xbd\xef\xd2\xc1[./\x11\u07c9T\x91YV\xc4\t`\x00\x00\u07d4\xf5\x93\xc6R\x85\xeek\xbdf7\U000fe3c9\xad@\u0509\xf6U\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xf5\x98\xdb.\t\xa8\xa5\xee}r\r+\\C\xbb\x12m\x11\xec\u0089\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xf5\x9d\xab\x1b\xf8\xdf\x112~a\xf9\xb7\xa1KV:\x96\xec5T\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xf5\x9f\x9f\x02\xbb\u024e\xfe\t~\xab\xb7\x82\x10\x97\x90!\x89\x8b\xfd\x8a\x02\x1e\x17\x1a>\xc9\xf7,\x00\x00\u07d4\xf5\xa5E\x9f\xcd\xd5\xe5\xb2s\x83\r\xf8\x8e\xeaL\xb7}\xda\u07f9\x89\x04\t\xe5+H6\x9a\x00\x00\u07d4\xf5\xa7gj\xd1H\xae\x9c\x1e\xf8\xb6\xf5\xe5\xa0\xc2\xc4s\xbe\x85\v\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf5\xb0h\x98\x9d\xf2\x9c%5w\xd0@Z\xden\x0eu(\xf8\x9e\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\xf5\xb6\xe9\x06\x1aN\xb0\x96\x16\aw\xe2gb\xcfH\xbd\u0635]\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4\xf5\xcf\xfb\xbabN~\xb3!\xbc\x83\xc6\f\xa6\x81\x99\xb4\xe3fq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf5\xd1ER\xb1\xdc\xe0\xd6\xdc\x1f2\r\xa6\xff\u02231\xcdo\f\x89Hz\x9a0E9D\x00\x00\xe0\x94\xf5\xd6\x1a\xc4\u0295G^[{\xff\xd5\xf2\xf6\x90\xb3\x16u\x96\x15\x8a\x06\x92\xae\x88\x97\b\x1d\x00\x00\x00\u07d4\xf5\xd9\xcf\x00\xd6X\xddEQzH\xa9\xd3\xf5\xf63T\x1aS=\x89\x06O_\xdfIOx\x00\x00\u07d4\xf5\xea\xdc\xd2\u0478ez\x12\x1f3\xc4X\xa8\xb1>v\xb6U&\x89\r\x8b\x0fZZ\xc2J\x00\x00\u07d4\xf6\a\xc2\x15\r>\x1b\x99\xf2O\xa1\xc7\xd5@\xad\xd3\\N\xbe\x1e\x89\xa7\xf1\xaa\a\xfc\x8f\xaa\x00\x00\u07d4\xf6\v\xd75T>k\xfd.\xa6\xf1\x1b\xffbs@\xbc\x03Z#\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf6\f\x1bE\xf1d\xb9X\x0e 'Z\\9\xe1\xd7\x1e5\xf8\x91\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xf6\x0fb\xd797\x95?\xef5\x16\x9e\x11\xd8r\xd2\xea1~\xec\x8a\x01!\xeah\xc1\x14\xe5\x10\x00\x00\u07d4\xf6\x12\x83\xb4\xbd\x85\x04\x05\x8c\xa3`\u94d9\x9bb\xcb\xc8\xcdg\x89\r\xd2\xd5\xfc\xf3\xbc\x9c\x00\x00\u07d4\xf6\x17\xb9g\xb9\xbdH_v\x95\xd2\xefQ\xfbw\x92\u0618\xf5\x00\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf6\x18\u0671\x04A\x14\x80\xa8c\xe6#\xfcU#-\x1aOH\xaa\x89\x0eh\x9emD\xb1f\x80\x00\u07d4\xf6\"\u5126b>\xaa\xf9\x9f+\xe4\x9eS\x80\xc5\xcb\xcf\\\u0609\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf62\xad\xffI\r\xa4\xb7-\x126\xd0KQ\x0ft\xd2\xfa\xa3\u0349K\xe4\xe7&{j\xe0\x00\x00\u07d4\xf69\xac1\u069fg'\x1b\xd1\x04\x02\xb7eN\\\xe7c\xbdG\x89\x15\xaf\x0fB\xba\xf9&\x00\x00\u07d4\xf6:W\x9b\xc3\xea\u00a9I\x04\x10\x12\x8d\xbc\xeb\xe6\xd9\u0782C\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\xf6E\xdd|\x89\x00\x93\xe8\xe4\u022a\x92\xa6\xbb55\"\xd3\u0718\x89\aC\x9f\xa2\t\x9eX\x00\x00\xe0\x94\xf6H\xea\x89\xc2u%q\x01r\x94Ny\xed\xff\x84x\x03\xb7u\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xf6JJ\xc8\xd5@\xa9(\x9ch\xd9`\xd5\xfb|\xc4Zw\x83\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf6N\xcf!\x17\x93\x1cmSZ1\x1eO\xfe\xae\xf9\u0514\x05\xb8\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xf6O\xe0\x93\x9a\x8d\x1e\xea*\x0e\u035a\x970\xfdyX\xe31\t\x89\x01\x1d\xe1\xe6\xdbE\f\x00\x00\u07d4\xf6V\x16\xbe\x9c\x8by~t\x15\"|\x918\xfa\xa0\x89\x17B\u05c9*\xd3s\xcef\x8e\x98\x00\x00\u07d4\xf6W\xfc\xbeh.\xb4\xe8\xdb\x15.\u03c9$V\x00\vQ=\x15\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xf6X\x19\xacL\xc1L\x13\u007f\x05\xddyw\xc7\xda\xe0\x8d\x1aJ\xb5\x89\x05\x87\x88\u02d4\xb1\xd8\x00\x00\u07d4\xf6{\xb8\xe2\x11\x8b\xbc\u0550'fn\xed\xf6\x94>\xc9\xf8\x80\xa5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf6\x84d\xbfd\xf2A\x13V\xe4\xd3%\x0e\xfe\xfe\\P\xa5\xf6[\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf6\x86x[\x89r\va\x14_\ua017\x8dj\u030e\v\xc1\x96\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf6\x8c^3\xfa\x97\x13\x9d\xf5\xb2\xe68\x86\xce4\xeb\xf3\u45dc\x89\xb3\xfaAi\xe2\xd8\xe0\x00\x00\u07d4\xf6\xa8cWW\xc5\xe8\xc14\xd2\r\x02\x8c\xf7x\u03c6\t\xe4j\x89O\x1dw/\xae\xc1|\x00\x00\u07d4\xf6\xb7\x82\xf4\xdc\xd7E\xa6\xc0\xe2\xe00`\x0e\x04\xa2K%\xe5B\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xf6\xbc7\xb1\u04a3x\x8dX\x9bm\xe2\x12\xdc\x17\x13\xb2\xf6\u738a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xf6\xc3\u010a\x1a\xc0\xa3G\x99\xf0M\xb8n\u01e9u\xfewh\xf3\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf6\xd2]?=\x84m#\x9fR_\xa8\xca\xc9{\xc45x\u06ec\x890\x92\u007ft\xc9\xde\x00\x00\x00\u07d4\xf6\xea\xacp2\u0512\xef\x17\xfd`\x95\xaf\xc1\x1dcOV\xb3\x82\x89\x1b\x1bk\u05efd\xc7\x00\x00\xe0\x94\xf6\xea\xd6}\xbf[~\xb13X\xe1\x0f6\x18\x9dS\xe6C\xcf\u03ca\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xf6\xf1\xa4C\t\x05\x1ck%\xe4}\xff\x90\x9b\x17\x9b\xb9\xabY\x1c\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xf7\x03(\xef\x97b_\xe7E\xfa\xa4\x9e\xe0\xf9\u052a;\r\xfbi\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf7\n\x99\x8aq{3\x8d\x1d\u0658T@\x9b\x1a3\x8d\ue930\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7\rcz\x84\\\x06\xdbl\u0711\xe67\x1c\xe7\xc48\x8ab\x8e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7\x15R\x13D\x98\x92tK\xc6\x0f.\x04@\a\x88\xbd\x04\x1f\u0749\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\xe0\x94\xf7\x1bE4\xf2\x86\xe40\x93\xb1\xe1^\xfe\xa7I\xe7Y{\x8bW\x8a\x16\x1c\x13\xd34\x1c\x87(\x00\x00\u07d4\xf74\xec\x03rM\xde\xe5\xbbRy\xaa\x1a\xfc\xf6\x1b\f\xb4H\xa1\x89\xe5\xbf,\u0270\x97\x80\x00\x00\u07d4\xf76\u0716v\x00\x128\x8f\xe8\x8bf\xc0n\xfeW\xe0\xd7\xcf\n\x89q\xd7Z\xb9\xb9 P\x00\x00\u07d4\xf7:\xc4l ;\xe1S\x81\x11\xb1Q\xec\x82 \u01c6\xd8AD\x89\x0f\xf77x\x17\xb8+\x80\x00\u07d4\xf7=\xd9\xc1B\xb7\x1b\xce\x11\xd0n0\xe7\xe7\xd02\xf2\uc71e\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf7A\x8a\xa0\xe7\x13\xd2H\"\x87v\xb2\xe7CB\"\xaeu\u3949lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7Nn\x14S\x82\xb4\u06c2\x1f\xe0\xf2\u0643\x88\xf4V\t\u019f\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf7P\f\x16o\x8b\xea/\x824v\x06\xe5\x02K\xe9\xe4\xf4\u0399\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7W\xfc\x87 \xd3\xc4\xfaRw\a^`\xbd\\A\x1a\xeb\xd9w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7[\xb3\x9cy\x97y\xeb\xc0J3m&\r\xa61F\xed\x98\u0409\x01Z\xf1\u05cbX\xc4\x00\x00\xe0\x94\xf7h\xf3!\xfdd3\xd9kO5M<\xc1e,\x172\xf5\u007f\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf7oi\xce\xe4\xfa\xa0\xa6;0\xae\x1ex\x81\xf4\xf7\x15ep\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf7w6\x1a=\u062bb\xe5\xf1\xb9\xb0GV\x8c\xc0\xb5UpL\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf7|{\x84QI\xef\xba\x19\xe2a\xbc|u\x15y\b\xaf\xa9\x90\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7\u007f\x95\x87\xffz-r\x95\xf1\xf5q\u0206\xbd3\x92jR|\x89lh\xcc\u041b\x02,\x00\x00\u07d4\xf7\x82X\xc1$\x81\xbc\xdd\u06f7*\x8c\xa0\xc0C\tra\xc6\u0149\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7\x98\xd1m\xa4\xe4`\xc4`\xcdH_\xae\x0f\xa0Y\x97\b\ub08965\u026d\xc5\u07a0\x00\x00\u07d4\xf7\xa1\xad\xe2\xd0\xf5)\x12=\x10U\xf1\x9b\x17\x91\x9fV!Ng\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf7\xac\xff\x93K\x84\xda\ti\xdc7\xa8\xfc\xf6C\xb7\xd7\xfb\xedA\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xf7\xb1Q\xcc^W\x1c\x17\xc7e9\xdb\xe9\x96L\xbbo\xe5\xdey\x89tq|\xfbh\x83\x10\x00\x00\u07d4\xf7\xb2\x9b\x82\x19\\\x88-\xabx\x97\u00ae\x95\xe7w\x10\xf5xu\x89w5Aa2\xdb\xfc\x00\x00\u07d4\xf7\xbcLD\x91\rZ\xed\xd6n\xd25U8\xa6\xb1\x93\xc3a\xec\x89\x05A\xde,-\x8db\x00\x00\u07d4\xf7\xc0\f\xdb\x1f\x02\x03\x10\u056c\xab{Ij\xaaD\xb7y\b^\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xf7\xc1\xb4C\x96\x8b\x11{]\u0677UW/\xcd9\xca^\xc0K\x89\x18\xb9h\u0092\xf1\xb5\x00\x00\xe0\x94\xf7\xc5\x0f\x92*\xd1ka\xc6\u047a\xa0E\xed\x81h\x15\xba\u010f\x8a\x02\xa99j\x97\x84\xad}\x00\x00\u07d4\xf7\xc7\b\x01Pq\xd4\xfb\n:*\t\xa4]\x15c\x96\xe34\x9e\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xf7\xcb\u06e6\xbel\xfeh\xdb\xc2<+\x0f\xf50\xee\x05\"o\x84\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7\xd0\xd3\x10\xac\xea\x18@a8\xba\xaa\xbb\xfe\x05q\xe8\r\xe8_\x89Hz\x9a0E9D\x00\x00\u07d4\xf7\u05ef LV\xf3\x1f\xd9C\x98\xe4\r\xf1\x96K\u063f\x12<\x89\b!\xd2!\xb5)\x1f\x80\x00\u07d4\xf7\xdc%\x11\x96\xfb\u02f7|\x94}|\x19F\xb0\xffe\x02\x1c\xea\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xf7\xe4Z\x12\xaaq\x1cp\x9a\xce\xfe\x95\xf3;xa-*\xd2*\x8a\x0e\x06U\xe2\xf2k\xc9\x18\x00\x00\u07d4\xf7\xf4\x89\x8cLRm\x95_!\xf0U\xcbnG\xb9\x15\xe5\x19d\x89|\b`\xe5\xa8\r\xc0\x00\x00\u07d4\xf7\xf9\x1ez\xcb[\x81)\xa3\x06\x87|\xe3\x16\x8eoC\x8bf\xa1\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4\xf7\xfcE\xab\xf7oP\x88\xe2\u5d68\xd12\xf2\x8aMN\xc1\xc0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\x06:\xf4\xcc\x1d\xd9a\x9a\xb5\u063f\xf3\xfc\xd1\xfa\xa8H\x82!\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\bnBf\x1e\xa9)\xd2\u0761\xablt\x8c\xe3\x05]\x11\x1e\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xf8\bw\x86\xb4-\xa0N\xd6\xd1\xe0\xfe&\xf6\xc0\xee\xfe\x1e\x9fZ\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf8\r6\x19p/\xa5\x83\x8cH9\x18Y\xa89\xfb\x9c\xe7\x16\x0f\x89l\a\xa7\u0471np\x00\x00\u07d4\xf8\x14y\x9fm\xdfM\xcb)\xc7\xee\x87\x0eu\xf9\xcc-52m\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf8\x15\xc1\n\x03-\x13\xc3K\x89v\xfan;\xd2\xc9\x13\x1a\x8b\xa9\x89Hz\x9a0E9D\x00\x00\u07d4\xf8\x16\"\xe5WW\xda\xeafu\x97]\xd958\xda}\x16\x99\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8$\xee3\x1eJ\xc3\xccXv\x939[W\xec\xf6%\xa6\xc0\u0089V\xc9]\xe8\xe8\xca\x1d\x00\x00\u07d4\xf8'\xd5n\xd2\xd3' \u052b\xf1\x03\xd6\xd0\xefM;\xcdU\x9b\x89\x01l\x80\x06W\x91\xa2\x80\x00\u07d4\xf8)\x85\x91R>P\xb1\x03\xf0\xb7\x01\xd6#\xcb\xf0\xf7EV\xf6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf8H\xfc\xe9\xaba\x1c}\x99 n#\xfa\u019a\u0508\xb9O\xe1\x89\x02\xa1\x12\x9d\t6r\x00\x00\u07d4\xf8O\t\n\xdf?\x8d\xb7\u1533P\xfb\xb7u\x00i\x9ff\xfd\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf8Q\xb0\x10\xf63\xc4\n\xf1\xa8\xf0js\ubeabe\az\xb5\x89\xee\x86D/\xcd\x06\xc0\x00\x00\u07d4\xf8X\x17\x1a\x04\xd3W\xa1;IA\xc1n~U\xdd\u0514\x13)\x89\x02F\xa5!\x8f*\x00\x00\x00\u07d4\xf8[\xab\x1c\xb3q\x0f\xc0_\xa1\x9f\xfa\xc2.gR\x1a\v\xa2\x1d\x89l\x955\u007f\xa6\xb3l\x00\x00\u07d4\xf8j>\xa8\a\x1fp\x95\xc7\u06ca\x05\xaePz\x89)\u06f8v\x89\x126\xef\xcb\u02f3@\x00\x00\u07d4\xf8pL\x16\xd2\xfd[\xa3\xa2\xc0\x1d\x0e\xb2\x04\x84\xe6\xec\xfa1\t\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf8p\x99_\xe1\xe5\"2\x1duC7\xa4\\\f\x9d{8\x95\x1c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf8s\xe5ze\xc9;n\x18\xcbu\xf0\xdc\a}[\x893\xdc\\\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xf8ua\x9d\x8a#\xe4]\x89\x98\u0444\u0500\xc0t\x89p\x82*\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf8{\xb0{(\x9d\xf70\x1eT\xc0\xef\xdaj,\xf2\x91\xe8\x92\x00\x89K\xe4\xe7&{j\xe0\x00\x00\u0794\xf8\x89\x00\xdbsyU\xb1Q\x9b\x1a}\x17\n\x18\x86L\xe5\x90\xeb\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xf8\x8bX\xdb7B\vFL\v\xe8\x8bE\xee+\x95)\x0f\x8c\xfa\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xf8\x96+u\xdb]$\xc7\xe8\xb7\xce\xf1\x06\x8c>g\u03bb0\xa5\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xf8\xa0e\xf2\x87\xd9\x1dw\xcdbj\xf3\x8f\xfa\"\r\x9bU*+\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xf8\xa4\x9c\xa29\f\x1fm\\\x0ebQ;\a\x95qt?|\u0189\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xf8\xa5\f\xee.h\x8c\xee\u3b24\u0522\x97%\xd4\a,\u0103\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xacJ9\xb5<\x110x \x97;D\x13e\xcf\xfeYof\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xae\x85{g\xa4\xa2\x89:?\xbe|z\x87\xff\x1c\x01\u01a6\xe7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf8\xbf\x9c\x04\x87NZw\xf3\x8fL8R~\x80\xc6v\xf7\xb8\x87\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xc7\xf3J8\xb3\x18\x01\xdaC\x064w\xb1+'\xd0\xf2\x03\xff\x89\x1a\u04ba\xbao\xefH\x00\x00\u07d4\xf8\xca3l\x8e\x91\xbd \xe3\x14\xc2\v-\xd4`\x8b\x9c\x8b\x94Y\x89-\u071b\u0173,x\x00\x00\u07d4\xf8\xd1t$\xc7g\xbe\xa3\x12\x05s\x9a+W\xa7'r\x14\uef89\x02F\xdd\xf9yvh\x00\x00\u07d4\xf8\xd5-\xcc_\x96\xcc(\x00{>\u02f4\t\xf7\xe2*dl\xaa\x89\b\x16\x90\xe1\x81(H\x00\x00\u07d4\xf8\xdc\xe8g\xf0\xa3\x9c[\xef\x9e\xeb\xa6\t\"\x9e\xfa\x02g\x8bl\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xf2&\x14*B\x844\xab\x17\xa1\x86J%\x97\xf6J\xab/\x06\x89\tY\x8b/\xb2\xe9\xf2\x80\x00\u07d4\xf8\xf6d^\r\xeedK=\xad\x81\xd5q\uf6ef\x84\x00!\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf9\x01\xc0\x0f\xc1\u06c8\xb6\x9cK\xc3%+\\\xa7\x0e\xa6\xee\\\xf6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf9=[\xcb\x06D\xb0\xcc\xe5\xfc\u0763C\xf5\x16\x8f\xfa\xb2\x87}\x89\vb\a\xb6}&\xf9\x00\x00\u07d4\xf9W\x0e\x92L\x95\u07bbpa6\x97\x92\xcf.\xfe\u00a8-^\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf9d \x86\xb1\xfb\xaea\xa6\x80M\xbe_\xb1^\xc2\u04b57\xf4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf9d\x88i\x85\x90\xdc;,UVB\xb8q4\x8d\xfa\x06z\u0549\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf9d\u064d(\x170\xba5\xb2\xe3\xa3\x14yn{B\xfe\xdfg\x89S\xb0\x87`\x98\xd8\f\x00\x00\u07d4\xf9e\ri\x89\xf1\x99\xab\x1c\xc4ycm\xed0\xf2A\x02\x1fe\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\xe0\x94\xf9h\x83X$Y\x90\x8c\x82v'\xe8o(\xe6F\xf9\xc7\xfcz\x8a\x01\u0127\x877\xcd\u03f8\x00\x00\u07d4\xf9kL\x00voSsj\x85t\xf8\"\xe6GL/!\xda-\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf9r\x9dH(,\x9e\x87\x16m^\xef-\x01\xed\xa9\xdb\xf7\x88!\x89\x05k\x83\xdd\xc7(T\x80\x00\u07d4\xf9v~N\xcbJY\x80Ru\b\u05fe\xc3\xd4^Ld\x9c\x13\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\xf9x\xb0%\xb6B3U\\\xc3\xc1\x9a\xda\u007fA\x99\xc94\x8b\xf7\x8aT\xb4\v\x1f\x85+\xda\x00\x00\x00\u07d4\xf9{V\xeb\u0577z\xbc\x9f\xba\u02eb\u0514\xb9\xd2\xc2!\xcd\x03\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf9\x81\x1f\xa1\x9d\xad\xbf\x02\x9f\x8b\xfeV\x9a\xdb\x18\"\x8c\x80H\x1a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf9\x82Ps\fLa\xc5\u007f\x12\x985\xf2h\b\x94yEB\xf3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xf9\x894gr\x99^\xc1\x90o\xaf\xfe\xba*\u007f\xe7\u079ck\xab\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xf9\x98\xca4\x11s\nl\xd1\x0etU\xb0A\x0f\xb0\xf6\xd3\xff\x80\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf9\x9a\xeeDKW\x83\xc0\x93\xcf\xff\xd1\xc4c,\xf9\x90\x9f\xbb\x91\x1d/\x81\x92\xf8B\t\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xf9\xbf\xb5\x9dS\x8a\xfcHt\xd4\xf5\x94\x1b\b\xc9s\x0e8\xe2K\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xf9\xdd#\x90\b\x18/\xb5\x19\xfb0\xee\xdd \x93\xfe\xd1c\x9b\xe8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf9\u07ba\xec\xb5\xf39\xbe\xeaH\x94\xe5 K\xfa4\r\x06\u007f%\x89ZB\x84Fs\xb1d\x00\x00\xe0\x94\xf9\xe3tG@lA!\x97\xb2\u2bbc\x00\x1dn0\u024c`\x8a\x01\xc4y\xbbCI\xc0\xee\x00\x00\u07d4\xf9\xe7\"/\xaa\xf0\xf4\xda@\xc1\u0124\x0607:\t\xbe\u05f6\x89\x9bO\u0730\x94V$\x00\x00\u07d4\xf9\xec\xe0\"\xbc\xcd,\x924i\x11\xe7\x9d\xd5\x03\x03\xc0\x1e\x01\x88\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfa\x00\xc3v\xe8\x9c\x05\u81c1z\x9d\xd0t\x8d\x96\xf3A\xaa\x89\x89\x10M\r\x00\u04b7\xf6\x00\x00\u07d4\xfa\f\x1a\x98\x8c\x8a\x17\xad5(\xeb(\xb3@\x9d\xaaX\"_&\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xfa\x10_\x1a\x11\xb6\xe4\xb1\xf5`\x12\xa2y\"\xe2\xac-\xa4\x81/\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xfa\x14/\xe4~\u0697\xe6P;8k\x18\xa2\xbe\xdds\u0335\xb1\x89.\x15:\xd8\x15H\x10\x00\x00\u07d4\xfa\x14\xb5f#J\xbe\xe70B\xc3\x1d!qq\x82\u02e1J\xa1\x89\x11\xc7\xea\x16.x \x00\x00\u07d4\xfa\x19\xd6\xf7\xa5\x0fO\a\x98\x93\xd1g\xbf\x14\xe2\x1d\x00s\u0456\x89\x1c\xbb:?\xf0\x8d\b\x00\x00\u07d4\xfa\x1f\x19q\xa7u\xc3PO\xefPy\xf6@\xc2\u013c\xe7\xac\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfa'\x9b\xfd\x87g\xf9V\xbf\u007f\xa0\xbdV`\x16\x8d\xa7V\x86\xbd\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\xfa'\xccI\xd0\vl\x98s6\xa8u\xae9\xdaX\xfb\x04\x1b.\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xfa(2\x99`=\x87X\xe8\u02b0\x82\x12],\x8f}DT)\x8a\x01[\xca\xcb\x1e\x05\x01\xae\x80\x00\u07d4\xfa+\xbc\xa1]?\u37ca2\x8e\x91\xf9\r\xa1Oz\xc6%=\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xfa/\u049d\x03\xfe\xe9\xa0x\x93\xdf:&\x9fV\xb7/.\x1ed\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xfa3U2\x85\xa9sq\x9a\r_\x95o\xf8a\xb2\u061e\xd3\x04\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfa:\fK\x90?n\xa5.\xa7\xab{\x88c\xb6\xa6\x16\xadfP\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfa:\x1a\xa4H\x8b5\x1a\xa7V\f\xf5\xeec\n/\xd4\\2\"\x89/\xa4~j\xa74\r\x00\x00\u07d4\xfaA\tq\xad\"\x9c06\xf4\x1a\u03c5/*\u0259(\x19P\x89\u0633\x11\xa8\xdd\xfa|\x00\x00\u07d4\xfaD\xa8U\xe4\x04\xc8m\f\xa8\xef3$%\x1d\xfb4\x9cS\x9e\x89T\"S\xa1&\xce@\x00\x00\xe0\x94\xfaR\x01\xfe\x13B\xaf\x110{\x91B\xa0A$<\xa9./\t\x8a 8\x11j:\xc0C\x98\x00\x00\xe0\x94\xfa`\x86\x8a\xaf\xd4\xffL\\W\x91K\x8e\u054bBWs\u07e9\x8a\x01\xcf\xe5\xc8\b\xf3\x9f\xbc\x00\x00\u07d4\xfag\xb6{O7\xa0\x15\t\x15\x11\x0e\xde\a;\x05\xb8S\xbd\xa2\x89#\x19\xba\x94sq\xad\x00\x00\u07d4\xfah\xe0\xcb>\xdfQ\xf0\xa6\xf2\x11\u0272\xcb^\a<\x9b\xff\xe6\x89\x0f\xc969(\x01\xc0\x00\x00\xe0\x94\xfaj7\xf0\x18\xe9yg\x93\u007f\xc5\xe8a{\xa1\u05c6\xdd_w\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\xfav\x06C[5l\xee%{\xd2\xfc\xd3\xd9\xea\xcb<\xd1\xc4\xe1\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xfaz\xdff\v\x8d\x99\xce\x15\x93=|_\a/<\xbe\xb9\x9d3\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\xfa\x86\xca'\xbf(T\u0648p\x83\u007f\xb6\xf6\xdf\xe4\xbfdS\xfc\x89\x11u~\x85%\xcf\x14\x80\x00\u07d4\xfa\x8c\xf4\xe6'i\x8c]W\x88\xab\xb7\x88\x04\x17\xe7P#\x13\x99\x89\xe6\x1a6\x96\xee\xf6\x10\x00\x00\u07d4\xfa\x8e;\x1f\x13C9\x00s}\xaa\xf1\xf6)\x9cH\x87\xf8[_\x89&\u009eG\u0104L\x00\x00\u07d4\xfa\x9e\xc8\xef\xe0\x86\x86\xfaX\xc1\x813Xr\xbai\x85`\ucac9lj\xccg\u05f1\xd4\x00\x00\u07d4\xfa\xad\x90]\x84|{#A\x8a\xee\xcb\xe3\xad\u06cd\xd3\xf8\x92J\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xfa\xae\xba\x8f\xc0\xbb\xdaU<\xa7.0\xef=s.&\xe8 A\x89H\x8d(*\xaf\xc9\xf6\x80\x00\u07d4\xfa\xb4\x87P\r\xf2\x0f\xb8>\xbe\xd9\x16y\x1dV\x17r\xad\xbe\xbf\x89lkLM\xa6\u077e\x00\x00\u07d4\xfa\xc5\u0294u\x80x\xfb\xfc\xcd\x19\xdb5X\xda~\u8827h\x897(\xa6+\r\xcf\xf6\x00\x00\u07d4\xfa\xd9j\xb6\xacv\x8a\xd5\t\x94R\xacGw\xbd\x1aG\xed\u010f\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xfa\xe7g\x19\xd9~\xacA\x87\x04(\xe9@'\x9d\x97\xddW\xb2\xf6\x8a\x14\u06f2\x19\\\xa2(\x90\x00\x00\u07d4\xfa\u8053pG\x89Zf\f\xf2)v\x0f'\xe6h(\xd6C\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xfa\xe9,\x13p\xe9\u115a]\xf8;V\xd0\xf5\x86\xaa;@L\x89\x05\u0174\xf3\xd8C\x98\x00\x00\xe0\x94\xfa\xf5\xf0\xb7\xb6\xd5X\xf5\t\r\x9e\xa1\xfb-B%\x9cX`x\x8a\x01Z\xff\xb8B\fkd\x00\x00\xe0\x94\xfb\x12o\x0e\xc7i\xf4\x9d\xce\xfc\xa2\xf2\x00(dQX0\x84\xb8\x8a\x01\x0f\xcb\xc25\x03\x96\xbf\x00\x00\xe0\x94\xfb\x13^\xb1Z\x8b\xacr\xb6\x99\x154*`\xbb\xc0k~\a|\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xfb\"<\x1e\"\xea\xc1&\x9b2\xee\x15jS\x85\x92.\xd3o\xb8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfb7\xcfkO\x81\xa9\xe2\"\xfb\xa2.\x9b\xd2KP\x98\xb73\u03c9\x02\x1auJm\xc5(\x00\x00\u07d4\xfb8`\xf4\x12\x1cC.\xbd\xc8\xecj\x031\xb1\xb7\ty.\x90\x89 \x8c9J\xf1\u0208\x00\x00\u07d4\xfb9\x18\x9a\xf8v\xe7b\xc7\x1dl>t\x18\x93\xdf\"l\xed\u0589\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfb:\v\rkjq\x8fo\xc0)*\x82]\xc9$z\x90\xa5\u0409\n\xd6\xdd\x19\x9e\x97[\x00\x00\xe0\x94\xfb?\xa1\xac\b\xab\xa9\xcc;\xf0\xfe\x9dH8 h\x8fe\xb4\x10\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\xfb?\xe0\x9b\xb86\x86\x15)\xd7Q\x8d\xa2v5\xf58PV\x15\x89K\xe3\x92\x16\xfd\xa0p\x00\x00\xe0\x94\xfbQ%\xbf\x0f^\xb0\xb6\xf0 \xe5k\xfc/\xdf=@,\t~\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\xfbU\x18qL\xef\xc3m\x04\x86]\xe5\x91^\xf0\xffG\xdf\xe7C\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfb_\xfa\xa0\xf7aW&5x\x91GX\x18\x93\x9d 7\u03d6\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfbh\\\x15\xe49\x96^\xf6&\xbf\r\x83L\u0468\x9f+V\x95\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xfbtK\x95\x1d\tK1\x02b\xc8\xf9\x86\xc8`\u07da\xb1\xdee\x89\x02\xd1\xc5\x15\xf1\xcbJ\x80\x00\u07d4\xfby\xab\u06d2\\U\xb9\xf9\x8e\xfe\xefd\xcf\xc9\xeba\xf5\x1b\xb1\x89a@\xc0V\xfb\n\xc8\x00\x00\u07d4\xfb\x81\x13\xf9M\x91s\xee\xfdZ0s\xf5\x16\x80:\x10\xb2\x86\xae\x89\x04V9\x18$O@\x00\x00\u07d4\xfb\x84,\xa2\xc5\xef\x139\x17\xa26\xa0\u052c@i\x01\x10\xb08\x89\x10\x96\x9ab\xbe\x15\x88\x00\x00\u07d4\xfb\x91\xfb\x1aiUS\xf0\u018e!'m\xec\xf0\xb89\t\xb8m\x89\x05l\x006\x17\xafx\x00\x00\u07d4\xfb\x94s\xcfw\x125\n\x1f\xa09Rs\xfc\x80V\aR\xe4\xfb\x89\x06\xaf!\x98\xba\x85\xaa\x00\x00\xe0\x94\xfb\x94\x9cd\u007f\xdc\xfd%\x14\xc7\u054e1\xf2\x8aS-\x8cX3\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xfb\xa5HmS\xc6\xe2@IBA\xab\xf8~C\xc7`\rA:\x89k\xbfaIIH4\x00\x00\u07d4\xfb\xb1a\xfe\x87_\t)\nK&+\xc6\x01\x10\x84\x8f\r\"&\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfb\xbb\xeb\u03fe#^W\xdd#\x06\xad\x1a\x9e\u0141\xc7\xf9\xf4\x8f\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xfb\xc0\x1d\xb5NG\xcd\xc3\xc48iJ\xb7\x17\xa8V\xc2?\xe6\xe9\x8a\x01\xcaqP\xab\x17OG\x00\x00\xe0\x94\xfb\xcf\xccJ{\x0f&\xcf&\xe9\xf33!2\xe2\xfcj#\af\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xfb\xe7\x16\"\xbc\xbd1\xc1\xa3iv\xe7\xe5\xf6p\xc0\u007f\xfe\x16\u0789\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xfb\xed\xe3,4\x9f3\x00\xefL\xd3;M\xe7\xdc\x18\xe4C\xd3&\x89\xabM\xcf9\x9a:`\x00\x00\u07d4\xfb\xf2\x04\xc8\x13\xf86\xd89b\u01c7\fx\b\xca4\u007f\xd3>\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xfb\xf7Y3\xe0\x1bu\xb1T\xef\x06i\ak\xe8\u007fb\xdf\xfa\xe1\x8a\x10\x84cr\xf2I\xd4\xc0\x00\x00\u07d4\xfc\x00\x96\xb2\x1e\x95\xac\xb8\xd6\x19\xd1v\xa4\xa1\xd8\xd5)\xba\xdb\xef\x89\x14\xd9i;\xcb\xec\x02\x80\x00\xe0\x94\xfc\x00\xa4 \xa3a\a\xdf\xd5\xf4\x95\x12\x8a_\u5af2\xdb\x0f4\x8a\x01C\x17\x9d\x86\x91\x10 \x00\x00\xe0\x94\xfc\x01\x8ai\n\xd6tm\xbe:\u03d7\x12\xdd\xcaR\xb6%\x009\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xfc\x02s@3\xe5\u007fpQ~\n\xfc~\xe6$a\xf0o\xad\x8e\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xfc\x0e\xe6\xf7\u00b3qJ\xe9\x91lEVf\x05\xb6V\xf3$A\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xfc\x10\xb7\xa6{2h\xd53\x1b\xfbj\x14\xde\xf5\xeaJ\x16,\xa3\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xfc\x15\u02d9\xa8\xd1\x03\v\x12w\n\xdd\x03:y\xee\r\f\x90\x8c\x89\x12\xfa\x00\xbdR\xe6$\x00\x00\u07d4\xfc)R\xb4\u011f\xed\u043c\x05(\xa3\bI^mj\x1cq\u0589lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xfc,\x1f\x88\x96\x1d\x01\x9c>\x9e\xa30\t\x15.\x06\x93\xfb\xf8\x8a\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94\xfc6\x11\x05\u0750\xf9\xed\xe5fI\x9di\xe9\x13\x03\x95\xf1*\u020aS\xa4\xfe/ N\x80\xe0\x00\x00\u07d4\xfc7/\xf6\x92|\xb3\x96\xd9\xcf)\x805\x00\x11\r\xa62\xbcR\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfc9\xbeA\tK\x19\x97\xd2\x16\x9e\x82d\xc2\u00fa\xa6\u025b\u0109lk\x93[\x8b\xbd@\x00\x00\u07d4\xfc=\"k\xb3jX\xf5&V\x88W\xb0\xbb\x12\xd1\t\xec\x93\x01\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfcC\x82\x9a\u01c7\xff\x88\xaa\xf1\x83\xba5*\xad\xbfZ\x15\xb1\x93\x89\u05ac\n+\x05R\xe0\x00\x00\u07d4\xfcI\xc1C\x9aA\u05b3\xcf&\xbbg\xe06R$\xe5\xe3\x8f_\x8966\u05ef^\u024e\x00\x00\u07d4\xfcU\x00\x82Q\x05\xcfq*1\x8a^\x9c;\xfci\u021d\f\x12\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xfcf\xfa\xba'\u007fK]\xe6J\xd4^\xb1\x9c1\xe0\f\xed>\u054a\x011\xbe\xb9%\xff\xd3 \x00\x00\xe0\x94\xfc~\"\xa5\x03\xecZ\xbe\x9b\b\xc5\v\xd1I\x99\xf5 \xfaH\x84\x8a\x01ZG}\xfb\xe1\xea\x14\x80\x00\u07d4\xfc\x82\x15\xa0\xa6\x99\x13\xf6*C\xbf\x1c\x85\x90\xb9\xdd\xcd\r\x8d\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xfc\x98\x9c\xb4\x87\xbf\x1a}\x17\xe4\xc1\xb7\u0137\xaa\xfd\xdak\n\x8d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xfc\x9b4td\xb2\xf9\x92\x9d\x80~\x03\x9d\xaeH\xd3\u064d\xe3y\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\xfc\xa4;\xbc#\xa0\xd3!\xba\x9eF\xb9)s\\\xe7\xd8\xef\f\x18\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfc\xa7>\xff\x87q\xc0\x10;\xa3\xcc\x1a\x9c%\x94H\xc7*\xbf\v\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfc\xad\xa3\x00(?k\xcc\x13J\x91Eg`\xb0\xd7}\xe4\x10\xe0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xfc\xbc\\q\xac\xe7\x97AE\v\x01,\xf6\xb8\xd3\xf1}\xb6\x8ap\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xfc\xbd\x85\xfe\xeajuO\xcf4ID\x9e7\xff\x97\x84\xf7w<\x89\xa7J\xdai\xab\xd7x\x00\x00\xe0\x94\xfc\xc9\u0524&.z\x02z\xb7Q\x91\x10\xd8\x02\u0115\xce\xea9\x8a\x01YQ\x82\"K&H\x00\x00\xe0\x94\xfc\xcd\r\x1e\xce\xe2z\xdd\xea\x95\xf6\x85z\xee\xc8\u01e0K(\xee\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xfc\u0434\x82|\xd2\b\xff\xbf^u\x9d\xba\x8c<\xc6\x1d\x8c,<\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xfc\xe0\x89c\\\xe9z\xba\xc0kD\x81\x9b\xe5\xbb\n>.\v7\x89\x05\x03\x92\nv0\xa7\x80\x00\u07d4\xfc\xf1\x99\xf8\xb8T\"/\x18.N\x1d\t\x9dN2>*\xae\x01\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfc\xfc:P\x04\xd6xa?\v6\xa6B&\x9a\u007f7\x1c?j\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfd\x19\x1a5\x15}x\x13s\xfbA\x1b\xf9\xf2R\x90\x04|^\xef\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfd\x1f\xaa4{\x0f\u0300L-\xa8l6\xd5\xf1\u044bp\x87\xbb\x89\x02\xd6\xeb$z\x96\xf6\x00\x00\u07d4\xfd\x1f\xb5\xa8\x9a\x89\xa7!\xb8yph\xfb\xc4\u007f>\x9dR\xe1I\x89\f\u0435\x83\u007f\xc6X\x00\x00\u07d4\xfd OOJ\xba%%\xbar\x8a\xfd\xf7\x87\x92\xcb\u07b75\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd'W\xcc5Q\xa0\x95\x87\x8d\x97\x87V\x15\xfe\fj2\xaa\x8a\x89 m\xb1R\x99\xbe\xac\x00\x00\u07d4\xfd(r\u045eW\x85<\xfa\x16\xef\xfe\x93\u0431\xd4{O\x93\xfb\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfd))'\x1e\x9d \x95\xa2dv~{\r\xf5.\xa0\xd1\xd4\x00\x89\xa2\xa1\xeb%\x1bZ\xe4\x00\x00\u07d4\xfd7z8Rr\x90\f\xb46\xa3\xbbyb\xcd\xff\xe9?]\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd@$+\xb3Jp\x85^\xf0\xfd\x90\xf3\x80-\xec!6\xb3'\x89h\xa8u\a>)$\x00\x00\xe0\x94\xfdE,9i\xec\xe3\x80\x1cT \xf1\xcd\u02a1\xc7\x1e\xd2=\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xfdKU\x1fo\xdb\u0366\xc5\x11\xb5\xbb7\"P\xa6\xb7\x83\xe54\x89\x01\x1d\xe1\xe6\xdbE\f\x00\x00\u07d4\xfdK\x98\x95X\xae\x11\xbe\f;6\xe2\xd6\xf2\xa5J\x93C\xca.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfdM\xe8\xe3t\x8a(\x9c\xf7\xd0`Q}\x9d88\x8d\xb0\x1f\xb8\x89\r\x8drkqw\xa8\x00\x00\u07d4\xfdZc\x15\u007f\x91O\u04d8\uac5c\x13}\xd9U\v\xb7q\\\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xfd`\u04b5\xaf=5\xf7\xaa\xf0\u00d3\x05.y\xc4\xd8#\u0645\x89\x03\x0e\xb5\r.\x14\b\x00\x00\u07d4\xfdhm\xe5?\xa9\u007f\x99c\x9e%hT\x97 \xbcX\x8c\x9e\xfc\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xfd~\u078fR@\xa0eA\xebi\x9dx,/\x9a\xfb!p\xf6\x89Hz\x9a0E9D\x00\x00\u07d4\xfd\x81+\u019f\xb1p\xefW\xe22~\x80\xaf\xfd\x14\xf8\xe4\xb6\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd\x88\xd1\x14\"\x0f\b\x1c\xb3\xd5\xe1[\xe8\x15*\xb0sfWj\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xfd\x91\x856\xa8\xef\xa6\xf6\xce\xfe\x1f\xa1\x159\x95\xfe\xf5\xe3=;\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xfd\x92\x0fr&\x82\xaf\xb5\xafE\x1b\x05D\xd4\xf4\x1b;\x9dWB\x89~R\x05j\x12?<\x00\x00\u07d4\xfd\x95y\xf1\x19\xbb\xc8\x19\xa0+a\u3348\x03\xc9B\xf2M2\x89\x05\xb9~\x90\x81\xd9@\x00\x00\u07d4\xfd\xa0\xce\x153\a\a\xf1\v\xce2\x01\x17- \x18\xb9\xdd\xeat\x89\x02\xd0A\xd7\x05\xa2\xc6\x00\x00\xe0\x94\xfd\xa3\x04(\x19\xaf>f)\x00\xe1\xb9+CX\xed\xa6\xe9%\x90\x8a\x19\a\xa2\x84\u054fc\xe0\x00\x00\u07d4\xfd\xa6\x81\x0e\xa5\xac\x98]o\xfb\xf1\xc5\x11\xf1\xc1B\xed\xcf\xdd\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfd\xb39D\xf26\x06\x15\xe5\xbe#\x95w\u0221\x9b\xa5-\x98\x87\x89 \x9d\x92/RY\xc5\x00\x00\u07d4\xfd\xbaSY\xf7\xec;\xc7p\xacI\x97]\x84N\xc9qbV\xf1\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xfd\xc4\xd4vZ\x94/[\xf9i1\xa9\xe8\xccz\xb8\xb7W\xffL\x8a\x12lG\x8a\x0e>\xa8`\x00\x00\xe0\x94\xfd\xcd]\x80\xb1\x05\x89zW\xab\xc4xev\x8b)\x00RB\x95\x8a\x01Z\xf1\u05cbX\xc4\x00\x00\x00\u0794\xfd\xd1\x19_y}O5q}\x15\xe6\xf9\x81\n\x9a?\xf5T`\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xfd\xd5\x02\xa7N\x81;\u03e3U\xce\xda<\x17ojhq\xaf\u007f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xfd\u357c\vm\\\xbbL\x1d\x8f\xea>\vK\xffc^\x9d\xb7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd\xea\xac*\xcf\x1d\x13\x8e\x19\xf2\xfc?\x9f\xb7E\x92\xe3\ud04a\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xfd\xec\xc8-\xdf\xc5a\x92\xe2oV<=h\xcbTJ\x96\xbf\xed\x89\x17\xda:\x04\u01f3\xe0\x00\x00\u07d4\xfd\xf4#C\x01\x9b\v\fk\xf2`\xb1s\xaf\xab~E\xb9\xd6!\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xfd\xf4I\xf1\b\xc6\xfbOZ+\b\x1e\xed~E\u645eM%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd\xfda4\xc0J\x8a\xb7\xeb\x16\xf0\x06C\xf8\xfe\xd7\u06aa\ucc89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xfe\x00\xbfC\x99\x11\xa5S\x98-\xb68\x03\x92E\xbc\xf02\xdb\u0709\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xfe\x01n\xc1~\xc5\xf1\x0e;\xb9\x8f\xf4\xa1\xed\xa0E\x15v\x82\xab\x89\x14_T\x02\xe7\xb2\xe6\x00\x00\u07d4\xfe\x0e0\xe2\x14)\rt=\xd3\x0e\xb0\x82\xf1\xf0\xa5\"Z\xdea\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xfe!\v\x8f\x04\xdcmOv!j\xcf\xcb\u055b\xa8;\xe9\xb60\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfe\"\xa0\xb3\x88f\x8d\x1a\xe2d>w\x1d\xac\xf3\x8aCB#\u0309\xd8\xdb^\xbd{&8\x00\x00\u07d4\xfe6&\x88\x84_\xa2D\u0300~K\x110\xeb7A\xa8\x05\x1e\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfe8'\xd5v0\u03c7a\xd5\x12y{\v\x85\x8eG\x8b\xbd\x12\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfeA\x8bB\x1a\x9cm76\x02y\x04u\xd20>\x11\xa7Y0\x897\b\xba\xed=h\x90\x00\x00\u07d4\xfeBI\x12yP\xe2\xf8\x96\xec\x0e~.=\x05Z\xab\x10U\x0f\x89$=M\x18\"\x9c\xa2\x00\x00\xe0\x94\xfeM\x84\x03!o\xd5qW+\xf1\xbd\xb0\x1d\x00W\x89x\u0588\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xfeS\xb9I\x89\u0619d\xda aS\x95&\xbb\xe9y\xdd.\xa9\x89h\xa8u\a>)$\x00\x00\u07d4\xfeT\x9b\xbf\xe6G@\x18\x98\x92\x93%8\u06afF\u04b6\x1dO\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xfea]\x97\\\b\x87\xe0\xc9\x11>\xc7)\x84 \xa7\x93\xaf\x8b\x96\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xfee\xc4\x18\x8dy\"Wi\td D\xfd\xc5#\x95V\x01e\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfei\u007f\xf2,\xa5G\xbf\xc9^3\xd9`\xda`\\gc\xf3[\x89G\xd4\x11\x9f\xd9`\x94\x00\x00\u07d4\xfej\x89[y\\\xb4\xbf\x85\x90=<\xe0\x9cZ\xa49S\u04ff\x89\xb8Pz\x82\a( \x00\x00\u07d4\xfeo_B\xb6\x19;\x1a\xd1b\x06\u4bf5#\x9dM}\xb4^\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\xfep\x11\xb6\x98\xbf3q\x13-tE\xb1\x9e\xb5\xb0\x945j\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\x80\xe9#-\xea\xff\x19\xba\xf9\x98i\x88:K\xdf\x00\x04\xe5<\x89.b\xf2\ni\xbe@\x00\x00\u07d4\xfe\x8en6eW\r\xffz\x1b\xdaiz\xa5\x89\xc0\xb4\xe9\x02J\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\x8f\x1f\u072b\u007f\xbe\u0266\xa3\xfc\xc5\aa\x96\x00P\\6\xa3\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xfe\x91\xec\xcf+\xd5f\xaf\xa1\x16\x96\xc5\x04\x9f\xa8Lic\nR\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xfe\x96\xc4\xcd8\x15b@\x1a\xa3*\x86\xe6[\x9dR\xfa\x8a\xee'\x89\x8f\x1d\\\x1c\xae7@\x00\x00\u07d4\xfe\x98\xc6d\xc3\xe4G\xa9^i\xbdX!q\xb7\x17n\xa2\xa6\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfe\x9a\xd1.\xf0]m\x90&\x1f\x96\xc84\n\x03\x81\x97M\xf4w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\x9c\x0f\xff\xef\xb8\x03\b\x12V\xc0\xcfMfY\xe6\xd3>\xb4\xfb\x89R\xd5B\x80O\x1c\xe0\x00\x00\u07d4\xfe\x9c\xfc;\xb2\x93\u0772\x85\xe6%\xf3X/t\xa6\xb0\xa5\xa6\u0349j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xfe\x9e\x11\x97\u05d7JvH\xdc\u01e01\x12\xa8\x8e\xdb\xc9\x04]\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\xe0\x94\xfe\xac\xa2\xactbK\xf3H\xda\u0258QC\xcf\xd6R\xa4\xbeU\x8a\x05\x89\u007f\u02f0)\x14\b\x80\x00\u07d4\xfe\xad\x18\x03\xe5\xe77\xa6\x8e\x18G-\x9a\xc7\x15\xf0\x99L\u00be\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xfe\xb8\xb8\xe2\xafqj\xe4\x1f\xc7\xc0K\xcf)T\x01VF\x1ek\x89TQt\xa5(\xa7z\x00\x00\u07d4\xfe\xb9-0\xbf\x01\xff\x9a\x19\x01flUsS+\xfa\a\xee\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfe\xbc1s\xbc\x90r\x13cT\x00+{O\xb3\xbf\xc5?\"\xf1\x89\x14\x0e\xc8\x0f\xa7\xee\x88\x00\x00\u07d4\xfe\xbdH\xd0\xff\xdb\xd5el\xd5\xe6\x866:a\x14R(\xf2y\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xfe\xbd\x9f\x81\xcfx\xbd_\xb6\u0139\xa2K\xd4\x14\xbb\x9b\xfaLN\x89k\xe1\x0f\xb8\xedn\x13\x80\x00\u07d4\xfe\xc0o\xe2{D\u01c4\xb29n\xc9/{\x92:\xd1~\x90w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\xc1NT\x85\xde+>\xef^t\xc4aF\u06ceEN\x035\x89\t\xb4\x1f\xbf\x9e\n\xec\x00\x00\u07d4\xfe\xd8Gm\x10\u0544\xb3\x8b\xfag7`\x0e\xf1\x9d5\xc4\x1e\u0609b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xfe\xef;n\xab\xc9J\xff\xd31\f\x1cM\x0ee7^\x13\x11\x19\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfe\xf0\x9dp$?9\xed\x8c\xd8\x00\xbf\x96QG\x9e\x8fJ\xca<\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xfe\xf3\xb3\u07ad\x1ai&\u051a\xa3+\x12\xc2*\xf5M\x9f\xf9\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xff\v|\xb7\x1d\xa9\xd4\xc1\xean\xcc(\xeb\xdaPLc\xf8/\u04498\x8a\x88]\xf2\xfcl\x00\x00\u07d4\xff\f\xc6\u73c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xff'&)AH\xb8lx\xa97$\x97\xe4Y\x89\x8e\xd3\xfe\xe3\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xff=\xedz@\u04ef\xf0\u05e8\xc4_\xa6\x13j\xa0C=\xb4W\x89lh\xcc\u041b\x02,\x00\x00\u07d4\xff>\xeeW\xc3Mm\xae\x97\r\x8b1\x11\x17\xc55\x86\xcd5\x02\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xff>\xf6\xba\x15\x1c!\xb5\x99\x86\xaed\xf6\xe8\"\x8b\u0262\xc73\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xffA\xd9\xe1\xb4\xef\xfe\x18\u0630\xd1\xf6?\xc4%_\xb4\xe0l=\x89Hz\x9a0E9D\x00\x00\u07d4\xffE\xcb4\xc9(6M\x9c\xc9\u063b\x0074ta\x8f\x06\xf3\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xffI\xa7u\x81N\xc0\x00Q\xa7\x95\xa8u\xde$Y.\xa4\x00\u050a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xffJ@\x8fP\xe9\xe7!F\xa2\x8c\xe4\xfc\x8d\x90'\x1f\x11n\x84\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xffM\x9c\x84\x84\xc4\x10T\x89H\xa4\x80\xc2?\x80\xc2@\x80\xc2A\x80\xc2B\x80\xc2C\x80\xc2D\x80\xc2E\x80\xc2F\x80\xc2G\x80\xc2H\x80\xc2I\x80\xc2J\x80\xc2K\x80\xc2L\x80\xc2M\x80\xc2N\x80\xc2O\x80\xc2P\x80\xc2Q\x80\xc2R\x80\xc2S\x80\xc2T\x80\xc2U\x80\xc2V\x80\xc2W\x80\xc2X\x80\xc2Y\x80\xc2Z\x80\xc2[\x80\xc2\\\x80\xc2]\x80\xc2^\x80\xc2_\x80\xc2`\x80\xc2a\x80\xc2b\x80\xc2c\x80\xc2d\x80\xc2e\x80\xc2f\x80\xc2g\x80\xc2h\x80\xc2i\x80\xc2j\x80\xc2k\x80\xc2l\x80\xc2m\x80\xc2n\x80\xc2o\x80\xc2p\x80\xc2q\x80\xc2r\x80\xc2s\x80\xc2t\x80\xc2u\x80\xc2v\x80\xc2w\x80\xc2x\x80\xc2y\x80\xc2z\x80\xc2{\x80\xc2|\x80\xc2}\x80\xc2~\x80\xc2\u007f\x80\u00c1\x80\x80\u00c1\x81\x80\u00c1\x82\x80\u00c1\x83\x80\u00c1\x84\x80\u00c1\x85\x80\u00c1\x86\x80\u00c1\x87\x80\u00c1\x88\x80\u00c1\x89\x80\u00c1\x8a\x80\u00c1\x8b\x80\u00c1\x8c\x80\u00c1\x8d\x80\u00c1\x8e\x80\u00c1\x8f\x80\u00c1\x90\x80\u00c1\x91\x80\u00c1\x92\x80\u00c1\x93\x80\u00c1\x94\x80\u00c1\x95\x80\u00c1\x96\x80\u00c1\x97\x80\u00c1\x98\x80\u00c1\x99\x80\u00c1\x9a\x80\u00c1\x9b\x80\u00c1\x9c\x80\u00c1\x9d\x80\u00c1\x9e\x80\u00c1\x9f\x80\u00c1\xa0\x80\u00c1\xa1\x80\u00c1\xa2\x80\u00c1\xa3\x80\u00c1\xa4\x80\u00c1\xa5\x80\u00c1\xa6\x80\u00c1\xa7\x80\u00c1\xa8\x80\u00c1\xa9\x80\u00c1\xaa\x80\u00c1\xab\x80\u00c1\xac\x80\u00c1\xad\x80\u00c1\xae\x80\u00c1\xaf\x80\u00c1\xb0\x80\u00c1\xb1\x80\u00c1\xb2\x80\u00c1\xb3\x80\u00c1\xb4\x80\u00c1\xb5\x80\u00c1\xb6\x80\u00c1\xb7\x80\u00c1\xb8\x80\u00c1\xb9\x80\u00c1\xba\x80\u00c1\xbb\x80\u00c1\xbc\x80\u00c1\xbd\x80\u00c1\xbe\x80\u00c1\xbf\x80\u00c1\xc0\x80\u00c1\xc1\x80\u00c1\u0080\u00c1\u00c0\u00c1\u0100\u00c1\u0140\u00c1\u0180\u00c1\u01c0\u00c1\u0200\u00c1\u0240\u00c1\u0280\u00c1\u02c0\u00c1\u0300\u00c1\u0340\u00c1\u0380\u00c1\u03c0\u00c1\u0400\u00c1\u0440\u00c1\u0480\u00c1\u04c0\u00c1\u0500\u00c1\u0540\u00c1\u0580\u00c1\u05c0\u00c1\u0600\u00c1\u0640\u00c1\u0680\u00c1\u06c0\u00c1\u0700\u00c1\u0740\u00c1\u0780\u00c1\u07c0\u00c1\xe0\x80\u00c1\xe1\x80\u00c1\xe2\x80\u00c1\xe3\x80\u00c1\xe4\x80\u00c1\xe5\x80\u00c1\xe6\x80\u00c1\xe7\x80\u00c1\xe8\x80\u00c1\xe9\x80\u00c1\xea\x80\u00c1\xeb\x80\u00c1\xec\x80\u00c1\xed\x80\u00c1\xee\x80\u00c1\xef\x80\u00c1\xf0\x80\u00c1\xf1\x80\u00c1\xf2\x80\u00c1\xf3\x80\u00c1\xf4\x80\u00c1\xf5\x80\u00c1\xf6\x80\u00c1\xf7\x80\u00c1\xf8\x80\u00c1\xf9\x80\u00c1\xfa\x80\u00c1\xfb\x80\u00c1\xfc\x80\u00c1\xfd\x80\u00c1\xfe\x80\u00c1\xff\x80\u3507KT\xa8\xbd\x15)f\xd6?pk\xae\x1f\xfe\xb0A\x19!\xe5\x8d\f\x9f,\x9c\xd0Ft\xed\xea@\x00\x00\x00" const rinkebyAllocData = "\xf9\x03\xb7\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xf6\x941\xb9\x8d\x14\x00{\xde\xe67)\x80\x86\x98\x8a\v\xbd1\x18E#\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -const devAllocData = "\xf9\x01\x94\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xf0\x94\x1a&3\x8f\r\x90^)_\u0337\x1f\xa9\ua11f\xfa\x12\xaa\xf4\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94.\xf4q\x00\xe0x{\x91Q\x05\xfd^?O\xf6u y\xd5\u02da\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94l8jK&\xf7<\x80/4g?rH\xbb\x11\x8f\x97BJ\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94\xb9\xc0\x15\x91\x8b\u06ba$\xb4\xff\x05z\x92\xa3\x87=n\xb2\x01\xbe\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94\xcd*=\x9f\x93\x8e\x13\u0354~\xc0Z\xbc\u007f\xe74\u07cd\xd8&\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94\xdb\xdb\xdb,\xbd#\xb7\x83t\x1e\x8d\u007f\xcfQ\xe4Y\xb4\x97\u499a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94\xe4\x15{4\xea\x96\x15\u03fd\xe6\xb4\xfd\xa4\x19\x82\x81$\xb7\fx\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x94\xe6qo\x95D\xa5lS\r\x86\x8eK\xfb\xac\xb1r1[\u07ad\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" diff --git a/core/genesis_test.go b/core/genesis_test.go index 482f861904..2fe931b244 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -65,7 +65,7 @@ func TestSetupGenesis(t *testing.T) { return SetupGenesisBlock(db, new(Genesis)) }, wantErr: errGenesisNoConfig, - wantConfig: params.AllProtocolChanges, + wantConfig: params.AllEthashProtocolChanges, }, { name: "no block in DB, genesis == nil", diff --git a/miner/worker.go b/miner/worker.go index bf24970f5c..c1f848e327 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -269,6 +269,11 @@ func (self *worker) update() { self.current.commitTransactions(self.mux, txset, self.chain, self.coinbase) self.currentMu.Unlock() + } else { + // If we're mining, but nothing is being processed, wake on new transactions + if self.config.Clique != nil && self.config.Clique.Period == 0 { + self.commitNewWork() + } } // System stopped diff --git a/params/config.go b/params/config.go index 18579666b6..345f6394ab 100644 --- a/params/config.go +++ b/params/config.go @@ -77,17 +77,22 @@ var ( }, } - // AllProtocolChanges contains every protocol change (EIPs) - // introduced and accepted by the Ethereum core developers. + // AllEthashProtocolChanges contains every protocol change (EIPs) introduced + // and accepted by the Ethereum core developers into the Ethash consensus. // - // This configuration is intentionally not using keyed fields. - // This configuration must *always* have all forks enabled, which - // means that all fields must be set at all times. This forces - // anyone adding flags to the config to also have to set these - // fields. - AllProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil} - TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil} - TestRules = TestChainConfig.Rules(new(big.Int)) + // This configuration is intentionally not using keyed fields to force anyone + // adding flags to the config to also have to set these fields. + AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil} + + // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced + // and accepted by the Ethereum core developers into the Clique consensus. + // + // This configuration is intentionally not using keyed fields to force anyone + // adding flags to the config to also have to set these fields. + AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, &CliqueConfig{Period: 0, Epoch: 30000}} + + TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil} + TestRules = TestChainConfig.Rules(new(big.Int)) ) // ChainConfig is the core config which determines the blockchain settings. diff --git a/params/config_test.go b/params/config_test.go index 487dc380c5..02c5fe2917 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -29,8 +29,8 @@ func TestCheckCompatible(t *testing.T) { wantErr *ConfigCompatError } tests := []test{ - {stored: AllProtocolChanges, new: AllProtocolChanges, head: 0, wantErr: nil}, - {stored: AllProtocolChanges, new: AllProtocolChanges, head: 100, wantErr: nil}, + {stored: AllEthashProtocolChanges, new: AllEthashProtocolChanges, head: 0, wantErr: nil}, + {stored: AllEthashProtocolChanges, new: AllEthashProtocolChanges, head: 100, wantErr: nil}, { stored: &ChainConfig{EIP150Block: big.NewInt(10)}, new: &ChainConfig{EIP150Block: big.NewInt(20)}, @@ -38,7 +38,7 @@ func TestCheckCompatible(t *testing.T) { wantErr: nil, }, { - stored: AllProtocolChanges, + stored: AllEthashProtocolChanges, new: &ChainConfig{HomesteadBlock: nil}, head: 3, wantErr: &ConfigCompatError{ @@ -49,7 +49,7 @@ func TestCheckCompatible(t *testing.T) { }, }, { - stored: AllProtocolChanges, + stored: AllEthashProtocolChanges, new: &ChainConfig{HomesteadBlock: big.NewInt(1)}, head: 3, wantErr: &ConfigCompatError{ From ca376ead88a5a26626a90abdb62f4de7f6313822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felf=C3=B6ldi=20Zsolt?= Date: Tue, 24 Oct 2017 15:19:09 +0200 Subject: [PATCH 228/272] les, light: LES/2 protocol version (#14970) This PR implements the new LES protocol version extensions: * new and more efficient Merkle proofs reply format (when replying to a multiple Merkle proofs request, we just send a single set of trie nodes containing all necessary nodes) * BBT (BloomBitsTrie) works similarly to the existing CHT and contains the bloombits search data to speed up log searches * GetTxStatusMsg returns the inclusion position or the pending/queued/unknown state of a transaction referenced by hash * an optional signature of new block data (number/hash/td) can be included in AnnounceMsg to provide an option for "very light clients" (mobile/embedded devices) to skip expensive Ethash check and accept multiple signatures of somewhat trusted servers (still a lot better than trusting a single server completely and retrieving everything through RPC). The new client mode is not implemented in this PR, just the protocol extension. --- core/bloombits/matcher.go | 51 ++++- core/bloombits/matcher_test.go | 9 +- core/chain_indexer.go | 69 ++++-- core/chain_indexer_test.go | 4 +- core/database_util.go | 15 +- core/tx_list.go | 10 +- core/tx_pool.go | 106 +++++++-- eth/backend.go | 4 +- eth/bloombits.go | 19 +- eth/filters/filter.go | 13 +- eth/filters/filter_system_test.go | 2 +- ethstats/ethstats.go | 2 +- les/api_backend.go | 9 +- les/backend.go | 79 +++++-- les/bloombits.go | 84 +++++++ les/handler.go | 354 +++++++++++++++++++++++++++--- les/handler_test.go | 162 +++++++++++++- les/helper_test.go | 10 +- les/odr.go | 46 +++- les/odr_requests.go | 324 ++++++++++++++++++++++----- les/odr_test.go | 11 +- les/peer.go | 133 ++++++++--- les/protocol.go | 64 +++++- les/request_test.go | 11 +- les/retrieve.go | 5 +- les/server.go | 198 +++++++---------- light/lightchain.go | 36 ++- light/nodeset.go | 141 ++++++++++++ light/odr.go | 48 ++-- light/odr_test.go | 4 +- light/odr_util.go | 121 ++++++---- light/postprocess.go | 295 +++++++++++++++++++++++++ trie/proof.go | 53 ++--- trie/proof_test.go | 52 +++-- 34 files changed, 2056 insertions(+), 488 deletions(-) create mode 100644 les/bloombits.go create mode 100644 light/nodeset.go create mode 100644 light/postprocess.go diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index e33de018a5..32a660337f 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -18,6 +18,7 @@ package bloombits import ( "bytes" + "context" "errors" "math" "sort" @@ -60,6 +61,8 @@ type Retrieval struct { Bit uint Sections []uint64 Bitsets [][]byte + Error error + Context context.Context } // Matcher is a pipelined system of schedulers and logic matchers which perform @@ -137,7 +140,7 @@ func (m *Matcher) addScheduler(idx uint) { // Start starts the matching process and returns a stream of bloom matches in // a given range of blocks. If there are no more matches in the range, the result // channel is closed. -func (m *Matcher) Start(begin, end uint64, results chan uint64) (*MatcherSession, error) { +func (m *Matcher) Start(ctx context.Context, begin, end uint64, results chan uint64) (*MatcherSession, error) { // Make sure we're not creating concurrent sessions if atomic.SwapUint32(&m.running, 1) == 1 { return nil, errors.New("matcher already running") @@ -149,6 +152,7 @@ func (m *Matcher) Start(begin, end uint64, results chan uint64) (*MatcherSession matcher: m, quit: make(chan struct{}), kill: make(chan struct{}), + ctx: ctx, } for _, scheduler := range m.schedulers { scheduler.reset() @@ -502,15 +506,28 @@ func (m *Matcher) distributor(dist chan *request, session *MatcherSession) { type MatcherSession struct { matcher *Matcher - quit chan struct{} // Quit channel to request pipeline termination - kill chan struct{} // Term channel to signal non-graceful forced shutdown - pend sync.WaitGroup + quit chan struct{} // Quit channel to request pipeline termination + kill chan struct{} // Term channel to signal non-graceful forced shutdown + ctx context.Context + err error + stopping bool + lock sync.Mutex + pend sync.WaitGroup } // Close stops the matching process and waits for all subprocesses to terminate // before returning. The timeout may be used for graceful shutdown, allowing the // currently running retrievals to complete before this time. -func (s *MatcherSession) Close(timeout time.Duration) { +func (s *MatcherSession) Close() { + s.lock.Lock() + stopping := s.stopping + s.stopping = true + s.lock.Unlock() + // ensure that we only close the session once + if stopping { + return + } + // Bail out if the matcher is not running select { case <-s.quit: @@ -519,10 +536,26 @@ func (s *MatcherSession) Close(timeout time.Duration) { } // Signal termination and wait for all goroutines to tear down close(s.quit) - time.AfterFunc(timeout, func() { close(s.kill) }) + time.AfterFunc(time.Second, func() { close(s.kill) }) s.pend.Wait() } +// setError sets an error and stops the session +func (s *MatcherSession) setError(err error) { + s.lock.Lock() + s.err = err + s.lock.Unlock() + s.Close() +} + +// Error returns an error if one has happened during the session +func (s *MatcherSession) Error() error { + s.lock.Lock() + defer s.lock.Unlock() + + return s.err +} + // AllocateRetrieval assigns a bloom bit index to a client process that can either // immediately reuest and fetch the section contents assigned to this bit or wait // a little while for more sections to be requested. @@ -618,9 +651,13 @@ func (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan case mux <- request: // Retrieval accepted, something must arrive before we're aborting - request <- &Retrieval{Bit: bit, Sections: sections} + request <- &Retrieval{Bit: bit, Sections: sections, Context: s.ctx} result := <-request + if result.Error != nil { + s.setError(result.Error) + } + s.DeliverSections(result.Bit, result.Sections, result.Bitsets) } } diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index 2e15e7aac0..0d8544136d 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -17,6 +17,7 @@ package bloombits import ( + "context" "math/rand" "sync/atomic" "testing" @@ -144,7 +145,7 @@ func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermitt quit := make(chan struct{}) matches := make(chan uint64, 16) - session, err := matcher.Start(0, blocks-1, matches) + session, err := matcher.Start(context.Background(), 0, blocks-1, matches) if err != nil { t.Fatalf("failed to stat matcher session: %v", err) } @@ -163,13 +164,13 @@ func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermitt } // If we're testing intermittent mode, abort and restart the pipeline if intermittent { - session.Close(time.Second) + session.Close() close(quit) quit = make(chan struct{}) matches = make(chan uint64, 16) - session, err = matcher.Start(i+1, blocks-1, matches) + session, err = matcher.Start(context.Background(), i+1, blocks-1, matches) if err != nil { t.Fatalf("failed to stat matcher session: %v", err) } @@ -183,7 +184,7 @@ func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermitt t.Errorf("filter = %v blocks = %v intermittent = %v: expected closed channel, got #%v", filter, blocks, intermittent, match) } // Clean up the session and ensure we match the expected retrieval count - session.Close(time.Second) + session.Close() close(quit) if retrievals != 0 && requested != retrievals { diff --git a/core/chain_indexer.go b/core/chain_indexer.go index f4c207dcca..837c908abc 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -36,13 +36,14 @@ import ( type ChainIndexerBackend interface { // Reset initiates the processing of a new chain segment, potentially terminating // any partially completed operations (in case of a reorg). - Reset(section uint64) + Reset(section uint64, lastSectionHead common.Hash) error // Process crunches through the next header in the chain segment. The caller // will ensure a sequential order of headers. Process(header *types.Header) - // Commit finalizes the section metadata and stores it into the database. + // Commit finalizes the section metadata and stores it into the database. This + // interface will usually be a batch writer. Commit() error } @@ -100,11 +101,34 @@ func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBacken return c } +// AddKnownSectionHead marks a new section head as known/processed if it is newer +// than the already known best section head +func (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash) { + c.lock.Lock() + defer c.lock.Unlock() + + if section < c.storedSections { + return + } + c.setSectionHead(section, shead) + c.setValidSections(section + 1) +} + +// IndexerChain interface is used for connecting the indexer to a blockchain +type IndexerChain interface { + CurrentHeader() *types.Header + SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription +} + // Start creates a goroutine to feed chain head events into the indexer for // cascading background processing. Children do not need to be started, they // are notified about new events by their parents. -func (c *ChainIndexer) Start(currentHeader *types.Header, chainEventer func(ch chan<- ChainEvent) event.Subscription) { - go c.eventLoop(currentHeader, chainEventer) +func (c *ChainIndexer) Start(chain IndexerChain) { + ch := make(chan ChainEvent, 10) + sub := chain.SubscribeChainEvent(ch) + currentHeader := chain.CurrentHeader() + + go c.eventLoop(currentHeader, ch, sub) } // Close tears down all goroutines belonging to the indexer and returns any error @@ -125,12 +149,14 @@ func (c *ChainIndexer) Close() error { errs = append(errs, err) } } + // Close all children for _, child := range c.children { if err := child.Close(); err != nil { errs = append(errs, err) } } + // Return any failures switch { case len(errs) == 0: @@ -147,12 +173,10 @@ func (c *ChainIndexer) Close() error { // eventLoop is a secondary - optional - event loop of the indexer which is only // started for the outermost indexer to push chain head events into a processing // queue. -func (c *ChainIndexer) eventLoop(currentHeader *types.Header, chainEventer func(ch chan<- ChainEvent) event.Subscription) { +func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent, sub event.Subscription) { // Mark the chain indexer as active, requiring an additional teardown atomic.StoreUint32(&c.active, 1) - events := make(chan ChainEvent, 10) - sub := chainEventer(events) defer sub.Unsubscribe() // Fire the initial new head event to start any outstanding processing @@ -169,7 +193,7 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, chainEventer func( errc <- nil return - case ev, ok := <-events: + case ev, ok := <-ch: // Received a new event, ensure it's not nil (closing) and update if !ok { errc := <-c.quit @@ -178,7 +202,9 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, chainEventer func( } header := ev.Block.Header() if header.ParentHash != prevHash { - c.newHead(FindCommonAncestor(c.chainDb, prevHeader, header).Number.Uint64(), true) + if h := FindCommonAncestor(c.chainDb, prevHeader, header); h != nil { + c.newHead(h.Number.Uint64(), true) + } } c.newHead(header.Number.Uint64(), false) @@ -233,9 +259,10 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // down into the processing backend. func (c *ChainIndexer) updateLoop() { var ( - updating bool - updated time.Time + updated time.Time + updateMsg bool ) + for { select { case errc := <-c.quit: @@ -250,7 +277,7 @@ func (c *ChainIndexer) updateLoop() { // Periodically print an upgrade log message to the user if time.Since(updated) > 8*time.Second { if c.knownSections > c.storedSections+1 { - updating = true + updateMsg = true c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) } updated = time.Now() @@ -259,7 +286,7 @@ func (c *ChainIndexer) updateLoop() { section := c.storedSections var oldHead common.Hash if section > 0 { - oldHead = c.sectionHead(section - 1) + oldHead = c.SectionHead(section - 1) } // Process the newly defined section in the background c.lock.Unlock() @@ -270,11 +297,11 @@ func (c *ChainIndexer) updateLoop() { c.lock.Lock() // If processing succeeded and no reorgs occcurred, mark the section completed - if err == nil && oldHead == c.sectionHead(section-1) { + if err == nil && oldHead == c.SectionHead(section-1) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) - if c.storedSections == c.knownSections && updating { - updating = false + if c.storedSections == c.knownSections && updateMsg { + updateMsg = false c.log.Info("Finished upgrading chain index") } @@ -311,7 +338,11 @@ func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (com c.log.Trace("Processing new chain section", "section", section) // Reset and partial processing - c.backend.Reset(section) + + if err := c.backend.Reset(section, lastHead); err != nil { + c.setValidSections(0) + return common.Hash{}, err + } for number := section * c.sectionSize; number < (section+1)*c.sectionSize; number++ { hash := GetCanonicalHash(c.chainDb, number) @@ -341,7 +372,7 @@ func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { c.lock.Lock() defer c.lock.Unlock() - return c.storedSections, c.storedSections*c.sectionSize - 1, c.sectionHead(c.storedSections - 1) + return c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1) } // AddChildIndexer adds a child ChainIndexer that can use the output of this one @@ -383,7 +414,7 @@ func (c *ChainIndexer) setValidSections(sections uint64) { // sectionHead retrieves the last block hash of a processed section from the // index database. -func (c *ChainIndexer) sectionHead(section uint64) common.Hash { +func (c *ChainIndexer) SectionHead(section uint64) common.Hash { var data [8]byte binary.BigEndian.PutUint64(data[:], section) diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index b761e8a5b2..d685d3f8da 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -23,6 +23,7 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" ) @@ -208,9 +209,10 @@ func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { return b.stored * b.indexer.sectionSize } -func (b *testChainIndexBackend) Reset(section uint64) { +func (b *testChainIndexBackend) Reset(section uint64, lastSectionHead common.Hash) error { b.section = section b.headerCnt = 0 + return nil } func (b *testChainIndexBackend) Process(header *types.Header) { diff --git a/core/database_util.go b/core/database_util.go index 1730a048e7..c6b125dae9 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -74,9 +74,9 @@ var ( preimageHitCounter = metrics.NewCounter("db/preimage/hits") ) -// txLookupEntry is a positional metadata to help looking up the data content of +// TxLookupEntry is a positional metadata to help looking up the data content of // a transaction or receipt given only its hash. -type txLookupEntry struct { +type TxLookupEntry struct { BlockHash common.Hash BlockIndex uint64 Index uint64 @@ -260,7 +260,7 @@ func GetTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, return common.Hash{}, 0, 0 } // Parse and return the contents of the lookup entry - var entry txLookupEntry + var entry TxLookupEntry if err := rlp.DecodeBytes(data, &entry); err != nil { log.Error("Invalid lookup entry RLP", "hash", hash, "err", err) return common.Hash{}, 0, 0 @@ -296,7 +296,7 @@ func GetTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, co if len(data) == 0 { return nil, common.Hash{}, 0, 0 } - var entry txLookupEntry + var entry TxLookupEntry if err := rlp.DecodeBytes(data, &entry); err != nil { return nil, common.Hash{}, 0, 0 } @@ -332,14 +332,13 @@ func GetReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Has // GetBloomBits retrieves the compressed bloom bit vector belonging to the given // section and bit index from the. -func GetBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) []byte { +func GetBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) ([]byte, error) { key := append(append(bloomBitsPrefix, make([]byte, 10)...), head.Bytes()...) binary.BigEndian.PutUint16(key[1:], uint16(bit)) binary.BigEndian.PutUint64(key[3:], section) - bits, _ := db.Get(key) - return bits + return db.Get(key) } // WriteCanonicalHash stores the canonical hash for the given block number. @@ -465,7 +464,7 @@ func WriteBlockReceipts(db ethdb.Putter, hash common.Hash, number uint64, receip func WriteTxLookupEntries(db ethdb.Putter, block *types.Block) error { // Iterate over each transaction and encode its metadata for i, tx := range block.Transactions() { - entry := txLookupEntry{ + entry := TxLookupEntry{ BlockHash: block.Hash(), BlockIndex: block.NumberU64(), Index: uint64(i), diff --git a/core/tx_list.go b/core/tx_list.go index 2935929d72..94721aa5f3 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -384,13 +384,13 @@ func (h *priceHeap) Pop() interface{} { // txPricedList is a price-sorted heap to allow operating on transactions pool // contents in a price-incrementing way. type txPricedList struct { - all *map[common.Hash]*types.Transaction // Pointer to the map of all transactions - items *priceHeap // Heap of prices of all the stored transactions - stales int // Number of stale price points to (re-heap trigger) + all *map[common.Hash]txLookupRec // Pointer to the map of all transactions + items *priceHeap // Heap of prices of all the stored transactions + stales int // Number of stale price points to (re-heap trigger) } // newTxPricedList creates a new price-sorted transaction heap. -func newTxPricedList(all *map[common.Hash]*types.Transaction) *txPricedList { +func newTxPricedList(all *map[common.Hash]txLookupRec) *txPricedList { return &txPricedList{ all: all, items: new(priceHeap), @@ -416,7 +416,7 @@ func (l *txPricedList) Removed() { l.stales, l.items = 0, &reheap for _, tx := range *l.all { - *l.items = append(*l.items, tx) + *l.items = append(*l.items, tx.tx) } heap.Init(l.items) } diff --git a/core/tx_pool.go b/core/tx_pool.go index a705e36d66..5fdc91e65e 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -192,17 +192,22 @@ type TxPool struct { locals *accountSet // Set of local transaction to exepmt from evicion rules journal *txJournal // Journal of local transaction to back up to disk - pending map[common.Address]*txList // All currently processable transactions - queue map[common.Address]*txList // Queued but non-processable transactions - beats map[common.Address]time.Time // Last heartbeat from each known account - all map[common.Hash]*types.Transaction // All transactions to allow lookups - priced *txPricedList // All transactions sorted by price + pending map[common.Address]*txList // All currently processable transactions + queue map[common.Address]*txList // Queued but non-processable transactions + beats map[common.Address]time.Time // Last heartbeat from each known account + all map[common.Hash]txLookupRec // All transactions to allow lookups + priced *txPricedList // All transactions sorted by price wg sync.WaitGroup // for shutdown sync homestead bool } +type txLookupRec struct { + tx *types.Transaction + pending bool +} + // NewTxPool creates a new transaction pool to gather, sort and filter inbound // trnsactions from the network. func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain blockChain) *TxPool { @@ -218,7 +223,7 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block pending: make(map[common.Address]*txList), queue: make(map[common.Address]*txList), beats: make(map[common.Address]time.Time), - all: make(map[common.Hash]*types.Transaction), + all: make(map[common.Hash]txLookupRec), chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), gasPrice: new(big.Int).SetUint64(config.PriceLimit), } @@ -594,7 +599,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // If the transaction is already known, discard it hash := tx.Hash() - if pool.all[hash] != nil { + if _, ok := pool.all[hash]; ok { log.Trace("Discarding already known transaction", "hash", hash) return false, fmt.Errorf("known transaction: %x", hash) } @@ -635,7 +640,7 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.priced.Removed() pendingReplaceCounter.Inc(1) } - pool.all[tx.Hash()] = tx + pool.all[tx.Hash()] = txLookupRec{tx, false} pool.priced.Put(tx) pool.journalTx(from, tx) @@ -682,7 +687,7 @@ func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, er pool.priced.Removed() queuedReplaceCounter.Inc(1) } - pool.all[hash] = tx + pool.all[hash] = txLookupRec{tx, false} pool.priced.Put(tx) return old != nil, nil } @@ -725,10 +730,13 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T pendingReplaceCounter.Inc(1) } - // Failsafe to work around direct pending inserts (tests) - if pool.all[hash] == nil { - pool.all[hash] = tx + if pool.all[hash].tx == nil { + // Failsafe to work around direct pending inserts (tests) + pool.all[hash] = txLookupRec{tx, true} pool.priced.Put(tx) + } else { + // set pending flag to true + pool.all[hash] = txLookupRec{tx, true} } // Set the potentially new pending nonce and notify any subsystems of the new tx pool.beats[addr] = time.Now() @@ -755,14 +763,16 @@ func (pool *TxPool) AddRemote(tx *types.Transaction) error { // marking the senders as a local ones in the mean time, ensuring they go around // the local pricing constraints. func (pool *TxPool) AddLocals(txs []*types.Transaction) error { - return pool.addTxs(txs, !pool.config.NoLocals) + pool.addTxs(txs, !pool.config.NoLocals) + return nil } // AddRemotes enqueues a batch of transactions into the pool if they are valid. // If the senders are not among the locally tracked ones, full pricing constraints // will apply. func (pool *TxPool) AddRemotes(txs []*types.Transaction) error { - return pool.addTxs(txs, false) + pool.addTxs(txs, false) + return nil } // addTx enqueues a single transaction into the pool if it is valid. @@ -784,7 +794,7 @@ func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { } // addTxs attempts to queue a batch of transactions if they are valid. -func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) error { +func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) []error { pool.mu.Lock() defer pool.mu.Unlock() @@ -793,11 +803,13 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) error { // addTxsLocked attempts to queue a batch of transactions if they are valid, // whilst assuming the transaction pool lock is already held. -func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) error { +func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) []error { // Add the batch of transaction, tracking the accepted ones dirty := make(map[common.Address]struct{}) - for _, tx := range txs { - if replace, err := pool.add(tx, local); err == nil { + txErr := make([]error, len(txs)) + for i, tx := range txs { + var replace bool + if replace, txErr[i] = pool.add(tx, local); txErr[i] == nil { if !replace { from, _ := types.Sender(pool.signer, tx) // already validated dirty[from] = struct{}{} @@ -812,7 +824,58 @@ func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) error { } pool.promoteExecutables(addrs) } - return nil + return txErr +} + +// TxStatusData is returned by AddOrGetTxStatus for each transaction +type TxStatusData struct { + Status uint + Data []byte +} + +const ( + TxStatusUnknown = iota + TxStatusQueued + TxStatusPending + TxStatusIncluded // Data contains a TxChainPos struct + TxStatusError // Data contains the error string +) + +// AddOrGetTxStatus returns the status (unknown/pending/queued) of a batch of transactions +// identified by their hashes in txHashes. Optionally the transactions themselves can be +// passed too in txs, in which case the function will try adding the previously unknown ones +// to the pool. If a new transaction cannot be added, TxStatusError is returned. Adding already +// known transactions will return their previous status. +// If txs is specified, txHashes is still required and has to match the transactions in txs. + +// Note: TxStatusIncluded is never returned by this function since the pool does not track +// mined transactions. Included status can be checked by the caller (as it happens in the +// LES protocol manager) +func (pool *TxPool) AddOrGetTxStatus(txs []*types.Transaction, txHashes []common.Hash) []TxStatusData { + status := make([]TxStatusData, len(txHashes)) + if txs != nil { + if len(txs) != len(txHashes) { + panic(nil) + } + txErr := pool.addTxs(txs, false) + for i, err := range txErr { + if err != nil { + status[i] = TxStatusData{TxStatusError, ([]byte)(err.Error())} + } + } + } + + for i, hash := range txHashes { + r, ok := pool.all[hash] + if ok { + if r.pending { + status[i] = TxStatusData{TxStatusPending, nil} + } else { + status[i] = TxStatusData{TxStatusQueued, nil} + } + } + } + return status } // Get returns a transaction if it is contained in the pool @@ -821,17 +884,18 @@ func (pool *TxPool) Get(hash common.Hash) *types.Transaction { pool.mu.RLock() defer pool.mu.RUnlock() - return pool.all[hash] + return pool.all[hash].tx } // removeTx removes a single transaction from the queue, moving all subsequent // transactions back to the future queue. func (pool *TxPool) removeTx(hash common.Hash) { // Fetch the transaction we wish to delete - tx, ok := pool.all[hash] + txl, ok := pool.all[hash] if !ok { return } + tx := txl.tx addr, _ := types.Sender(pool.signer, tx) // already validated during insertion // Remove it from the list of known transactions diff --git a/eth/backend.go b/eth/backend.go index 6a06bd829b..1cd9e8fffa 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -54,6 +54,7 @@ type LesServer interface { Start(srvr *p2p.Server) Stop() Protocols() []p2p.Protocol + SetBloomBitsIndexer(bbIndexer *core.ChainIndexer) } // Ethereum implements the Ethereum full node service. @@ -95,6 +96,7 @@ type Ethereum struct { func (s *Ethereum) AddLesServer(ls LesServer) { s.lesServer = ls + ls.SetBloomBitsIndexer(s.bloomIndexer) } // New creates a new Ethereum object (including the @@ -154,7 +156,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { eth.blockchain.SetHead(compat.RewindTo) core.WriteChainConfig(chainDb, genesisHash, chainConfig) } - eth.bloomIndexer.Start(eth.blockchain.CurrentHeader(), eth.blockchain.SubscribeChainEvent) + eth.bloomIndexer.Start(eth.blockchain) if config.TxPool.Journal != "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) diff --git a/eth/bloombits.go b/eth/bloombits.go index 32f6c7b318..c5597391c5 100644 --- a/eth/bloombits.go +++ b/eth/bloombits.go @@ -58,15 +58,18 @@ func (eth *Ethereum) startBloomHandlers() { case request := <-eth.bloomRequests: task := <-request - task.Bitsets = make([][]byte, len(task.Sections)) for i, section := range task.Sections { head := core.GetCanonicalHash(eth.chainDb, (section+1)*params.BloomBitsBlocks-1) - blob, err := bitutil.DecompressBytes(core.GetBloomBits(eth.chainDb, task.Bit, section, head), int(params.BloomBitsBlocks)/8) - if err != nil { - panic(err) + if compVector, err := core.GetBloomBits(eth.chainDb, task.Bit, section, head); err == nil { + if blob, err := bitutil.DecompressBytes(compVector, int(params.BloomBitsBlocks)/8); err == nil { + task.Bitsets[i] = blob + } else { + task.Error = err + } + } else { + task.Error = err } - task.Bitsets[i] = blob } request <- task } @@ -111,12 +114,10 @@ func NewBloomIndexer(db ethdb.Database, size uint64) *core.ChainIndexer { // Reset implements core.ChainIndexerBackend, starting a new bloombits index // section. -func (b *BloomIndexer) Reset(section uint64) { +func (b *BloomIndexer) Reset(section uint64, lastSectionHead common.Hash) error { gen, err := bloombits.NewGenerator(uint(b.size)) - if err != nil { - panic(err) - } b.gen, b.section, b.head = gen, section, common.Hash{} + return err } // Process implements core.ChainIndexerBackend, adding a new header's bloom into diff --git a/eth/filters/filter.go b/eth/filters/filter.go index 026cbf95ca..d16af84ee8 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -19,7 +19,6 @@ package filters import ( "context" "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -136,11 +135,11 @@ func (f *Filter) indexedLogs(ctx context.Context, end uint64) ([]*types.Log, err // Create a matcher session and request servicing from the backend matches := make(chan uint64, 64) - session, err := f.matcher.Start(uint64(f.begin), end, matches) + session, err := f.matcher.Start(ctx, uint64(f.begin), end, matches) if err != nil { return nil, err } - defer session.Close(time.Second) + defer session.Close() f.backend.ServiceFilter(ctx, session) @@ -152,9 +151,13 @@ func (f *Filter) indexedLogs(ctx context.Context, end uint64) ([]*types.Log, err case number, ok := <-matches: // Abort if all matches have been fulfilled if !ok { - f.begin = int64(end) + 1 - return logs, nil + err := session.Error() + if err == nil { + f.begin = int64(end) + 1 + } + return logs, err } + f.begin = int64(number) + 1 // Retrieve the suggested block and pull any truly matching logs header, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(number)) if header == nil || err != nil { diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index bc3511f23a..7da114fda4 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -109,7 +109,7 @@ func (b *testBackend) ServiceFilter(ctx context.Context, session *bloombits.Matc for i, section := range task.Sections { if rand.Int()%4 != 0 { // Handle occasional missing deliveries head := core.GetCanonicalHash(b.db, (section+1)*params.BloomBitsBlocks-1) - task.Bitsets[i] = core.GetBloomBits(b.db, task.Bit, section, head) + task.Bitsets[i], _ = core.GetBloomBits(b.db, task.Bit, section, head) } } request <- task diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index bb03dc72b0..77784ff4ac 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -379,7 +379,7 @@ func (s *Service) login(conn *websocket.Conn) error { protocol = fmt.Sprintf("eth/%d", eth.ProtocolVersions[0]) } else { network = fmt.Sprintf("%d", infos.Protocols["les"].(*eth.EthNodeInfo).Network) - protocol = fmt.Sprintf("les/%d", les.ProtocolVersions[0]) + protocol = fmt.Sprintf("les/%d", les.ClientProtocolVersions[0]) } auth := &authMsg{ Id: s.node, diff --git a/les/api_backend.go b/les/api_backend.go index 0d2d31b673..56f617a7db 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -174,8 +174,15 @@ func (b *LesApiBackend) AccountManager() *accounts.Manager { } func (b *LesApiBackend) BloomStatus() (uint64, uint64) { - return params.BloomBitsBlocks, 0 + if b.eth.bloomIndexer == nil { + return 0, 0 + } + sections, _, _ := b.eth.bloomIndexer.Sections() + return light.BloomTrieFrequency, sections } func (b *LesApiBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) { + for i := 0; i < bloomFilterThreads; i++ { + go session.Multiplex(bloomRetrievalBatch, bloomRetrievalWait, b.eth.bloomRequests) + } } diff --git a/les/backend.go b/les/backend.go index 4c33417c03..3a68d13ebe 100644 --- a/les/backend.go +++ b/les/backend.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/eth/downloader" @@ -61,6 +62,9 @@ type LightEthereum struct { // DB interfaces chainDb ethdb.Database // Block chain database + bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests + bloomIndexer, chtIndexer, bloomTrieIndexer *core.ChainIndexer + ApiBackend *LesApiBackend eventMux *event.TypeMux @@ -87,47 +91,61 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { peers := newPeerSet() quitSync := make(chan struct{}) - eth := &LightEthereum{ - chainConfig: chainConfig, - chainDb: chainDb, - eventMux: ctx.EventMux, - peers: peers, - reqDist: newRequestDistributor(peers, quitSync), - accountManager: ctx.AccountManager, - engine: eth.CreateConsensusEngine(ctx, config, chainConfig, chainDb), - shutdownChan: make(chan bool), - networkId: config.NetworkId, + leth := &LightEthereum{ + chainConfig: chainConfig, + chainDb: chainDb, + eventMux: ctx.EventMux, + peers: peers, + reqDist: newRequestDistributor(peers, quitSync), + accountManager: ctx.AccountManager, + engine: eth.CreateConsensusEngine(ctx, config, chainConfig, chainDb), + shutdownChan: make(chan bool), + networkId: config.NetworkId, + bloomRequests: make(chan chan *bloombits.Retrieval), + bloomIndexer: eth.NewBloomIndexer(chainDb, light.BloomTrieFrequency), + chtIndexer: light.NewChtIndexer(chainDb, true), + bloomTrieIndexer: light.NewBloomTrieIndexer(chainDb, true), } - eth.relay = NewLesTxRelay(peers, eth.reqDist) - eth.serverPool = newServerPool(chainDb, quitSync, ð.wg) - eth.retriever = newRetrieveManager(peers, eth.reqDist, eth.serverPool) - eth.odr = NewLesOdr(chainDb, eth.retriever) - if eth.blockchain, err = light.NewLightChain(eth.odr, eth.chainConfig, eth.engine); err != nil { + leth.relay = NewLesTxRelay(peers, leth.reqDist) + leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg) + leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool) + leth.odr = NewLesOdr(chainDb, leth.chtIndexer, leth.bloomTrieIndexer, leth.bloomIndexer, leth.retriever) + if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine); err != nil { return nil, err } + leth.bloomIndexer.Start(leth.blockchain) // Rewind the chain in case of an incompatible config upgrade. if compat, ok := genesisErr.(*params.ConfigCompatError); ok { log.Warn("Rewinding chain to upgrade configuration", "err", compat) - eth.blockchain.SetHead(compat.RewindTo) + leth.blockchain.SetHead(compat.RewindTo) core.WriteChainConfig(chainDb, genesisHash, chainConfig) } - eth.txPool = light.NewTxPool(eth.chainConfig, eth.blockchain, eth.relay) - if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, true, config.NetworkId, eth.eventMux, eth.engine, eth.peers, eth.blockchain, nil, chainDb, eth.odr, eth.relay, quitSync, ð.wg); err != nil { + leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay) + if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, true, ClientProtocolVersions, config.NetworkId, leth.eventMux, leth.engine, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.relay, quitSync, &leth.wg); err != nil { return nil, err } - eth.ApiBackend = &LesApiBackend{eth, nil} + leth.ApiBackend = &LesApiBackend{leth, nil} gpoParams := config.GPO if gpoParams.Default == nil { gpoParams.Default = config.GasPrice } - eth.ApiBackend.gpo = gasprice.NewOracle(eth.ApiBackend, gpoParams) - return eth, nil + leth.ApiBackend.gpo = gasprice.NewOracle(leth.ApiBackend, gpoParams) + return leth, nil } -func lesTopic(genesisHash common.Hash) discv5.Topic { - return discv5.Topic("LES@" + common.Bytes2Hex(genesisHash.Bytes()[0:8])) +func lesTopic(genesisHash common.Hash, protocolVersion uint) discv5.Topic { + var name string + switch protocolVersion { + case lpv1: + name = "LES" + case lpv2: + name = "LES2" + default: + panic(nil) + } + return discv5.Topic(name + common.Bytes2Hex(genesisHash.Bytes()[0:8])) } type LightDummyAPI struct{} @@ -200,9 +218,13 @@ func (s *LightEthereum) Protocols() []p2p.Protocol { // Start implements node.Service, starting all internal goroutines needed by the // Ethereum protocol implementation. func (s *LightEthereum) Start(srvr *p2p.Server) error { + s.startBloomHandlers() log.Warn("Light client mode is an experimental feature") s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.networkId) - s.serverPool.start(srvr, lesTopic(s.blockchain.Genesis().Hash())) + // search the topic belonging to the oldest supported protocol because + // servers always advertise all supported protocols + protocolVersion := ClientProtocolVersions[len(ClientProtocolVersions)-1] + s.serverPool.start(srvr, lesTopic(s.blockchain.Genesis().Hash(), protocolVersion)) s.protocolManager.Start() return nil } @@ -211,6 +233,15 @@ func (s *LightEthereum) Start(srvr *p2p.Server) error { // Ethereum protocol. func (s *LightEthereum) Stop() error { s.odr.Stop() + if s.bloomIndexer != nil { + s.bloomIndexer.Close() + } + if s.chtIndexer != nil { + s.chtIndexer.Close() + } + if s.bloomTrieIndexer != nil { + s.bloomTrieIndexer.Close() + } s.blockchain.Stop() s.protocolManager.Stop() s.txPool.Stop() diff --git a/les/bloombits.go b/les/bloombits.go new file mode 100644 index 0000000000..dff83d3491 --- /dev/null +++ b/les/bloombits.go @@ -0,0 +1,84 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "time" + + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/light" +) + +const ( + // bloomServiceThreads is the number of goroutines used globally by an Ethereum + // instance to service bloombits lookups for all running filters. + bloomServiceThreads = 16 + + // bloomFilterThreads is the number of goroutines used locally per filter to + // multiplex requests onto the global servicing goroutines. + bloomFilterThreads = 3 + + // bloomRetrievalBatch is the maximum number of bloom bit retrievals to service + // in a single batch. + bloomRetrievalBatch = 16 + + // bloomRetrievalWait is the maximum time to wait for enough bloom bit requests + // to accumulate request an entire batch (avoiding hysteresis). + bloomRetrievalWait = time.Microsecond * 100 +) + +// startBloomHandlers starts a batch of goroutines to accept bloom bit database +// retrievals from possibly a range of filters and serving the data to satisfy. +func (eth *LightEthereum) startBloomHandlers() { + for i := 0; i < bloomServiceThreads; i++ { + go func() { + for { + select { + case <-eth.shutdownChan: + return + + case request := <-eth.bloomRequests: + task := <-request + task.Bitsets = make([][]byte, len(task.Sections)) + compVectors, err := light.GetBloomBits(task.Context, eth.odr, task.Bit, task.Sections) + if err == nil { + for i, _ := range task.Sections { + if blob, err := bitutil.DecompressBytes(compVectors[i], int(light.BloomTrieFrequency/8)); err == nil { + task.Bitsets[i] = blob + } else { + task.Error = err + } + } + } else { + task.Error = err + } + request <- task + } + } + }() + } +} + +const ( + // bloomConfirms is the number of confirmation blocks before a bloom section is + // considered probably final and its rotated bits are calculated. + bloomConfirms = 256 + + // bloomThrottling is the time to wait between processing two consecutive index + // sections. It's useful during chain upgrades to prevent disk overload. + bloomThrottling = 100 * time.Millisecond +) diff --git a/les/handler.go b/les/handler.go index df7eb6af51..de07b72446 100644 --- a/les/handler.go +++ b/les/handler.go @@ -18,6 +18,7 @@ package les import ( + "bytes" "encoding/binary" "errors" "fmt" @@ -35,6 +36,7 @@ import ( "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discover" @@ -50,13 +52,14 @@ const ( ethVersion = 63 // equivalent eth version for the downloader - MaxHeaderFetch = 192 // Amount of block headers to be fetched per retrieval request - MaxBodyFetch = 32 // Amount of block bodies to be fetched per retrieval request - MaxReceiptFetch = 128 // Amount of transaction receipts to allow fetching per request - MaxCodeFetch = 64 // Amount of contract codes to allow fetching per request - MaxProofsFetch = 64 // Amount of merkle proofs to be fetched per retrieval request - MaxHeaderProofsFetch = 64 // Amount of merkle proofs to be fetched per retrieval request - MaxTxSend = 64 // Amount of transactions to be send per request + MaxHeaderFetch = 192 // Amount of block headers to be fetched per retrieval request + MaxBodyFetch = 32 // Amount of block bodies to be fetched per retrieval request + MaxReceiptFetch = 128 // Amount of transaction receipts to allow fetching per request + MaxCodeFetch = 64 // Amount of contract codes to allow fetching per request + MaxProofsFetch = 64 // Amount of merkle proofs to be fetched per retrieval request + MaxHelperTrieProofsFetch = 64 // Amount of merkle proofs to be fetched per retrieval request + MaxTxSend = 64 // Amount of transactions to be send per request + MaxTxStatus = 256 // Amount of transactions to queried per request disableClientRemovePeer = false ) @@ -86,8 +89,7 @@ type BlockChain interface { } type txPool interface { - // AddRemotes should add the given transactions to the pool. - AddRemotes([]*types.Transaction) error + AddOrGetTxStatus(txs []*types.Transaction, txHashes []common.Hash) []core.TxStatusData } type ProtocolManager struct { @@ -125,7 +127,7 @@ type ProtocolManager struct { // NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable // with the ethereum network. -func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, txrelay *LesTxRelay, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error) { +func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, protocolVersions []uint, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, txrelay *LesTxRelay, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error) { // Create the protocol manager with the base fields manager := &ProtocolManager{ lightSync: lightSync, @@ -147,15 +149,16 @@ func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, network manager.retriever = odr.retriever manager.reqDist = odr.retriever.dist } + // Initiate a sub-protocol for every implemented version we can handle - manager.SubProtocols = make([]p2p.Protocol, 0, len(ProtocolVersions)) - for i, version := range ProtocolVersions { + manager.SubProtocols = make([]p2p.Protocol, 0, len(protocolVersions)) + for _, version := range protocolVersions { // Compatible, initialize the sub-protocol version := version // Closure for the run manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{ Name: "les", Version: version, - Length: ProtocolLengths[i], + Length: ProtocolLengths[version], Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { var entry *poolEntry peer := manager.newPeer(int(version), networkId, p, rw) @@ -315,7 +318,7 @@ func (pm *ProtocolManager) handle(p *peer) error { } } -var reqList = []uint64{GetBlockHeadersMsg, GetBlockBodiesMsg, GetCodeMsg, GetReceiptsMsg, GetProofsMsg, SendTxMsg, GetHeaderProofsMsg} +var reqList = []uint64{GetBlockHeadersMsg, GetBlockBodiesMsg, GetCodeMsg, GetReceiptsMsg, GetProofsV1Msg, SendTxMsg, SendTxV2Msg, GetTxStatusMsg, GetHeaderProofsMsg, GetProofsV2Msg, GetHelperTrieProofsMsg} // handleMsg is invoked whenever an inbound message is received from a remote // peer. The remote connection is torn down upon returning any error. @@ -362,11 +365,23 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { // Block header query, collect the requested headers and reply case AnnounceMsg: p.Log().Trace("Received announce message") + if p.requestAnnounceType == announceTypeNone { + return errResp(ErrUnexpectedResponse, "") + } var req announceData if err := msg.Decode(&req); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } + + if p.requestAnnounceType == announceTypeSigned { + if err := req.checkSignature(p.pubKey); err != nil { + p.Log().Trace("Invalid announcement signature", "err", err) + return err + } + p.Log().Trace("Valid announcement signature") + } + p.Log().Trace("Announce message content", "number", req.Number, "hash", req.Hash, "td", req.Td, "reorg", req.ReorgDepth) if pm.fetcher != nil { pm.fetcher.announce(p, &req) @@ -655,7 +670,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { Obj: resp.Receipts, } - case GetProofsMsg: + case GetProofsV1Msg: p.Log().Trace("Received proofs request") // Decode the retrieval message var req struct { @@ -690,9 +705,10 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } } if tr != nil { - proof := tr.Prove(req.Key) + var proof light.NodeList + tr.Prove(req.Key, 0, &proof) proofs = append(proofs, proof) - bytes += len(proof) + bytes += proof.DataSize() } } } @@ -701,7 +717,67 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) return p.SendProofs(req.ReqID, bv, proofs) - case ProofsMsg: + case GetProofsV2Msg: + p.Log().Trace("Received les/2 proofs request") + // Decode the retrieval message + var req struct { + ReqID uint64 + Reqs []ProofReq + } + if err := msg.Decode(&req); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Gather state data until the fetch or network limits is reached + var ( + lastBHash common.Hash + lastAccKey []byte + tr, str *trie.Trie + ) + reqCnt := len(req.Reqs) + if reject(uint64(reqCnt), MaxProofsFetch) { + return errResp(ErrRequestRejected, "") + } + + nodes := light.NewNodeSet() + + for _, req := range req.Reqs { + if nodes.DataSize() >= softResponseLimit { + break + } + if tr == nil || req.BHash != lastBHash { + if header := core.GetHeader(pm.chainDb, req.BHash, core.GetBlockNumber(pm.chainDb, req.BHash)); header != nil { + tr, _ = trie.New(header.Root, pm.chainDb) + } else { + tr = nil + } + lastBHash = req.BHash + str = nil + } + if tr != nil { + if len(req.AccKey) > 0 { + if str == nil || !bytes.Equal(req.AccKey, lastAccKey) { + sdata := tr.Get(req.AccKey) + str = nil + var acc state.Account + if err := rlp.DecodeBytes(sdata, &acc); err == nil { + str, _ = trie.New(acc.Root, pm.chainDb) + } + lastAccKey = common.CopyBytes(req.AccKey) + } + if str != nil { + str.Prove(req.Key, req.FromLevel, nodes) + } + } else { + tr.Prove(req.Key, req.FromLevel, nodes) + } + } + } + proofs := nodes.NodeList() + bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) + pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) + return p.SendProofsV2(req.ReqID, bv, proofs) + + case ProofsV1Msg: if pm.odr == nil { return errResp(ErrUnexpectedResponse, "") } @@ -710,14 +786,35 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { // A batch of merkle proofs arrived to one of our previous requests var resp struct { ReqID, BV uint64 - Data [][]rlp.RawValue + Data []light.NodeList } if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } p.fcServer.GotReply(resp.ReqID, resp.BV) deliverMsg = &Msg{ - MsgType: MsgProofs, + MsgType: MsgProofsV1, + ReqID: resp.ReqID, + Obj: resp.Data, + } + + case ProofsV2Msg: + if pm.odr == nil { + return errResp(ErrUnexpectedResponse, "") + } + + p.Log().Trace("Received les/2 proofs response") + // A batch of merkle proofs arrived to one of our previous requests + var resp struct { + ReqID, BV uint64 + Data light.NodeList + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.GotReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgProofsV2, ReqID: resp.ReqID, Obj: resp.Data, } @@ -738,22 +835,25 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { proofs []ChtResp ) reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxHeaderProofsFetch) { + if reject(uint64(reqCnt), MaxHelperTrieProofsFetch) { return errResp(ErrRequestRejected, "") } + trieDb := ethdb.NewTable(pm.chainDb, light.ChtTablePrefix) for _, req := range req.Reqs { if bytes >= softResponseLimit { break } if header := pm.blockchain.GetHeaderByNumber(req.BlockNum); header != nil { - if root := getChtRoot(pm.chainDb, req.ChtNum); root != (common.Hash{}) { - if tr, _ := trie.New(root, pm.chainDb); tr != nil { + sectionHead := core.GetCanonicalHash(pm.chainDb, (req.ChtNum+1)*light.ChtV1Frequency-1) + if root := light.GetChtRoot(pm.chainDb, req.ChtNum, sectionHead); root != (common.Hash{}) { + if tr, _ := trie.New(root, trieDb); tr != nil { var encNumber [8]byte binary.BigEndian.PutUint64(encNumber[:], req.BlockNum) - proof := tr.Prove(encNumber[:]) + var proof light.NodeList + tr.Prove(encNumber[:], 0, &proof) proofs = append(proofs, ChtResp{Header: header, Proof: proof}) - bytes += len(proof) + estHeaderRlpSize + bytes += proof.DataSize() + estHeaderRlpSize } } } @@ -762,6 +862,73 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) return p.SendHeaderProofs(req.ReqID, bv, proofs) + case GetHelperTrieProofsMsg: + p.Log().Trace("Received helper trie proof request") + // Decode the retrieval message + var req struct { + ReqID uint64 + Reqs []HelperTrieReq + } + if err := msg.Decode(&req); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Gather state data until the fetch or network limits is reached + var ( + auxBytes int + auxData [][]byte + ) + reqCnt := len(req.Reqs) + if reject(uint64(reqCnt), MaxHelperTrieProofsFetch) { + return errResp(ErrRequestRejected, "") + } + + var ( + lastIdx uint64 + lastType uint + root common.Hash + tr *trie.Trie + ) + + nodes := light.NewNodeSet() + + for _, req := range req.Reqs { + if nodes.DataSize()+auxBytes >= softResponseLimit { + break + } + if tr == nil || req.HelperTrieType != lastType || req.TrieIdx != lastIdx { + var prefix string + root, prefix = pm.getHelperTrie(req.HelperTrieType, req.TrieIdx) + if root != (common.Hash{}) { + if t, err := trie.New(root, ethdb.NewTable(pm.chainDb, prefix)); err == nil { + tr = t + } + } + lastType = req.HelperTrieType + lastIdx = req.TrieIdx + } + if req.AuxReq == auxRoot { + var data []byte + if root != (common.Hash{}) { + data = root[:] + } + auxData = append(auxData, data) + auxBytes += len(data) + } else { + if tr != nil { + tr.Prove(req.Key, req.FromLevel, nodes) + } + if req.AuxReq != 0 { + data := pm.getHelperTrieAuxData(req) + auxData = append(auxData, data) + auxBytes += len(data) + } + } + } + proofs := nodes.NodeList() + bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) + pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) + return p.SendHelperTrieProofs(req.ReqID, bv, HelperTrieResps{Proofs: proofs, AuxData: auxData}) + case HeaderProofsMsg: if pm.odr == nil { return errResp(ErrUnexpectedResponse, "") @@ -782,9 +949,30 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { Obj: resp.Data, } + case HelperTrieProofsMsg: + if pm.odr == nil { + return errResp(ErrUnexpectedResponse, "") + } + + p.Log().Trace("Received helper trie proof response") + var resp struct { + ReqID, BV uint64 + Data HelperTrieResps + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + + p.fcServer.GotReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgHelperTrieProofs, + ReqID: resp.ReqID, + Obj: resp.Data, + } + case SendTxMsg: if pm.txpool == nil { - return errResp(ErrUnexpectedResponse, "") + return errResp(ErrRequestRejected, "") } // Transactions arrived, parse all of them and deliver to the pool var txs []*types.Transaction @@ -796,13 +984,82 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrRequestRejected, "") } - if err := pm.txpool.AddRemotes(txs); err != nil { - return errResp(ErrUnexpectedResponse, "msg: %v", err) + txHashes := make([]common.Hash, len(txs)) + for i, tx := range txs { + txHashes[i] = tx.Hash() } + pm.addOrGetTxStatus(txs, txHashes) _, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) + case SendTxV2Msg: + if pm.txpool == nil { + return errResp(ErrRequestRejected, "") + } + // Transactions arrived, parse all of them and deliver to the pool + var req struct { + ReqID uint64 + Txs []*types.Transaction + } + if err := msg.Decode(&req); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + reqCnt := len(req.Txs) + if reject(uint64(reqCnt), MaxTxSend) { + return errResp(ErrRequestRejected, "") + } + + txHashes := make([]common.Hash, len(req.Txs)) + for i, tx := range req.Txs { + txHashes[i] = tx.Hash() + } + + res := pm.addOrGetTxStatus(req.Txs, txHashes) + + bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) + pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) + return p.SendTxStatus(req.ReqID, bv, res) + + case GetTxStatusMsg: + if pm.txpool == nil { + return errResp(ErrUnexpectedResponse, "") + } + // Transactions arrived, parse all of them and deliver to the pool + var req struct { + ReqID uint64 + TxHashes []common.Hash + } + if err := msg.Decode(&req); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + reqCnt := len(req.TxHashes) + if reject(uint64(reqCnt), MaxTxStatus) { + return errResp(ErrRequestRejected, "") + } + + res := pm.addOrGetTxStatus(nil, req.TxHashes) + + bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) + pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) + return p.SendTxStatus(req.ReqID, bv, res) + + case TxStatusMsg: + if pm.odr == nil { + return errResp(ErrUnexpectedResponse, "") + } + + p.Log().Trace("Received tx status response") + var resp struct { + ReqID, BV uint64 + Status []core.TxStatusData + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + + p.fcServer.GotReply(resp.ReqID, resp.BV) + default: p.Log().Trace("Received unknown message", "code", msg.Code) return errResp(ErrInvalidMsgCode, "%v", msg.Code) @@ -820,6 +1077,47 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return nil } +// getHelperTrie returns the post-processed trie root for the given trie ID and section index +func (pm *ProtocolManager) getHelperTrie(id uint, idx uint64) (common.Hash, string) { + switch id { + case htCanonical: + sectionHead := core.GetCanonicalHash(pm.chainDb, (idx+1)*light.ChtFrequency-1) + return light.GetChtV2Root(pm.chainDb, idx, sectionHead), light.ChtTablePrefix + case htBloomBits: + sectionHead := core.GetCanonicalHash(pm.chainDb, (idx+1)*light.BloomTrieFrequency-1) + return light.GetBloomTrieRoot(pm.chainDb, idx, sectionHead), light.BloomTrieTablePrefix + } + return common.Hash{}, "" +} + +// getHelperTrieAuxData returns requested auxiliary data for the given HelperTrie request +func (pm *ProtocolManager) getHelperTrieAuxData(req HelperTrieReq) []byte { + if req.HelperTrieType == htCanonical && req.AuxReq == auxHeader { + if len(req.Key) != 8 { + return nil + } + blockNum := binary.BigEndian.Uint64(req.Key) + hash := core.GetCanonicalHash(pm.chainDb, blockNum) + return core.GetHeaderRLP(pm.chainDb, hash, blockNum) + } + return nil +} + +func (pm *ProtocolManager) addOrGetTxStatus(txs []*types.Transaction, txHashes []common.Hash) []core.TxStatusData { + status := pm.txpool.AddOrGetTxStatus(txs, txHashes) + for i, _ := range status { + blockHash, blockNum, txIndex := core.GetTxLookupEntry(pm.chainDb, txHashes[i]) + if blockHash != (common.Hash{}) { + enc, err := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: blockHash, BlockIndex: blockNum, Index: txIndex}) + if err != nil { + panic(err) + } + status[i] = core.TxStatusData{Status: core.TxStatusIncluded, Data: enc} + } + } + return status +} + // NodeInfo retrieves some protocol metadata about the running host node. func (self *ProtocolManager) NodeInfo() *eth.EthNodeInfo { return ð.EthNodeInfo{ diff --git a/les/handler_test.go b/les/handler_test.go index b1f1aa0951..a094cdc840 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -17,7 +17,10 @@ package les import ( + "bytes" + "math/big" "math/rand" + "runtime" "testing" "github.com/ethereum/go-ethereum/common" @@ -26,7 +29,9 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) @@ -39,9 +44,29 @@ func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{} return p2p.ExpectMsg(r, msgcode, resp{reqID, bv, data}) } +func testCheckProof(t *testing.T, exp *light.NodeSet, got light.NodeList) { + if exp.KeyCount() > len(got) { + t.Errorf("proof has fewer nodes than expected") + return + } + if exp.KeyCount() < len(got) { + t.Errorf("proof has more nodes than expected") + return + } + for _, node := range got { + n, _ := exp.Get(crypto.Keccak256(node)) + if !bytes.Equal(n, node) { + t.Errorf("proof contents mismatch") + return + } + } +} + // Tests that block headers can be retrieved from a remote chain based on user queries. func TestGetBlockHeadersLes1(t *testing.T) { testGetBlockHeaders(t, 1) } +func TestGetBlockHeadersLes2(t *testing.T) { testGetBlockHeaders(t, 2) } + func testGetBlockHeaders(t *testing.T, protocol int) { db, _ := ethdb.NewMemDatabase() pm := newTestProtocolManagerMust(t, false, downloader.MaxHashFetch+15, nil, nil, nil, db) @@ -171,6 +196,8 @@ func testGetBlockHeaders(t *testing.T, protocol int) { // Tests that block contents can be retrieved from a remote chain based on their hashes. func TestGetBlockBodiesLes1(t *testing.T) { testGetBlockBodies(t, 1) } +func TestGetBlockBodiesLes2(t *testing.T) { testGetBlockBodies(t, 2) } + func testGetBlockBodies(t *testing.T, protocol int) { db, _ := ethdb.NewMemDatabase() pm := newTestProtocolManagerMust(t, false, downloader.MaxBlockFetch+15, nil, nil, nil, db) @@ -247,6 +274,8 @@ func testGetBlockBodies(t *testing.T, protocol int) { // Tests that the contract codes can be retrieved based on account addresses. func TestGetCodeLes1(t *testing.T) { testGetCode(t, 1) } +func TestGetCodeLes2(t *testing.T) { testGetCode(t, 2) } + func testGetCode(t *testing.T, protocol int) { // Assemble the test environment db, _ := ethdb.NewMemDatabase() @@ -280,6 +309,8 @@ func testGetCode(t *testing.T, protocol int) { // Tests that the transaction receipts can be retrieved based on hashes. func TestGetReceiptLes1(t *testing.T) { testGetReceipt(t, 1) } +func TestGetReceiptLes2(t *testing.T) { testGetReceipt(t, 2) } + func testGetReceipt(t *testing.T, protocol int) { // Assemble the test environment db, _ := ethdb.NewMemDatabase() @@ -307,6 +338,8 @@ func testGetReceipt(t *testing.T, protocol int) { // Tests that trie merkle proofs can be retrieved func TestGetProofsLes1(t *testing.T) { testGetProofs(t, 1) } +func TestGetProofsLes2(t *testing.T) { testGetProofs(t, 2) } + func testGetProofs(t *testing.T, protocol int) { // Assemble the test environment db, _ := ethdb.NewMemDatabase() @@ -315,8 +348,11 @@ func testGetProofs(t *testing.T, protocol int) { peer, _ := newTestPeer(t, "peer", protocol, pm, true) defer peer.close() - var proofreqs []ProofReq - var proofs [][]rlp.RawValue + var ( + proofreqs []ProofReq + proofsV1 [][]rlp.RawValue + ) + proofsV2 := light.NewNodeSet() accounts := []common.Address{testBankAddress, acc1Addr, acc2Addr, {}} for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { @@ -331,14 +367,124 @@ func testGetProofs(t *testing.T, protocol int) { } proofreqs = append(proofreqs, req) - proof := trie.Prove(crypto.Keccak256(acc[:])) - proofs = append(proofs, proof) + switch protocol { + case 1: + var proof light.NodeList + trie.Prove(crypto.Keccak256(acc[:]), 0, &proof) + proofsV1 = append(proofsV1, proof) + case 2: + trie.Prove(crypto.Keccak256(acc[:]), 0, proofsV2) + } } } // Send the proof request and verify the response - cost := peer.GetRequestCost(GetProofsMsg, len(proofreqs)) - sendRequest(peer.app, GetProofsMsg, 42, cost, proofreqs) - if err := expectResponse(peer.app, ProofsMsg, 42, testBufLimit, proofs); err != nil { - t.Errorf("proofs mismatch: %v", err) + switch protocol { + case 1: + cost := peer.GetRequestCost(GetProofsV1Msg, len(proofreqs)) + sendRequest(peer.app, GetProofsV1Msg, 42, cost, proofreqs) + if err := expectResponse(peer.app, ProofsV1Msg, 42, testBufLimit, proofsV1); err != nil { + t.Errorf("proofs mismatch: %v", err) + } + case 2: + cost := peer.GetRequestCost(GetProofsV2Msg, len(proofreqs)) + sendRequest(peer.app, GetProofsV2Msg, 42, cost, proofreqs) + msg, err := peer.app.ReadMsg() + if err != nil { + t.Errorf("Message read error: %v", err) + } + var resp struct { + ReqID, BV uint64 + Data light.NodeList + } + if err := msg.Decode(&resp); err != nil { + t.Errorf("reply decode error: %v", err) + } + if msg.Code != ProofsV2Msg { + t.Errorf("Message code mismatch") + } + if resp.ReqID != 42 { + t.Errorf("ReqID mismatch") + } + if resp.BV != testBufLimit { + t.Errorf("BV mismatch") + } + testCheckProof(t, proofsV2, resp.Data) } } + +func TestTransactionStatusLes2(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + pm := newTestProtocolManagerMust(t, false, 0, nil, nil, nil, db) + chain := pm.blockchain.(*core.BlockChain) + txpool := core.NewTxPool(core.DefaultTxPoolConfig, params.TestChainConfig, chain) + pm.txpool = txpool + peer, _ := newTestPeer(t, "peer", 2, pm, true) + defer peer.close() + + var reqID uint64 + + test := func(tx *types.Transaction, send bool, expStatus core.TxStatusData) { + reqID++ + if send { + cost := peer.GetRequestCost(SendTxV2Msg, 1) + sendRequest(peer.app, SendTxV2Msg, reqID, cost, types.Transactions{tx}) + } else { + cost := peer.GetRequestCost(GetTxStatusMsg, 1) + sendRequest(peer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) + } + if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []core.TxStatusData{expStatus}); err != nil { + t.Errorf("transaction status mismatch") + } + } + + signer := types.HomesteadSigner{} + + // test error status by sending an underpriced transaction + tx0, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey) + test(tx0, true, core.TxStatusData{Status: core.TxStatusError, Data: []byte("transaction underpriced")}) + + tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) + test(tx1, false, core.TxStatusData{Status: core.TxStatusUnknown}) // query before sending, should be unknown + test(tx1, true, core.TxStatusData{Status: core.TxStatusPending}) // send valid processable tx, should return pending + test(tx1, true, core.TxStatusData{Status: core.TxStatusPending}) // adding it again should not return an error + + tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) + tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) + // send transactions in the wrong order, tx3 should be queued + test(tx3, true, core.TxStatusData{Status: core.TxStatusQueued}) + test(tx2, true, core.TxStatusData{Status: core.TxStatusPending}) + // query again, now tx3 should be pending too + test(tx3, false, core.TxStatusData{Status: core.TxStatusPending}) + + // generate and add a block with tx1 and tx2 included + gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 1, func(i int, block *core.BlockGen) { + block.AddTx(tx1) + block.AddTx(tx2) + }) + if _, err := chain.InsertChain(gchain); err != nil { + panic(err) + } + + // check if their status is included now + block1hash := core.GetCanonicalHash(db, 1) + tx1pos, _ := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}) + tx2pos, _ := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}) + test(tx1, false, core.TxStatusData{Status: core.TxStatusIncluded, Data: tx1pos}) + test(tx2, false, core.TxStatusData{Status: core.TxStatusIncluded, Data: tx2pos}) + + // create a reorg that rolls them back + gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 2, func(i int, block *core.BlockGen) {}) + if _, err := chain.InsertChain(gchain); err != nil { + panic(err) + } + // wait until TxPool processes the reorg + for { + if pending, _ := txpool.Stats(); pending == 3 { + break + } + runtime.Gosched() + } + // check if their status is pending again + test(tx1, false, core.TxStatusData{Status: core.TxStatusPending}) + test(tx2, false, core.TxStatusData{Status: core.TxStatusPending}) +} diff --git a/les/helper_test.go b/les/helper_test.go index b33454e1d0..a06f84ccac 100644 --- a/les/helper_test.go +++ b/les/helper_test.go @@ -43,7 +43,7 @@ import ( var ( testBankKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) - testBankFunds = big.NewInt(1000000) + testBankFunds = big.NewInt(1000000000000000000) acc1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") acc2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") @@ -156,7 +156,13 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor chain = blockchain } - pm, err := NewProtocolManager(gspec.Config, lightSync, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, make(chan struct{}), new(sync.WaitGroup)) + var protocolVersions []uint + if lightSync { + protocolVersions = ClientProtocolVersions + } else { + protocolVersions = ServerProtocolVersions + } + pm, err := NewProtocolManager(gspec.Config, lightSync, protocolVersions, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, make(chan struct{}), new(sync.WaitGroup)) if err != nil { return nil, err } diff --git a/les/odr.go b/les/odr.go index 3f7584b48e..986630dbfd 100644 --- a/les/odr.go +++ b/les/odr.go @@ -19,6 +19,7 @@ package les import ( "context" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/log" @@ -26,33 +27,56 @@ import ( // LesOdr implements light.OdrBackend type LesOdr struct { - db ethdb.Database - stop chan struct{} - retriever *retrieveManager + db ethdb.Database + chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer + retriever *retrieveManager + stop chan struct{} } -func NewLesOdr(db ethdb.Database, retriever *retrieveManager) *LesOdr { +func NewLesOdr(db ethdb.Database, chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer, retriever *retrieveManager) *LesOdr { return &LesOdr{ - db: db, - retriever: retriever, - stop: make(chan struct{}), + db: db, + chtIndexer: chtIndexer, + bloomTrieIndexer: bloomTrieIndexer, + bloomIndexer: bloomIndexer, + retriever: retriever, + stop: make(chan struct{}), } } +// Stop cancels all pending retrievals func (odr *LesOdr) Stop() { close(odr.stop) } +// Database returns the backing database func (odr *LesOdr) Database() ethdb.Database { return odr.db } +// ChtIndexer returns the CHT chain indexer +func (odr *LesOdr) ChtIndexer() *core.ChainIndexer { + return odr.chtIndexer +} + +// BloomTrieIndexer returns the bloom trie chain indexer +func (odr *LesOdr) BloomTrieIndexer() *core.ChainIndexer { + return odr.bloomTrieIndexer +} + +// BloomIndexer returns the bloombits chain indexer +func (odr *LesOdr) BloomIndexer() *core.ChainIndexer { + return odr.bloomIndexer +} + const ( MsgBlockBodies = iota MsgCode MsgReceipts - MsgProofs + MsgProofsV1 + MsgProofsV2 MsgHeaderProofs + MsgHelperTrieProofs ) // Msg encodes a LES message that delivers reply data for a request @@ -64,7 +88,7 @@ type Msg struct { // Retrieve tries to fetch an object from the LES network. // If the network retrieval was successful, it stores the object in local db. -func (self *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err error) { +func (odr *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err error) { lreq := LesRequest(req) reqID := genReqID() @@ -84,9 +108,9 @@ func (self *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err err }, } - if err = self.retriever.retrieve(ctx, reqID, rq, func(p distPeer, msg *Msg) error { return lreq.Validate(self.db, msg) }); err == nil { + if err = odr.retriever.retrieve(ctx, reqID, rq, func(p distPeer, msg *Msg) error { return lreq.Validate(odr.db, msg) }, odr.stop); err == nil { // retrieved from network, store in db - req.StoreResult(self.db) + req.StoreResult(odr.db) } else { log.Debug("Failed to retrieve data from network", "err", err) } diff --git a/les/odr_requests.go b/les/odr_requests.go index 1f853b3417..937a4f1d9d 100644 --- a/les/odr_requests.go +++ b/les/odr_requests.go @@ -36,13 +36,15 @@ import ( var ( errInvalidMessageType = errors.New("invalid message type") - errMultipleEntries = errors.New("multiple response entries") + errInvalidEntryCount = errors.New("invalid number of response entries") errHeaderUnavailable = errors.New("header unavailable") errTxHashMismatch = errors.New("transaction hash mismatch") errUncleHashMismatch = errors.New("uncle hash mismatch") errReceiptHashMismatch = errors.New("receipt hash mismatch") errDataHashMismatch = errors.New("data hash mismatch") errCHTHashMismatch = errors.New("cht hash mismatch") + errCHTNumberMismatch = errors.New("cht number mismatch") + errUselessNodes = errors.New("useless nodes in merkle proof nodeset") ) type LesOdrRequest interface { @@ -64,6 +66,8 @@ func LesRequest(req light.OdrRequest) LesOdrRequest { return (*CodeRequest)(r) case *light.ChtRequest: return (*ChtRequest)(r) + case *light.BloomRequest: + return (*BloomRequest)(r) default: return nil } @@ -101,7 +105,7 @@ func (r *BlockRequest) Validate(db ethdb.Database, msg *Msg) error { } bodies := msg.Obj.([]*types.Body) if len(bodies) != 1 { - return errMultipleEntries + return errInvalidEntryCount } body := bodies[0] @@ -157,7 +161,7 @@ func (r *ReceiptsRequest) Validate(db ethdb.Database, msg *Msg) error { } receipts := msg.Obj.([]types.Receipts) if len(receipts) != 1 { - return errMultipleEntries + return errInvalidEntryCount } receipt := receipts[0] @@ -186,7 +190,14 @@ type TrieRequest light.TrieRequest // GetCost returns the cost of the given ODR request according to the serving // peer's cost table (implementation of LesOdrRequest) func (r *TrieRequest) GetCost(peer *peer) uint64 { - return peer.GetRequestCost(GetProofsMsg, 1) + switch peer.version { + case lpv1: + return peer.GetRequestCost(GetProofsV1Msg, 1) + case lpv2: + return peer.GetRequestCost(GetProofsV2Msg, 1) + default: + panic(nil) + } } // CanSend tells if a certain peer is suitable for serving the given request @@ -197,12 +208,12 @@ func (r *TrieRequest) CanSend(peer *peer) bool { // Request sends an ODR request to the LES network (implementation of LesOdrRequest) func (r *TrieRequest) Request(reqID uint64, peer *peer) error { peer.Log().Debug("Requesting trie proof", "root", r.Id.Root, "key", r.Key) - req := &ProofReq{ + req := ProofReq{ BHash: r.Id.BlockHash, AccKey: r.Id.AccKey, Key: r.Key, } - return peer.RequestProofs(reqID, r.GetCost(peer), []*ProofReq{req}) + return peer.RequestProofs(reqID, r.GetCost(peer), []ProofReq{req}) } // Valid processes an ODR request reply message from the LES network @@ -211,20 +222,38 @@ func (r *TrieRequest) Request(reqID uint64, peer *peer) error { func (r *TrieRequest) Validate(db ethdb.Database, msg *Msg) error { log.Debug("Validating trie proof", "root", r.Id.Root, "key", r.Key) - // Ensure we have a correct message with a single proof - if msg.MsgType != MsgProofs { + switch msg.MsgType { + case MsgProofsV1: + proofs := msg.Obj.([]light.NodeList) + if len(proofs) != 1 { + return errInvalidEntryCount + } + nodeSet := proofs[0].NodeSet() + // Verify the proof and store if checks out + if _, err, _ := trie.VerifyProof(r.Id.Root, r.Key, nodeSet); err != nil { + return fmt.Errorf("merkle proof verification failed: %v", err) + } + r.Proof = nodeSet + return nil + + case MsgProofsV2: + proofs := msg.Obj.(light.NodeList) + // Verify the proof and store if checks out + nodeSet := proofs.NodeSet() + reads := &readTraceDB{db: nodeSet} + if _, err, _ := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil { + return fmt.Errorf("merkle proof verification failed: %v", err) + } + // check if all nodes have been read by VerifyProof + if len(reads.reads) != nodeSet.KeyCount() { + return errUselessNodes + } + r.Proof = nodeSet + return nil + + default: return errInvalidMessageType } - proofs := msg.Obj.([][]rlp.RawValue) - if len(proofs) != 1 { - return errMultipleEntries - } - // Verify the proof and store if checks out - if _, err := trie.VerifyProof(r.Id.Root, r.Key, proofs[0]); err != nil { - return fmt.Errorf("merkle proof verification failed: %v", err) - } - r.Proof = proofs[0] - return nil } type CodeReq struct { @@ -249,11 +278,11 @@ func (r *CodeRequest) CanSend(peer *peer) bool { // Request sends an ODR request to the LES network (implementation of LesOdrRequest) func (r *CodeRequest) Request(reqID uint64, peer *peer) error { peer.Log().Debug("Requesting code data", "hash", r.Hash) - req := &CodeReq{ + req := CodeReq{ BHash: r.Id.BlockHash, AccKey: r.Id.AccKey, } - return peer.RequestCode(reqID, r.GetCost(peer), []*CodeReq{req}) + return peer.RequestCode(reqID, r.GetCost(peer), []CodeReq{req}) } // Valid processes an ODR request reply message from the LES network @@ -268,7 +297,7 @@ func (r *CodeRequest) Validate(db ethdb.Database, msg *Msg) error { } reply := msg.Obj.([][]byte) if len(reply) != 1 { - return errMultipleEntries + return errInvalidEntryCount } data := reply[0] @@ -280,10 +309,36 @@ func (r *CodeRequest) Validate(db ethdb.Database, msg *Msg) error { return nil } -type ChtReq struct { - ChtNum, BlockNum, FromLevel uint64 +const ( + // helper trie type constants + htCanonical = iota // Canonical hash trie + htBloomBits // BloomBits trie + + // applicable for all helper trie requests + auxRoot = 1 + // applicable for htCanonical + auxHeader = 2 +) + +type HelperTrieReq struct { + HelperTrieType uint + TrieIdx uint64 + Key []byte + FromLevel, AuxReq uint } +type HelperTrieResps struct { // describes all responses, not just a single one + Proofs light.NodeList + AuxData [][]byte +} + +// legacy LES/1 +type ChtReq struct { + ChtNum, BlockNum uint64 + FromLevel uint +} + +// legacy LES/1 type ChtResp struct { Header *types.Header Proof []rlp.RawValue @@ -295,7 +350,14 @@ type ChtRequest light.ChtRequest // GetCost returns the cost of the given ODR request according to the serving // peer's cost table (implementation of LesOdrRequest) func (r *ChtRequest) GetCost(peer *peer) uint64 { - return peer.GetRequestCost(GetHeaderProofsMsg, 1) + switch peer.version { + case lpv1: + return peer.GetRequestCost(GetHeaderProofsMsg, 1) + case lpv2: + return peer.GetRequestCost(GetHelperTrieProofsMsg, 1) + default: + panic(nil) + } } // CanSend tells if a certain peer is suitable for serving the given request @@ -303,17 +365,21 @@ func (r *ChtRequest) CanSend(peer *peer) bool { peer.lock.RLock() defer peer.lock.RUnlock() - return r.ChtNum <= (peer.headInfo.Number-light.ChtConfirmations)/light.ChtFrequency + return peer.headInfo.Number >= light.HelperTrieConfirmations && r.ChtNum <= (peer.headInfo.Number-light.HelperTrieConfirmations)/light.ChtFrequency } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) func (r *ChtRequest) Request(reqID uint64, peer *peer) error { peer.Log().Debug("Requesting CHT", "cht", r.ChtNum, "block", r.BlockNum) - req := &ChtReq{ - ChtNum: r.ChtNum, - BlockNum: r.BlockNum, + var encNum [8]byte + binary.BigEndian.PutUint64(encNum[:], r.BlockNum) + req := HelperTrieReq{ + HelperTrieType: htCanonical, + TrieIdx: r.ChtNum, + Key: encNum[:], + AuxReq: auxHeader, } - return peer.RequestHeaderProofs(reqID, r.GetCost(peer), []*ChtReq{req}) + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) } // Valid processes an ODR request reply message from the LES network @@ -322,35 +388,179 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error { func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error { log.Debug("Validating CHT", "cht", r.ChtNum, "block", r.BlockNum) - // Ensure we have a correct message with a single proof element - if msg.MsgType != MsgHeaderProofs { + switch msg.MsgType { + case MsgHeaderProofs: // LES/1 backwards compatibility + proofs := msg.Obj.([]ChtResp) + if len(proofs) != 1 { + return errInvalidEntryCount + } + proof := proofs[0] + + // Verify the CHT + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], r.BlockNum) + + value, err, _ := trie.VerifyProof(r.ChtRoot, encNumber[:], light.NodeList(proof.Proof).NodeSet()) + if err != nil { + return err + } + var node light.ChtNode + if err := rlp.DecodeBytes(value, &node); err != nil { + return err + } + if node.Hash != proof.Header.Hash() { + return errCHTHashMismatch + } + // Verifications passed, store and return + r.Header = proof.Header + r.Proof = light.NodeList(proof.Proof).NodeSet() + r.Td = node.Td + case MsgHelperTrieProofs: + resp := msg.Obj.(HelperTrieResps) + if len(resp.AuxData) != 1 { + return errInvalidEntryCount + } + nodeSet := resp.Proofs.NodeSet() + headerEnc := resp.AuxData[0] + if len(headerEnc) == 0 { + return errHeaderUnavailable + } + header := new(types.Header) + if err := rlp.DecodeBytes(headerEnc, header); err != nil { + return errHeaderUnavailable + } + + // Verify the CHT + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], r.BlockNum) + + reads := &readTraceDB{db: nodeSet} + value, err, _ := trie.VerifyProof(r.ChtRoot, encNumber[:], reads) + if err != nil { + return fmt.Errorf("merkle proof verification failed: %v", err) + } + if len(reads.reads) != nodeSet.KeyCount() { + return errUselessNodes + } + + var node light.ChtNode + if err := rlp.DecodeBytes(value, &node); err != nil { + return err + } + if node.Hash != header.Hash() { + return errCHTHashMismatch + } + if r.BlockNum != header.Number.Uint64() { + return errCHTNumberMismatch + } + // Verifications passed, store and return + r.Header = header + r.Proof = nodeSet + r.Td = node.Td + default: return errInvalidMessageType } - proofs := msg.Obj.([]ChtResp) - if len(proofs) != 1 { - return errMultipleEntries - } - proof := proofs[0] - - // Verify the CHT - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], r.BlockNum) - - value, err := trie.VerifyProof(r.ChtRoot, encNumber[:], proof.Proof) - if err != nil { - return err - } - var node light.ChtNode - if err := rlp.DecodeBytes(value, &node); err != nil { - return err - } - if node.Hash != proof.Header.Hash() { - return errCHTHashMismatch - } - // Verifications passed, store and return - r.Header = proof.Header - r.Proof = proof.Proof - r.Td = node.Td - return nil } + +type BloomReq struct { + BloomTrieNum, BitIdx, SectionIdx, FromLevel uint64 +} + +// ODR request type for requesting headers by Canonical Hash Trie, see LesOdrRequest interface +type BloomRequest light.BloomRequest + +// GetCost returns the cost of the given ODR request according to the serving +// peer's cost table (implementation of LesOdrRequest) +func (r *BloomRequest) GetCost(peer *peer) uint64 { + return peer.GetRequestCost(GetHelperTrieProofsMsg, len(r.SectionIdxList)) +} + +// CanSend tells if a certain peer is suitable for serving the given request +func (r *BloomRequest) CanSend(peer *peer) bool { + peer.lock.RLock() + defer peer.lock.RUnlock() + + if peer.version < lpv2 { + return false + } + return peer.headInfo.Number >= light.HelperTrieConfirmations && r.BloomTrieNum <= (peer.headInfo.Number-light.HelperTrieConfirmations)/light.BloomTrieFrequency +} + +// Request sends an ODR request to the LES network (implementation of LesOdrRequest) +func (r *BloomRequest) Request(reqID uint64, peer *peer) error { + peer.Log().Debug("Requesting BloomBits", "bloomTrie", r.BloomTrieNum, "bitIdx", r.BitIdx, "sections", r.SectionIdxList) + reqs := make([]HelperTrieReq, len(r.SectionIdxList)) + + var encNumber [10]byte + binary.BigEndian.PutUint16(encNumber[0:2], uint16(r.BitIdx)) + + for i, sectionIdx := range r.SectionIdxList { + binary.BigEndian.PutUint64(encNumber[2:10], sectionIdx) + reqs[i] = HelperTrieReq{ + HelperTrieType: htBloomBits, + TrieIdx: r.BloomTrieNum, + Key: common.CopyBytes(encNumber[:]), + } + } + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), reqs) +} + +// Valid processes an ODR request reply message from the LES network +// returns true and stores results in memory if the message was a valid reply +// to the request (implementation of LesOdrRequest) +func (r *BloomRequest) Validate(db ethdb.Database, msg *Msg) error { + log.Debug("Validating BloomBits", "bloomTrie", r.BloomTrieNum, "bitIdx", r.BitIdx, "sections", r.SectionIdxList) + + // Ensure we have a correct message with a single proof element + if msg.MsgType != MsgHelperTrieProofs { + return errInvalidMessageType + } + resps := msg.Obj.(HelperTrieResps) + proofs := resps.Proofs + nodeSet := proofs.NodeSet() + reads := &readTraceDB{db: nodeSet} + + r.BloomBits = make([][]byte, len(r.SectionIdxList)) + + // Verify the proofs + var encNumber [10]byte + binary.BigEndian.PutUint16(encNumber[0:2], uint16(r.BitIdx)) + + for i, idx := range r.SectionIdxList { + binary.BigEndian.PutUint64(encNumber[2:10], idx) + value, err, _ := trie.VerifyProof(r.BloomTrieRoot, encNumber[:], reads) + if err != nil { + return err + } + r.BloomBits[i] = value + } + + if len(reads.reads) != nodeSet.KeyCount() { + return errUselessNodes + } + r.Proofs = nodeSet + return nil +} + +// readTraceDB stores the keys of database reads. We use this to check that received node +// sets contain only the trie nodes necessary to make proofs pass. +type readTraceDB struct { + db trie.DatabaseReader + reads map[string]struct{} +} + +// Get returns a stored node +func (db *readTraceDB) Get(k []byte) ([]byte, error) { + if db.reads == nil { + db.reads = make(map[string]struct{}) + } + db.reads[string(k)] = struct{}{} + return db.db.Get(k) +} + +// Has returns true if the node set contains the given key +func (db *readTraceDB) Has(key []byte) (bool, error) { + _, err := db.Get(key) + return err == nil, nil +} diff --git a/les/odr_test.go b/les/odr_test.go index f56c4036d4..865f5d83e5 100644 --- a/les/odr_test.go +++ b/les/odr_test.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/params" @@ -39,6 +40,8 @@ type odrTestFn func(ctx context.Context, db ethdb.Database, config *params.Chain func TestOdrGetBlockLes1(t *testing.T) { testOdr(t, 1, 1, odrGetBlock) } +func TestOdrGetBlockLes2(t *testing.T) { testOdr(t, 2, 1, odrGetBlock) } + func odrGetBlock(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { var block *types.Block if bc != nil { @@ -55,6 +58,8 @@ func odrGetBlock(ctx context.Context, db ethdb.Database, config *params.ChainCon func TestOdrGetReceiptsLes1(t *testing.T) { testOdr(t, 1, 1, odrGetReceipts) } +func TestOdrGetReceiptsLes2(t *testing.T) { testOdr(t, 2, 1, odrGetReceipts) } + func odrGetReceipts(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { var receipts types.Receipts if bc != nil { @@ -71,6 +76,8 @@ func odrGetReceipts(ctx context.Context, db ethdb.Database, config *params.Chain func TestOdrAccountsLes1(t *testing.T) { testOdr(t, 1, 1, odrAccounts) } +func TestOdrAccountsLes2(t *testing.T) { testOdr(t, 2, 1, odrAccounts) } + func odrAccounts(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { dummyAddr := common.HexToAddress("1234567812345678123456781234567812345678") acc := []common.Address{testBankAddress, acc1Addr, acc2Addr, dummyAddr} @@ -100,6 +107,8 @@ func odrAccounts(ctx context.Context, db ethdb.Database, config *params.ChainCon func TestOdrContractCallLes1(t *testing.T) { testOdr(t, 1, 2, odrContractCall) } +func TestOdrContractCallLes2(t *testing.T) { testOdr(t, 2, 2, odrContractCall) } + type callmsg struct { types.Message } @@ -154,7 +163,7 @@ func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) { rm := newRetrieveManager(peers, dist, nil) db, _ := ethdb.NewMemDatabase() ldb, _ := ethdb.NewMemDatabase() - odr := NewLesOdr(ldb, rm) + odr := NewLesOdr(ldb, light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency), rm) pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db) lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb) _, err1, lpeer, err2 := newTestPeerPair("peer", protocol, pm, lpm) diff --git a/les/peer.go b/les/peer.go index 3ba2df3fe8..104afb6dc9 100644 --- a/les/peer.go +++ b/les/peer.go @@ -18,6 +18,8 @@ package les import ( + "crypto/ecdsa" + "encoding/binary" "errors" "fmt" "math/big" @@ -25,9 +27,11 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rlp" ) @@ -40,14 +44,23 @@ var ( const maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) +const ( + announceTypeNone = iota + announceTypeSimple + announceTypeSigned +) + type peer struct { *p2p.Peer + pubKey *ecdsa.PublicKey rw p2p.MsgReadWriter version int // Protocol version negotiated network uint64 // Network ID being on + announceType, requestAnnounceType uint64 + id string headInfo *announceData @@ -68,9 +81,11 @@ type peer struct { func newPeer(version int, network uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { id := p.ID() + pubKey, _ := id.Pubkey() return &peer{ Peer: p, + pubKey: pubKey, rw: rw, version: version, network: network, @@ -197,16 +212,31 @@ func (p *peer) SendReceiptsRLP(reqID, bv uint64, receipts []rlp.RawValue) error return sendResponse(p.rw, ReceiptsMsg, reqID, bv, receipts) } -// SendProofs sends a batch of merkle proofs, corresponding to the ones requested. +// SendProofs sends a batch of legacy LES/1 merkle proofs, corresponding to the ones requested. func (p *peer) SendProofs(reqID, bv uint64, proofs proofsData) error { - return sendResponse(p.rw, ProofsMsg, reqID, bv, proofs) + return sendResponse(p.rw, ProofsV1Msg, reqID, bv, proofs) } -// SendHeaderProofs sends a batch of header proofs, corresponding to the ones requested. +// SendProofsV2 sends a batch of merkle proofs, corresponding to the ones requested. +func (p *peer) SendProofsV2(reqID, bv uint64, proofs light.NodeList) error { + return sendResponse(p.rw, ProofsV2Msg, reqID, bv, proofs) +} + +// SendHeaderProofs sends a batch of legacy LES/1 header proofs, corresponding to the ones requested. func (p *peer) SendHeaderProofs(reqID, bv uint64, proofs []ChtResp) error { return sendResponse(p.rw, HeaderProofsMsg, reqID, bv, proofs) } +// SendHelperTrieProofs sends a batch of HelperTrie proofs, corresponding to the ones requested. +func (p *peer) SendHelperTrieProofs(reqID, bv uint64, resp HelperTrieResps) error { + return sendResponse(p.rw, HelperTrieProofsMsg, reqID, bv, resp) +} + +// SendTxStatus sends a batch of transaction status records, corresponding to the ones requested. +func (p *peer) SendTxStatus(reqID, bv uint64, status []core.TxStatusData) error { + return sendResponse(p.rw, TxStatusMsg, reqID, bv, status) +} + // RequestHeadersByHash fetches a batch of blocks' headers corresponding to the // specified header query, based on the hash of an origin block. func (p *peer) RequestHeadersByHash(reqID, cost uint64, origin common.Hash, amount int, skip int, reverse bool) error { @@ -230,7 +260,7 @@ func (p *peer) RequestBodies(reqID, cost uint64, hashes []common.Hash) error { // RequestCode fetches a batch of arbitrary data from a node's known state // data, corresponding to the specified hashes. -func (p *peer) RequestCode(reqID, cost uint64, reqs []*CodeReq) error { +func (p *peer) RequestCode(reqID, cost uint64, reqs []CodeReq) error { p.Log().Debug("Fetching batch of codes", "count", len(reqs)) return sendRequest(p.rw, GetCodeMsg, reqID, cost, reqs) } @@ -242,20 +272,58 @@ func (p *peer) RequestReceipts(reqID, cost uint64, hashes []common.Hash) error { } // RequestProofs fetches a batch of merkle proofs from a remote node. -func (p *peer) RequestProofs(reqID, cost uint64, reqs []*ProofReq) error { +func (p *peer) RequestProofs(reqID, cost uint64, reqs []ProofReq) error { p.Log().Debug("Fetching batch of proofs", "count", len(reqs)) - return sendRequest(p.rw, GetProofsMsg, reqID, cost, reqs) + switch p.version { + case lpv1: + return sendRequest(p.rw, GetProofsV1Msg, reqID, cost, reqs) + case lpv2: + return sendRequest(p.rw, GetProofsV2Msg, reqID, cost, reqs) + default: + panic(nil) + } + } -// RequestHeaderProofs fetches a batch of header merkle proofs from a remote node. -func (p *peer) RequestHeaderProofs(reqID, cost uint64, reqs []*ChtReq) error { - p.Log().Debug("Fetching batch of header proofs", "count", len(reqs)) - return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqs) +// RequestHelperTrieProofs fetches a batch of HelperTrie merkle proofs from a remote node. +func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, reqs []HelperTrieReq) error { + p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) + switch p.version { + case lpv1: + reqsV1 := make([]ChtReq, len(reqs)) + for i, req := range reqs { + if req.HelperTrieType != htCanonical || req.AuxReq != auxHeader || len(req.Key) != 8 { + return fmt.Errorf("Request invalid in LES/1 mode") + } + blockNum := binary.BigEndian.Uint64(req.Key) + // convert HelperTrie request to old CHT request + reqsV1[i] = ChtReq{ChtNum: (req.TrieIdx+1)*(light.ChtFrequency/light.ChtV1Frequency) - 1, BlockNum: blockNum, FromLevel: req.FromLevel} + } + return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqsV1) + case lpv2: + return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) + default: + panic(nil) + } } +// RequestTxStatus fetches a batch of transaction status records from a remote node. +func (p *peer) RequestTxStatus(reqID, cost uint64, txHashes []common.Hash) error { + p.Log().Debug("Requesting transaction status", "count", len(txHashes)) + return sendRequest(p.rw, GetTxStatusMsg, reqID, cost, txHashes) +} + +// SendTxStatus sends a batch of transactions to be added to the remote transaction pool. func (p *peer) SendTxs(reqID, cost uint64, txs types.Transactions) error { p.Log().Debug("Fetching batch of transactions", "count", len(txs)) - return p2p.Send(p.rw, SendTxMsg, txs) + switch p.version { + case lpv1: + return p2p.Send(p.rw, SendTxMsg, txs) // old message format does not include reqID + case lpv2: + return sendRequest(p.rw, SendTxV2Msg, reqID, cost, txs) + default: + panic(nil) + } } type keyValueEntry struct { @@ -289,7 +357,7 @@ func (l keyValueList) decode() keyValueMap { func (m keyValueMap) get(key string, val interface{}) error { enc, ok := m[key] if !ok { - return errResp(ErrHandshakeMissingKey, "%s", key) + return errResp(ErrMissingKey, "%s", key) } if val == nil { return nil @@ -348,6 +416,9 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis list := server.fcCostStats.getCurrentList() send = send.add("flowControl/MRC", list) p.fcCosts = list.decode() + } else { + p.requestAnnounceType = announceTypeSimple // set to default until "very light" client mode is implemented + send = send.add("announceType", p.requestAnnounceType) } recvList, err := p.sendReceiveHandshake(send) if err != nil { @@ -392,6 +463,9 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis /*if recv.get("serveStateSince", nil) == nil { return errResp(ErrUselessPeer, "wanted client, got server") }*/ + if recv.get("announceType", &p.announceType) != nil { + p.announceType = announceTypeSimple + } p.fcClient = flowcontrol.NewClientNode(server.fcManager, server.defParams) } else { if recv.get("serveChainSince", nil) != nil { @@ -456,11 +530,15 @@ func newPeerSet() *peerSet { // notify adds a service to be notified about added or removed peers func (ps *peerSet) notify(n peerSetNotify) { ps.lock.Lock() - defer ps.lock.Unlock() - ps.notifyList = append(ps.notifyList, n) + peers := make([]*peer, 0, len(ps.peers)) for _, p := range ps.peers { - go n.registerPeer(p) + peers = append(peers, p) + } + ps.lock.Unlock() + + for _, p := range peers { + n.registerPeer(p) } } @@ -468,8 +546,6 @@ func (ps *peerSet) notify(n peerSetNotify) { // peer is already known. func (ps *peerSet) Register(p *peer) error { ps.lock.Lock() - defer ps.lock.Unlock() - if ps.closed { return errClosed } @@ -478,8 +554,12 @@ func (ps *peerSet) Register(p *peer) error { } ps.peers[p.id] = p p.sendQueue = newExecQueue(100) - for _, n := range ps.notifyList { - go n.registerPeer(p) + peers := make([]peerSetNotify, len(ps.notifyList)) + copy(peers, ps.notifyList) + ps.lock.Unlock() + + for _, n := range peers { + n.registerPeer(p) } return nil } @@ -488,19 +568,22 @@ func (ps *peerSet) Register(p *peer) error { // actions to/from that particular entity. It also initiates disconnection at the networking layer. func (ps *peerSet) Unregister(id string) error { ps.lock.Lock() - defer ps.lock.Unlock() - if p, ok := ps.peers[id]; !ok { + ps.lock.Unlock() return errNotRegistered } else { - for _, n := range ps.notifyList { - go n.unregisterPeer(p) + delete(ps.peers, id) + peers := make([]peerSetNotify, len(ps.notifyList)) + copy(peers, ps.notifyList) + ps.lock.Unlock() + + for _, n := range peers { + n.unregisterPeer(p) } p.sendQueue.quit() p.Peer.Disconnect(p2p.DiscUselessPeer) + return nil } - delete(ps.peers, id) - return nil } // AllPeerIDs returns a list of all registered peer IDs diff --git a/les/protocol.go b/les/protocol.go index 33d930ee0c..146b02030e 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -18,24 +18,34 @@ package les import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "errors" "fmt" "io" "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/rlp" ) // Constants to match up protocol versions and messages const ( lpv1 = 1 + lpv2 = 2 ) -// Supported versions of the les protocol (first is primary). -var ProtocolVersions = []uint{lpv1} +// Supported versions of the les protocol (first is primary) +var ( + ClientProtocolVersions = []uint{lpv2, lpv1} + ServerProtocolVersions = []uint{lpv2, lpv1} +) // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{15} +var ProtocolLengths = map[uint]uint64{lpv1: 15, lpv2: 22} const ( NetworkId = 1 @@ -53,13 +63,21 @@ const ( BlockBodiesMsg = 0x05 GetReceiptsMsg = 0x06 ReceiptsMsg = 0x07 - GetProofsMsg = 0x08 - ProofsMsg = 0x09 + GetProofsV1Msg = 0x08 + ProofsV1Msg = 0x09 GetCodeMsg = 0x0a CodeMsg = 0x0b SendTxMsg = 0x0c GetHeaderProofsMsg = 0x0d HeaderProofsMsg = 0x0e + // Protocol messages belonging to LPV2 + GetProofsV2Msg = 0x0f + ProofsV2Msg = 0x10 + GetHelperTrieProofsMsg = 0x11 + HelperTrieProofsMsg = 0x12 + SendTxV2Msg = 0x13 + GetTxStatusMsg = 0x14 + TxStatusMsg = 0x15 ) type errCode int @@ -79,7 +97,7 @@ const ( ErrUnexpectedResponse ErrInvalidResponse ErrTooManyTimeouts - ErrHandshakeMissingKey + ErrMissingKey ) func (e errCode) String() string { @@ -101,7 +119,13 @@ var errorToString = map[int]string{ ErrUnexpectedResponse: "Unexpected response", ErrInvalidResponse: "Invalid response", ErrTooManyTimeouts: "Too many request timeouts", - ErrHandshakeMissingKey: "Key missing from handshake message", + ErrMissingKey: "Key missing from list", +} + +type announceBlock struct { + Hash common.Hash // Hash of one particular block being announced + Number uint64 // Number of one particular block being announced + Td *big.Int // Total difficulty of one particular block being announced } // announceData is the network packet for the block announcements. @@ -113,6 +137,32 @@ type announceData struct { Update keyValueList } +// sign adds a signature to the block announcement by the given privKey +func (a *announceData) sign(privKey *ecdsa.PrivateKey) { + rlp, _ := rlp.EncodeToBytes(announceBlock{a.Hash, a.Number, a.Td}) + sig, _ := crypto.Sign(crypto.Keccak256(rlp), privKey) + a.Update = a.Update.add("sign", sig) +} + +// checkSignature verifies if the block announcement has a valid signature by the given pubKey +func (a *announceData) checkSignature(pubKey *ecdsa.PublicKey) error { + var sig []byte + if err := a.Update.decode().get("sign", &sig); err != nil { + return err + } + rlp, _ := rlp.EncodeToBytes(announceBlock{a.Hash, a.Number, a.Td}) + recPubkey, err := secp256k1.RecoverPubkey(crypto.Keccak256(rlp), sig) + if err != nil { + return err + } + pbytes := elliptic.Marshal(pubKey.Curve, pubKey.X, pubKey.Y) + if bytes.Equal(pbytes, recPubkey) { + return nil + } else { + return errors.New("Wrong signature") + } +} + type blockInfo struct { Hash common.Hash // Hash of one particular block being announced Number uint64 // Number of one particular block being announced diff --git a/les/request_test.go b/les/request_test.go index 6b594462dc..c13625de8e 100644 --- a/les/request_test.go +++ b/les/request_test.go @@ -24,6 +24,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/light" ) @@ -38,24 +39,32 @@ type accessTestFn func(db ethdb.Database, bhash common.Hash, number uint64) ligh func TestBlockAccessLes1(t *testing.T) { testAccess(t, 1, tfBlockAccess) } +func TestBlockAccessLes2(t *testing.T) { testAccess(t, 2, tfBlockAccess) } + func tfBlockAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { return &light.BlockRequest{Hash: bhash, Number: number} } func TestReceiptsAccessLes1(t *testing.T) { testAccess(t, 1, tfReceiptsAccess) } +func TestReceiptsAccessLes2(t *testing.T) { testAccess(t, 2, tfReceiptsAccess) } + func tfReceiptsAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { return &light.ReceiptsRequest{Hash: bhash, Number: number} } func TestTrieEntryAccessLes1(t *testing.T) { testAccess(t, 1, tfTrieEntryAccess) } +func TestTrieEntryAccessLes2(t *testing.T) { testAccess(t, 2, tfTrieEntryAccess) } + func tfTrieEntryAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { return &light.TrieRequest{Id: light.StateTrieID(core.GetHeader(db, bhash, core.GetBlockNumber(db, bhash))), Key: testBankSecureTrieKey} } func TestCodeAccessLes1(t *testing.T) { testAccess(t, 1, tfCodeAccess) } +func TestCodeAccessLes2(t *testing.T) { testAccess(t, 2, tfCodeAccess) } + func tfCodeAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { header := core.GetHeader(db, bhash, core.GetBlockNumber(db, bhash)) if header.Number.Uint64() < testContractDeployed { @@ -73,7 +82,7 @@ func testAccess(t *testing.T, protocol int, fn accessTestFn) { rm := newRetrieveManager(peers, dist, nil) db, _ := ethdb.NewMemDatabase() ldb, _ := ethdb.NewMemDatabase() - odr := NewLesOdr(ldb, rm) + odr := NewLesOdr(ldb, light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency), rm) pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db) lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb) diff --git a/les/retrieve.go b/les/retrieve.go index b060e0b0d8..dd15b56acf 100644 --- a/les/retrieve.go +++ b/les/retrieve.go @@ -22,6 +22,7 @@ import ( "context" "crypto/rand" "encoding/binary" + "fmt" "sync" "time" @@ -111,12 +112,14 @@ func newRetrieveManager(peers *peerSet, dist *requestDistributor, serverPool pee // that is delivered through the deliver function and successfully validated by the // validator callback. It returns when a valid answer is delivered or the context is // cancelled. -func (rm *retrieveManager) retrieve(ctx context.Context, reqID uint64, req *distReq, val validatorFunc) error { +func (rm *retrieveManager) retrieve(ctx context.Context, reqID uint64, req *distReq, val validatorFunc, shutdown chan struct{}) error { sentReq := rm.sendReq(reqID, req, val) select { case <-sentReq.stopCh: case <-ctx.Done(): sentReq.stop(ctx.Err()) + case <-shutdown: + sentReq.stop(fmt.Errorf("Client is shutting down")) } return sentReq.getError() } diff --git a/les/server.go b/les/server.go index 8b27307141..d8f93cd87b 100644 --- a/les/server.go +++ b/les/server.go @@ -18,10 +18,11 @@ package les import ( + "crypto/ecdsa" "encoding/binary" + "fmt" "math" "sync" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -34,7 +35,6 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discv5" "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/trie" ) type LesServer struct { @@ -42,23 +42,55 @@ type LesServer struct { fcManager *flowcontrol.ClientManager // nil if our node is client only fcCostStats *requestCostStats defParams *flowcontrol.ServerParams - lesTopic discv5.Topic + lesTopics []discv5.Topic + privateKey *ecdsa.PrivateKey quitSync chan struct{} + + chtIndexer, bloomTrieIndexer *core.ChainIndexer } func NewLesServer(eth *eth.Ethereum, config *eth.Config) (*LesServer, error) { quitSync := make(chan struct{}) - pm, err := NewProtocolManager(eth.BlockChain().Config(), false, config.NetworkId, eth.EventMux(), eth.Engine(), newPeerSet(), eth.BlockChain(), eth.TxPool(), eth.ChainDb(), nil, nil, quitSync, new(sync.WaitGroup)) + pm, err := NewProtocolManager(eth.BlockChain().Config(), false, ServerProtocolVersions, config.NetworkId, eth.EventMux(), eth.Engine(), newPeerSet(), eth.BlockChain(), eth.TxPool(), eth.ChainDb(), nil, nil, quitSync, new(sync.WaitGroup)) if err != nil { return nil, err } - pm.blockLoop() + + lesTopics := make([]discv5.Topic, len(ServerProtocolVersions)) + for i, pv := range ServerProtocolVersions { + lesTopics[i] = lesTopic(eth.BlockChain().Genesis().Hash(), pv) + } srv := &LesServer{ - protocolManager: pm, - quitSync: quitSync, - lesTopic: lesTopic(eth.BlockChain().Genesis().Hash()), + protocolManager: pm, + quitSync: quitSync, + lesTopics: lesTopics, + chtIndexer: light.NewChtIndexer(eth.ChainDb(), false), + bloomTrieIndexer: light.NewBloomTrieIndexer(eth.ChainDb(), false), } + logger := log.New() + + chtV1SectionCount, _, _ := srv.chtIndexer.Sections() // indexer still uses LES/1 4k section size for backwards server compatibility + chtV2SectionCount := chtV1SectionCount / (light.ChtFrequency / light.ChtV1Frequency) + if chtV2SectionCount != 0 { + // convert to LES/2 section + chtLastSection := chtV2SectionCount - 1 + // convert last LES/2 section index back to LES/1 index for chtIndexer.SectionHead + chtLastSectionV1 := (chtLastSection+1)*(light.ChtFrequency/light.ChtV1Frequency) - 1 + chtSectionHead := srv.chtIndexer.SectionHead(chtLastSectionV1) + chtRoot := light.GetChtV2Root(pm.chainDb, chtLastSection, chtSectionHead) + logger.Info("CHT", "section", chtLastSection, "sectionHead", fmt.Sprintf("%064x", chtSectionHead), "root", fmt.Sprintf("%064x", chtRoot)) + } + + bloomTrieSectionCount, _, _ := srv.bloomTrieIndexer.Sections() + if bloomTrieSectionCount != 0 { + bloomTrieLastSection := bloomTrieSectionCount - 1 + bloomTrieSectionHead := srv.bloomTrieIndexer.SectionHead(bloomTrieLastSection) + bloomTrieRoot := light.GetBloomTrieRoot(pm.chainDb, bloomTrieLastSection, bloomTrieSectionHead) + logger.Info("BloomTrie", "section", bloomTrieLastSection, "sectionHead", fmt.Sprintf("%064x", bloomTrieSectionHead), "root", fmt.Sprintf("%064x", bloomTrieRoot)) + } + + srv.chtIndexer.Start(eth.BlockChain()) pm.server = srv srv.defParams = &flowcontrol.ServerParams{ @@ -77,17 +109,28 @@ func (s *LesServer) Protocols() []p2p.Protocol { // Start starts the LES server func (s *LesServer) Start(srvr *p2p.Server) { s.protocolManager.Start() - go func() { - logger := log.New("topic", s.lesTopic) - logger.Info("Starting topic registration") - defer logger.Info("Terminated topic registration") + for _, topic := range s.lesTopics { + topic := topic + go func() { + logger := log.New("topic", topic) + logger.Info("Starting topic registration") + defer logger.Info("Terminated topic registration") - srvr.DiscV5.RegisterTopic(s.lesTopic, s.quitSync) - }() + srvr.DiscV5.RegisterTopic(topic, s.quitSync) + }() + } + s.privateKey = srvr.PrivateKey + s.protocolManager.blockLoop() +} + +func (s *LesServer) SetBloomBitsIndexer(bloomIndexer *core.ChainIndexer) { + bloomIndexer.AddChildIndexer(s.bloomTrieIndexer) } // Stop stops the LES service func (s *LesServer) Stop() { + s.chtIndexer.Close() + // bloom trie indexer is closed by parent bloombits indexer s.fcCostStats.store() s.fcManager.Stop() go func() { @@ -273,10 +316,7 @@ func (pm *ProtocolManager) blockLoop() { pm.wg.Add(1) headCh := make(chan core.ChainHeadEvent, 10) headSub := pm.blockchain.SubscribeChainHeadEvent(headCh) - newCht := make(chan struct{}, 10) - newCht <- struct{}{} go func() { - var mu sync.Mutex var lastHead *types.Header lastBroadcastTd := common.Big0 for { @@ -299,26 +339,37 @@ func (pm *ProtocolManager) blockLoop() { log.Debug("Announcing block to peers", "number", number, "hash", hash, "td", td, "reorg", reorg) announce := announceData{Hash: hash, Number: number, Td: td, ReorgDepth: reorg} + var ( + signed bool + signedAnnounce announceData + ) + for _, p := range peers { - select { - case p.announceChn <- announce: - default: - pm.removePeer(p.id) + switch p.announceType { + + case announceTypeSimple: + select { + case p.announceChn <- announce: + default: + pm.removePeer(p.id) + } + + case announceTypeSigned: + if !signed { + signedAnnounce = announce + signedAnnounce.sign(pm.server.privateKey) + signed = true + } + + select { + case p.announceChn <- signedAnnounce: + default: + pm.removePeer(p.id) + } } } } } - newCht <- struct{}{} - case <-newCht: - go func() { - mu.Lock() - more := makeCht(pm.chainDb) - mu.Unlock() - if more { - time.Sleep(time.Millisecond * 10) - newCht <- struct{}{} - } - }() case <-pm.quitSync: headSub.Unsubscribe() pm.wg.Done() @@ -327,86 +378,3 @@ func (pm *ProtocolManager) blockLoop() { } }() } - -var ( - lastChtKey = []byte("LastChtNumber") // chtNum (uint64 big endian) - chtPrefix = []byte("cht") // chtPrefix + chtNum (uint64 big endian) -> trie root hash -) - -func getChtRoot(db ethdb.Database, num uint64) common.Hash { - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], num) - data, _ := db.Get(append(chtPrefix, encNumber[:]...)) - return common.BytesToHash(data) -} - -func storeChtRoot(db ethdb.Database, num uint64, root common.Hash) { - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], num) - db.Put(append(chtPrefix, encNumber[:]...), root[:]) -} - -func makeCht(db ethdb.Database) bool { - headHash := core.GetHeadBlockHash(db) - headNum := core.GetBlockNumber(db, headHash) - - var newChtNum uint64 - if headNum > light.ChtConfirmations { - newChtNum = (headNum - light.ChtConfirmations) / light.ChtFrequency - } - - var lastChtNum uint64 - data, _ := db.Get(lastChtKey) - if len(data) == 8 { - lastChtNum = binary.BigEndian.Uint64(data[:]) - } - if newChtNum <= lastChtNum { - return false - } - - var t *trie.Trie - if lastChtNum > 0 { - var err error - t, err = trie.New(getChtRoot(db, lastChtNum), db) - if err != nil { - lastChtNum = 0 - } - } - if lastChtNum == 0 { - t, _ = trie.New(common.Hash{}, db) - } - - for num := lastChtNum * light.ChtFrequency; num < (lastChtNum+1)*light.ChtFrequency; num++ { - hash := core.GetCanonicalHash(db, num) - if hash == (common.Hash{}) { - panic("Canonical hash not found") - } - td := core.GetTd(db, hash, num) - if td == nil { - panic("TD not found") - } - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], num) - var node light.ChtNode - node.Hash = hash - node.Td = td - data, _ := rlp.EncodeToBytes(node) - t.Update(encNumber[:], data) - } - - root, err := t.Commit() - if err != nil { - lastChtNum = 0 - } else { - lastChtNum++ - - log.Trace("Generated CHT", "number", lastChtNum, "root", root.Hex()) - - storeChtRoot(db, lastChtNum, root) - var data [8]byte - binary.BigEndian.PutUint64(data[:], lastChtNum) - db.Put(lastChtKey, data[:]) - } - - return newChtNum > lastChtNum -} diff --git a/light/lightchain.go b/light/lightchain.go index 4c877a771a..30baeaccb7 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -95,15 +95,8 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. if bc.genesisBlock == nil { return nil, core.ErrNoGenesis } - if bc.genesisBlock.Hash() == params.MainnetGenesisHash { - // add trusted CHT - WriteTrustedCht(bc.chainDb, TrustedCht{Number: 1040, Root: common.HexToHash("bb4fb4076cbe6923c8a8ce8f158452bbe19564959313466989fda095a60884ca")}) - log.Info("Added trusted CHT for mainnet") - } - if bc.genesisBlock.Hash() == params.TestnetGenesisHash { - // add trusted CHT - WriteTrustedCht(bc.chainDb, TrustedCht{Number: 400, Root: common.HexToHash("2a4befa19e4675d939c3dc22dca8c6ae9fcd642be1f04b06bd6e4203cc304660")}) - log.Info("Added trusted CHT for ropsten testnet") + if cp, ok := trustedCheckpoints[bc.genesisBlock.Hash()]; ok { + bc.addTrustedCheckpoint(cp) } if err := bc.loadLastState(); err != nil { @@ -120,6 +113,22 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. return bc, nil } +// addTrustedCheckpoint adds a trusted checkpoint to the blockchain +func (self *LightChain) addTrustedCheckpoint(cp trustedCheckpoint) { + if self.odr.ChtIndexer() != nil { + StoreChtRoot(self.chainDb, cp.sectionIdx, cp.sectionHead, cp.chtRoot) + self.odr.ChtIndexer().AddKnownSectionHead(cp.sectionIdx, cp.sectionHead) + } + if self.odr.BloomTrieIndexer() != nil { + StoreBloomTrieRoot(self.chainDb, cp.sectionIdx, cp.sectionHead, cp.bloomTrieRoot) + self.odr.BloomTrieIndexer().AddKnownSectionHead(cp.sectionIdx, cp.sectionHead) + } + if self.odr.BloomIndexer() != nil { + self.odr.BloomIndexer().AddKnownSectionHead(cp.sectionIdx, cp.sectionHead) + } + log.Info("Added trusted checkpoint", "chain name", cp.name) +} + func (self *LightChain) getProcInterrupt() bool { return atomic.LoadInt32(&self.procInterrupt) == 1 } @@ -449,10 +458,13 @@ func (self *LightChain) GetHeaderByNumberOdr(ctx context.Context, number uint64) } func (self *LightChain) SyncCht(ctx context.Context) bool { + if self.odr.ChtIndexer() == nil { + return false + } headNum := self.CurrentHeader().Number.Uint64() - cht := GetTrustedCht(self.chainDb) - if headNum+1 < cht.Number*ChtFrequency { - num := cht.Number*ChtFrequency - 1 + chtCount, _, _ := self.odr.ChtIndexer().Sections() + if headNum+1 < chtCount*ChtFrequency { + num := chtCount*ChtFrequency - 1 header, err := GetHeaderByNumber(ctx, self.odr, num) if header != nil && err == nil { self.mu.Lock() diff --git a/light/nodeset.go b/light/nodeset.go new file mode 100644 index 0000000000..c530a4fbe2 --- /dev/null +++ b/light/nodeset.go @@ -0,0 +1,141 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package light + +import ( + "errors" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" +) + +// NodeSet stores a set of trie nodes. It implements trie.Database and can also +// act as a cache for another trie.Database. +type NodeSet struct { + db map[string][]byte + dataSize int + lock sync.RWMutex +} + +// NewNodeSet creates an empty node set +func NewNodeSet() *NodeSet { + return &NodeSet{ + db: make(map[string][]byte), + } +} + +// Put stores a new node in the set +func (db *NodeSet) Put(key []byte, value []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + if _, ok := db.db[string(key)]; !ok { + db.db[string(key)] = common.CopyBytes(value) + db.dataSize += len(value) + } + return nil +} + +// Get returns a stored node +func (db *NodeSet) Get(key []byte) ([]byte, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + if entry, ok := db.db[string(key)]; ok { + return entry, nil + } + return nil, errors.New("not found") +} + +// Has returns true if the node set contains the given key +func (db *NodeSet) Has(key []byte) (bool, error) { + _, err := db.Get(key) + return err == nil, nil +} + +// KeyCount returns the number of nodes in the set +func (db *NodeSet) KeyCount() int { + db.lock.RLock() + defer db.lock.RUnlock() + + return len(db.db) +} + +// DataSize returns the aggregated data size of nodes in the set +func (db *NodeSet) DataSize() int { + db.lock.RLock() + defer db.lock.RUnlock() + + return db.dataSize +} + +// NodeList converts the node set to a NodeList +func (db *NodeSet) NodeList() NodeList { + db.lock.RLock() + defer db.lock.RUnlock() + + var values NodeList + for _, value := range db.db { + values = append(values, value) + } + return values +} + +// Store writes the contents of the set to the given database +func (db *NodeSet) Store(target trie.Database) { + db.lock.RLock() + defer db.lock.RUnlock() + + for key, value := range db.db { + target.Put([]byte(key), value) + } +} + +// NodeList stores an ordered list of trie nodes. It implements trie.DatabaseWriter. +type NodeList []rlp.RawValue + +// Store writes the contents of the list to the given database +func (n NodeList) Store(db trie.Database) { + for _, node := range n { + db.Put(crypto.Keccak256(node), node) + } +} + +// NodeSet converts the node list to a NodeSet +func (n NodeList) NodeSet() *NodeSet { + db := NewNodeSet() + n.Store(db) + return db +} + +// Put stores a new node at the end of the list +func (n *NodeList) Put(key []byte, value []byte) error { + *n = append(*n, value) + return nil +} + +// DataSize returns the aggregated data size of nodes in the list +func (n NodeList) DataSize() int { + var size int + for _, node := range n { + size += len(node) + } + return size +} diff --git a/light/odr.go b/light/odr.go index d19a488f62..e2c3d9c5a4 100644 --- a/light/odr.go +++ b/light/odr.go @@ -25,9 +25,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/rlp" ) // NoOdr is the default context passed to an ODR capable function when the ODR @@ -37,6 +35,9 @@ var NoOdr = context.Background() // OdrBackend is an interface to a backend service that handles ODR retrievals type type OdrBackend interface { Database() ethdb.Database + ChtIndexer() *core.ChainIndexer + BloomTrieIndexer() *core.ChainIndexer + BloomIndexer() *core.ChainIndexer Retrieve(ctx context.Context, req OdrRequest) error } @@ -80,23 +81,12 @@ type TrieRequest struct { OdrRequest Id *TrieID Key []byte - Proof []rlp.RawValue + Proof *NodeSet } // StoreResult stores the retrieved data in local database func (req *TrieRequest) StoreResult(db ethdb.Database) { - storeProof(db, req.Proof) -} - -// storeProof stores the new trie nodes obtained from a merkle proof in the database -func storeProof(db ethdb.Database, proof []rlp.RawValue) { - for _, buf := range proof { - hash := crypto.Keccak256(buf) - val, _ := db.Get(hash) - if val == nil { - db.Put(hash, buf) - } - } + req.Proof.Store(db) } // CodeRequest is the ODR request type for retrieving contract code @@ -138,14 +128,14 @@ func (req *ReceiptsRequest) StoreResult(db ethdb.Database) { core.WriteBlockReceipts(db, req.Hash, req.Number, req.Receipts) } -// TrieRequest is the ODR request type for state/storage trie entries +// ChtRequest is the ODR request type for state/storage trie entries type ChtRequest struct { OdrRequest ChtNum, BlockNum uint64 ChtRoot common.Hash Header *types.Header Td *big.Int - Proof []rlp.RawValue + Proof *NodeSet } // StoreResult stores the retrieved data in local database @@ -155,5 +145,27 @@ func (req *ChtRequest) StoreResult(db ethdb.Database) { hash, num := req.Header.Hash(), req.Header.Number.Uint64() core.WriteTd(db, hash, num, req.Td) core.WriteCanonicalHash(db, hash, num) - //storeProof(db, req.Proof) +} + +// BloomRequest is the ODR request type for retrieving bloom filters from a CHT structure +type BloomRequest struct { + OdrRequest + BloomTrieNum uint64 + BitIdx uint + SectionIdxList []uint64 + BloomTrieRoot common.Hash + BloomBits [][]byte + Proofs *NodeSet +} + +// StoreResult stores the retrieved data in local database +func (req *BloomRequest) StoreResult(db ethdb.Database) { + for i, sectionIdx := range req.SectionIdxList { + sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*BloomTrieFrequency-1) + // if we don't have the canonical hash stored for this section head number, we'll still store it under + // a key with a zero sectionHead. GetBloomBits will look there too if we still don't have the canonical + // hash. In the unlikely case we've retrieved the section head hash since then, we'll just retrieve the + // bit vector again from the network. + core.WriteBloomBits(db, req.BitIdx, sectionIdx, sectionHead, req.BloomBits[i]) + } } diff --git a/light/odr_test.go b/light/odr_test.go index c0c5438fdb..e6afb1a480 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -77,7 +77,9 @@ func (odr *testOdr) Retrieve(ctx context.Context, req OdrRequest) error { req.Receipts = core.GetBlockReceipts(odr.sdb, req.Hash, core.GetBlockNumber(odr.sdb, req.Hash)) case *TrieRequest: t, _ := trie.New(req.Id.Root, odr.sdb) - req.Proof = t.Prove(req.Key) + nodes := NewNodeSet() + t.Prove(req.Key, 0, nodes) + req.Proof = nodes case *CodeRequest: req.Data, _ = odr.sdb.Get(req.Hash[:]) } diff --git a/light/odr_util.go b/light/odr_util.go index fcdfdb82c6..a0eb6303d4 100644 --- a/light/odr_util.go +++ b/light/odr_util.go @@ -19,56 +19,16 @@ package light import ( "bytes" "context" - "errors" - "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/rlp" ) var sha3_nil = crypto.Keccak256Hash(nil) -var ( - ErrNoTrustedCht = errors.New("No trusted canonical hash trie") - ErrNoHeader = errors.New("Header not found") - - ChtFrequency = uint64(4096) - ChtConfirmations = uint64(2048) - trustedChtKey = []byte("TrustedCHT") -) - -type ChtNode struct { - Hash common.Hash - Td *big.Int -} - -type TrustedCht struct { - Number uint64 - Root common.Hash -} - -func GetTrustedCht(db ethdb.Database) TrustedCht { - data, _ := db.Get(trustedChtKey) - var res TrustedCht - if err := rlp.DecodeBytes(data, &res); err != nil { - return TrustedCht{0, common.Hash{}} - } - return res -} - -func WriteTrustedCht(db ethdb.Database, cht TrustedCht) { - data, _ := rlp.EncodeToBytes(cht) - db.Put(trustedChtKey, data) -} - -func DeleteTrustedCht(db ethdb.Database) { - db.Delete(trustedChtKey) -} - func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*types.Header, error) { db := odr.Database() hash := core.GetCanonicalHash(db, number) @@ -81,12 +41,29 @@ func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*typ return header, nil } - cht := GetTrustedCht(db) - if number >= cht.Number*ChtFrequency { + var ( + chtCount, sectionHeadNum uint64 + sectionHead common.Hash + ) + if odr.ChtIndexer() != nil { + chtCount, sectionHeadNum, sectionHead = odr.ChtIndexer().Sections() + canonicalHash := core.GetCanonicalHash(db, sectionHeadNum) + // if the CHT was injected as a trusted checkpoint, we have no canonical hash yet so we accept zero hash too + for chtCount > 0 && canonicalHash != sectionHead && canonicalHash != (common.Hash{}) { + chtCount-- + if chtCount > 0 { + sectionHeadNum = chtCount*ChtFrequency - 1 + sectionHead = odr.ChtIndexer().SectionHead(chtCount - 1) + canonicalHash = core.GetCanonicalHash(db, sectionHeadNum) + } + } + } + + if number >= chtCount*ChtFrequency { return nil, ErrNoTrustedCht } - r := &ChtRequest{ChtRoot: cht.Root, ChtNum: cht.Number, BlockNum: number} + r := &ChtRequest{ChtRoot: GetChtRoot(db, chtCount-1, sectionHead), ChtNum: chtCount - 1, BlockNum: number} if err := odr.Retrieve(ctx, r); err != nil { return nil, err } else { @@ -162,3 +139,61 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num } return r.Receipts, nil } + +// GetBloomBits retrieves a batch of compressed bloomBits vectors belonging to the given bit index and section indexes +func GetBloomBits(ctx context.Context, odr OdrBackend, bitIdx uint, sectionIdxList []uint64) ([][]byte, error) { + db := odr.Database() + result := make([][]byte, len(sectionIdxList)) + var ( + reqList []uint64 + reqIdx []int + ) + + var ( + bloomTrieCount, sectionHeadNum uint64 + sectionHead common.Hash + ) + if odr.BloomTrieIndexer() != nil { + bloomTrieCount, sectionHeadNum, sectionHead = odr.BloomTrieIndexer().Sections() + canonicalHash := core.GetCanonicalHash(db, sectionHeadNum) + // if the BloomTrie was injected as a trusted checkpoint, we have no canonical hash yet so we accept zero hash too + for bloomTrieCount > 0 && canonicalHash != sectionHead && canonicalHash != (common.Hash{}) { + bloomTrieCount-- + if bloomTrieCount > 0 { + sectionHeadNum = bloomTrieCount*BloomTrieFrequency - 1 + sectionHead = odr.BloomTrieIndexer().SectionHead(bloomTrieCount - 1) + canonicalHash = core.GetCanonicalHash(db, sectionHeadNum) + } + } + } + + for i, sectionIdx := range sectionIdxList { + sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*BloomTrieFrequency-1) + // if we don't have the canonical hash stored for this section head number, we'll still look for + // an entry with a zero sectionHead (we store it with zero section head too if we don't know it + // at the time of the retrieval) + bloomBits, err := core.GetBloomBits(db, bitIdx, sectionIdx, sectionHead) + if err == nil { + result[i] = bloomBits + } else { + if sectionIdx >= bloomTrieCount { + return nil, ErrNoTrustedBloomTrie + } + reqList = append(reqList, sectionIdx) + reqIdx = append(reqIdx, i) + } + } + if reqList == nil { + return result, nil + } + + r := &BloomRequest{BloomTrieRoot: GetBloomTrieRoot(db, bloomTrieCount-1, sectionHead), BloomTrieNum: bloomTrieCount - 1, BitIdx: bitIdx, SectionIdxList: reqList} + if err := odr.Retrieve(ctx, r); err != nil { + return nil, err + } else { + for i, idx := range reqIdx { + result[idx] = r.BloomBits[i] + } + return result, nil + } +} diff --git a/light/postprocess.go b/light/postprocess.go new file mode 100644 index 0000000000..e7e513880f --- /dev/null +++ b/light/postprocess.go @@ -0,0 +1,295 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package light + +import ( + "encoding/binary" + "errors" + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" +) + +const ( + ChtFrequency = 32768 + ChtV1Frequency = 4096 // as long as we want to retain LES/1 compatibility, servers generate CHTs with the old, higher frequency + HelperTrieConfirmations = 2048 // number of confirmations before a server is expected to have the given HelperTrie available + HelperTrieProcessConfirmations = 256 // number of confirmations before a HelperTrie is generated +) + +// trustedCheckpoint represents a set of post-processed trie roots (CHT and BloomTrie) associated with +// the appropriate section index and head hash. It is used to start light syncing from this checkpoint +// and avoid downloading the entire header chain while still being able to securely access old headers/logs. +type trustedCheckpoint struct { + name string + sectionIdx uint64 + sectionHead, chtRoot, bloomTrieRoot common.Hash +} + +var ( + mainnetCheckpoint = trustedCheckpoint{ + name: "ETH mainnet", + sectionIdx: 129, + sectionHead: common.HexToHash("64100587c8ec9a76870056d07cb0f58622552d16de6253a59cac4b580c899501"), + chtRoot: common.HexToHash("bb4fb4076cbe6923c8a8ce8f158452bbe19564959313466989fda095a60884ca"), + bloomTrieRoot: common.HexToHash("0db524b2c4a2a9520a42fd842b02d2e8fb58ff37c75cf57bd0eb82daeace6716"), + } + + ropstenCheckpoint = trustedCheckpoint{ + name: "Ropsten testnet", + sectionIdx: 50, + sectionHead: common.HexToHash("00bd65923a1aa67f85e6b4ae67835784dd54be165c37f056691723c55bf016bd"), + chtRoot: common.HexToHash("6f56dc61936752cc1f8c84b4addabdbe6a1c19693de3f21cb818362df2117f03"), + bloomTrieRoot: common.HexToHash("aca7d7c504d22737242effc3fdc604a762a0af9ced898036b5986c3a15220208"), + } +) + +// trustedCheckpoints associates each known checkpoint with the genesis hash of the chain it belongs to +var trustedCheckpoints = map[common.Hash]trustedCheckpoint{ + params.MainnetGenesisHash: mainnetCheckpoint, + params.TestnetGenesisHash: ropstenCheckpoint, +} + +var ( + ErrNoTrustedCht = errors.New("No trusted canonical hash trie") + ErrNoTrustedBloomTrie = errors.New("No trusted bloom trie") + ErrNoHeader = errors.New("Header not found") + chtPrefix = []byte("chtRoot-") // chtPrefix + chtNum (uint64 big endian) -> trie root hash + ChtTablePrefix = "cht-" +) + +// ChtNode structures are stored in the Canonical Hash Trie in an RLP encoded format +type ChtNode struct { + Hash common.Hash + Td *big.Int +} + +// GetChtRoot reads the CHT root assoctiated to the given section from the database +// Note that sectionIdx is specified according to LES/1 CHT section size +func GetChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead common.Hash) common.Hash { + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], sectionIdx) + data, _ := db.Get(append(append(chtPrefix, encNumber[:]...), sectionHead.Bytes()...)) + return common.BytesToHash(data) +} + +// GetChtV2Root reads the CHT root assoctiated to the given section from the database +// Note that sectionIdx is specified according to LES/2 CHT section size +func GetChtV2Root(db ethdb.Database, sectionIdx uint64, sectionHead common.Hash) common.Hash { + return GetChtRoot(db, (sectionIdx+1)*(ChtFrequency/ChtV1Frequency)-1, sectionHead) +} + +// StoreChtRoot writes the CHT root assoctiated to the given section into the database +// Note that sectionIdx is specified according to LES/1 CHT section size +func StoreChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead, root common.Hash) { + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], sectionIdx) + db.Put(append(append(chtPrefix, encNumber[:]...), sectionHead.Bytes()...), root.Bytes()) +} + +// ChtIndexerBackend implements core.ChainIndexerBackend +type ChtIndexerBackend struct { + db, cdb ethdb.Database + section, sectionSize uint64 + lastHash common.Hash + trie *trie.Trie +} + +// NewBloomTrieIndexer creates a BloomTrie chain indexer +func NewChtIndexer(db ethdb.Database, clientMode bool) *core.ChainIndexer { + cdb := ethdb.NewTable(db, ChtTablePrefix) + idb := ethdb.NewTable(db, "chtIndex-") + var sectionSize, confirmReq uint64 + if clientMode { + sectionSize = ChtFrequency + confirmReq = HelperTrieConfirmations + } else { + sectionSize = ChtV1Frequency + confirmReq = HelperTrieProcessConfirmations + } + return core.NewChainIndexer(db, idb, &ChtIndexerBackend{db: db, cdb: cdb, sectionSize: sectionSize}, sectionSize, confirmReq, time.Millisecond*100, "cht") +} + +// Reset implements core.ChainIndexerBackend +func (c *ChtIndexerBackend) Reset(section uint64, lastSectionHead common.Hash) error { + var root common.Hash + if section > 0 { + root = GetChtRoot(c.db, section-1, lastSectionHead) + } + var err error + c.trie, err = trie.New(root, c.cdb) + c.section = section + return err +} + +// Process implements core.ChainIndexerBackend +func (c *ChtIndexerBackend) Process(header *types.Header) { + hash, num := header.Hash(), header.Number.Uint64() + c.lastHash = hash + + td := core.GetTd(c.db, hash, num) + if td == nil { + panic(nil) + } + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], num) + data, _ := rlp.EncodeToBytes(ChtNode{hash, td}) + c.trie.Update(encNumber[:], data) +} + +// Commit implements core.ChainIndexerBackend +func (c *ChtIndexerBackend) Commit() error { + batch := c.cdb.NewBatch() + root, err := c.trie.CommitTo(batch) + if err != nil { + return err + } else { + batch.Write() + if ((c.section+1)*c.sectionSize)%ChtFrequency == 0 { + log.Info("Storing CHT", "idx", c.section*c.sectionSize/ChtFrequency, "sectionHead", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root)) + } + StoreChtRoot(c.db, c.section, c.lastHash, root) + } + return nil +} + +const ( + BloomTrieFrequency = 32768 + ethBloomBitsSection = 4096 + ethBloomBitsConfirmations = 256 +) + +var ( + bloomTriePrefix = []byte("bltRoot-") // bloomTriePrefix + bloomTrieNum (uint64 big endian) -> trie root hash + BloomTrieTablePrefix = "blt-" +) + +// GetBloomTrieRoot reads the BloomTrie root assoctiated to the given section from the database +func GetBloomTrieRoot(db ethdb.Database, sectionIdx uint64, sectionHead common.Hash) common.Hash { + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], sectionIdx) + data, _ := db.Get(append(append(bloomTriePrefix, encNumber[:]...), sectionHead.Bytes()...)) + return common.BytesToHash(data) +} + +// StoreBloomTrieRoot writes the BloomTrie root assoctiated to the given section into the database +func StoreBloomTrieRoot(db ethdb.Database, sectionIdx uint64, sectionHead, root common.Hash) { + var encNumber [8]byte + binary.BigEndian.PutUint64(encNumber[:], sectionIdx) + db.Put(append(append(bloomTriePrefix, encNumber[:]...), sectionHead.Bytes()...), root.Bytes()) +} + +// BloomTrieIndexerBackend implements core.ChainIndexerBackend +type BloomTrieIndexerBackend struct { + db, cdb ethdb.Database + section, parentSectionSize, bloomTrieRatio uint64 + trie *trie.Trie + sectionHeads []common.Hash +} + +// NewBloomTrieIndexer creates a BloomTrie chain indexer +func NewBloomTrieIndexer(db ethdb.Database, clientMode bool) *core.ChainIndexer { + cdb := ethdb.NewTable(db, BloomTrieTablePrefix) + idb := ethdb.NewTable(db, "bltIndex-") + backend := &BloomTrieIndexerBackend{db: db, cdb: cdb} + var confirmReq uint64 + if clientMode { + backend.parentSectionSize = BloomTrieFrequency + confirmReq = HelperTrieConfirmations + } else { + backend.parentSectionSize = ethBloomBitsSection + confirmReq = HelperTrieProcessConfirmations + } + backend.bloomTrieRatio = BloomTrieFrequency / backend.parentSectionSize + backend.sectionHeads = make([]common.Hash, backend.bloomTrieRatio) + return core.NewChainIndexer(db, idb, backend, BloomTrieFrequency, confirmReq-ethBloomBitsConfirmations, time.Millisecond*100, "bloomtrie") +} + +// Reset implements core.ChainIndexerBackend +func (b *BloomTrieIndexerBackend) Reset(section uint64, lastSectionHead common.Hash) error { + var root common.Hash + if section > 0 { + root = GetBloomTrieRoot(b.db, section-1, lastSectionHead) + } + var err error + b.trie, err = trie.New(root, b.cdb) + b.section = section + return err +} + +// Process implements core.ChainIndexerBackend +func (b *BloomTrieIndexerBackend) Process(header *types.Header) { + num := header.Number.Uint64() - b.section*BloomTrieFrequency + if (num+1)%b.parentSectionSize == 0 { + b.sectionHeads[num/b.parentSectionSize] = header.Hash() + } +} + +// Commit implements core.ChainIndexerBackend +func (b *BloomTrieIndexerBackend) Commit() error { + var compSize, decompSize uint64 + + for i := uint(0); i < types.BloomBitLength; i++ { + var encKey [10]byte + binary.BigEndian.PutUint16(encKey[0:2], uint16(i)) + binary.BigEndian.PutUint64(encKey[2:10], b.section) + var decomp []byte + for j := uint64(0); j < b.bloomTrieRatio; j++ { + data, err := core.GetBloomBits(b.db, i, b.section*b.bloomTrieRatio+j, b.sectionHeads[j]) + if err != nil { + return err + } + decompData, err2 := bitutil.DecompressBytes(data, int(b.parentSectionSize/8)) + if err2 != nil { + return err2 + } + decomp = append(decomp, decompData...) + } + comp := bitutil.CompressBytes(decomp) + + decompSize += uint64(len(decomp)) + compSize += uint64(len(comp)) + if len(comp) > 0 { + b.trie.Update(encKey[:], comp) + } else { + b.trie.Delete(encKey[:]) + } + } + + batch := b.cdb.NewBatch() + root, err := b.trie.CommitTo(batch) + if err != nil { + return err + } else { + batch.Write() + sectionHead := b.sectionHeads[b.bloomTrieRatio-1] + log.Info("Storing BloomTrie", "section", b.section, "sectionHead", fmt.Sprintf("%064x", sectionHead), "root", fmt.Sprintf("%064x", root), "compression ratio", float64(compSize)/float64(decompSize)) + StoreBloomTrieRoot(b.db, b.section, sectionHead, root) + } + + return nil +} diff --git a/trie/proof.go b/trie/proof.go index 298f648c4b..5e886a2598 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -18,11 +18,10 @@ package trie import ( "bytes" - "errors" "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" ) @@ -36,7 +35,7 @@ import ( // contains all nodes of the longest existing prefix of the key // (at least the root node), ending with the node that proves the // absence of the key. -func (t *Trie) Prove(key []byte) []rlp.RawValue { +func (t *Trie) Prove(key []byte, fromLevel uint, proofDb DatabaseWriter) error { // Collect all nodes on the path to key. key = keybytesToHex(key) nodes := []node{} @@ -61,67 +60,63 @@ func (t *Trie) Prove(key []byte) []rlp.RawValue { tn, err = t.resolveHash(n, nil) if err != nil { log.Error(fmt.Sprintf("Unhandled trie error: %v", err)) - return nil + return err } default: panic(fmt.Sprintf("%T: invalid node: %v", tn, tn)) } } hasher := newHasher(0, 0) - proof := make([]rlp.RawValue, 0, len(nodes)) for i, n := range nodes { // Don't bother checking for errors here since hasher panics // if encoding doesn't work and we're not writing to any database. n, _, _ = hasher.hashChildren(n, nil) hn, _ := hasher.store(n, nil, false) - if _, ok := hn.(hashNode); ok || i == 0 { + if hash, ok := hn.(hashNode); ok || i == 0 { // If the node's database encoding is a hash (or is the // root node), it becomes a proof element. - enc, _ := rlp.EncodeToBytes(n) - proof = append(proof, enc) + if fromLevel > 0 { + fromLevel-- + } else { + enc, _ := rlp.EncodeToBytes(n) + if !ok { + hash = crypto.Keccak256(enc) + } + proofDb.Put(hash, enc) + } } } - return proof + return nil } // VerifyProof checks merkle proofs. The given proof must contain the // value for key in a trie with the given root hash. VerifyProof // returns an error if the proof contains invalid trie nodes or the // wrong value. -func VerifyProof(rootHash common.Hash, key []byte, proof []rlp.RawValue) (value []byte, err error) { +func VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (value []byte, err error, nodes int) { key = keybytesToHex(key) - sha := sha3.NewKeccak256() - wantHash := rootHash.Bytes() - for i, buf := range proof { - sha.Reset() - sha.Write(buf) - if !bytes.Equal(sha.Sum(nil), wantHash) { - return nil, fmt.Errorf("bad proof node %d: hash mismatch", i) + wantHash := rootHash[:] + for i := 0; ; i++ { + buf, _ := proofDb.Get(wantHash) + if buf == nil { + return nil, fmt.Errorf("proof node %d (hash %064x) missing", i, wantHash[:]), i } n, err := decodeNode(wantHash, buf, 0) if err != nil { - return nil, fmt.Errorf("bad proof node %d: %v", i, err) + return nil, fmt.Errorf("bad proof node %d: %v", i, err), i } keyrest, cld := get(n, key) switch cld := cld.(type) { case nil: - if i != len(proof)-1 { - return nil, fmt.Errorf("key mismatch at proof node %d", i) - } else { - // The trie doesn't contain the key. - return nil, nil - } + // The trie doesn't contain the key. + return nil, nil, i case hashNode: key = keyrest wantHash = cld case valueNode: - if i != len(proof)-1 { - return nil, errors.New("additional nodes at end of proof") - } - return cld, nil + return cld, nil, i + 1 } } - return nil, errors.New("unexpected end of proof") } func get(tn node, key []byte) ([]byte, node) { diff --git a/trie/proof_test.go b/trie/proof_test.go index 91ebcd4a57..fff313d7fd 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -24,7 +24,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" ) func init() { @@ -35,13 +36,13 @@ func TestProof(t *testing.T) { trie, vals := randomTrie(500) root := trie.Hash() for _, kv := range vals { - proof := trie.Prove(kv.k) - if proof == nil { + proofs, _ := ethdb.NewMemDatabase() + if trie.Prove(kv.k, 0, proofs) != nil { t.Fatalf("missing key %x while constructing proof", kv.k) } - val, err := VerifyProof(root, kv.k, proof) + val, err, _ := VerifyProof(root, kv.k, proofs) if err != nil { - t.Fatalf("VerifyProof error for key %x: %v\nraw proof: %x", kv.k, err, proof) + t.Fatalf("VerifyProof error for key %x: %v\nraw proof: %v", kv.k, err, proofs) } if !bytes.Equal(val, kv.v) { t.Fatalf("VerifyProof returned wrong value for key %x: got %x, want %x", kv.k, val, kv.v) @@ -52,16 +53,14 @@ func TestProof(t *testing.T) { func TestOneElementProof(t *testing.T) { trie := new(Trie) updateString(trie, "k", "v") - proof := trie.Prove([]byte("k")) - if proof == nil { - t.Fatal("nil proof") - } - if len(proof) != 1 { + proofs, _ := ethdb.NewMemDatabase() + trie.Prove([]byte("k"), 0, proofs) + if len(proofs.Keys()) != 1 { t.Error("proof should have one element") } - val, err := VerifyProof(trie.Hash(), []byte("k"), proof) + val, err, _ := VerifyProof(trie.Hash(), []byte("k"), proofs) if err != nil { - t.Fatalf("VerifyProof error: %v\nraw proof: %x", err, proof) + t.Fatalf("VerifyProof error: %v\nproof hashes: %v", err, proofs.Keys()) } if !bytes.Equal(val, []byte("v")) { t.Fatalf("VerifyProof returned wrong value: got %x, want 'k'", val) @@ -72,12 +71,18 @@ func TestVerifyBadProof(t *testing.T) { trie, vals := randomTrie(800) root := trie.Hash() for _, kv := range vals { - proof := trie.Prove(kv.k) - if proof == nil { - t.Fatal("nil proof") + proofs, _ := ethdb.NewMemDatabase() + trie.Prove(kv.k, 0, proofs) + if len(proofs.Keys()) == 0 { + t.Fatal("zero length proof") } - mutateByte(proof[mrand.Intn(len(proof))]) - if _, err := VerifyProof(root, kv.k, proof); err == nil { + keys := proofs.Keys() + key := keys[mrand.Intn(len(keys))] + node, _ := proofs.Get(key) + proofs.Delete(key) + mutateByte(node) + proofs.Put(crypto.Keccak256(node), node) + if _, err, _ := VerifyProof(root, kv.k, proofs); err == nil { t.Fatalf("expected proof to fail for key %x", kv.k) } } @@ -104,8 +109,9 @@ func BenchmarkProve(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { kv := vals[keys[i%len(keys)]] - if trie.Prove(kv.k) == nil { - b.Fatalf("nil proof for %x", kv.k) + proofs, _ := ethdb.NewMemDatabase() + if trie.Prove(kv.k, 0, proofs); len(proofs.Keys()) == 0 { + b.Fatalf("zero length proof for %x", kv.k) } } } @@ -114,16 +120,18 @@ func BenchmarkVerifyProof(b *testing.B) { trie, vals := randomTrie(100) root := trie.Hash() var keys []string - var proofs [][]rlp.RawValue + var proofs []*ethdb.MemDatabase for k := range vals { keys = append(keys, k) - proofs = append(proofs, trie.Prove([]byte(k))) + proof, _ := ethdb.NewMemDatabase() + trie.Prove([]byte(k), 0, proof) + proofs = append(proofs, proof) } b.ResetTimer() for i := 0; i < b.N; i++ { im := i % len(keys) - if _, err := VerifyProof(root, []byte(keys[im]), proofs[im]); err != nil { + if _, err, _ := VerifyProof(root, []byte(keys[im]), proofs[im]); err != nil { b.Fatalf("key %x: %v", keys[im], err) } } From 0095531a58772b1f5bd1547169790dbde84ec78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 25 Oct 2017 12:18:44 +0300 Subject: [PATCH 229/272] core, eth, les: fix messy code (#15367) * core, eth, les: fix messy code * les: fixed tx status test and rlp encoding * core: add a workaround for light sync --- core/bloombits/matcher.go | 67 ++++++++------------- core/chain_indexer.go | 49 +++++++-------- core/chain_indexer_test.go | 2 +- core/tx_list.go | 10 ++-- core/tx_pool.go | 119 ++++++++++++++----------------------- eth/helper_test.go | 5 +- eth/protocol.go | 2 +- les/handler.go | 65 ++++++++++---------- les/handler_test.go | 47 +++++++++------ les/peer.go | 5 +- les/protocol.go | 7 +++ 11 files changed, 175 insertions(+), 203 deletions(-) diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index 32a660337f..a75f8c0859 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -57,12 +57,16 @@ type partialMatches struct { // Retrieval represents a request for retrieval task assignments for a given // bit with the given number of fetch elements, or a response for such a request. // It can also have the actual results set to be used as a delivery data struct. +// +// The contest and error fields are used by the light client to terminate matching +// early if an error is enountered on some path of the pipeline. type Retrieval struct { Bit uint Sections []uint64 Bitsets [][]byte - Error error - Context context.Context + + Context context.Context + Error error } // Matcher is a pipelined system of schedulers and logic matchers which perform @@ -506,54 +510,31 @@ func (m *Matcher) distributor(dist chan *request, session *MatcherSession) { type MatcherSession struct { matcher *Matcher - quit chan struct{} // Quit channel to request pipeline termination - kill chan struct{} // Term channel to signal non-graceful forced shutdown - ctx context.Context - err error - stopping bool - lock sync.Mutex - pend sync.WaitGroup + closer sync.Once // Sync object to ensure we only ever close once + quit chan struct{} // Quit channel to request pipeline termination + kill chan struct{} // Term channel to signal non-graceful forced shutdown + + ctx context.Context // Context used by the light client to abort filtering + err atomic.Value // Global error to track retrieval failures deep in the chain + + pend sync.WaitGroup } // Close stops the matching process and waits for all subprocesses to terminate // before returning. The timeout may be used for graceful shutdown, allowing the // currently running retrievals to complete before this time. func (s *MatcherSession) Close() { - s.lock.Lock() - stopping := s.stopping - s.stopping = true - s.lock.Unlock() - // ensure that we only close the session once - if stopping { - return - } - - // Bail out if the matcher is not running - select { - case <-s.quit: - return - default: - } - // Signal termination and wait for all goroutines to tear down - close(s.quit) - time.AfterFunc(time.Second, func() { close(s.kill) }) - s.pend.Wait() + s.closer.Do(func() { + // Signal termination and wait for all goroutines to tear down + close(s.quit) + time.AfterFunc(time.Second, func() { close(s.kill) }) + s.pend.Wait() + }) } -// setError sets an error and stops the session -func (s *MatcherSession) setError(err error) { - s.lock.Lock() - s.err = err - s.lock.Unlock() - s.Close() -} - -// Error returns an error if one has happened during the session +// Error returns any failure encountered during the matching session. func (s *MatcherSession) Error() error { - s.lock.Lock() - defer s.lock.Unlock() - - return s.err + return s.err.Load().(error) } // AllocateRetrieval assigns a bloom bit index to a client process that can either @@ -655,9 +636,9 @@ func (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan result := <-request if result.Error != nil { - s.setError(result.Error) + s.err.Store(result.Error) + s.Close() } - s.DeliverSections(result.Bit, result.Sections, result.Bitsets) } } diff --git a/core/chain_indexer.go b/core/chain_indexer.go index 837c908abc..7e7500dc85 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -36,17 +36,25 @@ import ( type ChainIndexerBackend interface { // Reset initiates the processing of a new chain segment, potentially terminating // any partially completed operations (in case of a reorg). - Reset(section uint64, lastSectionHead common.Hash) error + Reset(section uint64, prevHead common.Hash) error // Process crunches through the next header in the chain segment. The caller // will ensure a sequential order of headers. Process(header *types.Header) - // Commit finalizes the section metadata and stores it into the database. This - // interface will usually be a batch writer. + // Commit finalizes the section metadata and stores it into the database. Commit() error } +// ChainIndexerChain interface is used for connecting the indexer to a blockchain +type ChainIndexerChain interface { + // CurrentHeader retrieves the latest locally known header. + CurrentHeader() *types.Header + + // SubscribeChainEvent subscribes to new head header notifications. + SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription +} + // ChainIndexer does a post-processing job for equally sized sections of the // canonical chain (like BlooomBits and CHT structures). A ChainIndexer is // connected to the blockchain through the event system by starting a @@ -114,21 +122,14 @@ func (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash) { c.setValidSections(section + 1) } -// IndexerChain interface is used for connecting the indexer to a blockchain -type IndexerChain interface { - CurrentHeader() *types.Header - SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription -} - // Start creates a goroutine to feed chain head events into the indexer for // cascading background processing. Children do not need to be started, they // are notified about new events by their parents. -func (c *ChainIndexer) Start(chain IndexerChain) { - ch := make(chan ChainEvent, 10) - sub := chain.SubscribeChainEvent(ch) - currentHeader := chain.CurrentHeader() +func (c *ChainIndexer) Start(chain ChainIndexerChain) { + events := make(chan ChainEvent, 10) + sub := chain.SubscribeChainEvent(events) - go c.eventLoop(currentHeader, ch, sub) + go c.eventLoop(chain.CurrentHeader(), events, sub) } // Close tears down all goroutines belonging to the indexer and returns any error @@ -149,14 +150,12 @@ func (c *ChainIndexer) Close() error { errs = append(errs, err) } } - // Close all children for _, child := range c.children { if err := child.Close(); err != nil { errs = append(errs, err) } } - // Return any failures switch { case len(errs) == 0: @@ -173,7 +172,7 @@ func (c *ChainIndexer) Close() error { // eventLoop is a secondary - optional - event loop of the indexer which is only // started for the outermost indexer to push chain head events into a processing // queue. -func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent, sub event.Subscription) { +func (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainEvent, sub event.Subscription) { // Mark the chain indexer as active, requiring an additional teardown atomic.StoreUint32(&c.active, 1) @@ -193,7 +192,7 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent errc <- nil return - case ev, ok := <-ch: + case ev, ok := <-events: // Received a new event, ensure it's not nil (closing) and update if !ok { errc := <-c.quit @@ -202,6 +201,8 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, ch chan ChainEvent } header := ev.Block.Header() if header.ParentHash != prevHash { + // Reorg to the common ancestor (might not exist in light sync mode, skip reorg then) + // TODO(karalabe, zsfelfoldi): This seems a bit brittle, can we detect this case explicitly? if h := FindCommonAncestor(c.chainDb, prevHeader, header); h != nil { c.newHead(h.Number.Uint64(), true) } @@ -259,8 +260,8 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // down into the processing backend. func (c *ChainIndexer) updateLoop() { var ( - updated time.Time - updateMsg bool + updating bool + updated time.Time ) for { @@ -277,7 +278,7 @@ func (c *ChainIndexer) updateLoop() { // Periodically print an upgrade log message to the user if time.Since(updated) > 8*time.Second { if c.knownSections > c.storedSections+1 { - updateMsg = true + updating = true c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) } updated = time.Now() @@ -300,8 +301,8 @@ func (c *ChainIndexer) updateLoop() { if err == nil && oldHead == c.SectionHead(section-1) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) - if c.storedSections == c.knownSections && updateMsg { - updateMsg = false + if c.storedSections == c.knownSections && updating { + updating = false c.log.Info("Finished upgrading chain index") } @@ -412,7 +413,7 @@ func (c *ChainIndexer) setValidSections(sections uint64) { c.storedSections = sections // needed if new > old } -// sectionHead retrieves the last block hash of a processed section from the +// SectionHead retrieves the last block hash of a processed section from the // index database. func (c *ChainIndexer) SectionHead(section uint64) common.Hash { var data [8]byte diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index d685d3f8da..9fc09eda51 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -209,7 +209,7 @@ func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { return b.stored * b.indexer.sectionSize } -func (b *testChainIndexBackend) Reset(section uint64, lastSectionHead common.Hash) error { +func (b *testChainIndexBackend) Reset(section uint64, prevHead common.Hash) error { b.section = section b.headerCnt = 0 return nil diff --git a/core/tx_list.go b/core/tx_list.go index 94721aa5f3..2935929d72 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -384,13 +384,13 @@ func (h *priceHeap) Pop() interface{} { // txPricedList is a price-sorted heap to allow operating on transactions pool // contents in a price-incrementing way. type txPricedList struct { - all *map[common.Hash]txLookupRec // Pointer to the map of all transactions - items *priceHeap // Heap of prices of all the stored transactions - stales int // Number of stale price points to (re-heap trigger) + all *map[common.Hash]*types.Transaction // Pointer to the map of all transactions + items *priceHeap // Heap of prices of all the stored transactions + stales int // Number of stale price points to (re-heap trigger) } // newTxPricedList creates a new price-sorted transaction heap. -func newTxPricedList(all *map[common.Hash]txLookupRec) *txPricedList { +func newTxPricedList(all *map[common.Hash]*types.Transaction) *txPricedList { return &txPricedList{ all: all, items: new(priceHeap), @@ -416,7 +416,7 @@ func (l *txPricedList) Removed() { l.stales, l.items = 0, &reheap for _, tx := range *l.all { - *l.items = append(*l.items, tx.tx) + *l.items = append(*l.items, tx) } heap.Init(l.items) } diff --git a/core/tx_pool.go b/core/tx_pool.go index 5fdc91e65e..0f008ddc0d 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -103,6 +103,16 @@ var ( underpricedTxCounter = metrics.NewCounter("txpool/underpriced") ) +// TxStatus is the current status of a transaction as seen py the pool. +type TxStatus uint + +const ( + TxStatusUnknown TxStatus = iota + TxStatusQueued + TxStatusPending + TxStatusIncluded +) + // blockChain provides the state of blockchain and current gas limit to do // some pre checks in tx pool and event subscribers. type blockChain interface { @@ -192,22 +202,17 @@ type TxPool struct { locals *accountSet // Set of local transaction to exepmt from evicion rules journal *txJournal // Journal of local transaction to back up to disk - pending map[common.Address]*txList // All currently processable transactions - queue map[common.Address]*txList // Queued but non-processable transactions - beats map[common.Address]time.Time // Last heartbeat from each known account - all map[common.Hash]txLookupRec // All transactions to allow lookups - priced *txPricedList // All transactions sorted by price + pending map[common.Address]*txList // All currently processable transactions + queue map[common.Address]*txList // Queued but non-processable transactions + beats map[common.Address]time.Time // Last heartbeat from each known account + all map[common.Hash]*types.Transaction // All transactions to allow lookups + priced *txPricedList // All transactions sorted by price wg sync.WaitGroup // for shutdown sync homestead bool } -type txLookupRec struct { - tx *types.Transaction - pending bool -} - // NewTxPool creates a new transaction pool to gather, sort and filter inbound // trnsactions from the network. func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain blockChain) *TxPool { @@ -223,7 +228,7 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block pending: make(map[common.Address]*txList), queue: make(map[common.Address]*txList), beats: make(map[common.Address]time.Time), - all: make(map[common.Hash]txLookupRec), + all: make(map[common.Hash]*types.Transaction), chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), gasPrice: new(big.Int).SetUint64(config.PriceLimit), } @@ -599,7 +604,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // If the transaction is already known, discard it hash := tx.Hash() - if _, ok := pool.all[hash]; ok { + if pool.all[hash] != nil { log.Trace("Discarding already known transaction", "hash", hash) return false, fmt.Errorf("known transaction: %x", hash) } @@ -640,7 +645,7 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.priced.Removed() pendingReplaceCounter.Inc(1) } - pool.all[tx.Hash()] = txLookupRec{tx, false} + pool.all[tx.Hash()] = tx pool.priced.Put(tx) pool.journalTx(from, tx) @@ -687,7 +692,7 @@ func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, er pool.priced.Removed() queuedReplaceCounter.Inc(1) } - pool.all[hash] = txLookupRec{tx, false} + pool.all[hash] = tx pool.priced.Put(tx) return old != nil, nil } @@ -730,13 +735,10 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T pendingReplaceCounter.Inc(1) } - if pool.all[hash].tx == nil { - // Failsafe to work around direct pending inserts (tests) - pool.all[hash] = txLookupRec{tx, true} + // Failsafe to work around direct pending inserts (tests) + if pool.all[hash] == nil { + pool.all[hash] = tx pool.priced.Put(tx) - } else { - // set pending flag to true - pool.all[hash] = txLookupRec{tx, true} } // Set the potentially new pending nonce and notify any subsystems of the new tx pool.beats[addr] = time.Now() @@ -762,17 +764,15 @@ func (pool *TxPool) AddRemote(tx *types.Transaction) error { // AddLocals enqueues a batch of transactions into the pool if they are valid, // marking the senders as a local ones in the mean time, ensuring they go around // the local pricing constraints. -func (pool *TxPool) AddLocals(txs []*types.Transaction) error { - pool.addTxs(txs, !pool.config.NoLocals) - return nil +func (pool *TxPool) AddLocals(txs []*types.Transaction) []error { + return pool.addTxs(txs, !pool.config.NoLocals) } // AddRemotes enqueues a batch of transactions into the pool if they are valid. // If the senders are not among the locally tracked ones, full pricing constraints // will apply. -func (pool *TxPool) AddRemotes(txs []*types.Transaction) error { - pool.addTxs(txs, false) - return nil +func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { + return pool.addTxs(txs, false) } // addTx enqueues a single transaction into the pool if it is valid. @@ -806,10 +806,11 @@ func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) []error { func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) []error { // Add the batch of transaction, tracking the accepted ones dirty := make(map[common.Address]struct{}) - txErr := make([]error, len(txs)) + errs := make([]error, len(txs)) + for i, tx := range txs { var replace bool - if replace, txErr[i] = pool.add(tx, local); txErr[i] == nil { + if replace, errs[i] = pool.add(tx, local); errs[i] == nil { if !replace { from, _ := types.Sender(pool.signer, tx) // already validated dirty[from] = struct{}{} @@ -824,54 +825,23 @@ func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) []error { } pool.promoteExecutables(addrs) } - return txErr + return errs } -// TxStatusData is returned by AddOrGetTxStatus for each transaction -type TxStatusData struct { - Status uint - Data []byte -} +// Status returns the status (unknown/pending/queued) of a batch of transactions +// identified by their hashes. +func (pool *TxPool) Status(hashes []common.Hash) []TxStatus { + pool.mu.RLock() + defer pool.mu.RUnlock() -const ( - TxStatusUnknown = iota - TxStatusQueued - TxStatusPending - TxStatusIncluded // Data contains a TxChainPos struct - TxStatusError // Data contains the error string -) - -// AddOrGetTxStatus returns the status (unknown/pending/queued) of a batch of transactions -// identified by their hashes in txHashes. Optionally the transactions themselves can be -// passed too in txs, in which case the function will try adding the previously unknown ones -// to the pool. If a new transaction cannot be added, TxStatusError is returned. Adding already -// known transactions will return their previous status. -// If txs is specified, txHashes is still required and has to match the transactions in txs. - -// Note: TxStatusIncluded is never returned by this function since the pool does not track -// mined transactions. Included status can be checked by the caller (as it happens in the -// LES protocol manager) -func (pool *TxPool) AddOrGetTxStatus(txs []*types.Transaction, txHashes []common.Hash) []TxStatusData { - status := make([]TxStatusData, len(txHashes)) - if txs != nil { - if len(txs) != len(txHashes) { - panic(nil) - } - txErr := pool.addTxs(txs, false) - for i, err := range txErr { - if err != nil { - status[i] = TxStatusData{TxStatusError, ([]byte)(err.Error())} - } - } - } - - for i, hash := range txHashes { - r, ok := pool.all[hash] - if ok { - if r.pending { - status[i] = TxStatusData{TxStatusPending, nil} + status := make([]TxStatus, len(hashes)) + for i, hash := range hashes { + if tx := pool.all[hash]; tx != nil { + from, _ := types.Sender(pool.signer, tx) // already validated + if pool.pending[from].txs.items[tx.Nonce()] != nil { + status[i] = TxStatusPending } else { - status[i] = TxStatusData{TxStatusQueued, nil} + status[i] = TxStatusQueued } } } @@ -884,18 +854,17 @@ func (pool *TxPool) Get(hash common.Hash) *types.Transaction { pool.mu.RLock() defer pool.mu.RUnlock() - return pool.all[hash].tx + return pool.all[hash] } // removeTx removes a single transaction from the queue, moving all subsequent // transactions back to the future queue. func (pool *TxPool) removeTx(hash common.Hash) { // Fetch the transaction we wish to delete - txl, ok := pool.all[hash] + tx, ok := pool.all[hash] if !ok { return } - tx := txl.tx addr, _ := types.Sender(pool.signer, tx) // already validated during insertion // Remove it from the list of known transactions diff --git a/eth/helper_test.go b/eth/helper_test.go index b665531352..f02242b152 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -97,7 +97,7 @@ type testTxPool struct { // AddRemotes appends a batch of transactions to the pool, and notifies any // listeners if the addition channel is non nil -func (p *testTxPool) AddRemotes(txs []*types.Transaction) error { +func (p *testTxPool) AddRemotes(txs []*types.Transaction) []error { p.lock.Lock() defer p.lock.Unlock() @@ -105,8 +105,7 @@ func (p *testTxPool) AddRemotes(txs []*types.Transaction) error { if p.added != nil { p.added <- txs } - - return nil + return make([]error, len(txs)) } // Pending returns all the transactions known to the pool diff --git a/eth/protocol.go b/eth/protocol.go index 2c41376fa8..cd7db57f23 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -97,7 +97,7 @@ var errorToString = map[int]string{ type txPool interface { // AddRemotes should add the given transactions to the pool. - AddRemotes([]*types.Transaction) error + AddRemotes([]*types.Transaction) []error // Pending should return pending transactions. // The slice should be modifiable by the caller. diff --git a/les/handler.go b/les/handler.go index de07b72446..613fbb79fe 100644 --- a/les/handler.go +++ b/les/handler.go @@ -89,7 +89,8 @@ type BlockChain interface { } type txPool interface { - AddOrGetTxStatus(txs []*types.Transaction, txHashes []common.Hash) []core.TxStatusData + AddRemotes(txs []*types.Transaction) []error + Status(hashes []common.Hash) []core.TxStatus } type ProtocolManager struct { @@ -983,12 +984,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if reject(uint64(reqCnt), MaxTxSend) { return errResp(ErrRequestRejected, "") } - - txHashes := make([]common.Hash, len(txs)) - for i, tx := range txs { - txHashes[i] = tx.Hash() - } - pm.addOrGetTxStatus(txs, txHashes) + pm.txpool.AddRemotes(txs) _, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) @@ -1010,16 +1006,25 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrRequestRejected, "") } - txHashes := make([]common.Hash, len(req.Txs)) + hashes := make([]common.Hash, len(req.Txs)) for i, tx := range req.Txs { - txHashes[i] = tx.Hash() + hashes[i] = tx.Hash() + } + stats := pm.txStatus(hashes) + for i, stat := range stats { + if stat.Status == core.TxStatusUnknown { + if errs := pm.txpool.AddRemotes([]*types.Transaction{req.Txs[i]}); errs[0] != nil { + stats[i].Error = errs[0] + continue + } + stats[i] = pm.txStatus([]common.Hash{hashes[i]})[0] + } } - - res := pm.addOrGetTxStatus(req.Txs, txHashes) bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendTxStatus(req.ReqID, bv, res) + + return p.SendTxStatus(req.ReqID, bv, stats) case GetTxStatusMsg: if pm.txpool == nil { @@ -1027,22 +1032,20 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } // Transactions arrived, parse all of them and deliver to the pool var req struct { - ReqID uint64 - TxHashes []common.Hash + ReqID uint64 + Hashes []common.Hash } if err := msg.Decode(&req); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - reqCnt := len(req.TxHashes) + reqCnt := len(req.Hashes) if reject(uint64(reqCnt), MaxTxStatus) { return errResp(ErrRequestRejected, "") } - - res := pm.addOrGetTxStatus(nil, req.TxHashes) - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendTxStatus(req.ReqID, bv, res) + + return p.SendTxStatus(req.ReqID, bv, pm.txStatus(req.Hashes)) case TxStatusMsg: if pm.odr == nil { @@ -1052,7 +1055,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { p.Log().Trace("Received tx status response") var resp struct { ReqID, BV uint64 - Status []core.TxStatusData + Status []core.TxStatus } if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) @@ -1103,19 +1106,21 @@ func (pm *ProtocolManager) getHelperTrieAuxData(req HelperTrieReq) []byte { return nil } -func (pm *ProtocolManager) addOrGetTxStatus(txs []*types.Transaction, txHashes []common.Hash) []core.TxStatusData { - status := pm.txpool.AddOrGetTxStatus(txs, txHashes) - for i, _ := range status { - blockHash, blockNum, txIndex := core.GetTxLookupEntry(pm.chainDb, txHashes[i]) - if blockHash != (common.Hash{}) { - enc, err := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: blockHash, BlockIndex: blockNum, Index: txIndex}) - if err != nil { - panic(err) +func (pm *ProtocolManager) txStatus(hashes []common.Hash) []txStatus { + stats := make([]txStatus, len(hashes)) + for i, stat := range pm.txpool.Status(hashes) { + // Save the status we've got from the transaction pool + stats[i].Status = stat + + // If the transaction is unknown to the pool, try looking it up locally + if stat == core.TxStatusUnknown { + if block, number, index := core.GetTxLookupEntry(pm.chainDb, hashes[i]); block != (common.Hash{}) { + stats[i].Status = core.TxStatusIncluded + stats[i].Lookup = &core.TxLookupEntry{BlockHash: block, BlockIndex: number, Index: index} } - status[i] = core.TxStatusData{Status: core.TxStatusIncluded, Data: enc} } } - return status + return stats } // NodeInfo retrieves some protocol metadata about the running host node. diff --git a/les/handler_test.go b/les/handler_test.go index a094cdc840..9e63e15a60 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -20,8 +20,8 @@ import ( "bytes" "math/big" "math/rand" - "runtime" "testing" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -423,7 +423,7 @@ func TestTransactionStatusLes2(t *testing.T) { var reqID uint64 - test := func(tx *types.Transaction, send bool, expStatus core.TxStatusData) { + test := func(tx *types.Transaction, send bool, expStatus txStatus) { reqID++ if send { cost := peer.GetRequestCost(SendTxV2Msg, 1) @@ -432,7 +432,7 @@ func TestTransactionStatusLes2(t *testing.T) { cost := peer.GetRequestCost(GetTxStatusMsg, 1) sendRequest(peer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) } - if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []core.TxStatusData{expStatus}); err != nil { + if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []txStatus{expStatus}); err != nil { t.Errorf("transaction status mismatch") } } @@ -441,20 +441,20 @@ func TestTransactionStatusLes2(t *testing.T) { // test error status by sending an underpriced transaction tx0, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey) - test(tx0, true, core.TxStatusData{Status: core.TxStatusError, Data: []byte("transaction underpriced")}) + test(tx0, true, txStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced}) tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) - test(tx1, false, core.TxStatusData{Status: core.TxStatusUnknown}) // query before sending, should be unknown - test(tx1, true, core.TxStatusData{Status: core.TxStatusPending}) // send valid processable tx, should return pending - test(tx1, true, core.TxStatusData{Status: core.TxStatusPending}) // adding it again should not return an error + test(tx1, false, txStatus{Status: core.TxStatusUnknown}) // query before sending, should be unknown + test(tx1, true, txStatus{Status: core.TxStatusPending}) // send valid processable tx, should return pending + test(tx1, true, txStatus{Status: core.TxStatusPending}) // adding it again should not return an error tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) // send transactions in the wrong order, tx3 should be queued - test(tx3, true, core.TxStatusData{Status: core.TxStatusQueued}) - test(tx2, true, core.TxStatusData{Status: core.TxStatusPending}) + test(tx3, true, txStatus{Status: core.TxStatusQueued}) + test(tx2, true, txStatus{Status: core.TxStatusPending}) // query again, now tx3 should be pending too - test(tx3, false, core.TxStatusData{Status: core.TxStatusPending}) + test(tx3, false, txStatus{Status: core.TxStatusPending}) // generate and add a block with tx1 and tx2 included gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 1, func(i int, block *core.BlockGen) { @@ -464,13 +464,21 @@ func TestTransactionStatusLes2(t *testing.T) { if _, err := chain.InsertChain(gchain); err != nil { panic(err) } + // wait until TxPool processes the inserted block + for i := 0; i < 10; i++ { + if pending, _ := txpool.Stats(); pending == 1 { + break + } + time.Sleep(100 * time.Millisecond) + } + if pending, _ := txpool.Stats(); pending != 1 { + t.Fatalf("pending count mismatch: have %d, want 1", pending) + } // check if their status is included now block1hash := core.GetCanonicalHash(db, 1) - tx1pos, _ := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}) - tx2pos, _ := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}) - test(tx1, false, core.TxStatusData{Status: core.TxStatusIncluded, Data: tx1pos}) - test(tx2, false, core.TxStatusData{Status: core.TxStatusIncluded, Data: tx2pos}) + test(tx1, false, txStatus{Status: core.TxStatusIncluded, Lookup: &core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}}) + test(tx2, false, txStatus{Status: core.TxStatusIncluded, Lookup: &core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}}) // create a reorg that rolls them back gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 2, func(i int, block *core.BlockGen) {}) @@ -478,13 +486,16 @@ func TestTransactionStatusLes2(t *testing.T) { panic(err) } // wait until TxPool processes the reorg - for { + for i := 0; i < 10; i++ { if pending, _ := txpool.Stats(); pending == 3 { break } - runtime.Gosched() + time.Sleep(100 * time.Millisecond) + } + if pending, _ := txpool.Stats(); pending != 3 { + t.Fatalf("pending count mismatch: have %d, want 3", pending) } // check if their status is pending again - test(tx1, false, core.TxStatusData{Status: core.TxStatusPending}) - test(tx2, false, core.TxStatusData{Status: core.TxStatusPending}) + test(tx1, false, txStatus{Status: core.TxStatusPending}) + test(tx2, false, txStatus{Status: core.TxStatusPending}) } diff --git a/les/peer.go b/les/peer.go index 104afb6dc9..524690e2f5 100644 --- a/les/peer.go +++ b/les/peer.go @@ -27,7 +27,6 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/les/flowcontrol" @@ -233,8 +232,8 @@ func (p *peer) SendHelperTrieProofs(reqID, bv uint64, resp HelperTrieResps) erro } // SendTxStatus sends a batch of transaction status records, corresponding to the ones requested. -func (p *peer) SendTxStatus(reqID, bv uint64, status []core.TxStatusData) error { - return sendResponse(p.rw, TxStatusMsg, reqID, bv, status) +func (p *peer) SendTxStatus(reqID, bv uint64, stats []txStatus) error { + return sendResponse(p.rw, TxStatusMsg, reqID, bv, stats) } // RequestHeadersByHash fetches a batch of blocks' headers corresponding to the diff --git a/les/protocol.go b/les/protocol.go index 146b02030e..05e6654d6e 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -27,6 +27,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/rlp" @@ -219,3 +220,9 @@ type CodeData []struct { } type proofsData [][]rlp.RawValue + +type txStatus struct { + Status core.TxStatus + Lookup *core.TxLookupEntry + Error error +} From 3e6d7c169b23b3aa95fe0e2f1cbfb3501015af57 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Fri, 27 Oct 2017 09:40:52 +0100 Subject: [PATCH 230/272] cmd/rlpdump: allow hex input to have leading '0x' --- cmd/rlpdump/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rlpdump/main.go b/cmd/rlpdump/main.go index 7d328e59b3..d0f993c5b8 100644 --- a/cmd/rlpdump/main.go +++ b/cmd/rlpdump/main.go @@ -51,7 +51,7 @@ func main() { var r io.Reader switch { case *hexMode != "": - data, err := hex.DecodeString(*hexMode) + data, err := hex.DecodeString(strings.TrimPrefix(*hexMode, "0x")) if err != nil { die(err) } From 8d434f6a6f18c5172db9a8216d61cd50b746c964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felf=C3=B6ldi=20Zsolt?= Date: Fri, 27 Oct 2017 16:18:53 +0200 Subject: [PATCH 231/272] les, core/bloombits: post-LES/2 fixes (#15391) * les: fix topic ID * core/bloombits: fix interface conversion --- core/bloombits/matcher.go | 5 ++++- les/backend.go | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index a75f8c0859..d38d4ba83e 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -534,7 +534,10 @@ func (s *MatcherSession) Close() { // Error returns any failure encountered during the matching session. func (s *MatcherSession) Error() error { - return s.err.Load().(error) + if err := s.err.Load(); err != nil { + return err.(error) + } + return nil } // AllocateRetrieval assigns a bloom bit index to a client process that can either diff --git a/les/backend.go b/les/backend.go index 3a68d13ebe..333df920e0 100644 --- a/les/backend.go +++ b/les/backend.go @@ -145,7 +145,7 @@ func lesTopic(genesisHash common.Hash, protocolVersion uint) discv5.Topic { default: panic(nil) } - return discv5.Topic(name + common.Bytes2Hex(genesisHash.Bytes()[0:8])) + return discv5.Topic(name + "@" + common.Bytes2Hex(genesisHash.Bytes()[0:8])) } type LightDummyAPI struct{} From 07e8c177e7f1cceadc70709946aa24777b4bf2af Mon Sep 17 00:00:00 2001 From: ferhat elmas Date: Mon, 30 Oct 2017 01:23:23 +0100 Subject: [PATCH 232/272] core, swarm: typo fixes --- core/tx_journal.go | 2 +- swarm/api/http/error.go | 2 +- swarm/api/http/error_test.go | 2 +- swarm/storage/pyramid.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/tx_journal.go b/core/tx_journal.go index 3fd8ece49e..e872d7b530 100644 --- a/core/tx_journal.go +++ b/core/tx_journal.go @@ -68,7 +68,7 @@ func (journal *txJournal) load(add func(*types.Transaction) error) error { } defer input.Close() - // Temporarilly discard any journal additions (don't double add on load) + // Temporarily discard any journal additions (don't double add on load) journal.writer = new(devNull) defer func() { journal.writer = nil }() diff --git a/swarm/api/http/error.go b/swarm/api/http/error.go index b4d46b3c48..dbd97182fd 100644 --- a/swarm/api/http/error.go +++ b/swarm/api/http/error.go @@ -72,7 +72,7 @@ func initErrHandling() { //ShowMultipeChoices is used when a user requests a resource in a manifest which results //in ambiguous results. It returns a HTML page with clickable links of each of the entry //in the manifest which fits the request URI ambiguity. -//For example, if the user requests bzz://read and that manifest containes entries +//For example, if the user requests bzz://read and that manifest contains entries //"readme.md" and "readinglist.txt", a HTML page is returned with this two links. //This only applies if the manifest has no default entry func ShowMultipleChoices(w http.ResponseWriter, r *http.Request, list api.ManifestList) { diff --git a/swarm/api/http/error_test.go b/swarm/api/http/error_test.go index 465fbf4cad..ed52bafbd2 100644 --- a/swarm/api/http/error_test.go +++ b/swarm/api/http/error_test.go @@ -132,7 +132,7 @@ func TestJsonResponse(t *testing.T) { } if !isJSON(string(respbody)) { - t.Fatalf("Expected repsonse to be JSON, received invalid JSON: %s", string(respbody)) + t.Fatalf("Expected response to be JSON, received invalid JSON: %s", string(respbody)) } } diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go index e3be2a987f..631ab52b86 100644 --- a/swarm/storage/pyramid.go +++ b/swarm/storage/pyramid.go @@ -27,7 +27,7 @@ import ( /* The main idea of a pyramid chunker is to process the input data without knowing the entire size apriori. For this to be achieved, the chunker tree is built from the ground up until the data is exhausted. - This opens up new aveneus such as easy append and other sort of modifications to the tree therby avoiding + This opens up new aveneus such as easy append and other sort of modifications to the tree thereby avoiding duplication of data chunks. @@ -451,7 +451,7 @@ func (self *PyramidChunker) prepareChunks(isAppend bool, chunkLevel [][]*TreeEnt } } - // Data ended in chunk boundry.. just signal to start bulding tree + // Data ended in chunk boundary.. just signal to start bulding tree if n == 0 { self.buildTree(isAppend, chunkLevel, parent, chunkWG, jobC, quitC, true, rootKey) break From 0131bd6ff9b1850fdd307715c62174af4f05d2c7 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Mon, 30 Oct 2017 11:05:00 +0000 Subject: [PATCH 233/272] core: respect price bump threshold (#15401) * core: allow price bump at threshold * core: test changes to allow price bump at threshold * core: reinstate tx replacement test underneath threshold * core: minor test failure message cleanups --- core/tx_list.go | 5 ++++- core/tx_pool_test.go | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/tx_list.go b/core/tx_list.go index 2935929d72..838433b897 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -254,7 +254,10 @@ func (l *txList) Add(tx *types.Transaction, priceBump uint64) (bool, *types.Tran old := l.txs.Get(tx.Nonce()) if old != nil { threshold := new(big.Int).Div(new(big.Int).Mul(old.GasPrice(), big.NewInt(100+int64(priceBump))), big.NewInt(100)) - if threshold.Cmp(tx.GasPrice()) >= 0 { + // Have to ensure that the new gas price is higher than the old gas + // price as well as checking the percentage threshold to ensure that + // this is accurate for low (Wei-level) gas price replacements + if old.GasPrice().Cmp(tx.GasPrice()) >= 0 || threshold.Cmp(tx.GasPrice()) > 0 { return false, nil } } diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index eec128cbaf..737ea4cd39 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -1411,10 +1411,10 @@ func TestTransactionReplacement(t *testing.T) { if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(price), key)); err != nil { t.Fatalf("failed to add original proper pending transaction: %v", err) } - if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold), key)); err != ErrReplaceUnderpriced { + if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100001), big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced { t.Fatalf("original proper pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) } - if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { + if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold), key)); err != nil { t.Fatalf("failed to replace original proper pending transaction: %v", err) } if err := validateEvents(events, 2); err != nil { @@ -1422,23 +1422,23 @@ func TestTransactionReplacement(t *testing.T) { } // Add queued transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), key)); err != nil { - t.Fatalf("failed to add original queued transaction: %v", err) + t.Fatalf("failed to add original cheap queued transaction: %v", err) } if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced { - t.Fatalf("original queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) + t.Fatalf("original cheap queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) } if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(2), key)); err != nil { - t.Fatalf("failed to replace original queued transaction: %v", err) + t.Fatalf("failed to replace original cheap queued transaction: %v", err) } if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(price), key)); err != nil { - t.Fatalf("failed to add original queued transaction: %v", err) + t.Fatalf("failed to add original proper queued transaction: %v", err) } - if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(threshold), key)); err != ErrReplaceUnderpriced { - t.Fatalf("original queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) + if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced { + t.Fatalf("original proper queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) } - if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { - t.Fatalf("failed to replace original queued transaction: %v", err) + if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(threshold), key)); err != nil { + t.Fatalf("failed to replace original proper queued transaction: %v", err) } if err := validateEvents(events, 0); err != nil { From 9f7cd7568275e2db45a3d90429f7c92bf7dfbf19 Mon Sep 17 00:00:00 2001 From: gluk256 Date: Fri, 3 Nov 2017 21:29:49 +0100 Subject: [PATCH 234/272] whisper/whisperv6: initial commit (clone of v5) (#15324) --- whisper/whisperv6/api.go | 591 ++++++++++++++++ whisper/whisperv6/benchmarks_test.go | 206 ++++++ whisper/whisperv6/config.go | 27 + whisper/whisperv6/doc.go | 87 +++ whisper/whisperv6/envelope.go | 246 +++++++ whisper/whisperv6/filter.go | 239 +++++++ whisper/whisperv6/filter_test.go | 814 +++++++++++++++++++++ whisper/whisperv6/gen_criteria_json.go | 64 ++ whisper/whisperv6/gen_message_json.go | 82 +++ whisper/whisperv6/gen_newmessage_json.go | 88 +++ whisper/whisperv6/message.go | 352 ++++++++++ whisper/whisperv6/message_test.go | 415 +++++++++++ whisper/whisperv6/peer.go | 174 +++++ whisper/whisperv6/peer_test.go | 306 ++++++++ whisper/whisperv6/topic.go | 55 ++ whisper/whisperv6/topic_test.go | 134 ++++ whisper/whisperv6/whisper.go | 858 +++++++++++++++++++++++ whisper/whisperv6/whisper_test.go | 851 ++++++++++++++++++++++ 18 files changed, 5589 insertions(+) create mode 100644 whisper/whisperv6/api.go create mode 100644 whisper/whisperv6/benchmarks_test.go create mode 100644 whisper/whisperv6/config.go create mode 100644 whisper/whisperv6/doc.go create mode 100644 whisper/whisperv6/envelope.go create mode 100644 whisper/whisperv6/filter.go create mode 100644 whisper/whisperv6/filter_test.go create mode 100644 whisper/whisperv6/gen_criteria_json.go create mode 100644 whisper/whisperv6/gen_message_json.go create mode 100644 whisper/whisperv6/gen_newmessage_json.go create mode 100644 whisper/whisperv6/message.go create mode 100644 whisper/whisperv6/message_test.go create mode 100644 whisper/whisperv6/peer.go create mode 100644 whisper/whisperv6/peer_test.go create mode 100644 whisper/whisperv6/topic.go create mode 100644 whisper/whisperv6/topic_test.go create mode 100644 whisper/whisperv6/whisper.go create mode 100644 whisper/whisperv6/whisper_test.go diff --git a/whisper/whisperv6/api.go b/whisper/whisperv6/api.go new file mode 100644 index 0000000000..3dddb69539 --- /dev/null +++ b/whisper/whisperv6/api.go @@ -0,0 +1,591 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/rpc" +) + +const ( + filterTimeout = 300 // filters are considered timeout out after filterTimeout seconds +) + +var ( + ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key") + ErrInvalidSymmetricKey = errors.New("invalid symmetric key") + ErrInvalidPublicKey = errors.New("invalid public key") + ErrInvalidSigningPubKey = errors.New("invalid signing public key") + ErrTooLowPoW = errors.New("message rejected, PoW too low") + ErrNoTopics = errors.New("missing topic(s)") +) + +// PublicWhisperAPI provides the whisper RPC service that can be +// use publicly without security implications. +type PublicWhisperAPI struct { + w *Whisper + + mu sync.Mutex + lastUsed map[string]time.Time // keeps track when a filter was polled for the last time. +} + +// NewPublicWhisperAPI create a new RPC whisper service. +func NewPublicWhisperAPI(w *Whisper) *PublicWhisperAPI { + api := &PublicWhisperAPI{ + w: w, + lastUsed: make(map[string]time.Time), + } + + go api.run() + return api +} + +// run the api event loop. +// this loop deletes filter that have not been used within filterTimeout +func (api *PublicWhisperAPI) run() { + timeout := time.NewTicker(2 * time.Minute) + for { + <-timeout.C + + api.mu.Lock() + for id, lastUsed := range api.lastUsed { + if time.Since(lastUsed).Seconds() >= filterTimeout { + delete(api.lastUsed, id) + if err := api.w.Unsubscribe(id); err != nil { + log.Error("could not unsubscribe whisper filter", "error", err) + } + log.Debug("delete whisper filter (timeout)", "id", id) + } + } + api.mu.Unlock() + } +} + +// Version returns the Whisper sub-protocol version. +func (api *PublicWhisperAPI) Version(ctx context.Context) string { + return ProtocolVersionStr +} + +// Info contains diagnostic information. +type Info struct { + Memory int `json:"memory"` // Memory size of the floating messages in bytes. + Messages int `json:"messages"` // Number of floating messages. + MinPow float64 `json:"minPow"` // Minimal accepted PoW + MaxMessageSize uint32 `json:"maxMessageSize"` // Maximum accepted message size +} + +// Info returns diagnostic information about the whisper node. +func (api *PublicWhisperAPI) Info(ctx context.Context) Info { + stats := api.w.Stats() + return Info{ + Memory: stats.memoryUsed, + Messages: len(api.w.messageQueue) + len(api.w.p2pMsgQueue), + MinPow: api.w.MinPow(), + MaxMessageSize: api.w.MaxMessageSize(), + } +} + +// SetMaxMessageSize sets the maximum message size that is accepted. +// Upper limit is defined by MaxMessageSize. +func (api *PublicWhisperAPI) SetMaxMessageSize(ctx context.Context, size uint32) (bool, error) { + return true, api.w.SetMaxMessageSize(size) +} + +// SetMinPow sets the minimum PoW for a message before it is accepted. +func (api *PublicWhisperAPI) SetMinPoW(ctx context.Context, pow float64) (bool, error) { + return true, api.w.SetMinimumPoW(pow) +} + +// MarkTrustedPeer marks a peer trusted. , which will allow it to send historic (expired) messages. +// Note: This function is not adding new nodes, the node needs to exists as a peer. +func (api *PublicWhisperAPI) MarkTrustedPeer(ctx context.Context, enode string) (bool, error) { + n, err := discover.ParseNode(enode) + if err != nil { + return false, err + } + return true, api.w.AllowP2PMessagesFromPeer(n.ID[:]) +} + +// NewKeyPair generates a new public and private key pair for message decryption and encryption. +// It returns an ID that can be used to refer to the keypair. +func (api *PublicWhisperAPI) NewKeyPair(ctx context.Context) (string, error) { + return api.w.NewKeyPair() +} + +// AddPrivateKey imports the given private key. +func (api *PublicWhisperAPI) AddPrivateKey(ctx context.Context, privateKey hexutil.Bytes) (string, error) { + key, err := crypto.ToECDSA(privateKey) + if err != nil { + return "", err + } + return api.w.AddKeyPair(key) +} + +// DeleteKeyPair removes the key with the given key if it exists. +func (api *PublicWhisperAPI) DeleteKeyPair(ctx context.Context, key string) (bool, error) { + if ok := api.w.DeleteKeyPair(key); ok { + return true, nil + } + return false, fmt.Errorf("key pair %s not found", key) +} + +// HasKeyPair returns an indication if the node has a key pair that is associated with the given id. +func (api *PublicWhisperAPI) HasKeyPair(ctx context.Context, id string) bool { + return api.w.HasKeyPair(id) +} + +// GetPublicKey returns the public key associated with the given key. The key is the hex +// encoded representation of a key in the form specified in section 4.3.6 of ANSI X9.62. +func (api *PublicWhisperAPI) GetPublicKey(ctx context.Context, id string) (hexutil.Bytes, error) { + key, err := api.w.GetPrivateKey(id) + if err != nil { + return hexutil.Bytes{}, err + } + return crypto.FromECDSAPub(&key.PublicKey), nil +} + +// GetPublicKey returns the private key associated with the given key. The key is the hex +// encoded representation of a key in the form specified in section 4.3.6 of ANSI X9.62. +func (api *PublicWhisperAPI) GetPrivateKey(ctx context.Context, id string) (hexutil.Bytes, error) { + key, err := api.w.GetPrivateKey(id) + if err != nil { + return hexutil.Bytes{}, err + } + return crypto.FromECDSA(key), nil +} + +// NewSymKey generate a random symmetric key. +// It returns an ID that can be used to refer to the key. +// Can be used encrypting and decrypting messages where the key is known to both parties. +func (api *PublicWhisperAPI) NewSymKey(ctx context.Context) (string, error) { + return api.w.GenerateSymKey() +} + +// AddSymKey import a symmetric key. +// It returns an ID that can be used to refer to the key. +// Can be used encrypting and decrypting messages where the key is known to both parties. +func (api *PublicWhisperAPI) AddSymKey(ctx context.Context, key hexutil.Bytes) (string, error) { + return api.w.AddSymKeyDirect([]byte(key)) +} + +// GenerateSymKeyFromPassword derive a key from the given password, stores it, and returns its ID. +func (api *PublicWhisperAPI) GenerateSymKeyFromPassword(ctx context.Context, passwd string) (string, error) { + return api.w.AddSymKeyFromPassword(passwd) +} + +// HasSymKey returns an indication if the node has a symmetric key associated with the given key. +func (api *PublicWhisperAPI) HasSymKey(ctx context.Context, id string) bool { + return api.w.HasSymKey(id) +} + +// GetSymKey returns the symmetric key associated with the given id. +func (api *PublicWhisperAPI) GetSymKey(ctx context.Context, id string) (hexutil.Bytes, error) { + return api.w.GetSymKey(id) +} + +// DeleteSymKey deletes the symmetric key that is associated with the given id. +func (api *PublicWhisperAPI) DeleteSymKey(ctx context.Context, id string) bool { + return api.w.DeleteSymKey(id) +} + +//go:generate gencodec -type NewMessage -field-override newMessageOverride -out gen_newmessage_json.go + +// NewMessage represents a new whisper message that is posted through the RPC. +type NewMessage struct { + SymKeyID string `json:"symKeyID"` + PublicKey []byte `json:"pubKey"` + Sig string `json:"sig"` + TTL uint32 `json:"ttl"` + Topic TopicType `json:"topic"` + Payload []byte `json:"payload"` + Padding []byte `json:"padding"` + PowTime uint32 `json:"powTime"` + PowTarget float64 `json:"powTarget"` + TargetPeer string `json:"targetPeer"` +} + +type newMessageOverride struct { + PublicKey hexutil.Bytes + Payload hexutil.Bytes + Padding hexutil.Bytes +} + +// Post a message on the Whisper network. +func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, error) { + var ( + symKeyGiven = len(req.SymKeyID) > 0 + pubKeyGiven = len(req.PublicKey) > 0 + err error + ) + + // user must specify either a symmetric or an asymmetric key + if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) { + return false, ErrSymAsym + } + + params := &MessageParams{ + TTL: req.TTL, + Payload: req.Payload, + Padding: req.Padding, + WorkTime: req.PowTime, + PoW: req.PowTarget, + Topic: req.Topic, + } + + // Set key that is used to sign the message + if len(req.Sig) > 0 { + if params.Src, err = api.w.GetPrivateKey(req.Sig); err != nil { + return false, err + } + } + + // Set symmetric key that is used to encrypt the message + if symKeyGiven { + if params.Topic == (TopicType{}) { // topics are mandatory with symmetric encryption + return false, ErrNoTopics + } + if params.KeySym, err = api.w.GetSymKey(req.SymKeyID); err != nil { + return false, err + } + if !validateSymmetricKey(params.KeySym) { + return false, ErrInvalidSymmetricKey + } + } + + // Set asymmetric key that is used to encrypt the message + if pubKeyGiven { + params.Dst = crypto.ToECDSAPub(req.PublicKey) + if !ValidatePublicKey(params.Dst) { + return false, ErrInvalidPublicKey + } + } + + // encrypt and sent message + whisperMsg, err := NewSentMessage(params) + if err != nil { + return false, err + } + + env, err := whisperMsg.Wrap(params) + if err != nil { + return false, err + } + + // send to specific node (skip PoW check) + if len(req.TargetPeer) > 0 { + n, err := discover.ParseNode(req.TargetPeer) + if err != nil { + return false, fmt.Errorf("failed to parse target peer: %s", err) + } + return true, api.w.SendP2PMessage(n.ID[:], env) + } + + // ensure that the message PoW meets the node's minimum accepted PoW + if req.PowTarget < api.w.MinPow() { + return false, ErrTooLowPoW + } + + return true, api.w.Send(env) +} + +//go:generate gencodec -type Criteria -field-override criteriaOverride -out gen_criteria_json.go + +// Criteria holds various filter options for inbound messages. +type Criteria struct { + SymKeyID string `json:"symKeyID"` + PrivateKeyID string `json:"privateKeyID"` + Sig []byte `json:"sig"` + MinPow float64 `json:"minPow"` + Topics []TopicType `json:"topics"` + AllowP2P bool `json:"allowP2P"` +} + +type criteriaOverride struct { + Sig hexutil.Bytes +} + +// Messages set up a subscription that fires events when messages arrive that match +// the given set of criteria. +func (api *PublicWhisperAPI) Messages(ctx context.Context, crit Criteria) (*rpc.Subscription, error) { + var ( + symKeyGiven = len(crit.SymKeyID) > 0 + pubKeyGiven = len(crit.PrivateKeyID) > 0 + err error + ) + + // ensure that the RPC connection supports subscriptions + notifier, supported := rpc.NotifierFromContext(ctx) + if !supported { + return nil, rpc.ErrNotificationsUnsupported + } + + // user must specify either a symmetric or an asymmetric key + if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) { + return nil, ErrSymAsym + } + + filter := Filter{ + PoW: crit.MinPow, + Messages: make(map[common.Hash]*ReceivedMessage), + AllowP2P: crit.AllowP2P, + } + + if len(crit.Sig) > 0 { + filter.Src = crypto.ToECDSAPub(crit.Sig) + if !ValidatePublicKey(filter.Src) { + return nil, ErrInvalidSigningPubKey + } + } + + for i, bt := range crit.Topics { + if len(bt) == 0 || len(bt) > 4 { + return nil, fmt.Errorf("subscribe: topic %d has wrong size: %d", i, len(bt)) + } + filter.Topics = append(filter.Topics, bt[:]) + } + + // listen for message that are encrypted with the given symmetric key + if symKeyGiven { + if len(filter.Topics) == 0 { + return nil, ErrNoTopics + } + key, err := api.w.GetSymKey(crit.SymKeyID) + if err != nil { + return nil, err + } + if !validateSymmetricKey(key) { + return nil, ErrInvalidSymmetricKey + } + filter.KeySym = key + filter.SymKeyHash = crypto.Keccak256Hash(filter.KeySym) + } + + // listen for messages that are encrypted with the given public key + if pubKeyGiven { + filter.KeyAsym, err = api.w.GetPrivateKey(crit.PrivateKeyID) + if err != nil || filter.KeyAsym == nil { + return nil, ErrInvalidPublicKey + } + } + + id, err := api.w.Subscribe(&filter) + if err != nil { + return nil, err + } + + // create subscription and start waiting for message events + rpcSub := notifier.CreateSubscription() + go func() { + // for now poll internally, refactor whisper internal for channel support + ticker := time.NewTicker(250 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + if filter := api.w.GetFilter(id); filter != nil { + for _, rpcMessage := range toMessage(filter.Retrieve()) { + if err := notifier.Notify(rpcSub.ID, rpcMessage); err != nil { + log.Error("Failed to send notification", "err", err) + } + } + } + case <-rpcSub.Err(): + api.w.Unsubscribe(id) + return + case <-notifier.Closed(): + api.w.Unsubscribe(id) + return + } + } + }() + + return rpcSub, nil +} + +//go:generate gencodec -type Message -field-override messageOverride -out gen_message_json.go + +// Message is the RPC representation of a whisper message. +type Message struct { + Sig []byte `json:"sig,omitempty"` + TTL uint32 `json:"ttl"` + Timestamp uint32 `json:"timestamp"` + Topic TopicType `json:"topic"` + Payload []byte `json:"payload"` + Padding []byte `json:"padding"` + PoW float64 `json:"pow"` + Hash []byte `json:"hash"` + Dst []byte `json:"recipientPublicKey,omitempty"` +} + +type messageOverride struct { + Sig hexutil.Bytes + Payload hexutil.Bytes + Padding hexutil.Bytes + Hash hexutil.Bytes + Dst hexutil.Bytes +} + +// ToWhisperMessage converts an internal message into an API version. +func ToWhisperMessage(message *ReceivedMessage) *Message { + msg := Message{ + Payload: message.Payload, + Padding: message.Padding, + Timestamp: message.Sent, + TTL: message.TTL, + PoW: message.PoW, + Hash: message.EnvelopeHash.Bytes(), + Topic: message.Topic, + } + + if message.Dst != nil { + b := crypto.FromECDSAPub(message.Dst) + if b != nil { + msg.Dst = b + } + } + + if isMessageSigned(message.Raw[0]) { + b := crypto.FromECDSAPub(message.SigToPubKey()) + if b != nil { + msg.Sig = b + } + } + + return &msg +} + +// toMessage converts a set of messages to its RPC representation. +func toMessage(messages []*ReceivedMessage) []*Message { + msgs := make([]*Message, len(messages)) + for i, msg := range messages { + msgs[i] = ToWhisperMessage(msg) + } + return msgs +} + +// GetFilterMessages returns the messages that match the filter criteria and +// are received between the last poll and now. +func (api *PublicWhisperAPI) GetFilterMessages(id string) ([]*Message, error) { + api.mu.Lock() + f := api.w.GetFilter(id) + if f == nil { + api.mu.Unlock() + return nil, fmt.Errorf("filter not found") + } + api.lastUsed[id] = time.Now() + api.mu.Unlock() + + receivedMessages := f.Retrieve() + messages := make([]*Message, 0, len(receivedMessages)) + for _, msg := range receivedMessages { + messages = append(messages, ToWhisperMessage(msg)) + } + + return messages, nil +} + +// DeleteMessageFilter deletes a filter. +func (api *PublicWhisperAPI) DeleteMessageFilter(id string) (bool, error) { + api.mu.Lock() + defer api.mu.Unlock() + + delete(api.lastUsed, id) + return true, api.w.Unsubscribe(id) +} + +// NewMessageFilter creates a new filter that can be used to poll for +// (new) messages that satisfy the given criteria. +func (api *PublicWhisperAPI) NewMessageFilter(req Criteria) (string, error) { + var ( + src *ecdsa.PublicKey + keySym []byte + keyAsym *ecdsa.PrivateKey + topics [][]byte + + symKeyGiven = len(req.SymKeyID) > 0 + asymKeyGiven = len(req.PrivateKeyID) > 0 + + err error + ) + + // user must specify either a symmetric or an asymmetric key + if (symKeyGiven && asymKeyGiven) || (!symKeyGiven && !asymKeyGiven) { + return "", ErrSymAsym + } + + if len(req.Sig) > 0 { + src = crypto.ToECDSAPub(req.Sig) + if !ValidatePublicKey(src) { + return "", ErrInvalidSigningPubKey + } + } + + if symKeyGiven { + if keySym, err = api.w.GetSymKey(req.SymKeyID); err != nil { + return "", err + } + if !validateSymmetricKey(keySym) { + return "", ErrInvalidSymmetricKey + } + } + + if asymKeyGiven { + if keyAsym, err = api.w.GetPrivateKey(req.PrivateKeyID); err != nil { + return "", err + } + } + + if len(req.Topics) > 0 { + topics = make([][]byte, 1) + for _, topic := range req.Topics { + topics = append(topics, topic[:]) + } + } + + f := &Filter{ + Src: src, + KeySym: keySym, + KeyAsym: keyAsym, + PoW: req.MinPow, + AllowP2P: req.AllowP2P, + Topics: topics, + Messages: make(map[common.Hash]*ReceivedMessage), + } + + id, err := api.w.Subscribe(f) + if err != nil { + return "", err + } + + api.mu.Lock() + api.lastUsed[id] = time.Now() + api.mu.Unlock() + + return id, nil +} diff --git a/whisper/whisperv6/benchmarks_test.go b/whisper/whisperv6/benchmarks_test.go new file mode 100644 index 0000000000..9f413e7b0a --- /dev/null +++ b/whisper/whisperv6/benchmarks_test.go @@ -0,0 +1,206 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "testing" + + "github.com/ethereum/go-ethereum/crypto" +) + +func BenchmarkDeriveKeyMaterial(b *testing.B) { + for i := 0; i < b.N; i++ { + deriveKeyMaterial([]byte("test"), 0) + } +} + +func BenchmarkEncryptionSym(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + for i := 0; i < b.N; i++ { + msg, _ := NewSentMessage(params) + _, err := msg.Wrap(params) + if err != nil { + b.Errorf("failed Wrap with seed %d: %s.", seed, err) + b.Errorf("i = %d, len(msg.Raw) = %d, params.Payload = %d.", i, len(msg.Raw), len(params.Payload)) + return + } + } +} + +func BenchmarkEncryptionAsym(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + key, err := crypto.GenerateKey() + if err != nil { + b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + params.KeySym = nil + params.Dst = &key.PublicKey + + for i := 0; i < b.N; i++ { + msg, _ := NewSentMessage(params) + _, err := msg.Wrap(params) + if err != nil { + b.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + } +} + +func BenchmarkDecryptionSymValid(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, _ := NewSentMessage(params) + env, err := msg.Wrap(params) + if err != nil { + b.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + f := Filter{KeySym: params.KeySym} + + for i := 0; i < b.N; i++ { + msg := env.Open(&f) + if msg == nil { + b.Fatalf("failed to open with seed %d.", seed) + } + } +} + +func BenchmarkDecryptionSymInvalid(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, _ := NewSentMessage(params) + env, err := msg.Wrap(params) + if err != nil { + b.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + f := Filter{KeySym: []byte("arbitrary stuff here")} + + for i := 0; i < b.N; i++ { + msg := env.Open(&f) + if msg != nil { + b.Fatalf("opened envelope with invalid key, seed: %d.", seed) + } + } +} + +func BenchmarkDecryptionAsymValid(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + key, err := crypto.GenerateKey() + if err != nil { + b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + f := Filter{KeyAsym: key} + params.KeySym = nil + params.Dst = &key.PublicKey + msg, _ := NewSentMessage(params) + env, err := msg.Wrap(params) + if err != nil { + b.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + for i := 0; i < b.N; i++ { + msg := env.Open(&f) + if msg == nil { + b.Fatalf("fail to open, seed: %d.", seed) + } + } +} + +func BenchmarkDecryptionAsymInvalid(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + key, err := crypto.GenerateKey() + if err != nil { + b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + params.KeySym = nil + params.Dst = &key.PublicKey + msg, _ := NewSentMessage(params) + env, err := msg.Wrap(params) + if err != nil { + b.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + key, err = crypto.GenerateKey() + if err != nil { + b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + f := Filter{KeyAsym: key} + + for i := 0; i < b.N; i++ { + msg := env.Open(&f) + if msg != nil { + b.Fatalf("opened envelope with invalid key, seed: %d.", seed) + } + } +} + +func increment(x []byte) { + for i := 0; i < len(x); i++ { + x[i]++ + if x[i] != 0 { + break + } + } +} + +func BenchmarkPoW(b *testing.B) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + params.Payload = make([]byte, 32) + params.PoW = 10.0 + params.TTL = 1 + + for i := 0; i < b.N; i++ { + increment(params.Payload) + msg, _ := NewSentMessage(params) + _, err := msg.Wrap(params) + if err != nil { + b.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + } +} diff --git a/whisper/whisperv6/config.go b/whisper/whisperv6/config.go new file mode 100644 index 0000000000..d7f817aa2d --- /dev/null +++ b/whisper/whisperv6/config.go @@ -0,0 +1,27 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +type Config struct { + MaxMessageSize uint32 `toml:",omitempty"` + MinimumAcceptedPOW float64 `toml:",omitempty"` +} + +var DefaultConfig = Config{ + MaxMessageSize: DefaultMaxMessageSize, + MinimumAcceptedPOW: DefaultMinimumPoW, +} diff --git a/whisper/whisperv6/doc.go b/whisper/whisperv6/doc.go new file mode 100644 index 0000000000..e64dd2f42d --- /dev/null +++ b/whisper/whisperv6/doc.go @@ -0,0 +1,87 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +/* +Package whisper implements the Whisper protocol (version 6). + +Whisper combines aspects of both DHTs and datagram messaging systems (e.g. UDP). +As such it may be likened and compared to both, not dissimilar to the +matter/energy duality (apologies to physicists for the blatant abuse of a +fundamental and beautiful natural principle). + +Whisper is a pure identity-based messaging system. Whisper provides a low-level +(non-application-specific) but easily-accessible API without being based upon +or prejudiced by the low-level hardware attributes and characteristics, +particularly the notion of singular endpoints. +*/ +package whisperv6 + +import ( + "fmt" + "time" +) + +const ( + EnvelopeVersion = uint64(0) + ProtocolVersion = uint64(5) + ProtocolVersionStr = "5.0" + ProtocolName = "shh" + + statusCode = 0 // used by whisper protocol + messagesCode = 1 // normal whisper message + p2pCode = 2 // peer-to-peer message (to be consumed by the peer, but not forwarded any further) + p2pRequestCode = 3 // peer-to-peer message, used by Dapp protocol + NumberOfMessageCodes = 64 + + paddingMask = byte(3) + signatureFlag = byte(4) + + TopicLength = 4 + signatureLength = 65 + aesKeyLength = 32 + AESNonceLength = 12 + keyIdSize = 32 + + MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message. + DefaultMaxMessageSize = uint32(1024 * 1024) + DefaultMinimumPoW = 0.2 + + padSizeLimit = 256 // just an arbitrary number, could be changed without breaking the protocol (must not exceed 2^24) + messageQueueLimit = 1024 + + expirationCycle = time.Second + transmissionCycle = 300 * time.Millisecond + + DefaultTTL = 50 // seconds + SynchAllowance = 10 // seconds +) + +type unknownVersionError uint64 + +func (e unknownVersionError) Error() string { + return fmt.Sprintf("invalid envelope version %d", uint64(e)) +} + +// MailServer represents a mail server, capable of +// archiving the old messages for subsequent delivery +// to the peers. Any implementation must ensure that both +// functions are thread-safe. Also, they must return ASAP. +// DeliverMail should use directMessagesCode for delivery, +// in order to bypass the expiry checks. +type MailServer interface { + Archive(env *Envelope) + DeliverMail(whisperPeer *Peer, request *Envelope) +} diff --git a/whisper/whisperv6/envelope.go b/whisper/whisperv6/envelope.go new file mode 100644 index 0000000000..a5f4770b07 --- /dev/null +++ b/whisper/whisperv6/envelope.go @@ -0,0 +1,246 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Contains the Whisper protocol Envelope element. + +package whisperv6 + +import ( + "crypto/ecdsa" + "encoding/binary" + "fmt" + gmath "math" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" + "github.com/ethereum/go-ethereum/rlp" +) + +// Envelope represents a clear-text data packet to transmit through the Whisper +// network. Its contents may or may not be encrypted and signed. +type Envelope struct { + Version []byte + Expiry uint32 + TTL uint32 + Topic TopicType + AESNonce []byte + Data []byte + EnvNonce uint64 + + pow float64 // Message-specific PoW as described in the Whisper specification. + hash common.Hash // Cached hash of the envelope to avoid rehashing every time. + // Don't access hash directly, use Hash() function instead. +} + +// size returns the size of envelope as it is sent (i.e. public fields only) +func (e *Envelope) size() int { + return 20 + len(e.Version) + len(e.AESNonce) + len(e.Data) +} + +// rlpWithoutNonce returns the RLP encoded envelope contents, except the nonce. +func (e *Envelope) rlpWithoutNonce() []byte { + res, _ := rlp.EncodeToBytes([]interface{}{e.Version, e.Expiry, e.TTL, e.Topic, e.AESNonce, e.Data}) + return res +} + +// NewEnvelope wraps a Whisper message with expiration and destination data +// included into an envelope for network forwarding. +func NewEnvelope(ttl uint32, topic TopicType, aesNonce []byte, msg *sentMessage) *Envelope { + env := Envelope{ + Version: make([]byte, 1), + Expiry: uint32(time.Now().Add(time.Second * time.Duration(ttl)).Unix()), + TTL: ttl, + Topic: topic, + AESNonce: aesNonce, + Data: msg.Raw, + EnvNonce: 0, + } + + if EnvelopeVersion < 256 { + env.Version[0] = byte(EnvelopeVersion) + } else { + panic("please increase the size of Envelope.Version before releasing this version") + } + + return &env +} + +func (e *Envelope) IsSymmetric() bool { + return len(e.AESNonce) > 0 +} + +func (e *Envelope) isAsymmetric() bool { + return !e.IsSymmetric() +} + +func (e *Envelope) Ver() uint64 { + return bytesToUintLittleEndian(e.Version) +} + +// Seal closes the envelope by spending the requested amount of time as a proof +// of work on hashing the data. +func (e *Envelope) Seal(options *MessageParams) error { + var target, bestBit int + if options.PoW == 0 { + // adjust for the duration of Seal() execution only if execution time is predefined unconditionally + e.Expiry += options.WorkTime + } else { + target = e.powToFirstBit(options.PoW) + if target < 1 { + target = 1 + } + } + + buf := make([]byte, 64) + h := crypto.Keccak256(e.rlpWithoutNonce()) + copy(buf[:32], h) + + finish := time.Now().Add(time.Duration(options.WorkTime) * time.Second).UnixNano() + for nonce := uint64(0); time.Now().UnixNano() < finish; { + for i := 0; i < 1024; i++ { + binary.BigEndian.PutUint64(buf[56:], nonce) + d := new(big.Int).SetBytes(crypto.Keccak256(buf)) + firstBit := math.FirstBitSet(d) + if firstBit > bestBit { + e.EnvNonce, bestBit = nonce, firstBit + if target > 0 && bestBit >= target { + return nil + } + } + nonce++ + } + } + + if target > 0 && bestBit < target { + return fmt.Errorf("failed to reach the PoW target, specified pow time (%d seconds) was insufficient", options.WorkTime) + } + + return nil +} + +func (e *Envelope) PoW() float64 { + if e.pow == 0 { + e.calculatePoW(0) + } + return e.pow +} + +func (e *Envelope) calculatePoW(diff uint32) { + buf := make([]byte, 64) + h := crypto.Keccak256(e.rlpWithoutNonce()) + copy(buf[:32], h) + binary.BigEndian.PutUint64(buf[56:], e.EnvNonce) + d := new(big.Int).SetBytes(crypto.Keccak256(buf)) + firstBit := math.FirstBitSet(d) + x := gmath.Pow(2, float64(firstBit)) + x /= float64(e.size()) + x /= float64(e.TTL + diff) + e.pow = x +} + +func (e *Envelope) powToFirstBit(pow float64) int { + x := pow + x *= float64(e.size()) + x *= float64(e.TTL) + bits := gmath.Log2(x) + bits = gmath.Ceil(bits) + return int(bits) +} + +// Hash returns the SHA3 hash of the envelope, calculating it if not yet done. +func (e *Envelope) Hash() common.Hash { + if (e.hash == common.Hash{}) { + encoded, _ := rlp.EncodeToBytes(e) + e.hash = crypto.Keccak256Hash(encoded) + } + return e.hash +} + +// DecodeRLP decodes an Envelope from an RLP data stream. +func (e *Envelope) DecodeRLP(s *rlp.Stream) error { + raw, err := s.Raw() + if err != nil { + return err + } + // The decoding of Envelope uses the struct fields but also needs + // to compute the hash of the whole RLP-encoded envelope. This + // type has the same structure as Envelope but is not an + // rlp.Decoder (does not implement DecodeRLP function). + // Only public members will be encoded. + type rlpenv Envelope + if err := rlp.DecodeBytes(raw, (*rlpenv)(e)); err != nil { + return err + } + e.hash = crypto.Keccak256Hash(raw) + return nil +} + +// OpenAsymmetric tries to decrypt an envelope, potentially encrypted with a particular key. +func (e *Envelope) OpenAsymmetric(key *ecdsa.PrivateKey) (*ReceivedMessage, error) { + message := &ReceivedMessage{Raw: e.Data} + err := message.decryptAsymmetric(key) + switch err { + case nil: + return message, nil + case ecies.ErrInvalidPublicKey: // addressed to somebody else + return nil, err + default: + return nil, fmt.Errorf("unable to open envelope, decrypt failed: %v", err) + } +} + +// OpenSymmetric tries to decrypt an envelope, potentially encrypted with a particular key. +func (e *Envelope) OpenSymmetric(key []byte) (msg *ReceivedMessage, err error) { + msg = &ReceivedMessage{Raw: e.Data} + err = msg.decryptSymmetric(key, e.AESNonce) + if err != nil { + msg = nil + } + return msg, err +} + +// Open tries to decrypt an envelope, and populates the message fields in case of success. +func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) { + if e.isAsymmetric() { + msg, _ = e.OpenAsymmetric(watcher.KeyAsym) + if msg != nil { + msg.Dst = &watcher.KeyAsym.PublicKey + } + } else if e.IsSymmetric() { + msg, _ = e.OpenSymmetric(watcher.KeySym) + if msg != nil { + msg.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym) + } + } + + if msg != nil { + ok := msg.Validate() + if !ok { + return nil + } + msg.Topic = e.Topic + msg.PoW = e.PoW() + msg.TTL = e.TTL + msg.Sent = e.Expiry - e.TTL + msg.EnvelopeHash = e.Hash() + msg.EnvelopeVersion = e.Ver() + } + return msg +} diff --git a/whisper/whisperv6/filter.go b/whisper/whisperv6/filter.go new file mode 100644 index 0000000000..5cb371b7d6 --- /dev/null +++ b/whisper/whisperv6/filter.go @@ -0,0 +1,239 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "crypto/ecdsa" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" +) + +type Filter struct { + Src *ecdsa.PublicKey // Sender of the message + KeyAsym *ecdsa.PrivateKey // Private Key of recipient + KeySym []byte // Key associated with the Topic + Topics [][]byte // Topics to filter messages with + PoW float64 // Proof of work as described in the Whisper spec + AllowP2P bool // Indicates whether this filter is interested in direct peer-to-peer messages + SymKeyHash common.Hash // The Keccak256Hash of the symmetric key, needed for optimization + + Messages map[common.Hash]*ReceivedMessage + mutex sync.RWMutex +} + +type Filters struct { + watchers map[string]*Filter + whisper *Whisper + mutex sync.RWMutex +} + +func NewFilters(w *Whisper) *Filters { + return &Filters{ + watchers: make(map[string]*Filter), + whisper: w, + } +} + +func (fs *Filters) Install(watcher *Filter) (string, error) { + if watcher.Messages == nil { + watcher.Messages = make(map[common.Hash]*ReceivedMessage) + } + + id, err := GenerateRandomID() + if err != nil { + return "", err + } + + fs.mutex.Lock() + defer fs.mutex.Unlock() + + if fs.watchers[id] != nil { + return "", fmt.Errorf("failed to generate unique ID") + } + + if watcher.expectsSymmetricEncryption() { + watcher.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym) + } + + fs.watchers[id] = watcher + return id, err +} + +func (fs *Filters) Uninstall(id string) bool { + fs.mutex.Lock() + defer fs.mutex.Unlock() + if fs.watchers[id] != nil { + delete(fs.watchers, id) + return true + } + return false +} + +func (fs *Filters) Get(id string) *Filter { + fs.mutex.RLock() + defer fs.mutex.RUnlock() + return fs.watchers[id] +} + +func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) { + var msg *ReceivedMessage + + fs.mutex.RLock() + defer fs.mutex.RUnlock() + + i := -1 // only used for logging info + for _, watcher := range fs.watchers { + i++ + if p2pMessage && !watcher.AllowP2P { + log.Trace(fmt.Sprintf("msg [%x], filter [%d]: p2p messages are not allowed", env.Hash(), i)) + continue + } + + var match bool + if msg != nil { + match = watcher.MatchMessage(msg) + } else { + match = watcher.MatchEnvelope(env) + if match { + msg = env.Open(watcher) + if msg == nil { + log.Trace("processing message: failed to open", "message", env.Hash().Hex(), "filter", i) + } + } else { + log.Trace("processing message: does not match", "message", env.Hash().Hex(), "filter", i) + } + } + + if match && msg != nil { + log.Trace("processing message: decrypted", "hash", env.Hash().Hex()) + if watcher.Src == nil || IsPubKeyEqual(msg.Src, watcher.Src) { + watcher.Trigger(msg) + } + } + } +} + +func (f *Filter) processEnvelope(env *Envelope) *ReceivedMessage { + if f.MatchEnvelope(env) { + msg := env.Open(f) + if msg != nil { + return msg + } else { + log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex()) + } + } else { + log.Trace("processing envelope: does not match", "hash", env.Hash().Hex()) + } + return nil +} + +func (f *Filter) expectsAsymmetricEncryption() bool { + return f.KeyAsym != nil +} + +func (f *Filter) expectsSymmetricEncryption() bool { + return f.KeySym != nil +} + +func (f *Filter) Trigger(msg *ReceivedMessage) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if _, exist := f.Messages[msg.EnvelopeHash]; !exist { + f.Messages[msg.EnvelopeHash] = msg + } +} + +func (f *Filter) Retrieve() (all []*ReceivedMessage) { + f.mutex.Lock() + defer f.mutex.Unlock() + + all = make([]*ReceivedMessage, 0, len(f.Messages)) + for _, msg := range f.Messages { + all = append(all, msg) + } + + f.Messages = make(map[common.Hash]*ReceivedMessage) // delete old messages + return all +} + +func (f *Filter) MatchMessage(msg *ReceivedMessage) bool { + if f.PoW > 0 && msg.PoW < f.PoW { + return false + } + + if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() { + return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic) + } else if f.expectsSymmetricEncryption() && msg.isSymmetricEncryption() { + return f.SymKeyHash == msg.SymKeyHash && f.MatchTopic(msg.Topic) + } + return false +} + +func (f *Filter) MatchEnvelope(envelope *Envelope) bool { + if f.PoW > 0 && envelope.pow < f.PoW { + return false + } + + if f.expectsAsymmetricEncryption() && envelope.isAsymmetric() { + return f.MatchTopic(envelope.Topic) + } else if f.expectsSymmetricEncryption() && envelope.IsSymmetric() { + return f.MatchTopic(envelope.Topic) + } + return false +} + +func (f *Filter) MatchTopic(topic TopicType) bool { + if len(f.Topics) == 0 { + // any topic matches + return true + } + + for _, bt := range f.Topics { + if matchSingleTopic(topic, bt) { + return true + } + } + return false +} + +func matchSingleTopic(topic TopicType, bt []byte) bool { + if len(bt) > 4 { + bt = bt[:4] + } + + for j, b := range bt { + if topic[j] != b { + return false + } + } + return true +} + +func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool { + if !ValidatePublicKey(a) { + return false + } else if !ValidatePublicKey(b) { + return false + } + // the curve is always the same, just compare the points + return a.X.Cmp(b.X) == 0 && a.Y.Cmp(b.Y) == 0 +} diff --git a/whisper/whisperv6/filter_test.go b/whisper/whisperv6/filter_test.go new file mode 100644 index 0000000000..58d90d60c2 --- /dev/null +++ b/whisper/whisperv6/filter_test.go @@ -0,0 +1,814 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "math/big" + mrand "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +var seed int64 + +// InitSingleTest should be called in the beginning of every +// test, which uses RNG, in order to make the tests +// reproduciblity independent of their sequence. +func InitSingleTest() { + seed = time.Now().Unix() + mrand.Seed(seed) +} + +func InitDebugTest(i int64) { + seed = i + mrand.Seed(seed) +} + +type FilterTestCase struct { + f *Filter + id string + alive bool + msgCnt int +} + +func generateFilter(t *testing.T, symmetric bool) (*Filter, error) { + var f Filter + f.Messages = make(map[common.Hash]*ReceivedMessage) + + const topicNum = 8 + f.Topics = make([][]byte, topicNum) + for i := 0; i < topicNum; i++ { + f.Topics[i] = make([]byte, 4) + mrand.Read(f.Topics[i][:]) + f.Topics[i][0] = 0x01 + } + + key, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("generateFilter 1 failed with seed %d.", seed) + return nil, err + } + f.Src = &key.PublicKey + + if symmetric { + f.KeySym = make([]byte, aesKeyLength) + mrand.Read(f.KeySym) + f.SymKeyHash = crypto.Keccak256Hash(f.KeySym) + } else { + f.KeyAsym, err = crypto.GenerateKey() + if err != nil { + t.Fatalf("generateFilter 2 failed with seed %d.", seed) + return nil, err + } + } + + // AcceptP2P & PoW are not set + return &f, nil +} + +func generateTestCases(t *testing.T, SizeTestFilters int) []FilterTestCase { + cases := make([]FilterTestCase, SizeTestFilters) + for i := 0; i < SizeTestFilters; i++ { + f, _ := generateFilter(t, true) + cases[i].f = f + cases[i].alive = (mrand.Int()&int(1) == 0) + } + return cases +} + +func TestInstallFilters(t *testing.T) { + InitSingleTest() + + const SizeTestFilters = 256 + w := New(&Config{}) + filters := NewFilters(w) + tst := generateTestCases(t, SizeTestFilters) + + var err error + var j string + for i := 0; i < SizeTestFilters; i++ { + j, err = filters.Install(tst[i].f) + if err != nil { + t.Fatalf("seed %d: failed to install filter: %s", seed, err) + } + tst[i].id = j + if len(j) != keyIdSize*2 { + t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j)) + } + } + + for _, testCase := range tst { + if !testCase.alive { + filters.Uninstall(testCase.id) + } + } + + for i, testCase := range tst { + fil := filters.Get(testCase.id) + exist := (fil != nil) + if exist != testCase.alive { + t.Fatalf("seed %d: failed alive: %d, %v, %v", seed, i, exist, testCase.alive) + } + if exist && fil.PoW != testCase.f.PoW { + t.Fatalf("seed %d: failed Get: %d, %v, %v", seed, i, exist, testCase.alive) + } + } +} + +func TestInstallSymKeyGeneratesHash(t *testing.T) { + InitSingleTest() + + w := New(&Config{}) + filters := NewFilters(w) + filter, _ := generateFilter(t, true) + + // save the current SymKeyHash for comparison + initialSymKeyHash := filter.SymKeyHash + + // ensure the SymKeyHash is invalid, for Install to recreate it + var invalid common.Hash + filter.SymKeyHash = invalid + + _, err := filters.Install(filter) + + if err != nil { + t.Fatalf("Error installing the filter: %s", err) + } + + for i, b := range filter.SymKeyHash { + if b != initialSymKeyHash[i] { + t.Fatalf("The filter's symmetric key hash was not properly generated by Install") + } + } +} + +func TestInstallIdenticalFilters(t *testing.T) { + InitSingleTest() + + w := New(&Config{}) + filters := NewFilters(w) + filter1, _ := generateFilter(t, true) + + // Copy the first filter since some of its fields + // are randomly gnerated. + filter2 := &Filter{ + KeySym: filter1.KeySym, + Topics: filter1.Topics, + PoW: filter1.PoW, + AllowP2P: filter1.AllowP2P, + Messages: make(map[common.Hash]*ReceivedMessage), + } + + _, err := filters.Install(filter1) + + if err != nil { + t.Fatalf("Error installing the first filter with seed %d: %s", seed, err) + } + + _, err = filters.Install(filter2) + + if err != nil { + t.Fatalf("Error installing the second filter with seed %d: %s", seed, err) + } + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("Error generating message parameters with seed %d: %s", seed, err) + } + + params.KeySym = filter1.KeySym + params.Topic = BytesToTopic(filter1.Topics[0]) + + filter1.Src = ¶ms.Src.PublicKey + filter2.Src = ¶ms.Src.PublicKey + + sentMessage, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := sentMessage.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + msg := env.Open(filter1) + if msg == nil { + t.Fatalf("failed to Open with filter1") + } + + if !filter1.MatchEnvelope(env) { + t.Fatalf("failed matching with the first filter") + } + + if !filter2.MatchEnvelope(env) { + t.Fatalf("failed matching with the first filter") + } + + if !filter1.MatchMessage(msg) { + t.Fatalf("failed matching with the second filter") + } + + if !filter2.MatchMessage(msg) { + t.Fatalf("failed matching with the second filter") + } +} + +func TestComparePubKey(t *testing.T) { + InitSingleTest() + + key1, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed to generate first key with seed %d: %s.", seed, err) + } + key2, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed to generate second key with seed %d: %s.", seed, err) + } + if IsPubKeyEqual(&key1.PublicKey, &key2.PublicKey) { + t.Fatalf("public keys are equal, seed %d.", seed) + } + + // generate key3 == key1 + mrand.Seed(seed) + key3, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed to generate third key with seed %d: %s.", seed, err) + } + if IsPubKeyEqual(&key1.PublicKey, &key3.PublicKey) { + t.Fatalf("key1 == key3, seed %d.", seed) + } +} + +func TestMatchEnvelope(t *testing.T) { + InitSingleTest() + + fsym, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) + } + + fasym, err := generateFilter(t, false) + if err != nil { + t.Fatalf("failed generateFilter() with seed %d: %s.", seed, err) + } + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + params.Topic[0] = 0xFF // ensure mismatch + + // mismatch with pseudo-random data + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + match := fsym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope symmetric with seed %d.", seed) + } + match = fasym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope asymmetric with seed %d.", seed) + } + + // encrypt symmetrically + i := mrand.Int() % 4 + fsym.Topics[i] = params.Topic[:] + fasym.Topics[i] = params.Topic[:] + msg, err = NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err = msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap() with seed %d: %s.", seed, err) + } + + // symmetric + matching topic: match + match = fsym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope() symmetric with seed %d.", seed) + } + + // asymmetric + matching topic: mismatch + match = fasym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope() asymmetric with seed %d.", seed) + } + + // symmetric + matching topic + insufficient PoW: mismatch + fsym.PoW = env.PoW() + 1.0 + match = fsym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope(symmetric + matching topic + insufficient PoW) asymmetric with seed %d.", seed) + } + + // symmetric + matching topic + sufficient PoW: match + fsym.PoW = env.PoW() / 2 + match = fsym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope(symmetric + matching topic + sufficient PoW) with seed %d.", seed) + } + + // symmetric + topics are nil (wildcard): match + prevTopics := fsym.Topics + fsym.Topics = nil + match = fsym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope(symmetric + topics are nil) with seed %d.", seed) + } + fsym.Topics = prevTopics + + // encrypt asymmetrically + key, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + params.KeySym = nil + params.Dst = &key.PublicKey + msg, err = NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err = msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap() with seed %d: %s.", seed, err) + } + + // encryption method mismatch + match = fsym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope(encryption method mismatch) with seed %d.", seed) + } + + // asymmetric + mismatching topic: mismatch + match = fasym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope(asymmetric + mismatching topic) with seed %d.", seed) + } + + // asymmetric + matching topic: match + fasym.Topics[i] = fasym.Topics[i+1] + match = fasym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope(asymmetric + matching topic) with seed %d.", seed) + } + + // asymmetric + filter without topic (wildcard): match + fasym.Topics = nil + match = fasym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope(asymmetric + filter without topic) with seed %d.", seed) + } + + // asymmetric + insufficient PoW: mismatch + fasym.PoW = env.PoW() + 1.0 + match = fasym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope(asymmetric + insufficient PoW) with seed %d.", seed) + } + + // asymmetric + sufficient PoW: match + fasym.PoW = env.PoW() / 2 + match = fasym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope(asymmetric + sufficient PoW) with seed %d.", seed) + } + + // filter without topic + envelope without topic: match + env.Topic = TopicType{} + match = fasym.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope(filter without topic + envelope without topic) with seed %d.", seed) + } + + // filter with topic + envelope without topic: mismatch + fasym.Topics = fsym.Topics + match = fasym.MatchEnvelope(env) + if match { + t.Fatalf("failed MatchEnvelope(filter without topic + envelope without topic) with seed %d.", seed) + } +} + +func TestMatchMessageSym(t *testing.T) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + f, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) + } + + const index = 1 + params.KeySym = f.KeySym + params.Topic = BytesToTopic(f.Topics[index]) + + sentMessage, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := sentMessage.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + msg := env.Open(f) + if msg == nil { + t.Fatalf("failed Open with seed %d.", seed) + } + + // Src: match + *f.Src.X = *params.Src.PublicKey.X + *f.Src.Y = *params.Src.PublicKey.Y + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(src match) with seed %d.", seed) + } + + // insufficient PoW: mismatch + f.PoW = msg.PoW + 1.0 + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(insufficient PoW) with seed %d.", seed) + } + + // sufficient PoW: match + f.PoW = msg.PoW / 2 + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(sufficient PoW) with seed %d.", seed) + } + + // topic mismatch + f.Topics[index][0]++ + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(topic mismatch) with seed %d.", seed) + } + f.Topics[index][0]-- + + // key mismatch + f.SymKeyHash[0]++ + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(key mismatch) with seed %d.", seed) + } + f.SymKeyHash[0]-- + + // Src absent: match + f.Src = nil + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(src absent) with seed %d.", seed) + } + + // key hash mismatch + h := f.SymKeyHash + f.SymKeyHash = common.Hash{} + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(key hash mismatch) with seed %d.", seed) + } + f.SymKeyHash = h + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(key hash match) with seed %d.", seed) + } + + // encryption method mismatch + f.KeySym = nil + f.KeyAsym, err = crypto.GenerateKey() + if err != nil { + t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(encryption method mismatch) with seed %d.", seed) + } +} + +func TestMatchMessageAsym(t *testing.T) { + InitSingleTest() + + f, err := generateFilter(t, false) + if err != nil { + t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) + } + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + const index = 1 + params.Topic = BytesToTopic(f.Topics[index]) + params.Dst = &f.KeyAsym.PublicKey + keySymOrig := params.KeySym + params.KeySym = nil + + sentMessage, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := sentMessage.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + msg := env.Open(f) + if msg == nil { + t.Fatalf("failed to open with seed %d.", seed) + } + + // Src: match + *f.Src.X = *params.Src.PublicKey.X + *f.Src.Y = *params.Src.PublicKey.Y + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchMessage(src match) with seed %d.", seed) + } + + // insufficient PoW: mismatch + f.PoW = msg.PoW + 1.0 + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(insufficient PoW) with seed %d.", seed) + } + + // sufficient PoW: match + f.PoW = msg.PoW / 2 + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(sufficient PoW) with seed %d.", seed) + } + + // topic mismatch + f.Topics[index][0]++ + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(topic mismatch) with seed %d.", seed) + } + f.Topics[index][0]-- + + // key mismatch + prev := *f.KeyAsym.PublicKey.X + zero := *big.NewInt(0) + *f.KeyAsym.PublicKey.X = zero + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(key mismatch) with seed %d.", seed) + } + *f.KeyAsym.PublicKey.X = prev + + // Src absent: match + f.Src = nil + if !f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(src absent) with seed %d.", seed) + } + + // encryption method mismatch + f.KeySym = keySymOrig + f.KeyAsym = nil + if f.MatchMessage(msg) { + t.Fatalf("failed MatchEnvelope(encryption method mismatch) with seed %d.", seed) + } +} + +func cloneFilter(orig *Filter) *Filter { + var clone Filter + clone.Messages = make(map[common.Hash]*ReceivedMessage) + clone.Src = orig.Src + clone.KeyAsym = orig.KeyAsym + clone.KeySym = orig.KeySym + clone.Topics = orig.Topics + clone.PoW = orig.PoW + clone.AllowP2P = orig.AllowP2P + clone.SymKeyHash = orig.SymKeyHash + return &clone +} + +func generateCompatibeEnvelope(t *testing.T, f *Filter) *Envelope { + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + return nil + } + + params.KeySym = f.KeySym + params.Topic = BytesToTopic(f.Topics[2]) + sentMessage, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := sentMessage.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + return nil + } + return env +} + +func TestWatchers(t *testing.T) { + InitSingleTest() + + const NumFilters = 16 + const NumMessages = 256 + var i int + var j uint32 + var e *Envelope + var x, firstID string + var err error + + w := New(&Config{}) + filters := NewFilters(w) + tst := generateTestCases(t, NumFilters) + for i = 0; i < NumFilters; i++ { + tst[i].f.Src = nil + x, err = filters.Install(tst[i].f) + if err != nil { + t.Fatalf("failed to install filter with seed %d: %s.", seed, err) + } + tst[i].id = x + if len(firstID) == 0 { + firstID = x + } + } + + lastID := x + + var envelopes [NumMessages]*Envelope + for i = 0; i < NumMessages; i++ { + j = mrand.Uint32() % NumFilters + e = generateCompatibeEnvelope(t, tst[j].f) + envelopes[i] = e + tst[j].msgCnt++ + } + + for i = 0; i < NumMessages; i++ { + filters.NotifyWatchers(envelopes[i], false) + } + + var total int + var mail []*ReceivedMessage + var count [NumFilters]int + + for i = 0; i < NumFilters; i++ { + mail = tst[i].f.Retrieve() + count[i] = len(mail) + total += len(mail) + } + + if total != NumMessages { + t.Fatalf("failed with seed %d: total = %d, want: %d.", seed, total, NumMessages) + } + + for i = 0; i < NumFilters; i++ { + mail = tst[i].f.Retrieve() + if len(mail) != 0 { + t.Fatalf("failed with seed %d: i = %d.", seed, i) + } + + if tst[i].msgCnt != count[i] { + t.Fatalf("failed with seed %d: count[%d]: get %d, want %d.", seed, i, tst[i].msgCnt, count[i]) + } + } + + // another round with a cloned filter + + clone := cloneFilter(tst[0].f) + filters.Uninstall(lastID) + total = 0 + last := NumFilters - 1 + tst[last].f = clone + filters.Install(clone) + for i = 0; i < NumFilters; i++ { + tst[i].msgCnt = 0 + count[i] = 0 + } + + // make sure that the first watcher receives at least one message + e = generateCompatibeEnvelope(t, tst[0].f) + envelopes[0] = e + tst[0].msgCnt++ + for i = 1; i < NumMessages; i++ { + j = mrand.Uint32() % NumFilters + e = generateCompatibeEnvelope(t, tst[j].f) + envelopes[i] = e + tst[j].msgCnt++ + } + + for i = 0; i < NumMessages; i++ { + filters.NotifyWatchers(envelopes[i], false) + } + + for i = 0; i < NumFilters; i++ { + mail = tst[i].f.Retrieve() + count[i] = len(mail) + total += len(mail) + } + + combined := tst[0].msgCnt + tst[last].msgCnt + if total != NumMessages+count[0] { + t.Fatalf("failed with seed %d: total = %d, count[0] = %d.", seed, total, count[0]) + } + + if combined != count[0] { + t.Fatalf("failed with seed %d: combined = %d, count[0] = %d.", seed, combined, count[0]) + } + + if combined != count[last] { + t.Fatalf("failed with seed %d: combined = %d, count[last] = %d.", seed, combined, count[last]) + } + + for i = 1; i < NumFilters-1; i++ { + mail = tst[i].f.Retrieve() + if len(mail) != 0 { + t.Fatalf("failed with seed %d: i = %d.", seed, i) + } + + if tst[i].msgCnt != count[i] { + t.Fatalf("failed with seed %d: i = %d, get %d, want %d.", seed, i, tst[i].msgCnt, count[i]) + } + } + + // test AcceptP2P + + total = 0 + filters.NotifyWatchers(envelopes[0], true) + + for i = 0; i < NumFilters; i++ { + mail = tst[i].f.Retrieve() + total += len(mail) + } + + if total != 0 { + t.Fatalf("failed with seed %d: total: got %d, want 0.", seed, total) + } + + f := filters.Get(firstID) + if f == nil { + t.Fatalf("failed to get the filter with seed %d.", seed) + } + f.AllowP2P = true + total = 0 + filters.NotifyWatchers(envelopes[0], true) + + for i = 0; i < NumFilters; i++ { + mail = tst[i].f.Retrieve() + total += len(mail) + } + + if total != 1 { + t.Fatalf("failed with seed %d: total: got %d, want 1.", seed, total) + } +} + +func TestVariableTopics(t *testing.T) { + InitSingleTest() + + var match bool + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + f, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) + } + + for i := 0; i < 4; i++ { + arr := make([]byte, i+1, 4) + copy(arr, env.Topic[:i+1]) + + f.Topics[4] = arr + match = f.MatchEnvelope(env) + if !match { + t.Fatalf("failed MatchEnvelope symmetric with seed %d, step %d.", seed, i) + } + + f.Topics[4][i]++ + match = f.MatchEnvelope(env) + if match { + t.Fatalf("MatchEnvelope symmetric with seed %d, step %d: false positive.", seed, i) + } + } +} diff --git a/whisper/whisperv6/gen_criteria_json.go b/whisper/whisperv6/gen_criteria_json.go new file mode 100644 index 0000000000..52a4d3cb66 --- /dev/null +++ b/whisper/whisperv6/gen_criteria_json.go @@ -0,0 +1,64 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package whisperv6 + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*criteriaOverride)(nil) + +func (c Criteria) MarshalJSON() ([]byte, error) { + type Criteria struct { + SymKeyID string `json:"symKeyID"` + PrivateKeyID string `json:"privateKeyID"` + Sig hexutil.Bytes `json:"sig"` + MinPow float64 `json:"minPow"` + Topics []TopicType `json:"topics"` + AllowP2P bool `json:"allowP2P"` + } + var enc Criteria + enc.SymKeyID = c.SymKeyID + enc.PrivateKeyID = c.PrivateKeyID + enc.Sig = c.Sig + enc.MinPow = c.MinPow + enc.Topics = c.Topics + enc.AllowP2P = c.AllowP2P + return json.Marshal(&enc) +} + +func (c *Criteria) UnmarshalJSON(input []byte) error { + type Criteria struct { + SymKeyID *string `json:"symKeyID"` + PrivateKeyID *string `json:"privateKeyID"` + Sig hexutil.Bytes `json:"sig"` + MinPow *float64 `json:"minPow"` + Topics []TopicType `json:"topics"` + AllowP2P *bool `json:"allowP2P"` + } + var dec Criteria + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.SymKeyID != nil { + c.SymKeyID = *dec.SymKeyID + } + if dec.PrivateKeyID != nil { + c.PrivateKeyID = *dec.PrivateKeyID + } + if dec.Sig != nil { + c.Sig = dec.Sig + } + if dec.MinPow != nil { + c.MinPow = *dec.MinPow + } + if dec.Topics != nil { + c.Topics = dec.Topics + } + if dec.AllowP2P != nil { + c.AllowP2P = *dec.AllowP2P + } + return nil +} diff --git a/whisper/whisperv6/gen_message_json.go b/whisper/whisperv6/gen_message_json.go new file mode 100644 index 0000000000..27b46752be --- /dev/null +++ b/whisper/whisperv6/gen_message_json.go @@ -0,0 +1,82 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package whisperv6 + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*messageOverride)(nil) + +func (m Message) MarshalJSON() ([]byte, error) { + type Message struct { + Sig hexutil.Bytes `json:"sig,omitempty"` + TTL uint32 `json:"ttl"` + Timestamp uint32 `json:"timestamp"` + Topic TopicType `json:"topic"` + Payload hexutil.Bytes `json:"payload"` + Padding hexutil.Bytes `json:"padding"` + PoW float64 `json:"pow"` + Hash hexutil.Bytes `json:"hash"` + Dst hexutil.Bytes `json:"recipientPublicKey,omitempty"` + } + var enc Message + enc.Sig = m.Sig + enc.TTL = m.TTL + enc.Timestamp = m.Timestamp + enc.Topic = m.Topic + enc.Payload = m.Payload + enc.Padding = m.Padding + enc.PoW = m.PoW + enc.Hash = m.Hash + enc.Dst = m.Dst + return json.Marshal(&enc) +} + +func (m *Message) UnmarshalJSON(input []byte) error { + type Message struct { + Sig hexutil.Bytes `json:"sig,omitempty"` + TTL *uint32 `json:"ttl"` + Timestamp *uint32 `json:"timestamp"` + Topic *TopicType `json:"topic"` + Payload hexutil.Bytes `json:"payload"` + Padding hexutil.Bytes `json:"padding"` + PoW *float64 `json:"pow"` + Hash hexutil.Bytes `json:"hash"` + Dst hexutil.Bytes `json:"recipientPublicKey,omitempty"` + } + var dec Message + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Sig != nil { + m.Sig = dec.Sig + } + if dec.TTL != nil { + m.TTL = *dec.TTL + } + if dec.Timestamp != nil { + m.Timestamp = *dec.Timestamp + } + if dec.Topic != nil { + m.Topic = *dec.Topic + } + if dec.Payload != nil { + m.Payload = dec.Payload + } + if dec.Padding != nil { + m.Padding = dec.Padding + } + if dec.PoW != nil { + m.PoW = *dec.PoW + } + if dec.Hash != nil { + m.Hash = dec.Hash + } + if dec.Dst != nil { + m.Dst = dec.Dst + } + return nil +} diff --git a/whisper/whisperv6/gen_newmessage_json.go b/whisper/whisperv6/gen_newmessage_json.go new file mode 100644 index 0000000000..d16011a579 --- /dev/null +++ b/whisper/whisperv6/gen_newmessage_json.go @@ -0,0 +1,88 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package whisperv6 + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*newMessageOverride)(nil) + +func (n NewMessage) MarshalJSON() ([]byte, error) { + type NewMessage struct { + SymKeyID string `json:"symKeyID"` + PublicKey hexutil.Bytes `json:"pubKey"` + Sig string `json:"sig"` + TTL uint32 `json:"ttl"` + Topic TopicType `json:"topic"` + Payload hexutil.Bytes `json:"payload"` + Padding hexutil.Bytes `json:"padding"` + PowTime uint32 `json:"powTime"` + PowTarget float64 `json:"powTarget"` + TargetPeer string `json:"targetPeer"` + } + var enc NewMessage + enc.SymKeyID = n.SymKeyID + enc.PublicKey = n.PublicKey + enc.Sig = n.Sig + enc.TTL = n.TTL + enc.Topic = n.Topic + enc.Payload = n.Payload + enc.Padding = n.Padding + enc.PowTime = n.PowTime + enc.PowTarget = n.PowTarget + enc.TargetPeer = n.TargetPeer + return json.Marshal(&enc) +} + +func (n *NewMessage) UnmarshalJSON(input []byte) error { + type NewMessage struct { + SymKeyID *string `json:"symKeyID"` + PublicKey hexutil.Bytes `json:"pubKey"` + Sig *string `json:"sig"` + TTL *uint32 `json:"ttl"` + Topic *TopicType `json:"topic"` + Payload hexutil.Bytes `json:"payload"` + Padding hexutil.Bytes `json:"padding"` + PowTime *uint32 `json:"powTime"` + PowTarget *float64 `json:"powTarget"` + TargetPeer *string `json:"targetPeer"` + } + var dec NewMessage + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.SymKeyID != nil { + n.SymKeyID = *dec.SymKeyID + } + if dec.PublicKey != nil { + n.PublicKey = dec.PublicKey + } + if dec.Sig != nil { + n.Sig = *dec.Sig + } + if dec.TTL != nil { + n.TTL = *dec.TTL + } + if dec.Topic != nil { + n.Topic = *dec.Topic + } + if dec.Payload != nil { + n.Payload = dec.Payload + } + if dec.Padding != nil { + n.Padding = dec.Padding + } + if dec.PowTime != nil { + n.PowTime = *dec.PowTime + } + if dec.PowTarget != nil { + n.PowTarget = *dec.PowTarget + } + if dec.TargetPeer != nil { + n.TargetPeer = *dec.TargetPeer + } + return nil +} diff --git a/whisper/whisperv6/message.go b/whisper/whisperv6/message.go new file mode 100644 index 0000000000..0815f07a2d --- /dev/null +++ b/whisper/whisperv6/message.go @@ -0,0 +1,352 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Contains the Whisper protocol Message element. + +package whisperv6 + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/ecdsa" + crand "crypto/rand" + "encoding/binary" + "errors" + "strconv" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" + "github.com/ethereum/go-ethereum/log" +) + +// Options specifies the exact way a message should be wrapped into an Envelope. +type MessageParams struct { + TTL uint32 + Src *ecdsa.PrivateKey + Dst *ecdsa.PublicKey + KeySym []byte + Topic TopicType + WorkTime uint32 + PoW float64 + Payload []byte + Padding []byte +} + +// SentMessage represents an end-user data packet to transmit through the +// Whisper protocol. These are wrapped into Envelopes that need not be +// understood by intermediate nodes, just forwarded. +type sentMessage struct { + Raw []byte +} + +// ReceivedMessage represents a data packet to be received through the +// Whisper protocol. +type ReceivedMessage struct { + Raw []byte + + Payload []byte + Padding []byte + Signature []byte + + PoW float64 // Proof of work as described in the Whisper spec + Sent uint32 // Time when the message was posted into the network + TTL uint32 // Maximum time to live allowed for the message + Src *ecdsa.PublicKey // Message recipient (identity used to decode the message) + Dst *ecdsa.PublicKey // Message recipient (identity used to decode the message) + Topic TopicType + + SymKeyHash common.Hash // The Keccak256Hash of the key, associated with the Topic + EnvelopeHash common.Hash // Message envelope hash to act as a unique id + EnvelopeVersion uint64 +} + +func isMessageSigned(flags byte) bool { + return (flags & signatureFlag) != 0 +} + +func (msg *ReceivedMessage) isSymmetricEncryption() bool { + return msg.SymKeyHash != common.Hash{} +} + +func (msg *ReceivedMessage) isAsymmetricEncryption() bool { + return msg.Dst != nil +} + +// NewMessage creates and initializes a non-signed, non-encrypted Whisper message. +func NewSentMessage(params *MessageParams) (*sentMessage, error) { + msg := sentMessage{} + msg.Raw = make([]byte, 1, len(params.Payload)+len(params.Padding)+signatureLength+padSizeLimit) + msg.Raw[0] = 0 // set all the flags to zero + err := msg.appendPadding(params) + if err != nil { + return nil, err + } + msg.Raw = append(msg.Raw, params.Payload...) + return &msg, nil +} + +// getSizeOfLength returns the number of bytes necessary to encode the entire size padding (including these bytes) +func getSizeOfLength(b []byte) (sz int, err error) { + sz = intSize(len(b)) // first iteration + sz = intSize(len(b) + sz) // second iteration + if sz > 3 { + err = errors.New("oversized padding parameter") + } + return sz, err +} + +// sizeOfIntSize returns minimal number of bytes necessary to encode an integer value +func intSize(i int) (s int) { + for s = 1; i >= 256; s++ { + i /= 256 + } + return s +} + +// appendPadding appends the pseudorandom padding bytes and sets the padding flag. +// The last byte contains the size of padding (thus, its size must not exceed 256). +func (msg *sentMessage) appendPadding(params *MessageParams) error { + rawSize := len(params.Payload) + 1 + if params.Src != nil { + rawSize += signatureLength + } + odd := rawSize % padSizeLimit + + if len(params.Padding) != 0 { + padSize := len(params.Padding) + padLengthSize, err := getSizeOfLength(params.Padding) + if err != nil { + return err + } + totalPadSize := padSize + padLengthSize + buf := make([]byte, 8) + binary.LittleEndian.PutUint32(buf, uint32(totalPadSize)) + buf = buf[:padLengthSize] + msg.Raw = append(msg.Raw, buf...) + msg.Raw = append(msg.Raw, params.Padding...) + msg.Raw[0] |= byte(padLengthSize) // number of bytes indicating the padding size + } else if odd != 0 { + totalPadSize := padSizeLimit - odd + if totalPadSize > 255 { + // this algorithm is only valid if padSizeLimit < 256. + // if padSizeLimit will ever change, please fix the algorithm + // (please see also ReceivedMessage.extractPadding() function). + panic("please fix the padding algorithm before releasing new version") + } + buf := make([]byte, totalPadSize) + _, err := crand.Read(buf[1:]) + if err != nil { + return err + } + if totalPadSize > 6 && !validateSymmetricKey(buf) { + return errors.New("failed to generate random padding of size " + strconv.Itoa(totalPadSize)) + } + buf[0] = byte(totalPadSize) + msg.Raw = append(msg.Raw, buf...) + msg.Raw[0] |= byte(0x1) // number of bytes indicating the padding size + } + return nil +} + +// sign calculates and sets the cryptographic signature for the message, +// also setting the sign flag. +func (msg *sentMessage) sign(key *ecdsa.PrivateKey) error { + if isMessageSigned(msg.Raw[0]) { + // this should not happen, but no reason to panic + log.Error("failed to sign the message: already signed") + return nil + } + + msg.Raw[0] |= signatureFlag + hash := crypto.Keccak256(msg.Raw) + signature, err := crypto.Sign(hash, key) + if err != nil { + msg.Raw[0] &= ^signatureFlag // clear the flag + return err + } + msg.Raw = append(msg.Raw, signature...) + return nil +} + +// encryptAsymmetric encrypts a message with a public key. +func (msg *sentMessage) encryptAsymmetric(key *ecdsa.PublicKey) error { + if !ValidatePublicKey(key) { + return errors.New("invalid public key provided for asymmetric encryption") + } + encrypted, err := ecies.Encrypt(crand.Reader, ecies.ImportECDSAPublic(key), msg.Raw, nil, nil) + if err == nil { + msg.Raw = encrypted + } + return err +} + +// encryptSymmetric encrypts a message with a topic key, using AES-GCM-256. +// nonce size should be 12 bytes (see cipher.gcmStandardNonceSize). +func (msg *sentMessage) encryptSymmetric(key []byte) (nonce []byte, err error) { + if !validateSymmetricKey(key) { + return nil, errors.New("invalid key provided for symmetric encryption") + } + + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + aesgcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + // never use more than 2^32 random nonces with a given key + nonce = make([]byte, aesgcm.NonceSize()) + _, err = crand.Read(nonce) + if err != nil { + return nil, err + } else if !validateSymmetricKey(nonce) { + return nil, errors.New("crypto/rand failed to generate nonce") + } + + msg.Raw = aesgcm.Seal(nil, nonce, msg.Raw, nil) + return nonce, nil +} + +// Wrap bundles the message into an Envelope to transmit over the network. +func (msg *sentMessage) Wrap(options *MessageParams) (envelope *Envelope, err error) { + if options.TTL == 0 { + options.TTL = DefaultTTL + } + if options.Src != nil { + if err = msg.sign(options.Src); err != nil { + return nil, err + } + } + var nonce []byte + if options.Dst != nil { + err = msg.encryptAsymmetric(options.Dst) + } else if options.KeySym != nil { + nonce, err = msg.encryptSymmetric(options.KeySym) + } else { + err = errors.New("unable to encrypt the message: neither symmetric nor assymmetric key provided") + } + if err != nil { + return nil, err + } + + envelope = NewEnvelope(options.TTL, options.Topic, nonce, msg) + if err = envelope.Seal(options); err != nil { + return nil, err + } + return envelope, nil +} + +// decryptSymmetric decrypts a message with a topic key, using AES-GCM-256. +// nonce size should be 12 bytes (see cipher.gcmStandardNonceSize). +func (msg *ReceivedMessage) decryptSymmetric(key []byte, nonce []byte) error { + block, err := aes.NewCipher(key) + if err != nil { + return err + } + aesgcm, err := cipher.NewGCM(block) + if err != nil { + return err + } + if len(nonce) != aesgcm.NonceSize() { + log.Error("decrypting the message", "AES nonce size", len(nonce)) + return errors.New("wrong AES nonce size") + } + decrypted, err := aesgcm.Open(nil, nonce, msg.Raw, nil) + if err != nil { + return err + } + msg.Raw = decrypted + return nil +} + +// decryptAsymmetric decrypts an encrypted payload with a private key. +func (msg *ReceivedMessage) decryptAsymmetric(key *ecdsa.PrivateKey) error { + decrypted, err := ecies.ImportECDSA(key).Decrypt(crand.Reader, msg.Raw, nil, nil) + if err == nil { + msg.Raw = decrypted + } + return err +} + +// Validate checks the validity and extracts the fields in case of success +func (msg *ReceivedMessage) Validate() bool { + end := len(msg.Raw) + if end < 1 { + return false + } + + if isMessageSigned(msg.Raw[0]) { + end -= signatureLength + if end <= 1 { + return false + } + msg.Signature = msg.Raw[end:] + msg.Src = msg.SigToPubKey() + if msg.Src == nil { + return false + } + } + + padSize, ok := msg.extractPadding(end) + if !ok { + return false + } + + msg.Payload = msg.Raw[1+padSize : end] + return true +} + +// extractPadding extracts the padding from raw message. +// although we don't support sending messages with padding size +// exceeding 255 bytes, such messages are perfectly valid, and +// can be successfully decrypted. +func (msg *ReceivedMessage) extractPadding(end int) (int, bool) { + paddingSize := 0 + sz := int(msg.Raw[0] & paddingMask) // number of bytes indicating the entire size of padding (including these bytes) + // could be zero -- it means no padding + if sz != 0 { + paddingSize = int(bytesToUintLittleEndian(msg.Raw[1 : 1+sz])) + if paddingSize < sz || paddingSize+1 > end { + return 0, false + } + msg.Padding = msg.Raw[1+sz : 1+paddingSize] + } + return paddingSize, true +} + +// Recover retrieves the public key of the message signer. +func (msg *ReceivedMessage) SigToPubKey() *ecdsa.PublicKey { + defer func() { recover() }() // in case of invalid signature + + pub, err := crypto.SigToPub(msg.hash(), msg.Signature) + if err != nil { + log.Error("failed to recover public key from signature", "err", err) + return nil + } + return pub +} + +// hash calculates the SHA3 checksum of the message flags, payload and padding. +func (msg *ReceivedMessage) hash() []byte { + if isMessageSigned(msg.Raw[0]) { + sz := len(msg.Raw) - signatureLength + return crypto.Keccak256(msg.Raw[:sz]) + } + return crypto.Keccak256(msg.Raw) +} diff --git a/whisper/whisperv6/message_test.go b/whisper/whisperv6/message_test.go new file mode 100644 index 0000000000..912b90f145 --- /dev/null +++ b/whisper/whisperv6/message_test.go @@ -0,0 +1,415 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "bytes" + mrand "math/rand" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" +) + +func generateMessageParams() (*MessageParams, error) { + // set all the parameters except p.Dst and p.Padding + + buf := make([]byte, 4) + mrand.Read(buf) + sz := mrand.Intn(400) + + var p MessageParams + p.PoW = 0.01 + p.WorkTime = 1 + p.TTL = uint32(mrand.Intn(1024)) + p.Payload = make([]byte, sz) + p.KeySym = make([]byte, aesKeyLength) + mrand.Read(p.Payload) + mrand.Read(p.KeySym) + p.Topic = BytesToTopic(buf) + + var err error + p.Src, err = crypto.GenerateKey() + if err != nil { + return nil, err + } + + return &p, nil +} + +func singleMessageTest(t *testing.T, symmetric bool) { + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + key, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + + if !symmetric { + params.KeySym = nil + params.Dst = &key.PublicKey + } + + text := make([]byte, 0, 512) + text = append(text, params.Payload...) + + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + var decrypted *ReceivedMessage + if symmetric { + decrypted, err = env.OpenSymmetric(params.KeySym) + } else { + decrypted, err = env.OpenAsymmetric(key) + } + + if err != nil { + t.Fatalf("failed to encrypt with seed %d: %s.", seed, err) + } + + if !decrypted.Validate() { + t.Fatalf("failed to validate with seed %d.", seed) + } + + if !bytes.Equal(text, decrypted.Payload) { + t.Fatalf("failed with seed %d: compare payload.", seed) + } + if !isMessageSigned(decrypted.Raw[0]) { + t.Fatalf("failed with seed %d: unsigned.", seed) + } + if len(decrypted.Signature) != signatureLength { + t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) + } + if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { + t.Fatalf("failed with seed %d: signature mismatch.", seed) + } +} + +func TestMessageEncryption(t *testing.T) { + InitSingleTest() + + var symmetric bool + for i := 0; i < 256; i++ { + singleMessageTest(t, symmetric) + symmetric = !symmetric + } +} + +func TestMessageWrap(t *testing.T) { + seed = int64(1777444222) + mrand.Seed(seed) + target := 128.0 + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + params.TTL = 1 + params.WorkTime = 12 + params.PoW = target + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + pow := env.PoW() + if pow < target { + t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) + } + + // set PoW target too high, expect error + msg2, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + params.TTL = 1000000 + params.WorkTime = 1 + params.PoW = 10000000.0 + _, err = msg2.Wrap(params) + if err == nil { + t.Fatalf("unexpectedly reached the PoW target with seed %d.", seed) + } +} + +func TestMessageSeal(t *testing.T) { + // this test depends on deterministic choice of seed (1976726903) + seed = int64(1976726903) + mrand.Seed(seed) + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + params.TTL = 1 + aesnonce := make([]byte, 12) + mrand.Read(aesnonce) + + env := NewEnvelope(params.TTL, params.Topic, aesnonce, msg) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + env.Expiry = uint32(seed) // make it deterministic + target := 32.0 + params.WorkTime = 4 + params.PoW = target + env.Seal(params) + + env.calculatePoW(0) + pow := env.PoW() + if pow < target { + t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) + } + + params.WorkTime = 1 + params.PoW = 1000000000.0 + env.Seal(params) + env.calculatePoW(0) + pow = env.PoW() + if pow < 2*target { + t.Fatalf("failed Wrap with seed %d: pow too small %f.", seed, pow) + } +} + +func TestEnvelopeOpen(t *testing.T) { + InitSingleTest() + + var symmetric bool + for i := 0; i < 256; i++ { + singleEnvelopeOpenTest(t, symmetric) + symmetric = !symmetric + } +} + +func singleEnvelopeOpenTest(t *testing.T, symmetric bool) { + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + key, err := crypto.GenerateKey() + if err != nil { + t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) + } + + if !symmetric { + params.KeySym = nil + params.Dst = &key.PublicKey + } + + text := make([]byte, 0, 512) + text = append(text, params.Payload...) + + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + f := Filter{KeyAsym: key, KeySym: params.KeySym} + decrypted := env.Open(&f) + if decrypted == nil { + t.Fatalf("failed to open with seed %d.", seed) + } + + if !bytes.Equal(text, decrypted.Payload) { + t.Fatalf("failed with seed %d: compare payload.", seed) + } + if !isMessageSigned(decrypted.Raw[0]) { + t.Fatalf("failed with seed %d: unsigned.", seed) + } + if len(decrypted.Signature) != signatureLength { + t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) + } + if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { + t.Fatalf("failed with seed %d: signature mismatch.", seed) + } + if decrypted.isAsymmetricEncryption() == symmetric { + t.Fatalf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric) + } + if decrypted.isSymmetricEncryption() != symmetric { + t.Fatalf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric) + } + if !symmetric { + if decrypted.Dst == nil { + t.Fatalf("failed with seed %d: dst is nil.", seed) + } + if !IsPubKeyEqual(decrypted.Dst, &key.PublicKey) { + t.Fatalf("failed with seed %d: Dst.", seed) + } + } +} + +func TestEncryptWithZeroKey(t *testing.T) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + params.KeySym = make([]byte, aesKeyLength) + _, err = msg.Wrap(params) + if err == nil { + t.Fatalf("wrapped with zero key, seed: %d.", seed) + } + + params, err = generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, err = NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + params.KeySym = make([]byte, 0) + _, err = msg.Wrap(params) + if err == nil { + t.Fatalf("wrapped with empty key, seed: %d.", seed) + } + + params, err = generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, err = NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + params.KeySym = nil + _, err = msg.Wrap(params) + if err == nil { + t.Fatalf("wrapped with nil key, seed: %d.", seed) + } +} + +func TestRlpEncode(t *testing.T) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("wrapped with zero key, seed: %d.", seed) + } + + raw, err := rlp.EncodeToBytes(env) + if err != nil { + t.Fatalf("RLP encode failed: %s.", err) + } + + var decoded Envelope + rlp.DecodeBytes(raw, &decoded) + if err != nil { + t.Fatalf("RLP decode failed: %s.", err) + } + + he := env.Hash() + hd := decoded.Hash() + + if he != hd { + t.Fatalf("Hashes are not equal: %x vs. %x", he, hd) + } +} + +func singlePaddingTest(t *testing.T, padSize int) { + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d and sz=%d: %s.", seed, padSize, err) + } + params.Padding = make([]byte, padSize) + params.PoW = 0.0000000001 + pad := make([]byte, padSize) + _, err = mrand.Read(pad) + if err != nil { + t.Fatalf("padding is not generated (seed %d): %s", seed, err) + } + n := copy(params.Padding, pad) + if n != padSize { + t.Fatalf("padding is not copied (seed %d): %s", seed, err) + } + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed to wrap, seed: %d and sz=%d.", seed, padSize) + } + f := Filter{KeySym: params.KeySym} + decrypted := env.Open(&f) + if decrypted == nil { + t.Fatalf("failed to open, seed and sz=%d: %d.", seed, padSize) + } + if !bytes.Equal(pad, decrypted.Padding) { + t.Fatalf("padding is not retireved as expected with seed %d and sz=%d:\n[%x]\n[%x].", seed, padSize, pad, decrypted.Padding) + } +} + +func TestPadding(t *testing.T) { + InitSingleTest() + + for i := 1; i < 260; i++ { + singlePaddingTest(t, i) + } + + lim := 256 * 256 + for i := lim - 5; i < lim+2; i++ { + singlePaddingTest(t, i) + } + + for i := 0; i < 256; i++ { + n := mrand.Intn(256*254) + 256 + singlePaddingTest(t, n) + } + + for i := 0; i < 256; i++ { + n := mrand.Intn(256*1024) + 256*256 + singlePaddingTest(t, n) + } +} diff --git a/whisper/whisperv6/peer.go b/whisper/whisperv6/peer.go new file mode 100644 index 0000000000..ac7b3b12b6 --- /dev/null +++ b/whisper/whisperv6/peer.go @@ -0,0 +1,174 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "fmt" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rlp" + set "gopkg.in/fatih/set.v0" +) + +// peer represents a whisper protocol peer connection. +type Peer struct { + host *Whisper + peer *p2p.Peer + ws p2p.MsgReadWriter + trusted bool + + known *set.Set // Messages already known by the peer to avoid wasting bandwidth + + quit chan struct{} +} + +// newPeer creates a new whisper peer object, but does not run the handshake itself. +func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) *Peer { + return &Peer{ + host: host, + peer: remote, + ws: rw, + trusted: false, + known: set.New(), + quit: make(chan struct{}), + } +} + +// start initiates the peer updater, periodically broadcasting the whisper packets +// into the network. +func (p *Peer) start() { + go p.update() + log.Trace("start", "peer", p.ID()) +} + +// stop terminates the peer updater, stopping message forwarding to it. +func (p *Peer) stop() { + close(p.quit) + log.Trace("stop", "peer", p.ID()) +} + +// handshake sends the protocol initiation status message to the remote peer and +// verifies the remote status too. +func (p *Peer) handshake() error { + // Send the handshake status message asynchronously + errc := make(chan error, 1) + go func() { + errc <- p2p.Send(p.ws, statusCode, ProtocolVersion) + }() + // Fetch the remote status packet and verify protocol match + packet, err := p.ws.ReadMsg() + if err != nil { + return err + } + if packet.Code != statusCode { + return fmt.Errorf("peer [%x] sent packet %x before status packet", p.ID(), packet.Code) + } + s := rlp.NewStream(packet.Payload, uint64(packet.Size)) + peerVersion, err := s.Uint() + if err != nil { + return fmt.Errorf("peer [%x] sent bad status message: %v", p.ID(), err) + } + if peerVersion != ProtocolVersion { + return fmt.Errorf("peer [%x]: protocol version mismatch %d != %d", p.ID(), peerVersion, ProtocolVersion) + } + // Wait until out own status is consumed too + if err := <-errc; err != nil { + return fmt.Errorf("peer [%x] failed to send status packet: %v", p.ID(), err) + } + return nil +} + +// update executes periodic operations on the peer, including message transmission +// and expiration. +func (p *Peer) update() { + // Start the tickers for the updates + expire := time.NewTicker(expirationCycle) + transmit := time.NewTicker(transmissionCycle) + + // Loop and transmit until termination is requested + for { + select { + case <-expire.C: + p.expire() + + case <-transmit.C: + if err := p.broadcast(); err != nil { + log.Trace("broadcast failed", "reason", err, "peer", p.ID()) + return + } + + case <-p.quit: + return + } + } +} + +// mark marks an envelope known to the peer so that it won't be sent back. +func (peer *Peer) mark(envelope *Envelope) { + peer.known.Add(envelope.Hash()) +} + +// marked checks if an envelope is already known to the remote peer. +func (peer *Peer) marked(envelope *Envelope) bool { + return peer.known.Has(envelope.Hash()) +} + +// expire iterates over all the known envelopes in the host and removes all +// expired (unknown) ones from the known list. +func (peer *Peer) expire() { + unmark := make(map[common.Hash]struct{}) + peer.known.Each(func(v interface{}) bool { + if !peer.host.isEnvelopeCached(v.(common.Hash)) { + unmark[v.(common.Hash)] = struct{}{} + } + return true + }) + // Dump all known but no longer cached + for hash := range unmark { + peer.known.Remove(hash) + } +} + +// broadcast iterates over the collection of envelopes and transmits yet unknown +// ones over the network. +func (p *Peer) broadcast() error { + var cnt int + envelopes := p.host.Envelopes() + for _, envelope := range envelopes { + if !p.marked(envelope) { + err := p2p.Send(p.ws, messagesCode, envelope) + if err != nil { + return err + } else { + p.mark(envelope) + cnt++ + } + } + } + if cnt > 0 { + log.Trace("broadcast", "num. messages", cnt) + } + return nil +} + +func (p *Peer) ID() []byte { + id := p.peer.ID() + return id[:] +} diff --git a/whisper/whisperv6/peer_test.go b/whisper/whisperv6/peer_test.go new file mode 100644 index 0000000000..39a4ab1980 --- /dev/null +++ b/whisper/whisperv6/peer_test.go @@ -0,0 +1,306 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "bytes" + "crypto/ecdsa" + "fmt" + "net" + "sync" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/nat" +) + +var keys []string = []string{ + "d49dcf37238dc8a7aac57dc61b9fee68f0a97f062968978b9fafa7d1033d03a9", + "73fd6143c48e80ed3c56ea159fe7494a0b6b393a392227b422f4c3e8f1b54f98", + "119dd32adb1daa7a4c7bf77f847fb28730785aa92947edf42fdd997b54de40dc", + "deeda8709dea935bb772248a3144dea449ffcc13e8e5a1fd4ef20ce4e9c87837", + "5bd208a079633befa349441bdfdc4d85ba9bd56081525008380a63ac38a407cf", + "1d27fb4912002d58a2a42a50c97edb05c1b3dffc665dbaa42df1fe8d3d95c9b5", + "15def52800c9d6b8ca6f3066b7767a76afc7b611786c1276165fbc61636afb68", + "51be6ab4b2dc89f251ff2ace10f3c1cc65d6855f3e083f91f6ff8efdfd28b48c", + "ef1ef7441bf3c6419b162f05da6037474664f198b58db7315a6f4de52414b4a0", + "09bdf6985aabc696dc1fbeb5381aebd7a6421727343872eb2fadfc6d82486fd9", + "15d811bf2e01f99a224cdc91d0cf76cea08e8c67905c16fee9725c9be71185c4", + "2f83e45cf1baaea779789f755b7da72d8857aeebff19362dd9af31d3c9d14620", + "73f04e34ac6532b19c2aae8f8e52f38df1ac8f5cd10369f92325b9b0494b0590", + "1e2e07b69e5025537fb73770f483dc8d64f84ae3403775ef61cd36e3faf162c1", + "8963d9bbb3911aac6d30388c786756b1c423c4fbbc95d1f96ddbddf39809e43a", + "0422da85abc48249270b45d8de38a4cc3c02032ede1fcf0864a51092d58a2f1f", + "8ae5c15b0e8c7cade201fdc149831aa9b11ff626a7ffd27188886cc108ad0fa8", + "acd8f5a71d4aecfcb9ad00d32aa4bcf2a602939b6a9dd071bab443154184f805", + "a285a922125a7481600782ad69debfbcdb0316c1e97c267aff29ef50001ec045", + "28fd4eee78c6cd4bf78f39f8ab30c32c67c24a6223baa40e6f9c9a0e1de7cef5", + "c5cca0c9e6f043b288c6f1aef448ab59132dab3e453671af5d0752961f013fc7", + "46df99b051838cb6f8d1b73f232af516886bd8c4d0ee07af9a0a033c391380fd", + "c6a06a53cbaadbb432884f36155c8f3244e244881b5ee3e92e974cfa166d793f", + "783b90c75c63dc72e2f8d11b6f1b4de54d63825330ec76ee8db34f06b38ea211", + "9450038f10ca2c097a8013e5121b36b422b95b04892232f930a29292d9935611", + "e215e6246ed1cfdcf7310d4d8cdbe370f0d6a8371e4eb1089e2ae05c0e1bc10f", + "487110939ed9d64ebbc1f300adeab358bc58875faf4ca64990fbd7fe03b78f2b", + "824a70ea76ac81366da1d4f4ac39de851c8ac49dca456bb3f0a186ceefa269a5", + "ba8f34fa40945560d1006a328fe70c42e35cc3d1017e72d26864cd0d1b150f15", + "30a5dfcfd144997f428901ea88a43c8d176b19c79dde54cc58eea001aa3d246c", + "de59f7183aca39aa245ce66a05245fecfc7e2c75884184b52b27734a4a58efa2", + "92629e2ff5f0cb4f5f08fffe0f64492024d36f045b901efb271674b801095c5a", + "7184c1701569e3a4c4d2ddce691edd983b81e42e09196d332e1ae2f1e062cff4", +} + +const NumNodes = 16 // must not exceed the number of keys (32) + +type TestData struct { + counter [NumNodes]int + mutex sync.RWMutex +} + +type TestNode struct { + shh *Whisper + id *ecdsa.PrivateKey + server *p2p.Server + filerId string +} + +var result TestData +var nodes [NumNodes]*TestNode +var sharedKey []byte = []byte("some arbitrary data here") +var sharedTopic TopicType = TopicType{0xF, 0x1, 0x2, 0} +var expectedMessage []byte = []byte("per rectum ad astra") + +// This test does the following: +// 1. creates a chain of whisper nodes, +// 2. installs the filters with shared (predefined) parameters, +// 3. each node sends a number of random (undecryptable) messages, +// 4. first node sends one expected (decryptable) message, +// 5. checks if each node have received and decrypted exactly one message. +func TestSimulation(t *testing.T) { + initialize(t) + + for i := 0; i < NumNodes; i++ { + sendMsg(t, false, i) + } + + sendMsg(t, true, 0) + checkPropagation(t) + stopServers() +} + +func initialize(t *testing.T) { + var err error + ip := net.IPv4(127, 0, 0, 1) + port0 := 30303 + + for i := 0; i < NumNodes; i++ { + var node TestNode + node.shh = New(&DefaultConfig) + node.shh.SetMinimumPoW(0.00000001) + node.shh.Start(nil) + topics := make([]TopicType, 0) + topics = append(topics, sharedTopic) + f := Filter{KeySym: sharedKey} + f.Topics = [][]byte{topics[0][:]} + node.filerId, err = node.shh.Subscribe(&f) + if err != nil { + t.Fatalf("failed to install the filter: %s.", err) + } + node.id, err = crypto.HexToECDSA(keys[i]) + if err != nil { + t.Fatalf("failed convert the key: %s.", keys[i]) + } + port := port0 + i + addr := fmt.Sprintf(":%d", port) // e.g. ":30303" + name := common.MakeName("whisper-go", "2.0") + var peers []*discover.Node + if i > 0 { + peerNodeId := nodes[i-1].id + peerPort := uint16(port - 1) + peerNode := discover.PubkeyID(&peerNodeId.PublicKey) + peer := discover.NewNode(peerNode, ip, peerPort, peerPort) + peers = append(peers, peer) + } + + node.server = &p2p.Server{ + Config: p2p.Config{ + PrivateKey: node.id, + MaxPeers: NumNodes/2 + 1, + Name: name, + Protocols: node.shh.Protocols(), + ListenAddr: addr, + NAT: nat.Any(), + BootstrapNodes: peers, + StaticNodes: peers, + TrustedNodes: peers, + }, + } + + err = node.server.Start() + if err != nil { + t.Fatalf("failed to start server %d.", i) + } + + nodes[i] = &node + } +} + +func stopServers() { + for i := 0; i < NumNodes; i++ { + n := nodes[i] + if n != nil { + n.shh.Unsubscribe(n.filerId) + n.shh.Stop() + n.server.Stop() + } + } +} + +func checkPropagation(t *testing.T) { + if t.Failed() { + return + } + + const cycle = 100 + const iterations = 100 + + for j := 0; j < iterations; j++ { + time.Sleep(cycle * time.Millisecond) + + for i := 0; i < NumNodes; i++ { + f := nodes[i].shh.GetFilter(nodes[i].filerId) + if f == nil { + t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerId, i) + } + + mail := f.Retrieve() + if !validateMail(t, i, mail) { + return + } + + if isTestComplete() { + return + } + } + } + + t.Fatalf("Test was not complete: timeout %d seconds.", iterations*cycle/1000) +} + +func validateMail(t *testing.T, index int, mail []*ReceivedMessage) bool { + var cnt int + for _, m := range mail { + if bytes.Equal(m.Payload, expectedMessage) { + cnt++ + } + } + + if cnt == 0 { + // no messages received yet: nothing is wrong + return true + } + if cnt > 1 { + t.Fatalf("node %d received %d.", index, cnt) + return false + } + + if cnt > 0 { + result.mutex.Lock() + defer result.mutex.Unlock() + result.counter[index] += cnt + if result.counter[index] > 1 { + t.Fatalf("node %d accumulated %d.", index, result.counter[index]) + } + } + return true +} + +func isTestComplete() bool { + result.mutex.RLock() + defer result.mutex.RUnlock() + + for i := 0; i < NumNodes; i++ { + if result.counter[i] < 1 { + return false + } + } + + for i := 0; i < NumNodes; i++ { + envelopes := nodes[i].shh.Envelopes() + if len(envelopes) < 2 { + return false + } + } + + return true +} + +func sendMsg(t *testing.T, expected bool, id int) { + if t.Failed() { + return + } + + opt := MessageParams{KeySym: sharedKey, Topic: sharedTopic, Payload: expectedMessage, PoW: 0.00000001, WorkTime: 1} + if !expected { + opt.KeySym[0]++ + opt.Topic[0]++ + opt.Payload = opt.Payload[1:] + } + + msg, err := NewSentMessage(&opt) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + envelope, err := msg.Wrap(&opt) + if err != nil { + t.Fatalf("failed to seal message: %s", err) + } + + err = nodes[id].shh.Send(envelope) + if err != nil { + t.Fatalf("failed to send message: %s", err) + } +} + +func TestPeerBasic(t *testing.T) { + InitSingleTest() + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d.", seed) + } + + params.PoW = 0.001 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d.", seed) + } + + p := newPeer(nil, nil, nil) + p.mark(env) + if !p.marked(env) { + t.Fatalf("failed mark with seed %d.", seed) + } +} diff --git a/whisper/whisperv6/topic.go b/whisper/whisperv6/topic.go new file mode 100644 index 0000000000..5ef7f69392 --- /dev/null +++ b/whisper/whisperv6/topic.go @@ -0,0 +1,55 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Contains the Whisper protocol Topic element. + +package whisperv6 + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +// Topic represents a cryptographically secure, probabilistic partial +// classifications of a message, determined as the first (left) 4 bytes of the +// SHA3 hash of some arbitrary data given by the original author of the message. +type TopicType [TopicLength]byte + +func BytesToTopic(b []byte) (t TopicType) { + sz := TopicLength + if x := len(b); x < TopicLength { + sz = x + } + for i := 0; i < sz; i++ { + t[i] = b[i] + } + return t +} + +// String converts a topic byte array to a string representation. +func (topic *TopicType) String() string { + return string(common.ToHex(topic[:])) +} + +// MarshalText returns the hex representation of t. +func (t TopicType) MarshalText() ([]byte, error) { + return hexutil.Bytes(t[:]).MarshalText() +} + +// UnmarshalText parses a hex representation to a topic. +func (t *TopicType) UnmarshalText(input []byte) error { + return hexutil.UnmarshalFixedText("Topic", input, t[:]) +} diff --git a/whisper/whisperv6/topic_test.go b/whisper/whisperv6/topic_test.go new file mode 100644 index 0000000000..454afe0de1 --- /dev/null +++ b/whisper/whisperv6/topic_test.go @@ -0,0 +1,134 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "encoding/json" + "testing" +) + +var topicStringTests = []struct { + topic TopicType + str string +}{ + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, str: "0x00000000"}, + {topic: TopicType{0x00, 0x7f, 0x80, 0xff}, str: "0x007f80ff"}, + {topic: TopicType{0xff, 0x80, 0x7f, 0x00}, str: "0xff807f00"}, + {topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, str: "0xf26e7779"}, +} + +func TestTopicString(t *testing.T) { + for i, tst := range topicStringTests { + s := tst.topic.String() + if s != tst.str { + t.Fatalf("failed test %d: have %s, want %s.", i, s, tst.str) + } + } +} + +var bytesToTopicTests = []struct { + data []byte + topic TopicType +}{ + {topic: TopicType{0x8f, 0x9a, 0x2b, 0x7d}, data: []byte{0x8f, 0x9a, 0x2b, 0x7d}}, + {topic: TopicType{0x00, 0x7f, 0x80, 0xff}, data: []byte{0x00, 0x7f, 0x80, 0xff}}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte{0x00, 0x00, 0x00, 0x00}}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte{0x00, 0x00, 0x00}}, + {topic: TopicType{0x01, 0x00, 0x00, 0x00}, data: []byte{0x01}}, + {topic: TopicType{0x00, 0xfe, 0x00, 0x00}, data: []byte{0x00, 0xfe}}, + {topic: TopicType{0xea, 0x1d, 0x43, 0x00}, data: []byte{0xea, 0x1d, 0x43}}, + {topic: TopicType{0x6f, 0x3c, 0xb0, 0xdd}, data: []byte{0x6f, 0x3c, 0xb0, 0xdd, 0x0f, 0x00, 0x90}}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte{}}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: nil}, +} + +var unmarshalTestsGood = []struct { + topic TopicType + data []byte +}{ + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x00000000"`)}, + {topic: TopicType{0x00, 0x7f, 0x80, 0xff}, data: []byte(`"0x007f80ff"`)}, + {topic: TopicType{0xff, 0x80, 0x7f, 0x00}, data: []byte(`"0xff807f00"`)}, + {topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, data: []byte(`"0xf26e7779"`)}, +} + +var unmarshalTestsBad = []struct { + topic TopicType + data []byte +}{ + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x0000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x000000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x0000000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"000000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0000000000"`)}, + {topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"abcdefg0"`)}, +} + +var unmarshalTestsUgly = []struct { + topic TopicType + data []byte +}{ + {topic: TopicType{0x01, 0x00, 0x00, 0x00}, data: []byte(`"0x00000001"`)}, +} + +func TestBytesToTopic(t *testing.T) { + for i, tst := range bytesToTopicTests { + top := BytesToTopic(tst.data) + if top != tst.topic { + t.Fatalf("failed test %d: have %v, want %v.", i, t, tst.topic) + } + } +} + +func TestUnmarshalTestsGood(t *testing.T) { + for i, tst := range unmarshalTestsGood { + var top TopicType + err := json.Unmarshal(tst.data, &top) + if err != nil { + t.Errorf("failed test %d. input: %v. err: %v", i, tst.data, err) + } else if top != tst.topic { + t.Errorf("failed test %d: have %v, want %v.", i, t, tst.topic) + } + } +} + +func TestUnmarshalTestsBad(t *testing.T) { + // in this test UnmarshalJSON() is supposed to fail + for i, tst := range unmarshalTestsBad { + var top TopicType + err := json.Unmarshal(tst.data, &top) + if err == nil { + t.Fatalf("failed test %d. input: %v.", i, tst.data) + } + } +} + +func TestUnmarshalTestsUgly(t *testing.T) { + // in this test UnmarshalJSON() is NOT supposed to fail, but result should be wrong + for i, tst := range unmarshalTestsUgly { + var top TopicType + err := json.Unmarshal(tst.data, &top) + if err != nil { + t.Errorf("failed test %d. input: %v.", i, tst.data) + } else if top == tst.topic { + t.Errorf("failed test %d: have %v, want %v.", i, top, tst.topic) + } + } +} diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go new file mode 100644 index 0000000000..553ac3f000 --- /dev/null +++ b/whisper/whisperv6/whisper.go @@ -0,0 +1,858 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "bytes" + "crypto/ecdsa" + crand "crypto/rand" + "crypto/sha256" + "fmt" + "runtime" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/syndtr/goleveldb/leveldb/errors" + "golang.org/x/crypto/pbkdf2" + "golang.org/x/sync/syncmap" + set "gopkg.in/fatih/set.v0" +) + +type Statistics struct { + messagesCleared int + memoryCleared int + memoryUsed int + cycles int + totalMessagesCleared int +} + +const ( + minPowIdx = iota // Minimal PoW required by the whisper node + maxMsgSizeIdx = iota // Maximal message length allowed by the whisper node + overflowIdx = iota // Indicator of message queue overflow +) + +// Whisper represents a dark communication interface through the Ethereum +// network, using its very own P2P communication layer. +type Whisper struct { + protocol p2p.Protocol // Protocol description and parameters + filters *Filters // Message filters installed with Subscribe function + + privateKeys map[string]*ecdsa.PrivateKey // Private key storage + symKeys map[string][]byte // Symmetric key storage + keyMu sync.RWMutex // Mutex associated with key storages + + poolMu sync.RWMutex // Mutex to sync the message and expiration pools + envelopes map[common.Hash]*Envelope // Pool of envelopes currently tracked by this node + expirations map[uint32]*set.SetNonTS // Message expiration pool + + peerMu sync.RWMutex // Mutex to sync the active peer set + peers map[*Peer]struct{} // Set of currently active peers + + messageQueue chan *Envelope // Message queue for normal whisper messages + p2pMsgQueue chan *Envelope // Message queue for peer-to-peer messages (not to be forwarded any further) + quit chan struct{} // Channel used for graceful exit + + settings syncmap.Map // holds configuration settings that can be dynamically changed + + statsMu sync.Mutex // guard stats + stats Statistics // Statistics of whisper node + + mailServer MailServer // MailServer interface +} + +// New creates a Whisper client ready to communicate through the Ethereum P2P network. +func New(cfg *Config) *Whisper { + if cfg == nil { + cfg = &DefaultConfig + } + + whisper := &Whisper{ + privateKeys: make(map[string]*ecdsa.PrivateKey), + symKeys: make(map[string][]byte), + envelopes: make(map[common.Hash]*Envelope), + expirations: make(map[uint32]*set.SetNonTS), + peers: make(map[*Peer]struct{}), + messageQueue: make(chan *Envelope, messageQueueLimit), + p2pMsgQueue: make(chan *Envelope, messageQueueLimit), + quit: make(chan struct{}), + } + + whisper.filters = NewFilters(whisper) + + whisper.settings.Store(minPowIdx, cfg.MinimumAcceptedPOW) + whisper.settings.Store(maxMsgSizeIdx, cfg.MaxMessageSize) + whisper.settings.Store(overflowIdx, false) + + // p2p whisper sub protocol handler + whisper.protocol = p2p.Protocol{ + Name: ProtocolName, + Version: uint(ProtocolVersion), + Length: NumberOfMessageCodes, + Run: whisper.HandlePeer, + NodeInfo: func() interface{} { + return map[string]interface{}{ + "version": ProtocolVersionStr, + "maxMessageSize": whisper.MaxMessageSize(), + "minimumPoW": whisper.MinPow(), + } + }, + } + + return whisper +} + +func (w *Whisper) MinPow() float64 { + val, _ := w.settings.Load(minPowIdx) + return val.(float64) +} + +// MaxMessageSize returns the maximum accepted message size. +func (w *Whisper) MaxMessageSize() uint32 { + val, _ := w.settings.Load(maxMsgSizeIdx) + return val.(uint32) +} + +// Overflow returns an indication if the message queue is full. +func (w *Whisper) Overflow() bool { + val, _ := w.settings.Load(overflowIdx) + return val.(bool) +} + +// APIs returns the RPC descriptors the Whisper implementation offers +func (w *Whisper) APIs() []rpc.API { + return []rpc.API{ + { + Namespace: ProtocolName, + Version: ProtocolVersionStr, + Service: NewPublicWhisperAPI(w), + Public: true, + }, + } +} + +// RegisterServer registers MailServer interface. +// MailServer will process all the incoming messages with p2pRequestCode. +func (w *Whisper) RegisterServer(server MailServer) { + w.mailServer = server +} + +// Protocols returns the whisper sub-protocols ran by this particular client. +func (w *Whisper) Protocols() []p2p.Protocol { + return []p2p.Protocol{w.protocol} +} + +// Version returns the whisper sub-protocols version number. +func (w *Whisper) Version() uint { + return w.protocol.Version +} + +// SetMaxMessageSize sets the maximal message size allowed by this node +func (w *Whisper) SetMaxMessageSize(size uint32) error { + if size > MaxMessageSize { + return fmt.Errorf("message size too large [%d>%d]", size, MaxMessageSize) + } + w.settings.Store(maxMsgSizeIdx, uint32(size)) + return nil +} + +// SetMinimumPoW sets the minimal PoW required by this node +func (w *Whisper) SetMinimumPoW(val float64) error { + if val <= 0.0 { + return fmt.Errorf("invalid PoW: %f", val) + } + w.settings.Store(minPowIdx, val) + return nil +} + +// getPeer retrieves peer by ID +func (w *Whisper) getPeer(peerID []byte) (*Peer, error) { + w.peerMu.Lock() + defer w.peerMu.Unlock() + for p := range w.peers { + id := p.peer.ID() + if bytes.Equal(peerID, id[:]) { + return p, nil + } + } + return nil, fmt.Errorf("Could not find peer with ID: %x", peerID) +} + +// AllowP2PMessagesFromPeer marks specific peer trusted, +// which will allow it to send historic (expired) messages. +func (w *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error { + p, err := w.getPeer(peerID) + if err != nil { + return err + } + p.trusted = true + return nil +} + +// RequestHistoricMessages sends a message with p2pRequestCode to a specific peer, +// which is known to implement MailServer interface, and is supposed to process this +// request and respond with a number of peer-to-peer messages (possibly expired), +// which are not supposed to be forwarded any further. +// The whisper protocol is agnostic of the format and contents of envelope. +func (w *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) error { + p, err := w.getPeer(peerID) + if err != nil { + return err + } + p.trusted = true + return p2p.Send(p.ws, p2pRequestCode, envelope) +} + +// SendP2PMessage sends a peer-to-peer message to a specific peer. +func (w *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error { + p, err := w.getPeer(peerID) + if err != nil { + return err + } + return w.SendP2PDirect(p, envelope) +} + +// SendP2PDirect sends a peer-to-peer message to a specific peer. +func (w *Whisper) SendP2PDirect(peer *Peer, envelope *Envelope) error { + return p2p.Send(peer.ws, p2pCode, envelope) +} + +// NewKeyPair generates a new cryptographic identity for the client, and injects +// it into the known identities for message decryption. Returns ID of the new key pair. +func (w *Whisper) NewKeyPair() (string, error) { + key, err := crypto.GenerateKey() + if err != nil || !validatePrivateKey(key) { + key, err = crypto.GenerateKey() // retry once + } + if err != nil { + return "", err + } + if !validatePrivateKey(key) { + return "", fmt.Errorf("failed to generate valid key") + } + + id, err := GenerateRandomID() + if err != nil { + return "", fmt.Errorf("failed to generate ID: %s", err) + } + + w.keyMu.Lock() + defer w.keyMu.Unlock() + + if w.privateKeys[id] != nil { + return "", fmt.Errorf("failed to generate unique ID") + } + w.privateKeys[id] = key + return id, nil +} + +// DeleteKeyPair deletes the specified key if it exists. +func (w *Whisper) DeleteKeyPair(key string) bool { + w.keyMu.Lock() + defer w.keyMu.Unlock() + + if w.privateKeys[key] != nil { + delete(w.privateKeys, key) + return true + } + return false +} + +// AddKeyPair imports a asymmetric private key and returns it identifier. +func (w *Whisper) AddKeyPair(key *ecdsa.PrivateKey) (string, error) { + id, err := GenerateRandomID() + if err != nil { + return "", fmt.Errorf("failed to generate ID: %s", err) + } + + w.keyMu.Lock() + w.privateKeys[id] = key + w.keyMu.Unlock() + + return id, nil +} + +// HasKeyPair checks if the the whisper node is configured with the private key +// of the specified public pair. +func (w *Whisper) HasKeyPair(id string) bool { + w.keyMu.RLock() + defer w.keyMu.RUnlock() + return w.privateKeys[id] != nil +} + +// GetPrivateKey retrieves the private key of the specified identity. +func (w *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) { + w.keyMu.RLock() + defer w.keyMu.RUnlock() + key := w.privateKeys[id] + if key == nil { + return nil, fmt.Errorf("invalid id") + } + return key, nil +} + +// GenerateSymKey generates a random symmetric key and stores it under id, +// which is then returned. Will be used in the future for session key exchange. +func (w *Whisper) GenerateSymKey() (string, error) { + key := make([]byte, aesKeyLength) + _, err := crand.Read(key) + if err != nil { + return "", err + } else if !validateSymmetricKey(key) { + return "", fmt.Errorf("error in GenerateSymKey: crypto/rand failed to generate random data") + } + + id, err := GenerateRandomID() + if err != nil { + return "", fmt.Errorf("failed to generate ID: %s", err) + } + + w.keyMu.Lock() + defer w.keyMu.Unlock() + + if w.symKeys[id] != nil { + return "", fmt.Errorf("failed to generate unique ID") + } + w.symKeys[id] = key + return id, nil +} + +// AddSymKeyDirect stores the key, and returns its id. +func (w *Whisper) AddSymKeyDirect(key []byte) (string, error) { + if len(key) != aesKeyLength { + return "", fmt.Errorf("wrong key size: %d", len(key)) + } + + id, err := GenerateRandomID() + if err != nil { + return "", fmt.Errorf("failed to generate ID: %s", err) + } + + w.keyMu.Lock() + defer w.keyMu.Unlock() + + if w.symKeys[id] != nil { + return "", fmt.Errorf("failed to generate unique ID") + } + w.symKeys[id] = key + return id, nil +} + +// AddSymKeyFromPassword generates the key from password, stores it, and returns its id. +func (w *Whisper) AddSymKeyFromPassword(password string) (string, error) { + id, err := GenerateRandomID() + if err != nil { + return "", fmt.Errorf("failed to generate ID: %s", err) + } + if w.HasSymKey(id) { + return "", fmt.Errorf("failed to generate unique ID") + } + + derived, err := deriveKeyMaterial([]byte(password), EnvelopeVersion) + if err != nil { + return "", err + } + + w.keyMu.Lock() + defer w.keyMu.Unlock() + + // double check is necessary, because deriveKeyMaterial() is very slow + if w.symKeys[id] != nil { + return "", fmt.Errorf("critical error: failed to generate unique ID") + } + w.symKeys[id] = derived + return id, nil +} + +// HasSymKey returns true if there is a key associated with the given id. +// Otherwise returns false. +func (w *Whisper) HasSymKey(id string) bool { + w.keyMu.RLock() + defer w.keyMu.RUnlock() + return w.symKeys[id] != nil +} + +// DeleteSymKey deletes the key associated with the name string if it exists. +func (w *Whisper) DeleteSymKey(id string) bool { + w.keyMu.Lock() + defer w.keyMu.Unlock() + if w.symKeys[id] != nil { + delete(w.symKeys, id) + return true + } + return false +} + +// GetSymKey returns the symmetric key associated with the given id. +func (w *Whisper) GetSymKey(id string) ([]byte, error) { + w.keyMu.RLock() + defer w.keyMu.RUnlock() + if w.symKeys[id] != nil { + return w.symKeys[id], nil + } + return nil, fmt.Errorf("non-existent key ID") +} + +// Subscribe installs a new message handler used for filtering, decrypting +// and subsequent storing of incoming messages. +func (w *Whisper) Subscribe(f *Filter) (string, error) { + return w.filters.Install(f) +} + +// GetFilter returns the filter by id. +func (w *Whisper) GetFilter(id string) *Filter { + return w.filters.Get(id) +} + +// Unsubscribe removes an installed message handler. +func (w *Whisper) Unsubscribe(id string) error { + ok := w.filters.Uninstall(id) + if !ok { + return fmt.Errorf("Unsubscribe: Invalid ID") + } + return nil +} + +// Send injects a message into the whisper send queue, to be distributed in the +// network in the coming cycles. +func (w *Whisper) Send(envelope *Envelope) error { + ok, err := w.add(envelope) + if err != nil { + return err + } + if !ok { + return fmt.Errorf("failed to add envelope") + } + return err +} + +// Start implements node.Service, starting the background data propagation thread +// of the Whisper protocol. +func (w *Whisper) Start(*p2p.Server) error { + log.Info("started whisper v." + ProtocolVersionStr) + go w.update() + + numCPU := runtime.NumCPU() + for i := 0; i < numCPU; i++ { + go w.processQueue() + } + + return nil +} + +// Stop implements node.Service, stopping the background data propagation thread +// of the Whisper protocol. +func (w *Whisper) Stop() error { + close(w.quit) + log.Info("whisper stopped") + return nil +} + +// HandlePeer is called by the underlying P2P layer when the whisper sub-protocol +// connection is negotiated. +func (wh *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error { + // Create the new peer and start tracking it + whisperPeer := newPeer(wh, peer, rw) + + wh.peerMu.Lock() + wh.peers[whisperPeer] = struct{}{} + wh.peerMu.Unlock() + + defer func() { + wh.peerMu.Lock() + delete(wh.peers, whisperPeer) + wh.peerMu.Unlock() + }() + + // Run the peer handshake and state updates + if err := whisperPeer.handshake(); err != nil { + return err + } + whisperPeer.start() + defer whisperPeer.stop() + + return wh.runMessageLoop(whisperPeer, rw) +} + +// runMessageLoop reads and processes inbound messages directly to merge into client-global state. +func (wh *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error { + for { + // fetch the next packet + packet, err := rw.ReadMsg() + if err != nil { + log.Warn("message loop", "peer", p.peer.ID(), "err", err) + return err + } + if packet.Size > wh.MaxMessageSize() { + log.Warn("oversized message received", "peer", p.peer.ID()) + return errors.New("oversized message received") + } + + switch packet.Code { + case statusCode: + // this should not happen, but no need to panic; just ignore this message. + log.Warn("unxepected status message received", "peer", p.peer.ID()) + case messagesCode: + // decode the contained envelopes + var envelope Envelope + if err := packet.Decode(&envelope); err != nil { + log.Warn("failed to decode envelope, peer will be disconnected", "peer", p.peer.ID(), "err", err) + return errors.New("invalid envelope") + } + cached, err := wh.add(&envelope) + if err != nil { + log.Warn("bad envelope received, peer will be disconnected", "peer", p.peer.ID(), "err", err) + return errors.New("invalid envelope") + } + if cached { + p.mark(&envelope) + } + case p2pCode: + // peer-to-peer message, sent directly to peer bypassing PoW checks, etc. + // this message is not supposed to be forwarded to other peers, and + // therefore might not satisfy the PoW, expiry and other requirements. + // these messages are only accepted from the trusted peer. + if p.trusted { + var envelope Envelope + if err := packet.Decode(&envelope); err != nil { + log.Warn("failed to decode direct message, peer will be disconnected", "peer", p.peer.ID(), "err", err) + return errors.New("invalid direct message") + } + wh.postEvent(&envelope, true) + } + case p2pRequestCode: + // Must be processed if mail server is implemented. Otherwise ignore. + if wh.mailServer != nil { + var request Envelope + if err := packet.Decode(&request); err != nil { + log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err) + return errors.New("invalid p2p request") + } + wh.mailServer.DeliverMail(p, &request) + } + default: + // New message types might be implemented in the future versions of Whisper. + // For forward compatibility, just ignore. + } + + packet.Discard() + } +} + +// add inserts a new envelope into the message pool to be distributed within the +// whisper network. It also inserts the envelope into the expiration pool at the +// appropriate time-stamp. In case of error, connection should be dropped. +func (wh *Whisper) add(envelope *Envelope) (bool, error) { + now := uint32(time.Now().Unix()) + sent := envelope.Expiry - envelope.TTL + + if sent > now { + if sent-SynchAllowance > now { + return false, fmt.Errorf("envelope created in the future [%x]", envelope.Hash()) + } else { + // recalculate PoW, adjusted for the time difference, plus one second for latency + envelope.calculatePoW(sent - now + 1) + } + } + + if envelope.Expiry < now { + if envelope.Expiry+SynchAllowance*2 < now { + return false, fmt.Errorf("very old message") + } else { + log.Debug("expired envelope dropped", "hash", envelope.Hash().Hex()) + return false, nil // drop envelope without error + } + } + + if uint32(envelope.size()) > wh.MaxMessageSize() { + return false, fmt.Errorf("huge messages are not allowed [%x]", envelope.Hash()) + } + + if len(envelope.Version) > 4 { + return false, fmt.Errorf("oversized version [%x]", envelope.Hash()) + } + + aesNonceSize := len(envelope.AESNonce) + if aesNonceSize != 0 && aesNonceSize != AESNonceLength { + // the standard AES GCM nonce size is 12 bytes, + // but constant gcmStandardNonceSize cannot be accessed (not exported) + return false, fmt.Errorf("wrong size of AESNonce: %d bytes [env: %x]", aesNonceSize, envelope.Hash()) + } + + if envelope.PoW() < wh.MinPow() { + log.Debug("envelope with low PoW dropped", "PoW", envelope.PoW(), "hash", envelope.Hash().Hex()) + return false, nil // drop envelope without error + } + + hash := envelope.Hash() + + wh.poolMu.Lock() + _, alreadyCached := wh.envelopes[hash] + if !alreadyCached { + wh.envelopes[hash] = envelope + if wh.expirations[envelope.Expiry] == nil { + wh.expirations[envelope.Expiry] = set.NewNonTS() + } + if !wh.expirations[envelope.Expiry].Has(hash) { + wh.expirations[envelope.Expiry].Add(hash) + } + } + wh.poolMu.Unlock() + + if alreadyCached { + log.Trace("whisper envelope already cached", "hash", envelope.Hash().Hex()) + } else { + log.Trace("cached whisper envelope", "hash", envelope.Hash().Hex()) + wh.statsMu.Lock() + wh.stats.memoryUsed += envelope.size() + wh.statsMu.Unlock() + wh.postEvent(envelope, false) // notify the local node about the new message + if wh.mailServer != nil { + wh.mailServer.Archive(envelope) + } + } + return true, nil +} + +// postEvent queues the message for further processing. +func (w *Whisper) postEvent(envelope *Envelope, isP2P bool) { + // if the version of incoming message is higher than + // currently supported version, we can not decrypt it, + // and therefore just ignore this message + if envelope.Ver() <= EnvelopeVersion { + if isP2P { + w.p2pMsgQueue <- envelope + } else { + w.checkOverflow() + w.messageQueue <- envelope + } + } +} + +// checkOverflow checks if message queue overflow occurs and reports it if necessary. +func (w *Whisper) checkOverflow() { + queueSize := len(w.messageQueue) + + if queueSize == messageQueueLimit { + if !w.Overflow() { + w.settings.Store(overflowIdx, true) + log.Warn("message queue overflow") + } + } else if queueSize <= messageQueueLimit/2 { + if w.Overflow() { + w.settings.Store(overflowIdx, false) + log.Warn("message queue overflow fixed (back to normal)") + } + } +} + +// processQueue delivers the messages to the watchers during the lifetime of the whisper node. +func (w *Whisper) processQueue() { + var e *Envelope + for { + select { + case <-w.quit: + return + + case e = <-w.messageQueue: + w.filters.NotifyWatchers(e, false) + + case e = <-w.p2pMsgQueue: + w.filters.NotifyWatchers(e, true) + } + } +} + +// update loops until the lifetime of the whisper node, updating its internal +// state by expiring stale messages from the pool. +func (w *Whisper) update() { + // Start a ticker to check for expirations + expire := time.NewTicker(expirationCycle) + + // Repeat updates until termination is requested + for { + select { + case <-expire.C: + w.expire() + + case <-w.quit: + return + } + } +} + +// expire iterates over all the expiration timestamps, removing all stale +// messages from the pools. +func (w *Whisper) expire() { + w.poolMu.Lock() + defer w.poolMu.Unlock() + + w.statsMu.Lock() + defer w.statsMu.Unlock() + w.stats.reset() + now := uint32(time.Now().Unix()) + for expiry, hashSet := range w.expirations { + if expiry < now { + // Dump all expired messages and remove timestamp + hashSet.Each(func(v interface{}) bool { + sz := w.envelopes[v.(common.Hash)].size() + delete(w.envelopes, v.(common.Hash)) + w.stats.messagesCleared++ + w.stats.memoryCleared += sz + w.stats.memoryUsed -= sz + return true + }) + w.expirations[expiry].Clear() + delete(w.expirations, expiry) + } + } +} + +// Stats returns the whisper node statistics. +func (w *Whisper) Stats() Statistics { + w.statsMu.Lock() + defer w.statsMu.Unlock() + + return w.stats +} + +// Envelopes retrieves all the messages currently pooled by the node. +func (w *Whisper) Envelopes() []*Envelope { + w.poolMu.RLock() + defer w.poolMu.RUnlock() + + all := make([]*Envelope, 0, len(w.envelopes)) + for _, envelope := range w.envelopes { + all = append(all, envelope) + } + return all +} + +// Messages iterates through all currently floating envelopes +// and retrieves all the messages, that this filter could decrypt. +func (w *Whisper) Messages(id string) []*ReceivedMessage { + result := make([]*ReceivedMessage, 0) + w.poolMu.RLock() + defer w.poolMu.RUnlock() + + if filter := w.filters.Get(id); filter != nil { + for _, env := range w.envelopes { + msg := filter.processEnvelope(env) + if msg != nil { + result = append(result, msg) + } + } + } + return result +} + +// isEnvelopeCached checks if envelope with specific hash has already been received and cached. +func (w *Whisper) isEnvelopeCached(hash common.Hash) bool { + w.poolMu.Lock() + defer w.poolMu.Unlock() + + _, exist := w.envelopes[hash] + return exist +} + +// reset resets the node's statistics after each expiry cycle. +func (s *Statistics) reset() { + s.cycles++ + s.totalMessagesCleared += s.messagesCleared + + s.memoryCleared = 0 + s.messagesCleared = 0 +} + +// ValidatePublicKey checks the format of the given public key. +func ValidatePublicKey(k *ecdsa.PublicKey) bool { + return k != nil && k.X != nil && k.Y != nil && k.X.Sign() != 0 && k.Y.Sign() != 0 +} + +// validatePrivateKey checks the format of the given private key. +func validatePrivateKey(k *ecdsa.PrivateKey) bool { + if k == nil || k.D == nil || k.D.Sign() == 0 { + return false + } + return ValidatePublicKey(&k.PublicKey) +} + +// validateSymmetricKey returns false if the key contains all zeros +func validateSymmetricKey(k []byte) bool { + return len(k) > 0 && !containsOnlyZeros(k) +} + +// containsOnlyZeros checks if the data contain only zeros. +func containsOnlyZeros(data []byte) bool { + for _, b := range data { + if b != 0 { + return false + } + } + return true +} + +// bytesToUintLittleEndian converts the slice to 64-bit unsigned integer. +func bytesToUintLittleEndian(b []byte) (res uint64) { + mul := uint64(1) + for i := 0; i < len(b); i++ { + res += uint64(b[i]) * mul + mul *= 256 + } + return res +} + +// BytesToUintBigEndian converts the slice to 64-bit unsigned integer. +func BytesToUintBigEndian(b []byte) (res uint64) { + for i := 0; i < len(b); i++ { + res *= 256 + res += uint64(b[i]) + } + return res +} + +// deriveKeyMaterial derives symmetric key material from the key or password. +// pbkdf2 is used for security, in case people use password instead of randomly generated keys. +func deriveKeyMaterial(key []byte, version uint64) (derivedKey []byte, err error) { + if version == 0 { + // kdf should run no less than 0.1 seconds on average compute, + // because it's a once in a session experience + derivedKey := pbkdf2.Key(key, nil, 65356, aesKeyLength, sha256.New) + return derivedKey, nil + } else { + return nil, unknownVersionError(version) + } +} + +// GenerateRandomID generates a random string, which is then returned to be used as a key id +func GenerateRandomID() (id string, err error) { + buf := make([]byte, keyIdSize) + _, err = crand.Read(buf) + if err != nil { + return "", err + } + if !validateSymmetricKey(buf) { + return "", fmt.Errorf("error in generateRandomID: crypto/rand failed to generate random data") + } + id = common.Bytes2Hex(buf) + return id, err +} diff --git a/whisper/whisperv6/whisper_test.go b/whisper/whisperv6/whisper_test.go new file mode 100644 index 0000000000..c7cea40146 --- /dev/null +++ b/whisper/whisperv6/whisper_test.go @@ -0,0 +1,851 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package whisperv6 + +import ( + "bytes" + "crypto/ecdsa" + mrand "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" +) + +func TestWhisperBasic(t *testing.T) { + w := New(&DefaultConfig) + p := w.Protocols() + shh := p[0] + if shh.Name != ProtocolName { + t.Fatalf("failed Protocol Name: %v.", shh.Name) + } + if uint64(shh.Version) != ProtocolVersion { + t.Fatalf("failed Protocol Version: %v.", shh.Version) + } + if shh.Length != NumberOfMessageCodes { + t.Fatalf("failed Protocol Length: %v.", shh.Length) + } + if shh.Run == nil { + t.Fatalf("failed shh.Run.") + } + if uint64(w.Version()) != ProtocolVersion { + t.Fatalf("failed whisper Version: %v.", shh.Version) + } + if w.GetFilter("non-existent") != nil { + t.Fatalf("failed GetFilter.") + } + + peerID := make([]byte, 64) + mrand.Read(peerID) + peer, _ := w.getPeer(peerID) + if peer != nil { + t.Fatal("found peer for random key.") + } + if err := w.AllowP2PMessagesFromPeer(peerID); err == nil { + t.Fatalf("failed MarkPeerTrusted.") + } + exist := w.HasSymKey("non-existing") + if exist { + t.Fatalf("failed HasSymKey.") + } + key, err := w.GetSymKey("non-existing") + if err == nil { + t.Fatalf("failed GetSymKey(non-existing): false positive.") + } + if key != nil { + t.Fatalf("failed GetSymKey: false positive.") + } + mail := w.Envelopes() + if len(mail) != 0 { + t.Fatalf("failed w.Envelopes().") + } + m := w.Messages("non-existent") + if len(m) != 0 { + t.Fatalf("failed w.Messages.") + } + + var derived []byte + ver := uint64(0xDEADBEEF) + if _, err := deriveKeyMaterial(peerID, ver); err != unknownVersionError(ver) { + t.Fatalf("failed deriveKeyMaterial with param = %v: %s.", peerID, err) + } + derived, err = deriveKeyMaterial(peerID, 0) + if err != nil { + t.Fatalf("failed second deriveKeyMaterial with param = %v: %s.", peerID, err) + } + if !validateSymmetricKey(derived) { + t.Fatalf("failed validateSymmetricKey with param = %v.", derived) + } + if containsOnlyZeros(derived) { + t.Fatalf("failed containsOnlyZeros with param = %v.", derived) + } + + buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0} + le := bytesToUintLittleEndian(buf) + be := BytesToUintBigEndian(buf) + if le != uint64(0x280e5ff) { + t.Fatalf("failed bytesToIntLittleEndian: %d.", le) + } + if be != uint64(0xffe5800200) { + t.Fatalf("failed BytesToIntBigEndian: %d.", be) + } + + id, err := w.NewKeyPair() + if err != nil { + t.Fatalf("failed to generate new key pair: %s.", err) + } + pk, err := w.GetPrivateKey(id) + if err != nil { + t.Fatalf("failed to retrieve new key pair: %s.", err) + } + if !validatePrivateKey(pk) { + t.Fatalf("failed validatePrivateKey: %v.", pk) + } + if !ValidatePublicKey(&pk.PublicKey) { + t.Fatalf("failed ValidatePublicKey: %v.", pk) + } +} + +func TestWhisperAsymmetricKeyImport(t *testing.T) { + var ( + w = New(&DefaultConfig) + privateKeys []*ecdsa.PrivateKey + ) + + for i := 0; i < 50; i++ { + id, err := w.NewKeyPair() + if err != nil { + t.Fatalf("could not generate key: %v", err) + } + + pk, err := w.GetPrivateKey(id) + if err != nil { + t.Fatalf("could not export private key: %v", err) + } + + privateKeys = append(privateKeys, pk) + + if !w.DeleteKeyPair(id) { + t.Fatalf("could not delete private key") + } + } + + for _, pk := range privateKeys { + if _, err := w.AddKeyPair(pk); err != nil { + t.Fatalf("could not import private key: %v", err) + } + } +} + +func TestWhisperIdentityManagement(t *testing.T) { + w := New(&DefaultConfig) + id1, err := w.NewKeyPair() + if err != nil { + t.Fatalf("failed to generate new key pair: %s.", err) + } + id2, err := w.NewKeyPair() + if err != nil { + t.Fatalf("failed to generate new key pair: %s.", err) + } + pk1, err := w.GetPrivateKey(id1) + if err != nil { + t.Fatalf("failed to retrieve the key pair: %s.", err) + } + pk2, err := w.GetPrivateKey(id2) + if err != nil { + t.Fatalf("failed to retrieve the key pair: %s.", err) + } + + if !w.HasKeyPair(id1) { + t.Fatalf("failed HasIdentity(pk1).") + } + if !w.HasKeyPair(id2) { + t.Fatalf("failed HasIdentity(pk2).") + } + if pk1 == nil { + t.Fatalf("failed GetIdentity(pk1).") + } + if pk2 == nil { + t.Fatalf("failed GetIdentity(pk2).") + } + + if !validatePrivateKey(pk1) { + t.Fatalf("pk1 is invalid.") + } + if !validatePrivateKey(pk2) { + t.Fatalf("pk2 is invalid.") + } + + // Delete one identity + done := w.DeleteKeyPair(id1) + if !done { + t.Fatalf("failed to delete id1.") + } + pk1, err = w.GetPrivateKey(id1) + if err == nil { + t.Fatalf("retrieve the key pair: false positive.") + } + pk2, err = w.GetPrivateKey(id2) + if err != nil { + t.Fatalf("failed to retrieve the key pair: %s.", err) + } + if w.HasKeyPair(id1) { + t.Fatalf("failed DeleteIdentity(pub1): still exist.") + } + if !w.HasKeyPair(id2) { + t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.") + } + if pk1 != nil { + t.Fatalf("failed DeleteIdentity(pub1): first key still exist.") + } + if pk2 == nil { + t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.") + } + + // Delete again non-existing identity + done = w.DeleteKeyPair(id1) + if done { + t.Fatalf("delete id1: false positive.") + } + pk1, err = w.GetPrivateKey(id1) + if err == nil { + t.Fatalf("retrieve the key pair: false positive.") + } + pk2, err = w.GetPrivateKey(id2) + if err != nil { + t.Fatalf("failed to retrieve the key pair: %s.", err) + } + if w.HasKeyPair(id1) { + t.Fatalf("failed delete non-existing identity: exist.") + } + if !w.HasKeyPair(id2) { + t.Fatalf("failed delete non-existing identity: pub2 does not exist.") + } + if pk1 != nil { + t.Fatalf("failed delete non-existing identity: first key exist.") + } + if pk2 == nil { + t.Fatalf("failed delete non-existing identity: second key does not exist.") + } + + // Delete second identity + done = w.DeleteKeyPair(id2) + if !done { + t.Fatalf("failed to delete id2.") + } + pk1, err = w.GetPrivateKey(id1) + if err == nil { + t.Fatalf("retrieve the key pair: false positive.") + } + pk2, err = w.GetPrivateKey(id2) + if err == nil { + t.Fatalf("retrieve the key pair: false positive.") + } + if w.HasKeyPair(id1) { + t.Fatalf("failed delete second identity: first identity exist.") + } + if w.HasKeyPair(id2) { + t.Fatalf("failed delete second identity: still exist.") + } + if pk1 != nil { + t.Fatalf("failed delete second identity: first key exist.") + } + if pk2 != nil { + t.Fatalf("failed delete second identity: second key exist.") + } +} + +func TestWhisperSymKeyManagement(t *testing.T) { + InitSingleTest() + + var err error + var k1, k2 []byte + w := New(&DefaultConfig) + id1 := string("arbitrary-string-1") + id2 := string("arbitrary-string-2") + + id1, err = w.GenerateSymKey() + if err != nil { + t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err) + } + + k1, err = w.GetSymKey(id1) + if err != nil { + t.Fatalf("failed GetSymKey(id1).") + } + k2, err = w.GetSymKey(id2) + if err == nil { + t.Fatalf("failed GetSymKey(id2): false positive.") + } + if !w.HasSymKey(id1) { + t.Fatalf("failed HasSymKey(id1).") + } + if w.HasSymKey(id2) { + t.Fatalf("failed HasSymKey(id2): false positive.") + } + if k1 == nil { + t.Fatalf("first key does not exist.") + } + if k2 != nil { + t.Fatalf("second key still exist.") + } + + // add existing id, nothing should change + randomKey := make([]byte, aesKeyLength) + mrand.Read(randomKey) + id1, err = w.AddSymKeyDirect(randomKey) + if err != nil { + t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err) + } + + k1, err = w.GetSymKey(id1) + if err != nil { + t.Fatalf("failed w.GetSymKey(id1).") + } + k2, err = w.GetSymKey(id2) + if err == nil { + t.Fatalf("failed w.GetSymKey(id2): false positive.") + } + if !w.HasSymKey(id1) { + t.Fatalf("failed w.HasSymKey(id1).") + } + if w.HasSymKey(id2) { + t.Fatalf("failed w.HasSymKey(id2): false positive.") + } + if k1 == nil { + t.Fatalf("first key does not exist.") + } + if !bytes.Equal(k1, randomKey) { + t.Fatalf("k1 != randomKey.") + } + if k2 != nil { + t.Fatalf("second key already exist.") + } + + id2, err = w.AddSymKeyDirect(randomKey) + if err != nil { + t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err) + } + k1, err = w.GetSymKey(id1) + if err != nil { + t.Fatalf("failed w.GetSymKey(id1).") + } + k2, err = w.GetSymKey(id2) + if err != nil { + t.Fatalf("failed w.GetSymKey(id2).") + } + if !w.HasSymKey(id1) { + t.Fatalf("HasSymKey(id1) failed.") + } + if !w.HasSymKey(id2) { + t.Fatalf("HasSymKey(id2) failed.") + } + if k1 == nil { + t.Fatalf("k1 does not exist.") + } + if k2 == nil { + t.Fatalf("k2 does not exist.") + } + if !bytes.Equal(k1, k2) { + t.Fatalf("k1 != k2.") + } + if !bytes.Equal(k1, randomKey) { + t.Fatalf("k1 != randomKey.") + } + if len(k1) != aesKeyLength { + t.Fatalf("wrong length of k1.") + } + if len(k2) != aesKeyLength { + t.Fatalf("wrong length of k2.") + } + + w.DeleteSymKey(id1) + k1, err = w.GetSymKey(id1) + if err == nil { + t.Fatalf("failed w.GetSymKey(id1): false positive.") + } + if k1 != nil { + t.Fatalf("failed GetSymKey(id1): false positive.") + } + k2, err = w.GetSymKey(id2) + if err != nil { + t.Fatalf("failed w.GetSymKey(id2).") + } + if w.HasSymKey(id1) { + t.Fatalf("failed to delete first key: still exist.") + } + if !w.HasSymKey(id2) { + t.Fatalf("failed to delete first key: second key does not exist.") + } + if k1 != nil { + t.Fatalf("failed to delete first key.") + } + if k2 == nil { + t.Fatalf("failed to delete first key: second key is nil.") + } + + w.DeleteSymKey(id1) + w.DeleteSymKey(id2) + k1, err = w.GetSymKey(id1) + if err == nil { + t.Fatalf("failed w.GetSymKey(id1): false positive.") + } + k2, err = w.GetSymKey(id2) + if err == nil { + t.Fatalf("failed w.GetSymKey(id2): false positive.") + } + if k1 != nil || k2 != nil { + t.Fatalf("k1 or k2 is not nil") + } + if w.HasSymKey(id1) { + t.Fatalf("failed to delete second key: first key exist.") + } + if w.HasSymKey(id2) { + t.Fatalf("failed to delete second key: still exist.") + } + if k1 != nil { + t.Fatalf("failed to delete second key: first key is not nil.") + } + if k2 != nil { + t.Fatalf("failed to delete second key: second key is not nil.") + } + + randomKey = make([]byte, aesKeyLength+1) + mrand.Read(randomKey) + _, err = w.AddSymKeyDirect(randomKey) + if err == nil { + t.Fatalf("added the key with wrong size, seed %d.", seed) + } + + const password = "arbitrary data here" + id1, err = w.AddSymKeyFromPassword(password) + if err != nil { + t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err) + } + id2, err = w.AddSymKeyFromPassword(password) + if err != nil { + t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err) + } + k1, err = w.GetSymKey(id1) + if err != nil { + t.Fatalf("failed w.GetSymKey(id1).") + } + k2, err = w.GetSymKey(id2) + if err != nil { + t.Fatalf("failed w.GetSymKey(id2).") + } + if !w.HasSymKey(id1) { + t.Fatalf("HasSymKey(id1) failed.") + } + if !w.HasSymKey(id2) { + t.Fatalf("HasSymKey(id2) failed.") + } + if k1 == nil { + t.Fatalf("k1 does not exist.") + } + if k2 == nil { + t.Fatalf("k2 does not exist.") + } + if !bytes.Equal(k1, k2) { + t.Fatalf("k1 != k2.") + } + if len(k1) != aesKeyLength { + t.Fatalf("wrong length of k1.") + } + if len(k2) != aesKeyLength { + t.Fatalf("wrong length of k2.") + } + if !validateSymmetricKey(k2) { + t.Fatalf("key validation failed.") + } +} + +func TestExpiry(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + w.SetMinimumPoW(0.0000001) + defer w.SetMinimumPoW(DefaultMinimumPoW) + w.Start(nil) + defer w.Stop() + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + params.TTL = 1 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) + } + + // wait till received or timeout + var received, expired bool + for j := 0; j < 20; j++ { + time.Sleep(100 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // wait till expired or timeout + for j := 0; j < 20; j++ { + time.Sleep(100 * time.Millisecond) + if len(w.Envelopes()) == 0 { + expired = true + break + } + } + + if !expired { + t.Fatalf("expire failed, seed: %d.", seed) + } +} + +func TestCustomization(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + const smallPoW = 0.00001 + + f, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + params.KeySym = f.KeySym + params.Topic = BytesToTopic(f.Topics[2]) + params.PoW = smallPoW + params.TTL = 3600 * 24 // one day + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err == nil { + t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed) + } + + w.SetMinimumPoW(smallPoW / 2) + err = w.Send(env) + if err != nil { + t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) + } + + params.TTL++ + msg, err = NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err = msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + w.SetMaxMessageSize(uint32(env.size() - 1)) + err = w.Send(env) + if err == nil { + t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed) + } + + w.SetMaxMessageSize(DefaultMaxMessageSize) + err = w.Send(env) + if err != nil { + t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 20; j++ { + time.Sleep(100 * time.Millisecond) + if len(w.Envelopes()) > 1 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + id, err := w.Subscribe(f) + if err != nil { + t.Fatalf("failed subscribe with seed %d: %s.", seed, err) + } + time.Sleep(5 * time.Millisecond) + mail := f.Retrieve() + if len(mail) > 0 { + t.Fatalf("received premature mail") + } + + mail = w.Messages(id) + if len(mail) != 2 { + t.Fatalf("failed to get whisper messages") + } +} + +func TestSymmetricSendCycle(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + filter1, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + filter1.PoW = DefaultMinimumPoW + + // Copy the first filter since some of its fields + // are randomly gnerated. + filter2 := &Filter{ + KeySym: filter1.KeySym, + Topics: filter1.Topics, + PoW: filter1.PoW, + AllowP2P: filter1.AllowP2P, + Messages: make(map[common.Hash]*ReceivedMessage), + } + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + filter1.Src = ¶ms.Src.PublicKey + filter2.Src = ¶ms.Src.PublicKey + + params.KeySym = filter1.KeySym + params.Topic = BytesToTopic(filter1.Topics[2]) + params.PoW = filter1.PoW + params.WorkTime = 10 + params.TTL = 50 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter1) + if err != nil { + t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter2) + if err != nil { + t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 200; j++ { + time.Sleep(10 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + time.Sleep(5 * time.Millisecond) + mail1 := filter1.Retrieve() + mail2 := filter2.Retrieve() + if len(mail2) == 0 { + t.Fatalf("did not receive any email for filter 2") + } + if len(mail1) == 0 { + t.Fatalf("did not receive any email for filter 1") + } + +} + +func TestSymmetricSendWithoutAKey(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + filter, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + filter.PoW = DefaultMinimumPoW + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + filter.Src = nil + + params.KeySym = filter.KeySym + params.Topic = BytesToTopic(filter.Topics[2]) + params.PoW = filter.PoW + params.WorkTime = 10 + params.TTL = 50 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter) + if err != nil { + t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 200; j++ { + time.Sleep(10 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + time.Sleep(5 * time.Millisecond) + mail := filter.Retrieve() + if len(mail) == 0 { + t.Fatalf("did not receive message in spite of not setting a public key") + } +} + +func TestSymmetricSendKeyMismatch(t *testing.T) { + InitSingleTest() + + w := New(&DefaultConfig) + defer w.SetMinimumPoW(DefaultMinimumPoW) + defer w.SetMaxMessageSize(DefaultMaxMessageSize) + w.Start(nil) + defer w.Stop() + + filter, err := generateFilter(t, true) + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + filter.PoW = DefaultMinimumPoW + + params, err := generateMessageParams() + if err != nil { + t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) + } + + params.KeySym = filter.KeySym + params.Topic = BytesToTopic(filter.Topics[2]) + params.PoW = filter.PoW + params.WorkTime = 10 + params.TTL = 50 + msg, err := NewSentMessage(params) + if err != nil { + t.Fatalf("failed to create new message with seed %d: %s.", seed, err) + } + env, err := msg.Wrap(params) + if err != nil { + t.Fatalf("failed Wrap with seed %d: %s.", seed, err) + } + + _, err = w.Subscribe(filter) + if err != nil { + t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) + } + + err = w.Send(env) + if err != nil { + t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) + } + + // wait till received or timeout + var received bool + for j := 0; j < 200; j++ { + time.Sleep(10 * time.Millisecond) + if len(w.Envelopes()) > 0 { + received = true + break + } + } + + if !received { + t.Fatalf("did not receive the sent envelope, seed: %d.", seed) + } + + // check w.messages() + time.Sleep(5 * time.Millisecond) + mail := filter.Retrieve() + if len(mail) > 0 { + t.Fatalf("received a message when keys weren't matching") + } +} From bfdc0fa3622d7c3b421d2f5a6dda5746be41bfde Mon Sep 17 00:00:00 2001 From: Eugene Valeyev Date: Mon, 6 Nov 2017 18:46:43 +0300 Subject: [PATCH 235/272] mobile: fix FilterLogs (#15418) All logs in the FilterLog return value would be the same object because the for loop captured the pointer to the iteration variable. --- mobile/ethclient.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/ethclient.go b/mobile/ethclient.go index 7f31a89989..758863b6d9 100644 --- a/mobile/ethclient.go +++ b/mobile/ethclient.go @@ -198,8 +198,8 @@ func (ec *EthereumClient) FilterLogs(ctx *Context, query *FilterQuery) (logs *Lo } // Temp hack due to vm.Logs being []*vm.Log res := make([]*types.Log, len(rawLogs)) - for i, log := range rawLogs { - res[i] = &log + for i := range rawLogs { + res[i] = &rawLogs[i] } return &Logs{res}, nil } From 9619a610248e9630968ba1d9be8e214b645c9c55 Mon Sep 17 00:00:00 2001 From: ferhat elmas Date: Wed, 8 Nov 2017 11:45:52 +0100 Subject: [PATCH 236/272] all: gofmt -w -s (#15419) --- accounts/abi/bind/bind_test.go | 2 +- accounts/abi/unpack_test.go | 2 +- cmd/faucet/website.go | 4 ++-- core/bloombits/matcher_test.go | 16 +++++++------- core/bloombits/scheduler_test.go | 2 +- core/genesis.go | 18 +++++++-------- core/tx_pool.go | 4 ++-- core/tx_pool_test.go | 2 +- eth/filters/bench_test.go | 2 +- les/bloombits.go | 2 +- les/distributor.go | 2 +- les/distributor_test.go | 2 +- les/odr.go | 18 +++++++-------- rpc/subscription_test.go | 2 +- swarm/api/client/client_test.go | 38 ++++++++++++++++---------------- swarm/storage/chunker.go | 15 +++++-------- swarm/storage/pyramid.go | 4 ++-- tests/init.go | 18 +++++++-------- tests/state_test_util.go | 2 +- 19 files changed, 76 insertions(+), 79 deletions(-) diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 17b2216426..43ed53b922 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -472,7 +472,7 @@ func TestBindings(t *testing.T) { t.Fatalf("failed to create temporary workspace: %v", err) } defer os.RemoveAll(ws) - + pkg := filepath.Join(ws, "bindtest") if err = os.MkdirAll(pkg, 0700); err != nil { t.Fatalf("failed to create package: %v", err) diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go index 9c7c339f3f..2949083788 100644 --- a/accounts/abi/unpack_test.go +++ b/accounts/abi/unpack_test.go @@ -365,7 +365,7 @@ func TestUnmarshal(t *testing.T) { buff.Write(common.Hex2Bytes("0102000000000000000000000000000000000000000000000000000000000000")) err = abi.Unpack(&mixedBytes, "mixedBytes", buff.Bytes()) - if err !=nil { + if err != nil { t.Error(err) } else { if bytes.Compare(p0, p0Exp) != 0 { diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index eeb8e410e4..6a99f8c6f8 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -182,8 +182,9 @@ type bintree struct { Func func() (*asset, error) Children map[string]*bintree } + var _bintree = &bintree{nil, map[string]*bintree{ - "faucet.html": &bintree{faucetHtml, map[string]*bintree{}}, + "faucet.html": {faucetHtml, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory @@ -232,4 +233,3 @@ func _filePath(dir, name string) string { cannonicalName := strings.Replace(name, "\\", "/", -1) return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) } - diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index 0d8544136d..4a31854c58 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -31,14 +31,14 @@ const testSectionSize = 4096 // Tests that wildcard filter rules (nil) can be specified and are handled well. func TestMatcherWildcards(t *testing.T) { matcher := NewMatcher(testSectionSize, [][][]byte{ - [][]byte{common.Address{}.Bytes(), common.Address{0x01}.Bytes()}, // Default address is not a wildcard - [][]byte{common.Hash{}.Bytes(), common.Hash{0x01}.Bytes()}, // Default hash is not a wildcard - [][]byte{common.Hash{0x01}.Bytes()}, // Plain rule, sanity check - [][]byte{common.Hash{0x01}.Bytes(), nil}, // Wildcard suffix, drop rule - [][]byte{nil, common.Hash{0x01}.Bytes()}, // Wildcard prefix, drop rule - [][]byte{nil, nil}, // Wildcard combo, drop rule - [][]byte{}, // Inited wildcard rule, drop rule - nil, // Proper wildcard rule, drop rule + {common.Address{}.Bytes(), common.Address{0x01}.Bytes()}, // Default address is not a wildcard + {common.Hash{}.Bytes(), common.Hash{0x01}.Bytes()}, // Default hash is not a wildcard + {common.Hash{0x01}.Bytes()}, // Plain rule, sanity check + {common.Hash{0x01}.Bytes(), nil}, // Wildcard suffix, drop rule + {nil, common.Hash{0x01}.Bytes()}, // Wildcard prefix, drop rule + {nil, nil}, // Wildcard combo, drop rule + {}, // Inited wildcard rule, drop rule + nil, // Proper wildcard rule, drop rule }) if len(matcher.filters) != 3 { t.Fatalf("filter system size mismatch: have %d, want %d", len(matcher.filters), 3) diff --git a/core/bloombits/scheduler_test.go b/core/bloombits/scheduler_test.go index 8a159c2370..70772e4ab9 100644 --- a/core/bloombits/scheduler_test.go +++ b/core/bloombits/scheduler_test.go @@ -60,7 +60,7 @@ func testScheduler(t *testing.T, clients int, fetchers int, requests int) { req.section, // Requested data req.section, // Duplicated data (ensure it doesn't double close anything) }, [][]byte{ - []byte{}, + {}, new(big.Int).SetUint64(req.section).Bytes(), new(big.Int).SetUint64(req.section).Bytes(), }) diff --git a/core/genesis.go b/core/genesis.go index 26b1c9f63f..df491ce0f4 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -356,15 +356,15 @@ func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { GasLimit: 6283185, Difficulty: big.NewInt(1), Alloc: map[common.Address]GenesisAccount{ - common.BytesToAddress([]byte{1}): GenesisAccount{Balance: big.NewInt(1)}, // ECRecover - common.BytesToAddress([]byte{2}): GenesisAccount{Balance: big.NewInt(1)}, // SHA256 - common.BytesToAddress([]byte{3}): GenesisAccount{Balance: big.NewInt(1)}, // RIPEMD - common.BytesToAddress([]byte{4}): GenesisAccount{Balance: big.NewInt(1)}, // Identity - common.BytesToAddress([]byte{5}): GenesisAccount{Balance: big.NewInt(1)}, // ModExp - common.BytesToAddress([]byte{6}): GenesisAccount{Balance: big.NewInt(1)}, // ECAdd - common.BytesToAddress([]byte{7}): GenesisAccount{Balance: big.NewInt(1)}, // ECScalarMul - common.BytesToAddress([]byte{8}): GenesisAccount{Balance: big.NewInt(1)}, // ECPairing - faucet: GenesisAccount{Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}, + common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover + common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256 + common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD + common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity + common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp + common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd + common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul + common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing + faucet: {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}, }, } } diff --git a/core/tx_pool.go b/core/tx_pool.go index 0f008ddc0d..c3915575b0 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -820,7 +820,7 @@ func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) []error { // Only reprocess the internal state if something was actually added if len(dirty) > 0 { addrs := make([]common.Address, 0, len(dirty)) - for addr, _ := range dirty { + for addr := range dirty { addrs = append(addrs, addr) } pool.promoteExecutables(addrs) @@ -907,7 +907,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { // Gather all the accounts potentially needing updates if accounts == nil { accounts = make([]common.Address, 0, len(pool.queue)) - for addr, _ := range pool.queue { + for addr := range pool.queue { accounts = append(accounts, addr) } } diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 737ea4cd39..e9ecbb9338 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -105,7 +105,7 @@ func validateTxPoolInternals(pool *TxPool) error { for addr, txs := range pool.pending { // Find the last transaction var last uint64 - for nonce, _ := range txs.txs.items { + for nonce := range txs.txs.items { if last < nonce { last = nonce } diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index abbf4593e9..0a0929bc10 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -192,7 +192,7 @@ func BenchmarkNoBloomBits(b *testing.B) { start := time.Now() mux := new(event.TypeMux) backend := &testBackend{mux, db, 0, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} - filter := New(backend, 0, int64(headNum), []common.Address{common.Address{}}, nil) + filter := New(backend, 0, int64(headNum), []common.Address{{}}, nil) filter.Logs(context.Background()) d := time.Since(start) fmt.Println("Finished running filter benchmarks") diff --git a/les/bloombits.go b/les/bloombits.go index dff83d3491..de233d7518 100644 --- a/les/bloombits.go +++ b/les/bloombits.go @@ -56,7 +56,7 @@ func (eth *LightEthereum) startBloomHandlers() { task.Bitsets = make([][]byte, len(task.Sections)) compVectors, err := light.GetBloomBits(task.Context, eth.odr, task.Bit, task.Sections) if err == nil { - for i, _ := range task.Sections { + for i := range task.Sections { if blob, err := bitutil.DecompressBytes(compVectors[i], int(light.BloomTrieFrequency/8)); err == nil { task.Bitsets[i] = blob } else { diff --git a/les/distributor.go b/les/distributor.go index e8ef5b02e2..159fa4c73f 100644 --- a/les/distributor.go +++ b/les/distributor.go @@ -191,7 +191,7 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { for (len(d.peers) > 0 || elem == d.reqQueue.Front()) && elem != nil { req := elem.Value.(*distReq) canSend := false - for peer, _ := range d.peers { + for peer := range d.peers { if _, ok := checkedPeers[peer]; !ok && peer.canQueue() && req.canSend(peer) { canSend = true cost := req.getCost(peer) diff --git a/les/distributor_test.go b/les/distributor_test.go index 4e7f8bd291..55defb69be 100644 --- a/les/distributor_test.go +++ b/les/distributor_test.go @@ -124,7 +124,7 @@ func testRequestDistributor(t *testing.T, resend bool) { dist := newRequestDistributor(nil, stop) var peers [testDistPeerCount]*testDistPeer - for i, _ := range peers { + for i := range peers { peers[i] = &testDistPeer{} go peers[i].worker(t, !resend, stop) dist.registerTestPeer(peers[i]) diff --git a/les/odr.go b/les/odr.go index 986630dbfd..f8412aaad7 100644 --- a/les/odr.go +++ b/les/odr.go @@ -27,20 +27,20 @@ import ( // LesOdr implements light.OdrBackend type LesOdr struct { - db ethdb.Database + db ethdb.Database chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer - retriever *retrieveManager - stop chan struct{} + retriever *retrieveManager + stop chan struct{} } func NewLesOdr(db ethdb.Database, chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer, retriever *retrieveManager) *LesOdr { return &LesOdr{ - db: db, - chtIndexer: chtIndexer, - bloomTrieIndexer: bloomTrieIndexer, - bloomIndexer: bloomIndexer, - retriever: retriever, - stop: make(chan struct{}), + db: db, + chtIndexer: chtIndexer, + bloomTrieIndexer: bloomTrieIndexer, + bloomIndexer: bloomIndexer, + retriever: retriever, + stop: make(chan struct{}), } } diff --git a/rpc/subscription_test.go b/rpc/subscription_test.go index 39f7596923..0ba177e63b 100644 --- a/rpc/subscription_test.go +++ b/rpc/subscription_test.go @@ -290,7 +290,7 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { for { done := true - for id, _ := range count { + for id := range count { if count, found := count[id]; !found || count < (2*n) { done = false } diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go index edf385dd08..c1d144e370 100644 --- a/swarm/api/client/client_test.go +++ b/swarm/api/client/client_test.go @@ -244,25 +244,25 @@ func TestClientFileList(t *testing.T) { } tests := map[string][]string{ - "": []string{"dir1/", "dir2/", "file1.txt", "file2.txt"}, - "file": []string{"file1.txt", "file2.txt"}, - "file1": []string{"file1.txt"}, - "file2.txt": []string{"file2.txt"}, - "file12": []string{}, - "dir": []string{"dir1/", "dir2/"}, - "dir1": []string{"dir1/"}, - "dir1/": []string{"dir1/file3.txt", "dir1/file4.txt"}, - "dir1/file": []string{"dir1/file3.txt", "dir1/file4.txt"}, - "dir1/file3.txt": []string{"dir1/file3.txt"}, - "dir1/file34": []string{}, - "dir2/": []string{"dir2/dir3/", "dir2/dir4/", "dir2/file5.txt"}, - "dir2/file": []string{"dir2/file5.txt"}, - "dir2/dir": []string{"dir2/dir3/", "dir2/dir4/"}, - "dir2/dir3/": []string{"dir2/dir3/file6.txt"}, - "dir2/dir4/": []string{"dir2/dir4/file7.txt", "dir2/dir4/file8.txt"}, - "dir2/dir4/file": []string{"dir2/dir4/file7.txt", "dir2/dir4/file8.txt"}, - "dir2/dir4/file7.txt": []string{"dir2/dir4/file7.txt"}, - "dir2/dir4/file78": []string{}, + "": {"dir1/", "dir2/", "file1.txt", "file2.txt"}, + "file": {"file1.txt", "file2.txt"}, + "file1": {"file1.txt"}, + "file2.txt": {"file2.txt"}, + "file12": {}, + "dir": {"dir1/", "dir2/"}, + "dir1": {"dir1/"}, + "dir1/": {"dir1/file3.txt", "dir1/file4.txt"}, + "dir1/file": {"dir1/file3.txt", "dir1/file4.txt"}, + "dir1/file3.txt": {"dir1/file3.txt"}, + "dir1/file34": {}, + "dir2/": {"dir2/dir3/", "dir2/dir4/", "dir2/file5.txt"}, + "dir2/file": {"dir2/file5.txt"}, + "dir2/dir": {"dir2/dir3/", "dir2/dir4/"}, + "dir2/dir3/": {"dir2/dir3/file6.txt"}, + "dir2/dir4/": {"dir2/dir4/file7.txt", "dir2/dir4/file8.txt"}, + "dir2/dir4/file": {"dir2/dir4/file7.txt", "dir2/dir4/file8.txt"}, + "dir2/dir4/file7.txt": {"dir2/dir4/file7.txt"}, + "dir2/dir4/file78": {}, } for prefix, expected := range tests { actual := ls(prefix) diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go index 0454828b9c..8c0d62cbe2 100644 --- a/swarm/storage/chunker.go +++ b/swarm/storage/chunker.go @@ -50,7 +50,6 @@ data_{i} := size(subtree_{i}) || key_{j} || key_{j+1} .... || key_{j+n-1} The underlying hash function is configurable */ - /* Tree chunker is a concrete implementation of data chunking. This chunker works in a simple way, it builds a tree out of the document so that each node either represents a chunk of real data or a chunk of data representing an branching non-leaf node of the tree. In particular each such non-leaf chunk will represent is a concatenation of the hash of its respective children. This scheme simultaneously guarantees data integrity as well as self addressing. Abstract nodes are transparent since their represented size component is strictly greater than their maximum data size, since they encode a subtree. @@ -61,17 +60,17 @@ The hashing itself does use extra copies and allocation though, since it does ne var ( errAppendOppNotSuported = errors.New("Append operation not supported") - errOperationTimedOut = errors.New("operation timed out") + errOperationTimedOut = errors.New("operation timed out") ) type TreeChunker struct { branches int64 hashFunc SwarmHasher // calculated - hashSize int64 // self.hashFunc.New().Size() - chunkSize int64 // hashSize* branches - workerCount int64 // the number of worker routines used - workerLock sync.RWMutex // lock for the worker count + hashSize int64 // self.hashFunc.New().Size() + chunkSize int64 // hashSize* branches + workerCount int64 // the number of worker routines used + workerLock sync.RWMutex // lock for the worker count } func NewTreeChunker(params *ChunkerParams) (self *TreeChunker) { @@ -124,7 +123,6 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s panic("chunker must be initialised") } - jobC := make(chan *hashJob, 2*ChunkProcessors) wg := &sync.WaitGroup{} errC := make(chan error) @@ -164,7 +162,6 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s close(errC) }() - defer close(quitC) select { case err := <-errC: @@ -172,7 +169,7 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s return nil, err } case <-time.NewTimer(splitTimeout).C: - return nil,errOperationTimedOut + return nil, errOperationTimedOut } return key, nil diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go index 631ab52b86..42b83583d4 100644 --- a/swarm/storage/pyramid.go +++ b/swarm/storage/pyramid.go @@ -123,7 +123,7 @@ type PyramidChunker struct { hashSize int64 branches int64 workerCount int64 - workerLock sync.RWMutex + workerLock sync.RWMutex } func NewPyramidChunker(params *ChunkerParams) (self *PyramidChunker) { @@ -634,4 +634,4 @@ func (self *PyramidChunker) enqueueDataChunk(chunkData []byte, size uint64, pare return pkey -} \ No newline at end of file +} diff --git a/tests/init.go b/tests/init.go index a2c633ad67..9e884efe39 100644 --- a/tests/init.go +++ b/tests/init.go @@ -25,26 +25,26 @@ import ( // This table defines supported forks and their chain config. var Forks = map[string]*params.ChainConfig{ - "Frontier": ¶ms.ChainConfig{ + "Frontier": { ChainId: big.NewInt(1), }, - "Homestead": ¶ms.ChainConfig{ + "Homestead": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), }, - "EIP150": ¶ms.ChainConfig{ + "EIP150": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), EIP150Block: big.NewInt(0), }, - "EIP158": ¶ms.ChainConfig{ + "EIP158": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(0), EIP158Block: big.NewInt(0), }, - "Byzantium": ¶ms.ChainConfig{ + "Byzantium": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), EIP150Block: big.NewInt(0), @@ -53,22 +53,22 @@ var Forks = map[string]*params.ChainConfig{ DAOForkBlock: big.NewInt(0), ByzantiumBlock: big.NewInt(0), }, - "FrontierToHomesteadAt5": ¶ms.ChainConfig{ + "FrontierToHomesteadAt5": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(5), }, - "HomesteadToEIP150At5": ¶ms.ChainConfig{ + "HomesteadToEIP150At5": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), EIP150Block: big.NewInt(5), }, - "HomesteadToDaoAt5": ¶ms.ChainConfig{ + "HomesteadToDaoAt5": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), DAOForkBlock: big.NewInt(5), DAOForkSupport: true, }, - "EIP158ToByzantiumAt5": ¶ms.ChainConfig{ + "EIP158ToByzantiumAt5": { ChainId: big.NewInt(1), HomesteadBlock: big.NewInt(0), EIP150Block: big.NewInt(0), diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 64bf09cb42..352f840d9f 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -112,7 +112,7 @@ type stTransactionMarshaling struct { func (t *StateTest) Subtests() []StateSubtest { var sub []StateSubtest for fork, pss := range t.json.Post { - for i, _ := range pss { + for i := range pss { sub = append(sub, StateSubtest{fork, i}) } } From 0914d4e0d2b29249bdec9d2342256c39e1787bf3 Mon Sep 17 00:00:00 2001 From: Evgeny Danilenko <6655321@bk.ru> Date: Thu, 9 Nov 2017 12:34:35 +0300 Subject: [PATCH 237/272] les: fix misuse of WaitGroup (#15365) --- les/fetcher.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/les/fetcher.go b/les/fetcher.go index 4fc142f0f4..3fc4df30b9 100644 --- a/les/fetcher.go +++ b/les/fetcher.go @@ -117,16 +117,16 @@ func newLightFetcher(pm *ProtocolManager) *lightFetcher { maxConfirmedTd: big.NewInt(0), } pm.peers.notify(f) + + f.pm.wg.Add(1) go f.syncLoop() return f } // syncLoop is the main event loop of the light fetcher func (f *lightFetcher) syncLoop() { - f.pm.wg.Add(1) - defer f.pm.wg.Done() - requesting := false + defer f.pm.wg.Done() for { select { case <-f.pm.quitSync: From 7ace02398160fe4d0f0bf9e7c49ff86e6fdb15bc Mon Sep 17 00:00:00 2001 From: b00ris Date: Thu, 9 Nov 2017 12:43:37 +0300 Subject: [PATCH 238/272] les: fix channel assignment data race (#15441) --- les/serverpool.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/les/serverpool.go b/les/serverpool.go index f4e4df2fbf..dc1ea6bf02 100644 --- a/les/serverpool.go +++ b/les/serverpool.go @@ -145,15 +145,15 @@ func (pool *serverPool) start(server *p2p.Server, topic discv5.Topic) { pool.wg.Add(1) pool.loadNodes() - go pool.eventLoop() - - pool.checkDial() if pool.server.DiscV5 != nil { pool.discSetPeriod = make(chan time.Duration, 1) pool.discNodes = make(chan *discv5.Node, 100) pool.discLookups = make(chan bool, 100) go pool.server.DiscV5.SearchTopic(pool.topic, pool.discSetPeriod, pool.discNodes, pool.discLookups) } + + go pool.eventLoop() + pool.checkDial() } // connect should be called upon any incoming connection. If the connection has been From 4732ee89cb66334334344761997503e59a67d102 Mon Sep 17 00:00:00 2001 From: bas-vk Date: Thu, 9 Nov 2017 10:51:14 +0100 Subject: [PATCH 239/272] github: add remark about general questions (#15250) --- .github/ISSUE_TEMPLATE.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 6c1cb9f9ad..7d80659b0d 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,9 @@ +Hi there, + +please note that this is an issue tracker reserved for bug reports and feature requests. + +For general questions please use the gitter channel or the Ethereum stack exchange at https://ethereum.stackexchange.com. + #### System information Geth version: `geth version` From 4fe30bf5ade8849bb3971a0edad95d17d99e8778 Mon Sep 17 00:00:00 2001 From: bas-vk Date: Thu, 9 Nov 2017 10:54:58 +0100 Subject: [PATCH 240/272] rpc: check content-type for HTTP requests (#15220) --- rpc/http.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/rpc/http.go b/rpc/http.go index 4143e2a8dc..3f572b34c0 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "io/ioutil" + "mime" "net" "net/http" "sync" @@ -151,6 +152,16 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.StatusRequestEntityTooLarge) return } + + ct := r.Header.Get("content-type") + mt, _, err := mime.ParseMediaType(ct) + if err != nil || mt != "application/json" { + http.Error(w, + "invalid content type, only application/json is supported", + http.StatusUnsupportedMediaType) + return + } + w.Header().Set("content-type", "application/json") // create a codec that reads direct from the request body until From d7f2462e8f242887846cbff760790fa42c28de65 Mon Sep 17 00:00:00 2001 From: Dan Melton Date: Thu, 9 Nov 2017 04:46:03 -0600 Subject: [PATCH 241/272] build: add Travis job to lint Go code #15372 (#15416) * build: [finishes #15372] implements generalized linter and travis job * .travis, build: minor polishes, disable deadcode --- .travis.yml | 18 ++++++++++++++++-- build/ci.go | 49 +++++++++++++++++++------------------------------ 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8a7f65e3d6..fe3b04cd2e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,7 @@ matrix: - sudo chmod 666 /dev/fuse - sudo chown root:$USER /etc/fuse.conf - go run build/ci.go install - - go run build/ci.go test -coverage -misspell + - go run build/ci.go test -coverage - os: osx go: 1.9.x @@ -48,7 +48,21 @@ matrix: - brew install caskroom/cask/brew-cask - brew cask install osxfuse - go run build/ci.go install - - go run build/ci.go test -coverage -misspell + - go run build/ci.go test -coverage + + # This builder only tests code linters on latest version of Go + - os: linux + dist: trusty + sudo: required + go: 1.9.x + env: + - lint + script: + - sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install fuse + - sudo modprobe fuse + - sudo chmod 666 /dev/fuse + - sudo chown root:$USER /etc/fuse.conf + - go run build/ci.go lint # This builder does the Ubuntu PPA and Linux Azure uploads - os: linux diff --git a/build/ci.go b/build/ci.go index a4f5616bc7..5d52fad87c 100644 --- a/build/ci.go +++ b/build/ci.go @@ -24,7 +24,8 @@ Usage: go run ci.go Available commands are: install [ -arch architecture ] [ packages... ] -- builds packages and executables - test [ -coverage ] [ -misspell ] [ packages... ] -- runs the tests + test [ -coverage ] [ packages... ] -- runs the tests + lint -- runs certain pre-selected linters archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -upload dest ] -- archives build artefacts importkeys -- imports signing keys from env debsrc [ -signer key-id ] [ -upload dest ] -- creates a debian source package @@ -146,6 +147,8 @@ func main() { doInstall(os.Args[2:]) case "test": doTest(os.Args[2:]) + case "lint": + doLint(os.Args[2:]) case "archive": doArchive(os.Args[2:]) case "debsrc": @@ -280,7 +283,6 @@ func goToolArch(arch string, subcmd string, args ...string) *exec.Cmd { func doTest(cmdline []string) { var ( - misspell = flag.Bool("misspell", false, "Whether to run the spell checker") coverage = flag.Bool("coverage", false, "Whether to record code coverage") ) flag.CommandLine.Parse(cmdline) @@ -294,10 +296,7 @@ func doTest(cmdline []string) { // Run analysis tools before the tests. build.MustRun(goTool("vet", packages...)) - if *misspell { - // TODO(karalabe): Reenable after false detection is fixed: https://github.com/client9/misspell/issues/105 - // spellcheck(packages) - } + // Run the actual tests. gotest := goTool("test", buildFlags(env)...) // Test a single package at a time. CI builders are slow @@ -306,36 +305,26 @@ func doTest(cmdline []string) { if *coverage { gotest.Args = append(gotest.Args, "-covermode=atomic", "-cover") } + gotest.Args = append(gotest.Args, packages...) build.MustRun(gotest) } -// spellcheck runs the client9/misspell spellchecker package on all Go, Cgo and -// test files in the requested packages. -func spellcheck(packages []string) { - // Ensure the spellchecker is available - build.MustRun(goTool("get", "github.com/client9/misspell/cmd/misspell")) +// runs gometalinter on requested packages +func doLint(cmdline []string) { + flag.CommandLine.Parse(cmdline) - // Windows chokes on long argument lists, check packages individually - for _, pkg := range packages { - // The spell checker doesn't work on packages, gather all .go files for it - out, err := goTool("list", "-f", "{{.Dir}}{{range .GoFiles}}\n{{.}}{{end}}{{range .CgoFiles}}\n{{.}}{{end}}{{range .TestGoFiles}}\n{{.}}{{end}}", pkg).CombinedOutput() - if err != nil { - log.Fatalf("source file listing failed: %v\n%s", err, string(out)) - } - // Retrieve the folder and assemble the source list - lines := strings.Split(string(out), "\n") - root := lines[0] - - sources := make([]string, 0, len(lines)-1) - for _, line := range lines[1:] { - if line = strings.TrimSpace(line); line != "" { - sources = append(sources, filepath.Join(root, line)) - } - } - // Run the spell checker for this particular package - build.MustRunCommand(filepath.Join(GOBIN, "misspell"), append([]string{"-error"}, sources...)...) + packages := []string{"./..."} + if len(flag.CommandLine.Args()) > 0 { + packages = flag.CommandLine.Args() } + // Get metalinter and install all supported linters + build.MustRun(goTool("get", "gopkg.in/alecthomas/gometalinter.v1")) + build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), "--install") + + configs := []string{"--vendor", "--disable-all", "--enable=vet"} // Add additional linters to the slice with "--enable=linter-name" + + build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), append(configs, packages...)...) } // Release Packaging From 09b347fec92d2a73122dc3efc5aeea2a2724d9ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 9 Nov 2017 14:32:05 +0200 Subject: [PATCH 242/272] travis: bump Android NDK version and Android Go builder --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index fe3b04cd2e..1bd69da347 100644 --- a/.travis.yml +++ b/.travis.yml @@ -147,16 +147,16 @@ matrix: - azure-android - maven-android before_install: - - curl https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz | tar -xz + - curl https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz | tar -xz - export PATH=`pwd`/go/bin:$PATH - export GOROOT=`pwd`/go - export GOPATH=$HOME/go script: # Build the Android archive and upload it to Maven Central and Azure - - curl https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip -o android-ndk-r14b.zip - - unzip -q android-ndk-r14b.zip && rm android-ndk-r14b.zip - - mv android-ndk-r14b $HOME - - export ANDROID_NDK=$HOME/android-ndk-r14b + - curl https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip -o android-ndk-r15c.zip + - unzip -q android-ndk-r15c.zip && rm android-ndk-r15c.zip + - mv android-ndk-r15c $HOME + - export ANDROID_NDK=$HOME/android-ndk-r15c - mkdir -p $GOPATH/src/github.com/ethereum - ln -s `pwd` $GOPATH/src/github.com/ethereum From d1eb4006e221b7fc5497e760186fc518320c4774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 9 Nov 2017 19:48:12 +0200 Subject: [PATCH 243/272] build: enable gofmt and misspell linters --- build/ci.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ci.go b/build/ci.go index 5d52fad87c..af58ee6452 100644 --- a/build/ci.go +++ b/build/ci.go @@ -322,7 +322,7 @@ func doLint(cmdline []string) { build.MustRun(goTool("get", "gopkg.in/alecthomas/gometalinter.v1")) build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), "--install") - configs := []string{"--vendor", "--disable-all", "--enable=vet"} // Add additional linters to the slice with "--enable=linter-name" + configs := []string{"--vendor", "--disable-all", "--enable=vet", "--enable=gofmt", "--enable=misspell"} build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), append(configs, packages...)...) } From b31cc71ff6415a02864482980d08f5998cd5e086 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 10 Nov 2017 04:19:51 -0500 Subject: [PATCH 244/272] contracts/chequebook: update for latest Solidity (#15425) This changes behaviour: before if the owner/amount didn't match, it resulted in a successful execution without doing anything; now it results in a failed execution using the revert opcode (remainder gas is not consumed). --- contracts/chequebook/contract/chequebook.sol | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol index 845ba464b3..8d6e85d119 100644 --- a/contracts/chequebook/contract/chequebook.sol +++ b/contracts/chequebook/contract/chequebook.sol @@ -1,7 +1,9 @@ -import "mortal"; +pragma solidity ^0.4.18; + +import "https://github.com/ethereum/solidity/std/mortal.sol"; /// @title Chequebook for Ethereum micropayments -/// @author Daniel A. Nagy +/// @author Daniel A. Nagy contract chequebook is mortal { // Cumulative paid amount in wei to each beneficiary mapping (address => uint256) public sent; @@ -21,26 +23,23 @@ contract chequebook is mortal { uint8 sig_v, bytes32 sig_r, bytes32 sig_s) { // Check if the cheque is old. // Only cheques that are more recent than the last cashed one are considered. - if(amount <= sent[beneficiary]) return; + require(amount > sent[beneficiary]); // Check the digital signature of the cheque. - bytes32 hash = sha3(address(this), beneficiary, amount); - if(owner != ecrecover(hash, sig_v, sig_r, sig_s)) return; + bytes32 hash = keccak256(address(this), beneficiary, amount); + require(owner == ecrecover(hash, sig_v, sig_r, sig_s)); // Attempt sending the difference between the cumulative amount on the cheque // and the cumulative amount on the last cashed cheque to beneficiary. uint256 diff = amount - sent[beneficiary]; if (diff <= this.balance) { // update the cumulative amount before sending sent[beneficiary] = amount; - if (!beneficiary.send(diff)) { - // Upon failure to execute send, revert everything - throw; - } + beneficiary.transfer(diff); } else { // Upon failure, punish owner for writing a bounced cheque. // owner.sendToDebtorsPrison(); Overdraft(owner); // Compensate beneficiary. - suicide(beneficiary); + selfdestruct(beneficiary); } } } From 3ee86a57f328530707974288e9db87b7c05283f9 Mon Sep 17 00:00:00 2001 From: Benoit Verkindt Date: Fri, 10 Nov 2017 01:22:06 -0800 Subject: [PATCH 245/272] rpc: warn on WebSocket origin mismatch (#15451) Fixes #15373 --- rpc/websocket.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc/websocket.go b/rpc/websocket.go index 5f9593a43f..4214fc86a0 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -83,7 +83,7 @@ func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http if allowAllOrigins || origins.Has(origin) { return nil } - log.Debug(fmt.Sprintf("origin '%s' not allowed on WS-RPC interface\n", origin)) + log.Warn(fmt.Sprintf("origin '%s' not allowed on WS-RPC interface\n", origin)) return fmt.Errorf("origin %s not allowed", origin) } From 86f6568f6618945b19057553ec32690d723da982 Mon Sep 17 00:00:00 2001 From: ferhat elmas Date: Fri, 10 Nov 2017 18:06:45 +0100 Subject: [PATCH 246/272] build: enable unconvert linter (#15456) * build: enable unconvert linter - fixes #15453 - update code base for failing cases * cmd/puppeth: replace syscall.Stdin with os.Stdin.Fd() for unconvert linter --- accounts/abi/unpack.go | 2 +- build/ci.go | 8 +++++++- cmd/puppeth/module_faucet.go | 2 +- cmd/puppeth/module_node.go | 2 +- cmd/puppeth/ssh.go | 3 +-- cmd/puppeth/wizard.go | 3 +-- common/hexutil/hexutil.go | 4 +--- common/hexutil/json.go | 2 +- consensus/ethash/algorithm_go1.8.go | 4 ++-- core/vm/interpreter.go | 4 ++-- eth/downloader/downloader.go | 4 ++-- eth/downloader/fakepeer.go | 2 +- eth/filters/filter.go | 2 +- les/peer.go | 2 +- metrics/metrics.go | 8 ++++---- mobile/interface.go | 2 +- p2p/discover/table.go | 2 +- swarm/api/manifest.go | 6 +++--- swarm/fuse/fuse_file.go | 13 +++++++------ swarm/network/depo.go | 2 +- swarm/network/kademlia/address.go | 2 +- swarm/network/kademlia/kaddb.go | 6 +++--- swarm/network/protocol.go | 2 +- swarm/network/syncer.go | 2 +- swarm/storage/chunker.go | 4 ++-- swarm/storage/memstore.go | 2 +- swarm/storage/pyramid.go | 4 ++-- whisper/whisperv5/topic.go | 4 ++-- whisper/whisperv5/whisper.go | 2 +- whisper/whisperv6/topic.go | 4 ++-- whisper/whisperv6/whisper.go | 2 +- 31 files changed, 57 insertions(+), 54 deletions(-) diff --git a/accounts/abi/unpack.go b/accounts/abi/unpack.go index ffa14ccd3b..57732797b6 100644 --- a/accounts/abi/unpack.go +++ b/accounts/abi/unpack.go @@ -38,7 +38,7 @@ type unpacker interface { func readInteger(kind reflect.Kind, b []byte) interface{} { switch kind { case reflect.Uint8: - return uint8(b[len(b)-1]) + return b[len(b)-1] case reflect.Uint16: return binary.BigEndian.Uint16(b[len(b)-2:]) case reflect.Uint32: diff --git a/build/ci.go b/build/ci.go index af58ee6452..0c825ef31e 100644 --- a/build/ci.go +++ b/build/ci.go @@ -322,9 +322,15 @@ func doLint(cmdline []string) { build.MustRun(goTool("get", "gopkg.in/alecthomas/gometalinter.v1")) build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), "--install") + // Run fast linters batched together configs := []string{"--vendor", "--disable-all", "--enable=vet", "--enable=gofmt", "--enable=misspell"} - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), append(configs, packages...)...) + + // Run slow linters one by one + for _, linter := range []string{"unconvert"} { + configs = []string{"--vendor", "--deadline=10m", "--disable-all", "--enable=" + linter} + build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v1"), append(configs, packages...)...) + } } // Release Packaging diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index acf1e4324e..3c1296bddb 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -133,7 +133,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config }) files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() - files[filepath.Join(workdir, "genesis.json")] = []byte(config.node.genesis) + files[filepath.Join(workdir, "genesis.json")] = config.node.genesis files[filepath.Join(workdir, "account.json")] = []byte(config.node.keyJSON) files[filepath.Join(workdir, "account.pass")] = []byte(config.node.keyPass) diff --git a/cmd/puppeth/module_node.go b/cmd/puppeth/module_node.go index 8f912f9ebd..375e3e6463 100644 --- a/cmd/puppeth/module_node.go +++ b/cmd/puppeth/module_node.go @@ -128,7 +128,7 @@ func deployNode(client *sshClient, network string, bootv4, bootv5 []string, conf files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() //genesisfile, _ := json.MarshalIndent(config.genesis, "", " ") - files[filepath.Join(workdir, "genesis.json")] = []byte(config.genesis) + files[filepath.Join(workdir, "genesis.json")] = config.genesis if config.keyJSON != "" { files[filepath.Join(workdir, "signer.json")] = []byte(config.keyJSON) diff --git a/cmd/puppeth/ssh.go b/cmd/puppeth/ssh.go index 26f8466850..47378a6063 100644 --- a/cmd/puppeth/ssh.go +++ b/cmd/puppeth/ssh.go @@ -27,7 +27,6 @@ import ( "os/user" "path/filepath" "strings" - "syscall" "github.com/ethereum/go-ethereum/log" "golang.org/x/crypto/ssh" @@ -85,7 +84,7 @@ func dial(server string, pubkey []byte) (*sshClient, error) { } auths = append(auths, ssh.PasswordCallback(func() (string, error) { fmt.Printf("What's the login password for %s at %s? (won't be echoed)\n> ", login, server) - blob, err := terminal.ReadPassword(int(syscall.Stdin)) + blob, err := terminal.ReadPassword(int(os.Stdin.Fd())) fmt.Println() return string(blob), err diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 5fbc11cb98..eb6d9e5aae 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -28,7 +28,6 @@ import ( "sort" "strconv" "strings" - "syscall" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -231,7 +230,7 @@ func (w *wizard) readDefaultFloat(def float64) float64 { // line and returns it. The input will not be echoed. func (w *wizard) readPassword() string { fmt.Printf("> ") - text, err := terminal.ReadPassword(int(syscall.Stdin)) + text, err := terminal.ReadPassword(int(os.Stdin.Fd())) if err != nil { log.Crit("Failed to read password", "err", err) } diff --git a/common/hexutil/hexutil.go b/common/hexutil/hexutil.go index 582a67c22c..02c488a3f1 100644 --- a/common/hexutil/hexutil.go +++ b/common/hexutil/hexutil.go @@ -53,9 +53,7 @@ var ( type decError struct{ msg string } -func (err decError) Error() string { - return string(err.msg) -} +func (err decError) Error() string { return err.msg } // Decode decodes a hex string with 0x prefix. func Decode(input string) ([]byte, error) { diff --git a/common/hexutil/json.go b/common/hexutil/json.go index 11e14cae7f..fbc21241c8 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -223,7 +223,7 @@ func (b *Uint64) UnmarshalText(input []byte) error { return ErrSyntax } dec *= 16 - dec += uint64(nib) + dec += nib } *b = Uint64(dec) return nil diff --git a/consensus/ethash/algorithm_go1.8.go b/consensus/ethash/algorithm_go1.8.go index 62bf4dec1b..d691b758f0 100644 --- a/consensus/ethash/algorithm_go1.8.go +++ b/consensus/ethash/algorithm_go1.8.go @@ -31,7 +31,7 @@ func cacheSize(block uint64) uint64 { return cacheSizes[epoch] } // No known cache size, calculate manually (sanity branch only) - size := uint64(cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes) + size := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes for !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64 size -= 2 * hashBytes } @@ -49,7 +49,7 @@ func datasetSize(block uint64) uint64 { return datasetSizes[epoch] } // No known dataset size, calculate manually (sanity branch only) - size := uint64(datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes) + size := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes for !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64 size -= 2 * mixBytes } diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 516438509f..ea5468f901 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -161,8 +161,8 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret if in.cfg.Debug { logged = false - pcCopy = uint64(pc) - gasCopy = uint64(contract.Gas) + pcCopy = pc + gasCopy = contract.Gas stackCopy = newstack() for _, val := range stack.data { stackCopy.push(val) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 5782d4cf53..cca4fe7a93 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -708,7 +708,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err ttl := d.requestTTL() timeout := time.After(ttl) - go p.peer.RequestHeadersByNumber(uint64(check), 1, 0, false) + go p.peer.RequestHeadersByNumber(check, 1, 0, false) // Wait until a reply arrives to this request for arrived := false; !arrived; { @@ -1518,7 +1518,7 @@ func (d *Downloader) deliver(id string, destCh chan dataPack, packet dataPack, i func (d *Downloader) qosTuner() { for { // Retrieve the current median RTT and integrate into the previoust target RTT - rtt := time.Duration(float64(1-qosTuningImpact)*float64(atomic.LoadUint64(&d.rttEstimate)) + qosTuningImpact*float64(d.peers.medianRTT())) + rtt := time.Duration((1-qosTuningImpact)*float64(atomic.LoadUint64(&d.rttEstimate)) + qosTuningImpact*float64(d.peers.medianRTT())) atomic.StoreUint64(&d.rttEstimate, uint64(rtt)) // A new RTT cycle passed, increase our confidence in the estimated RTT diff --git a/eth/downloader/fakepeer.go b/eth/downloader/fakepeer.go index ebdb9c3342..b45acff7d0 100644 --- a/eth/downloader/fakepeer.go +++ b/eth/downloader/fakepeer.go @@ -62,7 +62,7 @@ func (p *FakePeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, number := origin.Number.Uint64() headers = append(headers, origin) if reverse { - for i := 0; i < int(skip)+1; i++ { + for i := 0; i <= skip; i++ { if header := p.hc.GetHeader(hash, number); header != nil { hash = header.ParentHash number-- diff --git a/eth/filters/filter.go b/eth/filters/filter.go index d16af84ee8..e208f8f38e 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -206,7 +206,7 @@ func (f *Filter) checkMatches(ctx context.Context, header *types.Header) (logs [ } var unfiltered []*types.Log for _, receipt := range receipts { - unfiltered = append(unfiltered, ([]*types.Log)(receipt.Logs)...) + unfiltered = append(unfiltered, receipt.Logs...) } logs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics) if len(logs) > 0 { diff --git a/les/peer.go b/les/peer.go index 524690e2f5..04d747a6b3 100644 --- a/les/peer.go +++ b/les/peer.go @@ -400,7 +400,7 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis var send keyValueList send = send.add("protocolVersion", uint64(p.version)) - send = send.add("networkId", uint64(p.network)) + send = send.add("networkId", p.network) send = send.add("headTd", td) send = send.add("headHash", head) send = send.add("headNum", headNum) diff --git a/metrics/metrics.go b/metrics/metrics.go index da2cdbc53c..afdfd89fa7 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -112,10 +112,10 @@ func CollectProcessMetrics(refresh time.Duration) { memPauses.Mark(int64(memstats[i%2].PauseTotalNs - memstats[(i-1)%2].PauseTotalNs)) if ReadDiskStats(diskstats[i%2]) == nil { - diskReads.Mark(int64(diskstats[i%2].ReadCount - diskstats[(i-1)%2].ReadCount)) - diskReadBytes.Mark(int64(diskstats[i%2].ReadBytes - diskstats[(i-1)%2].ReadBytes)) - diskWrites.Mark(int64(diskstats[i%2].WriteCount - diskstats[(i-1)%2].WriteCount)) - diskWriteBytes.Mark(int64(diskstats[i%2].WriteBytes - diskstats[(i-1)%2].WriteBytes)) + diskReads.Mark(diskstats[i%2].ReadCount - diskstats[(i-1)%2].ReadCount) + diskReadBytes.Mark(diskstats[i%2].ReadBytes - diskstats[(i-1)%2].ReadBytes) + diskWrites.Mark(diskstats[i%2].WriteCount - diskstats[(i-1)%2].WriteCount) + diskWriteBytes.Mark(diskstats[i%2].WriteBytes - diskstats[(i-1)%2].WriteBytes) } time.Sleep(refresh) } diff --git a/mobile/interface.go b/mobile/interface.go index 72958e66a2..ac0c26088a 100644 --- a/mobile/interface.go +++ b/mobile/interface.go @@ -59,7 +59,7 @@ func (i *Interface) SetInt64(n int64) { i.object = &n } func (i *Interface) SetUint8(bigint *BigInt) { n := uint8(bigint.bigint.Uint64()); i.object = &n } func (i *Interface) SetUint16(bigint *BigInt) { n := uint16(bigint.bigint.Uint64()); i.object = &n } func (i *Interface) SetUint32(bigint *BigInt) { n := uint32(bigint.bigint.Uint64()); i.object = &n } -func (i *Interface) SetUint64(bigint *BigInt) { n := uint64(bigint.bigint.Uint64()); i.object = &n } +func (i *Interface) SetUint64(bigint *BigInt) { n := bigint.bigint.Uint64(); i.object = &n } func (i *Interface) SetBigInt(bigint *BigInt) { i.object = &bigint.bigint } func (i *Interface) SetBigInts(bigints *BigInts) { i.object = &bigints.bigints } diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 2f5a26c34c..ec4eb94ad5 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -427,7 +427,7 @@ func (tab *Table) bondall(nodes []*Node) (result []*Node) { rc := make(chan *Node, len(nodes)) for i := range nodes { go func(n *Node) { - nn, _ := tab.bond(false, n.ID, n.addr(), uint16(n.TCP)) + nn, _ := tab.bond(false, n.ID, n.addr(), n.TCP) rc <- nn }(nodes[i]) } diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index d3eced1980..32b5f80a7c 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -238,7 +238,7 @@ func (self *manifestTrie) addEntry(entry *manifestTrieEntry, quitC chan bool) { return } - b := byte(entry.Path[0]) + b := entry.Path[0] oldentry := self.entries[b] if (oldentry == nil) || (oldentry.Path == entry.Path && oldentry.ContentType != ManifestType) { self.entries[b] = entry @@ -294,7 +294,7 @@ func (self *manifestTrie) deleteEntry(path string, quitC chan bool) { return } - b := byte(path[0]) + b := path[0] entry := self.entries[b] if entry == nil { return @@ -425,7 +425,7 @@ func (self *manifestTrie) findPrefixOf(path string, quitC chan bool) (entry *man } //see if first char is in manifest entries - b := byte(path[0]) + b := path[0] entry = self.entries[b] if entry == nil { return self.entries[256], 0 diff --git a/swarm/fuse/fuse_file.go b/swarm/fuse/fuse_file.go index 32c85d02f7..c94a0773f5 100644 --- a/swarm/fuse/fuse_file.go +++ b/swarm/fuse/fuse_file.go @@ -19,15 +19,16 @@ package fuse import ( - "bazil.org/fuse" - "bazil.org/fuse/fs" "errors" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/storage" - "golang.org/x/net/context" "io" "os" "sync" + + "bazil.org/fuse" + "bazil.org/fuse/fs" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/swarm/storage" + "golang.org/x/net/context" ) const ( @@ -87,7 +88,7 @@ func (file *SwarmFile) Attr(ctx context.Context, a *fuse.Attr) error { if err != nil { log.Warn("Couldnt get size of file %s : %v", file.path, err) } - file.fileSize = int64(size) + file.fileSize = size } a.Size = uint64(file.fileSize) return nil diff --git a/swarm/network/depo.go b/swarm/network/depo.go index 8695bf5d98..17540d2f9f 100644 --- a/swarm/network/depo.go +++ b/swarm/network/depo.go @@ -55,7 +55,7 @@ func (self *Depo) HandleUnsyncedKeysMsg(req *unsyncedKeysMsgData, p *peer) error var err error for _, req := range unsynced { // skip keys that are found, - chunk, err = self.localStore.Get(storage.Key(req.Key[:])) + chunk, err = self.localStore.Get(req.Key[:]) if err != nil || chunk.SData == nil { missing = append(missing, req) } diff --git a/swarm/network/kademlia/address.go b/swarm/network/kademlia/address.go index 16c5ce5322..4c38a846f9 100644 --- a/swarm/network/kademlia/address.go +++ b/swarm/network/kademlia/address.go @@ -67,7 +67,7 @@ func proximity(one, other Address) (ret int) { for i := 0; i < len(one); i++ { oxo := one[i] ^ other[i] for j := 0; j < 8; j++ { - if (uint8(oxo)>>uint8(7-j))&0x01 != 0 { + if (oxo>>uint8(7-j))&0x01 != 0 { return i*8 + j } } diff --git a/swarm/network/kademlia/kaddb.go b/swarm/network/kademlia/kaddb.go index 3e4b261fde..cb0869467e 100644 --- a/swarm/network/kademlia/kaddb.go +++ b/swarm/network/kademlia/kaddb.go @@ -211,12 +211,12 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe } // if node is scheduled to connect - if time.Time(node.After).After(time.Now()) { + if node.After.After(time.Now()) { log.Debug(fmt.Sprintf("kaddb record %v (PO%03d:%d) skipped. seen at %v (%v ago), scheduled at %v", node.Addr, po, cursor, node.Seen, delta, node.After)) continue ROW } - delta = time.Since(time.Time(node.Seen)) + delta = time.Since(node.Seen) if delta < self.initialRetryInterval { delta = self.initialRetryInterval } @@ -230,7 +230,7 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe log.Debug(fmt.Sprintf("kaddb record %v (PO%03d:%d) ready to be tried. seen at %v (%v ago), scheduled at %v", node.Addr, po, cursor, node.Seen, delta, node.After)) // scheduling next check - interval = time.Duration(delta * time.Duration(self.connRetryExp)) + interval = delta * time.Duration(self.connRetryExp) after = time.Now().Add(interval) log.Debug(fmt.Sprintf("kaddb record %v (PO%03d:%d) selected as candidate connection %v. seen at %v (%v ago), selectable since %v, retry after %v (in %v)", node.Addr, po, cursor, rounds, node.Seen, delta, node.After, after, interval)) diff --git a/swarm/network/protocol.go b/swarm/network/protocol.go index 2f880df570..a418c1dbbd 100644 --- a/swarm/network/protocol.go +++ b/swarm/network/protocol.go @@ -309,7 +309,7 @@ func (self *bzz) handleStatus() (err error) { Version: uint64(Version), ID: "honey", Addr: self.selfAddr(), - NetworkId: uint64(self.NetworkId), + NetworkId: self.NetworkId, Swap: &bzzswap.SwapProfile{ Profile: self.swapParams.Profile, PayProfile: self.swapParams.PayProfile, diff --git a/swarm/network/syncer.go b/swarm/network/syncer.go index a3814e4232..d76af022c1 100644 --- a/swarm/network/syncer.go +++ b/swarm/network/syncer.go @@ -378,7 +378,7 @@ func (self *syncer) syncHistory(state *syncState) chan interface{} { } select { // blocking until history channel is read from - case history <- storage.Key(key): + case history <- key: n++ log.Trace(fmt.Sprintf("syncer[%v]: history: %v (%v keys)", self.key.Log(), key.Log(), n)) state.Latest = key diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go index 8c0d62cbe2..98cd6e75ea 100644 --- a/swarm/storage/chunker.go +++ b/swarm/storage/chunker.go @@ -205,9 +205,9 @@ func (self *TreeChunker) split(depth int, treeSize int64, key Key, data io.Reade } // dept > 0 // intermediate chunk containing child nodes hashes - branchCnt := int64((size + treeSize - 1) / treeSize) + branchCnt := (size + treeSize - 1) / treeSize - var chunk []byte = make([]byte, branchCnt*self.hashSize+8) + var chunk = make([]byte, branchCnt*self.hashSize+8) var pos, i int64 binary.LittleEndian.PutUint64(chunk[0:8], uint64(size)) diff --git a/swarm/storage/memstore.go b/swarm/storage/memstore.go index 155dd00882..3cb25ac625 100644 --- a/swarm/storage/memstore.go +++ b/swarm/storage/memstore.go @@ -78,7 +78,7 @@ type memTree struct { func newMemTree(b uint, parent *memTree, pidx uint) (node *memTree) { node = new(memTree) node.bits = b - node.width = 1 << uint(b) + node.width = 1 << b node.subtree = make([]*memTree, node.width) node.access = make([]uint64, node.width-1) node.parent = parent diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go index 42b83583d4..5de385dcbe 100644 --- a/swarm/storage/pyramid.go +++ b/swarm/storage/pyramid.go @@ -327,7 +327,7 @@ func (self *PyramidChunker) loadTree(chunkLevel [][]*TreeEntry, key Key, chunkC // Add the root chunk entry branchCount := int64(len(chunk.SData)-8) / self.hashSize newEntry := &TreeEntry{ - level: int(depth - 1), + level: depth - 1, branchCount: branchCount, subtreeSize: uint64(chunk.Size), chunk: chunk.SData, @@ -352,7 +352,7 @@ func (self *PyramidChunker) loadTree(chunkLevel [][]*TreeEntry, key Key, chunkC } bewBranchCount := int64(len(newChunk.SData)-8) / self.hashSize newEntry := &TreeEntry{ - level: int(lvl - 1), + level: lvl - 1, branchCount: bewBranchCount, subtreeSize: uint64(newChunk.Size), chunk: newChunk.SData, diff --git a/whisper/whisperv5/topic.go b/whisper/whisperv5/topic.go index d1996c4604..c4ea67eefa 100644 --- a/whisper/whisperv5/topic.go +++ b/whisper/whisperv5/topic.go @@ -40,8 +40,8 @@ func BytesToTopic(b []byte) (t TopicType) { } // String converts a topic byte array to a string representation. -func (topic *TopicType) String() string { - return string(common.ToHex(topic[:])) +func (t *TopicType) String() string { + return common.ToHex(t[:]) } // MarshalText returns the hex representation of t. diff --git a/whisper/whisperv5/whisper.go b/whisper/whisperv5/whisper.go index d09246f699..85849ccce4 100644 --- a/whisper/whisperv5/whisper.go +++ b/whisper/whisperv5/whisper.go @@ -171,7 +171,7 @@ func (w *Whisper) SetMaxMessageSize(size uint32) error { if size > MaxMessageSize { return fmt.Errorf("message size too large [%d>%d]", size, MaxMessageSize) } - w.settings.Store(maxMsgSizeIdx, uint32(size)) + w.settings.Store(maxMsgSizeIdx, size) return nil } diff --git a/whisper/whisperv6/topic.go b/whisper/whisperv6/topic.go index 5ef7f69392..bf5da01e34 100644 --- a/whisper/whisperv6/topic.go +++ b/whisper/whisperv6/topic.go @@ -40,8 +40,8 @@ func BytesToTopic(b []byte) (t TopicType) { } // String converts a topic byte array to a string representation. -func (topic *TopicType) String() string { - return string(common.ToHex(topic[:])) +func (t *TopicType) String() string { + return common.ToHex(t[:]) } // MarshalText returns the hex representation of t. diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go index 553ac3f000..e2b884f3d4 100644 --- a/whisper/whisperv6/whisper.go +++ b/whisper/whisperv6/whisper.go @@ -171,7 +171,7 @@ func (w *Whisper) SetMaxMessageSize(size uint32) error { if size > MaxMessageSize { return fmt.Errorf("message size too large [%d>%d]", size, MaxMessageSize) } - w.settings.Store(maxMsgSizeIdx, uint32(size)) + w.settings.Store(maxMsgSizeIdx, size) return nil } From 5d895db2fd9e6c381f5696f84b1b64d21df9d337 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 10 Nov 2017 02:54:48 +0100 Subject: [PATCH 247/272] vendor: add github.com/stretchr/testify test dependency github.com/stretchr/testify is a useful library for doing assertion in tests. It makes assertions in test more less verbose and more comfortable to read and use. --- vendor/github.com/pmezard/go-difflib/LICENSE | 27 + .../pmezard/go-difflib/difflib/difflib.go | 772 +++++++++++ vendor/github.com/stretchr/testify/LICENSE | 22 + .../testify/assert/assertion_format.go | 379 ++++++ .../testify/assert/assertion_format.go.tmpl | 4 + .../testify/assert/assertion_forward.go | 746 ++++++++++ .../testify/assert/assertion_forward.go.tmpl | 4 + .../stretchr/testify/assert/assertions.go | 1208 +++++++++++++++++ .../github.com/stretchr/testify/assert/doc.go | 45 + .../stretchr/testify/assert/errors.go | 10 + .../testify/assert/forward_assertions.go | 16 + .../testify/assert/http_assertions.go | 127 ++ .../stretchr/testify/require/doc.go | 28 + .../testify/require/forward_requirements.go | 16 + .../stretchr/testify/require/require.go | 911 +++++++++++++ .../stretchr/testify/require/require.go.tmpl | 6 + .../testify/require/require_forward.go | 747 ++++++++++ .../testify/require/require_forward.go.tmpl | 4 + .../stretchr/testify/require/requirements.go | 9 + vendor/vendor.json | 18 + 20 files changed, 5099 insertions(+) create mode 100644 vendor/github.com/pmezard/go-difflib/LICENSE create mode 100644 vendor/github.com/pmezard/go-difflib/difflib/difflib.go create mode 100644 vendor/github.com/stretchr/testify/LICENSE create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_forward.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/assert/assertions.go create mode 100644 vendor/github.com/stretchr/testify/assert/doc.go create mode 100644 vendor/github.com/stretchr/testify/assert/errors.go create mode 100644 vendor/github.com/stretchr/testify/assert/forward_assertions.go create mode 100644 vendor/github.com/stretchr/testify/assert/http_assertions.go create mode 100644 vendor/github.com/stretchr/testify/require/doc.go create mode 100644 vendor/github.com/stretchr/testify/require/forward_requirements.go create mode 100644 vendor/github.com/stretchr/testify/require/require.go create mode 100644 vendor/github.com/stretchr/testify/require/require.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/requirements.go diff --git a/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/pmezard/go-difflib/LICENSE new file mode 100644 index 0000000000..c67dad612a --- /dev/null +++ b/vendor/github.com/pmezard/go-difflib/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013, Patrick Mezard +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + The names of its contributors may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go new file mode 100644 index 0000000000..003e99fadb --- /dev/null +++ b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go @@ -0,0 +1,772 @@ +// Package difflib is a partial port of Python difflib module. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// The following class and functions have been ported: +// +// - SequenceMatcher +// +// - unified_diff +// +// - context_diff +// +// Getting unified diffs was the main goal of the port. Keep in mind this code +// is mostly suitable to output text differences in a human friendly way, there +// are no guarantees generated diffs are consumable by patch(1). +package difflib + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "

" lines in HTML files). That may be +// because this is the only method of the 3 that has a *concept* of +// "junk" . +// +// Timing: Basic R-O is cubic time worst case and quadratic time expected +// case. SequenceMatcher is quadratic time for the worst case and has +// expected-case behavior dependent in a complicated way on how many +// elements the sequences have in common; best case time is linear. +type SequenceMatcher struct { + a []string + b []string + b2j map[string][]int + IsJunk func(string) bool + autoJunk bool + bJunk map[string]struct{} + matchingBlocks []Match + fullBCount map[string]int + bPopular map[string]struct{} + opCodes []OpCode +} + +func NewMatcher(a, b []string) *SequenceMatcher { + m := SequenceMatcher{autoJunk: true} + m.SetSeqs(a, b) + return &m +} + +func NewMatcherWithJunk(a, b []string, autoJunk bool, + isJunk func(string) bool) *SequenceMatcher { + + m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} + m.SetSeqs(a, b) + return &m +} + +// Set two sequences to be compared. +func (m *SequenceMatcher) SetSeqs(a, b []string) { + m.SetSeq1(a) + m.SetSeq2(b) +} + +// Set the first sequence to be compared. The second sequence to be compared is +// not changed. +// +// SequenceMatcher computes and caches detailed information about the second +// sequence, so if you want to compare one sequence S against many sequences, +// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other +// sequences. +// +// See also SetSeqs() and SetSeq2(). +func (m *SequenceMatcher) SetSeq1(a []string) { + if &a == &m.a { + return + } + m.a = a + m.matchingBlocks = nil + m.opCodes = nil +} + +// Set the second sequence to be compared. The first sequence to be compared is +// not changed. +func (m *SequenceMatcher) SetSeq2(b []string) { + if &b == &m.b { + return + } + m.b = b + m.matchingBlocks = nil + m.opCodes = nil + m.fullBCount = nil + m.chainB() +} + +func (m *SequenceMatcher) chainB() { + // Populate line -> index mapping + b2j := map[string][]int{} + for i, s := range m.b { + indices := b2j[s] + indices = append(indices, i) + b2j[s] = indices + } + + // Purge junk elements + m.bJunk = map[string]struct{}{} + if m.IsJunk != nil { + junk := m.bJunk + for s, _ := range b2j { + if m.IsJunk(s) { + junk[s] = struct{}{} + } + } + for s, _ := range junk { + delete(b2j, s) + } + } + + // Purge remaining popular elements + popular := map[string]struct{}{} + n := len(m.b) + if m.autoJunk && n >= 200 { + ntest := n/100 + 1 + for s, indices := range b2j { + if len(indices) > ntest { + popular[s] = struct{}{} + } + } + for s, _ := range popular { + delete(b2j, s) + } + } + m.bPopular = popular + m.b2j = b2j +} + +func (m *SequenceMatcher) isBJunk(s string) bool { + _, ok := m.bJunk[s] + return ok +} + +// Find longest matching block in a[alo:ahi] and b[blo:bhi]. +// +// If IsJunk is not defined: +// +// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi +// and for all (i',j',k') meeting those conditions, +// k >= k' +// i <= i' +// and if i == i', j <= j' +// +// In other words, of all maximal matching blocks, return one that +// starts earliest in a, and of all those maximal matching blocks that +// start earliest in a, return the one that starts earliest in b. +// +// If IsJunk is defined, first the longest matching block is +// determined as above, but with the additional restriction that no +// junk element appears in the block. Then that block is extended as +// far as possible by matching (only) junk elements on both sides. So +// the resulting block never matches on junk except as identical junk +// happens to be adjacent to an "interesting" match. +// +// If no blocks match, return (alo, blo, 0). +func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { + // CAUTION: stripping common prefix or suffix would be incorrect. + // E.g., + // ab + // acab + // Longest matching block is "ab", but if common prefix is + // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + // strip, so ends up claiming that ab is changed to acab by + // inserting "ca" in the middle. That's minimal but unintuitive: + // "it's obvious" that someone inserted "ac" at the front. + // Windiff ends up at the same place as diff, but by pairing up + // the unique 'b's and then matching the first two 'a's. + besti, bestj, bestsize := alo, blo, 0 + + // find longest junk-free match + // during an iteration of the loop, j2len[j] = length of longest + // junk-free match ending with a[i-1] and b[j] + j2len := map[int]int{} + for i := alo; i != ahi; i++ { + // look at all instances of a[i] in b; note that because + // b2j has no junk keys, the loop is skipped if a[i] is junk + newj2len := map[int]int{} + for _, j := range m.b2j[m.a[i]] { + // a[i] matches b[j] + if j < blo { + continue + } + if j >= bhi { + break + } + k := j2len[j-1] + 1 + newj2len[j] = k + if k > bestsize { + besti, bestj, bestsize = i-k+1, j-k+1, k + } + } + j2len = newj2len + } + + // Extend the best by non-junk elements on each end. In particular, + // "popular" non-junk elements aren't in b2j, which greatly speeds + // the inner loop above, but also means "the best" match so far + // doesn't contain any junk *or* popular non-junk elements. + for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + !m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + // Now that we have a wholly interesting match (albeit possibly + // empty!), we may as well suck up the matching junk on each + // side of it too. Can't think of a good reason not to, and it + // saves post-processing the (possibly considerable) expense of + // figuring out what to do with it. In the case of an empty + // interesting match, this is clearly the right thing to do, + // because no other kind of match is possible in the regions. + for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + return Match{A: besti, B: bestj, Size: bestsize} +} + +// Return list of triples describing matching subsequences. +// +// Each triple is of the form (i, j, n), and means that +// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in +// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are +// adjacent triples in the list, and the second is not the last triple in the +// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe +// adjacent equal blocks. +// +// The last triple is a dummy, (len(a), len(b), 0), and is the only +// triple with n==0. +func (m *SequenceMatcher) GetMatchingBlocks() []Match { + if m.matchingBlocks != nil { + return m.matchingBlocks + } + + var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match + matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { + match := m.findLongestMatch(alo, ahi, blo, bhi) + i, j, k := match.A, match.B, match.Size + if match.Size > 0 { + if alo < i && blo < j { + matched = matchBlocks(alo, i, blo, j, matched) + } + matched = append(matched, match) + if i+k < ahi && j+k < bhi { + matched = matchBlocks(i+k, ahi, j+k, bhi, matched) + } + } + return matched + } + matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) + + // It's possible that we have adjacent equal blocks in the + // matching_blocks list now. + nonAdjacent := []Match{} + i1, j1, k1 := 0, 0, 0 + for _, b := range matched { + // Is this block adjacent to i1, j1, k1? + i2, j2, k2 := b.A, b.B, b.Size + if i1+k1 == i2 && j1+k1 == j2 { + // Yes, so collapse them -- this just increases the length of + // the first block by the length of the second, and the first + // block so lengthened remains the block to compare against. + k1 += k2 + } else { + // Not adjacent. Remember the first block (k1==0 means it's + // the dummy we started with), and make the second block the + // new block to compare against. + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + i1, j1, k1 = i2, j2, k2 + } + } + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + + nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) + m.matchingBlocks = nonAdjacent + return m.matchingBlocks +} + +// Return list of 5-tuples describing how to turn a into b. +// +// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple +// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the +// tuple preceding it, and likewise for j1 == the previous j2. +// +// The tags are characters, with these meanings: +// +// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] +// +// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. +// +// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. +// +// 'e' (equal): a[i1:i2] == b[j1:j2] +func (m *SequenceMatcher) GetOpCodes() []OpCode { + if m.opCodes != nil { + return m.opCodes + } + i, j := 0, 0 + matching := m.GetMatchingBlocks() + opCodes := make([]OpCode, 0, len(matching)) + for _, m := range matching { + // invariant: we've pumped out correct diffs to change + // a[:i] into b[:j], and the next matching block is + // a[ai:ai+size] == b[bj:bj+size]. So we need to pump + // out a diff to change a[i:ai] into b[j:bj], pump out + // the matching block, and move (i,j) beyond the match + ai, bj, size := m.A, m.B, m.Size + tag := byte(0) + if i < ai && j < bj { + tag = 'r' + } else if i < ai { + tag = 'd' + } else if j < bj { + tag = 'i' + } + if tag > 0 { + opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) + } + i, j = ai+size, bj+size + // the list of matching blocks is terminated by a + // sentinel with size 0 + if size > 0 { + opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) + } + } + m.opCodes = opCodes + return m.opCodes +} + +// Isolate change clusters by eliminating ranges with no changes. +// +// Return a generator of groups with up to n lines of context. +// Each group is in the same format as returned by GetOpCodes(). +func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { + if n < 0 { + n = 3 + } + codes := m.GetOpCodes() + if len(codes) == 0 { + codes = []OpCode{OpCode{'e', 0, 1, 0, 1}} + } + // Fixup leading and trailing groups if they show no changes. + if codes[0].Tag == 'e' { + c := codes[0] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} + } + if codes[len(codes)-1].Tag == 'e' { + c := codes[len(codes)-1] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} + } + nn := n + n + groups := [][]OpCode{} + group := []OpCode{} + for _, c := range codes { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + // End the current group and start a new one whenever + // there is a large range with no changes. + if c.Tag == 'e' && i2-i1 > nn { + group = append(group, OpCode{c.Tag, i1, min(i2, i1+n), + j1, min(j2, j1+n)}) + groups = append(groups, group) + group = []OpCode{} + i1, j1 = max(i1, i2-n), max(j1, j2-n) + } + group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) + } + if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { + groups = append(groups, group) + } + return groups +} + +// Return a measure of the sequences' similarity (float in [0,1]). +// +// Where T is the total number of elements in both sequences, and +// M is the number of matches, this is 2.0*M / T. +// Note that this is 1 if the sequences are identical, and 0 if +// they have nothing in common. +// +// .Ratio() is expensive to compute if you haven't already computed +// .GetMatchingBlocks() or .GetOpCodes(), in which case you may +// want to try .QuickRatio() or .RealQuickRation() first to get an +// upper bound. +func (m *SequenceMatcher) Ratio() float64 { + matches := 0 + for _, m := range m.GetMatchingBlocks() { + matches += m.Size + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() relatively quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute. +func (m *SequenceMatcher) QuickRatio() float64 { + // viewing a and b as multisets, set matches to the cardinality + // of their intersection; this counts the number of matches + // without regard to order, so is clearly an upper bound + if m.fullBCount == nil { + m.fullBCount = map[string]int{} + for _, s := range m.b { + m.fullBCount[s] = m.fullBCount[s] + 1 + } + } + + // avail[x] is the number of times x appears in 'b' less the + // number of times we've seen it in 'a' so far ... kinda + avail := map[string]int{} + matches := 0 + for _, s := range m.a { + n, ok := avail[s] + if !ok { + n = m.fullBCount[s] + } + avail[s] = n - 1 + if n > 0 { + matches += 1 + } + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() very quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute than either .Ratio() or .QuickRatio(). +func (m *SequenceMatcher) RealQuickRatio() float64 { + la, lb := len(m.a), len(m.b) + return calculateRatio(min(la, lb), la+lb) +} + +// Convert range to the "ed" format +func formatRangeUnified(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 1 { + return fmt.Sprintf("%d", beginning) + } + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + return fmt.Sprintf("%d,%d", beginning, length) +} + +// Unified diff parameters +type UnifiedDiff struct { + A []string // First sequence lines + FromFile string // First file name + FromDate string // First file time + B []string // Second sequence lines + ToFile string // Second file name + ToDate string // Second file time + Eol string // Headers end of line, defaults to LF + Context int // Number of context lines +} + +// Compare two sequences of lines; generate the delta as a unified diff. +// +// Unified diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by 'n' which +// defaults to three. +// +// By default, the diff control lines (those with ---, +++, or @@) are +// created with a trailing newline. This is helpful so that inputs +// created from file.readlines() result in diffs that are suitable for +// file.writelines() since both the inputs and outputs have trailing +// newlines. +// +// For inputs that do not have trailing newlines, set the lineterm +// argument to "" so that the output will be uniformly newline free. +// +// The unidiff format normally has a header for filenames and modification +// times. Any or all of these may be specified using strings for +// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. +// The modification times are normally expressed in the ISO 8601 format. +func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + wf := func(format string, args ...interface{}) error { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + return err + } + ws := func(s string) error { + _, err := buf.WriteString(s) + return err + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) + if err != nil { + return err + } + err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) + if err != nil { + return err + } + } + } + first, last := g[0], g[len(g)-1] + range1 := formatRangeUnified(first.I1, last.I2) + range2 := formatRangeUnified(first.J1, last.J2) + if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { + return err + } + for _, c := range g { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + if c.Tag == 'e' { + for _, line := range diff.A[i1:i2] { + if err := ws(" " + line); err != nil { + return err + } + } + continue + } + if c.Tag == 'r' || c.Tag == 'd' { + for _, line := range diff.A[i1:i2] { + if err := ws("-" + line); err != nil { + return err + } + } + } + if c.Tag == 'r' || c.Tag == 'i' { + for _, line := range diff.B[j1:j2] { + if err := ws("+" + line); err != nil { + return err + } + } + } + } + } + return nil +} + +// Like WriteUnifiedDiff but returns the diff a string. +func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteUnifiedDiff(w, diff) + return string(w.Bytes()), err +} + +// Convert range to the "ed" format. +func formatRangeContext(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + if length <= 1 { + return fmt.Sprintf("%d", beginning) + } + return fmt.Sprintf("%d,%d", beginning, beginning+length-1) +} + +type ContextDiff UnifiedDiff + +// Compare two sequences of lines; generate the delta as a context diff. +// +// Context diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by diff.Context +// which defaults to three. +// +// By default, the diff control lines (those with *** or ---) are +// created with a trailing newline. +// +// For inputs that do not have trailing newlines, set the diff.Eol +// argument to "" so that the output will be uniformly newline free. +// +// The context diff format normally has a header for filenames and +// modification times. Any or all of these may be specified using +// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate. +// The modification times are normally expressed in the ISO 8601 format. +// If not specified, the strings default to blanks. +func WriteContextDiff(writer io.Writer, diff ContextDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + var diffErr error + wf := func(format string, args ...interface{}) { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + if diffErr == nil && err != nil { + diffErr = err + } + } + ws := func(s string) { + _, err := buf.WriteString(s) + if diffErr == nil && err != nil { + diffErr = err + } + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + prefix := map[byte]string{ + 'i': "+ ", + 'd': "- ", + 'r': "! ", + 'e': " ", + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol) + wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol) + } + } + + first, last := g[0], g[len(g)-1] + ws("***************" + diff.Eol) + + range1 := formatRangeContext(first.I1, last.I2) + wf("*** %s ****%s", range1, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'd' { + for _, cc := range g { + if cc.Tag == 'i' { + continue + } + for _, line := range diff.A[cc.I1:cc.I2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + + range2 := formatRangeContext(first.J1, last.J2) + wf("--- %s ----%s", range2, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'i' { + for _, cc := range g { + if cc.Tag == 'd' { + continue + } + for _, line := range diff.B[cc.J1:cc.J2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + } + return diffErr +} + +// Like WriteContextDiff but returns the diff a string. +func GetContextDiffString(diff ContextDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteContextDiff(w, diff) + return string(w.Bytes()), err +} + +// Split a string on "\n" while preserving them. The output can be used +// as input for UnifiedDiff and ContextDiff structures. +func SplitLines(s string) []string { + lines := strings.SplitAfter(s, "\n") + lines[len(lines)-1] += "\n" + return lines +} diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE new file mode 100644 index 0000000000..473b670a7c --- /dev/null +++ b/vendor/github.com/stretchr/testify/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go new file mode 100644 index 0000000000..23838c4cee --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -0,0 +1,379 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { + return Condition(t, comp, append([]interface{}{msg}, args...)...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Contains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Empty(t, object, append([]interface{}{msg}, args...)...) +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { + return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { + return Error(t, err, append([]interface{}{msg}, args...)...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { + return False(t, value, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(t, handler, method, url, values, str) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(t, handler, method, url, values) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { + return Len(t, object, length, append([]interface{}{msg}, args...)...) +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Nil(t, object, append([]interface{}{msg}, args...)...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { + return NoError(t, err, append([]interface{}{msg}, args...)...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotEmpty(t, object, append([]interface{}{msg}, args...)...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotNil(t, object, append([]interface{}{msg}, args...)...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanics(t, f, append([]interface{}{msg}, args...)...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return NotZero(t, i, append([]interface{}{msg}, args...)...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return Panics(t, f, append([]interface{}{msg}, args...)...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { + return True(t, value, append([]interface{}{msg}, args...)...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return Zero(t, i, append([]interface{}{msg}, args...)...) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl new file mode 100644 index 0000000000..c5cc66f430 --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentFormat}} +func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { + return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go new file mode 100644 index 0000000000..fcccbd01c8 --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -0,0 +1,746 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { + return Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { + return Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Containsf(a.t, s, contains, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { + return Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { + return Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { + return EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { + return EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { + return Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { + return Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { + return Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { + return FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { + return FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { + return Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { + return False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { + return Falsef(a.t, value, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContainsf(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContainsf(a.t, handler, method, url, values, str) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(a.t, handler, method, url, values) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPErrorf(a.t, handler, method, url, values) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(a.t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirectf(a.t, handler, method, url, values) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(a.t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccessf(a.t, handler, method, url, values) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { + return JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { + return JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { + return Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { + return Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { + return Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { + return Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { + return NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { + return NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { + return NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { + return NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { + return NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { + return NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { + return NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { + return NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { + return True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { + return Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { + return Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { + return Zerof(a.t, i, msg, args...) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl new file mode 100644 index 0000000000..99f9acfbba --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { + return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go new file mode 100644 index 0000000000..82590507ab --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -0,0 +1,1208 @@ +package assert + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "reflect" + "regexp" + "runtime" + "strings" + "time" + "unicode" + "unicode/utf8" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" +) + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) +} + +// Comparison a custom function that returns true on success and false on failure +type Comparison func() (success bool) + +/* + Helper functions +*/ + +// ObjectsAreEqual determines if two objects are considered equal. +// +// This function does no assertion of any kind. +func ObjectsAreEqual(expected, actual interface{}) bool { + + if expected == nil || actual == nil { + return expected == actual + } + if exp, ok := expected.([]byte); ok { + act, ok := actual.([]byte) + if !ok { + return false + } else if exp == nil || act == nil { + return exp == nil && act == nil + } + return bytes.Equal(exp, act) + } + return reflect.DeepEqual(expected, actual) + +} + +// ObjectsAreEqualValues gets whether two objects are equal, or if their +// values are equal. +func ObjectsAreEqualValues(expected, actual interface{}) bool { + if ObjectsAreEqual(expected, actual) { + return true + } + + actualType := reflect.TypeOf(actual) + if actualType == nil { + return false + } + expectedValue := reflect.ValueOf(expected) + if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { + // Attempt comparison after type conversion + return reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) + } + + return false +} + +/* CallerInfo is necessary because the assert functions use the testing object +internally, causing it to print the file:line of the assert method, rather than where +the problem actually occurred in calling code.*/ + +// CallerInfo returns an array of strings containing the file and line number +// of each stack frame leading from the current test to the assert call that +// failed. +func CallerInfo() []string { + + pc := uintptr(0) + file := "" + line := 0 + ok := false + name := "" + + callers := []string{} + for i := 0; ; i++ { + pc, file, line, ok = runtime.Caller(i) + if !ok { + // The breaks below failed to terminate the loop, and we ran off the + // end of the call stack. + break + } + + // This is a huge edge case, but it will panic if this is the case, see #180 + if file == "" { + break + } + + f := runtime.FuncForPC(pc) + if f == nil { + break + } + name = f.Name() + + // testing.tRunner is the standard library function that calls + // tests. Subtests are called directly by tRunner, without going through + // the Test/Benchmark/Example function that contains the t.Run calls, so + // with subtests we should break when we hit tRunner, without adding it + // to the list of callers. + if name == "testing.tRunner" { + break + } + + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + if len(parts) > 1 { + dir := parts[len(parts)-2] + if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + } + } + + // Drop the package + segments := strings.Split(name, ".") + name = segments[len(segments)-1] + if isTest(name, "Test") || + isTest(name, "Benchmark") || + isTest(name, "Example") { + break + } + } + + return callers +} + +// Stolen from the `go test` tool. +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) + return !unicode.IsLower(rune) +} + +// getWhitespaceString returns a string that is long enough to overwrite the default +// output from the go testing framework. +func getWhitespaceString() string { + + _, file, line, ok := runtime.Caller(1) + if !ok { + return "" + } + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + + return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) + +} + +func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { + if len(msgAndArgs) == 0 || msgAndArgs == nil { + return "" + } + if len(msgAndArgs) == 1 { + return msgAndArgs[0].(string) + } + if len(msgAndArgs) > 1 { + return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + } + return "" +} + +// Aligns the provided message so that all lines after the first line start at the same location as the first line. +// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). +// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the +// basis on which the alignment occurs). +func indentMessageLines(message string, longestLabelLen int) string { + outBuf := new(bytes.Buffer) + + for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { + // no need to align first line because it starts at the correct location (after the label) + if i != 0 { + // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab + outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + } + outBuf.WriteString(scanner.Text()) + } + + return outBuf.String() +} + +type failNower interface { + FailNow() +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + Fail(t, failureMessage, msgAndArgs...) + + // We cannot extend TestingT with FailNow() and + // maintain backwards compatibility, so we fallback + // to panicking when FailNow is not available in + // TestingT. + // See issue #263 + + if t, ok := t.(failNower); ok { + t.FailNow() + } else { + panic("test failed and t is missing `FailNow()`") + } + return false +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + content := []labeledContent{ + {"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")}, + {"Error", failureMessage}, + } + + message := messageFromMsgAndArgs(msgAndArgs...) + if len(message) > 0 { + content = append(content, labeledContent{"Messages", message}) + } + + t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...)) + + return false +} + +type labeledContent struct { + label string + content string +} + +// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: +// +// \r\t{{label}}:{{align_spaces}}\t{{content}}\n +// +// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. +// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this +// alignment is achieved, "\t{{content}}\n" is added for the output. +// +// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. +func labeledOutput(content ...labeledContent) string { + longestLabel := 0 + for _, v := range content { + if len(v.label) > longestLabel { + longestLabel = len(v.label) + } + } + var output string + for _, v := range content { + output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" + } + return output +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if !reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) + } + + return true + +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { + return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) + } + + return true +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if !ObjectsAreEqual(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual: %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// formatUnequalValues takes two values of arbitrary types and returns string +// representations appropriate to be presented to the user. +// +// If the values are not of like type, the returned strings will be prefixed +// with the type name, and the value will be enclosed in parenthesis similar +// to a type conversion in the Go grammar. +func formatUnequalValues(expected, actual interface{}) (e string, a string) { + if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + return fmt.Sprintf("%T(%#v)", expected, expected), + fmt.Sprintf("%T(%#v)", actual, actual) + } + + return fmt.Sprintf("%#v", expected), + fmt.Sprintf("%#v", actual) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual: %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...) + } + + return Equal(t, expected, actual, msgAndArgs...) + +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if !isNil(object) { + return true + } + return Fail(t, "Expected value not to be nil.", msgAndArgs...) +} + +// isNil checks if a specified object is nil or not, without Failing. +func isNil(object interface{}) bool { + if object == nil { + return true + } + + value := reflect.ValueOf(object) + kind := value.Kind() + if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { + return true + } + + return false +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if isNil(object) { + return true + } + return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) +} + +var numericZeros = []interface{}{ + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + float32(0), + float64(0), +} + +// isEmpty gets whether the specified object is considered empty or not. +func isEmpty(object interface{}) bool { + + if object == nil { + return true + } else if object == "" { + return true + } else if object == false { + return true + } + + for _, v := range numericZeros { + if object == v { + return true + } + } + + objValue := reflect.ValueOf(object) + + switch objValue.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + { + return (objValue.Len() == 0) + } + case reflect.Struct: + switch object.(type) { + case time.Time: + return object.(time.Time).IsZero() + } + case reflect.Ptr: + { + if objValue.IsNil() { + return true + } + switch object.(type) { + case *time.Time: + return object.(*time.Time).IsZero() + default: + return false + } + } + } + return false +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := !isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// getLen try to get length of object. +// return (false, 0) if impossible. +func getLen(x interface{}) (ok bool, length int) { + v := reflect.ValueOf(x) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + return true, v.Len() +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { + ok, l := getLen(object) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) + } + + if l != length { + return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) + } + return true +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != true { + return Fail(t, "Should be true", msgAndArgs...) + } + + return true + +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != false { + return Fail(t, "Should be false", msgAndArgs...) + } + + return true + +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if ObjectsAreEqual(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true + +} + +// containsElement try loop over the list check if the list includes the element. +// return (false, false) if impossible. +// return (true, false) if element was not found. +// return (true, true) if element was found. +func includeElement(list interface{}, element interface{}) (ok, found bool) { + + listValue := reflect.ValueOf(list) + elementValue := reflect.ValueOf(element) + defer func() { + if e := recover(); e != nil { + ok = false + found = false + } + }() + + if reflect.TypeOf(list).Kind() == reflect.String { + return true, strings.Contains(listValue.String(), elementValue.String()) + } + + if reflect.TypeOf(list).Kind() == reflect.Map { + mapKeys := listValue.MapKeys() + for i := 0; i < len(mapKeys); i++ { + if ObjectsAreEqual(mapKeys[i].Interface(), element) { + return true, true + } + } + return true, false + } + + for i := 0; i < listValue.Len(); i++ { + if ObjectsAreEqual(listValue.Index(i).Interface(), element) { + return true, true + } + } + return true, false + +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if found { + return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return true // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) + } + } + + return true +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return false // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) +} + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { + result := comp() + if !result { + Fail(t, "Condition failed!", msgAndArgs...) + } + return result +} + +// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics +// methods, and represents a simple func that takes no arguments, and returns nothing. +type PanicTestFunc func() + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message + +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + if panicValue != expected { + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) + } + + return true +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + + dt := expected.Sub(actual) + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +func toFloat(x interface{}) (float64, bool) { + var xf float64 + xok := true + + switch xn := x.(type) { + case uint8: + xf = float64(xn) + case uint16: + xf = float64(xn) + case uint32: + xf = float64(xn) + case uint64: + xf = float64(xn) + case int: + xf = float64(xn) + case int8: + xf = float64(xn) + case int16: + xf = float64(xn) + case int32: + xf = float64(xn) + case int64: + xf = float64(xn) + case float32: + xf = float64(xn) + case float64: + xf = float64(xn) + case time.Duration: + xf = float64(xn) + default: + xok = false + } + + return xf, xok +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + + af, aok := toFloat(expected) + bf, bok := toFloat(actual) + + if !aok || !bok { + return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) + } + + if math.IsNaN(af) { + return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) + } + + if math.IsNaN(bf) { + return Fail(t, fmt.Sprintf("Expected %v with delta %v, but was NaN", expected, delta), msgAndArgs...) + } + + dt := af - bf + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + if !result { + return result + } + } + + return true +} + +func calcRelativeError(expected, actual interface{}) (float64, error) { + af, aok := toFloat(expected) + if !aok { + return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) + } + if af == 0 { + return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") + } + bf, bok := toFloat(actual) + if !bok { + return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) + } + + return math.Abs(af-bf) / math.Abs(af), nil +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + actualEpsilon, err := calcRelativeError(expected, actual) + if err != nil { + return Fail(t, err.Error(), msgAndArgs...) + } + if actualEpsilon > epsilon { + return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ + " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + } + + return true +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon) + if !result { + return result + } + } + + return true +} + +/* + Errors +*/ + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { + if err != nil { + return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + } + + return true +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { + + if err == nil { + return Fail(t, "An error is expected but got nil.", msgAndArgs...) + } + + return true +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { + if !Error(t, theError, msgAndArgs...) { + return false + } + expected := errString + actual := theError.Error() + // don't need to use deep equals here, we know they are both strings + if expected != actual { + return Fail(t, fmt.Sprintf("Error message not equal:\n"+ + "expected: %q\n"+ + "actual: %q", expected, actual), msgAndArgs...) + } + return true +} + +// matchRegexp return true if a specified regexp matches a string. +func matchRegexp(rx interface{}, str interface{}) bool { + + var r *regexp.Regexp + if rr, ok := rx.(*regexp.Regexp); ok { + r = rr + } else { + r = regexp.MustCompile(fmt.Sprint(rx)) + } + + return (r.FindStringIndex(fmt.Sprint(str)) != nil) + +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + + match := matchRegexp(rx, str) + + if !match { + Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) + } + + return match +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + match := matchRegexp(rx, str) + + if match { + Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) + } + + return !match + +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { + var expectedJSONAsInterface, actualJSONAsInterface interface{} + + if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid json.\nJSON parsing error: '%s'", expected, err.Error()), msgAndArgs...) + } + + if err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid json.\nJSON parsing error: '%s'", actual, err.Error()), msgAndArgs...) + } + + return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return "\n\nDiff:\n" + diff +} + +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + +func isFunction(arg interface{}) bool { + if arg == nil { + return false + } + return reflect.TypeOf(arg).Kind() == reflect.Func +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/vendor/github.com/stretchr/testify/assert/doc.go b/vendor/github.com/stretchr/testify/assert/doc.go new file mode 100644 index 0000000000..c9dccc4d6c --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/doc.go @@ -0,0 +1,45 @@ +// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. +// +// Example Usage +// +// The following is a complete example using assert in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// if you assert many times, use the format below: +// +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// assert := assert.New(t) +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(a, b, "The two words should be the same.") +// } +// +// Assertions +// +// Assertions allow you to easily write test code, and are global funcs in the `assert` package. +// All assertion functions take, as the first argument, the `*testing.T` object provided by the +// testing framework. This allows the assertion funcs to write the failings and other details to +// the correct place. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package assert diff --git a/vendor/github.com/stretchr/testify/assert/errors.go b/vendor/github.com/stretchr/testify/assert/errors.go new file mode 100644 index 0000000000..ac9dc9d1d6 --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/errors.go @@ -0,0 +1,10 @@ +package assert + +import ( + "errors" +) + +// AnError is an error instance useful for testing. If the code does not care +// about error specifics, and only needs to return the error for example, this +// error should be used to make the test code more readable. +var AnError = errors.New("assert.AnError general error for testing") diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go new file mode 100644 index 0000000000..9ad56851d9 --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -0,0 +1,16 @@ +package assert + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go new file mode 100644 index 0000000000..ba811c04dd --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -0,0 +1,127 @@ +package assert + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" +) + +// httpCode is a helper that returns HTTP code of the response. It returns -1 and +// an error if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return -1, err + } + handler(w, req) + return w.Code, nil +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent + if !isSuccessCode { + Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isSuccessCode +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect + if !isRedirectCode { + Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isRedirectCode +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isErrorCode := code >= http.StatusBadRequest + if !isErrorCode { + Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isErrorCode +} + +// HTTPBody is a helper that returns HTTP body of the response. It returns +// empty string if building a new request fails. +func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return "" + } + handler(w, req) + return w.Body.String() +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if !contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return contains +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return !contains +} diff --git a/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/stretchr/testify/require/doc.go new file mode 100644 index 0000000000..169de39221 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/doc.go @@ -0,0 +1,28 @@ +// Package require implements the same assertions as the `assert` package but +// stops test execution when a test fails. +// +// Example Usage +// +// The following is a complete example using require in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/require" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// require.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// Assertions +// +// The `require` package have same global functions as in the `assert` package, +// but instead of returning a boolean result they call `t.FailNow()`. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package require diff --git a/vendor/github.com/stretchr/testify/require/forward_requirements.go b/vendor/github.com/stretchr/testify/require/forward_requirements.go new file mode 100644 index 0000000000..ac71d40581 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/forward_requirements.go @@ -0,0 +1,16 @@ +package require + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go new file mode 100644 index 0000000000..2fe0557846 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require.go @@ -0,0 +1,911 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { + if !assert.Condition(t, comp, msgAndArgs...) { + t.FailNow() + } +} + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) { + if !assert.Conditionf(t, comp, msg, args...) { + t.FailNow() + } +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.Contains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.Containsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Empty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Emptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Equal(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { + if !assert.EqualError(t, theError, errString, msgAndArgs...) { + t.FailNow() + } +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { + if !assert.EqualErrorf(t, theError, errString, msg, args...) { + t.FailNow() + } +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.EqualValues(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.EqualValuesf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Equalf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.Error(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Errorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.Errorf(t, err, msg, args...) { + t.FailNow() + } +} + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Exactly(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Exactlyf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.Fail(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.FailNow(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.FailNowf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.Failf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.False(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Falsef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Falsef(t, value, msg, args...) { + t.FailNow() + } +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContainsf(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContainsf(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPError(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPErrorf(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirect(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirectf(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccess(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccessf(t, handler, method, url, values) { + t.FailNow() + } +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.Implements(t, interfaceObject, object, msgAndArgs...) { + t.FailNow() + } +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.Implementsf(t, interfaceObject, object, msg, args...) { + t.FailNow() + } +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.IsType(t, expectedType, object, msgAndArgs...) { + t.FailNow() + } +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.IsTypef(t, expectedType, object, msg, args...) { + t.FailNow() + } +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { + if !assert.JSONEq(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { + if !assert.JSONEqf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { + if !assert.Len(t, object, length, msgAndArgs...) { + t.FailNow() + } +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { + if !assert.Lenf(t, object, length, msg, args...) { + t.FailNow() + } +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Nil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Nilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.NoError(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.NoErrorf(t, err, msg, args...) { + t.FailNow() + } +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.NotContains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.NotContainsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotEmpty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotEmptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.NotEqual(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.NotEqualf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotNil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotNilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.NotPanics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.NotPanicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.NotRegexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.NotRegexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.NotSubset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.NotSubsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.NotZero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.NotZerof(t, i, msg, args...) { + t.FailNow() + } +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.Panics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.PanicsWithValue(t, expected, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.PanicsWithValuef(t, expected, f, msg, args...) { + t.FailNow() + } +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.Panicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.Regexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.Regexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.Subset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.Subsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.True(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Truef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Truef(t, value, msg, args...) { + t.FailNow() + } +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + if !assert.WithinDurationf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.Zero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.Zerof(t, i, msg, args...) { + t.FailNow() + } +} diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/stretchr/testify/require/require.go.tmpl new file mode 100644 index 0000000000..d2c38f6f28 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require.go.tmpl @@ -0,0 +1,6 @@ +{{.Comment}} +func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { + if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { + t.FailNow() + } +} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go new file mode 100644 index 0000000000..c59c3c7b47 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require_forward.go @@ -0,0 +1,747 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { + Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) { + Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + Containsf(a.t, s, contains, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { + Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { + Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { + EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { + EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { + Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { + Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { + Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { + FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) { + FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) { + Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { + False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { + Falsef(a.t, value, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContainsf(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContainsf(a.t, handler, method, url, values, str) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPError(a.t, handler, method, url, values) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPErrorf(a.t, handler, method, url, values) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirect(a.t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirectf(a.t, handler, method, url, values) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccess(a.t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccessf(a.t, handler, method, url, values) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) { + IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { + JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { + JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { + Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { + Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { + Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { + Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { + NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { + NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { + NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { + NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { + NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { + NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { + NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { + NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { + True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { + Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { + Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) { + Zerof(a.t, i, msg, args...) +} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl new file mode 100644 index 0000000000..b93569e0a9 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { + {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/stretchr/testify/require/requirements.go new file mode 100644 index 0000000000..e404f016d1 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/requirements.go @@ -0,0 +1,9 @@ +package require + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl -include-format-funcs diff --git a/vendor/vendor.json b/vendor/vendor.json index daa2f72d3d..8d0d846404 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -261,6 +261,12 @@ "revision": "a37ad39843113264dae84a5d89fcee28f50b35c6", "revisionTime": "2017-09-02T20:46:57Z" }, + { + "checksumSHA1": "LuFv4/jlrmFNnDb/5SCSEPAM9vU=", + "path": "github.com/pmezard/go-difflib/difflib", + "revision": "792786c7400a136282c1664665ae0a8db921c6c2", + "revisionTime": "2016-01-10T10:55:54Z" + }, { "checksumSHA1": "WbbxCn2jUYIL5viqLo0BKXEdPrQ=", "path": "github.com/prometheus/prometheus/util/flock", @@ -339,6 +345,18 @@ "revision": "ed27b6fd65218132ee50cd95f38474a3d8a2cd12", "revisionTime": "2016-06-18T19:32:21Z" }, + { + "checksumSHA1": "mGbTYZ8dHVTiPTTJu3ktp+84pPI=", + "path": "github.com/stretchr/testify/assert", + "revision": "890a5c3458b43e6104ff5da8dfa139d013d77544", + "revisionTime": "2017-07-05T02:17:15Z" + }, + { + "checksumSHA1": "7vs6dSc1PPGBKyzb/SCIyeMJPLQ=", + "path": "github.com/stretchr/testify/require", + "revision": "890a5c3458b43e6104ff5da8dfa139d013d77544", + "revisionTime": "2017-07-05T02:17:15Z" + }, { "checksumSHA1": "yHbyLpI/Meh0DGrmi8x6FrDxxUY=", "path": "github.com/syndtr/goleveldb/leveldb", From f47adc9ea8f16544a023ea9b67d1ed320750c5e7 Mon Sep 17 00:00:00 2001 From: Arba Sasmoyo Date: Mon, 13 Nov 2017 03:00:18 +0700 Subject: [PATCH 248/272] .dockerignore, internal/build: Read git information directly from file (#15458) * .dockerignore, internal/build: Read git information directly from file This commit changes the way of retrieving git commit and branch for build environment from running git command to reading git files directly. This commit also adds required git files into Docker build context. fixes: #15346 * .dockerignore: workaround for including some files in .git --- .dockerignore | 3 +++ internal/build/env.go | 13 ++++++++----- internal/build/util.go | 10 ++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/.dockerignore b/.dockerignore index 07eab07660..751ff2a0c2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,7 @@ **/.git +/.git +!/.git/HEAD +!/.git/refs/heads **/*_test.go build/_workspace diff --git a/internal/build/env.go b/internal/build/env.go index c47681ebed..793242fcf0 100644 --- a/internal/build/env.go +++ b/internal/build/env.go @@ -82,18 +82,21 @@ func Env() Environment { // LocalEnv returns build environment metadata gathered from git. func LocalEnv() Environment { env := applyEnvFlags(Environment{Name: "local", Repo: "ethereum/go-ethereum"}) - if _, err := os.Stat(".git"); err != nil { + head := ReadGitFile("HEAD") + if splits := strings.Split(head, " "); len(splits) == 2 { + head = splits[1] + } else { return env } if env.Commit == "" { - env.Commit = RunGit("rev-parse", "HEAD") + env.Commit = ReadGitFile(head) } if env.Branch == "" { - if b := RunGit("rev-parse", "--abbrev-ref", "HEAD"); b != "HEAD" { - env.Branch = b + if head != "HEAD" { + env.Branch = strings.TrimLeft(head, "refs/heads/") } } - if env.Tag == "" { + if info, err := os.Stat(".git/objects"); err == nil && info.IsDir() && env.Tag == "" { env.Tag = firstLine(RunGit("tag", "-l", "--points-at", "HEAD")) } return env diff --git a/internal/build/util.go b/internal/build/util.go index ade9cbe930..91465c4199 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -25,6 +25,7 @@ import ( "log" "os" "os/exec" + "path" "path/filepath" "runtime" "strings" @@ -88,6 +89,15 @@ func RunGit(args ...string) string { return strings.TrimSpace(stdout.String()) } +// ReadGitFile returns content of file in .git directory. +func ReadGitFile(file string) string { + content, err := ioutil.ReadFile(path.Join(".git", file)) + if err != nil { + return "" + } + return strings.TrimSpace(string(content)) +} + // Render renders the given template file into outputFile. func Render(templateFile, outputFile string, outputPerm os.FileMode, x interface{}) { tpl := template.Must(template.ParseFiles(templateFile)) From cb8bbe70819839e6399c44fff6a75ab3d16b8791 Mon Sep 17 00:00:00 2001 From: Bo Date: Sun, 12 Nov 2017 12:24:42 -0800 Subject: [PATCH 249/272] puppeth: handle encrypted ssh keys (closes #15442) (#15443) * cmd/puppeth: handle encrypted ssh keys * cmd/puppeth: fix unconvert linter error --- cmd/puppeth/ssh.go | 13 +- cmd/puppeth/wizard_network.go | 2 +- .../x/crypto/curve25519/const_amd64.h | 2 +- .../x/crypto/curve25519/const_amd64.s | 2 +- .../x/crypto/curve25519/curve25519.go | 2 +- vendor/golang.org/x/crypto/curve25519/doc.go | 2 +- .../x/crypto/curve25519/freeze_amd64.s | 2 +- .../x/crypto/curve25519/ladderstep_amd64.s | 2 +- .../x/crypto/curve25519/mul_amd64.s | 2 +- .../x/crypto/curve25519/square_amd64.s | 2 +- vendor/golang.org/x/crypto/ed25519/ed25519.go | 8 +- .../openpgp/packet/symmetric_key_encrypted.go | 6 +- vendor/golang.org/x/crypto/scrypt/scrypt.go | 9 +- vendor/golang.org/x/crypto/ssh/buffer.go | 5 +- vendor/golang.org/x/crypto/ssh/certs.go | 34 +- vendor/golang.org/x/crypto/ssh/cipher.go | 6 +- vendor/golang.org/x/crypto/ssh/client_auth.go | 2 +- vendor/golang.org/x/crypto/ssh/connection.go | 2 +- vendor/golang.org/x/crypto/ssh/kex.go | 8 +- vendor/golang.org/x/crypto/ssh/keys.go | 92 +- vendor/golang.org/x/crypto/ssh/server.go | 79 +- vendor/golang.org/x/crypto/ssh/session.go | 20 + .../golang.org/x/crypto/ssh/terminal/util.go | 67 +- .../x/crypto/ssh/terminal/util_bsd.go | 6 +- .../x/crypto/ssh/terminal/util_linux.go | 9 +- .../x/crypto/ssh/terminal/util_windows.go | 99 +- vendor/golang.org/x/crypto/ssh/transport.go | 2 +- vendor/golang.org/x/sys/unix/README.md | 173 + .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 4 +- vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 + vendor/golang.org/x/sys/unix/dev_darwin.go | 24 + vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 + vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 + vendor/golang.org/x/sys/unix/dev_linux.go | 42 + vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 + vendor/golang.org/x/sys/unix/dirent.go | 102 + vendor/golang.org/x/sys/unix/endian_big.go | 9 + vendor/golang.org/x/sys/unix/endian_little.go | 9 + vendor/golang.org/x/sys/unix/env_unix.go | 2 +- vendor/golang.org/x/sys/unix/env_unset.go | 2 +- .../x/sys/unix/errors_freebsd_386.go | 227 + .../x/sys/unix/errors_freebsd_amd64.go | 227 + .../x/sys/unix/errors_freebsd_arm.go | 226 + vendor/golang.org/x/sys/unix/flock.go | 2 - vendor/golang.org/x/sys/unix/gccgo.go | 4 +- vendor/golang.org/x/sys/unix/gccgo_c.c | 2 +- .../x/sys/unix/gccgo_linux_amd64.go | 2 +- .../x/sys/unix/gccgo_linux_sparc64.go | 20 - vendor/golang.org/x/sys/unix/mkall.sh | 166 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 101 +- vendor/golang.org/x/sys/unix/mkpost.go | 62 - vendor/golang.org/x/sys/unix/mksyscall.pl | 12 +- .../x/sys/unix/mksyscall_solaris.pl | 2 +- .../golang.org/x/sys/unix/mksysnum_darwin.pl | 2 +- .../x/sys/unix/mksysnum_dragonfly.pl | 2 +- .../golang.org/x/sys/unix/mksysnum_freebsd.pl | 15 +- .../golang.org/x/sys/unix/mksysnum_linux.pl | 68 - .../golang.org/x/sys/unix/mksysnum_netbsd.pl | 4 +- .../golang.org/x/sys/unix/mksysnum_openbsd.pl | 2 +- .../golang.org/x/sys/unix/openbsd_pledge.go | 38 + vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 + vendor/golang.org/x/sys/unix/race.go | 2 +- vendor/golang.org/x/sys/unix/race0.go | 2 +- .../golang.org/x/sys/unix/sockcmsg_linux.go | 2 +- vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 9 +- vendor/golang.org/x/sys/unix/syscall.go | 24 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 51 +- .../golang.org/x/sys/unix/syscall_darwin.go | 135 +- .../x/sys/unix/syscall_darwin_386.go | 19 +- .../x/sys/unix/syscall_darwin_amd64.go | 21 +- .../x/sys/unix/syscall_darwin_arm.go | 19 +- .../x/sys/unix/syscall_darwin_arm64.go | 19 +- .../x/sys/unix/syscall_dragonfly.go | 115 +- .../x/sys/unix/syscall_dragonfly_amd64.go | 17 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 108 +- .../x/sys/unix/syscall_freebsd_386.go | 17 +- .../x/sys/unix/syscall_freebsd_amd64.go | 17 +- .../x/sys/unix/syscall_freebsd_arm.go | 17 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 329 +- .../x/sys/unix/syscall_linux_386.go | 21 +- .../x/sys/unix/syscall_linux_amd64.go | 17 +- .../x/sys/unix/syscall_linux_arm.go | 17 +- .../x/sys/unix/syscall_linux_arm64.go | 24 +- .../x/sys/unix/syscall_linux_mips64x.go | 29 +- .../x/sys/unix/syscall_linux_mipsx.go | 21 +- .../x/sys/unix/syscall_linux_ppc64x.go | 19 +- .../x/sys/unix/syscall_linux_s390x.go | 17 +- .../x/sys/unix/syscall_linux_sparc64.go | 35 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 89 +- .../x/sys/unix/syscall_netbsd_386.go | 17 +- .../x/sys/unix/syscall_netbsd_amd64.go | 17 +- .../x/sys/unix/syscall_netbsd_arm.go | 17 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 90 +- .../x/sys/unix/syscall_openbsd_386.go | 17 +- .../x/sys/unix/syscall_openbsd_amd64.go | 17 +- .../x/sys/unix/syscall_openbsd_arm.go | 33 + .../golang.org/x/sys/unix/syscall_solaris.go | 129 +- .../x/sys/unix/syscall_solaris_amd64.go | 15 +- vendor/golang.org/x/sys/unix/syscall_unix.go | 1 + vendor/golang.org/x/sys/unix/timestruct.go | 62 + vendor/golang.org/x/sys/unix/types_darwin.go | 250 -- .../golang.org/x/sys/unix/types_dragonfly.go | 242 -- vendor/golang.org/x/sys/unix/types_freebsd.go | 353 -- vendor/golang.org/x/sys/unix/types_linux.go | 465 --- vendor/golang.org/x/sys/unix/types_netbsd.go | 232 -- vendor/golang.org/x/sys/unix/types_openbsd.go | 244 -- vendor/golang.org/x/sys/unix/types_solaris.go | 262 -- .../x/sys/unix/zerrors_darwin_386.go | 192 +- .../x/sys/unix/zerrors_darwin_amd64.go | 192 +- .../x/sys/unix/zerrors_darwin_arm.go | 481 ++- .../x/sys/unix/zerrors_darwin_arm64.go | 192 +- .../x/sys/unix/zerrors_dragonfly_amd64.go | 56 +- .../x/sys/unix/zerrors_freebsd_386.go | 2908 ++++++------- .../x/sys/unix/zerrors_freebsd_amd64.go | 2914 ++++++------- .../x/sys/unix/zerrors_freebsd_arm.go | 2903 ++++++------- .../x/sys/unix/zerrors_linux_386.go | 3386 ++++++++------- .../x/sys/unix/zerrors_linux_amd64.go | 3388 ++++++++------- .../x/sys/unix/zerrors_linux_arm.go | 3315 ++++++++------- .../x/sys/unix/zerrors_linux_arm64.go | 3451 +++++++++------- .../x/sys/unix/zerrors_linux_mips.go | 3362 ++++++++------- .../x/sys/unix/zerrors_linux_mips64.go | 3461 +++++++++------- .../x/sys/unix/zerrors_linux_mips64le.go | 3461 +++++++++------- .../x/sys/unix/zerrors_linux_mipsle.go | 3564 ++++++++-------- .../x/sys/unix/zerrors_linux_ppc64.go | 3594 ++++++++-------- .../x/sys/unix/zerrors_linux_ppc64le.go | 3593 ++++++++-------- .../x/sys/unix/zerrors_linux_s390x.go | 3652 +++++++++-------- .../x/sys/unix/zerrors_linux_sparc64.go | 33 + .../x/sys/unix/zerrors_netbsd_arm.go | 3 + .../x/sys/unix/zerrors_openbsd_arm.go | 1586 +++++++ .../x/sys/unix/zerrors_solaris_amd64.go | 55 +- .../golang.org/x/sys/unix/zptrace386_linux.go | 80 + .../golang.org/x/sys/unix/zptracearm_linux.go | 41 + .../x/sys/unix/zptracemips_linux.go | 50 + .../x/sys/unix/zptracemipsle_linux.go | 50 + .../x/sys/unix/zsyscall_darwin_386.go | 364 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 379 +- .../x/sys/unix/zsyscall_darwin_arm.go | 366 +- .../x/sys/unix/zsyscall_darwin_arm64.go | 364 +- .../x/sys/unix/zsyscall_dragonfly_amd64.go | 217 +- .../x/sys/unix/zsyscall_freebsd_386.go | 409 +- .../x/sys/unix/zsyscall_freebsd_amd64.go | 409 +- .../x/sys/unix/zsyscall_freebsd_arm.go | 409 +- .../x/sys/unix/zsyscall_linux_386.go | 384 +- .../x/sys/unix/zsyscall_linux_amd64.go | 384 +- .../x/sys/unix/zsyscall_linux_arm.go | 384 +- .../x/sys/unix/zsyscall_linux_arm64.go | 395 +- .../x/sys/unix/zsyscall_linux_mips.go | 384 +- .../x/sys/unix/zsyscall_linux_mips64.go | 393 +- .../x/sys/unix/zsyscall_linux_mips64le.go | 393 +- .../x/sys/unix/zsyscall_linux_mipsle.go | 384 +- .../x/sys/unix/zsyscall_linux_ppc64.go | 386 +- .../x/sys/unix/zsyscall_linux_ppc64le.go | 386 +- .../x/sys/unix/zsyscall_linux_s390x.go | 384 +- .../x/sys/unix/zsyscall_linux_sparc64.go | 34 +- .../x/sys/unix/zsyscall_netbsd_386.go | 206 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 206 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 208 +- .../x/sys/unix/zsyscall_openbsd_386.go | 206 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 206 +- .../x/sys/unix/zsyscall_openbsd_arm.go | 1425 +++++++ .../x/sys/unix/zsyscall_solaris_amd64.go | 182 +- ...sctl_openbsd.go => zsysctl_openbsd_386.go} | 0 .../x/sys/unix/zsysctl_openbsd_amd64.go | 270 ++ .../x/sys/unix/zsysctl_openbsd_arm.go | 270 ++ .../x/sys/unix/zsysnum_darwin_386.go | 60 +- .../x/sys/unix/zsysnum_darwin_amd64.go | 60 +- .../x/sys/unix/zsysnum_darwin_arm.go | 120 +- .../x/sys/unix/zsysnum_darwin_arm64.go | 60 +- .../x/sys/unix/zsysnum_dragonfly_amd64.go | 21 +- .../x/sys/unix/zsysnum_freebsd_386.go | 686 ++-- .../x/sys/unix/zsysnum_freebsd_amd64.go | 686 ++-- .../x/sys/unix/zsysnum_freebsd_arm.go | 686 ++-- .../x/sys/unix/zsysnum_linux_386.go | 41 +- .../x/sys/unix/zsysnum_linux_amd64.go | 25 +- .../x/sys/unix/zsysnum_linux_arm.go | 38 +- .../x/sys/unix/zsysnum_linux_arm64.go | 18 +- .../x/sys/unix/zsysnum_linux_mips.go | 28 +- .../x/sys/unix/zsysnum_linux_mips64.go | 12 +- .../x/sys/unix/zsysnum_linux_mips64le.go | 12 +- .../x/sys/unix/zsysnum_linux_mipsle.go | 28 +- .../x/sys/unix/zsysnum_linux_ppc64.go | 14 +- .../x/sys/unix/zsysnum_linux_ppc64le.go | 21 +- .../x/sys/unix/zsysnum_linux_s390x.go | 9 +- .../x/sys/unix/zsysnum_linux_sparc64.go | 2 +- .../x/sys/unix/zsysnum_netbsd_386.go | 1 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 1 + .../x/sys/unix/zsysnum_netbsd_arm.go | 1 + .../x/sys/unix/zsysnum_openbsd_arm.go | 213 + .../x/sys/unix/ztypes_darwin_386.go | 38 +- .../x/sys/unix/ztypes_darwin_amd64.go | 33 +- .../x/sys/unix/ztypes_darwin_arm.go | 33 + .../x/sys/unix/ztypes_darwin_arm64.go | 38 +- .../x/sys/unix/ztypes_dragonfly_amd64.go | 37 +- .../x/sys/unix/ztypes_freebsd_386.go | 99 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 95 +- .../x/sys/unix/ztypes_freebsd_arm.go | 107 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 179 +- .../x/sys/unix/ztypes_linux_amd64.go | 207 +- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 179 +- .../x/sys/unix/ztypes_linux_arm64.go | 209 +- .../x/sys/unix/ztypes_linux_mips.go | 196 +- .../x/sys/unix/ztypes_linux_mips64.go | 204 +- .../x/sys/unix/ztypes_linux_mips64le.go | 204 +- .../x/sys/unix/ztypes_linux_mipsle.go | 196 +- .../x/sys/unix/ztypes_linux_ppc64.go | 211 +- .../x/sys/unix/ztypes_linux_ppc64le.go | 211 +- .../x/sys/unix/ztypes_linux_s390x.go | 179 +- .../x/sys/unix/ztypes_linux_sparc64.go | 23 +- .../x/sys/unix/ztypes_netbsd_386.go | 35 +- .../x/sys/unix/ztypes_netbsd_amd64.go | 35 +- .../x/sys/unix/ztypes_netbsd_arm.go | 35 +- .../x/sys/unix/ztypes_openbsd_386.go | 35 +- .../x/sys/unix/ztypes_openbsd_amd64.go | 35 +- .../x/sys/unix/ztypes_openbsd_arm.go | 465 +++ .../x/sys/unix/ztypes_solaris_amd64.go | 54 +- .../x/sys/windows/asm_windows_386.s | 13 + .../x/sys/windows/asm_windows_amd64.s | 13 + .../golang.org/x/sys/windows/dll_windows.go | 378 ++ vendor/golang.org/x/sys/windows/env_unset.go | 15 + .../golang.org/x/sys/windows/env_windows.go | 25 + vendor/golang.org/x/sys/windows/eventlog.go | 20 + .../golang.org/x/sys/windows/exec_windows.go | 97 + .../x/sys/windows/memory_windows.go | 26 + vendor/golang.org/x/sys/windows/mksyscall.go | 7 + vendor/golang.org/x/sys/windows/race.go | 30 + vendor/golang.org/x/sys/windows/race0.go | 25 + .../x/sys/windows/security_windows.go | 435 ++ vendor/golang.org/x/sys/windows/service.go | 164 + vendor/golang.org/x/sys/windows/str.go | 22 + vendor/golang.org/x/sys/windows/syscall.go | 71 + .../x/sys/windows/syscall_windows.go | 1093 +++++ .../golang.org/x/sys/windows/types_windows.go | 1316 ++++++ .../x/sys/windows/types_windows_386.go | 22 + .../x/sys/windows/types_windows_amd64.go | 22 + .../x/sys/windows/zsyscall_windows.go | 2428 +++++++++++ vendor/vendor.json | 84 +- 238 files changed, 51248 insertions(+), 27691 deletions(-) create mode 100644 vendor/golang.org/x/sys/unix/README.md create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dirent.go create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/mkpost.go delete mode 100755 vendor/golang.org/x/sys/unix/mksysnum_linux.pl create mode 100644 vendor/golang.org/x/sys/unix/openbsd_pledge.go create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go delete mode 100644 vendor/golang.org/x/sys/unix/types_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/types_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/types_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/types_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace386_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptracearm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptracemips_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptracemipsle_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go rename vendor/golang.org/x/sys/unix/{zsysctl_openbsd.go => zsysctl_openbsd_386.go} (100%) create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/windows/asm_windows_386.s create mode 100644 vendor/golang.org/x/sys/windows/asm_windows_amd64.s create mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 vendor/golang.org/x/sys/windows/env_unset.go create mode 100644 vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/race.go create mode 100644 vendor/golang.org/x/sys/windows/race0.go create mode 100644 vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 vendor/golang.org/x/sys/windows/service.go create mode 100644 vendor/golang.org/x/sys/windows/str.go create mode 100644 vendor/golang.org/x/sys/windows/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go diff --git a/cmd/puppeth/ssh.go b/cmd/puppeth/ssh.go index 47378a6063..ec6a1b669a 100644 --- a/cmd/puppeth/ssh.go +++ b/cmd/puppeth/ssh.go @@ -77,7 +77,18 @@ func dial(server string, pubkey []byte) (*sshClient, error) { } else { key, err := ssh.ParsePrivateKey(buf) if err != nil { - log.Warn("Bad SSH key, falling back to passwords", "path", path, "err", err) + fmt.Printf("What's the decryption password for %s? (won't be echoed)\n>", path) + blob, err := terminal.ReadPassword(int(os.Stdin.Fd())) + fmt.Println() + if err != nil { + log.Warn("Couldn't read password", "err", err) + } + key, err := ssh.ParsePrivateKeyWithPassphrase(buf, blob) + if err != nil { + log.Warn("Failed to decrypt SSH key, falling back to passwords", "path", path, "err", err) + } else { + auths = append(auths, ssh.PublicKeys(key)) + } } else { auths = append(auths, ssh.PublicKeys(key)) } diff --git a/cmd/puppeth/wizard_network.go b/cmd/puppeth/wizard_network.go index ff2ff74f58..c20e31fab3 100644 --- a/cmd/puppeth/wizard_network.go +++ b/cmd/puppeth/wizard_network.go @@ -71,7 +71,7 @@ func (w *wizard) makeServer() string { fmt.Println() fmt.Println("Please enter remote server's address:") - // Read and fial the server to ensure docker is present + // Read and dial the server to ensure docker is present input := w.readString() client, err := dial(input, nil) diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.h b/vendor/golang.org/x/crypto/curve25519/const_amd64.h index 80ad2220fd..b3f74162f6 100644 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.h +++ b/vendor/golang.org/x/crypto/curve25519/const_amd64.h @@ -3,6 +3,6 @@ // license that can be found in the LICENSE file. // This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html #define REDMASK51 0x0007FFFFFFFFFFFF diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.s b/vendor/golang.org/x/crypto/curve25519/const_amd64.s index 0ad539885b..ee7b4bd5f8 100644 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/const_amd64.s @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html // +build amd64,!gccgo,!appengine diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go index 2d14c2a78a..cb8fbc57b9 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519.go +++ b/vendor/golang.org/x/crypto/curve25519/curve25519.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// We have a implementation in amd64 assembly so this code is only run on +// We have an implementation in amd64 assembly so this code is only run on // non-amd64 platforms. The amd64 assembly does not support gccgo. // +build !amd64 gccgo appengine diff --git a/vendor/golang.org/x/crypto/curve25519/doc.go b/vendor/golang.org/x/crypto/curve25519/doc.go index ebeea3c2d6..da9b10d9c1 100644 --- a/vendor/golang.org/x/crypto/curve25519/doc.go +++ b/vendor/golang.org/x/crypto/curve25519/doc.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package curve25519 provides an implementation of scalar multiplication on -// the elliptic curve known as curve25519. See http://cr.yp.to/ecdh.html +// the elliptic curve known as curve25519. See https://cr.yp.to/ecdh.html package curve25519 // import "golang.org/x/crypto/curve25519" // basePoint is the x coordinate of the generator of the curve. diff --git a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s index 536479bf62..390816106e 100644 --- a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html // +build amd64,!gccgo,!appengine diff --git a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s index 7074e5cd9d..9e9040b250 100644 --- a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html // +build amd64,!gccgo,!appengine diff --git a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s index b162e65159..5ce80a2e56 100644 --- a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html // +build amd64,!gccgo,!appengine diff --git a/vendor/golang.org/x/crypto/curve25519/square_amd64.s b/vendor/golang.org/x/crypto/curve25519/square_amd64.s index 4e864a83ef..12f73734ff 100644 --- a/vendor/golang.org/x/crypto/curve25519/square_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/square_amd64.s @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html +// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html // +build amd64,!gccgo,!appengine diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go index f1d95674ac..4f26b49b6a 100644 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go @@ -3,20 +3,20 @@ // license that can be found in the LICENSE file. // Package ed25519 implements the Ed25519 signature algorithm. See -// http://ed25519.cr.yp.to/. +// https://ed25519.cr.yp.to/. // // These functions are also compatible with the “Ed25519” function defined in -// https://tools.ietf.org/html/draft-irtf-cfrg-eddsa-05. +// RFC 8032. package ed25519 // This code is a port of the public domain, “ref10” implementation of ed25519 // from SUPERCOP. import ( + "bytes" "crypto" cryptorand "crypto/rand" "crypto/sha512" - "crypto/subtle" "errors" "io" "strconv" @@ -177,5 +177,5 @@ func Verify(publicKey PublicKey, message, sig []byte) bool { var checkR [32]byte R.ToBytes(&checkR) - return subtle.ConstantTimeCompare(sig[:32], checkR[:]) == 1 + return bytes.Equal(sig[:32], checkR[:]) } diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go index 4b1105b6f6..744c2d2c42 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go @@ -88,10 +88,10 @@ func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunc return nil, ske.CipherFunc, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) } plaintextKey = plaintextKey[1:] - if l := len(plaintextKey); l == 0 || l%cipherFunc.blockSize() != 0 { - return nil, cipherFunc, errors.StructuralError("length of decrypted key not a multiple of block size") + if l, cipherKeySize := len(plaintextKey), cipherFunc.KeySize(); l != cipherFunc.KeySize() { + return nil, cipherFunc, errors.StructuralError("length of decrypted key (" + strconv.Itoa(l) + ") " + + "not equal to cipher keysize (" + strconv.Itoa(cipherKeySize) + ")") } - return plaintextKey, cipherFunc, nil } diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go index 7455395cff..ff28aaef6f 100644 --- a/vendor/golang.org/x/crypto/scrypt/scrypt.go +++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go @@ -4,7 +4,7 @@ // Package scrypt implements the scrypt key derivation function as defined in // Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard -// Functions" (http://www.tarsnap.com/scrypt/scrypt.pdf). +// Functions" (https://www.tarsnap.com/scrypt/scrypt.pdf). package scrypt // import "golang.org/x/crypto/scrypt" import ( @@ -220,9 +220,10 @@ func smix(b []byte, r, N int, v, xy []uint32) { // // dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) // -// The recommended parameters for interactive logins as of 2009 are N=16384, -// r=8, p=1. They should be increased as memory latency and CPU parallelism -// increases. Remember to get a good random salt. +// The recommended parameters for interactive logins as of 2017 are N=32768, r=8 +// and p=1. The parameters N, r, and p should be increased as memory latency and +// CPU parallelism increases; consider setting N to the highest power of 2 you +// can derive within 100 milliseconds. Remember to get a good random salt. func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { if N <= 1 || N&(N-1) != 0 { return nil, errors.New("scrypt: N must be > 1 and a power of 2") diff --git a/vendor/golang.org/x/crypto/ssh/buffer.go b/vendor/golang.org/x/crypto/ssh/buffer.go index 6931b5114f..1ab07d078d 100644 --- a/vendor/golang.org/x/crypto/ssh/buffer.go +++ b/vendor/golang.org/x/crypto/ssh/buffer.go @@ -51,13 +51,12 @@ func (b *buffer) write(buf []byte) { } // eof closes the buffer. Reads from the buffer once all -// the data has been consumed will receive os.EOF. -func (b *buffer) eof() error { +// the data has been consumed will receive io.EOF. +func (b *buffer) eof() { b.Cond.L.Lock() b.closed = true b.Cond.Signal() b.Cond.L.Unlock() - return nil } // Read reads data from the internal buffer in buf. Reads will block diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go index 67600e2402..b1f0220781 100644 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ b/vendor/golang.org/x/crypto/ssh/certs.go @@ -251,10 +251,18 @@ type CertChecker struct { // for user certificates. SupportedCriticalOptions []string - // IsAuthority should return true if the key is recognized as - // an authority. This allows for certificates to be signed by other - // certificates. - IsAuthority func(auth PublicKey) bool + // IsUserAuthority should return true if the key is recognized as an + // authority for the given user certificate. This allows for + // certificates to be signed by other certificates. This must be set + // if this CertChecker will be checking user certificates. + IsUserAuthority func(auth PublicKey) bool + + // IsHostAuthority should report whether the key is recognized as + // an authority for this host. This allows for certificates to be + // signed by other keys, and for those other keys to only be valid + // signers for particular hostnames. This must be set if this + // CertChecker will be checking host certificates. + IsHostAuthority func(auth PublicKey, address string) bool // Clock is used for verifying time stamps. If nil, time.Now // is used. @@ -290,8 +298,17 @@ func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) if cert.CertType != HostCert { return fmt.Errorf("ssh: certificate presented as a host key has type %d", cert.CertType) } + if !c.IsHostAuthority(cert.SignatureKey, addr) { + return fmt.Errorf("ssh: no authorities for hostname: %v", addr) + } - return c.CheckCert(addr, cert) + hostname, _, err := net.SplitHostPort(addr) + if err != nil { + return err + } + + // Pass hostname only as principal for host certificates (consistent with OpenSSH) + return c.CheckCert(hostname, cert) } // Authenticate checks a user certificate. Authenticate can be used as @@ -308,6 +325,9 @@ func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permis if cert.CertType != UserCert { return nil, fmt.Errorf("ssh: cert has type %d", cert.CertType) } + if !c.IsUserAuthority(cert.SignatureKey) { + return nil, fmt.Errorf("ssh: certificate signed by unrecognized authority") + } if err := c.CheckCert(conn.User(), cert); err != nil { return nil, err @@ -356,10 +376,6 @@ func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { } } - if !c.IsAuthority(cert.SignatureKey) { - return fmt.Errorf("ssh: certificate signed by unrecognized authority") - } - clock := c.Clock if clock == nil { clock = time.Now diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go index 13484ab4b3..aed2b1f017 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -304,7 +304,7 @@ type gcmCipher struct { buf []byte } -func newGCMCipher(iv, key, macKey []byte) (packetCipher, error) { +func newGCMCipher(iv, key []byte) (packetCipher, error) { c, err := aes.NewCipher(key) if err != nil { return nil, err @@ -392,7 +392,9 @@ func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { c.incIV() padding := plain[0] - if padding < 4 || padding >= 20 { + if padding < 4 { + // padding is a byte, so it automatically satisfies + // the maximum size, which is 255. return nil, fmt.Errorf("ssh: illegal padding %d", padding) } diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go index b882da0863..3acd8d4988 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -349,7 +349,7 @@ func handleAuthResponse(c packetConn) (bool, []string, error) { // both CLI and GUI environments. type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error) -// KeyboardInteractive returns a AuthMethod using a prompt/response +// KeyboardInteractive returns an AuthMethod using a prompt/response // sequence controlled by the server. func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod { return challenge diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go index e786f2f9a2..fd6b0681b5 100644 --- a/vendor/golang.org/x/crypto/ssh/connection.go +++ b/vendor/golang.org/x/crypto/ssh/connection.go @@ -25,7 +25,7 @@ type ConnMetadata interface { // User returns the user ID for this connection. User() string - // SessionID returns the sesson hash, also denoted by H. + // SessionID returns the session hash, also denoted by H. SessionID() []byte // ClientVersion returns the client's version string as hashed diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go index c87fbebfde..f91c2770ed 100644 --- a/vendor/golang.org/x/crypto/ssh/kex.go +++ b/vendor/golang.org/x/crypto/ssh/kex.go @@ -383,8 +383,8 @@ func init() { // 4253 and Oakley Group 2 in RFC 2409. p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF", 16) kexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, + g: new(big.Int).SetInt64(2), + p: p, pMinus1: new(big.Int).Sub(p, bigOne), } @@ -393,8 +393,8 @@ func init() { p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, + g: new(big.Int).SetInt64(2), + p: p, pMinus1: new(big.Int).Sub(p, bigOne), } diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index cf6853232b..b682c1741b 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -367,6 +367,17 @@ func (r *dsaPublicKey) Type() string { return "ssh-dss" } +func checkDSAParams(param *dsa.Parameters) error { + // SSH specifies FIPS 186-2, which only provided a single size + // (1024 bits) DSA key. FIPS 186-3 allows for larger key + // sizes, which would confuse SSH. + if l := param.P.BitLen(); l != 1024 { + return fmt.Errorf("ssh: unsupported DSA key size %d", l) + } + + return nil +} + // parseDSA parses an DSA key according to RFC 4253, section 6.6. func parseDSA(in []byte) (out PublicKey, rest []byte, err error) { var w struct { @@ -377,13 +388,18 @@ func parseDSA(in []byte) (out PublicKey, rest []byte, err error) { return nil, nil, err } + param := dsa.Parameters{ + P: w.P, + Q: w.Q, + G: w.G, + } + if err := checkDSAParams(¶m); err != nil { + return nil, nil, err + } + key := &dsaPublicKey{ - Parameters: dsa.Parameters{ - P: w.P, - Q: w.Q, - G: w.G, - }, - Y: w.Y, + Parameters: param, + Y: w.Y, } return key, w.Rest, nil } @@ -630,19 +646,28 @@ func (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey { } // NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey, -// *ecdsa.PrivateKey or any other crypto.Signer and returns a corresponding -// Signer instance. ECDSA keys must use P-256, P-384 or P-521. +// *ecdsa.PrivateKey or any other crypto.Signer and returns a +// corresponding Signer instance. ECDSA keys must use P-256, P-384 or +// P-521. DSA keys must use parameter size L1024N160. func NewSignerFromKey(key interface{}) (Signer, error) { switch key := key.(type) { case crypto.Signer: return NewSignerFromSigner(key) case *dsa.PrivateKey: - return &dsaPrivateKey{key}, nil + return newDSAPrivateKey(key) default: return nil, fmt.Errorf("ssh: unsupported key type %T", key) } } +func newDSAPrivateKey(key *dsa.PrivateKey) (Signer, error) { + if err := checkDSAParams(&key.PublicKey.Parameters); err != nil { + return nil, err + } + + return &dsaPrivateKey{key}, nil +} + type wrappedSigner struct { signer crypto.Signer pubKey PublicKey @@ -756,6 +781,18 @@ func ParsePrivateKey(pemBytes []byte) (Signer, error) { return NewSignerFromKey(key) } +// ParsePrivateKeyWithPassphrase returns a Signer from a PEM encoded private +// key and passphrase. It supports the same keys as +// ParseRawPrivateKeyWithPassphrase. +func ParsePrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (Signer, error) { + key, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase) + if err != nil { + return nil, err + } + + return NewSignerFromKey(key) +} + // encryptedBlock tells whether a private key is // encrypted by examining its Proc-Type header // for a mention of ENCRYPTED @@ -790,6 +827,43 @@ func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { } } +// ParseRawPrivateKeyWithPassphrase returns a private key decrypted with +// passphrase from a PEM encoded private key. If wrong passphrase, return +// x509.IncorrectPasswordError. +func ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (interface{}, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("ssh: no key found") + } + buf := block.Bytes + + if encryptedBlock(block) { + if x509.IsEncryptedPEMBlock(block) { + var err error + buf, err = x509.DecryptPEMBlock(block, passPhrase) + if err != nil { + if err == x509.IncorrectPasswordError { + return nil, err + } + return nil, fmt.Errorf("ssh: cannot decode encrypted private keys: %v", err) + } + } + } + + switch block.Type { + case "RSA PRIVATE KEY": + return x509.ParsePKCS1PrivateKey(buf) + case "EC PRIVATE KEY": + return x509.ParseECPrivateKey(buf) + case "DSA PRIVATE KEY": + return ParseDSAPrivateKey(buf) + case "OPENSSH PRIVATE KEY": + return parseOpenSSHPrivateKey(buf) + default: + return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) + } +} + // ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as // specified by the OpenSSL DSA man page. func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 8e95acc6ac..8a78b7ca0f 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -14,23 +14,34 @@ import ( ) // The Permissions type holds fine-grained permissions that are -// specific to a user or a specific authentication method for a -// user. Permissions, except for "source-address", must be enforced in -// the server application layer, after successful authentication. The -// Permissions are passed on in ServerConn so a server implementation -// can honor them. +// specific to a user or a specific authentication method for a user. +// The Permissions value for a successful authentication attempt is +// available in ServerConn, so it can be used to pass information from +// the user-authentication phase to the application layer. type Permissions struct { - // Critical options restrict default permissions. Common - // restrictions are "source-address" and "force-command". If - // the server cannot enforce the restriction, or does not - // recognize it, the user should not authenticate. + // CriticalOptions indicate restrictions to the default + // permissions, and are typically used in conjunction with + // user certificates. The standard for SSH certificates + // defines "force-command" (only allow the given command to + // execute) and "source-address" (only allow connections from + // the given address). The SSH package currently only enforces + // the "source-address" critical option. It is up to server + // implementations to enforce other critical options, such as + // "force-command", by checking them after the SSH handshake + // is successful. In general, SSH servers should reject + // connections that specify critical options that are unknown + // or not supported. CriticalOptions map[string]string // Extensions are extra functionality that the server may - // offer on authenticated connections. Common extensions are - // "permit-agent-forwarding", "permit-X11-forwarding". Lack of - // support for an extension does not preclude authenticating a - // user. + // offer on authenticated connections. Lack of support for an + // extension does not preclude authenticating a user. Common + // extensions are "permit-agent-forwarding", + // "permit-X11-forwarding". The Go SSH library currently does + // not act on any extension, and it is up to server + // implementations to honor them. Extensions can be used to + // pass data from the authentication callbacks to the server + // application layer. Extensions map[string]string } @@ -55,9 +66,14 @@ type ServerConfig struct { // attempts to authenticate using a password. PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error) - // PublicKeyCallback, if non-nil, is called when a client attempts public - // key authentication. It must return true if the given public key is - // valid for the given user. For example, see CertChecker.Authenticate. + // PublicKeyCallback, if non-nil, is called when a client + // offers a public key for authentication. It must return a nil error + // if the given public key can be used to authenticate the + // given user. For example, see CertChecker.Authenticate. A + // call to this function does not guarantee that the key + // offered is in fact used to authenticate. To record any data + // depending on the public key, store it inside a + // Permissions.Extensions entry. PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) // KeyboardInteractiveCallback, if non-nil, is called when @@ -147,12 +163,12 @@ type ServerConn struct { // Request and NewChannel channels must be serviced, or the connection // will hang. func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { - if config.MaxAuthTries == 0 { - config.MaxAuthTries = 6 - } - fullConf := *config fullConf.SetDefaults() + if fullConf.MaxAuthTries == 0 { + fullConf.MaxAuthTries = 6 + } + s := &connection{ sshConn: sshConn{conn: c}, } @@ -272,12 +288,30 @@ func checkSourceAddress(addr net.Addr, sourceAddrs string) error { return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) } +// ServerAuthError implements the error interface. It appends any authentication +// errors that may occur, and is returned if all of the authentication methods +// provided by the user failed to authenticate. +type ServerAuthError struct { + // Errors contains authentication errors returned by the authentication + // callback methods. + Errors []error +} + +func (l ServerAuthError) Error() string { + var errs []string + for _, err := range l.Errors { + errs = append(errs, err.Error()) + } + return "[" + strings.Join(errs, ", ") + "]" +} + func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { sessionID := s.transport.getSessionID() var cache pubKeyCache var perms *Permissions authFailures := 0 + var authErrs []error userAuthLoop: for { @@ -296,6 +330,9 @@ userAuthLoop: var userAuthReq userAuthRequestMsg if packet, err := s.transport.readPacket(); err != nil { + if err == io.EOF { + return nil, &ServerAuthError{Errors: authErrs} + } return nil, err } else if err = Unmarshal(packet, &userAuthReq); err != nil { return nil, err @@ -432,6 +469,8 @@ userAuthLoop: authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method) } + authErrs = append(authErrs, authErr) + if config.AuthLogCallback != nil { config.AuthLogCallback(s, userAuthReq.Method, authErr) } diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go index 17e2aa85c1..cc06e03f5c 100644 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ b/vendor/golang.org/x/crypto/ssh/session.go @@ -231,6 +231,26 @@ func (s *Session) RequestSubsystem(subsystem string) error { return err } +// RFC 4254 Section 6.7. +type ptyWindowChangeMsg struct { + Columns uint32 + Rows uint32 + Width uint32 + Height uint32 +} + +// WindowChange informs the remote host about a terminal window dimension change to h rows and w columns. +func (s *Session) WindowChange(h, w int) error { + req := ptyWindowChangeMsg{ + Columns: uint32(w), + Rows: uint32(h), + Width: uint32(w * 8), + Height: uint32(h * 8), + } + _, err := s.ch.SendRequest("window-change", false, Marshal(&req)) + return err +} + // RFC 4254 Section 6.9. type signalMsg struct { Signal string diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go index d019196147..02dad484e5 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -17,40 +17,41 @@ package terminal // import "golang.org/x/crypto/ssh/terminal" import ( - "syscall" - "unsafe" + "golang.org/x/sys/unix" ) // State contains the state of a terminal. type State struct { - termios syscall.Termios + termios unix.Termios } // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd int) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 + _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + return err == nil } // MakeRaw put the terminal connected to the given file descriptor into raw // mode and returns the previous state of the terminal so that it can be // restored. func MakeRaw(fd int) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { return nil, err } - newState := oldState.termios + oldState := State{termios: *termios} + // This attempts to replicate the behaviour documented for cfmakeraw in // the termios(3) manpage. - newState.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON - newState.Oflag &^= syscall.OPOST - newState.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN - newState.Cflag &^= syscall.CSIZE | syscall.PARENB - newState.Cflag |= syscall.CS8 - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { return nil, err } @@ -60,59 +61,55 @@ func MakeRaw(fd int) (*State, error) { // GetState returns the current state of a terminal which may be useful to // restore the terminal after a signal. func GetState(fd int) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { return nil, err } - return &oldState, nil + return &State{termios: *termios}, nil } // Restore restores the terminal connected to the given file descriptor to a // previous state. func Restore(fd int, state *State) error { - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0); err != 0 { - return err - } - return nil + return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) } // GetSize returns the dimensions of the given terminal. func GetSize(fd int) (width, height int, err error) { - var dimensions [4]uint16 - - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); err != 0 { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { return -1, -1, err } - return int(dimensions[1]), int(dimensions[0]), nil + return int(ws.Col), int(ws.Row), nil } // passwordReader is an io.Reader that reads from a specific file descriptor. type passwordReader int func (r passwordReader) Read(buf []byte) (int, error) { - return syscall.Read(int(r), buf) + return unix.Read(int(r), buf) } // ReadPassword reads a line of input from a terminal without local echo. This // is commonly used for inputting passwords and other sensitive data. The slice // returned does not include the \n. func ReadPassword(fd int) ([]byte, error) { - var oldState syscall.Termios - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); err != 0 { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { return nil, err } - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { + newState := *termios + newState.Lflag &^= unix.ECHO + newState.Lflag |= unix.ICANON | unix.ISIG + newState.Iflag |= unix.ICRNL + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { return nil, err } defer func() { - syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0) + unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) }() return readPasswordLine(passwordReader(fd)) diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go index 9c1ffd145a..cb23a59049 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go @@ -6,7 +6,7 @@ package terminal -import "syscall" +import "golang.org/x/sys/unix" -const ioctlReadTermios = syscall.TIOCGETA -const ioctlWriteTermios = syscall.TIOCSETA +const ioctlReadTermios = unix.TIOCGETA +const ioctlWriteTermios = unix.TIOCSETA diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go index 5883b22d78..5fadfe8a1d 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go @@ -4,8 +4,7 @@ package terminal -// These constants are declared here, rather than importing -// them from the syscall package as some syscall packages, even -// on linux, for example gccgo, do not declare them. -const ioctlReadTermios = 0x5401 // syscall.TCGETS -const ioctlWriteTermios = 0x5402 // syscall.TCSETS +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go index e0a1f36ce5..60979ccd00 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -17,53 +17,7 @@ package terminal import ( - "syscall" - "unsafe" -) - -const ( - enableLineInput = 2 - enableEchoInput = 4 - enableProcessedInput = 1 - enableWindowInput = 8 - enableMouseInput = 16 - enableInsertMode = 32 - enableQuickEditMode = 64 - enableExtendedFlags = 128 - enableAutoPosition = 256 - enableProcessedOutput = 1 - enableWrapAtEolOutput = 2 -) - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -var ( - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procSetConsoleMode = kernel32.NewProc("SetConsoleMode") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") -) - -type ( - short int16 - word uint16 - - coord struct { - x short - y short - } - smallRect struct { - left short - top short - right short - bottom short - } - consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord - } + "golang.org/x/sys/windows" ) type State struct { @@ -73,8 +27,8 @@ type State struct { // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd int) bool { var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 + err := windows.GetConsoleMode(windows.Handle(fd), &st) + return err == nil } // MakeRaw put the terminal connected to the given file descriptor into raw @@ -82,14 +36,12 @@ func IsTerminal(fd int) bool { // restored. func MakeRaw(fd int) (*State, error) { var st uint32 - _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - if e != 0 { - return nil, error(e) + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err } - raw := st &^ (enableEchoInput | enableProcessedInput | enableLineInput | enableProcessedOutput) - _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(raw), 0) - if e != 0 { - return nil, error(e) + raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { + return nil, err } return &State{st}, nil } @@ -98,9 +50,8 @@ func MakeRaw(fd int) (*State, error) { // restore the terminal after a signal. func GetState(fd int) (*State, error) { var st uint32 - _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - if e != 0 { - return nil, error(e) + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err } return &State{st}, nil } @@ -108,25 +59,23 @@ func GetState(fd int) (*State, error) { // Restore restores the terminal connected to the given file descriptor to a // previous state. func Restore(fd int, state *State) error { - _, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(state.mode), 0) - return err + return windows.SetConsoleMode(windows.Handle(fd), state.mode) } // GetSize returns the dimensions of the given terminal. func GetSize(fd int) (width, height int, err error) { - var info consoleScreenBufferInfo - _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&info)), 0) - if e != 0 { - return 0, 0, error(e) + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { + return 0, 0, err } - return int(info.size.x), int(info.size.y), nil + return int(info.Size.X), int(info.Size.Y), nil } // passwordReader is an io.Reader that reads from a specific Windows HANDLE. type passwordReader int func (r passwordReader) Read(buf []byte) (int, error) { - return syscall.Read(syscall.Handle(r), buf) + return windows.Read(windows.Handle(r), buf) } // ReadPassword reads a line of input from a terminal without local echo. This @@ -134,21 +83,19 @@ func (r passwordReader) Read(buf []byte) (int, error) { // returned does not include the \n. func ReadPassword(fd int) ([]byte, error) { var st uint32 - _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - if e != 0 { - return nil, error(e) + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err } old := st - st &^= (enableEchoInput) - st |= (enableProcessedInput | enableLineInput | enableProcessedOutput) - _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(st), 0) - if e != 0 { - return nil, error(e) + st &^= (windows.ENABLE_ECHO_INPUT) + st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { + return nil, err } defer func() { - syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(old), 0) + windows.SetConsoleMode(windows.Handle(fd), old) }() return readPasswordLine(passwordReader(fd)) diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index f9780e0ae7..ab2b88765a 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -254,7 +254,7 @@ func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (pac iv, key, macKey := generateKeys(d, algs, kex) if algs.Cipher == gcmCipherID { - return newGCMCipher(iv, key, macKey) + return newGCMCipher(iv, key) } if algs.Cipher == aes128cbcID { diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/golang.org/x/sys/unix/README.md new file mode 100644 index 0000000000..bc6f6031f1 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/README.md @@ -0,0 +1,173 @@ +# Building `sys/unix` + +The sys/unix package provides access to the raw system call interface of the +underlying operating system. See: https://godoc.org/golang.org/x/sys/unix + +Porting Go to a new architecture/OS combination or adding syscalls, types, or +constants to an existing architecture/OS pair requires some manual effort; +however, there are tools that automate much of the process. + +## Build Systems + +There are currently two ways we generate the necessary files. We are currently +migrating the build system to use containers so the builds are reproducible. +This is being done on an OS-by-OS basis. Please update this documentation as +components of the build system change. + +### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) + +The old build system generates the Go files based on the C header files +present on your system. This means that files +for a given GOOS/GOARCH pair must be generated on a system with that OS and +architecture. This also means that the generated code can differ from system +to system, based on differences in the header files. + +To avoid this, if you are using the old build system, only generate the Go +files on an installation with unmodified header files. It is also important to +keep track of which version of the OS the files were generated from (ex. +Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes +and have each OS upgrade correspond to a single change. + +To build the files for your current OS and architecture, make sure GOOS and +GOARCH are set correctly and run `mkall.sh`. This will generate the files for +your specific system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go + +### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) + +The new build system uses a Docker container to generate the go files directly +from source checkouts of the kernel and various system libraries. This means +that on any platform that supports Docker, all the files using the new build +system can be generated at once, and generated files will not change based on +what the person running the scripts has installed on their computer. + +The OS specific files for the new build system are located in the `${GOOS}` +directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When +the kernel or system library updates, modify the Dockerfile at +`${GOOS}/Dockerfile` to checkout the new release of the source. + +To build all the files under the new build system, you must be on an amd64/Linux +system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will +then generate all of the files for all of the GOOS/GOARCH pairs in the new build +system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go, docker + +## Component files + +This section describes the various files used in the code generation process. +It also contains instructions on how to modify these files to add a new +architecture/OS or to add additional syscalls, types, or constants. Note that +if you are using the new build system, the scripts cannot be called normally. +They must be called from within the docker container. + +### asm files + +The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system +call dispatch. There are three entry points: +``` + func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) + func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +``` +The first and second are the standard ones; they differ only in how many +arguments can be passed to the kernel. The third is for low-level use by the +ForkExec wrapper. Unlike the first two, it does not call into the scheduler to +let it know that a system call is running. + +When porting Go to an new architecture/OS, this file must be implemented for +each GOOS/GOARCH pair. + +### mksysnum + +Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` +for the old system). This script takes in a list of header files containing the +syscall number declarations and parses them to produce the corresponding list of +Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated +constants. + +Adding new syscall numbers is mostly done by running the build on a sufficiently +new installation of the target OS (or updating the source checkouts for the +new build system). However, depending on the OS, you make need to update the +parsing in mksysnum. + +### mksyscall.pl + +The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are +hand-written Go files which implement system calls (for unix, the specific OS, +or the specific OS/Architecture pair respectively) that need special handling +and list `//sys` comments giving prototypes for ones that can be generated. + +The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts +them into syscalls. This requires the name of the prototype in the comment to +match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function +prototype can be exported (capitalized) or not. + +Adding a new syscall often just requires adding a new `//sys` function prototype +with the desired arguments and a capitalized name so it is exported. However, if +you want the interface to the syscall to be different, often one will make an +unexported `//sys` prototype, an then write a custom wrapper in +`syscall_${GOOS}.go`. + +### types files + +For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or +`types_${GOOS}.go` on the old system). This file includes standard C headers and +creates Go type aliases to the corresponding C types. The file is then fed +through godef to get the Go compatible definitions. Finally, the generated code +is fed though mkpost.go to format the code correctly and remove any hidden or +private identifiers. This cleaned-up code is written to +`ztypes_${GOOS}_${GOARCH}.go`. + +The hardest part about preparing this file is figuring out which headers to +include and which symbols need to be `#define`d to get the actual data +structures that pass through to the kernel system calls. Some C libraries +preset alternate versions for binary compatibility and translate them on the +way in and out of system calls, but there is almost always a `#define` that can +get the real ones. +See `types_darwin.go` and `linux/types.go` for examples. + +To add a new type, add in the necessary include statement at the top of the +file (if it is not already there) and add in a type alias line. Note that if +your type is significantly different on different architectures, you may need +some `#if/#elif` macros in your include statements. + +### mkerrors.sh + +This script is used to generate the system's various constants. This doesn't +just include the error numbers and error strings, but also the signal numbers +an a wide variety of miscellaneous constants. The constants come from the list +of include files in the `includes_${uname}` variable. A regex then picks out +the desired `#define` statements, and generates the corresponding Go constants. +The error numbers and strings are generated from `#include `, and the +signal numbers and strings are generated from `#include `. All of +these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, +`_errors.c`, which prints out all the constants. + +To add a constant, add the header that includes it to the appropriate variable. +Then, edit the regex (if necessary) to match the desired constant. Avoid making +the regex too broad to avoid matching unintended constants. + + +## Generated files + +### `zerror_${GOOS}_${GOARCH}.go` + +A file containing all of the system's generated error numbers, error strings, +signal numbers, and constants. Generated by `mkerrors.sh` (see above). + +### `zsyscall_${GOOS}_${GOARCH}.go` + +A file containing all the generated syscalls for a specific GOOS and GOARCH. +Generated by `mksyscall.pl` (see above). + +### `zsysnum_${GOOS}_${GOARCH}.go` + +A list of numeric constants for all the syscall number of the specific GOOS +and GOARCH. Generated by mksysnum (see above). + +### `ztypes_${GOOS}_${GOARCH}.go` + +A file containing Go types for passing into (or returning from) syscalls. +Generated by godefs and the types file (see above). diff --git a/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s b/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s new file mode 100644 index 0000000000..469bfa1003 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s index 43ed17a05f..ded8260f3e 100644 --- a/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s +++ b/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -10,8 +10,8 @@ // System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go // -TEXT ·sysvicall6(SB),NOSPLIT,$0-64 +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 JMP syscall·sysvicall6(SB) -TEXT ·rawSysvicall6(SB),NOSPLIT,$0-64 +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 JMP syscall·rawSysvicall6(SB) diff --git a/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/golang.org/x/sys/unix/cap_freebsd.go new file mode 100644 index 0000000000..83b6bceab4 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -0,0 +1,195 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd + +package unix + +import ( + errorspkg "errors" + "fmt" +) + +// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c + +const ( + // This is the version of CapRights this package understands. See C implementation for parallels. + capRightsGoVersion = CAP_RIGHTS_VERSION_00 + capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 + capArSizeMax = capRightsGoVersion + 2 +) + +var ( + bit2idx = []int{ + -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, + 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + } +) + +func capidxbit(right uint64) int { + return int((right >> 57) & 0x1f) +} + +func rightToIndex(right uint64) (int, error) { + idx := capidxbit(right) + if idx < 0 || idx >= len(bit2idx) { + return -2, fmt.Errorf("index for right 0x%x out of range", right) + } + return bit2idx[idx], nil +} + +func caprver(right uint64) int { + return int(right >> 62) +} + +func capver(rights *CapRights) int { + return caprver(rights.Rights[0]) +} + +func caparsize(rights *CapRights) int { + return capver(rights) + 2 +} + +// CapRightsSet sets the permissions in setrights in rights. +func CapRightsSet(rights *CapRights, setrights []uint64) error { + // This is essentially a copy of cap_rights_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errorspkg.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errorspkg.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errorspkg.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch") + } + rights.Rights[i] |= right + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsClear clears the permissions in clearrights from rights. +func CapRightsClear(rights *CapRights, clearrights []uint64) error { + // This is essentially a copy of cap_rights_vclear() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errorspkg.New("bad rights size") + } + + for _, right := range clearrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errorspkg.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errorspkg.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch") + } + rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errorspkg.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsIsSet checks whether all the permissions in setrights are present in rights. +func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { + // This is essentially a copy of cap_rights_is_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return false, fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return false, errorspkg.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return false, errorspkg.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return false, err + } + if i >= n { + return false, errorspkg.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return false, errorspkg.New("index mismatch") + } + if (rights.Rights[i] & right) != right { + return false, nil + } + } + + return true, nil +} + +func capright(idx uint64, bit uint64) uint64 { + return ((1 << (57 + idx)) | bit) +} + +// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. +// See man cap_rights_init(3) and rights(4). +func CapRightsInit(rights []uint64) (*CapRights, error) { + var r CapRights + r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) + r.Rights[1] = capright(1, 0) + + err := CapRightsSet(&r, rights) + if err != nil { + return nil, err + } + return &r, nil +} + +// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. +// The capability rights on fd can never be increased by CapRightsLimit. +// See man cap_rights_limit(2) and rights(4). +func CapRightsLimit(fd uintptr, rights *CapRights) error { + return capRightsLimit(int(fd), rights) +} + +// CapRightsGet returns a CapRights structure containing the operations permitted on fd. +// See man cap_rights_get(3) and rights(4). +func CapRightsGet(fd uintptr) (*CapRights, error) { + r, err := CapRightsInit(nil) + if err != nil { + return nil, err + } + err = capRightsGet(capRightsGoVersion, int(fd), r) + if err != nil { + return nil, err + } + return r, nil +} diff --git a/vendor/golang.org/x/sys/unix/dev_darwin.go b/vendor/golang.org/x/sys/unix/dev_darwin.go new file mode 100644 index 0000000000..8d1dc0fa3d --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_darwin.go @@ -0,0 +1,24 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Darwin's sys/types.h header. + +package unix + +// Major returns the major component of a Darwin device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 24) & 0xff) +} + +// Minor returns the minor component of a Darwin device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffffff) +} + +// Mkdev returns a Darwin device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 24) | uint64(minor) +} diff --git a/vendor/golang.org/x/sys/unix/dev_dragonfly.go b/vendor/golang.org/x/sys/unix/dev_dragonfly.go new file mode 100644 index 0000000000..8502f202ce --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_dragonfly.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Dragonfly's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a DragonFlyBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a DragonFlyBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a DragonFlyBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/vendor/golang.org/x/sys/unix/dev_freebsd.go b/vendor/golang.org/x/sys/unix/dev_freebsd.go new file mode 100644 index 0000000000..eba3b4bd38 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_freebsd.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in FreeBSD's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a FreeBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a FreeBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a FreeBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/vendor/golang.org/x/sys/unix/dev_linux.go b/vendor/golang.org/x/sys/unix/dev_linux.go new file mode 100644 index 0000000000..d165d6f308 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_linux.go @@ -0,0 +1,42 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used by the Linux kernel and glibc. +// +// The information below is extracted and adapted from bits/sysmacros.h in the +// glibc sources: +// +// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's +// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major +// number and m is a hex digit of the minor number. This is backward compatible +// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also +// backward compatible with the Linux kernel, which for some architectures uses +// 32-bit dev_t, encoded as mmmM MMmm. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + major := uint32((dev & 0x00000000000fff00) >> 8) + major |= uint32((dev & 0xfffff00000000000) >> 32) + return major +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x00000000000000ff) >> 0) + minor |= uint32((dev & 0x00000ffffff00000) >> 12) + return minor +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) & 0x00000fff) << 8 + dev |= (uint64(major) & 0xfffff000) << 32 + dev |= (uint64(minor) & 0x000000ff) << 0 + dev |= (uint64(minor) & 0xffffff00) << 12 + return dev +} diff --git a/vendor/golang.org/x/sys/unix/dev_netbsd.go b/vendor/golang.org/x/sys/unix/dev_netbsd.go new file mode 100644 index 0000000000..b4a203d0c5 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_netbsd.go @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in NetBSD's sys/types.h header. + +package unix + +// Major returns the major component of a NetBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x000fff00) >> 8) +} + +// Minor returns the minor component of a NetBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xfff00000) >> 12) + return minor +} + +// Mkdev returns a NetBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x000fff00 + dev |= (uint64(minor) << 12) & 0xfff00000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/vendor/golang.org/x/sys/unix/dev_openbsd.go b/vendor/golang.org/x/sys/unix/dev_openbsd.go new file mode 100644 index 0000000000..f3430c42ff --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_openbsd.go @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in OpenBSD's sys/types.h header. + +package unix + +// Major returns the major component of an OpenBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x0000ff00) >> 8) +} + +// Minor returns the minor component of an OpenBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xffff0000) >> 8) + return minor +} + +// Mkdev returns an OpenBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x0000ff00 + dev |= (uint64(minor) << 8) & 0xffff0000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go new file mode 100644 index 0000000000..bd475812b7 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dirent.go @@ -0,0 +1,102 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package unix + +import "unsafe" + +// readInt returns the size-bytes unsigned integer in native byte order at offset off. +func readInt(b []byte, off, size uintptr) (u uint64, ok bool) { + if len(b) < int(off+size) { + return 0, false + } + if isBigEndian { + return readIntBE(b[off:], size), true + } + return readIntLE(b[off:], size), true +} + +func readIntBE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[1]) | uint64(b[0])<<8 + case 4: + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24 + case 8: + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | + uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 + default: + panic("syscall: readInt with unsupported size") + } +} + +func readIntLE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 + case 4: + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 + case 8: + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + default: + panic("syscall: readInt with unsupported size") + } +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number of +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + count = 0 + for max != 0 && len(buf) > 0 { + reclen, ok := direntReclen(buf) + if !ok || reclen > uint64(len(buf)) { + return origlen, count, names + } + rec := buf[:reclen] + buf = buf[reclen:] + ino, ok := direntIno(rec) + if !ok { + break + } + if ino == 0 { // File absent in directory. + continue + } + const namoff = uint64(unsafe.Offsetof(Dirent{}.Name)) + namlen, ok := direntNamlen(rec) + if !ok || namoff+namlen > uint64(len(rec)) { + break + } + name := rec[namoff : namoff+namlen] + for i, c := range name { + if c == 0 { + name = name[:i] + break + } + } + // Check for useless names before allocating a string. + if string(name) == "." || string(name) == ".." { + continue + } + max-- + count++ + names = append(names, string(name)) + } + return origlen - len(buf), count, names +} diff --git a/vendor/golang.org/x/sys/unix/endian_big.go b/vendor/golang.org/x/sys/unix/endian_big.go new file mode 100644 index 0000000000..5e9269063f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/endian_big.go @@ -0,0 +1,9 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// +build ppc64 s390x mips mips64 + +package unix + +const isBigEndian = true diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go new file mode 100644 index 0000000000..085df2d8dd --- /dev/null +++ b/vendor/golang.org/x/sys/unix/endian_little.go @@ -0,0 +1,9 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le + +package unix + +const isBigEndian = false diff --git a/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/golang.org/x/sys/unix/env_unix.go index 45e281a047..2e06b33f2e 100644 --- a/vendor/golang.org/x/sys/unix/env_unix.go +++ b/vendor/golang.org/x/sys/unix/env_unix.go @@ -1,4 +1,4 @@ -// Copyright 2010 The Go Authors. All rights reserved. +// Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/golang.org/x/sys/unix/env_unset.go b/vendor/golang.org/x/sys/unix/env_unset.go index 9222262559..c44fdc4afa 100644 --- a/vendor/golang.org/x/sys/unix/env_unset.go +++ b/vendor/golang.org/x/sys/unix/env_unset.go @@ -1,4 +1,4 @@ -// Copyright 2014 The Go Authors. All rights reserved. +// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/vendor/golang.org/x/sys/unix/errors_freebsd_386.go new file mode 100644 index 0000000000..c56bc8b05e --- /dev/null +++ b/vendor/golang.org/x/sys/unix/errors_freebsd_386.go @@ -0,0 +1,227 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go new file mode 100644 index 0000000000..3e9771175a --- /dev/null +++ b/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go @@ -0,0 +1,227 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8040720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8040720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go new file mode 100644 index 0000000000..856dca3254 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go @@ -0,0 +1,226 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +const ( + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + + // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go + IFF_SMART = 0x20 + IFT_FAITH = 0xf2 + IFT_IPXIP = 0xf9 + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/golang.org/x/sys/unix/flock.go b/vendor/golang.org/x/sys/unix/flock.go index ce67a59528..2994ce75f2 100644 --- a/vendor/golang.org/x/sys/unix/flock.go +++ b/vendor/golang.org/x/sys/unix/flock.go @@ -1,5 +1,3 @@ -// +build linux darwin freebsd openbsd netbsd dragonfly - // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/golang.org/x/sys/unix/gccgo.go index 94c8232124..40bed3fa80 100644 --- a/vendor/golang.org/x/sys/unix/gccgo.go +++ b/vendor/golang.org/x/sys/unix/gccgo.go @@ -1,4 +1,4 @@ -// Copyright 2015 The Go Authors. All rights reserved. +// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -8,7 +8,7 @@ package unix import "syscall" -// We can't use the gc-syntax .s files for gccgo. On the plus side +// We can't use the gc-syntax .s files for gccgo. On the plus side // much of the functionality can be written directly in Go. //extern gccgoRealSyscall diff --git a/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/golang.org/x/sys/unix/gccgo_c.c index 07f6be0392..99a774f2be 100644 --- a/vendor/golang.org/x/sys/unix/gccgo_c.c +++ b/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -1,4 +1,4 @@ -// Copyright 2015 The Go Authors. All rights reserved. +// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go index bffe1a77db..251a977a81 100644 --- a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -1,4 +1,4 @@ -// Copyright 2015 The Go Authors. All rights reserved. +// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/golang.org/x/sys/unix/gccgo_linux_sparc64.go b/vendor/golang.org/x/sys/unix/gccgo_linux_sparc64.go deleted file mode 100644 index 56332692c4..0000000000 --- a/vendor/golang.org/x/sys/unix/gccgo_linux_sparc64.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build gccgo,linux,sparc64 - -package unix - -import "syscall" - -//extern sysconf -func realSysconf(name int) int64 - -func sysconf(name int) (n int64, err syscall.Errno) { - r := realSysconf(name) - if r < 0 { - return 0, syscall.GetErrno() - } - return r, 0 -} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index c1fc2adb88..00b7ce7ac1 100755 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -3,75 +3,9 @@ # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. -# The unix package provides access to the raw system call -# interface of the underlying operating system. Porting Go to -# a new architecture/operating system combination requires -# some manual effort, though there are tools that automate -# much of the process. The auto-generated files have names -# beginning with z. -# -# This script runs or (given -n) prints suggested commands to generate z files -# for the current system. Running those commands is not automatic. -# This script is documentation more than anything else. -# -# * asm_${GOOS}_${GOARCH}.s -# -# This hand-written assembly file implements system call dispatch. -# There are three entry points: -# -# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); -# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); -# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); -# -# The first and second are the standard ones; they differ only in -# how many arguments can be passed to the kernel. -# The third is for low-level use by the ForkExec wrapper; -# unlike the first two, it does not call into the scheduler to -# let it know that a system call is running. -# -# * syscall_${GOOS}.go -# -# This hand-written Go file implements system calls that need -# special handling and lists "//sys" comments giving prototypes -# for ones that can be auto-generated. Mksyscall reads those -# comments to generate the stubs. -# -# * syscall_${GOOS}_${GOARCH}.go -# -# Same as syscall_${GOOS}.go except that it contains code specific -# to ${GOOS} on one particular architecture. -# -# * types_${GOOS}.c -# -# This hand-written C file includes standard C headers and then -# creates typedef or enum names beginning with a dollar sign -# (use of $ in variable names is a gcc extension). The hardest -# part about preparing this file is figuring out which headers to -# include and which symbols need to be #defined to get the -# actual data structures that pass through to the kernel system calls. -# Some C libraries present alternate versions for binary compatibility -# and translate them on the way in and out of system calls, but -# there is almost always a #define that can get the real ones. -# See types_darwin.c and types_linux.c for examples. -# -# * zerror_${GOOS}_${GOARCH}.go -# -# This machine-generated file defines the system's error numbers, -# error strings, and signal numbers. The generator is "mkerrors.sh". -# Usually no arguments are needed, but mkerrors.sh will pass its -# arguments on to godefs. -# -# * zsyscall_${GOOS}_${GOARCH}.go -# -# Generated by mksyscall.pl; see syscall_${GOOS}.go above. -# -# * zsysnum_${GOOS}_${GOARCH}.go -# -# Generated by mksysnum_${GOOS}. -# -# * ztypes_${GOOS}_${GOARCH}.go -# -# Generated by godefs; see types_${GOOS}.c above. +# This script runs or (given -n) prints suggested commands to generate files for +# the Architecture/OS specified by the GOARCH and GOOS environment variables. +# See README.md for more information about how the build system works. GOOSARCH="${GOOS}_${GOARCH}" @@ -84,6 +18,7 @@ zsysctl="zsysctl_$GOOSARCH.go" mksysnum= mktypes= run="sh" +cmd="" case "$1" in -syscalls) @@ -98,6 +33,7 @@ case "$1" in ;; -n) run="cat" + cmd="echo" shift esac @@ -109,6 +45,14 @@ case "$#" in exit 2 esac +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + # Use then new build system + # Files generated through docker (use $cmd so you can Ctl-C the build or run) + $cmd docker build --tag generate:$GOOS $GOOS + $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS + exit +fi + GOOSARCH_in=syscall_$GOOSARCH.go case "$GOOSARCH" in _* | *_ | _) @@ -128,7 +72,7 @@ darwin_amd64) ;; darwin_arm) mkerrors="$mkerrors" - mksysnum="./mksysnum_darwin.pl /usr/include/sys/syscall.h" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; darwin_arm64) @@ -164,65 +108,7 @@ freebsd_arm) mksyscall="./mksyscall.pl -l32 -arm" mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" # Let the type of C char be signed for making the bare syscall - # API consistent across over platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -linux_386) - mkerrors="$mkerrors -m32" - mksyscall="./mksyscall.pl -l32" - mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd_32.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -linux_amd64) - unistd_h=$(ls -1 /usr/include/asm/unistd_64.h /usr/include/x86_64-linux-gnu/asm/unistd_64.h 2>/dev/null | head -1) - if [ "$unistd_h" = "" ]; then - echo >&2 cannot find unistd_64.h - exit 1 - fi - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_linux.pl $unistd_h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -linux_arm) - mkerrors="$mkerrors" - mksyscall="./mksyscall.pl -l32 -arm" - mksysnum="curl -s 'http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/arch/arm/include/uapi/asm/unistd.h' | ./mksysnum_linux.pl -" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -linux_arm64) - unistd_h=$(ls -1 /usr/include/asm/unistd.h /usr/include/asm-generic/unistd.h 2>/dev/null | head -1) - if [ "$unistd_h" = "" ]; then - echo >&2 cannot find unistd_64.h - exit 1 - fi - mksysnum="./mksysnum_linux.pl $unistd_h" - # Let the type of C char be signed for making the bare syscall - # API consistent across over platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -linux_ppc64) - GOOSARCH_in=syscall_linux_ppc64x.go - unistd_h=/usr/include/asm/unistd.h - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_linux.pl $unistd_h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -linux_ppc64le) - GOOSARCH_in=syscall_linux_ppc64x.go - unistd_h=/usr/include/powerpc64le-linux-gnu/asm/unistd.h - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_linux.pl $unistd_h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -linux_s390x) - GOOSARCH_in=syscall_linux_s390x.go - unistd_h=/usr/include/asm/unistd.h - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_linux.pl $unistd_h" - # Let the type of C char be signed to make the bare sys - # API more consistent between platforms. - # This is a deliberate departure from the way the syscall - # package generates its version of the types file. + # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; linux_sparc64) @@ -244,11 +130,18 @@ netbsd_amd64) mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; +netbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -netbsd -arm" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; openbsd_386) mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32 -openbsd" mksysctl="./mksysctl_openbsd.pl" - zsysctl="zsysctl_openbsd.go" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; @@ -256,10 +149,18 @@ openbsd_amd64) mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -openbsd" mksysctl="./mksysctl_openbsd.pl" - zsysctl="zsysctl_openbsd.go" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; +openbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -openbsd -arm" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; solaris_amd64) mksyscall="./mksyscall_solaris.pl" mkerrors="$mkerrors -m64" @@ -288,7 +189,6 @@ esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi if [ -n "$mktypes" ]; then - echo "echo // +build $GOARCH,$GOOS > ztypes_$GOOSARCH.go"; - echo "$mktypes types_$GOOS.go | go run mkpost.go >>ztypes_$GOOSARCH.go"; + echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi ) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index eec533f618..2db9e0adce 100755 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -16,9 +16,18 @@ if test -z "$GOARCH" -o -z "$GOOS"; then exit 1 fi +# Check that we are using the new build system if we should +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then + echo 1>&2 "In the new build system, mkerrors should not be called directly." + echo 1>&2 "See README.md" + exit 1 + fi +fi + CC=${CC:-cc} -if [[ "$GOOS" -eq "solaris" ]]; then +if [[ "$GOOS" = "solaris" ]]; then # Assumes GNU versions of utilities in PATH. export PATH=/usr/gnu/bin:$PATH fi @@ -29,6 +38,8 @@ includes_Darwin=' #define _DARWIN_C_SOURCE #define KERNEL #define _DARWIN_USE_64_BIT_INODE +#include +#include #include #include #include @@ -36,6 +47,7 @@ includes_Darwin=' #include #include #include +#include #include #include #include @@ -66,6 +78,7 @@ includes_DragonFly=' ' includes_FreeBSD=' +#include #include #include #include @@ -73,6 +86,7 @@ includes_FreeBSD=' #include #include #include +#include #include #include #include @@ -102,8 +116,39 @@ includes_Linux=' #endif #define _GNU_SOURCE +// is broken on powerpc64, as it fails to include definitions of +// these structures. We just include them copied from . +#if defined(__powerpc__) +struct sgttyb { + char sg_ispeed; + char sg_ospeed; + char sg_erase; + char sg_kill; + short sg_flags; +}; + +struct tchars { + char t_intrc; + char t_quitc; + char t_startc; + char t_stopc; + char t_eofc; + char t_brkc; +}; + +struct ltchars { + char t_suspc; + char t_dsuspc; + char t_rprntc; + char t_flushc; + char t_werasc; + char t_lnextc; +}; +#endif + #include #include +#include #include #include #include @@ -113,6 +158,7 @@ includes_Linux=' #include #include #include +#include #include #include #include @@ -122,15 +168,25 @@ includes_Linux=' #include #include #include +#include +#include #include +#include +#include #include #include #include #include +#include +#include #include #include #include #include +#include +#include +#include +#include #include #include @@ -146,11 +202,20 @@ includes_Linux=' #define PTRACE_SETREGS 0xd #endif +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + #ifdef SOL_BLUETOOTH // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h // but it is already in bluetooth_linux.go #undef SOL_BLUETOOTH #endif + +// Certain constants are missing from the fs/crypto UAPI +#define FS_KEY_DESC_PREFIX "fscrypt:" +#define FS_KEY_DESC_PREFIX_SIZE 8 +#define FS_MAX_KEY_SIZE 64 ' includes_NetBSD=' @@ -222,6 +287,7 @@ includes_SunOS=' #include #include #include +#include #include #include #include @@ -286,6 +352,7 @@ ccflags="$@" $2 !~ /^EXPR_/ && $2 ~ /^E[A-Z0-9_]+$/ || $2 ~ /^B[0-9_]+$/ || + $2 ~ /^(OLD|NEW)DEV$/ || $2 == "BOTHER" || $2 ~ /^CI?BAUD(EX)?$/ || $2 == "IBSHIFT" || @@ -321,9 +388,9 @@ ccflags="$@" $2 == "IFNAMSIZ" || $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || $2 ~ /^SYSCTL_VERS/ || - $2 ~ /^(MS|MNT)_/ || + $2 ~ /^(MS|MNT|UMOUNT)_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || $2 ~ /^LINUX_REBOOT_CMD_/ || $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || $2 !~ "NLA_TYPE_MASK" && @@ -337,16 +404,34 @@ ccflags="$@" $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || $2 ~ /^BIOC/ || $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || - $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || $2 ~ /^CLONE_[A-Z_]+/ || $2 !~ /^(BPF_TIMEVAL)$/ && $2 ~ /^(BPF|DLT)_/ || $2 ~ /^CLOCK_/ || $2 ~ /^CAN_/ || + $2 ~ /^CAP_/ || $2 ~ /^ALG_/ || + $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || + $2 ~ /^GRND_/ || + $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || + $2 ~ /^KEYCTL_/ || + $2 ~ /^PERF_EVENT_IOC_/ || + $2 ~ /^SECCOMP_MODE_/ || + $2 ~ /^SPLICE_/ || + $2 ~ /^(VM|VMADDR)_/ || + $2 ~ /^IOCTL_VM_SOCKETS_/ || + $2 ~ /^(TASKSTATS|TS)_/ || + $2 ~ /^GENL_/ || + $2 ~ /^UTIME_/ || + $2 ~ /^XATTR_(CREATE|REPLACE)/ || + $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || + $2 ~ /^FSOPT_/ || + $2 ~ /^WDIOC_/ || $2 !~ "WMESGLEN" && - $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^W[A-Z0-9]+$/ || + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} @@ -381,7 +466,7 @@ echo '#include ' | $CC -x c - -E -dM $ccflags | sort >_signal.grep echo '// mkerrors.sh' "$@" -echo '// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT' +echo '// Code generated by the command above; see README.md. DO NOT EDIT.' echo echo "// +build ${GOARCH},${GOOS}" echo @@ -443,7 +528,7 @@ intcmp(const void *a, const void *b) int main(void) { - int i, j, e; + int i, e; char buf[1024], *p; printf("\n\n// Error table\n"); @@ -460,7 +545,7 @@ main(void) printf("\t%d: \"%s\",\n", e, buf); } printf("}\n\n"); - + printf("\n\n// Signal table\n"); printf("var signals = [...]string {\n"); qsort(signals, nelem(signals), sizeof signals[0], intcmp); diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go deleted file mode 100644 index ed50d902af..0000000000 --- a/vendor/golang.org/x/sys/unix/mkpost.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// mkpost processes the output of cgo -godefs to -// modify the generated types. It is used to clean up -// the sys API in an architecture specific manner. -// -// mkpost is run after cgo -godefs by mkall.sh. -package main - -import ( - "fmt" - "go/format" - "io/ioutil" - "log" - "os" - "regexp" -) - -func main() { - b, err := ioutil.ReadAll(os.Stdin) - if err != nil { - log.Fatal(err) - } - s := string(b) - - goarch := os.Getenv("GOARCH") - goos := os.Getenv("GOOS") - if goarch == "s390x" && goos == "linux" { - // Export the types of PtraceRegs fields. - re := regexp.MustCompile("ptrace(Psw|Fpregs|Per)") - s = re.ReplaceAllString(s, "Ptrace$1") - - // Replace padding fields inserted by cgo with blank identifiers. - re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*") - s = re.ReplaceAllString(s, "_") - - // Replace other unwanted fields with blank identifiers. - re = regexp.MustCompile("X_[A-Za-z0-9_]*") - s = re.ReplaceAllString(s, "_") - - // Replace the control_regs union with a blank identifier for now. - re = regexp.MustCompile("(Control_regs)\\s+\\[0\\]uint64") - s = re.ReplaceAllString(s, "_ [0]uint64") - } - - // gofmt - b, err = format.Source([]byte(s)) - if err != nil { - log.Fatal(err) - } - - // Append this command to the header to show where the new file - // came from. - re := regexp.MustCompile("(cgo -godefs [a-zA-Z0-9_]+\\.go.*)") - b = re.ReplaceAll(b, []byte("$1 | go run mkpost.go")) - - fmt.Printf("%s", b) -} diff --git a/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/golang.org/x/sys/unix/mksyscall.pl index 34f8ef829b..fb929b4ce1 100755 --- a/vendor/golang.org/x/sys/unix/mksyscall.pl +++ b/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -69,6 +69,16 @@ if($ARGV[0] =~ /^-/) { exit 1; } +# Check that we are using the new build system if we should +if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { + if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksyscall should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; + } +} + + sub parseparamlist($) { my ($list) = @_; $list =~ s/^\s*//; @@ -300,7 +310,7 @@ if($errors) { print <){ if($name eq 'SYS_SYS_EXIT'){ $name = 'SYS_EXIT'; } - if($name =~ /^SYS_CAP_+/ || $name =~ /^SYS___CAP_+/){ - next - } print " $name = $num; // $proto\n"; - - # We keep Capsicum syscall numbers for FreeBSD - # 9-STABLE here because we are not sure whether they - # are mature and stable. - if($num == 513){ - print " SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); }\n"; - print " SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \\\n"; - print " SYS_CAP_ENTER = 516 // { int cap_enter(void); }\n"; - print " SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }\n"; - } } } diff --git a/vendor/golang.org/x/sys/unix/mksysnum_linux.pl b/vendor/golang.org/x/sys/unix/mksysnum_linux.pl deleted file mode 100755 index 52b16139e3..0000000000 --- a/vendor/golang.org/x/sys/unix/mksysnum_linux.pl +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env perl -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -use strict; - -if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { - print STDERR "GOARCH or GOOS not defined in environment\n"; - exit 1; -} - -my $command = "mksysnum_linux.pl ". join(' ', @ARGV); - -print < 999){ - # ignore deprecated syscalls that are no longer implemented - # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716 - return; - } - $name =~ y/a-z/A-Z/; - $num = $num + $offset; - print " SYS_$name = $num;\n"; -} - -my $prev; -open(GCC, "gcc -E -dD $ARGV[0] |") || die "can't run gcc"; -while(){ - if(/^#define __NR_Linux\s+([0-9]+)/){ - # mips/mips64: extract offset - $offset = $1; - } - elsif(/^#define __NR_syscalls\s+/) { - # ignore redefinitions of __NR_syscalls - } - elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ - $prev = $2; - fmt($1, $2); - } - elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){ - $prev = $2; - fmt($1, $2); - } - elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){ - fmt($1, $prev+$2) - } - elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){ - fmt($1, $2); - } -} - -print <){ $name = "$7_$11" if $11 ne ''; $name =~ y/a-z/A-Z/; - if($compat eq '' || $compat eq '30' || $compat eq '50') { + if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { print " $name = $num; // $proto\n"; } } diff --git a/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl b/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl index ae5aad5866..84edf60ca1 100755 --- a/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl +++ b/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl @@ -17,7 +17,7 @@ my $command = "mksysnum_openbsd.pl " . join(' ', @ARGV); print < 1000 { return nil, EINVAL } @@ -561,13 +561,24 @@ func Utimes(path string, tv []Timeval) error { func UtimesNano(path string, ts []Timespec) error { if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } return utimes(path, nil) } - // TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it - // isn't supported by darwin so this uses utimes instead if len(ts) != 2 { return EINVAL } + // Darwin setattrlist can set nanosecond timestamps + err := setattrlistTimes(path, ts, 0) + if err != ENOSYS { + return err + } + err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } // Not as efficient as it could be because Timespec and // Timeval have different types in the different OSes tv := [2]Timeval{ @@ -577,6 +588,20 @@ func UtimesNano(path string, ts []Timespec) error { return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + err := setattrlistTimes(path, ts, flags) + if err != ENOSYS { + return err + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + //sys futimes(fd int, timeval *[2]Timeval) (err error) func Futimes(fd int, tv []Timeval) error { @@ -591,12 +616,18 @@ func Futimes(fd int, tv []Timeval) error { //sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + // TODO: wrap // Acct(name nil-string) (err error) // Gethostuuid(uuid *byte, timeout *Timespec) (err error) -// Madvise(addr *byte, len int, behav int) (err error) -// Mprotect(addr *byte, len int, prot int) (err error) -// Msync(addr *byte, len int, flags int) (err error) // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) var mapper = &mmapper{ @@ -612,3 +643,11 @@ func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, e func Munmap(b []byte) (err error) { return mapper.Munmap(b) } + +//sys Madvise(b []byte, behav int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 0d1771c3fc..9a6783e9b9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -54,7 +54,7 @@ func nametomib(name string) (mib []_C_int, err error) { // NOTE(rsc): It seems strange to set the buffer to have // size CTL_MAXNAME+2 but use only CTL_MAXNAME - // as the size. I don't know why the +2 is here, but the + // as the size. I don't know why the +2 is here, but the // kernel uses +2 for its own implementation of this function. // I am scared that if we don't include the +2 here, the kernel // will silently write 2 words farther than we specify @@ -76,32 +76,16 @@ func nametomib(name string) (mib []_C_int, err error) { return buf[0 : n/siz], nil } -// ParseDirent parses up to max directory entries in buf, -// appending the names to names. It returns the number -// bytes consumed from buf, the number of entries added -// to names, and the new names slice. -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - if dirent.Reclen == 0 { - buf = nil - break - } - buf = buf[dirent.Reclen:] - if dirent.Ino == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:dirent.Namlen]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) - } - return origlen - len(buf), count, names +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) @@ -203,6 +187,42 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } +func setattrlistTimes(path string, times []Timespec, flags int) error { + _p0, err := BytePtrFromString(path) + if err != nil { + return err + } + + var attrList attrList + attrList.bitmapCount = ATTR_BIT_MAP_COUNT + attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME + + // order is mtime, atime: the opposite of Chtimes + attributes := [2]Timespec{times[1], times[0]} + options := 0 + if flags&AT_SYMLINK_NOFOLLOW != 0 { + options |= FSOPT_NOFOLLOW + } + _, _, e1 := Syscall6( + SYS_SETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attributes)), + uintptr(unsafe.Sizeof(attributes)), + uintptr(options), + 0, + ) + if e1 != 0 { + return e1 + } + return nil +} + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { + // Darwin doesn't support SYS_UTIMENSAT + return ENOSYS +} + /* * Wrapped */ @@ -211,6 +231,45 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ @@ -226,10 +285,13 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig //sys Dup2(from int, to int) (err error) //sys Exchangedata(path1 string, path2 string, options int) (err error) //sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 @@ -254,23 +316,23 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) -//sys Mlock(b []byte) (err error) -//sys Mlockall(flags int) (err error) -//sys Mprotect(b []byte, prot int) (err error) -//sys Munlock(b []byte) (err error) -//sys Munlockall() (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK @@ -291,11 +353,13 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 //sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Undelete(path string) (err error) //sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) @@ -335,9 +399,6 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig // Add_profil // Kdebug_trace // Sigreturn -// Mmap -// Mlock -// Munlock // Atsocket // Kqueue_from_portset_np // Kqueue_portset @@ -347,7 +408,6 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig // Searchfs // Delete // Copyfile -// Poll // Watchevent // Waitevent // Modwatch @@ -430,8 +490,6 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig // Lio_listio // __pthread_cond_wait // Iopolicysys -// Mlockall -// Munlockall // __pthread_kill // __pthread_sigmask // __sigwait @@ -485,7 +543,6 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig // Sendmsg_nocancel // Recvfrom_nocancel // Accept_nocancel -// Msync_nocancel // Fcntl_nocancel // Select_nocancel // Fsync_nocancel diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go index c172a3da5a..b3ac109a2f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -11,27 +11,18 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int32(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int32(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil - // but is otherwise unused. The answers come back + // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = int32(sec) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index fc1e5a4a82..75219444a8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -11,29 +11,18 @@ import ( "unsafe" ) -//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) - -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil - // but is otherwise unused. The answers come back + // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = sec diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go index d286cf408d..47ab664859 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -9,27 +9,18 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int32(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int32(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil - // but is otherwise unused. The answers come back + // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = int32(sec) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index c33905cdcd..d6d9628014 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -11,27 +11,18 @@ import ( "unsafe" ) -func Getpagesize() int { return 16384 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil - // but is otherwise unused. The answers come back + // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = sec diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index fbbe0dce25..49c65ea61b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -1,8 +1,8 @@ -// Copyright 2009,2010 The Go Authors. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// FreeBSD system calls. +// DragonFly BSD system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. @@ -34,7 +34,7 @@ func nametomib(name string) (mib []_C_int, err error) { // NOTE(rsc): It seems strange to set the buffer to have // size CTL_MAXNAME+2 but use only CTL_MAXNAME - // as the size. I don't know why the +2 is here, but the + // as the size. I don't know why the +2 is here, but the // kernel uses +2 for its own implementation of this function. // I am scared that if we don't include the +2 here, the kernel // will silently write 2 words farther than we specify @@ -56,29 +56,20 @@ func nametomib(name string) (mib []_C_int, err error) { return buf[0 : n/siz], nil } -// ParseDirent parses up to max directory entries in buf, -// appending the names to names. It returns the number -// bytes consumed from buf, the number of entries added -// to names, and the new names slice. -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - reclen := int(16+dirent.Namlen+1+7) & ^7 - buf = buf[reclen:] - if dirent.Fileno == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:dirent.Namlen]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + namlen, ok := direntNamlen(buf) + if !ok { + return 0, false } - return origlen - len(buf), count, names + return (16 + namlen + 1 + 7) &^ 7, true +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe() (r int, w int, err error) @@ -101,6 +92,24 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return extpwrite(fd, p, 0, offset) } +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var _p0 unsafe.Pointer var bufsize uintptr @@ -116,6 +125,50 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ @@ -165,11 +218,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { //sys Mkdir(path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) -//sys Mlock(b []byte) (err error) -//sys Mlockall(flags int) (err error) -//sys Mprotect(b []byte, prot int) (err error) -//sys Munlock(b []byte) (err error) -//sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) @@ -208,6 +256,8 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented @@ -219,7 +269,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // Getlogin // Sigpending // Sigaltstack -// Ioctl // Reboot // Execve // Vfork @@ -242,7 +291,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // Add_profil // Kdebug_trace // Sigreturn -// Mmap // Atsocket // Kqueue_from_portset_np // Kqueue_portset @@ -252,7 +300,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // Searchfs // Delete // Copyfile -// Poll // Watchevent // Waitevent // Modwatch @@ -387,7 +434,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // Sendmsg_nocancel // Recvfrom_nocancel // Accept_nocancel -// Msync_nocancel // Fcntl_nocancel // Select_nocancel // Fsync_nocancel @@ -399,7 +445,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // Pread_nocancel // Pwrite_nocancel // Waitid_nocancel -// Poll_nocancel // Msgsnd_nocancel // Msgrcv_nocancel // Sem_wait_nocancel diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go index da7cb7982c..9babb31ea7 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -11,21 +11,12 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = nsec % 1e9 / 1e3 - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index ec56ed608a..a82ce127e6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -32,7 +32,7 @@ func nametomib(name string) (mib []_C_int, err error) { // NOTE(rsc): It seems strange to set the buffer to have // size CTL_MAXNAME+2 but use only CTL_MAXNAME - // as the size. I don't know why the +2 is here, but the + // as the size. I don't know why the +2 is here, but the // kernel uses +2 for its own implementation of this function. // I am scared that if we don't include the +2 here, the kernel // will silently write 2 words farther than we specify @@ -54,32 +54,16 @@ func nametomib(name string) (mib []_C_int, err error) { return buf[0 : n/siz], nil } -// ParseDirent parses up to max directory entries in buf, -// appending the names to names. It returns the number -// bytes consumed from buf, the number of entries added -// to names, and the new names slice. -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - if dirent.Reclen == 0 { - buf = nil - break - } - buf = buf[dirent.Reclen:] - if dirent.Fileno == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:dirent.Namlen]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) - } - return origlen - len(buf), count, names +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe() (r int, w int, err error) @@ -136,6 +120,11 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + // Derive extattr namespace and attribute name func xattrnamespace(fullattr string) (ns int, attr string, err error) { @@ -368,11 +357,53 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { return s, e } +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys CapEnter() (err error) +//sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET +//sys capRightsLimit(fd int, rightsp *CapRights) (err error) //sys Chdir(path string) (err error) //sys Chflags(path string, flags int) (err error) //sys Chmod(path string, mode uint32) (err error) @@ -395,10 +426,13 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { //sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) //sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) @@ -425,24 +459,24 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) -//sys Mlock(b []byte) (err error) -//sys Mlockall(flags int) (err error) -//sys Mprotect(b []byte, prot int) (err error) -//sys Munlock(b []byte) (err error) -//sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK @@ -464,11 +498,13 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Undelete(path string) (err error) //sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) @@ -476,6 +512,7 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented @@ -509,9 +546,6 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { // Add_profil // Kdebug_trace // Sigreturn -// Mmap -// Mlock -// Munlock // Atsocket // Kqueue_from_portset_np // Kqueue_portset @@ -521,7 +555,6 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { // Searchfs // Delete // Copyfile -// Poll // Watchevent // Waitevent // Modwatch @@ -604,8 +637,6 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { // Lio_listio // __pthread_cond_wait // Iopolicysys -// Mlockall -// Munlockall // __pthread_kill // __pthread_sigmask // __sigwait @@ -658,7 +689,6 @@ func Llistxattr(link string, dest []byte) (sz int, err error) { // Sendmsg_nocancel // Recvfrom_nocancel // Accept_nocancel -// Msync_nocancel // Fcntl_nocancel // Select_nocancel // Fsync_nocancel diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index 6a0cd804d8..21e03958cd 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -11,21 +11,12 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int32(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int32(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index e142540efa..9c945a6579 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -11,21 +11,12 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = nsec % 1e9 / 1e3 - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 5504cb1255..5cd6243f2a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -11,21 +11,12 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return ts.Sec*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = nsec / 1e9 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index dc711db069..9098661a3c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -36,6 +36,59 @@ func Creat(path string, mode uint32) (fd int, err error) { return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) } +//sys fchmodat(dirfd int, path string, mode uint32) (err error) + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior + // and check the flags. Otherwise the mode would be applied to the symlink + // destination which is not what the user expects. + if flags&^AT_SYMLINK_NOFOLLOW != 0 { + return EINVAL + } else if flags&AT_SYMLINK_NOFOLLOW != 0 { + return EOPNOTSUPP + } + return fchmodat(dirfd, path, mode) +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + //sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) func Link(oldpath string, newpath string) (err error) { @@ -202,7 +255,7 @@ func Getgroups() (gids []int, err error) { return nil, nil } - // Sanity check group count. Max is 1<<16 on Linux. + // Sanity check group count. Max is 1<<16 on Linux. if n < 0 || n > 1<<20 { return nil, EINVAL } @@ -237,8 +290,8 @@ type WaitStatus uint32 // 0x7F (stopped), or a signal number that caused an exit. // The 0x80 bit is whether there was a core dump. // An extra number (exit code, signal causing a stop) -// is in the high bits. At least that's the idea. -// There are various irregularities. For example, the +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the // "continued" status is 0xFFFF, distinguishing itself // from stopped via the core dump bit. @@ -299,10 +352,14 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, return } -func Mkfifo(path string, mode uint32) (err error) { +func Mkfifo(path string, mode uint32) error { return Mknod(path, mode|S_IFIFO, 0) } +func Mkfifoat(dirfd int, path string, mode uint32) error { + return Mknodat(dirfd, path, mode|S_IFIFO, 0) +} + func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL @@ -551,6 +608,28 @@ func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil } +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Linux VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: @@ -620,6 +699,14 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { sa.Addr[i] = pp.Addr[i] } return sa, nil + + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil } return nil, EAFNOSUPPORT } @@ -714,10 +801,124 @@ func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { return &value, err } +func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { + var value TCPInfo + vallen := _Socklen(SizeofTCPInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) } +// Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) + +// KeyctlInt calls keyctl commands in which each argument is an int. +// These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK, +// KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT, +// KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT, +// KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT. +//sys KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlBuffer calls keyctl commands in which the third and fourth +// arguments are a buffer and its length, respectively. +// These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE. +//sys KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlString calls keyctl commands which return a string. +// These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY. +func KeyctlString(cmd int, id int) (string, error) { + // We must loop as the string data may change in between the syscalls. + // We could allocate a large buffer here to reduce the chance that the + // syscall needs to be called twice; however, this is unnecessary as + // the performance loss is negligible. + var buffer []byte + for { + // Try to fill the buffer with data + length, err := KeyctlBuffer(cmd, id, buffer, 0) + if err != nil { + return "", err + } + + // Check if the data was written + if length <= len(buffer) { + // Exclude the null terminator + return string(buffer[:length-1]), nil + } + + // Make a bigger buffer if needed + buffer = make([]byte, length) + } +} + +// Keyctl commands with special signatures. + +// KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html +func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) { + createInt := 0 + if create { + createInt = 1 + } + return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0) +} + +// KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the +// key handle permission mask as described in the "keyctl setperm" section of +// http://man7.org/linux/man-pages/man1/keyctl.1.html. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html +func KeyctlSetperm(id int, perm uint32) error { + _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0) + return err +} + +//sys keyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL + +// KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html +func KeyctlJoinSessionKeyring(name string) (ringid int, err error) { + return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name) +} + +//sys keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlSearch implements the KEYCTL_SEARCH command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_search.3.html +func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) { + return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid) +} + +//sys keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL + +// KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This +// command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice +// of Iovec (each of which represents a buffer) instead of a single buffer. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html +func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error { + return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid) +} + +//sys keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL + +// KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command +// computes a Diffie-Hellman shared secret based on the provide params. The +// secret is written to the provided buffer and the returned size is the number +// of bytes written (returning an error if there is insufficient space in the +// buffer). If a nil buffer is passed in, this function returns the minimum +// buffer length needed to store the appropriate data. Note that this differs +// from KEYCTL_READ's behavior which always returns the requested payload size. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html +func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) { + return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) +} + func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr var rsa RawSockaddrAny @@ -725,17 +926,22 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { - iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.Base = &p[0] iov.SetLen(len(p)) } var dummy byte if len(oob) > 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return + } // receive at least one normal byte - if len(p) == 0 { + if sockType != SOCK_DGRAM && len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } - msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.Control = &oob[0] msg.SetControllen(len(oob)) } msg.Iov = &iov @@ -768,21 +974,26 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) } } var msg Msghdr - msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Name = (*byte)(ptr) msg.Namelen = uint32(salen) var iov Iovec if len(p) > 0 { - iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.Base = &p[0] iov.SetLen(len(p)) } var dummy byte if len(oob) > 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return 0, err + } // send at least one normal byte - if len(p) == 0 { + if sockType != SOCK_DGRAM && len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } - msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.Control = &oob[0] msg.SetControllen(len(oob)) } msg.Iov = &iov @@ -812,7 +1023,7 @@ func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err erro var buf [sizeofPtr]byte - // Leading edge. PEEKTEXT/PEEKDATA don't require aligned + // Leading edge. PEEKTEXT/PEEKDATA don't require aligned // access (PEEKUSER warns that it might), but if we don't // align our reads, we might straddle an unmapped page // boundary and not get the bytes leading up to the page @@ -851,6 +1062,10 @@ func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) } +func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKUSR, pid, addr, out) +} + func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { // As for ptracePeek, we need to align our accesses to deal // with the possibility of straddling an invalid page. @@ -910,6 +1125,10 @@ func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) } +func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data) +} + func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } @@ -949,38 +1168,24 @@ func Reboot(cmd int) (err error) { return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") } -func clen(n []byte) int { - for i := 0; i < len(n); i++ { - if n[i] == 0 { - return i - } - } - return len(n) -} - func ReadDirent(fd int, buf []byte) (n int, err error) { return Getdents(fd, buf) } -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - count = 0 - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - buf = buf[dirent.Reclen:] - if dirent.Ino == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:clen(bytes[:])]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false } - return origlen - len(buf), count, names + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true } //sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) @@ -1006,22 +1211,24 @@ func Mount(source string, target string, fstype string, flags uintptr, data stri * Direct access */ //sys Acct(path string) (err error) +//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) //sys Adjtimex(buf *Timex) (state int, err error) //sys Chdir(path string) (err error) //sys Chroot(path string) (err error) //sys ClockGettime(clockid int32, time *Timespec) (err error) //sys Close(fd int) (err error) +//sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) //sys Dup(oldfd int) (fd int, err error) //sys Dup3(oldfd int, newfd int, flags int) (err error) //sysnb EpollCreate(size int) (fd int, err error) //sysnb EpollCreate1(flag int) (fd int, err error) //sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) +//sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2 //sys Exit(code int) = SYS_EXIT_GROUP //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) //sys Fchdir(fd int) (err error) //sys Fchmod(fd int, mode uint32) (err error) -//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys Fdatasync(fd int) (err error) @@ -1038,6 +1245,7 @@ func Getpgrp() (pid int) { //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) +//sys Getrandom(buf []byte, flags int) (n int, err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettid() (tid int) @@ -1047,16 +1255,22 @@ func Getpgrp() (pid int) { //sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) //sysnb Kill(pid int, sig syscall.Signal) (err error) //sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG +//sys Lgetxattr(path string, attr string, dest []byte) (sz int, err error) //sys Listxattr(path string, dest []byte) (sz int, err error) +//sys Llistxattr(path string, dest []byte) (sz int, err error) +//sys Lremovexattr(path string, attr string) (err error) +//sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) //sys Setdomainname(p []byte) (err error) //sys Sethostname(p []byte) (err error) //sysnb Setpgid(pid int, pgid int) (err error) @@ -1080,6 +1294,7 @@ func Setgid(uid int) (err error) { //sys Setpriority(which int, who int, prio int) (err error) //sys Setxattr(path string, attr string, data []byte, flags int) (err error) //sys Sync() +//sys Syncfs(fd int) (err error) //sysnb Sysinfo(info *Sysinfo_t) (err error) //sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) //sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) @@ -1114,14 +1329,33 @@ func Munmap(b []byte) (err error) { //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) -//sys Munlock(b []byte) (err error) //sys Mlockall(flags int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) //sys Munlockall() (err error) +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + /* * Unimplemented */ -// AddKey // AfsSyscall // Alarm // ArchPrctl @@ -1137,7 +1371,6 @@ func Munmap(b []byte) (err error) { // EpollCtlOld // EpollPwait // EpollWaitOld -// Eventfd // Execve // Fgetxattr // Flistxattr @@ -1156,23 +1389,16 @@ func Munmap(b []byte) (err error) { // IoGetevents // IoSetup // IoSubmit -// Ioctl // IoprioGet // IoprioSet // KexecLoad -// Keyctl -// Lgetxattr -// Llistxattr // LookupDcookie -// Lremovexattr -// Lsetxattr // Mbind // MigratePages // Mincore // ModifyLdt // Mount // MovePages -// Mprotect // MqGetsetattr // MqNotify // MqOpen @@ -1184,7 +1410,6 @@ func Munmap(b []byte) (err error) { // Msgget // Msgrcv // Msgsnd -// Msync // Newfstatat // Nfsservctl // Personality @@ -1196,7 +1421,6 @@ func Munmap(b []byte) (err error) { // Readahead // Readv // RemapFilePages -// RequestKey // RestartSyscall // RtSigaction // RtSigpending @@ -1245,7 +1469,6 @@ func Munmap(b []byte) (err error) { // Utimensat // Vfork // Vhangup -// Vmsplice // Vserver // Waitid // _Sysctl diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index 2b881b9793..4774fa363e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -14,21 +14,12 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int32(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = int32(nsec / 1e9) - tv.Usec = int32(nsec % 1e9 / 1e3) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb pipe(p *[2]_C_int) (err error) @@ -185,9 +176,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // On x86 Linux, all the socket calls go through an extra indirection, // I think because the 5-register system call interface can't handle -// the 6-argument calls like sendto and recvfrom. Instead the +// the 6-argument calls like sendto and recvfrom. Instead the // arguments to the underlying system call are the number below -// and a pointer to an array of uintptr. We hide the pointer in the +// and a pointer to an array of uintptr. We hide the pointer in the // socketcall assembly to avoid allocation on every system call. const ( diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 9516a3fd7e..3707f6b7c9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -69,8 +69,6 @@ func Gettimeofday(tv *Timeval) (err error) { return nil } -func Getpagesize() int { return 4096 } - func Time(t *Time_t) (tt Time_t, err error) { var tv Timeval errno := gettimeofday(&tv) @@ -85,19 +83,12 @@ func Time(t *Time_t) (tt Time_t, err error) { //sys Utime(path string, buf *Utimbuf) (err error) -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = nsec / 1e9 - tv.Usec = nsec % 1e9 / 1e3 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } //sysnb pipe(p *[2]_C_int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 71d8702289..226be100f5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -11,21 +11,12 @@ import ( "unsafe" ) -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int32(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = int32(nsec / 1e9) - tv.Usec = int32(nsec % 1e9 / 1e3) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} } func Pipe(p []int) (err error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 4a136396cd..9a8e6e4117 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -21,7 +21,12 @@ package unix //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK -//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6 + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + ts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + return Pselect(nfd, r, w, e, &ts, nil) +} + //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) @@ -66,23 +71,14 @@ func Lstat(path string, stat *Stat_t) (err error) { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) -func Getpagesize() int { return 65536 } - //sysnb Gettimeofday(tv *Timeval) (err error) -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = nsec / 1e9 - tv.Usec = nsec % 1e9 / 1e3 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func Time(t *Time_t) (Time_t, error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 8119fde376..cdda11a9fa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -7,6 +7,7 @@ package unix +//sys Dup2(oldfd int, newfd int) (err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) @@ -22,7 +23,12 @@ package unix //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK -//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6 + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + ts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + return Pselect(nfd, r, w, e, &ts, nil) +} + //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) @@ -54,8 +60,6 @@ package unix //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) -func Getpagesize() int { return 65536 } - //sysnb Gettimeofday(tv *Timeval) (err error) func Time(t *Time_t) (tt Time_t, err error) { @@ -72,19 +76,12 @@ func Time(t *Time_t) (tt Time_t, err error) { //sys Utime(path string, buf *Utimbuf) (err error) -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = nsec / 1e9 - tv.Usec = nsec % 1e9 / 1e3 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func Pipe(p []int) (err error) { @@ -182,9 +179,9 @@ func fillStat_t(s *Stat_t, st *stat_t) { s.Blocks = st.Blocks } -func (r *PtraceRegs) PC() uint64 { return r.Regs[64] } +func (r *PtraceRegs) PC() uint64 { return r.Epc } -func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = pc } +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index be77d24a4a..a114ba8cb3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -99,19 +99,12 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) { return } -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int32(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = int32(nsec / 1e9) - tv.Usec = int32(nsec % 1e9 / 1e3) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb pipe2(p *[2]_C_int, flags int) (err error) @@ -211,9 +204,9 @@ func Setrlimit(resource int, rlim *Rlimit) (err error) { return setrlimit(resource, &rl) } -func (r *PtraceRegs) PC() uint64 { return uint64(r.Regs[64]) } +func (r *PtraceRegs) PC() uint64 { return r.Epc } -func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = uint32(pc) } +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) @@ -235,5 +228,3 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { } return poll(&fds[0], len(fds), timeout) } - -func Getpagesize() int { return 4096 } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 60770f627c..7cae936c45 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -28,7 +28,7 @@ package unix //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK -//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) @@ -61,26 +61,17 @@ package unix //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) -func Getpagesize() int { return 65536 } - //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Time(t *Time_t) (tt Time_t, err error) //sys Utime(path string, buf *Utimbuf) (err error) -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = nsec / 1e9 - tv.Usec = nsec % 1e9 / 1e3 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func (r *PtraceRegs) PC() uint64 { return r.Nip } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 1708a4bbf9..e96a40cb21 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -46,8 +46,6 @@ import ( //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) -func Getpagesize() int { return 4096 } - //sysnb Gettimeofday(tv *Timeval) (err error) func Time(t *Time_t) (tt Time_t, err error) { @@ -64,19 +62,12 @@ func Time(t *Time_t) (tt Time_t, err error) { //sys Utime(path string, buf *Utimbuf) (err error) -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = nsec / 1e9 - tv.Usec = nsec % 1e9 / 1e3 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } //sysnb pipe2(p *[2]_C_int, flags int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index 20b7454d77..012a3285ef 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -6,11 +6,6 @@ package unix -import ( - "sync/atomic" - "syscall" -) - //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Dup2(oldfd int, newfd int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) @@ -63,21 +58,6 @@ import ( //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) -func sysconf(name int) (n int64, err syscall.Errno) - -// pageSize caches the value of Getpagesize, since it can't change -// once the system is booted. -var pageSize int64 // accessed atomically - -func Getpagesize() int { - n := atomic.LoadInt64(&pageSize) - if n == 0 { - n, _ = sysconf(_SC_PAGESIZE) - atomic.StoreInt64(&pageSize, n) - } - return int(n) -} - func Ioperm(from int, num int, on int) (err error) { return ENOSYS } @@ -102,19 +82,12 @@ func Time(t *Time_t) (tt Time_t, err error) { //sys Utime(path string, buf *Utimbuf) (err error) -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Sec = nsec / 1e9 - tv.Usec = int32(nsec % 1e9 / 1e3) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } func (r *PtraceRegs) PC() uint64 { return r.Tpc } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index c4e945cd69..9146809527 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -55,7 +55,6 @@ func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { } func nametomib(name string) (mib []_C_int, err error) { - // Split name into components. var parts []string last := 0 @@ -93,32 +92,16 @@ func nametomib(name string) (mib []_C_int, err error) { return mib, nil } -// ParseDirent parses up to max directory entries in buf, -// appending the names to names. It returns the number -// bytes consumed from buf, the number of entries added -// to names, and the new names slice. -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - if dirent.Reclen == 0 { - buf = nil - break - } - buf = buf[dirent.Reclen:] - if dirent.Fileno == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:dirent.Namlen]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) - } - return origlen - len(buf), count, names +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe() (fd1 int, fd2 int, err error) @@ -140,6 +123,50 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return -1, ENOSYS } +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ @@ -186,11 +213,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Mkdir(path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) -//sys Mlock(b []byte) (err error) -//sys Mlockall(flags int) (err error) -//sys Mprotect(b []byte, prot int) (err error) -//sys Munlock(b []byte) (err error) -//sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) @@ -226,6 +248,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented @@ -404,7 +427,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // getitimer // getvfsstat // getxattr -// ioctl // ktrace // lchflags // lchmod @@ -442,7 +464,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // ntp_adjtime // pmc_control // pmc_get_info -// poll // pollts // preadv // profil diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go index afaca09838..24f74e58ce 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -6,21 +6,12 @@ package unix -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int64(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go index a6ff04ce5b..6878bf7ff9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -6,21 +6,12 @@ package unix -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int64(nsec / 1e9) - ts.Nsec = int64(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go index 68a6969b28..dbbfcf71db 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -6,21 +6,12 @@ package unix -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int64(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 246131d2af..0bda73c384 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -32,7 +32,6 @@ type SockaddrDatalink struct { func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func nametomib(name string) (mib []_C_int, err error) { - // Perform lookup via a binary search left := 0 right := len(sysctlMib) - 1 @@ -53,32 +52,16 @@ func nametomib(name string) (mib []_C_int, err error) { return nil, EINVAL } -// ParseDirent parses up to max directory entries in buf, -// appending the names to names. It returns the number -// bytes consumed from buf, the number of entries added -// to names, and the new names slice. -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - if dirent.Reclen == 0 { - buf = nil - break - } - buf = buf[dirent.Reclen:] - if dirent.Fileno == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:dirent.Namlen]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) - } - return origlen - len(buf), count, names +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe(p *[2]_C_int) (err error) @@ -118,6 +101,50 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ @@ -165,11 +192,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { //sys Mkdir(path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) -//sys Mlock(b []byte) (err error) -//sys Mlockall(flags int) (err error) -//sys Mprotect(b []byte, prot int) (err error) -//sys Munlock(b []byte) (err error) -//sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) @@ -209,6 +231,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented @@ -242,7 +265,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // getresuid // getrtable // getthrid -// ioctl // ktrace // lfs_bmapv // lfs_markv @@ -263,7 +285,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // nfssvc // nnpfspioctl // openat -// poll // preadv // profil // pwritev @@ -298,6 +319,5 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { // thrsleep // thrwakeup // unlinkat -// utimensat // vfork // writev diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go index a66ddc59ce..994964a916 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -6,21 +6,12 @@ package unix -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = int64(nsec / 1e9) - ts.Nsec = int32(nsec % 1e9) - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go index 0776c1faf9..649e67fccc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -6,21 +6,12 @@ package unix -func Getpagesize() int { return 4096 } - -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = nsec % 1e9 / 1e3 - tv.Sec = nsec / 1e9 - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go new file mode 100644 index 0000000000..59844f5041 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -0,0 +1,33 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index acb74b1d15..3ab9e07c8c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -13,7 +13,6 @@ package unix import ( - "sync/atomic" "syscall" "unsafe" ) @@ -44,32 +43,20 @@ func clen(n []byte) int { return len(n) } -// ParseDirent parses up to max directory entries in buf, -// appending the names to names. It returns the number -// bytes consumed from buf, the number of entries added -// to names, and the new names slice. -func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - origlen := len(buf) - for max != 0 && len(buf) > 0 { - dirent := (*Dirent)(unsafe.Pointer(&buf[0])) - if dirent.Reclen == 0 { - buf = nil - break - } - buf = buf[dirent.Reclen:] - if dirent.Ino == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:clen(bytes[:])]) - if name == "." || name == ".." { // Useless names - continue - } - max-- - count++ - names = append(names, name) +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false } - return origlen - len(buf), count, names + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true } //sysnb pipe(p *[2]_C_int) (n int, err error) @@ -179,7 +166,7 @@ func Getwd() (wd string, err error) { func Getgroups() (gids []int, err error) { n, err := getgroups(0, nil) - // Check for error and sanity check group count. Newer versions of + // Check for error and sanity check group count. Newer versions of // Solaris allow up to 1024 (NGROUPS_MAX). if n < 0 || n > 1024 { if err != nil { @@ -363,7 +350,7 @@ func Futimesat(dirfd int, path string, tv []Timeval) error { } // Solaris doesn't have an futimes function because it allows NULL to be -// specified as the path for futimesat. However, Go doesn't like +// specified as the path for futimesat. However, Go doesn't like // NULL-style string interfaces, so this simple wrapper is provided. func Futimes(fd int, tv []Timeval) error { if tv == nil { @@ -434,7 +421,7 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } -//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr @@ -453,7 +440,7 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from iov.Base = &dummy iov.SetLen(1) } - msg.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + msg.Accrightslen = int32(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 @@ -473,7 +460,7 @@ func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { return } -//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.sendmsg +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { var ptr unsafe.Pointer @@ -499,7 +486,7 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) iov.Base = &dummy iov.SetLen(1) } - msg.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + msg.Accrightslen = int32(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 @@ -527,52 +514,79 @@ func Acct(path string) (err error) { return acct(pathp) } +//sys __makedev(version int, major uint, minor uint) (val uint64) + +func Mkdev(major, minor uint32) uint64 { + return __makedev(NEWDEV, uint(major), uint(minor)) +} + +//sys __major(version int, dev uint64) (val uint) + +func Major(dev uint64) uint32 { + return uint32(__major(NEWDEV, dev)) +} + +//sys __minor(version int, dev uint64) (val uint) + +func Minor(dev uint64) uint32 { + return uint32(__minor(NEWDEV, dev)) +} + /* * Expose the ioctl function */ -//sys ioctl(fd int, req int, arg uintptr) (err error) +//sys ioctl(fd int, req uint, arg uintptr) (err error) -func IoctlSetInt(fd int, req int, value int) (err error) { +func IoctlSetInt(fd int, req uint, value int) (err error) { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req int, value *Winsize) (err error) { +func IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req int, value *Termios) (err error) { +func IoctlSetTermios(fd int, req uint, value *Termios) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermio(fd int, req int, value *Termio) (err error) { +func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlGetInt(fd int, req int) (int, error) { +func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } -func IoctlGetWinsize(fd int, req int) (*Winsize, error) { +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } -func IoctlGetTermios(fd int, req int) (*Termios, error) { +func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } -func IoctlGetTermio(fd int, req int) (*Termio, error) { +func IoctlGetTermio(fd int, req uint) (*Termio, error) { var value Termio err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + /* * Exposed directly */ @@ -593,8 +607,10 @@ func IoctlGetTermio(fd int, req int) (*Termio, error) { //sys Fchown(fd int, uid int, gid int) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) //sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) //sysnb Getgid() (gid int) //sysnb Getpid() (pid int) @@ -611,7 +627,7 @@ func IoctlGetTermio(fd int, req int) (*Termio, error) { //sys Kill(pid int, signum syscall.Signal) (err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) -//sys Listen(s int, backlog int) (err error) = libsocket.listen +//sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten //sys Lstat(path string, stat *Stat_t) (err error) //sys Madvise(b []byte, advice int) (err error) //sys Mkdir(path string, mode uint32) (err error) @@ -623,6 +639,7 @@ func IoctlGetTermio(fd int, req int) (*Termio, error) { //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) //sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) @@ -651,6 +668,7 @@ func IoctlGetTermio(fd int, req int) (*Termio, error) { //sysnb Setuid(uid int) (err error) //sys Shutdown(s int, how int) (err error) = libsocket.shutdown //sys Stat(path string, stat *Stat_t) (err error) +//sys Statvfs(path string, vfsstat *Statvfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) //sysnb Times(tms *Tms) (ticks uintptr, err error) @@ -664,15 +682,15 @@ func IoctlGetTermio(fd int, req int) (*Termio, error) { //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) //sys Utime(path string, buf *Utimbuf) (err error) -//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.bind -//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.connect +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.sendto -//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.socket -//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.socketpair +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto +//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair //sys write(fd int, p []byte) (n int, err error) -//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.getsockopt +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom @@ -708,18 +726,3 @@ func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, e func Munmap(b []byte) (err error) { return mapper.Munmap(b) } - -//sys sysconf(name int) (n int64, err error) - -// pageSize caches the value of Getpagesize, since it can't change -// once the system is booted. -var pageSize int64 // accessed atomically - -func Getpagesize() int { - n := atomic.LoadInt64(&pageSize) - if n == 0 { - n, _ = sysconf(_SC_PAGESIZE) - atomic.StoreInt64(&pageSize, n) - } - return int(n) -} diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go index 5aff62c3bb..9d4e7a678f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -6,19 +6,12 @@ package unix -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } - -func NsecToTimespec(nsec int64) (ts Timespec) { - ts.Sec = nsec / 1e9 - ts.Nsec = nsec % 1e9 - return +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} } -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = nsec % 1e9 / 1e3 - tv.Sec = int64(nsec / 1e9) - return +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} } func (iov *Iovec) SetLen(length int) { diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 8a5237de8a..3ed8a91f5c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -23,6 +23,7 @@ const ( darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8 netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4 + solaris64Bit = runtime.GOOS == "solaris" && sizeofPtr == 8 ) // Do the interface allocations only once for common diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go new file mode 100644 index 0000000000..139fbbebbb --- /dev/null +++ b/vendor/golang.org/x/sys/unix/timestruct.go @@ -0,0 +1,62 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +// TimespecToNsec converts a Timespec value into a number of +// nanoseconds since the Unix epoch. +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +// NsecToTimespec takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timespec value. +func NsecToTimespec(nsec int64) Timespec { + sec := nsec / 1e9 + nsec = nsec % 1e9 + if nsec < 0 { + nsec += 1e9 + sec-- + } + return setTimespec(sec, nsec) +} + +// TimevalToNsec converts a Timeval value into a number of nanoseconds +// since the Unix epoch. +func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } + +// NsecToTimeval takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timeval value. +func NsecToTimeval(nsec int64) Timeval { + nsec += 999 // round up to microsecond + usec := nsec % 1e9 / 1e3 + sec := nsec / 1e9 + if usec < 0 { + usec += 1e6 + sec-- + } + return setTimeval(sec, usec) +} + +// Unix returns ts as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +// Unix returns tv as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/golang.org/x/sys/unix/types_darwin.go deleted file mode 100644 index 1153261822..0000000000 --- a/vendor/golang.org/x/sys/unix/types_darwin.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define __DARWIN_UNIX03 0 -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat64 - -type Statfs_t C.struct_statfs64 - -type Flock_t C.struct_flock - -type Fstore_t C.struct_fstore - -type Radvisory_t C.struct_radvisory - -type Fbootstraptransfer_t C.struct_fbootstraptransfer - -type Log2phys_t C.struct_log2phys - -type Fsid C.struct_fsid - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfmaMsghdr2 C.struct_ifma_msghdr2 - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) diff --git a/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/golang.org/x/sys/unix/types_dragonfly.go deleted file mode 100644 index f3c971dffd..0000000000 --- a/vendor/golang.org/x/sys/unix/types_dragonfly.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( // Directory mode bits - S_IFMT = C.S_IFMT - S_IFIFO = C.S_IFIFO - S_IFCHR = C.S_IFCHR - S_IFDIR = C.S_IFDIR - S_IFBLK = C.S_IFBLK - S_IFREG = C.S_IFREG - S_IFLNK = C.S_IFLNK - S_IFSOCK = C.S_IFSOCK - S_ISUID = C.S_ISUID - S_ISGID = C.S_ISGID - S_ISVTX = C.S_ISVTX - S_IRUSR = C.S_IRUSR - S_IWUSR = C.S_IWUSR - S_IXUSR = C.S_IXUSR -) - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.struct_fsid - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go deleted file mode 100644 index ae24557ad1..0000000000 --- a/vendor/golang.org/x/sys/unix/types_freebsd.go +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -// This structure is a duplicate of stat on FreeBSD 8-STABLE. -// See /usr/include/sys/stat.h. -struct stat8 { -#undef st_atimespec st_atim -#undef st_mtimespec st_mtim -#undef st_ctimespec st_ctim -#undef st_birthtimespec st_birthtim - __dev_t st_dev; - ino_t st_ino; - mode_t st_mode; - nlink_t st_nlink; - uid_t st_uid; - gid_t st_gid; - __dev_t st_rdev; -#if __BSD_VISIBLE - struct timespec st_atimespec; - struct timespec st_mtimespec; - struct timespec st_ctimespec; -#else - time_t st_atime; - long __st_atimensec; - time_t st_mtime; - long __st_mtimensec; - time_t st_ctime; - long __st_ctimensec; -#endif - off_t st_size; - blkcnt_t st_blocks; - blksize_t st_blksize; - fflags_t st_flags; - __uint32_t st_gen; - __int32_t st_lspare; -#if __BSD_VISIBLE - struct timespec st_birthtimespec; - unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); - unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); -#else - time_t st_birthtime; - long st_birthtimensec; - unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); - unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); -#endif -}; - -// This structure is a duplicate of if_data on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_data8 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; - time_t ifi_epoch; - struct timeval ifi_lastchange; -}; - -// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_msghdr8 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data8 ifm_data; -}; -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( // Directory mode bits - S_IFMT = C.S_IFMT - S_IFIFO = C.S_IFIFO - S_IFCHR = C.S_IFCHR - S_IFDIR = C.S_IFDIR - S_IFBLK = C.S_IFBLK - S_IFREG = C.S_IFREG - S_IFLNK = C.S_IFLNK - S_IFSOCK = C.S_IFSOCK - S_ISUID = C.S_ISUID - S_ISGID = C.S_ISGID - S_ISVTX = C.S_ISVTX - S_IRUSR = C.S_IRUSR - S_IWUSR = C.S_IWUSR - S_IXUSR = C.S_IXUSR -) - -type Stat_t C.struct_stat8 - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.struct_fsid - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPMreqn C.struct_ip_mreqn - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPMreqn = C.sizeof_struct_ip_mreqn - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - sizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 - sizeofIfData = C.sizeof_struct_if_data - SizeofIfData = C.sizeof_struct_if_data8 - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type ifMsghdr C.struct_if_msghdr - -type IfMsghdr C.struct_if_msghdr8 - -type ifData C.struct_if_data - -type IfData C.struct_if_data8 - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr - SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfZbuf C.struct_bpf_zbuf - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfZbufHeader C.struct_bpf_zbuf_header - -// Terminal handling - -type Termios C.struct_termios diff --git a/vendor/golang.org/x/sys/unix/types_linux.go b/vendor/golang.org/x/sys/unix/types_linux.go deleted file mode 100644 index a08f7fb472..0000000000 --- a/vendor/golang.org/x/sys/unix/types_linux.go +++ /dev/null @@ -1,465 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define _LARGEFILE_SOURCE -#define _LARGEFILE64_SOURCE -#define _FILE_OFFSET_BITS 64 -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef TCSETS2 -// On systems that have "struct termios2" use this as type Termios. -typedef struct termios2 termios_t; -#else -typedef struct termios termios_t; -#endif - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_ll s5; - struct sockaddr_nl s6; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -// copied from /usr/include/linux/un.h -struct my_sockaddr_un { - sa_family_t sun_family; -#if defined(__ARM_EABI__) || defined(__powerpc64__) - // on ARM char is by default unsigned - signed char sun_path[108]; -#else - char sun_path[108]; -#endif -}; - -#ifdef __ARM_EABI__ -typedef struct user_regs PtraceRegs; -#elif defined(__aarch64__) -typedef struct user_pt_regs PtraceRegs; -#elif defined(__powerpc64__) -typedef struct pt_regs PtraceRegs; -#elif defined(__mips__) -typedef struct user PtraceRegs; -#elif defined(__s390x__) -typedef struct _user_regs_struct PtraceRegs; -#elif defined(__sparc__) -#include -typedef struct pt_regs PtraceRegs; -#else -typedef struct user_regs_struct PtraceRegs; -#endif - -#if defined(__s390x__) -typedef struct _user_psw_struct ptracePsw; -typedef struct _user_fpregs_struct ptraceFpregs; -typedef struct _user_per_struct ptracePer; -#else -typedef struct {} ptracePsw; -typedef struct {} ptraceFpregs; -typedef struct {} ptracePer; -#endif - -// The real epoll_event is a union, and godefs doesn't handle it well. -struct my_epoll_event { - uint32_t events; -#if defined(__ARM_EABI__) || defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABIO32) - // padding is not specified in linux/eventpoll.h but added to conform to the - // alignment requirements of EABI - int32_t padFd; -#elif defined(__powerpc64__) || defined(__s390x__) || defined(__sparc__) - int32_t _padFd; -#endif - int32_t fd; - int32_t pad; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timex C.struct_timex - -type Time_t C.time_t - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -type Flock_t C.struct_flock - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_my_sockaddr_un - -type RawSockaddrLinklayer C.struct_sockaddr_ll - -type RawSockaddrNetlink C.struct_sockaddr_nl - -type RawSockaddrHCI C.struct_sockaddr_hci - -type RawSockaddrCAN C.struct_sockaddr_can - -type RawSockaddrALG C.struct_sockaddr_alg - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPMreqn C.struct_ip_mreqn - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -type Ucred C.struct_ucred - -type TCPInfo C.struct_tcp_info - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll - SizeofSockaddrNetlink = C.sizeof_struct_sockaddr_nl - SizeofSockaddrHCI = C.sizeof_struct_sockaddr_hci - SizeofSockaddrCAN = C.sizeof_struct_sockaddr_can - SizeofSockaddrALG = C.sizeof_struct_sockaddr_alg - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPMreqn = C.sizeof_struct_ip_mreqn - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter - SizeofUcred = C.sizeof_struct_ucred - SizeofTCPInfo = C.sizeof_struct_tcp_info -) - -// Netlink routing and interface messages - -const ( - IFA_UNSPEC = C.IFA_UNSPEC - IFA_ADDRESS = C.IFA_ADDRESS - IFA_LOCAL = C.IFA_LOCAL - IFA_LABEL = C.IFA_LABEL - IFA_BROADCAST = C.IFA_BROADCAST - IFA_ANYCAST = C.IFA_ANYCAST - IFA_CACHEINFO = C.IFA_CACHEINFO - IFA_MULTICAST = C.IFA_MULTICAST - IFLA_UNSPEC = C.IFLA_UNSPEC - IFLA_ADDRESS = C.IFLA_ADDRESS - IFLA_BROADCAST = C.IFLA_BROADCAST - IFLA_IFNAME = C.IFLA_IFNAME - IFLA_MTU = C.IFLA_MTU - IFLA_LINK = C.IFLA_LINK - IFLA_QDISC = C.IFLA_QDISC - IFLA_STATS = C.IFLA_STATS - IFLA_COST = C.IFLA_COST - IFLA_PRIORITY = C.IFLA_PRIORITY - IFLA_MASTER = C.IFLA_MASTER - IFLA_WIRELESS = C.IFLA_WIRELESS - IFLA_PROTINFO = C.IFLA_PROTINFO - IFLA_TXQLEN = C.IFLA_TXQLEN - IFLA_MAP = C.IFLA_MAP - IFLA_WEIGHT = C.IFLA_WEIGHT - IFLA_OPERSTATE = C.IFLA_OPERSTATE - IFLA_LINKMODE = C.IFLA_LINKMODE - IFLA_LINKINFO = C.IFLA_LINKINFO - IFLA_NET_NS_PID = C.IFLA_NET_NS_PID - IFLA_IFALIAS = C.IFLA_IFALIAS - IFLA_MAX = C.IFLA_MAX - RT_SCOPE_UNIVERSE = C.RT_SCOPE_UNIVERSE - RT_SCOPE_SITE = C.RT_SCOPE_SITE - RT_SCOPE_LINK = C.RT_SCOPE_LINK - RT_SCOPE_HOST = C.RT_SCOPE_HOST - RT_SCOPE_NOWHERE = C.RT_SCOPE_NOWHERE - RT_TABLE_UNSPEC = C.RT_TABLE_UNSPEC - RT_TABLE_COMPAT = C.RT_TABLE_COMPAT - RT_TABLE_DEFAULT = C.RT_TABLE_DEFAULT - RT_TABLE_MAIN = C.RT_TABLE_MAIN - RT_TABLE_LOCAL = C.RT_TABLE_LOCAL - RT_TABLE_MAX = C.RT_TABLE_MAX - RTA_UNSPEC = C.RTA_UNSPEC - RTA_DST = C.RTA_DST - RTA_SRC = C.RTA_SRC - RTA_IIF = C.RTA_IIF - RTA_OIF = C.RTA_OIF - RTA_GATEWAY = C.RTA_GATEWAY - RTA_PRIORITY = C.RTA_PRIORITY - RTA_PREFSRC = C.RTA_PREFSRC - RTA_METRICS = C.RTA_METRICS - RTA_MULTIPATH = C.RTA_MULTIPATH - RTA_FLOW = C.RTA_FLOW - RTA_CACHEINFO = C.RTA_CACHEINFO - RTA_TABLE = C.RTA_TABLE - RTN_UNSPEC = C.RTN_UNSPEC - RTN_UNICAST = C.RTN_UNICAST - RTN_LOCAL = C.RTN_LOCAL - RTN_BROADCAST = C.RTN_BROADCAST - RTN_ANYCAST = C.RTN_ANYCAST - RTN_MULTICAST = C.RTN_MULTICAST - RTN_BLACKHOLE = C.RTN_BLACKHOLE - RTN_UNREACHABLE = C.RTN_UNREACHABLE - RTN_PROHIBIT = C.RTN_PROHIBIT - RTN_THROW = C.RTN_THROW - RTN_NAT = C.RTN_NAT - RTN_XRESOLVE = C.RTN_XRESOLVE - RTNLGRP_NONE = C.RTNLGRP_NONE - RTNLGRP_LINK = C.RTNLGRP_LINK - RTNLGRP_NOTIFY = C.RTNLGRP_NOTIFY - RTNLGRP_NEIGH = C.RTNLGRP_NEIGH - RTNLGRP_TC = C.RTNLGRP_TC - RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR - RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE - RTNLGRP_IPV4_ROUTE = C.RTNLGRP_IPV4_ROUTE - RTNLGRP_IPV4_RULE = C.RTNLGRP_IPV4_RULE - RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR - RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE - RTNLGRP_IPV6_ROUTE = C.RTNLGRP_IPV6_ROUTE - RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO - RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX - RTNLGRP_IPV6_RULE = C.RTNLGRP_IPV6_RULE - RTNLGRP_ND_USEROPT = C.RTNLGRP_ND_USEROPT - SizeofNlMsghdr = C.sizeof_struct_nlmsghdr - SizeofNlMsgerr = C.sizeof_struct_nlmsgerr - SizeofRtGenmsg = C.sizeof_struct_rtgenmsg - SizeofNlAttr = C.sizeof_struct_nlattr - SizeofRtAttr = C.sizeof_struct_rtattr - SizeofIfInfomsg = C.sizeof_struct_ifinfomsg - SizeofIfAddrmsg = C.sizeof_struct_ifaddrmsg - SizeofRtMsg = C.sizeof_struct_rtmsg - SizeofRtNexthop = C.sizeof_struct_rtnexthop -) - -type NlMsghdr C.struct_nlmsghdr - -type NlMsgerr C.struct_nlmsgerr - -type RtGenmsg C.struct_rtgenmsg - -type NlAttr C.struct_nlattr - -type RtAttr C.struct_rtattr - -type IfInfomsg C.struct_ifinfomsg - -type IfAddrmsg C.struct_ifaddrmsg - -type RtMsg C.struct_rtmsg - -type RtNexthop C.struct_rtnexthop - -// Linux socket filter - -const ( - SizeofSockFilter = C.sizeof_struct_sock_filter - SizeofSockFprog = C.sizeof_struct_sock_fprog -) - -type SockFilter C.struct_sock_filter - -type SockFprog C.struct_sock_fprog - -// Inotify - -type InotifyEvent C.struct_inotify_event - -const SizeofInotifyEvent = C.sizeof_struct_inotify_event - -// Ptrace - -// Register structures -type PtraceRegs C.PtraceRegs - -// Structures contained in PtraceRegs on s390x (exported by mkpost.go) -type ptracePsw C.ptracePsw - -type ptraceFpregs C.ptraceFpregs - -type ptracePer C.ptracePer - -// Misc - -type FdSet C.fd_set - -type Sysinfo_t C.struct_sysinfo - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -type EpollEvent C.struct_my_epoll_event - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -type PollFd C.struct_pollfd - -const ( - POLLIN = C.POLLIN - POLLPRI = C.POLLPRI - POLLOUT = C.POLLOUT - POLLRDHUP = C.POLLRDHUP - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLNVAL = C.POLLNVAL -) - -type Sigset_t C.sigset_t - -// sysconf information - -const _SC_PAGESIZE = C._SC_PAGESIZE - -// Terminal handling - -type Termios C.termios_t diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go deleted file mode 100644 index d15f93d192..0000000000 --- a/vendor/golang.org/x/sys/unix/types_netbsd.go +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -// Sysctl - -type Sysctlnode C.struct_sysctlnode diff --git a/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/golang.org/x/sys/unix/types_openbsd.go deleted file mode 100644 index b66fe25f73..0000000000 --- a/vendor/golang.org/x/sys/unix/types_openbsd.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( // Directory mode bits - S_IFMT = C.S_IFMT - S_IFIFO = C.S_IFIFO - S_IFCHR = C.S_IFCHR - S_IFDIR = C.S_IFDIR - S_IFBLK = C.S_IFBLK - S_IFREG = C.S_IFREG - S_IFLNK = C.S_IFLNK - S_IFSOCK = C.S_IFSOCK - S_ISUID = C.S_ISUID - S_ISGID = C.S_ISGID - S_ISVTX = C.S_ISVTX - S_IRUSR = C.S_IRUSR - S_IWUSR = C.S_IWUSR - S_IXUSR = C.S_IXUSR -) - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go deleted file mode 100644 index c5d5c8f16a..0000000000 --- a/vendor/golang.org/x/sys/unix/types_solaris.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -// These defines ensure that builds done on newer versions of Solaris are -// backwards-compatible with older versions of Solaris and -// OpenSolaris-based derivatives. -#define __USE_SUNOS_SOCKETS__ // msghdr -#define __USE_LEGACY_PROTOTYPES__ // iovec -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX - MaxHostNameLen = C.MAXHOSTNAMELEN -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( // Directory mode bits - S_IFMT = C.S_IFMT - S_IFIFO = C.S_IFIFO - S_IFCHR = C.S_IFCHR - S_IFDIR = C.S_IFDIR - S_IFBLK = C.S_IFBLK - S_IFREG = C.S_IFREG - S_IFLNK = C.S_IFLNK - S_IFSOCK = C.S_IFSOCK - S_ISUID = C.S_ISUID - S_ISGID = C.S_ISGID - S_ISVTX = C.S_ISVTX - S_IRUSR = C.S_IRUSR - S_IWUSR = C.S_IWUSR - S_IXUSR = C.S_IXUSR -) - -type Stat_t C.struct_stat - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Select - -type FdSet C.fd_set - -// Misc - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_EACCESS = C.AT_EACCESS -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfTimeval C.struct_bpf_timeval - -type BpfHdr C.struct_bpf_hdr - -// sysconf information - -const _SC_PAGESIZE = C._SC_PAGESIZE - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go index 8e63888351..c90ebcf7a2 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -1,5 +1,5 @@ // mkerrors.sh -m32 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,darwin @@ -48,6 +48,87 @@ const ( AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 @@ -138,9 +219,26 @@ const ( BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 CREAD = 0x800 + CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -332,13 +430,14 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xe - EVFILT_THREADMARKER = 0xe + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc @@ -349,6 +448,7 @@ const ( EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 @@ -359,16 +459,30 @@ const ( EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 @@ -396,6 +510,7 @@ const ( F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 @@ -412,6 +527,7 @@ const ( F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 @@ -652,6 +768,7 @@ const ( IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f @@ -742,6 +859,7 @@ const ( IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 @@ -770,11 +888,13 @@ const ( MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 @@ -786,9 +906,43 @@ const ( MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 @@ -819,7 +973,13 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 @@ -843,11 +1003,14 @@ const ( NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 @@ -872,6 +1035,7 @@ const ( ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 + OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 @@ -880,6 +1044,7 @@ const ( O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 @@ -932,7 +1097,10 @@ const ( RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 @@ -1102,6 +1270,8 @@ const ( SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 @@ -1157,11 +1327,22 @@ const ( S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 TCIFLUSH = 0x1 + TCIOFF = 0x3 TCIOFLUSH = 0x3 + TCION = 0x4 TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 @@ -1261,6 +1442,11 @@ const ( VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index 9594f93817..8991948649 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -1,5 +1,5 @@ // mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,darwin @@ -48,6 +48,87 @@ const ( AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 @@ -138,9 +219,26 @@ const ( BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 CREAD = 0x800 + CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -332,13 +430,14 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xe - EVFILT_THREADMARKER = 0xe + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc @@ -349,6 +448,7 @@ const ( EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 @@ -359,16 +459,30 @@ const ( EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 @@ -396,6 +510,7 @@ const ( F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 @@ -412,6 +527,7 @@ const ( F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 @@ -652,6 +768,7 @@ const ( IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f @@ -742,6 +859,7 @@ const ( IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 @@ -770,11 +888,13 @@ const ( MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 @@ -786,9 +906,43 @@ const ( MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 @@ -819,7 +973,13 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 @@ -843,11 +1003,14 @@ const ( NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 @@ -872,6 +1035,7 @@ const ( ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 + OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 @@ -880,6 +1044,7 @@ const ( O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 @@ -932,7 +1097,10 @@ const ( RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 @@ -1102,6 +1270,8 @@ const ( SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 @@ -1157,11 +1327,22 @@ const ( S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 TCIFLUSH = 0x1 + TCIOFF = 0x3 TCIOFLUSH = 0x3 + TCION = 0x4 TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 @@ -1261,6 +1442,11 @@ const ( VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go index a410e88edd..c41a6b8790 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -1,11 +1,11 @@ // mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- _const.go -// +build arm,darwin - package unix import "syscall" @@ -48,6 +48,87 @@ const ( AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 @@ -86,6 +167,7 @@ const ( BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044278 BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e BIOCSETIF = 0x8020426c BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 @@ -137,9 +219,26 @@ const ( BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 CREAD = 0x800 + CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -152,33 +251,168 @@ const ( CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -196,13 +430,14 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xe - EVFILT_THREADMARKER = 0xe + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc @@ -213,6 +448,7 @@ const ( EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 @@ -223,16 +459,30 @@ const ( EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 @@ -260,6 +510,7 @@ const ( F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 @@ -276,6 +527,7 @@ const ( F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 @@ -347,6 +599,7 @@ const ( IFT_PDP = 0xff IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe IFT_PPP = 0x17 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 @@ -515,7 +768,8 @@ const ( IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FRAGTTL = 0x78 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 @@ -605,6 +859,7 @@ const ( IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 @@ -633,11 +888,13 @@ const ( MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 @@ -649,9 +906,43 @@ const ( MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 @@ -682,7 +973,13 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 @@ -706,11 +1003,14 @@ const ( NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 @@ -735,6 +1035,7 @@ const ( ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 + OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 @@ -743,6 +1044,7 @@ const ( O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 @@ -795,7 +1097,10 @@ const ( RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 @@ -830,6 +1135,7 @@ const ( RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 RTF_PINNED = 0x100000 RTF_PRCLONING = 0x10000 RTF_PROTO1 = 0x8000 @@ -964,6 +1270,8 @@ const ( SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 @@ -1019,11 +1327,22 @@ const ( S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 TCIFLUSH = 0x1 + TCIOFF = 0x3 TCIOFLUSH = 0x3 + TCION = 0x4 TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 @@ -1123,6 +1442,11 @@ const ( VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc @@ -1291,3 +1615,148 @@ const ( SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index 3189c6b345..73f8c8784c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -1,5 +1,5 @@ // mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,darwin @@ -48,6 +48,87 @@ const ( AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 @@ -138,9 +219,26 @@ const ( BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 CREAD = 0x800 + CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -332,13 +430,14 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xe - EVFILT_THREADMARKER = 0xe + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc @@ -349,6 +448,7 @@ const ( EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 @@ -359,16 +459,30 @@ const ( EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 @@ -396,6 +510,7 @@ const ( F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 @@ -412,6 +527,7 @@ const ( F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 @@ -652,6 +768,7 @@ const ( IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f @@ -742,6 +859,7 @@ const ( IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 @@ -770,11 +888,13 @@ const ( MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 @@ -786,9 +906,43 @@ const ( MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 @@ -819,7 +973,13 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 @@ -843,11 +1003,14 @@ const ( NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 @@ -872,6 +1035,7 @@ const ( ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 + OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 @@ -880,6 +1044,7 @@ const ( O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 @@ -932,7 +1097,10 @@ const ( RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 @@ -1102,6 +1270,8 @@ const ( SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 @@ -1157,11 +1327,22 @@ const ( S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 TCIFLUSH = 0x1 + TCIOFF = 0x3 TCIOFLUSH = 0x3 + TCION = 0x4 TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 @@ -1261,6 +1442,11 @@ const ( VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go index 0feceee151..8f40598bb3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -1,5 +1,5 @@ // mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly @@ -37,8 +37,8 @@ const ( AF_MAX = 0x24 AF_MPLS = 0x22 AF_NATM = 0x1d + AF_NETBIOS = 0x6 AF_NETGRAPH = 0x20 - AF_NS = 0x6 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 @@ -46,6 +46,7 @@ const ( AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 + ALTWERASE = 0x200 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 @@ -141,7 +142,22 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 CREAD = 0x800 + CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -286,24 +302,28 @@ const ( ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_EXCEPT = -0x8 + EVFILT_FS = -0xa EVFILT_MARKER = 0xf EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0x8 + EVFILT_SYSCOUNT = 0xa EVFILT_TIMER = -0x7 + EVFILT_USER = -0x9 EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_NODATA = 0x1000 EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 @@ -679,7 +699,6 @@ const ( IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 - IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEP = 0x21 IPPROTO_SKIP = 0x39 @@ -730,6 +749,7 @@ const ( IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff + IPV6_MINHLIM = 0x28 IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa @@ -778,6 +798,7 @@ const ( IP_FW_FLUSH = 0x34 IP_FW_GET = 0x36 IP_FW_RESETLOG = 0x37 + IP_FW_X = 0x31 IP_FW_ZERO = 0x35 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 @@ -833,6 +854,7 @@ const ( MADV_SETMAP = 0xb MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 @@ -851,6 +873,7 @@ const ( MAP_VPAGETABLE = 0x2000 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x1000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 @@ -860,11 +883,11 @@ const ( MSG_FMASK = 0xffff0000 MSG_FNONBLOCKING = 0x20000 MSG_NOSIGNAL = 0x400 - MSG_NOTIFICATION = 0x200 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_SYNC = 0x800 MSG_TRUNC = 0x10 + MSG_UNUSED09 = 0x200 MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 @@ -875,12 +898,19 @@ const ( NET_RT_IFLIST = 0x3 NET_RT_MAXID = 0x4 NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 @@ -891,6 +921,7 @@ const ( NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 @@ -898,6 +929,7 @@ const ( ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 + OXTABS = 0x4 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 @@ -910,14 +942,11 @@ const ( O_FAPPEND = 0x100000 O_FASYNCWRITE = 0x800000 O_FBLOCKING = 0x40000 - O_FBUFFERED = 0x2000000 - O_FMASK = 0x7fc0000 + O_FMASK = 0xfc0000 O_FNONBLOCKING = 0x80000 O_FOFFSET = 0x200000 O_FSYNC = 0x80 O_FSYNCWRITE = 0x400000 - O_FUNBUFFERED = 0x1000000 - O_MAPONREAD = 0x4000000 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 @@ -1096,8 +1125,10 @@ const ( SIOCSLIFPHYADDR = 0x8118694a SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 @@ -1107,6 +1138,7 @@ const ( SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BROADCAST = 0x20 + SO_CPUHINT = 0x1030 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 @@ -1127,8 +1159,12 @@ const ( SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 TCIFLUSH = 0x1 + TCIOFF = 0x3 TCIOFLUSH = 0x3 + TCION = 0x4 TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 TCP_FASTKEEP = 0x80 TCP_KEEPCNT = 0x400 TCP_KEEPIDLE = 0x100 @@ -1227,6 +1263,8 @@ const ( VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 + VM_BCACHE_SIZE_MAX = 0x0 + VM_SWZONE_SIZE_MAX = 0x4000000000 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index 7b95751c3d..adf5eef0f8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -1,5 +1,5 @@ // mkerrors.sh -m32 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd @@ -11,1456 +11,1462 @@ package unix import "syscall" const ( - AF_APPLETALK = 0x10 - AF_ARP = 0x23 - AF_ATM = 0x1e - AF_BLUETOOTH = 0x24 - AF_CCITT = 0xa - AF_CHAOS = 0x5 - AF_CNT = 0x15 - AF_COIP = 0x14 - AF_DATAKIT = 0x9 - AF_DECnet = 0xc - AF_DLI = 0xd - AF_E164 = 0x1a - AF_ECMA = 0x8 - AF_HYLINK = 0xf - AF_IEEE80211 = 0x25 - AF_IMPLINK = 0x3 - AF_INET = 0x2 - AF_INET6 = 0x1c - AF_INET6_SDP = 0x2a - AF_INET_SDP = 0x28 - AF_IPX = 0x17 - AF_ISDN = 0x1a - AF_ISO = 0x7 - AF_LAT = 0xe - AF_LINK = 0x12 - AF_LOCAL = 0x1 - AF_MAX = 0x2a - AF_NATM = 0x1d - AF_NETBIOS = 0x6 - AF_NETGRAPH = 0x20 - AF_OSI = 0x7 - AF_PUP = 0x4 - AF_ROUTE = 0x11 - AF_SCLUSTER = 0x22 - AF_SIP = 0x18 - AF_SLOW = 0x21 - AF_SNA = 0xb - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VENDOR00 = 0x27 - AF_VENDOR01 = 0x29 - AF_VENDOR02 = 0x2b - AF_VENDOR03 = 0x2d - AF_VENDOR04 = 0x2f - AF_VENDOR05 = 0x31 - AF_VENDOR06 = 0x33 - AF_VENDOR07 = 0x35 - AF_VENDOR08 = 0x37 - AF_VENDOR09 = 0x39 - AF_VENDOR10 = 0x3b - AF_VENDOR11 = 0x3d - AF_VENDOR12 = 0x3f - AF_VENDOR13 = 0x41 - AF_VENDOR14 = 0x43 - AF_VENDOR15 = 0x45 - AF_VENDOR16 = 0x47 - AF_VENDOR17 = 0x49 - AF_VENDOR18 = 0x4b - AF_VENDOR19 = 0x4d - AF_VENDOR20 = 0x4f - AF_VENDOR21 = 0x51 - AF_VENDOR22 = 0x53 - AF_VENDOR23 = 0x55 - AF_VENDOR24 = 0x57 - AF_VENDOR25 = 0x59 - AF_VENDOR26 = 0x5b - AF_VENDOR27 = 0x5d - AF_VENDOR28 = 0x5f - AF_VENDOR29 = 0x61 - AF_VENDOR30 = 0x63 - AF_VENDOR31 = 0x65 - AF_VENDOR32 = 0x67 - AF_VENDOR33 = 0x69 - AF_VENDOR34 = 0x6b - AF_VENDOR35 = 0x6d - AF_VENDOR36 = 0x6f - AF_VENDOR37 = 0x71 - AF_VENDOR38 = 0x73 - AF_VENDOR39 = 0x75 - AF_VENDOR40 = 0x77 - AF_VENDOR41 = 0x79 - AF_VENDOR42 = 0x7b - AF_VENDOR43 = 0x7d - AF_VENDOR44 = 0x7f - AF_VENDOR45 = 0x81 - AF_VENDOR46 = 0x83 - AF_VENDOR47 = 0x85 - B0 = 0x0 - B110 = 0x6e - B115200 = 0x1c200 - B1200 = 0x4b0 - B134 = 0x86 - B14400 = 0x3840 - B150 = 0x96 - B1800 = 0x708 - B19200 = 0x4b00 - B200 = 0xc8 - B230400 = 0x38400 - B2400 = 0x960 - B28800 = 0x7080 - B300 = 0x12c - B38400 = 0x9600 - B460800 = 0x70800 - B4800 = 0x12c0 - B50 = 0x32 - B57600 = 0xe100 - B600 = 0x258 - B7200 = 0x1c20 - B75 = 0x4b - B76800 = 0x12c00 - B921600 = 0xe1000 - B9600 = 0x2580 - BIOCFEEDBACK = 0x8004427c - BIOCFLUSH = 0x20004268 - BIOCGBLEN = 0x40044266 - BIOCGDIRECTION = 0x40044276 - BIOCGDLT = 0x4004426a - BIOCGDLTLIST = 0xc0084279 - BIOCGETBUFMODE = 0x4004427d - BIOCGETIF = 0x4020426b - BIOCGETZMAX = 0x4004427f - BIOCGHDRCMPLT = 0x40044274 - BIOCGRSIG = 0x40044272 - BIOCGRTIMEOUT = 0x4008426e - BIOCGSEESENT = 0x40044276 - BIOCGSTATS = 0x4008426f - BIOCGTSTAMP = 0x40044283 - BIOCIMMEDIATE = 0x80044270 - BIOCLOCK = 0x2000427a - BIOCPROMISC = 0x20004269 - BIOCROTZBUF = 0x400c4280 - BIOCSBLEN = 0xc0044266 - BIOCSDIRECTION = 0x80044277 - BIOCSDLT = 0x80044278 - BIOCSETBUFMODE = 0x8004427e - BIOCSETF = 0x80084267 - BIOCSETFNR = 0x80084282 - BIOCSETIF = 0x8020426c - BIOCSETWF = 0x8008427b - BIOCSETZBUF = 0x800c4281 - BIOCSHDRCMPLT = 0x80044275 - BIOCSRSIG = 0x80044273 - BIOCSRTIMEOUT = 0x8008426d - BIOCSSEESENT = 0x80044277 - BIOCSTSTAMP = 0x80044284 - BIOCVERSION = 0x40044271 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALIGNMENT = 0x4 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_BUFMODE_BUFFER = 0x1 - BPF_BUFMODE_ZBUF = 0x2 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXBUFSIZE = 0x80000 - BPF_MAXINSNS = 0x200 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINBUFSIZE = 0x20 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RELEASE = 0x30bb6 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_T_BINTIME = 0x2 - BPF_T_BINTIME_FAST = 0x102 - BPF_T_BINTIME_MONOTONIC = 0x202 - BPF_T_BINTIME_MONOTONIC_FAST = 0x302 - BPF_T_FAST = 0x100 - BPF_T_FLAG_MASK = 0x300 - BPF_T_FORMAT_MASK = 0x3 - BPF_T_MICROTIME = 0x0 - BPF_T_MICROTIME_FAST = 0x100 - BPF_T_MICROTIME_MONOTONIC = 0x200 - BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 - BPF_T_MONOTONIC = 0x200 - BPF_T_MONOTONIC_FAST = 0x300 - BPF_T_NANOTIME = 0x1 - BPF_T_NANOTIME_FAST = 0x101 - BPF_T_NANOTIME_MONOTONIC = 0x201 - BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 - BPF_T_NONE = 0x3 - BPF_T_NORMAL = 0x0 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - CFLUSH = 0xf - CLOCAL = 0x8000 - CLOCK_MONOTONIC = 0x4 - CLOCK_MONOTONIC_FAST = 0xc - CLOCK_MONOTONIC_PRECISE = 0xb - CLOCK_PROCESS_CPUTIME_ID = 0xf - CLOCK_PROF = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_FAST = 0xa - CLOCK_REALTIME_PRECISE = 0x9 - CLOCK_SECOND = 0xd - CLOCK_THREAD_CPUTIME_ID = 0xe - CLOCK_UPTIME = 0x5 - CLOCK_UPTIME_FAST = 0x8 - CLOCK_UPTIME_PRECISE = 0x7 - CLOCK_VIRTUAL = 0x1 - CREAD = 0x800 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x14 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - CTL_MAXNAME = 0x18 - CTL_NET = 0x4 - DLT_A429 = 0xb8 - DLT_A653_ICM = 0xb9 - DLT_AIRONET_HEADER = 0x78 - DLT_AOS = 0xde - DLT_APPLE_IP_OVER_IEEE1394 = 0x8a - DLT_ARCNET = 0x7 - DLT_ARCNET_LINUX = 0x81 - DLT_ATM_CLIP = 0x13 - DLT_ATM_RFC1483 = 0xb - DLT_AURORA = 0x7e - DLT_AX25 = 0x3 - DLT_AX25_KISS = 0xca - DLT_BACNET_MS_TP = 0xa5 - DLT_BLUETOOTH_HCI_H4 = 0xbb - DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 - DLT_CAN20B = 0xbe - DLT_CAN_SOCKETCAN = 0xe3 - DLT_CHAOS = 0x5 - DLT_CHDLC = 0x68 - DLT_CISCO_IOS = 0x76 - DLT_C_HDLC = 0x68 - DLT_C_HDLC_WITH_DIR = 0xcd - DLT_DBUS = 0xe7 - DLT_DECT = 0xdd - DLT_DOCSIS = 0x8f - DLT_DVB_CI = 0xeb - DLT_ECONET = 0x73 - DLT_EN10MB = 0x1 - DLT_EN3MB = 0x2 - DLT_ENC = 0x6d - DLT_ERF = 0xc5 - DLT_ERF_ETH = 0xaf - DLT_ERF_POS = 0xb0 - DLT_FC_2 = 0xe0 - DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 - DLT_FDDI = 0xa - DLT_FLEXRAY = 0xd2 - DLT_FRELAY = 0x6b - DLT_FRELAY_WITH_DIR = 0xce - DLT_GCOM_SERIAL = 0xad - DLT_GCOM_T1E1 = 0xac - DLT_GPF_F = 0xab - DLT_GPF_T = 0xaa - DLT_GPRS_LLC = 0xa9 - DLT_GSMTAP_ABIS = 0xda - DLT_GSMTAP_UM = 0xd9 - DLT_HHDLC = 0x79 - DLT_IBM_SN = 0x92 - DLT_IBM_SP = 0x91 - DLT_IEEE802 = 0x6 - DLT_IEEE802_11 = 0x69 - DLT_IEEE802_11_RADIO = 0x7f - DLT_IEEE802_11_RADIO_AVS = 0xa3 - DLT_IEEE802_15_4 = 0xc3 - DLT_IEEE802_15_4_LINUX = 0xbf - DLT_IEEE802_15_4_NOFCS = 0xe6 - DLT_IEEE802_15_4_NONASK_PHY = 0xd7 - DLT_IEEE802_16_MAC_CPS = 0xbc - DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 - DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 - DLT_IPMB_LINUX = 0xd1 - DLT_IPNET = 0xe2 - DLT_IPOIB = 0xf2 - DLT_IPV4 = 0xe4 - DLT_IPV6 = 0xe5 - DLT_IP_OVER_FC = 0x7a - DLT_JUNIPER_ATM1 = 0x89 - DLT_JUNIPER_ATM2 = 0x87 - DLT_JUNIPER_ATM_CEMIC = 0xee - DLT_JUNIPER_CHDLC = 0xb5 - DLT_JUNIPER_ES = 0x84 - DLT_JUNIPER_ETHER = 0xb2 - DLT_JUNIPER_FIBRECHANNEL = 0xea - DLT_JUNIPER_FRELAY = 0xb4 - DLT_JUNIPER_GGSN = 0x85 - DLT_JUNIPER_ISM = 0xc2 - DLT_JUNIPER_MFR = 0x86 - DLT_JUNIPER_MLFR = 0x83 - DLT_JUNIPER_MLPPP = 0x82 - DLT_JUNIPER_MONITOR = 0xa4 - DLT_JUNIPER_PIC_PEER = 0xae - DLT_JUNIPER_PPP = 0xb3 - DLT_JUNIPER_PPPOE = 0xa7 - DLT_JUNIPER_PPPOE_ATM = 0xa8 - DLT_JUNIPER_SERVICES = 0x88 - DLT_JUNIPER_SRX_E2E = 0xe9 - DLT_JUNIPER_ST = 0xc8 - DLT_JUNIPER_VP = 0xb7 - DLT_JUNIPER_VS = 0xe8 - DLT_LAPB_WITH_DIR = 0xcf - DLT_LAPD = 0xcb - DLT_LIN = 0xd4 - DLT_LINUX_EVDEV = 0xd8 - DLT_LINUX_IRDA = 0x90 - DLT_LINUX_LAPD = 0xb1 - DLT_LINUX_PPP_WITHDIRECTION = 0xa6 - DLT_LINUX_SLL = 0x71 - DLT_LOOP = 0x6c - DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0xf6 - DLT_MATCHING_MIN = 0x68 - DLT_MFR = 0xb6 - DLT_MOST = 0xd3 - DLT_MPEG_2_TS = 0xf3 - DLT_MPLS = 0xdb - DLT_MTP2 = 0x8c - DLT_MTP2_WITH_PHDR = 0x8b - DLT_MTP3 = 0x8d - DLT_MUX27010 = 0xec - DLT_NETANALYZER = 0xf0 - DLT_NETANALYZER_TRANSPARENT = 0xf1 - DLT_NFC_LLCP = 0xf5 - DLT_NFLOG = 0xef - DLT_NG40 = 0xf4 - DLT_NULL = 0x0 - DLT_PCI_EXP = 0x7d - DLT_PFLOG = 0x75 - DLT_PFSYNC = 0x79 - DLT_PPI = 0xc0 - DLT_PPP = 0x9 - DLT_PPP_BSDOS = 0x10 - DLT_PPP_ETHER = 0x33 - DLT_PPP_PPPD = 0xa6 - DLT_PPP_SERIAL = 0x32 - DLT_PPP_WITH_DIR = 0xcc - DLT_PPP_WITH_DIRECTION = 0xa6 - DLT_PRISM_HEADER = 0x77 - DLT_PRONET = 0x4 - DLT_RAIF1 = 0xc6 - DLT_RAW = 0xc - DLT_RIO = 0x7c - DLT_SCCP = 0x8e - DLT_SITA = 0xc4 - DLT_SLIP = 0x8 - DLT_SLIP_BSDOS = 0xf - DLT_STANAG_5066_D_PDU = 0xed - DLT_SUNATM = 0x7b - DLT_SYMANTEC_FIREWALL = 0x63 - DLT_TZSP = 0x80 - DLT_USB = 0xba - DLT_USB_LINUX = 0xbd - DLT_USB_LINUX_MMAPPED = 0xdc - DLT_USER0 = 0x93 - DLT_USER1 = 0x94 - DLT_USER10 = 0x9d - DLT_USER11 = 0x9e - DLT_USER12 = 0x9f - DLT_USER13 = 0xa0 - DLT_USER14 = 0xa1 - DLT_USER15 = 0xa2 - DLT_USER2 = 0x95 - DLT_USER3 = 0x96 - DLT_USER4 = 0x97 - DLT_USER5 = 0x98 - DLT_USER6 = 0x99 - DLT_USER7 = 0x9a - DLT_USER8 = 0x9b - DLT_USER9 = 0x9c - DLT_WIHART = 0xdf - DLT_X2E_SERIAL = 0xd5 - DLT_X2E_XORAYA = 0xd6 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - EVFILT_AIO = -0x3 - EVFILT_FS = -0x9 - EVFILT_LIO = -0xa - EVFILT_PROC = -0x5 - EVFILT_READ = -0x1 - EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xb - EVFILT_TIMER = -0x7 - EVFILT_USER = -0xb - EVFILT_VNODE = -0x4 - EVFILT_WRITE = -0x2 - EV_ADD = 0x1 - EV_CLEAR = 0x20 - EV_DELETE = 0x2 - EV_DISABLE = 0x8 - EV_DISPATCH = 0x80 - EV_DROP = 0x1000 - EV_ENABLE = 0x4 - EV_EOF = 0x8000 - EV_ERROR = 0x4000 - EV_FLAG1 = 0x2000 - EV_ONESHOT = 0x10 - EV_RECEIPT = 0x40 - EV_SYSFLAGS = 0xf000 - EXTA = 0x4b00 - EXTATTR_NAMESPACE_EMPTY = 0x0 - EXTATTR_NAMESPACE_SYSTEM = 0x2 - EXTATTR_NAMESPACE_USER = 0x1 - EXTB = 0x9600 - EXTPROC = 0x800 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FLUSHO = 0x800000 - F_CANCEL = 0x5 - F_DUP2FD = 0xa - F_DUP2FD_CLOEXEC = 0x12 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x11 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLK = 0xb - F_GETOWN = 0x5 - F_OGETLK = 0x7 - F_OK = 0x0 - F_OSETLK = 0x8 - F_OSETLKW = 0x9 - F_RDAHEAD = 0x10 - F_RDLCK = 0x1 - F_READAHEAD = 0xf - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLK = 0xc - F_SETLKW = 0xd - F_SETLK_REMOTE = 0xe - F_SETOWN = 0x6 - F_UNLCK = 0x2 - F_UNLCKSYS = 0x4 - F_WRLCK = 0x3 - HUPCL = 0x4000 - ICANON = 0x100 - ICMP6_FILTER = 0x12 - ICRNL = 0x100 - IEXTEN = 0x400 - IFAN_ARRIVAL = 0x0 - IFAN_DEPARTURE = 0x1 - IFF_ALLMULTI = 0x200 - IFF_ALTPHYS = 0x4000 - IFF_BROADCAST = 0x2 - IFF_CANTCHANGE = 0x218f72 - IFF_CANTCONFIG = 0x10000 - IFF_DEBUG = 0x4 - IFF_DRV_OACTIVE = 0x400 - IFF_DRV_RUNNING = 0x40 - IFF_DYING = 0x200000 - IFF_LINK0 = 0x1000 - IFF_LINK1 = 0x2000 - IFF_LINK2 = 0x4000 - IFF_LOOPBACK = 0x8 - IFF_MONITOR = 0x40000 - IFF_MULTICAST = 0x8000 - IFF_NOARP = 0x80 - IFF_OACTIVE = 0x400 - IFF_POINTOPOINT = 0x10 - IFF_PPROMISC = 0x20000 - IFF_PROMISC = 0x100 - IFF_RENAMING = 0x400000 - IFF_RUNNING = 0x40 - IFF_SIMPLEX = 0x800 - IFF_SMART = 0x20 - IFF_STATICARP = 0x80000 - IFF_UP = 0x1 - IFNAMSIZ = 0x10 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BRIDGE = 0xd1 - IFT_BSC = 0x53 - IFT_CARP = 0xf8 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE1394 = 0x90 - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INFINIBAND = 0xc7 - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L2VLAN = 0x87 - IFT_L3IPVLAN = 0x88 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPP = 0x17 - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPVIRTUAL = 0x35 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLASSD_HOST = 0xfffffff - IN_CLASSD_NET = 0xf0000000 - IN_CLASSD_NSHIFT = 0x1c - IN_LOOPBACKNET = 0x7f - IN_RFC3021_MASK = 0xfffffffe - IPPROTO_3PC = 0x22 - IPPROTO_ADFS = 0x44 - IPPROTO_AH = 0x33 - IPPROTO_AHIP = 0x3d - IPPROTO_APES = 0x63 - IPPROTO_ARGUS = 0xd - IPPROTO_AX25 = 0x5d - IPPROTO_BHA = 0x31 - IPPROTO_BLT = 0x1e - IPPROTO_BRSATMON = 0x4c - IPPROTO_CARP = 0x70 - IPPROTO_CFTP = 0x3e - IPPROTO_CHAOS = 0x10 - IPPROTO_CMTP = 0x26 - IPPROTO_CPHB = 0x49 - IPPROTO_CPNX = 0x48 - IPPROTO_DDP = 0x25 - IPPROTO_DGP = 0x56 - IPPROTO_DIVERT = 0x102 - IPPROTO_DONE = 0x101 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_EMCON = 0xe - IPPROTO_ENCAP = 0x62 - IPPROTO_EON = 0x50 - IPPROTO_ESP = 0x32 - IPPROTO_ETHERIP = 0x61 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GGP = 0x3 - IPPROTO_GMTP = 0x64 - IPPROTO_GRE = 0x2f - IPPROTO_HELLO = 0x3f - IPPROTO_HIP = 0x8b - IPPROTO_HMP = 0x14 - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IDPR = 0x23 - IPPROTO_IDRP = 0x2d - IPPROTO_IGMP = 0x2 - IPPROTO_IGP = 0x55 - IPPROTO_IGRP = 0x58 - IPPROTO_IL = 0x28 - IPPROTO_INLSP = 0x34 - IPPROTO_INP = 0x20 - IPPROTO_IP = 0x0 - IPPROTO_IPCOMP = 0x6c - IPPROTO_IPCV = 0x47 - IPPROTO_IPEIP = 0x5e - IPPROTO_IPIP = 0x4 - IPPROTO_IPPC = 0x43 - IPPROTO_IPV4 = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_IRTP = 0x1c - IPPROTO_KRYPTOLAN = 0x41 - IPPROTO_LARP = 0x5b - IPPROTO_LEAF1 = 0x19 - IPPROTO_LEAF2 = 0x1a - IPPROTO_MAX = 0x100 - IPPROTO_MAXID = 0x34 - IPPROTO_MEAS = 0x13 - IPPROTO_MH = 0x87 - IPPROTO_MHRP = 0x30 - IPPROTO_MICP = 0x5f - IPPROTO_MOBILE = 0x37 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_MUX = 0x12 - IPPROTO_ND = 0x4d - IPPROTO_NHRP = 0x36 - IPPROTO_NONE = 0x3b - IPPROTO_NSP = 0x1f - IPPROTO_NVPII = 0xb - IPPROTO_OLD_DIVERT = 0xfe - IPPROTO_OSPFIGP = 0x59 - IPPROTO_PFSYNC = 0xf0 - IPPROTO_PGM = 0x71 - IPPROTO_PIGP = 0x9 - IPPROTO_PIM = 0x67 - IPPROTO_PRM = 0x15 - IPPROTO_PUP = 0xc - IPPROTO_PVP = 0x4b - IPPROTO_RAW = 0xff - IPPROTO_RCCMON = 0xa - IPPROTO_RDP = 0x1b - IPPROTO_RESERVED_253 = 0xfd - IPPROTO_RESERVED_254 = 0xfe - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_RVD = 0x42 - IPPROTO_SATEXPAK = 0x40 - IPPROTO_SATMON = 0x45 - IPPROTO_SCCSP = 0x60 - IPPROTO_SCTP = 0x84 - IPPROTO_SDRP = 0x2a - IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 - IPPROTO_SHIM6 = 0x8c - IPPROTO_SKIP = 0x39 - IPPROTO_SPACER = 0x7fff - IPPROTO_SRPC = 0x5a - IPPROTO_ST = 0x7 - IPPROTO_SVMTP = 0x52 - IPPROTO_SWIPE = 0x35 - IPPROTO_TCF = 0x57 - IPPROTO_TCP = 0x6 - IPPROTO_TLSP = 0x38 - IPPROTO_TP = 0x1d - IPPROTO_TPXX = 0x27 - IPPROTO_TRUNK1 = 0x17 - IPPROTO_TRUNK2 = 0x18 - IPPROTO_TTP = 0x54 - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPPROTO_VINES = 0x53 - IPPROTO_VISA = 0x46 - IPPROTO_VMTP = 0x51 - IPPROTO_WBEXPAK = 0x4f - IPPROTO_WBMON = 0x4e - IPPROTO_WSN = 0x4a - IPPROTO_XNET = 0xf - IPPROTO_XTP = 0x24 - IPV6_AUTOFLOWLABEL = 0x3b - IPV6_BINDANY = 0x40 - IPV6_BINDV6ONLY = 0x1b - IPV6_CHECKSUM = 0x1a - IPV6_DEFAULT_MULTICAST_HOPS = 0x1 - IPV6_DEFAULT_MULTICAST_LOOP = 0x1 - IPV6_DEFHLIM = 0x40 - IPV6_DONTFRAG = 0x3e - IPV6_DSTOPTS = 0x32 - IPV6_FAITH = 0x1d - IPV6_FLOWINFO_MASK = 0xffffff0f - IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FRAGTTL = 0x78 - IPV6_FW_ADD = 0x1e - IPV6_FW_DEL = 0x1f - IPV6_FW_FLUSH = 0x20 - IPV6_FW_GET = 0x22 - IPV6_FW_ZERO = 0x21 - IPV6_HLIMDEC = 0x1 - IPV6_HOPLIMIT = 0x2f - IPV6_HOPOPTS = 0x31 - IPV6_IPSEC_POLICY = 0x1c - IPV6_JOIN_GROUP = 0xc - IPV6_LEAVE_GROUP = 0xd - IPV6_MAXHLIM = 0xff - IPV6_MAXOPTHDR = 0x800 - IPV6_MAXPACKET = 0xffff - IPV6_MAX_GROUP_SRC_FILTER = 0x200 - IPV6_MAX_MEMBERSHIPS = 0xfff - IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f - IPV6_MMTU = 0x500 - IPV6_MSFILTER = 0x4a - IPV6_MULTICAST_HOPS = 0xa - IPV6_MULTICAST_IF = 0x9 - IPV6_MULTICAST_LOOP = 0xb - IPV6_NEXTHOP = 0x30 - IPV6_PATHMTU = 0x2c - IPV6_PKTINFO = 0x2e - IPV6_PORTRANGE = 0xe - IPV6_PORTRANGE_DEFAULT = 0x0 - IPV6_PORTRANGE_HIGH = 0x1 - IPV6_PORTRANGE_LOW = 0x2 - IPV6_PREFER_TEMPADDR = 0x3f - IPV6_RECVDSTOPTS = 0x28 - IPV6_RECVHOPLIMIT = 0x25 - IPV6_RECVHOPOPTS = 0x27 - IPV6_RECVPATHMTU = 0x2b - IPV6_RECVPKTINFO = 0x24 - IPV6_RECVRTHDR = 0x26 - IPV6_RECVTCLASS = 0x39 - IPV6_RTHDR = 0x33 - IPV6_RTHDRDSTOPTS = 0x23 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_SOCKOPT_RESERVED1 = 0x3 - IPV6_TCLASS = 0x3d - IPV6_UNICAST_HOPS = 0x4 - IPV6_USE_MIN_MTU = 0x2a - IPV6_V6ONLY = 0x1b - IPV6_VERSION = 0x60 - IPV6_VERSION_MASK = 0xf0 - IP_ADD_MEMBERSHIP = 0xc - IP_ADD_SOURCE_MEMBERSHIP = 0x46 - IP_BINDANY = 0x18 - IP_BLOCK_SOURCE = 0x48 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DONTFRAG = 0x43 - IP_DROP_MEMBERSHIP = 0xd - IP_DROP_SOURCE_MEMBERSHIP = 0x47 - IP_DUMMYNET3 = 0x31 - IP_DUMMYNET_CONFIGURE = 0x3c - IP_DUMMYNET_DEL = 0x3d - IP_DUMMYNET_FLUSH = 0x3e - IP_DUMMYNET_GET = 0x40 - IP_FAITH = 0x16 - IP_FW3 = 0x30 - IP_FW_ADD = 0x32 - IP_FW_DEL = 0x33 - IP_FW_FLUSH = 0x34 - IP_FW_GET = 0x36 - IP_FW_NAT_CFG = 0x38 - IP_FW_NAT_DEL = 0x39 - IP_FW_NAT_GET_CONFIG = 0x3a - IP_FW_NAT_GET_LOG = 0x3b - IP_FW_RESETLOG = 0x37 - IP_FW_TABLE_ADD = 0x28 - IP_FW_TABLE_DEL = 0x29 - IP_FW_TABLE_FLUSH = 0x2a - IP_FW_TABLE_GETSIZE = 0x2b - IP_FW_TABLE_LIST = 0x2c - IP_FW_ZERO = 0x35 - IP_HDRINCL = 0x2 - IP_IPSEC_POLICY = 0x15 - IP_MAXPACKET = 0xffff - IP_MAX_GROUP_SRC_FILTER = 0x200 - IP_MAX_MEMBERSHIPS = 0xfff - IP_MAX_SOCK_MUTE_FILTER = 0x80 - IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MF = 0x2000 - IP_MINTTL = 0x42 - IP_MIN_MEMBERSHIPS = 0x1f - IP_MSFILTER = 0x4a - IP_MSS = 0x240 - IP_MULTICAST_IF = 0x9 - IP_MULTICAST_LOOP = 0xb - IP_MULTICAST_TTL = 0xa - IP_MULTICAST_VIF = 0xe - IP_OFFMASK = 0x1fff - IP_ONESBCAST = 0x17 - IP_OPTIONS = 0x1 - IP_PORTRANGE = 0x13 - IP_PORTRANGE_DEFAULT = 0x0 - IP_PORTRANGE_HIGH = 0x1 - IP_PORTRANGE_LOW = 0x2 - IP_RECVDSTADDR = 0x7 - IP_RECVIF = 0x14 - IP_RECVOPTS = 0x5 - IP_RECVRETOPTS = 0x6 - IP_RECVTOS = 0x44 - IP_RECVTTL = 0x41 - IP_RETOPTS = 0x8 - IP_RF = 0x8000 - IP_RSVP_OFF = 0x10 - IP_RSVP_ON = 0xf - IP_RSVP_VIF_OFF = 0x12 - IP_RSVP_VIF_ON = 0x11 - IP_SENDSRCADDR = 0x7 - IP_TOS = 0x3 - IP_TTL = 0x4 - IP_UNBLOCK_SOURCE = 0x49 - ISIG = 0x80 - ISTRIP = 0x20 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_AUTOSYNC = 0x7 - MADV_CORE = 0x9 - MADV_DONTNEED = 0x4 - MADV_FREE = 0x5 - MADV_NOCORE = 0x8 - MADV_NORMAL = 0x0 - MADV_NOSYNC = 0x6 - MADV_PROTECT = 0xa - MADV_RANDOM = 0x1 - MADV_SEQUENTIAL = 0x2 - MADV_WILLNEED = 0x3 - MAP_ALIGNED_SUPER = 0x1000000 - MAP_ALIGNMENT_MASK = -0x1000000 - MAP_ALIGNMENT_SHIFT = 0x18 - MAP_ANON = 0x1000 - MAP_ANONYMOUS = 0x1000 - MAP_COPY = 0x2 - MAP_EXCL = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_HASSEMAPHORE = 0x200 - MAP_NOCORE = 0x20000 - MAP_NORESERVE = 0x40 - MAP_NOSYNC = 0x800 - MAP_PREFAULT_READ = 0x40000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x20 - MAP_RESERVED0080 = 0x80 - MAP_RESERVED0100 = 0x100 - MAP_SHARED = 0x1 - MAP_STACK = 0x400 - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MSG_CMSG_CLOEXEC = 0x40000 - MSG_COMPAT = 0x8000 - MSG_CTRUNC = 0x20 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x80 - MSG_EOF = 0x100 - MSG_EOR = 0x8 - MSG_NBIO = 0x4000 - MSG_NOSIGNAL = 0x20000 - MSG_NOTIFICATION = 0x2000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_TRUNC = 0x10 - MSG_WAITALL = 0x40 - MS_ASYNC = 0x1 - MS_INVALIDATE = 0x2 - MS_SYNC = 0x0 - NAME_MAX = 0xff - NET_RT_DUMP = 0x1 - NET_RT_FLAGS = 0x2 - NET_RT_IFLIST = 0x3 - NET_RT_IFLISTL = 0x5 - NET_RT_IFMALIST = 0x4 - NET_RT_MAXID = 0x6 - NOFLSH = 0x80000000 - NOTE_ATTRIB = 0x8 - NOTE_CHILD = 0x4 - NOTE_DELETE = 0x1 - NOTE_EXEC = 0x20000000 - NOTE_EXIT = 0x80000000 - NOTE_EXTEND = 0x4 - NOTE_FFAND = 0x40000000 - NOTE_FFCOPY = 0xc0000000 - NOTE_FFCTRLMASK = 0xc0000000 - NOTE_FFLAGSMASK = 0xffffff - NOTE_FFNOP = 0x0 - NOTE_FFOR = 0x80000000 - NOTE_FORK = 0x40000000 - NOTE_LINK = 0x10 - NOTE_LOWAT = 0x1 - NOTE_PCTRLMASK = 0xf0000000 - NOTE_PDATAMASK = 0xfffff - NOTE_RENAME = 0x20 - NOTE_REVOKE = 0x40 - NOTE_TRACK = 0x1 - NOTE_TRACKERR = 0x2 - NOTE_TRIGGER = 0x1000000 - NOTE_WRITE = 0x2 - OCRNL = 0x10 - ONLCR = 0x2 - ONLRET = 0x40 - ONOCR = 0x20 - ONOEOT = 0x8 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x40 - O_CLOEXEC = 0x100000 - O_CREAT = 0x200 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x20000 - O_EXCL = 0x800 - O_EXEC = 0x40000 - O_EXLOCK = 0x20 - O_FSYNC = 0x80 - O_NDELAY = 0x4 - O_NOCTTY = 0x8000 - O_NOFOLLOW = 0x100 - O_NONBLOCK = 0x4 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_SHLOCK = 0x10 - O_SYNC = 0x80 - O_TRUNC = 0x400 - O_TTY_INIT = 0x80000 - O_WRONLY = 0x1 - PARENB = 0x1000 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - RLIMIT_AS = 0xa - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x8 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0x7fffffffffffffff - RTAX_AUTHOR = 0x6 - RTAX_BRD = 0x7 - RTAX_DST = 0x0 - RTAX_GATEWAY = 0x1 - RTAX_GENMASK = 0x3 - RTAX_IFA = 0x5 - RTAX_IFP = 0x4 - RTAX_MAX = 0x8 - RTAX_NETMASK = 0x2 - RTA_AUTHOR = 0x40 - RTA_BRD = 0x80 - RTA_DST = 0x1 - RTA_GATEWAY = 0x2 - RTA_GENMASK = 0x8 - RTA_IFA = 0x20 - RTA_IFP = 0x10 - RTA_NETMASK = 0x4 - RTF_BLACKHOLE = 0x1000 - RTF_BROADCAST = 0x400000 - RTF_DONE = 0x40 - RTF_DYNAMIC = 0x10 - RTF_FMASK = 0x1004d808 - RTF_GATEWAY = 0x2 - RTF_GWFLAG_COMPAT = 0x80000000 - RTF_HOST = 0x4 - RTF_LLDATA = 0x400 - RTF_LLINFO = 0x400 - RTF_LOCAL = 0x200000 - RTF_MODIFIED = 0x20 - RTF_MULTICAST = 0x800000 - RTF_PINNED = 0x100000 - RTF_PRCLONING = 0x10000 - RTF_PROTO1 = 0x8000 - RTF_PROTO2 = 0x4000 - RTF_PROTO3 = 0x40000 - RTF_REJECT = 0x8 - RTF_RNH_LOCKED = 0x40000000 - RTF_STATIC = 0x800 - RTF_STICKY = 0x10000000 - RTF_UP = 0x1 - RTF_XRESOLVE = 0x200 - RTM_ADD = 0x1 - RTM_CHANGE = 0x3 - RTM_DELADDR = 0xd - RTM_DELETE = 0x2 - RTM_DELMADDR = 0x10 - RTM_GET = 0x4 - RTM_IEEE80211 = 0x12 - RTM_IFANNOUNCE = 0x11 - RTM_IFINFO = 0xe - RTM_LOCK = 0x8 - RTM_LOSING = 0x5 - RTM_MISS = 0x7 - RTM_NEWADDR = 0xc - RTM_NEWMADDR = 0xf - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RTM_REDIRECT = 0x6 - RTM_RESOLVE = 0xb - RTM_RTTUNIT = 0xf4240 - RTM_VERSION = 0x5 - RTV_EXPIRE = 0x4 - RTV_HOPCOUNT = 0x2 - RTV_MTU = 0x1 - RTV_RPIPE = 0x8 - RTV_RTT = 0x40 - RTV_RTTVAR = 0x80 - RTV_SPIPE = 0x10 - RTV_SSTHRESH = 0x20 - RTV_WEIGHT = 0x100 - RT_ALL_FIBS = -0x1 - RT_CACHING_CONTEXT = 0x1 - RT_DEFAULT_FIB = 0x0 - RT_NORTREF = 0x2 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_BINTIME = 0x4 - SCM_CREDS = 0x3 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x2 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDMULTI = 0x80206931 - SIOCADDRT = 0x8030720a - SIOCAIFADDR = 0x8040691a - SIOCAIFGROUP = 0x80246987 - SIOCALIFADDR = 0x8118691b - SIOCATMARK = 0x40047307 - SIOCDELMULTI = 0x80206932 - SIOCDELRT = 0x8030720b - SIOCDIFADDR = 0x80206919 - SIOCDIFGROUP = 0x80246989 - SIOCDIFPHYADDR = 0x80206949 - SIOCDLIFADDR = 0x8118691d - SIOCGDRVSPEC = 0xc01c697b - SIOCGETSGCNT = 0xc0147210 - SIOCGETVIFCNT = 0xc014720f - SIOCGHIWAT = 0x40047301 - SIOCGIFADDR = 0xc0206921 - SIOCGIFBRDADDR = 0xc0206923 - SIOCGIFCAP = 0xc020691f - SIOCGIFCONF = 0xc0086924 - SIOCGIFDESCR = 0xc020692a - SIOCGIFDSTADDR = 0xc0206922 - SIOCGIFFIB = 0xc020695c - SIOCGIFFLAGS = 0xc0206911 - SIOCGIFGENERIC = 0xc020693a - SIOCGIFGMEMB = 0xc024698a - SIOCGIFGROUP = 0xc0246988 - SIOCGIFINDEX = 0xc0206920 - SIOCGIFMAC = 0xc0206926 - SIOCGIFMEDIA = 0xc0286938 - SIOCGIFMETRIC = 0xc0206917 - SIOCGIFMTU = 0xc0206933 - SIOCGIFNETMASK = 0xc0206925 - SIOCGIFPDSTADDR = 0xc0206948 - SIOCGIFPHYS = 0xc0206935 - SIOCGIFPSRCADDR = 0xc0206947 - SIOCGIFSTATUS = 0xc331693b - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCGLOWAT = 0x40047303 - SIOCGPGRP = 0x40047309 - SIOCGPRIVATE_0 = 0xc0206950 - SIOCGPRIVATE_1 = 0xc0206951 - SIOCIFCREATE = 0xc020697a - SIOCIFCREATE2 = 0xc020697c - SIOCIFDESTROY = 0x80206979 - SIOCIFGCLONERS = 0xc00c6978 - SIOCSDRVSPEC = 0x801c697b - SIOCSHIWAT = 0x80047300 - SIOCSIFADDR = 0x8020690c - SIOCSIFBRDADDR = 0x80206913 - SIOCSIFCAP = 0x8020691e - SIOCSIFDESCR = 0x80206929 - SIOCSIFDSTADDR = 0x8020690e - SIOCSIFFIB = 0x8020695d - SIOCSIFFLAGS = 0x80206910 - SIOCSIFGENERIC = 0x80206939 - SIOCSIFLLADDR = 0x8020693c - SIOCSIFMAC = 0x80206927 - SIOCSIFMEDIA = 0xc0206937 - SIOCSIFMETRIC = 0x80206918 - SIOCSIFMTU = 0x80206934 - SIOCSIFNAME = 0x80206928 - SIOCSIFNETMASK = 0x80206916 - SIOCSIFPHYADDR = 0x80406946 - SIOCSIFPHYS = 0x80206936 - SIOCSIFRVNET = 0xc020695b - SIOCSIFVNET = 0xc020695a - SIOCSLIFPHYADDR = 0x8118694a - SIOCSLOWAT = 0x80047302 - SIOCSPGRP = 0x80047308 - SOCK_CLOEXEC = 0x10000000 - SOCK_DGRAM = 0x2 - SOCK_MAXADDRLEN = 0xff - SOCK_NONBLOCK = 0x20000000 - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_SOCKET = 0xffff - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x2 - SO_ACCEPTFILTER = 0x1000 - SO_BINTIME = 0x2000 - SO_BROADCAST = 0x20 - SO_DEBUG = 0x1 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_KEEPALIVE = 0x8 - SO_LABEL = 0x1009 - SO_LINGER = 0x80 - SO_LISTENINCQLEN = 0x1013 - SO_LISTENQLEN = 0x1012 - SO_LISTENQLIMIT = 0x1011 - SO_NOSIGPIPE = 0x800 - SO_NO_DDP = 0x8000 - SO_NO_OFFLOAD = 0x4000 - SO_OOBINLINE = 0x100 - SO_PEERLABEL = 0x1010 - SO_PROTOCOL = 0x1016 - SO_PROTOTYPE = 0x1016 - SO_RCVBUF = 0x1002 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_SETFIB = 0x1014 - SO_SNDBUF = 0x1001 - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_TIMESTAMP = 0x400 - SO_TYPE = 0x1008 - SO_USELOOPBACK = 0x40 - SO_USER_COOKIE = 0x1015 - SO_VENDOR = 0x80000000 - TCIFLUSH = 0x1 - TCIOFLUSH = 0x3 - TCOFLUSH = 0x2 - TCP_CA_NAME_MAX = 0x10 - TCP_CONGESTION = 0x40 - TCP_INFO = 0x20 - TCP_KEEPCNT = 0x400 - TCP_KEEPIDLE = 0x100 - TCP_KEEPINIT = 0x80 - TCP_KEEPINTVL = 0x200 - TCP_MAXBURST = 0x4 - TCP_MAXHLEN = 0x3c - TCP_MAXOLEN = 0x28 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_SACK = 0x4 - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0x10 - TCP_MINMSS = 0xd8 - TCP_MSS = 0x218 - TCP_NODELAY = 0x1 - TCP_NOOPT = 0x8 - TCP_NOPUSH = 0x4 - TCP_VENDOR = 0x80000000 - TCSAFLUSH = 0x2 - TIOCCBRK = 0x2000747a - TIOCCDTR = 0x20007478 - TIOCCONS = 0x80047462 - TIOCDRAIN = 0x2000745e - TIOCEXCL = 0x2000740d - TIOCEXT = 0x80047460 - TIOCFLUSH = 0x80047410 - TIOCGDRAINWAIT = 0x40047456 - TIOCGETA = 0x402c7413 - TIOCGETD = 0x4004741a - TIOCGPGRP = 0x40047477 - TIOCGPTN = 0x4004740f - TIOCGSID = 0x40047463 - TIOCGWINSZ = 0x40087468 - TIOCMBIC = 0x8004746b - TIOCMBIS = 0x8004746c - TIOCMGDTRWAIT = 0x4004745a - TIOCMGET = 0x4004746a - TIOCMSDTRWAIT = 0x8004745b - TIOCMSET = 0x8004746d - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DCD = 0x40 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x20007471 - TIOCNXCL = 0x2000740e - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x80047470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCPTMASTER = 0x2000741c - TIOCSBRK = 0x2000747b - TIOCSCTTY = 0x20007461 - TIOCSDRAINWAIT = 0x80047457 - TIOCSDTR = 0x20007479 - TIOCSETA = 0x802c7414 - TIOCSETAF = 0x802c7416 - TIOCSETAW = 0x802c7415 - TIOCSETD = 0x8004741b - TIOCSIG = 0x2004745f - TIOCSPGRP = 0x80047476 - TIOCSTART = 0x2000746e - TIOCSTAT = 0x20007465 - TIOCSTI = 0x80017472 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCTIMESTAMP = 0x40087459 - TIOCUCNTL = 0x80047466 - TOSTOP = 0x400000 - VDISCARD = 0xf - VDSUSP = 0xb - VEOF = 0x0 - VEOL = 0x1 - VEOL2 = 0x2 - VERASE = 0x3 - VERASE2 = 0x7 - VINTR = 0x8 - VKILL = 0x5 - VLNEXT = 0xe - VMIN = 0x10 - VQUIT = 0x9 - VREPRINT = 0x6 - VSTART = 0xc - VSTATUS = 0x12 - VSTOP = 0xd - VSUSP = 0xa - VTIME = 0x11 - VWERASE = 0x4 - WCONTINUED = 0x4 - WCOREFLAG = 0x80 - WEXITED = 0x10 - WLINUXCLONE = 0x80000000 - WNOHANG = 0x1 - WNOWAIT = 0x8 - WSTOPPED = 0x2 - WTRAPPED = 0x20 - WUNTRACED = 0x2 + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index e48e7799a1..360caff4f9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -1,5 +1,5 @@ // mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd @@ -11,1461 +11,1463 @@ package unix import "syscall" const ( - AF_APPLETALK = 0x10 - AF_ARP = 0x23 - AF_ATM = 0x1e - AF_BLUETOOTH = 0x24 - AF_CCITT = 0xa - AF_CHAOS = 0x5 - AF_CNT = 0x15 - AF_COIP = 0x14 - AF_DATAKIT = 0x9 - AF_DECnet = 0xc - AF_DLI = 0xd - AF_E164 = 0x1a - AF_ECMA = 0x8 - AF_HYLINK = 0xf - AF_IEEE80211 = 0x25 - AF_IMPLINK = 0x3 - AF_INET = 0x2 - AF_INET6 = 0x1c - AF_INET6_SDP = 0x2a - AF_INET_SDP = 0x28 - AF_IPX = 0x17 - AF_ISDN = 0x1a - AF_ISO = 0x7 - AF_LAT = 0xe - AF_LINK = 0x12 - AF_LOCAL = 0x1 - AF_MAX = 0x2a - AF_NATM = 0x1d - AF_NETBIOS = 0x6 - AF_NETGRAPH = 0x20 - AF_OSI = 0x7 - AF_PUP = 0x4 - AF_ROUTE = 0x11 - AF_SCLUSTER = 0x22 - AF_SIP = 0x18 - AF_SLOW = 0x21 - AF_SNA = 0xb - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VENDOR00 = 0x27 - AF_VENDOR01 = 0x29 - AF_VENDOR02 = 0x2b - AF_VENDOR03 = 0x2d - AF_VENDOR04 = 0x2f - AF_VENDOR05 = 0x31 - AF_VENDOR06 = 0x33 - AF_VENDOR07 = 0x35 - AF_VENDOR08 = 0x37 - AF_VENDOR09 = 0x39 - AF_VENDOR10 = 0x3b - AF_VENDOR11 = 0x3d - AF_VENDOR12 = 0x3f - AF_VENDOR13 = 0x41 - AF_VENDOR14 = 0x43 - AF_VENDOR15 = 0x45 - AF_VENDOR16 = 0x47 - AF_VENDOR17 = 0x49 - AF_VENDOR18 = 0x4b - AF_VENDOR19 = 0x4d - AF_VENDOR20 = 0x4f - AF_VENDOR21 = 0x51 - AF_VENDOR22 = 0x53 - AF_VENDOR23 = 0x55 - AF_VENDOR24 = 0x57 - AF_VENDOR25 = 0x59 - AF_VENDOR26 = 0x5b - AF_VENDOR27 = 0x5d - AF_VENDOR28 = 0x5f - AF_VENDOR29 = 0x61 - AF_VENDOR30 = 0x63 - AF_VENDOR31 = 0x65 - AF_VENDOR32 = 0x67 - AF_VENDOR33 = 0x69 - AF_VENDOR34 = 0x6b - AF_VENDOR35 = 0x6d - AF_VENDOR36 = 0x6f - AF_VENDOR37 = 0x71 - AF_VENDOR38 = 0x73 - AF_VENDOR39 = 0x75 - AF_VENDOR40 = 0x77 - AF_VENDOR41 = 0x79 - AF_VENDOR42 = 0x7b - AF_VENDOR43 = 0x7d - AF_VENDOR44 = 0x7f - AF_VENDOR45 = 0x81 - AF_VENDOR46 = 0x83 - AF_VENDOR47 = 0x85 - B0 = 0x0 - B110 = 0x6e - B115200 = 0x1c200 - B1200 = 0x4b0 - B134 = 0x86 - B14400 = 0x3840 - B150 = 0x96 - B1800 = 0x708 - B19200 = 0x4b00 - B200 = 0xc8 - B230400 = 0x38400 - B2400 = 0x960 - B28800 = 0x7080 - B300 = 0x12c - B38400 = 0x9600 - B460800 = 0x70800 - B4800 = 0x12c0 - B50 = 0x32 - B57600 = 0xe100 - B600 = 0x258 - B7200 = 0x1c20 - B75 = 0x4b - B76800 = 0x12c00 - B921600 = 0xe1000 - B9600 = 0x2580 - BIOCFEEDBACK = 0x8004427c - BIOCFLUSH = 0x20004268 - BIOCGBLEN = 0x40044266 - BIOCGDIRECTION = 0x40044276 - BIOCGDLT = 0x4004426a - BIOCGDLTLIST = 0xc0104279 - BIOCGETBUFMODE = 0x4004427d - BIOCGETIF = 0x4020426b - BIOCGETZMAX = 0x4008427f - BIOCGHDRCMPLT = 0x40044274 - BIOCGRSIG = 0x40044272 - BIOCGRTIMEOUT = 0x4010426e - BIOCGSEESENT = 0x40044276 - BIOCGSTATS = 0x4008426f - BIOCGTSTAMP = 0x40044283 - BIOCIMMEDIATE = 0x80044270 - BIOCLOCK = 0x2000427a - BIOCPROMISC = 0x20004269 - BIOCROTZBUF = 0x40184280 - BIOCSBLEN = 0xc0044266 - BIOCSDIRECTION = 0x80044277 - BIOCSDLT = 0x80044278 - BIOCSETBUFMODE = 0x8004427e - BIOCSETF = 0x80104267 - BIOCSETFNR = 0x80104282 - BIOCSETIF = 0x8020426c - BIOCSETWF = 0x8010427b - BIOCSETZBUF = 0x80184281 - BIOCSHDRCMPLT = 0x80044275 - BIOCSRSIG = 0x80044273 - BIOCSRTIMEOUT = 0x8010426d - BIOCSSEESENT = 0x80044277 - BIOCSTSTAMP = 0x80044284 - BIOCVERSION = 0x40044271 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALIGNMENT = 0x8 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_BUFMODE_BUFFER = 0x1 - BPF_BUFMODE_ZBUF = 0x2 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXBUFSIZE = 0x80000 - BPF_MAXINSNS = 0x200 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINBUFSIZE = 0x20 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RELEASE = 0x30bb6 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_T_BINTIME = 0x2 - BPF_T_BINTIME_FAST = 0x102 - BPF_T_BINTIME_MONOTONIC = 0x202 - BPF_T_BINTIME_MONOTONIC_FAST = 0x302 - BPF_T_FAST = 0x100 - BPF_T_FLAG_MASK = 0x300 - BPF_T_FORMAT_MASK = 0x3 - BPF_T_MICROTIME = 0x0 - BPF_T_MICROTIME_FAST = 0x100 - BPF_T_MICROTIME_MONOTONIC = 0x200 - BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 - BPF_T_MONOTONIC = 0x200 - BPF_T_MONOTONIC_FAST = 0x300 - BPF_T_NANOTIME = 0x1 - BPF_T_NANOTIME_FAST = 0x101 - BPF_T_NANOTIME_MONOTONIC = 0x201 - BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 - BPF_T_NONE = 0x3 - BPF_T_NORMAL = 0x0 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - CFLUSH = 0xf - CLOCAL = 0x8000 - CLOCK_MONOTONIC = 0x4 - CLOCK_MONOTONIC_FAST = 0xc - CLOCK_MONOTONIC_PRECISE = 0xb - CLOCK_PROCESS_CPUTIME_ID = 0xf - CLOCK_PROF = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_FAST = 0xa - CLOCK_REALTIME_PRECISE = 0x9 - CLOCK_SECOND = 0xd - CLOCK_THREAD_CPUTIME_ID = 0xe - CLOCK_UPTIME = 0x5 - CLOCK_UPTIME_FAST = 0x8 - CLOCK_UPTIME_PRECISE = 0x7 - CLOCK_VIRTUAL = 0x1 - CREAD = 0x800 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x14 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - CTL_MAXNAME = 0x18 - CTL_NET = 0x4 - DLT_A429 = 0xb8 - DLT_A653_ICM = 0xb9 - DLT_AIRONET_HEADER = 0x78 - DLT_AOS = 0xde - DLT_APPLE_IP_OVER_IEEE1394 = 0x8a - DLT_ARCNET = 0x7 - DLT_ARCNET_LINUX = 0x81 - DLT_ATM_CLIP = 0x13 - DLT_ATM_RFC1483 = 0xb - DLT_AURORA = 0x7e - DLT_AX25 = 0x3 - DLT_AX25_KISS = 0xca - DLT_BACNET_MS_TP = 0xa5 - DLT_BLUETOOTH_HCI_H4 = 0xbb - DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 - DLT_CAN20B = 0xbe - DLT_CAN_SOCKETCAN = 0xe3 - DLT_CHAOS = 0x5 - DLT_CHDLC = 0x68 - DLT_CISCO_IOS = 0x76 - DLT_C_HDLC = 0x68 - DLT_C_HDLC_WITH_DIR = 0xcd - DLT_DBUS = 0xe7 - DLT_DECT = 0xdd - DLT_DOCSIS = 0x8f - DLT_DVB_CI = 0xeb - DLT_ECONET = 0x73 - DLT_EN10MB = 0x1 - DLT_EN3MB = 0x2 - DLT_ENC = 0x6d - DLT_ERF = 0xc5 - DLT_ERF_ETH = 0xaf - DLT_ERF_POS = 0xb0 - DLT_FC_2 = 0xe0 - DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 - DLT_FDDI = 0xa - DLT_FLEXRAY = 0xd2 - DLT_FRELAY = 0x6b - DLT_FRELAY_WITH_DIR = 0xce - DLT_GCOM_SERIAL = 0xad - DLT_GCOM_T1E1 = 0xac - DLT_GPF_F = 0xab - DLT_GPF_T = 0xaa - DLT_GPRS_LLC = 0xa9 - DLT_GSMTAP_ABIS = 0xda - DLT_GSMTAP_UM = 0xd9 - DLT_HHDLC = 0x79 - DLT_IBM_SN = 0x92 - DLT_IBM_SP = 0x91 - DLT_IEEE802 = 0x6 - DLT_IEEE802_11 = 0x69 - DLT_IEEE802_11_RADIO = 0x7f - DLT_IEEE802_11_RADIO_AVS = 0xa3 - DLT_IEEE802_15_4 = 0xc3 - DLT_IEEE802_15_4_LINUX = 0xbf - DLT_IEEE802_15_4_NOFCS = 0xe6 - DLT_IEEE802_15_4_NONASK_PHY = 0xd7 - DLT_IEEE802_16_MAC_CPS = 0xbc - DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 - DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 - DLT_IPMB_LINUX = 0xd1 - DLT_IPNET = 0xe2 - DLT_IPOIB = 0xf2 - DLT_IPV4 = 0xe4 - DLT_IPV6 = 0xe5 - DLT_IP_OVER_FC = 0x7a - DLT_JUNIPER_ATM1 = 0x89 - DLT_JUNIPER_ATM2 = 0x87 - DLT_JUNIPER_ATM_CEMIC = 0xee - DLT_JUNIPER_CHDLC = 0xb5 - DLT_JUNIPER_ES = 0x84 - DLT_JUNIPER_ETHER = 0xb2 - DLT_JUNIPER_FIBRECHANNEL = 0xea - DLT_JUNIPER_FRELAY = 0xb4 - DLT_JUNIPER_GGSN = 0x85 - DLT_JUNIPER_ISM = 0xc2 - DLT_JUNIPER_MFR = 0x86 - DLT_JUNIPER_MLFR = 0x83 - DLT_JUNIPER_MLPPP = 0x82 - DLT_JUNIPER_MONITOR = 0xa4 - DLT_JUNIPER_PIC_PEER = 0xae - DLT_JUNIPER_PPP = 0xb3 - DLT_JUNIPER_PPPOE = 0xa7 - DLT_JUNIPER_PPPOE_ATM = 0xa8 - DLT_JUNIPER_SERVICES = 0x88 - DLT_JUNIPER_SRX_E2E = 0xe9 - DLT_JUNIPER_ST = 0xc8 - DLT_JUNIPER_VP = 0xb7 - DLT_JUNIPER_VS = 0xe8 - DLT_LAPB_WITH_DIR = 0xcf - DLT_LAPD = 0xcb - DLT_LIN = 0xd4 - DLT_LINUX_EVDEV = 0xd8 - DLT_LINUX_IRDA = 0x90 - DLT_LINUX_LAPD = 0xb1 - DLT_LINUX_PPP_WITHDIRECTION = 0xa6 - DLT_LINUX_SLL = 0x71 - DLT_LOOP = 0x6c - DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0xf6 - DLT_MATCHING_MIN = 0x68 - DLT_MFR = 0xb6 - DLT_MOST = 0xd3 - DLT_MPEG_2_TS = 0xf3 - DLT_MPLS = 0xdb - DLT_MTP2 = 0x8c - DLT_MTP2_WITH_PHDR = 0x8b - DLT_MTP3 = 0x8d - DLT_MUX27010 = 0xec - DLT_NETANALYZER = 0xf0 - DLT_NETANALYZER_TRANSPARENT = 0xf1 - DLT_NFC_LLCP = 0xf5 - DLT_NFLOG = 0xef - DLT_NG40 = 0xf4 - DLT_NULL = 0x0 - DLT_PCI_EXP = 0x7d - DLT_PFLOG = 0x75 - DLT_PFSYNC = 0x79 - DLT_PPI = 0xc0 - DLT_PPP = 0x9 - DLT_PPP_BSDOS = 0x10 - DLT_PPP_ETHER = 0x33 - DLT_PPP_PPPD = 0xa6 - DLT_PPP_SERIAL = 0x32 - DLT_PPP_WITH_DIR = 0xcc - DLT_PPP_WITH_DIRECTION = 0xa6 - DLT_PRISM_HEADER = 0x77 - DLT_PRONET = 0x4 - DLT_RAIF1 = 0xc6 - DLT_RAW = 0xc - DLT_RIO = 0x7c - DLT_SCCP = 0x8e - DLT_SITA = 0xc4 - DLT_SLIP = 0x8 - DLT_SLIP_BSDOS = 0xf - DLT_STANAG_5066_D_PDU = 0xed - DLT_SUNATM = 0x7b - DLT_SYMANTEC_FIREWALL = 0x63 - DLT_TZSP = 0x80 - DLT_USB = 0xba - DLT_USB_LINUX = 0xbd - DLT_USB_LINUX_MMAPPED = 0xdc - DLT_USER0 = 0x93 - DLT_USER1 = 0x94 - DLT_USER10 = 0x9d - DLT_USER11 = 0x9e - DLT_USER12 = 0x9f - DLT_USER13 = 0xa0 - DLT_USER14 = 0xa1 - DLT_USER15 = 0xa2 - DLT_USER2 = 0x95 - DLT_USER3 = 0x96 - DLT_USER4 = 0x97 - DLT_USER5 = 0x98 - DLT_USER6 = 0x99 - DLT_USER7 = 0x9a - DLT_USER8 = 0x9b - DLT_USER9 = 0x9c - DLT_WIHART = 0xdf - DLT_X2E_SERIAL = 0xd5 - DLT_X2E_XORAYA = 0xd6 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - EVFILT_AIO = -0x3 - EVFILT_FS = -0x9 - EVFILT_LIO = -0xa - EVFILT_PROC = -0x5 - EVFILT_READ = -0x1 - EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xb - EVFILT_TIMER = -0x7 - EVFILT_USER = -0xb - EVFILT_VNODE = -0x4 - EVFILT_WRITE = -0x2 - EV_ADD = 0x1 - EV_CLEAR = 0x20 - EV_DELETE = 0x2 - EV_DISABLE = 0x8 - EV_DISPATCH = 0x80 - EV_DROP = 0x1000 - EV_ENABLE = 0x4 - EV_EOF = 0x8000 - EV_ERROR = 0x4000 - EV_FLAG1 = 0x2000 - EV_ONESHOT = 0x10 - EV_RECEIPT = 0x40 - EV_SYSFLAGS = 0xf000 - EXTA = 0x4b00 - EXTATTR_NAMESPACE_EMPTY = 0x0 - EXTATTR_NAMESPACE_SYSTEM = 0x2 - EXTATTR_NAMESPACE_USER = 0x1 - EXTB = 0x9600 - EXTPROC = 0x800 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FLUSHO = 0x800000 - F_CANCEL = 0x5 - F_DUP2FD = 0xa - F_DUP2FD_CLOEXEC = 0x12 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x11 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLK = 0xb - F_GETOWN = 0x5 - F_OGETLK = 0x7 - F_OK = 0x0 - F_OSETLK = 0x8 - F_OSETLKW = 0x9 - F_RDAHEAD = 0x10 - F_RDLCK = 0x1 - F_READAHEAD = 0xf - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLK = 0xc - F_SETLKW = 0xd - F_SETLK_REMOTE = 0xe - F_SETOWN = 0x6 - F_UNLCK = 0x2 - F_UNLCKSYS = 0x4 - F_WRLCK = 0x3 - HUPCL = 0x4000 - ICANON = 0x100 - ICMP6_FILTER = 0x12 - ICRNL = 0x100 - IEXTEN = 0x400 - IFAN_ARRIVAL = 0x0 - IFAN_DEPARTURE = 0x1 - IFF_ALLMULTI = 0x200 - IFF_ALTPHYS = 0x4000 - IFF_BROADCAST = 0x2 - IFF_CANTCHANGE = 0x218f72 - IFF_CANTCONFIG = 0x10000 - IFF_DEBUG = 0x4 - IFF_DRV_OACTIVE = 0x400 - IFF_DRV_RUNNING = 0x40 - IFF_DYING = 0x200000 - IFF_LINK0 = 0x1000 - IFF_LINK1 = 0x2000 - IFF_LINK2 = 0x4000 - IFF_LOOPBACK = 0x8 - IFF_MONITOR = 0x40000 - IFF_MULTICAST = 0x8000 - IFF_NOARP = 0x80 - IFF_OACTIVE = 0x400 - IFF_POINTOPOINT = 0x10 - IFF_PPROMISC = 0x20000 - IFF_PROMISC = 0x100 - IFF_RENAMING = 0x400000 - IFF_RUNNING = 0x40 - IFF_SIMPLEX = 0x800 - IFF_SMART = 0x20 - IFF_STATICARP = 0x80000 - IFF_UP = 0x1 - IFNAMSIZ = 0x10 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BRIDGE = 0xd1 - IFT_BSC = 0x53 - IFT_CARP = 0xf8 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE1394 = 0x90 - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INFINIBAND = 0xc7 - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L2VLAN = 0x87 - IFT_L3IPVLAN = 0x88 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPP = 0x17 - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPVIRTUAL = 0x35 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLASSD_HOST = 0xfffffff - IN_CLASSD_NET = 0xf0000000 - IN_CLASSD_NSHIFT = 0x1c - IN_LOOPBACKNET = 0x7f - IN_RFC3021_MASK = 0xfffffffe - IPPROTO_3PC = 0x22 - IPPROTO_ADFS = 0x44 - IPPROTO_AH = 0x33 - IPPROTO_AHIP = 0x3d - IPPROTO_APES = 0x63 - IPPROTO_ARGUS = 0xd - IPPROTO_AX25 = 0x5d - IPPROTO_BHA = 0x31 - IPPROTO_BLT = 0x1e - IPPROTO_BRSATMON = 0x4c - IPPROTO_CARP = 0x70 - IPPROTO_CFTP = 0x3e - IPPROTO_CHAOS = 0x10 - IPPROTO_CMTP = 0x26 - IPPROTO_CPHB = 0x49 - IPPROTO_CPNX = 0x48 - IPPROTO_DDP = 0x25 - IPPROTO_DGP = 0x56 - IPPROTO_DIVERT = 0x102 - IPPROTO_DONE = 0x101 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_EMCON = 0xe - IPPROTO_ENCAP = 0x62 - IPPROTO_EON = 0x50 - IPPROTO_ESP = 0x32 - IPPROTO_ETHERIP = 0x61 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GGP = 0x3 - IPPROTO_GMTP = 0x64 - IPPROTO_GRE = 0x2f - IPPROTO_HELLO = 0x3f - IPPROTO_HIP = 0x8b - IPPROTO_HMP = 0x14 - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IDPR = 0x23 - IPPROTO_IDRP = 0x2d - IPPROTO_IGMP = 0x2 - IPPROTO_IGP = 0x55 - IPPROTO_IGRP = 0x58 - IPPROTO_IL = 0x28 - IPPROTO_INLSP = 0x34 - IPPROTO_INP = 0x20 - IPPROTO_IP = 0x0 - IPPROTO_IPCOMP = 0x6c - IPPROTO_IPCV = 0x47 - IPPROTO_IPEIP = 0x5e - IPPROTO_IPIP = 0x4 - IPPROTO_IPPC = 0x43 - IPPROTO_IPV4 = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_IRTP = 0x1c - IPPROTO_KRYPTOLAN = 0x41 - IPPROTO_LARP = 0x5b - IPPROTO_LEAF1 = 0x19 - IPPROTO_LEAF2 = 0x1a - IPPROTO_MAX = 0x100 - IPPROTO_MAXID = 0x34 - IPPROTO_MEAS = 0x13 - IPPROTO_MH = 0x87 - IPPROTO_MHRP = 0x30 - IPPROTO_MICP = 0x5f - IPPROTO_MOBILE = 0x37 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_MUX = 0x12 - IPPROTO_ND = 0x4d - IPPROTO_NHRP = 0x36 - IPPROTO_NONE = 0x3b - IPPROTO_NSP = 0x1f - IPPROTO_NVPII = 0xb - IPPROTO_OLD_DIVERT = 0xfe - IPPROTO_OSPFIGP = 0x59 - IPPROTO_PFSYNC = 0xf0 - IPPROTO_PGM = 0x71 - IPPROTO_PIGP = 0x9 - IPPROTO_PIM = 0x67 - IPPROTO_PRM = 0x15 - IPPROTO_PUP = 0xc - IPPROTO_PVP = 0x4b - IPPROTO_RAW = 0xff - IPPROTO_RCCMON = 0xa - IPPROTO_RDP = 0x1b - IPPROTO_RESERVED_253 = 0xfd - IPPROTO_RESERVED_254 = 0xfe - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_RVD = 0x42 - IPPROTO_SATEXPAK = 0x40 - IPPROTO_SATMON = 0x45 - IPPROTO_SCCSP = 0x60 - IPPROTO_SCTP = 0x84 - IPPROTO_SDRP = 0x2a - IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 - IPPROTO_SHIM6 = 0x8c - IPPROTO_SKIP = 0x39 - IPPROTO_SPACER = 0x7fff - IPPROTO_SRPC = 0x5a - IPPROTO_ST = 0x7 - IPPROTO_SVMTP = 0x52 - IPPROTO_SWIPE = 0x35 - IPPROTO_TCF = 0x57 - IPPROTO_TCP = 0x6 - IPPROTO_TLSP = 0x38 - IPPROTO_TP = 0x1d - IPPROTO_TPXX = 0x27 - IPPROTO_TRUNK1 = 0x17 - IPPROTO_TRUNK2 = 0x18 - IPPROTO_TTP = 0x54 - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPPROTO_VINES = 0x53 - IPPROTO_VISA = 0x46 - IPPROTO_VMTP = 0x51 - IPPROTO_WBEXPAK = 0x4f - IPPROTO_WBMON = 0x4e - IPPROTO_WSN = 0x4a - IPPROTO_XNET = 0xf - IPPROTO_XTP = 0x24 - IPV6_AUTOFLOWLABEL = 0x3b - IPV6_BINDANY = 0x40 - IPV6_BINDV6ONLY = 0x1b - IPV6_CHECKSUM = 0x1a - IPV6_DEFAULT_MULTICAST_HOPS = 0x1 - IPV6_DEFAULT_MULTICAST_LOOP = 0x1 - IPV6_DEFHLIM = 0x40 - IPV6_DONTFRAG = 0x3e - IPV6_DSTOPTS = 0x32 - IPV6_FAITH = 0x1d - IPV6_FLOWINFO_MASK = 0xffffff0f - IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FRAGTTL = 0x78 - IPV6_FW_ADD = 0x1e - IPV6_FW_DEL = 0x1f - IPV6_FW_FLUSH = 0x20 - IPV6_FW_GET = 0x22 - IPV6_FW_ZERO = 0x21 - IPV6_HLIMDEC = 0x1 - IPV6_HOPLIMIT = 0x2f - IPV6_HOPOPTS = 0x31 - IPV6_IPSEC_POLICY = 0x1c - IPV6_JOIN_GROUP = 0xc - IPV6_LEAVE_GROUP = 0xd - IPV6_MAXHLIM = 0xff - IPV6_MAXOPTHDR = 0x800 - IPV6_MAXPACKET = 0xffff - IPV6_MAX_GROUP_SRC_FILTER = 0x200 - IPV6_MAX_MEMBERSHIPS = 0xfff - IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f - IPV6_MMTU = 0x500 - IPV6_MSFILTER = 0x4a - IPV6_MULTICAST_HOPS = 0xa - IPV6_MULTICAST_IF = 0x9 - IPV6_MULTICAST_LOOP = 0xb - IPV6_NEXTHOP = 0x30 - IPV6_PATHMTU = 0x2c - IPV6_PKTINFO = 0x2e - IPV6_PORTRANGE = 0xe - IPV6_PORTRANGE_DEFAULT = 0x0 - IPV6_PORTRANGE_HIGH = 0x1 - IPV6_PORTRANGE_LOW = 0x2 - IPV6_PREFER_TEMPADDR = 0x3f - IPV6_RECVDSTOPTS = 0x28 - IPV6_RECVHOPLIMIT = 0x25 - IPV6_RECVHOPOPTS = 0x27 - IPV6_RECVPATHMTU = 0x2b - IPV6_RECVPKTINFO = 0x24 - IPV6_RECVRTHDR = 0x26 - IPV6_RECVTCLASS = 0x39 - IPV6_RTHDR = 0x33 - IPV6_RTHDRDSTOPTS = 0x23 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_SOCKOPT_RESERVED1 = 0x3 - IPV6_TCLASS = 0x3d - IPV6_UNICAST_HOPS = 0x4 - IPV6_USE_MIN_MTU = 0x2a - IPV6_V6ONLY = 0x1b - IPV6_VERSION = 0x60 - IPV6_VERSION_MASK = 0xf0 - IP_ADD_MEMBERSHIP = 0xc - IP_ADD_SOURCE_MEMBERSHIP = 0x46 - IP_BINDANY = 0x18 - IP_BLOCK_SOURCE = 0x48 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DONTFRAG = 0x43 - IP_DROP_MEMBERSHIP = 0xd - IP_DROP_SOURCE_MEMBERSHIP = 0x47 - IP_DUMMYNET3 = 0x31 - IP_DUMMYNET_CONFIGURE = 0x3c - IP_DUMMYNET_DEL = 0x3d - IP_DUMMYNET_FLUSH = 0x3e - IP_DUMMYNET_GET = 0x40 - IP_FAITH = 0x16 - IP_FW3 = 0x30 - IP_FW_ADD = 0x32 - IP_FW_DEL = 0x33 - IP_FW_FLUSH = 0x34 - IP_FW_GET = 0x36 - IP_FW_NAT_CFG = 0x38 - IP_FW_NAT_DEL = 0x39 - IP_FW_NAT_GET_CONFIG = 0x3a - IP_FW_NAT_GET_LOG = 0x3b - IP_FW_RESETLOG = 0x37 - IP_FW_TABLE_ADD = 0x28 - IP_FW_TABLE_DEL = 0x29 - IP_FW_TABLE_FLUSH = 0x2a - IP_FW_TABLE_GETSIZE = 0x2b - IP_FW_TABLE_LIST = 0x2c - IP_FW_ZERO = 0x35 - IP_HDRINCL = 0x2 - IP_IPSEC_POLICY = 0x15 - IP_MAXPACKET = 0xffff - IP_MAX_GROUP_SRC_FILTER = 0x200 - IP_MAX_MEMBERSHIPS = 0xfff - IP_MAX_SOCK_MUTE_FILTER = 0x80 - IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MF = 0x2000 - IP_MINTTL = 0x42 - IP_MIN_MEMBERSHIPS = 0x1f - IP_MSFILTER = 0x4a - IP_MSS = 0x240 - IP_MULTICAST_IF = 0x9 - IP_MULTICAST_LOOP = 0xb - IP_MULTICAST_TTL = 0xa - IP_MULTICAST_VIF = 0xe - IP_OFFMASK = 0x1fff - IP_ONESBCAST = 0x17 - IP_OPTIONS = 0x1 - IP_PORTRANGE = 0x13 - IP_PORTRANGE_DEFAULT = 0x0 - IP_PORTRANGE_HIGH = 0x1 - IP_PORTRANGE_LOW = 0x2 - IP_RECVDSTADDR = 0x7 - IP_RECVIF = 0x14 - IP_RECVOPTS = 0x5 - IP_RECVRETOPTS = 0x6 - IP_RECVTOS = 0x44 - IP_RECVTTL = 0x41 - IP_RETOPTS = 0x8 - IP_RF = 0x8000 - IP_RSVP_OFF = 0x10 - IP_RSVP_ON = 0xf - IP_RSVP_VIF_OFF = 0x12 - IP_RSVP_VIF_ON = 0x11 - IP_SENDSRCADDR = 0x7 - IP_TOS = 0x3 - IP_TTL = 0x4 - IP_UNBLOCK_SOURCE = 0x49 - ISIG = 0x80 - ISTRIP = 0x20 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_AUTOSYNC = 0x7 - MADV_CORE = 0x9 - MADV_DONTNEED = 0x4 - MADV_FREE = 0x5 - MADV_NOCORE = 0x8 - MADV_NORMAL = 0x0 - MADV_NOSYNC = 0x6 - MADV_PROTECT = 0xa - MADV_RANDOM = 0x1 - MADV_SEQUENTIAL = 0x2 - MADV_WILLNEED = 0x3 - MAP_32BIT = 0x80000 - MAP_ALIGNED_SUPER = 0x1000000 - MAP_ALIGNMENT_MASK = -0x1000000 - MAP_ALIGNMENT_SHIFT = 0x18 - MAP_ANON = 0x1000 - MAP_ANONYMOUS = 0x1000 - MAP_COPY = 0x2 - MAP_EXCL = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_HASSEMAPHORE = 0x200 - MAP_NOCORE = 0x20000 - MAP_NORESERVE = 0x40 - MAP_NOSYNC = 0x800 - MAP_PREFAULT_READ = 0x40000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x20 - MAP_RESERVED0080 = 0x80 - MAP_RESERVED0100 = 0x100 - MAP_SHARED = 0x1 - MAP_STACK = 0x400 - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MSG_CMSG_CLOEXEC = 0x40000 - MSG_COMPAT = 0x8000 - MSG_CTRUNC = 0x20 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x80 - MSG_EOF = 0x100 - MSG_EOR = 0x8 - MSG_NBIO = 0x4000 - MSG_NOSIGNAL = 0x20000 - MSG_NOTIFICATION = 0x2000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_TRUNC = 0x10 - MSG_WAITALL = 0x40 - MS_ASYNC = 0x1 - MS_INVALIDATE = 0x2 - MS_SYNC = 0x0 - NAME_MAX = 0xff - NET_RT_DUMP = 0x1 - NET_RT_FLAGS = 0x2 - NET_RT_IFLIST = 0x3 - NET_RT_IFLISTL = 0x5 - NET_RT_IFMALIST = 0x4 - NET_RT_MAXID = 0x6 - NOFLSH = 0x80000000 - NOTE_ATTRIB = 0x8 - NOTE_CHILD = 0x4 - NOTE_DELETE = 0x1 - NOTE_EXEC = 0x20000000 - NOTE_EXIT = 0x80000000 - NOTE_EXTEND = 0x4 - NOTE_FFAND = 0x40000000 - NOTE_FFCOPY = 0xc0000000 - NOTE_FFCTRLMASK = 0xc0000000 - NOTE_FFLAGSMASK = 0xffffff - NOTE_FFNOP = 0x0 - NOTE_FFOR = 0x80000000 - NOTE_FORK = 0x40000000 - NOTE_LINK = 0x10 - NOTE_LOWAT = 0x1 - NOTE_MSECONDS = 0x2 - NOTE_NSECONDS = 0x8 - NOTE_PCTRLMASK = 0xf0000000 - NOTE_PDATAMASK = 0xfffff - NOTE_RENAME = 0x20 - NOTE_REVOKE = 0x40 - NOTE_SECONDS = 0x1 - NOTE_TRACK = 0x1 - NOTE_TRACKERR = 0x2 - NOTE_TRIGGER = 0x1000000 - NOTE_USECONDS = 0x4 - NOTE_WRITE = 0x2 - OCRNL = 0x10 - ONLCR = 0x2 - ONLRET = 0x40 - ONOCR = 0x20 - ONOEOT = 0x8 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x40 - O_CLOEXEC = 0x100000 - O_CREAT = 0x200 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x20000 - O_EXCL = 0x800 - O_EXEC = 0x40000 - O_EXLOCK = 0x20 - O_FSYNC = 0x80 - O_NDELAY = 0x4 - O_NOCTTY = 0x8000 - O_NOFOLLOW = 0x100 - O_NONBLOCK = 0x4 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_SHLOCK = 0x10 - O_SYNC = 0x80 - O_TRUNC = 0x400 - O_TTY_INIT = 0x80000 - O_WRONLY = 0x1 - PARENB = 0x1000 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - RLIMIT_AS = 0xa - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x8 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0x7fffffffffffffff - RTAX_AUTHOR = 0x6 - RTAX_BRD = 0x7 - RTAX_DST = 0x0 - RTAX_GATEWAY = 0x1 - RTAX_GENMASK = 0x3 - RTAX_IFA = 0x5 - RTAX_IFP = 0x4 - RTAX_MAX = 0x8 - RTAX_NETMASK = 0x2 - RTA_AUTHOR = 0x40 - RTA_BRD = 0x80 - RTA_DST = 0x1 - RTA_GATEWAY = 0x2 - RTA_GENMASK = 0x8 - RTA_IFA = 0x20 - RTA_IFP = 0x10 - RTA_NETMASK = 0x4 - RTF_BLACKHOLE = 0x1000 - RTF_BROADCAST = 0x400000 - RTF_DONE = 0x40 - RTF_DYNAMIC = 0x10 - RTF_FMASK = 0x1004d808 - RTF_GATEWAY = 0x2 - RTF_GWFLAG_COMPAT = 0x80000000 - RTF_HOST = 0x4 - RTF_LLDATA = 0x400 - RTF_LLINFO = 0x400 - RTF_LOCAL = 0x200000 - RTF_MODIFIED = 0x20 - RTF_MULTICAST = 0x800000 - RTF_PINNED = 0x100000 - RTF_PRCLONING = 0x10000 - RTF_PROTO1 = 0x8000 - RTF_PROTO2 = 0x4000 - RTF_PROTO3 = 0x40000 - RTF_REJECT = 0x8 - RTF_RNH_LOCKED = 0x40000000 - RTF_STATIC = 0x800 - RTF_STICKY = 0x10000000 - RTF_UP = 0x1 - RTF_XRESOLVE = 0x200 - RTM_ADD = 0x1 - RTM_CHANGE = 0x3 - RTM_DELADDR = 0xd - RTM_DELETE = 0x2 - RTM_DELMADDR = 0x10 - RTM_GET = 0x4 - RTM_IEEE80211 = 0x12 - RTM_IFANNOUNCE = 0x11 - RTM_IFINFO = 0xe - RTM_LOCK = 0x8 - RTM_LOSING = 0x5 - RTM_MISS = 0x7 - RTM_NEWADDR = 0xc - RTM_NEWMADDR = 0xf - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RTM_REDIRECT = 0x6 - RTM_RESOLVE = 0xb - RTM_RTTUNIT = 0xf4240 - RTM_VERSION = 0x5 - RTV_EXPIRE = 0x4 - RTV_HOPCOUNT = 0x2 - RTV_MTU = 0x1 - RTV_RPIPE = 0x8 - RTV_RTT = 0x40 - RTV_RTTVAR = 0x80 - RTV_SPIPE = 0x10 - RTV_SSTHRESH = 0x20 - RTV_WEIGHT = 0x100 - RT_ALL_FIBS = -0x1 - RT_CACHING_CONTEXT = 0x1 - RT_DEFAULT_FIB = 0x0 - RT_NORTREF = 0x2 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_BINTIME = 0x4 - SCM_CREDS = 0x3 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x2 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDMULTI = 0x80206931 - SIOCADDRT = 0x8040720a - SIOCAIFADDR = 0x8040691a - SIOCAIFGROUP = 0x80286987 - SIOCALIFADDR = 0x8118691b - SIOCATMARK = 0x40047307 - SIOCDELMULTI = 0x80206932 - SIOCDELRT = 0x8040720b - SIOCDIFADDR = 0x80206919 - SIOCDIFGROUP = 0x80286989 - SIOCDIFPHYADDR = 0x80206949 - SIOCDLIFADDR = 0x8118691d - SIOCGDRVSPEC = 0xc028697b - SIOCGETSGCNT = 0xc0207210 - SIOCGETVIFCNT = 0xc028720f - SIOCGHIWAT = 0x40047301 - SIOCGIFADDR = 0xc0206921 - SIOCGIFBRDADDR = 0xc0206923 - SIOCGIFCAP = 0xc020691f - SIOCGIFCONF = 0xc0106924 - SIOCGIFDESCR = 0xc020692a - SIOCGIFDSTADDR = 0xc0206922 - SIOCGIFFIB = 0xc020695c - SIOCGIFFLAGS = 0xc0206911 - SIOCGIFGENERIC = 0xc020693a - SIOCGIFGMEMB = 0xc028698a - SIOCGIFGROUP = 0xc0286988 - SIOCGIFINDEX = 0xc0206920 - SIOCGIFMAC = 0xc0206926 - SIOCGIFMEDIA = 0xc0306938 - SIOCGIFMETRIC = 0xc0206917 - SIOCGIFMTU = 0xc0206933 - SIOCGIFNETMASK = 0xc0206925 - SIOCGIFPDSTADDR = 0xc0206948 - SIOCGIFPHYS = 0xc0206935 - SIOCGIFPSRCADDR = 0xc0206947 - SIOCGIFSTATUS = 0xc331693b - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCGLOWAT = 0x40047303 - SIOCGPGRP = 0x40047309 - SIOCGPRIVATE_0 = 0xc0206950 - SIOCGPRIVATE_1 = 0xc0206951 - SIOCIFCREATE = 0xc020697a - SIOCIFCREATE2 = 0xc020697c - SIOCIFDESTROY = 0x80206979 - SIOCIFGCLONERS = 0xc0106978 - SIOCSDRVSPEC = 0x8028697b - SIOCSHIWAT = 0x80047300 - SIOCSIFADDR = 0x8020690c - SIOCSIFBRDADDR = 0x80206913 - SIOCSIFCAP = 0x8020691e - SIOCSIFDESCR = 0x80206929 - SIOCSIFDSTADDR = 0x8020690e - SIOCSIFFIB = 0x8020695d - SIOCSIFFLAGS = 0x80206910 - SIOCSIFGENERIC = 0x80206939 - SIOCSIFLLADDR = 0x8020693c - SIOCSIFMAC = 0x80206927 - SIOCSIFMEDIA = 0xc0206937 - SIOCSIFMETRIC = 0x80206918 - SIOCSIFMTU = 0x80206934 - SIOCSIFNAME = 0x80206928 - SIOCSIFNETMASK = 0x80206916 - SIOCSIFPHYADDR = 0x80406946 - SIOCSIFPHYS = 0x80206936 - SIOCSIFRVNET = 0xc020695b - SIOCSIFVNET = 0xc020695a - SIOCSLIFPHYADDR = 0x8118694a - SIOCSLOWAT = 0x80047302 - SIOCSPGRP = 0x80047308 - SOCK_CLOEXEC = 0x10000000 - SOCK_DGRAM = 0x2 - SOCK_MAXADDRLEN = 0xff - SOCK_NONBLOCK = 0x20000000 - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_SOCKET = 0xffff - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x2 - SO_ACCEPTFILTER = 0x1000 - SO_BINTIME = 0x2000 - SO_BROADCAST = 0x20 - SO_DEBUG = 0x1 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_KEEPALIVE = 0x8 - SO_LABEL = 0x1009 - SO_LINGER = 0x80 - SO_LISTENINCQLEN = 0x1013 - SO_LISTENQLEN = 0x1012 - SO_LISTENQLIMIT = 0x1011 - SO_NOSIGPIPE = 0x800 - SO_NO_DDP = 0x8000 - SO_NO_OFFLOAD = 0x4000 - SO_OOBINLINE = 0x100 - SO_PEERLABEL = 0x1010 - SO_PROTOCOL = 0x1016 - SO_PROTOTYPE = 0x1016 - SO_RCVBUF = 0x1002 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_SETFIB = 0x1014 - SO_SNDBUF = 0x1001 - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_TIMESTAMP = 0x400 - SO_TYPE = 0x1008 - SO_USELOOPBACK = 0x40 - SO_USER_COOKIE = 0x1015 - SO_VENDOR = 0x80000000 - TCIFLUSH = 0x1 - TCIOFLUSH = 0x3 - TCOFLUSH = 0x2 - TCP_CA_NAME_MAX = 0x10 - TCP_CONGESTION = 0x40 - TCP_INFO = 0x20 - TCP_KEEPCNT = 0x400 - TCP_KEEPIDLE = 0x100 - TCP_KEEPINIT = 0x80 - TCP_KEEPINTVL = 0x200 - TCP_MAXBURST = 0x4 - TCP_MAXHLEN = 0x3c - TCP_MAXOLEN = 0x28 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_SACK = 0x4 - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0x10 - TCP_MINMSS = 0xd8 - TCP_MSS = 0x218 - TCP_NODELAY = 0x1 - TCP_NOOPT = 0x8 - TCP_NOPUSH = 0x4 - TCP_VENDOR = 0x80000000 - TCSAFLUSH = 0x2 - TIOCCBRK = 0x2000747a - TIOCCDTR = 0x20007478 - TIOCCONS = 0x80047462 - TIOCDRAIN = 0x2000745e - TIOCEXCL = 0x2000740d - TIOCEXT = 0x80047460 - TIOCFLUSH = 0x80047410 - TIOCGDRAINWAIT = 0x40047456 - TIOCGETA = 0x402c7413 - TIOCGETD = 0x4004741a - TIOCGPGRP = 0x40047477 - TIOCGPTN = 0x4004740f - TIOCGSID = 0x40047463 - TIOCGWINSZ = 0x40087468 - TIOCMBIC = 0x8004746b - TIOCMBIS = 0x8004746c - TIOCMGDTRWAIT = 0x4004745a - TIOCMGET = 0x4004746a - TIOCMSDTRWAIT = 0x8004745b - TIOCMSET = 0x8004746d - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DCD = 0x40 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x20007471 - TIOCNXCL = 0x2000740e - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x80047470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCPTMASTER = 0x2000741c - TIOCSBRK = 0x2000747b - TIOCSCTTY = 0x20007461 - TIOCSDRAINWAIT = 0x80047457 - TIOCSDTR = 0x20007479 - TIOCSETA = 0x802c7414 - TIOCSETAF = 0x802c7416 - TIOCSETAW = 0x802c7415 - TIOCSETD = 0x8004741b - TIOCSIG = 0x2004745f - TIOCSPGRP = 0x80047476 - TIOCSTART = 0x2000746e - TIOCSTAT = 0x20007465 - TIOCSTI = 0x80017472 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCTIMESTAMP = 0x40107459 - TIOCUCNTL = 0x80047466 - TOSTOP = 0x400000 - VDISCARD = 0xf - VDSUSP = 0xb - VEOF = 0x0 - VEOL = 0x1 - VEOL2 = 0x2 - VERASE = 0x3 - VERASE2 = 0x7 - VINTR = 0x8 - VKILL = 0x5 - VLNEXT = 0xe - VMIN = 0x10 - VQUIT = 0x9 - VREPRINT = 0x6 - VSTART = 0xc - VSTATUS = 0x12 - VSTOP = 0xd - VSUSP = 0xa - VTIME = 0x11 - VWERASE = 0x4 - WCONTINUED = 0x4 - WCOREFLAG = 0x80 - WEXITED = 0x10 - WLINUXCLONE = 0x80000000 - WNOHANG = 0x1 - WNOWAIT = 0x8 - WSTOPPED = 0x2 - WTRAPPED = 0x20 - WUNTRACED = 0x2 + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go index 2afbe2d5ed..87deda950e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -1,5 +1,5 @@ // mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd @@ -11,1442 +11,1471 @@ package unix import "syscall" const ( - AF_APPLETALK = 0x10 - AF_ARP = 0x23 - AF_ATM = 0x1e - AF_BLUETOOTH = 0x24 - AF_CCITT = 0xa - AF_CHAOS = 0x5 - AF_CNT = 0x15 - AF_COIP = 0x14 - AF_DATAKIT = 0x9 - AF_DECnet = 0xc - AF_DLI = 0xd - AF_E164 = 0x1a - AF_ECMA = 0x8 - AF_HYLINK = 0xf - AF_IEEE80211 = 0x25 - AF_IMPLINK = 0x3 - AF_INET = 0x2 - AF_INET6 = 0x1c - AF_INET6_SDP = 0x2a - AF_INET_SDP = 0x28 - AF_IPX = 0x17 - AF_ISDN = 0x1a - AF_ISO = 0x7 - AF_LAT = 0xe - AF_LINK = 0x12 - AF_LOCAL = 0x1 - AF_MAX = 0x2a - AF_NATM = 0x1d - AF_NETBIOS = 0x6 - AF_NETGRAPH = 0x20 - AF_OSI = 0x7 - AF_PUP = 0x4 - AF_ROUTE = 0x11 - AF_SCLUSTER = 0x22 - AF_SIP = 0x18 - AF_SLOW = 0x21 - AF_SNA = 0xb - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VENDOR00 = 0x27 - AF_VENDOR01 = 0x29 - AF_VENDOR02 = 0x2b - AF_VENDOR03 = 0x2d - AF_VENDOR04 = 0x2f - AF_VENDOR05 = 0x31 - AF_VENDOR06 = 0x33 - AF_VENDOR07 = 0x35 - AF_VENDOR08 = 0x37 - AF_VENDOR09 = 0x39 - AF_VENDOR10 = 0x3b - AF_VENDOR11 = 0x3d - AF_VENDOR12 = 0x3f - AF_VENDOR13 = 0x41 - AF_VENDOR14 = 0x43 - AF_VENDOR15 = 0x45 - AF_VENDOR16 = 0x47 - AF_VENDOR17 = 0x49 - AF_VENDOR18 = 0x4b - AF_VENDOR19 = 0x4d - AF_VENDOR20 = 0x4f - AF_VENDOR21 = 0x51 - AF_VENDOR22 = 0x53 - AF_VENDOR23 = 0x55 - AF_VENDOR24 = 0x57 - AF_VENDOR25 = 0x59 - AF_VENDOR26 = 0x5b - AF_VENDOR27 = 0x5d - AF_VENDOR28 = 0x5f - AF_VENDOR29 = 0x61 - AF_VENDOR30 = 0x63 - AF_VENDOR31 = 0x65 - AF_VENDOR32 = 0x67 - AF_VENDOR33 = 0x69 - AF_VENDOR34 = 0x6b - AF_VENDOR35 = 0x6d - AF_VENDOR36 = 0x6f - AF_VENDOR37 = 0x71 - AF_VENDOR38 = 0x73 - AF_VENDOR39 = 0x75 - AF_VENDOR40 = 0x77 - AF_VENDOR41 = 0x79 - AF_VENDOR42 = 0x7b - AF_VENDOR43 = 0x7d - AF_VENDOR44 = 0x7f - AF_VENDOR45 = 0x81 - AF_VENDOR46 = 0x83 - AF_VENDOR47 = 0x85 - B0 = 0x0 - B110 = 0x6e - B115200 = 0x1c200 - B1200 = 0x4b0 - B134 = 0x86 - B14400 = 0x3840 - B150 = 0x96 - B1800 = 0x708 - B19200 = 0x4b00 - B200 = 0xc8 - B230400 = 0x38400 - B2400 = 0x960 - B28800 = 0x7080 - B300 = 0x12c - B38400 = 0x9600 - B460800 = 0x70800 - B4800 = 0x12c0 - B50 = 0x32 - B57600 = 0xe100 - B600 = 0x258 - B7200 = 0x1c20 - B75 = 0x4b - B76800 = 0x12c00 - B921600 = 0xe1000 - B9600 = 0x2580 - BIOCFEEDBACK = 0x8004427c - BIOCFLUSH = 0x20004268 - BIOCGBLEN = 0x40044266 - BIOCGDIRECTION = 0x40044276 - BIOCGDLT = 0x4004426a - BIOCGDLTLIST = 0xc0084279 - BIOCGETBUFMODE = 0x4004427d - BIOCGETIF = 0x4020426b - BIOCGETZMAX = 0x4004427f - BIOCGHDRCMPLT = 0x40044274 - BIOCGRSIG = 0x40044272 - BIOCGRTIMEOUT = 0x4008426e - BIOCGSEESENT = 0x40044276 - BIOCGSTATS = 0x4008426f - BIOCGTSTAMP = 0x40044283 - BIOCIMMEDIATE = 0x80044270 - BIOCLOCK = 0x2000427a - BIOCPROMISC = 0x20004269 - BIOCROTZBUF = 0x400c4280 - BIOCSBLEN = 0xc0044266 - BIOCSDIRECTION = 0x80044277 - BIOCSDLT = 0x80044278 - BIOCSETBUFMODE = 0x8004427e - BIOCSETF = 0x80084267 - BIOCSETFNR = 0x80084282 - BIOCSETIF = 0x8020426c - BIOCSETWF = 0x8008427b - BIOCSETZBUF = 0x800c4281 - BIOCSHDRCMPLT = 0x80044275 - BIOCSRSIG = 0x80044273 - BIOCSRTIMEOUT = 0x8008426d - BIOCSSEESENT = 0x80044277 - BIOCSTSTAMP = 0x80044284 - BIOCVERSION = 0x40044271 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALIGNMENT = 0x4 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_BUFMODE_BUFFER = 0x1 - BPF_BUFMODE_ZBUF = 0x2 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXBUFSIZE = 0x80000 - BPF_MAXINSNS = 0x200 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINBUFSIZE = 0x20 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RELEASE = 0x30bb6 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_T_BINTIME = 0x2 - BPF_T_BINTIME_FAST = 0x102 - BPF_T_BINTIME_MONOTONIC = 0x202 - BPF_T_BINTIME_MONOTONIC_FAST = 0x302 - BPF_T_FAST = 0x100 - BPF_T_FLAG_MASK = 0x300 - BPF_T_FORMAT_MASK = 0x3 - BPF_T_MICROTIME = 0x0 - BPF_T_MICROTIME_FAST = 0x100 - BPF_T_MICROTIME_MONOTONIC = 0x200 - BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 - BPF_T_MONOTONIC = 0x200 - BPF_T_MONOTONIC_FAST = 0x300 - BPF_T_NANOTIME = 0x1 - BPF_T_NANOTIME_FAST = 0x101 - BPF_T_NANOTIME_MONOTONIC = 0x201 - BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 - BPF_T_NONE = 0x3 - BPF_T_NORMAL = 0x0 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - CFLUSH = 0xf - CLOCAL = 0x8000 - CREAD = 0x800 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x14 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - CTL_MAXNAME = 0x18 - CTL_NET = 0x4 - DLT_A429 = 0xb8 - DLT_A653_ICM = 0xb9 - DLT_AIRONET_HEADER = 0x78 - DLT_AOS = 0xde - DLT_APPLE_IP_OVER_IEEE1394 = 0x8a - DLT_ARCNET = 0x7 - DLT_ARCNET_LINUX = 0x81 - DLT_ATM_CLIP = 0x13 - DLT_ATM_RFC1483 = 0xb - DLT_AURORA = 0x7e - DLT_AX25 = 0x3 - DLT_AX25_KISS = 0xca - DLT_BACNET_MS_TP = 0xa5 - DLT_BLUETOOTH_HCI_H4 = 0xbb - DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 - DLT_CAN20B = 0xbe - DLT_CAN_SOCKETCAN = 0xe3 - DLT_CHAOS = 0x5 - DLT_CHDLC = 0x68 - DLT_CISCO_IOS = 0x76 - DLT_C_HDLC = 0x68 - DLT_C_HDLC_WITH_DIR = 0xcd - DLT_DBUS = 0xe7 - DLT_DECT = 0xdd - DLT_DOCSIS = 0x8f - DLT_DVB_CI = 0xeb - DLT_ECONET = 0x73 - DLT_EN10MB = 0x1 - DLT_EN3MB = 0x2 - DLT_ENC = 0x6d - DLT_ERF = 0xc5 - DLT_ERF_ETH = 0xaf - DLT_ERF_POS = 0xb0 - DLT_FC_2 = 0xe0 - DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 - DLT_FDDI = 0xa - DLT_FLEXRAY = 0xd2 - DLT_FRELAY = 0x6b - DLT_FRELAY_WITH_DIR = 0xce - DLT_GCOM_SERIAL = 0xad - DLT_GCOM_T1E1 = 0xac - DLT_GPF_F = 0xab - DLT_GPF_T = 0xaa - DLT_GPRS_LLC = 0xa9 - DLT_GSMTAP_ABIS = 0xda - DLT_GSMTAP_UM = 0xd9 - DLT_HHDLC = 0x79 - DLT_IBM_SN = 0x92 - DLT_IBM_SP = 0x91 - DLT_IEEE802 = 0x6 - DLT_IEEE802_11 = 0x69 - DLT_IEEE802_11_RADIO = 0x7f - DLT_IEEE802_11_RADIO_AVS = 0xa3 - DLT_IEEE802_15_4 = 0xc3 - DLT_IEEE802_15_4_LINUX = 0xbf - DLT_IEEE802_15_4_NOFCS = 0xe6 - DLT_IEEE802_15_4_NONASK_PHY = 0xd7 - DLT_IEEE802_16_MAC_CPS = 0xbc - DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 - DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 - DLT_IPMB_LINUX = 0xd1 - DLT_IPNET = 0xe2 - DLT_IPOIB = 0xf2 - DLT_IPV4 = 0xe4 - DLT_IPV6 = 0xe5 - DLT_IP_OVER_FC = 0x7a - DLT_JUNIPER_ATM1 = 0x89 - DLT_JUNIPER_ATM2 = 0x87 - DLT_JUNIPER_ATM_CEMIC = 0xee - DLT_JUNIPER_CHDLC = 0xb5 - DLT_JUNIPER_ES = 0x84 - DLT_JUNIPER_ETHER = 0xb2 - DLT_JUNIPER_FIBRECHANNEL = 0xea - DLT_JUNIPER_FRELAY = 0xb4 - DLT_JUNIPER_GGSN = 0x85 - DLT_JUNIPER_ISM = 0xc2 - DLT_JUNIPER_MFR = 0x86 - DLT_JUNIPER_MLFR = 0x83 - DLT_JUNIPER_MLPPP = 0x82 - DLT_JUNIPER_MONITOR = 0xa4 - DLT_JUNIPER_PIC_PEER = 0xae - DLT_JUNIPER_PPP = 0xb3 - DLT_JUNIPER_PPPOE = 0xa7 - DLT_JUNIPER_PPPOE_ATM = 0xa8 - DLT_JUNIPER_SERVICES = 0x88 - DLT_JUNIPER_SRX_E2E = 0xe9 - DLT_JUNIPER_ST = 0xc8 - DLT_JUNIPER_VP = 0xb7 - DLT_JUNIPER_VS = 0xe8 - DLT_LAPB_WITH_DIR = 0xcf - DLT_LAPD = 0xcb - DLT_LIN = 0xd4 - DLT_LINUX_EVDEV = 0xd8 - DLT_LINUX_IRDA = 0x90 - DLT_LINUX_LAPD = 0xb1 - DLT_LINUX_PPP_WITHDIRECTION = 0xa6 - DLT_LINUX_SLL = 0x71 - DLT_LOOP = 0x6c - DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0xf6 - DLT_MATCHING_MIN = 0x68 - DLT_MFR = 0xb6 - DLT_MOST = 0xd3 - DLT_MPEG_2_TS = 0xf3 - DLT_MPLS = 0xdb - DLT_MTP2 = 0x8c - DLT_MTP2_WITH_PHDR = 0x8b - DLT_MTP3 = 0x8d - DLT_MUX27010 = 0xec - DLT_NETANALYZER = 0xf0 - DLT_NETANALYZER_TRANSPARENT = 0xf1 - DLT_NFC_LLCP = 0xf5 - DLT_NFLOG = 0xef - DLT_NG40 = 0xf4 - DLT_NULL = 0x0 - DLT_PCI_EXP = 0x7d - DLT_PFLOG = 0x75 - DLT_PFSYNC = 0x79 - DLT_PPI = 0xc0 - DLT_PPP = 0x9 - DLT_PPP_BSDOS = 0x10 - DLT_PPP_ETHER = 0x33 - DLT_PPP_PPPD = 0xa6 - DLT_PPP_SERIAL = 0x32 - DLT_PPP_WITH_DIR = 0xcc - DLT_PPP_WITH_DIRECTION = 0xa6 - DLT_PRISM_HEADER = 0x77 - DLT_PRONET = 0x4 - DLT_RAIF1 = 0xc6 - DLT_RAW = 0xc - DLT_RIO = 0x7c - DLT_SCCP = 0x8e - DLT_SITA = 0xc4 - DLT_SLIP = 0x8 - DLT_SLIP_BSDOS = 0xf - DLT_STANAG_5066_D_PDU = 0xed - DLT_SUNATM = 0x7b - DLT_SYMANTEC_FIREWALL = 0x63 - DLT_TZSP = 0x80 - DLT_USB = 0xba - DLT_USB_LINUX = 0xbd - DLT_USB_LINUX_MMAPPED = 0xdc - DLT_USER0 = 0x93 - DLT_USER1 = 0x94 - DLT_USER10 = 0x9d - DLT_USER11 = 0x9e - DLT_USER12 = 0x9f - DLT_USER13 = 0xa0 - DLT_USER14 = 0xa1 - DLT_USER15 = 0xa2 - DLT_USER2 = 0x95 - DLT_USER3 = 0x96 - DLT_USER4 = 0x97 - DLT_USER5 = 0x98 - DLT_USER6 = 0x99 - DLT_USER7 = 0x9a - DLT_USER8 = 0x9b - DLT_USER9 = 0x9c - DLT_WIHART = 0xdf - DLT_X2E_SERIAL = 0xd5 - DLT_X2E_XORAYA = 0xd6 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - EVFILT_AIO = -0x3 - EVFILT_FS = -0x9 - EVFILT_LIO = -0xa - EVFILT_PROC = -0x5 - EVFILT_READ = -0x1 - EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xb - EVFILT_TIMER = -0x7 - EVFILT_USER = -0xb - EVFILT_VNODE = -0x4 - EVFILT_WRITE = -0x2 - EV_ADD = 0x1 - EV_CLEAR = 0x20 - EV_DELETE = 0x2 - EV_DISABLE = 0x8 - EV_DISPATCH = 0x80 - EV_DROP = 0x1000 - EV_ENABLE = 0x4 - EV_EOF = 0x8000 - EV_ERROR = 0x4000 - EV_FLAG1 = 0x2000 - EV_ONESHOT = 0x10 - EV_RECEIPT = 0x40 - EV_SYSFLAGS = 0xf000 - EXTA = 0x4b00 - EXTATTR_NAMESPACE_EMPTY = 0x0 - EXTATTR_NAMESPACE_SYSTEM = 0x2 - EXTATTR_NAMESPACE_USER = 0x1 - EXTB = 0x9600 - EXTPROC = 0x800 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FLUSHO = 0x800000 - F_CANCEL = 0x5 - F_DUP2FD = 0xa - F_DUP2FD_CLOEXEC = 0x12 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x11 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLK = 0xb - F_GETOWN = 0x5 - F_OGETLK = 0x7 - F_OK = 0x0 - F_OSETLK = 0x8 - F_OSETLKW = 0x9 - F_RDAHEAD = 0x10 - F_RDLCK = 0x1 - F_READAHEAD = 0xf - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLK = 0xc - F_SETLKW = 0xd - F_SETLK_REMOTE = 0xe - F_SETOWN = 0x6 - F_UNLCK = 0x2 - F_UNLCKSYS = 0x4 - F_WRLCK = 0x3 - HUPCL = 0x4000 - ICANON = 0x100 - ICMP6_FILTER = 0x12 - ICRNL = 0x100 - IEXTEN = 0x400 - IFAN_ARRIVAL = 0x0 - IFAN_DEPARTURE = 0x1 - IFF_ALLMULTI = 0x200 - IFF_ALTPHYS = 0x4000 - IFF_BROADCAST = 0x2 - IFF_CANTCHANGE = 0x218f72 - IFF_CANTCONFIG = 0x10000 - IFF_DEBUG = 0x4 - IFF_DRV_OACTIVE = 0x400 - IFF_DRV_RUNNING = 0x40 - IFF_DYING = 0x200000 - IFF_LINK0 = 0x1000 - IFF_LINK1 = 0x2000 - IFF_LINK2 = 0x4000 - IFF_LOOPBACK = 0x8 - IFF_MONITOR = 0x40000 - IFF_MULTICAST = 0x8000 - IFF_NOARP = 0x80 - IFF_OACTIVE = 0x400 - IFF_POINTOPOINT = 0x10 - IFF_PPROMISC = 0x20000 - IFF_PROMISC = 0x100 - IFF_RENAMING = 0x400000 - IFF_RUNNING = 0x40 - IFF_SIMPLEX = 0x800 - IFF_SMART = 0x20 - IFF_STATICARP = 0x80000 - IFF_UP = 0x1 - IFNAMSIZ = 0x10 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BRIDGE = 0xd1 - IFT_BSC = 0x53 - IFT_CARP = 0xf8 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE1394 = 0x90 - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INFINIBAND = 0xc7 - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L2VLAN = 0x87 - IFT_L3IPVLAN = 0x88 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPP = 0x17 - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPVIRTUAL = 0x35 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLASSD_HOST = 0xfffffff - IN_CLASSD_NET = 0xf0000000 - IN_CLASSD_NSHIFT = 0x1c - IN_LOOPBACKNET = 0x7f - IN_RFC3021_MASK = 0xfffffffe - IPPROTO_3PC = 0x22 - IPPROTO_ADFS = 0x44 - IPPROTO_AH = 0x33 - IPPROTO_AHIP = 0x3d - IPPROTO_APES = 0x63 - IPPROTO_ARGUS = 0xd - IPPROTO_AX25 = 0x5d - IPPROTO_BHA = 0x31 - IPPROTO_BLT = 0x1e - IPPROTO_BRSATMON = 0x4c - IPPROTO_CARP = 0x70 - IPPROTO_CFTP = 0x3e - IPPROTO_CHAOS = 0x10 - IPPROTO_CMTP = 0x26 - IPPROTO_CPHB = 0x49 - IPPROTO_CPNX = 0x48 - IPPROTO_DDP = 0x25 - IPPROTO_DGP = 0x56 - IPPROTO_DIVERT = 0x102 - IPPROTO_DONE = 0x101 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_EMCON = 0xe - IPPROTO_ENCAP = 0x62 - IPPROTO_EON = 0x50 - IPPROTO_ESP = 0x32 - IPPROTO_ETHERIP = 0x61 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GGP = 0x3 - IPPROTO_GMTP = 0x64 - IPPROTO_GRE = 0x2f - IPPROTO_HELLO = 0x3f - IPPROTO_HIP = 0x8b - IPPROTO_HMP = 0x14 - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IDPR = 0x23 - IPPROTO_IDRP = 0x2d - IPPROTO_IGMP = 0x2 - IPPROTO_IGP = 0x55 - IPPROTO_IGRP = 0x58 - IPPROTO_IL = 0x28 - IPPROTO_INLSP = 0x34 - IPPROTO_INP = 0x20 - IPPROTO_IP = 0x0 - IPPROTO_IPCOMP = 0x6c - IPPROTO_IPCV = 0x47 - IPPROTO_IPEIP = 0x5e - IPPROTO_IPIP = 0x4 - IPPROTO_IPPC = 0x43 - IPPROTO_IPV4 = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_IRTP = 0x1c - IPPROTO_KRYPTOLAN = 0x41 - IPPROTO_LARP = 0x5b - IPPROTO_LEAF1 = 0x19 - IPPROTO_LEAF2 = 0x1a - IPPROTO_MAX = 0x100 - IPPROTO_MAXID = 0x34 - IPPROTO_MEAS = 0x13 - IPPROTO_MH = 0x87 - IPPROTO_MHRP = 0x30 - IPPROTO_MICP = 0x5f - IPPROTO_MOBILE = 0x37 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_MUX = 0x12 - IPPROTO_ND = 0x4d - IPPROTO_NHRP = 0x36 - IPPROTO_NONE = 0x3b - IPPROTO_NSP = 0x1f - IPPROTO_NVPII = 0xb - IPPROTO_OLD_DIVERT = 0xfe - IPPROTO_OSPFIGP = 0x59 - IPPROTO_PFSYNC = 0xf0 - IPPROTO_PGM = 0x71 - IPPROTO_PIGP = 0x9 - IPPROTO_PIM = 0x67 - IPPROTO_PRM = 0x15 - IPPROTO_PUP = 0xc - IPPROTO_PVP = 0x4b - IPPROTO_RAW = 0xff - IPPROTO_RCCMON = 0xa - IPPROTO_RDP = 0x1b - IPPROTO_RESERVED_253 = 0xfd - IPPROTO_RESERVED_254 = 0xfe - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_RVD = 0x42 - IPPROTO_SATEXPAK = 0x40 - IPPROTO_SATMON = 0x45 - IPPROTO_SCCSP = 0x60 - IPPROTO_SCTP = 0x84 - IPPROTO_SDRP = 0x2a - IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 - IPPROTO_SHIM6 = 0x8c - IPPROTO_SKIP = 0x39 - IPPROTO_SPACER = 0x7fff - IPPROTO_SRPC = 0x5a - IPPROTO_ST = 0x7 - IPPROTO_SVMTP = 0x52 - IPPROTO_SWIPE = 0x35 - IPPROTO_TCF = 0x57 - IPPROTO_TCP = 0x6 - IPPROTO_TLSP = 0x38 - IPPROTO_TP = 0x1d - IPPROTO_TPXX = 0x27 - IPPROTO_TRUNK1 = 0x17 - IPPROTO_TRUNK2 = 0x18 - IPPROTO_TTP = 0x54 - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPPROTO_VINES = 0x53 - IPPROTO_VISA = 0x46 - IPPROTO_VMTP = 0x51 - IPPROTO_WBEXPAK = 0x4f - IPPROTO_WBMON = 0x4e - IPPROTO_WSN = 0x4a - IPPROTO_XNET = 0xf - IPPROTO_XTP = 0x24 - IPV6_AUTOFLOWLABEL = 0x3b - IPV6_BINDANY = 0x40 - IPV6_BINDV6ONLY = 0x1b - IPV6_CHECKSUM = 0x1a - IPV6_DEFAULT_MULTICAST_HOPS = 0x1 - IPV6_DEFAULT_MULTICAST_LOOP = 0x1 - IPV6_DEFHLIM = 0x40 - IPV6_DONTFRAG = 0x3e - IPV6_DSTOPTS = 0x32 - IPV6_FAITH = 0x1d - IPV6_FLOWINFO_MASK = 0xffffff0f - IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FRAGTTL = 0x78 - IPV6_FW_ADD = 0x1e - IPV6_FW_DEL = 0x1f - IPV6_FW_FLUSH = 0x20 - IPV6_FW_GET = 0x22 - IPV6_FW_ZERO = 0x21 - IPV6_HLIMDEC = 0x1 - IPV6_HOPLIMIT = 0x2f - IPV6_HOPOPTS = 0x31 - IPV6_IPSEC_POLICY = 0x1c - IPV6_JOIN_GROUP = 0xc - IPV6_LEAVE_GROUP = 0xd - IPV6_MAXHLIM = 0xff - IPV6_MAXOPTHDR = 0x800 - IPV6_MAXPACKET = 0xffff - IPV6_MAX_GROUP_SRC_FILTER = 0x200 - IPV6_MAX_MEMBERSHIPS = 0xfff - IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f - IPV6_MMTU = 0x500 - IPV6_MSFILTER = 0x4a - IPV6_MULTICAST_HOPS = 0xa - IPV6_MULTICAST_IF = 0x9 - IPV6_MULTICAST_LOOP = 0xb - IPV6_NEXTHOP = 0x30 - IPV6_PATHMTU = 0x2c - IPV6_PKTINFO = 0x2e - IPV6_PORTRANGE = 0xe - IPV6_PORTRANGE_DEFAULT = 0x0 - IPV6_PORTRANGE_HIGH = 0x1 - IPV6_PORTRANGE_LOW = 0x2 - IPV6_PREFER_TEMPADDR = 0x3f - IPV6_RECVDSTOPTS = 0x28 - IPV6_RECVHOPLIMIT = 0x25 - IPV6_RECVHOPOPTS = 0x27 - IPV6_RECVPATHMTU = 0x2b - IPV6_RECVPKTINFO = 0x24 - IPV6_RECVRTHDR = 0x26 - IPV6_RECVTCLASS = 0x39 - IPV6_RTHDR = 0x33 - IPV6_RTHDRDSTOPTS = 0x23 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_SOCKOPT_RESERVED1 = 0x3 - IPV6_TCLASS = 0x3d - IPV6_UNICAST_HOPS = 0x4 - IPV6_USE_MIN_MTU = 0x2a - IPV6_V6ONLY = 0x1b - IPV6_VERSION = 0x60 - IPV6_VERSION_MASK = 0xf0 - IP_ADD_MEMBERSHIP = 0xc - IP_ADD_SOURCE_MEMBERSHIP = 0x46 - IP_BINDANY = 0x18 - IP_BLOCK_SOURCE = 0x48 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DONTFRAG = 0x43 - IP_DROP_MEMBERSHIP = 0xd - IP_DROP_SOURCE_MEMBERSHIP = 0x47 - IP_DUMMYNET3 = 0x31 - IP_DUMMYNET_CONFIGURE = 0x3c - IP_DUMMYNET_DEL = 0x3d - IP_DUMMYNET_FLUSH = 0x3e - IP_DUMMYNET_GET = 0x40 - IP_FAITH = 0x16 - IP_FW3 = 0x30 - IP_FW_ADD = 0x32 - IP_FW_DEL = 0x33 - IP_FW_FLUSH = 0x34 - IP_FW_GET = 0x36 - IP_FW_NAT_CFG = 0x38 - IP_FW_NAT_DEL = 0x39 - IP_FW_NAT_GET_CONFIG = 0x3a - IP_FW_NAT_GET_LOG = 0x3b - IP_FW_RESETLOG = 0x37 - IP_FW_TABLE_ADD = 0x28 - IP_FW_TABLE_DEL = 0x29 - IP_FW_TABLE_FLUSH = 0x2a - IP_FW_TABLE_GETSIZE = 0x2b - IP_FW_TABLE_LIST = 0x2c - IP_FW_ZERO = 0x35 - IP_HDRINCL = 0x2 - IP_IPSEC_POLICY = 0x15 - IP_MAXPACKET = 0xffff - IP_MAX_GROUP_SRC_FILTER = 0x200 - IP_MAX_MEMBERSHIPS = 0xfff - IP_MAX_SOCK_MUTE_FILTER = 0x80 - IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MF = 0x2000 - IP_MINTTL = 0x42 - IP_MIN_MEMBERSHIPS = 0x1f - IP_MSFILTER = 0x4a - IP_MSS = 0x240 - IP_MULTICAST_IF = 0x9 - IP_MULTICAST_LOOP = 0xb - IP_MULTICAST_TTL = 0xa - IP_MULTICAST_VIF = 0xe - IP_OFFMASK = 0x1fff - IP_ONESBCAST = 0x17 - IP_OPTIONS = 0x1 - IP_PORTRANGE = 0x13 - IP_PORTRANGE_DEFAULT = 0x0 - IP_PORTRANGE_HIGH = 0x1 - IP_PORTRANGE_LOW = 0x2 - IP_RECVDSTADDR = 0x7 - IP_RECVIF = 0x14 - IP_RECVOPTS = 0x5 - IP_RECVRETOPTS = 0x6 - IP_RECVTOS = 0x44 - IP_RECVTTL = 0x41 - IP_RETOPTS = 0x8 - IP_RF = 0x8000 - IP_RSVP_OFF = 0x10 - IP_RSVP_ON = 0xf - IP_RSVP_VIF_OFF = 0x12 - IP_RSVP_VIF_ON = 0x11 - IP_SENDSRCADDR = 0x7 - IP_TOS = 0x3 - IP_TTL = 0x4 - IP_UNBLOCK_SOURCE = 0x49 - ISIG = 0x80 - ISTRIP = 0x20 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_AUTOSYNC = 0x7 - MADV_CORE = 0x9 - MADV_DONTNEED = 0x4 - MADV_FREE = 0x5 - MADV_NOCORE = 0x8 - MADV_NORMAL = 0x0 - MADV_NOSYNC = 0x6 - MADV_PROTECT = 0xa - MADV_RANDOM = 0x1 - MADV_SEQUENTIAL = 0x2 - MADV_WILLNEED = 0x3 - MAP_ALIGNED_SUPER = 0x1000000 - MAP_ALIGNMENT_MASK = -0x1000000 - MAP_ALIGNMENT_SHIFT = 0x18 - MAP_ANON = 0x1000 - MAP_ANONYMOUS = 0x1000 - MAP_COPY = 0x2 - MAP_EXCL = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_HASSEMAPHORE = 0x200 - MAP_NOCORE = 0x20000 - MAP_NORESERVE = 0x40 - MAP_NOSYNC = 0x800 - MAP_PREFAULT_READ = 0x40000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x20 - MAP_RESERVED0080 = 0x80 - MAP_RESERVED0100 = 0x100 - MAP_SHARED = 0x1 - MAP_STACK = 0x400 - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MSG_CMSG_CLOEXEC = 0x40000 - MSG_COMPAT = 0x8000 - MSG_CTRUNC = 0x20 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x80 - MSG_EOF = 0x100 - MSG_EOR = 0x8 - MSG_NBIO = 0x4000 - MSG_NOSIGNAL = 0x20000 - MSG_NOTIFICATION = 0x2000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_TRUNC = 0x10 - MSG_WAITALL = 0x40 - MS_ASYNC = 0x1 - MS_INVALIDATE = 0x2 - MS_SYNC = 0x0 - NAME_MAX = 0xff - NET_RT_DUMP = 0x1 - NET_RT_FLAGS = 0x2 - NET_RT_IFLIST = 0x3 - NET_RT_IFLISTL = 0x5 - NET_RT_IFMALIST = 0x4 - NET_RT_MAXID = 0x6 - NOFLSH = 0x80000000 - NOTE_ATTRIB = 0x8 - NOTE_CHILD = 0x4 - NOTE_DELETE = 0x1 - NOTE_EXEC = 0x20000000 - NOTE_EXIT = 0x80000000 - NOTE_EXTEND = 0x4 - NOTE_FFAND = 0x40000000 - NOTE_FFCOPY = 0xc0000000 - NOTE_FFCTRLMASK = 0xc0000000 - NOTE_FFLAGSMASK = 0xffffff - NOTE_FFNOP = 0x0 - NOTE_FFOR = 0x80000000 - NOTE_FORK = 0x40000000 - NOTE_LINK = 0x10 - NOTE_LOWAT = 0x1 - NOTE_PCTRLMASK = 0xf0000000 - NOTE_PDATAMASK = 0xfffff - NOTE_RENAME = 0x20 - NOTE_REVOKE = 0x40 - NOTE_TRACK = 0x1 - NOTE_TRACKERR = 0x2 - NOTE_TRIGGER = 0x1000000 - NOTE_WRITE = 0x2 - OCRNL = 0x10 - ONLCR = 0x2 - ONLRET = 0x40 - ONOCR = 0x20 - ONOEOT = 0x8 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x40 - O_CLOEXEC = 0x100000 - O_CREAT = 0x200 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x20000 - O_EXCL = 0x800 - O_EXEC = 0x40000 - O_EXLOCK = 0x20 - O_FSYNC = 0x80 - O_NDELAY = 0x4 - O_NOCTTY = 0x8000 - O_NOFOLLOW = 0x100 - O_NONBLOCK = 0x4 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_SHLOCK = 0x10 - O_SYNC = 0x80 - O_TRUNC = 0x400 - O_TTY_INIT = 0x80000 - O_WRONLY = 0x1 - PARENB = 0x1000 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - RLIMIT_AS = 0xa - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x8 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0x7fffffffffffffff - RTAX_AUTHOR = 0x6 - RTAX_BRD = 0x7 - RTAX_DST = 0x0 - RTAX_GATEWAY = 0x1 - RTAX_GENMASK = 0x3 - RTAX_IFA = 0x5 - RTAX_IFP = 0x4 - RTAX_MAX = 0x8 - RTAX_NETMASK = 0x2 - RTA_AUTHOR = 0x40 - RTA_BRD = 0x80 - RTA_DST = 0x1 - RTA_GATEWAY = 0x2 - RTA_GENMASK = 0x8 - RTA_IFA = 0x20 - RTA_IFP = 0x10 - RTA_NETMASK = 0x4 - RTF_BLACKHOLE = 0x1000 - RTF_BROADCAST = 0x400000 - RTF_DONE = 0x40 - RTF_DYNAMIC = 0x10 - RTF_FMASK = 0x1004d808 - RTF_GATEWAY = 0x2 - RTF_GWFLAG_COMPAT = 0x80000000 - RTF_HOST = 0x4 - RTF_LLDATA = 0x400 - RTF_LLINFO = 0x400 - RTF_LOCAL = 0x200000 - RTF_MODIFIED = 0x20 - RTF_MULTICAST = 0x800000 - RTF_PINNED = 0x100000 - RTF_PRCLONING = 0x10000 - RTF_PROTO1 = 0x8000 - RTF_PROTO2 = 0x4000 - RTF_PROTO3 = 0x40000 - RTF_REJECT = 0x8 - RTF_RNH_LOCKED = 0x40000000 - RTF_STATIC = 0x800 - RTF_STICKY = 0x10000000 - RTF_UP = 0x1 - RTF_XRESOLVE = 0x200 - RTM_ADD = 0x1 - RTM_CHANGE = 0x3 - RTM_DELADDR = 0xd - RTM_DELETE = 0x2 - RTM_DELMADDR = 0x10 - RTM_GET = 0x4 - RTM_IEEE80211 = 0x12 - RTM_IFANNOUNCE = 0x11 - RTM_IFINFO = 0xe - RTM_LOCK = 0x8 - RTM_LOSING = 0x5 - RTM_MISS = 0x7 - RTM_NEWADDR = 0xc - RTM_NEWMADDR = 0xf - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RTM_REDIRECT = 0x6 - RTM_RESOLVE = 0xb - RTM_RTTUNIT = 0xf4240 - RTM_VERSION = 0x5 - RTV_EXPIRE = 0x4 - RTV_HOPCOUNT = 0x2 - RTV_MTU = 0x1 - RTV_RPIPE = 0x8 - RTV_RTT = 0x40 - RTV_RTTVAR = 0x80 - RTV_SPIPE = 0x10 - RTV_SSTHRESH = 0x20 - RTV_WEIGHT = 0x100 - RT_ALL_FIBS = -0x1 - RT_CACHING_CONTEXT = 0x1 - RT_DEFAULT_FIB = 0x0 - RT_NORTREF = 0x2 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_BINTIME = 0x4 - SCM_CREDS = 0x3 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x2 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDMULTI = 0x80206931 - SIOCADDRT = 0x8030720a - SIOCAIFADDR = 0x8040691a - SIOCAIFGROUP = 0x80246987 - SIOCALIFADDR = 0x8118691b - SIOCATMARK = 0x40047307 - SIOCDELMULTI = 0x80206932 - SIOCDELRT = 0x8030720b - SIOCDIFADDR = 0x80206919 - SIOCDIFGROUP = 0x80246989 - SIOCDIFPHYADDR = 0x80206949 - SIOCDLIFADDR = 0x8118691d - SIOCGDRVSPEC = 0xc01c697b - SIOCGETSGCNT = 0xc0147210 - SIOCGETVIFCNT = 0xc014720f - SIOCGHIWAT = 0x40047301 - SIOCGIFADDR = 0xc0206921 - SIOCGIFBRDADDR = 0xc0206923 - SIOCGIFCAP = 0xc020691f - SIOCGIFCONF = 0xc0086924 - SIOCGIFDESCR = 0xc020692a - SIOCGIFDSTADDR = 0xc0206922 - SIOCGIFFIB = 0xc020695c - SIOCGIFFLAGS = 0xc0206911 - SIOCGIFGENERIC = 0xc020693a - SIOCGIFGMEMB = 0xc024698a - SIOCGIFGROUP = 0xc0246988 - SIOCGIFINDEX = 0xc0206920 - SIOCGIFMAC = 0xc0206926 - SIOCGIFMEDIA = 0xc0286938 - SIOCGIFMETRIC = 0xc0206917 - SIOCGIFMTU = 0xc0206933 - SIOCGIFNETMASK = 0xc0206925 - SIOCGIFPDSTADDR = 0xc0206948 - SIOCGIFPHYS = 0xc0206935 - SIOCGIFPSRCADDR = 0xc0206947 - SIOCGIFSTATUS = 0xc331693b - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCGLOWAT = 0x40047303 - SIOCGPGRP = 0x40047309 - SIOCGPRIVATE_0 = 0xc0206950 - SIOCGPRIVATE_1 = 0xc0206951 - SIOCIFCREATE = 0xc020697a - SIOCIFCREATE2 = 0xc020697c - SIOCIFDESTROY = 0x80206979 - SIOCIFGCLONERS = 0xc00c6978 - SIOCSDRVSPEC = 0x801c697b - SIOCSHIWAT = 0x80047300 - SIOCSIFADDR = 0x8020690c - SIOCSIFBRDADDR = 0x80206913 - SIOCSIFCAP = 0x8020691e - SIOCSIFDESCR = 0x80206929 - SIOCSIFDSTADDR = 0x8020690e - SIOCSIFFIB = 0x8020695d - SIOCSIFFLAGS = 0x80206910 - SIOCSIFGENERIC = 0x80206939 - SIOCSIFLLADDR = 0x8020693c - SIOCSIFMAC = 0x80206927 - SIOCSIFMEDIA = 0xc0206937 - SIOCSIFMETRIC = 0x80206918 - SIOCSIFMTU = 0x80206934 - SIOCSIFNAME = 0x80206928 - SIOCSIFNETMASK = 0x80206916 - SIOCSIFPHYADDR = 0x80406946 - SIOCSIFPHYS = 0x80206936 - SIOCSIFRVNET = 0xc020695b - SIOCSIFVNET = 0xc020695a - SIOCSLIFPHYADDR = 0x8118694a - SIOCSLOWAT = 0x80047302 - SIOCSPGRP = 0x80047308 - SOCK_CLOEXEC = 0x10000000 - SOCK_DGRAM = 0x2 - SOCK_MAXADDRLEN = 0xff - SOCK_NONBLOCK = 0x20000000 - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_SOCKET = 0xffff - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x2 - SO_ACCEPTFILTER = 0x1000 - SO_BINTIME = 0x2000 - SO_BROADCAST = 0x20 - SO_DEBUG = 0x1 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_KEEPALIVE = 0x8 - SO_LABEL = 0x1009 - SO_LINGER = 0x80 - SO_LISTENINCQLEN = 0x1013 - SO_LISTENQLEN = 0x1012 - SO_LISTENQLIMIT = 0x1011 - SO_NOSIGPIPE = 0x800 - SO_NO_DDP = 0x8000 - SO_NO_OFFLOAD = 0x4000 - SO_OOBINLINE = 0x100 - SO_PEERLABEL = 0x1010 - SO_PROTOCOL = 0x1016 - SO_PROTOTYPE = 0x1016 - SO_RCVBUF = 0x1002 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_SETFIB = 0x1014 - SO_SNDBUF = 0x1001 - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_TIMESTAMP = 0x400 - SO_TYPE = 0x1008 - SO_USELOOPBACK = 0x40 - SO_USER_COOKIE = 0x1015 - SO_VENDOR = 0x80000000 - TCIFLUSH = 0x1 - TCIOFLUSH = 0x3 - TCOFLUSH = 0x2 - TCP_CA_NAME_MAX = 0x10 - TCP_CONGESTION = 0x40 - TCP_INFO = 0x20 - TCP_KEEPCNT = 0x400 - TCP_KEEPIDLE = 0x100 - TCP_KEEPINIT = 0x80 - TCP_KEEPINTVL = 0x200 - TCP_MAXBURST = 0x4 - TCP_MAXHLEN = 0x3c - TCP_MAXOLEN = 0x28 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_SACK = 0x4 - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0x10 - TCP_MINMSS = 0xd8 - TCP_MSS = 0x218 - TCP_NODELAY = 0x1 - TCP_NOOPT = 0x8 - TCP_NOPUSH = 0x4 - TCP_VENDOR = 0x80000000 - TCSAFLUSH = 0x2 - TIOCCBRK = 0x2000747a - TIOCCDTR = 0x20007478 - TIOCCONS = 0x80047462 - TIOCDRAIN = 0x2000745e - TIOCEXCL = 0x2000740d - TIOCEXT = 0x80047460 - TIOCFLUSH = 0x80047410 - TIOCGDRAINWAIT = 0x40047456 - TIOCGETA = 0x402c7413 - TIOCGETD = 0x4004741a - TIOCGPGRP = 0x40047477 - TIOCGPTN = 0x4004740f - TIOCGSID = 0x40047463 - TIOCGWINSZ = 0x40087468 - TIOCMBIC = 0x8004746b - TIOCMBIS = 0x8004746c - TIOCMGDTRWAIT = 0x4004745a - TIOCMGET = 0x4004746a - TIOCMSDTRWAIT = 0x8004745b - TIOCMSET = 0x8004746d - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DCD = 0x40 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x20007471 - TIOCNXCL = 0x2000740e - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x80047470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCPTMASTER = 0x2000741c - TIOCSBRK = 0x2000747b - TIOCSCTTY = 0x20007461 - TIOCSDRAINWAIT = 0x80047457 - TIOCSDTR = 0x20007479 - TIOCSETA = 0x802c7414 - TIOCSETAF = 0x802c7416 - TIOCSETAW = 0x802c7415 - TIOCSETD = 0x8004741b - TIOCSIG = 0x2004745f - TIOCSPGRP = 0x80047476 - TIOCSTART = 0x2000746e - TIOCSTAT = 0x20007465 - TIOCSTI = 0x80017472 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCTIMESTAMP = 0x40087459 - TIOCUCNTL = 0x80047466 - TOSTOP = 0x400000 - VDISCARD = 0xf - VDSUSP = 0xb - VEOF = 0x0 - VEOL = 0x1 - VEOL2 = 0x2 - VERASE = 0x3 - VERASE2 = 0x7 - VINTR = 0x8 - VKILL = 0x5 - VLNEXT = 0xe - VMIN = 0x10 - VQUIT = 0x9 - VREPRINT = 0x6 - VSTART = 0xc - VSTATUS = 0x12 - VSTOP = 0xd - VSUSP = 0xa - VTIME = 0x11 - VWERASE = 0x4 - WCONTINUED = 0x4 - WCOREFLAG = 0x80 - WEXITED = 0x10 - WLINUXCLONE = 0x80000000 - WNOHANG = 0x1 - WNOWAIT = 0x8 - WSTOPPED = 0x2 - WTRAPPED = 0x20 - WUNTRACED = 0x2 + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 4cbae253ec..8947248f68 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -1,1506 +1,1901 @@ -// mkerrors.sh -m32 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -m32 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x28 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - EPOLL_NONBLOCK = 0x800 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xc - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0xd - F_SETLK64 = 0xd - F_SETLKW = 0xe - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_NODAD = 0x2 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x7 - IFF_802_1Q_VLAN = 0x1 - IFF_ALLMULTI = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BONDING = 0x20 - IFF_BRIDGE_PORT = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DISABLE_NETPOLL = 0x1000 - IFF_DONT_BRIDGE = 0x800 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_EBRIDGE = 0x2 - IFF_ECHO = 0x40000 - IFF_ISATAP = 0x80 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MACVLAN_PORT = 0x2000 - IFF_MASTER = 0x400 - IFF_MASTER_8023AD = 0x8 - IFF_MASTER_ALB = 0x10 - IFF_MASTER_ARPMON = 0x100 - IFF_MULTICAST = 0x1000 - IFF_NOARP = 0x80 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_OVS_DATAPATH = 0x8000 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_SLAVE_INACTIVE = 0x4 - IFF_SLAVE_NEEDARP = 0x40 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_TX_SKB_SHARING = 0x10000 - IFF_UNICAST_FLT = 0x20000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFF_WAN_HDLC = 0x200 - IFF_XMIT_DST_RELEASE = 0x400 - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DOFORK = 0xb - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_32BIT = 0x40 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x8000 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETFPXREGS = 0x12 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_MASK = 0xff - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SEIZE_DEVEL = 0x80000000 - PTRACE_SETFPREGS = 0xf - PTRACE_SETFPXREGS = 0x13 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SINGLEBLOCK = 0x21 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSEMU = 0x1f - PTRACE_SYSEMU_SINGLESTEP = 0x20 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xe - RTAX_MTU = 0x2 - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x10 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x4f - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x10 - RTM_NR_MSGTYPES = 0x40 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_MARK = 0x24 - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEERCRED = 0x11 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_REUSEADDR = 0x2 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_NODELAY = 0x1 - TCP_QUICKACK = 0xc - TCP_SYNCNT = 0x7 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x100 - TUNATTACHFILTER = 0x400854d5 - TUNDETACHFILTER = 0x400854d6 - TUNGETFEATURES = 0x800454cf - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETHDRSZ = 0x800454d7 - TUNSETDEBUG = 0x400454c9 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETSNDBUF = 0x400454d4 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETHDRSZ = 0x400454d8 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x6 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors @@ -1670,7 +2065,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) @@ -1795,7 +2189,7 @@ var errors = [...]string{ 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", - 116: "stale NFS file handle", + 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", @@ -1812,7 +2206,7 @@ var errors = [...]string{ 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", - 133: "unknown error 133", + 133: "memory page has hardware error", } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index abcb07a875..4083cb2a86 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -1,1507 +1,1902 @@ -// mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -m64 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x28 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - EPOLL_NONBLOCK = 0x800 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_NODAD = 0x2 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x7 - IFF_802_1Q_VLAN = 0x1 - IFF_ALLMULTI = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BONDING = 0x20 - IFF_BRIDGE_PORT = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DISABLE_NETPOLL = 0x1000 - IFF_DONT_BRIDGE = 0x800 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_EBRIDGE = 0x2 - IFF_ECHO = 0x40000 - IFF_ISATAP = 0x80 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MACVLAN_PORT = 0x2000 - IFF_MASTER = 0x400 - IFF_MASTER_8023AD = 0x8 - IFF_MASTER_ALB = 0x10 - IFF_MASTER_ARPMON = 0x100 - IFF_MULTICAST = 0x1000 - IFF_NOARP = 0x80 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_OVS_DATAPATH = 0x8000 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_SLAVE_INACTIVE = 0x4 - IFF_SLAVE_NEEDARP = 0x40 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_TX_SKB_SHARING = 0x10000 - IFF_UNICAST_FLT = 0x20000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFF_WAN_HDLC = 0x200 - IFF_XMIT_DST_RELEASE = 0x400 - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DOFORK = 0xb - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_32BIT = 0x40 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ARCH_PRCTL = 0x1e - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETFPXREGS = 0x12 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_MASK = 0xff - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SEIZE_DEVEL = 0x80000000 - PTRACE_SETFPREGS = 0xf - PTRACE_SETFPXREGS = 0x13 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SINGLEBLOCK = 0x21 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSEMU = 0x1f - PTRACE_SYSEMU_SINGLESTEP = 0x20 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xe - RTAX_MTU = 0x2 - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x10 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x4f - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x10 - RTM_NR_MSGTYPES = 0x40 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_MARK = 0x24 - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEERCRED = 0x11 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_REUSEADDR = 0x2 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_NODELAY = 0x1 - TCP_QUICKACK = 0xc - TCP_SYNCNT = 0x7 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x100 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETFEATURES = 0x800454cf - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETHDRSZ = 0x800454d7 - TUNSETDEBUG = 0x400454c9 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETSNDBUF = 0x400454d4 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETHDRSZ = 0x400454d8 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x6 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors @@ -1671,7 +2066,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) @@ -1796,7 +2190,7 @@ var errors = [...]string{ 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", - 116: "stale NFS file handle", + 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", @@ -1813,7 +2207,7 @@ var errors = [...]string{ 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", - 133: "unknown error 133", + 133: "memory page has hardware error", } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 8d6b101818..27d38352bd 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -1,1430 +1,1906 @@ -// mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x27 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_PHY = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ELF_NGREG = 0x12 - ELF_PRARGSZ = 0x50 - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - EPOLLERR = 0x8 - EPOLLET = -0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - EPOLL_NONBLOCK = 0x800 - ETH_P_1588 = 0x88f7 - ETH_P_8021Q = 0x8100 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_AARP = 0x80f3 - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xc - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0xd - F_SETLK64 = 0xd - F_SETLKW = 0xe - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_NODAD = 0x2 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x7 - IFF_ALLMULTI = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DYNAMIC = 0x8000 - IFF_LOOPBACK = 0x8 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_NOARP = 0x80 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DOFORK = 0xb - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x1000 - O_LARGEFILE = 0x20000 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x1000 - O_SYNC = 0x1000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_BROADCAST = 0x1 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FASTROUTE = 0x6 - PACKET_HOST = 0x0 - PACKET_LOOPBACK = 0x5 - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MULTICAST = 0x2 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PARENB = 0x100 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CLEAR_SECCOMP_FILTER = 0x25 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECCOMP_FILTER = 0x23 - PR_GET_SECUREBITS = 0x1b - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SECCOMP_FILTER_EVENT = 0x1 - PR_SECCOMP_FILTER_SYSCALL = 0x0 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_NAME = 0xf - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_SECCOMP = 0x16 - PR_SET_SECCOMP_FILTER = 0x24 - PR_SET_SECUREBITS = 0x1c - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETCRUNCHREGS = 0x19 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETHBPREGS = 0x1d - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETVFPREGS = 0x1b - PTRACE_GETWMMXREGS = 0x12 - PTRACE_GET_THREAD_AREA = 0x16 - PTRACE_KILL = 0x8 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_MASK = 0x7f - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SETCRUNCHREGS = 0x1a - PTRACE_SETFPREGS = 0xf - PTRACE_SETHBPREGS = 0x1e - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETVFPREGS = 0x1c - PTRACE_SETWMMXREGS = 0x13 - PTRACE_SET_SYSCALL = 0x17 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - PT_DATA_ADDR = 0x10004 - PT_TEXT_ADDR = 0x10000 - PT_TEXT_END_ADDR = 0x10008 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xe - RTAX_MTU = 0x2 - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x10 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x4f - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x10 - RTM_NR_MSGTYPES = 0x40 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_MARK = 0x24 - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEERCRED = 0x11 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_REUSEADDR = 0x2 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_NODELAY = 0x1 - TCP_QUICKACK = 0xc - TCP_SYNCNT = 0x7 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x100 - TUNATTACHFILTER = 0x400854d5 - TUNDETACHFILTER = 0x400854d6 - TUNGETFEATURES = 0x800454cf - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETHDRSZ = 0x800454d7 - TUNSETDEBUG = 0x400454c9 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETSNDBUF = 0x400454d4 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETHDRSZ = 0x400454d8 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x6 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors @@ -1594,7 +2070,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) @@ -1719,7 +2194,7 @@ var errors = [...]string{ 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", - 116: "stale NFS file handle", + 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", @@ -1736,7 +2211,7 @@ var errors = [...]string{ 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", - 133: "unknown error 133", + 133: "memory page has hardware error", } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 750fffc66f..69ad31470d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -1,1584 +1,1892 @@ -// mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ELF_NGREG = 0x22 - ELF_PRARGSZ = 0x50 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_NODAD = 0x2 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x7 - IFF_802_1Q_VLAN = 0x1 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BONDING = 0x20 - IFF_BRIDGE_PORT = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DISABLE_NETPOLL = 0x1000 - IFF_DONT_BRIDGE = 0x800 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_EBRIDGE = 0x2 - IFF_ECHO = 0x40000 - IFF_ISATAP = 0x80 - IFF_LIVE_ADDR_CHANGE = 0x100000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MACVLAN = 0x200000 - IFF_MACVLAN_PORT = 0x2000 - IFF_MASTER = 0x400 - IFF_MASTER_8023AD = 0x8 - IFF_MASTER_ALB = 0x10 - IFF_MASTER_ARPMON = 0x100 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_OVS_DATAPATH = 0x8000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_SLAVE_INACTIVE = 0x4 - IFF_SLAVE_NEEDARP = 0x40 - IFF_SUPP_NOFCS = 0x80000 - IFF_TAP = 0x2 - IFF_TEAM_PORT = 0x40000 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_TX_SKB_SHARING = 0x10000 - IFF_UNICAST_FLT = 0x20000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFF_WAN_HDLC = 0x200 - IFF_XMIT_DST_RELEASE = 0x400 - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x1000ff - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xf - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x11 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x57 - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x12 - RTM_NR_MSGTYPES = 0x48 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x100 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x801054db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETHDRSZ = 0x800454d7 - TUNSETDEBUG = 0x400454c9 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETHDRSZ = 0x400454d8 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x6 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ESR_MAGIC = 0x45535201 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + EXTRA_MAGIC = 0x45585401 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors @@ -1748,7 +2056,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index ca0f1dcc38..d131a4cc51 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -1,1478 +1,1906 @@ -// mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mips,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x27 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MCNET = 0x5 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = -0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - EPOLL_NONBLOCK = 0x80 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x2000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x21 - F_GETLK64 = 0x21 - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x22 - F_SETLK64 = 0x22 - F_SETLKW = 0x23 - F_SETLKW64 = 0x23 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_NODAD = 0x2 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x7 - IFF_802_1Q_VLAN = 0x1 - IFF_ALLMULTI = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BONDING = 0x20 - IFF_BRIDGE_PORT = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DISABLE_NETPOLL = 0x1000 - IFF_DONT_BRIDGE = 0x800 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_EBRIDGE = 0x2 - IFF_ECHO = 0x40000 - IFF_ISATAP = 0x80 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MACVLAN_PORT = 0x2000 - IFF_MASTER = 0x400 - IFF_MASTER_8023AD = 0x8 - IFF_MASTER_ALB = 0x10 - IFF_MASTER_ARPMON = 0x100 - IFF_MULTICAST = 0x1000 - IFF_NOARP = 0x80 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_OVS_DATAPATH = 0x8000 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_SLAVE_INACTIVE = 0x4 - IFF_SLAVE_NEEDARP = 0x40 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_TX_SKB_SHARING = 0x10000 - IFF_UNICAST_FLT = 0x20000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFF_WAN_HDLC = 0x200 - IFF_XMIT_DST_RELEASE = 0x400 - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DOFORK = 0xb - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x1000 - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x2000 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_NAME = 0xf - PR_SET_PDEATHSIG = 0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_STOP = 0x7 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_MASK = 0x7f - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SEIZE_DEVEL = 0x80000000 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x5 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0x7fffffffffffffff - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xe - RTAX_MTU = 0x2 - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x10 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x4f - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x10 - RTM_NR_MSGTYPES = 0x40 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x40047309 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_CAN_BASE = 0x64 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_MARK = 0x24 - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEERCRED = 0x12 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x1008 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x5407 - TCGETA = 0x5401 - TCGETS = 0x540d - TCGETS2 = 0x4030542a - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_NODELAY = 0x1 - TCP_QUICKACK = 0xc - TCP_SYNCNT = 0x7 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCSBRKP = 0x5486 - TCSETA = 0x5402 - TCSETAF = 0x5404 - TCSETAW = 0x5403 - TCSETS = 0x540e - TCSETS2 = 0x8030542b - TCSETSF = 0x5410 - TCSETSF2 = 0x8030542d - TCSETSW = 0x540f - TCSETSW2 = 0x8030542c - TCXONC = 0x5406 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGICOUNT = 0x5492 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPTN = 0x40045430 - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x8000 - TUNATTACHFILTER = 0x800854d5 - TUNDETACHFILTER = 0x800854d6 - TUNGETFEATURES = 0x400454cf - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETHDRSZ = 0x400454d7 - TUNSETDEBUG = 0x800454c9 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETSNDBUF = 0x800454d4 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETHDRSZ = 0x800454d8 - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x4 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors @@ -1776,7 +2204,7 @@ var errors = [...]string{ 148: "no route to host", 149: "operation already in progress", 150: "operation now in progress", - 151: "stale NFS file handle", + 151: "stale file handle", 158: "operation canceled", 159: "no medium found", 160: "wrong medium type", @@ -1787,7 +2215,7 @@ var errors = [...]string{ 165: "owner died", 166: "state not recoverable", 167: "operation not possible due to RF-kill", - 168: "unknown error 168", + 168: "memory page has hardware error", 1133: "disk quota exceeded", } diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 37447078f0..62dd20352b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -1,1581 +1,1906 @@ -// mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - CFLUSH = 0xf - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CREAD = 0x80 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FLUSHO = 0x2000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xe - F_GETLK64 = 0xe - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x8 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x0 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x5 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x10 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x16 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x5b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x13 - RTM_NR_MSGTYPES = 0x4c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x11 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x40047309 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x1008 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TCFLSH = 0x5407 - TCIFLUSH = 0x0 - TCIOFLUSH = 0x2 - TCOFLUSH = 0x1 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCXONC = 0x5406 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x8000 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETDEBUG = 0x800454c9 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x4 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index acb961b9f1..dc8e56e30c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -1,1581 +1,1906 @@ -// mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64le,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - CFLUSH = 0xf - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CREAD = 0x80 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FLUSHO = 0x2000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xe - F_GETLK64 = 0xe - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x8 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x0 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x5 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x10 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x16 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x5b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x13 - RTM_NR_MSGTYPES = 0x4c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x11 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x40047309 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x1008 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TCFLSH = 0x5407 - TCIFLUSH = 0x0 - TCIOFLUSH = 0x2 - TCOFLUSH = 0x1 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCXONC = 0x5406 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x8000 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETDEBUG = 0x800454c9 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x4 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 06e009db4c..906766254c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -1,1684 +1,1906 @@ -// mkerrors.sh -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mipsle,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2a - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x2000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x21 - F_GETLK64 = 0x21 - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x22 - F_SETLK64 = 0x22 - F_SETLKW = 0x23 - F_SETLKW64 = 0x23 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x8 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x2000 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x5 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x10 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x18 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x5f - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x14 - RTM_NR_MSGTYPES = 0x50 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x11 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x40047309 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x1008 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x5407 - TCGETA = 0x5401 - TCGETS = 0x540d - TCGETS2 = 0x4030542a - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CC_INFO = 0x1a - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCSBRKP = 0x5486 - TCSETA = 0x5402 - TCSETAF = 0x5404 - TCSETAW = 0x5403 - TCSETS = 0x540e - TCSETS2 = 0x8030542b - TCSETSF = 0x5410 - TCSETSF2 = 0x8030542d - TCSETSW = 0x540f - TCSETSW2 = 0x8030542c - TCXONC = 0x5406 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x8000 - TUNATTACHFILTER = 0x800854d5 - TUNDETACHFILTER = 0x800854d6 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x400854db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETDEBUG = 0x800454c9 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x4 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 8f9cbdbc75..f6ca82c715 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -1,1656 +1,1963 @@ -// mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -m64 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x17 - B110 = 0x3 - B115200 = 0x11 - B1152000 = 0x18 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x19 - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x1a - B230400 = 0x12 - B2400 = 0xb - B2500000 = 0x1b - B300 = 0x7 - B3000000 = 0x1c - B3500000 = 0x1d - B38400 = 0xf - B4000000 = 0x1e - B460800 = 0x13 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x14 - B57600 = 0x10 - B576000 = 0x15 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x16 - B9600 = 0xd - BOTHER = 0x1f - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x8000 - BSDLY = 0x8000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0xff - CBAUDEX = 0x0 - CFLUSH = 0xf - CIBAUD = 0xff0000 - CLOCAL = 0x8000 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x1000 - CR2 = 0x2000 - CR3 = 0x3000 - CRDLY = 0x3000 - CREAD = 0x800 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIGNAL = 0xff - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x4000 - FFDLY = 0x4000 - FLUSHO = 0x800000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0xd - F_SETLKW = 0x7 - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x4000 - IBSHIFT = 0x10 - ICANON = 0x100 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x400 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x8 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x80 - ISTRIP = 0x20 - IUCLC = 0x1000 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x80 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x40 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x2000 - MCL_FUTURE = 0x4000 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NL2 = 0x200 - NL3 = 0x300 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x300 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80000000 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x4 - ONLCR = 0x2 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x20000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x1000 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_SAO = 0x10 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETEVRREGS = 0x14 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGS64 = 0x16 - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GETVRREGS = 0x12 - PTRACE_GETVSRREGS = 0x1b - PTRACE_GET_DEBUGREG = 0x19 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x1000ff - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SETEVRREGS = 0x15 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGS64 = 0x17 - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SETVRREGS = 0x13 - PTRACE_SETVSRREGS = 0x1c - PTRACE_SET_DEBUGREG = 0x1a - PTRACE_SINGLEBLOCK = 0x100 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - PT_CCR = 0x26 - PT_CTR = 0x23 - PT_DAR = 0x29 - PT_DSCR = 0x2c - PT_DSISR = 0x2a - PT_FPR0 = 0x30 - PT_FPSCR = 0x50 - PT_LNK = 0x24 - PT_MSR = 0x21 - PT_NIP = 0x20 - PT_ORIG_R3 = 0x22 - PT_R0 = 0x0 - PT_R1 = 0x1 - PT_R10 = 0xa - PT_R11 = 0xb - PT_R12 = 0xc - PT_R13 = 0xd - PT_R14 = 0xe - PT_R15 = 0xf - PT_R16 = 0x10 - PT_R17 = 0x11 - PT_R18 = 0x12 - PT_R19 = 0x13 - PT_R2 = 0x2 - PT_R20 = 0x14 - PT_R21 = 0x15 - PT_R22 = 0x16 - PT_R23 = 0x17 - PT_R24 = 0x18 - PT_R25 = 0x19 - PT_R26 = 0x1a - PT_R27 = 0x1b - PT_R28 = 0x1c - PT_R29 = 0x1d - PT_R3 = 0x3 - PT_R30 = 0x1e - PT_R31 = 0x1f - PT_R4 = 0x4 - PT_R5 = 0x5 - PT_R6 = 0x6 - PT_R7 = 0x7 - PT_R8 = 0x8 - PT_R9 = 0x9 - PT_REGS_COUNT = 0x2c - PT_RESULT = 0x2b - PT_SOFTE = 0x27 - PT_TRAP = 0x28 - PT_VR0 = 0x52 - PT_VRSAVE = 0x94 - PT_VSCR = 0x93 - PT_VSR0 = 0x96 - PT_VSR31 = 0xd4 - PT_XER = 0x25 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xf - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x11 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x57 - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x12 - RTM_NR_MSGTYPES = 0x48 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x14 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x15 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x10 - SO_RCVTIMEO = 0x12 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x11 - SO_SNDTIMEO = 0x13 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x400 - TAB2 = 0x800 - TAB3 = 0xc00 - TABDLY = 0xc00 - TCFLSH = 0x2000741f - TCGETA = 0x40147417 - TCGETS = 0x402c7413 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x2000741d - TCSBRKP = 0x5425 - TCSETA = 0x80147418 - TCSETAF = 0x8014741c - TCSETAW = 0x80147419 - TCSETS = 0x802c7414 - TCSETSF = 0x802c7416 - TCSETSW = 0x802c7415 - TCXONC = 0x2000741e - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x40045432 - TIOCGETC = 0x40067412 - TIOCGETD = 0x5424 - TIOCGETP = 0x40067408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGLTC = 0x40067474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x4004667f - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_LOOP = 0x8000 - TIOCM_OUT1 = 0x2000 - TIOCM_OUT2 = 0x4000 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETC = 0x80067411 - TIOCSETD = 0x5423 - TIOCSETN = 0x8006740a - TIOCSETP = 0x80067409 - TIOCSIG = 0x80045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSLTC = 0x80067475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTART = 0x2000746e - TIOCSTI = 0x5412 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x400000 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETHDRSZ = 0x400454d7 - TUNSETDEBUG = 0x800454c9 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETHDRSZ = 0x800454d8 - VDISCARD = 0x10 - VEOF = 0x4 - VEOL = 0x6 - VEOL2 = 0x8 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x5 - VQUIT = 0x1 - VREPRINT = 0xb - VSTART = 0xd - VSTOP = 0xe - VSUSP = 0xc - VSWTC = 0x9 - VT0 = 0x0 - VT1 = 0x10000 - VTDLY = 0x10000 - VTIME = 0x7 - VWERASE = 0xa - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4000 - XTABS = 0xc00 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 ) // Errors @@ -1820,7 +2127,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 54e8627cb7..ddd256254f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -1,1655 +1,1963 @@ -// mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64le,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -m64 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x17 - B110 = 0x3 - B115200 = 0x11 - B1152000 = 0x18 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x19 - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x1a - B230400 = 0x12 - B2400 = 0xb - B2500000 = 0x1b - B300 = 0x7 - B3000000 = 0x1c - B3500000 = 0x1d - B38400 = 0xf - B4000000 = 0x1e - B460800 = 0x13 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x14 - B57600 = 0x10 - B576000 = 0x15 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x16 - B9600 = 0xd - BOTHER = 0x1f - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x8000 - BSDLY = 0x8000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0xff - CBAUDEX = 0x0 - CFLUSH = 0xf - CIBAUD = 0xff0000 - CLOCAL = 0x8000 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x1000 - CR2 = 0x2000 - CR3 = 0x3000 - CRDLY = 0x3000 - CREAD = 0x800 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIGNAL = 0xff - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x4000 - FFDLY = 0x4000 - FLUSHO = 0x800000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0xd - F_SETLKW = 0x7 - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x4000 - IBSHIFT = 0x10 - ICANON = 0x100 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x400 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_NODAD = 0x2 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x7 - IFF_802_1Q_VLAN = 0x1 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BONDING = 0x20 - IFF_BRIDGE_PORT = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DISABLE_NETPOLL = 0x1000 - IFF_DONT_BRIDGE = 0x800 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_EBRIDGE = 0x2 - IFF_ECHO = 0x40000 - IFF_ISATAP = 0x80 - IFF_LIVE_ADDR_CHANGE = 0x100000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MACVLAN = 0x200000 - IFF_MACVLAN_PORT = 0x2000 - IFF_MASTER = 0x400 - IFF_MASTER_8023AD = 0x8 - IFF_MASTER_ALB = 0x10 - IFF_MASTER_ARPMON = 0x100 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_OVS_DATAPATH = 0x8000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_SLAVE_INACTIVE = 0x4 - IFF_SLAVE_NEEDARP = 0x40 - IFF_SUPP_NOFCS = 0x80000 - IFF_TAP = 0x2 - IFF_TEAM_PORT = 0x40000 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_TX_SKB_SHARING = 0x10000 - IFF_UNICAST_FLT = 0x20000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFF_WAN_HDLC = 0x200 - IFF_XMIT_DST_RELEASE = 0x400 - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BLOCK_SOURCE = 0x26 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x80 - ISTRIP = 0x20 - IUCLC = 0x1000 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x80 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x40 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x2000 - MCL_FUTURE = 0x4000 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NL2 = 0x200 - NL3 = 0x300 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x300 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80000000 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x4 - ONLCR = 0x2 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x20000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x1000 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_SAO = 0x10 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETEVRREGS = 0x14 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGS64 = 0x16 - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GETVRREGS = 0x12 - PTRACE_GETVSRREGS = 0x1b - PTRACE_GET_DEBUGREG = 0x19 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x1000ff - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SEIZE = 0x4206 - PTRACE_SETEVRREGS = 0x15 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGS64 = 0x17 - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SETVRREGS = 0x13 - PTRACE_SETVSRREGS = 0x1c - PTRACE_SET_DEBUGREG = 0x1a - PTRACE_SINGLEBLOCK = 0x100 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TRACEME = 0x0 - PT_CCR = 0x26 - PT_CTR = 0x23 - PT_DAR = 0x29 - PT_DSCR = 0x2c - PT_DSISR = 0x2a - PT_FPR0 = 0x30 - PT_FPSCR = 0x50 - PT_LNK = 0x24 - PT_MSR = 0x21 - PT_NIP = 0x20 - PT_ORIG_R3 = 0x22 - PT_R0 = 0x0 - PT_R1 = 0x1 - PT_R10 = 0xa - PT_R11 = 0xb - PT_R12 = 0xc - PT_R13 = 0xd - PT_R14 = 0xe - PT_R15 = 0xf - PT_R16 = 0x10 - PT_R17 = 0x11 - PT_R18 = 0x12 - PT_R19 = 0x13 - PT_R2 = 0x2 - PT_R20 = 0x14 - PT_R21 = 0x15 - PT_R22 = 0x16 - PT_R23 = 0x17 - PT_R24 = 0x18 - PT_R25 = 0x19 - PT_R26 = 0x1a - PT_R27 = 0x1b - PT_R28 = 0x1c - PT_R29 = 0x1d - PT_R3 = 0x3 - PT_R30 = 0x1e - PT_R31 = 0x1f - PT_R4 = 0x4 - PT_R5 = 0x5 - PT_R6 = 0x6 - PT_R7 = 0x7 - PT_R8 = 0x8 - PT_R9 = 0x9 - PT_REGS_COUNT = 0x2c - PT_RESULT = 0x2b - PT_SOFTE = 0x27 - PT_TRAP = 0x28 - PT_VR0 = 0x52 - PT_VRSAVE = 0x94 - PT_VSCR = 0x93 - PT_VSR0 = 0x96 - PT_VSR31 = 0xd4 - PT_XER = 0x25 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0xf - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x11 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x57 - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x12 - RTM_NR_MSGTYPES = 0x48 - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_F_DEAD = 0x1 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_DEBUG = 0x1 - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x14 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x15 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x10 - SO_RCVTIMEO = 0x12 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x11 - SO_SNDTIMEO = 0x13 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x400 - TAB2 = 0x800 - TAB3 = 0xc00 - TABDLY = 0xc00 - TCFLSH = 0x2000741f - TCGETA = 0x40147417 - TCGETS = 0x402c7413 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x2000741d - TCSBRKP = 0x5425 - TCSETA = 0x80147418 - TCSETAF = 0x8014741c - TCSETAW = 0x80147419 - TCSETS = 0x802c7414 - TCSETSF = 0x802c7416 - TCSETSW = 0x802c7415 - TCXONC = 0x2000741e - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x40045432 - TIOCGETC = 0x40067412 - TIOCGETD = 0x5424 - TIOCGETP = 0x40067408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGLTC = 0x40067474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x4004667f - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_LOOP = 0x8000 - TIOCM_OUT1 = 0x2000 - TIOCM_OUT2 = 0x4000 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETC = 0x80067411 - TIOCSETD = 0x5423 - TIOCSETN = 0x8006740a - TIOCSETP = 0x80067409 - TIOCSIG = 0x80045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSLTC = 0x80067475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTART = 0x2000746e - TIOCSTI = 0x5412 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x400000 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETHDRSZ = 0x400454d7 - TUNSETDEBUG = 0x800454c9 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETHDRSZ = 0x800454d8 - VDISCARD = 0x10 - VEOF = 0x4 - VEOL = 0x6 - VEOL2 = 0x8 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x5 - VQUIT = 0x1 - VREPRINT = 0xb - VSTART = 0xd - VSTOP = 0xe - VSUSP = 0xc - VSWTC = 0x9 - VT0 = 0x0 - VT1 = 0x10000 - VTDLY = 0x10000 - VTIME = 0x7 - VWERASE = 0xa - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4000 - XTABS = 0xc00 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 ) // Errors @@ -1819,7 +2127,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 50767f26ea..fc304a68f6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -1,1714 +1,1963 @@ -// mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. // +build s390x,linux // Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -m64 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go package unix import "syscall" const ( - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_X25 = 0x10f - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_OR = 0x40 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_ZERO_RANGE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0x8 - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_UNICAST_HOPS = 0x10 - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - NAME_MAX = 0xff - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPOST = 0x1 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = -0x1 - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_DISABLE_TE = 0x5010 - PTRACE_ENABLE_TE = 0x5009 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_LAST_BREAK = 0x5006 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_AREA = 0x5003 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_AREA = 0x5002 - PTRACE_PEEKUSR = 0x3 - PTRACE_PEEKUSR_AREA = 0x5000 - PTRACE_PEEK_SYSTEM_CALL = 0x5007 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_AREA = 0x5005 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_AREA = 0x5004 - PTRACE_POKEUSR = 0x6 - PTRACE_POKEUSR_AREA = 0x5001 - PTRACE_POKE_SYSTEM_CALL = 0x5008 - PTRACE_PROT = 0x15 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SEIZE = 0x4206 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SINGLEBLOCK = 0xc - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_TE_ABORT_RAND = 0x5011 - PTRACE_TRACEME = 0x0 - PT_ACR0 = 0x90 - PT_ACR1 = 0x94 - PT_ACR10 = 0xb8 - PT_ACR11 = 0xbc - PT_ACR12 = 0xc0 - PT_ACR13 = 0xc4 - PT_ACR14 = 0xc8 - PT_ACR15 = 0xcc - PT_ACR2 = 0x98 - PT_ACR3 = 0x9c - PT_ACR4 = 0xa0 - PT_ACR5 = 0xa4 - PT_ACR6 = 0xa8 - PT_ACR7 = 0xac - PT_ACR8 = 0xb0 - PT_ACR9 = 0xb4 - PT_CR_10 = 0x168 - PT_CR_11 = 0x170 - PT_CR_9 = 0x160 - PT_ENDREGS = 0x1af - PT_FPC = 0xd8 - PT_FPR0 = 0xe0 - PT_FPR1 = 0xe8 - PT_FPR10 = 0x130 - PT_FPR11 = 0x138 - PT_FPR12 = 0x140 - PT_FPR13 = 0x148 - PT_FPR14 = 0x150 - PT_FPR15 = 0x158 - PT_FPR2 = 0xf0 - PT_FPR3 = 0xf8 - PT_FPR4 = 0x100 - PT_FPR5 = 0x108 - PT_FPR6 = 0x110 - PT_FPR7 = 0x118 - PT_FPR8 = 0x120 - PT_FPR9 = 0x128 - PT_GPR0 = 0x10 - PT_GPR1 = 0x18 - PT_GPR10 = 0x60 - PT_GPR11 = 0x68 - PT_GPR12 = 0x70 - PT_GPR13 = 0x78 - PT_GPR14 = 0x80 - PT_GPR15 = 0x88 - PT_GPR2 = 0x20 - PT_GPR3 = 0x28 - PT_GPR4 = 0x30 - PT_GPR5 = 0x38 - PT_GPR6 = 0x40 - PT_GPR7 = 0x48 - PT_GPR8 = 0x50 - PT_GPR9 = 0x58 - PT_IEEE_IP = 0x1a8 - PT_LASTOFF = 0x1a8 - PT_ORIGGPR2 = 0xd0 - PT_PSWADDR = 0x8 - PT_PSWMASK = 0x0 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_NOFILE = 0x7 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = -0x1 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x10 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x16 - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x5b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x13 - RTM_NR_MSGTYPES = 0x4c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x11 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_GATED = 0x8 - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPNS = 0x23 - SCM_WIFI_STATUS = 0x29 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCGARP = 0x8954 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGPGRP = 0x8904 - SIOCGRARP = 0x8961 - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ATM = 0x108 - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_PACKET = 0x107 - SOL_RAW = 0xff - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_X25 = 0x106 - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_BINDTODEVICE = 0x19 - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TYPE = 0x3 - SO_WIFI_STATUS = 0x29 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_CC_INFO = 0x1a - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_INFO = 0xb - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TOSTOP = 0x100 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x801054db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETDEBUG = 0x400454c9 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMIN = 0x6 - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XCASE = 0x4 - XTABS = 0x1800 + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors @@ -1878,7 +2127,6 @@ const ( SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) - SIGUNUSED = syscall.Signal(0x1f) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index a66df2ec32..95de199fc4 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -163,6 +163,21 @@ const ( B76800 = 0x1005 B921600 = 0x1009 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -470,6 +485,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x3 F_WRLCK = 0x2 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -1523,7 +1540,18 @@ const ( SO_TIMESTAMPING = 0x23 SO_TIMESTAMPNS = 0x21 SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1728,6 +1756,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go index ac85ca6452..206c75f094 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -1006,6 +1006,9 @@ const ( MSG_TRUNC = 0x10 MSG_USERFLAGS = 0xffffff MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 NAME_MAX = 0x1ff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go new file mode 100644 index 0000000000..3ed0b2602f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -0,0 +1,1586 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +// +build arm,openbsd + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x3ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x70f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "IPsec processing failure", + 83: "attribute not found", + 84: "illegal byte sequence", + 85: "no medium found", + 86: "wrong medium type", + 87: "value too large to be stored in data type", + 88: "operation canceled", + 89: "identifier removed", + 90: "no message of desired type", + 91: "not supported", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread AST", +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go index a08922b981..09eedb0093 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -1,5 +1,5 @@ // mkerrors.sh -m64 -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,solaris @@ -159,7 +159,12 @@ const ( BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0xf CFLUSH = 0xf + CIBAUD = 0xf0000 CLOCAL = 0x800 CLOCK_HIGHRES = 0x4 CLOCK_LEVEL = 0xa @@ -169,7 +174,13 @@ const ( CLOCK_REALTIME = 0x3 CLOCK_THREAD_CPUTIME_ID = 0x2 CLOCK_VIRTUAL = 0x1 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 CREAD = 0x80 + CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -276,6 +287,9 @@ const ( FD_CLOEXEC = 0x1 FD_NFDBITS = 0x40 FD_SETSIZE = 0x10000 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 FLUSHALL = 0x1 FLUSHDATA = 0x0 FLUSHO = 0x2000 @@ -290,6 +304,10 @@ const ( F_DUP2FD_CLOEXEC = 0x24 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x25 + F_FLOCK = 0x35 + F_FLOCK64 = 0x35 + F_FLOCKW = 0x36 + F_FLOCKW64 = 0x36 F_FREESP = 0xb F_FREESP64 = 0xb F_GETFD = 0x1 @@ -304,6 +322,12 @@ const ( F_MDACC = 0x20 F_NODNY = 0x0 F_NPRIV = 0x10 + F_OFD_GETLK = 0x2f + F_OFD_GETLK64 = 0x2f + F_OFD_SETLK = 0x30 + F_OFD_SETLK64 = 0x30 + F_OFD_SETLKW = 0x31 + F_OFD_SETLKW64 = 0x31 F_PRIV = 0xf F_QUOTACTL = 0x11 F_RDACC = 0x1 @@ -332,6 +356,7 @@ const ( F_WRDNY = 0x2 F_WRLCK = 0x2 HUPCL = 0x400 + IBSHIFT = 0x10 ICANON = 0x2 ICRNL = 0x100 IEXTEN = 0x8000 @@ -589,15 +614,21 @@ const ( IP_UNSPEC_SRC = 0x42 ISIG = 0x1 ISTRIP = 0x20 + IUCLC = 0x200 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 MADV_ACCESS_DEFAULT = 0x6 MADV_ACCESS_LWP = 0x7 MADV_ACCESS_MANY = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_NORMAL = 0x0 + MADV_PURGE = 0x9 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 @@ -605,6 +636,7 @@ const ( MAP_ALIGN = 0x200 MAP_ANON = 0x100 MAP_ANONYMOUS = 0x100 + MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_INITDATA = 0x800 MAP_NORESERVE = 0x40 @@ -632,10 +664,19 @@ const ( MS_OLDSYNC = 0x0 MS_SYNC = 0x4 M_FLUSH = 0x86 + NAME_MAX = 0xff + NEWDEV = 0x1 + NL0 = 0x0 + NL1 = 0x100 + NLDLY = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 + OLCUC = 0x2 + OLDDEV = 0x0 + ONBITSMAJOR = 0x7 + ONBITSMINOR = 0x8 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 @@ -955,12 +996,21 @@ const ( SO_USELOOPBACK = 0x40 SO_VRRP = 0x1017 SO_WROFF = 0x2 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 TCFLSH = 0x5407 TCGETA = 0x5401 TCGETS = 0x540d TCIFLUSH = 0x0 + TCIOFF = 0x2 TCIOFLUSH = 0x2 + TCION = 0x3 TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 TCP_ABORT_THRESHOLD = 0x11 TCP_ANONPRIVBIND = 0x20 TCP_CONN_ABORT_THRESHOLD = 0x13 @@ -1060,6 +1110,7 @@ const ( VEOL = 0x5 VEOL2 = 0x6 VERASE = 0x2 + VERASE2 = 0x11 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf @@ -1089,6 +1140,8 @@ const ( WSTOPPED = 0x4 WTRAPPED = 0x2 WUNTRACED = 0x4 + XCASE = 0x4 + XTABS = 0x1800 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zptrace386_linux.go b/vendor/golang.org/x/sys/unix/zptrace386_linux.go new file mode 100644 index 0000000000..2d21c49e12 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptrace386_linux.go @@ -0,0 +1,80 @@ +// Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT. + +// +build linux +// +build 386 amd64 + +package unix + +import "unsafe" + +// PtraceRegs386 is the registers used by 386 binaries. +type PtraceRegs386 struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +// PtraceGetRegs386 fetches the registers used by 386 binaries. +func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegs386 sets the registers used by 386 binaries. +func PtraceSetRegs386(pid int, regs *PtraceRegs386) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsAmd64 is the registers used by amd64 binaries. +type PtraceRegsAmd64 struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries. +func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsAmd64 sets the registers used by amd64 binaries. +func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptracearm_linux.go b/vendor/golang.org/x/sys/unix/zptracearm_linux.go new file mode 100644 index 0000000000..faf23bbed9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptracearm_linux.go @@ -0,0 +1,41 @@ +// Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT. + +// +build linux +// +build arm arm64 + +package unix + +import "unsafe" + +// PtraceRegsArm is the registers used by arm binaries. +type PtraceRegsArm struct { + Uregs [18]uint32 +} + +// PtraceGetRegsArm fetches the registers used by arm binaries. +func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm sets the registers used by arm binaries. +func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsArm64 is the registers used by arm64 binaries. +type PtraceRegsArm64 struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +// PtraceGetRegsArm64 fetches the registers used by arm64 binaries. +func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm64 sets the registers used by arm64 binaries. +func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptracemips_linux.go b/vendor/golang.org/x/sys/unix/zptracemips_linux.go new file mode 100644 index 0000000000..c431131e63 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptracemips_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT. + +// +build linux +// +build mips mips64 + +package unix + +import "unsafe" + +// PtraceRegsMips is the registers used by mips binaries. +type PtraceRegsMips struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips fetches the registers used by mips binaries. +func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips sets the registers used by mips binaries. +func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64 is the registers used by mips64 binaries. +type PtraceRegsMips64 struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64 fetches the registers used by mips64 binaries. +func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64 sets the registers used by mips64 binaries. +func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go b/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go new file mode 100644 index 0000000000..dc3d6d3732 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT. + +// +build linux +// +build mipsle mips64le + +package unix + +import "unsafe" + +// PtraceRegsMipsle is the registers used by mipsle binaries. +type PtraceRegsMipsle struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMipsle fetches the registers used by mipsle binaries. +func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMipsle sets the registers used by mipsle binaries. +func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64le is the registers used by mips64le binaries. +type PtraceRegsMips64le struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64le fetches the registers used by mips64le binaries. +func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64le sets the registers used by mips64le binaries. +func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index e48f4a5c1c..763ae4fbb9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,386 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -298,6 +409,16 @@ func kill(pid int, signum int, posix int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -456,6 +577,21 @@ func Exit(code int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -486,6 +622,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -496,6 +647,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -745,6 +911,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -785,6 +971,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -815,74 +1016,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -899,6 +1032,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -988,6 +1137,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1008,6 +1179,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1245,6 +1436,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1308,6 +1519,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 672ada0e44..d6808e072d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,amd64 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -298,6 +409,16 @@ func kill(pid int, signum int, posix int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -456,6 +577,21 @@ func Exit(code int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -486,6 +622,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -496,6 +647,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -745,6 +911,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -785,6 +971,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -815,74 +1016,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -899,6 +1032,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -988,6 +1137,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1008,6 +1179,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1245,6 +1436,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1308,6 +1519,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1383,21 +1609,6 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index d516409dbe..6ae95e6b9a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -1,5 +1,5 @@ -// mksyscall.pl -l32 -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mksyscall.pl -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,arm @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -298,6 +409,16 @@ func kill(pid int, signum int, posix int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -456,6 +577,21 @@ func Exit(code int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -486,6 +622,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -496,6 +647,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -745,6 +911,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -785,6 +971,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -815,74 +1016,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -899,6 +1032,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -988,6 +1137,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1008,6 +1179,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1245,6 +1436,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1308,6 +1519,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index e97759c357..ca6a7ea8b7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,arm64 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -298,6 +409,16 @@ func kill(pid int, signum int, posix int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -456,6 +577,21 @@ func Exit(code int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -486,6 +622,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -496,6 +647,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -745,6 +911,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -785,6 +971,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -815,74 +1016,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -899,6 +1032,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -988,6 +1137,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1008,6 +1179,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1245,6 +1436,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1308,6 +1519,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 3e9d82a27e..2ed340fd18 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1,5 +1,5 @@ // mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build dragonfly,amd64 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) @@ -312,6 +423,16 @@ func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -829,74 +950,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1380,3 +1433,29 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index f53801ceef..8bcecfb9b6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build freebsd,386 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) @@ -278,6 +389,16 @@ func pipe() (r int, w int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -303,6 +424,36 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -640,6 +791,21 @@ func Fadvise(fd int, offset int64, length int64, advice int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -670,6 +836,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -680,6 +861,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -949,6 +1145,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -989,6 +1205,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1019,74 +1250,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1113,6 +1276,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1202,6 +1381,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1222,6 +1423,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1469,6 +1690,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1532,6 +1773,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1615,3 +1871,18 @@ func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 55b07412cb..61c0cf99bb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build freebsd,amd64 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) @@ -278,6 +389,16 @@ func pipe() (r int, w int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -303,6 +424,36 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -640,6 +791,21 @@ func Fadvise(fd int, offset int64, length int64, advice int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -670,6 +836,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -680,6 +861,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -949,6 +1145,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -989,6 +1205,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1019,74 +1250,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1113,6 +1276,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1202,6 +1381,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1222,6 +1423,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1469,6 +1690,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1532,6 +1773,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1615,3 +1871,18 @@ func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 0e9b42bf4f..ffd01073c1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build freebsd,arm @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) @@ -278,6 +389,16 @@ func pipe() (r int, w int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -303,6 +424,36 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -640,6 +791,21 @@ func Fadvise(fd int, offset int64, length int64, advice int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { @@ -670,6 +836,21 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -680,6 +861,21 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { @@ -949,6 +1145,26 @@ func Link(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { @@ -989,6 +1205,21 @@ func Mkdir(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1019,74 +1250,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1113,6 +1276,22 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1202,6 +1381,28 @@ func Readlink(path string, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) @@ -1222,6 +1423,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1469,6 +1690,26 @@ func Symlink(path string, link string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { @@ -1532,6 +1773,21 @@ func Unlink(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1615,3 +1871,18 @@ func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index a01725b8ed..85a2907e5d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,386 @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 1c1b25e675..8e2be97d36 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,amd64 @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 2359fd715b..5ff0637fde 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,arm @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index c3dbcad4b0..40760110f3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,arm64 @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1346,17 +1678,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 3fd164a9d9..984e561733 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -1,5 +1,5 @@ // mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mips @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index a26cad4139..f98194e245 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mips64 @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,6 +1457,32 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { @@ -1157,8 +1499,8 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1167,8 +1509,8 @@ func Mlockall(flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1346,17 +1688,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 7cc92ad484..f30267019b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mips64le @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,6 +1457,32 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { @@ -1157,8 +1499,8 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1167,8 +1509,8 @@ func Mlockall(flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1346,17 +1688,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 79f26e5b21..f18c5e4a76 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mipsle @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 27befca49c..bc268243cf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,ppc64 @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1413,7 +1745,7 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 0dc288e23e..8d874cbcdc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,ppc64le @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1413,7 +1745,7 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 33c086b5ef..169321273d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -1,5 +1,5 @@ // mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,s390x @@ -14,6 +14,31 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -186,6 +211,104 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -251,6 +374,33 @@ func Acct(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) @@ -312,6 +462,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -365,6 +526,17 @@ func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return @@ -417,21 +589,6 @@ func Fchmod(fd int, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -543,6 +700,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -664,6 +838,33 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -686,6 +887,74 @@ func Listxattr(path string, dest []byte) (sz int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -766,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -823,6 +1103,32 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { @@ -939,6 +1245,16 @@ func Sync() { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { @@ -1141,14 +1457,8 @@ func Mlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1157,8 +1467,30 @@ func Munlock(b []byte) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 071b85c93a..2dd98434ea 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_sparc64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. -// +build +// +build linux,sparc64 package unix @@ -312,6 +312,17 @@ func Close(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) @@ -543,6 +554,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 3182345ece..04a1ace9d0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build netbsd,386 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -295,6 +406,16 @@ func getdents(fd int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -777,74 +898,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1297,3 +1350,18 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 74ba8189a5..079824a71a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1,5 +1,5 @@ // mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build netbsd,amd64 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -295,6 +406,16 @@ func getdents(fd int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -777,74 +898,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1297,3 +1350,18 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 1f346e2f52..05f8b496a8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1,5 +1,5 @@ -// mksyscall.pl -l32 -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build netbsd,arm @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -295,6 +406,16 @@ func getdents(fd int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -777,74 +898,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1297,3 +1350,18 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index ca3e813926..3b55544df7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1,5 +1,5 @@ // mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build openbsd,386 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { @@ -293,6 +404,16 @@ func getdents(fd int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -785,74 +906,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1355,3 +1408,18 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index bf63d552ed..cdaf4ef4c1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1,5 +1,5 @@ // mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build openbsd,amd64 @@ -266,6 +266,117 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { @@ -293,6 +404,16 @@ func getdents(fd int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -785,74 +906,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Mlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Mprotect(b []byte, prot int) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlock(b []byte) (err error) { - var _p0 unsafe.Pointer - if len(b) > 0 { - _p0 = unsafe.Pointer(&b[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1355,3 +1408,18 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go new file mode 100644 index 0000000000..6c4dc8a9fb --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -0,0 +1,1425 @@ +// mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index bdf140b180..1d45276498 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -1,5 +1,5 @@ // mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build solaris,amd64 @@ -22,10 +22,14 @@ import ( //go:cgo_import_dynamic libc_fcntl fcntl "libc.so" //go:cgo_import_dynamic libc_futimesat futimesat "libc.so" //go:cgo_import_dynamic libc_accept accept "libsocket.so" -//go:cgo_import_dynamic libc_recvmsg recvmsg "libsocket.so" -//go:cgo_import_dynamic libc_sendmsg sendmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" //go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc___makedev __makedev "libc.so" +//go:cgo_import_dynamic libc___major __major "libc.so" +//go:cgo_import_dynamic libc___minor __minor "libc.so" //go:cgo_import_dynamic libc_ioctl ioctl "libc.so" +//go:cgo_import_dynamic libc_poll poll "libc.so" //go:cgo_import_dynamic libc_access access "libc.so" //go:cgo_import_dynamic libc_adjtime adjtime "libc.so" //go:cgo_import_dynamic libc_chdir chdir "libc.so" @@ -43,8 +47,10 @@ import ( //go:cgo_import_dynamic libc_fchown fchown "libc.so" //go:cgo_import_dynamic libc_fchownat fchownat "libc.so" //go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" +//go:cgo_import_dynamic libc_flock flock "libc.so" //go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" //go:cgo_import_dynamic libc_fstat fstat "libc.so" +//go:cgo_import_dynamic libc_fstatvfs fstatvfs "libc.so" //go:cgo_import_dynamic libc_getdents getdents "libc.so" //go:cgo_import_dynamic libc_getgid getgid "libc.so" //go:cgo_import_dynamic libc_getpid getpid "libc.so" @@ -61,7 +67,7 @@ import ( //go:cgo_import_dynamic libc_kill kill "libc.so" //go:cgo_import_dynamic libc_lchown lchown "libc.so" //go:cgo_import_dynamic libc_link link "libc.so" -//go:cgo_import_dynamic libc_listen listen "libsocket.so" +//go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten "libsocket.so" //go:cgo_import_dynamic libc_lstat lstat "libc.so" //go:cgo_import_dynamic libc_madvise madvise "libc.so" //go:cgo_import_dynamic libc_mkdir mkdir "libc.so" @@ -73,6 +79,7 @@ import ( //go:cgo_import_dynamic libc_mlock mlock "libc.so" //go:cgo_import_dynamic libc_mlockall mlockall "libc.so" //go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_msync msync "libc.so" //go:cgo_import_dynamic libc_munlock munlock "libc.so" //go:cgo_import_dynamic libc_munlockall munlockall "libc.so" //go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" @@ -101,6 +108,7 @@ import ( //go:cgo_import_dynamic libc_setuid setuid "libc.so" //go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" //go:cgo_import_dynamic libc_stat stat "libc.so" +//go:cgo_import_dynamic libc_statvfs statvfs "libc.so" //go:cgo_import_dynamic libc_symlink symlink "libc.so" //go:cgo_import_dynamic libc_sync sync "libc.so" //go:cgo_import_dynamic libc_times times "libc.so" @@ -114,19 +122,18 @@ import ( //go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" //go:cgo_import_dynamic libc_ustat ustat "libc.so" //go:cgo_import_dynamic libc_utime utime "libc.so" -//go:cgo_import_dynamic libc_bind bind "libsocket.so" -//go:cgo_import_dynamic libc_connect connect "libsocket.so" +//go:cgo_import_dynamic libc___xnet_bind __xnet_bind "libsocket.so" +//go:cgo_import_dynamic libc___xnet_connect __xnet_connect "libsocket.so" //go:cgo_import_dynamic libc_mmap mmap "libc.so" //go:cgo_import_dynamic libc_munmap munmap "libc.so" -//go:cgo_import_dynamic libc_sendto sendto "libsocket.so" -//go:cgo_import_dynamic libc_socket socket "libsocket.so" -//go:cgo_import_dynamic libc_socketpair socketpair "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socket __xnet_socket "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair "libsocket.so" //go:cgo_import_dynamic libc_write write "libc.so" -//go:cgo_import_dynamic libc_getsockopt getsockopt "libsocket.so" +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" //go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" //go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" //go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" -//go:cgo_import_dynamic libc_sysconf sysconf "libc.so" //go:linkname procpipe libc_pipe //go:linkname procgetsockname libc_getsockname @@ -140,10 +147,14 @@ import ( //go:linkname procfcntl libc_fcntl //go:linkname procfutimesat libc_futimesat //go:linkname procaccept libc_accept -//go:linkname procrecvmsg libc_recvmsg -//go:linkname procsendmsg libc_sendmsg +//go:linkname proc__xnet_recvmsg libc___xnet_recvmsg +//go:linkname proc__xnet_sendmsg libc___xnet_sendmsg //go:linkname procacct libc_acct +//go:linkname proc__makedev libc___makedev +//go:linkname proc__major libc___major +//go:linkname proc__minor libc___minor //go:linkname procioctl libc_ioctl +//go:linkname procpoll libc_poll //go:linkname procAccess libc_access //go:linkname procAdjtime libc_adjtime //go:linkname procChdir libc_chdir @@ -161,8 +172,10 @@ import ( //go:linkname procFchown libc_fchown //go:linkname procFchownat libc_fchownat //go:linkname procFdatasync libc_fdatasync +//go:linkname procFlock libc_flock //go:linkname procFpathconf libc_fpathconf //go:linkname procFstat libc_fstat +//go:linkname procFstatvfs libc_fstatvfs //go:linkname procGetdents libc_getdents //go:linkname procGetgid libc_getgid //go:linkname procGetpid libc_getpid @@ -179,7 +192,7 @@ import ( //go:linkname procKill libc_kill //go:linkname procLchown libc_lchown //go:linkname procLink libc_link -//go:linkname proclisten libc_listen +//go:linkname proc__xnet_llisten libc___xnet_llisten //go:linkname procLstat libc_lstat //go:linkname procMadvise libc_madvise //go:linkname procMkdir libc_mkdir @@ -191,6 +204,7 @@ import ( //go:linkname procMlock libc_mlock //go:linkname procMlockall libc_mlockall //go:linkname procMprotect libc_mprotect +//go:linkname procMsync libc_msync //go:linkname procMunlock libc_munlock //go:linkname procMunlockall libc_munlockall //go:linkname procNanosleep libc_nanosleep @@ -219,6 +233,7 @@ import ( //go:linkname procSetuid libc_setuid //go:linkname procshutdown libc_shutdown //go:linkname procStat libc_stat +//go:linkname procStatvfs libc_statvfs //go:linkname procSymlink libc_symlink //go:linkname procSync libc_sync //go:linkname procTimes libc_times @@ -232,19 +247,18 @@ import ( //go:linkname procUnlinkat libc_unlinkat //go:linkname procUstat libc_ustat //go:linkname procUtime libc_utime -//go:linkname procbind libc_bind -//go:linkname procconnect libc_connect +//go:linkname proc__xnet_bind libc___xnet_bind +//go:linkname proc__xnet_connect libc___xnet_connect //go:linkname procmmap libc_mmap //go:linkname procmunmap libc_munmap -//go:linkname procsendto libc_sendto -//go:linkname procsocket libc_socket -//go:linkname procsocketpair libc_socketpair +//go:linkname proc__xnet_sendto libc___xnet_sendto +//go:linkname proc__xnet_socket libc___xnet_socket +//go:linkname proc__xnet_socketpair libc___xnet_socketpair //go:linkname procwrite libc_write -//go:linkname procgetsockopt libc_getsockopt +//go:linkname proc__xnet_getsockopt libc___xnet_getsockopt //go:linkname procgetpeername libc_getpeername //go:linkname procsetsockopt libc_setsockopt //go:linkname procrecvfrom libc_recvfrom -//go:linkname procsysconf libc_sysconf var ( procpipe, @@ -259,10 +273,14 @@ var ( procfcntl, procfutimesat, procaccept, - procrecvmsg, - procsendmsg, + proc__xnet_recvmsg, + proc__xnet_sendmsg, procacct, + proc__makedev, + proc__major, + proc__minor, procioctl, + procpoll, procAccess, procAdjtime, procChdir, @@ -280,8 +298,10 @@ var ( procFchown, procFchownat, procFdatasync, + procFlock, procFpathconf, procFstat, + procFstatvfs, procGetdents, procGetgid, procGetpid, @@ -298,7 +318,7 @@ var ( procKill, procLchown, procLink, - proclisten, + proc__xnet_llisten, procLstat, procMadvise, procMkdir, @@ -310,6 +330,7 @@ var ( procMlock, procMlockall, procMprotect, + procMsync, procMunlock, procMunlockall, procNanosleep, @@ -338,6 +359,7 @@ var ( procSetuid, procshutdown, procStat, + procStatvfs, procSymlink, procSync, procTimes, @@ -351,19 +373,18 @@ var ( procUnlinkat, procUstat, procUtime, - procbind, - procconnect, + proc__xnet_bind, + proc__xnet_connect, procmmap, procmunmap, - procsendto, - procsocket, - procsocketpair, + proc__xnet_sendto, + proc__xnet_socket, + proc__xnet_socketpair, procwrite, - procgetsockopt, + proc__xnet_getsockopt, procgetpeername, procsetsockopt, - procrecvfrom, - procsysconf syscallFunc + procrecvfrom syscallFunc ) func pipe(p *[2]_C_int) (n int, err error) { @@ -488,7 +509,7 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { } func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 @@ -497,7 +518,7 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { } func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 @@ -513,7 +534,25 @@ func acct(path *byte) (err error) { return } -func ioctl(fd int, req int, arg uintptr) (err error) { +func __makedev(version int, major uint, minor uint) (val uint64) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0) + val = uint64(r0) + return +} + +func __major(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func __minor(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) if e1 != 0 { err = e1 @@ -521,6 +560,15 @@ func ioctl(fd int, req int, arg uintptr) (err error) { return } +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -696,6 +744,14 @@ func Fdatasync(fd int) (err error) { return } +func Flock(fd int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) val = int(r0) @@ -713,6 +769,14 @@ func Fstat(fd int, stat *Stat_t) (err error) { return } +func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 *byte if len(buf) > 0 { @@ -853,7 +917,7 @@ func Link(path string, link string) (err error) { } func Listen(s int, backlog int) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) if e1 != 0 { err = e1 } @@ -995,6 +1059,18 @@ func Mprotect(b []byte, prot int) (err error) { return } +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Munlock(b []byte) (err error) { var _p0 *byte if len(b) > 0 { @@ -1302,6 +1378,19 @@ func Stat(path string, stat *Stat_t) (err error) { return } +func Statvfs(path string, vfsstat *Statvfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1441,7 +1530,7 @@ func Utime(path string, buf *Utimbuf) (err error) { } func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procbind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { err = e1 } @@ -1449,7 +1538,7 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { } func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procconnect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { err = e1 } @@ -1478,7 +1567,7 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( if len(buf) > 0 { _p0 = &buf[0] } - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = e1 } @@ -1486,7 +1575,7 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsocket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) fd = int(r0) if e1 != 0 { err = e1 @@ -1495,7 +1584,7 @@ func socket(domain int, typ int, proto int) (fd int, err error) { } func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsocketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = e1 } @@ -1516,7 +1605,7 @@ func write(fd int, p []byte) (n int, err error) { } func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = e1 } @@ -1551,12 +1640,3 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } return } - -func sysconf(name int) (n int64, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsysconf)), 1, uintptr(name), 0, 0, 0, 0, 0) - n = int64(r0) - if e1 != 0 { - err = e1 - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go similarity index 100% rename from vendor/golang.org/x/sys/unix/zsysctl_openbsd.go rename to vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go new file mode 100644 index 0000000000..83bb935b91 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go new file mode 100644 index 0000000000..83bb935b91 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go index 2786773ba3..d1d36da3f5 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -1,5 +1,5 @@ -// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,darwin @@ -121,13 +121,15 @@ const ( SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 - SYS_CHUD = 185 + SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 @@ -278,7 +280,6 @@ const ( SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 - SYS_STACK_SNAPSHOT = 365 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 @@ -287,6 +288,8 @@ const ( SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 @@ -298,11 +301,8 @@ const ( SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 - SYS___MAC_GET_LCID = 391 - SYS___MAC_GET_LCTX = 392 - SYS___MAC_SET_LCTX = 393 - SYS_SETLCID = 394 - SYS_GETLCID = 395 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 @@ -351,6 +351,7 @@ const ( SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 @@ -367,6 +368,7 @@ const ( SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 @@ -392,7 +394,43 @@ const ( SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 - SYS_RENAME_EXT = 488 + SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 - SYS_MAXSYSCALL = 490 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go index 09de240c8f..e35de4145e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -1,5 +1,5 @@ -// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,darwin @@ -121,13 +121,15 @@ const ( SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 - SYS_CHUD = 185 + SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 @@ -278,7 +280,6 @@ const ( SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 - SYS_STACK_SNAPSHOT = 365 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 @@ -287,6 +288,8 @@ const ( SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 @@ -298,11 +301,8 @@ const ( SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 - SYS___MAC_GET_LCID = 391 - SYS___MAC_GET_LCTX = 392 - SYS___MAC_SET_LCTX = 393 - SYS_SETLCID = 394 - SYS_GETLCID = 395 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 @@ -351,6 +351,7 @@ const ( SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 @@ -367,6 +368,7 @@ const ( SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 @@ -392,7 +394,43 @@ const ( SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 - SYS_RENAME_EXT = 488 + SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 - SYS_MAXSYSCALL = 490 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go index b8c9aea852..f2df27db2c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -1,5 +1,5 @@ -// mksysnum_darwin.pl /usr/include/sys/syscall.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,darwin @@ -121,12 +121,15 @@ const ( SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 - SYS_CHUD = 185 + SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 @@ -140,17 +143,10 @@ const ( SYS_LSEEK = 199 SYS_TRUNCATE = 200 SYS_FTRUNCATE = 201 - SYS___SYSCTL = 202 + SYS_SYSCTL = 202 SYS_MLOCK = 203 SYS_MUNLOCK = 204 SYS_UNDELETE = 205 - SYS_ATSOCKET = 206 - SYS_ATGETMSG = 207 - SYS_ATPUTMSG = 208 - SYS_ATPSNDREQ = 209 - SYS_ATPSNDRSP = 210 - SYS_ATPGETREQ = 211 - SYS_ATPGETRSP = 212 SYS_OPEN_DPROTECTED_NP = 216 SYS_GETATTRLIST = 220 SYS_SETATTRLIST = 221 @@ -202,9 +198,7 @@ const ( SYS_SEM_WAIT = 271 SYS_SEM_TRYWAIT = 272 SYS_SEM_POST = 273 - SYS_SEM_GETVALUE = 274 - SYS_SEM_INIT = 275 - SYS_SEM_DESTROY = 276 + SYS_SYSCTLBYNAME = 274 SYS_OPEN_EXTENDED = 277 SYS_UMASK_EXTENDED = 278 SYS_STAT_EXTENDED = 279 @@ -286,7 +280,6 @@ const ( SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 - SYS_STACK_SNAPSHOT = 365 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 @@ -295,6 +288,8 @@ const ( SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 @@ -306,11 +301,8 @@ const ( SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 - SYS___MAC_GET_LCID = 391 - SYS___MAC_GET_LCTX = 392 - SYS___MAC_SET_LCTX = 393 - SYS_SETLCID = 394 - SYS_GETLCID = 395 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 @@ -354,5 +346,91 @@ const ( SYS_PID_SHUTDOWN_SOCKETS = 436 SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 SYS_KAS_INFO = 439 - SYS_MAXSYSCALL = 440 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go index 26677ebbf5..9694630232 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -1,5 +1,5 @@ -// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/usr/include/sys/syscall.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,darwin @@ -121,13 +121,15 @@ const ( SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 - SYS_CHUD = 185 + SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 @@ -278,7 +280,6 @@ const ( SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 - SYS_STACK_SNAPSHOT = 365 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 @@ -287,6 +288,8 @@ const ( SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 @@ -298,11 +301,8 @@ const ( SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 - SYS___MAC_GET_LCID = 391 - SYS___MAC_GET_LCTX = 392 - SYS___MAC_SET_LCTX = 393 - SYS_SETLCID = 394 - SYS_GETLCID = 395 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 @@ -351,6 +351,7 @@ const ( SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 @@ -367,6 +368,7 @@ const ( SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 @@ -392,7 +394,43 @@ const ( SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 - SYS_RENAME_EXT = 488 + SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 - SYS_MAXSYSCALL = 490 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go index d6038fa9b0..b2c9ef81b8 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -1,5 +1,5 @@ // mksysnum_dragonfly.pl -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly @@ -42,7 +42,7 @@ const ( SYS_SYNC = 36 // { int sync(void); } SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } - SYS_DUP = 41 // { int dup(u_int fd); } + SYS_DUP = 41 // { int dup(int fd); } SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ @@ -76,7 +76,7 @@ const ( SYS_SWAPON = 85 // { int swapon(char *name); } SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } - SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_DUP2 = 90 // { int dup2(int from, int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ SYS_FSYNC = 95 // { int fsync(int fd); } @@ -144,7 +144,7 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } - SYS_MSGSND = 226 // { int msgsnd(int msqid, void *msgp, size_t msgsz, \ + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \ SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ @@ -224,7 +224,7 @@ const ( SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } SYS_KEVENT = 363 // { int kevent(int fd, \ - SYS_SCTP_PEELOFF = 364 // { int sctp_peeloff(int sd, caddr_t name ); } + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ @@ -301,4 +301,15 @@ const ( SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } + SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); } + SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);} + SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); } + SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); } + SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); } + SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); } + SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); } + SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); } + SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); } + SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 262a84536a..b64a8122ce 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,5 +1,5 @@ // mksysnum_freebsd.pl -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd @@ -7,345 +7,347 @@ package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int - SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ - SYS_FORK = 2 // { int fork(void); } - SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ - SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ - SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } - SYS_CLOSE = 6 // { int close(int fd); } - SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ - SYS_LINK = 9 // { int link(char *path, char *link); } - SYS_UNLINK = 10 // { int unlink(char *path); } - SYS_CHDIR = 12 // { int chdir(char *path); } - SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } - SYS_CHMOD = 15 // { int chmod(char *path, int mode); } - SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ - SYS_GETPID = 20 // { pid_t getpid(void); } - SYS_MOUNT = 21 // { int mount(char *type, char *path, \ - SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } - SYS_SETUID = 23 // { int setuid(uid_t uid); } - SYS_GETUID = 24 // { uid_t getuid(void); } - SYS_GETEUID = 25 // { uid_t geteuid(void); } - SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ - SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ - SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ - SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ - SYS_ACCEPT = 30 // { int accept(int s, \ - SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ - SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ - SYS_ACCESS = 33 // { int access(char *path, int amode); } - SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } - SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } - SYS_SYNC = 36 // { int sync(void); } - SYS_KILL = 37 // { int kill(int pid, int signum); } - SYS_GETPPID = 39 // { pid_t getppid(void); } - SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } - SYS_GETEGID = 43 // { gid_t getegid(void); } - SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ - SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ - SYS_GETGID = 47 // { gid_t getgid(void); } - SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ - SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } - SYS_ACCT = 51 // { int acct(char *path); } - SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ - SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ - SYS_REBOOT = 55 // { int reboot(int opt); } - SYS_REVOKE = 56 // { int revoke(char *path); } - SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } - SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ - SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ - SYS_CHROOT = 61 // { int chroot(char *path); } - SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ - SYS_VFORK = 66 // { int vfork(void); } - SYS_SBRK = 69 // { int sbrk(int incr); } - SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ - SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ - SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ - SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ - SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ - SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ - SYS_GETPGRP = 81 // { int getpgrp(void); } - SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } - SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ - SYS_SWAPON = 85 // { int swapon(char *name); } - SYS_GETITIMER = 86 // { int getitimer(u_int which, \ - SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } - SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } - SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } - SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ - SYS_FSYNC = 95 // { int fsync(int fd); } - SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ - SYS_SOCKET = 97 // { int socket(int domain, int type, \ - SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ - SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } - SYS_BIND = 104 // { int bind(int s, caddr_t name, \ - SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ - SYS_LISTEN = 106 // { int listen(int s, int backlog); } - SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ - SYS_GETRUSAGE = 117 // { int getrusage(int who, \ - SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ - SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ - SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ - SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ - SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } - SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } - SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } - SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } - SYS_RENAME = 128 // { int rename(char *from, char *to); } - SYS_FLOCK = 131 // { int flock(int fd, int how); } - SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } - SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ - SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } - SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ - SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } - SYS_RMDIR = 137 // { int rmdir(char *path); } - SYS_UTIMES = 138 // { int utimes(char *path, \ - SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ - SYS_SETSID = 147 // { int setsid(void); } - SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ - SYS_LGETFH = 160 // { int lgetfh(char *fname, \ - SYS_GETFH = 161 // { int getfh(char *fname, \ - SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } - SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ - SYS_SETFIB = 175 // { int setfib(int fibnum); } - SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } - SYS_SETGID = 181 // { int setgid(gid_t gid); } - SYS_SETEGID = 182 // { int setegid(gid_t egid); } - SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } - SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } - SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } - SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ - SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ - SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ - SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } - SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } - SYS_UNDELETE = 205 // { int undelete(char *path); } - SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } - SYS_GETPGID = 207 // { int getpgid(pid_t pid); } - SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ - SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ - SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ - SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ - SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ - SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } - SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ - SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ - SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } - SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ - SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ - SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } - SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ - SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ - SYS_ISSETUGID = 253 // { int issetugid(void); } - SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ - SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } - SYS_LUTIMES = 276 // { int lutimes(char *path, \ - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } - SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ - SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ - SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ - SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, \ - SYS_MODFNEXT = 302 // { int modfnext(int modid); } - SYS_MODFIND = 303 // { int modfind(const char *name); } - SYS_KLDLOAD = 304 // { int kldload(const char *file); } - SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } - SYS_KLDFIND = 306 // { int kldfind(const char *file); } - SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ - SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } - SYS_GETSID = 310 // { int getsid(pid_t pid); } - SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ - SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ - SYS_YIELD = 321 // { int yield(void); } - SYS_MLOCKALL = 324 // { int mlockall(int how); } - SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } - SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ - SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ - SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ - SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } - SYS_SCHED_YIELD = 331 // { int sched_yield (void); } - SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } - SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } - SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ - SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } - SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ - SYS_JAIL = 338 // { int jail(struct jail *jail); } - SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ - SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } - SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } - SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ - SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ - SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ - SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ - SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ - SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ - SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ - SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ - SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ - SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ - SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ - SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ - SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ - SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ - SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, \ - SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ - SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ - SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ - SYS___SETUGID = 374 // { int __setugid(int flag); } - SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } - SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ - SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } - SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } - SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ - SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ - SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ - SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ - SYS_KENV = 390 // { int kenv(int what, const char *name, \ - SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ - SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ - SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ - SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ - SYS_STATFS = 396 // { int statfs(char *path, \ - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ - SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ - SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ - SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ - SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ - SYS_SIGACTION = 416 // { int sigaction(int sig, \ - SYS_SIGRETURN = 417 // { int sigreturn( \ - SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( \ - SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ - SYS_SWAPOFF = 424 // { int swapoff(const char *name); } - SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ - SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ - SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ - SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ - SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ - SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ - SYS_THR_EXIT = 431 // { void thr_exit(long *state); } - SYS_THR_SELF = 432 // { int thr_self(long *id); } - SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } - SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } - SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ - SYS_THR_SUSPEND = 442 // { int thr_suspend( \ - SYS_THR_WAKE = 443 // { int thr_wake(long id); } - SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } - SYS_AUDIT = 445 // { int audit(const void *record, \ - SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ - SYS_GETAUID = 447 // { int getauid(uid_t *auid); } - SYS_SETAUID = 448 // { int setauid(uid_t *auid); } - SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } - SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ - SYS_AUDITCTL = 453 // { int auditctl(char *path); } - SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ - SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ - SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } - SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } - SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } - SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ - SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } - SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ - SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ - SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ - SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ - SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ - SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ - SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } - SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } - SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } - SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ - SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } - SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } - SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ - SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ - SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ - SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ - SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ - SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ - SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ - SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ - SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ - SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ - SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } - SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ - SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ - SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ - SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ - SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } - SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } - SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ - SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ - SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } - SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } - SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } - SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); } - SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \ - SYS_CAP_ENTER = 516 // { int cap_enter(void); } - SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } - SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } - SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } - SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } - SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ - SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ - SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } - SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ - SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ - SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ - SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ - SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ - SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ - SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ - SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ - SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ - SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ - SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ - SYS_ACCEPT4 = 541 // { int accept4(int s, \ - SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } - SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ - SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index 57a60ea126..81722ac9f3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,5 +1,5 @@ // mksysnum_freebsd.pl -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd @@ -7,345 +7,347 @@ package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int - SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ - SYS_FORK = 2 // { int fork(void); } - SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ - SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ - SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } - SYS_CLOSE = 6 // { int close(int fd); } - SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ - SYS_LINK = 9 // { int link(char *path, char *link); } - SYS_UNLINK = 10 // { int unlink(char *path); } - SYS_CHDIR = 12 // { int chdir(char *path); } - SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } - SYS_CHMOD = 15 // { int chmod(char *path, int mode); } - SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ - SYS_GETPID = 20 // { pid_t getpid(void); } - SYS_MOUNT = 21 // { int mount(char *type, char *path, \ - SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } - SYS_SETUID = 23 // { int setuid(uid_t uid); } - SYS_GETUID = 24 // { uid_t getuid(void); } - SYS_GETEUID = 25 // { uid_t geteuid(void); } - SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ - SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ - SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ - SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ - SYS_ACCEPT = 30 // { int accept(int s, \ - SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ - SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ - SYS_ACCESS = 33 // { int access(char *path, int amode); } - SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } - SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } - SYS_SYNC = 36 // { int sync(void); } - SYS_KILL = 37 // { int kill(int pid, int signum); } - SYS_GETPPID = 39 // { pid_t getppid(void); } - SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } - SYS_GETEGID = 43 // { gid_t getegid(void); } - SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ - SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ - SYS_GETGID = 47 // { gid_t getgid(void); } - SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ - SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } - SYS_ACCT = 51 // { int acct(char *path); } - SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ - SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ - SYS_REBOOT = 55 // { int reboot(int opt); } - SYS_REVOKE = 56 // { int revoke(char *path); } - SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } - SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ - SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ - SYS_CHROOT = 61 // { int chroot(char *path); } - SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ - SYS_VFORK = 66 // { int vfork(void); } - SYS_SBRK = 69 // { int sbrk(int incr); } - SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ - SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ - SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ - SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ - SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ - SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ - SYS_GETPGRP = 81 // { int getpgrp(void); } - SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } - SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ - SYS_SWAPON = 85 // { int swapon(char *name); } - SYS_GETITIMER = 86 // { int getitimer(u_int which, \ - SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } - SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } - SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } - SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ - SYS_FSYNC = 95 // { int fsync(int fd); } - SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ - SYS_SOCKET = 97 // { int socket(int domain, int type, \ - SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ - SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } - SYS_BIND = 104 // { int bind(int s, caddr_t name, \ - SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ - SYS_LISTEN = 106 // { int listen(int s, int backlog); } - SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ - SYS_GETRUSAGE = 117 // { int getrusage(int who, \ - SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ - SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ - SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ - SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ - SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } - SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } - SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } - SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } - SYS_RENAME = 128 // { int rename(char *from, char *to); } - SYS_FLOCK = 131 // { int flock(int fd, int how); } - SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } - SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ - SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } - SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ - SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } - SYS_RMDIR = 137 // { int rmdir(char *path); } - SYS_UTIMES = 138 // { int utimes(char *path, \ - SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ - SYS_SETSID = 147 // { int setsid(void); } - SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ - SYS_LGETFH = 160 // { int lgetfh(char *fname, \ - SYS_GETFH = 161 // { int getfh(char *fname, \ - SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } - SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ - SYS_SETFIB = 175 // { int setfib(int fibnum); } - SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } - SYS_SETGID = 181 // { int setgid(gid_t gid); } - SYS_SETEGID = 182 // { int setegid(gid_t egid); } - SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } - SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } - SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } - SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ - SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ - SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ - SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } - SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } - SYS_UNDELETE = 205 // { int undelete(char *path); } - SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } - SYS_GETPGID = 207 // { int getpgid(pid_t pid); } - SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ - SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ - SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ - SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ - SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ - SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } - SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ - SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ - SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } - SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ - SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ - SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } - SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ - SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ - SYS_ISSETUGID = 253 // { int issetugid(void); } - SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ - SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } - SYS_LUTIMES = 276 // { int lutimes(char *path, \ - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } - SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ - SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ - SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ - SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, \ - SYS_MODFNEXT = 302 // { int modfnext(int modid); } - SYS_MODFIND = 303 // { int modfind(const char *name); } - SYS_KLDLOAD = 304 // { int kldload(const char *file); } - SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } - SYS_KLDFIND = 306 // { int kldfind(const char *file); } - SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ - SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } - SYS_GETSID = 310 // { int getsid(pid_t pid); } - SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ - SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ - SYS_YIELD = 321 // { int yield(void); } - SYS_MLOCKALL = 324 // { int mlockall(int how); } - SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } - SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ - SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ - SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ - SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } - SYS_SCHED_YIELD = 331 // { int sched_yield (void); } - SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } - SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } - SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ - SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } - SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ - SYS_JAIL = 338 // { int jail(struct jail *jail); } - SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ - SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } - SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } - SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ - SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ - SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ - SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ - SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ - SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ - SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ - SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ - SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ - SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ - SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ - SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ - SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ - SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ - SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, \ - SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ - SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ - SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ - SYS___SETUGID = 374 // { int __setugid(int flag); } - SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } - SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ - SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } - SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } - SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ - SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ - SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ - SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ - SYS_KENV = 390 // { int kenv(int what, const char *name, \ - SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ - SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ - SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ - SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ - SYS_STATFS = 396 // { int statfs(char *path, \ - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ - SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ - SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ - SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ - SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ - SYS_SIGACTION = 416 // { int sigaction(int sig, \ - SYS_SIGRETURN = 417 // { int sigreturn( \ - SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( \ - SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ - SYS_SWAPOFF = 424 // { int swapoff(const char *name); } - SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ - SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ - SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ - SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ - SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ - SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ - SYS_THR_EXIT = 431 // { void thr_exit(long *state); } - SYS_THR_SELF = 432 // { int thr_self(long *id); } - SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } - SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } - SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ - SYS_THR_SUSPEND = 442 // { int thr_suspend( \ - SYS_THR_WAKE = 443 // { int thr_wake(long id); } - SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } - SYS_AUDIT = 445 // { int audit(const void *record, \ - SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ - SYS_GETAUID = 447 // { int getauid(uid_t *auid); } - SYS_SETAUID = 448 // { int setauid(uid_t *auid); } - SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } - SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ - SYS_AUDITCTL = 453 // { int auditctl(char *path); } - SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ - SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ - SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } - SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } - SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } - SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ - SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } - SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ - SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ - SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ - SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ - SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ - SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ - SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } - SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } - SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } - SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ - SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } - SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } - SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ - SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ - SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ - SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ - SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ - SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ - SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ - SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ - SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ - SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ - SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } - SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ - SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ - SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ - SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ - SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } - SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } - SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ - SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ - SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } - SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } - SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } - SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); } - SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \ - SYS_CAP_ENTER = 516 // { int cap_enter(void); } - SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } - SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } - SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } - SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } - SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ - SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ - SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } - SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ - SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ - SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ - SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ - SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ - SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ - SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ - SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ - SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ - SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ - SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ - SYS_ACCEPT4 = 541 // { int accept4(int s, \ - SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } - SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ - SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index 206b9f612d..4488314181 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,5 +1,5 @@ // mksysnum_freebsd.pl -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd @@ -7,345 +7,347 @@ package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int - SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ - SYS_FORK = 2 // { int fork(void); } - SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ - SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ - SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } - SYS_CLOSE = 6 // { int close(int fd); } - SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ - SYS_LINK = 9 // { int link(char *path, char *link); } - SYS_UNLINK = 10 // { int unlink(char *path); } - SYS_CHDIR = 12 // { int chdir(char *path); } - SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } - SYS_CHMOD = 15 // { int chmod(char *path, int mode); } - SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ - SYS_GETPID = 20 // { pid_t getpid(void); } - SYS_MOUNT = 21 // { int mount(char *type, char *path, \ - SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } - SYS_SETUID = 23 // { int setuid(uid_t uid); } - SYS_GETUID = 24 // { uid_t getuid(void); } - SYS_GETEUID = 25 // { uid_t geteuid(void); } - SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ - SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ - SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ - SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ - SYS_ACCEPT = 30 // { int accept(int s, \ - SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ - SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ - SYS_ACCESS = 33 // { int access(char *path, int amode); } - SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } - SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } - SYS_SYNC = 36 // { int sync(void); } - SYS_KILL = 37 // { int kill(int pid, int signum); } - SYS_GETPPID = 39 // { pid_t getppid(void); } - SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } - SYS_GETEGID = 43 // { gid_t getegid(void); } - SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ - SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ - SYS_GETGID = 47 // { gid_t getgid(void); } - SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ - SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } - SYS_ACCT = 51 // { int acct(char *path); } - SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ - SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ - SYS_REBOOT = 55 // { int reboot(int opt); } - SYS_REVOKE = 56 // { int revoke(char *path); } - SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } - SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ - SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ - SYS_CHROOT = 61 // { int chroot(char *path); } - SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ - SYS_VFORK = 66 // { int vfork(void); } - SYS_SBRK = 69 // { int sbrk(int incr); } - SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ - SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ - SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ - SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ - SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ - SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ - SYS_GETPGRP = 81 // { int getpgrp(void); } - SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } - SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ - SYS_SWAPON = 85 // { int swapon(char *name); } - SYS_GETITIMER = 86 // { int getitimer(u_int which, \ - SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } - SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } - SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } - SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ - SYS_FSYNC = 95 // { int fsync(int fd); } - SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ - SYS_SOCKET = 97 // { int socket(int domain, int type, \ - SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ - SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } - SYS_BIND = 104 // { int bind(int s, caddr_t name, \ - SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ - SYS_LISTEN = 106 // { int listen(int s, int backlog); } - SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ - SYS_GETRUSAGE = 117 // { int getrusage(int who, \ - SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ - SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ - SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ - SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ - SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } - SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } - SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } - SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } - SYS_RENAME = 128 // { int rename(char *from, char *to); } - SYS_FLOCK = 131 // { int flock(int fd, int how); } - SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } - SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ - SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } - SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ - SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } - SYS_RMDIR = 137 // { int rmdir(char *path); } - SYS_UTIMES = 138 // { int utimes(char *path, \ - SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ - SYS_SETSID = 147 // { int setsid(void); } - SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ - SYS_LGETFH = 160 // { int lgetfh(char *fname, \ - SYS_GETFH = 161 // { int getfh(char *fname, \ - SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } - SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ - SYS_SETFIB = 175 // { int setfib(int fibnum); } - SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } - SYS_SETGID = 181 // { int setgid(gid_t gid); } - SYS_SETEGID = 182 // { int setegid(gid_t egid); } - SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } - SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } - SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } - SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ - SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ - SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ - SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } - SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } - SYS_UNDELETE = 205 // { int undelete(char *path); } - SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } - SYS_GETPGID = 207 // { int getpgid(pid_t pid); } - SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ - SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ - SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ - SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ - SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ - SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } - SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ - SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ - SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } - SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ - SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ - SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } - SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ - SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ - SYS_ISSETUGID = 253 // { int issetugid(void); } - SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ - SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } - SYS_LUTIMES = 276 // { int lutimes(char *path, \ - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } - SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ - SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ - SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ - SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, \ - SYS_MODFNEXT = 302 // { int modfnext(int modid); } - SYS_MODFIND = 303 // { int modfind(const char *name); } - SYS_KLDLOAD = 304 // { int kldload(const char *file); } - SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } - SYS_KLDFIND = 306 // { int kldfind(const char *file); } - SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ - SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } - SYS_GETSID = 310 // { int getsid(pid_t pid); } - SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ - SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ - SYS_YIELD = 321 // { int yield(void); } - SYS_MLOCKALL = 324 // { int mlockall(int how); } - SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } - SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ - SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ - SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ - SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } - SYS_SCHED_YIELD = 331 // { int sched_yield (void); } - SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } - SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } - SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ - SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } - SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ - SYS_JAIL = 338 // { int jail(struct jail *jail); } - SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ - SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } - SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } - SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ - SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ - SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ - SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ - SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ - SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ - SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ - SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ - SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ - SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ - SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ - SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ - SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ - SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ - SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, \ - SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ - SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ - SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ - SYS___SETUGID = 374 // { int __setugid(int flag); } - SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } - SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ - SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } - SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } - SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ - SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ - SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ - SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ - SYS_KENV = 390 // { int kenv(int what, const char *name, \ - SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ - SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ - SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ - SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ - SYS_STATFS = 396 // { int statfs(char *path, \ - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ - SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ - SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ - SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ - SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ - SYS_SIGACTION = 416 // { int sigaction(int sig, \ - SYS_SIGRETURN = 417 // { int sigreturn( \ - SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( \ - SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ - SYS_SWAPOFF = 424 // { int swapoff(const char *name); } - SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ - SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ - SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ - SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ - SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ - SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ - SYS_THR_EXIT = 431 // { void thr_exit(long *state); } - SYS_THR_SELF = 432 // { int thr_self(long *id); } - SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } - SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } - SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ - SYS_THR_SUSPEND = 442 // { int thr_suspend( \ - SYS_THR_WAKE = 443 // { int thr_wake(long id); } - SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } - SYS_AUDIT = 445 // { int audit(const void *record, \ - SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ - SYS_GETAUID = 447 // { int getauid(uid_t *auid); } - SYS_SETAUID = 448 // { int setauid(uid_t *auid); } - SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } - SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ - SYS_AUDITCTL = 453 // { int auditctl(char *path); } - SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ - SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ - SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } - SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } - SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } - SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ - SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } - SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ - SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ - SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ - SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ - SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ - SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ - SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } - SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } - SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } - SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ - SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } - SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } - SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ - SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ - SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ - SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ - SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ - SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ - SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ - SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ - SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ - SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ - SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } - SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ - SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ - SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ - SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ - SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } - SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } - SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ - SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ - SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } - SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } - SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } - SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); } - SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \ - SYS_CAP_ENTER = 516 // { int cap_enter(void); } - SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } - SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } - SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } - SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } - SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ - SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ - SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } - SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ - SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ - SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ - SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ - SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ - SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ - SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ - SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ - SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ - SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ - SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ - SYS_ACCEPT4 = 541 // { int accept4(int s, \ - SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } - SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ - SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index ba952c6754..95ab12903e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm/unistd_32.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,linux @@ -226,7 +226,6 @@ const ( SYS_PIVOT_ROOT = 217 SYS_MINCORE = 218 SYS_MADVISE = 219 - SYS_MADVISE1 = 219 SYS_GETDENTS64 = 220 SYS_FCNTL64 = 221 SYS_GETTID = 224 @@ -352,4 +351,40 @@ const ( SYS_SETNS = 346 SYS_PROCESS_VM_READV = 347 SYS_PROCESS_VM_WRITEV = 348 + SYS_KCMP = 349 + SYS_FINIT_MODULE = 350 + SYS_SCHED_SETATTR = 351 + SYS_SCHED_GETATTR = 352 + SYS_RENAMEAT2 = 353 + SYS_SECCOMP = 354 + SYS_GETRANDOM = 355 + SYS_MEMFD_CREATE = 356 + SYS_BPF = 357 + SYS_EXECVEAT = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_USERFAULTFD = 374 + SYS_MEMBARRIER = 375 + SYS_MLOCK2 = 376 + SYS_COPY_FILE_RANGE = 377 + SYS_PREADV2 = 378 + SYS_PWRITEV2 = 379 + SYS_PKEY_MPROTECT = 380 + SYS_PKEY_ALLOC = 381 + SYS_PKEY_FREE = 382 + SYS_STATX = 383 + SYS_ARCH_PRCTL = 384 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index ddac31f58a..c5dabf2e45 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm/unistd_64.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,linux @@ -318,4 +318,25 @@ const ( SYS_GETCPU = 309 SYS_PROCESS_VM_READV = 310 SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 + SYS_STATX = 332 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 45ced17fc4..ab7fa5fd39 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -1,13 +1,11 @@ -// mksysnum_linux.pl -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,linux package unix const ( - SYS_OABI_SYSCALL_BASE = 0 - SYS_SYSCALL_BASE = 0 SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 @@ -20,21 +18,16 @@ const ( SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 - SYS_TIME = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 - SYS_UMOUNT = 22 SYS_SETUID = 23 SYS_GETUID = 24 - SYS_STIME = 25 SYS_PTRACE = 26 - SYS_ALARM = 27 SYS_PAUSE = 29 - SYS_UTIME = 30 SYS_ACCESS = 33 SYS_NICE = 34 SYS_SYNC = 36 @@ -69,20 +62,16 @@ const ( SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 - SYS_GETRLIMIT = 76 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_GETGROUPS = 80 SYS_SETGROUPS = 81 - SYS_SELECT = 82 SYS_SYMLINK = 83 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 - SYS_READDIR = 89 - SYS_MMAP = 90 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 @@ -92,7 +81,6 @@ const ( SYS_SETPRIORITY = 97 SYS_STATFS = 99 SYS_FSTATFS = 100 - SYS_SOCKETCALL = 102 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 @@ -100,11 +88,9 @@ const ( SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_VHANGUP = 111 - SYS_SYSCALL = 113 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 - SYS_IPC = 117 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 @@ -353,4 +339,24 @@ const ( SYS_SETNS = 375 SYS_PROCESS_VM_READV = 376 SYS_PROCESS_VM_WRITEV = 377 + SYS_KCMP = 378 + SYS_FINIT_MODULE = 379 + SYS_SCHED_SETATTR = 380 + SYS_SCHED_GETATTR = 381 + SYS_RENAMEAT2 = 382 + SYS_SECCOMP = 383 + SYS_GETRANDOM = 384 + SYS_MEMFD_CREATE = 385 + SYS_BPF = 386 + SYS_EXECVEAT = 387 + SYS_USERFAULTFD = 388 + SYS_MEMBARRIER = 389 + SYS_MLOCK2 = 390 + SYS_COPY_FILE_RANGE = 391 + SYS_PREADV2 = 392 + SYS_PWRITEV2 = 393 + SYS_PKEY_MPROTECT = 394 + SYS_PKEY_ALLOC = 395 + SYS_PKEY_FREE = 396 + SYS_STATX = 397 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 2e9514f280..b1c6b4bd3b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm-generic/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,linux @@ -269,4 +269,18 @@ const ( SYS_SCHED_GETATTR = 275 SYS_RENAMEAT2 = 276 SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 0786867e98..2e9aa7a3e7 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/mips-linux-gnu/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mips,linux @@ -352,8 +352,24 @@ const ( SYS_SETNS = 4344 SYS_PROCESS_VM_READV = 4345 SYS_PROCESS_VM_WRITEV = 4346 - SYS_LINUX_SYSCALLS = 4346 - SYS_O32_LINUX_SYSCALLS = 4346 - SYS_64_LINUX_SYSCALLS = 4305 - SYS_N32_LINUX_SYSCALLS = 4310 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 5ffe1c7191..92827635aa 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64,linux @@ -324,4 +324,12 @@ const ( SYS_EXECVEAT = 5316 SYS_USERFAULTFD = 5317 SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index d192b940ce..45bd3fd6c8 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64le,linux @@ -324,4 +324,12 @@ const ( SYS_EXECVEAT = 5316 SYS_USERFAULTFD = 5317 SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 25d231708f..62ccac4b74 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/mips-linux-gnu/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build mipsle,linux @@ -352,8 +352,24 @@ const ( SYS_SETNS = 4344 SYS_PROCESS_VM_READV = 4345 SYS_PROCESS_VM_WRITEV = 4346 - SYS_LINUX_SYSCALLS = 4346 - SYS_O32_LINUX_SYSCALLS = 4346 - SYS_64_LINUX_SYSCALLS = 4305 - SYS_N32_LINUX_SYSCALLS = 4310 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index e1b08f00d3..dfe5dab67e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64,linux @@ -357,4 +357,14 @@ const ( SYS_GETRANDOM = 359 SYS_MEMFD_CREATE = 360 SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 45e63f51a4..eca97f738b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/powerpc64le-linux-gnu/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64le,linux @@ -350,4 +350,21 @@ const ( SYS_PROCESS_VM_WRITEV = 352 SYS_FINIT_MODULE = 353 SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 42d4f5cda8..8ea18e6c25 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -1,5 +1,5 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. // +build s390x,linux @@ -303,6 +303,11 @@ const ( SYS_RECVMSG = 372 SYS_SHUTDOWN = 373 SYS_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 + SYS_S390_GUARDED_STORAGE = 378 + SYS_STATX = 379 SYS_SELECT = 142 SYS_GETRLIMIT = 191 SYS_LCHOWN = 198 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 46b5bee1db..c9c129dc42 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/sparc64-linux-gnu/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build sparc64,linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go index f60d8f9882..8afda9c451 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -134,6 +134,7 @@ const ( SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go index 48a91d4646..aea8dbec43 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -134,6 +134,7 @@ const ( SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go index 612ba662cb..c6158a7ef9 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -134,6 +134,7 @@ const ( SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go new file mode 100644 index 0000000000..32653e53c7 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -0,0 +1,213 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_SENDSYSLOG = 83 // { int sys_sendsyslog(const void *buf, size_t nbyte); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go index 2de1d44e28..4667c7b277 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -1,6 +1,7 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build 386,darwin -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_darwin.go package unix @@ -445,3 +446,36 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 044657878c..3f33b18fc7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -1,6 +1,7 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build amd64,darwin -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_darwin.go package unix @@ -456,7 +457,35 @@ type Termios struct { Ospeed uint64 } +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + const ( AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 ) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go index 66df363ce5..463a28ba6f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -447,3 +447,36 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index 85d56eabd3..1ec20a0025 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -1,6 +1,7 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build arm64,darwin -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_darwin.go package unix @@ -455,3 +456,36 @@ type Termios struct { Ispeed uint64 Ospeed uint64 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go index 8a6f4e1ce3..1ca0e3ee04 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_dragonfly.go +// cgo -godefs types_dragonfly.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly @@ -324,7 +324,7 @@ type IfData struct { Iqdrops uint64 Noproto uint64 Hwassist uint64 - Unused uint64 + Oqdrops uint64 Lastchange Timeval } @@ -441,3 +441,34 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = 0xfffafdcd + AT_SYMLINK_NOFOLLOW = 0x1 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 8cf30947b4..18f7816009 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -1,6 +1,7 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build 386,freebsd -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_freebsd.go package unix @@ -85,7 +86,7 @@ type Stat_t struct { Ctimespec Timespec Size int64 Blocks int64 - Blksize uint32 + Blksize int32 Flags uint32 Gen uint32 Lspare int32 @@ -288,9 +289,9 @@ type FdSet struct { } const ( - sizeofIfMsghdr = 0x64 + sizeofIfMsghdr = 0xa8 SizeofIfMsghdr = 0x60 - sizeofIfData = 0x54 + sizeofIfData = 0x98 SizeofIfData = 0x50 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 @@ -322,31 +323,31 @@ type IfMsghdr struct { } type ifData struct { - Type uint8 - Physical uint8 - Addrlen uint8 - Hdrlen uint8 - Link_state uint8 - Vhid uint8 - Baudrate_pf uint8 - Datalen uint8 - Mtu uint32 - Metric uint32 - Baudrate uint32 - Ipackets uint32 - Ierrors uint32 - Opackets uint32 - Oerrors uint32 - Collisions uint32 - Ibytes uint32 - Obytes uint32 - Imcasts uint32 - Omcasts uint32 - Iqdrops uint32 - Noproto uint32 - Hwassist uint64 - Epoch int32 - Lastchange Timeval + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte } type IfData struct { @@ -500,3 +501,41 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index e5feb207be..dd0db2a5ea 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -1,6 +1,7 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build amd64,freebsd -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_freebsd.go package unix @@ -85,7 +86,7 @@ type Stat_t struct { Ctimespec Timespec Size int64 Blocks int64 - Blksize uint32 + Blksize int32 Flags uint32 Gen uint32 Lspare int32 @@ -324,31 +325,31 @@ type IfMsghdr struct { } type ifData struct { - Type uint8 - Physical uint8 - Addrlen uint8 - Hdrlen uint8 - Link_state uint8 - Vhid uint8 - Baudrate_pf uint8 - Datalen uint8 - Mtu uint64 - Metric uint64 - Baudrate uint64 - Ipackets uint64 - Ierrors uint64 - Opackets uint64 - Oerrors uint64 - Collisions uint64 - Ibytes uint64 - Obytes uint64 - Imcasts uint64 - Omcasts uint64 - Iqdrops uint64 - Noproto uint64 - Hwassist uint64 - Epoch int64 - Lastchange Timeval + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte } type IfData struct { @@ -503,3 +504,41 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index 5472b54284..473d3dcf08 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -fsigned-char types_freebsd.go +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd @@ -88,7 +88,7 @@ type Stat_t struct { Ctimespec Timespec Size int64 Blocks int64 - Blksize uint32 + Blksize int32 Flags uint32 Gen uint32 Lspare int32 @@ -142,6 +142,15 @@ type Fsid struct { Val [2]int32 } +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + type RawSockaddrInet4 struct { Len uint8 Family uint8 @@ -282,9 +291,9 @@ type FdSet struct { } const ( - sizeofIfMsghdr = 0x70 + sizeofIfMsghdr = 0xa8 SizeofIfMsghdr = 0x70 - sizeofIfData = 0x60 + sizeofIfData = 0x98 SizeofIfData = 0x60 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 @@ -316,31 +325,31 @@ type IfMsghdr struct { } type ifData struct { - Type uint8 - Physical uint8 - Addrlen uint8 - Hdrlen uint8 - Link_state uint8 - Vhid uint8 - Baudrate_pf uint8 - Datalen uint8 - Mtu uint32 - Metric uint32 - Baudrate uint32 - Ipackets uint32 - Ierrors uint32 - Opackets uint32 - Oerrors uint32 - Collisions uint32 - Ibytes uint32 - Obytes uint32 - Imcasts uint32 - Omcasts uint32 - Iqdrops uint32 - Noproto uint32 - Hwassist uint64 - Epoch int64 - Lastchange Timeval + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte } type IfData struct { @@ -495,3 +504,41 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 29b9bf3353..c6de94269d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build 386,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go package unix @@ -151,6 +152,26 @@ type Flock_t struct { Pid int32 } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -218,6 +239,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -256,6 +285,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -267,10 +303,9 @@ type Msghdr struct { } type Cmsghdr struct { - Len uint32 - Level int32 - Type int32 - X__cmsg_data [0]uint8 + Len uint32 + Level int32 + Type int32 } type Inet4Pktinfo struct { @@ -343,10 +378,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc @@ -387,7 +425,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x1d + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -537,7 +575,6 @@ type InotifyEvent struct { Mask uint32 Cookie uint32 Len uint32 - Name [0]int8 } const SizeofInotifyEvent = 0x10 @@ -584,12 +621,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -629,9 +666,13 @@ const ( ) type Sigset_t struct { - X__val [16]uint64 + X__val [32]uint32 } +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -642,3 +683,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index b72cf8ee80..4ea42dfc2e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build amd64,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go package unix @@ -98,21 +99,21 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint32 - Uid uint32 - Gid uint32 - X__pad0 int32 - Rdev uint64 - Size int64 - Blksize int64 - Blocks int64 - Atim Timespec - Mtim Timespec - Ctim Timespec - X__unused [3]int64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad0 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [3]int64 } type Statfs_t struct { @@ -153,6 +154,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -220,6 +241,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -258,6 +287,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -271,10 +307,9 @@ type Msghdr struct { } type Cmsghdr struct { - Len uint64 - Level int32 - Type int32 - X__cmsg_data [0]uint8 + Len uint64 + Level int32 + Type int32 } type Inet4Pktinfo struct { @@ -347,10 +382,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -391,7 +429,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x1d + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -541,7 +579,6 @@ type InotifyEvent struct { Mask uint32 Cookie uint32 Len uint32 - Name [0]int8 } const SizeofInotifyEvent = 0x10 @@ -600,12 +637,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -650,6 +687,10 @@ type Sigset_t struct { X__val [16]uint64 } +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -660,3 +701,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index d5c8bb67b5..f86d683882 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build arm,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go | go run mkpost.go package unix @@ -155,6 +156,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -222,6 +243,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -260,6 +289,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -271,10 +307,9 @@ type Msghdr struct { } type Cmsghdr struct { - Len uint32 - Level int32 - Type int32 - X__cmsg_data [0]uint8 + Len uint32 + Level int32 + Type int32 } type Inet4Pktinfo struct { @@ -347,10 +382,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc @@ -391,7 +429,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x1d + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -541,7 +579,6 @@ type InotifyEvent struct { Mask uint32 Cookie uint32 Len uint32 - Name [0]uint8 } const SizeofInotifyEvent = 0x10 @@ -572,12 +609,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]uint8 - Nodename [65]uint8 - Release [65]uint8 - Version [65]uint8 - Machine [65]uint8 - Domainname [65]uint8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -618,9 +655,13 @@ const ( ) type Sigset_t struct { - X__val [16]uint64 + X__val [32]uint32 } +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -631,3 +672,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 24bd089487..45c10b7429 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build arm64,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -fsigned-char types_linux.go package unix @@ -98,22 +99,22 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Ino uint64 - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint64 - X__pad1 uint64 - Size int64 - Blksize int32 - X__pad2 int32 - Blocks int64 - Atim Timespec - Mtim Timespec - Ctim Timespec - X__glibc_reserved [2]int32 + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad1 uint64 + Size int64 + Blksize int32 + X__pad2 int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 } type Statfs_t struct { @@ -154,6 +155,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -221,6 +242,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -259,6 +288,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -272,10 +308,9 @@ type Msghdr struct { } type Cmsghdr struct { - Len uint64 - Level int32 - Type int32 - X__cmsg_data [0]uint8 + Len uint64 + Level int32 + Type int32 } type Inet4Pktinfo struct { @@ -348,10 +383,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -392,7 +430,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x22 + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -542,7 +580,6 @@ type InotifyEvent struct { Mask uint32 Cookie uint32 Len uint32 - Name [0]int8 } const SizeofInotifyEvent = 0x10 @@ -578,12 +615,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -629,6 +666,10 @@ type Sigset_t struct { X__val [16]uint64 } +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -639,3 +680,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index c5a41ab2d5..4cc0a1c91f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build mips,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go | go run mkpost.go package unix @@ -154,6 +155,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -221,6 +242,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -259,6 +288,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -345,10 +381,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc @@ -389,7 +428,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x1d + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -544,26 +583,13 @@ type InotifyEvent struct { const SizeofInotifyEvent = 0x10 type PtraceRegs struct { - Regs [109]uint32 - U_tsize uint32 - U_dsize uint32 - U_ssize uint32 - Start_code uint32 - Start_data uint32 - Start_stack uint32 - Signal int32 - U_ar0 *byte - Magic uint32 - U_comm [32]int8 -} - -type ptracePsw struct { -} - -type ptraceFpregs struct { -} - -type ptracePer struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 } type FdSet struct { @@ -588,12 +614,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -637,7 +663,9 @@ type Sigset_t struct { X__val [32]uint32 } -const _SC_PAGESIZE = 0x1e +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 @@ -649,3 +677,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 3947c44258..d9df08789f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build mips64,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go package unix @@ -99,7 +100,7 @@ type _Gid_t uint32 type Stat_t struct { Dev uint32 - Pad1 [3]int32 + Pad1 [3]uint32 Ino uint64 Mode uint32 Nlink uint32 @@ -154,6 +155,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -221,6 +242,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -259,6 +288,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -347,10 +383,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -391,7 +430,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x27 + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -546,17 +585,13 @@ type InotifyEvent struct { const SizeofInotifyEvent = 0x10 type PtraceRegs struct { - Regs [102]uint64 - U_tsize uint64 - U_dsize uint64 - U_ssize uint64 - Start_code uint64 - Start_data uint64 - Start_stack uint64 - Signal int64 - U_ar0 uint64 - Magic uint64 - U_comm [32]int8 + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 } type FdSet struct { @@ -583,12 +618,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -633,12 +668,125 @@ type Sigset_t struct { X__val [16]uint64 } +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Line uint8 - Cc [32]uint8 - Pad_cgo_0 [3]byte + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index de8f9c4745..15e6b4b4b1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build mips64le,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go package unix @@ -99,7 +100,7 @@ type _Gid_t uint32 type Stat_t struct { Dev uint32 - Pad1 [3]int32 + Pad1 [3]uint32 Ino uint64 Mode uint32 Nlink uint32 @@ -154,6 +155,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -221,6 +242,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -259,6 +288,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -347,10 +383,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -391,7 +430,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x27 + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -546,17 +585,13 @@ type InotifyEvent struct { const SizeofInotifyEvent = 0x10 type PtraceRegs struct { - Regs [102]uint64 - U_tsize uint64 - U_dsize uint64 - U_ssize uint64 - Start_code uint64 - Start_data uint64 - Start_stack uint64 - Signal int64 - U_ar0 uint64 - Magic uint64 - U_comm [32]int8 + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 } type FdSet struct { @@ -583,12 +618,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -633,12 +668,125 @@ type Sigset_t struct { X__val [16]uint64 } +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Line uint8 - Cc [32]uint8 - Pad_cgo_0 [3]byte + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 5a8957f174..b6c2d32dd8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build mipsle,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go | go run mkpost.go package unix @@ -154,6 +155,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -221,6 +242,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -259,6 +288,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -345,10 +381,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc @@ -389,7 +428,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x2a + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -544,26 +583,13 @@ type InotifyEvent struct { const SizeofInotifyEvent = 0x10 type PtraceRegs struct { - Regs [109]uint32 - U_tsize uint32 - U_dsize uint32 - U_ssize uint32 - Start_code uint32 - Start_data uint32 - Start_stack uint32 - Signal int32 - U_ar0 *byte - Magic uint32 - U_comm [32]int8 -} - -type ptracePsw struct { -} - -type ptraceFpregs struct { -} - -type ptracePer struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 } type FdSet struct { @@ -588,12 +614,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -637,7 +663,9 @@ type Sigset_t struct { X__val [32]uint32 } -const _SC_PAGESIZE = 0x1e +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 @@ -649,3 +677,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 4b8752944f..3803e1062b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build ppc64,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go package unix @@ -98,23 +99,23 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint32 - Uid uint32 - Gid uint32 - X__pad2 int32 - Rdev uint64 - Size int64 - Blksize int64 - Blocks int64 - Atim Timespec - Mtim Timespec - Ctim Timespec - X__glibc_reserved4 uint64 - X__glibc_reserved5 uint64 - X__glibc_reserved6 uint64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad2 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 } type Statfs_t struct { @@ -155,6 +156,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -222,6 +243,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -260,6 +289,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -273,10 +309,9 @@ type Msghdr struct { } type Cmsghdr struct { - Len uint64 - Level int32 - Type int32 - X__cmsg_data [0]uint8 + Len uint64 + Level int32 + Type int32 } type Inet4Pktinfo struct { @@ -349,10 +384,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -393,7 +431,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x23 + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -543,7 +581,6 @@ type InotifyEvent struct { Mask uint32 Cookie uint32 Len uint32 - Name [0]uint8 } const SizeofInotifyEvent = 0x10 @@ -588,12 +625,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]uint8 - Nodename [65]uint8 - Release [65]uint8 - Version [65]uint8 - Machine [65]uint8 - Domainname [65]uint8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -639,6 +676,10 @@ type Sigset_t struct { X__val [16]uint64 } +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -649,3 +690,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 40d51d9707..7ef31fe213 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build ppc64le,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_linux.go package unix @@ -98,23 +99,23 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint32 - Uid uint32 - Gid uint32 - X__pad2 int32 - Rdev uint64 - Size int64 - Blksize int64 - Blocks int64 - Atim Timespec - Mtim Timespec - Ctim Timespec - X__glibc_reserved4 uint64 - X__glibc_reserved5 uint64 - X__glibc_reserved6 uint64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad2 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 } type Statfs_t struct { @@ -155,6 +156,26 @@ type Flock_t struct { Pad_cgo_1 [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -222,6 +243,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -260,6 +289,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -273,10 +309,9 @@ type Msghdr struct { } type Cmsghdr struct { - Len uint64 - Level int32 - Type int32 - X__cmsg_data [0]uint8 + Len uint64 + Level int32 + Type int32 } type Inet4Pktinfo struct { @@ -349,10 +384,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -393,7 +431,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x22 + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -543,7 +581,6 @@ type InotifyEvent struct { Mask uint32 Cookie uint32 Len uint32 - Name [0]uint8 } const SizeofInotifyEvent = 0x10 @@ -588,12 +625,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]uint8 - Nodename [65]uint8 - Release [65]uint8 - Version [65]uint8 - Machine [65]uint8 - Domainname [65]uint8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -639,6 +676,10 @@ type Sigset_t struct { X__val [16]uint64 } +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -649,3 +690,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + Pad_cgo_0 [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Pad_cgo_1 [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + Pad_cgo_2 [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Pad_cgo_3 [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 13f6ea0061..cb194f4717 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1,6 +1,7 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + // +build s390x,linux -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -fsigned-char types_linux.go package unix @@ -154,6 +155,26 @@ type Flock_t struct { _ [4]byte } +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 @@ -207,10 +228,10 @@ type RawSockaddrHCI struct { } type RawSockaddrCAN struct { - Family uint16 - Pad_cgo_0 [2]byte - Ifindex int32 - Addr [8]byte + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte } type RawSockaddrALG struct { @@ -221,6 +242,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -259,6 +288,13 @@ type IPv6Mreq struct { Interface uint32 } +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + type Msghdr struct { Name *byte Namelen uint32 @@ -347,10 +383,13 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc @@ -391,7 +430,7 @@ const ( IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 - IFLA_MAX = 0x27 + IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd @@ -603,12 +642,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -651,9 +690,13 @@ const ( ) type Sigset_t struct { - X__val [16]uint64 + _ [16]uint64 } +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + type Termios struct { Iflag uint32 Oflag uint32 @@ -664,3 +707,111 @@ type Termios struct { Ispeed uint32 Ospeed uint32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 31a97b3c99..9dbbb1ce52 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -226,6 +226,14 @@ type RawSockaddrALG struct { Name [64]uint8 } +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -352,6 +360,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc @@ -592,12 +601,12 @@ type Sysinfo_t struct { } type Utsname struct { - Sysname [65]int8 - Nodename [65]int8 - Release [65]int8 - Version [65]int8 - Machine [65]int8 - Domainname [65]int8 + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte } type Ustat_t struct { @@ -643,8 +652,6 @@ type Sigset_t struct { X__val [16]uint64 } -const _SC_PAGESIZE = 0x1e - type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index caf755fb86..e16c05a8a0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_netbsd.go +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,netbsd @@ -382,6 +382,37 @@ type Termios struct { Ospeed int32 } +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + type Sysctlnode struct { Flags uint32 Num int32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 91b4a5305a..9c3743561f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_netbsd.go +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,netbsd @@ -389,6 +389,37 @@ type Termios struct { Ospeed int32 } +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + type Sysctlnode struct { Flags uint32 Num int32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index c0758f9d3f..1329423184 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_netbsd.go +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,netbsd @@ -387,6 +387,37 @@ type Termios struct { Ospeed int32 } +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + type Sysctlnode struct { Flags uint32 Num int32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 860a469796..2cf08bf495 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_openbsd.go +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,openbsd @@ -439,3 +439,34 @@ type Termios struct { Ispeed int32 Ospeed int32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index 23c52727f7..7cfc61f661 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -1,5 +1,5 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_openbsd.go +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,openbsd @@ -446,3 +446,34 @@ type Termios struct { Ispeed int32 Ospeed int32 } + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go new file mode 100644 index 0000000000..842c59c5c1 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -0,0 +1,465 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]uint8 + F_mntonname [90]uint8 + F_mntfromname [90]uint8 + F_mntfromspec [90]uint8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]uint8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x80 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]uint8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index 02777e4d8d..d445452486 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -1,6 +1,7 @@ -// +build amd64,solaris -// Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_solaris.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris package unix @@ -128,6 +129,24 @@ type Dirent struct { Pad_cgo_0 [5]byte } +type _Fsblkcnt_t uint64 + +type Statvfs_t struct { + Bsize uint64 + Frsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fsid uint64 + Basetype [16]int8 + Flag uint64 + Namemax uint64 + Fstr [32]int8 +} + type RawSockaddrInet4 struct { Family uint16 Port uint16 @@ -244,11 +263,11 @@ type FdSet struct { } type Utsname struct { - Sysname [257]int8 - Nodename [257]int8 - Release [257]int8 - Version [257]int8 - Machine [257]int8 + Sysname [257]byte + Nodename [257]byte + Release [257]byte + Version [257]byte + Machine [257]byte } type Ustat_t struct { @@ -394,8 +413,6 @@ type BpfHdr struct { Pad_cgo_0 [2]byte } -const _SC_PAGESIZE = 0xb - type Termios struct { Iflag uint32 Oflag uint32 @@ -421,3 +438,22 @@ type Winsize struct { Xpixel uint16 Ypixel uint16 } + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/golang.org/x/sys/windows/asm_windows_386.s new file mode 100644 index 0000000000..1c20dd2f89 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/asm_windows_386.s @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +// System calls for 386, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-8 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-4 + JMP syscall·loadlibrary(SB) diff --git a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s new file mode 100644 index 0000000000..4d025ab556 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-32 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-8 + JMP syscall·loadlibrary(SB) diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go new file mode 100644 index 0000000000..e92c05b213 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/dll_windows.go @@ -0,0 +1,378 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import ( + "sync" + "sync/atomic" + "syscall" + "unsafe" +) + +// DLLError describes reasons for DLL load failures. +type DLLError struct { + Err error + ObjName string + Msg string +} + +func (e *DLLError) Error() string { return e.Msg } + +// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. +func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) +func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) + +// A DLL implements access to a single DLL. +type DLL struct { + Name string + Handle Handle +} + +// LoadDLL loads DLL file into memory. +// +// Warning: using LoadDLL without an absolute path name is subject to +// DLL preloading attacks. To safely load a system DLL, use LazyDLL +// with System set to true, or use LoadLibraryEx directly. +func LoadDLL(name string) (dll *DLL, err error) { + namep, err := UTF16PtrFromString(name) + if err != nil { + return nil, err + } + h, e := loadlibrary(namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to load " + name + ": " + e.Error(), + } + } + d := &DLL{ + Name: name, + Handle: Handle(h), + } + return d, nil +} + +// MustLoadDLL is like LoadDLL but panics if load operation failes. +func MustLoadDLL(name string) *DLL { + d, e := LoadDLL(name) + if e != nil { + panic(e) + } + return d +} + +// FindProc searches DLL d for procedure named name and returns *Proc +// if found. It returns an error if search fails. +func (d *DLL) FindProc(name string) (proc *Proc, err error) { + namep, err := BytePtrFromString(name) + if err != nil { + return nil, err + } + a, e := getprocaddress(uintptr(d.Handle), namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(), + } + } + p := &Proc{ + Dll: d, + Name: name, + addr: a, + } + return p, nil +} + +// MustFindProc is like FindProc but panics if search fails. +func (d *DLL) MustFindProc(name string) *Proc { + p, e := d.FindProc(name) + if e != nil { + panic(e) + } + return p +} + +// Release unloads DLL d from memory. +func (d *DLL) Release() (err error) { + return FreeLibrary(d.Handle) +} + +// A Proc implements access to a procedure inside a DLL. +type Proc struct { + Dll *DLL + Name string + addr uintptr +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +func (p *Proc) Addr() uintptr { + return p.addr +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more than 15 arguments +// are supplied. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + switch len(a) { + case 0: + return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0) + case 1: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0) + case 2: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0) + case 3: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2]) + case 4: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0) + case 5: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0) + case 6: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5]) + case 7: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) + case 8: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) + case 9: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) + case 10: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) + case 11: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) + case 12: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) + case 13: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) + case 14: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) + case 15: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) + default: + panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".") + } +} + +// A LazyDLL implements access to a single DLL. +// It will delay the load of the DLL until the first +// call to its Handle method or to one of its +// LazyProc's Addr method. +type LazyDLL struct { + Name string + + // System determines whether the DLL must be loaded from the + // Windows System directory, bypassing the normal DLL search + // path. + System bool + + mu sync.Mutex + dll *DLL // non nil once DLL is loaded +} + +// Load loads DLL file d.Name into memory. It returns an error if fails. +// Load will not try to load DLL, if it is already loaded into memory. +func (d *LazyDLL) Load() error { + // Non-racy version of: + // if d.dll != nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil { + return nil + } + d.mu.Lock() + defer d.mu.Unlock() + if d.dll != nil { + return nil + } + + // kernel32.dll is special, since it's where LoadLibraryEx comes from. + // The kernel already special-cases its name, so it's always + // loaded from system32. + var dll *DLL + var err error + if d.Name == "kernel32.dll" { + dll, err = LoadDLL(d.Name) + } else { + dll, err = loadLibraryEx(d.Name, d.System) + } + if err != nil { + return err + } + + // Non-racy version of: + // d.dll = dll + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll)) + return nil +} + +// mustLoad is like Load but panics if search fails. +func (d *LazyDLL) mustLoad() { + e := d.Load() + if e != nil { + panic(e) + } +} + +// Handle returns d's module handle. +func (d *LazyDLL) Handle() uintptr { + d.mustLoad() + return uintptr(d.dll.Handle) +} + +// NewProc returns a LazyProc for accessing the named procedure in the DLL d. +func (d *LazyDLL) NewProc(name string) *LazyProc { + return &LazyProc{l: d, Name: name} +} + +// NewLazyDLL creates new LazyDLL associated with DLL file. +func NewLazyDLL(name string) *LazyDLL { + return &LazyDLL{Name: name} +} + +// NewLazySystemDLL is like NewLazyDLL, but will only +// search Windows System directory for the DLL if name is +// a base name (like "advapi32.dll"). +func NewLazySystemDLL(name string) *LazyDLL { + return &LazyDLL{Name: name, System: true} +} + +// A LazyProc implements access to a procedure inside a LazyDLL. +// It delays the lookup until the Addr method is called. +type LazyProc struct { + Name string + + mu sync.Mutex + l *LazyDLL + proc *Proc +} + +// Find searches DLL for procedure named p.Name. It returns +// an error if search fails. Find will not search procedure, +// if it is already found and loaded into memory. +func (p *LazyProc) Find() error { + // Non-racy version of: + // if p.proc == nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil { + p.mu.Lock() + defer p.mu.Unlock() + if p.proc == nil { + e := p.l.Load() + if e != nil { + return e + } + proc, e := p.l.dll.FindProc(p.Name) + if e != nil { + return e + } + // Non-racy version of: + // p.proc = proc + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc)) + } + } + return nil +} + +// mustFind is like Find but panics if search fails. +func (p *LazyProc) mustFind() { + e := p.Find() + if e != nil { + panic(e) + } +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +// It will panic if the procedure cannot be found. +func (p *LazyProc) Addr() uintptr { + p.mustFind() + return p.proc.Addr() +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more than 15 arguments +// are supplied. It will also panic if the procedure cannot be found. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + p.mustFind() + return p.proc.Call(a...) +} + +var canDoSearchSystem32Once struct { + sync.Once + v bool +} + +func initCanDoSearchSystem32() { + // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says: + // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows + // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on + // systems that have KB2533623 installed. To determine whether the + // flags are available, use GetProcAddress to get the address of the + // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories + // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_* + // flags can be used with LoadLibraryEx." + canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil) +} + +func canDoSearchSystem32() bool { + canDoSearchSystem32Once.Do(initCanDoSearchSystem32) + return canDoSearchSystem32Once.v +} + +func isBaseName(name string) bool { + for _, c := range name { + if c == ':' || c == '/' || c == '\\' { + return false + } + } + return true +} + +// loadLibraryEx wraps the Windows LoadLibraryEx function. +// +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx +// +// If name is not an absolute path, LoadLibraryEx searches for the DLL +// in a variety of automatic locations unless constrained by flags. +// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx +func loadLibraryEx(name string, system bool) (*DLL, error) { + loadDLL := name + var flags uintptr + if system { + if canDoSearchSystem32() { + const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 + flags = LOAD_LIBRARY_SEARCH_SYSTEM32 + } else if isBaseName(name) { + // WindowsXP or unpatched Windows machine + // trying to load "foo.dll" out of the system + // folder, but LoadLibraryEx doesn't support + // that yet on their system, so emulate it. + windir, _ := Getenv("WINDIR") // old var; apparently works on XP + if windir == "" { + return nil, errString("%WINDIR% not defined") + } + loadDLL = windir + "\\System32\\" + name + } + } + h, err := LoadLibraryEx(loadDLL, 0, flags) + if err != nil { + return nil, err + } + return &DLL{Name: name, Handle: h}, nil +} + +type errString string + +func (s errString) Error() string { return string(s) } diff --git a/vendor/golang.org/x/sys/windows/env_unset.go b/vendor/golang.org/x/sys/windows/env_unset.go new file mode 100644 index 0000000000..b712c6604a --- /dev/null +++ b/vendor/golang.org/x/sys/windows/env_unset.go @@ -0,0 +1,15 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows +// +build go1.4 + +package windows + +import "syscall" + +func Unsetenv(key string) error { + // This was added in Go 1.4. + return syscall.Unsetenv(key) +} diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go new file mode 100644 index 0000000000..e8292386c0 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/env_windows.go @@ -0,0 +1,25 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Windows environment variables. + +package windows + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} diff --git a/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/golang.org/x/sys/windows/eventlog.go new file mode 100644 index 0000000000..40af946e16 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/eventlog.go @@ -0,0 +1,20 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package windows + +const ( + EVENTLOG_SUCCESS = 0 + EVENTLOG_ERROR_TYPE = 1 + EVENTLOG_WARNING_TYPE = 2 + EVENTLOG_INFORMATION_TYPE = 4 + EVENTLOG_AUDIT_SUCCESS = 8 + EVENTLOG_AUDIT_FAILURE = 16 +) + +//sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW +//sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource +//sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go new file mode 100644 index 0000000000..3606c3a8b3 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/exec_windows.go @@ -0,0 +1,97 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Fork, exec, wait, etc. + +package windows + +// EscapeArg rewrites command line argument s as prescribed +// in http://msdn.microsoft.com/en-us/library/ms880421. +// This function returns "" (2 double quotes) if s is empty. +// Alternatively, these transformations are done: +// - every back slash (\) is doubled, but only if immediately +// followed by double quote ("); +// - every double quote (") is escaped by back slash (\); +// - finally, s is wrapped with double quotes (arg -> "arg"), +// but only if there is space or tab inside s. +func EscapeArg(s string) string { + if len(s) == 0 { + return "\"\"" + } + n := len(s) + hasSpace := false + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '\\': + n++ + case ' ', '\t': + hasSpace = true + } + } + if hasSpace { + n += 2 + } + if n == len(s) { + return s + } + + qs := make([]byte, n) + j := 0 + if hasSpace { + qs[j] = '"' + j++ + } + slashes := 0 + for i := 0; i < len(s); i++ { + switch s[i] { + default: + slashes = 0 + qs[j] = s[i] + case '\\': + slashes++ + qs[j] = s[i] + case '"': + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '\\' + j++ + qs[j] = s[i] + } + j++ + } + if hasSpace { + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '"' + j++ + } + return string(qs[:j]) +} + +func CloseOnExec(fd Handle) { + SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) +} + +// FullPath retrieves the full path of the specified file. +func FullPath(name string) (path string, err error) { + p, err := UTF16PtrFromString(name) + if err != nil { + return "", err + } + n := uint32(100) + for { + buf := make([]uint16, n) + n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil) + if err != nil { + return "", err + } + if n <= uint32(len(buf)) { + return UTF16ToString(buf[:n]), nil + } + } +} diff --git a/vendor/golang.org/x/sys/windows/memory_windows.go b/vendor/golang.org/x/sys/windows/memory_windows.go new file mode 100644 index 0000000000..f80a4204f0 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/memory_windows.go @@ -0,0 +1,26 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +const ( + MEM_COMMIT = 0x00001000 + MEM_RESERVE = 0x00002000 + MEM_DECOMMIT = 0x00004000 + MEM_RELEASE = 0x00008000 + MEM_RESET = 0x00080000 + MEM_TOP_DOWN = 0x00100000 + MEM_WRITE_WATCH = 0x00200000 + MEM_PHYSICAL = 0x00400000 + MEM_RESET_UNDO = 0x01000000 + MEM_LARGE_PAGES = 0x20000000 + + PAGE_NOACCESS = 0x01 + PAGE_READONLY = 0x02 + PAGE_READWRITE = 0x04 + PAGE_WRITECOPY = 0x08 + PAGE_EXECUTE_READ = 0x20 + PAGE_EXECUTE_READWRITE = 0x40 + PAGE_EXECUTE_WRITECOPY = 0x80 +) diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go new file mode 100644 index 0000000000..fb7db0ef8d --- /dev/null +++ b/vendor/golang.org/x/sys/windows/mksyscall.go @@ -0,0 +1,7 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go diff --git a/vendor/golang.org/x/sys/windows/race.go b/vendor/golang.org/x/sys/windows/race.go new file mode 100644 index 0000000000..a74e3e24b5 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/race.go @@ -0,0 +1,30 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows,race + +package windows + +import ( + "runtime" + "unsafe" +) + +const raceenabled = true + +func raceAcquire(addr unsafe.Pointer) { + runtime.RaceAcquire(addr) +} + +func raceReleaseMerge(addr unsafe.Pointer) { + runtime.RaceReleaseMerge(addr) +} + +func raceReadRange(addr unsafe.Pointer, len int) { + runtime.RaceReadRange(addr, len) +} + +func raceWriteRange(addr unsafe.Pointer, len int) { + runtime.RaceWriteRange(addr, len) +} diff --git a/vendor/golang.org/x/sys/windows/race0.go b/vendor/golang.org/x/sys/windows/race0.go new file mode 100644 index 0000000000..e44a3cbf67 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/race0.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows,!race + +package windows + +import ( + "unsafe" +) + +const raceenabled = false + +func raceAcquire(addr unsafe.Pointer) { +} + +func raceReleaseMerge(addr unsafe.Pointer) { +} + +func raceReadRange(addr unsafe.Pointer, len int) { +} + +func raceWriteRange(addr unsafe.Pointer, len int) { +} diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go new file mode 100644 index 0000000000..d8e7ff2ec5 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -0,0 +1,435 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import ( + "syscall" + "unsafe" +) + +const ( + STANDARD_RIGHTS_REQUIRED = 0xf0000 + STANDARD_RIGHTS_READ = 0x20000 + STANDARD_RIGHTS_WRITE = 0x20000 + STANDARD_RIGHTS_EXECUTE = 0x20000 + STANDARD_RIGHTS_ALL = 0x1F0000 +) + +const ( + NameUnknown = 0 + NameFullyQualifiedDN = 1 + NameSamCompatible = 2 + NameDisplay = 3 + NameUniqueId = 6 + NameCanonical = 7 + NameUserPrincipal = 8 + NameCanonicalEx = 9 + NameServicePrincipal = 10 + NameDnsDomain = 12 +) + +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx +//sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW +//sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW + +// TranslateAccountName converts a directory service +// object name from one format to another. +func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) { + u, e := UTF16PtrFromString(username) + if e != nil { + return "", e + } + n := uint32(50) + for { + b := make([]uint16, n) + e = TranslateName(u, from, to, &b[0], &n) + if e == nil { + return UTF16ToString(b[:n]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} + +const ( + // do not reorder + NetSetupUnknownStatus = iota + NetSetupUnjoined + NetSetupWorkgroupName + NetSetupDomainName +) + +type UserInfo10 struct { + Name *uint16 + Comment *uint16 + UsrComment *uint16 + FullName *uint16 +} + +//sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo +//sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation +//sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree + +const ( + // do not reorder + SidTypeUser = 1 + iota + SidTypeGroup + SidTypeDomain + SidTypeAlias + SidTypeWellKnownGroup + SidTypeDeletedAccount + SidTypeInvalid + SidTypeUnknown + SidTypeComputer + SidTypeLabel +) + +type SidIdentifierAuthority struct { + Value [6]byte +} + +var ( + SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}} + SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}} + SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}} + SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}} + SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}} + SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}} + SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}} +) + +const ( + SECURITY_NULL_RID = 0 + SECURITY_WORLD_RID = 0 + SECURITY_LOCAL_RID = 0 + SECURITY_CREATOR_OWNER_RID = 0 + SECURITY_CREATOR_GROUP_RID = 1 + SECURITY_DIALUP_RID = 1 + SECURITY_NETWORK_RID = 2 + SECURITY_BATCH_RID = 3 + SECURITY_INTERACTIVE_RID = 4 + SECURITY_LOGON_IDS_RID = 5 + SECURITY_SERVICE_RID = 6 + SECURITY_LOCAL_SYSTEM_RID = 18 + SECURITY_BUILTIN_DOMAIN_RID = 32 + SECURITY_PRINCIPAL_SELF_RID = 10 + SECURITY_CREATOR_OWNER_SERVER_RID = 0x2 + SECURITY_CREATOR_GROUP_SERVER_RID = 0x3 + SECURITY_LOGON_IDS_RID_COUNT = 0x3 + SECURITY_ANONYMOUS_LOGON_RID = 0x7 + SECURITY_PROXY_RID = 0x8 + SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9 + SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID + SECURITY_AUTHENTICATED_USER_RID = 0xb + SECURITY_RESTRICTED_CODE_RID = 0xc + SECURITY_NT_NON_UNIQUE_RID = 0x15 +) + +//sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW +//sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW +//sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW +//sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid +//sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid +//sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid +//sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid +//sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid + +// The security identifier (SID) structure is a variable-length +// structure used to uniquely identify users or groups. +type SID struct{} + +// StringToSid converts a string-format security identifier +// sid into a valid, functional sid. +func StringToSid(s string) (*SID, error) { + var sid *SID + p, e := UTF16PtrFromString(s) + if e != nil { + return nil, e + } + e = ConvertStringSidToSid(p, &sid) + if e != nil { + return nil, e + } + defer LocalFree((Handle)(unsafe.Pointer(sid))) + return sid.Copy() +} + +// LookupSID retrieves a security identifier sid for the account +// and the name of the domain on which the account was found. +// System specify target computer to search. +func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { + if len(account) == 0 { + return nil, "", 0, syscall.EINVAL + } + acc, e := UTF16PtrFromString(account) + if e != nil { + return nil, "", 0, e + } + var sys *uint16 + if len(system) > 0 { + sys, e = UTF16PtrFromString(system) + if e != nil { + return nil, "", 0, e + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]byte, n) + db := make([]uint16, dn) + sid = (*SID)(unsafe.Pointer(&b[0])) + e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType) + if e == nil { + return sid, UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, "", 0, e + } + if n <= uint32(len(b)) { + return nil, "", 0, e + } + } +} + +// String converts sid to a string format +// suitable for display, storage, or transmission. +func (sid *SID) String() (string, error) { + var s *uint16 + e := ConvertSidToStringSid(sid, &s) + if e != nil { + return "", e + } + defer LocalFree((Handle)(unsafe.Pointer(s))) + return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil +} + +// Len returns the length, in bytes, of a valid security identifier sid. +func (sid *SID) Len() int { + return int(GetLengthSid(sid)) +} + +// Copy creates a duplicate of security identifier sid. +func (sid *SID) Copy() (*SID, error) { + b := make([]byte, sid.Len()) + sid2 := (*SID)(unsafe.Pointer(&b[0])) + e := CopySid(uint32(len(b)), sid2, sid) + if e != nil { + return nil, e + } + return sid2, nil +} + +// LookupAccount retrieves the name of the account for this sid +// and the name of the first domain on which this sid is found. +// System specify target computer to search for. +func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { + var sys *uint16 + if len(system) > 0 { + sys, err = UTF16PtrFromString(system) + if err != nil { + return "", "", 0, err + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]uint16, n) + db := make([]uint16, dn) + e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType) + if e == nil { + return UTF16ToString(b), UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", "", 0, e + } + if n <= uint32(len(b)) { + return "", "", 0, e + } + } +} + +const ( + // do not reorder + TOKEN_ASSIGN_PRIMARY = 1 << iota + TOKEN_DUPLICATE + TOKEN_IMPERSONATE + TOKEN_QUERY + TOKEN_QUERY_SOURCE + TOKEN_ADJUST_PRIVILEGES + TOKEN_ADJUST_GROUPS + TOKEN_ADJUST_DEFAULT + + TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | + TOKEN_ASSIGN_PRIMARY | + TOKEN_DUPLICATE | + TOKEN_IMPERSONATE | + TOKEN_QUERY | + TOKEN_QUERY_SOURCE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY + TOKEN_WRITE = STANDARD_RIGHTS_WRITE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE +) + +const ( + // do not reorder + TokenUser = 1 + iota + TokenGroups + TokenPrivileges + TokenOwner + TokenPrimaryGroup + TokenDefaultDacl + TokenSource + TokenType + TokenImpersonationLevel + TokenStatistics + TokenRestrictedSids + TokenSessionId + TokenGroupsAndPrivileges + TokenSessionReference + TokenSandBoxInert + TokenAuditPolicy + TokenOrigin + TokenElevationType + TokenLinkedToken + TokenElevation + TokenHasRestrictions + TokenAccessInformation + TokenVirtualizationAllowed + TokenVirtualizationEnabled + TokenIntegrityLevel + TokenUIAccess + TokenMandatoryPolicy + TokenLogonSid + MaxTokenInfoClass +) + +type SIDAndAttributes struct { + Sid *SID + Attributes uint32 +} + +type Tokenuser struct { + User SIDAndAttributes +} + +type Tokenprimarygroup struct { + PrimaryGroup *SID +} + +type Tokengroups struct { + GroupCount uint32 + Groups [1]SIDAndAttributes +} + +//sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken +//sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation +//sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW + +// An access token contains the security information for a logon session. +// The system creates an access token when a user logs on, and every +// process executed on behalf of the user has a copy of the token. +// The token identifies the user, the user's groups, and the user's +// privileges. The system uses the token to control access to securable +// objects and to control the ability of the user to perform various +// system-related operations on the local computer. +type Token Handle + +// OpenCurrentProcessToken opens the access token +// associated with current process. +func OpenCurrentProcessToken() (Token, error) { + p, e := GetCurrentProcess() + if e != nil { + return 0, e + } + var t Token + e = OpenProcessToken(p, TOKEN_QUERY, &t) + if e != nil { + return 0, e + } + return t, nil +} + +// Close releases access to access token. +func (t Token) Close() error { + return CloseHandle(Handle(t)) +} + +// getInfo retrieves a specified type of information about an access token. +func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) { + n := uint32(initSize) + for { + b := make([]byte, n) + e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n) + if e == nil { + return unsafe.Pointer(&b[0]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, e + } + if n <= uint32(len(b)) { + return nil, e + } + } +} + +// GetTokenUser retrieves access token t user account information. +func (t Token) GetTokenUser() (*Tokenuser, error) { + i, e := t.getInfo(TokenUser, 50) + if e != nil { + return nil, e + } + return (*Tokenuser)(i), nil +} + +// GetTokenGroups retrieves group accounts associated with access token t. +func (t Token) GetTokenGroups() (*Tokengroups, error) { + i, e := t.getInfo(TokenGroups, 50) + if e != nil { + return nil, e + } + return (*Tokengroups)(i), nil +} + +// GetTokenPrimaryGroup retrieves access token t primary group information. +// A pointer to a SID structure representing a group that will become +// the primary group of any objects created by a process using this access token. +func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) { + i, e := t.getInfo(TokenPrimaryGroup, 50) + if e != nil { + return nil, e + } + return (*Tokenprimarygroup)(i), nil +} + +// GetUserProfileDirectory retrieves path to the +// root directory of the access token t user's profile. +func (t Token) GetUserProfileDirectory() (string, error) { + n := uint32(100) + for { + b := make([]uint16, n) + e := GetUserProfileDirectory(t, &b[0], &n) + if e == nil { + return UTF16ToString(b), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go new file mode 100644 index 0000000000..a500dd7dfc --- /dev/null +++ b/vendor/golang.org/x/sys/windows/service.go @@ -0,0 +1,164 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package windows + +const ( + SC_MANAGER_CONNECT = 1 + SC_MANAGER_CREATE_SERVICE = 2 + SC_MANAGER_ENUMERATE_SERVICE = 4 + SC_MANAGER_LOCK = 8 + SC_MANAGER_QUERY_LOCK_STATUS = 16 + SC_MANAGER_MODIFY_BOOT_CONFIG = 32 + SC_MANAGER_ALL_ACCESS = 0xf003f +) + +//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW + +const ( + SERVICE_KERNEL_DRIVER = 1 + SERVICE_FILE_SYSTEM_DRIVER = 2 + SERVICE_ADAPTER = 4 + SERVICE_RECOGNIZER_DRIVER = 8 + SERVICE_WIN32_OWN_PROCESS = 16 + SERVICE_WIN32_SHARE_PROCESS = 32 + SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS = 256 + SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER + SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS + + SERVICE_BOOT_START = 0 + SERVICE_SYSTEM_START = 1 + SERVICE_AUTO_START = 2 + SERVICE_DEMAND_START = 3 + SERVICE_DISABLED = 4 + + SERVICE_ERROR_IGNORE = 0 + SERVICE_ERROR_NORMAL = 1 + SERVICE_ERROR_SEVERE = 2 + SERVICE_ERROR_CRITICAL = 3 + + SC_STATUS_PROCESS_INFO = 0 + + SERVICE_STOPPED = 1 + SERVICE_START_PENDING = 2 + SERVICE_STOP_PENDING = 3 + SERVICE_RUNNING = 4 + SERVICE_CONTINUE_PENDING = 5 + SERVICE_PAUSE_PENDING = 6 + SERVICE_PAUSED = 7 + SERVICE_NO_CHANGE = 0xffffffff + + SERVICE_ACCEPT_STOP = 1 + SERVICE_ACCEPT_PAUSE_CONTINUE = 2 + SERVICE_ACCEPT_SHUTDOWN = 4 + SERVICE_ACCEPT_PARAMCHANGE = 8 + SERVICE_ACCEPT_NETBINDCHANGE = 16 + SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 + SERVICE_ACCEPT_POWEREVENT = 64 + SERVICE_ACCEPT_SESSIONCHANGE = 128 + + SERVICE_CONTROL_STOP = 1 + SERVICE_CONTROL_PAUSE = 2 + SERVICE_CONTROL_CONTINUE = 3 + SERVICE_CONTROL_INTERROGATE = 4 + SERVICE_CONTROL_SHUTDOWN = 5 + SERVICE_CONTROL_PARAMCHANGE = 6 + SERVICE_CONTROL_NETBINDADD = 7 + SERVICE_CONTROL_NETBINDREMOVE = 8 + SERVICE_CONTROL_NETBINDENABLE = 9 + SERVICE_CONTROL_NETBINDDISABLE = 10 + SERVICE_CONTROL_DEVICEEVENT = 11 + SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 + SERVICE_CONTROL_POWEREVENT = 13 + SERVICE_CONTROL_SESSIONCHANGE = 14 + + SERVICE_ACTIVE = 1 + SERVICE_INACTIVE = 2 + SERVICE_STATE_ALL = 3 + + SERVICE_QUERY_CONFIG = 1 + SERVICE_CHANGE_CONFIG = 2 + SERVICE_QUERY_STATUS = 4 + SERVICE_ENUMERATE_DEPENDENTS = 8 + SERVICE_START = 16 + SERVICE_STOP = 32 + SERVICE_PAUSE_CONTINUE = 64 + SERVICE_INTERROGATE = 128 + SERVICE_USER_DEFINED_CONTROL = 256 + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL + SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 + SERVICE_CONFIG_DESCRIPTION = 1 + SERVICE_CONFIG_FAILURE_ACTIONS = 2 + + NO_ERROR = 0 + + SC_ENUM_PROCESS_INFO = 0 +) + +type SERVICE_STATUS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 +} + +type SERVICE_TABLE_ENTRY struct { + ServiceName *uint16 + ServiceProc uintptr +} + +type QUERY_SERVICE_CONFIG struct { + ServiceType uint32 + StartType uint32 + ErrorControl uint32 + BinaryPathName *uint16 + LoadOrderGroup *uint16 + TagId uint32 + Dependencies *uint16 + ServiceStartName *uint16 + DisplayName *uint16 +} + +type SERVICE_DESCRIPTION struct { + Description *uint16 +} + +type SERVICE_STATUS_PROCESS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 + ProcessId uint32 + ServiceFlags uint32 +} + +type ENUM_SERVICE_STATUS_PROCESS struct { + ServiceName *uint16 + DisplayName *uint16 + ServiceStatusProcess SERVICE_STATUS_PROCESS +} + +//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle +//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW +//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW +//sys DeleteService(service Handle) (err error) = advapi32.DeleteService +//sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW +//sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus +//sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService +//sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW +//sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus +//sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW +//sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW +//sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W +//sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W +//sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW diff --git a/vendor/golang.org/x/sys/windows/str.go b/vendor/golang.org/x/sys/windows/str.go new file mode 100644 index 0000000000..917cc2aae4 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/str.go @@ -0,0 +1,22 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package windows + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + itoa(-val) + } + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/vendor/golang.org/x/sys/windows/syscall.go b/vendor/golang.org/x/sys/windows/syscall.go new file mode 100644 index 0000000000..b07bc2305d --- /dev/null +++ b/vendor/golang.org/x/sys/windows/syscall.go @@ -0,0 +1,71 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package windows contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display syscall documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package windows // import "golang.org/x/sys/windows" + +import ( + "syscall" +) + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go new file mode 100644 index 0000000000..f48fec60d4 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -0,0 +1,1093 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Windows system calls. + +package windows + +import ( + errorspkg "errors" + "sync" + "syscall" + "unicode/utf16" + "unsafe" +) + +type Handle uintptr + +const InvalidHandle = ^Handle(0) + +// StringToUTF16 is deprecated. Use UTF16FromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16(s string) []uint16 { + a, err := UTF16FromString(s) + if err != nil { + panic("windows: string with NUL passed to StringToUTF16") + } + return a +} + +// UTF16FromString returns the UTF-16 encoding of the UTF-8 string +// s, with a terminating NUL added. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func UTF16FromString(s string) ([]uint16, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + return utf16.Encode([]rune(s + "\x00")), nil +} + +// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, +// with a terminating NUL removed. +func UTF16ToString(s []uint16) string { + for i, v := range s { + if v == 0 { + s = s[0:i] + break + } + } + return string(utf16.Decode(s)) +} + +// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] } + +// UTF16PtrFromString returns pointer to the UTF-16 encoding of +// the UTF-8 string s, with a terminating NUL added. If s +// contains a NUL byte at any location, it returns (nil, syscall.EINVAL). +func UTF16PtrFromString(s string) (*uint16, error) { + a, err := UTF16FromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +func Getpagesize() int { return 4096 } + +// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallback(fn interface{}) uintptr { + return syscall.NewCallback(fn) +} + +// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallbackCDecl(fn interface{}) uintptr { + return syscall.NewCallbackCDecl(fn) +} + +// windows api calls + +//sys GetLastError() (lasterr error) +//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW +//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW +//sys FreeLibrary(handle Handle) (err error) +//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error) +//sys GetVersion() (ver uint32, err error) +//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW +//sys ExitProcess(exitcode uint32) +//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW +//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] +//sys CloseHandle(handle Handle) (err error) +//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] +//sys SetStdHandle(stdhandle uint32, handle Handle) (err error) +//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW +//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW +//sys FindClose(handle Handle) (err error) +//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) +//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW +//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW +//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW +//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW +//sys DeleteFile(path *uint16) (err error) = DeleteFileW +//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW +//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW +//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW +//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW +//sys SetEndOfFile(handle Handle) (err error) +//sys GetSystemTimeAsFileTime(time *Filetime) +//sys GetSystemTimePreciseAsFileTime(time *Filetime) +//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] +//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) +//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) +//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) +//sys CancelIo(s Handle) (err error) +//sys CancelIoEx(s Handle, o *Overlapped) (err error) +//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW +//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) +//sys TerminateProcess(handle Handle, exitcode uint32) (err error) +//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) +//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW +//sys GetCurrentProcess() (pseudoHandle Handle, err error) +//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) +//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) +//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] +//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW +//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) +//sys GetFileType(filehandle Handle) (n uint32, err error) +//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW +//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext +//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom +//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW +//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW +//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW +//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW +//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) +//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW +//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW +//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW +//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW +//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW +//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] +//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) +//sys FlushFileBuffers(handle Handle) (err error) +//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW +//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW +//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW +//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW +//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) +//sys UnmapViewOfFile(addr uintptr) (err error) +//sys FlushViewOfFile(addr uintptr, length uintptr) (err error) +//sys VirtualLock(addr uintptr, length uintptr) (err error) +//sys VirtualUnlock(addr uintptr, length uintptr) (err error) +//sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc +//sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree +//sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect +//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile +//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW +//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW +//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore +//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore +//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore +//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore +//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain +//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain +//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext +//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext +//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy +//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW +//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey +//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW +//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW +//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW +//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId +//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode +//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode +//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo +//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW +//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot +//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW +//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW +//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW +//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW +//sys GetCurrentThreadId() (id uint32) +//sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW +//sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW +//sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW +//sys SetEvent(event Handle) (err error) = kernel32.SetEvent +//sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent +//sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent + +// syscall interface implementation for other packages + +// GetProcAddressByOrdinal retrieves the address of the exported +// function from module by ordinal. +func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Exit(code int) { ExitProcess(uint32(code)) } + +func makeInheritSa() *SecurityAttributes { + var sa SecurityAttributes + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + return &sa +} + +func Open(path string, mode int, perm uint32) (fd Handle, err error) { + if len(path) == 0 { + return InvalidHandle, ERROR_FILE_NOT_FOUND + } + pathp, err := UTF16PtrFromString(path) + if err != nil { + return InvalidHandle, err + } + var access uint32 + switch mode & (O_RDONLY | O_WRONLY | O_RDWR) { + case O_RDONLY: + access = GENERIC_READ + case O_WRONLY: + access = GENERIC_WRITE + case O_RDWR: + access = GENERIC_READ | GENERIC_WRITE + } + if mode&O_CREAT != 0 { + access |= GENERIC_WRITE + } + if mode&O_APPEND != 0 { + access &^= GENERIC_WRITE + access |= FILE_APPEND_DATA + } + sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE) + var sa *SecurityAttributes + if mode&O_CLOEXEC == 0 { + sa = makeInheritSa() + } + var createmode uint32 + switch { + case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL): + createmode = CREATE_NEW + case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC): + createmode = CREATE_ALWAYS + case mode&O_CREAT == O_CREAT: + createmode = OPEN_ALWAYS + case mode&O_TRUNC == O_TRUNC: + createmode = TRUNCATE_EXISTING + default: + createmode = OPEN_EXISTING + } + h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) + return h, e +} + +func Read(fd Handle, p []byte) (n int, err error) { + var done uint32 + e := ReadFile(fd, p, &done, nil) + if e != nil { + if e == ERROR_BROKEN_PIPE { + // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin + return 0, nil + } + return 0, e + } + if raceenabled { + if done > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), int(done)) + } + raceAcquire(unsafe.Pointer(&ioSync)) + } + return int(done), nil +} + +func Write(fd Handle, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + var done uint32 + e := WriteFile(fd, p, &done, nil) + if e != nil { + return 0, e + } + if raceenabled && done > 0 { + raceReadRange(unsafe.Pointer(&p[0]), int(done)) + } + return int(done), nil +} + +var ioSync int64 + +func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { + var w uint32 + switch whence { + case 0: + w = FILE_BEGIN + case 1: + w = FILE_CURRENT + case 2: + w = FILE_END + } + hi := int32(offset >> 32) + lo := int32(offset) + // use GetFileType to check pipe, pipe can't do seek + ft, _ := GetFileType(fd) + if ft == FILE_TYPE_PIPE { + return 0, syscall.EPIPE + } + rlo, e := SetFilePointer(fd, lo, &hi, w) + if e != nil { + return 0, e + } + return int64(hi)<<32 + int64(rlo), nil +} + +func Close(fd Handle) (err error) { + return CloseHandle(fd) +} + +var ( + Stdin = getStdHandle(STD_INPUT_HANDLE) + Stdout = getStdHandle(STD_OUTPUT_HANDLE) + Stderr = getStdHandle(STD_ERROR_HANDLE) +) + +func getStdHandle(stdhandle uint32) (fd Handle) { + r, _ := GetStdHandle(stdhandle) + CloseOnExec(r) + return r +} + +const ImplementsGetwd = true + +func Getwd() (wd string, err error) { + b := make([]uint16, 300) + n, e := GetCurrentDirectory(uint32(len(b)), &b[0]) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Chdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return SetCurrentDirectory(pathp) +} + +func Mkdir(path string, mode uint32) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return CreateDirectory(pathp, nil) +} + +func Rmdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return RemoveDirectory(pathp) +} + +func Unlink(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return DeleteFile(pathp) +} + +func Rename(oldpath, newpath string) (err error) { + from, err := UTF16PtrFromString(oldpath) + if err != nil { + return err + } + to, err := UTF16PtrFromString(newpath) + if err != nil { + return err + } + return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) +} + +func ComputerName() (name string, err error) { + var n uint32 = MAX_COMPUTERNAME_LENGTH + 1 + b := make([]uint16, n) + e := GetComputerName(&b[0], &n) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Ftruncate(fd Handle, length int64) (err error) { + curoffset, e := Seek(fd, 0, 1) + if e != nil { + return e + } + defer Seek(fd, curoffset, 0) + _, e = Seek(fd, length, 0) + if e != nil { + return e + } + e = SetEndOfFile(fd) + if e != nil { + return e + } + return nil +} + +func Gettimeofday(tv *Timeval) (err error) { + var ft Filetime + GetSystemTimeAsFileTime(&ft) + *tv = NsecToTimeval(ft.Nanoseconds()) + return nil +} + +func Pipe(p []Handle) (err error) { + if len(p) != 2 { + return syscall.EINVAL + } + var r, w Handle + e := CreatePipe(&r, &w, makeInheritSa(), 0) + if e != nil { + return e + } + p[0] = r + p[1] = w + return nil +} + +func Utimes(path string, tv []Timeval) (err error) { + if len(tv) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(tv[0].Nanoseconds()) + w := NsecToFiletime(tv[1].Nanoseconds()) + return SetFileTime(h, nil, &a, &w) +} + +func UtimesNano(path string, ts []Timespec) (err error) { + if len(ts) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(TimespecToNsec(ts[0])) + w := NsecToFiletime(TimespecToNsec(ts[1])) + return SetFileTime(h, nil, &a, &w) +} + +func Fsync(fd Handle) (err error) { + return FlushFileBuffers(fd) +} + +func Chmod(path string, mode uint32) (err error) { + if mode == 0 { + return syscall.EINVAL + } + p, e := UTF16PtrFromString(path) + if e != nil { + return e + } + attrs, e := GetFileAttributes(p) + if e != nil { + return e + } + if mode&S_IWRITE != 0 { + attrs &^= FILE_ATTRIBUTE_READONLY + } else { + attrs |= FILE_ATTRIBUTE_READONLY + } + return SetFileAttributes(p, attrs) +} + +func LoadGetSystemTimePreciseAsFileTime() error { + return procGetSystemTimePreciseAsFileTime.Find() +} + +func LoadCancelIoEx() error { + return procCancelIoEx.Find() +} + +func LoadSetFileCompletionNotificationModes() error { + return procSetFileCompletionNotificationModes.Find() +} + +// net api calls + +const socket_error = uintptr(^uint32(0)) + +//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup +//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup +//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl +//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket +//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt +//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt +//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind +//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect +//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname +//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername +//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen +//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown +//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket +//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx +//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs +//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv +//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend +//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom +//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo +//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname +//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname +//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs +//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname +//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W +//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree +//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W +//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW +//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW +//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry +//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo +//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes +//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW +//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses +//sys GetACP() (acp uint32) = kernel32.GetACP +//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs +} + +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrUnix struct { + Name string +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { + // TODO(brainman): implement SockaddrUnix.sockaddr() + return nil, 0, syscall.EWINDOWS +} + +func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + return nil, syscall.EWINDOWS + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, syscall.EAFNOSUPPORT +} + +func Socket(domain, typ, proto int) (fd Handle, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return InvalidHandle, syscall.EAFNOSUPPORT + } + return socket(int32(domain), int32(typ), int32(proto)) +} + +func SetsockoptInt(fd Handle, level, opt int, value int) (err error) { + v := int32(value) + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v))) +} + +func Bind(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getsockname(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getsockname(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Getpeername(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getpeername(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Listen(s Handle, n int) (err error) { + return listen(s, int32(n)) +} + +func Shutdown(fd Handle, how int) (err error) { + return shutdown(fd, int32(how)) +} + +func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { + rsa, l, err := to.sockaddr() + if err != nil { + return err + } + return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) +} + +func LoadGetAddrInfo() error { + return procGetAddrInfoW.Find() +} + +var connectExFunc struct { + once sync.Once + addr uintptr + err error +} + +func LoadConnectEx() error { + connectExFunc.once.Do(func() { + var s Handle + s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) + if connectExFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + connectExFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), + uint32(unsafe.Sizeof(WSAID_CONNECTEX)), + (*byte)(unsafe.Pointer(&connectExFunc.addr)), + uint32(unsafe.Sizeof(connectExFunc.addr)), + &n, nil, 0) + }) + return connectExFunc.err +} + +func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error { + err := LoadConnectEx() + if err != nil { + return errorspkg.New("failed to find ConnectEx: " + err.Error()) + } + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped) +} + +var sendRecvMsgFunc struct { + once sync.Once + sendAddr uintptr + recvAddr uintptr + err error +} + +func loadWSASendRecvMsg() error { + sendRecvMsgFunc.once.Do(func() { + var s Handle + s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) + if sendRecvMsgFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + sendRecvMsgFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)), + uint32(unsafe.Sizeof(WSAID_WSARECVMSG)), + (*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)), + uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)), + &n, nil, 0) + if sendRecvMsgFunc.err != nil { + return + } + sendRecvMsgFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)), + uint32(unsafe.Sizeof(WSAID_WSASENDMSG)), + (*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)), + uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)), + &n, nil, 0) + }) + return sendRecvMsgFunc.err +} + +func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error { + err := loadWSASendRecvMsg() + if err != nil { + return err + } + r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return err +} + +func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error { + err := loadWSASendRecvMsg() + if err != nil { + return err + } + r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return err +} + +// Invented structures to support what package os expects. +type Rusage struct { + CreationTime Filetime + ExitTime Filetime + KernelTime Filetime + UserTime Filetime +} + +type WaitStatus struct { + ExitCode uint32 +} + +func (w WaitStatus) Exited() bool { return true } + +func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) } + +func (w WaitStatus) Signal() Signal { return -1 } + +func (w WaitStatus) CoreDump() bool { return false } + +func (w WaitStatus) Stopped() bool { return false } + +func (w WaitStatus) Continued() bool { return false } + +func (w WaitStatus) StopSignal() Signal { return -1 } + +func (w WaitStatus) Signaled() bool { return false } + +func (w WaitStatus) TrapCause() int { return -1 } + +// Timespec is an invented structure on Windows, but here for +// consistency with the corresponding package for other operating systems. +type Timespec struct { + Sec int64 + Nsec int64 +} + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +// TODO(brainman): fix all needed for net + +func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } +func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { + return 0, nil, syscall.EWINDOWS +} +func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS } +func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } + +// The Linger struct is wrong but we only noticed after Go 1. +// sysLinger is the real system call structure. + +// BUG(brainman): The definition of Linger is not appropriate for direct use +// with Setsockopt and Getsockopt. +// Use SetsockoptLinger instead. + +type Linger struct { + Onoff int32 + Linger int32 +} + +type sysLinger struct { + Onoff uint16 + Linger uint16 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS } + +func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { + sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys))) +} + +func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4) +} +func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq))) +} +func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { + return syscall.EWINDOWS +} + +func Getpid() (pid int) { return int(getCurrentProcessId()) } + +func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { + // NOTE(rsc): The Win32finddata struct is wrong for the system call: + // the two paths are each one uint16 short. Use the correct struct, + // a win32finddata1, and then copy the results out. + // There is no loss of expressivity here, because the final + // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that. + // For Go 1.1, we might avoid the allocation of win32finddata1 here + // by adding a final Bug [2]uint16 field to the struct and then + // adjusting the fields in the result directly. + var data1 win32finddata1 + handle, err = findFirstFile1(name, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func FindNextFile(handle Handle, data *Win32finddata) (err error) { + var data1 win32finddata1 + err = findNextFile1(handle, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func getProcessEntry(pid int) (*ProcessEntry32, error) { + snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) + if err != nil { + return nil, err + } + defer CloseHandle(snapshot) + var procEntry ProcessEntry32 + procEntry.Size = uint32(unsafe.Sizeof(procEntry)) + if err = Process32First(snapshot, &procEntry); err != nil { + return nil, err + } + for { + if procEntry.ProcessID == uint32(pid) { + return &procEntry, nil + } + err = Process32Next(snapshot, &procEntry) + if err != nil { + return nil, err + } + } +} + +func Getppid() (ppid int) { + pe, err := getProcessEntry(Getpid()) + if err != nil { + return -1 + } + return int(pe.ParentProcessID) +} + +// TODO(brainman): fix all needed for os +func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS } +func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS } +func Symlink(path, link string) (err error) { return syscall.EWINDOWS } + +func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS } +func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS } + +func Getuid() (uid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getegid() (egid int) { return -1 } +func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS } + +type Signal int + +func (s Signal) Signal() {} + +func (s Signal) String() string { + if 0 <= s && int(s) < len(signals) { + str := signals[s] + if str != "" { + return str + } + } + return "signal " + itoa(int(s)) +} + +func LoadCreateSymbolicLink() error { + return procCreateSymbolicLinkW.Find() +} + +// Readlink returns the destination of the named symbolic link. +func Readlink(path string, buf []byte) (n int, err error) { + fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0) + if err != nil { + return -1, err + } + defer CloseHandle(fd) + + rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE) + var bytesReturned uint32 + err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) + if err != nil { + return -1, err + } + + rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0])) + var s string + switch rdb.ReparseTag { + case IO_REPARSE_TAG_SYMLINK: + data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + case IO_REPARSE_TAG_MOUNT_POINT: + data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + default: + // the path is not a symlink or junction but another type of reparse + // point + return -1, syscall.ENOENT + } + n = copy(buf, []byte(s)) + + return n, nil +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go new file mode 100644 index 0000000000..78b714c0da --- /dev/null +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -0,0 +1,1316 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import "syscall" + +const ( + // Windows errors. + ERROR_FILE_NOT_FOUND syscall.Errno = 2 + ERROR_PATH_NOT_FOUND syscall.Errno = 3 + ERROR_ACCESS_DENIED syscall.Errno = 5 + ERROR_NO_MORE_FILES syscall.Errno = 18 + ERROR_HANDLE_EOF syscall.Errno = 38 + ERROR_NETNAME_DELETED syscall.Errno = 64 + ERROR_FILE_EXISTS syscall.Errno = 80 + ERROR_BROKEN_PIPE syscall.Errno = 109 + ERROR_BUFFER_OVERFLOW syscall.Errno = 111 + ERROR_INSUFFICIENT_BUFFER syscall.Errno = 122 + ERROR_MOD_NOT_FOUND syscall.Errno = 126 + ERROR_PROC_NOT_FOUND syscall.Errno = 127 + ERROR_ALREADY_EXISTS syscall.Errno = 183 + ERROR_ENVVAR_NOT_FOUND syscall.Errno = 203 + ERROR_MORE_DATA syscall.Errno = 234 + ERROR_OPERATION_ABORTED syscall.Errno = 995 + ERROR_IO_PENDING syscall.Errno = 997 + ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066 + ERROR_NOT_FOUND syscall.Errno = 1168 + ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 + WSAEACCES syscall.Errno = 10013 + WSAEMSGSIZE syscall.Errno = 10040 + WSAECONNRESET syscall.Errno = 10054 +) + +const ( + // Invented values to support what package os expects. + O_RDONLY = 0x00000 + O_WRONLY = 0x00001 + O_RDWR = 0x00002 + O_CREAT = 0x00040 + O_EXCL = 0x00080 + O_NOCTTY = 0x00100 + O_TRUNC = 0x00200 + O_NONBLOCK = 0x00800 + O_APPEND = 0x00400 + O_SYNC = 0x01000 + O_ASYNC = 0x02000 + O_CLOEXEC = 0x80000 +) + +const ( + // More invented values for signals + SIGHUP = Signal(0x1) + SIGINT = Signal(0x2) + SIGQUIT = Signal(0x3) + SIGILL = Signal(0x4) + SIGTRAP = Signal(0x5) + SIGABRT = Signal(0x6) + SIGBUS = Signal(0x7) + SIGFPE = Signal(0x8) + SIGKILL = Signal(0x9) + SIGSEGV = Signal(0xb) + SIGPIPE = Signal(0xd) + SIGALRM = Signal(0xe) + SIGTERM = Signal(0xf) +) + +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", +} + +const ( + GENERIC_READ = 0x80000000 + GENERIC_WRITE = 0x40000000 + GENERIC_EXECUTE = 0x20000000 + GENERIC_ALL = 0x10000000 + + FILE_LIST_DIRECTORY = 0x00000001 + FILE_APPEND_DATA = 0x00000004 + FILE_WRITE_ATTRIBUTES = 0x00000100 + + FILE_SHARE_READ = 0x00000001 + FILE_SHARE_WRITE = 0x00000002 + FILE_SHARE_DELETE = 0x00000004 + FILE_ATTRIBUTE_READONLY = 0x00000001 + FILE_ATTRIBUTE_HIDDEN = 0x00000002 + FILE_ATTRIBUTE_SYSTEM = 0x00000004 + FILE_ATTRIBUTE_DIRECTORY = 0x00000010 + FILE_ATTRIBUTE_ARCHIVE = 0x00000020 + FILE_ATTRIBUTE_NORMAL = 0x00000080 + FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 + + INVALID_FILE_ATTRIBUTES = 0xffffffff + + CREATE_NEW = 1 + CREATE_ALWAYS = 2 + OPEN_EXISTING = 3 + OPEN_ALWAYS = 4 + TRUNCATE_EXISTING = 5 + + FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 + FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 + FILE_FLAG_OVERLAPPED = 0x40000000 + + HANDLE_FLAG_INHERIT = 0x00000001 + STARTF_USESTDHANDLES = 0x00000100 + STARTF_USESHOWWINDOW = 0x00000001 + DUPLICATE_CLOSE_SOURCE = 0x00000001 + DUPLICATE_SAME_ACCESS = 0x00000002 + + STD_INPUT_HANDLE = -10 & (1<<32 - 1) + STD_OUTPUT_HANDLE = -11 & (1<<32 - 1) + STD_ERROR_HANDLE = -12 & (1<<32 - 1) + + FILE_BEGIN = 0 + FILE_CURRENT = 1 + FILE_END = 2 + + LANG_ENGLISH = 0x09 + SUBLANG_ENGLISH_US = 0x01 + + FORMAT_MESSAGE_ALLOCATE_BUFFER = 256 + FORMAT_MESSAGE_IGNORE_INSERTS = 512 + FORMAT_MESSAGE_FROM_STRING = 1024 + FORMAT_MESSAGE_FROM_HMODULE = 2048 + FORMAT_MESSAGE_FROM_SYSTEM = 4096 + FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192 + FORMAT_MESSAGE_MAX_WIDTH_MASK = 255 + + MAX_PATH = 260 + MAX_LONG_PATH = 32768 + + MAX_COMPUTERNAME_LENGTH = 15 + + TIME_ZONE_ID_UNKNOWN = 0 + TIME_ZONE_ID_STANDARD = 1 + + TIME_ZONE_ID_DAYLIGHT = 2 + IGNORE = 0 + INFINITE = 0xffffffff + + WAIT_TIMEOUT = 258 + WAIT_ABANDONED = 0x00000080 + WAIT_OBJECT_0 = 0x00000000 + WAIT_FAILED = 0xFFFFFFFF + + CREATE_NEW_PROCESS_GROUP = 0x00000200 + CREATE_UNICODE_ENVIRONMENT = 0x00000400 + + PROCESS_TERMINATE = 1 + PROCESS_QUERY_INFORMATION = 0x00000400 + SYNCHRONIZE = 0x00100000 + + FILE_MAP_COPY = 0x01 + FILE_MAP_WRITE = 0x02 + FILE_MAP_READ = 0x04 + FILE_MAP_EXECUTE = 0x20 + + CTRL_C_EVENT = 0 + CTRL_BREAK_EVENT = 1 + + // Windows reserves errors >= 1<<29 for application use. + APPLICATION_ERROR = 1 << 29 +) + +const ( + // flags for CreateToolhelp32Snapshot + TH32CS_SNAPHEAPLIST = 0x01 + TH32CS_SNAPPROCESS = 0x02 + TH32CS_SNAPTHREAD = 0x04 + TH32CS_SNAPMODULE = 0x08 + TH32CS_SNAPMODULE32 = 0x10 + TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD + TH32CS_INHERIT = 0x80000000 +) + +const ( + // filters for ReadDirectoryChangesW + FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 + FILE_NOTIFY_CHANGE_DIR_NAME = 0x002 + FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004 + FILE_NOTIFY_CHANGE_SIZE = 0x008 + FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010 + FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020 + FILE_NOTIFY_CHANGE_CREATION = 0x040 + FILE_NOTIFY_CHANGE_SECURITY = 0x100 +) + +const ( + // do not reorder + FILE_ACTION_ADDED = iota + 1 + FILE_ACTION_REMOVED + FILE_ACTION_MODIFIED + FILE_ACTION_RENAMED_OLD_NAME + FILE_ACTION_RENAMED_NEW_NAME +) + +const ( + // wincrypt.h + PROV_RSA_FULL = 1 + PROV_RSA_SIG = 2 + PROV_DSS = 3 + PROV_FORTEZZA = 4 + PROV_MS_EXCHANGE = 5 + PROV_SSL = 6 + PROV_RSA_SCHANNEL = 12 + PROV_DSS_DH = 13 + PROV_EC_ECDSA_SIG = 14 + PROV_EC_ECNRA_SIG = 15 + PROV_EC_ECDSA_FULL = 16 + PROV_EC_ECNRA_FULL = 17 + PROV_DH_SCHANNEL = 18 + PROV_SPYRUS_LYNKS = 20 + PROV_RNG = 21 + PROV_INTEL_SEC = 22 + PROV_REPLACE_OWF = 23 + PROV_RSA_AES = 24 + CRYPT_VERIFYCONTEXT = 0xF0000000 + CRYPT_NEWKEYSET = 0x00000008 + CRYPT_DELETEKEYSET = 0x00000010 + CRYPT_MACHINE_KEYSET = 0x00000020 + CRYPT_SILENT = 0x00000040 + CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080 + + USAGE_MATCH_TYPE_AND = 0 + USAGE_MATCH_TYPE_OR = 1 + + X509_ASN_ENCODING = 0x00000001 + PKCS_7_ASN_ENCODING = 0x00010000 + + CERT_STORE_PROV_MEMORY = 2 + + CERT_STORE_ADD_ALWAYS = 4 + + CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004 + + CERT_TRUST_NO_ERROR = 0x00000000 + CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001 + CERT_TRUST_IS_REVOKED = 0x00000004 + CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008 + CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010 + CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020 + CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040 + CERT_TRUST_IS_CYCLIC = 0x00000080 + CERT_TRUST_INVALID_EXTENSION = 0x00000100 + CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200 + CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400 + CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800 + CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000 + CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000 + CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000 + CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000 + CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000 + CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000 + CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000 + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000 + + CERT_CHAIN_POLICY_BASE = 1 + CERT_CHAIN_POLICY_AUTHENTICODE = 2 + CERT_CHAIN_POLICY_AUTHENTICODE_TS = 3 + CERT_CHAIN_POLICY_SSL = 4 + CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5 + CERT_CHAIN_POLICY_NT_AUTH = 6 + CERT_CHAIN_POLICY_MICROSOFT_ROOT = 7 + CERT_CHAIN_POLICY_EV = 8 + + CERT_E_EXPIRED = 0x800B0101 + CERT_E_ROLE = 0x800B0103 + CERT_E_PURPOSE = 0x800B0106 + CERT_E_UNTRUSTEDROOT = 0x800B0109 + CERT_E_CN_NO_MATCH = 0x800B010F + + AUTHTYPE_CLIENT = 1 + AUTHTYPE_SERVER = 2 +) + +var ( + OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") + OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") + OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00") +) + +// Invented values to support what package os expects. +type Timeval struct { + Sec int32 + Usec int32 +} + +func (tv *Timeval) Nanoseconds() int64 { + return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +type SecurityAttributes struct { + Length uint32 + SecurityDescriptor uintptr + InheritHandle uint32 +} + +type Overlapped struct { + Internal uintptr + InternalHigh uintptr + Offset uint32 + OffsetHigh uint32 + HEvent Handle +} + +type FileNotifyInformation struct { + NextEntryOffset uint32 + Action uint32 + FileNameLength uint32 + FileName uint16 +} + +type Filetime struct { + LowDateTime uint32 + HighDateTime uint32 +} + +// Nanoseconds returns Filetime ft in nanoseconds +// since Epoch (00:00:00 UTC, January 1, 1970). +func (ft *Filetime) Nanoseconds() int64 { + // 100-nanosecond intervals since January 1, 1601 + nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) + // change starting time to the Epoch (00:00:00 UTC, January 1, 1970) + nsec -= 116444736000000000 + // convert into nanoseconds + nsec *= 100 + return nsec +} + +func NsecToFiletime(nsec int64) (ft Filetime) { + // convert into 100-nanosecond + nsec /= 100 + // change starting time to January 1, 1601 + nsec += 116444736000000000 + // split into high / low + ft.LowDateTime = uint32(nsec & 0xffffffff) + ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff) + return ft +} + +type Win32finddata struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH - 1]uint16 + AlternateFileName [13]uint16 +} + +// This is the actual system call structure. +// Win32finddata is what we committed to in Go 1. +type win32finddata1 struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH]uint16 + AlternateFileName [14]uint16 +} + +func copyFindData(dst *Win32finddata, src *win32finddata1) { + dst.FileAttributes = src.FileAttributes + dst.CreationTime = src.CreationTime + dst.LastAccessTime = src.LastAccessTime + dst.LastWriteTime = src.LastWriteTime + dst.FileSizeHigh = src.FileSizeHigh + dst.FileSizeLow = src.FileSizeLow + dst.Reserved0 = src.Reserved0 + dst.Reserved1 = src.Reserved1 + + // The src is 1 element bigger than dst, but it must be NUL. + copy(dst.FileName[:], src.FileName[:]) + copy(dst.AlternateFileName[:], src.AlternateFileName[:]) +} + +type ByHandleFileInformation struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + VolumeSerialNumber uint32 + FileSizeHigh uint32 + FileSizeLow uint32 + NumberOfLinks uint32 + FileIndexHigh uint32 + FileIndexLow uint32 +} + +const ( + GetFileExInfoStandard = 0 + GetFileExMaxInfoLevel = 1 +) + +type Win32FileAttributeData struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 +} + +// ShowWindow constants +const ( + // winuser.h + SW_HIDE = 0 + SW_NORMAL = 1 + SW_SHOWNORMAL = 1 + SW_SHOWMINIMIZED = 2 + SW_SHOWMAXIMIZED = 3 + SW_MAXIMIZE = 3 + SW_SHOWNOACTIVATE = 4 + SW_SHOW = 5 + SW_MINIMIZE = 6 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_RESTORE = 9 + SW_SHOWDEFAULT = 10 + SW_FORCEMINIMIZE = 11 +) + +type StartupInfo struct { + Cb uint32 + _ *uint16 + Desktop *uint16 + Title *uint16 + X uint32 + Y uint32 + XSize uint32 + YSize uint32 + XCountChars uint32 + YCountChars uint32 + FillAttribute uint32 + Flags uint32 + ShowWindow uint16 + _ uint16 + _ *byte + StdInput Handle + StdOutput Handle + StdErr Handle +} + +type ProcessInformation struct { + Process Handle + Thread Handle + ProcessId uint32 + ThreadId uint32 +} + +type ProcessEntry32 struct { + Size uint32 + Usage uint32 + ProcessID uint32 + DefaultHeapID uintptr + ModuleID uint32 + Threads uint32 + ParentProcessID uint32 + PriClassBase int32 + Flags uint32 + ExeFile [MAX_PATH]uint16 +} + +type Systemtime struct { + Year uint16 + Month uint16 + DayOfWeek uint16 + Day uint16 + Hour uint16 + Minute uint16 + Second uint16 + Milliseconds uint16 +} + +type Timezoneinformation struct { + Bias int32 + StandardName [32]uint16 + StandardDate Systemtime + StandardBias int32 + DaylightName [32]uint16 + DaylightDate Systemtime + DaylightBias int32 +} + +// Socket related. + +const ( + AF_UNSPEC = 0 + AF_UNIX = 1 + AF_INET = 2 + AF_INET6 = 23 + AF_NETBIOS = 17 + + SOCK_STREAM = 1 + SOCK_DGRAM = 2 + SOCK_RAW = 3 + SOCK_SEQPACKET = 5 + + IPPROTO_IP = 0 + IPPROTO_IPV6 = 0x29 + IPPROTO_TCP = 6 + IPPROTO_UDP = 17 + + SOL_SOCKET = 0xffff + SO_REUSEADDR = 4 + SO_KEEPALIVE = 8 + SO_DONTROUTE = 16 + SO_BROADCAST = 32 + SO_LINGER = 128 + SO_RCVBUF = 0x1002 + SO_SNDBUF = 0x1001 + SO_UPDATE_ACCEPT_CONTEXT = 0x700b + SO_UPDATE_CONNECT_CONTEXT = 0x7010 + + IOC_OUT = 0x40000000 + IOC_IN = 0x80000000 + IOC_VENDOR = 0x18000000 + IOC_INOUT = IOC_IN | IOC_OUT + IOC_WS2 = 0x08000000 + SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6 + SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4 + SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12 + + // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460 + + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_LOOP = 0xb + IP_ADD_MEMBERSHIP = 0xc + IP_DROP_MEMBERSHIP = 0xd + + IPV6_V6ONLY = 0x1b + IPV6_UNICAST_HOPS = 0x4 + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_LOOP = 0xb + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_DONTROUTE = 0x4 + MSG_WAITALL = 0x8 + + MSG_TRUNC = 0x0100 + MSG_CTRUNC = 0x0200 + MSG_BCAST = 0x0400 + MSG_MCAST = 0x0800 + + SOMAXCONN = 0x7fffffff + + TCP_NODELAY = 1 + + SHUT_RD = 0 + SHUT_WR = 1 + SHUT_RDWR = 2 + + WSADESCRIPTION_LEN = 256 + WSASYS_STATUS_LEN = 128 +) + +type WSABuf struct { + Len uint32 + Buf *byte +} + +type WSAMsg struct { + Name *syscall.RawSockaddrAny + Namelen int32 + Buffers *WSABuf + BufferCount uint32 + Control WSABuf + Flags uint32 +} + +// Invented values to support what package os expects. +const ( + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +const ( + FILE_TYPE_CHAR = 0x0002 + FILE_TYPE_DISK = 0x0001 + FILE_TYPE_PIPE = 0x0003 + FILE_TYPE_REMOTE = 0x8000 + FILE_TYPE_UNKNOWN = 0x0000 +) + +type Hostent struct { + Name *byte + Aliases **byte + AddrType uint16 + Length uint16 + AddrList **byte +} + +type Protoent struct { + Name *byte + Aliases **byte + Proto uint16 +} + +const ( + DNS_TYPE_A = 0x0001 + DNS_TYPE_NS = 0x0002 + DNS_TYPE_MD = 0x0003 + DNS_TYPE_MF = 0x0004 + DNS_TYPE_CNAME = 0x0005 + DNS_TYPE_SOA = 0x0006 + DNS_TYPE_MB = 0x0007 + DNS_TYPE_MG = 0x0008 + DNS_TYPE_MR = 0x0009 + DNS_TYPE_NULL = 0x000a + DNS_TYPE_WKS = 0x000b + DNS_TYPE_PTR = 0x000c + DNS_TYPE_HINFO = 0x000d + DNS_TYPE_MINFO = 0x000e + DNS_TYPE_MX = 0x000f + DNS_TYPE_TEXT = 0x0010 + DNS_TYPE_RP = 0x0011 + DNS_TYPE_AFSDB = 0x0012 + DNS_TYPE_X25 = 0x0013 + DNS_TYPE_ISDN = 0x0014 + DNS_TYPE_RT = 0x0015 + DNS_TYPE_NSAP = 0x0016 + DNS_TYPE_NSAPPTR = 0x0017 + DNS_TYPE_SIG = 0x0018 + DNS_TYPE_KEY = 0x0019 + DNS_TYPE_PX = 0x001a + DNS_TYPE_GPOS = 0x001b + DNS_TYPE_AAAA = 0x001c + DNS_TYPE_LOC = 0x001d + DNS_TYPE_NXT = 0x001e + DNS_TYPE_EID = 0x001f + DNS_TYPE_NIMLOC = 0x0020 + DNS_TYPE_SRV = 0x0021 + DNS_TYPE_ATMA = 0x0022 + DNS_TYPE_NAPTR = 0x0023 + DNS_TYPE_KX = 0x0024 + DNS_TYPE_CERT = 0x0025 + DNS_TYPE_A6 = 0x0026 + DNS_TYPE_DNAME = 0x0027 + DNS_TYPE_SINK = 0x0028 + DNS_TYPE_OPT = 0x0029 + DNS_TYPE_DS = 0x002B + DNS_TYPE_RRSIG = 0x002E + DNS_TYPE_NSEC = 0x002F + DNS_TYPE_DNSKEY = 0x0030 + DNS_TYPE_DHCID = 0x0031 + DNS_TYPE_UINFO = 0x0064 + DNS_TYPE_UID = 0x0065 + DNS_TYPE_GID = 0x0066 + DNS_TYPE_UNSPEC = 0x0067 + DNS_TYPE_ADDRS = 0x00f8 + DNS_TYPE_TKEY = 0x00f9 + DNS_TYPE_TSIG = 0x00fa + DNS_TYPE_IXFR = 0x00fb + DNS_TYPE_AXFR = 0x00fc + DNS_TYPE_MAILB = 0x00fd + DNS_TYPE_MAILA = 0x00fe + DNS_TYPE_ALL = 0x00ff + DNS_TYPE_ANY = 0x00ff + DNS_TYPE_WINS = 0xff01 + DNS_TYPE_WINSR = 0xff02 + DNS_TYPE_NBSTAT = 0xff01 +) + +const ( + DNS_INFO_NO_RECORDS = 0x251D +) + +const ( + // flags inside DNSRecord.Dw + DnsSectionQuestion = 0x0000 + DnsSectionAnswer = 0x0001 + DnsSectionAuthority = 0x0002 + DnsSectionAdditional = 0x0003 +) + +type DNSSRVData struct { + Target *uint16 + Priority uint16 + Weight uint16 + Port uint16 + Pad uint16 +} + +type DNSPTRData struct { + Host *uint16 +} + +type DNSMXData struct { + NameExchange *uint16 + Preference uint16 + Pad uint16 +} + +type DNSTXTData struct { + StringCount uint16 + StringArray [1]*uint16 +} + +type DNSRecord struct { + Next *DNSRecord + Name *uint16 + Type uint16 + Length uint16 + Dw uint32 + Ttl uint32 + Reserved uint32 + Data [40]byte +} + +const ( + TF_DISCONNECT = 1 + TF_REUSE_SOCKET = 2 + TF_WRITE_BEHIND = 4 + TF_USE_DEFAULT_WORKER = 0 + TF_USE_SYSTEM_THREAD = 16 + TF_USE_KERNEL_APC = 32 +) + +type TransmitFileBuffers struct { + Head uintptr + HeadLength uint32 + Tail uintptr + TailLength uint32 +} + +const ( + IFF_UP = 1 + IFF_BROADCAST = 2 + IFF_LOOPBACK = 4 + IFF_POINTTOPOINT = 8 + IFF_MULTICAST = 16 +) + +const SIO_GET_INTERFACE_LIST = 0x4004747F + +// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old. +// will be fixed to change variable type as suitable. + +type SockaddrGen [24]byte + +type InterfaceInfo struct { + Flags uint32 + Address SockaddrGen + BroadcastAddress SockaddrGen + Netmask SockaddrGen +} + +type IpAddressString struct { + String [16]byte +} + +type IpMaskString IpAddressString + +type IpAddrString struct { + Next *IpAddrString + IpAddress IpAddressString + IpMask IpMaskString + Context uint32 +} + +const MAX_ADAPTER_NAME_LENGTH = 256 +const MAX_ADAPTER_DESCRIPTION_LENGTH = 128 +const MAX_ADAPTER_ADDRESS_LENGTH = 8 + +type IpAdapterInfo struct { + Next *IpAdapterInfo + ComboIndex uint32 + AdapterName [MAX_ADAPTER_NAME_LENGTH + 4]byte + Description [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte + AddressLength uint32 + Address [MAX_ADAPTER_ADDRESS_LENGTH]byte + Index uint32 + Type uint32 + DhcpEnabled uint32 + CurrentIpAddress *IpAddrString + IpAddressList IpAddrString + GatewayList IpAddrString + DhcpServer IpAddrString + HaveWins bool + PrimaryWinsServer IpAddrString + SecondaryWinsServer IpAddrString + LeaseObtained int64 + LeaseExpires int64 +} + +const MAXLEN_PHYSADDR = 8 +const MAX_INTERFACE_NAME_LEN = 256 +const MAXLEN_IFDESCR = 256 + +type MibIfRow struct { + Name [MAX_INTERFACE_NAME_LEN]uint16 + Index uint32 + Type uint32 + Mtu uint32 + Speed uint32 + PhysAddrLen uint32 + PhysAddr [MAXLEN_PHYSADDR]byte + AdminStatus uint32 + OperStatus uint32 + LastChange uint32 + InOctets uint32 + InUcastPkts uint32 + InNUcastPkts uint32 + InDiscards uint32 + InErrors uint32 + InUnknownProtos uint32 + OutOctets uint32 + OutUcastPkts uint32 + OutNUcastPkts uint32 + OutDiscards uint32 + OutErrors uint32 + OutQLen uint32 + DescrLen uint32 + Descr [MAXLEN_IFDESCR]byte +} + +type CertContext struct { + EncodingType uint32 + EncodedCert *byte + Length uint32 + CertInfo uintptr + Store Handle +} + +type CertChainContext struct { + Size uint32 + TrustStatus CertTrustStatus + ChainCount uint32 + Chains **CertSimpleChain + LowerQualityChainCount uint32 + LowerQualityChains **CertChainContext + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertSimpleChain struct { + Size uint32 + TrustStatus CertTrustStatus + NumElements uint32 + Elements **CertChainElement + TrustListInfo uintptr + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertChainElement struct { + Size uint32 + CertContext *CertContext + TrustStatus CertTrustStatus + RevocationInfo *CertRevocationInfo + IssuanceUsage *CertEnhKeyUsage + ApplicationUsage *CertEnhKeyUsage + ExtendedErrorInfo *uint16 +} + +type CertRevocationInfo struct { + Size uint32 + RevocationResult uint32 + RevocationOid *byte + OidSpecificInfo uintptr + HasFreshnessTime uint32 + FreshnessTime uint32 + CrlInfo uintptr // *CertRevocationCrlInfo +} + +type CertTrustStatus struct { + ErrorStatus uint32 + InfoStatus uint32 +} + +type CertUsageMatch struct { + Type uint32 + Usage CertEnhKeyUsage +} + +type CertEnhKeyUsage struct { + Length uint32 + UsageIdentifiers **byte +} + +type CertChainPara struct { + Size uint32 + RequestedUsage CertUsageMatch + RequstedIssuancePolicy CertUsageMatch + URLRetrievalTimeout uint32 + CheckRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 + CacheResync *Filetime +} + +type CertChainPolicyPara struct { + Size uint32 + Flags uint32 + ExtraPolicyPara uintptr +} + +type SSLExtraCertChainPolicyPara struct { + Size uint32 + AuthType uint32 + Checks uint32 + ServerName *uint16 +} + +type CertChainPolicyStatus struct { + Size uint32 + Error uint32 + ChainIndex uint32 + ElementIndex uint32 + ExtraPolicyStatus uintptr +} + +const ( + // do not reorder + HKEY_CLASSES_ROOT = 0x80000000 + iota + HKEY_CURRENT_USER + HKEY_LOCAL_MACHINE + HKEY_USERS + HKEY_PERFORMANCE_DATA + HKEY_CURRENT_CONFIG + HKEY_DYN_DATA + + KEY_QUERY_VALUE = 1 + KEY_SET_VALUE = 2 + KEY_CREATE_SUB_KEY = 4 + KEY_ENUMERATE_SUB_KEYS = 8 + KEY_NOTIFY = 16 + KEY_CREATE_LINK = 32 + KEY_WRITE = 0x20006 + KEY_EXECUTE = 0x20019 + KEY_READ = 0x20019 + KEY_WOW64_64KEY = 0x0100 + KEY_WOW64_32KEY = 0x0200 + KEY_ALL_ACCESS = 0xf003f +) + +const ( + // do not reorder + REG_NONE = iota + REG_SZ + REG_EXPAND_SZ + REG_BINARY + REG_DWORD_LITTLE_ENDIAN + REG_DWORD_BIG_ENDIAN + REG_LINK + REG_MULTI_SZ + REG_RESOURCE_LIST + REG_FULL_RESOURCE_DESCRIPTOR + REG_RESOURCE_REQUIREMENTS_LIST + REG_QWORD_LITTLE_ENDIAN + REG_DWORD = REG_DWORD_LITTLE_ENDIAN + REG_QWORD = REG_QWORD_LITTLE_ENDIAN +) + +type AddrinfoW struct { + Flags int32 + Family int32 + Socktype int32 + Protocol int32 + Addrlen uintptr + Canonname *uint16 + Addr uintptr + Next *AddrinfoW +} + +const ( + AI_PASSIVE = 1 + AI_CANONNAME = 2 + AI_NUMERICHOST = 4 +) + +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +var WSAID_CONNECTEX = GUID{ + 0x25a207b9, + 0xddf3, + 0x4660, + [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}, +} + +var WSAID_WSASENDMSG = GUID{ + 0xa441e712, + 0x754f, + 0x43ca, + [8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d}, +} + +var WSAID_WSARECVMSG = GUID{ + 0xf689d7c8, + 0x6f1f, + 0x436b, + [8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22}, +} + +const ( + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + FILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +const ( + WSAPROTOCOL_LEN = 255 + MAX_PROTOCOL_CHAIN = 7 + BASE_PROTOCOL = 1 + LAYERED_PROTOCOL = 0 + + XP1_CONNECTIONLESS = 0x00000001 + XP1_GUARANTEED_DELIVERY = 0x00000002 + XP1_GUARANTEED_ORDER = 0x00000004 + XP1_MESSAGE_ORIENTED = 0x00000008 + XP1_PSEUDO_STREAM = 0x00000010 + XP1_GRACEFUL_CLOSE = 0x00000020 + XP1_EXPEDITED_DATA = 0x00000040 + XP1_CONNECT_DATA = 0x00000080 + XP1_DISCONNECT_DATA = 0x00000100 + XP1_SUPPORT_BROADCAST = 0x00000200 + XP1_SUPPORT_MULTIPOINT = 0x00000400 + XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800 + XP1_MULTIPOINT_DATA_PLANE = 0x00001000 + XP1_QOS_SUPPORTED = 0x00002000 + XP1_UNI_SEND = 0x00008000 + XP1_UNI_RECV = 0x00010000 + XP1_IFS_HANDLES = 0x00020000 + XP1_PARTIAL_MESSAGE = 0x00040000 + XP1_SAN_SUPPORT_SDP = 0x00080000 + + PFL_MULTIPLE_PROTO_ENTRIES = 0x00000001 + PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002 + PFL_HIDDEN = 0x00000004 + PFL_MATCHES_PROTOCOL_ZERO = 0x00000008 + PFL_NETWORKDIRECT_PROVIDER = 0x00000010 +) + +type WSAProtocolInfo struct { + ServiceFlags1 uint32 + ServiceFlags2 uint32 + ServiceFlags3 uint32 + ServiceFlags4 uint32 + ProviderFlags uint32 + ProviderId GUID + CatalogEntryId uint32 + ProtocolChain WSAProtocolChain + Version int32 + AddressFamily int32 + MaxSockAddr int32 + MinSockAddr int32 + SocketType int32 + Protocol int32 + ProtocolMaxOffset int32 + NetworkByteOrder int32 + SecurityScheme int32 + MessageSize uint32 + ProviderReserved uint32 + ProtocolName [WSAPROTOCOL_LEN + 1]uint16 +} + +type WSAProtocolChain struct { + ChainLen int32 + ChainEntries [MAX_PROTOCOL_CHAIN]uint32 +} + +type TCPKeepalive struct { + OnOff uint32 + Time uint32 + Interval uint32 +} + +type symbolicLinkReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + Flags uint32 + PathBuffer [1]uint16 +} + +type mountPointReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + PathBuffer [1]uint16 +} + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + + // GenericReparseBuffer + reparseBuffer byte +} + +const ( + FSCTL_GET_REPARSE_POINT = 0x900A8 + MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024 + IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 + IO_REPARSE_TAG_SYMLINK = 0xA000000C + SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 +) + +const ( + ComputerNameNetBIOS = 0 + ComputerNameDnsHostname = 1 + ComputerNameDnsDomain = 2 + ComputerNameDnsFullyQualified = 3 + ComputerNamePhysicalNetBIOS = 4 + ComputerNamePhysicalDnsHostname = 5 + ComputerNamePhysicalDnsDomain = 6 + ComputerNamePhysicalDnsFullyQualified = 7 + ComputerNameMax = 8 +) + +const ( + MOVEFILE_REPLACE_EXISTING = 0x1 + MOVEFILE_COPY_ALLOWED = 0x2 + MOVEFILE_DELAY_UNTIL_REBOOT = 0x4 + MOVEFILE_WRITE_THROUGH = 0x8 + MOVEFILE_CREATE_HARDLINK = 0x10 + MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20 +) + +const GAA_FLAG_INCLUDE_PREFIX = 0x00000010 + +const ( + IF_TYPE_OTHER = 1 + IF_TYPE_ETHERNET_CSMACD = 6 + IF_TYPE_ISO88025_TOKENRING = 9 + IF_TYPE_PPP = 23 + IF_TYPE_SOFTWARE_LOOPBACK = 24 + IF_TYPE_ATM = 37 + IF_TYPE_IEEE80211 = 71 + IF_TYPE_TUNNEL = 131 + IF_TYPE_IEEE1394 = 144 +) + +type SocketAddress struct { + Sockaddr *syscall.RawSockaddrAny + SockaddrLength int32 +} + +type IpAdapterUnicastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterUnicastAddress + Address SocketAddress + PrefixOrigin int32 + SuffixOrigin int32 + DadState int32 + ValidLifetime uint32 + PreferredLifetime uint32 + LeaseLifetime uint32 + OnLinkPrefixLength uint8 +} + +type IpAdapterAnycastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterAnycastAddress + Address SocketAddress +} + +type IpAdapterMulticastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterMulticastAddress + Address SocketAddress +} + +type IpAdapterDnsServerAdapter struct { + Length uint32 + Reserved uint32 + Next *IpAdapterDnsServerAdapter + Address SocketAddress +} + +type IpAdapterPrefix struct { + Length uint32 + Flags uint32 + Next *IpAdapterPrefix + Address SocketAddress + PrefixLength uint32 +} + +type IpAdapterAddresses struct { + Length uint32 + IfIndex uint32 + Next *IpAdapterAddresses + AdapterName *byte + FirstUnicastAddress *IpAdapterUnicastAddress + FirstAnycastAddress *IpAdapterAnycastAddress + FirstMulticastAddress *IpAdapterMulticastAddress + FirstDnsServerAddress *IpAdapterDnsServerAdapter + DnsSuffix *uint16 + Description *uint16 + FriendlyName *uint16 + PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte + PhysicalAddressLength uint32 + Flags uint32 + Mtu uint32 + IfType uint32 + OperStatus uint32 + Ipv6IfIndex uint32 + ZoneIndices [16]uint32 + FirstPrefix *IpAdapterPrefix + /* more fields might be present here. */ +} + +const ( + IfOperStatusUp = 1 + IfOperStatusDown = 2 + IfOperStatusTesting = 3 + IfOperStatusUnknown = 4 + IfOperStatusDormant = 5 + IfOperStatusNotPresent = 6 + IfOperStatusLowerLayerDown = 7 +) + +// Console related constants used for the mode parameter to SetConsoleMode. See +// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details. + +const ( + ENABLE_PROCESSED_INPUT = 0x1 + ENABLE_LINE_INPUT = 0x2 + ENABLE_ECHO_INPUT = 0x4 + ENABLE_WINDOW_INPUT = 0x8 + ENABLE_MOUSE_INPUT = 0x10 + ENABLE_INSERT_MODE = 0x20 + ENABLE_QUICK_EDIT_MODE = 0x40 + ENABLE_EXTENDED_FLAGS = 0x80 + ENABLE_AUTO_POSITION = 0x100 + ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200 + + ENABLE_PROCESSED_OUTPUT = 0x1 + ENABLE_WRAP_AT_EOL_OUTPUT = 0x2 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 + DISABLE_NEWLINE_AUTO_RETURN = 0x8 + ENABLE_LVB_GRID_WORLDWIDE = 0x10 +) + +type Coord struct { + X int16 + Y int16 +} + +type SmallRect struct { + Left int16 + Top int16 + Right int16 + Bottom int16 +} + +// Used with GetConsoleScreenBuffer to retreive information about a console +// screen buffer. See +// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str +// for details. + +type ConsoleScreenBufferInfo struct { + Size Coord + CursorPosition Coord + Attributes uint16 + Window SmallRect + MaximumWindowSize Coord +} diff --git a/vendor/golang.org/x/sys/windows/types_windows_386.go b/vendor/golang.org/x/sys/windows/types_windows_386.go new file mode 100644 index 0000000000..fe0ddd0316 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/types_windows_386.go @@ -0,0 +1,22 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte +} + +type Servent struct { + Name *byte + Aliases **byte + Port uint16 + Proto *byte +} diff --git a/vendor/golang.org/x/sys/windows/types_windows_amd64.go b/vendor/golang.org/x/sys/windows/types_windows_amd64.go new file mode 100644 index 0000000000..7e154c2df2 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/types_windows_amd64.go @@ -0,0 +1,22 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte +} + +type Servent struct { + Name *byte + Aliases **byte + Proto *byte + Port uint16 +} diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go new file mode 100644 index 0000000000..2f893d2efc --- /dev/null +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -0,0 +1,2428 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package windows + +import ( + "syscall" + "unsafe" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = NewLazySystemDLL("advapi32.dll") + modkernel32 = NewLazySystemDLL("kernel32.dll") + modshell32 = NewLazySystemDLL("shell32.dll") + modmswsock = NewLazySystemDLL("mswsock.dll") + modcrypt32 = NewLazySystemDLL("crypt32.dll") + modws2_32 = NewLazySystemDLL("ws2_32.dll") + moddnsapi = NewLazySystemDLL("dnsapi.dll") + modiphlpapi = NewLazySystemDLL("iphlpapi.dll") + modsecur32 = NewLazySystemDLL("secur32.dll") + modnetapi32 = NewLazySystemDLL("netapi32.dll") + moduserenv = NewLazySystemDLL("userenv.dll") + + procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") + procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") + procReportEventW = modadvapi32.NewProc("ReportEventW") + procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") + procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") + procCreateServiceW = modadvapi32.NewProc("CreateServiceW") + procOpenServiceW = modadvapi32.NewProc("OpenServiceW") + procDeleteService = modadvapi32.NewProc("DeleteService") + procStartServiceW = modadvapi32.NewProc("StartServiceW") + procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procControlService = modadvapi32.NewProc("ControlService") + procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") + procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") + procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") + procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") + procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") + procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") + procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") + procGetLastError = modkernel32.NewProc("GetLastError") + procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") + procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") + procFreeLibrary = modkernel32.NewProc("FreeLibrary") + procGetProcAddress = modkernel32.NewProc("GetProcAddress") + procGetVersion = modkernel32.NewProc("GetVersion") + procFormatMessageW = modkernel32.NewProc("FormatMessageW") + procExitProcess = modkernel32.NewProc("ExitProcess") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procReadFile = modkernel32.NewProc("ReadFile") + procWriteFile = modkernel32.NewProc("WriteFile") + procSetFilePointer = modkernel32.NewProc("SetFilePointer") + procCloseHandle = modkernel32.NewProc("CloseHandle") + procGetStdHandle = modkernel32.NewProc("GetStdHandle") + procSetStdHandle = modkernel32.NewProc("SetStdHandle") + procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") + procFindNextFileW = modkernel32.NewProc("FindNextFileW") + procFindClose = modkernel32.NewProc("FindClose") + procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") + procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") + procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") + procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") + procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procDeleteFileW = modkernel32.NewProc("DeleteFileW") + procMoveFileW = modkernel32.NewProc("MoveFileW") + procMoveFileExW = modkernel32.NewProc("MoveFileExW") + procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") + procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") + procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") + procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") + procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") + procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") + procCancelIo = modkernel32.NewProc("CancelIo") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procOpenProcess = modkernel32.NewProc("OpenProcess") + procTerminateProcess = modkernel32.NewProc("TerminateProcess") + procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") + procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") + procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") + procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") + procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") + procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") + procGetTempPathW = modkernel32.NewProc("GetTempPathW") + procCreatePipe = modkernel32.NewProc("CreatePipe") + procGetFileType = modkernel32.NewProc("GetFileType") + procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") + procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") + procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") + procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") + procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") + procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") + procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") + procSetFileTime = modkernel32.NewProc("SetFileTime") + procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") + procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") + procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") + procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") + procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") + procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") + procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") + procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") + procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") + procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") + procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") + procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") + procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") + procVirtualLock = modkernel32.NewProc("VirtualLock") + procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") + procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") + procVirtualFree = modkernel32.NewProc("VirtualFree") + procVirtualProtect = modkernel32.NewProc("VirtualProtect") + procTransmitFile = modmswsock.NewProc("TransmitFile") + procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") + procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") + procCertOpenStore = modcrypt32.NewProc("CertOpenStore") + procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") + procCertCloseStore = modcrypt32.NewProc("CertCloseStore") + procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") + procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") + procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") + procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") + procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") + procRegCloseKey = modadvapi32.NewProc("RegCloseKey") + procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") + procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") + procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") + procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") + procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") + procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") + procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") + procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") + procReadConsoleW = modkernel32.NewProc("ReadConsoleW") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procProcess32FirstW = modkernel32.NewProc("Process32FirstW") + procProcess32NextW = modkernel32.NewProc("Process32NextW") + procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") + procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") + procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") + procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") + procCreateEventW = modkernel32.NewProc("CreateEventW") + procCreateEventExW = modkernel32.NewProc("CreateEventExW") + procOpenEventW = modkernel32.NewProc("OpenEventW") + procSetEvent = modkernel32.NewProc("SetEvent") + procResetEvent = modkernel32.NewProc("ResetEvent") + procPulseEvent = modkernel32.NewProc("PulseEvent") + procWSAStartup = modws2_32.NewProc("WSAStartup") + procWSACleanup = modws2_32.NewProc("WSACleanup") + procWSAIoctl = modws2_32.NewProc("WSAIoctl") + procsocket = modws2_32.NewProc("socket") + procsetsockopt = modws2_32.NewProc("setsockopt") + procgetsockopt = modws2_32.NewProc("getsockopt") + procbind = modws2_32.NewProc("bind") + procconnect = modws2_32.NewProc("connect") + procgetsockname = modws2_32.NewProc("getsockname") + procgetpeername = modws2_32.NewProc("getpeername") + proclisten = modws2_32.NewProc("listen") + procshutdown = modws2_32.NewProc("shutdown") + procclosesocket = modws2_32.NewProc("closesocket") + procAcceptEx = modmswsock.NewProc("AcceptEx") + procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") + procWSARecv = modws2_32.NewProc("WSARecv") + procWSASend = modws2_32.NewProc("WSASend") + procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") + procWSASendTo = modws2_32.NewProc("WSASendTo") + procgethostbyname = modws2_32.NewProc("gethostbyname") + procgetservbyname = modws2_32.NewProc("getservbyname") + procntohs = modws2_32.NewProc("ntohs") + procgetprotobyname = modws2_32.NewProc("getprotobyname") + procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") + procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") + procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") + procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") + procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") + procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") + procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") + procGetACP = modkernel32.NewProc("GetACP") + procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") + procTranslateNameW = modsecur32.NewProc("TranslateNameW") + procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") + procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") + procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") + procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") + procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") + procGetLengthSid = modadvapi32.NewProc("GetLengthSid") + procCopySid = modadvapi32.NewProc("CopySid") + procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") + procFreeSid = modadvapi32.NewProc("FreeSid") + procEqualSid = modadvapi32.NewProc("EqualSid") + procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") + procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") + procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") +) + +func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeregisterEventSource(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseServiceHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteService(service Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLastError() (lasterr error) { + r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) + if r0 != 0 { + lasterr = syscall.Errno(r0) + } + return +} + +func LoadLibrary(libname string) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibrary(_p0) +} + +func _LoadLibrary(libname *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibraryEx(_p0, zero, flags) +} + +func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeLibrary(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcAddress(module Handle, procname string) (proc uintptr, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(procname) + if err != nil { + return + } + return _GetProcAddress(module, _p0) +} + +func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVersion() (ver uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0) + ver = uint32(r0) + if ver == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) { + var _p0 *uint16 + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ExitProcess(exitcode uint32) { + syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0) + return +} + +func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { + r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) + newlowoffset = uint32(r0) + if newlowoffset == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStdHandle(stdhandle uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetStdHandle(stdhandle uint32, handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findNextFile1(handle Handle, data *win32finddata1) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindClose(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetCurrentDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) { + r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RemoveDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteFile(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFile(from *uint16, to *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerName(buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEndOfFile(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetSystemTimeAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetSystemTimePreciseAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0) + rc = uint32(r0) + if rc == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIo(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIoEx(s Handle, o *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) { + var _p0 uint32 + if inheritHandles { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TerminateProcess(handle Handle, exitcode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStartupInfo(startupInfo *StartupInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentProcess() (pseudoHandle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) + pseudoHandle = Handle(r0) + if pseudoHandle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) { + var _p0 uint32 + if bInheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) { + r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0) + event = uint32(r0) + if event == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileType(filehandle Handle) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptReleaseContext(provhandle Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) { + r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentStrings() (envs *uint16, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0) + envs = (*uint16)(unsafe.Pointer(r0)) + if envs == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeEnvironmentStrings(envs *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributes(name *uint16) (attrs uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + attrs = uint32(r0) + if attrs == INVALID_FILE_ATTRIBUTES { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileAttributes(name *uint16, attrs uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCommandLine() (cmd *uint16) { + r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0) + cmd = (*uint16)(unsafe.Pointer(r0)) + return +} + +func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { + r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) + argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) + if argv == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LocalFree(hmem Handle) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0) + handle = Handle(r0) + if handle != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushFileBuffers(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0) + addr = uintptr(r0) + if addr == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func UnmapViewOfFile(addr uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushViewOfFile(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualLock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualUnlock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0) + value = uintptr(r0) + if value == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + var _p0 uint32 + if watchSubTree { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) { + r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0) + store = Handle(r0) + if store == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) { + r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertCloseStore(store Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) { + r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateChain(ctx *CertChainContext) { + syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + return +} + +func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen)) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateContext(ctx *CertContext) (err error) { + r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) { + r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegCloseKey(key Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func getCurrentProcessId() (pid uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) + pid = uint32(r0) + return +} + +func GetConsoleMode(console Handle, mode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetConsoleMode(console Handle, mode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentThreadId() (id uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0) + id = uint32(r0) + return +} + +func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ResetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PulseEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { + r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func WSACleanup() (err error) { + r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func socket(af int32, typ int32, protocol int32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol)) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) { + r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) { + r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func listen(s Handle, backlog int32) (err error) { + r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func shutdown(s Handle, how int32) (err error) { + r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Closesocket(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) { + syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0) + return +} + +func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetHostByName(name string) (h *Hostent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetHostByName(_p0) +} + +func _GetHostByName(name *byte) (h *Hostent, err error) { + r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + h = (*Hostent)(unsafe.Pointer(r0)) + if h == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetServByName(name string, proto string) (s *Servent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = syscall.BytePtrFromString(proto) + if err != nil { + return + } + return _GetServByName(_p0, _p1) +} + +func _GetServByName(name *byte, proto *byte) (s *Servent, err error) { + r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0) + s = (*Servent)(unsafe.Pointer(r0)) + if s == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Ntohs(netshort uint16) (u uint16) { + r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0) + u = uint16(r0) + return +} + +func GetProtoByName(name string) (p *Protoent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetProtoByName(_p0) +} + +func _GetProtoByName(name *byte) (p *Protoent, err error) { + r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + p = (*Protoent)(unsafe.Pointer(r0)) + if p == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + var _p0 *uint16 + _p0, status = syscall.UTF16PtrFromString(name) + if status != nil { + return + } + return _DnsQuery(_p0, qtype, options, extra, qrs, pr) +} + +func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr))) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func DnsRecordListFree(rl *DNSRecord, freetype uint32) { + syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0) + return +} + +func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) { + r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0) + same = r0 != 0 + return +} + +func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) { + r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func FreeAddrInfoW(addrinfo *AddrinfoW) { + syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0) + return +} + +func GetIfEntry(pIfRow *MibIfRow) (errcode error) { + r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { + r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) { + r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength))) + n = int32(r0) + if n == -1 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { + r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetACP() (acp uint32) { + r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0) + acp = uint32(r0) + return +} + +func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) { + r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar)) + nwrite = int32(r0) + if nwrite == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize))) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) { + r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) { + r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType))) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetApiBufferFree(buf *byte) (neterr error) { + r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLengthSid(sid *SID) (len uint32) { + r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + len = uint32(r0) + return +} + +func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeSid(sid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) { + r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0) + isEqual = r0 != 0 + return +} + +func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { + r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/vendor/vendor.json b/vendor/vendor.json index daa2f72d3d..afda417f3b 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -414,92 +414,92 @@ { "checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=", "path": "golang.org/x/crypto/cast5", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { - "checksumSHA1": "nAu0XmCeC6WnUySyI8R7w4cxAqU=", + "checksumSHA1": "IQkUIOnvlf0tYloFx9mLaXSvXWQ=", "path": "golang.org/x/crypto/curve25519", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { - "checksumSHA1": "wGb//LjBPNxYHqk+dcLo7BjPXK8=", + "checksumSHA1": "1hwn8cgg4EVXhCpJIqmMbzqnUo0=", "path": "golang.org/x/crypto/ed25519", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "LXFcVx8I587SnWmKycSDEq9yvK8=", "path": "golang.org/x/crypto/ed25519/internal/edwards25519", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "IIhFTrLlmlc6lEFSitqi4aw2lw0=", "path": "golang.org/x/crypto/openpgp", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "olOKkhrdkYQHZ0lf1orrFQPQrv4=", "path": "golang.org/x/crypto/openpgp/armor", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "eo/KtdjieJQXH7Qy+faXFcF70ME=", "path": "golang.org/x/crypto/openpgp/elgamal", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "rlxVSaGgqdAgwblsErxTxIfuGfg=", "path": "golang.org/x/crypto/openpgp/errors", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { - "checksumSHA1": "LWdaR8Q9yn6eBCcnGl0HvJRDUBE=", + "checksumSHA1": "Pq88+Dgh04UdXWZN6P+bLgYnbRc=", "path": "golang.org/x/crypto/openpgp/packet", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "s2qT4UwvzBSkzXuiuMkowif1Olw=", "path": "golang.org/x/crypto/openpgp/s2k", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", "path": "golang.org/x/crypto/pbkdf2", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "y/oIaxq2d3WPizRZfVjo8RCRYTU=", "path": "golang.org/x/crypto/ripemd160", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { - "checksumSHA1": "E8pDMGySfy5Mw+jzXOkOxo35bww=", + "checksumSHA1": "dHh6VeHcbNg11miGjGEl8LbPe7w=", "path": "golang.org/x/crypto/scrypt", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { - "checksumSHA1": "8sVsMTphul+B0sI0qAv4TE1ZxUk=", + "checksumSHA1": "Wi44TcpIOXdojyVWkvyOBnBKIS4=", "path": "golang.org/x/crypto/ssh", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { - "checksumSHA1": "ZaU56svwLgiJD0y8JOB3+/mpYBA=", + "checksumSHA1": "5Yb2z6UO+Arm/TEd+OEtdnwOt1A=", "path": "golang.org/x/crypto/ssh/terminal", - "revision": "c7af5bf2638a1164f2eb5467c39c6cffbd13a02e", - "revisionTime": "2017-04-25T18:31:00Z" + "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", + "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", @@ -538,10 +538,16 @@ "revisionTime": "2017-05-17T20:25:26Z" }, { - "checksumSHA1": "rTPzsn0jeqfgnQR0OsMKR8JRy5Y=", + "checksumSHA1": "r1jWq0V3AI5DLN0aCnXXMH/is9Q=", "path": "golang.org/x/sys/unix", - "revision": "e24f485414aeafb646f6fca458b0bf869c0880a1", - "revisionTime": "2017-02-11T02:03:03Z" + "revision": "1e2299c37cc91a509f1b12369872d27be0ce98a6", + "revisionTime": "2017-11-09T13:50:42Z" + }, + { + "checksumSHA1": "ck5uxoEeMDUL/QqPvGvBmcbsJzg=", + "path": "golang.org/x/sys/windows", + "revision": "1e2299c37cc91a509f1b12369872d27be0ce98a6", + "revisionTime": "2017-11-09T13:50:42Z" }, { "checksumSHA1": "Mr4ur60bgQJnQFfJY0dGtwWwMPE=", From e401536c97f6c31a10f89952757dbb92cdf60e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sun, 12 Nov 2017 22:51:19 +0200 Subject: [PATCH 250/272] dockerignore, internal/build: forward correct git folder --- .dockerignore | 6 +++--- internal/build/env.go | 5 +++-- internal/build/util.go | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.dockerignore b/.dockerignore index 751ff2a0c2..d280741c60 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,7 @@ **/.git -/.git -!/.git/HEAD -!/.git/refs/heads +.git +!.git/HEAD +!.git/refs/heads **/*_test.go build/_workspace diff --git a/internal/build/env.go b/internal/build/env.go index 793242fcf0..c9848bf82c 100644 --- a/internal/build/env.go +++ b/internal/build/env.go @@ -82,14 +82,15 @@ func Env() Environment { // LocalEnv returns build environment metadata gathered from git. func LocalEnv() Environment { env := applyEnvFlags(Environment{Name: "local", Repo: "ethereum/go-ethereum"}) - head := ReadGitFile("HEAD") + + head := readGitFile("HEAD") if splits := strings.Split(head, " "); len(splits) == 2 { head = splits[1] } else { return env } if env.Commit == "" { - env.Commit = ReadGitFile(head) + env.Commit = readGitFile(head) } if env.Branch == "" { if head != "HEAD" { diff --git a/internal/build/util.go b/internal/build/util.go index 91465c4199..c6e059f0df 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -89,8 +89,8 @@ func RunGit(args ...string) string { return strings.TrimSpace(stdout.String()) } -// ReadGitFile returns content of file in .git directory. -func ReadGitFile(file string) string { +// readGitFile returns content of file in .git directory. +func readGitFile(file string) string { content, err := ioutil.ReadFile(path.Join(".git", file)) if err != nil { return "" From cef06358ff7d7b369a0d9cfd9332c4c68de2f782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 13 Nov 2017 14:30:13 +0200 Subject: [PATCH 251/272] Dockerfile: support alltools image beside plain Geth --- Dockerfile | 2 +- Dockerfile.alltools | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.alltools diff --git a/Dockerfile b/Dockerfile index eae8924997..f4396fcf28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,5 +12,5 @@ FROM alpine:latest RUN apk add --no-cache ca-certificates COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/ -EXPOSE 8545 8546 30303 30303/udp +EXPOSE 8545 8546 30303 30303/udp 30304/udp ENTRYPOINT ["geth"] diff --git a/Dockerfile.alltools b/Dockerfile.alltools new file mode 100644 index 0000000000..79bf0f8d56 --- /dev/null +++ b/Dockerfile.alltools @@ -0,0 +1,15 @@ +# Build Geth in a stock Go builder container +FROM golang:1.9-alpine as builder + +RUN apk add --no-cache make gcc musl-dev linux-headers + +ADD . /go-ethereum +RUN cd /go-ethereum && make all + +# Pull all binaries into a second stage deploy alpine container +FROM alpine:latest + +RUN apk add --no-cache ca-certificates +COPY --from=builder /go-ethereum/build/bin/* /usr/local/bin/ + +EXPOSE 8545 8546 30303 30303/udp 30304/udp From 54ce3887d84a56894904baaa90e44c2972a0107f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 13 Nov 2017 17:07:05 +0200 Subject: [PATCH 252/272] core: split same-td blocks on block height --- core/blockchain.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/blockchain.go b/core/blockchain.go index 57a881f384..325753c7a7 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -818,7 +818,12 @@ func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.R // If the total difficulty is higher than our known, add it to the canonical chain // Second clause in the if statement reduces the vulnerability to selfish mining. // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf - if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) { + reorg := externTd.Cmp(localTd) > 0 + if !reorg && externTd.Cmp(localTd) == 0 { + // Split same-difficulty blocks by number, then at random + reorg = block.NumberU64() < bc.currentBlock.NumberU64() || (block.NumberU64() == bc.currentBlock.NumberU64() && mrand.Float64() < 0.5) + } + if reorg { // Reorganise the chain if the parent is not the head block if block.ParentHash() != bc.currentBlock.Hash() { if err := bc.reorg(bc.currentBlock, block); err != nil { From 96ddf27a48491ce7d6e189e228d681cc38632954 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 13 Nov 2017 22:04:53 +0100 Subject: [PATCH 253/272] core/vm: copyright header on test-file --- core/vm/analysis_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go index 3d4e709db4..a64f90ed9c 100644 --- a/core/vm/analysis_test.go +++ b/core/vm/analysis_test.go @@ -1,3 +1,19 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package vm import "testing" From 924098c6e5c72b1b4bd8c6951c246e1f42001e17 Mon Sep 17 00:00:00 2001 From: Jay Guo Date: Tue, 14 Nov 2017 03:44:40 -0600 Subject: [PATCH 254/272] core/vm: fix typos in jump_table.go --- core/vm/jump_table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 9ef192fdf9..a1c5ad9c67 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -42,12 +42,12 @@ type operation struct { // memorySize returns the memory size required for the operation memorySize memorySizeFunc - halts bool // indicates whether the operation shoult halt further execution + halts bool // indicates whether the operation should halt further execution jumps bool // indicates whether the program counter should not increment writes bool // determines whether this a state modifying operation valid bool // indication whether the retrieved operation is valid and known reverts bool // determines whether the operation reverts state (implicitly halts) - returns bool // determines whether the opertions sets the return data content + returns bool // determines whether the operations sets the return data content } var ( From 984c25ac406e86255b289a3d7fec4cd91a17707f Mon Sep 17 00:00:00 2001 From: gary rong Date: Tue, 14 Nov 2017 10:26:31 -0600 Subject: [PATCH 255/272] accounts, internal: fail if no suitable estimated gas found (#15477) * accounts, internal: return an error if no suitable estimated gas found * accounts, internal: minor polishes on the gas estimator --- accounts/abi/bind/backends/simulated.go | 39 +++++++++++++++-------- internal/ethapi/api.go | 41 ++++++++++++++++--------- 2 files changed, 54 insertions(+), 26 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index e1d5745caa..09288d401e 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -41,6 +41,7 @@ import ( var _ bind.ContractBackend = (*SimulatedBackend)(nil) var errBlockNumberUnsupported = errors.New("SimulatedBackend cannot access blocks other than the latest block") +var errGasEstimationFailed = errors.New("gas required exceeds allowance or always failing transaction") // SimulatedBackend implements bind.ContractBackend, simulating a blockchain in // the background. Its main purpose is to allow easily testing contract bindings. @@ -203,32 +204,46 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs b.mu.Lock() defer b.mu.Unlock() - // Binary search the gas requirement, as it may be higher than the amount used + // Determine the lowest and highest possible gas limits to binary search in between var ( - lo uint64 = params.TxGas - 1 - hi uint64 + lo uint64 = params.TxGas - 1 + hi uint64 + cap uint64 ) if call.Gas != nil && call.Gas.Uint64() >= params.TxGas { hi = call.Gas.Uint64() } else { hi = b.pendingBlock.GasLimit().Uint64() } - for lo+1 < hi { - // Take a guess at the gas, and check transaction validity - mid := (hi + lo) / 2 - call.Gas = new(big.Int).SetUint64(mid) + cap = hi + + // Create a helper to check if a gas allowance results in an executable transaction + executable := func(gas uint64) bool { + call.Gas = new(big.Int).SetUint64(gas) snapshot := b.pendingState.Snapshot() _, _, failed, err := b.callContract(ctx, call, b.pendingBlock, b.pendingState) b.pendingState.RevertToSnapshot(snapshot) - // If the transaction became invalid or execution failed, raise the gas limit if err != nil || failed { - lo = mid - continue + return false + } + return true + } + // Execute the binary search and hone in on an executable gas limit + for lo+1 < hi { + mid := (hi + lo) / 2 + if !executable(mid) { + lo = mid + } else { + hi = mid + } + } + // Reject the transaction as invalid if it still fails at the highest allowance + if hi == cap { + if !executable(hi) { + return nil, errGasEstimationFailed } - // Otherwise assume the transaction succeeded, lower the gas limit - hi = mid } return new(big.Int).SetUint64(hi), nil } diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 1ffb5a1803..59a29d7226 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -649,12 +649,14 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr r return (hexutil.Bytes)(result), err } -// EstimateGas returns an estimate of the amount of gas needed to execute the given transaction. +// EstimateGas returns an estimate of the amount of gas needed to execute the +// given transaction against the current pending block. func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (*hexutil.Big, error) { - // Binary search the gas requirement, as it may be higher than the amount used + // Determine the lowest and highest possible gas limits to binary search in between var ( - lo uint64 = params.TxGas - 1 - hi uint64 + lo uint64 = params.TxGas - 1 + hi uint64 + cap uint64 ) if (*big.Int)(&args.Gas).Uint64() >= params.TxGas { hi = (*big.Int)(&args.Gas).Uint64() @@ -666,20 +668,31 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (* } hi = block.GasLimit().Uint64() } - for lo+1 < hi { - // Take a guess at the gas, and check transaction validity - mid := (hi + lo) / 2 - (*big.Int)(&args.Gas).SetUint64(mid) + cap = hi + // Create a helper to check if a gas allowance results in an executable transaction + executable := func(gas uint64) bool { + (*big.Int)(&args.Gas).SetUint64(gas) _, _, failed, err := s.doCall(ctx, args, rpc.PendingBlockNumber, vm.Config{}) - - // If the transaction became invalid or execution failed, raise the gas limit if err != nil || failed { - lo = mid - continue + return false + } + return true + } + // Execute the binary search and hone in on an executable gas limit + for lo+1 < hi { + mid := (hi + lo) / 2 + if !executable(mid) { + lo = mid + } else { + hi = mid + } + } + // Reject the transaction as invalid if it still fails at the highest allowance + if hi == cap { + if !executable(hi) { + return nil, fmt.Errorf("gas required exceeds allowance or always failing transaction") } - // Otherwise assume the transaction succeeded, lower the gas limit - hi = mid } return (*hexutil.Big)(new(big.Int).SetUint64(hi)), nil } From ba62215d9ef8655743ce7b1380056755943e3d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kurk=C3=B3=20Mih=C3=A1ly?= Date: Tue, 14 Nov 2017 19:34:00 +0200 Subject: [PATCH 256/272] cmd, dashboard: dashboard using React, Material-UI, Recharts (#15393) * cmd, dashboard: dashboard using React, Material-UI, Recharts * cmd, dashboard, metrics: initial proof of concept dashboard * dashboard: delete blobs * dashboard: gofmt -s -w . * dashboard: minor text and code polishes --- .gitignore | 5 + cmd/geth/config.go | 21 +- cmd/geth/main.go | 5 + cmd/geth/usage.go | 14 + cmd/utils/flags.go | 41 +++ dashboard/README.md | 46 ++++ dashboard/assets.go | 260 ++++++++++++++++++ dashboard/assets/.eslintrc | 52 ++++ dashboard/assets/components/Common.jsx | 52 ++++ dashboard/assets/components/Dashboard.jsx | 169 ++++++++++++ dashboard/assets/components/Header.jsx | 87 ++++++ dashboard/assets/components/Home.jsx | 89 +++++++ dashboard/assets/components/Main.jsx | 109 ++++++++ dashboard/assets/components/SideBar.jsx | 106 ++++++++ dashboard/assets/index.jsx | 36 +++ dashboard/assets/package.json | 22 ++ dashboard/assets/public/dashboard.html | 17 ++ dashboard/assets/webpack.config.js | 36 +++ dashboard/config.go | 45 ++++ dashboard/dashboard.go | 305 ++++++++++++++++++++++ metrics/metrics.go | 3 +- 21 files changed, 1512 insertions(+), 8 deletions(-) create mode 100644 dashboard/README.md create mode 100644 dashboard/assets.go create mode 100644 dashboard/assets/.eslintrc create mode 100644 dashboard/assets/components/Common.jsx create mode 100644 dashboard/assets/components/Dashboard.jsx create mode 100644 dashboard/assets/components/Header.jsx create mode 100644 dashboard/assets/components/Home.jsx create mode 100644 dashboard/assets/components/Main.jsx create mode 100644 dashboard/assets/components/SideBar.jsx create mode 100644 dashboard/assets/index.jsx create mode 100644 dashboard/assets/package.json create mode 100644 dashboard/assets/public/dashboard.html create mode 100644 dashboard/assets/webpack.config.js create mode 100644 dashboard/config.go create mode 100644 dashboard/dashboard.go diff --git a/.gitignore b/.gitignore index cb2c2d14da..3a5acef9f3 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,8 @@ profile.cov # IdeaIDE .idea + +# dashboard +/dashboard/assets/node_modules +/dashboard/assets/stats.json +/dashboard/assets/public/bundle.js diff --git a/cmd/geth/config.go b/cmd/geth/config.go index d55a5e08d8..27490c4048 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/contracts/release" + "github.com/ethereum/go-ethereum/dashboard" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/params" @@ -76,10 +77,11 @@ type ethstatsConfig struct { } type gethConfig struct { - Eth eth.Config - Shh whisper.Config - Node node.Config - Ethstats ethstatsConfig + Eth eth.Config + Shh whisper.Config + Node node.Config + Ethstats ethstatsConfig + Dashboard dashboard.Config } func loadConfig(file string, cfg *gethConfig) error { @@ -110,9 +112,10 @@ func defaultNodeConfig() node.Config { func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { // Load defaults. cfg := gethConfig{ - Eth: eth.DefaultConfig, - Shh: whisper.DefaultConfig, - Node: defaultNodeConfig(), + Eth: eth.DefaultConfig, + Shh: whisper.DefaultConfig, + Node: defaultNodeConfig(), + Dashboard: dashboard.DefaultConfig, } // Load config file. @@ -134,6 +137,7 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { } utils.SetShhConfig(ctx, stack, &cfg.Shh) + utils.SetDashboardConfig(ctx, &cfg.Dashboard) return stack, cfg } @@ -153,6 +157,9 @@ func makeFullNode(ctx *cli.Context) *node.Node { utils.RegisterEthService(stack, &cfg.Eth) + if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { + utils.RegisterDashboardService(stack, &cfg.Dashboard) + } // Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode shhEnabled := enableWhisper(ctx) shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DeveloperFlag.Name) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 8bd27b5c6a..bdb7fad62a 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -61,6 +61,11 @@ var ( utils.DataDirFlag, utils.KeyStoreDirFlag, utils.NoUSBFlag, + utils.DashboardEnabledFlag, + utils.DashboardAddrFlag, + utils.DashboardPortFlag, + utils.DashboardRefreshFlag, + utils.DashboardAssetsFlag, utils.EthashCacheDirFlag, utils.EthashCachesInMemoryFlag, utils.EthashCachesOnDiskFlag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 5bb2255f3b..a834d5b7ae 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -25,6 +25,7 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/internal/debug" "gopkg.in/urfave/cli.v1" + "strings" ) // AppHelpTemplate is the test template for the default, global app help topic. @@ -97,6 +98,16 @@ var AppHelpFlagGroups = []flagGroup{ utils.EthashDatasetsOnDiskFlag, }, }, + //{ + // Name: "DASHBOARD", + // Flags: []cli.Flag{ + // utils.DashboardEnabledFlag, + // utils.DashboardAddrFlag, + // utils.DashboardPortFlag, + // utils.DashboardRefreshFlag, + // utils.DashboardAssetsFlag, + // }, + //}, { Name: "TRANSACTION POOL", Flags: []cli.Flag{ @@ -268,6 +279,9 @@ func init() { uncategorized := []cli.Flag{} for _, flag := range data.(*cli.App).Flags { if _, ok := categorized[flag.String()]; !ok { + if strings.HasPrefix(flag.GetName(), "dashboard") { + continue + } uncategorized = append(uncategorized, flag) } } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index a996b9d0a4..5c29292685 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -38,6 +38,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/dashboard" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/gasprice" @@ -183,6 +184,31 @@ var ( Name: "lightkdf", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", } + // Dashboard settings + DashboardEnabledFlag = cli.BoolFlag{ + Name: "dashboard", + Usage: "Enable the dashboard", + } + DashboardAddrFlag = cli.StringFlag{ + Name: "dashboard.addr", + Usage: "Dashboard listening interface", + Value: dashboard.DefaultConfig.Host, + } + DashboardPortFlag = cli.IntFlag{ + Name: "dashboard.host", + Usage: "Dashboard listening port", + Value: dashboard.DefaultConfig.Port, + } + DashboardRefreshFlag = cli.DurationFlag{ + Name: "dashboard.refresh", + Usage: "Dashboard metrics collection refresh rate", + Value: dashboard.DefaultConfig.Refresh, + } + DashboardAssetsFlag = cli.StringFlag{ + Name: "dashboard.assets", + Usage: "Developer flag to serve the dashboard from the local file system", + Value: dashboard.DefaultConfig.Assets, + } // Ethash settings EthashCacheDirFlag = DirectoryFlag{ Name: "ethash.cachedir", @@ -1019,6 +1045,14 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { } } +// SetDashboardConfig applies dashboard related command line flags to the config. +func SetDashboardConfig(ctx *cli.Context, cfg *dashboard.Config) { + cfg.Host = ctx.GlobalString(DashboardAddrFlag.Name) + cfg.Port = ctx.GlobalInt(DashboardPortFlag.Name) + cfg.Refresh = ctx.GlobalDuration(DashboardRefreshFlag.Name) + cfg.Assets = ctx.GlobalString(DashboardAssetsFlag.Name) +} + // RegisterEthService adds an Ethereum client to the stack. func RegisterEthService(stack *node.Node, cfg *eth.Config) { var err error @@ -1041,6 +1075,13 @@ func RegisterEthService(stack *node.Node, cfg *eth.Config) { } } +// RegisterDashboardService adds a dashboard to the stack. +func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config) { + stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + return dashboard.New(cfg) + }) +} + // RegisterShhService configures Whisper and adds it to the given node. func RegisterShhService(stack *node.Node, cfg *whisper.Config) { if err := stack.Register(func(n *node.ServiceContext) (node.Service, error) { diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 0000000000..84810f7173 --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,46 @@ +## Go Ethereum Dashboard + +The dashboard is a data visualizer integrated into geth, intended to collect and visualize useful information of an Ethereum node. It consists of two parts: + +* The client visualizes the collected data. +* The server collects the data, and updates the clients. + +The client's UI uses [React][React] with JSX syntax, which is validated by the [ESLint][ESLint] linter mostly according to the [Airbnb React/JSX Style Guide][Airbnb]. The style is defined in the `.eslintrc` configuration file. The resources are bundled into a single `bundle.js` file using [Webpack][Webpack], which relies on the `webpack.config.js`. The bundled file is referenced from `dashboard.html` and takes part in the `assets.go` too. The necessary dependencies for the module bundler are gathered by [Node.js][Node.js]. + +### Development and bundling + +As the dashboard depends on certain NPM packages (which are not included in the go-ethereum repo), these need to be installed first: + +``` +$ (cd dashboard/assets && npm install) +``` + +Normally the dashboard assets are bundled into Geth via `go-bindata` to avoid external dependencies. Rebuilding Geth after each UI modification however is not feasible from a developer perspective. Instead, we can run `webpack` in watch mode to automatically rebundle the UI, and ask `geth` to use external assets to not rely on compiled resources: + +``` +$ (cd dashboard/assets && ./node_modules/.bin/webpack --watch) +$ geth --dashboard --dashboard.assets=dashboard/assets/public --vmodule=dashboard=5 +``` + +To bundle up the final UI into Geth, run `webpack` and `go generate`: + +``` +$ (cd dashboard/assets && ./node_modules/.bin/webpack) +$ go generate ./dashboard +``` + +### Have fun + +[Webpack][Webpack] offers handy tools for visualizing the bundle's dependency tree and space usage. + +* Generate the bundle's profile running `webpack --profile --json > stats.json` +* For the _dependency tree_ go to [Webpack Analyze][WA], and import `stats.json` +* For the _space usage_ go to [Webpack Visualizer][WV], and import `stats.json` + +[React]: https://reactjs.org/ +[ESLint]: https://eslint.org/ +[Airbnb]: https://github.com/airbnb/javascript/tree/master/react +[Webpack]: https://webpack.github.io/ +[WA]: http://webpack.github.io/analyse/ +[WV]: http://chrisbateman.github.io/webpack-visualizer/ +[Node.js]: https://nodejs.org/en/ diff --git a/dashboard/assets.go b/dashboard/assets.go new file mode 100644 index 0000000000..ef2cf6ac9a --- /dev/null +++ b/dashboard/assets.go @@ -0,0 +1,260 @@ +// Code generated by go-bindata. +// sources: +// assets/public/bundle.js +// assets/public/dashboard.html +// DO NOT EDIT! + +package dashboard + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _publicBundleJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7d\x57\x1b\xb9\x93\x28\xfc\xf7\xf0\x29\x94\xdc\x59\x6c\x27\xc6\x60\x92\xcc\x0b\x0c\x93\x25\x84\x64\xd9\x9b\x84\xdc\xc0\xcc\xdc\x3d\x2c\xd7\x91\xbb\x65\x5b\xa1\xdd\xf2\x74\xb7\x01\xff\x02\xdf\xfd\x39\xaa\xd2\x7b\x77\x1b\x63\x9c\xf9\xed\xec\xb3\xe4\x9c\xd8\x96\x4a\xa5\x52\xa9\x54\x7a\x2b\x55\x6d\x3e\x81\xbf\x4d\xd2\x1c\x4c\xd3\xa8\xe0\x22\x6d\x8e\x45\x3c\x4d\x58\xde\x22\x5f\xc9\xe6\x26\xb9\x62\xfd\x09\x8d\x2e\x5e\x09\x51\xe4\x45\x46\x27\x6b\xa6\xc4\x77\x9b\x9b\xe4\x74\xc4\x08\xc2\x93\x88\x46\x23\xe6\xe4\x5e\xd2\x8c\xf0\x34\x2f\x68\x92\xb0\xf8\x3d\xe2\x24\x7b\xe4\xeb\xed\xae\x01\x2a\xe3\xca\xd8\x9f\x53\x9e\x31\xa2\x89\x71\x20\x74\x12\xe9\xf5\x14\x4d\x3d\x05\xdd\xeb\x29\x9a\x8f\xe2\x16\xf9\x5a\x85\x5d\xa2\x3f\x18\xb1\xe8\x82\xf0\x81\xa6\x97\xe7\x84\xa7\x25\xaa\xbf\xe3\x83\x66\x48\xf5\x99\xc6\x7e\xee\xa2\x27\xdf\x7d\xf7\x5d\xc6\x8a\x69\x96\x96\x9a\x69\x0b\x74\xd8\xf5\x44\x64\x45\xbe\xeb\x16\xbb\x0d\x29\xcb\x18\x2d\x18\xa1\x24\x65\x57\x9a\xba\x26\x4d\x63\x32\x99\x16\x84\x17\x84\xa7\x85\x20\xc5\x48\xb1\xb8\xe5\x96\x96\x4c\x56\x25\xf6\xe6\x90\x21\xf9\xee\x11\xce\x77\x88\xce\x6c\x7b\x19\xc9\x0e\x19\xd0\x24\x67\x7e\xaa\x6a\xc5\x0e\xf9\xea\xd1\x5e\xdd\x95\xb2\x49\x87\xd7\x2c\x9a\x16\x0c\xa8\x56\xf4\x55\x74\xe9\x77\xe3\x12\xbf\x22\x9a\x24\xaa\x37\x35\xef\xda\x0a\x83\xfe\xb4\xe9\x15\x92\xd0\xaa\x25\xe9\x4d\x42\x87\x2e\x3d\x34\x27\x89\xa0\x31\x8b\xcb\x04\x75\x12\xb2\x47\x8a\x6c\xca\x6a\x91\x7d\xc2\x8e\x97\xe8\x14\x35\x44\x0c\x1c\xec\x2e\xb8\x12\x12\x9f\x78\x57\x20\x6e\xcb\xb5\xf8\x23\x43\x96\xc9\x5d\x66\xe6\x44\xf4\xbf\xb0\xa8\x20\x4d\xcb\x02\x95\xd3\xeb\xb9\x02\x52\xc1\xa1\xce\x98\xec\x69\x34\x75\x43\xb1\x54\x61\x69\x9c\x54\x21\x8e\x2a\x64\xb0\xae\x86\x98\x0d\x78\xca\xc8\x90\x15\x05\xcb\x8c\x6c\x90\x81\xc8\xc8\x88\x66\x63\x91\xce\x34\x63\xef\xa8\x34\x26\x7b\xa6\x78\xd3\x48\x46\x4a\xc7\xac\xad\xb0\x07\x83\x96\x0f\x9a\x8f\xaa\x10\x09\xbf\x74\x2b\x1c\xeb\xc7\xc0\xf1\x0e\x12\xfe\x31\x13\x13\x96\x15\xb3\xb0\x46\xbf\xc8\x77\x91\x48\x07\x7c\x38\xcd\x68\x3f\x61\x95\x03\xeb\x3b\x96\x4e\xc7\x4c\xe5\x4b\x89\x0b\xb2\x87\xac\xd8\x51\xcd\xf0\x32\x6e\x5b\xb5\x1a\xa5\x56\xbf\x0e\x59\xf1\x9a\x0d\xe8\x34\x29\x0e\x81\x68\x9f\xeb\x91\x18\x4f\x68\xc1\xfb\x3c\xe1\xc5\x8c\x5c\xf1\x62\x44\x52\x91\x6e\xe8\xce\x50\x02\x73\x47\x67\xa4\x6e\x67\x60\x91\x80\x8d\x52\x61\xa9\x4e\xd7\x52\x48\xd6\xd7\xf5\xe0\xe8\xf5\x58\x8e\x82\x43\x5e\x7a\xed\x35\xa4\xda\x46\x34\xe5\x04\xe5\x8d\xad\xb3\x46\x8c\x59\x8d\xf3\x5d\x72\x4b\x76\x6a\x31\x60\x15\xc8\x85\xbc\x8c\x67\x97\xdc\x7a\xdc\xad\x14\xbb\x26\xb6\xa2\x4d\x1a\xb4\x61\x24\x6d\xb7\x62\xdc\x63\xd6\xee\x22\x3d\xa4\x44\x6c\x92\x89\x42\x14\xb3\x09\xeb\x8c\x68\x7e\x7c\x95\x6a\x61\x03\xe5\x78\x47\x0f\x08\xb7\x07\x50\x49\xb4\xc9\x44\x21\x70\x5a\xba\x48\x55\xe5\xf2\x1e\x67\x7c\xda\x2d\x31\x93\x69\x3f\xe1\x51\x6f\x42\x8b\x51\xaf\x77\x07\xb9\x13\xb2\x47\x1e\x3f\xae\xc3\xf9\x4e\xd0\x98\xb0\xb4\xc8\x66\x46\x69\xa7\xb1\x6e\x41\x59\x3d\xa8\x8c\xaa\xf5\x41\x55\xdd\x72\x35\xf2\x7c\x6b\xdb\xed\xb4\x5b\xa3\x3b\x1f\xfe\xe7\xb4\xa5\x79\xb6\xb6\xf9\x84\x6c\x11\x95\x56\x5e\x6c\xb5\xc9\xdc\x39\x8d\x7c\x5d\x93\x08\xfe\x38\x7c\xf5\x71\xff\xe0\x7f\x93\xdf\xf7\x3f\x91\xa3\x0f\xff\x7e\x78\x70\x7a\x74\xfc\x81\x3c\xd9\xb4\xd8\x26\x99\x88\x58\x2e\x97\x6e\x9b\x4f\x9e\xac\x91\x27\xe4\x40\x4c\x66\x19\x1f\x8e\x0a\xd2\x8c\x5a\x64\x7b\xab\xfb\x6c\x63\x92\xb1\x9c\xa5\x45\x9b\xbc\xa1\x11\xeb\x0b\x71\xd1\x26\x47\x69\xd4\x59\x23\x50\xe0\x74\xc4\x73\x92\x8b\x69\x16\x31\x12\x89\x18\x96\x49\x09\x8f\x58\x9a\xb3\x98\x4c\xd3\x98\x65\x30\x2b\xbc\x3f\x3a\xd5\xc9\x64\x20\xa6\x69\x2c\xd7\x52\xc5\x88\x49\x14\xef\x8e\x0e\x0e\x3f\x9c\x1c\x92\x01\x97\xab\x2c\x9c\x24\x33\x21\x0a\x12\xf3\x8c\x45\x85\xc8\x66\x38\x57\xda\x8a\x8a\x8c\x31\x49\xc0\xe6\xda\x1a\x1f\x10\xdd\x8a\x0e\x4b\x2f\x3b\x1f\x8e\x5f\x1f\xf6\x0e\x3f\xfc\x4e\x1e\xed\xed\x91\xc6\x24\x13\xf1\x14\x9a\xda\x90\x4c\x21\x44\xaa\x93\x4f\x87\xfb\x07\xa7\xbd\xc3\x77\x87\xef\x0f\x3f\x9c\xf6\x4e\xff\xe3\xe3\x21\xd9\x23\x4d\x29\xd4\x62\x40\x4e\x66\xe3\xbe\x48\xc8\x9e\x2c\xad\xd9\xd4\x20\xeb\xeb\x6b\x84\x10\x95\xd9\x91\xea\xaf\x94\xd2\x6c\x64\x8c\x46\x45\x87\x25\x6c\xcc\xd2\xa2\xd1\x6a\x91\x9b\x1b\x80\xd9\xba\x66\x34\xfa\x71\x77\x4d\x55\xcf\xf3\xdf\x69\xc2\xe3\x43\x84\x2b\x0f\x3f\x24\x94\x68\xb1\x55\x74\xa9\xf9\x1b\xe8\xc2\xef\x86\x2a\xa2\x33\x65\x93\xd3\x69\x92\x84\x19\x9d\xef\xbf\x57\x58\x64\xf1\x72\xf3\x77\xd7\x88\x1c\xa7\x6b\x44\xae\xdf\x5f\xc1\x44\x9a\xf0\x88\x17\xc9\x8c\x4c\x73\x9e\x0e\xc9\x67\x39\xa0\x37\x24\x8e\xfc\x33\x99\x89\x29\xa1\x19\x23\x62\x52\xc8\x3c\x58\x6c\xca\x85\x68\xcc\x2e\x59\x22\x26\xd0\xa8\x3e\x1b\xd1\x4b\x2e\xb2\x0e\xe2\x1c\x15\xc5\x64\x67\x73\x73\xd0\xef\x8c\xd9\xa6\xc5\xb5\xc1\xd3\x0d\xd9\x43\x8a\x31\xc5\x28\x13\x57\xc7\xe9\x6b\xe8\xf5\xfd\x48\x76\xa9\x59\x56\x91\x60\x39\x44\xf6\x2a\x87\xed\xf3\xe7\x2f\x5a\x4d\x9f\xc1\xed\x2a\xbc\xad\xdd\xb5\x5b\xc2\x92\x9c\x01\xaf\x1f\xd2\x6a\x2b\x61\xf7\x6f\xf4\x82\x4d\xfa\xa1\xd5\x94\xf4\xce\x1d\xd2\xb7\xa8\x80\xe7\x69\x85\xe6\xb3\x56\xab\xb5\xa6\x14\xca\x6d\x4b\x2e\x1c\x48\xf7\x41\x2a\xe6\xf1\x34\x67\x24\x2f\x32\x1e\x15\xa0\x92\xef\xa5\x70\xe6\x0c\xdd\xbd\xca\xa1\xbb\x18\xb7\xb6\x9e\xf9\x7d\xbb\x60\xa9\xe7\xdf\x8a\xc3\xdb\x0f\xe2\xb0\x1c\x16\xbd\x9e\x22\xa9\xb7\xff\xfe\x75\xef\xf5\xe1\x9b\xa3\x0f\x87\xbd\xfd\x4f\x9f\xf6\xff\xa3\xd7\x6b\x57\xe7\x7e\x3a\x3c\xf9\xed\xdd\x69\xaf\xb7\xbb\xf9\xe4\xd1\x1a\x29\x2b\xf5\x1f\xc8\xbf\xb3\x98\xfc\x41\x8b\x5c\xa4\x52\x5a\xdf\x55\x2b\x6c\x95\x4c\x9a\xef\x8f\x4e\x5b\x6d\x92\x33\xb6\x46\xb4\x58\x7f\x61\xf1\x15\x96\x1f\xf2\x62\x34\xed\x77\xb8\xd8\x8c\x12\x9a\xe7\x72\x5d\x9b\xaf\x41\xa3\xc9\x30\x11\x7d\x9a\xe8\xb5\xbb\x54\xd7\x86\x07\x44\x2e\xa3\xd6\xbe\x6b\x58\x11\x6a\xec\xae\xad\xc1\x72\x0f\x57\x16\xb0\xf5\x0f\x56\x19\x12\xc2\x20\x80\xda\x3e\xc8\xda\x14\x2e\x28\x0c\xa9\x70\x70\x70\x76\x2e\xc1\xbf\x93\xca\xba\x09\x7a\x97\xec\x91\xad\x5d\xc2\xc9\x2f\x84\x66\xc3\xa9\xd4\x0d\x79\x27\x61\xe9\xb0\x18\xed\x12\xfe\xf4\x29\xe2\x00\x24\x34\x1b\x92\x3d\x0b\x75\xc6\xcf\x77\x65\x96\x14\xd8\x47\x34\x1b\xb6\x48\x24\xd2\x82\xa7\x52\x31\x39\x45\x4e\x67\x13\xb9\xab\x56\xaa\x96\x66\x43\xcc\x95\xa5\x4c\xae\x94\x6c\xd9\xdc\x74\xd8\x20\x37\x37\xc4\x4b\x4f\xa7\xe3\x3e\xcb\x1a\x8a\x8e\xef\x54\x4b\x3a\x93\x69\x3e\x92\x08\x5a\x40\x83\x12\x6d\x89\x74\x3f\xcb\xe8\xac\xc3\x73\xf8\x04\x88\xca\xa2\x96\x4f\x1d\x3a\x99\x24\xb3\xa6\x9c\x22\xda\x04\xe0\x43\x94\x1e\x3d\x6a\x9a\xd1\x48\x0d\x23\x2f\xd8\x4c\x4e\xd3\xc0\x08\xcc\x82\x36\x62\x57\xe1\x28\xa1\xd9\xb0\x2d\xe1\x5a\x72\xad\x4e\xb3\xe1\xd9\x05\x9b\x9d\x1b\x68\x9f\x3e\x09\xb6\x8b\x19\xb7\x6b\xe6\x7f\xf9\xdf\xad\xe4\x9f\x9a\x06\x75\x91\x2f\x82\xa7\xcd\x06\x69\xc8\x22\x32\x5f\xd6\xac\x38\xae\x96\x7c\x30\xf1\x4b\x41\x96\x42\x17\x37\x9c\xdd\x82\x1a\x6e\x48\x47\x49\x31\x58\x3e\x49\xd4\x96\x27\x72\x02\xc2\x22\x9b\x9b\x24\x63\x43\x9e\xcb\xcd\x08\xcd\x49\xc3\xca\x7b\xa3\x2d\x45\x22\x97\x59\x69\xa1\x36\x43\x93\x31\x91\x23\x9a\x0e\x19\xec\xf5\xd6\xbe\xfb\xee\x51\x73\xde\x58\x06\x91\xbd\x63\x40\x3b\xab\x05\x2d\xf4\x1e\x83\x34\xf9\xdf\xdd\xaa\xbe\x76\x34\x4c\x7d\xcd\xad\x36\xf0\x7d\x7e\xcd\x92\xad\x86\xab\x92\xa9\xcd\x0a\xd5\x3a\x07\x01\x08\x9b\x51\xcc\xdf\x7d\x77\xc5\xd3\x58\x5c\x75\x9c\x51\x1c\x76\xc1\xda\x6d\x53\x16\x0a\x14\xea\xb3\x05\x14\x2a\x2e\x80\x37\x49\x3e\xe2\x63\xd8\xac\xe2\x84\xae\x26\x1b\x29\xbc\xfd\x4c\x5c\xe5\x2c\x03\x05\xab\x93\xf7\xca\x93\xc5\x57\xb9\x2c\xda\xdc\xc4\xd3\x8c\x98\x0c\x32\x31\x26\x57\x23\x5a\xb0\x4b\x96\x69\xed\xc6\x73\xa2\x96\xc8\x24\x17\xa4\x18\xd1\x82\x14\x2c\x2f\x48\x36\x4d\x53\x96\xe5\x98\x92\x17\xd3\x3e\xe1\x85\xc4\x15\x8b\xb4\x51\x90\x7e\xc6\xe8\x85\x5c\xd4\xa6\xc3\xbc\x43\xc8\xab\x69\x41\xae\x18\x49\x19\x8b\x49\x21\xc8\x55\x46\x27\x78\x92\x47\x28\x91\xdb\x99\x88\x16\xd1\x08\xcf\x1f\xa5\x58\x16\x84\xe7\x12\x97\x84\x9b\x30\x58\x4c\xa3\x12\x95\x4d\x50\x0b\xf1\xab\x11\x8f\x46\x24\x16\x2c\x97\xf5\x29\x1d\x4c\xd3\x99\xa2\x5b\xd6\x7a\x54\x34\x24\x37\x72\x1e\x33\x42\x25\x3e\x23\x5c\x7d\x16\x51\xa9\x9a\x8b\x6c\xb6\x09\x75\xb3\x9c\xc4\x4c\x2e\x7e\xc6\xfc\x1f\xb0\x4a\x8f\x58\x56\x50\x9e\x12\x96\x0e\x79\xca\xf2\x0e\x4e\x56\xc8\xa8\x13\x56\x9c\xf2\x31\x13\xd3\x62\xd7\x49\x3d\x48\x18\xcd\x4c\xfa\x9a\xa9\x4b\x6d\xc2\xb1\x90\x98\xc2\x46\x1d\xd6\xaf\xb0\x70\x83\x55\xd6\x61\x96\xc9\x15\x76\x6e\xf0\xca\x49\x82\xa4\x42\xae\x34\x59\x4a\xf4\x58\x87\x49\x3c\xc4\xeb\x56\x4b\xea\x71\x47\x2e\x58\x3d\xf6\x60\x02\x03\x54\xd9\x4c\x7d\x93\x7f\x8e\x42\x72\xc8\xf5\xf7\x13\x2d\x07\x5e\xfe\x85\x5c\x23\x7b\x4e\xd9\x5d\x03\xea\x2c\x6b\xe6\x96\x0d\x19\xea\x60\x58\x43\x3c\x28\x4e\x4d\xe6\x12\xb2\x30\xa2\xdb\xf9\xad\xf6\x18\xb9\x48\xbb\xbd\x0e\xda\xf3\xca\x2f\xd4\xf6\xa0\x7c\x45\xb7\xdf\x87\x01\x8b\x62\xbb\x5d\xbb\x25\xcd\x56\xcb\x8a\x5b\x36\x4d\x15\x80\x94\x11\x8d\x58\x32\xa6\xcc\xd9\x3d\xb7\x83\x5d\x1a\x36\x37\x53\x91\x8d\x69\x42\x58\x7a\xc9\x33\x01\xcb\x0f\x18\xdd\x34\x65\x24\xe7\xc5\x94\xca\xba\x72\x03\xaf\x94\xbf\x45\x26\xeb\x6e\x93\xad\x96\xdb\x55\x9b\x9b\x92\x0c\x47\x1a\xaf\x28\xe8\x04\x7a\x49\x79\x42\xfb\x09\x23\x7d\x4c\x24\x09\x85\x93\x36\x25\xf1\xa6\x01\xd5\x2d\x08\xa5\x43\x2e\x68\x1e\x85\x90\xb0\x02\xa8\x6e\xeb\x82\x52\xbf\x50\x13\x7d\x69\x94\x9a\x71\xc4\x52\xfc\x2f\x17\x63\xd6\x17\xf1\x0c\x06\x75\x1e\x65\xec\x8a\xc5\x38\x45\x3b\x1c\x91\x0c\x48\x05\x39\xea\x1c\x76\xc8\x98\xc6\x71\xca\xf2\x12\x93\x43\x7a\x03\x3a\x50\xa6\x9a\xac\x65\xe9\xf0\xa9\x52\x94\xfd\x01\x94\x31\xd8\x4d\xf2\x14\xab\x94\xd5\xcb\x55\x77\x1e\x65\x7c\x82\xea\x07\x54\x0f\xbb\xa4\x09\x8b\xe5\xbc\x02\x60\x5a\x99\x17\xd9\x34\xc7\x02\x6a\x0e\x52\x07\x00\xd0\xde\x08\x8e\xd3\x09\xca\x51\x32\xf3\xaa\xaf\x69\x09\x2e\xda\x70\x5d\xe8\x35\xaa\xae\x61\xaa\x29\x39\x1d\xc3\xbd\x08\xed\x8b\x4b\x25\x44\x92\x02\x2e\xa7\x15\x4a\x2e\x59\x96\xcb\x81\x21\x06\x48\x3d\x4c\x84\x63\x49\xf9\x88\x5e\xb2\x0a\xf2\xe5\x4c\xdd\x28\x46\x5c\x2e\xa7\x46\x62\x32\x98\x26\xc9\x8c\x88\x69\x06\xcb\x6d\x76\x5d\x90\x48\x64\x72\x0f\x4f\x44\x31\x62\xd9\x15\xc7\x99\xf0\x8a\x27\x89\x52\xe7\x54\x23\x64\x52\xa7\x2f\xde\x72\x59\x67\x55\xcb\x95\x80\xad\xb9\xb3\x4a\x36\x4d\x5d\x65\xd0\x1c\xd3\xec\x02\xef\x0c\xfc\xe1\x7e\x10\xaa\x41\x57\xaf\xad\x60\xc8\x47\x15\x44\x94\x07\xbd\xa7\x8c\x97\x1c\xf6\xa5\x96\x54\x4d\xac\x76\xec\x1f\x78\xed\x5c\x5f\xaf\x6d\xf8\x3d\xb4\xff\x82\x6d\xfe\xeb\xb4\x40\x95\x08\xec\x86\x73\xcb\xb7\x57\x04\x2b\xd2\x04\x6e\x6b\x5c\x5d\xe0\x35\xac\xb6\x71\x7f\x0b\x65\xd0\x09\xc9\x3d\x11\x63\xa6\xa9\xca\x0d\x59\x40\x4c\xcc\x07\x03\x96\xc9\x05\x7d\x06\x77\xa7\x70\xdd\xe5\x8a\xe9\x65\xee\x48\xcd\x7d\xd8\x8a\x8a\xa6\xcc\x56\xa3\x68\xd6\x6e\x61\xc1\xfc\xe7\x94\x4d\x99\x3a\xc3\x90\xbf\xe3\x8c\xf2\x54\x6e\x61\xf6\xf0\x52\x50\x2d\xab\xa7\x99\xa4\xf2\xff\x48\xe0\x5d\x5b\xee\x28\x8d\xd9\x35\xd9\x23\x1b\x5d\x77\x95\x2d\x1b\x90\xfe\x36\xf9\xc0\xae\x8b\x53\x1e\x5d\x34\x5d\x8d\xf5\xc8\xe0\x87\x61\xec\xa0\x75\xc7\x2b\xb6\xcd\x1d\x6f\x65\xb2\x8c\x0e\x74\x70\xa8\x43\x16\x17\x95\x6e\x9f\x07\x16\x89\x34\xa2\x45\x13\xf2\xcc\x60\x0a\x56\x7d\xa5\x06\x5a\x62\x64\xb5\x7f\xd6\xd4\x07\x84\x42\x2d\x4d\xa3\x30\x6e\xdd\x2d\x88\x93\xef\xf0\x45\xb7\x6f\x3e\x17\xe0\xec\xda\x28\x30\x67\x19\x18\xb0\x5c\xd5\xec\x30\x0d\xcf\xb6\x0d\x92\x84\xa5\x64\x8f\xb8\x6d\xc0\x12\x57\x23\x9e\xb0\x66\xc2\x52\x4f\x7b\x3a\xac\xd3\xa5\x76\x4b\x0c\x96\x02\xa4\xd3\x00\x0d\x69\x3e\x7d\xea\x30\xf1\x17\x12\xa0\xad\xea\xc0\x30\x3f\xac\xfe\xcc\x22\x3c\xef\x64\xd3\xb4\xe9\x88\xb6\x65\x93\xff\xad\xb2\x23\xe5\x5f\x1d\x13\xb0\x68\xd0\x6a\xa9\xa6\x4a\x5c\x75\x44\x31\x9c\xac\x55\x37\xe1\x61\xaf\x3e\x7b\x4e\x55\xff\x78\x87\x2b\xce\x12\x5e\x1d\xef\xe5\xb2\x3e\x76\x45\xcc\x71\x9b\x77\x84\x48\x36\x48\xb7\x65\xe5\xbf\x94\xfd\x2b\xe9\xba\x6c\xf4\x4e\x25\xbb\x77\x9c\x4a\xba\xbc\x94\x84\x9c\x71\x59\xdb\x79\xe9\x88\x32\x54\x27\x86\xcf\x78\xd0\x26\x89\x3f\x2a\xd8\x18\xd7\xad\x12\x51\xcb\xa1\xd8\xe5\x38\xcc\xf2\x5d\x39\x77\x3f\xaa\x1c\x02\x56\xc4\xed\xc0\xb1\xe3\x0a\x8f\x4c\x2e\x7f\x22\x09\xbf\x60\x70\x38\x12\xf3\xa8\xe0\x72\xc1\x81\xba\x3d\xb7\x03\xcf\xa5\x27\xa3\x33\xbb\x3b\xe7\x79\x67\x30\x55\xe6\x01\xbb\x36\x0d\xa0\xa0\xe1\x19\x9d\xc9\x5e\x94\x08\x9c\x5b\xe9\x6c\x9a\x96\xce\xc8\x5c\x84\xde\x11\xa8\xc5\x28\x05\x62\xd7\x08\x44\xc1\x0b\xb0\x8f\x6a\xa8\x53\xa2\x86\xcd\x52\x29\x66\xec\x3a\xf7\x17\xea\xb8\x48\xa7\xd0\x6c\x78\xa9\x06\xa0\x4e\xd2\x73\xe0\x1e\x69\x34\x76\xe5\x1c\xc4\xc6\x93\x62\x46\xf0\x3c\x98\x14\x82\xd0\x4b\xc1\x63\x92\xb1\x21\xbb\x9e\x10\x9e\xe7\x53\x96\x87\x85\xcd\xa9\x94\x69\x63\x2a\xc4\x44\xb6\xd3\x91\x68\xa8\x43\xa6\x3b\xe4\xc4\xf1\x3b\x38\x9e\x04\xe2\xfd\x3c\x91\x46\xac\x9c\x38\x18\x94\xd2\x32\x36\x16\x97\xac\x16\x0f\x66\xef\x27\x89\x86\xc8\x4b\x20\x6c\xcc\x8b\x52\xe2\x24\x63\x13\x96\xd6\xd3\xa7\xf2\x8f\xd3\xa8\x5c\xb7\x01\x4a\x9c\x3a\x6d\xff\x83\x65\x8e\xb5\x62\x38\x3b\x27\x0e\x9b\xfa\x3c\x8d\x95\xca\x08\x0b\x54\x9f\x11\x85\x05\x39\x9e\x12\xe5\xd3\xc9\x44\x64\x85\x3a\x22\x72\x68\x8a\xae\xe2\x50\x1a\x35\x25\x8d\xcd\x06\x71\xa4\x25\x1a\xc5\x3c\xf3\x60\x63\x9e\xdd\x49\x07\x96\xaa\xa1\x42\x03\x4d\xc7\x34\x77\x75\x9b\x4b\xc5\x16\x18\x68\x04\x27\xac\xcf\x57\x78\x29\xb8\xb6\xa6\x0a\xb8\xa6\x3a\x66\xe2\x83\xeb\x2d\x9a\xe7\x7c\x98\xd6\xdc\xcc\x6d\x3f\x7b\xd1\xf2\x01\xb7\x25\x24\x4f\x0b\x96\x89\xc9\x27\x84\xd3\x06\x3e\x0a\xa2\xe5\x8e\x8e\x1a\x50\xd1\xff\xe2\xb0\x41\xf4\xbf\x48\x65\x27\xfa\x5f\x3c\x8b\x22\x48\xdf\x21\x5f\xf5\x86\x67\x07\x12\x6e\x77\xa5\x0c\xe9\x66\xa9\x2c\x49\x94\xa2\xcf\x24\xdd\xdc\x38\xdd\x59\xd0\x6c\xc8\xd4\xf6\xe7\xde\xca\x5f\xc2\x2a\xd3\x87\x50\xe7\xaf\x79\xb3\x89\xba\x9a\x41\x58\xab\xb2\xa5\x7e\x5f\xc8\x80\x07\x0b\xe2\xd5\x8d\xab\xf1\x91\x7a\xb8\xc5\x21\x7b\x0a\x3d\xfc\xd2\x93\x8e\x9d\x72\x6e\x25\x49\xda\x76\x01\x8a\xe1\x98\xf0\x44\xec\xc5\x5f\x26\x62\xe5\x7e\xb2\x7d\x22\xfa\x5f\xa0\xa9\xb9\xb5\x0d\x41\x8a\xb5\x8e\xf5\xba\x8a\x83\x9c\xb8\xcb\x43\x59\xb4\xc3\xe5\x1a\xe6\x78\xd0\xe4\x2d\xf2\xeb\x1e\xd9\x72\xef\x06\x35\xdc\xa3\x45\x8d\xa7\xda\x84\xb7\x42\x04\x8a\xf5\x5c\x32\x5e\xf4\xbf\xa8\x89\x7e\x21\x2e\xff\xf0\xcf\xbc\xdd\xbf\xc3\xfc\xf1\xb1\xed\xac\xc7\x6d\xc5\xfe\x64\xaa\x8c\x1a\xd7\x6e\x5b\xbb\xa6\xe7\xf2\x11\x63\x45\xfe\x9e\xa6\x74\x08\x7a\xdf\x5c\x42\x69\xbd\x20\xbb\xa1\x46\x7d\x3c\x7b\xd6\x72\xa1\xe6\xe9\x0e\x90\x03\x0d\xcc\xae\x0b\x96\xc6\x08\x5f\x65\x2f\x10\x02\x3e\x9b\x83\x58\xe3\x32\x65\x86\xac\xf8\xa8\x25\xe1\x78\x50\x53\xc5\x4f\x35\xe0\xf3\x9a\xe0\x43\x1a\x04\x70\xab\x76\x40\x93\x04\x2c\xda\xeb\xda\xf4\x73\x0d\xfc\xbc\xa6\x05\x98\x2d\x06\x30\x50\x3f\x90\xb9\x75\xd5\x75\xb7\xaa\xa0\xe7\x56\xe6\x20\x35\x65\x27\x22\xcf\xe5\xca\xf2\x40\xa4\x79\x91\x4d\xa3\x42\x64\x68\x6a\x5d\x5b\x6f\xf7\xee\xb2\xf3\xa8\xa8\xaf\xd0\xe0\xe5\xe9\x88\x65\xbc\xa8\x6f\x7a\x19\x74\x5e\x8d\x06\x9d\x29\x85\xab\xe8\x3f\x78\x31\x12\xd3\x42\x0d\x2d\xce\x6a\xeb\x7b\x71\x57\xc1\x79\xb5\xd7\xd5\x65\x70\x8e\xe9\xa4\x6e\x94\xbc\xe8\xba\x50\xf3\x24\x77\x4c\x27\x16\x94\xa7\x27\x74\xc0\x8e\xd2\x82\xe1\x80\xaf\xc4\xfd\xc3\x8f\x35\x05\xe6\x56\xe3\x41\x1a\x04\x60\xb8\x57\xd7\x59\x3e\xd4\x3c\xec\x00\x60\xa5\x2b\x13\x93\xd3\xd9\x84\xd5\xa9\xa6\xad\x32\xe4\x3c\xe4\x06\xc8\x14\xbb\xa2\x99\xda\xf0\x56\xd2\xfd\x3c\x04\x9c\x87\x5d\x81\x98\x22\x23\xc1\xf3\xe2\x83\x48\x3f\xc9\x26\x9d\x14\xb4\xe0\x51\xad\xed\xd4\x8f\x5b\x73\x8b\xcd\xab\xb6\x0a\xde\x92\x9d\xd1\xc9\x6b\x9e\x4f\x12\x3a\xfb\x40\xc7\xac\xa6\xfa\x1f\x9f\xd7\x15\x98\xdb\x5e\x1f\xd4\xd5\xb5\x77\x57\xb9\xfd\xe2\x87\x9a\x02\x77\x28\xe7\xaa\x1a\xd5\x69\xe6\x3c\x49\x79\xfe\x63\xb7\x12\x7c\x5e\x6d\x2e\x9c\x29\xfc\x25\xaf\xab\x62\xfb\xc5\x4f\x2e\xd4\xc7\x8c\xe5\xc6\x6e\xbe\x8e\xaa\x9f\x7e\xac\x2d\x32\x8f\xb2\x10\xd6\x20\x49\xeb\x89\x33\x35\x21\x8c\x8f\xf9\x0f\x9e\xc4\x11\xcd\xe2\x66\x2f\xcd\x83\x39\xe5\xfd\x94\x9f\x8e\x58\x6d\x47\x76\x7f\xfc\xb9\xa6\xc0\x5c\xd6\x7a\x90\x06\x41\x21\x7f\x39\xdb\xd3\xea\x0a\xb7\xab\xe1\xe7\xd5\xe7\x01\x06\xf4\xbe\x95\x69\x7a\x56\x9c\x23\xb2\x2f\xba\x2f\xee\x2a\x79\x77\x93\x4b\x45\xdc\x51\x70\x52\xcc\x12\x96\xc3\xcb\x34\x51\xd7\xfc\x17\xdd\x1f\x6a\x8b\xdc\x31\x74\x3c\xd8\x79\x1b\x3c\x23\x0d\x6a\x87\x27\xd7\xdf\x95\xdb\x3b\x7f\xfb\xb7\x6b\x8e\x9a\x61\x1b\x90\xb2\xab\xe3\xfe\x17\xdc\x06\x18\x14\x8f\xf0\xbc\x51\x16\x0c\x37\x5c\x4e\x65\x8b\xaf\xf5\x71\x93\x85\x55\xe9\xad\x95\x50\x5f\x25\x3d\xb7\x2a\xcf\xd9\xbb\x00\xa5\x8a\x6a\xcc\x04\xc0\xbf\x60\xbf\x2b\x1b\xdb\xa7\x7d\x96\x7c\x4c\xa6\x43\x9e\xbe\x49\xc4\x15\x68\xed\x8f\x7a\x5e\x82\x19\x4a\x36\xb8\xf7\x6f\x7c\x38\x62\xd9\x71\x16\xb3\xec\x40\x8c\x27\x22\x45\x33\xf7\xea\xa5\xd0\x0f\xad\xce\x43\xd0\xde\xdc\xd4\x4c\xae\x1d\x9a\xce\xe0\x8c\x8d\x5c\x31\x7a\x01\x27\x92\x1f\xd8\x15\xf9\xf7\x93\x13\x7c\x72\x96\x46\xac\x03\x8d\x42\xa5\xd8\xdc\x6a\x83\x1a\xeb\xa0\xa8\xb7\x9a\x3a\xc1\xd7\x6b\xba\x2b\x5a\x68\x99\xb6\xb9\x49\x7e\xcb\x19\xa1\x24\xe7\xe9\x30\x61\x85\x48\x89\x40\xf3\xd9\x49\x26\x2e\x79\xcc\x62\x22\x52\x46\xfa\x33\x7c\x8d\x89\x3a\x19\xab\x1d\x56\x8c\x5c\xa8\xb3\x6e\x78\x3a\x55\x63\xcd\x6f\x95\xf9\x19\x9c\xa1\x47\x62\x2a\xfb\x9d\x14\x02\x8d\xd1\xb2\x4b\xa6\x4f\x0c\x84\xe4\x58\x47\x96\xd8\xcf\xc9\x15\x23\x58\x01\xde\x32\xca\x51\x45\x60\x83\x45\xe2\x29\x9c\x42\x46\x9a\xb5\x7f\xf0\x24\x79\x2f\xb1\x92\x84\x0f\x58\x34\x8b\x12\xd6\x06\x53\xb8\x11\x4f\xe2\x8c\xa5\x70\x6d\x39\xa2\x69\x9c\xb0\x98\xd0\x41\xa1\xec\x86\x27\x34\x63\xa9\xdc\xe0\xe5\xf8\x04\x15\x6a\x27\x62\xa0\xea\x52\xaf\x23\x72\x72\x25\xa6\x49\x2c\xf1\xf5\x75\x99\x8d\x5f\x01\x75\x87\x1c\x15\x84\xe7\x84\x4a\x1e\xf6\x13\x36\x26\x72\xe9\x39\x1c\xe1\x6d\x22\x55\xc0\x64\x82\x66\xbe\xd4\xda\x0c\x82\x3d\x1c\xd8\xbc\xa5\x8c\xc5\xb9\x64\x85\xb8\x64\x59\x06\xc6\x6d\xe9\x0c\x09\xcf\x91\x8e\xbc\x43\x40\xa3\x9c\x40\xd3\xd5\x4b\x4c\x00\x80\x2b\x57\x4a\x46\x20\x6c\x60\x43\x38\x61\x11\x1f\xf0\x88\x17\xb3\xb6\x31\x8b\x53\x25\x4a\x1c\x3e\x11\x70\x45\x99\x8b\x64\x0a\xa3\x91\x03\x19\x19\x03\xb3\x6a\xdc\xc8\xca\x82\x63\xf3\xcc\x85\x5d\xb2\x2c\xd7\x5c\x02\x02\x36\x7e\x05\x38\xc9\x40\x89\x11\xee\x49\x55\x9b\x5d\xd2\x5c\xba\x50\xa2\x40\x10\x0e\x94\x1c\xec\x95\x96\xc5\x5a\x7e\x94\x02\x0e\x77\xd5\x75\xbb\xed\x94\x5d\xe1\xea\x5d\x97\xd7\xe2\xf7\x07\x23\x53\xf5\xe4\x13\x6e\x7e\xf1\x2c\x5b\x5d\xde\x42\xa3\x07\x28\x95\x56\xd2\x94\x2d\x24\x1a\x40\x82\xa9\x23\x05\x6e\xe8\x7b\x01\x6c\x47\x2a\xc4\x44\xcf\xda\xda\xfe\xf2\x28\x55\x2c\x2a\x04\x5e\xd1\xe6\x2c\x19\x6c\xa8\x13\x4f\x4f\x6c\xf3\xb6\x94\xf1\x8c\x25\x33\x62\x4d\x00\x55\x2d\x20\x41\xa9\x28\xcc\xe8\xc4\x0a\x15\x90\xae\x13\xce\xe0\xb7\xdc\x29\xc6\xbe\x21\x04\x18\x75\xa9\x00\x17\x84\x4e\x72\xf0\x6e\xc7\xcd\x32\x27\x36\x41\x55\xce\x80\x37\x2b\x0f\x6f\x9c\xd7\x60\xbb\x9f\x3e\x56\x53\x41\x2c\xb3\xe0\xfa\x60\x8d\x10\x78\xee\x45\xc8\x13\xa9\xbf\x06\xd3\x44\xf2\x15\xcf\x29\x1c\xbd\x40\x27\x93\x84\xa3\x3d\xaa\x65\x2f\xdc\xa3\x3f\xd9\x5c\x23\xda\x22\x7b\xa7\x4e\x01\xab\xc7\x80\x6b\x41\x6d\x4a\xa2\xd5\x74\x08\x0a\x8b\xe6\x52\xae\x41\x60\x68\x92\xf4\x69\x74\x41\xd4\x03\xf6\x98\x45\x42\xaa\xc1\xd8\x52\x60\x09\xe0\x69\xca\xb2\x4f\x6c\x50\x4b\x81\xec\xc0\xb5\xdb\xdd\xfb\xf0\xea\x28\x95\x44\xfb\xbc\x5a\xac\xa1\x1d\x9e\x6b\x46\xb7\xd7\x08\x4a\xdc\xe2\x45\xf4\xad\xd9\x07\x51\xb0\xb6\x12\x57\x9e\xcb\x29\x23\xe6\x52\x06\x69\x92\xc8\x85\x06\x12\xd7\x06\xeb\x8a\x41\x22\xae\x24\x4c\x0e\xfb\x26\x42\x53\x9a\xcc\x72\x78\x23\xe7\x5a\x12\xf3\x34\x4a\xa6\x31\x23\xbc\xe8\x40\x05\xef\x78\x7a\x21\x27\x2c\x47\xf3\x83\x15\x0c\x75\x39\x2c\x47\x5c\x01\x46\x26\x30\x5c\xc6\x22\xe6\x03\x3d\x87\xe9\x99\x17\x14\x30\x56\x51\xec\xca\x12\x72\x5a\x65\x34\x6e\x13\x5e\x28\xa9\xcd\x95\x8b\x02\x53\xa8\xad\xeb\xfa\xac\x78\xfa\xd9\x08\x02\x0e\x45\x99\x8d\x4b\x3d\xf7\xa0\xd6\xa6\x36\x51\x8f\x1c\x67\x7a\x25\x68\x0e\x6e\xc5\xa4\x50\xb7\x63\x55\x57\xaf\xea\x19\x82\x3a\x37\xef\x9e\x07\xd6\xec\x2f\xfd\xcc\x1d\xd0\x3b\x66\xec\xd9\x03\x63\xb3\xee\x70\x0f\xe6\x7b\xaa\xea\xef\x25\x99\x7a\x64\xab\xb4\x8e\x49\x6b\xdb\x6b\x78\x07\xac\xaa\x6c\x40\x19\xdc\x66\x93\x9d\x0a\x50\x8b\x72\x90\xf0\x89\x53\xa9\xfc\x69\x33\x53\xea\x51\x04\xef\xce\x4d\x66\x6e\x66\xc1\x63\xc3\x40\xd0\x4a\x75\x47\x45\x56\x3d\x29\x84\x6d\x72\xd6\x30\x24\x35\xda\xa4\x21\x6b\x97\x9f\xb2\xa2\xc6\x79\xcb\xb1\x6f\xc8\x83\x3d\x02\x54\x54\xda\x08\xd8\x1a\xc2\xce\xde\xb5\x96\x12\xb0\x1d\x3a\x15\x9a\x8f\x1e\xe6\x8e\x1c\x3e\x3c\x1d\x1e\xa6\xb4\x2f\x17\x27\x37\x37\x0e\xcf\x6f\x6e\xf4\x03\x1d\xe4\x8b\xf3\x20\x47\x51\x2a\xf5\xba\x8f\x4f\xb3\x0e\x97\x5a\x5e\x07\x39\x77\x2c\xee\xf4\xfb\x74\x8f\x18\x93\x86\xb9\xb8\xbc\x62\xfa\x06\x1d\x3e\x6a\x1f\xb5\x3e\xb6\x2f\xe3\x1e\x93\x97\xc8\x44\x7d\xc4\x63\x79\xe7\x91\xf3\x0b\xd9\x92\xdd\xf4\x9e\x16\x2c\xe3\x34\xd9\xf8\xed\x68\x07\x1e\x34\x8e\xe1\x51\x18\x4c\xa8\x94\x8c\xd9\x58\x64\x33\x92\x30\x7a\xd1\x91\xfd\x77\x3a\x62\x7e\xa3\xdc\x7b\x46\x35\xf4\x87\x99\xb8\xd2\xa6\x5c\xd1\xa8\xd3\x38\xb7\xef\x73\x5a\x64\xc7\x4e\xa5\xba\xdf\xa0\xa7\xbd\x3b\x98\x1e\x68\xe2\xef\x4b\x23\x8b\x60\xc3\xcc\x01\xa9\x6d\x19\xe0\x68\x93\x52\x41\x55\x0d\xb1\xc8\x01\xb2\x29\x35\x4c\xde\xd6\xab\x6f\xf7\x56\x0b\xa7\x5f\xff\xb4\xdb\xd6\x83\xb6\x5a\x80\xc3\xe2\x56\x43\x1e\x1e\x23\x2b\x01\xae\x3f\x46\x0e\x71\x21\xe9\x9d\x5e\x0f\x36\x87\xbd\x9e\x14\x46\x3d\x06\xdc\x23\xfe\xa0\xad\xad\x96\x6b\x3c\x16\x34\xc7\x25\x0d\xc8\xea\xc8\xf9\x40\xaf\x9d\xfc\x9c\x69\x9a\x4f\xfb\x79\x94\xf1\x3e\x3b\x8a\x3d\xeb\x19\x0b\x83\xdb\xa1\xaa\x9c\x70\x65\xe8\xfd\x0e\x81\x63\x9e\xcb\xc1\x87\x23\x5b\x6d\x66\xd0\xf4\xc1\xb1\xce\x71\x69\x76\xc6\xc8\x09\xbd\x64\x75\xe4\x15\x6a\xc0\xd7\x12\x68\xd5\xd8\xe2\xc5\xc1\x29\x8e\x5a\x7f\x7d\xc4\xa5\x61\x66\xf1\x60\x49\xbd\x79\xab\x81\xdb\x5d\x0b\xbb\x41\x1d\xb6\xb9\x85\xcf\x52\x48\x3e\x97\xfd\xfe\x25\xcf\x9d\x9e\x93\x3a\xa7\x06\xb3\x6f\x00\x34\x07\xd0\xef\xa0\xd0\x6e\xa8\xba\x0f\x17\x42\xe5\x1a\x73\xdd\xae\xad\x85\x38\xeb\xbb\xba\x0e\x7b\x4d\x09\xd7\x80\xc9\x35\xe2\xdd\x2f\x0a\x1a\x8d\x9c\x6d\x84\x9e\x41\xd4\x22\x51\xef\xe7\xcd\x3e\xce\xac\x51\x68\xae\x37\x5a\xaa\x07\x5c\xb4\x62\x40\xe0\xc4\x7e\x63\x24\x8a\x0d\xf0\xec\x83\x3b\xd8\x91\x10\x17\x39\x89\x68\x2a\xb7\xa6\x0c\xfd\x12\xc5\xf8\x12\xcb\x1a\x86\x46\x89\xc8\xa7\x99\xc1\xbb\xe3\x22\x1e\x15\xc5\x24\xdf\xd9\xdc\x54\x0f\x63\x23\x31\xde\x1c\x52\x46\x33\x91\x6e\x86\x15\x6e\xf6\x13\xd1\xdf\x1c\xd3\xbc\x60\xd9\x66\x9e\x45\x9b\x13\x5a\x44\xa3\x4e\xcc\x2e\x3b\x5f\xf2\xff\xf5\xae\xbb\xf5\xe3\x22\x03\xc5\x4b\xbc\x63\x54\x80\xbe\xd1\xb7\x96\x56\xd1\xb8\xc2\x52\x3a\x9a\xd8\x29\x27\xd9\xae\x6a\x97\x65\xdc\xad\xf2\xdc\xb1\x05\xb4\xbb\xc6\x9b\x1b\xe8\x9b\xa2\x91\x93\x84\xfe\x63\x06\xe6\xcd\x53\xb9\xce\xef\xd4\x0c\x58\x7f\xc2\x7f\x19\x1e\x9f\xea\x86\x74\x78\xca\x0b\x4e\x93\xa6\xd1\xf6\x37\x37\x15\xdb\xb7\x1d\xbb\xc9\x2c\xd9\x98\x43\xbd\xd6\xac\x61\xcd\x90\x7e\x78\x8d\xd3\xde\x40\x4a\x1e\xcb\x0b\x32\x99\x66\x32\x25\xef\xac\xcd\x81\xca\x0d\x98\x81\x72\x76\x7d\x78\xe9\x59\x9a\xdb\xce\x6c\x77\x5c\xb0\xd9\x0e\x69\x94\x4f\x65\x1a\x6d\x47\x7d\xc1\xc5\xb9\xb5\xf4\x2d\x01\x37\x7d\x6d\x80\x76\x6f\x30\xaa\x9a\x96\xcb\x25\x7b\x64\xe8\xdc\x5a\x4a\x5e\xf3\x78\x61\x42\x34\x6c\x40\x87\x99\x4a\xb7\xc9\x1e\x41\xb6\x07\xaa\xee\x91\xd7\xef\xa1\x4e\x73\x4d\x71\x83\xfe\x32\xcd\x0c\xe7\xbc\x3a\xc1\x31\x50\x4d\x57\x9a\xdb\xae\x05\x4f\x15\x09\xb0\xf5\x48\x62\xb3\x9e\x87\xd6\x20\x3f\x77\xcb\xfa\x77\xdb\xc8\x73\x3d\x84\xea\x17\x17\xbe\xe5\xf1\x05\xc4\xec\x13\x53\x87\x4a\xbe\xc2\x53\x87\x6e\xf0\x8c\x3f\x99\x79\x07\x23\x72\x18\xc0\xe1\x93\xda\x5d\x4e\x27\x31\x2d\x58\xc9\x2c\xfe\xd5\xcc\xcb\x97\x5b\xc9\x31\xa3\x29\xc9\x58\xc4\xf8\xa5\xc4\x48\xd3\x18\x8e\x06\x00\xbd\xc4\x07\x5b\x3c\x29\xc8\xb0\xa4\xce\x3b\x55\xad\xca\x19\xdc\xef\xb1\xe6\xd7\xdb\x76\x85\x79\x66\x09\x3e\x66\xc0\x05\xcd\xda\xd0\xa0\xd8\xfb\x7d\x7b\x4f\xc9\x95\xc3\xe2\x13\x34\x07\xec\x52\xf2\x45\x87\x92\x5b\x26\xa0\x1c\x5e\x86\x07\x73\x89\x3e\xa0\x23\x89\x18\xf2\x28\x10\xec\x5a\x65\xbe\x17\xa8\x73\xa9\xc0\xee\xe1\x24\xc3\xfe\x2d\x32\x38\x14\x97\x2b\x75\x80\x02\xb9\xcf\x84\xb3\x22\xcd\x22\x79\xfd\x5b\x3a\xbe\x8f\x96\x53\xe0\x55\x7a\xae\xaa\x8d\x55\x9d\xe1\x2b\x0a\xed\x4a\xa7\x62\x19\x55\xa9\x3e\x9c\xd2\x81\x02\x29\x23\xf7\x85\x77\x11\xd6\x20\x47\xe7\x30\xc3\xb0\xbc\xa4\xa2\x4c\xfb\x6a\x16\x5d\xf7\x14\x9b\xd2\x36\x5e\x8b\x44\x8d\xb0\xec\x86\x65\xe5\xd2\xc0\xae\x3f\xcb\x8b\xd2\xce\x90\x15\xcd\x32\x9e\x72\xa7\x3d\x72\x51\x85\xad\x08\xaa\xa9\x3c\xc4\x76\xe1\x2b\xe8\xc8\x2b\xe9\x68\x7b\xa8\x5b\xf3\xf9\xe4\x40\x9a\x83\x0a\x27\x0d\x9a\x5a\x23\x92\x8f\x4a\x85\xe7\x35\xd1\x1c\x97\x07\xca\x34\x63\x83\x7c\x87\x6c\xb5\x83\x64\x28\xba\x03\xf2\xed\xab\xd5\xdd\xda\x1a\x80\x1d\x40\x6b\xbb\x5c\x73\x3d\x1b\xe0\x2c\x25\x04\xef\x48\xb2\x40\x7f\x6d\x55\x4d\xa7\xb9\x3e\xff\x2b\x73\x5f\xdd\xce\x69\x42\x52\x5a\x9a\x19\xd0\x20\x88\x15\xd4\x3d\xc8\x77\x01\xee\xe9\x2f\xcc\xfd\xd3\x78\xe1\xe0\xc8\xd9\xba\xbb\x06\x20\x76\x29\xe7\x1e\x4c\x78\x4c\x5e\x2b\xb7\x18\x8e\x61\xd5\x68\xb0\x97\x90\xf6\x86\x4a\x09\x62\x7b\x91\xd5\xbb\xfc\x93\x84\xee\x20\xbd\x61\xdf\x0f\x12\x3e\xd9\xd1\x47\x60\x78\x6e\x28\x1b\xde\x17\x22\x61\x34\x6d\x90\x97\x98\xb8\x83\xab\x80\x0e\xba\x60\x83\xed\x9c\x04\xcb\x8a\xa4\x11\x62\x4c\x78\x7a\xa1\x7c\x55\xfa\x0d\x6d\x93\xd2\x06\xa4\x5d\xd5\xa9\xe6\x20\x31\x6c\x46\x0a\x7b\x8f\xd4\xdd\x6e\x28\xc4\xa5\x63\xcb\x56\xb8\x46\x2a\x4b\x9d\xe6\x32\x7c\x56\x48\xba\x9e\xb7\x42\x4c\xf6\xb6\xec\x13\x38\x7f\xc9\x66\xba\xab\xc2\x2d\x8f\x01\x38\xdf\x2d\xc9\x9c\x0f\x50\x16\x2e\x3f\xbf\x43\xe3\x18\x8b\xd4\x3e\xa5\x0a\x24\xa9\x66\x94\xb9\x07\x91\x73\xa7\x18\x9c\x26\xe7\x4c\x31\x66\x1e\xfd\x6f\x3c\xc5\xd4\x23\xba\x8f\xfe\xae\xe9\x8a\x0d\xe8\x8a\x07\x28\x47\xaf\xee\x98\x25\x4c\x6b\xc2\xaa\xc9\xec\x8b\x79\x8f\xe3\xaa\x91\xea\x41\x51\xa1\x43\xff\x72\x81\x47\x5a\x17\xa4\xf0\xf6\xbe\x0b\x28\xdc\x2c\xcd\x91\x6e\x04\xa8\xdb\x9f\x3e\xab\xda\x9f\x1a\xdb\xcd\x5c\xb3\x07\x8f\x66\x83\x76\xaa\x9b\x2e\xb9\x6b\x90\x1b\x44\x80\xe9\xa8\xc4\x10\x56\xdf\x68\x5a\x40\x9d\x12\x42\xc2\xa3\xe7\xc5\xef\x6a\x7a\xea\xd4\xf8\xac\xa1\x6a\x6e\xb4\x49\x43\xe3\xc6\x4b\x9a\xa0\x65\xd6\x8f\x9a\x9e\x46\xfd\x7c\x64\x18\x8b\x0f\x0c\x9c\x7a\x31\xe1\xca\xc0\xa3\xfb\xa8\x85\xc5\xc7\x6e\x8d\x22\xa8\x15\xe3\xbb\xc7\x70\xe5\xfe\x87\x54\x34\xb2\x8c\x10\xe9\xd3\x3d\x3a\x77\x25\xe4\x88\x42\xc9\x13\x8e\xa9\xa1\x6e\x8a\xbf\x6d\x87\xe4\xa8\xe5\x00\x3c\x6c\xb0\x80\x6e\x25\x9d\x8c\xc5\xd3\x88\x39\x3e\x8b\x68\x14\x4d\xc7\xd3\x44\xf2\x4c\x39\x68\x0b\xc7\xe5\x03\xef\x9d\x02\x1a\xd1\xae\xed\xe6\x46\x8d\xa3\x3a\x59\x28\xdd\x4e\x15\x23\x06\xb6\x75\x9f\x1b\xe4\x29\x7c\x79\x4a\x1a\x9f\x89\xfc\x01\xaf\xdf\xd0\xb6\x4a\x7b\xb9\x57\xbc\x33\x36\x05\xea\xa2\x8a\x8f\x27\x68\x6d\x84\xc7\xb7\x50\x78\xc1\x25\x9b\xac\xae\xd3\x68\xb5\x49\xe3\x3f\xc4\x14\xce\x82\x45\x9a\xcc\xac\x3d\x91\x48\xcd\x69\xf3\x40\x24\x89\xb8\xe2\xe9\x70\xc7\xd6\x10\x74\x49\xc0\x93\x96\xba\x24\x6b\x37\x5a\xfa\xbe\xec\x3f\xd3\x8a\x0b\xb3\x95\xf5\xc9\x23\x47\x26\x4c\x87\x18\x6f\x4d\x41\x96\x7b\x23\xfa\x4d\xba\xe5\x92\x26\x1c\xcf\x47\x97\xef\x11\x6d\xdd\xa0\xea\x24\x94\xa4\x22\xf5\x9f\xd3\x2a\x73\x04\x22\x06\xd8\x31\xa5\x86\x02\xc2\x05\x3b\x20\x18\xbd\xc6\x9d\x21\x09\xfe\x9c\xe1\xa5\x2d\x3a\x2b\x07\xc4\x53\xd2\xa8\x24\x6a\x37\xc0\x78\x1b\x12\xa2\x0e\xa9\x9d\x7a\x76\xc3\xb5\xf1\xd7\xdb\x96\xbf\x21\xab\xf4\x9c\x65\xf4\x4d\x40\xdf\xdc\x65\xd9\x58\x64\xac\xac\xe9\x37\x37\x89\xba\xe1\x71\x8e\x17\x95\x10\x68\x07\x75\xbe\xf9\x8e\x2d\x78\x02\xc6\x2a\x68\x11\x86\x8e\x40\x84\x31\x2b\xfb\x6c\x6e\xed\x9b\xad\xcf\x04\xcd\x3f\x37\xd0\x0c\xec\xa0\x0a\x9d\xec\x24\x53\x24\xec\x1d\x49\xba\x73\xfa\xaa\x15\x7e\x6d\x73\xf5\x6d\x00\xbe\xfa\x30\xe7\x3c\xb8\x33\x53\xae\x85\xad\x78\xd6\xef\xcc\xac\xf5\x90\x66\xf9\x6d\x1b\x88\x69\xe3\x1c\xde\x06\xab\xdc\xc1\x8e\x9d\xfb\xbd\xee\x33\x6b\x1a\x7b\x8f\xa2\x28\x03\x15\xaa\x2c\x06\x9a\x21\x99\xa5\x5b\x71\xbc\x79\x0e\x1e\x1b\xdc\xb1\x9b\xac\xb9\xbe\xdb\x71\x5f\xac\x98\x1a\x71\x0d\xb2\xa6\x64\xd0\x7f\xa7\xa0\x81\xda\x0b\x5f\xe3\x78\x84\xee\x48\x91\xde\x75\x9a\xf1\x81\x5e\xc0\x86\xc0\xb4\xd2\xcd\x74\xdf\xdd\x2c\xaa\x37\x75\x8b\x17\x35\x69\x53\xf2\xb6\x90\xfd\x19\x0e\x41\x34\x29\xc2\xbe\x00\xb6\x57\x3e\x95\x29\x5d\x04\x95\xfa\x71\x73\x53\x0d\x04\xd7\xfe\xd3\x69\xbd\x35\x83\x12\xe6\x62\x9a\x2c\x77\xec\x81\x08\x63\xef\x39\x0c\x4e\x30\xc1\x3b\x9b\x0a\x75\xdd\x26\x0d\x6b\xb4\xd5\x68\x79\x86\x2d\xa1\xfc\xde\xe2\xcb\xd5\xf2\x43\x5d\x8b\x61\xee\xf3\xd3\x25\x1d\x33\xff\xf8\xd7\xbe\x72\xf7\xdf\xc1\xd6\x99\xc3\xff\x60\x9f\x69\xf8\x05\xe6\x3d\x8f\xf0\x21\xff\x49\xaf\xdf\xcb\xaf\xaa\xdb\xb8\xc9\xb2\xc6\xb2\xde\x5b\x09\x3b\x12\x82\x86\x3a\x06\x66\x06\x91\x16\x49\xb5\x6b\x83\x0f\x3d\x0a\xcb\x01\x51\xd4\x58\xf6\x42\xa9\xb8\x39\x57\x19\x2f\x6c\x2a\x8a\x26\x88\xa8\x37\x53\x0a\xfb\x28\x03\xea\x0b\x5f\x5d\x8b\xfe\x97\x8a\x27\xd7\x3f\x3d\x48\xaa\xca\xfe\x67\xc9\x63\xc5\x8e\xc7\xd5\x5a\xe6\xf9\x76\xb7\x25\xf1\xe9\x6e\xc3\x36\x91\x12\x5d\x3f\xff\x97\x78\x70\xaf\x2d\x35\xa4\x62\x33\xc6\x52\x56\x40\x1e\x19\x00\x63\xd3\x21\x06\x1e\x68\xd9\x23\x86\x54\xf5\xe8\x15\xe3\xf1\x01\x4d\xe5\xfa\x52\x6a\x03\xfd\x2e\x00\xfc\x91\x19\x02\x1e\x63\x2f\x97\x7b\xad\xfb\xb0\x50\x1b\xff\xa3\x0c\x6a\x7b\x5c\x39\xbc\x70\x5c\xf2\x5a\xea\x38\xcb\x95\x5b\x0c\x65\xd5\xa6\x7b\xb7\xca\x65\x3b\x1e\x87\x54\x3a\x46\x42\x1b\x7e\xf4\x98\x07\x76\xa5\x00\xeb\x78\x44\xb2\x99\x1d\xab\x2d\xc0\xb7\x6b\x55\xfa\xcd\x8d\x6f\xa3\xe6\x40\xb9\x3a\xc5\x09\x4d\xa1\x27\xd8\xc7\xa0\x28\x1e\x4b\x25\x67\x0b\xb5\x5c\x04\x5a\xf5\x04\x85\xe7\xeb\x41\xcd\x23\x07\x0f\x68\x45\xa7\x0e\xeb\x22\xcb\x55\x51\xae\xe1\xb2\x19\x43\xc0\xeb\x42\x7c\xc4\x03\x21\x34\x1e\xff\xe8\x72\x5f\x2d\x15\x14\x48\xab\xdc\x67\x0e\x32\xfb\xcc\xcd\x45\xeb\x78\x95\xf2\xf0\xcf\xc3\xe4\x93\xb2\xeb\xae\x14\x1c\x28\xbd\x5e\xc0\x47\x28\xde\x10\x5e\x65\x28\x8b\x05\x86\x30\x6e\x9f\xeb\xbd\x0c\xd8\xc7\xb1\x08\x39\xef\x8d\xbd\xc2\xf5\x4f\x1f\xac\x39\x4b\x06\x6d\xd0\x9f\x8e\x4e\x96\x89\x65\xb5\xfb\x89\x81\x21\x5c\xa4\x75\x2f\x18\xc4\x8e\xd0\xbf\x28\x38\xac\x54\x86\x58\x3c\x67\x31\xd9\x20\xf9\x74\x02\xa7\xab\x2e\x04\x7a\xa7\xd4\x3a\x79\xcd\xf1\x9d\x08\x11\x6c\x48\xd3\x38\x94\x96\x09\x7b\x72\xd5\x6e\xcc\xae\xe5\xa2\xdd\xfd\xb5\x83\x43\x48\xb1\xda\x39\x0c\x93\x6d\x69\x61\x61\x5c\xbc\x3f\x76\xcf\x3e\x0c\x62\x3b\x43\x90\x97\x98\xbc\x03\x4f\x8c\x2a\x66\xf8\xee\xc3\x22\x7a\xdc\x5b\xd0\xf2\x45\xbc\x85\x3c\x7f\x66\xdf\x6f\xe7\x0b\xfb\x0b\xc9\x6b\xfc\x85\xe0\x03\xc1\xba\x70\x34\xa1\x9b\x8f\xbb\x1f\x0e\xb7\xfe\x5b\x0f\x9a\x69\x1f\x8e\x4e\xda\x28\xe4\xf0\xdd\x0e\x1f\xed\x09\xde\x64\xe1\xf6\xd3\xc8\x1b\x78\xc7\xf6\x33\x5d\xb3\x93\xca\x75\xce\x89\x84\x97\x92\x96\xb1\x1c\xfc\xc9\x81\x1b\x55\xc6\xe1\x4a\xa0\xcf\x30\x04\x94\xc8\x9c\x85\x4f\x1b\x0e\xde\x1e\x93\xa7\x55\x04\x2d\x37\xb2\x9c\xc6\xb6\xec\x10\xd6\xcc\xb0\xf3\x82\xff\xca\x6d\xbb\x0a\x81\xcf\x03\x77\x4a\x41\x26\x44\x56\xff\xef\x84\x5b\x01\xc3\xfd\x8a\xdd\x80\x0a\x9f\x58\xb5\xe8\xaf\xdf\x24\xd8\x89\x14\x5a\x05\x73\x98\xd3\xaf\xe1\xe8\x32\x22\xa1\x0e\x5f\x6b\xb2\x5b\x35\x62\x62\x1b\xe0\xbc\x0a\xd8\x73\x40\xaa\x14\xd0\xdc\x08\x18\x76\x60\x29\xa1\xc5\x20\x41\x0b\xba\x78\xf2\x43\x69\x92\xa6\x72\x74\xd7\x22\x4f\x36\xab\x90\x74\xe2\x66\x65\x7d\x8f\xa3\xc7\xed\x4a\x7f\x73\x1f\x3f\x1d\x9e\x1c\x7e\x38\xdd\x97\x5b\xf7\xde\xfe\xe9\xe9\xa7\xa3\x57\xbf\x9d\x1e\x9e\xec\x12\x8c\x4f\xb9\xb2\xfa\x69\x4d\xfd\x87\xbf\x1f\x7e\x38\xfd\x96\x15\xc7\x35\x15\x9f\x1c\xec\xbf\x3b\x84\x60\x6b\xab\xaf\xb3\x5f\x53\xe7\xbb\xc3\xb7\x87\x1f\x5e\x7f\xa3\x4a\xbf\xd4\x54\xea\x1f\xe5\xaf\xbc\xda\x51\x4d\xb5\x03\x9e\xc6\xfb\x49\xf2\x6a\x26\xf5\xe4\xca\x6b\xe5\x73\x6a\x3d\x18\xf1\x24\x0e\xea\x9d\xa6\x53\xb9\xee\x09\xaa\xbf\xc2\x0b\x5a\x08\xb0\x84\xf1\xb1\x56\x45\xdf\x45\x7d\x67\x7c\xc4\xd0\x34\x70\xcb\xb6\x5f\x14\x19\xef\x4f\x0b\x96\xaf\x9c\x43\xac\x96\x43\x49\xc1\xb2\xc3\x4b\x96\x16\xdf\xb0\xf6\xc1\xdd\xb5\xe7\xc7\x03\xe8\xa9\x95\xd7\xfd\x67\x4d\xdd\x70\xcd\x45\x0b\xf6\x07\x8f\x8b\xd1\xbf\x31\x3e\x1c\x15\x2b\xaf\x3b\xad\xa9\x9b\xe7\x27\x79\xb6\xf2\xda\x86\x73\xb9\x7c\x72\x39\x54\xd7\x22\xf9\x1d\xe3\x80\xe7\x27\xe0\x2e\x03\xfa\xe3\xf0\xcf\x29\x4d\x56\x3c\x1c\xc6\xb5\x6c\x39\x50\xce\x2b\xa0\xd6\x95\x33\x68\x52\x53\x2f\x5e\xb1\xbd\x9a\x81\xef\x92\x95\xd7\x9a\xd4\x0f\x7e\xb8\x5c\x00\xf1\xff\x46\x8a\x51\xd4\xd4\x3d\xa1\x59\x8e\xfd\x0b\x2e\xbe\x4b\xf5\xf2\x31\xd4\xfb\x64\x13\xad\x68\x4c\xdc\xb0\xa3\xf7\x1f\x8f\x3f\x9d\x1e\xbe\xee\xbd\x3f\x7e\xfd\xdb\xbb\xc3\xde\x56\x2f\x11\x31\xcd\x47\x3d\x9e\x7f\xe0\x09\xac\x8d\x2a\x8f\xf7\xbb\xab\x41\xdf\x8b\xe7\xb9\xbc\xea\xa4\xcd\xc5\x51\x2d\x47\x50\xd7\x62\x39\x81\x6b\xec\xda\x26\x77\x7f\x7e\xb1\xb2\x2a\x1e\xd0\xec\x0a\x6c\xcb\x91\xb5\x6d\x11\xa1\x07\xa5\xfa\xce\xfe\x69\x65\x35\x3c\xa0\xe1\x15\xd8\x96\x23\xeb\x99\x45\xf4\x46\x8d\xa4\xfa\x4e\xff\x61\x85\x75\x3c\xa0\xf1\x95\xf8\x96\x23\xed\xb9\x45\x05\x8e\xf5\xeb\xdb\xbe\x64\xb7\x97\x2b\x78\x40\xc3\xcb\xc8\x96\x23\xea\x05\x5e\xd8\xd7\x37\xf6\x81\x68\x1f\xd0\x44\x83\x63\x39\x12\x7e\x00\xe3\x00\x38\x2f\xc8\x6b\x9b\xb7\xb5\x0a\xdc\x0f\x68\xa3\x8f\x68\x39\x62\x7e\xec\xf5\x5e\xd3\x82\xfe\x56\xf0\xa4\xbe\xa1\x70\xa2\xb5\x04\xf2\x9f\x7a\xbd\x8f\xd3\x8c\x7d\x82\x85\x43\x3d\x76\xb8\x20\x82\x3f\x7b\x04\x56\x88\x03\x91\xe6\xd3\x31\xed\x27\x4c\x87\xaa\xc8\xb4\x73\xba\x30\x64\x2c\xdc\xa8\x05\xf7\x2d\x10\x8a\x61\x9b\xec\x99\x40\x17\x99\x0e\xa8\xa2\x3d\x95\x67\xc1\x3d\x0c\x14\x40\x0f\xd5\x34\xcb\xce\x38\x78\xaf\xd3\x96\x4a\x59\xb6\xed\x38\xd7\x53\xa9\x48\xc7\x20\x13\x63\x20\x42\x39\xb1\xc3\x3f\x49\x48\xcd\x39\x81\x7a\xe2\x42\x13\x3e\x4c\xe5\x4a\xf3\x15\xcd\x59\xc2\x53\xf0\xb3\x73\x3f\xa1\xe9\xd0\x0e\xda\x89\xb5\x25\x3e\xb9\x1a\x5d\x0a\x07\x86\xec\x95\x38\xfa\x8a\x94\x93\x11\x1f\x14\x0f\xa4\x27\x82\x37\x1a\x0f\x46\xf1\x91\x16\xa3\x15\xa0\xf9\x34\x5d\x92\x39\x0e\x1a\x91\x88\x6c\x15\x38\x8e\xd2\x82\x65\x13\x91\xc0\x76\x76\xe5\x08\xdf\xc0\x46\x26\x5f\x05\xde\x8f\x99\x18\xf0\xd5\xf0\x0d\x95\x00\x18\x98\x3e\x0c\xd9\x34\xcb\x1f\xdc\x0b\xe6\x3d\xd0\x52\x78\x44\xca\x8e\x07\xcd\xb3\x46\x52\x64\x8d\xb6\x7a\x4d\x44\x1a\xca\xc7\x4b\xe3\xbc\x85\x35\xc0\xe9\xd1\x43\xe9\x14\x63\x9e\xd2\x95\x69\x08\x06\xae\x84\x5e\xd1\xe8\x62\x98\x89\x69\x1a\x3f\x10\xdd\x80\x27\xc9\x0a\x50\x1c\x4f\x68\xc4\x8b\xe5\x58\x05\x5d\x21\xf7\x84\xcd\xb3\xe5\xe9\x58\x5e\x65\x62\x5f\xcb\x46\x2c\xad\x5e\xb4\x30\xa5\x22\xfd\x07\xcb\x84\x94\x24\x76\xc9\x52\x11\xc7\x65\xa1\xc2\x23\x8a\x87\xb2\x3c\x11\x22\x3e\x58\x81\x2a\x03\x44\x7f\xff\xce\x13\xe9\x43\x27\x3a\x89\xe2\x0d\x1d\xf3\xe4\xa1\xc3\x5d\x22\x3a\xe1\xff\x78\x80\x20\x2d\xcd\x4d\xb5\x04\x58\x9e\x7e\xcb\x4d\xd9\x82\xfd\xf8\xcb\x34\x5f\x8e\xaf\xff\x75\xda\x51\x64\xac\x88\x96\x5b\x7b\xd8\x51\x9d\x8d\x29\x4c\x0f\x57\x1c\x9e\x6e\x91\x46\x4a\xb3\x4c\x5c\xe1\xf7\x69\x52\x64\x74\x23\x12\x69\xcc\xd2\x9c\xc1\x88\x67\xd7\xa5\x24\xef\x47\xce\xc6\x7c\xa3\x9c\xc2\xae\x27\x34\x8d\x35\x0a\xf7\xbb\x44\xe7\xa6\x60\x9d\x6e\x4a\xa0\x64\xa0\xe9\xb3\x07\xab\x33\xdd\x70\x5e\xd0\x84\x47\xf2\x9b\xe8\x27\xfc\xcf\x29\xab\xae\xf2\x77\x9a\x71\xba\xe4\x50\x2c\x57\x9a\x8f\x69\x92\x6c\x44\x74\x92\x57\xd7\xf6\x07\x9c\x64\xaf\xa8\xb2\xbe\x48\x62\xfd\x89\xfd\x9a\x48\xec\xf0\xb5\xbb\xb5\xd5\x26\xdb\xf2\xbf\x67\xf2\xbf\xe7\xf2\xbf\x17\xf2\xbf\x1f\xe4\x7f\x3f\xca\xff\x7e\x92\xff\xfd\x2c\xff\x0b\x08\x1d\x26\xb3\xc9\xe8\x38\xe3\xfa\xe2\xe3\xdf\x44\xc6\xff\x21\xd2\x82\x3e\x74\xd6\x0d\x11\xff\xce\xb2\x82\x47\x0f\x46\xcb\xc7\x74\xc8\x1e\xb6\xce\xd3\xcc\xa5\xd3\x02\xa6\x42\x1d\xaa\xff\x64\xc2\x50\x56\x75\xc2\xff\x99\xd2\x84\x17\xb3\x72\xef\x5e\x30\x78\x37\xf4\xf7\x55\x3d\x09\x2b\x0a\x96\x9d\xc8\x79\xf5\x6f\xdd\x0c\x39\x04\x78\x3a\x5c\xc5\x4a\x03\x23\xcd\x1e\x3e\x78\xc1\x8a\x78\xde\xf3\xd5\xe0\x39\x29\x68\xf6\xd0\xa5\xc3\x98\xe6\x17\x0f\x44\x21\xfe\x69\x2b\xb0\x15\x49\x8a\xb8\x64\xd9\x20\x11\x57\x0f\x52\x18\x97\x1c\xbc\x57\x4a\x7d\x30\xe2\x71\xcc\x52\x98\x05\xa2\x4c\x24\xa0\xa2\xb5\x3e\xf1\x75\xc5\x44\x80\xa5\x15\xde\xac\xae\xa2\xfa\x8f\x54\x22\x04\x45\xa5\x52\xde\x70\x24\x40\xfd\x3c\x29\x32\x71\xc1\x9c\x04\xf9\x75\x62\x4b\x0d\x14\x78\x6e\xe0\x28\x26\xa4\x22\xad\x98\x38\xf3\x11\x9d\x7c\x6b\x8d\x1b\x65\x3c\x9f\x1c\xc6\x43\x7c\x6d\x3d\x64\x62\xcc\x8a\x8c\x47\x1f\x33\x16\xf1\x9c\x8b\xb4\x82\xaa\x42\x4c\x56\x31\xec\x25\x9e\x7f\xde\xfe\x62\x45\xd2\x8d\x3d\xf9\x77\xa7\xff\x35\xcd\x47\x10\x62\xf6\xc1\x5d\xaa\xb1\x89\xc1\x20\x67\x7f\xe3\x1d\x02\xb6\xe4\x1d\x4f\x59\x44\x97\x3b\xe6\xd4\x23\xaf\x3f\x2d\x0a\x38\x47\x12\xd3\x14\x17\xf4\x7f\x4e\x69\x56\x35\xda\x4d\x95\x5f\x04\x7f\xd8\xd1\xd5\x98\xe3\xf2\xd4\x56\xda\x67\x97\xac\xe2\x1c\x0b\xeb\x7c\x2f\xc1\x13\x3e\xe6\x7f\xfb\x0e\xfb\x6f\xa2\x4f\xc0\x1c\xe7\xef\xdb\x88\x82\x5d\x17\xfb\x69\x34\x5a\x72\x8a\xd0\x52\x9c\xcb\x15\x98\x94\xd9\x31\x8f\x63\x9c\x4b\x59\x5a\xb1\xa5\x95\xd5\xbd\xc6\x18\x0c\x0f\x3d\xf3\xd5\xf3\x30\xfa\xa6\xe4\xf8\x43\xae\x60\xf4\x77\xf9\xb9\x51\x8c\x32\x31\x1d\x8e\x60\x5c\x25\x3c\xbd\xa8\x26\xe9\x2f\xda\x2a\xbd\x63\x43\xde\xe7\x7a\xb7\xb4\xc8\x04\x3e\x4d\x79\x24\x62\xf6\x8a\xc7\x7c\x45\x5b\x64\x36\xee\x23\x51\x7d\x1e\xf3\x0d\xed\x80\xa2\x5c\x33\xac\x8a\x80\xd6\xd5\xaf\x06\x23\x91\x24\x74\x92\x57\xd4\x7a\x25\xb2\xf8\x6f\xbf\xe1\xba\xca\xb8\xdc\x6f\xbd\x17\xf1\xc3\x4e\x6e\x92\x6c\xa3\xe8\xc3\xd4\x90\xa8\x2f\x45\x7f\x23\x83\x5e\x4c\x70\xca\x48\x30\xb1\x42\xa8\x33\x9a\xe6\x03\x91\x8d\x1f\xbc\x4a\x58\xfa\xf8\xc9\x46\x6b\xb9\x5a\x5a\x45\xda\xeb\xd0\xd1\xf2\xc7\x44\x16\x49\x7c\xfd\x50\x04\xcb\x0d\x06\x8b\xe0\xa1\x04\x3c\xb4\xfe\xe5\xb4\x3c\x96\x87\x97\x03\x97\x34\x2b\x19\xbd\xab\x5b\x74\x91\x1e\x24\x3c\x5a\x6e\x13\x3d\x98\xa6\x11\xec\x40\xd3\xf7\x62\x9a\xb3\xd7\xe2\x6a\xb9\xc9\x21\xc0\xf3\xdb\x72\xeb\xc1\x00\xcb\xf1\xe5\x92\x57\x3d\x01\x9e\xf7\xe2\x72\xb9\xb1\x14\xd2\x33\x5d\x6e\x20\x04\x68\x0e\xd3\x65\xaf\xb0\x02\x44\xef\x18\x7d\x70\xc3\x4e\xc5\x34\x1a\x2d\x7b\xae\x14\xa0\x59\x01\x9f\x01\xcf\xf2\xc7\x4a\x01\xa2\x03\x9a\x46\x6c\xb9\x33\x5d\x1d\x72\x0a\x06\xde\xa7\xc3\xfd\x83\xd3\xde\xab\x4f\xc7\x7f\x9c\x1c\x7e\xea\xe1\x30\x7c\xbf\xff\xd1\x84\x95\x82\xd1\xd7\x50\xe3\x10\x9c\xd3\x8d\x65\xff\xc4\x30\x9a\x1a\xce\xd8\xb2\x79\xd3\x89\xcd\xf9\x6d\x62\xd3\x05\xc8\x7c\xc3\x19\x01\x36\x6f\x0c\xfc\x6d\x38\x52\xed\x94\x93\xb2\xd9\xb0\x82\x6a\x73\x18\x8a\x5b\xc3\x95\x3e\x9b\x9b\xa0\x0c\x35\x5c\x91\x82\xdc\x42\x32\x30\x52\x0c\x6c\x78\x0c\xb5\xf9\x4c\x0a\x4e\xc3\x4a\x91\xcd\x31\xb4\x1a\xc9\xb0\x79\x39\xf6\x6f\xc3\xed\xee\x86\x61\xb6\xf3\xc2\x86\xec\x11\xbb\xba\x93\xcb\x4a\x0a\xd3\xef\x44\x5c\xe1\x26\x11\x97\xbe\x89\x18\xc2\x44\x1c\xb3\xb4\x50\x4b\xbc\x82\x63\x08\xa3\x3e\xc5\xc5\x30\x1c\x73\xc1\x8a\x30\x8b\x79\x8a\x0b\xb2\x3f\xa7\x34\x2d\x38\x2e\x91\xf0\xfb\x3f\x70\x5d\x5b\x44\xa7\xaa\x78\xce\xfe\x9c\x4a\xa4\x58\xa0\x18\x65\x2c\x1f\x89\x24\x6e\x9c\x2b\x52\xdd\x87\x39\x40\xab\x5e\x02\xdb\xfd\x6b\xc6\x22\xa8\x38\xe2\x59\x84\x75\x45\x99\xc8\xe1\x20\x29\xe6\x74\x2c\xd4\x7e\xb7\xc0\x96\x15\x19\x07\x1b\x26\xb8\x2e\x9b\x31\x73\xec\x75\x8e\x6f\xc7\xd6\xc8\x13\xf2\x96\x61\x20\x3e\x65\x5e\x81\x4e\x6c\xc5\xc0\x8d\xfb\x25\xc1\xfe\x75\x42\x33\x3a\x26\xe4\x2b\x1a\xb5\xde\x82\x07\x1a\x72\x82\xbe\x66\x58\x6c\x1d\xd2\x00\xb0\xb2\xe6\xfa\x8a\xa6\xbf\xb7\xf8\xa6\xee\x75\x50\x83\x5b\x64\x53\xc5\xbe\x0c\xa2\x2c\x7b\x91\xf6\x6c\x0e\xf8\x93\x71\x9e\x22\xdb\x9f\xe6\xb1\x70\xa3\x81\x6f\x0f\xbd\xd7\x96\x40\xb3\xeb\xc7\x2c\x28\x24\xf3\x75\x31\x27\xc9\xf3\x75\x73\x73\x83\x69\xda\xd9\x6f\xc3\x34\xa3\xa1\xdf\xe4\x49\x16\xbc\xe1\x69\x0c\x1e\xf1\xb5\xb9\x5b\x92\x90\x31\x2d\xa2\x11\x8b\x6d\xa4\xcc\xfe\x0c\x5e\x1c\x77\xc8\x67\xf9\xf1\x59\xc7\x16\xa1\x04\xec\xf3\x75\x4c\x4c\xe5\xb1\x42\x64\x12\x2f\x12\x6e\x38\xe6\x3d\x6f\x72\x19\xe6\x65\x34\x75\x8d\x6d\xa8\xcf\x06\x47\xcb\x58\x8e\x86\x92\x67\xe0\x13\x41\x26\x15\xca\x45\x92\x4c\x51\xdc\x5b\xc6\x86\xb6\xd9\x02\xa6\x5b\xc7\x1c\x0a\x2d\xb4\x77\x4c\x27\x8e\xeb\x41\x27\xf4\x52\xe5\x5b\xb1\xa6\xf6\xf2\x59\xe1\x8c\xc5\x50\x1b\x16\x91\x75\x9f\x9b\xe7\xa7\xf7\xb0\x8c\xed\xd0\x8e\x7e\x0c\xd2\x19\x88\xec\x90\x46\x23\x87\x7d\x96\x6a\x48\x73\xc3\xbd\x41\x82\xea\x06\x8c\x18\xba\xbe\x8e\x5f\x3a\xf0\xde\x75\x7d\x5d\x15\x82\x9f\xa1\x4c\x39\x39\x8e\xf7\x6a\x2d\xbb\x2a\x2c\xd8\xf1\xa0\x69\x6a\x69\xc1\x9b\xe0\x8d\xae\xcb\x3c\xd9\x99\x9d\xc9\x34\x57\x14\xbb\xde\x1f\xd0\x4f\x94\x79\x77\x92\x43\xc0\xcf\xdb\x5d\x25\xad\x18\x97\x0a\xdd\x16\xf2\x2c\x2f\x7c\x51\xd5\x72\xda\x36\x11\x86\xe1\x21\x71\x31\x62\xd9\x15\xcf\x59\x47\x62\x58\x4c\x82\x95\xf8\x76\x3c\xf9\x75\x1e\xca\x85\x12\xec\x64\xdd\x2d\xc3\x73\x45\xbe\xdc\x7c\xd9\x21\xf8\xed\x6c\xeb\xdc\x1d\xba\x07\xf8\xcc\x1d\x43\x14\xc2\x11\xad\xd4\x56\x66\xd0\xb2\xeb\x28\x99\xc6\x3a\xc6\x85\x48\x59\x6e\xb8\x05\x5e\xee\x66\x13\x66\x9a\xe7\xbe\xec\x0b\xe2\x16\xaa\xe4\xda\x66\xa5\xec\x4a\xcb\x61\xe5\xf8\x74\x1c\x12\xfe\xcf\x18\x5d\x64\x8c\x82\xab\xc6\xea\x71\x59\x33\x2c\xd7\xd7\x49\xc5\xe0\x2b\xc1\x55\x8d\x44\xeb\xc8\x1a\x1d\xf5\x39\xbd\x19\x0e\x50\x7f\x68\x3a\x80\xe6\x89\xb7\x14\xca\x21\x2b\x60\x0e\xc1\x18\xd2\xf6\xe9\x26\xa1\xfa\xf5\x24\xc4\x52\xbe\x1c\xea\x31\x57\x39\x69\xb3\x84\xec\x63\x40\x12\x33\x34\x6d\x5c\xea\x49\x8e\xf3\xbe\x97\xef\x4d\xe7\x1a\x0d\x21\xb6\x5a\x18\xd6\x18\x31\xc0\xce\xe2\xd5\x8f\x4b\x83\x09\xbd\x1a\xa8\xc9\x5c\x27\x23\x2c\xc1\x48\xde\x4b\x3d\x60\x69\xb6\x24\xb2\x60\x8e\xd7\x11\xde\x40\xe6\x24\xb9\xda\x53\xf3\xfd\xe4\x8f\xe7\xbf\xd3\x84\xc7\xda\xe1\xa3\x24\xfa\x25\x61\x09\xba\x7a\x26\x3b\x84\x25\x66\x68\x3e\xaa\xc7\x3c\xe7\xe9\x51\xb3\x85\x01\x0a\xef\xa4\x5f\x4c\x0b\x27\x70\xdd\xe6\x26\x61\x79\xc2\xd3\x62\x43\x79\xd4\xdd\x48\xd9\x75\xb1\x21\x17\x92\x24\x15\x1b\x19\xc3\x57\xfd\x2c\xde\xc8\x67\x69\x41\xaf\xd7\x3c\xaf\x4a\x3c\xf5\x1d\x2e\x49\xf2\xbf\xde\x56\x46\xaa\x57\x8e\xa3\x79\x4b\x0e\x93\x1a\xb3\xfc\x33\xee\x38\x43\x05\x56\x88\x69\xd1\x52\x14\xdb\x30\x84\x62\x5a\xe0\x23\x01\xdf\x3f\xd3\xad\xbf\x12\x13\xd3\xa2\x76\x44\xb0\x4b\x88\xea\x76\x9f\xa1\x40\xe4\x60\xd0\x7f\xcb\x0c\x0a\x8d\x50\xcb\x1d\x44\xe5\xff\x37\x88\x7b\x9e\x41\x48\xf9\x91\xfa\x2e\x06\x48\x5f\xdd\x50\xb2\x7f\x73\x06\x55\xe5\x7b\x69\x7f\xba\xac\x00\x68\xb2\xa4\xed\x90\xf5\x3f\x03\xeb\xef\x36\xb0\xc2\x23\xba\xfb\x8e\x28\x47\x24\x31\x5e\xd4\x02\xe3\x4b\xe9\x70\x10\x25\x5d\xd8\xd7\xdc\x6e\x56\x53\x64\x7c\x28\xf7\xc0\xea\x77\x9b\xc4\xb4\xa0\x6d\x8c\x10\x8b\xb4\x96\xbc\x8e\x19\x27\xbc\x41\xd9\xa6\x53\xb4\x4d\x4c\xf4\x84\xb0\x83\x2c\x99\x15\xef\xf8\x6b\xc6\x84\xce\xd6\xec\x2d\x11\xf9\xff\x5f\x81\x92\xc9\xcb\x2b\x02\x2d\x53\xad\x7b\xc9\x65\x28\x44\x1a\x8b\xdf\x31\x0b\xcd\x03\xda\x9f\x02\xba\x95\xe6\x71\x31\x82\x7d\x37\x5e\x34\xb8\x2a\x3c\x1a\xd1\xac\x5a\x85\x7b\xcb\xa3\x32\x98\xd6\xd9\xaf\x30\x16\x8e\x54\xda\xe0\x4c\xf3\x68\xe0\xcc\x12\xa5\x9a\x69\xc6\x88\xbe\x88\x92\xc9\x43\xd8\x56\xc8\x89\x85\xa6\x64\xcb\x28\xf6\x0a\x77\x10\xae\x08\x57\x64\x57\xad\x90\x1e\x69\x0d\x19\xc8\xa0\x71\x58\x78\xab\x64\xb0\xc7\x92\xef\xb5\x62\xd6\x65\x8c\x2b\x24\x68\xc2\x9e\x85\xe9\x40\x8a\xce\x1e\x69\xe2\x6c\x3e\x26\xa1\xff\x62\xa0\x06\x39\x39\x67\x37\xe2\xbf\x8e\x3c\x7b\x3c\x78\x4c\x36\x9f\x10\x9e\x7f\x00\x4e\x91\x27\x9b\xe7\xad\x26\xd4\xda\xc2\xf0\xdc\x92\xa2\x5f\xf6\xc8\x16\x34\x72\x25\xd8\x91\x66\x40\xaf\x5a\xf4\x8b\x13\x53\xa5\xcc\x37\x2b\x79\xe8\x7d\x4d\xeb\x1e\xf0\xa5\xe1\x76\x15\x24\x34\x3d\x95\xf7\x48\x9f\x3c\x5d\xf1\x34\x16\x57\xe8\x54\xd9\x38\xd1\x6a\xc8\x91\x87\x39\x9d\x58\x44\x10\x67\xbe\x22\xc9\xf7\x2d\xee\x00\xe4\xac\x38\xe5\x63\x26\x47\x9a\x25\xeb\xe4\xf7\xb7\xbd\xd3\xfd\xb7\xea\xac\x13\xed\xdd\x8a\xb7\xc9\x6c\x32\x72\xbf\xbf\x66\x03\xf7\xe7\x51\xc1\xc6\xf0\x3b\xe5\x63\x5a\x30\xe7\x2b\x58\x9d\x39\xbf\xdf\x8b\x42\x5d\x70\xab\x84\x53\x7d\x43\x19\x9c\x4a\xaa\x77\x86\xea\x9a\x58\x64\x1b\x13\x7c\xf9\x06\x09\xf0\xe2\x0c\xce\x2c\xd9\x00\xcf\x2e\x59\x0e\x06\xed\x2c\x49\xb8\xba\x50\x1e\xb0\x57\x89\xb2\x3d\x18\x20\x19\x63\x5a\x64\xfc\x5a\x27\xa8\x53\x37\xac\x1f\x4d\x6f\x54\x72\xce\x0b\xa6\x7f\xa6\x97\x22\xb9\x64\xef\x9d\x92\xaf\xf9\x60\x30\xcd\xd9\x3b\x65\x4d\xab\x13\xe5\x76\x2e\x02\x0e\xbf\xa7\x13\x93\x58\xd0\xb4\x00\x48\x4c\x79\x93\x08\xa1\x28\x92\xca\x70\xdf\x7e\x7d\x65\xbf\xbe\xb5\x5f\x3f\xe1\xd7\xb7\x74\x9a\xe7\x9c\xa6\xaf\x92\xa9\xa2\xf3\x68\x4c\x87\x8a\xc6\xf7\x2c\xf3\xbe\x7e\x10\xb1\xfe\x29\xb2\xc9\x48\x24\x62\x38\xc3\xdf\xc7\x60\xe0\x85\xdf\x3f\x0a\xee\x51\x76\x32\x61\xd1\x34\xa1\x99\xdf\xac\x93\x89\x70\x81\x4e\x15\xff\x07\xec\x74\x9a\xf5\xa7\x09\x4b\x23\xa6\x6c\x24\x95\xf1\xd2\x40\xe0\xb9\xb6\xfc\xdc\x18\x50\x95\xad\x7f\x6c\x0c\xa0\x13\xfc\x34\x08\xe7\xef\xa5\x4c\xf1\x3e\x7b\x20\x32\xc6\x87\x29\x0e\x5a\x30\x94\x80\xff\xb4\x28\xc2\x97\x4f\x28\x87\xa3\x0b\x96\xa1\xd5\x84\xe6\x8b\x6b\xfc\xf1\x36\xa3\x31\x67\x48\x18\x1a\x0a\xe3\xb7\x1c\xac\x40\xc6\xac\xa0\x72\xd2\x40\xab\x95\x3c\xe7\xe9\x70\xc3\x54\x32\x9e\x28\x19\x74\x3e\x0b\x55\xd7\x44\x24\xb3\xa1\x30\x5f\x75\x8d\xb2\x32\x9a\xb8\x75\xea\x33\x77\xf4\xaa\x8a\x07\xf9\xf8\x51\x88\x09\x7e\xce\x90\xb1\xf9\x25\xb4\x31\xbf\xe2\x45\x04\xd5\xe5\xb3\x71\x5f\xe0\x69\x3f\xbb\x2e\xf4\xa7\x1e\x18\x05\x2f\xb0\x5c\x91\x21\x1f\x8a\x7c\x42\x81\xa0\x69\xae\x4c\x5a\x19\x5c\x4d\x5c\x02\x7f\xce\xad\xe6\x31\x3e\x75\x02\x05\x64\xd2\xdd\xb3\x0f\xed\x3f\xb3\xfa\xf0\xa3\x5e\x9b\xce\xf1\x08\xd2\x6c\x39\x87\x21\xb0\xb0\xd0\x7a\xa7\xe2\xb0\xa4\x45\x7e\xdd\x23\x5b\xde\xa4\x8d\x2f\x6a\xcd\xfe\xcd\xd9\xac\xe5\xee\x61\x9b\x37\x4b\xc3\xe9\xd5\xad\x3d\x88\x3b\x1d\x31\xfb\xe3\x8e\x93\x0b\x55\xd6\x6e\xf8\x2a\x2a\x0e\xf6\x5a\x8e\xdf\xa2\xf2\x9a\xd2\xc9\x34\x27\x4f\xf6\xec\x2e\xf7\x8a\xaa\x93\xf4\x6f\x70\xbe\xc5\x52\x27\x82\x96\x9c\x7f\x21\x41\xf6\x06\x7c\x79\x70\x17\x5b\x2c\xd5\x5d\xec\xe6\xff\xea\x05\x26\x73\x38\x80\xe7\x5d\x48\x6a\xdd\x81\xb4\x03\xee\x4d\xb0\xa1\x3b\x28\x5f\xd8\x83\xdc\xa6\x5c\x3f\xc3\xcf\x36\x99\x64\xec\xf2\xc0\x8e\x80\xf9\x27\xa4\x75\xde\x7e\x9a\x2d\x8b\xb2\x35\x9f\x8f\x73\x50\x58\x52\x82\x35\x86\x76\xf4\xac\x0e\x4b\xef\xd8\x80\x2c\x4c\xe4\x72\x38\x6a\xa9\xbc\x73\xcd\x15\xb8\xa4\x38\x7b\xdc\x87\x45\x57\x3e\xa2\x49\x22\xae\xb4\x1b\xaf\x73\x87\x4c\xb5\xea\xb4\x9d\xa4\x96\xae\xe1\x7a\x4b\x2d\xc2\xe0\x96\x02\xb4\xc6\x1f\x0c\x5c\x99\x9a\x35\xbd\x19\xfd\xd1\x88\xa6\x43\x16\x57\x2e\xea\x4d\xb5\x5a\x67\x24\x14\xa2\xb4\x57\xea\x18\x5d\xc8\x90\xa6\x0b\xc9\x04\xbf\x48\xc5\xae\xc0\xfe\x31\x68\xb6\xc8\x48\x2a\xec\xf5\x66\xe0\x66\xcc\x97\x66\x2f\xab\xe9\x12\xdd\xf6\xa8\xb1\x02\xed\x35\x6c\x6f\x6f\xaf\x02\xac\x2c\x6b\x77\xdf\x17\x18\x6d\x74\xf6\x58\x23\x7b\x7c\xde\x89\x20\x8c\xb2\x5b\x25\x1e\x7b\x2f\x87\xc7\xa3\xf4\xae\x2d\x0b\x14\x59\xec\x1c\xe9\x2e\x92\xcd\xd1\x91\xc2\xb9\x57\x5e\xf9\x5b\x4e\x85\x90\xdd\x00\xb2\x42\x03\xdd\x97\x44\x91\x26\x33\x9f\xc2\x79\x46\x8b\x73\x70\xf8\x0c\x35\x3d\x5d\xe5\x30\x1f\x1a\xe4\x79\xca\xc7\xeb\x26\x45\x04\x1c\x1a\x59\x82\xcc\x69\x11\x9e\xe8\xa9\x5a\x88\x2f\x6c\x00\x64\x26\xa1\x25\xaf\xa2\x1c\x2d\x36\xf7\x64\x72\x2e\x92\xb2\x1a\x53\x1b\xd3\xda\x01\xe6\xce\x15\x6e\x6c\xa8\x50\x1a\xed\x5d\x8e\xab\xaf\x17\x9d\x85\x4a\xd7\x67\x0e\xde\xd0\x3b\xbf\xbf\xcd\xf4\x7c\x04\xba\x2a\xc3\xcb\x70\x96\x07\x98\xfe\x9e\x4e\xec\x7a\x84\xf9\x8b\x11\x7d\x6f\x1a\x89\x2c\xb6\x51\xbb\xee\x2b\x77\x77\x5e\xbc\x79\xc7\x6b\xc1\xfd\x5b\xc5\x52\xd5\xb2\x88\x79\x2b\x07\xef\x2a\xdb\xb2\xde\xa0\x32\xed\x0d\xef\x17\x9d\x05\xe8\x79\x10\x14\xc2\x33\x32\xa9\x2f\xb6\xeb\x94\xe9\x99\x7a\xbe\xb7\xc5\x4d\x98\x34\x59\xbd\x83\xf5\xdc\x0d\xcb\x39\x32\x67\xa8\x95\x38\x3a\x2a\xdf\x2d\x22\xd2\x88\xd5\xc2\xcb\x4c\x1b\x97\x53\xf2\x02\xc0\xe5\xd4\x8f\x7d\xea\x51\x02\x07\x27\x12\xc0\x15\x6e\x7b\x6f\x2e\x65\x42\x11\xa0\x7b\xcd\x29\x6d\x0f\xe2\x4c\xd1\x07\x8c\x70\x55\x63\xcb\x0f\xc1\xe6\x0a\xa7\xfe\x2e\x95\x77\x1a\xd1\xa2\x59\xe1\xb5\xca\x60\x71\x82\xa1\x95\x23\xd9\xf9\x32\xa4\xcb\xb8\xf1\xd3\x9c\x91\x5e\x66\x9a\x1f\x86\xe3\xb6\x66\xd9\xca\x4a\x6b\xd6\x0a\xdf\x9a\xc1\xd9\x79\x98\xdd\x74\xee\xfc\x0b\x04\x87\xbe\x64\x20\x82\x66\xc2\xd2\x4b\xf9\x1a\xd3\xc1\x33\x99\x7f\x1e\x4c\x50\x73\x61\xc3\xc5\x16\x1e\x4b\xeb\x76\x04\x7e\x3a\xdd\x36\x04\x59\x5a\x6a\xca\xbb\x20\x63\x98\xb1\x01\x91\xa6\x57\xa9\x5f\x60\x37\x51\xa1\x5f\x70\xff\x23\x27\x6b\xef\xea\x9f\x58\x5a\xa0\xc8\x02\x76\x31\x81\x6b\xf5\xe7\x2b\x8c\xed\x30\x27\x64\x99\xc5\xad\x62\xb2\xb5\xc8\x57\xb5\xf6\x3d\x10\x93\x59\x06\xc7\x95\xdb\x5b\xdd\xe7\x1b\xdb\x5b\xdd\x17\x6d\xf2\x86\x46\xac\x2f\xc4\x45\x9b\x1c\xa5\x11\xd8\xe1\xc8\x8d\x2d\x80\xe5\xb2\x35\x2c\xbb\x64\xb1\x4c\x97\x59\xa7\x23\x9e\x93\x5c\x4c\xb3\x88\x91\x48\xc4\x8c\xf0\x9c\x24\x3c\x02\xaf\x17\x04\x5e\xdf\xc0\x96\xf8\xd5\xc9\xeb\x0d\x38\xd0\xd0\x99\x64\x20\xa6\x29\x44\x4a\x2d\x46\x4c\x22\x7a\x77\x74\x70\xf8\xe1\xe4\x50\x6e\x85\x99\x4a\x26\x99\x10\x85\x72\x02\x25\xb2\x19\xc6\x40\xb5\xd5\x15\x19\x63\x1d\xb2\x9f\x12\x1a\xc7\x5c\xb6\x8f\x26\x64\x98\x51\xdc\xa4\x8b\x01\x99\xd0\x82\xa5\x85\x26\x5c\x19\x11\xb9\xd5\x92\x8f\xfb\xa7\x87\x1f\x4e\x4f\xbc\x3a\x73\xa9\xbf\x4d\x9d\x68\x54\xb4\x66\x8e\x18\x4e\xf8\x98\x27\x72\x50\x09\xc2\xd3\x4b\xf4\x85\x41\xfa\xd3\x02\x23\xb6\x26\x62\x98\x13\x4a\x54\x4c\x54\x29\x3c\x10\x9a\x54\xa4\x48\x9f\x8e\x49\x3a\x66\x45\xc7\xf0\x4e\xd1\x05\xae\x8b\x0b\x21\x51\x10\x9e\xe7\x53\x96\x63\x60\x9f\x4b\x96\x88\x09\x9c\xc9\xb0\xf4\x92\x67\x22\x45\xb5\xc6\x53\x12\x65\x1c\xbc\x41\x48\x4c\x13\x5a\x8c\xf2\x0e\xf9\xc4\xc6\xe2\x52\x1b\x11\x25\x62\x38\x94\xdf\xa1\x57\xe4\x9a\xcd\xc6\xdd\xf3\x71\x5d\xf1\x24\x21\x17\x8c\x4d\x74\x57\x00\x0b\x12\x31\xe4\x11\xdc\x31\x60\xcc\x59\xcb\x1c\x40\x88\x35\x22\x77\xc0\x28\x49\xb5\x79\xcf\xf3\xd0\x2b\x65\xfe\x9e\xc1\x00\x2b\x10\x19\x06\xb6\x09\x9e\x15\xb6\x09\xcd\x86\xb9\xbb\xd2\x4c\xc0\xa0\x89\x66\xc3\x29\x2a\x68\xe5\x32\x10\xf2\x25\x2c\xde\x5a\x2a\x27\x83\x12\xf8\x57\xb2\x4d\x5e\x42\xb1\x0d\xb2\x4d\x76\xc8\x96\x52\xe3\x66\x71\x7b\xc1\x66\x64\x8f\x6c\xef\xc2\x97\x5f\x24\x24\x7c\x75\x43\x41\x49\xc4\x67\x32\x7b\x83\x6c\x9f\xbb\xd5\x3b\xd1\x55\x6f\x8d\x1a\x41\xd2\x41\x8f\x98\xc3\x7a\x8b\xcb\xc6\xde\xc0\xb8\x1b\x66\x22\x69\x7c\x56\x1c\xa9\x62\x43\xa7\xd3\x01\x4e\x7c\x26\x4a\x37\xb8\xe2\xd7\x20\x4f\x2d\x96\x31\xcb\x73\x3a\x64\x86\xc6\x86\xca\xf2\xa3\x25\x5a\x3a\x15\x07\xc9\x2f\xa4\x0b\xd7\x24\xcd\xcd\xff\x77\x96\xff\xe7\x1f\xe7\x4f\xbe\xdf\x6c\x75\xe4\x56\x57\xc1\xb5\x16\x69\x82\xdc\xeb\x6a\xaa\x14\x1b\xf2\x91\x98\x26\x31\x98\xf5\xf5\x13\x0c\xc4\x9a\xf2\x3f\xa7\x2c\x99\x11\xb4\x91\x1e\xcc\x70\xb0\x7b\xad\x50\x48\x3a\xe4\x63\xc2\x68\xce\xda\x10\xbd\x95\x62\xa4\x58\x1d\xa0\x8a\x5f\x32\x5d\x49\x31\xa2\x29\xc6\xe3\xc5\x84\xda\x36\x3f\x32\xbc\xf5\xd7\x74\x34\x1b\xea\xa9\x6a\xcb\x5d\xb7\x69\x6e\xee\x91\xc6\x1f\x54\x39\x32\x71\x09\x55\x3c\xcc\x18\x9c\xff\x37\x37\xff\x25\xdf\x1c\xfa\xbe\xab\x9d\x55\x85\xf1\x5d\x39\xcc\xcf\x74\x85\x4f\x9f\x3a\xd1\x79\x6f\x5b\x6e\xdc\x2f\x75\xf9\x13\x89\x34\x17\x09\x0b\x6f\x7f\x5c\xd4\x0a\xa4\xc3\xa0\x3b\x14\xcd\x2d\x7f\xfd\x41\x88\x9c\xdc\x6c\x99\xcd\x4d\x54\x4b\x50\x86\x5c\xd1\x1c\xbb\x35\xc5\xd8\x76\x91\x48\x2f\x59\xca\x99\x5c\x1a\xe6\x42\xf2\xb7\x20\x33\x15\xb3\x1a\x03\xe9\x4a\xf5\x5c\xd0\xe8\xc2\x45\x58\x08\x30\xa3\x44\x65\x48\x93\x24\xe7\x70\xb1\x4a\x0b\x12\x51\xd4\x7b\xb2\x98\x16\x10\x80\xce\x98\x8d\xb5\x1b\xca\x55\xa9\x21\x24\xa2\x45\x34\x6a\xca\x49\xdb\x59\x54\xed\xae\xdd\x56\xc4\x38\x54\xb5\xc0\x5c\xbc\xea\x20\x9f\xdd\x17\x7f\x5d\xac\x14\x3e\x1e\x4f\x21\xc4\x4c\xe0\x45\xdd\xe0\x3e\x7b\xdc\x7f\x7c\x0e\x31\xe4\xed\x91\xd9\xb2\x98\x28\x60\x9a\x98\x03\x39\xf5\x48\x57\x64\xbb\xd6\x15\xac\x5b\x4f\x93\xb6\x49\x1f\x25\x71\xf3\x49\x60\x90\x50\x69\x86\x20\xf9\x16\xe8\x5e\x9e\x12\xba\x80\x1d\x02\x55\x81\xe5\xd7\xd7\x49\xf3\x51\x0d\x4c\x5f\xc1\xdc\xdc\x10\x8a\x51\x36\xe5\xa0\xe9\x63\x5c\xed\xbb\x37\xd1\x0e\x61\x3d\x45\x59\x7f\x01\xca\xfa\x18\x9a\x1d\x8f\x4f\xeb\xa9\x07\x98\x45\x88\xf0\x37\xf2\x6b\x2e\xe7\xa5\x2a\x35\x77\x97\xbf\x4d\x62\x5a\x30\x6d\xa0\x91\x17\xb4\x60\xfe\xf5\xb1\xd7\x53\x0a\x0c\x62\x54\xab\xbb\x7e\xb9\xb7\xf3\x60\x00\x87\x82\x41\x7c\x3e\x01\x15\x82\xd1\x8c\x6c\x2c\xf5\xaf\x77\xdb\xa5\xc0\x49\xe9\x46\xc6\x68\x9e\xf3\x61\x0a\xbe\x48\x75\xc8\x6d\x13\xa0\xa9\x53\xd9\x4e\x90\xf0\x8a\x74\xa0\xd0\x1f\x9d\x3f\x3c\x68\xb9\x2d\xbb\xbf\x4f\x73\xf6\x96\x15\xa7\x74\x58\xe3\x23\xf9\xc5\xb3\x16\xee\xb8\xb5\x41\xcf\x3c\xaf\xf2\x92\x16\xf2\x19\xe1\xfe\x57\x21\xf0\xaa\xe4\xb3\xde\x55\x64\x3a\xe6\x5d\xde\xd1\x47\xbd\x34\x9f\xa5\x11\x56\xde\x38\xc3\x27\xb4\x64\x5f\xa6\x69\x1b\x9a\xf3\x06\xd6\x2e\x5b\x17\xc0\x85\x20\x43\x96\x06\x10\x6f\x59\xca\xa0\xef\x42\xd0\x49\x26\xae\x67\x01\xf0\x47\x99\x76\xde\xb0\x77\x6f\x07\x23\x16\x5d\xe4\x72\x3c\x7c\x86\x60\x59\x9f\xe5\x62\x17\x2c\xf4\xf1\x29\x0f\x4c\x1f\x9f\x35\xea\xcf\x04\xf1\xe8\x5d\xc4\xbf\x62\x38\x46\xf8\x3a\x66\xe3\x3e\xcb\x8e\x07\xa4\x87\x39\x5c\x4e\x36\x5b\x9d\x6e\x67\x0b\x7e\x47\xb4\x60\x43\xb9\x1b\x78\x47\xe1\xc9\x8a\x3e\x66\xff\xfa\xe4\x16\xc3\x74\xc1\xc9\x3a\x7e\x2b\x04\x89\x24\x5d\x1d\xe7\x6c\x3d\x27\x5f\xfb\xfa\x70\xfd\x93\x4a\xf9\x2c\x07\xd5\xe7\x80\x78\x37\xa0\x19\x9c\x04\x7c\x86\x41\xf9\x19\x91\xb1\x6b\x3a\x9e\x24\x4c\xd1\xdf\xeb\x58\x43\xa6\x66\x4f\xce\x4c\x4f\xa4\xc8\xef\xfd\xaa\xa2\x7c\x95\x81\x36\x69\x3f\xda\x74\x01\x01\x39\xac\xa7\x9d\xf3\x7b\x03\x1e\x04\x37\x7e\xa4\xe5\x4b\x65\xcc\x3b\xed\x86\x19\x1d\x36\x18\x72\x53\x54\x96\x37\x7a\x29\x78\x9c\xeb\x4d\xc7\x15\x2f\x46\x18\x0f\x1f\xd7\x19\x9f\x89\xd4\x57\x52\x2c\x10\x15\x4f\xc9\x09\x1d\xd0\x8c\x93\x9f\xc9\xd5\x88\x47\x23\xa2\xd9\xda\xc0\x2e\x6d\x80\xb6\x94\x85\x63\x7c\xe7\x90\xc3\x26\x02\x1e\x76\xb8\xc1\xd5\xe4\xe6\x01\xcf\x27\x40\xb2\xec\xd0\x52\x4d\xda\x75\x54\x9e\x84\xd8\x33\x52\x7d\x73\xa3\x53\x94\x10\xdb\x04\x33\x42\x6c\x92\x96\xde\xea\xe5\x80\x65\xf1\xee\x5a\xa8\x2f\xe6\xc6\xec\xfe\xaf\x11\xf9\xac\x2e\x40\xd5\x98\x16\xa3\x13\x3e\x4c\xff\xb2\xa8\x3c\x3c\xff\xc8\xb2\x88\xa5\xab\x8f\x3a\x54\x17\x6d\x49\xdb\x5f\xfd\x65\xc1\xa5\xa0\xc2\xe3\xec\xa4\x58\x7d\x95\x75\x11\xbf\x70\x4b\x74\xb4\xfa\x30\x52\x75\x41\xdc\x86\xac\x50\xfd\xf8\x3b\x44\x21\xff\xab\x22\xe5\x0d\x59\xb1\x9f\xce\xd4\xd1\xfd\xf1\x00\x75\xd4\xca\x6b\xaf\x8b\x13\x38\xa2\xf9\xeb\xe9\x24\xe1\x72\x6a\xf9\xcb\x62\xf4\x71\xe3\x0b\x9e\xd5\x08\xf2\x12\x71\x85\xbe\x4d\x50\x93\x72\x05\xfa\xfc\xfd\x61\xa1\x8b\x1e\x14\xd4\xc4\x31\x32\xf9\x40\x3f\xd4\xb6\xf9\xc7\xee\x92\xe1\x3f\x42\xfc\x0f\x68\x72\x88\xea\xc1\x11\x85\x50\x60\xe6\x44\x6b\x5a\x32\x72\x4f\x45\x15\x0f\x68\x76\x05\xb6\x07\x07\x14\xfa\x56\x71\xaa\x2a\xaa\x78\x40\xcb\x2b\xb0\x99\xd8\x29\x70\x7c\xa4\xa6\x67\xf7\x06\x44\xa7\x85\x4b\x3d\x5c\xc9\x56\x19\x15\x6c\xb9\x16\x05\x08\xf6\x6b\x09\xa8\x1b\x5e\xc9\x6c\x74\x5d\x63\x28\xa5\xed\x7d\xab\x11\x95\xe8\x52\xa2\x0a\x2f\xc5\xc0\x66\x4b\x63\x5a\x5f\xc7\x85\xb9\xb1\xf5\x6a\xfc\x4b\x03\xe3\x65\x63\xb2\x3a\x73\xdc\x20\x1e\x8d\xca\xce\xda\x23\x11\xd3\xee\x45\xe1\x1c\xe1\xf6\x28\x9c\x63\xea\x54\xa7\x13\x4c\xf9\x80\x6c\x58\x2d\x94\x08\x87\xd4\x0a\xd2\xc3\x56\x2d\xfa\x94\xaa\x96\xdf\x0e\x35\xf1\x81\x98\xca\x09\x07\x0f\x32\x65\x92\x5e\x5b\xb8\xe4\xe9\xb4\xe6\x24\x63\x03\x7e\x6d\x6f\xdd\xb8\x04\x7b\xfa\xd4\xa0\x71\xef\xb7\x1a\x0d\xf2\x94\xa8\x12\xe0\xbb\xa0\xd1\x22\x4f\x09\x8f\x5d\x1b\xab\xb7\xac\x20\x13\x25\x6a\x28\xa9\x60\x5a\x59\x88\x82\x26\x98\xe0\xee\xe4\x90\x0d\x37\xda\xcf\x83\x2e\xb8\xaf\xbf\x95\x61\x6f\x11\x15\x2c\x5a\xe0\x18\xe5\xb4\x06\xf3\x6f\x08\xad\x38\xa5\xe1\xed\x8e\x11\xdb\xc4\x62\x72\x35\x62\xa9\xa9\x99\xe7\xf6\xc8\x9e\x88\x0c\xae\x7e\x12\xee\x5a\x86\x59\x83\x2d\xf3\x72\x04\xfe\x8e\x06\x24\x67\x85\xdc\x88\xf6\x19\xc6\x82\xc6\x8b\x2d\xdc\xe3\xc3\xcd\x4b\x9f\x99\x32\xb1\x67\x03\xa6\x9b\xa6\x5b\x61\x1f\xc2\x3a\x4b\xb4\xf0\xf9\xab\x93\xd5\x54\xe4\xb7\x1d\xe6\xd8\x2e\xf5\x58\x50\xbe\x3a\x81\x0b\x92\xf5\x75\xe7\x4e\x63\x1b\x8f\xcd\x2c\x23\x5e\xfa\x99\x3b\xa8\x90\xdc\xe7\x27\xd5\x78\x9f\xf9\x78\x9f\xcd\xc3\xfb\x4c\xe2\x55\xdb\x59\xbb\xf7\x55\xe3\x44\xb5\xef\xae\x51\x3b\x7f\xa8\x68\x24\x81\xde\x74\xd9\xe3\xbd\xb7\x52\xfa\x38\x7c\x2a\x6f\xb5\x66\x88\x10\xc6\x8f\xba\x44\x50\x79\x9e\xfe\xd3\x96\x50\x88\xd6\x91\xe3\x27\x78\x2b\xfe\x26\x11\xd4\x60\xed\xe4\x09\x8f\x58\x73\x4b\x5f\x53\xb7\xc8\x26\xe9\x6e\x6d\x95\x9e\xc7\x6b\x74\x4f\x55\x39\xcf\x4c\x0f\xb4\x57\x70\x72\xa0\x0b\x54\xb6\x5b\x4d\x30\xd8\xa7\x5a\x89\x93\x5f\x4b\x72\x55\xd5\x8c\x70\xfe\xb9\xc4\x44\xc7\xb6\xa1\xbc\xf2\x0f\x84\xba\x0c\xa0\x82\xec\x6b\x89\x30\xbf\xea\x9f\xc9\x5d\xb0\x99\xdc\xef\x63\xf1\x8e\xfc\x05\x38\x4c\xff\x41\xfe\xfa\x3a\xc0\xe9\x08\x64\x3e\x4a\xd1\xff\x72\x26\x73\xcf\xb6\xce\xef\xb0\x73\x70\xf7\x13\x6e\x53\xdc\xf4\x26\xd5\x46\xd6\x8b\x9b\xe8\x96\x8d\x5f\x24\x92\xb9\x8f\x8c\xdc\xbb\xd1\x99\x73\x2b\x0a\x26\x90\x34\x1a\x31\x6b\xaa\x55\x65\xd6\x07\xb7\x9e\x8e\x51\x1f\xde\x95\xc9\x72\x67\x34\x9b\x9d\xf1\x73\xc7\x06\xca\x4b\xf6\x6c\x5d\x02\x4b\x9a\xc0\x26\xb2\x6c\xab\x66\x4d\x74\x71\xf2\x0a\x77\x4a\xde\x8c\x1a\x66\x36\xf1\x79\xdc\x7e\x5b\xbd\x93\x7b\x65\xb9\x6c\x14\x87\x02\x69\xa1\xd1\x98\x97\xf8\xaa\xc4\xcf\x39\xee\x2a\x14\x1e\xf2\x94\x14\xe4\x09\xd1\x18\xc8\x86\xce\xd0\x17\x8d\x25\x1b\x64\x83\xb3\x24\xb6\x80\xc1\x79\x90\xea\x1f\x49\xfd\xb4\xc0\x11\x36\x9c\x38\xdd\xe3\x54\x36\x25\x9f\x41\xb0\xfe\x16\x67\xb2\x29\x9e\x29\x2e\x76\x22\x8b\xb7\xfd\x67\xdd\x36\xd9\x6e\x93\x67\xe7\x73\x8e\x65\x11\xd2\xbc\x8d\xeb\x8b\x78\xd6\x89\xac\x7d\x6f\xe9\x90\xd6\x2f\xd7\xa0\xfd\xa8\x71\x37\x58\xaf\x93\x0a\x31\xa9\x3e\xf3\xc5\x25\x23\xc0\xe9\x58\x88\xba\xdc\x6e\xe5\xb1\xa5\xce\x0a\x04\xe4\xe7\x6f\x7f\x66\xb9\xf8\xa9\xc1\x37\x89\x3a\xba\xb5\x82\xa8\xa3\x5b\x0f\x8b\x3a\xda\xfd\x86\x51\x47\xbb\xab\x8a\x3a\xda\x5d\x41\xd4\xd1\xed\x1e\xe8\x8a\x94\x8e\xe7\x34\x74\x7b\x15\xb8\x1f\x74\xcc\xe0\x22\x6a\xe1\xee\xa6\xc7\xae\x0b\x96\xc6\xce\x94\x8f\x57\x8b\x72\x83\xe2\x68\x74\x9a\x0d\x59\x51\x0a\x4a\xda\xd5\xa1\x47\x03\x6b\x22\x1d\x80\x14\x5e\x63\xa1\x0d\x9a\x6b\xf4\xc3\xcf\x77\x4b\x57\xd8\x08\xa6\x03\xa2\x2a\x52\xec\x95\x66\xd5\x9d\x30\x16\xc1\x2b\x6b\x59\x10\x89\xc4\x7b\xeb\x3d\x85\x10\x0d\x8c\xc8\x2d\xfc\x33\xb7\x24\x12\x6e\x57\x4e\x1c\x4e\x80\x56\xd4\xe9\x7f\xa0\x6f\x28\x55\x11\x67\xb0\xf8\x81\x2a\x72\xdd\x20\x2c\x8e\xcb\x81\xc0\x27\x00\x2e\xaf\xcc\x32\xc9\xac\x5e\xb9\x7e\xa0\x15\x89\xb4\xe0\xe9\x94\xed\xba\xef\xb5\xef\x68\x26\x10\xc0\x5b\x6e\x61\xd5\x52\x78\xcb\x2f\x57\x5b\x5e\x68\x57\xd3\x3c\x33\xb9\xfd\xeb\x80\x27\xe0\x7c\xf2\x92\xb3\x2b\xf2\x8e\xce\x58\xa6\xad\xf5\xd6\xb4\xab\x90\x53\xe5\x26\x0a\x5d\x60\xd2\x3c\xff\x40\xc7\x73\xdd\x7f\x56\x8f\x3f\x3f\xb4\xa5\x9a\x18\x96\x42\xb3\x90\x0f\xea\xda\xd2\x30\xf9\x1d\x0f\x16\x1e\xf6\xae\x9b\x5e\x11\xb3\xb9\x0f\x41\xe6\x96\x3c\x6f\xad\x79\x72\x05\xdc\x6e\x3a\xce\x01\x8c\xb3\x3a\x74\x2d\x86\x2f\xf9\x8d\x95\xad\x5e\x22\xea\x1e\xb0\x10\x3a\x45\x83\xc0\x3d\x21\x38\x78\xa9\x93\x5c\x65\xb1\x70\xd6\xd0\xd8\xf1\x65\xb8\xc2\xd3\x38\xc7\x35\x3d\x2c\x7c\x25\x91\x07\xe0\x25\x6e\xde\x43\x9f\x6a\x4d\xd4\x6c\x35\x1b\x19\x03\xbf\x0d\xf9\x06\x60\x6a\xb4\x6d\x03\x3c\x0b\xdf\x7b\x4c\x56\x1d\xea\x3f\xbc\x47\x23\xb9\xc6\x50\x5d\xb5\x6b\xb5\xd5\xfc\xea\x4a\xab\xd3\x8e\xdb\xb6\xe2\x90\xb2\x33\xb0\x8f\xc7\x08\x1a\x65\x40\xc7\x74\x5c\xd1\x37\xdf\xd1\xe6\x49\xeb\x69\xad\x70\xd5\xfd\xc6\x7c\xd3\x9f\x26\xa0\x6d\x85\xeb\xd1\xed\xad\x15\x5a\x30\x6b\x13\x8b\x3e\x4b\x3e\x26\xd3\x21\x4f\xdf\x24\xe2\x0a\x0c\xdb\x3f\xea\x16\x80\x84\x4a\x01\xed\xc1\x03\x7d\x30\xd8\x7b\x3d\xc5\x70\x01\xb5\xd3\xb0\x3f\xe4\x2a\x21\xac\x6b\xf7\xca\x6c\x08\xdf\xd3\xfc\x0a\x91\x59\x95\x57\xe4\x39\x68\x3a\x3c\xff\x84\xa9\x31\x04\x73\xbd\xc6\x68\x1c\x8b\x95\x58\xbb\x6d\x81\x00\x2f\xc5\x8a\x03\x9a\x24\x7d\x1a\x5d\xd4\xb3\x42\xf6\xd1\xd2\xd8\xa5\x00\x1a\x65\x4a\x27\x13\x46\xeb\x59\xe1\x84\xbb\x06\xc0\xfd\xa8\xe0\xe8\x77\xf9\x0e\xf0\xf9\x1c\x0e\xe0\x16\xc7\x3a\xaf\x13\x7c\xb0\x85\x70\x96\xb7\x66\xdb\xdd\x07\x5b\x17\x0d\x13\xd1\x87\x07\x9c\xd5\x77\x77\x3f\xab\xa5\x4d\x24\x32\x56\x7b\xfd\xb1\xa5\x80\x46\x3c\xae\x03\x7a\xd6\x7d\xae\x80\x32\x86\x47\x6e\x35\x80\x3f\xfc\xf4\x93\xae\xb2\xb8\xae\x83\xf9\xb9\xab\x60\x3e\x7e\x3a\x3e\x3d\x3e\xfd\x8f\x8f\x87\x04\xad\xba\x71\xea\x6f\x28\x69\xfb\x5e\xa9\x99\x3d\x77\xf5\x05\xde\x3f\x53\x78\x11\x64\xd6\x49\x4a\x75\x1f\x9d\xf4\xde\x1c\x7f\x3a\x38\x7c\xad\x3c\x47\x92\x75\x8d\xa2\xf3\x66\xd7\xc2\xbc\x7d\x77\xfc\x6a\xff\x5d\x19\xe6\xad\x03\x73\x72\xba\x7f\x7a\x74\x50\x86\x39\x71\x60\x80\xf8\x32\xc8\x47\x07\xe4\xd5\xd1\x87\x0a\x62\x5e\x19\x0f\x9a\x7a\xf9\x64\xa9\x7a\xa9\x7b\x74\xc7\x21\x43\x27\x9e\xa5\xfa\x1d\x55\xd3\x4b\x90\xeb\xaf\x16\xd9\x09\x52\x6f\x6e\x64\xf2\x99\xe1\xb1\x79\x6f\x67\xb7\x84\x6e\xbd\x20\x22\x3b\xf0\xe1\xd4\xe3\xfc\x84\x5a\x1c\x1c\x1f\x65\x7f\x91\x3d\x8d\xce\xa9\x08\x4a\x56\x24\x7b\x18\x2e\xd8\xac\x4d\xc4\x55\xda\x26\x62\x5a\x80\xb4\xef\xaa\x23\x17\x43\x55\xcb\xae\x98\x25\x09\xbb\xfa\xc0\x29\x5c\x27\xaf\x29\x9b\x61\xb9\x2a\xa4\x3c\x85\x97\x0e\x29\x95\x43\x12\x7d\x7b\x5d\x49\x45\xff\xc8\x8a\xc7\xfa\xba\x66\xbd\xf9\x66\x4d\x3c\xcd\x99\xf2\xae\x46\xab\xc4\x10\x31\x12\x91\x91\x89\x54\x6a\x31\xe2\x06\xbf\x52\x4d\x59\xc5\x4b\x8d\x74\x47\x53\xe6\x98\xf4\x6f\x6e\x92\x3e\x98\x33\xf3\xb1\x5c\xaa\x14\x42\xf7\xb3\x6c\x90\x5c\xdb\x92\x41\x26\xc6\xba\x2a\xd9\x10\x76\x8d\xa6\xe7\xec\x7a\x82\x3d\x05\xc2\xb4\xbe\x4e\xb0\xae\xa8\xb8\x6e\x02\xe3\x10\x4f\x0b\x05\x06\x65\x52\xb9\x0b\x15\x03\x24\x6f\x8f\x34\xf4\x00\x6a\xa8\x92\xda\x80\x09\x96\xd5\xd0\x03\x12\x01\x38\xb4\x32\x8d\x96\x8b\x0a\x85\xdd\x9c\xe3\xe9\xcd\x8f\xd6\x02\x2a\xa1\xad\x7a\x53\xd2\x13\x08\xfb\x6f\xad\x80\x8f\xf6\x89\x94\x12\x10\xc5\x79\x24\x42\xea\x20\x6b\x43\x0d\x58\xd9\xf5\xc4\x71\x42\xec\x36\x52\x0b\xa1\x8f\xc2\x4f\xdd\xd3\xad\xba\x95\xfa\x17\x9b\xd3\x51\xea\x50\x7e\xec\xae\x6d\x6e\x22\xcd\x7d\x5e\x8c\xe9\x64\xcd\xa8\x0c\xdc\xd4\x01\xe5\x03\x91\x45\x2c\x36\x59\x6f\xf1\x91\x07\x64\x29\x06\x19\x05\x41\xf6\xc8\x73\x95\xa5\xce\xc2\x8c\x62\x20\x7b\xe4\x27\x95\x05\xba\xce\xe4\xbc\x92\x55\xfd\xb0\x6b\xa4\xc4\x64\xfc\x41\xf6\xc8\xb3\x6d\xcc\xb8\xca\x1c\xe2\x7e\x23\x7b\xe4\x87\xe7\x98\x91\xd3\x01\x33\x19\x9f\x24\xaa\xed\x9f\x76\x65\x46\xc6\x68\x82\x35\x91\x31\x2b\x46\x22\x06\x61\xfb\x9c\xf0\x7e\x46\xb3\xd9\xe7\xf2\x09\x91\x42\x52\x3a\x21\xda\xde\xfe\xaf\x6f\xd5\x76\x55\x6f\x25\x04\x57\x0a\xaf\x66\xaf\x69\x41\xff\x37\x9b\xad\xdc\x58\x27\xad\xaf\xf9\xb5\x18\x53\x9e\x1e\x0f\x64\xd5\xaf\x66\xdf\xa2\xf2\x3a\xa3\xac\x88\x26\xd1\x34\xa1\x05\xc3\xa5\xc9\x29\x8f\x2e\xe0\x8d\xc8\xca\x09\xc8\xea\x5b\xff\x9e\xf2\x14\xdc\x65\x1d\x0f\xde\x66\x74\x32\xe2\xd1\x51\xc1\xc6\x2b\xa7\xe0\xcf\x7a\x0a\xde\xb1\x21\x4b\x63\xb9\x42\xcd\xff\x32\xfb\xbb\x21\x2b\x5e\xd1\xec\x84\xff\x83\xbd\xe3\xf9\xea\xed\xd1\xea\xac\x37\xb1\xda\x8f\x02\xd7\xdd\x7f\x99\x11\x9e\x5c\xa9\xa7\x31\xfa\x03\x3b\x1e\x20\xbf\x4d\xe5\xd3\x14\x5e\xea\x04\x34\x38\xe3\x02\xde\xe6\xbc\xa2\x59\x8e\xfa\x65\x65\xd4\xce\x6a\xa8\x85\xbb\x51\x53\xe9\xf1\x60\xff\x9a\xaf\x5e\x30\xc4\xdd\xfa\x40\x8e\x83\xfc\x0f\x5e\x8c\x4e\xe8\x98\x7d\x13\x22\xae\x6b\x0d\x52\x0f\xf0\xde\x85\xd3\xe4\x9b\x54\x3c\xae\x6f\xfd\x81\xc0\x20\x25\x05\xcb\xa5\x46\xe0\xab\x37\x51\x9d\xd6\x57\x2e\x35\xe0\xb7\xea\xf1\x3a\x73\xcd\x48\x8c\xfb\x3c\x65\xae\x7f\xd1\xd5\x57\xfe\x8f\x79\xb2\x7e\x12\xd1\x64\xf5\xe6\xa9\x75\x36\xb1\x70\x47\xa7\x65\xfc\xdb\x54\x5d\x67\xd9\x3d\xe0\x69\xac\x95\xdf\xf1\xe0\x15\x5d\xbd\xbd\xf5\xab\x9a\x9a\x8b\x6c\x9a\x46\xb4\x90\x0b\x0c\x68\xf9\x1d\xda\x0f\x63\xe3\x82\x21\x1f\xea\xbc\x5a\x25\x79\x52\xd0\xe8\x82\xc5\x72\xed\xb0\x62\xf5\x98\xd7\x0f\x13\xa8\xf4\x6d\x26\xa6\x93\xfc\xd5\x4c\x0e\x96\xa3\xbb\xd4\xb9\x59\x69\xe8\x8e\x87\x91\xb6\x62\x8a\x2f\xef\x1c\xd8\xdf\x46\xdc\x92\x39\xda\x0c\x7c\x92\x6a\x8d\x76\x3c\x78\xc7\xd3\xd5\xd7\x7f\xb1\x78\xfd\xdf\x42\xe6\xbf\xcc\x5b\x6c\xe4\x0c\x16\xd6\xdf\xa6\xe6\xba\x07\x15\x31\x2b\x58\x54\x7c\xd2\xef\xdc\xb4\xaf\xbe\x60\xe8\xad\x8a\x8a\xe2\x8e\x81\x82\xa3\x13\xe7\xf3\x95\x57\x3e\xb9\x7b\x1d\xe1\x8c\xd6\x3b\x46\xe9\xfb\xa3\x0f\xbd\xdf\xf7\xdf\xfd\x76\xd8\xfb\x74\xf8\x76\xae\xe6\x79\xbf\xff\x7f\x4b\x90\xab\x6a\xd2\xfe\xdc\xb9\x4a\x87\xf0\xfa\x46\x9d\x79\x50\x53\xb9\x36\x52\xb3\x83\xe9\x28\xfd\x44\xd3\xe1\xea\x47\x73\xdd\x43\x28\x18\x4e\x69\x2c\xf7\x0c\x35\x2b\x94\x7b\xbf\xba\xc8\x45\x56\xbc\xaa\x7f\xd5\xf1\xec\xc5\x92\x37\xf0\xa5\x0a\x56\xf1\xaa\x43\xe3\x7a\xf0\xa3\x8b\x6f\x65\xe9\x3f\xc7\x39\xe9\xc3\x9e\x76\x38\x96\xfe\x0f\x79\x7a\x31\xa6\xd7\xb5\x8d\xfe\xe9\xc5\x8f\xab\xc0\xbe\x8a\x37\x1d\x80\xe8\x81\x6f\x2d\xc6\x3c\x9d\x23\xd5\x0f\x7d\xc9\x01\xd8\x57\xf1\x88\x03\x10\x2d\x47\x4c\xd9\x73\xd9\x8a\x9f\x66\xd5\xbb\x46\x5b\xa2\xc5\x65\x64\xcb\x11\xf5\xa2\x2a\xba\x43\x5d\xc3\x97\x7c\xaa\x54\x59\xc7\x03\xda\x5e\x89\x6f\x39\xd2\x7e\xd0\xa8\x86\xac\xde\xfa\xed\xd9\xf3\x25\x7b\xdc\xc7\xfe\x80\x16\xfb\x88\x96\x23\xe6\xc7\xc0\xf7\x6f\xed\x95\xe3\x6a\xd0\x3f\xa0\xb5\x21\xaa\xe5\x08\xfa\xa9\xa7\x4d\x42\x7a\xb9\xdc\xa4\xcc\xd1\xd4\x4b\x76\x6f\xb9\x86\x07\x34\xba\x8c\x6c\x39\xa2\x7e\xee\xc5\xcf\xee\x68\xf0\xb3\x65\x1b\xdc\xdd\x02\xe4\x23\x3a\xa9\x47\xde\xfd\xf9\xe7\x25\x91\x77\xbd\xd8\x1d\x75\xe8\x97\x9c\x55\xbb\xdb\xbd\x5e\x44\xb3\x82\xe5\x9c\xa6\x3d\xb3\x91\x79\x2d\xe6\x0c\xfb\x9f\x97\x1c\x0a\xdd\x67\x95\x75\xc9\x9d\xea\x9c\xca\x96\x5c\x19\x76\x9f\x57\x56\xb6\x9f\x31\x3a\xa7\xb2\x67\x4b\x56\xf6\xc2\xad\x4c\x9f\xe8\xd6\x77\xd6\xd6\xb2\xb2\xf0\x43\xaf\x67\xdc\xca\xf4\xf0\x78\x7b\x8e\xc4\x2d\x2b\x13\x3f\xf6\x7a\x60\x4b\x73\x87\xc8\x3d\x33\x0f\x42\x95\xe1\xd3\xff\x58\xac\x2a\x8b\x55\xbc\x8d\xd6\x35\x18\x43\xd5\x36\xd1\x2f\x26\xb5\x21\xaa\x63\x9a\xaa\xc8\xac\x2d\xfa\x15\x0b\xef\xe0\x47\x9b\xb0\x74\x3a\x66\x19\xed\x27\x6c\x47\xbd\xca\x8b\x44\x3a\xe0\xc3\xa9\x97\x76\x95\xf1\xc2\xfe\x96\xfb\x38\xf3\x94\x45\xbf\x06\x92\x0d\xbc\x54\xae\x12\x9c\x87\x42\x60\xa6\x6a\x9b\x54\xf6\x37\x4b\xb3\x4c\xb7\xc4\x33\xf6\x87\x8c\x52\xf7\x6e\xb5\x09\xcd\xb2\x6d\xfd\x32\x40\x02\xe9\x37\x4a\xba\xe3\xb3\xb0\xcb\x65\x01\x34\xa5\xa5\x59\xe6\x9b\xd2\xca\x2c\xa7\x29\x2a\x15\xe9\x18\x64\x62\x0c\x44\x40\x5f\xad\xb9\x7f\xea\xb9\x96\x7f\x05\x1b\x3c\xd5\xf2\x33\xb1\x07\x62\xfc\xd1\xf6\xde\x96\x2d\x12\x42\xa1\x6e\xfa\x6f\xb6\xf0\xfd\xd7\xdc\x07\xb2\x73\x0a\x2b\x82\x16\x7a\xf2\x67\x07\xc1\xbc\x5d\x60\x37\x08\x11\xc5\x6c\x88\x28\x7c\x03\x0c\xb1\x0a\x6a\xea\xbd\xef\x5a\x0f\x9b\x5f\xc7\xd7\x85\x1d\xf2\xcf\x8f\xc0\x56\xc7\x23\xdb\xb1\xa5\xc8\x0a\x3e\xff\xfc\xc7\xbf\x31\x9c\x03\x11\x31\x00\x0c\xa4\x3f\x93\xe3\xb2\x2a\x10\x0b\x41\x00\x7c\xc4\x3b\x62\xf8\x4b\x79\x51\x66\xc6\x71\x2b\x2c\x6a\xbc\xe2\x26\x28\xbc\x54\x0c\xb6\x38\xbe\x68\x86\x44\x78\x71\x3c\xcc\xc4\x74\xa2\xc9\xa8\x46\x00\x06\x24\x06\x01\xfc\x92\x45\xaf\x79\xee\xc1\x9b\x07\xbf\x18\xbb\xe5\x03\x4f\xc8\x1f\x23\x0c\x25\x81\x11\x1a\x54\x06\x49\xb9\x7a\x88\x9c\x57\x05\x8f\x79\xed\x31\xc6\x0b\x5a\x1f\x1a\x1c\x84\xa1\xeb\xc3\x7c\x15\xe8\x10\x14\x1e\xda\xd6\x19\xd2\xac\x61\xdd\x20\xa1\x45\xc1\x52\xb8\x89\xd8\x83\x3a\x3b\x19\x8b\xa7\x11\x73\xe2\x32\xe3\xeb\xe4\x36\xf1\x22\xc1\xb8\x6f\x5f\xcb\x03\x5d\xf9\x4e\x96\x33\xc0\xc3\x9d\xf6\xfb\x2f\x53\x8d\x7c\x9d\xdd\xed\xc0\xbb\xd5\xae\x52\xb6\x0a\x9f\xe7\xf5\xf3\x5e\x38\xcf\x00\xc3\x39\x4a\x7c\x9b\x9c\x9d\xb7\x7c\x17\xda\x10\xfd\x1f\x6d\x79\x1b\x2e\xbf\x94\xd4\xef\xb9\x5c\xef\x60\xa7\xdc\x47\x9b\x54\x04\x9c\xf3\x83\x58\x9e\xbd\xa7\xc5\xa8\x33\xe6\x69\x87\x4e\x26\xc9\xac\x99\x4e\x93\xa4\xad\x6a\x6f\xb5\x09\xe6\xd2\xeb\xaa\xdc\xf3\xf0\x71\x33\x9c\x9f\x2a\xf1\xb0\xa2\xfd\xb2\xaa\x09\x35\x31\x83\xb4\x9f\xc1\xa5\x74\xb3\x0d\xe9\x03\x66\x90\x4e\xad\xbb\xfe\x23\x62\x43\x67\x10\x54\xbc\x8a\x94\x55\x29\x70\x85\xfb\x25\x8e\x0c\xb2\x43\x1a\x0d\x1d\x6c\x5b\x3f\x56\xad\x33\xd6\x71\x07\x6f\x1d\x4c\x33\x32\xc7\xd6\x6d\x52\xf0\xe8\xc2\x79\x5b\xa1\x5f\x90\xa3\xdb\x73\xfb\xac\x17\xc0\xcc\xc3\x5e\x25\x94\xe8\xe0\xd8\x84\x16\x59\xe4\x65\xaf\x7a\x21\x8b\x8e\x46\x20\x9e\x97\xa1\x85\xfc\xb2\x47\x9a\x50\xcf\x19\x97\xc3\xc5\xa4\x3f\x25\x2a\x95\x3c\x25\x5d\x37\xa7\x45\x36\xc9\xb6\x9c\x9e\x39\xf9\x15\xb1\xa9\x2a\xc9\x06\xe9\x06\xc8\x7f\xbd\x0b\xf7\x46\x15\xee\xd5\x11\x28\x1b\xbc\x42\xca\x5c\xff\xbb\xba\xcf\x0c\x16\xc7\x4f\xbc\xfc\xeb\x67\x8c\x5e\x54\x84\x03\x70\x9f\x4b\x73\xd7\xfd\xb0\x3b\xdb\x2a\x5c\x4e\xf8\x33\x39\xcf\xca\xc9\x11\x74\x0e\x84\x47\x84\x28\xd1\x34\x1a\x91\x21\xda\x6c\x11\x5e\xb0\xb1\x37\x8b\x61\xe0\x00\xbc\x79\xbb\x85\x6c\xb2\x5f\x86\xd6\x73\x96\x99\x23\xed\x1f\x18\x85\xb9\xd3\x56\xb5\xa5\x58\x30\x77\x55\x03\x35\x65\x85\x8e\x87\x0a\x2f\xa0\x86\xcc\x2b\x45\xc9\xdf\x0d\xa3\x02\x38\x5e\x19\x30\x5e\x1e\x69\x7a\x41\xf5\x91\xa9\x11\xcd\x19\x69\xc8\xbd\x73\x63\xc7\x49\x90\xfb\x5b\x2f\xe1\x13\x8d\x69\xa6\x52\x5c\x77\xff\x92\x14\x7c\xbf\x94\x17\x99\xb8\x30\x21\x1d\x9c\x0e\x55\x1a\x6d\x5e\xd9\x01\x47\x1f\x05\x5e\xc9\xdb\x9a\xc8\x01\x8a\xbb\x8e\x15\x5c\xc0\x52\x27\xa7\xd9\xcb\xd8\xa0\xf2\x59\x96\xcc\x28\xbd\xca\x42\x67\xd5\x2c\x56\x3d\x41\x13\x30\x69\xd2\xd0\xd5\xb9\xba\x6c\x02\xb5\xfe\xa1\x63\xbc\xca\x02\x4e\x92\x0f\x65\xe2\xd0\x3a\x60\x98\xe6\xc3\x1d\x88\xb4\x40\x9f\x44\x0e\xa0\x4a\xb4\x6f\xbb\x20\x55\x89\xd6\xdd\xfa\x3d\xd8\x95\x9f\x3d\xe6\xa0\xe0\x07\x3c\x8d\x21\x3a\x84\x8a\xaa\x01\x5a\xde\xc6\x86\xb8\xef\x61\xc2\xd9\x63\x0a\x68\xf5\x89\x1d\xce\xd4\xca\x6d\x82\xa5\xf8\x2e\x5f\x15\x08\xa9\xe6\x60\x2d\xd1\x5a\xb3\x6b\x24\x2a\x76\xf9\xfa\x3a\x09\xd3\x3a\x13\x3a\x4b\x04\x35\xce\xe5\x3d\x74\xf7\x41\x10\xc4\x91\x0b\x7a\x47\xae\x79\xcc\x13\xbc\xca\xba\x9a\x35\x92\x75\x73\x23\x97\x50\xf5\xeb\x4e\xd9\xed\xdb\x10\x5b\xda\xf5\xc5\xce\xb1\xaf\x21\xb3\x23\x7f\xb8\xb1\x6d\x4c\x58\x78\xc8\x85\x5f\xae\xbf\xf6\x94\x8e\x19\xae\xa0\x9d\xf1\xa7\x12\x4d\x18\x1a\xd0\x39\x48\xb9\x1a\xdc\x10\x03\x22\x37\x41\xce\x3b\x90\x0b\xd4\x9b\x42\xde\x50\xd5\x6b\xc9\xf8\x8e\x65\x89\x53\xd0\x75\x04\x2f\xb5\xdb\x4e\xb9\x37\x78\x24\x52\x90\x4e\x39\x5f\xd9\x64\x84\x93\x19\x2e\x23\xd4\x39\x07\x06\x51\x4c\x9d\x87\x95\xa0\xd5\xa4\xca\xd5\x99\x52\xfd\x78\x2c\xc4\x4e\x57\xd9\xd6\xf9\xbc\x99\xa0\xcc\x0a\x5a\xad\x80\x83\x99\xea\x3e\x5d\xef\xf3\x46\x76\xda\xb3\xda\xce\x7e\x36\xb7\xb3\x9f\x95\x3b\xbb\x27\xe1\x4d\x3c\x6a\xcb\x31\x17\x45\x6c\x4e\x2f\x1c\xe8\x8e\xde\x51\x3b\x80\x29\xce\x3e\x2e\x54\xc8\x55\xdb\x11\x01\x60\x75\x0f\xe9\xa7\x59\x0e\xa0\x4c\xb2\xc1\x97\x4a\x92\xc1\x53\xaa\x1e\xa5\x49\x40\x8b\x4b\x91\xbb\x43\x4a\x74\x2f\x20\x49\x0e\xd5\x37\x37\xa4\x91\xff\x39\xa5\x19\x6b\xb4\xd7\x02\x59\xb9\x63\xb2\xb6\xf0\x4a\xf0\x80\x5f\x37\x37\x65\x92\x8c\x78\xd9\x0e\x59\xf3\x24\xec\xb6\x74\xa0\x60\x5f\xc3\xde\xb6\x4b\x8d\x59\x89\x76\xee\x0c\x19\xbc\x30\x56\x31\xd0\x6d\x1d\x6d\x77\x66\x6b\xb5\x55\x67\x98\x36\x58\x59\xb7\xcb\x7f\xed\x72\x45\x2f\xee\x31\x60\x0a\xff\x07\x1e\x1f\x24\x09\x9e\x3d\xe4\xb0\x1a\xcf\xd1\xe2\x88\xf4\xe5\xac\x2e\x79\x5a\x19\x2f\x32\xb7\x26\x41\x70\x16\xc1\x61\x08\x01\x1a\x59\x76\x06\x87\x12\x47\x31\xf8\x57\x06\xd8\x23\xdf\x81\x98\xc6\x73\x5a\x49\x88\xbb\x68\x73\xac\xdc\x83\x65\x85\x93\x03\xe3\xf4\xb9\x5d\x57\xe0\x73\x19\x99\xab\xc6\xe2\xf3\x4e\x1f\xa1\x75\xaf\x43\xe2\xf7\x6e\x33\x34\xa0\x93\xa6\x81\x2b\xc0\xfc\xa2\x81\x93\xb0\xaf\xb7\x64\xa7\x0c\x66\xdd\x84\x39\x89\xc1\x84\xfb\xf5\xd6\x9b\x6e\xcd\xda\x0c\xd3\x61\xbe\x98\x8e\x59\xc6\x23\x34\x9a\x0c\xfd\x46\xb9\x88\x2b\x3c\x27\xb5\xd5\xce\xcc\xc7\x61\x8f\x67\x2b\x36\x5f\x70\x3c\x0f\x41\x6a\x1c\xdc\x67\x3e\x82\x33\x7e\x7e\xde\xf1\x1a\x6a\x4a\x62\xd7\x97\xc8\x1c\xe6\xfa\x98\xc0\x10\xf8\x05\x09\xcc\xdf\x01\x85\xba\xa0\xa1\xed\x0b\xf9\x05\xf2\x76\xc9\x17\x77\x67\x08\x4a\x35\x1f\xe6\xdf\xeb\x02\xdf\x4b\x3c\xf9\x30\x3f\xd3\x09\x67\x5f\xce\xbd\xe8\x74\x5c\xaf\x20\xfd\x52\xa0\xc9\x3d\x3d\x1c\xc9\x5d\x30\x4a\x71\x19\xda\x66\x5a\xe5\x88\x4f\x97\x33\xbd\x44\x05\x84\xe5\xf3\x08\xee\xac\xb2\xc8\x7d\xce\x01\x4a\xeb\xc4\x2f\xa0\x32\xfc\x68\x7e\xb8\x4c\x34\x1b\x92\x96\x75\xe7\xf6\x8a\x66\x0d\x1d\x98\x5a\xcf\x9a\xbb\x6e\x50\x3d\x43\xfa\xfa\xba\x69\x46\xe0\x6e\xcc\x74\x2b\x4b\x06\x6a\x70\x69\xc8\xb3\xad\x73\xa5\xc9\xd5\x40\x73\x42\xe8\xe1\xe1\x43\x81\x1e\x1d\x4b\x05\xce\x2c\x2f\xcf\x83\xb8\x7b\x8f\x50\xfe\xcf\xb0\xf0\x79\x18\x9b\xc6\xcd\x33\xa1\x1e\x55\xdb\xdc\x70\x77\x2e\x1c\xc6\xc7\xfb\x1a\x08\xc4\x8e\x4b\x96\x2b\x04\xd0\xe5\x52\xc3\x58\x08\xe5\xe7\xae\xdb\x72\xe1\x54\xa3\xe7\xf9\xdd\x98\x73\xb2\xa4\xf9\xd9\x32\x6f\x70\x81\xbb\x3b\x86\xd1\xb6\x5d\xad\x8a\x4d\x79\x7d\x44\x37\x09\x53\xa7\xf7\x61\xf7\x2d\xb5\x3c\x55\xf1\x6f\x86\x74\x42\xfa\xac\xb8\x62\x2c\x25\xc5\x95\x90\x79\x39\x22\x30\xea\x5f\xfb\x7d\xec\x2b\x3b\x42\xe2\x29\x70\xc0\xa8\x1d\x6e\x05\x25\x73\xa5\xa9\x6f\x89\xfe\x46\x6a\x95\xbf\x57\x70\x4c\xaf\x95\xa2\xbf\x25\xf6\x3b\x94\x1d\xd3\x6b\x3e\x9e\x8e\x0d\x8e\x3e\xcd\x54\xe1\xd0\x4f\x65\x89\xca\x85\xda\xed\xce\x41\xda\xea\xbf\x3c\x07\xe9\x1c\x98\x83\x5e\xd8\x39\xa8\x4f\xb3\xb7\x74\xa2\xe6\x8b\x17\x1d\xfc\xa9\x65\xa6\x4f\x33\xf5\x42\x66\x16\x00\x39\xc9\x16\x58\x71\xdb\x82\x61\x82\x3b\x99\xbd\xf8\x3e\xb7\xd3\x24\x82\xe9\x04\x33\x8d\x05\x00\x4e\x89\x60\x02\x3b\x3b\x57\x13\x98\x85\xd1\x48\x9c\x3e\xd0\xf5\xd8\xa4\x5d\xdf\xb1\x9f\x2e\xeb\x78\xf7\xd3\x67\x80\xbf\x90\x6e\xcb\xdf\x65\x9a\x29\x8f\x26\xaf\x34\xeb\xee\x7f\x3a\xda\xd7\x4a\xd1\xf3\x44\x0a\x5a\x51\xf5\x80\x61\x67\x5b\xce\x37\x45\xa6\x2e\xa6\xea\xce\x6a\x36\x37\xc9\x95\x7f\x79\xc2\x73\x3d\xdc\x49\xce\x8a\x02\xd7\x3b\xd3\x9c\x65\xaa\x79\xba\xd5\x52\xc3\x69\x40\xc9\xe0\xa7\x15\x19\xee\x34\x3b\xcd\xd9\x9b\x69\x02\x61\xb2\x6d\x88\x1d\xb8\x18\x99\x26\x89\xe5\xb9\x91\x86\x4d\x98\xac\xed\x5c\x3b\x1d\xbb\x2c\xaf\xda\xc2\x06\xf7\x26\xae\xd6\x20\x4f\xd5\xde\x4b\x53\x7c\x73\xa3\x67\x8a\xdb\xb6\x09\x41\x27\xeb\x78\xba\x87\x3d\xb8\x21\x7b\xf0\x89\xd3\x5f\xce\xed\x8a\x84\xfb\xd5\x92\xea\xc4\xc9\x9f\x8e\xc9\x46\x3d\x02\x4d\x95\x23\x02\x5b\x61\xb0\xba\x00\xb7\x9c\xae\x5c\x06\xfd\xea\x86\xe5\xb7\x2c\x75\xc3\x9b\xba\xe0\x4f\xf6\xc8\x56\xe7\xe7\x5d\x87\x3c\x3c\x73\x7d\xe2\x42\x79\xd7\x33\x92\xd7\xf8\xbc\x46\x6e\x26\x0d\x19\x1b\xb2\x30\x1e\xde\xfe\xfa\xab\xa6\xfa\x52\x05\x91\x96\x2b\x38\x55\x68\x47\x17\xde\x70\xda\xd9\x86\x7e\xdb\x21\x5b\xe4\xd6\x5c\x9f\x28\x51\xbc\x5f\x87\xc2\x0a\x91\x5d\x7d\x62\x18\xfb\x78\xfe\x0d\x52\xab\x4d\xce\x9c\xad\x1c\xcc\x83\x28\x04\xfe\xb6\x76\xa2\x34\xdc\x8e\x37\xff\xea\xe6\xc8\xf6\x75\x54\x9b\x9e\xe2\x2f\x50\xb5\x4f\xdd\xf6\xb9\x53\x2a\xb4\x54\xf7\xcc\x4b\xaf\x37\x76\x7c\x21\x74\xa6\x73\xf5\x79\x6e\xd7\x2c\x8a\xaf\xd8\xda\x33\xfc\x70\xdc\x74\x9f\x77\x34\xd9\xde\x2a\x07\xf1\x9b\x69\x1d\xde\xf7\xfb\x49\x15\x6b\x9e\x10\x42\x87\x6a\xad\x5f\xd5\x11\x45\x97\x5a\x6e\x28\xe6\x02\x5b\x1d\x76\x42\x13\x6e\x5b\x55\xe1\xf4\x6e\xfd\x11\x8a\xd8\xe6\x1e\x72\xc0\x52\xd8\x08\xe6\xaa\x35\xa7\x3b\x2d\x55\x6a\x50\x33\x3e\x9d\x11\xb1\x4d\x9e\x18\x92\x36\x6a\x06\x3d\xf9\x65\xcf\x1d\xb1\xd5\x63\xdf\x0e\xbc\x8c\x0f\x79\x6a\xb6\x76\xf7\xad\xac\xe5\x2a\x4d\x88\x24\xed\xe2\x73\xee\xa5\x88\x5f\xd3\xaf\xbf\x06\x8a\x08\x14\x2e\xd2\xe0\x4e\x88\x52\xcb\x3b\xbf\x5f\x12\x7d\xfb\xe9\x55\xd4\x76\xca\x80\x43\x0c\x27\x6f\x99\xe1\x5f\x3a\x8f\xfc\x8b\x35\x40\xcf\x8c\x7e\x9f\x9f\x4f\x3d\xce\x3f\x21\xbc\x04\xb1\x01\xed\x03\xad\x59\x56\x11\xf9\x5d\x1a\xe0\xbf\xdc\x78\xbe\x5b\x17\x3d\x68\xb4\xcf\xb9\x7f\xa9\x7a\x20\xef\x2e\x55\xab\xf2\x9b\xd8\x6d\x6d\xdc\xa9\xb6\x89\x3a\xbb\xc2\x03\xa4\x57\xe2\xfa\x1e\xde\xf3\xae\xd4\x2d\x0b\xe6\x5e\xb9\x17\x2c\x23\x7d\xb5\xa2\xce\x13\xbd\x5b\x95\x31\xcd\x86\xdc\xa2\xc5\x9f\xc1\x45\x8a\xbe\xc1\xc1\x3a\x36\x48\x13\xa1\x3a\x09\x1b\x14\xb0\x4a\x69\x39\x89\x18\x31\x1a\x52\x77\x3d\x2c\xe6\x86\x47\xd1\x63\x8b\x14\x62\x52\x42\xd3\x17\x45\x21\xc6\x55\x78\xf4\xfd\x56\x70\xad\xf5\xd5\x71\xbd\x68\x2f\x69\x80\xb1\x3b\x9a\xbf\x4e\x73\x76\xdc\x1f\x6d\x8f\xc4\x1d\x9f\x60\xeb\xc9\x28\x65\x57\xc7\x5a\xbb\x63\xcf\x39\x97\xea\x86\x12\x77\x41\xd9\x17\xd7\xe6\x5a\xe5\x95\xb8\x46\x57\x4d\x76\x61\x42\x13\x8c\xf3\xe1\x94\xee\x40\x9a\x73\x72\xca\x32\x08\xe4\xbc\x5f\x01\xea\xe5\xd9\x22\x09\x9d\xa1\xb7\x22\x17\x16\x13\xf5\x51\x89\x24\xb9\xa9\xe1\xf6\xf6\x48\x43\xa3\x6a\xc0\xe9\xaf\x93\x31\x12\x19\xff\x87\x48\x0b\x99\xb5\xbe\x1e\x92\x03\xd7\x3c\xe0\x6d\xad\x01\xfe\xb2\xef\x3f\xe7\x55\x98\xaf\xa8\x51\x71\x06\x9c\x70\x63\x70\xba\xfc\xf7\x8e\x7f\xf5\x30\x0a\xcd\x43\x65\x1e\xf2\xd3\x96\x55\x68\xa5\x22\xec\x8b\x6b\x1c\x29\x28\x66\xad\x72\xe8\xdf\x66\x1d\x2b\x02\x2e\x59\xf6\xad\xaf\xeb\x5e\xfd\xa6\xbc\xf1\xfa\xe1\xc1\x3c\xf2\x05\xc9\xe1\x95\x5f\x8d\xe6\x99\x1a\xc0\x01\xd3\x02\xa7\xf7\x1a\x87\x77\x43\x5d\xf6\x07\x52\x6d\xb6\x66\xf2\x95\xd9\x1a\xaa\x79\x63\xd3\x48\xaf\x79\x7e\x3a\x9b\xb0\x4a\xfd\xe8\xdc\x82\xe9\x54\xa3\xcf\x98\x53\xef\x12\xe7\x7d\x23\x73\x2f\xbc\x9f\x24\xf7\xbe\x15\xae\x31\x65\xaf\xba\x17\xae\x30\xa2\x52\xf0\x70\x21\xed\x99\x91\x41\x34\x7a\x3c\x17\xf1\x80\x14\x0f\x4c\xbe\x1e\xfb\x77\x1a\x96\xce\x33\x8e\xd5\xc8\x96\xb7\xaf\xb5\x7d\xf7\x12\x2d\xa7\x77\x4c\x77\x9a\xa3\x52\xa7\x1a\xbd\xec\xbb\xb5\x56\x75\xb6\x13\xe5\x52\x43\xff\x08\x16\x19\x97\x36\xac\x83\x05\x09\x6e\x5d\xab\x58\x6a\xf8\x53\xc9\x4b\xe5\x59\xca\x5c\x49\xb9\x0c\xbd\x87\xb9\xa4\x12\x46\x99\xf4\xfb\x5d\x56\x93\x46\xe8\xb7\x5a\x5e\x90\x71\xca\x53\x5d\x76\x49\x4b\x4a\x5b\xbf\xec\x8b\x39\x1e\x87\xab\x5f\x4d\xfa\x18\xe6\x49\x7e\xf5\x03\x53\xbf\xfc\x39\xd9\x21\x67\xf6\x77\xdb\xe1\xce\xb9\xdb\x6e\xe8\x96\xd7\xda\x74\x12\x3c\x4e\x97\x78\x2e\x37\x75\x30\xbe\xf6\xb3\xac\x4d\x2e\xc2\xb3\x73\x40\x71\x27\xdf\x2f\x5c\x8e\xab\xf5\x87\xb8\x62\xa6\xa0\xe9\x80\xb3\xad\x73\xb2\x81\xdb\x0c\xda\xcf\x97\x35\x6b\xb5\x44\x81\x09\xa1\xf9\x25\xb1\xef\x38\xbf\x03\x92\xa6\x93\x49\x15\x49\x5d\xa9\xab\xbf\x19\x49\xdd\x12\x49\xe1\x5d\x8a\xb1\x39\x6d\x5a\x9e\xb5\x89\xdb\x2f\x67\x5b\xe7\x8e\xf1\x69\xd3\xb6\x23\x00\xeb\x9e\xb7\x4c\xff\xcb\x85\xf8\x51\x3a\xe0\x29\x2f\x66\x6d\xb2\xa1\xbf\x3a\xfb\x91\x52\xf5\x8e\xb8\x9c\x6d\x9d\xb7\xf5\x55\x84\x5f\xb9\x0b\xd4\xb5\x40\xb6\xea\x39\x15\xd7\x84\x7a\x81\x63\xa7\x0a\x27\x54\xee\x7c\x57\x95\xef\xcc\x77\xf9\xdc\x09\x0f\x2d\x74\xed\x2d\x97\xaf\xda\x78\xd9\x90\x68\x89\xd9\x15\xf5\xee\x5f\x65\xd0\x6b\xf4\xbb\x6e\xda\xfa\xba\x6e\x65\x75\xcc\x1d\x9d\xb9\xa8\xce\x2d\x09\x87\x11\x06\x05\x1a\x88\x85\x11\x03\x9d\xfd\x10\x81\x98\xfb\xdc\x01\x5e\x2d\xe8\x37\x46\xd0\x06\x31\x40\x2b\x17\x86\xd6\x97\xab\x7c\x0c\x61\x8a\xe3\x3d\xac\x2e\xce\xd3\xbc\xa0\x69\xc4\x72\x5d\xf7\x7d\x1f\x40\xe8\x98\x3a\x64\x83\xa8\x05\xeb\x3e\xa4\x9a\xf8\x2f\x1b\x44\x1f\x61\x41\xce\xb7\x78\x30\xa1\xfe\x50\xd0\xab\xde\x4b\x94\x1c\xb2\xd5\x2c\x40\x4b\x70\xfe\xc0\xac\x7d\x41\xb1\xf8\xb0\x0c\x8c\x91\xb6\x6b\xac\x91\x5c\xfb\x4c\x07\xba\xb4\xff\xaf\xb1\x5a\xda\xb6\x6b\x16\xbb\xab\x29\x3d\x4b\x80\xa1\xa6\xde\xf4\x84\xc3\x65\x51\xbd\x01\x2b\xc2\x39\x2f\x4f\x8c\x7a\x09\x79\xe7\x1e\xea\xcd\xf1\xa8\xb9\x08\x9a\xdb\x05\x9e\x5e\x6c\x6e\x06\xb7\xb1\x76\x38\x2a\xf9\xc5\xd7\x3c\x7f\x13\x3d\x73\x69\x82\xa4\xe3\xc1\xc2\xe6\xa6\x31\xf5\x9e\xa6\x92\x4a\xb9\x15\x14\x03\x3b\x0a\x55\xeb\x96\x6a\x5b\xb5\x2d\x0b\x9e\xe5\xcd\x33\x61\x51\xb6\x04\x05\x1d\xe2\x12\xcf\x8f\x0d\x46\x88\x97\x61\xae\x8a\x02\xfb\x01\x3c\xf8\xd3\x60\x15\xb7\xf0\xa5\xa3\x39\x7b\x74\x67\x03\x6f\xfa\x5e\x11\xfd\xf0\x9b\x7e\x9e\xda\xfb\x87\x93\xaf\xaa\x63\xce\x19\x89\x86\xc7\xcc\x6b\x89\xeb\x8e\x03\x03\xaf\xc0\xac\xb2\x40\x24\x1b\xce\xa3\x0a\x78\x9a\x0e\x13\x56\x59\x26\xa3\x31\xaf\xac\x42\x66\x4c\x73\x28\x63\x26\xa7\xd0\x48\xc1\x71\xe2\x28\xe5\x67\x98\xf1\x78\xad\x3c\x8b\xc0\xeb\x05\x9c\x0a\xe0\x1b\x4f\x51\xc0\xca\x31\x38\xc7\x3c\x55\x93\xc6\x98\xa7\x7c\x3c\x4d\x9d\x58\x9f\x35\x25\xe8\xb5\x2e\x01\x66\x06\x15\x25\x2a\xd5\xbf\x43\xf9\x9a\x9d\x01\x4a\x4e\x29\x03\xcd\x5f\xca\xc7\xf7\x1d\x6d\x49\x2e\x5c\x17\x58\x25\x3f\xa2\xf9\x7b\xd8\x7e\xe0\x25\xb5\x39\x67\xa5\xf9\x7b\x7a\xed\xdf\x5d\x9b\x87\x71\xb9\x79\x8e\x33\xc7\xf4\xd7\x1e\xa7\x3b\x4f\x4a\x64\x8f\x8d\x79\x6a\xc7\x8b\xa9\xde\x0f\x92\x37\xaf\xb8\xa6\xde\x23\xd3\x2d\xee\x0e\x9f\x10\x45\xa0\x59\x1f\x61\xfd\x5e\x50\x47\x75\x2a\x2f\xc9\x74\xe3\x0e\x3f\xc2\xba\x2a\x41\xe9\x75\x69\xb1\x84\xf9\x95\xcf\x56\x50\xba\x64\xcf\xa7\xe5\xd7\x96\xda\x94\x11\x72\x40\x60\x4a\x8b\xa9\x72\x31\xbb\xe4\xe0\x39\x88\x43\xb0\xde\xa0\x19\x73\x6a\xe6\x29\x8e\x80\xea\xf2\xfb\x49\xa2\x42\xd3\x05\xc4\x26\x09\x24\x4c\x04\x4f\x8b\x5c\x61\xae\x5c\xb7\x80\x73\x43\x77\xc1\xe2\xb8\x31\x0d\x04\xd5\xc9\x69\xe2\xba\x0b\x1b\xd0\x46\x42\x9c\xb8\x91\x32\xb7\x15\x3e\x24\x80\x7b\xb3\x88\x26\xf0\xd8\xff\x9a\xe7\x1d\xf8\xa1\x73\x62\x1d\x82\xd2\x6c\xb1\x01\x26\x48\xd6\x12\x8f\x93\x2c\x82\xc8\xef\x46\xe4\xed\xed\xbc\x62\xee\xcd\x8d\xa6\x4e\xf9\xac\x57\x5a\x4d\xcd\x4a\xa0\xa3\x80\x10\xb0\xac\xc1\x43\x59\xa5\xb6\x3a\x46\x77\x3d\x0a\xd4\xdd\xcb\xb0\x48\x13\x6f\xff\x77\xac\xe1\x88\xd5\x4c\xbe\xa1\x08\xc9\x47\x62\x9a\xc4\x44\xa4\xc9\x8c\xd0\xc1\x80\x45\xae\x9c\xd1\xf8\x0b\x85\xd8\xbe\x85\x40\x99\x4a\x78\xca\x4c\x9c\x48\x68\xd0\xfa\x3a\x69\x62\xbb\xa1\xc4\xcd\x0d\xd2\x9a\xf2\x08\x9e\xec\xe5\xe1\xdb\xe8\xf9\xc0\xf3\xdf\x03\x98\x2e\xb3\x8f\x5f\xc2\x7e\x7a\x19\xa6\x98\xb3\x34\x85\x4b\xdd\x2a\x86\x3b\x65\x3b\x07\xdb\xf1\xbe\x83\x95\x35\xdd\x2a\x5b\xe4\xa9\x3e\x41\x76\xce\x1f\xec\x6b\x02\x9b\xea\xdb\x58\xe8\x49\xba\x64\xc5\x2d\x59\x09\x4c\x70\xa7\x5d\xd3\xe5\x4a\x2e\xe4\x0c\x89\xcd\x09\xb8\x59\x0d\x54\xc5\x45\x1d\x0b\x37\x5c\x9d\xcd\x6b\x38\xb2\xec\xae\x86\x02\xde\x1d\xfc\x58\xaa\xf9\x28\xbc\x28\x12\xeb\xeb\xe4\x91\x33\x7c\x0d\x99\x0e\x8c\x95\x20\x88\xb3\x7d\x87\xcc\xe8\x66\xd6\x36\xcf\x76\xa8\xdf\xbe\xd0\x48\xa6\x4c\xfb\xe6\xa6\xd4\x95\xd8\x09\x72\x36\xb1\xa2\x17\x93\x82\x5d\x17\x6d\x92\x33\xe8\x4d\x5c\x4f\xe7\xa0\x4a\xc1\x03\x65\x21\xc8\x90\xa5\x2c\x93\xf3\x12\xd0\xb2\x16\x34\x14\x97\xa3\xcd\xca\xb6\x05\x3d\x19\xf4\xe3\xdd\xcd\x5c\xf3\x3a\xf3\xce\x01\x84\x0b\xd2\x73\x12\xf4\x7b\x55\xaf\x57\xf4\xf9\xad\xfb\xf4\x57\xcd\x65\xca\x4b\x34\xe8\x99\x91\xf2\x12\xed\xcd\x63\xda\xd7\x82\x09\x41\xae\x7c\x49\x93\xa3\xb4\x60\x59\x0a\x41\x1e\xf8\xa5\x64\x9e\x2a\x5e\x53\x7a\x42\x33\xeb\x88\x9a\x10\xfd\xc5\xf0\x33\xd7\x0e\x38\xe5\xb4\x86\xc0\xc4\xbc\x88\xa8\xc1\x09\xfb\x4d\x83\xf2\x0e\x9c\x00\x1c\xa0\xd4\xfd\x65\x51\x06\x7f\x38\x6f\x03\x8b\x62\xa7\x81\x9b\x2a\xae\x51\xd9\xc3\xb6\xf7\x6a\xba\x22\xbf\xe9\x73\xb1\xed\xf3\xa5\xed\x35\xc9\xb9\x49\x9a\xe6\x85\x18\xf3\x7f\x30\xd3\xda\x52\x38\xef\xe5\x1d\x67\x78\x55\x9a\x07\xa7\x15\x35\xba\x80\xc1\x4b\xbb\xe5\x6b\xf7\xda\x3f\xb7\x7a\x0f\x72\x55\x4e\x43\xbc\xde\x80\xe3\x82\x52\xd5\xb5\xe1\x95\x69\x36\xec\xb6\x09\xcd\x86\xdb\xf0\xff\x33\xf8\xff\xb9\xbf\xbf\x5c\x19\x69\xee\xd6\xd4\xcf\xaa\xa3\xc3\x6e\x46\x57\x42\x4f\x99\x2f\x2e\x49\xa5\xdc\xbb\xa9\x22\x55\x81\xa6\xc3\xb3\xc9\x8f\x34\xcb\x95\x81\x3a\xac\x0f\x0d\xf7\xab\x3c\x9c\x98\x35\x37\x4e\x03\xde\x28\x16\x93\xda\x62\xf6\x91\x38\x1c\x4c\x9e\xea\xd3\x44\x38\xc0\x74\x1e\x51\x88\x81\x73\x72\x79\x97\xea\x38\xf5\x48\xe6\xc2\x9e\xfc\x59\xdf\xf8\xa5\x83\x77\x48\x55\x0b\x68\x43\x8b\x55\x03\xe5\x25\x72\xdd\xa2\xd7\xbc\x4f\xd6\x66\x17\x90\xa3\x0e\x0f\x54\x9e\xdd\x7e\xfb\x4b\xda\x5d\x6f\x2d\xa0\xf6\xf3\xd3\x42\x34\xdc\x1d\xe1\x7d\xb7\xf4\x15\x8b\x00\x40\x3f\xef\x69\x84\xeb\xc4\xef\xec\x31\x7c\x79\x45\xd3\xf8\xf1\x79\xb3\xd5\x06\x1b\x32\x60\xd7\x29\xbc\x1c\x6c\xc8\xf5\x76\xc3\x2c\x0c\x9c\x37\xc0\x8b\x10\x6a\xd7\xef\x2b\xa2\xf3\x1d\x4f\x19\xcd\xaa\x29\x4d\x20\xcf\xd2\x5a\x75\x06\xea\xed\x41\xac\x54\xca\x05\xbe\xf9\x65\x1f\xf1\xc8\xda\x0e\x64\xb2\x7a\xca\x03\x6a\xac\x0c\xb6\x9f\x31\xea\x82\x95\x1d\xd6\x2c\xd7\xd8\x8f\x72\x27\x59\xdd\x56\xd8\x64\x56\x75\x4b\x45\x53\xff\x62\x11\xf1\x8e\x17\xbe\x71\x2f\x2f\x34\x53\xce\xf1\xf3\xdc\x6c\xe1\x60\x6c\xb9\x07\xf5\xea\xa1\x6f\x03\x72\x1a\xe4\xa9\x5a\xae\xe2\x3b\xa4\xad\x36\xe9\xb6\x3a\x85\xf8\x6d\x32\x61\xd9\x01\xcd\x59\xb3\x15\x40\x74\x03\x53\x01\x63\x8b\x8f\x8c\x98\x43\xa8\xc7\x09\x13\xad\x6f\x19\x91\x69\x35\xcd\x8e\x26\xe0\xdf\xbd\x6a\x7f\x89\xbc\x30\xf2\x56\x3d\xb5\x2c\x3f\xf5\x21\xef\xc9\x4b\x2b\x26\xa8\x1a\x6f\xc9\xce\xb7\x1c\x32\xea\xca\xf6\xf0\xe3\x09\xd9\x23\x5d\xb6\xf1\x5c\xc5\xb6\x2c\x05\x3a\xf1\x16\x9d\xa5\x5c\x4d\xbe\x7f\x1d\x44\xf6\x82\xed\x8d\x3d\x4b\x53\x00\x37\x37\x0a\x54\x9b\xac\xfe\xb2\x67\xbd\xc5\x20\x4f\x03\x27\x10\x12\xa9\x57\xc4\xbc\xa0\xa1\xe9\x90\x99\x1a\xe1\x57\xd3\x58\x30\x8e\x81\x18\x7b\x31\x21\x73\xf1\x5e\x1c\xbe\x75\xcf\x5b\x64\x43\x32\xc1\xc0\xc3\x41\xa1\xbd\xa9\xa8\x80\x7f\xea\xc2\x0f\x78\x06\x8f\x9b\x70\x07\x16\xeb\x7b\x77\x6b\xc1\x49\xcb\xd9\xca\x4c\xdc\x71\x9b\x85\x58\x7e\x01\x6a\x6f\x6e\x14\xd2\x5f\x81\x18\x38\xe1\x76\x33\xe1\xd7\xaf\xee\x09\xa7\xc7\xea\xb3\xd8\xde\xfd\x07\xf5\xe9\x4b\x14\x7d\x37\x50\x8a\x2c\xe3\x76\x75\x29\xb3\xd9\xb7\xef\xce\xd4\x56\xc2\x39\x79\x73\x32\xe7\xf9\xf3\xa8\xbe\x4f\x71\x0a\xcf\xbd\x55\x51\x4f\x46\x35\x2c\xf8\x10\x02\xcf\x08\x7b\x7b\x2e\x41\x4e\xe5\x01\xb4\x7d\x9e\x41\xaa\x2c\xf8\xf4\xf2\x10\xb8\x13\x46\xbf\x71\x99\x13\xe6\x35\x95\x23\xcd\xd8\x39\xba\x99\x2b\xed\x8f\xf6\xf6\xd0\xe3\xd2\xa3\xd5\x18\x49\x5a\xc1\x5b\x3d\xd2\xee\x79\x78\xb4\x77\xe9\xf9\x84\xac\x18\x66\x65\x19\xec\xda\x21\x11\x0c\xb1\x1a\xd8\xf0\x79\x1c\x3a\x9d\x03\xb0\x4b\x65\x93\x73\x6e\x9c\xc9\xac\xa6\xbd\xba\x06\xe0\xa1\xfe\x81\x03\xcf\x32\x40\x5d\x6c\x12\xb8\xa2\xf0\x36\x8a\x2b\xa5\xa2\xeb\x52\xd1\x3d\xf7\x07\xbc\xb9\x3f\xc5\xa7\x20\x1e\x15\x96\xc2\xaa\x22\x5b\x73\x8a\x74\xab\xdb\xda\x0d\xdb\x5a\xf9\xec\x97\xb0\x3c\xe1\x69\x41\x52\xb1\x01\x3b\x9f\x8d\x8c\xa1\xc3\xde\x1d\xb2\xa5\xf7\x26\x4e\x80\xa8\x3d\x77\xaf\xa5\x53\x9b\x39\xcb\x38\x73\xbc\xbc\xc1\x3c\x02\x69\xc1\x6b\xce\xd4\x7b\xc1\x13\x4c\x17\xe1\xf3\xfe\xb1\xc1\x72\xb6\x75\xee\x3d\xee\x1f\xef\x92\xa7\x4f\xbf\xb8\xcb\x1e\x54\x10\x97\xcc\x3e\x04\x42\x33\xf8\x21\xb5\xa9\x15\x17\xc3\xa8\xae\x52\x89\x2e\x78\x16\xa3\x7d\x44\xf2\xfc\x03\xfd\xa0\x1a\x78\xc6\xcf\xcf\xbe\x9c\x43\x17\xbf\x24\x5e\x12\x98\xbe\x05\x40\xde\xd3\x13\x44\xf7\xab\xf7\x7c\x89\x94\x70\xec\x99\x76\xec\x56\xc3\x74\x5d\x18\xf2\xd4\x0e\x68\xfc\x73\xb8\x50\x22\x46\x6d\xb0\xdd\x57\x60\xd5\x24\x68\xa6\xcd\x23\xc1\x30\xb6\x44\x82\xc3\xf2\x3a\x12\x1c\x1d\xae\x75\xf6\xc9\xa9\x1c\x76\xc7\x6f\xde\x9c\x1c\x9e\xf6\xde\xef\x7f\x54\xd1\xd9\x51\x0e\xad\xa0\x61\x70\xf3\x09\x4d\xe3\x79\x2b\x2b\xcf\x15\xfb\xd9\x63\x01\x63\x15\x1e\xf0\xa0\x9d\xf7\x21\x60\x90\x83\x56\xe2\x4b\x45\x3a\x77\x9d\x16\x60\x9b\x84\xd8\x3e\x88\x94\x69\x5c\x39\x4f\x46\x62\xca\x8a\xe2\x3e\x18\xff\x0c\x31\x9e\x18\x2c\x1a\xef\x15\x1f\x0e\xe7\xaf\x26\x03\x9c\x59\x88\xf3\x0f\xc0\x20\xf1\xb9\x46\xee\x6e\x3c\x37\xff\xea\xce\xc9\x51\xe6\x2c\xe8\xd0\x02\x8d\x8a\xb0\x47\x02\x33\x3f\x34\x77\x31\xde\x3f\x8e\x16\x33\xf6\x73\x6c\xe0\x1d\x9b\x65\xfb\x92\x05\x70\x2d\x64\x03\xef\x73\x20\xb5\x1c\x40\xf5\xdc\x42\x77\x22\x9a\xcc\x56\x07\x04\xd7\x21\x2e\x46\xbf\xaf\x3e\x79\x4f\xcb\x56\xb7\xb1\xf2\x4d\xbb\xa5\xad\x0e\x45\x16\xcf\x77\x84\xea\x53\x96\x3b\x7d\x23\x4b\x6a\x01\x6a\xa9\x87\xb1\xcd\x70\x30\x9c\x59\x76\xab\x09\x56\xdf\x44\x48\x1c\xd0\xa2\xd6\x6e\xa9\x5b\xfd\x88\x79\x55\xdd\xeb\x43\xa8\x6e\xee\x29\xbb\x31\xcf\x6b\x4b\xdb\x71\x70\xe2\xf6\xbe\xdc\xa7\x5c\xb2\x2c\x67\x27\xa6\x35\xee\x1a\x4a\x12\x36\x67\x4d\x09\xf1\xa0\x65\x71\x9e\x0e\x95\x89\x5f\x21\xf4\x15\x67\xc6\xd2\x18\xae\xb8\xe5\xff\x4d\xa9\xb5\x13\x3a\x63\x72\x03\xdc\x5a\xb3\xbe\xb5\xa4\xb4\x95\x48\x20\x2f\x55\x2b\x3a\x2a\xab\xd9\x22\x3b\x2a\xc9\xac\x4f\x7c\x37\x3d\x1a\xbc\xc6\xb4\x68\x8e\x35\xdc\xb3\x1a\x6b\x38\xe5\xff\xc5\xb7\x71\x7b\xd6\x51\xc9\x16\xae\xec\x46\xeb\x99\xe7\x47\x4b\x72\x52\xfe\xae\x7a\x87\xaf\x4c\x87\xbc\x47\xaf\x54\x77\xb7\x25\xca\xf7\xc0\x73\xee\xbc\x36\x87\xb3\x73\x60\x02\xf0\x11\x96\x0d\x88\x00\x63\xf5\x93\x11\xcd\x81\xaf\x3b\xe8\x66\xa0\xed\xb2\x6d\x87\x7c\xbd\x35\x4f\xd0\x57\xe9\x5f\x5c\xf1\xa8\xe5\x4f\xc8\xb0\x4f\xd0\xb4\x3a\x94\xbb\xce\x84\xb4\x23\x1f\xa4\xde\xce\x49\x6e\xfb\x77\xea\x45\x7b\xc7\x13\x73\xf5\x20\xef\xec\xdc\x5e\x8d\xea\x1b\x3c\x43\x0a\x7a\x02\x42\x3b\x11\x10\x12\xfb\xe2\xdc\xa1\x50\x73\x31\xb4\x17\xbb\xb3\x15\x7b\x4e\x55\xde\x61\xd9\xd7\x3b\x30\xdc\xbf\x2b\xd0\x91\x24\xfa\x19\x3f\x8a\xb1\x23\x1a\x3d\x45\x49\xaf\xd1\x3a\x57\x53\xf2\x2a\x38\x2a\x3f\xcf\x83\x0b\x67\xff\xc5\x8f\xfb\x1c\xcc\xb8\x53\xac\x7a\x32\xa7\x30\x3b\x7c\x68\x69\xf7\xd6\x5f\x6f\x3d\x65\x59\xe7\xfa\xaa\x7e\xd4\x23\x72\x77\xdc\x0f\x95\xf8\xb9\xac\xa6\x9e\x37\x22\x39\x0e\x86\x5e\xa7\x5b\x29\x1e\x86\xdd\x14\x78\xba\x2a\xe5\x57\xd3\xa6\xa7\xe2\x38\x7c\x2d\x32\x24\x7b\xe5\x3a\x8c\x30\x95\x9f\x3e\x84\x5c\xae\x66\xb1\xd6\x58\xfe\x03\xe7\x79\xfd\xef\xc0\xd5\x48\x82\x03\xa1\x64\x62\x58\xf6\xa9\x95\xdb\x25\xc8\x4e\xf5\x92\x44\x17\x72\xd7\x23\x06\x81\xf1\xf3\x68\x85\x61\x05\x82\x36\x2c\x8b\x98\x73\x6f\x3e\xf4\x6c\xe6\x0b\x65\x29\x55\x67\x8a\x68\x6c\xaf\xea\xae\x9e\xd0\x82\xbd\xd2\x7d\x7f\x60\x95\x15\xfb\x66\xe4\x35\x01\x70\xab\x7c\x77\x7b\x10\xda\x90\xb0\x30\x2b\xbb\xb9\x06\xca\x73\xdd\xb6\xa3\xe3\xef\x1a\xaf\xed\x98\x79\x1e\x6e\x4d\x21\xd9\xe3\xe8\x81\x32\x8f\x5b\xf0\xb6\xcf\xfa\x1c\x04\xc8\xd3\x52\x99\x2a\x58\x31\x29\x72\x52\x63\x8c\x17\xf2\xdb\x5e\x26\xc2\x28\x48\x92\x0a\x4b\xb8\xd2\xe9\x6b\x90\x85\x47\xaf\x6d\xa8\xd7\xae\x9f\xbd\x13\x5f\xb2\x07\xb9\x1d\x2f\x31\xb8\xd6\x03\x00\xf7\x5a\xcf\x18\xdc\x98\x4c\x9d\x60\xcc\x3f\x94\x3f\x05\x73\x30\x06\x60\x7e\xaa\xb9\x08\x4c\x12\x71\xf5\x9a\x45\x7c\x4c\x93\x5c\x83\x7a\x89\x76\x2d\xe5\x90\xed\x37\xe3\xe6\x06\xcb\x29\xcb\x3d\xf7\x0a\xd1\xb1\x93\x9b\x16\xc2\x9a\xd5\xd9\x74\x75\x59\x32\x6f\x09\x09\xe2\x69\x9a\xed\x19\xec\x39\x0f\x06\x82\x66\xaf\xaf\x5b\xcf\x12\xe6\xc1\x95\x73\xa3\x09\x54\xfb\xf9\x5d\x37\xbf\x55\x6b\xa0\x8f\x03\x5b\x3d\x93\x51\x36\xfa\xca\x22\x99\x5c\x8d\x18\xda\x5c\xc2\x2d\x34\xcf\x09\x2d\x59\xf1\xcf\x3d\x87\xd7\x00\xb2\x8e\xdf\xb5\x9d\xee\x9d\xf3\x7c\x39\x74\xda\xd9\xe3\x21\x2b\x3e\x28\x7b\x3e\x44\xf4\xd8\x9c\x19\xb6\xad\x10\xb5\x7d\x09\xd0\x2b\x1b\x8f\xac\x39\x5a\x04\x31\x2b\x55\x12\x5e\x2a\x11\x63\x4f\xb8\xe3\xb6\x27\xbc\x15\x9b\xdf\xb3\xde\x82\xfc\x4e\xb6\xf5\x56\xc2\x37\xcb\xb3\x37\xfc\x5a\x87\x05\x96\xec\xeb\x2d\xca\xbf\x2a\x16\xf4\x4a\x3c\xa8\x3d\xdc\xae\x89\xf2\x1d\x5a\x88\x57\x80\x80\xcb\xb9\x1f\xac\xbe\xa1\x68\xaf\x0b\xa9\x70\xcb\xef\xaa\x11\x9b\x83\x33\x82\xca\x0a\x9c\xcb\xfd\x50\x72\x2e\x87\x01\x25\x74\x6e\xd9\x1c\xcd\x64\x29\xb7\xff\xae\x79\xe5\x9c\xcb\x5f\x77\x7a\x38\x83\xa2\xe7\xe4\xa5\xf7\xd3\x8f\x6c\xe0\xb8\x3d\xdb\x26\x3b\x65\xcf\xe4\x77\x06\x80\x41\x53\x62\xf5\x5c\xc8\x5d\x45\x2e\xf7\x78\xf0\x52\x3f\x4d\xb5\x36\x1a\x3a\x6d\xe7\xee\x0e\x0e\x2e\x78\xaa\x21\xa0\x7b\x7f\xac\xec\xde\x1f\x6b\xbb\xf7\x47\xbf\x7b\x8d\x2d\x34\xe6\xf9\xd6\x88\x41\xdf\xff\x38\xb7\xef\x7f\xac\xef\xfb\x1f\xbf\x71\xdf\xab\x46\xb8\xbd\xbe\x44\xa7\xeb\x5f\xa8\xfe\xb1\x9e\x6f\x2b\x08\x1b\xbe\xd4\x96\x1a\xe2\x08\x88\x1f\xe8\xbe\xe4\x65\xd2\xcd\x04\xb1\xf8\xc9\x39\x99\xb7\x2b\x75\xd5\x1f\x3f\x75\x9c\x34\x33\xa5\x1b\x7d\xea\x64\x76\x6a\xae\x86\x5d\x90\xb9\x5a\x7a\xd1\xcb\xa6\x7b\x5e\x37\x21\x15\x12\xf9\x2f\x2a\xe8\x8b\x2c\xfa\x6b\xe0\x2a\x0c\x7a\xad\xe4\x20\x50\x42\xfe\x52\x01\xa8\xae\x5a\xc2\xfd\x42\xc5\x75\x8a\xa1\xcb\x76\x51\xcc\x0a\x16\x15\x26\xde\xa4\x8a\x4b\x92\x97\xaf\x23\xe7\x02\x3a\xae\x3a\xf4\xe4\xa2\x77\x21\xe5\x47\xd6\x72\xad\xf4\x4f\x71\x15\x32\x2f\x9e\x67\x5d\x1c\x09\x14\xb0\xe2\x9f\x42\xef\x9c\x58\xa7\xf3\xc8\x55\xaf\x9b\x25\xc9\xc0\x6a\x13\x22\x41\x14\xb9\x01\xa2\x19\xa3\xff\x94\x46\xcd\x8b\x73\x3a\xaf\x55\x3c\xc6\x67\xb8\xc6\xee\xed\x29\x69\x1c\xc5\x8d\x5d\x57\x63\xfa\x10\x20\xe7\xda\x82\xc2\xdd\x49\xa0\x88\x5a\xcf\x27\x8a\x5f\xc1\x7b\x78\xbf\x8c\x01\xaa\x7f\xd3\x99\xf8\x86\xb3\x2c\x51\x47\x9a\x40\x39\x2e\xca\xd5\x89\xe7\xfa\x3a\xd1\xb9\x1d\x9a\x5c\xd1\x59\x7e\x32\x12\x57\xab\x73\x67\x64\xaa\xd6\x5c\x39\x6f\x85\x07\x30\x7a\x86\x29\x83\xce\xf3\x3b\xe1\xbc\xb9\xbd\x54\x0e\x4a\xaa\x1e\xdc\x62\xde\x79\x8d\x17\x38\xef\x34\xb8\xed\xf2\x39\x78\xc8\x22\x45\xb4\xda\x01\x4d\x57\xc7\x00\x95\x3d\xfe\x94\x34\xba\x8d\x5d\x37\x7b\x3b\xc8\xde\x6e\xe8\x1b\x55\xaf\x4f\xb1\x82\xbf\x55\x87\xca\xb6\x9f\xaf\xd0\xf1\x95\x8b\x78\xbb\x46\x4a\xba\xae\x98\x00\x01\xbb\x65\xa0\xed\x00\x68\xfb\x5e\x72\xd4\x55\x9f\xdb\xf3\x04\xca\x02\x3d\x44\xb2\xb4\x11\xbc\xcd\x2b\xdf\x47\xe1\xc9\x1d\xfa\x2b\xa8\xbf\x6c\xc4\xfc\x26\xbe\xd7\x2f\x85\x3e\xb8\xb4\x61\x02\xc2\xf8\x55\x90\x88\x97\x26\xdf\xf2\x2e\xa2\xee\x14\x38\x38\x65\x35\xc7\xc0\x52\xaa\x86\xce\x4d\x41\xe8\x5f\x52\x5f\x64\x1d\x39\x71\xf1\x54\x56\xb5\xc9\x55\x19\x59\xdd\x43\x76\xf7\x30\x1a\xe0\x21\x8c\xee\xde\x1e\x29\xfb\xab\x74\x29\xe0\xbb\x4e\x86\x17\xda\xcd\x71\xac\xe9\x8b\x88\x2d\x0e\x76\xc6\x2f\xdd\x53\x68\xec\xd6\x33\x03\x72\xee\xac\xcc\xef\xb2\xe4\x72\x9c\x2b\x9c\xf0\x74\x58\x3a\x54\xf3\x33\x9b\xf6\xbe\xf1\xfe\x7e\xae\xe6\x1e\x65\xea\x67\xc6\x30\xe3\x9f\x99\x71\x66\x9d\x9f\x3d\x4c\x61\xd4\x1d\x92\x56\x56\xdb\x5d\x5d\xb5\xe7\xda\xef\x40\x8d\xdf\x86\xaa\x6e\xf0\x2e\x2f\x2a\xfb\xc2\x42\xb8\xd7\x2c\x30\x98\xb3\x02\x44\x40\xb6\x2c\x3e\xb2\x2f\xe4\x96\xbe\xa0\x09\xee\x41\xee\x1e\x9b\xc4\x0d\x35\x62\xec\x1e\x4a\xd2\xba\xbb\x56\x71\x1c\x67\xb3\x17\xf7\xae\xad\x9c\x7f\x06\x72\xaa\x3c\xca\x82\xbd\x75\x15\x57\xc8\x53\xd2\x6d\xcd\xf1\x14\x95\x81\x41\x54\x9b\xe4\x65\xef\x1c\xa0\xd8\xf3\xc5\xdc\x72\x54\xca\xbd\xbb\xcd\xaa\xf4\x40\x15\xd7\x3a\x9f\xaa\xad\x2a\x30\x02\x51\xe1\x68\xfd\x81\xa7\xcd\x05\xf7\xf6\x88\x2e\x48\x6e\x6e\xdc\x64\x83\x90\xbc\x24\x5b\x64\xc7\x75\x9d\xe1\xc8\xea\xfb\xa3\x0f\xbd\xdf\xf7\xdf\xfd\x76\xd8\xfb\x74\xf8\x96\xec\x91\xcd\xff\x27\x95\xc0\x7b\x9e\x9e\xfd\x67\x7e\xfe\x64\x03\xfe\x6f\x9e\x6d\x6d\xfc\x7c\xfe\xb4\x79\xd6\x39\xff\xda\xbd\xc5\x1f\xad\xaf\x5b\xed\xee\x6d\xeb\xfb\x4d\xb4\xa6\x7e\xbf\xff\x7f\xab\xd0\xd0\x6b\x40\xf0\x9f\x4f\x17\xc1\xe3\x3c\xeb\xd1\x2f\x0e\xcb\x3b\xc0\xaa\xfc\x66\xee\xff\x46\x57\x32\xfa\x3b\x9e\x2a\xca\xa9\xf2\x92\x65\x83\x44\x5c\x39\x16\x17\x4b\xba\x4f\x0b\xea\xab\x0a\x96\xad\x67\x75\xe7\x10\xcd\x0c\x0d\x15\x46\x6e\xb9\x69\xb7\x6a\x01\x15\xd0\x23\x25\x50\x93\x14\xdb\xf3\xfa\x32\x27\xc8\x4b\x52\x2e\x4a\x76\xec\x89\x43\x39\xd7\xe5\xad\x36\xff\x76\x4e\xa0\x3d\x71\xea\x14\x2c\x2f\xe6\x11\xe7\xee\x01\x9e\xfa\x45\xd9\x35\x8b\xaa\x8a\x5a\x3b\x41\xb7\x65\x1e\x4d\x64\xc3\xb1\xdb\x5d\xc5\xe3\xca\x05\xd9\x5b\x06\x6b\xd6\xf2\xaa\x5c\xda\x03\xdd\x7d\x58\x18\xfa\x45\x64\xa4\x5b\x6a\x44\x77\x51\x19\xe9\x5a\x19\xa1\xd7\x15\x88\x3d\x19\xe9\x96\x65\xc4\xd5\x15\xd5\x32\xd2\xf5\x65\xa4\x67\x85\xc4\x2b\x5b\x29\x24\xdd\x0a\x21\xe9\x06\x1c\x06\x27\x8a\xbd\x6f\x2b\x25\x35\x0c\x2e\x83\x35\x6b\xb9\x55\x2e\xed\x81\x56\x9f\xac\x59\xdd\xae\xa3\x65\xdb\x93\xef\xa3\xf4\x93\x7a\x43\x62\x14\x6a\x2d\x90\x17\x95\xda\x79\xfc\x82\x41\xd6\xec\x6f\xbb\x9b\xd1\x81\x55\x6c\x84\xb5\x79\x0f\x56\xf4\x83\x12\xfd\xf2\x24\x78\x48\x82\xc9\xf0\xbf\xeb\xec\xdd\x9c\xc4\xe4\xbf\x2b\xc2\x21\x5e\x39\xbc\x2a\xd9\xc3\xb2\x2f\xbd\x60\xce\x3a\xb7\x14\x39\x1a\x60\x77\x02\x58\x48\x2c\x81\x02\x06\xf7\x30\xdb\xd6\xee\x5f\xbe\x97\x63\x41\xb9\xb1\x8f\x6c\xf4\xa6\x8a\xd7\xb6\xf8\xd6\xd6\xbe\xb1\xad\xb6\x74\xd0\x4e\x65\x42\xe7\x4c\x55\x57\xef\xda\xd9\x12\x06\xfb\x70\x03\x2e\xe1\xb1\x79\xa5\x0b\x1a\x3f\x53\x3d\xa2\x75\x62\x92\xeb\x1b\x08\xe3\xcf\x03\xcd\x05\xbc\x5f\xd6\x6b\x4b\x95\x6f\x8f\x92\x63\x97\x92\xe3\x10\xb8\xbd\xd4\xbe\x33\xdc\x40\xe7\xb2\x87\xb6\x5d\xc5\x00\xd6\x8e\x2c\xd6\xd6\x1a\xf5\x83\x77\x4b\x0f\xde\x5c\x64\xc5\x2b\x7f\x36\x57\x36\x1c\x76\xc1\x25\x4a\xa7\xdb\x22\xf0\x99\x64\xc3\x0b\x80\x2b\x78\x7b\xd3\xa3\xd7\x5c\x55\xc6\xf3\x5d\xbd\x25\x75\xa9\xbe\x63\x4f\x8a\x6e\x0b\xb2\xa0\xd0\x19\xf7\x1c\xe7\xaa\x60\x2d\x3e\x84\x1a\x2d\xe5\xcb\x28\x33\xb9\x37\xa3\x69\xe6\x5e\x05\x19\x3f\xfd\x10\x66\x26\xcc\xb0\x81\x49\x2a\x0d\x83\x6c\x05\xee\x8a\x14\x57\x9e\x3a\x2f\xd4\x57\x5b\x66\xf0\x3c\xd9\x24\xb7\xad\xf6\xda\xe6\x13\xb2\xfd\x4c\x4a\x2a\x26\x99\x35\x70\x73\x2c\xe2\x69\xc2\xda\x84\x5d\x4f\x44\x86\x46\x20\xca\x77\x44\x06\xde\x71\x21\xbb\xa3\x72\x21\x1e\x10\x98\xc9\x8a\x74\x87\x34\xb6\x3b\x2f\x3a\x5d\x78\x09\xa8\x6d\x73\xc4\x80\xf4\x7a\x92\x52\xe7\xd2\x05\x12\x00\xdf\x2e\xd9\xdc\x54\x8f\x3c\x36\x62\x9e\xd3\x7e\xc2\x36\x12\x9e\x32\x92\x8a\x0d\x08\xe3\xb5\x16\x92\xfc\x7c\x01\x92\xdb\xa4\xd7\xbb\x62\xfd\x09\x8d\x2e\x7a\x19\xfb\x73\xca\x33\xd6\xeb\x41\x3b\x1e\x4f\x73\x46\xf2\x22\xe3\x51\xf1\x78\x57\xe2\x53\x32\x4c\x7e\xdf\xff\x44\x8e\x3e\xfc\xfb\xe1\xc1\xe9\xd1\xf1\x07\xf2\x64\xd3\xe2\x9e\x64\x22\x62\x39\xb2\x41\xed\x02\x03\x13\x2c\x53\xeb\xe3\x5e\x8f\xe5\xef\x81\x96\xc7\x6d\x75\x26\x04\x5e\x52\x8a\x6c\xca\xd6\xc0\xe2\x0f\x6f\xfb\x81\x2f\xdb\x30\x88\x4a\x74\x36\xbb\xdd\x1f\x03\xc8\x67\x60\x83\x9b\x16\x2c\x13\x93\x4f\x08\xf7\x5a\x8d\x28\x8d\xcb\x94\x50\xce\xba\xab\x10\x3f\x7b\xe6\x41\x6d\xcf\xc1\x2a\xf3\x25\xb0\x6a\x5a\x27\xa2\x13\x5e\xd0\x84\xff\x83\xbd\x91\xea\xf9\x1d\x2b\x0a\xf4\xaf\x51\x95\xbe\x6b\x8b\x89\xb4\x50\x7e\x3c\xf5\x57\x9b\x39\xe0\x7a\x4b\xb9\x47\xcc\x77\x3f\x5b\xe5\x38\x08\x33\x26\xa7\xcf\x11\xe5\x29\x8b\xf5\xca\x40\x62\xaf\x4a\xd7\x8d\xbd\xa2\x59\xca\xd3\x61\x1d\xbb\x9f\xb7\x02\xc0\x79\x8c\x51\x20\xb2\x88\xd1\x61\x35\xb0\xa2\xff\xa5\x45\xbe\x1a\xad\xd6\xff\x02\xd6\x3e\xfd\x2f\x1d\x2b\x25\xe4\x25\xa4\xef\x90\xaf\x26\x96\x3d\x24\xdc\xee\xca\xb1\xeb\xd8\xc3\x55\x70\xb9\x99\x83\x21\x1e\xaa\x2f\x25\xa4\x1d\x96\x5e\x76\x3e\x1c\xbf\x3e\xec\x1d\x7e\xf8\x1d\xec\x94\x1e\x4f\x32\x11\x4f\x01\xcd\x63\xf2\x92\x34\xb7\xda\xb6\x99\x1d\x55\x67\x4b\x0f\x54\xc4\x88\x37\xa4\xf8\xbd\xd1\x26\x8d\xf7\xb4\x00\x3f\x44\x1b\xbf\x1d\xed\xdc\x41\x0a\xbb\x9e\xb0\xa8\xc8\x09\xd5\xa8\x68\x36\x9c\x8e\x59\x5a\x74\x1a\x2d\xb2\xe3\xfa\x7f\x31\x8f\x04\x24\x58\x27\x1a\xd1\x6c\xbf\x68\x6e\x55\x3c\xff\x46\x00\xfb\xfe\xfb\x56\x6a\x0c\x72\xc5\xe8\x85\xcb\x20\x25\x5c\x92\xe7\xe0\xf8\x3a\xf6\x0e\x6f\xa0\xd5\x20\xf2\xb6\xc9\x00\xd4\x61\x97\x2c\x9b\x39\xdb\xff\xf2\x1b\x0b\xd9\x61\x23\x9a\x1f\x5f\xa5\x66\xbc\x03\x10\xf6\xe5\xd9\x85\xbe\x17\x90\xf8\xe0\x97\xd9\xf4\x3b\xf4\x19\xf1\x6e\xd2\x2c\x73\x09\x54\x33\x8a\x0e\x6c\xad\xfa\x41\xa6\x60\x2f\x98\x50\x86\x0d\xf2\xd2\xfb\xb5\x83\x8d\x52\xfa\x21\x68\xd6\x6e\xe9\x4d\x2c\x4e\x79\x34\xcb\x9c\x29\xf0\xe9\x9e\x8d\x12\x25\xb5\xb5\xa5\x43\xd6\xac\x69\x07\x1b\xb5\x47\x8f\x64\xa6\x24\xfe\x8c\x9f\xb7\x09\x6f\x4b\x54\x2d\x00\x84\xa0\x59\xe1\x14\xce\xc3\x9b\x6c\x1f\xb7\x00\x35\x8a\x8e\x22\x74\xcf\x69\xdc\xd0\x80\xbb\x11\x9e\x39\x02\xaa\xe6\x95\x36\x69\xf4\xd1\x97\x60\xe3\xdc\x78\x90\xd0\x15\xb7\x60\x34\x6c\x74\x4b\x98\x25\x4f\x5c\x60\x2f\x0e\x87\x81\xda\xe8\x96\x3b\xb4\xaa\x2f\x79\xa8\xcf\x1c\xa0\x5d\x67\x49\x8b\xe7\xd1\x64\xa3\x4b\x5e\x12\x68\xb9\x3e\x7d\x36\x5d\x0c\xf5\xa9\xa5\xee\x09\x1d\x80\x07\x6a\x70\xe9\xe4\x18\x8b\xca\xbc\x3f\x78\x92\xa0\xfb\x3d\xd4\x81\x84\x92\x94\x5d\x39\xee\x58\x07\x24\x65\x2c\x66\x71\x5b\x42\x8b\x62\xc4\xb2\x2b\x9e\x33\x72\x25\xcb\x4d\x68\x9e\x93\x3e\x8d\x2e\x08\xbb\xe6\x79\x21\x47\xac\x2e\x88\x6e\x16\xa7\x49\xd2\x51\x15\x69\xc3\xd4\x81\xf1\x1e\x63\x41\x0b\x81\xe4\x39\x4b\xe2\xdc\x42\xde\x48\x34\xb7\xb0\x2a\xb6\x23\xb6\x4a\x61\x37\x91\x91\x46\x74\x7b\xb8\x84\xd3\x4a\x44\xaf\xdf\x70\xf9\x28\x27\x15\x0c\xff\x25\xc1\x5a\x38\xc2\x51\xd6\xe1\xdb\x2f\x50\x1c\x7f\xd8\x55\x1e\x94\x3c\xeb\xe1\xb0\xb5\x98\x31\xa5\x74\x65\x24\x81\xcb\x7e\xdb\xe5\xb7\x0a\x0f\x4b\xe4\xd1\x9e\x35\xeb\xa9\x38\x18\xa6\x51\x84\x94\xeb\xb2\xab\x51\xda\x50\xb5\x3f\x64\x43\xa5\xcd\x53\xd8\x78\x92\x7d\xd5\x5c\x82\xcf\xa3\xc6\xd3\xbc\x40\xd1\x99\x64\xe2\x92\xc7\xd6\x10\x39\x6f\x5b\x41\x6c\x1b\x41\x08\x75\x78\xd9\xbf\x54\x54\xd9\x9f\xde\xe2\x5c\x76\xca\x76\x65\xa7\xd2\x6c\xe8\xf7\xe9\xb6\xea\xd4\x6d\xdb\xab\xdb\xaa\x5b\xb7\xd5\x4f\xff\x4a\x49\x62\x80\x9e\xdc\x2e\x77\xee\xf6\x79\xc9\xb9\x14\x8d\x22\x75\xa5\x51\x8c\xe4\xce\x4b\x16\x37\x66\xf9\xb2\x4d\x75\xb9\xb7\xea\x44\xd9\xf6\x6d\x4b\x59\xdb\xcf\x5b\x52\xde\x76\x22\x9a\x24\xcd\x79\x6b\xd4\xe6\xb3\x56\xab\x15\xae\x78\x5f\xac\x70\xc5\xbb\xb2\x25\xec\xc9\xe5\xf0\x28\x82\xa5\x57\x55\x33\x5e\xfc\x00\x8b\xaa\x3b\xea\x6a\x28\x51\x6e\x60\x45\x0c\x4c\xb5\xe4\x16\x00\x6b\x6b\xaf\x11\xb9\x49\xde\xf1\xb6\xcc\xcd\x60\xe0\xd5\xad\xd3\x14\x7d\x2d\x3d\x5c\x94\x8f\x8a\xbf\x64\xdd\xe6\x77\xdf\x0f\xf3\xba\xcf\x32\x4f\x71\xa5\xd7\xbb\xc7\xe6\x65\x44\xb3\xb1\x48\x67\x4a\x08\x48\x93\x8f\xc7\xd3\x42\x32\xb0\x45\x9e\x6c\x56\xe1\x3e\x7b\x4c\x1f\xe3\x0b\xe9\x2b\xf0\x85\x78\x49\x13\xbc\x52\x28\xb6\x30\x95\xbc\xa6\x85\xb2\x99\x2c\xba\x4e\x92\xcb\x36\xa7\x70\x73\x90\x08\x91\x71\xfd\xc6\x85\xb7\x49\x84\xd6\xc5\x03\xce\xd0\x6f\xc6\x1a\x71\xa6\x22\x5d\x2a\xa6\x45\xe9\x3c\x0b\x10\x35\xd5\x19\x93\xae\xb6\xf9\x14\x40\x5b\x70\xc8\x69\xb7\xb4\x1a\x51\x07\x4a\x91\x3d\x93\xb0\xeb\xe5\x46\x8c\x27\xce\x89\xcb\x3d\xaa\x85\xdf\x1b\xa4\x2b\x6b\x56\x4d\x83\xb4\x36\xe9\xb6\xda\x6e\x21\x97\x32\xbf\xf2\x4c\x4c\xbd\xc0\x85\x5e\xed\x70\x43\xb1\xe5\x10\xae\x90\x19\x4d\x16\x77\x9d\x4c\x68\x08\x42\xec\x06\x57\x1f\x92\xca\x78\x8b\xfc\x22\x0b\x6c\x60\xc2\x4b\x99\xb0\x43\xe2\x6e\x05\x51\xc6\x86\xd6\xa3\xaa\x4d\xf2\x82\x4d\xc2\x75\xaf\xd3\xec\x72\x8f\x60\x11\xb9\xab\x4f\x31\xf6\x6d\x57\x9f\x52\x03\x73\x9a\x80\x70\x0e\x73\x82\x83\x51\xbc\x69\x94\x48\xc5\xc4\xa7\xc6\x3d\xd9\xd4\x61\xf1\x01\xb8\xc4\x1f\x48\xd5\xd1\x9d\x81\xb8\x45\x68\xdc\x35\x2b\xca\x47\x88\x81\xfc\x02\x54\xa0\xc7\x13\x80\x81\x40\xcc\xc6\xff\x33\x10\x03\xc7\x16\x34\xc9\x85\x72\xb0\x99\x93\x23\x35\xc5\x4a\x1e\xa9\x83\x64\x04\xc5\xe7\x97\x96\x7d\x48\x66\x6b\x97\x5c\x8d\x78\xc2\x48\x53\xf3\xd9\x70\x80\x4d\xac\x88\x21\xb0\xba\x9e\xd6\x94\x79\x37\x93\x40\x4d\x99\xc1\x2a\xca\x87\xc3\xe1\x82\xe5\xe1\xb5\xa6\x37\x90\xab\xc4\x54\xc5\x91\x51\xc7\xb5\x98\xa3\xc8\xf6\xc7\xc0\x23\xb8\x58\xc0\xb1\x0a\x70\x9d\x9c\x15\xa7\x7c\xec\x8c\x24\x6b\xa3\x53\x2f\x7a\x55\xf5\xf9\x06\x23\xd0\x1f\x60\x12\xab\xe8\x78\xfa\x14\x93\x02\xdf\x15\x24\x64\x2f\x56\xb6\xd1\x0d\x89\xfd\x7a\x3b\xe7\x04\x8a\x8d\x27\xc5\xcc\xda\x97\xe0\x3d\x81\x42\xbc\xb1\x81\xb2\xb1\x58\xc5\x4f\x1f\x54\xb1\x67\xd8\xa2\x3c\x08\x9b\x5b\x4d\xd0\xb8\x66\x1f\x67\x86\x84\x7a\x6a\x15\x8e\x30\x96\x3a\x2f\x33\x8b\x2d\xd3\x4f\x4f\xb5\xa8\x15\x5d\x9b\x26\x81\xcd\x7a\x08\x3b\xbc\xd8\xb2\xd2\x59\x74\x4d\xae\x92\x28\x67\x74\x01\x01\xcd\x62\x4b\x62\x6c\xd9\x75\x93\x4f\x25\x6c\xbf\x7d\x2a\x5d\x69\x50\xc3\xb8\x7a\xcc\x5a\x63\x77\x9e\xbf\xe1\x29\x2f\x98\x2a\xed\x0f\x5c\xf2\x52\xbd\x84\x33\x7f\x3b\x36\xbb\x2b\xb3\x35\x35\x1e\x48\x30\x92\x9a\x30\xa1\x39\x10\xf2\xef\xa5\x23\xcb\xce\x8a\x01\x40\x65\xca\xbf\x68\x05\x04\xcb\xd7\xdb\xa0\xf4\x4e\x75\x69\xbf\x07\xe5\xd2\xbf\x8c\xc9\x5b\x86\xba\x37\x25\x66\x1a\xbc\x2d\x9d\x9b\xfe\xf8\xa0\x55\x24\xdc\x66\x24\xa2\x4f\x93\xba\xb3\xc5\x1f\x5a\xbb\xee\x29\x71\x15\xcc\xf6\x33\x0d\x53\x5c\xd7\x2d\x1c\x7f\x56\x20\xda\xf3\x40\x15\xcc\x96\x82\xf9\xf8\xe9\xf8\xf4\xf8\xf4\x3f\x3e\x1e\x92\x3d\xd2\x98\x64\xa2\x10\x72\x4b\xd4\x50\x4b\xd4\xef\xd5\xaa\xc8\xb9\x72\x69\x62\xb0\x9b\x94\x8e\xa5\xe2\x11\xd3\x2c\x72\x8c\xd4\x8f\x4e\x7a\x6f\x8e\x3f\x1d\x1c\xbe\x56\xe7\x30\x64\x5d\xa3\xe8\xbc\xd9\xb5\x30\x6f\xdf\x1d\xbf\xda\x7f\x57\x86\x79\xeb\xc0\x9c\x9c\xee\x9f\x1e\x1d\x94\x61\x4e\x1c\x18\x20\xbe\x0c\xf2\xd1\x01\x79\x75\xf4\xa1\x82\x98\x57\x0e\xc4\x1f\x9f\xc0\x1b\x4d\x00\xf1\x87\xb1\x0b\x37\x67\xf4\x96\xf0\x97\xd8\x43\x3b\xf0\x61\x5d\x21\x36\x9d\x9f\x7b\xfa\x41\xb2\xc2\xf1\x51\xb2\x96\xec\x69\x74\x67\x86\xef\xe6\x82\xb0\xa0\xd9\x10\xd6\x15\x6e\x3d\x4a\x5e\x76\x1c\x8e\xe8\x44\x55\xd1\x0e\x69\x7a\xbf\x21\xac\x6f\xab\x02\x3f\xb8\x34\x11\x57\x69\x9b\x40\xf0\x5d\x54\x7c\xa6\xae\x96\xea\x4b\xb9\x4c\xa1\x63\x66\x4e\xbf\x2e\xd8\x8c\xf0\xd4\xeb\x68\x78\x16\x69\x4e\xa5\x79\x4a\x52\xf0\x07\x04\x39\xe2\x4a\x6e\x67\x1e\x59\x39\x58\x5f\xd7\x0d\x33\xdf\xf0\xbc\x4f\xee\xd1\x9d\x83\x1a\x3d\x39\x49\x04\xeb\xeb\x44\x55\x6b\xae\x4f\x64\x75\x3c\xd5\x6e\x88\xa4\xd2\x47\xc1\xc4\xaa\xe5\xee\x7a\x42\xf3\x9c\xa1\x76\x41\xd7\xb7\x12\xd3\x4b\xaf\xca\x1d\xd5\x0c\x73\xc4\x08\x98\x26\x19\xbb\x94\xfb\x79\xc5\xea\x89\x48\x92\x29\x9e\x4f\x09\x74\xb6\x99\x4f\x68\xc4\xf0\xfd\xa6\xee\x3d\x75\xf4\x61\x7b\x4a\x3d\x5f\x14\x83\xa0\x8d\xee\x19\xe0\x4b\xb7\x7a\x5d\x7b\x9f\xa7\x31\x29\xf8\x98\x65\x70\x02\xa4\x88\x90\x55\xcb\x8d\x2e\x19\x64\x62\xac\xdb\x2a\x79\xc0\xae\xd1\xa7\xfb\x8e\x91\x6d\xb9\xaf\x82\x96\x46\xc5\x75\x13\x62\x04\x21\x8e\x96\xae\xe1\x2a\xa3\x13\x8d\x37\x12\x69\x5e\x64\xd3\xe8\xff\x63\xef\xed\xbb\xdb\xb6\x91\xc5\xe1\xbf\x6f\x3e\x05\x9a\x7b\xd7\x92\x12\x59\x7e\x89\x9d\xa4\xf2\xba\x39\x89\x93\x76\xf3\xdc\xa4\xce\x13\xbb\xdb\xdb\xe3\xc7\x3f\x85\x26\x21\x8b\x0d\x45\x6a\x49\x2a\x96\x36\xf6\x77\x7f\x0e\x66\xf0\x32\x00\x41\x4a\x96\xec\xb4\x7b\x7f\xeb\x9e\xd3\x88\x78\x1d\x0c\x06\x83\xc1\x60\x30\x53\x66\x79\x01\x9d\xa8\xc1\x87\x23\x90\x0f\xcb\x11\x1f\x0b\xbc\x27\xf1\x45\x1e\xe4\x73\xd3\x15\x2c\x12\x67\x06\x0f\x0f\x01\xd3\x2f\x18\xd1\xcf\x1c\xd9\x37\x81\x3f\x5a\x9c\x23\xe8\xb2\x8b\x2e\x0b\x5d\x79\xa4\x1c\xc5\x85\x0e\xf9\x96\x0d\xd9\x91\x2d\x0b\x14\x57\x71\x19\x8e\xc0\xed\xf6\xd4\xf7\xe2\x40\xfd\x85\x41\xc1\xd9\x76\x9f\x08\x66\xec\xa8\xdd\x39\xa8\x96\xd9\x71\xca\x04\xbe\x42\xbb\x6e\xa1\x2e\xbb\xb0\xca\xdd\x54\xf3\xc5\xd8\x88\x29\xad\x2a\x70\xe4\xaa\x40\x70\x18\xc6\x79\x81\xfa\xf1\x23\x59\xb5\xec\x90\x1d\x39\x8b\x98\x6c\xd7\x3f\x6a\xea\x1d\x07\x9f\xc5\x79\x36\x28\xe3\x50\x5d\x21\xaa\x99\x95\xbc\x9c\x8d\x79\x39\xca\xa2\x42\x0a\x3e\x82\x46\x3a\x38\xa9\xc8\x3e\x0d\xe9\xa2\xc3\x64\x9b\x64\x05\x55\x29\x55\x14\xe8\x5e\x80\x7d\x88\x06\x24\x17\xa1\xab\x11\xfa\x54\xfd\x81\x42\x33\xcb\x79\xef\x2f\x47\xc7\x3f\x9f\x9c\x7e\xfc\xe5\xe8\xf4\xf8\xe3\x5f\x7a\x32\xb7\xf7\x97\x9f\x5f\xbe\x7f\xf3\x17\xbd\xee\x15\x38\x66\x56\x95\x8e\xa3\xf7\x25\xce\xcb\x69\x90\x00\x87\x75\xd3\x80\xcd\x76\xd4\x7a\xd4\x20\xdd\x16\x28\x8d\x2c\x0a\x16\xf1\x8d\x60\xf6\x85\x8f\xf0\x6a\x41\xf1\xf3\x8d\x0d\xf6\x9d\xfa\x00\x20\x3a\xb0\xe9\xb6\x55\x9a\x74\x24\x25\x30\x46\x55\xe2\x37\x07\x0f\xb6\xb6\x70\xc7\xb9\x88\xcb\x71\x30\x79\xa0\x77\x49\x76\xc8\x76\x0e\x10\xfe\x61\x96\x87\x3c\xd2\x59\x3f\xb1\x43\xb6\x2b\xb3\x70\x39\xeb\xac\x13\x76\xc8\xf6\x64\x16\xd2\x82\xce\x12\x5b\xdb\xf3\x03\xc5\xe9\xb2\x32\xd3\x39\xaf\x44\x57\x4f\x0f\x34\x17\xd2\x19\xbf\xb2\x43\xf6\x64\xf7\x40\x33\x0f\x9d\xf1\x0b\x3b\x64\x4f\xf7\x30\xa3\x08\x86\xfc\x81\x41\xca\x21\xdb\xd9\x7d\x7e\x80\x0e\x9f\x20\x36\x84\xc1\x39\x50\xe3\x27\xc9\x51\x3e\x3d\xa8\x5c\x7d\xcb\x46\x0e\x2a\xd2\xd6\xf3\x3f\xf2\x96\x5a\x11\x1a\xd1\x57\x69\xdf\x3e\xa0\xbc\xc3\xa0\x3d\xbf\x4c\xe4\xd9\xde\xaf\xc1\x7b\xda\xf1\x15\x6f\xba\x1b\xa5\xe5\x48\x65\xb0\x72\x7b\xf3\x8f\x69\xad\xec\xb8\xff\xf4\xb9\xb7\x78\x73\x5f\xa6\x9c\xa9\xcc\xcb\xd7\xc4\xf9\x7d\x8d\x14\xfa\xfc\xfb\x9a\x0a\x8d\xfd\x59\x25\xcd\x8d\x71\x1e\x4c\x16\x77\xf9\x6c\xaf\xae\x42\xe3\x55\xb3\x5d\xf4\x9b\xa8\x2e\xe1\x3e\x72\x9a\xdb\x6e\xfe\xa7\x39\x6f\xbf\x0a\x0a\x7e\xa4\x02\x91\x18\xa1\x79\x94\x85\xec\x10\x2f\x28\x2c\x2a\x31\xb7\x14\x34\x9c\x74\x36\x29\xba\x2c\xe5\xb3\xf2\x83\xf8\xe9\x68\x23\xbe\x93\xad\x90\xf9\xa7\xd7\x9a\x4e\xdd\x03\x3b\x98\x5a\xed\x55\x4a\xcb\x5c\xa5\xb8\x8f\xb6\xb1\x3f\x9b\x02\x4c\x8f\x78\xe9\xe2\xcc\x96\xc9\xb6\xf0\xd1\x65\x2d\x81\xa4\x56\xa7\xd3\x1e\x65\xa1\x83\xab\xca\x43\xa4\x6a\x11\x34\xcd\x51\xcb\x56\xbd\x85\x3c\x04\xcc\x37\xae\xff\x55\xaf\x14\xbe\xff\x23\xd9\x93\xe3\xf7\xfb\xe8\x8d\xd4\xe9\x6f\x3d\x52\xa2\xde\x60\xf0\xf1\xcd\xcb\xa3\xd3\xc1\xeb\x37\x7f\x3f\x3d\x3e\x7e\xa7\x24\xd5\xc1\xdf\x8e\x8f\xff\x7b\x30\x10\xb0\xe3\xac\xa3\x9e\x5a\x19\x19\x35\xd6\x71\x6f\xd3\xaf\xaf\x97\xaf\xdc\x53\x80\x22\x45\x69\x11\xe3\x01\x63\x3e\x67\xb1\x2b\x50\x24\x44\x58\x8b\x0b\x76\x91\x07\x69\x38\x62\x71\xc1\xa6\x69\xce\x83\x70\x14\x5c\x24\x9c\x5d\xf0\x30\x98\x42\x48\x91\xb8\xa0\x71\x36\xe5\xb5\x6f\x90\x24\xf2\xf0\xb0\xb5\x05\x91\x88\x74\xfb\x5d\x76\x31\x2d\x55\x54\xe4\x28\x56\xd5\xc4\x56\x80\x75\xe3\x94\x45\xfc\x0b\x4f\xb2\x09\x18\x69\x18\x58\x78\xce\x87\xe2\x98\x18\x0f\xa1\xba\x81\xab\x28\xe3\x24\x61\x22\xbf\xcb\x22\x1e\x44\x2c\xcc\x22\xce\x78\x12\x8f\xe3\x14\x1d\x13\x5d\x05\x45\xda\x2a\xcd\x09\x25\x9b\xf0\x3c\x99\x33\x21\x47\xc6\x3c\xd2\x7d\xbc\xce\xd2\x16\x95\xdd\xd9\x98\x17\x45\x70\xc9\x7b\x0c\xde\x1e\xb3\xd7\xfc\xcb\x69\x96\x25\x05\xcb\x79\x12\x73\x31\x56\x16\x97\x3d\xf6\x32\x29\x32\x29\x38\x4e\x73\xae\x1a\x03\xcc\xc8\x06\x58\x94\x71\x01\x01\xcb\xc2\x70\x9a\x83\xce\xee\x4a\xc0\x8b\x91\x9c\x09\x06\xe1\x62\x33\x2e\xf1\x26\x1c\x30\xac\x9a\x0b\xd0\xbc\x56\x7b\xac\x45\xa0\xcb\x51\x9e\x5d\x81\xc8\x0c\x01\x7c\xdb\xad\xff\x33\xf8\x3f\x2d\x1d\xa7\xb1\xcc\xe7\x66\x32\xff\xce\xf3\x78\x38\x67\xe5\x28\x50\xe8\x8f\x38\x0b\x2e\xb2\x2f\x1c\x02\x7d\x5d\x70\x9e\x7a\xb0\xc7\x23\xd6\x7e\x7d\xf4\xa6\x15\x75\xb0\xc3\x25\xa9\xb2\xad\x7e\x48\x6b\xe6\x30\x80\x33\x07\xcf\x73\x42\x5e\x1a\x9d\xc8\xa6\x01\xf7\x79\x50\x8c\x10\xdb\x5d\x96\x0a\xac\x82\x51\xd7\xd5\x28\x30\x94\xf0\x2b\x57\x11\xfe\x70\xe2\x73\x0e\x72\x69\x9c\xe2\x49\xe3\x8a\xe3\x23\x3c\x44\xac\x18\x0c\xd6\x14\x67\xb5\x4c\x48\x4a\x80\x28\x01\x89\xbc\x7f\x7b\xf0\xa0\x76\x6d\x1c\x7a\xd7\x86\x00\xfd\xe8\x0d\xb2\x0a\x05\xca\x28\x98\x4c\x78\xca\x2e\x90\x44\x61\x00\xaf\x8f\xdf\xb3\x8b\x69\x1a\x25\x9c\xf1\x19\x0f\xa7\x25\x2f\x58\x91\xc1\x04\x3c\xb0\xc7\x1f\x06\xa9\x1a\xc5\x45\x10\x41\x10\xd5\x61\x1c\x22\xe9\x46\x53\x30\x5a\x8a\xd3\xdf\x39\x1e\x1a\x1e\x30\xc2\xa4\xc4\x10\x2a\x12\xa0\x8f\xe3\xee\x6d\xef\x83\xa1\x92\x36\x2b\x5f\xb2\xd6\xf3\x8e\x34\xfa\xb8\x6b\x7e\xff\x64\x7b\x6d\xe5\x5f\x51\xd6\xeb\xf5\x76\x9e\xee\x76\xda\xad\xab\xcf\x45\x4b\x2a\xe6\xa6\x10\x15\xd6\x6f\xdb\xb8\x2f\xcb\x9c\xcc\xc7\x17\x59\x83\x36\xb1\x87\x05\xb0\xf0\x2f\x27\x6f\x06\x27\xbf\xbd\x7f\x75\xfc\xce\x18\x49\xa9\x06\x28\x47\xb6\x55\x7f\x85\xcf\x5a\xd5\xc8\x23\xa9\x10\xaa\xa8\x99\x18\x8c\x91\xa8\xc4\xe8\xf7\x21\xd0\x35\x81\x63\x63\x43\x42\x40\x2a\x90\xec\x17\x0a\xbe\xbe\xc0\x46\xa7\xdd\xc2\xcf\x5e\x8b\x3d\x06\xc5\x4c\x47\x6e\xfa\x0a\xd4\x9e\x42\x30\xfc\x5b\x39\x50\x3c\xd9\x59\xd6\x52\x57\x59\xc7\x0b\xb2\x2d\x04\xff\xfe\x04\x17\xf8\x9f\x04\xf3\xfe\x94\x4e\x93\xe4\x93\x60\x7b\x9f\xf4\x56\xf8\x49\xdb\xf7\xc8\xd3\x97\xf8\x39\xe6\xe3\x0b\x9e\x1f\x0f\xd9\x00\x73\xe2\x34\xe4\x6c\xaf\xb7\xdd\xdb\x86\x6f\x1d\x04\xfb\x5d\x90\x5e\x52\xdb\xa0\x47\x37\xf2\x89\xd1\xe9\x88\xcb\x5f\x60\x1a\xc4\xc3\xcf\x3d\xdb\x36\xe8\x42\x45\x7d\xfd\x28\x53\x3e\x89\x5d\xe9\x93\x03\xb0\x80\x37\x2e\x46\x5d\x5c\x4a\x9f\x80\x2b\x7f\xc2\x96\xf8\x2c\x18\x4f\x12\x2e\x81\x1f\xf4\xc0\x9d\x0d\xbc\x4d\x15\x0b\xf5\x91\x58\xf3\x87\x3f\xa0\xd5\x82\x5d\x04\x0d\x58\x16\x14\xfa\x39\xf8\x99\x96\x80\x8e\x6d\x03\x26\xd9\x18\xba\xc7\xf9\xea\x04\xdf\x55\x97\x8e\xb0\x9e\x2b\x24\x08\x55\xab\x53\xbc\xbb\xf6\x22\x0d\x52\xb4\xb8\xa8\x59\x55\x4f\x95\xe2\xfc\xed\x9b\xe7\x83\xd7\xc7\xef\x07\xaf\xdf\xfc\xf8\xf6\xe7\x37\xb5\xda\xfa\x67\xb2\x78\x99\x7d\xc8\xe3\xb1\xf2\xdd\xee\x5d\xd6\xfb\x4a\xfd\x1f\x7d\x30\x7e\x43\x6d\xbb\x0f\x22\xe1\x0e\xeb\x96\xfd\xb3\x0e\x7b\xe1\xaf\x4d\xae\x4b\x98\x63\x4f\x72\xdc\x65\x1f\xba\xec\x65\x59\xe6\xf1\x85\x60\xfc\x38\x1d\x0a\x17\xed\x63\x60\xdc\xa0\x26\x37\xe3\x68\x7f\xe8\xa2\xe5\xe2\x01\x2d\x4a\xda\xd0\x4a\x66\x0b\x55\x1d\xb2\xcd\xab\x4b\xf8\x0f\x55\x00\xec\x7d\x58\x9c\xc8\xb6\x1e\x31\xb8\xd3\x63\x62\xbe\x65\xd3\xad\x4b\x5e\xb6\xc4\x56\x6a\x6a\x0a\x2e\xd2\x2a\x2a\xc9\x1d\x29\x7b\x9c\xce\x27\x5c\xca\x1e\x2f\x43\xb1\x83\x66\x79\x01\x41\x96\x8b\xe9\x44\x60\x96\x47\xdf\xb5\x34\xe4\x2d\xa0\xc4\x4a\x4b\xc7\x67\x1f\xce\xd9\x21\x49\xea\xe9\x97\x59\xea\xa9\x33\x72\x26\x87\x3a\x97\x79\x2a\x50\x4f\x9d\x9e\x47\x03\x0f\xe5\x39\xe7\x61\xdf\xbf\x1d\xee\x7d\xdf\x11\xed\xa9\x73\x2b\xda\x04\xb1\xca\x1b\x86\x27\x77\xf9\x20\xe0\x0e\xcc\xa3\x14\x8d\x97\x79\x90\x16\x49\x50\xf2\x93\x72\x0e\x0a\x18\x95\xf1\x32\x8d\xc7\x41\xc9\x95\xb3\x68\x62\x2a\x3f\x8c\x2f\x5f\xf1\x7f\xc6\x70\x6f\x6f\x27\x9f\x4c\xd0\x30\x9b\xde\x3a\xa0\x3e\x41\xb6\x56\x6b\xf1\xbf\xdd\x71\x4a\x36\x69\x1c\x64\x11\x5d\x85\x07\x45\xbd\xdd\xfc\x93\x3d\xf3\x9c\x60\x5a\xc6\x75\x5b\xf9\x0e\x29\xe6\x0c\xdd\x57\xfc\xf9\x93\x3d\x6f\xf1\x25\xc0\x46\x07\xcb\xdf\x42\x4b\x52\x33\x39\x12\x5f\x56\xf2\xc1\x83\x9a\x09\xb6\x0b\x63\xb2\x29\xec\x62\xca\x42\x85\xb1\x69\xab\x25\x36\x98\x11\x27\xf9\xc0\xa3\x61\xd0\x54\x61\xda\x74\x96\x57\xa3\xf5\xe1\xdd\x9a\xaf\x5d\xc4\x69\x04\xcf\x08\x2c\xe3\x35\xdd\x48\x2f\x6a\x7b\xfb\x7b\x18\x3c\x24\x56\x25\x64\x66\x3f\xbe\x7c\xfd\xf6\xe5\xcf\x78\x5f\x0e\xee\xc3\x21\x78\xb2\xd3\x6b\xc4\x2f\x73\xce\x4f\xb3\x8f\x41\x14\x07\x29\x0e\xb6\xa6\x28\xc4\x62\x4c\x4f\xb3\xd7\x50\x45\x16\xbd\xab\x41\xf0\x9a\x41\x4c\xb2\x24\xc8\x4f\xb3\x23\xe5\x41\x4b\x0f\xe7\xae\x3a\x0e\x6b\x3a\xbe\xe4\xe5\xfb\x60\xf6\x11\xe2\x61\xde\x79\xa7\x17\x35\x9d\x0e\xb3\x7c\x1c\x94\x2f\x67\x71\xf1\x3e\x98\x2c\x9a\xb9\x18\xaf\xdd\x5e\xe1\xab\x4f\x88\x4f\x57\x34\x4e\xe0\x25\x2f\x5f\xa6\x97\x09\x3f\x1e\x42\xe1\xc6\xb2\x12\x12\x2c\x7e\xc2\xc3\x32\xcb\xef\x78\xc6\xa3\x1a\x1c\xc4\xf8\x24\x58\xf5\x5a\xc1\x7d\x3c\x86\x7e\x1f\x6d\xe1\x73\xed\xc5\xcf\x30\xa5\xa7\xc7\x3a\x3e\xbe\x73\x37\xcd\x0f\x08\x57\xf1\x60\x21\x6d\x78\xed\xed\x36\xb5\x1a\x40\xf6\xc3\xfc\xba\xed\xe8\xd9\x6a\x8d\xef\x0e\x06\x10\x87\xb4\xb9\xf5\x5d\x78\x87\x27\x37\x4f\x74\xde\x6e\xc4\x61\x8c\x5c\x05\x91\xf8\x8c\x41\x0a\xdc\x49\x8b\xc9\xb7\x5f\xaf\xaa\xf7\x3a\xf6\xb5\xb1\x7a\xaf\x8a\xee\x5b\x94\xcd\x83\xb1\x73\x8f\xcf\x0f\x4c\x3b\xae\xf5\x03\x71\x6f\x40\xee\x0c\xed\xa7\x4d\xa8\x5e\xc0\x2a\x18\x70\x46\x54\xb4\x2e\xce\x2d\x3b\x04\x76\x03\xff\x29\x2f\xa8\x50\xee\x00\x64\x34\xb3\x07\x3b\xa2\x14\xbc\xd0\x82\x9b\x45\x75\x76\x02\xc0\x24\xb4\x72\x6b\xf6\x4b\x61\xa6\xea\x57\x25\x76\xc9\x08\x79\x15\xd3\x71\xe3\x2c\x9d\xa4\x5d\xe5\x71\x69\xbe\xc5\xb2\xd2\x6f\xff\xc9\x5b\x2e\xe9\xcf\xc2\x0c\x2b\xbb\xf8\x1d\x76\x7d\x39\xb1\xb8\xab\x28\xb3\xb4\x0f\x6f\xd9\x16\xdb\x79\xbe\xad\x9d\x6b\x5a\xbb\x89\xe5\x4d\x93\xe6\xb4\x21\x7c\xaf\x75\x70\x84\x14\xf6\xc8\x6d\x56\xf9\x17\x70\x36\x1f\xd2\xb2\x9d\x83\x2d\xbf\x4d\xb1\x9f\x6a\x0f\x2a\x87\x3d\x12\xed\xb3\x2d\xd5\x9f\xe9\xc9\xdd\x71\xac\xbb\x20\x27\xaf\x1d\xce\xba\x2c\x9c\x77\x19\xc6\x4d\xee\xb2\xea\xb8\xf0\xb4\x34\xeb\xb3\x70\xc6\x1e\x63\x6f\x61\x56\xb4\x37\x25\x1e\x1f\xa9\x2a\x8f\x54\x1b\x50\x7e\xde\x67\xe1\x5c\x95\x2f\xe2\xb4\xbe\x3c\x1a\x43\x12\x77\x50\x7a\xd7\x72\x5e\xdb\xeb\xf4\x36\xbc\x85\xef\xb2\x11\x8f\x2f\x47\xe4\x32\x4b\x5b\x47\xbb\xeb\x8e\xfd\xc0\x76\xe1\xd5\xbd\x5e\x69\xbb\x8e\x11\x10\x3c\xe3\x22\x99\x7d\x39\xec\x32\x9b\xf4\xd9\x76\x97\xe5\xa2\x27\xf8\x75\x91\x95\x65\x36\xee\xa3\xcf\xb4\xa1\x48\x7b\x20\xcd\x28\xa8\x0d\xe5\x38\x4e\xdb\xf0\x23\xb8\x90\xe0\xb2\x4d\x65\x53\xda\x13\xf5\xcc\x03\x72\x99\x08\x3d\x60\xaa\xf2\x88\x24\xea\xe2\x18\x49\xb9\x32\x9b\x54\xea\x22\x4c\xb2\x72\x87\x6d\xb1\xdd\x26\x4f\x0b\x56\xc8\x82\x2e\x9b\xe8\xe8\x9d\x16\x5a\xd1\x4b\x02\xf7\x47\x3b\x87\xeb\x3c\x30\x53\x78\x17\x94\xbc\x28\x31\xa1\xd6\x55\xc3\xfb\x60\xc2\x6a\x63\x20\xd4\x74\x21\x27\x53\x85\x52\xc7\xaf\x6c\xc8\xc0\x2d\xd0\x24\x40\x25\x36\x8c\xe7\xcb\xa5\xf2\xf5\x59\x0b\xc0\xa9\x27\xd6\x05\x2f\x14\xd5\x6f\x82\x1f\x85\x2c\x47\xca\xdc\xac\x8d\x98\x01\x2e\xdb\xe1\x9a\x58\xb4\x94\xd6\xc6\x67\x57\x3d\x1f\xd1\xc1\x6a\xa7\x12\x96\x88\x64\xc5\x56\xa5\x19\xea\xc6\x54\xa2\x4f\x3d\x63\x30\xde\x79\xbb\x06\x1c\xb3\x02\x90\xd2\x0e\x71\x3a\x7a\x38\x9f\xd2\x9e\x44\xce\xaa\xca\xc3\xcf\xae\x36\xd4\x0d\x72\x94\x95\x74\x01\x93\x64\x5c\x70\x47\x76\x11\x95\xa0\xfd\x3a\x87\xb3\xa5\xfc\xd3\x3a\x0e\x78\x2e\xc0\x01\xcf\x25\x2f\x3f\xf0\x3c\xe4\x29\xfa\xcf\x46\x3f\x3c\xd8\x8f\xe0\x51\x92\x36\x71\x80\x5b\x6c\x57\xdb\x37\x86\xf3\xfb\xe9\x73\xae\x16\x82\x5e\x10\xb4\xd7\x31\xe1\x51\xf5\xac\x49\xcd\x9a\x71\x89\x9b\xa6\x3c\xd7\x15\xef\x1e\x6a\xd2\x7e\xd7\xc0\xa8\xa2\xc9\x01\x8f\x9c\x96\xf7\x0a\x01\x69\xdf\x82\xc0\x20\xec\x11\xdb\xee\x3d\x27\x4e\x82\xdd\x40\x45\x92\xe2\x2d\x7f\xe8\x71\xd4\x14\x3f\xcd\xf2\xd1\x27\x5d\xd3\xcb\x56\xce\x62\xea\x99\x4f\x3b\x15\x23\xee\xd7\xcd\x9b\x1d\x19\xcf\x2d\x52\xf9\xea\x9b\x38\xec\x53\x2f\x59\xac\x47\x94\xcd\x9e\x90\xea\xc4\xec\x76\x07\xc3\x48\x4b\x5f\xf0\xf0\xbb\x63\x3f\xa4\xd0\x9c\x0b\xa3\x83\x88\xa5\x26\xb8\x43\x8b\x5a\x1f\xea\xb7\x35\x64\xbd\xea\x95\xea\x06\xe6\xac\x36\x8a\x0c\xb0\xbe\x55\x8b\xa0\xc8\xdc\x56\x1f\x63\x62\xc8\x58\xc4\x98\xb7\x29\x15\x2a\xbb\xab\x9d\x18\xb9\x41\x3b\xed\xe8\x63\xaa\xa2\x41\x8f\xe5\x4a\x05\x64\x74\x74\x70\x27\x23\xe2\x2c\x24\x66\xe7\x0c\x70\xf6\xf0\x9f\x40\xcd\xa4\x11\x20\x64\x74\xe3\x63\xb8\x2b\xa5\x10\x3b\x8a\x0e\xe9\xdf\x1f\x4c\x47\x46\x34\x71\x8a\x9a\x78\x35\x4e\xc4\x13\x19\x28\x5a\x3a\x7f\x42\x92\xc0\x41\xdf\x7e\x6c\x21\x8c\xcd\x13\xb8\x1d\x1d\x9c\x81\x4b\x2a\xb3\x32\x54\xdc\x86\xdb\xf7\xf3\x45\x71\x04\x2b\x3e\x91\xe9\xa4\x6b\x87\xc1\x42\xe4\x7e\x75\x43\xd0\xdb\x98\xbd\xd1\x0e\x2a\xb5\x2b\x70\x15\x53\xa0\xda\x96\xf4\x48\x64\xc8\x46\xd0\x67\x9f\x12\x6b\x4d\xbc\x7f\x7b\xc6\xac\x30\xfb\x5d\x16\x82\xc0\x2b\x64\xe3\x3e\xc8\xc7\x64\x21\xf4\x59\xdd\xaa\xb0\x7b\x25\xbb\x6a\x9f\xf9\x96\x67\x5f\xff\xd2\x0f\x83\xac\xa7\xb1\xcb\x86\x0f\x8b\xa3\xae\x41\x52\x35\x7c\x18\x70\x3e\xaf\xae\x85\x1e\x6f\x7c\x05\xda\x13\xf1\x8f\x38\x14\x80\xdf\x01\x48\x34\xc2\xc6\x6c\x07\xc2\x05\xc7\x69\xd9\x9b\x29\x14\xcf\x4d\xda\x5c\xb1\xf8\x19\x3c\x17\x27\x4d\x90\xe2\x95\xac\x39\x7a\x59\xa6\xb2\x74\xf1\x8f\xbc\x44\x61\x7a\x92\x5d\xb5\x67\x3b\x6c\x93\xcd\x76\xbb\x6c\xb7\xa3\x8e\x17\x22\x79\x2e\x92\xe7\x90\x6c\x3b\x97\xb5\x14\x46\xf6\x81\x82\x66\x41\x28\x8b\x2e\xc4\xac\xd8\x25\x43\x94\x61\x2c\x08\xc4\x2a\x45\x0f\x2f\x54\x85\x76\x85\xa0\x22\x8b\x85\x73\x93\x38\x37\x61\xcb\xd5\xbe\xeb\xc7\xf6\x57\x71\xca\x9a\x75\xc5\xd9\x69\x0e\x33\xc8\x24\x11\xe2\x61\x8a\x98\xcb\xc9\x86\xaa\xe1\xae\xc5\xca\x92\xa4\x28\xcb\xdc\x58\x4e\xe6\xc2\x4c\x74\xdf\x9e\xb1\x4d\x16\xce\xc4\x49\x01\x4b\xe9\x18\x03\xd6\x09\x53\x1e\x91\x03\x71\xdc\x0b\xb3\xc2\x74\x3f\x67\x3f\xb0\x50\x3b\x5a\x71\x2b\xed\x92\x43\xf0\xa6\x9d\xeb\x9a\xd2\xb9\xd0\xca\xf3\x67\xbf\xf9\x4c\xdc\xb5\x1b\xed\x3b\x10\x90\xd3\xa4\x4f\x09\x58\x95\xb8\x69\x36\xd0\xc1\x13\xcb\x21\xb8\x91\x8c\x21\xaf\x59\x32\xc6\x22\x15\xc9\x18\xea\x1c\x01\x05\x5a\xaf\xe1\x74\xe3\x5b\xec\xc9\x53\x23\xa5\xf1\x34\xaa\x14\xd6\x9d\xd8\x45\x9d\xb0\x27\xaa\xa3\xae\x6c\xc3\x12\xa3\xbe\x3e\xb0\x85\x7d\xca\x96\xd8\x26\x34\xf5\x48\x34\x8e\xe3\xaa\xb2\x29\x5a\xc6\x3e\xb6\x3b\x3a\x4f\x8a\x64\x27\x0b\x10\xbc\xd7\x65\x05\x7c\x55\x97\xda\x5e\x75\xad\xed\xf5\xcc\x12\x1a\x54\x97\xb4\xbb\x92\xdd\x65\x24\x7b\xea\x5a\x1b\x84\x68\xda\xa9\xd8\xcb\xad\xdd\x22\x50\x33\xea\x16\x0b\xac\x99\xb5\x45\x7a\xec\xcb\x92\xc3\x65\x73\xb6\xe0\x2d\xcb\x91\x44\xe3\x5d\x5e\x2d\x6e\xab\xe9\xeb\x6b\x05\xf8\x0f\xb4\xa9\x46\xaf\x92\xa4\x31\x78\x79\xe8\x06\x3d\xca\xa7\xb6\x07\xca\x41\xcd\x72\xf1\xac\x12\x07\xa7\xf6\x2a\xf1\x54\x58\xb0\x68\x7c\x35\x2a\x6b\x88\x14\x82\x5d\x43\xe5\xa9\x17\xcd\x24\xfb\x07\xdd\xba\xf6\x1b\x43\x72\x37\x0f\x05\x01\xeb\xa1\x7b\xea\xff\x95\x8c\xc8\xd7\xc2\x63\xbb\x05\xb2\x02\x6c\x7c\xb1\x1f\x0e\x29\x6e\x36\x36\xac\xcc\xbf\x1e\x32\x6b\x90\x62\xbe\x64\x33\xae\x97\x0c\x2a\x0a\x20\xee\xbb\xf5\xcc\x93\xf6\x71\x53\x31\x5f\x36\x5e\xf0\xed\x8b\xc2\x46\x3f\x17\x96\x85\xd2\x16\x1b\x95\xe5\xa4\xe8\x6f\x6d\x5d\xc6\xe5\x68\x7a\xd1\x0b\xb3\xf1\xd6\x3f\x93\x2c\xce\xb3\xf0\xf3\x56\x98\xe5\x7c\xf3\xf7\x62\x2b\x2e\x8a\x29\x2f\xb6\x9e\x3f\xfd\x4f\xf8\x15\x66\xe3\x31\x4f\xcb\xcd\x9d\x9d\xfd\x67\xfb\xdf\x6f\xef\x3e\xb7\xdf\xa4\x56\x0c\x0c\xa4\x95\xd8\x55\x9c\x46\xd9\x15\xbc\x66\x23\xd6\xbf\x1b\x1b\x32\xa3\x27\x18\x1f\x3b\x44\x06\xf8\x80\xb1\x17\xaa\x42\x5f\x35\x50\xf0\x64\xe8\xa9\x2e\x92\xad\xca\xec\x05\xa4\xa1\xb5\xa1\xf3\xac\x3b\xe5\xb3\x52\xbf\xed\x4e\xf9\xd5\xa6\xc0\xcf\x03\xc6\xfa\x4c\x7b\xca\x69\xa9\x45\x35\x12\x47\xa9\x76\xc7\x71\xa0\x78\xe9\x3a\x50\x84\x70\xba\x30\xf8\x5b\xbb\x50\x7c\xb2\xde\x53\x60\xb0\x0f\x0e\xd2\xcf\xad\x82\xbd\x7d\xf3\x1c\xee\x1b\xa4\x55\x6d\x3a\x77\x4c\x73\xaa\x66\x1f\xdf\x79\xed\x92\x76\xe8\x33\x01\x9f\xdb\x7d\x8f\xd0\xda\x0a\x5a\x82\x84\x6d\x07\x31\xf4\x1a\xed\x19\xdc\x4e\x74\x7a\x81\x98\xbd\x67\x07\xe8\xfb\xc5\xc1\xc4\x32\xcf\x74\x16\x5a\xd5\x95\x23\x2e\xf2\xce\x92\x20\xbd\x9c\x06\x97\xa8\x23\x3c\x6f\x0b\x1a\xef\x6f\x6d\x5d\x5d\x5d\xf5\x78\x38\x0e\x36\xc1\x16\x01\x6d\xa4\x83\xa4\x97\xe5\x97\x5b\x90\xbc\xfb\x74\x77\xeb\x59\x6f\x7b\xeb\x3f\x0b\x1e\x6e\x8a\x94\x22\xcc\xe3\x49\xb9\xa9\x5a\xdb\x14\xad\x15\x1d\x70\xde\x35\x64\x9f\x10\x21\x9f\x7a\xac\xcd\x7b\x97\x3d\x16\xe4\x79\x30\x27\xfe\x54\xc5\x79\x02\x4a\x14\x42\xe4\xbf\xe4\xa0\xa5\xfc\x94\xf2\x2b\x86\x0e\x6a\xdb\xdb\x9d\x4f\x62\x9d\x47\x98\x88\x9a\xc9\x76\xab\xd5\xf9\xd4\x59\xd6\x0c\x70\xbb\xb7\xf3\xad\xcd\x00\x83\x54\x8e\x6a\x39\x43\x40\x79\x08\xc5\x47\xcc\x35\x46\x7e\xb2\xcc\xd9\x4e\x97\xed\x76\xd9\x93\xf3\xc5\x45\x07\xbd\x34\xcb\x26\x8b\xcb\xb9\x26\x88\x5e\xdb\x41\x59\x96\x98\x0f\xc2\x29\xda\xf2\x02\xe8\xda\x65\x21\x22\xa5\x93\x31\x88\x13\x2b\xe3\xd9\x19\x87\x7a\xd7\xd7\x4c\xa7\x69\xa3\xd8\x4e\x9d\x15\x22\x02\x51\x5d\x15\xeb\xbd\x0e\x81\xad\x36\xe7\xfc\xa7\x26\x77\x01\xbb\xcf\xe1\xa6\x74\xeb\xd1\x23\xf6\x1a\xc2\xcc\x41\x15\x81\x84\x18\x9e\x3c\x7c\x12\xbc\xf4\x53\x4f\xeb\xbc\x73\xce\x4f\x04\x23\x3e\xb4\xd8\xb2\xe3\x4b\x10\xd2\x14\x6f\x56\x96\x90\x87\x4a\x29\xa1\x72\x64\xb7\xbf\x14\x3c\x62\x41\xc1\x02\x96\xab\x90\x64\x82\x48\xcb\x11\x57\x9b\x0a\xb6\xac\x61\xc8\xb3\x0c\x0e\x80\x66\x68\xd7\xd7\x06\xb0\xeb\xeb\x26\x5e\x5e\xc5\xbe\x68\xad\x82\xf9\xbd\xf5\xec\xb4\xef\xc9\xd5\xd7\xe9\x7c\x92\x5d\xe6\xc1\x64\x34\xaf\x7d\xbf\xb7\xfd\x07\x7b\xfb\x32\x20\xfe\xf1\x0e\xbf\xf6\x96\x36\xd5\x06\x01\xe6\x40\xee\xa8\x71\xc1\xae\xb2\xfc\x33\x3a\x25\xc8\xd2\x4d\x9c\x47\x21\xd7\xf0\x07\x62\xb3\x6f\x53\x53\x91\x07\xff\x41\x48\x4c\x6c\x6d\x40\x64\x68\x9b\xfa\x1f\x4e\x73\x43\xc6\xbf\x04\x09\xb0\xd1\x24\xc9\xae\x78\xc4\xda\x05\xe7\xec\xe8\xe4\x43\xe7\xc1\x7f\x80\x18\x61\x11\xef\x43\xd2\xf2\xc3\x4e\x1b\xdc\xa9\xb4\x77\xba\xa2\x8d\x4e\xfb\x21\xa6\x1e\x3c\x90\xd6\xad\x60\xdc\xea\xe9\x51\xac\x22\x29\x48\x99\xd5\x25\x20\xf8\x12\xc4\x89\x98\xf3\x07\xff\x11\x0f\xdb\xb6\x88\x26\x56\xea\x43\x5c\x73\x0f\x3b\x0f\xfe\x03\x40\xc3\x2c\x7c\x15\xb1\xc5\x2e\xe1\xf1\x06\x3e\x44\xb9\xe0\xd4\x43\xe1\xc5\xb4\x64\x69\x56\x8e\xe2\xf4\x52\x2c\xe2\x28\x63\xc1\x45\x36\x2d\x59\x5c\xf6\x7a\xbd\x07\xf8\x8e\x45\x8e\x8b\xd4\x8a\xd3\xa2\xe4\x41\x24\xf6\x55\x55\x19\x1f\x36\x15\x19\x8b\xcb\x56\x21\x2a\xf2\xa0\x88\x79\x2e\x1a\x45\x4f\x4f\xf2\xa5\x4b\x50\xf0\x1e\x8b\x87\xed\xef\xa4\xc3\x02\xf6\x95\xf5\x7a\x3d\x1f\x9b\xbd\xac\xae\xf2\xf5\x0c\xbd\xef\xcd\x62\x55\x7a\x8e\xae\x98\x98\xca\xb3\x43\x9d\xbb\x6a\x63\xaf\x29\x0b\x36\x79\xab\x56\x6d\xe9\x3a\x38\xe1\xbf\xc6\xe5\x28\x9b\x96\x12\xfa\x98\xd7\x76\xb6\xbf\xa8\x62\x53\xe7\x75\x7d\x75\xbc\x8f\x2f\xd1\x43\xe9\xab\x9c\x07\x9f\x41\x21\x59\x7c\xab\xf7\xb7\x17\xc1\x05\x4f\x3e\x24\xd3\xcb\x38\xfd\x31\xc9\xae\xe0\x7d\x93\x80\xf6\x54\x08\x82\x83\x49\x9e\x4d\xc4\xc2\x19\x18\xc8\x6a\x70\xb5\xdd\xe9\x65\x29\x3f\x1e\xb6\xcf\x5a\xb3\xa2\xd5\x65\xad\x62\x2c\xfe\x3f\x8e\xc4\xff\x13\xf0\x9c\x3b\x4b\x5a\x10\x6c\x69\x6b\x8b\x9d\x80\xfd\x38\x7b\x79\x72\xc4\x2e\xe6\x10\x4e\xa1\x27\xe4\xfc\xb2\x55\x48\x1b\xa9\x20\x2d\x61\x29\xbd\x2d\xc5\x32\x6c\x95\x62\x09\xaa\xeb\x78\xdc\x4a\xc5\x9a\x61\x60\x4b\x87\x32\x64\x90\x24\x73\xe5\xcf\x01\xa1\xef\x3d\x90\x96\x49\x05\x31\x71\x96\x9f\xcd\x50\x22\x90\xff\xcd\xf9\x44\x30\xc8\x31\x78\x1e\x19\x05\xa5\x90\x51\xa3\x38\x60\xe0\x85\x23\x4c\xa6\x45\xfc\x85\xab\x10\xf7\x47\x27\x27\x2a\x00\x08\xbe\xef\xea\xb9\xee\x67\xc9\xe4\xb6\x2f\xcc\x6f\x23\x90\x0d\x48\xea\x7f\x7d\x51\xf1\xd9\x49\x22\x1a\xcf\x6b\x25\x8d\x2e\xe2\xad\xe8\x18\x8c\x48\xc3\x98\xa2\xcf\x76\xb0\x7e\x31\xee\xb3\xa7\xdb\x52\x7b\x36\x8e\xfa\xec\x7b\xa5\x4a\x4b\x2e\xfb\x6c\x67\xf7\xb9\xfc\x9a\x25\x7d\xb6\xf3\xfd\x2e\xa8\xd0\x58\xdf\xd7\x97\x82\xc7\xca\x9a\xa6\x71\xe9\x40\x2f\x92\x54\x59\x99\xed\xa9\xe2\xc0\xdd\x9a\xcc\x5a\x6e\xb7\xb4\x21\x2b\x43\xba\xf0\xa2\x9d\x8a\xa4\xae\xed\xe1\xcb\x53\xc5\xe9\x74\xdf\xed\x91\xb6\x02\xfa\x7f\xf5\x0e\xbd\x8e\x31\x98\xb7\xdb\xa4\x99\x2e\x3b\xc3\x77\x12\x40\x7a\x62\x14\x40\x82\x25\x9f\xe0\xc2\xa0\xee\x2b\xa7\x13\xea\x1e\xfc\x0b\x09\xa7\x84\x2d\xa0\xfd\xd8\xf5\xb5\xa0\x6f\xcb\x4f\x63\x4b\x12\x69\x7b\x1c\xa7\x9b\x70\xc1\xdf\x6f\xb1\xc7\xb2\xf6\x63\x44\xfc\x63\xd6\xea\xb4\xb4\xaa\xc5\x5c\xab\x64\x57\xe9\xda\xbd\x06\x33\xd2\x2b\x9e\x39\xd8\x26\xa2\x7e\x8b\xed\x6c\x6f\x77\x16\x00\x21\xc3\xaa\x78\x5c\xc8\x69\xd5\xb4\xf2\xe3\x2f\xd6\xb2\x76\xa7\x4d\x3d\x32\x4a\xad\xb4\xb7\x9c\x71\x33\xb7\x04\xc2\x60\xc0\xc5\x99\xe9\xf5\xfc\x9c\x82\x0f\x67\x5b\x18\x67\xcb\x3b\x70\x59\x9d\x46\xb3\x3b\x3f\x6f\xc0\x46\xa7\x8a\x8e\x2c\x4d\xe6\xee\x9c\x7c\xe6\x73\xef\xd0\x3e\x43\x84\x7e\x75\xbf\x6d\x4a\x1d\xca\x72\x26\xd8\x4e\xc5\x31\xb9\x24\x37\xea\xf8\x5c\x85\xff\x90\xf3\x01\xa6\x90\xaa\x8c\x0d\x23\x46\x7b\xa9\x7a\xb3\x27\x34\xe3\xea\xf5\x60\xf1\xa8\x2d\xdc\x2c\x16\xac\x2e\x80\xed\xc3\xff\xbb\x0f\x0c\xa3\x93\xf6\x97\x32\x6d\x3a\xe9\xb3\xa9\x5c\x93\x82\x6e\xfb\xf0\x7f\xfc\x96\x20\xf7\xd5\x0f\x4c\x15\x98\xec\xc3\xff\xf1\x1b\x27\x0b\xff\xc1\x4b\x48\x58\xd9\xea\x59\x2c\x95\xa1\xd6\x7b\x8e\xf4\xe7\x08\x03\x72\xc9\xcb\x0f\xca\x10\xf7\xb8\xee\x4d\xdc\xf3\x9a\xe2\x4d\x0f\x62\xec\x92\xba\x81\x30\x09\x8a\xe2\x28\x48\x12\x50\x63\xd5\x89\x58\xdf\xd7\x94\x6f\x92\xac\x9c\x96\x4d\x0b\xe8\xe5\x5d\xe4\xd6\x46\x3b\xd9\xf6\x95\x6e\xec\x8c\x34\xaa\xeb\x4e\xb2\xa2\x88\x2f\x12\x7e\x64\xbc\x84\xa1\x4a\xa9\x3e\xca\xca\xe2\xba\x4d\x50\xd4\x77\xa8\xdb\x8d\xd3\x11\xcf\xe3\xb2\x7e\xe8\xd5\xa2\x4d\x3d\xea\xe6\xfe\x05\xe3\xc8\xfc\xa9\x64\x7d\x68\x53\x5a\xe3\xd7\xbd\x7d\xdd\x77\x0a\x36\x0d\x12\x4b\xd0\x53\xc4\x55\x5c\x8e\x8e\x65\x64\x31\x71\x8a\xd5\x5f\xaa\xd1\x1c\x7c\x5c\xd4\xcc\x9b\x21\x4c\x25\x37\xd7\x4a\xf8\x95\x92\x4d\x70\xea\x42\xb7\x71\xce\xb4\xb3\xf3\xe4\x6e\x9c\x33\xdd\x53\x14\x1e\x04\x0c\xdf\xbf\xd6\xe1\x69\x7f\x57\x73\x51\x5a\xd2\x6e\xfc\xd7\x38\x89\xc2\x20\x8f\xda\xba\xb5\x26\xdd\x91\x2e\x2d\x8f\x7c\xe0\xff\xd1\x77\xde\xb3\xcf\x83\xe4\xc5\x81\x80\x26\xe5\x57\xc7\x17\xbf\x83\x27\xb8\x03\xdd\x84\xd4\xf0\x5a\x8f\x42\xec\xe7\x11\x4b\xbf\xe4\x50\x2f\x26\x3a\x1d\xd9\x95\xf6\x36\x27\x7f\xe2\x0b\x0e\xcc\x23\x67\x5f\x80\xd4\xf8\x08\x3c\x46\xc0\x6f\xbe\xd1\x01\x58\x26\xbf\xf9\xc2\xd3\xd2\xac\x22\xb1\x8f\x86\xc1\xa4\x9c\xe6\xbc\x8f\x4a\x75\x21\x34\x4c\xc4\xe2\xfb\xa2\x52\xc0\x3b\xdd\x23\xe7\x36\x8c\x4d\x40\x07\xb5\x59\x4c\x72\x1e\x44\x42\x6e\x30\xc3\x18\xf3\xfc\x52\x01\x4f\xfb\x6b\xcb\xb8\x80\xd5\x30\x42\x92\x1d\x10\x01\xe9\xa6\xeb\x83\xb8\xab\x42\x0b\x3a\xa1\x80\x2e\x39\x16\x7b\x17\x17\x25\x4f\x79\xfe\x32\xbf\x2c\xda\xe0\xc8\xf2\x67\x70\x4b\x2b\xe6\xed\x22\x08\x3f\x9b\xfa\xfa\x34\x2a\x03\x64\x9c\x79\x4a\x83\x34\x27\xf2\xd1\xdd\xb8\xa2\xe0\x9e\x44\x0f\xc2\x24\x30\x2f\xd1\xd9\x57\xbf\x7a\x12\xa5\x34\x3a\x8d\x68\xc7\x06\x3a\x4b\xe5\x4b\xa5\x2e\x5b\x0c\x2a\xf8\xe9\x56\x00\x04\x51\x64\x0d\x57\xc9\xa3\xd8\x5c\x25\x5b\xb9\x9b\x94\x9d\xdd\x1e\x59\x6e\xfc\x53\x03\x48\x59\x06\xe1\x08\x5a\x23\x6e\x71\xde\xbe\x79\xfe\x98\x9d\x60\x19\x0b\x2e\x53\xba\xdd\xca\x52\x71\x7e\x20\xdd\xba\x97\x95\x60\xb1\x25\x41\xc1\x85\x27\xdf\x75\xd1\xf0\x85\x37\x36\x46\x87\xc3\x55\x51\x9a\xf3\x71\xf6\x85\x37\x61\xd5\x53\xe2\xfe\x10\x1b\xf1\xdb\x20\x96\x94\xf6\x20\x56\x75\xeb\x41\xd8\x30\xcb\xdf\x04\xe1\x48\x01\xac\xde\x37\xc4\x25\xcf\x83\x92\x93\x4b\xb4\x70\x14\x27\x51\x0e\x81\x83\xa4\x29\xbe\x4c\x50\xda\x02\xed\xac\x18\xb3\x25\x4a\x94\x55\x89\x00\x06\x5c\xcc\x2d\xaf\x4f\x90\xa0\x9c\xb5\x54\x4f\xad\x2e\x6b\x61\xb3\x5a\x8b\xe0\x0b\x41\x66\xfa\xea\xf4\xe4\xf0\xda\x3e\xf7\x34\x38\xff\xe2\xbb\x57\x4c\x2f\x30\xee\x95\x68\x6f\x17\x83\x5a\xb5\x88\x23\x31\xea\x89\xcc\x32\x75\x16\x30\xb2\x43\x32\x3c\x74\x5b\x43\x2c\x78\x9d\x08\x64\xd9\x64\xe5\x08\x64\xd9\x84\x1c\xfa\xd5\x35\xa3\x72\x53\x4d\x03\x80\xd1\x52\x24\x98\x5f\x59\x0d\x42\x46\x4c\xe5\xbf\xd3\x2d\x6e\x6c\x80\xef\x77\x59\x66\x21\x0a\x24\xa7\x93\x5e\xa2\x25\x2a\xdb\x9b\xcf\x3a\xbd\x32\x7b\x97\x5d\xe9\xa0\x73\xd0\xb3\x2c\x4c\x40\xd4\x64\x6a\x37\x20\xe6\x62\xd7\x69\x02\x2b\xd1\x0a\xaa\xef\x17\x26\xd5\x9e\x4b\x93\xac\x55\x02\xcf\x3a\xac\x6f\xd2\x09\x06\x14\x02\x88\xb5\xbf\x5c\x05\x74\x09\x8b\x79\xe8\xe1\xa5\x45\x2e\xbf\xcc\x8e\xc4\xaa\xf6\xf2\x75\x6d\x74\xeb\x37\xc9\xaf\x66\x43\x56\x03\xbc\xe9\x50\x6f\xb1\xce\xde\x47\x04\xe1\xb6\x86\xcc\x62\x74\x6b\x86\xc4\xca\xd4\xde\xdb\x02\x01\x7b\x13\x86\xb2\x99\x48\x9e\xd1\x67\x27\xe8\x40\xec\x82\x9b\xc8\xd0\x7a\x4b\x8c\x2d\xf8\xea\x02\x16\x22\xb6\x24\xf0\x7d\xf5\x43\xaa\x33\xb0\x6a\x7f\xb1\x54\x21\x8d\x1f\x51\xdc\xb1\x18\xb1\xe5\xa1\x6a\xe0\x78\xdc\x84\x51\xeb\xa3\xa2\x19\xb6\xd5\x42\x97\x0d\xa8\x67\x49\xaa\x15\xb2\xca\xe9\xbd\x0b\x5a\x75\xce\xfa\x24\xca\x18\x78\x7e\xb6\x77\x1b\x4b\x59\x07\xd5\xeb\x8f\xd0\x6e\x4b\x36\xb0\xbd\xc1\x00\x24\xd8\xc1\x00\xee\x19\x45\x53\x8e\x9a\xa3\x66\x94\x9d\x4e\x8d\x67\x6a\xa3\x0c\xc3\x71\x11\x9d\x42\x2d\xc2\xce\xb4\x92\xab\xcf\x5a\xa1\x42\xde\xeb\x38\x7a\x9f\x4d\xd3\xb2\x45\x54\x5e\xe4\x7a\xba\x52\x8e\x08\x03\x02\x28\x21\xdb\xa8\x2e\x8a\x36\x5d\x15\xea\xb1\x01\xf6\x87\x4e\xed\xf4\x94\xa1\x03\xd5\x9a\x3e\xbd\x65\xdb\x15\x8f\xaa\xcb\xf9\x54\x05\x20\xbd\x8e\x55\xbd\x70\xea\xf1\xfe\x1a\x27\x49\x23\x94\x9e\x92\x2e\x6e\x50\x42\x59\x06\x3d\x14\xcd\xcb\xf5\xaa\x0b\xae\x38\x21\x36\xf8\xe9\x78\x19\x1a\x20\x45\x57\x1f\x2a\x85\xaf\xa6\x43\x7b\x08\xce\xf0\xc4\x7a\x30\xb9\x59\x5a\xdf\x93\x03\x53\x4d\x67\x15\xc8\x9b\xfb\x1b\x0e\x1b\x86\x66\x95\xad\x1b\x9c\x3b\x80\xe3\xfc\x78\x38\xb4\xbd\xf2\x6b\xe1\xcd\x50\xaf\x94\xe0\x50\xce\x52\x7b\xa4\x76\xac\xa0\x5f\x52\xc1\x1e\x8e\xef\x7c\x45\x75\x55\x47\x65\x13\x73\x4b\xd5\x07\x09\x83\x6b\x3b\xec\x37\xcd\xa0\x81\xc2\x19\xd6\x38\x27\x0e\xf4\x4d\xc3\xae\xe0\x4a\x97\x9d\x1c\x62\xef\x22\x4e\x23\x30\x1c\xeb\xaa\xb6\x3b\x1d\xe7\x71\x9b\x6f\x12\xd3\x88\xe7\xb5\x73\x27\x32\xdb\x15\x8e\x40\xd0\xa6\x05\xe5\xeb\x6b\x1d\xb7\x52\x76\x74\x4e\x8f\x83\x16\xb3\x3c\x78\x70\xd3\x46\xed\x55\xcf\xda\x65\x6c\xae\x4e\x15\x57\xcb\x6e\xe9\xe8\x02\xf8\x91\x00\xe2\x11\xfb\x2d\x9b\x82\xb1\x87\x0a\x4c\x19\xb0\x22\x06\x7b\x64\x00\x9a\x95\x59\x06\x8e\x46\xc1\x13\xb0\x1a\x47\x9f\xaa\xc1\x14\x9b\xeb\x49\x7c\x76\x69\xeb\xa7\x23\xce\x5e\x1f\xbf\x57\x13\x5d\x66\x0c\x45\x04\x56\x92\x66\x31\xd3\xdf\x28\xdc\xab\x8b\xb4\xf6\x99\x37\x5b\x1a\x2b\xfa\xf2\x90\xa0\xce\x3b\xbd\xb8\x90\xba\x93\xe8\xc1\x0d\xeb\xb3\xaf\x37\x3e\xff\x4c\x0e\xee\xef\xde\x35\xe8\xde\x32\xee\xd3\x16\x9a\xc0\xe2\x80\x37\x93\xf8\x33\xef\xb1\x97\xf2\x86\xd2\x4e\x17\x35\xc0\x40\x20\xcd\x4a\xe9\x88\xf2\x01\x38\x73\x88\xc0\x25\x6e\xc0\x3e\xe1\xea\xfb\x24\x9f\xaa\xb1\x6c\xa8\xcd\x81\xfe\xcc\x2e\x2a\xc9\x10\x6f\x63\x9d\xfa\x2e\xfe\xcc\x97\xb1\x50\x85\x72\xcb\x5b\xa9\x42\xf1\xaa\xa5\xaa\xb2\x41\xf5\x14\xbe\x85\xb9\x2a\x94\xaf\xf3\x78\x49\xec\x52\xa9\xfd\x2a\xb3\x8e\x7b\x4d\x76\xa8\xa2\xf5\xaa\xad\xd4\x9f\x32\xf8\xe9\xab\x69\x59\x66\xe9\xab\xa0\xa8\x8d\x9e\xb0\xb7\xfb\x07\x5b\x44\x1a\x10\xff\x04\x16\x91\xcb\x3c\x0d\x69\x36\x28\xbe\x08\x0a\xfe\xb6\x68\xba\xa7\xd8\xdd\xde\xeb\x18\x97\x25\x1f\x78\x3e\xcc\xf2\xb1\xe0\x2b\x11\xe7\x13\x10\xd4\x82\x3c\x2e\x8c\x35\x03\x2b\xaf\x32\x65\xaf\x53\x66\x2c\xe2\x25\xcf\xc7\x71\xaa\x5c\x9e\xcf\x59\x90\x83\x59\xbf\xe8\xe0\x4b\x90\xa0\x7b\x74\x68\xfb\xd1\xa3\x9f\xb3\x92\xf7\x1f\x3d\x42\xa3\x47\x19\x29\x44\x5f\x2c\xc8\xae\x20\xf8\x3d\x1a\xe7\xc3\xbf\xec\x62\x3a\x1c\xf2\xbc\xe8\x32\xc9\x57\x0a\x08\xc8\x0d\x21\x38\xb4\xc9\x3e\xf8\xcb\x36\x9f\xe3\x00\x64\x73\xb0\xdc\x2f\xba\xda\xf8\xbf\x6a\xe2\x2f\x5a\x2a\x78\x09\x6f\x86\x45\xd7\xe2\x07\xf8\x1b\x2e\xd0\xd8\x5f\xac\xc8\x48\xc2\xd3\xab\xb4\x23\x86\x2a\xc1\xe6\x91\x68\x0a\x0d\xa8\xe2\x1c\x43\x6e\x09\x86\x2d\x0f\x9d\x3c\xa2\xbe\x96\xa4\x73\xf7\x32\xe6\x45\x4f\x1b\x90\x16\xd0\xe1\xeb\xe3\xf7\xa2\xa1\x34\x8b\xb8\xdd\x3c\x18\x97\xa1\x69\x2b\x17\xb3\x19\x97\xf3\x2e\x8b\x7b\xbc\xc7\x3e\x1d\x1e\x1e\x2e\xef\x8c\x78\xf5\x57\x08\x08\x48\xcf\x29\x89\x26\x44\xe0\x2a\x06\x7e\xf9\xcb\x2f\xb3\x37\x94\xaa\x37\x1c\xb8\xa1\x9f\xc5\xdb\x03\x38\xd8\x50\xda\xb2\xaf\xac\x15\xb4\xfa\x6c\x07\x5e\xe0\xca\x3c\x69\xe7\x64\x67\x29\xa6\x0e\xab\xa3\xad\x64\x0f\x65\x39\xe1\xdb\x2f\x32\x63\x1b\x0f\xc5\x16\xb1\x7f\x6c\x59\xfa\xda\xc2\x86\xe9\x06\x40\x16\xa7\x5d\xa8\x8e\xe1\x43\xd1\x2a\xaf\x6f\x7c\x97\x74\x37\xae\x26\x97\x77\x6e\x37\x28\xf2\x70\x70\x11\x17\x3c\x2c\xeb\x5d\xe7\x41\xb8\x42\xd2\x7c\xce\xef\xcb\x31\xe2\xd2\xa0\x42\x88\xe7\x3a\xcf\x89\x1a\x3e\x2c\xfd\x11\xfc\xd2\x78\xbd\x20\x3a\x25\xdf\xf1\x61\xe9\xb8\x3f\xbc\x85\x5b\x3e\x01\x5f\x50\x84\x1c\x50\x52\x8b\xcd\xe7\x3b\x77\x8d\xcc\x3a\xc7\xa0\xb7\x01\xd6\xc6\xe7\x0a\x6e\x03\xcd\xe4\x64\x79\x3d\x25\xc1\x13\x8a\x3b\x1d\x7c\x9d\x5f\xcf\x5b\x00\xbb\xde\xd8\x9f\x60\x73\x61\x9e\x15\xf5\x1e\x13\x9f\x3f\xdd\x6d\xa6\x54\xa8\xbe\x22\xe9\xed\x21\x04\x11\x5f\x4c\x7b\x4f\x9f\x34\x83\x61\xda\x58\x11\x96\x7d\x05\xcb\x97\x18\x8c\x91\x1b\x48\x61\x01\x46\x74\x13\x2b\x42\xf2\x14\x21\x01\x53\xbf\x06\xde\x06\x21\xfc\x1b\xc0\xc0\xfa\x2b\xc2\xf0\x0c\x61\x18\xc5\x45\x99\x5d\xe6\xc1\xb8\x61\x62\x16\x80\xa1\x9b\x58\x11\x92\xe7\x08\x49\x39\xca\x79\x31\xca\x92\x68\x30\xcc\x39\x8f\xc6\x41\xfa\x3a\x0e\xc2\x2c\x8d\x9b\x48\xf7\x59\x33\x68\xba\xcd\x1f\x9d\x26\x57\x04\xf5\x7b\x17\xd4\x22\xcc\xca\xfa\x19\x7c\x0e\x61\xd5\x96\x81\xef\x44\xb4\xb3\x2a\x7b\xdf\xae\x40\x55\x4e\xf3\x4b\x5e\x8f\xb7\x27\xcb\xc3\x85\x2d\xad\x0a\x99\x64\xe6\xe3\x60\xd6\x80\xa3\xef\x9b\x61\x19\x07\xb3\x55\xbb\x97\xec\x74\xcc\x83\xfa\xc5\xfe\xfc\xd9\xf6\x82\xfe\x79\xb0\xea\x3a\xdf\x79\xa2\x00\x88\xe2\x46\x10\x76\x16\x81\x40\x3c\x63\xdf\x1a\x88\x3d\x05\x44\x7e\xc9\x1b\x60\x58\xc0\xf3\xa0\xfa\xaa\x20\x48\xd6\x3b\x8e\x9b\x98\xee\x22\x3a\x88\x57\xc6\x80\xe4\xb7\x93\x20\xce\x9b\x16\xc5\x82\x59\x80\xea\xab\x82\x20\xd9\xed\x84\xe7\xe3\x69\xd9\x34\x0d\x0b\x76\x41\xd9\xc0\xaa\x60\x48\x5e\xfb\x8f\x69\x90\x96\x71\x52\x0f\xc7\x2e\x44\x09\xba\x53\x69\xa8\xce\xd9\xf6\x6d\xa0\x5d\x4f\x1c\xda\x91\xec\x1b\xdc\xb2\x35\xd0\xc1\xd3\xbb\x1e\x7a\x9d\x67\xf9\xa5\x41\x5d\x53\x04\x96\x1b\x44\x11\x36\x32\xa1\x05\xdb\xbc\xa8\xbd\x22\xd9\xed\xca\x7d\xa0\x18\x4d\x87\xc3\x06\xaa\x7b\xfe\x6c\x7f\x01\x0c\xd8\xc0\xaa\x60\xc8\xfd\xa0\x98\x36\x48\x3b\xcf\x9e\x2e\x00\x61\xba\xaa\x9c\xb3\x2b\x77\x03\x70\x77\xd7\x40\x7e\xcf\xee\x9a\xfc\x46\xb7\x3f\x87\xd8\xa0\xfa\xc9\x6f\x7d\xc0\x86\xeb\x03\x76\x71\x2f\x80\x5d\xae\x0f\x58\xb8\xce\x82\x95\x5b\x36\x44\x0f\x99\x64\x45\x03\xb3\x5a\x24\xbd\xe8\x26\x56\x25\x5a\xb9\x75\x83\x5f\x88\x34\x6c\x62\x9b\x0b\x76\x2e\xd5\xc2\xaa\x80\xc8\x4d\xfc\x9f\xf1\xa4\x61\xf1\x2e\x38\x0f\xfc\x33\x9e\x80\xf5\x71\xd3\x9f\xad\x11\x6b\xf4\x4f\xf3\xe7\x08\xbe\x52\xb7\xb1\x46\xd2\x6f\xf5\x09\x0f\xb3\x34\xfa\x66\x51\x4b\x54\xb7\xef\xe3\x74\x5a\xf2\x6f\x16\xb7\x44\x75\xfb\xb7\x6c\x5a\x0d\xd8\x71\x5f\x6a\x2c\xd5\xe9\xeb\x60\x7e\xe7\x7d\xd6\x09\x0d\xaa\xcf\x5f\x39\xff\x8c\x9d\x82\xc5\xbe\x35\xd9\xec\x90\xed\xf0\x27\x76\x0e\xce\x07\x3b\x64\x4f\xf9\x9e\x9d\x23\x50\xc6\x0e\xd9\x93\xa7\x7c\xdf\xce\x78\x1d\xcc\xd9\x21\x7b\xfe\x74\xcf\xcd\x10\x7d\x8b\x96\xb6\xf7\x9e\x8b\x2c\x77\xd1\xdc\x65\x70\x63\x73\xed\x9d\x4d\xe6\xe8\x62\xbf\x1d\x76\xd8\xee\xf6\xce\x93\xcd\x49\xce\x0b\x50\xeb\xff\x18\x84\xfc\x22\xcb\x3e\x77\xd9\xdb\x34\x54\x37\x18\x70\x37\x24\x63\x74\x40\x94\xd7\xb8\x60\x49\x1c\xf2\x54\xb0\x86\x69\x1a\xf1\x1c\x6e\x0a\xde\xbf\x3d\x55\xc9\x6c\x98\x4d\xd3\x48\xba\xa5\x17\x4d\xbc\x7b\x7b\xf4\xe6\xe7\x93\x37\x6c\x18\x27\x5c\x79\xab\x07\x2f\x34\x51\x9c\x83\x86\x6e\xce\xb2\x21\x3a\xa4\x90\x1d\x95\x39\xe7\x0a\x80\x07\xce\x4b\x87\xe0\x33\x7f\x33\x9e\x94\x73\xed\xe9\x23\xc8\x2f\x2d\x35\x7e\xd5\xaa\xdd\xbc\x07\x38\xd0\x16\x8b\x12\x1f\xa7\x56\x2c\xe2\x20\x0c\xf9\xa4\xc4\xab\x9f\x28\x2e\xc2\x20\x8f\x0a\x16\xa7\x93\x69\x59\x1c\xb0\xb8\x84\x1b\xfe\x34\x63\x45\x1c\x71\xc6\x87\x43\x1e\x96\x45\x0f\x9b\x40\x57\xf9\x93\x3c\x1e\x07\x79\x9c\xcc\xd9\xb4\xe0\xc3\x69\xc2\xe2\x28\xce\xc6\x96\x0f\x81\xec\x0b\xcf\xf3\x38\x82\x7b\x27\xdd\x2f\x4f\x23\x7c\xc7\xcd\xae\x46\x71\x38\x02\x83\x82\xe4\x2a\x98\x17\x2c\xe5\x3c\x62\x65\x06\x4e\x0a\x82\x04\x7c\x8e\x74\x19\x5e\x1d\xfd\x3f\x27\x2c\x09\xc2\xcf\x05\x0b\xe0\xc6\x7a\x53\xe4\x63\x87\x2c\x48\x02\x76\x94\x85\x59\xd0\xd3\xee\xf6\x39\xc5\x19\xb5\xce\xb4\x32\x04\xca\x20\x86\x37\x4d\xec\x95\xa3\xa0\x54\x17\x44\x87\xd5\x19\x38\xa8\x2f\xfe\x23\xc4\x1f\xf6\xd4\x69\xc3\x05\x4d\xa7\xa1\xea\x69\x3e\xf5\xd7\x94\xf1\x0e\x6b\x2b\xfe\x3c\x4d\x12\x6f\x45\x69\x22\x50\xdf\xe3\x28\xb6\x23\xab\x5a\x64\x25\x5d\xd4\x34\xd4\x7f\x29\x8d\x37\xad\x36\x5c\xea\x04\x22\xbc\xf1\xb9\x52\xe2\x36\x4e\x6d\x6e\xb0\xbf\x7e\xe8\x5b\x08\x69\xe9\x15\x3a\x76\x25\xfb\x43\x23\xd3\xd7\xbc\x08\xeb\x44\x83\xe7\x9d\x83\x2a\xe0\xf5\x21\x30\x0d\x1a\xd4\x75\x9e\x15\x31\xe7\x01\x89\x3e\xd9\x1b\xda\x65\x0c\x2c\xed\x1d\x55\x03\x1c\xf6\xf4\x97\x68\x15\xd3\xed\x40\x38\xa6\xb3\x4c\xfa\x0b\xab\x46\x87\xdc\x5f\xda\xe7\x51\x43\x3c\xde\xb8\xb4\xe9\x06\xad\x48\xa4\x03\x0a\xed\xe7\xeb\x85\x48\xf9\x4e\xc6\x57\x35\x6e\x1a\x55\x31\xf2\x62\xc0\x03\xe6\xfa\x21\x56\xc9\x73\x06\xef\xf4\x3d\x97\x3e\x4d\xd3\xec\xaa\xce\x36\xe4\xc9\xb6\x2c\x53\x66\xe8\x94\xaf\xd6\x47\xda\x13\xe5\x23\x0d\x82\x7e\xea\x00\xe7\x61\x96\x16\x65\x90\x0a\x1e\x2a\x99\xd4\x8f\xbf\xfc\x7c\x34\x78\xf3\xf1\xe3\xf1\xc7\xc1\xe9\x9b\xff\x39\x65\x87\xac\xf5\x66\x36\xe1\x61\xc9\x23\x16\x30\xfa\x8a\x62\xeb\x11\x7b\x35\x8d\x93\x72\x33\x4e\x95\xe5\x82\xf6\xd0\x54\x00\xa3\x2d\x47\x42\x5e\xbf\x8a\xcb\x11\x86\x47\x09\xc6\x32\x56\x49\x50\xc8\x0b\xe8\x4f\x18\x91\xe0\x93\x6c\xc0\x80\x91\x06\x65\xfc\x85\xbf\x0f\x66\xda\xa3\x70\x20\x9d\xf1\xca\x1c\xcb\xd7\x30\x09\x30\x03\x34\x8b\xc6\x1a\x17\xd9\x34\x0d\x79\x64\xe8\x02\xdc\xbc\x44\x3c\x11\x5c\x3d\x4e\xbf\x64\x9f\xe3\xf4\x92\x7d\x12\xd9\x9f\xd8\x34\x2d\xe3\x84\x05\xc3\x52\x40\x75\x15\xc4\x25\xd8\x94\x8d\xe3\x24\x89\x0b\x10\x45\x0a\x36\x0a\xbe\x70\xc6\x93\x60\x02\x7e\x69\x60\x03\x10\xc3\x4a\x82\xa2\x64\x65\x3c\xc6\x2f\x4f\xb7\x57\x01\xec\x4c\xd0\x23\x8f\x7a\x60\x1a\xe0\x29\x16\x66\x63\x5e\x20\xb6\x02\xf6\x29\x14\x47\x8c\x44\x21\x06\xcc\x07\x20\x05\x2c\x3d\xc4\x10\x78\xa4\x40\x17\x0d\xa3\x5b\x1a\xdc\x36\x03\xf6\x69\x98\x4c\x0d\x56\x45\xe5\x78\x0c\xba\xd7\x92\x43\xa8\x7e\x01\x88\x80\x76\x0c\xa6\x03\x1f\xa4\x65\xe4\x27\xf9\xa6\xe0\x13\x54\x48\xa3\x38\x0c\x4a\xce\xae\x46\x1c\xa7\x0a\x3b\x2b\xf4\xbb\x07\x39\x1e\x96\x69\x29\x23\xe1\x01\x5c\x6b\x05\x69\xb4\x25\xa6\x3f\x0f\xe2\x44\x7c\xf3\xe8\x92\xa3\x7c\xc1\x25\x6e\x01\x5f\xd9\xb4\x44\x64\xa8\x71\x14\xaa\x4d\xd1\x98\x26\x1b\xc0\xaf\xb6\xca\x57\x76\x9c\x91\x72\xb1\x57\xc5\x64\x8f\x9d\x4c\x2f\x0a\xfe\x8f\xa9\x8c\xc3\x23\x76\xe5\xa2\xbe\xb8\xd9\x5d\x38\x31\x18\xd4\x3d\x23\x70\x6a\x02\x95\xfb\x1f\xd7\x7e\xe7\xed\x90\x7d\x92\xc3\xff\x84\x4e\x31\xd5\xe8\x3f\xe9\x67\x21\x41\xce\xa5\x71\x47\xd7\x0c\x99\x50\x86\xc4\xa4\x1f\x6f\x12\x61\xe0\xe2\x42\xd9\x86\x54\xc7\x02\xad\x69\x34\xb2\x71\x96\x8b\x79\x0e\x52\x96\x09\x6a\x95\x41\xe9\x3d\xd3\x20\xc7\x23\x46\x81\x19\x71\xc1\x3e\x6d\xcb\x91\xe8\x71\x89\x44\x34\x39\xe9\x56\x69\x4f\xe4\x46\x62\xfd\x4b\xcb\x1f\x5c\x50\x12\xeb\x29\x9f\x95\x10\x1e\x41\x48\x4e\xe3\x38\x81\x50\xd0\xec\x53\xc1\xcb\x53\x84\xe0\x93\x22\x7c\x3d\xce\xa1\x00\x40\x01\x76\xc2\x39\x3b\x7b\x1d\x7c\x89\x23\x76\x94\xe5\x17\x41\x38\xca\x5a\x02\xa1\x65\x1c\x26\xd2\x41\x6a\xd1\xdf\xda\x0a\x8b\x62\x53\xc8\xdb\x9f\x0b\x70\x04\x2c\xf1\x13\xa7\x97\x9b\xe5\x28\xcf\xca\x52\x60\x75\x93\xcf\x26\x49\x10\xa7\x3c\xda\x94\x26\x33\xc5\x16\xf8\x44\x15\x1c\x2b\xe2\x65\x10\x27\x05\x88\x88\x88\xe2\x78\xa8\x59\x9a\x32\xf7\xfa\x34\xe8\x29\xcc\x4b\x0c\x0d\x7a\xb2\x7d\xbe\x96\xd9\xd1\x8f\x64\x16\x95\x41\x91\x4a\xbb\x81\x39\x86\xe5\x62\xf8\x59\xa6\x49\xc0\x32\x42\x42\x33\xaf\x1b\x76\x26\xe6\xf2\x70\xfb\x1c\x83\x44\xe1\x06\x91\x0d\x6d\xa6\x06\x6d\x24\xc1\xdc\x6a\x40\x85\x8d\x3a\x93\xa4\x7b\xf8\xf5\x06\x1b\x51\xa4\x2c\x1d\x5a\xd2\x3a\xda\x8e\x49\x55\xea\x49\xba\x39\x04\x92\x39\x17\x65\xd9\x09\xbc\x95\x9a\x1b\xee\x2b\x49\x5e\x71\x0e\x0f\xc5\xfb\x47\xa6\xfa\x18\x07\xb3\x5f\x83\xb8\xc4\xd6\x05\x84\xe3\x60\x16\x8f\xa7\x63\x64\xc8\x86\xb1\x28\x87\x85\x28\xc7\x2b\x06\x7a\xc1\x87\x62\x85\x80\x31\xb1\x62\xcf\xcd\x63\x52\x6b\xf3\x50\xac\xe3\xe6\x31\x35\x2d\x63\xc7\x06\xcc\x4c\xb2\x92\xf1\x71\xd1\x5c\xf9\xb8\x9b\xc7\xda\x6b\x6b\x8b\xbd\x84\x07\x66\x61\x56\x94\xc9\x5c\x70\x3c\x08\xb3\x06\x73\x85\x4e\xc5\x89\x1f\xc5\x22\xfe\x27\x47\x2e\xc1\x86\xc9\x74\x06\x0d\xfe\xfe\xff\x4e\x79\x3e\x6f\x63\x89\x4e\x0f\x5d\x8f\x8a\x82\xad\x2e\x33\xe4\xde\x56\x0d\xf3\x77\xc1\x3c\x9b\x96\x5d\xb6\xb3\xbf\x0d\xef\x0b\x14\x18\x6f\x71\x6f\xf9\x54\xf0\x34\x7a\x1f\xc4\xc9\x27\xb1\x7f\xa4\x2c\x4c\xe2\xf0\x33\x8f\xba\xcc\x2c\x49\x56\x68\x26\x8d\x1c\x9a\xc2\xa1\x9e\x2e\x00\x20\x50\xd9\x86\x43\x35\xdf\x65\x4f\xb6\xb7\xc1\xe6\xf5\x11\x63\xac\x25\xc9\xa8\xa5\xad\x5e\x21\x55\x4d\x44\xab\xaf\x6d\xd2\xe4\xe3\x42\x05\xf5\x9b\xb4\x98\x0a\xe6\x7c\x11\x94\xe1\xe8\x5d\x76\x49\xf7\x22\x64\x9d\x28\x18\xec\x30\x5c\x36\x62\x36\xcd\xcc\x18\xe8\xd1\xe5\x80\x4a\x3f\xa4\x10\xab\xa6\xbb\x6c\x77\x5f\x40\xcc\x5a\x92\x74\x5b\x7d\xb6\xb3\xbd\xbd\xcd\xa4\x01\xf7\x17\x1a\x8f\x53\x50\x00\xd8\xed\x9f\x40\x4a\xbb\xb5\x55\x94\x39\x0f\xc6\x2d\x2c\x2b\x91\x25\xe3\x72\x02\xae\xa4\x60\xd7\xea\x1a\x38\xe8\x40\x8f\x40\x86\xb0\xc9\xd3\x00\x6c\x6f\x70\x3e\x9a\x98\x64\x13\xc1\xd7\xac\xf6\x7b\x28\x98\x40\x37\xc4\xd6\x4f\x8f\x5c\xa4\x74\x99\x60\x45\x1e\x47\x04\x62\x8b\x7d\x99\x5f\x6a\x37\x73\xe2\x5b\x1c\x02\xd5\xb7\x44\x92\x89\x9b\x03\xb1\x67\xd4\xdb\xa1\x78\xcc\xf3\xb7\x11\xad\x7b\x14\x24\x89\xd8\x52\x68\x1a\xd2\xa4\x48\x65\x87\x6c\x5b\xe7\x48\x96\x73\x68\x3c\x40\xc8\x0e\x3d\xa9\x1a\x59\x87\x32\x56\xc1\x03\xeb\x99\x0f\xb0\xe6\xef\x2c\x4f\xc9\xea\x19\x3d\x44\xdb\x17\xf3\x68\x22\xee\x3b\x22\xb6\x7c\x66\xc8\x00\x45\xa2\x03\x29\xcb\xb7\xc5\x37\x38\x4d\xdd\x56\x81\xf8\xb5\xb7\x67\xfd\x94\x5e\x76\x63\x06\xf3\xdd\x77\x0e\xfb\xc5\xb7\x38\x7a\x58\x9a\xec\xc0\x09\x88\x72\x25\x43\x50\x0d\xe7\x76\x28\xfc\xc2\x48\xe1\x6d\x0d\x94\xc3\x78\x11\x3e\x9c\xde\x0e\xeb\xab\x46\xb0\x45\x82\x35\xb3\x08\x49\xbf\xec\x05\x01\x57\x17\xee\xeb\x7a\x55\x67\x64\xb8\x26\x05\xbb\x6c\x8b\xc9\xb7\xa2\xad\xa1\x4b\x0b\x97\xa0\xf0\x85\xd9\xcb\xfc\x52\xe6\x9d\x82\x0e\xe1\x81\xa2\x8d\x97\xa6\x96\xd4\x3d\x10\xa7\xa5\x5e\x02\x12\xfd\xaa\x57\xab\x05\x3e\xad\x11\xe0\x91\x37\xa4\x2f\xf3\x4b\x78\x46\x5a\xd8\xaf\x5b\xb1\x78\x75\x4c\x72\x9e\xde\x44\x97\xdc\x1a\xd4\xd6\x16\xfb\xc8\x0b\x5e\xb2\x20\x9d\xb3\x4f\x12\xb1\x28\xb2\xe5\xbd\x45\xb0\x6d\x6d\xb1\x93\x32\x00\x0b\x18\xdc\x74\x72\x79\x22\x73\xf6\x25\x6c\x48\x2e\x24\x88\x06\xa2\x24\x32\x80\x25\x7f\x33\x9b\xc4\xb9\x60\xdc\x30\xc1\xba\xed\xb7\xfa\x08\x61\x6d\xdd\x3d\x3a\x5e\x95\xf1\xa2\x3a\x6b\xfd\x5a\x64\xe4\x7c\x1c\xc4\x69\x9c\x5e\x8a\xc1\x56\xe6\x58\x7c\x9f\x08\xe9\xe9\x9d\x5c\xea\x72\xcc\x6c\xd3\xbb\xf8\x99\x5d\x41\x02\x6d\x55\x31\xe8\xa3\xb1\xd5\xe4\xbc\xc2\x82\xdc\xac\xf6\x6a\x07\xc7\x72\x57\x4b\x9c\xea\x78\x80\x6a\x49\x6d\xfa\x00\x69\x42\x03\x9e\xb2\xb0\xdc\x37\xc5\x82\x1c\x9a\xd8\x13\x63\x38\xf6\x95\xa8\x5a\x85\xa9\x1e\xc6\x79\x81\x9b\x75\x97\x05\x61\x19\x7f\x89\xcb\x39\x28\x64\x8b\x32\x9b\xc0\xb3\x80\x34\x62\x57\xbc\x95\x73\x16\x94\x78\x28\xc4\xb6\x2c\x92\xeb\xa2\x32\x60\x5e\x94\x5c\x8a\x69\xa2\x89\xcb\x2c\xe5\xec\x22\x08\x3f\x5f\x81\xc6\xd7\xb4\x24\x36\xbc\x32\x4e\x2f\x55\x5b\x71\xc9\x82\xa2\x4a\xc8\x5d\x96\xe5\xa2\xc6\x17\xce\x46\x31\x92\xbd\x59\x33\x49\x3c\x8e\x4b\x8b\x38\xdb\x14\x53\x8e\x8b\xd0\xeb\x6b\xd6\xae\xe2\xf8\x87\x43\xa6\x18\xb2\x44\xac\xa7\xd0\x5f\xd9\x36\xba\xb9\x96\x44\xb1\xb1\xe1\x45\xfe\x0f\x87\x8a\x34\x3a\x1e\x8f\x8b\x74\xe1\xb5\xdd\x89\x17\x52\x41\x76\xd5\x26\xae\x20\xab\xb4\x52\x7d\xaa\x29\x31\x65\x78\x0c\xf5\x05\x89\x8c\xc6\xe6\x16\x4b\xf3\x05\xcf\x82\xf5\x0d\xa9\x02\x80\xda\x1f\x75\x0f\xd4\x59\xb4\x84\xea\x38\x35\xda\x8a\x78\xc8\xae\x38\xaa\x60\x3e\x29\xc6\xfd\x09\x75\xf5\x60\xd9\x56\x28\x61\x5f\x10\xd3\x05\xe7\xa9\x6a\xc4\x88\x37\x41\x29\x78\x52\x51\x82\x44\xd7\xd3\xf8\xd3\x64\xb4\xb1\xa1\xb7\x84\x0a\x06\x5d\x16\x46\xf1\xb7\xd4\x3e\xb2\x60\x13\x40\x19\xaa\x4d\xbd\xb4\x28\xd4\x58\xd1\xa1\x89\x97\xa0\x84\x07\xb9\x35\x27\x6f\xa3\x0a\x58\xb6\xe8\x73\xe0\x03\xd7\x2c\x02\x0a\xbd\x77\x5e\x5c\xa0\x41\xcb\xe4\x5e\xf1\xe8\x9a\x8e\xdb\x5d\xc9\x55\xfb\x36\x2d\x00\x2d\x7b\x08\x46\xcf\x5a\xed\x02\x30\xec\x2d\x2e\xde\xaa\xa3\xd7\xa1\x87\x73\x56\x77\x7b\xad\x4c\x32\x08\x51\xc3\x06\xe9\xc0\x15\x26\xf5\xce\x4a\xfc\xa6\xa8\x2e\xed\x38\xa9\xde\xc1\x5b\x31\x48\xad\xbd\x11\x50\x40\x7b\x72\x9e\x6a\x63\xa3\xc8\x4b\x68\x2b\x5b\x5b\xec\x6f\xe8\x43\x9e\xea\xfe\xe2\x14\xf4\x27\x97\xa3\x92\x25\x59\x36\xe9\x59\xfc\x7f\xf9\xed\xdd\x4f\xf5\x0d\x50\xde\x54\x48\xb6\x66\xf8\xb7\x83\xe3\xa6\x6e\xdd\xb0\xca\xd9\x03\xdc\xe2\x88\x1f\x07\x56\x26\xd0\xa7\x90\xcf\xc4\xbf\xe4\xf6\x41\x97\xf0\xbf\x2a\x52\xd9\x55\xa5\xff\x7a\xae\x62\x05\x05\x9f\xc0\x5b\xba\x3a\x7f\xa9\x4f\x24\x55\x5f\xf2\xf2\x63\x70\x75\x1a\xd4\xb9\x38\xdc\x7f\xb2\x23\x4b\xa2\x22\xe6\x34\xc3\xf0\x3b\xb5\xc5\x75\x88\x14\xf9\x60\xef\x3f\x4b\x59\x43\xbf\x91\x36\xaa\x7b\xa3\x83\x9f\x26\x09\xc2\xd0\x3a\x93\xef\xbc\x7e\x9e\x26\xc9\xb9\xf4\x13\xa0\x27\xd8\x29\xf3\x8b\x4a\x3f\x6f\xc9\x4e\xf5\x35\x01\x3e\x85\xf3\x74\x55\xcc\xc7\x6a\x0c\xd8\x9a\xc4\xd3\x0b\xf9\xa3\x57\x92\xdc\xbe\xb5\x57\xe8\x5b\x64\x0e\xaf\xc7\x58\x3c\x9e\xa0\xf2\x40\x07\x76\xff\x74\xc9\xcb\xd3\xe0\x12\x55\x8c\xd9\xb4\x14\x47\x3b\xf0\x0d\x86\xb7\x14\x17\xd3\xcb\xcb\x39\xe3\xe9\x97\x38\xcf\x52\x8c\xd5\xaf\x74\x78\x93\x3c\xfe\x12\x94\x7c\xf1\x53\xc0\x7f\x88\x93\xb2\xa3\xd4\x29\x64\xac\x76\xaa\xd2\xf9\x44\xc6\xf1\xa9\x67\x1f\x98\x05\xf4\x3f\x01\xa4\xf4\x65\xb4\x58\x56\xfa\xf9\xb3\x74\xe6\x48\x17\x86\xca\xb3\x99\xad\x35\x37\x7d\x35\x93\x6a\xf9\x28\x19\xc8\xc1\xfa\xc6\x86\x3b\x0f\xb1\x0a\x9b\x25\x21\xea\x40\xcf\x2f\x0c\x7d\xca\x74\x48\xee\x3b\xc4\x28\xf3\xfc\x6b\xcc\x0c\xb6\xba\xca\x96\xf1\x23\xf0\xcd\x1f\x6a\x7f\x08\x26\xb5\xd7\x6b\xfb\xe8\xc6\xf6\x0f\x7c\xa3\x0d\xd0\xfd\xf1\xcf\xb3\xf7\x1b\xdf\xd8\x7f\xeb\x77\x97\x3a\xda\x39\x4e\x4c\xbd\xc5\xdf\xf3\xd5\xac\x1b\x3d\x3d\x0c\x8c\xbf\x0d\x9f\x89\x54\xba\x5c\x74\x76\xd5\xda\x8a\xd6\xe1\xa6\x21\xa5\x57\xae\x1d\xfa\xce\xd3\x3b\xec\x63\x8d\xc1\x7b\xdb\x5b\xf5\x9d\xa4\x1d\xe5\xbe\x6e\xd2\x77\xee\xa6\xf9\x35\x06\xed\x36\xb5\xea\xdb\x48\xf0\xa1\x53\x3f\xc5\x6b\x36\xbb\xc6\x00\x75\x1b\xab\x81\xb0\x07\x4e\x6f\xc0\x2d\x64\xbd\x99\xf9\xf6\x5d\xb4\xbd\xc6\x18\xed\x86\x56\x03\x66\x1f\x7d\xe6\xa5\xc1\xb8\x61\xa0\xbb\x77\xd1\xf6\x1a\x03\xb5\x1b\x5a\x0d\x98\xa7\x83\xc1\x29\x9f\xd5\xd3\xea\xd3\x15\x39\xf1\xb3\xc1\x60\x5a\xc6\xc9\x00\x02\x1c\xfd\x52\xc6\x49\x3d\x1a\x77\x9e\xac\xd6\xc5\x73\xd9\xc5\xeb\xa0\x0c\x16\xf4\xf0\x6c\xb5\x1e\xbe\x97\x3d\x7c\xc8\x92\x20\x6f\xee\x02\x7d\xca\x3f\xb0\x83\x65\x31\x15\x9e\xb0\x27\x1d\xd2\x5f\x5f\x13\x93\x28\xed\xc5\xcc\x78\x02\x8f\xd9\x21\xdb\x39\x60\x31\xfb\xab\x39\x11\x4b\x9f\xa1\x07\x2c\x7e\xfc\xb8\x23\x5d\x8b\xeb\xeb\x28\x5d\xea\x2c\x3e\x3f\xa8\x78\x14\x97\xd7\x50\xb7\x71\x2a\x8e\x55\x94\x5f\xf1\xaf\xd2\x51\x96\x32\x1a\xc3\x5c\xe2\x5c\xfc\x46\xeb\x18\xd0\xe5\x1a\xbb\xb1\x24\x9c\x32\x3b\xca\xd2\x62\x3a\x16\x32\xd5\xcb\x3c\x0f\xe6\xed\x20\xcf\x15\x3c\x90\xd0\x8b\x0b\x93\x51\xc1\xc5\x36\xf8\x57\xd9\x65\x87\x4c\x17\x92\xe8\xe8\x28\x2c\xe5\x2e\x7e\x44\x85\xb3\xf8\x1c\x90\x93\x03\x5a\x6e\x8c\x99\x61\xbe\x4b\x9c\xb4\xcb\x54\x84\x63\x98\x67\x63\x00\x42\x3a\x43\xd7\x7f\xe8\x5d\x36\x2f\x79\x11\x07\xe9\xdf\x63\x7e\xf5\x2a\x9b\x9d\x8c\x82\x09\xba\x07\xba\x1d\x37\xeb\x05\xbd\x42\x54\x85\xc0\x2b\xb3\xfe\x2a\xf5\xf1\xbe\x5d\x88\xa6\xf3\x35\xeb\xcb\x80\x2c\x6b\xb5\x31\xe2\xf1\xe5\xa8\x5c\xa3\x91\x07\xca\xca\x7c\x22\xd6\xd8\x5d\xa2\x37\x5c\x17\xbf\xe1\xba\x08\x26\x21\xda\xd7\x6c\x89\x04\x75\x5f\xb3\x25\x1a\xdf\x7f\xad\x86\x54\x70\xf2\x75\xe7\xfe\x81\x72\x60\xad\x5c\x0a\xc2\x81\x0f\xe9\x60\xa5\xb6\x89\xfb\x3e\xef\xb2\xed\x56\x49\xed\x1c\x54\x37\x18\x19\xbd\xe4\xf9\x4a\xdd\xc2\x9d\xba\x39\xab\xae\x07\xf8\xea\x33\xb3\xd2\x9a\x91\x5e\x0b\x81\xd2\x86\xc3\x82\xaf\xb3\xa0\x21\x6e\x43\x56\xc4\x62\x03\x58\x1d\x0d\xed\xb3\x56\x99\x4d\x20\x4a\x20\x1f\x42\xd8\x36\x78\x9f\x21\x7e\x5c\x64\x65\x99\x41\x18\xc1\x38\x2d\xe2\x88\x8b\x5f\xd9\xb4\x54\x3f\x31\xf1\x9d\xac\x85\x5f\x1f\x55\x5d\xfc\x3c\xc5\x96\xf1\xe3\x95\xd3\xdc\x69\x36\xb1\x2b\x63\x01\x3b\xed\x34\x9b\x38\x6d\x62\x29\x27\x11\xee\x7b\xcd\xe7\x9b\x14\xe2\x1e\x72\xfc\x27\xe4\xe2\xf8\xdf\x42\xb4\x13\x37\x97\xdf\x9a\x70\xc0\x71\xd8\xf1\x70\x69\x81\x9a\xce\x78\x16\xf1\xce\x4a\x24\x27\x6a\xca\x91\x0b\x11\xf6\xe7\x60\xbc\xda\x9a\x41\xd2\x85\x76\xb2\xb4\xe4\xe9\x6a\x94\xbb\x1e\x02\x95\x13\xd2\x55\xb9\xc6\x79\x07\xac\xd9\x49\x70\x14\x15\xa2\xe0\x2b\x59\x90\xfb\xba\xd0\x25\x2f\xdf\x05\x17\xa0\x62\xa7\x8a\x29\x48\xc3\x70\x05\xc6\x98\x47\x85\x13\x44\xa7\xb0\xe8\xbf\x4b\xaa\xfe\x35\xbb\xd3\xd9\x3a\x05\xae\x55\xd0\x16\x08\xfb\xb9\xfd\xe1\xbb\x2d\x23\x27\x68\x47\xb4\x1d\xf6\x42\x42\xd3\x77\x42\x37\x68\xd3\x9d\x15\x95\x1b\xed\x4e\x5b\x43\xde\x71\xb4\x73\x3a\xa3\x0d\x43\xe9\xb8\x71\xf1\x20\xf5\x80\xa2\xf6\x35\x4f\xca\x00\x76\x36\x07\xbf\x26\xa3\x6d\x36\xd1\xae\xde\x07\x0d\xce\x65\xe8\x29\x15\x59\xfe\x36\xe7\x97\xb3\x87\xa3\x87\x6c\xeb\x11\x1b\x07\xe5\xe8\x44\x34\xf3\x68\xeb\xbc\xd3\x56\x5d\x40\x24\x43\xd5\x33\x0c\x05\x69\x86\x00\xac\xcc\xef\xdb\xf0\x23\xb8\x28\x6a\x2a\x77\x19\x3a\xa5\x32\x98\x00\xa8\x1f\x91\xd6\x0c\x56\xd0\xdd\xb0\x10\x3f\x82\xa4\x42\x79\x95\x4c\xc4\xf4\x07\xf4\x81\x0c\xbf\xbb\x2c\x28\xcb\x9c\x50\xa5\xda\x1f\xe0\x82\x53\x15\xee\xa9\x54\x1d\x6f\x15\x77\x68\xbb\x90\x4c\xd4\xc1\x41\x61\x75\xd8\x45\x30\xad\xab\x2f\x65\x25\x7f\xb1\x0b\xe9\x64\x85\xc6\x50\x74\x24\x5b\xef\x85\xba\x83\x70\x4e\x93\xe7\x2a\x99\x88\x76\x24\x9f\xa4\x6a\x00\x8d\xe4\x46\x0a\x92\x54\x13\x2c\x55\x4d\x0e\x29\x47\x08\x4d\x16\xd3\xd3\x69\x0a\xa9\x24\x33\xe2\x2c\xfc\xfc\x6b\x5c\xd0\x32\x3a\x4d\x2f\xed\x5c\xc1\xd4\xa6\x63\x79\x4c\x01\xee\xb0\x2d\xb6\xeb\x25\xb3\x25\x96\xc3\x81\xbd\x1a\x48\xf5\x1f\x0e\xd9\x36\x7b\xc1\x76\x58\x9f\x6d\xee\x1c\x50\x4e\xa3\x47\x06\x91\x19\xd4\x78\xf0\x41\x24\x92\x0b\x89\xd9\x20\x38\x86\x21\xa4\xc3\x43\x7b\xd3\xd5\x66\x78\xb4\x5d\x82\xe3\xc7\x8a\xe0\x91\x5a\xf0\x7e\x93\xf6\x44\x30\x66\x85\xc6\xf1\x75\x29\x36\x76\x6f\x87\x74\xf1\x35\x77\xf7\xdd\x72\xfd\xf1\x85\x3d\xdd\x72\x60\x02\x93\x34\x97\xcc\xd3\x5f\x71\x9e\x4c\x6e\x9f\x7d\xa7\x3f\x34\x1d\x01\x4e\x3f\xc8\x48\xd5\x0b\x79\x9e\x4f\xa3\x72\xf6\x90\x03\xd3\x03\xb1\xfc\x34\x3b\x52\x42\x3b\x32\xbf\x70\xd6\x65\xe1\xbc\x2b\xe9\xb5\x4b\x46\xad\x49\x8c\xa7\xd1\x1f\x02\x00\x7b\xcc\xda\x06\x3b\x8a\xa2\x3b\xec\x11\x43\xdf\x91\x92\xd9\x05\xe5\x88\x1d\xb2\xd6\xfb\x96\x98\x1b\x8d\xad\xde\x8c\x3d\x66\xad\xae\x93\x38\x17\x89\xff\x5f\x2a\xe6\xec\xa5\xc8\xca\xd5\xb2\xc4\x92\xe4\x73\xbb\xbb\x03\x49\x16\x04\xdb\xac\xcf\x76\x3a\x90\x8f\x8d\x40\x08\x26\x89\x1e\xd2\xa3\x4e\x9a\x2b\x28\xe3\x68\xe5\x2d\x2b\x06\xe4\x4d\xd3\xf8\x1f\x53\xfe\x36\x42\xa4\xb5\x72\x1e\x8e\x82\xbc\x2c\x36\x73\xd8\x19\x36\x93\x38\xe5\x9b\x2d\x6b\xc7\xb9\x85\xa6\xbb\x17\xf4\xf0\xe9\xe3\x1b\x94\xb5\xda\x40\xd5\xad\x92\xcf\x54\xf0\x06\xa5\x72\x83\x88\x6d\xb0\xdd\x74\xb5\x91\x43\x94\x8d\xe3\x34\x48\xcb\x57\x41\xc1\x05\x1c\x7d\x14\xbe\xf3\x20\x69\x55\x76\x89\x26\xf9\xd1\xaf\xb8\x6d\x7b\x46\x7b\x11\xe4\x9b\x40\x27\xad\xae\x69\x1a\xef\x64\x6f\xa4\x99\xc0\xda\xa3\x67\x70\x7d\x59\xe8\x21\x40\x84\x01\xf9\x7b\x9d\xc6\x5b\x82\x60\x5b\x5d\xf6\x95\xc5\x51\x9f\xc5\x51\x97\x45\x7d\x24\xe2\x1b\x1c\xc1\x1d\x0e\x40\x4c\xe0\x07\xe8\x4e\xa6\x7c\x65\xb3\x24\x4e\x3f\xff\x2d\xe7\xc3\x3e\x6b\xfd\xa7\xa0\xd5\x38\x62\x37\xc6\x76\xfc\x82\x27\x08\xc4\x03\xc6\x3a\x96\xe0\xf6\x52\x4c\xfa\xf1\x10\x16\xb6\x4f\x3e\xae\xe4\x57\x64\x65\x2d\x6f\x4c\x1a\x45\x8d\x89\x47\xca\x20\x12\xcd\xc4\x12\x66\xfe\xf7\x88\x17\x9a\xe3\x8f\x63\x5d\xa6\x6d\xed\xa8\x46\x14\x06\xb9\xc1\xbb\x47\xab\x93\x3a\xb5\x21\x1b\x54\x18\xef\xbd\x32\x72\x8a\xb3\xc7\x72\x5a\xbb\x7a\x54\xc4\x8a\x6d\x20\xe6\xac\x02\x5c\x6f\x46\x4a\xcc\xbd\x25\xe6\xb6\x39\xb2\xe2\x43\xb3\x3e\x1b\xe8\xca\xf3\x3e\x1b\xe8\xf9\x16\xeb\xe0\x65\x1a\x8e\xb2\x5c\x14\x11\x12\x52\x38\x63\x2f\x58\x0b\xd0\xdb\x62\x7d\xa9\x34\x50\x82\x31\xcf\xc1\x79\x82\xaa\xd1\x1a\xc7\x51\x94\xf0\x16\xf2\x17\xbd\xad\x57\x91\x2f\x55\x0e\xce\x19\x89\x80\x17\x52\xf0\x42\x2f\x78\xaa\xb3\x5b\x02\x03\x22\xe7\x32\xd2\xe6\x83\x1a\x9a\xd8\xbd\xe7\xdd\xdd\x43\x01\xde\xe9\xdf\x35\xf3\xef\x9d\xfc\x5d\x39\xfb\x16\x72\x67\x7d\x26\x6b\xcd\xfb\x4c\xa2\xb5\x1e\xa9\x0d\x28\xbd\xf1\xb1\x3c\xdd\x77\x03\xdb\xb3\xcb\x7c\x53\xd6\x47\x39\x9f\x85\x3b\x95\xa8\xe9\x0c\x6e\x24\x48\x06\x7c\xab\x4c\xbc\x6a\x20\xb9\x98\x60\x04\x51\x3c\x68\xc8\x62\xce\x21\xc3\xbb\x1c\xca\x6c\xd2\xb0\x16\x84\xb4\x84\x00\x6d\xb1\x5d\xb2\x2c\xe6\xae\x30\xbf\xd2\x2a\x11\xeb\x79\xe1\x7a\x95\xaa\xce\x55\x60\x7c\xac\x10\xf1\xf8\x0e\x80\x45\x36\xb4\x10\x5c\x50\xd5\x36\x01\xbb\xe9\x00\x61\x43\x4a\x86\x60\x41\x77\x27\xac\x0f\xd5\xc7\xcb\x60\xf2\xf1\x4a\x40\x22\x8a\xd6\x06\x93\x68\xaf\x9b\x61\xfd\xc3\x61\xfc\xb8\x34\x42\xff\xc0\x59\x37\xfa\xfe\xd5\xd6\xd0\x37\x5b\x3a\xd6\x5d\xc4\x5a\xeb\xfd\x9b\x31\x27\xfb\xba\x64\x05\x6a\x5d\x0c\xe7\x02\x82\xbd\x15\x6e\xf5\x95\xcd\x1a\x24\xbb\x18\xe2\x46\xaa\x5d\x81\x16\xd6\xe4\x04\xcb\x10\xc3\x02\x24\xdf\x82\x16\xe8\x1d\xd8\xfa\x8c\x61\x19\xd8\x1b\xd1\x5d\x03\xf9\x4a\xd6\xa3\xed\x8e\x1e\x71\x87\x6d\x6c\x28\x63\x9a\xdb\xaa\x4a\x86\x20\x89\xc6\x85\x74\x0d\x04\x12\xa8\x6a\xb7\x37\x83\x77\x6a\xab\x35\x7c\x29\x1b\xfe\xc0\xf3\x10\x1d\xf7\xdb\x2d\xdf\x1b\xd0\xf3\x7b\x03\x7a\xde\x71\x2f\x73\x1c\x22\x5a\xad\xd3\x0b\xe8\xf4\x92\x97\xb2\xd7\xbf\xc3\x9d\x94\x83\xaf\x2e\x52\x68\xc7\xa1\xcc\xfb\xeb\x71\xde\x95\x64\xdf\xb9\x13\x3a\xaf\x1c\x3e\xaa\xfb\x46\xcd\x2e\xbc\xee\xa9\x24\x2e\xe0\xec\x45\x0f\x21\x32\xa9\x2d\xe5\x76\xcb\x0f\xd8\xdd\x51\xa4\xd1\xad\x48\xb5\x90\xee\x7f\x95\x13\x4f\xed\xa1\x46\xcf\x42\xfd\xc5\xea\xc2\x18\xf5\xf2\xaa\xda\xe4\xe3\xb7\x56\xde\x41\xea\x7f\xd1\x8b\xab\x89\x7d\x67\xe5\xbb\xdb\xaa\xd6\x72\x1e\xa0\xb4\x5a\xac\x5f\x29\x85\x71\x55\x21\xf2\xba\xc2\xc8\xf5\xf5\x6a\xd7\xbd\xf2\x85\xcc\xc6\xc6\x6a\xd5\xcd\x3d\xf1\xc6\x06\xfb\x6e\x21\x5d\x68\x1d\xe3\xd9\xc3\xb8\xf8\x7b\x90\xc4\x91\xd4\x2d\x3e\x14\x87\x7a\x44\x28\x36\xb5\xfa\xad\xb2\x6a\xc6\x61\x43\x2a\x9c\xaa\xde\x51\xee\x06\x58\xa7\x97\xdb\x34\x1a\x26\x59\xca\xab\x4d\x62\x88\xf7\x42\x7b\xb3\x58\xef\x8e\xbd\x06\x4e\x99\xdc\xa6\x5d\xa9\x3b\x85\xc2\x52\xc6\xba\x7c\xe0\xc0\x31\x32\x70\x6c\x18\x54\x36\x28\xf3\x97\x51\xfe\xf8\x4c\x8e\xcf\x1e\x7e\xd6\xdc\x17\x3d\xba\xc2\x1b\xb4\x97\x65\x99\xc7\x17\xd3\x12\xc2\x8f\x9c\x77\x74\x8f\xda\xa9\x07\x01\x5c\x6c\x9c\xf5\xf7\x8c\x62\xb9\xd4\x5d\x09\x56\xf3\xe0\xfa\xce\x41\x60\xf5\x02\x7d\xe2\xb9\x3b\xb7\x10\xab\x1a\x7d\x29\x51\x63\xc1\xfb\xa2\x51\xd9\xdd\x5f\xa4\x13\xba\xd3\x1b\x9a\x25\xec\xce\xcf\x1e\x06\x30\x43\xca\x0c\xfe\xd1\xd6\xb9\x7b\xa3\xe3\x72\xbb\x35\xef\x68\xea\x2e\x66\xf4\xbd\x91\x85\x5e\xb9\x21\xab\x9b\x07\x7c\x3c\x07\x08\xeb\x45\x71\x31\x49\x82\xb9\x64\xc0\x2d\x48\x6c\x1d\xa8\x4c\xdb\x94\x87\x7e\xaa\x22\x4e\x20\x65\xfc\xad\x2c\x22\x83\xbc\xe0\x7f\xd7\x9b\x94\xde\xcc\x68\xba\xbb\xa7\x85\x66\x3b\x73\x6e\x18\x64\xa2\x56\xb4\x05\x52\x7f\x8f\xe9\x01\xbd\x01\xb0\x2e\x0a\x30\xbf\xf1\x9a\x00\x8b\xb8\x36\x08\xc6\xa8\x28\xd7\x49\xea\x96\x42\xa6\x5b\xd7\x13\xf6\x85\x07\x96\x58\x78\xdd\x21\xb5\x91\xd5\xcb\x0e\x83\x07\x4b\xdf\x88\x49\x46\xab\x9d\x4d\x74\x62\x99\x4d\xf4\x1d\x13\x1f\x9a\xad\x59\x7c\xb8\xda\x49\xcc\xf1\xeb\x26\x31\x0f\x3f\x7d\xf6\x18\x6a\x23\x37\xd6\x18\xcb\xee\x21\x4b\x0b\x42\x28\xb9\x0a\xb6\x75\x77\x6d\x4a\xd9\x94\xfa\x42\xb8\xbb\xc6\x67\x77\x0c\xec\xbc\xea\x6d\xe3\x2b\x6a\xe0\x51\xfb\xae\x0c\xdf\x71\x06\xb5\x09\xbb\x9c\xc3\x1b\xf9\xd4\xdd\x58\x60\xdc\x1d\x64\x65\x36\xb9\xe3\xb1\x0a\xfa\xac\x19\xae\x20\x69\x31\x60\x20\xe1\xe5\xc6\x7c\x2b\xa1\xe6\x4f\x30\xbf\x4d\xb3\xbb\x6d\x46\xb9\xed\x68\x00\xee\x0e\x94\xf0\xae\xc7\x16\x56\x07\xa7\xb8\x08\x5e\xcf\xc1\xab\x04\xc3\xc8\xa9\x39\x3f\xe1\xdc\xd7\xd7\x92\xc5\x83\x2b\x30\x87\x69\xf7\x0d\xfb\xf6\x96\xb3\x9e\x2d\x50\xc6\x4c\x0b\x59\x2f\x12\x28\x5b\xbe\xbe\x56\x9c\x5e\xfc\xb2\xea\x68\xb6\xd7\x37\x3f\x7d\xaa\x25\x7a\x20\x73\xb0\x61\xe5\x55\x8e\xbb\xe4\x1c\x0a\xfb\x64\xe5\x3e\xcc\xa4\xb6\xa5\x74\x65\x75\x03\xe7\x20\x34\x14\x5d\x20\xf2\x4b\x99\xf5\x10\x9d\xcf\xb9\x4f\xc2\xd7\x10\x9b\xde\x21\x58\x5f\xd9\x67\x3e\xef\xb3\x16\xf4\xb3\x19\x8f\x27\x49\x1c\xc6\x65\xab\x6b\x5e\x46\xa8\xe3\xda\x4d\xe7\x0e\x68\x9b\x1b\x52\x3c\xce\x4f\x4a\xc5\x5c\x00\x13\x7f\xe0\xe0\xba\xea\x35\x05\xa2\xfb\xb6\x43\x6d\x3c\x76\xc9\x69\x6e\x3c\xed\x2e\x3a\x12\x7d\x73\x04\x69\x23\x77\x9b\x7a\x6b\xa9\x61\x55\x5d\xe7\x7d\x0d\xcc\xc8\xf4\x1e\xd0\xf5\x89\xa7\x66\xf8\xd2\x43\xa8\xb5\xe4\x71\x61\xda\x86\xca\x47\x41\x92\xbc\x9a\x7f\x08\x72\x27\xea\x40\x35\xb7\x3d\x81\x7f\xa4\xad\xb2\xc5\x0a\x40\x9e\xfe\xcc\xc3\xcf\x90\xa9\x18\x89\xfb\x28\x93\xfd\xc0\x76\xc5\x06\x60\x9e\x61\xee\x9e\xdb\xde\xa1\xd8\x0b\x3b\xb3\x6f\x7b\xab\xfc\x8e\x40\x20\x68\x91\x7e\x6b\xbd\x91\xe8\xc1\x85\x65\x63\xc3\x2e\xdb\xcc\xb5\xe4\x78\x88\x62\xca\xd3\x8d\xbe\x49\xc7\x4c\x73\xf8\xb0\xcf\x1c\xa6\x66\x47\xd7\xe0\x33\x9c\xa3\xa3\x51\x9c\x60\x07\x2b\x9e\xd6\xd1\xfc\x7d\x18\xa7\xd1\x4b\x31\x4d\xe2\x44\x24\x37\x46\xa5\x43\x43\x75\x5e\xa7\x37\x0e\x26\x6d\xf3\x96\x16\xb2\xbb\x2c\x4e\x23\xee\x6e\x19\x6b\x29\x52\xb0\x59\xb5\x07\x57\x68\x56\x1c\xf0\x29\xb2\xd4\x4e\x47\xe9\x17\x6c\xd8\x04\x5c\xb8\xd5\x21\x09\x1b\x5d\xc3\x77\xce\xcc\x3a\xd0\x3b\x98\xa5\xd3\xa9\x16\x86\x22\x4e\xb2\xb9\x55\x28\xa3\x5b\x0b\xb2\x75\xe0\x3f\xb3\xda\x3c\xef\x85\x59\x1a\x06\x65\xdb\xf3\x8e\xd7\x81\xab\x23\x95\xae\xf2\x60\x6b\x1f\x5e\xe9\xa7\x3a\xfb\x7a\x97\x6a\x35\x11\x83\x1a\xa8\x77\xdb\x4a\x47\x20\xe3\x1f\x59\x51\x8f\xb4\x03\x13\x88\x28\xc7\x0e\x19\xf2\x9c\x4e\x25\x66\xc8\xd3\x3f\x93\x43\x14\x0c\xa2\x9d\x25\x0d\xd1\xc3\x77\x77\x9e\xff\xf1\xa1\xd3\x6d\x48\x85\xc0\xf0\xe7\x08\xda\xe7\xc2\x75\x79\x2f\x70\xdd\x3e\xbe\xa8\x0b\xd7\x70\x9d\xd8\xa2\xd8\x56\x12\x5c\xd4\x47\xa7\x7b\x7e\xe7\x31\x55\x57\x08\x2c\x4a\xe0\xbc\xaf\xb0\x8e\xb7\x8f\x7b\x6f\x43\xe5\x8b\xe9\x78\xcb\x70\xff\xe1\xf4\x82\x8f\x78\x12\x37\xc4\x9d\x7e\x7e\xe7\x61\x5e\xeb\x42\xd3\xdd\x06\x5a\x32\x27\xd5\x68\x84\xfb\xcf\xfe\x4c\x6c\x51\xca\xa6\x45\x96\x97\xaf\xe6\x0d\x3e\x37\x56\xf4\xc0\x52\xe9\xe0\x2e\x9c\x44\xa9\xb6\xfe\xed\x22\x6a\x1d\x1f\x4e\xcd\x01\x94\xf7\xb6\x57\x74\x2e\xe4\xb6\x7f\x17\x3e\xa2\x64\x53\xab\x3a\x73\xba\x57\x9f\x58\x6e\xf3\x6b\xb9\x8c\xba\x0b\x9f\x58\x7b\xaa\x15\x15\x96\xa5\x61\xc8\x2b\xae\x6a\x4f\x17\x6b\x79\x91\xaa\xb4\xb6\xaa\xbb\xa7\x7b\xf1\x06\xb6\x7f\x07\xde\xc0\xf6\xd7\xf3\x06\xf6\xf4\x1e\xbd\x81\x3d\xbd\x2b\x6f\x60\x4f\xef\xc0\x1b\xd8\xb3\x7b\xf4\x06\xf6\xec\xae\xbc\x81\x3d\xbb\x03\x6f\x60\xcf\x25\x41\x14\xe3\x2c\x2b\x47\xf5\x4b\x74\xef\x6e\x9a\x5f\x63\xb4\x6e\x53\x2b\x3b\xf8\x0a\xb3\xb4\x0c\xe2\x94\xe7\x83\x93\x69\x3e\x0c\x1a\xc2\x50\x7f\xbf\xea\xb6\xbb\x4d\x7b\x79\x17\xcc\x79\xfd\x61\x6f\xe7\xfb\x15\xfb\xd8\x11\x7d\x8c\x27\x59\xca\xd3\x72\x70\x9a\x65\x49\xd9\x10\xcc\x7a\x67\x55\xff\x9a\x3b\xbb\xb4\x9b\x77\xfc\x92\xa7\x51\xc3\x58\x56\x74\xbb\xb6\xf3\x64\x30\x00\x3f\x4e\x83\xa3\x69\xfe\xa5\x21\xa6\xff\x8a\x8e\xe3\x76\xf6\x74\xfb\x79\x56\x34\xf8\x74\xfb\x7e\x45\x3a\xdf\xd9\x57\x1d\x9c\x40\x28\xdf\x7a\x14\xed\xaf\xc8\x1e\x77\x9e\xaa\x1e\x5e\x67\xf5\x5b\xcb\xb3\x55\x5b\x7f\xa6\x5a\xff\xc8\xc3\x12\x6e\x88\xea\x27\x61\x45\xbe\xb7\xf3\xfc\xfe\x3d\x04\xee\x88\xf5\xad\x8c\x5c\x06\xda\xdc\xe5\xe5\x2c\xae\xef\x6b\x6f\x7b\x55\x37\xa4\xdb\xb4\xb3\x57\xf9\xb4\x68\x60\xa0\xdf\xaf\xb8\xce\x77\x77\xd4\xf5\xcd\xf1\xfb\x66\x9c\xed\xee\xac\x48\xbc\xbb\xbb\xf7\xee\x57\x71\xf7\x89\xec\xe2\x68\x14\xe4\x0b\xe6\x7e\x77\x45\xfa\xda\xdd\xbb\xa5\xf3\xc6\x55\xfa\xd8\x57\x7d\x4c\x73\xfe\x11\x94\x97\x0d\x4b\x7d\xc5\x3e\x9e\xca\x3e\x20\xea\x58\xfd\x18\xbe\xdf\xdb\x53\x07\xfb\x7f\xfb\xa0\x94\x28\xc0\x3b\xa8\x23\x21\x16\xb9\x21\xac\x69\x5c\x0b\xe2\x1c\x3c\xe6\x85\xc4\x89\x32\x9e\xac\xb8\xa4\x44\xd4\x28\xf3\xa0\x0a\x5a\x22\x5e\x84\x79\x3c\x29\x33\x6d\x02\x05\x68\x31\xc9\x3d\xe3\x66\x1c\xec\xc2\x7c\xe9\x62\x8e\x82\xa4\xe0\x56\xbd\x30\x4b\x87\xf1\xe5\x54\xd5\x84\x7b\x24\x40\xea\x43\xb8\x25\x7d\x28\xb0\x6d\x8a\x77\x68\xd5\xab\x3c\x2e\xad\x6a\x7e\xc7\xe8\x6a\xe4\xa4\x26\x04\x91\x26\xad\x1e\x50\x84\x1b\x8c\x1e\x65\x69\x51\xe6\x53\xb1\xd9\x01\xe2\xca\x4c\x5e\xaa\x61\xcc\xcd\x0f\x0a\x95\xf2\x7e\x5f\x66\x77\xaa\xc8\x27\x0d\x19\x2a\xa1\x4d\x76\x70\xcc\x56\xbb\x4d\xad\xd8\x20\x1c\x28\xd0\x49\x89\x03\xf0\x9b\xde\xb6\x7d\xb3\xa3\xe3\xfc\x5f\x31\x3c\x01\x69\x39\xbb\xf8\x1d\x08\xb3\x50\xf3\x8d\x38\x63\x87\xec\xeb\xcd\x01\xa5\x94\x18\x7c\xb7\xab\x31\x8b\x1a\x3d\xb8\x05\x3a\x1e\xb6\xe3\x0e\x3c\x4f\xed\xc0\x75\x6e\x9c\xaa\x69\xfc\x6e\xa9\xc5\x01\x00\xc4\x1d\x5a\x59\xae\x0f\xf0\x79\x9a\x5d\xfc\x6e\xfb\x3c\xd5\x8b\xe2\x7f\x89\x5f\x56\x33\x08\x87\x78\xd5\xcc\x98\x98\xe7\x0a\xf3\x64\x2e\xfc\x74\x6f\xaa\x7e\x55\x16\x07\x68\xd1\x5f\x0d\x09\xc0\xe8\x2a\x54\x69\x6a\x79\xe1\x37\xbb\xe9\x90\xc1\x88\x09\xb1\x42\xae\x9b\x61\x67\x17\xbf\x3b\xf3\x02\x27\xb8\xa3\x20\x49\x8e\x46\x3c\xfc\xdc\x8e\x21\x14\xb8\x60\x85\x84\x5c\xd5\xc0\xbe\xd3\xd9\x4c\xfd\xc8\x86\x56\x41\xe0\x9d\x9e\x68\x87\x0f\x8f\x82\x34\xcd\x30\x6c\x18\x0b\xd0\x0e\x96\x05\x05\x09\x26\xfe\xb0\x8a\xed\x49\x56\x14\xf1\x45\xc2\x49\x07\x18\x46\xa3\x5d\xf0\x64\xd8\x85\xc6\x34\x68\x22\xc9\xee\xfd\xa3\x8a\x30\x22\x41\x80\x20\x66\xa3\xa0\x48\x5b\x25\xc4\x86\x62\x71\x1a\x97\x71\x90\xc4\x05\x8f\xd8\x26\x2b\xa6\x13\x9e\xb7\x3b\x56\x09\xd1\x03\x8f\x10\x34\x65\x7c\x2e\x46\xb0\xb1\xa1\xa3\x3e\xc2\xf7\xe1\xe1\x21\x7b\x88\xeb\xf7\xa1\xe0\xa4\x95\x3c\x33\x4a\xf6\x02\x93\xfb\x4c\x40\xec\x4c\x46\x9c\x8e\x78\x1e\x97\x45\xbb\x98\x5e\xc0\x1e\xd2\x45\xb0\xe0\xb7\x1a\xaa\x6c\xdc\x64\xc0\xf5\xbf\xe9\x02\x42\x78\xd8\x99\x32\x64\x88\x7f\x6a\x4e\x44\x59\xc6\x67\x93\x9c\x17\x85\x00\x63\x3c\x2d\x4a\xc6\x31\xf2\xdb\x05\xc7\xc0\xf8\x59\x4e\xe6\xaa\xcb\xc4\x5c\x3e\x64\x8f\x59\x05\x16\x40\x95\x82\xde\xf0\x15\x23\x12\xe0\x06\xd9\x26\x00\x5a\xe0\x52\x0e\xfc\x15\x23\xd3\xe3\xcc\xf7\xcd\x42\x31\xc8\xa1\x6b\x05\x43\x75\x3a\x0b\xc3\xb7\x78\x04\x99\x29\x96\x4e\x90\x2b\xe1\x2b\xb8\xe0\xbd\x08\xc2\xf1\x90\xbd\xf0\xa7\xd7\x4c\x90\x81\xad\x37\x18\xc0\x48\x40\x78\x32\x45\x0e\x2c\x3f\xcf\x95\x3f\xc1\xec\x8e\x3f\xbe\x7d\xf3\xf3\xe9\xe0\xfd\xcb\x0f\xd2\x1d\xe3\x4c\x1c\x1e\xfa\xec\x8c\xb8\x21\x2d\xb3\x49\x0b\x6c\xd6\xe7\x2a\xcf\xf6\x59\x7a\xae\xed\x53\xb2\x3c\xbe\x8c\xd3\xa3\x2c\xcb\xa3\x38\x0d\x4a\x31\x11\x60\xbb\xb8\x0d\xb6\x8b\xdb\xcc\xb8\x76\x48\x79\x2e\x24\x17\x0c\x43\x1d\x87\x41\x02\x92\xb2\xed\xda\xc1\x5f\xa6\x3d\xc8\xf9\xd0\xd8\xb0\x20\x4b\xe9\xb2\x41\xc9\xc7\x93\xae\x20\x6a\xb5\xcc\xa4\x29\xba\xb6\x0d\x09\xf2\x52\x3d\x25\xca\xf9\xb0\xa7\x13\x94\x4d\xc3\x4f\x79\x30\x19\x61\x37\x71\x12\xa9\x62\x76\xaa\x7e\xc2\x94\xf3\xe1\x7f\x71\x21\xb0\x9e\x22\xbd\x41\x59\x9d\xa0\x2d\x12\x9d\x12\xb4\x8a\xfb\x7a\x29\x98\xc5\x05\xbc\x60\xb2\xca\x69\x83\xf6\x59\x5c\x1c\x29\xc5\x44\xa1\x3a\xb4\x53\x8d\x81\xf7\x25\x4f\xa3\x23\xfd\x08\x0b\x8a\x5a\x89\xb6\x8b\x4c\x31\xab\xef\x83\x89\x2a\x69\x25\x6a\x1f\x75\xb6\xb5\x3f\x14\xa4\x69\xfa\x5d\x19\x31\xf9\x87\x42\xc4\xee\x1f\x27\xc2\x9d\xcf\x5f\xf3\x60\x82\x71\x6e\xda\x30\x87\xa2\x62\x58\x91\x68\x07\x7a\x98\xca\x7e\xc4\xb0\xaf\x9a\x16\xbb\x8c\x54\x92\x0e\x6b\x74\x83\x35\x75\xe8\x8b\x03\xe8\xc4\xd9\xb0\x04\x57\xef\xd6\x55\x56\x9d\x48\xc2\x2c\x31\xbe\x5b\xc3\xc6\x82\xad\xd5\xc1\x4f\x16\xb5\x7e\x81\xda\xbb\xb4\x19\x43\x1d\x24\x1d\x94\xa5\xb0\x03\x1c\x93\x81\xce\x5d\x23\x58\x16\xe0\xb5\x87\x20\x27\xf8\xa4\xc4\xa5\x0c\x25\x7a\x84\x4b\x4a\xf6\xfa\x9a\x14\x23\x6f\x9b\x54\x2b\xd3\x49\x14\x94\x1c\x62\xb0\x6d\xab\x74\x6c\xaa\x50\x0d\x53\xdf\x66\xb4\x53\xc1\x95\x55\xf5\x3e\xdb\x96\x95\x6f\xba\xb2\x3e\x66\x41\xc9\xe3\xa1\x24\xd8\xe2\x18\x5e\x53\xbf\x4c\xa3\x93\x32\x08\x3f\xff\x94\x67\xd3\x49\xd1\x26\x76\x79\x00\xa0\x74\xd1\xca\x1a\xfb\xd3\x80\xdf\x74\x28\xf6\xb0\x6b\xf0\x06\x07\x38\x7f\xbb\x94\x67\x39\x9f\xd6\x61\x81\x6b\xb9\x96\xe9\xd4\x98\x0d\xab\xdb\x9a\xd7\x3c\x09\xe6\x34\x40\x1f\xc2\x55\xe6\xf1\xe5\x25\xcf\x79\xf4\x72\x58\xf2\xfc\x7d\x36\x2d\xf8\xfb\xec\xcb\x22\x5f\xf3\xb5\xf7\x4a\xed\x4e\xbb\xb1\xdd\x2e\xf3\x41\xe5\x46\x14\x54\x77\xf9\x26\xd4\xe1\x8d\x0c\xb8\xf9\x88\xf1\x22\x89\xd3\x72\x33\x8a\x0b\x38\xbf\x31\xd0\x7a\x6f\xa5\xd9\x66\x14\x47\x9b\xe3\x6c\x9a\x96\x9b\x05\x2f\x37\x91\x54\x1e\x6d\x3d\x50\x15\x1f\xc1\xbf\x8f\x74\xa8\x33\x09\x70\x97\xe5\x10\xc0\x18\xcb\xab\xf8\xc3\xa1\x59\x26\xb8\x11\xf4\x64\x6d\x15\x62\x0d\xa7\xef\x46\x52\x05\x72\x39\x19\x5b\xae\xcc\xd8\xb4\xe0\x32\xa6\xbc\x0c\x0c\x0b\x8d\x2a\xdd\x3e\x74\xa5\xda\x53\x96\xda\xaa\xc1\x5f\x47\x59\x82\x61\xf5\x49\x31\x35\x0a\x7a\x7e\xaf\xe7\x62\x67\x5f\x2d\xa3\x3b\xad\x9e\x7e\x1d\x47\xef\x05\x7e\x5a\xd6\x93\x5d\x12\xcc\xab\x52\xb2\x4d\xe9\x05\xe4\xd8\xdb\x5f\xb0\xb6\x3b\xc0\x55\x7a\xf2\xe5\xd4\x3c\x0d\xdf\x46\x1d\xda\x2e\x46\xbf\xee\x05\x51\xf4\x2e\x2e\x4a\xb1\x89\xb7\x49\x94\xc7\x1b\x8b\x34\x6e\x8c\xe9\xa1\x33\xb8\x5f\xe3\x24\xf9\xc8\x43\x1e\x7f\x41\x1e\xb5\x78\x90\x6e\x8d\x76\xca\x67\xe5\x07\x9b\x9d\x2b\xd7\x5b\x72\x17\x33\x03\xe9\x12\xf0\x19\x8b\x82\x32\xd0\x2f\x8e\x7b\xe2\xcb\xce\x27\x76\xa6\x03\xff\x0b\x68\xfc\x53\x0f\xaa\x06\x9e\x17\x55\xf8\xa7\xdf\x55\x0d\x7c\x0f\xab\xf0\x2f\x09\xe6\xd9\x94\x94\xc1\x6f\xbb\x4c\x21\x78\xdd\xb1\xf2\x62\x35\xd0\xcf\xda\x54\xa2\x5d\x7a\x1c\xe4\x97\x31\x81\x1e\xbf\x0f\x2c\x24\x11\xae\x6d\x78\x75\x4f\xa5\x1e\x3c\x78\x60\x11\x92\xc6\x35\x60\x0b\x4e\x01\xf0\xe3\xfa\x9a\x99\x2c\x44\x87\xc8\xc3\x5f\x56\xa6\xc4\x84\xc8\x95\x3f\xad\x6c\x89\x04\x91\x2d\x7f\x5a\xd9\x74\xfc\xa2\x0c\xfd\xbe\xbe\x5e\xe2\xb9\xb5\x57\xd3\xa9\x5c\x1b\x14\xa3\x20\x49\xb2\xab\x37\xff\x98\x06\x09\xf2\x68\xd3\x33\xe2\xae\x2b\x71\xea\xac\x04\xcf\x26\xba\xcc\x1e\x6a\x28\xf7\xc0\x5d\x56\x05\x97\x65\x96\xdc\x33\xf5\x34\x3e\x66\x3b\xa4\xad\x9b\x2e\x5b\x7b\x07\xd5\x50\x2e\xb9\x8b\x3e\x66\x3b\xb0\x93\x52\x6e\x60\x1e\xa1\x2d\x9e\x22\xef\x85\xca\xd9\xc3\xb1\x7c\xda\x71\x24\x97\xa0\x77\x96\x8c\x75\xb5\x7e\x86\x5f\x9d\xa9\x51\x50\xfc\x94\x64\x17\x41\xf2\x1a\xd7\xff\x6a\xdc\xd1\x5e\x0a\xd6\x0c\x8a\x4e\x52\x7e\xf5\x8b\x59\x5a\x76\x97\x2f\x0c\xb2\x6c\xbc\xb9\x8d\x0c\x0a\x4a\x4d\xf0\x61\xaf\x70\xe4\x61\xf0\x82\xfb\x6d\x1a\x71\x70\xf4\x87\x2b\xd8\x4e\xf7\xd5\x7a\x93\x46\x9e\x3a\x2a\x95\x82\xb2\xb5\xc5\x5e\x67\x69\xab\x94\xb0\xb2\x8b\x7c\x5a\x8c\x1e\xb8\xb0\xba\x52\x24\x25\xdc\xdb\xad\x06\x41\x58\x14\x96\xbe\xf5\xd5\x75\xc6\xdc\x77\xbe\x29\xf9\x2f\xbb\xb0\x06\x0e\x5d\x5b\xe8\x32\x34\x4e\x26\xf5\x8e\x16\x99\xd5\x91\xbb\xe0\xec\x3e\xd6\x83\xd1\x59\x90\x0f\xc8\xdc\x06\x51\xc4\x70\x83\xb7\x78\xfd\x1d\xc9\x0c\x0b\x7c\x57\x2c\xb5\xc2\x56\x16\x3f\x60\x7c\x39\x1f\x0b\xd1\xd8\x33\xc4\xbb\x92\x8b\x9a\x9d\x85\xac\x39\x44\x04\x7f\x5d\x21\xeb\x97\x74\xbc\x9c\x10\x49\x0a\x7f\x4b\x39\x72\xf1\x28\x19\xd5\x53\x36\x1d\x56\x74\xe4\xee\xc3\x43\xd6\x52\x03\x6c\x79\xfa\x6c\xae\x5f\x8f\x69\x73\x2e\x11\x67\x81\x9f\x78\x89\x87\x0f\xa5\x13\x54\xc1\xa1\x83\x24\x61\xb3\xcd\x60\x16\x17\x2c\xcb\xd9\x1c\x7e\xe9\x5a\xf2\x44\xe2\x1e\x49\xf4\xdf\xbb\xa0\xe4\x45\x89\xa9\xd5\x4a\x27\x32\x00\xb4\x68\x12\xd4\x4c\xf8\x77\x3a\xe2\xa0\x3c\x85\xde\xbd\xbd\xc1\x5d\xc4\x0d\x63\x97\x4a\xdd\xf5\xb6\xe4\xe3\x02\x2a\x2a\xe5\x7b\x21\x6a\xc7\x25\x1f\xd7\xc3\x5a\x18\x5e\xa6\xba\x8d\xa1\x9d\x4b\x91\xc6\x23\x76\x31\x87\xfe\xdf\x46\x2c\x48\x23\x2c\xae\x97\x9e\x39\x8d\xe1\x83\xe1\x1b\x77\x0f\x83\xf6\xe0\x11\x30\xbe\x37\x62\x30\xdf\x1c\x25\xcd\x82\xe7\x31\x2f\xf0\x98\x16\xe0\x4e\xc4\xe2\x82\x05\x93\x49\x12\xf3\xe6\x2e\xf4\x86\x27\x41\xe6\x69\xb4\x46\x07\xee\x09\x50\xff\x1d\x51\x3a\x50\xe5\xb7\x1e\xf8\xd7\xe8\x25\x57\x1a\xb8\xda\x95\x69\x8a\x28\x87\x2a\x83\x9c\x0f\x77\x2b\xa7\x1d\x91\xf8\x5f\x9a\x20\x50\x2d\xb7\xdb\x53\x09\xb6\x04\xe0\x16\x23\xf5\x5c\x7d\x25\x28\x8a\x95\xc2\xd2\x14\xb4\xdb\x7b\x29\x15\x94\xba\x5b\x95\x60\x17\x73\xa8\x4e\x15\xb6\x93\x3d\x27\x1e\x49\x6a\xaa\x3c\x49\xab\x1e\xe8\x6c\x61\x08\xca\x37\xc9\x42\xae\x24\xa4\x2b\x54\x05\x21\xf7\xe9\x61\xf5\xd1\xa1\x29\x87\xd4\xff\xdf\x7c\xce\x0e\x0d\xb2\x1f\xb3\xd6\xdb\xa8\x75\x40\xf7\x26\xc1\x3c\x04\x9f\x28\xc9\x02\x14\xe4\xf8\xd2\xac\x5e\xd5\x20\x5f\xca\x79\x50\x8d\xf4\xbc\xc4\x7b\x44\x35\x65\x1d\xcf\x50\x50\x6d\xfc\xf5\xe6\xc0\x3e\x0e\x02\x50\x1b\x1b\x00\x9c\xba\x37\xb5\xd8\xac\xa9\x0b\x0c\xd7\x90\xf2\xab\xf9\xcb\x19\x2f\x14\x41\x7f\x85\x16\xfa\xf0\xff\xae\x43\x25\x7d\xe7\xbb\xab\xf1\xd9\xd7\xbf\xba\x06\xdf\x7d\xf3\xb3\x96\x90\xfa\xf4\x63\x91\x38\xd9\x6d\x10\x45\x2d\x01\x93\x1c\x72\x1c\x3a\xdf\xd8\x70\xc6\x70\x5b\x5c\x41\x25\x8d\xac\xca\xca\xeb\xb3\x65\x96\xdb\x1a\x88\xfc\x06\xc8\x33\x84\xa5\xee\xd2\x71\xf0\xae\x8e\xd1\xec\xbc\x8d\x5b\xaf\xd8\x74\x2f\xe6\x90\x99\x4d\x44\x6a\xa1\x93\xd5\x32\x33\xcd\x2c\xd8\x8b\x3d\x5b\x31\xd9\x61\xd4\x8e\x0a\x6b\xc1\xfc\x9d\x3a\x0b\x5a\x64\x7b\x7a\x94\xb5\x6f\xb1\x1d\x2f\x16\x03\x5c\x29\xa0\x8b\x97\x7d\x6c\x53\x4a\x23\x5d\xbc\xe0\x63\x9b\xb6\x4c\x52\xd7\x30\xb2\x31\xd5\x30\xea\xb0\x59\x1c\x41\xeb\x29\xab\x69\xc0\x2f\x29\xdc\x4e\x50\x58\x2c\x29\xac\x2d\x28\x2c\x96\x14\xd6\x14\x14\x6a\x25\x05\x9f\x94\xb0\x8c\x98\x80\x8c\x73\x09\x61\xc1\xe6\xb0\x62\x5f\x7b\x52\x11\x19\x04\xa3\xd9\x95\x0c\xa7\xc2\xf5\xf5\xdd\xde\x93\x1e\xf0\xe5\xc5\x3b\xf9\x93\xc6\x9d\xdc\x91\x39\x9e\x34\x88\x26\x6a\xe7\x34\xe5\x9a\x19\xba\x2e\x7a\x3b\xc9\xe0\xc9\x6d\x25\x83\x27\x0d\x92\x81\x56\xdf\xd6\x6b\x6f\x17\x3a\xd4\x24\x03\x3b\xb6\x43\x15\x90\x34\x67\xa2\xe2\x42\xdd\x28\x04\xc9\x52\x17\x54\x3e\x9b\xd5\xb3\x87\x33\xa5\x5e\xd3\x8d\x01\x8f\x90\xfe\x53\x60\x2c\x7a\x06\xa9\x84\xb0\xb5\xc5\xde\x24\xf1\x18\xcd\x00\xa2\xe9\x24\x89\xc3\xa0\xe4\x91\xc5\xef\x1c\x31\x02\xa4\x85\x9c\x47\xd3\x90\x13\xcf\x07\x39\x2f\xe0\x5e\x07\x70\x52\x55\xda\x0d\x20\xfd\xbf\x94\x4a\x1f\xbe\x7c\x3a\x7d\xc6\xa4\x65\x08\xad\xd0\x2b\x2b\x64\x86\xf3\x2b\xc9\x8c\x16\x95\xc9\x6e\x69\xd0\x0c\xbf\x0e\xca\xe0\xf8\x0b\xcf\x87\x49\x76\xe5\xd6\xab\x14\x70\x5b\x28\xc2\x20\xa9\x00\x06\x89\x07\xae\x2e\x4d\xb2\x44\x6b\x98\x67\x7a\x19\x9c\xbb\x6a\x42\xe9\xbf\x8f\x47\x52\xa1\x89\xeb\xda\xd2\xb7\x5d\xf2\xf2\x35\x2d\xe5\x17\x26\x9a\x05\x86\xde\x30\x4e\x4a\x9e\x93\x39\x13\xbc\xbc\xe3\xb4\xa1\x37\x70\x91\x59\x01\x1d\xce\x17\xf8\x79\x60\x55\xbb\xe9\x34\x2d\xd8\x8a\x5c\x51\xbb\x52\x6d\x19\xa3\x56\x17\x08\x2b\x16\x56\xa2\x85\x3c\x65\xeb\x47\x27\x04\x14\x1f\x48\x9d\x72\x20\xe7\xee\x98\x61\x12\xb2\x71\x10\xa7\x95\xa0\x7f\x04\x4a\xb5\x38\x5e\x2f\x2a\x49\xae\x31\x9d\xb2\x16\x60\x08\x9a\xa4\xd7\xea\x34\x68\x80\x56\x65\x09\xa9\xf2\x38\x8a\x40\x1c\x0f\x05\x86\x5e\xcd\xc5\x9a\x01\xb6\x60\x61\xae\xab\xd6\x53\x17\x16\x60\xc7\x81\xd4\x28\x6f\x64\x04\x1f\x1c\xe2\xbc\x25\x84\x63\xca\x75\xaa\xe3\x90\xe8\x55\xd8\x5b\xfd\x12\x3e\x84\xf1\x8c\x82\xe2\xb5\x6e\x0b\xc7\x01\xc3\xeb\x1c\x2c\x31\x63\x06\x8a\x17\x0a\xbf\x7d\xe9\x9e\xa6\x52\x7b\x6b\x8b\xfd\x0a\x97\xc9\x72\xa8\x28\x7d\x8e\x82\x82\xb2\xc9\x92\xcf\xca\x2e\x88\x12\x41\xc2\x30\xf0\x74\xc1\x82\x9c\xb3\x69\x21\x72\x33\x6d\x1e\x85\xec\xa3\x0a\xa2\x0f\xb2\xdb\x3f\x1f\x6e\x77\xda\xdb\x5d\xb1\x20\x3a\xac\x2f\xdb\x74\xd1\x41\x8e\x37\x9e\x69\xf4\x4d\xdb\xd6\x16\xe3\x7a\x6b\x30\x3a\x85\x2c\xd7\xc6\x7f\x7c\x3c\x29\xe7\x0c\x63\x1f\x37\x0c\x0d\x7e\x54\xb9\x0f\x4f\xcb\xdc\x43\xf7\x8c\x38\x9d\x11\x25\xe0\xa2\xb0\xd5\x5a\x5d\x0f\x8d\xfd\x54\xc9\xe3\xa6\x92\xe6\xc5\x11\xce\xaa\x17\x43\xe0\x72\x28\xcf\xb3\xfc\x55\x90\x17\xaf\xd7\x5d\xaf\x73\x0c\x0f\x15\xe4\x05\x1a\x61\x8a\x46\xf1\x22\xc2\xbb\x5e\x57\x63\xee\x6c\x79\x06\x0f\x18\x37\x85\x7a\xa3\x38\xe2\x3e\x2c\x12\xd6\xe1\x93\x30\xd4\x9f\xc0\xaa\x83\x2c\x3f\x78\x9a\x70\x9c\xd2\x9e\xbe\xdd\xf9\xf3\x31\x2d\x4b\xc0\x52\x36\xba\xd6\xd4\xb2\xeb\x6b\xb9\xbb\x03\xa9\x05\xd3\x32\x6b\x75\x7c\xb0\xf9\x18\xfb\xb7\xe6\xce\x64\xcd\x56\xc8\xd7\xde\x91\x0d\x31\x37\x33\x68\x8d\xef\x75\xf8\xce\x41\x5d\xdf\x54\xcc\xdf\xd8\xa0\x52\xbf\xda\x8d\x6b\x92\x7b\xa3\xa0\x80\x4b\x37\x91\xbf\xc4\x72\xdc\xda\xc2\xb3\x1c\x15\xbf\xe3\x82\xb5\xf8\x6c\x12\x40\xa4\x7b\x38\xf9\xe1\x58\xc7\xc1\x9c\x5d\x70\x16\x06\x49\x38\x4d\x50\xde\x2d\xd8\xd9\x76\x97\xed\xf4\xb6\xcd\xdf\xee\x79\x1d\xa6\x2c\x11\x1f\x1c\x6a\x63\x27\xec\x05\xb6\x72\xce\xfa\x2b\x13\xc6\xc4\x25\x0c\x72\xf3\x88\xa4\xe1\x43\x56\x83\x52\xc7\x56\xe2\xf8\x67\xea\xce\x85\x8f\xcc\x1d\x05\x70\xa9\x5f\xe3\x72\x74\x12\x8c\xf9\x9d\x33\xb5\x3b\x64\x69\x82\xa1\xa1\xa9\x39\xb8\xd4\x74\xd0\x55\x91\xdf\x96\xa3\xcc\xd3\x8c\x45\xbc\xe4\x61\xc9\xae\x38\x98\xd0\x8b\xff\x71\xd0\x37\x80\x5f\x1e\xf9\x28\x81\x25\x71\x0a\x3a\x89\xac\xe0\x52\x8b\x15\x24\x57\xc1\xbc\x38\x19\x65\x57\xa2\xb4\x00\xe9\xae\xa7\x8a\x4b\xbf\xe7\x02\x3c\xf3\x3c\x02\x9d\xcf\xa9\x5d\xcd\xd1\x35\x63\x9f\x4a\xdb\xd8\xc4\xf7\x05\x8a\xc8\x29\xa8\x17\xd5\x32\xfe\xb5\xc7\xf1\xd2\xec\x9f\x27\x13\x1e\xc6\xc3\x98\x47\x15\xf0\x2d\x30\xc8\x40\xdc\xd3\xdf\x22\xe6\x6a\x8f\x53\x59\x4e\x52\x9b\x04\x75\x20\x76\xdf\x07\x41\x60\x60\x89\x37\xab\x02\x3d\x13\x57\xf0\xe3\xd1\xf5\x7a\xe9\x40\x89\x7f\x6e\x6e\x65\xeb\xea\x57\x93\x2a\x2d\xda\xf2\x73\xdf\x4d\x70\xcb\xe3\xb3\x02\xd2\x41\x15\xe1\x2e\x75\x90\x8d\xa9\x6f\x7d\xb9\x25\x51\x87\xd1\x97\xff\x3a\x47\xcf\x8e\x35\x5b\xd6\xdc\xe8\xe0\x06\x62\x32\x88\xbe\xba\xcb\xbe\x52\xf9\xef\x1e\x95\xd6\x82\xdd\x74\x4d\x75\x30\x37\xff\x1c\xa7\x91\xae\x12\x65\xbc\x80\xb7\x33\x92\x17\xb2\x38\x45\xeb\xd7\xbb\xd1\x70\xaf\xab\xa4\x86\x8b\x28\xc9\x0e\x6e\xe0\xa6\x82\xc9\x7b\x0b\xa6\xed\xf6\xff\xad\xdb\xfe\xdf\xa4\xdb\xd6\x7f\xab\x2b\xb9\x81\xc4\x96\xd2\x72\x5b\x77\x63\x83\x9c\x0f\xf7\x5c\x35\xb7\x57\x57\xbd\xd7\xa8\xab\x06\x1a\x52\x05\xc5\x47\xa3\x2a\x7b\x6f\x49\x55\xf6\xde\xf2\xaa\xec\xbd\x5b\xaa\xb2\xf7\x6e\xab\xca\xde\xbb\x27\x55\xb6\xa3\x9d\x76\x55\x93\x15\x43\xc0\x65\x14\x93\x8b\xee\x31\x57\xbf\x83\x34\xfc\xbc\xe3\xa0\xa0\x41\x37\x48\xcb\xfd\x31\xda\x77\x0b\x02\x39\xa9\x32\x3a\x30\xfe\x09\x89\x91\x3c\x5d\x50\x1c\x53\x5a\x23\xc5\x85\xad\x94\xea\xd6\xd5\x93\x6e\xba\x0b\xbb\xae\xe0\x12\x8e\xc6\x2a\x1b\x02\x5a\x17\xf5\x3f\xd7\x6d\x60\x45\x8b\xc3\x36\x75\x3e\xb7\x3a\x97\x92\x9e\xdb\xa9\x7d\xcb\xe0\x9c\x04\x6e\x7b\xdf\xb0\x50\x05\x7f\x3b\x0d\x31\xcc\xd2\xe3\xc7\x07\x8b\xd4\xc6\x1e\x05\xef\xbf\xf6\xe1\xfb\x1e\xf4\xd2\xdf\xf6\x80\xfb\xa7\x3b\x20\x79\xa6\xea\xce\x51\xbc\xe8\x28\x24\xb8\x93\xf5\x2e\x54\x1f\x88\xfe\xef\x3c\xef\xeb\xb3\x3b\x9a\x51\xd9\xa8\x59\x7c\x36\xfc\x33\x53\xd8\x5d\x1f\x54\x17\x9e\x4b\xed\xee\x3d\x08\xad\x1e\x6e\xc5\xb4\xc8\xa7\xf9\xd5\x23\xa5\x8a\x95\xd7\x27\x8f\xe0\xcf\x54\x67\xc0\xbf\x7c\xe9\x67\xb8\xaf\xfe\x85\xed\x9e\xdf\xee\xa0\xec\x1e\x62\x6b\x97\xca\x7d\x1c\x65\x61\x13\x2d\x60\xc5\xce\xa5\x4a\x1a\x64\xf8\x34\xb3\x2d\x0a\x4d\x59\x51\xc6\xee\x8e\xbd\x60\xad\x0b\x50\x46\xf6\x59\x2b\x89\x53\x1e\xe4\xad\xee\x9d\x1d\x98\x97\x3a\x31\x7b\x8f\x06\x61\x19\x7f\xe1\xc6\xe7\x40\xe3\xe1\xc0\x29\xdb\x2e\xd1\x91\xe0\x69\x1c\x7e\x2e\xba\x2c\x80\x6c\xc9\xfa\x61\x53\x3c\x06\xaf\x2a\x7e\x21\x98\x98\xaf\x63\x9a\x23\xe2\xe2\x25\xd3\x21\xa3\x7d\x9c\x91\x2e\xce\x1d\xa3\x49\xcf\xb5\x15\x46\xe2\xc1\xfe\x0e\x0f\x59\x6b\x94\xe5\xf1\x3f\xb3\xb4\x0c\x92\x8a\x36\x90\x86\x8a\x82\x96\x7a\xa1\x1e\x26\x78\x5f\x50\xe3\xe9\xcd\x55\x38\x2c\x89\x59\xb3\xab\xd3\xae\x54\x34\xdc\xc6\x8e\x74\x9b\x18\x9c\xca\xed\x77\xa9\x8e\x42\x51\x2b\x0e\x2b\xfd\x80\x71\x87\x8a\xe3\xe7\xb6\x5c\x95\x97\x06\x3a\xfc\x9e\x06\x0a\x53\x0e\x96\x60\x54\xb2\xc6\x32\xbb\x94\xcf\xeb\x9a\xe2\xb3\x13\x91\x76\x9a\x69\x3f\x7c\xc8\x5a\x35\x3c\x21\xa1\xaa\x5e\x38\xef\x2a\x98\xbb\x72\x9c\x1d\x8f\x76\x0e\xe3\x59\x61\x7e\x57\x06\x9e\xea\xab\x8a\xce\xe2\xab\x5d\x7a\x10\x3a\x46\xa1\xa7\x09\x95\x20\xe0\x4a\x94\x6b\x48\x21\xe1\xc0\xb3\x94\xff\x14\x38\x54\x28\xf4\x63\x50\xe2\xcf\x41\x5f\x05\x7b\xcd\x16\xa7\xae\x57\x93\xa5\xb4\x78\x71\x8a\x7e\x34\xa4\x0e\x6f\x9c\x4d\x05\xed\x4b\x05\x5c\x97\x46\xb0\x41\x4e\x2c\xea\xc8\x42\xa8\xb4\x8b\x31\x6d\x91\xc2\x0e\x3c\x85\x30\xa5\xb4\x81\x0f\x7c\xb8\xbe\x8c\x32\x06\x9e\xb6\x58\x87\xa5\x26\x25\x0c\x94\x7e\x9b\x0e\xb3\x26\x16\xab\x0b\xb5\x01\x98\xca\x4b\x21\x75\xd0\x47\x6f\xb1\xf6\xa2\x77\xc2\xfa\x54\xe6\x03\x0c\xed\x55\x55\x6d\x08\xb7\x98\xde\xaa\x3e\x25\x49\xd0\x72\xd9\x0e\xc6\x2f\xb4\x81\xb3\x0f\xd4\xcb\x59\x98\xf8\xfa\xc2\x00\xb0\xfa\x52\x10\x44\x34\xe2\x24\x07\xba\x06\x6c\x75\xdd\xe1\x39\x20\x28\xca\x57\xbb\x4f\x9c\x7e\x14\x29\x6d\x8e\xde\x6c\xfe\xa7\xcb\xe4\xaf\xdf\x48\x45\x3c\x85\x7a\x76\xb3\xe5\x10\x8e\x6f\x40\x77\x1b\x1e\x9b\xce\x88\x03\x19\x2c\xdc\x9b\x39\xee\x63\xf0\x6f\x5e\x2d\xa8\x92\xdc\x07\xe5\xc6\x51\x0e\x5e\x9d\xc3\x5b\x93\x8d\x0d\xd3\xd7\xc6\x86\x6e\xae\x7a\x48\x9f\x9d\x48\x9b\xba\x15\x2d\x82\x02\x45\x1c\x2f\xd3\xb9\x94\x96\x8f\x87\xd8\x96\x0c\xf9\xa8\xba\x56\x86\x7a\x76\xff\xf3\xfb\xee\x7f\xde\xdc\xff\xec\xef\x32\x7a\xbb\x44\x84\x40\x1c\xfc\xea\xc5\xa9\xd8\xd8\xd9\x0b\xfb\x5b\x13\x50\x47\x9b\x2d\x39\x03\x52\x0d\xce\x75\x83\x73\xa7\xc1\xb9\xaf\xc1\xdf\x3a\x3e\x3b\x28\xdf\xfe\x01\xaf\xc6\x11\xee\xbe\xfc\xb7\x2b\xbb\xed\xab\xee\x6b\xd8\xb4\xa1\xd2\x27\x0d\x54\x5a\x0a\xf9\x4b\x53\xde\x93\x5e\x96\x47\x3c\xe7\xd1\x29\x95\x00\x2b\x5a\x5a\x52\x5e\x8a\x71\x55\xa5\x2f\x95\xef\xaa\xe5\x21\xd9\x91\x0c\x27\x99\xf6\x3e\xa1\x99\x82\x84\xe3\x43\x56\xe8\xcd\xce\x59\xfc\x44\x74\x5c\xe3\x44\x78\x61\xf3\x22\x94\x88\x05\x90\xd8\x30\x46\x0b\xcf\x8a\x2e\xe2\x0b\x0f\x6a\x1d\xf7\x79\x0f\x81\xe4\x87\x43\xb6\x0d\x86\x14\x64\xb8\x1e\xad\x19\xd4\x50\x81\xbc\x6a\x25\x62\xb7\x21\x2b\xb3\x87\xee\x05\xbd\x2d\x7f\x08\xe6\x49\x16\x44\xe4\x8d\x8c\xc4\xa7\x74\x78\x45\x41\xae\xd8\x7b\x06\xce\xa9\x80\xbe\xb4\xa9\x1c\x18\x9a\x4e\x0a\x4b\x11\xb9\x4d\x63\x88\x7e\x84\x55\xea\xa1\x69\xdb\x9e\xc2\x80\xc4\x3e\xfd\xe8\xda\x48\xe8\xdb\x9f\xdd\xca\xf8\xfa\x95\x94\xa5\x45\x21\xca\x1b\x16\x5d\x62\x82\xf7\xb1\x32\x63\x17\xdc\xe8\xcb\x95\x54\x23\x27\xd9\x23\xd7\xa8\x2b\x29\x4a\x63\x8c\x31\x9c\x08\x73\x23\x65\xc9\x2c\x46\xc2\x51\x8f\x6e\x9c\xbf\x53\x02\x51\x36\xac\xf4\xde\x20\xf3\xd8\x64\xd4\x24\xf8\x34\x10\xdc\xa2\x7b\x27\xe2\x60\xc5\xce\x5b\xfb\xd2\x84\x78\xb8\x21\xbd\x34\xad\xe7\xbf\xb2\x6d\xf0\x98\xe2\x00\x59\x4d\x52\x11\x22\xaf\xaf\x99\xc3\x0f\x7c\xb7\x23\xb7\x93\x3b\x64\xfe\x9a\xaa\xfa\x51\x1c\x71\x5b\x51\x2f\xf5\x74\xce\x09\x5b\x24\xd6\x9c\x72\x5d\x6d\x85\xe7\x60\x45\xcd\xf6\x77\x9b\x5f\x20\xf8\x5f\x16\xec\xd6\x3d\x2d\x48\xa5\xb7\x42\xab\x6c\x4a\x3c\x16\xaa\xbf\x69\x1a\x97\x95\x82\x22\xd1\x2d\x88\x47\x92\x12\xbc\xed\xd9\xa5\x75\x0e\x15\xc4\x4c\xd8\xc4\xa6\x48\x89\x88\xa3\x4e\x97\x9d\x59\xbc\x6e\xd5\x17\xa9\x9f\x95\xec\xf3\x21\xe7\x85\xd2\xd1\xbd\x2c\xcb\x3c\xbe\x98\x96\xbc\x20\xea\xca\xca\x69\x4f\xe2\xb1\x6f\x8c\x1a\x05\x12\xfa\xf0\xff\xae\x19\x7c\xdf\xfc\xb4\x11\x24\x70\xdb\x47\xb4\x5f\x5f\x33\xef\xac\x40\xc0\xbb\xd5\x6d\xf0\x72\x35\xb8\xf7\x81\x38\x51\x26\x59\x7e\x3c\x94\x1e\x26\x05\x8d\x5b\x83\x73\x54\x1c\xc0\x70\x56\xed\xf7\x4a\xf5\x0b\x82\xd4\xab\xf9\x6b\x49\x89\x55\xd5\xb9\xb5\xe5\x6a\xf3\x50\x07\x9a\x89\xda\x69\xea\xab\x5a\x5b\xca\x79\xc7\x52\xf8\x9d\x9d\x77\x16\xeb\xf5\x7e\x84\x39\x5a\x78\xdf\x4f\x8a\xa9\x2b\xe2\x70\x9a\xe7\x3c\x45\x7f\x28\xde\xa7\x6d\x4f\xfc\x4f\xdb\x2a\x7c\x99\x36\x74\x8b\xc7\xe8\x56\xb5\xda\xeb\xfa\x4c\x9d\x5f\xad\xe2\x99\xc7\x5d\x17\x71\xc5\x65\x95\x55\xe9\x0b\xcc\x00\xac\x3a\xb7\xb0\x06\xa8\xd4\xf3\x1b\x05\x5c\x04\xf9\x49\xfc\x4f\xae\x2f\xfc\xe5\x77\x8d\x0f\xb3\x7a\xcb\x81\x8b\x20\xff\x09\x8e\x86\xba\x99\x9f\xdc\xf3\xe3\x45\x90\x4b\x75\xf4\xdc\x29\x4a\x92\x9d\xf7\x88\xe0\x5d\xe9\x7d\x30\x7b\xe5\x80\x39\xd6\x49\x0e\x15\x0c\xa4\x11\xc9\xcf\xc1\x98\xbf\x9a\xbf\xb3\xb4\xbd\x9e\x2c\xa9\xcb\x74\x16\x08\x78\x0a\x8e\x43\x55\x58\xb0\x5b\x4f\xdd\x9e\x53\xcc\x61\x35\x42\x3c\x5f\xd0\x00\x2d\xe3\x8c\x63\x14\x14\xaf\x82\xdc\x27\x25\x60\x8e\xf3\x18\xdd\x39\x6c\x14\xf1\x3f\xc1\xe9\x0a\xfa\xa8\x12\x0d\x6d\x6c\xac\xcc\x7d\x62\xc5\x7d\x24\xc6\xa1\x61\x60\x3d\x5f\x15\xf9\xf4\xd5\x8f\xfa\x37\xe5\x15\x5b\x0c\xe4\xe2\x3c\x52\xcb\xf5\x8c\x6a\xd4\xdd\x0b\xc0\x2c\x7f\x13\x84\x23\xe7\x06\xd0\x09\xa8\x6c\x9a\xf6\xbe\x9c\x7b\xb2\x9c\x81\xca\x5a\x4f\xdf\xbb\x70\xf5\x58\x39\xa2\x0c\x44\xaa\x7e\xe4\x68\x2e\x1e\x1b\x24\x0c\x53\xa3\x4e\xbe\x80\x7d\xc6\x5a\x1a\xb4\x92\x77\x81\x48\x1f\x66\x86\x6c\x81\x2b\x91\xdb\x52\x97\xf0\xd1\xb5\x45\xe5\x65\xa2\xa2\x5b\xb7\xba\x45\xf3\x35\x75\xc5\x89\x14\x75\x60\xb6\xfb\xe3\x7a\xf9\xd0\xfb\x20\x88\xc6\x10\xd9\x73\x2e\x09\x6c\x8b\x11\xca\x08\xcf\x50\x7d\x4e\x5d\x77\xbc\x0f\x26\x36\x90\xd2\xfe\xc6\x19\x5a\xb5\xa2\x3b\x38\xd3\xaf\x1c\x9b\xd4\x73\xc9\x9f\x67\x71\x74\xbe\xcc\x65\x86\x1c\xb4\x76\x26\xb6\x07\x1e\x3a\xaa\xd7\xb0\x3a\x5f\x22\xa8\x67\x3b\x7b\xe8\xdc\xa2\x86\x18\x0d\x1c\xd8\x5b\xab\x5f\xf4\x4f\x15\x93\x80\x86\xe8\xfb\x24\x80\xa6\x63\xee\x8a\xf7\x9c\x5b\x46\xc7\xe4\xd6\xa6\x30\x89\xca\xe3\x8b\xdf\x2d\xe2\xf2\x52\xa4\x52\xe1\xf8\x2a\x98\x21\x56\xaa\x02\x8f\xd2\xac\xa2\xc1\x34\xc6\x5a\x37\x15\x0b\x19\x3b\xd7\x7a\xa5\xb2\x2a\x4e\x4b\x85\xd3\x13\x03\x22\x5a\x50\x20\x66\x91\x07\x36\x00\x41\xb2\x2a\x18\xbe\x08\xd2\x48\xf2\x8d\x55\xe1\xbb\x34\x1b\x03\xb6\x45\xa7\x5d\x61\xbf\x6b\xe6\xa6\x02\xc3\xd8\xe2\x5e\xab\x3c\xe2\x73\x98\x60\x87\xbd\xa8\xca\x0c\x7d\x97\x55\x56\x51\x91\x7f\xc8\x8a\x18\xb8\xce\x5d\x6c\x98\x23\xb2\x61\xea\x86\x71\xc3\xf4\xc8\x4c\x7d\xf9\x6f\xd7\x11\x90\xfa\xce\x77\x57\x4f\x59\x5f\xff\xea\xea\x9d\xbe\xaf\x7f\x9d\x19\xee\x7c\xde\x25\x28\xee\x93\xdf\x35\x1a\x23\x75\x47\x23\x78\x72\xc1\xa3\x1f\x53\xc9\x03\xe1\x35\xaf\xe0\x85\x60\xf1\x47\x3f\xc4\x3e\x0a\x3c\xbc\x40\xf2\xac\x9c\xce\x49\x63\x4d\x2c\x7c\xdf\x61\x8d\x96\x70\xd0\x9b\x4c\x8b\x51\xc5\xc4\x44\xba\x55\xb4\xdf\x4a\x98\xde\x6c\x4f\x90\x92\x27\xc0\xfe\x4e\xb7\x7d\xe7\x0c\xd4\xb5\xfc\x8b\x77\x3d\x47\x52\x31\xf2\x3e\x1a\xef\xfb\xe6\xc3\x81\x91\x51\xda\xea\xd3\x8f\xae\x3c\x41\xf4\xe5\xbf\x5d\xca\x87\xfa\xf4\xa3\xeb\x58\x86\xac\x63\x18\x5b\x85\x2f\x4b\x05\x8a\xe1\xda\xef\x1d\x0f\xbe\xac\x71\x48\x8d\x50\x35\x9d\x8d\x2f\xe2\x94\x43\x34\xb0\xbf\x05\x69\x94\xf0\x5c\x32\x04\x29\x84\x8d\x20\xd1\xee\xb4\x0b\xba\xa4\x2e\xd9\x6f\x7b\x59\x6a\xb2\x3b\x8d\x60\xbf\x49\x41\x29\xf0\x6d\xc1\x86\x4e\xeb\xc1\x86\xec\x8e\x03\xf5\x8d\xd8\x05\x35\x59\xee\xcb\x88\x1d\xf6\x1f\x9c\x9f\xa1\xbd\xcf\x7c\xce\xae\xaf\x59\x4b\x7c\x6c\xb6\xd8\x63\x94\x75\xdd\x26\xeb\x77\xf9\xfd\xae\x7b\x8c\xd1\xab\xc0\x15\xf3\xce\x1b\x84\x85\xfd\xae\x75\x92\xe9\xfa\xb7\xe3\xe6\x06\x5a\x41\x1a\xe3\x5d\xfa\xdb\xa8\xd5\xd5\x07\x62\x22\x13\xec\x77\x2a\x73\x0c\x3c\x5b\x92\xf0\xaa\xca\xa8\xcc\xd8\x3b\x1e\xe9\xe6\xe8\xde\x69\x1b\xb9\x57\x60\x30\x8b\xfd\x81\x3d\x91\xb6\x4a\x91\xa6\xbb\x4a\x50\x8b\x91\x2d\x56\x9b\x1c\x4d\xf3\x22\xcb\x75\x58\xcb\x26\xd5\x89\x53\xb4\x7d\x1b\x4b\x27\x5a\x0e\x6f\xbc\xf6\x1a\xee\xde\x3c\x37\x2c\xb2\x52\xcf\xcd\xaa\x51\x92\xa8\xe2\x3e\xfd\x08\xb9\x99\x7b\x65\x64\x12\x55\xc3\x93\x5b\x39\x29\x27\x43\x59\xc9\xd7\xd4\x16\xdb\xad\xce\x0a\x5d\x78\x45\x99\x67\x9f\x79\x9f\xb5\xd2\x2c\xe5\x96\x49\xdc\x30\x4e\x92\x3e\x6b\xfd\x67\x18\x86\x56\xfa\xac\xcf\x6a\xcc\xba\xd8\x8b\x0a\xb2\x7a\x33\xb6\x69\x60\x54\xec\xbe\x97\xf0\x61\xc9\x1e\xb3\xed\xde\x3e\x6d\x79\xde\xd4\xb2\xac\x59\x66\x13\xac\xc8\xaa\x37\x41\xbd\x39\xe9\x8c\x36\x0c\x2e\xdb\x9b\x1a\xf7\xa1\x4e\x03\x8b\x0e\xdf\x37\xd9\x0e\x6d\x12\xfd\xbc\x2f\x01\xb0\x74\x08\xbf\xc9\x76\x58\xdf\xd7\x8f\x59\x3f\xcb\xae\x8f\x0f\x59\x9c\x96\x8d\x7a\x45\x5a\x6e\xcd\x95\xb1\xbf\xca\xca\xd8\xbf\xdd\xca\xd8\x97\x2b\xc3\x21\xed\xd9\x4e\x8d\x3b\x99\x79\x5d\xc6\x6c\xb7\xae\xc6\xae\xef\x31\xc2\xd2\x16\x8a\x00\x49\x95\xb4\x29\x1f\x84\xae\x67\x96\xb3\x73\x00\xd3\x90\xad\x95\xb5\x6b\x65\xb1\xc7\x36\xb5\x78\xfd\x2f\x2e\x61\xe0\x38\xf7\xc2\x39\xaf\xf4\x3c\xb7\xe0\x9c\x11\x38\xc5\xc2\xac\x0c\xcb\x5e\xb4\x74\x55\xf8\xbd\xe1\xaf\x74\x96\xa9\x80\x1d\xce\x3a\x70\x73\x77\x47\xad\xcd\x3b\xcd\xe6\xa9\x4d\xa6\x9c\xe1\xcc\x87\xd7\xd0\x23\x50\x86\x73\x6f\xc9\x8a\xfa\x8a\xb1\x38\x4d\x79\xfe\x51\x19\x36\x56\xaa\x90\x6c\x8f\xfc\x37\x2d\x9b\xea\x92\xec\x6a\x5d\x65\x22\x59\xa9\x55\x35\x95\x54\x6f\xb1\x52\x8e\xbc\x64\xa9\xc3\xf2\xed\xed\x23\xc3\x59\x97\x85\xe2\x70\x41\x86\x2c\x4d\x22\xab\x1a\x26\x18\xdb\xb7\x80\x86\x22\xd1\x0b\x0d\x2c\x1b\x83\x1c\x9b\x1d\xc8\xb5\x48\xb2\xe7\x07\x55\x56\x65\x06\x53\xa9\xed\x64\xcf\x3d\xc6\xc8\x9e\xf3\xe4\xf2\x84\x3a\x58\x9e\x52\xf3\x5a\x42\xcb\x6b\x68\x0c\x9e\xf8\xbe\xac\x23\x34\x93\x5b\xad\xc9\xd3\xa8\xb6\x9e\xca\xf3\xd0\x28\x34\x79\x9f\x54\x31\x10\x64\x31\xa0\x36\xbb\x66\x14\x1e\x2a\xe5\x69\xf4\x6d\xa1\x51\xb8\x71\x7d\x4d\x78\x24\x3e\xf1\x37\x01\xd1\xa0\xcf\xce\x0c\xe2\xba\x1a\xe8\xca\xdb\x90\x70\xd6\x67\x03\x5c\x17\x7d\xda\x6d\xdf\x83\x8c\x3e\xf9\x6d\xc0\xea\xeb\x5f\xf6\x51\xa2\xe6\x24\x51\x91\x58\xcf\xc0\x62\x7f\xb6\x03\x96\xfa\xf3\x1d\x10\x8e\x20\x65\x17\x53\x76\xd9\xcd\xf9\x12\xaf\x2d\x9c\x1b\xa8\x45\x4f\xb1\x7d\x57\x65\x8e\x49\xf0\x52\xe2\x83\x7e\x75\xe0\x9c\x3c\xfb\xac\x05\xb6\x90\x2d\xfb\x94\xd9\xd7\xfe\xc9\x6f\x56\x15\x04\x1a\x7a\x9c\xf9\x7b\x9c\x2f\xdb\xa3\x7f\x9f\x6c\xe8\x10\x69\xc4\xdf\x2b\xf0\xd5\x6a\xcf\xd5\x13\x8b\xa7\x5d\x53\xb7\xd2\x2c\xe9\x72\xa1\x58\xed\x31\x62\xac\x8f\x27\xd1\x64\xf0\x78\x9b\xa7\x36\x2b\xd3\x90\x79\xb4\x52\x17\x4b\x62\x79\xea\x30\x8f\x6a\x96\x69\xab\x71\xde\xdd\xf7\x16\xf5\x33\x59\x79\xe0\xd2\x38\x39\xd2\x46\xbc\x76\x42\x94\x0d\xf9\xac\xcb\xe6\x77\x3e\x01\x42\xfa\x5c\x02\x9b\x20\x95\xa8\x03\x0d\xb1\x86\xab\x9c\x69\xd4\xe3\xfa\xb7\x08\xb4\x38\x2f\xb0\x1f\x6c\xe9\x7a\x63\x83\xcd\xd8\x5f\x9b\x24\x6e\xb0\x5e\x26\xd5\xc4\xe9\x01\x92\xfe\xda\x7c\xa0\xa8\xce\x99\x01\xe4\x85\x64\xa6\xc8\x4b\xd9\x4d\xc5\x8e\xda\x6b\xaf\xfc\xb4\xe9\x64\xa8\xd6\x26\x35\x98\x7f\xda\xa3\xc9\x76\x05\xb3\x62\xed\x1a\x56\xba\x3b\x6f\x56\x2f\x1b\x1b\x76\x23\x1e\x3b\x5e\x55\xfc\x1e\x6d\xdb\x29\x48\x5e\x93\xda\x55\xc5\x01\x54\xd4\x4a\x7a\x3f\x1e\x9e\xf0\xb0\xcc\x72\x65\x87\x40\x27\xaf\x6b\xc6\x79\x4b\x6b\xd8\xca\xea\x43\xaf\x8b\x5f\x78\x5a\x16\xc7\x43\x19\xd2\xb1\x76\x29\xfa\x0a\x57\x74\x0f\xc4\xc3\x06\x59\x95\x35\x6e\x36\xa4\xb2\x04\x6e\xfc\x56\x0f\x12\x11\xeb\x20\x11\xa0\x04\xf5\x87\x89\x68\x68\x75\x67\x30\xd0\x61\x84\x06\x92\xef\x1b\x52\x50\x7e\x1d\x44\x7b\x07\x3e\xe8\x11\x23\x46\x3b\xf7\x56\x5e\x28\xd9\xc1\x94\xe5\x1b\x91\x17\x16\xcd\x52\x6d\x7a\x1f\xf1\x85\x7a\x78\xa2\x83\xaf\x16\x7f\x9f\x7d\xe1\xd5\xd2\x10\xef\xb4\x5a\x58\x5e\x7a\xb8\xa5\xf1\x5a\xc2\x2a\x7e\x9a\x4d\xc3\x51\xa5\x6d\x9d\x4a\xa4\x86\x3e\x84\xd4\xa0\xa8\x80\x73\x8c\x46\xc4\xaa\x13\xc9\xe5\x44\x26\xaa\x31\xd7\xae\xb2\x62\x2f\x8c\x30\x1e\xeb\xde\x3d\x0a\x6a\xeb\x9a\x8c\xc0\xd9\xb5\xe7\xaf\x12\x15\xd6\xb2\x1b\x3f\x1d\x71\xa6\x42\xa3\x81\x9f\x5b\x3e\x9b\xf0\xb4\x88\xbf\x70\x56\x66\x2c\x87\x80\x8c\x2c\x4b\x59\x12\xe4\x97\xda\x17\x51\x49\xbc\x30\x15\x19\x9b\xe4\xd9\x97\x38\xe2\x60\x60\x1e\x5c\xc4\x49\x5c\xce\x45\xe5\xa2\xcc\x72\x48\x1c\xb3\x38\x95\x81\x61\x83\x34\x62\x59\x9a\xcc\x55\xe4\x3a\xc8\xc5\x17\xd1\x3c\xe4\x45\x11\xe4\x73\xd3\x74\x39\xe2\x73\x80\x29\xe2\x13\x01\x48\x5a\xb2\xe9\x24\x43\x43\x76\xf4\xc4\x24\x9a\xa3\x0e\x93\xac\xba\xd2\x4d\x52\x91\xb1\xb8\x6c\x15\x2c\x1e\x4f\xb2\xbc\x0c\xd2\x92\x95\xa3\xa0\x44\xb7\x5d\x63\x5e\x8e\xb2\x08\xfd\xaf\x24\x09\x8f\xd8\x20\x18\x96\x3c\x1f\xd8\xed\x20\xe8\x71\x21\x81\x8e\xd8\x55\x5c\x8e\xc0\xcf\x9f\x8c\x2f\x9b\x97\x5b\x12\x8a\x38\x24\x51\x25\x4c\x2b\xfe\x70\xb7\xfa\x4f\x4c\xc2\xc4\x89\x7d\x7b\x21\x5d\x0e\x0f\x33\x19\x13\x54\x85\xbf\x15\xcb\x6d\x1c\xf8\x22\x5f\xfc\x4b\x3b\xae\x72\x3a\xd0\xb6\x97\x06\x43\x92\x64\xe2\x26\x77\x57\x38\x55\x3f\xab\xb0\xbf\x40\x86\xdc\x3c\xc9\xac\x7b\x70\xb0\x74\xa4\xc0\xda\x2d\xe4\x16\xb1\x06\x73\x3e\xdc\xf7\x9a\xc7\xee\xf9\xcd\x63\x27\x24\xf6\xfb\x7e\x5d\xd8\xdc\x8a\x03\xaa\xfd\xdb\x3a\xa0\xda\xef\xd5\xdf\x37\x13\x4b\x58\x2c\x4a\xe2\xd1\xaa\x32\x6b\x05\x13\xfd\x07\x30\xc8\x2f\x41\x12\x8b\x76\x7f\x15\xd2\xe2\xdf\xf0\xf2\x41\x8a\x09\x76\xf4\xf0\xce\x0a\xef\x57\x97\x8b\xf5\xb0\x84\xc1\xec\x82\x70\x10\x55\x44\xeb\x52\xd5\x88\xc6\x39\xff\xc2\xf3\x82\x03\x7d\x1c\xe7\x11\x3c\x10\xc0\xb2\x95\x9c\x25\xcc\x65\x77\xef\xc9\x5e\x76\x77\x6d\x83\xd9\xdd\x26\x8b\xd9\x8a\xfd\xf7\x3d\x06\xd5\xfa\x49\xf5\x05\x12\x95\x6b\x7c\x6b\x99\x93\xaf\x6a\x97\x50\x58\xc6\x5f\xd8\xdc\xab\xb9\xb4\xba\x44\xc3\x7f\x8f\xab\x9c\xca\xa5\xbf\xb4\x54\xb4\x15\x04\x3a\x91\x12\x5c\x95\x8a\xdc\x17\x8c\x77\x61\xb9\x09\x06\xa8\x38\xc3\x7e\x5b\xcc\xc5\xae\x0a\x1a\xfc\xd2\xc0\xf3\x1a\xc9\x06\x7b\x9e\x08\x7b\xd6\x6b\x3e\xd1\xfd\xed\x42\x65\x34\x84\x1e\x73\x06\x23\x44\x5a\x77\x26\x6c\x83\xc1\x7b\x8f\x8b\x61\x47\x86\x75\xfd\xb4\x54\xcf\xec\x5a\xb5\x83\xf4\x50\x6b\x3f\x65\x5b\x48\x35\x23\x4c\x80\x41\x3a\xc5\xb5\xd0\xfb\xcc\xe7\x45\x5b\xb6\xd8\xf1\xd8\x76\x7f\x76\xe3\x5e\x28\x9b\x93\xcf\xe0\xc6\x49\xda\x54\x38\x73\x4b\xcb\x74\xb5\x51\xd5\x67\x3e\xef\xe5\x7c\x92\x04\x21\x6f\x03\x79\x75\x59\xab\xd5\xe9\xa2\x5f\x06\x31\x2b\x14\x47\x0e\xbd\xab\x15\xa3\xc2\xdb\xf8\xad\x4a\x1d\xfb\x61\x38\xf8\x80\x09\xac\x79\xe7\x4f\xdf\xc4\xfe\x84\x81\x1f\xb2\xbc\x4d\x9a\x77\x27\x46\x19\x8d\xfc\xe4\x7d\x6a\xe8\x7f\x36\x53\x6b\xee\xb6\xba\xb1\x98\x27\x0c\x38\xa5\xc4\x45\xfe\x1b\xeb\xa3\xcb\xd9\xa6\x6f\x64\x02\x1a\xcf\x27\xa4\x6b\x3f\x82\xfa\x35\xe9\x8b\x63\x0f\x7a\x6d\xf1\x3c\xa0\xd3\xf5\xa4\x66\x59\x63\x9b\x1c\x91\xf4\x19\x89\xf1\x22\x89\xd3\x72\x33\x8a\x8b\xe0\x22\xe1\x8c\xa5\xd9\xe6\x54\x9c\x86\x8a\x30\xcb\xf9\x66\x84\x77\x91\xb5\x12\x25\x89\x83\x5c\x2b\x33\x5a\xb1\x92\xc9\xb2\x69\xd8\x71\x9e\xca\x1d\x07\x8f\x76\xe6\x5d\x39\x1c\xc9\x8f\xb8\x38\x57\x8b\x2d\xa6\x97\xa5\x4d\xfb\x56\xb5\x15\xd4\x08\x9c\xfc\xf6\xf3\xd1\xe0\xcd\xdf\xdf\xfc\x7c\x2a\x1a\xb1\x4e\xa2\x1f\x79\xc8\xe3\x2f\xfc\x64\x9e\x86\x95\xf3\x68\x73\x70\xea\xa5\x61\x2e\x78\xf9\x3e\x98\x29\x8c\x14\xcd\x31\x9c\x97\x6e\x75\x30\x26\x6d\xda\xcc\xe9\xee\x61\xbe\x0b\x34\x58\x00\xb3\xc7\x6c\x67\xf9\x00\xd3\x76\xcc\xe6\x5a\xba\x73\x43\x3b\xdf\x2d\xe9\x39\xad\xff\x9b\x0c\xff\x37\x90\xe1\x66\x03\x19\x3a\x1a\xa5\x23\x25\x8d\xa0\xdf\x74\x94\x54\xb2\x21\x03\x9f\x87\x13\x54\x43\xa0\x5a\xe5\xcb\x25\xe3\xa8\x88\xae\xe8\x01\x6e\x13\x86\x7b\xcd\x70\xda\xbe\x4e\xb5\xb7\x1b\xfc\x3b\xf5\x79\x87\x9f\xd5\xf9\x33\x57\x8d\xcc\x97\x68\xa4\xe2\x14\xdd\x55\x68\x9c\xde\x1e\x87\x75\x5b\x92\x23\x26\x2e\xbe\x29\x54\xe2\x64\xce\x87\x4f\x5d\x85\x05\x55\x4a\x3c\xf5\x29\x25\xbc\x4e\xbe\x9f\x36\xbe\xe6\x85\x12\xff\x45\xbd\x1a\x41\x15\xbf\x4f\x23\xb7\x18\xa9\xe7\x44\xcc\xfe\x7a\x23\x83\x65\x9b\x32\xbe\x7e\xe7\x6e\xbf\xf3\x85\xbe\x94\x9c\x7a\xf5\xfd\x1a\x6f\x4b\x14\x87\x78\x29\xa6\x0e\xfc\xf0\x65\xf7\x25\xed\x2f\x55\x09\xfc\x5c\xcd\xef\xf7\x38\xc8\x2f\xe3\x94\xbc\xc2\x85\xcf\xeb\xeb\x8a\xc2\x1b\x54\x74\x7f\xec\xbd\xc5\xee\xf6\x60\x10\x2a\xab\x91\xc1\x2b\x01\xd0\x32\xb7\x16\x09\xbf\xe4\x69\xf4\x07\x5f\xb9\xec\xd2\x2b\x97\x77\x00\x51\x1d\xec\x9e\x13\xdd\xdf\x34\xe4\x78\xd4\x32\xee\xa6\x6a\x4f\xea\xb1\xc7\x01\x87\xf2\x80\xa9\xaa\xe3\x0b\x46\xbb\x0c\x71\xc4\xaa\x4f\xf4\x24\xad\xea\x4f\x1b\x8b\x8c\xe3\x3c\xcf\xe0\x8d\x95\x4c\x68\x70\xe2\xb1\xf4\xe1\x9f\xf4\xab\x0a\x9e\x91\xb4\x73\xf6\x58\x02\x08\x6b\x64\x35\x5f\xa7\x2c\xe1\xc3\xb2\x2f\xd7\x01\xde\x4e\x5f\x5f\xb3\xed\x2e\xcb\xd1\x18\x5a\x66\xc0\x17\xe4\xb0\x9a\x53\xf7\xdf\x9d\x39\x9a\xad\x37\x47\xb3\xff\x6d\x73\x84\x5c\x6a\xc5\x49\x2a\xb3\x89\x9e\x8a\x32\x9b\xc8\x29\xba\xc8\xca\x32\x1b\xeb\x0c\xfc\x6c\x9c\x24\xc1\x9d\xad\xeb\x31\x9c\x3a\xf5\xe3\x6f\x6e\x2d\xe0\x7a\xaf\xb0\x5d\x6d\x8c\x80\xfd\x38\x12\xa6\xe6\x8f\x36\x42\xad\x2a\xec\xf1\xa1\xe1\xa3\x3d\xca\xbc\x05\xd0\xeb\x33\x3e\xdb\x7d\x71\xc5\xee\xda\xb1\x10\x31\x6c\x71\x63\x03\x65\x69\x99\x24\x05\xa2\x2a\x6d\x62\xfe\xab\x6c\xa6\x14\x17\x76\x85\xde\x25\x2f\x5f\xbd\xca\x66\x6d\xdb\x4a\x20\x5b\xde\x31\xa4\x5f\x71\x8a\xe3\x0c\x26\x13\x9e\x46\x28\x7b\x1c\x0f\x91\x85\x22\x03\x56\x67\x7c\x57\x07\x20\xf5\x28\x1a\xea\x46\xdb\x01\xaf\x56\x82\x4c\x7f\x9f\x7e\x50\xe2\x54\xbd\xd3\x7a\xf2\x71\x86\x7a\x65\x41\x4d\x5f\xf4\x57\xee\x6e\xda\xea\xf9\x85\x7e\x5d\x41\x6c\x5f\x36\x6d\x42\xf2\x68\xb8\x6a\x6f\x71\xf1\x80\x94\x1b\xa7\xa7\x20\xcb\xc7\xe9\xe5\x62\x57\xa6\xcc\xfa\x7b\xd3\xec\xcc\xf4\xe7\x69\x92\x54\x3d\x7d\xc1\xe5\x8b\x2b\x82\xde\x0a\xca\x80\x15\x21\xf8\x06\xaa\xbf\x36\xe5\x09\x64\x88\x76\xd0\xc2\xd6\x53\xc5\x15\xa0\xd3\x4c\xce\xfc\x2a\xc0\x25\x3c\xf8\x52\x07\xdb\x9d\x76\x34\xce\xa0\x9f\x25\x02\x45\xf1\x5b\x4d\xd3\x2a\x40\xc5\xee\xe8\xfd\x20\x11\x88\xd6\x03\xa5\x72\x50\x29\xf3\xf8\xf2\x92\xe7\xfa\x90\x5f\x7b\x52\x71\x0b\xc2\xc5\x8a\x7b\x52\x29\xe6\x69\xf8\x36\xb2\xad\x76\x30\xcd\xb5\xc9\x5a\xed\xb9\x06\xb6\xd5\xb9\xf3\x33\x3d\x1f\xc7\x8d\x3c\x74\x59\xed\x09\xc2\x27\xb5\x28\x18\x51\x0b\xd8\xae\x48\x03\x7c\x2d\xad\x5e\x42\xfb\x15\xa3\xc1\xae\x9d\x17\xb7\xa0\x7c\xb3\x29\x1f\x6c\xe3\x6b\x54\xf3\x4a\xd4\x9d\xb0\x66\x1d\x3a\x1a\x28\xfa\xcb\xd0\x09\x1d\x66\x39\x6b\x83\xd1\x22\x3b\x64\x18\x56\x45\x5f\x40\xb8\xf5\x54\x24\x21\x16\xb3\xbf\x8a\x82\x07\x2c\x7e\xfc\xb8\x5e\x64\xf3\x37\x72\x16\x57\x83\xd0\xa0\x44\x04\x0f\xf1\xc5\xe9\x10\x7e\x5c\x5f\x4b\x41\x09\x49\xf1\x33\x9f\xeb\x3c\xf5\x74\x98\x20\x0a\xf2\x56\x3d\xcc\xfc\xae\x63\x78\x90\x06\xd1\xeb\xb1\x06\x0c\x9c\x01\x74\x84\x68\x60\x66\x04\x3a\x95\xfe\xca\xbd\xd3\xc4\x9c\x90\xce\xcb\xda\xc2\x2f\x61\xb8\x87\x26\x47\x68\x1b\xed\x65\x55\xaf\xf3\xe0\xca\x1f\x09\x4e\x73\x24\x50\xeb\xcb\x80\x7d\xa7\x76\xf0\xbe\xe6\x8a\x52\x95\x82\xd9\xa7\xd2\xd8\xa6\x56\x49\xa5\x23\xd7\xd1\xf9\xc2\x90\x49\x32\xf0\x1f\xdc\x97\xd6\xf6\xaa\x6c\x5d\x62\xe5\x6c\x53\xf5\xaa\xcd\x68\xaa\x3d\x2b\x9e\x6a\x07\xf1\xa3\x55\x51\x46\x53\x1a\x2a\x62\x8e\xb4\x55\xab\x0e\x56\x18\x6f\x13\xc4\x75\x55\xe7\xce\xba\xad\x38\x6e\x02\x63\x04\xed\x85\x91\x18\xb2\x59\xd4\xa2\x74\x1d\xb2\x64\xa3\xb6\x43\x95\xd1\xf6\xbf\x15\x19\xae\x76\x21\xec\x0f\x72\x81\x18\xc3\xa0\x7b\x41\x2f\xcc\x79\x50\xaa\xe0\x2b\x4d\x8b\xe8\x7b\x2a\x7d\xeb\x67\x2b\x02\x31\x5e\x29\xdc\x77\x73\xa7\x70\x47\x97\x4a\x98\x04\x85\xb6\xee\xe7\xb0\x99\x16\xe0\x17\x80\xd4\xb0\x2e\xd3\x59\x5d\x26\xc5\x17\xac\x16\x39\x45\x3e\xbe\xf1\x98\xb5\x8c\xf3\x01\x5a\xf1\x4b\xcc\xaf\x5e\x65\xb3\x3e\x1a\x4e\x6f\x83\xed\xed\x76\xd7\x12\x65\xbb\xae\x8c\x7a\x43\x1b\x28\xad\xdb\x50\x69\x53\x29\x28\xcd\xbe\x26\x25\xb2\x6b\xb3\xf0\x0a\x0b\xfa\x32\x8f\xab\xd6\x60\x2e\x99\xab\xe5\x59\x8e\x38\x54\x70\xd5\xb8\xfe\xc5\xe1\x2e\x0b\xab\xab\x3a\x19\x04\x17\x05\x9e\x3e\x9a\x18\x11\x1e\x3a\x96\x5c\xa0\xde\x55\xfa\xce\x6e\xa1\x79\x95\x62\xe1\x8a\x6d\x32\xd8\x4d\xec\xfb\xcd\xc7\xd6\xd9\x4e\xab\x6b\xfc\x49\xc3\x1a\x27\xba\x48\x59\xb8\xc6\xc8\xca\x66\x06\x4f\x96\x60\x06\x4f\xaa\x8f\x01\x2c\xad\x26\x91\xed\xea\x55\x9b\x38\x57\xbf\xca\xce\xd5\xa1\xad\xed\xaa\x84\x3a\x24\xd1\xa8\x83\xbc\xca\xc6\xbf\x29\x28\xf5\x59\xae\xed\x28\x2f\x68\x63\x44\x6f\xe1\xb4\xa6\xb4\xe9\xab\x9e\x9c\xff\xa1\x36\x7a\xa4\x0f\xd0\x0b\x54\xfd\x16\xa9\xc9\xe8\x33\xa3\xca\xbc\xed\x7d\x3c\xc1\x61\x9f\x7e\x74\x2d\x8c\xf4\xad\x2f\x95\x27\x5d\x34\xf7\xed\x4f\xeb\x8c\x6b\xcb\xe3\x80\x96\x95\x3c\x18\x2f\x44\xa4\xde\x28\xce\x1e\x5a\xfb\xc3\xc3\xf3\x4e\xd3\x16\xb1\xac\x7a\xd7\xd9\x1b\x3c\x31\x34\x61\x1f\xf8\x95\x32\x5d\x37\xf3\x6f\x16\x0f\xa6\xd9\x48\x4f\x4a\x1f\xd6\xb5\xd0\x33\xb4\x78\xc6\x50\xaa\x7f\x5c\xe1\x0d\x19\x86\xa3\xd7\x61\x87\x72\x66\x6c\x2f\x6f\x54\xc5\x93\xbe\x7a\x95\xcd\x7e\x01\x93\x12\xcb\x98\x1e\x51\x61\x32\x6f\xc7\xfc\x4f\x2b\x5e\xc9\x6b\xb8\xa8\xcb\x3b\xdd\x8a\xcd\xdc\x5c\x96\x6e\xb8\x17\x27\xa5\xfe\x6f\x7b\xff\x61\xaf\x3c\x02\xff\xaa\x91\x4b\x9e\x35\xbc\xb1\x8a\x0b\x09\x8d\x74\x2f\xaf\x1e\x4d\x3d\xeb\x39\x39\x4b\x3a\xed\x78\xb6\xc0\x69\x87\x1b\xac\xc0\xae\xa5\x1c\xf6\x7b\xaa\xa8\xc8\x09\x76\x05\xf4\xfe\x6f\x15\x77\xdc\x82\x3c\x33\x4f\xe8\xd6\x62\x4d\x49\x96\x52\xce\x44\xa6\xc5\xe6\x26\x5a\xa8\xf3\x68\xbd\xe5\x7b\x63\xa2\x9c\x04\x99\x8f\x68\x1d\x6f\x2c\xab\x60\x1c\x63\xdf\x9d\x24\x5a\x24\xa9\xc6\x42\x20\xb9\xda\x4b\xb5\x3b\xcd\x2f\x9c\x89\xe8\xb3\x33\xeb\xc1\x76\xb8\x4c\xa8\x04\x57\x15\x5a\x77\x82\x84\xfa\xaf\xb3\x7a\xed\x91\x53\xae\x8d\xa7\x44\xc9\xac\xdd\xd5\x1f\x65\x65\x9d\x1b\x96\xdb\x4c\x68\x5c\xfc\x3d\x48\xe2\x88\x4c\x29\xf6\xea\xa8\x8f\xb0\xb7\x75\x28\xc5\x1e\x8c\xf7\x65\x74\x03\xe3\x30\xda\xae\x1f\x25\xb6\x2c\x95\x57\x03\xcc\x98\xd5\xae\xe9\xb6\x5a\xfe\x9e\x8e\x72\x4f\x07\x83\x62\x14\x4c\xf8\xe0\x75\x56\xd6\x6c\xd0\x15\x10\xef\xf4\x98\xb9\x94\x2e\x70\x67\x5b\x30\x68\x19\x78\x6a\xf0\x2e\x98\xf3\xdc\x0f\x2c\x69\xed\xab\xff\x3c\x89\xcb\x65\x33\x12\xf4\x8e\xeb\xc0\xa8\x97\xac\x2d\x3c\xca\x8c\xc4\x75\x9b\x95\xb4\xc0\x73\x53\xb5\x28\xd8\x8d\x3c\x73\xd7\x11\xea\xc2\xc0\x2c\xe2\x19\xe8\x9f\xbc\x8c\x5a\xfa\x9f\xc0\x52\x24\xcd\x75\x4b\x5e\x38\x45\x75\x8a\xe7\x60\x42\xdf\xba\x3c\x23\x7a\x2d\x77\x67\x52\x0f\x9c\x25\x88\xf8\xed\x6c\xef\x78\x77\x29\x5d\x5f\xd3\x0c\xd0\xe6\x51\xb7\x82\x9f\xf9\xdc\x39\x46\x81\xab\xe7\xaa\x5b\xe9\x3a\xdf\xd2\x81\xe2\x4f\xda\x4d\x34\xf1\x15\xad\x33\xab\x76\xe6\xd4\x1b\x75\xd5\x25\xb5\x1b\xe0\x24\xc3\xbb\x44\xeb\xda\x94\xea\x32\xd1\xc6\xd8\x8f\xb4\x8a\xab\x4d\xca\xd1\x75\x5c\x1d\xe9\x2a\xc6\xca\x9c\xdb\x99\x56\xcd\xbc\xcf\xf6\xaa\x2e\xdd\xee\x35\xfe\x83\x9e\x07\x6b\x3b\x44\x2f\x73\x52\x52\xdf\xad\xe6\xf4\x59\xeb\x3f\x87\xc3\x61\xcb\xbb\x03\xd2\xe1\x4d\xaa\x62\x86\x5c\x45\xb4\x14\x24\x55\x14\x3d\x82\xae\x1e\xb3\xd6\x26\x29\x09\xda\x1d\x33\x23\x86\x8f\xdd\x73\x08\x10\x4d\x73\x8e\xcd\xb7\x58\x11\xe8\xef\x15\xa4\x3e\x77\x77\x35\xa4\xaa\xa9\xcd\xba\x04\x70\x45\x50\xbd\x94\x5d\xf9\x73\xf9\x7e\x2c\x59\xc8\x74\x6a\x9f\x84\x04\x85\xea\xbe\x7a\x0e\x37\x10\x14\x6a\x32\x1d\xff\x42\xd6\xc4\xe8\x52\x75\xd3\x82\x71\xa9\xed\x01\xeb\x1c\xb3\x29\x4b\x7e\x53\x3f\x68\x21\x79\x37\xee\x5a\xb6\x5d\x45\x23\x67\x5f\xc0\xcd\xfd\x6a\xa6\xa7\x55\x35\xd3\x7d\x3e\xfd\x13\x5d\xad\xf0\xdc\x0f\xd5\x46\x7b\xb7\xd1\x56\xed\xd5\x68\xab\xf4\x7e\x4b\x4b\xaa\xb4\x26\xc5\xd6\xde\x12\x8a\xad\x3d\xaf\x55\x5f\x51\xce\x13\xda\x1d\x7c\x3b\x50\x65\xe3\x49\x10\xd2\x86\x64\x8a\x73\x2e\x29\x47\x3c\x07\xbe\x8e\xd7\xb3\xbf\xc6\xe5\x28\x9b\x96\xd2\xb4\x27\xe6\x45\x5b\x56\xef\xb2\xb3\x96\x1a\x7f\xab\xcb\x5a\x7a\x84\xe2\x03\xc6\x21\x7e\x20\xb0\xe2\x17\x80\x04\x05\xb1\xdb\x56\xc5\xa4\x2d\x28\xcb\x7c\x9d\xd7\x7c\x4b\x71\x23\x1c\x9f\xa3\x4e\x1b\x83\x79\x26\x25\x19\xad\xcd\xff\x29\x8f\xa3\x3e\xfb\xaa\x2e\xbb\xa5\x12\x03\xe9\x5d\xe4\x75\x59\x96\x86\x32\x76\xb9\x2d\x38\xe9\x30\xee\x2f\x73\x1e\xd4\x35\xe1\xc6\x7a\xaf\x69\xe2\x5d\x9c\xf2\x35\x9b\x78\x9d\x95\xab\xb5\xf0\x3f\x2f\x67\x71\x51\x57\x15\x32\xed\xf2\xbf\x35\x95\xff\xad\x5a\x1e\xcc\x96\xea\xca\x43\x66\x3d\x8e\x5f\x05\x79\xfd\xe4\xc0\x6e\x0d\x8a\x10\xbb\x52\x13\x32\xeb\x6b\x35\xcd\x62\x7d\xad\x8f\x41\xb4\x0a\x88\x1f\x83\x28\x0e\x92\x95\x46\x77\x12\xca\xd8\x59\xb7\xad\xf8\x21\x5e\x01\x2b\xf2\xbc\x5e\x57\x11\x9d\xb3\xd6\xcf\x1f\xf8\x7d\x69\x5a\x62\xba\xc0\x82\x36\x5e\x2a\x3f\x30\x8d\x0d\x55\x89\x0f\x92\x3f\x6a\x5f\x3a\x4b\xd4\x36\x1b\x08\x61\x5f\x5b\x5b\xa0\x6a\x7c\x28\x79\xdb\x43\x36\xce\x22\xf0\x00\x31\x0e\x62\xf0\x5e\x51\xf0\x88\x05\x05\x5c\x44\x4d\x82\x34\xcb\x83\x71\x00\x5e\x21\xe2\x14\xe9\xdf\xda\x1a\x65\x2b\xde\x4d\xec\x8e\xce\x98\x4d\xa7\xcc\xef\xe9\x21\xf3\x64\x9a\x0f\x83\x90\x2f\x3c\x66\x32\xe7\x72\x53\xf0\xf2\x2e\xfb\xba\xe0\x9a\xd0\x79\x5d\xbe\x2a\xe7\x9f\x00\x64\x92\x63\xcc\xf1\x5d\xbc\xa3\xf5\x1c\x07\x13\xea\xa5\xbd\x3e\x40\x2d\xd7\x4e\x6c\x40\x0e\xf0\x7a\xfa\x39\xb8\xa7\x93\x7f\x2b\x8a\xbf\x58\xe7\x02\xef\xe1\xca\xba\x21\xae\xef\xf9\xd9\x00\x8a\xa5\xc1\x98\x17\x96\x36\xc6\x28\x01\xae\x94\x9f\x23\xd3\x62\xc7\x23\x58\x38\x5a\x42\x14\x2e\xd8\x57\x36\xd1\xe1\x0e\x5a\x39\x4f\x02\x21\x47\xb7\x20\xaa\x5b\x91\xe5\x7d\xd6\x92\x3d\xb6\x16\xdd\x15\xd3\x79\xb9\xe9\xca\x09\x70\xc5\xee\xea\x45\x45\x9a\x55\x8d\x94\xe5\x45\xc5\x53\x13\x1b\x9c\x1d\x32\x51\xd0\x76\x5b\x79\x63\x4b\xd9\x4b\xe9\x5e\xfe\xbd\xbc\x6e\xb3\xbc\xac\xfb\x7f\xc3\x47\xd5\x75\x74\x4d\xb6\xbe\x4a\xa9\xd5\x38\x69\xa1\x51\x2e\x3c\x19\x35\x05\x1d\x34\x04\x79\x29\x97\xa8\xa8\x75\xb3\x9c\x22\x54\x7b\x37\x78\x08\xb1\x0d\x60\x21\xf4\x2c\x83\x2a\xf3\x84\x5c\xe7\x0b\x11\xf8\x74\x3e\xe1\x1e\x05\x08\x9a\xcf\x35\x2d\xcc\xa7\x20\x41\x0f\x4a\x51\xdf\x22\xa7\x2c\xe5\xc7\x43\xd1\x6c\xfb\x6c\x85\xda\x05\x18\x17\x35\xdd\xef\xd4\x56\x4d\xc1\xb0\xe8\x5c\x4e\x8b\xdc\x7e\x56\x1a\xc2\x45\x96\x49\xd5\xbe\xa4\xcc\x95\xa1\xc1\x56\x14\x45\xaf\xd9\x4c\x04\xa1\x56\x56\x68\x24\xc8\xf3\x60\x7e\x3c\x6c\x20\xa5\xfa\xd9\x84\xd5\x26\x71\xaa\x02\xbb\xac\x4a\x15\xed\x33\xea\xad\xb1\x4b\x1c\x34\xaa\x59\x23\x0e\x3e\xd6\xea\xa6\x88\x2f\xe1\x3c\xc7\x67\x93\x20\x8d\xc4\x2f\x8c\x96\x20\x0e\x75\x97\x97\x78\x84\x2b\xe2\x64\x94\x4d\x79\x59\x72\xdd\x7d\x39\xca\xb3\xb2\x4c\xf8\x6b\x9e\x04\xf3\xb5\xe7\x4b\x5d\x58\xaf\xb2\x0c\x46\xc1\x84\xeb\xfd\x12\xde\x87\xac\x09\x0c\x53\x4f\x7e\xd6\x6e\x47\xbd\x4b\x59\xbb\x21\x7c\x9b\xb4\x72\x33\x0f\xe8\xc6\xe7\xc6\xa2\xfa\xe6\x8c\x4b\x0e\x6d\xa5\xc9\x06\x9e\x77\x6e\x46\xf2\xaf\x3f\x02\x0c\x33\xf5\xaf\x3b\x04\x1a\x86\x6c\x4d\x3a\x57\xc2\xe7\xaa\xbc\x57\x6e\x67\xcb\x08\xcb\x8b\x76\x55\x6c\x49\xdb\x43\x7d\xf3\xe9\x59\x63\x1f\x02\x39\x79\x35\xb1\x20\x8b\xb8\x9a\xd6\x2c\x3d\x4a\xe2\xf0\xf3\x4a\x43\x17\x62\xbb\x6a\x85\xba\xe2\xbc\x8b\xa6\xa4\xc7\xd0\xbb\x68\x0a\x3d\x7e\xde\x45\x4b\xaf\xb3\xab\xd5\x88\xa4\xd2\xd2\x2f\xab\xb1\x33\xd3\x4e\xc5\xd5\xd7\xca\x62\xdd\x03\x38\x9d\x69\xc9\x97\x08\xcb\xe4\x71\x61\x55\x1e\x56\x92\x8f\x25\xbf\x54\x25\x16\x1a\x93\xc9\xdd\x91\x5a\x3b\xdb\x7f\x69\xd9\x2c\x7e\xcf\x96\x13\xe4\x43\xd0\x7d\xfd\x3a\x77\xdf\x3c\x02\xdd\xef\xca\xed\x72\x5f\xa9\x7e\x3c\x38\x19\x06\x49\xc1\x71\x84\x74\x38\x66\x90\x78\xd4\x7b\x8d\x79\xe0\xb6\x91\x1d\x9a\xf3\x68\xdb\xb2\x01\x69\x74\x1f\x28\xcf\x2f\xff\x9a\x4f\xe7\x75\xfc\x09\x75\x39\x6e\x86\xb0\xb1\xe1\x3e\x61\xf5\x24\xf5\x48\xe5\xeb\x6b\xb6\x6d\x5a\xe5\xc6\xb9\xe4\x6d\xdb\xd4\x55\xaf\xaf\x89\xdf\x44\x51\xd2\x7c\xc9\x17\x3b\x10\x9a\xca\x74\xec\x44\x8c\x80\x73\xde\xff\xf4\x4d\x40\x25\x48\xf8\x8d\x24\xb8\x2e\xb6\x8a\x8a\xe3\x36\xdb\xc9\x16\x77\xbc\x63\xe2\x65\xa3\x3c\xe6\xca\x32\x9b\x3a\xd6\x96\x63\xfe\x64\xa8\x52\x46\x8f\xb8\xd1\xd4\xa8\x63\x86\x1b\x0a\x74\xa2\x84\xcb\x41\xc1\x4d\x9b\xe3\x5a\xe3\xfa\x9a\x39\x49\x12\x3b\x46\x9b\xa2\x42\xda\x89\xfe\x11\x55\x37\xd6\xb1\xdb\xa9\x5e\x64\x63\xee\x44\xec\x36\x6d\x11\x3f\x80\x77\xff\x2e\xa9\x12\xb3\xd4\x5c\x2a\xa9\x5b\x3f\xe9\x90\x4f\xfc\xdb\x03\xbb\x84\xe3\x61\xbb\xf5\x2a\xc8\x5b\x1d\xf6\xc3\xa1\xa2\x04\x34\x12\x33\x08\x76\x83\x86\x57\x17\x7b\x17\x0c\x3e\x9e\xcb\x38\xe0\x64\xe5\x7b\x1d\x99\x3c\xaf\x75\x64\xe2\x75\xc6\xfa\xbc\xd6\x19\xab\xc7\x11\xeb\x73\x27\xe8\xbf\x86\x44\x40\x56\x48\xe8\xdb\x55\x22\x38\x3b\x6f\x70\x41\x00\xcc\xc3\x9e\x44\xd1\x9c\x6c\x0d\x72\x7b\x66\x79\x69\xa4\xc3\x95\xb4\x2a\x27\xe7\xe5\xb5\x59\x7f\x54\x5f\xa7\xc2\x9d\x9c\xf7\xc2\x2c\x0d\x83\xb2\x3d\x28\xb3\xa3\x2c\x2d\xa6\xe3\xe0\x22\xe1\xe0\x98\x47\x42\x23\xb8\x70\x35\x4f\x35\xdd\xa9\x7a\x63\xf3\xdc\x6c\xdf\x74\xc5\x78\x0f\x1e\x50\x20\x0b\x0a\x65\x41\xc0\x64\x3f\xb0\xed\xca\x62\xd0\x85\xac\x05\xa1\xda\xd2\x44\xa8\xd9\x14\x31\xea\x89\x48\x3f\xbd\x2a\x53\xaa\xeb\xcd\x42\x30\xe9\x13\x2c\x70\x5c\x3f\xb1\xca\x72\x54\x00\xa4\xfa\xa3\x9d\x2c\x15\xe5\xd8\x1b\x08\x60\x88\xee\xf8\x0b\x7c\x7e\x66\x3c\x92\x1a\xf2\xec\xdc\x43\xeb\x8a\x9e\x3b\x15\xd4\xc0\xa8\x8a\x24\x0e\x79\xbb\xc9\xc5\x21\x71\x85\x66\x33\x2f\xb4\xc1\x12\x6b\x3d\x4e\xe3\x32\x0e\x92\xb8\xe0\x4a\x78\xd1\x0b\xc1\xcd\x6b\xd3\x25\x0e\x4a\xe6\x67\xb6\x5d\x43\x83\x71\xbb\xc5\x3c\x2e\x32\xf2\x1a\x0e\x0c\x57\xb2\x19\xf8\x0c\x83\x36\x1b\x5c\x2d\x18\x4b\xe9\xe7\x62\xe1\x63\x71\x8f\xad\x74\x95\xa1\x60\xa5\x5b\xf9\x77\x26\x55\x16\x7b\x78\x96\x85\x89\x8f\x67\x5d\x54\x81\xc9\x51\x66\x6a\xcb\xef\xe5\xbd\x5f\x53\xfd\xbe\xf4\x47\x2a\xdb\x20\x81\x9b\xef\xce\xeb\xa5\xb9\x15\x72\xdf\x21\xdc\x54\xe7\xd9\x75\x2e\x67\xcd\x33\xbc\xa1\x0e\xad\x87\xd3\x16\x37\x45\x33\x8a\x7d\x33\x95\x15\x93\x13\xfd\x10\x5d\x16\x95\xaf\xd0\x6d\xbb\x6a\xe9\x7d\x5a\x15\xb1\x83\x5b\x8a\x7e\xe8\x44\x11\x9a\xf1\xcc\x96\x20\x46\xd5\xe7\xe1\x21\x13\xff\xc2\x2b\x5f\x18\x02\xfb\xee\x50\x37\x60\x3d\x0a\xaf\x18\x3e\xbb\xe4\x07\xcb\xf5\x16\xb4\xa7\xcb\x93\x1d\xcd\xba\x1e\x5d\xed\xd9\xbd\x07\x8c\x35\x62\x2e\x56\x80\x74\xdf\xf3\xbb\x74\xef\xbf\xc8\xbb\x7b\x67\xc0\x5d\x76\xfb\x25\xf6\x2d\x16\x16\xb8\x29\xbe\xc3\x10\x9a\x30\x01\x55\x71\xba\x53\x7d\x85\x8f\x52\xbd\x22\x2c\xfc\xea\x3a\xb7\x86\x28\xe8\x5b\x65\x7e\x73\xcb\x54\x3b\x53\xe5\xab\x39\xae\x63\x26\x64\x91\xdf\x37\xf2\xed\xca\x9b\x90\xef\xbd\x41\x94\x75\x18\x65\x78\x3d\x4b\x0a\xd3\xe4\xaa\xa7\x27\x6c\xca\xff\x26\xdf\xff\x1a\x1f\x21\x97\x0f\x45\xfc\xfe\x91\x96\x79\x29\x42\x1b\xdf\xda\x62\xbf\x62\x60\x87\x10\xce\xf7\x70\x83\x81\xc8\x87\x98\x1a\x18\x9a\x5d\xc7\xcb\x00\x5b\x2d\xcc\xee\x82\xe9\x04\x98\x1d\xb2\x6c\x28\xe7\xd4\x6e\x39\x48\x23\x35\x8f\xe3\x60\xce\x2e\xf8\x3c\x4b\x23\x8c\xeb\x91\x4d\xd3\x28\xc8\x63\x5e\xf4\xdc\xd1\x49\x2b\xc2\x23\x45\x23\xef\x83\x72\xd4\x1b\xc7\x69\x5b\xd2\x89\x1a\x7f\x4f\x88\x13\xea\x37\x7a\x15\x73\xe7\xd8\x6a\xeb\xb7\x4a\x5b\xbf\x99\xb6\xe6\xa4\x2d\xe9\xfd\xca\x6d\xcc\x7e\x4d\x44\xa7\xf6\xac\x4a\x6d\xe7\xe0\xa8\x69\x41\x19\x34\x14\xf6\xf7\x43\x1e\x3a\x21\x79\x5e\xf2\x52\x56\x96\x8f\x2e\xdb\x9e\xa5\xe6\x6f\xcb\x7a\x6d\xb5\x10\xf0\x17\x0e\x41\x36\x06\xdc\x5e\x38\x44\xf3\x1e\x88\xf5\x9d\xb9\xb5\x17\x51\x63\xf4\x6d\x67\x22\xfb\xb7\xe9\x97\xae\x24\xd6\x67\x59\x1e\x5f\xc6\xa9\x41\x89\xb5\x2e\xeb\xf7\x88\x1b\xe4\xae\x62\x79\x11\x42\xb0\xdf\x4f\x55\xd0\x5d\x7d\x02\xd5\xb5\xa7\xb7\xef\xcc\xf6\x8d\x87\x21\x37\xed\x61\xcd\xce\x5f\xaa\xe2\x11\x68\x93\x8e\x46\xf2\x79\x84\x91\x8c\xc4\x99\xf5\x7b\x5b\x18\x2a\xdc\x03\xf0\xf7\xbd\xaa\x6a\x85\x61\xcc\x54\xbb\x18\xb7\x8f\xbd\xc0\x09\x8e\xd3\x64\xae\x7c\xfd\x08\x96\x90\x5e\xf2\x42\x70\x41\xc1\x0b\x00\xc7\x65\xa1\x62\xce\x60\x80\x99\x51\xf0\x05\x3c\x44\x4d\x83\x24\x99\xcb\x1a\x11\x95\x8a\x0c\x78\x44\x0c\x42\x39\xca\x91\x77\xc0\x5b\x4b\xd4\x50\x56\x0b\x0c\x8e\xdc\xb4\xbc\x9c\xb6\xa4\x74\xb1\x58\x57\xc5\x6a\xf5\x55\x66\x92\xef\x4f\x9e\x28\x6a\x65\x09\xbe\x58\x8e\x70\x51\x51\xf1\xec\x74\xf7\x98\x58\x7c\x1e\x30\x17\x12\x16\xbd\x73\x9b\xd6\xe9\xc5\x85\x23\xfd\xf7\x68\x9e\x1e\x24\x58\x28\x83\x83\x2d\xca\x9f\xa1\xe0\xdb\x74\x98\xb5\x89\xce\x4b\x10\x2b\x14\x75\xa9\x2b\xe5\x33\xad\xb5\xb6\xf8\x0c\x94\x16\x8c\xa6\xa2\x7c\x44\x4b\x4b\xb2\xe0\x5d\xaa\xd3\x6d\x56\xcb\x54\xa6\x83\x96\xb5\x84\xf9\x35\x1e\x15\x12\x5c\x39\x62\x1f\xcd\x32\x5d\x77\x19\x5f\x8e\x7d\x49\xe8\x79\xf4\x72\x58\xf2\x5c\xdf\x0d\x2d\x31\xa9\xb2\x98\x6f\x4e\x45\xd6\xad\xa6\xd4\x3f\x79\x58\xeb\xc5\x2d\x27\x91\xf5\x7d\x99\xa0\xde\x25\x76\xac\x8b\x27\xf8\x16\xd3\x7b\x27\x93\x2b\x90\x66\xcd\x2d\x49\xf7\x4f\x6c\xed\xe2\x7c\x5b\xf2\x71\xdd\x02\x4d\x4c\x17\x2e\x0e\x48\x08\x64\x1f\x6e\x0d\x03\xc1\xbd\x55\xf4\xd2\x67\xf4\x79\xb3\xb3\x05\xf3\x44\x09\xea\x95\x57\xe4\xd5\x0d\x9d\x14\x96\xa6\x96\xe0\xa6\x44\x48\x49\x3c\xe9\x85\x18\x07\x53\xfc\x9a\x1b\x72\x56\x2a\xaf\x06\x0c\xc0\xf5\xab\x85\x81\x95\xc6\x6f\x6e\x27\x1a\xbb\x5d\xb8\x7e\xc0\xf1\x59\xb3\xdb\xfc\x45\xe4\xc2\x7b\x13\x9e\x17\x71\x51\x5a\xc4\xa2\x53\xdb\x15\x9f\x12\x36\x21\xbb\x2b\x5d\xaf\xbf\xba\xe1\x54\x31\xe8\xe7\x07\xaa\x9c\x8f\x21\x40\x9e\xc5\x11\xe8\x3a\xff\x97\x5c\xae\x30\x24\xdf\x7a\x85\x8c\x5b\x2e\x58\x13\xcb\xb2\x09\xd1\x60\x2d\xfc\xf3\x7a\xd7\x4b\x89\xba\x5e\x42\xef\x21\xa2\x45\x7a\x8f\xea\x60\xc9\xf4\xb8\x16\xc9\x52\x92\x38\xd3\x6d\x9e\x77\xdc\x9d\x7b\xb9\x6d\x02\xcb\x2a\x8f\x9c\x36\xc1\x91\xd6\xc9\xe6\x2b\xcb\xb6\xe5\xde\xb1\xc4\x84\x80\x01\x48\x33\xd1\xab\x22\x0e\xbd\x43\xb2\xad\x68\x5c\x87\xd6\xa0\xb9\x5b\x23\x8a\xd0\x24\x34\x70\x8b\x91\x6b\xa3\x8e\x25\x96\xbc\x2c\xe6\x5b\xf1\x22\xeb\xee\xb0\xa0\x9b\x5c\x07\x13\xba\x91\xdb\x62\xe3\x97\xc9\x12\xb8\x80\x42\x3e\x4c\xfc\x32\xb9\x63\x3c\xfc\x32\x59\x1b\x0b\xbf\x4c\x6e\x81\x03\x1d\x0c\xb8\x71\x53\xeb\xc9\xa3\x24\x94\xe6\x05\xfb\xee\x10\x1e\xa1\x42\x4c\x64\x27\xcf\x7b\x17\xa8\x39\xb8\xb3\x93\x56\x5a\x3e\xdb\x3e\x6f\x82\x59\x19\x0b\x1b\xd9\xc2\xb8\xdd\xab\x1c\xcd\x77\xb6\xed\xb9\x9c\xc9\x30\xe2\x98\x87\xd1\x35\xe8\xb9\x49\xbf\x61\xc5\xfc\xca\x13\x56\xf3\x80\x15\x0b\x54\xdf\xaf\x1a\xbd\x27\x96\x50\xae\x70\x30\x77\xe9\x60\xe2\xfe\x97\xfc\x63\xc5\xdc\xc9\xe0\x8f\x87\x3f\xe5\xb1\x74\x12\x7e\x77\xfe\x1d\x41\x6b\x16\x87\x9f\x0b\x5b\x93\x73\x87\x1d\x50\xd3\xa4\x2e\x4e\x0c\x7d\x27\x03\x8e\x16\x57\xf7\x79\x30\x55\x98\x82\x41\xe0\x21\x1f\x71\x24\x7b\x12\x02\x2f\x79\xba\xb1\x92\x63\x48\x2d\x2f\x76\xba\xb6\xde\x98\xfa\x42\xd7\x11\xfd\xa9\xa6\xd5\x5e\x85\x5a\x63\xb7\x1c\x4d\xef\xd8\x34\x3d\xa7\x34\xbd\x83\x91\x5b\x6a\x69\x7a\x67\x11\x4d\xef\x2c\xa4\xe9\x9d\x7f\xd3\xf4\x72\x34\x3d\xff\x66\x34\x3d\xbf\x57\x9a\x2e\xb3\x09\xfd\x6d\x28\xda\xd2\xf7\x5b\x24\x5d\xf5\x88\x6a\x91\x71\x30\x8b\x8b\x8a\x29\xc4\xdd\xa3\x25\x30\x58\xf1\xc0\xe8\x8d\x6f\x59\x01\xf3\x7d\x30\xb1\x97\x5b\x80\xab\x6d\x45\x0b\x91\x40\x01\xfb\x32\x9d\xcb\xb7\x76\xc7\x43\x6c\xcb\xc0\x8c\xb1\x35\x4d\x97\xce\x25\xd9\x7d\x21\x0a\xce\x64\x1a\x5f\xf6\xe4\x10\x22\x26\xc0\xd8\xd7\x09\x86\xf2\xb2\x3c\x12\x07\xd1\x53\xab\x68\x3d\xbc\xdb\x4a\x2e\x2a\xb2\xbc\x7c\x35\xb7\x64\x22\xab\x03\x32\x37\x99\xf7\x45\x71\x46\xae\x2f\x68\x88\xd4\xae\x0b\x3e\x3e\x90\x0e\x2c\x56\x49\xb2\x5e\x05\x69\x84\x66\xff\xab\x22\xfb\x52\x21\x5b\x35\xe5\xe2\x5b\xbd\x0b\xbc\xf1\x90\x26\x7d\x70\xee\x68\x77\x80\x64\x1c\xeb\x0b\x50\xae\xef\x6c\x37\xdc\xc8\xd6\xf9\x1c\xdc\xd9\x6e\x72\x3a\x58\xeb\x72\x70\x67\xbb\xd1\xe7\xa0\xdf\xe3\xa0\xae\xe4\x71\x39\xe8\xdc\x16\x13\xb9\x89\x4a\xd6\xdf\x29\x1f\xc8\xd7\xd7\x4c\xfd\x56\xae\x28\x11\x57\x22\xc3\x1d\xab\x48\x73\xa1\xf5\xd8\xee\x55\xdd\xb3\x4b\x67\xb7\xda\x2c\x85\xca\xfe\xca\x36\x85\x14\xcc\x79\xa1\xed\xc6\x95\xaf\x3c\x93\x8b\x00\x1e\x65\xe3\x49\xa3\xe3\xb7\x9d\x27\xca\x79\xdb\xd1\x34\xff\xe2\x7f\x4b\x6b\x9d\xe0\xf5\x7b\x4e\xbc\xfd\x93\x1e\x13\x80\x16\x5b\xf6\x28\x0d\x74\x2e\x36\xcc\x4a\x59\x16\xca\x3d\x0d\x65\x9e\x15\xfe\xcd\x50\xe3\xd2\x58\x47\x38\xb0\xbe\x0a\x16\xc0\x69\x4e\x3b\xb8\x14\x3e\xf2\xb0\x84\xd0\xb3\xf4\xd5\xfa\xb2\x20\x3f\x53\x20\xeb\x56\x96\x05\x9b\xde\xae\xe6\xe0\xcc\xa2\x55\xb1\x65\xd3\x30\xa2\xff\x37\x0f\xf0\xd2\x31\x9c\xf3\x8c\x39\x9c\xc9\xa0\xf1\xb4\x50\x2f\xac\xb8\x62\xf2\x96\x72\x7c\x32\xe5\xe0\xfa\xc1\x57\x12\x73\xdc\xd7\xf0\x41\x5e\x82\xab\x09\x5f\x0d\x93\x6b\xd7\xe2\x69\x54\x5b\x47\xe5\xd9\x35\x26\x1a\x21\x6e\x79\xcc\x71\xbd\xb1\xf1\x04\x8c\x41\x75\x47\x9b\x04\xd2\x03\x2f\x99\x58\x9e\x85\x67\x7d\x16\xce\xba\xe0\xbc\x2a\x9c\x77\x49\xdd\x3e\xf9\xdd\xd5\xcd\xf7\xf5\xaf\x2e\x8b\xd3\x94\x4b\xff\x19\x7d\x89\xcc\x2e\xcb\xa6\xa5\x9b\x68\xf6\x95\xdb\x53\xe1\xbe\xa2\xc2\x13\x1e\x96\x99\xdf\xe3\xa1\x43\x82\xfe\xb5\xf1\x55\x22\xb6\x5f\x4b\x68\xab\x80\xb7\x14\xf7\x91\xd0\x11\xe6\x86\x9e\xff\x1c\x87\xfc\xad\x81\xf6\xcd\x80\xdd\xb7\xaa\xfc\xb0\xc1\xf1\x9e\x71\x30\x17\x86\x61\x4b\x75\x6a\xac\x75\x34\x32\xee\xd9\xe5\x9b\x6f\x9f\xe9\x50\xa9\xde\xf5\x77\xe7\xee\x6e\xca\x55\x9a\x49\xf1\x3a\xb1\x94\xd2\x87\xc2\x15\xb9\x8b\xb8\xa5\x98\xdc\xe8\x71\xd5\x3b\x1a\xf6\x62\x2d\x77\xab\xbe\x36\xbb\x74\x82\x3b\x6c\x09\x39\xaa\xc9\x29\xb9\x21\x5f\xbb\xdd\x5a\xd1\xc9\xf8\xb8\xf1\x48\x4f\xcd\x41\x3d\x94\x8c\x0f\x3a\x73\x43\xd4\xe5\x7c\xc2\x75\x2c\x8a\x03\xa7\xac\x0c\x89\x4a\x84\xaf\x33\x1a\xd3\xc2\x0a\xb6\xaf\xea\x60\x7c\x0b\x19\xa2\xff\x7d\x30\x39\xb3\xd0\x68\xd5\x7f\x1b\xb5\xce\xcf\xd7\xa1\x83\x9a\x19\xab\x0d\xe2\x41\xc9\x9b\x10\x6b\x35\x14\xc7\x8a\x81\x38\xee\xed\x20\x4c\x87\x00\xe7\x98\xde\x38\x98\x90\x17\x21\x10\xb0\xc7\xef\x8b\x88\x62\x02\x8a\x55\x9c\x25\xd2\xcb\x4c\x8c\x0f\x64\x24\xe3\x4d\x15\xa1\x12\xb8\x13\xa9\x47\x8d\x0e\xb4\x77\x18\x6d\xad\xe4\x21\xdd\xff\x59\x9d\x6c\x69\x58\x60\x6a\x76\x33\xd3\x11\x78\x5d\x1a\xbc\xf8\x9d\x46\xe1\xb4\x17\x32\x24\xbf\x8d\x2a\x84\x27\x9b\x76\x23\xe7\x5c\xfc\xde\x1c\x35\xa7\x76\xc0\xbf\xad\x3e\xe0\x79\xcd\x80\xe7\xcd\x03\x9e\xfb\x07\x3c\xff\x46\x03\x06\xdd\xd6\xb2\xa7\xba\x9d\x86\x53\x1d\x9d\x6f\x59\xda\x1b\x30\x7a\xee\x29\xe7\x0b\xf0\xec\x9e\xc2\x5c\x4d\x9f\x31\xf5\x7f\xda\x60\xea\x6f\xfb\x81\x7c\xda\xa4\x70\x94\x25\x9c\xf0\x26\x54\x51\x7f\x5f\x6a\x16\x1d\xb8\xf6\xc0\xa3\x49\xbd\xaf\x4e\xe7\xa6\xd3\x7b\xe0\xe5\x5f\x1b\xb9\x72\xeb\x32\x8f\x23\xe2\x8f\xcb\x31\x75\xd6\xe9\x96\xc9\xb3\x49\x96\x4a\x43\xaa\xca\x36\x99\x4a\x87\x68\xa9\x05\x49\x57\xa8\x6c\x71\x2e\x5b\xe6\x98\xea\xa8\xab\x33\xf9\x84\xda\xb5\x16\x6f\x88\x18\xd2\x18\x2f\xa4\xe9\xb6\x48\x8b\xce\x4d\x85\xc8\x28\x1b\xd5\xf4\xba\xb1\xe6\x62\x44\xac\xab\xe1\x0e\xda\x4b\xe0\xd2\x2c\x62\xb7\x81\x45\xe4\xda\x1d\xa0\xb5\xfe\x77\x7b\x56\x86\xa5\xbc\x51\xde\x07\x9d\x0a\x34\xdd\xd6\x7b\xe8\x96\xee\x71\xe9\x58\xe0\x5a\x8b\x56\xc3\x75\x9f\x4a\x59\x32\x76\xab\x73\x38\xbe\xeb\x5c\xe7\xdc\x0e\xa7\x76\x92\x69\x1d\xd7\xc9\x61\xd3\x2a\x45\xd2\x2d\xd6\x6c\x8e\xa1\x56\x71\x92\x6e\x74\x65\xf7\xc3\x55\x26\xda\x37\xe5\xfd\x88\x6e\x6a\x4c\xb7\x95\xdc\x5c\x59\xcc\xaf\xf7\x9d\x18\xe7\x98\xf7\x01\xbd\xa1\xcf\xfb\x01\xdf\xd5\x6b\x58\xba\x0a\x4a\x33\xb6\xc2\x82\x7c\x34\x0b\xed\x2d\xc0\xcf\x26\x6c\x12\x8b\x79\x14\x58\xc3\x2f\xc1\x9f\x60\x7f\x7f\xd6\x20\x2b\xe8\x18\x66\xb2\x68\xaf\x1a\xd5\x49\x3e\x0e\x56\x05\xcc\x03\x62\x8b\x07\x3e\x69\xe0\x81\xae\x58\xf3\xc4\xf3\x16\xa9\xe6\xa1\xe9\xce\x93\x86\xd7\x7e\xde\x77\xa6\xb2\x86\xef\xa1\x69\xe5\x99\xe9\xce\x13\x6a\x11\x8f\x85\xb6\xb6\xd8\xe9\xf1\xeb\x63\x65\x24\x2e\x8d\xfa\xaf\x46\x3c\x35\x6e\x38\x30\xeb\x0f\x90\x21\x8c\x46\x07\xc0\x22\xe2\x44\x96\xe2\xe3\x88\xd5\xd7\x56\x04\x6b\x4b\x3e\x9b\x02\xbb\xb5\xbf\xa1\x55\x97\x5c\x61\x96\xf5\x08\x79\x8e\xd1\x05\xcd\xbd\x16\xc5\x8d\x9d\x16\xe4\x76\x6c\x6f\x03\xf8\xb6\xef\x96\x52\x90\x7b\xe1\x69\xbe\x69\xe4\x7c\x7f\xa8\xbb\x8a\x04\x75\x87\x2f\xcb\xed\x11\xa3\x79\x01\x98\xe3\x54\xd3\xd9\x0b\x6f\x6a\x9d\x40\x57\x2c\xf1\x8c\x93\xfb\x9f\x4b\x3e\x70\xa9\xbd\xcf\x5a\x80\x26\xd0\x03\x38\x4f\x93\x1b\x58\x4c\xc5\x8f\xf7\xad\x0f\x88\xf4\xc6\xe8\x16\xf7\x3d\x72\x69\xee\xdd\xea\xdc\xb5\xb7\xe4\xb9\x6b\x6f\xa9\x73\xd7\x9e\xef\xdc\x25\x47\xa2\x03\xa7\x58\xf3\x59\x81\x0e\xb9\x8c\x55\x47\x1d\xe8\x2b\x10\xfa\xca\xca\x8c\xfb\x96\x29\x56\xd4\x1f\xd1\x13\x85\x38\xc7\x2b\x55\x85\xff\x74\x21\x4a\xcc\x2b\x25\x8c\x75\x04\xc5\x5d\x0d\x3f\xa8\x3d\x17\x2d\x38\x19\xd5\x9c\x8d\xcc\x16\xbf\x78\x21\x58\xfe\xca\x57\xd2\x92\xa8\xb0\x43\x48\xcd\x95\xf8\xe4\x8b\x75\x18\x72\x2d\xc5\x4e\x40\x3c\xef\x42\x22\xfd\x5a\x5e\x5a\xd6\x0c\xe9\xa5\x81\x34\xbe\x44\x3a\x1e\x31\x60\x7f\x95\x3b\xf0\xfd\xc5\x77\xe0\xce\x4b\x69\x5d\xb1\xfe\xb5\xb4\xe3\x37\xcb\xba\x3c\xae\xc4\x4d\xfc\xd7\x8c\x9a\x48\xb0\x6f\x82\x2c\xed\x5a\x21\xa0\x28\x26\xcd\x45\x20\x29\x2d\x2f\x01\xed\x79\xd2\x51\xa8\x68\x41\x99\x4c\x4b\x5e\x04\x05\x44\x93\x70\x8b\xaa\xf4\x2a\x88\x1e\x38\xfd\xc0\x36\x45\x9e\xda\xf5\x87\x9e\x1a\xc5\x11\xf7\x96\x16\x19\xd6\x54\x8f\x82\x42\xd3\xe0\x77\x50\x6d\x63\xa3\x42\x9e\xe6\x19\xb4\x72\x1f\x66\x60\xd2\x1f\x16\x5d\xfe\x70\xc8\xb6\xc1\x53\x18\xa0\xd4\xf7\xb8\xd7\xb2\x1c\xd0\x50\xb8\x97\xd9\x76\x1c\xb2\xa6\xd6\x68\x2d\x1a\x90\x4c\x4d\xe1\xc6\x86\x99\x23\xf2\xbb\x11\x34\xe3\xda\xc6\xe2\x1f\x4d\x9e\x95\x6c\x05\x2d\x0d\xc3\x66\xc5\xf1\x82\xe7\x4c\x10\x76\x8d\x0e\xd1\x8a\x40\xd5\x35\xc3\x20\xc1\x8f\x68\xe8\xa2\xbe\x07\xf3\x1e\xea\xed\xab\x1f\xe4\x34\xe7\x71\xee\x54\x13\xf5\xc8\x8b\x01\x25\xe8\x8a\xff\x9f\xd7\xb9\x89\xf2\x55\x39\xd7\x7b\x8b\x7c\x03\xcb\xc7\xa0\x82\x7c\xb0\xd8\xf3\xb8\xd8\x8f\xb6\x1e\xb1\x51\x90\x8f\xb3\x74\xae\xd7\x3f\x9f\x4d\xb2\x5c\xb0\x01\x36\x18\x5c\xf1\x8b\x49\x10\x7e\xfe\xff\xd9\x7b\xd7\xb5\x36\x72\xa5\x61\xf4\xf7\xe2\x2a\x14\xbe\xf5\xc6\x36\x18\x1f\x38\xe4\x60\x86\xc9\x72\x80\x24\x24\x01\x92\x40\x26\x93\x61\xf1\x40\xd3\x2d\xdb\x1d\xda\xdd\x9e\x56\x1b\xe3\x21\xfc\xda\x3f\xf6\x9f\xef\x02\xf6\x0d\xec\x67\xdf\xd7\x7b\x25\xfb\x51\x95\x8e\x7d\x30\xc6\x90\x99\x79\xd7\x47\xe6\x79\x06\xb7\x0e\x25\xa9\x54\x2a\x95\x4a\xa5\xaa\x13\x4c\x13\xfa\x94\x63\xf0\xd2\x85\x4a\x2f\x9a\x86\x5e\x01\xa0\x0b\x0b\x75\x38\xe1\xd6\x17\xc8\xda\x33\xb2\x50\x17\x49\xea\xcc\x5c\xee\x47\xde\x10\xae\xea\x11\x70\xd5\x68\x2b\xa6\xbf\x0f\xfd\x98\x9e\x9c\x70\xa4\xcd\xcd\x0f\x19\x25\x2c\x89\x7d\x37\x99\xe7\xc3\x42\xde\x59\xf3\x68\xc7\x0f\xa9\x08\xf6\x33\x2e\x2b\x30\xf3\x27\x27\x94\xed\x02\xf0\x79\x94\x45\x44\x04\x28\x7e\x6e\x9f\x83\x0b\x57\x60\x18\xbb\x43\xff\xb0\x47\xfb\x1c\xc2\x85\xef\xe1\x4b\x94\x6c\x0f\xca\xab\xcd\x15\x5e\xe5\x86\x46\x4b\x69\x68\x25\x6c\x9a\x86\xc3\x3e\x8d\x39\x29\xeb\x37\x78\x5d\x9a\x18\xe1\x01\xba\x34\x51\x4f\xda\xe4\x85\x84\x1f\x26\x34\x8e\x06\x9f\xb0\x13\xc2\x91\x63\x39\xd3\xe3\x8a\x34\x48\x85\x99\x37\x86\x36\xf2\x93\xde\x41\x32\x0e\xd0\xe7\x7b\xce\xa0\x9e\x4c\x33\x24\x0d\xe5\x47\x0c\x46\x43\x9f\x38\x0c\x18\x70\xc1\x28\x9e\x2f\x4f\x3b\x0c\x80\xf2\xa3\x46\x01\xc0\x0b\x07\x81\x97\xdd\x72\xea\x0a\x46\xd2\x7c\xfa\x7c\x9a\xa1\xd8\xb0\x7e\xc4\x78\xec\x16\xf2\x06\x65\x7a\x1d\xcb\x03\x11\x9d\x7d\xab\x90\x2b\x65\xb0\x79\xf6\x8d\xef\x0c\xd1\xd9\xb7\x9a\x5e\x96\xe4\x05\xa4\xb7\xc8\x95\xe4\x38\x2d\x48\xb8\x5e\xe7\xfc\xce\x66\x1d\xcf\xef\xc4\x3a\xea\x75\x11\xb4\xd5\x09\x48\x9d\x30\xbf\x3f\x08\x28\x71\xa3\x30\xa1\x97\x09\x39\xf3\x43\xcf\x0f\xbb\x30\x4d\x8e\x7c\xb0\x53\x30\x41\xcb\x2b\x7c\xc9\x60\xbb\x35\xd1\xac\x25\xad\x77\xc2\x2a\x49\x7a\x0e\xc4\x83\xd7\xde\x03\x15\xd8\x72\x27\x84\xdd\x81\x6f\x08\xbc\x18\x58\x9b\x0d\x43\x9c\x69\xaf\xa2\x9c\x58\x82\x7f\x1b\x36\xf2\x13\xb7\x47\xca\xb6\x1f\x42\xd7\x61\x94\x34\x5b\xaa\xa8\x36\x63\xce\xfa\xc2\x0c\x6b\xae\x13\x04\x65\xec\x90\x53\x31\x36\x08\x01\x67\x39\x0f\x4e\x95\x9c\xdd\x04\x8a\x17\xc9\x42\x5b\x29\x80\x56\x25\xee\x14\x00\x79\x29\x73\x0b\xd3\xfb\x96\x86\x56\x5f\x20\xb5\x5a\xcd\x89\xbb\x8c\x2c\xd4\x53\xb4\xdc\x09\x6b\xce\x60\x10\x8c\x25\xc8\xb8\x3b\xe4\x67\x09\x3c\x40\x5c\xe3\x26\x67\x53\xd5\x93\xc6\x9d\xa8\x0a\x0e\x5d\x4c\x5c\x20\xe4\xd3\xcb\x5a\x73\x32\xb9\xf8\x42\x65\x81\x07\x2f\x01\x8b\xa7\x56\x20\x3a\xc1\x88\x70\xb9\x7e\x3b\x8e\xa3\xb8\xec\x27\xfc\x98\x4c\x7c\x46\xc2\x28\x21\x0e\xac\x29\xea\x26\x8f\x4a\x30\x3e\xe5\x82\x31\x77\x9c\xcd\x29\xc6\x09\x43\x9a\xd0\x55\x7a\x49\xc5\x2c\x26\xf1\xd8\xc6\xfc\xa3\x47\x3c\x13\xad\x35\xaf\x89\xeb\x00\xd5\xd2\xd4\xf4\x70\x9e\x24\xf8\x47\xb6\x83\xcb\xd3\x76\x50\xc8\xd5\xfb\xa3\x50\xf2\x45\xb2\x41\xae\xae\x6b\x76\xda\x0d\x38\x87\xe8\xc1\xd8\x3d\xd1\x39\xbb\x3a\x52\xa6\x2c\x97\x8b\xd1\x95\xbf\xa3\x28\x23\x6c\x5b\xd4\xb9\xb2\xe6\x30\xe6\x77\xe1\x01\xbe\x1e\x7e\xe2\xc4\x5d\xf0\xaa\x45\x3a\x51\x4c\xca\x40\xc4\x64\x83\x34\xd7\x89\x4f\x7e\xd2\xab\x46\x3c\xee\x5b\x27\xfe\xe2\x22\x2f\x0c\x2e\x6f\xa2\x61\xec\xf2\xbd\x4b\x95\x3a\xf2\x8f\xd7\x35\x9c\x73\x3a\x26\x7e\x28\x8a\xf1\x4a\x3a\x74\x38\x3f\x7a\x25\x11\x58\x57\xe5\xe1\x1a\xab\x20\xbe\x79\x45\xec\xe4\xd1\x39\x1d\x73\x11\x13\x73\xe1\x6b\x9d\x5c\xc3\x7f\x92\xa8\xa0\xdc\x3a\x28\x54\xd0\xcb\xe5\x78\x40\xa3\x0e\xd9\x20\xe2\xc7\xc1\xb8\x7f\x16\x05\xc0\x66\xe7\x25\x0e\xe6\xe1\xd0\x65\xe6\xf3\xd3\xa1\x78\x17\xc2\x0b\x32\x48\x9c\x27\x2f\xcc\x87\x08\xd6\x7e\x26\x6a\x47\x67\xdf\xd6\xc1\x69\x52\x51\x39\xb1\xef\xdd\xd4\x19\xbe\x2f\xba\x51\xc8\x92\x78\xe8\xca\x5e\x88\xc2\x98\x0b\x7e\x79\x44\x5f\x15\x26\xc9\x0b\xdd\xd5\x96\xdd\x25\x5b\xea\xd8\x0c\x1c\xc6\xd2\xce\x13\xf4\x97\x45\x76\x3e\x65\x82\x44\x74\x94\x78\x9b\x52\x1a\x48\x29\xc2\x40\x3e\x4b\x25\x1e\x65\x6e\xec\x0f\xf0\x95\x0d\x5a\xb9\x71\x2a\xd1\xc9\x35\x2d\xaa\x90\x8d\x82\x74\x4e\xb2\xe0\xc9\xd9\xcc\x77\xa3\xb0\xe3\x77\x87\xb2\x26\x70\x14\xa0\xb1\x79\x58\x0f\xf3\x9c\xf8\x74\xf1\x8a\x59\x75\x14\xfb\x89\x55\x2d\x7f\xc9\xc9\x91\x1b\x35\xcf\xe9\xd8\xfc\xae\xac\x9b\xf4\xa7\x31\xba\xa9\xa7\x0f\x10\x97\x44\xc2\x6a\x95\x25\x4e\xe2\xbb\x1f\x24\x2a\x79\x77\x75\x76\x25\x8b\x7c\x03\x90\x9e\x6a\x13\x64\x65\x5d\x3a\x78\xd2\x70\x27\x41\xb1\xbb\xb0\xae\x0e\x83\xba\xc4\x3a\x88\x5c\x65\x2d\x70\x3b\x71\xe8\x87\xdd\x22\x21\x75\x35\x5d\x10\x2c\x13\x8a\x24\x63\x2c\xa2\xaa\x24\xd1\x26\x2b\x3a\x8e\x34\x9f\xae\xd8\xe5\x26\x01\x86\x02\x76\xf1\x5f\xc0\xd7\x5e\x81\xe4\xf6\xa4\x91\x53\xf8\xc6\x06\xa0\xd4\xfd\xcb\xbb\x2a\xd0\x9c\x29\xf1\xea\x26\xc0\x18\x73\xd3\x09\x82\xcd\x1e\x75\xcf\xcb\xbe\x70\xad\x5b\x35\x27\x4d\x12\xd3\x23\x95\x4d\xe4\x8f\xa8\x63\x15\x04\x86\x0a\xd2\x44\x48\x4d\x89\x62\x7e\xd3\x09\xb9\x2c\xc1\x39\x30\x71\xd0\x02\x94\x38\x8c\x38\x8a\xac\xe7\x91\xda\x11\x6d\x70\x4a\xfb\x34\x0c\xf2\xdc\xb0\xa8\x6f\x55\xa8\x0c\xeb\x46\xc4\xdd\x43\xe1\x5b\xbd\x05\x4c\x8f\x2f\xe9\xf9\xac\xaa\xab\x56\xac\xe7\x7b\x68\x9f\x2b\x62\xf1\xae\xeb\x0c\x9f\x7d\x88\x23\x97\x32\x46\x41\x5f\xae\xdd\xbe\xc3\x4e\xd5\xa3\x70\xd3\x22\x1a\xae\xc1\xb7\xd6\xdf\x7c\x02\x15\x12\x9c\xf5\x65\x09\x99\x64\xdc\x8e\xd1\x80\x22\x37\xd6\x60\x44\x92\xd9\x41\x34\x8a\x57\x31\xf0\x21\x4d\x94\xd7\x35\x8d\x3c\x19\xf7\x18\xfe\x6a\xe7\xde\x12\x74\x45\x94\x12\x9f\x87\xfc\x84\xb2\x41\x74\xc3\xc4\xbe\x36\x80\x31\xe0\x68\x5f\xe0\x5f\x9d\xd1\x82\xf9\x96\x03\x13\xe2\x19\xef\x79\x7d\x61\x81\xc3\x59\x20\x07\x34\xd1\xc3\xc4\xb0\x31\x35\xcc\x69\x27\x09\x0d\x31\x50\x22\x97\x55\x78\x8b\xe8\xe2\xd2\x75\x86\x3c\xb9\x46\x76\x23\x96\x90\xb3\x38\x1a\x31\x1a\x33\xe2\xf9\x5e\x58\x4a\x08\x9c\xac\xb8\x64\x80\x50\xac\x51\x30\x9a\x24\x94\x73\xa3\x08\xc1\xf5\x9d\xb1\x70\x77\xce\xf9\x76\x4c\xb1\xdf\x9c\xef\x44\x1d\xc2\x1b\x8f\x29\xd2\x04\x39\x80\x71\x01\xc8\x3a\xe8\xb3\xcc\x7d\xad\xac\xe8\xa6\x4a\x8e\x90\xbe\x30\xfe\x37\xdf\x7a\x4a\x55\x71\xb3\x25\x86\xcc\x3b\xf5\x9a\x26\x84\x0f\x97\x26\xc4\x11\x51\xa8\x07\x52\x18\x11\x65\xea\x82\x90\xec\x88\xe1\xbc\x54\x39\x84\x6b\x93\x90\x5e\x26\xc8\x1a\xd4\xb9\xa6\x5e\x27\x3b\x49\x89\xaf\x1e\x1c\x68\xcd\xd0\xfd\xa9\xe2\xd2\x9d\x82\xa9\x05\xac\xd7\xc9\x56\xc4\x91\xe7\x45\xc4\x09\xc7\x49\x8f\xa3\x40\xb8\xfe\x43\xef\xa1\x3d\x07\x85\x7e\xe1\x40\x41\x7b\x04\xc5\x63\xa4\x24\xaa\x23\xde\xb7\x63\x10\x15\x72\xfa\xc7\xff\xe9\x7e\x6c\x58\x84\x5a\xfb\xc6\x58\x6d\x10\x0c\xbb\x7e\xa8\xef\xd4\xa1\xa0\xee\x7a\x95\xe0\xd0\x79\x3d\xcb\x8f\x66\xa6\x03\x46\xf3\x96\xf3\xc8\x7a\x5d\x10\x23\x6c\xc4\x3e\x13\xbb\x96\xc7\x87\x01\x93\x08\xf3\x2c\x96\x0c\x39\x0d\xfc\xf0\xfc\x94\x17\xe3\x1b\xb6\xe9\x05\x55\x8d\x3a\x56\xd0\x2a\xf6\x9a\x40\x07\x43\xe3\x80\xa6\xcb\xc9\x41\x68\xfc\xac\x67\x7c\x48\xda\x1c\xc4\x42\x13\x24\x5a\x63\x12\x8b\x17\x0a\x3f\x7e\x2c\x56\xa0\x93\x24\x8e\xdb\xa3\x5e\x36\xd4\x67\xb9\x51\xd5\xbb\xe6\x91\xda\x05\x8e\x2b\x65\xf1\x2a\xb7\x04\x0c\x56\x1c\xf2\x38\x06\xa8\x57\x23\xbb\x3e\x63\x9c\x28\x98\x89\x9f\x79\x9e\x8b\x47\x80\xf9\x5a\xa9\x32\x21\x5a\x68\xe6\x1a\x52\x9f\xc9\xc0\x17\xbc\xcc\x9c\xcb\xe4\x99\xd3\x6a\xb9\xa5\x37\x96\x53\x9b\x9f\xb9\x49\xcc\xbb\x9d\x70\x02\x96\xf7\xbc\xc4\x0f\x03\x3f\xa4\x7a\x49\xcd\x19\x31\xfa\x71\x85\xc2\x71\xfd\x30\x12\xf6\x25\xe9\xe5\x26\x72\xcb\xe6\x2c\x9b\xf7\x9d\xdf\x18\xa8\x69\xc4\x23\xef\xb7\x07\xfb\x7b\xfa\xbd\xa0\x12\x58\xf9\x9a\xe5\xec\x85\x17\x36\xa7\xa3\x80\x5c\x4c\x4a\xe1\x55\xab\x50\xf1\x88\xff\x34\xbc\x95\x64\xb0\x97\xc5\xca\x27\x28\xc2\x08\xef\x16\x89\xe9\xc0\x78\x79\x24\xfd\x78\x72\x94\x49\xec\x90\x57\x4e\x10\x9c\x39\xee\x39\x23\x4e\x4c\x61\xf2\xd9\x70\xc0\x8f\x7f\x6a\xb9\x2f\x90\xcf\x8c\x76\x86\x01\x8c\x0d\x71\x8b\xdc\x8b\x4d\x42\x31\x22\xa6\x00\xc3\x12\x6b\x79\x68\xbd\xba\x2e\xc4\xa5\xa6\x8c\xf4\x95\xd2\x85\xc9\x5b\x90\x76\x00\x75\xeb\x16\xc7\x2a\x8b\xa3\x8a\x28\xbd\xb1\x41\x4a\x4a\x05\x56\x22\x2f\xac\xaf\x96\x3c\xd2\x95\xa1\x74\xa5\x02\xec\xad\x84\xba\x8f\x52\xc5\x98\x1e\xb2\x81\x00\xd7\xd5\x83\x4e\xb8\x35\xaa\xf9\x0c\x6f\x8f\x64\x7d\xab\x06\xac\x47\x43\x1c\xb4\x96\xe4\x85\x90\xfd\xec\xc5\x23\x26\x9f\x83\x29\x9a\x7c\x61\x06\x4c\xf9\x66\xb0\x79\x70\x60\xee\xac\x85\xd3\x74\x00\x65\x0a\x27\x0a\xb3\xcb\x29\x41\x6a\x6a\x56\x05\x2f\x9c\xfd\xf0\x3c\x23\x2c\xc8\xe2\x90\xd9\x32\xc5\x28\xe1\x15\x69\x00\xda\x13\xc8\x4e\x79\x70\x14\x55\xc1\xe3\x6f\x10\x44\xa3\xed\xfe\x20\x19\x9b\xee\x1b\x2d\xd9\x47\x21\x4e\xa3\xdc\xc6\xb6\x25\xf6\x54\x0d\x12\x82\x96\xd4\x23\xb0\x2c\xee\x64\x1d\x19\xa2\xcb\xd2\x79\x33\x9a\x18\xa2\x95\x69\x33\xa4\xc5\xbb\x8d\x8d\xac\xcc\x55\x51\x7e\xc6\xe7\x0c\x86\x51\x28\x95\x19\x70\x33\x3b\x93\xbd\x44\x7a\x0e\xc3\xed\xd5\x93\x33\x66\x71\x21\x01\x31\xbb\x6f\xa9\x41\xd8\x21\xdc\x77\x3a\x86\x00\x07\x72\x87\xdc\x3c\x94\x28\x46\xbd\xaa\x92\xae\xd2\x8c\x47\xda\x7c\x18\xbd\x7a\xfc\x98\x4c\x18\x82\x7c\x03\xaf\xb6\xf1\xf4\x20\x62\x3a\x08\x1c\x17\x8f\x00\x99\x41\x64\x64\x07\xde\x78\xc1\x2e\x2e\xa0\xeb\x8f\x42\x3f\xa8\xb9\x12\x5e\x9e\x58\xab\x24\x3b\xa4\x94\xe2\xdb\x91\xd4\x26\x68\xcc\xba\x41\x85\x22\xae\xb3\x28\xa9\xa4\xd0\xf5\x39\x3c\x49\x0b\xed\x9d\x41\xe3\x64\xc3\x2c\x95\x52\x28\xae\xde\xa3\x42\xb1\xbe\x40\x84\xe5\x07\xf9\xa5\xfd\x89\xec\xec\xbd\xdd\xde\x3c\xdc\xd9\xdf\x23\x0b\x75\x0d\x7b\x80\xa7\x27\xa8\x7e\x67\xfd\xa3\x28\x5a\x53\x96\x8b\x1b\x44\x27\x21\xef\x32\x92\x3a\x60\x95\xb4\xcb\x8c\x24\x6f\x18\x3b\xe2\xde\x45\x26\x51\x87\x61\x35\xb5\x1d\xc8\xf3\xfb\x39\x1d\x17\xa9\x10\x56\xb4\x06\x81\x97\x9a\x74\xbe\xe7\xf9\xaa\x30\x6e\x28\x5f\xfc\xa4\x17\x0d\x13\xad\x47\x59\x2e\xd2\xeb\xdf\x54\x71\x65\x42\xc3\x45\x6d\x29\x98\x3e\xdb\x73\x0a\x6f\xa0\x0c\x1d\x09\x94\x9b\x34\x44\x28\xf0\xa3\xd5\x3a\x3f\xfe\x26\xb0\x4e\x5e\x45\x7c\x87\x21\xbd\x24\x19\xb0\x56\xbd\xde\x77\x12\x1a\xfb\x4e\x50\xeb\x46\x51\x37\xa0\x35\x37\xea\xd7\xfb\x11\xef\x44\x5d\x12\xd2\x12\x92\x4f\xad\x97\xf4\x83\xff\x95\x4a\x5c\x0a\x9d\x64\x18\x3b\x81\xfc\x74\x87\xf1\x05\x65\xbc\x9d\x24\x22\x01\x75\x60\xe1\xeb\x0b\x42\x3f\x24\xa3\x9e\xef\xf6\x08\x75\xe0\x7f\x42\x16\x8f\x86\x81\x47\xce\x28\x3f\x1f\x7b\x35\x40\x9c\xa2\xd8\x0c\x09\xf3\x35\x53\xaf\x93\x43\x7e\xee\xe5\x27\x9a\x1e\x25\x7d\x7e\x7e\x76\xa3\x7e\x3f\x0a\x65\x45\xe8\x07\xe7\x54\xd4\x61\x74\x27\xdc\x87\x18\x94\xee\xf0\xcc\x77\x97\xce\xe8\x1f\x3e\x8d\xcb\x8d\xda\x6a\x95\x34\xaa\xa4\x51\x5b\xae\x92\x66\x05\xb6\xbc\x7a\x5d\x28\x33\x19\x3f\x35\x0b\x1e\xcf\xdc\x98\xd2\x90\x38\x09\xe9\x0c\x83\x80\x5c\xd0\x20\x72\xfd\x64\x4c\x3a\x71\xd4\x27\x51\xa7\xb3\x24\x0b\x84\x1e\x82\x60\x41\x34\x0a\xc6\xc4\xa3\x2e\x0d\x40\x78\x01\x69\x1e\x9e\xdf\xf3\xae\x81\x79\x90\xec\x5a\x6e\xc7\x1a\x93\x3a\x16\x80\x53\xd9\x09\x1d\xab\x91\xc3\x1e\x1d\xf3\x23\x30\xdf\xbb\x8c\x5e\x80\x49\xbc\xee\xb0\xc6\x4e\x11\x6a\x9a\x66\xfb\x87\xbc\xc5\x9e\x13\x0f\x10\xb7\x1c\xf7\x7c\xba\xc8\xd9\x58\x5c\x9f\x31\xb8\xad\x15\xba\x08\x64\xf9\x51\xaa\x9f\x4e\x38\x26\x89\xdf\x87\x89\x01\x58\xc5\x93\xf2\x04\xda\x46\x73\x9a\x62\xa2\xf5\xa3\x7a\x77\xe8\x7b\x94\x8b\xf0\xec\x56\x74\x8b\xe4\xb2\x24\x93\x6d\x92\x05\x4c\xf1\x7d\x60\xc4\x47\x94\xf8\x7d\x3f\xec\x82\x59\x0f\x65\x81\x1f\x26\x4b\x9e\xcf\x60\x4f\x0d\xa3\xa5\x81\x13\x3b\xfd\xa5\x98\x8a\xfb\x21\x2e\x92\x82\xe6\x3e\xcb\x84\x8d\xa4\x2b\x18\x3f\x3f\x92\xb0\xa4\x45\x9a\x6b\x10\x61\x12\x13\xe2\x16\x59\x6e\xe8\xef\x16\x59\xc6\xdc\x7a\x1d\xc9\xfc\xcc\x61\xbe\x4b\x62\xca\xfb\xcf\xf7\x73\x4f\x76\x0f\x6c\xd0\x43\xcf\x89\xbd\x16\x59\x69\xc8\x3a\x89\x5c\x26\x91\x5c\x5f\x7c\x0d\xba\x11\x97\x68\x2e\x89\x13\xfa\x7d\x31\x7c\x22\x13\x5b\x64\xe5\xe9\x9a\xa8\x6d\x36\x03\x38\x61\x51\x9f\x0a\xad\x8a\x58\x22\xb0\x80\x61\x82\xc1\x70\x02\x53\x0e\x20\xa1\x45\x96\x97\xa7\x83\xc4\x69\xda\x02\x24\x12\x24\x9c\xe6\xf3\xb5\x39\x79\x11\x93\xb3\xe3\x19\x49\x8a\x83\xca\xb4\x72\xdf\x0f\x02\x9f\x51\x37\x0a\x3d\x66\x5d\x54\x42\x80\x96\x38\x1a\x86\x5e\xaa\xcc\x22\x29\xf5\x59\x09\xee\x2a\xf1\x5e\x3a\xb3\xeb\x1a\x49\xaa\x41\x99\x26\xce\x3a\x66\x4b\xd9\x43\x1a\x4a\x52\x66\x1b\x39\x9b\xbd\x4a\x32\xda\xc0\xb4\x9c\x36\x1e\xc1\x61\x00\xb7\x31\x69\x63\x52\x29\x0f\x9c\x98\xd1\x57\x41\xe4\x24\xf2\xd0\x26\x2d\xd4\x16\xe6\xc8\x02\xf9\x17\x50\x2f\xb9\xc2\xee\x7c\x87\xd3\xdd\x35\x5e\x34\x99\xd9\xb8\xbe\xaf\x09\x7c\x66\xeb\x89\x0c\x30\x09\x35\x73\x31\x98\xb7\xcc\x95\xe4\x5f\x5c\x1f\x57\xe6\x04\x08\x34\x70\xc6\x73\x7c\x89\xa9\x25\x25\xac\xeb\x70\x45\x61\xfd\x96\xf8\xcb\x09\x4f\xb6\xd9\x52\xbf\x78\x2a\x6a\x3c\x0d\x79\x15\x13\xac\x18\x7f\xf2\xcd\x40\xfa\x12\x97\xfc\x8c\x16\xa3\xfa\xda\xb6\x81\x6a\x42\x25\x59\x91\x17\x76\x66\x8b\x1c\x95\x9c\x20\x90\xee\x2c\xc4\x49\x50\xe8\xb4\x73\xc0\x37\x6d\xf0\xcd\x49\xe0\x9b\x1c\xbc\x54\x2f\xa0\x0c\x85\xa0\xff\x69\x30\x1b\x79\x2e\x35\x51\x80\xff\x64\x8a\x72\xac\x91\x53\x3d\xd5\xb6\xcc\xa8\x49\x66\x43\x5a\xd9\x5a\xba\x05\x95\xa5\xb6\x6f\xd9\x1b\x3d\x49\xf8\x0f\xbf\xb3\x3d\x91\x15\x53\xfd\x10\xac\x5d\xed\xee\x66\x37\xd2\xa0\x75\xff\x38\x01\x99\x18\xe1\xdf\x06\x3a\x44\x76\xba\x7c\xaa\xe9\x86\x35\x64\x1b\x04\xc6\xac\x12\xca\x90\x22\x79\x56\x2f\x4f\x75\xee\x3f\x2a\x49\xdc\x95\xaa\xa4\x84\x03\xe0\xbf\x00\x7c\xe9\xb8\x22\x5f\x95\x88\x93\x46\x8d\x86\x17\xb5\xbd\xfd\xad\xed\x93\xed\xbd\x5f\x80\x3e\xe6\x07\x71\xe4\x0d\xc5\x35\xf8\x0b\x5b\x39\xaa\xdb\x53\x3c\x4a\x5c\x47\x7f\xff\x4e\x6c\xcd\xce\x40\x84\xbd\x2e\xed\x8a\x1d\x76\xe9\xf3\x4e\x4b\x11\x1c\xb4\x32\x60\xf3\xa4\x3f\xe4\x3b\x11\x05\xa5\x3f\x5e\x33\xc4\x08\xa8\x54\x21\x2d\xcb\x95\xdb\x9d\x3b\x2c\x18\x9e\x4d\xaa\x13\x7a\x28\x0b\x9a\x9d\x44\x36\x42\xce\x86\x09\xe9\x70\x7e\x4f\x4a\x64\x31\x45\xfc\xf7\xde\x6f\x81\x68\x93\xac\x27\xf4\x1a\x8b\x65\x11\xfb\xe3\xf0\xc9\x09\x6b\x12\x1a\x79\xfe\x8f\xef\x0f\x24\xc3\xe9\xd2\x58\x14\x7c\x0d\x55\x24\x43\xe4\xab\xaf\x91\xee\xe7\x30\xe4\xf2\x44\x37\xf4\xff\xa0\x9e\xea\x74\x99\x55\xc8\x11\x9f\xd9\x09\x40\xbf\x45\x7e\x58\x2e\x55\x4b\xb0\xc9\x1f\x5b\xa3\x31\x0d\xac\xca\x79\xab\x82\xbc\x10\xbb\x42\x8b\x80\xd2\x93\x1d\xa7\x9f\x2c\xa3\x38\x45\x3d\xbe\xd6\x33\xfa\x0f\x33\x13\xcc\xcf\x78\x57\x95\x94\x92\xa6\x46\x59\xc0\x62\x8b\xd9\x5a\x30\x8b\x42\x91\x62\x8c\x0e\xed\xd6\xd1\x6a\xb5\x3d\x4c\x22\xf4\xf5\xb0\xa5\x76\x43\x53\x53\x93\xcd\x2f\x0b\x2f\xb5\x62\x04\xa8\xd5\xb2\x92\xd4\xa0\x1a\x96\xde\x16\x5e\xf0\x44\x70\x73\xce\xf7\x64\xf1\xf6\xb3\x4e\x56\x9e\x08\xf4\xd6\xeb\x4a\x84\x1f\x8d\x46\xb5\x51\x14\x74\x62\xa7\xef\x04\x83\x9e\x03\x07\x4f\x3f\x1c\x0c\x93\xfa\x0b\x7f\xa3\xbc\xba\xf8\x5f\xcb\x2f\x17\x9b\x6b\x8b\x0b\x8b\xe5\xcb\xc5\xff\x5a\x7e\xb5\xb8\xf2\x64\xb1\xb2\xb8\xb0\xb0\xd8\xa8\x2d\xaf\x41\xa6\x4a\xaf\xc0\xdf\xb5\xca\xe2\xc2\x62\xb3\x61\x4e\xa3\x21\xe1\x95\x57\xc9\x22\x69\xae\x91\x05\x4c\x1c\x44\xa3\xb2\xec\x29\x9c\xb4\xd6\x38\xca\x55\xdf\xeb\x64\xad\x42\x16\x48\xb3\x51\x51\x66\x76\x13\x14\x41\xd7\x68\x78\x35\x49\xb3\x54\x5e\xa9\x54\x2a\x69\x3d\xd5\xda\xdf\xcb\xf0\x2d\x2b\x54\x3d\x7a\x24\xef\x17\x46\x7e\xe8\x45\x23\xbc\x30\x30\xae\x14\x1e\x3f\x16\x39\x35\x2f\x72\x91\x73\x64\x93\x6a\x96\x73\xb2\x3c\x23\xce\xac\x7e\x2f\xa3\xd3\x7b\x32\x09\x57\x39\x4f\x2a\x6e\xa1\xdf\x9b\xed\xa9\x86\xea\xc4\xa5\x25\x86\x6b\x99\x52\xd0\x52\xda\x4c\xfc\x52\x9a\xd0\x56\xb2\x96\x90\x4f\xef\x6c\x43\x7b\xc6\xe5\x21\xb6\xe7\xc8\xe7\x7a\x39\x94\xf8\x74\xf5\x59\x45\x29\x6d\x27\x99\xf9\x3c\x05\x8b\x5b\x79\x54\x78\x4d\x13\x54\xb6\x84\x08\x5c\xdf\x2d\x26\xe4\xf4\x9c\x8e\x4f\x49\xd4\x21\xa7\x28\xf2\x9c\xd6\xe6\x88\x38\x5f\xc4\xfe\x05\xc4\x45\xd4\x32\xfd\xbe\x38\x4c\x60\x51\x50\x2b\x88\x9f\x49\x44\x7e\x1f\xd2\x78\x5c\xcb\x3b\x22\x9c\xd3\x31\x94\xe5\x7f\xc5\xad\x1f\x3f\x40\x46\x1e\xaf\xd6\x05\x9b\x86\x05\xf2\xaf\x58\xdc\x15\x5e\x2d\x5c\xab\x7b\x43\x5e\x54\x9f\xa0\x3a\xc4\x4f\x4a\x4c\x8c\xa2\x8a\xfe\x22\x4f\x15\x49\x43\xcf\xeb\x73\x26\x7f\x44\x64\x96\xb1\x8f\x86\xb9\xab\x79\x49\x27\x31\x69\x95\x32\x6c\x89\xcd\x69\x91\x67\xb7\x17\xa2\x76\xcb\x54\xca\x5e\xe7\xd8\x0d\xab\x3e\x64\x09\x66\xe2\x2b\xa0\xfb\x59\x15\x7e\x5f\xae\x06\x38\x5f\xdc\xec\x91\x5a\x04\xeb\x2d\x52\x2a\x73\x9a\xba\x07\xf0\x27\x9a\x4b\xe5\x34\x53\x0b\x27\xbc\x03\x4d\x83\x9a\xad\x43\x4d\xf9\xf2\xb6\x48\x07\x7c\x47\xb0\x77\x18\xa0\x82\x31\x5b\x17\x96\xc1\x71\x08\xdc\x15\xb3\xc2\xe1\x35\xee\x03\xf6\x1d\xc6\x68\x03\x9a\xad\x33\x2b\x27\x31\xf5\x86\x2e\x3d\x71\x19\x3b\x71\x9d\xc0\x2d\x1c\xed\xb3\xd5\x19\xa7\x33\xa7\x89\x3b\x0c\x3a\x07\xda\x6c\xdd\x5a\x45\xb3\xc1\xd0\xe9\x4f\x98\xe2\xe5\xfb\x80\x7d\x87\xd1\xda\x80\x66\xeb\xcc\x5a\xd6\x33\x48\xa1\xc1\xec\x6c\x2d\x3c\xc9\x79\x54\x5e\xd4\xc4\xca\x6c\x4d\x3c\x95\x83\xd8\xdf\x9d\xdc\xc0\x32\x5e\x3c\x3d\xbc\x60\x78\x30\xd9\x7f\x30\xd9\x9f\xd9\x64\x1f\xb8\x8e\x78\xf4\xbd\x6c\x5d\xca\x16\x28\xf4\xb8\xd4\x07\xd4\xca\x24\x11\x20\x22\xd1\xf4\xcb\x24\x1f\x1f\x2e\x6d\x25\x22\x78\x8d\x1a\x78\x0d\xd9\xef\x94\xfd\x0a\x78\x23\xa8\xc0\x55\xa9\x1f\xca\xb9\x7d\x34\xd5\x8a\x81\x0e\xf8\x15\xb3\xb2\x58\x34\x3e\x5f\x32\xd1\xd9\x37\x20\xc2\xec\x4a\xf9\x5b\x5b\xca\xeb\xae\x0d\x22\xc6\xfc\xb3\x80\x1a\x0d\xa0\x74\x5f\x66\x34\xe8\x54\x01\x98\xea\x1a\x4f\xb2\x5b\xd7\x9e\x91\xb0\x0b\x70\x29\xd6\x73\x58\x58\x4a\xc8\x19\xa5\x21\xf1\x43\x3f\xf1\x9d\xc0\x67\xd4\x23\x4b\x84\x0d\x07\x34\x2e\x57\xac\x12\xbc\x05\xea\x61\xd7\x04\x12\x61\x04\x8f\x1f\x13\x79\x46\x86\x6f\x78\x90\x84\x74\x32\xcf\x97\x71\x26\x4f\x8f\x92\xbc\xc0\xe4\x16\xe1\x3d\x4e\x4d\x86\x1f\xf6\x68\xec\x27\xac\xcc\x86\x67\x9b\x48\x90\xd0\x2d\xf8\x2d\x87\x2a\x80\xeb\x0c\xd4\xbc\x59\xef\xa1\x52\x99\xc2\x62\x3a\x7f\x6a\x0e\x78\x59\x7e\xd0\x8c\x29\x63\xbc\x1b\xa0\xfe\xa3\x3e\x28\xb5\xcf\x28\x46\xaf\x8b\x62\x63\xae\xaa\x70\xc7\x3c\x4f\x16\x49\xa6\x2f\x80\x2a\xd9\x7b\xe3\xa5\x95\xda\x8f\xc4\xad\x8b\xd1\x41\xab\xbb\xe6\xf2\xbf\x22\xc6\x93\xae\x16\x2c\x32\xd0\x5d\x68\xe4\x98\x4f\xb6\x85\xfd\xaf\x64\x7a\xe2\x0d\x37\x31\xf9\xa7\xb4\xad\x23\xd7\x92\x9f\x18\xc8\x15\xfd\x63\x94\xaf\x71\xec\xc2\x7e\x47\x79\x7c\x4f\xa5\x17\x4c\x90\xee\x5b\xed\xe4\x04\x46\x02\xbb\xb6\x2e\x02\xf3\xad\xfe\x81\xe6\xcc\x09\xdc\x61\xe0\x24\xf4\x4b\x14\x7b\xe0\xb8\xd5\xda\xb5\x72\xb2\xa5\x62\xd2\x7e\x49\xca\x61\x8d\xa2\x18\xb6\xfe\x47\xb7\x3f\x51\x95\x2b\x65\xdb\xe7\x8e\x52\x7c\xaa\x94\x9a\x32\xa2\xac\xd4\xd8\x20\xf0\x93\x72\xfd\xdf\x6c\xb1\xce\x47\x7d\x64\x5c\x73\x41\x27\x38\xb7\xdc\x8c\xfa\x83\x61\x42\xb1\xd7\x64\x03\x33\x52\xba\x53\x9e\x96\x51\x2f\x5e\x41\xd1\x16\xfc\xbf\x3a\xb5\x3f\xb8\xac\xbc\x74\x34\xef\x4a\x3f\x94\xd8\xf1\x03\xff\x0f\xe1\xe3\x07\x41\xe3\xf8\xd0\x10\x57\x78\x7a\x93\x51\x86\xa4\x95\x20\xc8\x3c\x03\xc7\xa5\x72\x14\xf7\xdb\x8f\xd2\xbf\x2f\xdb\x8d\x52\x5e\x4f\x6c\xd5\xf4\x55\x01\x5a\x5b\x05\xe9\x55\xa3\xd3\x2d\x73\x00\xd7\x13\x9f\x18\x4b\x17\x55\xd7\xea\xde\x5d\x18\x6a\x96\x71\x5f\xe4\x12\xa8\x9b\x11\xac\x4e\x36\xa5\x27\x24\x04\xa7\xd9\x18\xaf\x5d\x25\x46\x3e\x8c\x4a\xd5\xe4\xd9\xd6\xfd\xeb\x49\x4c\x3b\x06\xe2\xa1\xd1\x2a\xfa\x84\xaa\xf2\x4c\x69\x8f\x9b\xff\xfe\x09\xcc\x4e\x45\x09\xb5\xfd\x9e\x04\xe0\x57\x2a\x2d\xd4\xc2\xf3\x76\x3e\x0c\xe1\x19\x27\xa0\x61\x05\xef\x0f\x50\xda\x83\x5f\x3f\x41\x6d\xfc\x00\x59\x4f\xd0\x29\xaf\x7a\x74\x22\x24\x53\x2d\x08\x43\x8a\xa5\x1a\x97\x4e\x22\x62\xaa\x91\x88\x3f\x7a\x18\x8a\xb0\x78\x8b\xc3\x21\x41\x20\x43\xb2\x01\x43\x33\x58\xca\xf7\xef\x92\x2d\x75\x6d\xb6\x04\x28\xa8\x80\x78\x20\xde\xf2\x73\x00\x55\x72\xc4\xc1\x29\xd7\x40\xbc\xff\x95\x4a\x45\x60\x56\xfe\x45\x4f\x60\x46\x9c\x18\x20\xad\x97\xe3\xf7\x7e\x48\x19\x5f\xe3\x38\x32\xe9\x18\xa7\x3a\xa9\xf7\xc6\x94\xe9\x57\x53\xd6\xa3\x23\x24\x0d\xeb\xbd\x91\x72\xa8\xf5\xc5\x0f\x82\xdd\x68\x18\x26\x05\xd6\xdc\xd9\x82\x86\xe1\x29\x0c\x05\xfd\x27\x7e\x31\x06\x80\xb6\xb4\xe8\xbf\xca\x0a\x75\x97\xb5\x87\xb6\xc0\x7f\xa2\x2e\xf5\x2f\x40\xcc\x64\xd3\x74\xc7\x2c\x0f\x6f\x7f\x3e\x68\x6e\x4d\x54\xcc\x6f\xea\x6d\x4a\xc6\x2e\x0d\x80\x6d\x66\xab\x1e\x21\x7d\xb0\x93\xb9\x70\xa1\x4b\xe3\xe3\x2b\xbb\xa8\xf1\x2c\xae\x18\x19\xaa\x78\xd5\xee\x4c\x31\x52\xb2\x40\x0a\xb0\x91\xd3\xda\x20\xaf\x25\xf3\xdd\xd7\x7e\x18\x8c\xc9\x80\xc6\x9d\x28\xee\xab\x2d\x0f\x8c\x25\xfc\x0e\x19\x82\x29\x40\x87\x3a\xc9\x30\xa6\xc2\xdc\x4c\x9c\x7e\x49\xd2\xa3\x7d\x52\xee\x0f\x83\xc4\x0f\xfc\x90\x56\x09\x73\x9d\x80\x1e\x46\xaf\xfc\xa4\x62\x98\x94\x97\x4d\x67\x9e\xdf\xbf\x4b\x76\xab\xcb\x72\x21\xe4\xd1\x8d\xac\x3d\xef\xd4\x7f\x34\x1f\x0a\x97\xa3\x07\x4c\xf8\x1b\xb5\xa2\x12\xe3\xeb\xb5\xdc\x81\x9b\x3b\xa6\xda\xf9\x8b\x37\x7c\xeb\xd9\x14\x07\xab\xeb\xa5\xdf\x49\xdd\xb8\x0f\x63\xb5\x5a\xc1\xe6\x91\x7a\x73\x45\xec\x1d\xd0\xa8\xaf\xd3\xb5\x03\x4c\x83\xf0\x26\x8b\x02\x99\x8c\xf5\x2c\x04\xab\x61\xb3\x35\x5d\x2e\x13\xfd\x29\x8f\xee\xc5\xe9\x4d\x4d\x42\x1e\x4a\x89\x7a\xb1\x60\x00\x37\x4c\xe6\xe7\x32\xd8\x15\xf4\x2d\x57\xb0\x35\x75\x36\xdf\x29\xda\xa5\x53\x83\x94\x82\x80\x19\x02\x57\xe3\x42\xc6\xfc\xbf\x4a\x71\x66\xab\x2f\x3a\x8e\x4a\x06\x31\x53\x23\xc5\x1c\xfb\x64\x56\x90\x06\x71\x33\x4f\x28\x68\xd4\xe2\x8f\x7f\xb9\x1c\x7b\x13\xc6\x8f\x44\x82\xc0\x3d\xb9\x3e\xd6\x9e\x49\x73\xf6\x93\x3c\xba\x28\xda\x4b\x72\x69\xe8\x66\x21\xaf\x4a\x38\xff\xfb\x82\xbe\x8d\xad\xb7\x4d\x8a\xc9\xd9\x1b\x8d\x4e\x4f\x07\xd9\xc8\x6f\xac\x86\x4a\x68\x43\x76\xc7\xa7\xc7\xb0\xc9\x77\x96\xd3\xaf\x74\x38\x10\x11\x08\x79\x19\xa8\xdf\x66\x2a\x66\xac\xe5\x65\x4b\xe0\x25\x3a\xee\x59\x4c\xc3\x44\xb8\xad\xc4\xb6\x8e\xf0\x8f\x34\x12\x59\x22\x4d\xd3\x1d\x22\x44\x4e\x34\x6a\xf1\x43\xba\x42\x0a\x11\xa7\x60\xce\xfd\x0d\x94\x7c\xff\x6e\x36\x24\x36\x88\x45\x22\xff\x1a\xec\xe7\x27\x03\xc1\x36\xbb\xad\xd7\x09\x9f\x2c\xe2\x3a\x21\x18\xcd\x78\x60\x9e\x8b\x2f\x39\x2f\x7d\xb4\xfe\xe6\x75\x8d\x2a\x56\x9b\x70\x2c\x1a\x0c\x59\x0f\x4f\x43\xeb\x45\xe5\xb0\x4f\x1b\x39\x9d\x33\x1e\xf6\x64\x99\x61\xbd\x4e\xda\x9e\x47\x3a\x7e\xcc\x12\x9c\x96\x24\x82\xfe\xf0\x33\x3d\x7c\x83\xa1\x70\x44\x82\x28\xec\xf2\x3c\x03\x3d\x51\xf1\x10\x50\x8e\x19\x89\xf9\x51\xeb\xe1\x88\xff\x3d\xb6\x83\x27\x9b\x01\xf6\x88\x98\x4a\x1c\xb0\x00\x60\x86\x7e\xca\xb8\xb7\xc4\xf2\x8a\x29\x55\xc9\xd1\x71\xf1\x52\xc3\xc7\x4e\x05\x6b\x0b\x33\xcb\x79\xbe\xf7\xad\xb5\x61\xf9\xae\xbf\x54\x3e\xf5\x6b\x9e\xed\xd5\x7e\x6c\xe4\x58\x21\x2b\x12\x7a\x99\xb4\x43\xb7\x07\xca\x60\x51\x42\xa7\x99\x25\x65\x40\x95\x74\x69\x3b\xdd\xac\x61\x2d\xe7\x93\xf4\x52\xce\xc4\x27\xd1\x85\x9c\x74\xc4\x49\x3e\x9f\x6f\xec\x08\x43\x35\x9d\x66\xc5\xe7\x70\x06\xe9\x82\x2a\xc9\x2a\x27\x23\xa0\x19\xe5\x64\x52\x1a\x3f\x2a\xa0\x61\x91\x76\xf5\x44\x08\x8d\x47\x25\xef\x12\x6c\x22\xc7\xfc\xff\x1a\x8d\xfc\xcb\x46\x13\x4f\xd1\xa8\xe0\x5f\x30\x66\xfe\x43\x8f\x8b\x7f\xa9\xce\xc3\x87\xec\x61\xe9\xb8\x62\xbd\xf6\xcc\xdb\xe1\x31\x6a\x96\x99\x93\x0a\xbc\x3b\x85\xeb\xe6\x1c\xa7\xf5\x54\x3b\xad\xdf\x8f\x0f\x12\x21\x46\x2a\x34\xd5\x2e\xc1\x66\xf3\x07\x01\x1f\x57\x6e\xe1\xf4\x9d\xaf\x06\xa3\x5f\x64\x51\x5e\xee\xdc\xb6\x57\x79\x7e\xfa\xbd\x4b\xbe\x59\x7b\x97\xa4\x45\x1a\x76\xbc\x29\xab\xd5\xf1\x3d\xb7\x3a\x86\x56\xc7\xa2\x55\x73\xeb\x4c\x9c\x38\xd9\x1a\x67\xc2\x14\x4b\xb7\x82\x36\xf9\x99\x58\x04\x67\x7e\x25\xa8\x5f\x6a\x99\xab\x57\x41\x9c\xe9\xf2\xb8\x5c\x29\x83\x30\x51\x2e\x91\x45\x63\x55\x2e\x92\x52\xc5\xf6\x5f\x70\x16\x53\xe7\x7c\x3d\xd5\x9d\xbe\xef\x79\x01\xfd\x61\xfd\x29\x9b\xcb\xc2\xd8\xa2\x2b\xa4\x4e\x96\xc1\x88\x71\x81\x80\x8f\x7a\x83\xf1\x2c\x82\x61\x63\x76\x38\xbc\x4a\x65\xf2\x98\xe4\x33\xb7\x3f\x7d\x34\x85\x23\x99\xd4\x5f\xcb\xdf\x7b\x12\x3b\x21\xe3\x47\x5d\xce\x57\xb4\xc8\x09\x0a\x69\xe3\x48\x6a\x0b\x54\x86\x24\x63\xb1\xa6\xa3\xc6\xb1\x94\x9f\x14\x7f\x55\xf0\x71\x97\x45\xae\x08\xc3\x32\x04\x40\xdc\x9a\xeb\x06\x60\x7b\x0c\xd7\x46\xb7\x80\x91\x5a\xde\x1f\xd2\x4d\xc4\x11\x08\xca\xbc\x0d\xdc\x78\x16\x09\xe7\xae\x64\x91\x5c\xea\x9f\xe3\x09\x4d\x18\x10\x6d\x77\x9d\xd6\x8e\x51\x53\xc5\xe0\x52\x53\x55\x41\x1b\x58\x52\xca\x7a\x8e\x96\x2a\xb8\xe9\x6d\x6f\x6a\x8e\x6d\xbb\x58\x56\xdd\x80\xed\xc7\x08\xe6\x62\xbd\xe6\x9f\x51\x7b\x30\x55\x6c\x5d\x35\xfe\x4a\x35\x1d\x86\xe1\x32\x15\x7c\x61\x9c\xbb\x23\xb7\x6e\x6d\xba\xc1\x57\x83\x8e\xb9\x0b\xe3\xd6\xe0\x2a\xf9\xe2\x4e\xcb\xf8\xad\x25\x3a\x33\xb6\x8b\xb9\xa8\xec\x9b\x00\x54\xdf\xa4\xa2\x32\xdc\xf7\x04\xe2\x24\xb2\x81\x13\x96\xec\xf3\xc8\x15\xa2\x92\x78\xe3\x16\xf6\x01\x2d\xd0\xc9\x0b\xc5\x54\x5a\xc6\x6a\xaf\xa2\xb4\x89\x05\xaf\x6d\x48\x81\x96\xe9\x15\x51\x1a\x05\xf2\xa2\x9c\x56\x0a\xdf\xc4\xe3\x83\xf9\xeb\x69\xac\xbe\x8e\xe6\x95\x96\x7d\xfe\xb8\x52\x15\x2a\x72\x58\xeb\x87\xe3\x01\xb5\x83\x47\x5f\x4f\x8a\x6d\x90\x4f\xa7\x78\x85\xf1\xe1\xd3\xf6\xc1\xf6\xde\x61\xfb\x70\x67\x7f\xef\xa4\x7d\x78\xf8\x69\xe7\xe5\xe7\xc3\xed\x03\x4e\xa5\x48\x99\x9a\x81\x4d\x22\xb9\x7c\x83\xb0\x9a\x53\x3b\x8b\xa2\x80\xe3\xd3\xc1\x98\xe3\x33\x40\xc0\x57\x1f\x1c\x86\x49\x97\x33\x00\x8a\x42\xba\xdf\x29\x1f\x89\x5d\xbc\xaa\xf6\xcf\x2a\x29\xd1\xd0\xe3\x7f\xc4\x35\x47\xe9\x18\x28\xdc\x96\x06\x7e\x44\x93\xd8\x0e\xe8\x77\x67\x03\x0f\x1c\x6a\xee\x5a\x53\x87\xc8\x33\x03\xc4\x5f\xb6\x08\xbc\x22\x1d\x8b\xbf\x9a\xea\x5b\xa4\xd4\xa4\x7d\x58\x38\x6a\xb3\x6e\x91\x52\xa3\xf6\x14\x92\xf9\x41\x73\xd7\xe9\xfa\xae\x7c\x78\x03\x2f\xa5\xbd\x95\x14\x51\xe0\x35\x6d\x6a\x7a\xe4\x88\x73\xd0\x08\x23\x47\xd8\x7e\x98\x38\xe2\x19\xab\x93\xa0\x33\x35\x75\x3a\x45\x46\x45\xea\xca\x9e\xfb\xe0\x97\xd7\xe4\x8c\xf6\x9c\x0b\x3f\x8a\xe7\xe4\xa5\xc5\xb2\x30\xbf\x9e\xd1\xfa\x5b\x5e\x30\xd9\xe6\xb8\x13\x3d\x6b\xdf\x8f\x39\xae\xe8\x5e\x59\x78\xda\xae\xd8\x1d\xd5\x86\x75\x5e\x39\xb7\xbd\x79\x67\xbe\xaa\x8e\xc1\x65\xc3\x97\x40\xdf\x19\xac\x83\xe6\xea\x1e\xdb\x3a\x2b\x68\x8b\x05\xbe\x4b\xb1\x35\x70\x14\x1e\xc7\xf0\xec\x0e\xdf\xdc\xa8\x5b\x7f\x71\xed\xd8\x87\x60\x50\x50\x86\xef\x13\x58\x05\x20\xa8\x64\x84\x97\x36\x8e\x7e\x3a\xd1\x23\xf5\x9f\x6d\x1c\xfd\x43\x8c\x85\x1b\xf7\x60\x2c\xdc\xb8\x9b\xb1\x70\xf3\x07\x1a\x0b\x37\xef\xcb\x58\xb8\x79\x0f\xc6\xc2\xcb\x3f\xd0\x64\x76\xf9\xbe\x4c\x66\x97\xef\xc1\x64\x56\xc6\x1a\xfc\x30\x8c\x29\xfa\x18\x2c\x26\xdb\xb5\x59\x4d\x84\x6f\x67\x33\xfb\x60\xcf\xfa\x60\xcf\xfa\x60\xcf\x7a\x57\x7b\x56\xf8\xbb\x2c\xe4\x9f\xf5\x07\xcb\xcf\x07\xcb\xcf\x07\xcb\xcf\xbf\xcc\xf2\x53\x3a\x60\xe9\xf8\x01\xdd\xbf\xa0\xf1\x85\x4f\x47\x64\x2b\x4a\xe6\xd0\x2f\xb3\xb4\x09\xc5\x70\x7a\x37\x2a\x94\xf2\xf6\xec\xbc\x08\x84\x65\x65\xb3\xa7\x2c\xd0\x04\x5b\x98\xd2\x8c\x6f\x2b\x9a\x64\xc5\xb7\x15\x69\xf3\xab\x7c\xc3\xbc\xad\x48\xd9\xe5\x49\x6d\xce\x8d\x86\x6f\x5b\xd1\x54\x06\x6f\x1c\x74\x45\x85\xad\xe1\x35\x75\xd8\x9a\x02\xcb\x33\x18\xcd\xd1\x0f\xbd\x35\x74\x8d\x5b\xc3\x9c\x58\xf7\x32\xc7\xd2\xd5\x19\xd7\x7f\xf1\xb4\xb7\x6a\xb6\x7b\x52\x67\x2c\x17\xd6\x24\x0d\x78\xbe\xd8\x69\xa9\xfb\xbc\xc8\xd6\xf6\x59\xee\x39\x5d\xd4\x8d\x2d\xba\x97\x7c\xfd\xba\x63\xf1\x35\xe6\x5f\xe8\x0b\x74\x31\xce\xb9\x51\xba\xc5\x79\x26\xa3\xbf\x2b\xb9\x7e\xec\x82\x1e\xe4\x76\x1a\xd7\x3c\x89\x73\x5a\x8d\xab\x9a\xd7\xca\xcc\x0d\x51\x11\x63\x34\x48\x68\x0c\x81\xba\x27\x36\x72\x95\xaf\xb7\xd5\xb3\x6a\x13\x18\x84\xb9\xb7\x08\x0b\x02\xde\x9b\x04\xd5\x22\xa6\x16\xb6\x50\x35\xae\xef\xfa\x72\x34\x90\x5b\xd1\x0d\x0a\xc8\xc6\x64\x05\xe4\x72\xcd\x0c\x53\xbc\x41\x4a\x5b\x40\x5b\x32\xd3\x54\x4f\x72\x04\x4c\xa5\xb0\xce\x3f\x21\xd6\x9c\x1a\xbe\x1a\x07\x05\xd5\xe5\x4c\x00\xb4\xf2\x90\xa3\xf3\x4e\x00\x26\x6a\x00\x6f\xa8\xaf\xf4\x55\x15\xb8\xf8\x45\x64\xdd\x25\xc2\xa4\x60\xc0\xb6\xa6\x64\x62\x4c\xab\xbf\xec\x19\x39\xae\xb5\xe2\x97\xe4\xcf\xee\xfc\x92\x5c\xb6\x70\x3f\x8f\xc9\x25\xb4\x59\x95\x1d\x0a\x90\x8c\x70\x57\x7c\x28\x7e\x72\x8f\x6d\xdc\x49\xaf\x92\x03\x6f\x56\x15\xc8\x0f\x75\x1f\x90\x06\x7f\x27\x1d\xcb\x7d\xb8\x0f\x58\x91\x50\x02\x87\x15\xd3\xf8\xf3\x95\x19\x67\x3a\x05\xfe\x4e\x6f\xce\x2d\x48\xb3\x2a\x7c\x14\xce\x40\xcb\x5b\x4c\xd9\x33\x2e\xea\x6c\x03\x77\x7a\x78\x9e\x06\x36\xeb\xe3\xf3\x1f\xa2\xf5\x5d\xbb\x07\xad\xef\xda\xdd\xb4\xbe\x4f\x7e\xa0\xd6\xf7\xc9\x7d\x69\x7d\x9f\xdc\x83\xd6\xf7\xe9\xc9\xc9\x7b\xe7\x8c\x16\x33\xa4\xb5\x19\x55\xa0\xcf\x4e\x4e\xdc\x08\x6e\xb1\x68\x7c\xf2\x9e\x4b\x76\xc5\x64\xf2\x7c\xb6\x26\x9e\xff\x78\xcf\x04\xcd\x86\x68\x03\xa2\x54\xdf\xe0\x9c\x00\xaf\xdc\xe6\x1e\xfc\x13\x5c\x5b\xca\xb7\x6c\x70\x76\x27\x56\xda\x36\xdb\x0f\x1d\xcf\xc8\x2a\x70\xf9\x41\x37\x5e\x56\x0f\xd8\x9c\x38\x96\x76\x33\x12\x4b\x71\x1a\x3f\xbc\x02\x3e\x0d\x77\xe2\xd8\x7e\x1a\xce\xb3\xd6\x95\xf5\xb0\x4c\xc5\x7e\x74\xe2\xa8\x0f\x9d\xc8\xa8\xe9\xfe\x13\x5f\xc6\x9b\x6f\x73\xd3\xa7\x13\xcf\x49\x9c\x49\x62\x7d\x3e\x13\xab\x39\x35\xb8\xb1\xdc\xef\x4c\xcd\xb6\x32\x97\xf6\x68\x61\xe0\x04\x43\xda\x76\x5d\xca\xd8\x64\x03\x83\x42\x60\x7c\xea\xe0\x74\x13\x44\xee\xf9\x17\x9f\x4d\x3c\x66\x15\x42\x91\x46\x1a\x1c\x1d\xef\xe8\xc4\x83\x52\xf1\xb0\x42\xba\xdf\xe1\xb8\x2d\x1f\xcd\x50\x5b\x1c\xf4\x66\x69\x58\x9c\xd0\x66\xc5\xde\x71\x45\x3d\x8d\xcd\x31\x9e\x48\xcd\x90\x5a\x29\x56\x7a\x99\x86\x49\x3c\x4e\xc7\x11\x9f\x41\xc8\x29\x57\x10\x54\x4d\xf9\x16\xbb\xb5\x68\x98\x06\xd1\x22\xc6\xa7\x7e\x09\xac\x06\x02\xdb\xe2\x7b\x9f\x25\xe6\xb3\x1d\x40\x86\x93\x38\xf2\xaa\xa8\xc6\x3f\xaa\x4a\x33\x65\x0c\x5d\x95\xb0\x52\x65\x51\x41\x4f\x16\x98\x77\x54\xe9\x34\x14\xd1\xaa\x02\x2a\x45\x16\x01\x7f\x9f\x13\xcd\xca\xb5\x55\xb9\x93\x38\x60\x43\x6e\xf6\x04\x0c\xcd\xb1\x55\xb4\x0d\x17\xf0\xa5\x6d\x38\x70\x20\x18\xea\xf7\xef\x04\x7e\xa4\x8c\x15\x33\xef\xa8\xe7\xa6\x98\xe1\x8c\x68\x97\x6f\xc0\x76\x3b\xb1\x22\x47\x11\x8c\x58\xba\x32\x95\x2c\x5a\xe7\x17\xf0\x99\x5d\x0a\x7c\x96\x94\xa4\x49\x1b\x8c\xcf\xb6\xd2\x03\xea\xc8\x98\xe9\x99\x4e\xf1\x6e\x7f\x1a\x2b\x57\xca\x02\xe7\xca\x3d\x9e\xbd\x54\x54\x7b\x53\x78\x01\xc8\x95\x4d\x8e\xe6\x47\x52\xe7\x07\x0e\xfb\x5e\x8e\xb7\x04\xa9\x81\x1a\x0e\x1a\x21\x8f\x1f\x0b\xda\x1f\x38\xe3\x20\x72\xbc\xaa\xa4\xc7\x4a\xfa\x81\xd4\x5d\x66\x72\x1a\xa1\x33\x6f\xea\x6e\xa9\xf9\xcc\x93\x02\xa7\xd4\x7c\x22\x77\xaa\x8a\xb5\x64\xea\x25\x61\x16\x84\xd9\x63\xd5\x30\x4e\x06\x7d\x39\xfc\x31\x52\x7d\x3a\x7a\x19\x4d\xd4\xc2\x4d\x1c\x70\x0d\x7c\xd8\xff\x82\x50\x6e\x71\x2e\x37\x88\x4a\xad\x5e\x4e\x56\x38\xc7\x2d\x1b\x8d\x82\xba\xae\xcc\xfd\x50\x73\x99\xeb\x8a\x61\xb9\x8a\x17\x05\xb8\x48\x4a\x64\x11\x91\x30\x97\xd2\xad\x82\x45\x67\x05\xfc\x39\x2a\x46\x69\xa9\x38\xd5\xef\x75\xa3\x40\x4a\x41\xaa\x32\x4a\x62\x9f\x01\x4c\xa8\x54\xf3\xca\xc6\xce\x29\x43\xef\x90\x6c\x8d\xa0\xf8\x90\x3a\x89\x3f\xf1\x52\x50\x08\x03\x79\xc5\xc3\xb4\x57\x88\xbb\xd0\xbb\xea\x1d\x47\xb3\x81\x44\x9e\xb4\xe4\xf7\x07\x81\xef\xc2\x5b\x1d\x14\xad\x80\xb5\x5e\x57\xac\xae\xdd\xae\x75\x9f\xfd\xe2\x04\xbe\x27\x9b\x17\x83\xff\xfe\x7d\x56\xfd\x58\xb9\x22\x60\xfc\xa5\x38\xa9\x62\x28\x9d\x30\x69\x11\x9c\xa9\xa9\x71\x34\x41\xef\xf9\x83\x87\xa6\x57\x9a\x35\xb9\x55\x22\xc8\x74\xc2\xd0\xe5\x8a\x32\xb7\x4f\x24\x59\x29\x7b\xe1\xa5\xdc\xa6\x13\x04\x2f\xc7\x1f\x9c\x98\x86\xd6\xba\xc8\xe6\x96\x07\xf0\x47\x98\x73\xe8\x15\x02\x2f\x4d\xcf\xa9\x7b\x0e\x39\xef\x71\x15\xe4\xc5\x67\x58\xb6\xe3\x33\x2c\x4f\x8a\xcf\xb0\x7c\x4c\xf0\xbe\x59\xcb\x0c\x46\xf3\x20\x3a\x18\xdf\xda\xb7\xc3\xe3\xc7\x99\xbe\x3c\x7e\x6c\x97\x9d\xbc\x98\xc5\x78\x24\xbc\x0d\x92\xd7\x0c\xbe\x58\x83\x68\x4b\x97\x88\xef\xcd\x9e\x1f\x60\xf9\x19\xf7\x95\x9e\xb8\xe8\x0a\xbd\x36\x47\x39\xe7\x70\xb8\x97\xc8\x36\xab\x5a\x70\x4c\x7b\x4f\x87\x22\x29\x89\x42\x0c\x6c\x8a\x37\x5e\xea\xee\xc9\x0d\xa2\x50\x52\xe1\xbc\x6c\x59\x6f\x5e\xc6\x52\x9a\xcb\x30\x74\x20\x3e\x9b\xa9\x8b\xf5\x05\xff\x87\x09\x4c\x4d\x4c\xaa\xa7\x29\x4c\x2a\xda\x85\x53\xae\xa0\x6a\x93\x83\xa7\x18\x77\x66\x86\x05\x89\x9a\x17\x71\x47\x19\x38\xca\x9d\x4b\x8e\x32\x21\xd5\x21\x19\x00\x46\x6f\x3a\xb9\x0b\x28\x9b\x68\xed\x53\xf6\x79\xc7\xfc\xbc\xcb\xdd\x94\xa6\x8c\xcc\x0d\xd5\xf2\x9d\x3c\x63\x63\x68\x27\x98\x53\xea\x11\xe9\xa3\x39\x89\x90\xac\xd0\x7e\xbc\x23\xa2\xc6\x82\x52\x22\x8c\xc2\x25\x38\xa9\x2f\x05\xfe\x39\x25\xdb\x07\x2b\x22\xfe\x01\x03\x9e\xb3\x23\x2a\x16\x59\x45\x3e\x15\x36\x8b\x92\x25\x14\x95\x7b\x9e\xe7\x0c\x5d\x2f\x08\xf9\xf4\x4b\xcc\xbb\x68\xb5\x2c\xa0\xf2\x6c\x31\x99\x29\x64\xad\xdc\x15\x59\x4f\x6b\xcd\x5a\x73\x85\x1c\x0a\x04\x95\x25\x43\xab\xfc\x80\x51\x4d\x3b\xa8\xfb\x0c\xea\xa8\x22\x4a\x9a\x71\xf3\x36\x24\xa3\x06\xed\x64\x97\x26\x5b\x96\x34\x96\xab\xd2\x5c\x7b\x52\xc9\xaf\x30\x29\xde\x9f\x5d\xf2\x4f\x09\xfb\x07\xaf\x98\x63\x67\x60\x0f\x49\x35\x9b\xca\x2a\xbf\x74\x18\x55\x57\xf8\x55\xd2\x8b\x5c\xe8\xa9\x39\x6d\x22\x8d\x2c\x92\x52\x59\xc5\xdc\x48\xe1\x40\x47\xdf\xb0\x00\x56\xf0\xed\x1f\xce\x72\x36\xe8\x40\xaa\x33\x19\x56\x30\x4d\xd4\x04\x49\xc8\x07\xa0\x8b\x6d\x41\xd0\x89\x56\xbd\xfe\x8d\x75\xe0\x19\x4d\x2d\xa4\x49\xfd\xe2\xcb\xe5\xb3\x5f\xea\x73\x22\x24\x45\xab\x5e\x67\x89\xe3\x9e\x47\x17\x34\xee\x04\xd1\x08\xc2\x51\xfc\x3e\xa4\x0c\x9c\x0f\xd5\xd7\x9e\x34\x56\x9a\xcf\xd7\xea\x9d\x61\x80\x47\xe3\xa5\xa8\xb3\xf4\xcd\xb9\x70\xd0\x90\x74\xe9\x9c\x8e\xdd\xc8\xa3\x4c\x19\x76\x6d\xf2\xa1\xfa\x34\x74\x95\x9b\x7a\xe9\x9a\xde\x8d\xe2\x98\xb2\x41\x04\x6f\x2a\xc4\x61\x99\xf3\x9c\xae\x7f\x41\x43\xbe\x19\x01\x5e\x23\x50\x50\x6f\x46\x1e\xd5\xbe\xf4\xd1\x21\xfe\xae\x7f\x49\xbd\x6b\x99\x4b\xae\xf6\x44\x8c\x2c\xac\x01\x95\xaf\xd0\xab\xc9\xb5\xe1\x12\x5f\xd6\x83\x24\x67\xe0\x93\xc1\xf0\x2c\xf0\x5d\x34\x37\xd3\xcb\xb4\x70\xdd\x96\x19\x75\x62\xb7\xb7\x13\x0e\x86\x62\xfd\xd6\xeb\xe4\x1d\x1d\x9f\x45\x4e\xec\x11\xb0\x69\x61\x73\x32\x1a\xb0\x2a\xc9\xe9\x54\x06\x98\xc6\x33\x85\xb0\x15\x4c\x03\x53\x01\x7d\xdf\x89\x61\x6d\x98\x65\x6a\x18\x33\xf2\xfb\x77\x2b\x51\x62\x20\x95\xec\xf6\x9c\x98\xa7\xcf\x49\x33\x25\x0d\xb5\x62\x16\x24\x1b\x46\x7b\x72\x9b\xae\xd7\x09\xe2\x53\x0e\xa6\x84\x5a\xc2\xe2\xde\x4b\xd1\xcb\xe9\x53\x76\x64\xe4\x1c\x0b\x70\xdb\x17\x34\x1e\x63\xa0\x3b\x50\xa9\x97\x5d\x87\x41\xa8\x03\xdc\x50\x2a\x42\x36\xc0\x9a\x10\xd6\x16\x1c\xd2\x98\x6d\x08\x48\x6e\x8f\xba\xe7\x04\xc9\x0c\x2b\x41\x30\x23\x3e\xe3\x1e\x2a\xcb\x20\x4f\x74\xa2\x96\x44\xef\xa3\x11\xdf\xc3\x19\x2d\x57\x8e\xc5\x70\xac\x1a\xaa\xf3\x56\xaa\xd5\x9a\x13\xf8\x0e\x2b\x6c\x4f\xe4\xde\x53\x8b\x23\xea\xc7\x1e\x3c\xdf\x72\xdc\x84\xc6\x2f\x2c\x72\x32\xc3\x01\x35\x15\x18\x91\x27\xa7\xbc\x9d\x94\x1b\x15\x43\x52\x52\x42\xf9\xdc\xb5\x19\xc7\x82\x9c\x8d\x61\xbe\xc4\xc2\x22\x2a\xe4\x1e\xc7\xdf\x51\x09\x82\x18\x96\x8e\x79\x97\x36\x7e\x26\xcd\x95\x39\x15\xd4\x11\xf0\x6b\x84\xe8\x73\x91\x52\xcd\x4f\xa9\xff\x2d\x41\x04\xfa\x81\xe3\xd2\x52\x8b\x3c\xe3\xa2\x66\x29\x71\xce\x4a\x2d\xf2\x1c\x7e\x63\x1b\x2d\xd2\x5c\x81\x4f\xd6\xf3\x3b\x09\xff\x7c\x02\x9f\x6e\x12\x07\xfc\xeb\x29\x7c\x39\x01\x64\x21\x90\x81\x33\x64\xb4\x0e\x2f\xca\x79\x22\x42\x73\x9d\x01\x23\x41\xe4\xf2\xa4\xe5\x06\x36\xc0\x5c\xfe\x81\x10\x64\x3f\x56\x96\x05\x8c\x2e\x25\xc3\x01\x4f\x58\xd1\x09\x5e\x34\x0a\x79\xd2\xaa\xe8\xa0\xc7\x3f\x20\x7c\x63\xa9\x17\xf5\xa1\x3a\xf6\x2e\xa0\xd0\xd7\x15\x84\x8d\x70\xb0\x73\x31\xb8\xd2\x68\x91\x15\xec\x96\x80\xb8\x8a\x3d\xf2\x43\x46\x63\x9e\xbb\x8a\x40\x3d\x1a\xd0\x84\x83\x5d\x15\x83\x8e\xfa\x7d\x07\x5a\x7d\xde\x54\xed\x90\x4c\x2a\xb4\x61\x26\xe3\x10\xc2\x61\x7f\xe0\x78\x64\x81\x23\xa5\xf1\xc4\x4c\x5a\x84\xa4\xa7\x66\xd2\x12\x24\x3d\x37\x93\x6a\x3c\xa9\xd9\x30\x93\xea\x90\xd4\x94\x49\x12\xc1\xcd\x55\xc4\x10\x73\xe3\x28\x08\x74\x2a\x8e\xaa\x3f\x86\x57\x89\x43\x31\xbd\xcf\x96\x55\xaa\x70\xe7\x14\x61\x3a\xf6\x7a\x1d\x7e\x63\x77\x37\xe0\x37\xf6\xb3\x0a\xbf\x11\xa9\xd0\xd9\x67\xd8\x59\xe8\xe5\x73\xec\x25\x74\x4f\x20\xe5\x14\x7e\x63\x5b\x47\x7c\xde\x05\x61\xfc\xfb\xdf\xfc\x43\x90\xc4\x31\xfc\x86\x0a\xf3\xa5\x79\xfe\x7b\x79\x0e\x43\x02\xbf\xa1\xc1\x80\xc6\x6a\xb1\xe3\xab\x3c\xfc\x30\xc8\x5b\xa7\x00\x81\x63\x94\x1f\xa6\x67\xe6\xbf\xff\xef\xff\x4f\x93\xf0\x7f\xff\xef\xff\x57\x13\xed\x7f\xff\xef\xff\x4b\x93\xf3\x7f\xff\xef\xff\x47\xd7\x71\x13\x83\xd0\xdd\x28\x4c\xe2\xc8\x48\xc0\xf0\x78\x29\xe2\xd7\x64\x9f\xb3\x0a\xf4\x02\x40\x16\xa0\x97\x18\x65\xae\x33\xa0\xe6\x9a\x70\x8d\x15\xd1\xb5\x96\x43\xd7\x33\x56\x82\x1f\x32\x8b\x68\x0d\x8a\xed\x23\x5d\x72\x2c\xce\xd5\x17\x1e\x71\x66\xf2\x21\x8e\xba\xb1\xd3\x77\xe0\xe5\x6a\x30\x26\x8e\xe7\x61\x00\x1a\x08\x60\x8b\xe1\x2d\xeb\x80\xf4\x80\xf3\x4a\x74\xc8\xc1\xf9\x17\x9b\x83\xdb\x50\x9f\x6c\x90\xe7\x4f\xf1\xe2\xb6\xb9\xbc\x22\x6e\x6c\x91\xb1\xe3\xd6\x00\xb7\xb0\x9b\x82\xe3\x95\xfd\x0a\x3f\x3a\xf9\x64\x89\xac\x2c\x03\xd8\x50\x6c\x5f\xd6\x1d\xf1\xea\x33\x84\xb8\xf6\xcc\x02\xc8\xab\xad\x3e\x03\x00\x50\x57\x09\x84\xe7\x74\x6c\xf4\x47\xdc\xb6\x37\xed\xde\x94\x3a\xa5\x45\x1f\x1b\x5f\xe4\xeb\x44\xb6\xce\x97\x8e\x5d\x5f\x3c\x31\x6a\x36\xec\xfa\xa2\xac\x01\xe5\xf9\x93\x34\x9b\x76\x61\x6f\x4e\xb1\x69\xce\xbb\x8f\x9a\x2b\x92\x43\x97\xb6\x81\x99\x6a\x36\x0d\x7b\xb1\x41\xb8\xe9\xef\xc4\x4f\x40\xde\xbf\xba\x86\x08\xb9\xf0\xc5\x3b\xcb\x59\xf6\x88\x8b\x33\xf8\xae\x18\x06\xb4\x09\x4a\x2d\x12\xd3\x0b\x1a\x33\x4a\xfa\xce\x60\xc0\x27\x51\x8c\x0d\xde\x20\x7b\x94\x55\xc4\xfe\x2f\xd0\x7a\xac\x51\xda\xf6\x3c\xb5\xae\xd4\x94\x40\x02\xaf\x2c\x72\x50\x06\xc2\xca\x90\x74\x6c\x6c\xae\x98\x20\x68\xcc\x14\x84\x27\x86\xc4\xfa\xd1\x61\xee\x27\x1c\xa0\x64\xd6\xf6\xaf\x3b\x87\x3b\x7b\xaf\x0d\xc4\x6f\xef\x1d\x6e\x7f\xda\xde\x4a\xa7\xa4\x0a\xfd\xba\x73\x68\x95\xf9\xbc\xb7\xbb\xff\x79\x0f\xd3\x32\xf1\xeb\x2d\xaf\x06\x05\x46\x48\x50\xf2\x83\x59\xd0\x3e\x66\x7d\xf1\x03\xcf\x75\x62\xaf\xac\xa1\xa9\x63\x1d\xa8\x95\x26\xd8\x6f\x19\xa5\x26\x9d\xf9\xa0\x80\x5d\x7c\x2b\xea\x17\x1d\x2b\x9f\x67\x4a\xde\x08\x7b\x2b\xea\xab\x4a\x1f\x6e\xc0\xc9\xf2\xd3\xe7\x7f\xca\xa9\xb3\xa8\x01\x85\x6f\xc3\xe2\x23\x17\xbc\xdd\xbc\x61\x95\x22\x5c\xce\xed\x9f\x7d\x13\x96\x24\x12\xc4\x23\xfd\xce\x29\x6d\xe8\x63\x34\x36\xbd\xe5\x08\x9a\xf8\x60\x53\xd2\xc0\x27\x12\x3f\xd1\xba\x07\xf3\x8c\xf3\x2b\xf4\x54\x9e\x0a\x20\xf3\xff\x08\x6b\x99\x87\xd7\x84\x0f\xaf\x09\x1f\x5e\x13\xfe\x45\xaf\x09\x39\x57\x30\xb7\xc9\xbc\xad\xb3\x34\x0c\xfb\xd1\x30\x4c\xa8\x57\x42\xed\x74\x66\xa3\x55\x09\x25\x7a\xe9\x1b\xe5\x72\xf6\x68\x9d\x54\x92\x31\xff\xcd\xd2\xd9\x3d\x5e\xc0\xe5\x65\xad\x0e\x64\xf7\x7e\x09\xf6\xd2\x4f\x10\xaa\x14\x09\x0f\x7b\x94\x1c\xc6\x4e\xc8\x7c\xdb\xd7\x3a\x09\x68\xc2\xc8\x38\x1a\x8a\x77\xdd\x10\xae\x38\xd1\x05\xc1\xfb\x4c\x14\x52\x5d\x83\x43\x43\x17\xf7\xe0\x9c\x15\x83\x76\x9f\x44\x17\x34\x26\x89\xdf\xa7\x27\x78\x23\xe0\x10\xe6\xf7\x07\x01\x25\x1e\x75\x03\x27\xc6\xb0\x97\xed\x0f\x3b\x35\xb2\x1b\x31\x3c\x82\x46\x61\x30\xe6\xc0\x20\xa4\xe4\x90\x49\x6f\xaf\x10\xe8\x17\x43\x54\x72\x8c\xfb\x61\x97\x38\xa1\x47\xc4\x04\x40\xbc\xec\x0e\xe7\x59\x5a\xc5\x7a\x36\x4c\xc0\x6b\xac\x13\xb0\x88\x03\x3c\xa3\x0a\x9c\x1a\x94\x1f\x2e\x0d\x02\xc7\xa5\xe6\xd8\x60\x14\xc0\xf7\x46\x34\x08\xa4\xaa\xf0\xa5\xbe\x79\xe1\x9d\x38\xd5\x58\x3b\x35\xd0\xe6\x45\x94\xc1\xb2\x73\x82\x84\x8f\xbc\x47\x95\x9b\x1c\x11\x61\x93\xc3\xd2\xe5\xfd\x44\x5c\x0b\xb1\x2a\x01\x8f\xb0\xc1\x98\x77\xc5\x3d\x67\x64\x1e\x26\x76\x1e\x46\x39\xcf\x67\x6e\x5e\xf6\x8c\x6f\x5a\x1c\xb2\x02\xc3\x20\x50\xe7\x0e\x20\x6c\xc0\xc7\xc7\x27\x2e\x89\x40\xfd\x49\xfa\xd4\x09\x25\xb6\x68\xa7\x23\x82\x82\x26\xbd\x08\x64\x55\x0e\xb0\x46\x5e\x45\x9c\xb5\x38\x30\x33\x23\xca\xb1\xc6\x01\xf2\x73\x16\xf8\x43\x62\x30\x05\x46\xb7\x47\x3d\xce\x98\x13\x02\x5d\x64\x04\x6a\xfb\x09\x6b\x09\x5c\x9d\x9e\x9e\x7e\x63\x97\x30\x89\x68\xf4\x7c\x98\xa2\x9c\x12\xc8\x57\x4b\x1a\xe9\x4b\xdd\x38\x1a\x0e\xea\xba\x5c\x69\x5d\xc0\x02\xe6\x42\x8c\xd0\xfb\x2b\x8d\x46\x2a\x0f\xa7\xe5\x00\xbc\xf5\xc3\x41\x7a\x41\xfa\xd0\xf3\x31\x34\xf3\x69\x34\x70\x5c\x3f\x19\x93\x7f\x5e\x49\x40\xd7\x7d\x46\xa8\xc3\xe8\x92\x1f\x2e\x45\xc3\xe4\xb4\x8a\xb5\x44\x41\xf4\xce\xb4\x40\xae\xad\x86\x34\xc8\x03\xc4\x8a\x6a\x4c\xae\x57\xce\xfe\x34\x08\xb0\xf4\x52\xd9\xd4\x6b\x11\x33\xbb\x29\xb2\xaf\xed\xd1\xbc\x72\x40\xff\x55\xbe\x22\x7e\xd8\x22\x3e\x08\x13\xe4\xba\xc2\x0f\x65\x65\x84\xf6\x93\x81\x4d\x3f\xdc\xb8\xc2\x32\xd7\xb0\xcc\xa2\x61\xb2\xa1\xc7\xf8\x33\x56\x20\xe4\x0a\x7c\x21\x50\x13\x0a\xff\xf7\x93\xe7\x5f\xe0\x0c\x6f\x5c\x5d\xe9\x64\x42\x6a\xb5\x9a\x89\xd5\x6a\x2a\x2f\x8d\x88\x23\x80\x7e\xac\x4b\x5d\xeb\xa6\xf9\xbf\x9d\x52\x9f\xb4\x49\x87\x8f\x4c\xf7\xfd\x91\xd1\x8f\xba\xe7\x5f\xa8\x1a\x95\x6b\x31\x4e\x83\x1c\x20\xb3\xb2\x2e\x88\x4b\x20\xac\x0d\x4b\x8d\x7a\x37\x2d\x48\x2e\x28\x9c\x78\xd1\x09\x71\x42\xa1\x35\x3e\x1b\x13\x3f\xe1\x3b\x3b\xdc\x61\x26\x0c\x6f\xf5\x75\x35\x58\x4f\x5f\x7a\x0e\x2c\x50\x58\xd3\x5e\x04\x8e\x9c\xf9\xd2\xcc\xe1\x15\x8a\xcd\x11\x86\x8b\x8f\xf3\x1d\x74\xcb\x9e\x5d\xf3\x65\x36\x74\x7b\x9c\xbd\x9c\x81\x2a\x83\xf7\x47\xac\xb2\x28\x46\x99\x8b\x9f\x5e\xe5\x12\x73\x7b\x4e\xd8\xa5\x4c\x2e\x55\x31\xf4\xc3\x1e\x8d\x29\x71\x62\x4a\x56\x49\xdf\xf1\x35\xd3\xb2\xb8\x39\xba\xcc\xf6\xc3\x16\x20\x74\x89\x9c\xca\x3d\xe6\xd4\x4a\xd8\xde\xd2\xdf\xb8\x59\x58\xdf\x98\x0d\xad\xa6\x06\x8e\xbe\xad\xbb\xdd\x80\x7a\xe4\xc2\x77\x70\x1e\xfc\xf0\x14\x2c\xb1\x6a\xe4\x0b\x1f\xc2\x29\xdf\xcc\x4f\x6d\x7e\x45\xce\x68\xd7\xc7\x28\xc2\x1c\xec\xfc\x36\x72\x3a\x96\x38\x5d\x5a\x23\x5b\x43\xbe\x94\xe0\xed\x37\x26\x55\x53\xb5\x47\x7e\x10\x10\x50\xef\x22\x37\x81\x09\x44\x5f\xde\x99\xb9\x01\xd2\x4d\x22\x72\xaa\xf7\xd4\x53\xc5\x40\x15\x57\x11\xc1\x8f\x8d\xca\x9c\x5b\x26\xbc\xff\xc0\x2b\xa9\xac\x4f\xbd\xd2\x29\x76\x8a\x44\xa1\x4b\xd5\x3e\xc5\x3b\x17\xd0\x84\xd6\xc8\x7b\xca\xbf\x13\xe7\x9c\xda\x3a\x2a\xc9\x5f\xb3\x3c\x12\xfa\xb9\x41\x70\xc1\x83\x7c\xa4\x79\x02\x62\x17\xf0\x73\x20\xe2\xc7\x94\x61\x15\x4b\x2e\x97\x72\xa4\xcf\x41\xa0\xf4\x84\x8b\x45\x32\x30\xf3\x99\xfd\x82\x11\x93\x5f\xae\xb9\x9f\xcc\x05\x98\x65\x31\x86\x7b\x66\x3f\x34\x38\xcd\x5a\xa3\x71\x4d\xea\x66\xc5\xb3\x61\x92\x70\x84\x86\x9b\x81\xef\x9e\x8b\x9a\xe9\x51\x5c\xff\x0c\xb9\x1c\xb7\x90\xf8\x53\x1d\xab\x29\x40\x26\x43\xd0\x03\x31\x96\x3e\x90\x16\xec\xae\xd8\x9e\xcf\x88\xcb\x41\x0a\x66\x90\x4b\x2b\xf6\x4c\x22\x25\x20\x19\x3b\xa1\x27\x26\x62\xcc\x8b\xc4\xa8\xba\x5a\x6b\x34\xfa\x8c\x94\x79\x1d\xbc\x51\x8c\x3a\xe4\x54\x0c\xfd\x54\x2c\xd0\x8e\x1f\x82\x4a\x12\x9d\x16\xe3\x46\x69\x90\x4a\xcd\xec\x2e\xac\x0c\x9f\x91\x53\x98\x63\x5c\x12\xcc\xe9\x73\x3a\xe1\xf4\xd1\x73\x06\x03\x1a\x32\x42\x2f\x5d\x3a\x40\x21\x03\x7b\xd7\x8f\x2e\xf8\xa6\xcf\x29\xfd\x54\x89\x70\xa7\xa2\x25\x14\x2a\x45\x88\x6d\x8c\x29\xa5\xa7\xce\xf2\x3f\x01\x46\x45\xff\x2c\x0e\x26\xa5\xaa\x55\x49\xa6\x6c\x2a\xb0\x94\x2a\x2a\x0d\xbe\xc1\x7e\xee\x32\x99\xec\xa7\x42\x57\xab\x58\x51\xa8\xa6\x0c\xd6\x94\xee\x14\x9e\xae\x31\x2f\xd5\x0d\x13\x3e\x5a\xff\xbc\xe6\xe2\x05\xdc\xe6\x41\x09\x63\x07\x83\x1c\x34\x30\xad\xd7\xc9\x4e\x28\xe8\x07\x8a\xa1\x48\x79\x68\x97\x25\xfc\x5c\x28\x04\x1f\xce\x80\x63\x8a\x4a\xe9\xc1\x80\x3a\x70\xc5\x89\xed\xe2\xb7\xb2\x12\xc3\xaa\xda\xe0\x0c\xbe\x6b\x3e\xdb\x95\xd2\xab\x8c\xa3\x01\x90\x49\x4b\x7c\x21\x14\x63\x38\xe2\x34\xcc\x97\xd1\x90\xa5\x7c\x67\x63\x9c\xa9\x90\x5e\x26\x2a\x1b\xad\xd7\xd4\xb5\x2d\x02\xf5\x43\x6d\x5c\x0e\xfe\x87\xa1\x11\x2b\xac\x4e\xaa\x15\xdc\x06\xb4\x73\xd5\x9c\x96\xe4\xd6\x52\x18\x1f\x25\x03\x13\xb7\x9e\x54\x3c\x14\xbb\x96\xee\xb3\x90\xf3\xf7\xc3\xed\x4b\x0c\x2c\x81\xc9\x32\x91\x23\x6d\xd2\x00\xd4\xa1\x6d\xfa\xee\x59\x43\x96\xd1\x5a\x0c\x3c\xab\x78\x5e\xb0\x4c\x87\xac\x95\x02\x71\xbd\x3e\x97\x9a\x95\x4d\x69\x0e\xb5\x61\x78\x85\x90\x66\xa1\xbc\x94\xb2\x6c\xd3\x24\x67\x28\x97\xba\x14\x0c\xce\xbc\x4d\x41\x9c\xc6\xea\x4e\x65\x95\x53\x06\x74\x57\x24\x45\xef\x2d\x54\x17\x5c\xaf\x73\x9a\x77\xf8\x0e\x85\xa7\x8a\x90\x32\x2e\x4f\xe9\xe6\x39\x3d\xe3\x40\x72\xbb\xa4\xf8\xec\x96\xef\x01\x25\x5b\xc1\x15\xd3\x99\xaa\x5b\x46\xa8\x1c\x44\x56\x59\x85\x0c\x9b\xa6\xb1\x74\x20\xb0\xdc\x46\x6f\x8e\x16\x26\x43\xe2\x29\x3f\x33\x14\xcc\x47\x70\x9f\x95\x91\xc0\xa4\x10\x21\xfe\x31\x49\x1e\xbc\x62\x0d\xbf\x8c\xf5\xa5\xe3\x84\xa5\xd7\x98\xac\xb8\x61\xd0\x62\x25\x1d\x3d\xc8\xd8\xc8\x25\x4d\x09\xfd\xc1\x75\xae\x57\x6f\x01\xf4\xd1\x86\x5e\x7e\xa0\xa7\x49\x25\xe7\xb4\x34\x79\xe9\x16\x2d\x45\x63\x10\xaa\xbd\xef\xdf\x49\x3a\xf9\xc6\xf6\x50\xc8\xcc\x89\x84\x34\x1d\xa5\x7d\x46\xc1\xba\x80\xd4\x30\x77\x02\xad\xdd\x8a\xce\x3e\x23\xdf\x29\x24\x31\x91\x6f\x37\xe7\x3a\xa1\x4b\x83\x3d\x63\xc9\xdf\xd8\x68\x97\x26\x87\x28\x5a\xb0\xd4\xc2\x96\xc9\x56\x28\x47\x21\x86\xd8\x41\x87\x44\xa2\xb1\x5b\x70\xf1\x40\x6d\x12\x9a\x8a\x71\x8f\xc9\xa6\xab\x3d\x4b\xee\x2a\x90\x23\x80\xc8\x4a\xaa\x90\xdd\x1c\xe8\x3c\x45\xaf\xc4\x8d\x01\xa7\x45\xa1\x7a\xd4\x39\x1b\x44\x9a\xff\x68\x22\x11\x2d\x88\x42\x35\xfe\x29\x89\x43\xb6\xaa\xf2\xf8\xb7\xcc\x4c\x77\x45\x6d\x97\x9a\xac\x14\x07\xe4\x40\x5b\xf0\xff\x2a\x02\x6d\xe1\x9f\xaa\x80\xd2\x92\xd0\xae\x6f\x98\x29\x93\x96\xcc\xa9\xb2\x69\xcc\x98\x2b\xa5\xa0\xca\x35\x7d\x6f\xd8\xa6\xef\x8d\x49\xa6\xef\x8d\x63\x22\x4e\x08\xc6\x1c\x5b\x4b\x2b\xb5\xd8\x52\xac\xe9\x40\x33\x06\xa1\x6b\x9e\x2b\x5a\xa3\x66\x88\x92\x7a\xdd\x6c\x04\x24\x6a\x27\x18\x39\x63\xc6\x4f\x97\x8a\x11\x44\x4a\xf9\x58\x33\xa1\x16\xad\x05\xd5\x7d\xb4\xf7\xd1\xb7\x72\x52\xf3\x50\xeb\xf8\xa1\xb7\xb5\xbf\xbb\x17\x79\x14\xc4\x3c\xdb\x51\x96\xd9\x5b\x83\x1f\x65\x38\x8f\x88\x7b\x08\x12\x42\x99\x37\x56\x55\x13\x72\x43\x2c\x37\x59\xf3\xd2\x4f\xa0\x62\x3a\x74\x1b\x56\x02\xba\xd7\x6b\xd0\x96\x53\xf8\x02\xd0\x47\x27\x93\x4f\x02\x5b\x4f\x4d\x40\x0e\xfb\xd7\xca\x66\x2b\x02\x5a\x31\x75\x9a\xc3\xb5\x1e\x33\x4d\x40\x83\xb9\x1f\xf2\x8e\x2c\x0b\x42\x32\x19\x89\x5c\x86\x7a\xa4\x62\x25\xa6\x04\x5e\xa4\x73\x9c\xf9\x7c\x59\x9b\xbc\x98\x98\x6d\xca\xc4\x2d\xd5\x47\xa3\x9d\x44\xb3\x49\x80\x63\xb1\x48\x51\x8e\x53\x6c\x24\x3a\x8d\xaa\x63\x50\x08\x9c\xfb\x03\x82\xb6\x4e\xfc\xe4\x89\x5b\x95\x2c\xef\x77\xc8\x08\x35\x2a\x96\x7e\x39\x1e\x86\xa1\xd2\x46\xf8\x09\x68\x53\x99\x64\x15\x27\xfd\x21\x4b\x4e\xf8\x2a\x60\x34\x51\x2b\xed\x91\x02\xc0\xc5\x7d\x6a\x8b\xa6\x38\xd1\x4e\x87\x1e\xe4\xec\xf5\x42\xa9\x7f\x5d\xb5\xfd\xd0\xda\x62\xf7\xb2\xc0\x7f\x84\x52\x2f\xf5\x52\xc4\xa9\x7e\x99\xf1\x16\x85\xe4\x6a\x4c\x9f\xa8\x2e\x68\x41\x4d\x9e\xc4\xe0\x8d\xfd\xe4\x4b\xbe\xa0\xa3\x79\xdd\xf4\xc3\x6e\x51\x53\x80\xfe\x57\x3b\xbf\xee\x6e\x2b\x1e\x2c\xe6\xf8\x85\x0d\x30\x0a\x35\xc9\x6f\x87\x9e\x80\x27\xe9\xa1\x26\xd8\xf9\x44\xd4\xcd\x8a\xf9\x89\xb8\xb7\xc7\x24\x2b\x5c\x67\xa6\xe4\xfa\x26\x21\xc0\xe0\x38\x79\x6b\x57\x31\xa2\xf4\x82\x5d\xc9\x59\xb0\x97\xe9\x90\x84\xb8\xab\xce\xb2\x8c\x38\xa8\xc2\x55\x04\x8c\x4c\xd3\x3e\x2f\x3c\x25\xb5\x0b\xc9\x76\xe2\x8c\xad\x68\x84\x83\xa6\x63\x3a\x5a\xcf\x92\xba\xc1\xc3\x6f\x26\x6f\x71\x61\x36\x89\xba\xed\x7e\x49\xe2\xd6\x14\x2d\x0a\xdd\x44\xb1\x20\x8d\x4c\x1c\xfe\x8c\xc8\x9b\x0a\x7d\x33\xd1\x68\x76\x3f\xb7\x03\xea\x67\x77\x7b\xd1\x2d\xb5\x51\x5a\x47\xe1\x09\xb2\x88\x2c\x23\x9a\xd4\x62\xc3\xe4\x03\xf5\x0d\x1b\xa4\x89\x50\xb3\xe7\x16\xa2\xa5\x70\x41\xd1\x7c\x81\xb7\x91\x59\x74\xab\xf6\xa2\xab\xd7\xc9\x17\x0a\x41\x98\x41\xd1\x08\x17\x05\xe2\x44\x29\x44\x43\x3c\x62\x4b\x93\x0c\x46\x46\xa8\xc3\x27\xee\x97\x4f\x1f\x48\xc7\x8f\x29\x23\xbf\x0f\x7d\xf7\x3c\x18\x4b\x80\x4e\x87\x6f\x60\xee\xd6\x2e\x6c\x45\x67\xb4\x13\x61\x50\x66\xa1\x18\xec\x04\x43\xd6\xa3\xac\x4a\xd0\x94\x7f\x14\x0d\x03\x8f\x78\xd1\xf0\x2c\xa0\x24\x89\xfd\x6e\x97\xef\x7e\x12\x96\xde\x66\x8d\xe5\x61\x9e\x78\x37\x94\x90\x47\xf5\x90\x0e\x41\x09\xdf\xe3\x90\xd1\xdc\x82\x84\xd4\xa5\x8c\x39\xf1\x18\x2f\x58\x13\x75\x11\x81\xa6\xe6\xb1\xe3\x82\xfa\xcc\x43\xf5\x01\xdc\xfa\x4a\x60\x52\xbe\x51\x38\x65\xe9\x2b\x5c\x3f\x24\x09\x85\x90\x23\x55\xc2\x22\x29\x65\xf6\x9d\x73\x4a\xd8\x10\xc6\xee\x24\x12\x1a\xde\x53\x0a\x8a\x23\x4e\x38\x56\xe8\xce\x6b\x07\x30\x39\xa2\xb2\x31\x14\x51\x5d\x4d\x3f\x52\x00\xb3\x48\x57\xcd\xfd\xfa\x5c\x56\x48\x33\x68\xa4\x90\x4d\xac\x66\x50\x6c\x88\xd5\x6e\x4a\x1e\xbe\x71\xe9\xa5\xba\x67\x51\x6f\x51\xcf\xd3\x54\xbb\x96\xdd\x2a\x1c\x17\x6e\xe1\x37\xf4\xa3\xda\xfc\x25\x66\xf8\xa9\xb8\x50\x0a\x64\xb9\xb2\x11\x88\xc9\x82\x14\x58\x71\x60\xb1\x18\xd3\x5a\xfe\xfa\x55\x85\x14\x6e\xb0\xa9\x94\xe4\x5d\xd4\x49\xc1\x29\xd2\x7e\xfc\xe7\x8a\x3b\x74\x6d\x3b\x4e\xce\x40\xbc\x61\x46\x52\xfc\xdd\x6c\x78\x22\xeb\xaf\x92\x9e\x13\x7a\x81\x16\x0c\x73\xc9\x4f\x96\x31\x4f\x71\xc6\xf6\x4f\xd2\x67\x0f\xc7\xf3\xb6\x43\xef\xbd\xcf\x12\x1a\xda\xea\xd0\xc2\x42\xb2\x5b\xe9\x71\xe7\x07\x91\xb3\x8f\xf7\x66\x03\x4c\x49\x0f\x59\x1e\xaf\x46\x9d\x7f\x80\x92\x40\x26\x83\x68\x4c\x77\xfc\xc1\x7b\xae\xec\x6b\x75\xeb\x40\xce\xac\xd3\xb2\x79\x36\x5b\x57\x88\x9e\xac\xaf\xcb\xf1\xed\xab\x97\xd9\x24\xe7\xd5\xc6\xeb\xf1\x13\x3b\x6e\x76\xaa\xcc\x2d\x22\xb8\x4a\x08\x25\x19\xb9\xb7\x5e\x17\x6e\x91\x51\x49\x0e\xdb\x0e\x60\x2b\x41\xfe\x8f\x7d\xc5\xb7\x22\x46\x6b\x35\x5f\x08\x50\xd9\x1c\x53\xcd\x5e\x54\xc6\x3a\xf9\x16\x15\x32\x15\x34\xd9\x5c\x3a\x09\x3e\x9d\x00\x56\xa9\xa2\x0a\x5a\xb5\x68\xbe\xa8\x54\x34\x79\x7c\xfa\x20\x73\x43\x09\xea\x4d\x28\x30\x61\x10\x4a\x96\x9c\x5c\x00\xec\xb4\xd5\x92\x14\x26\x8c\x8a\xac\x36\x36\x48\x49\xd2\x7e\x29\x43\xb0\xb2\x9c\x20\xef\xaa\x01\xbd\x92\x21\x64\xb4\x89\x90\xaa\x19\xad\x97\xd9\x94\x91\xde\xa3\x30\x18\x2b\x27\x04\x15\xfb\x3a\x23\x55\xc7\x74\x20\x20\xbd\x07\xa4\xda\xbe\xb6\x42\xf3\xa9\xc5\x0d\xfe\xb1\xd3\x3d\x30\x2f\x26\x0d\x3e\x20\x54\x0a\xa6\x53\xb9\xcc\xc5\x87\x32\xe4\x56\x01\xdb\xd6\x2d\x10\xc6\x35\xca\x44\x38\x8a\xc1\xa4\x72\x38\xa7\x41\xb7\x5e\x73\x36\x87\x32\xdd\xd4\x70\x11\xaa\x46\xc3\x8b\xda\xde\xfe\xd6\xf6\xc9\xf6\xde\x2f\x68\x1c\x3a\x88\x23\x6f\x28\xcc\x43\x5f\xe0\x83\xd0\x85\x05\x8e\xd6\x05\xd2\x26\xa7\xb2\xc5\x53\x69\xad\x82\xe6\x1d\x60\xd3\xc6\xa5\x4a\xea\x78\x78\x61\x09\x17\xa5\x84\x22\xb6\x6b\x58\x1f\x04\x39\xd5\x67\x9f\x09\xa3\x59\xb4\xca\x83\x2b\xcf\x7c\x03\x8a\x21\xc3\xfa\x65\x7d\x6b\x5e\xd5\x36\x87\x55\x6d\x53\x58\x55\x16\x8e\x55\xd3\x2c\xb2\x22\xa5\x53\xb0\x88\x61\xd4\x43\x70\x49\x44\x20\xaa\x80\xba\x69\x65\x03\xea\xfa\x1d\xdf\x15\x2c\xcb\xb6\x37\xc3\x31\x60\x4d\x69\x37\xc1\x7f\x9b\x66\x0a\xca\x26\xa1\xb9\xd6\xb8\xfe\x19\xf3\xa5\xe1\xd3\x90\x49\xcb\x27\x22\x0d\x0c\x76\xc7\x8a\x88\xb4\xc7\xae\x8d\xab\x53\x30\x52\xe2\xff\x5b\xfa\xe7\x15\x56\xbd\x3e\x45\x13\x07\xac\x5a\xb9\x16\x4d\xdb\xc6\x49\x44\x5a\x27\x10\xb2\x50\x9f\xd3\x7c\xde\xa2\x37\xed\x94\x4f\x27\xf2\x29\xa9\xf9\x4c\x58\xf1\x7b\x55\xa3\xbc\x9c\x40\x9d\x7b\x5c\x31\x8b\xce\x99\xf4\x71\xd0\x8b\x46\xb6\xe9\xc3\xba\x3c\x03\x80\x9d\x8d\x50\x86\x09\x4b\x3d\x61\x2e\xa4\xba\xeb\x5b\x1d\x45\x0f\x84\x26\xf4\x94\xf1\x63\xca\x5a\x8a\x93\x93\x98\x6f\xe2\xf7\xfb\xd4\xf3\x9d\x84\x06\x63\xe2\x40\xcc\x7b\x79\x02\x58\x80\xaa\x78\xfb\x5d\x60\xad\x55\x23\x3b\x1d\x30\x9f\x1a\x39\x21\x68\x17\xe6\x03\xe7\x8f\x31\xc2\x9e\x4f\x19\x76\x44\x21\x9a\x0f\x71\xc0\x18\x7d\xff\x14\x2c\x55\xe2\x21\xbd\x3e\x55\x36\x58\x8c\x26\xe4\xd4\xdc\xbd\x4e\x6b\xa4\xdd\x91\xa6\x99\x58\x0f\x31\x63\xd0\x7d\x9e\x05\x49\xe2\x8c\xb1\x2d\x31\xd0\x2a\xe1\x92\x29\xef\xc5\x3c\x92\xfd\x7c\x95\x0c\xc3\x80\x32\xb4\x9a\x75\x02\x16\x09\x9a\x1e\x93\x53\x6b\x6b\x3c\xad\x29\xb4\x9b\x1d\xbb\xd3\x04\xf0\xee\xe9\x39\xc0\xc3\x0e\x98\x96\x3a\x68\x94\x82\x66\x2f\xc2\x56\x04\x27\x5f\xf0\x85\x03\x8e\x20\xbb\x7f\x7c\x63\x19\x47\xc3\x92\x47\x06\x31\xed\x70\xd4\x44\xf2\xd8\x94\x42\x8d\x6a\xa8\xe3\x87\x3e\x3f\x8a\x12\xc1\x0d\xf4\x10\x2d\xd0\x93\xc7\xb8\x17\xc5\x7d\x34\xa5\xb0\x49\x2b\x8c\x4c\xae\xc4\x69\xac\xc3\xdb\xc4\x83\xe9\x28\x44\x43\x1c\x18\xa2\xc1\x0f\x7e\x36\x8d\x00\xa1\x0b\x4c\x8c\x38\x45\x62\xc6\xbc\x8b\xa9\x47\xaa\xc0\xf1\x02\xfd\xa0\xd0\x82\x16\x37\x60\xcd\x56\x95\xe6\x61\x08\x31\x45\x2b\x89\x69\x3b\x45\x1c\x46\x58\x14\xc1\xdf\x9c\x3e\x9a\x3d\x43\x60\x3f\x93\xbd\x28\xa1\x2d\xe3\x60\x1d\x46\x9a\x3b\xce\x63\x5f\xe6\x95\xe5\xae\xea\x1c\x98\x0e\x3b\x9e\xc7\xcf\xd4\x60\x56\xc8\x5b\x70\x02\x72\x0a\xe4\x7d\x6a\xf4\x4a\x4f\x8e\xbc\xf9\x9a\x34\x2b\xdb\x21\x04\x05\x8b\x62\xe2\xf9\x0c\x7e\xa6\xd7\x0b\xd3\x00\xe9\xcd\x94\x9c\x03\x8f\x33\xa4\x7c\x70\x37\xd2\xcc\xe1\x44\x2b\xbe\x2a\x9f\x80\xbe\x1f\x04\x3e\xa3\x6e\x14\x7a\x92\x04\x24\x0b\x95\x2b\xf6\x94\x0b\x88\xfc\xa0\x29\x45\x44\xb0\xd3\x1a\xc4\xd1\x85\xef\x89\x1d\x0b\x2b\x7e\x8d\x86\xa4\xef\x8c\xd5\xca\x76\x08\xf3\x21\x1e\xb7\x3c\x1a\x71\x51\xdb\xb1\x68\x80\x91\xc0\x3f\xa7\x2d\x65\x39\x86\x46\x73\xa7\x55\x04\x08\x0a\x21\xcf\xbf\xf0\xbd\x21\x90\x3e\x94\x2d\xd8\xed\x14\x80\x2b\xb1\x19\x09\x6c\xaf\x34\x1a\x55\x99\x02\x08\x5b\x53\x09\xd7\xd7\xf6\xd6\x84\x5f\xff\x82\xb7\x1e\x57\x22\x90\xec\x77\x72\x85\x90\x5e\xb4\x88\x74\xdf\xca\xe1\xa8\x4f\x09\x85\xcf\x88\xe8\x83\x29\xfe\x88\x33\xdb\xc0\x34\xad\x50\xcf\xaa\x4e\x02\x38\xeb\xa4\xef\x3d\x21\x8e\x10\x53\xee\x95\xa1\xd4\xcf\xa4\x49\x5e\x60\x85\x25\xd2\x24\x2d\xd2\xa8\x54\xc9\xc9\x39\x38\x45\x68\xae\xe3\xaf\x9f\x20\x1f\x3f\xc0\xeb\xb2\x3c\xda\xc7\x5d\x76\x04\x25\x96\x48\xf3\xd8\xf2\x4f\x7d\x02\xcf\xca\xd2\xb2\xed\x00\xde\x1f\x6a\xca\x92\x2a\xd9\x83\x9e\x33\xa0\xfa\x14\xf8\x28\xff\x60\x0d\xb5\x07\xe6\xce\x6c\x09\xbf\x83\x44\x84\x4c\x52\xb7\xb8\x55\x72\x04\x90\x94\x53\x29\xde\x61\xe1\x85\xcd\x26\x68\x78\xdb\x4a\xdc\x21\x4b\xa2\xbe\xc9\x49\x28\x67\x38\xb8\x9f\xd7\xc8\x66\x4a\x76\xd3\xe5\xe0\x31\x34\x87\xb3\xb5\xbf\x8b\x57\xab\x9c\x53\x39\xe4\xd4\x8b\x42\x7a\xaa\xd4\x2a\x35\xd2\xd6\x46\x3f\xfd\x28\xe6\x4c\x2f\xa4\xa4\x1b\x3b\x70\xe7\x6c\xb7\x8b\x00\x83\xa8\xeb\xbb\x35\xb2\xb0\x00\xec\x69\x61\x81\x28\x73\x05\xce\xa3\x58\xc2\x39\x1f\x88\xa2\xf8\x5e\x4c\x6a\x76\xfc\x8e\x5a\x47\x45\x52\x9c\x8d\xdd\x8d\x2b\xa1\x93\xe0\x3d\x96\xa6\xae\x28\x7b\xd5\xeb\xbc\x05\xdc\x83\x18\x33\xf7\x84\xd0\x83\xed\x18\x18\x7a\xdf\x89\xcf\x05\x1f\xe7\x9b\x12\x8a\xc4\xb6\xf6\x93\x03\xe3\x8d\xd4\xd2\xeb\xbe\x5c\xb2\x80\x96\xb0\x17\x55\xd4\x18\xe1\x09\x27\xbb\xa8\x80\x93\x5a\x63\x30\x79\x16\x3a\x85\x36\xa7\x58\x69\xbd\x3a\xc0\x83\x0c\xb5\xee\xbc\x94\xb1\xe7\xa5\x8e\xc2\x87\xbb\xc6\xc0\xa7\x5e\x8d\xb4\x43\x42\x2f\x93\xd8\x21\xe0\xb4\x86\x26\x34\x16\xfd\xf0\x59\x5b\xde\x3f\x01\xe3\x62\x43\xac\x22\x1c\x74\xf9\x2e\x98\x6a\x77\x0c\x31\x10\x2d\x98\x7d\x46\x22\x97\xcb\xfd\xf0\x7a\x06\x37\x3f\x61\xc3\x86\x1b\x53\x86\x67\x48\x0f\x8e\x30\x45\x2d\xf2\x26\xe9\x07\xe2\x50\x57\x25\x46\x2f\x5a\x84\x73\xea\x0a\x59\xfa\x19\x2c\x49\x14\x96\xa2\xac\xa8\x73\x23\x7a\x1c\x25\xad\xfd\x87\x61\x27\x8d\x15\xc8\xb9\x03\x62\xa8\xf7\x9f\x81\x97\x22\xaa\xa1\xde\xec\xcb\x0a\xa5\xd2\x3c\xfc\xdc\xa2\xb3\xb9\x3d\x4b\x49\x28\xb7\x9a\xb5\x1f\xda\xab\xbb\x90\x13\x1e\x68\x7e\x4c\xbf\xb2\xd3\x38\x77\x4d\x5a\xe4\xea\x7a\x1d\x7c\x3b\xec\xa1\x41\x3c\x35\xae\x36\x22\x21\xed\xbb\x01\x75\x62\x7e\xde\x40\x9a\xf3\x22\x17\xb6\x78\x90\xfd\xf4\xeb\xdc\x30\x8a\x84\x0e\xc6\xd4\xbf\xe4\x78\x93\x57\xaf\x2d\xaa\x99\x93\x98\x4a\x4e\x9d\x5e\x54\xba\x14\x9c\x55\x82\x10\xc5\xe0\x31\xab\x12\x5c\xf1\xcb\xe4\x7b\xbc\x73\xd5\xd4\x92\x4f\xa5\x71\xfc\x60\x92\x41\x60\x46\x19\x39\xb5\x76\x92\xac\x05\x8a\x27\x63\xdc\xe6\x63\xd5\x86\xa5\xe8\x52\x0f\x53\x9b\x76\xb2\x7e\x85\xba\x9c\xcd\x80\x0a\x2b\x19\x38\x58\x7e\x35\xd7\xf5\x9c\xa9\xc9\x9b\xe0\x11\xe3\x1a\xcd\xf9\x27\xb9\xd8\x28\xaf\x54\x2a\x95\xb4\xc3\x8e\xa7\x77\x72\xd8\xc1\x45\xc1\x33\x87\xd1\xd7\x34\x39\x74\xba\x45\xe1\x68\x56\x84\xa7\x6a\xe9\xe4\xf7\xbd\x7f\x5e\xe4\xbd\x70\x75\x55\xf8\xd9\x24\xa7\x58\xf6\x7f\x25\x11\xba\x98\x39\x25\x31\x65\x1c\x25\xb1\x7c\xf0\xce\x6a\xbc\xef\x70\x21\x31\xee\x9f\x45\x01\xf6\xa0\x74\x84\x7a\x49\x72\x00\x89\xc7\xc6\x63\x5d\x78\x4c\xc1\x38\x4f\x3e\x85\x07\x29\xa7\xb8\x2a\x1c\xc6\xfc\x8e\x2f\x25\xaf\x53\xac\x77\x4a\x06\xb1\xdf\xf7\xe1\xc6\x2b\x8a\x85\x7f\x4e\xe5\xf6\x0e\xc3\x1d\xc3\xcf\x3e\xe5\x32\xfe\x7e\x87\x9c\x60\x8e\x1f\xba\x94\xac\xd6\x1a\xb5\x06\x7c\xf3\x5d\xa0\x1b\xc5\x63\xf2\xde\x01\x3f\x3b\xca\x65\xde\xc2\xb5\x78\x15\x73\xa8\xde\xc7\x24\x11\x7a\x38\xab\x19\x3e\xf2\x18\xb9\xe2\x5c\x9d\x3a\xe1\x35\xf9\x24\x52\xc4\x93\x30\x7b\x1c\x8e\xc0\x42\x15\x6f\x85\xc4\x23\x19\x04\x25\x9e\x4e\x89\xde\x9f\xd4\x7c\x86\x83\x2c\xe3\x9f\x9a\x9f\xd0\xd8\x81\xc8\xd3\x3c\x1f\x3d\xd8\xf0\x36\xb2\x15\x4a\xce\x99\x5b\x32\x8b\x41\x33\xf0\x78\xc6\x50\x8e\x8a\xc2\x22\x6a\x83\xe1\xa1\x51\xa8\xdb\x85\x37\xfe\x0d\x52\xc2\x3e\x97\xc8\xf7\xef\x40\x21\x65\x93\x44\x64\xfd\xc7\x8f\x0d\x1a\x93\x89\x1b\x1b\x7a\xd6\xd1\xa7\x79\xc6\x4d\xa0\xec\x47\xd6\x6f\xe7\xb3\x7b\xf5\xdb\x99\x1f\xe7\x5b\x81\x99\xd7\xbe\x43\xe6\xab\x3a\x0e\x07\xb2\xb7\xb9\xeb\x8a\x76\x4e\x03\x4a\x7e\x79\x3b\xf0\xc5\x4f\x7a\x9b\x46\x70\xd5\xe2\x4c\x0d\xc0\x67\xbb\x43\x5f\xec\x1f\x80\x00\xfd\x99\x2a\xa4\x95\xb7\xa2\x98\x4a\xb8\x95\x93\x99\x33\xe7\x8c\x06\x1f\x82\x61\xd7\x0f\x5f\x05\xd1\x08\x14\xe7\x6a\x73\x82\x1b\x36\x3e\xe3\x27\x7b\xc2\x46\x35\x17\x54\xed\x36\x40\xc0\x55\x7a\x9e\x47\x9d\x9a\x13\x8e\x81\x41\x52\x16\xf8\x61\xb2\x24\x95\x23\xf8\x80\xba\x8e\x9a\xb8\x25\xc1\x56\x97\x94\xef\x5f\xc3\x2d\x45\x31\x82\x0d\x47\xd1\x3a\xea\xac\x49\xd6\x88\x2c\x7d\xb1\xd3\x77\x06\x46\x9d\x94\x37\xe9\xd4\xdb\x12\x70\x52\x8a\xf5\x6d\xef\xf0\x15\x59\xfc\xf1\x63\xb3\x90\x79\x13\x94\x71\x24\x6d\xc4\xce\x80\x1c\x71\x67\x6d\xbb\x55\x29\x97\x54\xb1\x12\x38\xea\x30\x4a\xea\x70\xbe\x8b\xa4\x44\x4a\x64\xd1\x08\xf0\xdb\xd2\xbf\xe7\x88\xe5\x85\xda\xf4\xee\x61\x12\x5d\x99\x4a\x31\xb5\x3f\xf4\x79\x3d\x66\xa1\x6d\xc2\xd0\xa9\x14\x82\x1e\x3f\x56\x75\x95\x3b\x19\xa9\xd8\x87\x1b\x6b\x91\x5b\x81\x1b\xa0\xa5\x66\x4e\x67\x14\x69\xdf\xd0\x9d\xc2\x76\xf2\x9a\xb0\x19\xca\xf3\xbf\xd2\xed\xd5\xbd\xf1\x1f\x26\x5f\xe5\x67\x3c\x5a\xd9\xb0\x97\x0b\xd6\xf2\xd3\x4a\x7e\xf9\x95\x09\x8e\xa2\x52\x90\x15\x04\xe1\x9e\xbf\xa8\xa9\xd5\x74\xc1\x49\x6d\x48\x58\xaa\x4e\x81\x4d\x40\x51\x63\x6b\x37\x55\x9c\xd4\x78\x51\x5b\x86\x3b\xad\xce\x3a\x97\xdc\xff\x25\x9e\x92\x52\x4f\x33\xe7\x0f\xce\x80\xc6\x3f\xd2\xeb\x97\x0e\xb6\x5d\xe4\x97\x2b\xa7\xe8\x24\xf0\xba\x94\xaa\x38\xf2\x93\x9e\x72\xf8\x90\xd7\xc6\x93\x9c\xa2\x93\xda\xd0\xa5\xb4\x7b\x31\x8e\xa8\xa2\xe9\x5b\xb5\x8b\x4d\x02\x0d\x05\x54\xf1\x83\x84\x0e\x36\xa3\x30\xa4\x6e\x12\x15\x41\x7f\xb2\xdc\xc8\x2f\x3f\xa9\x19\xab\xa0\x55\xbd\x28\xc6\x6c\xe3\x89\x55\xec\x26\xe0\x7f\x9a\x07\xef\x29\x37\x6f\xb9\x35\x82\xbe\xfa\xce\xa2\x80\x0d\xed\x06\x99\xe0\x6f\x29\xa8\xdc\xa6\x53\x5a\xa0\xbb\x5b\xbf\x24\x9c\x69\xba\xa6\xb6\x82\xcc\xde\xa0\xf5\x0a\x90\x52\x4e\x7a\x34\x25\x0d\x09\xf1\x26\x8a\x92\x96\x8e\x70\x81\xce\xd3\x5b\xa4\xd4\x09\xe8\x65\x49\x1a\x6b\x0d\xd0\x7f\x07\xdc\xd6\xf5\x69\x8d\x0d\x1c\xd7\x0f\xbb\xb5\x61\xe8\x27\x64\x81\xac\xa0\x98\x81\x85\x7b\x51\xec\xff\x11\x85\x89\x13\x68\xa8\x1c\xd6\x96\x1f\x53\xe8\x50\x8b\x94\xe2\x68\xa4\x40\x3b\x81\xdf\x0d\x77\x12\xda\x67\x2d\x52\x72\xa9\x70\xc7\xa9\xe1\x5d\x70\x3e\xec\x4e\x82\xe6\x46\xc1\xb0\x1f\x8a\x4a\x68\x60\x73\x7d\xbb\x99\xdb\x8f\x7d\xa9\x60\x29\x74\x05\x89\x66\x0d\xe5\xa3\x92\x1e\x20\x04\x7e\x13\xdd\xc3\xd8\x6e\xb7\x68\xd3\x54\xd1\x68\xeb\x06\x8a\x57\xcf\xc2\x84\x93\x71\x46\x53\xfe\x83\xc6\x11\x9c\xac\x3c\x11\xdf\xc4\xb8\xd8\x84\x72\x9c\x91\xb4\x8a\xba\x2d\x63\xc9\x9b\xcd\xec\x74\xe0\xc2\x37\x89\x48\x89\x0b\x17\x25\xb8\x3c\x89\x0c\x24\xf8\xcc\x98\xc7\xaa\xb2\x6a\x08\x85\x51\x36\x1d\x88\x00\x42\x70\x0f\x7c\x46\xc9\x20\x52\x97\xd6\x43\x30\x4c\x04\x65\xa9\x6b\xdd\xc1\x06\x09\x8d\x43\x70\x84\x05\xb1\x3a\x0a\x3b\x9c\x73\xf9\x39\x8a\x88\xbc\xbf\x39\xfd\x09\xb8\x6f\xdd\xbc\xf7\x36\x6e\x52\xb5\x3d\x8a\x38\xc2\xce\xc6\xf7\x2c\xeb\x32\xf2\x62\x26\x28\xc6\xad\xd9\x3d\x40\x68\xcd\x36\x92\x42\x2c\xb3\x9e\x33\xa0\xe5\x59\x60\x16\xdb\xe6\x7c\x66\xb4\x33\x0c\x38\x59\xa1\x24\x27\xa8\x65\x1c\x50\xa9\x58\x05\xd5\x49\xde\xb4\xa1\x37\xa0\xc2\xde\x8a\xb0\x2b\x56\x6b\xff\xf2\xbb\x61\x14\x53\x1b\x06\x9e\xa9\x8a\xc6\x8c\xf1\x3e\xed\x7b\x48\xc3\xaa\x21\x89\x80\x96\x03\xc7\x05\xbd\x7a\x32\xa2\x34\x24\xd4\x71\x7b\x40\xf2\x46\x6f\xa5\x44\x50\xdc\x5f\x6d\x02\x75\x3b\x3a\x54\x7b\xc8\x8c\x14\x28\xeb\xdf\xcf\xbc\xcb\x63\x5e\xf5\x96\xab\x09\xb7\xe7\x19\x87\x00\x95\xef\xa7\xff\x1c\x54\xe5\xb8\x92\xcf\xfc\x7a\x94\x9c\x72\x5e\x32\xa0\xf1\x29\x32\x32\xf0\x67\xc7\x98\xcf\x12\x74\xce\x0c\x1e\xc5\x03\xf4\x5b\x45\x85\x7d\x71\xe0\x87\xd4\x89\x09\x84\xf9\x50\x04\x11\x46\xe1\x7b\x48\xbf\x0d\x53\x13\x9c\x74\x00\xd6\x6a\x9a\xf5\x96\x03\x67\x0c\x16\x16\x41\x34\x22\x9e\xdc\xe6\x0c\x9e\x6f\x14\x9e\x4c\x7f\x93\xf6\x2a\x34\xdc\x54\x32\x82\xc0\x43\x3a\x1c\xab\xde\x5e\x54\xb0\x54\x9d\xa4\x37\x70\x9b\xb1\xeb\xa2\xa9\x8c\xaa\xa9\xfc\x50\x81\x0c\x85\x2e\x83\xb2\x6a\x5a\x37\x02\x1e\xe1\xac\x42\x3c\x55\x15\x33\xe2\x93\xe5\x1a\x98\xab\x55\x6a\xc3\x91\xa9\xb2\x98\x9a\x3b\x55\x44\xa5\xa8\x78\xb0\x96\x78\x20\x5e\x9a\xe9\x34\x2b\x6c\x2c\xd9\x40\x75\x49\xd1\x09\x54\xc7\xb5\x51\x76\xed\x1a\xa5\x7c\x92\xd2\x58\xc3\x08\xb2\x80\x21\xf5\x13\x54\x42\xfc\x43\x5a\xc4\x57\xc1\x01\x3e\x0e\x8c\x7f\xa8\x21\xf0\x0f\xa3\xab\x28\xa5\xc8\x08\x6f\x86\xd6\x12\xfa\x6c\x9c\x1c\x75\x37\x45\xdb\x35\x2e\x27\x56\xed\xc9\xa9\x66\xe7\xfe\x05\x3a\x44\x68\xc9\x49\x3e\x32\x1a\x17\xd1\x6f\x31\x18\x86\x3e\xac\xd9\xf3\xf4\xe2\x06\x93\x6a\xb3\x70\x95\x5c\xd9\xab\xc1\x9c\xa8\xeb\x0a\x69\xa9\x87\x0b\x66\x40\x3b\x75\xb4\x49\x29\x03\x93\x08\x8d\x74\x2c\x43\x6f\x94\xb1\x29\x48\x6a\x16\x80\x54\xfc\x39\x5e\x26\x15\x7e\x4e\x8c\x93\xf3\x10\x53\xd6\x23\x05\x21\x50\x8b\x06\xa2\x96\x19\x50\x89\x71\x15\x87\x34\x8e\xee\xd8\xbc\x54\xba\xd0\xaa\xa6\x93\x03\x87\x25\xa2\x59\xb2\x48\x9a\xc0\xa2\xed\x51\x09\xb3\xa5\x82\xa5\xdd\xca\xa4\x64\x16\x5b\xcb\x9e\x4f\x14\xca\x0d\x43\x7e\x93\xa5\x6c\x6c\xa4\x43\x00\x9b\xf8\xaa\xa5\xde\x6b\x11\xdb\x17\xc1\x23\xbd\x70\x1f\x3f\x36\x39\xd5\xcf\x13\x81\x2a\x8c\xdd\x1a\xee\x4f\x13\xe1\x4a\x8c\xdb\x60\xad\x47\x57\x47\x8f\x32\xcb\xe5\xf1\x63\x63\x29\x3c\x7e\x2c\xa6\x46\x38\xcb\x98\x6e\x21\x68\xa5\x32\xc6\x22\x14\x19\x10\x89\xb0\x8c\xf0\x96\x48\x13\xe2\x66\x2d\x25\x91\x0e\x50\x48\xea\xf5\x94\x0e\x7e\x89\xef\x6d\x60\x4b\x9b\xd4\xc3\x48\xc4\xb0\x83\xb2\x4b\xe7\x74\x2c\x54\xc9\xd5\xc9\xdd\xc2\x75\x00\xdc\x44\x2a\xfc\x34\x2b\xb9\xba\xae\x5a\x48\xab\xa2\x5c\x85\x9b\x4e\xe5\x58\x6a\xa9\xd3\xfa\x7a\xa3\xa9\x9c\x70\xd6\xa8\x2a\x92\x45\x90\x1e\x8b\xda\x27\xec\xf7\xa1\x13\x2b\x67\xcc\x34\xa0\x17\x62\xc1\x35\xaa\x96\x4e\x5e\x71\xc6\x6b\x11\xc1\x58\xdc\x8c\x02\x2b\x50\xd1\x79\xc5\xae\x39\xd3\xa3\x87\xb2\xf0\xc8\x74\x75\x9b\x53\x9c\x25\x79\xdf\xf2\x48\x95\xaa\x3b\x9d\xc4\x9d\xae\xa4\x57\xf9\x5f\x22\xd6\xce\x74\xa4\xca\xa9\x3b\xf5\x61\xea\xc7\x88\xd3\x29\xac\x4e\x27\x3d\xa6\x2a\xdd\x8b\x14\x68\xc0\x9c\xbb\x16\xcb\x36\x75\x25\xa0\x57\x0f\x27\x58\x2e\x9f\x98\xd2\xca\x44\x6a\xad\x4c\x0b\x31\x2b\xf1\x4c\xc0\xc3\xb4\x50\x0d\xd9\xe8\x41\x15\xf0\x27\xa8\x02\xa6\x9e\x17\x25\xcb\x4e\xe4\x3c\xb7\x02\x27\xe4\xe1\x89\xc7\xfe\xa9\x01\x1a\x72\xf4\xc3\xe9\xfe\x7f\xc0\xe9\x7e\xda\x89\x35\xcf\x44\xf7\xc0\x5f\xcc\x53\xd5\x64\x4a\x99\xc4\x81\x51\x9e\xea\x54\x84\x65\xa0\x94\x28\x72\xcc\xf8\x4c\x21\xa1\x91\xbf\xfb\x2b\x59\xdf\x54\x50\x4d\x14\xa1\x52\x37\x61\x4a\x8a\xc2\x77\xef\xa9\xcd\x49\x81\xb7\xf6\x1e\x73\x6c\xa0\x55\x90\x63\x10\xb7\xf1\x64\x83\x94\x44\x52\x29\xd7\x70\x0e\xb0\x6d\x5c\x28\x6a\x4c\xe3\xcd\x45\xa5\x2c\xaa\x57\x7e\x84\x61\xdd\xb3\xc6\xd4\x21\x61\x65\x24\x09\x9f\xa5\xc3\xb2\xea\xd7\x54\xf2\x3d\x06\xbe\x4a\x03\xaf\x9c\x2c\xcf\x1a\x0d\xcd\xcf\x1a\xb5\xa6\x30\x3f\x4b\x59\xa7\x29\x6b\xb4\xcf\x89\x1f\xe4\x5a\xa3\xb5\xc3\x31\xfe\x4a\x19\xa1\x2d\x18\xe6\x67\x68\x74\x96\x67\x5a\xc6\xcf\xa6\x91\x8c\x43\x7d\x45\x4a\x4e\x09\xfc\xf4\x9b\x1e\xfa\xa3\x80\xd6\x82\xa8\x5b\x3e\xa9\xf9\x1e\x0d\x13\x3f\x19\x97\x05\x67\x86\xb5\x2f\x7e\x67\x0d\xd1\x4c\x03\x33\x59\x31\x6b\x60\x06\x29\x05\xe6\x60\xa2\x56\xc6\x1c\xec\x59\x73\xd2\x54\xe5\x04\x07\xbf\x85\x25\xc7\x6c\x41\xc7\x55\x27\x9c\x2a\x39\xb3\xc6\xe7\x90\x9f\xc8\x19\x79\x41\x96\x9a\xa4\x45\x1c\xf2\x33\x7c\x88\xdf\x1b\xf0\xd1\x20\x2d\xb2\xe7\xec\xad\x83\x65\x47\x7a\xa4\x13\x43\x96\xdf\xcf\x48\x45\xc4\x8a\x85\x3a\x3a\x73\x28\x8c\x8e\xdf\x90\xd1\xf1\x27\x98\x34\xdc\x05\xec\x89\xe6\x04\x39\xe0\x6b\xe1\x84\xc0\xfd\x0a\xc6\x6c\x5d\x68\xc2\x56\x72\x92\xc0\xae\x52\x34\xbc\xc6\x7d\xc0\xbe\xc3\x18\x6d\x40\xb3\x75\x66\xd9\xd0\xec\x15\x0e\x74\xf9\x3e\x60\xdf\x61\xa0\x36\xa0\xd9\x3a\xb3\x22\x08\x82\xf5\xa3\x28\xe9\x15\x0e\x75\x65\xf5\x7e\xc0\xdf\x61\xb4\x69\x50\xb3\x75\x68\xf5\xe4\x64\x98\xf8\xc1\xc9\x87\x61\x4c\x3f\x81\xff\x97\xe2\x65\xba\x36\x5b\x13\x6b\xa2\x09\x10\xc2\xf8\x6e\x54\x4c\x41\xcd\x95\xca\xba\x65\xeb\xa5\xc3\x6c\x39\x8c\xf9\xdd\x90\x7c\xff\x6e\x18\x59\x62\xfc\x37\x2b\xda\x9e\x11\x30\x34\xfd\x92\x52\x84\xff\xc4\xd0\x76\x0c\x42\xb3\x5b\xcf\x1f\xfd\xe3\xf5\x4c\xd4\x3e\x2c\x76\xab\xc0\x7d\x58\x45\xc6\xee\xbb\x92\x11\xec\x44\xf4\x3e\xcc\x35\x02\xf8\x65\x83\xd9\x29\x2b\x2c\x90\xb3\x30\xa4\x58\xca\x4d\x93\xfe\xb2\x64\x4c\x9f\x32\x81\x13\xe1\xe7\x3f\x83\x1a\x11\x0b\x15\x2f\x20\x72\xd0\x82\xd1\x9e\x06\xa8\x56\x87\x52\x80\x16\x9d\x5c\xd3\x11\xca\xc8\x46\x41\x3a\x9f\x23\xf0\x1b\x65\xe6\x9b\x61\xcb\xa4\x86\x13\x90\x3a\x0f\x1b\xf9\x3c\xc7\xb6\x2e\x5e\x31\xab\xca\x08\x68\xaa\x5a\xbe\x19\xa4\x1c\xb9\x51\xf3\x9c\x8e\xcd\x6f\x8c\xc8\xa7\x82\x80\x2b\x8c\x1a\x71\x14\x00\x71\x49\xa4\x94\x8b\x5c\xdc\x92\xae\xd0\xa5\x8f\x7d\x91\x5d\xc9\x22\xdf\x00\x64\xc6\x7d\x33\xea\xac\x2b\x97\x49\x0a\xee\x24\x28\x76\x17\x54\x60\x47\xa3\xc4\x3a\x58\x68\x95\x6d\xdb\x3d\x79\x13\xb3\x5c\x25\x27\x09\xed\x0f\x96\xd7\x1f\x22\x24\x3e\x44\x48\x7c\x88\x90\xf8\x97\x45\x48\x14\x27\xbf\x7f\x75\xfc\x80\xee\x5f\xd0\xf8\xc2\x07\x6a\x75\x13\x27\xec\x06\x78\xe6\x11\xff\xf8\x22\xee\xd2\x44\xe4\xd1\x0f\x4e\xd2\x4b\x79\xb9\x37\xb3\xca\x97\x55\x32\xae\x92\x91\xef\x25\xbd\x2a\xe9\x51\xbf\xdb\x4b\xaa\x24\x76\x3c\x7f\x68\x5c\xc2\xf7\x9d\xcb\x4f\x90\x44\x36\xc8\xae\x93\xf4\x6a\x7d\x3f\x2c\xc3\x0f\xe7\x8c\x95\xa1\x72\x85\xd4\xc9\x72\x95\xa8\x44\x04\x05\xa9\xfa\x16\x93\x6f\xc0\x1b\xa2\x15\x08\xf3\x2a\x4e\x24\x4b\x4d\x75\x43\x1a\x44\xee\xf9\x17\x9f\xd1\xdc\x72\x0d\x59\x6c\x80\xa3\x32\x7c\xe7\xf3\xa9\xd1\xdd\x14\xd7\x57\x38\x0e\x93\xf1\xa0\xce\xd0\xb8\x1e\x0d\xe9\x48\x0d\xed\x48\x38\x2f\xb0\x77\xbc\x2a\x41\xc7\x0a\xab\xb8\xf5\x81\x53\x04\xdf\xf4\x88\xa0\x40\x60\x94\xd9\x58\xfd\xfe\xd9\x40\xdc\x0b\xe3\x77\x4b\x97\xb1\x2e\xe9\xc4\xa8\x4a\xbb\x25\xb2\x48\x2e\xc9\x22\x29\x55\xe1\x0a\x6d\x4c\x16\x11\x77\x0b\x46\x5b\x8d\x63\xcb\x59\xa1\x91\xce\x47\xaf\x7b\x07\x40\x17\x37\x48\xa9\x0d\x6f\x34\xac\x82\xb2\x85\x4c\x62\xa3\xda\xa8\xe2\x8b\x0e\x39\x1d\xaa\x33\x97\xa9\xf2\x15\x95\x35\xce\x0e\x86\xb7\xfb\x9e\xa8\x7a\x40\x29\x64\xc9\xa8\xdf\xb4\xeb\xe7\x8c\xa7\x39\xed\x78\x9a\x79\xe3\x69\x4e\x1a\xcf\xbf\x43\x22\xfe\xd9\x3d\xac\xdc\x80\xfa\xe6\x71\xc5\x74\x7f\x5c\x38\xd2\x14\x1c\x41\xcf\x4b\x59\x80\xcb\x05\x73\xb9\x3c\xed\xd8\x97\xf3\xc6\xbe\x3c\xcb\xd8\xad\xd9\x59\x3e\xce\x1d\xc2\x8d\xa3\xd7\x10\x56\x0a\x21\xe4\x0c\x77\x65\xda\xe1\xae\xe4\x0d\x77\x65\xfa\xe1\x5e\x4e\x3b\x31\x2b\x05\x33\xfd\x5b\x09\x6e\x8a\xf5\x95\x7d\x11\xeb\xe1\x3b\xf9\xa2\xf8\xad\x53\x8d\x51\x82\xcc\x65\x32\x21\xc5\x5f\x15\x48\xc5\x8f\xd7\x53\x6c\x22\x6f\x2c\x62\x08\x1a\x24\xe0\x5f\x0f\x9f\xff\x43\x74\x1a\xad\x4a\x08\xa9\xa4\x1b\xb8\x40\xaa\x0d\x5c\xc3\xd9\xd6\x72\xd6\xff\x94\x35\xef\xa9\x9f\x13\xd6\xf4\x44\x34\xdd\x72\x39\xff\x19\x28\x9f\x84\x40\x73\x79\x4d\x1c\xcc\xed\x2b\xdf\xbd\xf7\x37\xac\xb8\x54\x97\x88\xb5\xbe\xae\x26\x52\x3d\xd0\x0d\xe9\x41\x2a\xa2\x87\x7f\x5f\xc0\xb7\x68\x46\x17\x58\xd2\x25\x44\x13\x86\xa9\x07\x6f\x41\xdb\xed\x2b\xe1\x4a\xc9\xa1\x13\x74\x29\x79\x5a\x90\xa3\x79\x67\x9e\xd4\x17\x94\x3e\x77\xa1\x7e\x5c\x11\x8f\x9e\xc8\x06\x29\xe3\xb9\x8a\x6c\xc8\x93\x96\x1d\x41\xb0\x30\x76\xa0\xea\x56\x95\x9c\x14\x05\x0d\x54\x65\xca\xe9\xf8\x5b\x56\x30\x40\xda\x1f\x54\xd1\x45\x34\xdc\x00\xc9\x88\x05\xf9\x11\x05\x15\x4c\xc9\x85\x66\xf0\x3b\xa5\x9d\x4c\x35\xa6\x75\x32\x75\x93\x83\x29\x6d\xa5\x93\x28\xa4\xe2\x8f\x29\x43\x1d\x4a\x23\x18\x35\x3e\x43\x0a\xff\xfe\x5d\x4a\xf2\x5d\x5b\x92\xd7\xc8\xa8\x80\xce\x46\xf8\xa0\xc2\x6b\xb9\x23\x0e\x38\xe5\x7d\xaa\x22\x10\x2d\xff\xea\x88\x76\x62\xc0\x49\x94\x38\xc1\x7b\x40\x1c\x17\x87\xc5\xeb\x13\x9c\x24\x5e\xa9\x78\x18\xc6\x04\x56\x14\x45\x9b\xba\x1f\x93\x64\x8e\xb0\x3d\x69\xa6\x95\x0a\x1a\x57\xaa\x0a\x7f\xc5\xd9\xb7\xd1\xda\x26\xcb\xf3\xbd\x25\xf0\xd4\xb1\xc4\x68\xb2\x84\xe3\x00\xa3\x60\xf5\x58\x74\x8a\xa8\x74\x66\x88\x82\xc8\xa3\x2a\x78\x0f\x78\x8a\xea\xd2\xe4\x50\xa3\xc3\x74\x7d\x0d\xc1\x34\x74\x96\x0a\xc2\x94\xad\x55\xae\x18\x1e\xce\xa1\xad\x7c\x88\x99\x70\x40\x73\x26\xdf\xb3\x66\xc5\xf8\x30\x0a\x5d\x9b\x21\x1e\xe6\xcc\xbf\xf0\x0e\x48\x9a\xc6\x21\xc6\xd1\x41\xb6\x78\x77\x94\xc6\x56\xca\x7b\x76\x71\x90\xa0\x29\x7c\x5f\x13\x72\xa9\xdd\x5e\x5f\x9a\xe9\x63\x9d\x3e\x36\xd3\x91\x31\xaa\x3c\x3c\x10\x1a\xf9\x82\x95\xaa\x02\xe2\xa8\x68\x94\x90\x12\x8f\x2c\x81\xdf\x66\x09\xd3\xda\xf7\x24\x65\x53\x6d\xc6\xa9\xca\x99\x62\xf4\xa3\x69\x64\xac\x67\x50\xb1\x5c\x88\x0b\x15\x50\x65\xdb\x61\x18\x34\x49\xd4\xa8\xa5\x72\x72\x2b\x6d\xe9\x78\xe8\x99\x6a\x32\x2f\xb7\xe2\x4b\xda\xf5\x73\x6b\x41\x86\x59\xc5\x67\x6d\x99\xd7\x96\x16\xa7\xb2\x56\x26\xcf\xae\x88\x21\xf8\x26\x55\xcf\x2d\xb1\x3e\x67\x06\xf8\xba\x04\x8d\xcf\xe2\x25\xe7\x78\x63\xfc\x0d\x6f\x25\x91\x28\xe0\x1b\x7f\x7e\xff\x2e\x09\x01\x12\xc5\x6f\x55\x92\x4b\xbb\x0d\xa3\x10\x7c\x9b\xcb\x2d\xe3\xcc\x5d\x31\x72\x9c\xc9\xc0\x19\x4b\x15\xcf\xc6\xad\x6f\x7c\xca\x95\x72\x29\xa6\x6e\xcf\x89\x13\xb6\x14\x4b\xa6\x57\x32\x3d\x31\x58\x61\xcd\x1e\x15\xe0\x26\xa7\xc3\xb7\xb8\x44\xac\x39\x29\x03\x87\x12\x97\x2b\x4a\xda\x1a\x14\x6c\x50\x6f\x94\x28\xf2\x2e\x3d\x8e\xe6\xcf\x41\xa2\x80\xdd\x88\x32\x69\x00\xd1\x4e\x92\xd8\x3f\x1b\x26\x94\xa1\x8c\xa1\x17\x41\x65\xe6\x86\x28\x34\x84\xae\xed\xc1\x6d\xdf\xc4\x46\xae\xf2\x16\x79\xcb\x98\x4d\x93\x66\xbd\xd6\xad\x94\x50\x9a\xbb\x56\x2a\x19\x9a\xb9\x87\xe9\x51\xf0\x6f\x7f\xe9\x56\x73\xf4\xb8\x2c\x14\x38\xb8\xc4\xad\x3d\x83\x1f\xfa\x4c\x34\x74\xe2\xa8\xdf\x22\x57\x38\xea\x96\x3d\xf8\x96\x42\xc2\x65\x8b\x70\xe4\xb4\xc8\x58\x3e\x46\xc5\x7f\x49\x34\x7b\x5d\xe9\xc4\xb5\x95\xe5\x71\x13\xb8\x66\x2b\x9d\x90\x62\x60\xe2\x6d\x40\xc1\x9a\xd2\xb3\xa8\xab\x19\xe2\x6e\x4c\x3b\xcb\xf6\xb6\x0c\xca\xc0\x61\x1c\x7f\x91\xfb\x12\x2f\x92\xdd\x96\x00\xdd\xc3\x38\x7e\xa3\xb6\x27\x28\x97\xdd\x9d\x64\xc1\x5f\x55\x99\xcb\xbc\xec\xaf\x2a\x7b\xbc\x6e\xee\x6d\xf7\x48\x67\x77\xa7\xb5\x34\xbd\x4d\x4d\x73\x9a\xee\x4a\x8d\xc1\x25\x9e\x08\xad\xcd\x16\x9c\x96\x08\x65\xab\x25\x31\x2d\x92\xd2\x40\xbf\xc5\x96\xff\x38\x15\x9a\xf5\xa1\x14\x69\xe4\x94\x74\x24\xfb\x40\xce\x50\x62\x49\x1c\x9d\xd3\x2d\x87\xf5\xc0\xc6\x3f\x53\xfe\x0c\xc7\x52\xbc\x65\x92\xe9\x09\x99\xa4\x08\x74\xc2\x7e\xca\xff\xd1\x7c\x72\xb7\x4a\x5d\x57\xa7\x9c\xce\xbf\xe1\xf6\x60\x46\xd7\xfb\x81\x1b\x44\xaa\x99\x0c\xbd\xde\xb4\x4d\x90\xfc\xad\x02\xd6\x70\x15\xd7\x6a\x55\x73\x88\xaa\xc1\x05\xd4\xd6\x91\x06\x17\xd3\x8e\x25\x6f\x77\x52\x31\x7e\x8c\x09\xc5\xce\x8b\x80\xa9\xfc\xcf\x7a\xaa\xcc\xb5\x4d\x0f\x95\x8a\xf1\x9d\x73\x24\x30\x43\xea\x1c\x5b\x0f\x4c\xd4\xe9\x0c\xa2\x6f\xdc\x4c\x48\x47\xf3\xea\xd8\x3f\x7f\x5c\x51\x17\xb5\x35\xe1\x36\x41\xda\x3b\x7e\x32\xe4\x1f\x59\xc4\x7c\x24\x62\x91\xdb\x6d\x27\xdf\x85\xc9\xff\xf0\x69\xfb\x60\x7b\xef\xb0\x7d\xb8\xb3\xbf\x77\xd2\x3e\x3c\xfc\xb4\xf3\xf2\xf3\xe1\xf6\x01\x9f\xfe\xdb\x83\x44\x5d\xc9\xf6\x2f\xdb\x7b\x87\x19\x58\x57\xe9\xa7\xd5\xb7\x33\x79\xaa\x39\xea\xd9\x35\xe1\x9b\xe2\x0c\xf5\xa5\x07\x03\xc2\xb7\xd3\x3b\xd5\x17\x5b\xf6\x9d\x60\xc8\x8d\xfe\x4e\x40\x70\x8d\xcc\x04\xc4\x30\x3e\x9f\xbd\x0b\xb3\x34\x0c\x7b\xc5\x31\xac\xeb\x0c\x1b\x9f\x69\x24\xf8\x26\xba\xf0\x1c\x75\x27\x98\xf6\xde\x75\xc7\xd9\xca\x6c\x70\xf7\x05\x4f\x0a\x77\xb3\x92\x41\xf9\xa8\x44\x1d\x06\x4f\x81\xf9\xdf\x25\x3f\x54\x3f\xa3\x61\x62\x24\xcb\x4f\x7c\xbd\x0e\xef\xbf\x4d\xee\x95\xb5\x36\xbf\x14\x46\xe6\x63\xf1\x57\xac\x9c\x86\xb9\x02\xe0\x03\x62\x27\x52\xa9\x7f\x88\x3a\xe4\x2c\x8a\x3d\xf0\xbd\x9c\xc9\xe9\x44\xc3\x98\xb8\x51\x1c\xd2\x98\x61\x30\x0b\x79\x45\xcc\x88\x23\x7c\xf0\xe7\xd5\x0b\x68\x27\x59\x4a\xa2\x41\x15\xa3\xb1\x9a\x3f\xcf\xa2\x24\x89\xfa\x55\x2c\x82\x1f\x19\xc8\x21\x01\xca\x35\x56\x5d\xa3\x80\x86\x95\x81\x7b\x21\x45\x6a\xc7\xb8\x29\xfa\x6a\x14\xd0\x49\x53\xc4\x28\xc8\x4c\x39\x4e\xdc\x9c\x54\x33\x2e\x57\x2a\xe0\xef\x07\x66\x04\x3c\xa1\xce\x68\x92\x6c\xa9\x8a\x6d\xa3\xe2\x95\xbf\x93\x51\x71\x10\x79\x0e\xeb\x9d\xf8\x0c\x34\xd4\xc5\x36\x85\xcf\x66\x35\x2f\x4e\x37\x70\x27\x3b\xe3\x34\xb0\x59\x8d\x82\x15\x1c\xe9\x4f\xba\x78\xe0\x4f\xee\xb1\x8d\x3b\xd9\x1f\xe7\xc0\x9b\xd5\x54\xf8\x87\x58\x92\x2f\xdf\x83\x25\xf9\xf2\xdd\x2c\xc9\x57\x7e\xa0\x25\xf9\xca\x7d\x59\x92\xaf\xdc\x83\x25\xf9\xea\x89\xb7\x72\x02\x8f\xb4\x8a\x67\xf1\xf9\xf3\x59\x2d\x8d\x7f\x9c\x95\xfa\xda\x7d\x59\xa9\xaf\xdd\x83\x95\xfa\x93\x1f\x6f\xb5\xfd\xf4\x96\x56\xdb\x33\x34\xf1\x4c\x34\xb1\xe5\x24\xce\x0d\x2d\x80\xbf\xd1\xb9\x07\xd3\xf0\x07\xd3\xf0\x07\xd3\xf0\xfb\x35\x0d\x7f\xb0\x0c\x7f\xb0\x0c\x7f\xb0\x0c\xff\x9b\x59\x86\x6f\x0e\xe3\x0b\xcb\x2a\x1c\x57\xf0\xe6\xe7\x4f\xbf\x6c\x9f\xbc\x6a\x6f\x1e\xee\x7f\xda\xd9\x3e\x10\x07\x6d\x97\x17\x7e\xe9\x30\x9f\x6d\x06\x11\xa3\xde\x24\x65\x80\x29\x7d\x49\x3d\x60\xba\x3e\x2a\xed\x74\xea\xfe\x80\x4e\x54\x57\xd8\x30\xbd\x14\x4c\x5e\x3b\x0d\x71\x7a\x68\x67\x29\x68\x06\x24\x7c\x53\x7e\xdb\x21\x77\x34\x40\x13\x40\x06\xee\xf4\x10\x69\x1a\x22\xc0\x92\xf3\xb2\x1b\x85\x51\x12\x85\xf4\xd7\xe9\x01\x76\x35\x40\x55\xdb\xe8\x9f\x4c\xfb\x3a\x3d\xc4\x5e\x16\xe2\x57\x03\xe2\x9e\x93\x0c\x63\x27\x98\x1e\x9e\xaf\xe1\x89\xba\x06\x34\xe9\x84\x68\x3a\x50\xdf\x34\x28\x70\x91\x65\xc3\x81\xf8\xb3\xd3\x03\x3b\xb7\x81\x61\xf4\x5a\x73\x36\x78\xea\x4b\x88\x76\x35\x3d\xd0\xc0\x06\x8a\xd5\x39\x54\x65\x6a\x28\x3c\xe8\x9b\x92\x98\x48\x2a\x0f\xac\x27\xdd\x83\xda\x25\x5a\x14\xf3\x1f\x8f\x1f\x93\x41\x6d\x2c\xbf\xc7\x60\xb9\x28\x1e\x7f\xfc\x9a\x7a\xf1\xf1\x6b\x16\x8e\x59\xfc\x6b\xaa\xf8\xd7\x4c\xf1\xb1\xb6\x8b\xec\xd2\x04\xb8\xcb\x2b\x87\x33\xd2\x71\xaa\xaa\x99\x55\x46\xc6\x8b\xce\x24\x11\x20\x67\x93\x33\x2a\x0e\xca\x15\x80\x57\x49\xc5\xc4\xe0\x69\xca\xec\x0d\x1e\x74\x88\x0b\x10\x40\x78\x49\xec\x2a\x35\x16\xf8\x2e\x2d\x37\xaa\xa4\x59\xa9\x25\xd1\xe7\x01\x67\xa1\x0e\xa3\xe5\x8a\x5d\xa0\x59\x51\x8f\x49\x10\xce\x86\x84\x24\xe9\xbe\xc4\xf1\x6e\x0e\x49\xf5\x24\xc5\x5c\x8f\x4a\x60\x9e\x8e\xf1\x31\xa4\x47\x4d\x80\xa7\x7c\x6f\x90\x17\xa4\xf4\xb5\x44\x5a\xa4\xf4\x6b\x49\xf8\x1e\x9b\x2b\x04\xc7\x21\x1d\xa3\x43\xee\x3b\xf0\x15\x3d\x8f\x30\x53\xd3\xd8\xb6\xe6\x9d\x15\xa7\xb1\x6d\xbd\xb5\x69\x2b\xf4\x68\x82\x59\x2b\xe4\x2b\xfb\xb8\x7c\x33\x55\x28\x23\xcd\x7c\xe4\xad\xfd\x8d\x36\xa0\x50\x6b\x1a\xc3\x4f\x04\x5f\x11\xf6\x9e\x58\x5b\x9d\xf2\x2a\x05\xf6\x97\x62\x5c\x96\xed\x25\x87\x0b\xf7\xbe\xd2\xe0\x72\x01\x2f\x0a\x21\x56\x9c\x3b\x0c\x9c\x84\x8a\x18\xde\x09\x84\xd5\x74\x71\x43\xc7\x22\xff\x92\xde\xd3\x31\xdc\xd5\x35\x94\x12\x99\xf9\x96\x98\xa2\xb9\xb4\x71\xe1\x64\x13\x42\x21\x6a\x09\x4b\x3d\x58\xcc\x46\xee\x20\xf2\xc3\xc4\x30\xf7\xc3\x6f\xb3\xc4\x99\xc3\x80\xf2\x74\x19\x99\x62\x96\x92\x2b\x43\x96\xc1\x6f\xcb\x6c\x10\x9d\xc3\xec\x0d\x83\xc0\x68\xcf\x4c\xb5\x0c\x23\x5d\x9b\x3b\x4d\x64\x4a\xa6\x15\x61\x27\x8a\xfb\x4e\xf2\x41\x0e\xcb\x6a\xf5\x85\x18\x6e\x0d\x2f\xbc\x0d\xaf\x9b\x34\x4c\xe2\x71\x8e\xc5\x98\x64\xe0\x98\xaf\x0c\x97\xb8\x54\x87\xa0\xcc\xa6\x03\x3f\xa4\x92\xe3\xd9\xcf\xda\x08\xb9\x89\x69\x16\xab\x99\xcb\x95\xb2\x44\x78\x25\x6d\x45\xeb\xc4\xd4\x51\x43\x35\x47\x9e\x72\x2a\x0a\xdd\xaf\xa6\xdd\x4e\x9a\x8b\xcb\xbc\x47\x16\xa5\xaf\x60\xea\x5b\x8a\x00\x8e\xa0\xfa\xb1\x6d\x2b\x6b\xfc\xe6\x03\xcc\x65\x90\x76\x8b\x29\x2c\x4d\x61\x94\x6f\xb2\x43\x64\x58\x7c\xdc\xc8\xad\x2a\xb5\x71\x99\xef\x75\x95\xda\x65\x93\xff\xf8\xb5\x52\xbb\x6c\x18\x23\xf7\xd2\x76\x01\x72\x62\x81\x8a\xf9\x06\xaa\xb3\xac\x81\x99\x8f\x16\x7e\x4c\xc7\x2f\x45\x7f\xc7\x4d\x31\x82\xf1\x2d\x3a\x3e\x2e\xec\xf8\x5c\x5e\x7f\x6b\x92\x90\xc5\xdf\x4a\x0d\xd6\x57\xd9\x5c\x65\xa6\xad\xb5\x68\xcc\x04\x51\xd6\xc4\xa6\x17\x82\x7e\x3a\x95\xbf\x35\x3e\x7e\x7c\x33\x9e\x72\xf4\x7f\x52\x40\xf7\xd9\x1e\x06\xd4\x06\x94\xe5\x2e\x83\x3f\x83\x9c\x54\xc3\x39\xe3\xfe\x1f\x36\xbc\x3c\xa2\x2b\x1a\xde\x7d\xf5\xa2\x0f\xbd\x00\x9f\xb0\xe9\x5e\x60\x27\x32\x06\xa1\xb3\x93\x6e\x1e\xe1\x9a\x8c\xd1\xb4\xe0\xb9\xb3\x55\xff\x0d\x06\xeb\x59\x43\xf9\xe5\xac\xf7\x71\x92\xdd\x84\x97\x73\x76\x61\xf1\x6e\x4a\x15\x70\x6c\x03\x4a\xfe\xfd\x09\x5e\xc0\x98\x25\x3e\xc1\x53\x21\x63\xff\x29\x3f\x12\x4d\x7d\xff\x4e\xc4\x4f\xa1\xe3\x85\xb8\x6b\x8f\x78\xa5\xdb\x18\x7a\xc7\xd4\x09\xc4\xd3\x74\x01\x98\x1f\x67\x4c\xb8\xe4\x05\x22\x47\x8b\x2e\x2d\xf1\x42\x6b\x5a\xdb\xdf\xcc\xad\xdc\x3d\xd9\xde\xe5\xdd\x6c\xfc\x10\xd3\xec\xfc\x86\x66\x35\xcd\x9e\xca\x82\x2a\xff\x96\xca\xb2\xac\xc7\x83\x95\x69\x55\xaf\xe9\xc9\x6b\xa9\x99\xad\x1a\xb4\xd0\x69\x49\x3a\x53\x72\x50\xb1\x41\x1c\x48\x6b\x93\x8d\xe1\x96\x6f\x69\x0c\xb7\x29\xba\x7c\x07\x43\xb8\xfc\xb9\x98\xc2\x10\x6e\x6a\xe3\xb5\xfc\x5b\x56\xcb\x78\x8d\xe7\xcd\x04\x62\x2a\x8b\xad\xc9\xb5\xcb\x47\xa5\x33\x87\xf9\x10\x01\xe0\x4c\x2b\xfb\xd4\xe7\xfe\x00\x83\x00\x04\xca\xe9\x7f\x60\xe8\xc7\x20\x22\x00\xaa\x7a\xf8\xcf\xbe\xd4\x4b\x99\x1f\x5f\xcd\x0f\xfe\x9b\x89\x78\x04\x4c\xa9\x4d\xe4\x17\x68\x66\x4a\x30\xe3\xb7\x1f\x0e\xe7\xcd\x68\x44\x86\xa2\xc7\xec\x18\x9d\xe4\x56\x93\xc3\x97\xfb\xe3\x5f\x30\x67\x37\x5b\xd9\x15\x56\x35\xac\xec\x90\x23\xcf\xd4\x7d\x80\xb2\xdf\x99\xda\x1a\xc0\x1c\xb9\x70\xbf\x3b\x67\x9f\xfd\x66\xea\x86\xb4\xc6\xe3\xfc\xe7\x8e\xab\x4f\xb0\xb0\x99\xa0\x60\xf0\xf5\xc9\x06\x6f\xb8\xba\xd5\x02\x32\xd0\x7f\x74\x9c\xc5\x05\x46\x53\x56\x6f\x44\xef\xc9\x76\x4b\xe9\x4f\x6c\xbb\xad\xd5\xbf\x93\xdd\xd6\x83\x33\xc8\xff\xf1\xce\x20\x7f\xb8\xf5\xc9\xca\x2c\x3e\x03\x1f\xac\x22\x1e\xac\x22\x1e\xac\x22\x1e\xac\x22\x1e\xac\x22\xfe\x33\xad\x22\x7e\x25\xed\x4b\x9f\x69\xb3\x08\xbe\x7c\x7f\xe5\x49\xd3\x68\xa6\xf2\x36\xad\x1f\x72\x0d\x06\x3d\x9a\x70\x0d\x06\xf9\x37\x5c\x83\x41\x99\x5b\x5f\x83\x41\xad\x69\xae\xc1\x10\xfc\x2d\xaf\xc1\xc4\xb8\x8e\x66\x57\x9d\x65\x94\x4a\x39\xda\x03\x68\xe5\x7e\x9f\xd2\x01\xc8\x02\xed\x01\x84\x45\x08\x82\x68\xb4\x45\x5d\xbf\xef\x4c\x3e\xa4\xdc\xf8\x64\xa8\xe7\x7b\x77\x7b\x73\x24\x1e\xae\xc0\xad\x73\xd4\x21\x9e\x93\x38\x32\x9e\x32\x84\xee\xc5\xc8\xbe\xb0\x08\xa0\xd0\x5f\xf0\xfc\x4b\x9c\xa7\x66\x7f\xbe\x84\x27\x53\x31\x52\x08\xff\x7c\xd3\x48\x79\xa1\xff\x84\x91\xfe\x3e\xa4\xc4\xf7\xf8\x70\x2f\x97\xc4\xd0\x2e\x39\x6d\xee\x4c\xb4\x5f\xfa\x7b\x8f\xce\x8b\xfa\xce\x8c\xaf\xe3\x6e\xd6\x30\xfc\x5d\x87\x3e\x53\x55\xce\x17\x67\xaa\x28\x55\x55\xce\x30\x89\x4a\x55\x52\xe2\x6b\x65\x17\xdf\xe9\xc1\x4f\xe7\xb2\x74\x0c\x41\x6c\x34\xb1\x9d\xd3\xf1\x8d\xab\x8a\x67\xbe\xa3\xb3\xbd\x87\xfd\x9f\x8a\x7f\x6b\x45\xa2\xcf\x9b\xa8\x03\x08\x21\xa3\x9e\xef\xf6\x88\xcf\xc8\x90\x0d\x9d\x20\x18\x73\x11\x14\x0d\x39\x38\xe2\x20\x4e\x4e\x10\x8c\xef\xe9\x05\xb0\xe8\x81\x70\xb3\x23\xba\x50\x15\x7d\x08\x29\x46\xb9\x3e\xa3\x84\xd1\x84\xb7\x7f\x36\x26\x43\x06\x2f\x1b\xef\xe5\xe9\x70\xdf\xe7\x52\xed\x7d\x6c\x54\x66\xb4\x54\x31\x8a\x6c\x60\xb9\x99\x09\x3e\x89\x40\x7d\x8c\x8f\x32\x85\x4a\xf6\x26\x15\xfa\x8d\x40\x11\x0d\x10\xee\x56\x44\xc8\x29\x69\xaa\xf0\xdd\x73\x46\x5c\x27\xe4\xb8\x77\xc2\x31\x9a\xd0\x8c\x64\xd4\x7a\xa0\x13\x1f\x63\xf5\x40\x0e\x9c\x5f\x10\x88\x09\x00\x0e\x07\x70\x2a\xe0\x4d\xb1\xc9\x00\xd4\xa3\xd5\x84\xd7\x9d\x9d\x91\x1a\xb3\xe2\x46\xc3\x10\xa8\x0a\x40\x0a\xd0\x9b\x3c\xf1\x7e\xc8\x16\xaf\x55\x13\x1a\x6b\x59\x4f\x34\x26\xda\x7a\x25\x0b\xcc\xd4\x1e\x30\x4a\xd0\xd7\x7a\xde\xac\x6f\x9b\x31\x0a\x18\x0a\x9e\x01\xed\xdc\x75\xe0\x04\x1f\x0b\xdf\x01\x0a\x04\x26\xad\x2a\x69\xd3\x49\x1c\x7e\xac\xe9\x04\xd1\xe8\x4e\xeb\x90\xb9\x4e\xf0\x57\x48\x81\xb8\x9a\x6e\xa7\xbf\x93\xb6\xe1\x07\x9b\xed\xf7\xdb\x27\x87\x5f\x3f\xe0\x15\xdb\xc4\x4b\xa0\x29\xb8\x39\x27\xb8\xbf\x00\x03\x30\x03\x7f\xae\x1c\x00\x67\xb9\x99\xaa\x52\xbc\x30\x47\x84\x71\x2e\x74\xd3\xad\xd6\xdf\x0d\x69\x38\x76\x3d\xe1\xff\x93\xfb\xdf\xf7\x43\xbe\x4f\xbc\x76\x26\x9a\xc9\x4f\xc1\x95\x38\x22\x0e\xfc\x3f\x66\x43\x84\x06\x03\xd2\xcd\xc5\x64\xfb\xff\xbf\x9f\x2f\x11\xb9\x9f\x0f\x62\xca\x28\xd8\xe6\x3b\x31\x38\xa8\x90\x09\xdb\xa1\x67\x7e\x42\x3e\x4f\xe3\xb2\x32\x38\x50\xa1\x17\x34\xbe\xe1\xed\xc8\x44\x42\x80\xcb\xbb\xe2\xeb\xc0\x94\x5a\x01\x54\x6d\x4a\x47\x50\x10\x08\x51\x88\x3a\x45\xee\x32\x56\x1a\xa6\xf8\xa6\x60\xa8\x43\x64\xa3\x6a\x6f\xf6\x6b\x5a\x62\xd2\xd2\x8e\x79\x6a\x3b\x6a\x54\x09\x9e\x2b\x8e\xad\x1d\xf7\x4a\x6c\x9a\x8d\xaa\xdc\xf8\x1a\xe8\x33\x2b\x67\xf7\x52\xdd\x10\x7b\x91\x38\xa7\x58\x18\xfe\x31\x97\x9d\x4a\x4b\x66\x5f\x76\xae\x3d\x5c\x76\x3e\x5c\x76\xfe\x65\x97\x9d\x0f\x37\x91\x0f\x37\x91\x0f\x37\x91\x0f\x37\x91\x0f\x37\x91\xff\xc1\x37\x91\x5f\xed\x9b\x48\xbe\x7a\xbf\xfe\xed\x2e\x22\xbf\xde\x70\x11\xf9\x75\x8a\x8b\xc8\xaf\x33\x5d\x44\x7e\x9d\xf6\x22\xf2\xeb\x2c\x17\x91\x5f\xff\x94\x8b\xc8\xaf\xf7\x7f\x11\xf9\xf5\xe1\x22\xf2\xef\x74\x8b\xf0\x70\x11\xd9\x21\x63\x79\x11\x39\x7e\xb8\x88\x7c\xb8\x88\x7c\xb8\x88\xfc\xf3\x2f\x22\x1f\xae\x9c\xfe\x46\x57\x4e\x79\x37\xc3\xd3\x5c\xcb\xfe\xb0\x3b\xe1\x1b\xae\xa5\xc9\x66\xcf\x89\x93\xff\xd3\xee\x85\x03\xda\x01\x4d\x2f\xa8\x26\x7f\xf8\xbd\xf0\x7d\x5d\x43\x26\xd1\x5d\xf5\xfd\x84\xa0\x7e\xf8\xe1\x1a\xb2\x68\x47\xd2\x8f\xd7\x06\xd1\x08\x1e\x9b\xfd\x8e\x97\x02\x41\xd4\xe5\x7f\x7c\x8f\x86\x89\x9f\x8c\xf9\xef\xc4\xef\x53\x7c\xfd\x26\x2e\x0a\x22\x3f\x84\xb2\x51\xec\xf9\x21\xbe\x07\xfb\x7d\xe8\x84\x89\x0f\x4e\xf8\xc5\xef\x3f\xe0\xf7\x30\x71\x0f\x45\x75\x46\x7f\x1f\x72\xa0\x58\x21\xe9\xc5\x94\xf5\xa2\xc0\xbb\xe1\x71\xdb\xc3\xbd\xe6\xc3\xbd\xe6\xc3\xbd\xe6\xc3\xbd\xe6\xff\x21\xf7\x9a\xb8\x63\x6b\x41\xe9\x49\x36\x0a\x40\xe6\x56\x73\x3c\xcd\xad\xa6\xdc\xb5\xa7\xba\xd3\x84\x1d\xb8\x51\x55\xbb\xe8\xdf\xf1\x4e\xf3\x6b\xfe\x9d\xe6\x93\x49\x77\x9a\x02\xca\xf4\xf7\x98\x73\xb8\x6c\x97\xd0\x71\xf2\x5c\xd9\xad\x90\x03\x3f\xf4\x62\x4a\x0e\xa2\xb8\x37\x64\x73\xff\x0a\x7c\x97\x86\x8c\x92\xdd\x9d\xc3\x39\x50\x72\x66\x43\x8a\x86\xd1\xd2\x30\x1c\x32\xea\x2d\x5d\x38\x31\xe3\xfd\x13\xee\xe5\x0c\xb7\xc7\x07\xe3\xfe\x59\x14\x18\xae\x9a\x73\xb3\xf1\xd2\xcc\x76\x98\xac\xab\x14\xb9\x54\xc6\x5a\x9c\x8e\x77\xd8\xb6\x79\xb3\x95\xa9\x37\x10\x35\xcc\x72\xe6\xb5\x4a\x12\x09\xa5\xed\x85\x13\x70\x7c\xfd\xc3\xef\x10\xfe\x1b\x6e\x03\x40\xa1\xfe\xfd\x3b\x91\xdf\xc3\x50\xba\x23\xe1\x25\xff\x91\xa7\xa4\x2f\xd9\x7e\xa9\x5d\xbc\x4d\x39\xa3\xe2\x86\x82\x8c\xfc\xa4\xa7\x14\xf5\x0a\x5e\xa9\xb2\x3e\xf7\x8f\xeb\xb9\xb9\x7f\x08\x05\xa4\xd1\xa7\xf5\x39\xf3\xe2\x81\xf5\xa2\x61\xe0\x7d\x66\x74\xcf\x49\x7c\xe1\x51\xed\x1f\x49\x3c\x86\xfe\xc0\xf5\x8a\xd5\x3e\xf6\x53\x42\xc5\xdb\xbd\xb9\x7f\x40\x4b\xff\xa8\xd7\xc9\x16\x4d\xa8\x9b\x90\xb3\x61\xb7\x3b\x26\x12\x53\x52\x57\x8f\x02\x7c\xec\xd1\x98\x1f\x36\xa2\x80\xff\xf8\xe5\x19\xe1\x4b\xc0\x8f\x42\x56\x13\x30\x7a\x49\x32\x60\xad\x7a\xfd\x6c\xd8\x65\x35\xb7\x17\x47\x7d\x7f\xd8\xaf\x45\x71\xb7\x3e\xa8\x5f\x3c\xab\xfb\x8c\x0d\x29\xab\x7b\x34\x71\xfc\xe0\x85\xef\x6d\xac\x36\x9b\xcf\xe6\xfe\xf1\x0f\x88\x15\x4a\x59\xd2\x24\x1b\x80\x41\x74\x87\x56\x2e\x39\x67\x6e\xa9\xb2\x0e\x87\x09\x9b\xe6\x96\xc0\x95\x4c\x18\x2d\x85\x74\xb4\x34\x8a\x9d\xc1\x80\xc6\x8c\x4f\x02\x07\x72\xb4\xc6\x17\x50\xc9\xa3\xa5\x75\x81\x87\x5c\x9a\xdb\x73\xfa\x94\x95\xa1\x46\xe5\xa8\x71\x8c\x7e\x8b\xd6\x4a\x37\x60\xe9\xb6\x23\x5c\x69\xac\x3d\x31\x46\xb8\xcc\x79\xe7\x35\x07\x98\x77\xa5\xdb\x6c\xc8\x8b\x5c\xde\x05\x28\x7f\x54\x3a\x29\x91\x45\x81\x91\x5a\x27\x8e\xfa\xfc\xa4\xb7\x19\x79\xb4\xec\x57\xf8\x38\x7d\xec\x1d\x36\x01\x33\xb4\x5c\xb4\xca\xf4\x88\x97\x2b\x29\xf7\x60\x29\xe2\xc0\xa6\xc3\x63\x80\x5d\x91\x68\x44\xe8\xb5\x6f\x91\x1f\x96\x4b\xa5\x0a\xdc\x51\x95\x1a\xcd\xe5\x95\xd5\xb5\x27\x4f\x9f\x3d\xff\xc1\xa8\x5b\x51\xa8\xe3\x74\xe1\xd1\x4e\xb7\xe7\x7f\x3b\x0f\xfa\x61\x34\xf8\x3d\x66\x49\xa9\xc6\x06\x81\x9f\xf0\x8e\xd5\x3a\x51\xbc\xed\xb8\x3d\x63\x7c\x01\x3f\xa8\xc7\x06\x62\x57\x8e\x30\x89\xa3\x10\x7f\xd9\x63\x15\x08\x3c\xa7\x63\x56\xb6\x56\x11\xb8\x17\x01\x08\x95\x8a\x85\x0a\x0e\xb9\xa0\x6b\x93\x10\x23\x31\x1e\x0f\x79\xda\x35\x71\x9d\xc4\xed\x91\x32\x8d\x45\x6f\xeb\x75\xf2\x85\x12\x2f\x0a\x4b\xb0\x73\xf0\x25\xea\x84\xa0\x4b\x03\xad\xce\x59\x74\x41\x49\x12\xe1\x1d\x61\x95\x9c\x0d\x39\x7f\x01\xfd\x88\xd0\x50\x38\x1d\x5a\x9b\xcb\xb4\x7d\xcd\x19\x09\x6e\x1b\x35\xb1\x6b\x90\x8d\x1c\x86\xf2\x22\xe5\x5a\xbf\x95\xf1\xac\x5f\xd5\xfe\xef\xe7\x60\xae\x38\x8d\xae\xe3\xcf\x24\x22\x1b\x9a\xa9\x0a\x4f\xfc\x22\x8f\x49\x96\x3f\xa7\x97\x02\x43\xc7\xfc\x2c\xd7\x31\x3f\x93\x0b\x83\x37\xa0\xef\xd7\xb4\x6f\x7e\x06\xf7\x36\xc6\xca\x12\xfe\xf9\x79\x79\x31\x03\x7c\x66\xf3\xfc\xf1\xf3\x22\xca\x1b\x3f\x4c\x64\x12\x49\x6f\xfc\x3c\x0f\x7d\xf1\xf3\x8c\x6b\x39\x6f\x1c\x54\xee\x26\x26\x20\x30\xb5\xe3\xe5\x96\x82\x26\x81\xda\x72\x39\x81\xa8\x9d\x32\xef\x80\x9e\x09\x03\x06\x6b\xb3\x33\x47\x21\xaa\x1e\xf9\xc7\x6a\x30\x7c\x34\x3a\x59\x0d\xca\x48\x82\x8e\xc0\xe0\xc4\x08\xcd\x0d\x28\x89\xd0\xdb\x68\x4a\x14\x79\x7a\xaf\xa2\x08\x11\x22\x2a\xf9\xa5\xfd\x89\xec\xec\xbd\xdd\xde\x3c\xdc\xd9\xdf\x23\x0b\x75\x0d\x7b\x10\x47\x2e\x85\x1b\x75\x71\x17\xbb\x19\x0d\xc6\xa0\xfb\x21\x5c\x72\x59\x6e\x34\x57\x96\x06\xe8\xb4\xa9\x4a\x5e\x39\x2e\x3d\x8b\xa2\xf3\x2a\xd9\x09\xdd\xda\x1c\x81\x0a\x87\x3d\x9f\xc9\xb0\x0e\x6e\xe4\x51\xe2\x33\x22\x24\x1c\x0f\x36\xe0\x18\x56\xd5\xee\xce\xa1\x4c\x26\x9d\x68\x18\x4a\x45\x35\x07\xf1\x7e\x67\x73\x7b\xef\x60\x9b\x74\xfc\x80\x4a\xfd\x75\x1c\x45\x09\xf1\xfc\x98\xa2\xaf\x4a\x58\x9b\xba\xa1\x24\xa6\x54\x74\x00\x6e\x89\x45\xe7\x3f\x33\x5e\xff\xc2\x89\x7d\x07\x02\xaa\x27\x11\x71\x18\xa3\x71\x42\x30\x16\x3b\x2a\xfc\xc6\xd1\x10\x64\x9b\x6e\xec\xf4\x79\xfe\xb0\x4f\x99\x58\xda\x9c\x65\xc8\x81\x7d\x88\xa3\x0b\xdf\xa3\x84\x0d\x62\x3f\x4c\x3a\x4b\x2c\x19\x07\x52\x59\x4a\xca\x51\x18\x8c\xc9\x7f\x81\xfa\x97\x0d\x07\x7c\x62\xb8\xd4\xe2\x84\x9e\x5e\x66\x1c\x48\x12\xf1\x96\x00\x8e\x1f\x62\x5d\xbe\xd0\x9d\xb3\x68\x98\x90\x51\xcf\x49\xc8\x59\x1c\x9d\x53\xa8\x08\x9f\xe3\x68\x48\x46\x34\x06\xbc\x20\x6f\xe2\x9b\x94\xc2\xb5\x31\x3e\xd2\xa7\x8c\x39\x5d\x4a\x46\x7e\x10\x00\x5f\x4a\x62\x7f\x30\x40\xdd\xe5\x20\x8e\xbc\xa1\x30\x51\xe0\x0c\x2c\x31\x6b\x72\x50\x50\x29\xa6\x5c\xac\xe7\x9d\xa4\x21\x1b\xc6\x94\x04\x51\xd7\x77\x89\x17\x51\x06\x86\x0d\x9e\xdf\xe9\xa0\x78\xa2\xe1\xd5\x10\xe7\x7c\x71\x5d\x38\x81\xef\x39\x09\x45\xfd\xb0\x79\x73\x6e\xe7\x08\x5f\x71\x15\xd8\x6b\xe6\xc4\x62\xe3\x64\x57\xa3\xe1\x45\x6d\x6f\x7f\x6b\xfb\x64\x7b\xef\x17\xdc\xfb\x74\x43\xc2\xc3\xe5\xed\x1b\x99\x93\x8e\xd9\xc4\x5c\x65\x24\x4b\xbc\xa8\xd6\xd2\xa5\x90\x2c\x35\x66\xc5\xb2\x82\xe8\x64\x94\x67\x2a\x5c\xcb\xc9\x2d\x99\x3e\xba\x6c\x11\x52\x13\xa0\x1b\x85\x9e\x8f\x73\x80\x5d\xa9\x12\xa7\x4a\xce\xaa\xc4\xad\x12\xaf\x4a\x68\x95\x74\xf2\xc6\x28\x47\xa2\xdc\x2d\x3f\x52\x80\x64\xef\x39\xf6\xa1\x63\xeb\x53\x0e\x16\x47\xb1\x61\x0e\x77\xd7\x0f\xfd\x8e\x4f\x3d\x42\x2f\x5d\x3a\x40\x69\xd4\x75\x87\x71\x4c\xbd\x75\xc2\x39\x09\xa7\x99\x30\x0a\x97\xfa\xb2\xa0\x47\x2f\x08\x0d\x2f\xfc\x38\x0a\x39\x0e\x20\x46\x6e\x89\xb3\x5a\x5e\xb2\xc3\x65\xee\x14\xb2\xf8\x6a\xf0\xb0\xe7\x4e\x40\x7a\x34\x18\x74\x86\x01\x19\x39\x71\xe8\x87\x5d\x56\x53\x48\xb4\x3d\x23\xa2\x0f\xd6\x2e\xe7\xf3\x47\x69\x7c\x1d\xaf\xdb\x85\x76\x42\x8f\x5e\x02\x8f\x2f\x1c\x28\x22\xa6\x16\xd3\x41\xe0\xb8\xb4\x5c\xff\x2f\x56\xef\x56\x6d\xbb\xc1\xb4\x6b\x3e\xde\xfa\x91\x84\xbe\xb8\x78\xbc\x9e\x76\xcd\x26\xda\xa9\x49\x87\xda\x3b\x8a\x74\x7e\xf1\xa3\x00\xd6\x78\x49\x12\xc8\x9c\x2e\xde\x89\xb9\xb8\x78\x18\x7d\x88\x06\xb8\x2d\xd7\xeb\x64\x24\x25\x11\xd7\x89\xa9\x60\x0c\x8a\x84\x4a\x8c\x44\x23\xbe\xdd\x3a\x7d\xf4\x70\x8c\x44\xab\xa6\x3e\x5f\xe6\x50\xd5\x27\x6e\x02\xd7\xb8\xc3\x4d\xda\x55\xca\x2b\x95\x4a\x25\xbd\x47\x3d\x9b\x62\x8f\x82\xed\x28\xd3\x2f\x8d\xf3\x33\x3f\xe9\x3b\x83\x2a\x5a\x93\x58\xfe\xd4\x71\x2e\x4c\x73\xa6\x47\xa2\x34\x79\x4c\x9a\xc2\x9d\x9e\x6d\xca\x64\x14\x58\x16\x05\xb4\xed\x93\x91\xb9\x5a\xb1\x4c\x58\xe0\x8f\x58\xbe\xd9\x9d\xf8\xf9\x9d\x76\xe2\x7a\x9d\x34\x9f\xd7\x9a\xb5\xe5\x5a\x73\x95\xd4\x49\x73\xad\xb6\x5c\x5b\xe1\xbf\x2d\x19\xb8\x02\x5c\xf4\x9f\xfc\xa3\x28\x9e\xd6\xca\x73\x61\xf6\xca\x31\xf2\x72\xd8\x7d\x57\x5c\xb6\xf9\x64\x85\xb3\x8c\x0c\xd6\x8d\x26\xad\x30\x4e\xa2\x0f\x26\xf2\xff\x89\x69\x55\xb3\xb5\x4a\x1e\x7a\x9e\x37\x66\x26\x82\xab\x1c\x68\xcd\x7b\x14\x7b\xe6\xe6\xf2\xcd\x60\x15\x98\xf9\x93\x13\xca\x76\x01\xf8\x7c\x55\xb2\xdf\xa1\x30\x89\x9b\xbb\x56\x16\xa3\x0f\xa1\xb0\x1e\x4c\xad\x1f\x4c\xad\x67\x31\xb5\x06\xaa\xf9\x34\x04\x74\xe5\x72\xaa\xe5\x66\x4e\xe1\x65\x5e\x1a\xee\x15\xa2\xc1\x27\x2c\xbb\x85\xea\xdd\xb2\x51\x4a\x55\x0c\xfc\xf0\x7c\x42\x1b\xcb\x4f\x96\x33\x45\x27\xb5\x20\xcb\xa8\x4a\x07\x5c\xdc\x9f\xd0\x00\x72\x5b\xbb\xe8\xa4\x06\x54\x21\xcd\x60\x98\xeb\x0c\x8a\xc0\xaf\x3e\x7d\x9e\x2a\x38\x09\x38\x96\xa8\xac\xdb\x26\xd4\x79\x45\xa3\xb3\x6f\x9c\x8e\xc4\x2c\x46\x67\xdf\xc8\xe3\xc7\xfc\x4f\x4d\x73\x45\xf2\x02\xd2\x5b\xe4\x8a\x94\x84\x82\xbd\xd4\x82\xa4\xeb\x94\x95\xf6\xdf\xce\x64\x5e\x1d\x62\xc3\xc4\xf1\x43\x46\xe2\x61\x40\x19\x41\x8d\x3c\x43\x79\x34\x08\xa2\x11\x23\x78\x71\x51\x8f\x69\x3f\xba\xf0\xc3\x2e\xa1\x09\x1c\x68\xc9\x0e\xe3\xa2\xaf\x07\x2c\x8b\xd6\xba\x35\x72\x36\x26\xa7\x30\x75\x07\x3d\x4a\x93\x53\x12\xc5\xe4\x74\x53\x8a\xe3\x4e\xc0\x27\xf4\x14\x8f\x44\x7c\xaa\xf8\xe7\x7b\x9f\x25\x69\x6e\x39\x87\xe6\x1b\xfb\xb1\xdf\xf5\xb9\x28\x0c\x67\x49\xd9\xb1\x9a\x69\x38\x2c\x21\x94\x23\x10\xc9\xd9\x64\x13\x62\x59\x5a\x5a\x11\x83\x7b\x63\x2e\xed\xe0\x3e\xab\x92\x62\x67\x94\x4e\xf2\x85\xe4\x7c\x74\x6c\xd6\x15\xad\x92\x0d\x22\x7e\x19\x35\xa0\x07\xd4\xc8\x93\x29\xca\x94\x58\x84\xea\x58\x20\x9b\xb0\x5e\x01\xe1\x31\xed\xfa\x2c\xa1\x31\xcc\x45\x0d\xb2\xb1\xcc\x17\x7e\x02\xe5\xf3\x8a\x26\xc4\xc4\x81\x88\x42\x80\x6b\x02\xc8\x26\x23\x87\x89\x4c\xea\xe1\x19\xc3\x8f\x59\x42\x12\xbf\x2f\x00\xd5\xe7\x04\x62\x3f\x33\xb4\x1f\x12\xc7\x58\x37\x8a\x63\xea\x26\x72\xfa\x63\x8f\xc6\x35\x51\xf2\x13\x24\x61\xa7\xe2\x31\xcc\xb3\xe3\xf2\xb3\x28\x9f\xe9\x5a\x97\x26\xe5\x0a\xe9\xd3\xa4\x17\x79\x35\xac\xb0\x93\x70\x71\x13\xc9\x89\xf7\x81\x71\x91\x9f\x03\x56\x23\x43\x6b\x25\x38\x0a\xf0\x01\x9f\x8d\x09\xa3\x01\xe8\x2d\x6a\x73\x19\x03\x6b\x39\x63\x29\x1b\x6b\xc7\xf3\x0a\x0c\xac\x1d\xcf\x83\x78\x3b\x7c\x17\x71\x83\x2a\x49\xd1\x85\x70\x9a\xae\xe7\xcd\x9c\x46\xdb\x99\x79\xcc\xcf\x6c\x1b\xaa\x6c\x0d\x53\xcc\x32\x0c\xd0\x6e\x14\x81\x04\xb3\xc4\x37\x90\x04\x54\xfe\x37\x66\xb5\x81\x26\xf7\x34\x36\x8b\xc8\x34\xb3\x5c\x97\x86\x34\x96\x28\x91\xbe\xdc\x65\x85\x4c\xa6\xf6\xb6\xae\x47\xa9\x3d\x53\xdb\x3e\xbc\x29\x6b\x59\xc4\xaa\x5b\xc5\xd1\xb6\x48\x7a\xd4\x30\xc4\x16\x49\x8d\xf4\x1b\x63\x2d\x62\x8d\x4e\x8e\xa3\x45\xb2\x23\xca\x74\xb9\x95\x4d\x92\x47\x48\x3d\x83\x56\x10\x93\x47\x0a\xe5\x82\x76\x38\x5f\x36\x47\x82\x41\x8e\xcc\xc3\x6a\xa6\xc6\x06\x29\xd5\xf8\x99\xbc\xdc\xa8\xaa\x4d\xe3\x48\xb1\x70\xe9\xfd\xdc\x86\x97\xf1\x40\x2f\xf9\x85\x08\xaa\xb4\x01\x64\x67\x05\x91\x89\x71\x53\x84\x56\x8c\xed\xdb\x6a\x29\x8f\x62\xed\x48\x34\xc6\xd4\xe7\xc4\x74\xc9\x45\x07\x34\x6c\x6c\x1e\xc6\xc6\x6b\x36\x9e\xe7\xd7\x1d\x74\xc6\xa9\x19\x29\xc7\x70\xbe\x80\x99\x37\x62\x7d\x00\x9f\x9a\x1e\xa7\xda\xd5\x7b\x01\x2a\x05\x97\x10\xad\x99\xc5\x0d\x74\x48\x6e\x2c\x87\x2d\xbe\x4d\x65\x8e\x74\xfa\x0f\x59\x32\x10\x40\xcb\xae\xb1\x6e\xb6\x8c\x05\xd9\x00\xa2\x77\xc1\x47\x15\x1e\x1d\x0b\x19\x44\x8c\x16\x05\x01\x9e\x68\x29\x2c\x8c\xa8\x4b\xaf\x69\x42\x1c\xcd\xbe\x91\xef\x66\x22\x3d\x74\x69\x52\xc0\xc1\x38\x53\xe5\xf4\x90\x79\x23\x22\x77\x2b\x24\xb5\xa2\xe6\xb7\x68\x40\xf9\x5e\x72\x63\x0f\x60\x33\xa7\x85\xef\x54\x78\x26\x4c\x82\xa9\x02\xf4\x59\x6d\x18\x5a\x53\x54\x29\xc6\xa1\x4e\xd9\xef\x60\xd9\x2a\x69\x56\x26\xa1\x0d\xa7\x31\xea\x4c\xd1\x7b\x01\xb7\xa0\xfb\x56\xab\xb9\x78\xc4\x9e\x5a\xe5\x8a\x7a\xf6\x69\x18\x92\xd3\x88\x1f\x1a\xf9\xc6\xc7\xd7\x4f\xb9\x72\x4a\x06\xc1\xb0\xcb\x37\xb9\x28\x24\xf4\x82\xc6\xe3\x1b\x7b\x2c\x94\xb8\x05\x3d\x16\xb9\xa9\xe8\x1e\xb2\x11\x7b\x9f\xe2\xfb\x48\x4d\x64\x49\xf4\xe3\x25\x9d\x34\x0c\x76\x83\x28\xa4\x04\x2c\xa3\xc9\x19\x75\x9d\x21\x06\x8a\x19\x51\xd2\x8f\x3c\xbf\x33\x16\x0a\x6e\x8e\x6d\x16\xf5\xe9\xa8\x47\x63\x8a\x5a\x45\x6f\x18\x73\x01\xcf\x21\x41\x14\x0d\x34\xec\x11\x25\x34\xf4\xc8\x70\x80\x16\x03\x30\xe0\x9e\x13\x7b\x4b\x49\xb4\x94\xc4\x8e\x7b\xbe\xe4\x45\xa3\x90\x30\xdf\xa3\x84\x76\x3a\x5c\x7e\xac\xcd\xe5\x50\x06\xc6\xce\xd3\xf7\xa3\x62\x14\x35\x0b\xbd\x55\x39\xee\xe2\x29\x91\x52\x92\x23\xb9\x1c\x39\xe5\x4b\xe3\x14\x44\x8a\x53\xc9\xb4\x4f\x49\xdf\x19\xb0\xc9\x8b\x00\x01\x15\x2e\x83\x02\x6e\x64\xaf\x09\xbe\x28\x61\xfa\x85\xce\x40\xb3\x07\x64\xcf\xb7\xe7\xc4\x36\x58\xc9\x5e\xd3\xb0\x11\xba\xd1\x2b\x6b\xc7\x32\x7b\xe4\x6a\xe9\x40\x72\xdd\x7c\xcc\x7e\x56\xcb\x7b\x8a\x45\xa8\x79\x41\x01\xfe\xd2\xcc\x42\x8d\xd0\x43\x2e\x95\xc5\xde\xdd\xd0\x96\x0b\x56\x61\x6f\x3d\xb7\x5c\x06\x5d\x37\xa2\x68\xe0\xc9\x98\x7a\xe6\xe5\xca\x90\x32\x5c\x1c\x0e\x1c\xc8\x3c\x27\x71\x26\xe2\x0e\xa0\x14\xe1\x0d\x32\xa5\x58\xe0\x24\x4e\xbe\xfc\xba\x3c\x49\x80\x55\xac\x43\x95\x36\xf9\xc6\x24\x39\x76\x19\x05\x59\x4b\xc2\x10\x0f\x76\x75\x28\x4b\x7c\xb0\x62\xc5\x55\xd3\x8b\x19\x51\x54\xe6\x3d\xaf\xaa\xd8\x3b\xb8\xab\xe5\x48\x10\xc0\x96\x33\xe2\x80\x56\x83\xa9\x4b\x0b\xf1\xf3\xa7\xec\xce\x2e\xb2\xf0\x8e\xba\xb0\x3f\x88\x4f\x5d\x59\x44\x93\x4b\x77\xa9\x68\xe2\xdf\xfb\xe1\xb9\x38\x61\x81\x76\x0b\xcf\x4b\x30\xe7\x9b\x07\x07\xf2\xa8\x32\x69\xd2\x03\x3f\x3c\x2f\x98\x72\x9e\x55\x76\x91\x01\xa6\x8e\x2b\x78\x42\xb5\x76\x00\xe8\x70\x4d\x9c\xf6\x62\x8e\xdd\xcf\x21\x8a\x5b\xde\x3b\x3a\x66\xbb\xce\xc0\xd8\x7e\xb5\xf8\x92\xa7\x5a\x94\x6d\xa6\x6f\xfa\x25\x16\x41\xfc\xc4\x32\x9c\x91\x88\xd2\x47\xbe\xb1\x9c\x80\x26\xcf\xe9\xf8\xe6\x5e\xbe\xa3\x63\x39\xc8\x54\xd4\x3e\xbe\x5c\x39\x8c\xe3\x8a\x04\xa5\x52\xec\x86\x84\x3c\xad\xd6\x78\xaa\x88\x64\x1c\x15\x94\x41\x95\x32\xcb\x92\x42\x05\x3b\x4f\x75\xa4\x68\xde\x37\xa3\xf0\x82\xc6\xf2\x7c\x9c\x44\xc4\xe1\xf3\x4d\x70\x05\x4c\x9a\xee\x24\x42\xab\xa9\x82\x29\x97\xd9\x69\xe5\x05\x8e\x93\x25\x20\x4e\x97\xcc\x2b\x3c\xb9\x52\xb3\x58\xb6\xc4\x63\x3e\x68\x30\xa6\xe1\xa5\x5f\xe0\x5f\x55\x1c\x32\x5b\xd2\x0e\xe7\xde\x16\x5b\x7a\x6a\xcc\x05\xb6\x9e\x26\x26\xb1\x8f\xd5\x32\x18\x30\xc2\xff\xd5\xeb\x64\x2f\x52\x12\x8d\xd4\x7a\x84\x84\xf6\x07\x89\x25\x6d\xc9\x33\x90\x8b\x3e\x01\x1e\xf1\x01\x56\x40\x0b\xe1\x87\x43\x6a\x40\x44\x45\x6e\x5c\x01\xd4\x2e\x6e\x90\xd2\xbf\xc3\x92\xee\x9a\x48\x74\x19\xcb\xb0\x22\x21\x38\xb2\x24\x2e\x7c\xa3\x2d\x57\xff\xfa\x1c\xaa\x76\xc5\xfd\x89\x41\x75\x64\xc3\x28\x94\xba\xd1\x59\xfe\x1b\xdf\xe8\x2c\x17\xa9\x5c\xd3\x05\x57\x26\x69\x5c\x05\x2c\x55\xc7\x7e\x7d\x5f\xd0\xc4\xb3\x82\xe2\x93\x74\xbb\x76\x49\xdb\xa1\x89\xd2\x07\x16\x8d\xe9\x79\x41\xf9\x49\x43\x4b\x41\xae\xe4\xdc\x06\x15\x35\xd7\x6c\xe4\x95\x9e\xd8\x98\x01\x54\xd5\x2d\x74\x82\x50\xd8\x6e\xf3\xe6\xba\x93\x7a\x51\xdc\xa0\x82\x2b\x5d\x3f\x14\x76\x21\x5b\x74\x52\x8b\x0a\x9c\xaa\x05\xfe\x0e\x26\xf8\xb2\x32\x4a\x4d\x22\x17\x28\xa0\x8a\x8f\x62\x67\xb0\x65\x79\x4a\xc8\x03\xff\x74\xb5\xa8\xc2\xa4\x96\x52\x45\x53\x33\xbf\x3b\xf4\x0f\x7b\xb4\xb0\xc9\xa6\x71\xbf\x61\x57\xb8\xf9\x1e\x48\x96\x54\x00\x12\xfe\xc5\xf9\x10\x0d\x51\xf9\x98\xdb\xe0\x72\x7e\xf9\x49\xed\x59\x05\xef\xff\x7a\x45\xb0\x52\xf3\x72\xa5\x5e\x27\x64\x44\x9d\x73\xf8\xd5\x09\xa2\x11\x61\x4e\xe8\x27\x63\xe2\xf2\xc5\x48\xca\x5b\xfb\x64\x6f\xff\x90\x6c\x6d\xbf\xdf\x3e\xdc\xae\x28\x03\x60\x5e\x12\xec\x7e\x93\x78\x5c\xff\x5f\x8d\xb7\x5f\xbf\x8c\xb6\xba\xcf\xbb\x87\xdd\xf7\xdd\x97\xed\xb7\x1f\xdf\x7d\xdd\xde\xdd\x7a\xfd\xec\x65\xff\xf3\xce\xb7\xae\xeb\x07\x1f\x57\x46\xaf\x57\xdb\xd1\xe7\x83\x2f\xfb\xaf\xdb\x87\x7f\x6c\x1e\x76\x5f\x3f\x5b\x7d\xd9\xfb\xf5\xa0\xbd\x3f\x3e\x58\xeb\xbe\xfc\xfc\xfa\xb0\xfd\x7e\xed\x92\x0d\xdb\xe7\xbf\x7e\x1c\x8d\xd7\xf6\x3f\xbe\x19\xac\xb9\xed\xf7\x07\xbf\x37\x9f\x7c\xfb\x6d\xf8\xcb\xc8\x73\xdd\x28\xee\xbe\x5c\xf9\xba\xd5\x6e\x7f\x59\xfa\xdc\xe8\xbd\xdc\x6d\x6f\x77\xdf\x9c\x2f\xaf\xbd\x6d\xb7\x9f\xff\xfe\xa5\xfd\x6e\xcd\xdd\x1d\x6d\xbe\x1a\xef\x86\x7f\x1c\x2c\xb3\xf6\x9b\x6e\xfb\xd5\x9b\xad\x76\xfb\xb7\x51\x7b\xf8\xaa\xbf\xdd\xfe\xd0\x6d\xbf\x73\x83\xe6\xf2\x61\xf0\x9c\xbe\x7e\xe5\xef\xbb\xed\xf1\xe2\xc7\xcf\xbf\x75\x9b\xdf\x76\xe3\xb7\xaf\xfc\xa7\xed\xcd\xdd\xf6\xbb\xf1\xc7\xdd\xfd\x57\xdb\xed\xdd\x6f\xbd\x91\xbf\xf9\x6d\xb5\xfb\x72\x30\x6e\x6f\x0f\xd8\xf3\xb7\x6b\xcf\xa2\xc3\xcd\x9d\xf1\x07\xff\xcb\xfe\xa7\x46\xa3\xfd\x92\x7d\x3e\xd8\xf5\x57\xdb\x6f\x3e\xb7\xfd\xe6\xbb\xd5\x57\x97\x3d\xda\x7e\xb9\xbb\xb6\xf6\xfa\xbc\xbd\xdf\xfb\x63\x78\xf8\xee\xcd\x97\xf1\x07\xe7\xcb\x17\x7f\x73\x3c\xdc\xfe\xdd\x19\x46\x07\x97\xcd\x77\x3b\xc3\x2d\xe7\x63\xf4\xe9\xdd\x93\x37\xcd\xf7\x5d\xff\xf5\x1b\x37\xfa\xb0\xbc\xf9\xf2\x8f\xf1\xb3\xd7\x5f\x87\x7f\xbc\xfc\xad\xdf\x3e\xff\x65\xf9\xeb\xeb\xd7\x51\xef\x5d\xb3\xdb\xbe\xd8\x1d\xed\xfc\xb2\xb5\xf3\xad\xfd\x79\x3f\xf1\x2e\x36\xcf\xdf\xbd\x5d\xfb\xb0\xfd\xee\x5d\xd0\x6b\x1f\x3e\xf1\x83\x8b\xf3\x5e\xe7\xe2\xd9\xab\xf3\xe4\xfd\xf0\x53\xaf\x1d\x05\xaf\x06\xaf\x3f\x8f\x9b\x1f\xa2\x60\xf7\xeb\x1f\xbb\x49\xfc\xa6\xdd\x7e\xf7\xfb\xa7\x57\xed\xb6\x3b\xfe\xb8\xb6\xd9\xdf\xfd\xa3\xdf\xde\x7e\xf5\x0b\x5b\x6b\xb2\xe7\x09\xfb\xf8\xf5\x03\x5b\x3c\xf7\xfc\x81\x37\x4e\x7e\x71\x2e\x5e\xbe\xf6\x47\x9f\xdf\x6f\x0f\xf7\x57\x3f\xbe\xfc\xe5\xd7\xbe\xfb\xee\xdb\xef\xcf\x3f\x3a\xd1\x07\xaf\xff\xe6\xa0\xf1\x7e\xb5\xf1\xeb\xcb\xfd\xcf\xdd\xbd\xf3\xad\xc5\x8b\xf6\x76\x67\x75\xff\x37\x6f\xbb\xff\x6e\xd8\xfb\xb8\xf5\x61\xb7\xff\x32\xe9\x7c\xe8\xad\x6e\x8d\xde\x9c\x7d\xdc\x79\xd3\x1e\xbd\x7b\xb7\xba\xdb\x5e\x6a\xb7\xb7\xce\x5e\x5f\x36\xbf\xb6\xf7\x9a\xab\xaf\x46\xdd\xa7\xe1\xda\xe0\x5b\x97\x7d\x6d\xb3\xf0\x63\xf8\x5b\xb0\xdd\xf8\xd8\xde\x79\x3a\xfc\xfa\x72\x7b\xff\x6b\xff\xd7\xb3\xf3\xaf\xef\x97\x2f\x97\xdf\x5d\xf4\x46\xaf\x5e\xee\x74\x37\x77\xa3\xee\xef\x07\x3b\xed\xc3\xf7\xdf\x56\x2f\x0e\x7e\xd9\x1d\xbf\x7c\x12\x7c\xf9\xf2\xf4\x70\x87\xed\xf5\xbf\xae\x7e\xf8\xed\xcd\xe6\xea\xca\xfb\x8f\xbd\x37\xed\xf6\xf6\xdb\x83\xf6\xd6\x97\xf3\x97\xdf\xde\x47\x3b\x7f\x9c\xfb\x8b\x5b\xdd\xf6\xcb\x67\x9b\x6f\xb7\x3f\x6e\x5d\x3c\x5f\xea\x7e\x7c\x99\x7c\x1b\x7d\x7a\x7b\x31\x7e\xbf\xd4\x0b\xdf\xee\xfd\xb6\xff\xe9\xc9\xce\xe8\x77\xfa\xe1\x70\xb3\x11\x85\x2f\x7f\x75\x2f\x0f\x0e\x5f\x1f\xee\xb6\x3f\xbf\xdd\xfd\xba\xd6\x6f\xb7\x97\xde\x6f\x1f\x3c\x89\xde\x0d\xb7\xb7\xe2\x41\x63\xff\xdb\xeb\x77\x8b\xd1\xeb\xf7\xfe\xd0\x59\x7b\xf6\xb6\xe1\xbd\xdd\x7f\xb7\xda\x68\xd3\x57\xab\xbb\xed\xc5\x37\xab\x4f\xdf\x7d\x63\xed\xf8\xe9\xc5\xdb\x67\xfd\x4d\xba\xb7\x7a\xe1\xc7\xaf\x46\x83\x6e\xf4\x6a\xf5\x60\xeb\xcd\xab\x6d\xf6\xa9\xfd\x65\x71\x74\xf9\xf6\xdd\xc1\xef\x1f\x5f\x85\xa3\x8b\x83\xb5\xdd\x27\x2f\x3f\x35\xdc\x91\xfb\xaa\xff\xfa\xe5\xc1\xab\x8f\x07\x3d\xf7\x65\x37\x66\x4f\x9f\x7c\x6a\x9f\xef\xbe\x1a\x6d\x35\x9c\x43\xf7\xb7\xf3\x8b\x37\x8d\x83\xdd\xaf\x97\xec\xd7\xf6\xce\xef\x7f\xbc\x3a\xf8\xad\xb7\xfb\xdb\xbb\xc6\xe0\x6c\xa7\xeb\x46\xef\xba\x83\xce\xd6\x3b\x67\x77\x65\xad\xf3\xfa\xe0\x8f\xf1\xc5\xee\xa7\xb5\xf3\x2f\x74\xb0\x17\x75\xe3\xc5\xfd\xed\xf6\xe7\xcb\xdf\x46\x9b\xce\xd7\xc8\x1f\xfa\x7e\xe3\xfd\xd6\xeb\xc1\xb7\x3f\xce\xc3\x67\xed\x1d\xf7\x60\x73\x35\xa4\x87\x9b\x6f\xc7\xfe\xfe\xda\xc1\xfb\xd5\x1d\xba\xd8\x7e\xce\x0e\x7a\x3b\x6f\x0f\x0e\x9c\xf3\xa5\x9d\x57\x5f\xce\xb7\x9d\xc5\xcb\xb7\xdb\xc3\xdd\xdf\x76\x3e\x87\xab\x17\x5b\x9f\xcf\x3e\xbd\x7a\x19\x7d\xfc\xda\x5e\x0b\x68\x34\x7a\x3a\x7c\x33\xee\xc6\x9b\xc9\x6e\xff\xfc\x7d\x3c\xe8\x8f\xc7\x21\x1b\xfd\xf2\x6a\x7f\xed\xe3\xf9\x47\xb7\xb7\xfb\x32\xdc\xfb\xdd\xdd\x7c\x72\xf1\x7b\x2f\x7e\x1d\x36\x07\xbf\x5f\xbc\x74\x06\x6f\x3f\x6c\x3e\x3b\x1b\x75\xde\xff\xb6\x3d\xda\x3f\x18\x3d\xed\xd3\x4f\xee\xf9\xce\xe2\x81\xfb\xee\xf3\xcb\xdf\x0e\x46\x1f\xcf\x76\xdb\x07\xbf\x8d\xde\xf8\x83\xb7\x8d\xc0\x71\x9b\xbb\x1f\x9f\x8c\xbe\x74\xfc\xfd\xc3\x37\x17\x3b\xe7\x9b\x4f\x29\xdb\xef\x0c\x46\xed\xd7\xbf\xbe\x7c\x19\x36\x0f\x36\x7b\xdf\xda\xab\xce\xa7\xc1\x60\xf7\xec\xb7\xe1\x9a\xff\xdb\xce\x66\xbf\xd3\xeb\xef\xf7\xfb\x67\xbf\x85\xfd\xd1\x2f\xaf\xce\xbb\x83\xb3\xe0\xbc\x1b\x9c\x8d\xbf\x7d\xb9\x5c\x69\xb2\xdf\x9e\x6d\xed\xb1\xd1\xd9\x6f\xa3\x97\xcb\x7f\x6c\x79\x71\xb2\xf8\xb6\xdd\x06\xa6\x7b\xe6\x9c\xd1\xe0\x03\x1c\x60\x5f\x05\xd1\x08\x9c\x17\x7f\x90\x4e\x7a\xe0\xc9\x1c\x17\x70\x4e\xde\xf8\xdd\x1e\x8d\xf7\x63\x8f\xc6\xca\xef\x4f\xe1\x8e\xfb\xa4\x52\xbb\x0b\xd8\xef\xdf\x0b\x3c\x2b\xd6\x9c\x70\x2c\xf6\x0a\xc1\xa2\xe5\x56\xa6\xae\x2a\x4c\xed\xf6\x96\x51\x46\xe8\x3b\xb9\x64\x6e\x56\x95\x07\x0b\x1d\x01\x5f\x65\xa9\xdb\xd3\x54\x53\xc6\xfd\x8a\xda\x1a\xe5\x9b\xc1\x4a\x19\xce\x78\xb9\xd0\xae\xe7\x6e\x83\xef\x9d\x90\x8b\xd6\xd4\xb3\x82\x2d\x72\x40\xad\x22\xdc\x88\x4b\x6b\x9f\x89\xad\xcf\x13\xf6\x61\x75\x65\x31\x0d\xfe\x30\x60\x14\x58\x16\x2f\xeb\xd5\xfb\x27\x78\x5a\x41\x89\x1f\x0e\x86\x09\x71\xe5\x6c\xd4\xa0\xd7\x23\x3f\xe9\x49\x04\x28\x14\xab\xc4\xb2\x65\xad\x66\x5a\xcf\x58\x6e\xba\xf0\x54\xf6\x25\x0f\x54\x19\xbd\x66\xff\x33\x53\x83\x20\xbe\x95\xe8\xa6\x31\xad\xe0\x54\x49\xa6\xb2\x3e\x6e\xca\x06\x54\x69\x78\x50\xc0\xc0\xed\x5a\x42\x2f\x13\xf3\x64\x89\x33\x6b\xcb\xe3\xba\x3d\xbc\xd9\x57\x70\xcc\x13\xa4\x10\x5e\xc0\x17\x1a\x00\x29\x16\x76\xd3\xf0\xf4\x30\x6c\xdf\x61\x00\x26\x75\x18\xc9\x19\x7b\xa5\x82\xa6\x65\x08\x2c\x35\x34\xb3\x8b\xd0\xbd\x1a\x9a\xdb\x6b\x8b\x03\x9d\x33\x0c\xd9\xf0\x8c\xb9\xb1\x7f\x46\x77\x3c\xb2\x21\xfc\x84\x15\x55\x37\x74\x7a\x78\x1f\xc0\x0f\x86\xdf\xbf\x73\x82\xf2\x93\x12\x23\x81\xf3\xc7\x98\x50\x7e\xda\x73\x12\xea\xd5\x8c\xe2\x92\x86\x6d\x51\x4f\x8e\xac\x26\x3c\x1e\x96\xd5\xec\x7c\xff\x9e\x5d\xc9\x0a\xdc\x75\x5a\xb7\x87\xfd\xcc\x1c\xab\xeb\x75\xb2\x7d\x39\x88\xa4\x01\x49\x42\x59\x42\x06\xc3\x98\xa7\xb0\x9a\xba\xc5\x36\x16\x36\x1e\x8f\x72\x69\xed\x48\x0f\x1e\x75\x2f\x6a\xa5\x6c\xf9\xde\x6e\x34\x0c\xe5\x75\x5b\x9e\x22\x26\x53\xd6\xb2\x72\x36\x08\x49\x2a\x5c\x8d\x29\x50\xd7\x62\xf6\x44\x15\x61\x52\x95\x12\xb7\xcb\x88\x50\xd3\xc0\x3a\x31\x19\xa0\x35\xd1\xcb\x35\x46\x93\x03\x3e\xd9\xe5\x2b\x39\x63\xc8\x38\xae\x0d\x65\x1a\xb1\xbe\xae\x25\xd2\xcd\xf8\xdd\x29\x0c\x7d\xf1\x83\xe0\x73\xd8\x9f\x16\x49\x46\xf1\x14\x9e\x40\x51\x9c\xc5\x86\xe1\x49\x32\x3d\xa8\x5c\x1c\x19\xb5\x53\x58\xca\x02\xb7\x07\x3e\xcd\xb0\x2d\xff\x7c\x79\x03\xcd\xf8\xe8\x33\x09\x19\x0f\x94\xaa\xab\x76\x10\x78\xc5\xe9\xaa\xe2\x02\x5c\x28\x46\x34\xc5\x1a\xf3\x26\x17\x6e\x4d\x4c\x61\xd5\x88\xe0\x5f\xc9\x9b\x41\x6d\x7d\x20\x3a\xa3\xc8\x5f\x68\xa5\xca\xe9\xde\x65\x38\xaf\xe6\x6a\x02\xa5\x2a\x74\x79\xc1\x54\x98\xc5\xd6\x53\x20\x6c\x97\x82\x30\xe0\xf4\x71\x58\x0f\xdc\x40\x4d\x49\x6d\x50\xf2\x45\x83\x86\xb9\xe7\x9c\x53\xbe\x7c\x54\x71\x69\xcd\x92\x37\x64\x61\x8a\x2e\x14\x5b\x35\xed\x9c\x79\xa4\x4b\xa5\x14\x6d\x2b\x77\x52\xb4\x81\x8e\x33\x8a\x8a\x24\x2c\xb0\x3e\xe7\xd0\xc9\xcb\xa1\x1f\x24\x4b\xbe\xb8\x17\x22\xb1\xf4\x28\xcb\x6a\xd2\xf4\x0d\x1f\xe1\x91\x0d\x80\x57\xc3\xaf\x3c\x73\x74\x95\x93\x1a\xc8\xc4\x30\xca\x7f\x95\xc6\x70\xc7\x8d\xc2\x02\xdc\xac\xad\x81\x01\xe8\x0d\x0d\x29\x6d\x29\xb6\x62\xbe\x6b\x90\xce\x1d\xba\x34\x49\x19\x4b\xa4\x84\xc5\x22\xe5\x04\xef\x5c\x45\x12\x89\x78\x0d\xf2\xe7\xe8\x28\xac\x89\x9b\xe8\x12\xfe\xc7\x4f\x5c\x76\xea\xea\x75\xe3\x15\xe3\x72\xa3\xf9\x14\xde\xcd\x75\xa3\x25\x9a\xf4\x68\x4c\x87\x7d\xd2\x1e\x26\xbd\x28\x66\x73\xe0\x51\xcb\x67\xe2\xe1\x21\x23\x03\x27\x4e\xe4\x33\x60\xb3\x7c\xe0\x9f\xc5\x4e\x3c\xae\xcd\xd5\xeb\x73\xc2\x0b\x57\x4e\x36\x87\xd0\xf9\xff\xd9\x7b\xf7\xee\xb6\x71\x5d\x51\xfc\xef\xc9\xa7\x40\x7b\xce\xa9\xa5\x46\x76\x6c\xa7\x4f\x67\xd2\xec\xb4\xcd\xcc\xce\xd9\x7d\xad\x26\x33\x73\xf7\xc9\x2f\xcb\x95\x2d\x3a\x56\x23\x4b\xde\x92\x9c\xd8\xd3\xe6\xbb\xff\x16\x01\x3e\xf5\x70\x1c\x27\xed\x9e\x73\x6f\x3b\x6b\x4d\x2c\x3e\x40\x10\x04\x41\x90\x04\x81\x94\x31\xc8\x92\x51\x7e\xe9\xa7\xac\x87\xaf\xf9\x86\x3e\x97\xc0\x41\xc8\x3b\x39\x98\xe5\x0c\xc2\x1c\xfc\x38\xd8\x4a\x52\x61\xbb\xc0\x41\x86\xb9\xf1\x56\x32\x67\xe9\x24\x93\x78\xfc\xfa\xee\x37\x78\xc3\xb2\x8c\xa5\xf0\x2b\x5a\x30\x45\xf0\x61\x36\x88\xc2\x21\xbc\x11\xcf\x29\xfd\x0c\xa6\x3c\x25\x1b\xa3\x25\x22\x07\xc7\x2b\xfe\xc2\x51\x39\x12\xa8\xc0\x2f\xc9\x2c\x0e\x7c\x7a\x8c\x26\x3c\x1a\x0b\x4f\x03\xb0\x2d\x9b\x12\x00\x3d\x48\x52\x0e\xc4\xa1\xe7\x88\xa9\x30\x31\x72\xf1\x91\x74\xe4\xe7\xba\xea\x0a\x04\xd1\xfd\x56\xae\x09\xc7\xc9\x94\xef\x0f\xfc\x9c\xf7\x5a\x3e\x5e\x9c\x65\x6c\x34\x8b\x3c\x0e\x6d\x30\xcb\xe1\x8f\xc3\xe3\xbf\xbf\xff\xed\x18\xf6\xdf\xfd\x13\xfe\xd8\xff\xf8\x71\xff\xdd\xf1\x3f\x77\x50\x0c\x26\xb3\x1c\xd8\x85\xf0\xc0\x17\x4e\xa6\x51\xc8\x02\xb8\xf4\xd3\xd4\x8f\xf3\x05\x24\x23\x0e\xe1\xed\xc1\xc7\x57\x7f\xdf\x7f\x77\xbc\xff\xf2\xf0\xcd\xe1\xf1\x3f\x21\x49\xe1\x97\xc3\xe3\x77\x07\x47\x47\xf0\xcb\xfb\x8f\xb0\x0f\x1f\xf6\x3f\x1e\x1f\xbe\xfa\xed\xcd\xfe\x47\xf8\xf0\xdb\xc7\x0f\xef\x8f\x0e\x5a\x70\xc4\x70\xd7\xc2\xeb\x5f\x4f\xf3\x11\x8e\x5e\xca\x80\xde\xd6\x67\x92\x12\xff\x4c\x66\xe2\xc9\x37\x8c\xfd\x0b\x2e\x28\x87\x2c\xbc\x60\x01\xf8\x30\x4c\xa6\x8b\x95\x07\x95\xc3\xf2\xa3\x24\x3e\xa3\xdb\xd8\x3a\x86\x84\xc3\x11\xc4\x49\xee\x41\xc6\x18\xfc\x3c\xce\xf3\x69\x6f\x6b\xeb\xf2\xf2\xb2\x75\x16\xcf\xf0\x38\x50\x3c\xb9\xcd\xb6\x5e\xb4\x70\x8b\x16\x66\xef\x66\x51\xf4\x3e\xfd\x4d\x59\x95\x91\x18\xc8\xc8\x21\x74\x28\x78\x3f\xe4\x04\xc6\x47\x64\x03\x9a\x19\x25\x8f\x1a\xb4\x5d\x2b\x83\xdb\x95\x53\xbe\x55\x95\xa7\xed\x99\x8a\x99\x8e\x6c\xad\x20\xfc\x14\x12\xa6\xbf\x10\x71\x77\x6f\xe5\x35\xb4\xb3\x0f\x5a\x45\x39\x7e\x6f\x0e\xdf\x1e\x1e\x1b\x38\xc9\x6f\x6a\x62\xc2\x26\x49\xba\xe8\x41\xb7\xdd\xf6\xb8\xee\xfe\xd6\x9f\x87\x93\xd9\x44\xf8\x70\xe4\x63\x45\x25\xc8\xc5\x66\xe6\x4f\xa6\x11\x13\xc6\x37\x79\xea\x8f\x46\xe1\x70\x59\x5d\x51\xa4\xa2\x72\x94\x9c\x61\xc5\xea\x7a\x51\x72\x96\xb5\x78\x0f\xc4\xc4\xca\xc2\x80\x0d\xfc\x14\x26\x2c\x9e\xa1\x35\x10\x1f\x21\x7c\xb7\x8b\xba\x4c\x9c\x03\x9f\xdf\xca\x4e\x7a\xe0\xf3\xed\x47\x82\xf3\x23\x63\x20\xbc\x78\x65\x34\x5e\xc7\xfb\xbf\x1e\x19\xe4\x10\x9f\xe5\xb7\x90\x58\xd6\xda\x80\x8d\x13\xae\xe4\x7d\x81\x3c\xcc\xf9\xe2\x75\xff\xef\xc9\x84\xdd\x27\x1f\x3f\xf4\x6f\x38\x46\x0f\x41\xba\xc4\x2b\x9e\x60\x15\xc9\x53\x3f\xce\x7c\x6c\x2a\x33\x4b\x1e\x1b\xe9\x56\x85\x98\xe5\x97\x49\x7a\x6e\x96\x7d\x47\x49\x56\xb1\x6c\x91\xe5\x6c\x62\x96\x3a\xc2\x14\xab\x10\x27\xab\x59\xe4\x4d\x72\xc6\x1b\x23\x45\x93\xb4\x36\x34\x24\x0f\xe3\x33\xa4\x30\x3e\xbf\xca\x60\x18\xa6\xc3\xd9\x24\xcb\x7d\x74\x43\x47\x0f\xb2\x26\x0c\x86\x7e\xc6\x32\x0f\xb2\x84\xcb\xb0\x30\x33\x1c\x44\x84\x31\x3e\x38\xe7\x42\x3e\xca\x12\x3a\xfa\xc0\x15\xaa\x25\xdb\xc0\x25\xe7\xd2\x27\x9b\xb5\x49\x98\xe5\x8b\x29\x6f\x94\xaf\x3f\x29\x97\x6c\x6a\x27\x5b\x7c\x0a\x76\x6c\x6a\xf0\xc7\xf8\x82\xeb\xa4\x11\x06\x78\x13\x7b\xce\x16\xfa\x2a\x57\xcd\x9e\x63\x79\x7b\xcb\xa1\xbc\xde\x3f\xde\xef\xff\xe3\xe0\x9f\x26\x07\x98\x69\xd5\x6c\xf0\xfa\x1f\xc6\x3e\xfe\xe4\x3e\xcd\x88\xfb\x1e\xdc\x17\xfc\xcd\x7f\x72\xda\xde\x3f\x2d\xf8\x3f\x39\x67\x0b\x13\xdf\xd7\xff\x90\x0f\xd0\x34\xaa\x42\x5b\x16\xc8\xbe\xfe\x87\xc4\x96\x13\x89\x4d\xa6\x09\x2e\x22\x4d\xc8\xfd\x73\x46\x3e\x27\xe0\x2d\x5f\x7e\x42\x3f\x6a\xfe\x76\x48\x7d\xfa\xb8\xff\xc7\xc1\xc7\xfe\x1f\x87\xaf\x8f\xff\x6e\x76\xcb\x4e\xee\x3e\x6a\x97\x14\xe7\xa5\x5e\x9f\x7e\x44\xb2\xf9\x11\xc9\xe6\x86\x91\x6c\xf0\x3c\x2f\xf6\x27\x4b\x3a\xda\xbd\x0b\xd8\xb7\xe8\xa8\x0d\x68\x3d\x64\xaa\x82\x0f\xd6\xb1\xed\xb6\x0c\xd9\xf3\xff\xf6\x53\x5a\xbd\x1f\xa3\xe3\xf0\x3f\x48\x8b\x35\x9e\x5b\x26\x83\xcf\xd8\x44\x26\x3b\x44\xd5\x49\xf0\x9a\xe4\x08\x71\xbf\x26\x7b\xc0\x6b\x28\x8b\xef\xd0\x85\x17\xbb\xd0\x36\xec\x84\xc0\xf4\x57\xb6\xbc\x9b\x88\x40\xe8\x9a\x95\x45\x4f\x43\xde\xcf\x64\xf0\x19\x09\x5a\xee\x5e\x4d\x0c\x8f\xa3\x59\x3a\xf2\x87\x4c\x05\xf1\x50\xee\xe4\xcc\x90\x0c\xb7\x75\xec\x6c\x5c\x41\x78\x77\xe1\xa6\xb9\x00\x8f\x77\xe4\x65\x32\xbf\xb5\x6f\xe2\xf5\x20\x98\x9e\x89\xd7\x73\xdf\x6e\x42\xb8\x0b\x1f\xda\x77\x40\x61\xe5\x21\x79\xa8\x1f\x4a\xad\xef\x5a\x7e\x03\xe8\x1d\xe5\x7a\x3e\x48\xc9\x31\x2e\xc7\x65\x1c\x46\x41\xca\x6e\xe1\x36\x7b\x6d\x57\xa6\xb7\x08\x8e\x10\x27\x01\x5b\xcf\x0b\x32\xaf\x79\xea\xf2\x0d\x86\x12\x4c\x62\xba\x3a\xf2\xc5\xfe\x86\xb0\x6b\x14\x94\x91\x0f\xf1\x5b\x32\x41\x6a\xd5\xe4\xcb\x5d\xe6\xe2\x97\xcc\x12\xae\xd6\x65\x1e\x7d\xca\x4c\x31\xb5\x54\xae\xf8\x96\xd9\xe6\xab\x2d\xd1\xb0\x4c\x91\x45\xc8\x19\x93\xcc\xc6\x2f\x99\x95\xf0\x4d\x32\x99\x89\xd7\x88\x5b\x71\x7d\x75\xd2\x90\xfd\x69\xe0\x19\x6e\x90\x8f\xf9\x0f\x42\x95\xff\x12\x68\xa1\xdf\x72\x89\x00\xba\xa5\xe6\xcd\x35\x84\xb9\x24\xae\x3f\x17\x67\xbf\x73\xb1\xb7\xab\x7a\xf6\xf5\x2b\x7c\x91\xb3\x8e\xe8\xa2\x66\x8f\x20\x05\x97\x0b\x6d\x8f\xcf\xed\x36\xed\x3f\xd0\xce\xd5\x5f\xc8\x60\x50\xbb\x37\xd6\x08\x1c\xd7\x69\xa4\x6c\x38\xf6\xd3\x3c\x6b\x66\x34\xa4\x0d\xfb\xc5\x99\xf0\x9b\x93\xe7\xe9\x4a\xe1\x94\xaa\x23\x0d\x9f\x63\x38\x25\xbc\x33\x44\xc7\x60\x78\xaa\xb4\x9f\x8b\x63\x9e\x8c\x02\x2c\xd1\x28\x58\x16\xa5\x37\xd0\x54\x5b\x7e\xe1\x22\x02\xc7\xb6\x91\x5d\x48\xcb\x63\xfd\xfe\xf3\xca\xa3\xfe\xe8\x7b\x11\x43\xb8\x68\x7a\x5a\x2c\x2b\xc7\xc4\xe2\x55\x35\x32\x26\x8b\xf5\xc0\xe2\x2d\xb5\x26\x88\x11\x6f\xcd\x61\x13\x1a\xe8\x08\x49\xa6\x2c\x4a\x29\x34\x4b\x8a\xa9\x85\x19\x41\x07\x6a\x3d\x68\x74\x5a\x9d\x86\xd8\x1d\x09\x67\x37\x82\x49\x37\x00\xc8\x59\xa9\x98\xad\x56\x88\x23\xf5\xfb\x36\xfe\x71\x05\xe0\x92\x87\xdc\xe7\x4b\xdd\xd2\x7d\xef\xbd\x52\x3f\x4b\x87\xfd\xa9\x9f\x8f\x6b\x15\xcf\xa7\xa8\x79\x1a\xc0\x53\x26\x08\xe0\x0c\xc2\x38\x08\xe3\x33\xd7\x26\x85\x56\x9f\x03\xa7\xb2\x3b\xf7\xfd\xfb\xfa\x46\xd3\x31\x4e\xcf\x57\x44\x14\x49\xbc\x83\x1b\xde\xd2\xc5\xc7\x52\x7f\x4a\x77\x43\xdc\x6f\xd5\x7b\x7f\x90\x51\xa7\xee\xb0\xad\xa0\xae\xad\xdc\x8f\xbb\x77\xde\x1a\xab\x69\x6d\x98\xdc\x7d\xcf\xc6\x35\x6d\x4d\xfc\xf9\x9d\xb7\x15\xd6\xb5\x15\xc6\x77\xde\xd6\x79\x4d\x5b\xd9\x37\x68\x2b\xaa\x6b\xeb\x5f\x69\x7e\xe7\x8d\x8d\x6a\x1a\x63\xd3\x2c\x8c\x92\xbb\xef\xdc\xe7\x9a\xf6\xa6\xe1\x9d\x37\x75\x56\xd3\xd4\xd8\x8f\x46\x1f\xee\xbe\xb9\x49\x4d\x73\xb9\x3f\xab\x6d\x2b\x9c\x4c\x66\x39\xdd\x08\xd4\xad\x5b\x03\x5c\xb7\x7c\x3e\x59\xd7\x84\x30\x24\x08\x9c\x55\x71\x8f\xea\x0f\xf8\x6a\xfa\xd6\xcf\xc7\x2d\x2e\xdc\x28\x8d\x4b\x1e\x95\x8a\x62\x08\xd3\x87\x89\x2a\x8b\x18\xd0\xcb\xb6\xb9\x4c\xe3\xd3\x9a\xd2\xc2\x58\xa5\xc9\x76\x32\x9d\xa6\xda\xe6\x3c\xac\x12\x39\x3f\xd3\xb6\x59\x70\x1b\xec\x42\x87\x35\x3b\xa2\xed\x69\x28\x4b\x7e\x38\x94\x2e\xde\xf9\xc8\x71\x55\x20\x84\x2d\x10\xc5\x72\x7f\x06\xbb\xd0\x85\x87\x9c\x87\x8c\x93\x08\x4e\x32\x67\x6e\x59\xd3\xcd\xe1\x05\x74\x60\x0f\xda\xd0\x83\x39\xfc\x0c\x4d\xfe\x31\x0d\xa1\x27\xfa\x4d\x35\x6c\x57\x97\x9c\x6e\x65\x30\xbb\x08\x47\xe0\x83\xc0\x76\x09\x5a\x53\xa5\x11\x48\xaa\x8d\x20\x0b\x6b\xe2\x52\xef\x7b\x77\xb3\x26\xde\x4c\x35\x52\x48\x64\x2c\x0d\x59\xe6\x91\x53\x19\x6d\xeb\x79\xcf\x71\xf8\x08\x51\xae\x38\xa2\x72\x39\x45\x5d\xd7\x78\x0e\x6a\x1f\x6c\x79\xf0\xd9\x83\xac\xed\x41\xd6\x51\x55\x4f\x10\xee\x49\xfb\xf4\xd4\x83\xd8\x83\x09\xcf\xe8\xe8\x23\x2f\xf8\x19\xe2\x1d\xd8\xdc\x0c\xe5\xc9\x7a\xd6\xc6\x12\x55\x30\xd0\x05\xb1\xba\x46\xf8\x4c\x4f\xe0\x3e\xc3\xcf\x30\xe1\x10\x3e\xeb\xb3\xf9\xac\x73\xf2\xf9\xf4\xa4\x73\x0a\x9b\xbb\xe2\x77\x1b\xbd\xa0\x67\xef\xfc\x77\x4e\xd6\xa6\x4c\x17\xf6\x80\x7e\xb7\x4f\xa1\x07\x32\xd9\x78\x3e\x46\xc6\x07\xf6\x40\x76\xda\x4b\x1d\x05\xfe\x05\x46\x52\xef\x76\x4b\xe3\xe7\x41\x22\x1c\x89\xee\xf3\x7d\xba\x13\xe3\x06\xea\x72\x1c\x46\x0c\x9c\x66\x33\x16\xe7\x6d\xc9\x49\xcc\x01\xc7\x86\x41\x6e\xb2\x53\x4d\x8c\xdb\xf9\x39\xa4\x0b\xd7\x5f\xe4\xe4\xab\xf3\x02\x29\xb6\x0d\x61\xf6\x86\x5c\x84\xd4\x9c\x45\xd3\x93\x29\xe9\x30\x6b\xcc\x86\xe7\x19\xe7\xe4\x4f\x78\x57\xf5\x09\xc2\x8c\xbc\x2d\x34\xa3\xf0\x9c\xb5\x60\x5f\x18\xfe\x84\x19\x86\x22\x0e\xe9\xae\x51\x97\xe0\x55\xc3\xbc\x81\x3e\x8f\xe3\x24\x37\x7c\x73\xe1\x95\xe5\x18\xaf\xc1\x08\xb6\xa0\xee\x27\x34\x01\x68\xa0\x8f\xdd\x30\xce\xd9\x19\x4b\xe1\x0c\xf7\x7c\x29\xcf\x89\x21\x49\xd1\x07\xf2\xbf\x66\x7e\x04\x79\x02\x9f\xda\xe4\x0b\x21\x62\x59\x26\x0b\x18\xb9\xef\xe8\x08\xef\xed\xfe\xff\xe9\x1f\xed\xff\x72\xd0\x3f\x7c\x77\x7c\xf0\xeb\xc1\xc7\x4f\xd2\x75\xf2\xdf\xc8\x8b\x1d\xfe\x9c\x30\x5e\xf6\xfd\x08\xfa\x94\x13\xc6\x43\x06\x8f\x5a\xed\x56\x1b\xbf\x65\x8c\x32\x78\xe3\xc7\x67\x98\x32\xf5\x53\x7f\x02\x5f\x1e\x5e\x09\x2a\x1c\x8f\x99\xf8\x95\x27\xf4\x30\x07\x9d\x87\xfd\x4d\xde\xa5\x7f\x19\x24\x49\xc4\xfc\xf8\x0a\x3e\x8a\x94\x4f\x79\x8a\x54\xad\x21\xb0\x47\xbe\x2a\x3e\xe1\x1b\xd6\x4f\x04\x8c\xcd\xf1\xce\x58\xe0\xdf\x6f\x85\x19\xb2\xe1\x9b\xf0\x9c\x39\x27\x1d\x0f\xba\x1e\x6c\xa3\x05\xdd\x43\xd8\xda\x82\xdd\x17\x64\x00\x53\x55\x3a\x48\x86\x78\x2a\xde\x1a\x24\xc1\x42\x1d\xe2\xac\x54\x55\xc4\x8b\x58\xa1\x64\xbf\x15\x27\xc9\xd4\x2c\x4a\x41\x5c\x38\xcb\x1b\xd7\xfe\xba\x42\xd9\xf7\x2b\x91\xf4\x9e\xb8\xe7\x7f\xf0\x40\xf1\xb0\x63\x32\x8e\x8b\x6f\x62\xf5\x44\x10\x80\x76\xaa\x5d\xe1\xea\x06\x2b\xe6\xe3\xed\x5e\xa9\x92\x95\x7d\xc6\xde\xfa\xf9\x70\xcc\xea\xdc\xb2\x3e\xeb\x3c\x17\x33\xd2\x28\x6b\x44\x62\xa9\xac\xd3\x95\x8e\x6c\x65\x50\xb5\xba\x82\x6d\x35\xdb\xb1\x9f\x75\x42\xe1\x99\x28\x36\xbd\xa6\xdd\x6d\x53\x28\x70\x2e\xe7\x38\xa3\x95\x0d\x1e\xc3\xa8\xa0\x83\x9f\xfa\xad\x30\x47\x6f\x4a\x4c\xcf\xb0\x69\x1a\x5e\xf8\x39\x2b\xcc\x98\x13\x1c\x9e\xdd\x7e\x4b\x76\xe5\xb4\x30\x7d\xc4\x5b\xf4\x3c\x41\x49\x20\xa0\x16\xe6\x93\x1c\x6b\x3d\xa1\xd0\xfa\xc7\x28\x6c\x30\x19\xc7\xf9\x50\x64\x99\x5c\xb6\xb5\x05\xaf\xd1\xd3\x72\x96\x27\x29\xbd\x52\xf8\x44\x96\x24\x9f\x20\x65\x19\x5f\x42\xc2\x18\x6f\xeb\x85\x59\x09\x47\x09\x1f\x7c\xf8\xf0\xdf\x87\xc7\x30\x98\x9d\xf1\x02\x47\xfe\xc8\x4f\x43\x78\x2e\xfc\xc3\x1d\x31\x66\x87\xe1\xb8\x64\x83\xf3\x30\x47\xeb\x9b\x6c\x9c\x5c\xf6\x07\xb3\xb3\xd6\xf0\x2c\xdc\x0b\x83\xdd\xce\xe3\x27\xed\xed\x47\x15\xc6\x43\x96\x4b\x0a\x22\xcd\xee\x2e\x34\x64\x97\x1a\x25\xa3\x98\x68\x26\xde\x8d\x50\x4d\x55\xc5\xb4\x4a\x16\x85\x25\xdd\xcd\xf2\xa5\x96\xe8\xa8\xb4\xd8\x8e\xe0\x2a\x41\x44\xa1\x2e\xec\x55\x31\x32\x15\x39\x69\x9f\x0a\x9f\xce\x5c\x63\x10\xe5\x7b\x66\x79\x35\x59\x09\x17\xb9\xc1\xb1\xa0\xd4\x4c\x65\x73\x58\x2b\xe6\xf2\x52\x43\xd8\x1f\xf7\xf9\x77\x75\x9f\xff\xe3\xf6\xf7\x87\x23\xe5\x1f\x8e\x94\xbf\x93\x23\x65\xbc\xb8\xa0\x18\x78\x3b\x7f\x69\xbf\xbb\x1a\xb5\xda\x17\x69\x4e\xc6\xa2\x91\x87\xc0\x14\x6a\x3c\xc9\x6e\xfd\xa3\x7c\x58\x20\x50\xc0\xc7\x6e\x63\x3f\xe3\xcb\xf6\x80\x31\xbe\x55\xc0\x87\x5b\x61\xc6\x02\x68\x42\x36\x9b\xe2\xc3\x16\xb3\x04\x05\x82\x23\xd4\xe4\x69\xae\x4f\xfa\xa4\x5c\xf7\xf0\x7b\x77\x77\x17\xee\xd3\xba\x77\xdf\x30\x2a\xd5\x79\xba\x97\xb0\x47\xc9\x3d\xe0\x18\x17\x9c\x20\xcb\x27\x83\x4e\x36\x1b\xd0\x55\x13\xa1\x85\xbf\x65\x57\x05\x70\x9d\x81\x6f\x88\x74\x13\x1c\xbb\x42\xa6\x58\xca\xab\x87\xe6\x88\x97\xe5\x2a\x6a\xca\x32\x34\xe2\xc6\x20\xe5\xc2\xb0\x1b\x63\x95\x93\xbd\xae\x1e\x2b\x0f\xf7\x65\xf7\x61\x13\x4a\xb8\x20\xa9\x24\xf6\x9a\xd9\xb5\xc0\x26\xf1\xe5\x18\x08\x5a\xe8\x9a\xf3\xe3\x0b\xee\x0f\xc5\xc8\xf7\x50\x14\xa1\x75\xbe\x26\x8e\xf9\x06\x82\x62\x41\x1a\xe1\x1a\xf0\x51\x44\x21\xbe\x03\x5a\x26\x5f\xc1\x95\x9c\x70\x06\x71\x05\x7e\x99\xed\x7b\x65\xaf\x3a\xbd\x66\x80\x34\x6e\xc6\xcb\xc8\x5d\xa3\x48\xbd\x99\xcb\xab\x34\xc9\x32\x65\xe4\xc2\xe7\xec\x2b\xc6\xb9\x07\x1c\x9c\xb3\x7c\x65\x1c\x96\x64\x7e\xbf\xf0\xf6\x54\x33\x10\xaf\xec\x41\xbf\xf0\xc8\x49\xd5\xe4\xd9\xce\x72\x7f\xd0\xbc\x88\x7c\x1a\x25\x6f\xa8\xea\x67\xa4\x78\x19\xca\x2b\xd9\x8f\x42\x75\xa8\x3b\x93\x7c\x08\xdc\x6d\xf9\xd3\x69\xb4\x10\x75\xd5\x8a\xeb\xba\xea\x19\xb3\xe5\xee\x98\xba\x74\x62\x7b\x28\x34\x9e\xab\x5d\xfb\x54\x4d\xf4\x82\x9e\x89\x42\xb5\xab\x22\xde\xc8\xce\xc6\xd5\x2a\x6a\xcf\xc9\x7d\x45\xdd\xfb\x18\x45\x1a\xc9\x58\x78\xf9\xd5\xe0\x00\x1b\x2a\xd3\xbc\x67\xb5\xee\x9d\x6f\xa6\x27\x9d\xdc\x1f\xe2\xc5\xf9\x87\x8f\x07\x47\x07\xef\x8e\xf7\x8f\x0f\xdf\xbf\xeb\xef\x1f\x1f\x7f\x3c\x7c\xf9\xdb\xf1\xc1\x11\x5e\x9b\xcb\x80\xa7\xa4\xdf\xae\x79\xc2\x25\x99\xa0\xa0\x20\x2f\x7d\x60\xf5\x6f\x3d\x89\x2b\x9e\x20\x2b\x53\xff\x3d\x78\xe7\xbf\x83\x1e\x6c\xce\x6b\x0e\xd4\x96\xbe\x3d\xba\xdb\xbb\xd3\x95\xaf\x23\x28\x4e\x7a\x98\x8d\xd7\x05\xe3\x1b\x60\xd6\xdc\x28\x04\xdb\x7d\x3c\x5c\xaa\xd5\xce\x1f\x3d\x5d\x77\x03\x10\x6c\xd3\xb3\xb2\x69\x12\xf9\x39\xab\x57\xff\xdb\x4f\xd6\xb5\x76\xed\x0b\x23\xc4\x64\xb6\x64\x77\xf1\xe8\xd9\xda\xf6\xab\x79\x38\x3c\xa7\x48\x5b\xb5\xe0\x9f\x3d\x7f\x4a\x57\xf5\xc6\x42\xaf\xc6\xd5\xc1\xc0\xc5\xfa\xe0\x98\x82\x23\xf3\x25\x83\xa7\xb7\xe8\x13\xe5\x13\x25\xf0\xf6\xcc\x25\xc0\x19\x26\x33\xdb\x55\x41\xc0\xf5\x6f\xac\xe6\xd8\x26\xf1\xd7\x5a\xe8\x98\x43\x7d\x72\x7f\x8c\x02\x86\xda\x43\x2b\x9c\x00\x77\xe4\xc1\x49\x20\xfd\x45\x37\xa1\x73\xca\xd7\xd7\x59\x9c\x83\x9e\x65\x9d\x36\xf4\x28\xd1\x15\xcf\x50\x2d\xe4\x4b\xa1\xd7\xa8\x07\x1e\x64\x53\x36\x0c\x47\xa1\xbc\x08\x59\x1d\xed\xc2\x28\x70\x9e\xe7\x98\x4b\xf9\x41\xb8\x0b\x82\x08\x74\xcd\xd6\x8a\x48\xc6\xe1\x90\xd5\x12\x18\x3d\xca\x9a\x1d\x76\x65\xff\xa1\x23\x9d\x8e\x17\x07\x41\x3f\x1b\x09\xdb\x7c\xab\x65\x7c\x77\x78\x31\x83\x9c\xc6\x33\x94\xdc\xc7\x0b\xbc\xe0\x24\x6c\x9f\x9a\xc9\x18\xed\x2b\x38\x09\x3b\x56\x2a\x9b\x8a\xc6\x69\x17\x91\x4c\xe1\x67\x02\x61\xdc\xcc\xe4\x8c\x57\xc5\x54\x4f\xc1\xe7\x65\x3d\x09\x96\xe0\x58\xc5\xc3\xb6\x47\x68\x87\x1d\x8f\xf0\xd5\x85\x84\xab\x02\x51\xf2\x86\xec\x35\x52\xec\x75\x18\x0f\x53\x3c\x11\xa4\xa1\x52\x08\x72\xc4\x24\x1f\x19\x7d\x63\x53\x78\x01\x6d\xb3\x5f\xbe\xbe\xea\x1c\x45\x49\x92\x12\x08\xd8\x42\xcc\x5c\x78\x58\xe8\x17\x76\x95\x6e\x5a\x59\x18\x11\xb5\xea\xca\x7e\xfb\x9e\x81\x8e\x59\xa7\xfa\xf7\x73\x6d\xff\x04\xc6\x3c\xe5\xa1\x40\x79\xab\xb6\x7b\x92\x18\xc9\xb4\xb6\xf0\x77\xea\xdf\xb2\xf1\x43\x0e\x5f\x7d\xfc\x90\xf5\x57\x1d\x40\x31\x05\x83\x55\xe8\x6c\xe1\x71\x2d\x9d\x2d\x34\xae\x25\x74\x11\x0f\x4b\xa9\x46\xb1\xa3\xa5\x90\x9d\x7a\x55\x5a\x34\x1c\xbd\x58\x60\x99\x55\x06\xb0\xb0\x0e\x72\xed\xa2\x24\x22\x6f\x50\x7b\x28\x6a\x1b\x6b\xf7\x1b\xc4\x8d\x43\x5a\xae\xca\x16\x57\x7c\x09\xcc\x48\xa4\xdb\x37\x44\xca\x10\xcb\xf8\xe2\x75\xd7\x32\xfc\xb8\xd1\x2a\x51\xea\x04\xad\x12\x08\x96\xb8\x97\x37\xe3\x29\x22\xbb\xa5\x11\x29\xae\xd9\x15\xb6\x06\x9d\xf6\x5f\xea\x25\x18\x1a\x0d\xe2\xae\xa8\xfe\x19\x51\xe7\xe9\x5f\xc6\xbc\x51\x60\x6a\xd8\x37\xae\x77\xaa\xcc\x61\x2d\xd7\x58\xb7\x9f\x0a\x85\x72\x16\x63\x84\xa6\x52\xe7\x0d\x76\xa4\xbb\x30\x1c\xd5\x75\xf4\x4f\x8e\xcc\xc0\xcf\xc2\x25\x2f\xb9\xba\xed\x95\x91\x79\xc9\x21\xad\x89\xcc\xb6\x81\xcc\xab\x28\xc9\x58\xb0\x84\x3e\x8f\x6e\x86\x12\xc1\x5b\x13\xb1\x47\x84\x58\xb0\x6c\x0b\xb0\xfd\xf4\xe9\xca\x18\xbd\xf6\x73\xb6\x26\x2a\x8f\x09\x15\x7a\x61\xb2\x64\xc3\x70\xe7\x93\x66\x78\xe3\x49\x53\x40\xf5\x76\xb3\xe6\x09\x01\xa3\x13\xcc\x25\x83\xf0\x6c\xe5\x41\x20\x81\xbc\xe6\x30\x3c\x25\x74\xd2\x64\x16\xd7\x33\xe9\xb3\x67\x77\x3e\x0a\x75\xf6\xc2\xab\x62\x7a\xbb\x41\x78\x46\xb0\xe8\x45\xd2\x92\x41\x78\xbe\xf2\x20\x90\xff\xf0\x35\x07\xe1\x39\xa1\x83\x0f\xed\x47\x49\x3a\xe9\xe3\xeb\xc0\x25\xc3\xb1\x3a\x73\x1c\x4b\x98\xaf\x32\x29\xcd\x6e\x52\xeb\xe8\x62\xdd\x3e\x75\xc4\x52\xf3\x67\x92\x4c\x96\x6c\xd8\x3b\x2b\xf7\xe4\x7f\x92\x64\xb2\x2e\x2e\x62\xa9\x4a\xcf\x06\x4b\x06\x7b\x7b\x65\x54\x3e\x9e\x0d\x56\xa7\xe5\xc7\xb3\x81\xb9\x96\xdc\xa0\xc6\xad\x44\x7d\x47\xac\x88\xe3\x2c\x5a\x42\xfe\xee\xca\x7d\xfe\x7b\x16\xad\xde\x83\xbf\x67\xd1\x9b\x64\xed\xe9\xd0\x11\xeb\x67\xe4\xd7\x0f\xd7\xb3\xe7\xab\x0f\xd7\x1b\x7f\xb0\x2e\x26\x62\xc1\x1c\x0f\x97\x11\x71\xf5\x15\xfc\xef\xc3\x9b\x10\x71\x78\x2b\x22\x8a\x55\x6b\x38\x1b\xb0\x31\x8b\xc2\x25\xe2\xe4\xf9\xe3\x95\x3b\xf0\x4a\x42\x2b\x60\x75\xfb\x05\x61\x70\xe3\x05\xa1\xa2\x87\xb7\x54\x68\xc5\xda\xfc\xaf\x99\x1f\xe7\xe1\x9f\xf5\x2a\xd2\xb3\xe7\xd7\x28\xb5\x12\x82\x7a\x48\x6d\xff\x2b\xec\x64\xbe\xc3\x3b\xad\x1b\xdb\xd6\x8f\x67\xec\x76\xe7\xe9\x67\xfe\x64\xe2\xdf\xee\x2c\x3d\x4e\xca\x40\x6e\xb0\x25\xc3\x1b\x4d\x3f\x5e\xa6\x64\x3d\xc6\xe3\xe2\xe2\xb6\xdf\xf7\x20\xa8\x74\x59\xeb\xe4\x85\xbd\xb0\x0f\x9b\x90\xc3\x43\x08\xa4\x1b\x40\x03\x18\xef\x4e\xcc\xd0\xff\x0c\x87\x38\xf0\x60\x61\x01\xf5\xe5\x99\xc6\x34\xb9\xe4\x05\x16\xae\x07\x03\x33\x8d\x6a\x34\x81\xe7\xc1\x2e\x74\x60\x0b\x16\x5e\x3d\x2e\x1a\x96\x40\x0a\xeb\x57\x20\x36\x9e\x31\x44\xc8\x38\x0a\x87\x5d\x18\xf0\x96\x4c\xef\xc4\xb0\x67\xd2\x03\x5e\x40\xe7\x59\x1b\xbe\x7e\x85\x00\x5f\x19\x3c\x6b\xc3\x1e\x04\xd0\x84\xed\x27\x6d\x78\x48\x8d\xa3\x6a\xe6\x04\xb0\xc5\x13\x5d\xe8\x71\x2a\xf6\x56\x39\xf3\x32\x86\xaa\xf2\x4c\x99\x6c\xda\x7d\x17\xf6\x60\x00\x3d\xf0\x0b\xef\x19\x90\x4b\x1c\x9b\xba\x0e\x27\xd9\xe6\xc2\xc5\x5b\xa9\x0e\xec\x49\x66\x02\x7d\x6b\x69\x10\x41\x55\x43\x2a\xc0\x5e\xf5\xe0\x7d\xab\xbe\x94\x46\x48\xe0\x7a\xf3\x51\xfa\xa6\xf4\x2e\x8a\xad\xef\xf0\x02\x72\xdd\x37\x02\x16\x2b\x64\xad\x89\x9f\x0f\xc7\xce\x56\xeb\xcb\x93\xab\xad\x33\xd7\x72\x78\x24\x6f\x31\x55\xe9\xfb\xff\x71\x1f\x36\x01\x43\x72\xf2\x65\xa4\xf2\xfe\xf2\x3b\xbc\x73\xf9\x61\xb4\xf8\xff\x90\x13\xa2\xbe\x08\x55\xcd\xd2\xfe\x1b\x7f\xb1\xec\x38\xe4\xf9\x0f\xf7\x3f\x3f\x0c\x40\x7f\x18\x80\xfe\x2f\x35\x00\xfd\xbf\xd1\x91\xd4\x0f\xf3\xd6\x1f\xe6\xad\x3f\xcc\x5b\xff\x4a\xe6\xad\x1f\x45\x88\x4a\x38\x4b\x93\xd9\x14\x92\x11\x30\x3e\x3c\x30\xf0\xd3\x0d\xd3\xb1\x1b\x0e\xda\x4b\x3f\x5d\xdb\xf0\x55\x02\x58\x62\xfc\x2a\x8b\x5c\x63\x00\x2b\x8b\xdd\xd8\x08\x56\x56\x5c\xc5\x10\x56\x35\x72\x43\x63\x58\xdd\xcd\x0a\x83\x58\x99\x59\x17\x4f\xbd\x50\xaa\x10\x57\x1d\xb5\x47\x15\x56\x9d\x1c\x5c\x19\xc1\x1e\x92\xd1\x28\xa3\x88\xc8\xa4\x2d\xd0\xb7\x59\x22\xf2\x17\xc9\xcc\x28\x41\xdf\x66\x09\xe9\xec\xab\x5f\xe1\xed\x0b\x0d\x26\xfc\xdc\xff\x07\xc6\xb9\x15\x25\x44\x42\xb1\x8c\x5d\xa0\x98\xfb\x21\x09\xe3\x9c\xec\xc2\x72\x8a\xe5\xa7\xcb\xda\x79\x66\xcd\xf9\xfe\x1c\x83\xe2\x88\xc2\xf8\x69\xe6\x2f\xec\xfc\x45\x31\xff\x7a\x9f\x61\x7d\xe5\x34\x8c\x68\xd7\xf0\xa0\x41\x34\xb2\x9c\x87\x89\x3e\xcb\x9f\xf2\xaf\x8d\x39\x4f\x45\x14\xf9\x0f\xc4\x45\x3a\x13\x93\xc3\x29\x47\xf3\x7b\x79\xe8\x32\xa6\x0a\x86\xf9\xb6\x3d\xf9\xb2\x38\x4f\x17\x7c\x59\x2f\x44\xc7\xed\x57\x0e\x58\x39\x51\x02\x10\xc4\x71\x4d\xca\x03\xcc\x39\xd9\xcb\x95\x5a\x73\xbb\xd8\xa2\xa6\xd8\xc2\x2e\x26\x9e\x34\x56\x16\xc5\x3c\xbb\x38\x0a\xb4\xdf\xfd\xa8\xa6\x86\xcc\x2e\xc4\xdc\xbd\x27\xd3\x2b\x43\xaa\x68\x5b\x75\x30\x83\x03\x11\xcd\xe6\x6f\xc3\x40\xc5\x11\x2b\xf4\xb0\x3e\x6b\xfe\x16\x0d\x4c\x6b\x6a\xd5\x65\xcd\xdf\xa2\x37\x92\xea\x5a\xb5\x59\xd2\x42\xa9\x2a\x6f\x98\x24\x69\x90\x1d\xa3\xbd\x5a\x7d\x7e\x7d\x3f\x28\xff\x25\x06\x1c\xa9\xca\x8f\x92\xcb\x97\xc9\x2c\xae\xab\x3e\x0e\xcf\xc6\x76\x7e\x61\x60\xd0\xf0\x43\x3e\x4b\x77\xd4\x28\xd9\xc3\x64\x34\x22\x4b\x9c\xb4\x4f\xcd\xb0\x3b\x66\x3b\xaa\x48\xc7\x28\x22\xac\xd2\xae\x81\x7a\x1d\xc8\x4a\x26\xe1\xdd\x90\xc2\x78\x77\x17\x1a\x17\x5c\x00\x0d\xfd\xa8\x61\x77\x42\x8e\x12\xca\x91\x96\xb2\x47\xd3\x43\x4f\x63\x20\x1f\x0a\xeb\x71\xc7\xf4\x05\x6c\x8a\x35\xa1\x50\x49\x99\x31\x3b\x08\xa1\xa9\xba\xe5\x16\xa0\xf0\x82\x08\x6c\x93\x16\x06\x1b\x0e\x32\x97\x01\x67\x53\xf7\xbf\x00\x08\x4b\x2e\xa8\xad\x12\x20\x93\xdd\xbe\xc0\xbc\xd3\x43\xd0\x1e\x2c\x3a\x3d\xc4\xc1\x83\x79\x57\xa5\x75\x7b\x04\xee\xaa\x0c\x81\x3a\x2d\x21\xf0\x7a\x02\x42\x50\x86\x10\x06\x55\x10\x88\x65\x2b\x20\x28\x1c\x30\xad\x02\x07\xc3\x80\xd1\x1c\xd6\x71\x92\x86\x7f\x26\x71\x5e\x3b\xb0\x8b\xa5\x03\x3b\xaf\x1c\xc0\x45\xcd\xa8\x8b\x81\x9d\xd7\x90\x59\x8c\xd7\xbc\x66\x38\x17\x26\x5b\x2c\x96\xb2\x85\x31\xee\x8b\x65\xe3\x5e\x35\xb0\x9a\xa8\x7c\x30\xd6\x1a\xd8\xa0\x62\x58\x82\xe5\x10\xae\x1f\x58\x83\x35\x62\x6b\x60\xf5\x9c\xbd\x2b\x07\x97\xf4\xef\x66\x07\x7c\x15\xe7\xee\xa6\xd0\xd4\x0f\x96\x4c\xbf\x98\xda\x4f\x28\x13\x0a\x65\xc3\x23\x6d\x34\x84\x2b\x79\xde\xe4\xad\x84\xd3\xf5\x5d\x6b\x44\x61\x8c\x8e\x48\xe5\xa0\x7f\x23\xc8\x6f\xc3\xe0\x1b\x41\x7e\x99\xe4\x3a\x18\xa0\x62\xe4\x2b\xd7\x78\x91\x26\xdd\x8f\xde\xe2\x8d\xdb\x9d\xb0\xcf\x1d\x32\xcf\x35\x1c\x93\x35\xac\xd8\x1e\x7c\xdf\x51\xda\xa3\x6c\x58\x24\xab\x78\xba\x27\xcb\xde\xee\xf9\x5e\xd1\xb3\xb8\x50\x34\xff\x0d\x1e\x9d\x85\x6b\xea\x5b\x78\xda\x5e\xa7\x2a\x67\xad\x53\xb7\xe0\xbf\x9c\x13\x61\x2d\x0a\xa0\x1d\x2e\x87\x80\xba\xc5\x2d\xbd\x6b\x2f\xee\x00\x06\xad\x9b\xb7\x74\x15\x5e\xd6\xee\xd7\x02\xc8\x49\x4d\x9e\xc7\xd3\xe4\xfc\xf6\xee\xcb\x39\x90\x3f\xee\xc0\x39\xfb\x5d\x38\x78\x27\x7d\xe2\x36\xee\xdd\xaf\xf4\x83\x5a\xca\x32\xa3\x0a\x4b\x8a\x35\x06\x91\x3f\x3c\x6f\x94\xfa\xdf\x69\x3d\x36\x7a\xf2\xd8\xc4\xa8\x6d\x72\x81\xa9\x3a\x61\x8b\xb7\x7f\x31\x6b\x9e\x1a\xd9\x37\xb4\x9d\xef\xe0\xbf\xee\x5b\x19\xef\x8f\x90\xd1\xf9\xfc\x7b\xeb\x4f\xd7\xb6\x65\x6a\xf7\xfb\xaf\xfd\xdc\xbf\xe6\xae\x6f\xed\xe7\xa4\xfd\x57\x7c\x55\x59\x0e\xbd\xdb\xfd\x71\x93\x68\x07\x12\x29\xdc\x96\xc9\x6b\x1f\xe1\x7c\xc9\xb8\xd6\x31\x2e\x7a\xaa\x2f\xda\x74\x55\x75\x96\x4d\xc7\x24\xe5\x58\x95\x15\xe7\xd6\xc5\xb3\x6d\x3c\xc5\x96\x9b\x63\xbc\xed\x11\x1d\xa4\x2d\x89\xee\x56\x32\xf8\x8c\xe7\xce\x1b\xda\x05\xa1\x1f\x0d\x67\x91\x9f\x93\x63\x2e\xda\x05\xe9\xc3\xfd\x69\x92\x85\xf4\xcb\xf2\xa6\x0f\xc9\x08\xfc\x39\xcb\x0c\x9f\x63\xf0\x85\x3a\x7a\x25\x0e\xd1\xf8\xbf\x37\x3e\x85\x62\xe6\x09\x95\x45\x7d\x9a\x24\x00\xe8\x9b\x4c\xf5\x53\xba\x3b\xab\x6d\x42\x9c\xab\x8a\x7a\xe2\x2b\x19\x51\x78\x36\x8c\x26\x29\x62\x1e\x66\x17\x67\x32\x14\x9b\x05\x88\xac\xbd\x09\x01\xae\x74\x10\x20\xbc\x9e\x10\xed\x7a\x30\x6f\xf2\x5c\x48\x52\x58\xe0\xaf\x4a\x00\xa8\x9c\xa1\xff\x02\x0e\x20\xe6\x3f\x92\x11\xa5\x1a\xae\xd4\x34\xe6\xaf\xcc\x3e\x6e\xc8\x20\xae\x96\xc8\x30\x0f\xef\xad\x0c\x19\x40\x41\x50\xcd\x13\x1d\xf7\x54\x2f\x3c\x8d\x8e\xb6\x3a\x5a\x37\x58\x84\x3a\x99\x36\x0f\xa6\x55\xe8\x85\xd0\x94\x06\xe7\x6c\x91\x39\x02\x2b\x15\xed\x20\xcb\x99\x5a\x83\x00\x22\x36\xca\x7b\x02\xe1\x16\xff\xf0\x54\xf2\xdb\x90\x2f\x03\x15\x99\x29\x85\x07\xa0\x0e\x34\x65\x7e\xaa\x91\xc4\x9f\xb2\x7a\x7d\xb1\x3c\x99\x2a\xe8\x79\x32\x55\x89\x85\x86\x55\xd6\x20\xc9\xf3\x64\x22\xe3\x12\x68\x90\x94\x6e\x96\x91\x10\xaa\x4b\x16\x5f\xc5\x85\x01\x57\xd5\x83\xd9\x90\x19\x87\xbc\xe4\x01\xcf\x83\x30\x30\x5f\xa6\xfb\x74\x6e\x2e\x68\x7a\x12\x06\xe2\x10\x8c\xe7\x25\x69\xa8\x7c\x02\x52\x91\x96\x91\xa4\xb7\x06\xea\x7d\x3c\x16\xa1\x2f\x9d\xdb\xe7\xa9\xff\x39\xf5\x03\xbe\xf6\xc9\x42\xe2\x53\x97\xd2\xf9\x85\xf2\xbb\xbb\x3a\x26\x25\xec\xc1\x97\x2b\xe8\xd9\x45\x34\x8c\x09\x12\x49\x36\x41\x5f\x9e\xb1\x87\xbf\x60\x69\x86\x51\x2a\x31\x5f\x7e\x1b\x2f\xc4\x89\xa8\x74\xc7\xd1\x68\xc0\xa6\x45\x81\x4d\x70\x44\x03\x7b\xd0\xa0\xf1\x68\x40\x0f\x1a\x0d\xd7\x80\x90\xfa\xf1\x59\xd5\xd9\x6a\xd5\x59\xec\xa2\x22\x2d\x66\x2c\x38\x9a\xfa\x43\x56\x3c\x00\xe5\xe2\x5e\xc9\x10\x3c\x60\xa2\x0b\x06\x63\x93\x29\x9a\x3e\x31\xd8\x9b\x23\x2d\xc8\x44\xdf\x5f\xbf\x42\xdb\xf5\xc0\x2e\x22\xbe\x24\x5f\xab\x1a\x14\x60\x17\xab\x9c\x96\x1e\xeb\xda\xc8\x2c\x6a\x90\xa9\x39\x11\x83\x3d\x85\x66\x9e\x4c\x35\x0a\x8a\xbd\x15\x0e\xc4\xe0\x05\xbc\xa9\x8e\x2a\xc3\x3f\x09\x4b\xe8\x15\xe0\x96\xcb\x14\x80\xac\xd4\xb0\xdd\xfb\x62\x1f\x89\x9b\xf8\x47\xe9\x65\xb5\xe4\xb1\x8a\x51\xc2\x1f\x27\x9d\x53\x8f\x92\x4e\xda\xa7\xa7\x56\x75\xba\xf4\xf3\xd3\x8c\x1d\xad\xfa\xa2\xb8\xa0\x6c\x9d\xdc\xff\x13\xf7\xfe\x06\x10\xbc\x17\xe2\xf8\x9a\x02\xdc\xf0\x59\x20\x5a\x32\xda\xa5\x03\x4a\x73\x16\xf9\x11\x66\xd0\xd8\x5b\x45\xad\x3c\xc1\xb7\xa6\xcb\x0c\xe1\xf1\xc1\x25\x62\x39\xf8\x7f\x71\x72\x70\xf3\xbe\xd1\x13\x65\xf4\xcd\xfb\x1a\xc1\xbe\x1f\x19\x7d\x94\xaf\x81\x25\x25\xa5\x8b\x8e\x9b\xb7\x73\x21\xaf\xda\x8e\x39\x88\x72\x23\x5e\x21\x54\x0d\x12\xf7\x8b\x4d\xa7\x5e\x81\x6c\x57\xae\xbb\xf2\xb4\x36\x25\x82\x25\x90\x79\xe1\x3c\x99\x36\xd0\x5b\xae\x90\x4c\x5f\xbf\x96\xcb\x10\x23\x63\x31\x2a\x25\x8f\xb7\xb8\x4c\x32\x04\x81\x4c\x5e\x08\x7f\x12\xd9\x89\x12\x87\xa7\xd0\x34\xf0\x78\x48\x1c\x4f\x53\xe6\x86\x72\x61\x69\x6f\x38\x16\xd7\x76\x07\x85\x52\x4d\x6f\x56\x41\xdb\x3a\xfd\x5e\x68\x12\xe4\xc9\xb4\x34\xff\x46\x61\xec\x47\xf2\x66\xb9\x3c\xca\xc8\x54\x9e\x71\xca\x57\x3f\xe4\x18\x0d\x6a\x8e\xd1\xa0\x16\x1e\x4d\x8a\x1e\x58\x53\x4b\x6c\x8b\xab\x98\x01\xf6\x6c\x11\xdd\x33\x7a\x52\x0c\x71\x54\x45\x7e\x5d\x5f\x88\xb9\x9e\x39\x82\xd4\x69\x31\x57\xf0\xf2\x93\x32\xc3\x80\x71\x2a\x2f\xe7\xce\x12\xc5\x37\x77\xc1\xd1\x34\xdf\x83\x66\x07\x7a\xd0\x71\xe1\xa1\x26\x66\x1d\xe7\xe8\x76\x6f\x09\xdf\x18\x62\xdb\xab\x83\x35\x86\x52\x1f\x2a\xee\xb5\x78\x5e\x18\x78\x1a\x9e\xb0\xf6\xf0\xe0\x0b\x9a\x79\x97\x8f\x10\x6e\xe7\xf5\xbd\x74\x6c\x20\x44\x13\xfc\xbe\xff\x11\x0e\xdf\xfd\xf7\xc1\xab\xe3\xc3\xf7\xef\xe0\xe1\x96\x86\x3d\x4d\x93\x21\x43\xe3\x2c\xb9\xb7\x52\xe1\xf0\x9d\xa1\x0b\xdd\x76\x67\xbb\x39\x25\xcb\x00\x0f\x7e\xf1\x87\x6c\x90\x24\xe7\x1e\x1c\xc6\x43\xe9\xcb\x19\x43\x14\x8b\xcd\xf0\x30\x09\xd0\xef\xbb\x08\x25\x1e\x18\x81\xea\xdf\x1e\x1e\xcb\x64\x18\xe1\xe5\x26\x6d\x77\x38\x88\x37\x87\xaf\x0e\xde\x1d\x1d\x88\xd8\xfa\xb4\x0b\x4a\x93\x24\x87\x20\x4c\xd9\x30\x4f\x52\x11\x0c\x5d\x37\x94\xa7\xe4\xca\x59\x3a\xd4\xc3\xe0\x17\x93\x69\xbe\x10\xef\x92\x29\x0c\xf1\x86\x30\xdc\xe4\x3d\x6c\xb1\xf8\xa2\xf5\xee\xfd\xeb\x83\xfe\xc1\xbb\xdf\xd1\xaa\xac\x31\x4d\x93\x60\x66\x3a\x4d\x16\x5b\x83\x51\xca\xd8\x9f\xcc\x31\xe0\xd5\xb8\x19\x36\x4a\x2c\x25\xf7\x15\xed\xeb\x97\x8d\x9f\xb3\xed\xba\x6e\x89\x1d\x6e\xe7\x74\xfc\x9b\xb0\xc3\xa3\xff\x55\xec\x70\x4d\x04\x84\x47\xcf\x0d\x1f\xe6\x47\xe1\x24\x8c\x7c\x11\x98\x1b\x1d\x7b\xc7\x39\x0c\x66\x39\x24\x71\xb4\xc0\x98\xe0\xe0\xc3\xa5\x9f\xc6\x18\x81\x9b\xa2\xdf\x0f\x93\x38\x08\x85\xbb\x7a\xb4\x2a\x9c\xb0\xbc\xa5\xc8\x30\xf4\x63\x18\x30\xc0\xe7\x7a\x79\xc2\x41\x40\x98\x65\x33\x96\x91\xd1\xf3\x05\x8b\x92\x29\xfa\xd7\x61\xf1\x45\x98\x26\x31\x9e\x22\xf1\xbc\x61\x1a\xe2\x45\x3e\x87\x34\xf5\xf3\x71\xd6\x82\x8f\x6c\x92\x5c\xc8\x80\xe3\x51\x72\x76\xc6\x7f\x23\x81\x47\x09\x1a\x01\x09\x56\xb6\x61\x5d\x86\x51\x04\xe7\x8c\x4d\x25\x6d\x33\xbe\xdb\x8f\x92\xb3\x70\x88\x11\x12\x46\x49\x14\x25\x97\x74\xec\xc0\x73\x10\x20\xb5\x48\xb4\xc4\xdd\xb8\xe8\xf3\xae\x4d\xd3\x9b\xcf\x2f\x32\x57\x0a\xe3\xfc\x0f\x05\x51\x6d\x2a\xcd\x74\x87\x8e\x10\xa4\xec\x56\x47\x6a\xfd\x08\x03\x4c\x16\x8f\xe5\xd0\x9c\x8e\xcf\x47\x32\xe5\xc0\x52\x14\xa0\x06\x7f\x36\x81\x0b\x76\xae\xae\xf7\xcf\x71\x3f\xd6\xd9\xa1\x5f\x3f\x63\x3e\x7d\xe0\xb9\x9e\x58\x29\x38\xb4\x13\x2c\xd1\x04\xf4\x02\xa4\x4f\xf8\xfa\x78\xec\x56\x5c\xdc\xfd\xf4\xec\x30\x0e\xd8\x1c\x0d\xed\x55\xea\x84\x65\x99\x8f\x1a\x7a\x43\xf4\xab\x87\x51\xfd\xa8\x73\xad\x94\x4d\x23\x7f\xc8\x9c\xad\xff\xca\xb6\xce\xbc\x8a\x88\xea\xfa\xd1\x1e\xc7\x47\xb6\xb1\xb9\x79\xba\x53\x5a\x67\xa5\xc1\x6e\x12\x67\x49\xc4\x88\xfa\x6a\xab\x6b\xac\xb1\xa2\x00\xd9\x2a\x39\x02\x41\xd7\x0c\x06\x9f\xa7\x0b\x55\x7a\x6b\x0b\x9a\xcd\x26\xfc\xc1\xa2\x61\x32\x41\x17\xf7\x01\x1b\xcc\x88\xf3\xd0\x88\x8c\x67\xeb\xb2\xc8\xf2\x64\xf5\x79\xe9\x67\x64\xac\x1b\x93\x95\x34\x3a\xee\x8f\x43\x16\x0f\x19\x64\x09\x46\xf3\x80\x45\x32\xc3\x09\xc2\x85\x14\xcd\xe5\xdc\x1f\x9e\x6b\x70\x79\xc2\xd7\xcd\x80\xa6\x99\x1f\x45\x59\x88\xe7\x7d\x7e\x0e\x43\x9f\x66\x14\xc5\xc6\x27\x4e\xc2\xd2\xa9\x08\x9c\x0f\x86\xa5\xf0\x41\x55\x57\x61\xe8\xe7\xc3\x31\xe0\x3b\xac\x2b\x75\xe4\x71\x59\xe6\x4a\x91\xe4\xa8\x79\xee\x81\xcd\x9b\x9c\xfa\x23\xe1\xf3\xce\x3c\x5f\xd0\x34\x2f\xa2\xd2\xf8\x54\x0b\xd4\x83\x56\xab\xc5\x47\xdb\xfd\x04\x42\x48\x99\x32\x87\x33\x4f\x43\x72\x95\xe4\xc9\x46\xd9\x09\x97\x60\x30\x69\xa4\xdf\xf8\xc5\x0f\x23\x16\x00\x5e\x87\x22\x15\xe5\x1d\x68\x0f\x1a\xf4\x56\xb1\x5d\xe4\xb9\x1d\x3e\x02\x87\x67\x71\x92\x32\x5d\x4f\xdd\xa7\x22\x00\x3c\x78\x94\x01\x4d\x6c\x04\xee\xa9\x9e\x69\xb8\xd6\x24\xee\xae\x36\x8b\xbb\xf0\x02\xba\x62\x1a\x77\xa1\x09\x5d\x63\x1e\x73\x10\xdd\x1d\xf1\x93\x66\xb2\xfc\x34\xe7\xb2\x31\x9b\x11\x42\x79\x3a\x77\x95\xad\x96\xb2\xd2\x30\x65\x91\x30\xdb\x55\x03\xeb\xc1\x09\xd1\xf7\xb4\x35\x4c\xe2\xa1\x9f\x3b\x38\x60\xe6\xb5\x75\xb5\xb2\x20\x46\xf1\xdb\x28\x0a\x4b\x23\x1a\xdc\x58\x51\xf8\xdf\xa9\x08\xc2\xdf\x38\x4b\x22\x47\xe2\xb9\x37\x2d\x60\x5b\x0f\x59\x16\x85\x71\xde\x0c\xc2\x0c\x1f\x13\xc5\x49\x33\x63\xd1\xa8\x39\x4c\x26\x53\x3f\x65\x86\xc6\x60\xdf\xc5\xe8\xa3\xe2\xba\xdb\x1a\xad\x3a\x84\x71\x84\x87\x8a\xa2\x42\x98\xc1\x34\x89\x16\x23\xbe\xf8\xaa\xc0\x20\x44\x72\x5a\xb5\xe3\x6c\x36\x61\x69\x06\xd9\x38\xc4\x95\x39\x4c\x21\xb9\x8c\x39\x24\x19\x1e\x44\x68\x07\x2c\x6d\x4d\x92\x3f\xc3\x28\xf2\x31\x48\x08\x8b\x9b\xbf\x1d\x6d\x05\xc9\x30\xdb\xfa\x83\x0d\xb6\xfe\xdb\xbf\xf0\x8f\xf0\x8d\xd3\x96\x7a\x2d\xb2\xf5\x6b\x94\x0c\xfc\xa8\x4f\xa8\x64\x5b\xf4\x77\x2b\xcc\x8a\xd1\x75\x9c\xb9\x7a\x1c\xbe\xb5\x05\x47\xfe\x84\xfd\x8e\xf6\xb0\x7e\x74\x96\xa4\x61\x3e\x9e\x88\xf8\x1f\xe4\x63\x77\x21\xa7\x14\x2f\x8b\xa7\xe4\x9d\xe6\x63\x0f\x9e\x36\x3b\x6d\x3b\xf9\x49\x6b\xd0\x7c\xd2\x62\x3d\xd8\x6c\xc3\xbd\x5d\x68\xaa\xec\xfd\x20\x60\x24\xcd\xe3\x24\xfe\x93\xa5\x09\x2c\x48\x7c\x70\x12\x4d\xfc\x73\x06\xbf\x70\x55\x64\xec\x4f\xa7\x0b\x0f\xf5\xae\x30\xe7\x2c\x94\xb2\x60\x16\x07\x7e\x9c\x9b\xdb\xaf\x39\xae\x71\xf8\x34\x7c\xa1\x7f\x76\x60\x4b\xb8\x04\xc6\x77\xeb\xb8\xd7\x32\x0f\xda\x04\x92\xf0\xa4\xe5\xf7\xd0\x5d\xf0\xee\x2e\xff\x53\x06\x3c\xe7\xdb\x55\x02\x2c\x62\xa1\xe8\x77\x0f\x1f\x58\xca\x05\x40\x46\x01\xa5\xc2\x7c\x01\x83\x85\x08\x2f\x43\xea\x59\x9a\xcc\xce\xc6\xf8\xb2\x0a\x30\xa4\x15\x90\x75\x02\xea\x5b\xd4\x0a\x2f\x27\x23\x1e\xc1\xe5\x98\xf1\x52\x0b\xbc\x30\x1c\xfb\x19\xdd\x7f\x65\x70\x39\x0e\x87\x63\xe0\x1c\xca\xf5\x4a\x9a\x9d\xd1\x42\x84\xb1\x1a\xb0\xfc\x92\x31\x9a\x20\x5a\x90\x72\x70\x2a\xe8\x4d\x3a\x63\x04\x3b\x97\x21\x74\x32\xbc\x27\x42\x85\x70\x91\x21\x64\x1b\x6a\x21\x36\x4e\x36\xf6\xb9\x72\x78\xc0\xb3\x9c\x64\xf0\x79\xdf\xe3\x3d\x79\xa9\x03\xd9\x85\x99\x99\x5c\x78\xd2\x8c\x2f\xf6\xe4\xd3\x06\x43\x47\xe1\x35\x48\x41\x11\x71\x64\xf0\x68\x86\x27\x2a\x57\xce\xfa\x05\x12\x07\x5c\x55\xf8\xa5\x2a\x5c\x68\x95\xde\x1f\xca\x66\xc5\x35\x6c\xb6\x5f\xb8\xf6\xe1\xcd\xa9\x3b\x1f\x9e\xf2\xb2\x5c\xe0\x25\x9d\xab\xc9\x27\x6f\xfb\xd2\x8d\x2b\xc7\x06\xab\xa8\x10\x53\x4b\x10\xe0\x5a\x11\xcb\x72\x5c\xfc\xf6\x1b\x19\x11\x3e\x08\x47\x38\x57\x73\x18\xa5\xc9\x04\x5e\xb6\x8a\xd1\xfe\xc4\x63\x4d\xb3\x59\x79\xf3\xac\x97\xd8\x9a\x17\x75\x2f\xe9\x4d\xdf\xfe\x49\x78\xea\x72\x62\xdd\x13\x83\x74\x22\x53\x4f\x69\xb8\xf4\xb7\x5b\xd2\x37\x55\x1f\x64\xb4\xbe\x8d\xc2\xa8\x56\x2d\x6f\x26\xb7\x94\xcf\x35\x96\x3a\x14\xbf\x76\x7d\xda\xda\x82\xa7\xad\x4e\xab\xf3\x18\x8e\x13\x8a\xf2\x45\x11\x2b\x93\x43\x11\x0c\xae\x2e\xbe\x5d\xdb\xad\x0e\xab\x59\xc2\x5e\x6b\xdf\x61\x6e\xbd\xe3\x0f\x73\x78\x01\x6d\xd8\xe3\x20\x1c\xd5\x20\x2f\xe5\x41\x7b\xde\x19\x99\xff\x5c\xae\x9e\xa0\xe6\x34\x4d\x2e\x9d\xae\x07\x8f\xb7\x5d\xdc\x7d\xec\xee\xc2\xf3\x76\xfb\x69\xe7\xf9\xf3\xee\xe3\x47\x4f\x1f\xb5\x9f\x3f\xef\xe0\xe1\x4f\x91\x4a\x4b\x5d\x94\x0b\x64\x75\x78\xbf\x80\xb6\x1b\xb8\xa9\x52\x91\x44\x53\x3f\x0e\x92\x89\xe3\x2e\xed\xe3\x39\xb3\xfd\x56\x34\x8e\x16\x93\x41\x12\x39\x0d\xa9\xd2\xe0\x3e\xa9\x70\x5d\xd6\x68\x40\x8f\x6e\xff\x1b\x6e\xbf\xe1\x81\xb3\xb9\x89\x56\xbb\xd3\xb9\xdb\xca\x13\xba\x5b\x76\xb6\x9f\xb8\xe2\x60\xab\xd8\xb7\xa5\x9e\x33\xcd\xbe\x89\xdf\xad\x11\x1e\xe2\xb4\x64\xbc\xa7\xc3\xec\x40\x19\x19\x54\x80\x5f\xea\xce\xe6\x86\x0a\x90\xc6\xa1\xdf\x67\xd9\x5b\x04\x22\xdf\x20\x8b\xd7\xb6\x24\xef\x93\x3a\xce\x7b\xd4\xdd\x76\x8b\x45\xb9\xc2\x4a\xce\x51\x93\xa9\xb0\xbd\x7b\x2d\x82\xf1\xab\x32\xaa\x52\x86\x03\x52\x07\x9d\x42\xaf\x19\x05\x97\xc1\xa6\x12\xaa\x82\x90\xac\xbb\x52\xc4\x4a\x08\x2d\xe5\x8f\xa0\xf4\x1a\x53\x96\x54\x3d\xb1\xcb\x12\x80\xfb\xb0\x67\x70\x98\xb0\x23\x91\x52\x43\x49\xf3\x1d\xb8\x32\x9c\xa1\x14\xcb\x25\x83\xcf\x66\x7b\xd7\x63\x96\x0c\x3e\xb7\x8c\x47\x96\x58\xa2\x54\x8d\xca\xa1\xe0\x2e\xe6\x19\x2f\x3c\xf7\x74\x47\x7a\x36\xc2\x3b\xf6\x13\xd7\x2a\x22\x57\x76\x83\x23\x67\x30\xd0\x1e\xa6\xf7\xe0\x8b\x34\x38\xeb\x61\xc2\x15\xda\xb6\x48\x86\xd3\x4e\x21\x56\x27\x82\x18\x52\xa7\x3c\x3e\xee\x75\x03\x64\x08\x76\xd5\x63\xaa\xa3\x66\x3e\xaf\x66\x7e\xf5\x54\x7b\x1c\xc4\xce\x46\xd5\x78\x1a\xd1\x4d\xff\x7a\x23\x7a\xd3\xfe\x95\x17\xb3\xa5\x3e\x68\x56\x59\xcc\x3a\xcf\x5b\x9d\x56\xb7\xd5\x85\x2d\xe8\x3c\x6e\x75\x5b\xdb\xad\xc7\x85\xf7\xc5\xef\xe1\xc4\x03\xfd\xa4\xf0\xd4\xa5\xe8\xd2\xb1\x3a\xde\xae\x92\x0b\x6a\xb9\x0b\x3e\xd4\x45\x98\x7c\xd4\x7d\x2a\xca\xb0\x78\x36\x79\x39\x3b\xfb\x07\xd7\x48\xea\x96\x4f\xe9\x95\xe3\xf0\xa0\xff\xe1\xe3\xfb\xe3\xf7\xb5\x05\x3b\xae\xd3\x90\x85\x1a\xa2\xd2\xc1\x64\x9a\x2f\x4a\x0e\x2c\xb6\x1e\xd2\x21\x22\x70\x82\x52\x41\xac\x75\xfc\xcf\x0f\x07\x40\x67\x86\x34\x7c\x8d\x1d\x24\xd5\x2b\xa4\x87\x54\xa1\x2f\xc3\x7c\x0c\x23\xbe\x57\xf8\xc4\x95\xbf\x4f\xa0\x8a\xf7\xf0\x1c\x29\x1c\xa5\xfe\x84\x09\x5a\x52\xe9\x61\xc4\xfc\x94\x05\xba\x24\xc5\xe3\x46\xb0\xaf\xc3\x61\x5e\xc4\x50\x68\x6d\xe3\xd4\xcf\xc6\x1e\x5c\xfa\x59\xce\x50\x73\xcf\x92\x20\x99\x2c\x7a\x70\x78\x00\xbf\xbe\x82\xc1\xec\x4c\x1a\x15\x51\x93\x35\xd6\x88\xdb\xcf\x5c\xa7\x41\x45\x1a\x4a\xe3\xe4\x3a\x9e\x41\x7e\xa9\xe2\x89\x5c\x9c\xfd\x8d\x9f\x1b\xf2\xfb\x0c\xbf\x5f\xa8\x6f\x82\xf6\x5a\xc4\x69\xdd\x41\x1d\x95\xa7\xb4\xb2\x7c\x11\x31\x19\x9e\x86\xd7\x89\x93\x98\x61\xb5\x6a\x4e\x78\x86\x4f\x92\x59\x1c\xbc\x1a\x87\x51\xe0\x10\x14\xd7\x04\x98\x0e\x39\x98\xcf\xfe\x85\x4f\x9e\x34\x7a\x0d\xd4\x6e\xec\x0d\x75\x93\x6f\x7d\x71\x57\x8d\x65\x9a\xb3\x34\x22\x1a\x5a\x34\x16\x20\x87\x49\x9c\xb3\x38\xff\x23\x8c\x83\xe4\xb2\x25\xaf\x4e\xb0\xf8\x38\x9f\x44\xad\x94\x4d\x92\x0b\x56\x83\x90\xec\x73\x1d\xb8\xa0\x44\x13\x59\xa3\x95\x4c\x99\x88\x97\x51\xc8\xb8\x4c\xc3\x9c\x39\x51\x0e\x9b\xd0\xa0\x0e\x34\x60\x93\xd3\x7c\x13\x1a\x2a\x16\xee\x2f\xbb\xef\xc5\xf6\x63\x13\xa8\xe8\x96\x59\xb6\x0a\xee\x30\x4a\x32\x46\x2d\x56\xd0\x41\x15\xfb\xc5\x08\x13\x1d\x36\x9b\x2e\x04\x2c\x62\x39\x33\xea\x9c\xa8\xe9\x71\x7a\x62\x30\x8d\x0c\xd9\x2d\xdd\x3a\xa8\xf2\x8e\x90\x59\x25\xf5\xcf\x12\x30\x96\x15\xac\x94\x39\xa6\xc4\xd1\x07\xf6\x74\xb9\xb9\x23\xf6\x42\xef\x4d\x87\x0c\xb8\x45\xc0\x79\x6e\x60\x09\xbb\x4a\x4e\x39\xef\x55\x88\x92\x8c\x56\x35\x3c\x06\xe5\x15\x64\xf0\x92\x8a\xda\xfa\x4d\xec\xd6\x16\xf8\x41\x00\xf7\xd5\x3b\xfb\xfb\xb8\x51\xaa\x7c\x69\xaf\x4e\x5c\x8c\x06\x4f\xa4\x4c\xe2\x60\xdf\x1b\xc7\x01\x0a\x1f\x9b\x6e\x8a\x9c\x9a\x0e\x25\x35\x58\x54\xed\x71\x21\xab\x0c\xe1\x0c\xba\x55\x6b\xbf\x4b\x9d\x77\xad\x14\x3d\x38\x60\xa3\x3a\x8f\x82\x5d\xb7\x35\x92\x81\xfd\xeb\x84\xf9\x13\x69\x17\x7d\xbc\xff\x6b\x1d\x9c\xb6\xeb\x34\xa4\x26\x7f\xec\x9f\xa1\x35\xda\xd2\x9d\x92\x07\xb9\x7f\x46\xae\x6a\x8c\x53\x01\x5c\x9f\xf9\xfe\x94\xff\xc4\x88\x24\x39\xec\xf1\x8d\x54\x0f\xc2\xdc\x74\x90\x71\xbc\xff\xab\x8b\x6e\x70\x10\xd4\xf1\xfe\xaf\xc2\x67\x46\xc9\x70\x58\x18\x1b\xe7\xfe\x19\x5c\x55\x13\xb8\xbb\xd4\xf6\x7e\x25\x02\x0f\xf3\x79\x0d\x61\x1e\x3f\x17\xb4\x23\x87\x28\xd5\x92\xfe\x71\x47\x14\x12\x2f\x8a\x0f\xf3\xda\x7d\x69\xf7\xb1\x1c\x8c\x55\x17\xf4\x3c\x59\x1a\xa0\xbd\xd3\x79\x24\x0a\x9e\xb1\x9c\x37\xfc\x4b\xdd\x85\x67\xf7\xb1\x5c\xd3\x5f\x7e\x3c\xd8\xff\x87\xb8\x27\xe7\xdf\x1f\x0f\x8e\x7f\xfb\xf8\xce\x48\xd0\x43\xbe\x94\x07\x68\x47\xe6\x01\x8b\xf3\x34\x64\x99\x07\xa3\xd8\xc3\x6b\x1a\x0f\x0e\x8f\x0f\x3e\xee\x1f\xbf\xff\xa8\x65\x49\x28\x71\x93\x59\x96\x4e\x6a\xa8\xd0\x12\x2e\xed\x17\x54\xaf\x54\x7b\x6a\x2d\xe5\x93\x62\x98\xcf\x1d\xdd\xaa\x40\x04\xf6\xf0\xba\xa0\xa3\x57\x5d\xf3\x86\x0e\x17\x5a\x71\xed\x90\xe5\x6c\xea\x81\x54\x9e\xbd\x82\xc0\x13\x8a\xa3\xc0\xfc\x9e\x1d\x69\x99\xee\x76\xb4\x33\x1a\x89\x1e\x5f\x22\xe4\x8d\xb0\x4c\xbb\x47\x0a\xc0\xd6\x16\x8c\xfc\x2c\x87\xa1\x9f\xd1\xd5\x2d\x3e\xa1\xca\x48\x59\x91\x0a\xae\x44\x46\x1d\xb4\x29\x96\x72\x08\x11\xd7\xa5\x23\xa3\x48\xb2\x85\xe4\x10\x85\x82\x3c\x9e\xda\x11\xfd\x84\x17\x44\x81\x1d\xfa\xa3\x4f\x93\x94\x2c\xd4\x84\x1b\x39\x4a\x82\xcb\x38\x41\x02\xea\x09\x56\x3e\x75\x31\x56\x14\xcf\x3b\xe9\x9c\xba\x7c\x07\xe0\x14\x4b\xec\x18\x96\x8b\x99\xd4\xf5\x89\xe9\xbe\x7e\x05\x23\x8d\x18\xcf\x95\x23\xaf\xa9\x2f\x64\x35\xf6\xd3\xd8\x6f\x13\x01\xe8\xc0\x4b\xb3\x03\xdc\xb3\x50\xcd\x93\xb4\x15\xb3\x79\xee\xb8\x6e\x2b\x48\x62\xb6\x53\xea\xad\xae\x8f\x83\x3e\xa2\xee\xb4\xd4\x83\x06\xa4\xc5\x5d\xf4\x82\x8b\x2b\xb9\xbd\x93\x93\x0e\xff\xea\x64\x35\xf7\xe8\x47\x85\x78\xbb\x4b\xbb\xa0\x8d\x8d\xea\xe7\x1d\x0a\xcc\x7d\xbd\x6b\xbd\xef\x89\xb9\x4b\x02\x38\x9d\x31\x74\x4e\x29\x8a\x9e\x34\x04\xc3\x36\x4e\xd5\x5a\xfa\x71\x16\xa9\x53\x12\x7d\xa1\x5a\x1d\x66\xc1\x2d\x14\x5c\x76\x8c\x21\x8a\xa8\x2a\x47\x5c\xdb\xfd\x48\x27\x33\x95\xb2\x73\xbb\x5c\x74\x19\x7c\x55\xc8\xf0\xa8\x96\xc4\x0c\x93\x6b\x03\xe3\x3d\xae\x28\xbc\xac\x11\x5d\xca\xbd\xf3\x53\x05\x35\x16\xe6\xb9\x82\xbc\xcb\x23\xa5\xcf\x87\x74\x16\x69\xe7\x67\x85\xf3\x7e\x3d\x7e\x46\x0c\xa2\x98\x36\x37\xc5\xcb\x5a\x3c\x14\x7d\xf0\xc0\xb8\x4a\x6d\x9f\xa2\x66\x68\xaa\x4a\x56\x66\x0f\x1a\xb3\x98\x43\x0b\xd4\x4e\x26\x60\xc3\xc8\xba\x8e\x25\xb7\x19\x68\x3e\x3f\xe5\x28\x65\x56\x6e\x57\xe5\x7e\x46\x6f\x51\xa2\x4c\xeb\x73\x96\xa9\x27\x1e\x1c\xe4\x2b\x0a\x25\xe4\xb4\x3d\x6b\x58\x0c\x66\x75\x1d\x5e\xce\x55\xb5\x52\x62\xa3\xcf\x59\xd6\x9a\x46\xb3\xb3\x30\xce\x5a\x49\xfc\x4a\x93\x83\xa3\xed\x29\xd8\x9e\x6c\xd9\x95\x6b\x04\xaf\xaf\xa7\x3e\x4d\x00\x94\xf4\x87\x78\x83\xe5\xc7\xe0\xe7\x4d\x6c\x84\xef\x24\xc3\x1c\xf5\xb4\x38\x31\x07\x02\xe1\xf0\x76\x38\xad\xd0\x3e\xf2\x6f\xca\x6e\x03\x7b\x22\xa7\x88\xd5\x0d\xe1\x34\xac\x71\xf2\xdf\x47\x47\xa7\xf0\x5b\x7c\x1e\xa3\xc9\x85\x68\xec\xbf\xb2\x86\x87\x03\xa8\x7d\x4c\x49\xb7\x33\xec\xd2\x9c\x16\x06\xcc\x25\x7d\xbd\x2a\x49\xa5\xbb\x34\x4f\xbb\x03\xa9\xf4\xe3\xdd\xdf\x0f\x0f\xa2\x3f\x3c\x88\xae\xed\x41\x34\x0a\xe3\xf3\x25\x0b\x6a\x17\xb7\x90\x76\xd1\x65\x6b\x9d\x2c\xa3\x2a\xf1\x8f\x37\x61\x56\xb7\xd9\x79\xde\x29\x95\x5c\x06\x5e\x96\xf9\x4e\x0b\xe9\x5f\xd8\xe3\x28\x27\x19\xca\xf2\xa3\x31\x63\x55\xe7\x99\xea\x5b\x97\x72\xf0\xb0\x30\xd3\xe2\x7d\xa9\xa7\x44\x5d\x4f\x3e\x36\x41\x17\x1e\x7e\x9e\xfb\xc3\x31\x3e\x83\x33\xae\x8c\x31\x2b\x60\xd3\x28\x59\x54\x66\x71\xbe\xa8\xcc\xc0\xa6\xc9\x2f\xc7\x95\x91\xac\x55\x01\xcb\xe6\x5e\x24\xeb\x37\x13\x19\xc7\xaf\x87\x75\xe4\x4b\x86\xa9\x9f\xb2\xb8\x90\x26\x5a\xe9\x59\x6d\x5a\x06\x95\x86\x7b\x12\xdc\xc2\xf3\x81\x91\xba\xc6\x47\x91\x8c\x84\xb1\xca\xcf\x22\x44\x1d\x57\x56\xc5\xbf\xe6\xc2\x6a\x76\x46\x92\x51\x49\x58\x54\xb3\xf8\xaa\x81\xc3\x62\x1a\x0f\x4a\xd8\x2d\x3f\x08\xc4\xe2\x4c\x85\x4e\xf8\xc7\xa9\x6d\xfd\x67\x14\x17\x66\xb9\x8e\x5e\xfb\x51\x17\x04\x78\x08\xfb\x38\x6e\xc2\xb7\x0c\x8a\xc7\x3c\x21\x53\x2b\x72\xe2\x29\x6c\xaa\x80\x4c\xa3\x0a\x8e\x29\x35\x2f\x14\x5c\x53\x12\x37\xd4\xf8\xb1\xa1\x4c\xc3\xb4\x15\xb7\xd6\x26\x13\x29\xfd\x89\xa7\xee\x18\xa5\xee\x59\x0c\xe5\x9a\xfc\xe5\x28\xff\x3a\xd6\x98\xb5\x64\x6b\x65\x30\x82\xf9\x1e\x3c\xb0\x78\x0b\x93\x5d\xcd\x9e\x05\xb8\x06\x9f\x4b\xab\x16\xd3\xd0\x45\xe1\x2b\x06\x41\xd0\x19\xd0\x18\x67\x92\x5c\x30\x93\xd2\x68\xf2\x51\xa4\x33\x51\xba\xe4\x19\x28\x60\x4b\x28\x4a\x99\x05\x8a\xde\xbb\x9e\xa4\x36\xa5\x24\x94\xba\xfe\x1a\x73\x74\xa5\x0e\xef\x07\x81\xdc\x65\x08\x9e\x1a\xce\x52\xb4\x75\x21\xa6\xe5\x7c\x23\xbb\x0c\x7f\x84\x51\xc4\xe5\x22\x4b\x73\x59\xc9\x8f\xb2\x04\xfc\x51\x2e\x6c\x05\x75\x25\x54\x99\xd1\xa9\xb1\xc0\x3d\x80\x51\x98\x66\x39\xe4\xe1\x64\x29\x11\xfd\x20\xe0\xd3\xb1\x8e\x2f\x29\xd7\xd0\x7a\x4b\x22\x91\xb6\x08\xff\x9a\x31\xf4\x15\x89\x04\xc2\x0f\xe5\x4e\x70\x6b\x0b\x3e\xd0\xae\x01\xed\x99\xc5\x01\x3b\xcd\x42\x5d\xe4\x30\x86\x24\xc5\x51\x4f\x00\xed\x28\xd3\x0b\x72\x5f\x40\x36\x96\x98\xe7\xc1\x25\xc3\x67\x66\xbc\x10\xb5\xc8\xc5\xff\xa7\x96\x40\xf3\x13\x19\x42\x7b\x1a\x2a\x19\x89\x8d\xf1\x1e\xc7\xa0\x1b\x91\xe6\x93\x16\x1c\x2e\x55\x6d\x6d\xd4\x4d\x3f\x3c\xb3\xc5\x26\x5d\xa3\x8f\xb0\x0b\x27\xa7\x96\xb7\x51\xb1\x55\xaa\x94\x4b\x36\xf9\x2c\x96\x32\xf6\x6a\xc6\x16\xeb\x03\xc9\x28\x1c\x81\x54\xa8\x0a\xb5\xe2\x41\x5b\xf4\x56\x49\x05\x6b\xf3\x25\x0b\x6e\x6d\xc1\xeb\x24\x6e\xe4\x92\xc9\x10\x79\x32\x25\x8d\x16\xe2\x09\x47\xca\xe8\xa0\x0e\xc8\xd5\x4e\x38\x0a\x59\x00\x17\x2c\x45\x57\xd2\x0b\xc5\xad\x20\xf7\x73\xf8\xa2\x62\xc0\x04\x48\x16\xe0\x08\xe5\xc9\x19\x43\x7f\xd3\x68\x70\x27\x90\x06\x7c\x01\x12\x45\x2c\x68\x59\xa8\x0b\x2a\xe3\x9f\xd6\x74\x96\x8d\x45\xdf\x4b\x6e\x22\xb1\x8b\xd4\x8e\x49\x22\x5d\x40\x51\x49\x80\x34\x2b\x83\x31\x8c\xad\x51\x92\x1e\xf0\x79\x5e\x80\xe8\x81\xb1\x8c\x95\xab\x81\xb1\x9d\x37\xcb\x5c\x6d\x94\x7f\x55\xd0\xff\xca\x98\x20\x7f\x30\x3e\x37\x1a\x39\xde\xe7\xd0\x5a\x99\x27\xe0\x0b\x29\xc6\x02\x9a\xe9\x10\x27\x01\x6b\x59\xb5\x90\xdc\x29\xa3\x81\x26\x99\x80\xe2\x20\xe1\x3a\xd5\x2c\xe3\x24\xe7\x25\x24\xc5\xf3\x96\xc9\x75\x65\x2d\x64\xa3\x06\xdb\xb2\x24\x3b\x34\x58\x26\x8c\x85\x30\xd3\x8b\xdf\x12\x89\xa3\xe9\x5b\x23\x74\x8a\x43\x6a\x09\x1a\x63\xad\xd8\x2d\x08\xeb\x3a\x56\xa0\xe3\x49\x55\xad\x7a\x71\xc3\x43\x04\xa5\xb7\x5b\xa7\x08\x29\xb2\x82\x86\xe0\xd6\xd1\x44\x1e\x23\xc5\x81\x1e\x47\x5b\x9a\x8b\x95\xcd\x10\xe3\x74\x80\x46\xaa\xe9\xa5\x9f\x69\xf1\xad\xe5\xd4\x8a\x22\xbc\xce\xdb\xb5\xcc\xae\xd3\x69\xc5\x1b\x1d\x34\x3f\x26\x79\x46\xa9\xd7\x2a\x5f\x40\x95\x68\x8e\x92\x34\xb2\x96\x0b\x53\x0f\xd3\xad\x6a\x9f\x7f\x36\xb3\x21\xac\x3a\xca\xfe\xca\xd4\x12\x38\x58\x20\x42\xcb\x08\x72\xc6\x96\xb1\x97\xc8\x45\x24\x4b\xb6\x9d\x86\xe0\x3e\x63\xb9\xa3\x4e\x87\xaa\x90\x7a\x4d\x77\xd1\xd5\x78\x29\x43\xe3\x4f\x5c\x27\xfa\xd4\xe3\x5c\x88\xe5\xd4\x42\x4d\x57\xd9\x01\xa9\x3c\x7c\xb4\x5f\xbf\x7f\xbb\x5c\xdd\xe1\xe5\x97\x74\x4c\x17\x28\xf4\xad\x7a\x61\x32\xfa\x67\xaa\x48\xd6\x61\x9d\x2d\x16\x8c\xca\x64\x88\x70\xdd\xaa\xc4\xe7\x1a\x2f\xd2\x32\x26\x8f\xc1\x3e\x16\xcd\xb5\xca\xa5\x7a\x51\xac\x5a\x92\x9c\x05\x5b\xea\x3a\xce\xa1\xab\xad\x64\x24\x86\x6a\x19\x91\xc5\xa3\xa0\x5a\xc9\x44\x4f\x86\x6c\xb1\x54\x66\x1d\xab\x5c\x3d\xfb\xa0\xcc\x9e\xce\x52\x06\xaf\x8e\x8e\xc4\x02\x4b\x72\x5f\x77\x7a\x39\x47\x70\x08\xb5\xdc\x40\x5b\x80\xc2\x5e\x49\x93\xb9\x62\x87\x60\x2c\x08\x37\xd4\xe4\xdf\x84\xf1\xb9\x29\x9b\x79\x87\x68\x1d\x43\xf6\xa6\x45\x09\xef\xf0\xe8\x39\xc7\x30\x49\x53\x96\x4d\x13\x74\xd3\x06\x93\x24\x60\x51\xb6\xac\xab\x5c\x32\xd7\x74\x94\x76\x24\x16\xb3\x0f\x49\x69\xca\x4a\x4b\x84\x98\xfb\xb8\xed\x33\x74\xcf\xcc\x38\x97\x47\x15\xe5\xf7\x30\xcd\x67\x7e\x24\xb7\xb3\x5c\x55\x99\x65\x5a\x51\xe1\x8c\x2e\xdb\x70\xcd\x81\x47\x5c\x54\x8e\x45\x5b\xb5\xaf\xbf\x21\x65\x7f\x9b\x06\xd2\x93\x97\xea\xb2\x7c\x02\xc1\xe9\xe9\xe3\x9e\x1a\x5d\xcd\x2f\xa1\xdf\x0c\xa1\xd4\x50\x90\x32\xa5\x96\xea\xe7\x7e\xe5\x06\xbb\x5c\xea\x06\xbd\x78\x95\xc4\x17\x52\x5f\x10\xba\x8d\xe6\xf9\x65\x88\x4b\x83\x8b\x1a\xd4\x95\x65\x75\x69\x51\x2b\xcf\xca\x52\xd9\x5a\x57\xaa\x5a\x8f\xd9\xd9\xa0\x13\xc0\xca\x1b\x3d\xb3\x58\xf1\xec\x7f\xe9\x8b\xb3\x5b\x38\x3b\xac\x3e\xa1\xad\xf6\x66\x68\xdf\x08\x98\xf7\x01\x45\x0f\x86\xb7\xf5\x9b\x18\x66\x2f\xd3\xe4\x32\x63\x69\x8d\xff\x44\x95\x4f\xbe\x13\x2b\x2d\xad\x8f\x84\x4d\x77\x9d\x7d\x35\xe5\xb7\xf4\x55\xf7\xb7\x34\xae\xae\x45\xa6\xca\x00\x57\x14\x36\xcc\x6e\x05\xae\x2b\x9a\x4f\x93\x59\x8c\xa0\x10\xec\x2a\xa3\x8a\x4b\xb4\xdb\x5b\xd9\x20\x97\x8a\xbb\xae\x1d\xaf\xc8\x08\x66\x14\x28\x03\xc1\x15\x21\xca\x0a\x02\xa6\x7a\x65\xf4\xe0\x81\x82\xd5\xe2\x7b\x12\xe5\xb5\xe4\xf9\xce\x3a\xae\x43\x45\x31\x72\x20\xaa\x08\x51\x11\xe4\xb1\xbb\xf4\x9d\xcc\x5f\x63\x56\xd1\x60\xbe\x65\xe9\x19\xe3\x2b\xa1\x32\x60\x32\x9e\x16\x16\x32\x1d\xe9\x69\x72\xe3\x27\x35\x5d\xde\x25\xf1\xbb\x59\x14\x59\x05\x36\x7e\xfa\xe9\xc1\x03\xb8\x17\x66\x47\x53\x36\x0c\xfd\x48\x26\x5b\x16\xf8\xd5\x55\x0d\xd8\xf7\xee\x51\x5c\x0f\xcd\xeb\x22\xce\x87\x31\xc0\x56\xe0\xd3\x62\x7b\x1c\x16\x39\x03\xe4\xc2\xf4\x77\x11\x24\xa4\x74\x83\x27\xa5\x2d\xdd\xdd\x51\xd5\x9d\x0d\x85\x86\x55\x9b\x37\x7d\x22\x6c\x98\x3f\xb2\xb3\x83\xf9\xf4\xb4\xb1\xf1\xd3\x4f\x5f\xbf\xd6\x17\x7b\xed\xe7\x4c\x16\x0a\x33\x7c\x6e\x2f\x1d\x78\x4b\xb2\xa0\x81\x74\xc6\x98\x7a\x34\x7a\x16\xe6\xe3\xd9\xa0\x35\x4c\x26\x5b\x23\xf1\x42\x77\x0b\xbd\x61\x6f\x0d\xa2\x64\xb0\x35\x78\xec\x0f\x9f\x3f\xd9\x1e\x0d\x9e\x3e\xef\x04\x9d\xee\xf3\x67\xec\xe9\x68\xfb\xf9\x93\xee\xf6\x93\xed\x67\xdb\x83\xe1\xf3\xc7\x8f\x47\xcf\x3b\x4f\x86\x9d\xad\x2c\x1d\x6e\x85\x59\x32\x49\xd2\xe9\x38\x1c\x6e\xe1\x21\x79\x38\xdc\x12\x4e\x29\xb7\x4c\x64\x5a\x9f\xb3\xff\x78\xd3\xed\x34\xdf\x74\x1f\x0b\x13\xb9\xf8\xb7\x8c\x49\xe9\x52\x21\x6d\xb4\xf9\x14\x1f\x21\x21\x47\x46\x49\x2a\xad\xd0\xf6\x5f\x1d\xf7\x0f\xde\x1c\xbc\x3d\x78\x77\xdc\x17\x46\xe1\x16\xcc\x3d\xa3\x8e\xd3\xc0\xde\xb5\x04\x62\x0d\x7c\x80\x35\x67\xfe\xf0\xa9\xcd\x31\x15\xd4\x33\x18\x06\x13\x5a\xff\xf9\x9f\x52\x5e\xa3\x35\x4f\x11\x0d\x3b\xca\xf2\x64\x9a\x2f\x8e\xf1\xd2\x90\x83\x33\x81\xd9\x51\x45\x30\x73\x0f\x4e\x4e\xa1\x07\x5f\xae\x2c\x18\x68\x99\xf0\x5b\x1c\xb1\x2c\x7b\x9f\x8f\x59\x7a\x19\x66\x0c\xf9\x70\x14\xb2\xc0\x11\x66\x48\x62\x21\xdf\x17\x37\xcd\x8a\x35\xb1\x32\xec\xc2\xbd\x42\x01\x7c\x1e\x69\x27\xb5\xa8\x2c\x17\xda\x72\xb3\x23\x71\x75\x28\xeb\xc1\x83\xda\x29\xcb\xa7\xe4\x1e\x04\x8c\x4d\x27\x3c\xdf\x29\x74\x7c\xc6\x5c\x0f\x6a\x50\xdd\xf8\xe9\x27\xe1\x1e\xd6\xea\xb6\x10\x85\x48\x1e\x6c\x53\x5d\xbe\xca\xdb\xef\xaa\x3e\x5b\x17\xdd\xf2\x91\x9a\xb8\x61\xb7\x23\xeb\x0a\x56\xc0\x5a\xb2\xda\x72\x52\x8b\x1a\x55\x3d\xb8\x72\x2d\xdc\x91\x06\x82\x3e\xab\x60\x2d\xae\xc5\xf3\x30\x96\x8e\x2f\xbf\x5c\xed\x6c\xfc\x44\x16\x7d\x45\x82\x0b\x8b\x04\x42\xdc\x7c\x8b\x2a\x32\xd4\x19\x9e\xea\xaa\x78\xc5\xf7\xd3\x4f\x3f\x19\x8d\x48\x6b\x81\xe5\x7d\x36\x2c\x0b\xca\xa8\xef\x6c\xfc\xf4\x13\x17\xf4\x3f\x5d\x6d\x58\x88\x48\x7a\xd7\x23\x82\xfb\xeb\x72\xd7\x0c\xcb\x05\x7a\x93\x6a\x34\xbf\x6e\x0f\x0c\x98\x35\x3d\x90\x0f\xbf\xab\xa1\x6b\x9e\xb6\x68\x71\x3d\xd8\x0d\xa2\x8d\x8c\x80\xa5\x21\x17\xd8\xdc\x06\x7f\x3d\xa3\x50\xfe\x21\x09\x0e\xe9\x05\x43\x09\x12\x41\xfb\x1d\x2a\x4b\x30\xeb\xca\x0a\x86\x11\x65\xf5\xf5\x69\x85\xac\xf8\x42\xd6\xa7\x38\x60\xbd\xf2\xdc\xe4\xca\x9b\x81\xdc\x7e\x1c\xd0\xdc\xc7\xf8\x09\x6f\xd1\x85\xca\x6e\x11\xf1\xdd\x5d\x1b\x3d\x2e\x6f\x28\xc2\x65\x1d\x8c\x1b\xcc\xd5\x3a\x22\x6e\xfc\x64\x38\x7f\xb3\x10\x22\xe0\xe4\xa4\x47\x75\x4b\xdb\x8e\x19\x89\x5f\xbf\x96\x09\xb0\xa3\x11\xf3\x57\x97\x58\x1b\x26\xf3\x89\xea\x37\x91\x1d\x7c\xe6\x5d\x6d\x6c\x28\x1e\x6a\x91\xd9\x79\x99\xb9\xf6\xa3\xc8\xa1\x08\x0c\x95\x6c\x85\x64\xb7\x79\x03\x4b\x0b\x21\x53\x72\x4c\x43\xa7\xb1\xd2\xac\x09\xb2\x71\x32\x8b\x02\x18\x30\x34\x60\xe3\x15\x1b\x88\xda\x86\x45\x92\xa2\x77\x60\x67\x9a\xb2\x0b\x0f\x62\x36\xb7\x85\xb0\x9e\x11\xba\x40\x65\xd7\xd1\x39\xde\x86\xdc\x36\xa8\x6a\xfd\x8e\x39\x6b\x6f\xaf\x86\x1b\x80\xab\x14\xf1\x55\x9e\x62\x7f\x7f\x83\xdb\xd6\x90\x8e\x19\x5e\x25\x51\x92\x1e\x0b\x05\x94\xcb\xca\x8a\xe4\x52\xa5\xbf\xb3\xf9\x71\xf2\xf1\xd7\x97\xba\xbc\x4c\xd9\x31\xde\x9f\x0e\xd1\xdb\x0f\x43\x50\x48\x71\x33\x41\x17\x3c\x63\xf9\xab\x24\xce\x53\x3f\xcb\x3f\x72\xf1\x07\xbb\x50\x4c\xb2\x0a\xbf\x99\x4d\xc2\x18\x0d\x61\xb0\xa0\xfa\xd4\x85\xd8\x64\x3a\xf6\xb3\xf0\x4f\x46\x7e\xc6\xe8\xb7\xce\x1e\xf9\x01\xc3\x7b\x9c\xc0\x48\x0c\xfc\xf4\x1c\x5d\x82\xd1\x0f\x9d\x11\x85\x67\xe3\x1c\x73\xc4\xaf\x1d\xae\x2b\xc3\x25\xf3\xcf\xf9\xf8\x96\x5d\xc2\xcc\x32\xd6\x1c\xb0\x51\x92\xb2\x26\x8d\x92\x70\x1e\xf3\xd0\xf4\xa9\xe1\x03\x05\xaf\x80\xcb\x71\x92\x09\xa7\x1a\xe4\xe5\x66\x12\xe6\x74\x6b\x9b\x8f\x19\x9c\x85\x17\x2c\x26\x5f\xbc\xca\x35\x0d\xf9\x60\xff\x42\xf5\xaf\x44\xd5\x63\xe9\x99\x83\xd7\x1c\x30\x18\x46\xfe\x64\xca\x82\xaa\x0a\x93\x30\xc6\xe2\x51\x72\xc9\x52\x18\x24\xb3\x38\xf0\xa5\x37\x1c\x06\xc9\x2c\x9f\xce\x72\x6a\xb2\xb2\xb6\x3f\xc7\xda\xb3\xe9\x74\x95\xda\xa9\xe8\xaf\xaa\xbf\x2f\x3b\x2e\x7d\xf2\xa0\xeb\xe1\x93\x49\x18\x7b\x1c\xf6\x69\xc1\x90\x98\x77\x43\xaa\xb0\xb2\x8c\x7e\x20\x44\x3d\xfe\x99\xe7\x14\x9c\x67\xa0\x6f\x06\x3a\xb0\xd2\x05\x5f\xe8\xda\xba\xa0\x3f\x97\x05\x4d\x25\x7e\xc7\x70\xd3\x22\x0e\xe4\xc8\xfb\x18\xe7\x65\xf3\x09\x29\x1e\x59\xf8\x71\x20\x0f\x1a\xf1\xbc\x4e\x9d\xd5\x59\x23\x96\x08\x27\xf8\x04\xa4\x09\xaf\xe5\x84\x08\x28\xc9\x2c\x9b\x49\x07\xfb\x3c\xa3\x85\x8d\x34\xe1\x7d\xcc\x20\x19\x79\xd0\x48\xcf\x06\x0d\xfa\x83\xb1\x3e\xc7\x59\x24\xfe\xf8\x0d\x13\x08\x4a\x55\x09\x43\xe0\xd7\x84\x93\xd8\x8b\xbd\xf8\x14\x92\x54\xfc\xf4\xe2\x53\x7b\xac\x64\xe3\xfb\x78\xf0\x48\xe8\x52\x5a\x61\x74\x2a\x64\x85\x83\xc5\xb5\xd5\xb7\x88\x79\xac\xfb\xe1\xa9\xc3\x67\xc4\x67\xd7\x42\x6f\x67\xc3\xf4\xf1\xa2\xfd\x8e\xf1\x0e\xbb\xf0\x02\x9a\x1d\xc3\x79\xd0\xfb\x38\x5a\x48\x1c\x8c\x3b\xc0\x6d\x63\x28\xc2\x38\x07\x27\x6c\xb1\x16\xbe\x9f\xf1\xa3\xe9\xd8\xa7\xe8\x50\x55\x06\xa9\xdb\xfc\xcf\xe6\x2e\x74\xcc\x13\x72\x0e\x89\xa2\x88\xa3\x4f\xe9\x43\xb9\xed\xe3\x89\x1e\x74\xda\x6e\xc1\xbb\x09\xee\xa9\x78\x8f\x94\x44\x35\x3c\xa6\x97\x3b\xc6\x87\xce\xee\x98\x5d\xd9\x18\xff\x4d\x68\x38\x0d\xd8\x94\x38\xb5\x4f\x79\x8a\x07\x46\x52\x07\x93\xfe\xcb\x4a\xeb\x52\x5a\xa3\xe4\xc1\xe8\xd6\xed\x14\x9a\xb1\x3c\xf4\x50\xaa\xb4\xf0\xe7\x9a\xdc\xa3\xaa\xfe\x6d\xee\x4a\x30\x26\x13\x9c\x6c\x23\x7c\x77\x39\xce\xbc\xae\x28\x62\x1c\x47\x1b\x25\x96\x4e\x61\xbc\x6a\xe1\xdc\x3d\x66\x73\xe1\x32\x8f\xf3\x0b\xde\xc5\x9c\x0d\xa4\x63\x45\x31\x81\xab\x67\x25\x34\xe1\xef\x6c\x4e\xbf\x3d\x40\x26\xfb\x8f\x38\x8e\xf9\xbc\xe2\x7f\xe3\x38\xa6\xba\x35\xd3\x8a\x37\x73\xed\xd4\x92\xcb\xaa\x39\xab\xf0\x46\x05\xc9\x55\x45\x5e\x7a\x6f\x97\xb3\x38\x60\x81\x5c\x79\x1b\xff\xd1\xd8\x29\x73\xbd\xb0\x50\x37\x41\x95\x27\x80\x0d\x6a\x53\x32\xca\x70\xec\xa7\xfb\xb9\x13\xba\x6a\xe8\x54\x8a\xe9\x02\x72\x28\x10\xb0\xa0\x58\x3e\x95\x94\x14\x10\x42\xb9\xa7\xa7\x19\xc1\xcd\x66\x83\x2c\x4f\x9d\x8e\x07\x5d\xd7\x83\xce\x13\xe1\x18\xfe\xac\xae\xe0\x76\xa1\xe0\xa0\xae\xe0\x63\x55\xb0\x18\xa8\x82\x4b\x1b\x63\x06\xb4\xd2\x22\xb7\xb7\xce\x4a\x29\x03\xc9\xb1\x57\xe5\xa5\x3e\xb6\x17\x0c\x19\x69\xc5\x58\x34\xf0\xbe\x95\xb0\x13\x2c\xf7\x2e\xc9\x59\x0f\x5e\x27\x8c\x5e\xfe\x65\xb3\x29\xea\xa3\x9c\x69\xfe\x4b\xb6\x59\x58\x5e\x8a\xcc\xa9\x64\xb7\x60\xce\x04\x57\x8f\x1e\x32\xa7\x27\x59\xd4\xe3\x20\x1d\x17\xff\xf8\xfc\xef\x38\x8b\xc4\x1f\xdf\x71\xed\x65\xe1\x0b\x79\x47\x90\xc1\xe6\x08\x8b\x9e\x58\xcf\x4f\x4e\xaf\x38\x67\xbf\xfd\xed\xd0\x5a\x24\x6d\xae\xb6\x55\xc0\x6a\xa6\x16\x8c\xd4\x16\xe7\xe8\xff\xd1\x28\x2c\xd8\x25\x18\x55\x13\xc5\xb5\x98\x6c\xc2\x55\xba\x54\x49\x39\x25\x7c\x1d\xed\x48\xc1\x5a\xa6\x88\x43\xf8\x62\xd6\xf6\x44\x65\x55\xb0\xb0\x6c\xe9\xa2\xa2\x91\x4d\xe8\x78\xd6\x9c\x82\x26\x74\xdc\x56\x36\x8d\xc2\xdc\x69\x78\xb2\x45\x01\x44\x8c\xa4\x1d\xf8\x5a\x1d\x2b\x1a\xbd\x46\x1e\xfe\x25\x4a\xfc\x5c\x9d\x0f\x93\x99\xb1\x66\xdb\x2f\x40\xe3\x43\xe6\xfe\x72\x74\x44\x53\x57\x96\x34\x94\x41\x8f\x32\xe9\x79\x18\x55\x6d\xc0\xb0\x3c\xda\x21\xdc\x65\x42\x1d\x51\x9c\xf6\x4b\x92\x4e\x66\x91\xdf\xc3\x53\xe2\xde\xd6\xd6\xe5\xe5\x65\xeb\x72\x1b\xdd\x09\x1e\x7f\xdc\xea\xb6\xdb\xcf\xb6\x3e\x1e\xbc\x6a\xfe\xf1\x6a\xff\xd7\x6e\xbb\xc9\xbf\x3b\xdd\x4e\x67\xeb\x3f\x64\x03\x4d\x6c\x20\x60\xa3\x1a\xce\xe5\x3a\xf3\x59\x8a\x8e\x1c\xef\x8e\x7d\x0b\x6d\x0c\xfc\xe1\xf9\x9d\xb7\x51\xa1\xe5\x16\x88\x2a\x14\x7c\x53\xe7\x6d\x43\x13\xba\x1d\x12\x0a\x5d\x08\xc2\xb3\x30\x87\x69\xca\x86\x61\x16\x26\x71\xe1\x41\x5d\x71\x43\xe4\x68\x52\x79\x46\x97\xb4\xda\x15\xcd\x26\xfb\x85\xfd\x91\x51\x47\x71\x73\x34\x9b\xbc\x2c\x16\x33\xc0\xed\x28\x85\xc6\xde\x9f\x39\xe4\xff\xcc\x9f\x3b\xbc\x1d\x0f\xc1\xf0\xa5\xa0\xdd\x6a\x3f\x76\x61\x4b\xe6\x87\x71\x55\xbe\xc9\xb3\xef\x90\x5e\x8e\x05\xbf\x95\x27\xbf\x84\x73\x16\x38\x5d\xd7\x45\x27\x21\xc7\xe9\x2c\x1e\xa2\xb5\x58\x8e\x4c\x89\xa4\xca\x0c\x7e\x3e\x46\x83\xf3\xc8\xcf\xc3\x0b\x06\x03\xb4\x82\x8d\x59\x46\x62\x35\x5e\xc0\x34\xe1\x6a\x60\x18\xab\xc5\x3f\x9b\xfa\x43\xae\x87\x3e\x84\x98\xaf\xf3\x51\xf8\x27\xed\xb8\xda\xb8\x40\xe2\x06\x30\xcb\x01\x03\x06\xa2\x94\xee\x60\x3a\x6d\xff\xb2\x1c\x2e\xc7\x61\xce\x2a\xe7\x44\x66\x4f\x8a\x3f\xf6\x0f\xb7\x7e\x7d\xb3\x75\x19\x9e\x87\x5b\x1f\x05\x7e\xfd\x48\x12\xfa\x7b\x8b\x6f\xc9\x9b\x4b\xa8\x45\xd2\x80\xb7\x5f\xe2\xd4\x4e\x89\x21\x35\xc7\x14\x54\x7e\x25\xa1\x83\xea\xad\xbf\x28\xaf\x34\xe2\x42\xf9\xd6\x75\xaa\x3f\xda\x68\x9d\x0d\x4c\xb8\xa2\x66\x9d\x38\xb5\x14\x7a\xd8\xda\x85\xee\xe3\xc7\xc8\x5a\x7a\xfc\x6d\x53\x08\x5e\xec\xe7\x5d\xce\xaf\xdb\xcf\xbb\xcf\x60\x8f\xea\x41\xa7\xdb\x7a\xde\x85\x1e\xf9\xc7\x9b\x26\x97\x0e\x07\x2e\xf8\x1a\x19\xbf\xc3\x7f\x78\xd0\x6d\x3d\x72\x6d\xd7\xda\x05\x36\xde\x96\x4c\x6c\xb4\x29\xe6\x82\xd3\x6e\x75\x3b\xdd\x27\xf0\x90\xf7\x91\xb4\xef\x76\xeb\x69\xe7\x71\x57\xa4\x74\x28\xa5\xfd\xb4\x2b\x53\xba\xa7\xae\x9a\x33\xdb\x62\xe9\xd3\x67\x98\xcb\xa9\x5b\xde\x7f\x14\x97\x59\x8b\xb4\x7c\x3b\xb1\x05\x9d\x76\x5b\xad\xaf\xa5\xa3\xbf\xb7\x7e\xce\xd2\xd0\x8f\x9a\xbf\x1d\xf6\x60\x16\x0b\xcd\x85\x05\xf0\x49\xe9\xf9\x5c\x57\xfa\x24\x16\xc9\x86\x6b\xae\x4c\xaf\xe9\x14\x46\xcd\x36\x39\x67\x67\xa9\x07\x01\x9b\x32\xb2\x81\x4a\x62\x08\xf3\x0c\xd4\x4c\x42\x6f\xa5\x6f\xd0\xf8\x9d\x16\x2c\xf4\x48\x4a\x07\x39\x2c\xf0\xf0\x97\x99\x23\x60\xa3\x91\xd2\x77\x99\x83\x85\x33\x94\x61\xc2\x46\xa3\x70\x18\xb2\x38\xdf\x6d\xb7\x3a\x8f\xa1\x09\x93\x59\x94\x87\xd3\x28\x2c\x1e\x8c\xc8\xa9\xb7\xd2\xee\xbc\x85\x1b\x92\x30\x9e\xce\x72\xb9\xee\xf3\xee\x52\x4d\x16\x80\x9f\x71\x1c\xed\x89\xac\xce\xc7\x8a\xb3\xd8\x40\xb2\xfa\xd5\x76\xc7\x7e\xb5\xdd\x59\xf6\x6a\xbb\x73\x0a\x3d\xe0\x5d\x35\x85\x7f\x95\x0c\x79\x01\xed\xd6\x63\xd8\x13\x83\xe7\x08\xe2\x1b\xb8\xb8\xd0\x93\xe3\x57\x95\x6b\x32\xd3\x11\xa3\x63\x01\x7f\x90\x25\xd1\x2c\x67\x90\xa7\x7e\x9c\xe1\x4b\xae\xe1\xa2\xa0\x73\xc3\x3e\x9a\xf6\x84\x19\x7a\xde\xc5\x83\x02\x93\x84\xc9\x05\x4b\x2f\xd3\x30\xcf\x59\xfc\x6f\xe2\x19\x52\x20\x9a\xfa\x90\x2f\x93\xbd\x43\x5c\x87\x63\x3f\x8e\x59\x44\x67\x1e\x36\xff\x7c\x53\xf6\x19\xf9\x01\x93\xe3\x60\xe8\xad\xc3\xe5\x82\x1f\xa4\x21\x85\x7d\xc0\xd7\xf6\xd0\xc9\x8a\xb5\x1d\xc8\x55\x94\x1f\xbe\x10\xc0\xd7\xaf\x50\x4c\x27\x11\x66\x1c\x10\x88\x63\x8c\x5d\x68\xf8\x0d\x79\xb6\x57\x3c\x5f\x90\xb1\x41\xad\xa3\x83\xda\xd3\xac\xb2\x88\xca\x8a\x1b\xb6\x7f\x9f\x08\xf9\x77\x4a\x8f\x25\xd3\x74\x25\x36\xb0\x85\x0c\x31\x83\x91\x56\xcf\x12\xd7\x9e\xa0\x19\x0b\xd6\xc3\x5d\xe8\x40\xd3\x6c\xab\xb0\x44\x56\x81\x2d\xab\x1d\x2b\x1e\x19\x5a\xad\x87\x75\xad\xcb\x13\xc3\x9b\x72\xdf\x1b\x12\x7d\x3f\xd8\x4f\xd8\x33\xd7\x2e\x04\x7f\x21\xfe\xdb\xdc\x05\xa7\xd3\x6e\x23\x13\x58\x39\x2e\x3c\xfc\x77\x71\x25\xc7\xa9\xfb\xf8\x71\x11\xa7\xb0\x0a\xa7\xb2\xef\xee\x15\x98\xd5\xbc\x01\x5d\xd9\x61\x73\xa9\xe6\xdd\xfa\x62\xbe\x23\xb7\x20\x6f\x93\xc0\xaf\x73\xde\xf6\xb8\xdb\xe6\xe5\xae\x69\x49\x99\x46\x53\x33\xa5\x98\xd7\x1b\xc0\x95\x23\xfb\x21\x8e\x53\x50\xd0\xeb\xbc\x19\x20\x76\xae\x74\x62\x2b\xfc\x46\xdd\xbd\x6b\x83\x0a\xcf\xc3\x85\xb1\xbb\x9d\x6f\xdb\x6f\x34\x76\x61\xfc\xfa\xfd\xdb\x3a\x3f\x4f\x8f\xed\x62\x4b\xdd\x6c\xf3\x02\xdf\x85\xaa\x65\x7f\xce\x15\x4e\x66\xff\x7e\xfc\xf6\x0d\xf0\x9e\xf9\x71\x00\x47\xbf\xff\x8a\xbf\x27\xfe\x02\xc6\xfe\x05\x33\xc2\x04\xc8\x73\xe4\x88\x5d\x30\x7a\xfd\xbb\xb5\x05\x59\x62\x3e\x16\xa6\x40\x1a\x74\x05\x91\xb3\x39\xbe\x78\xcd\x99\x1f\x90\xc2\xac\xec\xa2\x31\x96\x8a\x30\x78\x6b\x6d\x98\x5c\xc9\x29\xa7\xb0\x35\x8d\xcd\x05\x40\x0f\xdf\x66\x9a\x11\x08\x44\x06\xfa\x60\xf5\xc3\x8a\x97\x09\xc5\x02\x0e\x42\x28\xc5\x6a\xd4\xc5\x30\x1e\x8b\x74\x8d\xfa\x41\x44\x71\xaf\x03\x4b\x11\x20\x92\x00\x0d\x77\xee\xdd\xbb\x0e\x0c\x35\x0e\x0f\xa0\xf3\xc4\x46\xa1\x1c\xfb\x20\x1a\xf8\xc3\xf3\x42\xbf\x0d\x89\x0a\x3d\x55\x48\x3e\x9e\x30\x14\xeb\xca\xda\xea\xb0\x9c\xbe\x82\xc4\x20\x23\x76\x81\xf7\x45\x54\x71\x4b\x01\x34\xa4\x7f\x58\x2a\x49\x6f\x64\xc9\xb3\xc5\x3b\x42\x6d\xa3\x18\xb9\xe1\xaa\x22\x54\x61\xe9\x7d\x47\xf9\x49\xc7\xed\x9c\x94\x7e\x33\x9b\x17\x3d\x87\x92\xcb\x98\xa5\xda\xf3\xb1\x22\xbb\x95\xee\x68\x92\x4b\x6f\x57\x09\xc5\x1f\x45\xca\x59\x65\xd1\xe8\x4b\xc1\x5b\x42\x36\x6d\x3b\x54\x22\xdb\xf6\xed\x5c\x8f\x7e\x23\x91\x79\x38\x4c\xe2\x97\xb3\x3c\xaf\x0d\x7d\xf8\x98\x1c\xe4\xfd\x1b\xd7\x3c\x8d\xe2\x5f\x60\xe1\xdb\xfe\x8b\x79\x58\x14\xa3\x88\x8a\x75\x8d\xfb\xc4\x67\x8f\xff\xdd\x03\xc8\xb1\xab\x1a\x3b\x8d\xfb\x7e\x90\xa4\xb1\xf0\xd9\x5d\xed\x5a\x77\x25\xcd\xcb\x86\xf5\xcd\xfa\xa2\x5a\x58\xde\xa9\x37\xfe\x80\xd5\xaa\x92\xe4\xc6\x6a\xa5\x0e\x21\x9c\x6f\xd6\x19\x84\xfe\x57\x98\x59\xff\xc6\x20\xb6\x77\xb8\x0a\xd1\x63\x7f\xdb\x25\x86\xe5\x70\xb0\x5b\xe7\x25\xb4\xe8\x99\x70\x7b\x89\x86\x2a\x61\xa9\x3a\x36\xe2\x75\x6d\x3c\xad\x29\xbf\xac\xa9\x02\x64\x05\x81\x4c\x00\xfe\x08\xf3\x71\x32\xcb\xb5\x6f\xb9\xba\xa6\x1f\x5f\x57\x71\x19\x0e\x75\x6d\x29\x98\x29\x1b\xa1\xe5\xe6\xdf\xc2\x78\xcc\xd2\x30\x67\x81\x0e\x42\x49\x6b\xc7\x4b\x3f\x63\xaa\xb0\x5f\xeb\x4a\xbb\x63\x80\xf4\x87\x4b\x3d\xcb\x61\x01\xc3\xb1\xab\x9f\x65\xb1\x3f\x61\x75\x9e\xd5\xbb\x15\x45\x97\xfb\x80\x95\xa5\xb4\xfb\xdb\x30\x1f\x1f\x49\xfe\xaa\xdc\xe4\x54\x14\x5d\xea\x2c\x57\x95\x52\x15\x35\xb5\xea\xf8\xf4\x71\x45\xd9\x65\x8d\xe8\x52\x86\xa7\x5d\x36\x5d\x26\x1d\xb7\xdb\x4f\xcb\x65\x97\x7b\xe5\x15\x85\xbe\x8b\xe0\xe2\x78\x0d\x78\x6b\xe4\xcf\xe9\x97\x28\xb9\xc4\xa7\x63\x1f\x44\xbc\xd4\xac\x2f\x03\x9f\xf6\xc5\x6b\xb2\x5a\x6e\x6b\xdd\x10\xce\xd7\xaf\x95\x80\xda\x6e\xcb\x8f\x17\x3b\x37\x42\xed\x7d\x1a\xb2\x38\x97\x4f\x8e\x2a\xc5\xc5\xf3\x95\xf1\x33\x81\xad\x82\x63\x98\xc9\xf1\x37\xde\xdf\x61\x92\x33\x1c\x87\x51\x60\x29\xe6\x98\x82\x21\x8c\xe8\x1d\x1f\xc6\xfd\x48\x59\xdc\x1a\x26\xb3\x38\x97\x15\x28\x9e\xe3\x83\x07\x54\x9c\xee\x09\xac\xaf\xd6\x64\x16\xbe\xf3\x27\x75\xa9\x78\xdf\xa0\x18\xa9\xb1\xa3\xde\x16\x28\x91\x5e\x92\xf1\x3a\x06\x22\xa6\x38\x16\xd6\x62\x09\x4e\x92\xbc\xa7\x76\x8f\x22\xea\x4a\x0f\x1a\xa3\x88\xcd\x1b\xd2\x5c\xd6\x8f\xc2\xb3\xf8\x30\x67\x93\xac\x07\x8d\x21\xe3\x5c\xdb\xd0\xce\x09\x83\x20\x8c\xcf\xde\xb0\x51\xde\x83\x76\x21\xf5\x63\x78\x36\x36\x93\xb5\x79\x47\x4f\xc4\x75\xa1\x0d\x29\xe5\xfb\x51\xce\xd2\x18\x6d\x03\xb0\x8f\x1a\xaf\x89\x9f\x9e\x85\x71\x0f\x1a\x6d\xf0\x67\x79\xd2\xd0\xdb\x58\x4d\x86\x15\x39\x81\xab\xeb\x35\xfc\xd4\x76\x5b\x49\xcc\xde\x8f\x78\x0d\xe7\x44\xbc\xa3\xbc\xe9\x44\xb2\xdf\x86\xee\xdd\xb4\x7e\xaf\x0e\xb3\x6c\xec\x4f\x99\x73\x33\x68\x6e\x75\xe8\x5d\x0e\x4d\xd8\xd1\xd5\x64\xd3\x51\xfb\xa9\x7b\x33\xd2\xa2\x8f\x56\x61\x4e\xa9\xbc\x34\xfe\x2d\xc4\xf0\xcb\xf4\xf1\xc1\xcf\x32\x86\x91\x72\x2f\x42\x1f\x3e\x71\x6e\xfe\x04\x4d\x98\x52\xb2\x8c\x39\x9a\x27\x94\x85\x4c\xf0\x49\xba\x70\x04\xf0\x87\x9c\x35\x6a\x29\x34\x48\x92\xc8\xdb\xa8\x6d\xfb\x08\x3d\xcc\x20\x87\x45\x11\x46\x3b\xe5\x6d\x4c\xa5\xb7\xb3\x30\x6f\x64\x78\x44\x15\x85\x2c\xd0\xd6\x92\x45\x9e\x04\x19\xc8\xcf\x40\xab\xc4\xb6\x2b\x23\xf8\x8a\x22\xeb\xfb\x66\x7f\x21\x49\xc1\xa7\xcd\x7e\x9e\x00\x06\x57\x87\x30\xce\xc2\x80\x59\xa5\xfc\x8c\x84\x44\x8a\xb7\xc2\x02\x15\x99\xa2\x7c\x17\x7c\x5f\xee\x6d\x85\x99\x58\xcb\x82\x5b\xd5\xed\xfd\x7b\x67\x8d\x81\x4a\x3d\x3f\x21\xb9\xa5\x13\xd6\x3a\x69\x82\x7a\xe1\x0a\x30\xb8\x80\xaf\xef\x03\xcd\xd5\xa5\x9c\x9d\xc1\x30\x99\x4c\xc9\x51\x15\x17\xf6\x78\xa7\x75\x98\xa9\x99\x95\x80\x62\x1d\x83\x5b\x64\x95\x75\xa7\xd4\x6b\x7a\x78\x44\x96\x9c\x03\x3a\xa6\xc1\x20\x63\x1c\x21\xf1\x2a\xe9\x06\xf8\xc8\x1a\x37\x40\xe7\x78\xcc\x20\xe4\x12\x5d\xac\x5c\x2c\xe0\x13\x9b\x7c\x6e\xb2\x29\x44\x76\x03\xbc\x64\xfd\x60\xfd\x10\xfd\xa6\xe8\x5f\xce\xb5\x91\x9f\xe5\x6b\x72\x0d\xaf\x4e\xef\x25\xfd\x9b\x88\xca\x12\x08\xad\xd1\xdd\x54\xda\x59\x9a\xe5\x9a\x83\x66\xc0\x58\x4b\xea\xd5\xd4\x5f\x59\xf2\x99\x7d\xb8\x1b\xc6\x31\x20\x9a\x12\x90\xc2\x54\x19\xbe\xb7\xd9\x94\x76\x4c\x8e\x74\xb0\x2f\x6c\xb6\x68\x75\x96\x5e\xf3\x5b\xf4\xa9\x35\xc8\xc2\x32\xaa\x8a\x15\x32\x94\x7f\x6b\xb1\x92\xa9\x82\x32\xc1\x72\x80\xcd\xe5\x26\xef\x8a\x2e\x25\x53\x55\x31\x25\x16\x55\x11\x99\x52\x70\xa5\x6d\xc3\x60\xca\x3d\xad\x92\x63\x32\x5f\x26\xc8\x02\x21\x69\x94\x94\xc9\x3f\x64\x06\x9f\x24\x2a\x83\x7f\xc8\x0c\xc9\xfe\x2a\x53\x26\xa8\x02\xd6\xde\x47\x94\xd1\x69\xaa\x18\x3a\x6b\x15\x31\x42\xea\xce\x2d\x54\x14\x55\x1a\x30\x0f\x4e\x1a\x34\x36\x0d\x0f\x1a\x45\xf2\xf3\x34\x49\x69\xfc\x2d\xe9\x89\x1f\x92\x72\x2a\x87\x65\xfc\xa7\x24\x08\xff\xcd\xfb\xcf\xff\xf2\xee\xf2\xbf\xb2\x67\xf8\x5b\xf7\xa0\x81\xba\xa5\xb4\xf6\x93\x8d\xe8\x70\x27\xea\x04\x42\x63\x2f\x1a\x6c\xf1\x1d\x8b\x47\xe5\x0a\xa7\x44\xba\xec\x97\x2b\x4f\x0e\x6b\x99\xc3\x4a\xcc\xe8\x7a\x36\x37\x69\xd3\x73\x4e\x09\x53\xab\xd5\x3a\xa8\xc9\xde\x65\x05\xb0\x9a\xab\x8d\xf5\xb6\xc0\x84\x7a\xe5\xb3\x99\x8b\x16\x2c\xcd\x53\x5a\x6e\xda\x1c\x63\x09\x43\xe3\x83\x76\x48\x46\x67\x60\xd7\xde\xc7\xa6\x2c\x76\x61\x4f\x9e\x26\xa9\xe8\xb3\xe8\xbe\x40\x7a\x9a\x51\x33\xcf\xa0\x87\xcb\x85\x4e\xb1\x12\xba\x55\x95\xb5\x10\x2f\xe3\x74\x44\x16\x13\xa4\x50\x90\x8c\xef\x94\x71\x84\xad\x9b\xc0\x55\xda\x30\x8e\x79\xec\x46\x90\x47\xe4\x69\xa5\xc1\x1c\x55\xe4\x36\xf5\x30\xcd\x8f\x57\x1e\xcd\x31\xd7\xc0\x92\x50\xbc\xda\xd8\xd0\xa2\x10\xa3\x7b\xa3\x38\xa5\xd9\x3a\x64\x59\xd6\x62\xf1\x45\xeb\xdd\xfb\xd7\x07\xfd\x83\x77\xbf\xa3\x75\xea\xfd\x69\x9a\x04\x33\xe1\xa2\x6c\x0f\x9c\x7e\x8a\xb1\x10\xbf\xac\xac\x48\x5a\x7a\xe9\x8a\xdb\xa1\x1b\x6f\x4f\x7e\x6c\x22\xee\x7c\x13\xb1\x71\x75\x9d\xbc\xe2\xac\x60\xc9\xd4\xa5\x7c\xe0\xde\x04\x9c\x10\xde\x4b\x95\xc1\x95\x01\x1a\x0b\xc0\x12\x26\x5a\x15\x9c\xb1\x6e\xdc\x01\x34\xb1\xf2\xfc\xd0\xee\x57\xd1\xee\x57\x25\xaa\x58\xc6\xef\x60\x78\x0c\x45\xe0\x2e\xa0\x19\xaa\x84\xf7\x43\xfd\xff\x76\xea\x3f\xe7\xb4\x94\x8d\x5c\xf4\xfc\x56\x65\xcc\x42\x51\xdd\xf4\x75\x8e\x1e\x2a\xe1\x87\xdc\xd1\xeb\xa4\xbb\xf4\xe6\xf3\x8a\x5c\x10\x2e\xbb\x4a\x75\xb6\x5d\xd7\x2d\xdd\xcc\x2e\xf5\xe1\x6a\x9a\x78\x2e\x89\x00\xcb\xe6\x6c\x48\x7b\x99\x3c\x5d\xd8\xd7\xd3\xf7\xee\xf1\x4c\x11\x81\x06\x86\xe8\x2f\xca\x29\xbe\x91\x55\x66\x4e\x55\x61\x7d\xb7\xbf\x95\x3f\x4c\x85\xff\x9b\x30\x66\x7e\xea\x28\xe3\x2b\xec\xc8\x38\xcc\x5a\x7d\x65\x67\x26\x2d\xb3\x50\x77\xa1\xf2\x86\xe3\x53\xd2\x43\xfc\x94\xf9\x47\xb9\x9f\x1a\x17\xf6\xea\xb2\x9e\xc0\x61\x94\x74\x11\x7d\x16\x8f\xed\x79\x95\x83\x38\xb8\xae\xc2\x3b\xff\x9d\xaa\xc2\x93\x96\xb7\x42\xaf\x26\xcd\x66\x78\x9d\xea\x66\x94\x37\x73\x6a\xea\xeb\x57\xeb\x93\x2b\x5e\x6d\x15\x4b\x40\x02\xde\xdd\x85\x8e\xeb\xda\x14\xa2\x58\xe7\x1f\xfc\x5c\xc5\x91\xb1\x3a\xd0\x81\xa6\x91\xa0\xf0\x42\x80\x06\x56\x73\x0f\x16\x12\xb3\x39\xec\xc2\x26\x4f\xe0\x7f\x17\x04\x33\xbb\x0c\x91\x7f\x0c\x74\x0c\x43\x69\x3f\x63\xd0\xee\x15\x88\xd0\xd9\x31\x31\xd9\x2b\x60\xcd\x13\x8f\x13\xd1\x6e\xaf\x90\x39\x49\x2e\x54\xe6\x0e\x0c\x52\xe6\x9f\xef\x98\x6d\x75\x8a\x6d\x75\xf1\x65\x22\xaa\xb0\xea\x59\xa2\xba\x61\xac\x6f\xd8\x82\x7d\xa5\xa6\xc1\xcd\x7d\x5b\xf9\xe4\xd5\x4a\x91\xd3\x62\x68\x23\xea\x63\x81\xdf\x77\xc8\x24\xa4\x38\xed\x96\x7a\xbf\xba\xc5\xb4\xbb\x7d\xbf\x5c\xf8\x52\x89\xf1\x52\x6b\xf5\xbb\xc1\x58\xfa\x90\x0e\x27\x93\x59\x4e\xae\xfe\xeb\xb0\x1e\x22\xd6\xc8\x1b\xeb\x82\xa0\x8e\xbf\xf4\xb3\x30\x33\xc4\x15\x82\x74\x28\xd0\xb5\x9e\x31\xfc\x5b\xf3\xd7\x80\xfd\x19\xb2\xf4\xd5\x2c\x45\x16\xa6\x0d\x5d\x17\x1e\x8a\x52\xf3\x36\x6c\xca\x9f\x1d\x17\xb6\x60\xdb\x2b\x16\x59\xe8\x22\x0b\xab\x88\x01\xc1\x00\x58\x51\x64\x61\x17\xa9\x85\xf2\xc8\x80\x02\x9b\x30\xe7\xc5\x9e\x94\x21\x3d\x32\x20\xc1\x26\xef\xf5\x16\x3c\x51\xdb\x49\x45\x1c\x24\xd6\xea\xa2\x1c\x8b\xff\x65\x25\xf9\xbc\x2d\x9d\xfb\x73\xda\xec\x1a\x39\x0b\x9d\xb3\xe8\x68\xb8\xeb\x2c\x01\xd7\x0b\xd5\xed\x9e\xe2\xb9\x30\xf3\x14\x42\x9e\x42\xc0\xad\x10\x7c\x58\xb3\x5b\x23\xf7\x2a\x41\x14\xa4\xe0\x8f\xc5\xe9\xae\x17\xa7\x72\xa9\x6e\xb1\xd4\xf6\x4e\x35\x12\xce\x63\x9c\x7e\x82\x29\x37\x15\x0f\xd0\x64\x05\x23\x7b\xa1\xb3\x69\xca\x3f\xa9\xe2\x0e\xb5\x2c\x9a\x8c\x55\xbd\x1a\x56\x4e\x06\xcf\x98\x16\x30\xdf\xa9\x9b\x19\x9e\x39\x47\x16\x3b\xb7\x58\x5b\x07\x2b\xae\xad\xb6\xfc\xa9\x59\x5a\x97\x3e\x8e\xfa\xee\x0b\xd5\xe0\xae\x16\xaa\x57\x7e\x1a\x84\xb1\x1f\xdd\x7e\xad\x32\xd6\x03\xfa\x79\x0e\x0f\xd5\xa2\xd1\xc5\xf9\x4a\xeb\x87\x38\x5b\x34\x16\x86\x52\xf9\x85\x2e\xbf\xb0\xcb\xcf\xbb\x95\xf0\xb9\x3c\x98\xdb\x80\x2b\x0b\x2e\x78\xc1\x45\x01\xa2\x5d\xad\xbc\x3e\x49\x1a\xe9\xd7\x21\x39\x8b\x33\xf5\xc6\xa5\x76\xad\x92\x59\xe7\x9c\x0b\x51\x62\xc9\x6a\x5b\xf0\x04\x9b\x90\x90\xff\xb7\xac\x66\xf2\x67\x77\xe9\xc2\x26\x7e\x76\xbf\xf5\x1a\x77\xcd\x4a\xd5\x55\x92\xa4\x5b\x29\x6e\x57\x59\x22\x7f\xac\x6f\xdf\x78\x7d\x33\x97\x84\x82\xe4\x5f\x71\xed\xfb\xb6\xeb\x54\x91\x97\x38\xeb\xaf\xba\x78\x49\xee\xf3\xcc\x19\x61\xaf\x68\xb3\x78\x96\xb1\x60\xc9\xc2\x86\x26\xb7\x54\x4a\x09\x71\x51\x4a\x08\x73\x2e\x5c\xb4\x03\x9e\xe1\x2c\xcb\x93\x89\x63\x08\x28\x33\x90\xf4\xb0\x20\xc9\x0a\x67\x3a\x7c\x31\xac\x17\x76\xca\x0b\x8d\x84\xd2\x12\x39\xc6\xb9\x92\x63\x49\x46\x6d\x30\x4a\x58\x6d\x5a\xa0\x2c\x77\x10\x6a\x19\xba\x72\x9d\xb6\x5b\xb5\x00\x2f\x7d\xe1\x7a\x37\x0b\x70\x38\xb1\xc8\xde\x17\x07\x77\xfd\xc3\xb7\x1f\xde\x7f\x3c\x3e\x78\xdd\x7f\xfb\xfe\xf5\x6f\x6f\x0e\xfa\xed\x7e\x94\x04\x7e\x36\xee\x87\xd9\xbb\x30\xea\xf7\xeb\xac\xa6\x3b\xee\x9d\x80\xef\xeb\xc3\xc7\xaa\xd8\x47\xb1\xb3\x3a\xa8\xf5\x10\xea\x68\x28\xbf\x08\xca\xd7\x76\x1a\xdf\x69\xde\x55\x1b\xb7\xe8\x79\x25\xbc\xf5\x50\xeb\xd2\xa5\x6c\x7d\x97\x6f\x09\xf6\x16\xbd\x54\x30\xd6\x43\x61\x1b\x8f\xc3\x31\xaa\x52\x56\xdb\xbd\xf6\x5d\xc0\xbe\x45\x1f\x6d\x40\xeb\x21\xf3\x48\xd0\x29\x9b\x24\x49\x3e\xae\x9f\xb1\x8f\xee\x06\xfc\x2d\x7a\x5b\x04\xb5\x1e\x42\x8f\xfb\x7d\xf1\xba\xe2\x38\x49\xa2\x3c\x9c\xbe\xe2\xd2\x3c\xae\xe7\xe1\x67\xdb\x6b\xce\xdb\x27\xfd\xfe\x2c\x0f\xa3\x3e\x5e\xb3\xfc\x96\x87\x51\x3d\x23\x75\xb6\xd7\x6b\xe2\xa9\x68\xe2\xb5\x9f\xfb\xd7\xb4\xf0\x74\xbd\x16\x9e\x89\x16\x3e\xcc\x52\x46\xb1\x15\xeb\x9b\xc0\xe7\x36\xf6\xcb\x30\x1d\x66\xca\xcf\xb2\xf0\x0c\x5f\x5c\xe8\x9b\x16\x11\xd7\x03\xbe\x54\x7a\x04\x2e\xfa\xfa\xda\x81\x70\x73\xd3\xc5\xf8\x5d\x32\x7e\x87\xe9\x11\xec\x24\x3c\xdd\xd1\x70\xce\xd9\x02\x03\xe0\x52\x94\x11\xf8\x82\xea\x69\x29\xe2\xd5\xd8\xcf\xde\x5f\xc6\xf2\x6e\x91\x2e\x9d\x64\x0c\x8b\x73\x86\x61\x25\xc0\x88\xa6\xa2\x62\x83\xe0\xd7\x0e\x5c\xe1\x7f\x56\x28\x1f\x1d\x1e\xae\x4f\x06\x2a\xaf\x22\x3f\xcb\x8a\xde\x12\xcc\xc8\x17\xc6\xed\x66\xc8\x32\x15\x4a\x43\x9a\xd4\x55\x7a\x56\x11\x76\x64\x65\xb2\x04\x2c\x1b\xa6\xe1\x14\xc3\xdc\x51\x29\x24\x8b\x4e\x6e\xe9\x67\x99\xe8\x90\xa6\x2a\x9d\x8f\x11\x3e\xbb\x37\xf3\x87\x49\x3c\x0a\xcf\x66\x2a\x8e\x73\x3a\x63\x3b\x48\xd4\xfb\xf8\xbe\xf0\x3e\xa7\xb6\x2e\xee\x9a\x55\x2f\xd3\x30\xb7\xaa\x55\x3f\x61\x94\x3d\x37\x6a\x9e\xb3\x85\xf9\xed\xee\x98\x04\xd7\x14\x7d\xa5\xa3\xfb\x21\xe1\xf2\x84\xec\x89\x20\xcb\xfd\x3c\x1c\x7e\x90\xa4\xe4\xe8\xea\x6c\xb7\x4c\x7c\x03\x90\xe6\x12\x13\xa4\x4b\x7d\xb6\xe0\x2e\x83\x62\xa3\xb0\x23\x51\x37\x4a\xec\xe0\x4b\x2d\xc7\x7e\x72\x27\x0d\xdf\xba\x1e\xf4\x73\x36\x99\x76\xad\xb7\x62\x98\xf5\xca\x8f\xa2\x57\x63\x36\x3c\x77\xc2\x38\xcb\xfd\x98\xb3\xac\x01\x56\x76\xf7\x9e\xca\x06\xf9\x23\x19\x59\x05\x91\xc7\x95\xf7\xc4\xe3\xc5\x94\x91\x07\xc5\xfb\xaf\xfc\x38\x4e\x72\x0c\xf8\x0e\x3e\xd9\x25\x81\x9f\x81\xaf\x08\x7f\x9f\xc6\xc3\x44\x6d\x9a\x64\x59\x38\x88\x98\xd1\x00\xf9\x9f\x76\x32\x16\x8d\x3c\x04\xa6\x50\xe3\x49\x76\xeb\x1f\x19\x3a\x08\x19\x4a\x14\xf8\xee\x00\xc6\x7e\x16\x37\x72\x8a\xc0\x1c\xc6\x61\x1e\xfa\x51\xc8\xb7\x06\x4d\xc8\x66\x53\x96\x3a\xae\x55\x82\xe2\xd3\x13\x6a\x4a\x85\x8e\x22\x33\xa8\x22\x7e\x5b\x11\x17\xbf\x7e\x85\x52\x9e\xee\x25\xec\x51\x72\x0f\x38\xc6\x3b\x76\x8f\xc5\x33\xce\xcc\xc9\x66\x83\x57\x34\x76\x88\x16\xfe\x96\x5d\x15\xc0\x75\x06\x59\x81\x59\x61\x2a\x0b\x99\xf1\x8c\x28\x55\x39\x34\x47\xbc\x2c\xdf\x0b\xa5\x2c\xc3\x7d\xc6\x64\x96\xe5\xc0\x42\x34\x02\x1d\x30\xac\x4c\x8f\x47\x64\x13\x1e\xfa\xef\xbe\x0f\x9b\x50\xc2\x05\x49\x25\xb1\xb7\xce\x5b\xc4\x3c\x25\x41\xe6\x18\x08\x5a\xe8\x9a\x33\xe5\x0b\x18\x91\x36\x7b\x3a\xd6\xa2\x26\x8e\xf9\x2c\x1c\xa5\x8c\x07\x52\x3e\x88\x77\xe2\x60\x8a\x1a\x19\xa6\x11\xae\xe4\xd4\x33\x88\x2b\xf0\xcb\x58\xfe\x41\xa2\xf0\x7e\x04\x7b\xd5\xe9\x35\x03\xa4\x71\x6b\xf5\xfb\xd8\x13\x5c\xe0\x74\x11\xf9\x00\x1c\x1d\x88\x8d\xc2\x88\xbd\xbf\x60\xe9\x45\xc8\x07\x84\x14\x08\xf4\x05\xa6\xfe\xf1\x49\x7c\xf0\xe1\x08\x97\x31\xfa\x32\x2d\x02\xc9\x1b\x18\x2a\x1c\xbd\x1b\x6b\x88\x2d\xdf\xb4\x5d\x5a\xa3\xb6\x0a\x0c\xb7\x46\x5d\xce\x48\xa7\x78\x3c\xc8\xfb\xfe\x32\x99\xaf\x85\x3f\xd9\xa1\x88\x63\x99\xb5\x20\x90\xd9\x12\x1d\x4c\x2e\x6e\x0d\xe1\x32\x0c\xf2\xf1\xad\xa1\x8c\x19\x3d\x6e\x5c\x1b\x0c\x3a\x51\xc7\x47\x0e\xda\x92\xf3\xc6\xa0\xa4\xd1\x66\xc6\xa6\x3e\xc6\xdb\x5d\x6f\x84\xc4\x13\x23\x10\xc1\x27\x72\xb6\x1e\x1c\xce\x2f\x1c\x4a\x32\x1a\x65\xec\x36\xb4\x41\xb2\x84\x39\x9b\xa0\x55\xd1\x7a\xb3\x46\x3c\xbe\x02\x7a\x05\x74\x17\x80\x2e\x53\x7f\x3a\x65\xe9\x5d\x80\x1a\xce\xd2\x6c\xcd\xc1\xba\x9d\x38\x40\x86\x59\xa7\xd9\xdb\xc8\x11\xea\xb7\x78\x54\x34\x4c\x12\x3c\xdd\xca\xd7\xa3\xe1\x5f\x47\x9a\x88\x09\x0c\x30\x15\xde\xb9\xfe\xef\xe8\x8f\x9c\x31\x6b\x41\xf2\xe3\x05\x52\xc4\x5f\x44\x89\x1f\xac\x07\x22\x4d\xfd\xc5\xfb\xd1\xca\x47\x20\x35\xb4\x8c\xc5\x9b\xca\x75\xbb\xa0\x7c\xa8\x7c\xf7\x29\x2a\xc6\xf3\x16\x82\x7c\x6d\xb2\x9f\x8a\xbb\xc0\x59\x1c\xae\x27\xbe\xfd\x78\x81\x6c\x44\x7c\x14\x66\xfb\x71\x38\x41\xa3\xd2\xfd\xdb\xaf\x71\xbe\x84\xf5\x7a\x96\xfa\x6b\xcf\x37\x3d\x5b\x14\xbc\x03\x3f\x0b\xe3\xb3\xf5\x47\xda\x39\x69\x30\x3f\xc3\x37\x52\xfc\x6f\x33\x8c\xd5\xcf\x64\x96\x1b\xc9\xf2\x33\x42\xf3\xb5\x06\x51\x1b\x97\xb9\x24\xbd\xed\x9a\x3b\x0a\xa3\x9c\xa5\xef\x66\xd1\x7a\x13\x97\x13\xd9\x08\x57\x89\xc9\xe6\xd3\x27\xa9\xa3\x90\xfa\x6e\xac\xf1\x9d\xb6\xa5\x1f\x7e\x81\x79\xa7\x07\x6d\x0f\xe6\x5d\xfc\xb3\xa0\xaf\x05\xff\xa2\x5b\x3b\x53\xfe\x7f\xe1\x22\x8f\x67\xeb\x5c\x5c\x18\xc5\x12\xfb\xe5\xaa\xa0\xdb\x34\xa0\x07\x8d\xf2\x52\x4c\xe5\x0c\x7d\x81\x12\xcc\x85\xff\xcb\x95\xb9\xec\x4a\xdf\x54\x15\x0c\x7a\x4f\x84\x37\xbd\xd9\x19\xdf\xc9\xfd\xf8\x3e\x6c\x3d\x84\x30\x3b\xca\x52\x78\xb8\x75\xea\x3a\x6e\x25\x8f\x09\x4e\xa9\x66\xe7\x47\xed\x76\x91\x23\xb4\xff\x11\x95\x58\xf4\x9f\xd5\xec\xa8\x1b\x51\x93\x09\xc8\xf7\x93\x18\xd1\x14\x8f\xf1\xc4\xb1\xa7\x79\x32\x65\x65\x38\x62\x9b\xa2\x4f\xa2\x84\xc7\xc7\x1b\x1c\xdb\xb7\xfc\x56\x98\xfd\xee\x47\x61\xa0\x1e\x90\x11\x50\xb7\xe8\xf6\xeb\x46\x30\xed\x27\x69\x36\x9a\x05\xe7\xc5\x6b\xde\xaa\x38\x6e\x1d\xa6\x22\xd9\x31\x5a\x33\xdf\xa8\xdd\xac\x1f\xd6\x0b\xb6\x75\x8e\xac\x4f\xee\xfb\xc8\x6a\xf2\x50\xfd\xe1\xd6\xa9\x26\x84\x1c\x6f\x51\x49\xed\xe7\x97\xb4\x54\x75\xda\x5b\xd1\x86\x2b\x7c\x3e\xc1\x2e\x38\x74\x3e\x05\xbb\xf2\xc4\xca\x3a\xea\xec\x2b\xdf\x56\x44\x46\x7d\x5a\x22\x90\xf2\xc0\x28\xb2\x63\xdd\xc8\x8a\x12\x8e\x19\x6e\x85\xbc\x67\xe9\x4f\xde\xb6\x07\x7d\xba\xc8\xee\xa7\x2c\x17\x99\xc5\x23\x32\x2a\x20\x20\xba\xa2\x90\x3a\x58\xed\x47\xf8\xb8\xb8\x78\xde\xec\xf1\x94\x4c\x06\xa3\x76\x78\x29\xd7\x83\xfe\x39\x5b\xd0\x41\x2c\xfe\xfa\x19\x6b\xd3\x07\x1e\xc3\xca\x57\xce\xe9\x59\x76\xd2\x17\x87\xc6\xfa\x8c\x1a\x53\xe4\x2d\xbb\x35\x03\x52\x96\x2b\x72\xd2\x8f\x71\x88\xce\xb3\xea\x8f\xd4\xa8\x57\xf2\xf1\xa0\xe8\x9d\x71\x8a\xf1\xf5\xab\x3c\x09\x39\xb3\x4f\x42\x24\x21\x5c\x3c\xf1\x6e\xf9\xd3\x69\xb4\x10\xcf\x69\x4e\x38\xd0\x53\x19\x90\x9e\xf7\xc2\x75\x5d\x41\x62\xf9\xb7\x95\xe5\x7e\xce\xd4\x3b\x58\x80\x41\x32\xff\x83\x36\xd2\xcd\x8e\xa7\xd3\xfe\x2e\xb6\xc5\xcd\x0e\x75\x58\x1c\x66\x72\x30\xf5\x9d\x32\x06\x53\x4f\x2f\xf3\x2c\x5d\xb3\xce\x09\xb5\x7f\xce\x16\x3d\x7a\x90\x86\x6c\xf4\x3a\x0c\xde\x26\xb3\x38\x6f\x58\x9a\x9b\x11\xd1\xb0\x50\xce\xd1\x83\x86\x9d\x9b\x4d\x03\x3f\x67\x2f\x5f\x26\x73\xc7\x74\x92\xeb\x41\x5d\x6b\xbf\x61\x85\x15\x9a\xa3\x82\x6b\xb5\xa7\x0b\xd5\xb4\x63\x42\x31\xa2\x0c\xa5\xd0\x97\x83\xa5\x47\x4e\x0e\x91\x39\x74\x9c\xd3\x30\xb3\x25\x53\x0a\xa5\x68\x30\xad\x62\x94\x44\x8f\xb7\x2d\x0b\x20\xb1\x22\xbf\x13\x5e\x6a\x8b\x69\x9c\x1d\x5f\x26\x33\x0c\xa2\xf3\x2a\x0a\x59\x9c\x7f\x64\x43\xc3\xfc\x86\x10\x1f\x24\x73\x89\xf5\xb5\x75\x1d\x39\xa7\x25\x1a\x18\x19\xc9\x1f\x64\xce\x20\x99\xb7\xf0\x90\x07\x9a\xaa\xaf\x2e\xbc\xc0\x23\xba\xaf\x5f\xc1\x2a\x47\xc7\x38\x54\x90\xfa\x26\x4a\x9a\xa8\x89\x51\xcb\x58\x7e\xc4\xe9\xe0\x98\x39\xe6\x4c\x50\x0d\x7b\xc5\x02\x72\x5a\xe8\x26\x8d\x12\x32\x50\x93\xb6\xc3\xb1\xd6\x33\x35\x5c\xf7\x76\x77\xa1\xd9\xe1\x5d\xd0\x63\x43\x69\x26\xb2\xf5\xa8\x56\x4d\xd9\xea\x69\x6b\x63\x75\x55\xc7\xa1\xa4\x3c\xd4\x70\x27\x65\x16\x39\x93\x63\xd7\x15\x63\xac\xc6\x0f\x73\xa6\x42\xdb\x44\xfc\xa7\xfa\x6d\x38\xfd\x13\x3b\x4a\x14\x8e\x78\x11\x26\x12\xcc\x32\x25\x6d\x4e\x97\x2e\x65\x99\xf5\x4a\x9a\x98\xae\x57\xca\xaa\xac\x47\xca\x5d\x45\x2d\xca\x30\xeb\x68\x0d\x4d\x17\xd7\x69\x16\x45\x46\x61\xec\x47\x1f\x54\xbf\x8d\x9a\x0f\x1e\x28\x7a\xe8\x9f\x32\x3a\xd2\x9e\x4a\xa0\x1a\x46\x38\x32\x16\xe7\xe9\xc2\xe4\x15\xf9\xc4\xed\xe6\xd6\x37\x8e\x4b\xd0\x5a\x3a\x24\x24\x31\x0d\xf4\x64\xfb\x3b\x46\x5f\xc6\x7e\x66\xf6\xc4\xe8\xd8\x83\x07\xd6\xb7\xbc\xe0\x2c\x71\x46\xb7\x96\x35\x86\x4a\xab\x15\x25\x5b\x52\x3f\x34\x0a\x89\x0d\x8a\x51\x48\xa4\xd8\x90\xe4\xd6\xc4\x02\x26\x13\x2d\x7e\x14\x67\x3e\x46\x41\x99\x64\xb1\x88\xcd\x87\xdd\x82\x5f\x14\xfe\x8f\x36\x52\x46\x11\x4a\x30\x8b\x98\xbb\x1d\xa3\xa0\x99\x6c\x71\x4e\x32\xcb\x8d\xd2\xe2\x5a\xde\x10\x05\x68\x0a\xc8\xd2\x83\x0b\xae\x9f\x48\x57\x7c\xba\xc1\x8b\x30\x0b\x07\x61\x14\xe6\x0b\xe9\xe8\x82\x8f\x92\x31\x84\x7b\xd0\xc0\x32\x11\xc3\x0d\xd9\x38\x0c\x02\x16\x1b\x00\xf4\x81\x58\x43\x06\xc0\x32\x72\xf3\x64\xda\x83\xb6\x64\x18\xcf\xea\x9d\x6b\x0e\x3c\xc6\xcc\x8a\xfc\x9c\xfd\x1f\x15\xca\xda\xa4\x8a\xca\xfe\xa7\x1d\xe9\x1a\xc4\x7a\xa0\x86\xe8\xc1\x83\xeb\xb5\xe0\x0a\xab\x8a\x93\xfb\x23\xb1\xa7\xa3\xf0\x78\xa4\x05\x4b\xa8\xad\xb9\xfb\x8d\x00\x2f\x5c\x4b\x9c\x9b\x44\xd0\x8d\xef\x94\x0b\xfc\xd3\x2c\xb0\xd8\xb1\x17\x12\x7b\x9d\xa5\xf5\xbc\x5b\xab\x21\x54\xe8\x08\xdd\x4a\x25\xa1\x4a\x4d\xe8\x56\xe9\x09\x60\x2f\x65\x2f\xc8\x30\x58\x57\x16\x09\x7a\xb2\x15\xd6\xdf\x2a\x2a\x7c\xbb\x81\xdd\x33\x28\x2d\x63\x2e\x4e\xfc\xb9\xa3\xd1\x6b\xcd\x61\x53\x13\x69\x53\xce\xe2\x17\x52\xd0\x60\xbe\xfc\x4d\xca\xc8\x1e\x58\xd5\xb5\x6e\x02\x4d\x59\xbd\x07\x85\x16\x84\x2c\xd0\x50\x4d\xa5\xa7\x66\xec\xbf\x19\x5b\x9a\x64\x59\xd4\x90\x65\x41\x64\x11\xa3\x5a\x41\x97\x85\x41\x17\xa1\x7c\x59\x84\x59\x98\xba\x58\x0d\x65\x16\x15\x94\x59\x98\x4a\x54\x91\xe7\xc1\x10\x89\x2d\x2d\xde\x60\x57\x09\xaf\x0a\x0d\x4c\x12\xba\x46\x9a\x5e\x79\x46\x8e\x77\x3d\xc5\x8b\xa6\x6c\x27\xf7\xd5\xe8\x21\x88\xfb\xa7\xae\x53\x98\xf6\xa3\x24\x9d\xf4\xa0\xa1\xca\x61\x64\x70\x63\x2a\x6c\x42\x63\x3a\xa7\x58\xe0\x06\x27\x60\xaa\xdb\x50\x2b\xb2\x6b\x49\xc5\xb2\x92\xf4\xe0\x81\x90\xf2\xe6\x94\xfb\xb7\x74\x5a\x74\x5b\xae\x1d\x8a\x06\xd8\xc3\xb2\x96\xb6\x09\x8d\x49\x66\xe7\x91\xc2\x65\xe8\xb0\x86\x12\x2b\x7e\xdc\xc1\xb1\x8d\x82\xdf\x08\xc2\x0b\x63\x65\x33\x7b\x62\x38\x14\x6a\xa4\x6c\x38\xf6\xd3\x3c\x6b\xe6\xb4\x8d\x6d\x8a\x25\xaf\x61\x8a\xd2\x8c\x0e\x2a\x0d\xf2\x1a\x99\x29\x1b\x59\xaa\xf5\xc8\x31\x03\xd9\xc8\x7f\xa4\x5d\x5b\x5b\x31\x8a\xb4\xb2\x63\xee\x36\x34\x75\x3c\x43\x11\xac\x3c\x06\xb4\x06\xde\xd0\xbe\xe0\x8b\xbe\xe2\xb1\xb4\xb9\x2b\xd7\x15\x30\xcd\x7d\xed\xa9\xe5\xd4\x49\xec\xe5\x77\x36\xae\x56\x39\x57\x3c\xb9\xaf\x0e\x8b\xee\x9f\xba\xca\x48\xaa\x25\x3c\x3e\x0a\xbf\x61\x0d\x01\xb4\xa1\x0b\x14\x9c\x32\xd1\x6f\xa3\xbe\x7d\xc6\x6d\x7e\x4a\x03\x2c\xd7\x45\x67\xd1\x58\xe1\x36\xcf\xd9\x8d\x33\xa8\x82\x15\xff\xed\x62\xd5\x60\x14\xed\x30\xcb\x5f\xf9\xc3\x31\x7b\x15\x31\x3f\xad\xf3\x94\xbd\xfd\x4c\x5c\xec\xa8\xe2\xaf\x59\xc4\xf2\x3a\x27\xea\x4f\xb7\x9f\x17\xcb\xff\xca\xea\xbc\x84\x3f\x7d\xd4\x2e\x16\xfe\xbb\x5f\xe7\x02\xfe\xe9\xa3\x4e\xb1\xf0\xd1\x12\xc8\x5d\x41\x33\x8c\x1c\x8f\x53\x30\x03\x3f\xc6\xba\x30\xe4\x95\x45\xa8\x7f\x1d\x8a\x30\x0d\x2f\xfc\x9c\xe1\x6f\xc3\x2a\xc9\x8c\x23\x88\x27\x7b\x57\x70\xc2\xb7\x2f\x21\xcb\x4e\xd1\x89\xe8\x39\x5b\x34\x29\x2e\xe8\xd4\x0f\xd3\x0c\x83\x51\x71\xf8\x85\x58\xe8\x6f\x24\xd2\x8e\xa8\xad\xfd\x1f\x62\x9c\x3c\xd8\x35\xb6\xd6\x62\x3f\xb6\x0b\xa2\x2c\x08\x0b\x2f\xd8\x83\x36\xf4\x64\xaa\xda\xf0\xc8\x07\x72\x43\x3e\x90\x74\x2c\x24\x42\x26\x6d\x6e\x12\xf0\x9f\x05\x48\xf3\x74\x14\x37\x61\xba\x8d\x13\x2c\x79\x6a\xbc\xc8\xc9\x58\x4e\x3b\xb5\x93\xf6\xa9\x47\xc5\x4f\x3a\xa7\xe2\x98\xed\x6a\x63\x63\x6b\x0b\xf6\x83\x00\x26\x2c\x1f\x27\x01\x76\xfc\x93\xea\xe5\xa7\xd6\x86\xfa\x6d\x58\xd0\x0e\x05\xab\xd9\xbc\xb7\x53\x55\xf6\xa4\x11\x20\xa3\x35\x4e\xcd\xf2\xc4\x7c\x95\x15\x5a\x67\xc8\x0e\x26\xdf\x55\x97\x1b\x23\x8f\x99\x2c\x57\x5d\x2e\xb3\xe1\x1d\xe1\x79\x71\xc9\x13\x8c\xaa\x59\x7e\x6a\xf3\xe8\x76\x91\x91\x70\x90\xfe\x55\x17\x75\x81\x62\xd2\x0b\x0e\xff\x95\xe5\xe4\x4b\x97\x86\xdb\xc7\x70\xef\x43\x72\x44\xfd\xe9\x9c\x2d\x3e\x41\x98\xc1\x28\x99\xc5\xe8\x42\xfb\x13\xde\xd8\x7e\x82\x64\x54\xe4\xde\xca\xd9\x60\x73\x3f\xd6\x45\xce\xa7\x5f\x18\xbb\x37\x9b\x8a\xa9\xa4\x4a\x3f\xbc\x42\xa3\x6a\x31\x43\x28\xf4\xaf\x9f\x0e\xc7\x30\x12\xa1\x8b\xcb\x21\xde\x3f\x8a\x04\xdd\x0f\x11\xdc\x7d\xe2\xe7\xc3\x31\x0b\x40\x04\xdc\x45\x0d\xed\x53\xb3\xf3\xa9\x30\xc5\xfc\x2c\x4b\x86\x87\x22\xe8\x24\x22\x47\x66\xd9\x6a\xa2\xa9\x69\x85\x99\xc6\x79\x81\x98\x2d\x94\xd0\x6c\x9a\x0e\x62\xd8\xbf\x08\xd4\x09\x65\x9e\xe2\x5c\x10\xc6\xde\xb6\x5a\x60\x1e\x3f\x14\xc2\xa4\x36\x3b\xf8\x4a\xb5\xc4\x3b\x26\xc6\x15\xec\x73\xbb\x90\x4c\xbc\xc7\x67\x2c\x7f\xe7\xcb\x73\x84\xaa\xb8\x1a\x4f\x89\x89\xe0\xe5\x2c\x8c\xf2\x66\x18\x8b\xd9\xcc\xf5\x04\x32\xad\xcd\xf0\x3d\x2f\x06\x35\xbd\x60\x69\x38\x0a\xc9\x09\xf3\x80\x01\x79\x06\x6c\x71\x1c\x79\x53\xf4\x49\xa2\x16\x76\x75\xcb\xc2\x8c\xde\x83\x06\x69\x42\x0d\xb7\x6a\x16\x99\xb5\x2b\x28\x71\xbb\x10\x3a\x14\x97\xe1\x1f\x6c\x21\xcc\xca\x2b\x57\x8c\x27\xed\xaa\xf9\x14\xf8\xb9\x8f\x57\x3f\x9f\x26\xfe\xf4\xd3\xb2\xe9\x41\xdd\xbc\x82\x89\x3f\x45\xae\xe7\x7f\xf3\x04\xfe\x35\x63\xe9\xa2\x55\x15\xec\x56\x4e\x0f\x45\x6a\x9e\x52\x98\x1a\x0f\xed\x59\xc1\x61\x72\x8c\x0a\x8c\x7f\xc6\xf2\xb7\xfe\x94\xef\xc7\x9c\x89\x3f\x2d\x30\x3d\xf6\x60\x97\x57\x6d\xf5\xfb\xfc\xa3\xdf\xdf\xd1\x9c\xa9\xc8\xe2\xf0\x4a\xc8\xbb\x7b\x58\x45\x3a\xbb\xc3\xfb\xab\x5d\x68\x10\xd6\x0d\xd8\xd3\x3f\x7b\xd0\x18\xfb\xd9\xb8\x71\x8a\xd5\x7a\x84\xd9\xc4\x9f\x56\xf3\xba\x46\xb2\x62\x7c\x57\x71\xc4\xf5\xd7\x0f\x91\x74\xe9\xa7\xb1\x11\x4d\xe3\x8c\xe5\xc7\x6a\x53\xf2\x3b\x3a\xed\x95\x59\x22\xb0\xaf\x91\x62\x6f\x6e\x8c\x8c\x89\x3f\x25\x04\x8d\xb4\x80\x0d\x66\x67\xa3\x62\x82\xf1\x1d\x25\x67\x16\x22\x31\x4b\xfd\x9c\x7d\x48\xd9\x28\x9c\x17\x1b\x38\x63\xf9\x6b\x3f\x1b\xbf\xf2\x2d\x7c\xc2\x80\xc5\x39\x6d\x74\x8d\x82\x87\x71\xce\xd2\x8c\x21\x0d\xff\xc1\x16\x95\xe1\xa0\x42\xa3\x4c\x6d\xbc\xa6\xe7\x66\xd4\x52\x5d\x7e\x59\xac\x24\x0b\x6e\x31\xa6\xd4\xff\xa3\x2f\x87\xbe\x79\x44\x20\xdd\x40\x61\x7a\x24\x83\xcf\x88\xba\x0e\xa0\x8f\x3d\x17\xe4\x10\xed\x56\xcf\x2c\x5d\x55\x19\xfc\xcb\x95\xbd\x18\x04\xae\xc2\xb8\xbf\xf8\x00\x00\x4d\xfd\xe5\xb1\x0d\x6f\x58\x52\x90\x42\xe5\x6b\xba\x25\x83\xcf\xc2\x38\x1f\x58\x16\x85\x71\x0e\x71\xd2\xe4\x9a\x7e\xc2\x41\xb5\xe5\x3a\xf6\xe1\xe3\xc1\x2f\x87\xff\xa7\xff\xe6\xf0\xe8\x18\x76\xe1\xa4\xf1\x07\x1b\x9c\x87\x68\x7b\xf5\x36\xf9\x93\xff\x79\xcf\xff\x37\xc9\x1a\xa7\x3b\x58\xfe\xf0\x5d\xff\xcd\xe1\xbb\x83\x7e\xb1\x5e\xf3\x12\x2b\x36\x79\xe9\xe6\x24\xf9\x93\x7e\x24\xe2\x3b\x6b\x1a\xf5\x5f\xbd\x7f\xfb\x61\xff\xf8\xf0\xe5\x1b\x0e\xe5\xfd\x87\x83\x8f\xc7\xff\x44\x10\xea\x14\x83\xd7\x51\x1f\xef\xd3\xf0\x8c\xec\xc4\xf4\x91\x07\x46\x33\x15\x0b\x7e\xc5\x1c\x5d\x3e\x83\xcd\x75\xa4\x98\xed\x4c\x53\xf6\x9e\x8f\x57\xcc\xe6\xf9\x7b\x1c\x55\xbd\x78\xa0\x07\x47\x6b\xfa\x6a\x1f\x8e\x62\xe8\xcf\x35\x0c\x57\x1e\xfa\x50\xa2\x04\x68\x98\x9e\x54\xc8\x1c\x23\x49\xdb\x33\x89\x34\x07\x17\x54\x0b\x23\x4c\xd9\x11\x4e\x01\x70\x29\x95\xcf\xc1\xf0\x5c\x48\x44\x00\x87\xa1\x3f\x61\x11\x79\x42\xc8\x13\x08\xfc\x6c\x8c\x1f\xbc\x02\x2d\x6e\xb0\xfb\x42\xfc\xda\x90\x7c\x51\x2d\x26\xed\x54\x93\x92\x32\xd9\x89\xfd\x49\x21\x1c\xab\x3f\x61\xad\x94\x61\x80\x16\x67\xcb\x39\xd9\x6f\xfe\xcf\xa9\xbb\x75\xe6\x19\x02\xeb\xa2\x60\x47\xd4\x68\x36\x60\x13\x2e\x5a\x79\xf2\x26\xb9\x64\x29\xc2\xa5\x8d\x98\x5b\xdf\x5b\x3f\x08\xd0\xa0\xc0\xcf\x43\xae\xf7\xe0\x29\x11\x4c\x71\x0d\xe0\x85\x1d\x69\xf2\x29\x5c\xf9\xf2\x3e\xd3\x9e\xd8\xe8\xf3\xf2\x85\xa3\x2a\xd7\xa0\x41\x29\x1b\x69\xa1\x25\x86\x30\x11\xab\x9e\x01\x2a\x7c\x3c\xd1\x6f\xd7\xba\xad\x96\x27\x71\x05\xc9\xf2\xe5\xca\x03\xb3\x09\x65\x11\x42\x1a\xa0\x5e\x8d\x51\xe3\x94\xa1\xb1\x8c\x69\xa4\x5c\x9e\x73\x06\x11\x07\x44\x85\xe1\xfa\xff\x2e\xdd\xad\x65\x43\xc5\x07\xe9\xb7\xe9\xb4\x38\x48\x04\x17\xc7\x80\x54\x01\x12\x4f\xc6\xe1\x96\x21\x40\x5a\x29\x0b\x66\x43\x66\xdc\xbf\xa6\x2c\x9b\x45\xc2\x6c\x8d\x77\xd5\x83\xd0\xdc\xa5\x98\x7d\xd3\x1b\x93\x62\x6b\x46\x2f\x94\x34\xf9\xaa\x7e\x35\x13\x14\x2c\xee\xd6\x59\x38\xf1\xaa\xc4\x1a\x46\xe0\x87\xc6\x7f\x76\x1a\x6e\xa5\x4d\x92\x79\xe2\x27\xf1\xad\x1a\x21\xd9\x07\xd8\xd4\x74\xf6\x14\xb2\x74\xee\x7a\xe5\x91\x9f\x43\x29\x1a\x6c\x85\x86\xbe\x14\x75\xa2\xe4\xcc\xd1\x0a\x6f\x5f\xc8\x74\xa4\xad\x23\xbf\xc8\x9f\x10\xff\xe5\xf2\xea\xd2\x8a\x49\xa4\x79\x7a\x79\x5f\x32\xa1\x78\xb3\x5c\x0d\xa7\x0d\x33\x46\x16\xbf\xf0\x53\x3e\xb9\x6c\xc9\xe1\xc7\x0b\xf1\x47\xcd\xa4\xa2\x82\x26\xbf\x8d\x97\xbd\x83\xd9\x59\x59\x56\x68\x0e\x08\x73\x36\x91\x43\xcb\x3b\x4c\x7c\x8e\xa9\x3b\xd6\x38\xf0\xa4\x1d\x1d\xe1\xac\xae\x23\x54\xdf\x4f\xcf\x32\x4f\xb1\xae\xee\x97\x6c\x97\xd7\x55\x38\xec\xbe\x30\xd3\x8d\x8e\x95\x54\xd1\x51\xa9\x6b\x23\x27\xf7\xb9\x88\xab\xe9\x9d\xec\xd9\x5f\xc3\xca\x8e\xec\x5e\x71\x6d\x14\x8c\xa2\xb4\x5c\x42\x40\x4c\x00\xda\xf7\xa2\x94\xc8\xfd\x33\xd4\x39\x5b\xf8\xfd\xf5\x2b\x34\xfc\x38\x89\x17\x93\x64\x96\xa9\x6e\x36\x74\x2d\x3f\x3d\x7b\x27\x62\x6a\x36\xf0\x6e\x86\x43\xe5\xba\xbe\xf3\xdf\x47\xef\xdf\x09\x6b\xfc\x70\xb4\x70\x5b\x9f\x93\x30\x76\xf8\x6a\xef\xf2\xc9\xe7\x36\xc4\x60\x4b\x16\xe0\x89\x3d\x10\x10\x08\xe4\x26\x34\xf8\x50\xf1\x34\x1b\x18\x97\x22\x6e\x81\x5b\x52\x96\x5d\xc3\x2c\x7c\xd3\x49\xeb\x02\x24\x31\xb0\x0b\x96\x2e\x64\x08\x7d\xae\xea\xa1\xe1\xa1\x3e\x4b\xd5\xfb\x37\x4f\xa4\x56\x2d\x2c\x55\x9b\x1a\x33\x4d\x31\x86\x4a\x74\x46\x04\xd0\xe2\x1f\x53\x9f\xe0\x79\x95\x72\xd3\xd8\x0f\xd7\xca\xaa\x6a\x41\x85\x3a\xea\x28\x76\xf0\xaf\xd4\x2c\xdd\xb2\x80\x5a\x61\xf1\xa5\x65\x17\x8f\xc1\xb8\x9c\xe3\xe5\x05\x4d\xcb\xc4\xa9\xdd\x0a\x96\x32\x54\x3f\xed\x1c\x72\xa0\x5d\x4b\x29\xca\xbd\x05\xad\xaa\x56\x76\xa4\x51\xca\x32\x41\x23\x41\xa2\x4c\x58\x66\x48\x31\x5e\xde\xf7\xea\x14\xdb\x08\x32\x93\x96\x8f\x96\x44\xe8\xae\x26\x12\xba\x42\x26\x74\xb5\x50\xe8\x0a\xa9\xd0\x15\x9f\x5a\x2e\x28\xa9\xd0\x2d\x8b\x85\xee\xa9\x52\x21\xf0\x0d\x3a\xce\x52\xfb\x28\x5d\x4a\x5d\xa1\x94\x5a\x2a\xc7\x28\xce\x08\x64\xd6\x4a\xf9\xc4\x91\x0a\xc1\xd6\x16\x8c\xc2\x34\xcb\x4d\x87\x52\x7c\x2a\x0e\x59\x78\xc1\x60\x32\x8b\xf2\x70\x1a\x2d\x34\x2e\x12\x1c\xaf\xf3\x0b\xba\x89\x8a\xb3\x93\xf6\xa9\xd4\x2a\x72\x3f\x8c\x32\x99\xde\xca\xa2\x70\xc8\x28\xde\xef\x12\x41\xab\x36\x93\x58\xb5\x86\x19\x46\x71\xe9\x94\x73\x14\xa3\x14\xd9\x91\x36\xba\x02\xa7\x4a\x31\x29\x16\x54\x77\xc7\x8e\xb7\xb9\xe4\x5c\xa4\x22\xcb\xd4\xa9\xad\x3c\x19\x95\x28\x90\xf6\x75\xc0\xf0\x0a\xd7\xde\x10\xa0\x99\x1c\x97\xab\xba\x6b\x3c\xad\x40\x06\x53\x5f\xa7\x6c\x2e\x44\xb9\x04\x0d\xca\x57\xc6\xd4\x0c\x29\x76\x52\x3c\x37\xcc\x6d\x4c\xf6\x9a\x5d\x2c\x8b\xe7\xd2\xd0\xf1\x5c\x1a\xa2\x4e\xe1\xe8\x48\x7c\x2a\x9c\xf9\xb7\x33\x4c\xe2\x80\xcc\xc4\xc4\x63\x5b\x0f\x7c\x0f\x06\x1e\x0c\x3d\x08\x3c\x60\x6a\x75\x25\x8d\x90\x23\xf1\xe0\x81\xf2\x54\x20\xd4\x20\x6c\x5f\x0d\x53\x83\x2c\x67\x30\x0b\x1b\x35\x95\x4a\x6a\x04\x75\x64\x55\xc1\xf0\x7a\x67\xd4\x72\x1a\x6f\x92\x33\xb4\x05\x01\x71\xc6\x83\x97\x6d\x2c\x4d\x93\x14\x26\x2c\xcb\xfc\x33\xa6\x18\xa2\xa0\x3d\xe2\xbc\x52\x5d\xd3\xf0\xaf\xc7\xa0\x88\xc3\xdb\x30\xa6\xf3\x69\x36\x1f\x32\x14\xc3\x90\x0c\x87\xb3\x34\x65\xc1\x0e\xcc\xf8\x5e\x6f\xcc\x20\x4e\xe2\xe6\x44\x16\x0c\xd8\x05\xb0\xf8\x22\x4c\x13\x8a\xd1\xcf\x47\xb7\xc1\x05\x0e\x2f\x39\x9a\x45\x51\xb1\x0b\x71\xc0\x05\x3b\x62\xea\x47\x30\x66\xd1\x74\x34\x8b\x70\x74\xc2\xf8\x2c\x6b\x35\xdc\xa5\xb6\x53\x42\x4e\x9d\x14\x47\xed\x74\xa7\x58\xec\x50\x5c\x09\xb6\x0d\x9b\x1d\xab\xb3\x44\x19\xad\xd0\xff\x57\x66\x6f\x20\xed\xfb\x7d\xc1\xe5\x28\xe9\x24\xf4\xcd\x4d\xa3\x59\xcb\xda\x01\x4c\x57\xec\xdf\x20\xec\xc2\xa3\xa5\x41\x0d\xcc\xb0\x0b\xe2\x34\x7e\x1f\xb2\x29\x1b\x86\x7e\x14\xfe\xc9\x02\xe0\x72\x14\xc7\x76\x04\x9f\xfa\x7c\x6a\x7f\xc2\x35\x02\x6f\x69\x32\x8c\xbf\x9a\xcc\x72\x0c\xc8\x9a\xa4\x39\x66\x85\x39\x2e\x57\xa4\xa5\x8f\x93\x34\x1f\xfb\x71\xb0\xca\x5d\xd7\x09\x3d\x6d\x2c\xdc\x76\x11\x34\x48\x2e\x58\x6a\x1d\xec\xcb\x87\x41\x57\xaa\x41\xac\xa8\xcf\x2d\xe2\x8b\xe4\x9c\x05\x30\x65\x12\xa5\x30\x89\x0b\x07\xfe\xa2\x61\xf3\xd0\x3f\x66\x97\x5c\x0d\x9a\xb2\x40\xdc\x5b\x15\x6e\xbd\x78\xda\x5b\x7f\x2a\x6f\xbc\x64\xdb\x2b\xdd\x2f\x53\xa7\xec\xdb\x65\xf3\x72\xcc\x53\xc2\x3f\x23\x2f\x5c\xb4\xc6\x8a\x15\x10\x99\xf3\x9a\x9b\x66\xaa\x29\x2e\x97\x61\x57\xa1\x27\x6e\xd5\x28\xdd\x23\x1c\x3d\x6a\x5b\x6c\xdb\x4d\x15\x75\x16\xe5\x35\x37\x68\xa2\xf7\x15\x77\x0a\x4b\x7d\xf8\xaf\x78\x67\x74\xb4\x98\x0c\x92\xba\x60\xee\x4f\xc5\xe5\xd9\x43\xf8\x2d\xe3\x83\x93\x99\xb7\x66\x9c\xef\xf8\xe6\x90\xeb\xff\x9f\xc8\x2a\xee\x13\x79\x3b\xf1\xb9\xea\x22\x75\xbd\xc3\x77\xbf\x1c\xbe\x3b\xc4\xf3\xbe\x0e\x6c\xe1\x7c\x97\x46\x0b\x74\x56\x95\xc1\x27\xdc\x96\x7d\xe2\xac\xe7\xcb\x4d\x26\x1e\xb3\x8e\x28\xf4\x70\x9c\xe4\x3a\x23\x49\x21\x43\x9c\x97\x71\xf7\xc3\x2b\xb1\xd5\x3b\x56\x9b\xd9\xe2\x2d\xae\x62\x48\x82\xfb\x95\x80\xda\x8c\x29\xae\xab\x0c\x5e\xcc\x93\x7f\xb0\x85\x53\x38\xde\x11\x0b\x10\xb5\x63\x5e\x25\x7d\xfd\xaa\x28\x2c\xea\x14\x8f\x52\xe8\x88\x84\x98\x41\xec\xc9\x44\xec\x18\x82\xb6\x09\x0d\x12\xb9\xf2\x40\x52\x16\xd8\x85\x46\x1b\xd7\x36\x87\x53\x55\x20\xb4\xbb\x0b\x4d\x49\x6f\x17\xf6\xa0\xd1\x6c\x37\xa0\xb7\x94\xbd\xb0\x43\x15\xbc\xb5\x34\xda\xc2\x9d\xf2\xd6\x86\x88\x55\x3b\xf0\x33\x06\xe1\x64\x4a\x1b\x2f\x52\x49\x92\x91\x32\xbe\x88\xc2\x73\x46\xe2\x70\xfe\x09\x97\x29\xfe\x3b\x8c\x3f\x09\x3b\x00\x7f\xc8\x57\xc4\x0c\x7c\x0e\xee\x13\xee\x4b\xf0\x5d\x2c\x72\x55\xc0\x72\x96\x4e\xc2\x98\x16\x48\x36\xcf\x53\x36\x99\x4d\xc4\x91\xd1\x7a\x06\x01\x37\x14\x91\xea\x63\x89\x88\x2c\x41\xd0\xbd\x40\x18\xc6\xe7\x4c\x44\x0a\xa6\x24\xc1\xe2\xd9\xf2\xab\xd5\x72\xb7\x0d\xbe\xe6\xc4\x3f\x10\x05\x8a\x72\xd6\x33\x5a\x5e\x5d\xe6\x9a\xb6\x3b\x2b\xd8\xea\x88\xc9\x03\x96\xd0\xd4\x9a\x01\xd7\x71\xf0\x19\x83\x92\xae\xf2\xfc\x53\xa9\x58\xb2\xcc\x3d\x21\xeb\xf9\xdc\xe0\x88\xcf\x30\xc2\xa9\xa9\x60\x19\x7a\xc3\x9e\xae\xc7\x8b\xc8\xdf\x0f\x1e\xc0\x3d\x35\x73\x45\xa2\xb2\xde\xa3\xbb\x60\x4d\x13\x59\x80\xe8\xc4\x9b\xd3\x25\x5d\xfb\x89\x8f\xc6\x47\x36\x65\x1b\x32\x8a\xc9\xaf\xc4\x42\xc9\xce\x62\xd9\x54\x36\xc7\xb0\x62\x46\x7f\x07\xb7\xf4\x6b\x46\x7c\xe1\xda\xa2\xb5\xa7\xf1\x61\x17\x36\x79\x2a\x34\x77\xf9\x0e\x40\xfb\x0c\x2e\xc8\x4f\x1f\x36\x61\x00\x0f\x21\x97\x1b\xb0\x0a\x77\xc0\x8f\xbe\x83\x3b\xe0\x1b\x07\x8e\x09\x18\xde\x2a\x4d\x93\xc8\xcf\x19\x45\xec\xb9\x9d\x77\xfe\x61\x32\x5d\xdc\x2e\x44\xc0\x30\x89\xf3\x30\x9e\x25\xb3\x6c\x4d\x57\xc4\xc1\x76\x1f\x67\x6f\xad\x43\xcc\x47\x6b\xfa\xdc\xec\x70\xd0\x06\xbd\xea\x3d\x6e\xb6\xd7\x74\x4d\xda\xed\x5f\x83\xfa\x93\xe7\xeb\xba\xb6\xed\x4b\x95\xa8\x16\x76\xb7\xbb\xa6\x5b\xe0\x47\xfd\x3e\x59\x96\xd5\x7b\xa9\x7d\xd6\x26\x1f\xa4\xc2\x11\xdb\x2c\x0e\xb9\x7c\x39\x69\x7b\xd0\x39\x35\x6f\xd7\x2b\xf8\xb1\x3c\x2d\x1d\x9c\x8f\x0e\xcd\x4e\x25\x0e\xf7\x0c\x27\xf3\xc6\x55\xbc\x33\x87\x26\xf8\x2e\x6c\xc1\x60\x47\xd9\x55\xf7\xae\xb7\x8a\xb7\x28\x56\xf9\xd6\x7e\x50\x08\xba\x60\xe1\xfe\x2a\xf2\x27\x53\xc7\x4a\xaa\x3c\x90\x37\x7a\x27\xac\x88\x8a\xb3\xd2\xd1\x52\x68\x17\x36\x07\x62\xfb\x58\x04\x63\x76\x79\x0e\x3f\xef\x82\x2f\x36\x19\x73\x78\xb1\x0b\x03\xd8\x83\x0e\xf4\x20\x70\xe6\xee\x0e\xc5\x1b\xbe\xb2\x91\x4f\xcb\xc8\xa7\x37\x47\x3e\x85\x5d\x1b\xd2\x6a\xc8\xe7\x06\xf2\x39\x47\xbe\x0d\x7b\xe0\x43\x0f\x72\x8e\x7c\x07\xf6\x60\xc0\xd5\x47\x27\xaf\x41\x7e\x10\x4e\xfc\xa9\x13\x24\x13\x3f\x8c\x3d\x48\xfd\xf8\x8c\x79\x36\x11\x3d\xa8\xe8\x0d\x92\xbb\xcd\xe9\x8d\x35\xd1\xe0\x30\xe8\xe8\xef\xce\xa9\x07\x29\xcf\x47\x88\x98\x9d\x76\xd4\x67\x07\x77\xf5\x7c\xc5\x0f\x3a\xf0\x33\x04\x6d\x57\x00\xb3\xfa\x1f\x74\x3c\x9e\x25\x01\x59\x79\x69\x87\x27\x23\x4d\xf0\x0c\xa3\xaa\x7a\x9b\xa3\x54\x53\xbd\xcd\xf1\x31\xb5\xf2\x4a\x6e\x48\xdb\x4e\xd0\x76\xe6\x2e\xd1\xce\x24\xdb\x34\x89\x16\x6b\x13\xee\x33\xec\x8a\xc7\x45\x61\x2c\x20\xa8\x63\x62\x04\xa4\x4e\x6f\x9b\xa0\x54\x33\xce\xdc\x7c\x97\x4d\x9b\xdb\xcf\xae\xda\xf5\xd6\xa4\x87\xa8\xd8\xa1\x72\xb5\xb5\x05\x1f\xe9\x64\x17\x1d\xcf\x32\x7c\x69\x2e\x46\x8a\x6b\x9c\x34\x12\x34\x70\x9f\x4f\xf9\x80\xc8\x41\x95\x0c\x4a\x09\x6a\x78\xc5\xf1\xad\x6b\x1f\x18\x03\x21\x2f\x47\xb9\xba\xd0\x95\xad\x4c\xc2\xcf\xf0\x59\x35\x72\x12\x96\xd6\x55\x89\x56\xc8\xf9\x4b\xfc\x84\x4d\x10\x16\xde\x00\x29\xd5\x29\x8c\x2e\x32\x19\xaf\x22\x7e\xe9\x1a\x57\x15\xe7\xcd\x38\xe4\x6a\x1e\x86\xab\x38\x15\x31\x57\x4a\xbe\xf8\x72\x01\x37\x08\x33\x36\x14\xf2\x4d\xb2\xc5\xdc\x83\x8e\xc7\x7b\xd8\x84\x8e\x35\x7f\x39\xde\x0e\xef\x30\x72\x57\x79\x5a\x72\x5d\x40\x19\x5f\x29\xcb\xb0\x0d\xb0\xed\xab\xc4\x50\xb7\xa8\x39\x51\x5e\x7e\x29\xe9\xde\x42\x2a\xc8\x5c\xfa\xd0\x99\x26\xe1\x44\x11\x33\x49\x17\x1c\xa2\x64\x13\x45\xe8\xc3\x25\x31\xbe\xb5\x55\x14\xbb\x5c\xb6\x71\xb2\xe6\xfe\x39\xcb\xc0\x97\xfc\x43\x3b\x84\x39\x84\x31\x9c\xf8\xde\xe0\x14\x37\x81\xa9\xb1\xc1\x19\x26\x69\xca\xb2\x69\x42\x1c\x8a\xbb\x29\xbe\xef\x03\xbc\xc4\x3b\x69\x7b\x9d\xd3\x16\x6f\x2d\xad\x68\x2d\xd7\xad\x55\xd5\xbb\xa6\xa9\x1a\x04\x5b\xe6\x88\x48\xdd\xca\x59\x51\x3c\xca\x39\xc3\x57\x6c\x35\x5b\xc5\x0c\x31\xd3\x8c\xda\xa8\x03\xac\xae\x43\xc9\xb5\xd5\x84\xf0\x70\x4b\x6d\xba\x70\x90\x60\x57\x3b\xb5\xe2\xff\xa6\x21\x1b\xb2\xcb\x50\x27\x24\xb3\x7c\x3a\x33\x90\x99\xce\x72\xdb\x6b\x4d\xca\xb2\xa1\x1f\x69\x27\x1f\x0a\xc2\xca\x62\xec\x05\x74\xf1\x71\x25\xca\x4c\xe8\xd1\xa2\x43\xf3\x81\x5a\xe7\xbb\xc2\x98\xfe\xc6\xe8\x27\xc0\x98\x2a\xd8\xb8\x9a\xbb\x0a\x2b\xc2\x69\x5e\xd8\x4d\x38\x02\xde\xd7\xaf\xea\xe7\xae\x46\xb8\x28\xae\x89\x40\x7b\x2b\xa8\x1f\xbd\xa2\x68\x37\x73\x5d\xd7\xd9\x9c\x6b\xf1\x82\x98\xb5\x42\xb2\xe2\x32\xa2\xa5\x14\xef\x2c\x1d\xea\x32\x47\x55\x76\x5e\x63\x2a\x17\x14\x81\x70\x85\x72\xa7\xd1\xbf\x5e\x01\xe9\x15\x98\x94\x63\xbc\x30\x02\xb3\x10\xca\x8a\x63\x15\xca\xfd\xe2\x66\xad\x70\xad\xc9\x37\xdf\xaa\xd6\x2a\xba\xb9\xe4\x58\xce\x07\x0f\xb7\x4e\xe9\x70\xbe\xbf\xcc\xa3\x9f\xa1\x21\x57\xa9\x92\x9e\x66\x4f\x1c\x25\x6b\x7d\x2a\x76\x50\xce\xbe\x1b\xf5\x4f\x56\x5a\xad\x7b\xb4\x16\x60\xfb\x46\x07\x8b\x68\x5a\x0b\x64\x25\x96\x1f\xf1\x1d\xcc\x12\x54\xef\x08\xad\xdb\x08\x9f\xa0\x28\x7c\x08\x69\xf4\xd8\xa5\xba\x5b\xec\x9d\x12\x4a\x37\x19\x03\x59\xe9\xde\xbd\x7e\x81\x92\x98\x53\x6c\xc3\xee\xd4\x8d\x5a\x2a\xd0\xa3\xd0\x9a\x91\x5b\x8a\x6a\x64\xf4\xf8\xaa\x7c\x82\xb1\xf4\x29\xe4\xf7\x0e\x68\xd4\xa7\x9b\xb9\xd7\x6c\x18\x4e\xfc\xfa\x90\x46\xdd\x6e\x57\x1c\xc6\xdc\xf6\x78\x68\x6e\x29\x2f\xf3\xd5\x54\xac\x22\x96\x95\x3b\x49\xe5\xed\x68\xee\xba\x1e\xcc\x61\x0f\xe6\x27\x9d\x53\xe8\x51\x30\xba\xaa\xc3\xa4\xc7\x4b\x1f\xbc\x7d\xef\xa1\xf8\x26\xc1\x86\xda\x77\x10\x6c\xa8\x7d\xbb\x60\x43\x9d\x6f\x18\x6c\xa8\x73\x57\xc1\x86\x3a\x77\x10\x6c\xa8\x4b\x0f\xa8\x63\x7f\xb2\xa4\xa3\xdd\xbb\x80\x7d\xab\xc8\x51\x26\xa0\xb5\xcf\xc1\x6e\x14\x36\x67\xbd\xd3\xb0\x6f\x1d\x5e\xe8\xb1\xec\x45\x12\xf9\xe9\xf2\x26\xb6\xd7\xec\xc5\x93\x9b\x45\x30\xfa\xf1\x42\xe8\x47\x6c\xa1\x1f\xb1\x85\xee\x34\xb6\xd0\x8f\xd0\x42\x3f\x42\x0b\xfd\x08\x2d\xf4\x17\x0b\x2d\x74\xc4\x84\xab\x92\x2d\x2b\xb0\xd0\x19\xcb\x5f\xb3\x28\xf7\xf7\xe3\xb3\xe2\xd3\x2c\x23\x83\x8b\x90\x34\xc7\x9f\x9c\x28\x01\xfe\xd2\x67\x6d\xb8\x56\xae\xb0\xa9\xa8\x58\x9a\x4f\xee\x8f\xc5\x89\x44\x3e\x3e\xe2\x60\x70\x5b\x21\x9b\xe0\xd3\x46\xb5\xac\x5e\x48\x05\x26\xc2\xea\x08\x4c\x6d\x45\xaa\x2b\x7b\xb0\xfd\xf8\x79\xeb\xf9\xf3\xe7\x96\xd1\x33\x62\xfe\xd0\x80\x68\x9b\x20\xf3\x4d\x7e\x9c\xbf\x0a\xd3\x61\x89\x38\x56\x1e\xba\x3a\xd6\xf4\x18\xa2\x27\xc8\x94\x8d\x5a\x43\xe5\x01\x72\xb8\x50\x69\x0b\x7d\x1c\x19\x84\xb3\x4c\xa6\xd3\x97\xcc\xf3\x45\xff\x30\x0b\x3f\x64\x8e\xa0\x36\x66\xf0\xdf\xea\xec\x30\x3b\x98\xe7\x2c\x8d\xd1\x24\x1a\x73\x75\x8a\xc2\x22\x49\x63\x96\x7e\xb4\xda\x35\xd3\x76\xa4\x59\xfa\x90\xf1\xbd\xb6\x2a\x68\xd5\x7b\x08\x8e\xd1\x16\xdd\xcf\x35\x3b\x2e\x6c\x8a\x0e\x29\x9b\xf3\x31\x43\xbf\x02\x34\x32\x59\x18\x3b\x16\x98\x2d\xab\x11\x17\xb6\x6e\xa8\x37\xca\x0d\xe9\xc7\xfd\xd7\x87\xfb\xef\x38\xe3\xec\x58\xc8\x4b\x0e\x21\x4a\x6e\xca\xb1\x46\xac\xec\x92\xab\xf0\x6e\x35\x06\x0c\x31\x98\xf2\xb4\xe3\xe4\x95\x9f\xe6\x2c\x0b\x7d\xc1\xc4\xc3\xb9\x07\xc3\x85\x67\xf5\xd2\x33\x71\x93\x76\xfe\x64\x9a\xa4\x9c\x83\x26\x23\x72\xa1\x29\xec\xb2\xc2\x0c\x72\xe2\x35\xc8\x13\x3a\x3b\x47\x9e\x93\x3d\xc0\x0f\xe2\x46\xe4\xb1\x6f\xd8\x93\xf4\xee\xfa\x20\x58\x3f\x0a\x63\xd9\x11\x0c\x77\xfe\x5d\xba\x61\xf1\xf6\x43\x62\xcf\x61\x92\x39\xc4\xaf\x0f\x6f\xcd\x86\xae\x47\x3c\x67\x49\x9a\x2f\xa2\xd9\x9e\xf8\xeb\x15\x46\xae\x57\xf8\xf6\x2c\x82\xf4\xac\x2f\x8f\x98\xb8\x27\x66\x98\xfd\x6e\x82\x04\xfd\x07\x1f\x0d\xc9\x4c\x89\xa5\x33\x50\x5c\x75\x2b\xe4\x55\xb7\x4a\x60\x75\x0d\x89\x15\xc6\x45\xf1\xd1\x6d\x19\x69\xc6\xa5\x46\xa9\x98\x91\xa6\x24\x99\x12\xcf\xaa\x94\xb1\xd0\x88\x42\x4a\x9c\xcb\x22\x32\x41\xc9\x2a\x29\x2a\x57\x58\xb2\xe4\x85\xec\x1f\x63\x16\x23\x1f\x52\x5d\xae\x62\x20\x75\x80\xfd\x6b\xe6\x47\xe8\xa8\x6a\xfb\x49\x1b\xf5\xe1\x54\x70\xb2\x1f\x07\x1c\x8e\xf8\x1a\x26\x61\x3c\x0c\x03\xc9\xbc\x5c\xed\x3d\xd0\x88\x1a\x1d\xdb\xa4\x26\xa4\xc0\x11\x0e\xf8\xfc\x34\xff\x20\xc2\xea\x7f\x43\x46\x37\x49\x5e\xb5\x90\x62\xfe\x41\x1c\x7c\x6f\x54\x4c\x6a\xb9\x6a\x18\xa7\xc4\xb2\x8d\xb7\xf8\xc6\xa2\x40\x28\xf4\x57\xda\xf0\xaa\x72\x16\x3c\xe7\xff\x8b\x39\xaf\xec\xeb\xaa\x82\xfb\xac\x4a\x46\x5a\xdb\xa3\x1a\x3c\x6f\x53\xeb\x0e\x34\x6f\xe1\x05\x74\x9e\xb5\x5d\x55\x79\xd3\x60\x26\x78\x61\xa3\x8f\x85\x34\x2c\x8b\xa4\x45\xa4\x55\xba\x42\x99\x9e\x6a\xe2\x63\x1c\x63\x66\xbd\x80\xb6\x75\x27\xce\xb3\xbe\x17\xcf\x98\xb3\xb9\xc8\x33\x06\x3a\xdf\x87\x6b\x2c\x64\x0a\x5c\x83\x77\xa1\x9c\x65\x36\x77\xa1\xf1\x06\x89\x6f\x61\x66\x10\xdf\x4e\x37\xf8\x45\xfe\xdb\xd7\xd5\x0b\x7c\x53\x4c\x93\x7c\x23\xff\xdd\x9c\x7f\x7e\xde\xad\x65\x20\x13\x68\x61\xd0\x8b\xbd\x29\xf2\x3f\xfc\x4f\xc3\x08\x54\xf3\xa5\x8a\x3a\x43\x0d\x62\x68\xd5\xd9\x30\x9d\x63\xe4\xe3\x8a\xd5\xe4\x8f\x30\x1f\xbf\x42\xdd\xad\x72\x4d\xd1\xd9\xb8\xb2\x6c\x57\xac\x2c\xdb\x55\x2b\xcb\xf6\xd2\x95\x65\x7b\xb5\x95\x65\xbb\x6a\x65\xa9\xd0\x73\xb7\x2d\x45\xb7\x76\x09\xda\xbe\x7e\x09\xda\x2e\x2f\x41\xdf\x6d\x07\x24\x1d\x18\x54\xec\x4e\x4a\x9b\x12\xe2\x82\xe1\xbc\x07\x34\x9f\x7a\x86\x12\xd7\xb3\x25\x32\xf2\x6d\x0f\xcc\x35\x93\x77\xa9\x87\xff\xf7\x2c\x72\xf6\xac\x2f\x15\xa6\x10\x89\x99\xe0\xcb\xec\x12\x72\xad\x82\x6a\xa3\x8a\x47\xd5\xc5\x2d\x5d\x47\x15\xae\x2e\x2b\xd4\xf9\x3a\xba\x74\xef\x86\x30\x72\x38\x24\x59\x9a\x37\xa2\x0b\xab\xa1\x4b\xb7\x86\x30\xac\x86\x30\xdd\x4a\xca\xb0\x6a\xca\x74\x0b\xa4\xc1\x6e\xed\xa7\x43\x6b\xe3\xcc\x65\x96\x31\x05\x9a\xc6\xe6\xbe\x89\x24\x6f\x72\xf0\x6a\x91\xb2\x61\xfc\xac\x97\x29\xfd\x46\xd6\xd0\x32\xd5\x33\xd0\x02\xa1\x8d\x69\xdd\xb3\x45\xbc\x41\xfa\x5e\x9d\xf6\x62\x73\xa9\xc4\x57\x0f\x11\x19\xfd\xdb\x7e\x5d\x6c\xd5\x82\xf3\x9d\x21\x4f\xf1\xd3\x54\x22\x50\x42\x9a\x02\x44\x89\xcd\x62\x62\xdb\x6b\x4b\x01\xcf\x67\x2e\x12\x44\x83\x1d\xda\xad\x0c\xcb\xad\xac\xa6\xa9\x50\x0b\x36\xed\xcb\x2b\x4c\x09\x01\x66\x23\xc0\xaa\x10\xb8\x7d\x37\x99\x4d\x4c\x66\x11\x73\x25\xf5\xa6\xc4\xb9\xdb\xf5\x73\xb6\x7e\xd6\x5a\x7c\x74\x8d\x38\xd3\xa7\x17\xfa\x14\x6f\xc9\x44\x36\xa7\x32\x40\x16\x56\x4f\xe6\xed\x9a\xc9\xcc\x6b\x54\x4f\xe7\xed\xca\xe9\xcc\xcb\xd7\x14\xd7\x13\xba\x86\x72\x8f\xee\x8a\x72\x35\xf2\xee\x56\x84\x63\x35\x84\x7b\x54\x4b\x38\x56\x43\xb8\x47\x35\x84\x63\xd5\x84\x7b\x54\x22\x1c\x76\xf9\x66\xb2\x30\x44\x59\x18\xe6\xc6\x7b\x29\x1b\x8a\x21\x0d\x2d\x75\x8a\xcf\x85\x37\x95\xfa\xd7\xff\x34\xac\x57\xee\x5a\x5d\xc3\x89\x14\xda\xf3\x2a\x8c\x0a\x9a\xeb\x5d\xcd\xdf\xd0\x96\x12\xe1\xb0\xaa\x9d\xd5\x54\x63\x6a\xc3\x26\x4b\xb5\xa0\x7a\x61\x49\x4a\x1b\x85\xac\x1a\x85\x3b\x90\xc8\x36\x49\x33\x45\xd2\xa5\xba\xf3\x92\xa1\xab\xd7\x9c\x69\x15\x5c\x45\x23\xac\xba\xd7\x5f\x25\x40\xe2\x8d\xe3\x23\x12\x4a\x4b\xc2\x23\x52\x01\x65\x67\x5a\x1d\xf1\x90\x0a\x15\x1c\x04\x5d\x1f\x51\x90\xaa\xad\x12\x49\x50\x34\xe0\x0a\x6f\x21\x54\xbf\xe8\x28\xa4\x14\xc1\x4f\x76\xee\xe4\x96\x01\xc4\x96\x87\x09\x1b\xea\x08\x4f\xc6\x76\x46\x6f\x69\x44\xce\xc2\x0a\x1b\x66\xef\x6b\x44\xc0\xb0\xf2\xc6\x06\xca\x9b\x1b\x2a\x5b\xb1\xbb\x81\x8a\x1d\x8e\x68\xbb\x62\x8b\x03\xa5\x6d\x0e\x95\x2d\xef\x73\xa0\xb0\xd7\xa1\x72\x6a\x2d\x30\x5b\x97\xf1\x27\x8c\xa6\x65\x92\x1d\xbe\xcf\xec\xd3\xcf\x16\x35\xbe\x7e\xb5\xd0\xda\xdd\x2d\xdc\x2c\x59\x92\x54\xdb\x25\x1b\xc1\x36\xf0\xd8\xd8\x5f\xc8\x8b\xbe\xe5\xd6\x98\x55\xb6\x3c\x8e\xeb\xe8\xf0\x19\x74\x02\xd8\xf0\x74\xe7\xac\x78\x51\x78\x47\xa4\xe8\x6d\x76\xab\x69\x76\xcb\xac\x32\x5c\x49\x02\x54\xee\x09\xc9\x62\x94\xcf\x0d\x96\x0e\x59\x9c\xff\x8e\xa6\xf1\x74\x38\x62\x8e\xb1\x89\x96\x07\x6d\x0f\x97\x65\x0b\x6f\xa1\xfb\x56\x84\xb0\x1a\xa6\x32\x30\xd2\x75\xeb\xdf\xcf\xb0\xfd\xa4\x6d\x8e\x8a\x00\x5a\x75\x02\x60\x85\x29\xb9\xbd\xe6\x5f\xc3\xf2\x3d\x7d\xf1\x37\x4c\x2d\x2a\xc0\x16\x74\xdd\x6a\xde\x5f\x69\xeb\x00\x76\x74\xc2\xa2\x93\x96\x62\xcf\x69\xa7\xf3\x9d\xf7\x38\x56\xf8\x44\x5b\xe5\xb8\x81\x59\x62\x29\xf2\x4c\x83\x77\xae\x51\x08\xcc\xb2\x42\x14\x9e\xaa\x88\xd5\xe7\x8a\x81\x53\x96\x49\x77\x04\xfb\x79\x9e\x86\x83\x59\xce\x32\x62\x65\x2d\x66\xdd\xb5\x1b\xa2\x73\x44\x8a\x46\x88\x31\xe7\x96\x36\x62\x38\x06\xd2\x21\x74\xb4\x0c\xd1\x7c\x13\xf4\x70\xa8\x25\x95\xdd\xfa\x88\x33\xc4\x07\xcb\x03\xce\xb4\x6f\x18\x70\xe6\x48\xca\xa2\xaa\x78\x33\xd6\xf0\xdc\x94\x5c\x43\x24\xd7\x87\x8f\x07\x47\x07\xef\x8e\xf7\x8f\x0f\xdf\xbf\xeb\xef\x1f\x1f\x7f\x3c\x7c\xf9\xdb\xf1\xc1\x11\x19\x8f\x73\x1a\x19\xd4\xb9\xa9\x25\x68\xcb\x17\xee\x04\x31\x26\xfa\x7c\x2d\x00\x3a\x8e\x3e\x9f\x50\xb7\x02\x60\xcd\xc4\x5b\x41\xb2\x66\xee\xad\x20\x99\x33\xfd\x56\x80\xb4\x68\xb8\x1d\x91\x2d\xc9\xba\x06\xa8\x24\x66\xef\x47\x9c\x3f\x9d\x93\xf5\x11\x59\x9f\xd3\x4e\xdd\x8d\x2b\xb7\x36\xfa\xd2\x17\xc1\x87\x6d\xc9\x4f\xed\x12\x5f\xb4\x4b\xe3\xdb\x2e\x8e\x53\xdb\xa6\x77\xbb\x4c\xb7\xf6\x86\x0a\x48\x7d\x47\xb1\x9d\xb4\xb6\x5d\x30\xa2\x5f\x1a\xf6\xe3\x7b\x1b\xd1\x57\x84\xbd\xaf\xb3\xb8\x5d\xd3\xbb\x40\x65\x1b\xb7\xb2\xae\xaf\x80\xb7\xae\x35\xbc\x00\x35\x09\xe3\x97\xf5\xee\x0f\x9e\x6f\x3f\xbb\x1b\xf8\xb7\xb2\xb7\xb7\x41\xad\x6b\x15\x2f\xa1\xf8\xf3\x25\x1d\xde\x7e\xbe\xa6\xfd\x76\x11\xfe\xad\xec\xee\x6d\x50\xeb\x5a\xde\x7f\x93\x57\x22\xdb\x77\xf0\x4a\x64\xfb\x76\xaf\x44\x1e\x7d\xc3\x57\x22\x8f\xee\xea\x95\xc8\xa3\x3b\x78\x25\xf2\xf8\xdb\x3f\x9e\x78\xd2\xef\xab\xc8\xfc\xfd\x63\x36\xaf\xe7\x97\x27\x6b\x4a\x82\xa7\x66\x0b\x6f\xfc\x01\xab\x7f\x3a\xf6\x78\xcd\x4e\x3c\x43\xd7\x21\xb9\x1f\xc6\x2c\xed\xbf\xe1\x5a\x71\x3d\x9d\xd6\xf4\xe7\xf2\xfc\xdb\x3f\x32\xe9\xb4\x6f\xf8\xca\x44\x1a\xc3\xfe\x78\x07\xf2\xe3\x1d\xc8\x8f\x77\x20\xdf\xe6\x1d\x08\xbd\x5e\xf8\x83\x5c\xaf\x1a\xcd\xca\x48\x3f\x99\x64\x06\x22\x28\x57\xdb\xaf\x76\x4c\x36\xd2\x21\x83\x44\x10\xa1\x4c\x85\xff\x08\x5d\x78\xb1\x0b\x6d\x57\x7a\x89\x10\x63\x7c\x6f\xa5\x99\x83\x08\x84\xae\x59\x59\x4c\x1e\xf4\x6d\x92\x0c\x3e\x23\x33\x96\x67\xcc\x8f\x57\x2e\x3f\x5e\xb9\xfc\x78\xe5\xf2\xd7\x7a\xe5\x82\x2e\x46\xe7\x61\x46\x06\xe8\x11\x3a\x8c\x54\x46\xe9\xd9\x22\xcb\xd9\xc4\x7a\x02\x43\xe2\x0b\xf5\x04\xda\xc5\xef\xf3\xca\x37\xb1\x69\xfc\xd6\xd7\x76\x05\xdc\x96\xdc\xdf\x15\x4a\x5e\x73\x91\x57\x28\x7d\xe3\x1b\xbd\x42\xfd\x55\xae\xf6\x8a\x4d\xde\xf0\x8e\xaf\x44\x09\xeb\xb2\xef\x8c\xe5\xc7\xe1\xf0\x1c\xef\x49\x5e\xf1\x31\x6f\x78\xe2\x1e\x0a\x19\x85\xff\x7b\x08\xaf\xfc\x68\x38\x43\xe7\x12\x79\xe9\xbd\x42\x1e\x0e\xcf\x65\x39\xe1\x49\x16\xbe\xbc\x13\x71\x67\x8d\xa2\xc7\xfa\xf5\x42\xb1\x96\x34\xf5\x97\x71\x3e\x9d\xb9\x07\x22\x62\x26\x67\x3a\xa8\xb8\x86\x2c\xa1\x6d\x3c\x25\x52\xd7\x48\xba\x71\xf5\x64\x47\xa6\xec\xac\x7e\x7b\xe9\xdb\xd7\x7a\x7e\xe9\x4e\x6f\xc5\xdb\x4d\x7d\xbf\x67\x05\x0e\x59\x76\xf0\x50\xa5\x90\xaf\xf8\x56\x43\xf5\x54\x3f\xaa\x50\xe7\xf0\xf2\x38\xdf\xe2\x00\xbe\xf7\xda\x8f\x87\xe3\xa4\xee\xe6\xb7\x54\xae\x70\x09\x9c\xa4\xa1\x72\x9f\x6c\xd2\xb2\x65\x64\xec\x98\x57\x90\xb9\x82\x54\xbe\x67\xcb\x2e\xc3\x7c\x38\x06\xc7\xa8\x6b\x45\x27\xf0\x33\x06\x8d\x88\x8d\xf2\x46\xcf\x20\xb8\x05\xb1\xc1\xe2\xa0\x61\xc6\xd8\x1f\xa4\xcc\x3f\xdf\x29\xc0\x48\xc3\xb3\xf1\x32\x20\x78\x94\xb9\x0c\x8c\x8c\xec\x58\x0b\x61\x12\x06\x41\xc4\xea\x41\x14\x6f\xa2\x74\xed\x65\x43\xf6\x7b\xc8\x2e\x5f\x26\xf3\xfa\xb1\x12\x05\x2a\x6f\xea\xbb\xab\x5c\xd5\x77\xeb\xb9\xb9\x5b\xb8\xac\xb7\xa7\x48\xb7\x3c\x47\xf8\x74\xcf\x8c\x02\xf8\x6d\x31\xc3\xc4\x9f\x93\x8c\xe2\x3c\x76\xcd\x95\x74\xf5\x41\x97\xe3\x3a\x08\xd6\x8c\xd5\x80\x91\xd5\x2b\xae\xc5\x31\xdd\x10\x07\x5c\xf8\xb6\xd5\x80\x58\xf7\xc0\x93\x30\x5e\x11\xb1\xba\x23\xc7\x3b\x45\xcc\xe6\x15\x63\x46\xd8\x17\xa9\xda\x28\xce\x38\x8a\x2f\x0c\x8b\x3e\x94\x2f\x64\x58\x47\xfc\x56\xff\x8b\x98\xe9\x3a\xd6\x25\x80\x35\x98\xc5\x3a\xb2\x33\xb5\xdc\x4d\x26\x26\x7c\xad\x7a\x13\xc6\x6c\xa9\x1d\x8a\x2c\x54\xc9\xe5\xdb\xab\x70\xf9\x76\x3d\x97\x6f\x2f\xe5\xf2\xed\xeb\xb8\x7c\x9b\xb8\xdc\x82\x20\xd0\x35\x81\x88\x24\xcb\x9e\x85\x2b\xbf\x08\xa8\x6e\xf7\x27\x6a\x7b\x70\xd2\x18\xce\x1b\x1e\x34\x86\x0b\xfe\x7f\xc4\x08\xc3\x97\xf2\x96\x31\x45\x52\xf1\xd4\xb5\xa6\x1b\x9e\xd8\xf0\xdd\x22\x96\xac\x0f\x8a\x58\xc7\xa7\x27\xca\x8c\x40\x44\xa1\x68\x9f\x7a\x25\xe6\x75\x3d\x61\x6d\xe0\xcf\x65\xb1\x4e\x55\x31\x15\x2d\xe5\xca\x83\x93\xc3\x78\xc4\xb7\x46\x0b\x0f\x9a\xf2\xe7\xa9\x6d\x98\x91\x84\x71\xde\x5e\x45\xd9\xbc\xc5\xfa\x49\xf4\xc1\x5e\x99\xcb\xa7\x81\x41\xe7\xfb\x60\xd0\x39\xb5\x5e\x45\x2a\x14\x84\xca\x72\x33\x93\x83\xaa\x43\xc4\x15\x4d\x0e\x88\x27\x2d\x4b\x80\x51\x18\x45\x3d\x68\xc4\x49\xcc\x1a\x7a\x00\xbf\x25\x12\x92\x9b\x2d\x34\xe6\x9d\x9e\xe0\x89\x96\x31\x93\x17\x3a\xd5\x98\xc4\xf3\xae\x48\xed\x58\x65\x75\xea\xa2\x56\xd4\xde\xe0\x46\xa2\x6c\x20\x12\xa1\x20\x33\x46\xcb\x34\x14\xd0\xa6\x54\xc8\x11\x4d\xd2\x92\x9b\xbc\xb3\x4d\xac\x08\x57\xf2\x84\xb0\x5e\x8b\x23\x79\xc8\xe5\xed\x61\xce\x26\x4b\x85\xa6\x2c\xe4\x24\x53\xda\x4f\x8b\x68\x5f\x46\x70\x11\xc9\x66\xb9\x28\x5a\x6d\x08\x75\x33\x92\x84\xd9\xef\x7e\x14\x06\x92\x26\xd4\xb8\x6b\xca\x16\xa3\xb5\x1b\x52\x3b\x4a\x62\x66\x03\x96\x14\x2b\x18\x24\x2d\x47\x7b\xe9\x7d\xa9\xe3\x5e\x83\x33\xe5\x3a\x95\xed\xde\x45\x27\x2d\x96\x32\x96\x8b\x1b\x5d\xae\x54\x6c\xb6\xcd\xa5\xc7\x92\x27\x82\x2f\x4c\xcb\x34\x58\x95\x71\x79\x37\x9b\xc8\x51\x0d\xa3\xfa\x95\x65\x61\x86\xd9\xea\xbb\xd6\x34\x4b\x52\x6c\x05\xde\xcf\xae\x65\xfc\xac\xa8\x2a\x70\x0d\x41\xea\xc3\x96\x88\xa5\x35\xf6\x51\xad\x12\x61\xaf\xf6\x8f\xca\xab\x7d\x2e\x14\x46\x23\xbf\x5e\x9d\x78\x54\xad\x4e\xfc\x82\xce\x04\xc9\xd7\x82\x09\x48\xa5\xdb\x16\x7b\x69\x72\x6e\x82\xa4\x84\x75\x54\x8b\x47\x5c\xb5\x50\x5a\x04\xff\x51\xd2\x2f\x14\x0a\x3c\x81\x5a\x2a\x6a\x19\xd6\x46\x08\xa9\x58\xb1\x89\x34\x57\x56\xce\x3a\xd2\xfc\xe4\x3b\xac\x66\x96\xd1\xe9\x2c\xcb\x93\x09\x47\xee\x7b\x20\xc0\x09\x68\xd3\x2a\xcc\xd9\x24\x53\x0a\x99\x1d\x56\x11\x35\x26\x23\x2e\x35\x98\x27\x1c\x7c\x30\x91\x89\x5b\xe5\x43\x11\x52\xdf\xec\x18\x78\xb9\xd1\x45\x3d\xdd\x2b\xb7\xaf\x3d\xe3\xb7\xc5\x99\x32\xb0\x35\x9f\x7c\x49\xee\xe7\x0c\x03\xed\x3a\xcf\xdb\xd0\x14\xda\x0a\x1a\xfe\xd3\xfb\x59\x8e\x89\x78\x3f\x60\x24\x2c\x28\xe6\xae\xb6\x1d\xf5\xf4\xe8\xdb\x32\x87\x78\x4b\x6a\x1a\x9e\xd0\x3b\x28\xd5\xac\x5e\x18\x41\x1b\x08\xde\x79\xf4\x20\xb4\x2a\x70\x44\xec\x62\x53\x7f\x11\x25\x7e\xd0\x23\x25\x55\x17\x76\x8d\x68\x81\x77\xa0\x10\xac\x24\xbd\xab\x6e\x95\x57\x16\xdf\xeb\xca\xec\x86\x67\xd5\x24\x01\x8b\xc2\x1c\xdf\xae\x98\xb2\x7c\x6d\x5d\x6f\x54\x34\x3d\xcd\xde\x8f\x5e\x8d\xc3\x28\x10\x47\xbf\xc4\xcd\x62\xf5\x51\xbc\x6f\x2d\x1d\xa2\x4c\x41\xa1\x41\x11\xab\x19\xdc\x2b\x88\xd0\x3d\xfb\x9b\x66\x47\x4b\xa8\x3d\x62\xc8\xc5\x67\xc5\xaa\x74\xa7\x1a\xe1\xc6\x37\x18\xfe\x95\x95\x4a\x92\xeb\x70\x65\xec\xf8\xb9\xf0\xd9\xb0\x7a\x5c\xbb\xce\xde\xfc\x61\xc8\xe3\x15\xd7\xd0\xff\x9f\xbd\x77\xed\x6a\x23\x47\x1e\x87\x5f\x0f\x9f\x42\xc9\xce\xc6\x76\x30\xc6\x36\x10\x88\x59\x26\x6b\x6e\x09\x93\x10\x12\x20\x93\x4d\x78\x38\x4e\xdb\x96\xed\x0e\xed\x6e\x4f\x77\x1b\xe3\x04\xbe\xfb\x73\x54\xa5\x6b\xdf\x7c\x83\xfc\x66\xe6\x1f\x66\xcf\xc6\xdd\x2d\x95\x4a\xa5\x52\xa9\x24\xd5\x65\x63\x8a\x1d\xf3\x46\xe2\x8e\xd9\x58\x6a\x11\x8c\xe9\x4e\xf1\x08\x5b\xba\xbd\x25\xf8\x2b\x92\x69\x98\x4c\xf0\x98\xf8\x9b\x8f\xb8\x31\xd6\x92\xa4\x4f\x9e\xe0\xa8\x44\x8f\x52\x8a\x86\xae\x1a\x29\xc6\x75\xa8\xe2\x14\xdd\x49\x32\xbc\x49\xe8\x0e\x07\xbc\x67\x39\xce\xee\xf8\x9d\xe5\x33\x62\x69\xdc\x22\xf5\x06\x79\xa0\x59\x48\x60\x54\xd3\xb4\x3c\x72\xe5\x91\x6d\x63\xbe\x36\xa3\x8d\x79\x04\xb8\x66\x6c\xce\x28\x7b\x8e\xf7\x8d\x39\x3f\xa9\xc0\x1c\xd6\xe8\xc9\x12\x74\x0a\x6b\xf4\x59\x41\xe2\xb8\x1c\xfc\x71\xf0\xf6\x3c\xd1\xb2\x3d\x1c\x0f\x32\xcd\xa5\x93\x0d\xd7\x84\x8d\x73\xfe\x22\x87\xd6\xca\x70\x58\x65\x85\xb4\xeb\xf9\xe3\xdc\x65\x61\xb2\xad\x7b\x2a\xdc\x69\x6d\xdd\xa7\x00\xd0\xb3\xdb\xf3\xf5\xad\xe9\x79\x10\x23\x4e\x8d\xf6\x51\x7b\x7e\x22\x4d\x32\x04\x4f\xad\xcd\xfd\x06\xe6\x27\x02\x1b\x88\x25\x22\xbc\x98\x17\xa2\x25\x93\x19\x7b\xde\xd0\x0d\xef\x01\x4e\xa6\x51\x7d\x2a\x0c\x48\x1f\x70\xd2\x99\xda\x36\x52\x27\x64\xcf\x1a\x08\xcf\x6f\xbe\xc0\xcd\x83\x80\xcb\x8f\x9c\xd4\x19\xe7\x02\xc4\x80\x90\x18\x30\x51\xb4\xcb\xb0\x85\x66\x22\xdc\x9b\x15\xc5\xdd\x57\x51\x5e\x51\xe1\x74\x14\xeb\xc3\xff\x01\x1f\xc3\x74\x9a\xab\x59\x50\x44\x11\x7f\xc6\x38\x7f\x3f\xdc\xe7\xaa\x4a\x51\xb7\x98\xab\x2e\x53\xdc\x90\x60\x62\x7f\x35\xbf\xe0\x59\x8a\x1c\x56\xcc\x05\x8b\x21\xc4\x20\x61\x32\x94\x1f\x3d\xf3\x17\x1b\xfc\xc9\x9e\x38\x13\x27\xa5\x35\x0c\x3d\x36\x17\xdb\x56\x68\x1d\xdb\xae\xfc\x69\xdd\xe4\x2e\x0b\x97\x28\x00\x20\x55\xc7\xff\x01\x6f\x47\x71\x74\x20\x95\x0f\xfb\x35\xf0\x46\x70\xfc\xf3\xa7\x0f\x82\xc4\xf1\xba\xec\x1f\xbb\x4d\xdd\xd0\x0e\xc7\x78\x54\xd4\x87\x23\xa3\xa6\xe5\xb6\xb1\x86\xed\x42\x59\x14\x8d\x0e\xfb\xf9\xe7\xd0\x72\x43\x1b\x8f\x96\xf0\xf7\x37\xf8\x3d\x0c\x5b\xe7\xbc\x7a\x40\xff\x1c\x32\xa0\x58\x21\xec\xf9\x34\xe8\x79\x4e\x3b\x07\x8a\xda\x22\xdc\x6f\x39\x8e\x37\xda\xb7\x42\xeb\xe4\x9a\xfa\x1d\xc7\x1b\xcd\xad\x08\x4c\xf2\xa5\x42\x0d\x4a\xea\x41\x31\xb5\xa1\x5c\x4c\x74\xb8\xb2\x34\xc7\x29\x63\x05\x10\xf2\x5b\x9b\xc2\xb9\x7f\xb5\x5a\xad\x9c\x29\xc5\xc1\x12\x4d\xca\x45\xfd\x89\x2f\xd3\x1b\xfa\xac\xbb\x28\x17\x09\x8e\xf3\x65\x0a\x75\x64\x5e\x2e\xce\x8d\x58\xfa\xde\x7d\xb8\x12\x0c\xad\x22\xce\x5c\xd5\x9f\xce\x5c\x7f\x19\x67\xae\x07\x71\xf5\xa9\xdc\x83\xab\x4f\x65\x31\x57\x9f\xea\x03\xba\xfa\x54\xef\xcb\xd5\xa7\x7a\x0f\xae\x3e\x3f\x26\x4f\xca\x43\x7b\xc9\x6c\x3c\xbc\x97\xcc\xb3\x46\x03\x76\x09\x8d\x7d\x2f\x9d\xe1\x37\xe7\x64\x89\x4d\x01\xfc\x9d\xe7\x8c\xbb\x19\x42\xa4\x5a\x5d\xc4\x55\xe9\x41\xfd\xad\x9e\xcf\xec\x45\xf4\xd3\x87\xe8\xa7\x0f\xd1\x4f\x1f\xa2\x9f\xb9\x64\x7e\x7a\xd9\xfc\xf4\xb2\xf9\x27\x7b\xd9\xd4\xb9\x87\x0d\xdb\xf6\x59\x0e\x69\xdb\x3e\x05\x5a\x47\x5c\x6b\x60\x5a\xf3\xb4\x08\x3c\xc6\xe2\xbb\x23\xb2\x4a\x2a\x5b\x65\xcc\xbb\x46\x61\x4b\x59\xa1\x2b\x1b\xdb\x9a\x23\x0e\xd8\xf2\x4e\xeb\x87\xf3\xc3\xc2\xe7\x99\xa8\x4d\x72\xc3\x91\x05\xa7\xf1\xc2\x91\x85\xe7\x73\xc2\x91\xd5\xa7\xf6\xc1\x51\x0d\xce\xe3\x82\xa3\x11\x21\xc9\x03\x87\x6d\xd6\xe7\x72\xc0\x71\x6c\x97\x12\xea\xb6\xe1\x60\x45\x54\x90\x9e\x38\xc2\xa7\xa6\x6d\x85\x16\xf8\xe0\xb0\xcd\x3c\x9b\x18\x70\xbe\x2e\x8b\xc7\x5d\x70\xca\x45\x32\x2e\x17\x6a\x50\x07\x8c\xc8\x79\x06\x07\xaf\x03\x46\x21\x45\x51\x35\xf6\x97\xbf\xa9\x14\xc9\xb8\xc2\xab\x6a\xa9\x1f\x1c\x2f\xa0\x90\xc7\x64\x42\xf5\x6a\x91\x8c\xab\xe9\xd5\xad\x1b\x5b\xe0\x9d\xe9\x1b\x24\x09\x9a\x67\x7d\x7f\xf0\x80\x85\x7e\x24\xa4\xa0\x1f\x0f\x53\x68\x38\xc8\x34\x62\xce\x31\xd1\x0b\x6d\xe3\xde\xbb\x24\xde\x98\x06\x56\xfc\xe5\x99\xfd\x8d\x72\xdb\x21\x79\xb5\xcb\x7f\x97\x02\xf6\xed\xf6\x96\x6c\x19\x26\xcc\x53\x99\x2f\x27\xa9\xf2\xb3\xa5\xbc\x61\xa4\xd7\x4d\xbd\x0d\x1c\xaa\x3f\x02\x07\xb2\x6c\x78\x11\xc1\x5a\x9d\x03\x0f\x87\x1c\x79\x41\x56\x2a\xa4\x46\x2a\x05\xf2\xd4\x20\x65\x12\xde\xa6\x25\xc0\x77\x34\x3b\xae\x94\x6e\x8a\x68\x6a\x5c\x29\x8d\x8b\x68\x5e\x5c\x85\x77\xf8\x6b\xac\xbb\x39\x18\x33\xfa\x25\x0d\x61\x2e\xb3\xc9\xb0\x62\xa1\x8d\x9c\xd7\x21\xd4\x6a\xf5\x92\x5d\xea\x8c\x89\x0c\x93\xd8\x4b\x9b\xc4\x67\x70\x2a\x7f\xa7\xc3\x96\x13\xe6\x3e\xfd\xbf\xe2\xf3\x6a\x66\x1f\xb0\x96\x17\x88\x35\xae\xe5\x05\xf9\x95\x08\xdd\x89\xc8\x0f\x64\x30\x4e\x96\xe3\x18\x04\x68\xf4\x02\xf2\x1b\x5b\x25\x0d\x43\x5d\xbd\x52\x8c\x21\xc0\x7d\x85\x31\x04\x77\xf8\x22\x35\xd3\x7f\x4c\x33\x1f\x66\xd0\xff\x43\x56\xe6\x04\xcf\x80\x32\xe0\xa6\x5f\x59\xdc\x4a\x38\xcb\x85\x6c\x0e\x8f\xb1\xfb\xf2\xa9\xb9\x6f\xcf\xb1\x88\xd4\xac\x26\x88\xcd\x98\x09\x50\x35\xd1\x04\x48\xbc\xe3\x06\x18\xd1\xa2\xec\xf5\x3d\x78\x50\x24\x1d\x30\xcd\x13\xb4\x71\x61\x2f\x8a\x05\x10\x91\x5e\x14\x05\x63\xd6\x98\x04\x64\x5c\x8b\xf1\xc5\x73\x09\x46\x52\x33\x9c\xd9\xc6\x0c\xa1\xa6\x3d\x5a\x4b\xb2\x7c\x4a\x36\x70\xcc\x30\x82\x82\xcb\x13\xcd\x95\x42\x37\xff\x4c\x30\x6f\xe7\x5e\x74\x06\xef\x9a\xfe\x74\x84\xf8\x35\xce\xb5\x9a\x75\xa8\x66\xbb\xae\x38\x4c\x18\xb7\x69\x62\x30\xee\xf7\x08\xca\x4d\xa6\xdd\x6f\x02\xf9\x7f\xc0\xc2\x1d\x73\xd2\x9a\xc7\x0e\x72\x11\x66\x88\x1f\x85\x4e\x60\x88\x59\xd8\x40\x1f\x7e\x3e\x04\x35\x31\x14\x77\x7f\x1b\x2f\x9b\x24\xf2\xde\x93\x97\x4d\xe2\xc8\xfd\xd3\xbc\x6c\x26\xb3\xe7\xf4\x76\xda\x3f\xce\xcb\x46\xe3\xe5\x7f\x8a\x93\x4d\xba\xa7\xee\x44\x97\x5a\xc3\xf2\x77\x2d\xe6\x64\x13\xdb\x47\xad\xc9\x8d\xd4\x64\x57\x9b\xb5\xa9\x5d\x6d\xd6\xb8\xab\x8d\xd1\xb7\x99\x9c\x59\xee\x47\xb1\x58\xd0\xa1\x65\x11\x24\xd0\xa1\xc5\x14\x6a\x6f\xf8\x31\x77\x4c\xcf\xd2\x3d\x3d\x0c\x0d\xe8\xa1\x75\x1f\x81\x55\x61\x71\xe7\x1b\x47\x9c\x2f\xc4\x1c\x70\xd4\xc9\x43\xa2\xff\x8d\xae\xda\x9b\x15\xb5\xbd\xd5\x3d\x7a\xee\xe8\x3a\xcf\x8f\x70\xb1\x29\x46\xbc\x68\xf4\x79\x73\x53\x53\x74\x2b\xc1\x49\x8f\xfe\x62\x5c\xd5\x74\xaa\x59\x3c\x6e\xee\x49\x92\x27\xdd\x50\xdf\xbb\xc7\x4d\x44\x7e\xdf\xaf\xc3\x4d\xf2\xd4\xb8\x07\x87\x1b\xfd\x68\x69\x91\x71\x88\xbb\x42\xcf\xbb\xee\x99\xfa\x3c\x90\xc7\x90\x39\x45\xc5\x58\xf1\xae\x40\x37\xfe\xd2\x3e\x44\x33\xb0\xf4\x3d\x32\xf4\xb4\x5a\xf4\x8f\x76\x21\x5a\xc0\x0d\x37\x72\xc4\xb0\x3e\xcd\x11\xc3\xba\x3c\x37\x30\xdd\x88\x38\xac\xff\xec\x90\xb2\xf2\x25\x7a\x38\xaf\xa2\xbf\x34\x0f\xcc\xed\x54\x14\x73\x26\x4a\xe0\x9a\x04\x7f\x1e\x79\x7f\x92\xed\xce\x53\x99\xc7\x9d\x47\xc2\x4e\xf1\xe6\xb1\x12\xbe\xcf\xe1\xcc\x93\x2c\x9d\x17\x72\xe6\x49\x06\xb9\xa8\x33\x4f\xb2\x69\xda\x34\xce\x3c\x92\x52\xd9\x8e\x30\xd9\x0d\x4c\x32\x54\x4e\xad\x3d\xd9\x11\x26\xb5\xaa\x72\x84\x21\x70\xc6\xfe\x9a\x66\x7a\x15\x3d\x50\x07\x26\x1b\x92\x3f\x44\xdf\x95\x35\x74\xb6\x2f\xd6\x24\xb4\x27\xfa\x62\x4d\x01\xc0\x9f\x98\x4d\xe3\xaf\x4a\x7a\xa4\xe0\x24\x5f\xb2\x54\x20\xc2\x97\x6c\xa2\x91\xff\x03\xf5\x1f\xa7\xf6\xac\x92\xa6\x0d\x92\xe6\x6c\xaf\xfe\xe6\xa0\x71\xfe\xe9\x1d\x0a\x99\x4c\x9b\xfc\x89\x5c\x38\xa5\x0f\xd2\x03\x91\x61\x92\x1f\x4f\x7a\xb3\x9a\x0f\x92\x7e\x96\xbe\x90\x9c\x1d\xe0\xe1\x27\x08\x5a\x3c\x8d\x57\x4e\x4e\x7f\x67\x02\x4d\x72\xd2\xfa\xab\xe1\x0e\xce\x49\xf3\x77\x7a\xae\xaa\xdc\xbb\x8b\x4f\x89\x89\xfe\x90\xa9\x70\x26\x7b\x45\xa5\x0b\xb6\x59\xfc\x21\xd3\x11\x98\xcd\x1f\x72\x82\x84\x56\xfe\x90\x93\x1d\xd7\x26\x2d\x96\xd3\x3b\x55\x4e\x9c\xa9\x68\x52\x50\x14\x77\xbd\x8a\xcd\xa7\xf2\x8a\xcb\x64\xbc\x29\x1d\x8b\xa4\x26\x16\xd3\xc3\xca\x31\x77\x9d\x64\x57\xa3\x14\x27\x20\xd3\xeb\x08\xfb\x97\xee\x63\x94\xe5\x75\x84\x8b\x23\x98\xf1\x3d\x8c\xc3\x90\x61\x13\x16\xf1\x17\x5a\xfb\x2b\xf9\x0b\x3d\x88\xc3\x4c\x2c\x55\xe1\x5c\x6e\x41\x0b\x39\xcc\x54\x1e\xd0\x61\x26\x39\x9b\xd9\x5c\x4e\x41\x8b\x3b\xcc\x54\x67\x74\x98\xf9\x69\xe1\xff\xd3\xc2\xff\xa7\x85\xff\x4f\x0b\xff\x9f\x16\xfe\xff\x60\x0b\xff\xcf\x60\xe3\x2f\xed\xf9\xd9\xec\xfd\x3c\xad\x49\x7e\xd2\x82\xf2\x20\x26\xf9\x9f\x27\x58\xe2\x7f\x9e\xc2\x00\xff\xf3\x5c\x76\xf7\x9f\xa7\x35\xb7\xff\x3c\x8f\x95\xfd\xe7\x04\xe3\xfa\xd9\xee\x1b\x62\x87\xf5\x09\x67\xd1\x9f\x27\x1f\x41\xcf\x9a\xb5\xf8\x73\xc6\xc9\xf2\x34\xa7\xb5\xd9\xe9\x65\xb3\x4e\x6b\x57\x57\xc1\xca\xde\x65\x88\x78\x1d\xb4\x2d\xe6\xc8\xd1\x36\x5b\xbe\x43\x9e\x18\x66\x89\x40\xa1\xff\x83\x24\xb7\x93\x8f\x35\x27\xe4\xc7\x35\x7a\x3a\x74\xed\x70\x62\x4f\x59\xa1\x7f\x42\x4f\xff\x1c\x52\x62\xb7\x59\x77\xbf\xad\xf0\xae\x7d\x9b\x7c\x34\xff\xb7\xe8\xdd\x15\x1d\x4f\x1c\xc6\x29\x4e\xf1\xff\xaa\x7d\x9d\xab\xaa\x3a\xc5\xe7\x44\xf2\x2d\xb7\x0b\xf3\x9a\x13\x04\x9e\xe7\x22\xc7\xe4\x23\xa4\x09\x1d\x9a\x2e\x7c\xcd\x03\x0d\xc7\xdf\x36\x7c\xcd\x84\xa1\x86\x23\x94\xf4\x63\xa1\x6f\xc6\xf1\x0f\x1f\xfc\x8b\x67\xeb\x45\xf2\x6c\xfd\x32\xf1\x44\xc8\x8c\x50\x73\xef\x27\x34\x9f\x53\x0e\x66\xd6\xb3\x0e\x66\x38\x98\x19\x0e\x63\x38\x35\xc9\x1f\xf5\x53\x72\xf4\xf6\xf7\x83\xbd\xf3\xa3\x93\xb7\xe4\xe9\xaa\x82\x3d\xf0\xbd\x16\x05\x5d\x9c\x6b\x71\x7b\xde\x60\x0c\xd1\x74\x48\xbe\x55\x20\xd5\x72\x65\x6d\x65\x80\x56\x64\x45\x72\x68\xb5\x68\xd3\xf3\xae\x8a\xe4\xc8\x6d\x95\x96\x08\x54\x38\x67\xdb\x10\x1e\x52\xa0\xe5\xb5\x29\xb1\x03\xe2\xd8\x2d\xea\xb2\x6d\xc8\x90\xa9\x15\x20\x89\x8e\x8f\xce\xc5\x6b\xd2\xf1\x86\xae\x10\x51\x0c\xc4\x9b\xa3\xbd\x83\xb7\x67\x07\x84\x29\x90\x42\x72\xf9\x9e\x17\x72\xbf\x50\xcf\x07\x09\x17\x6a\x0d\x85\x3e\xa5\x25\xa1\x5c\xf2\x8d\x2b\xeb\x47\x89\xba\xd7\xa5\xb7\x27\xfb\x07\x8d\x83\xb7\x7f\xc0\x56\x21\x37\xf0\xbd\xf6\x10\x3a\xcb\xcd\xf7\xe1\xb4\xc0\xbd\xb6\x7c\xdb\x72\x53\x8e\x4c\xf2\x5b\x9b\xa0\x59\xb1\xa2\x23\xcb\x77\x6d\xb7\x9b\x76\xa0\x51\xa9\xca\x92\x70\x1d\xf4\x4e\x68\x2c\x67\xb4\xe5\xd3\x34\xf8\x15\xc8\xaf\xcb\xad\xe7\xbc\x6e\x97\xb6\x59\x9d\x43\xcb\x76\x86\x3e\x2a\x3b\x77\xdb\x4b\x4a\xb5\xae\x07\x01\xf5\x43\x12\xf6\x2c\x74\x95\x02\xf5\x2d\x20\x7d\x2b\x6c\xf5\xc8\xc8\x0e\x7b\xe8\x40\xc5\x36\x26\xc1\x80\xb6\x02\x46\x1a\x02\xdb\x21\xd2\xa7\x41\x60\x75\x69\x40\x2c\x9f\x92\x3e\xed\x7b\xbe\xfd\x8d\xb6\x89\xe5\xb6\xc9\xc8\x66\x1b\x21\xd7\x19\xb3\x5d\x51\xd0\xf3\x46\x2e\xf1\xdc\x16\x15\x03\xcb\xfd\xad\xbe\x7b\xdc\xdd\x8a\x81\x3f\x63\xd0\xc9\xb1\x35\x60\x03\x02\xba\x52\xe8\x11\xcb\xec\x79\x52\x5d\x8e\xf0\xe9\xd0\x65\x52\x44\x3c\x42\x7f\x5c\x4a\xdb\x0c\x4a\x13\x3b\xb0\xd2\x62\xba\x35\x6d\xeb\x50\x02\xee\xc5\xe5\x78\x2d\xf4\x24\xa2\xa5\x6e\x89\x3c\x66\x12\xe1\x71\x91\x3c\x6e\x79\x6e\x48\x6f\x42\xf8\x09\xa6\x5c\xe2\x45\x12\x0c\x69\x9f\x0c\x2a\xe7\x5b\xae\xee\xa1\x2f\x29\xff\x02\x87\x4a\xd4\xa0\x5e\x49\x07\xf5\x42\xd8\x6a\xdf\x91\x2e\x0d\xcf\x42\xab\x75\x45\x50\xbb\x0f\x22\x80\x02\xf6\x8d\xd7\xf5\xed\x6b\x2b\xa4\xc0\xb3\x52\xed\x86\xbe\x4a\x8e\xc9\x4b\x0a\x73\xdb\xf8\xa0\x28\xbb\x5c\x34\x11\x2f\xca\x96\x91\xa7\x67\x9c\x02\x44\x9d\x9b\x89\x36\x81\x12\x6c\xee\x09\x1c\xd4\x5e\x40\x6c\xd2\xe1\x75\x24\xee\x47\x5e\xaf\x5f\x88\x1a\x86\x02\x11\x95\xe5\xe6\xea\x2a\x61\xf5\x90\x51\xaf\x2d\xc7\x6e\xe3\x70\xf6\xad\x31\x6e\xe5\x4b\xe4\xc8\xc5\x6c\x64\x61\x8f\x8e\x49\xdb\x2b\x92\x11\x25\x6d\xcf\xcd\x85\x64\xc4\x66\x6b\xe8\xe9\xc0\x3a\x96\xed\xa0\xb0\x80\xed\x0b\x19\xf4\x58\xd5\x51\x8f\xfa\x94\xd8\x4c\x7a\xb4\x59\x45\x28\xd5\xa4\x1d\xcf\xa7\x25\x72\xe6\x31\x88\x8e\xd7\x25\x76\x58\xd2\x61\xd5\x3b\x21\x4a\xaa\x80\x92\x9e\x75\x4d\xf9\x81\x89\x43\x2d\x97\xc9\xb1\x01\xc3\x24\xe7\x38\xc4\x41\x6f\xc5\x3e\x47\x58\xd9\xf2\xf8\x63\xc3\x04\x14\x14\x0f\x3b\x60\xd2\xd0\x76\x43\xb6\xe0\x79\xae\xe5\x38\x63\x62\xb9\x9a\xf4\x81\x19\xd0\xa5\x61\x40\x5a\xd6\xb0\xdb\x0b\x4b\xe4\x28\xcc\x21\x17\x05\x56\x9f\x9a\xf0\x9a\xb4\x67\x5d\xdb\x9e\x4f\xac\x00\x26\xbd\x37\x0c\xb9\x50\x0c\xad\x10\x2e\xc8\x08\xbd\x69\xd1\x41\x88\x22\xc1\x22\x4d\x0a\x86\x7a\x9c\x89\x4b\x86\x81\x2a\xc7\x40\x9c\xbe\xc8\xf1\xbd\xd0\x07\xf4\x12\xbd\x9f\x04\xbf\xb2\x05\xfb\xdf\x41\x8d\xfc\x3b\xc0\x21\xfc\xf2\xef\xe0\x0b\x76\x10\x06\x73\x9b\x11\x1d\x0e\x5b\x9a\xd4\x38\x5d\x19\x06\x43\xe8\x7a\xc7\xf7\xfa\x10\xf7\x3e\xc7\x3a\xf8\x85\xcd\xdf\x15\x58\xd1\xbf\x10\x26\x1f\xad\x2e\x2d\x92\xe6\x30\x24\x3e\x6d\x51\xfb\x9a\xb6\xa1\x81\x52\x2e\xc2\xfb\x6c\x05\xce\x81\xc4\xc1\x73\xb7\x9c\x3e\x4b\x74\xec\x8b\x24\xbb\x73\x05\x3d\x11\x1d\xce\xf7\x9d\xb4\xb2\x79\x31\x21\xcd\x06\x22\x93\x52\xe1\xc1\x36\xce\xc5\xc4\x15\x41\x6b\xf5\x8e\xb4\x40\x82\xe7\xe9\x4d\xc1\x60\x1e\x81\x0c\xbd\xd1\x0a\xcb\x5f\x7c\x45\xca\x3f\xc2\x62\xb7\xb7\xbc\xbc\x76\x86\x09\xb2\x9f\x8f\x96\x5c\x16\xec\x8e\xcd\xe5\xa7\xd7\x61\x63\x18\x1b\x3e\xb9\x88\xa0\x0c\xf6\x71\xac\xa4\xb4\x82\xa1\xe5\x7b\xff\x2f\xac\x83\x5f\xe0\x18\xcd\x25\x5f\xa0\xb9\x2f\x7c\xec\xd8\x77\xb6\xc2\x90\x7f\x07\x25\x84\xf0\xc9\x1b\xc2\x1c\x87\x79\xd5\xf1\xfc\xae\x17\x86\xd4\x65\x42\x7f\x00\xe7\xa6\xae\x3c\xd1\x00\xa7\xf8\x44\x2c\xe0\x78\x83\x09\x2d\xae\x80\x17\x65\x77\xd9\x6f\x5c\x67\xe0\x97\x4b\xe5\x3f\xe7\x70\xec\xc6\x96\x3a\x00\x01\x57\xb8\xc4\x72\x1c\xc2\x17\x62\xbd\xe5\xc2\x3d\xf0\x19\x0c\x83\x36\xbe\x4c\x70\x26\x0f\x0d\x79\xf2\x84\x3c\xc2\x6f\x25\x3e\x3d\x99\xf0\x8d\xab\x02\x85\x42\x54\xaa\x9c\xb0\x05\xbb\xef\xb9\x36\xa3\x06\x4c\xff\x0e\x96\x85\xc5\x9b\x34\x69\xcb\x1a\xa2\x00\xf5\x29\xc1\x40\x52\xb8\xba\x5a\xc4\xf1\x42\xbe\xd8\x99\x20\x99\xa8\x41\xe4\x75\x19\x11\x47\xe6\xc2\x40\xf8\x52\xdc\x58\x2c\x19\x3e\x36\x3e\xae\x7a\x64\x47\x2d\x8e\x2f\xe4\xcf\x7c\x81\xd4\x48\x2e\x67\x54\x11\xec\xcc\x0f\x3c\x73\xac\x35\xda\x16\x42\x86\x49\x9b\x7f\x9b\xb4\x37\xb0\x28\xf2\xe6\x1e\xe1\xa9\x30\x79\xc1\x9f\x59\x33\x85\xf8\xec\xb9\x53\x87\x59\x4c\xbf\x42\xd5\xba\xc4\x35\x6b\xb2\x13\x59\x91\x51\xc5\x4f\xd3\xa2\xef\x30\xe8\x55\x96\x5a\x9e\x5f\x2b\x14\x0a\x31\x2d\x7f\xe3\x5e\xb5\xfc\xbf\xab\xda\x9e\xa1\x32\xe7\xce\x0e\xf6\x4e\x0f\xce\x1b\xfb\x27\x8d\xb7\x27\xe7\x8d\x77\xf5\xb3\xb3\xc6\xf9\xab\xa3\xb3\xc6\xc9\x69\xe3\xd3\xc9\x87\xc6\xc7\xa3\x37\x6f\x1a\xbb\x07\x8d\xc3\xa3\xd3\x83\x7d\xc6\x4d\xb1\x71\x4c\x02\xbc\xbd\x14\x1b\x89\x67\x0b\x8d\xc4\xea\x2a\xd9\x2c\x55\x4a\x15\x72\xee\xbd\xf3\xed\xbe\x1d\xda\xd7\x34\x6f\xbb\x83\x61\x48\x2e\x8a\xe4\x9d\x4f\x3b\xd4\xf7\x71\x0a\x5d\x16\xa0\xbf\x76\x80\xa7\xbc\x29\xdb\x82\x0d\xb8\xed\x5e\x05\x71\x41\xad\xb6\xd0\x4c\x0f\xce\x9e\x81\x00\x27\xd7\xd4\x0f\x60\x0a\x30\xad\x08\xb5\x1b\xbb\x3f\x40\xe3\x18\xf2\xdf\xff\x86\x0a\x0d\xd0\xa2\x18\x28\x26\xfd\x40\x9d\xa0\x2d\xcf\x6d\x2b\x41\xbb\x42\x3a\x8e\xd5\x25\x2b\x64\x20\xd0\x44\xa1\x6b\x07\xc4\x22\xa8\x2c\xc7\xa9\xaa\xce\xd4\xed\xb0\x48\xce\x94\xee\xf9\x48\x74\x2c\x6f\x87\x85\x82\x58\x24\xec\x50\xec\x71\x3a\x2e\xa8\xb4\xdb\xbc\xf8\x19\x18\x47\xa3\xd0\xcc\x77\x5c\xb2\xc3\xb4\xb1\xd0\xc3\x68\x0d\x05\x62\xe8\x1c\x20\x2a\x25\xf8\x6b\xcb\x61\x78\xb8\x38\xf5\x58\x63\xb2\x35\x0d\x7e\x14\x34\x2c\xde\x27\x9d\x7b\x80\xfc\xe8\x21\x51\xc7\xeb\x2c\xf3\x96\x31\x17\xb2\xed\xcc\x35\xdb\xfe\xe1\x22\x07\xcb\xa6\x1c\x66\xbc\x5e\x2e\x6c\x2f\xdd\x25\x70\xf7\xe6\xa2\xdc\xdd\xb1\x1c\xa7\xc9\xa4\x29\xdb\x2e\xb8\x9e\xbb\x02\x8b\xef\x8a\x63\x5f\x31\xa6\x5c\x03\xe6\x62\xaf\xb5\xeb\x71\xcf\x69\x93\x3f\xb6\x38\x07\x05\x4b\x18\xd9\xa2\x93\xba\x0d\xde\x42\x86\xa7\x81\x63\xbb\xe1\x4a\xdb\x0e\x18\x90\x15\x97\xde\x84\xe0\xd5\x42\x5c\x6f\x45\xde\xa0\xad\x34\x87\xb6\x13\xda\x6e\x10\x67\x4c\x4e\xe2\xdc\xb7\x5c\x01\xee\x0c\xd8\xd6\xe4\x28\x38\x90\x68\xe5\xcb\x05\x79\xf5\x45\x6a\x06\x1f\x23\x13\x8b\xdb\x50\xaf\x03\xaf\xd8\x30\xe2\x90\xe6\xc8\x0b\x36\xc2\xc1\xc0\xb1\xc3\x7c\x2e\xc7\xd6\x2f\xc5\xe9\xc9\x64\xdf\x9a\x82\xec\x40\x61\xd8\x7f\x71\xd6\x81\x3d\xbf\x64\xa4\x24\x91\x96\x8a\xb4\xa8\x24\x19\xab\x14\x30\x91\x9d\xdf\x2a\x92\x95\x4a\x0a\x8e\xcf\xa7\xc5\x11\x64\x5c\xb5\x54\x21\xa7\x38\x6a\xd8\xf9\x3d\x8f\xfa\x2d\x9b\x11\x56\xea\x4f\xd3\x20\xcc\x66\x90\x1d\x32\xea\xb2\x15\xa6\x63\xbb\xb4\x5d\x48\xe5\x7a\xa6\xa8\xf5\x69\xd8\xf3\xda\xc4\x73\x09\x5c\xcf\xda\xa8\x3d\x6b\xe2\x25\xa1\x6f\xcf\xca\x33\xf5\xad\x52\x5a\x27\xe7\xde\x91\x1b\xd2\x2e\xf5\x91\x5f\xa9\xed\xc8\x50\x2c\xd4\x76\xd0\x62\xa5\xe3\x78\xa0\x93\xc3\x6b\x78\xd8\x9e\x61\x8c\xec\xe0\xad\xf5\x16\xfa\x4e\x96\xd9\xa7\x17\xa4\x4c\x6a\x40\x8c\xdf\x48\x99\xbc\xe0\xd0\x6b\xd0\x76\x21\x95\xb5\x9e\x55\x16\x9a\xd1\xa0\x9c\xf5\x2c\x26\xeb\xd3\x02\x32\x57\x0b\xf9\xdc\x15\x1d\x07\x39\x6e\xa7\x33\xb4\x53\xcb\x82\x2d\x4f\x06\x05\xae\xe8\xd8\x20\x01\xb6\x8c\xc1\x40\x6f\x6f\x49\x5e\x7f\xde\x61\x0d\x41\x8d\x94\x8e\x67\x46\xb8\x9e\xaa\xe3\x5d\xc7\x6b\x82\x04\x4e\x54\xd3\x9e\xf1\xfe\x9e\xbd\xaa\x9f\x1e\xec\x33\x15\xa4\xd1\x68\x79\x3e\x5d\xf9\x1a\x34\x10\xd1\x46\x23\x87\x45\x82\xd0\xf3\x29\x53\x6f\x01\xe0\x05\xd6\xc0\x2e\x45\x5e\xb1\x29\x3d\x23\x8d\x18\x6c\x8d\x44\xea\x91\xc3\x4a\xa2\x4d\xa6\x35\x5f\x84\xdf\x8f\x0e\xc8\xd6\x0a\x3f\x51\x61\x52\x9b\x34\x87\x5d\xc2\x06\x3c\x8e\x65\x7e\x89\x90\x9c\x66\xb1\x50\x34\x4f\x7e\x8a\xe0\x3e\x2b\xee\xa9\x8b\x49\x52\xb7\x18\x7a\x6f\xbc\x96\xe5\x50\x94\x4f\x45\x21\xa8\x8a\x7c\x3d\xce\x2d\x15\x84\x60\x2d\xe6\x0a\x09\x3d\x9b\xe6\x38\x1c\x7a\xc6\x7f\x97\x3a\xca\x30\xa3\x4b\x43\x0d\xdb\xb3\x71\xbf\xe9\x39\x41\x42\x1b\x8b\x29\xe3\x31\xaa\x7d\x27\x8f\xf9\x55\xc0\xe3\x5a\x22\xab\xad\x57\x9e\xc3\x4d\x07\x0d\x8e\xa1\xae\x30\xe2\x88\x5d\x06\x3c\x5b\x4c\x39\x35\xb7\x09\xc0\xb9\xbf\x5a\x69\x8a\xe7\x7a\x75\xa3\x90\x67\x78\xc0\x9d\xc4\x2a\xa9\x56\x4a\x95\xd2\x5a\xa9\xba\x49\xf8\xd2\x22\x17\xe1\x8b\xff\xfe\xd7\x0e\xa9\xcf\xf6\xe2\x97\xf9\xc2\x52\xb2\x14\xd9\x2c\xe4\xf9\x48\xcb\x65\xb4\x68\xc8\x46\x06\x80\xc9\x7e\xb8\xd3\xef\xd9\x41\xa9\xc1\x30\xc3\xa2\xea\xf3\x36\xdb\x9c\xa2\xe1\x9b\x2c\xc7\xed\xfc\x22\x7f\xab\xab\x84\xe9\x0c\xe8\x78\x2d\x3b\xb0\x01\x0b\xd7\xbf\x11\xec\x11\xc7\x5a\x32\xed\xbf\x4b\xac\x4a\x1e\xee\x8e\x0c\xfb\x43\xae\xb3\x9e\x08\x47\xcb\x86\x54\x63\x01\xbc\x7c\x6d\x8b\xd7\x70\x13\x26\x34\x44\x2c\xf3\xdb\x0e\x39\x91\x3e\x90\x32\x52\x1a\x37\xbb\x90\x8b\x5f\x91\xcd\x44\x8d\x03\x08\x8f\xf0\xb7\xc3\x86\x2a\x7f\x52\xc4\x06\x0b\xdb\x5a\xef\x97\x77\xb0\x8c\xb0\x6f\x5c\x22\x31\xf0\xf0\x5d\x80\x86\x5d\x35\x83\x7d\x97\x34\xc1\x16\xd3\x10\x13\x58\xec\xcd\xd1\xee\x69\xfd\xf4\x53\xea\xfa\xb2\xc5\xe5\xec\xaf\xfc\x9e\x2c\x25\xa6\xf7\x26\x2f\xe6\x53\xa4\x54\x5a\xb9\xf5\x2a\x2f\xd8\xb3\xdb\x69\x85\x36\xca\xa2\x8c\x15\xa4\x05\xf8\x16\x60\x04\x93\xa4\x15\x7c\x2e\x60\xfd\xca\x98\x74\x0f\x4c\x6e\x52\xa7\x94\x58\x53\x02\x1a\x9e\x73\xc9\x77\x6e\xa5\x5f\x24\x3d\xe7\xc5\x4d\x03\xa0\xd4\x9e\x0b\x4c\x8e\xce\x0f\x4e\xeb\xe7\x27\xa7\x69\x2b\x5b\xb9\x90\xcf\x89\x19\x2b\x56\xf5\xdd\x0f\x2f\x5f\xb2\x31\x7a\x94\xbf\xb8\x2c\x31\xe9\xcf\x76\x2a\x39\x36\x1d\x72\x6c\x23\xcf\x5f\xe6\x0b\x38\x03\xcf\xac\x8e\xe5\xdb\x40\xbe\xe6\xb0\xdb\x1d\x13\x5b\x52\x69\xb4\xea\x91\x2f\xac\xde\x17\x80\x7b\x78\xd8\xd0\xd0\xc9\x29\x51\xc1\x97\xce\xd7\x07\x9f\xce\xd8\x07\xd0\x30\xf0\xd5\x1f\xf5\x37\x1f\x0e\xe0\x25\x9e\xb0\xe6\x38\x23\x21\x53\xc3\x29\x45\xd4\x3c\x58\xa8\xbd\x3d\x3b\xc0\x90\xe1\x19\x0b\xec\xae\x15\xd0\x22\x79\x5b\x3f\x3e\x30\x2c\x40\x8b\x20\x2e\x8a\x64\xff\xe0\xb0\xfe\xe1\xcd\x79\x91\x1c\x9d\x35\xce\x0e\xce\x8b\xe4\xf0\xe4\x74\xef\x60\x1f\x85\x80\x36\xc6\xa6\xd5\x2a\x82\x63\x10\xe4\x25\x5e\x97\x86\xc7\xa8\xab\x1a\xcb\xbb\xed\xb6\xc5\x01\x1e\xec\x1e\x91\xf0\x4f\x9e\x10\xf6\x85\x91\x1a\xe4\xaa\x94\x10\xf0\x74\xc1\xbe\x5d\xe2\xd1\x55\x30\xb2\xe1\x80\x58\x07\x44\xf0\x86\x84\xd1\xb2\x16\xb3\xf6\xc5\x71\x53\x44\x72\xe9\x48\xef\x37\x37\x20\x03\x70\xdb\x22\x22\x23\x07\x88\x23\x11\x07\x89\xe3\x32\x2b\xd0\xb8\x21\x32\x75\x43\xdf\x9e\x15\xd0\x9d\x20\xf0\x79\xfd\x25\xd9\x01\xca\x93\x65\x92\x93\x13\x35\x27\xbe\xef\x1f\x1c\x36\x24\x2f\xf1\x61\x65\x1b\x0d\x7c\x27\x4a\xe1\x53\x63\xf7\x03\x03\x86\x66\xdc\x4b\x32\x08\x5e\xe8\x91\x1d\xc2\x18\x46\xad\x76\xe2\xeb\xaf\xae\x05\xdb\xed\x1d\x3e\x44\x82\xcb\x41\x4d\xc3\x57\x1a\xef\xc3\x5b\x81\xc3\x93\x27\xbc\x00\x7f\x71\x29\x61\x2a\xab\x7d\x01\xfe\xf6\x56\x31\x52\x9e\x97\x97\x2c\xf6\x2b\x27\xa0\xd6\xbf\x17\xe4\x91\xd6\xef\x17\x0a\x64\x4d\x83\x93\xe3\xf5\x60\xef\x2a\x97\x1e\x09\xd5\x72\xc7\x6f\x45\xe7\x80\xbc\x6c\xef\x5b\x67\xfb\x7c\xb6\xf5\x05\xd4\x4b\xa2\xe5\xdb\x5b\x89\x6a\x4d\xfc\x12\x80\x70\xab\x16\x40\xf0\xff\x22\x89\xad\xb6\xdb\x68\x8c\x73\x68\xdf\x10\xac\xc7\x97\x4b\xd5\xbe\xe0\xef\x58\x55\x3c\x4a\xd6\x8d\x22\x55\x25\xdc\xf3\x32\x3e\x62\x03\x97\x2f\x88\x88\x65\x0c\x74\x1c\xd0\xa3\x1d\xa9\x1e\x2a\x53\xde\x27\x4f\xe2\x4d\x82\x6a\xa0\x26\x1c\x13\x82\x14\x4f\xd8\x94\x1c\x0f\x3d\xde\x13\x25\x0f\x79\x71\x53\xe0\xc7\xf1\x28\x32\x6e\x2e\x12\xae\x6f\xc9\x26\x3a\xf6\x0d\x1c\xb4\x04\x5e\x1f\xcf\x51\xa8\xdb\xb5\x5d\x1a\x68\xd7\xb0\x8f\xc4\xfa\xfa\xe4\x09\x79\xd4\xb3\x82\x24\xd8\x82\x0b\x0b\x05\x58\x15\xb3\x8a\x14\x35\x31\xab\xc7\x1c\x58\x92\xf8\x00\x23\xfc\xeb\xbb\xb8\xfd\x52\x12\xfd\xae\xe4\xf2\x1b\xe3\x3f\xb6\xc8\x2a\x39\x3c\xe4\xe3\xa9\xf1\xe3\x93\x27\x92\x5b\xd4\x4f\xac\xf6\x48\xce\x4c\x41\x64\x63\x66\xe2\xb5\x02\x7b\xad\x4d\x92\x0c\x81\x24\x60\x03\x33\x84\xd0\x19\x2e\x3e\xb0\x27\xfb\xa8\x44\x08\xdc\x39\xaa\x8a\x9a\xb7\xb7\x52\xf0\x3f\x79\x42\xf2\x28\xa5\x6f\x6f\x75\xa4\x6e\x6f\xc9\xa3\xc8\xdc\x97\x77\x33\x40\x66\xf8\xa8\x93\x56\xa0\x5e\xd0\x10\x79\xe7\x0c\xbb\x30\xc6\x8e\xdd\xf4\x2d\x48\xab\x2d\x55\x8e\x0b\x36\xfb\xd8\x46\x4f\x54\xdc\x36\xbe\x9e\xd7\x5f\xb2\x8f\x6a\xc0\xb6\x15\xc5\x41\x4e\x70\x64\xf8\x3c\xe4\x96\x4f\x44\x18\xfb\x06\x35\x32\x59\x54\xf0\x21\x11\x11\x2a\xd8\x62\x52\xe3\x4b\x63\x5a\x15\xb6\x0c\xc9\x0a\x5c\x4e\xd4\xa4\xac\x42\x96\x52\x53\x52\x50\x19\xcc\x0f\x78\x9e\x11\x8e\xb0\x69\x6f\xf0\x48\x7c\xc5\x05\xb2\x20\x35\x41\x41\x67\x90\x32\xbc\x2a\xec\x90\x05\xff\x62\xfc\x3b\xae\x5f\xe6\xf9\xbf\xa5\x77\x64\x59\xbc\x2b\x1d\x92\xa7\x89\x63\x5c\x10\x2b\xbb\xc0\x48\x0c\x1c\xe7\x32\xfe\x3a\x79\x13\x3e\xf5\xa1\x5f\x4c\x59\xe1\x77\x68\x51\x80\xd3\x9c\xd0\xa5\xab\xe6\xfa\x86\x38\x45\x2d\x8c\xb7\xb9\x39\xcd\xc9\x59\xf6\x29\xcb\xf1\xc1\x79\x3d\xe3\xc0\x28\x9f\xeb\xd3\xd0\x12\x6a\xe8\x34\xb7\x21\x53\x2a\xee\x01\x0d\xf7\x69\xd0\x4a\xeb\x6d\xb5\x50\xea\xf0\x36\xdb\xb0\x81\xe4\xed\x1f\xdc\x84\xd4\x05\x4b\x7d\x75\x70\x60\xbc\x35\x72\xee\x98\xa7\xae\x30\x6c\x77\x08\xe9\xf0\xf4\xe0\xe0\xf3\x01\xd3\xa8\x13\xb1\xac\x14\xf2\x29\x50\xf4\xc6\x54\x8e\x1d\x7a\x4d\xdd\x90\x7f\xf0\xdc\x20\xff\x1d\x22\x71\xde\xa9\xbe\x1e\xd3\xd0\x4a\x3c\x6e\xe4\x74\x80\xfb\x19\x36\x16\x45\xb5\x2d\xe4\x6a\x68\x8d\xe4\x4e\x72\x64\x99\x2c\x2f\xdb\xed\x22\x93\x49\xfc\x5a\xe1\x68\x1f\xbe\x8f\x6a\xe4\xfb\x9d\xb1\xb1\x1e\x51\xeb\x8a\xb4\x3c\xc7\xc1\x14\x0d\x01\x39\xda\x67\xf3\x1a\xbc\x4e\x44\xff\x3b\x56\x10\xbe\xa6\xe3\xd8\x15\x11\x3a\x25\x20\x6a\xab\xab\x4a\xcd\x15\xd7\x17\x60\xa8\x32\xf0\x69\xc7\xbe\xc9\xbc\x49\xe2\x17\x2e\x78\x76\x9c\x0b\xe0\x30\x07\x4f\xe6\x49\x4d\x5e\xf7\x88\xaf\xf2\xdc\x3e\x77\x06\x01\xa6\xdf\xe5\x0a\x70\x76\x2c\xef\x70\xd8\xc2\x29\x08\x24\x85\xf8\xea\x2a\x69\xc1\xc1\x73\x40\x43\x36\xd5\x2d\xb0\xa8\x0e\x3d\x32\x74\xd1\x36\x87\x74\x7c\xef\x1b\x75\x39\xbd\x94\x4e\x6f\x0c\xa1\x8e\x74\xee\x90\xc7\xa9\x5e\x5d\x05\x07\x23\x97\xb6\x68\x10\x58\xfe\x18\x8c\xe6\xda\x6d\xd9\x8a\x82\x25\xe8\x25\x20\x1c\x28\x08\x50\xc1\x0e\x02\xdb\xed\x9a\x15\x39\x3b\xe4\xf9\xe1\xb8\x22\xb3\x3e\xb0\x77\xea\xd0\xfc\x82\x75\xfb\xb2\x64\xcb\xc1\xeb\xd2\xf0\x23\x1b\xe3\xac\xc1\xfb\x91\x74\x53\xab\xff\xdc\x84\x93\xaa\xfd\x9c\xa4\xeb\x59\x41\x2f\x9d\xf1\xa3\xa4\x1c\x01\x29\x45\x43\x82\x04\x9e\x4b\x3a\x3e\xa5\xdf\xe8\x4a\xc7\xea\xdb\xce\x58\xae\xcc\x4c\x4b\xb1\xdd\x2e\xd0\xde\x73\x0f\xa1\x4c\xea\x75\x09\x97\x2c\x4f\x9e\x00\xe0\xd2\xdb\x83\x83\x7d\xf6\x10\x25\x9e\x54\x08\xb5\xf1\x89\xf4\xce\xbc\x35\xe1\x2a\x3b\x93\x22\xf1\x33\xcc\x25\xc2\xb6\x97\x35\x94\x20\x4b\x84\xb0\x56\xb5\x74\x97\x7c\xb6\xd7\xc4\x0f\xf6\x8e\x33\x51\x4d\xfc\x00\x6f\x79\xde\xb9\x9a\xfc\x95\xb4\x74\x6e\x2e\x7e\xa9\x31\xdd\xd9\x7e\x0b\xcf\xed\x13\x8f\x53\xd6\x78\x99\x69\xcf\xaf\x46\x57\x6c\x00\x52\x8b\x89\xb3\x1c\xd3\x89\x37\x7b\x75\xca\x38\xc5\x60\x3a\xb3\x3a\x98\xfc\x15\x0f\xb3\xc9\x0e\xf4\xa8\xc4\x9f\x6e\x6f\x49\x5e\x7f\xde\x91\x7d\x79\xc1\x24\x7a\x8d\x13\x49\x2b\x0e\x17\x0a\xc8\x65\xac\x81\x52\xab\x67\xf9\xf5\x30\x5f\x2e\x90\x47\x3b\x24\xd7\xc0\xeb\xeb\xbc\x50\xf3\x79\xab\x85\x88\x4b\xef\x38\xcf\x3f\x14\xc1\x1e\x58\x5b\x6f\x90\x44\xa5\x0e\xc7\x3e\xe5\xf6\x62\x73\xb1\x9b\x9d\xc8\x11\xe4\x52\xb2\xf3\xb4\x04\xf3\x58\x9d\xbb\x3f\x2e\x72\x82\x02\xb2\x4c\xe6\xc0\x02\x2b\x14\xa7\xbd\x57\xf5\xb7\x6f\x0f\xde\x90\x1d\x7d\xcb\x8c\x4e\xc8\x26\xf0\x6a\x5a\xe2\xc3\x42\x72\xf9\x35\x56\xde\x76\x43\xea\x7b\x03\x7e\xa7\xba\xcf\x03\x3e\x47\x21\x4b\x08\x46\x80\xb5\x94\x28\x02\x91\x92\xd5\x8c\x66\x64\xa1\xc2\xb6\xe9\xad\x9b\x54\xda\x6b\x7e\xd5\x76\x5a\x5e\xf3\x2b\x63\x0b\xaf\xf9\xb5\xa4\x48\x49\x5e\xc0\xfb\x1a\xf9\x2e\xdc\x20\x6a\xf0\xe2\x0e\xdd\x43\x57\xc9\x99\x25\x8c\xbe\xc9\x30\xa0\x6d\xd2\x1c\x13\xf0\x0b\x5c\xf9\x1a\xa0\x89\x80\xa2\x76\x9c\xfe\xb9\x46\xe3\xfc\xd5\xc1\xf1\xd1\xdb\x97\x70\x05\x87\xb7\xe6\x3d\xda\xa7\x6f\xec\x20\xa4\x2e\x44\x29\x66\x23\xc9\xad\xbe\xa1\x63\x35\x92\x2f\x17\x63\x94\x17\xae\x21\x05\x08\x4e\xc7\x5b\x28\xea\x44\x13\x25\x78\xb0\x1a\xd8\xd8\x70\xb7\x6a\xcd\x6a\x80\xbf\xc9\xf3\x16\x8d\x13\x3e\xfe\xee\x82\x43\xbf\xcc\x74\xa9\xd4\x7d\x46\xa3\x15\x4b\x68\x33\x17\xd2\x3c\xee\x43\xc0\x4d\x65\xd8\x0c\x5a\xbe\xdd\xd4\x5d\x37\xe5\x3b\x81\x4e\x91\xb4\x9a\x0f\x84\x92\xd6\x56\x53\x61\x35\x74\x93\xf0\xd2\xde\x2a\xcc\xf8\x2b\x08\x5c\x7e\x64\x1c\x8d\xa6\x23\x19\xc3\x42\x87\x1c\x01\xa8\x9f\x61\x30\x61\x23\xb8\x49\x9d\x22\x18\x9c\x13\xbb\x73\xdb\x9c\xe6\x2e\xf5\xc7\x4b\xa3\x8b\x1c\xef\x40\x0e\x8c\x2e\xbd\x3d\xf0\x3e\xc2\x78\xe2\xec\xe1\x0f\x98\x5a\x29\x4b\xdb\x33\x25\x1d\x54\xe1\x2c\xf1\xa0\x4a\xdd\xbf\x7c\x90\x1d\x31\x24\x04\xda\x30\x1e\xb9\x6d\xea\x86\xd2\xfc\x0c\xfc\x26\x7a\x61\x38\xa8\xad\xae\x7e\x0d\x06\xd4\xef\x94\x5a\x5e\x7f\x15\x4d\x90\xbe\x7a\xb6\xbb\x72\x1d\xac\x74\x3c\xdf\x74\xa9\xb0\x01\xc8\x59\xe8\xe7\x83\xd0\x2f\xf2\x47\xb5\x76\xfa\x34\x40\x3e\xc8\x81\x66\xad\xc2\x87\xf0\x9b\xbd\xf2\x36\xff\xf9\x1f\x5e\x95\x3f\x43\x10\x11\x3e\x37\x00\xc2\xf2\x0e\xc9\x11\x02\x40\xee\x78\xdf\xc5\x17\x86\xbf\xee\xbd\xb3\x87\xf6\x5b\x01\xb1\xc8\x29\xa3\x46\xe8\x91\xbd\xb3\x33\xad\x97\xab\x1a\x95\x81\xf8\xf9\x80\x3a\x54\x44\xc8\x18\x3b\xda\xda\x8f\x31\xff\x03\x3d\x79\x2b\xbf\x09\x24\xbf\x91\x2a\x23\xbd\x4a\xea\x5a\xbd\x84\x73\x36\xb9\x7e\x91\x17\xe6\xc7\x1a\x78\x19\x25\x11\x46\x28\xfc\xbc\x71\xa3\x7f\xb2\x46\x83\xe3\xf2\x2b\x12\x4a\x26\x24\x08\x4a\xf8\x42\x1c\x0a\xc9\xcf\xb1\x0a\x11\xe4\xca\xa4\x16\x2d\x23\xed\x07\xb9\x21\x1a\xeb\x38\x20\x55\x92\x6f\x30\x2c\x2d\x16\x5f\x5e\x06\xec\x56\x57\x49\x7d\x30\x70\xc6\x5a\xb5\x8e\xed\x07\xe0\xf0\xc1\xfa\x25\x5f\x6b\x7b\x18\x38\xe8\x24\xc1\xd8\x0d\xad\x1b\xf2\x5d\x96\xa8\x91\x8b\xef\x6c\x79\xa8\xe1\xd4\xbc\xbb\xbc\x93\x12\x0b\x6a\x94\xec\x00\xfe\xd5\x60\x2a\xc9\x95\xc5\x5d\xb2\xbc\x0a\x54\x63\xf2\x99\xb0\xa6\x96\x36\x78\x3b\xaa\xce\x05\x94\xbd\x54\xe6\xcd\xb2\x25\x86\x2b\xd3\xd6\x44\x51\xd3\x7c\x9c\x95\xb8\xe6\xb2\x42\x94\xb8\x60\x55\x2e\x75\x57\x08\xd6\x39\x2c\xf5\x48\x86\xda\x30\x42\x53\x6b\x53\xe0\xff\x73\x21\x36\xb7\x9c\x74\xd0\xfe\x32\xc9\xd5\xc0\xe4\x1e\x16\x61\x4d\xe8\x68\x72\xac\x90\xe7\x91\xa2\x97\x49\x6e\x3b\x27\x27\xaa\x8e\xc7\x5d\x86\xf5\x36\x9a\xc2\xe3\x06\x37\x61\xd0\x8c\x31\xc3\xf2\x91\xb4\x18\x92\x62\x8d\x28\xc9\x82\x38\xcd\x1a\x51\xa2\x05\x17\x8d\x44\xb2\x35\xe6\xa5\x5b\x63\x06\xc2\x35\xe6\xa4\x1c\x2c\xee\x66\xbf\xab\x90\xe8\x59\x89\x18\xbd\xbb\x55\x31\xd7\xb0\xaf\xd5\x4b\x75\x8c\x2b\x0a\x08\xa3\xfb\x27\x4f\x04\x38\xf0\x37\x93\x54\xca\xe9\xaa\x46\x76\xdf\xab\x33\x75\xbe\x9a\xdc\x7b\xd9\x4b\x36\xa1\x1d\xc7\x1b\x11\xda\x1f\x84\x63\xec\x06\x9a\xa8\xdb\x01\xdc\x76\x16\xa5\xa3\xc4\x40\x86\x26\x42\x87\xc8\x26\x65\xdb\x78\xda\x26\xed\xb1\x6b\xf5\x6d\xb6\x59\x1f\x0b\xc1\xf1\x88\xf7\x82\x6d\x8c\x84\xb0\xb3\x58\x3b\x07\xac\x99\x24\x41\x89\xe8\xad\xac\xe0\x06\x9c\x8b\x58\x6d\x8d\xe2\x72\x1e\xee\x34\xbf\xb3\xce\xcb\x45\x84\x91\x49\xad\x5f\x3a\xbd\x72\x77\x7a\xbf\xd5\xce\x5e\x34\x7b\x17\xd3\x6a\xa6\xb6\xa3\x4a\xdd\x83\xf2\xd2\xac\xd0\x2f\x76\x27\xff\x88\x17\xe4\xea\xc6\x3b\xcf\x19\x77\x6c\x64\xf8\x5f\x7e\xe1\xdf\xda\x74\xe0\xd3\x16\x1a\x48\x48\x30\x05\x58\x73\x64\x99\x81\x15\xf6\x58\x33\x17\x97\xec\xe5\xea\x2a\x91\xef\x7d\x5c\x33\xd4\xfa\xd0\x94\x3e\xd6\x4b\xbf\xe8\x28\x80\xcb\xa7\x4f\xdd\x02\x89\xbc\x90\x60\x93\xb5\x30\xd1\xfd\xc7\x8e\x67\xb5\x69\x1b\x14\xb0\x5f\x7e\xf9\x45\x0f\xc1\x83\xb1\xfa\x7e\xf9\xe5\x97\x2e\x0d\x6b\x46\x1f\xd8\xcb\x5f\xc4\xb5\x00\x36\xeb\xb0\xa6\x7e\xb9\x5b\xfa\xe5\x17\xa6\xb8\x4d\x6c\xd5\x5e\xbc\x45\x3b\xd2\x62\xf2\x98\x40\x52\xf8\x25\x56\xcc\xa8\x9d\xbc\x19\xbf\x5f\xcf\x94\x29\xfc\xcf\xf1\x50\x02\x6a\x3f\x90\xb2\x8c\x67\xc3\x23\xdb\x6d\x7b\x23\x74\x67\x94\x3c\x95\x23\x2f\xc4\xd1\x51\x8d\x97\xc8\x44\x7b\x1a\x87\x9f\xf5\x4a\x82\xc7\xcf\xe6\xbd\x9a\xf2\x2d\x4e\x29\xdc\x0d\x9c\xf5\x28\x0d\x83\x53\xda\xb5\x83\xd0\x4f\x3b\x9c\xaa\x6e\x3c\x4f\xa9\x90\xb5\x85\x30\x4b\xfe\xd8\x6d\x84\x70\xbb\xb5\xc4\xd8\x06\x80\x0c\xf1\x39\x36\x25\x74\xa1\xdb\xf7\xfa\x18\x5b\x8a\xfa\x28\xf8\xad\x76\x5b\x14\x0d\x3d\x74\x0f\x7e\x4a\x4e\x5c\xee\x3d\xe3\x5f\x53\x9f\x78\x2e\x38\xca\x0f\x9d\x36\x61\x43\x62\xb9\xc4\x1b\xb9\x24\x42\x47\x19\x53\xce\x72\xdb\x00\x94\xbb\x4b\xe9\xb0\xd5\xf2\x33\xf6\x86\xd2\x05\xbe\x6f\x5d\x51\x12\x0c\x7d\xd8\x22\xe0\x89\x36\xb1\xc0\x48\x46\xe0\x4e\x70\xbf\x83\xc9\x51\xd9\x20\xd1\x20\x64\xeb\x9a\xe7\x83\xc3\x96\x07\xc7\xe5\x0e\xb5\xae\x44\x6b\x56\xcb\xf7\x82\x40\x14\x0d\x70\xb7\x91\x38\x51\x58\x33\xd1\x11\xd6\x4a\xe4\xe3\xd1\x2a\x36\xef\xdd\x7a\x10\x2f\x76\x4e\x9a\x8c\xdc\x3c\x26\x62\xe2\x1c\x7b\x0e\x47\x63\x19\x07\xa6\x1d\x17\x44\x26\xe7\xa6\x5d\xcf\x73\xa8\xe5\xe6\x3b\x2e\x63\xaa\x8e\x7b\x11\x6d\xe7\x32\xe5\x6c\x72\x9a\x4b\xdd\x1f\x3e\x6d\xed\xe0\xc8\xdd\xf5\xbd\x51\x80\xf9\xb9\x92\xce\x9f\xe1\x38\x3b\x56\x3a\x6b\xc2\x6a\xc5\x7e\xd0\x6c\x65\xd8\x7d\x0d\x70\xc3\xa9\xd2\x01\xcb\xbf\xa7\xe4\x00\x2d\x44\xbf\x5a\xd7\x16\x1e\xf1\x70\x35\x8e\x4d\xab\x56\x10\xf0\xa7\x6b\xea\xb6\x3d\x9f\xdf\x21\x42\xa0\x86\x08\x98\x5d\x2b\xa0\xe0\x41\xf2\x38\xf4\x2d\x37\xe8\x78\x7e\xff\x31\x09\x86\x03\x00\x1e\xd2\x20\x8c\x55\x59\x45\xe4\x5a\x41\x20\xb6\xc3\xab\xab\xe4\xa3\x9c\xf9\x6c\x8a\xb5\x3d\x62\xb9\xe3\xb0\x67\xbb\x5d\xa6\x18\x72\xd2\xb7\xb9\x9c\x08\xec\x36\x2d\x41\x58\x12\x83\xfc\xba\x1e\x2b\x6e\x44\x4f\x60\xe2\x62\x54\xe4\xa0\xc4\x5a\x11\xc2\x00\x3c\x51\xc9\x47\xda\xbc\xb2\x31\xe8\x87\x63\x05\x21\x48\x20\x2e\x3a\x10\x80\x07\x61\x0d\x91\x0a\x01\x48\x25\x7e\x47\xc6\x6b\x0a\xc2\xb0\xd7\x60\x58\xa4\xf4\x5d\xbe\xb7\xfe\x1a\xec\x05\xc1\xb1\x35\x90\x16\x23\xc7\xde\xb7\x1a\xc9\xad\xf4\xbd\x6f\x2b\x3c\x5c\x1c\x3a\x0e\xb4\xed\x36\xb1\x43\x32\xf2\x3d\xb7\x4b\xac\xae\x65\xbb\xa4\x54\x42\xea\xf5\x03\xa8\x11\x88\x0a\x27\xec\xd1\x13\x4f\x88\x0a\x7b\x35\x82\x5f\x2b\x39\xdd\xb2\x0f\xc7\x71\x87\xb4\xbd\x16\x9c\x4d\x44\xd3\x24\x0d\x72\x85\x12\x94\x11\x15\xd8\xa0\x41\x1c\x89\x1d\x92\x3b\x17\x63\x8a\xa7\x16\x72\x77\xc3\xad\x47\x44\xdf\xf4\x93\x46\xf6\x69\x59\x01\x89\x6e\x80\x08\x72\xe5\x15\x1d\x4b\xeb\x48\x60\x04\x01\x0a\x8c\x4d\xc4\xa7\xa6\x4f\xad\xab\x6d\xd3\xa7\x98\x2f\x43\x7f\xe8\x8c\xc9\x0f\x7b\x00\x3f\x08\x11\x32\xf4\x41\xc1\x6d\x22\x6b\xc8\x90\x2b\x60\x90\xf6\xfd\xfb\xd7\xa0\x46\x84\x01\x7d\x2b\x90\x0f\x6c\x27\xfb\x94\xfc\xd7\x1a\xd8\x64\x30\x6c\x3a\x76\x2b\x5d\x9a\x7f\x27\x0c\xc6\xd7\x80\xd7\x67\x5d\x88\x7b\x18\x6c\x2e\x66\x63\xb2\x50\xb8\xa1\x7b\x13\x87\x3c\xdf\x4c\xda\x35\xcc\x7a\xb4\x60\xd6\xfd\x8b\x80\x25\xeb\xe0\x35\xc0\x47\x0c\xb6\xa1\x82\xd8\xa6\x35\xb6\x31\xa9\x62\x56\xe3\x69\x6d\x69\xf7\x48\x74\xd0\xa7\x7e\x37\x6d\x59\xac\x54\xd7\xe3\x65\xb3\x84\xbe\x2c\x24\xab\x4d\x08\x76\xb4\x1e\x2d\x98\x05\x9d\x17\x51\xb1\x7b\x61\x5a\x9f\x8f\x07\x5e\xd7\xb7\x06\xbd\x34\x85\x73\xa3\xbc\x99\x5a\x25\xab\xb9\x68\xd9\x08\x90\x5d\x36\x53\x65\x8a\xe1\x64\x83\xfd\xf4\x2a\x93\x1b\xd6\x0a\x47\xc0\xbc\xb3\x1c\x1a\xa6\xba\x09\x6c\x94\xb7\x92\xcb\x4f\x6e\x92\x17\x8c\x54\x3f\xb6\x6f\x6c\x37\xad\x8f\x1b\xe5\xe7\x89\xc5\x27\x37\x86\xe5\x64\xe5\xa0\x67\xb5\xbd\x51\x6a\x33\x95\x72\xb4\x64\x56\x0b\xbc\x88\xba\xa6\x60\x42\xdd\x16\x07\xdd\x89\x16\x55\xeb\x49\x85\x33\x2f\x35\x54\x31\x59\xf5\xdb\x11\x3f\x97\x4d\xee\xc3\x5a\xa4\x60\x16\x78\x2c\xa1\x3a\x3d\xb0\x5a\xe9\xf3\x68\x43\x9b\x48\xbc\x64\x26\x79\xb0\xc8\x0f\xb9\xac\x55\xa1\xa9\x70\xd4\x87\xf6\x79\x8f\xf6\x69\x7e\xca\x1b\x88\xb2\x79\x03\x51\xce\xba\x81\x28\x8b\x1b\x88\xc8\x75\xc2\x40\xce\x17\x71\xc4\xc6\xdf\x88\x0b\x05\xfe\x78\x04\x81\x16\x76\x12\x2a\x46\x9a\x04\xeb\x87\x68\x29\x01\x4c\xbe\x6f\x1a\x02\x42\x34\xad\xbd\x2d\xea\x6b\x3e\xbe\x8a\xa1\x60\x00\xc9\x44\x23\x01\xb0\xfc\xd6\x17\x53\x58\x60\x81\x2f\x44\x39\x7c\x8a\xb5\x2d\x6a\x65\x36\x6b\x42\x92\xaf\x43\x5d\x2a\x8b\x56\xd5\x4b\x51\x5e\xbd\x89\xb5\xae\x43\xc8\xc4\x20\x0e\x95\x4f\x7f\x01\x52\x34\xcf\x5f\x8b\x52\xa8\xe8\xee\xe0\xe9\x70\xda\xf2\xaa\x6e\xf8\x39\x94\x22\xb9\xc8\xf1\x11\x87\xd8\x95\x8a\xea\xec\x11\xa9\x01\x71\x28\x25\x56\x10\xa3\x12\x9b\xce\x41\xbc\x63\xe1\x20\x22\xd9\x12\x30\x30\x65\xb5\x6a\x57\x67\x4e\xe9\xba\x61\xf2\x96\x56\x5f\x5f\x62\x14\x8c\x28\x87\x15\xe4\x9d\x5b\x9f\xcf\x47\x01\x45\xe8\x34\x9a\x65\x03\x90\x0b\x23\xb0\x60\x96\x12\x27\x14\x51\x9f\x39\x6e\x35\x62\xcc\x01\xd5\xf5\x9a\x8e\x9a\xb6\xea\xc6\x7a\x57\x8c\x72\x02\xb7\x00\x47\x7a\x1a\x60\xf8\xfa\x92\xd8\xb9\xa2\x12\x7f\xe2\x7b\x51\xe7\x6e\x0e\x55\xab\x51\x23\xb1\x79\xc3\xc7\xaa\x66\xb2\xd1\xed\xad\x5a\x79\x04\x6c\xcc\xc1\xc9\x0d\x43\x84\x7a\x14\xa5\x9c\xb6\x4e\xd4\xcc\xc5\x45\xa2\x88\xcd\x22\xe2\xb5\x84\x2e\xc0\x77\x5c\x10\x6a\x72\xed\x30\x91\x00\x66\xe6\x99\x97\x53\xe3\xf6\x3d\x56\x71\xfb\x1e\x93\x17\x88\xb8\xd0\xbb\x14\xda\x82\x25\xc4\x7c\x11\xc2\x98\xcd\xc2\xea\x46\x91\xe4\x8e\xad\x90\xfa\xb6\xe5\xac\x7c\x38\xaa\xe1\x61\x16\x5f\xbb\xe1\x26\x9d\x35\x7f\x6d\xb7\xf9\x9e\xd3\x10\xfa\x62\xc3\x2b\x36\xcb\xd5\x0d\x42\x1d\x7a\x6d\xe1\xf4\x04\x77\x22\x2d\x49\xbf\x38\x5d\xe6\x95\xb7\x97\xee\xd8\xb6\xf1\x3f\xa4\x72\xd5\x14\x59\x90\x89\x77\x4d\xfd\x1e\xb5\xda\x64\xd4\xa3\x2e\xc1\xdc\xf7\xab\xa8\xd2\xda\x01\xf9\x8d\xac\x5d\x35\x4b\x09\x36\x1b\x26\x5a\x0b\x1f\xd1\x26\xc5\x64\xda\x5a\xcc\xf4\xfd\xde\x8f\x7a\x56\x57\xc9\x47\xcb\x0e\xc1\xfe\x21\xa8\xad\xae\x76\xed\xb0\x37\x6c\x82\x01\x44\x87\x87\x73\x5a\xed\x38\xde\x68\xd5\x0e\x82\x21\x0d\x56\xd7\xb6\xca\x3c\xcc\x17\xdb\xed\xb7\x59\x9f\xcc\x98\x2a\x84\x95\x66\xdb\xcb\x55\x8e\xf9\x0a\x04\x7d\x5b\xe9\xd8\x0e\x5d\x81\x64\x16\x18\x1a\x4e\x9c\x7e\x74\x7d\x30\xe7\x66\xb8\x6d\x94\x6b\x24\xf7\xaf\x8e\xc5\xfe\x03\x49\x52\x29\xe3\x9b\x0d\xf6\x1f\xbc\xa9\xe2\x1b\x0a\x7f\xf0\x66\x8d\xbf\x29\xb3\xff\xe0\xcd\x3a\xbe\x69\xb6\xd9\x7f\xf0\x66\x03\xdf\x3c\xa7\xec\x3f\x78\xf3\x0c\xdf\x6c\x6e\xb0\xff\xe0\xcd\x26\xbe\x79\x56\x61\xff\xc1\x9b\x2d\x7c\xb3\x5e\x65\xff\xc1\x9b\xe7\xf8\xa6\x5a\x61\xff\xc1\x9b\x3a\x47\xb1\xbd\xc1\xfe\xc3\x57\x1c\x47\x0b\xfe\xf0\x15\x47\x69\xad\xcc\xfe\xc3\x57\xf1\xf6\x5a\x9e\x1b\xfa\x56\x10\x72\x1d\x6b\xcf\x73\x3c\xbf\x46\x72\x6d\xcb\xbf\xca\xa5\x18\x19\x31\xe2\xc5\x76\xdb\x5b\x8b\xd9\xb9\xde\x3b\x8b\xa1\x49\x6c\xbf\xef\xb9\x7c\x9c\x9b\x8e\xd5\xba\x62\x9d\x2f\x97\x91\x18\xa3\x9e\xcd\x56\x8b\xdc\xbf\x3a\x9d\x0e\x46\x45\x66\xe2\x10\xef\xe6\x6a\x24\xe7\x77\x9b\x16\x13\x4a\xfc\x7f\x05\x28\xd2\x19\x3a\xce\x2e\x07\x64\x16\xa8\x60\x01\x46\xb7\xe4\x02\xe5\xd2\xd6\x26\x96\x71\xec\x6e\x2f\x4c\x2b\xb4\xb1\x8e\x85\xfa\xb6\x9b\x56\xa4\xfa\x8c\x23\x63\xd9\x6e\x2a\x9c\x4a\x55\x61\xfc\x91\xf7\x14\xca\x54\x37\x36\x8a\x44\xfd\x9f\x86\x77\x56\xb1\x08\xf6\xd9\x45\x59\x1f\x52\x78\x07\x87\x24\xce\x3d\xf7\x6b\x27\x2b\xda\xd5\xf6\x05\xd2\x13\x09\xb4\x71\x88\xd5\x99\xb2\x7d\x59\x57\xe7\x1c\xac\x58\xd6\xde\x85\x7d\xff\x21\x1b\x97\x38\x21\xd5\x6d\x80\xe5\xfb\xca\xa0\xde\x34\xdb\x61\x9f\x62\x31\x71\x21\xc6\x44\x91\xad\x8f\xac\x6b\xb2\xa0\x88\xe7\x80\x59\xa6\xd4\x0b\x91\x63\x8a\x2b\xaa\xac\xda\x85\x7d\x09\x1b\x24\xff\xc2\xbe\x4c\xb2\xac\x64\x65\xc0\x74\x4c\x37\x4b\xe1\xdf\x60\x9d\x07\xba\xaa\x45\x9e\xa1\xb9\x2d\xad\x1a\x23\x9c\xf1\xd7\xb4\x59\xc4\x33\xdb\x20\xc9\x80\xfa\x41\x8f\xec\x7e\xbc\x75\xf6\x5f\xea\x90\x70\xaa\xe8\x11\x5b\x29\xc5\xb3\x66\xb2\x59\xd2\xcc\xc8\x25\x73\xe2\xa4\xf5\xf9\x79\x4a\xf9\xac\xae\x46\x20\x47\xce\xad\xf6\x44\x9e\x9f\xc4\x83\xca\x72\x52\xe9\xcc\xc6\x34\xa0\xca\x98\x3e\x2d\x8b\x4f\x6a\xbb\x95\xc9\x75\xb3\xb0\x48\x6f\x50\xdd\xe7\xf1\xdc\x45\xa9\x28\xc4\x8b\x66\xb5\x28\xc1\x15\x92\x17\x23\x20\xcb\x19\x44\xa1\x10\x60\xc1\x72\x3f\x23\x5b\xa3\x56\x2a\x8b\x9f\xa0\xc0\x0f\xf1\x70\x50\x7c\xe7\x5a\xfd\xd4\x16\xaa\x09\x45\x33\x8f\x45\x65\x29\x75\x28\x6e\x87\xbd\x33\x21\xf5\x12\x8f\x2d\x13\x8a\x66\x1e\xa1\xcb\x52\xb2\xe2\x51\xcb\x73\x77\x87\x61\x08\x5a\x5b\xe2\x10\xac\x95\x13\x0a\x67\xb5\xa2\x4a\xc9\x8a\x30\xe5\x76\xbd\x9b\x93\x61\xe8\xd8\x2e\xdd\x75\x2c\xf7\x2a\x4d\x9c\x3d\xdb\xc8\xac\x96\xd5\x72\x52\xf9\x18\xb0\xd4\x76\x9f\xc7\x8a\x4e\xd3\x96\x41\x9c\x34\x71\xb5\x6e\x94\x9a\x44\xbc\x1f\xa2\xe0\xc0\x39\x92\xd5\xa4\xce\x3b\x67\xd8\xb5\xdd\x43\xc7\x1b\x99\x41\x6e\x81\xe9\x99\x74\x6e\xf0\xab\xd3\xd4\x39\x5a\x9a\x11\xce\xed\x6d\xca\x9c\x2c\x59\xee\x78\x7b\x26\xd4\xde\x7a\xa9\x71\x9a\xa6\xc7\x0b\x80\x4c\x83\x94\x54\x41\x62\x3a\x09\xb8\x60\x7b\x5e\x28\xdc\xa2\x79\xe6\xa4\x1a\xc9\xd9\x2e\x63\xc5\x95\x8e\x43\x6f\xf8\xb1\x99\xe5\xd8\x5d\xf7\x28\xa4\x70\xc9\xdd\xa2\x6e\x28\xd3\xa8\xa9\xe3\xa1\x1a\xc9\xb9\x9e\x4b\x73\xc2\x27\x06\xa2\x00\x0b\xe0\xad\xa1\x1f\xc0\x9e\x91\x4b\x5b\x71\x1c\xe7\xc9\xba\x56\x33\xf0\x9c\x61\x48\xf9\x17\x6f\x60\xb5\xec\x50\xe4\x22\x26\x64\x64\xb7\xc3\x5e\x8d\xe4\x2a\xe5\xf2\xbf\x79\x91\x1e\x65\xbb\x0c\xf3\x5d\xe8\x0d\x64\x15\x87\x76\x42\xf9\xd0\xb7\xfc\xae\xed\xca\xc7\x81\xd5\x6e\xc3\xd9\x55\x59\xa0\x2b\xf9\xed\x3b\x3c\xf2\x1c\x1c\xe2\x91\x1f\x21\xc0\x33\x28\xa0\x33\x0c\xb8\x9e\x86\x87\x5b\x79\x3c\x25\x47\x1d\xf2\x85\xe9\x8b\x5f\x8a\x91\x84\x19\x76\x20\xda\x06\xbb\x82\xa7\xab\x3a\x32\x29\xc3\x6d\x64\x44\x4a\x2c\x21\x72\x9d\x27\x7e\xc4\x9b\x79\x9e\x5a\x5c\x62\x78\xde\xa3\xc4\x6e\x81\x3f\x86\xe0\x0d\x3c\xb4\xca\xc6\x97\xf5\x4c\xf8\xaf\xb0\x8f\xe2\x70\xad\x08\x86\x13\xdc\xbc\x18\x5c\xe0\x30\x59\xa8\xe7\x86\x6c\xbb\x68\x85\x43\x9f\xc6\x7a\xcc\x44\x4b\x4d\x18\x30\xce\x34\xbf\xcc\x28\xc4\x2f\x66\xaa\x9c\x4a\x67\xcc\x80\x3e\x03\xa8\x08\x49\x3f\x04\xb4\x33\x74\x18\x41\x51\x67\xc7\xb3\x48\x34\xe9\x19\x0c\x1c\x9b\x1f\x41\x0a\xda\x06\x1a\x3d\xd8\x52\x4b\x83\x74\x0e\xc0\xcc\xf2\x46\x6b\xff\xb5\xbb\xae\xe7\x53\x13\xc6\x5b\x9e\xb8\x2f\x83\x11\xb2\xa1\xf0\x79\xb2\x37\x81\x25\x81\xe1\x96\x32\x38\x9e\xc7\xf5\x12\x1c\x21\x26\x98\xea\xb2\x9a\x72\xf3\x36\xe1\xdb\x83\x81\x43\x09\xed\x74\x68\x2b\x9c\xdc\xd2\x29\x14\x9f\xa1\xb9\xe9\x67\xc8\xd0\x7d\x80\x39\x62\xff\xb3\x26\x47\xaa\x44\xb4\x06\x03\x6a\xf9\x01\xd8\xfb\x87\xd4\xef\xdb\xae\x15\xea\x64\xd0\x5f\x3f\xc8\xe8\x25\x34\x7c\x4f\x23\xa8\x03\xfe\x87\xc9\x3a\xb5\x33\xd7\x65\x1b\x64\xbd\x01\xcd\xe0\x0b\xa1\xa8\x5b\xe9\xe4\x18\xe0\x8e\x7e\x36\x39\xf7\x01\x72\x7d\x58\xa1\xb0\xeb\x1b\xab\xb4\x2a\xc4\xa7\x98\xb3\x19\xdc\xc7\x78\xfb\x22\x64\x19\xdc\x92\xc9\x81\x8e\xa0\x71\x4a\x3b\xa9\x48\x30\x5a\x73\x14\x92\x65\xa4\x3b\xab\x90\xdd\x93\x51\xe6\xc1\x86\x52\xb2\x21\xa4\x35\xc2\x25\xd6\x72\xbb\x42\x7c\xf0\x46\x23\x09\xc6\x20\x62\x0e\x70\x35\xfe\xe2\x09\x27\x44\x6a\x2f\xde\x82\x59\xb7\x89\x66\xc1\x77\x62\xbd\x85\xea\x5f\xf8\xc3\x17\xee\x28\xc7\x21\xa0\xc0\x96\x7d\xf4\xdc\xbd\x9e\x48\x21\x39\x89\x4a\x29\x64\x0a\xad\xa6\xb8\x22\x9c\x57\xaf\x51\x19\x32\x67\xd4\x6c\x8c\xae\x25\x30\x01\x3f\xd2\xcb\x84\x8b\x27\x91\xab\xe4\xed\x6e\x8d\xc9\x03\x3e\x46\x45\x32\x70\xa8\x15\x50\x32\x1c\xb4\xd9\xe8\xc1\x4a\xd9\xf4\x6e\x8a\x04\x0f\x11\xc0\x7a\xf7\xd4\x6a\xdb\x1e\xab\x1b\x78\x2a\xa7\x5d\xfd\xdd\x91\x34\x01\xc5\xab\x28\xb6\x74\x00\x94\x76\x69\x26\x95\xf3\x44\x5a\xa8\x7c\x57\x4b\xf6\x3c\x02\x46\xee\xa3\xe6\x94\x31\xbc\x7e\xc9\x0e\x4e\x85\x81\xf0\x22\x75\x6b\xb3\xe2\x7d\x3f\xe2\x8d\x43\x2b\x68\xa8\x14\x63\xaa\xd0\x4f\xf2\xde\x33\x79\x41\x0e\x9f\xf3\x74\xd7\x93\xa6\x21\x3f\x71\xc3\xf3\x5b\x3c\x79\x93\x91\x2c\x4c\x6b\xea\xe4\x23\x1a\x65\x7d\x01\x6e\xab\x1a\xc4\xb5\xe9\x21\x26\x40\x89\x58\x93\xa1\x08\xd0\x6c\xc9\x58\x0b\xf7\x66\x48\x26\x8d\x9a\x7c\xda\xf9\x55\x9b\xf5\xd8\x83\x4e\x49\x7b\x25\x8a\xc6\x4b\x99\x15\x23\x4d\x22\x89\x6b\xb1\x82\x49\x2d\xcb\x79\x11\x69\x5e\x9b\x2f\x11\x2c\xb4\x2f\x11\x64\x34\x58\x09\x18\xad\x45\x30\x92\xa5\x0d\xb4\x24\x3f\x09\x7c\xe4\x0b\xe5\xa7\x6f\x96\xd0\xab\x44\x9a\xcd\xb5\xb8\x58\xcf\x89\xb6\x65\xd9\xed\xa4\x45\x8f\xac\x40\x12\x44\xdf\xb5\x9c\xe4\xe5\xc6\xe7\xcb\xc3\x2e\x5b\x3a\x8c\xdc\xfd\x30\x6d\x7e\x8d\x64\xf0\x27\x78\x49\x26\x0f\xb8\xd5\x45\x99\x02\x53\x24\xb1\xba\x3c\xed\x98\x84\xae\x0a\x6b\x99\xef\x05\x5f\xae\xcb\x24\x65\x68\x66\x4a\xfb\x83\x22\x69\x60\x84\xe2\x06\x66\x93\xc2\xcf\x68\xec\x64\x5e\x6b\x28\x84\xb0\x82\x6a\xa9\x20\xeb\x29\x4f\x6c\x07\x9c\x55\xa3\xb3\x00\xf2\xfc\x07\xf2\x02\x92\x95\x2a\x14\x49\xe3\x0a\xec\x32\xca\xdb\xf8\xeb\x3f\x50\x1b\x1f\xcc\xd8\x01\xac\xf2\x45\x83\xe7\x8e\x50\x93\xa5\xa1\xbb\x2f\xdc\x2d\x49\xef\x6c\x38\x96\x6c\x60\xfa\xad\x3c\xf4\x16\x7f\x60\x00\x6e\xe8\x63\xfa\x95\x46\xb4\xbb\x79\x20\x20\xd9\xd1\xfa\x5d\x6a\x34\x20\x72\x67\xa3\x01\x91\xaa\x18\xbc\xc8\xdd\x53\xd2\x20\x16\x0a\x60\xcf\x53\x62\x4a\xf4\x18\xa1\x16\xc9\x05\x6b\xe4\xb2\xd4\xf2\xdc\x96\x15\xe6\x59\x3f\x0b\x85\x02\x1f\x1b\xf1\x6f\x09\x95\xc7\x1d\x26\x17\xf8\x1b\x9b\xdb\x17\x62\x6a\x46\x7c\xd7\x14\x27\xe9\xfa\x4b\x3b\xd8\xf3\xdc\xd0\xf7\x1c\x07\x12\xa5\xe8\x9f\x7a\x96\xdb\x76\xd0\xb8\x0f\x15\x40\x83\x59\x41\xf5\x8c\xc6\x6f\x10\xca\xe5\x0e\x6a\xa6\x25\xcc\x67\x50\xe2\xaf\xb5\x4c\x78\xe0\x60\x1e\xc7\xc0\x0c\x22\xc0\x3b\x27\x42\x03\x7d\x57\xa7\x63\xa2\x9d\x3b\x23\xeb\x9d\x01\x1d\x2b\xb3\x95\x27\x28\x09\x0d\x36\x09\xbc\x59\x02\xbb\x55\x14\x0d\x24\x25\xd5\x13\xd9\xb1\x8b\xd3\x33\x8a\x36\x93\x0a\xc6\x0d\xb9\x66\x3b\x88\xb7\x76\xc9\x93\xfb\x42\xa0\x7d\x45\xc7\x35\x92\x93\x52\xe5\xa3\xed\x38\xc7\xde\xd0\x15\x87\xac\x52\x99\x55\x6b\x51\xac\x68\x3e\x3a\x66\x03\x7e\x68\xa9\xa8\x81\x76\xa0\xf8\x97\xc4\x24\x48\x32\x31\x06\xc6\x5a\x15\x1d\xe2\x09\x23\xcc\x63\x1e\xb6\xe4\xe7\x22\x78\x75\x49\xf9\x09\x8c\xad\x95\x8f\x30\x84\xe1\xcc\x26\x99\x03\xd1\x33\x17\x88\xd8\x8a\x9a\x58\x88\x87\xfd\xd3\x83\x4b\xa4\xa7\x55\x2c\x12\x73\x54\x30\x2f\x6f\xea\x48\xe0\xe7\x18\xf5\x1b\xf2\xac\x4e\x1a\xff\x6a\xdc\x59\xe5\xe3\xa2\x91\x55\xde\x0b\x9a\x63\x56\x4c\xa2\x05\x77\x1c\x6b\x18\x03\x16\x29\x89\xc7\x8d\x5a\x29\x7c\x91\x50\x8a\x21\x19\x81\x28\x5e\x27\xb6\x2e\x16\x77\xa3\x75\x5d\x17\xc0\x3f\x71\x4a\x67\x82\x16\x6f\xcd\xb2\x76\xcb\x73\xcd\x72\x76\x0c\x9e\x3a\x5b\xd0\x4a\xc9\x77\x09\x65\x4f\x41\x2f\xd3\x4b\x9e\xd2\x8e\x59\x0e\xe2\x02\xca\x32\x6e\xac\xc7\x42\x7c\xa8\x32\xe2\x8d\x59\x4e\xec\x83\x55\x39\xf1\xc6\x2c\x27\x42\xb0\xf0\x42\xf0\x18\x69\x71\x36\x0b\x71\x04\x54\x24\x17\x39\x3e\x0e\xb9\x22\xc9\xf1\xa1\x96\x3f\xd9\x48\xc2\x83\x1a\x2a\xf6\x28\x86\x82\xfd\xb6\xf9\x3b\x45\x50\xf9\x74\x4a\x3b\xec\xb7\xcb\x81\x08\x02\x80\xc1\x39\xef\x24\xfb\x0d\x7d\xc9\xe9\xf9\x88\xb9\xad\xf7\xa1\xe7\xf7\xb9\x9c\x10\x9c\xcd\xa3\xa1\x95\xcc\xaf\x91\xc9\x20\xd0\x23\x3b\x06\x2b\x45\x24\x91\x09\xc2\x94\x42\x5a\x16\x45\x05\xcc\x0c\x9e\x10\x8d\x6e\xa3\x35\x6a\x42\x96\x8c\x9b\x16\xa2\x26\x65\xbd\x8c\xcb\xd9\x17\xc6\x2c\xae\x11\xb5\xd2\xab\xf5\xd4\x80\x25\x86\x50\x5a\xdd\xab\xab\x7d\xc5\x08\x7c\xcc\x4b\xbe\xe7\xb1\x65\x8e\x3f\xc9\xcd\x8c\x31\xd1\x99\x6e\xa3\xc4\x13\xd7\x2f\xb2\x63\x0d\xea\xe2\x4c\x42\x17\x82\x47\xae\xaa\x73\x41\x91\x12\x41\x12\xbf\x50\xd4\xc5\x67\xa1\x10\x61\x0c\x1b\xe5\x8f\xa0\xf1\x0b\x43\x2e\xd5\xa4\x2c\x89\x30\x8a\x88\xaf\x2c\xf6\x44\x22\xc4\x72\x84\x65\xe4\xc6\x25\x63\xb7\x68\xca\x73\xb8\x5c\x37\xed\xe6\xa5\x78\x61\x5a\x57\x4c\xd0\x69\x2f\x92\xd5\x1c\xa5\xc8\x4e\x87\x84\x6e\x22\x91\x84\x48\xa6\x97\x85\xf8\x93\x1a\x45\x8d\xe4\x82\x81\xe5\xe6\x52\x56\x8a\x1a\x49\x59\x1d\xd4\x6d\x4f\xb2\x8c\x57\x67\x85\x71\xb2\xf8\x9e\x63\xa4\x94\x8a\x7c\xf4\xf0\x30\x57\xad\xb9\xf8\x26\xef\x7a\x6d\x1a\x9d\xc1\x62\x85\xd5\xd4\x62\xaf\x4d\xb7\x8d\x32\x77\xfa\x1c\x16\x8e\x0c\xc5\x08\x1b\xe8\xcf\xd9\x43\x81\x72\x32\x57\x9c\x8e\xd0\x98\x10\x3a\xb6\x73\xc5\x3f\x3c\x77\x8e\x2f\x44\x52\x09\x9a\x2c\x4f\x52\xa8\xa8\x4e\x7b\x93\x37\x01\xd9\xc3\x4d\xf9\x0a\x3a\xef\x90\x67\x2c\x87\x3c\xc2\x99\x39\x24\xda\xc2\x1e\x8b\x3f\x66\x70\xc2\x24\x2e\x90\x1b\xa6\x18\x13\x88\x4c\x67\xb8\xc4\xc5\x01\x28\x2d\x02\x5b\x88\xd6\xbe\x4b\x67\xa9\x42\x41\x3e\x15\xb6\x4d\xed\x52\x2c\x90\x7c\x8e\xab\xdd\x00\x58\xc6\xe6\xa3\x8c\x16\xd9\xf7\x6b\x5b\x51\x5e\x42\x37\x4d\x88\x5c\xba\xa7\x1d\xd6\x44\x2e\x4b\x65\x44\x6c\x71\x1f\xa9\x1d\x0a\x89\x10\x07\x5a\xbb\x7a\x84\x5a\xd9\xae\xb9\x56\xd6\x32\xa2\xd1\x22\x44\xcd\xd7\x06\x3d\x82\x94\x25\x99\x9a\x36\x68\xe7\x52\x24\xdf\xf9\xac\xc8\x1d\x0f\x6d\x85\x48\x8e\xdc\x19\x9b\xec\x84\x90\x61\x5b\xd3\x84\x0c\xfb\xeb\x86\x06\x10\xf6\x3e\x76\xf0\xd1\x6e\x87\xbd\x7d\x6f\xe4\x6a\x56\x40\xfc\xed\x87\xc1\x0f\x37\x4e\xfe\x69\x2a\xfc\xd3\x54\xf8\x1f\x61\x2a\xfc\x70\x96\xc0\xf0\x74\x70\x4d\xdd\x50\x8b\xef\x9d\x38\x13\xd7\x32\xea\x4c\x6c\xcf\x28\xad\x39\x03\x34\xbd\xa1\xdb\x4a\x0d\xd6\x50\x8d\x95\xcc\x8e\xaf\x81\x65\x94\xd5\xaf\x6f\x0d\xf6\xd1\xda\x82\xef\x4a\x12\x7d\x13\xd6\xd3\x2a\x64\xda\x0a\x9b\x45\x0d\x4b\x63\xe1\x33\x9c\x38\xdf\xaa\xf1\xa2\x93\x6c\x92\xa1\xd0\x9c\x01\x36\xfe\x4a\x86\xb2\xaf\xec\x6e\x8f\xfa\x10\x83\x49\x6a\x0b\xa9\x93\xe5\xd9\xd4\xf6\xa9\x89\x60\xb3\xed\x55\xc9\xea\x2a\x81\x84\x23\x98\x77\xdf\xf1\x46\x24\xb0\x5c\x3b\x1c\xf3\x38\x50\xf9\xfd\x13\xf2\xf6\xe4\x9c\xec\x1f\xbc\x39\x38\x3f\x28\x48\xbf\x50\x56\xb2\xe4\xf9\xdd\xd5\xd0\x1f\xaf\xfe\xab\xfc\xfb\xa7\x8f\xa3\xfd\xee\xf3\xee\x79\xf7\x4d\x77\xb7\xfe\xfb\xfb\xd7\x9f\x0e\x8e\xf7\x5f\x6e\xed\xf6\x3f\x1c\x7d\xed\xb6\x6c\xe7\xfd\xda\xe8\xe5\x7a\xdd\xfb\x70\xf6\xf1\xe4\x65\xfd\xfc\xdb\xde\x79\xf7\xe5\xd6\xfa\x6e\xef\x7f\x67\xf5\x93\xf1\xd9\x46\x77\xf7\xc3\xcb\xf3\xfa\x9b\x8d\x9b\x60\x58\xbf\xfa\xdf\xfb\xd1\x78\xe3\xe4\xfd\xab\xc1\x46\xab\xfe\xe6\xec\xcf\xca\xb3\xaf\x9f\x87\x7f\x8c\xda\xad\x96\xe7\x77\x77\xd7\x3e\xed\xd7\xeb\x1f\x57\x3e\x94\x7b\xbb\xc7\xf5\x83\xee\xab\xab\xea\xc6\xef\xf5\xfa\xf3\x3f\x3f\xd6\x5f\x6f\xb4\x8e\x47\x7b\x87\xe3\x63\xf7\xdb\x59\x35\xa8\xbf\xea\xd6\x0f\x5f\xed\xd7\xeb\x9f\x47\xf5\xe1\x61\xff\xa0\xfe\xae\x5b\x7f\xdd\x72\x2a\xd5\x73\xe7\x39\x7d\x79\x68\x9f\xb4\xea\xe3\xe5\xf7\x1f\x3e\x77\x2b\x5f\x8f\xfd\xdf\x0f\xed\xcd\xfa\xde\x71\xfd\xf5\xf8\xfd\xf1\xc9\xe1\x41\xfd\xf8\x6b\x6f\x64\xef\x7d\x5d\xef\xee\x0e\xc6\xf5\x83\x41\xf0\xfc\xf7\x8d\x2d\xef\x7c\xef\x68\xfc\xce\xfe\x78\x72\x5a\x2e\xd7\x77\x83\x0f\x67\xc7\xf6\x7a\xfd\xd5\x87\xba\x5d\x79\xbd\x7e\x78\xd3\xa3\xf5\xdd\xe3\x8d\x8d\x97\x57\xf5\x93\xde\xb7\xe1\xf9\xeb\x57\x1f\xc7\xef\xac\x8f\x1f\xed\xbd\xf1\xf0\xe0\x4f\x6b\xe8\x9d\xdd\x54\x5e\x1f\x0d\xf7\xad\xf7\xde\xe9\xeb\x67\xaf\x2a\x6f\xba\xf6\xcb\x57\x2d\xef\x5d\x75\x6f\xf7\xdb\x78\xeb\xe5\xa7\xe1\xb7\xdd\xcf\xfd\xfa\xd5\x1f\xd5\x4f\x2f\x5f\x7a\xbd\xd7\x95\x6e\xfd\xfa\x78\x74\xf4\xc7\xfe\xd1\xd7\xfa\x87\x93\xb0\x7d\xbd\x77\xf5\xfa\xf7\x8d\x77\x07\xaf\x5f\x3b\xbd\xfa\xf9\x33\xdb\xb9\xbe\xea\x75\xae\xb7\x0e\xaf\xc2\x37\xc3\xd3\x5e\xdd\x73\x0e\x07\x2f\x3f\x8c\x2b\xef\x3c\xe7\xf8\xd3\xb7\xe3\xd0\x7f\x55\xaf\xbf\xfe\xf3\xf4\xb0\x5e\x6f\x8d\xdf\x6f\xec\xf5\x8f\xbf\xf5\xeb\x07\x87\x7f\x04\x1b\x95\xe0\x79\x18\xbc\xff\xf4\x2e\x58\xbe\x6a\xdb\x83\xf6\x38\xfc\xc3\xba\xde\x7d\x69\x8f\x3e\xbc\x39\x18\x9e\xac\xbf\xdf\xfd\xe3\x7f\xfd\xd6\xeb\xaf\x7f\x3e\x7f\x6f\x79\xef\xda\xfd\x57\x67\xe5\x37\xeb\xe5\xff\xed\x9e\x7c\xe8\xbe\xbd\xda\x5f\xbe\xae\x1f\x74\xd6\x4f\x3e\xb7\x0f\xfa\xaf\x87\xbd\xf7\xfb\xef\x8e\xfb\xbb\x61\xe7\x5d\x6f\x7d\x7f\xf4\xaa\xf9\xfe\xe8\x55\x7d\xf4\xfa\xf5\xfa\x71\x7d\xa5\x5e\xdf\x6f\xbe\xbc\xa9\x7c\xaa\xbf\xad\xac\x1f\x8e\xba\x9b\xee\xc6\xe0\x6b\x37\xf8\x54\x0f\xdc\xf7\xee\x67\xe7\xa0\xfc\xbe\x7e\xb4\x39\xfc\xb4\x7b\x70\xf2\xa9\xff\xbf\xe6\xd5\xa7\x37\xd5\x9b\xea\xeb\xeb\xde\xe8\x70\xf7\xa8\xbb\x77\xec\x75\xff\x3c\x3b\xaa\x9f\xbf\xf9\xba\x7e\x7d\xf6\xc7\xf1\x78\xf7\x99\xf3\xf1\xe3\xe6\xf9\x51\xf0\xb6\xff\x69\xfd\xdd\xe7\x57\x7b\xeb\x6b\x6f\xde\xf7\x5e\xd5\xeb\x07\xbf\x9f\xd5\xf7\x3f\x5e\xed\x7e\x7d\xe3\x1d\x7d\xbb\xb2\x97\xf7\xbb\xf5\xdd\xad\xbd\xdf\x0f\xde\xef\x5f\x3f\x5f\xe9\xbe\xdf\x0d\xbf\x8e\x4e\x7f\xbf\x1e\xbf\x59\xe9\xb9\xbf\xbf\xfd\x7c\x72\xfa\xec\x68\xf4\x27\x7d\x77\xbe\x57\xf6\xdc\xdd\xff\xb5\x6e\xce\xce\x5f\x9e\x1f\xd7\x3f\xfc\x7e\xfc\x69\xa3\x5f\xaf\xaf\xbc\x39\x38\x7b\xe6\xbd\x1e\x1e\xec\xfb\x83\xf2\xc9\xd7\x97\xaf\x97\xbd\x97\x6f\xec\xa1\xb5\xb1\xf5\x7b\xb9\xfd\xfb\xc9\xeb\xf5\x72\x9d\x1e\xae\x1f\xd7\x97\x5f\xad\x6f\xbe\xfe\x1a\xd4\xfd\xcd\xeb\xdf\xb7\xfa\x7b\xf4\xed\xfa\xb5\xed\x1f\x8e\x06\x5d\xef\x70\xfd\x6c\xff\xd5\xe1\x41\x70\x5a\xff\xb8\x3c\xba\xf9\xfd\xf5\xd9\x9f\xef\x0f\xdd\xd1\xf5\xd9\xc6\xf1\xb3\xdd\xd3\x72\x6b\xd4\x3a\xec\xbf\xdc\x3d\x3b\x7c\x7f\xd6\x6b\xed\x76\xfd\x60\xf3\xd9\x69\xfd\xea\xf8\x70\xb4\x5f\xb6\xce\x5b\x9f\xaf\xae\x5f\x95\xcf\x8e\x3f\xdd\x04\xff\xab\x1f\xfd\xf9\xed\xf0\xec\x73\xef\xf8\xf3\xeb\xf2\xa0\x79\xd4\x6d\x79\xaf\xbb\x83\xce\xfe\x6b\xeb\x78\x6d\xa3\xf3\xf2\xec\xdb\xf8\xfa\xf8\x74\xe3\xea\x23\x1d\xbc\xf5\xba\xfe\xf2\xc9\x41\xfd\xc3\xcd\xe7\xd1\x9e\xf5\xc9\xb3\x87\xb6\x5d\x7e\xb3\xff\x72\xf0\xf5\xdb\x95\xbb\x55\x3f\x6a\x9d\xed\xad\xbb\xf4\x7c\xef\xf7\xb1\x7d\xb2\x71\xf6\x66\xfd\x88\x2e\xd7\x9f\x07\x67\xbd\xa3\xdf\xcf\xce\xac\xab\x95\xa3\xc3\x8f\x57\x07\xd6\xf2\xcd\xef\x07\xc3\xe3\xcf\x47\x1f\xdc\xf5\xeb\xfd\x0f\xcd\xd3\xc3\x5d\xef\xfd\xa7\xfa\x86\x43\xbd\xd1\xe6\xf0\xd5\xb8\xeb\xef\x85\xc7\xfd\xab\x37\xfe\xa0\x3f\x1e\xbb\xc1\xe8\x8f\xc3\x93\x8d\xf7\x57\xef\x5b\xbd\xe3\x5d\xf7\xed\x9f\xad\xbd\x67\xd7\x7f\xf6\xfc\x97\x6e\x65\xf0\xe7\xf5\xae\x35\xf8\xfd\xdd\xde\x56\x73\xd4\x79\xf3\xf9\x60\x74\x72\x36\xda\xec\xd3\xd3\xd6\xd5\xd1\xf2\x59\xeb\xf5\x87\xdd\xcf\x67\xa3\xf7\xcd\xe3\xfa\xd9\xe7\xd1\x2b\x7b\xf0\x7b\xd9\xb1\x5a\x95\xe3\xf7\xcf\x46\x1f\x3b\xf6\xc9\xf9\xab\xeb\xa3\xab\xbd\x4d\x1a\x9c\x74\x06\xa3\xfa\xcb\xff\xed\xee\xba\x95\xb3\xbd\xde\xd7\xfa\xba\x75\x3a\x18\x1c\x37\x3f\x0f\x37\xec\xcf\x47\x7b\xfd\x4e\xaf\x7f\xd2\xef\x37\x3f\xbb\xfd\xd1\x1f\x87\x57\xdd\x41\xd3\xb9\xea\x3a\xcd\xf1\xd7\x8f\x37\x6b\x95\xe0\xf3\xd6\xfe\xdb\x60\xd4\xfc\x3c\xda\xad\x7e\xdb\x6f\xfb\xe1\xf2\xef\xf5\xfa\x92\x0c\x86\xb6\x2b\x83\xf7\x8a\x94\x93\x01\x26\xbd\xb6\x3b\x24\x68\xf9\x94\xba\x68\xe3\x4e\xec\x00\xcd\xad\xd8\xea\xe8\x81\x17\xba\x15\x52\x9f\x84\x3d\x0b\x6d\xc2\xba\xf6\x35\x75\xb5\x20\x10\x32\x72\x1a\xda\x74\x21\x2c\xd0\xee\xb5\xb7\xaa\xb8\xf6\xd2\x76\x5b\xce\x30\xb0\xaf\x29\x59\x11\xb8\x41\x90\x3c\xd8\x43\xb0\xcd\xcf\x0c\xeb\x88\x5a\xfb\xd2\x97\xbe\x69\x17\x0f\x0d\xd6\x34\x2e\x0e\xfa\x5e\x26\x69\x7f\xa3\x12\x23\x88\x97\x5a\x04\x8e\xa2\x4e\x30\x65\x96\xa1\x48\x73\x3f\x69\x06\xb8\x5f\xb1\x38\x35\xe0\xc0\x0b\xa6\xdb\x6b\x5c\x8d\x80\x24\xd4\x90\x4c\xe0\xe6\xa4\xa3\x61\x5d\x20\xff\xd9\x99\x58\x5c\xef\x58\x24\x8f\xe3\x4c\x2d\xcd\xd8\x10\x77\xcf\x5d\x84\xe7\x1d\x1a\x04\xff\x67\x0c\x9f\xb9\x61\xe6\x6f\xa3\x2c\xc5\x5e\xff\x4d\x99\xca\xc0\x74\x0a\xae\xd2\x58\x63\x46\xa6\x32\x5b\x9a\xad\x21\x6e\x69\x89\x21\x8d\x2c\x87\x5f\x4f\xdb\x6e\x08\xf1\x61\x30\x36\x3a\x18\x6a\xbc\x3a\xd9\x9b\x49\xfd\x3d\xd9\x4b\x74\xcf\xa9\x07\xe4\x0b\x86\xc3\x2e\xd9\xae\x4b\x7d\xc0\xfa\x0b\x9a\xf2\x5b\xd7\x96\xed\x40\x40\x11\x4f\x0f\x8d\x5c\xc4\x9a\x23\x2a\x58\x8b\x71\x16\xde\xef\xda\x6e\x97\x58\x2e\x8f\xc4\x2f\x8e\xca\x99\x46\xdc\x1e\xc2\x37\x06\x04\xd2\x73\x90\xbe\x37\x14\x66\x41\xe4\xc8\xc5\x70\xa5\x81\x1d\x0e\xd1\x1c\x74\xec\x0d\x49\xdf\xee\xf6\x42\x32\xb2\x5c\x80\xcf\x63\x30\xb3\x6d\x69\x10\xda\x2d\x88\x7c\x3a\x18\xf8\xde\x8d\xdd\xe7\x77\xe4\x4f\x11\x45\x7d\xb6\x09\xab\x57\xc7\xd6\x02\x70\x1a\x45\x74\x3b\xe3\x43\xcf\x97\x01\x9d\x8b\x80\x42\x0b\x62\xe2\x80\x81\xbb\xc0\x7e\x18\x50\x7f\xc5\xea\x32\x78\x22\xbe\x27\x40\x5f\xe9\xd9\xd2\x8f\x45\x64\xb2\x69\x59\xae\x3d\x84\xb3\xc0\xfe\xea\xbf\x02\x6a\xf9\xad\xde\x0e\x96\xfe\x77\xb5\xdc\x83\x19\x2b\x2d\xb1\x21\xcb\xd4\x47\xf4\xfd\x9a\xcd\xb4\x52\x5f\x90\xe6\xb4\xae\xd4\x40\xdc\x8f\xa1\xa3\x02\x18\xb1\x48\xde\x1d\x83\xbd\x3a\xa3\x1b\x0e\x51\xcb\x72\x5a\x43\x07\x47\xdd\xf1\xba\x76\x4b\x99\x8a\x8d\xfe\x81\xd4\x10\xe9\x18\xa7\xac\x79\xe4\x7e\xa5\xad\x10\xef\x2c\xc4\xd4\xfd\xbf\x27\xcb\x5c\x56\xb8\xc9\xd5\xa7\x36\xc4\x7d\xc8\x41\xd1\x10\xc2\xd0\xe0\x6c\x84\x46\x76\xd8\x83\xf9\xa8\xaf\x82\xf2\xe5\x03\x07\x49\x14\xa9\x4d\xa5\xb9\x59\xcc\x28\xd2\x08\xa3\xe8\xd3\xc0\xfe\x46\x8f\xdc\x90\xfa\xd7\x5a\x54\x3d\xfd\xb5\xa5\x5d\x25\x9a\xef\xf5\xc8\x7e\x26\xa0\x08\xa6\x95\x67\xcf\xf4\xe0\x7e\x7a\x59\x7e\x89\xbc\xba\x4a\xbe\x40\xd2\xb5\x2f\xe8\x4d\x84\xcc\x4b\x9a\xd4\xf1\x46\x6c\xe1\x92\xe7\x49\x4b\xb2\x0f\x31\x12\xa7\x9a\x81\xa6\x1b\x82\x02\x8c\x74\x1b\x50\xcd\x0a\x54\x1f\x3b\x71\xb7\x86\x26\xa0\x51\x13\xa3\x74\x1b\xd0\xe9\xac\x40\x85\x92\x28\x2b\x3d\xb0\x09\xe8\x74\x46\xa0\x29\xf7\xe7\xf7\x67\x08\x4a\x76\xb0\xe7\xb3\x98\x80\x22\xa9\x62\xd6\x9f\xb3\x1a\x7f\x6a\xa4\xe0\x22\x52\x32\xaf\xea\xbd\x69\xdc\x79\x0a\x2c\x2c\xba\x2a\x8f\x79\x15\x6a\xd1\x4c\xde\xe2\x0f\x81\xa0\xc7\x0a\xf2\x54\x4c\x87\xd2\x6d\x16\x8a\x91\x29\x57\xb8\x17\x23\x4a\x6d\x30\x33\x0c\x29\xf9\xe4\xb8\x50\xe8\x47\xac\x28\xf7\xed\xb6\x69\x44\x99\x61\x46\x29\xca\x46\xc8\x31\x1b\x35\x94\x25\x69\x2a\x4e\x1f\x6d\xc7\xf9\xe0\xf6\xa7\x45\x4b\x2b\x9e\x84\x99\x3e\xd8\xa5\x16\x53\xef\x9c\xfc\x74\x08\x69\x7d\xca\xc0\x43\xef\xb9\xd6\xe5\xb8\x91\x95\x32\xb8\x05\x29\x19\xbd\x4c\x8f\x87\x0f\x8d\xd6\xd0\x63\xd4\x6e\xc7\xea\x36\x46\x5c\x98\x62\x92\x4f\xe3\x7b\x2c\xeb\xc2\x53\x72\x16\x5a\x7e\x88\x69\xd9\x41\x73\x76\xbc\x11\x0d\x42\x6e\x7c\x67\x05\x04\x72\x6a\xb9\x6d\xd2\xa6\xd7\x76\x8b\x06\xc4\xeb\x84\xd4\x25\x3d\xeb\x9a\x12\x8b\x04\x7d\xcb\x71\xb8\x2a\x1d\xc9\xaa\x10\x6b\x48\xd1\x84\xdc\x96\xf1\xe5\x4d\x80\xff\x06\x7d\xfc\xb7\xdf\xc6\x7f\x9d\x2e\xff\xee\x44\x81\x68\x7f\xb7\x2b\xf8\x37\xe5\xbf\xbf\x45\x41\x21\x99\x10\x14\x47\x45\xfb\x17\x50\xba\xe5\x28\xdd\x72\x94\x6e\x13\x50\x5a\x8d\x0d\x80\xc8\xfd\x57\x31\xc7\x66\xd4\xb3\x1d\x4a\xf2\x62\x78\x76\x54\x26\x35\x91\x21\x30\x6d\x8b\xc8\xa3\x90\xc5\x8c\x2e\xc0\xe0\x0d\xf3\x0a\x88\x05\x34\x05\x84\x4c\x1f\x18\x81\xb0\xba\x4a\xfe\xdb\xa7\x6d\xdb\x22\x96\x4f\xd5\x86\xbd\x48\x02\xb6\x97\xc3\x68\xa4\x14\xf8\xa2\x49\x7b\xd6\xb5\xed\xf9\x6c\xef\x45\xa3\x09\x34\x70\x43\x2e\x87\xf7\x3f\x3a\xff\xa2\xdd\x66\x70\xa1\x23\x7a\x99\x64\x40\x22\xf9\x36\xb3\x0f\x64\x85\x54\x2e\xa3\xd6\x25\x46\x5a\x06\xf5\x77\x17\xed\x2e\x42\x58\x8e\x0d\x4d\xa4\xa0\xc2\x04\x7f\xdc\xde\x92\xdc\x8d\x93\x8b\x50\x0f\xec\xeb\xb1\x00\xd3\xe6\x34\xcb\xc4\x51\x7c\xe2\x93\x09\x76\xdb\x44\xad\x57\x08\x33\xda\x95\x42\x86\x51\xd6\x34\x32\x2c\x62\x98\x3d\x95\x69\xf6\x94\x76\xd6\xe6\xc6\x55\xb7\x22\x56\x6f\xa3\x35\x42\x71\x3f\xa9\x89\xb5\x68\x99\x91\x09\x6e\x94\x04\x67\x6e\x0b\x60\x1d\x39\xb0\xce\x65\x18\xb0\x1f\xd0\x0c\xc6\x81\x36\xe9\x20\xc8\x30\x95\xdd\x1a\x1f\x4b\xc9\x3f\x51\xee\x60\xef\x74\x14\x92\x6c\xec\x0c\x0c\x56\x57\xc9\xc7\x1e\x75\xb5\x13\x16\xd3\x6f\x3f\x7e\x36\xa3\x2a\x8e\x28\xca\x6b\xd7\x23\x76\x9b\x5a\xc4\x6a\x7a\xc3\x70\xaa\x33\x11\x05\xe3\x48\x4b\x39\x35\xf0\xd1\xe5\xba\xe9\xd8\xee\x55\x00\x0e\xbe\x3d\xea\x0c\x30\x08\x05\x65\x8a\x9a\xed\xd8\xb8\x99\xe7\x67\x2f\xa0\x93\x93\xd0\xa7\x34\x86\x19\x13\x3c\xae\x17\x46\x3b\xd6\xb3\x9d\x76\xc4\x73\x4c\x56\x33\x61\xd4\x5d\x62\x39\xe0\x2a\x81\x7e\xee\x81\x38\x28\xe2\xce\xf7\x8a\xc8\x5f\xa4\xcb\x7c\x29\xb2\x26\x6b\x1c\x66\x6e\x78\xe2\x09\x3d\x23\xf9\xb3\xf9\x98\xe9\x43\x35\xab\x45\x2a\x49\x34\x67\x48\x36\x92\xfd\x4e\xd0\x9b\xa8\xc6\x18\x95\x69\x57\xb9\x22\xf1\x5c\x54\x6a\x6a\x71\x3d\x87\xdc\x15\x13\x1a\x4a\xc3\x49\xee\x99\x8a\xc8\xec\x05\xad\x6e\x92\xa6\xa4\xec\xd7\x79\x97\x81\xca\xdc\xb7\x67\x92\x75\x9e\x24\x7c\x72\x28\xec\x9c\x0a\x85\xad\x59\x1d\xe3\xae\xa2\x6d\x18\x54\xa0\x4d\x5c\xc4\x6c\x42\xcd\x4b\xad\x53\x39\xb9\x71\xcf\x15\x92\x62\x74\x4a\xeb\x3a\x34\x89\x50\x30\xc4\xee\x64\x1b\x0d\xf2\x92\xc3\xb8\x4a\xe0\x0f\x13\xae\xfa\x3e\x13\x35\xfe\x8c\xf9\xf9\x33\xe6\xe7\x4f\x43\xbe\xff\x47\x0d\xf9\xc4\xcc\xed\x59\x98\x6d\x99\xec\x10\xf1\x53\x37\xa3\xdd\xb7\xfd\x70\x4c\x76\x08\xff\xa5\x7f\xaa\xb7\x3d\xdf\xa5\x6d\xdc\x39\xb2\x12\xfa\x8b\x9f\x41\x43\xff\x0a\x41\x43\x81\x6c\xaf\xa8\x33\xa0\x7e\x5a\x2b\x9b\x4a\x3e\x9c\xd3\x9b\xd0\xf2\xa9\x95\x26\xcb\xb6\xd6\x63\x45\xb3\xf0\x11\x65\xfe\x6a\xc6\x7f\x52\x15\x10\x31\x0f\xd2\x23\xf9\xe8\xe6\x79\x7f\xc9\x60\x97\xab\xab\xe4\x0c\xb3\x74\x04\x44\x45\xd5\xe2\x2a\xb7\xee\xf2\x92\x2f\x94\x58\x61\xcd\x07\x06\xbd\x3c\xac\x56\x8b\x0e\xc2\x80\xd8\x61\x20\x93\x13\xca\x43\x1f\x0b\x14\x40\x56\x91\xd5\xfd\x6f\x40\xa9\xb2\x3f\xe4\xc9\x28\x4a\x3c\x41\x85\xed\xad\x02\xb3\xad\xb6\xbd\x56\xb0\xda\xf1\xfc\x7e\x50\xea\x85\x7d\xe7\x5f\xca\x9f\x79\x45\x85\xf8\x03\x70\x68\x9d\x80\x8e\x2c\xec\x59\xd8\x4a\xa8\xf8\x4c\xd2\x6a\x02\x23\x8e\xe1\x6d\x7f\x9b\xfd\xcc\xe5\x0a\xc4\xf3\x09\x06\x42\xd2\x3f\x7c\xa3\xbe\x57\x50\xec\x26\x44\x5a\x9e\xa7\xce\xff\xae\xee\x53\x44\xc6\x7e\xfd\x5e\xe3\xc9\x13\xed\xb5\x38\x97\x79\x14\x09\x1d\xcf\x41\x89\xb2\x7a\xde\x95\x32\x77\xa9\x58\x25\xfb\x7c\x30\x00\xff\x8e\x4d\x9d\x36\xdb\x92\xb4\x41\x9a\xe6\xad\xd2\x55\xc9\x2a\x91\x8e\x0d\x5e\xe0\x82\xbe\xa7\x34\x18\x78\x6e\x40\xe5\x40\xd2\x80\x55\x76\x18\xbb\x60\xb4\x35\x1a\x50\x37\xa4\x6d\xb6\x73\xbb\xa6\x1c\xaa\xe7\xb3\x91\x1a\x38\x56\x8b\xf6\x3c\xa7\x4d\x7d\x39\x5c\x48\x5f\xaf\xf9\x55\x7b\x3a\x3b\x3b\x4d\xa1\xf5\xa1\xe5\x04\x14\x63\x70\xb1\x7d\x18\x6f\x8c\x81\x17\xa9\xf4\xd9\x18\x00\x13\x25\xfc\x9d\xb3\x91\x82\xca\x96\x3b\x16\xc3\xe2\xf9\x62\xe4\xe0\x5c\x11\xe9\x54\x5a\xd2\xcc\x48\x60\x4d\xe1\x93\x5f\xc4\x03\x39\x3b\x4d\xbe\x3d\xab\x98\xb7\x67\x95\xac\xdb\xb3\xca\xa5\xf0\x5f\xd7\x53\xd4\x70\xb1\x92\x97\x4c\xc1\x04\x8c\x1a\x4d\xf9\x84\x3b\x8f\x1c\x9b\x7c\x0c\x9b\x27\x4f\x88\x51\x83\x4b\x9f\x3f\x8c\x8a\xfa\x4b\x5e\x3f\x99\x17\x2c\x97\x60\xa6\x22\x3b\x20\x16\x2e\x98\x6c\xd7\x1e\xb0\x45\x13\xa8\x7b\x14\xe6\x02\xd2\xf2\x7c\x1f\xd8\x01\x98\x9a\x87\x70\x73\x68\x87\x1f\xd1\xbe\x39\x3f\x4d\x19\xe6\x09\x03\x8b\x4d\x22\x65\x27\x0f\x25\x47\x8f\x07\xea\xe2\x28\x6a\xc3\xa7\x2f\xf8\x6a\x14\x15\xb5\x4b\x50\xa5\x2e\x9a\x04\x7a\x64\x87\xe7\x95\xc0\xf1\x4d\x5e\x3b\x1a\x87\xc3\x17\xc5\xe6\xca\x7f\x8b\xe7\x65\xe1\xd2\x0b\xd2\xb4\x44\xc3\xe9\xe2\x79\x39\x4f\x62\x55\x0a\x45\x68\x9b\x1c\x64\xec\xc8\x91\x17\xa4\x5c\x5a\xaf\x92\x1a\x29\x97\x36\xe2\x01\x7e\xb1\xb2\x96\x11\x8a\xef\x97\xf3\x39\x0e\x3f\xa7\xce\xd9\xda\x43\xdf\x4a\xab\x25\xbe\x95\x82\x9e\xe7\x87\xea\x78\x86\x5a\x01\x04\xe5\x8d\xd7\xc0\x2f\xec\x1f\x3c\x30\xb9\x2b\xe8\xf9\x73\x35\x62\xbc\xb2\xdb\x6d\xea\x4a\x92\xa8\x30\xc2\x29\xe5\xff\xb0\x41\xf5\x8c\x57\x98\x81\x50\xdc\x2b\x4d\x8e\x37\xb7\xbf\xd2\x62\x2b\xc3\xb9\xcc\xb1\xdd\xb7\x5b\x68\xe4\x21\x36\xc9\xb8\xf2\x88\xe8\x93\x32\x7e\x21\x04\x8e\x6c\x8e\xc5\x31\x54\x00\xb7\xa4\x96\x8b\xc5\xc5\x51\x4d\x56\xbc\xe6\x48\xc4\xe6\xa6\x15\x50\x56\x44\x7e\xd5\xe2\x2e\xfb\xd4\x81\x73\x22\xf9\xad\xe3\xb9\xe1\xa1\xd5\xb7\x1d\x49\x04\x95\xe9\xac\xa4\x3e\x8a\xe2\x9c\xe9\x4c\x72\x21\xa2\xe8\xa5\x4a\x6f\x42\x1d\xf4\x19\x3f\x98\x89\x00\x1e\xdc\x9c\x7b\xa7\xb4\x9f\xaf\x3c\xc3\x43\x16\x7e\x4e\xd3\xd1\xfd\x02\x05\x2d\x73\xb8\x10\x2c\x93\x27\xb9\x9a\x76\x1c\x85\x21\x9e\xcf\xbd\x81\x00\xcf\xd3\x92\x95\x86\xae\x1d\x92\xa7\xa4\xba\xa4\x1f\xd7\xf0\x06\x6c\xf7\xaa\x69\xf9\x1a\xec\x27\x35\xab\x13\x52\xdf\x80\xdc\xb4\x5a\x57\x5d\xdf\x1b\xba\xed\xbd\xa4\xde\x0e\x7c\xbb\x6f\xf9\xe3\x8b\x89\x2c\x93\xab\x6f\x96\xcb\x39\x52\x23\xb9\x7a\xb5\x5c\xce\x5d\xaa\xb3\x28\x23\x56\x35\x34\xe9\x85\xa1\xd7\x37\x5e\x31\xf9\xe9\x89\xf3\x40\x3c\xe7\x1d\x59\x63\x62\x01\x62\xa4\xe5\x5b\x41\x8f\xc9\xcf\xa3\x83\x4a\x85\x3c\xce\xe5\x1e\x27\x65\xce\x6a\x05\x81\xed\x7e\x0d\x56\xbf\x06\x81\xc8\x9b\x55\x5d\xaf\xca\x26\xc0\x3d\x13\x9c\xb8\x1f\x3f\xd6\x8e\xc6\x45\xa4\xed\xaa\x7a\x95\x1e\xb9\x1b\x78\x1f\xcb\x6b\xc8\xcb\xcc\xe3\x35\x92\x0b\x5a\x96\x43\xff\x97\xe7\xe9\x92\xb4\xef\x13\xc5\x8c\x84\x92\x33\x1d\x7b\xe7\x11\x36\x53\x0b\x9c\x93\x61\xa8\x8e\xfa\x0a\x3a\x09\x40\x83\x87\x53\xca\x40\x44\x3f\x67\xa3\x74\xae\x72\x44\x89\x05\xab\xe7\x5d\x53\x2e\xed\x4b\xf2\x4e\x42\xb2\xdc\xaf\x1d\xaf\xc5\xe6\x7c\x02\xeb\x25\xd0\xad\x52\xc8\x25\x71\x32\xf5\x7d\x6f\x41\x46\x06\x10\xa5\xfa\x7a\x39\x7b\xe0\x2a\x05\xe8\x26\x94\x86\xc5\xdb\x19\x59\xe3\x00\x14\x10\xdf\x01\x0d\xc4\x76\x89\x2f\xed\x0b\x22\xf3\x4d\x8b\x0a\x8f\x12\x21\x16\x15\x3e\x73\x25\x83\x79\x10\xc0\x94\xc2\x63\x6e\x54\xf2\x43\x8f\x04\x03\xda\x12\x49\x09\xd9\x73\xdf\x0a\x5b\x3d\x72\x6d\x07\x43\xcb\xc1\x8f\x3e\x0d\x30\xff\x20\xd1\x43\xc0\x27\x08\x8b\x15\x52\x21\xcb\x24\x37\xb8\x21\x65\x92\x23\xcb\x24\x9f\x50\x66\x99\x54\x0a\x58\x48\x62\xd6\x84\x1b\x01\x8d\xef\x9b\xde\xcd\x99\xfd\x0d\x5a\xc9\xf1\xb9\xb5\xd2\xf4\x54\x85\x6b\xea\x87\x76\xcb\x72\xea\x4c\x5a\xd7\x48\xae\x6f\xb7\xdb\x8e\x9a\x48\x6a\xb8\x04\x7b\x89\x2f\x2a\x9c\x3d\x41\x7d\x99\x86\xb0\x48\x9c\x59\x1d\xcb\xb7\x15\xa1\x4e\x69\x9f\x29\xc8\x90\xca\xae\x67\x77\x7b\x40\x37\x71\x76\x0c\x99\xe8\xcf\xad\xc1\x2b\xf1\x21\x91\x29\x30\x1b\x57\x49\x4b\x7c\x56\x8c\xad\x40\x4d\xc7\x6b\x5d\x49\xe4\x12\x62\xf5\x03\x3f\xd6\x44\xf2\x7b\x60\x82\x15\x6d\x15\xce\xd5\xf4\x35\xd9\xa8\xd2\xf7\xbe\x65\x94\x64\x7d\x3c\xb4\x7d\xda\xf1\x6e\x48\xe5\xf9\xb2\xaa\xb8\xd2\x0f\x26\x36\xc3\x93\xfa\x57\x2a\x46\x7b\xd3\xd5\x3b\x68\x77\xa9\xaa\x06\xf3\xd7\x98\x69\x1e\x06\x97\x44\xc5\xc3\x98\xee\x72\xbc\x04\xde\xb6\x0b\x79\x08\x89\x2f\xac\xff\x50\x2b\x00\x61\xa1\x9a\xe0\xa5\xcc\xe9\xec\xdd\x9c\x41\x26\x4b\x2d\xf7\x42\x44\xb4\x28\xa2\xa3\xa5\xed\x4a\x9b\xb6\x3c\x9c\x33\x06\x28\xc5\x2b\x4c\x5c\xf1\xb9\xc1\x03\x11\x8f\x07\x74\x07\x6b\xab\x6b\x22\x0c\xca\x6d\xb9\x2d\x9a\xd6\x36\xdb\x90\xf7\xbc\x11\xde\x86\xd9\x6d\x0e\x58\x53\x5b\xc1\xae\xd5\x58\xd2\x2f\xda\x56\x68\xad\x04\x3d\xdf\x76\xaf\x76\x60\xd3\x72\x49\x96\xc9\xaf\x9a\x12\x10\x59\xf2\x67\x60\x2a\x54\x0c\x8b\x66\xd5\x4c\xe6\xe2\x35\x92\x59\x6c\x5a\x26\xd3\x80\xe8\xac\x36\x35\xb3\x69\xf5\x35\x96\x53\x4c\x37\x75\xff\xb9\xa2\x5b\x4c\x82\x90\x49\x06\x51\x31\x83\x0e\x08\x67\x8a\xde\xe8\xb0\x62\xe4\x90\xd8\x4c\x0b\x26\x42\x94\xf8\x3a\xb3\x4f\xdd\x80\x2a\x7e\xe1\x5c\x9d\xa6\x21\xae\x72\x0d\xf1\xce\x08\x74\xd1\x56\xf5\x13\x55\x5d\x08\x45\x25\xca\x9a\xaa\x2b\xae\xe9\x32\x2e\xab\x5c\x1f\x8d\x45\xba\x49\x3b\x9e\x4f\x67\x59\xa5\x51\xb9\x46\x05\xf1\x8d\xed\xd2\xbf\x9b\x16\x59\x59\x50\x8b\x9c\xa8\x25\x2a\xfa\xad\xb4\x50\x73\xf8\x71\xca\xe2\x03\x6b\x8a\x35\xf8\x5c\x73\xbd\x30\xff\xab\x0c\x78\x35\x07\x0f\x01\xd7\xf2\x7d\x4b\x82\x9e\x9f\xa0\xa2\xca\xe9\x90\xd9\x58\x8d\xe4\x34\x45\x41\x1b\x4b\x55\xe4\xa8\x6f\x75\xd9\xa2\xc1\x66\x82\xe5\xaf\x74\x7d\xab\x6d\x53\x37\xcc\x87\x1e\x0e\x78\x11\x34\xae\x6c\x96\x67\x7a\x17\x59\x5b\xfb\x77\x51\xcf\xc7\x4a\xca\xff\x2e\x24\xb6\xf8\x4e\x71\x19\x1c\x1c\x85\xde\x20\xb1\xdc\x29\x1d\x50\x0b\xd2\xba\xc2\x8f\x95\x9b\xc4\x52\xb8\x81\xcd\x6d\x0c\x6e\x48\x65\x70\x93\xa8\x8a\xf7\x87\x4e\x68\x9b\x33\x3d\x5b\xdb\xac\x4e\xd4\x36\x57\x94\xb6\x19\x17\x73\x31\x49\x25\x4f\x31\x2a\x4a\xdd\xb0\x4f\xce\xc4\xfb\x18\x84\x33\xdb\xed\x3a\xd4\xc4\x58\xa5\x57\xa2\xfd\x78\x9b\x67\xa0\x0f\xa8\xd2\x86\x3e\xc0\xb8\x0b\xce\x64\x81\xc9\x8f\xfa\x03\x1f\x14\x0b\xb6\x21\x46\x3d\x42\xe7\x6f\x1d\xea\x71\x9c\x70\x3e\x37\xe5\x30\xf5\x5f\x23\x7f\x93\x12\xb9\x43\x47\x38\x0b\x7d\x4f\xd2\x45\x97\xc4\x48\x71\x9b\x85\x45\x93\x38\x9d\xf7\x30\xf5\x07\x9e\xda\xf4\xa8\x33\x08\xc0\x13\x0a\x2c\x6e\x3a\xb6\xe3\xc0\xf9\x45\x40\x3a\x56\xc0\x64\x09\xa1\x6c\x17\x62\x5b\x8e\x33\x66\x22\xb6\xef\x35\x6d\x87\x0a\x3b\xd2\xd2\x92\xcc\x4d\x00\x71\x25\x5b\x96\x4b\x9a\x94\xc9\xd2\x0e\xb8\x59\x15\x89\x1d\xe6\x02\xd2\xf7\x7c\x4a\x1c\xfb\x0a\xdc\xbe\xac\x61\xe8\xb1\x66\x78\xdd\x4f\xde\x10\xaa\x39\xd4\xf2\x5d\x2c\x89\x96\x4d\x76\xc8\x76\x64\x60\xbf\x6e\xb1\x0d\x87\xc3\x3d\xc3\x84\x68\x6f\xd3\x6b\xea\xb0\x5e\x04\xa5\xae\xe7\x75\x1d\xf4\xcd\x1a\xd1\xe6\x2a\xda\xf0\x06\xab\xd5\x72\x65\x63\xb5\xfc\x6c\x15\x42\x31\x78\xc3\x70\x05\xbb\xb4\x32\xb2\xc3\xde\x8a\x40\x63\x49\x98\x7f\xb2\x17\x7b\x5e\x7f\xe0\xd0\x8c\x8c\x2c\x49\x79\x30\x22\x39\x60\x50\x11\x16\xe9\x54\xf8\x82\x9a\xe9\x34\x27\x5a\x3f\x04\x5d\x62\xfa\x64\x30\x3f\x36\x33\x13\x1b\xe4\xbd\xb3\x33\xac\x8b\xc3\xcd\xed\xc2\x46\x3e\x9b\x48\x7e\x3c\x37\xca\x7c\xc9\x9b\xce\x63\x67\x8d\x18\x34\x94\x71\x29\xeb\xaf\xbc\xe4\x10\x77\x53\x31\x3b\x3a\x2d\x4b\x92\x76\xae\xbf\x40\xc6\x0e\x8e\x66\x1a\x00\xbc\x30\x89\x66\xec\xc8\xe4\x8b\x87\x48\x1d\xa5\xb5\xc0\xc8\x83\xd6\xdd\xae\x52\xe1\x62\x6d\x7d\x50\xca\xdd\xd4\x6d\x1e\xb8\x6d\xf2\x05\xae\x40\xe4\xc5\xc0\x17\xd8\xc5\xc3\x4c\x4d\x18\x02\xea\xb6\x65\xc9\x7f\x50\xaa\xa0\x74\xda\xdb\x6e\xdb\x6e\x59\x21\xd0\x1e\x0f\xa7\x50\xe6\xda\x01\x71\x3d\xbf\x8f\x92\xb4\x19\x5a\x70\xe8\x74\x6d\x5b\x84\xc7\x97\x23\x1d\xdf\xeb\x2f\x09\xf7\x55\x19\x85\x55\x11\x12\xcf\xca\xee\x81\x3b\x42\xeb\x8a\x92\x21\x9a\x7a\xb2\xe5\x47\xb9\xd8\xc2\x3d\xb2\xe7\x02\x72\xbe\x6a\x5a\x5b\xa3\x66\x4b\x55\xd5\x16\x32\x22\x3d\x7f\x52\x3a\xc3\xa7\x09\x07\x65\x2f\x0b\xa2\xb5\xc3\x9d\x77\xb1\x83\xae\xd7\x16\xe9\xae\x0e\x6c\xd8\x29\xc8\x94\x57\xc2\xf5\x98\xec\x9f\x1c\x0b\x44\xe0\x02\x36\xca\xb6\x78\x89\x67\xb9\x12\xeb\xa6\x8c\x09\x10\xc9\xb8\xb4\xa7\x42\x88\x2e\x2c\x5c\x66\x9b\x1a\x11\x33\x88\x39\xe7\x88\x09\xe5\x7e\x26\x8b\x01\xb3\x10\x95\x8a\xff\x6f\xa4\xd8\xd2\xa6\x60\x9b\xed\xe7\xbf\x14\x71\xe6\x59\xed\xaf\xc3\x20\x94\x47\xa8\xe2\xe4\xf7\x9e\x24\x84\x38\x60\xcd\x62\xc5\xfc\x45\x0e\x30\x82\x00\xd7\x4c\x3b\xcd\x58\xb6\x2c\x12\x0a\x9b\x22\x31\x5d\xc4\xfa\x85\x86\xde\xfa\xfa\xa5\xed\x1f\xa6\x96\x11\x60\xfc\x6b\x85\xa1\x6f\x37\x87\x21\x9d\x28\x2b\x66\x4e\x51\x16\x4d\xde\xe5\x53\xab\x7d\xe2\x3a\xe3\x19\x50\x8c\x82\xf0\xdc\x5d\x67\x98\x2e\x86\xe3\x3c\x90\x96\x26\x0d\x6d\x15\xee\x3d\x4d\xda\x9c\x69\xce\xce\x4f\xf6\x4f\xf4\xfa\x0e\xb5\xd2\x19\x69\x62\x75\x30\x0c\x59\x20\xc9\x9a\xe7\x66\xeb\xc2\xd3\x40\x78\x4d\xc7\xfb\xde\x68\x96\x4e\x24\xc2\xf8\x30\x98\x85\x0c\x4c\x01\xef\x79\x7e\x48\x7a\xb6\x2b\xef\xc8\xf1\x6e\x49\x2d\x51\x78\x18\x21\x43\x50\x10\x48\x4d\xcc\xa4\x12\x1a\x24\xc9\xf6\xb5\xc3\xc3\x99\xb8\xfe\x2d\xb7\xdf\xe9\x10\xdf\x1b\x05\xb1\x54\x91\x72\xa2\x72\xe7\x72\xc6\x83\x6c\xaf\xcd\x63\xca\xa8\xf6\x59\xed\x1f\xad\x34\x1f\x5b\x37\x76\x7f\xd8\x97\x36\x48\xf7\xd1\x87\x63\x6b\x91\x6c\x7d\x73\x75\x03\xad\x6a\x67\xd2\x93\x4d\x63\x9b\x7f\x90\xa6\x0c\xaa\x05\x17\x55\x38\x01\x84\x60\x27\x47\x21\x9b\x2e\x3c\x30\x0b\xf0\xbf\xdd\x26\xaf\xce\x8f\xdf\x6c\xf0\x92\x0c\xa6\x22\x51\x38\x39\xaf\x5a\x82\x0e\xaa\x6f\x21\xe5\x75\x55\x87\xeb\x7d\xd2\x9e\x72\xe6\x74\x8a\xf7\xc4\x39\xa9\x9f\x2d\xdf\xb7\xc6\x27\x9d\xfc\x43\x33\x6e\xe1\xb2\x20\xcf\x95\x8e\x78\xe8\xf0\x49\x11\x1c\xd2\xa2\x37\x40\xfd\xb4\xe8\x0d\x12\x28\x94\xca\x1b\xd1\x2f\x54\xd4\x86\xcc\x88\x0d\xd3\x44\x6b\x00\xe8\x32\x67\xd8\x43\x46\x6a\x98\x1c\xa5\xc1\xf4\x4c\xba\xef\xe8\x0c\xd0\xd3\x59\xa2\x33\x20\x69\xee\x2b\x3a\x83\xbc\x2b\x52\x99\x86\x32\x93\x76\xa1\x4b\x1b\x2c\xec\x59\xe9\xb7\x62\xa9\xb2\x64\x3b\x60\x4f\xac\x7c\x68\xe3\xa9\xb1\x00\xb6\xee\xec\x97\xf0\x99\x37\x17\x89\x51\x6f\xe2\xc8\x34\xbc\xf9\x50\x04\x52\x64\xe2\xc8\x60\xa7\xa3\xc8\xbe\x4e\x83\xe1\xe4\x2c\x66\x29\x69\xc9\xf2\x85\x78\xe3\x70\x3e\x8a\xb6\xbc\xda\xe8\xc5\x23\x53\xac\xae\x92\x77\xd4\xef\x78\x7e\x5f\xe8\x33\x6c\x37\xf0\x01\x4e\x5b\x53\xfb\x1b\x4f\x57\x96\x9e\xac\x2c\xbb\xcf\xa7\xb4\x13\x97\x4f\x66\x26\x84\x08\xf3\x69\x09\x10\xa2\x88\x25\x25\x41\x48\xfa\x6e\x26\x42\xb8\x23\x94\x8d\x6f\x22\x30\x3c\x6c\x7f\xf2\x24\x0e\x06\xbe\x94\xfc\x09\x8d\xc9\x52\x91\x26\x15\x29\x16\x8c\x32\x02\xe3\x98\x11\x5d\x84\x0b\x6f\x1e\x5d\x64\x42\x7e\xb6\x99\xb2\xb3\xc9\x80\x19\xe9\x9c\x18\x65\x44\x45\x9d\x28\x25\x96\x34\xcf\xf8\xec\xf0\x27\xb3\x84\x3e\x49\x4e\xf1\x36\x05\x8e\xd1\xb9\x32\x09\x47\x46\x9f\x53\xda\xa2\xf6\x35\xe5\x49\xa7\x26\xd3\x53\x2f\x9f\x77\xe9\x0d\xf2\x4a\x41\xb7\xd3\x65\x9a\x4e\x93\x89\xad\x91\xe7\xe6\x42\xd8\x6b\xaa\xad\xa6\x4c\xf1\x24\x53\x73\x33\x5d\xd9\x73\x21\xc9\x3b\xde\x4f\x18\x56\xba\xab\xab\xe4\x23\x25\x2e\xc5\xb3\x99\xa6\xe7\x5d\x91\x2b\x4a\xf9\x79\x21\xaf\x80\xa0\xfa\x96\x3b\xb4\x1c\x47\xba\x62\x2b\x32\x9a\xb9\xcf\xd8\xbc\x90\x88\xcb\xb7\x31\xe2\x26\xc6\x55\x48\x58\x67\x88\x11\x4c\x61\x3a\xa2\xa3\x9c\x9a\x86\xdc\x58\x32\x89\xd0\xc9\x8c\xac\x0a\x66\x71\x8b\x2a\xa5\xa4\xc9\xea\x2a\x0a\x94\x01\x8a\x55\xb5\x51\x14\x72\x51\x13\xbd\xbb\xe9\xc3\xb0\x38\xf5\x17\x48\x5c\x16\x4f\x49\xc6\x9a\x8b\xa4\x12\x8b\xaf\x7b\xd1\x0c\x2a\x62\xf1\x4b\xcf\x52\x28\xe3\x92\xbd\xf2\x9c\x76\xa0\x6d\x27\x7c\xda\xa1\x3e\x75\x5b\x40\xad\x08\x0b\xe8\x03\x95\x2b\x2e\x49\x18\x75\x5d\xf7\x9f\xc1\x97\x8a\xa8\xd8\x05\xf7\xec\x53\x25\x40\xde\xa3\x1f\x55\x12\xa7\x9b\xe2\xcd\x48\x9f\x2b\x62\x63\xdc\x47\xec\x3b\x23\x05\x27\x36\xc1\xb5\x60\xe9\x8c\xa3\x25\x04\x94\x8e\xfc\xf1\x29\x2c\x27\x50\xda\xcc\x55\x33\x4c\xba\xb0\xcc\xc9\xd1\xda\x2c\xd2\x7d\x9b\x74\xae\x9d\x92\xd9\xa1\xf2\x04\x6e\xc7\x06\x12\xd8\x3d\x16\x60\x2a\x11\x5e\xfc\x7b\x32\x2c\xa4\x7a\x4c\x97\x9b\xb2\x23\x70\x0e\xa8\x37\x9c\x5c\x22\x1f\x91\xc5\x09\x5d\x88\x41\x8a\x7f\x8d\x42\x49\x60\x07\x23\x00\xce\xc4\xe0\x37\xd1\xac\xa4\xfa\x43\xd5\xcc\x13\x9d\x1d\x1e\x47\xb7\x0d\x50\xb1\x6c\xf4\xb7\xd1\xd2\x62\x9b\xa3\x15\x85\x57\x7a\xb9\x69\x12\x96\xce\x92\xae\xd4\x70\x62\x53\xe9\x47\xb5\xb7\x46\xe9\xa9\x93\x95\x46\x6f\x8b\x63\xa5\xe5\x17\xc3\xf2\x4c\xbb\xf7\x55\x35\xf4\xb7\x46\x69\xdf\xf7\x7c\x13\x15\x78\xa5\x97\x91\xb7\x90\xaa\x8c\x7c\x65\xa4\xb2\x6b\x6b\xe1\x8b\x8c\x9e\x98\x77\x76\x91\x54\xa9\x2a\xc6\x88\x56\x03\x0b\xfc\x9a\x9d\x89\x55\xb0\x6d\x7a\x61\xe3\x5d\x44\x72\x7e\xbf\x23\xb5\x78\xb1\x6d\x8d\x3b\xd5\xdb\x3d\x2d\x33\x66\xac\x4a\x32\x57\xa8\xef\x9c\xbc\x33\x45\x59\xfa\x55\x4f\x4b\x77\xa1\x25\x57\xbd\x2c\xc4\x1a\x99\x98\x7d\x16\xef\xa7\xcc\x51\xc6\x77\x46\x29\x79\xb6\xab\x0a\x89\x57\x7a\x39\x54\x18\xf4\x3c\xb5\xec\xd9\x2c\x11\x99\x86\xfc\x85\x59\x66\x9a\x7c\xb7\x5c\x42\x19\x85\xd8\x0b\xb3\x8c\x88\xb6\xd0\x30\xe4\xb2\x59\x86\x5f\x4b\xe8\xa5\xf8\xab\x58\xb9\x0f\x83\x48\xa9\x0f\x03\xbd\x8c\xe9\x4d\xc9\xcb\x25\x78\x24\x90\x89\x59\x7f\xc5\xb5\x98\x2a\x21\xde\x18\xa5\xbc\x91\x46\x4a\xf6\x14\xfd\x7a\x6c\xdd\x98\x05\x8e\x2d\x23\xfd\xa1\x79\xc4\xad\x8a\x9a\xef\xf5\x1a\x21\xf7\xf1\xe7\x01\xc6\x22\xc9\x23\x27\xe5\x16\x9e\x3b\xae\x98\x2e\xd9\x73\x45\x92\x93\xe2\x3b\x2b\xd7\xb0\x2e\x68\xa3\xc9\x86\xa3\x82\x92\xbd\xd3\x45\x21\x3c\x33\x79\xc7\x7e\x48\xa1\x06\x09\x89\xdb\x32\x2d\xb1\x14\x50\xd9\x69\x8b\x71\x46\xc1\x2f\x31\x6d\x30\x8b\x31\x9b\x1e\xf8\x4b\xf6\x45\x4f\x6d\xcc\x59\x1a\x7f\x72\x95\x8b\xfd\xe4\xec\x29\x1f\x3e\x0c\xd8\x4f\xdd\xce\x5d\xcb\x95\x2c\x18\x07\x7e\x7b\xa3\x40\xfc\x7b\x6c\x41\xca\x64\x73\xa4\x21\x64\xdb\x78\x40\x93\x92\x29\xcf\xbd\x23\xc9\x4c\xa4\xac\x8a\xa0\x23\xd8\x8e\x5a\x78\x8c\x86\x81\x84\x64\x47\x93\x58\xdb\xe9\x9a\x53\x54\x41\x9c\x29\x01\xf3\x2c\xe9\x97\xef\x12\xf3\xfb\xf2\x9e\x64\x35\x22\x3a\x1b\x69\x01\x5e\x4f\x02\x2f\x68\x91\x05\x5f\xd1\xcb\x6c\x00\xdf\x27\xed\xe8\x34\x62\xcf\x93\xed\xf9\x7e\xb2\x39\x27\xe6\x61\x9e\x03\x0e\x6a\x2a\x48\xe5\xf9\x20\x28\x3d\x46\x69\x39\x73\x42\xc2\x83\x81\xa2\x1e\xac\x90\xbf\x9b\x17\xa0\x1c\xcf\x62\x64\x7c\xe7\x03\x88\xde\xcb\x45\xf2\x28\x2a\x14\xe7\x03\xa7\x74\x03\xa5\x39\xcc\x07\x49\x1a\x4a\x26\xe3\xa6\x27\xe8\x8e\xa4\x17\x2f\x18\xd2\x07\x85\xf5\x4c\x5c\x8d\x99\x86\x0d\xb6\xae\xce\xca\xd7\xd5\xa2\x99\xb8\x78\x7f\x21\xee\x8e\x42\x53\xd6\xf6\x45\xf2\x68\x2e\x42\xc7\x20\x82\x55\x7d\x91\x28\x9f\x73\xb4\xb3\xcf\x2d\x02\xf4\x78\x41\x6e\x88\x11\x91\xba\x01\x83\xa5\x09\x41\x34\x9f\x32\x19\xa2\x5a\x28\x26\x69\xe9\x26\x5f\xc8\xcb\xe7\xa8\x9c\x4c\xd8\x7a\xab\xb2\x3b\x3b\x2a\x67\x8e\x80\x74\x14\xdd\xc7\xf0\x7c\xdc\xc9\x9b\x86\x8c\x70\xa7\x46\xde\x69\x4c\x94\xff\x5d\x3b\x3a\xe8\x44\xa2\x51\xe2\x05\x8c\x10\xe2\x05\x63\x4d\x34\x55\x14\x7d\x7d\x88\x61\x6b\x16\x8d\x9c\x25\x02\xaa\x7a\xe4\xab\x92\x1d\x1c\x0f\x6d\x05\x39\x6f\xc2\x63\xfa\xda\x19\x75\x68\x2b\x84\xf7\xb9\xcb\x42\x24\x5a\xf7\x34\x74\xd0\xca\x13\x12\x00\xb4\xd3\xec\xde\x93\xa9\xb2\x76\xbb\x43\x47\x0f\x35\x7d\x97\x74\xba\xa9\xee\x94\x14\xc7\x46\x34\x0a\x50\xbd\x9f\x3c\x21\x8f\xb8\x2a\x65\xf6\x30\xce\x0d\xc2\x6c\x2f\xa7\x35\x87\xcd\x2c\x46\x19\x69\x4d\x93\xa0\xdc\x13\x69\x2c\xf8\xd0\x94\x4b\xe8\xb1\x8a\x68\x26\x50\xcf\x50\x3a\x66\x0b\xed\x9a\x6b\xdb\xd7\x9a\x4f\x55\x1a\x9d\xa4\x61\x60\xe4\x1e\xb9\xa8\x8c\xd9\xa2\xb7\xe0\xc5\x58\xce\x79\x58\x2f\x12\xd2\xf3\xa7\x6d\x90\xb2\xbb\x10\x9d\x27\x53\x0c\xb1\xe9\x04\x33\xf1\x80\xab\x46\xd2\x0f\xb6\xb0\x5b\xe6\x5a\x98\xb4\xf1\x36\xe8\x92\xb4\xf3\xe6\x46\x78\x09\x3b\x60\xcd\xc8\x2f\x71\x17\x9d\x9d\xac\x5f\x88\xd8\x9a\x12\xcc\x2f\xf0\xac\x5d\x4b\x37\x11\xdb\x6e\xf2\xdc\xfd\xe6\x79\x53\x8d\x98\xe7\x4c\x68\xa8\x1a\xdd\x66\x9b\xce\x28\x69\xe7\x72\x86\xd5\x5f\xca\x76\x1e\x0d\xa1\xa2\xdb\x61\x65\xdd\x9a\xb6\x7d\xc7\x89\xab\x66\x86\x3e\x0b\x0b\x1a\xbf\xe9\x5b\x53\xfe\x52\x3f\xa2\xc7\x5d\x1a\x9f\x46\xc0\x65\xdb\x4b\x13\x42\x05\xa3\xad\x4a\x7f\x68\x73\x95\x28\x77\xc4\x17\x2c\xfc\x90\x90\xda\x3f\xee\xa3\x22\xd3\xf6\x6b\xee\x08\xf2\x9d\x66\x7e\x2c\xdf\x21\x99\x40\x1a\xe6\x30\x1b\x10\xb6\x96\x90\xd0\x7f\x86\x74\xfe\xc9\x81\x83\x67\x4b\xea\x8f\xbd\x27\x77\xc2\x26\x67\x3b\x16\x29\xf8\xd9\xbd\x46\x0a\x5e\x5d\x25\x47\xc7\xef\x4e\x4e\xcf\xeb\x6f\xcf\x71\xc2\x91\xfe\x30\x08\x49\x93\x12\xbb\x4d\x5d\x34\x46\x0f\x3d\x82\x9e\xfb\xa5\xaf\x01\xc1\x13\xc5\x25\xb8\x5a\x46\xd3\xf4\x1e\xf5\x29\x69\xd2\x96\xc5\x60\xb7\xbd\x56\x97\xba\xa4\x65\xb9\xb9\x90\x8c\x69\x48\xec\x3e\x43\x09\x95\x39\x98\x3b\xe8\x66\x4c\xac\x96\xef\x05\x01\xe9\xd8\x0e\x0d\x4a\x7f\x93\xe4\x9c\x53\xe7\x8b\x66\xc4\x4a\x74\xb2\x8c\x9a\x12\xcf\xe7\x09\xf7\x4a\x44\xa0\x88\x66\x93\xcc\x07\x05\x65\xa6\xe8\x65\x19\xb4\x6b\x66\x82\xff\xa8\xe4\x6b\x13\xcd\x26\xff\x51\xbd\x8d\x79\xd1\x1c\x75\x60\xa5\x12\x39\x3b\x03\x9c\xd2\x10\x2c\xde\x72\xdb\x64\x38\x90\x8e\x1a\x3d\x9c\xd1\x92\x5b\x6e\x82\x0c\x8b\xf6\x44\x27\xb2\x39\x1b\x0a\xfa\x3f\xa8\xa1\x7e\xfb\x07\x35\xe4\x74\x7f\x50\x43\x37\xce\x7d\x36\xd4\xf6\x46\x6e\x06\x3b\x64\x3a\x49\xdc\x6f\x63\x41\xff\x07\x36\xd6\x6f\xff\xc0\xc6\x9c\xee\x0f\x6c\xec\xc6\x99\xd8\x98\x48\x68\xac\x6b\x14\x9b\x7f\xad\xdc\x03\x18\x89\xfa\x8d\x1d\xa4\xad\xef\x1b\xcf\x21\x60\xf5\x84\x86\xc4\xb5\x0b\x8f\x97\x42\xdd\x61\x9f\xfa\x4c\x71\xc4\xa6\x98\x1a\x08\x99\x36\xa4\x95\x40\x97\x2a\xbb\x3f\xb1\x13\x4c\x09\x81\xcd\x90\x2b\xe8\x1b\xca\xbb\x08\xe6\x47\x21\xed\xa7\x85\x18\x7f\xbe\x35\x0d\xf6\x02\xca\x43\xa1\xcf\x60\x4f\xec\x42\xfd\xda\x0a\x2d\x3f\x75\x18\x36\x66\xe9\x08\xc2\x7a\xc8\xee\x60\x0b\x13\x3b\x75\x4e\x6f\xd2\x39\xeb\xd9\x2c\x5d\x62\x90\x1e\xb2\x43\x0c\xfe\xc4\xee\x1c\xb5\x3c\x37\xb5\x3b\x9b\xb3\x74\x87\x41\x7a\xc8\xee\x30\xf8\x13\xbb\x73\x46\x5b\x9e\xdb\xb6\xfc\x71\x1d\xdb\x49\xeb\xd9\x4c\x93\x28\x02\xf4\x21\x3b\x19\x69\x2a\xb3\xbf\x67\xc3\x66\x8f\x5a\xfc\x9a\x3e\xb1\x97\xcf\xa7\xed\xa5\x04\xf5\x50\x7d\x93\x0d\x24\xf5\xe8\xc1\xd3\x00\x44\x56\xac\xad\xbf\xe2\x8a\x75\xee\x79\x4e\x33\x55\x5a\x3e\x5b\x9f\x6a\x2c\x1f\x70\xd1\xe2\xf8\xfd\x15\xc6\xef\xf9\x14\xe3\x07\x43\xb5\xba\x9a\x14\xb1\xed\x9b\xe3\xd9\xbe\xd7\xba\x5a\x6d\x79\x3e\x5d\xf9\x2a\xc3\xb6\x6d\x3d\xfb\x17\xfc\x6a\x79\xfd\x3e\x75\xc3\x95\x4a\x65\x63\x73\xe3\x79\xb9\xba\x05\x03\xd4\x75\xbc\x26\x64\x42\xc6\x86\x4a\xbc\x1d\xb2\x23\x3c\x2a\x31\xe5\x16\x79\x64\xdc\x67\xb3\x9e\xf2\x4c\xa7\xc7\x16\xa4\x03\x20\xec\xdf\x25\x42\x5e\x88\x0a\xd2\x25\x33\xa0\x4e\x27\xa1\x3a\x7b\x6d\x54\x26\x2f\xe0\xdd\x12\xd8\xf5\xd2\xc0\xb1\xdd\x70\x85\x9f\x6a\xad\xb8\xf4\x26\x5c\x01\x23\x27\xd7\x5b\x71\xe9\x68\x85\xd1\x67\x89\x90\x1a\x39\x14\x84\xca\xf1\x71\x60\x9a\x61\xae\x90\x2f\x6c\x2f\x69\xb7\xf2\x8d\x46\x97\x35\x93\x43\xd3\xdf\x5c\x01\x5f\xf0\xce\x6f\x27\x34\x28\xda\x02\x9c\x97\xa2\x43\xf5\xbc\x3c\xed\x50\xc1\x8d\xbd\xe7\xd3\x24\x02\x7f\x27\xd7\xd4\x0f\x30\x68\x59\xb5\xb4\x51\xaa\xe4\xc8\x5d\x04\x6b\x1a\xc5\x9a\x01\x62\xf0\xe6\xc0\xb9\x32\x2d\xce\x31\x44\x95\xff\x90\x1d\x1a\x51\xef\x39\x9e\x36\x3f\x06\xc0\x13\xbf\x1c\x79\xc1\xde\xc8\xa4\x12\xb5\x68\x31\x79\x5a\x80\x11\xba\xa2\x78\x56\x17\x12\x63\x70\x02\x67\xb9\x57\xb9\x80\x1c\x1d\x6c\x81\x47\x23\xdb\x2a\x74\x86\xae\x3b\x26\xa6\x80\x89\x77\xf4\x51\x62\x12\x93\xb5\xb5\x78\x3a\x64\x4e\x80\x64\xc1\xf5\xfd\xae\x48\x72\x16\x93\x56\x11\xb9\x94\xd7\xe4\xc5\xe6\x36\xb9\x23\x77\x85\x92\xc5\xe6\xc6\xe6\x36\x8a\x9c\x28\x2d\xd6\x66\x10\x09\xd5\x72\xa9\xca\xfe\xdb\x82\xd9\x54\x0a\xec\xae\x9b\xbf\x29\xc4\x3b\x29\xbf\x92\xdb\x5b\x2d\x05\x01\x16\xc7\x73\xb9\xec\xf9\xc7\x66\x29\x98\xe2\x5b\x70\x64\x27\x12\xc9\xdd\x90\x1d\xb2\x7c\x53\x60\x1c\x5b\x66\xa0\x6f\x58\xc7\x6e\xc8\x0b\x72\x43\x6a\xe4\x86\xfc\x87\x94\xc9\x0b\xb2\x52\x21\x35\x52\x49\x1e\xf8\xf5\xd9\x3b\x5b\x59\xc7\xee\xd0\x9b\x41\xbf\xc2\x7a\xcb\xe6\xdb\xaf\xf0\x24\x7a\x0a\x0f\xdb\x71\x32\xe4\x1f\x61\x39\xec\xef\x89\xd3\x26\x87\x87\xa4\x39\xec\x2e\x11\x86\x3c\x7e\xcb\x57\xca\x05\xf2\x1b\xa9\x56\xcb\xd5\x8d\xd2\xfa\xb3\x8d\xcd\xe7\xeb\x5b\xe5\x67\x9b\x95\xe7\x91\x22\xff\x89\x17\x79\xb6\x51\x79\xb6\x85\xb0\xcf\x3d\x9f\xec\xf2\x6c\x93\xd1\x06\x56\xaa\x74\xa5\xb2\x59\x60\xa4\xc2\x9f\x4b\x05\xf2\x42\x8d\x8a\xe8\x97\xce\x73\x26\xa1\x05\x79\x7f\x23\x2b\x15\xba\xf2\x8c\x49\x56\x46\x6b\xf8\xcd\xbe\x2d\x93\x1b\xf2\x94\xdc\x90\x55\x52\x25\x35\x49\x11\x06\x72\x05\xc6\x81\xd4\x38\x2a\x09\x03\xb2\x58\xfa\x3d\x3c\x1a\x0e\xe8\x4b\x1a\x9e\x5b\xdd\x34\x65\x6e\x8d\xdf\xa3\xf0\x7c\x33\x69\x89\x84\xb6\x64\x31\x9c\x72\x6f\xec\xab\xb4\xa4\x43\xeb\xeb\xfc\x7e\x80\x7c\xc1\xb2\xff\x0a\xbd\x33\x38\x2e\xfe\xc2\xa3\x83\x2b\x17\x98\xa0\xc4\xba\x88\x59\x3a\x58\x09\x44\x34\x77\x81\x92\x8c\x60\xb5\xcb\x1c\xc2\x5b\x22\x4f\x09\x38\x51\x43\xa6\x9a\x2f\xa0\xef\x40\xba\x7f\x38\xae\xb6\x3b\x36\x6d\xa3\xef\xcb\x17\xd1\xdc\xc0\xb7\xfb\x36\x84\xc9\xf1\x7c\x82\x30\x4b\x4b\x04\x00\xfd\x37\x08\xad\xd0\x6e\xe1\x4f\xdb\x6d\x51\x52\x2e\x55\x4a\x65\x78\xee\x53\x26\xef\x4f\x3a\xa4\x01\x8f\x2d\x2b\xa4\x5d\xcf\x1f\x93\x37\x96\xdb\x5d\xd2\xe2\x9d\x3c\xbd\xe3\x36\x9d\xe7\x32\x40\x4a\xe8\xa1\x8b\x47\x09\xca\xc5\x9d\x63\x4e\xf9\x1b\x8c\x59\x13\xe9\x87\x08\xfd\x54\xc4\xcb\xef\x2f\x70\x33\xf4\x05\x41\xd1\x1b\xab\x3f\x70\x28\xc7\xbe\x51\xb2\x03\xec\x64\x3e\x67\x35\x5b\x90\x5a\xf2\x29\xe3\xf5\x9d\xdf\x50\x01\x8c\x15\xab\xe8\x45\xb8\x6b\xda\xd3\x55\x3d\xbf\x0a\x2f\x18\xcf\x5d\xc4\x97\x0f\x6e\xbe\xba\x43\x72\x88\x65\x8e\xdc\xde\x02\x4f\xe4\x1f\xc5\x93\x15\xe9\x7c\xa2\xbd\x56\xfc\x28\x5e\xee\xec\xa8\xa1\xc7\x1c\x36\x31\x49\x21\x50\x4b\x98\x21\x8b\x5d\x3b\xcd\x3a\x43\x1e\x88\xf5\x51\xbd\x88\xb0\x3e\x46\x45\x99\x9d\xf5\xb1\x5e\x26\xeb\x3f\x7d\xfa\xd6\x0b\x69\xed\xe9\x53\x72\xee\x11\x7a\xd3\x72\x86\x6d\x4a\xbe\x1c\xb9\x70\x0b\x36\xfe\x52\x24\x5f\x56\xb4\x07\xcb\x6d\x93\x2f\x6f\xad\xb7\x5f\x8a\x64\xd4\xb3\x5b\x3d\x02\xab\xce\xd3\x48\xcb\xd8\x87\xa0\xa8\x92\xe0\x32\xde\x3b\x64\x40\xe8\x17\xd2\xa7\x61\xcf\x6b\x27\x4d\xbd\xc8\x54\x8b\xce\xc4\x1f\x38\xf5\x44\x7c\x8b\x69\xa6\x1e\x12\x39\xbf\x96\x31\xed\x78\x11\xfc\xa7\x74\x7c\xf4\xb6\xf1\x47\xfd\xcd\x87\x83\xc9\x35\x04\xe9\x27\x97\xcc\xad\xe5\x26\x4e\x6a\x5e\x74\x8a\x49\xcd\x95\x5c\x39\xa9\x67\x99\xc1\x92\x83\x53\x67\x30\xe2\x91\x30\x83\x33\x8f\x79\xd5\x1c\xe3\xb0\x1a\x8d\x69\x37\xd0\xab\x4f\x49\xcf\xf2\xfb\x9e\x3b\x16\x77\xbd\x4f\x57\xd1\x77\xaa\xc1\xd3\xe4\x36\xf0\x8a\xf9\x60\xbf\x71\x7c\xb2\xff\xe1\xcd\x41\xa3\xdc\x70\xbc\xb6\x15\xf4\x1a\x76\x20\x76\x35\x8d\x46\xda\x82\xf8\xac\x70\x7f\x6d\x34\xd4\xbd\x7c\x42\x5b\x25\x37\x3f\x23\xbc\xf9\x50\xab\xa0\x45\x44\x7a\x97\x17\x04\xbb\x40\x2f\x25\x8c\xf9\x50\xa8\xc2\x2d\x65\x23\x84\x0b\xcb\xb4\xee\x95\xef\x03\xf6\x02\x7d\x34\x01\xcd\x87\xcc\x5a\xa3\x31\x0c\x6d\xa7\xf1\x6e\xe8\xd3\x53\x70\x2f\x4c\x1f\xcd\x8d\xf9\x9a\x58\x6f\x34\xf8\xf9\xcb\x1b\xda\xa5\x6e\x7b\x0f\x03\xd1\xa7\xb6\xb3\x59\x99\x93\x6f\x36\x78\x5f\xf6\xad\xd0\xfa\x10\xda\x4e\xfa\xc8\x55\x36\xe7\x6b\xe1\x19\x6f\x01\x6e\xb4\x27\x34\xb1\x06\xbb\x43\x3d\x75\x34\xd9\x11\xbb\x4f\xb6\x0e\x46\x76\x73\x79\xcc\x98\xce\xb6\x9b\x32\xa6\x8f\x4d\x76\x48\x65\x9b\xd8\xe4\x3f\x31\x97\xe5\x6d\x62\x43\xa4\x1e\x40\x98\x47\xcb\xd3\x63\xf4\xd8\x97\xdb\x0a\xce\x15\x1d\x13\xdb\xe5\xc5\x58\x25\xbb\x43\xf2\x1c\x95\x81\x08\xa4\x53\xea\x59\xc1\xc9\xc8\x15\x5b\x62\x4c\x00\x8e\x55\x8a\x0c\x42\xa1\x20\xd3\xba\x5f\xf0\x90\x40\xf8\x15\x9e\x60\x6b\x4c\xee\xe4\x5a\x01\xe5\xb6\xc9\x5d\x42\xea\x63\xe3\x78\x02\xfa\x2b\x9e\x8c\x4d\xb9\x4d\x03\x4e\x13\x91\xe7\x3d\x4a\x9a\x32\x92\x06\x7d\xa3\x12\xc8\xd2\xa6\x41\xcb\xb7\x07\x21\x78\x86\x40\x29\x20\x8b\x7a\x5d\x52\xe7\x92\x64\x27\xe5\x3d\x1b\x23\x48\xd4\xa8\x7f\x6f\x79\x6e\xc7\xee\x0e\x45\x4d\x30\x5f\x06\xa2\x3e\x86\x15\xee\x31\xa3\xb6\x2a\x5e\xd0\xab\x8e\x7c\x3b\x34\xaa\x25\x1f\x48\x88\x9e\x6b\x35\xaf\xe8\x58\x7f\x2e\x6c\xeb\x04\x57\x14\xd5\x22\xa6\x00\xe1\x42\x8f\xdb\xa0\xa2\x0e\x25\x02\x3e\x88\xbc\xf6\xfc\x73\x21\x4e\x7c\x0d\x90\xe2\x12\x1d\x64\x01\xfb\x6c\xc0\xcd\x82\x62\xa2\xb0\x2d\x50\xd7\x4a\x6c\xc3\x31\x6b\xde\x4c\x5e\x2c\xec\xd0\xab\x3c\x44\x4c\xd5\x38\xe8\x35\x83\x65\xe5\x6d\x37\x08\x2d\x97\xb1\xac\x06\x56\x74\xf7\x91\xfc\x4c\xc4\x0f\xaf\x63\x14\x04\x1e\xef\xf9\xde\x88\xb8\x74\x04\x81\xdd\x0e\x7c\xdf\xf3\xf3\x8f\xf7\x2c\x17\x22\x72\x5b\x8e\x43\x2c\x1e\x22\x1c\xd4\x67\x81\xc9\x63\x1c\x0f\x1d\xb5\xd4\x18\x36\xf9\x80\x3a\x9d\x22\x00\x93\xa8\xb1\x57\x66\xeb\xa7\x42\xef\xe7\x28\xc0\x05\x7a\xcf\x0a\xdc\x5c\x48\x9a\x94\xba\x04\x4c\xd0\x2c\xc7\x0e\x68\x9b\xac\x90\x60\x38\x00\xdf\x70\xbd\x04\x6b\x81\xb6\x11\x35\x4e\x6d\xe8\xc1\x93\x27\xf2\xc4\x12\x9e\x77\x76\x76\xc8\x63\x54\xf9\x1f\x33\x8e\x8f\x7d\x53\xbd\x24\x2f\xf0\x75\x0d\x8e\x7e\xb7\xcd\x1e\x8b\x88\x69\xf9\x60\xd8\xdc\xc3\xb1\x03\xb4\xe0\xb7\xe8\xaa\x38\x64\x96\x1f\xe0\xe0\x51\x35\x01\x47\xcd\xe6\x47\x77\x88\x94\x4a\x1c\x9a\xb3\x21\xc4\x66\xbf\x19\xf8\x34\x08\x18\x1a\x60\xf8\x47\x31\x36\x72\x93\xe2\x91\x26\x44\xc3\x13\x4d\x14\x21\x7c\xf8\x63\xb2\x4c\x62\xb8\x00\xa9\x04\xf6\x8a\xed\x95\xe8\xe6\xe9\x4c\x34\x04\x0d\x74\xf5\x99\xf2\x9d\xb4\xd4\xc8\xd7\x40\x28\xc1\x7d\x8b\x22\x8e\x7e\x2f\x82\x46\x9d\x44\xc8\x07\x7e\x51\x42\x74\x51\x23\x22\x84\x91\x3b\x31\xf5\x34\xe2\x72\xfc\x02\x33\xe7\xfe\x8b\xe4\xf7\x29\x03\xa4\x70\xd3\xa2\xae\xed\x68\x45\xc4\x25\x08\xec\x72\x3a\xb6\x43\x4f\xae\xa9\x7f\x6d\xd3\x11\xc1\xb5\x1d\x36\x13\xe2\x0f\x5d\x42\x98\x4e\xc1\x97\x7c\x5d\xf2\x1b\x1f\xf2\x3c\x39\x8d\x92\xf4\x4b\x3c\xa2\xd5\xf4\x4a\x62\xc9\x2a\xd9\xc1\x1f\x96\x63\xb7\x85\x79\x38\x07\x5a\x88\xde\x2b\xcd\x04\xb3\xe5\x78\x2e\x8d\x40\x14\x68\xc2\xcd\x93\x16\x31\x6b\x3e\x1d\x3e\x5f\x48\xc3\x94\xbf\xce\x6b\xad\x69\x09\x4d\x67\xec\x87\x61\x39\x3f\x87\xb6\x76\xf1\xd8\x7a\x4c\x56\x9f\xca\xcc\x05\x4f\x57\x2f\x15\x1d\xc4\x3a\x7f\xf0\xee\x0c\x74\x16\x0c\xb6\xb8\x77\xf2\xb6\x71\xfe\xe9\xdd\xc1\x19\xe8\x48\xb3\x28\x55\x17\x8f\x9b\xd0\xd8\x9b\x83\x97\x07\x6f\xf7\x39\x90\xa7\xab\x97\xa5\x8e\xed\x84\xd4\xd7\x0e\xf7\x19\x3f\xc7\xb6\xa9\x98\xe1\x18\xa2\x3f\x6f\xab\x9b\x4d\xec\x90\x9c\xca\x19\x44\x48\xd2\x8a\x13\xfa\x2f\x1c\xab\x64\xcc\x43\x48\x37\x8f\x8b\x95\x19\x64\x32\xe2\x36\xa4\x04\x25\xe2\x54\x24\x8d\xb4\x58\x92\x58\x60\xae\x60\x92\xd1\xb5\x11\x0b\x20\xc0\xbf\x57\xfc\xc8\x8c\xa5\xd4\x8c\x18\x89\x9d\x33\x43\x46\x72\x01\x68\x06\x8d\xe4\x84\xbf\xb7\x58\x91\x4d\xef\x86\x1b\xec\xaf\x54\xb4\x3c\x93\xaf\x78\xba\x9e\x15\xcc\xa9\xa6\x45\xb9\xcb\xe8\x52\x62\x5c\x3b\x5d\x83\x96\x5c\x93\x1c\xca\x6e\x81\x28\x71\xd0\x37\x4c\x2f\xb3\xbb\xeb\xdd\xe4\x33\xe2\x16\x69\x50\xa6\x8b\x3c\x26\x0b\xce\xd5\x5e\x97\x86\xac\x44\x4a\x23\xfc\x6b\x34\x34\x8e\x18\x25\x35\x64\xba\xc3\x88\x18\x33\xc6\x60\xe8\x47\x2c\xde\x44\x4a\xe1\x28\x1a\xc5\xf0\x95\x19\x53\x49\xc2\xfb\x6d\x07\xe3\x49\xa9\xaa\xec\x4d\xc1\xf0\x3c\xc4\x9c\xd4\x22\x13\x92\x6c\x58\x26\x78\x52\x75\xef\x62\xb1\x8d\x78\x6d\xa6\xd8\x64\xd1\x8b\xcb\x71\x91\x68\x2b\x9d\x74\x91\x82\xe8\xd0\x11\x21\x65\x76\xfc\x20\xc7\x1a\x7b\x43\x2d\xe0\x05\x3e\x1b\x2e\x55\x0e\xdb\xf1\xaa\x78\x41\xec\xd1\xf0\x3d\xd2\x93\xae\x6a\x21\x2f\xf4\xd7\xf1\x50\x2b\x59\x61\x56\x5a\x3d\xcb\x0f\x23\xe1\x74\xd4\xbb\x58\x49\x35\xc8\x5a\x51\x39\xcc\x8a\x12\xbd\x77\x1e\xa3\xc3\xb5\x67\xb7\xf5\x24\x78\x84\x5c\xeb\x1f\x0c\xcf\xd1\x47\x98\xb3\xe8\xf6\x96\x20\x69\x4b\x90\xf0\xcc\x0c\x93\x73\x7b\x4b\x22\xdf\x50\xe9\x65\xaa\x3a\x7e\xf0\x11\xbf\xe4\x5a\xea\x23\x54\x8b\xfa\x57\x72\xea\xb3\x55\xb1\x05\xd1\xd8\xc1\xa0\x43\x8c\x1a\x7b\x2d\x08\x1d\x09\x7c\x00\x17\x1e\xde\x8d\x18\x78\x35\xcf\x6e\x6f\x15\xf7\x96\x15\x8f\xb2\x3f\x4e\xa1\xef\x3c\xf3\x61\x3e\xaf\x8d\xc4\xed\x2d\x9b\x08\x2b\x0c\x66\x09\x6a\x17\xe0\x9e\xf3\x2e\xd3\x8f\x93\x03\xd4\x3a\xe1\x8b\xe4\xdd\xdf\x45\x3e\x42\xce\x0f\x4f\x9e\xf0\x5f\x9c\x22\xac\x3d\x72\x07\xe6\x3c\x88\x4d\xac\x1c\xd0\x1b\x8b\x65\xb8\x54\x26\x0e\x63\xe8\x0d\xd2\xc6\x43\x7c\x8a\x0e\x22\x66\xcb\x4b\xab\xa5\x7d\x4d\x1c\xc6\xc8\x24\x61\x94\xe0\xc9\x89\xe3\xa3\xd6\x48\x1f\x36\x21\x63\x22\xe3\x76\x2d\xc6\x2d\xf4\x06\x72\xd8\xf8\xb4\x10\xe3\xc6\xa0\x96\xb0\xfe\x34\x23\x27\xe6\x44\x1c\x6f\xec\x2a\x0e\xa1\x48\x88\x19\x1b\x1b\x4e\x0f\x6d\x10\x01\xb5\x58\x39\x46\xed\x89\x43\x28\x94\x0c\x7e\x1a\x07\x36\x1f\x8c\xb3\x8a\x80\x65\xfa\xca\xa3\x96\xa7\x14\x09\xaa\xaf\x5f\x09\xeb\x4f\x75\xfa\x05\xa8\x3a\xe5\x0a\x54\xd5\x97\x20\xd5\x9e\xe7\x32\x24\x70\x91\x35\x44\x75\x49\xff\x62\x2e\x5a\x50\x88\x27\x38\x83\x30\xf9\x4f\x9e\x90\xe8\x3b\xe0\x1f\x6f\xe8\xb6\x6d\xb7\xbb\xe7\xd8\xd4\x0d\x4f\x69\x2b\x8c\x86\xd7\xd4\xf8\x6d\x62\xdd\x7c\x21\xe2\x14\x0f\x66\x0e\x56\x33\xc8\x4b\xc1\x80\x42\x02\x03\x85\x90\xdf\x60\x67\x71\x7b\x4b\x8c\x72\xc8\x87\x58\xf0\x15\xe7\x49\x28\x99\x10\x49\x30\x31\xf2\xaa\xae\xb7\xc9\x86\x8b\xd1\x02\xaf\xd4\x92\xcc\x9b\xd4\x4a\xdc\x15\x49\xd4\xd2\x48\xfd\xb1\x9e\xe9\xa4\x8f\x7e\x27\xc6\x90\xb1\x3e\x19\x5e\xe0\x7a\x98\xc3\x89\xbe\xf5\x92\x99\xd8\xde\x67\xa5\xc2\x88\xa5\x18\x07\xdf\x4d\x17\x8e\x36\x49\x95\x25\x89\xea\xec\x84\xfe\x4f\xea\xbd\xd1\x77\x90\x77\x7a\xe7\x55\xd7\xa7\x08\x84\x3b\x47\xd8\x44\x46\x00\x31\x35\x13\x42\x25\x56\x53\x75\x9d\x96\x3c\xcc\xe0\x25\x4b\xe2\x58\x40\x2b\x34\x32\xf4\x8e\x6a\x9c\xb3\x7a\xa6\xba\x51\xe5\x9c\x65\xc0\xc0\x59\x04\xfe\xb6\x3a\x28\xed\xb5\x81\xb8\x37\x0c\xb5\xd2\x52\xcc\x49\x88\xd9\x79\x7d\xf9\x5a\x3e\x12\xcb\x34\xc4\x04\x4b\x48\x14\xdc\x93\x0b\x02\x96\x58\x92\x7c\x20\x96\x9a\xa8\x3a\xa9\x23\x5c\x28\x1a\xdd\x2a\x44\x83\xa7\x2e\x72\xa8\x21\x51\x8d\x44\x34\xd0\xb9\x4e\xf3\x53\xcd\xf9\x14\x56\xb8\x60\xc5\x81\xed\xd4\x0a\x47\x2c\x67\x46\x74\x1b\x3b\xb4\xa6\x91\xd6\xf4\x47\xef\x18\x6c\xd6\x89\x44\x6b\xc7\x3f\xe4\x34\x43\xc6\x9a\xa1\xdb\x23\xdc\xae\xa5\x5a\x4e\x3e\x23\xd3\x42\x87\xf3\xa2\x86\xef\x7a\x64\x5b\xd8\xa5\x10\x13\x0e\xa7\x6e\xfa\x1e\x40\x95\xc9\xdb\x21\xed\x17\x35\xf5\xd9\x9c\x38\x52\xd5\x67\xc5\x4a\xba\xba\x6f\x2e\x2c\x89\xca\x25\x5b\x5d\x26\x9e\xbe\x24\xdc\xe3\x5d\x3c\xee\xc0\xe1\x8b\x30\x0b\xc0\xd3\x17\x0d\x03\xae\x92\x24\xed\xb1\x62\x93\xae\x46\x62\x15\x15\xf5\x13\x22\xe1\xeb\x3d\xe9\x79\xbe\xfd\xcd\x73\xc3\x88\xa2\x9c\xd0\x16\x9f\x4f\x5a\x53\x72\x6a\x29\xd2\x26\xb4\x9b\xbd\xc9\xbb\xc4\x19\xc3\x3f\xe2\x39\x00\xc4\x26\x98\x3c\x6f\x2e\x1e\xcb\x33\xa6\xc7\x97\x32\xba\x4f\xb5\xc4\xf3\x0e\x89\xb8\x05\x08\x33\xa7\xbe\xcb\x40\x01\xfc\xb8\x43\x26\x12\x9f\xf5\x8a\xbb\x64\x99\x49\x5d\x66\xae\xcd\xd3\xea\x14\xe7\x69\x99\xf1\x3a\x86\xf4\xd4\xe5\xcf\x7c\x9d\xe0\xb9\xf8\xf4\x2d\xe6\x5c\x80\xb8\x01\xd1\x92\xb1\x03\x5d\x10\xd2\xe8\x1e\xb0\xe9\xdd\x07\x22\x76\xcb\x73\x31\x2b\xf7\xc2\x60\xce\x79\x5a\xa4\xf9\xd8\x2d\xaf\xce\xa1\x61\xfc\x71\x3a\x2f\x00\xef\x42\x97\x02\x45\x4d\xba\x21\x7f\xc1\x36\x75\x21\xf0\x7c\x8b\x5e\xc4\xcc\xe8\x10\x61\x12\x84\x37\xc2\x37\x36\x53\x0b\xb5\x03\x29\xd7\xe5\x56\xac\x28\x37\x93\xd8\x8e\x4a\xb6\x38\x73\x03\x18\x06\x00\xa5\x21\xec\xd8\x16\x62\x01\xc2\xb7\xee\x0b\x02\x11\xbb\xcc\x05\xc1\xf8\x0b\xce\x0d\x26\xc5\x81\xbe\x03\x6b\xec\x78\x56\x7b\x2e\x50\x2a\x77\xd6\x42\x63\x23\x13\x80\xcd\x8e\x80\xcb\x63\xef\xd8\x73\x76\x40\xd4\x0f\x17\x9b\xdb\xf7\x73\xad\x54\x80\x41\x81\x51\xe9\x78\x7e\xdf\x0a\x43\xcc\x48\x38\xd7\x2a\x53\x84\x90\x25\xc7\xde\x30\xa0\x07\xee\x3d\x01\x7a\x43\xad\xeb\xf9\xc8\xa4\x00\xed\x39\x76\xeb\x6a\x41\x18\x6a\xc3\x36\x37\xa0\xa5\x3b\x4d\xf5\x88\x47\x45\x52\xcb\x46\x65\x5d\x97\xd6\x86\xcc\x55\x52\x56\xca\xca\xb8\x60\x14\x72\x6d\x49\xdc\xba\x54\x0b\x70\xfe\x85\x8d\x83\x95\xb4\x34\x00\x13\x97\x7a\x68\x34\x4a\x9e\xae\x26\x19\x92\x5e\x3c\xb6\x1e\x5f\x92\x1d\x92\x57\x57\x68\x11\xd3\xd4\x4c\x7f\xce\x1f\x6d\x9a\xfa\x20\xb6\x99\xe5\x7b\xb0\xcd\x2c\x2f\x66\x9b\x59\x79\x40\xdb\xcc\xca\x7d\xd9\x66\x56\xee\xc1\x36\xb3\xda\x68\xaf\x35\x40\x5c\xa7\x8f\x22\x78\x56\xcf\x65\xf7\xa9\xc2\xb5\xa6\x42\xaf\xde\x07\xec\x05\x88\x68\x02\x9a\xdb\xfa\xf4\xa1\x0d\x5c\x37\x66\xb4\x0a\xfd\x69\x13\xfa\xd3\x26\xf4\xa7\x4d\xe8\xbd\xda\x84\xfe\x34\x09\xfd\x69\x12\xfa\xd3\x24\xf4\x2f\x66\x12\xba\x37\xf4\xaf\xa9\x6e\x11\xca\xe6\xef\xd9\xa7\xe3\xdd\x93\x37\x8d\xc3\xfa\xde\xf9\xc9\xe9\x11\x98\x06\x32\xb5\x3f\x18\xf7\x9b\x9e\xb3\x67\xfb\xad\x49\x87\x72\x4a\x27\xba\x78\x3c\x84\xdd\x9c\x5e\x17\xcd\x12\xf9\x1b\xdf\x0b\x82\xe9\x81\x5d\xeb\xc0\x20\xa6\xa7\x06\x6b\xdf\xb6\xfa\x9e\x3b\x61\xaf\xab\x43\x1b\x69\xd0\x78\x65\x80\x27\xfb\x7a\xf6\xe7\xd0\xf2\x67\xe8\xeb\x8d\x06\x10\xeb\xea\xf8\x9d\x85\xd6\x84\x8d\xa6\x0e\x6b\xac\xc3\x0a\x2d\x5f\x87\x74\xee\xdb\x96\xdb\x9d\x65\x14\xbe\x69\xd0\x44\x6d\x1d\xe2\xc7\xf1\x0c\xc0\xea\x1a\xb0\x8f\x63\x80\xb3\x74\x87\x3a\xd3\x69\x7d\xff\xa8\xfe\x56\x44\x09\x78\x77\x44\x56\x49\x65\xab\xcc\xd7\x85\x2e\x0d\xcf\xa0\xd2\xa1\xc5\xe6\xd6\x58\xd7\x28\xa2\xdf\x34\xa3\x51\xf0\xa6\xe5\x27\xdf\xd8\x68\x8e\xcb\x80\x52\xe0\xd8\x2d\x9a\x2f\x17\x49\xa5\x50\x0a\xbd\x0f\x03\xc6\xf0\x56\x40\xf3\x05\xb3\x40\xc5\x38\x91\x8f\xb2\xf7\x05\x03\x7e\x89\x41\x59\x17\xe1\x69\x65\x62\xdb\xb2\x9c\xd6\xd0\xb1\x42\x5a\xf7\xa9\xc5\x76\xca\x7a\x4f\x63\x1f\xf3\x81\xfd\x8d\x16\x21\xee\xde\x39\x48\x20\xd5\x75\x90\x16\xfc\x3d\x5e\x6e\x40\x44\xf5\x88\x0d\x32\x2b\x21\x8d\x10\x83\x91\x1d\xb6\x7a\xba\xd1\x2d\x21\x2d\x2b\xa0\x24\x07\x41\x70\x73\x35\xf3\xee\x62\x83\x3c\xc5\x88\x7f\xfc\x9f\x55\xf2\x7c\x5b\xab\xd3\xc6\x69\x11\xad\x55\x2e\xc5\xeb\x61\x04\x8c\x3f\xfd\x10\x3d\x68\x25\x88\x00\x26\x42\x14\x82\x56\xd7\x28\x1c\x5a\xbe\x2c\x6a\xda\x2e\x20\xcf\xee\x90\xca\x16\x79\xca\xf9\x4c\x33\x50\xe0\x60\x2b\xa5\x6a\x14\xb3\xa7\xdc\x72\x21\xb4\xdc\x3c\xc0\x28\x90\x15\x62\xbe\x21\x4f\x49\xb5\x40\x9e\xe2\xdb\x81\x37\x8a\x56\x28\x92\x6a\x21\x72\xc1\x8d\xe8\x86\x7c\x2a\x45\x7b\xa7\xd3\x22\x46\xa8\x75\xbd\xc3\xa3\x71\xac\x72\xbe\x5a\x21\x2b\xa4\x52\x16\x08\x71\x38\x71\x40\x5b\x08\x48\xc4\x40\x4a\x40\xe1\xdd\x51\x72\xeb\x77\x92\x55\x71\xd2\x05\xd3\x58\x5c\x27\x6d\xd3\xa6\xb1\xb8\x9e\xd9\xe0\x9a\xe3\x94\x61\x71\xcd\x4b\x48\x7b\x81\x64\x33\x6a\x5e\x4a\x5c\x60\x8b\xeb\xeb\x89\x86\xca\xbc\xde\x34\x26\xca\xa2\x89\x02\x37\x4f\x46\x08\x72\x3f\x57\x48\x31\x0e\x96\x3d\x8c\x5e\x03\xbf\xb3\xc2\x9e\x4a\x11\x8b\x81\x3a\x09\x79\x4a\xf6\x84\xd0\x00\x37\xfc\x81\x15\xf6\x08\xd3\xf4\x70\xf5\xc6\x22\xff\x15\x17\x9c\x18\x9b\xe0\x0e\x4a\xf1\x8f\xab\x69\x57\xca\xac\xbd\xa8\xd5\x45\xb6\x19\x69\x80\xe2\x4c\x64\x4d\x63\xa2\x2b\xf2\xf5\xdc\xc8\x97\x26\xc5\x9a\x6e\xed\x13\xcb\xa8\x66\x18\x49\x04\x91\x45\x22\x79\x6d\xd8\x8e\xd5\x98\x86\x89\x4d\x41\x1e\x6a\x82\x1c\x79\xb7\x00\xe8\xe4\x0d\x14\x0a\xd0\x89\xfc\x94\x82\x3b\x66\x2f\x81\xb0\x32\xec\xa6\xe7\xb0\x8c\x99\x64\xff\x12\x4b\xd1\x58\x4d\x4e\xcc\xd8\xba\xd1\x4b\x18\xb9\x34\x5a\x63\xfd\xd3\x38\x95\x07\xaa\x25\x14\xe2\xba\x61\x01\x03\xbb\xb3\x43\x96\x5b\x37\x4c\xcf\x66\x90\xe0\x69\x0c\x5a\x37\x54\x66\xcf\xec\x17\x9c\xa4\x46\x84\xf8\x0c\x47\x9b\x31\x03\x93\xdc\x00\x66\x90\x69\x42\x38\xb5\x39\x83\x79\x11\x71\x05\xdc\x01\x33\x9e\x06\xd4\x65\x9b\x60\xcf\xad\x87\xa1\x6f\x37\x87\x21\x0d\x90\x61\x34\x4b\x8f\xb9\x1b\xa2\xd0\x10\xfa\xcd\x1c\x5c\x53\x37\xcc\x6c\x24\xc5\x56\x66\xd6\xc3\xbe\x7c\x21\xaf\xcc\x6b\x90\x47\x83\x9c\x96\x0e\xc4\xc8\xad\x19\xfa\x96\x1b\x74\x3c\xbf\x5f\x63\x8b\x9e\xe5\x06\x6c\x1e\xe4\x99\x1e\xd6\xba\x21\xcb\x24\x57\x24\xf0\x7b\xcc\x7e\x17\x0c\xeb\x9c\x76\x4d\x1a\x1d\xa1\xb0\xd1\x6c\xc6\x0a\x73\x59\x54\x70\xe1\x99\x6d\x52\x51\x9e\xd1\xa4\xe2\x4c\x12\x20\xc9\xa6\xc2\xe0\xa6\x59\x47\xb7\x05\xa3\xfb\xee\xf4\xe0\xec\xe0\xed\x79\xfd\xfc\xe8\xe4\x6d\xa3\x7e\x7e\x7e\x7a\xb4\xfb\xe1\x1c\xaf\xb6\x70\x48\xa7\x1a\xca\xe4\xc3\xef\x92\x25\x43\xf7\x4f\xbe\xad\x4b\x05\x21\xaf\xb6\x41\xa3\x85\xd4\x92\xa0\x31\x16\x95\x1a\x58\x94\xea\x1c\xcf\xa3\x08\xd9\x13\x85\x12\x54\x44\x75\x06\xaf\xa6\x5b\x37\x73\x21\xa1\xd9\x5b\x8c\x17\x04\x10\x4c\xb0\x6c\x98\x12\xc4\x24\xcb\x86\x89\xf4\x04\x95\x9d\x13\x91\x86\xd4\xcf\x5d\x16\x96\xee\x0a\x99\x37\x6c\x3c\x69\x88\x18\x09\xd9\x99\x67\xeb\x26\x56\x08\x5b\xde\x9e\xdd\xd7\xe5\x99\xa6\x38\x45\x6e\xcf\x32\xa3\x69\xfe\xe8\xdb\xb3\x46\xe0\xb7\x1a\x96\xdf\xca\x08\x53\xc1\xaf\x47\x86\xee\x30\xa0\x6d\xd9\x84\x4f\x39\x1d\x2c\xbf\x85\x1d\x9a\xe3\x16\x8a\xb7\x4e\xad\xd4\xe6\xd7\xa2\xf1\x64\x64\xbb\xf9\xa6\x0d\xd6\xd6\x05\x73\x24\xd4\x95\x4b\x3b\x9f\x48\xcc\xc7\xd6\x63\x65\xcb\xab\xc7\x3d\x9c\x12\x51\x18\xe1\x6d\xb0\xd6\x9d\xeb\xb2\x0b\x40\x39\xb6\x9b\x7e\xdb\x55\x2d\x97\xef\xbb\xcf\xfd\x99\xfb\x6c\x20\xba\x58\x9f\xd7\x10\xd4\xc0\x4e\xef\xf2\x66\x65\x3d\x9b\xcb\x06\x36\x9d\x93\xcb\xd6\xd5\xe0\x9d\x5a\x6d\xdb\x72\x32\x90\xd8\x9c\xc4\xea\x02\x06\xc7\x25\xad\xa0\x0f\x85\x98\x8e\x3b\x27\xd2\x1b\x8a\xfa\x13\x90\x5e\xab\x6c\x65\x23\xad\x60\x4c\x85\xf4\x1b\xdb\x9d\x97\xd2\xcf\xf8\x38\x7b\xb6\x1b\x4e\xc4\xfa\xf9\x84\xf1\x56\x40\xe6\xc4\x66\x53\x92\xf0\xaa\x61\xbb\x6d\x7a\x93\x31\xee\x93\x49\x78\xf5\x4a\xda\x65\x4c\x20\x23\x2b\xfc\x07\x37\xd1\x98\xa2\xe8\x42\x7d\xdc\xc2\x3e\xa2\xe6\x99\xd1\xbf\xe7\xf7\x2d\x4f\xc2\x99\xe5\x49\x04\x55\x53\xa2\xa4\x11\x88\xab\xd4\x73\x52\xe7\xb9\xd1\x24\x2a\x02\xe9\x1c\x59\xad\xdc\x37\x91\x86\x33\x13\x29\x19\xe3\xc5\xa4\x6f\xa5\x6c\x02\x65\xfa\x68\x06\x15\xaa\xf7\x4d\x85\xeb\xd9\x97\xdb\x44\x8c\x17\xa4\x42\xc5\x80\xc9\x95\xf1\x0c\x3a\xac\xdd\x37\x1d\x46\xb3\xd3\x21\x05\xe7\x05\x29\x51\x35\xa0\xe2\x5e\x24\x83\x10\x1b\xf7\x4d\x88\x9b\xd9\x09\x91\x8c\xf2\x82\x74\x58\x33\x81\x86\x56\xba\xc9\xcc\x5a\x75\xfd\xbe\xa9\x30\x9e\x9d\x0a\x49\x08\x2f\x48\x83\x75\x03\xa4\xd8\x85\x66\xd0\xe1\xde\xb5\xf1\x6f\xb3\xd3\x21\x0d\xe9\x05\x69\xb1\x61\x80\x1d\x8d\xb3\xc8\xb0\x79\xdf\x64\xa8\xcf\x4e\x86\x04\x7c\x17\xa4\x00\x57\xe0\xe0\x48\xbc\xd1\xb4\x02\x3b\xd8\x73\xbc\x80\xa6\x8b\xc9\xcd\xea\xbd\xef\x54\x5a\xb3\x13\x22\x1d\xed\x05\xe9\xb1\x19\x03\x7c\x32\xa0\xe9\xa1\x4f\x37\xef\x5f\x85\x68\xcf\x4e\x8d\x34\xa4\x17\xa4\xc5\x56\x0c\x6c\x86\xf5\xdf\xbd\x4b\x89\xe6\xec\x74\x48\x42\xf8\xe2\x71\x73\x11\x1a\x3c\x37\x40\x0e\xdd\x76\x86\xa8\xdc\xac\x4e\x38\x37\x01\x28\xbb\x00\x64\x4e\xfd\xb6\x5a\xd6\xf1\x69\x59\x7e\xdb\x76\x2d\x67\xc2\x94\x5d\xab\x4e\xd8\xec\x00\xb4\x3d\x03\xd8\xbc\xf8\x55\x92\xf0\xcb\x9c\x42\x6b\xd5\x09\xfb\x42\x03\x3b\x06\x6a\x5e\xdc\xaa\x49\xb8\x65\xb0\xf4\x84\xa3\x01\x03\xaf\x79\x71\x5a\x33\x71\x0a\xfb\x43\xc7\x39\xf5\xfa\x13\x85\xf0\xda\x54\xb8\x99\xe0\xe6\xc5\x71\x3d\x19\xc7\x09\x82\x71\xc2\xe9\x4e\x04\xc3\x45\xc6\x75\x23\x19\xbf\x8c\xc3\xb6\x69\xe6\xa9\xc2\x6d\x5e\xbc\x8c\x45\xca\xb1\x5d\x6a\xf9\x13\xc7\xf5\xde\x55\xef\xce\xec\xc7\x80\x19\x78\x2f\x78\x12\xba\x19\x87\x9c\x31\xff\xee\x5d\x01\xa7\xb3\xd3\x22\x11\xe3\x05\xa9\x60\x2c\x53\x7d\xcf\xf5\x42\x2f\xe3\x68\x78\xf3\xfe\x15\xf0\xee\xec\x74\x48\xc1\x39\x99\x12\x8b\x63\xd8\xbb\x47\x0c\x17\x59\xff\xab\xc6\xfa\xef\x5a\xe1\xd0\xcf\x3a\x4d\xbe\xff\x4d\x82\x3d\x3b\x21\x92\x51\x5e\xf0\x3c\xdf\xd0\x3b\x82\x90\x0e\x32\x88\xb0\x75\xdf\x44\xf8\x3a\x33\x11\x92\xf0\x7d\x28\x5e\xbd\xba\x27\xec\x92\xf8\x74\x71\xec\x9c\x7b\xc2\xae\xb5\x08\xf7\x88\x53\xad\x90\x61\x97\xce\x38\xf7\x7e\x66\xed\xce\xde\x79\x13\xd5\x05\x67\x0d\xd7\x38\xbd\x4e\x27\xa0\x21\xc3\xcc\xca\x38\x80\xdc\x5c\xbb\xf7\x9d\xb5\x37\x7b\xff\x93\x51\x5e\x90\x0e\x6b\x06\xd0\xb6\x7d\x4d\xfd\xae\xed\x76\x33\x48\x51\x99\x70\x4b\xc0\x86\xe7\x04\xc0\xed\x0b\x68\x73\xaa\x69\x6b\xeb\x06\x72\x6e\xd6\x5a\x1c\xf5\x49\x5c\x7c\x84\x06\xb3\x8f\x50\x12\xbe\x0b\x8e\xcf\x86\x01\x32\xb0\x9d\x9e\x37\xa4\x61\x98\xa1\x94\xac\xdd\xfb\xa5\xc1\x9f\xb3\x53\x22\x1d\xed\x05\xe9\xf1\xcc\x00\x3c\xb2\xbb\x59\x27\xa4\x9b\x6b\xf7\x7e\x71\xe0\xcf\x4e\x8b\x64\x94\x17\xa4\x03\xd7\x7e\x3d\xbf\x4d\xfd\x86\x15\xb4\x28\x74\x27\x63\x63\x35\x61\x5b\x8a\xd3\x96\x41\xab\x0b\x60\xf3\xce\xda\x2d\x1d\xb5\x36\x9d\x88\xdb\xe6\xda\x84\x0d\xa9\xc2\x6d\x9f\x2e\x8a\xdc\x73\x1d\x39\xdb\x0d\xec\x36\x3d\x19\x66\xe4\x85\x59\xdb\x98\x16\xb7\x23\x01\x6c\x5e\xd3\x88\xb2\x8e\x5a\xa6\xb0\xab\xdc\xbf\x4d\x4a\x30\x33\x5f\x27\xe1\xbb\x18\x53\xaf\x57\x74\x88\x3e\xbd\xa6\x7e\x90\x35\xb9\x9f\x4d\x3b\x34\xa7\x08\x4a\x78\x85\x91\xd5\x55\x02\xb9\xe5\x74\xd3\x10\x3b\x20\x6d\x3a\xf0\x69\xcb\x0a\x69\xfb\x51\xac\x0c\x58\x62\x44\xca\x4c\xfd\x67\xd8\x9c\x55\xcb\x99\x69\x81\x7f\xb4\xcd\x59\x7b\xad\x31\xb0\xc2\x5e\xfa\xc2\x3a\x67\xda\xa2\x4a\xa3\x01\x6e\x87\x56\x46\xd6\xa5\x67\x73\xa6\x27\xab\x36\xe6\x3c\xa8\x98\xc1\x48\x0a\x6c\x5e\x32\xe4\x29\xb8\x60\xe1\xe0\xce\x69\x94\xa8\x4f\x37\xee\x15\x76\x93\x99\xb4\x40\x61\x25\xbc\x54\x6e\x84\x7b\x1f\xfb\x1b\x4f\x5d\x19\x03\xd2\x8c\xf5\xca\x22\x2c\xf0\x14\x1e\x07\xc6\xc8\x26\xfa\xcb\x84\xfe\x50\x59\x5b\x43\xe8\xb6\x9b\x90\xa0\xfb\xac\x7c\xcb\xc6\x2f\x13\xe1\xd8\x20\x27\x25\x83\xe0\xd0\xbc\x61\x38\x18\x8a\x26\x4c\xcf\x1a\x56\x3b\xdf\xb6\x42\x4b\xcf\x66\x60\x2b\x83\x6e\x97\xec\x10\xf6\x59\xe4\x1e\x90\x1f\xda\xda\x4f\x24\x4e\x99\xec\x70\xf7\x58\xf9\xa5\x39\xec\x74\x20\x61\xa0\x74\x14\x10\xbd\x15\xde\xc2\x12\x35\xe8\x4c\x1e\x2b\x4c\x43\x66\x6d\x6a\x8a\x9e\x83\x9b\x0c\x7a\x75\x18\xb9\x14\x54\x10\x82\x1d\xe2\x6e\x93\xe5\x65\x5b\x79\x57\x70\x87\x73\xf2\x1f\x02\xc1\x8b\x79\x57\xf2\x6d\xde\xed\x0b\xfb\xb2\x48\xec\x22\xfc\x2e\x14\xc0\x8d\x41\xf4\x36\x1a\x08\x5a\xa3\xc2\x23\x55\x06\xfb\x57\x62\x64\x3e\x0b\x2d\x3f\xcc\x6b\x01\x55\x21\x9a\xa1\x56\xe0\xc0\x6d\xe7\x23\x6e\x67\x26\x68\x09\x0e\x58\x35\xbf\x7c\x93\x6f\x2b\xec\x8a\x64\x79\xac\x3f\x17\x8c\x74\x0e\x10\x8e\x16\x88\x5b\x90\xb9\xf6\x75\xae\x28\xf2\xb1\x22\xcb\xe4\x31\x38\x97\x0b\x93\x7c\xa8\xcf\xb0\x2b\xdd\x68\xee\x5c\xf9\x46\xc4\x27\x31\x1a\xf8\x82\xbc\xc0\x14\xcb\x22\x09\x7b\xc4\x41\x9d\xbc\x20\x0d\x52\xbb\x8f\xc9\xb4\xdc\x28\x14\x01\xbf\x02\xa9\x91\x1b\xc0\x78\x5b\xa2\x3c\x9e\x15\xe5\xf1\x0f\x47\x79\x1c\x41\x59\x49\x9a\x99\x10\x57\xd5\x1e\x1c\xfd\x47\x8f\x74\xfc\x79\xc3\x91\x5e\x08\xf9\x35\x53\x1f\xa4\xd0\x2b\x4a\xa9\xf8\x88\xa7\xbf\x7f\xf2\x84\xe4\x23\xa2\x82\x17\x29\x68\xb8\xc0\x87\x28\x26\x52\xbe\xce\x84\x4b\x43\x88\x28\xf2\x42\x13\xd1\xc6\x94\x21\xb5\xa8\xf4\x52\x05\x75\x0a\xf1\xb7\x0a\x2f\xde\x2c\xfb\x9e\x98\xb1\xbe\x5a\xae\x3c\xbc\x0a\x24\x34\x62\xbb\xdf\x1f\x42\x28\x83\xc2\x84\x05\xf9\x66\xde\xea\x4d\xa8\x3e\xde\x56\x11\x28\x6e\xf2\x03\x23\x3f\xd0\xe0\xa2\x7c\x09\x39\x67\x65\x89\x71\xac\x44\x05\x4b\x44\x29\x55\xfd\x0b\x52\x0a\xa4\xf3\xbc\x3e\x0e\xfd\x4c\x6d\x73\x6b\x7e\x6d\x73\xba\x6b\xe3\x25\x6d\x10\x70\x95\x09\x7b\x56\x58\x24\x37\x45\x32\xd6\x14\xb1\x0a\xb8\x22\x5a\x61\xa9\x71\x23\x03\x92\x8f\xd5\xcb\xb1\x7c\x79\x53\x55\x25\xab\xb2\xa4\x7a\x39\xae\xc2\x94\xc0\xb0\xf7\xec\x85\x53\xae\x34\x2c\xf2\xdb\x34\x44\x12\x11\x88\xe9\x20\xb0\x1d\xcf\x05\xe9\xa4\x69\x31\x16\xd9\x21\x55\xf2\x94\x28\xb8\x55\x8b\x2c\x93\x35\xe3\x95\xa5\x9e\x2a\xd5\x06\xfb\xae\x9e\xaa\x96\xa9\x07\xc5\x6b\x1a\x38\xeb\x55\x2d\xbe\xfa\x02\xa1\xf2\x37\x15\xf2\x94\x58\x64\x45\x10\xa2\x6c\x34\x5a\x55\x55\x6f\xa2\xf8\x16\xc8\x2a\x71\x11\x14\x90\x37\x3f\x36\x41\x8d\x53\x41\x8d\x53\x41\xdd\x45\x08\x5e\x5d\xbb\x27\x82\x37\x4d\x82\x57\xd7\x62\x04\x87\xa6\xa6\x23\x78\xdf\x24\x38\xaf\x69\xe0\x9c\x48\xf0\x2a\x10\x9c\xa1\xd1\x54\x64\xad\x44\xb1\x5a\x61\x7b\x03\xa3\x65\x46\x9e\x3e\xa7\x34\xc0\x18\x9b\x30\xc6\x09\x30\xc6\x69\x30\x80\xc4\xf8\x85\x4b\xff\x52\x93\x7e\xb3\xa9\x0f\xf1\x57\xce\xbd\xfc\x4d\xa5\x48\xc6\x95\x22\xb9\xa9\x16\xc9\xb8\x5a\x54\x33\x44\x8e\x5e\xc1\x14\x88\xea\x52\x5f\xac\x32\x45\x62\x39\x83\x1e\xd7\xdb\xc1\xe5\xb2\xa1\xd6\x1f\x6d\xcd\xc1\x4f\x50\x16\x12\xb6\x0c\x7a\x16\x80\x56\x10\x8d\x00\x3a\x0c\x9a\xe5\x53\x0b\xb4\xd5\x1a\x89\xec\xc2\x04\x38\xb6\x76\x81\x56\xbd\xc4\xa3\xa3\xb3\x2a\x07\x6e\x7b\x52\x85\xb7\xd6\x5b\x59\x45\xea\xc4\xa9\x95\x6e\xca\xc2\xe3\xb9\xc1\x25\x0e\xfc\xac\x92\x1d\xad\xd0\x58\x15\x1a\xab\x42\x30\x86\xbc\x35\x89\x03\x4c\x53\x51\x02\xd9\x4f\x3e\x01\x47\xed\x44\x4a\x57\xcd\xe2\x55\xb3\x7c\xd5\xac\x00\xe2\xd2\x20\x0a\x57\xea\x13\xfa\x27\xa3\x76\xa8\x9a\x6a\x3f\x01\x91\x22\xaa\x35\x73\x50\x61\x87\x70\xee\xe5\x05\x0d\x8a\xb2\xa3\x85\x6d\xd2\xf4\xa9\x75\xb5\xad\x57\x5f\xe3\xd5\x85\x0c\xcf\xae\x74\x27\xf7\x08\xda\x68\xdd\xde\x1a\x8f\x8f\x76\x78\x0a\x2d\xa3\xb7\x3b\x3b\xa4\x52\x28\x44\x50\x6d\x39\x5e\x40\xd1\xfb\x77\x3b\xce\x03\x15\x90\x5e\xe2\x85\x24\x16\x00\xd4\x48\xa5\x56\x1c\x02\x1b\xff\x65\xf6\x82\xfd\x3b\xd6\xf6\x93\x89\xf4\x83\x15\xaa\xba\xa6\x33\xcc\x0a\x31\x7c\xdd\xc7\xda\xd7\x31\xfb\x3a\x16\xc4\x33\xb8\x41\x8b\xc7\x61\x8e\xba\x8a\x1c\xc2\xda\x79\x0a\xad\x2d\x03\xd4\xa7\xec\xff\x8b\xfa\xa4\x8b\x6c\xc4\x26\x8f\x7c\xb9\x16\x61\xa8\xca\xb6\x4e\xc0\x17\xc9\x7c\x81\xe4\x8a\x32\x4d\xdf\xbb\x96\x1f\x93\xd8\xa4\x12\x6d\xab\x9a\x54\xaa\x1a\x2d\xb5\xb6\x4d\x56\x57\xc9\xc0\xf7\x5a\x94\xb6\xd5\x11\x09\x84\x25\x21\x8a\xe5\xb8\xda\x10\x61\xb5\xec\x19\x59\x4c\x9f\x9e\xd1\xb9\x1c\x9b\x9d\xc5\xac\xb9\xba\x9d\x26\x58\x8a\x49\x22\xa6\xa8\x09\x1b\xdc\x56\x26\xca\x9b\x62\x92\xe4\x29\xea\x32\x68\xac\xe2\xaf\xc4\x0f\x63\xe3\x27\x62\xa0\xc7\x61\x29\xa9\xa3\xf1\x52\x5c\xd1\x64\x6b\x93\x4a\xb6\xd9\x1a\x06\xa1\xd7\xcf\xcb\xa5\x40\x3f\xdb\x69\xc5\xd6\x8c\xe8\xc6\x07\x16\x85\x17\x10\xaa\x2d\x63\x81\xa9\x41\x81\x29\xb5\x4b\xb1\x65\xd4\xec\x0b\x2f\x15\xc4\xb2\x0a\x90\xa2\xb0\x2b\x89\xc5\x49\xce\x7d\x6d\x65\x53\x99\x57\xb1\xa7\xcb\xf8\x2d\xb6\x9b\x52\xe0\xd8\x9e\x2a\x5f\x2e\x6d\x14\x92\x76\x56\x6b\x7f\xa9\xfd\x02\x6e\x8d\x82\x61\x7f\xde\xdd\xc2\x14\xf7\x20\xf7\x71\x04\x1b\x50\xdf\xa6\x81\xd2\xff\x83\x61\x3f\x60\x88\xc3\xeb\x52\xdf\x1a\xe4\x83\x61\x1f\xc6\x84\x8f\xc6\x14\xc7\x77\xda\x9d\x48\xec\x88\x81\xb7\x57\x0a\x3c\x3f\x54\x58\x58\x45\xd2\xd4\xee\x5e\x18\x12\x17\xd6\x25\x04\x55\xec\x07\x17\x4d\x7e\xb3\x02\x1b\x6a\x39\x07\x82\x61\x3f\x8e\x3d\x5b\xa4\x8b\x10\x9b\x74\xa5\x52\x04\xd5\x9e\xf7\x44\x24\x58\xbd\x66\x5d\x19\xf5\x6c\x87\x92\xfc\xf2\x32\x9c\x0e\x16\x30\xdb\x1b\x5b\x80\xb0\xf0\x85\x7d\x79\x51\xb9\x2c\x90\x80\x2c\xef\x60\x05\x81\x57\xe2\x46\x75\x3d\x8b\xf1\x38\xe9\xd3\x99\x0d\xd4\x6b\x2b\xa0\x47\xc1\xc1\x9f\x43\xcb\xd9\xa7\x74\x90\x7a\xef\xb3\xc9\xcf\x96\xed\x00\x47\xe1\x8d\x7d\x45\x53\x0a\xaf\xaf\x73\x9f\xff\x25\xf2\x94\x9c\xf7\x28\xb4\xc1\xf8\x0f\xa3\xab\x40\x00\x14\xe2\x75\xc8\x97\x46\xc9\xc6\x96\xbf\x30\xb2\xb4\x7a\x24\x18\x0e\x00\x65\x32\xb0\xfc\xd0\xb6\x1c\xc8\x29\x6a\xf9\x76\xe0\xb9\x01\x03\x66\xb9\x6d\x12\xfa\x56\xeb\x2a\x60\xff\xc0\xfd\x52\x9b\x60\xec\xca\xa0\xb4\x44\x30\x34\xe1\xc0\xb7\xaf\xad\x90\xe2\x6f\xcb\xb7\xfa\xe4\xfb\xd3\x3b\x8c\x88\x03\xd8\xe0\xaf\xd0\xe3\xc0\x69\x29\x52\xd2\x83\xe0\x91\xac\x24\xfe\xca\x2c\xdf\xf4\x3c\x87\x5a\xee\x1d\x69\xda\x61\xdf\x0a\xae\xb0\xbf\xfc\x77\xc7\xb1\xba\x80\x17\x01\xf5\xe4\x83\x0b\x97\x6c\xb4\xad\x75\x0b\x3e\x32\x5d\xe1\x5d\xac\xc7\x7a\x33\x22\x99\xf4\x1d\xb9\x40\x89\x65\x7f\xa3\xfe\x25\x34\x26\x99\x92\x61\x28\xbe\xe9\x84\x33\xf0\xc5\xc1\xbb\x23\x17\x70\x51\x77\x49\xce\xa3\xd4\xfc\x02\xdd\xfd\x02\xa4\xfe\x02\x04\xf8\xa2\x53\x58\x04\x88\x0a\xb4\xae\x9f\xf2\x37\x5f\x42\x9f\xd5\xb4\x3b\x10\x5e\x0a\xe0\x04\x4c\x85\x27\x8c\x33\xfe\x7f\xf6\xde\x7d\xbd\x6d\x1b\xe9\x03\xfe\xdf\x57\x81\x78\xb7\x91\x14\xd3\xb2\x0e\x96\x0f\x72\xdd\x6c\xe2\xb8\xad\x77\x93\x38\x4f\xec\x76\x9b\xd7\xf1\xeb\x42\x24\x24\xb1\xa1\x48\x95\xa4\x6c\x2b\x89\xbf\x7b\xfa\x6e\xe1\xbb\xb2\xef\xc1\xe0\x40\x80\x04\x29\xea\xe0\x24\xed\xeb\xee\xb3\xb1\x88\xc3\x60\x30\x18\x00\x83\xd3\x6f\xae\xb1\x07\x1e\x5d\x60\x7b\xfa\x77\xd8\xd1\xff\xbd\x0e\x98\x91\xb2\x02\x8a\x2a\x56\x21\xb7\xc5\x5a\xc0\x12\x02\xb5\x92\x0a\x32\x3c\x59\xfb\x43\x82\x70\xc7\x9a\x89\x9a\x8e\x90\x29\x35\xce\x03\xdc\xee\x1a\xb3\x49\xd5\xd4\x6c\xcf\xed\xf3\x67\xde\xd6\x4a\x40\xf5\x91\xaa\xea\x2c\x03\x38\x78\xd4\xc3\x59\x61\x69\x87\xde\x8c\x3c\x35\x6e\xd9\xaf\xc7\x8f\x79\x01\x8f\x04\x7f\x82\x19\x9e\x21\xd5\x0d\xcb\xd4\x5f\xc9\x22\x84\x01\x63\x04\xeb\xfe\x75\xde\xfb\xd1\xa1\x9a\xd0\x30\x77\x75\x4a\x0c\x21\x30\x5a\xf0\x0e\xfd\x86\x84\xfd\x20\x1c\x45\x08\xd3\xaf\x8b\xdf\xcf\xf0\x88\xfc\x4a\xb9\xfd\x1f\x12\x06\xbf\x5f\x56\x87\x71\x3c\xee\x6e\x6d\x11\x7b\x84\x37\x5d\x3f\x26\xa1\x0f\x1d\x1e\x7b\xf5\x20\x1c\xb0\xe0\xd6\x4e\x6b\x6b\xb7\xde\xd8\xfa\x47\x44\xec\xcd\x08\x8f\x08\xd4\xf6\x23\x09\x83\x1a\xa5\x99\xe8\x2e\xea\x91\xf8\x86\x10\x1f\xc5\x37\x81\x50\xa8\x38\x40\x0e\x89\x49\x38\x82\xc3\x61\xd0\xb5\x69\x4a\xcb\xe4\x50\xc0\x20\x87\xe1\xe7\x88\x8c\x7a\x24\x3c\xed\xa3\x2b\x16\xe3\xfa\x36\x41\xdb\xf5\x46\xbd\x01\xdf\x36\x8e\xc9\x20\x08\xa7\xe8\x25\xf6\x07\xf7\x3c\x74\xac\xb8\x07\xa1\x7f\x91\x5b\x4c\x07\x57\x5e\x6b\xf0\x10\x07\x0a\x0a\x3e\x3e\x2b\xb8\xd2\x45\x4d\xf0\x3b\xc5\xe3\x98\xa6\xa7\xa2\x68\xec\x55\x9d\xfc\x59\xe5\x4e\x8f\x38\x89\x1a\x64\xdb\xda\x42\x87\x3f\x40\x1f\x32\xa6\x84\x2e\xa0\x24\x04\xde\xd4\x94\x15\x80\xae\xc1\x95\x22\x6a\x90\x86\xcf\xf0\x34\x69\x21\xc1\xd7\xf8\xb5\x45\x17\xe2\x06\x82\xca\x80\x42\xfe\xd4\xfa\x91\xb6\xf7\x9b\x1a\x2e\xa0\xc7\xcf\xee\xb5\x39\x3d\x8c\xfc\x69\xe8\x58\x3b\x4b\xcf\xcd\x03\x12\xbf\xc6\xb1\x7b\x9d\x37\xd1\xee\x88\x49\x39\x0c\x82\x1c\xd8\xfd\x6a\x7b\x9f\x4d\xc6\xe8\xf9\xc4\xf5\xe2\x4d\xd7\x47\x23\x12\x0f\x03\x07\x85\x02\x62\x3a\x82\xdd\x21\x50\xb3\x6b\x12\xba\x7d\x97\x38\x54\x65\x7b\x04\xf9\x50\x78\x9d\xd6\x83\xb2\xf3\x0a\x8f\x19\x8e\x1e\x63\xaa\x4a\x4b\xb5\x50\xe5\x15\x1e\xd3\x86\xcd\x4a\xe5\x15\x1e\x1b\xc4\xb2\xbb\xb4\x58\x46\x78\x7c\x84\xed\x21\x39\xf2\x08\x0e\xf3\x0c\x96\x4e\x8b\xcb\x46\xa4\x7e\x41\x3c\x12\xe7\x49\x72\xb7\xb3\x9f\x4a\xfe\x13\xc9\x93\xe8\xee\x4e\x33\x95\xf6\x67\x1c\xe5\xa6\x4d\xb3\x71\x56\x40\xb7\xad\xd8\x4d\x47\x00\x48\x17\x21\x4c\x73\x22\x9b\x66\x15\xbd\x3a\x0e\x50\x14\x07\x21\x41\x1f\xc8\x74\x93\x69\xea\x18\xbb\xa1\xd9\x02\x52\x60\xa8\xd5\xc1\x0a\xbc\xfc\xdf\xa1\x0b\xe2\xc7\xd4\xec\x64\xa6\x44\x8a\x1e\x0c\x5c\xb4\xe0\xd4\x3c\xfd\x8a\x57\xa5\xca\x33\x27\x36\x30\xa0\x8c\x30\x03\x98\xaf\xdf\xf9\xd9\xd7\x21\xe2\x69\x95\x03\xb0\x06\xea\x8a\x50\x01\xe0\xbf\x26\x76\x16\x6d\xda\xb4\x6c\x9f\x27\x31\x98\x81\xf8\xf7\x9c\xa4\xba\x45\x4c\xa9\x4c\x93\x32\x2e\x20\xe5\xa5\xb2\xbc\x8e\x48\x0c\xcc\x4e\x2f\x1a\x97\x16\x4b\x4e\xad\x6c\xbe\x88\x5e\x5b\xdb\xda\x42\xcf\x1c\x87\xf7\x0c\xa8\xf7\xef\xa2\x92\xbf\xd7\xd7\xc4\x4f\xc5\x5d\x82\xcd\x55\x4f\x53\xc5\x03\x43\xca\x8b\x8a\x03\x7a\x57\xb9\x54\x52\x33\x55\x34\x25\xaf\x0f\x40\x3d\x14\x25\x34\xa6\x1a\x82\xc2\x29\xea\x67\x4c\x15\x69\xb4\xce\x28\x2d\x63\x27\x85\x68\x43\x4f\x2d\x74\x72\x53\xaa\xa7\x82\xf7\x2a\x6a\x26\xfd\x87\x4c\x73\xbb\xc8\xee\x0e\xef\x22\xd4\x4e\x29\x4a\xb8\xd7\x92\x6b\x90\x67\x82\x70\xee\x22\xb5\x69\xea\x4b\x3e\xe3\x88\x2e\x3e\xe8\x04\x1b\xdc\xf8\x0a\x0c\x3b\x78\x89\x20\x61\x3c\x05\x9c\xe8\x08\x56\x28\xac\xc7\xfd\x2e\x7a\xd6\x93\x27\x70\x3d\xed\xc9\x13\xf4\x3a\xf0\x37\x79\x77\x54\xa6\x69\x3b\x20\xa1\xcd\x86\x4f\x61\x33\xa3\x33\x02\x70\xab\x60\x2c\x1d\x9f\xa1\x68\x4c\xec\xf9\x8d\x24\x46\xad\xfe\x81\x4c\x23\x30\x91\xfa\x41\x88\x46\x74\x08\x70\x48\x8c\x5d\x2f\x32\x59\x3c\xcc\xc4\x69\xd4\x9b\xdc\xc4\x49\x59\x40\xd2\xe2\x61\x73\xae\x69\x91\xc0\x2b\x78\xae\x0d\x3d\x7f\x4e\x48\x38\x4d\x19\x32\x7c\x34\x11\x66\x0c\x95\xad\x14\xb4\x2e\x55\x93\xc1\x22\x07\x96\x1f\x83\x80\xed\x65\x3f\x11\x1d\x17\xc3\x46\xa5\x12\x00\xa7\x41\x10\x70\xc7\x73\xff\x18\x04\x6a\xc7\x84\x7d\x44\x69\x2a\x50\x81\x55\x7d\x72\x43\x53\xa9\xb6\xc2\x05\xb3\x48\x7a\x95\x4b\x54\x75\x63\x12\xf2\x35\x29\x5d\x9e\x21\x37\x02\x17\x01\x83\x09\x0e\xb1\x1f\x13\xe2\xd4\x74\x72\x95\xa1\x5b\xd1\x69\x35\x28\xad\x66\xe5\x52\x1f\x26\x21\x31\xb7\xa2\x54\xcb\x43\xd1\x5e\x19\xfd\x54\xef\x2a\x32\xbc\x2b\x3b\x45\x55\xda\x63\x26\x03\x84\x96\x65\xe8\xc1\x85\x40\x7b\x73\x6c\x0f\x3c\x13\x77\x19\x72\xfb\xf0\xde\x02\xdb\x03\xe8\x17\xba\xe0\xa4\xaa\xdc\xcb\xb5\x4d\xa4\xf1\xc1\xaa\x0f\xa8\xc9\x89\x43\x06\xd9\xee\x2a\x41\x3a\x6b\x0d\x89\xfd\x41\x74\x41\x28\x81\x76\xf5\xb1\x74\x4c\x22\xa9\xea\x6e\x6f\xd0\xa1\x5a\x4c\xca\x27\x0e\x2f\x42\x9a\x51\x6c\xa2\x34\x70\x2a\x14\xfe\x24\x3a\x56\x3d\xcc\xa8\x94\x4d\x49\x94\xe1\x8a\x72\x1f\xd1\x55\x80\x58\x8c\xbb\x11\xf2\xdc\x0f\xc4\x9b\xd2\x21\xec\x77\x79\xb3\x44\xac\xcc\x4b\xaf\x77\x92\xc1\x60\xde\xf5\x0e\x65\xa9\xfc\xea\x45\xe1\xdb\xc8\xb0\x05\x3d\x7a\xd6\x42\xe6\xaa\xee\x26\x9a\x57\x35\x5d\x94\x96\x84\xc1\x71\x4c\xee\xea\x42\x25\x73\xd1\xb4\x50\xcb\x42\xed\x4b\xd3\xfa\x82\x35\xa0\xab\xe9\x7b\xaa\x07\x94\xe1\x03\x3d\xcd\xf4\x1b\xe5\x08\x8a\xef\x24\x68\x23\x82\x71\xa3\xc1\xe4\x93\x89\xaf\x67\x2a\xe0\xdd\x85\x54\x68\x3a\xe8\x77\x8f\x4c\x2a\x65\xce\xc2\x3c\x0c\x64\x86\x10\xa5\xd6\xd9\x91\xa4\x59\x78\x7d\x3a\xb5\x4b\xc0\xba\x21\x8e\xd4\x25\x06\xed\x83\xd7\x38\x74\x83\x49\x84\x7e\x67\xae\x9d\x7f\x47\xe2\x4a\x58\xd2\x77\x5e\x3d\xfb\xed\xea\xec\xd9\x8f\xc7\x57\x27\xaf\xcf\x8f\x7f\x3a\x7e\x8b\x0e\xd1\x7e\xa3\xb1\xdb\xdc\xdf\x6f\x75\xb6\x77\xb7\x1b\xfb\xfb\xcd\x54\x57\x77\x48\x4c\x27\xa6\x89\x1f\xb9\x03\x9f\x38\x88\xce\xa6\x03\xb1\xf4\x4e\x08\x87\xe4\x24\xfa\x85\x1d\x33\x6d\xfd\x6f\xf5\x69\xb7\xf1\xf9\xa2\xb9\xb9\x7f\xf9\xde\x79\x52\xfb\xe7\xd6\x8c\xae\x87\x29\x31\xd7\x61\x43\xf4\x26\xed\x88\xcc\xd0\x5d\x60\xc7\x31\xe9\x46\x3c\x1d\x43\x89\xbd\x43\x17\xcc\xaa\x3d\x4c\x0b\x80\x19\xe6\x93\xf1\x98\x84\xa8\x17\x4c\x7c\x07\xec\x12\xc1\x91\x64\x63\xfe\x6e\xa9\x52\x28\xdc\x95\x73\xa3\x13\x9a\x46\xa8\x91\x6a\x7d\x4b\xe3\x5e\xfc\x90\xb6\x7d\xa6\x1d\xbb\x48\x98\xf8\x52\xeb\x1f\x3d\xe2\xd9\xb8\x0a\x0b\xe7\x40\x72\x6b\xae\xc2\x84\x53\xa1\x6b\x73\xd1\x7e\xf5\x98\x44\x31\xef\x23\x52\xf9\xf9\xc2\xfd\x07\xb4\xd9\xa4\xfd\x86\x7d\x7d\x87\x9a\x48\x1c\x2e\xb3\x10\xb9\x74\x30\xcf\xa1\xbc\xa2\x06\xe5\x2f\xbc\x38\xf7\x15\x94\x7f\x1e\x4d\x65\x55\xce\x1a\xb0\xe7\x43\x37\x12\xd3\x2d\x9d\x5e\x82\x20\xa2\xf3\x0b\x1d\xb7\x1c\xc4\x36\x9f\x2f\x7e\x3f\x0f\x5e\x42\xf6\x05\xb6\xf5\xe2\x80\x0b\xfb\x0b\x6c\xc6\x2d\x3e\x39\x71\x79\x89\x13\x9a\x32\x33\x12\x93\x08\x73\x4f\x92\x33\xdb\xf0\x24\xac\xa5\xeb\xaf\x4e\x5e\x5f\xfd\xfa\xec\xe5\x2f\xc7\xf9\x3b\x5a\x32\xcb\x89\xdf\x77\x7d\x37\x9e\x96\x48\x5a\x69\x57\xcc\x53\x98\xd2\x73\x79\xd2\xec\x8c\x93\xdb\xd5\x78\x8f\x2a\xd9\xa1\x0e\x33\x3a\x9b\xd7\xb5\x5e\x8a\x05\x7e\xba\x6f\x15\x5e\xb5\x34\x6c\x3f\x17\x9f\x27\x4d\x7c\x1c\x4e\x7f\x47\x37\x6e\x3c\x0c\x26\xb1\x38\x4f\x82\x0e\x18\xc5\x41\xe8\xfa\x03\xaa\xf3\x18\xde\x1e\x14\x8c\xde\xc9\x71\x0b\x65\x29\x7b\xcc\x82\xc7\xc9\x94\x4f\x89\xa7\x94\x2f\xc9\xae\xae\x88\xe8\x32\xc4\xc6\xe3\x31\xb5\x79\x79\x02\xc3\x01\xc8\x2f\xb4\x06\x20\x09\xad\xc1\x4c\xd6\x83\x16\xc9\x23\xf8\x09\x76\xde\x31\x00\x50\x37\xb4\x42\xe1\x01\x76\xa9\x85\x02\x5f\xd5\xe4\xad\xc7\x93\xf5\xc1\x99\xf0\xb2\x61\x5e\x48\xd4\x52\xf3\xfb\x08\xc7\xf6\x30\xbd\x34\xa7\xed\xeb\xfa\x49\xe8\x18\xc7\x43\x7d\xae\x7f\x41\xc8\x98\x5a\x4e\x74\xbe\x7f\x5f\xff\xfc\xfe\xa2\xfa\xb4\x7b\xf1\xbf\x17\xef\x2f\x2f\x9f\x7c\xae\x5e\xac\x57\x2e\x6b\xd5\xa7\xdd\xea\xd3\x47\xef\x9b\xb5\x8b\xff\x7d\xff\xfe\xf2\xf3\xfb\xf7\xf5\xda\x93\xa7\xef\x9b\xb5\xf7\x97\x5b\x7c\x53\x95\x9c\x44\x6f\x3c\xec\xfa\x82\xce\xff\xbe\xbf\x79\x52\xc2\x58\xd0\x78\x85\x73\x34\xba\x9c\xc4\x3a\xb7\xab\xb0\x1d\xe4\x59\x1e\x33\xaa\x2f\x4d\x0b\x75\x58\x19\x22\xa6\x69\x0b\x0c\x8f\x5a\x5d\x66\x98\x09\xff\x21\x53\xb9\xdd\xae\xac\x7a\xdd\x3e\xaa\x72\xe5\x90\xf3\xb6\xae\xbd\xe0\x61\x93\x1f\x87\xd1\xf6\xe3\x77\x06\xd5\x31\xea\x40\x5c\x2e\x65\x2e\xac\x34\xd3\x40\x86\x09\xb7\x5e\x6a\x18\xaf\x28\x0d\x94\xf7\xb8\x52\x27\x7f\x42\x25\xcd\xdc\xa9\x07\x87\x3c\x48\x53\x0c\xd5\x20\xa1\xd4\x1e\xa9\xda\x97\x8a\x64\xc6\x0a\x6f\x21\xe5\x11\x02\x63\xc9\x95\x17\x1c\xb8\xf8\x72\xed\x94\xff\x10\x53\x1f\x2e\xbc\x0b\xb0\xdc\x25\x94\xd4\x05\x23\x7e\xcf\x63\x40\xe2\xb3\x78\xea\x11\xe6\x2a\x28\xf5\x02\xf7\xbe\x50\x10\xa1\x50\x5a\xde\x99\xfb\x91\x64\x5e\xbd\xde\x17\xca\xde\x80\xc4\x0c\x5e\x61\xe5\x25\xe6\x61\xf1\x4b\x3f\x41\x47\x43\x1c\xc6\x47\x41\x00\x17\x9f\xe2\x6c\x95\xe7\xb8\xd7\xf3\xe0\xb7\xb8\xb4\xdf\xe2\xc4\xaf\x69\x1c\x1c\x05\x7e\x34\x19\xd1\x05\x35\x1b\xc5\x70\x28\xbd\xca\x42\x40\x5d\x0c\x6f\x34\x22\xeb\xa8\xd8\xa2\xe6\x78\x0b\x1d\x22\x99\xa8\x2e\xd6\x21\x5c\x4a\x61\x5a\x3e\x34\xc3\x85\x7b\x09\xc2\x09\x41\x2c\x77\xc9\x56\x43\xd8\xa2\x9f\x30\x14\x4b\x6d\x61\x7c\xf4\xc3\x60\x04\x4c\x70\x77\xb4\x6c\x66\x66\x4e\x5d\x60\x93\x9f\xdf\xc4\xbe\x71\x9d\x78\x08\x01\x5d\xf4\x09\xae\xc9\xc2\x31\xcf\x51\x30\xf1\xe3\x2e\x6a\x08\x37\x8c\xd4\xb6\x3b\x7a\x76\xf4\xf3\xf1\xd5\xeb\x5f\x5e\xa1\x43\xd4\x6a\x34\x1a\x2c\xe6\xec\xcd\xb3\xd7\x57\x67\xe7\xef\x5e\x1e\x73\x8a\xe3\x20\x72\xa9\xb8\xba\xa8\x82\x7b\x51\xe0\x4d\x62\xe6\x70\x24\x0e\xc6\x5d\x54\xd9\xa4\x39\x1b\xe3\x5b\x08\xf2\x48\x9f\x16\x02\x97\x73\xb1\x43\xfb\x0c\xff\x1a\xe1\x70\xe0\xfa\xfc\xa3\x07\x7b\xb1\x5d\x54\xf1\x03\x9f\x91\xba\x19\xba\x31\x39\x1b\x63\x9b\x74\x51\x65\x1c\x92\x8a\x60\x13\xf8\xb8\x7a\x79\x72\x76\x8e\x0e\xd1\x45\x65\xe4\xfa\xff\xa5\xf5\xab\x58\xa8\x32\xc2\xb7\xf2\xf7\x8d\x0c\x74\xfd\x9f\x89\x3b\x18\xc6\x3c\x45\xf2\x31\x94\xbf\xe2\x60\x4c\xff\x50\x5e\xe9\xdf\x7e\xe0\xc7\x74\xbc\x81\x30\xd7\x27\x49\x16\x5e\x05\x46\x8a\xf2\xaf\x04\xbe\xe4\xb9\xf9\xe7\xdb\x54\x9e\x73\x56\x06\xff\x7a\x1e\xc4\x71\x30\x4a\xe8\x88\xcc\xec\xeb\x6d\xc2\x2f\xfd\xe4\x59\xd9\x07\xcf\x79\xc9\x1b\xed\xf8\xd9\xd9\x2f\x6f\x8f\x5f\x1d\xbf\x3e\xbf\x82\x66\x3a\x79\x81\x0e\x91\xf4\xd1\x74\x35\x22\x38\x9a\x84\x60\x38\x5f\x45\x63\xec\x57\x54\x65\xc7\x13\xaa\xed\xd4\xb0\x8e\x09\x0c\xed\x55\x36\xef\x2b\x46\x27\xd5\xfa\x44\xe2\x75\xd8\x3f\x38\xed\x43\xba\x1a\xfa\x41\x5b\x1e\x80\x7b\x2e\x93\xbd\xca\xa2\x37\x50\x65\x7c\x5b\x91\x37\x37\xd5\x38\xfd\x95\x82\x8d\x47\xc4\x3b\x0f\x5e\xb9\x8e\xe3\x91\x97\xae\x4f\xaa\xc9\xad\x53\xae\xe0\xe0\x69\x8e\xdc\xc6\xf5\x68\xec\xb9\x71\xb5\x52\x61\x4f\x75\x69\x6c\x3f\x08\x47\x98\xce\x19\x70\xb7\x30\x0e\xa3\x7a\x48\x9c\x89\x4d\x92\xdb\xae\xd5\x90\x44\x13\x2f\xe6\x07\x83\x82\x57\x5a\x51\x7e\xb0\x78\xc8\x8e\x16\xa7\xba\x77\xd0\xe4\x82\x35\x67\xfd\xe2\xb2\x6e\x07\xbe\x8d\xe3\xaa\x61\xd0\x60\x65\xd4\x2c\x74\x51\xd9\xac\x58\x92\xde\xcb\xe0\x46\xd0\xbb\xd4\xaf\x74\xcf\x47\x14\xe8\xf1\x13\x4d\x0b\x5d\xe8\xbe\xae\x12\x11\xd4\xff\x08\x5c\x9f\x89\xe7\x2e\x71\xa7\xaa\x4c\xe2\x29\x67\xaa\x49\x4c\x35\xa2\xbf\xb5\x35\xc9\x69\x72\x28\xc5\x63\xf3\x45\x1b\xa5\x54\xa0\x52\x41\x1b\x88\x45\xa2\x0d\x43\x0b\x47\x35\xaa\x1f\x5d\x9a\x2a\xab\x94\xe0\xcf\x7c\xea\x91\x8b\xe8\x12\x92\x1d\x54\x78\xbd\x2b\x62\x77\x53\xd6\x4c\x58\x0a\x99\x8a\x89\x88\x8c\x2e\x4d\x3d\x6d\x52\x12\xaf\x37\x7f\x40\xb0\x14\x4e\x26\xab\xe6\x25\x5c\x0b\x99\xf8\xe2\x91\xec\x53\x3d\x92\x0e\xad\xc9\x2b\x34\xf6\x3c\x5d\x4d\x4e\xad\x54\x11\x2a\x4c\xd1\x32\x17\x5c\x75\xb7\x60\x3e\x5c\x73\x75\xa3\xb3\x28\x14\x8f\xd4\x75\x41\x7f\x62\xa3\x3d\x1d\x56\x11\x1b\xdf\xba\xa8\x01\x57\x7e\x98\xa2\xf1\x0e\x44\xc7\x08\x70\x88\xcb\xdf\xf7\x48\x59\x48\xbd\x30\xaa\x83\x48\x0a\xf3\xc7\x7f\xc8\x94\x75\x31\xda\x26\x9b\x94\x9a\x42\x41\x8a\x42\x99\x8e\xea\xc9\x44\x74\x21\x28\x5c\xa6\xdd\xd2\xce\x48\x9e\x3c\x8c\x0a\xa7\xca\x95\x00\x65\x98\x3b\x1b\x63\xc0\x1b\x08\x6c\x68\x9c\xfa\x80\xc4\xdc\xcf\xdf\xf3\xe9\x89\x53\x35\x0c\x98\xbc\x23\xc2\x2b\xfe\x14\xa1\xa4\xd3\x17\x94\x90\x72\x26\x08\xc3\xac\x7c\x82\x9f\xca\x57\x8f\x48\xe2\xa8\xaf\x5a\x71\x9d\x8a\x65\x1a\xc3\x65\x76\x59\x48\x2f\x70\xa6\x75\x3c\x1e\x13\xdf\x39\x1a\xba\x9e\x53\x4d\x73\xaa\x8d\x26\xc5\xa5\x42\x3b\x55\xac\x74\x1b\x6b\x0e\xeb\x92\x39\x9f\xf7\xbe\x9a\x78\x83\x92\xa6\x4d\x75\xe8\x28\xf0\x63\x02\xdb\xed\x51\x2c\xa0\x1a\xd8\xda\x1c\xae\xa5\xa5\xb3\x0c\x48\xfc\x3c\x98\x80\x05\x7d\xe4\xb9\xc4\x8f\xdf\xd2\x7e\xc0\xe9\xb3\x7c\x30\x54\x1c\x26\xfa\x4c\x29\x31\x8d\x48\x14\x1b\xc2\xd8\x07\xbf\xc7\x8f\x66\x2a\x10\x3a\xe4\xc4\x95\x07\x40\x1b\x1b\x6a\xae\xc4\x38\x42\x3f\xe8\x46\x51\xa2\x0d\x39\xe9\xf9\xbb\xad\x7c\x3e\x68\x8d\xee\x4c\xe3\xbe\xe0\x09\xa1\x3b\x64\xc3\x1e\x48\x35\x3d\x8d\x16\x76\x6d\x65\x14\x64\x2b\x97\xd4\x08\xc8\x02\xab\xc4\x4b\xc6\xbe\x61\x3c\xf2\xd0\x21\x22\x5e\x3d\xb8\xf1\x49\xf8\x42\x68\x9a\x50\x39\xae\xd0\xa2\xcf\xf7\x82\x5b\x68\x0f\xb0\xf1\x1a\x96\x30\xec\xb8\xe0\xb7\xb6\xd0\x49\x1f\xdd\x10\xe4\x04\x7e\x25\x46\x43\x7c\x4d\xd0\xe0\xf9\xd1\x5b\x0b\xfd\x31\x89\x62\x44\x57\x98\x0d\xab\x81\x42\x0c\x17\xec\xe2\x21\xf6\x11\x09\xc3\x20\x64\x59\x9f\x7b\xd8\xfe\xf0\x9c\x84\xe1\x14\x75\x2c\xe4\x9e\x9e\xa1\x36\xaa\x06\xa1\x3b\x80\xc7\x1f\xee\x9b\x61\xe0\x93\x9a\xb2\x27\x10\xf4\x29\xdb\x46\x2d\x82\x51\xba\x22\xc7\x5d\xe9\xf6\x9a\xb1\x9f\x97\xab\x5a\x4b\x1b\x26\xfc\x09\x21\xad\x6c\x2f\xb8\xad\xc7\xc1\x18\x6d\xa0\x1b\xd7\x77\x82\x9b\xfa\x18\x0f\xc8\x3b\x2e\xe6\x4d\x90\x63\xdd\x06\x52\xe7\xc1\x98\x6d\x26\x31\xe1\xd0\x8c\xf4\x97\x9e\xf3\x37\x53\x4e\x6a\xff\xf1\xbd\x3c\x65\xc7\x49\x3a\xf0\xb5\xe5\x82\x90\xbb\xf0\x8d\x82\x90\x2e\x97\xc0\xca\x53\x36\x89\x92\x5d\x22\x72\x4d\xfb\x23\x02\xcf\xa0\x7c\x83\xc6\x98\x8e\x41\xa6\xb1\xbd\x24\xf6\x33\xe8\xa3\x11\x76\x7d\xb8\x94\x4f\xcb\x88\x87\x04\x45\xd7\x03\x44\x98\x3e\xac\xa9\x6e\x83\x05\x15\xfe\xdf\x27\xe0\xe7\x37\x8b\xf1\xf5\xee\x4e\x9e\xb1\xe6\x2d\x6f\x8d\x3e\xce\x53\x69\xaa\x50\x15\x8b\xb3\xa7\x99\x24\xdc\x53\x39\x14\xda\x65\xef\xe9\x42\xda\xb6\x2c\x0b\x93\x36\xda\xe4\x39\xa1\x29\xf8\xbe\x24\xe3\x2f\x27\xcb\xbb\x24\x4b\x1c\x8c\x6b\x5a\xb3\xa8\x3b\x30\x85\x57\xa9\xbf\x34\xc6\xd4\x15\xdb\x22\x2b\x78\xc7\xb3\xbd\xa2\x77\x3c\xec\xa8\xd5\x42\x63\xbe\x50\x08\xfa\xa9\x5b\xf9\x41\x3f\x81\xe6\x91\x01\xe5\x98\x37\x3c\xe4\x11\x7b\x81\x8f\xaa\x74\xd2\xe5\xe7\xbc\x7c\x45\x2d\x60\x68\x44\x9a\xea\x18\x1d\xa2\x8d\x71\x0d\x7d\x4f\x57\x26\x9f\x3f\x23\x1f\x7d\x8f\x5a\x12\xac\x66\x83\x73\xc3\xab\x00\xb7\x03\x1b\xbc\x16\x51\x4d\x10\x19\xd3\x75\x4d\x33\x37\x93\x8f\x36\x51\xf3\xd2\x42\xf0\x57\xcb\x4c\x9b\xc8\x17\x37\x21\x5d\x2a\x33\x48\x53\x43\x4f\xd0\x58\x06\x37\xc4\xc3\xcf\xbe\x17\x04\x61\xd5\x95\x18\x4e\x40\x88\xc6\xa6\x0b\x74\x29\x9b\x6e\xc2\xa7\x96\xa1\x69\xcc\x80\x36\x80\x45\xf6\x43\xe3\x51\x5d\x76\xd1\xd8\x2a\xa7\xb2\xc9\x83\x28\xb3\x55\x17\x6d\x22\xb7\x51\x33\xe3\x8a\x34\x0b\x2f\x3a\xaf\xf6\xf5\xdb\xaa\xf7\xf5\xc6\x21\xe9\xbb\xb7\x6c\x4f\x8d\xdd\xdd\xa1\xdf\xe8\x10\xad\xff\x73\x5d\x5d\x18\xbf\xc2\x63\x9a\xed\x6e\x6d\xed\x15\x1e\x6b\x2f\xdb\x47\xa9\x6f\x70\xc2\x9b\xdc\xb9\xa5\x23\x0a\xb4\xf5\x10\x47\xca\x1d\x90\x0f\x64\x9a\x9a\xcc\xab\xbc\xe8\x0d\xd8\xb6\x62\xc3\xac\x1b\xc9\x77\xcc\x03\x12\x17\x66\xa7\x89\x2f\x54\x12\x97\x32\x6b\x94\xce\xaa\xad\xe7\x91\x21\xab\xe8\x56\x07\xe9\x12\x24\xcd\x90\x8c\x82\x6b\x62\xe6\x48\xbd\x03\x85\x0e\x91\x4a\x59\x23\x28\xd3\xf0\xba\x32\xa4\x2c\xb8\xa4\xcd\x59\x62\xf1\x49\x4d\xe0\xd6\xad\xe1\xdd\xbb\xdc\x6f\x4b\x93\x64\xcf\xeb\x44\xe8\x45\xe3\x12\x56\x5b\x8c\xa3\xda\x8c\xc2\xe8\xb2\xd6\x50\x16\xdf\x9a\x8c\xd0\x21\xba\xe0\x57\x8c\x17\x2c\x9e\x52\xa9\x8f\x27\xd1\x50\xa6\xa8\x47\x9e\x6b\x93\x6a\x53\x18\xd6\x5c\x50\xec\x72\x1f\x67\x8b\x75\xdd\x1c\xc6\xf8\x55\xd4\xa5\x59\xe3\x83\x2a\x30\xa7\x8b\x47\xe7\x8c\xa5\x93\xbc\xf1\xfb\xd7\x39\xcc\xc9\x1b\xe0\xcb\x72\x27\x2e\x8d\x03\x7b\x9f\xc0\xfb\x7d\x46\x82\x96\x70\x81\xaf\xb3\x7f\xa7\xf3\xcf\x29\x25\x5d\x05\xfc\x23\x1b\xb9\xe7\xde\xea\x1b\x4b\x71\xbe\xb1\xc1\xbc\xdc\xab\xeb\x5b\x1e\xc0\x04\x38\x1a\xc7\xd3\xd5\x29\x78\xfa\x80\x2d\x7b\xa8\x05\x85\x62\x7b\xa8\x94\xd9\x5f\xb2\xd0\x7e\x4a\x63\x2c\x53\xe3\x00\x99\x64\xa1\x22\xc7\xd9\x11\x1e\xcb\x67\x45\xfd\x64\x65\x32\x82\x97\x27\x3e\xb9\xe1\x6f\x4a\x60\x8d\x70\x14\x8c\xa7\xea\x50\x5b\xe7\xd3\x35\x3f\x5f\x73\xe1\x7a\x8d\x4d\x6d\x8d\x57\x78\x5c\x13\x57\x25\x69\x6d\x53\xa6\x0b\x3b\x29\x40\x9f\x60\x2c\xa7\x8b\x22\x65\x8c\x64\x53\x03\x5f\xcf\xc0\x03\x04\x76\xb1\xb9\x37\x45\x70\xcd\xce\xb5\xf9\xa3\x87\x20\x84\xab\xdd\xec\xf9\xcc\x07\x32\x55\xcf\xf8\xd9\x66\x7d\xf6\xbc\x40\x9c\xf3\xa9\x20\x89\xda\xeb\x09\x86\x10\xc4\x39\x4f\x63\x25\x06\xca\x82\x55\x31\xb0\xd2\x0f\x8c\x45\xa5\x5c\x71\x2c\x7b\xe1\x8a\x5e\x0c\x6c\xe5\xa5\xef\x57\x03\x59\xb6\x00\x2c\xe4\x0c\x5b\x28\x48\x96\x47\xd0\x12\xfe\x35\x09\x63\xe5\xec\x99\x12\x51\xeb\x2d\x0e\x84\xd3\xa7\x3b\x22\x5c\x93\x3c\x2f\x93\xce\x44\xda\x36\xe6\x88\xb6\xfd\xdd\x12\x16\xeb\x08\x8f\x4d\xf6\x4b\xe1\x8b\xa4\xaf\x00\x0d\x6b\x07\x5e\x90\x6f\xb7\x77\x16\xc4\x6f\x6d\x5e\x5d\x85\x83\x5e\xbe\xdf\xa9\xdd\xf6\xc2\xb8\xb0\xd0\x25\x0a\x28\x2f\xc8\x71\xfb\xea\xca\xc1\x05\xa8\xeb\xed\xdd\x05\x61\x72\xb7\x67\x2f\x8e\xb6\x17\x24\xdd\xb9\xba\x62\xea\x5b\xc0\xf5\x82\x70\x6b\x3b\x57\x57\x6c\x0f\xa9\x80\xf4\xfe\x62\xa4\x77\x4b\xe0\x06\xb7\x77\x3b\x02\x7d\x77\x35\x08\xbc\x1c\x78\x41\x5c\xfa\x48\x6e\x7c\xf4\x2c\x64\x2b\x4b\x93\x9e\x7a\x59\x83\xed\x97\xaf\xf3\x6b\x1d\xeb\xe8\xe9\xec\x3d\xf3\xdd\x99\xd8\x93\xbd\x1a\x1f\x54\xbb\xa8\xca\x0b\x60\xfa\x01\xf8\x96\x65\xd4\xc8\x40\x56\x92\xe4\x14\x59\xdb\x51\x8a\xd5\xaa\x5d\x1a\x8b\x96\x8f\x05\x82\x3e\x7c\x0a\xa6\x6b\x94\x56\x0f\x1d\x22\xdb\x2a\xd1\xef\x4d\x35\x47\xdd\x72\xfa\x66\xca\x2b\xeb\xd7\x53\xa7\xda\x05\xab\x53\x28\xe7\x82\x1a\x98\x99\x78\x81\x63\x52\x48\x51\x8e\x2c\x45\x24\xf5\xb9\xba\x57\x2b\xa4\x98\x8c\x82\x85\xaa\xc0\x15\xbc\x0e\xc6\xc5\x69\x1f\xf6\x26\x15\x34\xd5\xc7\x8f\x93\x24\x71\xc0\x8f\x5e\x52\x69\xe0\xc6\xd2\x6b\xfc\x7a\x16\x47\xca\x48\x54\xc4\xd2\xa2\xea\x5d\x63\xfd\x37\x67\x4b\xa0\xf0\xe9\xe0\x57\x02\xd0\x3c\xa2\xca\xb6\xd2\x5d\x85\x3c\xdf\xa4\x0e\x0e\x3f\x90\x70\xe5\x57\x85\xf2\xae\x44\xf5\x42\x77\x30\x8c\x0b\x0a\x2c\x21\x22\x02\x22\xb2\x73\x45\x54\x82\xc4\x10\x48\x84\x83\x1e\x37\x07\x17\xa5\x33\x10\x74\x96\xc3\x3f\x7a\xcb\x09\x98\xef\xae\x0d\x23\x4f\x58\xad\xe6\x7b\x6b\x25\xca\xe9\x43\x39\xc3\xc8\x5b\x74\x87\x96\x1d\x49\xe4\xe3\xdd\x37\xe1\xed\xbe\x02\xd7\x48\x9b\x87\xef\x43\x51\xe2\x4c\xcf\xe8\xaa\xb4\xbe\xcb\xf6\xaf\x84\x2a\x00\x20\xde\x96\x50\xc4\x35\x71\x2d\x16\x1d\xa2\xf5\xf7\xef\xa3\x27\xd5\x8b\x8d\xcd\xcb\xa7\xef\xdf\x3b\x1b\x35\xfa\xb9\x2e\x2e\xbc\xbe\xce\x24\x78\xf2\xfe\x7d\x1d\x12\x56\x9f\x76\x2f\xc8\xf1\x65\x92\xf1\xa9\x9e\xf5\xcd\x5c\x59\xbf\xd3\xf2\xfe\x4c\x6e\xdb\x70\xc1\xf6\x1f\xd5\x8b\xc6\xe6\x3e\xde\xec\x5f\x7e\x6a\xdf\xd5\xfe\xb9\xa5\x24\xd8\x49\x27\xd8\x51\x13\xbc\x1d\xf4\x4e\xf8\xc3\x1f\xb6\x4e\x7c\x4b\x06\xc7\xb7\xe3\xea\xfa\xff\x86\x83\xde\xfb\xf7\xd5\x75\xb4\x81\x2e\x42\x72\x62\x21\xf1\xcf\x25\xda\xa0\xfc\xd6\xfe\xb9\x5e\x53\x88\xbc\x21\xa1\xcd\x8e\x2d\xf3\x89\xbc\xa1\xf9\xd9\x3f\x66\x22\x38\x9f\x15\x6c\xe4\x85\xfe\xf3\x3a\x87\x56\x3e\x47\xd8\xc8\x52\x1e\xad\x9f\x23\x2f\x87\xd4\x30\xf2\x12\x4a\xaf\x0b\x2b\xf7\x73\xe4\xe5\x31\x34\x8c\x3c\x6c\x24\x93\x66\x88\x6b\xa3\x8f\x47\x00\x2c\x0e\xc8\xa0\x9e\x6b\x93\x1e\x6c\xd7\x34\x6e\xfb\x8d\xfe\x5e\xbf\x0f\xe8\x9f\x7e\xec\xfe\x39\x21\x70\xf1\x0b\x62\x30\xe9\x39\xbb\x10\xf3\xe7\x04\xd3\x90\x46\xa3\xdf\xe7\x69\xff\x9c\xe0\x11\x0e\x5d\x1f\x52\xee\xf6\xfb\x7d\x67\x1b\xc2\x3f\x4e\x42\x41\x96\x27\xed\x11\x77\xc0\x82\x3a\xfd\x8e\x63\x43\x90\x1b\xfd\xc9\x4b\xef\x93\x6d\x1b\x72\xf6\x3c\x6c\x7f\x60\x85\xd0\xff\x78\x90\x6f\x0f\x89\x83\xbd\x51\xe0\x3b\x3c\x79\xcf\x76\x58\x1c\x23\x40\xd3\xf2\x72\xbc\x09\xb9\x76\x03\x8f\xc4\x34\x7c\x0f\xb7\x7a\x04\xb0\x8a\x7b\x61\x70\xe3\xd3\x20\xdc\x69\x61\x06\x4e\xdb\x9b\x84\xde\xf4\x26\x08\x80\xa6\x43\x7a\x7b\x7b\xbb\xec\x56\x9e\x43\x62\x41\xb8\xd3\xdf\x27\x18\xd8\x80\xb3\xaa\x90\x4c\x22\x59\xd7\x06\x0f\x0f\xec\xc0\xc3\x4c\x58\x4e\x6b\x67\xbf\x09\x4e\x13\xec\x20\xc4\x1e\x63\x76\xb7\xdf\x69\xf0\x20\xbf\xef\x05\x37\x24\x14\xd4\x77\xb6\xf7\x3b\xc4\x11\x71\x91\xeb\x7d\x60\x39\xfa\x7b\x4c\x42\x76\xe8\x8e\xa2\x00\xd8\x76\xec\xe6\x76\x9b\x05\x4e\xb1\xaf\x37\x03\x1d\x70\x54\x49\xec\xf5\x44\x68\x92\x76\xaf\x97\x84\x0e\x02\xcf\x21\x7e\xc8\x2a\xde\xdb\xdb\xdb\x69\x24\x51\x21\x9e\x82\x94\xf6\xe9\xff\x92\x50\x42\x38\x9d\x9d\x6d\x56\x6d\x1e\x6c\x48\xfc\x61\x88\x3f\xb8\x40\xd9\xe9\xed\xee\x48\xca\x23\x3c\x20\x7e\x0c\x0a\xb4\xd7\x53\x79\x0c\x3c\xf7\x9a\xc8\x12\x3a\x9d\x9d\x5e\x4b\xd6\x2a\x08\xb1\xcf\xd5\xa6\xbf\x67\x27\x25\x07\xa1\x3d\x74\x81\xfd\xfd\xfd\x76\xcb\xb6\x45\x78\x48\x1c\x51\x40\x92\x38\x02\xcd\xa1\xe1\x64\x7f\x7f\x67\x17\xcb\x70\x82\x65\xb1\x7b\xfd\x9e\xbd\x27\x8b\x8d\x68\x7b\x0a\x89\x6e\xef\xb5\x9d\x84\x5b\x88\x12\x52\x6a\xf5\xb7\xfb\xdb\xfd\x54\x14\x31\x44\xc5\x93\xf0\xcf\x49\xe0\x46\xbc\x89\x6c\xe2\x34\x45\x54\xa2\xac\xfb\xdb\x8d\x86\xd3\x86\x70\x42\xc6\x63\xd7\xe7\xda\xd0\xdc\xde\x97\xa1\xd1\x87\x69\xd2\xd2\x3d\xd1\xfe\xee\x48\x70\xb4\xb3\x4f\xff\x27\x03\x49\x3a\x30\x70\x06\x89\xfa\x35\xc9\x3e\xef\x35\x7d\x37\x24\xbd\xd0\x65\x5d\xaf\xd7\xa2\xff\x41\xb0\x47\xb5\x38\x19\x0a\xfa\x7d\xdc\x07\xb1\xf6\x83\x90\x44\xb1\x94\x5e\xab\xb5\xd7\xe3\x39\x26\xf6\x30\x72\x31\x4b\x2d\xfa\xe4\x00\xbb\x7e\xd4\x0b\xc2\x80\x29\x32\xfd\x1f\x04\x0f\x83\x28\x4e\x88\xef\x89\x11\x88\xaa\x27\x23\xe0\xec\xb2\x56\xd4\x14\xd6\xc1\xb8\xd3\x62\xc1\xbc\xd2\x7b\x0d\xfa\x3f\x16\x22\x15\x75\x8f\x6b\x00\x04\x4d\x89\xe7\x05\x37\xa0\xab\x4e\xbf\xcf\xf4\x4b\x48\x27\xc9\x3d\x0c\x7c\x32\x75\xc8\x8d\x1c\xb9\x78\x68\x9c\xb4\xc5\xce\x7e\x0f\xc6\x29\x6a\x4c\x62\x9f\xab\x9b\xed\x74\xec\x8e\x2d\x82\x07\x50\xcd\x6d\xaa\xe3\x20\x12\xf7\x3a\x08\xa7\x5c\x7c\x9c\xa4\xec\x22\xfd\x06\xd9\xd9\x83\x9c\x1e\xbe\x26\x3e\x5c\xbe\x6d\xdc\x92\x1d\xb2\xd3\xc7\x6a\x68\xcf\x9b\x44\x43\x4e\xa3\xd1\xef\xb0\xa8\x1b\x5f\x56\x77\xd7\xee\xf3\xde\xe1\x91\x51\xe0\xdb\x43\xb7\xdf\x67\x2a\x4f\xdb\x8c\x8d\x95\x1e\x35\x52\x44\xd3\x63\xc7\xd9\x23\x3b\x32\x38\x19\xad\xa4\x30\x58\x38\x1f\x3f\x88\x1c\x6b\x20\x58\xb6\x47\x22\xd7\x3e\xee\x63\xa7\x95\xa4\xe0\x4d\xe3\xb4\xe9\xff\x94\x60\xce\xf0\x7e\x83\x90\xfd\x86\x1a\x6e\x4a\x9e\xc8\xbd\xb7\x63\x37\x65\x70\xd2\xa1\xfb\x7d\xdc\x60\x1d\x9a\x45\x28\x3d\xba\xd5\xe8\xb5\xb0\x12\x95\x74\x9c\xbd\x5d\x9b\xf4\x95\x18\xb5\x47\xef\xee\xee\xed\xed\xef\xa7\xe3\x88\x31\x2e\x26\xc4\x13\x34\x7b\x0d\x7b\xdb\x21\x32\x4e\x91\x4b\xbf\xdf\x27\xbc\xa2\x23\x22\xc6\xed\x86\x0c\x91\xfc\xb6\x5b\xb6\xd3\xe6\x02\xf4\x59\x10\xed\x6d\xac\x91\x94\xc1\x33\xe9\x56\x23\x1c\x06\x4c\x0c\x7b\x72\xb2\x1c\x11\xc7\x9d\x8c\xf4\x79\x79\x67\xc7\x76\x98\x24\x58\xac\x3a\x55\x30\xd5\x60\xe1\xc9\xa0\xda\xc3\x9d\x0e\x6b\x06\x16\x33\x9e\x84\x63\x0f\xf2\xec\xb7\x77\x1b\x4e\x2f\x89\x51\x25\xde\xb6\x7b\xed\xdd\xa6\x12\xa7\x8e\xa2\xbb\xbd\x9d\x3d\x42\x94\xc8\x31\x5d\x66\x2b\xfd\xb5\x8f\xf7\x15\x1e\xb5\x01\x73\x7b\xcf\x69\xb2\x31\x9e\x45\xb2\x21\x53\x74\xbe\xdd\x66\x67\x0f\x7a\xc4\xc8\x75\x7c\x55\xc7\x9b\xfb\xcd\xfd\x5d\x26\x15\xd7\x8f\xed\x90\xe0\x11\x37\x40\xfa\xac\xf9\x47\x6e\x14\x4f\xc3\x20\x92\x36\x08\x61\xdc\x07\xb6\x8d\x23\xd7\x17\xa1\x3d\xa0\xee\xe3\x6b\xfc\x47\xa0\x8c\x85\x0e\xc1\x0e\x8f\x98\xca\x99\x17\x8a\x0b\x3c\xc7\x83\x1b\xf3\x8d\xdb\xbe\xd3\xef\xb0\x26\x84\x69\x4e\x8c\x37\x8d\x86\x0c\x72\x42\xdc\x83\x56\xea\xed\x91\x16\xc8\x5c\x9d\xf4\x70\x87\x27\x85\x30\x5e\xe5\x7e\x7f\x5b\x06\x8b\x26\x73\xf0\x6e\xc3\x81\x82\xc6\xd8\x23\xda\x80\x49\x08\xd9\x63\xed\x0f\x51\xb2\x0b\xee\xf5\x7b\xfb\x7b\x22\x58\x13\x38\xee\x13\xc2\x1a\x8b\x46\x69\xe2\x76\x7a\xbb\x0d\x36\x1d\x8d\xf1\x18\x4f\xf1\xcd\xd0\x1d\x73\x41\xf5\x1d\x10\xd4\x98\x60\x7b\x38\x9e\xf4\xfb\x5c\x4c\xb8\xb7\xcf\x82\xc3\x09\x1b\x2c\xf7\x3a\x6d\xd0\xdf\xa4\x77\xdb\x0d\x1b\x74\x6a\xec\x4d\xa0\x89\x1c\x07\x37\x1c\x10\xee\x38\xb8\x71\x92\x09\xab\xd7\x20\xbc\x43\x24\x1a\xb9\x27\xc5\x1e\x92\x1e\xb1\x6d\x9c\x44\xed\xec\xb4\xdb\xac\xc3\x4a\xc1\x89\x7e\x12\x06\xd1\x54\x9a\x84\x74\xea\x67\x93\x7f\x18\x4c\xb1\xec\xd3\xdb\xcd\x9d\x7d\xa6\x11\x11\x76\x1c\x8f\xc8\xf4\x7b\xbd\xed\x4e\xb3\xcd\x22\xe4\x48\x84\xf7\x1a\xbb\x2d\x16\xe6\x3b\x09\xed\xfe\x36\xde\xde\x81\x22\xb5\xc1\x89\xec\xf5\x3a\xbb\x3c\x34\x1a\x12\x8f\x9b\x8a\xfd\x0e\x13\x7b\xe4\x12\xdf\x87\xee\x8e\x1b\x9d\x56\xcb\x61\x61\xde\x35\x9b\x1f\xec\x06\xfd\x1f\x84\xe9\xa3\x1a\x01\x29\x6a\xfd\x6e\x07\x77\xf8\xf8\xaf\x8f\x73\x8d\xbd\x06\x1b\x7f\xf5\x21\x2e\x09\xf6\xe5\xf8\x85\x59\x6f\xc9\xf6\xd8\xfe\x2e\x08\x4d\x1b\x08\xb7\x77\xf6\x5a\x6c\x8a\x8c\xd9\xd4\xe1\xb4\x7a\xdb\x6c\x8a\x8b\x09\x9b\x63\x1a\x72\x8e\x89\x87\x6e\x14\xb3\xb6\x72\xf6\x7a\x7d\x07\xb4\x31\x0e\x46\x38\x0e\xf8\x74\xdb\xde\x06\x29\xe9\xc3\x41\x83\x34\x1c\xc8\x9f\xd8\x4e\x84\xec\xb5\x98\xe8\x6e\x86\x04\xc7\xac\x9f\x3b\xa4\xd7\xb6\xc4\x23\x16\x39\x03\xf7\x65\x50\x34\x0a\x3e\xc8\x35\x09\x9b\x55\xf5\x81\x9b\xe9\x0a\x0b\x4b\xfa\x0d\xa6\x03\x35\x9c\xa0\x96\xb9\x39\x2e\xb6\x1b\x8c\xbb\x79\xb0\xb7\x60\xb1\x1d\x20\x0b\x56\x65\x8e\x1b\x8d\x3d\x3c\xc5\x3d\xcf\x74\x26\xae\xdc\x0a\xa9\x87\x83\x5e\xb5\x56\x57\xd2\xf3\xdb\x93\x4c\x86\x6c\x1b\xb3\x0c\x09\x70\x13\xc6\x4f\x85\x35\xbc\x65\xe0\xaa\xca\x9e\x31\x28\xa7\xc2\x07\xcc\xfe\x1b\x61\x80\x2f\xe7\xbf\x28\x8d\x5a\x3d\x0e\xdd\x51\xb5\xa6\x3f\xb0\x50\xce\x14\xaa\x23\xb8\xf6\xfb\x33\xb9\x6d\xd7\xc9\x2d\xb1\x05\x6d\xd8\x52\xa7\x71\x63\x1c\x46\xe4\xc4\x8f\xab\xa3\x8b\xe6\xa5\x85\x9a\x3b\x35\x8b\xad\x77\x07\xbd\x6a\x75\x84\x7e\xf8\x01\xed\xa1\xc7\xb4\x6d\x6a\xe8\x33\x62\x01\xdb\x10\xd0\xe8\x37\x6a\x96\x16\x22\x92\xc0\x6f\x88\x14\x1f\x35\xf4\xfd\xf7\x68\x5b\x8d\xae\x59\xe0\xf8\x60\x6b\x0b\xfd\xa3\xdf\x68\x24\xa7\x12\x92\xdd\x9d\x0c\xbb\xe1\xa0\xe7\x57\xb3\xec\x72\x22\x30\xcc\xa4\xe9\x24\xbb\x25\x19\x6a\xa2\x8e\x8c\xce\xe8\xa2\x05\xff\xb6\x29\x4d\xa0\x48\xdb\xa9\xd5\xe9\xc0\x35\xb9\x46\xcd\x40\x98\x6f\x0f\x14\x12\x46\x4f\x50\xab\xd3\x41\x5b\xa8\xd9\x68\xb0\x42\xd2\x21\xed\x54\x48\x52\x78\xb3\xd1\xf8\xce\x42\xec\xff\xa6\xf2\x71\x5e\xcd\xc2\x41\x0f\x1b\xaa\x35\xba\xd8\xbe\x14\xc4\x71\x52\x35\x5a\xa4\x89\x7a\x5e\xf5\x24\xf5\xf9\xeb\xa6\x72\xa0\x55\xcf\xc4\x43\xb2\x8d\x93\x61\x61\x18\x79\x6a\x05\xb5\x02\x35\x31\x0e\x23\xaf\xda\x6c\x35\x2c\xd4\xa1\x65\x74\x0c\x72\x54\xf6\x79\x16\x29\x46\xd6\x08\xd2\x6a\x45\x69\x75\x82\x3d\xa0\xd4\x13\x4e\xd9\xcb\xb9\x66\x43\x9a\x0b\x16\xa8\x1c\x3a\x89\x6e\x7f\x78\x88\xd6\xe3\x10\xfb\xd1\x18\x87\xc4\x8f\xd7\x15\x4d\x13\x18\xb1\xfc\x1f\x45\x5b\x99\x17\x42\xf5\x89\x19\x2b\x4a\xbb\x4a\x2c\xc8\xf8\xb4\x27\x37\x77\x58\xff\xec\x5b\xc8\x57\x3a\x3f\x7c\x8a\x5f\xcd\x5a\x86\x26\xae\x86\x16\x1a\x58\xa8\x67\x21\x9c\xdc\x89\xc5\x70\x1b\xb5\x86\x42\x74\x88\x06\xe8\x10\x3c\x1c\x71\xa7\x32\xa9\xb2\x95\xdc\x19\xda\x7c\xfb\xba\x1a\x24\x84\x1f\x55\x03\xf5\x18\x0c\x86\xf4\x5a\x0d\x05\x62\x67\xbf\x1a\xc8\x3b\xad\x8f\x82\x5a\xaa\x30\x1a\x03\x37\x3e\xd8\x58\x6c\xe0\x26\xa8\x87\x16\x0a\xea\x03\xfa\x4f\x8f\xfe\x13\x8c\xb1\xcd\xc0\x4a\x52\xbc\x25\x8c\x8b\x24\xaa\x64\x33\x6f\xab\xc0\xdf\x0b\x6b\x70\x51\xab\x50\x38\x88\x78\x6b\xa0\xa6\x00\x0d\x35\x51\x17\x99\xd9\x30\x65\x54\xdc\x1a\x51\xe1\x6f\x84\xd2\x95\x11\x6d\x87\x8d\x81\xfc\xa4\x4d\xb2\xd1\x93\x9f\xb2\x5c\xb4\xc1\x7f\x42\x59\x4b\x4f\xba\x6f\x07\x3d\x8b\xd6\xda\x2a\xf5\xf2\x2b\x21\xc5\x7c\xc9\xb2\xd7\x39\xda\xf4\xfd\x09\xf6\x17\xd9\x19\x80\x7a\x3b\x53\x4c\xb9\x1f\xd0\x21\xfd\xbf\x14\x9f\x3c\x2f\xe8\x26\xce\x67\x44\x98\x85\x3e\xe8\xb7\xe5\x44\x73\x70\xf9\x3d\x41\x1f\x2c\x21\xbc\xe4\x77\x4f\xf9\x9d\x34\x0c\x37\x06\xd8\x79\x44\x19\xc6\xf8\xd1\x86\xc2\x16\x0b\xb9\x07\xa6\xc2\x41\xaf\xd8\x38\x49\xd8\x2f\x63\x11\x55\x1b\xb4\x7b\x73\x76\x84\x63\xa3\x90\x86\xb5\x3a\x9d\x9a\xbc\xbd\xf5\xf8\xb1\x9a\x72\x20\x53\x0e\x66\xa4\xec\xc9\x94\xbd\x19\x29\x85\xd2\x8a\xf4\xe2\xfb\xfb\x43\x18\xaa\x66\xdb\x67\xc2\xdd\x9d\x9a\xfb\x00\x42\xd8\x01\x34\xae\xf1\x0e\x08\x6d\x34\xc2\xb7\xd5\x86\xc5\x7f\xbb\x7e\xb5\x49\x47\x2d\xbd\xad\xaa\x58\x76\xf5\x75\x3a\x4a\xac\xa3\x2e\xfc\xc0\xd5\xf5\xa4\x12\x1b\x66\x72\x30\x33\x2b\xaf\x33\x98\x58\x01\x72\xa3\x51\x03\xcb\xd1\x42\xeb\x0b\x11\x19\xac\x82\x48\x4f\x10\x51\x72\xab\xd5\xad\x41\x5d\x2d\xb4\x8e\x36\x10\xa6\x05\xd5\xd6\xc5\xfd\xc7\x9a\x66\xea\xc2\x94\x39\xb4\x50\x64\x21\xcf\x38\x6b\x0c\xd1\x21\xf8\x1a\xf1\x92\x59\x43\x5e\xb3\xf3\xe4\x3b\x07\x8f\xbf\x59\x10\xa9\xd3\x29\x23\x85\x5a\x76\xee\xf9\x39\xf2\x54\x1e\xf4\x81\x35\x39\x3a\x55\xe7\x1e\x6d\xe6\xf9\x39\xf2\x6a\x69\x7a\x41\x7d\x48\xe7\x8c\x88\xfe\xe3\xe9\xb3\xc7\xb2\xb3\xd7\xcf\x91\x77\x30\x8b\x8d\xc0\x30\xbf\xc1\xa9\x28\x0b\x42\x5b\xb4\x2b\x59\xbc\xf5\x06\x10\x38\xd0\x03\x7b\x10\xd8\xd3\x03\x47\xae\x2f\xde\x6f\x50\xdd\xe0\x13\x8e\x7c\x92\x31\xc2\xb7\x32\x1a\xdf\x66\xa2\xb9\xf4\xc5\x27\x03\x75\xbe\x45\x9b\x94\xac\x08\xf4\xd8\xcd\xc5\x5b\xb4\x41\x43\x6b\xb4\x78\x51\xd9\x48\x7d\xab\x1e\x82\xb2\x8d\xf0\x2d\x6b\xd4\xea\x00\x6d\xa2\x1e\x4d\x1e\x51\x55\x1c\xa0\xef\xe9\xd7\x13\xb4\xa3\x5c\xfd\xa4\xd9\x06\xa9\x6c\x3d\xb4\x89\x42\x91\xad\xa5\x24\x86\xd8\x10\x6d\xa2\x81\x88\xdd\x66\xb1\x11\xda\xa2\xda\xf8\x3d\x6a\xd4\x3b\xe8\x29\x92\xac\xa2\x2e\x38\x36\x91\x15\x62\xa9\x87\xe8\xc9\x21\xda\x61\xde\xec\x38\x88\xc5\x9a\xa8\xbb\x87\x7e\x60\xf8\x01\x94\x5a\x93\x43\x84\x0f\x53\xe8\x3b\x19\xfd\xcc\xb3\x43\x86\x5a\xa2\x79\xec\x10\x45\xc3\x87\xc2\x0e\xf9\xd9\x40\xad\x94\x1d\x62\xca\xa8\xd8\x21\x54\xac\x1b\x43\x69\x69\x44\xe0\x0a\x48\x7e\xd2\xc6\xdf\xf0\xee\xdd\x0e\xf9\x39\xf2\x2c\x5a\xeb\xbf\x8e\x1d\x42\xa5\xca\xe4\xc7\xa7\xf5\xc8\x12\x12\xfb\xf2\xf6\xc7\x62\xcc\x98\xed\x0e\x78\x88\x2b\x26\xdd\x21\xfa\x0e\xb5\x77\xe0\x59\x16\xff\xfe\x1e\xc1\x8b\xac\x36\xdb\xc8\x4b\x86\x0d\x36\x23\x0f\x6b\xc9\xf5\x30\xc6\x48\x8d\xf7\x22\xce\x96\xcc\xe3\x89\x22\xbc\x24\x6c\xd4\x82\x3e\xb8\x01\xf3\x08\xef\xcd\x1e\xea\x82\xef\x22\x8f\x96\xaa\xe4\x1f\x35\xb9\x5b\x56\x8f\x76\xee\x96\xd1\x24\x13\x83\x5c\xe4\xb5\xe8\x90\x3b\xa4\x53\x52\x6b\xbb\x41\x3b\x18\xda\x84\x5f\x5d\x34\x44\x1b\x08\x16\x88\xa3\xa6\x85\x46\xad\x64\x64\x14\x99\xf2\x63\xe8\x18\xd1\x62\xd4\x36\x24\xb5\x4d\x23\x35\xb5\x01\x20\xa8\xb6\xb0\x4d\x17\x49\x7b\x0a\xa6\xd0\x66\x46\xe0\x79\xe6\x98\x27\x33\x7a\xcc\x04\x5b\xd8\x6c\xe3\x26\xc3\xd6\x13\xf4\x63\x18\x8c\xd0\x8f\xd7\x2f\x50\xb3\x5d\x6f\xef\x5a\xe8\xe8\xec\x8c\xcd\x9b\xe8\x15\xdc\xb5\x43\x2f\xc9\x35\xf1\x50\x5b\x43\x6a\xcb\x8a\x56\x1d\x14\x41\xae\x3b\x54\xac\xa3\x26\x55\x85\x11\x8c\xe1\xf0\x66\x71\x88\xb6\xd0\x4e\xb2\x99\x04\x0d\xb0\x07\x29\x5b\x5a\x20\x6b\xe3\x4c\xf6\x2a\x0d\xdf\x44\xc3\x9a\x4e\x86\x45\xb6\x3a\x1d\x93\x83\xb3\x66\x21\x82\xf9\x57\xf2\xac\xc7\xc6\xbb\x83\x15\x5c\x81\x56\x5e\xaf\x58\xa8\x8f\xe9\xdf\x29\xbc\x97\x61\xcf\x09\x6b\xe9\xd7\x84\xda\x4b\x43\x9e\x5e\x0b\x53\x00\xd1\x11\x52\x50\xf1\x13\x12\xcc\x8d\xaf\xf8\x4a\x3b\xb6\x63\x55\xab\xb2\xcd\x14\x8b\xb9\xe1\x07\x60\xa7\x64\xd7\x55\x2d\x8e\x23\xc0\x30\xbc\x0b\x9e\x2b\xe1\xa7\xc6\xf7\x67\xb5\x17\x1f\x2a\xc9\xc4\x4b\x06\x7f\x75\x98\x44\x5e\x88\x27\x8c\xc9\x63\x41\x51\xb1\xac\x96\xb4\x0a\xd1\xa9\xbf\xd2\x75\xd3\x1e\x8e\xe8\xd2\x51\x05\xf7\x74\xa3\x6a\xdc\xb4\xd0\x75\xc3\x42\xd7\xf4\x6f\xcb\x42\xd7\x6d\xe5\x0a\x3c\x38\x30\x07\x8f\xd0\x4d\x0b\xc5\xe0\x4c\x16\x3c\x5f\x37\xd5\x9d\xeb\x2a\x1d\x8e\xc1\x87\x75\x53\xb8\xc1\xa6\x7d\x2c\x6e\xd3\x6e\x74\x2d\xfa\xd5\x06\xaa\x6e\xa3\x4d\xb4\xc3\xa2\x79\x3a\x96\xa4\x99\x24\x91\x14\x34\x52\x4a\xda\x96\x4c\x1b\xd3\x50\xca\xed\x16\x35\x21\x17\x7a\x85\xd3\x33\xbe\x1b\x4f\xea\x9f\x79\xce\x4d\x47\xf3\x03\x03\x06\x6a\x9c\x7e\x31\x15\xb3\x75\xcf\x53\xb8\xbe\x4f\x67\xc8\x2e\x8a\x61\x01\x24\x82\x9a\xfc\x79\x76\x4d\xcc\xe8\xec\xb1\x75\x8c\x9e\x20\xbf\x96\xcc\x6a\xd7\x4d\xc9\xc2\x85\x7b\xa9\x84\xb7\x94\x70\xf6\x96\x3a\x89\x6b\xd0\xe9\x17\x2c\xd7\xa7\x49\x9a\x4d\x04\x10\x40\x2d\x10\x38\xda\xa4\x6d\x9d\xe4\x68\x43\x8e\xef\x19\x4b\x6a\xae\x0d\xd4\x92\xb9\x68\x4b\x5c\x37\xb5\x89\x95\xa9\x50\x35\x46\x9b\xc8\x45\x5b\xc8\xa7\x4d\xe4\x67\xf4\x49\x40\xc0\x1a\xee\x65\xb7\x0a\x91\xac\x57\xd3\x51\x16\x1c\x0a\x6f\xcd\x70\xb7\xa9\x89\xf8\xb6\xa8\x72\x85\x50\xc2\xcb\x54\x6e\x0b\x1d\x05\xa3\xf1\x24\x26\x0c\xc8\xd7\x21\xb6\x3b\x02\x57\x8d\xa4\xdf\x77\x6d\x97\xf8\x31\xc0\xbc\x52\xc2\x3e\xa0\x6b\x30\xf7\x32\xc9\x7b\x40\x76\x8f\x1e\xdd\x02\x70\x2d\xa5\x17\xb9\x03\xdf\xed\xbb\x36\xf6\x63\xe4\xb8\x03\x37\x8e\xd0\xd8\x42\x37\x43\x12\x12\x74\x8b\xdc\x88\x03\xea\x5d\x33\xfc\xd8\x31\x0d\x71\x7d\x04\xbe\x0b\x9a\x97\x28\x08\x13\x1c\xa9\x3a\x25\xf7\x63\x10\x22\x8e\x54\x6d\xf1\xad\xf1\x17\x8c\xc9\x6a\xb3\xde\x6a\x8b\x45\x70\x84\x2e\xd6\x9b\xad\xf6\xba\x85\x1a\x97\xf5\x55\xb4\x99\x85\xc6\xc9\x0e\x40\x15\x10\x0e\xe8\x7a\x77\x8c\x9e\xa2\xdb\x7a\x1c\x1c\x73\x81\xb8\xd8\xab\x8e\x45\xf7\x4b\x47\xd4\x6a\x12\x44\x6e\x9d\xac\xd7\x6a\xcc\xc4\x15\xa6\xe4\xc4\xf3\xc0\x2b\x34\x6c\xe1\xff\x7f\xff\xaf\xc0\xc7\x16\xfe\xa6\x2c\xad\x11\x0e\xd1\x2d\x7f\x63\xda\xb0\x90\x2b\xdf\x6d\x9e\x0f\x09\x47\xdf\xe1\x64\x89\x83\x7a\x53\xa4\xb1\x81\x88\x0b\x40\x34\x43\xcc\xda\x98\x0a\x11\xbd\x77\xde\xd7\xdf\x3b\x1b\xe4\x62\x73\xe3\xf2\xbd\xb3\xc1\xa8\x55\x49\x7d\x50\xb7\x50\xb3\xde\x22\x1b\xed\x1a\x6d\x0b\x25\xbd\x48\x2a\x53\xd1\x34\xf5\x44\xaf\x2f\x18\xd8\x48\xc2\xb3\x0a\x2f\xf6\x54\x8d\xb8\x68\x5c\xa2\x0d\x2d\x25\xab\x59\x8b\xca\x50\x09\x66\xc3\xca\x86\xa8\x38\x8c\x4e\xd4\xb4\xbc\xcc\xe9\x24\x5f\xc0\x55\xf1\x1c\x37\xe0\xa3\xd0\xbe\x02\x34\xf9\x6b\xec\xe5\xdf\x83\xe7\xef\x07\x53\x37\xf9\x43\xc2\xd5\x35\x76\x47\xe4\x84\x13\x49\xdd\xe6\x9f\xe3\x71\x24\x65\x65\xe4\x7a\x9e\x1b\x11\x3b\xf0\x9d\x5c\x6e\xf6\x9b\x2d\xfd\x95\x85\xe4\x63\xe5\x0f\x3b\xe6\xe3\x17\xfa\xa7\x7c\x03\x52\x24\xac\x57\x49\xb6\x28\x25\xb0\xe5\x2b\xe3\x7f\xc1\xca\x4c\x62\xbb\xa0\x2e\x73\xbc\x60\xa5\xe5\xcf\x6c\xf7\xf6\xaa\xdb\x7d\x30\xb7\xa8\x52\xac\x96\x6f\xf2\xb3\x7b\x6a\xed\xf0\xcb\x54\x61\x12\xdb\xe6\x1a\xcc\xf1\x96\x98\xe9\x98\x3f\x29\x78\x51\xbc\xdf\xdc\x5e\x75\x1b\xe7\xbd\x11\x2b\xcd\xea\x3c\xdd\xda\x07\x1b\x65\x31\x09\x6d\xb3\x62\x87\xc1\x24\xff\x59\xf4\x7e\xb3\xb3\x6a\xf9\xe4\x21\xf3\x94\x64\xb4\xbc\x74\x7e\x0e\x26\xe1\xa2\xb2\xe9\xb0\x22\x9d\x82\x57\xee\xfb\xcd\x9d\x55\x8b\x26\x0f\x1a\xbc\x1c\x9f\xe5\x25\xf3\x02\x4f\x17\x15\xcc\x0e\x2b\xf0\x86\x90\x0f\x05\x92\xd9\x5d\xb5\x64\xfe\x98\x5b\x32\x1a\xa3\xb0\x14\x2d\x25\x9a\xff\x12\xf2\x61\xf5\x83\xe6\xf0\x4b\xb1\x7f\x36\xf1\x9d\x6c\xe3\x2e\x5f\x01\xb2\x6c\x05\x4a\x0f\x69\x81\x5a\x81\xa2\x94\xe7\x13\x12\x39\x78\x5a\x3e\x65\x19\xa2\xff\x25\x8e\x5f\x96\xac\x4c\xbb\x7a\x71\xbb\xcb\x8a\xdb\x2e\x29\xee\xf3\xe1\x24\x2c\x2b\x9b\x1f\x43\xb7\x9c\x60\x58\xc2\x32\x24\xcf\x70\x3c\x09\xcb\x11\x15\x49\x17\x1d\xb8\x76\xf9\x24\x1b\xf8\xf1\xb0\x60\xe4\xda\x5b\xf5\xc8\xd5\x9f\xbb\x29\x75\x4e\xe7\xea\x3a\xf1\x70\x51\xf1\xec\xb1\x42\xa7\x04\x17\x19\x03\xfb\xab\x96\xce\x87\xb9\xa5\xa3\x31\x5a\x5e\x38\xef\x08\x5e\xd8\x18\xd8\x67\x45\xc2\xda\xa3\xd8\x9a\x6c\x35\x56\x2d\xa0\x60\x6e\x01\x65\xb9\x9d\x63\x69\xb5\x8c\x3d\xd9\x6c\xc8\x92\x7f\x2e\xb4\x29\x5b\xcd\x55\x4b\x69\x34\xff\x12\x34\xcd\x6c\x69\x21\x2d\x63\x56\x36\x9b\xb2\xd4\x17\x45\xa6\x65\x6b\xe5\x3b\x0e\xde\xfc\x12\x4a\xf1\x5a\x5a\x40\x4b\x58\x97\xcd\x96\x2c\xf3\xbf\x85\x16\x66\x6b\xe5\x4b\xf3\xc9\xfc\x02\x4a\x33\x5b\xce\x4c\xe3\xc9\x57\x6f\x34\x44\x5f\xb0\x06\xf7\x65\x67\x8e\x57\x51\x87\xb2\xa3\x5d\x29\x53\x73\x12\xdb\xe5\x2c\xcd\x24\x61\x09\x92\x65\xed\x4c\x35\xe9\xea\xa5\x1d\xaf\x42\xda\x65\x4c\x4d\x2a\x9b\x92\x96\xe6\x24\xb6\x4b\x19\x9a\x32\x5d\x09\x82\x25\xcd\x4c\x25\xe5\xc2\x03\x58\x3b\x99\x7d\x8b\x2d\xcd\xd6\xca\x37\x9e\xfe\x9c\xbf\x35\x33\xdc\xce\xd3\x79\x16\x37\x36\x9b\xdb\xb2\xdc\x77\x85\x06\x67\x6b\xe5\xbb\x4f\xd7\xf3\x0b\x29\xcd\x6c\x69\x19\x49\x9b\x73\xc6\x7f\xa9\x03\x9b\x7b\x74\xeb\x77\xdf\x3e\xec\x60\xf5\x07\xa7\x91\x79\xf2\x51\x4c\xf2\x37\x38\x8c\xc8\x8a\x9d\x08\xe6\x6d\x2e\xd2\xd1\x42\xe7\xeb\xbe\x31\xba\x26\xb1\x0d\x15\x9c\x21\x88\xe4\x56\xe6\x82\x07\x6a\x5e\x60\x63\xaf\x00\x32\x73\x8f\x41\x4a\x51\x3a\x2c\x29\xc3\x8d\x52\x5a\x4a\x7e\x33\x7e\xe1\x33\x91\x97\xf8\xe4\x91\x6b\x9c\xe1\x97\x40\xab\x0a\xcf\x46\x71\x4c\xce\x01\x60\x60\xfd\xbb\x5b\x0b\x7d\xf7\xdb\xba\xc5\x43\x69\xc8\xe6\x68\xeb\xbb\x4d\x67\xeb\xbb\x77\x10\x1a\xf3\x74\x9b\x27\xdd\xef\x5e\x75\xbf\x3b\x43\xdf\x8d\xd7\xf9\x0b\x6d\x37\x70\xa2\x2e\xba\x58\x7f\xf6\x6a\xdd\x42\xeb\x6f\x5e\xad\x5f\x32\x32\x53\x08\x65\x06\x07\x8d\x61\xd3\x36\xfd\xc5\xa7\x5b\xfa\x53\x4e\x92\x10\xce\xa7\x1a\xfa\x9b\xcd\x11\xf4\x97\x18\xda\x19\xdd\x68\x18\x84\xf1\x8b\x84\x38\xa7\xcc\xc9\x72\x92\x9c\x18\xa7\xc3\x89\xb0\xfc\xb0\x3a\x87\xcc\xff\xc6\xfe\x04\x87\xac\x30\xd2\x0b\xc5\xef\x57\x38\xb4\x87\xf4\xc7\xb3\x71\xe8\x7a\x2c\x04\x22\xfe\x3d\xf1\x09\xfb\xeb\xc1\xf7\xb3\xc9\x60\x12\xc5\x40\x9c\x8c\x63\xf0\x93\x4d\x3f\x4e\xed\x38\xe0\x3f\x5f\x07\xd7\x32\xf8\x05\xb1\xd9\xef\xa4\x16\xaf\x54\x56\x38\x1b\x9c\x03\x5e\xbe\x5e\x3a\x2f\x9c\x97\xcd\x0b\xe6\x45\xf2\xe2\x78\x49\xeb\x97\xa9\xdb\x62\x7a\xe3\xa7\x2f\x8b\x31\xfd\x2a\x87\x74\x29\xf5\xd6\x78\x3d\x59\xa1\x7c\xc0\xb5\xe6\x47\xf1\xec\x97\x65\xac\xf7\xb9\x7a\x22\x65\x2c\x91\x91\x63\xa6\xac\x28\xd1\xe3\x24\x4e\x51\x6d\x24\x15\x5b\x8b\x7e\x23\x72\xf3\xae\x2c\xfa\x8d\xe1\x1e\xda\x37\xe5\x00\x24\x24\xb8\x00\x86\xb6\xb9\xa8\x17\x51\x4e\xf6\x4a\xb4\x90\x91\x7c\xdd\x2f\x6c\x6e\x4e\x63\x51\x20\xe3\x71\x18\x8c\xaf\xe2\xe9\x98\xe4\xfb\x31\x6d\xac\x82\xf6\x12\x75\xd4\x09\x2d\x8a\xac\x6c\x7b\x38\x8a\xc0\xe5\x75\xfe\xe5\x88\x55\xd0\x5e\xa2\xa2\x3a\xa1\x85\x81\x9e\x27\xb1\xeb\x5d\xbd\x99\x84\xe4\x2d\xa0\x0c\xe5\xab\x6d\x67\x61\xc8\x67\x28\xe2\xc1\x05\x6e\x69\x17\xb8\x20\x02\x76\xb5\xf7\x88\x36\xb1\xea\x9a\x09\x4c\x1b\x75\x1e\x70\x7d\xc2\x39\x70\x49\xc4\x65\xc2\x90\xff\xa3\xac\x47\x5c\x26\x1a\x88\x34\x89\xc5\x21\x91\x1d\xba\x63\x76\x59\x19\x52\x81\x58\x92\xe0\x3a\x01\xec\x7d\xdc\x83\xe9\xc5\x1c\x4e\xdb\x08\xfc\x1e\xa8\xf1\x76\xe0\xf7\xdd\xc1\x44\xe4\x04\x37\x08\x20\xd4\x75\xb8\x82\xb9\xce\x2e\x28\x8b\xe4\x35\x35\xeb\x4d\xe8\xc6\x5a\x36\xde\x0e\x5a\xdd\xa7\xb2\xe6\x4a\x4e\xc0\xb4\x57\xa8\x1e\xa8\x02\x4f\x24\x7a\xa4\xde\x05\x87\xd6\xa5\x44\xc1\xd5\x25\x8e\x5d\xfb\x8d\x10\x25\xf7\xbd\xc0\xa3\x6b\x59\xe1\x1f\x99\xee\x8b\xab\x24\x6b\x07\xdc\x11\xa3\x42\xb7\x88\x8a\xce\xc2\x81\x60\x5d\x49\x41\x15\x06\xdd\x55\x6b\x52\x6b\xa8\xbe\x58\xfc\x6f\xcb\x42\x57\x31\x19\x8d\x35\xaf\xca\x10\x73\x84\x3d\x0f\x9c\xe8\x57\xc5\xa3\x3d\x4b\xa5\x2a\x6a\xfb\x48\x46\xeb\xef\x03\x93\x84\xa0\xe2\xc3\x30\xb8\x81\xb7\x27\xe7\xd3\x31\x39\x0e\xc3\x20\xac\xae\x1f\x61\xdf\x0f\x62\x44\xfb\x04\xc2\x08\x0a\x45\x38\x42\x58\xca\x7d\x5d\xf8\x4a\x4e\x58\x1b\x07\x51\xe4\xf6\x3c\xa2\x14\xc0\xbc\xe4\x57\x23\xe2\xf5\x2d\x20\x26\x59\xa3\x41\x7a\xe9\x6f\x49\x9f\x84\xc4\xb7\x05\x0b\xe0\xda\x66\x88\x23\xbf\x12\xa3\x1e\x21\x3e\x02\x53\x06\x7b\x2e\x35\xff\x37\x51\x34\x19\x93\xb0\x5a\xd3\x52\xd0\x12\x88\xc3\x58\x4b\xdc\x81\xc3\x03\x12\xe1\xed\x0e\xbe\x01\xfd\x80\x81\x3c\xaf\x0b\xaf\xf7\x5a\x5c\x52\x4b\xf4\x94\x05\x77\x11\xe5\xf8\x40\xaf\xb1\xeb\x0f\x49\xe8\xc6\x51\x35\x9a\xf4\x8e\x58\xd3\x01\x5b\xf0\x5b\x54\x95\x13\x4f\x22\x0c\xe0\xd5\xa9\x48\xe6\x90\x22\xa7\x69\xce\x68\x5a\xba\xee\x09\x49\x14\x81\xef\x8f\x49\x14\x8b\x6b\x98\x3d\xc2\x1e\x62\x05\xa1\xd2\x56\x16\xa2\x6d\xb9\x8e\x36\x50\x86\x17\x10\x95\xe0\xbe\x9e\xff\x44\x41\x61\x50\x63\x57\xed\x28\x9f\x74\xff\x4d\x9f\x84\x27\x99\x44\x38\xc9\x30\xd3\x65\x83\x8c\x85\xc4\xf0\xd0\x85\xd1\xc1\x42\xea\x48\xc3\xc2\xa8\x9a\x89\x9e\xa7\x08\x97\xf3\x17\x91\xf8\x8d\x60\xe1\xb4\x2f\x61\xed\x53\xe1\x39\x0d\x94\xf0\x56\xbf\xba\x82\x9a\xc0\xe4\x96\x24\x81\xf6\xe6\x3e\x04\xff\xd5\x77\x3d\x72\x7a\x4d\xc2\x6b\x97\xdc\xa0\x37\x81\x37\x1d\x04\xfe\x5a\xb2\x2f\xc1\x9d\x46\xf2\x88\x37\x81\xeb\xc7\x51\xca\x77\xa4\x16\x57\x1d\xc3\x1f\xed\xfa\x36\x0b\x9a\xd7\xd1\x72\xfd\x96\xb9\x8c\x16\x1f\x8f\x1f\x73\x37\xc9\x53\x35\x7c\xaa\xfa\x5d\xa6\xe4\x98\x1f\xa0\x0b\x9e\x4b\xb8\x56\x9e\x9a\xdd\x29\x2b\x6e\x35\xc1\x4d\x32\x77\x88\x8c\x54\xc7\xc1\xbc\x7a\x65\x56\x2e\x26\xcb\xc5\xb8\x84\x61\x03\x1e\x3a\x44\x55\x18\x0b\xa9\xe9\xc1\x06\x47\x6d\x56\xbd\x3a\x0a\x46\xec\x4a\x32\xab\x64\xd2\x33\x39\x4f\x16\x52\x92\xc0\xfd\x66\x99\x99\xa7\x90\x37\xe6\xd3\x43\x2c\x1d\x87\x2c\x91\xaa\x76\xa0\x49\xa5\x60\xcc\x63\xd9\x44\xf9\x8a\x7e\x49\x77\xc5\xf5\x81\xae\xa3\xa2\x88\x5a\x1d\x8f\xc7\xde\x94\x53\x90\x26\x4e\x2d\x71\x1d\xa3\x5a\x17\x49\x0d\x2f\xf8\x8b\x4c\x32\xed\xa2\x4a\x08\x42\xad\x58\xfc\xb9\x07\x74\xc4\x04\x69\x04\x22\xab\x89\x42\xc0\xe4\x03\x16\x83\x78\xde\x08\x1f\xc9\xd3\x0b\xc4\x55\x93\xca\x9f\xd9\x1f\xec\x5b\x4d\x01\x72\x7b\x8d\x47\x24\x49\x24\x83\x0e\xd6\xd6\x78\x4a\x18\xfd\x39\xb1\xcf\x9f\x11\xff\x29\xfc\x10\x4a\x8e\x90\x76\x93\x9d\x07\xde\xad\x29\xfc\x7a\x78\x2a\x86\xa4\x22\x9f\x88\x66\x83\xbd\x5a\xab\x4a\xd7\xee\x9b\x63\x26\xc1\x8a\x95\x54\x41\xb4\x33\x9a\xbd\xb1\x99\x59\xd9\xd5\x71\xda\x91\x71\x52\x80\xe6\x19\x78\x66\x2f\x31\x19\xdf\x17\xeb\x1f\xa0\x97\x80\xf2\x90\x88\xf8\xd4\xc4\x08\x7c\xe9\x94\x38\x62\xfd\x26\x69\xc4\xda\xc2\x05\x11\x28\xa8\xef\x7a\x31\x09\xc1\xfd\x69\x61\x21\x49\xcb\x49\x29\x76\x95\x46\x4a\x34\x85\xb5\x78\x37\x77\x40\x14\x8d\x5d\x93\x03\x11\x42\x77\xba\x47\x23\x9e\xef\x60\xed\xae\xcc\x72\xf9\x62\x5d\xf6\xfd\xf5\xcb\x9a\x34\xaf\x04\xf0\x1a\x57\xd9\xca\x9b\xa4\x95\x78\x02\x5a\x35\x3a\xf3\x82\x86\xa9\x2d\x37\xaf\x24\x6d\x90\xe4\x9b\xb7\xc7\x67\xc7\xaf\xcf\x9f\x9d\x9f\x9c\xbe\xbe\x7a\x76\x7e\xfe\xf6\xe4\xf9\x2f\xe7\xc7\x67\x54\x96\x4c\x7c\x8a\xe0\xe6\x5d\x6a\xd7\x71\x9d\x3d\xd5\x60\x90\x8b\x4c\xc2\x0b\x10\x01\x67\x1c\xa7\xfd\xd2\x2b\x74\xb5\xfc\x21\x1e\xb3\xad\x4c\x84\x6e\x17\x2a\x9c\x3d\xf7\x61\x9a\x32\x5d\x82\xc2\x1a\x68\xcf\xda\x5d\x8d\x5b\xd0\x35\x78\xde\xcd\x5a\xf5\x60\x09\x17\x3c\xca\x24\x90\xda\xc0\xfa\x02\xae\x3c\xcb\xef\x34\x79\x81\x83\xa3\xe1\x95\x1b\x1d\xff\x39\x29\x78\x1e\xb2\xbd\xa0\x7b\xa9\x6c\x01\x4b\xed\x69\xa5\x89\x2d\xba\x01\x25\xe9\xfc\xc8\xe5\x9f\xbf\x51\xb1\xb0\x27\x30\x43\x19\x4b\xed\x75\x19\xe8\x2d\xba\x2d\x25\x49\xbd\x76\xf3\x9b\xbc\xbd\xe0\xee\x65\x9a\xfc\x52\xfb\x5e\x3a\xa9\x45\x77\xbe\xee\x65\x97\xb6\xbd\x82\x5d\xda\xf6\x72\xbb\xb4\xdb\xf7\xb8\x4b\xbb\xbd\xaa\x5d\xda\xed\x15\xec\xd2\x76\xb8\x9c\xa2\x51\x10\x14\x9c\xf0\xb7\xb7\x57\x43\x7e\x89\xda\xa6\x49\x2d\xea\x86\xee\xfe\x76\xa5\x77\x56\xb5\x2b\xbd\xb3\x82\x5d\xe9\xdd\xfb\xdf\x95\xde\xbb\xba\x02\x6b\xe3\xea\x68\x12\x5e\xe7\x9f\xda\xee\x2d\xe8\x9a\x71\x5f\x90\x7f\x11\xe4\x0f\x31\xbb\x8b\x1e\x95\x34\xc0\xaf\x5e\x8c\x5d\x9f\x84\x57\x2f\xa9\x81\x9c\x2f\x9f\x05\xfd\x12\x36\x9b\xb4\x0c\x6e\xf3\x5e\xbd\xc4\x3d\xe2\xbd\x74\xa3\x82\xba\x2c\x38\x5e\x36\x5b\x57\x57\xb0\x2d\xf5\xbc\xe0\xfa\x49\xb3\xb1\x68\x2d\xc4\x2e\xc1\x0b\x1c\xe3\x19\x67\x0f\x0b\xba\x9d\x6c\xce\x7b\xbe\xb1\x48\x19\x1d\x5e\xc6\x11\x5d\x6e\x16\x97\x01\x37\x56\xc5\x6e\xd2\xc3\x39\xca\xc3\x39\xca\xc3\x39\xca\xca\xce\x51\x5a\xda\x41\x0a\xdb\xfe\xff\xaf\x1b\x0f\x83\x49\xac\x94\x1b\xf4\xfe\x00\xb5\x8d\x84\x36\x30\x89\xa2\x43\xf4\xe9\xee\x40\xd5\x23\xe6\x85\x59\x48\x04\x9c\xd2\x0b\x3c\x06\xb7\x86\x7e\x00\x38\x15\x3a\xce\xbb\xbe\x68\xe4\x47\xa5\xba\x0e\x30\xe0\xd6\xd4\xcc\xbc\xf7\xb8\x97\xcc\xb1\x34\x68\x63\xb6\xcb\xa8\xb5\x8b\x03\x2a\x9d\xc9\x88\x6a\x0c\xf3\xc3\x89\x43\x79\x2e\xa4\x3b\xe8\xa4\x11\xd9\x2e\x62\x21\x1c\x86\x2d\x74\x88\x64\x22\xb1\x45\x27\xc6\x95\x30\xdd\x75\x68\x06\xc6\x23\x0e\x43\x9d\x47\x1a\x75\x20\x71\x0b\x45\x28\xe3\xa3\x1f\x06\x23\x60\x22\x73\xa0\xf4\x70\xd6\xf5\x70\xd6\xf5\x70\xd6\xf5\xf5\xcf\xba\x5e\xba\x3e\x59\x33\x5c\xc0\xa5\x83\xc5\x8f\xcf\x8e\xce\x4f\xdf\x52\x7b\xa3\xce\xfc\xfd\x35\xf9\x18\x4c\x33\x95\x39\x09\x32\xad\x16\xca\x9c\x04\xb5\xe6\x3e\x0a\xa2\x1c\x15\x9c\x03\xd1\x68\x0d\x4d\xf2\x2a\x24\x7d\x7e\x0c\x00\x9f\xb4\x54\x3a\x95\xc0\xb1\xcc\x55\x48\x62\x1e\x69\x3e\x30\xa2\xe4\xc4\x29\x82\x1c\x5a\xaf\x3c\xe2\xab\xe6\x16\x1f\x42\xe1\x94\x27\x92\x83\x2d\x4d\x55\xb3\xd0\x15\x35\xbf\xc0\x5a\x81\x5f\xdf\x43\x6e\xf6\x01\x03\x2e\xdf\x27\xa7\x59\x2f\xae\xb8\x65\x95\x18\x72\x57\x02\x08\x2e\x7d\x92\x47\x39\x57\xcf\xd3\xaa\x50\x23\x38\xb3\x99\x75\x98\x45\x25\x82\x0e\xa1\x6a\x65\x0e\xb4\x40\x04\x35\x98\xd5\xf8\x91\x16\x25\x60\xa1\x0b\x4a\xee\x92\x1a\x43\x36\x8e\xab\x94\xff\x5a\xad\xc6\x25\x2b\xfe\xd6\xe9\x94\x4f\xb8\x9f\x4b\x38\x37\x8a\x9e\xf9\xee\x08\xce\x3a\x7e\x74\x7d\x37\x1a\x12\x87\xf7\x23\x81\x55\x19\xc4\xd8\x7b\x09\xf2\xec\x22\x06\xe7\x76\x27\x88\xb9\x4e\x19\x55\x34\xad\x37\x2e\xd6\x5d\x50\xc5\x89\xef\xfe\x39\x21\x27\x1c\xad\x35\x39\x3b\xf2\x5c\x9f\x6c\x56\x24\xd7\x36\xb6\x87\xe4\x4d\x48\xae\x29\x09\x4d\x2f\xd5\xd3\x5e\xd0\x1a\x56\x4b\x12\x9f\xd1\x8a\x56\x3f\xa1\x71\x48\xae\xdf\xf0\x8d\x7b\x7e\x3e\x76\x27\x4e\x40\x04\xf9\x31\x8e\x87\x6f\xa1\x0d\x12\xc2\x7e\xe0\x90\x34\xd9\x11\x76\x7d\x58\x1a\xa3\x43\x44\xe3\x53\x64\x86\xd8\x77\x3c\x22\xe5\x79\xec\x3b\x69\xdb\x3a\x8f\xc9\xdc\x56\x90\xbc\x8a\x4c\xcc\xba\x0e\x7c\xb5\x94\x6a\xba\x3e\x29\x46\xce\x62\x1c\xc6\x4b\xb1\x02\x23\xed\x6c\x5e\xa0\x20\x8d\x1b\x32\x1a\xd3\x46\xcc\xef\x02\x4a\xbf\x4f\x0e\x62\x61\xb8\x44\xe8\x09\xe0\x9c\x05\x11\x61\x30\x67\xb4\xe9\x83\x3e\x22\xd8\x1e\xa2\x41\x18\x4c\xc6\x2c\xcd\xbf\xc6\x38\xc4\x23\xf4\x89\xe9\xe1\x1d\x5b\x59\x00\xc8\x16\xfb\x45\x0d\x21\x20\x20\x57\xee\x5a\xbe\x24\xe3\xed\xb3\x5b\x37\x42\x08\xb2\xca\x39\x04\xe4\x15\xf4\xd1\xed\x26\xbe\x75\xa3\x9c\x9c\xd3\xa2\x9c\x53\x53\x4e\x06\x72\x7f\x07\x95\xfa\x0f\x99\x42\x4e\xd6\x17\x60\x75\x18\xf4\x11\xd6\xea\xc8\x07\x99\x4f\x30\x92\xdd\x21\x21\x18\x07\x08\x40\x9a\xad\xb5\xcc\x11\x36\x1b\x99\xb5\xf3\x6b\x29\x83\x17\xae\xf3\x2a\x98\xf8\x71\xc5\xe2\x47\xc8\x5b\x4f\x10\x89\x3c\xd7\x8f\x37\x1d\x37\x82\x15\x11\x82\xed\xb9\x2d\x3f\xd8\x74\x5c\x67\x73\x44\x53\x6f\x46\x24\xde\x64\x43\xc8\x93\x2d\xe3\x19\x78\xa6\x00\x45\xd7\xc0\x6a\x53\x34\x47\x51\xb5\x67\x76\xec\x5e\x93\xec\x39\xb5\xf1\x88\x5a\x19\x92\xc4\xb9\xfa\x80\xc4\xe7\x49\x68\x55\x2a\x6a\x5a\xbb\xb5\xd1\x4c\xa5\x73\xa7\x9e\x8a\x8a\x53\xd7\x94\xcc\xfe\xeb\x7a\xde\x5b\x62\x13\xf7\x1a\x56\x54\x51\xce\x35\x80\xdc\xf4\x55\x9f\xdc\xc6\x62\xc1\x57\xfe\x8a\x00\x16\x42\x3a\x71\x92\x2b\x00\x4a\xe0\xec\xeb\x04\xfa\x35\x01\xc9\x85\x4a\x04\x8c\x46\xe5\x5b\x6d\x8a\xec\x10\x2c\x86\xdd\xa4\x79\x72\x64\xa7\xb7\x4b\x8e\xc0\xd2\x8d\xa7\x09\xc7\xa6\xe3\xed\x8b\x60\x24\xc4\x23\xc7\xe0\x83\x5c\x8d\x90\x59\x1e\x3f\x96\xbf\x53\x1a\x52\x10\x55\x65\xae\x13\xd2\x37\x15\x94\x22\x72\x35\x65\x40\x15\x2d\x0c\x3e\x90\x17\x38\x1a\xc2\x91\x6f\x7e\x8d\x53\x09\xab\xc2\x64\x51\xca\xb1\xc0\xe1\x65\x4a\x59\x68\x90\xac\x29\xc4\x67\xef\x35\x8d\x43\x62\x21\xda\xcc\x86\x8b\x1f\xe3\x90\xa0\x0d\x88\x94\x8d\x97\xdc\xca\x00\x81\xd3\x5e\xab\xba\x1c\xe3\x90\x80\x5b\x4a\xd1\x16\x6a\x36\x6a\x6a\x03\x84\x84\xb6\x4b\xc2\x17\xfb\xf1\x9d\x92\x45\x4f\x1d\xc5\x49\xff\x55\x5a\x65\x93\xe7\xd4\x18\xe2\xb4\x69\x55\xd1\x21\xba\xb8\x14\x94\xd2\x2b\xeb\x68\x32\x02\xbb\xee\x00\x7e\x6d\x70\xe9\x5c\xb8\x97\x16\xda\xd8\x70\x55\x51\xb0\x85\xc0\x08\x6d\xc8\x24\xe8\x07\xad\x0a\x6a\x62\x94\x61\x40\x98\x58\x86\xed\x00\xd6\x20\x0a\xe8\x63\xcd\x42\x17\x9a\x70\xe8\xb2\x73\x74\x29\x85\x47\xff\xeb\x85\x04\x7f\x48\x02\xee\x4c\x63\x1e\x19\x8d\xe3\xa9\x60\x41\x61\xa8\x2e\x45\xdd\x82\x75\x67\x03\x3d\x45\x17\x0d\x4b\x11\xf1\x25\xea\x52\x16\xe4\x67\x5a\xb1\x0b\xeb\xc3\xdc\x9a\x90\x31\xc1\x31\xab\x9b\xc5\xf4\x83\x19\x96\x99\xe4\x0a\x63\x35\x4b\xe1\xb9\x56\x1f\xe1\xb1\xa2\xa0\x94\x94\x41\x37\x69\x30\xda\x40\x95\xf1\x6d\x25\x51\x4e\x7e\x25\xce\x82\x3b\x71\x39\x1d\x8f\x71\x98\x7b\x2d\x2b\xcb\x7e\xa6\x4b\x45\xbf\xf8\x6e\x2c\x7b\x94\x22\xd4\x47\x42\xa8\x33\x9b\x9d\x36\x75\xe3\x92\x2e\x09\xe1\x33\xa5\xf0\xec\xe0\xe8\x22\x11\xbf\x69\xef\x14\x98\x3b\x48\xab\xab\x92\xbb\x80\x07\x96\xca\xdc\x2e\xb2\x86\xb5\x5a\x66\x46\xcd\xdc\x44\xcc\x91\x30\x5d\x43\x8a\x43\x89\xc2\x0b\x70\x22\x51\x6a\xe6\x2f\x9a\xf8\xe9\x70\xfc\x28\x59\x9f\xd4\x0d\x46\xe8\x3c\x77\xd8\xd8\xe4\xd7\x2a\x7b\xe9\xae\x65\xb8\x75\xc7\x8c\xc1\x24\x05\x7c\xab\x09\xa6\xa9\x04\xd3\x74\x02\x0f\x4f\x83\x49\xac\xa4\x60\x01\xda\xd5\xbe\xa1\xeb\x39\x21\xac\x5d\x45\x22\x11\xa4\x8d\x80\x84\x4b\xf4\x24\x26\xa3\x52\x2b\x2e\xf3\x75\x29\x97\x5f\x3c\xf3\x9d\x23\x5a\xca\xf3\xe9\xf9\x74\x4c\xd8\xca\x4b\x14\x5b\x74\x07\x4b\x3f\x95\x32\x6d\x26\x1c\x68\xb7\x11\x55\xae\xcb\xb6\x5e\x72\xf6\x80\x63\x0c\xcb\x36\xf6\x1a\x2e\x26\x61\x55\x06\x59\xc2\x6c\x36\x50\x55\xc7\xed\xdb\x6e\x42\xa6\x7e\xab\x35\x9e\x1a\x33\x55\x63\xb8\x4a\x27\xb1\x10\xa0\xa6\x80\x6a\xfd\x8a\xbd\x6e\x89\x76\x30\x1d\x51\x5d\xac\xdf\x88\x9b\x86\xbf\x52\xda\xcf\xa7\x2f\xf8\x22\x80\x3d\x2e\x94\x25\x8f\xf1\xd4\x0b\xb0\x93\xd4\x36\x99\x21\xf2\x3a\xf1\x1c\x57\x30\xea\xb8\x6e\x7b\x81\x2f\x6f\x53\xaa\xad\xa5\xde\x3a\xa4\x85\x8b\x95\x73\x22\x06\xe8\x0e\x5d\x94\xea\x15\x53\x16\x9a\xea\x0a\x4c\xef\xbb\x28\xad\xff\xd9\x26\xee\x1a\xc2\x14\x23\x05\x15\x0d\x4d\x2f\x82\x98\xb2\x5e\x38\x32\xf1\x34\xd5\x60\xcc\xf6\x34\xc7\x59\x5b\xdc\x61\x49\xd0\x21\xba\x0e\x5c\x47\x31\x03\xa9\x4a\xcf\x27\x5e\x37\xfa\x15\x7b\xae\x23\x04\xcc\x0a\xad\xa9\x3a\x9b\x14\xb6\x44\xc3\xe9\x95\x91\x9a\x91\xb8\x54\x5a\xf0\xe6\x55\xb5\x56\xcc\x32\x8b\xac\x1a\x8b\x4d\xd2\x83\x45\xa9\xde\x60\x9e\xf3\xb2\x45\x35\xb3\x2b\xe4\x04\x71\xc5\xe2\xa5\xd7\xd5\x9b\xc5\x4b\x4b\x55\xbb\x5d\x5c\xf6\x1a\x83\x61\x1c\x4c\xdd\x47\x66\xd3\x0f\xfa\xa4\xde\x43\x4d\x44\x72\x97\x3f\x25\xf3\x8a\xcc\x56\xfc\xbc\x95\x68\x92\x20\x7d\x29\x9d\xce\x8b\x62\x7e\xd4\xa6\x9a\xec\xd4\xac\x4e\xa2\xd9\x99\x5b\x5f\x5a\xde\xcb\xc4\xae\xb0\x0d\x4c\xb4\x73\xe7\x75\x27\x48\xe6\xdb\x76\xdd\x09\xe2\x82\x49\xbf\x9d\xac\x8d\x93\x02\x3c\x7e\x58\x1a\x2d\x31\xcb\xce\x7b\x8f\xfc\x40\x5b\xec\x46\x71\x30\x7a\x11\xc4\x5f\x84\x09\x27\x88\xb5\xd2\x9d\x00\xe4\xc3\x9f\x0e\xe8\x16\x3b\xbc\x62\xa1\x0b\x9a\x54\xdf\x76\x12\x5e\x13\xa5\x57\xa4\xce\x34\xd5\x09\xe2\xcd\x0a\xda\x40\xae\xda\x20\x61\x17\xb5\x93\x29\xcd\x4a\x84\x6f\xa5\xe4\x60\x69\xb3\x3a\x57\x72\xf6\xac\x26\x33\x3b\xdb\xb7\x22\xea\xd6\x42\xf6\x54\x7c\x50\xd6\x7d\x87\xdc\x76\x91\x6b\x21\x3e\xb1\x8a\x38\xfe\x99\xb0\x92\xd8\x31\xc9\xc4\x0a\x1d\xa6\xae\x4f\x23\x54\xc1\xa4\x00\x6a\x86\xe5\xf4\x62\xb3\xb2\x36\x0c\x49\x46\xe6\xbc\xf9\x64\x1a\x96\x24\x2d\x6d\x28\xca\x0e\xaf\x51\xc5\x4a\xda\x2d\xaa\x30\xc7\x54\xb2\x87\x45\xfc\x63\xd6\x84\x0c\x9b\x34\x67\x70\xc3\x00\x7b\x5e\xde\x4e\x88\x31\x2d\xdf\x5e\xb2\x90\x4f\x88\x73\xe4\xb9\x63\xe3\x54\xcd\xfa\xf1\x76\xee\x68\xc0\x4f\x21\x79\xb2\x3a\x9c\x30\xe6\xdb\xe7\xdb\x26\xfb\x3c\xf0\x7d\x62\xc7\xaf\x27\x9e\x17\x29\x09\xd5\x60\x7d\xeb\x84\x56\x23\xdb\x1d\xca\xbc\x49\x59\xd1\x60\xb2\x78\x49\x8b\xbe\x4a\xe9\xbb\x9e\xd7\x45\x15\x3f\xf0\x49\x25\x91\x5d\xbe\x7e\x81\x8c\xb4\x94\xee\xf8\x0d\x8e\x87\x5d\xd9\xd8\xe8\x29\xaa\x4c\x42\xaf\xfa\x0f\x11\x05\x43\x87\x38\x70\xda\x40\x95\x5a\x85\x3b\xcd\xce\x3e\x7e\x61\x7f\xd7\xe4\x98\x32\x4e\x8f\x1f\x54\x0b\xba\x88\x9d\x36\xa7\x0c\x53\xad\xb9\xbb\xda\xd7\xbd\x74\xed\xf2\xf7\x30\x67\xdb\x18\x89\xe6\x51\x43\x83\x9f\x67\x71\x37\x7b\xe2\x74\x4b\x7f\xf9\x93\xdb\x65\xff\xeb\xc6\x43\x39\x49\xcf\xee\xb5\x5a\xf2\xaa\x68\x43\x83\xb9\xd1\x36\x99\x1b\xac\x4b\x75\xca\xae\xd4\x3b\x86\x95\x7a\xa4\x6f\xa4\x2a\x69\x53\x31\x6a\x26\x93\x99\x23\xb2\x65\xe2\x8c\x9b\xf1\xcf\xc9\xc0\xf5\x95\x5c\x7a\x84\x31\xcb\x0b\x71\x2a\x64\xc8\x25\xe2\x8c\x19\x8f\x71\xe4\xfa\x03\x53\x36\x16\x33\xeb\xb4\xa0\x93\x77\x5c\x10\xc0\x8d\x8f\xc3\xfc\x6b\x5b\x3c\xbf\x85\x2e\x2a\x4c\xf2\x15\x0b\x55\xa2\xf4\x1e\x37\xaa\x64\x64\x46\x03\x75\x91\x68\x21\xa2\xba\x5a\x20\xab\x8c\x16\x74\xe2\x54\x2e\xf5\xed\xe9\x2b\x71\x82\x9d\x58\x95\x9a\xc2\xc8\xe3\x5e\x5a\x2d\x66\x74\x26\x61\xda\xf4\xa0\x9d\x19\xf0\xa4\xda\x2e\xff\x97\x9d\xc6\xf3\x6e\xd6\xd7\xb1\x32\x71\xab\xbb\xc6\x54\xa8\x5d\x94\xaf\x77\x0e\x97\x71\x37\xab\x81\xa9\xae\x00\x2d\xd6\xcd\x76\x0a\x6d\xdb\x03\x1a\xa7\x9b\x56\x4a\x35\x49\x3f\x0c\x46\x5d\xf4\x09\xc5\x5d\xd4\x50\x8d\x06\x2a\x6b\x1e\xde\xd4\xc3\xd9\xe0\xc3\x0e\xfb\xd1\x06\xca\xd3\x52\xed\xb4\x9b\x8f\x6a\xd9\xc3\xf6\x9c\x2c\x70\x28\x6d\xce\x04\x51\x8a\x09\x9a\x4c\x6a\xc9\xbd\x97\x90\xf4\x5b\xb5\x94\x01\x1a\x22\xb0\x1b\x68\x54\x3d\x56\x8c\x45\xc4\x6f\x71\x0a\x75\xd3\xf3\xb1\x9c\x51\x4c\xc6\xfc\x16\x43\xa1\xa1\x4d\xad\xd5\x74\xfe\x34\xfd\x0b\x48\x75\x99\x4d\x26\x5c\x23\x92\x6b\xb8\x6a\x9b\x4a\x7f\x60\x4c\x0d\x7e\x8f\xc6\x81\x87\xe3\x20\xfc\x6d\xf1\x7b\x1d\x0e\xcc\x54\x09\x31\xf2\x9a\x39\x1b\x03\x1b\x82\xb2\x92\xbc\x89\xbf\xad\xcd\xe6\xe4\xdd\x7d\x72\x32\x95\xaf\xf3\x6b\x5a\x2b\xb2\xff\x44\xb7\x57\xe7\x59\xde\x3a\x9f\x10\x5d\x49\xa8\x02\xab\xc6\x35\x0b\x4d\xf5\xc0\x77\xd5\xb8\xa6\x5c\x9a\x90\x7a\x96\x2e\x8a\x17\x04\xb4\xf5\xc4\xe9\xcc\xea\x6a\xa4\x5d\x37\xdb\xce\x42\xc1\x12\xeb\x59\x23\x72\xb7\x96\x2f\xec\x7b\x92\x75\x43\x3b\xd5\xd4\xb8\xe1\x56\xb3\x1c\x86\x55\x6e\xaa\xb1\x29\x69\x48\xfc\xf4\xd9\x69\x76\xb3\x4e\x74\x95\xd4\x4c\x65\xea\x8f\x1e\x3f\x53\x4b\x25\xad\x47\x63\xcf\x8d\xab\x5b\x17\xd6\xfb\xe8\x72\x63\x6b\xe0\x8e\xd2\x67\x58\xfe\x64\x94\xed\x78\xe2\x90\x15\x87\x11\xf9\xd1\x0b\x70\x0c\xc9\x8a\x1b\x35\xb7\x52\xbc\x99\x0d\x87\xc5\x52\x64\xc6\xf3\x62\xad\xb9\xd3\x1b\x72\x85\x25\x26\x4d\x01\xa7\x70\xa8\x02\xae\x9e\xb5\x03\x5a\x99\xa4\x96\x3a\xa9\xcb\xa8\x76\x19\x65\xcd\x2e\xf4\x74\x4e\x53\xad\xd2\xcd\x61\x7d\xcd\x2c\xdd\xbb\x79\x96\xaa\xb3\x4d\xdd\x3c\xeb\x16\x6c\xa4\x9d\xb2\x36\xec\x8e\xc1\x86\xcd\x37\x47\x77\x4c\x5b\x6e\x4a\xd9\x60\xb6\xb4\xe6\x31\x87\x5a\x73\xd8\x43\x2d\xb3\x41\x94\xbb\xd5\xc7\xab\x2a\x7f\x89\x83\xd4\xc7\x8f\x51\xf5\x91\xc2\xcb\xe3\xc7\x5a\x71\x3f\xa0\x06\x80\x56\x2c\xf2\x38\xba\x5a\x53\x26\x44\x8b\x97\x5b\xab\x19\x76\x15\xf9\x59\xf6\xac\x95\x4b\xde\x6e\x6c\x3a\x7b\x81\x16\xcf\xd2\xb7\xf9\xf1\x43\x76\x73\xb5\x6b\xe8\x3a\x89\xb6\xec\xd6\xe9\x67\xde\x96\xe8\xee\x8c\x2d\xd1\xdd\x52\xe8\x23\xbb\xc9\xa6\x7b\xfe\x81\xe9\xee\xac\x03\xd3\xdd\xec\x81\x69\x1c\x8c\x95\xe8\x38\x18\x6b\xbb\x35\xa4\xaf\x56\x84\x7e\xaa\xd1\x37\xae\xc3\xd4\x96\xc7\xc3\xb7\x26\x26\xe2\x0e\x86\x2a\x05\x16\x50\xae\x13\xee\xce\xda\xf7\x86\x46\x48\x60\x57\x96\x43\x60\x31\xec\x91\x6b\xfd\xdb\xb4\x89\xae\x2d\x91\x86\x38\x3a\x73\xfd\x81\x47\xa0\x53\x24\x86\x26\xef\x8c\x87\x87\x87\xa8\xa9\x0e\x22\x25\x21\x5f\x4a\x1e\xd0\xa4\xf0\x5e\x92\x62\xe4\xfe\xce\x21\x57\x96\xc7\x8f\xd9\x8f\x3a\xf6\xbc\xe0\x86\xda\x13\xa7\xd7\x24\xec\x7b\xc1\x0d\x15\xe0\x54\xa4\x99\x9a\xd3\xfc\xb5\x76\x59\x15\x19\x2b\xeb\x0c\x65\xcb\x6b\x25\xec\x23\x54\x71\x48\x3f\xaa\xa8\x6a\xad\x6f\x94\x15\x55\x71\xae\x82\x10\xaa\x88\xfd\x39\xad\x38\x5a\x6f\xd7\xe9\x26\xb1\xda\xee\xdd\x9d\x9e\x74\x19\x5e\xa8\xd6\xc5\x15\x6e\x8b\xc3\x78\x40\xed\x6f\x3a\x6c\xb0\xd1\xa0\xcb\xfe\x58\xbc\xeb\x77\xc5\x10\x70\x57\x53\x58\x48\x7e\xd7\x32\x7b\x8a\x8f\x52\xfd\x88\x4e\x5a\xa9\x39\x20\x99\x35\x92\x6c\x4a\x9a\xe4\x26\x4c\x12\x5d\x4d\x51\xfd\xfc\x99\x8e\xd1\xb5\x14\x75\x76\x66\xa7\xe4\x7a\x94\x1d\x9d\x3e\x7f\x36\x0d\x15\x40\x69\x81\x27\xcc\x06\x55\x16\x35\xc5\x9e\xf7\x7c\xfa\x06\xbc\xe9\x2b\xbb\xc0\x72\xae\x35\x18\x59\x3a\xac\xd0\x4b\xd7\x27\xc5\x98\x42\xed\x39\x31\x85\x5e\xb2\x71\x66\x09\x40\xa1\x9c\x5d\xf0\x12\x88\x42\x73\xd3\x64\x72\x3d\xfe\xf5\xf8\xf5\xf9\xe2\xf0\x44\x66\x8c\x09\x0d\x9e\x88\x6d\x6d\x2f\x40\x22\xf0\xc9\x69\x9f\xca\xaf\x7a\xb1\x68\xee\xea\x45\x05\xbc\xc1\x57\x2c\xc4\x7e\x1c\x79\x41\x44\x1c\xf9\x79\x3a\x26\xb0\xd7\x47\x27\x08\x1c\x26\xbf\x92\x64\x3e\x8e\x27\x21\xf6\xe8\xcf\x51\xe0\x07\x71\xe0\x93\xdf\xd4\x8f\x77\xea\x07\xdb\x85\x24\x63\xf1\xf7\x39\xe9\x07\xa1\x0c\x7d\xd6\x8f\x49\x58\x01\xf5\x99\xbf\x3a\xd4\x1a\xbb\x84\x9e\x37\xf1\xdd\xf8\x2b\xc8\x93\x37\xe8\x22\x05\x33\x98\x26\xc6\xbd\xbf\xa8\x42\x7d\x13\xdc\xc3\x9c\x7f\xe2\xfc\x75\x2b\x70\xfb\x57\xaf\x00\xbf\xcb\xb5\x08\xfb\xb0\x85\x24\x85\xb0\x24\x0d\x8f\x0c\x88\xef\x9c\x2f\x35\xb6\xcd\x7f\x1a\xda\x83\x31\xfb\xe5\xf1\x4f\xc7\xaf\x5f\x5c\x9d\xbf\x7b\xc3\xc6\x6b\x10\x8c\x38\x35\x5c\x62\xa8\x1c\x06\xa1\xfb\x91\xda\x92\x30\xdc\x5d\x93\x10\x16\x92\x15\x46\x5f\x3f\x85\x5c\xa0\x94\x5e\x10\x80\x15\x43\x17\x25\x4b\x10\x58\x43\x68\x6b\x0b\xdd\x0c\x09\x9c\x11\x0d\xf1\x35\x81\xc5\xa4\xcb\xae\x69\xaf\x21\x84\xc1\x0c\x79\x11\x7c\x8d\x41\x92\xeb\xc7\x22\x05\x13\x66\x3f\x2e\x3c\x39\x2c\x94\x91\x8a\x94\x35\xaf\xf3\x20\xaf\x39\xe4\xb5\x06\xdb\x02\x0b\x09\x2c\x41\x3d\xa4\x8b\x83\x25\x49\xf0\x15\xc5\x52\x34\xc4\x3a\x64\x29\x22\xb3\x31\x28\x73\x89\xcc\xc6\xa0\xcc\x9f\x53\xca\x62\x50\x96\xa8\xc1\x0c\x0c\xca\x52\x14\xf8\xce\xd9\x02\x54\x20\x27\x03\xb2\xa4\xa4\xb2\xe7\x84\x8b\x6a\xf9\x5a\xf6\x9c\x72\x61\x52\x6b\x86\xcd\xa8\xa5\xa6\x02\xfd\x90\x78\x49\xf1\x67\x4e\x93\x57\x45\xef\x98\x1f\x31\x2f\x31\xb3\x12\x1c\xc1\x32\x80\xfe\xdd\x64\x77\x0e\xe0\x67\x30\x89\x95\x60\xf1\xc9\x57\x23\x6c\x60\x56\x0e\x9f\x97\xa8\x10\x43\x47\x15\xab\x56\x16\x29\x6e\x84\x7d\x52\xed\xc2\x86\x66\xe6\x36\xb2\x33\x3f\x43\xb7\xd0\xe7\x59\xf1\x30\xdf\x51\x3f\x54\x0b\xa9\xc2\x76\xe0\xd6\xc4\xc9\x49\x17\x55\xfe\xd1\x6e\xee\xb5\x7a\x8e\x12\xf8\x5f\x36\x98\x35\x69\x08\xbf\xbe\xf5\x8f\x7e\xbf\x5f\x51\xc7\x97\x0b\xd8\xc8\x32\x68\xe1\xa3\x45\x2f\x98\xf9\xec\x88\x30\x3a\x8b\xf8\xb1\x60\xcd\xa4\x99\x8d\x1c\x0d\x6b\x76\x1a\x0d\xa3\xb2\xf0\x26\x97\xf6\x0e\x17\x9b\xb1\x6f\xcb\x9d\xf6\xec\x9b\x75\xf4\xe9\xce\xd4\x85\x4d\x39\xe0\xc5\x3d\xfa\x74\xb7\x76\x97\xb4\xf4\x80\xc4\xe2\x49\x76\x06\xa2\xe0\x2a\x24\xfd\x36\xdb\x00\x66\xa7\xf2\xfc\x7e\x20\x0d\xd6\xf7\xf3\xe5\x1e\x3a\x44\x69\x3b\xe8\x53\x2d\x4a\xdb\x3b\x87\x74\xe7\xae\xfd\x21\x95\x15\x82\xb4\xfc\x7a\xa2\x69\x26\x91\x78\x8d\x2e\x52\xf0\x6f\x11\xdd\xc3\xbe\x73\xe6\x7e\x24\x32\x5e\x04\xc8\xfc\x6c\x97\x46\xca\x80\x53\x51\x43\x45\xd2\xa0\xdf\x8f\x48\x2c\xd3\xb0\xcf\x83\x35\xb9\x21\xcd\xae\x66\x72\x2c\x31\xf8\x64\x3b\xee\x20\x41\x71\x6c\xa1\x51\x2e\x71\x8f\x82\x66\x86\x09\xa0\xd4\x41\xf7\x02\x8f\x77\x78\xa1\xe2\xc1\x0e\xdf\xa2\x76\xfb\xa8\x2a\xaa\x74\x78\x88\x54\xf3\x5f\x75\x1e\x90\x7a\xbf\x74\xbb\xf8\x03\x23\x4f\xf0\x78\x84\x63\x72\x14\x04\xa1\xe3\xfa\x38\x26\xa7\x7d\x40\x8f\x01\x4e\x3f\x21\xac\xbc\xe0\x41\x31\x55\x83\xae\xa2\x4a\x96\x6c\xed\xae\xfc\xc5\xaf\x3f\x74\x91\x2a\xdb\x2e\xfb\x03\x98\xcd\x82\xf5\xc2\x09\x3e\x0f\xf4\xb6\x5a\xab\x42\xdb\xd4\xd0\x53\x06\x40\xc4\x1f\x12\xd5\x23\x70\xe7\xc6\xe2\x92\x32\xb8\x09\x90\xba\x00\xae\x5f\xed\x16\xa7\x2b\x26\xbc\x16\x21\xe8\x42\x73\x66\x0e\x5e\x6f\x73\x79\x9d\x7e\x91\x86\x9c\x6a\x0d\x39\x5d\x45\x43\x9a\x44\x6c\x10\x30\x88\xf7\x4e\xdb\xf1\x4d\x36\x61\x53\x37\x73\xd3\x97\x6e\xd1\x9d\xc5\x87\x82\xda\xc1\x9a\x40\x0c\x69\xad\x0a\x58\x5c\x80\x05\xa5\x50\xc5\x77\x1f\x50\xc5\x1f\x50\xc5\x1f\x50\xc5\xbf\x20\xaa\xb8\xa4\x02\xcf\xd1\xf3\xdb\x7a\x6f\x55\x05\x2c\x05\x34\x9e\x26\xb6\x28\x2a\xf8\xbd\x60\xa9\x6f\xaf\x00\x4b\x7d\x7b\x39\x2c\xf5\xce\x3d\x62\xa9\x77\x56\x85\xa5\xde\x59\x01\x96\xfa\xff\x21\x6c\xf1\x7b\x05\x8d\x4f\x93\x5f\xa2\xb6\x69\x52\x0f\x40\xe7\x7f\x75\xa0\xf3\xfb\x06\xb5\x97\x17\x96\xef\x13\x8b\x7c\xfb\xfe\x21\xd5\x17\x81\x3b\x7f\xc0\x3b\x7f\xc0\x3b\x7f\xc0\x3b\xbf\x4f\xbc\xf3\x07\x30\xed\x07\x30\xed\x07\x30\xed\xaf\x0f\xa6\xfd\x2c\x24\xd8\x00\xa6\x4d\xbb\x31\x8d\x2a\xb5\xe1\x6b\x32\x46\xee\x07\x33\x9b\xb2\x54\x80\x99\x4d\xa3\x57\x88\x99\x4d\xc9\xfd\x4d\x31\xb3\x69\xd5\xca\x60\x66\x83\x08\x96\xc6\xcc\x2e\xc2\x69\x9e\x13\x13\xdb\x60\x30\xce\xc2\xc4\xc6\x21\xc1\x73\x60\x62\x5b\xa8\x87\x23\xf2\x52\x43\x5a\x4c\xa3\x3d\x27\xfb\xe6\x19\x94\x6c\x4b\x8b\x7b\xce\x49\x75\x25\x51\xb1\xb7\x3e\x03\x7b\x3a\x1f\x04\x9b\x2a\xa1\x7e\xaa\x26\x9e\xbc\x19\x41\xae\x93\x07\x17\x73\xa2\x67\x2b\xcf\x34\x96\x40\xc2\xd2\x78\xd1\x5e\x17\x99\xb1\xb8\x25\x26\xee\x02\x98\xdc\x29\xc9\x88\xa4\x45\xa0\xdb\x07\xf3\x09\x27\xc1\xf3\x5e\xb5\x74\x80\x9b\x3c\xf9\x68\xf8\xe0\x9a\x84\x16\xc3\x09\xd7\xd0\xae\xd9\x98\x6a\x46\xbb\xfe\xcb\x22\x37\xab\x29\x44\xcf\x4b\xd2\x88\x90\xfb\xc2\x77\x56\x86\x90\x99\x48\xcf\xff\x47\xc0\xc8\x32\x8d\x9f\x8f\x32\xaa\x3e\xbd\x6b\xcd\x78\x7a\xd7\x32\xa1\x91\xd1\x01\xbf\x3c\x10\x98\x69\x9b\xe3\x8b\xa3\x91\x2d\xc1\x04\x43\x23\x53\x8a\xff\xca\x70\x64\x52\xfa\xc5\x70\x64\x2a\xe0\x98\x1a\xac\x40\x8f\xa9\x6f\x0c\x05\x08\x99\x12\x56\x0c\x68\xb6\x38\x58\x99\x62\xfd\xaf\x1c\xb8\x2c\x73\x0a\xf1\x55\x81\xcb\xc0\x32\x5a\x06\xab\xec\x67\x79\x23\xe3\x2d\x3c\x2a\x2b\x18\xc0\xf4\xa4\x55\xec\x8d\x87\xd8\x34\x29\xe4\xa3\x14\x66\xc6\xf1\xb6\x1c\xc8\x0b\x46\x88\x76\x2e\xf4\xd1\x7f\xb5\xb7\xaf\xed\xba\x12\xaa\xf5\xa7\x88\xce\xbe\xbf\xc9\x1e\x75\xd1\xb8\xac\xdf\xaa\xdd\x9d\xf8\x8e\x12\xab\xbf\x19\xdd\x44\xcd\x54\x6a\xf1\xe2\x16\x04\x80\x9e\xa0\x57\x38\x1e\xd6\x71\x2f\xaa\xf2\x62\x36\x81\x9e\x36\x9e\x8c\xf0\xed\x3b\x74\xc8\x52\x8e\xf0\x2d\x37\xc4\xe1\xd1\x5d\x41\x2f\x37\x0c\xc9\xbc\x63\x71\x9c\x7e\xa1\xbd\xba\x35\xb3\xa0\x09\xde\xe7\xb7\xd4\x54\xfc\x0a\x39\x09\xaa\xac\xa4\x2a\x23\x13\x59\x10\x93\x0f\x88\x9a\xce\x67\x94\x86\x20\x36\x4b\x1e\x85\x12\x61\x97\x5c\x53\xec\xac\xb0\x87\xcb\x07\x98\xea\x95\x25\xde\xfa\xdf\x33\x6d\x7a\x2a\xbe\x65\xc4\x26\x4a\x3d\xcd\x9e\xf2\x3b\x7f\xec\x3f\xed\xe5\xa6\x0c\x15\x37\xa7\x41\x76\x1b\x02\xd6\x83\xe9\xfd\xe7\xcf\xa8\x59\x4b\x2f\x46\xf2\xfa\xf9\xaf\xfc\xa9\xc5\xcc\x5e\xae\x26\xcc\xef\xe3\xf9\xd8\x83\x99\x3e\xbe\x5d\xa6\x8f\x6f\x97\xec\xe3\xdb\xc5\x7d\xfc\x9d\xd6\xc7\xa7\xa9\x3e\xfe\xae\xb0\x8f\x6b\xa9\xe5\xa3\x79\x73\x27\x7f\xc7\x3a\xf9\xbb\x74\x27\xff\x6d\x85\x9d\xfc\xf6\x6b\x77\xf2\xdf\x72\x3b\xf9\x6f\x85\x9d\xfc\xb7\xfb\xea\xe4\xb7\x39\x9d\xfc\xb7\x2f\xd7\xc9\x1b\x5a\xf7\xe5\xba\xf0\x3d\x53\xae\xa7\xe2\x5b\x46\x6c\xa2\x34\xd6\x02\xef\xe5\x20\x25\x53\x77\xce\xf6\x7c\xf6\xb7\x6c\x37\x3f\xf2\xdc\xf1\xcc\x2e\x2e\x12\x99\xba\xb7\xbc\x80\xaa\xac\x36\xd4\x5b\xa8\xc8\x70\xab\x53\x3e\xe3\x2a\x86\x1e\x31\x8c\x2c\x25\x10\x47\x8c\x56\xc7\x0c\x29\xd0\x05\x71\x49\xfc\x55\x3d\x69\x66\xf5\xa7\x20\x9b\x18\x46\xc1\x7c\xf4\xc6\x14\xc4\x6a\xc7\x00\xb1\xaa\x81\xb4\x76\x32\x20\xad\x4c\x35\x32\x98\x8e\x9a\xa5\x6d\x02\x69\xed\x68\x20\xad\x3a\xca\xc7\x5b\xec\x0f\x74\xbc\x47\x08\x99\x03\xef\xef\x2b\x5a\xbf\x8b\x83\xa5\xaa\xa6\xf1\x32\x55\x5b\x25\x6c\xa9\x8a\x26\xf0\x29\x33\x2f\x66\xb7\x22\x93\x89\x35\xd9\x88\xcc\xaa\x4b\x16\x8e\x36\x07\x90\x16\xd6\x0d\xf4\x9f\x8a\x36\x9a\xae\xa5\xb4\xef\x11\xed\xde\x40\xb1\x18\x5b\xe1\xcb\xca\xee\x4b\xed\x08\xa4\x96\xbb\xb9\x72\x4c\x03\xfb\xe6\x3b\x7e\xd0\x50\x78\x73\x7a\xb2\x8e\xbf\xab\xa6\x32\x03\x0e\xe7\x40\x00\x97\x69\x50\x31\x22\x3c\xb4\xed\x37\xdf\xb6\xa9\xc3\x07\x68\xdd\x92\x4b\x7c\x3a\xc5\x95\x87\x36\xce\xa4\x5e\x10\xd9\x78\x29\x54\xb8\xcc\x22\x62\xc7\xb8\x88\x98\x0b\x3c\xce\xb8\x3d\xad\x63\x19\xef\x2c\x84\x65\xbc\xb3\x18\x96\xf1\xce\xbc\x58\xc6\x3b\xea\xae\x76\x16\x0a\x6f\x05\xc0\xc0\xea\x79\x97\x9e\xf6\x79\x66\xbf\xfd\xcb\x98\x0a\x79\xf7\x27\xff\xfe\xd0\xc0\xec\xcc\xf3\xff\x00\x34\xf0\xd6\x16\x9a\x8c\x1d\xaa\xc0\xb4\xa6\x31\x76\x03\x5f\x8b\x17\xd0\xc1\x52\x85\xff\xea\xe0\xc1\xc6\x85\xf9\x57\x01\x0f\x5e\x90\x93\xbf\x1c\x78\xb0\x50\x21\x65\x6c\x33\xc0\xe6\x7e\x99\x8d\x15\x73\x7b\xdd\x63\x73\x3d\x97\x4b\xd9\xcc\x91\xa6\xf8\x2f\x25\x9b\x02\x28\xe2\x1c\x58\xdd\x0c\x89\xa2\x1d\x9e\xdc\x5e\x9a\xf4\x53\x41\xa9\xa0\xa7\x66\xfa\x6a\x2a\x4f\xb6\x8f\x7c\x4b\xfd\xf5\x9b\xea\xb1\xf7\xd7\x67\x0d\xbd\xb6\xa8\xdf\x66\x7b\x6e\x2a\xbb\x09\x58\x39\xb5\x83\x93\x4c\x15\x96\xa6\x94\xb9\xa0\xe0\xd9\xdd\xc6\x95\xd8\x34\x68\xc5\x5b\x20\xc8\x00\x68\xb9\xdc\x76\x46\x4a\xf4\x59\xfc\x4c\x73\x91\x2b\x2d\x34\x1f\x4b\x13\x25\x78\x9a\xd2\x02\x3a\x52\x77\x7a\xb8\x12\x64\xa1\x35\x91\xb8\x0c\x24\xa1\xb7\xc5\x7e\x67\x5c\x4b\x25\xd4\xbf\x6b\xf7\x26\xdb\x55\x2b\x82\xbe\x23\xc6\xb6\xc1\x66\x49\x89\xed\x88\x65\x64\x55\xd4\x97\x0a\x76\x43\xd7\xf2\xc4\xb8\x00\x08\x39\x2d\x75\xe6\x9a\xb4\x10\x82\x3c\x1f\x24\xba\x04\xd0\x73\x66\xb1\xb9\x3b\xe7\x62\xd3\x08\x92\xac\xb0\xb8\x3a\xa4\x72\xe3\x02\xad\xa5\xad\xd0\xf4\x15\xc6\xdf\x08\xd8\x7c\x59\x72\x06\x3b\x68\x06\x56\x7a\xc1\x56\x48\x89\x83\x8b\xf2\x7d\x69\xe5\x98\xe9\x7b\xe5\x30\xd3\xf7\x0a\x31\xd3\xf7\x66\x5c\xdc\xda\x2b\x85\x99\xbe\x67\xc6\x4c\x57\x11\xcf\xf7\x0a\x11\xcf\xf7\x32\x88\xe7\x3a\xde\xfa\xde\x2c\xbc\xf5\xbd\x2c\xde\xba\x8e\x99\xbe\x37\x13\x33\x7d\x6f\x2e\xcc\xf4\xbd\x07\xcc\xf4\x72\x98\xe9\x70\xfe\xf0\xcd\x61\xa6\x7f\x0b\x17\xbc\x96\xc0\x4c\x9f\xcb\x36\x59\x06\x33\x7d\x4e\x23\xe8\x5e\x31\xd3\xe7\x38\xcd\xff\x52\x98\xe9\x4f\xd3\x73\x81\x62\xc0\xa4\xf3\x56\xe9\xb8\xfb\xf9\x73\xaa\x2b\xfe\xad\x91\xd1\xa9\x44\x8a\x91\xd1\xb7\xe7\x44\x46\x67\x56\xe4\x52\xc8\xe8\xe6\xa3\xa5\xe5\x90\xd1\xcd\x34\x57\x82\x8c\x6e\x46\x8c\xd0\x90\xd1\x39\x1e\xd7\x42\x54\x4a\xe1\xae\xce\xe2\x61\x91\x82\x39\x40\xe2\x22\x59\x19\x86\x79\xdd\x8d\xde\xb2\x27\xe1\xb0\xff\x3d\x0b\x1e\xfe\x9e\x24\xf0\xd7\x84\x87\x9f\x21\x5a\xab\x04\x3c\xfc\xb7\xaa\x51\xe5\xe0\xe1\xbf\x6d\xee\x4b\xc0\xc3\x7f\xdb\x15\x28\x01\x0f\xff\x6d\x57\x60\x26\x3c\x7c\x3e\xfb\xe5\xe1\xe1\x4b\xd0\x88\x62\x6c\x7f\xf8\x2a\x82\x5c\x62\x7c\x66\x6d\xc0\xe1\xe4\x4b\xe1\xdb\xcf\x18\x5e\xe7\x9e\x79\x0b\xf0\xed\xcb\xe2\xcf\xe7\xb2\x24\xe1\xe3\x4b\x01\xc4\xdf\xd7\xb4\x33\x13\xf0\x3c\x37\x6b\x09\xc0\xf3\xc2\xe9\x61\xa1\x8c\x09\x40\xfc\xd6\x16\x6c\x40\xc8\x87\xf7\x31\x3b\x0a\x9e\x81\x1b\x7f\x4f\x62\x5c\xb8\x3e\xcb\x08\x71\x89\xb6\x4b\xc4\xe8\x51\x03\xfe\x41\x62\x73\x48\x6c\x96\xbf\x88\x19\x1d\x1e\x34\x17\xdc\x44\xc0\x6d\xb1\x8c\x02\xcf\xf6\x9b\x31\xd3\x86\x2c\xf4\x9b\x91\xdc\x0c\xfd\x2b\x4d\x05\x00\xca\xcf\x2a\xc0\xef\x21\x2e\xd5\x04\xb3\xdd\x03\x14\x73\x52\x38\x97\xe4\xcf\x67\x65\xdd\x03\xcc\x92\x20\x50\x58\x6c\x9d\x36\x97\x7b\x80\x6f\x56\x0f\x16\xf3\x4c\x50\x3c\x18\xcd\xe5\x99\x60\x06\xa9\xf2\x38\xf9\x25\x1a\x6a\x2e\x1f\x07\x33\x55\xbf\xbc\x8f\x83\x12\xac\xcd\xe5\xe3\x60\x1e\x7a\xb3\x7d\x1c\xcc\x1c\x05\x17\xf4\x71\x30\xcb\x33\x81\xd1\x61\x80\x70\x0f\x90\x0a\x3a\x1d\x63\xdb\x8d\xa7\x5d\xd4\xa8\xef\x58\x33\xbc\x1a\x98\xdd\x13\xe4\xf8\x3a\xd8\xda\x12\x07\x2c\x41\x1f\x5e\x60\x67\x5c\x12\x80\x1d\x54\xe4\x1b\x21\xed\x06\x60\x31\x1f\x06\x66\xb3\xf9\x5e\x7d\x18\xa4\xfc\x09\x3c\xc7\x11\xf9\x95\x83\xd5\x2b\xd8\x2e\x6c\x83\x91\xc3\xb6\x83\xa4\x13\xd7\x02\x46\xdc\x7c\xb1\x55\xda\x53\xe8\x25\xf0\x11\x10\xc2\x0e\x66\xee\xe1\xde\x17\x50\x97\xe7\x8b\x7c\xd3\x53\x29\x96\x9f\xe2\xc0\x49\xc7\x64\x44\x42\xd7\xe6\x87\x56\x39\x70\xf9\xe8\x29\x3f\xe2\xe0\x78\xeb\xc2\x61\x80\x13\x8c\x30\xdc\x60\x56\xa8\x30\x2c\xf6\x3a\x8b\xaa\xb2\x6d\x57\x80\xc7\x50\x92\xb0\xd7\x47\xf0\x1a\x00\x38\xaf\xa8\xa0\x4b\x23\x7c\xab\xbe\xe1\x63\x84\x2e\x1a\x97\x16\x2f\xee\xa2\x79\xc9\x77\x76\x21\x35\x94\xcf\x52\xbb\x7e\x5e\xea\x35\x71\xfa\xa5\xb4\x06\x2d\xde\xc1\x31\x7e\xe5\xfa\x59\x7f\x00\x23\xd7\x4f\x76\x8f\xf3\xb3\xe2\x5b\x43\x56\x7c\x6b\x02\x5d\xa2\xd5\xfa\x1e\x35\xd0\x53\xf8\xd5\x4d\x3f\x52\xcc\xe3\xdd\x42\x8d\x04\x78\xa5\x44\x0d\x78\x69\x92\x16\xcb\x5b\xaa\x06\x7a\xd6\xe6\xa5\x2c\x36\x4b\xf3\x6f\xe7\x82\x63\xb6\x8f\x8d\x62\x1f\x1d\xb0\x1f\x92\x72\xc0\xa1\x84\xa9\x54\xc0\xac\x38\x01\xcc\x7f\x95\x58\x12\x2c\x13\xdf\xb3\x5b\x8f\xe4\x04\x96\x32\x8a\x0e\xb5\x4a\x3c\x7e\xac\x7e\x0a\x9c\x4d\x9e\x47\x1d\xd3\x00\x0a\x4c\x1d\x37\x8d\x63\xa5\xc8\x99\x3c\x03\x64\xf0\x9a\x2b\xf5\x2d\xa2\x5d\xab\x85\xb3\x6e\x5e\x37\xf5\x9a\x02\x4b\xaa\xd4\xed\x22\xd5\x28\x1b\x48\xbd\xc3\x99\xba\x71\xfa\x15\xdc\x98\xb0\xaa\x14\x5c\x3e\xc9\x87\x61\x97\xfe\x32\x74\xbc\x16\x56\x85\x0b\xd9\x8a\x16\x0b\xbb\xcc\x7d\x57\x9d\xb4\x1a\x80\x97\xca\x9b\x00\xca\x28\xf7\xe0\x6c\x45\xe5\x79\x96\x03\x13\x3a\xb2\x17\xf8\x5b\x81\x81\x5f\x6f\xb0\xaf\xed\x72\x45\xe7\x38\xe3\x75\x45\xe5\xf8\xff\x92\xe3\x15\x31\x1a\xa6\x2e\xf6\xeb\xc3\x0f\x3b\x18\x87\x2e\x24\xfa\x82\x92\xa7\x0c\x3a\x83\xa9\xe3\xe4\xdb\x6a\x02\xb0\x40\x6f\x27\x08\xa5\xe3\xba\x82\x78\x74\xd1\xb8\xd4\x55\x7a\x86\x01\x38\x83\x14\x92\xe0\x4b\x29\x7d\x64\x26\x0c\x1b\x56\x4a\x8c\x14\x8a\x74\xd4\x62\x13\xd3\x56\x21\x97\xc9\x71\x9b\x9f\xa3\x9c\xab\x1c\xc3\x5b\xe7\xf4\xbb\xcb\x64\xd3\x48\x0c\x8d\x69\x87\x3a\xdc\x3a\xd2\x00\xa0\x34\xdb\x28\x18\x33\x4c\xda\x71\x02\x6f\xc7\x91\xb4\x78\x52\x65\x36\x2b\x86\x09\x34\xdd\x3f\x71\xa3\x5f\xb1\xe7\x3a\xe2\x02\x0a\x2b\x4c\x4e\x03\x49\x21\x73\xde\x6a\xf1\x02\x9f\xe8\x34\x45\x05\x52\x0d\xbc\x04\xa8\x61\x1e\xab\x2c\xa2\x9a\x29\x6e\xc9\x2a\x95\x7c\x4c\xac\xfb\x16\x98\xfd\x94\x58\xbc\xae\x2f\x46\xce\xaa\x30\x68\x95\xb4\x9d\x0d\x55\xb9\x07\xc7\x4c\x02\x91\x36\xe5\x98\x69\xef\xc1\x31\xd3\x83\x63\xa6\x6f\xc3\x31\xd3\xfd\x38\x2a\xca\x16\xb0\x1a\xe7\x4c\x4b\x39\x2a\x6a\xdf\x8f\xa3\xa2\xf6\x0a\x1c\x15\xb5\x97\x73\x54\xb4\x7d\x8f\x8e\x8a\xcc\x7e\x60\x17\x72\xc6\x34\x5e\xda\x51\x51\xe7\x1e\x1d\x15\x75\x56\xe5\xa8\xa8\xb3\x02\x47\x45\x3b\xf7\xeb\xa8\x28\x4d\x7e\x29\xb7\x4c\xab\x70\x54\xb4\x2b\x66\xfb\xb7\xc4\x8e\xb1\x3f\xf0\x0a\x9c\x15\x2d\xd8\xbe\x7b\xf7\xef\x4e\x68\xff\xea\x0a\x9c\x25\x3c\xc7\x05\xb4\x1b\x8b\xfa\x2a\x6a\xa8\xf7\x76\x8f\x88\x97\x3f\x57\x37\x1b\x8b\xfa\xf7\xf9\x3b\xfa\x43\xba\x47\x5f\x45\x26\x0f\xd0\xab\x76\xb9\xb4\x88\x3f\xa4\x07\x77\x48\x0f\xee\x90\x1e\xdc\x21\x3d\xb8\x43\x7a\x70\x87\xf4\xe0\x0e\xe9\x6f\xed\x0e\x89\xd9\x0e\x08\xa3\x41\x18\x4c\xc6\x28\xe8\xa3\x1e\x0e\x0d\xfe\x91\xa0\x63\x3f\xc7\xe5\x90\x57\xbe\x9c\x7f\xa4\xe7\x38\x2c\x70\x8f\xf4\x1c\x87\x2b\xf4\x8e\xf4\x1c\x87\x7f\x53\xe7\x48\xcf\x71\x58\xc6\x37\x12\x15\xc0\x3d\xb9\x46\xe2\x7e\x66\xe6\xf4\x8d\x64\x30\x50\x67\xf9\x46\xea\xe1\xb0\x94\x6b\x24\x07\xc7\x38\xdf\x1d\x12\x20\x0b\xd0\x3c\x5d\x38\xfb\x5c\xc2\xb9\xd1\x9c\x3e\x8a\xd4\x4c\x63\x83\xf3\xa3\xea\x0c\x46\x8a\xbc\x09\xcd\xeb\x11\xa8\x90\x17\xcd\x83\xcf\x12\x9e\x7b\x60\xd0\x42\xe8\x09\xe2\x57\x36\x50\x3c\x24\x4c\xe6\x41\x1f\x11\x6c\x0f\xd9\xc0\xc5\xd2\xfc\x6b\x8c\x43\x3c\x42\x9f\x98\xe6\xdc\xf1\xeb\x1b\xec\xee\x1a\xed\xb2\x34\xaf\x5c\x9d\x99\xb3\xb8\x31\x19\x89\xd3\xa5\x67\xbe\xb4\x37\x68\x69\xcf\xe9\xc0\xa8\xe6\x81\xce\x7d\x47\x07\xcc\x37\x41\xe4\x82\x38\xd1\xf9\x90\x88\xbb\x0d\xd8\x77\x50\xe4\x7e\x24\x92\xd3\x5e\x9a\x80\x28\x94\xdd\x25\x61\xff\x9d\x0f\x53\x37\xa2\x69\xf6\xdb\x4d\x7c\xeb\x46\xe6\xcc\xd3\x59\x99\xa7\x86\xcc\x9c\x75\xf5\xfe\x04\x64\xe6\x01\x52\xc2\x98\x32\x0d\x42\xe1\xf9\xd9\x98\x23\xf2\x8b\x7b\x34\x90\x1e\x52\x6c\xad\x65\xfc\x2d\xc1\x18\xfd\x97\x75\xb7\xe4\xf0\xab\x2c\x2c\x11\xfd\x5a\xbd\x13\x25\x18\x6c\x4a\x3a\x4e\x92\xfb\x3b\x85\x38\x17\x32\x95\xe9\xd4\x4e\x48\x29\x14\x89\xb2\x00\x6f\xc5\x27\x62\x99\x1d\xdb\x99\xe7\x77\x6c\xba\x4a\x8a\x9b\x8f\xf6\x8c\x53\x3c\x84\xee\xe7\x24\x2f\xcd\x74\xe6\x3c\x0f\x99\xae\x9e\x2c\x51\xcd\x92\x27\x7b\xa6\xbd\x3e\xe3\xf9\x5e\x8a\xd3\x14\xa6\x83\x64\x74\x06\xa0\x8a\x2c\x25\x2a\x09\x12\x6f\xca\x90\x9a\x50\x8b\xdd\x79\x41\xed\x74\x50\x7d\x08\xd2\x12\xf5\x70\x44\xca\xfb\x9b\x32\x6d\x34\x2d\xe2\xf4\x4a\x17\xa1\xc3\x2f\x9e\x39\xf9\x57\xbf\xd2\x8e\xa7\xc6\x19\xaf\x53\x77\x56\x52\x17\x05\x47\x4e\x5c\xf9\x30\x7b\x6e\x5a\x42\xb1\x4a\xc1\x55\x98\x36\x7b\x67\xe0\x6c\x19\xfd\x68\xe5\x80\x45\x53\x33\x4c\xea\x5f\x45\x49\x5f\x0a\xd3\xda\xdc\x98\xec\x6e\x71\xdf\xf5\x62\x12\x1e\x5f\x53\x9b\xf9\xb4\x7f\x34\x74\x3d\x6e\x03\x72\x67\x57\x63\x4d\xcc\x6e\x0a\xd9\x3a\xd1\x7c\xce\x1b\x73\xff\xa5\x32\xa8\xc1\x9e\x71\xa2\xe9\x41\x17\xb4\x55\xf4\xbf\x04\x05\x43\x75\xa0\x55\xb2\xcb\x95\x47\xa2\xce\xc9\x63\xf2\xa1\x57\x80\x43\x5d\xe0\xa5\x4e\x9d\x08\x5b\x30\x13\x66\x71\xbe\x95\x04\x59\xc0\xef\x7c\x0c\xa0\xd6\x42\xf8\xd3\xad\x85\xf0\xa7\x5b\x8b\xe1\x4f\xb7\xe6\xc5\x9f\x6e\xe5\xe1\x4f\x8f\x93\xf5\x86\x82\x3b\x24\x42\xe7\x80\x8c\x9e\xa3\xab\xcf\x7f\x92\xf5\xf7\x87\x8c\x86\xa5\xe0\xdf\x02\x31\x5a\x00\xf6\x72\xad\x2a\x98\x8d\x4c\x48\xb2\x29\x60\x58\x71\x99\x5a\xfc\x96\x00\xb1\x5a\x26\x01\x3d\x3b\x1b\xab\xb7\x1c\x6a\xac\x71\x29\xbf\x14\x6a\xec\x62\x88\xb1\x0b\xf2\xa1\x21\xc6\x16\xf3\x21\x3c\x74\xdd\x1b\x2f\x1c\x99\x89\xf1\x03\x1f\x33\x79\xfa\x59\x00\xb8\xdd\x1b\x53\x1c\x11\x8e\x73\xc5\xbe\xb2\xe0\xba\x45\xc0\xba\xa9\xa4\xc8\x08\xb4\x9b\x49\x64\x00\xde\xcd\x26\xe2\x90\x56\x99\x56\x32\x26\x16\x88\x57\x59\xf9\x65\x01\x53\x67\xe0\xf3\x96\xba\x82\xae\xb6\xd9\xd5\xdc\x20\xd8\xf3\x37\x57\x23\xd3\x48\x59\x3e\x00\x0d\x30\x83\x7b\x3d\x47\x63\xa2\xc4\xeb\x29\xda\xd0\xca\x43\x9b\x48\x85\x15\x9b\x25\xc2\x85\x90\xc1\x97\x10\x8a\xa9\x3f\x81\x97\x4b\x13\x10\xf8\x5a\x69\x71\x08\x50\xb5\x54\x75\xef\x74\x22\xab\x35\xfe\x57\x6c\xfe\x1b\xf1\x96\x55\xb4\x5c\xe3\xb2\x50\x4c\x5b\x4b\x62\xe2\x26\xb4\x4b\xda\xc8\x46\x20\xd0\x7c\x57\xac\x9a\xf1\xdb\xce\x18\xbf\xf9\x96\x6d\xbb\x18\xec\xb6\xac\x2d\x98\x8b\x37\xab\xad\x40\xd3\x58\xb3\x40\x79\x49\x1c\x58\x78\xb4\x05\xe4\x67\xe1\xbf\xe6\x2e\x40\x4a\xa0\xbf\xe6\x6f\x19\xcc\x68\x78\x71\x5d\xa8\xb0\xd9\x45\x22\xa5\xd1\xe1\x44\xb3\xc0\x43\xf8\xbd\xb8\x00\xcf\x77\x03\xaa\xe9\xd7\x76\x46\xbf\x74\x0c\xd7\xed\x59\x18\xae\xdb\x59\x0c\xd7\xd4\xf2\x6c\xdb\xb0\x3c\xb3\xe9\x5a\x39\x24\xbe\x92\x48\x04\x69\x0b\x45\xc2\xa5\xc9\x6f\xaf\x2f\xba\x5c\x77\xf9\x72\xdd\x77\x60\x91\xfe\x7c\x7a\x3e\x1d\xf3\x17\x33\xa2\xd8\x22\x80\x04\xed\xaa\x98\xe9\x70\x51\x7f\x8c\xa6\x32\x3d\x4f\xc3\xc9\x77\x8a\x46\x0f\x8e\xe8\x29\xb4\xdc\x45\xe3\x52\xcc\x5e\x5b\xa8\x85\xba\x32\x90\x21\xe7\x6e\xa1\x96\x64\x26\xb9\x34\x83\x63\x0c\xb8\x95\x3f\x06\xe1\x08\xc7\x31\x09\xab\x32\x28\x79\x51\x97\xe5\x54\x35\x0b\x6e\xbb\x09\x19\xdd\xab\xf8\x54\x8d\xd1\x1c\x8b\xf3\x1e\x92\xc4\x66\x1c\x89\x83\xa8\x7e\xc5\xde\xe2\x8f\xa2\x0a\xdf\x0c\x1a\x6a\x99\x0c\xf7\xf3\x7b\x26\x9d\xb9\x5f\xac\xb6\xbc\x6a\x46\x3a\xf2\xf8\x2e\xa9\x3c\x07\x1a\x4b\x75\x2f\x0e\x61\x96\xea\x53\x79\x8e\xcd\x98\xc6\x74\xf9\x5f\x4b\x2b\x4f\x6f\xf0\xae\x21\xac\xec\x0e\xd1\xfc\x28\xd7\xf9\xde\x37\x35\x94\xeb\x4e\x16\xe5\x5a\x1d\x9b\x3a\x99\xb1\x29\x0b\x62\xdd\x31\x83\x58\xeb\x83\x58\x67\xd6\x20\xd6\x31\x0c\x62\x2a\xd2\x75\x27\x83\x74\xad\xa2\x64\x77\xd2\x28\xd9\x3a\x88\x75\x67\x26\x88\x75\x67\x2e\x10\xeb\x8e\x11\xc4\x9a\xe7\x52\x31\xac\x1d\x31\x25\x2b\x13\xf6\x17\xc5\xaf\x2e\x89\x47\x6d\xbe\xcc\x5d\x4d\x1d\xa5\x7f\x7b\x70\xd4\x2b\xd9\x13\x9b\xdb\xfa\x5d\x15\x1a\xf5\x5c\xf6\xfb\x32\x68\xd4\x73\x2e\x14\xee\x15\x8d\x7a\x36\x2f\xf7\x8e\x46\xfd\x2d\x1e\xa7\xcc\x7b\x8a\x92\x76\x46\xb3\x8c\x0b\x60\x75\x09\xaa\x8d\xb0\x26\x8b\xbd\xaa\x48\x36\x49\xac\x24\x4d\xcc\xef\x6f\x1c\x8d\xdb\x51\x16\xa2\xf9\x58\xdc\xcf\x71\x58\x0c\xc5\xdd\x9e\x13\x8a\x1b\x96\x2f\x4b\x21\x71\x9b\x2d\xec\xe5\x90\xb8\xcd\x34\x57\x82\xc4\x6d\x7e\x12\xa5\x21\x71\xcf\x06\x01\xcc\x25\x22\xe0\xaf\xa4\x95\x6e\x69\x3b\x6b\xa5\x71\x75\x8b\x0b\x98\x85\xfd\x96\x9b\x7b\x36\xf6\xdb\x0c\xf1\x94\x46\x36\xfe\x0b\x54\x60\x31\xf6\xcb\x03\x03\x97\xa0\x51\x02\x18\xf8\xdb\x16\x64\x0f\x87\x0c\x3c\x62\x71\x16\x4a\xa0\x94\xdf\x93\x0c\x66\xa3\x4c\xcf\xe0\xbd\x1c\x4a\xf9\xb7\xcd\x7d\x09\xb7\x03\xdf\x6a\x05\x16\xca\x6a\x74\x3b\x50\x0e\xdf\x7a\xc6\xa8\x3f\xf7\x7c\x56\x80\x6f\x3d\x72\x7d\x58\x9b\xaf\xa0\x73\x8d\xf0\xed\xf3\x95\xf4\xd2\x59\xd0\xbb\xb9\x24\x24\xd6\x36\x5c\x4d\xf9\x0a\x9a\x36\x0b\xee\x38\x37\x23\x87\x3b\x4e\x7a\xca\x42\xcc\xcf\x06\xad\xcd\xef\x23\x65\x41\x6b\x4b\xb4\xdf\x0c\x14\xa6\x52\x14\xf8\x92\x67\x49\x2a\x62\xa9\xb4\x24\x99\x10\x3b\xee\x64\xc1\x29\xf8\x6b\x4d\x9e\x0a\x94\x72\x09\x08\xe0\x6f\x8f\xff\x25\x06\xed\xa5\xd0\x83\x8b\xfb\xf6\x5c\xe8\xc1\x33\x48\x95\x47\x0f\x2e\xa1\xa4\x73\xa1\x07\xcf\x18\x40\xe7\x41\x0f\x2e\xc1\xda\x5c\xe8\xc1\xf3\xd0\x9b\x8d\x1e\x3c\x73\xf9\x74\x4f\xe8\xc1\xa5\x11\x80\xd9\x9e\x4f\x66\x1e\x6e\x64\xa0\x7b\x99\x27\x04\xfe\x60\x81\xbd\xb1\x60\xd3\x04\xc3\x01\x16\x2b\x49\x65\x3d\xb8\x30\xd8\xaf\xd9\x86\x58\x0e\xec\x77\xbb\x10\xeb\x17\xfa\x42\xb6\x93\xca\x0d\xff\xec\x93\x1b\xf4\xe9\xce\xd4\x17\x4d\x39\xe0\xc1\x10\xfa\x74\xb7\x7a\x74\x54\x97\x23\x5b\x41\x0c\xfd\x48\x60\x4b\x93\xc7\x32\x09\x72\xa9\x0c\x2b\x8d\x6e\xfa\xb5\xe1\x57\xbf\x4d\xf8\x54\x89\x4d\x5a\xee\x52\xbc\xf9\xf4\xae\x2f\x0f\x66\x45\xab\x9c\xf6\x9f\x63\x09\xd6\x9c\xb4\x15\xb4\x72\x4d\x60\x07\x3e\x1a\x07\x51\x0a\x98\xf7\xe2\x52\x43\x6e\xce\x81\x75\x15\x57\x9b\x62\x32\xfa\xa7\x50\x29\xfa\xa1\x6b\x94\x02\x67\x9b\xa4\x4c\x83\xda\xaa\x47\xd8\x4a\x2a\x79\x9e\xcc\x93\xa9\x23\x4a\x2a\xa9\x1a\x75\xb0\x12\xc8\x69\xa1\x15\x02\x79\x5a\xd5\x9c\xa7\x05\x38\xd4\x7c\x2b\xd6\x84\x60\xbb\x68\xcb\xfe\x21\xce\x65\x25\xf4\xad\xd2\xb2\x9f\x58\xb3\x74\x05\x10\x9c\xc2\x59\x57\x93\xc0\x9d\xc4\xc6\xb5\x89\xe7\x2d\xf3\xfc\x62\x28\x35\xed\x99\xe7\xcd\x7b\x01\xc0\x04\xe7\x92\x7b\x0f\x40\x3c\x77\x5a\x0d\x60\xaf\x72\x60\x6c\x08\x9b\x1a\xc2\xc4\xe9\x63\x3a\x5c\x1e\x3a\x66\x90\x80\x15\x35\xc9\x82\x01\x2f\xaa\x00\xcf\x41\x3a\x71\x38\xf1\x6d\x1c\x93\xe7\x53\xae\x94\x20\xf3\x12\x00\xc3\x96\xae\xcc\xb5\xbf\x0c\xe0\x70\x3e\x9c\xda\xa2\x80\xc3\xfc\x70\x40\x36\xd7\xcc\x6b\x9c\xb7\x4b\x88\xe4\x43\x1e\xc8\x6c\xd2\x79\x25\xef\xd8\x74\x83\x21\x0b\x24\x2c\xa3\x0c\xd8\xb3\x99\xab\x0c\xe3\x20\xaa\xa7\xaf\x33\x68\xf8\xb4\x32\x54\xc5\xa9\x4d\x5d\x65\x60\x1d\xc3\x88\x1c\x2c\x12\x88\x5e\x42\xcb\x8b\x60\x00\x4e\xf5\x92\x6c\xee\xc6\x65\x0d\x6d\xe6\x51\x55\x94\x03\x30\xeb\x71\x2f\xaa\xaa\x03\x7c\x0d\xfc\xae\x3f\x7e\x8c\x64\x2c\xbf\xf3\x8a\xbe\x47\xe6\x0c\xe9\xd7\x5c\x0e\xf1\x60\xaa\x5e\xf0\xce\x29\x1b\x00\x47\x38\x1e\x9e\xb9\x03\xde\x0f\x79\x65\x3f\x7f\x46\x3a\xab\x4f\x72\x2b\xb1\x99\xe1\x5f\xbd\x36\x3a\x45\x9b\x87\x8c\xcf\x83\xf4\xb0\xb3\x91\x8a\xb8\x33\xf5\xe7\xdb\x14\x42\xad\x94\xbb\xda\xac\x5f\x4e\xb3\xa7\x46\xcd\xce\x1a\x68\x5f\x54\xb3\x85\xe2\x1a\x51\xa6\xd1\x66\xb1\xfc\xa4\x76\x27\x6a\x3f\xbf\xe2\xb2\x7b\xc9\xa5\xf5\xf6\xea\x1e\x14\x97\x09\x61\x31\xbd\x65\xec\x2b\x17\x7f\x19\xb1\x8d\x43\xce\xa9\x71\xdc\x2d\xf1\x5a\xe0\xb6\x8b\x6e\xe1\xb2\xc0\xb4\xf8\xaa\x80\x25\x41\x5e\x34\xeb\x8c\x4d\x04\x1c\x60\xfb\xa2\x29\xcf\xe7\x4d\x18\xdb\x16\x37\x87\x1e\x3f\x66\x3f\xf8\xbb\x99\xf4\x77\x5d\x81\x03\xd6\x8e\x95\x15\x7c\x67\xb6\x7c\x05\x7b\x25\x0d\xe4\x9c\x81\x6d\x5e\x29\xdc\x2e\x87\x38\x49\xa1\xed\xee\x3f\xa0\xed\x3e\xa0\xed\x7e\x1b\x68\xbb\x80\xf4\x9f\x87\xe5\xb9\x20\x96\x62\x9e\x23\x81\xe5\x90\x76\x81\xd4\x03\xce\x6e\xd1\xa6\xe3\xdf\x1a\x67\xf7\x5e\xe1\x67\xd3\xe4\x97\x02\xdb\x5d\x05\xfc\xec\xce\x3d\xe2\x0a\xef\xac\x0a\x57\x78\x67\x05\xb8\xc2\xbb\xf7\x8f\xbb\xfa\x65\x70\x76\xef\x1d\x76\xb5\x71\x75\xf5\x3f\xd4\xec\x2d\x90\xcf\x12\x20\xbb\x0c\x00\xe5\x68\x12\x5e\x17\x00\x1d\x2f\x4a\xbf\x25\xe8\x9f\x4d\x47\xbd\xa0\x48\x38\xfb\x0b\xe2\xbb\x53\xab\xfa\x1e\x91\x8e\xb7\xbf\x00\xd2\x71\xe7\xfe\xd1\x81\x77\x1e\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x67\x21\xf7\x46\x36\x3c\x21\x8c\x4c\xf0\xbd\xd0\xbd\xcf\x58\x82\x32\xdb\x7e\x26\x3b\xf7\x7e\x20\x7c\x39\x53\x05\x30\xbe\x3c\xc5\x0a\xa1\x7c\x39\xc5\xbf\x29\x9c\x2f\xaf\x5d\x19\x48\x5f\x21\x88\xe5\x61\x7d\x99\x83\xed\x13\xb6\x4b\xbe\xd9\xb4\x4a\xe1\xfc\x4a\x18\xcc\x37\xc2\x9b\xaa\xe2\xc0\x1a\x82\x66\x60\xf0\xbe\xd1\x3c\xe1\x7d\x59\x1c\xde\x2f\x85\xb1\x3b\x2f\x2a\xb2\xc1\x30\x9f\x85\x8a\xcc\x47\x0e\x8e\x8c\xfc\xe5\x90\x7a\xb3\x10\xb8\x65\xe1\x6f\xb3\xf8\xb7\x65\xb1\x6f\xd1\xa7\x33\xb8\x3f\x79\x27\xaf\x94\xd0\x9c\x4c\x32\x60\xb8\x03\xec\xad\xca\xab\x78\x79\xcf\x41\x6f\xcb\xa1\xde\xca\x61\xed\x2f\x8b\x7c\x2b\x3d\x1c\xf3\x64\xec\x7b\xa5\xe8\xb7\xac\xfb\x8a\xae\x5e\x12\x01\x97\x2d\xca\x4f\x62\x32\x2a\x7c\x04\x9f\x24\x2b\xc2\xc0\x8d\x20\xd5\x97\x01\xc0\x95\x65\x2d\x81\x66\xf0\x65\xd1\x6f\x25\xc7\xe5\xa0\x6f\x17\xad\x60\x49\xdc\x5b\xc3\xbe\xcc\x1c\x6e\x2d\x63\xb8\x56\xca\x2a\x22\x9c\x58\x22\x03\xd4\x04\xab\xc4\x0c\xf8\x05\xce\x40\x49\x40\xdc\x4c\xea\xcc\xe4\x56\x8c\x87\x3b\x0b\x9a\x53\xe0\xe5\x0a\xe0\x49\x06\x3f\xaa\x76\x7b\x98\x9c\xcf\x52\xc9\x94\xd0\x6c\x62\x79\x61\x51\x4b\x0c\xa1\x8b\xc3\xf0\x9a\xf6\x1d\x97\x47\xe1\xcd\xf7\x47\x5c\x0a\x7f\x97\x37\x2c\x6b\x77\x86\xf7\x8a\x0c\x98\xbc\x7f\x43\x14\x5e\x31\xed\xb3\xaa\xcf\x0b\xc3\x6b\x6e\xcc\x55\xa2\xf0\xaa\x4d\xa2\x32\x97\x0f\xc1\xab\x0c\xfa\x9a\x1a\x1f\x1e\x22\x17\x3d\xd5\xfa\x41\x17\x2d\x8b\xd2\xcb\xbb\x75\x79\x88\x5e\x53\x86\x39\xf1\x79\xf3\x21\xca\x52\xd3\x75\x9b\xcf\xd7\x0b\xc3\x94\x19\xcd\x06\x1d\x80\xb7\xbd\x10\x00\x6f\x7b\x31\x00\xde\xf6\xbc\x00\xbc\xed\x22\x00\x5e\xb9\xe0\x48\xc1\xae\xbd\x49\x19\x39\x5f\x06\x70\x24\xef\x3c\xef\xef\x0f\xc2\x3b\x76\xc9\xdf\x13\x84\xb7\x70\x52\x2a\x01\xc3\xcb\x15\x94\x03\xf1\xb2\xaf\x65\xa1\x78\x8f\xe6\xbb\x84\x3a\x27\xc4\xab\x2d\xc1\x78\xed\xd9\x68\xbc\x47\xf3\xdd\x1a\x9c\x97\x15\x89\xc7\x6b\xcf\x06\xe4\xe5\xaf\x00\xee\x8d\x99\xc8\xfd\x48\x04\x3b\xf4\xf7\x92\xb0\xb7\x76\x0a\xf7\xf6\xe8\xd6\x08\x53\x6b\xa7\x90\x6f\x8f\xa6\xc6\x64\x11\x5c\x90\x4c\x8b\x63\x6e\x24\xdb\x85\x60\x58\xe7\x97\x67\xa3\x48\x8e\x85\x00\xab\xd9\x7a\x56\xe3\xda\xdf\x19\x6d\x35\xbb\xe6\x58\x11\xd4\x2a\x27\x5c\xc6\xd0\x31\xe2\xd0\xe5\x83\x60\xa6\x2c\x98\xed\xb9\x2c\x98\xed\xd9\x40\xab\x65\xe7\xfc\x5c\xb0\xd5\x71\x32\x26\xb3\xd1\x3d\x0d\xb8\xca\x4b\x58\x12\x72\x95\x51\xb1\x78\x21\xb3\x60\x57\xcd\x46\x65\x09\xcc\xd5\xdc\x55\xe9\x3d\x41\xae\xa6\xe0\xeb\x64\xfb\x15\xc1\xb0\x1e\xcc\x6c\x93\x95\x83\xb4\xe6\xe3\x24\xa6\xf4\xb3\x63\xd0\xcf\xe5\x31\x0e\x33\x28\xac\x9d\xd9\x28\xac\x4b\xac\xbd\x97\x7b\x82\xd5\x5e\x1c\x84\x35\x2a\xdb\x32\x05\x88\xa9\xef\x96\x84\x4c\xb5\xf3\x31\x53\xed\x62\xd0\x54\x2d\x76\x1e\xc0\x54\xd3\x95\x96\x95\x02\xa6\x16\x88\xeb\xb7\xaf\x26\xae\xdb\x6f\x56\x5c\xbc\xce\x9a\x66\xa6\x8c\x76\x78\xbe\x9c\xdd\x48\x72\xdc\x90\xd8\x7c\x61\x9b\x3c\x57\xad\xcb\xe0\x64\x3e\x59\x05\x8a\xad\x9b\x42\xaf\xe5\x43\xb2\xab\x2d\xfa\xe0\xd9\x40\xce\xa0\x94\x79\x13\x96\x87\x6b\x9b\xbc\x98\x57\x6a\x78\x78\x88\x2a\xb7\x15\xf4\x54\xc5\x3e\xee\x6a\x2f\xdd\xd2\x8c\x64\xa0\x6e\x0d\xc4\x0c\x2a\x8a\x4c\xa0\xb8\xef\x92\x06\x2c\xbf\x3b\xf3\xd2\xf5\x8b\x7d\xe4\xd1\x04\x46\x0b\x65\xa7\xec\x0c\xb0\x63\x98\x01\x3c\xd7\x27\x4a\x02\xfa\x99\x8e\x3e\x9f\x8e\xd3\x49\x68\x50\x3a\xd9\xbf\x29\x6d\x43\x5a\x19\xae\xfb\x4c\x63\x7b\x79\x5f\x7c\x2b\x36\xe1\xc0\x9e\x44\x71\x30\x7a\xc9\x6f\x23\xdd\x37\x13\x54\x12\x5a\xf1\x34\x40\x5a\x78\xe9\x77\xb6\x4c\xa2\x1c\xb1\xdc\x70\xd4\x93\x34\x0b\x55\xce\x3f\x28\x19\xcd\x05\x87\x46\x3c\x7f\x69\xaf\x2f\xc1\xc5\x78\x4a\x47\x51\xb1\x30\xb6\x12\xcf\x17\xf6\x34\x19\x8f\x34\xcd\x4e\x57\xca\xe4\x31\x4e\x6d\x6e\x75\x5c\xe8\xbb\x9e\xd7\x45\x15\x3f\x90\xca\x8f\x00\xad\x20\x0c\x3e\x90\xae\xae\x24\x8f\x1f\x6b\xdf\x75\x9a\x55\xb0\x60\xa5\x5b\x53\x2d\x63\xcc\x0f\xdd\x13\xa1\x28\x7d\x52\x11\xea\x52\xe7\x67\xd0\xbe\xe9\x26\xe0\x0d\xb8\xc4\x38\x0a\xfd\x31\x11\xeb\x6a\x4f\xd0\x8a\x78\xa6\x3f\xab\xb9\xe5\xae\xa2\x9a\x65\x4f\xd1\xd2\xb7\xa7\x67\x9f\xa1\x79\x8a\x16\xf0\x73\x34\x7d\x80\x2a\x38\x4e\xbb\xe7\x9d\xd3\xe5\xa0\x9a\xb3\x47\x21\x1e\xcc\x1a\x89\x17\x40\x43\xac\xba\x5b\x28\x5a\xab\xe4\xda\x79\x7e\xd4\xf6\xdd\x72\xa8\xed\xbb\x19\xd4\xf6\xd4\x54\xb5\x3b\x6b\xaa\xda\xcd\x4c\x55\x59\x60\xf7\xdd\x32\xc0\xee\xbb\xb3\x16\x3d\xbb\x33\x80\xdd\x77\x0b\x81\xdd\x77\x8b\x81\xdd\x77\x67\x02\xbb\xef\x72\x60\x77\x33\x3e\xfb\x38\x59\xc1\x6b\x6b\xfc\x79\xd6\x91\x25\x21\xd6\xcd\xef\x5a\xaa\x86\x7b\x39\x0f\x30\xeb\xbc\xef\x9a\xb4\x53\x05\x5c\xd7\xd5\x77\x05\xf8\xd7\x0f\x00\xee\x2b\xe1\xe5\xde\x01\xdc\x61\x28\x7b\xfc\x58\xdd\xde\x62\xe6\xbd\x82\x14\x50\x0c\x48\xfe\x2d\x9e\xe5\x7f\xca\x9b\x87\x22\xbe\x07\x9b\x8b\xce\x2e\x37\x60\xd7\xd2\xd2\xcb\xc7\x35\xe7\x37\xd6\x56\x8b\x6d\x7e\x26\x47\xb0\x25\xf0\xcd\xcd\xcb\x84\x22\x28\xf2\x79\x69\x95\x80\x4a\xff\xb4\xf6\x55\x61\xc3\x57\x04\x35\xfc\xf5\x60\xc3\x57\x54\x81\x8f\x7f\xf5\x0a\xd0\xa1\xea\x2b\x70\x0f\xf8\x95\x4b\x20\xa5\x2f\x0c\xe6\xb9\x34\xe6\xaf\x58\x9b\x2f\x85\x66\xd9\x77\xe3\xd8\xf5\x07\x15\x4b\xac\xee\x13\xda\x72\x19\xf3\x15\x5a\x45\xb0\xd7\xc3\x91\x1b\x51\xe6\xe0\xc7\x91\x17\x44\xc4\x91\x9f\xa7\x63\xe2\x2b\x18\x9b\xf2\x57\x92\xcc\xc7\xf1\x24\x64\x9e\x0e\x46\x81\x1f\xc4\x81\x4f\x7e\x53\x3f\xde\xa9\x1f\xf4\x77\x14\x93\xb1\xf8\xfb\x9c\xf4\x83\x50\x86\x3e\xeb\xd3\xe1\x1a\x46\xf4\xc5\x1a\x9c\x0b\xf6\x7e\xd1\xbc\xcd\xa3\x78\x01\x98\xf7\x6a\xfc\x52\xac\x21\xfd\x9d\xc3\x72\x60\xad\xc9\x65\xb4\xaf\xa1\x79\x5f\xbb\x5b\x7f\x2d\x20\x72\xd1\xe5\x6c\x37\xb4\x3d\x50\x7b\x3b\x0c\x22\xe8\x7c\x8e\x8b\x47\x81\x0f\x3d\x2a\xfa\x73\x82\x45\xa7\x60\x7d\x2e\x0e\x5d\xf0\x77\x43\x7f\xdf\x4c\xc9\xa2\x5d\x84\xcb\x60\xc9\xee\x25\xb6\xe0\x16\x85\x80\x5e\x1e\x09\xdd\x5e\x1e\x0a\xdd\x5e\x1e\x0b\x3d\x5a\x1e\x52\x1f\x21\x3f\x58\x10\x54\x5f\x95\xc7\xa2\xd8\xf0\xdf\x84\x0b\x11\xb4\x30\x30\xfd\x37\xc3\xfe\xc7\xbf\x26\xfb\x6c\x31\xc6\x6b\x21\x61\xc5\x16\xe9\xd6\xfe\x34\x41\x75\x5f\xde\x4d\xc4\x3d\x81\xa6\x2f\x0d\xe6\xfe\x00\xbf\x7e\x7f\xf0\xeb\x1f\xf3\xc1\xd8\xc5\x64\xa9\x99\xe3\xdc\x92\x36\xd8\xd1\xd2\x54\x4d\x61\xb1\xf3\x39\x5f\x25\xa7\x41\xb9\x2f\x0a\xcc\x6e\x36\x07\xef\x09\x97\x9d\xd7\x6d\x41\xd0\xf4\xc5\x80\xcb\x3f\x6a\x51\x1f\xd5\xa8\x5c\xa8\xf5\x79\xe0\xc4\xfd\x93\x98\x8c\x5e\x05\x93\x88\xbc\x24\xf8\x3a\x81\x5d\x4f\x47\x18\x32\x1c\xfb\xec\x49\x79\x26\x03\x44\xc8\x0c\x26\xc0\x72\x11\xb9\x3c\x2c\xbb\x04\x79\x2e\x0d\x49\x3d\xe7\x75\x28\xe5\x86\x47\xa9\x9b\x51\x06\x04\x1e\xf3\xfd\x28\x45\x2b\x5e\x24\x10\xe7\x73\x83\xd5\x55\x6b\x55\xb6\xf1\x2f\xef\xf5\x3c\xd5\x6e\xa5\x70\xd2\xfc\x16\x88\xf8\x16\xc5\x4f\x57\x50\xfc\xb4\x54\xf1\x53\x53\xf1\x1f\xf5\xe2\x3f\x8a\x63\x8a\x8f\xa6\xc4\xbc\xc4\xb7\xd8\x1f\x90\xff\x91\xa9\x9f\xf2\xc4\x21\x0d\x46\x45\x23\xaf\x02\x4c\x65\x72\x11\xa9\x8e\x99\x8c\x5a\xaa\xe0\xff\x01\xe4\x1a\x95\x87\xc7\x8f\xf5\x80\x8b\xc6\xa5\x6c\xd7\xe7\x89\x23\x03\x05\x04\x16\xdc\x19\xb0\x83\xab\xa7\xe6\x70\xc0\x7f\x6f\xc8\xf6\x51\xc8\x4c\x73\xc8\x18\xc3\x75\x32\xf2\x4c\x70\x11\x08\xf4\x5b\x74\xc8\x2e\x2e\x5c\xa8\xca\xca\x21\x0c\x80\x49\x99\x60\x6a\x4e\xf0\x11\x1d\x16\xdd\x8b\x2d\xd0\x2d\x55\x41\xc0\x1f\x28\x2b\x47\x0d\xbe\x44\x9f\x3f\xa3\xca\x66\x25\x29\x2e\x0e\x02\x2f\x76\xc7\x6f\x98\x51\x85\x0e\xd1\xc5\x27\xee\x27\x8e\x49\x9c\xfe\xa6\x99\xb4\x1e\x61\x71\x47\x78\x2c\x90\xfe\x06\xba\x15\x09\x10\x7b\x6b\xa5\xd0\x5f\xe1\xa4\x97\x13\x9e\x6a\x84\xa7\x26\xc2\xd3\x3c\xc2\xd3\x2c\xe1\x4b\x05\x0f\xfe\x23\xbc\xaa\xae\x6c\x2a\xd7\x52\xf4\x0a\xd6\xc7\x93\x68\xa8\xbc\xfa\x63\x1c\x7d\xd4\x38\xfa\x68\xe2\xe8\x63\x1e\x47\x1f\xd3\x1c\x19\xae\x5e\xf1\x51\xb7\xdc\xc3\x12\xf3\x6d\x3e\x2f\x0f\x03\xfa\xa5\xeb\x13\x1d\x04\x5a\x05\x37\x37\x80\x9a\x2b\x90\xcf\xb2\xe3\x59\x3a\x9e\x73\x16\xc7\x59\xd4\x06\xea\x51\xee\x55\xca\x8a\xea\x31\x2d\x51\x8f\xe9\xdc\xf5\x28\x7c\x06\x41\x57\xed\xf6\xad\x05\x4b\xef\xe4\xce\x26\x5b\x45\x4b\x0d\x93\x83\x29\x03\xac\xfe\x48\xc7\x10\x31\xf8\x89\x2c\x6c\xcd\xfc\x49\x03\x58\xfe\x48\x69\xc8\x13\x29\x5d\x3b\xbb\xa9\xef\x74\x2a\xee\x53\x84\x93\xe4\xf7\xa4\xec\x69\x42\xee\x7e\x21\x97\xd7\x98\x51\x93\x18\x3a\xdd\x8c\x4d\x64\xa9\x69\xc0\xb6\xe9\x66\xcc\x20\xbe\x8c\xd3\x40\x49\xd8\x5d\x90\xfb\xc3\x6c\x56\xb0\x6c\x74\xdc\xe6\x76\xa3\x08\xb7\x99\x13\x2a\x8f\xd5\x0c\x10\x44\x47\xc1\x78\x1a\xc2\xd1\x6c\xd5\xae\xa1\x56\xa3\xd9\xde\x1c\xb3\x4b\x7a\x16\xfa\x11\xdb\xa4\x17\x04\x1f\x2c\x74\xe2\xdb\xf5\x35\x04\x19\xce\x87\x6e\x24\xe0\xf2\xec\xc0\x21\xc8\x8d\x90\xe7\xda\xc4\x8f\x88\x83\x26\x80\x60\x14\x0f\x09\x7a\x75\x72\x2e\x82\x51\x3f\x98\xf8\x0e\x72\x7d\x1a\x41\x49\xbc\x3c\x39\x3a\x7e\x7d\x76\x8c\xfa\xae\x47\x78\x30\x0a\x83\x20\xe6\x57\x4a\x83\x10\x20\x3b\x62\xa5\xa0\x38\x24\x84\x33\xb0\x25\xb0\x8f\x6c\xec\xff\x12\x91\x17\xa7\xaf\xe8\x24\xf4\x48\x60\x62\xdd\xb8\xbe\x13\xdc\x30\xc5\xa7\xdc\xf4\x5d\x9f\x38\x15\xaa\x40\x2c\xa6\xee\x04\x36\x00\xf6\x18\x82\xf4\x43\x60\x2e\x7f\xca\xf0\x99\x3b\x1a\x7b\x70\xcb\x6c\x30\x8c\x6f\xd8\x49\x36\x13\x3b\xc2\x51\xe4\x46\xb1\xeb\x0f\xd0\x8d\x1b\x0f\x19\x44\x0a\x89\xf9\xc5\x58\xec\x3b\xc8\x0e\xfc\x98\xdc\xc6\x28\xe8\x53\x4a\xff\x0d\xc2\x0f\x24\xac\xa3\x9f\x89\x37\x8e\x10\x86\x8b\x8b\x74\xed\x34\xf1\xc0\x1e\x19\x13\xdf\x21\xbe\xed\x92\x08\xf2\xc2\x7d\x8e\x88\x89\x39\x0e\x50\x48\x70\x44\xa9\xf6\x82\x49\x4c\x89\xdd\x0c\x09\x20\x74\x05\x21\xa0\x71\xc5\x43\x32\x45\x38\x04\x91\x62\x5e\x92\x85\xc8\x35\xf1\xe9\x7c\x03\xb1\x3e\xb9\x26\x21\x72\x7d\xdb\x9b\x38\x0c\xcf\x65\x84\x5d\x9f\xd2\xfa\x1d\xcc\x66\x96\xe9\xf7\x84\x93\x69\x1d\x44\x4e\xe5\x7d\x7c\x4b\xec\x09\x7b\x9e\x79\xed\x86\x81\x0f\x42\x3c\x64\xa7\xa8\xb2\x2d\xba\xc9\x4f\x2b\x89\x60\x64\xa3\xae\x00\x0b\x63\xdf\xe9\x46\x52\x32\xc0\x3b\xf3\x97\x6e\x14\x13\x1f\xf2\x25\x6d\xfd\xf8\x31\x6d\x6c\xde\x70\xd8\x71\xb4\x94\xb4\xff\x89\xa8\x38\xc6\xf6\x10\x62\x6b\x0a\xe1\x5f\x5d\x72\x43\xbb\x49\x86\x24\xcf\x16\xd9\x21\x21\x3e\x5f\xb7\x9e\xf8\x8c\xd1\x2e\x7a\x94\xa4\xde\xda\x42\x3f\x82\xc0\x6f\x2c\xa6\xa2\x6e\xc4\x50\x84\x36\xd1\x08\x14\xc3\x1e\x82\xc5\xca\xf5\xba\x3f\x89\x27\x21\xa9\xaf\xad\xdd\x1d\xac\xad\x31\x9d\xa9\xf3\x9e\x8a\x0e\x8d\x32\xcd\x76\xfb\xe6\x4a\xbb\x3d\xe2\xb3\x20\xfa\xf5\xd9\x5b\x74\xf2\xfa\xdf\xc7\x47\xe7\x27\xa7\xaf\xd1\x93\xad\x84\xf6\x38\x0c\x6c\x02\x70\x73\x6b\x7f\xd9\x71\x02\xfd\x8b\x2a\x9b\x3d\x24\xf6\x07\x8e\x9f\x06\x8f\x6c\x46\xe3\x78\x2a\xae\x7a\xe6\x21\xcd\xef\x2b\x5d\xff\x97\x71\x14\x87\x04\x8f\xd0\x35\x09\x23\x8e\x41\x44\xbb\x54\x8c\x3c\xae\x74\x75\xf4\x22\x20\x11\xeb\x81\xf8\x03\x65\x34\x0e\x10\xb6\xed\x60\xe2\xc7\x28\x1a\x13\xdb\xed\xbb\x36\x25\x05\x67\x7a\x84\x12\x18\x7b\x38\xee\x07\xe1\x48\xe9\x5c\x9a\x1a\xb3\x9d\x1d\x89\xbf\xc4\xc2\xe9\x08\x40\x15\x10\x4a\x8f\x90\x33\x09\xe9\xa8\x43\x65\xd2\x9b\xf4\x7a\x1e\x41\xe3\x21\x8e\x68\xed\x11\xe2\xf9\x38\x3e\xd2\xa7\x17\xa7\xaf\x80\xfe\x39\x20\x62\xde\x71\x68\x51\x46\x8c\x8d\x75\x6c\x74\x19\xd0\x72\x42\x59\x31\x14\xf8\x75\x9d\x50\xc4\x71\x96\x80\x05\x58\x4a\x03\x5d\xc4\xc0\xfa\x48\x7d\x50\x87\x9b\x47\xf6\x87\x0a\x1d\x93\x2a\x23\x3a\x8d\x06\xd7\x24\xac\xa4\xe8\x08\x45\xbb\x03\x20\xc4\x1e\xb6\x3f\xa0\x23\xf1\x43\xc4\x89\x2c\xe2\xce\x75\xc0\xd1\xa1\x98\x31\xc7\x46\x5b\x8c\x7e\x0f\xc9\x28\xb8\x26\xbf\xa3\x11\x89\x87\x81\xc3\x32\x6d\xc1\xfe\x15\xad\x84\x72\x25\x93\x05\x48\x54\x50\x59\x05\x4b\xf2\x20\xec\x70\x40\x58\x84\x64\x99\x01\x46\x31\xd5\xcd\x09\xaa\x06\xba\x16\xdb\x0c\x93\xf7\xfc\x32\xaf\x72\x58\x1d\xb4\xeb\xa3\x34\xa0\xaa\x5f\x3e\xe7\x25\xb2\xb8\xb9\x0b\x4d\x6e\xa1\xdf\x69\x4e\x9e\xd4\xca\x2a\x43\x66\xa6\x9e\x49\x5c\xb5\x12\xf8\x15\xb4\x61\x94\xe0\x6a\xaa\xe8\x90\xb9\x0a\xcb\x56\x0d\x2c\xb4\xb5\x79\xba\x90\x8d\xc7\xd0\x39\x1f\xfa\x90\xd2\x87\xb8\x50\x54\xf4\x32\x16\xf2\x75\x7a\x11\x9d\x65\xbf\x74\x27\xd2\xca\xcc\xeb\x43\x9f\x94\x7b\xc7\x7c\xea\xac\x13\xff\xba\xfe\xfa\xf4\xc5\xf1\xd5\xf1\xeb\x5f\x99\xa1\x33\x0e\x03\x67\x02\xac\x69\x0f\x51\xec\xc0\x8f\x02\x6a\x14\x00\x14\x6b\xe5\x59\x4c\xd7\x12\x31\x71\xa8\x3a\x79\x52\x6b\x67\x68\x2c\xa2\x66\x21\xa2\x1d\xa5\xd2\x0b\x83\x9b\x08\x26\x57\x1c\x23\x47\xcc\x4c\xd1\x64\x0c\x4b\x8f\xac\xae\xa3\x77\xc1\x24\x44\x78\x3c\xf6\x5c\x9b\xc1\xba\x00\x99\x1b\xd7\xf3\x20\x67\xc8\x30\xea\x50\x14\x8c\x08\x67\xa3\x5e\xc9\x3c\x6d\xc9\x6d\x0e\x6d\xc2\xcd\xeb\xa6\xa2\xdb\xbc\x60\xeb\x24\xad\x11\xb5\x18\xee\xdc\xd4\x68\x4a\xa9\x8d\x59\x68\xe7\xdc\x31\x60\xee\x22\xc3\xa9\xda\xae\xd5\x6a\x19\x3b\xac\xb5\x42\x3b\xec\xef\x64\x58\x6d\x3d\x41\x24\xf2\x5c\x3f\xde\x74\xdc\x08\x90\xb9\xfb\xbd\xcd\x9b\x9b\x9b\x2d\x66\xee\x6f\x4a\x13\x9f\xa7\x66\x6b\x2a\x3c\xa2\xab\x27\x24\x17\x5f\xec\xf6\x0c\x5f\x7c\xa1\xde\x24\x46\x37\x21\x1e\x47\x6c\x35\x13\x87\xd3\x4d\x1b\xc7\xf6\x10\xf5\xbc\xc0\xfe\x50\x47\x27\x3e\x3a\x39\x46\x6e\x8c\xdc\x08\x6c\x2b\xaa\xe3\xb8\x0f\xcb\x24\x00\x57\xce\x21\xcb\x16\x42\x21\x08\xcd\x0f\xe2\x21\xed\x4d\xfd\xc0\x9e\x44\xc4\x49\xe4\x4b\x90\x9e\x09\xfa\x82\x84\x41\xf6\xbd\x29\x27\x23\x0b\xa1\x23\xb5\xfc\xdd\x0b\x9c\x29\x27\x4f\xc9\x4d\x49\xcc\x21\xbd\x65\x09\x62\x08\x7f\xfa\xe2\xf4\xd5\x0b\x9e\xed\x8e\x12\x40\x5c\xcd\x23\xa8\xc6\x24\x0c\x29\x3d\x59\x93\x35\x75\x28\xa7\x79\x39\x7f\x77\xd0\x0a\xb2\xcb\x0c\x48\xfc\x4c\x65\xbf\xea\x04\x76\x0d\x6d\x3d\x51\x72\x3c\xd9\xa2\x1d\x95\x16\x78\x08\xff\x7e\xfe\x2c\x31\xa5\x65\x35\xd2\x2b\xe8\xa7\x49\x54\x17\xc9\x70\xe9\x2c\x36\xc9\xce\x5e\xdc\x25\x39\x53\x2e\x64\xc5\x23\x0b\xda\xfb\xe3\x70\xaa\x47\x3a\x81\x9d\x6a\xb0\xcf\x9f\x21\x90\x0a\x15\x72\x21\xa6\x05\x55\x52\xcb\xe6\x94\x89\xd6\xee\x0c\x03\x44\x5a\x2e\xd9\x75\x56\xfb\xa1\x7f\xd3\xdc\xc9\x6a\xc9\x8d\xce\xc9\x6d\xfc\x3a\x60\xef\x92\x4c\x4b\xa5\xc6\x0e\x5b\x2b\xa5\xfa\xbf\x1f\x6c\xf6\xdc\xf8\xc6\x8d\x88\xda\xe5\x01\xb0\x39\xa2\xea\x82\xd1\xc0\xbd\x26\x3e\x98\x4f\x3e\x25\xcf\x2f\xd2\x47\xb4\x27\xb9\x11\xc2\xb4\x6f\x92\x50\xc6\xd7\x75\x15\x17\xa9\x29\x67\xd5\x60\x12\x93\x90\xfe\xb2\x90\xeb\xfb\xec\x27\x53\x0e\x80\x28\x90\xd1\xf0\x04\x28\x95\x42\xaa\x0f\x73\x50\xb0\xa6\x99\xc5\x49\x4e\x40\x9b\xcb\xc9\x09\x2e\x08\xf4\x8c\x89\xd8\x12\x1a\xb5\x12\x05\x2a\xf9\x92\xd2\x52\xf9\x66\x56\xbd\x3e\xc6\x74\xd8\x80\xbc\x29\xfa\x15\x91\xb9\x42\x95\x22\x61\x4d\x2f\x41\x86\xd7\x45\x72\x85\x9b\x3c\x11\xd5\xed\x60\x44\x0b\x16\xc3\x99\xd8\xfe\x4d\xd1\x7e\xf4\x68\x76\x16\xa5\x34\xf4\x18\x81\xf7\xb3\x94\xa5\x95\x11\xa1\xb1\xbf\xab\x92\xca\xf6\xf5\xed\x87\xad\x54\xb6\x95\x2a\xa0\xe8\x95\x75\x0e\x9f\x56\x58\xcf\x74\xfd\xf1\x24\xde\x8a\xc9\x6d\x8c\x43\x82\xe9\xc4\x04\xf3\x25\xcb\x2e\x7b\x24\x84\x81\x4e\xfa\x52\xa3\xb6\xb6\xd0\xc9\xf1\x1e\xb2\xb1\xcf\xbd\x0e\xac\x1f\x61\xbf\x12\x23\x6a\x18\xb2\x0c\x94\x5a\xcc\x50\x9e\xe3\x30\xa0\x73\xac\x8d\xa9\x64\x61\x5a\x47\xae\x7f\xed\x02\x5e\xb5\xc5\x88\xd1\x39\x9e\xf8\x74\x7c\x71\x2c\x3a\x4e\x00\xac\x33\xb8\x16\xd0\x6d\x5d\x6c\xdb\x64\xcc\x4c\x5d\x28\xa5\xbe\x0e\x78\xf0\xd4\x2a\xf8\xe0\xfa\x4e\x04\x5b\xb1\x94\x20\xdb\x4f\x8d\x58\x76\x1c\x52\xe3\x21\xa0\x6d\x4f\xfc\x88\x5a\xbc\xd8\x77\x50\x3f\xc4\x03\x2a\x5a\xca\x28\x89\xe8\x1c\xac\x4c\x5a\x30\x32\x41\x11\xd5\x5a\x66\x72\x32\x2b\xa5\x94\x53\x56\x23\x3b\x4b\x69\x64\xa6\xa4\x4f\x68\x9d\x1f\x3b\xac\x77\xcd\x63\x77\x73\x1b\x2e\xbc\x92\xe8\x15\xe4\x15\x60\xe8\x59\xce\x76\x4a\x70\x66\x66\x42\xc5\xdc\x48\xc6\x64\x6e\x2b\xb8\xd4\xc8\x40\x15\x91\xa6\x52\xe3\x6a\x92\x38\xa6\x70\x63\xba\x14\xe1\xc6\x94\xe2\x7d\xe2\x11\x5b\x80\xf0\x71\xc0\x8d\x0f\x60\x49\x90\x66\x7b\x77\xb5\x02\x7d\x64\x5c\x27\xec\xc2\xe9\xb5\x31\x6e\xa7\x59\xab\xa6\x21\xe3\x39\xcb\x66\x8f\x35\x46\x37\x48\xed\xbd\x5a\xb5\xe2\xb8\xd7\x95\x9a\x85\x2a\x18\x9e\xdc\x0d\x88\xba\x44\x02\x07\x40\x9c\xee\x2e\x78\x50\xa9\xd5\x31\x95\xec\xee\xc1\x1a\x9c\x8e\xa5\xe5\xb2\xb7\x94\x5c\x98\x5d\xc0\x77\x10\xcc\x56\x41\xa7\x59\x3b\x80\x74\xd2\x62\xcc\x71\x96\xb7\x53\x93\x67\x2f\x07\x6b\x5b\x5b\x28\x65\x83\xea\xe7\x31\x54\x0d\x2a\x6c\x07\x83\xcd\x5f\x9e\x83\x4e\x8e\x39\x3f\xe8\x50\x32\x55\x15\xd9\xa1\x65\x32\xa1\x99\x43\x9e\x12\x4a\x2b\x14\x2d\x52\xac\xe0\xd4\x8b\x41\x9a\xb4\x8b\x3e\xdd\x99\x55\xb1\xd0\xe1\x6a\x29\x91\x0f\x71\x94\x23\xc5\x9d\x16\x97\x76\x1c\x9c\x14\x36\xcb\xae\x48\x08\x17\xc6\xe1\xc1\xc3\x69\x3f\xcf\xb0\x6b\xee\xd6\xaa\x62\x07\x91\xe6\x39\x39\xbe\x7a\xf3\xf6\xf4\xfc\x34\xd7\x49\x69\xb3\x56\xad\x88\x44\xb4\x7b\x16\xc9\x55\x3c\x55\x80\x97\xd2\xc9\x4d\x3a\x4a\x5c\x56\x82\x27\x92\x17\xaa\x98\xbb\x2a\xe9\xf9\x3f\x62\x1e\x03\x2f\xe4\xc5\x9c\x0f\xec\x42\x11\x78\xfe\xe0\xde\xba\x4e\x6b\x30\xdc\xd0\xaf\x47\x87\xb2\x06\xe0\xdf\xa7\x7a\xca\x3c\x72\x51\x15\x61\xc4\xd8\x6d\x8b\x0f\x84\xc1\x4b\x6e\x6d\xa1\x17\x01\x9d\xac\x88\x3f\x19\xa1\xde\x64\x80\x1e\xa3\xa1\xeb\x38\xc4\xa7\xd9\xa2\x35\x84\x6e\x86\x74\x5e\xa8\x42\x15\x04\x6c\xdc\x0f\xc8\x65\x45\x26\x25\xa0\x43\x56\xcb\x0b\x77\x63\xe3\x52\x1a\x73\xff\x8f\xda\x04\x55\xc6\x00\x67\xe8\xf3\x67\x23\x43\x77\x89\x1a\xb2\x68\xa3\xa2\x6d\x2f\x77\x42\xbc\xb5\x85\x9a\xfb\xf5\x66\xbd\x55\xdf\x47\x5b\xa8\xd9\xa9\xb7\xea\xed\x7a\x2b\xc7\xd3\xc8\x69\xad\xbc\x62\x16\xeb\x65\x7b\x51\x1d\x03\xa5\x01\xd2\xc0\x58\xe2\x62\x48\xba\x10\x32\xe9\xa1\xb1\x3a\xba\x27\xb9\x53\xd6\x50\x4c\x21\xb9\x3e\x9e\xca\xb5\x2e\x6f\x5d\xa9\x50\x35\x39\xac\x5f\x88\xb0\xcb\xd4\xba\xf8\xb4\xae\x38\x32\x42\x87\xea\xb4\x47\x55\xf0\x54\xf5\xa6\xa5\xa5\x4d\x19\xd0\x5a\x9c\x5a\x4d\x94\xf8\xa7\xd2\x89\x31\xc9\x3f\xd5\xe4\xd4\xe5\xab\x70\x93\x06\x2d\x77\xd8\xb8\xb5\x85\x46\x41\x14\x8b\x62\xd9\x8e\x72\x84\x7a\x53\x74\x7c\xb6\x83\xa2\x61\x30\xf1\x1c\x61\xa0\x8d\x43\x77\xe4\xd2\x05\x79\x04\x0d\xf9\x4f\x7e\x3b\x22\xc7\x1d\xe0\x2e\x6f\x6f\x3b\x08\xf3\x56\xa3\x2d\xa1\x48\x7d\xec\x7a\xb9\x5a\xd9\x2c\x1e\xf3\xff\x73\xfc\x8e\xd6\x93\xd8\xc9\xb8\xd4\xf7\xd1\x21\xaa\xd2\x82\xeb\xbc\x5e\x9f\x3f\xa3\x4f\x77\xb5\x8b\xff\x1c\xbf\xbb\x4c\x5c\xf1\xc0\xa7\x18\x8e\xc8\xed\x98\x1a\x61\xb0\xd5\x49\x6e\xc7\x2c\xe9\x21\x10\xae\xf6\x7d\x50\x25\x5e\xe1\x2a\xff\x5b\x3f\x43\x1b\x22\xac\xfe\x23\x7a\xc2\x6a\x51\x4d\x39\xfa\xf3\xab\xcd\xda\x01\x6d\x2d\x54\x61\xa5\x56\xa0\x55\x6a\xe6\xc6\x5c\x6e\xc7\x32\x23\x25\xe3\x64\xdf\x30\xd8\x18\xdb\xcb\x6d\xa5\x18\x67\xa4\xd6\x3e\x6f\xdd\x81\x17\xf4\xb0\x97\x6f\x53\xb0\x54\x02\x4d\x25\x8f\x65\x18\x70\x62\x12\xe2\x38\x08\xf3\xea\xb6\x2f\x12\x9e\x9f\x5e\x9d\x9d\xbf\x3d\x79\xfd\xd3\xd5\xf9\xb3\x9f\xf2\x4a\x6e\xd4\xaa\x95\x38\x60\xbe\x68\xce\xf1\xa0\x22\x7c\xf0\xbd\x38\x7d\x05\x05\xf5\x3c\x78\x22\x5f\xad\x1c\x9d\x9d\xbd\x9d\x78\xe4\xa5\x1b\xc5\xd6\xd1\xd9\xd9\x59\x3c\xf5\xc8\x0b\x62\x7b\x98\xe3\x79\x1f\x9d\x9d\x01\x0e\x1e\x4b\xe0\xb9\xc4\x8f\xdf\x12\x1b\x36\xb7\xad\x17\xa7\xaf\xd4\xdf\xac\x34\xf8\xaa\xa0\x8d\x35\x84\x2a\x2f\x4e\x5f\x9d\x07\x1f\x88\xcf\x52\xe0\x18\x9f\x87\xd8\x8f\xfa\x04\x90\xf0\x20\xf0\x47\x97\x97\xfd\xf3\xf9\xab\x97\xcf\x3c\xef\x28\xf0\x3c\x76\x61\x05\x42\x52\x9f\x3f\x06\xe1\x88\x1b\x39\xf0\x7d\x46\x68\xac\x08\xe1\x85\xbe\x22\x8e\x8b\x81\xe6\x2b\x77\x04\x8f\x09\xc0\xb5\x8e\xf5\x1a\x8f\x88\x43\x97\x3b\xaf\xf0\xd8\xa2\x7f\x21\xcd\x1b\xec\xd2\x1a\xfd\x39\x21\x11\xab\xc8\x1b\x6f\x32\x70\x7d\xfe\x87\xe5\x3c\xfb\xf5\xa7\x97\x30\xa9\x42\x82\xb3\x5f\x7f\x62\xa8\xc1\x6a\x4d\xcf\x7e\xfd\xe9\x0d\x8e\x87\x67\x64\x20\xd2\x00\x76\x95\xf8\x50\x44\x73\xf6\xeb\x4f\x4c\x0a\x41\xc8\x44\x70\x06\x6b\xe1\xe7\x93\x7e\x9f\x93\x84\x36\x38\x1b\x12\xc2\xb2\x9f\x93\xdb\xf8\x3c\xc4\xf6\x87\x23\xde\x0a\xbc\x48\x19\xce\x52\x05\x13\x1b\xf8\xab\xd4\xea\xd1\xd8\x73\xe3\x6a\xc5\x82\x56\x37\xf9\xd8\x54\xb5\x20\xe5\x6a\x93\x0f\x19\xaf\x9f\xbd\x3a\x46\x87\x5a\xc2\x0b\x57\x0e\x28\x49\xb3\xa0\x43\xde\x05\x2e\x68\x0e\x99\x60\xcc\xa7\x40\x25\xe1\xe3\xc7\xca\x97\x3e\x5b\x48\xdf\x95\xb0\x7c\x81\x5f\x17\x9a\x96\x5f\xd6\xa0\x0b\xb1\x44\x96\xde\x03\x2c\xe0\x15\x06\x31\xd9\x85\x18\x33\xe8\x30\x09\xa9\x43\x4b\x1e\xd0\x75\x70\x7a\x78\x28\xb3\xfb\x32\x6b\x45\xe9\x04\x3e\xe1\x37\x5b\x35\x2b\x5d\x3a\x09\x84\x3f\x16\xa2\xe9\xba\xe8\xd1\x23\xfa\x17\x99\xed\xf3\xed\xe5\xd6\xde\x5b\x5b\x68\xb7\xde\xaa\xb7\xd0\x49\xc4\xfc\xc9\x09\xa7\x70\x35\x3e\x63\xe5\x59\xd9\xcd\xce\x9e\x69\x32\x02\x22\x75\x97\x11\xd3\x0c\x13\x37\x29\x40\xab\xb3\x1d\xf4\x59\x18\xb5\x2c\x20\x49\xc5\x5c\xd1\x32\x4b\xf9\x32\xf6\xe1\x6e\x62\x1f\x6e\x2b\x06\x95\xe2\xfd\x96\x76\xfd\x48\x18\x89\xff\xa4\x46\x73\xee\xac\xbd\x9f\x0c\xd9\x0e\xf1\xff\x93\x9f\xb4\xb9\xd3\xae\x09\xff\x75\x15\xd6\x87\x2a\x16\x9c\xac\x32\xc5\x86\xce\xc7\x6b\x51\xef\x6b\xa6\x5e\x9a\x33\x4d\xac\x66\xce\x55\x01\x43\x05\xa8\xd1\x97\xf0\x98\x33\xe5\x2e\xb7\xeb\x00\x1d\xf9\xe4\x38\xaf\xfe\x4d\x31\xbb\xb1\xc5\xe7\x0b\x12\xd9\x79\xae\xb2\xf7\xe6\x5d\x15\xc6\xc1\x1b\x61\x90\xe5\xaa\xab\x9c\x5c\x67\x1b\xfd\x27\xc7\x7b\x57\x2f\x4e\x5f\x5d\xbd\x38\xfe\xf1\xe4\x75\x5e\x85\x5a\x6d\x61\xd6\x0d\x4e\xdf\xbc\xc8\x6b\xb0\x17\xd2\x63\x6f\xaa\x79\xf3\x76\x64\x9e\x32\x72\xdd\xbc\x16\x4e\x08\xd2\x26\x7d\xa3\x1a\xfb\x27\x9a\xb5\xff\x06\xc2\xa4\x5c\xaa\x6f\x94\x1b\x01\x74\x04\xd5\x2b\x59\xcb\x1e\x68\x51\x3e\x58\x19\x99\x0d\x42\xb4\xf5\x84\x9d\x8e\x23\xaa\x3e\xfa\xd2\xe2\x4d\xb2\xa6\x48\x5a\xba\xfa\x68\x7c\x72\x5c\xef\xb3\xd3\x6b\x48\x64\xa1\xd3\x8b\x37\x97\x39\x8a\x58\x66\x9b\x07\x74\x2e\x93\x73\x05\xbb\x15\x33\x8c\xaf\x82\x61\x5d\x5c\x2d\x89\x42\xdb\x82\x23\x5d\xd6\x3a\x19\x4f\xdc\xa1\xad\xde\x34\x81\xb3\xdf\xc7\x8f\x55\xef\xda\xb5\xb4\xab\xed\xd0\xbe\x48\x5c\x74\xc2\x71\x02\x4c\x70\xa2\x40\x70\x0e\x2d\x12\xd5\xb4\x15\x15\xf7\xc5\x6d\x12\x73\xa7\xcc\x8a\x7b\xf6\xe6\xa8\xe6\x6c\x99\x6d\x8c\x58\xb4\xce\x3d\x18\x6e\x7e\x74\x89\xe7\x28\x67\x5a\x55\x37\xce\x73\xbf\x0c\x67\xb9\x7a\x46\x38\xca\x4d\xce\xe0\x1f\x3f\x4e\x11\xa6\xe2\x74\x63\xb9\x37\x91\xde\x84\x85\xa7\x26\x1b\xa8\xd2\x45\xae\x6f\x07\x61\x48\x87\x12\xd7\xbf\x0e\xd8\x6d\x11\xbe\x15\x7b\x37\x63\x33\xb6\xb3\xf4\xb2\x12\x4e\xf5\xa3\x80\xae\x28\x5d\x7f\x80\xe8\x64\xc8\x0d\x0d\x70\xd2\xc2\x2e\x33\x81\x1a\xd8\x5e\x10\xf1\x24\x70\xa9\x86\xed\x79\xf9\x85\xa3\xe0\xce\x0c\xad\x14\x65\x59\xa8\xef\x5b\xc2\xb2\x20\x7e\x1c\xba\x62\x03\x2b\xd3\xf5\x79\x2c\x7a\x4a\x17\x6d\xa2\xf8\x2a\xb3\x57\x2e\x1a\x97\x9c\xca\x45\xf3\xb2\x46\x07\x2a\x9f\xc7\xf0\xcd\xa7\xdd\xfa\x76\x7d\x47\x9a\x52\x80\x0b\xa3\xf0\x60\x07\xa3\xb1\x47\xe0\x7c\xcd\x78\x26\xce\xb6\xc8\x62\x86\x63\x0d\x79\x2e\x2a\x8c\xab\x0a\x57\x7f\xaa\x46\x34\x85\xa6\x1a\x35\x29\x25\x1a\xc7\xc6\x19\x41\x40\xe0\x81\x32\xed\x10\xc7\x6e\x86\x86\x5e\x6e\xc9\x49\x1b\x7a\x48\xec\x0f\x88\xf9\xb2\x87\x57\x13\xcc\x0c\x12\x8c\xcc\xb7\x70\x3b\x39\x3f\x7e\xfb\xec\xfc\xf4\x6d\xd1\x9a\x4d\x50\x16\x3b\x4a\x50\x9e\xd8\x50\x62\xb6\x58\xe1\x7e\x52\xfe\x7e\x71\x9c\xed\x7a\xd5\x94\x79\xcc\xce\x96\x61\x47\x21\x29\xf7\x42\xb0\x7d\xc9\xa3\xcd\x43\x7c\x67\xb9\x55\x36\xd8\x11\x1e\x8e\xa2\x5c\xfb\xb4\xd5\xd9\x5e\x42\x8e\xa5\x1a\xa9\xd4\x1e\x43\xab\x5d\xa3\x26\x81\x20\xf8\x0a\x76\x95\x72\x8f\x97\xd8\xb9\x92\xa2\xd5\xb2\x39\x12\xb9\x82\x2e\x7f\xfe\x4c\xc3\x2a\xff\xfa\x97\xe4\x5c\x86\x27\xcb\x1a\x2e\x21\x5a\xc2\xa5\xb9\x15\x96\x3b\x4a\xde\xda\xa2\xc6\x09\xbc\x20\x89\xf1\x00\xdc\x6e\x31\x23\xbb\x5d\xdf\xc9\x6c\x67\xd6\xc5\xfe\x42\xb5\xdc\xd2\x02\xf6\x2e\xe6\xda\xb1\xd8\xda\x42\xc7\x67\x6d\x74\x13\x06\xfe\x00\x0d\x49\x48\x58\x97\x78\xfb\x13\x9c\xa8\xf7\xab\xc6\x63\x27\xe9\x04\xfb\x00\xdd\x55\x6b\x62\x15\xc2\xc3\x2a\x07\x50\xc9\xbe\xbc\x9c\x1a\x50\xe3\xb0\xd9\x44\x67\x60\x83\xa1\x67\xb6\x4d\xa2\x08\xbd\x20\xbe\x4b\x1c\x65\xc4\x8e\xc3\xe9\x4f\x24\xce\xcc\x93\x1f\x84\x8b\x83\xcc\x80\xeb\xc6\x72\x7e\x2f\x32\xb4\x8c\xb7\x07\xb3\x9a\x04\x7b\xcb\x16\x3a\xb7\xd0\x73\xed\xac\x11\x7a\x64\xd2\xa5\x9f\xa2\xca\x2f\xc9\x25\xa9\xae\x48\x00\x57\xc5\x9e\xa2\xca\xeb\x89\xc7\xdd\x30\x6e\x6d\xa1\x7f\xfd\x4b\x11\x36\xb2\x71\x44\x20\x46\x3e\x8b\xa9\x9e\x53\x73\x13\xaa\x5d\x3d\x4d\xde\x2d\xba\x71\xcd\xa2\xad\xc8\x05\xcb\x2e\x10\x57\xd0\x53\x74\x2e\x08\xf7\x26\xae\x17\xbb\x7e\x8a\x2a\x6d\xb4\xa7\xd0\x68\xa7\x35\x91\x92\xb6\xad\x6c\x2d\xd9\x26\x3c\x43\xf5\x39\x6f\xe4\x53\x5e\x14\xdf\x61\x04\xc3\x4a\xee\x63\x63\xcf\x23\x24\xb5\x85\xfd\x54\x6d\x6f\xd4\xa5\x22\x33\xf5\x94\xe5\x96\xd9\x65\x4f\x1e\x67\x18\x5a\xe7\xef\xde\x1c\x2b\xb6\x94\x3c\x20\xa4\x0d\x0f\x23\x42\xfd\x8a\x8d\xdb\x2c\x61\xda\x1c\xaa\x9c\xf8\x70\x71\x25\x76\x7b\x1e\x11\xb7\x63\x43\x0b\x6e\xcd\xd2\x1c\x70\x62\xcd\x39\x72\x4a\x1d\x54\x77\x96\x5b\x94\xa7\xef\x9d\x89\x05\x52\x72\xb2\x0f\x5a\x35\x21\x7c\xa1\x45\xe2\x17\x1a\xa2\xa7\xba\x46\x52\x62\xaa\x29\xff\xfe\xca\x61\x86\x8c\x61\x57\xfd\xb8\x42\xa6\x4e\x2a\x64\x22\xe9\x4f\x1c\xc4\x9d\xa2\x2a\x93\xcb\x1e\x25\x93\xa7\xe9\x68\x40\xa4\x9f\x3f\x2b\x11\xe2\x31\x74\x45\x06\xf1\xdd\x0f\x21\x0a\x61\x49\x1c\xa6\xea\x98\xb9\xea\xd0\x59\x6e\xf5\x9e\x6e\x0a\xf3\x31\xbf\x24\xb3\x9e\x34\xd1\xba\xc5\x07\x1d\xd8\xb9\xa2\xad\x05\x67\xf7\xfc\x72\x0e\xec\x48\x8c\xb1\x4d\xe0\xc6\x0c\x7f\x35\x18\xf8\x7d\xcf\xb5\xe3\x88\x9a\x4a\xe2\x12\x0d\xb9\x8d\x93\x37\x45\x7f\x00\x5c\xb5\x90\x01\xfb\xaa\xec\x6c\xe3\x4e\xc7\xe9\xec\xee\xf5\xf7\x3a\x3b\x4e\xab\xb3\xe7\xd8\xed\xed\x4e\xaf\xb1\xbf\x8d\x5b\xb8\xd5\x6b\x57\x98\x96\x44\x43\x42\xe2\xe8\x2d\xdc\xbe\x0e\xa7\x0a\x99\x4c\x44\xc5\xd9\xee\x39\x8d\x1e\xc6\x76\xcf\xee\xb4\x7a\x3d\x67\x7b\xaf\xd7\xeb\xed\x93\x5e\x6b\xbb\xbd\xbd\x4d\x6c\x87\x53\x1c\x61\x1f\x0f\x48\xa8\xb2\xa4\x04\x55\x7a\xbb\x3b\x7b\xbd\xdd\xbd\xfd\xe6\x7e\xa7\xb1\xdd\xef\xe1\x7d\x87\xb4\xec\x46\xbb\xb3\xdd\xb1\x3b\xb6\xd3\xc6\x2a\x5f\xa7\xe0\xf2\x39\x4a\x73\x95\x04\x57\x76\xfa\x76\x67\xb7\xe1\xec\xf4\x9c\x9d\x66\x7b\xaf\xbd\xd7\xdc\x77\x1a\xfd\x7d\xb2\xbb\xdd\xd8\xb5\xb7\x3b\x2d\xa7\x92\x6d\xf9\xe5\x6e\x45\xac\xbc\xe5\x45\xcd\xd8\xf2\x5f\xa9\x2a\x0b\xf8\x89\xf8\xd4\x40\x61\xae\xe9\x79\x47\xd6\x9b\x48\x09\x10\x87\x0d\x4a\x10\x6c\x75\x47\xaf\x58\x03\x64\xc2\x0d\xed\x4e\x3b\xce\xd4\xc7\x23\xd7\x86\xad\x72\x4a\x5e\xe9\xb2\xd0\x36\x57\x86\x34\xc6\x93\x1c\x38\xf0\x9d\x25\xa2\x4a\x9a\x5a\x85\x09\x8a\xf8\x93\x11\xdb\x1d\x67\xd2\xb2\xd6\x50\xea\x42\xcc\x80\xc4\xd5\xd4\xe8\x72\x05\x7e\x02\x83\xf1\x5b\xc6\x84\x78\x4d\x90\xe1\xb8\x76\x51\xe1\x63\x05\x5b\x28\xdd\xb1\x1b\x34\x50\xbb\x8c\x68\xcc\x16\xf3\x7e\x99\xba\xe9\xb4\xee\xa3\x66\x7a\x09\xb3\xeb\x95\xa8\x82\xb9\xc9\xb6\xcb\x57\x8b\x93\xba\xbf\x5a\xf1\x02\x8a\x2a\xa5\xa8\xbc\x71\xe9\xd1\x2c\x53\x1d\x41\xe4\x3e\x6a\x22\x68\x17\x55\x42\x76\x64\xa3\x81\xbf\xbb\x53\xa6\x0e\x8c\xc6\x7d\xd4\x80\x51\x2e\xe2\x3f\x7f\xa8\x32\x76\x9d\x9d\x52\xc3\x42\x0e\xd1\xfb\xa8\x61\x4e\x51\x45\x55\xfe\x77\x94\xbb\x86\xdd\xd9\x56\x53\xb5\x68\xb2\x9c\x72\xff\x1d\x81\x4b\x7c\xc9\x72\x4e\xba\xa0\xf7\x87\xb2\x06\x0b\x7a\x7f\x50\x3b\x3d\xe8\xfd\xa1\x5a\x7e\x4f\x21\xbc\x8b\x3e\x21\xc9\x73\x17\x82\xee\x0e\xa8\x95\x25\x6e\x2e\x43\x45\x23\x84\x91\x4f\x6e\xe4\xce\x22\x0a\xfa\xe8\xdf\x51\x94\x18\x14\x39\x73\x91\x6a\x43\xb2\x90\x6a\xc0\xa6\x62\x6d\x37\x84\x92\x86\x9a\x2b\xe2\x93\x09\x99\xbd\xc6\xd9\x79\x26\x8e\xf8\xa9\x34\x05\x37\x8c\x0d\x5e\xb2\x42\x82\x2e\x59\x58\xa1\x59\xc0\x8c\xce\x72\x3b\xd9\x2b\x9f\xd4\xd5\x6e\x21\xdc\x89\xa4\xee\x77\x48\x67\x7f\x6a\x21\x2e\x89\xe4\x36\x35\x83\x3e\xa1\x49\x0d\x87\xcc\x0c\x9c\x4b\x3f\x5d\xe6\x50\x57\xe2\xc4\x03\xbc\x51\x07\x63\x38\x5a\x56\x82\xeb\x49\xcf\x01\x38\x2c\x53\xf8\xe7\xcf\xfc\xce\xbd\x1a\x4f\xed\x50\x77\x30\x11\x39\x61\xa1\x01\xa6\xfe\x3a\xd4\x7e\x1d\xb9\xbe\x92\xbc\xa6\x66\xbd\x09\xdd\x58\xcb\x66\x16\xb0\xa8\xb9\x92\x13\xf6\xea\x15\xaa\x70\xed\x55\xbe\x0b\x90\x12\xd5\xf6\xd4\x61\x13\x85\x3b\x3d\x8a\xc0\x45\xea\x1b\x21\x4a\x79\x18\xce\x43\x32\xc2\x3f\x32\x5d\xba\x52\x49\xd6\x58\x9d\x35\xba\x45\x54\x74\x16\x0e\x92\xc5\x8e\x4c\x71\x00\x5d\xb4\xaa\x0f\x04\xb0\x19\x75\x84\x3d\x0f\x9e\xd2\x54\x45\xdf\xb0\xf4\x23\x80\x4f\xe2\x94\x40\x74\xe4\x9c\xb3\x02\x9a\x92\x2d\x6f\x69\xdf\x4c\x96\xb8\xeb\x47\xd8\xf7\x83\x98\x6d\xb9\x63\xb6\x47\x88\x70\xa4\x5c\xc0\x5e\x67\x12\x4f\x1e\xf3\xb1\x99\x2a\x14\xc6\x11\x43\x40\x20\x51\x44\x57\x26\x23\xb8\x7a\x8f\x63\x14\xf8\x04\x8d\x3d\x2c\xfa\x32\xd5\xcb\x8c\x51\x95\xbe\x30\x2d\xbf\xf5\x94\x72\x08\x4f\x8b\x24\x1e\xba\x91\x95\x4a\x2c\x9c\x98\x71\x77\x1a\xb2\xac\x8b\x4b\xb9\xd8\x54\x3b\x65\x55\xcf\x6d\xa1\x0b\xd5\xef\x13\x76\x00\xa9\x84\x6d\xa8\xb0\xe7\xe5\x08\x3d\x41\x6f\xc5\xcb\x6f\x8c\xc0\x94\x64\x2c\xd4\x79\xf4\x16\xdf\x96\xd7\xbd\x44\x61\xc7\xa9\xc2\x2c\xaa\xfb\x89\x52\x38\xd4\x38\x56\xfd\x04\x01\x0e\x12\x3a\x64\xeb\xa1\x3a\x1f\x45\xeb\x10\xaa\xbb\x3d\x16\x99\x59\xdc\x69\x5f\x14\xf8\xe8\xf0\x10\x6d\x36\xc5\xde\xe8\x81\x31\x0b\xbf\xd5\x4a\x17\xf9\x0d\xd8\x1a\x81\x42\x7f\xe0\x6c\x65\x7c\xde\xcb\x7c\x70\x71\x95\x95\x73\xa0\xc4\xb2\x82\xc4\xbb\x61\xfe\x63\x6b\x0b\xfd\xe8\xfa\x0e\xc2\x68\xcc\xdf\xff\x70\x99\x19\xc7\xb7\x14\x6b\xca\x05\x9a\x2c\xfb\x17\xee\xa5\x2e\x18\xf4\x83\xc9\x4f\xbf\x24\x19\x8d\x3d\xd7\x26\x55\xd7\xfa\xff\xd9\x7b\xf7\xb6\x36\x8e\xa4\x51\xfc\x7f\x3e\x45\x67\xcf\xbe\x1e\x29\x16\x42\x80\xb1\xb1\x08\xf1\x3a\xd8\xd9\xf5\x9e\x38\xce\x63\x9c\xcd\xd9\x1f\xeb\x03\xa3\x99\x16\xea\x30\x9a\xd6\x99\x19\x71\x59\x87\xef\xfe\x7b\xba\xaa\xef\x73\xd1\x05\x61\x93\x44\x79\xdf\x67\x8d\x7a\xaa\xef\xd5\xd5\xd5\x75\x25\xbd\x0e\xf1\x47\xef\x8f\xdf\x72\x05\xdf\xb0\xe6\xe3\x20\x44\x4e\xd1\x09\x45\xf7\xa0\x91\xa1\x2a\x9b\x58\x4e\x8b\xda\x64\x62\xb9\xc5\xb3\xd4\xa1\x71\xf5\x18\xc0\xd7\xa6\x06\x25\xab\x46\x21\xe0\x6b\x87\x01\xfe\xf4\x15\x08\xab\x90\xd1\x19\x98\x87\x70\x07\x55\x83\xd7\x6b\x2e\x40\x3b\x64\xbb\x5d\x37\x91\x23\x9e\x5e\xd2\xac\x90\x84\xa4\x08\xa3\x11\x8d\xa5\x8c\x02\x68\x0d\x39\x3a\x3e\x26\x28\x87\x6a\x9a\x9f\x12\xbf\xd6\xcc\x50\x0b\xd7\x1d\xf6\x85\x94\x72\x6d\xcb\xc1\x0f\x59\x52\xd0\xcc\x92\x88\x7b\x4b\xa3\xab\xe1\x21\x55\xe3\x36\xf9\x4e\xbd\x38\x8d\xcd\xd5\x4b\x83\xb3\xda\xf9\x95\xb3\xb4\x15\xfc\x27\x0d\xea\xd3\xd5\xc1\x12\x57\x11\xae\x23\xe9\x66\x3c\x62\xe7\x23\x9a\x17\x72\x33\x31\x04\xb2\x4b\xbe\xea\xf9\xe8\x9a\x05\x72\xe8\xc7\x0b\xd2\x23\x7d\x17\xe0\xa4\x12\x7c\x93\x6c\x7f\xf4\x29\x1a\xa9\x49\x70\xe4\x10\xea\x83\x0d\xbc\x2e\x2b\x79\x44\x1f\xd4\xe3\x14\x9f\xae\x32\xb4\xda\xea\xc4\x3f\xee\x1c\x0a\x7e\x94\xe7\x60\x19\x8a\xc2\x30\xb1\xed\xbf\xb0\x62\x74\x3c\x09\x23\x87\x0b\x77\x3e\xb4\xca\x26\x72\x50\x22\xb1\x86\x04\x2e\xf3\x2d\x8f\x5a\x8e\x5e\x22\x08\x0a\x87\x4c\x1f\x2f\x00\x3b\x1b\x87\x19\x44\x5b\x3e\x39\x09\xf6\x26\xd7\x41\x87\x04\xdb\xbd\xc9\x75\xf0\xf1\xe3\x19\xf9\xd6\x7c\xdd\x9b\x5c\x13\x51\x7e\x70\x06\x95\x06\x3c\x8b\x69\xd6\x27\x27\xc1\x36\xd6\xd9\x11\x55\xa0\x86\xfa\xb4\x3d\xb9\xee\x90\x1d\x59\xc3\xf2\xf9\x35\x93\xb7\x27\x04\x8c\x8e\x63\x2f\x27\xbf\xb6\x9d\xb9\x02\xd2\x6c\x6d\x91\x63\x19\x06\x03\x84\xa9\x24\xa7\x93\x50\xbc\xec\x62\x39\xcb\xae\x6c\xb0\xa2\xbd\x93\xde\x47\xdf\x13\xd7\x1f\x10\x9c\x66\x67\xe5\xdb\x6d\x5f\x98\x6d\x2f\x7c\x07\x57\xbe\x84\x89\xab\x8c\xf6\xb5\xb2\x37\x0b\xe6\x27\x7b\x37\xc8\x69\x76\x29\x59\xf6\x6a\x39\xd1\xd3\xda\x2a\x4d\x2f\x5e\x1f\xf6\x33\x3d\x7f\x2b\x4f\x99\x21\xc8\x35\x07\x47\xf4\x83\x48\x51\x9e\xa3\xd5\xd4\x47\x0d\x07\x14\x70\x9e\x1a\x2d\x73\x14\x6d\x8c\x58\x6d\xdc\x91\x95\xd1\x26\xed\x5f\xfa\x11\xb3\xe1\x5e\xbc\x9f\x26\x54\xeb\x2c\x7e\x60\xe9\x05\xc9\xc4\x26\x80\x65\x8e\xb2\x73\x7f\x0f\x41\x13\xd3\x98\xa4\x34\x17\x27\x4f\x40\xe4\x08\x02\xc6\x45\xf9\x84\xa7\x31\x4b\xcf\xd5\xf7\x28\xcf\xdf\x03\x08\x1b\x92\x01\x2f\x46\x84\x5e\xb3\xbc\xc8\xbd\x80\x00\xaa\xf7\x56\x06\x6b\x22\x2b\xc9\xad\x9b\x26\x54\x26\xd1\x93\x98\x2b\x3f\x2b\x23\x3e\x04\x80\x4e\x1e\x3d\x52\x1f\xbb\xaa\xe3\x36\x31\xdf\xbb\xa2\x9f\x56\x09\xa2\xea\x14\xaf\x32\x96\xc4\xc2\x31\xfb\x56\x74\xe8\xaf\xc2\x2c\x15\x5b\x51\x23\x80\x7c\xe2\x03\x36\x9d\x70\x09\x62\xa4\xce\xda\xe0\xbe\xae\xf9\x9d\x9d\x0a\xe0\xa6\x2e\x0c\x94\xae\xd8\xe8\x2a\xb2\xfd\x6c\xcf\x03\x6c\x6a\x1d\x21\x3e\x13\x61\x82\x54\xb0\xa0\xc9\xda\x19\x6e\x87\x51\xf4\x34\xda\x0d\x9f\xf6\x9e\x0e\x7a\xfb\x3b\x74\x8f\xd2\xe1\x1e\xdd\x7b\xf2\x64\xfb\xc9\x70\x38\x08\x0e\x36\x36\x20\xc7\xb5\x9c\x81\x45\x4e\x4e\xd2\xfc\x23\x91\xb6\x08\x6d\x52\x0b\x40\x7a\x60\xf5\xf1\x26\x05\xdb\x01\x72\x45\xc9\x28\xbc\xa4\x64\xcc\x33\x70\xac\x4f\xe1\xd9\xfe\xcf\xe3\x63\x15\x01\xb1\xab\x94\x8b\x47\x7c\xaa\x32\x05\x54\xb7\xfd\xf8\xb1\x5c\xde\x71\x78\x8d\x87\xf8\x90\x6c\xd3\xed\x9e\x2c\xa5\xe9\x25\x0a\xa3\x4a\x01\xb3\x0c\x37\xf2\x1e\x16\xd1\x16\x3d\x90\xab\x11\x8b\x46\xe4\x5c\x4a\x65\x73\x32\x4d\xd9\xff\x9b\x52\x29\xa5\x00\x5f\x4b\x32\x08\x73\x1a\x13\x08\x14\x02\x43\x04\x72\x41\x7e\x19\x51\x94\x42\xca\xba\x3c\xb3\x0d\xeb\xa5\x14\x31\xee\x20\xd1\x92\x35\xc5\x07\x78\x7f\x61\xf4\x1e\xf2\x0b\x85\xb4\xb1\x18\xeb\x4d\x3f\xf0\xec\x0a\xe2\xd9\x7a\x7c\xfc\x1e\xfe\xa5\x61\x34\x02\x5b\x00\x0c\x1d\x20\xde\x24\x33\xae\x1c\x63\x7b\x22\x1a\x35\x2b\xdc\xb3\xd9\x5e\x03\x8e\xe4\xce\x79\x38\xd8\xf5\x1e\x1f\x92\x6d\x2b\xe2\xb8\xfd\xe9\x5b\xbd\x29\x86\x89\x6f\xf5\x3a\xe6\x2c\x5b\x23\x94\x9e\xc0\x1d\x12\x9c\xfc\xf3\xf8\xf8\x23\xf9\x37\x9f\xca\x58\xa7\x80\x29\x21\x19\xd3\x31\xcf\x6e\x48\x42\xc3\x8b\x2e\x79\xef\x2d\x5f\x58\x90\xff\xc9\xbb\x41\xc7\x1e\x99\xfb\xd0\x13\x63\x03\x64\xa8\x0d\x93\x26\x27\x1e\x44\x01\x79\x6c\xa3\xde\x63\xbb\x51\xa7\x4d\xf4\x88\xa1\x43\xa6\xa5\x24\xe4\x85\x27\x2d\xd1\x19\xe4\x7e\x42\x38\x88\x95\x4e\xfa\x24\x08\x9c\xb8\xdb\xb2\x15\xec\xaa\x7b\x41\x6f\xc8\x63\x88\xa9\xed\x0d\x04\x8b\xbc\xe1\xa0\xbb\xc9\x3d\xc4\x22\x7b\xba\xca\xf8\x25\x2b\xbb\x30\xa4\x7d\xc8\xa1\xb2\x16\xc2\xa4\xb5\xb0\xaf\x7f\xd1\xa2\x43\xcb\x9a\x08\xbf\x77\xb5\x21\x2f\x00\x22\x87\xf4\x17\xf2\xc2\x75\x18\xb7\x48\xaa\xac\xcd\x07\xbf\x1e\x90\x5b\xdb\xca\xbf\x9a\xf4\xce\x1a\x8c\x20\xcd\xae\x77\xee\xa1\x02\xc6\xaf\x20\x2c\x93\x63\xd5\xd2\x5f\xf2\xc2\x0c\xb5\xef\x0e\x49\x2d\x87\x0c\x46\x6e\xdc\x1a\xc2\x3c\x67\xe7\xa9\xeb\x6a\x8c\xd2\xed\x92\x40\x7f\x1b\x05\x5e\xda\x56\xab\x4a\xa8\x2f\x23\xba\x1c\x1a\x28\x10\xea\x97\x4c\xe5\x01\x4c\x89\x85\x4b\x26\x85\xa3\x30\xb7\x5c\x23\x10\x1f\xb1\x0a\x1a\xdb\x81\x94\xd8\xb5\xa4\x87\xaf\x68\x6c\x07\x82\x77\xdf\x50\xde\x2c\xc1\x5a\xd7\xb1\xd6\x75\x2c\xa4\xeb\x00\xac\x61\xf9\x9b\xf4\x3b\x19\xc7\xb2\x8e\x3b\xdc\xad\x82\x6e\x62\xe0\x2c\xb0\xcf\xcc\x85\xa2\x5f\xeb\x2c\xd3\x91\x27\xfb\xbd\xba\x1a\x4d\xfd\x79\xa0\xba\x89\x6c\xda\x60\x81\xb3\xbf\xed\xc2\x35\x75\x90\xc9\x37\x0e\x82\x73\xfd\x72\xad\x6f\x7c\xa7\x0a\xba\xa9\x0b\x0b\x4c\x57\x55\x98\x5d\xdf\xcd\x6e\x19\xb6\xa9\x13\x0d\xb4\x90\x7d\x85\x05\xd8\x28\xc0\x40\x63\x08\x07\x55\xde\x4f\x6b\xe5\x24\x4f\x77\xcb\xa0\x33\x91\x0a\x9e\xb4\x77\xb2\xad\x68\xaa\xd9\xd4\x7d\x9d\x21\x84\xdb\xa4\x9e\x44\xe5\x39\xda\xae\x80\xde\x9d\xd9\x27\xb4\xa9\x6b\xbe\xe2\xe3\xf7\xf0\x90\xaf\x37\x54\xda\xdf\xab\x82\x6e\x9a\x9c\x05\xa6\xab\xfe\x8b\x65\xc5\x34\x4c\x66\x76\xf6\xb4\xae\x46\x53\x87\x1e\xe8\x67\x7a\x52\x3e\x60\x25\xf2\xa5\xc9\xc5\x25\xa9\x19\x24\x84\x03\xc2\x64\x3d\x43\x94\xe7\xef\x89\x43\x56\x2c\x80\x8e\x4d\x09\x6c\xb9\x9a\xda\xa5\x7f\x96\xb9\x10\x5b\xc5\xfc\xcf\x3c\xf7\x55\x3f\xd5\xea\x65\x69\xa0\xa3\xf5\x59\x2a\x37\xc0\x21\xf9\xcb\xf3\xee\x6e\x77\xe7\x2f\x07\xe6\xdb\x44\xcf\x08\x0c\x60\x7c\xca\x6e\x1b\xc3\xb4\xad\x6a\x5c\x1b\xb3\xaa\x37\x50\xcd\x21\xec\xd7\x9f\x68\x7b\x69\x64\x23\x0a\xe9\xfa\xee\xb5\x69\x3f\x47\x5f\xb8\x27\xc7\xfe\xd4\x2f\xe3\x79\x45\x1f\x72\xc6\x7d\x72\x82\xee\x34\xb7\xd6\xb4\xce\x2b\x08\x16\x3c\x3b\xe7\x98\x43\xbb\xa5\x16\x7d\x6b\xcb\x0b\x38\xbc\x99\xd2\xeb\x62\x33\x61\x29\x85\xe7\x1a\xcd\x36\xf3\x49\x46\xc3\xd8\x74\x3c\xcd\x69\x37\x9c\x4c\x92\x1b\xb9\x85\x2e\xbe\xd9\x2b\x9f\xd3\x62\x3a\x71\xb4\x6c\x65\x0b\x81\x7f\xe6\xb9\x67\x16\x00\xb5\x6a\xf4\x8a\xd8\xa2\xab\x33\x35\xfb\xeb\xb3\xf8\xe4\x5b\xd2\x13\xc7\xdb\x30\xf5\xbd\x8f\x9e\x1f\xd9\x0b\xf7\x23\xc6\x1d\xb3\x34\xf8\xfa\x85\x5b\x43\xb7\x2d\x1d\xa3\x8d\x6c\x0d\xb6\xc5\x33\x20\x8c\x5a\x7c\x6b\x8b\xfc\xf5\xfb\x84\x5f\x7d\xcf\xae\xdf\x52\xb7\x97\xaa\xbd\x9f\xd1\x6e\xab\x5d\x32\x18\xb0\xe7\xc7\xd2\x5c\xb0\x9b\x3c\x85\xc0\x1f\xe4\x2b\x25\xeb\x72\x26\xe5\x01\x99\x3e\xdd\x0f\x07\x15\xed\x5f\x22\xb2\x8b\xc7\x80\x2a\xd2\x54\xbb\x6e\x0d\xad\x3b\xa3\x54\xf4\xdb\x6f\xe5\xb6\x5f\x34\x9e\x29\x71\xe4\x6a\x4e\x63\x79\x69\x16\x3b\x16\xee\x54\xe5\xa1\x6d\x57\x9f\x16\x1f\x4a\x63\x9b\xa5\xf7\xad\xd5\xdd\xa3\x91\xe0\xdc\x46\x08\x88\x0a\x86\x8d\xae\x39\x54\x3e\x58\x2b\x47\x0b\xee\xf9\x4f\xd9\xb6\x7b\xca\xb6\x9b\x4e\xd9\xb6\x77\xca\x6c\xb3\x87\x0a\x5d\xb5\x1b\xe7\x12\xe0\x20\x9e\x36\xaa\xd5\x9d\xf8\xff\xaa\x15\xc5\x64\xda\x17\x9e\xfc\x66\xe9\xcf\xeb\xa1\x1e\x93\x6d\x3f\x28\xbf\x76\x98\x50\x97\x8f\xf5\x82\xb1\xef\x1d\x5c\xb9\x8e\x9b\x61\x4e\xce\xaa\x63\x0d\xf5\xd7\x3c\x47\x0d\x7e\x47\x17\x95\xce\x74\x5f\x2f\x47\xf9\xb8\xff\xf6\x5b\x0d\x21\xe8\x58\xab\x61\x9f\xc9\x7e\xd3\x49\x36\x95\xcc\xa5\x56\x79\x12\x3b\xee\x5a\xdb\x29\xf6\x20\xbf\xb6\x63\x9a\x22\x31\xbc\xcb\xd3\x9f\x50\x30\x2d\x91\x4b\x3d\xe8\x1c\xb4\x87\xd2\x3a\xbc\x7f\x05\x59\x4c\x40\x40\x6c\x61\x3e\xe8\xbe\xd0\x94\x86\xb0\x02\xdd\x3d\xe7\x37\x12\x12\xd5\x66\x9e\x0c\x1f\xcc\x37\x2c\x41\x29\x28\x26\x59\x31\x04\xb6\x0a\xb3\x1c\x93\x9f\x83\x25\x8e\xbc\xd6\xff\xf1\x69\xb1\x28\x05\x10\xac\x7f\xe3\xd9\x07\x85\x5f\xea\xdc\x67\x80\xf1\xd0\xc9\xea\x4e\xfc\x9c\xd4\x64\xc7\x6d\x7b\xa7\xa9\xed\x1d\x8f\x9a\x6c\x6d\x91\xd7\x10\xd8\xd8\x5d\x30\xf0\x6b\x1b\x72\x41\x69\x80\x86\xe3\x39\xed\x5a\x14\x46\x91\x18\x80\x3c\x2c\x45\xec\xb7\x7f\xf5\x95\x78\x16\x97\xac\x8d\xe0\x32\x9e\xaa\x4d\x90\xcc\x2c\xa1\x3f\x73\xb5\xab\x85\x4d\x9d\x0b\x1f\xbb\x76\xfd\xf7\xfc\x5b\xe9\x28\xcc\x25\xaa\x8b\x3d\xfb\x3e\x84\xc0\xd4\xca\x5d\xab\xe0\x50\x2a\x7f\x9a\x4a\xa3\xa2\x98\xe4\xfd\xad\xad\xbc\x08\xa3\x0b\x7e\x49\xb3\x61\xc2\xaf\xba\x11\x1f\x6f\x81\x3e\x45\x00\x6f\x3d\xd9\xde\xdd\xd9\x7f\xb6\xb3\xbf\x35\xe4\x59\x44\x37\xa3\x10\x52\xf1\x6d\xb2\x74\x53\x00\x5b\x5b\x97\x99\x1e\x0c\xc5\x36\xc7\xd9\x7c\x95\x7e\x72\x06\xbb\xdd\xaf\xd6\xed\x5e\x49\x6b\x6c\xf2\xff\x95\x5d\xb1\x44\xf3\xda\xa4\xf1\xb3\xea\xa0\xf4\xa1\xb6\x07\x78\xa9\x28\x7d\xb5\x57\xa8\x43\x11\xda\xeb\xe1\xb2\xde\xf0\x1e\x77\xb8\x6d\x0c\x42\x02\xbb\xde\xb1\x1b\x6d\x3b\xbc\xa6\x33\x86\x1c\x82\xc3\xf1\x0c\xc2\xaa\x4e\x13\xe7\xd1\x68\x49\x3a\xec\x6e\x6c\x7b\xb7\x69\x42\x4d\x13\x87\x24\xe8\x2a\x95\x4a\xed\x32\x81\x4e\xab\xcc\x09\x55\x93\x72\x6d\x21\x50\x22\xe4\xd9\x54\x21\x7a\x95\x11\xa5\xb4\xec\xc5\xf6\xba\xe4\x27\xb1\xa4\xb1\xa5\x90\x94\xe9\x41\x58\x7a\xc9\x2f\x68\xac\xd2\x2a\x39\xf3\x6f\x22\x77\xd3\xbc\x8e\xce\x4d\x73\xea\x3d\x1b\x4e\x21\x94\xbb\xc2\x4f\xf9\x41\x4b\xc7\x4f\x13\x9a\x56\x50\xa7\x0e\x31\x8f\x50\xb4\x69\x12\x80\xed\x0e\x39\xc5\x00\xb5\xbd\x03\xfc\xeb\x1b\x68\x00\x7f\xb8\x76\xb5\xb2\xfe\xc9\xa9\xd4\x00\x18\x52\x76\x6a\x42\xea\x58\xeb\xaf\x96\x7e\xc8\xb3\xd7\xe2\x96\x31\x4f\x6e\xfc\x62\xb7\xbd\xb5\x45\x5e\x5e\x72\x16\xe7\x90\x84\xe8\x86\xa5\xe7\x24\x17\x07\x00\x21\x49\x71\xc5\x22\xda\x21\x61\x41\x12\x2a\xc8\x88\xd6\xed\x66\x74\xd8\x35\x37\xfb\x90\xb4\x4e\x9d\x13\xa9\x86\xa0\xcc\x50\x55\xc7\x87\xd2\xf0\xd9\xb6\x01\xae\xae\x09\x66\xcc\xb2\xda\x41\x09\x5a\x41\x89\x3d\x2a\x01\x69\xe3\xe0\x46\x4e\xb9\x64\xcf\xf8\xcf\x3c\x6f\x34\x62\xfc\xa7\x4c\x2c\xeb\x68\x02\xef\xe6\x54\xbf\xf6\x71\x59\xeb\x7d\x1e\x82\xde\xe7\x81\x8b\x27\x31\x03\xb0\x94\xe8\xd7\xfb\xa8\x68\xa8\x16\xec\x9e\x8c\x13\x35\x97\x4c\xd1\xd4\x75\x44\x8b\xa0\x6a\x3e\x24\x41\x0e\x9f\x03\x4b\x4e\xc5\x72\x79\xad\x51\x08\x85\x83\xc9\x50\xcc\x67\x24\xed\x32\x2a\xba\x92\x53\xa2\x35\xa2\xb2\x89\x25\x65\x61\xa3\xe6\x8c\x24\x31\xd7\x09\x14\xff\xae\xed\x6d\x4a\xc6\xf6\x60\x1e\xde\x24\x7b\x48\xf9\xe6\x34\x9d\xe6\x34\xde\xbc\x0c\xb3\x7c\xa3\xec\x6f\xa3\xa7\xee\x09\xd5\x96\xb6\xd7\x2f\x5b\xf1\x9a\xf9\xb7\x6d\xda\x8f\x0f\x06\x60\x36\x02\x43\xbe\x0d\xd9\x91\x8f\x73\x41\x7a\xe0\xcf\x6f\xac\x85\x34\x34\x48\x7c\x72\x2f\x4c\x02\xad\x3e\x3e\x34\x7b\xf1\x98\x04\x10\x23\xc4\xd4\x57\xc9\xcd\x1f\x93\xe0\x20\xb0\x2f\x18\x90\x1d\x78\x60\xe2\x7d\xff\xb1\xad\x5a\x0d\xfe\x93\x06\xe5\xdb\xc6\xbc\x4b\x8b\xac\x74\x25\xdb\x16\xfa\xd5\xe3\xb1\x07\x52\x65\x6c\xaf\x77\xa9\xd9\xd0\xde\x02\xf3\xaf\xaa\xd5\x06\x3a\x59\xd1\x55\xb5\xb6\xd2\x58\xdf\xd6\xeb\xdb\x7a\x09\x2b\x8d\xb9\x62\x2c\x38\x90\x4d\x5a\x51\x1d\x10\xe1\x4f\xaf\x0e\x55\xa6\xaf\x62\x16\xe2\x48\xfd\xed\x82\xde\x0c\xb3\x70\x4c\x73\xed\x36\xfb\xbf\x55\xc9\x2c\x8e\xc4\x01\x44\xa6\x04\x7f\xcf\xc9\x95\x38\xf5\x2b\x19\x13\x3d\xb8\x3b\xf2\x26\x95\x3c\x88\xf2\x17\x94\xb6\x2c\x20\xc4\xd6\xc8\x64\x8b\xb0\x6b\x44\xd7\x04\x93\xe1\xa1\x60\x18\x65\xbd\x1b\xce\x05\x0f\xd2\x2b\x96\xca\x45\xf1\x7d\x2c\xc1\xe6\x3f\x8c\x63\x29\x0a\x41\xa0\x13\xf1\xe3\xa3\x27\x2d\xb7\xa7\x60\x8b\xcc\xed\xfe\x8d\x1c\x5a\xc9\x38\xfa\xd0\xbf\x2f\x89\xbe\xdd\xf0\x66\xde\x95\x36\xd2\xad\xf6\xa2\x7c\x59\x89\xd5\x72\xf6\x73\x49\x6e\xeb\x5e\x15\x99\xc0\x4c\x89\x15\xdb\x26\xbe\xb6\x25\x35\x62\x37\x5c\x96\x5a\x97\x48\x88\x02\x99\x42\xa6\x69\xac\xe6\xb1\x4c\x55\xbc\xd0\xa7\xff\x40\xa2\x71\x09\x4f\x82\xdb\x7a\x4e\xc8\x59\xc4\x46\x66\xc8\x83\xf4\xf9\xa1\x07\x16\x6d\x6c\xcd\x0f\xad\xf9\xa1\x35\x3f\xb4\xe6\x87\x1e\x26\x3f\x74\xc4\xd3\x18\x02\x44\x84\x09\xca\xd6\x81\x37\x1a\xd3\x98\x85\x1d\xf2\x37\x99\xe0\xde\xb0\x48\x16\xf8\x2c\x26\xc9\x03\x45\x36\x49\x29\xc5\xe7\x62\x93\xbc\x16\x2a\x19\xa5\xc8\xc0\xfc\xae\x59\x25\xdf\xce\xa2\x92\x55\x42\x20\x64\x95\x96\x63\x6b\x0a\xa9\x42\xa9\x65\x65\xbc\x35\xf7\x98\x99\x73\x5a\x34\x28\x90\xe5\x57\x4f\x7b\xec\x04\x31\x80\x11\x9e\xd3\x02\x61\xea\x94\x43\x62\x9c\x28\x9f\x81\x6c\xb4\x7a\xc0\x35\xaa\x1e\xa9\x8c\xa8\x19\x95\x52\x55\x64\xda\x77\xb5\x7a\x54\x0e\xdc\x2c\x1d\x3c\x98\x1b\x48\x0d\x16\xba\x8b\x65\xd3\x54\x2b\x68\x1a\xc6\x1a\xc6\x71\xc3\x0a\xca\xaf\xae\x92\xb0\x24\x87\xb3\x54\x8d\xf5\x68\x62\xea\x39\x96\x18\xdc\x28\x64\x9b\x55\x79\xce\x32\x35\x69\xf2\x1a\x78\xe5\x3b\x06\x0c\x79\xf8\x2c\xb1\x0a\x41\x0c\x55\x5e\x34\xb3\xbe\xff\x49\x6f\x6d\x3f\xb8\x0a\x0e\xd8\x3b\x7b\x8d\x3c\x70\x09\xd6\xe7\x82\x1f\x58\xe4\xd5\x35\x0b\xb8\x66\x01\x97\x65\x01\x21\x26\x48\xad\x43\xc9\xae\x0b\xd7\xc4\xfd\x01\xc0\x9a\xf5\x13\x8b\xf5\x3d\x4f\x8b\xef\xc3\x68\xa6\xf2\xcd\x86\xb3\x58\xb8\x39\x39\x38\xbb\x76\x25\xfb\x36\xe4\x69\xb1\x39\x0c\xa3\xbb\xea\xe0\x94\x15\x95\x65\x5c\xb5\x1a\x1d\x5c\x89\x41\xb2\xa7\x74\xcf\x8a\x35\x98\xcc\x2a\x14\x6b\xd0\xd0\x5c\x8a\x35\x30\x5d\xc2\x73\xe4\x58\x2d\xa9\x85\xef\x58\x0d\x4a\x4d\x5b\xbb\x52\xc9\x66\x41\xac\x4a\xc9\xb6\xc8\xd8\x7c\xee\xa7\xe2\xb6\xb5\x37\xb2\xf1\xaa\x75\x01\xfd\x7b\x76\x1d\x0c\x75\x7d\xcf\xae\xef\xd9\xf5\x3d\x5b\x73\xcf\xfe\x8b\xd1\x2b\x71\x78\x67\xdd\xb3\x36\xdc\xe2\xf7\xac\x5d\xbb\xf2\x9e\xbd\x94\x00\xbf\x9b\x6b\xd6\x9e\xd1\xaa\xae\xd9\xfb\xb9\x47\xec\x91\x36\xde\x23\x2e\xa0\x77\x8f\x3c\x7b\x60\xa1\x12\xb7\xb6\xc8\x2f\x21\x2b\xb4\xbd\xf8\x39\x2b\x46\xd3\x01\x18\x8a\x0b\x76\x6d\xc0\xf9\xc5\xd6\x30\xe1\x57\x5b\x2c\xcf\xa7\x34\xdf\xda\xdd\xef\x91\x82\x93\x01\x25\x43\x76\x4d\x63\x31\x27\xd7\x72\x89\x08\x68\x81\x8e\x5b\x72\xe4\x9b\x97\x61\xc2\xe2\xcd\x21\x4b\xe8\x26\x1c\x29\xc8\x7c\x08\xc8\x20\x79\x19\x76\xce\xa5\xa7\xe6\x5e\xaf\x4f\x82\xff\x45\xf7\x69\x38\x7c\x0a\xdb\xbe\xdd\x83\x92\x68\x2f\x0a\xe9\x73\x28\xd9\xc1\x92\xe7\xc3\x70\x3f\x0e\xa1\x64\x17\x4b\x9e\x3d\xdf\x7f\x1a\x0d\xa0\xe4\x09\x96\xec\x45\x4f\x07\x51\x0f\x4a\xf6\xb0\x64\x77\xb8\xb7\x3d\xd8\x83\x92\xa7\xb2\xe4\xf9\x93\xe7\x21\xd6\x7a\x26\x4b\x7a\xbb\xc3\xe7\x28\x64\xda\xc7\x92\x9d\xfd\xdd\xbd\xe7\xbb\x50\xf2\x1c\x4b\xb6\xc3\x9d\xdd\x67\x28\xdc\x79\x29\x87\xb8\x1f\x3d\xa7\x43\xac\xf6\x52\x8e\x71\x6f\xf7\x69\x3c\x94\x50\x72\x48\xbb\xf1\x5e\xa8\x8a\x74\x7f\x4f\x86\xb2\x28\xe2\x69\x91\x85\x79\x21\xc9\xe6\x11\x4f\x78\xd6\x27\x41\xc2\xce\x47\x45\x50\x93\x93\x07\xd7\xaf\x8c\x67\x0f\x2c\x10\xe2\x17\xc7\xb3\x09\x4b\x2f\x1c\x2c\x1b\x46\xf4\x09\x8d\x6c\x2c\x1b\xee\x0f\x06\x71\xcf\xc6\xb2\xe1\x93\xfd\xe1\x60\xdb\xc6\xb2\x61\xef\xe9\xce\xf3\x1d\x1b\xcb\x68\xf4\xa4\xf7\x2c\xb4\xb1\x8c\x3e\xdf\xa6\x4f\x77\x6d\x2c\x8b\xf7\xb7\x07\x4f\x7b\x36\x96\x45\x3b\xdb\xfb\x7b\x03\x1b\xcb\xc2\x78\xfb\xc9\xde\x33\x1b\xcb\xf6\xf7\x7b\xf4\xc9\xd0\xc1\xb2\xe1\x70\xbf\x27\xd1\x55\x61\xd9\x70\xf8\xa4\xb7\xbf\xed\x60\xd9\x70\xaf\xd7\x93\x4d\x29\x2c\x8b\xf6\xb6\xb7\x9f\xee\x2c\x8d\x65\x62\xf5\xca\x38\xf6\xc0\x42\x2b\x7e\x71\x1c\xcb\xe0\x86\xb5\x50\x6c\x48\x07\x94\x3a\x28\x36\x8c\xe2\x78\xc7\x46\x31\x3a\x7c\x1e\x3e\x77\x08\x19\xdd\x7b\xb6\xfb\x6c\xd7\x41\xb1\xe1\xde\xee\x9e\x43\xc8\x86\x4f\x9e\xec\xee\x3e\xb5\x51\x8c\xee\xed\x3e\xdf\xdd\xb3\x51\x2c\xde\xdd\x19\xee\x38\x84\x2c\x7a\xba\xb3\xbf\xb3\x6f\xa3\xd8\xe0\xd9\x76\xb4\x1d\xf9\x28\x16\xee\xf7\x3c\x14\xdb\xdb\xd9\xdb\x71\x51\x6c\xb8\xfd\xec\xc9\x13\x07\xc5\xe2\xbd\x5e\xaf\xd7\x5b\x1a\xc5\x32\x48\x85\xe4\x61\xd8\xdd\x02\x41\x96\x72\xd9\x7d\x22\x3a\xec\x66\xbf\x26\x05\xde\x76\x5b\xb4\xa7\x30\x0d\xb1\x8b\x94\xc3\x8a\x3e\x5b\x6d\x08\xb1\xcb\x55\xa7\x3f\xf9\x8c\x01\x7a\xca\xba\xc2\xea\x29\x3c\xab\xab\xd1\xd4\x5f\x85\x6e\x10\x9a\xf0\x6d\xb8\xaa\xbb\x7c\x5a\x0d\xdf\xd4\x61\xc9\x66\xeb\x33\x85\xa4\xf1\x1e\x10\xd5\xf3\x79\x5e\x09\xde\x1c\x2e\xc5\x7d\x31\xe0\x10\x6d\x7b\xfc\xea\x9e\xf6\x2a\x80\x1b\x27\xe4\x18\xe0\x43\x45\x4f\xf4\x58\xdd\xcf\x7e\x25\x78\x53\x4f\xbe\xac\xf1\xf3\x24\xfa\xb1\x8f\xfe\x83\xf4\x19\x7a\x95\x85\x57\xb5\xb1\x76\xf6\xb6\xe7\x4a\xac\xa6\xe6\x7e\x0f\xd9\xa0\x70\x78\x6d\x45\xef\xad\xcc\x4f\xab\xdd\x3f\xd9\x7e\xc3\xee\x3d\x30\x33\xfa\xf2\x45\x18\x46\x05\xbb\xa4\xaf\x13\x3a\x86\xfc\x9f\x32\x16\xd8\x55\x4a\xb3\x57\x3c\x02\xdd\x66\x2d\x35\x37\xf4\xc1\x81\x6f\x8c\x1e\x66\x03\x7e\x96\xfd\x30\x5a\x70\x7b\xa2\x56\xf0\xd6\x98\x47\x2b\xd2\xfe\x82\x08\xc0\x5d\x0a\xb5\xd0\x2a\x1e\x4e\x29\x11\x72\xcc\xa3\xae\xb7\x05\x5e\x4a\xe4\xad\xaf\x09\xa3\x28\x34\x82\xc8\xda\x29\x97\x53\x21\x14\x6b\x90\xaf\xb7\x6e\x37\x6e\xcb\xec\x47\x59\x5c\x50\xe6\x2b\x1e\x9a\x55\x63\x19\x3f\x8d\x6c\x2b\xe5\xb1\x18\xd4\x25\x4d\x8b\x0e\x19\x85\x69\x9c\xd0\xac\x43\xa2\x70\x52\x4c\x33\x69\x83\x81\x3b\x90\x5a\xcb\xde\x5c\xc9\x4a\xf8\xab\x76\x65\xcc\x2f\x2b\x32\xa9\x78\x81\x77\xf9\x70\xb8\x50\x1f\x52\xc4\x83\x11\xe3\xf1\xc4\xa4\x75\xc4\xd3\x8a\xbe\xc6\xd3\xc6\xb3\x94\x1a\xc0\x61\x5d\x6e\xf1\x3d\x8b\xe7\x12\xa3\x6e\x6a\x6f\x38\xfc\x12\x14\xf2\x41\x9a\x14\x48\xbb\xab\xba\x10\x79\x4f\x7c\xc0\xa6\xe8\x78\xaa\x2d\x2b\xd2\xa2\x18\xe3\x2f\x18\x39\xc2\x88\xd9\xeb\x3a\xdb\x9b\x55\xb1\xa9\xf3\xba\xbe\xda\x56\x22\xd8\x9f\x94\x62\xe0\x5d\x1d\x16\xed\xd7\x80\x37\x06\x61\x77\x20\x8d\x12\xc9\x91\x34\xd7\xcd\xf9\x79\x0d\x7c\x63\x14\x42\xb7\xe5\x2a\xb5\x55\x6d\xc8\xc3\x5e\x15\xf4\xec\x90\x87\xd8\xa8\xae\x3b\xe1\x79\xce\x06\x09\xb5\x24\xfe\x18\x14\xbd\xb6\xdf\xed\xd9\x75\x9b\x46\x51\xdf\xa1\x89\xb8\x9a\x8e\x68\xc6\x8a\xfa\xa9\x97\x41\x9b\x7a\xd4\xcd\x99\xa0\xa4\x34\xac\xcd\xf1\xbe\xed\x42\x35\x86\x2e\x15\x00\x1a\xfc\x43\x16\xa6\x98\x62\xac\xa6\x65\x2b\xe2\xa7\x81\x6d\x6a\xdf\x40\x19\x8d\x93\x2e\xaa\x7b\x09\x5b\x0f\xe1\x2b\x56\x8c\x3e\x8c\x68\x6d\xd8\xce\xe7\x3b\x65\xd0\xc6\x24\x0b\x0a\xe8\xb3\xd0\x5c\x31\xae\x41\x38\xa0\x09\x06\xd1\xfb\x3e\xe1\x57\xef\xc5\x82\x0b\x8a\xf0\xe1\x66\x42\xf3\xd3\x49\xc6\x27\xe2\xa8\x9e\x4a\x3e\xa4\x76\x47\xbb\x0b\xb6\xf3\xdb\x6f\x95\x0d\xf5\xda\xdd\x30\xbd\x01\x31\xda\xdf\x24\x52\xd1\xd8\x64\xab\x37\xdb\xb5\xd0\xe0\x4d\x35\x41\x08\x06\x61\x74\x51\xf7\x16\xec\xcd\x3d\x91\x8a\x36\x67\xcc\x69\xb9\x11\xbf\x9a\x66\x61\x03\xc6\x2f\x35\x62\xdd\xe6\x0a\x47\x0c\xaa\x5f\x29\x79\xd4\x8a\xb8\xbf\xb1\xf3\x94\x67\x54\xfb\x98\x87\x93\x09\x0d\xb3\x6a\xb1\x97\x98\x08\xe7\x49\xc7\xd1\xe4\xbd\x24\x39\x4b\xcf\x13\x4a\xa2\x11\x4b\x62\xcc\x90\x9f\x16\x8a\xc7\x35\xce\xeb\xf0\x39\xa3\xa9\x8e\xe3\xbe\x28\x5a\x1f\x1e\x92\x40\x9d\xb7\x80\xbc\x58\xb0\x7e\x97\xe5\xf2\x6c\xc6\x77\xaa\xdb\x5f\x74\xdc\xb5\x4b\x99\x8f\xc2\x09\x6d\x2d\xd6\x5a\xdb\x1a\x8a\xbb\x0d\x6f\x86\xe4\x4c\xf0\x42\x67\x1d\x08\x75\x16\xe9\x03\x09\x91\x73\x0c\xc5\x24\x2c\x35\x7b\xc2\xd2\xc6\x8d\xae\xed\xcc\x47\x1a\x9e\xbe\x16\xe4\x6f\xd1\xad\xad\x3a\xf4\x4b\xee\x72\x45\x53\xab\x59\xf8\x72\xc3\xed\xb9\xd6\x82\xa5\xe7\xeb\xe5\xc0\xe5\xb8\x66\xc5\x7a\x29\x36\x08\xa4\xe9\xa5\xb5\x7d\x23\xc3\xdf\xdc\x02\x18\x21\x2c\xd4\xc2\x87\x11\x25\xb1\xba\x4b\x86\x3c\x03\xe2\x60\xa8\x41\x87\xb0\x94\x8c\x59\x92\xb0\x9c\x46\x3c\x8d\xd1\x59\xe1\x6b\xcc\x3e\x13\xde\x90\x7c\x42\x23\x36\xbc\x21\xa1\x22\xf2\x05\x1b\x53\x3e\x2d\xa0\xa9\xd0\x21\x2c\x79\x87\x70\xd4\xd3\x5f\xb2\x78\x1a\x26\xc9\x8d\x0c\xd2\x05\x7c\x8f\x78\xdb\x99\x85\xc0\x46\x96\x47\x0a\x73\xe3\xde\x19\x29\x74\x53\xab\x46\x0a\xd5\x70\x1b\x64\x07\x52\xf1\x37\x4c\xf8\x95\x2d\x1b\xc1\x12\x10\x44\xb8\x79\xdc\x79\x4c\xbb\x79\x94\xf1\x24\xf9\xc0\x27\x4e\xee\x48\xb1\xa3\xdf\x87\x31\x75\x68\x7a\x4e\xa6\x39\x8d\xc9\xe0\x06\xf6\xf7\x2d\x8f\xc3\xc4\x5c\x01\x90\x54\xe9\x4d\x11\x08\x20\x96\x9e\x93\x13\x60\xd9\x37\x4d\xfd\xcd\xf3\x8c\x4f\x27\x1f\x5b\x15\x1a\x51\x00\xfd\x35\xdf\xaa\xae\xd2\x26\xc0\xf6\xa6\x62\xb7\x65\xee\x25\xb0\x26\x16\xc3\xb3\x25\x40\xa7\xb0\x5c\x7f\xd5\x5c\xa2\x25\xf4\xd1\x6f\x17\x23\x96\x11\xd5\x3b\xa4\x54\x07\xe4\x70\xc6\x12\x39\x8c\x8d\x74\x47\xbe\x54\x86\x07\x26\x2f\xd1\x69\x41\xc7\x93\x0e\xc6\x11\xeb\x88\x8f\x85\xfc\x88\xe1\xf8\xdc\xc7\xa9\xe9\x5b\x1a\x2a\x87\x31\x2d\xf9\x66\xd5\x06\x7e\x0b\xb3\xf3\x65\xa3\xbe\x89\xaa\xcd\x01\xdf\xa4\xd9\xab\x92\x9b\x67\xa0\xa4\x6b\xc1\xec\xf0\x0f\x8c\x55\x07\xb3\xaa\x7f\x8a\xfa\x13\x14\xcf\xb6\x21\x39\x84\x89\x76\x4f\x4f\xc1\xac\xf0\xf4\x14\x62\x27\x8b\x86\x3c\x61\x81\xbb\x35\xed\x36\x78\x02\xcb\xd8\xc5\xa2\xa1\x0e\x81\x2c\xb3\x3a\x78\xbc\x98\x55\xbb\xdd\x96\xab\xaf\xfe\xed\xa2\x84\xed\xb5\xcc\xb6\xe5\xca\x07\xcd\x92\x20\xea\x83\x89\x32\x9f\x84\x11\x2b\xc4\x3a\x06\x3d\xcb\xaf\xdc\x1c\x19\x27\x48\xa2\x0c\x19\x07\x06\xa9\xf2\x12\xb6\x8d\x9a\x2b\x3e\xab\x46\x6c\xe3\xe3\xdb\x8a\xd1\x62\x7e\xbe\xba\x01\xeb\x90\x81\x7f\x9d\x48\x06\xdb\xea\xaa\x63\x59\x43\x17\xea\x15\x6a\x80\xbb\x50\xe6\x00\x49\x02\xeb\x81\x61\xa9\x9e\xaf\xb5\x48\x85\xfd\xe2\x86\xe6\xac\x22\x15\xf4\xbb\x15\xc8\xb5\x0c\xec\xc0\x09\xea\x62\xd0\x84\x58\x77\x6e\xc5\x51\x26\x2f\x74\x71\x5f\xfd\xd5\xa5\x62\x59\x74\x4c\x05\xb5\x82\x4e\x5c\x72\xb2\x39\xdb\xc2\x62\x32\x4d\x92\xad\xbd\xed\xa7\xdb\xe5\x69\x5d\xd1\xc1\x05\x2b\x3e\x3c\x9c\xc9\x55\xe3\xe5\x76\x30\x0b\x07\x59\x7a\x3e\x03\x0d\x59\x7a\x3e\x0f\x26\x5e\xb3\xb2\x58\xbd\x16\x0b\x77\x16\x42\xc3\x9d\x39\xf1\x70\xe7\xe1\x21\xe2\x35\x2b\xfe\xb0\x78\x58\x35\xb7\x7a\xf2\x58\x8f\x86\xd7\xac\x68\x40\xc1\x6b\x56\xd4\xa2\x1f\x1d\x4f\xda\x9d\xf9\x2f\x17\xeb\xb6\x35\xfe\xc6\x56\xfc\x5b\x94\xce\xfa\x37\xfd\x89\x1b\x7f\x3b\x8d\x69\x56\x1b\x75\x5b\x7c\xf4\xc3\xb5\x2a\xb2\x5b\x8d\xee\x28\xd0\x10\x78\x8c\x33\xc6\xdf\x36\x84\x92\x4c\x18\x18\x55\x62\x43\xc9\xc3\x6a\x80\x64\x41\x05\x8c\xcc\xe7\xea\x1f\x72\x0f\x12\xcf\xf3\xa9\xbd\x0f\x1d\xc7\x05\xe7\x26\x01\x45\x88\x01\x42\x1b\xe4\xaa\xa3\x5c\x73\x99\xf0\x62\x04\x23\x46\xdd\x57\x8d\x12\xc2\xda\x3e\x5c\x3c\x72\x12\xe0\x22\x05\x1d\x12\xa8\xa5\x10\x7f\xcb\xa9\x58\x7f\x82\xdd\x35\xfc\xba\x66\x85\xf8\x0b\x86\x28\xfe\x80\xb1\x40\x02\x05\xdb\x9b\x56\x59\x8c\xc3\x80\x94\x0a\xc6\x0c\xe0\xd3\x6d\xc7\xcc\xbb\x6d\x87\xee\xfe\x9e\x67\x24\xa7\xd9\x25\xcd\x48\xce\x62\x2a\x31\xc1\x78\x16\xa3\x19\xbf\x85\xd8\x0c\x44\x67\x38\x0f\x1b\xf9\x1b\x38\x0b\xdf\xc3\x48\xca\xbe\xd5\xf0\xe4\x29\x57\x8a\x68\x73\x9c\x2c\x39\xb6\x82\x35\x9b\x50\x37\xd3\x12\x86\xf6\x49\x19\x33\xe5\x7b\xaf\xb4\xef\x46\xde\xe2\x71\x2a\xd5\xc8\x58\x86\xab\xc4\x46\x17\xcc\x10\x1f\xa0\x05\x80\x4a\x6d\x53\x49\xe1\x85\x2c\xf0\x0d\xe2\x8d\x5f\x55\x18\x83\x1d\xbc\xbf\x98\x0e\x5f\x0f\x6c\xa8\xca\x16\x63\x49\x29\xd5\xca\x28\xbb\x12\xfd\x70\xc4\xe5\xa3\xb8\x08\xb6\x3e\xa0\xab\xc8\x2d\xde\xe2\x2c\x3d\x3f\x8e\x32\xaa\x4e\x32\x85\x59\x56\xc3\x27\x34\xbc\xd4\xe0\x68\x77\x52\x65\x76\x81\xf9\x5b\xb5\xa2\xc0\xb2\x13\x68\xa9\x57\x83\xa7\x27\x5d\xad\x4b\x98\x1a\x91\xa5\x40\x90\xce\x4c\xfa\x93\xce\xb9\x9a\x1f\x8b\xa7\xab\xb1\x28\x50\xb7\xb7\x2e\xb7\x02\xca\x6b\x10\xbd\x36\x1f\x34\x07\x50\x2a\xd3\xba\x2f\xf5\x00\xae\x11\x7d\x1b\xed\x9c\x86\x6c\x52\xad\x68\xa0\xcf\x6b\x60\x52\x9a\x5e\xcb\x2a\xb9\x99\x50\x63\x72\x22\xd7\x4f\xa0\xa8\x8c\x1f\x1f\x18\x50\x08\xf4\xe9\x54\x24\x8f\x49\x20\x9b\x04\x22\x73\x09\x09\x99\xc3\x41\x42\xe3\x79\x9b\xa8\x4e\x49\xac\x5c\xf2\x36\x24\x75\x7c\x33\xf4\xe4\x3a\x84\xe5\xaa\xa7\x0d\x45\x1d\xd1\x09\xcf\xeb\xdf\x8a\x0d\x8f\xed\xa4\x5c\x73\x22\x5a\x6e\xc4\x72\x32\xc9\xf8\x25\x8b\xa9\x9d\xd5\x06\xdb\xf3\x96\xc4\x4a\x86\xfd\xc9\x77\xe6\x4c\xe9\x15\x41\xaf\x29\x7f\x1d\x1f\x93\x80\x5c\x85\x79\xfa\x9f\xa0\x20\xf9\x74\x32\x49\x18\xa6\x7f\x3e\x3a\x3e\x36\xc4\xf5\xef\x19\x9f\x4e\xfa\x10\x4f\x35\x80\x57\x6f\x14\xa6\x24\x0a\xc5\xf9\x98\xa6\x19\x4d\x18\xd8\x62\x87\x29\x1b\x87\xa8\x1a\x0c\xd3\x98\x5c\x71\x68\x74\x40\x89\x0c\x5e\x43\x63\xc2\x52\x6c\x24\x24\xc3\x69\x31\xcd\xa8\x4a\xba\x4d\xf8\x90\x80\xd0\xa1\x4b\x8e\x29\x45\x18\xc5\x3a\x0e\x07\xdd\x31\x95\x52\x10\xdd\x45\x49\x1e\xb2\x69\x8b\xc7\x20\xb9\x37\x34\xc2\xd2\x21\xcf\xb0\x4a\x37\x30\xd7\x9a\xbd\x75\xd6\x5a\xa7\x41\x41\x42\x82\x8c\xa1\xba\x99\x08\x4d\x72\x6a\xe7\xbb\xa9\x59\xfc\xba\x04\x38\x73\xed\xc0\x78\x9a\xc3\x4a\xa9\xce\x49\xcb\x13\x0e\xb6\x03\x9f\x47\x74\x84\x13\x62\xdb\x55\x42\x66\x3c\xf6\x3e\xbd\xa9\xa3\x43\x16\x79\xd0\x17\x04\x4f\xe9\xbb\xa1\x28\x6b\x9d\x54\x7d\xc6\x21\x76\x2a\xab\xa2\xc4\x0e\x8d\x13\xf1\x86\xa8\x6f\x60\x43\xdf\x0a\xb5\x30\x1b\xb7\xb6\xda\x45\x27\xba\xab\x27\xb3\xe5\x2f\x4b\x4c\x10\x3d\xe2\xee\x30\x41\xd9\x40\xe3\x04\x0d\x0c\x9a\xa6\x35\x41\x6d\xdc\xb6\x57\x33\x1a\x01\xf4\x72\x66\x77\xf3\x0e\x5c\xc0\xcc\x6e\x6d\xe3\xb6\xfd\xb1\x7c\x37\xef\x3f\x30\x37\xbb\x46\x33\xba\x8c\x46\x61\x12\xe1\xa9\x06\x6e\x37\x67\xff\x05\x17\x69\xfb\x83\x7c\xff\xb1\xf4\xd5\xbb\xb7\x86\x39\x71\x73\xf7\x80\x58\xf9\x15\xbb\x24\x87\x24\x96\xf6\x8e\x1e\x6f\x1b\xc4\xec\xd2\x22\x54\xba\x86\x7c\x78\x4e\xb8\x7e\x0b\x07\xe1\x20\xe7\xc9\xb4\xa0\x9a\x8b\xf6\x81\x0b\x78\xc1\x04\x9b\xcf\x9f\x3f\x7f\x3e\xb9\xae\x05\xbb\x62\x71\x31\x12\x80\x7b\xbd\x06\xa8\x11\x85\x94\xf8\xb3\xc0\x54\x26\x1b\x08\xea\x0e\xdf\xcc\xfb\x58\x4f\x79\xc0\xe3\x1b\x78\x0d\xa6\xf1\x91\x60\x66\x5b\xba\x15\x4d\xe5\x60\x85\x0f\xad\xe6\xf9\x70\x98\xd3\xe2\x17\x18\xeb\xa6\x55\x1e\x25\x8c\xa6\x58\x7e\x50\xd9\x0f\x9a\x23\x56\xf7\x73\xab\x5e\xca\x2a\xe8\x01\xfb\x2f\xb5\x2c\x0e\x61\x2f\xeb\xec\x5c\xf6\xda\x0e\x58\x63\x6e\x66\x01\xf0\xd9\x8c\x56\xe4\xd2\x5d\x72\x16\x93\xde\x41\x85\x93\xcd\x1c\x56\xae\xfb\x0f\xcc\x3b\x71\x6d\x62\xb8\x36\x31\x5c\x9b\x18\xce\x67\x62\xa8\x6e\xb2\x9c\xa2\xf0\x34\x09\x0b\xfa\x2f\x99\x1a\xa3\x54\x76\xaf\x26\x89\xf0\xeb\x15\x1f\xd7\x99\x67\x3d\x77\x21\x5f\x5f\xd2\xb4\xf8\x81\xe5\x05\x4d\xeb\x93\x52\xef\x36\xd4\x99\x39\x32\x07\x5a\x37\x14\xd3\x01\x9f\xa6\x51\x9d\x99\xe2\xde\x4e\x09\xb2\xa9\x23\x05\xf3\x79\x0d\x33\xef\xd5\xd6\x72\x21\xd3\xcf\xb5\x61\xe6\xda\x30\xf3\xcb\x1b\x66\xfe\xfd\xe7\x0f\x1f\x5e\xbf\x27\x87\x64\xe7\x89\x60\x6e\xb6\x88\x26\x7b\xf0\xe8\x4f\x79\x4c\x49\xce\xc9\x88\x92\x28\x4c\xa5\x98\x82\xd2\x94\xf0\x14\xbe\xe7\x20\x8b\xec\x8a\x8a\x3f\x84\x85\x78\xed\x5e\x51\x72\xce\xd3\x34\x44\x51\x0f\x34\x04\xcb\xa7\x5b\x2b\x38\x19\xb1\x9c\xf0\x8c\x9d\xb3\x34\x4c\x48\xc2\x23\x18\xae\x68\x03\xcc\x71\xce\x74\xcd\xdd\xb8\xd5\xeb\x10\xf1\xff\xed\xb3\xee\xd9\x86\xed\xae\xe7\x52\xe7\x96\x54\x0b\x18\x85\x23\xb8\x5f\xb1\x8c\x46\x72\x75\x51\xe4\xae\x4b\x80\xd7\x46\x83\x17\x20\xe7\xa0\xb3\x3a\xa7\xc5\x77\x7c\x9a\xc6\x2c\x3d\x3f\x02\x6e\xf9\x3d\x8d\x0a\xe9\x5d\x05\xb2\x02\xd1\xe7\x90\x67\x63\x9b\x6b\xc4\xe7\x0c\xd4\x1f\x86\x17\xf4\x83\x82\x51\x2f\x1a\xbb\x52\x19\x0a\x5d\xb2\x40\x74\x62\xec\x44\x22\x3e\x9e\x4c\x0b\x1a\x1f\x4b\x55\xc4\x15\x4b\x63\x7e\x25\x86\x77\x64\x7f\xb1\x55\x62\x76\x2f\x4e\xf5\x2e\x32\x32\xc0\x48\xe2\x52\x05\x9b\xa8\x30\xdc\xd4\x75\x82\xb6\x40\x95\x59\xd5\x2c\x70\xad\x38\x13\xa3\xc5\x07\xc7\xff\x01\x53\x12\xa7\xe8\xdf\x58\x24\x57\xc8\x8c\xf0\xd1\x23\x6b\xb8\x28\x0e\xe2\x29\x0d\xa0\x5c\xea\x1f\xcd\x6c\xc4\x67\x7c\x1f\x07\xb6\x29\x8d\x86\x80\xc1\xe5\x4a\x02\x2c\x4a\xba\xf9\x24\x61\x45\x2b\x68\x05\xed\x93\xed\x8f\xea\x57\x3b\x68\x9f\xf4\xf4\xaf\x8e\x12\x13\x99\xc1\x4f\xc2\x2c\xa7\x6f\xd2\xa2\xe5\x35\x7d\xf2\xe4\x63\x87\x00\x87\x65\xe0\xff\xdd\x04\xbf\x67\xe0\x6f\xd5\xe4\x2d\x4c\x14\x13\x4a\xe8\xd0\x24\x5b\x95\x04\x3e\xd0\x58\xff\x7f\x5a\xdb\xbd\xde\xe5\x55\x9b\x58\x25\x9b\x01\x79\x0c\xef\xeb\xa2\x2b\x2a\x93\x4d\x35\xf2\x36\x79\x4c\x82\xc9\x75\x3b\xb0\x30\xa9\xa2\xc7\x0c\x02\x16\x34\x74\xe9\x77\xf0\x18\x4e\x86\x7c\xf3\x3e\x56\x64\x62\xd1\x6e\xa7\x93\xfa\x3e\xff\x0d\xd3\x1c\x59\xd3\xfc\xb7\x3d\x0a\xf1\x28\x57\xdd\xfd\xdb\xed\x6e\x03\x13\x8d\x79\x7d\xc5\xfc\x2a\xdd\xa8\xe8\x07\x89\x08\x34\xdc\x23\x9b\x56\xeb\x72\x8a\xf8\x60\x6f\xcb\x2e\x04\xad\x09\x40\x3a\x68\xe7\xed\x9f\x87\xda\xd8\x47\xb0\x99\x40\x95\xcf\x84\x5a\x24\xdf\x56\x41\x36\x57\xd8\xe4\xa2\x4e\xf7\x5f\x05\x7b\xbb\xb1\x18\x1f\xf0\xca\xa2\x98\x75\x26\x9c\x29\x7d\x37\x6c\x9d\x20\x0e\x77\x14\x66\x75\x60\xaf\x3b\xb8\x0b\x81\x16\x40\xde\xc5\xec\x7f\x6d\xb5\xff\x20\xac\xf6\x0d\x4a\x80\xd1\x3e\xec\x05\xdc\xe3\x60\xb5\x0f\x92\x52\xc8\xe9\x6c\x36\x44\x9f\xcb\x7a\x33\xe0\xb9\x70\xa8\xd6\x7b\x20\x1f\xf1\x2b\xd7\x85\xe0\x80\x14\x19\x3b\x3f\xa7\x59\x0e\xe5\x38\x2a\x9e\x81\xe4\xd5\xe8\x5b\xd6\x5e\x05\x6b\xaf\x82\xcf\xbd\x1c\x34\x5e\xaf\xc6\xda\xc7\xa2\xbc\x14\xeb\x63\x62\xaf\xc6\xfa\x94\xac\x9d\x67\x7e\xaf\xce\x33\x77\xf7\xa8\x5a\x95\xfb\x8d\x68\xe1\x38\x61\x77\xf2\x6c\x81\xfa\x33\x5d\x5b\x00\xea\xde\x7c\x5b\xa0\xf5\x3f\x85\x73\x0b\xcc\x74\x11\xef\x16\x5c\x9a\x65\xdd\x5b\xf2\x22\x2c\xa8\x7c\x67\x49\xe3\x9e\x5f\x28\x99\xe6\x14\xb3\x3d\xe1\xe7\x82\xcb\x40\x33\x28\xe0\x03\x8b\xd6\xcd\x6a\x8b\xd6\x21\xcb\xf2\xe2\x2d\x9f\x42\xbe\xa8\x6c\x4a\x5d\xa7\x00\xc7\xda\x3e\x9d\x26\x89\xeb\x2d\xf0\x9e\x4a\x05\x2c\xcc\x58\x6b\x0c\xcc\x5c\xfd\xd0\xd3\x72\xc4\xc7\x17\x6c\x42\x74\x84\x75\x00\xb8\x1a\xd1\x0c\x87\xab\xf5\xfe\x62\x3a\x20\x9b\x44\x35\x2f\x4b\x2f\xc3\x8c\x85\xf2\xdd\x58\x61\x83\x8e\xc6\xb8\x76\x49\x85\x78\x21\x98\x01\xe3\x4a\x59\x0c\xde\x94\xcc\x77\x05\x3e\xc3\x23\x4a\xce\x5e\x29\x80\xba\x43\x96\xc6\xaf\xde\xbd\xfd\x51\x1c\xf7\x96\xbf\x8c\x4e\x62\x4b\xa8\x6e\x85\x02\xff\xc7\x87\xb7\x3f\xa8\xc7\x9c\x6d\x4c\x5c\x92\x44\xd8\x3e\x17\xa4\xda\xaa\x7e\xfb\xe9\xd3\x05\x5d\xa2\x16\xe9\x66\xed\x1e\xb5\x94\x57\x8a\x91\xbf\xae\xd0\x87\xc8\x0c\x9c\x86\xb9\xb4\xc3\xf6\x07\x80\x5f\xc4\x3f\xf4\xdd\xf4\x01\xb9\xb2\x94\xe5\xd8\x0f\x6b\x61\x6a\x84\x79\xbe\x64\xb2\x27\x45\x8e\x4d\x8b\x31\x57\xd5\xb5\x77\xd7\x97\x39\x47\x8e\x57\xcc\x4c\x6c\xc9\x47\x61\x36\xf9\x13\x1c\xa2\x55\xac\xca\x7c\xb7\x4a\x3d\xfa\x2f\xef\x55\xe6\xa2\x3d\xe6\x9b\xa8\x41\xfc\xad\x2d\xf2\x23\x27\x29\xa5\x31\x3e\xc0\x2c\xf5\xff\xd5\x88\xa6\x5e\xac\x13\x96\x93\x11\x8b\x63\xed\x95\x52\x87\xbf\x26\x5d\xd2\x3d\xa3\x46\x30\xcb\x2f\x8f\xc6\xcd\x6b\x48\xe3\x2f\xe5\x9b\x27\xdf\x2a\x8e\x73\x9e\x5e\xe9\x57\x2c\x06\xce\xb4\xc6\x4f\xaf\x04\xe7\x32\x99\xc0\x0a\x77\x0d\x7f\xab\x58\xe2\xe3\xe3\xf7\x1d\xc2\xd3\x88\x96\xb7\x75\x2c\xe0\x68\x0c\x1a\x70\x81\x0d\xa6\xb1\x82\x83\xfa\x99\x66\xc9\x8d\xd8\x7c\x4a\x58\x51\xef\x13\x66\x2f\x36\xf2\xe7\x80\x5a\x05\x17\xa7\x81\xb0\x94\x15\x2c\x4c\x2c\xe5\xfa\x25\x2a\x40\x95\xd6\x14\xb7\x55\x2a\x49\xec\x86\xc0\x3b\xea\x8a\xe5\xa5\xc0\x3b\x03\x0a\x02\xf5\x14\xb1\x95\xa5\x87\x90\x58\xa5\xbb\x61\xc8\x35\xcb\xbb\xd3\x49\x1c\x16\xf4\x27\xc9\x5d\xb7\x4a\x46\xf6\xa5\x94\x99\xba\x93\x5f\x58\x92\xbc\xa7\x11\x65\x97\x60\xd0\x98\xcf\xda\x0f\x1f\xbe\xe5\xa5\x98\xcd\x69\x71\x2c\x36\xc7\xf2\x4f\xb3\x9f\x21\x30\x78\x8f\x90\x34\x0d\xef\x15\x8b\x7f\x86\xb9\xcd\x81\x27\x08\xd8\x9a\x64\xf4\xf2\x27\xdb\xbd\x45\x39\x9b\xc8\x62\xeb\x55\xf0\xd5\xa1\xed\xf3\x69\x7d\x78\xf4\x88\xcc\xbb\xed\xb8\xf4\xee\xeb\x86\x4b\x97\x0c\x0c\x95\xac\xc9\x8c\x69\x3f\x1a\x85\xe9\x39\xa4\x7d\xb5\x5b\xc5\x1d\x2e\x02\x45\x83\x56\xba\xc9\x3f\xa7\xe3\x79\xce\x9b\x05\xea\x6f\xad\xfd\x2e\xec\x46\xe2\x5d\x93\xb4\xea\xb7\xd0\x1d\x6d\x4d\xb7\xfe\x94\x1c\x76\x85\x6a\xab\xa7\x86\x47\x58\xd3\x1b\x4c\x35\x30\xfb\x19\xa6\xb4\x96\x48\x86\x2f\x59\xce\x06\x2c\x91\xee\x9d\x52\x0a\x63\x25\x99\x2b\xdf\x7b\xf6\xb5\x27\xdb\x9a\xbd\x3d\x4b\x38\x2a\x8b\x7e\x76\xa4\xa3\xb2\x93\x64\x76\x86\x0b\xf3\xc3\x74\x50\x56\x17\x94\x0f\x43\xe3\x07\xe3\xc6\xbc\xa0\xf3\xb2\x1a\xff\xbd\x39\x32\x57\x38\x29\x3f\x7a\x44\x8c\xf4\xc8\xba\x13\xcb\x3e\xcb\x2e\x5e\x23\x8d\xb9\xb3\xef\x72\x85\xf9\x6a\xd9\x87\xf9\x13\xc1\x8c\x78\x7d\x12\xa0\xb5\x54\x20\xae\x69\x24\x25\xfd\x32\x75\x21\xb7\x1d\xaf\x83\x99\xe3\x98\xe5\x45\x3d\x97\x1f\xf5\x9c\x7e\xd1\x0b\x79\x46\xd7\xfa\x46\x57\x01\x81\xa2\xc5\x67\x6e\x5d\x40\xdf\xa3\xd9\x3b\x28\xd2\xd7\xdb\xfa\xa0\x5c\xaf\x3b\xc4\x9d\x6a\x46\x87\x0e\xbd\x19\x7a\x8c\xb3\x5e\x57\x20\x3a\x9e\xb8\x90\xc7\xf4\xc0\x81\xbb\xb5\x7b\x6c\x57\xd1\x1e\x5d\xd4\x96\x7f\xd5\x7a\x7c\x03\xe3\x38\xd3\xe5\x1b\x85\xb3\x15\x3e\xdf\x96\x81\x03\x8a\x05\x1f\xbe\xe3\xb7\x16\xa9\x7b\xee\x2b\x77\x4b\x7c\xb4\xf5\x35\xf9\xe5\xf5\x77\x3f\xbd\x3c\xfa\xdf\xe4\x5f\x2f\xdf\x93\x37\x3f\xfe\xf3\xf5\xd1\x87\x37\xef\x7e\x24\x5f\x6f\x99\xd6\xce\x13\x3e\x08\x13\x88\x36\xff\x35\x79\x45\x0b\x1a\x15\x64\x98\x51\xc1\xb9\x66\xe8\x10\x7b\x86\x20\x67\x60\x47\x42\xc4\xb5\xdb\xfd\x35\xef\x8a\x91\x09\x3a\x26\x60\xff\x0e\x00\xe2\xf6\xc1\x67\xe8\xb9\xfc\x7d\x48\x02\x24\xb6\x60\x3d\x28\x4b\xf5\x5f\x5d\x74\xa7\x81\xc7\xaa\xfc\x53\x7f\xab\xf2\xf7\x31\x3d\x1d\x34\xce\xed\x16\xc4\xef\xad\xa6\xe5\x69\x3d\xd9\x6e\xb7\xdb\xa5\xe5\xbe\x5b\x16\x20\xb1\x1a\x2c\x57\x93\xaa\xec\x76\x77\x5f\x1e\x0d\x96\x1f\xdf\x8c\x07\x3c\xa9\x33\xa5\x7f\x26\x91\x81\xfc\x9c\xd3\x98\x84\xb9\x38\x9f\x34\xa3\x69\x44\x73\x78\xc6\x8a\xcd\xe1\xd3\x9c\x9c\xfd\x08\x8f\xfc\x33\x12\x71\x60\x72\x0a\xb3\x31\x3f\xbe\xfc\x91\x1c\x92\x1e\xd9\x02\x2b\x4f\xdd\x56\xc1\xc9\x18\x52\x0c\x24\x34\x8c\xc5\x35\x1e\xa6\xb1\x78\x9b\xb0\x44\xfc\xb8\x1a\xb1\x82\xe6\x93\x30\xa2\xba\x9d\x8c\x7e\xc8\xd8\x98\x1c\x92\xad\xff\xfb\x9f\xfc\xf1\x6f\xff\xc9\x1f\xff\x75\xeb\xdc\x6b\x31\x46\xbc\x19\x84\x31\xc9\xd9\x79\x4a\x63\x32\xa2\xd7\x61\x4c\x23\x36\x0e\x13\x99\x9a\x51\x3e\x85\xac\x76\xdf\xe4\xdf\x85\xf1\x3f\x20\xc3\xf0\xd6\xff\x3d\xd9\x7c\xfc\xb1\x77\x7d\xd2\xdb\x7c\x1e\x6e\x0e\x3f\x3e\xfe\xeb\x16\xab\xe9\x83\xa5\x61\x76\xd3\xd4\x26\x02\x88\x36\x7b\x83\x93\xde\x76\x43\x5b\x3c\x2a\x1a\x87\xf7\x0e\xbe\x43\x4b\xfc\xa4\xb7\xf9\xcc\x6e\xea\xbb\x29\x4b\x8a\x4d\x96\x92\x31\x2d\x46\x3c\xb6\x37\xe8\x0a\x59\x0b\x12\x92\x98\x4e\x04\x1f\x97\x46\x37\x84\xa7\xe4\x2c\xe3\xbc\x38\x73\x4e\xce\x4f\xd2\x4c\xd5\xb2\x58\x35\x81\xfa\x8e\x78\x7a\x49\x05\xee\x9f\xc1\xd8\xce\xc4\xc8\x95\x6b\x75\x77\x83\x00\xcc\xdf\x30\x29\x2b\xfc\x39\xa6\xe2\xcb\xbb\x21\x39\xc5\x2f\x4c\x3c\x84\x9f\x74\x7b\xdd\x1e\xfc\x8e\xc2\x82\x9e\xf3\xec\x86\xfc\x10\xa6\xe7\x50\x32\x09\xb3\x70\x4c\x3e\x7d\x7d\x8b\x93\x07\x75\x35\xfe\x85\x6f\xe2\x88\xe6\x39\xc4\xfe\xfb\x1b\x52\xe6\x9c\x7c\xc2\xde\x6f\xc9\x7b\x59\x00\x76\xe3\x7a\x44\xe4\x6f\xf4\x3a\x1c\x4f\xc4\xfd\x03\xa3\x3b\xed\x16\x1c\x31\xb4\xb5\xdb\xdd\x11\x34\xfe\x6b\xf1\xd0\x39\xfc\x96\xec\x76\x77\xca\x30\xf8\x4f\xf7\xed\x9b\x1f\x4f\xff\xf5\xf2\x87\x9f\x5f\xdb\x15\xf6\xe8\xe6\xee\xce\x93\x72\x9d\x37\xe9\x50\xbc\xba\x6f\x6c\x58\x55\x56\x86\x0e\x76\xbb\x3b\x41\x79\x1c\x5b\x56\x2c\x07\x05\x0a\x0b\x61\x9c\x65\x25\x69\xc3\xe5\xa9\x70\x92\x97\x77\xd7\x25\x7a\x23\xe1\xb5\x26\xea\xa9\x93\x2e\xdb\xf3\xc0\x7f\x7c\xf9\xa3\x0b\x8c\xe4\xc3\x03\x06\xa3\x6d\xc9\xc2\xda\xe3\xe8\xc2\xff\xbe\x1b\x12\x5f\x0f\xef\x7c\x6d\xb5\x49\xdf\x8c\x8b\xa8\x29\x68\x5a\xd5\xc2\xc8\x2c\xe4\x05\xc1\xbf\xc8\x63\x12\x04\xa2\x0e\xfc\xb2\x87\xe7\xac\xc1\x57\x65\xd3\x6f\x7b\x0d\x80\xac\xf7\xd4\x58\x48\x9f\x3c\x76\x96\x46\x0d\x02\x47\x9a\xd1\x49\x12\x46\xb4\x85\xb4\xa6\x23\xfa\x57\xc6\xea\xcc\x1c\x68\x73\xba\xbb\x05\xcd\xd5\x22\x59\x8c\x43\x4b\x03\x83\x53\xb3\x3c\xc0\x36\x30\xf2\x1e\x2f\x9c\xb3\x87\x9f\xba\x79\xc2\x22\xda\xda\x69\x77\x4c\x97\x2f\xc8\x0e\xe9\x93\x7d\xac\xd4\x27\x2d\x43\xb2\xec\x36\xc9\x0b\xa0\xb5\x6a\x86\x6d\x30\x4f\x2e\xdd\x5e\x0a\xaf\xc4\x2b\xc0\xbb\x76\x56\x9b\xe2\x6d\x45\x4e\xaa\x2f\x27\x93\xef\xc2\xda\x3c\x4f\xbb\x7b\x5f\x38\xcf\x13\x0e\xef\x01\xe4\x79\xda\x5f\x65\x96\xae\xb9\x38\x36\x49\x98\xa1\xfa\xca\xd2\x42\xc1\xab\x21\x77\x23\xfa\x7c\x06\x6f\x65\x77\xe0\x75\x7d\x3c\xab\x81\x6f\xea\xca\x6b\xf9\x61\xfa\x47\xa3\x55\xce\xfd\x79\xae\x82\x25\x4f\x1a\x8e\x6b\xe3\x2b\xed\x54\x80\x36\x35\x6f\xa0\x1c\x3f\xcc\x63\x85\x3d\x95\xfe\x94\x15\xa0\xb3\x7c\x36\x11\xca\x0c\x8e\x27\x3c\x7b\x1b\xa6\x6c\x32\x4d\xc2\x82\xd7\x91\xa5\xed\x9d\xbd\x3f\xb9\xeb\xe6\x12\x43\xfb\x80\x29\xdd\x57\x32\x3c\x68\x6b\x9e\x21\x6a\x72\x53\xa2\x3f\xc6\xaf\x07\x4a\x5a\x20\x3d\x73\x6c\xeb\xe4\xfd\xc0\xb9\x7e\xcd\x13\x2d\x7a\x07\xb1\x6a\x12\x16\xec\x52\x69\x0c\x08\x89\x59\x3e\x49\xc2\x9b\x3e\x09\x86\x09\xbd\xd6\xc5\x61\xc2\xce\xd3\x37\x05\x1d\xe7\x7d\x12\x44\x14\x45\x7b\xf2\xdb\xaf\xd3\xbc\x60\xc3\x9b\x23\x74\x6a\x29\x7f\x17\x0d\x1d\x8f\x32\x96\x5e\xf4\x49\x4f\x15\x82\x33\x56\x9f\x3c\xd1\x05\xe8\xba\x64\x97\x0c\x21\xa7\xe4\x98\x25\x37\x5a\xd9\x7a\x33\xe1\xe7\x59\x38\x19\xdd\x74\xcd\x47\x1b\xfc\x58\x8a\xc8\x3c\xe0\xc9\xf5\x07\xfe\x9e\x8e\x5b\x3b\x3d\x2d\x6c\x19\xf0\x2c\xa6\xd9\xfb\x30\x66\x53\x31\xa5\xbd\xde\xff\xe8\xf1\xaa\x70\x26\x7d\x2d\xf6\x53\x5f\xa6\x39\xcd\x8e\x69\x42\x23\x31\x4b\x70\xf4\x93\xfa\x41\xf8\x07\xce\xdd\x2b\x75\x00\xd4\x62\x47\x98\x66\x17\xc7\x34\x09\x13\x5a\x14\xb4\x3b\x08\xa3\x8b\xf3\x8c\x4f\xd3\xd8\x17\xbe\x99\x2f\x32\x3f\x2f\xea\x0c\xbd\x23\xdd\xa5\xe3\xc9\x28\xcc\xd9\x7f\x41\xa8\x3f\xa3\x65\xd2\xeb\xee\x3c\x6d\xdb\x23\x65\xe3\x73\x33\xc0\x71\x78\xfd\x0b\x6e\x46\xb0\xdd\xb3\x96\xe1\xaa\xaa\x50\xed\x52\x10\x4e\x0b\x1e\x18\x91\x94\x31\xda\xbc\x8b\x9b\x14\xbc\x38\x19\x28\x58\xc4\xcb\x15\xed\xe1\xc0\x8d\x36\xcf\xa2\x33\xc2\x33\xf8\xe3\x98\x16\xe2\x75\x87\x55\x64\xa4\x34\x12\xa6\x24\x4c\x0a\x12\x16\x45\xc6\x06\xd3\x82\x6a\x03\x62\xd4\x0d\xd0\x98\x9c\xb1\xf1\xf9\x59\xd9\xe5\x2a\x14\x9b\x55\x67\x4e\x2b\xc3\x1e\x95\xc6\x58\x70\xd9\x2e\x61\x11\x4f\xc5\xc0\x0a\x7a\xad\xfd\xb9\x72\xc2\x52\x30\x32\x14\xfd\xbf\xbc\x0c\x8b\x30\x93\xb6\xca\x38\x8f\x30\x8d\xc9\x59\x98\x14\x67\xe8\xc9\x8b\xaa\xcb\x94\x83\x43\x32\x04\x96\x17\x00\x29\x97\x23\x16\x5f\xb1\xf6\xc0\x9a\xcd\xe0\x46\xd1\x5a\x6c\x7a\x43\x9a\x50\xcb\x40\x6d\x03\x58\x11\x39\x1e\xb0\x76\x16\xa7\x94\x84\xf2\xfd\x5e\xe5\x71\xd6\xe4\xdf\x24\xe3\x66\x35\xae\xd2\x97\x71\x59\x5b\xb1\xeb\x98\xef\xa9\x65\x9b\x40\xc3\x8b\x5f\x07\x1b\x53\x7a\x4b\xf4\x22\x73\xd0\x0a\x71\x64\x70\x43\x8e\x46\x6c\x02\x9b\xf9\x03\xcb\x0b\x41\x3d\xdf\x44\xf0\x68\x96\xfa\x0c\x83\x1e\x80\x46\xe5\x4d\x39\x52\x9d\x2d\x8a\xa1\xc3\x69\x22\xba\x41\x0e\x12\x6d\x5f\xa1\xc7\xd0\x04\xfb\xd3\x4a\xcc\xdc\xea\x57\xf4\x47\xf3\x3b\x25\xcd\x88\x96\x1a\xf3\x07\xc7\x02\x01\x0e\x81\x3e\xc0\x9c\x17\x68\xf7\x81\xa0\xaf\x19\xbc\xbb\x15\x2a\x83\x5a\x39\xa7\x24\x24\xaf\xde\xbd\xd5\x6a\x50\x2e\x00\xec\x94\x0c\x6a\x74\xaa\x68\x49\x0f\x4b\xbc\xff\xef\x86\xb2\xd0\xc6\x4a\xd1\x16\xc2\x66\xba\x0b\x6a\x18\x68\x7b\xd3\xc5\x7a\x3a\x74\xb0\xc2\xac\x07\xeb\xab\x1c\x17\x05\x57\x2c\x81\x20\x28\x6c\x1c\x9e\x53\xcb\xf5\x70\x7c\x0e\x74\x7c\x61\x37\x8f\x33\x71\x75\xe5\x67\x15\xe4\xba\x86\x4a\x03\xfc\xc2\x18\x25\xc9\xed\xdc\x9d\x64\xd1\x52\x5d\xc0\x85\xb4\x48\x2f\xc7\x74\xd6\x9d\x83\x6e\x14\x9a\xbd\x43\x2a\x61\x07\x22\x15\x57\x6d\x08\x9a\x12\x19\x67\xdb\xb0\x10\xf2\x14\xeb\x4f\xf2\xb7\xf3\x59\x1c\x50\xa9\x26\xb6\x80\x44\xa9\x06\x93\x34\xc8\x85\xf2\x14\xe1\x25\x42\x55\x09\x7d\xe4\xb7\xad\x55\x53\x2e\xb8\x2a\x55\x60\x0a\xbd\x34\x84\x2a\x50\x00\x80\x15\xfa\x2b\xfc\xd2\x9f\xb2\xc8\x7c\xc8\x22\xab\xf8\x98\x16\xf6\x97\x63\xaa\xfb\x5b\x50\xf1\x6d\xc2\x77\x83\xd4\x26\x90\xeb\xac\xff\x14\x33\xf6\x63\x7a\x97\x96\x04\x0a\xd5\xc4\xc5\x0f\x35\x47\xd0\x8a\x8b\x19\xc1\x1f\x59\x24\xff\x39\xa6\x85\xd6\x8e\x3b\x61\x31\xd5\xb8\xad\xa7\xa9\x19\xaa\x1c\x5a\x57\xd0\xd2\x8e\x72\x52\x70\x84\x03\xae\x32\x5d\xc1\xdb\x2c\x6d\xc7\x45\x89\x47\x8f\xc8\x57\x62\x91\xe5\xbf\xc7\xb4\x68\x77\x5c\xdc\xd2\x52\x49\xcb\xa0\x02\x83\x96\x4a\x09\xa9\xdd\x9e\x1d\x4f\xb1\x1a\xab\x4c\x48\x0d\x67\x1c\x5f\x59\x51\x35\x04\x8c\xaf\x06\x65\xf9\xbf\xc2\x84\xc5\x4a\x07\xee\xf4\xe9\x19\x8c\x94\xfa\x6d\x5e\xd3\xaa\x51\xba\x8b\xd4\xf5\xce\x96\x36\x73\xb1\x4d\x4c\x7c\x95\x7d\xc2\x53\x5a\x35\xda\x0e\xf9\xe4\x5c\xae\xe5\xd1\x6a\x1b\x31\x3b\x08\x8b\xd3\x99\xdd\x9e\xa5\x50\x36\x31\x2f\xc4\x8e\xfe\xf6\x9b\x3c\x26\x6a\x79\x9a\x46\xeb\x06\xb2\x64\xe3\xf3\xa0\x33\xcb\x78\x00\x38\x6e\x8b\x5e\x01\xd9\x2d\x9d\xd1\x3e\x71\x0f\xa7\xbc\x01\x9c\x43\x6e\x2d\x87\xc2\x58\x36\x3e\x97\x2f\x1d\x4d\x3e\xda\xc6\x00\x73\x7e\x73\x0d\x87\x44\x61\x7f\x75\xd3\x2a\x0d\x03\x37\xc3\x0d\xe2\x6e\x29\xf6\x51\xe6\x2d\xdf\x05\x76\x4c\x6f\xa5\x44\xa2\xe9\x65\xf7\xc7\x77\xaf\x5e\x9f\xbe\xfe\xf1\x5f\x80\xdf\x7f\x99\x64\x3c\x9e\xc2\x55\xf0\x17\xf2\x42\x7b\x5c\x7d\x9a\x9b\x65\x73\x82\x00\x3c\x1c\x2e\xe8\x2e\xf1\x26\xfc\xfa\x8b\xc6\x9c\xb8\x27\x2e\xcc\x5b\xe9\x79\x5e\x97\xeb\x47\x58\xc5\x23\x6c\xf1\x47\xd0\xc6\xed\xac\x9b\x0d\xbd\x0b\xad\x7b\xba\xf1\xcc\xb4\x17\x69\x4e\x5e\xe5\x8d\x03\x9c\xbb\x41\x8b\x1d\xf8\xa3\x3d\x52\xe6\x5d\x03\x8b\x0b\x5a\xc9\x26\x29\x4e\x6a\x25\x1b\x84\xdc\xd8\xaa\x9a\x12\x1c\xdd\xec\xd6\x04\x7c\x9b\xf4\xc9\xa7\xdb\x03\x75\x75\x54\x58\x73\x59\x84\x1d\x82\x4a\xc3\x33\xa2\xc1\xb8\x4a\xea\x17\xcc\xb0\x50\x8e\x2c\x58\x8d\x14\x4e\x5c\xf0\x76\xca\xb0\xbb\x80\xdc\xb6\x5b\xf8\x67\xbb\x51\xf7\x36\x8f\x45\xd1\x6e\x95\x41\xd1\xd3\x2f\xa9\x1b\x6c\x48\xf4\xe1\x28\xec\x88\x32\xbf\xea\x86\x79\xce\xce\xc1\xd3\xd6\x78\xd3\xa0\xe1\x66\x9b\x7c\x32\xae\xde\x8c\x1c\x92\xed\x03\xc2\xc8\x37\x25\x77\xef\x03\xc2\xc0\x81\x1b\x4d\x5c\xf9\x34\x83\x70\xa4\xc6\x75\x9b\x7d\x3c\x30\xed\x5c\xd0\x1b\xc2\x52\x09\x26\x2a\x09\x76\x4d\x0e\x65\xa2\xfc\xab\xbb\xa3\x30\x7f\x77\x95\x2a\x7c\xc3\x9d\xc0\x2a\x1d\xd1\x82\xe0\x78\xa5\x75\xe9\x89\xf4\x14\xc7\xaf\xf0\xeb\x80\xdc\xc2\xff\x49\x2e\x09\xe1\x0e\xc8\xed\xe7\xc8\x3f\x72\x7f\x6a\x3d\x88\x02\xfe\x36\x9c\x4c\xa4\x19\x76\x95\xde\x72\xaf\xf7\x79\x73\xa0\xd4\xbd\x2e\x45\x17\xb0\x51\xb9\x42\x0b\xdc\x04\x71\xbc\x6f\x0f\x6c\xa4\x62\x30\x00\x85\x07\xa2\x46\x97\xa5\x31\xbd\x7e\x37\x6c\xb1\x36\xf9\xf6\x90\xf4\xda\x10\x66\x8c\xa5\x53\x7a\x80\x96\xd0\x73\x21\x0b\x0c\x80\xb5\xed\xca\x12\x5f\x98\xc0\x16\x3e\xf8\x15\xd0\xb2\x8c\x24\xf6\xec\xdc\x98\x08\x2d\xe5\x52\xd0\x21\x96\xc7\x94\x1a\xfa\x57\xfa\xb3\xed\x7a\x60\x03\x02\xce\x8e\x32\x7e\x05\x09\x35\x04\xc6\x60\x52\x8d\xbf\x1c\x85\x69\xca\x0b\x22\xc6\x4d\x42\xe4\x84\x49\x98\x93\x50\x1f\xc8\xbf\xb4\x01\xa5\xed\xa1\xd5\xfa\x6e\xb5\x72\x9a\x0c\x3b\xd0\x98\x1e\x9a\x28\x72\x7b\x7f\xaf\x0c\xd7\xe4\x10\x20\xd6\xc0\x28\xcc\x31\x9c\x28\xf8\x1c\x81\x53\x13\xcb\x69\x4c\x36\x49\x3e\x9d\x80\x5f\x82\x0d\x21\x7a\xa0\x31\x0e\x4d\x2e\x22\xcc\xe0\xd1\x23\x6d\x33\x04\xbf\xc5\x05\xfe\x17\xc4\x93\xbf\x08\x2a\x53\xfa\x66\x66\x49\x5e\x60\x71\x9f\x88\x11\x7b\x9b\xa1\x02\x63\xb4\xf2\xe9\x00\x78\xa9\x0e\x0e\x0b\xfe\x56\x53\x95\x8d\x9b\x0f\xf8\xee\xd0\x5d\x88\xd1\x79\x1f\x65\xda\x99\xea\xad\x39\x16\xb0\x82\x68\x67\x34\x87\x64\x2f\x90\xed\x84\xa2\xe8\x76\x40\xa1\x32\x0a\x69\x55\x17\x1d\xd0\x80\xfc\x85\x3c\x26\xa5\xb1\xc0\x52\xa9\xd1\x1b\xfc\x35\xa4\x58\x3a\x80\x5a\x03\x74\x86\x6b\xaa\xc0\x1b\xda\xec\x7c\x1f\x0e\x19\xd8\x78\x98\xc5\xb1\x2d\x6f\xc0\x03\xab\x43\xae\x32\x56\x58\xa6\x38\x26\x62\x83\x2e\x13\x68\xd6\xc6\x73\x66\x2f\xae\x1c\x5f\xee\x46\x76\x7f\x51\x5d\x5e\xb3\x41\x66\x6c\x56\x70\x8d\x43\x0b\x44\x6b\xd9\x2f\x55\xfc\x50\xd9\xbc\xfc\xed\xdc\x50\x48\x34\xcc\x53\x58\x82\x0a\x02\x02\xdf\xba\xe3\x70\x62\x45\xab\xb8\xf0\x2c\x8c\xc4\xf9\xbf\x80\x70\x22\xb7\x6d\xa3\xf3\xb3\x2f\x06\x47\xa1\x77\xf6\x8d\x97\x50\xe8\xdb\x33\xa9\xc2\x12\xc7\xf4\xec\x9b\x98\x5d\x7e\x7b\x66\xeb\xb2\x20\x9a\x0f\x64\x1a\x42\xa7\x2f\x71\xbe\x94\xf2\x6b\x14\x5e\x32\x9e\x09\x68\x54\xfa\x81\x3d\x2e\x39\xd3\x3c\x0f\xaa\xd3\x2a\x65\xfd\x55\x99\x4a\xc2\x14\x54\xc7\x76\x8c\x46\x5a\x10\x3e\x74\x06\xfd\xed\x99\xa5\x28\xe9\x90\x62\x14\x16\x24\xcc\x28\x29\xf8\xf9\x79\x02\x4a\xc5\x14\xf5\x79\x60\xc2\x0a\x16\x9e\x37\xd8\x5c\x42\xc3\x4b\xda\x45\x41\x70\xc5\x2a\x80\xce\x8f\xa5\x60\xfe\x8c\x91\x8b\x58\x64\x7b\x3d\x4a\xe1\x62\x2e\xd5\x9c\x19\x45\x7b\x55\x50\x1e\x4d\x32\x1a\x82\x56\x67\x0c\x87\x6f\x7a\x3e\x12\x88\x77\xc3\xa7\x30\xb4\xab\x4c\xde\x75\x7e\xd7\xdf\x9e\x91\x50\x2e\x26\x28\x55\xf9\x34\x23\x67\xdf\x7c\x1f\xc6\xf4\xdb\x33\x22\x4d\x51\x2b\x15\x83\x15\x8b\x97\xf2\x98\xba\xc2\xf0\x97\xe2\x54\x5c\xd2\x94\x09\xea\x08\xc3\xc7\xd5\xc2\x0c\x58\xb9\x38\xec\x31\xcb\x21\x1b\x96\x4a\x12\x69\x92\x47\x61\x13\x2a\x50\x93\xea\xba\x4b\x7e\xe4\xe0\x2d\x18\xaa\x35\xba\xc1\x79\x31\xa9\x33\xe5\x97\x34\xcb\x50\xfb\xab\x51\x28\x17\xdb\x88\xed\xf1\xd4\x8a\xf1\x64\xa4\x58\x1f\x2c\xb7\x04\xa3\x06\x96\x9e\x22\x55\x93\x1d\x70\x9e\x74\x96\x9d\x2b\xc6\x6f\x7c\x48\x53\x6d\x48\x1b\xe4\xcd\x74\xd1\xa9\x3a\x11\x2a\x73\xd9\xc2\x6a\xa7\x3a\xff\x5c\xe5\x64\x6b\x73\x1a\xe1\x5c\xed\x6d\x55\x91\xc4\x94\xb7\x2a\xc4\x24\x22\xc0\x4d\xb2\x4b\x2a\xfd\x2f\x73\x34\x2c\x47\xb5\x6f\x98\x13\x06\x0e\xd3\x14\xc3\xe0\x75\x2d\x35\x3c\xcb\xc9\x39\x4d\x69\x06\xe1\xc5\x62\x9e\x52\x41\xb9\x30\x25\xfc\x99\x2d\xe4\x3d\x23\x23\x7e\x45\x2f\x69\x26\x78\x3a\xd0\xc4\x85\x39\x68\x97\xc3\x54\x35\x8b\xad\x62\x97\x10\x13\x54\x8a\x5d\x46\x82\xdb\x49\x04\x35\xb8\x41\xde\x02\xf3\xde\x28\x03\x82\x82\x84\x91\x78\xe0\x08\x7e\x47\x69\xff\xc4\xed\x27\xee\x37\xdb\x6a\xe0\x0d\x12\x8f\x98\xfb\x7e\xba\xee\x34\x81\xa2\xe5\x00\x2a\x28\xb4\xb6\xbc\x20\x67\x00\xf5\x7d\x28\xae\xd4\x9b\x33\x6c\xb3\xe0\x40\x88\x88\x98\xd8\x0d\x36\xd3\x11\x3f\x70\x8a\x3c\x15\xeb\xa8\x88\xa9\x74\x09\xb2\x87\xf4\x37\xb8\xe0\xbf\x57\x2f\x35\xa8\xdf\xc7\x74\x71\xda\x23\x75\xf3\x5b\xa7\xc0\xa5\x5c\x72\x34\xd5\x5b\x2f\xee\x37\x7d\x79\xcd\xf1\x8c\xee\x94\x5a\x35\xbe\xc0\x56\x31\x0e\xd3\xbb\x31\xa1\xec\x40\x39\x3a\x29\x6f\x85\x0f\x35\xd7\x82\xd1\x81\x8f\xc3\x34\x3c\xa7\xe2\x9a\x9c\x75\x2d\x89\xf6\x58\x4a\x42\x92\xb0\xbc\xe8\x92\x1f\xd8\x05\x45\x02\x5f\x71\x01\x18\x1d\x5b\x55\xf7\x1d\x81\xb4\xa1\x68\x0f\xc3\x67\x8d\xc3\x68\xc4\x52\xd4\x68\xc2\x78\xd4\xb5\x02\x2e\xcf\xca\x1f\x66\x9a\xea\x9f\x82\x3f\xd5\xe3\x82\x83\x2c\x1a\x2b\xd8\x98\x2a\x17\x0c\xc1\x77\xb3\x98\xa2\x86\x54\x5e\x3a\x64\x40\x13\x7e\x25\xcf\x06\x0c\x5a\x5c\x4a\x67\xe4\xe8\xf8\xd8\xbe\x12\xc1\xa3\x6a\x40\x87\x3c\x83\xd6\xc8\x4b\x81\x95\x74\x9c\x03\x0e\x29\xcc\x17\xc4\x26\x8e\x8d\xb6\xfb\x03\x8f\xf9\x0f\x2c\x2f\xa4\x46\x36\x45\x26\x41\xcc\x53\x5e\xe1\xa2\xa5\x70\x5a\x70\x41\xb4\x22\x38\xab\x83\x9b\xba\x5b\xdb\xb0\x27\xd3\x9c\x92\xd3\x30\xbd\x39\xf5\x16\x58\xb4\x66\x45\x52\x48\x81\xcb\xa9\x58\x67\x71\x38\xc1\x22\x27\x42\xa7\x11\x51\xef\xec\xec\xec\xd7\xfc\x1a\x76\x73\x3c\xe1\x99\x9d\x43\x02\xea\xe1\x02\x04\x98\x15\xd1\xcf\x85\xb8\xe5\x01\x07\x07\xb2\x55\x7c\x16\xe9\x65\x50\x62\x0c\xcc\xbc\x68\xf2\x55\x7c\x12\xb0\xc4\x66\x8e\x2d\x6d\xf3\xd7\xa8\x81\x81\xc7\x0c\x96\xaa\x32\x37\x14\x1b\x43\x03\xc1\x93\x60\x44\x93\x84\x07\x1d\x12\x5c\xf1\x2c\x89\x51\x23\xca\xa2\x0b\xf1\xc7\x98\x06\x1f\x6f\xb1\xba\xfc\x07\xdd\x37\x5f\xc6\x71\xcb\xea\x0c\x06\x22\x5e\x15\x60\x74\xa8\x7c\xb5\xd1\x6d\x17\xba\x51\xe1\xe1\x4e\x54\x0d\x22\x76\x76\x3c\x29\x5a\x01\x3a\x66\xe7\x7c\x4c\xc1\x2c\x2b\xd0\xa3\xfd\x88\xce\x2c\xa4\x1c\x7f\x81\xc8\xa1\xeb\x0e\x6f\x15\xa8\x33\xc8\xf7\x80\x65\xe2\x85\xad\x07\x9a\xd0\xe6\x61\xa2\xa7\x84\xe9\x58\xc1\x42\xf8\xfe\x88\xb6\x58\x87\x6c\xd7\x0e\xcb\x1b\x95\x3f\x28\xdb\xef\x1d\xeb\x2b\xdf\x0e\xb3\x28\xc0\x63\x9b\x9f\x84\x7c\x33\x98\x16\x05\x4f\x09\x4f\x8f\xc4\x9e\x1c\x7e\x6a\xb5\xc9\xe1\xb7\xb6\x27\x2d\x6c\xc5\xed\xb7\x2f\xe3\x98\x88\x6e\xbf\xd9\xc2\x1a\x6e\x2b\x3e\x52\xdb\x1f\x09\xf9\x54\x5a\x07\xf1\xae\x68\x89\x3f\x3b\x84\x41\x87\x2d\xb7\x06\x21\xc0\x8a\x5a\xf1\x5c\x2e\xe8\xcd\x21\xac\xc0\xed\xb7\x3e\x68\xc5\xb4\x74\xcf\x50\xe3\x53\x40\x82\xdb\xaa\xcf\xb3\x67\xaf\xf7\xb8\xaa\x5b\x5c\x63\x01\x50\xd9\x78\xd5\x4a\xa9\x4f\x55\x03\xfe\x66\xcb\x9d\xb3\x07\xd0\x6e\x3b\x73\xf8\xc6\x3f\xe4\x16\xb8\xdb\xbe\x83\x27\xb7\x92\xb8\x48\x82\x60\xb8\xaf\xaa\x0b\x88\xc4\x9c\xe6\x40\x9e\x50\x74\x0d\x4c\x98\xe6\xe9\xf4\x2b\xec\x2b\xd1\xd2\xeb\xeb\x30\x2a\x92\x1b\x72\x3a\xe2\x57\xa7\xf2\xfe\x81\x83\x24\x2b\x50\x60\x82\xa6\x13\x45\x8b\x2d\xae\xad\x81\x6a\xe6\x5d\xe4\x9f\xc6\x34\x4c\x0d\xb7\x31\x66\xd7\x70\xd9\xa0\x3b\xa6\x9d\x76\x36\xca\x78\x9e\x93\x98\x0d\x41\x32\x53\x88\xb6\xf4\x40\x80\xb6\x6e\xe1\x3d\xef\x53\xd3\xd9\x71\x45\x8d\xe8\xc4\xab\x3b\x33\xa6\xa8\x07\xaf\x4c\x45\x20\xee\xff\xb5\xd6\xab\xfb\x72\x32\x0c\x19\xe4\xd5\x55\xe1\x0c\xb6\xb6\xc8\x1b\x19\x30\x47\xb3\xbc\xf9\x88\x4f\x05\x7b\x86\x91\x6f\x94\x27\x76\x47\x7b\x52\x16\x82\x57\xc6\x97\x8d\x76\x8d\x53\x51\x3e\x1b\x24\x61\x32\x74\x91\x37\x45\x94\x0f\xe2\x37\x6f\x3e\x6a\x8c\x33\x62\x4d\x5d\xd0\x1b\x0c\x74\xd5\xd1\x19\x73\xfe\x01\xb0\x99\x6b\x88\x11\x4d\x33\xb1\x93\x9e\xe0\x16\x94\x16\x76\x19\x24\x91\xb1\x7e\xb7\x9d\x80\x4f\x6a\x91\xdc\x70\x10\x52\x8a\x5e\xd1\x43\x5b\xc7\xb7\xb4\xc0\x4b\xc3\xf4\x0a\xbc\xc0\x8f\xa7\x2e\xf9\x36\x33\x07\x42\x68\x47\x0b\xf0\xcc\x62\x94\x76\x41\x46\xb2\x10\x54\xb3\x3c\x7e\x42\x62\x9a\xd0\x82\xea\x8a\x27\x26\xb4\x2b\x31\xb4\xff\x93\xf5\x74\xd7\x5d\xdc\xea\xc8\x15\xca\x46\xc4\xd9\x32\x3f\x98\xaa\x69\x61\x8e\x55\xf7\x4c\xc3\xac\x0d\x77\xf8\x61\x35\x6d\x2b\x90\x89\x86\x74\xa3\x6f\x39\x51\x15\xca\x38\x85\xcd\x76\x2d\x6c\xc2\x02\x2f\xd0\x97\x59\x98\x5b\x6b\x09\xd5\x05\xa9\x83\xe4\x38\x06\x37\xd2\xaa\xc7\x8d\xfe\x60\xa2\x4d\x54\x45\x5c\x61\x69\x39\xbc\x84\x16\x26\xc0\xd8\x65\xfa\x21\xd5\x74\x80\x5f\x03\x27\xee\x83\x0e\xb1\x50\x55\x01\xdd\x29\x5c\x78\x19\x61\xa1\x12\xfc\x9a\x01\xcf\x43\xdc\x1d\x17\x7f\xa9\xad\xb7\x56\xe2\x14\xc3\xe3\x48\x03\x19\x8f\xf8\x58\xca\x02\xb5\xed\x47\x78\xe6\xed\xdd\xf3\x3e\xf9\x5e\x89\x3a\x2e\x52\xe6\xe5\x16\xff\x44\x58\xfe\x56\x3e\x1d\xfa\x32\x86\x14\x2e\x0e\x8d\x55\x24\x20\x99\xe1\x1a\xe8\x9f\x60\xba\x75\x02\x95\x21\x3b\x27\xd3\x34\xa1\xb9\x78\x7c\x0b\x56\x4a\xdc\x44\xe2\xa9\x24\xd9\x77\xe8\x63\x63\xe6\x9c\xa4\x05\xa2\x3d\x17\x7b\x31\x27\x96\x69\x9a\x92\x74\xe6\x15\x91\x9b\xc9\xb7\x64\x87\x3c\x7a\x64\x29\xef\x76\x30\x3d\xb8\xf6\x10\x24\x2f\xdc\x8f\x7d\x2b\xfa\xd0\x81\x13\x98\x19\x8a\x4e\xc4\xff\x8a\x26\x50\x54\xfe\xc2\x29\xed\xdb\x18\x8f\x65\x72\x9d\x1a\xa7\x5b\x8a\x13\x67\x4f\xbc\x3e\x88\x9c\xbb\x2f\x4a\x2b\xba\x40\x77\x7e\x18\xb4\xca\x6e\x4b\xb1\xd2\x52\x7a\x5d\x38\xa1\xc9\xea\x82\x3a\xe1\xbe\xd0\x4b\xef\xbe\xb0\x38\x50\x45\x9b\x0e\x34\xbc\x68\x7c\xf1\xfb\x45\x0f\xa9\x44\x9d\x3d\x7a\x5e\x6e\x6b\x4c\xb3\x73\x6a\x97\xe4\xed\x96\x3f\xe8\x4e\x69\x58\xaa\x79\x5b\x4a\xaf\xbb\xee\x0e\x79\xf6\x3a\x8c\x46\x2d\xe7\x86\xf5\xae\x52\x38\x2e\x87\xfe\x95\x61\x5d\x71\x5f\x59\xa4\xd0\xb5\x95\x94\xc4\xb0\x5d\xba\x19\x17\xa6\xe2\x32\x2a\xce\x1d\x88\xf8\xad\xd3\xf9\x28\xcc\x7f\xca\xe8\x25\x39\x54\x5a\x71\x7f\x25\x0f\x5c\xe0\x1f\x91\x60\x49\x60\x7f\x91\x9d\xa6\x75\x4b\x60\x8f\xe7\xb6\xea\xdc\xb7\xe8\x6e\xff\x03\x8a\xae\x9c\xb0\x6b\xa5\x65\xd4\xed\xb4\xc1\x5a\x56\xff\xd4\x61\xa9\xf4\x08\xb6\xb6\x90\x7f\x66\x39\x28\xd4\x5a\x8a\xa5\x6b\x5b\x1b\xa6\xe6\xf3\xe8\x11\x69\x7d\xa5\x56\xe2\xb7\xdf\xcc\x60\xda\x5e\xfc\x3d\xf1\x94\xe6\x09\xed\x26\xfc\xbc\x15\x50\x13\x8a\x4b\x20\x8b\x86\x73\x10\xc4\x9d\xce\x3d\x5c\x90\xd6\xf5\xb5\x53\x7d\x7f\xe1\x59\xc0\xf3\x5f\x77\x51\x56\x54\x95\x31\xc7\x4c\xdd\xaa\x6b\xb0\xbc\xd8\x3c\x89\x49\x4b\x0a\x5b\x55\x15\x6d\x13\xfb\x95\xb5\xe2\x6a\xbd\xc5\x3e\x9a\x05\x77\x56\xc3\x5f\x71\x29\xdd\xf4\x17\x7c\x89\x25\x87\xa5\x04\x95\xa4\x35\x1b\x3b\x9a\x94\x9a\x91\x54\x37\xa3\x0e\x2d\xb6\x65\x68\x40\x0f\x73\x17\x3b\x26\x37\x20\xa9\x83\x5b\x33\x09\xf3\xa2\xa4\x86\x32\x5d\xe9\x35\xa9\x5e\x92\xb9\xce\x80\x1f\x34\xcb\x5f\xaf\x69\x2a\xc7\x5d\x5e\xb1\xbb\xa1\xe9\x6c\x54\x55\xe8\x5a\x3e\xa1\x3e\xd4\xf2\x08\x7c\x27\x24\x76\x11\xd9\x6c\xfe\xad\xba\x28\x7c\xb1\x56\xd5\x53\xa0\x3d\xcf\xe5\x2d\xdd\x1b\x0f\x6b\x83\x2c\xce\x0c\xa4\x68\x64\x8b\x26\x8e\xa2\xef\xe1\xe1\x8a\xd5\xbd\x80\x8b\xb2\xd4\xc0\xea\x88\xf6\x75\xd6\x33\x56\x28\x42\xdb\xa5\xc2\x6e\x0d\x9d\x27\x48\xf9\xca\xae\x64\x17\x10\x52\x3e\xbb\xa4\xa3\x0d\x30\x42\x07\xe5\x0f\xb0\x6d\x55\xe5\xd7\xac\x38\xf0\x33\x6f\xcc\x8e\xd2\x77\xe4\xaf\x95\xb3\xbc\xa8\xda\xb7\x78\x81\x71\x28\x11\x48\xce\x13\x71\xc6\xda\x6a\xd9\xb7\xb7\xe3\x33\x03\xc7\xf9\x18\x12\x59\x8c\xbe\xad\xf2\x2f\x31\xf7\x55\x7a\x97\x92\x31\x3a\xba\x39\x55\x60\xe1\xc2\x36\xf1\xa6\x0e\xda\x48\xfa\x6d\x7a\x5a\x1e\xfb\x67\xa5\x89\x64\x69\x9d\x4a\x31\x6a\xe4\x5f\x27\x3a\x70\xcb\xc7\xfb\x31\x8b\x7c\xf6\x10\x03\xde\x7c\x87\x52\xd4\x3a\x73\xba\x27\x5f\x38\xe0\x0d\x0e\xef\x21\x04\xbc\xd9\xff\x83\x07\xbc\xf9\xfc\x31\x69\xee\x35\xc4\xce\x3a\xe0\xcd\xef\x2b\xe0\xcd\x67\x89\x5e\xb3\xf2\xf8\x2b\x61\x1c\x5b\x29\x24\xf2\x49\x18\xb1\xf4\xbc\x3b\x4d\x59\x41\xbe\x26\x3b\xea\x8e\x0f\x1e\xf5\x05\x3b\xbe\x09\x57\x6e\xd0\xb7\x78\x59\xd9\xc0\x77\xbc\x28\xf8\xb8\xa6\x99\x5d\xe7\xb5\xb3\xda\x20\x1d\xbf\x83\xf0\x02\x9e\x03\xf5\x51\x98\xc5\x32\x40\x8d\xef\x45\x3d\xaf\xbb\x74\xbd\xab\xf4\xb2\x7e\xc3\x95\x0e\xc3\xca\xb9\x77\x2e\x5e\x11\xad\x53\xe6\xf2\x4c\x9c\xd7\x39\xd8\x38\xab\x1a\x17\x46\xf4\x58\xb4\xd6\xf0\xf3\xbb\x2d\xfe\x1e\xbc\xbb\x6c\x1f\x9d\xbb\x3a\xdd\x58\x8b\x0d\x9e\x37\xd6\xef\x7b\x72\xbf\x79\xbe\x52\x3e\x73\xa6\x3f\x8d\x7c\xa4\xb2\xa8\xee\x6a\x7d\x6a\x98\x06\x0d\xdb\x74\x31\x68\xa0\xcf\x77\x2f\xd0\xe2\x15\xc6\xc6\x90\xf4\xc1\x4e\xb3\x6f\x7d\x69\xc5\xe6\x6f\xe7\x72\x00\x94\x30\x93\x33\x18\x11\x58\x35\x82\x0e\xb1\xeb\x1f\xd4\xf8\x74\xb9\x5d\x96\xa2\x63\x3f\xef\xfd\xae\x19\x51\xc4\x03\x37\x95\x64\x0d\xe2\xec\xd7\x80\x37\xe1\x8e\x0b\xe9\x72\x3d\x5a\x3f\x5f\xc7\x04\x3e\xaf\x81\x6f\xe2\xfd\xbc\x96\x4d\x0b\x26\x39\x50\x5d\x77\xdb\xbd\x2a\xe8\xc6\xce\xac\x46\x8d\x8b\x56\x9d\xfa\xbf\xb6\xdf\xed\xd9\x75\x9b\x46\x51\xdf\xa1\x6e\x57\xd9\x5b\xd4\x0e\xa1\x0c\xda\xd4\xa3\x6e\xee\x7e\x1d\xcc\x54\xae\x95\x3a\x26\xfa\xb9\x0b\xe9\xa4\x7f\xa8\x7b\xc4\xec\x36\xd4\x99\x39\x32\x07\xfa\xa1\xc5\x78\xfc\x11\x53\x85\xde\x2d\x82\x22\x34\x32\x4f\xe8\x44\x96\xbf\xa2\x79\x44\xd3\x38\x74\xb5\x9d\x76\x79\x8b\x26\x1d\xa2\x3d\x37\x55\xf4\x66\xf4\xbb\x53\x8e\x4e\x10\x7d\x04\x8a\xba\x93\x30\xa3\x69\xf1\xa3\xa5\xe2\x92\xeb\x46\xd1\x2f\x4b\xd6\x04\x8d\x4c\x65\x27\x76\x0b\x2a\xc2\xb3\x6c\x02\x84\xfb\x77\x62\xd3\x8d\xc0\x77\x31\xd7\x71\xdc\x96\x25\x7d\xc6\x21\xcd\xc1\x32\xb1\x1c\xfc\x8a\x73\x07\x71\x80\xe1\xae\xc6\x3d\x1d\xf6\xc1\x0b\xdb\x20\xad\x03\x5f\x5e\x85\x37\xb5\x9d\x88\x75\xf2\x45\x99\xd2\xba\x1b\xcf\x1e\x98\x4d\x83\xdd\x2b\x18\xbe\x17\x96\xc5\x7b\x91\xb1\xf3\x73\x88\xe3\xc7\xa7\x05\x84\x0a\x54\xd1\xe4\xb4\xd0\x5c\xbb\x4b\x6c\xa8\x10\xf8\x7a\x48\x16\xf1\x58\x36\x35\x76\xa9\xad\x99\x26\x6d\xa5\x1a\xf7\x96\x32\xbb\xd4\xd3\x9f\x22\x7d\x76\x69\xd6\x8b\xa4\xd2\x2e\x2f\xd9\xb2\x69\xb5\x65\xe6\x3f\x81\x5a\xe8\xfb\x68\xdb\x5f\xe9\x6e\x1c\xcc\x03\xe4\x76\x32\x0e\xbe\x81\x37\xbb\x83\xf5\xa3\xf0\x92\xa2\x8f\xca\x19\x14\x77\x27\x19\xfc\xab\xae\xa0\xf6\x19\x19\x87\xd9\x05\x8d\xed\x6c\x82\x08\xa9\x65\xf5\xf0\xd3\x4d\xe1\x58\x93\x93\x5a\x8c\xe1\xf5\xf6\x36\xc9\xa7\x13\xc1\x62\x76\xc8\xd5\x88\x45\x23\x75\xec\xe0\xa4\xf9\x33\x02\xdf\x94\x70\x58\xc8\xcf\xd3\x74\xc0\x74\xc2\x39\x93\x4c\x52\x2e\x8f\x6f\xd3\x26\x48\xff\xcc\xec\xd7\xb6\x25\x9f\x99\x9d\xbc\x2e\xaa\xd3\xae\x89\x6b\x27\xe6\x11\xe0\x62\x57\xfd\x31\xc7\x37\xb1\xc9\x45\xc8\xd2\xdc\xe9\xa4\x2d\xd5\xd6\xde\xad\xe4\x80\x54\x19\xdf\x29\x9b\x0c\xbd\x58\x72\xcb\xcb\x2a\xe8\xcf\x97\x2f\xb3\x82\x80\xad\x3c\x77\xa6\x77\x20\x94\xdd\xd3\xe7\x48\x1f\xe8\x1d\xc3\xda\x6e\x17\x4b\x8b\x77\x2f\xd9\xca\x2c\x74\xd1\x79\xcb\x14\x3a\x06\x6e\x06\xbb\xb7\x7c\x9a\xd3\xe9\xc4\x49\xdb\xa5\x37\xd2\x05\xfd\xc0\xa7\xd1\x88\xa6\x71\x35\xac\x41\x3c\x53\xab\xc2\xf6\x57\x7e\xab\xcd\x9d\x55\x42\xa2\x99\xea\xd0\x32\x95\x5e\x46\x12\xb6\x66\xd4\xbe\x28\xa3\x56\x2b\xa2\xab\xc0\x87\x7b\x90\xb4\x3d\xdf\x7e\x88\x1a\xdd\xef\x79\x36\x56\x8e\x11\xd5\xcf\xd8\x9d\x79\x94\xba\xba\x99\xfb\x50\xeb\xea\xc6\xab\x34\xbb\x7a\x16\x3f\x08\x74\xaa\x93\x2a\xee\xef\xce\x3b\x0b\x68\xe6\xbe\x66\x01\x8d\x37\xce\xe2\x88\xa7\x45\x56\x9b\xf3\x6c\xe7\xf9\xdc\xf3\x90\x0d\xdd\xd7\x4c\x64\xf3\x8d\x73\xf9\x07\x4d\x26\x34\xfb\x80\x56\x98\xd5\xd3\x99\xcb\x62\xc0\x6d\xeb\xbe\x66\x64\x7a\x98\x67\x83\x9a\xb1\x6d\xae\xcc\x3f\x7e\x6b\xf7\xbc\x55\xb5\xb8\xf7\x99\x6d\x23\x9e\xdf\x2d\x61\xe3\x97\x16\x49\xaf\x93\x01\xad\x6d\x23\xd6\xb6\x11\x0f\x52\xea\x5b\x6f\xb0\x01\xca\x37\xcb\x18\xa3\x32\xdd\x8d\xf8\xf3\x95\x95\x17\x37\xe2\xc9\x74\x9c\x5a\x1f\x7f\xc9\xc2\x49\x9f\x04\x57\x59\x38\x09\x36\xe4\x23\x24\xe3\x57\xaa\x51\xbf\x7e\xc6\xaf\x02\x1d\x00\xe2\xae\xe6\x17\x98\x29\x01\x14\xc1\x25\xa1\x61\x55\xf4\x9e\xcf\xfc\xba\x58\x25\xaf\xff\xfb\x4f\x6b\x21\x35\xb2\x04\x42\x34\x88\xed\xb2\x32\xc4\xc8\x04\x15\x82\x76\x65\xfc\xca\x8c\x16\x10\xa9\xa6\x8f\x01\xe7\x09\x5a\xb6\x48\x49\xf3\x99\x66\x89\xcf\x20\xde\x4a\x0e\xb8\x91\xf1\x24\x27\xf9\x34\x1a\x91\x30\x27\x67\x20\x65\x1d\xf0\x6b\x99\x78\xe6\xf8\x8a\x15\xd1\xe8\x0c\x42\x68\xbc\x29\x54\x18\x97\xdc\x1e\x0c\x49\xc2\x1b\x3e\x2d\x00\xe4\x7b\x95\xcd\xe0\x7d\x18\x33\x7e\xd6\x01\x8f\x6c\xe9\x78\x0c\xf9\x6a\x74\xd0\x0e\x00\x90\x63\xb1\x63\x60\xe4\x05\x0d\x63\xc4\x55\x96\x13\x9e\xd2\xae\x9b\x44\x54\x4f\x61\xf5\x96\x39\x96\x7d\x77\x75\x02\x03\x31\x59\xf5\x2d\xe3\x57\xf7\x62\xd1\xe3\xa5\x00\x10\xd4\x40\x1a\xa1\x8b\x49\x0a\x6a\x34\x67\xc0\xf9\x25\x83\xf8\x8b\x79\x89\x89\xda\xf1\xf9\xdb\x07\x8b\x85\x43\xd7\x61\x70\xe6\x0b\x83\xee\x4e\x6a\x56\x28\x74\x8d\x00\x5f\x28\x1a\xfa\x1f\x81\x56\xfe\x1e\xec\xa3\xe6\x6a\x50\x1c\x8f\xda\xa6\x04\xfd\xf3\x0c\xad\x0c\xf2\x54\x04\x72\x02\x5a\x0a\x12\xd4\x95\x44\x42\x36\xc2\x0d\x72\xdb\x6e\x19\x69\xc4\xfd\x88\x89\xee\x96\x60\x7d\xe5\x62\xa2\xf5\x7b\xe7\x4b\xbe\x77\xd6\xa6\x4f\x6b\xd3\xa7\x87\x67\xfa\x74\xef\x11\xc1\xff\x00\xcf\x70\xa8\xf8\x26\x9d\x4c\x6b\x57\x7f\x7f\xcf\x5d\x7f\x14\x40\xd6\x8d\xe6\xd9\xfe\x9f\xfb\x71\xff\x27\x4c\xd8\x6b\xa4\x14\x2c\x4d\x58\x4a\x37\x9d\xdc\xbc\x8d\xe2\x8a\xe6\x6c\xbf\x5b\x5b\xe4\x3d\xcd\x69\x41\x86\x8c\x26\xb1\xf8\x43\xb1\x46\x30\x3e\x09\x35\x66\xa9\xcc\x10\xab\x73\xf3\x6a\x17\x16\x5d\x32\x0e\xb3\x73\x96\x5a\x05\x98\x61\xb7\x4f\x7a\x1b\x96\xa2\x16\xa1\x7e\xe4\xd9\x38\x4c\xec\x14\xb4\xa2\xf4\x03\x9f\xcc\x72\x89\x41\xc0\x7a\xbf\x97\x72\x57\xaf\x68\x9a\xd3\x39\x7b\x9a\xb7\x17\xb2\x45\x76\xec\x9e\x86\xd3\x24\x91\x0b\xa4\xfa\x71\x92\xe7\xde\xc1\x03\xe7\x2d\x0c\xa5\x96\xba\x62\x62\xa0\xd6\x09\x26\x23\x06\x9f\xca\x34\x87\x3f\x52\x58\x62\x7c\x68\xae\x50\xe4\x94\x2b\x99\xd3\x90\x67\x63\x25\x6b\x58\x8b\x9d\x1e\x98\xd8\x69\x9d\x4d\x75\xc5\xd9\x54\xdf\x0c\xc9\x99\x78\x08\x9d\x75\x64\x94\x8c\x01\x4d\x3a\x84\xc1\xa5\x1e\xa6\x31\x19\xc1\x8d\x8d\x49\xa0\x8d\x6c\x4c\x92\x6d\xcc\x69\x1d\x9a\x38\xd9\x18\x65\x40\xaf\xa2\x2a\x6f\x94\xfa\xcd\x1e\x4f\x6d\xc7\x29\xa1\x59\xc6\x33\xbf\x5b\x28\x5c\xbe\x4f\x2b\x92\x70\x98\x93\x2b\x9a\x24\x18\x26\x3a\x27\x8e\x8c\xed\x6b\x8c\xe9\x5d\x84\x17\x14\x22\x41\x0a\xd2\x31\x4d\x12\x24\x90\x82\x98\x40\x0d\xb4\x56\x53\x51\xa9\xb7\x36\x1c\x9a\x3a\xf7\x08\xfd\xc3\xc3\xd3\xef\x92\x69\xfd\x14\x05\xce\xcd\x6a\xe0\x7b\x1e\x4d\xeb\x4f\x70\xb9\x85\xca\x8d\x91\xb1\xfe\x63\x16\x85\x2a\xf4\x26\x86\xc3\x14\xe8\xc3\x72\x22\xdb\x8c\x2d\x19\xb0\x2c\x59\x70\x7b\x80\xfa\x63\x9e\x74\xa4\xff\x67\x1d\xec\x3c\x8c\x21\xd8\xf0\xa5\x78\x55\x46\x61\x42\xe4\x6d\xa6\x85\xb2\x02\x87\xd5\x26\xc4\x95\xc4\x4c\x5d\xef\x4b\xdf\x43\xb6\x7d\xf4\x4f\x46\xe6\x8c\xc1\xe4\x94\xac\x3a\x66\x59\x71\xb3\x35\x14\x8b\x4e\xe3\x2d\xc0\xd0\x2d\xb5\x16\x40\xc2\xe0\xda\x81\x85\x83\xd0\x9e\xe4\x3d\x4d\x20\x7a\x3c\x57\x49\x8c\xb1\x3d\x2d\xd4\x1e\xb1\xf3\x11\x30\x48\x6c\xc0\x92\xe2\x06\x26\x4a\xd3\x7c\x9a\xa9\xf8\xe3\x48\xcd\x21\xd8\x79\x72\x15\xde\xe4\xe2\xc7\x0d\xc6\x23\x4d\x73\x06\x5a\x16\x19\x61\x54\x27\xfb\xce\x68\xaa\x6e\xc1\x33\x4b\xad\x8e\x12\x75\xcc\xc0\x2e\x87\xa1\x92\x28\xcb\x90\x74\x43\x9e\x24\xfc\x4a\x0c\xd7\xac\x70\x1f\x02\xb5\x6e\x12\x6d\x14\x62\xfd\x36\x86\x08\xb2\x10\x5e\x11\xf6\xdf\xaa\x06\x1a\x88\xbb\x66\x23\xcb\x9a\x86\x5b\xad\xcc\x34\x0a\xb7\x60\x6b\x62\x9c\xce\x63\xf0\x6d\x9b\x91\x98\x68\xa7\xbf\x50\x1d\x8e\x9e\x15\x34\xc3\xa3\x83\xd9\x2e\x9c\xad\x10\x5b\x3a\x64\xf2\x62\xc6\x77\x16\x4b\x09\x30\x9f\xaa\xa9\x82\x03\x3d\xb9\x51\xf6\xc0\x24\xa7\xd9\x25\xcd\x08\x58\xde\xa3\x95\xa4\x8a\x3f\xef\xc4\x48\x5d\xd4\x94\xdb\x9a\xc8\x22\xd6\xdb\xf6\xfc\xdb\x73\x87\x59\xf5\x63\x76\x86\x31\xcf\x52\x1a\x1f\x17\x61\x56\xa8\xcc\x35\xfa\xfd\x90\x15\x37\x5e\x99\x3c\x64\x4a\x3c\x4a\x4a\x31\x41\xd1\xe4\x12\x08\x60\x93\xb9\xb7\xb1\x8d\x56\x66\xc2\x50\xa5\x14\xfe\xcd\xfd\xec\x59\x10\xdf\x5a\x8d\x7d\x65\x4d\xaf\x2b\x47\x59\x6e\xcd\x8a\x71\xa4\x67\x82\x89\x78\xbc\x46\xab\x26\x25\xae\x85\x19\x26\xec\x82\x85\x82\x52\x32\x66\xe7\xa3\x02\x54\x5d\x4a\xde\xd9\x35\x60\xdf\xf3\x8c\x98\xf4\x56\xa1\x0e\x4f\xa9\xa3\xf8\x43\x65\x48\xce\x84\xa9\xa2\x38\xbf\x30\xb5\x21\xf9\x7a\x98\x9a\x9b\x40\xb3\x08\x83\xa9\x78\x82\x09\xd2\x3d\xc2\x00\x73\x48\x3f\xa2\x69\xde\xad\x5d\x77\x98\xd5\xa3\x47\xc4\x9b\x8c\xbf\xfe\x02\xac\x61\xf9\x97\x5e\x7d\x3f\x30\x59\xfd\xf2\xbf\x12\xe8\xe8\xac\xbf\x8b\x4e\x0e\x06\x00\xee\x36\x8e\x40\x62\xf7\xdc\xbb\x7f\x94\xd0\x30\x6d\xe8\x7e\xa9\xde\x9b\x67\xef\x87\xfb\xad\xb0\x55\x96\x90\x76\xfe\x6b\xd3\x6f\xc9\x26\x59\x39\x07\xa9\x10\x90\x73\x45\xdf\x15\x6d\x1b\x27\x05\x29\x65\xea\xb2\xfc\xed\x94\xf9\x71\xd3\x4e\x02\xa0\xa4\xe2\x06\x3f\xa6\x09\x8d\x8a\xe0\x63\x5b\x47\x78\x83\x4f\x5d\x96\xc3\x3e\xca\x2a\x32\xfa\x17\xec\x42\xa5\x13\x81\xb5\x9e\x8e\x2d\x3d\x71\x22\xd8\x2d\x31\xc4\x8a\x81\xbd\xb4\x48\xa1\x33\xbe\x86\x91\xd9\xe4\xb3\x76\x80\xb7\x96\x29\x79\x4d\x04\xdd\x06\x9f\x05\xe7\x66\x75\xbc\x15\xbc\x08\xba\x35\xf6\xfc\x75\x71\x76\xe7\x08\xc6\x66\x5e\x19\x26\xc8\x9a\x2a\x71\xc2\x2b\xc2\x4b\x41\x83\xc0\x4f\xfb\xbb\x66\xc6\x34\x48\x66\x69\x52\xd5\x7f\x63\x2d\xb5\x40\x18\xfc\x6d\x47\xce\x3c\x55\xb7\x97\xd9\x01\x27\x80\xb2\xbb\x19\xa7\xe5\x2d\x72\xa7\x86\x48\x75\x6a\xe1\x98\xfd\x5d\x92\x28\x03\x21\x0b\x54\x7c\xb7\x52\xa4\x62\x42\xc6\xa8\xec\x93\xbb\xd5\x77\xb0\xc6\xbd\x68\x1b\x07\xd5\x27\xa5\xc1\x98\xd7\x5e\xed\xfa\xf7\x49\x69\xdd\x0d\x95\xc5\x3f\xca\xab\xdd\x97\xff\x56\xed\x56\x9f\x54\xed\x12\x4f\x5f\x49\xca\xe9\x91\x66\x17\x08\xc8\xa5\xe7\x86\x41\xc3\xd4\x05\x92\xef\x24\x9f\x71\x70\x81\xf0\x35\xe6\xdd\xc3\xe5\x33\xb6\x22\x67\x17\xa3\x14\xf8\x31\x1c\xd3\xdc\x89\xf2\x8a\x78\xb9\x53\x7b\x58\x6c\x5a\x8d\xa0\x25\xcb\x11\x42\x88\x65\xa0\xa2\xa1\x5c\x13\x15\xe2\x99\xa9\x38\x60\xb6\xa1\x0a\xf1\x53\xce\xdb\xc0\xe5\xa8\x89\x15\xc7\x79\x67\x8e\xf3\xbc\x53\x3e\xd0\xfa\x9d\x6d\x01\xe9\xb2\x86\x33\xbd\xd3\x2d\xa3\xdb\x82\x56\x33\xb2\x21\xb0\x9b\xb1\xec\x63\x6a\x6d\x68\xec\x90\x8e\x6a\xae\xe2\x6f\x98\x93\xf8\x43\x8f\x1b\xf2\xcc\xc0\xf0\x74\x38\x1d\xb2\xb0\xfb\x93\xb3\x1d\x66\x9a\x75\xe6\x2f\x55\x3b\x3e\x7f\xd4\x9d\x96\x85\xa9\x90\xec\x75\xa6\xb5\x84\x81\x37\x96\x3e\xb6\x74\xbd\xa3\x77\xec\xf0\x50\x3f\xc3\x67\x1b\x61\xd4\x37\x0b\x92\x74\xb7\x55\x7c\xe5\x2f\xd7\xa8\x41\x32\x83\x83\xed\x8e\x7d\x62\x1d\x7b\x25\x43\x26\xa4\x31\x91\x1f\x82\x78\x15\x14\xa8\xed\xc5\x25\x9d\xc3\x85\xcc\xba\x25\x66\x3a\x8f\xd9\xcf\xc3\x39\xb3\x8e\x99\xdb\x42\x3f\xde\xe4\x15\xa1\x7f\x5b\x92\x32\x5d\xa6\xae\x04\x29\x8f\x71\x24\x4a\xda\x1c\xc6\x1e\x4e\x5d\x58\x4f\xff\x1e\x9c\x3b\xaa\xe7\x2a\x4c\x6d\x94\xe7\x8a\x32\xb6\xb1\x64\x04\x9e\xa9\xcc\x93\xb5\x27\xc1\xda\xb2\xe6\x81\x7a\x12\xac\x6d\x24\xd6\xae\x0a\x9f\xcf\x54\x20\xe2\x09\xcf\x94\xd2\x7a\x12\x26\xb4\x28\x68\x17\xe4\x4b\xdd\x91\x16\x27\x1b\x19\x60\x5a\x7c\x1f\x8e\x59\x72\xa3\x6a\x14\x37\x13\x7e\x9e\x85\x93\xd1\x4d\xd7\x7c\xb4\xc1\x8f\xd9\x7f\x69\x05\xf0\xe4\xfa\x03\x7f\x4f\xc7\xad\xed\x1d\x7d\x87\x8a\xab\xe4\x65\xc2\xce\xc5\x35\x94\xd0\xa1\xf1\x05\x9f\x4b\x07\x9f\xb0\x94\xfe\x83\xb2\xf3\x91\xb8\x0d\xb7\xe9\xd8\xd4\x66\x69\x75\xb9\xb2\x3f\xc0\x8b\x1a\x8b\xe3\x05\xb4\xff\xbe\x56\x5f\xde\xb3\x8d\x0b\x0b\x30\xdd\x97\x4f\x7a\x6e\xaf\xfa\xd2\x9e\x63\x57\x14\xb0\xe1\x2f\x56\x13\xa6\x73\xed\x27\xf2\x3b\x52\xd8\x7b\x6a\xc3\x2f\xa8\x4e\x9e\xa7\xeb\x15\x2a\x94\x51\x63\xd9\xac\xa5\xec\xea\x7c\xca\xf8\x8a\x49\x6e\x08\x1f\x48\x55\xe5\x25\x0b\xb5\xb6\x6d\x98\xf1\x31\xb6\x6c\x73\xb6\x1b\x0b\x6a\x30\xf1\x4d\x23\xf5\x95\xae\x93\x8a\xd1\xc7\x55\x2a\xbb\xaa\x04\x0e\x9e\xe0\xb7\xda\x09\x65\x5e\x3f\x17\x29\x17\xa8\xf1\x75\x51\xfb\xee\x40\xf9\x32\x01\xd8\x23\x07\xc2\x91\x08\xe0\x1a\x39\xdf\xdd\x67\xfe\xd2\x8e\x31\x73\x3c\xf0\x2b\xdf\xf4\xd6\x33\x1e\x57\xd3\x7d\x91\x90\x43\xb5\x07\x5d\xf7\x03\xbe\xfa\x45\x05\x4b\x52\x62\x2f\x91\x6a\x4f\x49\x48\xf4\xca\xe8\x8e\x94\xc0\xc3\x2c\x0a\x6c\x29\x1b\x92\x96\xdb\x97\x92\x39\x41\xdc\x38\x24\xa3\xa6\x53\x41\x23\x35\x3f\x1f\xb4\x6d\x9b\x3e\x35\x2c\xb7\x35\xbd\x67\x4e\xd4\x29\xab\x6d\x39\xe2\xba\x86\xd5\x84\xbc\x56\xa1\xb8\xae\x49\xfb\x51\x5f\xd5\xa6\x59\x0b\xb7\x51\x5b\xb0\x7b\xab\x24\xe0\xda\x75\x6b\x51\x8f\xa6\x95\xc8\x40\x34\xc6\xeb\x15\x5e\x4e\x3e\x81\xe7\x02\x57\x73\xb9\x16\xe2\x06\x81\x49\x8d\x98\x43\x34\xbd\xb0\x6b\xd6\x64\x01\xc7\xac\x68\x21\xa7\x2c\x43\xf0\xd6\x9e\x59\x6b\xcf\x2c\x8b\x3e\x37\xbb\x67\xcd\xd5\x9a\xa2\xf0\x2b\x68\x4a\xde\x11\xf5\xeb\xe6\x5d\xed\x15\x1e\x64\x16\xa6\x47\x77\x91\x82\xad\xcc\xcd\xcc\x0a\x73\xa2\xc4\x5f\x56\x5c\x92\xfb\x71\x38\xdb\x7b\x58\x0e\x67\x28\x4e\xf8\x07\x8b\x63\x5a\x9b\x69\x66\xff\xe9\x17\xce\x34\x83\xc3\xab\x0d\x14\x83\x9f\xff\x59\x2b\x99\x79\x3e\xd7\xf8\x55\x2b\xf7\x37\x81\x7f\xe6\x0f\x21\x20\xcc\xd3\xdf\xb5\x18\x57\xc6\xaa\x07\x9a\xca\x86\x37\xb5\x28\xfb\xac\x0c\xdb\x18\xd7\x5e\x01\xe9\x6a\x17\xf4\xa6\x0e\xa1\x76\x77\x1d\xa8\xa6\x76\xc5\xf7\x87\x29\x91\xbd\x57\x69\xf7\x55\x98\xa5\x98\xb1\xb3\x52\xc2\xf7\xc4\x07\x6c\x14\x62\x22\x88\xe7\x94\xf8\x5d\x46\xc3\x8b\x09\x67\x69\x51\xb7\x4b\x4f\x76\x1c\x69\xa9\xd6\xbf\x56\x3a\x87\x3d\x29\xc3\xce\x12\xac\xa2\x32\xed\x4f\x2d\x57\x9d\xb3\x3d\xa4\x7e\x4a\x80\x56\xbd\x01\x4f\xe7\x1e\x9d\xdd\xda\x0a\x07\xa9\x86\x57\xc7\xe0\xdf\x76\x96\x9a\xee\x61\xad\x57\x51\x98\xde\x90\x17\xe4\xd3\xed\xfc\x61\x1e\xad\x86\x3b\xbf\x2b\x39\xe4\x1f\x28\x1a\x66\x9d\x58\x52\xfa\x5a\x88\x9a\xca\x30\x1e\x4c\xd2\x0d\xe9\x89\x69\xc4\xb3\xb0\xe0\x99\xde\x8f\xab\x46\xd7\x0b\xbc\x92\x1c\x8d\x6f\xdb\x0a\x4a\x23\x3b\x27\x9b\x04\xa8\x4e\x1a\x26\xce\x96\xdb\xb1\x5f\x14\xf7\x51\x0a\xfd\x32\x4b\x66\xc6\xd3\xe4\x46\x7f\x14\x3f\xd4\x87\xeb\xfc\x67\x23\xbc\x12\x3f\xd4\x87\x7c\x6c\x7d\x10\x3f\xb4\xd0\x2b\xb6\x3e\x88\x1f\x5a\x07\x71\x6e\x7d\x10\x3f\x74\x1f\x89\xdd\x47\x62\x7d\xc8\x5f\xf1\xab\xd4\xea\x5e\xfc\x34\x03\x70\x3e\xe2\x4f\x33\x08\xe7\x23\xfe\x34\x03\x71\x3e\xe2\x4f\x33\x18\xb7\xcf\xc4\xfe\x78\x25\xaf\x16\xfc\x76\x65\x1b\xf5\xac\x42\x94\x27\x16\x5e\xfc\x2b\xd6\x59\xfc\x2b\x96\x15\xa4\x76\x31\xfe\x2b\x16\x0d\xbe\x27\xf2\x5f\x58\x10\x84\x54\x7f\xe1\x54\x11\x5a\xfd\x85\x93\x10\x7f\xc1\x90\xb5\x15\xcf\xdc\x92\x07\x78\x6f\xc9\x0b\xdc\xcc\x01\x8a\x81\x2f\x32\x65\x28\x04\x51\x69\xfc\x05\x29\xe9\x75\x48\xf0\x36\x2c\x68\xc6\xc2\x64\xf3\xe7\x37\x7d\x32\x4d\xa5\xdf\x00\x8d\x61\x21\x71\x6d\x48\x86\xd9\xea\x63\x12\x90\xc7\x32\x95\x8f\xe6\xe7\xfc\xf6\xc9\x63\x12\x88\x33\x77\xf6\x8d\x7c\xcf\x6c\x7d\x7b\xd6\x0d\xc4\x0b\xf4\x92\xb3\x98\xf4\xb4\xb0\xf8\x92\x81\xb3\x81\x49\x96\x04\x86\xe2\x67\x62\xa1\xcf\x48\x34\xa2\xd1\x05\x61\x39\x19\x86\x39\x04\x2a\xe7\x82\xd3\x27\x7c\x5a\x90\x9c\xf3\x94\x66\x84\x0d\xc1\xe3\xa4\x2b\xe5\x94\xa2\x9a\x2d\x9d\x84\xc0\xf8\x5d\x96\x63\x80\x7c\xf8\x6a\x84\x7c\x3a\xbc\x3e\xc3\x70\xf9\x8c\x7c\x03\xc7\x4c\xae\x8d\x28\x78\x7c\x48\xb6\xfd\xd8\xe7\x03\xcd\xee\x90\x43\x80\x3f\x61\x1f\x8d\xe5\xac\xe8\x55\x22\xe1\xe1\xa1\x05\xeb\x1a\xe2\x9a\x59\x5b\xe1\xae\xf1\x3f\xa8\x52\x1b\x69\xdc\x64\xa4\x06\x82\xf0\xe8\x11\x31\x9d\xd9\x93\xaf\xe9\x42\xcb\x2c\xb7\xb6\xc8\xcb\x24\xe1\x57\x6a\xa5\x0b\x4e\x06\x70\x51\x0d\x40\xcd\x20\x48\xa5\x3c\x30\x78\x92\xc8\x9b\x21\x09\x93\x8c\x86\xf1\x0d\x19\xc1\x8e\x76\x48\xca\xb5\xc3\x0a\x6e\x14\x54\xc8\xd5\x5e\xc8\x01\xa8\x11\x6d\x6d\x91\x98\x16\x34\x1b\xb3\x94\xe2\xe0\x58\xc2\x8a\x1b\x32\x08\x73\x1a\x2b\x7f\xa6\x7c\x1c\x26\x09\xcd\x0b\x92\xb3\xff\x52\x32\x9d\x6c\x38\xfb\x74\x2a\x37\xea\x54\xec\x54\x99\xf9\xec\x0a\x4c\xd7\x9b\x77\xea\xef\x1e\xb4\xe0\x6c\x5e\x4d\x13\x27\xa7\xcc\xc9\x7a\x6f\xea\x18\x2a\x78\x62\xb7\xf4\x98\x04\x3f\x4f\x82\x9a\x3a\x36\xb1\xf2\x6b\xc1\xa1\xd7\xf5\xc4\xa2\x39\x7d\x29\x33\x6f\x7d\x71\x75\x59\x0e\xff\xfe\x3c\x69\xb7\xac\xa6\x3a\x88\x04\x6d\xc1\x83\x79\x1d\xd7\x36\x21\xbe\x56\x36\xe2\xa0\x7b\x1d\x9a\x3a\x48\x7a\xeb\xa2\x16\x78\x34\x78\x9b\x2f\x19\xee\x74\x9a\x24\xda\x70\x5c\x96\x19\x7f\x80\xdb\x46\x49\x12\x3e\x04\x0c\x9d\x69\xb7\xf4\x4b\xfe\x7e\xa4\x43\x0f\x32\x0f\xf1\xdf\x33\x16\xd7\xbd\x51\xe7\x0b\x58\x7d\x8f\xb2\x21\x31\xb8\x87\x20\x56\x59\x65\x0e\xe2\xb5\xb9\xdb\xef\xdc\xdc\x6d\x1d\x48\x6a\x1d\x48\x6a\x1d\x48\xea\xf7\x68\x24\x09\x15\x31\xb3\xfd\x77\x61\x5e\x27\x4b\x7b\xb2\x57\x01\xdb\xd4\x89\x81\x5a\x47\xa1\x5a\x47\xa1\x9a\x2b\x0a\x95\x13\x7e\xea\xd7\x69\x5e\xb0\xe1\x8d\x4c\x4e\x2c\xbf\x6e\xe6\x45\x98\x19\x93\xcf\x30\x61\xe7\xe9\x9b\x82\x8e\xf3\x3e\x09\x22\x2a\x70\x65\xae\xf8\x54\x05\xbd\x2e\x5e\xa1\x70\x0a\x21\xc0\x9f\xc1\xb6\xb5\xd4\xa1\x43\xac\xf4\xea\x15\x0d\xda\x55\x2e\xe8\xcd\x80\x87\x59\xfc\xbd\xf2\xa9\x53\x15\x07\x61\x74\x71\x9e\xf1\x29\x66\x1d\xb2\x4d\x35\xc1\xc0\x28\x66\x97\x4c\x05\x15\xd0\xf6\xa5\x12\x63\xbd\xd4\xee\x60\x62\xba\xbd\xe3\x45\xcb\x52\x11\xa5\xb6\x77\x1a\x6c\x54\xed\x16\xea\xcd\x63\x67\x66\x80\x6f\xb6\x47\xe5\x02\xb2\xb8\xe9\x93\x5e\x77\xcf\x85\x84\x29\x5a\x4b\x02\x71\x14\x54\x37\xc1\xf6\xe4\x9a\xe4\x3c\x61\x28\xf3\xa8\x58\xa3\x84\x9d\x8f\x8a\x57\xe5\x85\x3a\x9f\x16\x05\xcd\xf2\xd2\x34\x7f\xa0\xc3\x62\x56\xd0\x2f\x09\xfa\x1e\x8d\x7e\xab\x61\xed\xbe\x06\x40\xd0\x4c\x57\x45\x16\xa6\x0a\x23\xa4\xe1\xb2\x2e\xc9\xa5\x45\x4d\x2b\x30\x9b\xbf\x09\xd6\xba\x81\xed\x60\x14\x4f\x15\x06\x96\x1b\x50\xdf\xba\xf9\x88\x67\x05\xcd\x0b\xf5\x0c\x6c\x5b\x89\xfc\x47\xfc\x92\x66\x4e\x0e\xff\x6a\xd4\x36\x0e\x48\x66\x3c\x47\x55\xc6\xc3\x36\x46\x9a\x4a\x3a\x9e\x1b\x4f\xc9\x98\x0b\xc6\x3d\xa6\x97\x2c\xa2\xb9\x86\x08\xfe\x36\xa6\x31\x0b\x49\x0b\x46\xd4\x27\xa2\xd7\x76\xe0\x3a\xb8\x96\xba\x0e\x60\xbe\x98\xb6\x34\x30\xa2\x18\xd3\x6f\xf0\xe8\xaf\xda\x3a\x64\xb9\xb6\xdc\xb7\x33\xb6\x9c\xd3\x88\xa7\x71\x98\xdd\xbc\x94\xa1\xed\xac\xf8\x0c\x2f\xe3\x98\xe4\x7c\x4c\xc1\x48\x94\x92\x82\x93\x10\x24\x69\x11\x4f\x12\x96\x0b\xda\x16\xe6\xe4\xec\x07\x96\x17\x82\xec\x1c\xbb\x2d\x9d\x99\x76\x58\x4e\xc2\x41\xce\x93\x69\x41\x93\x1b\x4d\x3a\xac\x20\x0f\x73\x60\xdf\x93\x55\xdb\x6e\x7b\xe6\xc0\x6a\x16\x68\x25\x3b\xa0\x24\x94\x38\x6e\xf4\x27\x0a\xe7\xe7\x36\xbe\x7d\xe0\x6a\x99\xb5\x79\xf8\x3a\x9e\xdb\xe7\x89\xe7\xa6\xd2\x1e\x68\xab\x73\x79\xe0\x49\x4c\x73\x76\x9e\xca\xa5\x56\x3c\x03\x44\x1b\x42\xca\x8a\x41\x5b\xd4\x91\x54\x52\x77\x69\x83\x8f\x77\xfa\xd2\x91\xcb\x56\x10\x12\x8e\x0e\x31\x34\x5d\x06\x11\x68\xd4\xa4\x20\xda\xd8\x98\x5f\x3a\x83\xc5\xce\xfe\xae\xae\xe8\x65\xba\x0c\x89\x60\x0d\x12\x0c\x95\x03\x3c\x03\x50\xd6\x38\xc6\xe3\x24\x46\x34\x00\x26\x42\x11\x9b\x84\xe5\x05\x61\x05\x1d\xdb\xe3\x90\xcc\xc7\xac\xe4\x17\x82\xbc\x6a\x9a\xb8\x7c\xa0\x2b\xd5\xc4\xcc\x28\x57\x0a\xb0\xb5\x48\x50\x2b\x55\x49\x7a\x0e\x4b\xbe\x7a\xd1\x88\x52\xaa\x95\x45\xc2\x49\xe9\x9e\xdb\x32\xfd\x2f\xb6\xa5\x73\x1a\xb7\xe7\x4a\xb0\x6a\x56\x67\xa5\x91\x4a\x4a\x91\x36\xe4\x51\xb1\x22\xe2\x40\x89\x98\x26\x94\x29\xf3\x7e\x5d\x6a\xe2\x55\x7d\xce\x58\x11\xb5\xa1\x22\xf0\xe6\x35\xb1\x4e\xf0\x77\x55\x30\x09\x27\xac\xc3\x5c\xf1\x24\x1a\xc3\x49\x78\xcd\x55\x45\x94\x88\x2a\x23\x4a\xd4\x04\x94\x80\xf5\x35\xc1\x61\xc0\x78\xdd\xfe\x3e\x57\xfc\x18\x79\x86\x6d\x20\x8f\x45\xf5\xe9\x4d\xa9\x3d\x59\x7e\xe7\xc0\x12\x1d\x72\x12\xe0\x66\xf8\x19\x58\xe6\x8b\x30\xa1\x22\x18\xda\x6e\x29\x72\x36\x56\xb1\x1c\xad\xca\xe8\xa2\x90\x86\xe5\xaf\xe4\x7a\xce\x83\xcd\xb6\xa6\xcc\x0e\x3d\x52\x17\xf5\xa9\xe0\xa8\xc0\xb5\x31\xcb\xed\x7f\x14\xe6\x2f\x2f\xc3\x22\x14\xab\xa6\x33\xc9\x0b\x7e\xb9\x65\xa8\x25\x9c\x8a\x72\x32\x6d\x32\x2b\xfe\x12\xd4\x13\xab\xab\x48\x04\xf6\x24\x7d\x74\x88\x15\x26\x49\x8f\xc5\xe3\xbf\xed\x41\x49\xc5\xbb\x52\xcc\xcd\x8a\xfb\x94\xd1\xf4\xc4\xaf\xbb\x49\xb6\x3f\xda\xe3\xf1\x7a\xf3\xf7\xe6\xcb\xf9\xa6\xc8\x57\x70\x87\x7c\xe5\x62\xcf\x92\xfe\x25\xf2\x68\xa9\x43\xb7\x6c\x2b\xab\xf1\x97\x91\x74\x4f\xd2\xc3\xe5\xda\xf0\x1e\x7c\x9d\x0a\xd4\x59\xac\x61\x75\x0c\x7f\xfb\xcd\x3a\x11\x2f\x5c\x0f\x1d\xd2\xb7\x7e\x43\x23\x32\x8a\xd9\x1c\x5e\x3a\x0a\xa5\x12\x89\x79\xb3\x2c\xf5\x2a\x5d\x71\x3a\x15\x31\xa1\x8c\x7b\x8e\x7d\x92\x34\x83\xf2\x36\x04\x6f\x2c\x87\xbe\xeb\x01\x81\xde\x1c\x77\xc1\x3a\xdc\x7e\x5d\x5b\x3a\x6c\xeb\x28\xf1\x3f\x67\x42\xe6\xc2\xf0\xfb\x14\x0b\x1b\x24\x2c\xa8\xab\xe8\x89\xda\xec\x3c\x57\x6a\xcd\x3d\x90\x52\x2a\x7f\x31\x9b\x0a\x34\x28\x93\xad\x39\xc3\xfa\x38\xb9\xac\xf0\xbf\xf2\xb6\xd0\xbc\xab\x05\x8b\xb6\x9c\xa3\x1c\x89\xaf\xb6\x17\x6f\xc5\x3b\xce\x27\x67\x95\xdc\x4f\x5e\xe0\x19\xf1\x5f\xbb\x8a\x9b\xe8\x4e\xf8\xa4\x65\xc2\xe2\xb4\x4b\x0b\xb7\x64\xb4\x23\x77\xb0\x35\x03\x9d\x37\x3a\x8e\xa2\xc8\x33\x43\xe3\x68\x3e\xb7\x22\x2e\x8e\x92\x6d\xe8\xe8\x36\x76\xa0\x9c\x84\x61\x9c\x1c\xe4\x22\x35\x48\x45\xdc\x1c\xff\x99\x63\x7d\x90\xef\x0e\x93\x28\xca\x8c\xa7\xc2\x1b\x48\x3d\xee\x2a\x9c\x80\xf4\x13\xc5\xd4\xaf\x09\xac\x33\x4f\x23\x77\xf5\x23\x52\x83\x00\x0f\x22\xeb\x3d\xe2\xdb\x07\x3c\x7f\x58\xf6\x01\xa8\x83\x7a\x4b\xd3\x69\x9d\x93\x43\xaf\xf7\x85\x2d\x3b\xc4\xe0\x6a\x7d\x7e\xc4\x47\xb1\xda\xb5\xa3\x9f\xcb\x2e\x45\xb5\x72\x5f\xc3\x17\x6d\x37\x4e\x41\xbe\xae\x2b\xf5\x98\xbd\xb9\xdc\x96\x54\x2b\xf7\x35\x05\x40\xe7\x2f\x6e\x5f\xb3\xdb\xeb\x3d\xac\xf3\xf3\x85\xed\x6b\xd6\xd6\x2e\x6b\x6b\x97\xb5\xb5\x4b\xa3\xb5\x0b\xfc\x7a\xc5\xeb\xc8\xeb\x8e\xc1\x8f\x3c\xca\x78\x92\x0c\xc2\xec\x98\xfd\xb7\xce\x82\x60\x67\xbf\x57\x0d\xdf\xe8\x55\x68\x03\x7e\x56\x0b\x96\x9f\xf8\x84\x5f\xa2\x88\xa8\xf2\x76\xdc\xf6\x21\x9b\xda\x97\x20\x0b\xde\xbd\x0e\x68\x53\xf3\xfa\xa2\xfc\xb3\xda\xba\x6c\x6d\x91\xbf\xc9\x43\x41\x63\xcd\xb1\x13\xb9\xec\x0b\x8d\xf9\x83\xd6\x99\x0b\x2a\x36\x08\xa3\x8b\x3a\x7c\xee\xcd\x3d\x85\x8a\x36\xef\xc1\xef\xae\xe4\xcf\x66\xeb\xd2\x40\x1b\x57\x70\x92\x53\x4c\x26\xa2\x54\xc8\x4a\xd1\x31\xa6\xe9\xd4\xe8\x38\xc2\x34\x1a\xf1\xec\x75\xa2\x15\x6c\xff\xf8\xf0\xf6\x07\xf9\x18\x2b\x6b\xce\x6a\x26\xa2\x12\x0e\xbc\x1b\xb6\xac\xea\xed\x7a\xad\x59\x98\x82\x7b\xd4\xd6\x16\x19\x87\x45\x34\xd2\xdb\x67\x4d\x0b\xd8\x6d\x95\xe4\xab\x63\x22\x2d\x9d\x29\x46\xeb\x2c\x5f\xab\x85\x57\xa6\x16\x36\xac\x8a\xdd\x3a\x64\x94\x51\x24\xe7\x4c\x61\x98\xe9\x49\x7d\x02\xbc\x5c\xa8\x3f\x7d\x3a\x86\xe0\xaf\x38\xa0\x43\x9e\x51\xe8\x0f\xf6\x1d\x0c\xb2\xac\x29\xf1\xf4\xb5\x28\x59\x74\x7b\xab\x4e\xf8\x92\x9b\x5d\xd1\xd4\x6a\xb6\xbe\xdc\x70\xbb\x71\xa9\x20\x45\x87\x5e\x28\x96\xe3\x5a\xa9\x6c\x31\xf6\x6a\x41\x3a\xc4\xf5\x82\xb9\x0b\x36\x0a\xe5\x8a\xd9\x0a\x67\xb9\x60\x90\xb2\xe5\x4f\xbf\x5e\xa5\xb3\x78\xcd\x0a\xf7\x28\x5e\xb3\x85\xed\x31\xfe\x88\x0b\x55\x3e\x89\xd7\xac\xf0\x0f\x22\x16\xad\x97\xab\xf2\x1c\x5e\x0b\x26\xce\x5f\xae\xf5\x29\x74\x56\xcb\xa8\x3a\x44\xe7\x34\x2f\x72\xe5\x0b\x9a\x70\x6d\xe2\x23\x8d\x76\x26\x61\x16\x8e\xc9\x27\xbc\x70\x6f\x65\xba\x28\x93\x38\x2a\xe7\xd3\x2c\xa2\xda\xba\x4e\x76\x68\x2d\xff\x7b\xec\xe1\x48\xb4\xbc\x7c\x8e\xc1\xb1\x3c\x0e\xd2\xc5\xd0\xda\xdf\x09\x5d\xc4\x22\xd0\xb7\x41\xfa\x29\x9c\xd0\x6c\x71\x56\xe3\x4c\xf2\x43\x67\xca\x55\xfa\xa6\xc4\xe2\x48\xf6\xb3\x82\xc3\x91\x5f\x8e\x56\x60\x69\x07\x96\x9a\x0b\xb5\xf0\x01\xcc\xa6\x40\xa3\x2c\xf7\xcc\x98\xf9\x12\x96\x92\xb3\x71\x7e\xd6\x21\x3c\x23\x41\x38\x2d\x78\x60\x7a\xd2\x50\xaf\xb4\x99\x70\x53\x24\x32\x81\xaa\xad\x93\x1a\x88\x74\x3a\x1e\xd0\xac\x3e\x62\x1b\x1c\x02\x94\x90\x52\xe4\xd1\x9a\x1b\x42\x48\xb8\x42\x1a\x01\x37\xc0\x60\x79\x56\x04\x35\x98\xf8\xc7\xb6\x8a\x8e\x2a\xde\x52\x59\x91\xbc\xcb\x18\x46\x87\x04\x69\xa4\xb4\xa3\xeb\x93\xa0\xe0\x18\x9a\x70\xc4\x33\xf6\x5f\x9e\x16\x50\x08\xf6\x68\x81\xb6\xe3\x4a\x8a\x6c\xa1\xea\x10\x49\x5a\xd7\xae\x77\x71\x10\x6d\x4d\x04\x06\xf7\x8d\xbf\x75\x3e\xa1\xd1\xff\xd7\x87\x7d\x1e\x87\xd7\x6c\x3c\x1d\x93\x11\x84\x92\x16\xfb\x1d\x92\x9c\x8d\x27\x89\x3c\x4f\x26\xf4\x2d\x4f\xa9\xd8\xf3\xb1\xb8\xa4\x33\x7e\x95\x93\x84\x42\x32\xc8\x10\xe9\xc5\x25\xa3\x57\xaa\x7d\x6c\x4c\x86\xab\x55\x59\x26\x43\x52\x84\x93\x49\x38\x10\x0f\x89\x8c\x86\x84\x4f\x0b\x48\x3b\x28\x51\xcc\xee\x14\xbc\xcc\xaf\x46\x2c\x1a\x89\xa3\x12\xb3\x7c\xcc\xf2\x5c\x35\xee\xbc\x25\xc5\xf8\x75\x14\xec\x28\x4c\xa2\xd6\x76\xaf\x77\x39\x22\x9b\xe4\xf9\xd3\xc9\x75\x5b\x6a\x37\xa5\x99\x34\x7b\x77\x4c\xc6\x5c\x1c\xb4\xe9\x98\xa0\xdc\x47\x67\x3b\xfc\x85\x0e\x2e\x58\xf1\xee\x92\x66\xc3\x84\x5f\x1d\xab\x8f\xb0\xfa\xd3\x68\x14\xa0\x50\x5d\xae\xb6\x54\xc9\x2c\x6b\x6f\x27\xaa\xcf\xb4\xb5\x13\x40\x5a\x07\x70\x69\xe2\xf3\xeb\x9f\x05\x1d\x4f\x3a\x98\x73\x0b\xcc\x45\x0a\xf9\x71\x1e\x9b\x3c\x50\xdb\x48\x78\xe3\x45\x9f\x80\xb1\x8d\x36\x8f\x93\x56\x25\x60\x30\x27\x30\x09\x4d\x6d\x04\x54\x1b\xa3\x47\x48\xa7\x7b\xf1\xd7\x37\x50\x1b\x7f\x3c\x7e\x6c\x94\xd2\xa2\xea\x89\x28\xfc\x68\xb7\x8c\x25\x4e\x0c\x56\xa3\xa4\x05\xf5\x1e\xcc\x0e\xff\x58\x2e\x03\xa5\x8c\xb8\x29\x26\xba\x88\xc9\x20\x2c\x0c\xa6\x9e\x94\x36\x83\x18\x5a\xf1\x44\x34\xfb\xb1\x1b\xf1\x34\x0a\x8b\x96\x98\x55\x1b\xa2\x27\x8a\x62\xf5\x6f\xf7\x9c\x16\xd2\xf9\xe7\xa5\x94\x6e\xcc\xce\xed\x37\x56\x72\xba\xdf\x7e\x23\x5e\x51\x37\x87\x84\x73\x34\x06\xf5\x8e\xa5\xe7\xdf\xda\x22\x7f\x15\x77\xfe\xf7\xec\xfa\x2d\xad\x37\x5a\x7a\xc5\xc7\xdd\x21\x4b\xe3\x57\xef\xde\xc2\x3b\xbf\xe5\x36\xdf\xee\x0e\x59\x96\xa3\x79\x62\x9d\xce\x7c\xee\xc6\xdc\xb1\xca\x9d\x55\xeb\x32\x36\xb2\x48\xad\x81\x51\xdf\x86\xa5\xb4\x9a\x55\x39\x08\x75\x0b\x8f\x1e\x91\x3b\x2d\xd2\x92\x13\xc2\x61\xb6\xda\x07\xde\x6a\x97\xd6\x0d\xe2\x25\x9b\xe9\xce\xbf\x19\x76\xac\x07\x7b\xb6\x7a\x3c\x66\xb3\x66\xcf\xb2\xa2\x92\x3f\x83\x5b\x77\x8b\x30\x09\x10\xbc\x46\xdd\x7c\xa0\x4a\xa4\x66\x1b\x88\x02\x47\xe1\x65\x6f\x84\x32\x93\x61\xea\x0e\xeb\xb0\xa1\x67\x86\x29\x57\x73\x64\x96\x90\x5e\x03\x5b\x3a\x2d\x42\x5b\xb0\xa8\xe4\xe8\x57\x3c\xbb\xc8\x09\xf0\xf7\x13\xd8\x3a\xe5\xb9\x62\x61\x5a\xcb\xe9\xe0\x07\x5a\x04\x39\x91\x41\x9a\x20\x0b\xf2\x84\x51\xe4\x54\x13\x7e\xce\x22\x19\x45\x26\xcb\xc5\x8d\xa5\xc3\x9c\x88\xce\x32\x16\xab\x64\xa4\x10\x1d\xc3\xb4\xe9\x4b\x3b\x6b\x36\xc9\xdf\x67\xc5\x01\x46\x09\xa3\x69\x81\x57\x1a\xf9\xc6\xec\xa4\x53\xfe\xe8\x11\xf9\xca\x20\xaa\xb8\xe9\xbb\x32\xd0\x87\x1b\x91\x26\x47\x5d\x09\x86\xe4\x71\x14\x22\x56\xb8\x0c\xf2\x98\x04\x93\x6b\xcb\x72\x69\x06\x4e\x41\x7f\x27\xe8\xff\x13\xb3\x8c\x4a\x43\x46\xf1\xf0\xc9\x8a\x44\xbc\x79\x02\xcb\xa7\x2d\x20\x7d\xfd\x1b\x5c\x87\x02\x71\x13\x88\x81\x2d\xd6\x61\x57\x05\x70\xd2\xb7\xfc\xff\x40\x28\xa1\xc7\x38\xc9\xc7\x24\x68\x07\x95\x26\x53\x6e\xce\x57\xc0\xf0\xfa\x94\xb0\xf0\x59\x23\x7d\xe3\x59\x11\x43\xfb\xdf\xf4\x46\x46\x71\xf1\x32\xe8\x76\xc8\x05\xbd\x71\x09\x19\xdc\x97\x62\x91\x8a\x70\x10\xd8\x23\x80\x0a\xdd\x49\x06\xff\x2a\x1d\x8a\x41\xd3\xaa\x59\xd8\xef\xa5\xaa\x44\x9e\x55\x70\x5e\xa6\xdb\xb2\xa7\x19\x72\x14\xca\xac\x70\x9e\xab\xd6\xe2\x3d\xe6\xb2\xa4\x47\xbe\xc7\xb1\xa2\xd7\xaf\xcc\x57\x2c\x7e\xcb\xa7\x69\x9d\x1d\x7d\x09\xce\xbb\x26\xec\x69\x4f\xa8\x63\x15\xe7\x1e\x7e\x67\xce\x65\x6b\x79\xbb\x9f\x9f\x27\x71\x58\xd0\x39\x06\x84\x80\x2d\xb1\x85\x3f\x99\xe8\x6d\x6a\x68\x5f\xe9\x72\x18\x9a\x38\xbc\x0d\xa3\xdd\xda\x22\x3f\x52\x1a\xc3\x63\x3b\xa3\x78\x3b\x86\xb9\x4c\x90\xac\x9f\xb8\x68\xb7\x0f\x59\x28\x0a\x4e\xc2\x14\xed\xc2\xdf\xf2\x38\x4c\x1c\x1f\x48\x48\x96\x2c\xee\x00\x32\x16\xdf\x54\x16\xe6\x51\x98\x9e\x53\x93\x49\x59\xf4\x25\xf1\x8f\x84\xe9\x0d\x49\x68\x78\xd1\x5d\x6e\xfd\x96\xf0\x36\x10\xed\xab\x04\x94\x8b\xf8\x1b\x94\x52\x53\x2e\xed\x49\xe0\xa8\x13\x0c\xa4\x53\xec\xa6\xcf\x53\x17\xe5\xa9\x43\x38\x1c\xf3\x48\xf8\xf2\x57\x23\x3b\x30\xd0\xa6\xcc\xae\x50\x01\xe9\xd4\x3e\xb4\x98\x27\x15\x93\xb2\x04\xe6\x34\xe8\x88\x10\xac\xee\x9d\x72\xbb\x86\xbe\xd7\xad\x2b\x7d\x25\xde\x07\x35\x3e\x07\xce\x02\x63\x14\xbd\xd7\xe8\x11\x4f\x02\x33\x27\xf8\xe5\x8c\x59\x94\xc0\xe0\xee\x90\xd4\x52\xeb\xd4\xb5\xad\xb3\xcb\x23\x36\x27\xb6\x2c\x73\xfa\xd2\x71\xa7\xfc\xa1\x02\x19\xfb\xa4\x7e\x0f\x8c\xc6\xc9\x63\xcb\x6c\x20\x54\x9e\xa2\xb8\x40\xb9\xe2\x56\x5f\xc5\x46\x28\xd1\x37\x12\x06\x67\xcf\xb3\x30\xcd\x87\x3c\x1b\xaf\xa4\x35\x5b\x54\xd6\x10\xa4\xd5\x42\x58\xe7\xf6\xb2\x56\x68\xae\xda\xfa\x30\x7b\xad\xa8\x80\x0d\xca\x84\x19\xe4\x1f\x0e\xc4\x6d\x7b\xa3\xf2\x87\x97\x0c\x82\x2c\x62\xe8\x6c\x0c\x29\xca\x38\x35\x17\x56\x89\x61\x27\xb4\x4f\x02\x41\xe6\x03\xd7\x1a\x9a\xa7\x92\xd9\x70\x30\xc3\x62\x42\xec\xf9\x74\x5c\x92\xe6\x2f\x4f\x46\x87\x0e\x55\x1e\xb6\x52\xc1\x8a\x97\x16\x11\x49\xb3\xfd\x7c\x13\x70\x07\xee\x42\x3a\xeb\x58\x45\x9f\x75\x91\x5a\xe5\x5a\x23\x69\x31\xe8\x99\x06\xd2\xf0\xa2\xaf\x30\x8e\x46\x21\xaf\xb6\x65\xae\x92\x45\x4a\x71\xe5\xd2\x49\x39\xc5\xe7\x0f\x28\x4d\x05\xb3\x4d\xcb\xc2\x58\x8c\x0a\xac\x8b\x95\x64\xc5\xb3\x8c\xdc\x7e\x58\x96\x91\xf3\x18\x20\x3d\xfd\xe2\xc6\xc5\xca\xa6\xe9\x01\x58\xb6\xee\xfc\x01\x02\xf2\xff\x79\x8c\x5d\x0b\x2e\x9e\x2d\xd3\xb1\xc0\x43\x90\x5a\xd6\x5a\x45\xee\x37\x54\x6a\x1a\x42\xb9\x87\xb5\xa5\xed\xda\xd2\xf6\x0f\x61\x69\x7b\x41\x6f\xa2\x7a\xab\xca\x67\x7b\x3e\xe0\x8c\xd4\x1a\x02\xc4\xe0\x02\xfa\x92\xd5\xa6\x18\xd8\xd9\x2f\x81\x36\x86\x9e\x93\x30\xba\x52\x18\x15\xec\x92\x6a\x33\xc2\xea\xa9\x3e\x7b\x5a\x0d\xdf\xd4\x93\x03\x68\x68\xd7\x55\x4a\xb3\x57\x3c\x9a\x36\x74\xb7\x6d\x2d\xad\x03\xdf\xd4\x9d\x03\xa8\xab\x37\xd8\xf3\x6e\x5b\xc9\x54\x66\xd9\xf2\xae\xed\x78\xcb\x76\xbc\x62\x4d\xee\x6e\x12\xab\x8d\xae\xff\xc4\xf6\xa3\xab\x09\xf4\xe3\xb7\xc2\xd3\xef\x92\x69\xbd\x8e\xbf\x6c\x1b\x52\x6e\x40\xbf\x9f\x1a\xda\x70\x34\xbc\xf2\xb8\xdd\x45\xcb\x2b\x9a\x98\x4b\xd3\x2b\x00\xef\x55\xdb\x6b\x2b\x57\xfe\xf0\x1a\x5f\x50\x1b\x2c\xa8\xf5\x85\x05\x5a\x56\xf3\x0b\x09\x80\x25\x35\x80\xb7\xef\x34\xcb\x68\x5a\x7c\x08\x07\x6f\xd2\x98\x5e\xf7\x8d\xe8\xce\x55\x25\x24\x35\x5a\x51\x5b\xf9\x58\xf5\x7d\x90\x4c\xb3\x0f\x6c\x0c\x6f\xb7\xd2\x47\x14\x0d\x88\xf3\x52\x56\x4c\x98\x7d\x2a\x37\x94\xd3\x42\xfc\xc9\xa7\x45\xab\x4a\x1b\x6b\x2b\x22\xc4\xb8\xbd\xc4\x05\xd2\xf9\x7f\x1e\x65\x5f\x62\x2b\x3c\x55\x65\xb9\x64\xdf\x4b\x7d\x30\x34\xe2\x5e\xcf\x5e\xfa\x0a\xf7\x32\x35\x1f\xa1\x75\xa7\x79\x90\xc2\xe3\x41\x51\x4c\x85\x0b\xde\x71\x7a\x6f\xfb\x92\x10\x1c\x75\x46\xc5\x02\xc9\x1d\x6d\x39\x1d\xdc\x96\x95\x2a\x1d\xb2\xdb\x6b\x1f\xd4\x2b\xa2\xc4\xf6\xd4\xeb\xa1\xc4\x57\x4f\x61\x53\xa9\x84\xaa\x55\x40\xb9\x32\xf6\xa5\x36\x46\x54\xc4\x23\xaf\xb2\x85\x00\xb7\x67\x56\xce\x1d\xdf\xbd\xec\xa1\xb5\x7c\x46\x81\x36\x9d\x04\xe2\x48\xeb\xdf\x31\xbf\x4a\x83\x36\x04\x4e\xf9\xca\x19\xc1\x6f\xbf\xb9\x23\x7a\xf4\x88\x2c\x84\x06\xd5\xb8\x5f\x67\x70\x50\xa7\xc7\x9c\xc3\xe8\x60\x86\xad\x81\x4c\xee\x31\x4f\x57\x49\xb3\xd6\xdf\x42\x50\x93\x30\xc4\x5f\xc8\xd9\xaa\x49\x7b\x51\xec\x25\xeb\xa6\xf4\xba\x90\x5b\x7d\xcc\x06\x09\x4b\xcf\xdd\x15\x9a\x01\xbc\xd8\x70\xa7\x93\xbb\x0d\x56\x80\x32\x3e\xcd\xe7\x1e\x70\x75\x85\x86\x41\xd7\x1f\x7f\x79\x70\xeb\x29\x80\x04\xb0\xd5\xc9\x8d\x94\x40\xa0\xce\xf7\x25\x5b\x9a\x55\xd1\x02\x31\x01\x9f\xe6\x57\xa3\x60\x55\xee\x1c\x40\x4a\x2f\x56\x51\x55\x12\x9d\x7a\xb4\x56\xfd\xeb\x56\x4e\xd8\x47\x40\x02\xdc\x74\x7d\xdd\x66\xe7\xb4\xa8\xa6\xde\x36\xed\x66\x6d\x57\x86\xed\x65\xd6\xa9\xa4\xe7\x9f\x55\x49\x8e\x6c\xe3\xca\x15\xe5\xf5\xd7\x58\x93\x26\xfc\x17\x96\x24\x3f\xa7\xe3\x79\xfa\xb4\x40\xad\x6e\xa3\x84\x86\x99\xe2\x2c\x5c\xae\xa3\xbe\x7b\x6b\x90\x35\xbd\x3a\x3b\x2a\xfe\xd7\x9b\x68\x4e\x8b\x63\xc1\x96\xb5\x3e\x95\xd9\x31\x80\xd7\xd1\xb9\x2a\xba\x87\x33\x5d\xd3\xb1\x3c\xef\xce\xa9\xf2\x7a\x50\x4a\x6b\xe0\x0b\xbb\xde\xc7\x52\xc0\xa4\xe6\xe3\x58\x7d\x1a\xbf\x4a\x94\xd1\xa0\x73\x2e\x4c\x49\xb5\xbd\x58\x8d\xd9\x9a\x45\x1b\xf5\x14\x1e\x3d\x2a\xcd\xea\xdb\x43\xd2\x9b\x4d\x02\xdc\x83\xea\xb5\xf1\xb1\x64\x4a\xe0\x5f\x6e\x0d\x8d\xce\x34\x67\xab\x32\x48\x98\x8d\x49\xde\x91\x58\x90\x5c\x56\x73\x4e\xf7\xc4\xce\x56\x2d\x0e\x50\xdb\x82\x8e\x45\x3f\x27\xfa\xa5\x02\x8d\x96\x65\xda\x6e\xc3\x7a\x9b\xda\xb5\x83\x57\xf8\x0c\x3d\x74\xe1\xe0\xbc\x1b\x3a\x17\xa9\xcb\xa7\x95\xeb\x7e\x75\x78\x48\x36\xb7\x2b\x02\x55\x95\x08\x73\xa9\x6e\x39\x98\x93\x36\xf6\xa9\x63\xc3\xea\xda\x76\xc7\x3f\x6b\x3f\x9d\xd6\xdb\xb5\x31\xa5\x4a\xbd\xf4\xea\x49\xca\xc3\x34\x8d\x91\x41\xc8\x9a\x82\x67\xe2\x73\xc4\xb6\x76\x11\xbf\x5d\x08\xf3\x10\x39\xf5\x38\x98\xfb\x31\x20\x51\x91\x2a\x71\x2c\xf8\x97\xec\xf0\x2e\x46\x21\x35\xda\xfb\x39\x74\xf7\x75\x9a\xfb\x8c\xf3\xe2\xbd\xab\x6f\xc7\x92\x4a\x9d\xbb\xd4\xb8\x27\xd5\xda\xf6\xdb\xca\xdd\xb3\x03\xe8\x55\xed\x89\x63\x30\x50\xb5\x29\x52\xb4\xe6\xc9\x0e\x0c\x0b\x34\xdb\x24\x42\xc7\xe3\x1c\x87\x13\x1d\x9d\xb2\x63\xf1\xa1\x50\xd6\x21\xde\x35\x4d\xb4\x29\xbc\xd7\x1e\xcb\xff\x15\x26\x2c\x56\xfb\x03\xb5\x4b\xaf\x72\x2f\x75\x9c\x1e\xee\xc6\x46\x09\xa6\xb4\xfd\x09\x4f\xa9\xd3\xba\x6f\x22\x51\x78\xac\x02\xe4\x08\xc6\xcd\xa9\xbc\xd3\xc9\x0b\xd2\x23\x7d\xb2\xb9\xdd\xf1\xc6\x38\xec\xe3\x69\x94\x8c\xbd\xa2\x2b\xe4\x85\xb5\x3a\x8d\xd6\x17\x9e\x28\xa8\xc2\x02\x83\x58\xe2\x25\xdf\x68\x04\x48\x69\x5f\xb5\xe5\x3d\x15\xec\x55\xb3\x9f\x2f\x73\x19\x6a\x88\xa3\x32\x97\xb1\x06\x08\xe3\xec\xb4\x46\xf3\xe6\x2e\xfd\xf4\xc7\x11\x90\x2f\x22\x06\x9f\x53\xd8\x3d\xbf\x48\x9b\xf4\xc9\xa7\x4a\x9b\x17\xb3\x8d\xab\x4f\x93\xb8\xdb\xdb\x7d\x88\x26\x2f\xc7\x70\x9a\x6a\x83\xe2\x3c\xf9\xc2\x16\x2f\x38\xbc\x87\x60\xf0\xf2\xe4\x77\x6d\xf0\xb2\x8e\xfc\x76\xcf\xe6\x04\x32\xa5\x74\x5d\xb3\x4f\x7c\xc0\xc6\xd0\x58\x08\xe2\x9d\xd1\x37\x90\x55\xa2\xc6\x34\x6d\x7b\xaf\x0a\xba\xa9\x13\x0b\xec\xb3\x06\xf9\x6a\x9a\xc6\xf6\xee\xb6\x0b\xd7\xd4\xb6\x3b\xf4\xdf\x65\x62\xba\x66\xbb\x8c\x85\xf3\xbf\x2d\xa9\xea\x87\x85\x5c\x68\xdc\x8a\xbd\x85\x17\xf4\x9d\x47\xef\xb6\xd6\x3c\x07\xf1\xde\x7f\x33\x16\xb4\x0c\x02\x32\xa5\x43\x9e\x45\xe8\xb8\x71\x74\x7c\x4c\x58\xfa\xab\x34\xd2\x86\x44\x23\x1b\xf7\x93\xed\xae\x29\x2d\x1d\x38\x65\xf5\x49\xb0\xdd\xeb\xfd\x8f\x93\x5a\x0e\xb9\x56\xd3\x48\xb0\x39\xe6\xff\xdd\x0c\x27\x13\x1a\x66\x61\x1a\xd1\x40\xe7\xf9\xc2\x54\x5d\x63\x7e\x49\xc9\xf7\x2c\xa3\x43\x7e\x4d\xa2\x69\x5e\xf0\x31\x8e\x52\xd7\xbf\x02\x07\xed\xda\x26\xbe\x67\xd7\xe4\xf8\xf8\x3d\x61\x79\x3e\x55\x95\x0c\xac\xd7\x5b\x4e\x0b\x23\x4f\xf9\x65\x44\x53\x02\x87\x23\x8c\x0a\x41\xd3\xfe\xdf\x94\x45\x17\xc9\x0d\x06\x95\x28\xe8\x75\x41\xa2\x30\x25\x34\x8d\xc9\x74\x42\x14\x3b\x6e\xf9\xf6\xfd\x08\x6b\x22\xbf\x08\xd8\xa0\x20\x03\xaa\x21\x09\x85\x4c\x44\xaa\xc2\x34\xa7\xd9\xb1\x5c\x1d\x37\xd5\x99\xf4\x92\xeb\x93\xa0\x67\x65\x95\xf3\x53\x6c\xa1\xbb\x1e\xd9\x99\x5c\x93\x5e\x69\x1f\x8c\x6f\xdc\xe6\xcc\x26\xda\xba\xf6\x98\xa5\xbf\x60\x03\x35\xf9\xe7\xc4\x2c\x8f\x39\x61\x05\x89\x39\xcd\xc5\xfc\x22\x9e\x24\xe1\x24\xa7\x6a\x56\x23\xd7\x07\x9f\x8e\xa5\x73\x5e\xab\xba\x45\xb2\x49\x76\xda\xfe\x30\xa2\x69\x96\x43\x62\x34\x48\x3b\x6e\x25\x46\x0c\x1e\xf5\x51\x1e\xdb\x77\xc5\x84\xc7\x23\x7e\x85\x6e\x9b\xac\x08\x72\x92\xf2\x82\x84\x29\xee\x18\xe4\x24\xd2\xb0\x0d\xf9\x0c\x75\xa2\x26\x48\xd9\x03\xde\x8b\xd9\xf9\x20\x14\x2f\x7e\xf9\xff\xdd\xde\x5e\x1b\xbc\x18\xa1\x7c\x67\x6f\xaf\x43\xcc\xff\xe0\x57\x2b\x59\x1d\x9c\xc4\xf7\x61\xcc\xc4\xb3\xab\x67\xf2\xd0\x1d\x8d\x32\x48\xd2\x66\xe1\xb4\x7e\xce\x97\x4f\x00\xba\x65\x61\x63\x66\x11\xe0\x0c\xc1\x27\xf1\x52\x70\x56\x23\xaa\xc8\x29\x67\x46\x25\x96\xe4\x78\x14\xc6\xfc\x0a\x90\x4b\xfc\xdf\xff\xea\xf5\x7a\x41\xfd\x40\xde\xbc\xde\xde\x26\x61\x96\xf1\x2b\xd3\x7d\x7f\x73\x9c\x6f\xd2\xeb\x49\x98\xba\xb9\xed\x4c\x3a\x4c\x93\x94\xb2\x94\xc0\x4e\x20\xbc\x78\x6f\x98\x8a\x0a\x67\xc1\x28\xdf\x9c\xe1\x70\x18\x66\x0c\x46\xac\x82\x31\x6c\x98\x49\xa8\xa2\x3e\x09\x68\x92\xb0\x49\xce\x72\x73\x06\x46\xac\xa0\xc7\x93\x50\x9e\xf6\xab\x2c\x9c\xe8\x6f\xdc\xd4\x1b\x41\x72\x78\xfd\x25\x61\x29\xfd\xc7\x1d\x90\xd7\x9e\x65\x39\xbd\xa4\x46\x69\xf5\x66\xb0\xc1\x59\x64\xa7\xf2\xb3\xc8\xac\xca\xc3\xa7\x07\x99\xe1\xf8\x7a\x3a\x1b\x28\x9f\xf4\xc9\x13\x7d\x6e\x6a\xd3\x22\xea\x34\x12\xfa\x24\xc9\xa3\xb5\x09\x7a\xb3\x5c\x93\x50\xb1\xfa\xaf\x38\x10\xae\x84\x47\x17\x64\x02\x50\xa8\x5d\xcb\x09\xc7\x08\x1f\x92\xc0\x09\x56\x1a\x53\xae\x89\x09\x74\x8d\x88\x60\x65\x29\xff\xd0\xb9\x42\xfb\x56\x2b\x97\xea\x89\xf2\xf3\x66\x49\x42\x04\xd6\x8c\x43\x88\x90\x92\xdc\x20\xb9\x2d\x48\x18\x45\x3c\x8b\x65\xb6\x37\x18\x21\x88\xc5\x59\x0a\x81\x46\x8a\x11\x9a\x83\x81\x17\xa5\x14\x6a\x5d\xb1\x5c\x40\x99\x84\x82\x05\x49\x68\x98\x17\xe5\xde\xe5\xec\x81\xb0\x58\x61\x2c\xa7\x05\x97\xb4\x73\xa1\x8c\x83\x7c\x02\x17\xb1\xf4\x34\x46\x0f\x4c\x3e\x99\x26\x61\x41\xed\xde\x04\x43\x29\xf3\xd9\x1d\x85\x29\x4c\x53\x50\x11\x63\x4b\x88\x8e\xa1\x67\x29\x5c\x41\x67\x84\xe5\xe8\x01\x03\x09\xcf\xce\xb0\x93\x0a\x18\xb1\xc0\x0d\x46\x88\x7f\x7d\x4f\xc3\xf8\x5d\x9a\xdc\x48\x86\x67\xf1\x68\x9c\x6e\x0b\xed\x2e\xcb\x25\xdb\x19\x37\xc6\xe6\xb4\xe0\xbe\x64\x50\x4a\x2f\xae\x94\xbe\xc8\x05\x36\x89\xe5\x93\x04\x4f\x5c\xed\x97\x82\x77\x18\x12\x56\xe4\xf8\x06\x85\x70\x6c\xe3\x49\x71\x23\x77\xed\xdf\x7c\x0a\xdc\x03\x4f\x93\x1b\xc8\x3f\x28\x70\x4d\x85\xd8\xd2\x5b\xa2\x03\x44\xb1\x9c\x9c\xc1\x06\x9e\x91\x96\x12\x33\x3b\xf9\xe9\x44\xbf\xaf\x45\xfb\x0b\xe0\xdb\xcb\x94\x9c\x01\xd3\xab\xe3\x4c\x1d\xc0\x3d\x0e\x17\xe6\x28\xbc\xa4\x32\xb0\x57\x48\xc6\x61\x41\x33\x16\x26\x9b\x53\x06\x31\x82\xd8\x90\x45\xaa\xae\x19\x06\x1c\x81\x25\x13\x23\xde\x35\x29\xe2\x6a\x13\x22\xb6\x17\x8e\xd8\xe5\xae\xa3\x59\x13\x28\x5f\x26\x5a\x97\x87\x6b\x26\xea\x9a\xc9\xa7\x28\xe8\x59\x48\x10\x57\xc8\x19\x62\x63\xc5\x10\x10\x60\xb1\xac\x85\x48\x69\xcf\x00\x75\xcf\xc8\x78\x9a\x03\xe7\x1a\xa6\xe2\xea\x0f\x6f\x80\x8a\xe8\xc8\x6a\x30\xa0\x7c\x3a\x81\xd7\xc8\x78\x9a\x14\x6c\x92\xa8\xc3\x01\xf9\x7f\xef\x01\xe3\x55\x37\x0b\xcc\x6a\x46\x44\xd9\x9a\x68\xb2\x8b\x87\x77\x7b\x4f\xf5\x3d\xa8\x09\x04\xac\xe3\x7d\xac\x03\xaa\x07\xff\x85\x52\xae\xb9\x6d\xa0\xc5\x45\x83\xc9\x39\x65\xa6\xb2\x4c\x11\xe1\xa1\x4c\x7c\x9a\x16\x19\x4f\x12\x1a\x57\xe5\x40\xbd\x6c\xec\xcd\x0a\xe0\x76\x5f\xb7\x46\x73\x18\xe7\x19\x62\xf4\xe6\x20\x6f\x2a\x6e\x9b\x7e\x11\xe3\x8b\xac\x35\x31\xe1\x1b\x04\x1f\xa3\x6f\x77\xd4\x5a\x4c\xf2\xae\x2e\xd1\xcc\x97\x51\xb5\x56\x6b\x5a\x4d\x00\x82\xca\xf8\x03\x36\x4d\xd7\x30\x76\xa1\x02\x64\x52\x90\x84\x10\xf0\x4b\x7d\xb2\x89\x8f\x86\xb0\x0b\x15\xa0\xa4\x21\x0a\x04\x7f\xea\x57\xa0\x3a\xd2\xea\xb3\x2a\x50\x00\xfa\x9c\x68\x08\x5d\xa2\x19\x55\x83\xa7\x1a\xc8\x2a\xd3\xec\xf8\x62\x7a\x60\xad\x06\xd6\xab\xdf\x90\xc8\xd0\x5e\x3b\xf1\x1b\x56\x4a\xfc\x61\x2f\x88\xf8\x9d\x4a\x51\x06\x09\xd4\x44\x55\x4c\x02\x1d\x76\xc0\x1a\xba\xca\x9d\xb7\xb5\x45\xde\xa4\x79\x41\xc3\x58\x30\x86\x67\xf2\x22\xf9\x46\x9e\x01\xe8\xe3\xdb\x33\x41\x71\xe0\x62\x85\x60\x79\xc3\x84\x5e\xb3\x01\x4b\x98\xe0\x0a\x36\xc8\xdc\xfa\x2f\x74\x49\x96\xf2\x53\xcf\x5a\xa4\x21\x3b\x20\xa2\x06\x39\xc1\x09\x07\x1f\xdb\xe2\xef\xb7\xea\x66\xff\xf9\x4d\x9f\xdc\xf0\x29\x0e\x6f\x92\xf1\x4b\x16\xd3\x58\x50\x7c\x96\x5e\x86\x09\x93\x34\x4c\x93\x4c\x86\xf7\x9d\x22\x53\x5d\xb1\x2a\xbf\x50\x19\x61\x49\x54\x53\xd1\xdf\xd5\x31\x56\xec\xb2\xba\x29\x0d\x61\x09\x3e\x76\x7f\xe5\x2c\x6d\x05\xff\x49\x83\xb6\x38\xdc\x90\xa6\xbc\x07\xab\x3a\x8f\x9e\x56\xce\xab\x51\x17\xbf\xb5\x45\xde\xf2\x5c\x27\xf2\x96\x41\x9c\x72\x02\xb1\x05\x45\x2b\x10\x32\x85\x9c\x59\xd2\x60\x64\x6c\x44\x4d\x41\x2e\xe5\x17\x6b\xdc\x90\xbe\x57\x45\x27\x7c\xf9\xd3\x1b\x22\x1e\x96\x13\x41\xf9\x39\x48\xd8\x72\xe4\xc9\x8b\x91\xb8\xa6\x07\xe2\xed\x05\x9f\x04\x0e\x1a\xf6\x1d\x4f\xef\x91\x49\xd7\xe5\x88\xad\x5d\x83\x03\xcd\xb1\xda\x08\xbb\x61\xf4\xf0\x4a\x55\x0d\x4d\xce\x8e\xb5\x80\x74\xe3\x85\x7c\xb8\x58\xd4\x03\x8f\x72\x1f\x52\x38\x6a\xe7\x0d\xf3\x9c\xa9\xa5\x74\x7d\x52\x43\xe2\x74\xbc\x85\x2a\xda\xd6\x27\x55\x44\x4d\xf1\x2c\xd5\x94\xa8\x4f\x6a\x49\x50\x9f\x34\xd1\x9e\xbe\xfd\x03\x1f\xa8\x6d\x88\xeb\xd9\x3e\xd8\xb8\xdd\xd8\xc0\xb5\xaf\x0a\x22\x60\xcd\xdf\x4e\x97\x66\xcd\x42\x17\x4b\x2e\xb8\xd9\xb2\xe4\xd4\xdb\x60\xb0\x56\x00\x7d\xb0\x9a\xb9\x6e\xcf\x4c\xda\x64\x5f\x93\x03\x1d\x4f\x99\x34\xd3\x09\xb0\x24\x58\x41\x4e\x34\xd9\x12\xb9\x6d\xb7\xa4\xd6\xf1\x7e\xd4\xc0\x7b\x6b\x45\xe2\x1f\x44\x91\xe8\xae\x62\xdd\x18\x9e\xd5\xc0\x37\x75\xed\xb5\x6c\x69\xb9\x86\xf5\x99\x57\x20\xa6\xcb\x3d\xaa\x38\x4d\x32\xdc\x3a\x47\xe2\x0a\xd0\x46\x6f\x65\x0d\xf5\x79\xd3\x0c\x89\x85\xaa\x43\x98\x27\x2e\x58\x63\x86\x21\x01\xa0\xc1\x3f\xdc\x4c\xf8\x79\x16\x4e\x46\x75\x0a\xb1\x27\xbd\x0a\xd8\xa6\xf6\x0d\xd4\x43\xd3\x5b\x7e\x36\xe7\xe4\xe5\xf5\x77\x88\xe0\x9c\xa3\x5b\x28\x04\xe9\x04\xcd\xc6\x1c\xea\x8e\x38\xcc\x2e\x40\xbf\x81\x45\x07\xb2\xbe\xd1\x99\x1c\xf1\x84\x67\xa5\xa6\xf2\x51\x18\xd3\x1c\x1e\x7f\x1f\xbb\x06\xd8\x98\xae\x54\x6b\x15\x5b\x30\x4a\xcb\x55\x52\x4a\xa4\x5f\x83\xa8\xb9\x2f\xf8\x75\x56\xb0\x30\x09\x1a\xa5\xdb\x32\xcc\x56\x16\xe6\xc5\x07\x7a\x5d\xb4\xbc\xc1\x6a\x53\x45\xaf\xbc\xef\x17\x78\x9c\x4a\x9f\x04\x82\x59\xd7\x7d\x87\x09\x3b\x4f\xdf\x14\x74\x2c\x06\x16\x51\x47\x29\x25\x00\x7f\xc9\xc2\x49\x9f\x04\x8e\xaa\xc1\x68\xf1\x9e\x4e\xae\xeb\x95\x70\xbb\x32\xec\xa6\x54\x08\xcc\xca\xe5\x8c\xc9\xb7\xb1\x25\x70\x57\x81\x65\xcb\xbb\xd3\x49\x2b\x18\xc7\x41\xdb\xb0\x70\x46\x99\xb7\xb3\xbf\xaf\x39\xaa\xf0\x5a\x16\xee\x3d\xd5\x85\xae\xae\x6a\x47\xf2\x49\x4b\x0f\x25\xe6\x57\xa9\x3f\x18\xb1\x48\x7f\xcf\xf8\x55\x9f\x6c\xeb\xe6\xa1\x01\xb9\x43\x63\x9a\xe7\xe1\x39\xb5\xb4\x20\x6a\xf5\x2a\x16\x0d\x15\x9f\x3d\x47\x87\x12\x46\xa8\x33\xf9\xb4\xfc\x46\x8e\xc3\xec\x9c\xa5\x3f\xd0\x61\xa1\x95\x51\xee\x60\xf0\x53\xf5\x2e\xba\x8d\xbc\x47\x3d\xcd\x66\x19\x76\xd5\x5a\x12\xf1\x56\xc1\xb9\xcb\x08\xe9\x62\xd6\x96\x5a\x42\x2e\xcb\xef\xda\x68\xf2\xcb\x29\x00\x56\x13\xc3\x00\xc2\xeb\x23\x82\x57\x6e\x92\x46\xfe\xcf\xbc\x4b\xb6\x36\x66\xe9\x8a\xfd\x2f\x85\x17\xd6\x20\x7c\x19\x5e\x1a\x46\x17\x83\x30\x93\x01\x18\x4b\xc2\x3c\x19\xcf\x50\x49\xf2\x30\xb3\xfe\x7c\x52\x3a\xdb\x55\xa2\xc6\x53\x42\xed\xb4\x96\x9e\xe1\xef\x3b\x8b\xbc\x70\x87\x5d\x19\x97\xe3\x02\x21\x3b\xd2\x6e\x0f\xf3\xbb\x3c\x48\x9e\xcf\x15\x3f\xcc\xf0\x75\xb0\x52\x8e\xdb\x7c\x9d\xef\x33\x31\xa2\x61\x9c\xb0\x94\xbe\x0d\x27\x13\xa0\xe7\x9f\x2c\x13\x89\xf8\x66\xbb\x8f\xc9\xe7\x7d\x03\x04\xe9\x45\x11\x26\x34\x2b\x62\x16\x26\xfc\x5c\x13\xe3\xfc\xff\x4d\xc3\xcc\xb2\xb1\x15\xff\xd1\x84\x5e\xca\xd8\x7e\x4f\x4b\x5b\xd5\xb7\x62\x63\x20\x6f\x6e\x66\xa3\x02\x43\xe2\x5d\xa6\xab\xb4\xd5\x6d\x6c\x3b\x3c\xcc\xe5\x3b\xe2\xa4\xd2\xaf\x4c\xa3\xaf\xf0\xe3\xd6\x43\x18\xf8\xd5\xb6\x6f\x33\xf2\x62\x55\x7d\xca\xf6\x74\x97\xf8\x1b\x7b\x24\x7d\x10\x46\x6c\x80\x99\xff\xed\xc6\x86\x77\x7a\x96\xb2\xd8\x57\x31\x38\x3e\xcd\x4d\x77\x1d\x8d\xef\x1f\xe2\xde\xda\x98\x83\x99\xa3\x43\xe7\x3c\x37\xae\xd0\x1c\x0c\x99\x69\x4e\xd2\x84\xc6\x4b\x6a\xde\x06\x15\x5d\xe9\xac\xef\xa7\x25\xef\x27\x60\x76\xe9\xb0\x5d\xeb\x80\xb1\xa0\xc4\xce\x3d\xa1\x28\xba\x73\xcb\xee\x49\x86\xf7\x74\x2d\xc3\x5b\x5e\x86\xf7\xf9\xc5\x66\x0f\x4a\x6a\x88\x71\xac\xd6\x62\xba\x06\x31\xdd\x9f\x57\xd6\xf5\x30\x1d\x07\x16\x19\xda\xbb\x8c\xd1\x54\xe6\xa3\xa9\x39\xd9\xcf\xe7\x1e\x9f\xdd\xd8\xbd\x89\x0a\xab\x4c\xfd\x25\x87\x68\x27\x98\xfb\x34\x9f\x10\xc4\x93\x95\x48\x09\x48\x3d\x5c\xf0\xa8\x0f\x51\x1c\x36\x41\x89\xe8\xd8\x11\x3b\x3d\xf5\xfc\xa7\x41\xf0\xa8\x9f\x84\x4d\xf5\x64\xd7\xba\xa2\x23\x26\x4a\x0a\x9a\xa1\xca\xed\x07\xb1\x15\x7d\x47\x42\xd5\x27\xda\x6d\xb7\xc9\xd9\xc1\x16\x14\xf5\x56\x2d\xd0\x39\xa6\x45\x2e\x85\x1a\x74\x42\xc2\x9c\x60\xb0\x88\x2e\x79\x93\x93\x89\x60\x14\x51\xc0\x21\x26\x5f\x29\xe6\x40\xf0\x25\xb3\x5c\x8a\xde\xd1\x05\x22\x45\x73\xda\x1b\x72\x5c\x50\xd0\x72\x83\xc9\x12\x98\xd7\xe7\x53\x29\x68\x81\xec\x7c\x62\xa8\xfe\xaa\x1a\x33\x01\x33\xac\xd2\xc2\xcf\x3d\xc0\x63\x9d\x79\xf0\x4c\x0c\xe6\x8c\xe4\xd3\xc1\xa6\x99\x3a\xc9\xa7\xd1\x48\x2c\x14\x7c\x85\xc6\xcf\x3a\xf8\x43\x32\x43\x67\x7f\xbe\x38\x9b\x5f\x44\xce\xf5\x36\xcc\x2e\x1c\xd4\x15\x9b\x94\xd0\x82\xc6\x73\x63\xaf\xae\xb1\x2c\x02\xff\x84\x9d\xc4\xfc\x2a\x25\xc3\x8c\x8f\x35\xfe\xb2\x61\x19\x4d\x59\x4e\xc2\x24\xe7\x24\xa7\x85\x3d\x84\x34\xa5\x51\xc1\x17\x4e\xf6\xfe\x7b\xb0\x6c\x2d\x6d\x91\x72\x55\xe8\x48\x6b\x7a\xb1\x1c\xb2\x0c\xe0\x06\xd3\xa2\xe0\x29\x61\x43\xac\x0f\xc7\xea\x3b\x28\x3b\x43\x83\x18\xdc\x4b\x3e\x94\x87\x73\xee\x9d\x36\x3e\x12\xcb\x6d\xf4\xcf\x39\x66\x3d\x52\xa4\x6a\xc8\x33\x82\x36\x7d\x4e\x06\x6c\x86\xc1\x1b\x66\xa4\x84\x6d\x3a\x0b\xe2\xb2\x59\x60\x90\xaf\x80\x17\x87\x20\x1a\x7a\x91\xd1\xfe\x3e\x4c\xec\x4c\xc4\x58\x72\x87\x6c\xc4\xdc\xf0\x08\x8b\x62\xaa\xc3\xab\x2c\x89\xad\x76\x1b\xab\xc1\x58\xab\xc5\x92\x55\x66\x41\x27\x55\x62\x5c\xcb\x86\x11\x7f\x1a\x3d\x8f\x77\xd4\x35\x98\xf7\x61\x55\xe6\x9b\x9a\x62\x8a\x89\xd5\x0b\x87\x35\x7d\x33\x20\xaa\xc4\x80\x48\xfa\x63\x81\xc8\x12\x4b\x4b\x09\x67\xc7\xb6\x13\xc5\x53\x2c\x01\x64\xac\x12\x6d\x23\x1a\xd3\x6b\xed\xe7\x14\xe6\xc6\x7a\x54\xfc\xd0\x82\x69\x87\x81\x95\xc1\x7b\x4c\x99\x06\x93\x98\x6b\x60\x64\xc1\x2a\x04\xdc\x68\x86\xe9\xef\x51\x83\x91\xa7\x23\x00\xd7\x4b\x89\x3f\xe4\xa2\x49\x5b\x50\x58\x1f\xb4\x03\x85\x00\x60\x24\x10\x93\x87\x80\x41\x66\x92\xf0\x53\xce\x47\xcb\xd1\x21\x10\x96\x25\xf7\x5f\x48\x9a\x4c\xf3\x13\xab\xfd\x8f\xb3\x44\x6e\x9f\x6e\x3b\x46\x68\xeb\xa3\x6a\x09\xab\xdb\x1d\x17\xef\xda\x8d\x36\x94\x65\xd1\xb1\x25\x38\xae\x93\xf6\x57\x86\x17\x9a\x25\x19\x9f\x2f\x0c\x90\x89\x74\xb3\x40\x74\x9e\x99\x11\x98\x14\xff\xeb\xd2\x83\x2a\x06\xb4\x8e\x14\x38\x5c\x48\xe9\x78\xda\x37\x97\x7f\xec\x94\x2b\x1f\x1e\xbf\xc7\xc4\x0a\x02\x84\xb7\x88\x7d\xde\x3c\x0a\x5e\x71\xd4\xec\x6b\x42\xfd\xa5\x5f\x43\x76\x34\x21\x15\x97\x4c\xe5\x5d\x32\x24\xe4\xd1\xa3\x32\x29\x7c\xf4\x88\x7c\x05\x54\xe0\xd1\xa3\x19\x4b\xae\xe9\x0e\xf9\x54\x3f\xd8\x39\x56\x16\xad\x2e\xa5\x7a\xa1\xa0\x93\x3b\xeb\x14\xe6\x78\xe4\x78\x0a\x85\xf9\x18\x4b\xbf\xd2\x32\xaa\x8b\xb9\x18\x1b\xaf\xce\x5c\xec\x80\xa3\xf0\x9c\x53\x76\xaf\x89\x6a\x43\xbb\xf3\xea\x01\x2a\xc8\xf2\x0a\x5a\xb5\x08\xfb\xef\xf8\x49\xb6\x90\x72\xe6\x01\xeb\x7a\xec\x2b\x74\x15\x9b\x6b\x5d\xc2\x7f\x84\xc7\xd4\xbc\xf3\xb6\xf8\x8d\x15\xac\xa2\xe2\x58\x1a\x1f\x31\xf3\x36\x26\xb9\x9e\x15\x0c\x4b\x33\x4a\xab\x69\xcd\xe1\xc2\xfe\x68\xef\x19\x4f\x03\x08\x97\x60\x95\xdb\x41\xe4\x39\x03\x58\xd7\x96\xed\x87\x20\x2f\x18\x5d\x64\xee\x0f\xe3\x33\xb0\xb8\x96\xb1\xdd\x12\xe3\xba\x27\xd5\xe1\xb3\xb5\xea\x70\xad\x3a\x5c\xab\x0e\xef\xd5\xc2\xff\xbe\x6d\xf1\x31\xce\x5a\x41\x27\x6f\xa2\x5a\x2d\xd7\xd3\x9d\xed\x12\x68\x63\x3c\x36\x09\xb3\xd6\x7f\x3e\x74\x25\xe3\x9c\xcd\x36\xe0\xc6\xf6\xee\xce\xdc\xa3\x83\x66\x3e\xab\xee\x73\x71\xcb\x71\x5b\xb3\xe8\xa8\x4c\x65\xd9\xa5\x20\x64\x91\x5d\xa2\x2e\x78\xad\x75\xe4\x69\xf1\x8b\x8c\x3a\xb4\xd7\xeb\xd9\x0d\x5a\x57\xff\x1c\xd0\x4b\x84\x1c\x3a\xc2\xe4\x37\x34\x33\xc3\x73\x8a\x7f\xe4\x2f\xcd\x8b\xaf\xa4\x07\xae\x55\xf0\x36\xa9\x5b\xdf\x3b\x2b\x2d\xd6\xf7\x95\xca\x2f\x0e\x99\x26\x92\xe9\x38\x0d\xe6\xd3\xd7\x16\xf4\xba\x78\x29\xf6\xa4\xce\x90\xff\x03\x9f\xd4\xc5\x31\x5b\xb5\xce\xd6\x57\xa1\xae\x15\xb8\x6e\x7c\x91\x94\x8c\x79\x5e\x90\x28\xcc\x69\x2e\xc3\x87\xb0\xf1\x04\xc3\x35\x85\x04\x5f\xa8\x44\xe6\x62\xc2\x20\x27\x05\x2b\x12\x0a\x3a\x1d\x70\xdf\x16\x1d\x3e\x00\x25\xee\x1f\xc6\x20\xd1\xdd\x9f\x23\x2b\xcc\x62\x0e\x8b\x5e\x11\x05\xe4\xcb\xa9\x95\x1d\xfc\xfe\x42\x3a\xe6\x95\xe8\x4d\xe1\xdc\x34\x28\x4f\xd1\x76\xe1\x3e\x35\xa8\x1f\x64\xb0\x36\x2b\x72\xd5\xe0\xc6\xcc\x0b\xce\x19\xd9\x24\x6c\x08\x21\xa1\x72\x6a\xa2\x0f\x89\xbf\x25\x31\xa9\xc2\x0e\x94\x7b\x2f\x76\x1c\x91\x51\x58\xf2\x38\x42\xe5\xd5\x1c\x0e\xe0\x3e\x57\xaa\x03\x2e\xa9\x6a\xd7\xda\xde\x45\xb5\xbd\x70\x16\x7c\x95\xef\xa9\x26\x20\x79\xc7\xfe\xb1\xa3\x9d\x5d\x1b\x95\xc2\x0f\x47\xc7\x3b\x5b\x81\x1b\x59\x5a\x58\xf1\x63\x41\x2d\xed\xc2\xfa\xef\x7a\xb5\xf0\xfd\xeb\x7b\x17\xd6\xed\x3a\xea\xdc\x48\xaa\x6d\x5d\x2d\x6e\x95\x0e\x59\x2b\x7c\xef\x59\xc3\x6b\x61\xa6\xe0\x14\x67\xeb\x6a\x6c\xb4\x56\x3d\x98\x0b\x46\xfd\x35\x5b\x92\x5a\xd5\x8e\xc1\x3d\x83\x98\xcb\xb5\x54\xc5\xcc\x57\xea\xa4\x17\x68\x3b\x70\xce\x54\xe0\xeb\xb3\x9d\x53\x8e\x5a\x4e\xc8\xc5\x25\x3a\x3a\x9a\x6b\xc3\xec\xee\x76\x16\xdd\x8d\x9d\x05\x95\xf1\xcb\x34\x7c\xd7\xfd\xb1\xc7\x88\xd4\x4e\x12\x41\x77\xf1\x76\xda\x5f\xca\x38\x00\x48\x59\x95\xaa\x79\xb6\x2b\x9b\x51\xc8\x2f\xe2\xcb\xe7\x3c\x62\x17\x31\xb8\xa8\x7f\xfd\x76\xc8\x57\xa5\xed\x6e\x6b\x55\xbc\xfc\x63\x46\x04\x20\x2d\x0c\x33\x41\x80\x3e\xcd\x69\x71\x50\x67\xd3\x20\xad\x0d\x22\xdb\x64\x60\xb6\x36\x5e\x8d\x1b\x27\xb0\xb4\x73\x63\x3a\x4d\x92\xf9\xa6\xae\xc7\xd6\xe4\x28\x4a\xc8\x27\xe0\x6b\xfa\x24\x00\xc7\x50\x9b\x16\xf4\xfd\x13\x6f\x25\xc0\x52\x97\x87\x2c\x68\x97\xee\xad\x79\x51\x6f\xee\xe1\x45\xe1\x44\xde\x32\x15\x9e\x96\xba\x5b\x6b\x88\xc1\x3b\x75\xe1\xa8\x41\x6e\xa8\xff\x35\x36\x11\xb0\x35\x5f\xc0\x30\x62\xa1\x77\xfd\x2a\xec\x23\x96\xb2\xc4\x58\xc6\xa8\xe2\x8b\xbc\x49\x96\x12\x11\xf8\x15\xe7\x16\x11\xac\xfa\x15\xe4\xad\xe0\xcc\x67\x8f\x6f\xc6\xf2\x60\x1e\x29\x4b\x6d\x43\x4d\xfd\xb9\x77\xe3\x7e\x1f\x49\x6b\xf3\x9f\xb5\x30\xaf\xce\xbb\x78\x6d\x7b\x74\xef\x36\x38\xd1\x12\x76\x29\x0f\x4a\xc2\xb5\x36\x10\x7a\xc8\x22\xb0\x0a\x03\x21\xe4\x08\xe7\xb1\x12\x2a\xf3\x70\x8b\x1a\x10\xe1\x4d\x5f\x67\x4f\x54\xba\xdb\x03\xa3\xed\x0c\x30\x40\xa9\x1e\xaf\x1d\xa3\x54\x15\x2e\x17\xa6\x14\xcd\x91\xf0\xb1\x75\x3f\x36\x49\xfb\x0f\x2b\x33\xe5\x6c\x23\xa3\xcf\x6f\x07\xf4\xe7\x89\x6a\x7a\x4e\x45\x71\xc1\xc5\xd1\x7c\x37\xac\x19\xc2\x7e\x0d\x78\x93\x85\x8b\x0b\xe9\x5a\x12\x1d\x85\x49\x72\x34\xa2\xd1\x45\xdd\x9c\x9f\xd7\xc0\x37\x4d\xd5\x6b\xd9\xb4\x00\xcf\x5e\x78\x45\xd7\x75\xb7\xdd\xab\x82\x6e\xec\xcc\x6a\x54\xd7\x9d\xf0\x3c\x67\x83\x84\x1e\xf1\x34\x2f\xb2\x69\x54\xf0\xec\x3d\x08\x9e\x6a\xfb\xdd\x9e\x5d\xb7\x69\x14\xf5\x1d\xea\x76\x65\xe8\xd8\xfa\xa9\x97\x41\x9b\x7a\xd4\xcd\xdd\x6f\x7e\xcd\xcf\x61\x9a\xf6\x21\x0b\x53\xf4\x76\xaf\x23\x28\x4f\x2b\x60\x1b\xcd\xc6\x34\xd4\x67\xb5\x7f\x2b\x74\xb7\xb5\x9d\x3c\xf9\x3c\x39\x74\xab\x43\x15\x9b\x65\x59\x26\xea\xc5\x07\x0c\xe4\xba\x92\xc8\x17\xd0\xd6\x0a\x8d\xbe\x1e\xa4\xb5\x9c\x59\x6e\x41\x0c\x07\x61\x74\x51\x77\x86\x7a\x73\x8f\xb1\xa2\xcd\xcf\x63\xa4\x16\x59\xd6\x5a\x52\x8c\xa8\x72\x2d\xea\x74\x70\xf5\xd9\xed\xcc\xc9\x50\x36\x51\xd6\x59\x91\xf2\xd0\x56\x80\x0d\x06\x6d\xdb\x02\x0b\x4c\xab\x6c\xbb\x32\x9d\xe1\x11\x42\xa4\xda\xa0\x32\x21\x82\x01\xdd\xda\x22\xff\x10\x2b\x54\x70\x72\x4e\x0b\xa3\x7f\x05\xbb\xa3\x90\xa4\xf4\x1c\xf3\x90\xa0\xc1\x96\x00\x4b\x79\x01\x2c\x27\x1b\xa2\x59\x02\x76\x06\x5c\xec\x54\x4a\x66\xaa\xcd\xf4\x2a\xc6\xf1\x26\x75\x56\xab\x22\x45\xe9\x52\x16\x60\x06\x03\x5e\x4d\xb3\x26\x53\x4c\x37\x39\x4e\xb3\x07\x7a\xf3\x7b\x02\xd3\x8b\x17\xb4\x3e\x15\xbc\x72\x64\x27\x84\x5e\xb3\x7a\x99\x1d\x82\x6d\x40\xf4\xdd\x86\x11\xb7\x30\xc3\x4a\xf0\xb1\xfd\xb1\xbd\x62\xf3\x38\x30\x25\x83\x74\xac\x0b\x9a\xad\x44\x18\xcb\x83\xa4\x82\x48\x60\x9e\x32\x95\x7b\x34\x5e\x9b\x86\xdd\x97\x69\xd8\x83\x09\xb7\x2b\xb7\xf3\x18\x6d\x05\x97\xc8\x29\x85\x35\x67\xe4\x92\xaa\xc0\x3a\x75\x77\x4f\x73\x99\x2e\x4b\xac\x00\x84\x2e\x17\x98\x28\x73\x7c\xbd\x86\xcc\xbe\xc6\x96\xb1\xe0\x90\xe9\x2b\x24\xaf\xde\xbd\xd5\x99\x71\x64\xaa\x2d\xc7\x76\x0a\x3a\x51\x4f\x62\x9d\x38\x30\x24\x67\x68\x3f\x76\xe6\x5a\xad\xc9\x78\xab\x4b\x79\xd2\x7d\xd0\x11\xdf\x97\xf7\xa6\x83\x36\x56\xea\x51\x27\x4a\xdb\xe5\x65\x97\x64\x5f\x66\xef\xd1\x57\x1f\xda\xb0\x56\x1d\x7b\x55\xa4\x32\xb8\x2e\x60\x5e\xd8\x9c\x78\xcf\x5c\x93\x84\xa5\x76\x58\x91\xf9\xf5\x22\x8d\x66\x5d\xe9\x6b\xa4\xeb\x8b\xed\x69\x15\x67\xb3\xe4\xd6\x56\x34\xb5\x9a\x1d\x2e\x37\x3c\xc3\xc8\x4e\xae\x05\x46\x7d\x5f\x2f\x87\x5c\x0e\xc1\x7a\xad\x57\x43\xac\x06\x30\x36\xeb\xa5\x90\x4b\xb1\x3e\x26\xb8\x1a\xc0\x8c\xdc\x89\xcb\x80\xf7\xd0\x42\x2d\xc0\xa5\xad\x98\x7f\xc5\x13\x98\x9b\xa2\x43\x58\x4a\xc6\x2c\x49\x18\xe6\xdd\xb6\x33\xa2\x8e\xc3\x1b\x99\x51\xf7\x06\xb2\xc9\xa5\xe7\x09\x25\x05\x1b\x53\x3e\x2d\x30\x1b\xa7\x73\xe9\xe4\x1d\xc1\x36\xb0\x34\x66\x97\x2c\x9e\x82\x4b\x07\x3e\x9e\x40\x2c\x41\x23\xc9\x46\x18\xdf\x8f\x82\xcb\x87\x99\xf8\xcb\xcd\x8d\x1d\x85\x49\x24\x13\x4b\x9b\x4b\x4d\x74\x4d\x06\xa1\x60\x6e\x78\x2a\xef\x5d\x73\xcd\xc9\x81\xcd\x93\xfc\xf3\xae\xef\x9b\xf9\x5f\x38\xf3\xbd\x71\x64\x8e\x91\x39\x5f\x39\xfa\x11\x78\x24\x39\x09\xfb\x65\xde\x3a\x05\x6c\xfd\xab\x16\xe4\xe0\xf3\x1c\xf4\x17\x5a\x54\x68\xb4\x17\xaa\x89\x0e\x29\xd5\x03\x13\x3c\xdd\xae\x02\x6c\xa9\x48\x38\x96\xb3\xab\xfe\x59\xd0\xf1\xa4\x43\x4e\x8b\x11\xcb\x41\x45\x54\xc8\x8f\xc6\x0e\xce\xc8\x84\xcd\x18\x10\x5c\x75\xd0\x96\x75\x04\x7e\xb5\xa0\xd5\x04\xac\xa0\xc3\xec\x7c\x0a\x69\xc7\xbb\x09\x4d\xcf\x8b\x51\x47\x94\x88\xe7\x1b\xe4\x5d\x6d\x09\x28\xb1\x86\x17\xf4\x86\x1c\x92\xde\x01\xfe\xf5\x0d\xd4\xc6\x1f\x8f\x1f\x9b\x20\x3e\xa2\xea\x89\x28\xfc\x68\xb7\x8c\x25\x32\x3c\x0d\x8e\xc2\x98\x20\x82\x16\x08\x66\x88\x7f\x8c\x58\xae\xf4\x42\xf5\x52\x60\x7f\x92\xca\xfc\x49\x4d\xb6\x7b\x2a\xa8\x49\xc1\x4f\x4f\xc9\x6f\xbf\x61\x63\x9e\xac\xbe\xbc\x55\xed\x36\xa8\x90\xba\xe2\x4d\x73\x23\x15\x8e\x27\xa2\xf9\x8f\xdd\x88\xa7\x51\x58\xb4\xc4\xec\xda\xa0\xa5\x13\xc5\xea\xdf\xae\xca\x01\x79\x88\xe6\x70\xb2\x54\xa0\x55\xa5\x98\x40\x2b\x74\x14\xe4\x28\x4c\xe3\x84\xc2\x45\xef\x60\x9c\x78\x5b\x98\xa5\x85\x97\x06\x10\xba\xae\xe4\x8c\x0f\x65\x7d\x65\x5f\xee\xb0\xbf\x72\xb7\x09\x61\x43\xb9\xaa\x12\x4e\xb2\x14\x6d\xcb\xf0\xb0\xe2\x33\x76\x7e\xa0\xcc\x04\xa5\x64\xa5\x3c\x60\x78\x88\xd5\x8e\x19\x91\x77\xc4\xf2\xbf\x4e\xa4\x4c\xc0\xea\xca\xd8\xc6\x69\x1a\xa3\x00\x10\xbc\x2b\x4b\x1d\x40\x41\xa7\x7d\x30\x51\xa6\xe7\x2b\xfa\x94\x3b\xf2\x0f\x77\x9d\xd4\x3e\xbd\x70\x7f\x77\xa3\x84\xd1\xb4\x90\xc0\x7d\x99\x84\x54\x2d\x9d\x1e\x99\xb8\x24\x81\x54\xd8\x2b\x27\x3a\x53\x97\xc0\x8e\xce\x8a\x65\x8b\xd5\xce\x69\xf1\x72\x5a\x70\x6c\x5d\x61\x41\xcb\x19\xa0\x5e\x66\x67\x93\x8b\x2a\xdc\x31\x7d\x3d\x26\xc1\x38\x0f\x0e\xbc\x3d\xac\x45\x3a\x5d\x51\x6f\x29\xa1\x49\x4e\x71\x8a\xc8\x40\x38\x33\x45\x02\xea\xcc\x75\xd6\xd8\x54\x7d\x77\x64\x76\x3f\x08\xb0\x44\x9b\x5d\xb8\x16\xaa\x5b\x36\x8d\xc9\xac\xad\xca\x7c\x12\xdf\x6e\x57\x61\x26\x5e\x6d\x18\x8b\x31\x0a\x73\xda\xd5\x38\xdd\x70\xb0\x5c\x04\xc2\xe4\x5c\xb3\x4e\x14\x48\x16\x1a\x0f\x15\x4b\xcf\xe7\x3d\x57\xe0\x16\xb2\x08\x29\x40\xdc\x9c\x35\x46\x1a\xcf\x18\x22\x8d\xe7\x19\xe1\x35\x2b\x66\x9c\xfa\xbb\x9e\xc0\xd5\x6d\xcd\x35\x2b\x1a\xe6\x7c\xcd\x8a\x39\x27\xbc\x10\xa5\xdb\x59\x90\xd4\xed\xcc\x49\xeb\x76\xd6\xc4\xee\x4f\x40\xec\xae\x59\x4d\xc3\xf7\x42\xeb\x96\x64\x22\xf0\x48\x34\x1f\xad\x59\x04\x2f\x8c\xe3\xd7\x69\xfc\x03\xcb\x0b\x9a\x56\x30\x3f\x1d\x92\xd2\xeb\xc2\x3d\x64\xe6\xf8\x58\x19\xc3\xab\x86\xd8\x8c\xcb\xde\x29\xac\xc3\xa5\xdf\x7e\x33\xc4\xa8\xb4\x07\x7e\x1b\x4e\xbf\x07\xfe\xd2\xe7\xb4\xf8\x80\x9f\x5a\x62\x56\x1d\x55\x5d\x85\x6d\xec\x20\x9b\xaf\x2c\xe1\xe6\xe1\x7d\xad\x07\x01\xb4\x02\x7d\xe1\x9b\xc0\xb2\xdb\xa8\x7a\x94\x9c\xe0\x2c\x2e\xe8\x4d\x5f\x25\xb6\x97\x6a\x42\x69\x8f\xa4\x37\x02\x3f\xb6\x2a\x28\x1d\x92\x00\x96\x3b\xc4\xe8\x54\x31\x7a\xd5\xc4\x0f\xb5\x3e\x62\xc5\xa4\x27\x22\xfc\xb6\x21\x2c\xff\xcc\xd3\x6a\x07\x4d\xe2\x38\x69\x9e\x56\x7a\x69\x12\x2f\x4d\xdb\x69\x8d\x9b\xa6\xf8\x4f\xbf\xcc\xa4\x47\xe7\xa9\xf1\xd7\x84\x62\xa7\x4d\xf7\x7c\xd8\xd0\xce\x07\xbb\x8e\xbc\x59\x0d\xac\x2c\xa8\x80\xc1\x3b\xe6\xd4\x67\x1a\x2a\x20\x81\x3f\x38\xf5\xae\x6e\x0f\x0e\x6f\xe9\x53\xfb\x40\x96\x21\xfc\x2e\xb1\xc8\x86\x43\x4d\x8f\x86\x81\x9f\x35\x17\xda\x6c\xb6\xdd\xe2\xd8\x9d\xb1\x2c\xe6\x3f\x7a\x6a\x1c\x48\x01\x81\x16\x71\x20\x85\x3d\xc5\x1f\xce\x96\x81\x53\x28\xae\xa4\xf5\x27\x4b\xcf\xad\x5f\xe8\x6d\x8a\xab\x64\xfe\x92\x30\xb0\x30\xe2\x0f\x39\x7f\xf8\x53\x4c\x54\xbb\x98\x92\x86\x30\xb7\x75\xde\x48\xc6\xd4\xa6\xec\x8d\x34\x33\x0e\xae\x51\xb3\x96\x0f\x9a\x23\x69\x2f\xbf\xea\x2a\x40\xcb\x70\x95\x88\x59\x06\xab\xc2\xcc\x52\xbf\x65\xc4\xd3\xe2\x5e\x17\xca\xa1\x27\xce\x05\x22\x41\xdd\xc2\x12\x2a\xf7\xeb\x5d\x19\xc7\x2c\x55\xca\x23\xff\xa4\xdf\x76\xb0\x76\x5b\x37\xe7\xb9\x38\x8a\xff\xcc\xf5\x95\x17\x61\x41\xed\x0b\x67\xd1\x9d\x27\x3e\x65\xea\x38\x9f\x3e\x39\xbf\x16\x74\x8e\x8c\x96\x71\x8c\x94\x36\x20\x62\x19\xc2\x42\x6a\x11\x65\x59\xd0\x2e\xa5\x4d\x34\x8b\xe4\xfc\x5c\x60\xf2\x9e\xa7\x61\xdd\xc4\x49\x95\x03\x9e\xe4\x38\xfd\xba\x62\x0f\x86\xce\xdd\x36\xf4\xd8\x78\x67\xac\x70\xc9\xd9\xd2\x1d\x1e\xd3\x83\x12\xe0\xad\x57\x72\xeb\xf7\xba\xd0\x9c\x6b\x66\x5d\x93\xd2\xd1\x36\x72\x29\x77\x5c\xf2\x8b\x54\xff\xb9\x5b\x64\xff\xb2\xb8\x73\x35\x2f\xc5\x9f\x08\xfe\xe2\x23\xfc\x90\x88\xac\xb8\x89\x83\x8d\xdb\x56\x29\xf8\xb7\x2d\xed\xd4\x42\xb9\x2a\x33\x76\x49\x9f\x1c\x5b\x75\xa9\xe2\xd6\x2b\x51\xd2\xec\x06\xbd\x09\x06\xe5\x32\xb2\x69\xfb\x19\xa2\xf8\xff\x6e\x5e\x84\x69\x1c\x66\x90\x1b\x76\xa9\x84\x7b\x1b\x04\x44\xed\x1f\x50\x3b\xa0\xb2\x8d\x9a\x2c\x7c\x6a\x6a\xc1\xc6\xad\x25\x48\x3c\x28\x19\x99\x3f\x5f\x07\xbe\x5c\x07\xbe\x7c\xa0\x81\x2f\x6d\x77\xe3\x6a\x55\x49\x09\xb2\xa9\x71\x0d\xf4\x87\x8b\xac\x39\xa2\xc9\x84\x66\xb5\x93\xf8\x3c\x56\xc5\xbf\x77\x7b\xdc\xdf\x81\x1d\x33\x64\x0c\xbb\x2e\xe4\x0d\x55\x84\x83\x99\xba\x65\x3f\x0d\xf9\x22\xc6\x92\x18\x49\x71\x86\xf9\x68\xeb\x44\x47\x70\x84\xa7\x0e\x8d\x2e\x06\x1c\x12\x98\xc4\x34\xcd\xe1\xd5\x91\xf2\x54\xbe\x34\xee\x6a\xaa\xf9\x61\x44\x71\xd6\x24\xa2\x49\xa2\x8c\x2e\xf3\x07\x60\x60\x79\x7f\x09\xd4\x1e\x8c\x8d\xe3\x02\x46\x6b\x9f\xc3\x36\xf1\x4f\x65\x75\x68\x59\x01\x2a\x4b\x63\x19\xd8\x8f\x9d\x83\x65\x3a\x2c\xad\x6b\x1d\x91\x4e\xc7\x34\x63\xd1\x22\xa9\x0c\x55\x6c\x50\x19\x44\xd5\x46\x30\x30\x3e\xa4\x89\x15\xe7\x52\x02\x35\x5b\x5f\xcc\x4f\x1e\x04\x79\xba\x8f\x80\xb9\x03\x9e\xc5\x34\xfb\x8e\x17\x05\x1f\xf7\x49\xb0\x3d\xb9\x26\x39\x4f\x58\x4c\x02\xf2\x58\x2a\x0a\x26\x61\x42\x8b\x82\x76\x05\x6d\xed\x26\xa0\x21\x60\x97\x2c\x36\xcf\x34\x3b\x9a\x6b\x42\x87\x6e\xb0\x5a\xbd\xce\x55\xb1\x5f\x33\x14\xe0\xc8\x2f\x7e\x48\xd9\x8c\x5f\x6d\x66\xf4\x92\x66\x39\x0d\xc8\xd6\x16\x89\xc2\x94\x0c\x28\x89\x6f\xd2\x70\x2c\xcd\x62\xb4\x9f\x0e\x09\x0b\x92\x4d\x53\xb4\x88\xb9\xd1\xb4\xcf\x1e\xc9\x88\x86\x35\xe1\x78\xa5\x42\x44\x07\x90\xe9\x9a\x8f\x6f\x69\xcc\xa6\x63\x35\xc2\xaa\xc4\xa2\x62\x64\xbf\xf0\xec\x22\xcc\xf8\x34\xc5\x93\xfc\x81\xf3\xa4\x60\x13\x0d\x2e\x90\x85\xe5\xf9\x54\xca\xf5\xe5\x78\x24\x86\xbc\x52\xbc\x82\x17\xa3\xb7\x32\xfe\xed\x16\xd9\x41\xd5\x99\xb5\x3f\x5e\x80\xdc\x67\xcd\x00\x73\xb4\xb0\x2b\xb5\x73\x6a\xd6\xf3\x26\x6d\xad\x6e\xcc\xd3\x20\xb8\x53\x4f\xf3\x05\x82\x13\xeb\xd6\xdc\x56\x8e\xe4\xb1\xa9\x58\xc1\xa0\x47\xb6\x77\x26\xae\x83\xc9\x90\xf3\xc2\x76\x2d\x71\x4f\x40\x29\x25\xac\x3e\x56\x1f\xc4\xcd\x7a\x44\x93\x44\x45\xc1\x8b\x90\xdd\xa8\x8c\x70\x78\xe0\x44\xa6\xbb\x7b\x54\xc2\x59\xc1\x0f\xe5\x29\xd3\xdf\xe5\xef\x8e\xbb\x20\xfa\xb3\xfc\x6d\x07\x3d\xc4\xcb\xc8\x0e\x7a\xe8\x08\xd1\x97\x0d\x14\x58\x2b\xd1\xb5\xa4\xbe\x72\xb0\xe2\x4f\x39\x30\x57\xe6\xfb\x51\xc7\x8e\x43\xee\xe6\x50\x2d\x7d\x17\x7e\xeb\xb5\x3e\xb2\xa6\xa1\x94\x4c\xa8\x5f\x8a\x5c\xe3\x2f\xe2\x80\xea\x8f\xa0\x8a\xb1\x95\x45\x36\x14\x76\xfd\xe8\x11\xfe\xd1\x15\xc4\x84\xbc\x20\x41\x31\x0a\x48\x9f\x04\x45\x1c\x68\x45\xce\xb2\x01\x09\x57\x13\x7a\x50\xed\xbc\x42\x89\xa5\xc2\x05\x9e\xe8\x8d\x20\x8f\xb1\xba\x7c\x43\x75\xa3\x70\xc2\x8a\x30\x61\xff\xa5\xdf\xb3\x2c\x2f\x7e\x10\x37\x43\xd6\x6e\x49\xf0\xf6\xc7\x8e\xc6\xb5\xaf\x40\x43\x2b\x6e\x2f\xb1\x6a\x4e\xa9\xba\xf3\x96\x0b\x65\xe8\xd2\xcd\xaa\x0e\x97\x6b\x57\x6c\x69\xa7\x6a\x9f\x97\x6b\x0e\xe9\x4c\xa9\x41\x2c\xf6\x82\x23\xde\x31\x15\xe0\x91\x7b\x5a\xef\x14\xf1\xcf\x12\x3d\x62\x7c\x33\x4d\xf7\xee\x1c\xdf\x6c\xa9\x88\x63\x2b\xe6\xa3\xbc\xd6\xe7\xe1\x02\xfd\x10\x68\x7f\x84\x47\xd4\xdc\x41\xa8\x7e\x0f\x71\x87\x94\x66\xf0\x8f\xf6\xc8\x99\x77\x0d\xcc\xfd\xb9\x82\x48\x3d\xe6\x06\x5e\xcd\x81\xf3\x62\xe3\x18\x6a\x52\xa1\x54\xd0\xa7\x51\x6b\x15\x0c\x27\xa7\x13\x61\x08\xa6\xcc\xb4\x22\x39\x01\x45\x96\x6c\xc1\x8f\x91\x7a\x6a\xda\x59\x2d\xf5\x59\x4a\xc3\x60\x29\x13\xf4\x68\x02\x72\xdb\x6e\xe9\x5f\xf7\x13\xf7\x66\xbb\xf7\xb0\xe2\xde\xdc\xa7\x80\x7b\x9a\xd5\xc9\x1a\x77\xf6\x1d\xa8\x46\xb9\xf6\x34\xa3\x26\xa9\xd1\xe5\x79\x43\x8a\x9b\x9d\x3d\x1f\xb0\x31\xf9\x11\x82\x7c\x9e\x98\x14\x5f\x7f\xfd\xff\xb3\xf7\xae\xe9\x6d\x23\x49\xa2\xe8\x7f\xaf\x22\xcc\xe9\xb2\x00\x09\xa2\x48\x4a\xb2\x65\xc9\xb4\xc6\x25\xdb\xdd\x9e\x63\x97\x3d\x7e\x54\x57\x0f\x9b\x23\x81\x44\x52\x42\x89\x04\x58\x00\x28\x91\x65\xeb\xfb\x66\x21\xe7\x2e\xe3\x6e\xe0\x2e\x65\x56\x72\xbf\x8c\xc8\x27\x5e\x22\xf5\x70\x57\x9f\x33\x35\xd3\x16\x98\x8f\xc8\xc8\xc8\x88\xc8\xc8\xcc\xc8\xc8\x07\x7a\xff\x09\x36\xd5\x33\x21\xd6\xbe\xcf\xfa\x96\x3a\x79\xe0\x78\xd7\x1a\x0e\x6b\x53\x3f\x3b\x5b\xe3\x8c\x1c\x70\x2e\x6e\xef\x36\x77\xda\xd0\x7e\xdc\x6c\x3d\x1d\x6f\xee\x34\x77\xf7\xf8\x3f\x4f\x41\x7d\xbd\x6d\xef\xc0\x6e\x73\x77\xbc\xf9\x18\xf0\xff\x7e\xe7\xbc\x2e\x88\xf5\xbf\xd8\x62\x10\xfb\x49\xf0\x22\x49\xe2\xcb\xb7\x6c\x64\xf9\x98\x16\x32\xcd\xb8\xf0\xcb\x9b\x38\x6a\x40\x6c\x6f\x0a\xc3\x51\x89\xf7\x5a\x18\x2d\x07\x0f\xca\x50\x22\xf7\x2c\xce\x2d\x5a\x9c\x0b\xe5\xdc\x92\xba\x56\x58\x2c\x42\xa3\x3c\x28\x56\xa1\x66\xe1\x40\xb1\xdd\xfe\x1f\xe9\xfd\x1f\xe9\xbd\x73\xe9\xdd\xe3\xb2\xda\x7e\xdc\xdc\xde\x19\x2b\x89\xdd\x34\x64\xb7\x05\xbb\xcd\x27\xbb\xe3\xc7\xf0\x78\xb3\x4e\x76\x3f\x0a\xdf\xb8\x72\xe1\xc5\xdc\xef\x2f\xbd\x12\xa9\x6b\xc5\xf7\xa3\x70\x53\x2e\x26\xde\x4c\x80\x3f\x0a\x4f\xda\x9c\x04\x77\x6e\x25\xc1\xe8\x8b\xcd\x06\xf1\x2c\x1a\x56\x49\xc7\x6e\x47\x06\x5f\x4f\x49\xbe\x2b\xca\x6d\xef\x09\x87\x05\x78\x95\x24\x71\x02\x13\x96\xa6\xfe\x29\xde\xb8\x4f\x33\x3f\xca\xd2\xa6\x64\xa9\xd7\x5f\x7e\x3a\x3a\x7e\xf5\xf1\xe3\xfb\x8f\xc7\x9f\x5f\xfd\xf2\x99\x93\xe1\xd5\x7c\xca\x86\xb8\x6f\xaa\x46\x7b\xed\x40\x71\xea\x11\x0e\x61\x0a\x3e\x64\x67\x49\x9c\x65\x63\x16\x68\xa6\xc8\xce\xfc\x0c\xe2\x08\x77\x5f\x2f\xe2\x73\x96\xc2\x09\xcf\x3b\x01\x3f\xa3\xa7\xa2\x62\xde\xb7\x29\x4b\x38\x24\x76\xc1\x92\x05\x9c\x5c\xfa\x61\x76\x62\x5f\xab\xa4\xe3\xaa\x22\xf8\x61\x3c\xc1\x87\xa6\x30\xca\xcc\xc9\xd0\x8f\x86\x6c\x7c\xc2\x41\x4d\x58\x76\x16\xd3\x71\x0e\x26\x42\xc0\xe8\x15\x1c\xd1\x3c\xc7\x66\xe8\x53\x00\x29\x3f\xe2\x3d\x3b\x19\x8d\x67\xe9\xd9\x89\xae\xc9\xc1\x84\x93\x09\x0b\x42\x3f\x63\xaa\x03\xb8\xd5\xd8\x84\x0f\x49\x7c\x11\x06\x0c\x4e\x28\x80\x62\x7a\xc2\x9b\x0a\xa3\x20\x1c\xfa\x19\x83\xcb\x33\x86\x5b\x60\xd4\x18\x07\x94\x9e\xc5\xb3\x71\x00\x03\x26\xc0\xe0\x25\x4c\x7c\xf1\x8a\xf9\x74\x3e\x10\x05\x5b\x71\x02\x59\xe2\x87\x63\xfe\x9b\x05\xa7\x4c\x86\x45\x20\x8a\x70\x30\xd2\x7b\x1c\xe9\x21\xbb\x92\x2a\x98\xea\x99\x2f\x7c\xe4\x43\x5d\xcd\xe3\xb2\xc3\xb1\x95\xa7\x0f\x08\xa9\x40\xcc\x26\x7c\x9a\x0d\x52\xf6\xdb\x8c\x45\x19\x70\x7b\x33\x95\x87\x15\x25\x84\x17\xe2\x2c\x80\x25\x2c\xe5\x32\x21\xd0\xc5\xc6\x0b\x74\xe6\x4a\x8b\x97\x5d\x5f\xff\x29\xce\xd8\xfe\x3a\x9d\xc4\x88\xee\x9f\xe0\x20\x9c\xc8\xde\x9f\x88\xb8\x94\x29\xf8\x09\x53\xc7\x35\xaa\xbf\x38\x32\x36\x19\x4b\xe9\x26\x9d\x56\x89\xff\x46\x15\x7d\x41\x68\x9a\x86\x13\xae\x75\xb3\x33\x3f\x22\xd6\x0c\x66\x74\x96\xa6\x86\x41\x8d\x81\xe8\x0f\xef\x05\x65\x84\x29\x9c\xb4\x44\x4f\x54\xbf\x78\x22\xae\x50\x8c\x0e\x28\x9a\xf0\xdc\x80\x8d\x58\xc2\x57\x17\xb0\x0e\xb3\x28\x0b\xc7\x92\xea\x11\x9b\x67\x90\x85\xc3\x73\x0f\xd2\x70\x12\x8e\xfd\x84\xe7\x9c\x68\x17\xf3\x13\xc9\xf8\xaa\x9f\x23\x8e\x80\x44\xec\x13\x63\xd0\x7b\xe9\x5f\x84\x01\x1c\xc5\xc9\xc0\x1f\x9e\xc5\x6b\x9c\xa0\x59\x38\x1c\xb3\xbe\x73\x96\x65\xd3\x74\x7f\x6b\x6b\x98\xa6\x9b\xdc\x48\x38\xc7\x8d\xdc\x2d\xa1\x6f\xc2\xe8\x74\x53\x90\x8a\x7f\xb2\xf9\x74\xec\x87\x11\x0b\x36\xd9\xdc\x9f\x4c\xc7\x2c\xdd\x72\x79\x1b\xa3\x98\x6b\xa8\xcc\x0f\xc7\x29\xc6\xa4\x42\xc4\x83\x70\x34\x62\x09\x8b\x86\x2c\x85\x01\xcb\x2e\x19\x8b\xe0\xe4\xb8\x29\x29\x2f\x28\x74\xdc\x94\xaa\x4d\x61\xfc\xaf\x69\xe6\x67\xe1\x10\x3f\x27\x6c\x32\x60\xc9\xfb\x11\x1c\x53\x4e\xc8\x07\xa3\xd5\x6c\x37\x5b\xf8\x9b\x8b\xd9\x69\x9c\x2c\xe0\xb5\x31\x8a\xff\x3a\xf5\x13\x7f\x02\x5f\x65\xda\x15\x8e\x31\xca\x8a\x56\x48\xb1\x62\x81\xa6\x59\x87\xae\x87\x5c\x41\x8f\x8f\x65\xb7\xd5\xc7\x5a\x94\xc8\xe9\x6a\x6a\x23\x13\x86\xa5\x48\xb2\xd8\x02\x49\x0a\xf9\x0a\x7a\x82\x99\xbb\x5f\xaf\x08\xac\x64\x6e\x75\xb1\x5b\xd7\xe1\xab\x6f\xe6\x47\xba\x52\x53\x70\x52\x97\x0b\x41\x9f\x17\x85\x4f\xe2\x56\x39\x72\x2c\x67\xce\x9c\x2a\x29\x11\x81\x6b\xda\x90\xd2\xb3\x44\x23\x75\x82\x46\xad\x90\x6a\x48\xcd\x61\xf8\x28\x92\x88\xad\x2f\xcb\x94\x0f\x56\x15\xcc\x25\xd8\x61\x6b\x0b\x5e\xe0\xd6\x3c\x9b\x0f\x59\x9a\x86\x17\x5c\x0b\xcf\xa6\x81\x9f\x49\x89\x94\x67\x66\x70\x79\x16\x8e\x19\xa4\xc3\x24\x1e\x73\xe4\x10\xda\xaf\xff\x3e\x63\xc9\xc2\xb9\x0c\xa3\x20\xbe\x74\x9b\x71\xe4\xac\x51\x81\x35\x0f\x34\x37\x3a\x08\x90\x7d\x88\xe5\x8d\xfe\x76\xab\x85\xef\xcf\x48\x14\xde\x90\xda\x3f\x49\x58\xc4\x2e\x3f\xc7\xe7\x2c\x3a\xa1\xe8\x34\x78\x8c\x3b\x0e\x87\xe7\x7c\xde\x8a\x32\x2e\xcb\x23\xdc\xf7\x83\xc1\x2c\xc3\xf8\x66\x39\x55\x42\xd3\xdb\x2e\x4c\xc2\x68\x96\xb1\x14\x91\xc4\x83\x0a\x45\x8d\xae\x89\x98\x6e\xd0\x83\xed\x16\xff\x8f\x9b\x70\x6b\x72\x00\xd6\xc4\xce\x07\x9a\x67\xba\xbb\xe2\x9c\x9f\xfa\x8b\xe8\xad\x79\xba\x05\xb3\x63\x47\x34\x31\x5a\x83\xaa\x51\xb1\x15\x77\x19\x31\xa7\xf1\x14\xbd\x84\x4d\xf8\x4d\x9a\x6d\xb1\x99\xad\x07\x86\x15\x20\xfa\xc4\x53\x3c\xe0\x22\xe6\x49\x29\xd0\x47\x62\x92\x7f\xbb\xca\x07\x13\x28\xa0\x1d\xe1\x46\xc9\xb8\xdb\x6d\xdc\xf1\x42\x09\x7f\x68\xee\xc8\xc9\x63\x1b\xde\xe8\x25\xb2\xdb\xe7\xc5\x94\xa1\xd9\xe3\xe4\x8c\x1b\x71\xa1\x86\x00\x4a\x0b\xca\x91\x88\x49\x40\x1a\xaf\x35\xf1\xb9\x06\x61\xa4\xa4\xf8\x10\x1e\x3e\xcc\x09\x2b\xec\xcb\x4a\xe4\x57\x6b\xf4\x41\x8f\x5f\x15\x0c\x55\x78\x5f\xd5\x93\x68\x8a\x59\x57\x2a\x4e\x8b\x9c\x84\xab\xc2\x50\x61\x40\x74\x5c\x9b\xf8\xf3\xbf\xfa\x61\xb6\xb6\x4f\xc5\x29\xd1\xe0\x25\xf9\x89\xe1\x14\x70\x2f\x9f\xcc\xd4\xa6\xb0\x52\xf1\xb6\x0f\x8d\x22\x5f\x4c\xe6\xec\xdc\xed\xff\x71\x7d\xfd\x67\x72\x7d\x4d\xd8\xe8\x80\xab\x00\xb8\x64\xfe\xf9\x3f\x7b\x50\xdb\xff\xab\xbc\x42\xef\xda\xa5\xc7\x70\x52\xf1\x07\x69\x3c\x9e\x71\x7d\x2e\xf2\x64\xfc\xcf\x8e\xa7\xbc\x1f\x84\xdf\x83\x4c\xb0\x22\x6d\xae\x14\x81\xd4\xd5\x20\xc6\xe3\xa3\x33\x3f\x3a\x65\xc2\x21\xc8\x23\xa8\x96\x1b\xc6\x30\x1e\xc7\xc9\x8b\xe1\x10\xdd\xd3\x94\x2f\x86\x3f\x3c\x3f\x45\x3f\x9a\x23\x9e\xbd\x9f\xf3\x40\x22\x63\xcd\x4f\x16\xcd\x17\x9d\xfc\x7b\xdb\xe3\x38\xf9\x90\x84\x13\x3f\x59\x2c\x0d\x6e\x4a\xe5\x7b\xbb\xad\x56\x3f\xef\xf6\xb1\xca\x9b\xe9\xb4\x44\x8c\x93\x4f\xe2\xc2\x1d\x6f\x9e\x77\xfb\x9a\x28\x37\xb9\x73\x45\x41\xf8\x65\xab\x48\x87\xb0\xe5\x1d\x46\x71\xb9\x68\x1e\xb7\xac\x7c\x1e\xbb\x7a\x9b\x45\x27\xd5\x7f\x46\x87\x4d\xeb\x11\x63\xf2\xde\x1c\xc7\x89\xb2\x94\xfd\x81\xdc\x26\x88\x13\x2b\xac\x61\x5c\x1d\x11\xe9\xfa\xe0\x4b\x2a\xcc\x11\xca\xc8\x5a\xff\xfa\x80\x48\x82\x9f\xeb\x8a\x52\xef\xfa\xd5\x31\x43\x0b\x5d\xa5\xa1\x11\x5d\x45\xf7\x54\x61\x8e\xea\x9e\xd6\x47\xf1\x32\xa3\x44\xad\x2e\x15\xab\xcb\x05\x37\x76\xf2\x27\x7c\xcb\xef\xc0\x9a\xee\x5e\x4a\xb0\xf3\x4f\xd9\xde\xd5\x53\xb3\x9c\x89\xb4\xc7\xd5\x38\x56\x1e\x95\x48\x51\xab\x36\xa6\x68\xaf\x32\x52\x77\x4c\x98\x34\xd0\x05\x3d\xfa\xf8\x72\x14\xb1\x4c\x33\x8c\x02\x36\x7f\x3f\x72\xb0\xbc\x8b\xfe\x19\x9b\xed\x83\xdb\xf8\x28\x2d\x7b\xed\xb0\xb7\x86\x6d\x2e\xeb\x3f\x44\x08\xf6\xbd\x7c\xcf\xca\x3d\x63\xd4\xac\x89\xde\x5b\x36\x29\x0e\x0d\xe2\x55\xdf\x18\x95\xb7\x42\xf1\x82\xa6\x98\x2f\x0a\xb3\x05\x82\x16\xc6\xf3\xb2\xdb\xdd\x74\xf7\xad\xe4\xd6\x1f\x8e\xbc\x14\x15\x42\xfe\x4a\x39\xd8\x28\x4e\xfb\xfe\x3e\x36\xff\x07\x79\x82\x70\x7e\xab\x57\x92\x7f\x08\x85\xbb\x6c\x87\xe4\xbd\xf4\x6b\xf5\xea\x77\xb0\x35\x72\xf8\x9b\x1e\x1d\x77\xe0\x3d\xa1\xd8\x5f\x3a\x50\xa8\x84\x7b\xf2\xa1\xd8\xb9\xfd\x19\xce\x87\xaa\x95\xc9\x1e\x5f\xff\xa0\x7e\x45\xc5\xf0\x92\xa5\xc3\xca\xa2\x7c\x01\x58\x58\x93\x97\xae\xd6\x9e\x76\x5c\x38\x34\xee\xa9\x0b\x63\x07\xce\xd9\xc2\xa3\xc5\xaf\xb5\x2e\x08\x3e\x34\x47\x76\x19\x8d\x8d\xd3\x96\x35\xb8\xfe\x81\xfd\x25\xa0\x52\x7a\x4f\xc4\x07\xc4\x0c\xe3\x42\x31\xe5\x1e\xa8\x99\xd6\xa4\xf4\xee\x12\x94\x46\xa2\x6e\x6d\x41\xa7\xd5\xec\xf0\xff\x6b\xc1\x3b\x3f\x3b\x6b\x8e\xe3\xd3\xf6\xd4\x99\xbb\x45\x0a\xe9\x6c\xf8\xf6\x4d\xa3\x2f\x2b\x98\x84\x70\xe6\xd0\x85\x8d\xb9\x0b\xcf\x61\xb3\xcd\x36\xf7\xf8\x02\x6d\x0e\xcf\x00\xbf\x0f\x61\x0e\x9b\x30\x87\x75\x98\xa3\x5f\xfc\xbe\x82\xec\xb4\x61\x03\xe6\x6e\x79\x9f\x1e\xd7\xf5\x49\x8f\x9e\xc0\xf7\xf8\x78\x85\x5d\x92\x33\x3f\x99\xc4\xd1\x02\xc2\x09\xaf\x0b\xeb\x5b\xe4\x58\x7e\x2c\x24\xe0\xf8\xcd\xbb\x0f\xef\x3f\x7e\x7e\xf5\xf2\xf8\xdd\xfb\x97\x5f\xde\xbe\x3a\x6e\x1d\x07\xdb\xc7\x53\x3f\x3b\x3b\x3e\xae\x7a\x83\xe8\x89\x7b\x23\xc8\xed\xe3\x63\x79\x90\x58\x09\xfb\xf1\xe3\x9b\xc1\xee\x1c\x1f\x0f\x67\xc9\x05\x3b\x1e\x87\x11\xf3\x93\x4a\xf8\xed\xed\x9d\x9b\x35\xb0\x7d\x8c\xa0\x2b\x01\x77\x5a\xad\x9b\x01\xde\x39\x3e\x9e\xc6\x61\x0d\x49\x3a\x2d\xdc\x58\xc1\xff\x0c\xf8\x52\x39\x12\x4f\xf0\x76\x4a\xf8\xa4\xd7\xf0\x1b\x5c\xbe\x34\x53\x69\x93\x73\xde\xc2\x06\xaf\xc7\x8b\x03\x81\x2d\xce\xd1\xeb\x5b\x7d\x69\x4f\xce\xdb\x32\xc8\xa5\x48\x58\x70\x70\x62\x6f\x74\x49\x1e\x90\x80\x65\x57\xd6\xb7\xfa\xae\xd3\x52\x8b\xfe\x45\x7b\x69\x04\x07\x08\x67\x61\x22\xa8\x0d\xd9\x3b\x40\x2a\x4b\x66\xcc\xd5\x56\xb6\xbc\x14\x6a\xf6\x1f\xd9\xaf\x16\xe1\x02\x8f\x96\x34\xa5\x2e\x47\xcc\xb2\xe9\x4c\x36\x61\x87\x89\xf5\x13\xe6\x3b\x81\x9f\xf9\x66\x98\xd8\x50\x47\x7c\xf8\x55\x7f\x9e\xeb\x4f\x0c\x86\xe6\x67\xbe\x0c\xed\xaa\x32\x8c\x80\x2c\x82\x64\x7c\x20\x95\xbb\xa4\xd8\xf6\x98\x8d\x46\x66\x10\x8d\x79\xeb\x77\x8e\x1b\xbb\x14\xa1\x61\x23\x23\xf2\xc9\xa2\x90\x27\xc2\x42\xd1\xb5\x09\x41\x3b\xea\x99\xab\x3b\x8a\xa4\x71\xa8\xa1\x65\x06\xcd\xd0\x53\x92\x8e\xfc\x17\x8d\x97\x6b\x85\xb8\x0d\x29\x5c\x6d\x08\xcf\xba\x10\x1d\xc0\xc6\x46\xa8\xc3\x7c\x70\xa4\x1e\x3a\x21\x3c\x03\x7c\x95\x5e\x90\xc0\x09\x04\xb9\x7a\x61\xdf\x83\xd0\xc3\x6f\xd7\x45\xaf\x5e\x49\x25\x33\x54\x08\x87\x62\x50\xef\x61\x59\x19\x80\x5f\xa1\x0b\xa1\x19\x36\x84\x3a\xdf\xe4\x23\xfa\x29\xf3\x93\xcc\x71\x4b\x72\x39\xb7\x14\x72\x0b\x11\xc8\xac\xe2\xaf\xa2\x60\x79\x50\x82\x48\xe7\x1c\x39\xd8\x84\xf6\x01\x9c\xc3\xf3\x2e\xfc\x7a\x00\x9b\x9b\xe7\xf9\x78\x28\x02\x10\x0a\x9e\x33\x6f\xfd\xde\x3b\xef\x7b\x7c\xc4\x7b\xe7\x7d\x0b\xe4\xd5\x6a\x88\x71\x0a\xe4\xf2\xae\x1e\xd8\x7f\x4d\x12\x9b\x58\x71\x24\xc2\x3e\x4e\xc9\x2d\x27\xd0\x83\x45\x68\x51\xce\xc2\xca\xd1\x6d\xd8\xbd\x69\xc3\x21\x6c\xcc\xdb\x66\x51\xd8\x17\xf0\x3d\xae\x8d\x0e\x61\x63\x91\xcf\xa6\x46\xf2\x51\xed\x34\xc3\x13\x43\xbb\xca\xb0\x31\xe5\xda\x13\x72\x05\x1b\xd0\x68\x70\xbb\x83\x84\x5d\xd4\xb7\x04\x9e\x13\x4f\x45\x5e\x13\xb0\xae\x15\x11\x35\x67\x95\xea\x34\xb7\xa9\x98\x5d\xac\x8c\x9b\x24\x83\xf8\xaf\x2b\xfd\xa0\xa5\xc8\xea\xb0\x72\x1c\x9f\xe6\xdc\xd8\x4c\x76\x8e\x73\x98\xe5\x03\x49\xf3\x15\x25\x4e\x37\xe2\x38\xee\x18\x05\xa9\x21\xeb\xf3\x15\xe7\x31\xec\xdf\x85\xa2\xde\x38\x76\x3d\x63\x6e\x42\x5c\x69\x14\x0f\x68\x27\x56\xe1\xdf\xfa\x03\x77\xa0\x1a\xeb\xf6\xca\x58\xe3\x24\x2a\xf5\x2d\x1c\xd2\x9f\xfd\xef\xdd\x91\x76\xae\x23\x8b\x55\xfb\xb1\xf8\x7e\xd4\x5f\x14\xd9\x67\x91\x1f\x88\xc5\xca\xec\xf3\x1d\x3b\x50\x8d\xf5\xca\xec\xb3\xf8\x43\xb0\xcf\x22\xcf\x3e\x5c\xad\xfd\xd2\x82\xae\xf9\xfb\x6f\xd6\x90\x14\xfa\x26\x75\x68\x73\xee\xcc\x5b\x6e\x73\xe1\x2c\x5a\x6e\x09\xd4\xbf\xb5\x57\x84\xd2\x2e\x83\xf2\xcb\xf2\x50\xda\xe5\xb8\x68\xf3\x75\xa5\xf1\xd2\xd5\xee\x7d\x84\x1e\x3e\x34\x87\x48\x1d\x85\x5b\xbd\x90\x46\xf1\x4a\x7d\x50\x96\xb4\xba\x10\x0d\x0f\x05\xff\x3d\x7a\x04\x4e\xce\x62\x94\xd3\x93\x81\x0b\x66\xe4\x31\x51\x46\xfb\x4a\xb8\x98\xac\xaf\x41\x58\xb3\x38\xec\xe7\x8d\x58\x5d\xd0\xa4\x90\x48\xd5\x78\x19\xec\x70\x40\xae\xf3\xf9\x6d\x81\x27\xf7\xbf\x2d\x20\x96\x8f\xce\x20\x8c\xf0\xba\xad\xbd\x90\x54\x40\x9a\x81\x53\xda\x5e\xc3\x6f\x78\x16\xa3\xcb\x5e\x21\x25\x3e\xfa\x41\xe8\x8f\xdf\xe2\x72\xe7\x00\x37\xa7\x4b\x5a\x0e\x27\x93\x19\x5e\xb0\x72\x2b\x17\xb1\x03\x5c\xc4\x1a\x20\x6f\xb8\xb3\xb1\xdc\xee\x00\x6d\xc7\x15\x3a\x60\x63\x50\xbb\x32\xa9\x5b\xe1\x59\x4e\x00\x02\x16\x59\x5c\x74\xd5\xec\x2c\x4c\x9b\xc7\x52\x04\x04\x27\x5f\x3d\x78\x40\x25\x9b\x53\xf9\x6e\x85\x0c\x9a\x27\x97\x0e\xfb\x45\x75\x63\x80\xca\x2f\x31\xf0\x8c\x5b\x18\xdd\x4b\xd4\x54\xa6\x39\xd6\x53\xab\x88\x6b\x6a\xe6\x56\x1b\xaa\xee\xf5\x6d\x5a\x4b\x05\xac\x87\x26\xba\x51\xcb\xf7\x20\x29\xab\x49\xa6\x7c\x02\xeb\xb4\xef\x96\x86\x91\xc3\x97\x02\x3c\x61\x13\x53\x86\x71\xea\xf8\xae\x30\x66\xad\x68\x0c\xe6\xe0\xaa\x01\x31\xed\xf0\x44\xe4\x99\x41\x1a\x94\x14\xf3\xf5\xae\x59\x59\xeb\x25\x65\x37\x53\xfd\xc2\xe0\x6a\x4d\x90\x08\xde\xbe\x2a\x6a\x82\xda\xa7\xe9\xef\x56\x13\x2c\x21\x8f\xb4\xa9\xc4\x47\xe9\x76\xe2\x48\xdb\x21\xd4\xed\x4a\xa1\xdc\x6e\xdf\x7c\xbf\x71\x89\x2d\xbb\x07\x06\x0b\xe8\x1e\x39\x63\xe3\x6c\x96\xf7\xb5\xa9\x47\x6b\xdc\xf4\xf1\x99\x26\x9e\x3a\xf7\x20\x60\x63\x96\x31\xfe\x7d\x80\x99\xbc\x3b\xb3\x14\x73\x17\x46\xee\x42\xd4\xbd\xc9\x94\x38\x74\x96\xd8\x0e\xc9\x51\x53\x6e\x8a\x59\x73\xf6\xb1\x8b\x33\x91\xe3\x0a\x2e\x2c\x4c\x46\xc4\x7d\x5b\xeb\x30\x8b\x30\x8a\x54\xf5\x6e\x23\xd2\x9e\x4a\x29\xda\x8a\x52\x82\x55\x4a\xf6\x1d\x65\x2b\x9a\xce\xcb\x18\x22\xb5\x8b\x58\x92\xb6\x95\x08\x43\x70\x8a\x0a\x9e\x43\x74\x2b\xa6\xe2\xda\xb0\x9d\x77\x23\x80\x37\xdc\xd1\x9d\x7b\xb0\xb0\xa8\xdb\x73\x16\xb8\xe9\xe1\x4a\x2d\xc8\x75\xde\x1c\x36\xc5\x29\xc7\x87\x37\xb0\x05\x1d\xbe\xce\x31\xb5\xe4\xdc\xed\x97\xf7\xbc\x53\x7b\x3b\xf8\x8f\x6d\x84\xa4\xe3\x70\xc8\xc8\xf0\xc0\x03\x7e\xfe\x53\x3e\x67\xa5\xa7\xd2\x26\x15\x2b\xf6\xbc\xf6\x66\xe5\xf7\x3e\x95\x39\x9e\xd4\x9e\xc9\xec\x89\xa1\xbb\x21\x37\x71\xf6\x09\x12\xff\xd2\x98\x62\xc5\x04\xe6\x41\x1a\xfe\xce\xcc\xbd\xe6\x44\x9e\x97\xa5\xbf\x25\x99\xc3\x73\x61\x6b\x19\xd4\x7b\x8d\x5f\x69\x9b\x36\x14\x76\x10\xe8\xcd\xf4\xe6\x24\xbe\x60\x9f\x63\x27\xf1\xa0\x95\xcb\xf1\x93\xa1\xd3\xf2\xa0\xe5\x41\x82\xff\x2e\xd5\xd2\x04\x5b\xca\xfc\x99\x6a\xea\xaa\x9c\xbb\x6b\xef\xde\xfd\x23\xe4\xfa\xd6\x23\xb1\xeb\x72\xf9\x2e\xa5\xee\xe6\x36\xac\x73\x2a\x6e\x26\x39\x1a\x73\x0d\xcb\xf3\xaf\xcb\xc3\xfa\xe5\xf9\x4b\x64\x57\x64\x5d\x83\x94\xc8\xae\x86\x5b\x9d\x53\x83\xcf\xe6\xf5\xd9\x55\x59\x15\x08\x0d\xc7\x71\xca\x3e\xf8\xd9\x99\x53\xc7\x6f\xb5\x3e\xf0\xb7\xe0\x37\x8a\x65\x15\x6d\xb7\x2c\x96\x68\xc3\x16\x6c\x8b\xb3\x19\xcc\x3d\xc6\xa7\x3a\xb0\xdc\x3a\x67\x92\xef\xc3\xa7\x8b\x32\x3e\x15\xf8\x18\x27\x47\x73\xe8\xe2\xa4\x84\x39\xa5\x0c\xdc\xf2\x60\x73\x51\x3e\x2c\xf3\xa2\xe6\x10\x39\x2d\x3e\x41\x96\x0f\x65\x49\xa5\xe5\x86\xb1\xd6\xdd\xe3\x0f\x39\x35\x70\x20\xe7\x3e\x74\xa1\xd5\xdc\x7b\xda\xda\x6b\x6f\xb7\x9e\xb6\x77\x3b\x4f\x3b\x7b\xbb\x9d\xce\x5e\x5b\x38\x6b\x9f\x6b\x8d\x12\x46\xf5\x46\x55\x99\x4e\x87\x2d\x68\xb7\xb8\xfa\x51\x20\x9e\xc0\xfa\xea\x53\x03\x81\x11\x18\xcd\x57\xc6\xc8\xd2\xfd\x02\xa5\x75\x38\x17\xc7\x97\xe7\x9c\x19\xf5\x5a\xf0\x56\x10\xbf\x97\xfc\x94\xe8\xf9\x75\x38\xf7\x73\xa2\x73\x3e\x47\xc5\xa4\x0f\x62\x79\x1a\x97\xa7\xa4\x52\x96\x2a\x54\xdc\x5c\x4b\x8c\x7a\x23\x34\x84\x2e\xb4\xf1\x10\x15\x76\x73\x67\xa8\x3c\xdb\xaf\x3d\xfa\xae\xa4\xe5\x3a\x84\x7c\xca\xb2\x1e\xd6\x91\x9d\xa5\xa5\xba\xf5\x68\x87\xc9\x0b\xfa\x20\x2f\x87\x7d\x2a\xe6\x93\xa1\xa1\xde\x0b\x85\x86\xe8\xa2\xb3\x09\xbc\xf0\xc2\xc3\x3f\x73\xd8\x00\x9e\xbc\x30\xde\x39\x58\x55\x2f\xd4\x3a\x27\xfd\xd1\xcd\x89\xcb\x02\x9b\xe5\x38\x6c\xf3\xb2\x68\x5a\x24\x7c\xf9\x36\xf7\x60\xee\xc1\xa5\x07\x97\x75\xc4\xb9\x2f\x2f\x27\xb4\xed\x7f\x4b\xb2\x6d\x0b\xff\x6d\xf7\x7b\x4e\x6f\x9b\x85\xf9\xcd\x21\x94\xd6\x61\xdb\x2d\xb7\x75\x5b\xb4\x04\xeb\x54\xcc\x4d\xb2\xfa\xa2\x7a\xce\xab\x2b\xb2\x1c\xbf\xde\xd7\x0e\xb3\xdc\x37\xd9\x6c\x35\x85\x70\xa7\xb9\xc1\xe1\x9c\x24\x34\x32\xd7\x2c\x6a\xd2\x40\xb3\x45\x5a\x05\x5c\xab\x38\xe7\x22\xc2\x6c\x9b\x2b\xdd\xed\x7f\xa0\xce\xdd\x02\x4b\xe5\x72\x53\x2b\xd1\xdd\x00\xe9\x04\x95\x70\xe5\x6c\x94\x6b\x43\x17\xe6\x2d\xa3\x50\x5b\x16\x82\x0d\x53\x5f\xcf\xb9\x6d\xb6\x39\x6f\x1b\x25\x79\x0a\x1d\x7e\x15\xb8\x67\xce\xd9\xa7\xc2\xe2\x99\xb7\x3d\x10\x07\x53\xc5\xbc\x8e\x07\x8b\x0a\x9e\x43\xa5\xd8\x92\x5a\xb1\x25\xd4\x62\x4b\xea\xc5\x8a\xd6\xb0\x56\x5b\xd6\x6a\x8b\x5a\x6d\x59\xab\x02\x0f\xac\xd5\x91\xb5\x3a\xa2\x56\x47\xd6\xaa\xc7\x70\x43\x61\x48\x88\x09\x30\xf3\x7a\x0c\x37\x14\x86\x84\x98\xac\x55\x8f\xe1\x86\xc2\x90\x10\x93\xb5\xf2\x18\x2e\x27\x70\x7f\xc4\x8d\xdc\x23\x3f\x09\xc2\xc8\x1f\x1f\xf1\x1e\x04\x37\x35\x42\xa3\x38\x9e\xd6\x9c\xac\xec\xde\xdc\x69\x54\xa0\x57\x03\xfc\x49\x6e\x23\xd7\xee\x91\x16\xf2\x8c\x45\x69\x18\x47\xd6\x51\x8b\x3a\xac\x33\x0e\xe8\x28\x8b\x2b\x26\x87\x73\x89\xaa\xb6\x05\x8f\x71\x83\xd4\x86\x5f\x77\x2a\xb3\x04\xc9\x2a\xdc\x00\xd5\xf1\xcc\xcd\x41\x5c\x7f\x52\x43\x4e\x2d\xf4\xd9\xd6\x9f\x1d\xfd\xb9\xad\x3f\x77\xf4\xe7\x2e\x9e\xbd\x4b\x28\x0b\x0d\x65\xa1\xa1\x2c\x34\x94\x85\x86\xb2\xd0\x50\x16\xbb\xd0\x85\x9f\xfc\x9f\x0e\x0c\x50\x78\x80\x83\xfe\x7a\xd7\x1f\x19\xa5\x97\x61\x36\x3c\x03\xc7\xa8\xa9\x8d\xd2\xa1\x9f\x32\x68\x9b\xa1\xc5\xad\xf1\x96\x6a\x54\xf6\xd2\x53\x98\x1a\xfe\x61\x76\x8d\x9c\x80\xd3\x7f\x83\x84\xf9\xe7\x07\x39\x5f\x35\x6c\xbb\x53\xdd\xb6\x50\x30\xf7\xd7\xf6\x76\xa1\x6d\x3a\x18\xbb\xbe\x45\xab\xdc\x8e\x2a\xb7\x53\x5b\x6e\x57\x95\xdb\xad\x47\xef\xaa\xea\x3c\x4f\x6f\x62\x93\xa5\xb9\xc1\x13\x70\x17\xfb\x60\xc9\xa1\x6e\xed\xe7\x38\xa8\x7d\x60\xb2\xf0\xdc\x33\x59\x71\x71\x60\x63\x27\x99\xc5\x86\xd0\x39\xa8\xe5\x99\x1d\x0b\x2c\xff\xb5\x70\xcb\xe0\x76\xf2\x70\xb7\x0f\x0c\x31\x32\x40\xec\x96\x60\xa6\x6e\x78\x2f\xe5\xb1\xa1\x34\xa5\x3c\xfd\xa1\x26\xc9\x87\x19\x5f\x88\xa5\xa5\x9d\xd9\xc6\x55\x95\x3a\xf0\xca\x14\x83\x67\xaa\x88\xf9\x41\x95\x12\xf0\xca\xd4\x81\x67\x2a\x86\x85\x3e\x82\xbd\xbb\xe3\x26\xc7\x38\xcd\x4d\xb3\x78\xe2\x18\x0a\xdf\x3c\xca\x95\x84\xaa\x39\xcc\xbd\x6e\x0a\x51\xc7\xba\x12\x56\x53\xe4\x98\x67\x7b\xd6\x7c\x03\xda\x37\x02\x71\xdb\xb0\x40\x99\xa7\x70\x12\xe4\xc1\x83\x2b\xd7\xc1\x40\x33\x05\x3b\xe2\x3b\x9c\x47\xdd\xd8\x8e\x78\x3f\x65\xd1\x8d\x8f\x84\x97\x9d\xec\x0b\x73\x3d\x6f\xf5\xfe\x66\x7a\x0e\xfd\x06\xde\x17\x5c\xd3\x5b\xb3\xd9\x75\x4e\x17\xa2\x82\x98\x15\x97\xf4\xb7\xa8\x9e\xc5\x97\x9b\xa4\x6f\x31\x07\x63\x90\x1d\x8d\xf9\xb7\x6f\xd6\xcf\x87\xdd\x2e\xb4\x30\x52\xbd\x09\xb8\xdb\xe5\x6b\xe2\xeb\x66\x38\x8b\x1e\x38\x36\x2a\xa1\xd2\x2d\xe4\x7e\xa6\x91\xe5\xa6\x8a\x55\x14\x3f\xf6\xea\xb0\xd6\x2a\x30\xb4\xa5\x0b\xfb\xb5\x13\x91\x59\xb4\x0c\x8f\xed\x3c\x1e\x3b\x18\xd7\x05\x2f\x03\xe3\xf5\xf6\xd5\x26\x9a\xd6\xff\x4c\x34\xf7\x31\xd1\x94\xeb\xaf\x7f\xec\x34\xb3\xfd\x87\x0c\x0d\x1e\xa6\xaf\x7e\x9b\xf9\xe3\xca\x38\x4b\x8f\xf3\x25\xeb\xa2\x1f\x49\x60\xf9\xe0\x4c\xea\x0e\x52\xd3\x4f\xd3\xf0\x34\xb2\xee\x85\x3a\x99\x9f\x9c\x32\x3e\x9a\xa5\x1b\xe4\x79\x17\x9e\x03\x08\x37\x36\x78\x61\xdc\xa9\x8c\x67\x09\xba\x21\xa8\x52\xbd\xb0\x7f\xa0\xe1\x9c\xb3\x05\x84\x91\x28\xc6\x2b\x71\x15\x2b\x50\xd1\x3e\x0b\x67\x7e\xfa\xfe\x32\x92\x34\xa4\x5b\xcb\x54\x05\xef\xda\xba\xbc\x22\x21\x29\xef\xd8\x52\x2e\xfe\x3a\x80\x2b\xfc\x3f\x19\x9f\x13\xcb\x1d\xc0\x95\x8a\xb2\x84\x37\x7b\x8f\xc6\x7e\x6a\xc5\x0c\x42\xd7\x0a\xf5\xcb\x1a\xc5\x90\xa5\x82\x26\x1e\xc8\xd0\x16\x36\x69\xe8\x02\x96\x88\x3d\x51\x42\x96\x80\xa5\xc3\x24\x9c\x66\x3a\x80\x05\x92\x45\x27\x37\x19\x06\xf3\x17\xef\xf5\x94\xa7\xf3\x31\xf2\xc7\x29\xb3\xea\x0d\xe3\x68\x14\x9e\xce\x64\x4d\x8c\x0f\x87\x44\x6d\x20\x7b\x35\x38\xb5\x75\x71\xd7\xac\x7a\x99\x84\x99\x55\xad\x9c\x83\x65\xcf\x8d\x9a\x78\xdf\xd9\x80\x7a\x60\x12\x5c\x53\xf4\x28\x8e\xd2\x2c\x99\x0d\xb3\x38\x41\xc2\x65\xf1\x07\x7a\xe7\x88\x82\x5c\x7e\x90\xa4\xe4\xe8\xea\x6c\xb7\x48\x7c\x03\x90\xe6\x12\x13\xa4\x4b\x7d\xb6\xe0\xd6\x41\xb1\x51\x38\xd0\x4f\x3d\xab\x12\x07\x18\x71\xca\xb1\x63\x73\xc9\xa0\x1f\x1d\x0f\x8e\x33\x36\x99\xfe\x73\xbf\x57\xfb\x22\x0a\x27\x7e\xc6\xde\xf9\x91\x7f\x8a\xd7\x12\x4b\x63\xae\x3d\x6d\x55\x54\xa8\x6b\xcc\x2e\xa9\x00\x7c\x98\x25\xec\x23\x8b\x82\x9a\xd6\xb6\x4b\x0a\xd7\xb5\xa4\x4b\x69\x1d\xe7\xa7\xd5\x2f\x8d\x6e\xef\xe8\x16\x48\x76\xbe\x60\xf4\xcb\x8a\xe2\x7b\xed\x4e\x69\xf1\xda\x00\x6d\x46\x39\x55\x79\x96\x85\xe3\x2a\x0e\x21\x94\xee\x3d\x78\x9a\x6e\xa0\xe2\x41\x32\xde\x04\x2a\xd8\x54\xea\x2d\x92\x7d\x7c\x5d\xeb\xc0\xd4\x78\x21\x22\x20\x65\x97\xd7\x50\xb1\x73\x42\x17\x9e\x77\xa1\xe5\xe2\x3a\x24\x8c\xa4\x3a\x7a\xb8\x94\x92\x47\x04\x42\xd7\xac\x2c\xf4\x3c\xde\x75\x8c\x07\xbf\xa2\xde\x2c\x2a\x77\xb3\x77\x59\xcc\xe5\x78\x36\xe1\xba\x8d\x6e\xe9\xfa\x49\x22\x71\x25\xf7\xb8\x30\xd5\x19\x45\x65\xee\x81\x9f\x20\xd3\xa9\x42\x42\xa7\xbb\x72\x06\x4c\xf2\x4a\x9e\x57\x20\x1c\xfd\x24\xb1\x71\xe4\x59\x07\xea\x4e\xab\x4c\x25\x3c\x46\x49\x3c\x41\x24\x50\x83\x9a\x9d\xc8\x29\x61\x39\x32\x3a\xcc\x84\xa4\xbc\x31\x16\xe5\xfa\x5b\x57\xfd\x2a\x4d\x0e\xfc\xe3\x81\x9e\x5b\xc4\x9b\xef\x60\xce\x26\x32\x4d\x4e\x13\xf4\x1b\xae\x5c\xa3\x33\x7c\x40\xac\x28\x17\xba\xdb\xf1\xe0\xd7\xdc\xb8\xa0\xea\x3c\xf2\xc7\x63\x7c\x81\xd0\x09\xf1\x02\x0e\x9f\xd2\x0d\xb5\x2b\x3b\xf6\x50\x65\x83\xfc\x88\x47\x56\x41\xb4\x01\x4a\xe2\x9b\x36\x8e\xfc\x28\x8a\x29\x7c\x37\xf8\x14\xe0\x07\xfc\xd4\x08\xdc\xde\x28\x52\x7b\x1a\xa7\x69\x38\x18\x33\xa3\x01\x0a\xd8\xeb\xa4\x6c\x3c\xf2\x10\x98\x42\x8d\x27\xd9\xad\x7f\x64\x22\xda\xb3\x40\x81\x1b\xe8\x70\xe6\xa7\xd1\x5a\x06\x03\xc6\x22\x08\xa3\x30\x0b\xfd\x71\xc8\xad\xf3\x4d\x48\x67\x53\x96\x38\xae\x55\x82\xb7\xc0\x02\x42\x4d\x59\xb0\xe2\x52\x90\xb8\xed\x84\xbf\xf1\xc2\x13\xc9\x2f\xde\xaa\x2d\xe4\xe9\x5e\xc2\x21\x25\xef\x03\xc7\x38\x37\x18\xe2\x25\xd0\xd4\x49\x67\x83\x23\x9a\xdb\x10\x2d\xfc\x96\x5d\x15\xc0\x75\x06\x85\x53\xd2\xf7\xad\x1e\x3d\xca\x67\xd2\xc5\xf7\x8a\xa1\xf9\xc4\xcb\x72\xcb\x3a\x61\x29\x9a\xf9\x93\x59\x9a\x01\xa3\x47\x7b\x07\x8c\x6e\x1c\xe1\xf3\xbc\xb2\x09\x0f\xa3\x08\x37\x60\x03\x0a\xb8\x20\xa9\x24\xf6\xd6\xee\x85\x90\x03\x11\x67\xd1\x40\xd0\x42\xd7\xb4\x24\xbe\xd2\x2b\x00\x34\xf2\xfb\x5a\x50\x34\x71\x4c\x59\xa1\xf8\x01\x39\xc1\x28\x13\x1e\xce\x66\xd2\x34\x31\x88\x2b\xf0\x4b\x19\xd7\xbd\x84\xc2\xfb\x11\x1c\x96\xa7\x57\x0c\x90\xc6\xad\x79\x7c\x8c\x3d\xc1\x4d\x25\x5d\x44\xc5\xcb\x14\x73\xb1\x0c\x34\x64\x4c\xab\xf9\x17\xf9\x78\x11\xb4\x6b\xf8\x44\x45\x86\x8e\x65\x21\x1f\x1f\xd9\xef\x42\x6a\x26\x12\x6d\x78\x60\x14\xb1\x03\x3b\x88\x12\xa5\x8f\x81\x42\x41\x37\xd0\x2a\x5b\xd4\x91\xe1\x0e\x70\x1e\x45\xd1\xea\xd6\x49\x2c\xd5\x95\x28\x19\xd4\xf9\xf6\x4d\x52\xf8\xd4\xa6\xb0\x6c\xc7\xa5\x49\x88\x00\xe4\x10\x2d\x20\xf1\xa7\xa9\x08\xd7\x78\x4c\x47\x06\xfa\x6d\x0e\xdc\x39\x4a\x5f\x0c\xb3\x90\x6e\xfa\xe9\xd2\x4d\x99\xac\x0b\xfa\x59\x96\x84\x83\x59\xc6\x44\x64\x39\xb3\xb4\x95\xa7\xab\xf0\x49\x23\x57\x92\x27\xe9\x02\x59\x9c\xcb\xce\x62\x9d\x99\x66\x4c\xa3\xfd\x27\x19\x2d\x8f\x99\xc8\x1b\xcf\xa7\x9a\xa5\x64\x32\x5f\xec\xe2\xa0\x61\xc7\xcf\xfc\x28\x18\x33\x0c\x5d\x45\x41\x4c\x15\x49\x0a\x39\xcd\x41\x18\x05\x0e\x66\x8a\x6d\x30\x2a\x38\xc4\x5c\x19\x0e\xb4\x90\x66\x57\x53\x1b\x73\x0f\x25\x31\xf5\x26\x17\x55\xc5\x90\xdc\xdc\x66\x91\xe1\xe3\xbe\x5e\x89\xad\x01\xfe\xdf\xd6\x16\xaf\xad\xba\x18\x9a\x33\x03\xbd\x83\x81\xdc\x20\x9e\x26\xe0\xda\xc7\xa7\x21\x83\x94\x65\x22\x12\x5d\x16\xc3\x5a\x16\xaf\x09\x88\x86\xa6\xd4\x94\xeb\x96\xc5\xe3\xae\xc1\x31\x8b\x39\x8e\xf2\x38\x49\x7c\xc8\x10\x7a\xd5\xcc\x6e\x12\xd3\x08\xcc\x40\x83\xcc\xd5\x1d\xff\x90\xd6\xcb\x75\x74\xc2\xc2\xbd\x56\xbf\x29\xe2\xed\x09\xb0\x34\xd9\x73\xb0\x9c\xcd\xec\xe8\x22\x37\xee\xb7\xe9\xf8\x46\xad\x73\xe0\x2a\x55\x8f\xd7\xaa\x54\xd0\x87\x85\x55\x2d\x8a\xf6\x6c\xc9\x3b\x2c\x98\x5c\x5f\xaf\x3c\xbb\x8c\x07\xd4\x7f\x0b\x55\x9b\x48\x4b\x31\xa2\xc6\x51\xf6\x8c\x97\x56\x7b\x61\xe6\x06\x85\x56\xac\x3d\x02\x7d\xce\x16\xfb\xc6\x2b\x8e\x2f\xc3\xe0\x5d\x3c\x8b\xe4\x9b\xe0\x62\xd6\x32\xdf\x86\xb1\xcb\x39\xb6\x5f\xe3\xb1\xd4\x61\x65\x2a\xcc\x56\x62\x55\xfa\x0b\x60\xe8\x47\x3f\xb2\xd3\x30\xd2\xa5\x64\x8a\x54\x14\x62\x6f\x73\xc2\x31\xa0\xeb\xdb\x32\x8a\x7d\x41\x96\xb9\x92\x7e\x28\xeb\x9b\xec\x43\xa4\x2a\x48\x08\x02\x4e\x66\xd1\x0b\x29\xb4\x8e\xee\x8a\xe1\xe9\x78\x25\x83\x56\xe6\xe8\xf7\xd7\x70\x3c\xfe\xc8\x86\x2c\xbc\xc0\x71\x4f\xaf\xa3\x63\xbe\xbc\x13\xb1\x79\xf6\x41\x47\x3b\x95\x84\x35\x28\xa7\x4a\x5c\x47\x3c\x5d\x50\x26\x9a\x05\xf3\xf3\x84\x2e\x5d\x31\x4b\x80\x78\x70\xe7\x23\xd3\x06\x80\xae\x94\xcb\xd3\x23\x85\xa3\xb1\xc2\x00\x54\x68\x62\x31\x32\x29\xcb\x3e\x71\x21\x70\x4a\xe4\xfd\x06\xf2\xa7\xf1\xcf\x62\x2e\x87\xe6\x6f\xad\x3a\xdc\x82\xee\x28\x60\x8d\x4e\xbd\xd4\x75\x19\x75\xb9\xc7\x35\xba\x07\x6b\xb2\xef\xfc\x5b\xf6\x6b\xad\x6f\x71\x2b\xda\x51\x72\xf7\x55\x1b\x51\x9a\xf3\xf8\x84\x9b\x43\x56\x1e\x13\xd9\x12\x92\x4b\x2e\xa3\x63\x4d\x0f\xc2\xf4\x73\x12\x9e\x9e\xb2\x04\x85\xea\x61\x19\x7c\x2e\x4e\x25\x0d\x58\xdd\x21\xe1\x14\x5b\x35\xf9\x11\x14\xe9\xcd\x34\x8b\xa7\x8e\x5b\x3a\xfc\x42\xd7\xc5\xd3\x7f\xfb\xa4\xc4\xb0\xc8\x09\x76\x7e\x09\x28\xde\x23\x61\xda\x98\x1d\xfb\xf6\xad\xc0\xc8\x87\x06\x6d\xb1\xc6\x3e\x58\xb4\x3f\xb0\xb4\x43\x09\x0f\xde\xed\x0c\xe0\x1e\x54\x6b\x23\xb9\xe1\x8e\xb0\x14\xd6\x9e\x41\x1d\x0e\x89\xe0\x19\x11\xc9\xf8\xd8\xc9\xc7\xf5\x79\x0b\x4b\xaa\xb2\x2f\xd1\x64\x99\xd9\xc0\x28\x6a\x4c\x08\x39\x1d\x4d\x5b\xcd\x85\x71\x9e\x45\x9f\x66\x83\x74\x98\x84\x83\xa2\xb4\x1b\x79\x75\xac\xb2\x1a\xab\xd9\x99\x2a\x68\xdc\x3d\xf0\x61\x05\x85\x93\x59\x64\x54\xa8\xa0\xad\x5d\xc8\x0c\x80\x0d\xe6\xa2\x41\x3a\x8d\x1d\x94\x30\x7d\x99\x25\x2f\x6c\xf9\xa2\x15\x0f\x10\xcc\x12\xb2\x52\x65\xb6\x4c\x30\x0b\xa9\xad\x50\x2a\x42\x3f\xcd\x02\x03\x31\xf9\x50\xfe\x20\x3f\xeb\xc4\x9a\x95\x5f\x45\x81\x2a\x67\x27\x57\x54\xc0\x53\xfd\xb2\x2a\x98\x61\x51\x20\xe5\x29\x2a\x5f\xc5\xd7\x36\xf7\x5b\xb5\x9a\x45\x0a\x01\xd7\xb0\x14\xad\x1a\xfb\x24\xce\x41\x5e\xe1\x0f\xd7\xa1\x44\xd7\x53\x54\x12\x87\xa6\xc6\xaa\xc2\xb5\xc7\x20\x8c\xfc\xf1\xa7\x3c\x1a\x6a\x78\x4b\xb2\x9d\x82\x71\xdb\xc9\x33\x17\x5f\x8f\xe7\xea\x1c\x68\xb3\xf1\x41\x29\xeb\xfb\x49\xe6\xf4\xf2\xc4\xf2\x68\x9c\xbc\x32\x3c\xcc\x3e\xda\xe3\xd2\xaf\xd6\x1a\xc9\x2c\xfa\x94\xb1\xe9\x12\x5c\x6d\x15\xab\xe4\xeb\xed\x32\xbe\x96\x2b\xcd\xd2\x35\xe6\x2a\xac\x77\x1d\x27\x19\xc8\x60\x2b\x7f\x42\xc2\xd3\x5a\xc6\xb2\x67\x69\x17\x4e\x2d\x34\xa9\x30\xad\x76\xcc\x72\x22\xe3\x4f\x86\x88\xc9\xb2\x65\x42\x26\xc0\x7e\x0e\x27\x06\x54\xa3\x72\xd7\x78\x4d\x07\x0e\xa1\x05\xfb\x85\x42\xda\xfe\x42\xcb\x24\x08\x24\x8e\x7a\x65\x2a\xd2\x1c\x7a\x9e\x70\x28\xac\xa1\x37\x19\x9b\x78\x80\x7b\xef\xf9\x90\x8d\x98\x88\xad\xe7\x22\x35\xca\xfb\xe3\x02\x90\x56\xb4\x57\xda\x6e\xc2\x43\x4b\xdd\x7d\xd9\x54\x69\xff\x01\x8e\x65\xfe\x9f\x94\xc2\x51\x35\x8a\x3a\xc7\x50\x4b\xc5\x8a\x39\x62\xad\x31\x3f\x65\x6b\x9c\x62\xb9\x92\x36\x40\x19\xdd\x5e\xb5\x5a\x18\x53\x50\xb3\x2f\x9d\x75\x98\x85\xa7\x2a\xd5\xae\x51\xd0\x7e\xaa\x86\x9d\xa3\x47\x8f\x08\x37\x4d\x18\x2f\xc5\x0d\x19\x1c\x83\xe7\xd0\xc2\x38\xfb\x9c\x23\x29\x65\x13\xda\x7d\x61\xbf\xf2\x92\x07\xb9\xea\x39\x24\x0d\xac\xf5\x1e\xd6\x39\x5b\xa4\x14\x20\xdc\xb4\x77\x8d\x35\xb9\x41\x51\xe3\xad\xfe\x6f\xdf\xac\x8c\x74\x9a\x84\xd1\xe9\x5a\x29\x83\xf4\xfa\x5c\xab\x0e\xfd\xcc\x29\x39\x52\x91\xdc\xe3\x7a\xd0\x23\x15\xd0\xb4\xe7\x40\x63\xd7\x66\xdb\xcb\x05\xda\x24\x9b\x47\x90\xa9\x6c\xac\xb2\x58\x04\xfd\xb7\x93\x25\xf7\xed\x43\x39\x1f\x52\xcf\xf6\xc5\x5f\x23\xeb\xca\x98\x0a\xfa\x6e\x25\xc7\xeb\x57\x7a\xe4\x1c\x34\xcb\xc2\x71\xf3\x94\x65\x9f\x55\xce\xcf\xfe\xd8\x75\x0c\x8e\x31\xd4\xaf\x98\x75\xec\xd1\x8c\xd8\xa5\x52\x38\xa6\x31\x68\xf7\x5e\xf4\xd6\xa2\x93\xf5\x8a\x90\xfa\xae\x5b\xe7\x2c\x3f\x64\x12\xab\xba\xd9\xa3\x39\x0a\xc7\x19\x4b\x1c\x22\x42\x18\xb0\x28\x0b\xb3\x45\xc9\x14\xa6\x5e\x42\xbd\x7e\x26\xab\xc5\x0f\xf7\xaa\x12\x16\xcc\x86\xcc\x91\xfa\xce\x83\x9e\xa9\xb6\x3d\xba\xb6\x34\xf1\xe7\x8e\xa1\x76\xc5\xfc\xe8\xf6\x5d\xde\xb7\x32\x1b\xa5\x5f\x63\x42\x9b\x06\x7b\xf5\x44\x58\x39\x09\xe2\x0a\x78\x19\xc3\x56\xf2\x54\xee\x18\x5d\x5b\x36\x85\x1d\x2c\x7c\x3c\xa8\x7e\x9a\x5c\xca\x0c\xcc\x6f\x1e\xd4\x6e\x2f\x8b\x77\xa6\x5f\xd7\x59\xa5\x98\xfa\xb9\xca\x34\xbd\xd6\xea\x5c\x7a\x6e\xbf\x95\x2d\x7a\x8d\xfd\x61\xec\x72\x97\xef\x6f\x13\xfd\xf5\xe0\x99\x63\x69\x9b\x6f\xc6\xc2\x07\xba\xa0\x44\x40\x2d\x86\xca\xb7\xc3\x5d\x7b\x75\x75\x8d\xd6\xae\xdf\x69\x5d\x42\xaf\xcb\xc5\x69\x71\x9d\x72\xb0\xcc\x26\x8f\xb9\x93\x0c\xcf\xa1\x5d\x06\xba\xcc\x58\xbc\x16\xf8\x05\xbd\xea\xdb\xbd\xc9\x72\x5c\xf0\x21\x5f\x91\x8b\x4f\xd3\x1a\x5c\x5a\x9d\x9b\x53\x6a\x16\xbb\xa5\x3a\x5d\xc0\x5d\xd6\x52\xb7\x74\x3d\x5f\xac\x7c\xad\xd0\xe7\xd6\xdc\xb4\x82\x09\x5f\x60\xa7\x0a\xd5\x55\x28\x27\x8c\x06\x7b\xdd\x6f\x2c\x8c\x94\x51\x51\xd1\xb0\x51\xb4\x6a\xa3\xa1\x00\xcc\x3e\x33\x30\x36\x1a\x56\xda\x31\xc4\x3f\xd6\xfc\x27\x59\xa9\x02\xd5\x04\xcf\x39\xab\x74\x3a\x66\x96\xee\x88\x77\x2a\xb7\xc4\xcd\xa3\x31\x2a\xaa\xd4\x46\xd9\xda\x46\x96\xa9\x53\xdb\xb2\xcc\x32\x8a\x5b\x96\xad\x54\xdd\xda\xb2\x16\x25\x8b\xca\xb7\xb0\xab\xdf\x29\xdd\x99\x56\xe7\x84\xa2\x4c\x41\x7f\xca\x63\x48\x91\x5f\xba\x71\x21\x33\xed\xf9\xa1\x70\x62\xd0\x29\xdd\xf2\x2e\x28\x7c\x59\xb8\x46\xe5\x17\xb6\xbc\x15\xfa\x76\x4e\x45\x3b\x1f\x99\x9c\x8f\x4a\xda\x12\x99\x56\xd5\xec\x4c\xbc\x89\x59\xe5\x52\x25\xe0\x78\xd0\x5b\x93\x8c\xb2\xe6\xc1\xda\x40\x6e\x31\xcb\x51\xc7\x77\xc8\xcc\x51\xe5\x09\x34\x78\xd6\x4e\x34\x3e\x74\xc4\xa6\x29\xff\xe0\x24\xe7\x7f\x8b\x1b\xd7\x36\x85\xb0\x92\xdd\xff\x5c\x21\xd1\xb5\xb5\xbe\xbd\x2b\x32\xe4\x42\xca\x7b\x87\x9e\x89\xcd\x23\xd1\x81\x26\xa6\x3b\xb2\x3f\xee\x81\xbd\x95\x93\xa9\xa3\x5c\xad\x73\x51\xdf\x8d\x65\x96\xeb\xe8\xf3\xb1\x66\x6e\x0d\xb3\xda\xa9\xa2\x74\x95\x11\x25\x1d\xdd\x7c\xf9\x06\xa4\x75\xd0\x24\xba\x97\x5f\x21\xe7\x60\x96\x4e\x58\xc3\x71\x1c\xb1\xa3\x38\xca\xfc\x30\x42\xe3\x40\x2b\x3f\x2b\x07\x7d\xde\xf1\xcb\x6c\x41\xba\x13\x52\x8e\xf2\x24\x50\x29\x45\xbd\x03\x85\xf2\x7f\xe2\x74\x43\x47\x0d\x3b\xbd\x6c\x39\x25\x97\xc7\x15\x30\x72\x6b\xee\xaf\x57\x7c\xbd\x5d\x56\xd4\x86\x6a\x3e\x88\x57\xc0\x42\x65\xe6\x17\xc7\x09\x2e\x6b\x91\x33\x88\xab\x90\x60\xe2\x3d\x38\x57\xd3\x2b\x37\x85\x92\xa4\x79\x65\x07\xc7\x56\x39\xb5\x9c\x52\x7c\x60\x69\x9e\x92\x57\xe6\x8c\x09\xa5\x60\xac\x70\x6c\x8b\xeb\x1d\x7a\xeb\x43\xf2\x4e\x3b\x3f\xb2\x71\x34\x5e\xa0\xa8\x94\x48\x0e\xcf\x33\x05\xa7\xc0\x74\x36\xf7\xd4\x57\x2f\xb2\xf8\x52\x6f\xee\xa9\x36\xe9\xf1\x3d\xf5\xd3\x7c\xf0\x05\x0a\x98\x4f\xfc\xa9\x6a\xd9\x33\x9c\x82\x30\xad\x74\xff\x20\x2f\x09\x58\xd0\x58\x7b\xbb\xe2\xd3\x34\x35\xfa\xd6\xdb\x81\xea\x74\xf2\x4a\x51\x42\xb9\x17\x29\x5f\xec\x66\x10\xa6\xd3\xb1\xbf\x10\x9c\xb8\xa6\x35\x9c\x2c\x60\x7a\x52\x73\x3c\x69\xfb\xc1\x70\x9b\x56\x84\x32\x5f\xbd\x2b\xcb\x16\xef\x7d\x95\xe5\xc9\x97\xeb\x38\x05\xb3\xf8\x5e\xc1\x5b\xf3\x44\x79\x4b\xf2\x59\x56\xf4\x77\xd1\x1e\x2d\x72\xb6\x79\x60\xee\xa5\x94\xd5\xa7\x37\xed\x78\x7d\x71\x16\x55\x5f\x48\x6e\xbc\xdc\xa0\xd3\x02\xd3\xd2\xaa\x9c\xcb\xa8\xcb\x38\xe7\x95\xc3\xf7\x93\xc4\x5f\xbc\x1f\x39\xa5\xc0\x8d\xc7\x54\x97\xe9\x70\xe1\x35\x55\xa9\x62\x2a\x47\xab\x50\xe3\x16\xa4\x90\xef\x24\xe2\x9e\x27\x4d\xff\x6c\x93\x26\x74\xfc\x8c\x67\x99\x91\x2c\x7f\x52\x38\x6e\x7a\x54\xb1\x96\x86\xc8\x0b\xc6\xc2\x63\x98\xa6\xc6\x5e\xa3\x13\xf8\xe9\x19\x5e\xa9\x73\x3d\xf1\x28\xbf\x3f\xc6\x5a\xba\x4c\xfd\x00\xac\xd1\x50\xae\x89\xc6\x6c\x1b\xa4\xbc\x2a\x47\x0e\x5f\x0c\xc5\x3a\x52\xbd\xdc\x88\x78\x51\x1c\xb0\xeb\x28\x20\x27\xff\xf2\x06\x06\x71\x8c\xfa\x4f\x1a\x52\xf5\xa5\x96\xed\x9e\x90\xc1\x80\x0d\xc3\x00\xbd\xa8\xc2\x4c\x98\xa9\x90\x30\xe1\x83\x00\x97\x61\x76\x26\xcf\x11\xc8\xb0\xa6\x29\xfb\xf2\x8c\x45\xb4\xb2\x15\x8b\xaa\x07\x05\x1b\x77\x69\x2c\x65\xcc\x8e\x1a\x3c\x8b\x16\x61\xcd\xb0\x5d\x19\x1a\x98\xd2\xcd\x07\xac\xe5\x11\xb6\x67\xa9\x9a\x76\xab\x85\x29\xa4\x81\xd7\xd6\xa4\xb2\xa4\xaf\x9c\x5e\xa3\x44\x29\x4f\x42\x2a\xac\x51\x44\xbf\x5b\x6b\xc4\x64\x8a\xd0\x17\xbd\x7e\xd9\x50\xa9\xc9\xcb\xce\xe0\x4b\xc1\xab\x72\xa2\x95\xd5\x10\xd1\xdf\xe1\xeb\x15\x92\x22\x63\x93\xa9\xeb\x72\xb3\x92\xa8\x72\xf0\xa0\xe4\xa9\x4f\xed\x6e\x93\xbb\x8a\x58\x1b\x8d\x77\xa9\x17\x36\xdf\x86\x69\x76\xe4\x0f\xcf\xaa\x6e\xb2\xb4\xb7\x9f\xba\x52\xa7\xf9\xc3\xf3\xa3\x31\x45\xfd\x2f\xbd\x85\xb3\xb3\x6d\x16\x7d\x49\x51\xbe\xab\xca\xee\x98\x65\xff\xcc\xaa\xee\x41\x3d\xd9\xd9\x35\x0b\xfe\xc5\xaf\xba\xd7\xf4\x64\xe7\xb1\x59\xf0\x53\x0d\xc4\x27\x14\x05\x0d\xdf\xaa\x3e\x42\x1b\x27\x05\x9f\xaa\xc1\x10\x69\x41\x4a\x9a\x2f\x46\xd3\x2c\x4e\x18\x9c\xb3\xc5\x26\x6e\x04\xc0\xd4\x0f\x93\xb4\xf9\x00\xe8\xa1\xeb\x69\x12\x5e\xf8\x19\xc3\x6f\xc3\x15\x9c\xf2\xfc\xc4\x9f\xc0\x57\xdc\xa4\xbe\x82\x1e\x8b\xb2\x24\x64\x69\x1f\x9f\xfb\xce\xc1\xc3\xb7\xd8\x79\xc3\xb9\xd7\xb1\x3f\x71\x94\x1c\x51\x53\x07\x5f\x0f\xfc\xcc\x57\x37\x7b\x8f\xf9\x2f\x74\xe2\x8e\xd8\xa5\x1e\x4e\x55\x4b\x5d\xe8\xc7\x70\x5d\xe2\xc1\x3b\xfe\x4d\x51\xcd\xb7\xe0\x45\x10\xc0\x84\x65\x67\x71\x80\x78\x9c\x60\xa3\x27\xcd\x07\xf8\xd7\xb8\x78\x33\x14\x43\xaf\xf9\xe0\x20\x5f\xa6\xb7\x46\xa1\xdd\xd7\xfa\xb2\x1c\x31\x41\xa1\x60\x93\xae\x07\xc9\xb1\x2f\xe6\x9f\xe1\x38\xcb\x21\x2f\xe6\xa7\xba\xfe\x27\x5e\xbf\xf8\x7a\x29\xd6\x28\xb9\xbd\x5b\x1b\xdc\xd8\x7a\x2a\x75\x1d\x9f\xd1\x0f\xf0\x96\xcf\x60\x16\x8e\xb3\xcd\x30\x12\x94\x82\x44\x5e\xdd\x48\x9b\x1c\x1e\xfa\x02\xcc\xa2\x21\xba\x87\x43\x17\x5e\x0b\xc0\x1a\xe3\x03\x03\x60\x16\xf3\x05\x42\x3c\xbe\x60\xf8\xdc\x7b\xc0\x86\xf1\x64\x1a\x8e\x59\x20\xef\xc1\xc6\x23\xa5\x3a\x6c\xf8\x9f\xe3\x4f\x38\x59\x8a\x95\x23\x36\xd7\xcc\x44\xa2\xc1\xd4\x71\x74\xc1\x38\x19\x4e\x78\xa9\x13\xde\x60\x98\xa5\x12\xfa\x30\x0e\x58\x29\x07\x0b\x8e\x95\xc8\x5f\x61\x1b\xc8\xaf\x8a\x23\x39\xa3\x12\xf0\x26\x56\x21\x8b\x3b\x85\xaf\x34\x89\x5f\xc1\x47\x91\xc0\x3b\x96\x6b\xcf\x60\xec\x2c\xfe\x84\x79\x38\x02\xc4\xd8\xe8\x28\xcc\xdb\x7b\xa8\x6e\x83\xa0\x34\x67\xc9\x42\xad\x12\x8c\xab\xa2\x92\x12\xe4\x7b\x8f\x60\xa4\x4b\xed\xd0\xc7\x78\x06\x0c\x75\x6c\x05\x08\x6a\x6a\x03\xd6\xd6\xaa\xaa\x5d\xe9\xf5\xc4\xda\x1a\xca\x4a\x81\xc5\x64\x2f\x4a\xb8\xac\x36\xa4\xf1\x52\x8a\xf9\x13\xab\xd5\xcb\xdb\xdb\x52\x81\xa2\x1d\xf5\x29\x9e\x54\xaa\xda\xc7\x52\x31\xa2\x8a\xa9\xd6\xa0\xdb\x18\x8f\xcc\x62\x53\xf4\xfd\x4a\x19\x0c\xc2\x6c\xe2\xa7\xe7\x29\xca\x02\x29\x2e\x9e\xe5\x27\x61\x6a\xb2\xe8\xd1\xfb\x77\x1f\x5e\x7c\x7c\x75\xfc\xe1\xc5\xc7\xcf\x6f\x5e\xbc\x3d\x7e\xfd\xf6\xc5\x9f\xa1\x0b\x22\x7a\x9f\xcc\xfd\xf2\xd3\xfb\x8f\x2f\x5f\x7d\x7c\xf5\x52\xe6\x77\x34\xe7\xbe\x80\x74\xca\x86\x21\x3e\x5d\x1f\xc0\x05\x4b\xf0\xbe\x4f\x3c\x82\x93\x81\x9f\xb2\x37\xe4\x3c\xf9\x92\xb1\xe9\x09\xa2\x82\x7d\x4f\xc9\x0e\x4a\x67\x53\x8c\x44\x30\x22\xfd\x3b\xf5\x13\x34\x8b\x02\xc6\xa6\x16\xb2\x35\x9c\x2f\x74\x35\x42\x45\xbe\xa7\x2f\x41\x08\x3f\x61\xcd\x92\xd2\xb8\xc5\x80\xa5\xe9\xab\xb6\x0e\xad\x17\xae\x24\x41\xb1\x9a\xfc\x1e\x8d\xfd\xd3\xb4\x09\x9f\x18\xb3\x7a\x4b\x3d\x9d\xf0\x69\x28\x60\x99\x1f\x8e\xd3\x66\xb9\xb4\x52\x6c\x83\xf0\x77\x81\x8d\x25\xb3\x32\x2b\x4f\x89\x12\x30\x8c\x37\xfa\xba\x4c\xf2\x03\x96\xb1\x64\x12\x46\x8c\x97\x09\x2f\xfc\x31\x8b\xb2\x94\x0f\x0e\x72\x84\x0d\x8f\xce\x46\xae\xc4\xac\xfa\x39\xf1\x87\xe7\x29\x5f\x45\xf0\x21\x65\x01\x9c\x20\x95\x4e\xf0\xe6\xc4\x09\xd2\xed\x44\x4c\xba\x69\x4e\xb1\x70\x93\x94\xf9\x91\xd6\x2c\x27\xdc\x58\x3b\xe1\xfa\x22\x93\x23\x94\x82\x9f\x98\x48\x79\xe4\x56\x7f\x82\xce\x88\x27\x39\xdd\x83\xfd\xc3\xb1\x4b\x1d\xac\x2d\x76\x89\x3c\x39\x10\x9e\x41\x49\x4f\x93\xc3\xa3\xbe\xe8\x69\x38\x4c\x3f\x08\x1e\xeb\xaa\x31\x7c\x54\x2a\x03\x72\x7b\xc4\x4f\x92\xb7\x74\x12\xd6\x25\xc4\x73\x2f\xcf\xc6\xd9\x99\xca\x47\x9c\xe4\x7d\xd1\x07\x42\x41\x6a\x00\x0f\xbb\x46\xe9\x47\x8f\xe0\xa1\xa3\xd1\x79\xf4\xc8\xc8\x7b\xae\x5b\x75\x73\xc1\x30\x84\xaf\x26\xe9\x3a\x6e\x09\xa4\xe9\x6c\xc2\x60\xb8\x18\x8e\xc3\xa1\x18\x54\x49\x59\x7f\xdc\x7c\xa0\xb6\x6a\x87\xe7\xe8\xeb\x89\x5f\x7c\x2a\x27\x3a\xa2\x26\x15\xf7\xe9\xb1\x04\x5e\x24\x91\x45\xb0\x3f\x79\x0c\x14\x2c\xd1\x5f\x89\x0c\x92\x97\x1c\x91\x60\x53\x05\xff\x4c\x58\x4a\xf6\xb0\x34\xd7\xd1\xda\x63\x78\xac\xe2\x14\x47\xc0\xd6\x33\x2e\xfa\xff\x5e\x6a\xbd\xba\xaf\x77\x2f\x91\xbe\x84\x6a\x2a\x7b\x23\xb8\x02\x3b\xa5\xb3\x04\xa7\xc8\xfe\x12\xdd\xde\x9c\x46\x5c\x3a\xa3\x38\xda\x24\xa4\xf5\xd2\x97\x13\xed\xf2\x2c\x1c\x33\x70\x36\x36\x28\xf3\x99\x31\x20\x46\x6c\x55\x3f\x49\x7e\x46\xc5\x2a\x58\x83\x5c\x7e\x0c\x47\xb4\x38\x3b\x93\x05\x10\x0b\x51\xc0\x7c\x48\x58\xb1\xad\x7d\x3a\x25\x14\x51\x80\x2e\xd2\x82\x49\x14\xd8\x43\x83\xdb\x1d\xd9\x86\xa7\xd0\x11\x5e\x62\x4a\x46\x04\x6d\x48\x14\x14\x90\x7d\x13\x88\xae\xaa\xc1\x09\x20\xb6\xbc\x11\x10\xf3\x66\x0b\x6d\x91\x0a\x6c\x1f\x9a\x1b\xcc\xf6\x59\xa0\x2c\x63\x6e\x20\xaa\xbb\xdf\x39\x6f\x08\xc5\x35\x8a\xdd\xc1\x0e\xc4\x77\x25\x37\x39\x3e\xb2\xe1\x2c\x49\xc3\x0b\x36\x5e\x48\x9a\x49\xfd\xe2\xa4\xb3\x74\xc8\xa6\x59\x38\xa0\x7b\x5c\x78\x43\x96\x74\xdb\x38\x9c\x84\x59\xea\x36\x55\x07\x38\x47\xe6\xfc\x3c\xd4\x1c\x2d\x19\x48\xd9\x04\x9a\x44\x71\x76\xf6\x26\xef\x90\x07\xfa\x6a\x05\x4d\xdd\x08\xdc\x2c\xfb\xe8\x91\x55\x98\xff\xe7\x68\x56\x22\xb9\xa2\x1f\xdf\xbe\x69\x5d\x56\x3a\x46\xa5\xea\x8f\xc6\xc8\xcd\x23\x65\xb8\x03\xb2\xa8\x39\x9d\xa5\x67\x8e\xc2\xe9\xc0\x2a\x69\xbe\x7a\x7c\xe5\xda\x07\x26\x65\x03\x53\x1e\x23\x51\x5f\x26\x7b\xe8\x98\x07\x9d\x15\x3d\xb5\x30\xb8\x71\xaf\x15\x14\x03\xed\xa5\xb8\xe9\x4a\xea\x0c\xbd\x20\x32\x54\x64\x3e\x47\xeb\x19\x7d\x7a\x30\x1b\x67\xe5\x36\xa7\x31\x7b\x95\x98\x9d\xb5\x4f\x30\x2c\x65\x76\xbe\xf3\xa7\x75\x66\x67\xa7\xf5\x44\xae\xb2\x85\x1e\xe5\xcb\xc7\x2a\xc3\x73\x27\x57\xb6\x66\xf5\xfe\x78\x57\x2f\xca\xad\x75\x79\x24\x0c\xaa\xf2\x85\xf9\x2c\x0a\x7f\x9b\x31\xc3\x00\x59\x75\x59\x4e\x35\x69\x55\x2e\x66\xbc\xaa\xc5\xb8\xe8\x84\x43\xc5\x0c\x3b\xa0\x30\x51\x8d\xe5\x24\x2e\x20\xea\xf7\x32\x5b\xb0\x2f\x91\x35\xa6\xf6\xb2\x95\xbc\x1c\x88\x83\xb2\x19\xc4\xbe\x99\x89\xd5\xfd\x20\x10\x98\x89\x89\x41\x46\x5c\x2e\x5f\xe4\x8b\xce\xf0\x75\xbe\xf8\x34\x56\xd7\x3e\x8e\x69\x49\x06\x17\x74\x3e\xf1\xeb\xb1\x3f\x28\xab\x2f\x56\xef\x7a\xd4\x4b\x17\xe8\x22\xbb\x84\x8d\x6b\x5f\x0c\xc8\xad\xd1\x91\x59\xce\x18\x37\x2f\xc3\x11\xf8\x70\x82\x63\x77\x22\x56\x29\xdc\x74\x3e\x39\x67\x8b\x13\x60\xf3\x30\xcd\x6a\xad\x7f\x69\xb2\x12\xa7\x71\x86\xa0\xaf\x2c\x86\xdf\x66\x2c\x59\x58\xf6\xad\x5c\xef\x9e\xb3\x85\xdc\xd1\xe1\x96\x30\x37\x49\x59\xc4\x17\x9c\x9c\x8b\x38\x5a\xcb\x9b\xb3\x7e\x24\xaa\xe6\x91\xae\x35\x67\xd5\xcc\x80\x1f\x14\xe8\xca\x7c\xf9\x8c\x58\xf9\xcc\x4f\x1d\x9e\x53\xae\x54\x86\x7a\x98\xf2\x43\x51\xfb\x3e\x41\xc9\x50\xbc\x98\x4e\x31\x52\x18\x12\x82\x4e\x0e\x71\x89\x70\x42\xbc\x89\x7b\x11\xc2\xf8\xbf\xd9\x4a\x6c\x12\x07\xe1\x68\x51\xb6\x10\x13\xc2\x66\x4b\xb2\x8f\xf8\xe4\x06\x41\x54\x50\x43\xa0\xf1\x31\x08\x8b\x89\x1f\xf8\xcc\x26\xac\x96\x95\xe5\x3e\x6f\xdd\x8f\x46\xb4\x6d\x65\x9a\xfe\x28\xff\xd7\xc8\x37\xd9\x83\xa2\xfa\x06\xb5\xab\x62\xa7\xa4\xca\x0e\xb4\xf6\x2c\xb0\x4e\xf9\x68\xab\x8e\x95\x0c\x77\xed\xdb\x07\x65\xc3\x5d\xb9\x5e\x3f\x16\x7e\xc0\x85\x85\x7a\x3c\xcb\xf2\x6b\xf5\x30\x63\x89\x9f\x31\x06\xe9\x59\x9c\x64\x67\x7e\x14\x2c\xb3\x4c\xef\x21\xd0\xbe\xcd\x1e\x02\x14\xc4\x17\x2c\xa9\x58\xe0\x4e\x13\x16\x84\x43\x5e\xc8\x5a\xe0\x86\xd1\x45\xcc\xd7\x22\x53\x96\x08\x28\x61\x1c\xd5\x33\x0e\x67\x72\xae\xab\xa9\xa7\x2c\x10\x23\x5b\xc2\x47\xaf\xc9\x27\x5a\x70\x92\xc2\x60\x29\x66\xa2\xbe\xd9\x73\x48\xd9\xea\x31\x61\xe9\x1b\x01\xa5\x55\x58\x32\xf5\xfa\xcb\x70\x1a\xc7\xe4\xa2\x64\x15\x72\xa0\x8c\x5b\x85\xba\x73\x51\xb4\xec\x0b\x76\x52\x4f\xe2\xb4\xb1\xa1\x83\xfd\x58\x66\xd2\x12\x26\x8f\x41\xc0\x12\x8e\xad\x7d\x3c\xe0\x5a\x93\x67\x6b\x1d\x44\x48\x4f\xf8\xf9\xc5\x47\x78\xf3\xd3\xbf\xbd\x3a\xfa\xfc\xe6\xfd\x4f\xb0\xbe\x95\x87\xe6\xc2\x57\x74\x44\x89\xe3\xaa\x93\x05\xe3\xa8\x64\x36\x78\xcd\x95\x75\x95\xb5\xf3\xe4\xa9\xdc\x69\x7b\xc9\x32\x6e\xd0\x8c\x12\xc6\xb5\x56\x12\x62\x64\xbd\x13\x81\xf7\x89\xde\xfc\x4d\x18\x7b\xa5\x37\x1e\x85\xd3\xaf\x4c\xe8\xc2\x1a\x19\x46\x6b\x7c\xcd\x2d\x93\x1f\x3d\x82\x87\xf2\x2c\x29\x8a\x03\xf6\x79\x31\x65\x46\x7e\x2d\x02\xd4\x65\xbb\x7d\x11\x2c\xac\x6b\x21\xf3\xe8\x91\xc4\x66\x22\xb2\x6d\x64\x44\x2a\xc7\x45\x0c\xac\x89\x0a\x25\xd9\x98\x70\xa1\x9a\xc6\xd3\xd9\xd8\x4f\xe0\x28\x9e\x4c\xe2\xe8\xdf\x3e\x01\xfa\xea\xa0\x6e\x39\xb1\xf9\x43\xa3\x48\xe9\x9a\x48\x06\xca\x8f\x1e\x19\xbf\x34\x67\x75\xad\xae\x08\x2c\x7e\x94\x3b\xfd\x24\x07\x25\x1b\xfd\x3f\xce\x46\x23\x74\xde\xb2\x5b\x3c\x44\xd6\x68\x8a\x5c\x7b\x77\x61\xcb\x80\x5b\x38\x41\x40\x05\x99\x9d\xc5\xa9\x38\xd0\xc5\xad\x73\x7f\xc2\x20\xe2\xff\xf8\xa9\xd8\x57\x3c\x19\xc7\x81\x9f\x9e\x9d\x48\x3b\x4e\xe1\x13\xf9\x59\x78\xc1\xde\xa4\x0a\x2f\xf1\x71\x28\x3e\x9a\x61\x5a\x81\x54\xce\x78\xa2\x39\xfa\x84\x82\x9b\x0c\xa8\xae\x54\xc3\x14\xf8\x10\x3f\x27\x6c\x32\x60\xc9\xfb\x11\x1c\x53\x4e\x18\x0d\x19\xec\x34\xb7\x9b\x2d\x32\xb8\xfd\x8c\x9d\xc6\xc9\x02\xde\xfa\xd1\xa9\xa9\x81\xd7\xc5\x14\xad\x67\xe8\x1b\x18\x49\x25\x38\x16\xcd\x23\xf8\x57\x36\xf7\x27\xd3\x31\x13\xd8\x1f\x2b\x12\x38\x5c\x5d\x8b\xcf\x0e\x7a\x42\xad\xf3\x95\x7f\xf7\x39\xc5\x53\x2d\x2d\xfe\x25\x8c\xb2\x3d\xba\x6b\x62\x57\xc1\x06\x1f\xc8\x61\x08\xf5\x00\xe4\x46\xe4\xdb\x37\xad\x11\xca\x2c\x61\x59\xf3\xa0\x56\x1f\x5d\xd1\x51\x47\x9d\x4a\x73\xda\x4f\x76\x5c\xa9\xae\x5c\xb7\xa0\x2b\x6b\x03\xa4\x2f\xb5\x3c\xa4\x7d\x69\x2e\xbe\xc1\x0b\x9a\x96\xca\x15\xdc\x9e\x7c\xab\x8e\x57\xf8\x12\xf9\x49\x55\xc9\x8e\x7a\xd7\x88\xeb\x85\x2f\xd5\xe1\x0e\x9f\xec\xb5\xc5\xe3\x55\x3f\xc5\x01\x6b\xfe\x9a\xc2\x19\x1b\xf3\xb9\xba\x44\x42\x39\xa8\x1c\x96\x0a\xfa\xa3\x47\xea\xbb\x19\x1a\x65\xae\x11\x08\x3c\x9c\x0f\x47\x21\x9f\xe4\x39\xeb\x71\xa5\x67\xcc\xf7\x4b\xc9\xc8\x76\xb3\xf5\xfd\x65\xc4\x40\x74\x39\x41\xd1\x24\xc9\x71\x7f\x8d\xb4\x18\x75\x7a\xfd\x3a\x11\x29\x8c\x89\x35\x4c\x87\x9a\x5d\x9c\x7c\xa6\x0b\xfb\x05\xee\x2b\x17\x26\x2b\x3f\x27\x02\x3b\xcb\x04\x6f\xb6\x96\x96\xca\x3f\x60\x86\x5c\xac\xcf\x43\xce\xfc\x4c\xd8\x8c\xea\x9c\x95\xfc\x71\xb2\x54\x85\x31\x26\xbf\xa9\x51\x9c\x4c\x58\x70\x8b\x23\xd7\xcb\xc4\x9f\x56\x18\xb3\xaa\x01\x61\x06\xe7\xdb\xcd\x71\x8d\xae\x58\xb0\x61\xe5\x91\xb5\x6d\xbd\x72\x3b\xfa\x45\x72\x8a\xb4\xf2\x34\x58\x6b\x89\xa9\xe8\xe8\x27\xa7\xf9\x23\x86\x59\x34\x74\x54\x2d\x2c\x20\x63\x6e\x97\x99\x7a\xa2\xb5\x92\x71\xbb\x9d\xa7\xcb\x52\x66\xde\xe9\x38\x1e\xf8\x63\x61\xe6\x45\xf1\x65\x65\xb0\xd9\x8e\xfb\x00\xc0\x93\x96\xa0\x30\x7f\x2e\xc3\x28\xe0\x75\xb8\xfd\xa3\x66\xd9\x35\x38\x04\x02\x0b\xfb\xa2\x04\x56\xbd\x60\x51\x10\x27\x14\x3f\x66\x12\xff\xbe\xe6\xc1\xda\x25\x1b\x9c\x87\xd9\x5a\x1f\xf3\xd3\xd9\x68\x14\xce\xb5\x5b\x6a\x18\x47\xaf\x13\x7f\xc2\xd6\xa8\x61\x7f\x04\x5d\x6c\xbe\xb7\xc6\xf1\x62\x69\xb6\x06\x1b\xa2\x12\x01\x18\x1a\x45\x86\x7e\x34\x64\x63\xa3\x04\x9f\x90\xcc\xac\x8f\x45\x18\x0f\x46\x71\x62\x86\xa9\x7e\xc8\xdb\x7c\xf4\x08\xe3\x98\x0a\xe4\x73\xb1\x4c\x39\x3b\xe8\x46\x45\x99\x5e\xd8\x87\x0d\x58\x2b\x69\x00\x4c\x14\xed\xd2\x47\x79\x7c\xc5\x92\x42\x62\x5d\x56\xba\xa4\x05\xda\xf8\xc2\x83\x71\xb1\x2e\xc5\x8d\x88\xd7\xaf\xe1\xcc\xbf\x60\x90\xbc\x78\x0d\x83\x59\x86\xa1\xda\x86\x2f\x5e\x3f\x08\x47\x0e\x76\x92\x22\x49\x8d\xf4\xca\x6c\xec\xa7\xf8\xf0\x03\x62\xe1\x41\x18\x18\x3f\x7e\x9b\x31\x5c\x2b\xf5\xfa\x22\x61\xc4\x47\xe9\xa5\xbe\xa5\xd3\x6e\xb5\x5a\xb0\x05\x8f\x5b\x0f\x14\x7d\xf4\x33\x7b\xfe\x78\x3c\x50\x27\x8a\x7c\x79\xe5\x20\x3c\x79\x5b\x2e\x77\xc3\x00\xbd\xff\x89\x2d\xa3\xf8\xd2\xd1\xbb\xd3\x74\xa5\x5f\x3e\xcd\x37\xf1\xe7\x4e\x2b\x8f\xc8\x26\x38\x58\x75\x13\x7b\xe3\xca\xba\xa2\x6b\x58\x7d\x03\x81\xab\x43\xb5\xec\x73\x38\x61\xf1\x2c\x73\x0a\xaf\x5b\x48\x5c\x86\x53\xe8\x12\x01\xe8\xb1\x78\xa7\xa5\x51\xda\xda\x02\xf2\x14\x23\x02\x9d\xb1\x04\xe7\xb1\x69\xc2\x2e\x58\x94\x99\xc5\x24\x11\x52\xf2\x5f\xa4\xed\x9a\x30\x3a\x85\x71\x98\x66\x2c\x62\x49\x6a\x96\xce\x62\xd4\x57\xc3\x59\x92\x70\x2d\x87\x9d\x5c\x4b\xa9\x15\x55\xce\x26\xa2\x0a\x87\x83\xef\xb6\xe6\x43\xaf\x0f\xa7\x45\x36\x96\xff\x71\x8e\x18\x4e\x7b\x61\xbf\x49\x62\x32\x66\x41\xfe\x18\x24\x4b\x16\xf9\x73\x11\x59\x83\xba\xe5\x20\xbd\xed\x03\x11\xf2\x34\x71\x58\xf1\x4c\xa5\x82\xec\x22\x2a\x2a\x83\x2b\x0f\x5a\x6e\xf5\xe9\xca\x83\xfc\xd7\x95\xb8\xf7\x9c\xc4\xb3\x28\xc0\xa0\x63\x62\xe8\xa9\x00\x11\x0a\x0f\x6f\x24\x26\x74\xed\x6f\x1f\x36\x36\x42\x75\x43\x4a\xf6\x65\x5f\x7d\xe9\x1c\x41\x97\x7d\x39\xd1\x6b\x07\x7d\x31\x01\x84\x81\x7e\xac\xc1\xe2\x7e\x6a\x49\xd2\xa0\x64\x68\xcc\x61\xcc\x8d\x8e\x94\x14\x4e\x69\x82\x83\xc2\x62\x83\x54\x3d\xb4\x46\x50\x9c\x1e\xdb\xa7\x4b\x72\xa3\xbc\x30\x1f\x29\x6c\x47\xe2\x44\x6f\x6b\x0b\xfe\x9a\xf8\x53\x08\x23\xf0\xad\x69\xd3\x66\xef\xad\x2d\x38\xa1\x26\x4f\x60\x1a\x67\x2c\xca\x42\x7f\x3c\x5e\xc0\x80\x71\xd6\xa6\xc7\x13\xf0\x95\x11\xcd\xd3\xb4\x66\x40\xb5\x24\x61\x1a\xdb\x23\xfe\x88\xac\x7f\xae\x00\x3d\x18\x45\xee\x83\xab\x1c\xb6\xa2\x8b\x26\xd2\x84\xf2\xd0\x1f\x35\xfd\xe9\x74\xbc\x10\x95\xd5\x13\x0b\x25\x30\xa6\xf1\x78\x31\x0a\xc7\x16\x14\x5a\xcc\x6b\x27\xad\x87\x66\x02\xc8\x13\x19\xd2\xe4\x72\x13\x52\x38\xb9\x8b\xc9\xc9\x9e\xc3\x78\x51\x7f\xa4\x0b\x11\xde\x85\x32\x43\x7f\x84\x2a\xfc\x76\x0b\xa2\x9d\x76\xc9\x3a\x68\x67\x19\x1f\xc0\xeb\xd7\x41\x7f\x66\xd9\x67\xbf\x2a\x60\xfc\xae\xf4\x85\x35\x83\xc6\x56\x5a\x14\xf2\xa0\x2c\x4c\xe9\x10\xe2\x6d\x78\x5e\x55\x78\x67\x47\x6e\x1d\x9d\x50\xd9\x7f\x91\xfe\x7f\x27\x72\xb7\xaf\x64\x45\x44\xb4\x26\x74\xd7\x7a\x62\xcc\xa8\x7e\x7f\xed\xe0\xae\x9d\x1d\x3d\x83\x33\x64\xa9\x7c\x20\xf7\xef\xe6\x10\xa9\x9d\xd9\xf8\x2a\x4a\x7a\x19\x61\x47\xe3\xcb\xc8\xf4\xd5\x90\x80\xed\x10\xf3\x14\x40\x5e\xf6\x24\x17\x7f\x3e\xd7\x44\x18\xf1\xf5\x3e\xef\x83\x18\x9c\x13\x33\x42\x74\x6e\x34\x8e\xb2\x38\xb1\xb0\xb7\x7d\x1a\x09\x80\x7b\xed\x46\xcd\x74\xec\x53\x2c\x77\xbc\x04\x44\xcb\x92\xd4\x03\x5f\xa6\x01\x5d\xe3\x0a\x60\xb0\xe0\x98\x71\x48\x65\xc8\x01\xff\xff\x48\x6c\x41\xf9\x70\xd2\xeb\x29\xb6\xed\xf7\x4f\x70\x4b\x3f\x9a\x8d\xc7\x27\x4b\xaf\x76\x5b\xcd\xbd\xef\xbf\xda\xb5\x89\x71\xdd\x72\x57\x29\xef\xd7\x71\x4c\xda\x72\x5d\x1d\xa7\xe2\xcb\x35\x3c\xe1\xca\x58\xe7\x7e\xe0\xe0\xc5\x63\x50\x5c\xfb\xbf\x8e\xe3\xb2\xd5\x6e\x59\xf1\x5e\xdb\x83\x8e\x07\xdb\xa5\xcb\xe3\xb2\x0a\x5f\x61\x6d\xbe\xb6\x0f\x2d\x0f\xd6\x16\xfc\x2f\xdd\x5c\xaf\x58\x80\x9b\x15\xed\x38\xe6\xe8\x4b\x5b\x52\xd3\x58\xe3\xd9\xd5\xe5\x4b\x01\x0f\xd4\xd5\x57\xad\x93\x64\xe6\xb7\x6f\x86\x06\x94\x89\x0f\xbb\x5a\xcd\xd4\x79\x9a\x89\x60\x45\xa8\x15\x4c\xed\x28\xe0\x48\x2f\x32\x51\xa4\x6b\xbb\x03\xcb\xa0\x31\xc9\xcc\x82\x77\x44\x6f\xe4\x94\x3d\x0e\x81\x70\x3c\x58\x33\x78\x7d\x0d\x03\x6b\x62\x46\xd3\x48\x36\x5c\x30\xc4\xa2\x8e\xc0\x5a\x11\x33\x1e\x3d\xa2\x54\xf3\x7d\x01\xfe\x5b\x38\xe2\x14\xe5\xf8\x08\xdf\x27\xe8\x76\x0b\x52\x5f\xbe\x04\xb6\x06\xa3\x64\x21\x7c\x3b\xcf\xe2\x3b\x7f\x7d\x4a\x59\x1f\x46\x20\x3d\xe8\x82\x9d\xfc\x69\x9a\x94\x25\xff\xc8\x7e\x0f\x71\xbf\xd4\xdc\x95\x5e\xf9\xd9\x93\x7f\xe2\x77\x3b\x30\xce\xfe\xd1\xd1\x97\x8f\x2f\x8e\xfe\xc6\xf5\x0d\xdb\xdc\x11\x14\x18\xce\x06\xe1\x90\xe8\xf3\xda\x1f\x12\x73\x1b\xcf\xab\xe5\x32\x9d\x61\xdb\x83\x61\xc7\xda\x94\xe9\xb5\x3c\xd8\x86\x75\xe0\x59\xf8\xb7\x03\x9b\xf0\xd8\x4c\x68\xc3\xa6\xcc\xd9\x80\x76\xff\xe0\x81\x7c\xeb\x6a\x32\x1b\x67\x0b\x11\x97\x4e\x35\xaa\x12\x1d\x54\xde\xa9\x07\x99\xd5\x1e\xa5\xe2\x7d\x5f\x7d\xcb\x17\x13\x3d\x08\x73\xd2\x4b\xea\x7f\x9d\x16\x27\xd3\xf8\xd2\xc9\x78\x19\x94\x67\x57\x46\x72\x32\x80\x24\xcc\xc3\x25\x5f\x1e\x4a\xc2\x60\x03\x33\xa8\xa6\xee\x80\x41\xa0\x0a\xba\x95\x51\xcc\x78\xc9\xcc\x3c\x0f\xa5\x8e\x71\x8b\xb4\x8a\xec\xc2\x05\x53\x80\x29\x23\x94\xdc\xf2\x12\xf8\x05\x0c\xb7\x00\xc3\x0b\x76\x54\x8e\x69\x69\x81\x3b\xc6\x19\x74\xa4\xb1\x0f\xb2\x78\x6d\x20\xb0\xa5\x46\xb8\x30\xc6\xa1\x38\xef\x75\xc5\x2e\x41\x1b\x83\x6d\xb5\xfa\x95\x54\x53\xf8\xe4\x08\x47\x9b\x05\xc3\xd9\xd8\xcf\x18\xf5\x6b\x73\x40\x84\x9b\xa1\xd2\xf9\x89\x5d\x66\x71\xb4\x96\x0a\xab\x95\x18\xc1\xd6\x33\x15\xea\xc7\x08\x75\xab\xd3\xc5\xea\x49\xa9\x8a\xe3\x31\xfa\x19\xe7\x9f\xb1\xc3\xf5\x54\xaa\x94\x07\x2f\xe5\x7a\x70\x7c\xce\x16\xb4\x92\xc5\xaf\x67\x58\x9b\x7e\xe8\x75\x2c\xaf\xd8\x3b\x16\xef\xe0\xe8\x87\xef\x30\x45\x85\x75\xe7\x4d\xe3\x1b\x90\x58\x5a\x07\xa6\x5c\xa8\xb4\xb6\x4a\xc3\x67\x21\x31\xad\xa3\xcb\xa9\xb4\xed\x3e\xc5\x54\x20\x3f\xf2\xd3\xd4\xdc\x66\x6a\xe7\x9f\x0f\x17\xad\xe5\x1e\x02\x95\x97\x86\xf7\xd5\x02\x1b\x51\x6b\x35\x5b\xda\x7b\x73\x51\x48\x41\xb4\xda\x56\x19\x95\x52\xee\xf4\x49\x8d\xe1\xcd\xcd\x42\x53\x9d\xdd\x42\x5b\xed\x5c\x5b\xb9\x42\x4b\x37\xb6\x19\x46\xc5\xf6\x76\x3a\xf7\xd5\x37\xbc\x89\x7d\x93\xf6\x5a\xcd\xdd\xbd\x1b\xf6\xaf\xbc\xcd\xeb\x87\x6f\xb5\x26\xe5\x2b\x62\x2a\x57\x47\x74\xb9\xf4\x93\xc8\x75\xc4\x53\x38\x6b\x3d\x53\xe2\xfa\xfb\x5a\x0a\xe4\x5d\xe7\x01\xc3\x45\x49\x3c\x82\x35\xd8\x80\x35\xbc\xcc\x0d\x7f\x17\x7c\xf8\xf7\x35\x0f\xfe\x8e\x3d\xd3\x5f\x9b\x61\x64\xfc\x88\x67\x19\xff\x85\x75\xff\x6e\xd2\x80\xa7\x72\x0b\x8e\xf9\x7c\x79\x8b\x91\xf9\x03\xf8\x21\x5d\x23\x71\x36\x43\x4b\xf0\x2e\xe6\xd1\xef\xcd\xdb\x1e\xcc\x3b\x1e\x2c\xda\x1e\x2c\x3a\xfd\x26\xbb\x60\xc9\xc2\xd0\x8a\xd1\x6c\x92\x37\x58\xc9\xa0\x8c\x66\x13\x3a\x22\xa0\x8b\x40\x68\x4e\xf2\xb4\xe7\xe2\x4d\x60\xfe\xfd\x8c\x56\x1e\x18\xe1\x6b\x29\x0a\x71\x6c\x16\x12\xa3\x0e\x27\x16\x9f\xfc\xdb\xfd\xfa\x1e\x0a\xe5\x32\x9c\x25\x17\xec\x17\x7b\xaa\x70\xa8\x7f\x48\x06\x55\xe6\x6f\xb9\x32\xd4\x77\x55\x26\x60\xc9\x91\x04\x55\x3e\x7d\xe5\x80\x26\x7e\x74\xca\xe4\x8d\x06\x1d\x5e\x4b\xa5\x9a\x0b\x11\xd2\x5a\xb4\x42\xb4\x82\xc8\x09\xea\xb6\x0b\x6f\x8e\x50\xd9\x67\xe6\x06\xba\x28\xdb\xb2\x9e\x3d\x11\x89\xca\x33\xe9\x4a\x11\x66\x50\x98\x1e\x28\xc5\x39\xb6\xa6\x5a\x74\x06\xca\x38\x56\x70\x08\x6d\xd8\x87\xe3\x4c\xcf\xad\x73\xe8\x82\x8c\x59\x5d\xf6\xf2\xe7\xde\x01\x6c\x6c\x84\xf6\x1e\x3f\xbb\xf0\xc7\x9f\x91\xd6\x9c\x9a\xce\xdc\x85\x4d\xb0\xa2\x15\x07\x2c\xf9\x19\x2f\x1d\x29\x92\x3b\x73\x3b\x10\x12\xda\x55\xfe\x20\x75\x08\xd6\x26\x37\xd5\x9e\x69\x4b\xf3\xdb\x37\x09\x43\x27\x96\x45\x32\xc2\x51\x77\xe6\xc5\x78\x31\x73\xdc\xc3\x53\x03\x35\x87\x4d\x81\xf5\x96\x00\xec\x96\xd1\xd8\x82\x47\x74\x26\x8a\x36\xc3\xf4\x53\xc6\xa6\x53\xa2\xb6\x0a\x20\x2f\xaa\x51\x19\xc3\xb8\xab\x5b\x52\xa8\xe4\xdc\x9c\x4e\xe9\x8e\x3e\xd5\xa1\xe4\x92\x09\x1d\xc3\xee\x3e\x7a\x64\x4c\xc8\xad\xbe\x7d\x15\x05\x0e\xed\xcc\x7d\xf8\x7a\x25\x99\x5a\x44\x1f\xff\x53\x9a\x85\xa3\x11\xc5\x66\x1a\x85\xa7\x4d\xfc\xa9\x6e\x2c\x89\xbc\x5c\xd9\x5c\x13\xed\x56\x4b\xc4\x53\x52\x65\x24\x00\x99\x18\xf8\x93\x29\xf5\x56\x34\x23\x12\x64\x39\x9d\x5f\xa8\x91\x6b\x6c\xcf\x68\x2a\x07\x44\x25\x67\x46\x3b\x2a\x9a\x19\xa6\x9a\x45\xf2\xbd\x78\x62\x42\xce\x94\x70\xa5\x7a\xbc\xe5\x40\x89\x24\x87\x1b\xf4\xbf\xe0\x3b\xb1\xd9\x2f\x64\xf7\xff\x6c\xca\xdb\x6b\x35\xc4\x9b\x54\x14\x36\xa9\xac\x0b\xeb\x44\x5a\x2d\x7e\xaf\x5f\x6a\x0a\x71\x38\xb0\x2e\x69\x62\x99\xbf\x3f\xab\xfc\x0d\x70\x24\xfc\x4d\x55\x9b\x03\x0e\x32\xd8\xc2\xc3\x3c\xab\xe2\x2f\x26\x60\x59\x42\xac\x49\x7e\x31\x2e\x66\x29\x79\xc4\x3a\x0a\x5f\x43\x24\x1f\x3d\x02\xb3\xd0\xcf\x6e\xa9\x68\xca\xa5\x9d\xa0\x4d\xab\x5f\xf2\x2a\x50\x8f\xb7\xe1\x61\xb7\xfa\x5a\xd0\x04\x71\x2d\x49\x93\x7b\x28\x32\x0f\xc7\x52\x8c\x91\xba\x9f\x87\x59\x79\xe1\xab\x58\xe6\xab\xe4\x9c\xf0\x51\x7a\x99\x41\xdd\x59\xce\xa2\xee\x08\x93\xba\xa3\x6d\xea\x8e\x30\xaa\x3b\xe2\x67\x89\x59\xdd\x29\xda\xd5\x1d\xdb\xb0\x56\x61\x0f\x85\xb9\xab\x0d\xe4\x92\xb0\xaa\x32\x4c\x4d\xce\x52\x16\x91\x3e\x73\x86\xb2\x65\xbb\x56\x5b\x60\x15\xc6\x60\xb9\x49\x5a\x61\x82\x4b\xed\x6a\xae\x5d\x72\x21\xa5\xa9\xa6\x08\xee\x5a\x51\x53\x6a\xc8\x9b\xda\x70\x34\xc8\xfd\x7d\x18\x85\x49\x9a\x69\x4f\x94\x82\x21\x57\x61\xb1\x99\x36\x9a\x30\xd0\x0a\x16\x9b\x36\xfc\xf0\xe2\xf0\xdf\x45\x97\x4c\x63\x6e\x09\x6b\xee\xba\xb0\xb9\x39\xcb\x8d\xca\x1c\x54\xd9\x82\x4b\x92\x01\x8f\x7f\x34\x2d\xb4\x7f\x4d\x42\x3d\x97\xf1\xac\xae\x33\xd9\xe4\x23\xf9\xf8\x9a\xc9\x55\x21\x22\xcc\xce\xed\x6f\x80\xc9\x88\xdd\x55\x4f\x1b\x4b\xcf\xbe\xf8\x82\x25\x1f\x59\x5a\xe5\x0c\xbd\xd7\xda\xd6\xb7\xbf\x8c\x63\x9a\xf2\xb2\xc6\xed\x2f\xba\x13\xcf\x39\x36\x9c\x4c\xe9\x06\x09\x39\x31\xd0\xad\x82\x84\xa5\xd9\x09\x5c\x9e\x85\xc3\x33\x08\x62\x86\x4f\xa1\x5e\xf8\xe3\x10\x5f\x63\x8e\xb9\x86\x62\xc9\x90\x19\x5a\xe5\xe6\x6e\x57\x78\x6a\x0a\x3e\xf0\x26\x69\x3f\x83\x65\x2c\x81\x2c\x2e\xbd\xd2\xdf\xc3\xd8\xbe\x5d\x0e\x40\x68\xb2\xcd\x36\x5d\x4e\xc0\x0c\x98\xc6\x22\x80\x96\xb8\x26\x64\x43\xbd\xad\x9f\x16\x27\x18\x1f\x0d\xe1\xa8\x85\x4d\x5a\x3b\x45\xc6\x28\x38\x72\xe8\xcc\xc2\x9e\x1a\x78\x97\xae\xa7\xca\xe8\x18\x65\x9b\xd4\xb2\xb5\x92\xfd\xe9\x65\xee\x6e\x5d\x7f\xb6\xfa\x3a\x4e\xde\x5f\x46\x95\xaf\x6b\xcb\x98\x40\x74\xc6\xf1\xa3\x9f\xb2\x57\xfe\xf0\xac\xb2\xf8\xde\xd2\xdc\x35\x8a\x13\x0e\xe9\xa4\xec\xa6\xca\x8d\xae\xa9\x7c\x53\xb7\xca\xe2\xf1\x98\xd1\x58\xe1\xd5\x32\xfd\x73\xb9\x5b\x2b\xaa\xf1\x9b\x5d\x5a\x51\x78\xa8\x03\x34\x8d\x81\xb8\xf9\x24\x69\x2f\x48\x69\xd3\xd6\xd1\xa3\xe2\x96\xb9\x5d\xca\x8a\x25\x1c\xb1\xcc\x15\xb2\x6b\x54\x92\x38\x82\xaa\xba\x77\xb1\x77\xdd\x29\x69\x3a\xa3\x37\x77\x71\x18\xe9\xf8\x83\x6e\xd2\x72\x3d\x67\x84\xc4\xf0\x20\x6c\xb2\x26\x9c\x74\xbb\xdd\xda\xeb\x69\x77\x7b\x70\x39\x2a\xc3\x0f\xcf\x22\xcb\x71\xac\xb9\x0d\xc8\xed\x3b\x5e\xfb\x08\xcb\x73\x90\xe6\x32\xda\x5c\xec\xe2\xa4\x47\x5f\x8f\x1e\x81\x3a\xe5\x53\x87\x70\xe5\x67\x53\x79\xe8\x25\xc3\x7d\x77\x57\xc8\x26\x7e\x36\x3c\x63\xa9\x3c\x96\xa2\x9b\x64\xc2\x23\x40\xdc\xf0\x93\x84\xc3\xd3\xdc\xbb\x19\xdb\x9a\x9b\x9d\x53\xe9\x12\x90\xc5\x70\xca\xb2\x66\x8e\x25\xd2\x64\xf8\x73\x91\x2b\xb0\x17\x4b\xab\x77\x4e\x8b\x2a\x1d\x2f\xe8\x51\x18\x61\x7c\xa5\x5d\x36\x5e\xee\x99\x6b\xfb\xec\x70\x0b\x48\xfa\xed\xd8\xc7\xab\xc5\x13\xdb\xdc\xf2\x82\xaa\x89\xd7\xdb\xbb\x5d\xdd\x67\x15\x88\xc0\x51\x49\xf6\xaa\xf9\xdb\x37\xf5\xf0\xbc\x60\x35\x81\x54\xad\x47\x70\x45\x9f\x4b\xf8\xee\x76\x17\xc1\x0c\xa7\x9e\x2a\x2d\xb3\xf3\xd4\x50\x33\x7f\x66\x19\x0d\x1a\x8d\xb3\x9f\xc1\xc9\xd4\xcf\xce\xc8\x51\x82\x3a\x76\xd2\x84\x37\x6a\xaa\x8f\xc7\xdc\x98\xa3\xc2\x61\x8a\x4e\x18\x8a\x34\x27\x1e\xb9\x8c\x08\x93\xfb\x67\xa5\xb6\x88\xe6\x2c\xe0\x34\x0b\xb3\x14\xa6\x63\x7f\xc8\x56\xb8\x6e\xf0\x24\xef\x80\x41\x84\x2f\xbb\xf4\x2c\xd8\xe1\xb3\x75\xc7\xbe\x78\xed\x99\xe6\x12\x29\x22\xbc\xc7\x58\x05\x3f\x96\x13\x92\x9e\xd9\x4b\xe3\xde\xbd\xee\x2c\x5e\x7f\xd6\xc4\xc9\x51\x2f\x1f\x1f\x68\xdd\x96\x21\xbb\x70\x99\xd3\x87\x76\xc0\xc1\x37\x76\xd7\xfc\xb5\x7d\xe8\x7d\x85\xb5\xc1\xda\x3e\xff\x39\x5c\xdb\x87\x6d\xb8\x82\xab\x3e\x3e\xba\x2b\x3c\x2c\x30\x82\x8d\xf0\x2a\x59\xf3\x7b\xad\x7e\x73\xd0\x1c\xae\x99\x6e\x15\xdb\xa5\x65\x7b\x6b\x3e\x5f\xdb\xb4\x30\x78\x3b\x86\x5b\x5f\xeb\x5f\x5f\x6b\xcd\x47\xf0\x1e\xac\x09\x62\x59\x2d\xa9\x44\x5b\x3b\x98\x00\xf8\x78\x78\x60\x52\x5a\xef\x7c\xa9\x2b\xa1\xb6\x06\x80\x43\x43\x56\xf7\xa5\x2c\x58\x10\x8b\x31\x2a\x0a\xfb\x3d\x66\x93\xb0\x5f\x7b\xad\xf3\x94\x95\x99\x8f\xb7\xbf\xa2\x34\xf4\xd3\xec\x83\x9f\x55\x59\x83\xdb\xbb\x72\x01\x93\xc5\xff\x8b\x55\xad\x72\xda\x3b\xcb\xaf\x48\x4e\x59\x56\x6e\x2f\xca\x00\x9e\x35\xd1\x29\xbe\xaf\x14\x2e\x2f\x34\xb9\x95\x45\x81\x13\x90\x9b\xa6\x44\x65\x49\x70\x87\xb8\x2e\x56\x7e\x6b\xf6\xcd\xe6\x56\xe1\x62\x33\x2f\x5f\x72\x0d\x5e\xf4\x5c\xc4\x01\xc4\x5b\x07\xa5\x97\x95\x95\x10\x8b\x39\x09\xc7\x13\x91\xa0\x5b\xcb\x1b\x1b\x7d\x37\x7f\x2d\x5e\x3c\x6f\xa7\x60\x76\xbb\x0a\xe8\xa1\x04\x68\xdd\x92\xac\x5a\xfd\xfc\xb9\x8c\x7b\x77\x97\xb9\x5d\x74\x9d\xa9\x5b\x77\xaf\xae\xbd\xa7\x1c\x45\xab\x79\xb7\xd3\xd6\x71\x58\x39\x87\x7c\x8e\x6b\xc4\x61\xaf\xb3\xad\xc4\xa1\x7e\x8d\xde\x79\x6c\x5a\xd9\x7e\x9a\xa5\xca\x82\xe5\x6b\x65\xe2\x06\xba\xab\x8e\xe1\x8a\xd7\xe8\x19\xfc\x38\xaa\x0d\x36\x59\x6e\x49\x87\x11\xb7\x83\xb2\xd2\x88\x72\xc2\x7b\xb5\x5f\x26\x25\xdc\x58\x4b\x61\x99\x6b\xfb\x9c\x69\xb5\x90\x68\xdc\x0b\xd1\x35\x04\x6f\x8b\xdb\xee\x79\x67\x68\xe9\x59\x44\x56\x73\x6e\xe7\x48\x1f\x2a\x69\x06\xc4\x81\xcb\x43\x3b\x14\x71\x68\xfa\xb0\x6f\x8d\x99\x23\xc7\x44\xc2\xaf\x0a\xdf\x41\x48\x96\x30\x64\xed\xb5\x29\x3d\xcc\x02\xd6\xf1\xf1\xb2\x9e\x63\x4b\x5d\xa8\x9a\x26\xf1\x90\xa5\xdc\xd8\xdf\x5a\x87\x33\x3f\x99\xc4\xd1\x42\x48\x01\x38\x83\x10\xef\x79\xb8\xb0\xbe\x55\xd6\x66\x33\x70\x4a\xd1\x6b\xf8\x0d\xcf\xf2\x70\x97\x84\xbd\xf4\x93\xe8\x00\xbd\x80\xb6\xd6\x81\xa5\xe3\x30\xca\x20\x8a\x37\x87\x71\x94\xc6\x63\xb6\x0f\x2d\x7d\x09\xf1\x25\xbb\xa0\xd7\xbb\x38\x76\x4d\x16\x5d\x34\x7f\x7a\xff\xf2\xd5\xf1\xab\x9f\x7e\x46\x93\x75\x6d\x9a\xc4\xc1\x8c\xf6\x02\xc5\xb6\x37\x07\x6e\xee\x6b\xf3\xdf\xce\x30\x8e\x02\xdc\xd1\xf1\xb8\xb6\x9f\xf8\x99\x07\xbe\x07\x03\x0f\x86\x1e\x04\x1e\x30\x0f\x46\x26\xa3\xf0\x56\xf5\x6d\x79\x81\x17\x35\x68\xdc\x17\x7b\xf4\x48\x66\xd1\xfe\xa2\x61\xb1\x53\x23\xf6\x94\x6b\xec\x3b\x1b\xb5\x9c\xb5\xb7\xf1\xe9\x97\x2c\x1c\x73\x13\x12\x09\x8a\x81\x94\x58\x92\xc4\x09\x4c\x58\x9a\xfa\xa7\x7a\x87\x6c\xcd\x3e\xac\xa3\x70\x63\xb2\x6b\x76\x1c\xb3\x7a\x0c\xf2\x38\xbc\x0b\x23\xba\x30\xcb\xe6\x18\x3a\x8d\x4f\x98\x43\xbc\xba\x13\x1c\x00\xe7\x26\x5c\xf3\xc4\xd1\xe6\x44\x16\x0c\xd8\x05\xb0\xe8\x22\x4c\xe2\x08\x37\x4d\x71\x67\x94\x6e\xc7\x33\x18\xf1\xc9\x20\xd7\x85\x28\x00\x3f\x20\x4c\xfd\x31\x5e\x08\x1e\xcd\xc6\x38\x3a\x61\x74\x9a\x36\xd7\xf4\xd1\xa5\xf0\xc7\x53\xa8\x52\xc8\x3d\x3c\x67\xe8\xe5\x47\xad\x7f\x90\x2f\xa6\xe2\x6a\x18\x1e\x0f\x56\x67\x89\x32\xcd\x84\xa1\x89\xee\x6c\xfd\x90\x6e\x9d\x9a\xcf\x5d\x94\xbe\x74\x81\xa7\x0e\x12\xfa\xc6\x46\xdf\x7c\xe4\xa2\xec\x95\xaa\x07\x57\xb5\x82\x27\xee\x43\x2c\x2b\xd5\xce\x76\xc9\xd5\x88\xdd\xbb\xb9\x1a\xf1\x7a\xec\x67\x19\xab\xdc\xbf\xdb\x35\x6f\x87\xbf\x4f\x02\x96\xfc\x58\xb9\xdd\xbc\xdb\x31\xca\xd6\xec\x37\x6f\xef\xe8\x4b\x14\x6f\xc4\x5e\xd9\x91\x3f\xae\x72\x23\xdd\xde\xdd\x2e\x8b\x02\x2e\xa3\x8d\xc5\x23\x15\xbd\xc8\x83\x34\x4e\x32\x5a\x84\xf9\xe9\x50\x5c\x4f\x8b\x39\xd6\xc2\xa5\x5e\x98\xb9\x29\xc4\x23\x0e\x2c\x99\x45\x9c\xfd\x80\xf9\xc3\x33\x09\x85\x2e\x0c\x99\x9b\x7e\x67\xc9\x8c\x4a\xc8\x8d\xbd\x26\x7c\x3e\x0b\x95\xf7\x1a\xac\xc3\x94\x25\x9c\xad\x44\x6c\xf2\xc1\x98\x21\x22\x86\x8b\x7f\xc8\x67\x30\x96\xb2\xe4\x82\xd1\xa4\x16\x27\xe1\x69\xc8\x25\x81\x17\x14\x28\x12\x4e\xb8\x21\xa2\xba\xd4\xc4\xb9\x53\x36\x4c\x31\x3e\xe5\x4e\x22\xfa\xff\xc7\x91\xd6\x0f\xfb\xc2\x99\xc2\x5d\xc1\xf3\xbf\x9d\x5f\x78\x1e\xa9\x9e\xdf\xf5\x0e\x69\xb3\xd9\x74\xe4\x76\xca\x37\xf9\xd1\xeb\xbb\x57\xd0\x53\x1d\xec\xf6\x8e\xd5\x43\xa4\xfd\x3e\xee\xac\xd9\x04\xc8\x62\x22\xd9\x60\xb1\x5c\xc0\x1f\xc1\x11\xca\x62\x28\x5b\x63\xce\x52\x7a\xe3\xab\x47\xb7\x0a\xbe\xc2\x1a\x4f\x59\xdb\x87\xb5\x51\xc2\x82\x35\x0f\x00\xd6\xfc\x53\xb6\xb6\x0f\x3b\x7b\x70\xe5\x15\x4a\x0d\xfc\x24\x62\x0b\x7c\xe0\x0b\x4b\x6d\x3f\x2e\x2b\x55\x80\xd5\x5a\x0a\xd6\x0e\x5e\x6b\x80\xbe\x5e\xe1\xf2\x2e\xfd\xb8\x70\x10\x6b\x0f\x7a\x7a\xe7\xc8\x98\x63\xe3\x26\xcf\x3e\xa0\xf7\x76\xd4\x7a\xd4\xbc\x51\xd3\xeb\xe9\xb6\xb6\x1f\xf7\xf9\x02\x58\xff\xde\xc1\xdf\x02\xe3\x9d\x3d\xeb\x57\x0b\xc7\xa5\x14\x15\xea\x85\xc0\x7d\xb9\x96\x77\x72\x2d\x3f\xce\xb5\x65\xe3\xd1\x57\xdb\xdf\xd4\xb2\x71\xc0\xa1\x75\xa0\x66\x47\x4f\x33\x8e\x9e\xdf\x0d\x6e\x2d\xbf\xb1\xd0\xeb\x9b\xf7\x15\xd4\x1a\x48\x81\x52\x0b\x21\x82\xa7\x5f\xcc\xc4\xc5\x8a\xa5\xd2\xca\x71\xe9\xf1\x6e\xe9\x5f\xed\xbe\x32\x47\x35\x9f\x77\x25\x1a\xda\x51\x4a\x35\xd4\x29\x69\xa8\x1a\xb8\xf9\xab\x53\xd1\x94\x59\x3b\xbf\x10\x33\x34\xbf\xd5\x1d\x63\xf6\xd0\xad\x7b\xd0\x76\x3d\xc0\xc8\x12\x57\xa5\xa7\x0f\x34\x6e\x25\xf6\xef\xed\xe3\xb0\xb3\xdf\x2a\x43\x61\xee\xaa\x09\x07\xd5\x44\xcd\xa5\xbd\x76\xab\xad\x27\x27\x61\x4b\x94\x2f\xdd\x5a\xb9\x9b\x80\xab\x1d\x79\x70\xfd\x74\x1a\x5e\xb0\xc8\xf0\x13\xe4\xca\x9d\xee\x56\x47\xfa\x10\x89\x5b\x0a\x4b\x2f\xcb\xd4\x0d\x56\x5d\x5f\xec\x7a\x8a\x46\xf2\x7b\x7c\xb4\xb6\xae\xa8\x4a\x99\x71\x82\x1b\xeb\x55\x10\x8c\x8d\x90\x12\x10\x22\xd7\xae\xbc\x7c\xc4\xf0\x6b\x29\x43\x0a\xb4\xf6\x98\xc5\x12\x13\x3b\x14\x5a\xe1\xc2\xac\x3a\x5b\x91\x1b\xde\xd7\x5c\x8e\x12\x57\x45\xc5\x4a\x01\xa1\x1e\x18\x7e\x0b\x60\xf8\x8f\x2a\x8b\xf1\x50\xad\x45\xf1\x9e\x96\xc4\x81\x44\x9a\x43\x70\x2c\xec\xe4\x0d\x17\x33\x84\xb3\x06\x2e\x5c\x5d\xf4\x36\x89\xba\x53\xa7\x1e\x5f\xcb\xf9\x48\xfc\x26\x5a\x94\x51\xab\x41\xdf\xe5\x32\x84\x5e\xf4\xb4\xfc\x68\xc9\xa4\x68\x89\x24\x2f\xe3\xd8\x60\x1e\x2b\x5d\xb3\x67\x57\xf0\x21\x58\xc5\x6f\xa0\xe2\xf8\xaf\x24\xde\xff\x7a\xf1\x7d\x80\xf2\xf2\x2b\xde\x74\x3c\x45\x83\x95\x2f\x8c\xfc\x48\x06\xd0\xbf\x96\x6b\x71\xdf\x2a\x53\x9b\x0f\x18\x76\xb8\x78\x2e\xf8\x5c\x86\x62\xaf\xdc\xfa\x2a\xdb\xf9\xba\x9b\x63\xff\x57\xf3\x2c\x61\x93\xd9\xa4\x72\x57\xf6\xb1\xb1\x18\x78\x5b\xa9\x1c\x77\x65\xb1\xeb\x7d\x59\xcc\x47\x53\x26\xd3\x59\x26\x2c\x69\xbe\x24\xe5\x78\x10\x49\x38\xcf\x88\x18\xa1\xf0\x46\x7d\xf3\x71\x60\x93\x69\xb6\xe0\xca\x0c\x09\xbe\xf0\x72\x07\x3b\xe6\x21\x4e\x99\xf9\x9c\xb7\x97\x73\xe6\xb4\x32\x9f\xdf\xf9\xd9\x59\xc1\x70\x2e\x0d\x8f\x5a\xb4\x93\xab\x36\x7d\xad\x2e\x96\x07\x83\x9a\x84\x91\xd3\xdb\xc1\x7b\xab\x7b\x1e\x3c\xb6\x6c\xaf\x8e\x5d\xca\xca\x53\x04\xc8\x9d\x5f\x86\x91\x08\x83\x6d\x72\x1d\x25\x91\xcb\xad\x0e\x6a\x49\x8a\xe6\xd0\xe2\x0a\x19\x3e\x53\x8e\xaa\x27\xd8\x80\xca\x5e\xbb\x6d\x3b\x09\xa3\x12\xc6\x5d\x35\xc0\x6d\xbd\x5e\x19\xff\x93\xeb\x95\x31\x4b\xd3\xd5\x95\xca\xdb\x6b\x95\xca\xb3\xeb\x94\xca\xdb\x32\xa5\xb2\x8c\x2b\xc1\x77\xbc\xeb\xfa\x7f\xce\xa5\x53\x43\x2f\x6a\x9b\x46\xa4\x39\xa1\x35\x7e\xa1\x76\xfe\xfd\xf0\xf6\xc5\xd1\xab\xe3\xbf\xbc\x7f\xfb\xf2\xd5\x47\xc3\xf9\x37\x97\xcc\xeb\xae\xfd\xeb\xbf\x4a\xb8\xfe\x78\x0b\xf7\xc4\xce\xe2\x71\x80\x8b\x51\x22\xe7\x81\x3c\xee\xf8\xc0\x33\xff\x82\x99\x16\x36\x66\x06\xe7\xae\x3c\x53\xe1\x2e\xa4\xd9\xb4\x79\xfd\x33\x49\x16\x2d\xfb\xe6\x27\x4f\x51\x51\x5c\xf2\x97\x27\x8f\x79\x7e\xc8\x02\xc7\xdc\x6e\x2d\x5c\x0c\xc0\x78\x4c\xf0\xed\x5b\xf1\xca\x00\x5e\xa1\x23\x5b\xcb\xc4\xba\x50\xee\x19\x07\x60\x9f\xb3\x9a\x37\x09\xdc\x82\x17\x86\x44\xac\xec\x3a\xc5\x28\x12\x61\x5d\x14\x38\x33\xb6\x4b\xee\xc6\x29\x12\xe0\xa7\x02\x49\x7e\x72\x22\x8c\x26\xa3\x6c\xd5\xc8\xbe\x0e\xa8\x9a\x52\xee\xaf\xfa\x2e\x07\x12\xb4\xb0\xc1\x79\x8f\xf7\x25\xaf\xbf\x31\xa9\x48\x24\x77\x77\x8d\xd7\x76\x4e\x53\x11\x90\xda\x40\xda\x88\x57\x67\x6e\xca\xe2\xa6\xbc\xcd\x5a\xb4\x29\x6b\x1e\x56\xea\x8b\x94\xf2\xa1\x9d\x2e\x44\x45\x37\x9a\xf2\x41\x4a\xab\x2e\xc8\xe0\x90\xc0\xa6\x81\xbc\x57\x4d\xeb\xa5\x9c\xe9\x13\x96\x66\x2f\x6e\xe5\x50\x4f\x18\x12\x94\x7a\xc7\x7a\xc8\xbf\x77\x1e\xb1\x4b\xd1\x36\x0e\x80\x7d\x75\xd8\xa2\xbe\x71\x40\x96\x13\x21\x17\x0e\x55\xf3\xcd\xf4\x2c\x1c\x65\x8e\x4b\x82\xa3\x9a\xd4\xb7\x9f\x6a\xc8\x5e\xa2\xb3\x05\x7a\xae\xbc\xf4\x2c\x9b\x91\xbb\xef\x62\x1b\xde\xbe\x5a\x9e\x60\x2c\x53\x75\xf3\x41\xfc\xb6\xe5\x2a\xaf\x69\xc4\xc8\x8e\x22\x35\x2c\xa3\xc8\x00\x8a\x77\xa9\x0c\xa0\xf2\xb7\x7d\x2b\xce\xc1\xc7\x51\x3d\x60\x51\xa0\xbd\x39\xfc\x24\xd1\xd1\xbd\xad\x29\x06\x4b\xd3\x64\xc2\xa2\xc0\xba\x68\x86\xf3\x07\x6c\x52\x11\x3e\x98\x61\x5e\xbe\xfd\xc4\xb8\xf4\x31\xf1\xa7\x06\x72\xf4\x4b\x74\x53\x0d\xe6\x28\xc2\x19\x4d\x6b\x92\xd2\x49\xf0\x81\x25\x68\x09\x31\x44\xe4\xe6\x5b\x17\x33\xf5\x39\xa3\x27\xba\xdc\x1c\xe3\xa8\x27\x0e\x4c\x58\x3d\x75\x6d\xda\xd5\x60\x91\x33\xe4\x13\x48\x71\xca\xac\x2b\x2b\x32\xc5\xb8\xad\x82\x49\x65\x17\x55\xb6\x97\x53\x65\xdb\x42\xae\xb6\xb5\x5c\x6d\x0b\xb9\xda\x16\x3f\x4b\x2e\xaa\x6c\x17\xe5\x69\x5b\x5f\x54\x11\x0f\x08\xa9\x0b\xdb\xb9\xae\xcb\x69\xdb\xba\xd8\x32\x8a\x94\xcc\x25\x0c\x9f\x5c\xa3\x8b\x1d\x5b\x5b\xe2\x5e\x82\x71\xc0\x1d\xc9\xbb\x06\x78\x07\x3f\x44\x97\x77\x89\x8b\x04\xc7\xeb\xbc\xc6\x13\xd0\x88\xee\xc9\x88\x8d\x0a\x3f\x1c\xa7\x32\x5d\xdd\xef\x37\xef\x29\x14\x95\x96\xbc\x0f\x4b\x55\x8b\xd1\x1e\x12\x96\xea\x29\xc9\x12\x69\x9e\x25\x05\xd3\x93\x38\xd5\xcd\x81\xf9\x49\x50\x90\xc2\x14\x34\x95\xa2\x45\x4d\xd0\x6b\x75\x66\xb6\x28\x7d\x25\xde\x06\xe3\xf4\x1d\x30\x71\xaa\x6f\xc9\x57\x33\x9d\x8e\xc3\xcc\x59\x5b\x73\x65\xcd\xe6\xaf\x71\x18\x39\xe4\x74\x2f\x45\x8f\x4d\x62\x7a\xb7\x55\x89\x9f\x4a\xd1\xeb\x2a\x4a\x52\x4a\x47\x46\xad\x14\xaa\x97\xee\x8a\xe8\xe4\x8f\xd2\x01\x8c\x32\xea\x06\xcb\x92\x81\x9d\xe5\x64\x60\x47\xc8\xc0\x8e\x96\x81\x1d\x21\x03\x3b\xe2\x67\xe9\x9c\xbe\x53\x94\x82\x9d\x7e\xe1\x68\x5a\xf5\x8b\xae\x68\xa6\x85\xab\xd7\x17\xfe\xb8\x2c\x1c\x85\xb4\x18\x65\x7d\x6e\x3f\x4b\x1d\x9f\x2f\xab\x89\x64\x35\x6f\x90\x94\xb7\x7c\xa0\x12\x15\x41\x6b\x66\xfb\x07\x95\xf0\xaf\xca\xee\xf1\xec\xd6\x7a\xb3\xde\xc2\x71\xa3\x7c\x11\x54\xee\x6a\x61\x2f\x88\xcc\xe5\x90\xf4\xb3\x90\x4e\x1d\xe1\x04\x9d\x3a\xd6\xb7\xe8\x12\xec\xb1\x38\xa2\x3e\x7e\xf3\xee\xc3\xfb\x8f\x9f\x5f\xbd\x3c\x7e\xf7\xfe\xe5\x97\xb7\xaf\x8e\x5b\xc7\xc7\x69\x32\x3c\x1e\xf8\x51\x80\x0f\x1d\x95\x6e\xca\x3c\x6e\xdb\xc0\x13\x76\x5b\x9f\x91\x74\xe8\x8f\xd9\x8f\x7e\x14\x54\xf8\x8e\x2c\x89\x70\xaf\xe1\x37\xfa\x07\xf9\xbe\xdf\x11\x7a\x1f\xe2\x30\xca\x6e\x8b\xdf\xa0\x04\xbf\x65\xc7\xa6\x4d\xa0\xe4\x7c\x52\x3d\x3e\x7b\x3b\xf7\x42\x80\x37\xa2\xe1\x95\x69\x50\x40\xbc\x7c\x9c\x96\xa5\x43\x87\xc0\xd1\x4d\xc3\x4a\x2a\xb4\xf1\xca\xda\xdd\x53\xe1\x2d\x36\xbb\x32\x0d\x72\x48\xdf\x8e\x02\xdb\x02\x58\x7c\x5a\xd9\xfd\xa7\xad\x27\xf7\xd3\xfd\xf8\x74\xe5\xbe\x9b\xe8\xde\xae\xe3\x3b\x04\x29\x4e\x82\x30\xf2\xc7\x95\x9d\xdf\x7e\x72\x3f\x1a\xea\x3d\xb5\xbb\x32\x01\xf2\x68\xdf\xab\x9e\x7a\x33\x99\x8e\xc3\x61\xb8\xba\xaa\x2a\x62\x79\x1b\x6d\xb5\x4b\xd0\xa6\xf1\x65\x0d\x8f\xee\xdd\x93\xa6\xbe\x5c\xb9\xf3\x26\xba\xf7\x3a\x3c\x9f\x7e\x4b\x56\x1f\x1a\x1b\xbb\xdb\x0c\xcb\x63\x82\xf4\xdb\xcc\x8f\xb2\x70\xcc\x6a\xc6\xe6\xe9\xbd\x74\xff\xdf\x45\xc3\x2b\x93\xa0\x80\xf8\xed\x34\xc9\x13\x13\xdc\xef\x35\x74\x68\xb7\xee\x91\x0e\xbf\xaf\x4e\x87\x02\xe2\xb7\xa3\xc3\x1e\x81\xcb\xce\x12\x96\x9e\xc5\xe3\x6a\xab\xef\x69\xfb\x7e\x74\xea\x67\xd9\xf2\xca\x94\x28\xa2\x7e\x3b\x52\x3c\x15\xf0\xc2\x49\x35\x3b\x6c\xef\xdd\xcf\xb4\xfa\x39\x9c\xac\xce\x0a\x16\xc2\xb7\xb4\x2d\x85\x9d\x3a\xcb\x86\x9f\xeb\xfa\xff\xb4\x73\x3f\xfd\xff\x92\x0d\x57\x37\x2b\xf3\x38\xdf\x6e\xf8\xdb\xc2\x4c\x95\x67\xba\x1c\x7c\x25\x15\xee\x61\xe2\x3a\x63\x13\x76\xa4\xda\x5e\x9d\x1a\x25\xe8\xdf\x92\x20\x1d\x1b\x62\xa7\x35\xa8\xa1\xc8\x3d\x4c\x17\x26\x45\x3a\xad\xc1\xea\x24\x29\xeb\xc0\x2d\x69\xb2\x9d\x07\x39\xac\xa6\xc9\xf6\x3d\x4c\x1d\x36\x4d\x6e\x20\x34\x65\x1d\xb8\x25\x4d\x76\xf2\x20\x6b\x48\x72\x0f\x93\x88\x4d\x92\xd5\x29\x52\x82\xfe\x2d\x09\x22\xcc\xb5\xe1\x6c\xc0\xce\xd8\x38\x9c\xd7\xd0\xa3\x73\xd7\xf4\x08\xa3\x8c\x25\xd3\x78\xec\x67\xec\x48\xb6\xff\x92\xee\x39\xae\x4e\x9a\x62\x47\x6e\x49\x19\x61\xc5\x25\x7e\x18\x0d\xea\x56\x06\xdb\xdb\xf7\x48\x97\x8f\xd4\xfa\xea\xe4\xc8\x63\x5f\x3e\xe7\xde\x29\xae\x7f\xf5\x93\xc9\x5d\x20\x3a\xbc\x6f\x44\x8f\xe2\x78\xf5\x85\x71\x09\xa2\xb7\x62\x2f\x61\x1c\x5f\x84\x49\x18\x84\x69\x0d\x7b\xdd\xf9\x0e\x99\x41\x89\x9f\xa9\xf5\xd5\x89\x91\xc7\xfe\xbe\xd6\xa1\x06\xae\xef\xfc\xd3\x49\xd5\x85\xbd\x95\x30\xbd\x77\xfe\x7a\x13\x8d\x58\x12\xc5\x77\x81\xeb\xbd\x0b\xed\x87\xb1\x9f\xde\x0d\x59\x83\xdb\x48\x83\x58\x20\xa5\xec\xb7\x19\x39\x68\xd7\x08\xc4\xfd\x6c\x96\x7e\x52\x4d\xaf\x4e\x8c\x12\xec\x0d\x81\x58\xf2\xbf\xdc\xa1\x4d\x6d\xf0\x82\xdb\xdd\xb6\x9d\x45\xb3\x94\x05\xf9\x5b\xb4\x83\x30\x65\xc3\xec\x63\x78\x7a\x96\x51\xd3\xb5\xe5\xde\xb2\x91\x2c\x76\x83\x83\x1b\x75\xf7\xad\xfa\x64\xa0\x7d\xe3\x93\x07\x42\x30\xae\xde\x6f\xdf\x7e\xdc\xa2\x61\x41\xa7\x07\x89\xca\x8f\x58\x4d\xbd\x2e\xe4\x2c\xd9\x06\x1f\x68\xd8\x5a\x57\x01\x1a\xd6\xb7\xfa\x6e\x4d\x5d\xbb\xf3\x65\x95\x0f\xc8\x83\xd9\x18\x8d\x6e\x1e\xc9\x66\xc2\xd3\xcd\x82\x38\x1c\xc5\x72\x63\x36\xca\x2c\x32\xca\x86\xc4\x58\x5a\x82\xa2\x58\x09\x79\x17\xba\x5c\xa0\x14\x12\x6e\xd1\xa5\xf2\x71\x6d\x84\x82\xdb\xb1\xe8\xfd\xf1\xd4\x83\x9b\x93\xc3\xb8\xbf\x85\x5e\xb1\xe6\x8d\x2d\x72\x93\xb5\xc3\xe0\x8b\x54\x73\x5c\x44\xd4\x21\x7c\x3c\x41\x00\x31\x02\xa1\xd0\xd9\x31\x1f\xb4\x7d\xe3\x21\x54\x0f\xe6\x1e\x8c\x63\x0f\xce\x42\xfb\x0a\xf5\x38\xd6\xf7\xc3\xf8\x37\xa8\x48\xeb\x3c\xf7\x2c\xd4\xb9\xfc\x1b\x7c\xe3\x5a\x18\xff\x4f\x84\xc8\x18\xc7\xf0\xcc\x02\x4d\xa7\xfb\x13\x7c\x9c\x72\x1c\xc3\x06\xaf\xfd\xfc\xf9\x73\x30\x42\xe3\x1b\x7d\x76\xfc\xde\x24\x0c\xfa\x1e\xcc\x5d\x0a\x91\x8d\x98\xf0\xda\x1b\x66\x0d\xf4\x26\x45\x34\x26\x61\x60\xdf\x47\xd6\x67\xd9\xb1\xf4\xc8\xa0\x13\x6e\xce\x77\xff\x9c\x84\x78\xce\x09\x91\xef\xad\x20\x42\x19\x7d\xaa\x08\x21\x8e\xf4\x2d\x7f\xe1\x32\x5e\x1a\x95\x47\xea\x0a\x10\x19\xcb\xb9\xe4\x5a\xe5\x76\xbd\x82\x72\x46\x4e\xe0\x72\xc8\x3a\xd4\x56\x5e\x33\xdc\x63\xa8\x88\x7c\xec\x87\x70\x32\x99\xe1\x8d\x66\xf7\x1a\xf1\x9d\xfa\x61\x52\x36\xfd\x15\x75\x00\x3d\x1b\x84\xa5\x14\x38\x51\x4a\x80\xb5\xb4\x81\xb8\x49\x60\x04\x68\x18\x69\x86\x1b\xa9\x96\x45\x04\x1b\x72\xd8\x26\x77\x56\x7d\x45\x01\x36\xa1\xed\xc1\x54\xa6\xe2\x15\x49\x5e\x0d\x7d\x6e\xd8\xa5\x70\x89\x89\xb8\x84\xc1\x21\xb4\x60\x1f\xc8\xd3\x4d\xb0\x6e\x08\xcf\x20\x72\xa9\x06\xb9\x75\x8f\x9c\xa9\x09\x6f\x63\x23\xec\x9b\x9a\x06\x4b\xe6\x39\x8b\x27\x72\x29\x1b\xd8\x8f\xff\xf0\x94\x7e\xe9\x30\xd7\x5e\xf0\xff\xee\x13\xc0\x85\x9f\x84\x7e\x34\xac\xd9\x11\x7f\xbc\x7d\x47\x13\x80\x3d\xe4\x1c\xb3\x8b\x65\x0c\x07\x0b\xc9\x52\xd1\x52\x80\x8d\xb1\xba\x80\x43\x0a\xe8\x9d\xfe\x96\x64\xce\x85\x0b\xfb\x70\x21\x86\x2e\x3f\x20\xb5\x57\x54\xbf\xfb\x80\xd0\xbd\xc2\x1a\xb7\x87\x9d\x3b\x1a\x0e\x0a\x8a\x25\x2e\x0a\xc6\xc6\xa8\x70\x31\x13\x11\xb3\x84\x8f\x99\x50\xb4\x13\x33\x88\x14\x97\xc9\xcd\xb6\xca\x62\x7e\x64\xe6\xd2\x6d\x14\x15\xc9\x7a\x9c\xf9\x2a\xf8\x3e\x5e\x2e\xa3\x38\x1e\xea\x9d\x88\x78\x94\xbf\xb4\x2d\x64\x74\x63\x43\x48\xa9\x39\x73\x3d\x0c\xd3\x9f\xfc\x9f\xc4\x0b\x13\xcb\x71\x90\xa4\x6a\x29\xff\x50\x67\x7b\x61\xdf\x75\xcd\x79\x0c\xd1\x96\xb4\x80\x4d\xec\xa3\x9e\x96\xb0\xc7\x1b\x5d\x51\x6a\x0b\x36\x36\x26\x3a\x93\x77\x52\xe5\xad\xcb\xc7\x30\x08\x44\x69\x60\x91\x07\x60\xc6\x47\xf9\xee\x9d\x8f\x47\x9a\x08\x1e\x84\x82\x29\x52\xf7\x1f\x4a\x10\xde\xdb\x09\xbd\x36\x22\x43\x28\xcf\x26\xb0\xc5\x13\x37\xa1\xed\x56\x48\x73\xed\x35\xd5\xbb\x91\xe6\xef\x26\x70\xb6\x8c\x59\x32\x35\x09\x23\xf5\xe9\xcf\x57\x96\x26\xd8\xda\x82\xd7\x61\x14\x50\x60\x1f\xf4\x48\x1e\xaa\xd8\x9e\xea\x46\xa2\x62\x3a\xc5\x6e\x5a\x54\xcc\xf0\x70\xe2\xde\xaa\xc8\x36\x59\x66\x12\x46\x18\x43\x74\x2e\xeb\x6a\x96\x28\xc5\xe9\x48\x58\xff\x14\xd4\x65\xe2\x87\x18\xc8\x45\xc5\xef\x03\xd3\x84\xac\x41\xca\xcd\xbd\xec\x8d\xac\x14\x46\xf0\x5c\x62\x48\x78\xe5\x30\x52\x25\xfd\x39\x3c\x53\x25\xcb\x70\x2f\x7d\xeb\x7b\x79\x71\xbe\x15\xf5\x2b\x65\xf5\x8f\x36\x22\xd7\x22\xfa\x07\x18\x25\x69\xae\x71\x71\xe2\x40\xfa\x15\x5a\xa5\xf6\x76\xf5\xdd\xda\xe6\x37\xdd\x90\xab\x3a\x3f\xc5\x5b\x01\x85\x4d\xc6\xfb\x8a\x02\x37\xf1\xa7\xd4\x96\xb8\x1b\x83\x91\x14\xc9\x7b\xdf\x7c\x79\x1a\x63\xbd\x70\xc4\x94\x49\x4f\x68\x1a\xd7\x5d\x28\x99\xc3\x2b\x0e\x47\xed\x9d\xe1\x7f\xa8\x92\x17\xa1\xfc\xd3\x2c\x9e\x7a\xf8\x7a\x0b\x31\x39\xbd\x40\xd0\x85\x0d\x23\x9f\x7e\xca\x72\x1c\x4a\xd9\x7d\x3d\x17\x9e\x41\x07\x0e\xc1\x11\x55\x14\x00\x02\xd8\xf2\xf8\xfc\xb8\x0f\x7c\x95\xb3\x2d\x1e\xc0\xda\xe0\xf0\x74\xf8\x4f\x6b\x12\xe1\x4d\xa0\x5d\x3c\xf1\xe7\x4e\xcb\xa3\xef\x21\x0b\xc7\x0e\x35\xb0\x29\x5f\x2e\xd8\x22\xec\x5d\xf8\xa6\xad\x3a\x79\x2d\xca\x58\x5c\xb9\x66\xe0\xd0\x9c\xc1\x82\xc5\x69\x65\x45\xe8\x6e\x40\x88\x6f\x04\x71\xec\x6c\x01\xc4\xa2\x15\xb2\x57\x7b\x09\xf9\xbb\xaf\x8b\x07\x38\xe0\x59\x38\x3c\x7f\x13\x0d\x13\xbc\x7f\x7e\x53\x50\x43\x05\xea\x13\x92\x04\xa3\xdd\xb4\x5b\x72\x84\x70\xe5\xa2\x22\xb5\xb1\x5d\x2b\x5d\xc5\xa9\x61\x1d\x2b\xbd\x43\x01\x15\xee\x94\x8d\x87\xf1\x2c\xca\xcc\xf8\xc5\x78\x59\xa6\xdc\x48\x51\x56\x09\xef\x56\xaa\x5f\xdc\x12\x0c\x99\xe7\x7b\x5b\x2a\xb0\x21\xfe\x1b\x3f\x64\xc8\x15\x51\xaa\xdb\xa5\xda\x18\xa0\x91\x97\xc3\xfd\x22\xa9\xc0\xb1\x50\x5f\x56\xd1\xd7\x8a\xb0\xca\x33\xc9\xd4\x51\x51\x80\x24\x26\x88\x57\x24\x01\x38\x42\x24\xad\x71\x2e\xa3\x8a\xab\x6f\x25\x3f\x0c\xd3\xd7\x61\x14\x66\xcc\x11\x92\x63\x04\x9e\x52\x5d\x61\x53\xc2\x5b\xbc\x61\x24\x90\xd0\x52\x48\x29\x42\xf8\x0e\x44\x21\xc4\x0d\xcb\x8c\xc6\x71\x9c\x90\xa4\x5a\x65\x90\xda\xb9\x6d\x0f\x1b\xac\x96\x6d\xd8\x80\xb6\xbc\x60\x99\x17\x5c\x84\x43\x22\xeb\x28\x99\x75\x4d\xa1\x35\x0d\x1b\x0b\x7d\x89\x1a\x4f\x5a\xaf\xc2\x5f\x23\xb3\xbe\x1a\xfa\x1c\xea\x26\x81\x5a\x09\xfd\x4d\x8e\xfe\x96\xad\x73\x0c\x0e\x11\x55\xcc\xab\x63\xc6\x1b\xe4\x3c\x2b\xbf\xdf\x73\x2d\x47\x28\x39\x91\x5a\x3d\xaf\x57\x4d\xf5\x4b\x55\xa4\x98\x4c\xe3\x4b\xbc\x84\x6f\xd0\x13\x3f\xc7\xf1\x29\xf1\x94\xac\xfd\xf6\x27\x25\xff\x20\x42\x72\x76\xa9\xbd\x2d\xfd\xa6\x73\xbb\xe5\x11\x44\x6b\x0f\x0b\x9b\x78\xde\x85\x96\xa8\x7d\x08\x0e\x01\x78\xde\x45\xe5\x73\x08\xed\x16\xec\x83\x4e\xdb\x85\x43\xd8\xb5\x52\xf8\x74\xd4\x81\x7d\x3e\xf1\xac\x97\x35\x27\x20\xef\xc3\xa6\x95\xb9\x49\xb9\x7c\x05\x77\xf3\x16\x71\x4b\xcd\x1a\x0c\xae\x3b\xaf\x1d\x07\xa5\x54\xfd\x41\xba\xc2\x80\xf0\xaa\x6d\x59\x55\xf6\xa3\x6a\x74\x5a\xf6\xf0\x94\x8e\x4f\x4b\xf0\x62\x5b\x2a\x1a\x93\x12\xae\x68\x6f\xbd\x0b\x6d\xdc\x8c\x57\x31\xe2\x0c\xda\x18\x85\x76\x2b\xca\x74\x8c\x32\x9d\x03\xf3\x31\x39\xad\x0b\xe1\x10\x36\xa9\xd0\xbe\x44\xa8\x64\xaf\xf2\xbe\x2e\xc1\xdd\xd5\x62\xda\xda\x73\xd5\xea\x42\x0d\x8b\xb5\xaa\x36\x86\xa7\xe3\xd2\x41\x42\xa9\xbd\x71\x8f\x87\xc8\x7f\xb0\x1d\x84\x3f\xf8\xb6\xc1\x77\xdc\x30\xe0\xe8\x58\x4b\x4f\x7b\x65\x5a\xb1\x10\xfd\x27\xdf\x04\xf8\x07\x2f\xff\xef\x89\xe6\x72\x21\xca\xd9\xbb\x4c\xbe\x9f\xfc\xb1\x4e\xe0\x27\x61\x54\x73\xf6\xf2\xf4\x8e\x36\xfb\x27\x7e\x96\x84\x73\x23\x24\xa2\x43\xbb\x40\x3c\x55\x85\x22\xb4\x23\xa5\x5a\xb1\x2c\x36\xdb\x1e\x6e\xff\x2f\xb3\xdd\x8c\x3d\x2a\xdd\x6b\xa6\xf6\x3c\xf9\xe2\x83\x07\x59\xe2\x47\xa9\x88\x02\xa1\x6d\xbf\x89\x8b\xc1\x32\xe0\x19\x4c\x0e\x0a\x17\xe1\x7f\x15\xd8\x44\x1e\x24\xf1\x25\xbe\xa2\x2a\x60\x90\xdd\x67\xad\x4d\x61\x63\xe3\x57\xce\xcc\x07\xc6\x15\xf3\xf8\xb2\xf7\x6b\x5f\x75\xbe\xf7\x6b\x5f\xdf\x44\xb7\x83\x25\x2a\xc0\x79\x13\x90\xd0\x77\x02\x6b\xf6\x09\xd4\xf9\x78\x71\x1e\x7d\xf2\x1d\x8f\x76\xef\x7a\xfb\x28\x14\xd7\x0d\x2b\x77\x90\x96\x3e\x4b\x16\x17\x0f\x6f\x28\x28\xc1\xf6\xb1\x0e\x53\x5b\xed\xad\xf2\x64\xef\xc6\x2e\x50\xb8\xe1\x54\x09\x59\x88\x22\x05\xcd\x12\x34\x81\x2e\x7c\x8d\xfc\x09\xdb\x87\x86\x4c\x6a\x5c\x99\x9c\x22\xba\xec\xe0\xf6\x86\x9e\xae\xe5\x8b\x2c\x4b\x48\x53\xae\xdb\x52\xac\x26\xfe\x94\x44\x4a\x59\x99\x41\xcc\x95\x33\x86\xa2\x91\x49\xb3\xe8\x3c\x8a\xf1\x11\x47\x35\x88\xa8\x20\xc5\x2e\x8e\xf8\xab\x5e\x1f\xea\xf5\x61\x7f\x29\x0a\xf5\x1a\x03\x44\x82\x36\xf0\xd6\xb7\xfa\x14\xf7\x9e\x3a\x49\x71\x70\x24\x01\xd0\x4b\xd0\x51\x6f\x14\xf0\xce\x53\xa4\xa9\x00\x36\xa0\xd1\xf0\x50\xb9\x20\x39\xf0\xfd\xa5\x73\xb6\x10\x2b\x3b\x3a\xea\xb2\x8f\xbe\x64\x7f\x1e\x76\x75\x8f\x94\xd2\x12\x99\xca\x87\x05\x61\xa6\x04\x93\x9a\x21\x0a\x35\xa7\xb3\x94\xcb\xae\x5b\xf2\xb6\x1a\x6d\x58\x39\x21\x9e\x2f\xc1\x0f\xf4\x5b\xc8\xb5\x8e\x07\x83\x7d\x6a\x2a\x7a\x2b\xa1\x39\x36\x83\x97\x3d\x2c\xee\xe3\x49\x45\x41\x68\x50\xb0\x16\x81\x85\x39\x78\x77\xca\x1d\xfa\xb5\x6c\xa9\xc5\xf1\x4d\x00\x15\x3c\x24\xf0\xf8\x78\x94\x2f\xa6\x69\x08\x90\x8e\x67\x7e\xea\xd0\xb8\x39\x01\xaf\x8f\xa6\x13\x1f\x40\xd7\xcd\x53\xba\x94\xca\x72\x01\xc2\x29\x67\xbc\x89\x8d\x84\xcc\xc7\x5a\xd2\x74\xd4\x01\xc1\xec\x28\x6e\x87\xe0\xc8\x4a\xb7\x60\xd7\x63\xd7\x23\x0c\x5c\xd8\x17\x23\x6d\x8c\x89\x89\xa1\x96\xa3\x95\x70\xd4\xd5\x8e\x8d\x96\x0c\x3e\x35\xdb\x18\xc6\x53\x33\x8a\x55\x3e\x5a\x8f\x54\x24\x3a\x5c\xb0\x60\x40\x87\xfe\x18\xe9\x14\xaa\x8a\x84\x51\xa7\x8a\x66\x25\x52\x46\x1f\xed\xb1\x29\x99\xbc\xbe\x83\xc3\xca\x7d\x9d\x46\x04\xec\xb4\x93\xf8\xc1\x9d\x9f\x7e\x54\x4d\x96\x89\x1f\x74\x02\x76\xaa\x4f\x40\x04\x02\x72\x0b\xe1\xc3\x1b\xd8\x82\xf6\x5e\xeb\x40\x44\x1d\xc3\xd2\xd0\xe5\x49\x72\x71\xfa\xe1\x4d\x89\xc9\x7a\x8f\x2e\x2a\xe5\xfe\xca\xc9\xe9\xe0\x47\x3f\x0d\xd3\x5a\xa7\x66\x59\xe8\x68\x1c\xf3\xdc\x9b\x3a\x36\x93\x12\xab\x71\x3d\xde\x7d\x7c\x73\xb7\x66\x8e\x5f\x25\xe0\x4e\xa7\x75\xe3\x10\x25\x03\xdd\xf3\x9a\x38\x15\x3b\x37\x0e\x00\x52\x4f\x92\x36\x86\xff\x10\x2e\xf0\x37\x5c\x1c\xe8\x98\x4d\xc9\xe9\xe0\xcf\xfe\x64\xe2\x3b\x0b\x6d\xa3\x60\xfb\xcb\xcc\x42\x1a\x57\xa9\x68\x4f\x39\x2c\x9a\x80\x16\x39\x7b\x20\x39\x1d\xc8\xbd\x3a\x15\x45\x4f\x9c\x2a\x40\x97\xda\x74\xe4\x86\xff\xf2\x13\x20\x35\x3e\xc2\xc6\x93\xd3\x01\x35\x4d\xdb\x7b\x6e\x33\xf1\xc0\x61\x51\x70\x6b\x78\x1c\x5f\xb7\x99\x28\x83\x0b\xe0\x54\xa1\x8c\x6d\x35\x4f\xb1\x53\xcd\x53\xa3\xc8\x20\x57\x64\x40\x45\x06\x46\x91\x78\xea\x0f\x29\x12\xec\x4a\xa4\x2e\x59\x5e\x51\x13\x02\x1e\x35\x24\x7e\xd8\xd3\xb0\xd2\x20\x99\xb6\xaf\xa8\x2e\x1f\x84\xc4\xc9\x94\x47\x8e\xe8\x17\x74\xe1\xb4\x90\xca\xbb\x36\x28\xa4\xea\xde\x88\x2f\xa3\x84\xda\x86\xa4\x73\x85\x46\x43\x98\x60\xfa\x30\xf0\x74\xd0\x24\xe6\xe9\x2a\x9e\x34\xe7\xa8\xe4\x74\xc0\xd7\x62\x0e\xee\xff\x3f\x30\x99\xea\xd3\x74\x1c\x46\xcc\x49\xf1\x4f\xb9\x5f\x2f\x52\x2e\x35\x59\x2e\x92\x83\x93\xdf\x35\x03\xe4\x46\x73\x25\x69\x0f\x7a\x79\xce\xa0\x32\x27\xf4\xa8\x9d\x03\xbd\x94\x0d\x29\x38\x1b\x9a\x5a\x56\x68\x48\x58\x5e\xf2\x6a\xd9\x95\x3a\xd6\x13\x1e\xac\xd8\x27\x5a\x20\x63\x46\x33\x81\x6f\xdf\xb4\xc7\xf7\xa9\x99\x75\x6a\x65\x0d\xcc\xac\x81\x91\x25\x2c\x67\xe8\x02\x51\xdd\x49\x44\x4b\xa7\x3a\xe9\x54\x24\x0d\x74\xd2\x40\x24\x11\x40\xcd\x2e\xed\x6b\x59\x54\x22\x6e\xb3\xa8\xc4\xd9\x66\x51\x89\xae\xcd\xa2\x32\x18\x28\x12\x38\xcf\x80\x68\xfb\xa0\x26\x92\x73\x5f\xd7\xe0\xac\x65\x66\x19\xa9\xff\x8a\x17\x53\x72\x33\xe5\x72\x80\xf3\x93\x4c\xf9\xbd\x97\x82\xad\xf0\x1d\x1c\xe0\x56\xd8\xde\x5a\x66\x02\xbe\x3b\x6f\xd6\x9a\x1d\xf1\x83\x12\x95\x90\x99\xda\x20\xb4\x0f\xde\x1c\x27\x83\x1f\xf0\x46\x0a\xb9\x8f\x6f\x6c\x64\xb0\x0f\x99\x0b\xeb\x60\x8a\xf6\x45\x4b\xef\x27\x3b\x21\x6c\x40\x24\x17\x8f\x51\xdf\x28\xd5\x36\x76\x9d\xf3\x79\x9d\x1c\x84\x62\xed\xed\x5c\x89\x0e\x95\xb0\x24\x66\x99\x9d\x39\xc5\xa7\xc4\x48\x03\x61\xe1\xf5\x5d\xde\xd9\x4d\x08\x61\x8b\xaf\xfb\xd6\x21\xf2\xe0\xa2\xe5\xc1\x45\xdb\x83\x8b\x8e\x07\x17\xdb\xea\xd6\x42\x19\xc3\x7d\x07\xdf\xa8\x1b\x32\xc5\xbc\x7c\x26\xc8\xad\xad\xe6\x75\x9d\xfb\x0e\x9e\x46\x2b\x79\xeb\x8f\x67\xd5\xae\xfa\x9d\xf6\x93\xbb\x72\xd5\x57\xf7\x19\x50\x96\x50\x8f\xc2\x21\x0c\xe4\xea\x76\x5f\xfb\x04\x45\x7c\xb2\xf6\xa5\xb7\xfd\x24\x8c\x9c\x68\xe0\xa9\xdb\x42\xae\x59\x74\x6e\x4f\x90\xda\x08\x1a\x56\x65\x84\x3a\xaa\xb2\x39\x61\xfa\x62\xc6\x9c\xd3\xdc\xb4\xdc\x15\x02\xa4\x5c\xf9\xfd\x01\x3c\xa1\x18\xc8\xb9\x12\x9b\x13\x2d\x0d\x44\x4b\x43\x6a\x69\x80\x7b\xc5\x75\x9a\xa4\x12\x57\x01\x81\xa3\xac\x66\x24\x39\x1f\xd5\x31\xe0\x77\xf0\x7e\xba\x13\x26\x09\xc4\x18\xbe\xf4\x33\x66\xe8\x5a\xce\x1d\x1b\xbc\x24\x6c\x76\xc1\xf7\x4a\x28\xa6\xf6\xcf\x53\x96\x7d\x0e\x27\xcc\xf1\x61\x03\x06\xb0\x0e\x99\xeb\x41\x50\x47\x9a\xef\x70\x3a\xfd\x87\x97\x4d\xce\x6a\x5f\xaf\x4c\x41\xd2\xbf\xce\xd5\xf9\xae\x8f\x5e\x4a\xb8\xcf\xfb\xed\x9b\x7c\xd7\xca\xc7\x8d\xd4\x06\xbd\x1b\xd5\x70\x71\xa8\xbe\x5e\x49\xc7\x84\x41\x59\x95\x41\xae\xca\x40\x54\x91\x52\x73\x0e\x61\x24\xb1\x23\x30\x98\xe2\x1b\xfb\xb8\xbd\xf3\xbb\x11\xd9\x73\x14\xd9\x73\x69\xde\xe6\xde\x97\x1d\x52\x33\xbc\xc0\x41\xe9\xf1\x60\x85\xe4\x22\xba\x28\xad\x58\x9f\x63\xbb\x92\xb4\x7e\x07\xdf\x81\x3b\xbc\x4b\xb4\x43\x3c\x49\x4e\x7d\x2f\xa0\x0b\x5b\xbd\xcd\x8d\xfe\xa1\x73\xb8\xff\xf7\x60\xe3\xef\xcd\xc3\xbf\x07\xeb\xdf\xf0\xcf\x86\xeb\x1c\xee\xf7\xd8\xab\x3e\xe6\xf3\xdf\x87\x5b\xa7\xe2\xc2\x29\xfb\x51\x48\xfe\x47\x76\xfa\x6a\x3e\x75\x12\xf6\xa2\x99\xc6\xb3\x64\xc8\x3c\x68\x9c\x36\xac\x95\xda\xef\x2c\x89\x9d\xc1\x52\xb3\xf2\x40\x1b\xe5\xfa\x38\x05\xd7\x0f\xa5\xb5\xf3\xea\x84\x9b\xfd\xca\xc4\x27\x30\x77\x2d\x7a\x03\x2e\x7b\xbc\xb7\x63\x3f\xcd\xe4\xa3\x82\x09\xfb\xd1\xfa\xdd\xf2\x60\x6b\x0b\xd2\xa1\x1f\x89\x7d\x7d\xce\x66\x11\x9b\x67\x40\x83\x83\x02\x23\x98\xd6\x9f\x60\x61\x7c\xa1\x39\xca\x60\xe2\x67\xc3\x33\x14\x1f\xb9\x14\xab\xc8\x97\xf5\x07\x29\x35\x46\xaf\xc8\x4f\x13\x36\x64\xf8\x54\xae\xac\x60\xb4\xe8\x71\xe1\xf4\xa3\x85\xed\x26\xc2\x6b\xab\xf7\xe6\x52\xb9\xae\x17\xc7\x12\x1a\xf2\x30\x8e\xd2\xcc\xc7\x07\xfc\xa2\x00\x8c\xc7\x65\x64\x95\xdf\xe8\x45\x04\x5e\x45\xb5\x29\x83\x67\xc4\x49\x2a\x22\xb3\x1f\xd1\xc3\x4c\x61\x34\x9d\x65\xf4\x02\x2c\x82\x47\xb7\x02\x32\x2a\xe8\x88\x88\xac\x0f\x1a\x4b\xaa\xf9\x46\x87\xe2\x10\x17\x3e\xe3\x91\x68\x29\xa5\x87\x7e\x1f\xc1\xa0\xa9\xfd\x92\x1d\x7f\x22\x86\x8a\xcd\xd9\xd0\xf1\xd5\xab\x7b\x8f\x1e\x81\x33\x98\x88\x61\xc3\xbc\x81\xbe\xf2\x84\x2e\x0d\x03\x7c\x1f\x69\xd2\x44\xb2\xb8\xf0\x1c\x06\xa1\xf0\x8c\xf0\x6d\x42\x33\xf9\x38\x6d\xe9\xd0\x12\x18\x71\xc0\x30\x08\x3d\x18\xa4\xae\x79\xdd\x9a\x9c\x51\xd0\x75\x71\xa3\x0b\x83\x14\x69\x37\x8c\xfd\x31\x4b\x87\x8c\x9e\x04\x9e\x26\xec\x22\x8c\x67\xa9\x0e\x65\x0f\xf2\x76\x74\x8a\x57\x55\x01\x2b\x1a\x6b\x73\xec\x00\x76\xdd\x9f\xf4\x5a\x7d\x72\x55\xa5\xfe\x0e\x26\xe2\xb9\x1b\x3d\x46\x9a\x72\xc4\x59\xd5\xd8\x4d\x6e\x8a\xdd\xc4\xd6\xd5\xc4\x6e\x7a\x28\xf1\x29\x72\xde\x34\xa7\xaa\x40\x4a\x32\xa1\x84\x21\x63\xe9\x23\x9b\xd1\x29\xd3\xd7\x70\x1f\x42\x0f\xe6\xfb\xb7\xbf\x0c\xc7\x25\x70\x30\x71\xaf\xac\xc3\x41\x21\xe7\x86\x5c\x9b\xef\x0b\xbc\x08\x02\xe1\x18\x83\x5c\x88\x6c\x87\xf3\x27\xb7\xfe\x06\xb9\x27\x23\x72\x6c\x60\x9c\x75\xde\x90\x01\xca\x86\x5f\x62\xf6\x69\xca\x86\xa1\x3f\x86\x78\x9a\x85\x93\xf0\x77\x7a\x25\x8d\xab\x9f\x38\x1a\x2f\x38\xfb\x86\xd1\xe9\x98\xd1\x60\x37\xa9\xca\xfb\xec\x8c\x25\x97\x61\x8a\x6f\x69\xea\x81\xc1\x67\xb2\x63\x7a\xbd\x53\x32\x0b\x17\xfd\x84\xfd\x1a\x87\x11\x26\x13\x4e\x4d\xe3\x3c\x49\xbd\xb9\x44\xd7\x17\x7e\xeb\xb5\xfa\x62\xdc\x0e\x51\x91\xf3\x84\xe6\x5c\x3b\x8b\x8a\xb9\x41\x27\x70\x13\x04\x7e\xd3\x0f\xb6\x94\x6c\x09\x01\x40\xe1\x59\xaf\x98\x0c\x6f\x69\xb9\xa7\x3d\x27\xe6\x70\x38\x7d\x9b\x48\xa5\xb8\x39\x37\xf6\x84\x8c\x39\x23\xa5\xf7\x1f\x1a\x0d\x23\xf3\xaa\xe2\x9e\xe1\xde\x77\xf0\x22\xba\x93\x55\xef\xc6\xbc\xa2\x03\xdf\xc1\x27\x65\xc5\x57\x09\x44\x7f\xdf\xc6\x43\xbf\x26\x72\xf1\xde\x53\xe1\xe2\x91\x3b\x94\x52\x21\x8d\x46\x71\x32\xf1\xb3\x97\x26\xb0\xdc\xd9\xd4\xed\xa3\x1f\xad\x1e\xfc\xa9\xbc\x8f\xf7\x15\x02\x6c\xf5\x60\x9a\x55\xf8\xdd\xc1\x8b\x06\xe3\xfa\x01\xdd\xde\xeb\x2c\x33\xa0\xa5\x23\xb9\xe2\x9b\x02\x04\x09\x15\xe3\x28\xac\xb1\x8c\xb7\xf7\xee\x3c\x3e\xe1\xea\xa1\x3c\xab\x70\xbe\x93\xb7\x05\xb8\xd1\x12\xa6\x61\x1c\xbd\x0e\xe7\x35\x27\x98\x4f\x5b\x77\x1e\x49\x6f\xf5\x40\xd0\x15\x28\xdf\xc9\x53\x03\x0a\xe8\x87\x84\x8d\xea\x22\x79\xde\xfd\x73\x13\xab\x07\x84\xae\xc2\xf9\x76\x94\xd8\xcd\x41\xfd\x18\xcf\x6a\x5e\x87\x79\xda\x7a\x7c\xd7\x84\x18\xdd\x38\x5e\x7e\x0e\xe5\x92\xf8\x71\xb9\x49\xef\x8f\x15\x7c\x85\x37\x13\xb1\x28\xab\x59\xa1\x3f\xbd\xb1\xe6\x25\xbd\xf1\xe7\x24\x9e\x4d\x6b\xe6\xd2\x1b\xc2\xef\x48\xf8\x3f\xcd\x26\x2c\xf1\xc7\x35\xb1\x38\x5b\x37\xf4\xb1\xd8\x3e\xbe\xb9\xba\x5e\x41\x09\x50\x1b\x9f\x17\x53\x56\xdd\x87\xed\xfc\x8b\x3b\x2b\x88\x16\xc1\x27\x49\x7d\x31\xcb\xe2\x9a\x46\x76\x6f\xfc\xe4\xc3\xb5\x6f\x06\x3d\x6d\x6d\x1b\x42\xc1\xe1\x4d\x11\x23\x86\xab\xfb\xc6\xa2\xe1\x35\x7e\x6f\x78\xdc\xac\xe1\xd2\xd8\x98\x36\xbc\x46\xd4\xf0\x1a\xff\xdf\xff\xdb\xf0\x1a\x93\x86\xd7\x68\x78\x8d\xf3\x86\xd7\x78\xd7\xf0\x1a\x7f\x6e\x78\x8d\xcf\x0d\xaf\xf1\xa1\xe1\x35\x5e\x35\xbc\xc6\x7f\x34\xbc\xc6\xdf\x1a\xfd\x3b\xb9\x76\x4a\x96\x82\xde\x62\x39\xe5\xdc\x8b\x81\xc4\xd0\x49\x0e\x7f\xf2\xc5\xe1\xa3\x47\x32\x29\x3b\x8b\x67\xa9\x1f\x05\x29\x1c\x2e\x15\x83\xd0\x92\x8a\xd2\x35\x60\xae\x2d\xaf\xd0\x92\x5b\xeb\x26\x6b\x8d\x46\x49\x03\x6a\xab\x16\x37\x65\x86\x0b\xdd\x3b\x99\xa2\xc3\xe6\x0c\xc3\x89\x3f\xd6\x05\x44\x82\x3a\x79\x11\xa2\xa7\x0b\xa8\x94\x25\x68\x51\x22\xc1\x75\xe4\x90\xa0\xef\xa6\xf3\x53\x96\x0c\x19\x5e\xf5\x15\xe0\x65\xc2\xb7\x6f\xd0\xf8\xa1\x61\xfb\x0c\x45\xec\xf2\x35\x62\xea\xa4\x52\x13\xa8\xfb\xb3\x32\x61\x49\xef\x99\x52\x5b\xaa\xe8\x47\xa3\x9a\x39\xd0\xaf\xd9\x8e\xc2\xf1\x18\xbd\x18\x44\x5e\x93\x27\xe8\x33\x5a\x7f\x1c\x9e\x46\x56\x3e\xa6\xe8\x02\x69\x3e\x3f\xb5\xb3\x17\x93\x41\x6c\x37\x40\x49\xba\x08\x5f\x20\x5b\x05\x78\x82\xce\xbe\x0c\x03\x7c\x69\x57\xe7\x63\x8a\x2e\x30\x8c\xc9\xb3\x46\x17\xc0\x14\x5d\x40\x4d\xa7\x56\x21\x95\xaa\x0b\x66\x8b\x29\xb3\xca\x88\xa8\x0e\x3c\x4f\xdc\x19\x9a\x65\x74\x67\x88\xd4\x0c\xee\x16\xa4\xb3\xd1\x28\x9c\x37\x65\xa9\xd7\x71\x02\x9f\xde\x6c\x52\x01\x8f\x36\x11\xb0\x04\x3e\x83\xee\xff\x1e\x8e\x17\x78\x21\x6a\x96\xe1\xd3\xfd\x62\x18\x04\xbc\xae\x22\x58\xb7\x0b\x8d\x3f\x35\xe0\x50\x09\x54\xaf\xd5\x87\x7d\x2b\xfb\x5f\x1a\x5c\x61\x6c\xf5\x06\xf1\xfc\x97\xfe\x56\x33\x63\x69\xe6\x70\x8c\x5d\x38\x84\x46\xab\x01\x1b\xd8\xa1\x66\x16\xbf\x8d\x2f\x59\x72\xe4\xe3\x0b\xa4\xfb\xd0\x68\x18\xc3\x43\x98\xd5\x35\xdb\xe6\xcd\x6e\xf5\x7e\x98\xe6\x9b\x90\xbc\xbd\x2f\x77\x30\xb1\xfb\x7f\x3d\xf3\xe5\xca\xc6\x70\x97\x3f\x8b\x67\xe3\x00\x2e\x19\xcc\x52\x76\x28\x8b\xbe\x49\x21\x3b\x0b\x53\xc0\x3d\xe4\x8c\x9d\xb2\x04\x11\x56\xf9\x47\x7e\x44\x05\x70\x5c\x4e\x59\xc4\x12\xdc\xb5\x11\xd6\x45\xe8\x8f\x21\x8a\xe9\x95\xfc\x43\xcd\xcf\x6a\xde\xab\x75\xa3\xce\xcf\x90\x25\x02\xd3\xe3\xcd\x1a\xee\x0a\x13\x7f\x31\x60\x9f\x24\xc1\x1e\x22\x52\xdf\xbe\xc1\x56\x2f\x60\xa3\xd3\x69\x92\xfe\x60\x11\x48\x53\xe4\x13\xcb\x90\x0b\x24\x68\xcd\x8e\xe1\x88\x77\x40\xf1\x5b\xe0\xc9\x2a\x71\x02\xc3\xb1\x3f\x99\x12\xf7\xc8\x6c\xa3\x66\x16\x0b\xc6\x9a\xf2\x39\x87\x05\xc2\xd1\xdb\xe4\x41\x2e\x87\xe1\x28\x1c\xfa\x91\xd1\xa4\x07\x61\x06\x93\x59\x9a\xc1\x80\x41\x18\x41\xaf\xed\x41\xa7\xdd\xb7\x2a\xf2\xe9\x33\xa8\xa9\xd2\xf2\xa0\xd3\x12\x55\x4c\xd1\x32\xbe\xd5\xdd\x0b\xa4\x05\x1c\xc2\x63\xd8\x87\x76\x47\xfb\x6d\x73\x8e\xe2\x34\xcb\xf3\x94\xba\xb2\xdc\xf6\xf4\xc1\x7b\xa7\xed\x69\xe0\xae\x09\xa4\x10\xf1\x03\x8b\xb7\xac\xe2\x62\x20\x14\x2f\xd2\xb0\x3b\xb9\xbb\x79\x18\xb6\x8f\x27\x7d\x90\x82\x28\x04\xd8\xd8\x4e\xc3\x7c\xc5\x00\x24\x3a\x66\x7e\x88\xb7\xb7\x86\xea\xcd\xe8\x70\x24\xfa\x8f\x52\x35\x6c\xd8\xc1\x44\x4d\x58\x9a\x15\x25\x5e\x1b\x66\x89\x03\xbb\x1a\x74\x95\x8b\x57\xe1\x80\x50\x17\xd9\x10\x57\x0c\x55\xc6\xd6\x16\x7c\x60\x09\x6f\x0a\x79\x27\x8c\x42\x14\x21\x6a\x3b\x13\xbb\x9c\x39\x6a\xfc\xc4\x4e\xfd\x2c\xbc\x50\x97\x1f\xe1\x99\xf6\xa0\xd3\x4d\x19\xe8\xab\xcb\xe8\xd4\x0f\x73\x24\x6c\x54\xde\x8c\xc0\x87\x48\x82\x27\x48\x09\x5f\xee\xe0\x91\x09\xce\x09\xc1\x0c\xcf\x21\x34\x82\x1e\x64\x09\xf3\x33\xf0\x53\x98\xc6\x69\xc8\x6b\x6a\x9c\xd5\x7d\x5f\x85\xf3\xa3\x47\x82\x08\x14\xcb\xc2\x2d\x74\x69\xe4\x8f\xd3\x1c\x85\x96\xd0\xf1\xaa\xe7\x8a\x55\x72\xed\x1e\x82\x43\xb3\x22\x1f\x76\x87\x2b\x53\xfc\xb9\x0f\x8d\xcd\x06\x57\xc0\x3a\x73\xb3\xc1\x35\x48\xae\x70\xa3\x21\xca\x28\x2e\xa0\x86\x0e\x2a\x98\xc7\xfc\xb5\x61\x72\x5c\xca\xa1\x49\x7b\xb8\xb7\x07\x1b\xab\x5a\xf4\xd2\xf1\x8f\x60\xbc\x12\x7a\x97\xeb\x46\xd8\x82\xed\x3e\x6a\x7e\x8e\x64\x91\xee\xf9\x2e\xb9\x0d\x2a\x6c\x13\xfb\xc7\x84\xf9\xe7\x74\x4f\x98\xc6\x98\x05\x82\x13\xc2\x48\x68\x38\x39\x31\xfc\xf7\x7f\xfd\x6f\xcc\xf9\xef\xff\xfa\x7f\x60\xea\x27\x5c\xa3\xfa\x99\x78\x04\xd9\x04\x89\xe6\x2d\x3e\x8f\x1b\x05\x30\x4a\x7c\x94\x79\x7f\xcc\x35\xaa\x39\x6f\xfc\xf7\x7f\xfd\x6f\x1a\x52\x1b\x5e\x98\x72\x85\x6c\xf3\x94\xa1\xf6\xed\x0d\x7a\xf3\xe6\x11\x5d\x6b\xb6\x23\x09\x43\x4d\xc4\x43\x0d\x7e\xa8\x6a\x0f\xcf\xfc\xe4\x28\x0e\xd8\x8b\xcc\x09\x5d\x0f\x76\xf6\xe0\x39\x0c\x39\x7f\x0c\xe1\x39\xec\x3e\xc9\x57\xce\xb3\x01\x87\xd4\xed\xc2\xce\x63\x38\x54\x26\xb6\xe0\x1f\x71\x30\x23\x9c\xf0\xf6\xed\x44\xb7\x52\xd9\xd8\x42\x6e\x56\x6a\x79\x10\xba\xf9\x82\x03\x3e\x9a\x76\xe2\xd5\x83\xb2\x6f\x7d\xc1\xf9\x81\xa9\x0e\xe8\xbe\xf8\x78\x0c\x9c\x10\xfe\x30\x63\x89\x18\x0f\x6e\xcc\x78\xa0\x16\x49\xdc\x62\x98\x4e\xc7\x7c\x42\x1c\xb0\x51\x9c\x30\x98\xfa\x41\x60\xe8\x2f\x11\x87\x79\xe2\x73\x4e\x7c\xc8\x55\x89\xab\x7a\x81\x50\x88\x5f\x3d\x78\x13\x8d\xb8\x16\x5c\x68\xb6\xcc\x6b\x00\x1b\x30\x3e\x74\x2d\xa2\x7a\x9b\x92\x29\x8f\x84\x36\x2c\x3e\xb0\xc9\x5a\x70\xc5\x06\x09\x9d\xaf\x16\xe4\x91\x12\x19\xbb\x87\x86\xd7\x18\xa5\x6c\x82\x82\xd9\x76\xe9\x38\x87\x93\xca\x35\x8d\xaf\x7a\x3a\x56\xd2\xd0\x1f\xf1\x12\x75\x24\x2c\xa3\xa0\xc4\x5d\xf4\xd1\x53\x00\xd4\x3d\x31\x89\x78\x91\x06\xb0\xaf\x29\xef\x19\x54\xb0\x7b\xf2\x91\xe1\x79\x7c\x32\x1b\x66\xa2\x4b\x28\xc7\xb3\x6c\x3a\xcb\x60\xe0\xa7\x2c\x80\x38\x12\x86\x55\x1a\x26\xbc\x27\x7c\x65\x32\x61\x91\x12\xe0\xf4\x32\xcc\x86\x67\xe0\x60\x86\x29\x3f\x43\x3f\x65\xd0\x78\xd6\xd8\xb7\xb9\x5b\x28\x74\xd1\x27\x7b\xfc\x60\x43\x62\x7a\x90\xe7\x74\x82\xd6\xad\x84\x96\xa3\x55\x4e\xdc\xca\xa1\xfd\xa7\x01\x4d\x92\x56\xc9\x9e\xe2\xc1\x1c\xd1\x9f\x63\x50\xd1\x8d\x55\x3a\x23\x80\x8a\xe3\xdc\x02\x32\xc2\x66\x2d\xe0\xb2\x4c\x23\x39\x60\x4a\xda\xc5\x2e\xa8\x5c\x79\x0b\x4b\xc1\x7a\x11\x9d\xa6\x83\x66\x16\x7f\x22\x57\x84\x92\x0b\x84\xfa\x74\x53\xad\x95\x2d\xcf\x77\xd3\x69\x86\xc0\xa9\x33\xe4\x9c\x29\x48\x7d\xd0\xab\x63\xcf\x8e\xdb\x80\x8b\x0a\x72\x05\x12\xcb\x75\xe7\xbe\x97\xe7\x5e\x6e\x09\xca\x65\x63\xd4\x30\x52\x5d\xc3\x53\x9b\x99\x91\xef\x36\xf7\x0c\x43\x78\xcf\x8a\xe9\xb3\x8c\x13\x81\xde\xb8\xad\x8e\xa9\xeb\xf2\xb9\xdf\x75\x5d\x58\x87\x6d\x8d\xc5\x79\x3e\x9a\xd0\x26\x73\xad\x15\xb8\x69\x54\x0b\x6b\x84\xa1\x15\x51\x7e\x3f\x22\x67\x9e\xcb\x6c\xe7\x1c\xd6\x41\x99\xc8\x53\xc3\x2e\xba\xca\x87\xde\xfb\x6a\x70\xd2\xbe\x1e\x3d\xcf\x48\xa6\x91\xdf\xb7\x7e\x55\x3b\xc1\xed\x7d\x87\x80\xda\x2b\x07\x1f\xc8\xb1\xd6\x4d\x77\xec\x97\xdf\x2d\x7e\xf0\x60\x6b\x0b\x7a\x3d\x3e\xc1\xf4\x51\xaf\xf6\x7b\x29\xfd\x8b\x3b\x08\xfd\x5e\xab\xdf\x43\xd5\xdf\xef\x79\xfd\x9e\xde\x65\x11\xcb\x69\xe1\x94\x07\x5d\xd8\xfa\x4f\xe7\x70\xdf\x69\xba\x87\x4e\xef\xd9\xf3\xee\x7f\xf6\x5d\xfe\xb5\xf1\xf7\xcd\xbf\x3b\xd0\xe7\x9f\x7f\xfa\x17\xfe\xa7\xe5\x1e\x3a\xe8\x97\xe7\x78\xfc\xab\x49\xdf\x3d\x7f\xf3\xf7\x1f\xfa\xee\xe1\x9f\xb6\x42\xd3\x0d\x2f\x47\x8c\xfc\xbe\x9a\x54\x3c\xec\x12\x5e\x57\x96\x24\xcf\x3c\x3b\x5b\x87\xf8\x84\x6e\xbe\xaa\x11\xfe\x93\xfc\x7e\xd2\xcc\x8f\x86\x2c\x1e\x19\x78\x55\xb7\x66\x04\x2e\x21\xb7\xb7\x2e\x24\x8c\x3c\xb6\x0c\x61\x77\x21\x3b\x4b\xe2\x4b\xc4\xfc\x55\x92\xc4\x89\xd3\x08\xa3\x0b\x7f\x1c\x06\x8a\xbf\x1b\xb0\x01\xb9\xfd\x3d\x0a\x39\x9a\x0d\x95\xcd\x21\xb6\xfa\x30\xad\xd7\xee\xe3\xa6\x24\xa8\xcd\x20\xb9\xd3\x47\xd9\x1d\xca\x7e\xae\xb2\x53\x33\x77\x9b\x72\x37\x75\xae\xdc\xe6\xa3\xfc\x1d\xca\x57\xd9\x62\x8b\xef\xe1\x43\xca\xde\x55\xbb\x2a\x72\x73\x8f\xd2\x1f\xf7\x71\xcd\x26\x7f\xa8\x2d\x65\xb1\xc1\x27\xab\x3f\xd1\xfb\xad\xc6\xf6\x03\xe5\xed\x99\x20\xf6\xfa\x62\x7a\x6b\x2b\x5d\x24\x06\x91\xf2\x9f\x0a\x34\xa5\xff\xdd\xe7\x33\x06\x8d\xa8\x41\x85\x68\x63\xca\x1f\x87\x7e\x8a\xbe\x38\x0d\xef\xb4\x21\x9d\xa0\xf4\x1a\x2b\x6a\xb8\x0a\xbf\x2c\xe1\x86\x90\x54\xd8\xa7\x0a\xec\x3b\x7f\x0a\x72\xbc\x78\x6e\x2a\xb7\x6f\xa4\x72\x15\xd3\x9d\x19\xf5\xec\xe1\xf2\xe2\x5a\xb9\x75\xe5\x2a\x5c\xb4\x87\xe1\x88\xc6\x02\x59\x21\x4c\x8d\xad\x27\x35\xb3\x9f\xc6\x2c\x15\x46\x21\x8e\x39\x5f\x48\x09\x3b\x3b\x08\x4f\xc3\x2c\x95\x44\x40\x40\xdf\xbe\x81\x43\x7c\xc5\xa9\xd1\xc2\x1d\x49\xc1\x49\x3c\xa1\xdb\x70\x5d\x39\xfa\x44\x1e\xc1\x84\x68\x8e\x4a\x96\x6b\x74\x09\xc1\xec\x2c\x4c\x9b\xa2\x00\xff\x73\x20\xd3\x64\x41\xfc\xab\x52\xe5\xd6\xb3\x95\xa6\xf6\x9b\xf1\x43\xa5\x0b\x1c\xf8\x1f\x95\x26\x99\x0f\xff\xaa\x54\x39\x9a\xf8\x57\xa5\x96\x6e\x74\xa9\x5c\x41\x67\xda\x2e\xbe\x7a\xf0\xa0\x52\x47\xd4\x98\x34\x32\x3a\x8f\xa4\x81\x60\xd8\x0d\x83\x02\x76\x52\x5a\x4c\xc1\x3e\xab\x34\x47\xf7\x9c\x36\x84\x71\x09\x9e\xcb\x16\x44\x50\x3b\x76\xb8\xfb\x60\x6e\xc3\x19\xa5\xbe\x41\xcb\xcd\xd7\x27\x72\x1d\x42\xc3\x2b\x87\x5f\xb6\x2b\x88\x6d\x34\x9a\x5c\x67\x99\x3b\x78\xb9\xf2\x76\x6b\x8a\xce\x07\x0f\xae\x4a\xe6\xe6\x3f\xd6\xed\x40\xcb\x55\xab\xe6\xf0\xf2\xe6\xef\x9a\xdd\xff\xf1\xab\x3a\x48\x43\x27\x84\x5a\x5f\x9a\x8e\x38\x83\xbd\xf1\x41\x29\xe7\xff\x46\xa3\xee\x04\xae\x48\xd4\x8a\x63\xb8\xc6\x0f\x0d\xe3\x99\xa8\xb9\x07\x53\xc3\xf3\xc2\x99\xc3\x3a\xb4\x5b\x2d\xb7\x99\xc5\xe8\x6d\xe3\x4c\xdd\x03\x7a\x62\xaa\x31\xb0\xea\x19\x95\x90\x45\x71\x6b\xd2\x99\xbb\x4a\x80\x9d\x8e\xaa\x39\xac\xaa\x39\xa7\x25\x89\x28\x16\xac\xd8\x40\xbb\xa5\x5a\x60\x35\x7d\x9a\x37\xb3\xf8\x95\xde\xda\x32\x7a\x34\xba\xa6\x56\x9e\x02\xa7\xd7\x94\xff\x20\x45\xd3\xa8\x13\xaf\xd8\xa9\x3d\x55\x73\x5a\xd3\xda\xf2\xa7\xbc\x8a\x39\x4b\x17\x2c\x62\xb8\x39\x70\xd9\x6c\x52\xcb\x66\x4b\xc1\x45\x38\x69\x2d\x9c\x52\x09\xad\x02\xf5\xcb\xaa\x8c\xf1\x98\xff\xf8\x32\x9d\xca\x43\x3d\xd9\xb7\xf9\xea\x80\x0e\xe0\xaa\x7c\xb1\xf3\x4f\xfc\x32\x80\xbd\x5d\x7d\x63\xff\x31\x43\xe5\xe0\x6e\x6a\xcd\x6d\xef\x8e\xba\x6f\x94\x6b\xfb\x2e\x9c\x47\x84\x6c\x18\xf7\x11\x97\x59\xca\xe7\x50\x2f\x17\x0f\x14\x0c\xb9\x02\x09\xdc\x9c\xde\x52\x11\x53\xd8\x68\x14\x0e\x43\x72\x6c\x08\x7a\x2d\x65\x7e\xcb\xed\x02\x4c\x6e\xf7\xcd\xe0\xac\x2a\x6b\x13\x9c\xdc\xf1\xc1\x72\xdb\x15\x0a\x80\xde\x6d\xc0\xe0\xb6\x66\xc0\x7f\x03\xb3\xe2\x6d\xf8\x90\x2e\xfa\xc1\xa1\x59\x4c\x39\xe1\x87\xf0\x3c\x9f\x07\x1b\xc6\xb6\x6b\x08\x9b\x10\x19\xbb\xad\x8d\x56\xc3\xb5\x2a\xb7\xec\xca\xe6\xc6\x38\xa7\x1e\x1a\x37\xc5\xfc\x50\x03\x69\xb4\xb0\x8c\x6e\xb2\x8d\x41\xbd\x75\x73\xb0\x71\x97\x03\x6d\x1a\x5a\x53\x7c\xb1\x60\x13\xda\xae\xdb\x6b\xd1\x7d\xa6\x31\x4b\x53\xc8\xce\xfc\x08\xda\x8b\x87\xe5\x1a\xe1\x8f\xfb\x38\x05\xc5\x0a\x13\x77\x3b\x2e\x7c\x11\xe7\x57\x05\x9f\xcb\x47\xa6\x93\x57\x4c\x5b\xd6\xbb\x5f\x6d\x5d\xd2\x78\x86\x4f\xe4\xce\x5b\x2a\xb7\x17\x6a\x01\x98\xb7\x8d\x64\x2d\x00\x99\xba\xa0\x3a\x6f\xc3\x33\x98\xab\xb8\xf8\x9c\xf9\x43\xce\x23\x1c\x5c\xd8\xf6\xa8\xd5\xec\x40\x65\xce\x5b\x1e\xb5\x35\x6f\x7b\x04\x5d\x6f\x5b\xea\xe6\x31\xb6\x20\x75\x55\x48\xcb\xbc\x85\x72\xac\x51\x31\x8b\x60\xec\xe8\x79\xdb\x0c\x97\x4e\x05\x2b\xf6\xb9\xfe\x58\x0f\x53\xd0\x60\x0f\xfd\x31\x8b\x02\xff\xa6\x1b\x5c\xc1\xf6\x35\x61\x30\xf1\xca\xe8\x8d\x4c\xf1\x60\xfb\xd8\xb8\x53\x54\x13\xd9\xea\x86\xd1\xbe\x3a\xbc\x85\x2c\x9c\xd4\xdc\xc1\xee\xdc\xd0\x4d\x74\x5b\x81\x26\x25\x52\xb3\x88\xb8\x61\xf8\xd1\x9d\xa5\xc2\x8f\xde\xcc\x03\x75\x18\x47\x59\x18\xcd\xe2\x59\xf5\x96\x65\x7b\xe7\x86\x78\x3f\x3e\x3e\x8e\xc2\xba\xd7\x23\xf7\x1e\xe7\xfc\x4e\x83\x59\x82\x9e\x48\x9f\xd8\x30\xc6\xa8\x5c\xed\x56\x4b\x28\x17\x99\xf5\x2e\x8c\x66\x19\xe3\x1a\xc3\x2e\xbb\x0e\x8f\x73\x25\xff\x12\xcf\x12\xa3\x9c\xa8\x58\x2c\xf7\x12\x9f\x21\xb2\x6a\xad\x43\x67\xc7\x2e\xf4\x57\xc6\xce\x8d\x52\xbc\xce\x3a\x3c\xc9\xa1\x16\x47\xb8\x15\x62\x17\xda\xce\x35\xf7\x37\xe6\x27\xc5\x42\x8f\x77\xcd\x3d\xd8\xc0\xcf\x98\xbc\xca\x66\x6c\xb8\xbe\xa4\x64\xfb\xde\x33\xdd\xb9\xcb\x95\xce\x8c\x3d\x54\xac\x06\x87\x80\x31\x6a\x36\x14\x9c\x8d\x3c\x20\xa9\x1d\x9c\x05\xf3\x13\x0f\x26\xbc\x37\x1e\x5c\x32\x76\xee\x41\xe0\x2f\x3c\x38\x8b\x67\x3c\x1d\xe9\xe8\x41\x8a\x74\xe7\xbf\xc7\xe3\x50\xfe\x20\x11\x30\x9e\x57\xc0\x6b\x39\x4b\x18\x5b\x39\x56\x2c\x8b\x96\xb4\x4a\xed\xa1\xa8\x6d\x28\x95\xb7\x61\xc4\x29\xcf\xd7\x0b\x2b\xa9\x22\x09\xcc\x48\xfc\x89\xae\xf0\x72\xa4\xd4\xcc\x17\x5d\x30\x7a\x32\x06\x5d\x56\xe9\x67\x21\xfc\xae\x19\x1d\x56\x4d\xa1\x44\xb3\x77\x9a\x8c\xea\x44\xc2\x69\x34\x7f\x78\xdb\x50\x6d\x88\x0d\xf5\x7c\x99\xfd\x1f\x3e\xe5\xcb\x28\x21\x91\x65\x7e\x78\xb3\xff\xc3\xbb\x7c\x29\x21\x20\xba\x0c\xfc\x30\xcd\x97\x21\xe1\x50\x45\x7c\xf8\x21\xc8\x17\x11\xa2\xa1\xca\x0c\x4a\xca\x48\xd1\x50\x85\x7e\xcc\x97\x10\x62\xa1\x0a\xfc\xad\xa1\x8d\x0c\x7a\x56\x85\x26\x62\xf4\x49\xc7\x9a\x3d\xc9\x74\xd0\xf6\x04\x9d\x2d\x95\x20\x2c\x09\x5d\x6c\x97\xff\x0f\xd6\xaf\x29\xd6\xde\xe5\xff\xbb\xb6\xd8\x76\x8b\xff\xaf\xb2\x98\x94\x92\x02\x6e\x34\x34\x85\x62\x79\xdc\xca\x8b\x15\x70\x2b\x2f\x56\xc0\xcd\x2e\x06\x42\x92\x0b\xb8\x21\x43\x40\xa1\xd8\x36\xff\x9f\x01\xad\xa2\xd8\x63\xfe\xbf\x6b\x8b\xb5\x3b\xfc\x7f\x35\xc5\x48\xd7\x14\x70\xe3\x8c\x58\x52\xac\xc3\xff\x67\x40\xcb\x17\x23\xf5\x55\x80\x86\x3c\xab\x8b\x09\x5d\x57\x1c\x2c\x64\xdb\x42\xb1\x3c\x41\x72\xc5\x80\x14\x68\x01\x1a\xb2\x38\xf4\x1f\x00\xf4\x6d\x27\x76\xce\xdf\xe2\x58\x9c\x6b\xfe\x5c\xb4\x0a\x87\x58\x4e\x64\x3d\xc3\xc9\x01\x0e\x8b\x6a\xc3\x70\xe9\x24\x46\x28\xaf\xf1\x29\x5f\x98\x8f\x4b\x15\x70\x0e\xc6\x28\x1a\xf8\x8b\xf2\x92\x7c\x10\xcd\xf6\x39\x41\xf2\x25\x1d\x3e\x16\xe5\xd5\xf9\xa8\xed\x1b\xea\xc4\x74\x4f\xe5\xc4\xac\x40\x8f\xb7\x62\x94\xd4\x8a\xc4\xa5\x0a\x45\x67\x05\x53\x93\x38\xd2\xb6\xf7\xa0\xe2\x61\x3e\x5a\x7e\xc8\x62\xfa\x01\x14\x9d\x82\x6f\xf1\x60\x49\xe9\x8d\x29\xfd\x68\x78\x4b\xe2\x2d\xb2\xdc\x11\x11\xcf\xf0\x21\x61\x7e\x1a\x47\xf8\x9c\x07\x16\x95\x30\x25\x30\xcb\x39\x87\xcd\x33\xbe\xb6\x16\xb7\xec\xc5\x74\xe2\x47\x01\x87\x13\xcf\x4e\xcf\x80\xa5\x59\x38\xe1\xb4\xe1\x45\x38\xb8\x34\xfc\x5d\x7b\x32\x1b\x37\xf7\xfd\x34\x9d\x4d\x98\xee\x41\x98\x82\x3f\x4e\x98\x1f\x2c\xc0\x07\x6e\xc5\xea\x2c\x0e\x9f\x2f\x3d\x42\xe1\x0a\x24\xcf\xec\xe2\x91\x41\x00\x3c\xbe\xc3\xe9\xb0\x61\xfb\x01\x67\x7e\x72\xca\xb2\xba\x97\x95\x14\xf9\x73\xee\x80\xcb\x85\xb6\x54\xf1\xbb\x69\x76\x1e\x70\x21\xc8\xe2\x44\xbc\xa7\x2f\x17\x5c\xa1\xf9\x58\x41\xaf\x83\xf7\xff\x9a\x49\x78\x7a\x96\x39\xd6\xa4\xe2\x09\x7c\xad\xb8\x1b\xb4\xf9\x61\x95\xcb\x85\x6c\x00\xf1\x0c\xd4\xea\x58\x9f\x22\xd6\xf2\x89\x2a\x23\x44\x2b\x6c\x59\xfa\x42\xbc\x3e\x97\x4f\x54\x8b\x74\xed\x65\x64\x30\x25\x17\x99\x9c\x6b\x33\xf6\xc7\x44\x3b\x84\x5c\xd7\x7a\x62\xc4\xb6\x72\xc9\xb8\xc7\xd1\xef\x75\xfa\xf0\x2c\x9f\x83\xa9\x5b\x72\xa8\x0f\x69\x3b\x04\xf6\x41\xbe\x99\x61\x90\x27\xec\xb5\xfb\xa5\xb8\x86\xbd\x56\xbf\xd2\x0d\xfb\x8e\x69\x2b\x25\xbc\x9e\x7a\x86\x41\xab\xdd\xae\x40\xfb\x55\xa9\x48\xb5\x1c\x37\x75\x1c\xa7\x00\xec\xeb\x3d\x03\x76\xc1\x92\x85\xa3\x9e\xb2\x33\x1e\x08\x50\xe6\xa2\xe2\xd4\x45\x4e\xeb\x2b\x3b\x9d\x8a\x3a\x0b\xb7\x10\x7a\xbe\xe6\x95\x81\xea\xc8\xf3\x22\x32\xfc\x32\xab\xcd\xdc\x8b\x01\x22\x32\xbe\x27\x56\x1c\xae\xcb\x27\x04\x82\xe6\x36\x27\xfe\xd4\xd0\xb9\x06\x92\xf2\xf5\x3e\x2d\x92\x86\xd6\xd5\x8a\x56\xee\xca\x4a\x80\xc6\x7d\xa2\x56\x6e\xc3\x14\x20\xc3\x1d\xa3\x5e\x60\xec\x31\xf5\xed\xf0\xbc\x59\x9b\x73\x6b\xcb\xa8\xa2\xa3\xa9\x24\x2e\xee\x12\x65\x2d\x8f\x60\x67\x6d\x8f\x20\x1a\x5b\x48\x15\xf3\x04\xd6\x69\x7b\xd6\xeb\x84\xbc\x34\x1c\x42\x26\x62\xeb\x53\x11\xe9\x24\x2c\x02\x1d\x85\xd1\x70\x3c\x4b\xc3\x0b\x86\x0c\x68\x8e\x50\x42\x55\xe5\x0b\x83\xb0\x2f\xf6\xaa\x72\x14\x24\xeb\xc0\x24\x23\x4e\x2d\xa6\x37\x9b\x3d\xf2\x86\x77\x9d\x62\x51\x03\x90\x9c\x2c\x2d\x9f\x1d\xbb\xd9\x88\x1e\xe0\x5d\x71\xdc\x2c\x47\x34\x63\xea\xac\xa2\x28\x0e\x6c\x61\x2c\xc5\xf3\xb2\x6a\xf4\x14\xdb\x5e\xab\x09\xd4\x9e\x43\xe9\x16\x6e\x60\xc8\xbe\x69\x63\x94\xbe\x3d\x71\xcd\xab\x0b\xab\x2f\x69\x09\x21\x04\x4b\x3a\x89\x37\xe3\xdd\xe5\xba\xbb\xee\xe5\x86\xd5\x77\x88\x07\xb9\x1d\x62\x6b\x87\x41\x61\xbd\xd4\xa6\x5b\xaf\x71\x2e\x94\xf2\x84\xfd\x6d\x89\x65\xb8\x55\x75\xa4\xaa\x92\xa1\xbd\x4a\xdd\x5f\x55\x5d\x34\xf9\x57\xa9\xea\xab\xaa\xb8\x47\xb3\x42\xcd\x81\xaa\x49\xbb\x49\x2b\x54\x0d\x74\x5f\xc5\x7e\xd5\x0a\x95\x4f\x55\x65\xb9\x29\xb6\x42\xe5\xa1\xd1\xb2\xde\x8a\xb8\x06\x42\x71\xf3\xd3\xa4\x9b\x50\x36\x9c\xd9\xe5\x8b\x24\x3d\x35\xaf\x75\x5a\xad\x96\x47\x4f\x54\x7b\x50\x4c\xed\xb8\xfd\xaa\xe8\x4a\x7f\xac\xd0\x9e\xcb\x07\x27\xea\x74\x76\xea\x63\xd9\x68\x9a\xfd\x33\x06\x28\xaa\xeb\xd5\x07\x3f\x49\xef\xbe\x1f\xf7\x13\xc8\xa8\xaa\x1f\xb3\x6c\x58\xd6\x8d\xbb\x8e\x77\xf4\x74\x59\x1e\xb9\x8b\x98\x47\x61\x1a\xbf\xbe\xe6\xd4\xe2\x69\xab\x1e\x21\x05\xe2\x86\x98\x6c\x2b\x4c\x90\xba\xd5\x1e\x52\x9d\xc7\xd7\x22\xa2\xc6\xa7\x34\xbe\xcb\x77\x88\xbf\x7a\x43\xd7\x73\x1a\xca\x9b\x1f\xcb\x2d\x71\xb2\x65\x3e\x51\xc8\x5b\x43\x6d\x1b\x68\xdf\xe9\x16\x3c\xeb\x42\xd0\x5c\xc0\xa3\x47\xf8\xe7\x19\xba\x78\x99\x56\x9e\x9f\x31\x23\x8c\xb3\xb3\xd9\xf6\x20\x68\x4e\xf8\x3f\x01\xff\xe7\x2f\xfc\x9f\x77\xfc\x9f\x4f\xfc\x9f\xb7\xf2\xf5\x32\x3f\x63\xcd\x94\x65\xaf\x67\xe3\xf1\xdf\x70\x2b\xa7\x99\x7b\x71\x24\x10\x41\xa1\xaf\x4a\x0e\x3b\x82\xe6\xe2\xda\x56\xcc\x33\x8c\x59\x36\xbc\x75\xc7\xf8\x3f\xcd\x2f\x9f\x8f\xae\xef\x61\xae\x8b\x5f\x3e\x1f\xdd\xac\x97\xaa\xc5\xeb\xbb\x9b\x3f\xfc\x61\x97\xd8\xdc\xc2\xb2\xcd\xbe\x2e\xf6\x61\xe1\xc1\x64\x9f\x4f\xa4\xc1\x3e\xb4\x3d\xf8\x0b\x7e\xbf\xc3\x7f\x3f\xe1\xbf\x6f\xf7\xa1\x95\x0b\xa1\x6b\x32\x63\x21\xdc\x8a\x50\x5c\xbc\x1f\x9f\xc3\x09\x33\x22\x8f\x88\x14\xb9\xd8\x32\x0a\xda\x85\x72\x05\x32\x0b\x4a\x56\x84\x30\x65\x49\x18\x07\xa9\x15\x08\x84\x27\xe4\x8a\x71\x4b\x39\xf0\x17\xa9\xd9\xd8\x22\x5f\x28\x3d\x8b\x13\xdc\x5a\xb4\x4b\x62\xf2\xcb\x62\x71\x34\xc2\x8d\x72\xf4\xbb\x0c\xe6\xbb\x5c\x49\x23\x51\x9d\x5f\x10\xde\x1f\xf5\x81\xcc\x47\x49\x5e\xd9\x47\xd7\x08\x7e\x12\xc6\xc1\xdb\x38\x3e\xc7\xd8\x36\x72\x44\xf8\xcf\xaa\x2a\xa2\xff\xa5\xe0\x25\x6d\xf2\x85\x6b\x1b\x28\x54\x32\x89\x57\xda\x8c\x45\xdd\xd2\x6a\xb5\x0d\x96\x57\x47\x9a\x97\x36\x47\xa3\x61\x17\xac\x6d\x20\x57\x41\x8f\x51\x75\x6f\xde\x55\x55\xb9\xbe\x27\xa2\x6a\xee\x80\x8f\xf3\x08\x29\x9d\x86\xdf\x90\xeb\xef\x4f\x46\xcf\xa9\xa9\xc6\x8b\x86\xb9\x13\xae\xd3\x07\x76\x25\x6c\x44\x64\xfd\xa8\xb2\xcc\xd4\x61\x63\x1f\x57\xfe\xe2\x67\xa0\x0a\xbd\xf4\x17\xef\x47\x66\x49\x56\x9d\x35\xd2\xa0\xc3\x61\x12\xd3\xaa\x40\x08\x42\xe3\x2f\x2a\x93\xaf\x73\xe4\x91\x79\xe3\x8d\x95\xdc\xee\x88\xe4\x5f\xed\x56\x70\x23\x93\x72\xde\x1a\x8d\xa8\xa5\x87\x6c\x64\x62\x77\x8e\xce\x5e\x45\xde\x3b\xa3\x22\x5f\x2d\xc9\x3a\x53\x95\xfe\x01\x85\x45\x24\xff\xbb\x4a\xfe\x12\x85\x73\xae\xb3\xd2\xcc\x9f\x4c\x45\x6e\x5a\x9e\xfb\xc9\xc2\xe6\x93\x1e\x05\x2b\x7d\x96\x1f\x35\xc2\xf3\x5d\x1c\xe9\x11\xfc\x62\x95\xa1\x02\x9f\x66\x46\x81\x9f\x4b\x0a\xbc\xf9\xf4\x5e\xe4\x5e\x96\x37\x61\x41\xf8\x6b\x09\x04\x0b\x87\xb9\xcd\x14\xbf\xd8\x3f\x17\x0d\xf3\x14\x45\x24\xfe\x4d\x25\xca\xd9\x4d\x64\xfc\x87\xca\xf8\x8f\x38\x12\xca\x9b\x3c\xc7\x49\x32\xc2\x8c\x25\xfe\xf8\x03\x45\xb8\x51\x1b\x13\x5c\x22\x66\xd9\xf0\x75\xb5\x50\x7c\xf9\x7c\x54\x2b\x17\x5f\x3e\x1f\x55\x89\x86\xac\x5a\x2e\x1d\x5f\x3e\x1f\x2d\x25\x20\x5f\x3e\x1f\xd5\xc8\x48\x59\xee\xc8\x6a\xa3\x4e\x52\xbe\x7c\x3e\xaa\x10\x16\x91\x53\x22\x2f\xb2\xc5\x52\x91\xc1\x06\x6b\xa4\x46\x76\xba\x42\x70\xb0\x7a\xb9\xec\x7c\xf9\x7c\x74\x7f\xe2\xc3\x47\xaa\x42\x82\xf4\xf8\xd6\x0a\x91\x28\x56\x2b\x47\x56\x99\x32\x51\xca\xb7\x55\x21\x4d\x16\x9c\x1b\x09\xd4\x97\xcf\x47\xa5\x32\x65\x18\x8d\x05\xb1\xfa\xf2\xf9\x68\x55\xc9\x9a\xf2\x15\x50\x4e\xaa\x30\xad\x42\xa2\x30\xaf\x28\x4d\xba\x4a\x5e\x92\x30\x27\x2f\x45\x98\x48\x76\xe3\x4b\xcb\x1a\x44\xa1\xc2\xdc\x52\x81\x2a\xcf\x19\xa9\x66\xca\x05\x09\xf3\x0a\x42\x54\x4c\xfd\xd5\x6a\x21\x27\x3c\xa2\x81\x52\xc1\xd1\x7d\x2c\x08\x8d\xa8\x96\x17\x18\x4c\x2e\x08\x0b\xa6\x56\xc9\x4a\x31\xb3\x28\x2a\x34\x0c\x05\x31\x31\x07\xad\x42\x44\x54\x91\x0a\xf1\xc8\xe5\xdb\xa2\x51\x84\x5f\x10\x8b\x5c\xfd\x82\x48\xe4\x38\xc2\x90\x0e\x23\xc7\xe0\x93\x85\xcc\xc9\x09\x09\xa6\x95\x08\x08\xa6\xe7\x84\x83\x20\x97\xcb\x06\x5d\x4c\x4d\x19\x24\x6c\x38\x4b\xf0\x28\x26\x08\x13\x36\xc4\x58\x3b\x01\xc3\x40\x1a\x61\x1c\xa5\x2a\x48\x57\xc0\x46\x2c\x49\x28\xba\x9c\x30\xe0\x9a\x73\x2b\x82\x81\xb1\xce\x91\x1b\xf0\xa9\x7c\x23\x0a\x8b\xff\x52\x56\x1c\xd7\x39\xa5\xc5\x87\x55\xd0\x3f\x17\xaa\xe8\xf9\xb3\x0e\x27\x5d\x2a\x5f\xa9\x06\xb3\xea\x4a\xd7\xe0\x67\x55\xbc\x26\x44\xa3\xee\x8d\x7d\xa6\xa2\x9d\xd1\x0d\x37\x18\xe1\x49\x28\x6f\x7c\xf6\xfa\x79\x87\x81\xcd\xb6\x99\xf2\xab\xe9\x90\x0e\xe2\x92\x83\x0e\x05\x51\x8c\x20\x33\x34\x7f\x4c\xfd\xc0\xfc\x49\x68\x5a\xc1\xc8\x1e\x22\x72\x79\xff\x4a\xd7\x2d\xec\x23\x6c\x88\xf3\x50\xb9\xf2\xaa\x8c\x62\x84\x4f\x3c\xe8\xb8\x8b\x66\x04\x23\xf4\x40\xd8\xce\x85\x2d\x12\xcf\x29\xe0\xfb\x16\x46\x44\x48\xf4\xcc\xff\xd5\x83\xd0\xb5\xa2\x0a\xe1\x43\x1f\x53\x7c\x66\x7a\xea\x07\x69\x6f\x68\x47\x79\x3c\xf3\x93\x17\x19\xc7\xca\xed\xbb\xf0\x50\x7a\xb8\x54\x16\x32\x21\xe3\x61\x3d\x41\xa6\xb0\x49\x0d\x86\x71\xaa\x00\x6f\xa6\xb6\x1a\x79\x2c\x46\xea\x10\x93\x06\xbf\x37\xec\x53\x4b\x23\xed\xfb\x84\x57\xa8\xad\x56\xcc\xde\x0e\xad\x1c\x3e\xd2\x18\x8e\xc9\x78\x91\xe1\x81\xfc\xfb\x60\x55\x5a\xa9\x63\x7d\xac\x60\x3f\xf6\x70\x55\xf4\x24\x8a\xd8\x25\xee\x36\x9a\x4c\x1d\xb1\xcb\x97\x45\xff\x2d\xc5\xd4\x04\xda\x66\x6b\xf1\x32\x1a\x6e\xe2\xb4\x9f\xb6\x5a\x6e\x9e\xb9\x69\x0a\x50\x51\x0f\x02\xe3\xc8\xd7\x93\x42\xb1\xd1\xc5\xb7\x70\xec\xca\xea\x00\xd1\x76\x69\x79\xd8\x95\x5d\x94\xae\x2c\x2a\x94\xcc\x78\x9c\x0b\x82\xe4\xc3\x97\x9f\xde\xfc\x82\x5b\xce\x38\x41\xe5\x3c\x99\xa4\x5f\x4d\x66\x06\x3c\x6a\xfc\x7b\x03\xc2\x08\xf4\x3d\x28\x63\x2f\xef\xdf\xad\x18\x51\x9f\xcf\x18\xf8\x93\xcd\xe9\x04\x46\x63\x1f\xa3\x29\xb5\x30\x46\xc0\x8b\x77\x14\x78\xac\x8d\xbf\x3e\xbc\xb3\xa0\x4f\x25\xf4\xa0\xf9\x17\xe8\xe2\xbf\x3f\x40\xbb\x03\x1b\x10\x34\xa7\xb0\x0e\xed\x8e\x1d\x86\x8a\xfc\x2c\x02\x7f\xb1\x19\x8f\x36\x39\x49\x10\x34\xff\xe0\x09\x0b\xe6\x27\x90\xc5\x32\x9f\xff\xb4\x5a\xfb\x59\xb6\x66\x0b\x6b\xd0\xfc\x19\x9e\x41\x1b\xbe\x7d\x03\xfe\xf9\x1c\x76\xb7\x73\x64\x34\x4b\x3f\x74\x1a\x97\x02\x0e\x47\xfb\x52\xbf\x67\xab\xda\xf9\x8f\x62\x3b\x34\x80\xd0\x55\x5b\x9a\x92\x4b\x82\xe6\xc2\x75\x71\x60\xa1\x8b\x65\x9a\xa7\x4c\xac\x10\x1c\x4b\x3c\x44\x7d\x5e\xf0\x39\xec\x20\xb2\xbc\x4e\xb7\x8b\xd7\xae\x96\xda\x51\xee\x71\x7a\x6f\xad\x73\x1c\x68\x86\x27\x3f\x10\x16\x8e\xd1\x99\xcf\x85\xa5\x9e\xd5\xa9\x07\xe7\x12\xa8\x12\xcc\x97\x84\x39\x96\x30\xc5\x31\x6d\x33\x1e\x8d\x52\x96\x39\x24\x00\x38\x58\xf8\xea\xea\x3a\x3c\xb1\x5a\x09\x9a\x39\x0a\xaa\xcd\xdb\x5c\xb1\x89\x5d\x0c\x0d\xc3\x7c\x99\x20\x3f\x18\x19\x73\x30\xaa\x1f\x1f\xf0\x0d\x78\xec\xc2\x0f\xf0\xc4\xd0\x53\x79\x4f\x27\xd5\x69\xa1\x43\xea\x87\xfb\x7e\xc6\x9a\x99\xe7\xec\x77\x30\xd8\x65\xf0\x6e\x3d\xda\x85\x53\xf9\x9b\x0d\xf7\x32\x63\x7d\xed\x40\x5f\x3b\xca\x0f\xac\xd1\x46\x51\xff\x2b\x89\x3a\xc6\x4c\xf9\x52\xae\x5e\x4a\x14\x46\x63\x26\xaa\x1d\x42\xd0\x9c\xf1\x56\xf8\x14\xfb\x57\x95\xd8\x86\x7d\x33\xa6\x28\x71\x8b\x54\x2b\x70\x58\xae\x44\x4c\xc5\x01\xfb\xe5\x9c\x57\xc2\x6d\x44\x24\xb3\x35\x24\x8a\x81\x8d\x45\x0e\x54\xcd\x7f\xe5\xc3\x01\x9b\xe0\x70\xcc\x36\x60\xd7\x15\x5d\xa0\x82\x41\xf3\x8b\x9d\x6f\x13\xf2\x2a\x3f\x2b\xe1\xc9\xc1\xef\x71\xc4\x72\x13\x92\x3f\x1e\xc3\x28\x64\xe3\x20\x05\x3f\x11\x9e\xac\xd3\x84\x65\x2c\x00\x3f\x85\x2f\x9f\x8f\x50\xf9\x67\x67\x2c\xd2\x00\x89\x7b\xc0\x1f\x0e\xe3\x04\x43\xb7\xc8\xa8\xc0\x2a\x60\xb0\x6a\xcd\x9a\x1a\x4a\x54\x36\x9f\x8c\x36\xf8\x9c\xf4\x1f\xb0\x05\xed\x56\x0b\xbe\xd9\x54\x7a\x27\x73\x7f\xe0\xb9\x3a\x47\xcc\x1c\xfa\xec\xaa\xac\xe3\xa6\x0f\x6f\xbe\x9b\x74\xf6\x80\x88\x36\x6d\x6b\x46\x8e\x69\x50\x6d\xc8\x2c\x61\x60\x78\xf0\x6b\xfe\x31\x6c\xc3\xc2\xae\xb7\xaf\xff\x7f\xf6\xbe\xb5\xaf\x71\x1c\xd9\xfb\x3d\x9f\x42\x9d\xdd\x21\x76\x63\x42\x12\x68\xba\x27\x99\x74\x6f\x5f\x98\x5d\xf6\xe9\x69\x38\xc0\x5c\xfa\x30\x1c\xda\x89\x15\xe2\xc1\xb1\xb3\xb6\x03\xc9\x00\xdf\xfd\xf9\xa9\x74\xb1\x64\xcb\x8e\x73\xeb\xcb\x0e\xbd\xe7\x0c\xb1\x2d\x95\x4a\x52\xa9\x54\x92\x4a\xff\x22\xb2\xa2\x18\x1c\xc9\x27\xc9\xf0\x06\x26\xd8\xcc\xcd\x0c\xe5\x94\x99\x4c\x1a\xfd\x0f\xf4\xb2\x83\x86\x62\xaa\xdd\x16\xd3\x68\xd6\x5c\xe5\x16\xf4\xd6\x96\xe2\xd2\xdb\xd3\x18\xd4\x5a\x5b\x57\xce\xc8\xd8\xe3\xc6\x18\x31\xa1\x5d\x1f\x8c\x69\xf4\x4a\x9f\x13\xb5\x50\xef\x22\x65\x05\x50\x1a\xf7\xf7\xc8\x30\xfe\xe0\xa4\xa0\xb5\x45\x13\x43\x34\x71\x53\x53\x3d\x49\x7f\xf4\x24\x03\x4e\xaa\xe7\x1f\x5b\x5b\xa6\x5c\xa7\x2c\x89\x0d\x94\xf1\x60\xfd\x23\x47\x18\xe8\x3e\x86\xcc\x9b\x2b\x77\x3f\xa0\xf7\xb0\x13\x2d\x86\xb2\x45\xf9\x11\x58\xa8\xca\xc1\xa7\x4f\x15\xc2\x48\xe4\xa2\x27\x26\xe7\xfe\x79\xfd\x42\x85\x55\xbf\xb0\xc0\x9c\x87\x0f\x49\x84\x68\x5a\x07\x9d\xcc\x4a\x3b\x5a\x85\xcc\xaa\xc7\x57\xe5\x59\xbe\x4d\xe5\x5d\x15\xe3\x65\x78\xbe\x5d\x8c\xdd\xdb\xd5\x72\x9a\xec\x00\xce\x6e\x60\x76\x9e\x56\x9e\xdf\xa1\x92\x73\x55\x2c\xcf\xe6\x76\xb8\x08\xa3\xc3\x55\xf2\xa8\xee\x94\x6a\x99\xe5\x28\x1c\x19\xe5\x9c\xd9\x77\x49\xb2\xce\x2c\x6d\xe1\x92\x4a\x97\xb2\x70\x7d\xe2\x99\x75\xc9\x1e\x98\x1a\x4e\x8a\xba\xee\x38\xf9\xdc\x11\x26\xcc\x45\x1e\xd1\x19\xf4\x6e\xe7\x20\x25\x8f\x98\x02\xee\xe8\x11\x31\x25\xc8\xcc\xcc\x5c\x92\x85\xd4\x86\x73\x10\xe2\x7a\x5d\x4f\x89\xb9\x15\x9c\x6f\x19\x40\xec\x5f\xc1\x38\x8c\x0c\x93\xcc\xb8\x8d\x66\x3e\xcd\xd4\x59\xdd\x1c\x5d\xc2\x2d\xcf\x22\xd2\x73\x75\x4c\x19\x82\x0b\x74\x4f\xb2\xe2\x2b\x22\x5c\xba\x93\xca\x91\x9b\xab\xab\xd8\xc1\xa1\xae\xb7\xb4\x30\xae\xc9\x86\x54\xfa\xf2\x80\x0e\xa8\x57\x82\x06\xa6\xdb\x4c\xf2\x46\x34\x90\xcd\xc3\xe3\xcb\xdc\x45\x68\x53\xfb\x53\xaa\x50\x9f\x99\xa5\xd4\x12\x04\xed\x30\x9b\xbf\x11\xe5\x2f\xb5\xfd\xc6\xd9\x13\xde\x6d\x82\xc1\xd1\x12\x0c\x8e\x14\x06\xc5\x1e\xf7\xd2\x8d\x98\xda\x66\x5f\x6d\x3b\x72\x4f\xd5\x45\x9b\xd2\xe2\x6b\x91\x95\x36\xa1\x88\xb5\x4e\xcf\x29\xc1\xb1\xeb\xae\xb2\x5d\x81\x60\x3a\xa8\x72\x49\x7e\x20\xf2\xab\x5e\x81\xed\x63\x56\x19\x7a\xdb\xe8\x84\xa2\xdd\xfe\x1e\x3d\xfd\xdd\xd9\xda\x81\x80\xe3\x7e\x10\xe3\x16\x72\xaf\xfc\x20\xc4\x11\x8d\xad\x2d\x8e\x74\xa8\x38\xd1\x33\x20\x96\xf5\xbb\x1d\x8b\x0d\xa5\xff\x8c\x83\x18\xd3\xb7\xe7\xbf\xff\xfe\x7f\x7f\x7f\xba\xf5\xea\xfe\xfc\xf7\x0b\xc3\xac\xdd\x3d\x5c\xec\x5c\xc9\x40\x0c\x23\xdb\xe1\x38\xf7\x10\xd2\x89\xc2\x5c\x4a\xf8\x06\x14\x3d\x53\x84\xf5\x40\xaf\x20\x1e\x85\x1c\x1f\x48\x1c\x5c\xd0\x78\x16\xaf\xd0\x36\x4d\xdd\x4a\x20\x98\x93\xc4\x02\x94\x5c\x59\x32\x49\x98\x33\x40\x63\x0b\x19\x8b\x83\xdd\x6f\x71\x8e\x5a\xec\x47\xca\xa5\x90\xb5\x8f\x11\x29\x2e\x85\x51\x2d\xc4\x10\xcc\xdd\x10\xed\x67\xa1\xca\xef\xbf\xff\x7d\xb3\x62\xea\x9c\x08\x4f\xb0\xe1\xdb\x43\x1c\x65\x30\x2c\x4e\xf0\xd5\xc1\x64\x64\x54\xfe\xcf\x78\xd5\x02\xe8\x26\x92\x0a\xae\x8f\x31\xc2\x1c\xbc\xe9\x1e\xc0\x9b\x2a\x26\x91\x08\x57\x5f\x08\xf3\xbd\x92\x0a\xa2\x70\xbd\x44\xaa\xef\x1e\x2c\x25\xb8\x04\x2d\x27\x69\xcf\xf4\x71\xcc\xd0\x1e\x9d\x43\x9a\x73\x37\x6d\xdc\xa1\x0e\x72\xa5\x2e\x18\xda\x23\x95\x99\xbc\xe3\x52\x8d\x21\xc4\x6d\x50\x2e\xd4\x3a\x23\x94\xda\x92\x0d\x53\x86\x1a\x92\x4c\xfc\x2d\x1f\xae\x4c\xe5\xd8\x9b\xc5\x7c\xd1\x7d\xb8\xd5\xf3\x35\x5e\x8c\xaf\x95\x35\x56\x53\xc7\xd4\xcf\xcb\x30\x75\x78\x7a\xb4\x7a\x8e\x7e\x59\x86\xa3\x15\xf4\x9d\x96\xa9\x5f\xe7\x67\x2a\xf1\x72\x5e\x82\x99\x3d\x1d\x33\xd3\xf9\x99\x59\x9a\x11\x6d\xab\x08\x46\x88\xb2\xa5\x3f\x5e\xa2\xfd\x17\xe8\x15\x6a\x7c\x5f\xaf\xa3\x16\x6a\xd6\xeb\x75\xb3\x3c\x97\xff\x1b\xf8\xba\x85\x11\xe7\x72\xe7\xff\x8c\xff\x35\xef\x8d\xf3\xad\xed\x8b\xdf\x9d\xdf\x1d\xd3\x78\xd5\x6a\xbd\x32\xe0\xa7\xf9\x6a\x27\x9f\xf7\x7d\x1d\xef\xff\x4b\xaa\x7d\xde\xb8\x40\xaf\x10\xe1\x74\xdb\xf0\xcf\x9b\x50\x0f\x9f\x63\x8e\xd7\xeb\x15\x73\x0e\xe6\x25\x57\x98\xd5\xb7\xf4\x10\xb8\xad\x5f\x00\x52\x5c\x69\x96\x12\xa7\xa1\xd5\x73\xe4\xcc\x2f\x84\xc2\xc3\x68\x29\x6e\x76\xf3\xda\xa7\x6e\xa1\x85\xd8\xa2\xee\x50\xab\x6f\xa1\x7f\xcd\xcf\x0a\xf3\x99\x5a\x3d\x2f\x3f\xcd\xcf\x0b\xf3\xa8\x5a\x3d\x2f\xa7\x8b\xb4\x4b\xe2\x82\xb6\x7a\xe1\x79\xbf\x08\x43\x89\xd3\xdd\x52\x0c\x69\x75\xd3\x7b\x8e\x08\x42\x21\x17\x61\xe0\xc3\x61\xc9\x3c\xca\x54\xf5\xf1\x2a\x60\x52\xac\x00\xe6\xb1\x67\x52\x5c\xe4\x31\xa1\xb8\xee\x2d\xd8\x50\xba\x16\xfa\x9f\xf9\xbb\x4c\xe7\x45\xb8\x62\x8e\xe8\x1c\x68\x52\x28\xe8\x7a\x29\xd6\xd2\x37\x0a\x08\x47\x23\x65\x3d\x40\x56\x57\x4e\x72\x90\x6a\xa1\x91\x85\x9a\x5a\x4b\x3f\x51\x64\x39\x14\xd8\x06\xc8\x0c\x12\x8d\xe6\x6c\x12\xd4\x9f\xe4\xfe\x1e\x90\xaa\x72\xa9\x29\x0a\x3f\x4b\xb0\x51\x18\x27\x70\xc6\x81\x36\x40\x3b\x94\x09\x35\x54\x78\xbd\xde\x34\x1c\xd3\x42\x0e\x6d\x92\x5d\x6d\x25\xd2\xba\x27\xa7\x61\x94\x64\xc5\xf4\x54\xd5\xa1\xd2\xcb\x2d\x73\x8b\x18\x24\xf5\x8a\x96\xa2\x6a\x79\xe4\x31\x48\x37\xd4\x00\xd9\x38\xbf\xcb\xa4\x19\x28\xb7\xa2\x34\x45\x91\x18\x9d\xce\x6c\xae\x53\xa5\xa5\xf4\x54\xb4\xab\x32\x09\x9f\x9a\x42\x52\x2a\x87\xef\xe2\x1e\x61\xe2\xd7\xf1\x9c\x42\x72\xe5\x15\x90\x5e\x5e\x65\xf9\x2d\x29\x5c\x83\x04\x57\x60\x9c\x38\x86\xac\x5e\x4a\xf3\xdb\x4a\x59\x94\x8d\x8a\x1b\x8a\xd8\x49\xe0\x47\xf0\xb2\x93\x72\x85\x31\xcb\xc4\x3e\x57\x18\x76\x05\xc3\x67\x83\x71\x18\x09\x27\x16\xa7\x38\xd4\x79\x09\x1a\xd4\xb1\xc6\x91\xbb\x76\x8e\x1e\xc9\xa3\xb9\xd2\x3e\x21\x4b\x86\x55\xd0\x12\xbd\x43\x63\x6b\x96\x1e\x17\x5c\x72\x15\xb1\x95\xfb\xba\x48\x56\x92\xe5\xf2\xc2\x62\xaf\xf7\x87\xfa\x5c\x62\x9f\x3f\xb9\x38\xaa\x03\x13\x75\x27\x29\xa0\x24\x2f\xd7\x4b\x52\x63\xf4\xf6\xb4\xf4\xe8\x5a\x36\x19\x84\x7f\xf2\x21\x48\x6c\x90\x3f\x03\x1f\x1f\x51\x8f\x2c\x59\xb6\x8d\x3f\x19\xdc\x3b\xdd\x1e\x35\xfe\x44\x4f\xe9\xde\x5c\x65\xab\x22\x05\xa8\x21\x0c\xfd\x89\x76\xd0\x3e\x38\xcf\x58\x34\xc2\x51\x33\xfd\xfd\x3b\xb4\x9f\x7c\xd3\x71\xa8\x5c\xd1\x2a\xa8\xb6\xf0\xd4\x2b\x68\x3d\x71\x61\xab\x98\xce\x6c\x03\x44\xdc\xef\x2a\x45\xa8\x9c\x19\x22\xdf\x0c\x5b\xda\x12\xc9\x38\x52\x2e\x22\xeb\x37\x9c\xc8\x1c\x76\x48\xea\x0a\x5b\x71\xfb\x94\xb6\x46\x52\x37\xf1\xf2\x0c\x12\x7d\xe1\x05\x36\x89\x7a\xa1\x6e\x06\xb3\xa5\x2c\x93\xe4\x0e\xde\xac\xaa\xcf\xb6\x4f\x92\x7b\x75\xc5\xb4\xca\x58\x29\xfa\x8b\x78\x8a\xa1\x12\xdc\xf2\xc1\x2f\xbb\x20\x0b\x80\xfc\x5b\xd5\x56\x09\x6e\x0b\x8a\x59\x99\xb9\x12\x71\x11\x5c\xd2\x5a\x29\x16\xe5\xc2\x26\x2b\x61\xaf\xc8\xed\xb5\x4a\x93\x25\xe6\x5c\x2f\x6e\xb1\x68\x49\x2c\x67\xb0\xe4\x90\x5c\x65\xaf\xcc\x6f\xae\x68\x49\x29\x5e\xb1\x33\x0d\x16\xfd\xfd\x51\x9d\xcd\x92\xf4\xf7\x0c\xa9\x59\x81\xe5\xa2\xf5\xda\xff\x7c\x23\x60\x86\xb1\xa1\xb8\xda\xcf\xb4\x5e\x14\x54\x95\x79\x68\x16\xda\x30\xec\x6a\xad\x8a\x69\x57\xd9\xaa\xe7\x29\xfd\xd4\x96\x93\x9a\xed\x3b\xfd\x3c\xa1\x6e\x10\x29\x59\xb6\x9c\x99\x39\x84\x16\x57\x32\x4a\x7b\x67\x5b\x0e\xdf\x39\x03\x5a\x29\xb4\xa3\xef\xeb\x5f\x7f\xec\xa9\x3c\x1c\x32\x37\x0a\x4e\x25\x7f\x82\x85\x23\x4f\xcd\x03\xcb\x46\xdd\x12\xe4\x92\x51\x07\x55\xbe\xfb\xb8\xfd\xdd\x70\xfb\x3b\xe7\xec\xbb\x7f\xb5\xbe\xfb\xa9\xf5\xdd\x69\xed\xbb\xf7\xff\x5b\xc9\x86\xcb\x3d\x8c\x82\x0f\x76\xec\xde\x60\xe9\xe6\xa2\x04\xfc\x53\x8b\x83\xc3\xd3\x23\x16\x30\xcc\x14\x4e\x10\x22\x2f\xea\xc0\x15\x29\x25\xc4\xa5\xc8\x00\xc6\xef\xab\x74\x41\xf0\xb6\xd4\x8d\x0c\x1d\xda\x19\x1b\xd6\x12\x40\x9f\x21\x57\xdd\xa4\x31\xb7\x52\x48\x5b\x59\xd8\x48\xe8\x01\x9a\x4a\x34\x2c\x4b\xc5\x3a\x1a\x00\x24\x39\xe7\x1a\x30\xbf\xef\x1b\x5f\x13\x98\x9f\x17\x38\x76\x34\xb8\x74\xa3\x1f\x19\x27\xf9\x41\x51\x16\x0c\x44\xa3\x2d\x83\xb7\x99\xbe\xac\x5a\x11\x5a\xaf\x96\xde\xa2\x51\x78\x42\x6c\xf7\xf2\x91\xe0\x16\x8e\xb3\xc9\xc8\x2e\x51\x4b\x41\x63\xd1\xe8\x3f\xa3\x30\x18\x5d\xc6\x85\x91\xb9\xeb\xab\xa0\xbd\x44\x1d\x55\x42\x8b\xc6\x22\xea\x79\x76\x14\x81\x1f\x4b\xbe\xbe\x5b\x05\xed\x25\x2a\xaa\x12\x5a\x38\x24\xd2\x38\x76\xbd\xcb\xe3\x71\x88\x4f\xb0\xef\xe0\x30\x5f\x6c\x17\x0c\xdd\xca\xe0\x7b\x6d\xd7\xc7\xe1\xe5\x7b\x7b\x5a\x54\xc4\x82\xf1\x97\xf6\x2f\x2f\xa3\x81\x3d\xc2\x97\xef\x82\xfc\x61\xf7\x7c\x41\xc1\x7c\xce\x9a\xe8\x84\x8c\x9c\x9f\x63\xd7\x2b\x88\xf0\xb4\x60\xe8\xab\x17\xa4\x89\x86\x34\xc4\xe0\xe5\x7b\xbb\x8b\xf3\xc3\x3b\x3e\x5b\xb0\x17\xbe\x67\xb5\x78\x67\xc7\xf6\x8c\x4a\x2c\x1a\x7c\xac\xce\x8a\x78\x3b\xb0\xc3\x19\x0d\x25\xc5\xa8\xbc\x84\x98\x0c\xe0\xc4\x48\xe7\xe0\x9a\x1d\x81\x73\xde\xfd\x7d\xe2\xcf\x6b\xb0\xa8\x02\xe8\x0e\xee\x32\x1b\xfc\xf6\x54\xa3\x8d\x5c\xf4\x43\x06\x9e\xbd\x8d\xe0\xf2\xd0\x1d\x75\x2d\x0c\xc6\x21\x20\x70\x8b\x54\xe7\xee\x45\x3b\xa1\x73\x8d\xa7\xc8\xf5\x59\x32\x92\xc9\xed\xf3\xf5\x8f\x64\x47\x0c\xec\xe8\xe8\xd6\x3f\x0e\x83\x11\x0e\xe3\x29\x85\x70\xa7\x59\x2c\x42\xc1\x24\x19\x29\x93\xe7\xd7\x78\x7a\x81\x3a\x8c\x20\x3c\xb5\xd1\x03\xfc\x8f\x07\x95\x82\x74\xe0\xe0\x49\x9b\xa0\x17\x62\x3b\xc6\x6f\xc9\x68\x96\xdc\x42\x11\x98\x72\x49\x2c\x2b\xdc\x77\x7d\xcc\x38\x70\x71\xc4\xda\xc4\x42\x44\xdd\x45\x99\xa6\xa9\xd3\xa6\x81\x8f\xba\x66\x71\x70\xd4\x0b\xdd\x51\x1c\x84\x10\x44\x3c\x18\xd1\x66\x49\x5e\xd7\xb0\x3f\x1e\xe2\x10\x22\x6b\x74\x72\xde\x93\x3e\xb2\xbd\x08\x2b\xf9\x7a\x81\xdf\x77\xaf\xc6\x3c\x67\x1c\x8e\x71\x9b\xde\xf5\x03\x47\x4d\x7a\xdf\x4f\x24\x37\xe5\xac\xb7\xa1\x1b\x2b\xd9\x58\x3f\x28\x75\x9f\x8a\x9a\x4b\x39\xaf\xf1\x54\x7e\x36\xdb\x72\x83\x27\x2d\xfa\x36\xf0\xa3\x38\x1c\xf7\xe2\x20\x84\x86\x8b\x03\x42\x34\x82\xc8\x25\xb1\xdb\x3b\xe6\x4d\x49\xd8\x4d\x3e\x9b\xd9\xc6\x97\x08\x25\x52\x22\x93\x34\x69\x9d\x15\xba\x45\x54\x54\x16\xda\x9c\x75\x29\x05\x11\x18\xf4\x00\x31\x23\xa9\xd4\x10\x79\xb1\xd8\xdf\xa6\x85\x2e\x63\x3c\x1c\xc9\x26\x35\xfd\xf2\xd6\xf6\xbc\xb7\x03\xdc\xbb\x36\x38\xd4\x86\x25\x53\xe5\xb5\x7d\x22\x3e\xcb\x90\x1c\x72\x42\x10\xf1\x41\x18\xdc\x82\xff\xe9\xd9\x74\x84\x0f\xc2\x30\x08\x8d\xca\x5b\xdb\xf7\x83\x18\x91\x31\x81\x6c\x04\x85\x22\x3b\x42\xb6\x68\xf7\x0a\xed\x0e\x99\xb5\x51\x10\x45\x6e\xd7\xc3\x52\x01\x27\x50\x63\x23\xc2\x5e\x1f\xc0\xdc\x3d\xc1\x1a\x79\xa5\x96\x7e\x82\xfb\x38\xc4\x7e\x8f\xb3\x10\x0f\xdc\x08\x0d\xec\xc8\xaf\xc6\xa8\x8b\xb1\x8f\x00\x87\xc6\xf6\x5c\x62\x77\x6f\xa3\x68\x3c\xc2\x64\x3d\x2b\xa7\x20\x25\x60\x87\xb2\x96\x60\xb1\x7b\x68\x73\x53\x84\x67\x81\x67\x00\xe4\x08\x40\x0e\x2b\x44\xe0\x33\xdf\x92\x5a\xa2\x57\xf4\x75\x0b\x11\x8e\xdb\x6a\x8d\x5d\x7f\x80\x43\x37\x8e\x8c\x68\xdc\x7d\x4b\xbb\x0e\xd8\x82\xdf\xbc\xaa\x8c\x78\xf2\x01\x3d\x51\x8a\x20\xdc\xa5\x3e\x52\xa0\x91\x9c\xae\x39\x25\x69\xc9\x42\x23\xc4\x11\xc4\xb1\x07\x58\x1e\xec\xc6\x03\x1c\xa2\x2e\xa6\x11\x0d\x82\x50\xea\x2b\x0b\x91\xbe\xac\xa0\x2d\x94\xe1\x05\x9a\x8a\x73\x9f\x48\x7d\xa2\xb9\xa9\x1e\x33\x24\x06\x15\x76\xe5\x81\x72\x87\x7a\x49\xcf\xb7\x40\x27\x79\x63\xdc\x42\x49\xe3\x24\x6a\xa6\x45\x95\x8c\x85\xb8\x7a\x68\x81\x76\xb0\x90\xac\x69\xe8\x3b\x22\x66\x7c\xe4\x49\x8d\xcb\xf8\x8b\x70\x7c\xcc\x59\x38\xea\x8b\x1d\xc1\xd4\xfb\x9c\x0e\x4a\x78\xab\x5d\x5e\x42\x4d\x60\x7a\x4b\x92\x40\x7f\xef\x3c\x7d\xba\x81\x9e\xa2\x7f\xf4\x5d\x0f\x1f\xdd\xe0\xf0\xc6\x95\xa5\x15\xbd\x0b\xe2\x8d\x04\x57\x39\x09\xd8\x28\x52\xbc\x0b\xe2\x32\x81\x5a\x74\x76\x9b\x36\x52\x03\xd5\x01\x64\xf5\x08\xea\x81\xcc\xc7\x54\x5f\x28\x13\xcd\xe5\x5b\x6e\x7e\xd0\x25\x77\x22\xac\x32\x63\x16\x92\xd2\xa9\xd8\x44\x72\x32\x11\xe0\x21\xad\x7f\xc8\x20\xb5\x94\xa4\x1c\xc7\x84\xe3\x8d\xe7\x6b\x05\x9a\x57\x61\x47\xea\x86\xfb\x7b\xde\x95\x57\x6a\x57\x2a\x85\x99\x35\x7b\x34\xf2\xa6\x8c\x96\x30\x07\xcc\xe4\x92\x9c\x3c\x13\xa7\xaa\x7e\x4e\xeb\x74\x8d\xa7\x2d\x54\xbd\xc2\xf1\xdb\x00\xee\xb9\xdb\x31\xae\x5a\xec\x5a\x24\x08\xb0\x68\x12\x25\x8d\xa1\x5e\x17\x81\x25\x0a\xe9\x15\xc2\x4a\x0d\x1e\x64\xc8\x99\x09\xe9\x26\x3a\x73\x4f\xe4\xf7\xd3\xe4\xfd\x54\x49\xff\x7a\xe2\x46\x52\x1e\xf2\xa8\xe4\x53\xbf\xc3\xa3\x80\x77\x21\xfc\x4c\x4e\x59\x7c\x49\xc8\x5a\x13\x61\x3c\xf8\xf7\x29\xff\x3e\xd5\x7f\x0f\x71\x44\xd7\x30\xd2\x6d\xf0\x49\x8b\x91\x35\x26\xb0\xa5\x4c\x1f\x6a\x5d\xdb\x77\xf8\x5d\x8b\xf4\x2b\xc3\x44\x3b\xa8\x89\x5a\x0a\x02\x4f\x6f\xda\x62\xe5\x1b\x53\x20\x34\xcd\x12\x4a\xbf\x92\x08\xf1\x7b\xdb\x0a\xf6\xd4\xcc\xf1\xa5\x35\x66\xcf\x2b\x6f\x61\x80\xdd\xd8\x9e\xeb\x10\x31\x11\xdd\x7b\xe8\x9f\xd8\xfe\x15\xa6\x43\x8e\x36\x46\xad\x37\xb1\x58\x05\x4d\xa2\x06\x3f\x4b\x91\x53\x8b\x35\x85\xee\x12\x3b\x4d\x94\xc1\x44\xc8\xe0\xed\xc0\x05\x23\x0b\xc9\xf2\x1e\x82\x8a\x79\x17\xc4\x39\xb2\x2e\xbe\x1b\xc1\x88\x4e\x22\xdc\x28\x95\x84\xc4\x01\xd5\x76\x13\xb8\x0e\xaa\x2b\xbd\x31\xc7\x9e\x47\xcd\xae\xb9\xd1\x2f\xa4\x31\x0e\x3c\x4c\x46\x2f\x2b\x50\xa9\x2f\x2d\x68\x3e\xaa\x3d\x2f\xf0\xb1\x4a\x93\x57\x42\x83\x1e\xb0\xe0\xbe\x94\x61\xe6\xb3\x4b\x3f\x18\xda\x22\x97\xac\x1a\xe8\x34\x5e\xb7\xb2\xab\x68\xcd\x6c\x62\x89\xc5\x9a\x71\xf7\xc0\x5a\xc7\x52\xb0\x77\xc8\xa0\xa7\x3a\xa6\xa7\x28\x2e\x32\x86\xd9\x7b\x45\x71\xc1\x04\xf1\xc1\x1e\x62\x90\xb1\x1e\x11\xfc\x68\x3b\xe4\x7a\x77\xdb\x09\x62\xf2\xff\xd5\x04\x08\xc6\xcc\x62\x7a\x88\x33\xd2\x78\x86\xf8\x16\xca\xae\x56\x41\x37\x4b\x68\xe8\x66\x9e\x8a\x6e\xaa\x3a\x3a\x94\x3e\x84\x8a\xf2\x75\xa3\xdf\xca\x4c\xf9\x9a\x15\x3c\x77\xad\x71\xa3\x0f\xe3\xe1\x51\x78\x1a\xb3\xb3\xa5\x89\xd9\x56\xe8\x7f\x5c\x31\xfd\xa9\xa9\x22\xf9\x91\x1a\xdc\xdf\xa3\x27\x6e\xf4\x51\xa3\x77\x64\x24\xaf\x07\xb9\xe2\x3d\xa1\xcc\x78\x3b\xa7\xe6\x4c\xb5\x94\x24\xf9\x3c\x85\xd0\x36\xdf\xcd\xed\x49\x10\x79\xd1\x37\xbb\x35\x78\xd6\xca\xa8\x94\x48\xbc\x6b\x6f\x6c\xa8\x1a\xee\x98\x4d\xec\xca\x48\x99\xd9\xf6\xba\x3d\x26\xee\xee\x04\x16\x0d\x8e\xb0\x1f\x43\xdc\xc2\xd7\x71\x1c\xba\xdd\x71\x8c\x23\xda\x17\x49\xad\xcc\x85\x0b\xa2\xbd\xdc\x77\xbd\x18\x87\x07\x37\xd8\x8f\x0b\x0b\x91\xfa\xa1\x9d\x1a\x84\xcb\x28\x26\xd1\xe4\xf3\x6d\x25\xea\xf4\x94\x20\x75\x27\x6b\x98\x79\xb7\x64\x0d\xd3\xc8\x51\x4a\x55\x2b\xa1\x6b\xf2\xcb\xc2\xe4\x1f\xb4\x53\x32\x19\x52\x59\x12\x62\x21\x19\x35\xf3\xed\x05\x6a\xea\xc8\x4a\x21\xc6\xf5\x9b\xe9\xb1\x1d\x92\x16\x94\x04\x5c\xd1\xca\x93\x96\xd4\x67\xb5\xde\x04\x6d\xa3\x50\xd1\x59\xea\xf7\x69\xfa\x3b\x98\x54\x2d\x08\x0f\xac\xbc\x1f\x60\xf7\x6a\x10\xb3\x0f\x92\x8e\x66\x3f\x4d\x49\x1f\x5f\x98\x72\x30\x35\xd9\xb2\x6e\x6f\x3c\x94\x31\x00\xce\x2b\x62\xe9\x51\xb9\x30\xc5\xae\x47\xcd\x71\xa3\x91\x67\x4f\xd9\xf8\xac\xca\x94\xab\x49\x2a\xd2\x28\x64\x55\x9c\x19\x99\xf3\x8e\x14\x1a\xdc\xeb\xf8\xe4\xe0\xf4\xe0\xc3\xd9\xeb\xb3\xc3\xa3\x0f\x97\xaf\xcf\xce\x4e\x0e\xdf\xfc\x7c\x76\x70\x3a\x2b\xc8\x97\x9e\x24\xed\xda\x83\x5f\x0e\x3e\x9c\x65\x68\xc1\xf1\x67\x91\xe4\xea\x4f\x4d\x6a\x76\xcd\x67\x80\xcb\x1b\x6c\x75\xb0\x10\x11\x90\x5f\xe3\x8e\x06\xbf\x5b\x88\x02\x99\x65\xe1\x8c\x92\x2d\x42\xbe\x34\x1b\x1b\x08\xb9\xd1\x8f\x61\xe0\xc7\x0b\xd1\xe9\x06\x01\x20\x92\xdb\xde\xad\x3d\x8d\x4e\x07\xc1\xed\x52\x64\x26\x0b\xe5\x06\xc7\x50\x22\xcd\xc6\xf9\xe2\x82\xb1\x50\x3f\xc0\x31\x3a\x8d\xd5\x3f\xfd\x56\x59\xdf\x40\xe5\xe6\x84\xaf\xb9\x0e\x6c\x30\x1d\x3a\x5f\xa0\x02\xfc\x2e\xd4\xc2\x75\xa7\x15\x98\x7c\xeb\x15\x00\xa5\xf4\x05\xd8\x27\xaa\x6c\x21\xe6\x31\xb5\xb3\x2e\xcc\x8d\x07\x79\xfe\xa4\xdf\xb9\xd9\x7a\x27\x2b\x48\xba\xeb\x9a\x52\x77\xe2\xa5\xe8\xc1\xba\x22\x90\xf0\x14\xb6\x50\x03\x7e\xf4\x5d\xcf\x6b\xa1\xea\xdf\xfa\xfd\x3e\x2c\xbf\xa2\x38\x0c\xae\xc9\x6a\xef\x6f\xbd\x5e\xaf\xca\x53\x1c\x8d\xec\x9e\x1b\x4f\x5b\xa8\x91\xa4\xf9\x95\x1a\x1d\x8d\x8d\x07\x76\xb2\x61\x9a\x64\x8d\x41\xf9\x6e\x2f\x12\x86\x95\x06\x8a\x33\xd2\xfb\x8f\x29\x3f\x9a\xe6\xa3\x1f\xcd\xa3\x1f\xcd\xa3\x1f\xcd\xa3\x1f\xcd\x5f\xd3\x8f\x66\xdd\xae\x2e\xcf\xd7\xef\xea\xf2\x62\xed\xae\x2e\xdf\x2f\xe6\xe9\x02\x57\xc3\x9d\xb3\x00\xe0\xa5\xf2\x1d\x3d\x20\xd9\x61\x8c\x43\x3b\x0e\x42\xc3\x0e\x43\x7a\xf1\x9c\xf2\x64\x87\x21\xc4\xee\x68\xd3\x47\x5f\x78\x4a\xc0\xa3\x43\xa8\x52\x87\x0c\xea\x5b\x83\x3a\x68\xec\x53\xb7\x03\xa7\x8d\xe2\x70\x2a\xbb\x89\x5c\xba\xe0\x15\x13\x9e\x9f\x4e\x87\xdd\xc0\xab\xb9\xac\xcc\x0b\x83\x18\x08\x51\x1b\x3d\x31\xa0\x00\xe3\x12\xd6\xcd\x6e\xcd\xc7\x93\xd8\x30\xcd\x9a\x13\xf8\xd8\x6c\x27\xa5\x13\xee\x08\x67\x34\x3c\xc4\x65\x54\xa3\x88\x5c\x6d\x16\x2a\x61\x73\x93\x7e\xe5\xa0\x5c\x9d\x0e\xa9\x50\x37\xc4\xf6\x35\x75\xd3\xe8\xd9\x71\x6f\x80\x0c\x1c\x82\x37\x02\xd4\x82\x56\x0a\x2a\x80\xc3\x90\x24\xeb\xbb\xbe\xed\x79\xa4\x02\xb4\x1a\xb0\x27\x78\xe9\x03\x75\xf7\xbc\x42\xb7\x16\x2a\x17\xa6\xf2\x64\x98\x6a\x56\xd8\xbc\x77\x4c\x76\x58\x7e\x89\x15\x37\x11\xc2\x64\x5b\xe7\x35\x92\xf4\x01\xc9\x0f\xdd\x57\x73\x23\x8a\x12\x66\x87\xd4\x33\x82\x65\x62\x24\xc4\x49\x41\xaa\x69\x91\x2b\x02\xde\xa7\x32\x6a\x7b\x5d\x90\xca\x39\xde\x3f\xf4\xe1\x60\x08\xd9\x31\xb1\x90\x62\x08\xc1\x80\xe9\xc9\xe9\x38\xc4\xc8\x0f\xfc\x6d\x28\xb9\xeb\x25\x5e\x1d\xcc\x19\x43\x75\x25\x79\x74\x40\x7a\x74\x40\x5a\x99\x03\xd2\xa3\x5b\xdf\xa3\x0f\xd6\xa3\x0f\xd6\xa3\x0f\xd6\x57\xea\x83\xf5\xde\xf5\x71\xda\x09\x8b\x3a\xb1\x10\xbb\x9d\x7c\x95\xe7\xc0\xe4\xad\xce\xb7\x01\x02\x7a\xd3\x1c\x92\x63\xc3\xaa\x9d\x1a\x58\x09\x2b\xf5\x68\x58\x87\x37\x03\xe3\x33\xe3\xca\xa0\xb8\x31\x2c\x56\x19\xe5\xa8\xb0\x4a\x68\x54\x8b\xdd\x11\x66\xb8\x16\x10\x0a\xf0\x1f\xea\x5c\xf0\x20\x39\x81\x71\x8c\x68\xd7\xc7\xed\x0d\xee\xa3\x2d\xc4\x87\xc9\xc7\x57\xe8\xa1\x47\x38\x2b\xe3\xa2\x07\xb2\x5c\xd2\x47\x8f\xa4\x5d\xdc\x49\x8f\xe4\x9e\xcb\x4b\x0f\x8a\x5b\xd4\x4d\x8f\xd6\x3f\xed\xa7\x77\xe0\x3b\xc7\x81\xeb\xc7\x51\xbe\x9b\x9e\x48\x62\xb8\xd1\x6f\x16\x52\xbc\x18\xca\x78\xeb\x2d\xe0\x7d\x27\x7f\x27\xea\xe9\x4d\x20\xf9\xfc\xb1\x17\xb2\x0f\x07\xf9\xca\x5e\x67\xfd\x4d\xf8\x87\x69\xe6\xd0\x56\xfa\x08\xcf\xd9\xd3\x5b\x29\x05\x7d\x91\x78\x34\xc0\xe2\x4d\xf5\xe8\x20\xac\x50\xd4\x65\xb9\x31\x6a\xd3\xb6\x92\x22\xd2\x39\x0b\x2a\x29\x58\xb0\xa0\x0e\x4d\xaa\xb8\xf2\x45\x79\x9e\x7c\x6a\x19\x70\x60\xcd\x09\x18\x02\x01\x9a\x12\x96\x4a\x2b\xe5\xed\xa7\x5b\xcf\x97\xf4\xbc\x03\x3e\x2c\xca\x86\xa9\xc6\x9d\x63\xe3\x85\xb6\x42\x10\xba\xdc\x83\x03\x2c\x96\xaa\x87\xfb\x71\x15\xbd\x42\xe7\x77\x68\xd2\x42\x13\x4b\x9c\xc2\x83\xf3\x12\xbc\x43\x5b\xb4\x17\xe5\x6f\x17\xa8\xc5\xb3\xe8\x3e\xf3\xac\x4a\x96\xc2\x40\x5a\x6e\xf4\x5b\xba\x87\x2f\x35\x5d\x3c\x51\x9b\xff\x32\xd2\x39\x8c\xaa\x49\x44\x27\x5f\x66\x7b\x39\xfd\x2a\xaf\x9b\x2f\x79\x3f\xd3\x0c\xc6\xa5\xe8\xe9\xcb\xcf\xde\xd5\x97\xac\xaf\x2f\x0b\x3a\x7b\xa2\xef\xec\x38\x18\x25\x7d\xcd\xe9\x4c\x5b\x68\x2a\x7a\x4c\x79\xb9\xc5\x07\xa7\xd4\xdd\x39\x09\x74\xd9\xb5\x3d\x3e\xbf\xbb\xe7\x97\xf5\x97\x53\xfd\xb2\x9a\x65\xfc\xb2\x9a\x8a\x5f\x56\xc2\x5c\x49\x07\x3b\xcd\xbe\xe1\x4a\x1d\xec\xe6\xa0\xaf\x73\xb0\xdb\xdc\x9c\xdb\xc1\x0e\xf3\x89\x4d\xf2\xaf\xd3\x4c\x76\x6a\x59\x22\xd3\x5c\x5e\x76\x72\x51\xea\x46\xa7\x21\x3e\x59\xa8\xa9\x44\x56\x8d\x62\x1b\x2e\xb6\x27\x99\xcf\xeb\x4a\x50\x62\xec\x3b\xea\xe7\xc6\x85\xd2\xb1\xa3\x85\x9c\xed\x74\xbb\xdc\x6b\x71\xb6\xd3\x17\x34\x9f\xb3\x5d\xd2\x05\x93\x46\x8b\xb6\x98\x3c\x80\xa6\xe2\xa5\x34\x78\x26\xcd\x16\x69\x3a\x25\x1d\x7b\x35\xe5\x9d\xf7\x97\x74\xdd\x63\xcb\x06\xbd\xef\x9e\xb4\xd0\x63\x7e\x7b\xa3\xd2\x4e\x7b\xba\x53\x8d\xe5\x9d\xf6\x00\xa3\x64\xe8\xb2\x95\x54\x6d\xd2\x60\x2c\xd5\x26\xea\x38\x9a\x66\x92\x4e\x45\xd2\xa9\x9a\x94\xb9\xf2\x41\x72\xbb\x1b\x71\xca\x4d\xb4\xcd\x49\x37\x4c\x9d\x8b\x5f\x2a\xc3\x34\xc9\x30\x6d\x98\x0b\xb9\xfe\xbd\xa7\xcb\xab\x75\xf8\xfe\xbd\x67\xab\xc3\xc5\x9d\xff\xf4\x23\xb7\x84\xf3\x1f\xec\x09\x50\x7b\x7a\x19\x57\xb7\x0d\x26\x01\x4b\x38\xfe\x31\xc1\x58\x92\x02\x93\x97\x25\xa9\x70\x29\x5a\x98\x0c\x91\x23\x73\x49\x67\x46\xba\x7d\xb8\x9c\x27\x22\xa7\xf1\xe8\x46\xf8\xe8\x46\xf8\xe8\x46\xf8\x15\x78\xe1\x7d\xe3\x6e\x84\x4b\xf9\x11\x92\x15\xd9\x67\xf0\xe5\x63\x2e\x7c\x7e\xe0\xe3\xaf\xce\x85\x8f\x6f\x4f\xa6\x7c\xf8\x76\x1f\x7d\xf8\x1e\x7d\xf8\x1e\x7d\xf8\x1e\x7d\xf8\xfe\x9a\x3e\x7c\xeb\x76\xb0\xfb\x3c\x88\x58\x5f\x99\x0f\xdf\x82\x88\x58\xf4\x46\xf5\x09\xee\xc5\xb6\x7f\x55\x00\x9e\xf9\xe2\x11\x11\xeb\x11\x11\xeb\xd1\x21\xed\x11\x11\xeb\xd1\x1b\xeb\xd1\x1b\xeb\xaf\xee\x8d\xa5\x7a\xdc\xbc\x0e\xb1\xfd\x75\x7a\xdc\x10\xce\xca\x78\xdc\x90\x74\x65\x3d\x6e\x48\xda\xc5\x3d\x6e\x48\xee\xb9\x3c\x6e\xa0\xb8\x45\x3d\x6e\x68\xfd\xd3\x1e\x37\xc4\xd8\xc9\x77\xb6\x21\x5f\x8d\x81\x1d\xfd\xd6\xb0\x88\xf2\xf9\xad\x09\x7f\x3e\xd2\xa7\x8f\xcd\xf9\x3c\x6f\x7e\x21\xf4\x1b\x92\xef\x4d\x23\xfb\xb9\x29\x7d\x6e\x2a\xc7\x26\xe9\xdc\xd3\x46\xf6\xb3\x94\x7b\xda\xfc\xaa\x30\xb7\x26\x47\xdc\xbf\x62\x2e\x64\x2d\xa5\x08\x41\x62\x2e\x4c\x2d\x85\x0b\xea\x20\x21\x98\x08\xc9\xa3\xa1\x1c\x8f\x4f\x79\x92\x69\x6e\x92\x49\x43\x38\x50\x2a\x6d\xdc\xd4\xbe\x9e\xea\x53\x4f\x9b\x7a\x78\x29\x10\x36\x53\x39\x49\x15\xfc\x1a\x4c\x84\x4c\xb4\xc5\x1b\x34\x17\x7b\x89\x66\x83\xca\x9c\xd7\x2f\x32\xc7\xe0\xbc\xa8\xa6\x52\x54\x33\x5d\x54\xb3\x54\x51\xcd\xa4\xa8\x46\x6e\x51\x1f\x95\x5a\x41\xab\x70\xa0\xb4\xa4\x56\xd3\x19\x45\xd1\x6c\xb3\x6a\xf5\x51\xa9\x15\xb4\xb4\x52\x54\xb3\x54\x51\xcd\xa4\xa8\x9c\x5a\xad\xd3\x7f\x67\xd2\x98\x0f\x90\x6d\x99\xa2\x9a\x9f\xad\xa8\x69\x43\x60\xbe\xad\xbd\xa8\x66\x11\xbc\x5c\xde\xe1\x35\x34\x7b\xfe\x81\x35\xf0\x5f\x7c\x48\x0d\xc7\xd3\xb3\x0e\xa6\xe1\x48\x5a\x39\x8c\x5e\x02\xe9\xae\x60\x0a\x4b\x12\x14\x61\xdd\x85\xb8\xf7\x99\xc0\xee\x58\x49\xdf\x0c\xda\x1d\xe3\xb7\x1c\xdc\xdd\x62\x95\x2b\x89\x77\xa7\xdd\x9e\x59\x0c\xf6\xae\xd8\xd7\xdc\x0e\xb1\xbd\x4d\xaa\x52\x0a\xc8\x8e\x24\xfc\x9c\x9e\x79\x0d\xd9\x35\xaf\x91\x99\x7e\xc5\xa7\x66\x66\x0a\x16\x7e\x7b\x8d\xcc\x34\x2c\x3e\x35\xe7\x71\xd9\x93\xd8\x86\x49\x7b\xd5\x5e\x7b\x0d\xc5\xe8\x80\xc9\x7a\xd5\x45\x34\xd3\x45\x7c\x5c\x75\x2d\xa6\x99\x5a\x7c\x5c\x75\x2d\xa6\x99\x5a\xfc\x86\x3a\xac\x4b\x36\x37\x69\xc3\xa5\x79\xa0\x09\x3e\xf2\x04\x1f\x9b\xaa\x57\xa1\xc8\xfc\x84\x36\x3b\xfb\xf5\x51\xbc\x53\x2d\x8c\x59\xfe\x86\x4c\x31\x70\xa7\xc6\x59\x8b\x0a\x95\x17\x92\x79\x9e\xc2\xb8\x2b\xaa\xe4\x0e\x0d\xaf\x12\x89\xfd\x0b\xf9\xd0\x11\x65\x56\x06\xff\x0e\xba\x84\x39\xd2\x29\xfa\x53\x76\x78\x83\x9e\x28\xe5\x61\xa7\x3b\xd6\x58\xc0\xc3\x0e\x0a\x2c\xef\xa4\x46\x16\xb8\x6b\x72\x52\x7b\x4d\xdb\xf1\x4b\x20\xd4\x3d\x3a\xa9\x3d\x3a\xa9\x7d\x7e\x27\xb5\xc6\xb7\xeb\x26\x35\x69\x7e\xbb\xbc\x4f\xbf\xe1\x76\x9f\x7e\xb3\xed\xfe\xe8\x1e\xf8\x15\x78\xd7\x7d\xf3\xee\x81\x8f\x28\x83\xf3\xa1\x0c\x6a\x1d\x12\xeb\xb5\x67\x8a\xdb\x62\xca\x91\x71\xfd\x4e\x8a\xfc\x44\x27\xe5\xa4\xb8\xf7\x35\x39\x29\xae\xc5\x4b\xaf\xbe\x02\x2f\xbd\xfa\x72\x5e\x7a\x8d\x35\x7a\xe9\x35\x56\xe5\xa5\xd7\x58\x81\x97\x5e\x73\x8d\x5e\x7a\xcd\x55\x79\xe9\x35\x57\xe0\xa5\xb7\xbb\x7e\x2f\xbd\xbd\xb5\x3b\x9f\x3d\x9b\xd3\x83\xee\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xbf\xd9\x2d\xec\x6d\x18\x44\x91\xec\x0d\x46\xc6\x2f\xbc\x2c\x73\xc2\xa1\x33\x0d\xd6\xe2\x00\x06\x1c\x15\x38\x7e\xc1\xf7\x19\x0e\x5f\x90\x66\x6e\x47\x2f\xc8\x55\xc6\xc1\x8b\x92\x9f\xd3\xb1\x8b\xd5\x2b\xed\xd0\x75\x6c\xc7\x83\x7c\x87\x2e\xf2\xd5\x98\x58\x68\x6a\x71\x38\x1a\xba\x93\x6a\xa1\x38\x18\x59\xc8\xc3\x7d\xe9\xb0\x85\x55\xb4\xfa\x53\x15\x6d\x01\x82\x4d\xd5\x22\xbf\xe2\x60\x44\x7e\xdf\x54\x13\x64\x93\x2d\x96\x88\xe4\x17\xe9\xa6\xe4\xd7\xa0\xca\x91\x6f\x56\x7e\x4c\xba\xb2\x88\x8c\x1c\x7d\x89\x7d\xcb\x07\x5f\x62\x09\x58\x93\x49\x29\x48\x93\x88\xcf\xa4\x25\xa5\x6f\xd0\x26\xe2\x23\x79\x2a\x3e\x65\xd5\x1d\xb2\xc2\x7c\x51\xda\xa7\x52\x39\x34\xec\x27\x87\x86\x5d\x2c\x10\x51\x20\x02\xd8\xea\x08\x4e\x57\x4d\x10\xfa\x60\xd5\x44\x69\xbf\xad\x9a\x6a\x1c\x8c\x56\x4d\x12\x86\x61\xd9\x43\xcf\x99\xc7\x99\x99\x95\x7d\x16\xa2\x6f\x04\x4a\x63\x4e\x68\x16\xdd\xba\x68\x11\x68\x16\x29\x0c\x69\xb9\x5d\xd8\x99\x07\xa0\x3d\xa2\x1a\x95\x73\xcf\x64\xc8\x39\x2d\x71\x10\x5d\x46\x19\xf2\xd6\x36\xf3\x0f\x20\x41\x11\x17\x1f\x3c\xd6\xe7\x3c\x78\x7c\xcb\x2a\xb0\xc4\x81\xa3\xbe\x77\x4a\x1e\x38\x16\x1e\x14\xea\xb7\x52\x94\x03\xba\xc2\x63\xc2\x12\xf9\x67\x1e\x12\x96\xa0\x31\xfb\x88\xb0\x04\x91\x38\x18\x2d\x49\x81\x48\xd1\x92\x24\x4a\x0d\x8b\x5c\x3a\x74\x73\x7b\xd6\x0e\xef\x84\x6f\xda\xb2\xbf\x50\xf1\x7a\x52\x81\xba\xd4\x2d\x75\xb9\x79\xeb\x2b\xdf\x8b\x15\xc6\x56\x6a\x0f\xf6\x59\xd1\x1e\x2c\x23\x93\xbf\xef\x4a\xec\x86\xae\x1d\xe1\x83\x49\x1c\xe2\xe1\x78\x98\xb7\x83\xb3\xb7\xcf\x94\x05\x49\xfc\xcf\x9c\x8d\x33\x63\xf7\xd9\x9e\x94\x8c\x22\xc1\x63\x9c\x47\xb3\xde\x64\xd5\x21\x46\xf4\x19\x59\xd4\x0d\x71\x3c\x08\x1c\xe4\x46\xc8\x73\xaf\x31\xfa\x74\x59\x1b\xda\x93\x4f\x08\x4f\x7a\x78\x14\xa3\x78\x60\xc7\xc8\x8d\x91\xdd\x23\x8f\x11\xfa\xe4\xb2\x02\x3e\xa1\xdb\x81\xdb\x1b\x20\x97\xd8\xdd\xc8\xf5\x6f\x82\x6b\xec\xc0\x0e\x09\xb6\x7b\x03\xc4\xf6\xf3\x91\xeb\xa3\x4f\x76\x18\xda\xd3\x4f\x28\x0e\xd0\x15\xf6\x21\x37\x8a\x07\x18\xf5\x42\x42\x8b\x58\x56\xdd\x29\x25\x46\x28\x91\x2f\x14\x47\xd0\x8d\x50\x68\xfb\xd7\xd8\xa9\xa1\xb3\x01\x46\xbc\x60\xf2\x9e\x17\x77\xeb\xc6\x03\x14\xf8\x58\x98\xa8\x2d\xc4\x30\x1d\x6b\x1b\x88\xae\x13\xe8\xa2\x1f\x7e\x0e\x31\x11\xe3\xa3\x3e\xba\xa4\x5f\x5c\xb2\x16\xdf\xab\xd5\x6b\x75\x78\xee\xd9\x31\xbe\x0a\xc2\x29\xf8\x86\xc2\x9b\x91\x1d\xda\x43\x74\x07\x70\x64\x0f\x08\xaa\x01\xac\xd0\x5f\x71\xc0\x79\x42\xc1\x0d\x0e\x6b\x72\x16\xee\xd5\xf8\x80\xce\x39\xdf\x9d\xcb\x9a\xeb\x60\x3f\x76\xe3\xe9\x45\xaa\x42\xac\x36\xb0\x92\xa4\xed\x46\x89\x51\xad\x1e\xa1\xbb\xa7\x0f\xe8\x84\xfd\x26\xed\x33\xb4\x27\x2e\x91\x1b\xa8\x2a\x4d\x8a\x27\xf6\x70\xe4\x61\x56\x6b\xc0\xca\x84\x49\x93\x0c\xaa\xf3\x3b\x54\xf5\xab\x2d\xd4\xa0\xb0\x7f\xf0\xbb\x49\xd1\xfe\x20\x35\xf4\xf8\x9b\xa9\xc1\x72\x58\xc2\xe4\x35\x02\x29\xd0\x40\x50\xf3\xdb\x80\xff\x85\x9e\xa2\x9d\x1d\xd4\x79\x29\x91\x62\x84\x76\x76\xa0\x62\x9f\x2e\x61\x96\xc0\x61\x3c\xfd\x94\xd4\x32\x1a\x04\x61\x3c\xb0\x7d\xa7\xa6\x2d\xb3\xea\x57\x73\x69\xef\x24\xab\x7c\x9a\x0b\x3a\xc0\x12\xb4\xa9\x7d\xc2\xf8\xa4\x1f\xc9\xc2\x18\x7e\xb0\xad\x39\x3a\x7b\xbe\x52\xc6\x1d\x27\x23\x8f\x1b\x83\xd3\x04\xd0\x39\x36\xf2\x68\xe6\x96\x14\x12\x63\xe3\x61\x63\x83\x8e\xf7\x1a\x1b\xee\xa8\x43\x79\x23\x96\x72\x4a\x5b\xec\x7f\x4d\x27\x36\xc2\xf1\xf6\xe0\x3f\x63\x3b\xff\x8e\xf7\xde\xf2\x98\x12\xac\x80\xd5\x00\x4a\x30\x62\x8b\x9e\xb8\x08\x3a\xc7\x9e\xed\xfa\xd4\x9e\xcc\xad\xfb\xee\xde\xa2\x17\xb7\x73\xca\x59\xea\x8c\x47\x4f\x72\xd1\x13\x99\xf5\xa3\x8a\x68\xcb\x58\xea\xf0\x67\x65\xa8\x22\xbb\x09\xa9\x0f\x6e\xbe\xec\xef\x2e\x78\x6e\x99\x26\xbf\x14\x2e\x85\x4a\x6a\xd1\x03\xa9\xb5\x9c\xcf\xee\xad\xe0\x7c\x76\x6f\xb9\xf3\xd9\x67\x6b\x3c\x9f\x7d\xb6\xaa\xf3\xd9\x67\x2b\x38\x9f\xdd\x67\xed\x14\x0d\x83\x20\x1e\x14\xa8\xac\xd5\x90\x5f\xa2\xb6\x69\x52\x8b\x62\x84\xac\xef\x3c\xfa\xf9\xaa\xce\xa3\x9f\xaf\xe0\x3c\xfa\xc5\xfa\xcf\xa3\xbf\x5f\x3f\x6a\x4c\x72\x17\xe6\x14\xf7\xe2\xa0\xa8\x0e\x8b\x7a\x4b\x34\x78\x09\x6f\xc7\xe1\x4d\x01\x10\xca\x82\x88\x31\x8d\xa6\xec\x21\x7e\x86\x27\xf9\xea\x72\xff\xc5\x82\x45\xec\xae\x1f\x5b\xa7\xb1\x97\x29\xe3\xbd\x1b\xe5\xd7\xe5\xf9\xa2\x08\x5a\xcf\xe4\x72\xde\x62\x2f\xbf\x2a\x8d\xfa\xa2\x5d\xf2\x19\xe2\x09\x36\xb8\x17\xfc\x71\xe0\xd9\x61\x71\x19\xbb\x8b\xf6\xc9\xfa\xd1\x88\x1a\x9f\x01\x8e\xa8\x59\x67\x65\xbc\x0f\xae\x66\x35\x54\x03\xd0\x88\x1e\x01\x89\x1e\x3d\x4f\x1e\x3d\x4f\x56\xed\x79\xd2\x7c\x74\x3d\x79\x74\x3d\x79\x74\x3d\xf9\xca\x5c\x4f\xa8\xed\x8e\x22\x30\x7f\x23\x14\xf4\x91\x8d\x46\x6e\x16\x9a\x48\x72\x4c\x39\x76\x4b\x45\x02\xd3\xad\x10\xca\xb8\xa5\x34\xe7\xf6\x4b\x39\x76\x8b\x02\x80\x1d\xbb\x49\xd8\x2f\xd0\x4e\x21\xee\x33\xff\x13\x78\x24\x65\x12\x15\x05\xbe\x22\x97\xa1\x88\xad\xa3\xf7\x5f\x39\x76\x45\x60\xb0\x24\xa0\xb0\x87\x7d\x79\x16\x67\x93\x1a\x78\x9e\x90\x7a\xd1\x78\x20\x24\x95\x69\xa1\x4b\x32\xab\xc3\x24\x08\xbf\x7e\x80\xdc\xf4\x01\xa6\x40\x76\x4c\x4a\xb2\x9e\x5f\xb2\x09\x3b\xb1\x0f\xe0\x0d\x3f\x3f\x55\x7c\x68\x42\x00\xb4\x11\x9e\x3d\x06\x54\x08\x5c\x21\x66\x39\xd7\x90\x06\x41\x1d\x52\xb3\x32\x1e\x36\xa4\x01\x4c\xb0\x32\x98\x93\x0d\xc9\x6e\xa1\x73\x42\xec\x82\xcc\xb0\x3d\x3b\x36\x08\xf7\xa6\x69\xb2\x66\xe5\x7f\x6b\x64\x1e\x21\xb2\x73\x87\xdc\xe8\xb5\xef\x0e\xe1\x44\xfb\x47\xd7\x77\xa3\x01\x76\xd8\x50\x42\x0f\x3c\x75\xcf\xee\x0d\xf0\x71\x88\x6f\x88\xfd\xa9\x88\x02\x93\xd6\xa4\xb5\x18\x79\x1c\x9f\x92\x12\x8c\x3b\x34\x0a\xf1\x0d\x5d\xd2\x45\x2d\x21\xdc\x0f\xfc\xe4\x99\x97\xe0\x3a\x65\x04\x59\x67\x07\x9f\x57\x5c\x10\xe4\xb1\xef\xfe\x67\x8c\x0f\x1d\x2a\xc9\xc9\xb9\xf9\xc8\xc5\xdb\x55\x51\xef\x81\xed\x3b\x1e\x16\x35\x3e\x80\xf8\x2e\x8a\x31\x95\x53\x0f\x71\xd6\xae\x6d\x2f\xa2\x55\xc4\xa9\xba\x54\x35\x3c\x1c\x91\xa2\xf3\x3b\x5e\x12\xf6\x1c\x97\x28\x18\x52\x8a\x43\x94\x58\x35\xfd\xea\x7a\xde\x09\xee\x61\xf7\x06\xec\x85\xbc\x00\x73\xb9\xe9\x0d\x1f\x4f\xe2\xe3\x2c\x76\xc8\x0c\x57\x24\x9b\xd7\xff\xd0\x49\x1c\x7c\xa4\x97\x4a\x84\x1d\xd6\xe1\x22\x1d\x7b\xa1\xba\x01\x09\x3e\x6a\x52\xeb\xbe\xee\xc5\xee\x0d\x86\xd9\x4b\xba\xf7\x9e\x49\x20\xbb\x94\x64\x85\xd5\x38\xbf\xd0\x01\x8a\x24\x05\xca\x95\x21\x45\x49\xcf\x33\x28\x73\xd1\x4f\x9c\x57\x90\xde\x17\xec\x0a\xc7\x67\x78\x12\xbf\xf6\x7b\x83\x20\xcf\x25\x4c\x49\x63\x4c\x2c\xd4\x9b\x24\xc5\x13\x8e\x27\xe8\xa5\xf2\x2e\xf1\x64\x83\xe8\x3b\x55\x4d\x25\x27\xe8\x87\x9c\x2c\xd8\x77\xaa\x79\x3e\x37\xd5\xa1\xeb\x38\x1e\xae\xe6\xba\xb6\xb9\x11\x6d\xf8\x43\xdf\xc1\x93\x9c\xea\x28\x69\x0c\x57\x15\x2f\x3b\xf9\xa4\x62\x1a\x48\x1f\x54\xf9\x48\x05\x3c\x4f\x92\xe9\x1c\x8a\xa4\xcf\x35\x97\xfc\xf7\xa8\x4f\x38\x20\x9d\xbb\xdd\xc8\xab\xb5\x0b\x56\x9a\xc2\x40\x4e\xf5\xd9\xfd\x7e\xcf\x1d\x15\x78\x25\xaa\x89\xe6\x04\x44\xe9\xc9\xb1\xca\x7a\x8a\xb7\x5f\x4f\x8e\x56\xd6\x53\x1c\xfe\x86\xf6\xe4\xc4\x76\xdc\x71\x24\xa5\x10\xef\x32\x41\xaf\x5e\xfb\x57\x9e\x12\xdc\x4c\xbc\x94\x93\x66\x47\x63\x92\x23\xf3\x4d\xab\x22\xde\x8d\x43\x16\x85\x4e\x64\xcc\x7c\xd3\x66\x3c\xb0\x23\xd7\xbf\xd2\x65\xa3\x5f\xb4\x99\xde\xe0\x2b\x57\x5b\x14\x7c\x98\xa5\xc3\x9a\xb2\x32\x98\x03\x5a\x23\x73\x8a\x91\x0f\xad\x51\x75\x70\x9f\xab\x69\xf2\x8f\x58\xd6\x65\xc0\x27\xe6\x28\x02\xa1\x6a\x4f\x15\x4e\xfa\xef\x0e\xb9\xdc\x4d\xcc\x75\x64\xc8\x8c\x95\x95\x5b\x8c\x9e\xa1\x3f\x1e\xa8\xd9\x96\x42\xe1\x4e\x79\x42\x08\x43\x67\xb7\xd2\x72\x61\xa5\x92\x71\x7d\xd3\xca\x8a\x6c\x3a\xa9\xc3\xa4\xae\x95\x15\xd2\x74\x52\x18\xf0\x39\x13\x5b\x56\xee\x5a\x28\x5f\xdc\xc8\xbf\xc0\x97\xcd\x0e\xd6\x15\x59\x7b\x24\x9d\xad\x1f\x06\xc3\x56\xa6\x5d\x20\x34\x1d\x8c\xd7\x96\x34\xa0\x53\x89\x1e\xd2\xb4\xe2\x40\x47\x29\x18\xc7\x38\xa4\x7a\x82\xc3\xa2\xd9\x13\xc9\x9d\xb1\x26\x25\xb0\x24\x3d\x73\x7f\x8f\xea\x66\xba\x08\x84\x5c\xdf\x4f\xc8\xd5\xb3\xdf\x13\xc6\xa5\x22\xf8\xcb\x74\x0d\x36\x0a\xea\x23\x2d\x48\x42\xdc\x6f\x9a\x99\xaa\x81\xf3\x4a\xc2\x3b\x19\xe8\x24\xa1\x52\x9f\x0c\x7b\x4a\x05\x44\x16\xe9\x9d\x2e\x0b\x67\x5f\xa4\xe7\x2f\xda\xa9\xc4\x2b\x50\x26\xf3\x9c\xa1\x68\xc1\xc4\xb2\x12\xd0\x9b\xb4\x90\x3a\xd1\xb0\xf7\xd3\x16\x52\x67\x19\xfa\x4f\x91\x98\xc2\xd6\x54\x84\xa1\xb0\x11\x13\x29\x96\x25\xba\x48\x7c\xf2\x64\xc6\x54\x1b\x5d\x96\xa1\x04\x9c\x4f\x87\xc1\xa3\x9b\xe8\xd9\x01\x88\x8f\x0f\x63\x3c\x2c\x9c\xed\x95\x94\x79\xd0\x7c\xc5\x68\x76\xba\xce\x2f\x03\xc0\xb7\x88\x4c\xad\x08\x80\xaf\xd0\x49\x23\x0f\x80\x8f\xba\x81\x69\x01\xf8\x56\x38\xeb\xce\x71\x14\x58\x1e\x74\x0f\x36\xbc\x5a\x08\x02\xc0\xdb\xa1\xec\x8f\x2d\x43\xef\x91\x45\xa7\x47\xe4\x81\x46\x7c\x4c\xb9\x5a\xe7\xca\x59\x39\x19\xcb\xca\x97\x85\x58\x54\xe2\x6f\x52\xcc\x24\xd3\x18\xda\x0c\x75\x68\x75\xda\xa5\x2a\xb3\x80\x00\xf2\x52\xb4\x12\xb8\x82\xc6\x03\xfa\xfa\xf0\xcc\xf0\x69\x76\x70\xe4\x95\x58\x64\xf3\x1d\x55\x17\xe2\xb8\xcd\xc2\x9f\xb4\x3d\xf7\xca\x27\xa5\xbf\xb1\x23\x4c\x44\xbe\x25\xd6\x91\xda\x8b\x41\xfa\xb1\x12\xe3\x89\x82\x50\x69\xa9\x3d\x36\x8f\xc6\xce\xdb\x0b\x91\x93\x64\x37\xaf\xe8\x2e\xe4\xc0\x15\x8b\xb3\x54\x14\xe7\xec\x6a\xa8\x68\x67\x22\x1d\xc8\x3e\x9d\x7b\x73\x13\x3d\x49\x36\xe3\x6a\x9a\x8d\xa5\x99\xd7\x65\x24\xb6\x81\x89\xdd\xdc\x45\x25\x97\x79\x96\xae\x06\xcf\x99\x04\x64\xfa\x4a\x27\x22\xef\xe4\x84\x8e\x1d\xdb\xff\x0f\x4f\xa5\x64\xec\x8d\x9c\x08\xda\x5d\x4d\xc5\x5f\xa9\x01\x94\x5d\xcc\x3d\xf6\x67\xef\xfe\xad\x26\x6e\xb2\x8c\x1b\xd9\x1b\x47\x71\x30\x04\x71\xf8\x2c\x6c\x50\xcd\x90\xc3\xc1\x7b\x76\xee\xf7\x79\xb8\x60\x91\xeb\x12\x4e\x68\x38\x7b\x61\xf7\x52\x81\xd9\xdc\xa4\x3f\x6a\xca\xd7\xfb\x7b\xd4\xac\x2b\xfd\x08\x89\x48\x36\x36\xa6\x6a\x43\x7b\x64\x24\x06\x3a\xf6\xe3\x70\x6a\x21\x37\x1d\xe8\x7f\xe8\x0a\xbb\x99\xa6\x91\x36\x22\xd0\x16\xa2\xaf\xb8\x9d\x07\xf0\xef\x6a\x74\x7e\x1e\x98\xbb\x54\x8b\xe9\x1c\x35\x38\x00\xe9\x88\xbc\x3b\x0b\xde\xda\x61\x8c\x23\xd7\xf6\x69\x43\xd1\xf2\x7b\x13\x8b\x71\xd2\x9b\xf2\x5f\xf2\xb2\x62\x4b\x69\x3a\x4b\x54\xca\x54\x79\xf5\x64\x29\x53\x15\x2a\x1b\x04\x8c\xb8\xaa\x5a\x55\xd8\xa0\x44\x3b\x5a\x19\xe1\x55\xf3\xc1\xd6\x57\x0b\xb9\xca\x95\x4e\xb1\xc5\xd8\x62\x7a\xae\xa6\x6e\x3c\xf2\xf6\xac\x25\x55\x9e\x98\x72\x99\x3c\x41\xba\x6e\x92\xe8\x96\xaf\x5a\x3a\xb0\x63\xba\xca\x94\x03\x92\x2a\xa7\xda\x62\xc4\xcc\xae\xfa\x08\xe2\xb7\xb7\xd0\xf9\x17\x93\x13\x49\x30\x92\x76\xbc\x90\xa6\x3b\xb5\x49\x43\x6c\x7b\xef\x84\xaa\x65\x2a\x36\x49\xb2\xb3\x83\xce\x8e\xde\x1d\xb5\x60\x77\xdf\x8e\xdd\xae\x87\x51\x1c\x20\x2f\xb8\xc5\x21\xba\xc1\x61\xe4\x06\x7e\x54\xd2\xa4\xc9\x73\x37\x36\x4c\x83\x95\x0b\xc8\xee\x0b\x11\xe0\x5a\x3f\x63\x0e\xc9\xb5\xab\x42\xaa\xaa\x64\x17\x95\x59\x7a\x94\x60\xbb\xa8\xd0\x64\x3e\x12\xa5\x6e\x2c\x69\xec\xe6\xed\x8c\xcd\xe7\x59\x59\x68\x89\x21\x74\xc7\xac\x1d\x6a\x33\x55\xd1\x16\x72\xd5\x9d\x91\x64\x26\x27\x9d\x46\x87\xb9\x6e\x89\x9a\xcc\xee\xc9\xf8\x55\xf6\x73\xb2\x79\x93\x7c\x96\xa4\xcf\x4a\xdc\xab\xd5\xba\x97\x9d\x57\x6e\xf9\x74\x05\x31\x1c\xde\x4c\x79\xef\x24\xa3\xca\x92\x7b\xcd\x94\xd6\xef\xc2\x08\x4a\xb0\x95\x3f\x8f\xf1\x3c\x77\x97\xdd\xcd\xb0\x7b\xa3\xaa\xdc\x7f\xf4\x55\x49\x5b\x97\xee\xf3\xcc\x5c\x36\x26\xc9\x1e\xf7\x25\x16\xdc\x97\x28\x53\xe6\xac\x5b\x3b\x85\xc5\x7e\xd1\x2d\x41\xdd\xfa\x8e\xb3\xfa\x99\xb7\x66\xca\x31\x2c\xf7\xce\x8c\xd1\x11\x9d\x82\xcf\x9c\xed\x79\xd3\x12\x83\x44\x4a\x5d\xb0\x3e\xdc\xd5\xad\x0f\xe9\xe9\xe1\x69\x16\xab\x5d\xfa\x90\x39\x56\x2a\x6f\x2f\x7f\xc5\x53\x52\x22\x3e\xca\xce\x6b\xae\xda\xa3\x95\xae\x4a\x89\xcb\x60\x33\xe4\x2c\x79\x28\xd8\x44\xdf\xf5\x62\x1c\x1e\xdc\x60\x3f\x8e\x8e\xfa\x6f\x07\xae\xc7\x3c\x41\x68\x7f\x71\xf8\x75\xd1\xb0\xe9\x6d\x70\x2a\x37\x94\x31\x3a\xa9\xca\xdc\x65\xa7\xc5\xdd\x5a\x46\xb5\xb2\xf7\x99\xb3\xef\x57\x8a\x64\xb4\xe8\xa1\x1f\xe5\x24\x67\x3e\x2b\x23\xd5\xbf\xba\xf1\x40\x6c\x18\x94\x11\x6c\x25\x43\xfa\x48\x9a\xb0\xbe\xa7\x13\x6a\xba\x7a\xdf\xcb\xdd\x57\x48\x3b\x78\xec\x71\x0f\x8f\x72\xe7\xc8\x7b\x25\xcf\x91\xd5\x93\xdd\xbd\x32\x27\xbb\x99\xa3\xe7\xbd\xc5\x8e\x9e\xf7\x4a\x1d\x3d\x4b\xe7\xc8\x7b\xea\x39\x72\xd2\x96\x92\x2b\x14\x6f\x4f\xba\xf5\x23\x7d\x58\xcf\xb9\xf3\x72\x07\xb3\xf2\x48\xe9\xce\x3a\xea\x2c\x79\xbe\x5a\xf2\xc4\xb6\xc4\xf9\x2f\x3b\x20\x45\x71\x0b\xd5\x55\x43\x18\x8e\x3b\xc9\xfb\x86\xfa\x9e\x8e\x26\x70\x0c\x43\x5b\x79\x07\xbc\x25\x8f\x6b\xa5\x95\xa9\xf8\xa9\x1e\x4c\xee\xaa\x8b\x10\x22\x08\x31\x3b\x27\xdc\xad\xc5\xed\x8d\xd4\xb7\x28\xc6\x23\xe6\x66\x77\x7e\xd1\x4e\x7d\xec\xbb\x61\x14\x27\xbb\x2c\xe0\x39\x4b\x7f\x4a\xa1\xd3\x90\xd8\x5a\x0a\xf9\xe6\x0a\xe4\x93\xf6\x56\x94\x52\xf9\x14\xd4\x0f\xc2\x03\xbb\x37\xd0\x4c\x43\xe0\x6a\x93\x52\x98\x5c\xa0\xe1\x66\x40\x22\xd7\x9b\x9b\xf2\xe3\x39\x64\xbd\x68\x67\x73\xda\x8e\xe3\xfa\x57\x9c\x3f\x48\x86\x5e\xa2\x3a\x7a\xc5\x16\xce\x4a\x82\x96\x14\xc2\x8a\x89\x0f\xf8\xde\xe3\x1b\xfd\xa1\x2f\x84\x52\x3a\x1c\x2d\xee\x52\xe8\x50\x00\x23\x3f\xc6\x21\x59\xf1\xc7\x58\x46\x32\x22\xe5\x8a\x4d\x29\xb4\x0d\xf5\x95\x1d\x68\x52\xdb\x56\x68\x1b\xa5\xb7\xb6\xcc\xf4\xb1\x30\xdd\x1f\x8a\x31\x74\xae\x62\x8c\x69\xb6\x4d\x58\xaf\x49\xe7\xa5\xa2\xa7\xb7\x94\x86\x2d\x3a\x3c\x95\xb2\xb0\xd6\x32\x62\x33\x95\x3f\x95\x5d\x5a\x69\x25\x4c\x50\x61\xad\x8d\xc6\xd1\xc0\xa0\x35\xc8\x54\x4e\x92\x43\x9a\x22\xe7\x74\x3c\x13\x7c\x2b\x69\x1b\xe9\x7c\x5d\x6d\x5c\xdd\x61\xbc\xe2\xe0\x94\x6e\xfa\x4c\x15\x60\x67\x5f\x74\x74\x20\x58\x5d\x87\xe4\xd4\x2d\x24\x49\xc5\x0c\x79\x70\xb0\x17\xdb\xc9\x00\x49\x71\x68\x64\xdb\x99\x3a\x40\x7f\x29\x29\x92\xd8\x5d\x4e\x8a\x2e\x67\x8b\xd1\x65\xb1\x1c\x6d\xe4\x96\xb6\x5a\x1b\x7a\xc5\x56\x74\xda\x1d\x0c\x71\x5b\x73\xaf\x96\xbb\x42\x61\x2d\x67\x4a\x99\xcc\xec\xf1\x62\x49\x93\xb2\x8c\x15\xa9\xf5\x65\x7c\x56\xda\x3c\x7c\x36\x9f\x79\xf8\x4c\x77\xaa\x96\x94\x3e\x9f\x41\x95\x7b\x0a\x97\x9d\x4d\xd9\xbd\x01\xb8\xe6\xf3\x44\x2e\xe5\xfe\x1e\x3d\x59\x04\xb3\xc4\xa0\xd3\x06\x23\x63\xf1\x72\x4c\xdd\x4e\x80\x14\xc3\x4a\x6f\xba\xa7\xcf\xff\x72\xf3\x69\xd6\xb2\x2b\x47\xac\xdc\xcf\xed\xfb\x81\xeb\x24\x3d\xb9\x5f\x23\x8f\x45\xa2\xb1\xaf\x13\x8d\x2c\x94\xe4\x7e\x82\x25\x99\x7f\xbe\xb9\x9f\x3d\xdf\x94\xbc\x6a\xf7\xf3\xbd\x6a\xf7\x53\x5e\xb5\x29\x5f\x30\x96\x26\xc7\x91\x29\xe5\x6b\xc6\x12\xe7\xf8\x47\xe5\x0b\xfd\xfe\xac\xa3\x64\x68\x58\x22\x89\x91\x24\x95\x29\xc9\x2d\x05\xde\xa8\x9f\xc2\x74\xe8\x8d\xbd\xb2\xf0\x9a\x73\x90\x2c\x0b\xb0\x59\x9e\xa4\xd4\x2f\x2b\xa7\x2d\x75\x63\x69\x18\xcb\x94\xd7\x00\x3f\xd6\x57\x75\x95\x26\x41\xea\x68\x75\xca\x2f\xca\x15\x05\x22\xd5\x63\x52\x18\xa9\xab\x30\x0a\x80\xe4\x37\xb5\x71\x2e\x35\xc3\xc3\xea\x5d\xa6\xaf\x52\xbe\xd2\xdc\x85\xba\x85\xaa\xe3\xd0\x33\xfe\x06\x18\xc1\xcc\x77\x7a\x0b\x55\xcd\x6a\x6a\xa5\x99\x51\xbd\x86\xb4\xb5\x93\xda\xdc\x27\xb3\x8a\x94\x21\xe5\x8c\x52\xa6\x6e\x5a\x1c\x88\x05\x82\x11\xd2\x9d\x28\xb8\xec\x25\x95\x6b\x3c\xc9\xea\xa6\xfb\x7b\x9d\x20\xcf\x38\x16\xcc\x85\x92\x58\x80\x55\x3e\x37\x30\x6e\x35\x86\x8d\x0a\x60\x7a\xec\xe2\x62\xf8\xd2\xbd\x39\xe1\x4b\x8f\x61\xf0\x2c\x01\x5e\x9a\xb3\x7d\x59\x02\xbd\x74\x6e\x9a\xb4\x75\x0f\x7e\x39\xf8\x70\xa6\x85\x42\x2d\x05\xbe\xa9\x47\x2f\x4a\x22\x4b\x6d\x28\xbb\x5f\x0b\x51\x92\xe0\x40\x0b\xd1\x59\x73\x09\x94\x8a\x31\x35\xab\xf8\xc5\xdb\x80\x86\xc8\xea\x15\x22\xc3\x7e\xdd\xbc\xcb\xeb\xbf\xa5\x3a\x30\x59\x13\x2e\x45\x46\x5e\x38\x2e\x49\x4a\x71\x3d\xff\x56\xfb\x47\xf1\xb4\xff\x56\x2b\xd1\x0b\xc2\xff\x82\xae\x60\x3e\x25\x5f\xa0\x02\xb3\x43\xf9\xad\xa3\xee\x64\xf1\x77\x61\xd6\xdc\xe8\x84\xc2\xf2\xc0\xee\x38\x31\x2f\xff\x7a\x8d\x40\x6a\xce\xdd\x85\xfe\x82\x55\x27\x92\xbf\x50\xb5\x01\x16\xf7\xa8\x5f\x1a\xd9\x30\x13\x43\x18\x8a\x1f\xba\xfe\x2a\xe6\x03\x0f\x5f\x61\xdf\x39\x9b\x16\x87\xb3\x2c\xee\xc2\xf9\x4f\xa7\xbb\x60\x8a\xbd\x3f\xf8\xe7\xc1\x87\x77\x97\x67\x1f\x8f\xa9\x19\x46\xeb\xc5\x6f\xd2\x2d\x55\xb1\x0d\xb1\x93\xf2\x05\xbb\x68\xe0\x3a\x8b\xb5\x2a\x0f\xce\x2c\x7c\xd1\xbe\xc0\xf0\x62\xe1\xaa\x17\x1d\x23\x0b\x65\x64\xe8\xdc\x0b\xe5\x25\x6d\x46\x25\x08\x5a\xed\x4b\x28\x24\x29\xfe\xba\xec\xfb\xbc\x84\x20\xd3\xd8\xe5\xdf\x60\x1f\x48\xbe\x1d\x7f\x2d\xd9\x95\xab\x7f\x48\x3d\xae\xbf\x25\xd3\x6e\x09\xc5\x47\x4b\x35\x59\x98\xed\xcc\x66\xc9\x52\x8a\x30\x7d\xa7\x7c\xa9\x29\x2f\xe3\x81\xb1\x2a\x7a\x07\xcc\x2d\x63\xe1\x79\xf4\xbc\x8a\xed\x08\x57\x2d\x04\x7f\xb7\x5d\x5f\xfc\x0c\xc6\xb1\xf4\x9a\x3f\x46\x23\x62\x02\x91\x5f\xec\xe2\xe5\xec\xf8\xce\xe2\xe2\xc4\xdf\xfa\xfd\xbe\x88\xca\x4c\x9e\x5f\xd4\xc9\xff\xaa\x69\xa3\xa0\x1a\xe2\x5e\x0c\x6f\x59\xf8\x01\xbb\x1b\xf5\xdc\x28\xb2\x51\xd0\x47\xa3\x00\x4e\x32\x7b\x93\x16\xaa\x3e\xab\x7f\x27\x27\x0b\x42\xc7\xf5\x21\x78\x43\x92\x6c\x9a\x4d\x06\x4b\x6d\x7a\xd8\x4e\x52\x52\x57\x0e\x3a\x75\xa7\x16\xe2\x75\x29\x97\xe3\x12\xae\xdc\xc0\x27\x79\x9c\xd0\xbe\x75\xfd\x2b\x3e\xe1\x2b\xcb\xee\xdd\x7d\x39\x1b\x2c\x7e\x51\x48\xcf\x22\x82\xbe\x94\x23\x7b\x3d\x9f\x57\x83\x2c\x35\xb5\x59\x94\x45\x68\xf5\x05\xab\x96\xba\x54\xaf\xa7\x66\x71\xc0\x5e\x13\x96\x81\x88\xa6\x9d\xd8\x72\x90\x41\x33\x76\x4a\xec\xd9\xeb\x2d\x2d\x9f\x6d\xda\x9f\x46\x6c\xc7\xde\xd4\x8d\xa7\xbd\x7a\x3d\x67\x64\x34\x9e\xa5\x3e\x71\x21\x67\xa2\x2a\xaf\x7e\xaa\xe4\x57\x15\xa2\xc4\xf0\x0d\x41\x3b\x8c\xf0\x3b\xf9\xc8\x5e\xf5\x02\xda\xa3\x67\x06\xd4\xc3\x47\x06\x60\x21\xdf\x34\xf0\x2b\x29\x44\x81\x3d\xe9\xac\x9b\x93\x71\xaf\xfc\xc5\xfd\x14\x06\xd0\x5a\x43\x3b\x1e\x9c\x12\x3a\xcc\xe1\x3e\xcf\x37\x21\xe3\x8f\x40\x61\x22\x5c\xdf\x80\x1f\x76\x37\xca\xc9\x6c\x11\xb9\x54\x36\x66\x81\xed\xa7\x12\xb5\xb6\xdc\x8c\x57\x38\x3e\xc1\xb6\x77\xec\xe2\x0c\xd4\x98\x1b\xe3\x61\xd2\x88\x97\xe4\xf1\xef\x23\x36\xde\xc9\x83\x7a\x00\xe9\xd0\xec\x52\x32\xb8\xa6\xc8\x3f\xf7\x06\xae\xe7\x84\x00\x16\x27\x27\xe1\xaf\x45\x23\x8f\xa4\x6b\x74\x9f\xe5\x6e\x5e\x52\x13\xd1\xf0\x3d\xec\x79\xcb\x94\x3b\x60\x0e\xb2\xbe\xf3\xda\xf3\xde\x4c\x89\xb2\x63\x27\x70\xac\xb6\x85\x3b\xcc\x1a\x98\x66\x1d\x76\x20\xb4\x98\xdb\x47\x70\xf5\x06\x6d\x6e\x42\x07\xf0\x90\x29\xec\xb8\x8c\x49\x00\x7c\xd1\xfb\x3b\xab\x8e\x66\xfc\x58\x2a\xeb\x5d\x3c\xb2\xa7\x5e\x60\x3b\xec\x8a\x18\x3f\x76\xb3\xb2\xdd\x25\x5c\x5f\x68\x23\x6e\x6e\xd2\x1f\xcc\x2f\x2d\xfd\xac\xdc\x10\x7d\x48\x00\xd9\x48\xbd\x54\x02\xfa\x9a\xd1\x4f\x6a\xd5\xc8\xbb\x82\x2a\xe9\x99\x26\x99\xf2\x98\x61\x24\xce\x2f\xda\x19\xfd\xf3\x36\xe0\x73\xd1\x51\x9f\x62\x43\xaa\xc3\xc7\x62\xd6\x7a\x32\x8c\x68\x90\x47\xfa\x56\x0e\xf2\xc8\x02\x3c\xb2\x0f\x72\x80\x47\x1e\x58\x92\x7d\x52\x02\x4b\x8a\xa0\x92\xec\x23\x7d\x16\x83\x69\x68\x4f\x8e\x5d\x2c\x0e\xc8\x17\xbd\x89\xd7\xe3\xe3\xe8\x27\x01\x45\x93\xc4\x57\xe4\xf1\xee\x92\xd1\x33\x41\x1d\x1e\xc3\x73\x41\x5d\xd9\x15\x03\x17\x87\x3d\xec\xd3\xcb\x4a\xe9\xe1\x0a\xd7\xff\x18\x0b\xb4\x8d\x76\x50\x33\xe1\x62\x8a\x3a\x2c\xc8\xe8\x7a\x99\x98\x26\x01\xff\x58\x6f\xc8\x6c\xa8\xee\x0c\x6b\xe5\x44\xf6\x91\x50\x7a\xde\x42\x75\xc1\x8f\xea\x31\xb1\x56\x7e\xd2\x20\x46\x12\x3f\x8a\x5c\x3e\x45\xf5\xda\x0b\xc1\xa0\x8c\xaa\x26\x11\x53\x40\x90\x60\x0a\x8c\xfe\x13\xc6\x54\x02\xd1\x53\xd6\xff\x22\x92\xec\x53\x2e\x93\xf4\x02\x73\x32\x86\xef\x38\xf2\x0e\x47\xda\xc9\xc7\xcb\xc9\xc7\xdc\x91\xf7\x91\x12\xbe\x1e\xd2\xd3\x2a\x1c\x72\x46\xd8\xc9\xcc\xab\xc4\xbc\x78\x96\x68\x04\x52\x4b\x66\x74\x3c\xab\x81\xd2\x60\x83\x9b\x8e\x69\xf1\x89\x3e\x8a\x8f\xfe\x61\x8c\x87\x3f\x05\xe3\x08\xbf\xc7\xf6\x0d\x4e\x92\xa5\x3e\x68\x32\x1c\xf8\xc4\xf0\xd4\x64\x80\x0f\xc9\x54\x2c\x6c\x82\x63\x17\xa7\x0c\x05\x6a\x1c\xb4\x99\xaa\x7e\xc2\x93\xde\xdf\x23\xfe\x5b\xaf\xb0\xa9\x87\xf5\xc3\x46\xd6\xa8\x68\x6a\xad\x0a\xf9\x24\x43\x35\x1d\x9a\x35\xf9\x1b\x4f\xaf\x9a\x7a\x72\xea\x62\x8b\x4f\x4e\x99\x76\x75\x4d\xb9\x4e\x2b\x69\x75\x7e\x9b\x12\x5e\x83\x9c\x34\x05\xda\xc0\x4c\xdb\x74\x2a\xf6\xda\x12\xfe\x28\x09\xac\x83\x9c\x4c\xc1\x76\xa0\x17\xfb\x7d\xc5\x54\x24\x16\xa2\x3c\x7e\xd8\xe7\x44\x3f\x8a\x99\x8b\xf5\xaf\x6e\x3e\x53\xe7\x30\x9e\x95\x42\xfe\xaa\xdd\xac\xb5\x59\x05\xd9\xc4\x4c\x37\xee\xf2\x70\xa7\x34\x38\x53\x6c\x12\x06\x07\xf3\x6e\xf4\x2e\x63\x0e\x93\x3a\x26\x05\x8a\xb4\x71\x10\xdb\xde\xb1\x2d\xf7\x99\xa1\xe6\x7f\xd9\x21\x56\x32\x7a\x05\x55\x69\xc1\x7f\xb7\x51\xc3\x44\x4f\x95\xbe\xe6\xf4\x42\x6c\x7b\x67\x84\x26\xa7\xa6\x12\xdb\x86\xfc\x4f\x93\x1e\xd8\xce\x70\x20\x53\xd2\x5c\x31\xdf\xf8\xaa\xee\x8b\xcf\x9c\x14\x34\x51\x25\xb8\x81\x7a\x6b\x87\x6c\x69\xc3\xb0\xc1\xab\x3f\x47\x18\x55\x18\x93\x15\x14\x07\x28\x1a\xe1\x9e\xdb\x9f\x4a\xd1\x22\xc9\x2a\xde\xc5\xd6\xef\x3e\x77\xed\xc1\xf4\xb6\x21\xaa\x70\xde\x2a\xe8\xd6\xf5\x3c\xd4\xc5\xc8\xc1\xa3\x10\xf7\xec\x18\x3b\xc8\xf5\x51\xa3\xd6\xa8\xd5\xab\xcc\x62\xcb\xbd\xe1\xbe\xea\xbb\xed\xff\x1d\x0d\x24\xdf\xc6\x17\xfa\x38\x82\x90\xa6\x7c\x68\x87\xd8\x19\xf7\xb0\x64\x5a\x87\x38\x1a\x7b\x31\xbf\x4a\x27\x01\x8b\xdf\xd8\x5e\x29\x73\x62\x25\x97\xd2\xb9\x3d\x23\x26\x15\xca\x16\xda\xe2\x11\x42\x56\xe2\x7e\x78\x63\x7b\x26\x7a\x05\x35\x6b\xb1\x02\x1f\x64\x4b\x2a\xf1\xa6\xa5\x73\x9a\x74\x3d\xe7\x26\x70\x1d\x76\x81\x86\x42\xde\x0f\xd1\x4b\x54\xe7\xed\x95\x64\xe4\xed\x3c\xeb\x2a\xea\x17\x6c\x61\x5a\xb8\x4f\x5d\xb2\xd6\x59\x3a\x9f\xf7\x90\xab\x94\x3c\xa2\x16\x26\x51\xe1\xeb\xeb\x5b\xb4\x43\x04\x5f\x2e\x36\xc6\xc3\xd1\xa9\x6c\x4a\x48\x5d\x8a\xb8\x67\xbb\x02\x57\x9d\xce\xa0\xde\x59\x5a\x78\x11\xa2\xdb\x35\x92\xa6\x3c\xcd\x8c\x85\x74\x17\x7b\x32\xec\xc9\xf7\x73\x58\x9e\x8d\x54\xfd\x0f\x12\xf3\x28\x95\x7d\x8d\xb5\x31\xc4\x2c\xba\x25\xfa\xfe\x69\x6a\x06\x56\x04\x44\x06\x34\xca\xb0\x29\x57\x43\x01\x33\x62\x39\x1d\x2f\x59\x1c\x1b\x89\x45\x24\x2f\xa5\xd0\x96\x64\x2a\xc9\x6b\x9a\x0c\xbd\x38\x08\xbc\xd8\x1d\x1d\xd3\x9d\x12\x1a\xbc\xd7\x07\x97\x3f\xf2\x5f\x8b\xbb\xf8\xdf\xd8\x9e\x95\xda\x4e\xa1\x01\x7d\x33\x84\x82\xc8\x65\xd7\x69\xd7\x01\xa1\x23\xd5\x0a\xd6\x43\xd2\xe3\xd4\x52\x1a\x47\x01\x58\xe2\x36\x31\xd5\x74\xba\x9d\x22\xda\x6b\x2d\xfe\xc3\x4a\x79\x23\x29\x56\xbb\xd2\x40\x6a\x03\xb6\x52\xcf\x09\x17\x2d\xf1\x4b\xe5\xb3\x95\xe2\x3a\xd5\x8e\xad\xf4\x8b\x64\x17\x8b\x6f\x59\x89\x36\xb0\x14\xd8\x2c\xe8\xb7\xcf\x85\xb8\x92\xb8\x05\xcb\x86\xb2\x2a\xda\x49\x1a\x09\xdb\x57\x92\x75\x2b\x67\xdf\x4e\x7e\x2f\x9f\x25\x7c\x16\xe5\xc4\x9b\x3b\xe3\x05\x4f\x64\x29\x6f\xd3\x4d\xd9\xb7\xcb\xf6\x4f\x94\x8a\x73\x41\x2b\x18\xf8\xc9\xf2\xb7\x95\x59\x29\x2b\x69\x60\xc5\xdb\xca\x2c\x8e\x37\x28\x2f\x3c\xa4\x44\x73\x55\x51\xe9\x59\x08\x95\x54\x94\xe9\xe7\x8f\x51\xa6\xbf\x9a\x28\xd3\x6b\x0b\xae\xac\x2d\x63\x35\xe1\xa5\x97\x0d\xae\xdc\x5c\x4f\xb0\xe1\xe6\x0a\x82\x0d\x37\x97\x0b\x36\xbc\xbb\xc6\x60\xc3\xbb\xab\x0a\x36\xbc\xbb\x82\x60\xc3\x7b\xeb\x0d\x36\x9c\x26\xbf\x82\xf0\xd1\xcb\x05\x1b\x7e\xb6\xc6\x60\xc3\xcf\x56\x15\x6c\xf8\xd9\x0a\x82\x0d\xef\xaf\x3d\x10\xe9\xf3\xf5\x87\x33\x7e\xb1\xfe\xa8\xb0\xdf\x7f\x86\xa0\xb0\xf5\xf5\x47\x6c\x4d\x80\xd2\x8f\x03\x6f\x7a\x55\x30\x0f\x35\x9b\x8b\x56\xa3\xc9\x8b\x78\x17\x14\x44\x19\x5e\x34\xe8\xf3\xee\x67\x08\x5d\xbd\x48\xc4\xe4\xc7\xc8\xb6\x8f\x91\x6d\x1f\x23\xdb\x3e\x46\xb6\x7d\x8c\x6c\xfb\x18\xd9\xf6\xbf\x3e\xb2\xad\xed\xd8\xa1\x2e\x8e\x2d\x19\xc8\xf0\xb1\xcc\xa6\xa2\xce\x30\x5c\x4f\x14\x5b\x60\xa9\x20\x8e\x2d\x7c\x5f\x61\x24\x5b\xa0\xf7\x5f\x1a\xcb\x16\xea\x56\x26\x9a\x2d\x6d\x84\x2f\x1d\xcf\x96\xc2\xc4\xcf\x08\x67\x7b\xcc\xb0\xe4\x69\xe2\x6c\x30\xdb\x85\x83\xcc\xe6\x07\x97\x9d\x59\x08\xec\xc6\x2e\x55\x0c\x6b\x23\x7d\x39\x8a\xa3\x8e\x74\x38\xa8\x9e\x0a\xca\xbb\x98\x44\x48\xe4\x18\x72\xbe\xe2\xd2\x23\x1d\x5c\xc9\x5f\xe4\x33\x2c\xf9\xbd\x71\x29\x63\x41\xe0\x74\xcc\x55\x0d\xaf\xdc\x0b\x69\x16\xaf\xc2\x5b\x29\xcb\x2b\x7c\xd2\xf2\x0a\x5f\x34\xbc\xc2\xfb\x12\xbc\xae\x20\x2c\x30\xd3\x51\xdf\x6c\x60\x60\x36\x76\x44\x32\xfa\x9c\x17\x16\x78\xf1\x28\xbd\x6c\x40\xcf\x0c\xd2\x4b\xe1\x47\xde\x05\xf1\x4c\x30\x75\x96\x26\x0f\x49\x1d\x56\x17\x34\x89\xfe\xa0\x76\x8e\x1d\xca\x52\x30\xeb\x49\x61\xf3\x51\x5e\x15\xd2\x7a\xe1\x4e\xb2\x1e\xf2\x3c\x61\xb9\x08\x6c\x7d\x05\x55\x2c\x0b\x3a\xae\xee\x41\xcc\x11\x0d\x4e\x0b\x71\x1d\x92\xb1\xb9\xed\x04\xb1\x14\xf8\x2d\x8b\x9f\xce\x2a\x35\x03\x90\xed\x5d\x10\x17\xe3\xf2\x91\x04\x99\x69\xab\x38\x90\x95\x13\xc4\x2a\x40\xb9\x13\xc4\x4a\x82\xae\x1d\x95\x8f\x44\xa4\xdb\x4d\x5b\x45\x54\xa6\x77\x41\xfc\x39\x78\x70\x82\xd8\x4c\xb7\x0e\x78\xc3\x40\x93\x96\x8c\x63\xe4\x24\xbc\x6a\xb1\xd0\x69\x8f\x3a\x41\x4c\xa1\xc5\x65\x45\x18\xb6\xd0\xae\x78\x7c\xb0\x92\xb6\xb7\x52\xed\xa0\xc2\x77\xf6\x26\x3c\x3e\x4e\x0a\xca\x8e\xbf\x4e\xc1\xd8\x69\x22\xe2\x78\xba\x4b\x14\x29\xc8\x4c\x6e\x07\xca\x91\x40\xb8\x02\x74\x82\xd8\x12\x35\x5f\x28\x1e\xc7\xec\x31\x5b\x1a\x0c\x6b\x05\x01\x39\xc4\xb0\x55\x03\x72\x90\x17\xec\x61\x16\x7a\x22\xdb\x24\x2d\x19\x70\x20\x93\x5a\x3f\x8c\x85\x3b\x72\x0e\xc2\x26\x8b\x37\x20\x22\x79\x93\x67\x05\x90\x1b\x46\x3b\xff\x4c\x87\xba\x44\x3f\x64\xeb\x2f\x3e\x53\x31\x81\x59\x76\xa2\x02\x36\x54\xa0\x3c\x56\xd0\x12\xb3\x14\xad\x9b\xaa\x8a\x65\x63\xeb\x4e\x84\x79\x12\xa6\xf9\x6a\xe7\xb2\xfc\x5a\xd1\x2b\xf1\xcb\x70\xb6\x74\x4b\xcd\x1d\xfc\x54\xec\xe9\xcf\x9e\xf0\x16\xd4\xc0\x38\x1d\x9b\xa1\x60\x06\x50\xf5\x9b\xea\x10\xa1\x5d\x89\x58\xd9\xe4\xcc\xc7\x42\xbb\x18\x90\x95\xec\x67\x9a\xd4\xd4\x2a\xa9\x12\x20\xe9\xdb\x05\x42\xac\x7c\x8d\x9a\x73\x44\xc5\x49\x51\x9e\xf0\x45\xd1\xa5\xe8\x95\x0c\x7e\xa8\x58\x2f\x34\x34\xc6\x7c\xba\xb6\x7c\x18\x0c\x5d\x06\x5d\x18\x0c\x6d\x6c\x97\x59\xe1\x35\x53\xcb\x99\x5d\xb6\x9e\x29\x07\xf8\xba\xbb\x50\x10\x8c\xdd\x85\x82\x60\xec\x2e\x16\x04\x63\x77\xde\x20\x18\xbb\x45\x41\x30\x8e\x79\x6b\xa5\x20\x9b\x8f\x53\x8b\xc0\xcf\x33\x0c\xf2\xbc\x09\xfe\xfb\x43\x60\xd0\x71\xbb\x7c\x10\x8c\x9c\x2c\xb0\x27\xa5\xcf\x04\x9f\x24\x8d\x2c\x7e\x16\x06\xf5\x97\x63\x67\x34\x8b\x63\x67\x14\x9a\xef\x25\xe2\x59\x30\x11\x65\xe1\x2c\xe8\x93\x88\x66\xa1\x64\x2c\x0e\x45\x71\x29\x23\xf7\xff\x56\x66\x2d\xa3\x71\xb1\x28\x13\x90\x42\x04\x9f\x9c\xe8\x03\x03\xc8\x7c\x7c\x5c\x23\x1f\x22\xf4\xe5\x34\x0b\xf4\xaf\xf3\xa2\xcc\x0d\x4d\x30\x69\xa5\x1a\xcf\x88\xcd\x6c\x2c\x82\x69\x2a\xd5\x47\x23\x36\x53\x89\x1e\xcc\x74\x7c\x80\x4c\xc7\x7f\x86\x4e\x4a\xc7\x08\x4d\x77\x53\x9a\x8d\x35\xf5\x51\x3a\x40\x69\xa6\x97\xe6\xe8\x23\xb2\xa2\x9c\xd1\x41\x53\x35\x49\xa6\x77\xd4\xbe\xc9\x89\xd6\x20\xc7\xdb\xca\x2e\x9a\x44\x0c\x84\xf9\xe3\x1e\x30\x62\x65\xcc\x06\x2d\xf6\x7d\x7e\x58\xac\x94\x3d\xb0\x37\x97\x3d\xa0\x09\x8a\xb5\xe8\x0c\x9a\x1b\xf3\x60\x94\xe8\x37\xaa\x29\xd3\x11\x0f\x58\x09\x4b\x06\x3c\xa0\x54\x2c\x56\xc8\xac\x70\x07\x7a\x13\x2d\xcf\x3a\xce\x66\xcc\x2e\xa5\x57\x1e\xee\x20\x3f\xd4\x85\x12\xee\xe0\x59\x26\xdc\x41\x36\x92\xc1\x33\x7d\x24\x83\x94\xe8\x3c\x9b\x4b\x74\xb4\x01\x33\xb4\xb1\x03\x46\x49\xff\x2a\x12\xf0\x35\x62\xdb\xeb\x5d\x20\x15\x6c\x7b\x30\x65\x16\x44\xb7\xff\x1a\x16\x53\x7a\x78\xfb\xac\x88\x1b\x5f\x3b\x50\x3b\x1b\x78\x1a\x0d\xac\x02\xb4\xc3\x01\x56\x31\x44\x7b\x73\x4e\x88\xf6\x13\x26\x03\x4b\x80\xb4\xeb\xd7\xfd\x25\x30\xda\x4b\xc3\xaa\xeb\xfd\xb4\x15\x58\xf5\x12\x48\xc3\xb9\x54\x4a\xe1\xe9\xe5\xe6\x9e\x8d\xa7\x37\x8b\xfd\x45\xb2\x6a\x91\x86\x01\x28\xed\xf5\xc4\x8d\x8a\xb1\xe5\xd7\xd4\x10\x4b\xd4\x86\xb6\x21\x45\x47\xa4\x68\x6a\xdf\x76\x2d\x36\x92\x9d\xab\x05\xe8\xcc\x86\x59\xcc\xe7\x5e\x42\x19\x2d\x04\x97\x9c\x25\xce\x40\x61\xb1\xe1\x24\x53\x28\x8e\x51\x50\x8e\xc4\xf2\x5c\xd8\xb3\xa0\x90\x4b\x51\x09\x67\xe2\xb5\x96\x22\xc3\x0c\xa7\x25\xa9\x88\x5b\x81\x8b\x0c\x10\x58\x22\xc1\x05\x39\x1a\xd0\x60\x16\x10\xeb\x9a\x86\x5a\x09\x30\xd9\x19\xfa\x2f\x41\x53\x7d\x17\xc4\x5f\xa0\x06\xb3\xa1\x64\xd7\x56\xf9\x85\x32\x26\x10\xbc\x3b\x3b\xe8\x76\x80\xc1\xa7\x73\x60\xdf\x60\xd8\x65\x76\x7d\x34\x0a\xbc\x29\xf2\x5c\x1f\x6f\xc0\xc6\xf3\x63\x93\xce\xd1\xa4\x33\x91\xa5\xbf\xd2\x61\xb4\x50\xc6\x25\xba\x49\x6a\xb1\x52\xf0\xf2\xc5\xcd\x36\xf7\x81\x54\x01\xba\xfc\x2c\x48\xf6\xc2\x2a\xc1\xac\xaf\x1e\xc1\x2d\xda\x21\x1b\xe9\xc3\xb9\xa5\x08\xbd\xf5\xdc\xde\xf5\x52\x34\xe6\x82\x6b\x9e\xd1\x48\xa5\x23\x20\x95\x98\x06\xcb\x03\x3f\xcf\x43\xac\x0c\xf0\xf3\x3c\xf4\x66\x03\x3f\xcf\x90\xf0\x79\x81\x9f\x4b\xc3\x3d\x2b\xeb\x85\x7a\xd6\xf8\xae\x6b\xd0\x88\xa5\xe9\x96\xe3\x15\xc3\x44\x21\x12\xe8\xe1\xa1\x17\x42\x2d\xd6\x0f\xe0\x72\xa0\xc5\x0b\x42\x16\xcf\x83\x00\xb8\x9b\x20\x00\x26\xed\x26\xc2\x94\x27\xaf\xf8\xee\x83\x68\x6e\x91\x46\xbc\x11\xc0\x73\x74\x75\x2e\x0a\xa4\xc9\x94\xb7\x1a\x8c\x3a\x9a\x88\x63\x91\x49\x18\x9e\x82\xbe\x14\xbd\x13\x60\x35\xa5\x0f\x09\x00\x9d\xd8\x45\x53\xca\x9b\xe1\xce\x35\x17\xb8\x90\xee\xfa\x65\x39\x7c\x8d\x84\x61\x0e\xc2\x27\x60\x86\x18\xb6\xd2\x78\xdd\x2c\x38\x69\x64\x25\x11\x36\x5d\x69\xd0\xa8\x67\x7b\xd8\xf0\xe9\x76\x1a\x42\xb2\x7c\xa0\x8e\x24\x28\x2c\x21\x70\xce\x37\xde\x74\x07\x09\x33\xab\xa4\xbb\x37\x3b\x03\x38\x06\xd0\x33\x2d\xc6\x0c\x6b\x5c\xc9\xf3\x42\x8f\x79\x03\xd7\x67\x52\xd8\x9b\x7c\x4d\xa4\x50\x6a\xd1\x3f\x09\xf8\x62\xc6\x67\x8e\xa1\x84\x98\x2a\xb0\x67\xda\xdd\x67\x0d\xe8\x1d\xe2\xda\x48\x0a\xbf\xe3\xc5\x23\x7e\xc7\x23\x7e\xc7\x17\xc5\xef\x10\xa4\xe0\x8e\x52\x7e\xdd\x5f\xac\xaa\x80\xa5\x20\x3d\xd2\xc4\x16\xc5\xdf\x58\x0b\x6a\xc9\xee\x0a\x50\x4b\x76\x97\x43\x2d\xd9\x5b\x23\x6a\xc9\xde\xaa\x50\x4b\xf6\x56\x80\x5a\xf2\x17\x42\xf1\x58\x2b\x3c\x4b\x9a\xfc\x12\xb5\x4d\x93\x5a\x18\x53\x84\x7a\xbc\xd2\xe0\xcc\x05\x80\x22\x0b\x8a\xf1\x8b\xf5\xa3\x4c\x7c\xbf\x7e\xd0\x12\x61\x4f\xae\x11\x7b\xa5\xd1\x58\x00\x2c\x63\x41\x58\x91\x74\xdc\x8a\xbc\xaa\xd4\x17\x6d\xaf\xdd\xb5\xa3\xe1\x34\xf6\xe6\x04\x79\x79\x04\x16\x79\x04\x16\x79\x04\x16\x59\x33\xb0\x08\xdd\x30\xfe\xd5\x8d\x07\xc1\x38\x96\xca\x0d\xba\x7f\x80\xd8\x46\x5c\x1a\x68\x8b\xa2\x0e\xba\x7b\x68\xcb\x72\xe4\xfa\x28\xe8\xfe\xc1\x5b\x84\xe4\xa8\x81\x6f\xe9\x51\xdf\x70\x4d\xf4\xb2\x83\xea\x26\x22\x13\x8a\xeb\xf3\x4e\x7e\x52\x6a\xe8\x00\x03\xae\x29\x67\x66\xa3\xc7\x25\x63\x27\xe8\xfe\x01\xd2\x98\x1d\x32\x8f\xb0\x29\x8f\xb0\x29\x8f\xb0\x29\x5f\x19\x6c\x0a\x58\x60\xc8\x46\x57\x61\x30\x1e\xa1\xa0\x0f\x3b\x53\xb6\x87\xba\x5a\x34\x15\x06\xa6\xe2\xda\xde\x9b\x72\x80\x2a\x5a\x73\x6f\x6d\x88\x2a\x94\xaf\x62\x54\x15\x9a\x66\xb5\xc8\x2a\x94\xe6\x7f\x2f\xba\x0a\xad\x5f\x49\x84\x15\xd6\x18\x4b\xa3\xac\x6c\x64\xfc\x50\x53\x38\x22\xb4\xb6\xb3\xf1\x56\x1c\x3b\xb6\x67\xa0\xad\xbc\x83\xe8\xe3\x10\x56\xee\xbf\x17\x69\x65\x35\x88\x20\x7c\x8c\x7d\xb3\xa8\x20\x3c\x6a\x63\x12\xb0\x71\xf5\x88\x20\x8e\x7c\x57\x20\x17\x0f\xe4\x0a\xc7\x49\x50\x9d\x9c\x96\x52\xd2\x68\xbd\xc5\x0b\xae\x6d\x2b\x91\xa1\x72\x83\x42\xa1\x54\x60\xa8\x54\x4c\x28\xc5\x99\xba\x74\x40\x50\xcd\xb2\x75\xde\x80\xa0\xbc\xcc\x65\x83\x82\x4a\xda\x50\x13\x18\x34\xa7\x6f\xa8\x07\x32\xdd\xcb\x81\xc0\xdb\x85\x6e\xfc\x52\x3a\x7e\x81\x5c\x03\xd9\x12\x25\xa9\xe6\x85\x6d\xc9\x6c\xd1\x96\xb9\x0d\xaf\x96\x37\x1f\x71\xdd\x9d\xf8\x35\x00\xb7\xcc\x62\x9a\xfa\x67\xce\x80\x6e\x59\xaa\x9e\x25\x6f\xb4\x67\xb6\xf7\xb4\xf7\xd9\x53\x8c\xa6\xa5\x2f\xe1\xb3\x94\xdc\x45\x25\x41\x1e\x32\xa9\x0d\x16\x1b\xa0\x2c\x58\xcb\xac\x9b\xc7\x2a\xfe\xc3\x6e\x16\xff\x41\x0a\x50\x2f\xdf\xce\x4d\xde\x66\x13\x43\x38\xf7\x4c\x62\x78\xab\x5c\x69\x49\x45\xc3\x63\xa9\x75\x81\xf0\xc8\xbf\x80\x2c\x1f\x20\x61\xde\xfa\x99\x51\xb0\xd0\x79\x35\xa2\xe3\x1a\x55\x25\x46\x93\x47\x60\x85\x3c\xca\x65\x55\x2f\xcc\xc5\x51\x6c\x74\xdb\xab\x25\x2f\xfc\xd3\x7a\x65\xf5\x19\xed\xe7\x92\x08\x32\xa3\x0c\x7c\x8c\x8a\x05\x73\x97\xd3\xee\x6a\x04\x93\xe4\x06\x9c\xb8\xb4\xb7\x60\xcd\xfb\x69\xe4\x86\xe8\xa8\xff\x76\xe0\x7a\x0e\x5b\x11\x50\x40\x98\x91\x12\x63\xd7\x4d\x01\x1e\xd0\x51\x43\xdb\x21\x0b\x7c\x93\x87\x24\xe0\xda\xde\x76\xd7\x0e\xb7\x69\xbe\x6a\x52\xa5\x59\xb8\x34\xb2\xa2\x77\x61\x91\x2d\x4b\xf3\x2b\x65\x20\xb4\x90\x5e\x6f\xce\xba\x30\xc6\x86\x73\x79\xd4\x01\x5d\x86\x39\x51\x07\xf2\x6f\x19\x2a\xe6\xd2\x9e\x12\xe0\x1a\xcd\x7b\xc3\xb0\x04\xe2\xc0\xde\x42\x88\x03\x7b\x8b\x21\x0e\xec\xcd\x8b\x38\xb0\x57\x84\x38\xc0\x16\x1e\xa9\xdb\x92\xef\x14\x03\x73\xe6\x3d\xb1\xd9\x73\x54\x89\x7b\x62\x79\x87\x63\x7f\x09\xb4\x01\xba\x40\x29\x89\x38\x30\x0b\x3e\x60\x01\xa0\x02\x49\x3f\x8a\x9f\xab\x42\x1c\x28\x1d\xd6\x5c\x95\x4c\x86\x37\xf0\x8e\x85\x4d\xe7\xbf\x17\xc1\x1a\x90\x6f\x5a\x2b\xe1\xd5\x16\x5c\x12\xcc\xbe\xec\xaf\x06\x4c\x8d\xc3\x69\x4d\xb3\x4e\xc8\x63\x51\x8a\xe8\xb6\x36\x06\x45\xf0\x5c\xc6\x1e\x7f\x5e\x12\x9b\x40\x8e\x85\xa5\x6f\x75\x2d\x58\x41\x12\x1e\x4b\xd7\x0e\x65\x90\x0b\xd2\xed\x29\xad\x0d\xd5\x0a\x66\x0b\x57\x56\x9c\xe9\xce\x6a\x17\x63\x22\xac\xa9\x8b\x74\xf1\x76\xe7\xc1\x23\xc8\x69\x50\x23\x36\xcb\x01\x0b\xac\x42\xd3\xa3\x42\x6d\xaf\x73\x0c\x28\xbc\x14\x4c\xfe\xf9\x63\xcf\x53\xdf\x28\x10\x08\x9a\x25\x05\x87\x40\x90\x32\x2d\x00\x87\xc0\x08\x97\xb1\x67\xe6\xbc\x1b\xaf\x18\x2a\xcf\xe6\x30\x54\xb4\xf7\xd9\x93\x72\xcb\x4e\xed\xb9\x30\x08\x0e\x53\xbb\x4e\x12\x3b\x3a\x81\x40\x10\x31\xc4\x97\x00\x40\x00\x2f\x67\x20\x3f\x0b\xfc\x40\x6f\x29\x96\x00\x3f\xc8\xca\x83\xb4\xc5\x95\xdb\xd9\x6f\xec\xde\xf5\x55\x18\x8c\x7d\xa7\xb0\xbf\x93\x64\x05\x0b\xd7\x3d\x9d\xf1\x9a\x5a\x1d\x4a\x70\xa3\xf2\x97\xd4\x8a\x8d\x17\xf6\x39\xd6\x6d\x12\x47\x49\xc1\x4b\x2c\xe3\x76\x76\x10\x8e\x3c\xd7\x8f\xb7\x1d\x37\xb2\xbb\x1e\xde\xf6\xf1\x24\xde\xf6\x5c\x1f\x23\x3f\xd8\x1e\xfb\xe3\x08\x3b\xdb\x37\x76\x18\x29\x2b\x3f\xee\xee\x4d\x55\x32\xf5\x4d\x56\x06\x7f\xc2\x9c\x48\x95\xbc\xb2\x52\xca\x32\x8a\x8b\x16\xd8\x8c\xed\x73\x16\x8e\xda\x42\xd5\x84\x92\xbc\x7c\x66\x71\xf4\xa5\x66\x51\x26\x41\x0d\x2e\x84\x02\xab\xa3\x5f\xd0\xce\xbd\x82\x25\xb5\x51\x67\xdf\xbe\xeb\x79\x2d\x54\xfd\x1b\xc6\xb8\x2a\xa7\x94\xda\x23\x2d\x44\x6b\x5d\x01\xef\xcd\x58\x01\xeb\x70\x57\x97\x5b\x15\x27\xb5\x2b\xbf\x40\xde\xd3\x2c\x90\xe5\x16\x9b\x73\x0d\x3c\x3f\x68\xca\x7e\x39\xd0\x94\xfd\x0c\x68\x8a\x32\x6f\xec\x67\xe6\x8d\x2c\xa6\xca\xbe\x1e\x53\x45\x19\x42\x3c\xa5\x7e\x10\xe5\xcf\x45\xfb\xa5\xb1\x55\x1c\x3e\x71\x48\xd3\xca\x37\x8a\xab\x62\x87\xd8\x5e\x10\x56\x65\x25\xcb\xe5\xb9\x0d\xa8\x12\xa8\x2a\x92\x34\x14\xc2\xa2\xcc\x65\x05\xae\xd4\x06\xcc\xc7\xd9\xcc\xea\x81\x6a\x6a\x0d\x9e\x18\x06\xd2\xdc\xed\x28\xd6\xa1\xb4\x34\xf9\x36\x6b\xcf\x26\xe5\xfc\xaa\x73\x33\x35\xb7\xde\xab\xc3\xce\xc9\x73\x68\x2d\x89\x9d\x93\x0f\x19\xac\x28\xba\xa0\x77\xfd\xab\x1b\x71\x6c\xdb\xf4\xc9\xe3\x0f\xa8\x2e\x4d\x03\xcc\xde\xd4\x58\xfd\x19\x08\x1e\xba\x21\x53\x0c\xc3\xb3\x3b\x3f\x0c\x0f\x25\xbb\x1c\x14\x8f\x7e\x56\x5e\x25\x14\x8f\xfe\xf2\x81\x02\xc5\x53\x12\x85\x26\x97\x52\xa9\xdb\xf0\xb3\xf8\x58\xa4\xe0\x45\x50\x68\xbe\xee\x5a\xcc\x44\xf6\x58\x13\xfb\xb3\x60\x05\x72\x33\x32\x2c\x03\x19\xd9\xe3\xf4\x0b\xd5\x61\x36\xc2\xc1\x67\xa9\xfe\x21\x35\x87\x17\x16\x84\x92\xe0\x58\x5f\xab\x1c\x2f\xdc\xfe\x29\x70\xac\x8d\xf4\x02\xea\xb3\x37\xc5\x12\xf5\xa1\xad\x48\xa5\x62\xe8\xfa\x00\x10\x79\xea\xfe\xb9\xd8\xa8\x48\xc4\x62\x68\x4f\xde\xd8\xe1\x0a\x08\x39\xe0\x6e\xb6\x00\x89\xd9\x48\x57\xf9\x6d\x22\x21\x5d\x15\xa3\x4c\x95\xa8\xc0\x2c\x94\xa9\x52\x24\x5c\x7f\x39\xf1\x92\x69\x05\xe3\x78\x65\xb4\x66\x02\x4e\xe5\x52\x81\x9c\x09\x4e\x54\x39\xb8\x96\xe2\xe1\x33\xf7\x96\x42\x01\x5c\xcb\x4c\xc0\x9d\x35\x8d\x64\x00\x32\xf9\x12\xf3\xc2\x42\x79\xe9\x3c\x46\x5b\x2c\x59\x01\xfd\x25\x9a\x6d\x89\x29\x5c\x99\x89\x67\xe1\x02\x15\x57\x79\x1e\x5c\xa0\xe2\x36\x98\x03\x17\xa8\x04\xa1\x99\xb8\x40\x33\x68\xcc\x0b\x0c\x34\xa3\x95\xe6\x81\xf3\x29\xa1\xf7\xe6\x82\xf3\x99\x87\xde\x6c\x38\x9f\x19\x1a\x70\x41\x38\x1f\x0b\x55\xa3\x11\xb1\x03\x56\x05\xec\xa3\x5a\x12\x3a\xac\x1f\x3d\x94\x0f\x9d\xed\xcf\x2f\x16\x86\xf5\xd1\x2b\xfa\xaf\x11\xd6\xc7\x65\x11\xf4\x00\x60\x87\x3c\x08\x4c\x13\xbe\x53\x0f\x5f\x94\x2d\xda\x52\x50\x40\xc9\x9b\x33\xb7\x77\xad\x4b\x09\xef\xe7\x40\x0e\x12\x2f\x54\x82\xea\xeb\xd5\xc1\x0c\xf1\xcf\x51\x6c\xf7\xae\x53\x74\xa4\x77\x3c\x59\xd7\x0e\x8f\x83\xc8\xe5\x4e\x4e\x90\x4c\x7a\x97\x24\xf3\x1d\x22\x8e\x52\x1a\xfa\x42\xe6\x06\x1c\x06\x84\xbb\xa5\x60\x2a\x79\x2d\x01\x1a\x95\x3a\x0f\xd3\x5e\x18\x4e\x0e\x33\x7c\x87\xb3\x79\xd4\x7f\x63\x33\xe1\x94\x99\x07\x31\x81\x2d\x23\x38\x01\x1a\x05\xe2\xbc\x8f\x6d\x1a\x9d\x5f\x88\xeb\x07\xf3\x42\x33\x89\xbd\xe9\x60\x1c\xf3\xdb\xb1\x35\xfa\xc8\x3f\x5e\x92\xe2\xff\xce\x25\x92\x3c\xa8\x02\xd9\x1b\xb8\x9e\x13\xc2\xd5\x1d\x29\x69\x8d\xbf\xe6\xc9\x64\x75\x90\x4a\x2a\x7f\x12\x8d\x0b\x97\xc6\xdc\x1e\x93\x4a\xce\x61\xa7\xc3\x9d\x96\xaa\xe8\x95\x24\xb7\x2d\x49\xe4\x39\xe3\x5c\x4e\x82\xa1\x0d\x1e\x73\xb2\x2c\xbd\x92\xe9\x53\xa8\xa4\x9a\x03\x09\x0d\x1e\xf4\x88\x93\xe9\xda\x11\xfe\xa5\x34\xfe\x93\xbe\xaf\xff\xe0\x87\x9f\x6f\x38\x31\xa9\xaf\xef\x68\xb3\xb7\x78\x08\x4b\x89\xb3\x96\xd2\x0c\xf4\x18\x08\xba\x18\x7b\xde\x12\x67\xb1\x03\x21\x7a\xaf\x3d\xef\xcd\x94\x68\x60\x86\xdc\xc4\x3b\x6d\xce\x6b\xfc\xba\x2b\x6a\xa2\x1b\xe8\xbe\x6f\x49\xdc\x2f\xd9\x2f\x4b\x3e\x8a\xa5\xee\xff\xc9\x66\xb1\xb4\x1a\xd2\x7c\x95\xd6\x37\x9a\xaf\x8a\xdb\x4d\xfa\xa3\xe4\xbe\x93\xfe\x94\x98\xb7\x74\x2f\x3b\x7d\x2b\x81\xdd\x82\xe6\x42\x26\x1f\xbb\x2d\x27\x3e\x6f\xa0\x71\xe3\x70\xec\xf7\xec\x18\xbf\x99\x32\x91\xe6\x0e\x3b\xbc\xc0\xf3\x94\xfa\xda\xa2\xcd\x79\x61\xa9\x43\x81\xef\x3e\xab\xf7\x02\x96\xe5\x71\x0e\x88\x33\x53\x0e\x69\x58\xe0\xc9\x91\x0f\x2a\x64\x98\x0c\xd8\x4c\xf5\xd9\xa6\x35\x38\x17\x23\x96\xc1\x8b\x5d\xa4\xaf\x16\x89\xde\xd2\xa8\x95\x84\xa2\x2a\x62\x8b\xb6\x8b\xf0\x7b\x78\x6b\xc7\xf8\x6d\x10\x84\x8e\xeb\xdb\xb1\x32\xfe\x45\x0d\x6c\x18\xf2\xd9\xe9\x1c\xa1\x98\x4c\xaf\xad\xf4\xbc\x2e\x8b\x26\x9d\xc8\x5a\x28\x3d\xa5\x21\x14\xf4\xfb\x11\x8e\x5b\x64\xba\xaa\xd1\xdf\xb2\xb4\xc7\x21\x8f\x4f\x2a\x0f\x2e\x7a\x46\x4e\xfe\xa4\x8e\xa0\x95\x01\x92\x46\xa5\x83\xd6\x3e\x6f\x5c\x88\xb4\xca\x48\xd3\xa7\xae\x27\xa9\xd5\x51\x2b\x37\xff\x16\x30\x1f\xc1\xfc\xc0\x3b\x3b\x75\xd3\x49\x7b\xaf\x49\xb9\x2e\x24\xae\x40\xc9\xf3\x8d\x89\x5e\xa2\x3a\xda\xdc\x44\xe2\x6b\x42\xd5\x44\x3f\x20\x7d\xa6\x4c\xb0\x59\x92\x67\xb5\x17\xbd\xa4\xca\xdd\xdf\x23\x95\xe5\xa7\xb9\x95\xd9\xd6\xd6\x43\xf6\x42\x10\xed\xb4\xd5\xa1\x6c\xab\x83\x43\xab\xe5\xee\x34\x2a\xb0\x95\x89\x7d\x2b\x03\xf7\x29\x9b\x55\xd2\x83\xa5\x6e\x3d\x49\x0f\x96\xe2\xc1\x49\x0d\x83\xe2\xcb\x77\x3c\x15\x7f\xce\x38\xd7\x3d\x68\x15\x9d\x3a\xac\xf5\x80\x89\xf9\x52\x99\x93\x3e\x4f\xe6\x3f\x9f\xd6\xc8\x58\xec\x42\x69\xe8\x6d\xf4\x2f\xa5\x33\xa4\xe6\x29\x18\xd5\xa2\xbd\xe5\xd6\xdf\x96\xfb\x6e\xe1\xa1\x4d\xb3\x97\x1f\xdb\x97\xeb\x1a\xdc\xac\x56\x4b\x8c\x6e\x56\x15\xc9\xaf\x54\x6e\xae\xad\x0e\xe3\x5d\x3b\xfd\x15\x38\xf1\xa6\x35\x40\x72\xf0\xad\x62\x6d\x5a\xb2\xe9\xd0\x4a\xd9\xd7\x74\x36\x66\xc8\x9e\xe7\x0d\xe1\x4d\xb0\x6a\x4d\xa1\x73\x58\x6e\x21\x45\x27\x3c\x58\xcc\x60\xde\xdc\xa4\x3f\x98\x27\x7f\xfa\x59\x8a\x7b\x9e\xc6\x0e\xa5\x9b\x12\xcc\x94\xb5\xd8\x72\xa4\xc5\x97\x25\x6b\x82\x12\x4d\x70\x12\x52\x70\xa2\xdf\x7f\x85\x70\xa2\xa1\xed\x5f\xe1\x7c\x30\xd1\xfa\x82\x30\x6e\x69\xfa\xab\xc0\x12\x65\xa4\x1e\x91\x44\x17\x02\xfa\x5c\x0b\xa6\x66\x26\xde\xd7\x42\xb0\xa1\x4b\x61\x6a\xee\xae\x11\x53\x53\x8f\xc0\xbe\x10\x6e\xe8\xf2\x98\x9a\x7b\x6b\xc4\xd4\xdc\x5b\x15\xa6\xe6\xde\x0a\x30\x35\x9f\x5d\x3a\xbb\x97\x60\xa5\xe5\xe3\x69\x3e\x5b\x10\xf0\x76\x7f\x4e\x10\xc0\xc5\x20\x32\xd7\x0d\xfd\xf8\x79\x40\x32\x93\xdd\xa2\x33\x3c\xc9\x57\x1d\xfb\x2f\x28\x58\xe2\x23\x56\xe2\x23\x56\xe2\x23\x56\xe2\x4a\xb1\x12\x15\xa8\xc4\x54\xb3\x71\x84\x44\xb6\x59\x26\x21\x20\x4a\x98\x88\xfa\x16\x4f\xb2\xde\xa5\x80\xfc\x65\xcc\xb7\x3c\x88\xb7\x34\x0c\x1c\x00\xbe\xf1\xc5\x3a\x00\x23\xb2\x31\x03\x34\x25\x74\xbf\xa0\xfb\xc7\x23\x3e\xe2\x23\x3e\xe2\x23\x3e\xe2\x57\x87\x8f\xf8\x26\x1c\x47\x83\x14\x10\x22\xd1\x4a\xf0\xbe\xcc\x16\x8a\xce\xe6\x29\x83\x7f\x38\x37\xfc\x21\x70\x54\x00\x7d\x08\xdf\x0d\x05\x95\x4a\x8f\x67\x08\x09\x4d\x05\x0f\xb1\x2c\x62\x20\x64\x2d\x03\x13\x48\xcb\xa0\x10\x81\x2c\x33\xe5\x8c\x97\x2b\xa3\xe2\xbd\x0b\xed\x2b\xa5\x11\xb0\x74\xa4\xd1\x67\x88\x86\x35\x0f\xdb\x37\xf8\xcc\x1d\xe2\x50\xde\xef\xea\x79\xd8\x0e\xc9\xdb\x60\x1c\x67\x13\x26\xdb\x4c\xe9\x4f\xa8\xa3\xbf\x39\x95\x94\xc7\x2f\x49\x9d\x85\xf6\x0d\xf6\x3c\x1c\xfe\x14\xdc\xb8\xfe\x95\x5c\xb8\x5c\x09\x39\x19\x36\xb0\x16\x45\x4b\xa1\x7b\xea\xb9\x0e\x2e\xa6\x09\x49\x48\xeb\xc8\xf4\x36\xd8\x46\x71\xa6\x19\xcf\x82\x71\x6f\x40\x4a\x2f\x6a\x4b\x5c\xeb\x0d\x6c\xff\x0a\x3b\x90\x1a\x13\x3d\x45\x35\xcd\xe6\x26\x4a\x7f\xe3\x77\x99\x5f\xa2\x7a\x1e\x87\x94\xb9\x54\x3e\x79\x2f\x3a\x9f\x5d\x92\xb5\x3c\xd6\x62\xb2\x6b\x9b\xee\x10\xc9\x3d\x87\xa7\x90\x9a\x56\x86\x92\x94\xae\x25\x6a\xf8\x01\x0f\xb2\x5f\x43\x7b\x34\x02\xe9\xd0\x31\x35\x53\x38\x60\x23\xad\x7c\x2f\x2b\xe2\x18\xe1\x58\x95\x63\xa5\x99\x2c\xd4\xa8\xd7\xeb\x25\x9a\x15\x3c\xea\xa0\xd4\xa3\x50\x70\xb7\x40\x23\xe3\x49\xcc\x1d\x98\x88\xf6\x2e\xdb\x80\xab\x2d\xb9\x6c\xdf\x89\x81\x92\xc5\xd5\xc4\xea\x5d\x52\x7c\x83\x7d\x92\x20\x33\x0e\x0a\xe4\xff\x55\xe6\xcb\x79\xfd\x02\xb5\x50\x72\x58\xb7\x3a\x69\xe5\x21\xe4\xe8\xbf\x88\x7d\xc2\x50\xaf\xdf\x5a\x94\xfd\xda\xc8\xbe\xc2\xbf\x15\x36\x4b\xcc\x4b\x15\x8d\xf2\x2f\x68\xa8\x30\x92\x0e\xc7\x22\x46\x54\xab\xc6\x44\xc6\x5a\xd7\xf5\x1d\x0e\x1d\x5a\xa5\x79\xaa\xe2\x12\x1c\xf6\x9d\x39\x29\x90\x1c\x55\x53\xc3\x33\x07\x86\x4d\x70\x3b\x29\x96\x0d\x7f\x4a\xba\x83\xa6\x1f\x8f\x1c\x3b\xc6\xa7\x70\xa6\xc5\xa6\xbd\x16\xba\x63\x47\x68\xf2\xd5\x65\x3d\xd4\x29\x9b\x4f\x3f\x33\xcc\xe9\x0c\x88\xbe\x72\xe0\x17\x99\x3b\xcc\xb7\xae\x13\x0f\x92\xcf\xf0\x28\x7f\x4f\x70\xf8\x6a\x0a\xf8\x9e\x10\x93\x5f\x55\x02\xea\x7b\x39\x07\x6d\x74\x19\x85\x95\xbf\x51\xaf\x31\x4b\x28\xab\xc0\x3a\x31\x87\xf9\x8d\xe6\xe4\x93\xa0\x46\x3e\xf3\x07\xb8\x2b\x99\xca\x9e\x79\xa3\xb9\x10\xad\x8e\xc1\x8c\x88\x24\x3d\xa2\x9b\x9b\x13\xea\xb4\x2d\x09\x43\xf4\x97\xc2\xf0\x04\x3e\x4c\xd4\x97\xa9\x56\x24\x29\xd4\x57\x59\x2e\xc1\x7d\x0b\x76\xf5\x8d\x73\x89\xba\xa5\x14\xb5\x85\xd2\x5c\x6d\xe7\x96\x7a\x21\xd9\x3a\x49\x11\xe0\x53\x22\x84\x4a\x75\x1a\xd3\xb9\x33\x69\x11\x1a\x18\x3e\x1e\x3d\x3c\xa6\xc9\x24\xc0\x06\xf9\xa4\x3e\x4f\x0b\x26\xaa\x26\xe1\x43\x6a\xf1\x48\x38\x00\x99\xa9\x53\xf3\xbc\x1c\xd8\x77\x68\x7a\x85\x0f\xf6\x6b\x03\xe9\x81\x07\x94\xc1\xfa\xb3\x3f\x0c\xc6\x7e\x5c\x66\x5c\xb3\xa4\xd2\xec\x95\xf0\x94\x32\x23\x35\x2d\x4f\x3f\x4b\x23\xa3\xac\x31\x9b\x6f\xcb\xce\x32\x65\x73\xea\x7f\x85\x69\x23\x1f\xfa\x27\x44\xf0\xf2\xf1\x88\xe5\x54\x06\x08\xa9\x85\x26\xaa\x1e\xa3\xc0\xe7\xf0\x8d\x6f\xca\x49\x5f\x23\x36\x0b\xd7\xe5\x97\x18\x6c\x3d\x92\x71\x1b\x35\x44\x8b\xdc\x0e\x5c\x0f\x13\xe9\x73\xb8\x1b\x0c\x7a\x89\x1a\xe9\x13\xed\xa1\xeb\x38\x09\x3a\x70\xdf\x0b\x82\xd0\xa0\xc0\x4f\x68\x8b\x10\x36\xd1\x0e\x6a\xa6\x91\x47\x80\xbb\x73\x9a\xf5\x02\xbd\x44\x29\xf4\x34\xca\x0f\xfd\x2c\xc9\x73\x1a\x7b\x16\x89\xda\x64\x92\xa6\xd7\x0e\x6c\xbc\x4c\xd0\x4b\xd6\x34\xe7\xd8\x77\x2e\x88\xf9\xe0\x3b\x88\x9d\xfb\xe6\xc2\x62\xf0\x76\x9f\xd1\x2d\xe0\x90\x9d\x42\x1d\x86\xb1\xc5\x5c\x7f\xe9\x60\xfa\x2d\x3d\x8e\xf8\x57\xf2\x5b\x99\x76\x86\xe0\x68\x2a\x40\x97\x59\x6e\xc8\xa3\x60\x34\x0f\xed\x89\x48\x67\x4f\x0a\xd2\xb9\x3e\xf7\x44\xe6\x97\xcc\x15\x71\x4a\x8f\x10\x8b\xe4\x48\x97\x34\x2f\x05\x7b\x92\x41\x94\x90\xc0\x83\x85\x76\x69\x09\xee\x14\xe7\x49\xfe\x8d\x95\xcb\x7b\xb5\xa8\xa7\x88\x8d\x7a\xd4\x3f\x73\x7b\xd7\xf9\xdd\x95\xa4\x31\x52\xd8\x7d\x65\xa0\xbd\x95\xf9\xbe\x99\x99\xf0\x63\xb7\x77\xfd\x63\x10\x0e\xed\x38\x06\x05\xc0\xd3\x29\xef\xd3\xf4\x98\xd7\xba\x44\x12\xc2\xe3\x4a\x5c\xc5\x78\x12\x97\xd9\xf4\xd0\x9d\x25\xcd\x70\xa8\x74\x12\x3c\x42\x29\x72\x2c\x6d\x99\xf2\x70\x20\xb3\xe0\xa6\x95\xfa\x9b\xe8\x95\xda\x50\x06\xa9\x1f\xb1\x12\xc9\xdf\xdc\xfe\x4d\x2d\x29\x72\x7a\x38\xbb\x42\x57\xfb\x97\x5b\xb3\x89\x69\x2b\x77\x47\xca\xb0\x27\xdd\x42\x57\x8c\xa9\x0f\x56\x66\x0e\x95\x92\xe6\x8e\x74\xfa\x9d\x8e\xf5\xb4\xc8\xe5\x83\x40\xcb\x60\xcd\x93\x7c\xeb\x72\x37\x6b\x5e\xe6\x98\x91\xbb\x05\x76\x64\xa4\xdc\x59\xe0\xb0\xd3\xe2\x65\xaa\x56\xe9\x84\xfc\x95\x8a\xde\xf9\x16\xd6\x68\x52\x32\xfe\x4a\x91\x71\xee\x1c\x85\xe9\x32\x8a\x4c\x3b\x6a\x9b\x2b\xb3\x35\x4d\x9d\xda\x01\xe1\x24\x84\xda\x84\x17\x16\x22\x26\x1b\x37\xd4\x52\x6d\xb2\x0d\x9d\x33\x23\x09\xed\x51\x9d\x79\x4a\x4b\xfc\xa1\x88\x0d\x7b\x92\xb0\xc1\x49\xd1\xdf\x8a\x92\x7e\x90\x9a\xc2\xc7\xb7\x5a\x55\x6b\xa4\xb4\xe7\x6f\x2d\x2e\x7c\x5b\xb4\x50\x45\x7f\xfe\xd6\xa2\x82\xc7\xbe\x49\xeb\x52\x75\x3d\x40\xcb\x92\x3a\x19\x2c\x65\xe9\x11\x8c\x6a\x96\x4a\x74\x3a\x49\x23\xcc\x3d\xb2\x0e\xe0\x9d\x2a\xb7\x04\x7f\x27\x4a\xc9\x42\xde\xe5\xd9\xa6\xf3\x57\xb0\x68\x79\xae\x5f\x9a\xe7\xe9\x98\xec\x52\xb9\x50\xd9\x64\x93\x1b\xae\x63\xa1\xcf\xb2\xc3\x91\xbf\xc1\x91\xdd\x6c\xb3\x8a\xb6\x3f\xd4\x0d\x8e\x21\xbc\x15\x89\x0e\x9d\x16\x72\x25\x24\xad\x2e\x59\xa3\x97\xdc\xff\x98\xd9\xc8\x84\x4e\xb9\xf6\x65\x5b\xb8\x29\x85\xce\x2a\xaf\xae\xda\x41\xd5\x36\x73\xf5\x7c\xaa\x02\x42\x39\x37\x6b\xa9\x2f\x72\xa6\x4c\xa3\x48\xd9\x32\xdf\x14\x76\x46\x21\xbe\xe1\x37\x7f\x12\x86\xce\x33\x99\x2e\xb2\xf3\x42\x3e\x40\xf8\x44\x42\xc7\x2e\x98\x17\xf6\x4a\xcf\x0b\x7b\x05\xf3\x42\x46\x8b\xef\xc9\x5a\x5c\xae\xaa\x1d\xda\x43\xd8\xcd\x4a\x2d\x2e\xe5\xb9\x51\x59\x43\x8a\x49\x91\xdb\x76\x79\xf3\x41\xaa\x6b\xd6\x34\x1f\x88\xbe\x5a\x89\xbe\xd7\x50\xe3\x6c\xd3\x96\xd2\x08\x01\x43\x8d\xa6\x02\xb3\xa5\xfa\xd6\x17\x4e\x0f\x94\xa2\x99\xa3\x1c\x0c\x31\x54\x20\x66\xa1\x95\x39\xbf\x17\xdf\xad\xac\xa8\x5b\x59\x96\xcc\x42\x0a\xd5\x54\x6f\x55\x2d\xde\x93\x24\x1f\x4f\x67\x5a\xda\x6d\x68\xda\xa7\xba\x19\xa5\x68\x4e\x91\x96\x7e\xf9\xca\x47\xda\x7a\xca\x51\x3a\x9a\xfd\xcb\x72\x88\xfe\x6c\x6d\xa0\xdf\x0a\x54\x0c\xab\x51\x6a\x7f\x25\xc7\xac\x1a\x29\x9b\x2a\xe9\xb1\xaf\xd9\x37\xe4\x23\x3f\x67\xbb\x31\x33\xee\x75\xbb\x8a\x2a\xd6\x20\xec\x27\x48\x1b\x7b\xd9\x1d\x95\x32\xeb\x12\xd9\x7f\xee\xbc\x02\x3f\xc0\x19\xbd\x72\x61\x1a\x26\xdf\xf9\x9a\xdf\x75\xd7\x30\x8d\xba\x45\x78\x34\x4d\xbe\x69\x37\x29\x1a\xdd\xc9\x66\xdc\x6a\xb6\xe2\xe4\x8d\xb8\x5d\xed\x46\x5c\xb2\xfd\x95\x59\xff\x6a\x4e\x54\x8a\xcf\xca\x0a\xa7\xef\x54\x0a\xcd\xbe\x9e\x76\x37\x2f\xb3\x97\x97\xde\xc1\xcb\x5f\x6e\x2f\x8a\x34\x3c\x1f\xb8\xf4\x44\x42\x8b\x56\x44\x7d\x2a\x7d\x98\xe6\xcf\x7e\xcf\xb2\xa3\x60\x80\xdd\xab\x41\x2c\xa5\xa0\x2f\xe4\x24\x7d\xd7\xf3\xa4\x04\xe4\x51\x1d\xcb\x61\x70\x2d\xe3\x58\xd3\x17\x73\x44\x9b\xc8\x78\x29\x67\xf0\x17\x19\x8c\x81\xb2\x61\x42\x0a\x69\xb1\xbf\x09\x3f\x14\x37\x57\xe5\x71\xd2\x42\x52\x6b\x4d\x5b\x48\x6a\x22\x68\x90\x16\x4a\xb5\x0b\x6d\x84\x16\xfb\x3b\x5b\x8f\xd2\x7e\x3d\xb6\xfd\x20\xb4\x87\x76\x61\xe7\xf3\x44\x73\xc2\xc7\x4e\x24\x70\xd6\x9c\xae\xdf\x2f\xea\xfa\xfd\x99\x5d\xbf\xaf\xe9\xfa\x59\xa8\xb4\xd2\x1d\x75\x0e\x4a\x9b\xba\x9f\x8e\x60\x6e\x77\x1c\x39\xe0\xc9\x7e\x8d\xbd\x51\x51\xb4\x07\x76\x18\xb3\x0e\x2f\xc4\x72\x6d\x4a\x28\x8d\xac\xb4\xca\x45\x2d\xf0\xbd\xa9\xb8\x68\xad\x2e\xeb\x9e\xc8\xa4\xcb\xa2\xd3\x2e\x26\xb5\x72\xbc\x32\xb9\x54\x59\x74\x97\x15\x47\x69\x61\x62\x87\x00\xaf\xc1\x9a\x33\xf9\xd0\x0b\x86\x23\xbb\x17\xa7\x17\x32\x8e\x08\x30\x59\x56\xa4\x85\x6a\x2d\x94\x69\x91\xca\x10\x53\xcc\x6f\x16\x72\x1d\x9d\x88\x3f\xcf\x15\xf1\x44\x92\x9f\xab\x92\x9c\x63\xa1\x3f\x2f\xb0\xd0\x53\xb2\xfd\x5c\x23\xdb\x29\xbd\xf5\x3c\xd1\x5b\x09\xcb\x9e\xeb\xe3\x8f\xea\x8e\xfe\x14\x6d\x71\xea\x3b\xa8\x69\xd2\x73\x82\x24\x87\xb2\x01\x2d\xb7\x86\x84\xc1\x3e\xcf\x5e\xe2\x6c\xdd\x28\xaa\xb4\x4a\x68\x61\x79\x90\xeb\x10\x6a\xc1\x9e\xdd\x8e\x53\xd2\x41\xff\xa9\xa8\x49\xb3\xbc\x3e\x34\x39\x19\x4c\xd2\x2c\xaf\x0d\x4d\xce\x77\xc1\xad\xcf\x32\xe6\x3b\x17\x9c\xbb\xce\x85\x9a\x17\xb6\x13\xe4\x20\x3c\xe5\x33\x47\xf1\xd4\xc3\x2d\x74\x87\x7a\xe3\x30\x0a\x42\x38\xc1\xf3\xb6\x43\x1c\xb9\x7f\xe2\xaa\x14\xc6\x44\x82\xef\x5d\xed\x44\x98\xd6\x27\x69\x8d\x22\x74\xca\xac\xc1\x92\x55\x2f\x7c\x36\x4d\xcf\xb1\xc9\xec\x5b\xf5\x03\x5f\xc6\xa7\x2f\x05\xb7\x5c\xa2\x96\x64\xdc\xa5\x6b\xd9\x68\x81\x31\xdb\x50\xaa\xda\x68\xd1\x31\xaa\x4c\x95\x4d\x9a\x32\xb3\x98\x55\xb3\x36\x35\x59\x19\xea\x3e\xd4\x4a\x5b\xdf\xbf\xf5\xfb\xfd\xaf\xa1\xbe\x68\x0b\x35\x97\xa8\x73\x3a\xfb\xdc\xf5\x66\x3f\x67\xc6\x59\x21\x43\xb6\x38\xca\x0a\x49\xa1\x9e\xd4\x69\x26\x8d\x17\x25\x26\x8d\x17\xea\xa4\x91\x9a\x01\x5e\xcc\x9e\x01\x5e\x7c\x1e\xcb\xb5\x40\x9f\x46\x52\x73\xa1\x25\x34\xe9\xa2\x7a\x34\xab\x45\x75\x9e\x6b\x72\xfa\x8c\xe6\x2c\xce\x90\xd5\x96\xc3\xe0\x06\x2b\xe0\xe6\xaa\x6a\x49\x1b\xf6\x3a\x73\xff\x68\x64\xf7\xdc\x78\xda\x42\xf5\x5a\x53\x31\xfa\xf5\x07\xc6\x33\x4c\x2f\x39\xa2\xef\x6f\xc9\x71\xc7\xb2\x6b\x03\xb2\xbc\x2d\xb6\xa1\xf0\x24\xd6\xae\x09\xbe\x2f\x8e\xac\xac\x9e\x3a\x7d\x5f\xf6\x78\xea\x7b\xed\x4e\xca\x54\xfa\x5e\x34\x9a\xbe\xd7\x8c\xa6\x1c\x2b\xed\xfb\xc2\xf3\x35\x65\x00\x7e\x2f\x06\xa0\xd4\x06\xb0\x23\xba\x9b\x7f\x46\xa9\x6e\x59\xef\xce\x3a\x70\xdc\xcd\x7a\x17\x50\x20\x06\xd4\x41\xcf\xe4\x82\xed\x38\x56\xfc\x10\x11\x1a\x05\x10\x7a\x8b\x46\x48\x29\x16\xd0\x64\xbf\xe0\x2b\xb7\xf3\x0a\xad\x3b\x3c\x89\xd5\xc0\x03\x2b\x61\xbf\x88\x8c\xe6\x56\xe3\x8c\x08\x0a\xda\xa0\x3b\x08\xce\xce\x5f\xfb\xbd\x01\xe8\x18\x2c\xf6\x63\xf8\xbf\x1b\x1c\x42\x04\x29\x91\x84\xba\xcd\xa4\x52\xe5\xaa\x10\xb4\x8d\xd2\xe8\x1d\x88\xe9\x13\x65\x75\x20\x7d\x7d\xb0\xa8\x44\x29\xce\x63\x7c\xc3\x5a\xf2\xc2\x90\x36\xa6\x44\xc2\x15\x59\x19\x5f\xb0\x07\x22\xe9\xd8\x70\xc1\x3e\x48\xfb\xf3\x64\x8d\x9d\xad\xb5\x75\x4a\xd6\x93\xaf\xac\x01\x34\x7f\x04\xa1\x46\xbd\x9c\xbb\x4d\xa3\x5e\x22\x48\x50\xa3\xae\x8f\x12\x94\xd9\xb8\x21\x09\xd9\xbb\xac\xf6\xdd\x2b\xab\x7d\xf7\x66\x69\xdf\x3d\xd0\xbe\xf2\x67\x79\xe3\x57\x4a\x26\xbf\x56\x93\x4b\x5b\xc1\x4a\x7a\xe9\x7d\x8a\x7e\xea\xf6\x83\x52\x88\xfa\x4d\xf5\x0e\x5e\x3a\xb8\x51\xc9\xd8\x44\xfa\xcb\xfd\x4a\x6c\x22\x50\xc8\xa9\xe0\x44\x49\x39\x6e\xc4\x36\x15\xdd\x5e\xb9\x8d\x33\x49\x45\xf0\x1d\xb4\x5a\x0f\xdc\x47\xc5\x06\x1a\x5c\x4d\x6c\x7c\xf5\xf3\x97\x7e\x9f\x22\x69\x78\xcd\x1e\xc1\x4f\x41\xca\x28\x26\x76\x6a\xf9\x5d\x08\x76\xf9\x46\x93\xe1\xe7\x51\x86\xec\x81\xef\x68\x76\x1a\xd2\x71\x7b\xf3\x53\x66\x78\x15\x6f\x75\x1b\x0b\xfa\x80\x48\xa6\x7c\x54\x92\x08\xca\xe6\xa6\x9c\x3e\xd9\x95\xd6\x92\xd3\xac\xd2\xb4\xe9\x92\x8d\x40\x9e\x36\x73\x17\x23\x27\x3d\x75\x3c\x62\xf7\x2e\x92\xb4\x86\xa2\x1f\x20\x6c\x91\xac\x00\xe0\x45\xe6\xee\x9b\x5a\x35\x6a\x58\x6b\xf4\xb5\x1a\x22\x08\x6e\x5a\x14\x87\x07\x6a\xce\x19\x1e\xe8\x0d\x1b\xb5\xba\xd0\x40\xa5\x43\xf7\xe8\x31\x4e\xa4\xd0\x3d\x1b\xdc\xf4\x5c\x82\x46\xb2\xec\x5a\x8a\x48\x61\x40\x87\xdc\xfc\x14\xad\x5b\x89\xfb\x01\xd3\xf6\xaa\x48\xb1\x85\xdd\xaa\xc8\xf1\xf5\xdf\xaa\xe8\xa9\x56\xcc\x12\x74\x09\x31\x76\x12\xb0\x58\x3f\x4a\xb1\x39\xe2\x60\xb4\x24\x27\x08\x85\x4b\xb6\x13\xa5\xd2\x0d\xe2\x38\x18\x2e\x4d\xc6\xc3\xfd\x65\x78\xd9\xa0\x9b\x7d\xe5\xa2\xf2\xe4\xd2\x2a\x15\x89\x61\xd6\x38\x5b\xa2\x25\x16\xc9\x4a\xa3\xf2\x58\x25\xe2\xc5\xe4\x92\x80\x78\x31\x54\xc9\x24\x5e\xee\x4b\xf5\x67\xe2\x10\xbf\x14\x19\xc5\xef\x7a\x21\x5a\x22\xa6\x02\x37\x9c\x16\xe3\x28\x70\x30\x0b\x38\x41\xdd\x79\x96\xe0\x25\xb9\xfd\xf6\x2d\x8a\xe8\x85\x29\x63\xfe\x6b\x62\x24\x4c\x58\x30\x81\x29\xfb\xcb\x94\x7b\x5d\xd6\xcc\x7b\x75\x9d\x5e\x7d\x66\x6d\x24\x61\x75\xfb\xfd\x7e\x55\x9e\xf6\xaa\x7f\xdb\xdf\xdf\xaf\x2a\x1a\xf4\x8e\x2a\xc1\x86\xc5\x15\x59\xc3\x12\xca\xa8\x61\x31\x85\xd2\x40\x0f\x02\xa3\x70\x55\x10\x85\x02\xfa\x40\x81\x27\xdc\xab\xd7\x8b\xe0\x09\x19\x99\x7c\x48\x42\x38\x62\x07\x83\xfc\x84\xbb\x2e\x6a\xc0\xa2\xbe\xdf\xfd\x9e\x95\xbc\x81\x9e\xa2\xb7\x90\x3e\x42\xb6\x8f\x60\x0c\xa3\xa0\x8f\x68\x3f\x45\xc8\x18\x01\x90\xfe\x0d\x46\xb6\xef\xec\x04\x21\xf2\xf1\x95\x4d\x9e\x4d\x34\x0a\x83\x2b\xc0\x0b\xf1\xaf\x50\x3f\x0c\x86\x84\xd4\x27\x18\xfb\x9f\xd0\x78\x84\xe2\xc0\x42\xdd\x71\x0c\x38\x21\xae\xdf\xf3\xc6\x70\x76\x8d\x3e\x61\xdf\xf9\x54\x43\xaf\x51\x14\xe3\x11\x29\xe9\xd3\x76\xe3\x13\x72\x23\x34\x8e\xb0\x43\x16\x64\xb6\x28\x42\x26\xe8\x46\x28\x1a\xe1\x9e\xdb\x77\xb1\x83\x6e\x69\x1c\x68\xc2\x30\x90\x43\x41\x48\x12\xe2\xd1\xa7\x1a\x3a\xec\xb3\x77\x6e\x04\x45\x8b\x5c\x16\x21\xe7\xc6\xd5\x08\x45\x38\x46\x71\x20\x48\x13\x6a\xe2\x21\x1e\x60\x5f\x24\xa8\x7f\xaa\x6d\x20\x68\xa2\xa7\x4f\x3f\x04\x31\x6e\x3d\x7d\x8a\xfe\x6d\xdf\xd8\xa7\x80\x88\x84\xfa\x81\xe7\x05\xb7\x11\xc9\x83\x0e\x0f\x0e\x0e\xb6\x9f\x3f\xdb\x23\xca\xcf\x77\xec\xd0\x01\xe4\xa8\x10\x47\x81\x47\xac\x55\x42\xa3\xef\x05\x76\xec\xfa\x57\xdb\xb0\xc3\x48\x37\x0b\x22\x74\x3b\x70\x7b\x03\xd4\xb3\x7d\xd2\x9e\xce\xb8\x87\xd1\xd8\xc7\x93\x11\xee\xc5\xd8\x21\xf9\xc7\x5e\x1c\x71\x2e\xfe\x41\xe1\x8c\xe8\x4f\xd7\xef\x61\x54\xaf\x35\x6a\x75\x78\x1e\x62\xd2\x61\x47\x7d\x74\x09\x8f\x3d\x3b\xc6\x57\x41\x38\x45\x3f\xc7\xae\x07\x6f\xc0\x51\x12\xdd\xd1\x8e\x7d\x40\xe7\x50\xe1\x4e\xfd\x02\x9d\x0d\x30\xbb\x57\x16\xf4\xa1\x2e\xf4\x2a\x9d\x2e\x13\xf6\x1d\x48\x4e\xfe\xce\x4c\x7c\x4e\x7a\xa4\xd3\xa0\x05\x50\x40\xd3\x38\x20\xa2\x10\x52\xe7\x8f\x20\x44\x0e\xe6\x0f\xdd\x29\xa5\x41\xcd\xf4\x08\xdd\x01\x66\xf9\x03\x3a\x61\xcf\xa2\x28\x49\x38\x69\x8e\x08\x63\x74\x59\x73\xe9\x8d\x2c\x0b\x5d\x52\xaf\xb8\x13\xba\x6b\xff\x14\xfd\x03\x4f\xec\xe1\xc8\xc3\xac\x09\xd9\x67\x63\x8f\x2c\x11\x9e\xa2\x9d\x1d\xd4\x79\x89\xce\xeb\x16\x19\xeb\x4d\x0b\xed\x5e\xa4\xd2\x6d\x67\x12\x6e\x37\x2c\xb4\xdd\xb4\xd0\x76\x26\x6d\xc3\x42\xcf\x94\xd4\x8c\xa6\x85\xf6\xd2\x49\xeb\x16\x6a\xd6\xd3\xc9\xc9\x0b\x0b\x35\x08\x33\xcf\x34\x19\xb6\xf7\x48\xe1\x73\xb1\xb3\x67\xa1\x7a\x9a\x23\xf2\x7f\x19\xea\x4a\xa2\x0b\xc0\xa0\x21\x9a\x24\x64\x3a\x44\xd2\x28\x80\x95\x45\xd5\x51\x8d\x69\x23\x7e\xfb\xb2\xbd\x91\x51\x66\x8d\xaf\x10\x6b\x75\x8d\xd0\xa3\xda\x32\x56\x01\xba\xba\x3c\xf4\x68\x63\x3d\xd0\xa3\x8d\x15\x40\x8f\x36\x96\x83\x1e\x6d\xae\x11\x7a\xb4\xb9\x2a\xe8\xd1\xe6\x0a\xa0\x47\x77\xd7\x08\x3d\xba\xbb\x2a\xe8\xd1\xdd\x15\x40\x8f\xee\xad\x1f\xbb\xf3\x19\x07\x1b\x3f\xfa\x69\x06\xfe\x68\x63\x6f\x61\x8c\xd3\x75\xa3\x83\x3e\x9f\x0f\x1d\x74\x51\x88\x53\x25\x16\x78\x6e\x11\xcf\x16\xec\x09\x5d\x90\x9d\xbc\x76\xda\x5d\x50\x49\xd5\xb3\xd0\xf2\x79\x45\x3c\x07\x18\xd5\x47\x14\xd5\x47\x14\xd5\x47\x14\xd5\x65\x51\x54\x33\xe0\xa9\x14\x1f\xf3\x57\xba\x7c\x93\x4a\xe3\x50\xa8\x11\x97\x01\xda\x8e\x70\x67\xab\x2d\x4b\x4f\x82\xa9\xca\x50\x56\xa3\x1a\x5c\xdb\x3f\xea\x1b\xae\x89\x5e\x76\x50\xdd\x44\x44\xeb\xba\x3e\xef\xda\x27\xa5\x06\x0c\x30\xe0\x9a\x72\x66\x36\x66\x5c\x32\x62\x82\xee\x1f\x20\x83\xd9\x81\xf2\x88\xa3\xfa\x88\xa3\xfa\x88\xa3\xfa\x75\xe1\xa8\xbe\xb5\xc3\x18\x47\xae\xed\xa3\xd7\x13\x37\x4a\x01\xaa\x52\x15\x25\x92\xb0\x08\x89\x29\x1c\xd4\x92\x30\xa8\x0a\x95\x02\x38\x54\x25\x9d\x51\x8c\x88\xaa\xa4\xe5\x37\x08\xf8\xb9\xfc\x4c\x50\x54\x25\x77\x19\x70\x54\xb5\x38\xb3\x66\x8f\x46\xde\x94\x51\x13\x66\x09\x45\x29\xcb\xc2\xd6\xa5\xea\xaf\xc0\xd7\x45\x83\x60\xec\x39\xa2\x45\x7e\x86\xdd\xea\x1c\x3f\x19\x6d\x5a\x40\x17\xa2\x73\x4f\xea\xfa\x3b\xe9\xe4\x37\x01\x0f\x30\x5a\x63\x8f\xf2\xb9\x7a\x88\x23\xb1\x9d\x9c\x3b\xe9\x50\xfa\xe7\x55\x96\xbf\x7a\x91\xdc\xd7\xd8\xd9\x61\xe6\x09\x2f\xca\x8d\x50\x14\x0c\x71\xec\x0e\x71\x84\xae\xb0\x8f\x43\x3b\xc6\x0e\xc2\x37\x38\x9c\x22\xf2\x16\x6d\x27\x59\x7b\xa4\x3b\x51\x3c\xb0\xd9\xee\xa3\xed\x79\x53\xa2\xa1\x29\x23\x08\xff\x67\x6c\x7b\x6e\x3c\x25\x44\x3d\xf7\x1a\x7b\x53\x14\x07\xa8\x6f\xbb\x5e\xc6\x4b\x28\xd7\x47\x88\xf1\x75\xe4\x49\xe0\x77\x45\xed\xc0\x12\xe6\x36\x05\x0b\x9e\xa9\x6d\x0c\x26\x7c\xb3\x43\x07\xeb\x96\x6d\x3c\x46\x7c\x34\xb0\x3d\x2f\xb8\x3d\x20\x75\xa7\x20\x3c\x9c\x5d\xa9\x2e\xb0\xb3\xbe\xea\x72\x44\x1b\x58\x4a\x73\xac\xa5\x2c\xea\x39\x25\x79\x51\x09\x47\x04\xf8\x03\xda\x8a\xfc\x7b\x8a\xde\xda\x5e\x6f\xec\xd9\x31\x86\x9d\xcd\x9e\x88\x51\x16\xa1\xa0\x8f\xb0\xef\xc0\x1e\x71\x44\xec\x1d\x88\x43\xc6\xb3\xb1\x3d\x56\x74\x47\x19\x7f\xa0\xce\x62\x67\x03\x4c\x7f\x04\x7d\x64\xa3\xc8\x1d\x8e\x3c\x0c\xf9\x44\x36\x7e\x13\x97\x67\x33\x26\x0d\x0b\x4d\x1b\x66\x0b\xf2\x26\xc5\xcb\xa5\xa3\x9e\x17\x44\xb0\x67\x4b\x48\x81\xa7\x1f\xa7\x87\x8c\x49\xd3\x42\xd3\x66\xc9\xfc\x36\xa8\x61\xc8\xba\xb3\xa1\x07\xb1\x72\x7b\xd7\xef\x5d\x9f\x06\x6b\x2b\xc0\xb1\x92\x93\x01\x8c\xd3\x7c\x48\x56\x13\x09\x73\x2a\xc7\x23\xba\x59\x74\xbd\xb2\x39\xf3\x7a\x65\x53\xe3\x32\x1d\x84\x2e\xf6\x63\x9b\xc7\x57\x66\xe9\xa4\xb7\x8a\x5f\xa2\xdb\xbb\xe6\x51\x7e\x25\x20\x2d\x35\xc0\x1c\x42\x43\x97\x58\x1c\x52\x22\xfa\x42\xf1\x78\x9e\x34\x34\x61\x58\x11\x9a\x34\xb5\xaf\xa7\xfa\xd4\x53\x7d\xea\x78\xa2\x7f\x3d\x4d\x87\x75\x65\xb8\x70\x64\xdd\xdc\xe1\x5c\xbf\x42\xdb\x0d\xd4\x52\x6f\xd4\xf5\x5d\xdf\xf6\xce\x92\xca\x83\x33\x9e\x68\x0c\x62\x08\xb2\xdf\x72\x26\xf2\x0e\x64\xa1\x54\x80\x39\xcd\x2e\x00\x0f\x24\xed\x46\x1f\xe0\x4c\x21\xc1\x07\xab\x09\xda\xc4\xce\x54\xdf\x20\x7a\xbb\xb2\x96\xc8\xbd\xa8\x6c\x74\xeb\xc6\xbd\x01\x32\xa4\xde\x55\x50\x15\xed\x08\xa3\x6a\x1c\x8c\xaa\x2d\xb9\x47\x48\xd3\x43\xb7\x64\xc8\xa6\x3a\x62\x8a\xb6\xd0\x13\xd6\x8a\x4f\x99\xec\xb5\xd3\x9d\x08\x9d\x30\x6d\x12\x43\x1c\x62\xe6\xa9\x6d\xdb\x4e\xf7\xa2\xa8\x96\xfc\xa5\x1b\x62\xfb\xba\x9d\xe2\xdb\xc3\xfd\x58\x61\x1c\x8a\x9b\xce\x60\x1c\x2a\x36\x51\x18\xbf\xa5\xa0\x0b\xa9\x16\x00\x6e\x26\xa5\xf8\x9e\xce\xc5\x37\x9c\xec\x2e\xc1\x78\x49\xbe\xb7\x56\xc7\x37\xdb\x7f\x5d\x5c\x48\xca\xca\x48\x09\x9e\xcb\xc9\x48\xfa\x46\xf5\x1d\x5c\x41\x23\x4b\x0d\xb8\xe2\x06\xd3\x4d\x0b\x4d\x1b\x16\xbd\xc4\x06\xd3\x47\x8b\x70\xf0\x60\x01\x75\x48\xd9\x42\xf1\xc4\x42\xd3\x16\x61\xef\x61\x06\xec\xa1\xdb\xbb\x3e\x13\xce\xe7\xc5\x53\x46\x92\x4e\xeb\x8b\x9d\x0f\x43\xa7\xd3\xdc\xbb\x79\x9a\x3b\xa5\x92\x77\x75\x2a\x39\x71\x97\xcf\xea\xc9\x52\xaa\x23\x33\x04\x15\x8a\x42\xbf\x32\x57\x7c\xc4\xae\x45\x2c\x30\x42\x72\xe8\x12\x6a\x48\xb8\xfa\xcf\x27\xc1\x0a\x49\x7e\x0f\xa0\xb4\x40\x25\xb9\x67\x89\xc5\x2f\xca\x95\x83\x62\xd1\x50\xd3\x6a\xc5\x23\x1f\x8d\x4a\x27\x1e\x7b\x25\xc5\x63\x4f\x27\x1e\xea\x65\x09\xd2\x4a\xb4\xf7\x96\x90\x90\xbc\xfe\xcd\x16\x35\xab\x43\xf2\x66\xaf\x0c\xa5\x05\xa4\x50\x23\x2d\x05\x64\x4b\x0a\x61\x5a\x82\x54\x8a\x33\xae\x74\x90\x25\xed\x7b\xd7\x2f\xbe\xd6\xca\x13\x7d\x13\x00\x2f\x3a\x69\x7d\x96\x27\xad\x36\xab\x99\x94\x92\xbf\x2a\x10\xea\x67\x3a\xa1\xe6\x2b\x59\x25\x58\xee\x4c\x6b\x4d\x77\x2c\x24\x45\x76\x3e\x0e\x71\xc4\xf9\x7e\x1d\xc7\xa1\xdb\x1d\x93\xc5\x13\x98\x6f\x49\xa3\x9b\xf2\x8d\x5c\xf9\xf6\x33\x97\x90\xf5\x32\xc2\x5b\xcc\x54\x81\x4a\x94\x8e\xe8\x74\xe8\x88\x22\x26\x6e\xe6\x03\x75\x44\xab\xa6\x21\xa8\x7d\x8c\x9d\x7f\xf1\x0e\xd7\x53\xdb\xdc\x14\xe6\x56\x01\x61\x92\x8c\xf7\x18\x2f\x40\xdb\x5d\x6c\x7f\x20\x73\x73\x3d\x7d\x6b\x7d\x0a\x40\xf1\x82\xbb\xa7\x1a\xb0\x01\x7e\x87\x3d\x23\xc2\x60\x0f\xe8\xf3\x8b\x54\x0f\x69\x80\xba\x6c\xc3\xf0\x7b\xa9\x99\x3a\x83\x62\x9c\xd5\x30\x54\x51\x2e\xdd\x2e\xac\x1a\x94\x97\xa7\x9a\xba\x36\x52\xe8\x0d\xbc\x55\x8a\x73\x35\xe5\x5b\x6e\xba\x46\x99\x03\xbc\xb8\x2c\x5a\x41\x52\x5f\xfd\x2d\xd2\x1e\xdf\x04\xdc\x26\xe2\xbe\x0d\xb9\xd0\x83\x14\x63\x09\x15\x5e\x98\x76\x7b\xd7\x87\x31\x1e\x16\x5f\x9a\x66\x89\x8c\x60\x44\xf7\xcc\x59\xb3\xf3\x90\x7b\xa9\x15\x21\x49\x9a\x35\xaf\x20\x60\xce\x5c\xed\xe1\x46\xbf\xd8\x9e\xeb\xf0\x06\xa1\x85\x2b\x11\xce\xa5\xd2\xe6\x6c\x6a\x19\x41\x48\xa9\x95\x36\x58\xd3\x62\x0e\x47\x86\x39\x83\x67\xfa\xd5\xd0\x96\xbb\x8a\x4a\xce\x7f\x2f\x55\xe3\xd1\x50\xfa\x5e\xaa\x7e\x38\xe6\x20\x31\xa4\xa4\x96\xd4\x71\x1b\xc4\xa9\x2a\xe5\x7d\x50\x6e\x8c\xc2\x67\xf1\x9c\x3b\xe6\x78\x73\xe5\xed\xfc\x51\x91\x86\x6d\x3f\xdd\xd6\x1e\x77\x7c\x84\x6f\xb0\xbb\x46\x7f\xc5\x01\xb2\x7b\xf1\x18\xf6\x92\x19\x09\x23\xb8\xc1\x61\xe8\x3a\xe0\x45\x6a\xc7\xe8\xd6\x8e\xd0\xc8\x8e\xc0\x8f\xd6\x67\xd2\x24\xa8\xf3\x65\x19\x4c\x63\x62\xab\xfd\x81\xd1\xc2\xce\x99\xc4\x8b\x6e\x93\x2e\x19\x89\x79\x01\x68\xa4\x14\x80\x7d\x3e\x67\xb8\x99\x7c\x50\xb4\x98\xed\xfa\x49\xc8\x62\xfc\x55\x01\xcc\xc0\x7e\x2d\x0b\x68\x03\x1b\x99\x2a\x95\xf4\xe7\x2c\x92\xfd\x7e\x3e\x92\xfd\xd8\x77\x65\x64\x35\xf2\xa8\xd4\x4c\x2c\xaa\xc9\xc4\xa1\x9e\xcd\xb0\xf5\x47\x64\x28\x02\x2c\x35\x00\xba\xa3\x3d\xdf\x62\x02\xf0\x60\x2a\xb7\x41\x95\xc5\x94\xb8\xcc\x9c\x5a\xec\xb6\x8b\xd6\x16\x72\xa6\xf4\x32\x48\x81\x48\x98\xb8\x11\x3f\x4c\xf9\x4c\x66\x9b\x5c\x7c\x6f\x1c\xc5\xc1\x90\x30\xf9\x59\x98\x70\x7b\xd7\x66\x7a\x8b\xf1\x3d\xf3\x8d\xc8\x4c\xff\xa2\x69\x48\x6f\xc9\xf6\xe5\xba\x2d\x4b\xce\x95\x2a\x13\x6e\x8c\x01\x86\x38\x11\x3b\x1d\x9a\xa7\x85\xdc\xb4\x41\x79\x99\xde\x5b\x27\x15\xa5\xa1\x76\x32\xbb\xee\x14\xec\x53\xbd\x7d\xef\xc9\xf9\xd2\x39\x6a\x5e\x6a\xa0\x22\x65\xdf\x36\x9b\x9e\x7c\x95\xe2\xa7\xf0\x5e\xc8\xf6\x80\x76\x6f\xa1\x25\xfd\xb6\x72\xd7\x93\xad\xd4\x73\x62\x4c\xa9\xbd\x9a\xd1\x2f\x02\x11\x44\x87\x04\x02\xd9\x53\x02\x6b\x25\xb5\x55\xe9\xb9\xf4\x6a\x93\x6b\xa1\x91\x3d\xf5\x02\xdb\x69\x21\x68\x5b\xc5\xae\x13\x0f\x2b\xb0\xe8\x4a\xcd\xc0\x3a\xb7\xc5\xc5\xa0\x21\xca\xce\xbb\x29\x28\x08\x3a\xdd\xc0\x84\x5c\x45\x5b\xc8\x95\xe7\xe3\x85\x07\x15\xdd\xe5\xef\xbb\x9e\x40\x76\x39\xea\xc3\x9d\x78\x16\x0f\x95\xca\x3a\x53\xbc\x62\x94\x98\xda\x59\x68\x73\x73\xc5\x76\xf5\x62\xd6\x0a\x90\x51\x1b\x47\xd1\x55\x56\x32\x2a\xb3\x15\x81\x4a\xd0\x4a\xa7\x4c\x6c\x98\x13\x93\xf1\x66\xa1\x2a\xe9\x85\x25\x4c\xd0\x19\x61\x50\xa0\xb1\x6b\xcc\x92\x67\x23\x80\x3f\x6e\x21\x03\x66\xd8\xfb\x7b\x54\xad\x9a\xa6\xc6\xf6\x9a\x2b\x5c\x4b\xe9\xf1\x51\xbd\xaa\xce\x04\xcf\xd1\x74\x89\x8a\xa2\x03\xca\x78\x43\x61\x78\x85\xf8\x21\xf9\xf8\x9a\x99\x9d\x9b\xe7\xda\x9d\x9b\xdb\x14\xc8\xe6\xac\x1d\x25\x1d\xb6\x26\x54\xfa\x9f\xd4\x1b\x42\xda\x05\x7a\x5e\x53\x3f\x14\x83\x97\x3c\xd7\x63\x97\x0c\x5c\x47\x4e\x43\x1e\x55\xdc\x0e\xf2\x66\x1e\x98\x8e\x59\x10\x73\x31\x33\xd3\x38\x4a\x1c\x3c\xcb\x09\xfc\x00\xa6\xd4\xd9\x7e\x25\x94\x80\x85\xce\xab\x54\x2a\x24\x5f\x8a\x8c\x51\x08\x29\x4a\xae\x51\xcb\x8c\xb4\xa4\xd5\x95\x45\x5f\xb6\x4c\x80\x4f\x00\x13\x21\x89\xac\xcb\x06\x67\x42\x43\xb6\xc9\x50\x2b\xfd\x51\x6e\x90\xec\x72\x88\xd4\x85\x0a\xd9\x0f\x1d\x54\x27\x63\x98\x49\x14\x7f\x7c\x22\x31\xa5\x3e\xce\x09\xc2\xb2\xca\xa1\xbf\xc2\x89\xf1\xae\x2c\xf2\xc3\x4c\x5c\x18\x55\xd7\x28\x00\x31\xb2\xc6\x11\x23\x5f\x45\xc6\x48\x36\xa9\xf5\xe0\x1c\xb0\x0a\x49\x1a\xbf\x14\x0c\x95\xee\x5e\x80\xa6\x31\x58\x11\x6f\x6d\xcf\x7b\x33\x3d\xb6\x43\xd2\xd4\x92\x48\x69\xb4\xe3\x45\xca\x8d\x8c\x2f\x93\x8a\x4f\x71\x22\x5d\xd0\x02\xb6\xd8\xa3\xce\x51\xba\xa5\x5e\xa4\x7c\xd5\xf9\x57\x89\x04\x1a\xdf\xaa\xa1\xeb\x93\xa2\xff\x69\x8f\x44\xaa\xe4\x55\xfe\xbe\x3b\x4d\x99\xb3\xeb\x0e\xc8\x73\x37\xb6\x27\xd2\xf1\x17\x45\xab\xd4\xa4\x0a\x45\x6b\x54\x9a\x8a\xad\x50\xa5\x21\xfa\x24\x16\x03\x50\x51\x07\xfc\x85\x66\x10\x9e\x5f\x68\x07\xfb\x0a\x1d\x30\x78\xb5\xcd\xc4\x71\x71\x6e\x93\xcf\x67\x74\x4f\x23\x46\xd4\xd4\x54\x25\xb3\x26\xa7\x5c\x1c\xb2\xf2\xa5\xcd\x8c\x12\xa6\xe7\x22\xf5\x7b\x95\xf4\x79\x0b\xd5\xf5\x5a\x34\x91\x8a\x4e\x07\x55\x47\x64\x59\x18\xb2\x10\x23\x07\xbe\x53\x2d\x53\x2d\xa8\x08\x0d\xd3\x74\x97\x1e\x05\x4c\xaf\x5b\x69\x9c\x04\x55\xa2\xf8\x90\x68\x21\xe1\xb8\x27\x09\x71\x4b\x7e\xb0\xa4\xb1\xd1\x92\x7e\x5b\x20\x8b\x2d\xf8\xaf\xbc\x60\x8a\x43\x7d\xe0\x99\x82\x7a\x7f\xeb\x95\xce\xdd\x3d\xd4\x57\xe2\xc0\x77\x0c\x75\x43\xf6\x8b\x56\xa0\x00\x06\x55\x3f\x84\xf2\xb5\x77\xc1\x78\x4b\x06\xc9\x5d\x76\x87\x35\xaa\xd1\xc5\xdc\x8c\xcd\x0d\x96\xc3\x45\xdf\x49\xe2\xb4\x85\x1a\x14\xf8\xac\x9e\x0e\x59\x92\xef\x53\x10\x15\x85\x44\x53\x65\xed\x32\xc4\xfd\x26\xc4\x0e\x02\x79\x3d\xf0\x9d\xec\xbc\x14\x31\xe7\xe5\x66\x76\xea\xc9\x6c\x42\x8a\x64\x5a\xf5\xae\x3a\x43\x37\x75\x33\x55\xea\xe0\x17\x92\xe5\x3a\x29\x48\x93\x1a\x4d\xa9\x9f\xd4\xf8\xce\x27\x24\xa1\xb3\x4a\x52\x43\xf0\x0d\xa4\x7c\x64\xcf\xb7\xf9\x07\xed\xf9\x36\xff\x98\xbf\x1a\xe1\x29\xb8\x5f\x93\x54\x6c\xe4\xfe\x89\x69\x5c\xd1\xb9\x4f\x58\xd1\x2b\x54\x85\x32\xc1\xaf\x80\xd2\xae\xca\x55\xa2\x48\x0c\xa8\x83\x0c\x31\x5f\x9e\x5f\x98\xb5\xc8\x73\x7b\x58\xdd\x2e\x25\x8d\xc1\x7c\x18\xa1\x91\x5e\x95\x09\x15\x94\xbe\x8c\x7a\x5e\xe9\xf1\x6d\xc0\x53\x00\x5b\x01\x8a\x30\x77\x10\xa2\xe6\x39\xab\xeb\x05\x99\x35\xe4\xd2\x59\x30\x64\xe0\x56\x17\x0d\x99\xfa\x61\x92\x54\x2f\x3b\xa8\x59\x86\x39\xfd\xac\x36\x00\xf6\x86\x76\x3c\x38\x05\xff\x31\xe6\x69\x3d\xf6\xe2\xf3\xc6\x85\xe4\x9c\x86\xb6\x19\x33\xe7\x75\xf9\xb5\x49\xdd\x3f\x65\xce\x58\x64\xe3\xac\x4f\x29\x0d\x8e\xac\x39\xcd\xa3\x95\xe9\x74\xd4\x18\xcd\x9c\x90\x90\x06\xd2\xcd\xac\x6f\x5f\xa1\x09\x6a\xa1\x69\x72\xa8\x4b\x69\xe7\x25\xe5\x31\x95\xe4\x53\xd7\xdc\x63\xb2\x59\xe5\x16\x11\x9b\xc5\x88\xc4\xb3\x62\x19\x68\x75\x0c\xdc\x41\x38\x0b\xe1\x56\xc1\xd5\xd8\x0e\x6d\x3f\xc6\xd4\xcd\x3c\xb6\x5d\x8f\xbc\xed\x62\xc4\x30\xec\xb0\xa3\x6e\xb3\x92\x04\x6c\x81\x78\xce\xc2\x63\x5f\xb4\x33\x49\xde\x06\x7e\x3c\x2b\x7c\xcb\x92\xdb\x42\xa4\x98\x64\x57\x28\x79\xca\x32\xc3\xc6\xda\x6a\x07\x99\x54\x4b\x69\xac\x6d\x89\xc1\x9d\x65\x83\xaa\x4c\xe6\x4c\x49\xd9\x97\x46\x81\x70\xb3\x14\x1c\xef\xa0\x26\x0d\x87\x2a\x85\x72\x63\x23\x85\x37\x3c\xe9\x09\xda\x21\xea\x19\x91\xed\x7a\xea\x4e\xb2\xd8\x60\x6e\x09\x56\xd8\x6a\x3e\xc5\xc6\xb6\xf8\xfe\x94\x32\xd4\x4a\x27\xd1\x6f\x3e\x53\xf8\xd1\x33\xc2\xfb\x20\xb8\x4d\xd7\x33\xd9\xcd\xdf\xce\xa9\x26\x8c\x0d\x7a\x3f\x13\xee\xa8\xe9\x73\x17\x35\x12\xec\x1a\xa4\x82\xaa\x27\x1c\xe9\xa2\xa9\xe7\xb1\x66\x28\xd4\xb7\xa4\x29\xcf\x94\x3d\xc9\xb2\x7d\xa1\xeb\x04\xb2\xbe\x18\x04\xb7\xfc\x36\x9c\x2e\x2c\x9f\x12\xfc\x28\x18\xfb\x74\x31\x26\xc6\x2d\x7a\xc5\xe3\xd0\xa3\x16\xf9\xc5\x29\xe8\xae\x4c\x43\x76\x7e\x57\x5a\xe9\x1c\xb0\x7d\x84\xe2\x3f\x77\x53\x83\xb6\xb7\xfe\x01\x9b\xbf\x8f\xab\xb2\x12\xad\x63\xb8\xf6\x0a\x87\xaa\x2a\x34\xd4\xf2\x53\x25\x86\x30\x76\xa5\x0c\x60\xca\xbf\x32\x74\xd8\xa7\x28\x2d\xd6\x1a\xa9\x81\x4b\xc3\xbc\x4f\x14\xb9\x61\x46\x6a\x0a\x44\x3b\x19\xbf\x84\x8b\x1f\x60\xec\x6a\x38\xb8\x92\x07\x6e\xfa\xbb\x7c\x14\x20\xcb\x61\x7a\x9e\x9a\x83\x49\x99\xb1\x0c\x3b\xaa\xb0\xa7\x54\x45\x4a\x4d\xd0\xcc\x9a\xc1\x98\x69\xcc\x8c\x8e\x48\x67\xdd\xd2\x64\xcd\x57\x10\x59\xe5\xc0\xa7\xe9\x5c\xba\x46\x54\x56\x37\xb8\x19\xad\x20\x1a\xae\xbc\x5a\x60\x2b\x14\x66\xb1\xe9\x17\x35\x9a\x15\x0d\x65\x9f\x16\x33\xc7\x2a\xe6\x20\x37\x66\xa1\xbc\xd4\x24\x56\xfd\x6e\xfe\xa2\x65\xb7\xdc\xa2\x65\xb7\xec\xa2\x65\xb7\xdc\xa2\xa5\xc0\xf1\x3e\xb5\x68\xd9\x9d\xbd\x68\xd9\xfd\x2b\x2c\x5a\xbe\xec\x52\xa4\xfc\x92\xe9\x71\xd1\xf2\x57\x59\xb4\x28\x56\x0d\xb3\x7b\x88\x6d\xf3\x92\xda\x38\xdb\xdb\x8f\x86\xcd\x72\x86\x0d\x6b\xd3\xb9\xcd\x9b\xbc\x69\x75\xe5\xc6\xcd\xcb\x47\xe3\x66\x7d\xc6\x0d\x1d\x90\xb9\x0c\xfd\x97\x98\x36\x2a\xa2\xbf\xb2\x63\x5e\x8c\xec\xdf\x28\x46\xf6\x4f\x03\xfb\x2b\x94\x05\xc0\xbf\x82\xef\xaf\x34\xd1\xbc\x27\x54\x74\xd4\x1f\x9f\x1c\x9c\x1e\x7c\x38\x7b\x7d\x76\x78\xf4\xe1\xf2\xf5\xd9\xd9\xc9\xe1\x9b\x9f\xcf\x0e\x4e\xe1\x2c\x79\x6e\x92\xf4\x04\xf6\xe0\x97\x83\x0f\x67\x19\x5a\xa5\x63\x11\xe8\x41\x0f\xcb\x87\x00\xc8\xcd\x9f\x40\x72\x17\x02\xab\x97\xc8\x3f\x13\xec\xbf\x04\x8d\xd9\x08\xff\x25\x88\x28\xa7\x29\x0b\x50\x02\x20\x6e\xe3\x1c\x6c\x3d\x4b\x58\x76\x16\xbb\xad\x62\xf1\x0b\x29\x14\x9a\x7d\x67\x87\x62\xe9\x32\xeb\x39\xe8\xa3\xe8\xe6\x6a\x03\x25\x87\x3c\x8b\xf4\xa9\x14\x0e\x60\xd9\x5e\x5d\xbe\x5f\x57\xd3\xb3\x2b\xe8\xdb\x0d\xee\xfd\x4f\xef\x26\x2f\xda\xb3\xb3\x20\xd6\x73\x73\x77\x83\xc0\x2b\x1a\xfe\xb9\x19\x01\x1e\x7e\x21\x7e\xc1\x70\x59\x28\x2b\xa6\x5e\x34\x54\x48\xb9\x17\xca\xb7\xd4\x68\xb4\xee\x17\xa2\xc3\xbf\x65\xfe\xe9\xbd\xb5\x85\xb8\x87\xf2\x37\x36\x90\x72\x12\xbc\xd4\x48\x64\x47\xd5\x0b\xd0\x10\xd1\x24\x38\xee\xc7\x92\x9c\xcc\x8e\x7c\x53\x62\xda\x2b\x1d\x49\xa2\x78\x78\x6e\xa4\x5d\x27\x97\x22\xc5\xcf\xb5\xbf\x80\xc0\xce\x0e\x38\x32\x73\xe2\x53\xdd\x3a\xac\xc4\xcf\x03\xb6\xaa\x34\xee\x2e\x17\xe6\x85\xb9\xf1\x20\x19\x6d\x8b\x45\x8f\x80\x07\x31\x71\xde\xd1\x3c\x34\x47\x92\x3e\x49\x4d\xfd\xec\xd8\x04\x2c\x6f\xc8\x04\x7d\x0e\x6f\xa4\x98\x02\x62\x26\x4f\x72\xf1\xdb\x5e\x6c\x4c\x9c\x5f\xc0\x50\xcb\x86\xa6\x48\x14\x10\x0f\xeb\x9f\xa8\x54\xfe\x86\xce\x4a\xfc\x89\x0f\x79\x8a\xdb\x97\x1e\xc0\xcf\x24\x1e\xe8\x6a\x3e\x08\xf9\xd6\x54\xd0\xe7\x38\x51\xc9\x30\xdb\x57\x85\x4a\xe9\x90\x24\x0a\x06\x05\x7b\x5f\x30\xf6\x45\x06\xe4\x2e\x05\x1b\xdf\x5c\x2a\x06\x86\x0a\x15\xcf\x30\x49\xc1\xf2\x2f\xc0\x3e\x97\x52\x35\x49\x32\x68\x80\x60\xc4\x42\x38\xbd\x63\xbb\x05\x34\x81\x9a\xfc\x5d\x30\xcc\xc3\x8e\xfe\x5e\xa4\x84\x90\xc8\x51\x1e\x74\xf2\x0b\x91\xee\x9d\x1d\x0d\xba\x81\x4d\x6f\xc6\xe8\x92\x52\x80\x62\x35\x6d\x11\xc3\x22\x91\xd9\x56\xe1\x31\x75\xa9\x19\xb6\x2a\x5b\x59\x05\xdd\x3f\xc8\x62\x35\xe8\xfe\x51\xbb\xbc\xc4\xd1\x4f\xd0\xfe\xe8\x15\xbc\x27\x43\x86\x83\x36\xc0\x8b\x07\x8a\xc7\x08\x62\x36\xc4\xb0\xd1\x13\x03\x2c\x19\x2b\xbe\x46\xbe\xbd\x0d\x46\x53\x30\x68\x51\xb3\xde\x78\x0e\x12\x79\x15\x6c\xe3\x78\x80\x43\x3c\x1e\xa2\xd7\xe3\x78\x10\x84\x11\xa5\xe2\x46\xa8\xef\x7a\x18\xb9\x11\x1a\x49\xc1\x29\xe4\xf4\x9e\xdb\x0d\xed\x70\x4a\x48\xb3\x92\x75\x9f\x09\x85\x7e\x88\x31\x8a\x82\x7e\x7c\x6b\x87\xb8\x85\xa6\xc1\x18\x42\x6e\x84\xd8\x71\x23\x76\xb3\x0a\xb9\x31\x8f\x71\x32\x0c\x1c\xb7\x3f\x25\x24\xdd\x18\x8d\x93\xeb\x9a\x38\x1c\x46\x9c\x8f\x7f\x7e\xf8\x19\xbd\xc7\x51\x84\x43\x44\xd5\xb8\x87\x8e\xc7\x5d\xcf\xed\xa1\xf7\x6e\x0f\xfb\x11\x46\x76\x84\x46\xe4\x4d\x34\xc0\x0e\xea\x02\x39\x92\xf1\x47\xc2\xca\x29\x63\x05\xfd\x18\x8c\x7d\x87\xf9\x5f\x31\x9c\xd0\x1b\x1c\x02\x76\xe8\x2e\x2f\x8a\x11\xb4\x50\x10\x12\x22\x86\x1d\x93\x0a\x84\xec\xfa\xae\x89\x6c\x7f\x8a\x3c\x3b\x4e\xb2\x96\x68\x90\xa4\xde\x70\x59\x94\x14\x33\x08\x46\x98\xa2\x16\xba\x31\xba\x75\x3d\x0f\x75\x31\x1a\x47\xb8\x3f\xf6\x2c\x42\xad\x3b\x8e\xd1\xaf\x87\x67\xff\x3a\xfa\xf9\x0c\xbd\xfe\xf0\x11\xfd\xfa\xfa\xe4\xe4\xf5\x87\xb3\x8f\x6d\x11\x8f\x05\xdf\x60\x4a\xca\x1d\x8e\x3c\x08\xd4\x42\x66\x71\x3f\x9e\xa2\xa0\x4f\x28\xfc\x74\x70\xf2\xf6\x5f\xaf\x3f\x9c\xbd\x7e\x73\xf8\xfe\xf0\xec\x23\xd1\x43\x3f\x1e\x9e\x7d\x38\x38\x3d\x45\x3f\x1e\x9d\xa0\xd7\xe8\xf8\xf5\xc9\xd9\xe1\xdb\x9f\xdf\xbf\x3e\x41\xc7\x3f\x9f\x1c\x1f\x9d\x1e\xd4\xd0\x29\x75\x5e\x20\xf9\x67\xb7\x79\x1f\x7a\x2f\xc4\xc8\xc1\xb1\xed\x7a\x11\x6f\x89\x8f\xc1\x98\xa1\x4c\xa2\x81\x7d\x83\x51\x88\x7b\xd8\xbd\xc1\x0e\xb2\x51\x2f\x18\x4d\x4b\x77\x2a\xa1\x65\x7b\x81\x7f\x45\xa3\xc6\xe4\x09\x24\x3a\xec\x23\x3f\x88\x2d\x14\x61\x8c\x7e\x18\xc4\xf1\xa8\xb5\xb3\x73\x7b\x7b\x5b\xbb\xf2\xc7\xb5\x20\xbc\xda\xf1\x28\xb9\x68\xe7\x65\x8d\x0e\xe6\x18\x46\x4d\x07\x19\x75\x8b\x2b\x0b\xe6\xa2\xfe\xd3\xd8\x85\x21\x65\xb2\x45\xda\xc8\xf6\x70\x1c\xe3\x96\x7c\x43\x7b\x3a\x22\x33\x88\x63\x87\xd7\x55\xb6\x4d\x02\xc7\xf7\x3b\x3b\x88\x62\x16\xd2\xf8\x29\xb7\x83\xc0\x53\x46\x24\x14\xc6\x75\x58\x6d\x30\x75\x42\x3b\xc6\x26\x53\x72\x22\x2e\x93\xce\x55\x9e\xb3\xc8\x99\x3b\x0e\x83\x1b\xd7\xe1\xab\xaf\x3b\x5a\x9d\x16\xab\x15\x73\x51\x2f\x26\x2b\x69\x33\x9e\xc2\xa2\x60\xbb\x1b\xa6\x85\x9c\xa0\x07\x50\xa4\xb5\x2b\x1c\xb3\x1c\x6f\xa6\x87\x8e\x51\x15\xb5\xa9\x9a\x9a\x79\x64\x77\x85\xf3\xc8\xce\xd3\xa7\xe8\x1f\xac\xdf\x10\xec\xba\xa0\x9b\xc6\x7e\xad\x51\x6b\x6c\xc0\xad\x6e\x9b\x82\x4c\x3b\x63\x28\xa5\x36\x74\xfd\xda\x1f\x11\x8b\xb3\x92\xe8\x3d\xa3\x67\x12\xdd\xb7\xbb\x3d\xa2\xb7\x3b\x2d\xf4\xa3\xdd\xc3\xdd\x20\xb8\xb6\xd0\xa1\xdf\xe3\x91\x7e\x40\xfd\x31\x7c\xf8\x5e\xe0\x60\x8a\x15\x0a\x65\x3b\x92\x46\xfa\xe9\xf0\x8c\xbf\x46\x7d\xa2\x49\xd8\x58\x26\x24\xde\x1f\xbe\x3d\xf8\x70\x7a\xc0\x94\x28\x1d\x97\x61\x10\xc4\xc8\x71\x43\xdc\x8b\x83\x90\x49\x7d\x52\x50\x1c\x62\x88\xe4\x43\x63\xbf\x0c\x3b\xba\xf9\xe7\xc5\xbe\x69\xf9\xda\x2f\x8d\x46\xc3\xb4\x46\xda\x4f\x7b\x64\x1e\x14\x73\xcf\x7f\x0c\xdb\xbc\xeb\x07\x21\x9c\x03\x74\x3b\x69\x88\xfc\xed\x86\x85\x3b\x95\x9f\x5c\x9f\xc6\x7a\xa2\x2d\x8d\x01\xb0\xe3\x6f\x95\x2d\x7b\xab\xd2\x46\x37\x6e\xe4\xc6\x88\x0d\xab\x3e\x6b\xbf\xda\x95\x1b\x0f\xc6\xdd\x9a\x1b\xec\x40\x67\xec\x38\x41\x2f\xda\x81\x8c\xdb\x0e\x26\x8d\x18\xd6\x06\xf1\xd0\x7b\xe5\xfa\x37\x76\xe8\xda\x7e\xfc\xfb\x64\xd7\xa9\x6c\xd9\x96\xd3\xa9\xb7\x9d\x1f\xba\x6d\x67\x6b\xcb\xc4\x5b\x9d\xca\xef\x93\xe6\xbe\x1d\x5e\x45\xe7\x17\x34\x05\xf6\x49\xee\x9f\x4f\x0e\xc5\xa6\xa1\x91\x20\xf6\x3b\x5b\x8d\x0b\xb3\xdd\xed\x50\x04\x68\xbc\x55\x11\x53\x5f\x7f\xec\x79\x68\x88\xa3\xc8\xbe\x22\x26\x23\x51\xa5\xf0\xde\x0f\xfc\xed\x21\xaf\x9e\x83\x6f\x10\xf6\x6f\xdc\x30\xf0\x21\x0e\x12\xc9\x0c\x19\x81\xf1\x88\xcc\x48\xc8\x76\x1c\x97\xb4\x9c\xed\xa1\x01\xf6\x46\xfd\xb1\x47\x14\xab\xef\xfa\x57\x51\xad\x62\xb6\xbb\x35\xdf\x1e\xe2\x4e\xe5\x90\xd7\x0b\xfd\xe2\x06\x1e\xcc\x29\x95\x76\xb7\xd6\x0f\xed\x21\x8e\xce\x82\xe3\x60\xd4\x69\xb4\x29\x6c\x75\xb7\xfd\x40\xe3\xfb\x74\xee\xdc\xe8\xa7\x60\xec\xc7\xd8\x69\x89\x01\x62\xde\x51\x03\xe0\x49\xe3\xc1\xc2\xfe\x7f\xc6\x78\x8c\x7f\x0c\xc2\x1e\xa6\xb8\xbc\x72\x3a\xf1\xfd\x04\x8f\x3c\xbb\x47\x8c\xf4\x9c\x04\xa7\x38\xce\x7e\x7c\x68\x0b\xa1\x88\x0d\xdb\xea\x5a\xd8\xbc\x4b\xae\x87\x74\xec\x36\x3c\xc0\x19\xc8\x24\xee\x74\xdb\xec\xd6\x4a\x3f\xea\xf8\xf4\x37\x8d\x81\x17\x76\xf0\xfd\x7d\xf8\x20\x63\xbc\xbb\x91\x8a\x73\xd0\xb9\x7b\x68\xcb\xdf\x23\xc6\x4e\x47\xb0\x63\x5b\x5d\xf3\x8e\x03\x8f\x3f\xe9\x74\x18\x1c\xb7\xbd\xb9\x99\xc0\x81\x2b\xaf\x89\x6e\x7a\xd2\xb1\x5f\xfd\xc7\xa8\xbc\x78\x56\x31\x5b\xec\xac\x4f\xe6\xab\x96\xaa\x3c\xc5\x55\x26\x15\xad\x70\x06\x2a\xa6\xca\x58\x3f\x69\x68\x89\x37\xd6\x2c\x29\xb2\x52\xa7\x70\xca\x15\x29\x3f\x21\x9d\x8c\xba\xf1\xf2\x0d\x2c\x68\xdd\x90\xce\xbb\x49\xb8\xee\x48\x35\x68\x13\xb9\xba\xed\x8c\xa5\xaf\x3e\xbe\x45\x37\xed\xdb\x9a\x04\x41\xde\x19\xb7\x87\xc6\xad\x25\xe5\x33\xdb\xb7\x35\x37\xa2\x30\xbb\x4a\xcf\x3d\xa9\x27\x52\x32\x59\xbe\x12\x84\xbd\x69\x67\x92\x61\x6f\xaa\xb0\x37\x69\x0f\x8d\xa9\xca\xde\xb4\x36\xf6\x23\xc0\x43\xbf\x74\xa3\xd7\xd1\xd4\xef\x65\x19\x9d\xb2\x0b\x4f\x9d\xcc\x58\x92\x2e\x1d\x8a\x10\xec\x0f\x6d\x18\x84\x7f\x76\xee\x7a\xe3\x30\xc4\x7e\xdc\x22\x32\xf5\x60\xbd\xee\xcc\x88\x59\x60\xbd\xe9\x24\x42\xd9\x11\x42\x79\x3a\x1d\x76\x03\x6f\x73\x93\xfe\x3d\x27\xb2\x50\xb9\x48\x3d\x1a\x15\x3a\x53\xb1\x2d\xbb\x8a\x79\x7f\xbf\x5f\x6f\xd4\x77\xad\xb7\x9d\xbb\x6b\x3c\x6d\x3d\xa9\x5b\x21\xee\x93\x3f\x97\x97\x11\xf6\xf8\x2f\x98\x20\x5a\x4f\xea\xb2\x44\xbd\xe3\x9d\x01\x41\x3b\xac\x5e\xe7\xee\xc1\x1a\x74\x48\x15\xac\x6b\xf8\xd3\x76\xfb\x06\x1d\x25\x5d\x93\xe8\x7b\x98\x9d\xe8\x30\x79\xd2\xe9\x74\x49\x1f\x6d\x6e\x1a\xd7\xf4\x97\x69\x49\x5f\xae\xf1\x74\x73\xd3\x18\x74\x2a\x95\x2d\x78\x30\xad\xae\xf9\x9a\x46\x6a\xe8\x5a\x8e\xb9\xb9\xf9\xe4\x6d\xaa\x49\x0c\xf2\xd6\xe8\x9d\x3b\x17\x9d\xee\xb9\x73\x61\x82\x18\xf6\xb3\x93\x4b\x93\x30\xd5\xe8\x74\x3a\x7d\xb3\x27\x3a\xa2\x83\xdb\xec\xd2\x89\xd1\xf8\xa1\x9f\x4c\x4e\x57\x1d\x00\x63\x31\xfa\xa6\xe5\x75\xea\x6d\xef\x87\x7e\xdb\xdb\xda\x32\xaf\xce\xbd\x8b\x84\xf2\xb9\xb7\xd5\xbc\x68\x4b\xc4\xae\x1e\xdc\xbe\x61\x6f\x6e\xda\xca\xd6\x44\xd2\x02\xfd\x8e\xfa\xc5\xea\x9b\xb4\xea\x9d\x4e\x87\x54\x80\xd7\xa3\x0f\xf5\xa0\xe2\x73\xf7\xf7\xbf\xd3\x4e\x6e\xbd\xb1\xc0\xda\xb3\x2d\xd2\x5b\x03\xe8\xac\x6b\x0b\xe4\xaa\xd5\xb3\x2e\x83\x5b\x1f\x87\xad\x3f\x6b\x4c\xa0\x1e\x92\x31\x7b\x40\xb4\x08\x25\xc6\xb5\x5c\x27\xab\xce\x3a\xc0\x37\x2f\xac\xd3\xe9\xbc\xa1\x13\xc5\x8f\x25\x04\xae\xe6\xc6\xec\xbe\xef\x3f\x57\x2f\x9e\xff\x5a\x9a\x24\x31\xf6\x6c\x8f\x53\xdc\x4f\x94\x0a\x8e\x7a\xf6\x08\x93\xe6\xa1\x06\xc9\x5d\x05\xa6\xfd\x16\xfc\xa9\x57\xac\x4a\x8b\xfd\x6e\x56\x1e\x58\x77\x54\xfe\x5e\xd9\x32\x2a\x95\x2d\xdb\xac\x85\x74\xe6\x33\x76\xce\x3b\xad\x8b\x9d\x2b\x4b\x56\xda\x6c\xe8\x77\xcf\xed\x8b\x07\x13\x34\xcf\x61\x67\xe7\xf7\x9d\xad\x9d\x2b\xeb\xdf\x9d\xf3\x0b\x69\x2c\xfd\x3f\x3a\x96\x2c\xc7\xbc\x73\xfb\xc6\xbf\xf9\x05\x58\xe0\xa8\xd7\xf9\x77\x6d\x14\x8c\x0c\xb3\xdd\xab\xd1\xb3\xd4\x8e\xdd\xee\x91\x61\x71\x1c\xe2\xbe\x3b\xe9\x74\xdb\x3d\xd8\x0c\xec\x60\x22\x86\x4c\x0f\x3a\xf0\x7b\xec\xc7\x9d\x7a\x9b\xc7\xdb\x78\x60\xc2\x44\xa9\x50\x19\xa2\x34\x5a\x5d\x60\xbc\x85\x2d\x96\xbf\xe5\x58\x90\xbb\x55\x97\x64\xe8\x3d\xa9\x94\xcd\x99\x80\x21\x6e\x4b\x7c\xb0\x17\xc0\x0a\xfb\xcd\xb9\x11\x8f\x94\xa1\x46\xfd\x25\xaf\xe3\xe6\xe6\xbf\x6b\xa3\x71\x34\x30\x6c\xf3\x21\x69\x8f\x9f\x92\xf6\xa0\x4d\xc0\x05\x95\x0c\xdf\x0a\x31\x80\xfb\xae\x8f\x1d\x22\x0a\xbd\xfb\xfb\x4a\x37\x08\x3c\x6c\x83\x64\xf4\x4c\x5b\x51\x3e\x9d\x4e\xc7\xbe\xbf\xaf\xd0\x3d\x5c\x9e\x9e\xee\x5b\xf2\xa7\x64\x38\xf4\x52\xd2\xff\xcf\xc2\xaf\xff\x32\xf9\x89\xb5\xe1\x90\xb9\x97\xa4\xe9\xbe\xaa\xd4\x2a\x5b\x1f\x0c\xdb\xaa\x9b\xad\xae\x69\x35\x40\x11\x0d\x3a\xf5\x76\xb7\x93\x24\x68\x75\xb7\x2a\xad\x0a\x61\x11\x14\x4c\xcd\x8d\xa8\xa2\xb1\x4d\x93\xeb\x9e\xeb\x4e\xbd\x7d\xfd\x83\xcd\xdd\xa1\xae\xb7\xb6\xcc\xbb\x5e\xc7\x3e\xbf\xbe\x60\xaa\xad\xbb\xf5\xc1\xe8\x59\xd7\x66\x7b\xb0\xd5\xf9\xc9\xe8\x59\x7d\x68\xae\x07\xae\xc8\xfa\x9d\x1f\x37\x37\xed\xf3\x1f\x2f\xee\xef\xed\xf3\xca\x3f\xfe\xc1\x07\x67\xe5\xc2\xd2\x8d\xa4\x3e\x14\x6c\x77\xfa\x54\xcb\xda\xa6\x45\x18\x78\x62\xf4\x3a\x76\xcd\x87\xd0\xfa\x66\xcd\x09\x7c\xdc\x36\x7b\x9d\x1e\x75\x7f\xb1\x04\x0f\x5b\x5b\xa6\xa5\x70\x01\xea\x54\x6d\x39\x03\x13\x6d\x6e\x5b\xff\x31\x2a\xbb\x8d\x8a\x55\x39\x67\xd1\x10\xe8\x54\x77\x41\x52\x6d\xe0\x57\x2c\x0f\x5d\x5d\x5f\xe3\x69\x84\xee\x2a\x5b\x6c\x36\x24\x8f\x86\x6d\xd6\xfe\x08\x5c\xdf\xa8\x58\xa8\x62\x6e\x55\x1e\x2a\x2d\x6c\x55\x2a\x26\xd7\x93\x68\x90\x48\xeb\x07\x6a\xd3\x95\xd2\x79\xcc\x98\x23\x65\xbc\xe2\xfa\x00\x26\x9e\x56\xb7\x16\x07\xd4\x2b\xc7\xd8\xdd\x37\x13\xea\x47\x94\x3a\x15\x77\xd6\x68\x5c\xdc\xad\xae\xc5\x64\x7d\x6b\x4b\x96\xea\x63\x65\xc6\xec\xf0\x91\x64\xf5\x3a\xd2\x30\x6a\xdb\x9d\xd9\x44\xdb\x69\xb9\x79\xf5\x3f\x86\x6d\x39\x16\xb6\x46\xb5\x78\x60\xc7\x2c\x6c\xea\x6b\x36\x49\x99\x2d\x56\xc1\xcd\x4d\x83\x4c\x04\x9b\x9b\x46\xb7\xd3\xdb\x32\x9e\x40\xb9\xf7\xf7\xdd\xcd\x4d\x98\x67\xc9\x60\x81\x36\xa8\x54\x5a\xa0\xdf\xa0\x0d\x84\x8e\x3b\xb4\x2a\x7f\x27\x8b\xa3\x1d\xd2\xf4\xe4\x3f\xd8\xb2\x3b\xd9\xa9\xa9\x06\x31\x67\xc8\xfc\xd4\x85\xf9\x89\xd4\xb3\xcf\xe6\x28\x9b\x01\x2f\xb0\x99\xca\xae\xd1\x1f\x0f\xa6\xe5\x70\x35\x20\x35\xf2\xff\x70\x35\x60\xf5\x68\xa3\x11\x93\xa0\x4d\xeb\x82\xc1\x42\x20\x5c\xe2\x7c\x0e\xdb\xdd\xce\xff\x33\xba\xd6\x00\x28\xb4\xa9\x3e\xb0\xef\xef\x89\x7a\xa9\x54\xac\x63\xab\x6b\xb6\xdf\x1b\x5d\xf3\x61\xd9\xc9\xa5\x1f\xda\x57\x74\xc2\xa2\x36\xdd\x49\xe7\xee\x2d\x0f\x15\x7e\x37\xb4\x47\x2d\x79\x9d\x41\x24\x40\x68\x27\x9b\x2b\x11\xbb\x4d\xa5\xe2\xfc\xa2\x4d\xfb\x12\x2c\x29\x92\x98\xcb\xb6\xf3\x60\xf5\x83\xf0\xc0\xee\x0d\x4a\x91\x23\x55\x07\x1a\x09\xa1\x74\x03\x1c\x89\x06\x60\xda\x5e\x33\x7b\xb1\x3c\xaf\xea\x2d\x96\x49\x91\xb0\x0f\xbc\x00\xf3\xc1\x8a\x03\x90\x46\x85\x08\x9d\x52\x59\x9d\xba\x94\x15\xbd\x88\xf2\x5a\x76\x1f\xac\xc0\xf7\x54\x2a\x44\x66\x5f\x51\x23\xa9\xf5\x1f\xa3\xd2\xd8\xdb\xad\x88\xf4\xf6\xc3\x83\x25\x8c\xf0\x56\x6c\x91\x25\x44\xf2\x3c\xb6\x84\xd5\x0e\x36\x7b\xf2\x65\x62\x29\x1b\x50\xad\x77\x96\x0c\xca\x98\x69\x61\xda\x39\x43\xe3\xee\xc1\xb2\x39\xb8\x2c\x1b\xb7\xd6\xa0\x43\x45\x7c\xe3\xba\xc3\x05\x5a\xb6\x7d\xef\x32\x36\xef\x80\xfe\xb2\xae\x3b\xc2\x54\x33\xdb\x19\xfb\xb7\x97\xd8\xbf\x84\x1c\x1d\x57\x64\x0e\x82\x25\x81\x62\x5c\x32\x6b\x37\xfb\xa5\x4d\xd4\xfa\x15\x31\x3b\x25\x0b\xfa\x4a\x6b\x41\x93\xb7\x86\x73\x7e\x75\xd1\x11\xe6\x68\xf7\xfc\xea\x62\x73\x53\x30\xd6\x7f\xd5\x3f\xbf\xba\x68\x91\xb7\xd4\x9c\xb9\x2a\x30\xb0\xaf\x4c\x47\x6f\x60\x5f\x99\x77\x7d\x66\x58\x5f\x99\x6d\x3e\xdf\x51\x03\xfb\x0a\x0c\xec\xbe\xc6\xc0\x96\x88\xf5\x1f\xf2\x8c\xe2\x44\xf3\xf4\x40\xf3\x0c\x98\xd6\x71\xb8\xbe\xb9\x7e\x78\x60\xdd\xfe\xa3\x0d\x7b\x60\x1a\x61\x7d\x57\xeb\xba\xbe\x43\x87\x8e\x6d\xb6\xbb\x40\xb4\x63\x4b\xf2\xa9\x02\x83\xb6\x0e\xac\x0d\xb6\xf1\xde\xaa\xd0\x1d\xc1\x8a\x75\x79\x79\x7a\xf0\xf6\xe4\xe0\xec\xf2\xf0\xc3\xd9\xc1\xc9\x87\xd7\xef\x4f\x2f\xdf\x1d\x5d\x7e\x38\x3a\xbb\xfc\xf9\xf4\xe0\xf2\xe8\xe4\xf2\xe3\xd1\xcf\x97\xbf\x1e\xbe\x7f\x7f\xf9\xe6\xe0\xf2\xc7\xc3\x93\x83\x77\x2d\x06\xcd\x48\xc5\xe1\x88\x1a\xf2\x16\x0d\x39\xd9\x1a\x3e\x3c\x58\xa7\x7c\x59\xd8\x0f\x31\xfe\x13\x1b\x77\xfc\xfc\xe5\xe4\xc1\xb4\xce\x3a\xa7\x9b\x9b\x27\xf7\xf7\xa7\x6d\x35\x36\x73\xe7\xec\xbc\xc2\xd2\x55\x2e\x5e\xc9\x0f\xad\x33\x4d\xbc\xe6\xbd\x95\x6e\x98\x22\x76\x2a\x8c\x7e\x79\x7d\x82\x0e\x3f\xfc\xfb\xe0\xed\xd9\xe1\xd1\x07\xf4\x74\x27\xa1\x3d\x0a\x83\x1e\x86\x80\x6c\x65\xf6\x57\x1d\x7c\x83\xbd\x60\x04\x3b\xc1\xdf\xec\xe6\xea\xc6\xc6\x06\x0b\xe2\x48\x6a\x5e\xc3\xfe\x4d\xed\xc3\xd1\xbb\x83\xcb\x83\x0f\xbf\xd0\xf0\x73\xc9\x2e\x72\x85\xba\x47\x26\xcd\x45\x9e\xab\x49\x2b\x57\xf9\x51\x20\x8b\x4c\xaa\x3f\x33\x7c\xb1\xcf\x66\x25\xb1\xf3\x99\x97\xf0\x39\x4b\x88\x87\xa3\x78\x4a\xa5\x2d\xef\xc8\xb4\xd1\x60\x69\xd9\x56\x64\x6e\xba\xa6\x4c\x93\x3b\x60\xe7\xa4\x86\x8d\x62\x30\xf8\x07\x98\x02\x90\x09\x47\x4b\x6d\xec\xdf\x3d\x76\xca\x71\x76\xf4\xee\xa8\x45\x9b\x9b\xb4\x38\x0d\xba\x85\xba\xb8\x67\x93\xb6\x72\x63\x74\x85\xe3\x88\x85\x8b\xc5\x0e\x72\xc6\xc4\x9e\x43\xdd\xb1\xeb\x39\xec\xfc\x05\x04\xee\x17\x76\xf2\xd6\x41\x55\x2a\x79\xd5\xb6\x08\x31\xf7\xeb\xeb\x93\x0f\x87\x1f\xfe\xd9\x42\xef\x8e\xd0\x87\xa3\x33\x34\xb4\x7d\x0e\xc6\x0a\xfc\xd0\xd2\xd9\xe0\x13\x52\xe6\x46\xc8\x46\xcc\x38\x11\xfb\xbb\x9f\x44\x3f\x18\xb5\x5a\xcd\xfc\x84\xc6\x11\x9c\x10\x82\x14\xd1\x9d\x6e\x10\xcb\x68\x1a\xc5\x78\x48\x68\xd9\xbe\x43\x4f\xe4\x2e\xc9\xd4\x78\x89\xba\x98\x17\x2b\xf2\xf5\x82\x30\xc4\xd1\x28\xf0\x1d\xa8\x9a\xdd\xc5\x1e\x80\xc1\x02\x2f\x87\x31\xb2\xbd\x5b\x7b\x1a\xd1\xb0\x85\x11\x13\xc4\x9d\x1d\x74\xc0\x42\xb8\x43\xfd\x6b\x3f\x32\x33\x86\x76\x98\x4f\xa6\x4d\xf8\xc0\xdf\xa3\x0e\x8b\xaa\x9a\xc9\xfa\xee\xe8\x27\x76\xa0\x73\x12\x04\x31\x91\xf1\x9d\x1d\xf4\xd3\x38\xb6\x63\xc2\xce\x90\x54\xc7\xa0\x83\xfa\xdd\xd1\x4f\x16\x1b\xdf\xaf\x4f\xce\xf8\xcf\x0f\x76\xec\xde\x60\xb3\xc5\x99\xc2\xa1\x4b\x0a\xb4\x3d\xe4\x07\xc1\x88\x11\x60\x53\xa5\x37\x45\x63\x9f\xb4\x99\x2e\xf9\x88\xf4\x61\x04\x97\x02\x68\xa6\xb7\xa7\x24\x19\x49\x77\xe4\x93\x9c\x0c\x1e\xf7\xf6\xf6\x96\x0a\x40\x54\x13\x7d\xfc\x63\x10\x5e\x63\x07\xf5\xc3\x60\x88\xfa\xdd\x3f\xa2\x1d\x26\xdb\x2d\xf2\x71\x10\xc7\xa3\xa8\xb5\xb3\xc3\x8e\x19\x7a\xc1\x50\x1c\x3d\xec\x40\xe2\xae\x17\x74\x77\xf0\xfe\x7e\xd7\x6e\xd6\x6d\xe7\x59\x17\xef\xed\xee\xe2\xee\xb3\xbd\xbd\xe6\x6e\xbf\xd9\xad\x7f\xff\xdc\x79\xd1\xfc\x7e\xb7\xb9\xe7\x7c\xef\xe0\xfd\x1d\x22\xcb\xf6\x15\x8e\x68\xde\x28\xec\xed\x5c\x5e\xf6\x83\xf0\x3a\xba\xbc\xe4\xc5\x26\x2a\x0e\x38\xef\x0d\x20\x1a\xbf\x1b\xa1\x5b\x38\x97\x85\x90\x8e\x81\x87\x6b\x24\x39\x44\x11\xc5\xb6\x43\xd4\x0e\x7f\x0f\xa2\x64\x71\xf9\x71\x02\xe4\x07\xf1\x80\x74\xc7\xed\x00\xfb\xa8\xca\x92\x55\x09\x45\x3f\x88\x51\x34\x1e\xd1\xf1\x91\x88\x6f\x88\x41\xc4\x21\xa2\x98\xdb\x77\x71\xc4\x44\xcd\xa1\x22\xbe\xbd\xbd\x4d\xfe\x9c\xba\x43\xd7\xb3\x43\x14\x07\x92\x86\xe9\x8e\x63\x44\x84\x15\x79\xc1\x15\x19\x04\x5c\x4d\xb8\x7d\x46\xc3\xa7\x87\x1a\xbc\xf4\x21\x8e\x93\x72\x7b\xb6\xcf\x0e\x9f\x1d\x42\xd5\x0b\xae\x90\x1b\x45\x63\x1c\xd1\x08\xbd\x62\x12\x90\x8f\x4e\xe0\x5b\x2f\x74\x01\xd4\x93\x50\x1a\xd9\xf1\x20\xaa\xa1\x13\x3c\x0c\x6e\x48\xc9\xa4\x58\x2f\xb8\xba\x22\xbf\x61\x7c\x91\xb1\x98\xe8\x5a\x95\x16\x8c\xb6\x6b\x8c\x47\x5c\xe3\x47\xf6\x10\xb2\xbb\x3d\x68\xcd\x7e\xe0\x79\xc1\x2d\xd0\x84\x2f\x40\x90\x96\x48\xc7\x16\xd8\x34\xc1\xed\x71\xe8\x06\xa1\x1b\x4f\x7f\x15\x5a\x52\x09\xa2\xfc\xd0\xde\xd8\x20\x1a\x9e\xc6\x49\x70\xfd\x58\x97\xae\x0f\x1e\x67\xdc\x53\x5e\x5c\xa1\xb9\xa4\xd7\xa6\xd2\x16\x18\xc4\x6d\x24\x2a\x93\x9a\x58\x90\xea\x25\x6a\xa0\x57\x34\x03\xbd\x68\x5c\x37\x2d\x74\x79\x0d\xd7\xce\x1a\x6d\xfa\xeb\x07\xf8\x4e\x1f\xe4\x0b\xc6\x70\x12\x06\x29\xd8\x3d\xe8\xc4\x30\xbb\x84\x10\xd2\x1b\x92\xd3\x3f\xe0\x05\x87\x57\x87\xbe\x83\x27\x48\x00\xac\xc0\x71\x22\x3b\x08\xeb\xa0\x2a\xab\x63\x0b\x55\xd1\x16\xa2\x95\x4b\xb6\xd1\xbe\x8b\x76\xae\x2c\xb5\x91\xd4\xeb\x04\xc0\x0f\x2f\x63\x6b\x8b\x97\xcf\x2e\x08\x48\x51\x5d\x99\x7c\xc3\x9c\x5a\x15\x5b\x46\x12\x72\x90\x3c\x7e\x0c\xc6\x9f\x74\xcf\x00\xa1\x38\x9c\x8a\xc4\x3b\x3b\x44\xdc\xd1\xaf\xd8\xeb\x05\x43\x88\x6a\xe7\xe0\xee\x98\x4a\x13\x55\x61\x30\x1a\x78\x5a\x10\x63\xaa\xcb\x6f\x6d\xa6\x76\x7d\x1a\xa6\xb7\x17\xf8\x37\xd8\x77\xb1\xdf\xc3\x28\x0a\xa8\xc7\x05\x77\x48\xa1\x67\x84\x64\x0e\x8b\x6d\x1e\xbe\x8f\x90\x8b\x03\xd4\x77\x7d\x87\x0e\x1d\xdb\xf3\x22\x37\x66\xbe\x1a\x30\xc5\x39\x34\x13\x1f\x63\x90\x3a\x24\x63\x94\xba\x07\x88\x50\xb5\xf4\x90\x32\x55\x55\xd4\xb3\x21\xaa\xcc\x84\xc8\xe3\x06\x82\xe0\xdf\x68\x96\xec\x8a\xf1\x6b\x21\x55\x3c\x49\x07\xd0\x37\x70\x1f\x49\xb4\x7b\xd2\xec\x69\x76\xaa\x9f\x18\xdf\x59\xa2\x16\xaa\xd5\x6a\xa4\xc3\xcd\x4f\x7c\xc2\x93\x75\x09\x91\x9f\x2a\x17\x2c\x2e\x96\x55\xa5\x0b\x01\xe2\x4c\xd0\x4d\x98\x50\x46\x51\xb3\xdc\x30\x6a\xa2\x97\x70\xfb\x90\xfe\xde\x46\x4d\x69\x20\x11\x12\xcd\x36\xfb\x49\x87\x12\x7f\x54\x6f\xeb\x8b\xe1\x04\x14\xb2\xe3\xa9\x99\x05\x57\x93\x15\x03\x0b\xd0\x2a\x9a\xd5\x42\xe7\xb4\xa9\x2e\x6a\xbd\xc0\xef\xd9\x70\x34\xad\x86\x5d\x68\x6f\x3c\xe4\xa9\xa3\xbf\x37\x50\x47\xf3\x9a\x59\x95\x8e\xeb\x90\x17\x70\x4e\x49\x8f\x14\x7f\x0c\xc2\x9f\xfd\x21\x3d\x2f\x16\x2b\x69\x1a\xa5\x5b\x72\x2e\x23\xdd\xf3\x21\x08\x46\x06\xb8\x3f\xf5\x0e\x45\x1c\x6c\x88\x01\x1d\x52\xdc\x42\xd2\x22\x77\x42\x3b\x48\x67\x6f\xa8\x83\xd4\x7c\xf2\xc1\x5c\x5b\xca\xc1\x8a\x67\xb7\x75\x64\x0a\x9b\x9b\x20\xa0\x22\x0c\xba\x7c\xaf\xe7\xfe\x5e\x4e\x0a\x47\xe7\x80\x32\x57\xa5\xab\x2f\xcf\x8e\xa2\x6a\x52\x0a\x93\x34\x7a\x41\x57\x2d\x72\x0b\x55\x6b\x44\x00\x93\x4a\x25\x1a\xa8\x64\xcb\x9d\x27\xe4\x2f\xd2\x7a\x4e\x16\x62\x3e\x3e\x58\x5c\xe6\xea\x77\x11\x18\x8e\x2d\xf4\xd6\xf6\xe9\x24\x4b\x8f\x38\x91\x8d\x58\x11\x08\xfc\xa0\xc6\x7e\x4c\x27\x3b\x56\x5e\x8d\x8e\x18\xd0\x4d\xe3\x88\x9a\xaf\x43\x6c\xfb\x11\xd3\x3f\x9e\x87\x1d\xf4\x5d\x64\x98\x28\xf0\x11\xd1\x46\x9c\x63\x3d\x09\x30\x6e\xfd\x60\x3b\x18\xd5\x7e\xf7\x7f\xf7\x8f\x3d\x6c\x13\xab\x84\x45\xbf\xc5\xc9\x24\x4b\x1e\xbe\x8b\x24\x22\x55\x59\x16\x52\xbf\xe5\x46\x66\x62\xbc\x40\x73\xf2\x38\xfd\x10\xb7\x38\x09\x14\xcd\xf9\x26\x1c\xd9\xdd\x28\x0e\xc1\x0c\x3d\x3e\x04\x36\x49\x8d\x69\x3b\xc2\xf1\x7a\xe2\x0a\x03\xa2\x41\x24\x9a\x16\xfe\x3f\xe4\x2b\x73\x35\x66\x81\x1d\x9e\x22\x88\xe1\x1c\x11\xd3\x0a\x9c\xf8\x82\x10\xac\x1a\x50\xcb\x50\x25\xd0\xd8\xa2\x72\x08\xd6\x0a\xc0\x7e\x6d\x43\x09\xff\x90\x88\xe1\x43\x6a\x1c\x80\x3b\x9f\x88\x1a\x7f\x8b\xd1\x2d\xb1\xb3\xe2\x00\xc5\x38\x8a\x39\x15\x1e\xe6\x81\x9d\x88\x3c\xa0\xb3\x70\x0c\x68\x7a\xac\x34\x8b\x1a\xf0\x28\x20\x5c\xde\xba\x11\x16\xc5\x87\x41\x8c\x7b\x31\x05\x04\x82\x88\xda\xbe\x0d\x01\x89\x9f\xee\x6c\x20\x94\x78\x89\x48\x73\x80\xca\x1e\x17\x60\xc6\x01\x5b\x27\x20\xf4\x00\x0e\xc9\xa2\x9d\xc0\x69\x21\x4a\xda\xba\xc6\x96\xe3\xd4\x39\x0f\x84\xb9\x4b\xaa\x79\x13\x10\x53\x1c\x2c\x55\x17\x9a\xeb\xda\x27\x33\xe8\xad\x1b\x0f\x28\xa1\x1e\x0e\x63\xdb\xf5\xe3\x29\x9d\x07\x6f\xc9\x0c\x80\xd1\xd3\xa7\x7e\x10\x3f\x7d\x4a\x6c\x41\x9b\x2c\x35\x50\x1c\xda\x7e\x64\x53\x9f\x2c\xc8\x48\x73\x7f\x0c\xc6\x68\x68\x4f\x45\x1b\x42\x20\x79\x3a\x89\x92\x22\xc9\x78\x20\x05\xb2\x28\xce\x64\xc6\x77\x30\x1e\xe1\x10\xd9\x64\x75\xc9\xbd\x51\x19\x27\xbc\x57\xab\x11\x0d\x57\x8d\x06\x76\xc4\xcc\x75\x07\x0c\xe1\x4f\xdc\xdd\xe3\x13\x58\x03\x3c\x7c\x3f\xef\x7c\x4a\x06\xda\x01\xec\x4e\xf2\x9d\xb6\x00\xfa\xa4\x8d\x8d\xfd\xc9\x02\xb2\xdc\x4f\x93\xa6\xa5\x54\x3e\x09\x6e\x7e\x75\x3d\x8f\x25\x07\x93\x35\xf9\xf2\xce\x75\xd8\x07\xb9\xfc\x79\x25\x90\x36\x0d\xed\xb7\x10\x53\xc7\x87\x94\x30\xbf\xe2\xc2\xf2\x00\xf5\xed\xda\xbd\x6b\xf4\x96\xaa\x19\xbb\x1f\xe3\x50\x1d\x10\x54\x20\xd2\x03\xe2\x15\x3d\xba\x7b\x90\xb4\x04\x22\x5a\x9b\xfb\x6c\x92\xd7\x44\xcb\x09\xb9\x64\xdb\x31\x94\x75\x32\xb8\x39\x41\xf0\x79\x96\xa5\x5a\xe3\xdc\x94\x2b\xde\x96\xa8\x41\x76\x1e\x43\xf9\x53\x5e\x55\x72\xc8\xa1\x96\x49\x6a\x3c\x30\xcf\xa9\x08\x11\x01\x64\x55\x02\x21\xaa\xa1\xd7\x74\xc9\x2e\x6c\xc2\x20\x94\x05\x29\x0e\xd0\x70\x0c\xd2\x46\x93\x27\x72\xcd\xfa\x24\x26\xcb\x71\xf4\x29\x09\x46\xfd\x89\xd8\x9f\xee\x90\xe4\xea\x7a\x58\x15\x3d\x1c\x62\xba\x12\x53\x20\xc3\xd2\xf9\xb9\x57\xb0\x3b\x1c\x62\xc7\xb5\x63\x2c\xa6\x1e\xc7\x42\x51\x40\x89\xd9\xbd\x1e\x8e\x22\xd2\x25\x6a\xd9\xb4\xc3\x59\x6f\xd1\xdd\x12\x1c\x0f\x02\x07\xc6\xa1\xf0\x92\xc1\x28\xf0\x1c\x8a\x4e\xb2\x66\xe1\x0c\x58\x2c\x6c\x22\x83\x1e\x8e\xa9\xf3\x1a\xfa\x80\x27\xb1\xd2\xa2\xdf\x96\x2c\x2b\x8e\x78\x45\xc2\x2c\x57\x7a\x51\xd9\x0e\xa5\xc2\xb4\xc2\x7d\x8a\x63\x62\x23\x44\xe3\x6e\x84\xe3\x94\x74\x83\xba\x03\x7d\x8f\x27\x6e\x14\x47\x62\xbb\xee\x72\x84\x61\x13\x8b\xf6\x07\x8d\x1c\xfe\x14\xf1\x0a\xb3\x8c\x23\xea\x70\x4c\xa8\x0f\x71\x08\xab\x30\x32\x9b\xc7\xf8\x8a\xcd\x07\x6c\x5b\xc1\xbe\xb1\x5d\x8f\x88\x3b\x5d\xb1\xe1\x11\xa5\x36\x12\x70\xed\xe8\x76\xe0\xf6\x06\x08\xa6\x69\xbf\x3f\x26\x72\x5b\xfb\xff\xec\xfd\x7b\x5b\xdb\xc6\x16\x28\x8c\xff\xfd\xe3\x53\xc8\x3a\xdd\x46\x2a\x83\x03\xa4\xb7\x48\x55\x39\x04\x48\x43\x73\x21\x05\x92\xb4\x9b\xcd\x8f\x8c\xa4\xb1\xad\xda\x96\x5c\x49\x86\xb8\xd8\xdf\xfd\x7d\x66\xad\xb9\xca\x32\x21\x69\xf7\x39\xef\x79\x9f\xb3\x9f\xdd\x60\xcd\xfd\xb2\x66\xcd\xba\x8f\x90\x27\x1e\x7f\x9c\x16\x15\x73\xac\xe1\x14\xa5\x93\x16\xf9\x66\xed\xa0\x60\x11\x5b\x13\xf2\x44\x3e\x39\x3e\x98\xff\x55\x80\x3b\xa5\x65\x9d\xd1\xb1\x01\xb7\x22\x45\xdc\x42\x18\xe9\x0f\x46\x94\xa2\x46\xfd\xbf\x0e\xd7\xaf\xff\x51\x60\x56\x46\xa3\xf7\x00\xb2\xb9\x08\x5f\x0a\xc7\x12\xa9\x0a\x18\xde\x58\x6a\xb1\xef\x53\x20\x69\xf9\xb6\x81\xed\x2d\x2b\x2b\x45\xd1\xc2\x52\x20\xe0\x89\x97\xef\xa9\x41\xe2\x02\xf1\xa8\x86\xad\x2d\x87\xc5\x1b\x23\x52\xa9\x2f\x16\xb4\xc4\x41\x6a\x23\x41\x19\xb1\x3b\x94\xa9\xa2\x02\x72\x3a\xfc\x97\xca\x29\x59\x9f\x17\x37\x64\xf6\x21\x3a\x7c\xbd\xe7\x60\x95\xf1\xd5\xc9\xfe\x42\xd3\x63\xe9\xa5\x25\x3a\x05\x22\x02\x54\x17\x8c\x8e\x9d\x22\x67\x42\x4e\x9e\xff\x01\x94\xa0\x10\x2d\x63\x63\xe2\x9d\x30\x80\x45\xd3\xaa\xd2\x89\x54\x6b\x8b\x45\x2b\xa5\x0c\xfc\xa7\x5a\x80\x7b\x8c\x74\x25\x23\x29\x96\xfe\x3e\xe4\xd1\xbc\x1a\xd5\x65\x08\xa2\x3a\x2c\xf3\x59\x57\xa1\xe0\x0e\xfe\xa1\x6b\xf0\x9f\xbd\x04\x3f\x35\x36\x10\x08\xf1\x25\x30\xc9\x4c\x3e\xc4\x72\x96\x3b\xd5\x3c\x4f\x86\x65\x91\x17\xb3\x6a\x3c\x47\x61\x30\xb0\x3f\x73\xe8\x91\xdd\xb0\x5c\x3c\x2a\x17\x33\x27\xa6\x75\x32\x04\x91\xeb\x00\xb8\x98\x9e\x03\x8b\x98\xd0\x5c\xe2\x5b\x4e\xb7\xa3\xdb\x11\xca\x58\x15\xc6\x40\x1a\x5c\xac\x0b\xfb\xc8\x12\xf0\x2c\x02\x5a\x5a\xe2\x02\x3e\x42\x39\x40\xe0\x1d\xc5\x73\x76\x1b\x82\x84\xe6\xd7\x51\x2a\xa7\xfb\x9e\xd7\xa4\x06\xee\x50\x28\x3f\x35\xdb\x21\xa6\xaf\x92\x60\x60\x25\xc1\x3e\x2d\x32\x8e\xb3\x72\xde\x1c\xda\xe3\xd7\xb3\x92\x39\x1e\xc8\xba\xcd\x55\xf1\x7b\xce\xc9\x4a\x2b\xca\xbf\x67\x36\x85\xab\x43\xc0\x96\x46\x86\x4a\x6c\xe3\x78\x15\x0e\xc5\x3e\xda\x3e\xbf\xa9\x58\xc5\x70\x1b\x95\x4c\x3b\xcd\xfa\x7d\x8e\xd6\x6b\xde\x1a\x68\x1a\x00\x3e\xbe\x56\xd7\x1f\xb8\x76\xa9\x79\xf3\x4d\x32\xa6\x06\xe0\x23\x9c\x97\xd0\xe3\x95\x1f\xe1\x98\xf5\x8b\x12\x41\xbf\x8d\x5b\x20\x40\xfe\x03\xb0\xe5\xec\xd6\xb1\x47\xcb\xb3\x24\x6e\x51\xcc\xc7\x9c\xf1\x46\x11\x58\xaa\x6c\x90\xe3\xa2\xc3\x40\xc5\xfe\xd8\x77\xd1\x42\xdf\x21\x9f\xba\x94\x0a\x63\x72\x35\x1c\x15\x47\x4a\xb9\x8a\x74\x96\x30\x27\x7f\xc8\x45\x26\x34\x41\xea\x42\xfb\x8c\xeb\xac\x92\xf0\xa7\xaf\x32\xcd\xee\xda\x8c\xf0\xd7\x8f\x5a\xf1\x96\x02\x62\x53\x20\xda\x7e\x0f\x21\x5a\xef\x48\x91\xb4\xb5\x38\x10\x2f\x0b\xd7\x0f\xc2\xbc\xad\x2d\x23\x3b\x81\x52\x8d\x6c\x74\x91\x82\x67\x04\xa4\x4e\x51\x4a\x89\xe4\x30\x85\xac\xa8\xa6\x23\xe4\xbb\x85\x89\x5d\xd1\x17\x4b\x01\xf5\xe2\x31\x03\x14\x22\x04\x20\x45\x69\x1e\x3e\x24\x91\x10\x3b\xdd\xdf\x44\x6f\xd3\x77\x02\x15\xf6\xcc\xbe\x29\xda\xbd\x21\xd6\x5e\xe0\xd6\xad\x6c\x5c\x0b\xff\x88\x00\xe1\x0b\xc5\x07\x30\x80\x7f\x4a\x74\xf0\x77\x05\x07\x5a\xa0\xf5\xb7\x84\x06\x5f\x20\x32\xf8\xfa\xb3\x0e\x9c\x00\x29\x21\x08\xe3\x58\xfe\xf3\x8f\x9c\xc1\x45\xdb\x6a\x08\xeb\x9c\x3d\xc8\x49\xc6\x04\xb1\x06\x73\x6e\x40\xd9\x11\x9b\x96\x2c\xe1\xf8\x81\x13\xaa\x95\xc4\xe5\xfc\xb7\x52\x4b\x02\xdf\xe2\x14\x39\xd2\x87\x59\x22\xf4\x40\xf0\xc5\x10\x33\x57\x59\x9e\xc0\x1a\xdf\x32\xe7\x16\x00\x74\x9c\x8d\x04\x2f\x22\x3a\x00\x27\x49\xe2\xdc\xb2\xcd\x92\xc1\x26\x0e\x0a\xa1\xc3\x99\x14\x37\x98\xeb\x14\x37\xac\x94\x18\x98\xb7\x36\x29\x52\x56\xe6\x4e\xac\x88\xd3\x9e\x73\x82\xfa\x5f\xde\x90\x83\xba\x01\x87\x72\x72\xae\x06\x6b\x16\x78\x1d\x96\x1f\xde\xac\xef\x64\x1c\xdc\x90\x3e\x41\x38\x7a\xa4\x54\x90\x6a\x50\x29\x4c\x34\x92\x3a\x1d\x2d\xfd\xbb\xdc\x54\x1f\x9b\xc4\xd9\x54\xbd\x4e\xe8\x88\x39\x15\xbf\x5f\xf9\x89\x18\x33\x38\x9e\x40\xbb\x25\x65\x06\x04\x03\xfa\xb2\x09\x66\x0a\xb4\x39\xac\x42\xa5\x2d\x48\x94\x6d\x18\x44\xd9\x2e\x6f\x6b\x5a\x02\x8d\xe2\x4c\xd8\xa4\x28\xe7\xce\x98\xd1\x51\xd5\xdb\x14\xcf\x2c\x95\x16\xb7\x7b\x69\x33\xa4\xc4\xd9\x3c\x63\x7d\x30\xf3\xc2\x4b\x15\xe4\xd1\x1c\xc7\x55\xcc\x20\x44\x84\xde\xdc\xab\x18\xc3\x91\xdc\xa7\xe8\x47\xcf\x42\xd4\x45\x3f\x7a\xbc\xf7\xf8\x3b\xbf\xb7\x79\x85\x4a\x16\xb9\x82\x7c\xe9\x25\xf4\x64\x45\xde\xa6\x3c\x43\x92\x0f\xe5\xdd\x59\xde\x2f\x24\x87\x22\xec\xbb\xb0\x0d\x65\x97\xd7\x72\x1e\x88\x63\x36\x21\x15\x07\x03\x56\x07\xad\x9a\xd3\x36\x6d\xde\x57\xbb\x4d\x75\x02\xb8\x85\x6b\xb0\xcf\x72\x67\x3a\xa6\x59\xee\xfc\x42\x6f\xe8\x39\xec\xa2\x0d\xe0\x3d\xe7\x5f\xd5\x26\x4e\xe0\x72\xe7\x4a\xfc\xd8\xbd\xb2\xe2\x99\x03\x3d\xab\x94\x55\x5a\xb3\xa5\x55\xb6\xb0\x72\x4a\x1b\xd7\xcf\x81\x83\x04\x2d\xbf\x09\x8a\xa6\x76\xd1\xce\x69\x5a\x31\x62\x0b\xc6\x5b\x3f\xeb\x76\x44\x94\x24\x8d\x9e\x2e\x31\xf9\xca\xd4\xa0\x19\x0a\x84\x7f\x88\x1f\xb4\x8c\x54\xef\xe7\x09\x1f\x3d\x72\x8e\x66\xd3\x71\x86\xbb\x02\x14\xe3\xa1\xd1\xea\xff\x87\x79\xc6\x55\xee\xf9\x68\x36\x99\xcc\xc1\x6e\x62\xc3\x4e\xd3\x47\xc3\x89\x9c\x96\x03\x83\x56\x65\x53\x73\xd5\xdf\x18\x35\xac\xed\xb0\xda\xe2\x04\x73\xb3\xfb\x70\xa3\xbd\xa1\x9e\xad\xc5\xb4\x1a\x05\x8b\xa9\x03\x20\x8c\x68\xee\xb0\x8f\x75\x49\x1d\xdd\xcf\x1f\xb3\xc9\x54\xc2\x51\xc5\xc4\xe1\xae\x7a\x1b\xc2\xae\xcf\x6b\xef\x8f\xb4\xcd\x74\xfd\xe8\xda\xbc\x2b\x95\x9a\x4c\x2f\xb6\x6d\x26\xfd\x7f\x61\xb3\x1d\x36\xc1\xd0\xc5\x5a\x29\x13\x9e\xec\x35\x7c\x00\x40\xad\x69\xaa\x01\x51\x76\xb3\x7f\x0f\xa4\xd6\xf4\xb8\x0e\xa6\xd6\x0d\xf0\x7e\x9f\x58\x05\x5e\xeb\xaa\x8b\x97\xec\xa3\x95\x6b\x6b\xbd\xd7\xac\x45\xa6\xbd\x60\x6c\x5a\x71\x22\x3d\x19\x29\xb1\xa3\x60\x0d\xc1\xe0\xdb\x90\x9e\xd8\x19\x52\x09\xac\xf9\xf9\xdb\x61\xa1\x98\x88\xdb\x1c\x82\xaa\xa8\xcc\x0a\x49\x28\x8a\x4c\xb6\x36\x43\x8c\x19\xea\xd7\xc5\x26\x49\x72\x4a\xe9\x8c\x4d\x63\xee\xa6\xc2\xd8\x96\x7a\x3a\xff\x13\x76\xad\xf9\x3c\xbf\x92\x88\x4a\x0f\x61\xe0\xf7\x60\x05\xc0\x1d\xc6\xba\xfb\x54\xf4\xe1\xb5\x8e\xc3\xa1\x8c\xd0\x23\x9c\x5b\x14\x29\x5b\x53\x14\x5f\x43\xf7\xc2\xae\x1d\x18\x52\x08\x65\x52\x1b\xb2\xa7\x1c\x0c\x35\x45\x7d\xde\x5a\x5e\x94\xce\xb4\x18\xcf\xfb\xd9\x78\x4c\x78\x51\xce\x3a\x21\xe5\x80\x6e\x76\xc0\x6b\xf3\x7e\xc0\xde\x8e\x95\x60\xaf\x92\x27\xac\x87\xeb\x74\x7c\x70\x78\x71\x7d\xfc\xf2\xf8\xd5\xf1\xeb\x8b\xeb\x8b\xdf\xdf\x1c\x83\x51\x8a\xe5\x83\xd3\x64\x83\xbb\x5d\x91\x71\xc9\x29\xf8\xcd\xab\x95\x04\x6f\xd3\x72\x23\xdd\x04\x0b\x8f\x9d\x8f\x8c\x26\xdf\x8b\x95\x3b\x3b\x3e\x3f\x3e\x7b\x77\x7c\x74\xfd\xe6\xec\xf4\xcd\xb9\xd8\x1b\x88\x95\x2f\x83\x6a\x95\xac\xaf\x3f\x84\x33\xb4\xf9\x8d\x2e\xd1\x90\xa2\xf6\x43\x58\x1e\xf3\xe5\x7e\xc1\x24\xa5\x75\x3e\x2c\x6e\xf3\xb0\x99\x7f\xc6\xfa\x76\xbe\xc6\xc0\x43\x8a\xfe\x05\x67\xac\xef\x25\x45\xde\xcf\x06\xa6\xb9\x0c\xbc\x7d\x6b\xed\x2a\xba\x75\x60\x49\xd0\xca\xf4\x37\x7d\x3b\x7a\xbf\xe0\x03\x14\x7c\x0c\x58\x6d\xd4\x3f\x62\x48\xa4\x17\x65\xa3\x11\x5e\x4e\xd2\x6c\xbc\x5b\xd1\x4c\xb7\x2b\x1a\x94\x12\x5c\x31\x91\x96\x58\xbe\xca\x0a\xc0\x20\xfb\x36\xf0\x3f\xe9\x94\x0a\x3d\x72\xa4\x0f\x86\x7a\x06\xad\xb8\x6c\x59\x92\x17\x6c\xfe\x25\x4b\x32\x62\xf3\xbf\xbf\x24\xd0\xc8\xff\xc2\x25\x19\xb1\xf9\x7d\x4b\x82\x89\x2f\xd8\x9c\x8f\x59\x74\xf7\x33\x8c\x41\xde\xd9\x86\xd9\x13\x8e\x43\x5a\x34\x1d\xc4\xc5\xac\x3e\x90\x12\x6a\x34\x6e\x5a\xe5\x1b\xc0\x74\x6e\x3d\x44\xeb\xa9\xad\x2f\x63\x58\xe1\xb4\xdb\x31\x05\xce\x87\x11\x9b\x7f\x50\xda\x3a\x20\x12\x7a\xce\x45\x39\x17\x3c\x30\xf2\xa9\x4a\x68\x21\xde\x14\x00\x3e\x2d\xcb\x9d\x0f\x6a\x6d\x3e\x08\x5c\x8c\x4b\xc8\x52\xc0\x5b\xf3\x62\xe6\xe4\x0c\x31\x9c\x68\x48\x19\xec\x42\x13\x20\x9a\x05\x91\x90\xd0\x4d\xc1\x25\xa3\xf1\x3e\x81\x26\xc4\xad\x30\xa5\x38\x10\x30\xe2\x54\x62\x5c\x6c\x08\x87\xed\x49\xd6\xb1\x1f\xf7\x26\x0c\x99\xc5\x6d\xb1\x3a\xdb\xe8\x33\xb6\x69\x6f\x8b\x65\xa6\xe7\xb4\x6f\x4e\x03\xa4\x8c\x35\x6d\xe7\x17\xc5\xee\x03\xbc\x4a\xe6\x10\x58\xc3\xd6\xd6\x91\x91\x46\x90\x9b\x95\xfc\x2a\x17\x38\x0d\x19\xb4\x55\x88\x3b\x63\xfd\xbf\x0b\x71\x67\xac\xff\x20\x88\x6b\xe0\xc8\x56\x88\x6b\x94\x79\x08\xc4\x95\xac\xff\x7f\x21\x6e\x2d\xc4\x9d\xb1\xfe\x97\x42\x1c\xbf\x34\x3e\x01\x71\x67\xac\xff\x69\x88\x93\x92\x5e\x74\xd1\x93\x1a\xb2\xba\x70\xd0\xc3\xc4\xa1\x40\x45\x8b\xc8\x50\x78\xc5\x0b\x29\x70\x5e\x38\xe3\x22\x1f\xb0\xd2\xa1\x29\x27\x5a\x2a\xa1\x63\x80\x95\x06\xae\x7d\x0a\xb1\x5b\x73\xe2\x54\x85\x70\x89\x00\x79\x10\x6f\x50\xca\x72\xb3\xba\xe7\x1c\x8c\xab\x82\xf0\xe6\xa4\x62\xbe\xe8\xa3\x65\x23\x08\xf3\x38\x60\xdc\x16\xe5\x48\x89\xdd\xc0\x06\xcf\x91\xfe\x88\x4e\x3f\x63\xe3\xd4\xa1\x03\xca\x6b\x0b\xd2\xa4\xd7\x2f\xca\x55\xba\x84\xf7\x29\x9b\xcd\xfa\x20\x2e\x46\x1f\x0d\x30\xae\xc4\x29\x0a\x7a\xac\x29\x78\xfd\x7a\x09\x54\x52\x23\x69\xc4\xe6\x66\x0a\x2a\xe6\x17\xd2\x64\xa0\x64\xfd\x46\x79\x4e\xd7\x38\x07\xce\xd7\x35\x9b\x4c\x8b\x92\x96\xf3\xaf\x85\x60\x03\x85\x94\x35\x4b\x6a\x47\x58\x28\xdd\x02\x19\x08\xfa\xcc\x0f\x0e\x0a\x22\x35\x50\x0a\x55\x16\x73\x3e\x00\x7d\xfd\x01\x85\xe1\xe8\x56\x64\x39\xda\x82\x20\x18\xe4\xc3\x44\x99\xbf\xdf\x22\x5d\x4d\xd1\x76\xb8\xc7\x39\x3d\x29\x5d\x1f\xb0\xda\x29\x33\xf0\x6b\x41\xc2\x9d\xe6\xa9\x94\xfb\x39\x38\x3b\x3c\xd1\x15\x6a\x86\x68\x59\x16\xb7\xa0\x5b\x13\xe8\x45\xe8\xb8\x68\x05\x90\xc1\xff\x8a\x19\xf0\x54\xd1\x64\xc9\xd4\x31\x25\x82\xda\x95\xea\xc0\x1c\xe0\x47\xfa\xde\xe4\x4e\xcc\x86\xf4\x26\x2b\xca\x5e\x73\x1d\xd1\xcd\xef\x80\x73\x0e\x79\x21\x83\xc3\xa2\x9e\xc4\xa3\x69\x8a\xec\x27\x45\x85\xc2\x34\x1b\xa3\x8d\xa8\x32\xc3\xf4\x01\x00\xf2\x94\xb3\xd2\x60\x34\x91\x8d\x59\x0e\xc3\x19\x67\x39\x73\x64\xa0\x5d\x11\xa0\x12\xaa\x81\xc0\xad\x9c\x50\xa9\x9b\x30\x47\x03\xf3\x6a\xa4\xc1\x29\xdd\xb0\x39\x0f\x93\x59\x91\xfb\x63\x62\x66\x64\x09\x47\x6c\x4e\x38\xe8\x10\x80\x16\x22\xe6\x4a\xb0\x17\xa1\x49\xd4\xf8\x9e\xa9\x76\x10\x13\x48\x6f\x08\xce\x63\x50\xf0\x9a\x99\xa1\xaa\x29\xcf\xfe\x9c\xb1\xf1\xdc\xc9\x52\x96\xd7\x59\x7f\x8e\x4a\x14\xba\x02\xf8\xd0\x8a\xf2\xf5\x6d\xe5\x18\xc8\x86\xec\xea\xe9\x2c\x1b\xd7\xdb\x59\x6e\x9a\xf8\x00\x8c\xc5\x0c\xf6\xbf\x40\xb4\xcb\x8c\xa6\x31\x7c\x22\x4c\x15\xbe\x81\x0d\x18\xc9\xab\x11\xf8\x80\x52\xa2\x2d\xf4\x27\x16\xca\x53\xd5\xe9\x19\x4b\x8a\x32\x6d\x30\x94\xe8\x8e\x57\x65\xf1\x18\xad\xa0\xe1\x14\x28\xb5\x3f\x53\x87\xda\x71\x1c\xe1\x9d\x2c\xb7\x4d\xb8\x60\x18\xcb\x07\x5a\xe4\x0c\x03\x85\x3a\xfd\x31\x05\xfc\xa0\xf9\x50\xb0\x7d\xc8\x6e\x18\x9c\x9c\x29\x2a\x79\x8a\x5c\x56\x47\xe9\x00\xec\xb8\x13\xd3\x64\x84\x32\xca\xa2\x64\xc6\xf9\x83\xc3\x87\x8e\xc5\x46\xac\x48\x84\xdf\x9e\xb5\x8d\x42\x8f\x2d\x8e\xa0\xd0\xc7\x52\xe7\x3d\xa3\xa3\x57\x74\xea\x14\x68\xc4\xc4\xe6\x70\xaa\xb2\xc9\x14\xe7\x09\x02\x65\xd9\x4e\x52\x4c\x26\x85\x72\xc6\x5b\xe7\xcf\x85\xdd\xca\x75\xba\xc6\x11\x0b\x13\x11\x39\xa0\x02\x15\x0f\x7c\xd1\x69\xa9\x5c\x71\x04\xdc\x54\x0e\xa3\x55\xc6\x4a\x14\x83\xb0\x0a\x16\x7f\x3a\x2b\xa7\x45\xc5\x2a\x50\x94\xf0\xca\xb2\xad\xba\x65\x91\xf3\x22\xdf\x66\xf9\x6c\xc2\xe0\x9a\x72\x3c\xc4\x80\xd3\xa2\x82\x5d\x25\x42\x31\x8a\xb7\xb5\x6c\x27\xcb\x93\xf1\x2c\x65\x0e\xbb\x61\xe5\xdc\x8a\xed\x77\xcb\xc0\x22\xa3\x16\x7a\x0f\x5f\xe0\x3f\x86\x97\x07\xc4\xe9\xe3\x97\x8a\x6a\x68\x90\x17\xfc\x06\xcb\xc4\x06\xb4\xdf\xbd\xf6\xfa\x10\xa0\x30\x32\x50\x6c\x6f\x12\xd3\xd3\xc9\xb8\x6c\x45\x98\x68\xcc\xd2\xd3\x6b\x64\xdc\x96\x59\xad\x2f\x67\xa2\x58\x27\x7c\x36\x8e\x97\x34\xa4\xf8\x30\x60\xb8\x4a\x38\x56\x15\xb8\x90\x03\xc0\xd1\xf1\x3b\xd4\xc9\xea\xe3\xf8\x80\xd9\x10\x67\x13\x18\xee\x7f\x6c\x0a\x56\xb2\x98\x03\xef\xa0\x39\x85\x8b\xdb\x42\x42\x5c\x25\xa8\x0d\x74\xfb\xbe\x2d\x8c\xbb\x4e\xdc\x87\x82\x4a\x8b\xd1\x13\x33\x4b\x59\xc9\x14\x14\xb0\x3f\x67\x74\xdc\x0a\x78\xc2\x18\x83\x95\x60\xb4\xc1\x81\x62\x98\xa5\xe0\xa4\x0c\x57\xa8\x98\x8c\xb2\x57\x7f\xc0\x42\xc1\x6a\xff\x77\x97\x0a\xba\xb0\x16\x8b\xd3\xea\x56\x3c\x02\x4d\x9d\xdb\x61\x0a\x24\x80\xe2\x2d\x11\xde\x57\xc6\xd2\xb9\x68\x7e\x58\xe4\x5a\x82\xbf\x43\x41\x09\x02\x31\x80\x7e\x81\x9a\x28\x94\x37\x99\x0c\x19\x9d\x41\x5c\xe2\xf9\x14\x15\xcf\xe7\x8c\x29\x67\x5e\x20\xc7\xfe\xa8\x20\x26\x2f\xc4\x0b\x45\x0a\x9a\x4e\x33\x88\x15\xfa\x3f\x10\x04\xd4\x65\x61\xaa\x70\xec\xf0\xb5\x78\x51\x4a\x59\x81\x94\x55\xea\x4b\x91\xcf\x1e\x7d\x84\x36\xc4\x8d\x01\x31\xd5\x53\x30\xff\xad\xe0\xa8\x80\x04\x57\x78\x60\xc8\x2a\x95\x46\x78\x10\x14\x0a\x58\x75\x08\x6f\xb5\x21\x1f\xd9\xeb\x37\x52\xe0\x14\x36\x92\xf0\x3c\xca\xc4\x0d\xdc\x3d\x1c\xac\xd3\x91\x36\x24\x96\x2c\xa5\x29\x80\x32\xdd\x93\xfa\x28\xb4\x17\x62\x9b\xa6\xb7\x5d\x8b\xa8\x46\x57\xc6\x09\x6c\x82\xdf\x94\x92\x72\x58\x1e\xa4\x62\xf8\x22\x17\xe5\x6e\xb6\x27\xa1\xb3\x0f\x03\x76\x02\xbb\x10\xb6\xa2\xa6\xaa\xf3\x44\xca\xa7\x9a\x80\x62\xa1\xbe\xd1\x27\x34\x03\xe6\xc7\xa0\x23\xf8\x2e\x21\x29\xc7\xd9\x3b\x80\x37\xdc\x24\xbc\x27\xa1\x2e\xa8\x32\xe5\x6e\x83\x4b\xb2\x21\xae\x7a\x88\xb0\x4a\xd6\xf5\x9d\x6e\xd7\xe9\xd8\x72\xca\xa6\xb2\x53\x95\x35\xe5\x4c\x30\xa4\x4b\x99\x75\xa5\xd6\x42\x27\xb5\x49\x9f\x10\x2c\x65\xd0\x22\x79\xcb\x43\x2c\xed\x7a\x08\x6e\x66\xda\xc5\x52\x1a\x94\x15\x15\x22\x79\xa0\x69\xfb\xac\x2c\x59\xea\x14\x39\xe7\xb8\xe4\x85\x9a\xb3\xdb\xf1\x1c\xa8\x3e\x54\x11\x99\xcb\xd5\x13\xd0\x29\x0f\xcb\x4b\xf0\xbb\x6c\x71\xc5\x74\xb6\x9d\xbd\x50\x02\x6d\xa3\xb0\xf9\x90\xa2\xad\x27\xe0\xf3\x56\x2a\x03\xf5\x54\x5c\x4b\x1b\x3f\xe9\x16\xd4\x70\xc0\xe9\x53\x39\x7f\xda\x15\x04\x96\x6a\x7d\xa0\xd9\x2a\xd8\x78\xa9\x59\x37\x8c\xcf\xab\x69\xbf\xcf\xcc\xd9\x72\xf6\xae\xcc\x83\x64\x02\xcb\x1a\x2c\xdb\xc4\xa1\xba\x79\x7f\x75\x7f\xd7\x2d\x0e\x94\x0f\x0d\x00\x38\x63\x55\x31\xbe\xd1\x9a\x35\xc1\x34\x28\xbf\x6a\x0e\x94\xab\xe1\x87\x8c\xe5\x6b\x3c\xc7\xb1\x1a\x90\xa8\xfd\x94\xb4\x35\x27\xdf\xb8\x6f\x80\x73\xbb\x57\x71\x1b\xdc\x9b\x8d\xde\x0f\xfd\xa6\x24\x99\xe3\xa8\xc5\x82\xe3\x39\x7b\x20\xd2\x3e\x0f\x16\x52\xb1\xfa\x91\xed\x5d\x0e\x26\x7a\x76\x89\x4e\x14\xb5\xf2\x2c\xcd\xa7\x2e\xed\xd7\xe7\x44\x65\xd4\x1a\xda\xea\x8f\x7d\xb1\xaa\xb6\x57\x2b\xa4\xe5\xe2\x63\xf3\x6d\x0e\xe6\x6e\x9b\x0e\x32\x36\xda\x26\x43\xcc\xd0\x7e\x37\xf0\xf3\x64\xc9\xab\x4f\xfe\x61\xb3\xd6\x8a\xe9\x66\x1f\x2a\x30\x6c\x7b\x49\xd0\x59\x95\x8e\x9b\x37\xfc\x27\xf8\xd3\x15\x1d\x9c\x0c\xb6\x25\x79\x56\x53\xda\x74\x26\xc9\x08\x6d\x9e\xca\x59\x23\x61\x96\x5a\x35\x38\x0b\xb0\xee\xf8\xdb\x84\x05\x5a\x27\xcd\x45\x58\x20\x4d\x5a\x8c\x8b\x9c\x1d\xe4\xa9\x70\xe6\xe1\x37\x69\x31\x96\xe1\xa6\x08\x47\xaa\x2f\xe4\x0e\x72\xc0\xc9\xd9\xad\xe6\xdd\xad\xe5\xd1\xb5\x30\x32\x96\xa8\x4a\x1c\x23\x03\xd6\xcd\xf8\xbe\xc6\x35\xb4\x52\x24\xbf\x6f\xa4\x09\xde\xdf\x48\x92\x4b\xaa\xb7\x4a\x0f\xcc\x5c\xe8\xc3\x31\xdc\x25\xf7\x52\x6e\xe0\x87\xa3\x24\x09\xb4\x92\xb6\xff\x25\x92\xd2\x45\x86\xe2\xb0\xcf\x5b\x72\xde\x6f\x3b\x29\x67\x04\x7e\xd3\x94\xf5\xc3\x89\xb9\xd3\x32\x1b\x64\x9c\xbb\xc6\xeb\x8d\x5f\x89\x49\x31\xcd\x56\x28\x39\xa9\x7b\x87\xf7\x34\x57\x57\xed\x61\x64\x21\x92\x50\xb2\xba\x20\x9f\x34\x29\xc8\xf4\xb6\x0a\xb3\x89\x73\x4e\x41\x81\xfd\xbc\x6c\x1c\xac\x12\xd1\xcd\x40\xea\xc2\x55\x66\xcf\x26\x23\x99\x09\x15\xb2\x41\xa4\xa8\x5a\x9a\x34\x17\x12\xd4\xbe\xf9\x38\x1b\xb1\xf1\x5c\x58\x70\xd7\xb4\x1c\x30\x61\x88\x41\x05\x91\xa0\xc4\x61\x92\xa8\x80\xe7\x95\x70\x39\x2b\xa3\xa3\x22\xa6\x31\x27\x25\x9c\x18\x35\x6e\x42\x56\x56\x94\xda\x15\x17\x9a\x9b\x31\xa5\xf9\xb7\x69\x5f\x66\x43\xb3\xda\x3b\x58\x01\x29\xed\x53\x13\x22\x7c\xec\xac\xaa\x60\x55\xb3\x0a\x2c\x30\xcb\x2c\x4d\x59\x2e\xda\x2d\x84\x4e\x9f\x59\x07\xe2\xef\x12\xd7\x7c\x75\xb3\x31\x0a\x75\xaa\x9a\xd1\xb1\x30\x67\xe9\x6b\xf9\xea\x94\x96\x4a\x6e\xb4\x8e\x1a\x77\xd4\xf0\xd6\xa2\xc0\x7f\x98\x6c\x5f\x47\x32\x8b\x75\x63\x68\x2c\x2b\x33\xab\x56\x72\x41\x33\x96\xcc\x40\x5a\x9c\xe2\x30\xbf\x5b\x29\x0f\xa7\x49\x77\xac\xad\x61\xce\xfb\x7f\x3f\xad\xae\x41\x65\x1d\x85\xc3\x5b\xb6\xe6\xd6\x59\x47\xff\xdc\x4b\xbf\x7d\x29\x91\xd4\xfa\xc6\xf2\xc3\x39\x8c\xf6\xbb\xfc\xff\xf2\x1a\xff\x6f\xe2\x35\x1e\xc2\x19\xb4\xd1\x5e\xcc\xa2\x2c\x1e\xa4\x23\x30\xc9\x80\x77\xac\xd4\x21\xc5\x84\xa2\x44\x2b\xbd\x0c\x9d\xd7\x67\x5d\xf2\x59\x05\xf2\x4f\x7d\xcd\x6b\x3f\x05\xa9\x03\x93\xcc\xfa\x7d\xd1\x32\x3e\x60\xa1\x0f\x38\x22\x68\xd2\xb6\xe5\xd5\xee\x0b\x06\x1d\x61\xc7\x05\xf5\xb0\x0d\xdb\x9e\x0d\xa9\x7a\x31\x5d\xcb\x03\x08\x5f\x5a\xe3\xc9\x1d\xe1\xd6\xa3\x93\x6c\x76\xa3\x8d\x99\x50\x46\x89\x18\x8d\x8f\xc5\xb3\x81\xc0\xfa\xcf\x4a\x64\x28\x54\xac\x31\x78\x87\x4d\x2a\x29\xa4\xaf\x34\xea\xb2\x6f\x31\x00\x1e\xa8\x0e\xda\x1b\xea\x0d\x98\xbc\x4e\xce\x6b\x9a\x8c\x4c\xa1\xd2\xfa\x1a\x50\xf4\x80\xdf\x9e\xe9\x6c\xd2\xaa\xfa\x07\xe0\x9e\x4c\xc7\xf2\xca\xfa\x64\xc7\xfa\xb2\xe0\xd5\x56\xa2\x84\xf1\x44\xcf\x8a\x04\x65\x84\x33\x0e\xad\xb0\x48\x27\x17\xc7\x67\x07\x17\xa7\x67\xd7\xe7\xbf\xbf\x7a\x7a\xfa\xf2\xc1\xc6\x67\xea\xbd\x03\xb4\xed\x7a\x76\xf0\xf6\xb7\xeb\xd5\xb6\x36\x75\xe8\xf5\xcd\x10\x14\x54\x28\xf7\x15\x8d\x57\x53\x96\xf4\xfe\x0f\x30\xca\xfb\xef\x9a\xe4\xe9\x3e\xdf\x9c\x9e\x5d\x1c\xbc\xfc\x67\xbb\xc4\x97\x1f\x8c\x1e\x29\xf6\x78\x7e\xfc\xe6\x00\x76\x8b\x6f\x53\x6f\x53\x24\xbe\x7d\x6a\xa5\x07\x46\x0c\xd0\x63\x88\x0c\x8f\xd1\x38\x4b\x3a\x05\xb2\xa8\x2a\x84\x7b\x59\x45\xfb\xca\xbb\x84\x62\xd8\x4f\x9a\xd4\x59\xda\xd0\xda\x4b\x4f\x79\x5e\x17\xa9\x62\x8c\x37\x2f\xfc\x10\x25\x46\x92\xc5\x40\x57\x89\x05\x78\x95\x86\x1b\x81\x08\x55\x3f\x32\xb9\x41\x4c\x3b\x63\x03\x88\xc0\x27\x9e\xa5\x08\xad\xcc\xf2\x65\x51\x8c\x66\x53\xa5\xa1\xdd\x8c\x36\x03\x67\x33\xda\xd9\x44\xb1\xff\x66\x00\x9f\x7b\x9b\xa6\x63\x8b\x18\x04\x86\xc2\x77\x22\xc7\x03\x6a\xd0\x0a\x0f\x6f\xf4\x6c\x46\xf0\x9b\xd0\x3a\x19\x36\xa2\x03\x59\xe3\xb8\x84\x12\x70\x27\x2d\x2d\xfe\x71\xf3\x2b\xde\x87\xd5\xb3\x79\x83\x60\x94\x86\x0b\x56\x09\x34\x46\x39\x17\x32\x18\x4b\x9b\x1a\xd0\xfa\xe7\x0e\x3c\x24\x8c\x5a\x4a\x4e\x57\x64\x35\x9b\xe0\x1b\x80\xca\x30\x47\x98\x4c\x08\xcb\x10\x23\x7e\xa3\x88\x3b\x05\x16\x2c\xaf\x28\xd0\x95\xc2\x7a\x0f\xb2\x67\x15\x2b\xc5\xc3\x77\x9c\x6c\x3e\xb6\x17\x1e\xde\xf9\x08\x9b\x7b\xf5\xd6\xae\xe3\x81\xa7\xb0\x79\x43\xe0\xba\xa2\x03\xb1\x5c\xd8\xf5\x1d\x11\x67\xf3\xab\xee\xa3\x4d\x5f\x21\xb3\x37\xa7\xa7\x2f\xaf\xcf\x4f\xfe\xcd\x4f\xcf\xee\x0e\x82\x74\x5d\xd2\x1b\x56\x56\xec\x10\x0d\xed\xdf\x14\xfc\x2c\x39\xd6\xfb\x23\x03\x06\xc9\x2c\xbd\xb0\xcb\x7a\x13\x3a\x3d\xc3\x47\x0a\x1c\xf5\x42\x01\x71\x26\x74\x2a\x23\xf9\xc2\x87\x28\x8d\x13\x01\x59\xd9\x6a\x97\xf2\x4d\x13\x03\xe1\x37\x4a\x81\x9d\xd1\x6a\x3d\x7c\xfb\x04\x35\xf5\x76\xb6\x78\x3f\xc1\x89\x1c\x35\xcc\xf6\x72\x6a\xe8\x4e\xa4\xa7\xd1\x5e\x94\x2f\x09\x36\x28\x67\xd8\x5e\x4e\xfb\x2f\xe8\xf9\xaf\x2b\x39\x03\xc9\x8c\x08\x86\x29\x29\x01\xbb\x94\x41\x36\x5a\x07\x45\x5f\x6b\xf0\x64\x8b\x9e\x28\xd1\xac\x99\x78\xc2\xc5\xd8\x20\x91\x07\x4f\xba\x58\x9b\xa5\x35\x84\xf0\xc8\x8b\x31\x76\x9d\x35\xcb\xeb\xc0\xd9\xc1\x9b\x53\xc5\x4f\x53\x90\x52\x32\x08\xf3\xd6\x84\x93\xc6\x74\x84\x3f\xe6\xba\xed\x92\x97\xf0\x7d\xfb\xb4\xae\x8c\xd8\xa0\x75\xd9\x7a\x5f\xd6\x97\x30\xf6\xe3\x7e\x60\x75\x7e\xd4\x07\x4a\x02\x6e\x2b\x88\xce\xaa\xe1\xca\x12\x34\x63\xcf\x29\x42\xf4\xeb\xa5\x22\xde\x35\x13\x54\x97\x0c\xf4\xc8\x35\xcd\x84\xdf\x82\xaa\xd0\x91\x97\x41\x4e\x27\xec\xbc\x78\x46\x4b\x2b\xce\x0a\xbf\x49\xa6\xb4\x1e\xf2\xab\xa8\x4f\x1b\x55\xd7\x38\xe7\x62\xcc\x86\x42\x3a\x0c\x03\x76\x64\x34\x19\x0a\xd4\x09\xe1\xce\x7b\xcd\x41\x37\x8f\xeb\x5b\x41\xa7\xa0\x99\xa2\x36\x46\x82\x08\x9f\xb3\x01\x3c\x09\x0b\xe6\x0d\x58\x4f\x44\xe5\x15\x61\xcf\xad\xdb\xae\x83\x44\xc9\x12\xa8\x20\x41\xa0\x80\xc1\x9d\x58\x9c\x2c\x17\x51\x51\x67\xb1\x8e\xa3\xae\xe5\xb4\x62\x5c\x07\xe3\xb1\x5c\xce\x13\x4e\xfe\xc9\xea\x44\x2f\x9c\xe9\xfd\xdb\x0a\xb2\x80\x96\xd0\x53\x47\x86\x91\x55\x8c\x9d\xa9\x06\x69\x11\xfb\xeb\x74\xc1\x4e\xa8\x50\xb3\x8f\x1e\x39\x07\x3a\xba\x17\x8d\x8b\x1b\xe4\x65\xa7\xac\x94\xcf\xd0\x56\x00\xae\x28\xd5\x31\x58\x31\x45\xad\x6e\x34\x78\x52\xe8\x08\x98\x04\xab\x67\x84\x94\xc6\x70\x70\x41\x79\xa2\x7e\x08\x1c\xe3\x17\x0b\x43\xc3\x2c\x1f\x83\xa8\x01\x64\x4c\x16\xfb\x85\x26\x3f\x18\x23\x52\x18\x09\x15\xd3\x3a\x9b\x64\x7f\x09\x81\x1b\xf8\xb7\x83\x05\x23\x84\x5a\xa6\x49\xed\x3c\xcb\xf8\xf6\xd1\x31\xa7\x8c\xa0\xe1\x0a\x37\x0f\x83\x27\x73\x7a\xb3\x12\x01\xa3\xa5\x49\x04\xf8\x60\xa9\xe1\x1a\x0c\x91\x9c\xed\xa7\xf8\x1f\x7b\xbe\x0f\x6c\xc0\x20\x35\xe5\x46\x49\xe0\x68\x9e\x65\x2d\x04\x26\x72\x43\x4f\x84\x23\x35\x70\xaf\x18\x9e\x3b\x1b\xa7\x44\x84\x9a\x01\x79\x04\x3f\xa3\x54\xb8\x5c\x83\xfb\x3e\x27\x1a\xa7\x68\x50\x22\x09\x13\x65\x3b\x53\xc8\xa7\x97\x37\x2b\x34\x27\xc1\x18\xe6\x22\x5c\x76\xcb\x99\x18\x88\x40\xee\x8e\x63\xe0\x05\x98\xff\xa6\xb3\x6f\xd0\xb6\x5b\xfc\x72\x57\x0c\x1f\x88\xf7\xd4\xb9\xd8\xf1\x9d\x40\xd7\xf6\xad\x0b\x6a\x57\xc1\x9d\x92\x54\x84\x4a\xe1\xf0\xb1\x96\x01\x4f\x41\xc6\x8a\xc7\xf2\x50\x21\x56\xe4\x31\x67\x68\x82\xa1\x46\x6c\x3e\xa2\xa0\x23\x78\xa8\x23\x6d\x35\xad\xaf\x81\xfb\xe6\x66\x0c\xde\xd9\xb2\x48\x77\x75\x5a\xed\x87\x92\x94\x2c\x7f\x25\x9a\x76\x8b\x64\x45\xbe\xbd\xd5\x22\x5a\x31\x04\x3e\x97\x99\x92\x76\xc9\xc1\x83\x9b\x9f\x35\x8f\x35\x9b\x40\x9c\x4c\xa9\xbd\xac\x45\xdc\x8a\xee\xc7\x6a\x44\x75\x70\x1f\x46\x33\xcc\x69\x4c\xd2\x02\xa6\x2b\x78\xd2\x67\x1c\xcb\x34\xb9\x56\xe3\xe0\x5c\x36\xf2\xae\x20\x80\xae\xcc\x6c\xe3\x79\xaf\x56\x02\x71\x9b\x7d\x59\x2c\x9c\x5e\x54\x2d\x5d\x7c\xf4\xc8\xe1\x34\x37\xc7\x92\x33\xa9\x07\x02\xda\x1b\x22\x63\x60\xbf\x96\xf8\xb4\xd1\xba\xda\x3c\x96\xd7\x65\xc6\x2a\x5b\x42\x2a\xfd\x01\x9a\x94\x3d\x71\x36\xdf\xb6\x76\x85\x5a\x0c\x15\x1a\x5f\xbf\xc4\x20\x14\x1b\x73\xb0\xf4\x06\x8b\xfc\x59\xce\x3e\x4e\xd1\xd1\x14\x09\x9d\xaa\xe7\x1c\x16\xf9\x0d\x2b\xc1\x1e\x13\x4c\x46\x2a\xf6\xe7\x8c\xe5\x09\x7b\x04\xa3\x8e\xc7\x70\x89\x8f\xd8\x9c\x89\x36\x6c\x25\xa3\x88\x4d\xd0\x03\x3f\xfb\x07\x4a\x57\x3c\xdf\x50\xa4\x3a\x6d\x2c\x8c\xe9\x1f\x61\xca\x67\x95\xc9\x97\x86\x0e\x27\x32\x36\x4f\x88\xbe\xe5\x09\x0a\x8d\xf2\x55\xcd\xa6\xe6\x77\x96\x69\x7a\xd7\x71\x6e\x87\xd9\x98\x39\x5e\xc7\xe3\xc5\x8c\x26\xad\x87\xe5\xcc\x7d\x92\x47\x8c\x97\xc7\xb7\xe6\xf4\x78\xbf\xe4\x8c\xf1\xf3\xab\x5b\xf8\xaf\x1d\x34\x25\xe4\xd6\xe2\xdf\x95\x4b\xc9\x76\x42\xa3\x5a\x24\xb6\xb9\x19\xae\x9c\x05\x33\x5b\x7a\x97\xf0\xbb\x18\x80\x49\xb8\xce\x52\x27\x29\xc6\x63\x86\x94\x90\x81\x6d\x09\x0a\x22\x24\xff\x2b\xfc\x57\x10\x9e\xf8\xc7\x83\xc1\xc9\x9e\x9b\x2d\x46\x57\xd2\x00\x54\x0d\x19\x22\x70\x38\x9d\x2b\x21\x89\xd0\x62\x05\xf5\x9a\x79\x51\x0b\xc1\xaa\x61\xf1\x8d\x3b\xef\xc1\x4d\x11\x38\xff\xaa\x7c\x84\xfd\x66\x7f\x7c\x41\x1b\x0f\x08\xf2\x8b\x61\x73\xf5\xf5\x40\x3e\x2e\xf3\xfd\x40\x05\xbe\xf8\x8c\xe0\x26\x71\x36\x7d\xbe\x34\xcb\x4d\x27\x68\x74\x43\xd4\xfa\xaf\xb1\x4b\x34\x01\xc9\x92\x4b\x08\xe8\x30\xb0\x88\x74\x1f\xe6\x54\x4a\x96\xe0\xa3\x1a\x53\x96\xe0\x1b\xe0\xb4\x72\x3e\xd8\x42\x78\x0c\xd5\x03\x91\x5e\xe0\x61\x23\x20\xa6\x62\x66\xd4\x11\x24\xb6\x43\xeb\xba\xcc\xe2\x59\xcd\xaa\x40\x08\x9a\xb6\x9d\x0f\x2d\x10\xed\xb5\x78\x52\x43\x74\x7d\xff\xc3\xc3\x2a\x8d\x59\xbf\x7e\x43\x73\xa6\x32\x75\x6d\xe9\x60\xfd\xa1\x71\x2c\x50\x7a\xae\x03\xc6\x29\x2d\x84\x92\x3a\x73\xce\xc1\x98\x8c\x08\x8b\xc4\xf2\x3a\x2b\x0d\xb6\x01\xc2\xb3\x35\x9e\x04\x41\x6b\x70\x9a\x24\xb3\xc9\x0c\xdf\x3a\x87\xf8\xb8\x34\x9f\xa3\xfb\x0c\x9c\x40\xde\x8d\xf2\xfe\x91\x5c\x0f\xae\x28\xbc\xa6\xc0\x79\xd9\x1b\xba\xea\x59\x73\x0f\x87\xa6\xd4\x49\xf7\xf3\x58\x17\x8a\xb5\x9a\x4d\x35\x87\x02\x03\x53\x5c\xd6\x27\xf9\x2b\xf9\x17\xac\x88\xd5\x62\xfc\x77\x19\x27\x83\x38\xfc\x04\xa7\xd4\xe0\x46\x2c\x3d\xb7\x18\xde\x4e\x53\x7f\xf4\x69\x4e\x6d\x73\xf3\x7e\x3c\xab\x4f\xd9\xcf\x2c\xe7\xd7\x08\x73\x28\xca\x61\x6b\x11\x83\x95\x43\x16\x3a\x94\x80\xc9\xa6\xe9\xe1\x8f\x5e\x77\xfc\x16\x6e\x73\xa6\xd2\x05\x0f\x8c\xdf\x18\x61\x11\x0c\xbd\x05\x77\xee\x50\xf1\xf8\x93\x14\xc8\xaa\x46\xe4\x66\x64\xf0\xfc\x09\x3e\x82\x22\x41\x1d\xdf\x1d\xea\x5b\x95\xa5\x13\xa2\x8c\x6c\xd8\x2a\x02\xb6\xb7\x6c\xe5\x8a\xd3\x8e\x83\xd0\xab\x8e\xcb\x51\x20\x6f\xc6\x6f\x20\xe0\xcf\xf8\xea\x80\xca\x00\x4d\x35\x6e\x99\x11\xb8\x2c\x1e\x67\x79\x3a\x9e\x5b\x8e\x57\x2c\xaf\x66\xa5\x34\xab\x10\x4e\x22\x18\xfa\x36\x1e\x17\xc9\xc8\x99\x16\x9c\x41\xc9\xe8\x58\x06\x56\x3c\x3e\xc7\x50\x59\x1b\x8d\x57\x58\x54\x2c\x88\x26\x6f\xa6\x72\x4c\x85\x97\xd6\xb2\xa1\xff\xb3\x05\x57\xf8\xd8\xd3\x38\x4b\xb2\x1a\xa5\xb6\x4d\x89\xb2\x67\x55\x17\x22\x18\xe4\xd7\x26\xba\x1e\xf8\xb5\x95\x13\xe0\x79\xc5\xf3\x59\xb8\x65\x82\x37\xa9\x58\xad\x61\x16\x72\xac\x47\x60\x6d\xaf\x58\xf1\x24\xe7\x39\x88\x9e\x01\xaa\xbd\xb8\x28\x46\x2f\x18\x9b\xc2\x25\x22\xc9\x08\xcb\x27\x56\x08\xb1\x8c\x82\x20\xd7\x6a\xc8\xe7\x1a\x25\x54\xa0\x94\x0d\x14\xed\x29\x5b\x04\x83\x45\x25\x8d\x1a\xe2\xb9\x58\xe3\xdc\x9c\x00\xf5\xc5\x2a\x85\x75\xbf\xf8\x92\x92\x67\xe8\x73\xf4\xb3\xa8\x91\x51\x44\x7a\xbf\xe0\x09\x43\xe3\x12\x51\x51\x3e\xc5\xba\x3e\x9b\xe5\x89\x22\xe4\x10\xc2\x1b\x91\x3a\x39\x7a\x14\x8d\x38\x63\x46\xfb\x1a\xbb\xfe\x2d\xa9\x9b\x7a\x73\xef\x6b\xde\x71\xed\x2f\xcd\x11\x35\x50\x87\xc8\x69\x43\xdc\x76\x56\x03\x01\xcb\xcc\x55\xe4\x6b\xf4\x45\x1a\x6d\x3c\x18\xfd\x5a\x26\x09\x1b\xeb\x44\xee\x6b\x45\xff\xf0\x00\xa6\x83\xff\xde\x37\x1c\x53\xc6\xda\x7e\x93\xac\x1e\x91\x76\x12\xfa\x81\xb2\x65\xfb\xfc\x4d\xe8\xd4\x68\xf8\x24\xaf\x0b\x59\xaf\xed\x18\xc2\x1f\xcb\x7a\x52\x09\xa5\xcd\x83\x53\xb6\xcb\xd8\x1b\xa5\x5a\x05\xee\x7f\xe3\x58\x8b\x11\x4d\x40\x4a\x74\x28\x98\xa0\xcf\x3d\xe9\x6d\x62\x0f\xa3\x45\x25\xf9\x98\xd0\x29\x5f\xac\xf7\x59\x3d\x7c\x21\xe7\x71\x22\x1c\x43\xcd\x0a\x44\xac\x90\x5e\x3b\x62\xbf\xe5\xd8\xfe\x9a\xaf\x6d\x06\x63\x4e\xa9\xc5\x26\xae\x61\x38\xd1\x36\x5c\xa7\xb1\x2c\x2d\x36\xb2\xe6\xa0\xb5\x3d\x1d\x5f\x21\x27\x2e\x44\x34\x5f\x51\xc8\x47\xef\xdf\x71\x8a\x6c\x02\x4a\xd9\xe6\xc2\xc5\x8b\x38\x7f\xcc\xaa\xda\xa1\x95\x6e\xa4\x05\xbe\x15\x29\x9a\x16\x70\xd0\x0b\xc9\xdb\xac\xc8\x29\x34\xf8\x6c\x59\x2b\x01\x37\x5c\xb7\xeb\x78\x1d\x64\x7b\xa4\x64\x45\x45\xfe\x68\x94\xf5\x9d\xfd\x35\x5a\xc4\x95\x82\x5b\xce\xe6\x23\xce\xd1\x6c\x02\x77\xa3\x80\xde\xb6\x87\xe0\xbb\x8a\xaa\x0b\x73\xc1\x57\x55\x3e\xf7\x42\x8a\x3e\xe5\xc0\x68\x12\x67\x2a\x74\x84\x00\xf8\x2a\x18\x72\x43\x3d\x9d\xaa\xf3\x84\x7c\x2f\x1a\xfa\x43\x52\x03\x3c\x9a\xe5\xdb\x17\x00\xeb\x8a\x79\x7f\x21\xbe\x13\xe3\xb7\x3a\x6c\x4e\xe3\xd3\xb8\x6e\x2d\x3a\xfa\xfb\x28\x4f\x5c\xe0\x20\xc6\xf9\xdf\x79\x69\x4f\xe8\xb4\xed\xc2\x36\xf4\x8c\xf2\xc2\x06\xa3\xb0\xff\xdd\xb7\x36\xc7\xc9\x7c\xa0\x13\x3a\x55\x56\x09\x4d\x7f\xf9\xa4\xe5\xe6\x36\xe6\x63\x13\xe6\xd2\x90\x4c\x3c\x90\x2b\x06\x22\x5f\x80\x28\x4a\x70\x04\x85\xee\x8a\xbe\x12\x05\xda\x17\xff\x84\x4e\xdb\xee\xc9\xd5\x23\xf3\x85\xd7\xbc\xba\xd4\x2e\x41\x1c\xfb\xc0\x13\x2c\x11\xbd\xb8\xf3\x57\x20\x5f\x74\x58\x0a\x4d\xbb\x61\xd2\x8f\xd1\x5a\xdb\x79\xd0\x4f\x40\x28\x44\x20\xfe\xe7\x81\x14\x2e\xc4\x2f\x86\x26\xb9\xd5\xf7\xb3\xd7\x8d\x4d\x85\x2e\xdb\x18\x69\x73\x43\xd7\x73\xc2\x46\x8d\xb5\xf7\xeb\x6b\x45\x93\xd9\x91\x52\xc6\xb4\xae\xc1\xc6\x4b\x4d\x4f\x86\x9e\x78\x20\x5a\x80\x0b\x71\x03\x1e\xda\x46\x9f\x0c\xcb\x70\x86\x4e\x79\xf1\x52\x3c\x75\x50\xb2\x6d\x14\x59\x9b\xeb\xf0\x37\xb7\xab\x2e\x84\x3a\xcc\x92\x4f\x14\x0d\xad\xcd\x2a\xd1\xf6\x37\xe0\xfb\x61\x44\xcc\x5a\x98\x17\x85\xf1\x69\x81\xac\xac\xa4\xf0\x12\x04\x04\xed\x32\x59\x20\x3a\x6e\xb4\xdd\x2b\x2a\x0a\x31\xa8\xa0\x7c\x0c\xa7\xc8\x99\x6e\x08\x03\x4a\xc8\xa6\xfe\x81\x65\xe6\x5d\xb4\x84\x44\x54\x61\x1a\xa8\x1c\x32\x88\x05\xd4\x46\xd0\xaa\x9a\x4d\xe4\x90\x1b\x66\x56\x03\x56\x57\x68\x3e\x05\xb2\x3c\x0e\x2f\xc5\x8c\x97\x42\x6d\x67\x49\x54\x54\x4e\xa1\xee\x55\xcd\x8b\x38\x33\xe6\x1b\x0f\x18\xad\x47\xbd\xcc\x47\x6f\xe9\x5c\x3a\x3d\xd4\x59\x32\x1b\x83\xae\xa1\x9c\x25\x20\x70\x68\x9c\xc4\x56\x63\x5f\xfb\xb8\x9b\xfb\xa2\xda\xb1\x4f\xbc\xa9\x81\xc1\x73\x8f\x9b\x0b\xf4\x22\xdf\xa0\x0f\x66\x89\x0f\x0a\x71\x98\xaf\xc3\x5b\x4d\x1b\xf0\xcc\xeb\xa3\x84\xc0\x86\xe8\x4e\x83\xfe\xd5\xb9\x6d\x71\xfd\x31\xa6\xce\xa1\xb9\xa5\x8e\xd2\x3c\x81\x62\x00\x8c\x0a\xf4\x3e\x59\x81\x92\xc4\x3d\xdb\x88\xd3\xbf\x72\x95\x08\x73\xb2\x14\xe2\xe0\xc5\x3a\x9c\xac\xb4\x26\xd6\xe6\x7d\x18\xa5\xc6\x32\xf7\xd6\xf1\xbf\xa4\x21\xdf\x7f\x72\x54\x08\x80\x1e\xc2\x5b\xf1\x52\xe4\x84\x9b\x27\x3c\x75\xf6\x9d\x4d\xc7\xa3\x18\xe5\x0a\x93\x7a\xfd\x6c\xcc\x78\x9b\xfa\x95\xe0\xff\x7f\xef\xeb\xcb\xff\xfc\xe7\x3f\x8f\xae\x1e\x11\x41\xe3\x6e\x06\x46\x85\x71\x96\xb3\xd7\x88\xae\xb7\x9c\x4d\x9f\x53\xc2\x6a\x60\xd8\x81\x8c\xed\x10\xa3\x6a\x44\xe7\xca\xf2\x9b\x32\x20\x7c\xab\xe8\x8d\x17\xf5\xfa\x59\x2c\x03\xe1\x1a\x66\x23\x90\xda\x43\xa7\x4b\x5b\x14\xb6\x62\xa6\xd1\xb8\xc8\xa5\xa3\xe6\x72\x5d\xb5\x15\xc5\xa9\x51\x71\xad\x3b\x68\x68\xbb\x4f\xa2\x45\x89\x89\xc6\x34\x34\xbf\xc3\xd0\x21\xf8\x2c\xb6\x7c\x5e\x4b\x1c\x63\x87\x96\xa0\xbe\xa7\x0a\x90\xb4\xf3\xa2\x88\x83\x22\x23\x8f\x20\x4e\x44\xf7\x0b\x29\xe1\x2f\xcc\xa8\x3b\x3d\xf5\x0e\x67\x96\xd7\x2c\x17\x0e\xf5\xf8\xe0\x08\x70\x55\x00\xd3\x59\x0e\xd1\x43\xf0\x81\x12\x11\x68\x43\x45\x9d\x81\x58\x4a\x15\xc7\x57\x09\x2e\x10\xc8\x38\x45\xac\x97\x31\xcd\x07\x33\x3a\x60\x15\x0a\xff\xa9\x7a\xdb\x1c\x63\xa9\x7c\xfd\x48\x3f\xba\xad\x62\xe8\x88\xb9\x67\xf9\x40\xfb\x52\x2a\xcb\x76\x11\x30\xf2\xc8\xf2\xd0\xd5\x47\x40\x86\xaf\x30\x38\x5a\x15\x04\xc9\x26\xd9\xf4\x89\xf8\x1f\x70\xfd\x08\xa5\x5f\x43\x63\x58\xf4\x75\x10\xa5\x16\xab\x9e\x66\xb6\xb0\xef\x69\xe9\x83\x93\x1d\x9f\xea\xa2\xb7\x16\x2c\x9b\x01\x38\x7a\xda\x93\xd8\x68\x6d\xa5\x19\xb4\xae\x79\x76\x76\xf0\x73\xab\xb3\xb3\x1c\x1c\xa2\xb1\x67\x25\x1d\x80\x3d\xb8\xd5\xee\x3d\xfd\x37\xe1\xdc\xca\x5b\x41\x2c\x56\xb4\x3b\xbd\x91\x0f\xf3\x47\xa8\x84\x83\x83\x54\xcd\x02\x2d\xbe\x16\x5e\x6c\xcd\x6e\x8e\x30\x62\x03\xcd\x7d\xb5\x4d\xf5\xb9\x74\xde\x5b\x5f\x5c\xb9\x1b\x0a\x95\x36\x8c\x74\x2b\x5a\x83\xaf\x05\x8e\xbe\xaf\x39\x0b\x7f\x8b\x70\xa6\x36\xb6\x83\x1c\xdf\x12\x21\xa8\x6e\x1f\xac\x4c\x86\xcd\xd9\xb4\xec\x8c\x2a\xe9\xcd\xa1\x77\xa8\x15\x82\xfe\x31\x77\x80\xbe\x04\x39\xed\x10\x10\xab\xae\xdf\x1d\xbc\x3c\x39\xd2\x5d\xcb\xe8\xc0\x39\xbb\xe5\x7c\xb7\x77\x79\xb9\x29\xef\xc8\x4d\x02\x96\x14\x57\xc4\xb9\x14\xa1\x36\xe1\xf3\xca\x5f\xe7\x58\xf2\x19\x53\x78\x80\x6b\x09\xb4\xf6\x20\xe7\x12\xeb\x06\x3b\x62\xc9\x98\x62\x78\x21\x78\x7d\xdd\xd8\x1a\xc9\x6e\xae\x75\x19\x35\xcf\x86\x86\x6f\x1b\x4a\xd6\x57\xd6\x67\x28\x37\x1e\xe5\x33\x49\x84\xff\xe4\x87\xea\xed\x68\x61\xdd\x20\x42\x3f\x16\x7d\xe7\x03\xbf\xa6\x73\x71\x43\x7f\xe8\x99\x27\xdb\xa0\x33\x36\x6d\xd9\x30\x07\x40\x00\xec\x93\xbc\x5f\xd8\xf3\x15\x78\xc3\xf0\x22\x35\x90\x99\xf6\xb4\x94\x6a\xa9\x95\x0c\xcb\x41\xd3\xcc\xd5\x21\x67\x5a\x3d\x35\xdb\x7c\x92\xed\x7a\xa1\x2a\x27\xe9\x1e\x27\x7a\x30\x25\xa4\x2b\x1b\x34\x50\xb4\x4a\x17\x59\x47\xd0\x58\x7b\xfd\x50\x8a\x20\xc1\xd4\x18\x24\x89\x65\xd3\x56\xbd\xcd\xb0\x75\x0b\x04\x75\x01\xa6\x5c\x99\x70\x56\xda\x04\x5f\xa5\x11\x03\x72\x15\x94\x71\x9c\x2b\x65\xf0\x84\x4e\x3a\xcf\xe9\x24\x4b\x90\xe9\xac\x2c\xa6\xa9\x80\x40\x86\x82\x9f\x05\x71\xad\x65\x3e\x22\x88\x09\x88\x2c\x58\x89\xd0\x82\x23\xc6\xa6\x3a\x2a\xbc\x6a\x29\x66\xf5\x2d\x63\xf0\x20\x1c\xc6\xf8\xaf\x74\xbc\x76\x40\x6f\xcf\x69\xf5\x82\xcd\xdf\x56\x4c\x47\x3e\xbd\x5b\xa1\x01\x11\x9e\x15\xd8\x03\x58\x71\xf8\xf2\xd0\x33\xfb\x62\x3e\x35\x14\x7d\x59\xde\x2f\xc4\x3d\xb0\xf6\xe4\x29\x3a\xb1\x63\x3e\x06\x03\x81\x03\xa0\x45\x3b\x22\x88\xee\xc5\x26\x0e\xf6\xcd\x9c\xc0\xf8\x68\xde\x98\x46\x4e\x6e\xbd\x5a\xaf\x7b\x33\x3c\xa0\x71\xfc\x8d\xd3\x59\x17\xd3\xed\x31\xbb\x61\x63\x79\x4e\x41\x95\x8c\xc6\x7a\x3f\x72\x20\x31\x06\xbe\xe5\x6c\xfe\xb4\xe6\xb8\xf2\xc6\xd7\x40\x8b\xa2\x70\xd2\x82\x55\xf9\x66\x8d\x2e\x3b\x10\xc9\xd0\xd0\xe3\x9a\xaf\xd3\x21\x69\x87\xc0\xc0\x74\x08\x02\xc3\xd6\x16\x1e\x71\x12\x62\x0d\xa4\x28\x07\x65\x71\x8b\x11\xeb\x86\x65\x96\x8f\x9c\xa2\x14\x54\x68\xc9\x84\x18\xaf\x07\x96\xdb\xb6\x2c\x8b\x0f\x85\x0f\x89\x8e\x4b\x46\xd3\xb9\x13\x33\x96\x2b\xe2\x37\x05\xe8\x2c\xd9\x9f\xb3\xac\x84\x81\xf1\xe6\x70\xf0\x8e\x3b\x62\x73\x57\x7a\xc7\xaf\x8c\xde\x01\xb0\x00\xa2\x76\x56\x89\xe0\x0f\x09\x85\x07\x19\xab\x82\x13\xe2\x08\x93\x2a\x00\xad\x7c\xea\xac\x82\xb8\xc7\x05\x38\xef\x09\x2e\xd8\x08\xf0\x69\x3f\x40\xab\x18\x5b\xb9\x42\xca\xad\x90\x4f\x4c\x8c\xba\x42\x93\x8a\xa6\x8c\xd4\x00\x2f\xe9\xc4\x57\x89\xc4\xcd\x4a\x45\x41\x31\xd8\x5d\xb9\x24\x52\x65\xff\x82\x19\x71\xeb\x9a\x87\x05\xe0\xbf\x11\xec\xd1\x20\xef\x30\xa5\xa7\x57\xd9\xc8\x6b\x31\x14\x40\x00\x93\xa8\x69\x6d\x23\xea\xf5\x13\x8b\x19\x58\x3d\xda\xe2\xa6\x7b\xc8\xc9\x97\xda\x8c\x56\x7c\x72\xb9\xb6\x87\xab\xf6\x91\x7f\x6e\x2b\xe6\x8c\x1e\x3d\x72\xde\x56\xf8\xb6\xe7\xca\xbb\x18\xf2\xf9\x8b\xa2\xdf\x87\x03\x2c\x9e\x86\x03\x4b\x75\x9a\x24\x6c\x5a\x1b\x2a\x06\x5a\xc9\x68\x1d\x12\x74\xe1\xd9\x4d\xf1\x34\x25\xb4\xcd\xb9\x69\x15\x8a\x43\x08\x86\x38\x48\x6d\x56\xcd\x30\xa8\xd8\x10\x82\x3e\xb8\x1f\xd4\x0a\xda\xb4\x69\xa1\x7c\x30\x43\x2b\x87\x24\xbc\x1a\xc1\x20\xae\x15\xad\xda\x48\x81\x80\x4b\x9f\x22\x62\x1e\x3d\x72\x7e\xce\x84\x17\x60\xc3\xda\x47\xc6\x1f\x19\xcf\x55\x08\x48\x90\x57\x49\x0d\x85\xb4\x50\x55\xa3\x84\xe7\x43\xa9\x62\x76\xa9\xf4\xa2\x29\x8b\x09\xdc\xa1\x2b\x54\x92\x3d\x60\xdf\xbc\x48\xf5\x5b\x1f\xed\x3c\xa9\x0a\x86\x28\x0d\x45\x9b\x21\xce\x8f\xb5\x1b\x8f\x81\xfb\x38\x6a\x53\x56\xbd\x22\x70\xa5\xc0\x4a\x18\x87\xd7\x40\x4e\x60\x1f\xba\xf9\xaf\xea\x5f\x95\x25\x6a\x34\x43\x8c\x8b\x4e\xb7\xe1\x3a\x06\x65\x09\x3f\xaf\x66\x40\x62\xb4\xdb\x5c\x07\xa8\xc4\x58\x41\xb2\xc2\x91\x09\x1b\xe6\xe5\xa7\xd6\xa2\x29\xcb\x38\xce\xf1\x05\x3a\xbe\x89\x22\xfc\xaa\x28\xcb\x32\x8c\x98\xac\xf6\x08\xed\xc0\x50\x7e\x00\x01\x23\xc0\x95\x11\x16\x0c\x24\x90\x86\xec\xdb\xbe\x73\x2a\x8d\xbf\x05\x65\x47\x60\x6d\x73\xe3\x5d\xcc\x31\xac\xf4\x18\x31\x75\x2d\x04\x23\xe8\xa7\x25\xc3\x88\x7c\x12\x53\xbf\x2e\x52\xb6\x74\x72\x4e\x89\x9d\xc3\x30\x01\x1e\xc5\xe8\x71\x7b\x8b\x3e\xbc\x52\xa3\xe2\x4f\xb5\xe3\x6a\xde\xc4\x03\x11\xf5\xa1\xd0\x13\x57\x1e\xaf\xd4\x8e\xa3\x05\x15\x02\x03\xeb\xb4\x18\x36\xdb\xf8\x6b\xd5\x14\x81\x57\xbc\xd7\xfb\x82\x17\x68\xf7\xbc\x50\xe8\x81\x6f\x7d\x91\x32\xc3\xf3\xa2\xc5\x88\x20\x69\x98\x0f\x38\xad\xf7\x91\x50\x54\x36\x10\xb8\x63\x07\x2c\xd1\xc2\x8e\x46\x1f\xd6\x64\x64\x80\x64\x09\x73\x06\x46\x00\x68\x43\x28\x90\xc0\xd6\xd3\xec\x10\x9f\x30\x5e\x4d\x7a\xb4\x46\x62\xcb\x7d\xd5\x32\x32\x18\xca\x03\x1d\x3c\xbe\xda\xe5\x58\x13\x96\x70\x25\x07\x1c\x3c\x20\xab\x9d\xeb\xfc\x22\xf7\x8e\x47\x8f\x9c\xe3\xbc\x2e\xe7\xaa\xac\x7e\x44\x53\x3e\x2c\x9d\x19\xf6\x79\x95\x61\xbe\xc1\xef\xa5\xbc\xb8\x75\x6e\x99\x33\x2d\xb3\x1c\xd4\x0f\x8c\x03\x7a\xcd\x24\xea\x93\xcf\x5c\x4d\x9c\x31\xbc\xfc\x69\xc2\x84\x1e\x1b\x70\x73\x7c\x55\x5b\x1c\x43\x3e\xe1\xf3\x00\x6b\x1b\x5a\xa5\x4d\x8f\x87\x2f\xf0\x70\x68\x85\x58\xed\xee\xe0\xdb\x65\xdb\x41\x57\x17\x6f\x85\x5f\xc7\x8a\xcf\xd7\x16\x86\xc7\xb0\xa5\x85\x40\x76\x54\x49\xda\x88\xea\x50\x7a\xa5\x55\x42\x9e\x8b\x7e\x83\x4a\xc0\xcb\x7b\xac\x10\x11\x66\xc2\xc1\xf8\x6b\x6d\x11\x20\x6c\x2b\x25\xc6\xf9\x24\x35\xda\x8e\x95\xde\xc8\x7e\x6c\x39\x2b\x60\x03\x79\xb1\x1c\xc2\xdb\x0e\xd1\x8a\xa4\xb2\xcd\x10\x15\xcb\x76\xee\x11\xa8\x9b\x9a\x74\x21\xe8\xb0\x6b\x37\x59\xaa\x46\x6e\x6e\xf8\xc6\xe9\x55\x5a\x69\x44\x65\x29\x06\x50\xa5\x28\x87\xc4\x07\x92\x02\x0e\xca\xbf\xf5\x52\xa9\x96\x1a\x91\xe6\x08\xbe\x1c\xb2\x89\x06\xa9\xab\x57\xaf\x00\x9f\x07\x5c\xbb\x2b\x7a\x8a\xc6\xec\x80\xe5\x35\x63\x72\xb5\x2e\xb8\xa4\x5e\xee\xaf\x2c\x1f\x24\x81\xcc\x83\x29\x07\x30\x7e\xef\x6e\x36\xfb\x90\x4a\x54\xa1\x44\xb0\x1f\xe6\x15\xcf\x50\xe0\xf6\x03\x89\xa3\xe1\xb6\xea\x39\x6f\x2b\xa6\x49\x02\x75\xc7\xf3\x55\x4a\x9d\x0f\x66\x90\xac\x0f\xca\x2f\x6b\x73\xc5\xc7\x5b\x1c\x24\x47\xca\x18\x57\x0f\x12\xfa\xd0\x0a\xd6\x4d\x9d\x14\x20\x13\x64\x25\xe3\xa5\x86\xd6\xd3\x22\xcb\xb5\x1f\x17\x29\x51\x87\xb1\x7a\xb2\x2c\xae\xf7\xbd\xdb\x2a\x8b\x2a\x76\xe8\x5a\xa2\xb1\xd7\x9c\xaa\x1b\x1f\xe2\xeb\xcd\xbc\x2f\x7d\x0f\x41\xb9\x34\x4b\x4f\x44\x51\xe4\x61\x23\xfd\xca\x95\xd5\x90\xcc\x35\x9e\xb4\x02\x83\xaa\x79\x93\x1e\xb8\x36\xb0\xb1\xe9\xbe\x23\xc7\x28\xc2\x26\x5e\x36\xc4\xa5\x57\x9e\x4f\x9c\x6b\xc0\xcd\x4e\xc7\xbb\x6f\xfc\xde\xb5\x40\xd5\xd7\xed\xb8\x3a\xfc\xe4\xec\x6d\xba\x04\x23\xe4\x5d\x9b\x1e\x6b\xc6\x35\xd4\x69\x13\x2b\xf7\x86\xb4\x82\xd0\x2d\x26\xb2\x6f\x52\xf3\x27\x39\x92\x0d\x7c\xbe\xce\x87\x7f\x55\x1f\x40\x95\x35\xce\xf0\xf2\xfc\x60\x2b\x51\x3e\xf4\x0c\x2f\x42\x95\xaa\x21\x0e\x08\x7e\x7c\x70\x0b\x5f\xf7\x96\xd6\x1f\x22\x06\x18\xd0\xec\x60\xb3\x75\xaf\x57\x61\x5c\x32\x3a\x6a\x23\x93\x12\x5a\x27\x43\xc7\x63\x65\x29\xa7\xd4\x06\x1a\x9a\x84\x59\x81\x0b\x56\x96\x68\x38\xda\x17\xfc\x97\x0c\xb9\x30\xb7\x42\xf2\x75\xd6\xef\x4d\xb7\xab\x5b\xbd\xdc\x44\x74\xbe\x79\x65\xae\x70\x4b\x76\xd3\xc9\xad\xd9\x3f\xf6\xba\x32\x17\xb3\xd5\x7a\x58\x16\xb7\x8d\x09\xb5\x2c\x91\x44\xf4\x0a\x8e\xe5\xbb\x77\xa6\xf0\x62\x1d\x0c\x28\x5f\x2f\xf1\x84\xd5\xbd\x90\x00\x7b\xb9\x96\xb1\x7a\x30\x67\xd5\x1e\xee\xfe\x7d\x56\x0f\xdf\xa9\xb7\x32\x44\x14\x5e\xf9\x52\xec\x8a\xb1\x0e\x8c\xfe\xc2\x0a\xaa\xb0\x36\x62\xc1\x9a\x90\xc7\x6d\xb9\x15\x9c\xfd\xf6\x3c\xa1\x12\x0d\xd5\xc3\xb1\xb7\x20\x5a\x14\xde\x50\x09\xad\x18\x10\x96\xe8\xcf\x02\x7b\x07\xbe\x2f\x68\x46\x61\xc9\x1f\xf1\xd5\x16\x30\x46\x12\x11\x0f\x66\x49\xc2\x84\x27\xb0\xf1\x54\x90\xf0\x07\x8e\x19\x07\x62\x4e\xe0\x66\xb9\x10\x8e\x4a\x87\x98\x8e\x5a\x07\x8b\x4e\x17\x02\xd6\x4d\x9b\xae\x6e\x04\x81\x6c\x9b\xa3\xe1\x4a\x03\x89\xa6\xba\xc2\xc4\x99\xf0\x82\xab\x0c\x68\xc2\x6b\xee\x34\xc4\xbb\x5b\x91\xb3\xe9\xfc\x5e\xcc\xe4\x1c\xfa\x45\x39\x28\xd0\x07\xe8\x23\x68\xcd\x85\x52\x40\x0a\x49\x54\x28\xd2\x3e\xa7\x7a\x39\xc6\x71\x21\x6c\x81\x1c\x6c\x96\x03\x4b\x0c\xde\xaa\xe0\x6c\x07\x78\x67\x92\x7d\x64\xa9\x33\x9b\xaa\xd0\x94\x7c\x01\xf1\x7a\xcd\x26\xbc\x9b\xaa\xe7\x5a\x21\x45\xb5\xa6\x44\x8b\xe0\xd6\x69\x73\xcc\xc7\x25\xf8\x12\xea\x7a\xab\x73\xd5\x79\xad\x3a\x67\x59\xec\x13\x22\x7b\x63\xa0\x46\x8d\x35\xea\xce\xd6\x63\xdd\xf2\x36\x16\x06\xeb\x46\xb1\x35\x9e\xf9\xed\x6d\x6d\xdb\x43\xa5\x93\x9b\xc7\xef\x49\xc0\xf4\xb1\x7c\xed\x48\x3f\x55\xeb\x83\x1f\x24\x92\x3e\x8f\xb4\x62\x1b\x5e\x20\xe2\x85\xaa\xac\x66\x8d\x27\xf7\x2b\x1f\x4e\xc3\xa0\xa8\x03\xe7\x5f\xe2\x1a\x10\x70\x86\x10\x85\x11\xc7\x45\x2c\x71\x01\x84\xe2\xe9\x7a\x2b\x4a\x84\x7e\xfa\xc9\x9a\x56\x8f\x4e\xa7\xe3\x39\x78\x93\x12\x1d\x8a\x52\x05\x3d\xbe\x00\x7d\x1f\x18\xf4\x09\x2f\x4f\xde\x69\x56\x0d\x85\xbf\x5c\x91\x8c\xc4\x9c\x66\x55\x5d\x4c\x2c\x83\x31\x4e\xe9\xf5\x44\x33\x10\x0e\xec\x88\x5f\x94\x70\xca\xe1\x01\x32\x7c\xfd\x18\x15\x46\xea\x69\x38\xce\xc2\xa0\x19\xa4\x64\x4f\xd4\xa8\x7a\x1b\xf7\xda\x6f\x34\x5f\x24\xd1\xd1\x4c\xcf\x47\x19\x06\x84\x93\x4c\xa9\xd0\x63\x88\x0d\xe5\x78\x06\x77\x14\xdd\xef\xf8\x89\xe2\xa5\x8d\x17\x87\x20\x3e\x0a\x36\x26\x95\x1e\x02\x1f\x51\x78\x88\x08\x37\x5f\x6f\x29\x8e\x3b\x4f\x61\xd1\xf0\xfe\x49\x8a\xbc\x2f\x42\x67\x03\x12\xea\x29\xfc\x87\x98\x0e\x7c\xfb\xd8\xc7\x84\x81\x47\xae\x7a\xcb\x0c\xbc\x18\xc0\xf5\x41\xaa\xc8\x9c\x94\xdd\x40\xdb\xd3\xb2\x90\xeb\xeb\x9d\x01\x3a\x83\x38\x91\x19\x78\x0e\xf2\x2e\xc5\xf3\x4f\x43\x36\x9e\xf6\x67\x63\x67\xc2\xaa\x8a\x0e\x98\x7c\x72\xad\x2a\xc0\x7a\xd0\x5c\x09\x6c\xac\xcf\xb1\x01\x51\xf1\x8b\xc4\xa2\x55\xd8\x32\x9d\x4e\x19\x2d\x7b\xbe\xd8\x8b\x15\xbc\x69\x89\x8d\xf6\x50\x6c\xd4\x0c\xe4\xba\x22\x3b\x6a\x8a\xb8\x8c\x90\xa8\x57\x08\xee\x4d\x37\xef\x76\xd3\x2d\x71\xeb\x48\xac\xfb\x49\x8b\x97\x76\xba\xdc\x7c\xf1\xa6\x11\x9c\x63\x1d\xd7\xdb\x74\xa6\x65\x46\x68\xf5\xc6\x35\x2d\x5e\x4e\x6c\xb9\xa6\x1b\xb7\x32\xad\x59\x2a\x9f\x59\x8c\xee\xbb\xe3\x7b\x71\x96\xa7\xc2\x25\x4c\xad\xd5\xa3\x47\xce\x4b\x36\xa0\xc9\xdc\x19\x16\xc5\x48\x1c\x40\xad\xc4\x43\x13\x2f\x7c\x06\x53\x84\x2f\xb7\xbb\xec\x19\x91\x96\x8c\x17\xcf\xda\x5f\x3c\x6a\x56\x26\xce\x26\xaf\x67\xbc\x7b\xb4\xf6\x71\x23\x78\x8b\x72\xd5\xc6\x87\xff\x6f\x5c\xdc\xbe\x29\xb3\xa2\xcc\x6a\xf9\x70\xed\x57\xbb\x0a\x43\x5b\xc3\xcc\xf8\x05\x37\x2d\x19\x04\x17\xee\x39\x07\xfa\x75\x4f\x7c\x58\x32\xcd\x4a\x96\xd4\x63\x11\x6a\x21\x46\x43\x8c\x29\x85\x57\x2f\x45\xfc\x0f\x6b\x73\x7a\x9b\x06\x49\xdd\x3e\x65\x44\x98\xcd\x69\x3a\xfa\x5d\x26\x7c\xff\x51\x8a\x78\x8c\xf6\x1a\x16\x85\x06\x15\xba\x02\x46\xcd\x75\x6d\xc0\x93\x11\xd1\xbd\x01\x4e\x5a\x95\xb7\x8e\xf0\xb3\x1e\x26\x30\x5b\x5a\x7b\x21\x7c\xc1\xd9\xfe\xd4\xc9\xd6\x83\xe8\x29\xc0\x5d\x6e\xb4\x1d\x34\x5d\xd2\xb4\xfc\x6e\x3c\x62\xb0\xc6\x3e\xe9\xbf\x6d\x9d\xa4\x42\xfb\x8a\xa0\x9d\xd2\xfc\x37\xd0\xde\x7c\x81\xe9\x55\x42\x24\xa2\x3c\xa6\xc9\x30\x68\x3a\x9a\xca\x27\x58\x21\xd4\x9f\xe5\xb6\x80\x39\xc2\xf0\x3e\x90\x3f\x30\x95\xf3\x90\x81\x36\x62\xe6\xeb\x08\x4f\x20\x2a\xf5\x4e\xa0\x7f\xf2\x1a\x6f\x66\x25\x33\xf2\xac\x4f\x9e\x3f\xcb\x2b\x78\x73\xec\xfa\xa0\x9a\xe7\x89\x51\xd2\xfe\x86\x3e\x1a\x64\xd2\x3d\x98\x8a\xb7\x6c\xc2\x5a\x70\x0f\x0c\x13\xd5\xb2\x00\xfe\xe0\x3e\x04\xca\x4b\xdb\x22\xdb\xa0\xf1\x0d\x43\x85\x48\x0f\x45\x1e\xe0\x7e\xbd\xc3\x2f\xc8\xb9\xbe\x3e\x3f\x3e\x3c\x3b\xbe\xb8\x3e\x79\x7d\x71\x7c\xf6\xfa\xe0\xe5\xf9\xf5\xd1\xe9\xf5\xeb\xd3\x8b\xeb\xb7\xe7\xc7\xd7\xa7\x67\xd7\xbf\x9f\xbe\xbd\x7e\x7f\xf2\xf2\xe5\xf5\xd3\xe3\xeb\x67\x27\x67\xc7\x47\x72\x7b\x57\xd4\x99\xc1\x6a\x92\x0a\x4d\x06\x71\xf9\xe2\xb9\x60\x3f\x58\x09\x26\x31\x14\x8c\xbd\xe3\x59\x9e\x8e\x39\x42\x42\xe6\x61\x1b\xf5\xb0\x4e\x7d\x9b\x25\x10\x00\xff\xed\xab\x23\x2c\x03\xf1\x44\x1c\x47\x28\x6a\x03\xf9\x74\x05\x8a\xbb\xc2\x8d\x0d\xa0\x91\x72\xbe\x7b\x30\x8e\x67\x96\x98\xa9\x21\x7f\x68\xbd\x20\xe1\x30\xf1\xc2\xf2\x51\x0c\xac\xf4\xf9\x4b\x44\x4c\xf5\x0b\x27\xf6\x84\x76\x33\x2f\x6a\x4e\x4a\x8a\xe7\x18\x41\x07\x83\x6f\xb9\x68\xed\x4b\xbb\xd9\x62\xb0\x26\x5d\xad\xef\xf9\x30\x9b\x00\x9e\xc2\x03\x79\x74\xfa\xca\xd9\xfd\xae\xb7\xd3\xdb\x91\xef\x41\xd6\x9c\x88\x49\x99\x72\x03\x48\x1d\x0f\xd5\x18\xf0\xd6\x70\xea\xc3\xdd\xa8\x5f\xd5\x84\x6b\xb3\x64\x93\xe2\x06\xf6\x00\x5b\xdd\xfd\xbe\xb7\x63\x8c\x52\x9d\x86\x8b\x92\xb1\xe7\x45\x31\x0a\x9c\xbb\xa5\x7e\x31\xd9\x40\x10\x5f\xed\x69\x99\x99\x78\x1a\xea\x6e\xe3\xff\x27\x98\x2e\x31\xb7\x0d\x88\xb3\xab\xab\x3c\x76\x22\xc7\x53\xd5\xbb\x5d\x31\x06\x40\x41\x22\x35\xdc\xd8\x50\x63\x4d\x59\x92\xa5\x4c\x3e\xa5\xaa\x8d\x81\x04\xbb\xd8\x2f\xca\x89\x88\x69\x8d\x24\xc0\x90\x26\xa3\x39\xb0\x18\x13\x3a\x62\xf8\xb6\x76\x51\x8e\x90\x76\x04\xd7\xdc\xb3\x62\x3c\x9e\x4d\x81\x6a\xfc\x85\x55\x35\x46\xa1\x2e\x05\xbe\x13\x63\xbc\xdc\x14\x93\xd8\xbc\x72\xf6\xdb\x12\x03\x99\x18\x6e\x6c\x4c\x8a\x74\x36\x66\x3d\x1c\x51\xe5\x44\xd8\x18\x86\x18\xf6\xa4\xef\x94\xf3\xfe\xf8\xe9\x9b\x83\xc3\x17\xce\xbb\x83\x33\xe7\xe4\xf5\x2f\xc7\x87\x17\x27\xa7\xaf\x9d\xaf\x1f\x2d\x51\xef\x23\x6a\x13\xe7\xfa\xfa\x96\xc5\x53\x9a\x8c\xae\x85\x89\xcc\xf5\xb5\xf7\xd8\xf7\x7d\x90\xfb\x7e\xfd\xc8\x59\xfa\x84\x37\xf7\xcd\xce\xb7\xce\xd7\x8f\x44\x9a\xa7\x5c\x11\x71\x2c\xc4\xb9\xaf\x39\x7e\x70\x36\xdc\x59\x85\x6f\x1a\x27\xb5\x1b\xf2\x66\x9c\xff\x39\xce\x12\x96\x57\xd2\x87\xe3\x66\xf7\xbb\xde\x6e\x6f\x17\x2d\x94\x68\x52\x6f\xa7\xc5\xa4\x67\x40\xf5\x24\xcb\x7b\x7f\x54\x42\xd5\x72\x58\x4c\xe7\x25\xf0\xdf\x5e\xe2\x3b\x7b\x3b\xbb\x8f\xb7\xe1\x79\x13\x7e\x65\x3f\xa3\x09\x8b\x8b\x62\x44\x9c\x93\x3c\xe9\x29\x8f\xa0\xac\x92\xb6\x89\x60\x02\x98\x55\x8e\xe8\x3f\x05\x59\x04\x68\xd9\x9c\x57\x27\x17\x32\xd9\x0a\xe9\xc7\x9b\x78\x79\x72\x78\xfc\xfa\xfc\x18\x25\x03\xc2\x81\xa9\x2c\x8a\x5a\x50\x47\x9c\xcc\x94\xde\x3f\xa2\x23\x1d\x96\xe6\xd1\xd7\x1b\xce\xab\x22\x65\x65\x9e\xfd\x55\x3a\x8f\xf9\x81\x9a\x96\xcc\xf1\x0e\x91\xeb\x7b\x3a\xcb\xc6\xa9\xef\x2c\x78\xff\x1b\xc2\x68\x8f\xd2\xa8\x6d\x6b\x76\x7d\x32\x69\xcd\xd8\x7b\xbc\xe3\x93\x83\xd6\xac\x1f\xbe\xf3\xc9\xd3\xd6\x9c\x6f\x9e\xf8\x24\x69\xef\x68\xef\xf1\xae\x4f\xd2\x75\x79\x7b\x3e\x61\x6b\x06\xb8\xfb\xd8\x27\xc3\x75\xf5\x1e\xfb\x24\x5b\x97\xf7\x8d\x4f\x0e\xd7\x34\xb9\xeb\x1b\x01\x9d\x8f\x3c\xea\xdf\xf5\x8b\x12\x48\xa9\x38\x6a\x52\x50\xdb\xbb\x24\x89\xdc\x57\x59\x8e\x0e\x81\xc2\x43\x08\xa4\xb0\xff\xc3\xdd\xa2\x5b\x6e\xe8\xdc\x64\x55\x56\x83\xf1\x47\xf0\xe8\x51\x5f\xc0\x4b\x6f\x90\xd5\xc3\x59\xdc\xcb\x0a\x34\x04\x41\x9f\x33\xa8\xb8\x9d\x32\x0e\x34\x25\xf8\x9d\xed\x2b\xb7\xa5\xff\x7c\x7c\x9c\xba\x5b\x94\xa4\xd1\x4e\x98\xfe\x18\x87\xe9\xd6\x96\x9f\x6c\x45\xee\x7f\x3e\xee\x7d\x47\xcb\x41\x75\x79\x85\x25\x58\xce\x6b\xbf\x3d\x3b\x51\x98\xce\xa0\xe3\xd2\xad\xdd\x2b\x3f\x8c\x23\x90\xc2\x78\xc9\x96\x2b\x55\xbe\x4e\x7f\x36\xd6\x4c\x67\x01\x31\xb9\xd1\x0f\xb5\xc8\xb7\x27\x72\x7a\x9c\x99\x35\x1f\xe2\x85\xb8\x1c\xbc\xa2\x10\xd5\x01\xb3\x9a\xa6\x99\x08\x53\x25\x79\x59\xc9\x94\xf6\x5c\x3f\x8c\x41\xa9\x17\xb9\x27\x72\x5e\xce\xbb\xac\xc0\xc0\x53\x6e\x18\xf7\xe0\xf1\xde\xea\xa2\x78\x53\x4c\xa3\xdd\x10\x39\xe3\x38\x5c\x52\xba\x8f\x3e\x56\xc1\x91\xe7\xee\xed\x7d\xef\xfa\x68\xd0\x3d\xa6\xd1\x9d\x24\x97\x83\xce\x0e\x49\x69\x3e\x60\x65\x31\xab\xc6\xf3\x73\x56\x9f\xe4\x39\x2b\x9f\x5f\xbc\x7a\x09\x59\x88\xde\xde\x01\xc1\xaf\xbf\xc1\x16\x93\xa5\x3c\x25\x33\x8b\x57\xb3\x29\x3f\xe4\x15\x38\x32\xe7\xf5\x71\x8a\xcf\xba\x0a\xde\xc6\x2c\xf1\x7c\x9e\xa2\x68\xcb\xcc\xab\xe7\x63\xde\xcb\x32\x54\x80\xf4\x27\xf5\x28\x89\xfd\x3b\xa4\x86\x3d\xda\x8d\xfd\x28\x8a\xe2\x25\x62\x68\x1a\xdd\xbd\x7a\x7b\x8e\x97\xf3\x9b\xb3\xd3\x37\xc7\x67\x17\xbf\x07\xbb\xe4\xf9\xc1\xf9\xf5\xd3\xd3\xd3\x97\xc7\x07\xaf\xaf\xdf\x1d\xbc\x7c\x7b\x1c\x7c\x03\x69\xaf\xdf\xbe\x3a\x3e\x3b\x39\x14\x69\x3f\x40\xda\x9b\xd3\xf3\x93\x8b\x93\x77\xc7\x8d\xcc\x3d\xac\x71\xfa\xee\xf8\xec\xe5\xe9\xc1\xd1\xf1\x51\xa3\xc1\xc7\x7b\x90\x7f\x7e\x71\x76\xf2\xfa\xe7\x46\xde\x77\xdf\x90\x2c\xe7\x17\xe0\xd1\xe9\x2b\xc9\x4c\x1d\xc2\x0b\x35\x81\x42\xca\xd4\xbf\xc3\xa3\x51\x52\x92\x44\xb4\xf7\x46\xbd\x59\xb4\x58\xdc\x2d\x49\x1a\xd1\xde\xd1\xe9\xab\x03\x29\x72\x7f\xcd\xf7\x77\x4a\x13\x91\xcd\xda\xb2\x79\x4e\x48\x31\xe7\xd5\x0c\x7d\x29\x5f\x81\x01\x3b\x66\xc9\xe3\xd8\x87\xa7\x86\xfc\xbb\x8a\x36\xdf\x08\xea\xfb\xfb\x47\x9e\xfb\xcd\x0f\x2e\xe9\xfb\x81\xf0\xce\x03\x97\x95\xa8\xdf\xab\x8b\x97\xc5\x2d\x2b\x0f\x69\xc5\x3c\x9f\x8c\xa2\xe4\xb2\x7f\x15\x0e\xa2\x3b\x6a\x8e\x21\x18\x10\xba\x32\xe4\x00\xd8\x76\xa9\xd2\x84\x62\x7d\x32\xb1\x06\x88\x45\x26\xb3\xaa\x7e\x5b\x29\xfe\x33\xf8\x93\x7a\x23\x12\xf7\x56\x76\xd8\x27\x1b\x43\x5a\x3d\xc5\x28\xc7\x08\x99\xa2\xe8\xca\xc6\x73\x34\x57\xbd\xe6\x7c\x79\x96\xac\x94\xb4\x76\x1c\x4a\xbe\x29\xaa\xac\xce\x6e\xd8\xba\x1a\xed\xc0\x02\x55\x4f\x6f\x58\x39\x2e\x68\xca\xd2\x75\x03\x5b\x07\x4b\x50\x1d\xc3\x3b\xad\xab\xda\x06\x66\xfe\x32\xdc\xfd\x29\x1a\xf4\x1a\x4b\xb1\x05\x29\xe6\x04\x30\xa5\x7d\x7c\x06\x7e\xf8\x76\x87\x6f\x7b\xc8\x56\x81\xa2\xdb\xf5\x06\x3d\x6b\x5f\x23\x76\xd9\xbf\xf2\xc3\xf4\x21\x65\x01\x06\xa2\x14\x2a\xb4\x40\x1c\x54\xb0\xa1\x21\xa2\x50\xb8\xe2\x7f\xa2\xc1\x72\xb9\x24\x15\x8d\xee\x96\xc6\xf5\x52\x0b\xac\x90\xf5\xbd\xf1\x4a\x9b\xd4\x5f\x2c\xf6\x7e\xa4\xe2\xaa\xe9\x76\x3d\xb7\x70\xa3\x28\xa2\x97\x3b\x57\x8b\x85\x7b\x2a\x7f\xf3\x9e\xdd\x1c\xbf\x76\x79\xce\x6b\xf9\xdb\xf7\x11\xdb\x74\x76\xc3\xac\x0f\x42\x27\x8e\x72\x64\xe2\x4e\x58\xdd\x66\x75\x32\x94\xb2\xb9\xd8\xbf\x03\x85\x8e\x2b\xc2\x6e\xbb\x81\xe0\xdc\xdb\x46\xb6\x4f\xa3\xce\x4e\xe0\xc5\xd1\x8c\x7a\xd4\xe7\x9f\x71\x73\x03\x17\x0b\x48\x5a\x05\x08\x91\xb1\x06\xd0\x3c\x7e\xf2\xad\x43\xda\xab\x38\x99\xe4\xed\x90\x6f\x7d\x42\x23\x37\xa5\x35\xdd\x86\x29\x2e\x16\x2e\xbf\x44\xf0\xc3\x27\x34\xc4\xf1\x2b\x75\x8f\x1b\x60\x02\x6a\xb1\xe4\x17\xca\x7f\xe5\x17\x32\x70\x72\xae\x9d\x9d\x50\x52\xf8\x72\xe9\x96\x4b\xb5\x5b\x30\xd7\x3b\xe9\x6f\xd5\xb6\x2a\x15\xbd\xa4\x57\x80\x04\x10\xb1\xdf\x50\x8e\x17\x6f\x69\x74\x43\x57\x8f\x3f\x79\xce\x93\x57\x8e\x3a\xf9\x48\x65\xba\x75\x3a\xc9\x5c\xa5\xb7\x1f\x5f\xf2\x97\x2a\xb0\xee\x88\x92\x03\x55\xa4\xed\x28\x92\xa7\x34\xba\xd3\x18\x3c\xb8\x03\x11\xff\xb3\xd9\x78\x7c\x9e\x94\x8c\xe5\xc1\x73\x42\xab\x79\x9e\xf0\xbf\xb3\xba\x78\x56\x24\xb3\x4a\xfc\x7e\x33\xa6\xf3\xe0\x39\x49\xe8\x94\x73\x6a\xc1\x5f\x94\x24\xe2\x6a\xbd\xa5\x8b\xe7\x24\x29\xc6\x55\x30\xa7\x24\xb1\xef\xd3\xe0\x00\x93\x4a\x9e\xfd\x9c\xb8\x62\xf1\xdd\xe0\x39\xbf\xa0\x59\xc9\xff\x66\x15\x2f\x99\xf2\x9f\xc5\x6d\xce\x21\x86\xb7\x9e\x96\x74\x30\x90\x4d\x70\x4e\xe9\x75\x21\x24\x0c\x2c\x78\x4e\x86\xf0\xc4\x60\xf0\x9c\x8c\x8b\x62\x1a\x3c\x27\x93\xd9\xb8\xce\xa6\x63\x86\x83\x99\xcc\x6a\x39\xae\xdc\xac\x55\x4c\xa1\xce\x74\x4c\xe7\xd5\x09\x84\x5c\x0f\x9e\x93\x92\xd1\xf4\x34\x1f\xcf\xe1\x27\x7a\x23\xc0\x4f\x08\x3b\x01\x3f\x8b\x5b\x98\x5a\x59\xdc\x9e\x4f\x69\x1e\x7c\xa4\x64\xa3\x4a\x8a\x29\x64\x56\x8c\x4e\xc6\xac\xaa\xe0\xe7\x18\xf4\x4f\xd8\x71\x95\xfd\xc5\x78\x2d\x78\x8c\x93\xd7\xa9\x78\x5d\x9e\x30\x65\xe3\x31\x90\x25\x7c\x66\x48\x49\xec\x90\x9a\xc6\x10\x07\x31\xd8\x21\x59\xcd\x26\xe7\xbc\x7d\xbe\xf2\x60\x63\x7e\x38\xa4\x65\xc5\xea\x60\x87\x80\x08\x15\x6e\xa6\x1d\xc2\xe9\xc7\x67\x45\x09\xbf\xea\xe9\xf1\x9f\xb3\xec\x26\xd8\x21\x28\xf1\x3c\xa0\x4b\xb2\x72\xef\x06\x77\x76\x73\x2e\x7e\x6e\x27\xf8\xed\x1a\xad\xbb\xf0\xd3\x55\x7d\xb8\xfd\xa2\x74\x8d\x7e\x5c\xfe\x73\x9b\x2f\xd7\x8d\x0b\x3d\x35\xee\xf1\xe0\x0e\xc7\xa1\xc9\x08\x81\x05\x11\x49\x49\x1c\xe5\xd0\x1e\xf2\xf3\x6a\xa0\x9e\x0b\x15\x5d\x3f\x94\xa7\xba\x13\x71\x7c\x31\x9f\xb2\xc5\xa2\xb3\xcb\x11\x01\x3f\x96\xab\xe5\xf7\x69\xaf\x62\xf5\x4a\x3a\x71\xdd\xad\xd8\x0f\x28\x1a\x87\x66\xf5\xbc\xdb\xed\xe8\x8f\x5e\x4c\xd3\x93\x7c\x3a\xab\xbb\x5d\xda\x03\x1b\xf3\xa3\x22\x41\xfd\x16\x4d\xf8\xfd\x2a\xe4\x55\x7c\x0c\xdd\xee\xc6\x7d\x5d\x70\xec\x7f\x78\xff\xe1\x7b\x11\xdd\x7d\x1c\x67\xf9\x08\x57\x2f\x78\xf4\xe8\xf6\xf6\xb6\x77\xfb\x18\x62\x52\xec\x3e\x79\xf2\xe4\x11\xe4\xba\xe4\xe3\x64\xdc\x56\xe4\xb7\x57\x2f\x79\xb1\x1f\x1e\xe5\xf2\xb2\xe2\x4b\xdf\x3c\xd0\xb3\xba\x38\x43\xd8\x0d\x0e\x29\x61\x1f\xd1\x6c\xfa\x8c\x21\x1b\x59\x9d\x49\x10\x3f\xa4\x44\x3e\xe2\x79\x30\x9e\x0e\x69\x70\xb8\x06\x64\x8c\x06\x5d\xe3\xc3\xbd\xa7\x6d\x77\x6d\x96\xdb\xe8\xd4\xb5\x3e\xdd\x96\x11\x00\x2d\x19\xe0\xc2\x1d\x24\xf5\x8c\x9f\xe4\x17\x3d\xf8\x24\x98\x58\x26\x65\x31\x6e\x24\x3e\x2f\x59\xdf\x4e\x39\x5b\x29\x73\x3e\x2c\x6e\xed\x94\x8b\xac\x6e\x16\xba\x98\x4f\x75\xca\xc6\xc7\xc9\xf8\x29\xad\x20\x61\x32\xe6\xfb\xf4\x92\xe6\x03\xfd\x75\x0e\x54\x24\x7c\x2e\x97\xe4\x98\x46\x8f\x2e\xff\xb3\xfd\x9f\xe0\xca\xbb\xa4\xdb\x7f\x5d\xf9\x8f\x06\x9a\x5d\x78\x6e\x5e\x35\xfc\x2e\xef\xd5\xc5\xdb\xe9\x54\x5e\x89\xcb\x0d\x38\x9c\x79\xbd\x3d\x64\x22\xb2\x71\x36\x00\xa6\x6c\x3b\xa6\x15\xe3\xa8\xcb\xa1\x25\x8d\xb3\x64\x9b\xe3\x46\x47\x26\x6e\x57\xc3\xac\x5f\x3b\x09\x9d\xca\x8a\xc9\x38\x9b\x6e\xc3\xb3\x27\xf0\xab\x9c\x8d\x21\x54\x4a\x51\x6e\x83\x49\xfd\x54\x30\x67\x6d\x69\xdb\xfd\x6c\x5c\xb3\xb2\x12\x79\xd3\xb2\x00\x71\x05\x7e\x95\x4a\xc9\x99\x16\x93\x2c\xa7\xe6\xc8\x50\xe0\xb9\x1d\xd3\x64\x34\xc0\x68\x08\xfd\x6c\x3c\xde\x2e\xa6\x34\xc9\xea\x39\x7e\xc0\x40\xfa\xe3\xa2\x48\xb7\xa1\x41\xf1\x5b\x95\x29\xf2\x7a\xbb\x4f\x27\xd9\x58\xfc\xe6\xf8\x54\xff\xda\xa6\x29\xc4\x9e\xc3\x84\xba\x64\x75\x32\x94\x1f\xf3\xb1\x28\x28\x39\x50\xf8\xb8\xc5\xe5\x18\x8c\xe7\xd3\xe1\x36\x18\xab\xe2\xcf\xa2\xcc\x64\x3c\x97\xed\x61\x51\x66\x7f\x15\x79\x4d\xc7\x2d\x99\x37\xfc\x88\x25\x9c\xed\xe5\xa5\xb6\x69\x7a\xb3\xfd\x51\xfc\x46\x47\x98\xed\x8f\x4e\x36\xa1\x03\x66\x2c\xcd\x18\xde\xe0\xdd\xe6\x40\x0c\x9f\x7c\x08\x59\x3e\x10\x33\x9e\xd0\x72\xc4\xca\x6d\x96\xa7\xf2\xe7\x24\x53\x3f\xe1\xde\x80\x67\x61\x61\x5f\xc1\x1e\x01\x62\xa3\xc8\x94\x7a\x98\x25\xa3\x9c\x55\x95\x33\xa5\x59\x5e\x6f\x83\x23\x9e\x33\xa5\x79\x51\xb1\xed\x5d\x7c\xfb\x99\xb7\x7e\x03\x21\xf2\xd5\x98\x60\x8b\xf3\xda\xa9\x86\x74\x6a\x0e\xb5\xaa\x8b\xa9\x18\x17\xfc\x94\x1b\xc1\xa9\xa9\x11\x13\x31\x50\xf5\x30\xec\x64\x3d\x96\xaa\x2e\x8b\x11\xdb\x4e\x69\x35\x44\xdf\x10\x23\xa1\xe8\xf7\x2b\x56\xcb\x14\x3e\x89\x84\x4e\xcd\xcf\x3f\x8a\x2c\x97\xdf\x93\xac\xe6\x13\x9d\x64\xaa\x82\x31\x22\xfe\x79\x9b\xa5\xf5\x10\x1e\x00\xdb\xa6\x79\x32\x2c\x4a\xfc\x9d\xb2\xa4\x28\x85\x25\x12\xff\xd6\x33\x04\xc9\x9c\xbd\x98\x3a\x49\xcf\x60\x96\x67\x49\x91\xb2\xed\x38\x4b\x33\xf5\x51\xd2\x7c\xc0\xf8\x57\x5d\x6d\x4f\xf9\xaa\x4e\x9c\x9b\x6d\xca\x71\x56\xcc\xea\x2c\x71\x6e\xb6\x87\x34\x1f\xf0\x5e\x6e\xb6\xb3\x94\x15\x83\x92\x4e\x87\x90\x3e\xa1\xf5\x90\x4d\xd0\x31\xc5\xb9\x01\xd9\xde\x36\xeb\xf7\x59\x52\x3b\x1c\xa2\x00\x8e\xe6\xf8\x53\x81\x91\xf9\x35\x77\x6e\x8b\x32\x55\x20\x74\x5b\x66\x00\x41\x93\x22\x65\xce\x47\x79\xc8\xf1\x5a\xa1\x88\x1e\xe5\x17\xe2\x45\xf1\x35\x2c\x59\x5f\xfc\x34\x52\xab\x61\x71\x2b\x7e\xd6\x1c\xf7\xc9\xdf\xf3\x29\x73\xf8\x2d\xc4\x4f\x34\xff\x91\x57\x01\xe4\x40\xe2\x98\xe6\x03\xf8\x81\x77\x50\xaf\x9a\x8e\xb3\xda\x73\x1d\xd7\xef\x09\xf5\x99\xb7\x2a\x3d\xa0\xca\x13\xfb\x98\x92\x8d\xe7\xd4\x0f\x8f\x4c\x59\xc2\x65\x7c\x15\xed\xf0\xa4\x15\xfc\xcf\x73\xe8\xd2\x0f\x6f\x68\x6f\x8d\xac\xc2\x7b\x4a\xef\xcd\x3e\xa2\x42\x9a\xf4\x3a\xba\xbb\x4e\xe8\x6c\x30\x44\xff\x2a\xe4\xe5\xaf\x87\xb4\x3a\x34\x12\x3b\xbb\xe4\xba\x04\xc0\xbe\x6d\x94\x3a\x33\x53\x3b\xbb\x42\x74\x92\x15\x79\x70\x87\x3f\x21\xe7\x6d\x9d\x8d\x2b\x4b\x7c\xe2\xca\x0f\x4e\xca\x08\x5e\x8c\x8f\xf6\xa6\x18\xb1\x9f\x67\xb4\x4c\x59\x2a\x9f\x9a\xda\x3f\xf2\xdc\xdd\x27\xdf\xbb\x4a\xa8\x71\xc2\x99\xa5\xd6\xa2\xcb\x25\x69\x4d\xb7\x48\x2e\x92\x90\x94\x30\xd2\x27\x03\x32\x22\x43\xff\xee\x84\x0a\x8d\xf2\x6b\xa2\xb5\xc9\x6b\x1a\x3a\xc8\xd3\x43\x5a\x27\xc3\x67\x59\x59\x89\xb5\xb9\xaf\xe9\xd7\xed\xc3\x34\x35\xd8\x86\x02\x3b\xeb\x7b\xaf\x7b\xf6\xca\x7b\x3e\xc2\x4a\x19\xbd\xee\x25\x63\x46\x4b\x2b\x2f\x7c\xdd\x6b\xee\xc1\x62\xe1\xad\x26\x46\x9d\x1d\xf2\xba\x67\xed\x60\xb4\x51\xfa\xcb\x25\x11\x49\xe6\x5e\xab\xf9\xa8\x9b\xf8\x97\xf6\x05\x6a\xc0\xc8\x6a\x3d\x1c\x88\x51\x66\x49\x9a\x73\x30\x6b\xc1\xf4\x1b\x35\x70\xf6\x34\x7a\xdd\x33\x81\x34\xb4\x3f\x23\x30\x38\x5d\xa9\x1b\x75\x76\x43\x49\x4b\x2c\x01\x86\x7e\x70\xfd\xa5\x21\x9d\x3c\xa1\xed\x7b\xd6\xd2\x4e\x5b\x87\xb8\x2f\xe8\xa0\x36\x2d\x8b\xba\x00\x57\x15\x60\xdb\x51\x03\xa4\x16\x8b\x3c\xf6\xc3\xba\x9c\xdf\xc5\x62\x1d\x13\x52\xfa\x4b\xb0\x77\xf6\x72\xe8\xd0\x6a\x9b\xb4\x8c\x60\x67\xb9\xd4\xf2\x93\x5f\xa8\xb9\x5a\xe6\x46\x1b\xcb\x65\x6e\x76\xd8\xdc\x7c\x63\xc1\x6c\x38\x91\xe2\x67\x1a\x2e\x97\xbc\xa9\x17\x14\xca\x92\x97\x0d\x11\xce\x2b\x31\x84\x17\xd4\x97\x82\x49\xea\x64\xb9\xf3\x52\xe1\xb6\x97\xf4\x92\x5e\x91\x24\x7a\xc1\x8f\x6a\xca\x3e\x9e\xf6\x3d\xea\x87\xdb\xbb\x3f\x26\x86\xd4\xea\xc9\x77\x2e\xa1\x00\xf8\x9d\xd7\xf4\x32\xb9\xf2\xef\xe2\x1e\xfb\x08\xe1\xdb\x8e\xe1\x8a\x36\xcb\x7e\x0f\x65\xa1\x5c\x14\x87\x49\x14\xf7\xe0\x1a\x47\x27\x18\x39\x8a\x54\x88\x47\xc1\xa0\x30\x32\xa4\xa0\xfd\x28\xb9\x4c\xaf\xc8\x20\x8a\xc9\x28\x4a\xc3\xd3\x15\x41\xc6\x08\xc4\xa7\x4f\x9e\xb8\x64\xa4\x30\xcd\x29\xbd\x1c\x5d\x45\x7d\x68\x60\x18\xf5\x7b\xd3\x21\xad\x58\x7a\xc6\x06\x59\x55\xe3\x7d\x0a\xe8\x98\x4f\x60\x88\x1a\x13\x50\x5c\x0d\xfd\x61\xb3\x75\xe6\x77\xbb\x6f\xa8\x37\xbc\x64\x57\x1c\xd0\xfc\x90\xf1\x4d\x05\xd3\xad\x7e\xaf\x6c\x34\xb8\xef\xbd\xa1\xde\x6a\x32\x54\x24\xbc\xa2\x1f\x30\xbe\x57\xa6\x00\xf0\xc9\x0f\x2e\x49\x09\xe5\x2c\x97\x01\x2a\x6f\x04\x88\xfb\x77\xbf\xf2\xfd\x00\x54\xba\xb3\xc3\x17\x52\x4e\x11\xd2\xa3\x38\x3c\xc3\xbf\xc6\x9a\x5e\x26\x57\xbd\x94\x4d\x39\xa9\x90\x27\x19\xab\x00\x20\x5e\xd3\xe8\xf2\x8a\x9c\x72\x70\x20\xbf\xc2\xbf\x67\x00\x1a\xaa\xc7\x73\xa0\xe1\x5f\x50\xec\x6a\x57\x63\xed\x17\xf4\xde\xb3\xe2\x87\x1c\xa6\xb4\xd8\xe9\x82\xea\x7b\xb2\xb3\x4b\x12\xd8\xe1\x04\x9c\x21\xfd\xac\xef\xad\x6c\x5f\x22\x30\x65\x1a\x71\x00\x09\x5f\xb6\x14\xe8\x76\x5f\x02\xf0\x44\x51\xba\x58\x78\xf0\x1b\x47\xb9\xe7\x92\x44\x8e\x93\x60\x99\x94\xc4\x7c\x9d\x97\x71\xb7\x0b\xe3\x82\xbb\xf2\x2d\x8d\x1a\xba\xf1\xe9\x78\x36\xc8\xf2\x2a\x78\x4d\x09\x2c\x1c\xdf\xa6\xa3\xac\x9a\xf2\xb3\x8d\x37\x6d\x15\x9c\x52\xd2\xdc\xc9\x57\xa0\xd4\xad\x82\x5f\x57\xb3\x8e\x8c\x15\x0f\xce\x28\x99\x16\x15\xb8\xbf\xaf\x00\x1d\xde\xc1\xe2\x92\xe5\x7d\xbf\x81\xb1\x9c\x72\x8a\x37\x38\xa7\xab\x39\xd5\x53\x14\xdf\x5f\xd0\xa5\x4f\xde\x89\x83\xfd\x5e\xfc\xfd\x0d\xff\xea\x7d\xfc\x5d\x21\x47\xff\x2e\x56\xc2\x06\x77\x86\xb1\xb1\x90\x82\x76\x43\x2a\x3d\xe3\x2f\x68\x39\x60\x75\xf4\x1b\xf5\x52\x7e\x2d\x3d\xf0\xf2\xf4\x78\x07\x62\xdd\xa9\xbf\xd2\x1a\x8a\x14\xd5\x90\xfe\x2d\xe4\xc6\x42\x5c\xc2\xf7\xee\xf1\x8e\x06\x30\x25\x48\xa1\x52\x90\x12\xf3\x34\xdb\x83\x98\xfa\x80\xb7\xec\xc4\xd8\xd7\xa2\x97\xe9\xac\x1a\x0a\x34\xcd\x3b\x23\x34\xc4\x34\x2f\xf6\xf5\x6d\x22\x7e\x34\x5b\xd9\xbf\xa4\x57\xbd\xa4\xc8\x13\x5a\x7b\xb1\x1f\x5c\x52\x12\x5f\x69\x88\xfe\x4a\x9d\xc5\xe6\x90\xf6\xa9\x22\x12\x79\x7e\x40\xbb\xdd\x58\x44\x6d\xe7\x27\x1a\xb0\x6b\x8c\xfb\xa3\x57\x23\x8e\x95\xfc\x48\x1c\x94\x24\xa2\xbd\xeb\x54\x40\xdf\x4b\x78\x03\x90\x95\x15\x68\xa3\x54\xf2\x49\x5e\xd5\x34\x4f\x10\x67\x35\x9e\xb7\xf3\x15\x2e\x67\xd1\x4e\xc8\x7e\x4c\x94\x10\xbe\x43\x7b\x59\xc5\x4f\x12\x1d\x00\x00\x9e\xd7\xc5\x74\xca\x52\xcf\x0f\xd9\xd6\x96\x2f\x41\x85\xe3\xb6\xf4\x92\x5d\xf9\x21\xe0\xb5\xa4\xdb\x35\x80\x28\x6c\x1b\x1b\xce\xa9\x6d\x78\x32\x27\xab\xde\xb0\x52\xbc\x67\xe8\xf9\x8b\x05\xe5\xeb\x8b\xb6\x31\x45\xd9\x13\x01\xb0\x3d\x8e\xf6\xb4\xd5\x61\x6c\x48\x11\x60\x95\xf8\x41\x56\xd9\xe9\x6a\xf6\x2e\xae\x71\x16\x47\x77\x5f\x76\x9e\x8c\x6d\xf9\x43\x6c\x8b\xdc\x90\xaa\xa6\x35\x7b\x5d\xa4\x0c\x6e\xb9\xc4\x37\x23\x29\x22\xbe\x7a\x47\xbd\x04\xef\xc0\xd4\xca\x4d\xa2\xf4\x32\xbe\x0a\x69\x20\x34\x16\x4a\x55\x51\xe4\x87\xe3\x2c\x19\x29\x61\x3e\x7e\x1e\xa2\x10\x5a\xa7\x1e\x15\xb3\x78\xcc\x1a\x45\x8d\xc4\x95\x0a\xaf\x8a\x59\xc5\x8e\x8a\xdb\xbc\x25\xa9\xbd\xf0\xab\xe2\xa6\x2d\xa9\xbd\xf0\xdb\xe9\x4a\x82\x2a\xe8\xa5\x51\x27\xed\x49\xa9\xb7\xbf\x58\xa0\x42\x64\x3e\x65\x24\x8d\x3a\x9e\x1b\xcf\xea\xba\xc8\xa5\xfe\x23\xcb\xa7\xb3\x5a\x7e\xa0\x84\x59\x7e\x71\xf6\x96\x96\x8c\xa2\x76\xc4\x0f\x69\xd4\x49\x43\xf0\x39\x73\xa8\xd2\x72\xd0\xa8\xb3\xbb\x84\x73\x63\xad\x77\xb7\xdb\xc6\x95\x24\x1c\xcf\xec\x3d\xde\x75\x49\x4c\x64\x92\xc2\x39\x1b\x32\xf6\xa9\x86\xaf\x51\xac\x11\xa7\x3a\x4f\xa4\x1f\xed\x84\xfd\x1f\x5f\x4b\xbd\x56\xd8\xdf\xda\x42\x18\x19\x44\xaf\x29\x28\x63\xbb\x5d\x6f\x10\x0d\x6c\xf2\x47\xb5\xe4\x77\xbb\x1e\x8b\xfe\x4d\x3d\x46\x06\xbe\x2f\xf1\x0f\xd3\xbd\x8e\x01\xaa\x69\xb7\xeb\xd1\x98\x97\xa3\x31\xa1\xbe\x01\xf5\x93\xd8\x60\x3b\xe3\x50\xa2\x13\xba\xff\x15\xe5\x38\x27\xf6\x03\xf8\x91\xc6\x7e\x48\x01\xb3\x3e\xf9\x56\x63\xd6\xd7\xbd\x55\x3e\xc1\xc3\x33\x93\xc7\xcd\x2b\x51\x73\x80\x59\x4c\x06\xac\x96\x87\x3d\xf8\x23\x26\xd6\xe4\x82\x51\x4c\x58\xfe\xe7\x8c\xcd\x98\x48\x18\xc7\x44\xbc\xf0\x0b\x09\xbf\xf2\xac\x60\x12\x2f\x7d\x52\xc4\xd1\x2b\x5a\x0f\x7b\x25\xcd\xd3\x62\xe2\xf9\xd6\x93\x3a\x42\x55\xb6\xe7\x93\xd3\xc8\xbd\xbe\x06\xdb\x12\x19\xc0\x59\x22\x94\xaf\xdc\xad\x22\x26\xd3\x58\x15\x80\x1e\x9e\xd3\x3c\x1d\xb3\xb2\x82\x5c\xe3\x10\xff\x09\xab\xc5\x21\xe4\xf2\xf4\x4a\xdd\x0d\x97\xa7\x57\xa1\xb6\x8a\xb9\xbc\x0a\x3b\x90\xc4\xc9\x91\x18\xef\x08\xea\x13\xda\x13\xe1\xab\x8a\x94\xf9\x1c\x88\xf5\x27\xa2\xc5\x26\x02\x48\x04\x95\xca\xf1\x34\x6f\x2e\xeb\x7b\xdf\x72\x12\xa5\x57\xd3\xc1\x62\xf1\x9d\xfc\x29\x47\x91\xc2\x10\x42\xbe\xd3\x58\x81\xc3\x78\x8c\xef\x9c\xfb\x49\x94\x86\xab\x10\x59\xca\xd9\x7c\x0b\x9a\x02\xd5\x2e\x35\xdb\x35\x31\x15\xbf\x58\x1f\xbb\x06\xf4\x54\xb1\x25\x98\x9d\xc6\x57\x8b\x85\xd6\xf7\xd5\x2b\x30\x00\x96\xee\xc9\x90\xc1\x6b\xbe\xbc\xc9\x86\xce\x23\xbe\x3c\xbd\x8a\xe8\x92\x83\xc7\xe1\xb8\xa8\x58\x55\xcb\x7d\x7a\x56\x16\x13\xa8\xf0\x27\x00\xcf\x4a\xb2\x29\x43\xa0\xb8\x60\x42\x67\x49\x17\x8b\x6f\x3b\x62\x52\xdd\xee\x77\xf2\xe7\x3e\x1f\x67\x80\x7d\xf1\x16\x78\x4b\xb2\xd5\xa0\x84\x4e\x60\x94\xc2\x58\x13\x1c\x2c\x54\x6f\x55\x4c\x30\xd6\x1b\x14\x81\xbc\xc6\x4c\x60\x31\xa2\x78\xb9\xf4\x35\xe9\xf4\x2b\x1f\x5c\x5a\x38\x7c\x7c\x2e\x8e\xce\xbd\x0a\x21\xcc\x83\x47\xbb\x5d\x35\x4a\x4d\x50\xec\x53\x54\x9f\x6a\xa5\x6b\x2c\x69\x05\xc5\xd8\x70\x80\xa3\xa1\x9f\x6a\x48\x8b\x78\x47\x00\x0e\x34\x4a\x25\x62\xd9\xf9\x91\x6e\x6f\x87\x7e\xec\xa5\x9c\xff\x72\x85\x6a\x32\xe5\x14\xae\x28\xba\x13\xd2\x1f\x55\x71\xba\xb5\xa5\xca\xc6\xb3\x98\x63\x5f\x5e\xd4\xa0\xba\x6e\xd4\x50\x38\x9c\x47\x70\xbf\x25\xbd\xd4\x22\x72\xd7\x31\x46\x97\xf1\x95\xef\x27\x6d\x17\xff\xbf\xa9\xd7\x96\xce\x29\xae\xa4\x8d\x1c\xb0\xcb\xab\x74\x4e\x1e\xa9\x91\xde\x4a\x1c\x48\x1f\x38\xbc\x6e\x97\xaf\x73\xef\xba\x06\x72\x93\x37\x4a\x6e\x62\xab\xc9\x8f\x0a\x11\x3c\xbc\x55\x2d\xdd\x33\x1a\x0e\xe3\x28\xde\xff\x95\x53\x85\x70\xf0\x67\xb1\x17\x8b\xbe\x8c\xa5\x9e\xab\xa5\xa6\xdd\x6e\xd2\xed\xae\x2c\x73\x93\x59\xe8\x76\xd7\xee\x48\xb3\x28\x5c\x21\xff\xe5\xad\x30\x16\xee\xaf\xb5\x7b\xb1\x3a\x87\x79\x73\x13\x80\x23\x31\xb7\xe1\x00\x5a\x03\x02\xfa\x36\x36\x81\xf3\xa9\x71\xd9\x66\x7d\x2f\xe9\x76\x53\x9f\x06\x82\xfb\x4f\xb4\xd1\x54\x94\x92\x41\xb4\x43\x46\x11\x0b\x47\xe1\x28\xfa\xd5\x1b\xf9\xfe\x60\x6b\x2b\x1c\xf1\x6b\x59\x14\x1a\x46\xfd\x70\x18\x0e\xa3\x5f\xbd\xa1\xef\x8f\xb6\xb6\x10\xd1\xee\xfc\x38\xd8\x1e\x85\x3e\x8b\x7e\xf5\x98\x4f\x06\xdb\xdb\x32\x79\xb4\x3d\x08\xfd\x7e\xf4\xab\xd7\xf7\xc9\x48\x26\xf3\x7c\x18\x09\x8b\xa2\xa8\xbf\x58\xc0\x9f\x1e\x1d\xc3\x65\x54\x33\x5f\x52\x22\xd8\x5c\x88\xd5\x97\x0c\x39\x1d\xb8\x1e\x98\xe0\xc3\x22\x06\x2d\x32\x7e\xec\x39\x28\x74\xa2\xa8\x1f\xfa\x77\x83\x28\xd1\xcd\x49\x96\xa7\x13\x45\x83\x6e\x77\xc0\xfb\xc2\x1e\x42\x86\x58\x22\xf1\xc3\x24\xfa\xd5\x4b\xfc\x25\x70\xcf\xbc\xad\xb4\xdb\x4d\x55\x5b\xe9\x43\xda\x4a\xb0\xad\xd4\x0f\xd3\xe8\x57\x2f\xc5\xb6\xd0\x22\x53\xc5\x5a\x4a\xb7\xb6\xfc\x79\xec\xb1\xcb\xd4\xc4\x23\x0a\x3b\x25\x0d\xec\x34\x8f\xbd\xa4\x81\x9e\x62\xc1\x63\x1f\xae\x5c\x26\xea\x9d\x4e\x76\x71\x5b\xbc\xe1\x67\x4e\x72\xd8\xac\x0a\x0e\x62\x72\x5f\xfe\xf9\x28\x9b\x22\x33\x69\xdd\x1c\x00\x49\x1f\x63\x7f\x69\x54\x3e\xe6\x14\xc3\x4b\x46\x6f\xcc\xe6\x9f\x9a\xcd\x1f\x81\x19\xb2\x91\xbb\xd2\xe4\x5f\xb1\xbf\x5c\xfa\xe4\x28\x6e\x30\xd3\xc7\xb1\xe7\xdf\x75\x8e\xe2\x6e\x77\xd2\x4b\x68\xfe\xb6\x62\x47\xa7\xaf\xba\x5d\xef\x28\x8e\x80\x62\x15\x06\x97\x6e\x96\x3b\xa9\xd4\xb5\xcb\x1f\x42\xdb\xbe\x6f\x15\x0c\x5c\x30\xdc\xbc\x60\x1f\x6b\x57\x5d\x23\x47\x31\x90\x64\x67\xd1\xdd\x75\x59\x14\xb5\x10\xd2\x83\xce\x8c\x17\x14\xdf\x7d\xc1\x8d\xab\x24\x93\x7b\x79\x16\xa3\x5c\xef\xac\x67\x95\x93\x44\x42\x23\x19\xe8\x17\x4a\xe2\xe8\xac\xa7\xbb\x21\x49\x14\x8b\xed\x26\x29\x61\xd1\xcf\xb1\xe7\x93\x7e\xa4\x40\x45\x5f\x42\x49\xb7\x1b\x5f\xd2\xab\x28\x8a\xd8\x25\xbd\x82\xab\x48\x18\x2c\x26\xdb\x34\x44\x28\xdb\x0d\xd3\x1f\x39\x40\xc6\x97\xc9\x76\x8a\x45\xfb\xdb\xe9\x15\x00\x5c\xd8\x18\x4e\x24\x24\x4a\x1e\x25\xbb\x3f\xa6\xfb\xbb\xdb\xa9\x20\x60\xd5\x0a\x35\x2a\x68\x04\xc3\x07\x29\xe8\x1b\x61\xc0\x90\x41\x69\xbe\x8e\xfb\xe2\x2f\x86\xe6\x08\xc4\xd7\x25\xdf\xd3\x2b\x84\xd9\xe7\x71\xe4\xda\x58\xce\x31\xd0\x99\x93\x53\xb0\x9a\xb8\xc1\xa0\xa2\x2a\xe6\x0c\x88\x50\x58\xea\xb4\x71\xd6\xce\x2a\x3e\x76\x56\x51\xae\xa9\x66\x22\x27\x71\x74\xc7\xf9\x13\xdc\x66\xec\x1e\x7f\x5b\x42\x95\xe0\xe9\xca\x93\x30\x30\x10\x38\x38\x58\x1e\xcf\xaf\x10\x30\x25\xbc\xa7\x31\xd8\x1c\x61\xc3\xd9\x84\x9d\xd7\x74\x32\xb5\xa0\x5f\x11\x91\x2a\x7b\xb1\x38\xa2\x35\xeb\xe5\xc5\xad\xe7\x2f\x49\xda\x98\xb4\x10\x5e\x55\x17\xe5\xac\x92\x9f\x26\x1c\x9e\x6b\xb4\x0e\xee\x2e\xf6\xea\x46\x34\x84\x54\x63\x91\xa3\x18\x93\x8c\xb5\x8e\x92\x90\x46\x90\x68\x8a\x0c\x80\x31\xe8\xd3\x84\x29\xbc\xcf\x50\xa8\xb8\x22\x30\x64\xfc\xc6\xf4\xe2\x88\x5e\xb2\x2b\x7f\x9f\x37\x74\xc9\xae\xa2\xd8\x4b\xfc\xc0\xc5\x8e\x39\x93\xc9\x20\xa7\x87\x09\x51\x1a\xc8\x72\x09\x08\x42\x20\x6f\x75\xcf\x23\x81\x6a\x93\x5e\x73\x61\xf6\x57\x93\x02\xb0\xf0\x49\x7a\xb8\xc6\x60\x2f\xe8\xef\x5b\xbb\x78\x51\xce\x98\xbd\xaf\xcf\x20\x82\x8e\xe8\x7d\x15\xbc\xa2\x96\xc2\xd2\xeb\x73\x98\x55\xcb\x8d\x03\xef\x5c\xcb\x69\x09\xa7\xe7\xf9\x58\xc4\x34\x4c\xa5\x0d\xee\x4e\x73\x7a\x1d\x94\xb9\x8b\xe5\x37\xf6\x04\xf8\x16\xda\xb3\xdb\xdb\x6f\x26\x78\x7e\x20\x05\x8d\x96\x7a\xd0\x58\x01\x68\xc6\xf8\x8e\x3a\xbb\x3e\x59\xb7\xda\x2b\x8b\xe5\x2f\x49\x55\x17\x53\x63\x61\xcc\x39\xdd\x3b\xf4\x46\xbd\xfd\x95\x94\x75\x83\xc7\x83\xf4\x14\xce\x16\xb4\x64\x26\x44\x9d\x1d\x35\xfc\x4f\x6d\x97\x98\xc0\x14\xe5\x62\x2b\x9b\x61\x4a\xcc\x56\x2b\x2e\x89\x99\xdf\x02\x34\x64\x43\xfa\x9e\xd9\xda\x39\x63\x51\x5a\x8f\x13\x89\xe1\x40\xc5\x78\x98\xe0\x14\xc4\x57\xe2\x1a\x54\x18\xff\x79\x6c\xf2\x1d\x50\xe8\x39\xbf\x02\xb0\x20\x67\xa2\xce\x75\x8b\xd1\x49\x1c\x9e\xf7\xe8\x0c\xfc\x00\x21\xf0\x56\x64\xf3\x5e\x5a\xe2\xe7\xf9\x77\xcb\x44\x03\x6c\x24\x9f\x1e\xc7\x4f\x21\x67\xcb\xd9\xad\x93\x84\x07\x5e\xca\x79\x74\x99\xe7\x87\xc6\x47\x94\x9a\x5f\xe6\x3c\x23\x1a\x52\x63\x64\x07\xde\xdd\x12\xb7\xcb\x98\x3f\x6f\xca\x1a\x2d\x14\x30\x53\xc2\x5f\x38\x1d\xbb\xe4\x7f\xce\x4d\x7e\xd1\x26\x62\xa1\x1a\xe2\xe4\xa2\x18\x8b\x05\x93\x1a\xad\x46\x26\xb0\xfd\x78\xce\xd1\xe9\x8c\x28\x79\xab\x92\x11\x69\x57\x64\x38\xdc\xaa\x2f\x83\x8c\x3e\x43\x6a\x1d\x62\x93\x71\xa8\x14\x6e\x56\x96\xff\xc9\x63\x97\x4f\x50\x03\x87\xe7\x87\xbb\x3b\x3f\xb5\x0e\xb6\xdb\x6d\x0e\x13\x59\x56\x7d\xdf\xfe\x82\x1d\xea\x22\xc0\xdd\xf6\xd4\xf3\x8a\xd1\xaf\x71\x48\xa5\x78\x37\x3a\x8b\x75\xcd\x73\x63\xb1\xc4\xcc\xce\x71\xee\xa8\x4e\x97\x93\xb3\x21\xc7\x3b\x8f\xc9\x5d\x4a\x6b\xc1\x67\x1b\x8b\x7f\xf1\x65\xed\x5d\x34\xda\x03\xf5\x50\x1c\x5d\x3e\x21\xbb\x8f\xc9\xde\xf7\xe4\xf1\xde\x15\x79\x17\x47\x16\xb9\xe7\x1e\x8a\x10\x2a\x59\x91\x03\x4a\xe1\x44\xc6\x6d\x96\xa7\xc5\x2d\x79\x2f\x48\x46\xbb\x82\xa4\x01\x5f\x15\x29\x33\x89\xc3\x6e\xd7\x7b\x1f\x47\x2b\xa4\xe2\x2b\x08\x35\xc9\x87\xf2\x5b\x1c\x6e\x64\x7d\xef\xb7\xe6\x08\x38\xd5\xd3\xe8\xba\xdb\xed\xbc\x17\xf2\xea\xdf\xe3\x08\xd3\x7a\xfc\x0a\xa4\xe1\x6f\x71\xd4\xf1\xa4\xb1\x78\xa4\x70\xd9\xef\xb1\x29\x29\x35\xd3\x7b\xc2\x7d\xb9\xdb\xdd\xdd\xfb\x29\x9a\xd2\xb2\x62\x27\x79\xed\xe9\x0c\xcf\x27\xbb\x3b\xbe\x20\xf5\xff\x1d\x47\xbf\xc5\xe4\xab\xc6\x18\xbd\xce\xbb\x78\xb1\x78\x1f\x77\xbb\x3f\xfc\xc8\xff\xdd\xdd\xfd\x29\x7a\x1f\xfb\x84\x26\x11\x8a\xfc\x7a\xfd\xb2\x98\x1c\x0e\x69\x79\x58\xa4\xcc\x7b\xbc\xe7\x93\x38\x89\xee\x30\x66\x02\xd8\xad\x06\x77\x6b\x38\xf3\xe0\x4e\xb0\x26\x81\x5b\xe4\x4f\x75\x05\x57\x5a\x70\x37\x33\xa4\x7c\x9a\x13\x30\x86\x5a\xee\xd2\xad\x8b\xa9\xb9\x99\x79\xea\x12\x9e\x86\xef\xc7\x55\x15\x7e\xf1\xc5\x16\xed\xf3\xcf\x37\xb4\xaa\x99\x7b\xb5\x24\x89\x55\xf3\x61\xa3\x6d\xf6\x66\x0e\xd8\xce\x5b\x33\x66\x3e\x82\xa7\xe3\x59\xe9\xac\x0c\xdd\xc1\x81\x1f\x15\xb7\xb9\x63\xcc\x41\xfc\x7e\x3b\xe5\x3f\xb4\x6a\xc0\x20\x39\xad\x99\x9c\x83\x49\xf7\xe7\xce\x05\x6a\xb9\x64\x63\xcd\x74\x20\xfb\xf3\x26\x04\x55\xfe\x99\x29\xbd\x05\xd1\xdf\x67\xcf\x09\xab\xad\xdd\x22\xcc\xfe\xbc\x49\x61\x9d\x2f\x9f\xd5\x92\x24\x49\xd4\xd9\x35\x08\xec\x34\xc1\x3b\x54\xe8\x96\xa8\xd4\x2d\xc9\xb6\xa4\x6f\xc8\xf6\x6e\x27\x8a\xde\xc6\xca\x86\x23\xee\x8d\xd8\xfc\x10\xf0\x8c\x59\x01\xb5\x46\x02\x7f\xee\xed\x3d\xe9\x44\x91\x2a\x69\x15\xc4\xe3\x11\xa8\xa4\x15\x9d\x93\x58\x80\x87\xf9\xa6\xb0\x44\xc8\x81\x7b\x29\xab\x69\x36\x16\x97\xde\x2a\xca\xa2\x1c\x99\xd2\x9a\x72\xb4\x47\xf7\x69\x4f\xa3\x6e\x10\x0f\xc1\xe2\xe8\x77\x3a\xd6\xaf\x4d\xe3\x18\xca\x19\xb3\xc4\x8b\xfd\xb6\x79\x66\x7d\xef\xf1\x1e\x2c\x06\x78\xf7\xdb\xfa\xa6\x84\xd3\xc9\x92\x73\x4a\x74\x75\x8d\x37\x64\xfb\x34\x8a\x61\xc8\x84\x46\x51\x44\x93\x6e\x37\x49\x84\x5c\xbb\xb1\x3a\x0e\xd2\x51\x7a\x9f\x87\x89\xd2\x12\xf7\xa5\xf2\xb1\x65\x22\xa8\x3d\xeb\xbc\x8b\xbb\x5d\x01\x19\xfb\x1e\x8d\x9e\x71\xd6\x5d\xf0\xbb\x68\x26\x60\x32\xfa\x2a\xc5\xe2\xc1\x21\x11\x16\x94\x50\x21\xec\x6c\x59\x47\xc4\x85\x81\xb5\x1c\xad\xab\xd7\xf1\xe2\x5e\x52\x97\xe3\x17\x6c\xbe\x58\xc4\x3d\x3a\xae\xc5\xaf\x09\xab\xe9\x0b\x36\xf7\xf9\x6f\x51\xa0\xdb\x95\x05\x50\x56\xdd\x4b\x86\xb4\xec\x76\x77\x7f\xc4\x5f\x92\x92\x92\xaa\x5f\x48\x0c\xa1\xa0\xb5\x39\x6d\xb7\x8c\x2c\xb2\x6c\x1d\xf1\x1a\xa8\xf8\x2a\xc6\x4d\xc2\xbd\x5b\xb3\x53\xa0\x78\x4e\xa2\x3b\x6d\x77\x13\xc4\x49\x43\x51\xd6\x34\x31\x14\xc4\x20\x1f\xfb\xbb\xd8\x8f\x83\x4f\x40\x2a\x22\xd9\x00\x05\xa1\x71\xd2\x6b\x62\x6d\xa1\x1f\x8d\xd7\x4f\xa8\x59\xed\x38\x4f\xef\xad\x24\x50\xe0\x4a\x3d\x4c\x97\x55\x97\x7d\xa1\xfa\x12\x76\x50\xc9\x3e\xc0\x5e\xc2\xf9\xee\x96\x1e\xfd\xc0\x44\x36\x11\x78\x9f\xec\xed\x3d\x01\xde\x58\xa0\x9a\x96\x8a\x30\x43\x3f\xec\xef\x7b\x5f\xc5\x3c\x3b\x59\x2c\xfa\xfc\x40\xae\x16\xda\xef\x47\xcd\xf4\xe3\x3c\xed\x76\xfb\x09\x28\x5f\xf9\x61\xf0\x03\x4f\x1e\x87\xd4\x3e\x0b\x28\xe5\xe2\x27\xda\xf7\x49\x3f\x3a\x8f\x35\x2d\xeb\xf5\xc5\xae\x11\xb6\xdf\x07\x50\x88\x36\x58\xe0\xb1\x88\x25\x5e\xe2\x13\x21\x74\x85\xb1\x63\x2e\xf3\x7d\x72\x10\x7b\x7d\x9f\xb0\xa8\xef\x07\x42\x22\xec\xd1\xe8\xdf\xf1\xfe\x00\x57\x28\x18\xe2\x5f\x7f\xdf\x8b\xa3\x0b\xb3\xb3\x38\xe9\x19\xa4\x90\xec\x19\x41\x30\xa2\xbc\xdd\xd8\xf7\x03\x41\x6d\x22\x28\x5e\x32\x12\x5f\x2d\x97\xe4\x8f\x04\x4f\xef\x48\xfc\x1d\x27\x0d\x31\xe6\x24\x91\xda\x90\xe8\x3d\x78\x40\xde\xfd\x91\xb4\x93\x82\x7f\x24\xbd\x92\x41\x00\xfa\x43\x74\x74\x1b\xb3\xf4\xbc\xa6\xb5\x69\xb1\xb6\xfb\xe4\x1b\x17\xa9\xd5\x38\x7a\x47\x3d\x43\x01\xe9\x87\x6b\xeb\x9b\xc5\x88\xb0\x10\x88\x7d\x34\x56\xcc\x13\x69\xbf\x81\x1a\x3d\x55\xf3\x79\x51\xe9\x18\x28\x96\xdc\xea\x8f\x24\xa2\xa6\x49\x68\x01\x33\x1c\x25\xfb\x63\xfe\x7f\xc9\xb7\x04\xe3\x24\xba\xa4\x57\xc1\x88\x97\xd6\xb8\x75\x9a\xa0\xb0\x74\x94\x48\xf6\x78\x94\x90\x38\x1a\x27\xe1\x38\x89\xc4\x22\x86\xb0\x66\x80\x65\x7c\xcd\x07\x5b\x6c\xf0\x24\xf1\x38\x0f\x2c\x26\xf1\x67\xb2\x5e\xa1\x9e\x27\x52\x61\x0e\x6b\x71\x86\x2b\x14\x14\x09\x11\x8b\x05\xc9\x27\xfd\xd7\x8c\xa5\x2c\x0d\xa6\x89\xc9\xe8\x94\x89\xe9\x8b\xef\x50\x2f\x46\x0d\x7e\x65\x5f\x7e\xb5\xbe\x30\x2a\x65\xad\x22\xea\x86\x15\x5c\x59\x75\x39\xbf\xb3\x33\x96\x22\xe4\xed\x1d\x34\x46\xf8\xc2\xe0\x6c\x66\x49\x74\x07\xfe\x13\x18\xa8\xa0\x66\xf2\x6f\x9d\x4d\xe0\xb7\x2b\x3f\xb6\xc7\x45\x42\xc7\x2e\x4f\x63\x13\x9a\x8d\xf9\x8f\x49\x91\xd7\x43\xfe\x03\xbd\xde\xf8\xaf\x29\xad\xaa\xdb\xa2\x84\xd8\x05\xe0\x7f\x00\x91\x07\x18\x2d\x13\x28\x58\xb3\x31\xfe\xf9\x58\xc3\x5f\xd1\xcb\xac\x84\xe4\x5b\xc6\x46\x10\xa0\xc0\xd0\x6e\x26\x86\x5d\x44\xb7\x4b\x7b\x79\x91\x32\x54\x4b\xe9\xdf\xb6\x67\xae\x24\x32\x94\x15\x4a\xbc\xdf\xe9\xcc\x92\x4b\x84\xc6\xab\xc0\xb2\x41\x89\xf7\x3b\x3b\x41\x67\xd7\x50\x52\x2a\x92\x05\x45\x86\x8b\x05\xed\x55\x65\x22\xa4\xfc\x8b\x05\x32\x60\x21\xed\x25\x45\x89\xaf\xdf\xa4\x59\x3e\x78\x5b\x49\xaf\xbb\x6e\x17\x4c\x63\xd6\xe4\x2a\xb6\xff\x31\xe8\xf7\xf9\x04\xf8\x9d\xb2\x6f\x9a\x21\x04\x14\xb6\xe6\x63\x62\x33\x9b\xde\xc7\x44\x73\x94\xf6\x9b\xce\xdd\xee\x9a\x8c\xde\x90\x56\xcf\x18\xe5\x94\x6c\xb7\xdb\xd9\xe9\x44\xeb\x5a\x30\x0a\x7a\xae\x4b\x5c\xd7\x37\xe3\x8d\xcc\x35\xcc\x75\x8c\x31\x2d\x16\x71\xb7\xdb\xf1\x5c\x9a\xa6\x70\x11\x4a\x51\xb8\xc9\x09\x1b\xde\xde\x71\xe4\x16\xb9\xbb\x45\x85\x55\x05\x48\xa2\x64\xb1\x30\x59\x2c\x3c\x63\x7e\x56\x08\x30\xcf\x4d\xb3\x1b\xd7\x27\x89\xed\xc9\x18\x13\xa1\xbc\x0f\x79\x5e\xd4\x86\xe6\x92\xcb\xf8\xca\x0f\x3b\x49\xb7\xfb\x91\x23\xc2\xdb\x21\x63\x63\x71\x33\x79\x6b\x57\xd3\x5a\x0b\xbc\xe1\x7b\x58\x93\xb8\x8f\x7b\x3b\x7c\x69\x56\x6d\x38\xfe\x32\xe1\x14\x5f\x28\x90\x41\x35\x22\x0d\xa8\x7e\xb7\x6b\x18\x47\xd9\x60\xdb\xed\x7a\x2e\x78\x27\xc7\xc5\x47\x80\xcc\xc5\xc2\x2d\x69\x9a\x81\x7b\xbd\xa5\x54\x3d\x30\xfa\x82\x7e\xf7\x5d\xe1\xd6\xec\x06\xd2\xbd\x53\x61\xa9\x01\xab\x0d\xa1\xf9\x11\x3c\x21\x3a\xad\x39\xa6\xb3\xe4\x84\x5a\x98\x1c\xfb\x24\x8d\x5c\x77\x8b\x5e\xc6\x60\xec\xd2\x59\x11\xbc\xc7\x7e\xfb\xa5\x92\xf0\xce\xd6\x65\x55\x4c\x69\xa9\xda\xe3\x21\x72\xda\xe9\xce\x88\xf2\x98\xf4\xf4\x07\x49\x40\xaf\x30\xc3\x9c\xce\x0e\xb1\x14\x86\x0a\x67\xc2\x00\xb4\x70\xc8\x5f\x92\xaa\xa1\x58\xc4\x99\x85\x30\x1c\x53\x8a\x04\x6a\xc1\xbb\x01\x13\xa1\x58\x56\x9b\x4e\xa1\xad\x46\xae\x6a\x10\xc5\xd5\x17\x25\x4d\x46\x59\x3e\x30\xab\xd3\xde\x35\xec\x08\xe4\x31\x61\xd9\x9f\xb2\x31\xab\x99\xc3\x57\xd8\xb2\x06\x7f\x8a\xb8\xc7\xae\xb2\x58\x78\xcd\x46\x00\x00\x0c\x69\xdd\xa1\xbc\xf7\x3b\x54\x1f\x37\x65\xe4\x60\x56\x85\x0d\x35\x82\x2d\x88\xa3\xd8\x93\x33\xf7\x7c\x21\x8c\x75\x5d\x61\xc2\x84\x00\x46\x7b\x02\xc2\xf6\xdd\xba\x9c\x31\x37\x70\x21\x8c\xa6\x8b\x3e\xca\x33\xe6\x87\x54\x9b\x36\xd1\x4e\x14\x25\xfb\x5e\xdc\x93\x2b\xe6\x51\x9f\x74\x76\x7c\x8e\x67\x79\xeb\x47\xfc\xd2\x19\xc2\xe5\xf0\x30\xde\x1d\xca\x36\x18\x76\x48\x7b\x08\x97\x0e\x05\xe1\xd7\x38\x4b\x46\xfc\x07\x44\x08\xe0\x3f\x80\x04\x5b\xe5\xda\x91\x53\x3f\x67\xe2\x31\x79\xd1\xbd\xc5\xaf\x1b\xc8\xf1\x38\x51\x46\x21\xd1\xb9\x41\xe8\x1d\x25\x3d\x9c\x24\xca\x28\xfd\x10\xd1\x42\xe4\x62\xaa\x1b\x16\x9c\xbc\x0c\xc1\x74\x42\x5b\x2e\xc3\x8b\xb0\x82\xbe\xfb\xb9\x49\xdf\x3d\x87\x7d\x06\x53\xc2\x70\x12\x7b\x9d\x5d\x03\x06\x4e\x0c\xa4\x00\x06\x65\x7c\xab\x0f\x13\xd3\x76\xda\x10\xef\x6a\x84\xee\xaa\x35\x42\x93\x4c\xc9\x7d\xc1\x48\x7e\x05\xda\xc3\xbe\x86\x7e\x4d\xa2\x79\xe2\x09\x34\xc6\xb1\x56\xa7\x55\xce\xb9\x58\x3c\xf9\xb1\x5d\x00\x6a\xd0\x3c\x67\x9c\x42\x7b\xc6\xe9\xf7\x67\x09\x88\x08\x92\x21\x20\x5c\xcf\x2d\x72\x19\xd2\x46\x2c\x17\x39\x4f\x7c\xbe\x22\x62\x71\x8c\x99\x9f\xc3\xcc\x05\xe2\x03\xbc\x6a\x46\xc3\xe9\x76\x4f\x12\xef\x67\xe0\x59\x68\x74\xcc\x7f\x12\x4a\xe0\x92\xf7\x49\x9d\x78\xcf\x13\xb0\x8b\xd1\xdb\x79\xa1\xb6\xd3\x95\xa0\x02\x8d\xee\x7b\x7c\xb0\xe4\x59\x12\xc5\x7c\x18\x09\x79\x96\xf4\x68\xfd\xa9\x11\xfb\x0a\x16\xc5\xb5\xc3\x1b\xd1\x43\x7f\x2b\x0f\xae\xdb\x02\x70\xd2\x62\x56\x4a\x7c\xac\x6f\xc5\x63\xc9\x0d\xc3\x59\xea\xa6\xdf\x35\xb6\x18\xcc\x8c\x1b\x15\x62\xa3\xfc\x7b\xbb\xfc\x89\x69\xc2\xdb\x0e\x22\xd8\x00\x30\xc8\xbf\xd9\x0c\xf2\x51\x42\xae\xb3\x0a\x9a\x80\xc5\x39\xc7\x07\xda\x59\x1a\xfc\xfa\x40\xd6\x39\x8a\xf7\x4b\xce\x09\x05\x42\xfc\xde\x8f\x98\x41\xf9\xb1\x75\x94\x1f\x1f\xbc\xb6\x37\xee\x9b\xa6\xc8\x7d\x7e\x31\x65\x63\x98\x02\xc3\x60\xb1\x68\xcb\xf0\x4b\x12\x8a\x77\xb6\xbc\x9b\xc4\x63\xbe\x9f\xf5\xbd\x5f\x13\x7f\x10\xbd\xc7\x8c\xbb\x41\xf4\x36\x01\xac\x38\x8a\x2e\x12\xc1\x0a\x1b\xc3\x21\x1d\xdd\x4f\x27\x6a\xc6\x72\x5a\x2c\xf4\xa5\xde\x91\x3d\x77\xbb\xe2\x66\x57\x29\x8b\x85\x37\x88\xde\xa1\x99\xb9\xb0\x34\x86\xed\x50\x87\xf7\x38\xf1\x06\xa8\x37\x1a\x75\xbb\x23\x8f\x12\x50\x68\x35\x80\x0b\x59\xd5\x18\x40\x3d\xee\x5d\x8b\xc7\xfd\x81\xe9\x58\x2c\x98\x9d\xe0\x73\x02\x3a\x51\x2c\x58\xb7\x2b\x43\x57\x44\x7a\x94\x1e\xe5\xb7\x1b\x13\xef\x50\xc1\x93\xdf\xab\x31\x2c\x3a\x51\xb4\x41\xf9\x9e\xb4\x86\x99\xe0\x87\xcb\xe0\xdf\x7e\x4f\xbe\x48\x9b\xf3\x7b\x42\xee\x6e\x32\x76\x8b\x66\x09\x28\x4b\x34\x35\x3b\xff\x4e\xa2\xbb\x83\x71\x1d\xb8\x28\x5e\x72\x89\xe0\x2d\x03\x57\x88\x9e\x5c\xf2\x8a\xd5\x34\x70\x85\x54\xca\x25\xe7\xc3\xac\x5f\x07\x2e\x44\x1e\xe0\x09\xc6\x18\xbf\x32\x30\xe9\x8a\x92\x59\x09\xa7\x06\x8c\x63\xb3\xac\x9f\x89\xf5\xdc\x5f\x4d\xe2\x9c\xa9\x47\xa3\x7f\x27\x9c\x7b\xdc\xef\x74\x38\x17\x69\xf1\x1a\x34\xd5\x04\xc6\x57\x06\x31\x19\xa7\x0f\x5b\xa5\x8d\xdf\x13\x7b\x9d\xe2\x94\xdc\x55\x10\x14\xe7\x37\x5c\x2a\xfc\xf8\x5d\x98\x8a\x8c\x33\x96\xd7\xbf\x99\x1f\x22\x67\x4a\x07\xec\x37\xfd\x53\x96\xc7\xb5\x13\x2d\x89\x95\xc2\x2f\x5c\x67\x11\x58\x0c\xd7\x14\x3f\x9a\x6b\x10\xd0\x94\xa0\x73\x80\xb4\x5d\xe1\xbf\x85\xed\x4a\xc9\xc6\xb4\x66\x69\x8b\x01\x98\x11\x69\xc5\x28\x02\xa4\x50\xbf\x2c\x26\x82\x31\x00\x64\xaf\x99\xb3\x7d\x4e\x51\xcb\xe0\xbd\x56\x41\x4e\xde\xa1\x3b\x75\x92\x46\x77\x93\x62\x56\xa1\x39\x59\x70\xd7\xb4\x76\x0c\xa4\xf3\x03\xe4\xbb\x2d\x7a\x25\xc8\x3d\x95\x4a\x23\xfc\xba\x61\xa5\x7b\xb5\x24\xd0\x30\x98\xa8\xdd\xd3\x30\xe4\x7f\x5e\xc3\x4b\x92\xa6\x16\x82\x4d\xd2\x4f\xa2\x51\x81\xc7\x75\x33\x92\xed\x69\x2e\x69\x62\x2d\x14\x62\x7b\x35\x14\x8c\x21\x63\x37\xd4\x31\xee\x00\x65\x25\xcf\xa2\xb4\x87\xb8\x3a\x8a\xa2\x74\x3f\x0d\x3c\x9e\x62\x45\xa7\xf1\xf7\x99\xb4\x44\x79\x97\xb1\x5b\x8e\x91\x90\xe9\x7d\x0f\xf5\x04\xaa\x0f\xad\xfe\xf1\xe6\xa5\x51\x4c\xe2\xc8\x8b\xa3\x96\xc1\xab\x1d\xf7\xf7\xff\x8c\xa5\xfd\xae\x1f\x08\x77\x39\x90\x85\x45\xd1\x46\xbc\x32\xe0\x7e\x24\x9c\xd1\xf6\x59\x80\xf4\x12\x8b\xa4\xe3\x1a\xa4\xc4\xd2\xd8\x2d\x4e\x0d\xaa\x2e\x49\x7b\x7a\x97\x09\x45\x94\x3c\x10\x94\x1d\xe4\x8c\x61\x7f\x79\x1a\x9a\x1c\xf5\xc3\x81\x3d\xea\x88\x85\x49\x7b\xa3\x00\x73\xd2\x3e\x20\x31\x1b\x65\x00\x8d\x3c\x4d\x35\xd1\x68\xb4\x1f\x3e\x8d\xe1\x8a\x00\x41\x90\x10\x1c\x0e\x48\xc2\xa1\x87\xa5\x11\xa5\x5f\x10\x7d\xb9\xb7\x12\x86\x5a\x63\xc9\x7e\xaa\xe4\x24\x9a\xd9\x95\x61\xcc\x0c\xc5\xce\x3e\x0d\xda\x18\x42\x50\xf2\xe8\x77\xf6\x16\x0b\x0a\x31\x38\x83\x86\x4b\xe1\x20\x35\xd8\x6a\xd8\x4d\xc3\x58\x17\x2c\x7a\x63\xc3\x84\xdf\x8f\x23\xf3\x13\x6e\xef\xac\xef\xed\x74\xa2\xc8\x8b\x7b\x18\xc0\xe2\x82\x0e\xba\x7b\xea\x5a\xdd\x0d\x57\x1b\x01\x33\x7a\x23\x85\xdc\x57\x7f\x69\xc8\x73\x62\xf0\x67\xd8\x0b\x1e\x6b\x4c\x3e\x4c\x35\x36\x03\x49\x80\xed\xfd\x02\x72\x50\x7f\x7f\x2f\x8a\x22\x98\xa9\x75\x3b\x64\x50\x77\xaf\x23\xf2\xc0\x15\xf6\x87\x1f\x94\xd7\x8f\xb1\x4a\x7f\x98\xab\x64\x9b\x0c\x2b\x66\xcf\x89\xb1\x19\x02\x23\x6d\x36\x46\x76\x21\x55\xe8\xac\xa4\xe5\x5d\x12\x51\x92\x46\x71\x18\x4a\xaa\x2c\x31\x56\xa5\x1f\xb1\x7d\xa6\x3b\x0b\xe4\x79\xeb\xb0\xc5\xa2\x23\x6d\x93\xb3\xbe\xc7\x7a\x10\x0c\x15\x0c\xad\xf1\xd9\x56\xe5\x33\x31\x88\x44\x66\x38\x40\xab\xec\x41\x14\x45\x4a\xa8\x99\xa5\x1e\xf3\x09\xec\x3a\x4f\x4f\xed\xf4\x38\x1c\x44\x83\x5e\x95\xc5\xe3\x2c\x1f\x2c\xe5\x74\x96\x59\xdf\x33\x06\xd9\x89\xa2\x54\x7f\xf9\x49\xc4\x48\x1a\xf5\x25\x59\xd7\xd9\x55\x33\x1d\xa9\x91\x8c\x70\x24\x23\x18\x09\x2f\xb4\x13\x26\x11\x0b\x79\x35\x98\xd2\x52\x64\xa6\x22\x33\x85\xe3\x2c\x33\x47\xd1\x48\x8d\x89\xaf\xc5\x00\x27\x3b\x92\x73\x6f\x6f\xbe\x0f\xad\xac\x69\xbe\x0f\xfd\xaf\x36\x3f\xd8\xdf\x30\x64\xf5\x3f\x3c\xe1\x6c\xa9\x61\x7b\xce\xa7\x8e\x91\x39\xb4\x0b\xee\xf2\x31\xe7\xcc\x01\x4a\x1b\xfb\xaf\x24\x5a\x5a\x7a\x2f\x7d\x7d\xf9\x48\xf7\x69\x60\x98\xf8\x8c\xc4\xd1\x07\xb0\x0b\x4d\xb1\x83\xa3\xec\xc9\xe4\x91\x0d\x95\x63\x53\xac\x1d\x9b\x62\xd3\xb1\x29\x0e\x85\x2e\x90\x83\x86\xf8\xab\xf7\x0c\x30\xbf\x48\x55\x07\x3a\x06\x36\x04\x21\x0c\xce\x6f\x27\x96\xcb\x82\xfd\x75\x8c\xe3\xbb\x58\x18\x1f\x51\xf3\xee\xb2\x4e\xfa\x52\x35\x63\x0e\xc0\xc0\x0d\x7c\x28\x72\xfd\x4d\x55\xa3\x71\x16\xc7\xff\xb5\xc5\xe9\x76\xbf\xe9\xc8\xec\xff\x53\xd7\x89\xcf\x7c\x02\xae\x52\x7a\xc5\x72\x0b\x7b\x19\x2e\x39\x69\x81\x63\xf4\xef\x68\x0f\xec\xa9\xeb\xa2\xac\x94\xb3\x37\x9e\x08\x40\x53\x18\x7b\x20\x8a\xc3\xc4\xc4\xe3\x89\x89\xae\xc2\x24\xd2\xc0\x0f\x68\xce\x02\xf5\x22\xaf\x69\x96\x33\x78\xbe\x5c\x38\x02\xe3\xb2\xb5\xf6\x1c\xfd\x19\x7b\x89\xbf\x44\x8f\xb1\xd8\x17\xdd\xef\x84\xc9\x8f\x66\x71\xa1\x42\x4a\xb6\xb6\x7c\x40\xcb\x32\xe3\x32\xb9\x22\x45\xea\x71\x62\x75\xfa\x92\xdd\xb0\xf1\x05\x88\x5d\x09\x35\x19\x0d\x10\x51\x98\x09\x3e\x6a\x83\xa6\x69\xd4\xd9\x21\x45\x2a\x43\x67\x68\x97\x48\x58\x45\x9e\xdd\x31\x04\x3d\x6f\xa5\x30\x43\x9e\xef\xfd\x84\xf6\xc6\x20\xa7\xf7\x12\x12\x93\x32\x35\xde\xfe\xa1\xbe\xdf\x70\x73\xab\xd2\xb6\xfa\x42\x0e\x77\x4f\x03\x7a\x73\xcb\x54\x89\x15\xa6\xa9\xf4\xba\xbe\x45\x73\x0c\x5c\xc6\x50\x84\x80\x4d\x16\x0b\x23\x7a\xa2\x92\x1b\xc3\xb9\x10\x17\x64\xe2\x83\x96\x00\x28\x3c\xbe\x4b\x93\xd4\xb2\xbe\x4c\xa3\x49\x2a\x2c\x2e\x53\x6b\x71\x23\x1a\xa6\x96\xe5\x79\xcc\x0b\x68\xdb\xf4\x24\xa4\x51\x8a\x9c\x3d\x8d\xee\xcc\x9a\x01\x25\x46\xbd\x20\x26\xba\x56\x90\x10\xb5\xa5\xc1\xe5\xd5\x12\xd4\x6e\x75\xe2\xe5\x10\xe5\x43\x2a\xdc\xec\x5d\x46\xb9\x9e\xb5\xaf\x32\xc9\x18\x8e\x48\x69\x42\x52\xb4\x43\x76\x77\x7e\x52\x73\xee\x76\x27\xca\xd7\x70\x29\x0c\x15\xea\xb4\xa9\x9c\x1c\xb0\xda\xb9\xc6\xd0\x76\x06\xb3\x39\x4d\xc1\xdf\xd2\xb9\x1e\x82\x83\xed\x85\x18\xa2\x2e\x50\xa0\xbc\xfb\xb9\x95\x6d\x71\x68\x45\x1a\x51\x28\x73\x8c\x8d\x07\x7f\xa6\x24\xab\xe4\xc7\xaa\x00\x9d\x77\x59\x97\x74\x8a\xf6\xd4\xa8\x30\x0a\xde\x42\x92\x90\xe2\x8a\xb4\x2a\x25\xd2\x9b\x00\x13\xca\xd4\x54\x93\xce\x52\xd3\x7f\xff\x6e\x19\x82\x62\xcf\x14\xb9\x5c\x71\x1c\x69\x89\x85\x92\x4b\xf7\x3d\x8b\x47\x59\xed\x6e\xd1\xab\xc8\xbd\x15\xbf\x01\x5f\xbc\x2a\xfe\xc2\xd4\x09\xff\x01\x49\x93\x0a\x53\x5e\x9d\x8b\x84\x53\xfc\x2e\xdc\xad\x66\xcb\x4a\x11\x84\x81\x75\xd3\xe8\x8e\xe6\xd9\x04\x98\x3e\x96\xa7\xc1\x2c\xf5\xdc\x03\x99\xe0\x12\xfd\xfb\x38\x4f\x5d\x9f\xa8\xb2\xf8\xb2\x68\x56\xe4\xeb\x6b\x9c\xc8\x22\x66\x3d\x8c\xd3\xba\xb6\x0e\x1a\x96\xf8\x7c\x91\x73\x34\x98\x90\x83\xba\x50\x29\x2e\x31\x3e\x60\x58\x4b\x72\x9b\x46\x77\x4b\xf2\x91\xff\xdb\xd4\x41\xa6\xf7\xeb\xe8\x7a\x10\xc9\xd0\x9c\xa8\x6d\xcc\xba\x58\x78\x42\xf9\x71\x93\xf6\xcc\xa5\xd2\x1f\xa4\xa5\x80\x5a\x9f\xfb\x8b\xc1\x72\xe8\x4f\xdf\x9a\x5a\x73\x20\xba\xbe\xb5\x3c\xc6\x97\xa5\x02\x4d\x85\xa4\xf6\x36\xbd\xa4\xca\xe5\x1c\x3e\xe0\xbe\xb8\x31\x93\xa9\x50\xbe\x40\xa2\x19\x1a\x27\x46\x5f\xf4\x96\xc8\x37\x90\xfd\x31\xb5\x1a\x8e\xe2\xcb\x44\xba\x4f\xbb\x2e\x82\xd8\x5f\x29\x20\xa8\x83\xb8\x28\xeb\xc0\xa5\xfc\x8f\x4b\x78\x82\x01\x59\xc1\x3c\xf5\x5c\x73\x71\x5d\xce\xd6\x5b\x09\x56\x15\x05\x5a\x76\xc5\x4c\x43\x9c\x59\x5d\x27\x5b\x8d\xa0\x7d\xa9\xd5\x40\x85\xe0\x67\x56\xc6\x24\x22\xc4\x96\x81\x1b\x8f\x67\x25\x7c\x1e\x82\xb3\x45\xe0\xa2\xd3\x85\x4c\x82\xf8\xcd\x3c\x8d\xf3\x89\x66\xe2\x05\xc6\x70\x54\x79\x22\xa6\x23\x16\x41\xd5\x92\xd4\xb3\x10\x29\xfd\x0e\xdc\x04\x84\xe0\x98\x50\x54\x10\x30\xb8\xa8\x44\x09\xdb\xe6\xd7\x35\x8c\x8c\xe4\x7a\x35\x2d\xb6\xac\x42\x7a\x62\x2b\x66\x56\x56\xb9\x99\x30\x3e\x85\x82\x79\xcd\x3e\xd6\xaf\x58\x3e\xe3\x45\xe0\x63\xc2\xf2\x99\xc8\x9c\xf2\x99\x17\xd3\xb9\x4b\x36\xf8\xf7\x8c\xf7\x37\xc3\x2e\x8c\x20\x21\x81\x9b\xc6\x63\x3d\xaf\xa3\x92\x0e\x02\x37\x2d\xe9\x40\x7d\xc2\x74\x78\x8a\x9c\x07\x26\xd6\xac\x94\xc9\x20\xe8\x92\x19\x1f\xb3\x5a\xa4\x7f\xcc\x6a\x95\x8c\x42\x2d\x48\x47\xf9\x86\xcc\x38\xbd\x91\xed\x14\x37\x46\x33\x62\x81\x78\xba\x5e\x99\xa3\xb2\x98\xf2\xb4\x62\x8a\x9f\x33\x84\x23\xb9\x5f\xa9\xf8\x36\xf6\xed\x78\x32\xad\x33\x88\xcd\x8b\x3f\x30\x31\x4f\xca\xf9\xb4\x86\x64\xf9\x53\x64\xa4\x98\x98\xca\x04\x08\x61\xe7\xc2\x43\x20\x90\x80\xb1\xc1\xdd\x3e\x68\x75\x88\x54\x73\x04\x42\x7a\x4f\xb4\x6a\x25\x70\x47\x6c\x9e\x16\xb7\xb9\x4c\x04\x8b\x47\x48\x9d\xa2\x01\xb9\x54\xcb\x40\xda\x0c\x67\xf4\x12\x02\xc7\x1f\xd1\x9a\x06\x2e\x06\x91\x07\x9b\x56\x99\x85\x89\x46\xc9\x57\xac\xa6\xa9\x51\x7a\x22\xbe\x55\x11\xb1\x8c\x3c\x57\x2c\xe3\x86\x69\x93\x1b\xa0\x70\x48\x8d\x53\x05\x78\x11\x19\x93\x42\xec\x94\x94\xa7\x89\xf4\x42\x4c\x56\xc9\xf4\x64\xba\xdc\x42\x11\xfe\x45\x24\x8b\xd9\x81\x4d\x68\xe0\x4e\xc1\x34\x14\x13\x66\x15\x24\xcc\xc4\x21\xc2\xe3\xaa\xce\x2a\xff\xcc\xf2\x01\xa6\x64\x39\x82\xe4\x9b\xb2\x18\xe0\x5a\x4e\xc5\x2f\x48\x3e\x83\x47\xfe\x10\x10\x4a\x5a\x33\x03\x08\xce\x93\xb2\x18\x8f\x03\xb7\x82\xbf\x98\xc4\xd8\x88\x6f\x75\x05\x7f\x55\x12\x74\x56\xe1\x0f\x91\x68\xa9\xd4\x02\xa1\x1c\xb2\x81\xec\xbc\xa6\x63\xd0\x34\x57\xf8\x03\x13\x67\xd5\x94\x5f\x96\x6e\x85\x3f\x20\x51\x19\xfe\xa2\x0d\xd1\x89\x82\x9a\x8b\x6c\xc2\xe4\x61\xaf\xb3\x09\x33\x4e\xf9\x45\x31\x18\x8c\x79\x32\xfc\x15\x49\xb3\x64\x28\x11\x5e\xcd\x3f\x0c\xac\x07\x99\x70\x66\x21\x47\x75\xcd\x3f\x70\x6b\x21\x1d\xb7\x76\x43\xe6\x08\x40\x81\x2c\x7d\xe0\xac\x8b\x1d\x70\xb3\x75\xd5\x01\x6a\xb6\x53\x78\xad\x77\xc5\x78\x36\x51\x9b\x71\x03\x5f\xc6\x72\xbd\xa7\x10\xcc\x35\x70\x6f\xf1\x07\x26\x0e\x19\x9f\x0c\x9a\xc9\x2c\xc9\x01\x10\x10\x4f\xd3\x68\x87\x1c\xa6\x91\x8b\x42\x2f\xe5\x29\x7b\x72\xe4\x6e\x79\xae\xbb\x65\x45\x8c\xd1\x51\x62\x34\xad\x77\x04\x97\xae\xa0\x68\xb5\xdf\x97\x7d\x7d\x8a\xf8\x74\xe4\x10\xc3\x12\x5d\x1e\xa6\x57\xd1\xd3\x74\x6b\x8b\x1c\xa4\x97\xf0\x75\x15\xdd\x2d\x15\xa5\xa6\x12\x35\x93\x73\x9c\xca\xe7\x94\x42\xb0\x30\xeb\x67\x65\x85\x4f\x26\x86\x10\x20\xc6\xf8\x56\x9a\x74\xc3\x23\xdb\xa2\x47\xa1\xad\x90\x1a\x51\x0b\xd2\x30\x41\x5e\xfb\x31\x18\xc2\x4a\x8b\x2f\xff\x2e\x8d\xe8\x56\xd2\x33\x9c\xc6\x25\xc3\x98\xf5\x3d\xfa\x63\x14\x77\xbb\xe9\x4f\x2a\xe6\xfc\x1d\xaf\x17\x24\x04\xa3\x11\x07\xf1\x36\x5d\x02\xcf\x42\x03\x1c\xb8\xe8\x23\xe9\xe5\xec\x63\x7d\x8e\x9c\xb7\x7f\x97\x44\x56\x82\x8c\xb3\xb4\xe4\xe9\xda\xde\x6c\x29\x23\xdc\x2c\x61\xfc\x89\x19\xab\xeb\xe7\xf4\x4b\xcd\xef\x9c\xb8\xdb\xf5\x0c\x1b\xbc\x6e\x17\xce\x8c\x30\x7c\xc2\x60\x75\x96\x21\x1e\xc0\xa2\xd4\xe0\x37\x5e\x64\x10\x6a\xe6\xe7\x69\xf4\x50\xff\xab\xdd\xdd\x9f\xda\xfd\xaf\xc8\x49\x1a\xdd\x21\x1a\x78\x98\xf5\x09\xe2\x10\xdb\xfa\x04\xd3\x1e\xe4\x23\xa2\xee\x78\xcb\xf2\xa4\xcd\xe0\x44\xa1\x75\x47\x63\xe0\x4f\x1a\xa2\x90\x5f\x52\xe4\x17\x5f\x88\xbf\x2f\xc5\xdf\x57\xa9\xed\x50\xf2\x5a\x33\xe2\xaf\x52\x8c\x0e\x14\x45\xbf\xa4\x8b\xc5\x2f\x69\x27\x8a\x52\xea\xf9\x2b\x2a\x92\x24\xfa\x25\x0d\x35\xca\x44\x6e\x22\xcb\x9d\xa4\xdb\xfd\x99\xc3\xc9\x7e\x12\xdd\x21\x07\x92\xf4\xec\x52\x84\xa3\x4e\x23\xf1\x38\x4f\x97\x42\xbf\xd3\x1b\xb0\x5a\xcd\x68\xdf\x4b\xa2\x96\x64\xcf\x27\x09\xe7\xa4\x92\x61\x81\xd1\x89\x92\x9e\xfe\x20\xf8\xf3\x14\x4f\x82\xcc\xc1\x4f\x02\x37\xbb\xa8\xa2\x7e\x63\xaa\xaa\x60\x7c\x2d\xfd\x40\x02\xbf\x04\xdb\x97\x69\xb7\xcb\xa8\xf7\x32\x25\x89\x8f\x82\x22\xef\x65\x1a\x25\xc4\x36\xee\x39\x49\xc5\xe4\xc8\x8b\x94\x60\x1c\x42\xa1\xae\x11\xe6\x07\x8a\xa3\x8f\x7e\x49\x09\xd8\xf8\x10\x2a\xa0\xf8\xd4\xd6\xe5\x9d\x7c\x5a\x97\xd7\xa6\x60\x53\x40\x1d\x3c\x81\x10\x54\xca\x94\x34\x0d\x1a\x7a\x37\xd2\x07\x0e\xc5\xeb\x47\x1d\xe6\xfb\x77\x34\xb8\x63\xd1\x51\x8a\xe1\x4d\xce\x68\x4f\x42\x73\xa8\xa5\xf2\x3b\xe1\xe0\xc7\xbe\x44\x47\x03\x19\x09\x6d\x14\xf5\x2f\x07\xc8\xed\xac\x3c\x63\x34\xf2\x17\x8b\x0e\xbb\x1c\x5d\xf9\x77\x10\xf9\x54\x62\x9a\x25\x84\x51\xe5\x3d\x2f\xb3\xbe\xd7\xb7\x40\xac\x69\xe4\xd1\xe6\x87\x82\xf6\x37\x81\xb4\xcd\x30\x70\x04\x5b\xc1\x11\xbf\xa4\x11\xe3\xc7\x20\x96\x67\x20\x14\xf1\x51\x6c\xbf\xa5\x97\x69\xf4\x22\x8d\x7e\x69\x2f\x62\xb8\x3b\xbd\x02\x37\xf9\x46\xbe\x71\x9e\x9b\x4e\x52\xda\x27\xcb\x81\xb3\x47\x5e\xa7\x1e\x2a\xf2\x64\xb1\xe6\x41\xe6\xd3\x7a\x9e\x0a\x41\xe3\xc6\xaa\xbb\x56\xbb\xc7\x97\x23\xda\xb5\xe4\xaa\x86\xf9\xc2\x9b\x07\x1a\x0f\x34\x4c\x2c\xde\xa4\x44\xcb\x2e\x5e\x4b\x55\x1c\x61\x63\x3a\xad\x58\xca\x09\x1c\x61\x1f\x50\xb1\x59\xaa\xb4\xec\x4d\x6f\xdd\x5f\xbf\xac\xf3\x5f\x53\x72\x97\x8c\xb3\x69\x5c\xd0\x12\xe9\xe7\x55\x63\x00\xd7\x2a\x20\x1d\xc5\xec\x5a\x02\x97\x58\x89\x56\xe8\xaf\xb3\x07\x8e\xaf\x69\x58\x71\x96\x92\x3b\xdb\x5a\x41\xcc\xdc\x08\x89\x61\x89\xb1\xa5\x6f\x1d\xe7\x42\xc1\x45\x09\x07\x8c\xb6\xe1\x22\x89\xec\xa0\x4e\x7e\xf7\x31\x5e\x90\x1e\x8d\x76\x1f\xfb\x7e\x40\xa3\x58\x99\x89\xef\xfd\x18\xd1\xc5\x02\x4a\xd0\x7d\x1a\xec\x20\x0a\xb9\x48\xa3\xbb\xe3\x2a\x09\xdc\xe3\x2a\xa1\x53\xe6\x12\x78\xc4\x23\xa6\x65\xe0\x3a\x2e\x79\xc9\xfa\x75\xe0\x1e\x94\x65\x71\xcb\x7f\xba\x84\x53\xf2\xf0\xf9\x76\xea\x92\xb3\x6c\x30\x94\xd9\xf0\xdb\x25\xc8\x4b\x40\x0a\x40\x1e\x39\xe2\xc4\xdc\x11\x08\x48\x5c\xf2\x3e\xcb\x03\xf7\xf4\xdc\x25\xc8\xa9\x9a\x47\x80\x1c\x4c\xa7\x55\x23\x49\x92\xeb\xf8\xf7\x65\xc1\x39\xd3\x57\xc5\x5f\x6f\xca\x2c\x87\x73\xfa\x82\xcd\x03\xf7\x6d\x9e\xa5\x2c\xaf\xe1\x05\x47\x77\x49\xde\xa6\xd1\xdd\x0f\x81\xfb\x94\x26\x23\x8c\xcf\x4f\x9e\x04\xee\x05\x8d\x5d\xb2\xbb\x17\xb8\x87\x63\x46\x4b\x97\xec\x3e\x0e\x5c\x61\x95\xb1\xfb\x5d\xe0\x82\x05\x8f\x4b\x76\xbf\xc7\xfe\xcb\x62\xec\x92\xdd\x1f\x02\xf7\x60\xcc\x53\x9f\x04\xee\x1b\xe4\x4b\xf6\x76\x02\xf7\x90\x4e\x2b\x1c\xc9\xde\xf7\x7a\xd1\x1e\xef\xc1\x72\x3d\x7e\xcc\xcb\x0e\xf8\x01\x26\x8f\xbf\xc1\xdf\xb8\x0c\x8f\xbf\xe5\x3d\xa6\x2e\x79\xfc\x5d\xe0\x3e\x2f\x26\xbc\xce\xf7\xd6\xca\x3e\xfe\xc1\x58\xd9\xc7\x4f\xec\x65\xfd\x66\xc7\x5a\xd4\x6f\xbe\x0d\xdc\x93\xbc\x62\x9c\x38\xff\xe6\x3b\xbd\xbe\xbb\x7c\x8e\xcf\x76\xf9\x8f\xc7\x81\xfb\x6c\x8f\xff\xf8\x26\x70\x9f\x3d\xe6\x3f\xbe\x0d\xdc\x67\xdf\xb8\x64\x63\x97\x4f\xf9\xd9\xb7\x3c\xe9\xfb\xc0\x7d\xf6\x1d\xff\xf1\x43\xe0\x3e\xfb\x9e\xff\x78\x12\xb8\xcf\x7e\xe0\x6b\xb5\x13\xb8\xcf\x9e\xf0\x1f\xbb\xbc\xc5\x1d\xfe\x0b\xda\xe6\x8d\xef\xf1\xc6\x77\x79\xeb\xdf\x7c\x13\xb8\xaf\x67\x13\x5c\x90\x5d\x3e\x2c\x73\xaf\xf6\xf6\xbe\x09\x5c\xce\x99\x9a\x36\x51\xef\xbe\xd4\x22\xe9\x5d\x4a\xee\x46\x6c\x6e\x9d\x67\x50\xe3\x8f\xd8\x5c\x9e\x96\x8b\xf4\x12\xbe\xaf\x16\x0b\xf8\x0b\x66\x7c\x16\x84\x74\x8c\xd7\x97\x62\x81\xf8\x34\x2f\xae\x48\x4a\x7e\xbc\xe0\x18\x12\x71\x60\x04\xbc\x04\x6d\x2e\x83\xd4\xf7\x35\x97\x6f\x52\xa5\xc8\xcf\xeb\x46\xdf\x8a\xe1\xf1\x5a\x57\x8b\x85\x3d\xb2\xc0\x75\x97\x64\x5c\x24\x28\x3f\xfb\x62\xb3\xa9\x92\x4d\x19\x15\xe1\x80\xc0\xd1\x86\xad\x37\xa7\x92\xe8\xa3\x0d\x47\xb6\xac\x09\x2c\x48\xb0\xb3\x24\x62\x0a\x6b\xaa\x7d\x72\x19\xd4\x1a\xf0\xb6\xc0\xdb\xf2\x53\x03\xd8\xb0\x46\xf0\xd9\x9d\x98\x78\xfb\xfd\x03\xe1\x2f\x4e\x6d\xf0\x7b\x9f\x62\x18\x08\xe0\x84\xfb\xac\x5c\xb9\xb0\x7e\xfb\xc2\x0b\xe1\xb7\x94\xdc\x21\x83\x5e\x99\x01\x9d\x2e\xcc\x24\x64\x9a\x53\x2b\x6d\x2d\x04\xdc\x03\x35\x2d\x40\x60\x4e\xe1\xf7\x2f\xbb\x73\x7f\x4f\xc9\x9d\xf5\x6c\xe8\x67\xdc\xf7\x46\xcc\xef\x2f\xdc\x98\x7f\xf3\x8d\x61\xe3\x9a\xfe\xd6\x06\x45\x98\xa3\x9c\xc1\xb1\x1c\x4a\x17\x8e\x8c\xac\x6d\xda\x33\xd2\x38\x5c\x42\xd1\xdf\xd7\x36\xf9\xbb\xd5\xe4\xef\x66\x93\xbf\xb7\x34\x69\x15\x68\xc9\x57\x3d\xfe\x5b\x1a\xa6\x8e\x6b\xca\x99\x4c\xd3\x36\xf5\x2b\x90\x85\x50\x06\x0f\x34\xa0\xc4\xde\xa1\x86\xb4\x5e\x7f\x28\x39\xbc\x4e\xc2\x68\x09\x31\xe7\x26\x51\x46\xc4\xff\xbc\x19\xd3\xb9\xfc\x2b\x04\xe1\x0e\x88\x80\x1d\x90\x67\x3b\x89\xc1\x74\x26\xc5\x74\xee\x24\xb3\xda\x49\xb5\xcc\xd8\x49\x4b\x3a\x80\x7f\x78\xf7\xa9\x14\x07\xe3\xaf\x8f\x59\x0d\x3f\x40\xe2\x0b\xbf\x4e\x6f\x44\x1e\x0e\x26\x2d\x8b\xa9\x93\x5a\xb2\x5b\x47\x88\x67\x1d\x25\x8f\x75\x40\x08\x2b\x1e\x9d\x06\x86\xcb\x01\x51\x80\x93\xe5\xf0\x8c\x9d\x33\x12\x0c\xf0\x48\x06\x49\x18\x01\x1b\x3c\x2e\x68\xea\x8c\x95\x18\x55\xfc\x94\x72\x52\xf8\xc4\x51\x4c\x14\xb3\x3c\x91\x42\x4f\xfc\x75\x3a\x13\x99\x30\xec\x89\x60\xa3\x41\x68\xe9\x80\xa4\xd2\x99\xf2\xe5\x13\x22\x49\x47\x0a\x21\x9d\x52\x09\x20\x9d\x92\xc1\x8b\x4f\x70\x27\x3a\x28\x62\x74\x84\x54\xd1\x11\x32\x42\xa7\x9a\xc5\xf0\xca\x13\x4a\x07\x9d\x5a\x09\x00\x1d\x14\xf4\x39\xb5\x16\xf2\xe1\x6f\x8c\xe4\x21\xa4\x78\xf8\x4b\xc4\xc2\x30\xa5\x74\xce\x8d\x21\x7d\x73\x84\x88\xcd\x41\xb9\xda\x03\x1f\x2d\xba\xdc\x69\xbc\xcb\xb6\xb5\x41\x85\x70\x6d\x17\x1c\xe5\x8a\xdc\xdd\x8a\xc3\x38\xe2\xac\x05\x68\x38\xa3\x4f\x0b\x42\x12\x2d\xff\x48\xb6\xdc\x75\x71\x57\xe2\xab\x65\xf8\x15\xa8\xae\x92\x90\xb2\xcb\xf8\x2a\x4a\xa4\xe1\x6d\xcc\x2c\xae\xf7\xab\x87\x72\xbd\x94\x49\x15\x1b\xb3\xb8\xc7\xf6\xc0\x18\x3a\x30\x01\xa7\xad\xcf\x53\x2f\xb1\xc5\x1a\x9f\x66\xb2\x68\xf4\x2e\x6d\x67\x1c\x9b\x4c\x29\x8d\xce\x56\x4a\x8a\x68\xee\x59\xdf\xdb\x03\x71\x1f\x9a\x3b\xb7\x0f\xa1\x25\xfe\xfb\x9a\x80\x1b\x2b\xb1\xdc\x4d\x9e\xd3\x4e\x39\x9d\xd5\x2b\x49\x37\xcc\x1c\xbd\xc5\xc2\xd2\x28\x5e\x99\xc3\x51\x49\x07\x46\x79\xa1\x43\x5a\x49\xa9\xad\x56\xa5\xee\xa8\x91\x84\xc6\xce\x76\x5a\x63\x3c\x4a\x5d\x64\xa5\x15\xb0\x15\x1b\xef\x57\x46\x67\x08\xcf\x8d\x0a\x52\x6a\xde\x4c\x6a\x2c\x9a\x96\x95\xf3\xd6\x7f\x5b\x69\xdc\xd2\xcf\x07\xab\xc9\x5a\x09\xdf\x92\xa9\xda\x7d\xb3\x3a\x68\x4b\xc3\x1e\xd0\xe8\xf7\x95\x22\x48\x82\x43\x5e\xd2\xcc\x03\xe9\x3a\xcf\xfa\xf7\x2a\xc0\x15\xd3\xb9\xb9\xb9\xd6\xf6\x8b\x28\x1e\x34\xfa\x55\xd6\xd3\x11\xf6\xcf\x97\x9c\x4d\xd5\x12\x2d\x26\xed\x8e\x21\x02\x81\x12\xe2\x2e\x97\x61\x91\x46\xab\x87\x93\x46\x46\x1c\xfd\xd0\x72\x49\x0b\xb3\xb8\xd7\xfe\x4c\x83\xe7\x9e\xa1\x4f\x34\x2b\x8d\x2c\xe7\x1c\xfc\x6f\xcd\x94\x0b\x3a\x35\x3f\x75\xe8\x57\x33\x15\x71\xa4\xd5\x10\x08\x58\xcc\x14\x23\x56\x94\x91\x6c\x62\x52\x3f\xdc\x78\x47\xa3\x1a\xbc\x37\xd6\x06\x1a\x0f\xdf\xcb\x22\xcd\x80\xe7\xe1\x6f\x32\xa7\x19\xbc\xbc\x75\x19\xc4\x9b\x14\xde\xdd\xca\x9c\x83\x98\x91\xd6\x79\x06\x69\x4a\x56\xa6\x1a\xfc\x96\x90\x95\xd9\x06\xa7\x29\x69\x9f\x70\x90\x25\x82\x1a\x49\x58\x74\x79\x45\x52\x16\x6d\x1b\x31\x05\xde\x71\x34\xba\xf3\x53\xca\xc0\xc1\x42\xda\x7d\x26\xec\x32\x65\x57\x04\xff\x44\x82\xc0\xd9\xde\x36\x7d\xc6\x50\xa4\x9c\xb2\xad\xad\x50\x14\x53\xd5\xf5\x63\x31\x51\xbc\xcc\xd9\xad\x73\xce\x30\x1e\x2d\x63\xd1\x9d\xc8\x09\x0e\x97\xe4\x37\xfd\xd5\xd9\x5d\x92\x3e\x8b\x0e\x8d\x48\x3f\xcc\x70\x06\x19\xf2\x8f\xfd\x3e\x0b\x98\xb2\x4d\x35\xf4\x30\x19\xb3\xdf\xf5\x90\x11\x02\x39\xae\xc3\x27\xa8\xac\xf7\x3d\x0e\x85\x9f\x6b\xe3\x01\x90\xb4\xdb\x4d\x7b\x8d\x27\x0a\x5e\xb1\x49\x91\xfd\xc5\xd2\xb7\xf9\x84\x56\x23\x96\x82\x2a\x48\x60\x51\xe3\xe9\x72\x67\x6d\xc5\x57\x2b\xd5\x84\xcb\xc4\xdd\x92\xf4\x41\xec\xda\xc7\x57\xb1\xd8\x65\xff\x2a\x8a\x2f\xfb\x10\x05\x1a\x44\x45\x66\x2c\x8d\xcf\x19\x56\xbc\xbe\xfc\xea\x68\x22\x66\x44\x23\xd4\xa6\xeb\xe6\xda\xef\x45\x2a\x72\x3f\x3a\x99\xc9\x05\x36\x9a\x81\x55\xd6\xf5\xff\x80\xfa\xd0\x4a\xb7\xeb\xbd\xf3\x7e\x23\xd4\x27\xef\x3c\xc6\x1a\x0e\x97\x23\x26\x6d\x0c\xb1\x65\xdc\xdd\xaa\x28\xc1\x46\xf9\x3b\xc3\x46\xf9\x3d\xaf\x1c\x13\xea\x87\xef\xbd\xdf\x48\x62\x45\x20\x1f\xb3\x35\xcf\xba\xc0\xf3\x3a\xed\x63\x05\x39\x83\xf2\x4d\xe8\xd8\x7e\xec\xe6\x02\x69\x6b\xdc\x24\x5a\xc9\xf4\x7c\x3b\x52\x6d\xe2\xc3\x9f\xd4\x8c\xa4\xb2\xf3\x83\x4b\xc0\x61\x02\xc4\x07\x18\x7b\x94\xe8\x55\x87\x70\x95\x7c\x09\x8c\xf7\x40\x98\x74\xe9\x86\x15\x5c\x75\xeb\xd6\x60\x1b\x47\x71\xb7\x1b\xaf\xdd\x6e\x56\x0e\xec\xed\x5e\x2c\x0e\xc3\x3e\x8b\xf4\x29\x6a\x2c\xec\x6f\x32\x9d\x28\xc7\xe4\x8e\xe9\x6d\x90\xaf\x5b\xea\xd0\x7c\x3a\x6e\xf7\xbb\x27\xae\x88\xab\x22\x8c\x33\x61\x8b\xfa\xcc\x0f\x93\x87\x8f\x35\x4a\x43\x84\x9c\x50\x40\x0e\x8e\x15\x4c\x2c\xc1\x5e\x53\xe4\xf2\x71\x43\xb4\x7e\x3d\xcc\xdf\x25\x58\x89\xf8\xbf\x2a\x2a\xf1\x88\xcd\x65\x34\x62\x35\x74\x74\xf4\xab\xa5\x89\xa6\xc8\x45\xb5\xa9\x08\xaa\x0a\x4e\x0c\x10\x12\x55\xdb\x3c\xeb\xb2\x10\x7f\x2d\xda\xc1\x8f\x89\x98\x0f\x70\xeb\x58\x1d\x2d\x02\xe0\xc5\x94\xc8\x2a\x03\xf7\x8c\x08\x88\xca\x20\x5a\x88\x91\x52\xb2\xbe\xd5\x07\x2e\x97\x84\x61\x3a\x88\x12\xcc\x51\xae\x29\x72\x04\x63\x5a\xd5\xc7\x90\x88\x0d\x81\x0e\xdb\x4c\xc8\xd9\x47\xf9\xad\x3b\x60\x1f\xa7\x19\xd2\x37\x9c\xff\x97\x6d\x29\x97\x82\xe6\x7b\x5f\x85\x3a\xb9\x12\x97\x6a\xd7\x13\x61\xd4\x9b\xee\x7b\x18\xd8\xf5\x77\x0f\xd0\x07\x01\x01\x0f\xa1\x2d\x73\xf1\x49\x8a\x1b\x20\xdf\x15\x32\x76\xc7\x3a\xcf\xc6\x80\x28\x31\xfa\x8c\x52\x3f\xf0\x52\x73\x2d\x48\xda\x9c\x27\x49\xad\xa5\x10\x49\xc6\x6a\xa1\x6d\x71\xda\x5c\x8a\x24\x4c\xed\xed\x89\xc3\x54\x80\x04\x15\x46\xf7\x69\x63\x4b\xa9\xfd\x6d\xe4\x23\x58\x50\xfb\x3b\x4c\x2d\x18\xa1\xe6\x57\x98\x2a\x58\xa4\xca\x80\x3f\x15\x30\x27\xde\x6f\x0c\x53\x80\x16\xca\xff\x0d\x55\xd0\x0a\x23\x18\x52\x63\xb3\x84\xdf\x8f\x5a\xee\x3e\x2a\x2d\xc2\x36\x67\x2d\xc6\x77\x91\x69\x0b\x8c\x6e\xd7\xf8\xe8\x65\x15\xba\x89\xc9\x00\x4e\xfb\xb8\xdf\x7b\xa4\x4f\x62\x3f\xc0\x8f\x1d\xf8\x90\x3b\xcc\x37\xd1\x5a\x4d\x74\xd9\xaf\xfc\x60\xd5\x81\x8c\x69\x08\xfa\xf6\xa1\x8d\xac\x84\x17\x64\xf2\xda\x8a\x98\xe5\xe8\x2c\xb3\xc1\x2b\x80\xcf\x71\x6d\x9b\x1c\xa3\x3d\xde\x71\x09\xc2\x35\xdb\x67\x81\xac\x4b\x5c\xb7\x15\x60\xd4\x1e\x68\x13\x7d\x66\x3e\xd9\x87\x73\xda\xdd\x21\x29\x89\xfd\x30\x6e\xf4\x1b\xc6\x6b\x5b\x8c\x4d\xf3\x7a\xb5\xab\xb2\xc1\xef\xf0\x75\x8e\xcf\x6d\x52\x9b\xfc\xaf\xb4\xf8\xbd\x38\xb4\xd0\xa4\x38\xa1\x68\x37\x5e\x7e\x61\x1f\x35\xd3\x21\x33\xb0\x8f\x27\x6a\xd4\x74\x6d\x03\x86\x5b\xc3\x6c\x65\x90\xdf\x98\x83\x6c\x6c\x21\x9c\xcf\x92\xe5\x8b\xc5\xe5\x55\xdb\x00\x63\x03\xd3\xdc\x59\xae\x20\x01\xb5\x5d\x43\x88\x68\xf9\x50\xb4\x28\xc2\xe4\x5b\xe1\x83\x02\xda\x88\x27\xb4\x0c\xad\x98\x1a\x37\xc2\x0b\xe0\x96\x35\x5f\x0c\xfc\x68\x52\x5c\x8a\xe5\x8a\xfd\x3b\x23\xa0\x17\x84\x05\xc3\xa7\x69\x13\xff\x6e\x69\x98\xea\xcc\x25\xc5\xe0\xce\x72\x0c\xad\x93\x1a\x20\x7e\x7d\x7d\x76\x7c\x70\x78\x71\x7d\x74\xfc\xee\xe2\xf4\xf4\xe5\xf9\xf5\xcf\x2f\x4f\x9f\x1e\xbc\xbc\x7e\x7e\x7a\xfa\xe2\xfa\xba\x49\x5e\xdc\x5f\x1a\x7d\x92\xb2\xea\x48\x3c\x07\xb7\x58\x74\xe2\x5e\x85\x31\x1e\x2a\x74\x69\x54\x01\x66\xf8\xd0\x65\x90\x19\xe4\x86\x38\xa7\x78\xc3\xa2\x8f\xcc\x6b\x71\xf8\x8e\x7b\x10\x8b\x75\x92\x21\x2f\x76\x56\x14\x35\xbe\xb1\xe8\x87\xb7\x0f\xac\xf3\x36\x9f\x14\xb3\x5c\x56\x13\x6b\x95\xfa\x77\x4b\x45\xca\xe8\xa0\x4d\xcc\x7e\xea\x5a\x2f\xd7\x0d\xeb\x76\x6f\x98\x15\x12\xfb\x60\x6d\xe1\x5b\xd6\xed\xde\x42\x61\x23\x94\x8f\xb1\x97\x77\x31\xad\x98\x90\xdc\x13\x1b\xfa\x82\x1d\x02\xf7\x91\xd0\xfc\x50\xf9\x2b\x11\x21\x3b\x5f\x66\x32\x65\x48\xab\x67\x45\x99\x48\x33\xc3\xce\x2e\xc9\xaa\x93\x3c\xab\x33\x3a\xe6\x77\x48\x60\xc5\x5d\x3d\x64\xe6\x4b\x9c\x11\x85\x1b\x6e\x5f\x98\xb2\x89\xcf\x28\x0e\x3c\xfc\x05\x97\x24\xb0\x0c\x98\x0e\x64\x1b\xe8\xa6\x1b\x67\x65\xb1\x68\xa6\xfc\xd4\x3c\x4e\xfe\xca\xf9\x6d\x96\x30\x16\xe9\xa8\x41\x49\xaa\xab\x1c\x88\x76\xf3\x02\x94\xe4\x04\xbe\xaa\x66\xdd\x94\x4f\x19\x38\x1f\xf9\xe8\x48\x84\xa1\x87\x68\x94\x98\x65\x88\x5c\x07\xe0\xaa\x92\xf6\xea\xca\x67\x9c\x46\x14\x9c\x27\x31\x00\xad\xec\x9a\xee\x1f\x32\x2f\x25\xc2\xc1\x1c\x4c\x6e\xf8\x6a\x49\x4b\x2a\xb9\xc6\x9e\x28\x45\xc4\x16\xf8\x81\x4a\x51\xcb\x6b\x98\x1e\x32\x53\xa2\x02\x41\xe0\xf8\x86\x22\x41\x20\xa8\xcc\x35\xce\xd3\xa0\x63\xc1\xaa\x81\x69\x8f\xf8\x92\x99\x8f\x66\x4b\xa6\x0a\x8d\xf7\xcc\x79\x47\x51\x02\x41\xd0\x62\x2b\xd5\x00\xd5\xa4\xa7\x7e\x37\x81\x36\x69\x6c\xa9\x80\xe1\x04\xe1\x0b\xc1\x38\x81\xd9\x36\x80\x34\xe9\x59\xdf\x0f\x01\xf3\x25\xe7\x17\x56\x08\xd3\x46\x43\xfb\x7c\x57\xf5\xd0\x3d\xeb\x33\x8a\x6d\x4a\x8b\x34\x2a\x47\x9d\x1d\xdf\x30\x7e\xea\xec\x90\x51\x24\xa7\x32\x8c\x3a\xbb\x12\xae\x46\xa1\x7c\xeb\x7d\xd4\x18\x10\x3f\x2f\xe5\x4f\x7d\xcc\xce\xa3\xe6\x78\xe5\x71\xca\x17\x8b\xfc\xa7\xd2\x5f\x99\x4e\x19\x0e\x17\x0b\x6f\xc8\x7b\x36\x87\x2d\x58\x9c\x3b\x9e\x29\xc6\x13\x8d\xe0\xac\x4a\x78\xde\x10\xc9\x10\xd6\x01\x80\x4b\x9c\x84\xac\xef\x8d\x80\x2e\x9b\x8e\x69\xc2\x7c\x1a\x1d\x33\x6f\xc4\xb9\x26\xc2\x7c\x02\x7e\xc5\x32\xe4\x4d\x69\x66\xf9\x34\x1a\xec\x03\x33\x4a\x49\xe9\x07\x07\x1e\xff\x43\xc0\x51\x9a\x37\x07\x1b\x93\x42\x67\xf6\x36\xc1\x0a\xca\x55\xea\xc9\x4d\xed\x76\xbd\x32\x4a\x7a\xe6\x1e\xcb\x81\x97\x2d\x79\xd1\xe5\x95\x4f\x4a\xf4\x68\x1b\xf9\x3e\xf8\x3a\xf3\xc9\x2e\xe5\xb1\xb6\x4a\xef\x1b\xfe\xf8\x8b\xe8\xf1\x5e\xa0\x4a\xc1\x8a\x2c\x16\xcd\x31\x2e\x16\x9e\x0d\xea\x48\xe9\xe3\xe2\x9a\x8b\xde\x66\xe4\xfb\xaa\x81\xa8\xcc\x91\x18\x0f\x73\x25\x18\x42\xd4\x9e\x16\xaa\x7d\xf1\x41\x25\x33\xac\xa8\xa0\xc3\xe1\x9d\x2d\x16\xa5\xaa\x52\xa8\x7f\x22\x3e\x6a\x13\x51\x30\x74\xed\xde\x75\x09\x53\xe2\x11\xf1\x52\x77\x6c\x3d\x59\xf7\xda\xc0\x30\x3a\x2c\xb7\x78\xe5\x51\xac\x47\x19\xf5\x43\x83\xc3\x8a\xe2\x30\x6e\x8b\x53\x10\x61\x74\xb2\x7e\x74\x97\x55\xaf\xf8\x15\xcb\xd2\x60\x98\xaa\x88\xa7\xac\xc6\xc3\xa7\x6e\x68\x40\x41\x68\x84\xdc\xd2\x5a\x28\x5f\x7f\x87\x37\x7a\xc0\xd0\x92\xc9\x80\x1b\x5e\xe2\x87\x47\xcc\x4b\xc8\x5d\x03\xf1\x0c\x88\x89\x21\x03\x8d\x40\x02\x46\x14\xb8\xe3\xdd\x88\xc0\xca\x7f\x73\x20\x92\x4f\x5c\x23\x92\xc9\xd5\xd3\x5a\x7e\x48\xbd\x84\x0c\xfc\xa5\x9c\x86\x68\xe3\x9f\x99\x4a\xff\x9e\xa9\xf4\x1f\x36\x95\x9d\xcf\x98\xca\x06\x9f\x4b\x5f\xcf\xc5\x44\xa4\xe6\x54\xd6\x4f\x24\xd5\x13\x49\x71\x22\xa9\x10\x55\xae\x9f\x08\xb3\x27\x62\x91\x2f\x41\xba\x6e\x5b\x76\x1e\xb0\x2d\xcc\x5f\x4a\xda\xf9\x8e\xa6\xc5\x14\x4d\x07\xd4\xe3\xa0\x10\x15\x12\x03\x58\xda\x19\xa6\xb6\xc2\x16\x08\x93\x34\x02\x91\x32\xe9\x47\x6b\x25\x9a\x86\x80\x90\x0c\xa2\xfe\x3e\x08\x96\x53\x3f\x38\x0c\x91\xd7\x48\xbc\x98\x0c\xfc\x10\xcf\x50\xd8\xff\x9b\x82\xda\xf4\xb3\x04\xb5\xff\x0f\x7b\x6f\xdf\xdd\xb6\x8d\x3d\x08\xff\xaf\x4f\x41\x73\xbb\x32\x19\xc3\xb2\x9c\xa4\x49\x4a\x16\xd5\x2f\x4d\xec\xd4\x6d\x1c\x67\x62\xa7\x9d\x5f\x5d\x6f\x0a\x92\x20\xc5\x8a\x22\x15\x92\xb2\xad\x58\xfa\xee\xcf\xc1\xc5\x0b\x01\x92\x72\xdc\x99\xd9\x3d\xcf\x9e\xb3\x73\xa6\xb1\x08\x80\x17\x20\x70\x71\x71\xdf\x70\x6f\xa2\x19\x66\x10\xb0\xb9\x5b\xbf\x7c\xb0\x95\xaf\x6a\x86\xca\xc8\x4e\xc5\xa3\x83\x71\x47\x13\xc6\x82\x68\xb2\x93\x9f\xe8\x0a\xbd\x6f\x5f\x88\x70\xd0\x33\x3e\x89\x7e\xc4\x85\x63\x9c\xf8\x02\x4c\x5b\xa7\x81\x29\xd7\x4a\x54\xf8\x15\xa3\x6a\xe2\x23\x60\x42\x67\xf2\xc0\x20\x22\xd6\x98\xb1\x08\x9a\xa6\x61\x67\xac\xbc\x83\x34\x9d\xc3\x92\x7d\x71\x90\xd1\x4f\x69\xf5\xb2\x5a\xe5\xa1\xa9\x81\x80\xf4\x4d\x5d\x0d\xd3\x1a\x1f\xba\xbd\xfa\x8d\x88\xc7\x14\xcf\x21\x16\x51\x96\x01\x71\x83\x98\xe2\xe2\xbb\x50\x5f\x03\xc7\x45\x10\x64\x83\x37\x19\x0e\xe3\x51\x0f\x09\x71\x22\xa9\xc7\x82\xa3\xcf\x45\x2d\xcd\x8e\x1e\x5d\x5c\x4e\xe2\x5b\xb6\xcb\x08\xa2\x28\x42\x09\x84\x80\xfb\xda\x98\x5f\xa7\x91\x1c\x32\xd1\x4f\xc5\xc1\x53\x77\x23\xf2\xe3\x6e\xdf\x20\x8c\xae\x09\xb2\xab\x69\x72\x13\xb1\xb4\x41\x4b\x89\x95\x88\x31\xb6\x58\x2a\x81\x16\xad\xd6\x68\x8a\x4d\x59\x5c\xf0\x39\x33\xc1\x06\x4c\xe1\x10\xfb\xf6\x3b\xa5\xe1\xe7\xe8\xb5\xc4\x89\xc4\x15\x74\xcb\x50\x2d\x70\xfd\x5b\x86\x35\x01\xba\x75\x7b\x4f\xc3\xc4\x5c\x9e\x0f\x34\xa4\xe9\x35\x44\x96\xad\xd6\xeb\x19\xc6\x78\x3a\x1c\x2e\x31\xc6\xb7\xeb\xb5\xc3\xa0\xf3\x05\xb9\xe7\x2d\x67\x8a\x6e\x5d\x24\x1a\xee\x60\xbc\xdc\xb6\xbc\x89\x6c\x84\x04\xe7\xb5\xec\x4c\x0d\xe7\x34\x20\x72\x87\xb6\xf0\x13\xc1\xa7\x1b\x85\x28\x41\x53\x76\xa0\x2f\xb9\xc3\xfe\x6c\x07\xe3\xe9\x7a\xbd\x64\xf8\xb1\x5e\x2b\xb5\x3c\xdf\xac\x6d\x80\xc3\xa1\xf1\xd8\xe2\x7e\xa4\x01\xc1\x98\xbd\x41\x77\xfa\x5e\xa7\x91\x64\x97\x66\xb0\xef\x8c\x05\xe5\xb3\xd8\xda\xe4\xc0\x58\x69\x58\xf7\xd4\x45\x42\x8f\x70\x8c\xa7\x92\x39\xc2\x18\xcf\xfe\xa5\x71\x1f\x4b\x66\x15\x90\xf4\xad\x8e\xa4\xe8\x0d\xe6\xfa\x28\xff\xb8\x37\xf8\xf3\xdb\x51\x35\x2d\x96\x8c\x78\x8a\x8f\xe3\x20\x27\x5b\xca\x9d\x63\x44\xd1\xad\xeb\xbd\xd1\xa9\xcf\x1b\x43\xcf\xf9\x7e\x59\xd2\x96\xae\x73\x87\x12\x67\x86\x8e\xe1\xfa\x03\x71\x96\x6c\xf5\x76\xc6\x9b\xe3\x89\xd3\x37\xa2\x16\xc6\xf1\x7e\x87\xc3\xde\x62\x67\x0a\xc3\x41\x5f\x81\xa3\x16\x6c\x38\x6c\x2f\x83\xeb\xf5\x5a\xb7\xfa\x57\x7b\xf0\x6f\x2c\x37\x3b\x11\xa7\x2e\x8a\x1c\x46\x4c\x5c\x45\x3b\xa6\x8a\x5a\x30\x7a\x22\xa9\xff\xad\x3c\xc1\x8e\x37\x3c\x04\xfd\x19\xed\x5d\xbd\xf3\xd5\x3c\x28\xb2\xe1\x90\xff\xbd\xb4\xe3\xa2\xb4\xaf\x5a\x8f\x8e\x0d\x07\xe7\x68\x51\x94\x35\xc9\x6c\x77\xbd\x7e\x36\x3e\x1c\x3f\xd3\xee\x42\xb4\x94\xde\x4f\xbe\x27\x65\x02\x97\x62\x2a\x15\x45\x83\x93\x1e\x26\x22\xcb\xaa\xcb\x27\x57\x13\xfd\x81\xeb\x01\x04\x23\xf2\xcd\x37\x7c\x80\xde\x19\x45\x33\xe1\xa1\xa9\xb8\x25\xdb\xde\x8b\x90\x54\x37\x7a\x04\x99\xca\xc4\xa0\xad\x29\x0c\xf9\x0c\xfc\x83\xe2\x97\x65\x49\x56\xa3\xb4\x82\xbf\xe8\xc3\x43\xa6\x64\xc4\x2f\xe2\x17\x25\x3a\xa7\xe8\x82\xa2\x8f\x14\xfd\x4a\xfd\xc1\x83\xe7\x72\xe2\x9c\x53\xdc\x3b\x9d\x94\x8f\xd1\x76\xd1\xc5\x96\x16\x8c\xbf\xb3\x5d\xf4\x71\x4b\xb5\xa0\x35\x2e\xfa\x75\x4b\x83\xb8\x24\x09\xef\xc2\xf5\xd8\x30\xd8\xb2\x3d\x61\xbd\xb1\x1f\x4f\x19\x5c\xf6\xe3\x5b\xf6\x3e\xfb\xf1\x5c\xf7\x04\x96\x6a\x4e\xa9\x77\x59\xaf\x7b\x15\x9e\x66\xf8\x22\x82\x3f\xd0\xe1\x90\x5c\x7e\xa0\x57\xeb\x35\xb9\xb4\xff\xeb\xbf\xe4\xec\xd9\x57\xf7\x2b\x5a\xda\x01\x6d\xfe\x69\x88\x82\x01\x98\x5b\x34\x09\x50\x0f\x7f\xae\x59\x94\x45\xc2\x9b\x4f\x70\x31\xcb\xbd\x0b\xb0\xfc\xed\xeb\xd6\x18\x3f\x18\x0e\x9d\xc7\x32\xc8\x13\x9c\x8e\x87\x4d\xf4\x2e\x14\xe9\xd4\xcf\xf5\x0d\x0b\xf3\xd3\xe7\x90\x41\x9e\x33\xeb\xb6\xbd\x17\x6a\x83\x52\x91\x61\xb9\x75\x68\x38\x84\x3f\xa3\x4f\xdc\xd6\xf2\x81\xc6\x4c\x6e\x71\xb5\x90\x9b\xb1\x4f\x70\xd7\xb1\x50\xb0\x72\x18\xbf\x9a\x88\x9f\x77\x1b\x8f\xff\x6a\x94\x64\x22\xaa\x46\x70\x49\xaf\x3c\xf6\x0f\x26\x1b\x9f\xe8\x5d\xd1\x46\xbe\x96\xc6\x1e\x6d\x9e\xe0\x9b\x9f\x6a\x36\x7f\x39\x4f\xc6\xb7\x7e\x07\x29\xf0\x9b\xd8\x2b\x8d\xcd\x57\x2c\x4e\x73\xb3\x74\x07\x2b\x0e\xf3\xb5\x63\x3f\x39\xb4\x91\x7d\xc9\xcd\x43\x22\x0c\xfd\x15\x5b\xee\xce\x15\xe3\xba\x10\x57\x06\x84\x48\x3d\x11\x36\x25\xeb\x26\xad\xa7\xd6\x8c\xae\x2a\xeb\xce\xde\x13\xaf\xb1\x47\x27\x70\x47\x7f\x15\x69\xee\xd8\xc8\xb2\xdd\x3d\x7b\x63\x7b\x01\xb2\x6d\x5d\x25\xfc\x3b\xed\xa4\xc5\x94\x91\x3a\x03\x19\xbd\x5d\x43\x6c\xcd\xce\x29\xd6\xc6\x8f\xf4\x42\x1e\x0e\x0a\x87\x9a\xf5\x52\xea\x60\x16\x13\x67\xa1\x5b\x3e\x23\xa4\xb7\xc2\x91\x2b\x55\x75\xa2\xc0\xac\xf5\x3b\x56\x53\x5f\xb7\xaa\xbe\xd0\xf4\xcc\x11\x88\x46\x77\x46\x9c\xc1\x5c\x46\x39\x93\xa3\x89\x7c\x37\x84\x76\x88\x8d\x5f\x9a\x2f\xf5\xdb\x6b\x6d\xc5\x04\x4f\xc4\xc2\x84\xad\x53\xb2\x90\x60\x02\xdf\x55\xfc\xc3\x8c\xae\x26\x64\x54\xd1\x9a\xe7\x3b\x43\x81\xeb\xc9\x47\x30\x86\xa2\xc0\x45\x5a\x0c\xb2\x1e\x0b\x52\xec\x34\x71\x52\x9b\xa0\xe7\xb8\xa0\x8e\xca\xc8\x23\x4c\xfa\x48\x81\xe1\xaa\x9c\xa0\x6b\x42\x8a\xfc\xc0\x30\xc1\xcb\x77\x07\xec\xa7\xfe\x72\xdb\x36\xd5\x67\x1c\x4b\x1c\x22\x14\xc2\x02\x4a\x64\xc6\x71\x0c\xfd\xa8\x1d\xe4\x51\x4e\xb4\xf2\x44\xc2\xc2\x38\x8c\xa2\xef\xc3\x89\x2e\x14\xe0\xc7\x28\x74\xbd\xc8\x37\x8a\x7a\xd2\x59\xcc\xd8\xb6\x0f\x38\xdd\x00\x1e\x40\xf5\x67\x0a\x19\xf8\xb1\xdb\x33\xb9\x53\x23\x0c\xad\x80\x11\xac\xd7\xcf\x76\xda\xe1\xed\x30\x84\x11\xeb\x13\xd6\x60\x0d\x34\x57\x0b\xc2\x26\x1e\xcb\x65\xf3\x8d\xaa\x9e\x59\x2c\x3b\x43\xd8\xc1\xdc\x4f\x06\x2c\x98\x10\x09\x6e\xb5\xa0\xcd\x8c\x01\x64\xce\xb9\x00\xaa\x82\x35\xfd\x9f\x80\x0e\x2e\x8a\x8c\x81\x44\x7e\x84\x17\xf7\x8c\xdb\x1f\x18\x6f\xfb\x51\xdf\x58\x35\xbb\x70\xbe\x65\xba\x9e\x77\xa7\xab\xfa\xdf\x34\x5d\xab\x2d\x43\xf8\xae\x3b\x84\xfa\xde\x21\xf0\xe9\x0d\x45\xc8\xf0\xfe\x11\x71\xaf\x0b\x65\x4d\x16\x8d\xbf\x3a\xc6\xe5\x96\x31\xaa\xa8\x88\xeb\x75\xb0\x2d\xa6\x1f\xd7\x1f\xeb\x25\x66\x63\x93\x31\x83\xd6\x66\x51\xf3\xfd\xcb\xad\xdf\x3f\xd8\xbe\x06\x86\x0d\xfa\x21\x0b\x72\xdb\x58\x71\x5a\x9f\x7b\x38\xee\xae\xc9\xe7\xed\x6b\x82\xe8\xbf\x85\x18\xc7\x92\x81\x86\xd0\xfa\x6d\xe7\x8c\xa0\x89\xd9\xa7\x15\x1a\xbb\xdb\xb6\xf7\x82\xfe\xa1\x85\xdd\x81\xb1\x4e\x3a\xce\x1b\x81\x62\x5f\x9a\x9c\x8f\xc1\x48\xf2\xe1\xc2\xff\xff\x9c\x7a\xc0\x61\x89\xdd\xfd\x2b\x35\x26\x27\xe0\x1b\x5b\xad\xc2\x96\x01\x21\x38\x4d\xba\xc3\x0a\xd9\x76\xdf\xfa\x15\xfe\x20\x94\xdb\x5d\x3a\x31\x84\x7d\xb3\x2a\x32\x48\x5e\x50\x4f\xdf\xce\x0f\x9f\x1c\x78\xfb\xa3\x7a\x3b\xc4\xf5\x7d\x6f\x8b\xf0\xd1\x81\xd8\x89\xc6\x88\x90\x18\xca\x99\x36\x94\xe5\xdf\x18\xca\x26\x8d\x9d\x7f\x50\x27\x70\xd7\xeb\xdf\xa8\x96\x61\x84\xcf\xf5\xb6\xc9\xe5\x0a\xb0\xf6\x57\x09\x96\x6d\xd3\xcb\x0f\xbc\x6d\xdf\x06\x91\x88\x30\x81\x95\x52\x31\x87\xbb\x98\x19\xf6\x61\x66\xa8\xf3\x28\x3b\x4a\x59\xcf\x8f\x2b\xc6\x34\xb3\x1d\xd1\x8b\x83\xa1\xc2\xc1\x50\xe1\x60\xd8\x83\x83\x72\x6d\xc0\xc9\x10\xe3\x01\x9d\x84\x0d\x4a\x4e\xc4\xa6\x6e\x23\x23\xdb\xa3\x5e\x73\x60\x79\xcd\x35\x91\x8b\x0e\x44\x3a\xc9\xfb\x1a\x36\x68\x21\x08\x05\x9d\xac\xfa\xda\x9d\xf5\x00\x5c\x9a\x0d\xc5\xe2\x86\x7c\x71\xcd\xfb\x33\xcd\x9c\x35\xf4\x89\xdb\xd1\x60\x19\xc3\x2d\xcb\xf8\xa6\x45\xcc\xba\xcb\x15\xf5\x2d\x97\xe2\x67\x08\xbf\xa9\x00\x63\xe2\x56\x62\x86\x65\x08\xa4\x6d\xba\x65\xc5\x22\xb5\x62\x91\x5a\xb1\x68\xfb\x8a\xc9\x2e\x14\xf3\xcd\x58\xcc\xd0\x83\xbf\xb2\xd7\xc8\x58\x4a\x36\x82\xa8\xbd\x94\x14\xf1\x37\xbc\x41\xc9\x1b\x20\x99\x88\xf7\xe2\x6f\x75\x95\xb7\xde\xfe\xd8\x79\x5b\xcd\xc5\xaa\xd5\xf4\xec\x6f\x75\xb4\x54\x6f\x8b\x75\x8f\xf8\xba\x47\xee\xd6\xc9\xbf\x95\xaf\x34\x4b\x1f\xb4\xe3\x51\xa8\xa5\xbf\x70\x08\x8a\xd1\x35\x9a\x35\x51\xbf\x17\x9c\x8f\xfe\x22\x92\x58\xe2\x18\x4d\x71\x8c\xc7\x48\xc8\x1a\x62\xd5\xb2\xe1\x70\xfa\xfd\xb5\x34\x98\x4e\xf7\xf6\xdc\xbb\x8c\x33\xb5\x3f\x4c\x27\x4e\x8d\xd9\x9b\xd0\xbf\x57\xe3\x4c\x31\xfa\x0c\xfe\x0d\x66\x64\x23\x43\xd7\x97\xd3\x2b\x34\x73\x35\x15\xe4\x8d\xf2\x88\xc9\x86\x43\x27\xc3\xb5\x8c\x22\x1c\x0c\x87\x99\x62\x76\x6f\x74\x66\x97\x49\x2e\x99\xeb\xc7\x38\x71\x6e\x50\x8c\xa6\x2a\x5c\xed\x97\xc9\x02\xdf\x78\x5f\x14\x7b\x7f\xe3\x7f\xc1\x37\xfe\x20\xc3\x35\x9b\xc8\x29\xc6\xf8\xba\x95\xd0\x36\x02\x50\x68\xa1\x0d\x28\x13\x71\xa7\x5a\x5f\x9a\xc6\x4e\x86\xd9\xc9\x2b\x3e\xc1\x65\xdd\x67\xd0\x3d\xd2\xba\xcf\xb4\xee\xd9\x7c\x4a\x1d\x95\xb5\xd8\x30\xa8\x19\xa6\x7c\xf0\x5d\xe8\x35\x7e\xe3\x64\x88\xa0\xa9\xea\x01\xa4\x50\xb5\x65\x6a\x4d\xf6\xcc\x2e\x6d\x2e\xd4\xdb\x57\x72\xd8\x20\xf2\x4e\xa6\x1e\xfc\xe5\x93\x53\x77\x26\xa7\xd6\x46\x57\xfb\x5f\x70\x0d\xb3\xdc\xbd\xb8\xd8\xa4\xbc\x14\xb9\x2a\x5d\xed\x33\x24\x1a\x9d\x34\x68\xc4\x51\xe8\x37\xea\x5c\xf7\x1b\x03\x16\xdc\xaa\xd0\xe8\x4d\xfc\x6b\xbc\xe0\x72\xfc\xb5\x1c\xe0\x35\x6f\x73\xd8\xb4\x91\xc8\x39\xc5\x8b\x06\x2f\xbf\x68\x78\x89\x6e\xf0\x35\xc8\xc5\x8e\xab\xa1\xe8\xce\xcd\x28\x2a\x72\xea\x7f\xd9\xdb\x43\x83\xa6\x45\x83\xab\x5f\xee\xc7\xd5\x5c\xe0\xea\x8d\x38\xa6\x0d\x74\xcd\xdd\xbb\x6c\xbd\xde\x8a\xa7\xf9\x16\x3c\xcd\x51\x8c\xbe\xa8\xa5\x98\x4e\x16\x38\xf7\xa6\x8d\x18\xea\x4f\x71\xee\x0b\x34\xe5\xa3\x7f\x00\x82\xea\xdf\xa9\x7d\xe6\x0d\x60\x69\x33\x78\x69\xce\xba\x81\x44\xbf\x7c\xcb\x7c\x51\x38\x3b\x85\x2d\xd3\x0c\xe5\x06\x4d\xf1\x8d\xbb\x05\x69\xb7\xf4\xc8\x06\x2d\x90\xf7\x4b\x5f\xc7\x2d\x44\xbe\xb9\x1f\x91\x6f\x00\x91\xbf\x78\x37\x0d\x22\xdf\x74\x66\xcf\x18\xb2\x3f\xc5\x37\x0f\x42\xe4\x81\x89\xc9\x6d\xaf\x4e\xb0\xbc\xa1\x84\xa3\xf3\x14\xdf\xeb\xb2\xcc\xd6\x63\xea\x8a\x33\x8c\xf6\x9c\x61\xc4\x03\x30\xd7\x98\x82\x0b\x37\x9b\xc7\x29\x0e\x24\x9a\x4e\x79\x6c\xb8\xa9\x38\xf0\xaf\xd9\x1c\x1e\x8e\xd9\xc7\x81\x96\x91\x36\xa7\x9a\x37\x95\xbf\x45\x86\xac\x3b\x86\x12\xea\xeb\x5d\x10\x1c\xa6\x48\x7b\x63\x42\x5b\x27\xa0\x27\x0a\x10\x6b\x2d\xd9\xe2\x29\x3b\x9c\x4c\x49\x83\xe0\x40\x05\x89\x02\xf3\x0e\xf4\x24\xf1\x1c\xbc\x93\x42\x5e\x32\xc5\x6a\x00\x1b\xbd\x67\x87\x32\x6e\xb3\xdd\x7f\x3f\xf3\x99\x20\xca\x39\x7b\x6a\x70\x9f\x04\x53\xd7\x73\x12\xc6\xdd\xd3\x2d\x2f\xba\x28\x69\x64\x79\xea\xa2\xa4\x05\x20\x51\xe7\xde\xcc\x21\xae\x88\xe2\x74\x01\x4b\xc2\x97\x81\x2f\x49\xa3\xc3\xe2\x8a\x60\xbe\x14\x53\xb6\x14\xcf\x55\xcc\x7f\x98\x83\xa0\x99\x6d\x0a\x62\x1a\x05\x6f\x83\xd6\xe4\xd1\xee\xe4\x05\x9d\xc9\x83\x50\xf5\x4d\x20\x7e\xca\xc4\x8d\xad\xdf\xd9\xed\xc2\xf8\x30\xc9\x85\x10\x4f\xd7\xa7\xb0\xf1\x7f\xb7\x75\xfc\x9a\xb4\x9f\x28\x69\x9f\xf6\x4a\xfb\x6d\x74\xb0\xe4\x17\x31\x21\x67\xfb\x98\xbf\x06\xb3\xfb\x09\x67\x7f\x67\x69\x9e\xca\x4f\x1b\x0e\xb7\x6a\x16\x54\x28\x32\x55\x32\x1c\x0e\xb6\xab\x16\xa0\x79\x4b\xb5\xb0\x65\xdd\x4d\x9d\xc1\x7f\x0c\x09\x96\xff\x32\x12\x6c\x7a\x59\x77\xda\xc7\xba\xab\x33\x05\x8c\x11\xca\xcd\x21\x18\x0e\x55\x8a\x8b\x89\x63\x7e\x36\x6a\xd0\xdd\xf5\x78\x1d\x2b\x2b\xef\x19\x6e\xcf\x7e\x46\x33\x91\x76\xe3\x1f\xd4\x51\x56\x6f\xe0\x42\xc5\x4e\x4a\x63\xe7\x37\xbd\xea\xa4\xa9\x9a\x0e\x87\x20\xc6\x08\x91\xa2\xcf\xaa\x44\x25\x19\x26\x1c\xe3\x01\xa7\x1e\xf3\x1b\xd7\x87\x1e\x95\x21\x6f\x10\xb0\x17\x8f\x6d\x44\xcd\x24\x47\x14\x92\x1c\xad\xd7\xb6\x32\x20\xdb\x8a\x7e\xf0\x2f\xe6\x16\xc1\x6f\x28\xfe\x9d\x3a\x3b\x63\xb4\x33\x76\x11\x89\xe1\xe1\x10\x1e\x02\xf5\x70\xa8\x87\x61\x09\x63\x5d\xc4\xd2\xb4\xdc\x42\x7b\x93\x88\xea\x8e\xbb\xb6\xa9\x77\x96\x97\x53\xc4\xd5\x26\x65\xd5\x09\xd8\xca\x88\x52\xe1\x72\xac\xb2\xfa\x88\xe2\xc9\x37\xb4\xd3\xa6\xfd\x96\xa1\x5f\x6e\x1b\xd1\x72\x95\x06\x82\x08\x0b\x15\x7f\x32\xcd\xcd\x87\x8f\x5f\xb8\xbd\x8a\x66\x0e\xd1\xbc\xe4\xcb\x64\x40\x36\xaa\x9d\x43\x17\x71\x6f\x30\x3f\x34\xdc\x5c\x68\xd4\x5c\x52\x16\xb6\xb3\x70\x54\xd2\x3c\xa2\xa5\xe3\xfa\x66\xc7\x7e\x2c\xdc\x65\xfc\x96\x87\x07\x16\x99\x44\xfc\x96\xfb\x0b\x16\x82\xbe\xaf\x86\x31\x6e\xdc\xb7\xf8\xac\x18\xfa\xea\x26\x78\x9c\x76\xb7\x53\xda\x0b\x04\xde\x4f\xe0\xb6\xec\xa0\x5d\x8c\xda\x05\xa0\x22\x14\x26\x77\xd7\x53\x3f\x87\x43\x7e\xdb\x56\xf9\xd7\x30\x2c\x7a\xa3\x4a\x14\x09\x73\x5b\xca\x69\xdd\x8d\x5c\x0c\x1d\x0c\x6b\x7c\xe5\x01\xd9\x9f\x34\xbc\xb4\x76\x40\xc8\x8c\x4f\x44\xe5\xa6\xe1\x4b\x0e\x57\x07\x4d\x67\x33\xd4\xbe\x39\xc0\x26\x9a\x23\x99\x88\xa0\xaf\x27\x9b\xf1\x95\x45\x53\x25\xb4\x21\xcd\x03\x0a\xd9\xa2\x08\x9e\xed\x41\x7d\x21\x13\x7a\x68\x98\x6d\x36\xdb\x56\x6d\xc5\x27\x47\x29\x25\x1b\x9a\xf0\xc4\x2b\x55\x92\x1a\x5f\x50\x89\x39\x6d\x15\x3d\xf5\xde\xc0\x0e\xd9\x72\xb4\xb8\x9d\xd4\x39\x4b\x46\x60\xb8\xf7\xca\x39\xad\x2f\x9a\xd8\xc1\xe8\x16\x93\xd1\xb2\xa2\xe7\xab\x3c\x3c\x0f\xa7\x34\x5a\xc2\x34\x1c\x63\xd9\xfc\x35\x5d\x94\x69\x51\xa6\x75\xfa\x85\x9e\x2f\x83\xba\xa4\x14\xbd\xc5\x01\xb8\x5b\xff\x54\x54\xb5\x44\xa4\x37\xad\x32\x18\x0c\xba\xc0\xe1\x08\xe2\xc4\xff\xb4\x8a\x4a\x19\xec\xa2\xa6\xe8\x04\xb6\x4b\x45\xeb\x56\xf9\x17\x1c\x8e\xea\x72\x75\x51\xbc\xca\x48\x3a\x7f\x47\x6f\x45\x03\x12\x64\x54\xc5\x47\x20\xf8\x1d\x75\xe0\x96\x82\xe1\xaf\xd9\x72\x42\xc1\xc1\x66\x6b\x03\xe1\xde\x2f\x42\x1b\x2c\x30\x19\x75\xdd\x44\xd1\x35\xd6\x32\x9d\x9b\x55\x35\x26\xa3\xae\x17\x25\xfa\x25\x50\x4e\x7a\x46\x85\x74\x01\x09\x68\x92\xe6\xbf\x15\xe5\xac\x15\xb4\x06\x18\x88\x31\x90\xc4\xf6\xbd\x99\x76\xc9\x0f\x8a\x46\x71\x14\xf2\x7b\x50\x68\x2c\x7d\xda\xc9\x64\x00\x5b\xec\x5b\x4d\xa4\x05\xaf\x01\xce\xfe\x20\xda\x72\xb3\x43\x89\xf0\x9a\x4b\xb8\xd7\x5c\xe2\xfa\x11\x8e\x1c\xca\x39\x26\x83\xa6\xdd\xab\x37\xeb\x4f\xe5\x1e\x09\x02\x39\xe1\x83\xc5\x8f\x11\xc5\x80\xd9\x68\x01\x7a\x20\x54\x73\x9b\x59\x80\x39\x75\xde\x19\x23\xca\x4e\x74\xde\xfa\x10\x71\x32\x0a\xb6\x22\x73\xa1\x69\x93\xc1\xaa\xa1\x93\xbe\x38\x5a\x21\x6a\xad\x70\xf7\x0a\xdb\x6e\x85\x51\xc7\x4f\x31\x8d\x1d\xe5\x2f\xe7\xca\x93\x85\x27\xfd\x77\xd5\xdd\x87\xe6\xc4\x89\x78\x3a\xb6\x00\xe7\x1a\x0f\x65\x91\x4d\x24\x26\x32\xe2\x13\xc9\xde\xc5\x94\x47\x75\xfd\xfa\xe1\x20\x4d\xbc\xea\xab\x36\xe6\x47\x3d\xf6\x14\x8f\xc4\xe7\x4f\x5d\xca\x15\x03\x1b\x90\x89\x46\x1b\x1a\x32\xeb\x5c\x03\xd5\xd0\xa7\x40\xcd\x3a\xdc\x66\xf1\x22\xfc\x8b\x88\xce\xe2\x22\xbe\x0a\x8d\x7e\xf0\x89\xec\x96\x11\x28\xc0\x9d\x3e\x7f\xd4\x89\x13\x75\xee\xcd\x80\x6b\x2a\xe7\x96\xb8\x92\x12\x5c\xbd\x59\x9f\xf0\xc2\x89\xc3\x16\x3d\x97\xd7\x9e\x22\x4c\xa5\x27\x11\x32\x9c\x4b\x91\xe6\xba\xa3\xec\xcb\x7c\xd9\x87\xc3\x64\x34\x05\x4a\x41\x87\xc3\x0b\x27\x70\x27\xe6\xe9\xff\x58\xb2\x13\xd8\xe0\x48\x22\x14\xb2\x1e\xd9\x00\x24\x76\xe9\xe8\x25\x7c\x91\x35\xf4\x12\x8d\xd5\x68\xa5\x75\xe5\x5b\xef\x2d\x5b\xee\x5c\x5d\x17\xfb\xc2\x1e\x15\xe2\xb1\x5d\x97\x75\x70\x2d\x6a\xa3\x63\xae\x5f\x56\xcb\xe4\x6a\x8a\x73\xf2\xa9\xe6\xed\x9a\x60\xb5\xc3\x5b\x54\xcf\x1b\x80\x2e\xb4\xeb\xf3\x19\x0d\x87\xf0\x67\xe2\x64\x38\x6a\xa4\xde\xa5\x43\x51\xe4\x4e\xb8\x9a\xc9\x4b\x86\xc3\x25\x6c\xf7\xb6\x53\xe0\xe1\x33\x17\x71\x46\x09\x3d\x3e\x7c\xfa\xfc\xe9\x8b\x27\xcf\x9e\x3e\xe7\x6e\x4b\x3b\xb7\xc3\xe1\x31\x87\xe2\x74\x1c\x1c\x9a\xc6\x6c\xce\x40\x93\xe5\xf0\x99\xce\xba\xfb\x38\x32\x26\x5a\xed\x29\x13\xf9\x9f\xb5\xec\x15\x62\xae\x11\x69\xd3\xb2\x5c\xbf\xba\xd7\xea\xaa\xdb\x37\x41\x8d\xad\xe3\x85\xc7\x49\xce\x73\xfe\xf8\xdc\x6b\xd3\xc9\x5e\x2a\x41\xc1\xf1\x1b\x58\x50\xd3\x99\x59\x19\x56\x3a\xcb\xd8\xa2\x27\x40\xee\xcd\x61\x61\x4c\x5d\xda\x83\x38\x8d\x8c\x67\x5c\x42\x1e\xb4\x19\x6f\x2d\xfa\x01\x0a\xef\x61\xbe\xdb\xed\xfa\xde\xee\x50\x28\xda\x30\xa5\x5a\x28\x0f\x36\x65\xdf\xe9\x8b\x24\x59\x16\xe2\xdd\xdd\xcf\xb5\xf8\xff\x89\x79\xfe\x97\xa7\xb9\x4b\xc4\x9b\xc9\x94\x11\x1b\x74\xda\x41\xd9\x44\x6d\xa5\xde\x74\x2b\xf5\x3e\x1c\xb3\x99\xe8\x1c\x45\xdb\x0f\x9e\x36\xee\xf6\x1c\x43\x83\xee\x07\xf5\x9d\x4a\x52\xaa\x7b\xd8\x59\x23\x43\x7e\xc1\x7c\x3e\x83\x9c\x01\xc0\xc0\x1c\x93\x34\xa3\x51\x2f\x1b\xd3\xc3\x8c\xf4\x70\xaf\x06\x8b\x6b\xf4\xf2\xdc\x76\x37\x06\xdd\x79\xf6\xd4\xef\xac\x02\x50\xaa\x8e\x30\x01\x14\xcb\x08\xac\xa1\x6e\x23\xff\x0b\x5c\x55\xd0\x89\xf6\xe1\x07\xed\x68\x1f\x3e\x17\x7c\xc5\x61\xe6\x3f\x6e\x74\x3e\x40\x70\x9a\xcd\xd3\xa1\x35\x42\xd3\xd9\x3e\x68\x84\xfc\xd6\x91\xf5\xf4\x6b\x79\x91\x92\xcc\x75\x5f\x3a\xc6\xdb\xea\xae\xd5\x1b\x11\x02\x51\xa4\x5a\x53\x0c\x6a\xac\x8a\x78\x46\x1a\x51\x9c\x30\x06\x78\xc1\xd0\x51\xdc\x6e\x85\xbb\x43\x68\x06\x39\x4c\x72\xb8\xec\xaa\x57\xb0\x73\x63\x0a\x5f\x41\x17\xa4\x14\x0e\xf7\xa8\x84\x3b\x40\x65\x05\xc9\x5a\x42\x8a\x72\x0c\xd1\xcd\x3e\x14\x45\x6d\xca\x04\x2b\x86\xfa\xc5\x42\x17\x1e\x96\xbc\xad\x5e\x74\x6b\xb6\xe2\xaf\x1e\x83\x68\x0c\xbd\x5e\x14\x5c\x32\xa0\xac\x85\xfa\x92\xb7\x5b\x1a\x18\x9f\xfb\x86\x35\x2a\x16\x2d\xd1\xe3\x42\x32\x51\x27\xf2\xc7\x17\xe9\x5d\x4b\x46\xf3\x25\x57\xb9\x4d\x9c\x0b\xac\xa5\x28\xdc\xa0\x13\xdc\xde\x03\xad\xdb\xa2\xa1\x3b\x1c\x46\x4e\xe0\x6e\xd0\x97\x76\x34\x3c\xea\xde\x85\xfc\x0a\x0f\x34\x70\x3d\x88\x5c\xf5\xf8\x09\x63\xd7\xe1\xc7\x33\xdb\xf5\x07\x42\x76\x08\x8b\xf9\x22\xa3\x35\xed\xdd\x77\x5c\x8a\xe9\x52\x14\xb1\x77\x16\xee\xa2\x73\x86\x48\x22\x62\x1c\xe7\xdd\x9d\xd2\x54\x03\x4d\x69\xb9\x21\xe6\x5a\x40\x4d\x7d\xd3\x1f\x76\xe9\xbf\x62\x5a\xff\x02\x96\xb5\xa9\x78\xe2\xdd\x32\x6a\xf0\xab\xf3\x4f\x14\x88\x68\x4d\x81\xeb\x2f\x0c\x75\xcb\xa2\xa5\xa5\x18\x0e\x9d\x85\xba\x18\xd0\xae\x44\xed\x82\x26\xef\xe7\x56\xfe\xf1\x0d\x1b\x93\x9e\xa9\x1b\xef\x3f\xf1\x2f\xb4\x78\x86\xcd\x78\xbf\xf5\x56\x3c\x09\x69\xee\x70\xf1\xf1\x5a\x72\x79\x3d\x8e\xd3\xba\xdf\xf5\x1d\xe7\x02\xdb\xc7\x56\x6d\xd0\x8a\x12\x2f\x1d\xd7\xaf\xf1\x60\xea\xd4\xe8\x1a\x65\x68\x81\x42\x54\xba\x3e\xd7\x36\xaa\x22\xd7\x07\x45\x17\x2c\x19\x78\x66\xf7\x28\xbb\x64\x32\xdf\x9d\x85\x6b\xb2\x4c\x6d\xd9\xe0\xd9\xb3\xc6\x55\x3c\xe7\x4e\xef\x6c\x10\x69\xec\xb0\x69\x71\x8f\xc1\xe5\x8b\x08\x3c\xe6\x77\x6a\x08\xa6\xce\x35\x8c\x0d\xc8\x25\xf1\xb8\x09\x4e\xea\x6a\xa4\x9d\xb3\xc9\x53\x9c\x35\x79\x8a\xe1\xa7\xcb\x88\x67\xa6\x7b\xa5\x4b\x84\x7c\xba\x23\x9a\x28\x79\x32\x93\xca\xa0\xac\x93\xbc\x38\xf3\x33\x59\xed\x33\x7c\x48\xf3\x25\x24\x0c\x81\xcf\xd4\x13\x18\x4b\xb3\xa4\x99\xc6\x58\x96\xea\xc9\x8c\x33\x23\x99\xb1\x00\x62\x11\xd6\x91\x96\xc8\x38\xeb\x49\x64\xac\xd5\xc3\xb0\xa4\xea\x9c\x31\xce\x30\x59\x72\x0a\x75\x96\x8d\x6c\x94\xca\x0b\x16\x72\xd0\xb3\x92\x1d\x1c\x7c\xe6\xa5\xb1\xd3\x8b\x64\x5f\x00\x4f\xda\x38\xb6\x70\x55\x6a\xe7\xae\xef\xfc\xbf\x80\x1e\x0c\xf5\x43\x40\x12\x86\x21\x13\x26\xfb\xf0\x4f\xf3\xf4\x4f\x8b\x9d\x05\x22\x28\x6c\x39\x69\x49\xa6\xda\xe9\xd0\x24\xd7\x88\x02\xf7\xad\x0d\x66\x1a\x92\xe0\x17\xfe\x35\xbe\xbc\x12\x48\x06\x58\xd6\x7c\xef\x70\xe8\xe8\x0b\x16\xb8\x0f\xc0\xbd\xf5\xfa\xa9\x42\x43\x46\x67\x9f\x3e\xb7\x1b\xf4\xfb\x4e\x55\x5d\xf3\x90\x02\x19\xb7\x68\x1a\x5c\xd7\xbf\x80\x94\x5f\xc7\xc2\xc1\xff\x66\x34\xcc\xf0\x42\x85\x5f\x5a\xe0\xcc\x59\x08\x36\xe4\xba\xd1\x97\x82\x34\xa0\x89\x96\x50\x2a\xc2\xb9\x33\xa2\x63\x32\x26\x52\x5a\x52\xa5\x20\x34\x69\xa4\xbd\x47\x0c\x38\x1c\xf7\x89\x06\xa2\x88\x1d\x04\xe8\xc2\x3c\x1e\x04\x36\xb0\x25\xea\x32\xa4\x3a\x67\x44\xe3\xce\x2d\x09\xd2\xdc\x64\x6e\xdd\xb6\x71\xeb\x72\x75\x17\xf2\x00\x2e\x22\xd2\xcf\xb5\x7b\x17\xb0\x8d\xea\x9a\xd7\x14\xfa\x23\xf7\xbc\xa4\xc3\x21\xc4\xf5\xf1\xfb\xcd\x3a\x10\xab\xa8\x2f\x4e\xe8\x03\x6e\x11\x8b\x38\x44\x30\x44\x79\x53\xba\xbd\xa1\xb7\xdc\x9b\x6e\xdf\x37\x96\x21\x8d\xba\xdf\xa8\xb1\xe3\xdf\xf2\xe1\x6a\x25\xcf\x3d\xea\x10\x9d\x36\x1b\xaa\xe7\xe9\x70\x98\x40\xea\x68\xfd\xf6\x45\xe3\xa5\xc5\xf3\xd3\xa7\xb1\x13\xc9\x85\x6c\xc4\xcd\xf5\x7a\x3a\x1c\x3e\x6d\xec\xbe\x7d\xa9\xe6\x1b\x2a\xd4\xb3\x47\x8c\xb4\xf3\x83\xfe\xbc\xf3\xff\x46\xca\x79\xd8\xe3\xf7\xa6\xc8\xd7\x2f\x82\x34\x91\xa4\xbe\x95\x31\x01\xd6\xeb\x27\xcd\xcf\xa7\xf2\xa7\x61\x2b\x33\x66\x0a\x85\x78\xe7\x10\xc5\x92\xe3\x4c\x24\xc7\x29\xb2\xec\x87\x2e\x13\x14\xb5\xc1\x72\x1a\xc8\xaa\xa5\xf0\xc7\x49\xb4\xe6\xb4\xa4\x9c\x4c\x1b\x84\xfc\xd6\x8b\x71\xa8\x5f\xd2\xd6\x32\x6d\x49\x26\xcc\x68\xd1\xca\x6b\x9f\xa8\x84\x56\xb2\xfd\xd3\x07\xb7\xdf\x18\xd9\xf4\x37\x21\xde\x19\x6f\x04\x5d\x0e\x1a\xba\xcc\xf1\x01\x38\xc3\x64\x72\xe2\xc4\xba\x96\xc0\xf5\x2e\x5a\x05\xfe\x40\x31\x0b\xca\x28\x1c\xe3\xad\x8a\x05\x4f\x61\xa2\x6e\x59\xea\x59\xe6\x46\x0a\x36\x98\x89\x7f\x03\x45\x1f\x82\xa1\xbe\xe6\x2d\xe0\x30\x7c\x70\xff\x16\xce\x6e\xf8\x15\x7a\x1e\x92\x7b\x19\x64\x69\xa8\x04\x1d\x26\xa4\x49\xc9\xc5\x27\xa6\x7c\x06\x57\xea\x49\x57\xe0\xe0\x74\xab\xc4\x53\x46\x49\xe6\x69\x0d\x01\x02\x50\xae\x9e\x85\xb4\xb7\xc2\x53\x6e\xc0\xd1\x6d\x49\x4b\xd5\x8a\x95\x8a\x96\xb7\x78\x2a\x84\x4b\x2e\x55\x1e\x9b\xcf\x17\x45\x23\xde\xbd\xc5\xd3\x51\x0a\x89\x8e\x78\x34\x6a\xf4\x46\x15\x9c\xe4\xaa\x99\xa8\x1b\x5c\xc0\x10\xe6\xc5\x35\xe5\x80\x4f\xcc\xe7\xe3\xb2\x98\xab\x77\xfc\x46\x8a\x9a\xa7\xf5\x87\xd6\xc0\x8d\xb4\x1f\x2b\x83\xf4\x6d\x10\x7f\xe5\x7d\x46\x42\x9e\xc9\x44\x6f\x2b\x3c\x42\x64\xfe\x84\x66\x81\x4c\xdf\x90\x98\xb1\xd1\xd2\x66\xad\x36\x86\x49\xa6\xe4\x36\xf6\x55\x52\x4d\x61\xaa\xc1\xf7\xed\xeb\xc0\xd8\xd7\x91\xda\xd7\x72\x57\x07\xf7\xec\xd2\x76\x9a\xba\xa7\x0f\x6d\xad\x9f\xc3\xcf\x0e\x6d\x77\x13\x6a\x82\xd3\xe1\xb3\xe1\xd0\x61\x12\x12\x0a\x0d\x71\xea\xf0\x39\x13\x13\x02\xa0\x5f\x21\x1c\x11\x77\xfa\x5e\x0a\x7b\xf7\x52\xa8\xef\xa5\x58\x37\xe4\xba\x8c\x32\x72\x5d\xf7\x16\x42\xd3\xb3\x85\xb4\x7a\x6e\x18\xd6\xba\xfd\x16\xee\xee\xc0\x26\x7c\x26\x7f\xca\xdc\xa8\xcd\x77\x3c\x76\x25\x61\xb0\x02\x4d\xa0\x0c\xe5\xf1\xf6\x14\x8b\x57\xf5\x76\xdc\xa5\xa6\x43\x6e\x42\x30\x36\xf3\x53\x05\xc2\x36\x98\x1d\xf1\x60\x3b\x9a\x45\x5f\x66\x46\x54\x41\xa3\xf9\x2c\x0a\x62\x4a\x1b\x62\x4a\xf9\x00\x26\xd1\xe4\x0d\xb8\x03\x35\xd2\x65\xe8\x7a\x6f\xbb\x45\xd1\xe4\xd8\x2c\x74\x99\x48\x6e\x14\x18\xd2\x19\x35\xa4\x33\x2a\x09\x2a\xed\x7c\x21\xf5\xa9\xac\x36\x08\x2a\xdd\x42\x50\x69\x2f\x12\x50\x1d\x09\xa8\x41\x50\x07\x8a\xa2\x52\xbd\xd9\x86\xf6\x2c\xbe\x56\x0f\xc3\x52\xf4\x53\xec\x70\xc8\xaa\x96\x16\xb9\xb1\xc1\x13\xc8\xca\xdb\x0e\xdc\x4c\x34\x4d\xa4\xdf\xbe\xe2\xa8\x9e\xb4\x46\x7a\xb4\xe1\x16\x30\x45\x61\x3a\x8a\x9d\x2d\xea\x54\x83\x73\x93\x7e\x30\x06\x8f\xc9\x17\x46\xc5\x2e\x68\x6b\x7e\xc8\x76\xe3\x91\x0a\xda\x24\x43\xfb\x1a\xba\x2c\xbf\x1b\x07\x4d\x12\xba\x78\x38\xcc\x9d\x10\xc5\x88\x82\x87\x7f\x60\x30\x98\xcf\xbc\x6d\x92\xe5\xe3\x86\x6d\xe9\xe8\xb9\xfd\xa5\xa3\x2b\x46\xb6\x1b\xbc\x42\xd0\x68\x1b\x54\xaf\x4b\xa6\x9e\x80\xfe\x9a\xcf\xf4\xdb\x34\xa6\xaf\x56\x61\x46\xab\x87\xcc\x77\xef\x14\xeb\xaa\xa2\xa7\xae\xa6\x59\x72\xc3\xfe\x00\x38\x28\xec\x0f\x80\x83\xc2\x6e\x38\x1e\xc7\x6d\x02\x97\x44\x9d\x70\xd0\xa4\x13\x00\x7a\x4b\x97\xfe\x96\x2e\xfd\xb0\x27\x90\x87\x03\x91\xd1\x83\xd6\x82\x37\xde\x77\xa7\xe2\x4a\xaa\x31\xcf\x61\x7f\xf3\x10\x9a\x87\x2d\x8e\x4b\xea\xef\x9b\x89\xf4\xb8\x5e\xce\x14\x45\x8c\x99\x6e\x6c\x78\xc6\x84\x0f\x87\xa5\x13\xa2\x81\xc0\xd2\xf6\x4c\x9b\xc6\x86\x67\x9e\x79\xc4\xdd\x8f\x1a\x2f\xeb\x9a\x84\xd3\x0f\x34\xf6\x7a\xf2\x23\xb5\x84\xc8\xde\x48\xf6\x3d\xe2\xe0\xb7\x5e\xe0\xcc\x9c\xd0\x6d\x5b\x3c\x02\xc8\x98\xdd\x90\x9f\xbe\x9e\x89\xe8\xb5\xd1\x2b\x12\x21\xb4\x72\xbe\x2f\x8e\x21\x3b\x58\x23\x5f\x80\x54\xa2\x1e\x03\x0e\x03\xe3\x38\x86\x0d\xf7\xbc\x31\x8b\x35\xb7\xaf\xe5\x47\xc8\xf4\x04\xba\x16\x3e\xe2\xe5\xba\x12\x9f\x15\x6b\x99\x38\xe2\x78\x83\x62\xf3\x31\x31\x1e\x25\xeb\x65\xea\xf7\x3d\x4d\x8b\x2e\xf5\x07\x8e\x4a\x2c\xe0\x6e\x50\x9f\xe9\xa0\xf7\xa5\x44\x7b\xa9\x6d\x30\x30\xe6\xf2\x57\x87\xf2\x7c\x00\x31\xff\x93\x30\x8c\x47\xa6\x25\xc2\x78\x21\x56\x3e\x7e\xdc\x8c\xcc\x01\x20\x0e\x80\xbd\xda\x76\x77\x6a\x91\x93\xdf\x9c\x84\x27\x47\x08\x30\xa8\xfd\x7e\x63\x2f\x8a\x54\x04\x3c\xe9\x00\x6a\x79\x51\x75\xb0\x2e\xc2\xfa\x07\xa2\x19\xd6\x27\xc9\x1f\x44\x38\x74\x66\x48\x86\xa8\x73\xfd\x19\x37\xf4\x3b\xb2\x27\xc4\x7a\x8a\xf8\x68\xb9\xbb\xd5\xb6\xe9\x54\x50\x71\x1c\xfb\x89\xf6\x60\xe8\x58\xa6\x1d\xf4\x6a\x9c\x31\x65\xa8\x75\x38\xef\xc6\xae\x2f\xee\x2f\xda\xaf\x8f\xde\x1e\x5d\x1c\xbd\xb6\xfd\xd0\x88\x14\x69\xde\x74\x0d\xf5\x38\x11\x8d\x8b\x5e\x63\x71\x9b\x38\xfa\x93\x1e\x67\x22\x44\x7a\x0d\x06\x2b\xb7\x6e\xbc\x33\x6b\x37\xba\x7a\x48\xa3\xf9\xe6\x86\x95\xc8\x05\x8e\xc5\x62\x7a\x49\xcb\x6f\x46\x52\x81\x89\x63\x84\xc0\x44\x3b\x63\xd7\xdb\x39\x6c\x39\x2b\x04\x38\x01\x48\x7f\x0b\x84\x24\x14\x1c\x86\x11\xa7\x39\x92\x7a\x04\xd2\x27\x76\x90\xe1\xf0\xdb\x1d\x15\xa5\xf0\x89\xfc\x09\x9e\x8e\x5a\xeb\x95\x08\xcc\x49\x71\xbf\x6f\xa0\x3f\x60\xe4\x67\x2a\xcd\x64\x3e\x8f\x34\x22\xb6\x73\x8f\x57\x5f\x77\x7b\xee\x1c\x4a\xbc\xdb\xda\x70\x83\xbe\xe6\xef\x67\xb6\xbe\xcf\xfc\xa7\xb7\x04\x72\xf7\xad\xed\xf6\xbf\xa1\xdb\x03\x3b\x6f\x3d\xb3\x05\x5d\xf8\xfa\xd7\x6d\x44\xb8\x4e\x32\x0a\x49\x2e\xe0\x1b\x66\xd5\xa6\xd8\x30\x41\x0a\x79\xdd\xfc\xe0\x73\xe1\x83\x3a\xe5\x95\xc7\x0c\x89\x9b\x5a\x2e\xe4\x96\x6a\x45\x9a\x7e\xf2\xa6\xcc\xe8\x64\xc5\x79\xcf\x25\xff\x73\xcb\x84\xc3\x87\x2c\x1e\x71\xef\x96\x78\x30\xd5\x71\xb2\xed\xa8\xb1\x6a\x2e\xa7\xdf\xe2\x9d\xf1\x57\x17\x79\x89\xf9\x58\x7c\x36\x88\xbf\xb3\xe2\x3c\xb0\xcd\xad\x24\x86\x10\xdf\x4e\xc4\x8d\xe1\xa1\x61\xdc\xbb\x08\xcf\x1c\x6e\xeb\xdf\x89\xd6\x6b\x55\x6c\x18\xc4\x1f\x43\xc7\xda\xb0\x37\x81\xb3\x42\x4b\x77\xc3\x4a\x96\x78\xea\x44\x22\x2b\x8c\xf9\x16\xcc\x19\x62\xdb\xe4\xa1\x78\xa7\x92\x0b\x94\x8e\x19\xda\x53\x90\x90\x16\xa7\x02\x76\x35\xdf\x8c\xaf\x1d\xe8\x26\x47\xa0\x0e\x3b\x63\xc8\x70\xf5\x70\x3c\x6e\x14\x93\x79\x6b\x18\x66\xff\xe4\x7e\x3c\x17\x19\x97\x77\x30\x1e\xac\x9a\x40\xff\x6c\xa2\x6f\xb5\x9b\x7f\x2e\x9b\xa5\xb1\x0c\xdd\x27\x03\xa6\xb2\x66\x8a\x06\xad\xd7\xf6\x94\x12\xc8\xc6\x1c\x0e\x87\x76\x50\x44\x2b\xf1\x7b\x87\xc7\x9f\x30\xcd\x40\x2e\x97\xcd\x97\x7e\xe8\xbb\x01\xdc\x0e\x47\x21\x66\x1c\x94\xcf\xba\xf3\x97\x78\x35\x99\x19\x4a\x1a\x3d\xce\xda\xce\xd8\x38\xb1\xfe\xea\x61\x88\xde\x06\x78\x4e\xf0\xce\xb8\x2f\x25\x92\x7e\xe4\x73\x96\xe9\xb9\x1e\x53\x0a\x52\x96\x44\xab\xe3\xa2\xe4\x89\x03\x18\x56\x69\x77\x01\x72\x11\x56\xe0\xf0\x7b\x0d\x91\x5c\xcd\x2e\xac\x9d\x45\x0c\x45\xfb\x4f\x34\xa2\x66\x52\x3b\xc7\xc4\xc5\x1c\x4c\x7c\xf9\x43\xaf\xf5\xaf\x13\x91\x4e\xea\x33\x0e\xe5\x31\xf0\xd9\x97\xfb\x66\xe7\x10\xc9\x50\xc3\x90\x58\x41\x8f\xb2\x24\x5b\xc5\xf8\x73\x33\x66\x3f\x06\x45\xce\x4d\xe2\x7c\x86\xad\x15\x0f\x0f\x1f\xbf\x90\xf1\x3e\x3f\xb7\xd2\xf5\xec\x60\x9c\x0c\x87\xb7\x89\x93\xb8\x1b\x71\x9c\xc6\xc3\xfd\xc7\x4f\x1f\x2b\x19\xea\x27\xca\xe0\x7c\x6e\xd9\xd7\x0d\x2e\xbd\xbf\xc9\x09\x75\xb4\xde\xd0\xe7\x96\x29\xa2\x55\x3d\x30\xeb\x5f\x78\x6f\x43\x86\x9a\x2b\xf6\x15\x88\xfd\x3e\xdc\x7c\xc6\x9f\xb5\xa9\xde\x08\xbb\xc8\x69\xc8\xe8\xc8\xce\x18\x51\x7c\x1a\x6e\x18\x07\x25\x24\x8f\xcf\x1c\x07\x9a\xb8\x62\x68\xe6\x7c\x46\x54\x1d\xdd\x9f\x87\x43\xc7\x04\xe9\xba\x9b\x2f\x09\xdc\x01\x91\x48\x41\xfa\xd6\x85\x0d\x46\x45\x4d\xde\xba\x26\x53\x63\x4d\xa6\xc3\x27\xcf\x86\xc3\x97\x49\x7b\x4a\xa6\x6c\x71\x86\xc3\x1f\xe5\x62\x4d\x87\xcf\x9e\xaa\x5b\x9f\xf8\x73\x63\x5e\x10\xd0\xdf\xc3\x25\xdb\xf7\x70\x39\x9f\xba\xe8\xbd\x76\xbd\x95\x4a\x8b\x4d\xac\xe9\x77\x74\xfd\x06\xd5\x9f\xd1\x56\x28\xae\x82\x03\x13\xf8\xa2\x91\x3b\x10\x35\xa4\x6b\x6a\x1c\x32\x8d\x54\xfa\x0a\xd6\x25\x1e\x41\x22\x60\x74\xa7\xaa\xce\x6b\x12\xce\xbc\x78\x64\x16\x6c\x5c\x7f\x60\x48\xa6\x52\xe1\xc0\xd8\xf6\x80\x60\x01\x67\xab\xcf\x19\x04\x1d\x25\xc6\x3a\xfa\x9f\x3b\xc1\xcc\x3e\xe3\x63\xa2\x63\x0c\x20\x57\xc4\x30\x26\xfc\x1a\xc6\x44\xf7\x63\xcc\x9c\xe0\xb7\x01\xc3\x88\x3e\xf3\xe0\x17\x3a\x1c\x7e\x69\x19\xe4\x62\xf6\x61\x31\x51\x77\x89\x8f\x5d\x14\x13\xe1\xe7\x22\xcf\x0d\xe1\xf9\x4a\x50\xc0\x6b\xd0\xb5\x43\x5c\x7e\xa9\x4f\xa0\x66\x3b\xdd\x00\x38\xcb\xb1\x4f\x21\xf8\xbd\x00\x26\xf9\xd7\x8d\x69\x56\x95\x56\x28\x4e\x41\x8b\x44\xd7\x7b\x21\x82\x7e\x66\x14\x5b\x63\x35\x79\xf8\x68\xed\xfa\x3a\xc5\xc4\x37\x9c\x8f\x30\xc6\x3f\xeb\xde\x46\x80\x78\xad\xab\x36\xec\x34\x7a\xdc\xe8\x1f\x19\x5f\x3b\xe0\xd8\xc4\xe9\x97\x48\x4e\x10\x63\x6a\x78\xa6\xc7\xf2\x3a\x5a\x3c\x19\x7b\x71\xfb\x9b\x9b\xfc\x0d\xd4\x74\x5e\x49\x7c\x77\xcc\xfe\xb4\x5e\x18\x0e\xc1\xa7\x30\x5e\xaf\xe3\x1f\xda\x75\x2e\xbf\xbd\xde\xb9\x22\x94\xe0\x44\x7d\x7d\xfb\xab\x70\xbc\xd1\x55\x0a\xca\xfb\xb2\xd1\xa5\x34\x4a\x66\x8d\xe0\x43\x32\x05\x53\xcc\xd1\x9e\x14\xb6\xe9\x47\x8c\x80\x04\xca\x6d\xa3\x34\xdc\x76\x0e\x99\x20\x8d\x60\x7f\xc6\x49\x86\x8c\xf3\xae\xbf\x9f\xc9\xd6\x5e\x5a\x31\x05\x49\xab\x23\xd7\xed\x8d\x54\xe7\x0f\x74\x73\x3e\xc1\xa1\x70\x4c\xd2\x2f\xd0\x76\x0e\x6b\x61\xc1\xd8\xf4\x87\x1c\x89\x1a\x5d\xcf\x4d\x07\xa1\x95\xd1\x8f\x51\x14\x1c\xc2\x56\x6a\x9f\xfc\xdd\xcd\x42\x1b\x90\x79\x77\x93\xfc\x6b\x30\x63\x2d\x8e\x29\xa3\xe6\x9c\x1d\x06\xac\xfc\x79\xbd\xfe\xf9\x07\x02\xc1\x0e\x7e\xfe\x1e\xbf\xe3\x69\x25\x24\x2a\x1d\xf9\xee\x11\x9e\x3a\x47\xee\x84\x3a\x47\xae\x17\x39\x47\x42\xad\x6f\x34\x1a\x0e\x77\x16\x8e\xdb\x6d\xba\x91\x16\x80\x87\xf6\xf4\x55\xf8\x00\xd5\xbc\x45\xea\xde\xcd\xb9\x49\xf2\xa9\x76\x2b\x90\xf3\x6a\xa4\xbb\x9c\x03\xce\x8d\x32\x06\x95\x06\xeb\x75\xb0\x03\xc3\x12\x73\x7a\x24\x88\xd4\xfe\xe1\xf7\x11\xf5\xdd\x76\x32\x5a\x1f\xf2\xc5\x36\xa9\x2c\xf1\xab\xe6\xce\x04\x23\xc4\x73\x76\x86\xd3\x00\x13\xff\x67\x1c\xf8\x47\xb8\xa0\x0e\x55\x74\x53\xe6\x1c\x13\xaa\xb3\x9d\x43\x24\x6c\x01\x70\x8e\x37\x89\xb6\x7e\x69\x0e\x89\x5f\x42\xee\x01\x14\x0a\x8b\x60\xe0\xde\x05\x04\x8b\xec\xca\x1b\x4e\x80\x8e\x34\x8b\x52\xe2\xc6\x81\x11\xc1\x7a\x8a\x67\x0e\xc4\x08\xcc\x65\x80\x09\x38\x58\xcd\xdb\x93\x3b\xb1\x48\xfa\x15\xe2\xa9\x1f\xe1\x40\x44\x74\x08\x35\x9a\x26\x15\x1e\x89\x71\x0c\xff\x45\x9d\xa4\xa5\x89\xcd\x5a\x25\x4f\xbc\xe3\x76\xa3\xa7\xbc\x88\x11\xb0\x04\x43\xc8\xf1\x44\xcb\xaa\x88\xf1\x54\xd8\x78\x12\xac\x19\x62\x36\x47\x98\x32\x5e\x9e\x09\x72\xad\x79\xf2\xd9\x3c\x35\x96\x22\xb1\x57\x37\x01\x0e\x88\x1f\x73\xa6\xfd\xd0\x1f\x88\xe3\x4c\x53\x4e\x5f\x6b\x8e\x9a\x5d\x3c\x99\xa8\x84\xc2\xcd\xe0\x3c\x73\xe7\x1b\xb7\x8a\x5b\x3b\x10\x09\xf6\x19\xfc\x34\x24\x83\xaf\xbc\x3c\xdc\x10\x13\x54\xf2\x54\xb5\xb0\x62\x1a\xce\xf3\x55\xed\xd1\xcf\x24\x2a\x14\x0b\x43\x87\xc7\x6c\xb9\xc1\x87\xa1\x3f\x64\xf7\x3d\x0c\x12\x5c\x14\xda\x19\xa3\x18\xc7\x91\x93\xb0\x43\x37\x41\x90\x54\xc7\x7b\x22\x81\x82\x4f\x01\xbf\xbe\x5e\x3a\x09\x8f\xd7\xf3\x36\x54\xd7\x82\x24\x23\x31\x25\x95\x93\xb8\xaa\x38\xd1\x99\x3e\x59\xad\x85\x44\x69\x25\xc7\xe7\xf3\xc2\xe6\x68\x63\xae\xb5\x4e\xa3\xa5\xcb\x4a\x4e\x38\x8b\x21\x72\x3b\xbb\x7e\x4e\x46\x24\x8a\x1c\x11\x85\x78\x8a\x6d\xdb\x4f\x30\xf1\xa3\xe2\x8e\x78\x3d\xd8\x3a\x96\xb7\xe6\xf5\x3b\xf4\xdc\x14\x36\xc3\x83\x64\xf4\x29\xa2\xc1\x32\x39\xbb\xc9\x69\x89\x32\x2c\x9f\xcf\x8b\x65\x19\xf2\x9b\x58\xc7\x84\x4f\x97\x08\xa4\x03\x63\x9f\xb1\x31\xb1\xe2\x99\xeb\xfa\x33\x9c\xf9\xc7\x04\xdb\x7f\xe4\x96\x65\x59\x69\x6e\xd9\x7b\xce\x31\xd1\x52\xf0\xba\x7b\xce\x6c\x62\x5b\x0e\xa9\x2d\x7b\x6f\x36\x8a\xd3\x8c\xbe\x23\x73\x3a\x2a\x79\x88\x7f\xe7\xe0\x7f\x8d\x1e\x5d\xfe\xf1\xc7\x1f\x07\x57\x07\xc8\xb6\xdd\x3d\xdb\x63\xcd\xb2\x34\xa7\xef\x20\xe0\xc1\x9e\xed\xda\x5e\xce\x20\x70\x6f\xfc\xc8\x0a\x56\x96\xbd\x97\x43\xb9\x6d\xab\x1b\x1b\x8a\x53\x65\xa3\xb1\x37\xd3\x3d\x7c\x4c\x5a\xbb\xe9\x66\x9a\x66\xb0\x2f\x13\x3c\xf5\xe1\xc3\x88\xa2\x11\x8c\xd1\x7f\x2f\xc3\xe1\x32\xce\xaf\xe1\xa3\xd9\x70\x21\xce\xb8\xc1\x57\x27\x08\xf8\x64\x2f\xe0\x7f\x7f\x2c\x96\x79\x44\xca\x95\x17\x4d\xc2\x96\xd9\xc6\x6c\x70\xcc\xfe\x7a\x91\x59\x08\x5d\xc4\xe8\x06\x52\x24\xd4\xe5\xca\xa3\x1b\xff\x3d\x04\xdb\x0d\x51\xe0\x02\xad\x0c\x8b\xbc\x2a\x32\xca\xb9\x73\x27\x10\x5c\xba\xa0\x0a\xaf\xd8\x82\x1b\x0d\x5e\x25\xee\xe6\x6d\x30\x91\x34\x52\xe0\xae\x42\x24\x34\x88\x25\x26\xb9\xde\xb1\xd3\xf8\x2b\x86\x9b\x96\x3c\x60\xfa\x75\x1b\x61\x01\x1a\xd5\x49\x23\x2c\xbd\x07\xfc\x27\xcd\xf6\x30\x6c\xbe\xa2\x56\xdf\x1d\xad\xeb\xf9\x26\x44\x81\xff\xf7\xc2\x94\xd5\xfd\x40\x35\xfb\xc7\xe3\xf1\x23\xc7\x71\xde\x3a\xee\xde\xe1\x78\xec\x1e\x3c\x1e\xaf\xc7\xee\xde\xa1\x6b\xdc\x34\x57\x8d\x19\x3f\xfb\x17\x99\xfc\x45\xbc\x39\x99\xbc\x0d\x26\x87\xde\xcf\xde\xce\xeb\x64\xbd\xee\x0b\x93\x31\x3c\x9c\xe4\x8e\xeb\x1d\xb6\xe2\xa8\x2a\x60\x3c\x90\xdf\x8e\xde\xd7\x6d\x13\x85\x59\xa9\xa2\x7d\x75\xb9\xf9\x21\x49\x01\x7b\xb2\x00\xfa\x7d\xf3\x23\x00\x36\xb6\xf6\x36\xe8\xc1\xf6\xca\x1f\x02\xb7\x65\xa8\x6f\x77\x69\xdc\x15\xd0\x7c\x4e\x0c\xc2\xdf\x63\xfc\xdb\x99\x93\xe1\x30\xc4\x8c\x1d\x19\x0e\x83\xef\xf1\xcf\xc3\xa1\x73\x84\x29\xbf\xf9\x88\x7e\xc6\x63\xe9\x14\x1a\xf8\xa7\xc1\x0f\x47\x09\x84\x16\x3f\x7c\xf1\xad\xed\x1a\xbe\x24\x8c\x39\x16\x77\xf1\x69\xf4\xa1\x28\x6a\x37\x1c\x95\x74\x4e\xd2\x3c\xcd\x93\xa3\x56\x04\x69\xe9\x61\x79\x3a\x71\x0a\x82\x4f\x71\x88\x7a\x00\xe0\xd0\xf5\x9c\x53\x7c\xda\x57\x83\xfa\x4a\x0b\xa2\xd9\xa0\x79\x6c\x8b\xde\xfe\xe5\x15\x2b\xba\x5e\x47\xdf\xd3\xfb\xc6\xb9\x79\x43\xd6\x6b\x67\x46\x26\xef\x82\xe1\xf0\x8b\x13\xa2\x43\xd7\x3b\x84\xdb\xad\x27\xce\x21\x0f\x08\xe8\x25\xc1\x7a\xed\x24\xec\x14\x45\x3f\x53\xe7\xc2\x75\x05\xd7\xc9\xb9\x08\xc3\x78\xb1\x31\x22\xcd\xba\x77\x0c\xf5\x0e\xd1\x60\x67\xec\xea\x41\x40\x15\xb2\xbe\x0b\xb1\xe3\xfc\x42\x1d\x77\xff\x38\x71\x0f\x0e\x61\x97\x3c\xd6\xe3\x4c\xf2\xe5\x24\x78\x2c\xee\xa9\x6a\x32\xc7\xa9\x2b\x0f\xf3\x10\x9f\xa2\x08\x17\x44\x0b\x50\x2e\x26\x28\xfa\xea\x04\x35\x1e\x9b\x8a\x45\x3d\xe5\xac\xee\x53\x83\x85\x8b\x20\xe0\x62\x17\x05\xee\x60\x75\x7b\x6a\x70\xe3\x04\xa5\x78\x74\x06\xa4\x20\x6e\x41\x30\xed\x7b\xa5\x77\xc9\x29\xda\x0a\x5c\x07\x7b\xea\xde\x9d\xe2\xd0\xef\x47\x1a\xff\x21\xe3\xeb\xc3\xcf\xbe\x41\x6e\x85\x15\xf5\xed\x11\x75\xdd\x65\x0c\x7e\x41\xeb\x35\xfd\x9e\xb8\x04\x2e\x6f\x47\xbe\x1a\xbb\x60\x5e\x71\x04\x21\xf1\xbb\x40\x36\x21\x5e\x10\x4d\xf6\x66\x9b\x39\x98\x9c\x06\x7b\x7b\xde\x69\x80\xc7\xfe\x82\xe0\xc0\x3f\x0b\x30\x31\x02\x55\xba\x77\x27\xce\x18\xe9\x39\x5f\x4f\x38\x25\x9c\x06\x82\x07\x7f\xd3\x04\xff\x5b\x90\xe1\x90\x11\xe2\xb3\x40\x92\xb1\xf5\xfa\x2c\xf8\x1e\x33\x16\x72\xe7\x2c\xf4\xdd\x2f\xce\x82\xa0\xb3\xc0\x45\xda\x4b\x53\xd6\x98\xed\x8c\x43\x75\xb8\x2f\xc8\x7a\xdd\xd9\x30\xfe\x54\xa0\xef\x19\x28\x18\x61\xcc\x69\xec\xbc\x0f\xdc\x7a\x5a\x16\x37\x16\xc1\xef\x43\xf4\x9e\xf3\x6b\xe8\x3d\x83\x87\x88\xaf\xe5\xb5\x05\x6d\xfb\xdd\x1b\x21\x84\x69\x71\x23\xde\x80\x10\x96\xc6\x4e\xf8\x3d\x7e\xeb\xb8\x4d\xe6\xf6\x38\xcd\xd3\x6a\xca\xef\x83\xaa\x7d\x31\x71\xcc\x0a\xe9\x04\xb5\x8d\x3a\x04\x0e\x5c\xad\xef\x7b\x29\xc2\x09\x37\x01\xe4\xea\x1e\xbb\xb3\x1d\xd0\x00\x20\x09\xb2\xd1\x1e\x1e\xfa\x3f\x34\xbc\x85\xe3\x4e\x5a\x6d\x23\xef\x2b\xd0\x5d\x98\x61\xed\xb0\x5d\x38\x06\xdf\xc0\xa4\xa9\x60\xbd\x9e\x06\xa3\x3a\x9d\xd3\x0f\x12\x94\xe3\xfe\xf0\x26\x99\xec\x1c\x7a\x67\xe0\x58\xad\xde\xbe\x66\x48\xa9\x10\x85\xaf\x66\x73\x8d\xc7\x5f\x6c\x1f\xcd\xd8\x7f\xcf\x90\xea\x3d\x20\xd5\xfb\x10\x13\x2e\xe5\xd6\x18\x5c\x4b\xd0\x2f\x01\x06\x27\x00\x74\x4c\x71\xdd\xbd\xa0\x99\x99\x85\xf4\xb6\x46\xf3\x04\xd7\xa3\xae\xf3\x01\x7a\x43\x31\x04\x9f\xaa\xd1\x2f\x01\x5a\xa2\x95\x8b\x6e\xf0\x1b\x3a\x52\x31\x52\x50\x9e\xa8\xe7\xe6\xca\x31\x2a\x12\x1c\xc9\xd7\xdc\x91\x7e\x2b\xd2\x1f\xd4\x18\x2e\x81\xcc\xf8\x31\x7b\xc3\x3a\xee\x77\xf8\x45\x3f\x51\x55\xa7\x3c\x7b\xd1\xaa\x79\x41\x3a\x03\xa2\x93\xa6\x21\x74\xff\xb2\x69\xd3\xb8\x91\xa1\x1f\x9b\x52\xe5\x41\x84\x6e\x75\x70\xb2\xf0\x17\x8a\xc9\x28\x2f\x6e\xd0\xcf\x60\x75\x17\xc4\xe7\x35\x8d\x69\x59\xd2\x48\xa6\x35\x44\xaf\x93\xde\xb0\x3c\xd7\x49\x73\xed\x56\xc9\xb7\xe8\x4b\x02\x5e\x42\x15\xad\x5f\xc6\x35\x95\xa5\xc7\x09\x66\x07\x1e\x7a\x17\xe2\xc7\xe8\x2f\x76\xb2\x81\xfc\x8c\x8e\x38\xe2\x6a\x5c\x09\xfa\x2c\xe8\x01\xff\x93\x0b\x75\xb1\x50\x28\x2b\xf5\x71\x0c\xe4\xe2\x2d\xff\x17\xb4\x1e\x85\xa8\x39\xe5\x7f\x80\x3e\x21\xc0\x63\xb4\x10\x55\x67\x01\x1e\x23\x20\x46\x82\xdc\x48\xe2\x23\x08\x15\x9a\x41\xf3\x77\x50\x77\x94\xe0\xc3\xa3\x27\x88\x51\x2d\xf4\x26\xc1\x87\x9a\xd7\xf6\x62\x59\x53\x48\xd8\xd7\xa0\xab\x97\x23\x51\xd1\x94\x1d\x17\x25\x24\xa4\xf4\x56\x68\x20\x27\x17\x1c\x2b\x97\x28\x60\x42\x05\x15\xee\x6e\x6d\xcf\x3f\x7e\xba\xcf\x88\x3f\x03\x3a\xd7\xce\x9b\x0e\xb7\xa0\xb3\xd5\x9d\x33\x23\x38\x74\xd7\x6b\xc6\xcb\x28\xb6\x65\xb3\x41\xcb\x7c\x2b\x74\x60\x7f\x67\x64\x38\xdc\x79\x17\xb8\x77\xef\x82\x0e\xf8\x06\x3a\x4c\x82\xd2\x4d\xb2\x1a\x14\x67\xcb\x6a\xca\x90\xa0\xc7\x1f\xcd\x18\xad\x88\xe4\x19\xe2\xbf\x88\xff\x17\xc1\x87\x2a\x7f\x7a\x84\x89\xa3\x45\x00\x10\x5d\xfd\x45\x70\xb8\x91\xe6\x27\x15\x48\x4e\x55\xcf\x08\x0e\x10\x3f\x05\x0e\x5f\x34\x06\x50\xa4\x7f\x73\x24\x70\xb6\xef\x93\xf9\x00\xf9\x50\x72\xc7\xdd\xf6\xc1\x7f\x11\x1c\x98\x97\xb8\x66\xbd\xfe\x6b\x33\x10\x6a\x5b\x71\x3f\x78\x38\x71\x8d\xfd\xd6\x1d\xd9\xcc\x8b\x10\x3e\xc1\x60\x07\x56\x57\xb2\xfa\x11\x0a\x72\x2c\x6e\x45\x29\xb8\x3c\xaf\xe3\x94\xc2\x4e\x10\xe1\xb7\x39\x81\xe9\xce\x51\x4f\x94\x73\x14\x69\x5c\xe4\xc2\x56\xb2\x2f\x82\xe4\xed\x65\x19\x19\x15\x5e\xda\x42\xaf\xbd\x31\x6a\xeb\xbb\xbc\x9d\x43\xa4\x1f\x3e\x22\xb3\xaa\xf0\x30\x83\x07\xf3\x7e\xb4\x48\xa0\xcd\xbd\x0a\xbc\x00\x75\xd8\x22\xae\x2d\x53\xd2\xb4\x71\x7b\x55\xe6\x89\xec\xfd\x7c\xb8\xbb\xac\xb2\x44\x8a\x2f\x06\x2e\x02\xdc\xf7\xfb\x73\xc9\x82\x12\xc8\x0f\x3c\xae\x18\x63\xd2\xfc\x70\xf8\x58\xfa\xd5\xeb\x57\x44\x9f\x8f\x6d\x57\x69\x38\x9f\xec\x88\xb8\xb4\x22\x68\x2d\x75\xa6\xae\x7b\x07\x31\x60\x95\xfe\x6c\x5b\xbe\x54\x5a\x26\x66\xbe\x54\xb1\x5f\x82\x8d\x33\xc5\x53\x4d\x00\x34\x7a\x3f\xb4\xdd\x8d\x09\x5f\xcc\xf1\x26\xc4\x53\xea\x84\xee\x24\xa3\x4e\x88\xa6\xae\x37\x95\xc6\xfb\x57\xcd\xd5\x21\xd1\x76\xa2\x7e\xe1\xd0\x6b\x07\xe3\x83\xb8\x1c\xa5\x1f\x34\xc9\x75\x03\x8e\xf5\x81\x5f\x0a\x27\x6e\x62\x26\x40\xfd\xcf\xa6\x43\x9d\x44\x8e\xeb\x81\x72\xe9\x35\x75\x92\x4e\x02\xdf\xd2\x4c\xe0\x7b\x27\x82\x36\x79\x64\xd3\xe4\xf1\x0d\xb6\xa7\x57\x1e\xdc\x9f\xc8\x37\x76\x12\x54\xba\x9b\x36\xdd\x26\x23\xb3\xa0\x4b\x7b\xc9\xa8\x5d\xd4\xa1\x55\x64\xd4\x2a\xd1\x08\x2d\x19\xa9\xdf\x48\x51\x12\xb6\x0b\x7a\xfd\x6c\x08\x26\x3a\x5e\xef\xc8\x80\x02\xba\x7a\x54\xb9\x18\x72\xff\xe7\x1e\x47\xc3\x50\x55\xea\x69\xda\x0c\xf7\x3f\xab\xd3\x62\xb3\x61\xdb\x3c\x32\x1c\x91\x82\x4e\xd1\x6f\x69\x3d\x7d\x57\xbc\x87\x44\x87\x55\x6b\xe8\xd9\xc3\xe8\x2a\x4a\xf3\xbf\x28\x6c\x9b\xe2\x35\xbd\xbe\x28\x8a\xac\x4b\xed\xb9\x3f\x4a\x1e\xc1\x16\xfe\x71\xa5\x8f\x40\x76\xb0\xa2\x0e\xa4\x88\x1f\x10\x74\xd7\x1e\xe5\x8f\x2b\x7e\x6c\xf7\xb8\x30\xb1\x33\x80\x7f\x69\x0f\xec\xbe\x17\xc2\x49\xe8\x10\x91\x92\x62\xe3\x4a\x4f\xe9\x2c\x96\xc9\xda\xe2\x92\xd2\x2f\xd4\xb9\x93\xf3\x3b\x8b\x37\x2e\x9a\xc7\x38\x8b\x87\xc3\x59\xbc\x5e\x67\x31\xca\x63\x3c\x8f\x2f\x6d\xd1\xc2\xbe\x9a\x18\x4f\xde\x3c\x46\x45\xdc\x13\x7a\x7b\x41\xcb\xb8\x28\xe7\x6c\x60\xfd\x21\xf0\xb4\x06\xc0\x04\x2e\xa4\x6b\x86\xbf\x88\x71\x11\x4f\xba\xfe\xcd\xad\x37\x1c\x77\xd3\xe3\x04\xfd\x9a\xd4\xb2\x16\xa8\xe7\x67\x05\x76\x90\xc6\xce\x7c\x14\x92\xfc\x63\x45\x5f\x9f\x9d\xba\xc6\x0d\xe4\x26\x04\x40\x49\x3f\x2f\x69\x55\x9f\x44\x19\x95\x1b\x92\x2f\x6b\xc9\x4d\x1e\xa8\x8a\x19\x7f\x56\xc3\xbf\xcb\x18\x8f\xd1\x75\x8c\x9f\x3c\x41\x37\xf0\xef\x6d\xec\xdf\xc2\xf0\xef\x0c\xd9\xa4\x67\xa0\xcb\x78\xbf\xfb\x41\x1b\xef\x21\xef\x69\xdf\xc8\x3f\x72\x15\x63\x5b\x12\x74\x6d\xdc\xdf\xd8\x7b\xa7\xa4\x9e\x8e\x4a\x92\x47\xc5\xdc\x71\x55\x46\x3e\xe7\xc9\x33\x77\x54\x65\x69\x48\x9d\xc7\xae\x7f\x93\xe6\x51\x71\x33\x22\x51\x74\x74\x4d\xf3\xfa\x2d\xdc\x8a\xa4\xa5\x63\xcf\x69\x55\x91\x84\xda\xc8\xd8\x2a\xa3\x0a\xcc\x07\x18\x63\xfe\xe2\x70\x48\x46\x11\xa9\x09\xc6\x78\x15\x0f\x87\x0e\x9f\x1f\x82\xcb\x18\xc9\x29\xcb\x35\x97\xfd\xdb\xd8\x75\x37\x10\x33\x95\x8d\xfc\x4b\x6c\x24\x49\x84\x59\x95\xbe\x68\xfb\xcb\x78\xef\x26\xf6\x83\xef\x6f\xe2\xe1\xf0\x3a\xfe\xfe\x26\x9e\x38\x2f\x7e\xe0\x06\xe2\x17\x2e\x9b\xf0\xe0\xfb\xeb\x78\x72\x1d\x7b\x81\xeb\x5d\xc7\x38\xf0\x97\x31\x26\xec\x95\x2a\x5e\xaf\x61\x1c\x63\x34\x10\x5f\xb7\x28\xaa\xfa\x94\x7f\x8f\xb3\x8a\x91\xfd\xc8\x76\xdd\x8d\xff\xd9\xec\xbe\x8c\x31\xf1\x6b\xf6\x72\x0d\x2f\x0b\x5c\x78\x99\xa7\x73\xce\xff\x94\x64\x4e\x9d\x2f\xb1\xab\x28\xc5\x78\xc3\xcf\xb3\xcf\x31\xee\x41\x1c\x5f\xd6\xe9\x9d\x30\xf1\x2b\x9d\xd3\x62\x59\x3b\xda\xea\x12\xe7\xab\x2b\x7f\x92\x33\x56\xa6\x5e\x6d\x36\x5a\x54\xfc\xf1\xc6\x1f\xb0\xf9\x7a\x19\xe3\x83\xff\x75\xe9\xbd\xdc\xff\xfd\x13\xd9\xff\xf2\xc7\x72\x3c\x7e\x35\xde\x67\x7f\x5e\x3f\x83\x7f\x5f\xc0\xc3\x31\x3c\x1c\xc3\xc3\xe3\xe3\xe3\x3f\x96\xe3\x27\xcf\xa1\xd9\x93\xe7\xaf\xe1\xdf\xe3\xfd\x3f\x96\x87\xc7\xac\xe6\xf1\x78\xfc\x6a\x1f\xfe\xbc\x66\xff\x42\xb3\xc7\x87\x2f\x58\xcd\xab\x31\x3c\x1c\x1f\x1d\xff\xb1\x7c\x32\x1e\x1f\xee\xff\xb1\x7c\xfd\x9c\xbd\x73\xfc\x1d\xd4\x1c\xbf\x7e\xc5\x1e\x5e\x1f\xc3\xc3\xf1\xf1\xeb\xab\xff\xbf\x0e\xec\x8f\xfd\xd1\x78\xff\x3b\xd6\xf5\x8f\xcf\x59\x37\x63\xde\xe7\x33\xe8\xe6\xc9\x31\x74\xf3\x74\x7c\xf5\xe8\x9b\x03\xf4\x63\x8c\xef\x36\xe8\x15\x5c\x32\x51\x4c\xf9\x6b\xe9\x80\xf0\x2a\x1e\x4d\x49\x75\x76\x93\xbf\x2f\x8b\x05\x2d\xeb\x95\x43\xa4\x5d\x90\xeb\x8a\x7e\xbc\xa7\x01\x98\xee\x5f\xc6\xa3\x9a\x56\x75\x53\x6c\xbd\x8a\x2f\xc9\x15\x13\x6a\x7e\x94\x3f\x94\xaf\x75\x23\x25\x1c\xc5\x66\x76\xde\x25\x13\xd2\x40\xc9\x37\x1c\xd6\x04\x2e\x2a\x35\x8a\x59\x79\x01\xfa\x94\xd6\xd3\x22\xf2\xe9\x84\x27\x1c\x12\x2e\x62\xe1\x7a\x1d\xb1\x41\xfe\x58\x14\x19\x25\xf9\xaf\x24\x5b\x32\x66\x49\x16\xbf\x5b\xce\x69\x99\x86\xa2\x38\xad\xde\x91\x77\x90\xcf\x06\x2a\xdf\x17\x55\x5a\xa7\xd7\xd4\x6c\x74\xf8\x83\x7c\xf9\xec\x9a\x96\x59\x41\x22\x1a\xb5\xa0\x1f\xc2\xc5\xfd\x63\x1e\xb0\xc2\x63\x43\xac\xea\x8f\x15\x95\xb3\x34\x21\x97\x3c\xee\x03\x7b\x78\x47\xe6\xf4\x0a\x87\x9e\x13\xe0\x68\x44\xea\xba\x4c\x83\x65\x0d\xd6\x46\x04\x79\xe6\x8d\xa2\x6a\x41\x42\xea\xf2\x0c\x97\x2f\x55\xc5\x39\x5c\x37\xb1\xed\xbd\x90\x75\xd6\xfa\xd8\xaf\x8d\x75\x0c\x63\x35\x21\x3a\x90\xa1\xd4\xeb\x29\xdc\x0b\xa5\xf2\xed\x0d\x5f\x23\xb1\x1c\x93\x90\x5f\xf6\xd2\x16\xf1\x8d\x5a\xc4\xd7\x31\xc4\x8f\x11\x06\x10\xd6\x19\xbf\xc6\xad\x81\xde\xde\x59\x63\x06\x88\x75\x81\x8b\xa3\x44\x38\x71\x02\x1c\xb6\x50\xc0\x9d\x40\x0c\x0c\x1e\x1c\xd0\x0b\x7b\x66\x3f\x6c\xcf\x7e\x7b\xd2\x26\x3b\x87\x9e\x6d\x7b\xdd\x81\x86\xe6\x7a\xb8\x3d\x4d\x02\x7d\x12\x7e\x8a\xcd\x78\xe6\x3c\x2d\x49\x04\x77\xe6\x68\x38\xa3\x91\x24\x79\x2f\x9d\x3b\x76\x56\x4b\x41\xbc\xaa\xe9\x42\xfe\x9e\xa7\xb9\xfa\x49\x6e\xc5\xcf\x0d\x0a\x90\xe4\x70\x5e\x71\x50\x2a\x1b\x30\x2f\x85\x0f\x91\x65\xd0\xaf\x08\x1b\x1c\x4e\x18\x13\xfc\xe9\xa6\x24\x8b\x05\x2d\x81\xb7\x1f\xa5\x3c\xfc\xdb\xaf\x3c\x25\x9c\x80\xc7\x9b\x47\x93\x68\x5b\x73\xd1\xf1\x46\x57\x8c\xb7\x3e\x58\x1f\x8c\xdf\x02\x83\xef\x4c\x38\xa2\x43\x35\x37\x13\xf5\xcb\x53\x80\x44\x53\xa4\x0f\x58\xbd\x07\x5f\x39\x11\x7f\x85\xe0\x5d\x16\x59\x46\x23\xcf\x06\x48\x41\x71\x6b\xf3\x60\x0c\xab\x05\x5d\xaf\xed\x92\x44\x69\xd1\x94\x4c\x5a\x03\x30\x01\xeb\x7a\x8c\x9f\x5b\x9f\x29\x57\x53\xcc\xf0\x70\x08\x24\xcc\x16\xc5\x36\x0a\xd7\x6b\xc6\x1d\x28\x14\xd0\xaf\xf1\x0a\x9b\x46\x38\x1c\xda\x36\xc8\x70\xd0\xc2\x15\x7f\xb1\x3d\xb6\x95\x81\x46\xcb\xa7\x10\x88\x44\x2c\x10\xbf\x62\x41\xca\x8a\x1e\x67\x05\xa9\x1d\xf9\xfa\x7a\x3d\x46\xe1\x0e\x0e\xd6\xeb\x10\x7c\x68\x44\x39\xeb\x50\x41\xb6\xf7\x42\x79\x2d\x42\x54\x42\x19\x68\xe0\x9b\x26\xc2\xe3\x85\xef\x5e\x31\xfe\x26\x34\x95\xbe\xc0\xc0\x35\x69\xcf\x1c\x5e\xbb\x8d\x63\x36\xea\x36\x91\xbe\xc5\x6a\x5a\x3b\xbd\xbd\x92\xe5\x0d\x2c\x51\x84\x77\x76\xda\xad\xf4\xfd\xf8\x4b\xdc\xbe\x09\x0c\x93\x08\xd2\x9a\x5d\x2d\x83\x79\x5a\xdb\xdc\xe1\xc4\x06\x85\xab\xad\xdf\x2e\xb5\xc3\x22\x2b\x4a\x59\xcf\xe4\x4a\xfd\x37\xe3\x74\xda\xcf\xfb\x59\x11\x92\x4c\x96\xce\x8b\xbc\x9e\xca\x07\xbd\xf9\x0d\xa5\x33\x46\x6d\xe4\x9c\xfb\xf2\xa7\x39\x53\x2d\xef\xe6\xa6\x11\x47\xcf\x00\x13\xc8\x22\xe1\xdb\x36\x77\x9b\x72\xf8\x33\xb6\x6d\xd7\xef\xce\x53\xbb\xe4\x21\x4d\xda\x90\x03\xdd\x1a\x1b\x37\x9a\x41\xf6\x09\x64\x24\x15\x5c\xca\x8b\x99\x18\x4c\x37\x5f\x64\xb2\x5e\x77\x43\x96\x91\xe1\x50\xa2\xba\x56\xb8\x5e\x3b\xc1\x1e\x26\x1a\xa3\x18\x68\x4b\x7b\x2a\x96\x96\xe0\x97\xce\x9d\xca\x3a\xa4\xa8\x25\xf0\x0f\x01\x7e\x1b\xcb\x30\xa2\x25\xcd\x5d\x97\xa8\xdf\xcd\xbd\x1c\xcd\xf6\xf7\x2e\x6e\xf2\x48\x10\x4c\x46\xc5\x82\x15\x43\xe8\xc5\xc0\xbd\x0b\x80\x6d\x52\xd1\x1a\xc6\x3e\xfd\x3e\x94\xf9\xd4\xe8\xde\x9e\x1b\x5c\xda\xdf\xd8\x7b\xe1\x25\xbd\x02\x46\x87\xdf\x7a\x19\xfb\xe1\xf7\x44\xb6\x0a\xf7\xf6\x20\xfc\x6f\x8b\x8b\x62\xaf\x91\xcb\xf0\x4a\x6c\x65\x04\xbf\x2b\x9a\xd1\xb0\xa6\x11\x8f\x28\xe9\x18\x65\x98\xba\x88\x0e\x87\x91\x2c\x17\xcb\x76\x2e\xab\x77\xc6\x22\x5c\x60\xc8\x53\xc0\x0b\x23\x22\x1b\x11\x1f\x37\xd1\xc7\x0d\xb7\x82\x2e\xa9\xe8\x9e\xc7\x9a\x85\xe7\xaa\x81\xe7\xf3\xbe\x68\x6f\x5f\xf2\x12\x96\xf4\xe0\x5b\xaf\x79\xcb\xb4\x22\x41\x46\x23\xb6\x8e\x98\x95\xb8\x9b\xc6\xc7\xcf\x09\x74\xf0\xae\x4e\x6c\xcf\xfa\x0e\xd1\xad\x87\xc9\xaf\xad\xa3\xce\xa4\x2d\xe8\x86\x54\xa7\xcb\xac\x4e\x17\x19\xf5\x18\xad\x98\x8b\x07\xcd\xe1\xe0\x7d\xac\xa7\xb6\x08\x46\x11\xc9\x13\x5a\x16\xcb\x2a\x5b\x9d\xd3\xfa\x24\xcf\x69\xf9\xd3\xc5\xe9\xdb\xc9\x6b\xc7\xfe\xee\xb0\x73\xe1\x1a\x74\x20\x01\xba\xbb\xd6\xcf\xdf\xbe\x33\x59\xe1\xa8\x6d\xef\xdd\x77\x1e\xeb\xc7\xeb\x3f\xb6\xf0\x13\xa1\x50\x3c\xca\x88\xc2\xc6\x27\xab\xa8\x47\x25\xcd\x85\xd8\x1a\x28\x27\x6e\x08\x30\xf5\x5d\x13\xa8\x01\xbd\x2c\x4b\xb2\x1a\xa5\x15\xfc\xe5\x8c\xdb\xe1\x0f\x38\x10\x08\xa2\x69\x48\xbf\x7b\x62\x43\x32\xf5\xcb\xf1\x95\x8b\x00\xb1\x54\x3c\x30\x3e\x0c\xdb\x76\xd9\xd0\xdc\xaf\x2c\x95\x6d\xef\x45\xfa\x72\x7f\xe8\x5d\x6e\x75\xb2\x3a\x1c\x87\xd9\xe1\x26\x49\x9f\x76\x60\x85\xcd\xe1\x71\xff\xa9\x13\xba\xd2\xf8\xfe\xb5\x96\xad\xc3\xa9\x59\x8c\xf3\x58\x0f\x1e\x50\x6b\x17\x6b\x21\xa2\xd4\x3d\x4b\xaa\x0d\x58\x78\x19\x5f\xc4\xf8\x6e\x5a\xcf\x33\xcf\x9e\xd6\xf5\xc2\x3b\x38\xb8\xb9\xb9\x19\xdd\x3c\x19\x15\x65\x72\x70\xf8\xdd\x77\xdf\x1d\xdc\xb2\x5a\x1b\xcd\x49\x3d\xdd\xda\xea\xc5\xc1\x29\xa9\xa7\xf0\xcf\xe9\x5b\x1b\x55\xd7\x49\x5f\xc3\xc7\xe3\xf1\xf8\xa0\xba\x4e\x6c\x3d\xb0\xc0\x47\xf8\x16\xa9\xc9\x54\x27\xe2\x75\x62\x0b\xfd\xe4\x7d\x80\xc4\xf1\xc8\xc6\x76\x4f\xf3\xce\x00\x5b\x1a\xd0\xfb\xbf\x5c\xdb\x9f\xbf\xc6\x86\xa3\x5a\x73\x8e\xdc\x0b\x00\x74\x9f\x1f\x19\xe1\xbe\x77\x52\x78\x2c\x00\x3b\x2e\x4a\x9a\x26\xf9\x99\x52\x01\x06\x93\xfb\xc1\x7b\x64\x03\x3a\x8b\xdf\xd4\x6d\xac\x7f\xb6\xf4\x30\xfc\x23\x9b\xe4\x51\xcd\xc9\x76\x7a\xfe\x72\xb1\x18\x0e\xe1\xcf\x88\xde\xd2\xf0\x63\x5e\x91\x98\xbe\x65\xcc\xc3\xb1\x00\xd1\xe8\x0e\x55\x36\xa7\x7b\xdb\x3b\x5d\x5d\x0b\x51\xaf\x6e\xdc\x8d\x47\x36\x8e\x69\xc9\x62\x54\x1f\x8e\x75\x90\x32\x3f\x7e\x38\xd9\xc1\xf8\x22\x1e\x55\xd7\xc9\x7a\x6d\xa7\x92\xea\xd9\x69\x6e\x11\x97\x8c\x54\x01\xe6\x01\x90\xee\x7e\x8b\xf1\x6f\xf1\x7a\x1d\x15\xe1\x72\x4e\xf3\x5a\xc4\xa1\x3e\xe2\x36\x03\xc7\x8e\xd2\x6b\xdb\xf5\x7f\x8b\xb5\x17\xed\x3f\x6e\x9f\x84\xd5\x75\xf2\xc7\xed\x13\x6a\xef\x05\x7b\xf0\x7c\x20\x0b\xe0\x74\x0a\xf0\x6f\x31\xbf\x3d\x02\xcc\x84\x4f\xf4\x07\x97\xe8\xf1\xc0\x1c\xbd\x8e\xdb\x8d\x64\x98\x6f\xd5\x5c\x8b\x4b\xe6\xe8\x75\xee\x66\xe3\xa2\xff\x8e\xf1\xc1\xa5\xbd\x3b\xfc\xfe\x87\xab\x03\x6d\x67\xfc\x1e\xab\xe9\x09\x74\x5d\xb8\x82\x9b\xc6\x8e\xf0\x24\xe2\x97\x66\x5e\xf1\x70\xe5\x4f\xb8\xaf\x5f\x11\xd1\x0b\xce\x63\xc2\x6f\x41\x52\xe4\x09\xb9\x31\xe8\x06\x0e\x36\x03\x4d\x9b\x3b\x1c\x3a\xb6\x56\xcb\x66\x5e\xcd\xae\xfc\x21\xe6\x77\xbd\x76\x7e\x8f\x71\x67\x3d\xb9\x37\xa3\x1a\x03\x31\x86\xa0\x22\xc6\x06\x5c\xf2\xfd\x7a\xfa\xf6\x00\x88\x3c\x7f\x51\xfc\xe6\xf3\xf1\xdf\x31\xa0\xa1\xd0\xd2\x28\xbd\x8d\x6d\x23\x8a\x62\x3c\x16\x8c\x46\xc8\x53\x9f\xfa\xf4\xfb\xc0\x60\x37\x14\x33\x1e\x4e\x49\xf9\xaa\x88\xe8\xcb\xda\xa1\xae\xcc\x97\xf4\xd4\x0b\x19\xa6\x3c\x7e\xf6\x79\x59\xd4\xbe\x6d\x5c\x59\x78\x21\xeb\xc8\x7c\xd1\xaa\xfa\x4e\x56\xfd\x8f\xdb\xc7\xcf\xcd\xba\x67\x63\x59\x97\xb5\x00\x3e\x7b\x2c\x6b\x92\xa6\x46\x52\xa9\x26\xd4\xab\x60\xc1\xa2\x3d\x1c\x8c\xaa\x65\xc0\xd9\x57\x27\x46\xd4\x75\xfd\x18\xd3\xbd\x43\x3f\xda\xc3\xe1\x26\xc0\xd0\x72\x12\xed\xb5\x9b\x79\xd1\x66\xf3\xcf\x58\xe4\x75\x73\x5d\xae\xed\xfc\x26\xc6\xbf\xc7\x88\x24\xf8\x8e\x48\xdd\xec\x49\x4d\xb9\x3d\xee\x55\xb1\xcc\x6b\x6f\x67\x8c\x82\xa2\x8c\x68\x79\x32\x27\x09\x3d\x5b\xd6\x15\x6d\x17\x9e\x67\x69\x48\x5b\x65\xbf\xa5\x51\x3d\xe5\x65\xb7\xc7\x19\xbd\xd5\x7e\xbe\x29\x8b\xe5\x42\x3c\x9f\x95\x51\x9a\x93\x4c\x15\x85\x45\xb6\x9c\x37\x3d\xf3\xc7\x8a\xfd\x8c\x05\x90\x98\x43\xb8\x91\xbf\xa5\xc2\x4c\x3e\x9f\x4f\xcb\x34\x9f\xc9\xa7\x77\x34\x21\x7a\xed\x19\x1b\x20\x7b\x48\xca\x34\xfa\xc0\xa1\x88\x9f\x47\x79\xa4\x3d\x9d\x2f\x48\xae\x3f\xd6\xa4\xac\xe5\xf3\x2b\x18\x95\xf9\xa4\xbd\xcd\x0b\x74\x00\xa2\x44\xc2\x88\x8b\xbc\xfe\x8d\xa6\xc9\x14\x9e\xb2\x34\xa7\xaf\x32\x32\x5f\xc8\x87\x9f\x54\x55\xb1\x20\x61\x5a\xaf\xe0\xa7\x1c\x78\x51\x2e\xa6\x84\x4f\x49\x4d\x82\xf3\xf4\x0b\x7c\xdb\x4d\x1a\x15\x37\x50\xf8\xe5\x84\xe1\x3b\xfc\x2a\x8a\x39\x74\x97\x66\xd9\x59\x03\x69\x10\x67\x45\x11\x69\x05\x55\x5d\x2c\x8c\xc7\xb2\x98\xd1\xd7\xa4\x9a\x12\xc6\x8d\x99\x45\x45\x1c\x8b\xf5\xe7\x65\xa7\x69\x4d\xcb\x2c\x05\x0f\x01\x59\xd6\x81\x25\x71\x61\x83\x82\x04\x5f\xda\xbf\xd1\x60\x96\xd6\x36\xb2\xe7\x95\x8d\xec\xd3\xe2\x8b\x8d\xec\x33\xfb\xca\x17\xa6\xb4\x19\x5d\x55\x0e\x49\xdc\x6e\x4e\x5b\xe2\xde\x05\x49\x6f\xaa\xdb\x00\x07\x7b\x04\xb6\xf2\xcb\xda\x19\xbb\xa3\xba\xf8\xc8\x98\xa0\x57\xa4\xa2\x8e\xbb\x47\xb4\x9d\x70\xe8\xfa\x24\xb9\x0c\xae\x30\x49\x2e\xc9\x15\x18\x00\xb4\xc4\x85\x89\x14\xe7\xc8\xa8\xaa\x57\x59\x73\x93\x33\xb4\xd2\xdc\x82\x0c\xa3\x1d\xc1\x29\x54\x8e\x8b\xa0\x51\xe1\xf4\xe6\x2c\x76\xec\xfd\x7d\xdb\x95\x79\xfc\x44\x48\x8f\xe0\x32\xbc\xf2\xa9\xb8\x3b\x1a\xaf\xd7\x3d\x64\x90\x95\xda\x70\xb1\xd4\xb6\x3d\x2d\x13\xfd\x8e\xde\x42\xdc\x16\x25\x49\x7b\x30\xd4\x1d\x0e\x49\x72\x49\xaf\x26\x8e\x6d\xef\xc5\xee\xa8\x2e\xd3\xb9\xe3\x7a\xf1\x9e\xbd\xb8\xb5\x7d\x3b\xce\x0a\x02\xac\x85\x60\x6a\xc3\xaa\x02\x15\x8e\xed\xfa\x11\x57\xc8\x36\xdf\xc5\x68\x06\x93\xec\x30\xe5\xd6\xce\x28\x61\x52\xee\x9c\xe6\xcb\xb4\xa6\x73\x58\xcf\x3b\x52\x52\x02\x5b\x99\x54\x9c\x02\x94\x62\xdb\xb2\x3f\x74\x1e\x50\xd8\x15\x53\x28\x4d\xe7\x09\xfc\xc9\x17\x4b\xc0\x96\x19\x5d\x25\x34\x17\x58\x0f\x3b\x76\x4e\x6b\x80\xb6\x20\x25\x01\xd4\xe5\x16\x32\xc0\xf5\x92\x84\xd0\xe6\x06\xba\x30\x96\x8d\x26\x2a\x46\x06\xa3\x90\x6c\x61\x95\xa8\x11\x68\x89\x4b\x1f\x20\x5b\x1d\x3e\x79\x6e\x23\x82\x42\xc7\x55\xa9\x5e\xd0\x57\x5e\xeb\xe9\x8a\x41\xd2\xc2\xe7\xa2\xae\x55\xf7\x1e\x68\xf6\xa7\x4f\xc0\xdc\x31\x84\xdb\x3a\xd4\x46\x22\x7a\x76\x68\xbb\xcd\x18\x01\x6b\x87\x43\xd9\xe1\x8e\xd6\x21\x54\xc1\xc8\x1e\xdb\xc6\x07\x6a\x62\x50\x9c\xa8\x63\x7c\xff\x10\xce\xf1\x06\x9b\x6d\x69\x4f\xe9\x66\x5d\x0d\x46\x69\xe5\xb7\xf9\x78\x92\xe7\x05\x57\x91\xef\xdf\xce\x95\x3e\x0a\xd4\x59\xfb\x8b\xb2\x88\xd3\x4c\xe9\xa2\x18\x41\xdc\x8f\x49\xd8\x2d\xd8\xaf\xca\xb0\x5b\xb8\x2c\xd3\x6e\x21\x58\x80\xeb\x6e\x39\xe3\x2e\x95\x36\x2c\xad\xaa\x34\x4f\xf6\x93\x6c\xb5\x50\x62\x43\x37\x2a\xd2\x98\x23\x7c\x92\x30\x5e\x94\x2d\x06\x9a\x26\xf8\xc7\x51\x3d\x25\xf5\x07\x68\x51\x39\xb6\xad\x63\x60\xaa\x08\xc7\x77\x06\xf7\xb3\x5e\x1f\x1e\x1a\x05\x13\xe2\x91\x51\x71\x93\xd3\xf2\xb5\x60\xa6\x04\x37\xf3\x1a\xdc\x26\x02\xfc\x81\x5c\x06\x57\x8a\xec\x44\x78\xec\x47\x0d\xe7\x12\x31\xce\x45\x44\x53\xbc\x8c\xae\xfc\xb0\x6f\xfb\x87\x97\xf4\x6a\xbd\x76\xec\xba\x58\xfc\x36\xa5\x14\x84\x10\x3a\x59\x85\x8e\x7d\x03\x8f\xee\xe4\xa3\x56\x89\x44\x29\x22\xae\xc7\xda\xcc\x8b\x65\x45\xfb\x1b\x6a\x55\xac\xb5\x59\xf9\xfa\xec\xf4\x94\xd5\x9f\x87\x65\x91\xf1\x06\xac\x5a\x3c\xc2\x10\xaa\xc8\xd1\x8a\x90\x5d\x99\x4d\x8f\x8b\x70\x59\xd9\xfc\xde\x07\x7b\xfe\x31\x5b\x96\xfc\x45\x47\xbc\xc9\x5b\x20\x3b\xe6\x7f\x89\x8b\x44\x05\x34\x45\x76\x00\x7f\x88\x8b\xc2\x91\x28\xc4\x8c\x18\x8d\xe4\xab\x70\x89\x91\xb5\x7f\x45\xf2\x50\x4e\x8c\xc3\xbe\x3a\xe4\x05\x68\x67\xec\x0e\x87\x02\xa8\x68\x84\x54\xa5\x04\xcc\x2b\xf0\x40\x41\xcb\x8a\x8a\xea\xc0\xe0\xd9\x84\xc5\x8b\x64\x95\x82\xc4\x1e\x61\x54\x5f\xa2\xbe\xa5\xfc\xe8\x50\xf4\x25\xba\xa4\x57\xf0\xc6\x25\xbd\x12\x5a\x2a\x86\x02\x7f\x25\xf8\xae\x2e\x16\x2f\x83\xa2\xac\x3d\x9b\xb0\x3f\x36\xe2\xa3\x7b\x9f\x91\x95\xc7\x86\xbd\xc8\xc8\x4a\x2f\xbc\x98\x96\xc5\x32\x99\xaa\xba\x9a\x3f\x43\x93\xd7\x4b\xc1\xf5\x4d\x19\xc9\xf1\xec\x48\x3c\x87\xf0\x0c\x4d\x8e\xe6\x8b\x3a\xa5\x91\x67\x53\xfe\x83\x17\xe6\x61\xb9\x5a\xd4\x50\x2c\x7f\x8a\x8a\x88\x17\x46\xb2\x00\xae\x01\xda\x70\xed\x0e\x0a\xde\x82\x6d\xf0\x35\xa9\x89\x67\x73\x3b\x61\x44\x6a\xa2\x55\x9d\xd2\x9a\x44\x5a\xf5\x5c\x3c\xab\x26\x9c\xa5\x82\xda\x8a\xfd\x84\x8a\xf7\x64\x59\x51\xcf\x5e\xb0\x3f\xbc\x00\xe6\x43\x4d\x06\x7b\x4c\xf3\x84\x97\x30\x42\x06\x85\x65\x91\x94\xb4\xaa\x3c\x7b\x21\x7e\x41\xf1\x07\x52\x53\x39\x23\x25\xa9\xa9\x36\x1b\xe7\x94\xce\xd8\x07\x56\xf0\x57\x15\x01\xe4\x8a\xff\xe0\x85\x35\xe1\xd6\xa0\x8a\xff\xe0\x85\xcb\x8a\x49\x85\x9e\x5d\xf1\x1f\x50\x78\x91\xce\x45\xe2\x23\x0f\x54\xf5\xdc\x0b\x12\xaa\x7e\x65\x1c\xa4\x1a\xc9\x35\x3c\xc9\xb1\x0c\xd8\x36\x24\x69\x0d\x3d\xdf\xf0\x1f\xb6\x66\x5b\x9f\x69\xc9\x94\x43\x20\x50\x8d\x88\x38\x09\xbd\xb0\x45\x8f\x22\x8c\x71\x92\xc0\x2d\x60\x50\xd0\xb8\xa2\x64\xc2\x36\x6c\xba\xa8\xb9\x52\xc3\x21\x38\xec\x15\xb7\x11\xe9\x48\xdb\xf0\x1a\x93\xaf\xb9\xac\xad\x1e\x6d\xc4\x43\x51\x6e\x11\xa7\x5d\x8f\xe0\xfe\xb3\x66\xd2\xee\x9a\xa0\xbb\xb4\xf2\x58\xd5\xc6\xf5\x3a\x95\x0c\x50\xab\xf0\xdd\x39\x04\x27\xed\x51\xbf\x67\x89\xae\xe8\x11\x09\xe5\xd5\x74\x05\x5e\x60\x4e\x97\xab\xe5\xbe\x7a\x57\x44\xd4\x21\xfa\x79\xba\xd0\xa6\x9e\xd3\xed\x38\xe1\x31\x4f\xa5\xfc\x29\x4f\xcb\x34\x2e\xb5\x73\x4a\x1c\xdf\x82\xc6\x32\x4c\xb7\x11\x60\x39\xa3\x1d\x82\x97\x0c\x75\x21\xd2\xbe\x4e\x23\x5a\xc8\xd7\xc9\x32\x4a\x0b\x1b\xc2\x62\xc7\x8c\x71\xfd\x2b\x71\xff\xea\xb0\x8a\x31\x10\x98\x18\xfd\x95\x5c\xc6\x8c\xc0\xf8\x6d\x90\x9c\xf9\x92\x83\x38\xe2\xdb\x56\x6e\xdf\x9e\xf6\xe9\x3c\x91\x03\x48\x99\x08\xb8\xfd\xcd\xfe\xcf\x6a\xc3\x63\x07\xba\x84\x01\x97\x2d\x6c\x24\x0c\x64\x0d\x8c\x73\x6e\x3e\x43\xd2\x8e\xd6\x07\x27\xa2\x35\x49\xb3\x4a\x82\xba\x28\x92\x24\x63\xc4\xb8\x16\x3f\xfa\x3e\x85\xf1\xa8\xb6\x07\x86\xe5\x90\x55\xff\x24\x7e\x71\x10\x27\xf9\x35\xc9\x52\x36\xf8\x54\xfe\x22\xae\x3f\x48\x13\x27\x42\xb6\x24\xa1\xb6\x11\xd6\xc0\xe6\x66\x1c\xdb\x8b\xf1\xa9\x80\x65\xcc\x35\x98\x21\x6c\xef\x4c\xf5\x08\x2a\xfd\xd0\x54\xe9\x6f\xee\x1f\xc0\xbd\xfd\xd7\xf4\xb6\x66\xdc\xba\xed\xfd\x43\xf5\xf1\xfe\x01\x5f\xb5\x05\xa8\xe4\x98\x62\x1c\x6e\x28\xc3\xe9\x18\x4d\xc5\xed\xf7\x04\xc7\x88\xc7\xe0\x9e\x31\xe4\x83\x58\x65\x1d\xec\x9b\xb9\x32\x1a\x55\x72\x39\xbb\xf2\x6d\xe0\x4e\xd9\x36\x9f\x4d\x40\x0a\x9b\x32\x70\x9e\xbd\x85\xff\xe5\x0d\x9d\x29\x9e\x4e\xa6\x23\xce\x2f\x7b\x46\x3c\xaa\xe9\x70\x08\xba\x8e\xa9\xeb\x7a\xb6\x64\xcb\xf9\x5b\x5d\x92\x32\x9d\x38\xcd\xf4\x70\xdb\x11\x18\x1d\xa7\xee\x70\xf8\x0d\x87\xe2\x75\x55\x53\x53\x51\x39\xb0\xed\x3d\xd6\xa0\x5a\x2e\x16\xec\xdc\x10\x9a\xb3\xa3\x28\x05\x2f\xe8\xdf\x48\x99\x0b\x43\xe3\x6c\x38\x54\xad\x54\x7c\xbc\x56\x3d\x59\xd6\x05\xe7\x73\x78\x81\xf3\x0f\xd2\x9d\xba\x89\xfa\x48\x58\x9d\x99\xeb\xd1\x09\xb8\xbe\xcc\xd8\x50\x55\xe5\x91\x2c\x52\x21\xd4\x1a\x72\xc3\x11\xfc\x47\xc8\xd2\xf2\x4b\x0f\x42\x36\xe8\xc2\xdb\x9c\xf7\xb4\x91\x28\x2d\xcc\x24\xd2\x2e\xd2\xf2\xaa\xb1\xa1\xd8\x46\xa2\xbe\x1f\xef\x89\xb2\x89\xe1\x9d\x9d\x50\x3d\xf8\x81\x04\x2b\xed\x26\x13\x30\x8f\xea\x6d\xf8\x85\x71\x35\x08\xd3\xae\xd2\x6d\x6d\xb6\x80\x34\xf8\x26\x46\xf7\xf9\xd8\xc6\xa3\x22\x7f\x95\xa5\xe1\x0c\x8c\x28\x45\x1e\xb2\xdf\x78\xf0\xa3\x61\x32\xfc\xac\x88\x3d\xa2\x32\xfc\x9d\xee\xab\xdd\x9e\xfc\x50\x51\x95\x88\xff\x8a\xd8\x9e\xbc\xbc\xea\x9d\xe3\x50\x91\x8d\x88\xff\xea\x6b\x2c\x67\x33\xdc\x46\x3d\x22\x5e\x11\x75\x2a\x3a\xa0\x9a\xf5\x0f\x15\x99\x88\xf8\x2f\xb3\xe7\xee\xb4\x35\x42\x67\xd8\x4c\x5b\x7f\x8e\xa2\xbe\x59\xfd\xd1\xe5\x04\x25\x6a\x08\x0a\x9a\x89\x00\xf3\x40\x55\x12\x46\x55\xc0\x85\x65\xa7\xc3\x35\x27\x4c\x00\xea\x2b\x14\xe8\x71\x99\xc0\x8d\xfb\x86\xdc\x24\xae\x22\x54\x01\x54\xa3\xc0\xed\xa8\x78\x66\x70\xb9\x7f\xbd\x76\x08\xbe\xdb\xb8\x88\x5c\xce\xae\xf0\xc0\x16\x09\xbe\xb6\xd2\x28\x1e\x94\xa5\xa1\x3e\xe2\xf9\xeb\x74\x22\xf9\x0a\x9d\x48\xda\x74\x22\xe9\xa5\x13\x89\x3b\x89\xd7\x6b\x87\xad\x95\xeb\x39\x31\x8e\xd7\xeb\xcb\x2b\x97\x27\x20\x4b\xf8\x95\x2b\xb7\x99\xd0\x48\xd2\xe3\xe8\x32\xb9\x12\xc6\x7a\x30\x66\x5f\x26\x57\xfa\x55\xf2\xbe\xc9\x9d\x0a\x73\xba\xa0\x3c\x4a\xd3\xe2\xb6\xe7\x9a\xdb\x33\x9a\x19\x77\x77\x7a\xe6\x1a\x12\x3a\x4d\xfb\xca\xdb\x6b\x60\x8b\xbb\x3a\x00\x6c\xea\xf6\xbc\x33\x1c\x06\x97\xb3\x2b\x46\xcb\x2f\x67\x57\xdd\x45\x64\xa5\x32\x4a\x2b\x9b\x2a\x39\x5d\x28\x96\xd3\x44\x5c\x17\x11\x3c\xbd\x7f\xa5\x31\xc6\x83\xa4\xff\x38\x0a\x70\x30\x09\xb6\x1d\x51\x01\x1b\x18\xc4\x77\x33\xd7\x06\x4e\x94\xd6\xc1\x95\x4c\x02\x1e\x0e\xa9\xeb\xb9\x32\xed\xf3\x5c\x99\xc2\xb7\xf4\xc0\x7d\xc8\x49\xf5\x00\x0c\xec\x47\x38\x47\x3f\x99\x28\x4a\x5c\x14\xaf\xd7\x62\xe0\x7c\x6a\x7b\x50\x91\x1d\x50\xa4\x33\x0d\x02\x6f\x34\x2e\x3d\xd6\x88\x6d\x69\x10\xdb\x38\xe1\x79\xf0\x23\x0c\xbf\xa8\xab\x34\x28\x60\x09\x6a\x34\x28\xf1\x1e\x7e\xac\x2e\x8f\x31\xbe\x77\xc6\xfe\xec\x1d\xea\x1c\x48\xc2\x39\x90\xd9\x57\x39\x90\x64\xf2\x4f\x7e\x35\xb8\xbd\x52\xdf\x88\xe2\x48\x1c\xd4\x33\x7e\x3a\x27\xac\xac\xeb\xbc\x99\xc8\xc3\x6b\x36\x39\x52\xcd\xc0\xf3\xb4\x89\x7d\x1a\xb6\xce\x0e\xf0\x05\xa4\xae\xff\xaa\x9d\x66\x4d\x23\xdc\x1f\x44\x9b\xfe\xf3\x76\xbb\xa3\x00\x56\xa8\xdb\x6e\xa5\xf9\xb1\xa0\x7b\xea\xf0\xce\x0e\xd5\x0e\x5c\x4c\x85\xcb\x88\x24\x29\xe2\x50\xd6\xdb\xc0\x11\xce\xb6\x83\x5e\xac\x28\xca\x80\x1a\x87\x76\x0f\x00\xda\x39\xd5\xbd\xbe\x46\xf2\xe7\xe4\xf2\xca\xb3\x6d\xd6\xa9\x71\x82\x57\x06\x52\xfd\x3b\x22\xda\x43\x44\x33\x40\xcf\x87\x8b\x67\x7f\x47\x34\xfb\x4f\x8a\x65\xff\x09\x91\xec\x6f\x8a\x63\xf7\x88\x62\x5f\x11\x55\xe8\x56\xf9\xa7\x2d\x61\x0d\xfe\x65\x48\x1d\x49\x0a\xdd\x03\x0a\xb5\x41\x71\xe6\x26\x04\xe6\x26\x6a\x98\x1a\x20\x49\x9c\xb1\xe9\xe5\x5f\x9c\x98\x73\x27\x2d\x4a\xd3\x15\x66\xe2\x89\x61\xde\xe7\x79\x74\x9c\x08\x5f\x36\x6f\xa2\xf8\xaa\x4f\xa0\x89\x19\xeb\x6e\xbe\x6a\xdb\x7b\xdd\xb7\x59\xe1\x95\xeb\xf5\xd1\x7f\xc9\x67\xc5\x8a\xfe\xf7\x68\x3a\xfe\x13\xa2\x87\xe2\x74\x0d\x26\xf9\xeb\x8c\xbc\xc6\x91\x0e\x4c\x9e\xb3\xb9\xaf\x2e\xa9\x41\x6d\x68\x82\x2c\xcd\x91\x81\xb1\x3b\x5c\x0b\xbb\x4c\xda\x37\x00\x0d\x35\x93\x37\x4b\x90\xa9\x1f\xf2\xb2\x04\x55\xec\x1c\x01\x7a\x2b\xa6\x2e\xa5\x95\xb7\x48\x50\x94\xc6\xb1\x56\xf2\x39\x11\xf7\xa0\xb5\xb2\x92\xb7\x12\xd1\xda\x23\xad\xa6\x32\x6b\x58\x7f\x5e\x9d\xa0\x1b\x52\xe6\xc7\x45\xf9\x31\x9f\xf3\xdb\xab\x17\xad\x3c\x29\x1b\xd9\x02\xa2\x53\xd0\xa8\x09\x9c\x2f\x3f\xe1\x41\x8d\xb7\x82\x3d\x81\x4c\x7b\xb2\x29\x8d\xee\x83\xda\x6e\xdb\x05\x5a\xd2\xaa\x2e\x4a\xb8\x18\xce\x7d\xec\xdb\xd1\xe5\xb9\x19\x70\x0b\xca\xfd\x2c\x11\x09\x87\xdc\x69\x99\x71\xa7\xca\x1d\x3f\x34\x2e\x3b\x0b\x36\x35\x84\x3c\x22\x0b\x52\xd2\x1c\x96\xcf\x77\xe1\x8a\xb9\x56\x10\xe2\x70\xf4\x79\x49\xcb\x15\x77\x46\x2d\xca\x97\x59\xe6\xf0\x1e\x2f\x59\x27\x7f\xdc\x3e\x89\xec\xbd\x9f\xcf\xcf\xde\x8d\xf8\x5e\x4d\xe3\x95\x03\x7e\x8b\x7b\xbb\x57\x97\xac\x4b\x68\xc1\x87\x71\xb5\xeb\x0a\x17\xa4\xb1\x1f\x34\x8e\xbd\x81\xb4\xfb\x44\x38\xbc\x0c\xae\x80\x0f\xe7\xd7\x00\xa3\x11\x23\xc9\x60\x62\x62\x3f\xa4\x96\xb1\x0a\x9c\xc8\xf5\xa9\xee\x38\x39\xb6\x5d\xff\xe7\xd8\x01\x4f\xac\xcd\xe6\x1e\x8e\x61\xcb\x4e\x53\x92\x78\xe3\xcd\xb9\x45\x14\xdf\x6c\x36\xae\x9f\x87\x23\x7e\xc3\x17\x2e\xd8\x36\x0b\xc6\xe3\xb5\x88\xbb\xe0\xce\x52\x48\x78\x3f\x25\xfc\x7e\xe3\x49\x22\x28\xa2\xba\xf3\x90\x34\x6e\x6c\x3b\xce\x0e\x59\xaf\x0f\x77\x74\x7b\xda\x70\xf8\x5d\xeb\xf9\xb0\xdd\xc0\x79\xb1\x63\x9a\xe4\x6c\x0b\x2e\x78\xee\x43\x1a\xdb\xfd\x45\x91\xe6\xf5\xbe\xbc\xb3\x6e\xd9\xaa\x31\xf7\xbc\x34\x1c\xf9\x13\x71\x3b\x7b\xf2\x5d\xcb\xa8\xd7\x76\x8d\xf2\x74\x45\xb6\x91\x49\xa0\xe7\x1b\xd6\xeb\x1d\x20\xa5\x9a\xca\x24\x22\x35\xd9\x87\x51\x96\x45\x51\xdb\x6c\x14\x6c\x9a\x7e\xc7\x79\xec\xdc\x75\x73\x27\xf5\x26\x96\x92\xe0\xdb\x04\xf8\x3b\x11\xea\xf2\xd0\x23\xd8\x21\xb8\x33\x76\x77\x62\x7a\xe4\x79\xbf\xf2\x6b\x23\xc8\xee\x28\xff\x02\xfc\x02\xbc\x14\x89\xb6\x21\x3c\x82\x08\x0e\x0c\x08\x5c\x1e\x04\x97\xe0\x9a\x24\x70\xcd\x8c\x60\xe1\x50\xa9\x22\x93\x40\x76\xa6\x76\xae\xa8\x56\xdc\x0b\xd1\x56\xbe\x8a\x3a\x41\x39\xfa\xae\x6e\x13\x95\xe5\xa2\x89\x66\xa1\x11\x95\x9f\x12\xbc\xe0\x29\xea\x08\x8e\x88\x48\x51\x1f\x39\x84\x47\x35\x15\xe8\xcf\xf3\x58\x94\x35\x77\x44\xe4\x33\x7c\x07\x16\x27\xb8\x43\xa6\x37\x41\x34\x8f\xf4\xc2\xa3\x3c\xda\xf0\xcb\x2c\x2a\x9c\x8a\xb8\x49\x9b\x50\xe1\xc0\x9e\x16\xf9\x70\xd8\x53\xe8\xb8\x70\xd7\x3a\xe4\xb1\xbd\xc2\x51\xc9\x38\x08\xf0\x8d\x72\xef\xd8\x76\x24\x79\x38\x2d\x4a\xa0\x42\x82\x38\x88\xa2\x33\xf0\xd2\x41\x14\x87\x23\xb0\x95\x2a\x42\x05\x4f\xbc\x16\xe2\xa7\x34\x96\x0d\x44\xd5\x4f\x11\x2a\xf3\x96\x75\x92\xeb\xc9\x30\x85\x3c\x85\x12\xbc\x7f\x88\x66\xec\x9f\x29\x1e\xa3\x12\x8f\x51\x8e\x89\xc8\x0c\xe3\x07\x2a\x9b\xb0\x64\x6b\x96\x90\x5a\x98\xeb\x55\xc7\x3c\x9c\xd5\x93\x1d\x8c\x73\x6d\x03\x38\x09\x8e\xf7\x22\xd7\x67\xad\x28\x6f\x15\xf6\xb4\x9a\xe1\x78\x2f\x74\xfd\x27\x58\x2f\x67\xbc\xd1\x9e\x78\x86\x3d\x2b\xa8\xa6\x1e\xff\xd0\x59\xe2\xdc\x30\x2d\x71\x3c\x5e\xe1\xdc\xcf\xf1\x72\x23\x47\xcc\x5e\x68\xd2\x48\x5a\x81\xbf\xe2\x81\xb4\xf7\xf6\xa6\x98\x87\xe1\x4a\x70\xec\x42\x29\x65\xa5\xa5\x70\xa4\x99\xb1\xd2\x26\xb8\x1f\xf4\x06\x01\x4f\x78\x7c\x76\xd9\x5d\x8e\x57\xac\x4b\x6d\xb3\x6c\x58\xef\x01\x06\x5f\x8b\x64\xbd\x86\xbf\x33\x1e\x2c\x61\x20\xf0\x2b\x01\x84\x9a\x89\xeb\xd1\x7c\x45\x36\x01\x9b\x4b\xd1\x60\x0c\x0d\xc6\x46\x03\xff\x24\xc1\x77\xb0\xd8\xfc\xc4\xf5\x08\x52\x08\xf9\x01\x6c\x88\xc1\xc6\xff\x1c\x39\x8c\x5a\xa3\x76\x94\x27\x7d\x77\xf0\x7d\x71\x92\xa0\x00\x36\x07\x02\x37\xd4\x06\x2e\x8f\xc1\x6f\x40\x86\x7b\x2a\x7c\xfd\xa6\xc4\xd9\xe6\x3b\x0a\xb7\x69\xf9\x4e\x0b\x41\x4b\x14\x60\x88\x42\x51\xd6\x88\xe0\x68\x44\xf3\x08\xa9\xf8\x24\x22\xe7\x80\x8b\x7a\x36\x23\xe3\x96\xcd\x52\x1c\xa0\xd0\xd8\x7d\x18\xae\xee\xcf\x53\x46\x43\xc4\x11\xa6\x30\x44\xde\x71\xeb\xd9\x7c\x0c\xfb\xfb\xf7\xa4\x70\xe9\xba\x3c\x0a\x1c\xf7\x4a\x1e\xd1\xa4\xe9\x46\x7e\x08\x75\x55\x32\x0e\x88\xbf\x48\xf3\x68\x42\x3c\xad\x19\xfb\x4a\xea\xfa\x3b\xc1\x88\xde\xd6\x34\x8f\x86\x43\xf2\xc3\x20\x82\x84\x18\x11\x9b\x59\x44\x30\x75\x7d\x8a\x8f\x23\x27\x6c\xec\x7e\xf0\xc4\x93\x13\xd1\xe1\x90\xb1\xe7\x87\x90\x10\xb1\xa1\x0e\xeb\x75\xa0\xd1\x06\x48\x6e\xc0\x36\x47\x53\xcc\x29\x00\x54\x70\x87\x3e\x56\xa5\x28\x05\x13\x19\xd4\x0b\x1a\xc5\x80\x72\xde\xde\x95\x3a\x94\x96\xe7\x35\x60\x80\xe3\xfa\xc9\xa8\xa2\x35\x2c\x87\xc3\xfb\x46\xb2\x27\xd7\x0f\xa4\x02\x24\xcb\xa0\x79\xe5\xb8\x3e\xf9\x21\x9a\x38\xc1\x88\x44\x11\x87\x90\xb8\x48\x4e\x8a\xc3\xc7\x82\x9a\xae\x3d\x07\xc0\x1f\xf5\xd4\x21\x03\x86\xbb\xd9\x04\xf8\x92\x7b\xd3\x10\x1c\xf2\x6c\xd5\x1a\x2b\x67\xba\xe6\x0c\x87\x01\x57\x3c\x35\x31\x67\x50\x46\x63\xa0\xf0\xe0\xa9\xf2\x96\xc6\x35\xaa\x8b\x85\x2a\xb8\x28\x16\x1b\xd7\x4f\x09\x44\x1e\x57\x17\xad\x02\xfd\xa2\x15\x01\x97\x3f\x44\x46\x02\xa6\x06\x0a\x93\x11\x03\xdf\xa9\xbb\x28\x16\x78\x40\x46\x75\xb1\xd8\x48\x76\xe8\x73\xe4\xfc\x94\xb8\xbe\xe0\x92\x36\x42\xa4\xd8\x92\x29\x8a\x2b\x2f\x08\xd6\xcc\xfe\x3e\xb9\x3c\xbb\xc2\xd4\x27\x97\x8b\xe0\x4a\xbf\x74\x86\xb8\x73\xfa\x89\xbc\x12\xcb\xb8\x15\xf3\xc8\x6d\xf9\xaf\xf3\xa8\x29\x24\x4b\xbf\x50\xfd\xa5\x92\xe6\x9d\x51\xb8\x77\x0b\x7d\x04\x5e\x87\x2b\x0f\x96\x75\x0d\xa6\x0d\xc3\x28\xd2\x23\xde\x35\x0c\x2a\x01\xeb\x90\xd2\x7d\xab\x93\x09\xc2\x1c\x76\xce\x7b\xe1\x4b\xd1\x37\x3d\xa2\xad\x61\xb2\xd9\xa0\xbe\x84\x75\xbd\x2c\x48\x33\x24\x6c\xdc\x26\xd4\xdd\x14\x1a\xbf\xc3\x1e\xb7\x76\xbd\xb6\x71\x0e\x1c\x7c\xdd\x3b\x50\x5e\x5e\xbb\xc7\x7f\xb0\x67\x2c\x5b\x1a\x0b\xbd\xb4\xfc\xf0\xd7\x74\x51\xa6\x45\x99\xd6\xe9\x17\x7a\xbe\x0c\xea\x92\xd2\xde\xaf\xdf\xd9\x09\x46\xd3\x34\x8a\x68\xbe\xd1\xa4\xdb\xad\xe8\x08\x51\x81\xb8\x2c\xcd\x11\x31\xd2\x10\x30\x2f\x6e\xbc\x45\x8c\xe4\x6d\x7a\xef\x4e\xcb\x10\x6f\x46\x16\xe2\xa4\xc8\x51\xb9\x8d\xef\x59\x5d\x8e\xe7\xd4\x2f\xcd\xe5\x6d\xe7\x96\x6f\xc1\xd7\x2f\x45\xd8\xb6\xec\xa6\xc9\x3a\xdf\x11\x33\xf5\xab\x0d\xa1\xdc\x4b\x0f\xdb\x44\xfd\xc9\xea\xf5\xd7\x06\x81\x7b\xf7\xa2\x2d\x66\x34\xd4\xcb\xc8\x69\xef\x04\x88\xb8\x5e\xb7\x17\xbd\x4d\xcf\xe8\x5b\x20\x42\xf5\x46\x27\x31\x7e\xe7\xe5\xbf\x31\x32\x48\x9e\xd9\xd3\x95\xe6\xf7\xd3\x99\x2e\xdd\x27\x28\x30\xdb\x1a\x29\xf8\x5b\x2f\xde\x37\x2a\x13\xa4\xd7\xe9\x63\x83\x54\x52\x4a\xef\xae\x9b\x78\xb1\x5f\x12\x69\x0b\x72\xc1\xa8\x2e\xde\x16\x37\xd2\xf3\x5c\xd5\x42\x20\x7f\xa3\x4a\x44\xc4\xda\xa0\xfe\x64\x8e\x6d\x4c\x10\x64\x07\x2e\x85\xad\xd7\x4f\x8c\x6e\x15\xa8\x6d\xc9\x1f\xcd\x04\xb4\x3c\xc1\xa7\xce\x9f\xfa\x64\x38\x6c\x4b\xcd\x66\x17\x90\xe5\xd3\x78\xc5\x10\xdb\xfa\xb2\x4a\xf6\x76\xaa\xdf\xaa\xfa\x77\xfa\x9c\xde\xb3\x38\x7c\xbb\xa3\x98\x91\x81\xb3\x2b\x1c\x8b\x53\x2f\x94\xaf\x2b\x25\x3f\x45\x91\xab\x40\xdd\x43\xc1\x04\x20\x05\x40\xe8\x05\x37\x28\x4a\xa3\x77\x45\x7d\xca\xa4\x25\xa9\xb2\x52\x98\xb9\x2d\x19\x68\xef\x5b\xdb\x1b\x0f\x78\x6b\xd1\xf0\x55\x13\xd4\x71\x3b\xe4\xad\x88\xdb\x34\x39\x4e\x73\x4d\x77\xf7\x20\xa8\x5b\x5e\xf9\xda\x67\x9a\xaf\x3d\xbc\xe5\x56\xb8\x1b\xb4\x2d\xbe\xad\xf7\x39\x46\x9d\xe8\xb6\xfc\xaa\x40\x19\xe2\xdf\x5b\x21\xfe\x34\xe7\xed\xb7\x86\xd5\xe7\xe7\xc4\x09\xf5\x98\x8c\x8f\xc7\x63\x5b\xb9\xdc\x89\xd8\x92\x1f\x8a\xa2\x09\x3a\x0c\xa9\x0c\xdd\xdf\x47\xad\x98\x95\xe0\x12\x05\xf6\x37\xb8\xba\x16\xe1\x68\xbd\xfe\x85\xc1\xe6\x59\x45\xc1\xed\x40\x85\x54\x8b\x45\x5a\x2b\x71\x69\x30\x34\x88\x53\x2c\xdd\xaa\x7e\x1f\xb5\xc2\x82\x72\x41\x60\xcb\xb8\x70\xe2\xff\xde\x89\x5a\xa8\xdf\xd0\xec\x1b\x72\x02\x43\xde\x28\xb5\xcc\xef\xa3\xde\x70\x85\x4e\xac\x5d\x49\x3e\x4d\xf4\xbb\xd3\x8f\xbf\x27\x65\x02\x32\x41\x25\x18\xe1\xe1\x90\x7f\x25\xdb\xdd\xb2\xea\xf2\xf1\xd5\x44\x7f\xe0\x3a\xb2\x9f\x13\x27\xe8\xce\xbd\x18\xca\x7b\x0a\xcb\xc4\x03\x8f\xea\x6a\xb9\x77\xa2\xff\x7a\x9a\x56\xbd\x13\xd1\x9d\x37\xd8\xbf\xef\x12\x2d\x68\x65\x49\xf3\x88\x96\xad\xdb\x8c\xdd\x19\x22\x68\x5b\x2f\x2a\x7f\x93\x6f\xc0\x5d\xe6\xa0\x66\x34\x6e\xe5\x76\xc1\xc2\xbb\xf7\x43\x26\xae\x08\x50\x76\x96\x60\x61\x64\xe0\x01\x18\xbd\xd3\x04\x22\x19\xbe\x3e\x3b\x05\xfd\x5b\x2b\x4c\xb0\xb8\xa9\x6c\x04\x8f\x4c\x63\xc7\x94\x7d\x64\x2d\x51\xe9\x4b\xfb\x82\xa8\x82\xf7\x86\x42\x8c\x76\xb8\x45\x27\x70\x7b\x53\x0d\x12\x31\xb7\x3c\xf0\xef\x0b\xdb\x85\x95\x3d\x7c\x62\x23\xe3\xc2\x97\xdb\xd0\xe2\x0e\xfd\x15\x7d\xbe\x4d\xf8\x44\x41\x8e\x90\xb1\x60\x22\x18\xe8\x07\xbd\x70\x08\x2f\xa8\xe0\xa4\xfc\x4d\xc1\xe6\x9e\xe4\x75\x3f\x17\x26\x18\x58\x75\xdd\xbb\x51\x4a\xf4\xcd\x10\xfb\xc4\x27\x2f\x3a\xd1\x19\x14\x81\xd9\x39\x84\x23\x47\xe0\x84\x52\x83\xbf\xac\x3b\x0b\x07\x7a\x6f\xb9\x13\x06\xaf\x1d\xfb\xa9\xb6\x13\x48\x1f\x96\x4c\x9c\xfb\x77\xbb\x9c\x0b\x31\x21\x3b\x87\x48\x0f\x9a\xd7\xbb\x6f\x78\xd0\xd4\x8d\x2b\x72\x87\x6b\x93\xd7\xc6\x3f\x55\xd1\x0a\x9b\x5a\x87\x4d\x55\x3b\x5e\xea\xef\xf7\xc4\x4b\xfd\x5d\x8b\x97\xfa\xe9\xd3\xf9\xd1\xab\x0f\x47\x17\x9f\x4e\xde\x5d\x1c\x7d\x78\xf7\xf2\xed\xf9\xa7\xd7\x67\x9f\xde\x9d\x5d\x7c\xfa\x78\x7e\xf4\xe9\xec\xc3\xa7\xff\x3e\xfb\xf8\xe9\xb7\x93\xb7\x6f\x3f\xfd\x78\xf4\xe9\xf8\xe4\xc3\xd1\x6b\xef\x0e\xe2\x2f\xbe\xcf\x96\x49\x9a\xff\xb4\x0c\xbc\x3c\x40\x5a\xc9\x07\x9a\xa4\x55\x5d\xae\xbc\x8f\x44\x14\x97\xc5\x82\x24\xa4\x2e\xca\xca\x7b\x15\x20\x11\xaf\x56\x5a\x2c\xd4\x32\x79\x9f\x43\x5e\xf7\xfa\xec\x54\x15\x5e\x30\x21\xa9\x0e\x54\x85\x11\xf9\xd1\xab\xa3\xcd\xc6\x1f\xfc\x3e\xea\x06\x3b\x75\xee\xb6\x45\x1f\xfd\x1c\xa0\x60\x99\x47\x19\x6c\x4c\x6f\x8c\xae\x69\x59\x31\xa6\xd4\x3e\x7c\x36\x3a\x1c\x1d\xda\x02\xe7\x69\xf9\x9e\x84\x33\x92\x00\x6f\xe9\xd9\xdc\xa4\x11\x15\x73\x7b\xc3\x8f\x8b\xf7\x1d\xcb\xa4\xd4\xda\x9f\x25\x1b\x17\xfd\x23\xc1\xef\x93\xe1\xf0\x2c\x59\xaf\xdf\x27\xfe\xbc\x60\x27\xea\x88\xde\x2e\x8a\xb2\xae\xf0\x3f\x12\x3d\x4e\xa9\xf1\xe4\xfd\x23\xf1\x07\x83\xc1\xc1\xa3\x47\x8f\x0e\xac\x8d\x8b\x06\x07\x8f\xac\xa7\xe3\x67\xd6\xa3\x03\x51\xd6\xe0\x1c\x07\x8a\x2c\x01\x15\x59\x9f\x3e\xdd\xd0\x60\x41\xc2\xd9\xa7\x92\x7e\x5e\xa6\x25\xfd\xf4\xc9\xb5\xee\x06\x03\x7b\x59\x51\x8b\x49\xad\x61\x6d\x0b\xe0\x03\xeb\x91\xf5\xaa\x58\xac\xca\x34\x99\xd6\x96\x13\xba\xd6\xe3\xf1\xe1\x93\xfd\x05\x13\xe1\xf2\x1a\x59\xc7\x24\xa4\x41\x51\xcc\x90\x75\x92\x87\xa3\x81\x05\x2f\x5c\x4c\xd3\xca\xe2\xae\x11\x56\x58\x44\xd4\x4a\x2b\x2b\x4b\x43\x9a\x57\x34\xb2\x96\x6c\xd2\xac\x7a\x4a\xad\xd3\x93\x0b\x59\x6c\xc5\xc5\x32\x8f\xac\x34\x67\x15\x0c\xc4\xdb\x93\x57\x47\xef\xce\x8f\xac\x38\xcd\xa8\x28\xb6\xca\xa2\xa8\xad\x28\x2d\xc1\xba\xb7\xb2\x8a\xd8\xaa\xb5\x8e\x18\xf9\x90\x03\xf8\x2f\x46\xf2\x20\x7e\x54\x35\x60\x33\x02\xf4\x3a\x05\xa5\x9a\x85\xfb\x3e\xdf\x79\x3a\x7e\xee\xfa\xea\x8b\xff\x0b\x2e\x3e\x5a\x77\x8f\x36\x16\x57\x0a\x58\x17\x53\x2a\x7f\xd6\x85\x05\xa0\x47\xd0\x52\x90\x82\x3b\x71\x81\x74\x63\xfd\x36\xa5\xf5\x94\x96\x56\x51\x5a\x79\x51\xc3\xc0\xc5\x8b\x69\x65\x11\xeb\xf5\xd9\xa9\xc5\x04\x5c\x8b\x91\xfc\x11\x8c\xae\xb9\xbd\x56\xa9\xdb\x0b\xfc\x15\xb6\x2a\x96\x25\xba\xe0\xe3\x57\x35\xc3\xa1\x80\xab\x0e\x0f\x0b\x63\xeb\x89\x3f\xd8\x0c\x06\x26\x1a\x59\x58\x83\xec\x77\x70\xe6\xf9\xff\xc3\x99\x5e\x9c\xf9\x3f\x83\x0b\xbd\x68\xd0\x41\x01\x30\x2b\x15\xa1\x85\xe5\xfb\x13\xb9\xf8\xc6\x25\x18\x6b\xbd\x96\x0d\x3c\x15\x2e\xc2\x97\xef\x0b\xc7\xac\x94\xde\x58\x98\xd5\x8e\xf4\x92\xf5\xda\xe2\x5a\x76\xbf\xc1\xb8\x9d\x1d\x31\x08\x86\x6c\x8e\x74\x16\x6e\x5e\x1a\xf1\x0d\x85\xb1\xb5\x2b\x07\xbf\xab\x46\x66\xa5\x82\x90\xf6\xbd\xe3\x59\x02\x9a\x68\x0b\x30\xf8\xef\x5d\xd6\x99\x51\xab\x23\x38\xb6\x76\xb9\x12\x6f\x4b\x33\x46\x84\x79\x33\xae\x7d\xdb\x75\xdd\x6d\x3b\xa2\x7f\x37\xbc\xf8\x0f\xee\x86\x83\x47\xd6\x6f\x47\x3f\xbe\x7f\xf9\xea\x17\xeb\xd7\x97\x1f\xac\x93\x77\x3f\x1f\xbd\xba\x38\x39\x7b\x67\x3d\x3a\x68\x60\x2f\xca\x22\xa4\x55\xe5\x5a\x77\x07\x8f\x1e\x59\xff\x25\x91\x1b\xce\x31\xeb\x9a\x9f\x35\x0c\xbb\xd4\xc1\x32\x8a\xe8\x35\xcd\x8a\x05\xa8\xaa\xff\xaa\x04\xfa\xfe\xdf\xb5\xe1\x0e\x06\x83\xc1\x20\x8d\x2d\xf9\xf5\x23\x9a\x5f\x8f\xde\x9d\xbd\x3e\xfa\x74\xf4\xee\x57\x6b\x07\x63\xcb\x5e\x94\x45\xb4\xe4\x3c\x2c\xdf\x03\x1a\x13\x65\xdd\x0d\x76\x9b\x99\xde\xf5\x39\x81\xe7\x53\xd6\x4f\xdf\x0f\x45\x9c\x8d\x34\xbf\x26\x65\x4a\xf2\x6d\xed\x5e\x3c\x17\x0d\x6f\xb8\x93\xed\x36\x70\x87\x8f\x45\xbb\xa3\x5b\x1a\x2e\xb9\x85\xeb\x3a\x2d\x8b\x1c\xb6\x61\xff\x4b\x8f\x9f\x8c\xc5\x4b\x9f\x48\x55\xa5\x49\xbe\x6d\x0c\xcf\x44\x33\x3a\x5f\xd4\x2b\x19\xd3\xe7\x9b\xc3\x6d\x47\xd7\x77\x72\x28\x3a\xcb\xb3\x75\x0c\x72\x26\x12\x5a\xbf\x0c\xeb\xf4\x5a\xfa\x17\x6d\x7d\x41\x7e\x69\x35\x25\x59\x56\xdc\x1c\x7d\x5e\x92\x6c\xeb\xb4\x3c\x11\x8d\x45\xda\x8b\xfb\x8e\xdc\xc7\x4f\x64\x63\x65\xf1\xda\xda\xf2\xa9\x3e\x23\x67\x82\x66\x6c\x19\x82\xfc\x40\x20\xcc\x8c\xa5\x64\xa4\xa3\xda\xd6\xfc\x5b\x09\x7a\xba\x5a\x4c\x69\x4e\x6a\x7a\x5e\xaf\x32\x41\x47\xb6\xb0\x0a\x72\xc2\x43\x32\xa7\x59\xfa\xe5\xeb\x6f\xc0\x98\xe4\x81\xf2\xdb\xcb\x0f\xef\x4e\xde\xbd\xf1\xac\xd7\x67\xd6\xbb\xb3\x0b\x6b\x4e\xf2\x25\xc9\xb2\x95\x25\x5e\xe0\x1b\x46\x10\x2c\xb5\x53\xe1\xc0\x10\x29\x48\x61\xb9\xe2\xa2\xb4\xfe\x54\xe8\xec\x8c\x46\x23\xf7\x4f\x6b\x59\xf1\x74\xa3\x6c\x27\x82\x3f\x29\xdf\xda\xd5\xaa\xaa\xe9\x9c\xc1\x22\x79\x64\xdd\xa4\x59\x66\x7d\x2a\xf2\x6c\xf5\xc9\x0a\xa8\xec\x56\xbd\x17\x16\x65\x49\xab\x45\x01\xc9\x2a\xac\x80\x04\x34\xb3\x16\xa4\xaa\x60\x2c\x27\xb5\x45\xb2\x1b\xb2\xaa\x2c\xc8\x39\x56\x89\xcd\xbc\xc3\xf7\xde\xa4\xd9\x5f\x4e\x4c\xb2\x8a\x22\x6b\x57\x32\xe4\xd6\x0d\xa9\x2c\x7e\x7d\xd8\x0a\x40\xff\xcc\x37\xec\xc8\x3a\x25\x33\x6a\x55\xcb\x92\x5a\xab\x62\x09\x4d\x60\x1c\x1c\xe4\x82\x33\xd7\xf2\x15\x56\xcb\x86\x25\xa1\x8e\x76\x5d\xcb\xb3\x64\x40\xfc\xc1\xc1\x01\x3b\x9d\x2b\x6a\xa9\x48\xbd\x95\xc5\x6d\x2a\xec\x4b\x49\x96\x59\x59\x71\x43\x4b\x30\x67\xd5\x85\x05\x08\xcd\x66\x92\xbd\x08\x85\x69\x5e\xd1\x9c\x07\xb2\xb1\x04\x33\x00\xa4\xe5\xe8\xfc\xe8\xc3\xaf\x47\xaf\x3f\xbd\xff\x70\xf6\xfe\xdc\xc2\x40\x90\x54\x0c\x3f\xab\x2e\x97\x14\x0d\x2c\x6b\x8b\x79\x47\x6b\xa0\x87\x02\x6c\x97\xca\x48\xb8\xaa\x3c\xed\x02\xb8\xff\xca\x40\xb7\x5d\xfb\xd2\x80\xd6\x82\x21\x2d\x7f\x1c\x6c\xfc\x81\x16\x7c\x85\x0d\xe3\x94\x54\x33\x87\xbb\x99\x59\x41\x5a\xcf\x49\x35\x33\x98\x51\x5e\x67\x0d\x9b\x4a\x76\xe8\x8a\x07\x38\x71\xd9\xb4\xbd\x3e\x3b\x95\x4e\xa9\x27\x20\x79\x31\xf8\x7c\xf2\x60\x33\x58\xd6\x23\xeb\x94\x2c\x16\x6c\x45\xe3\xb2\x98\x5b\x79\x51\xce\xc1\xa8\x19\x21\xbe\xbb\xd8\xa2\x44\x96\x8c\xd8\x6c\x81\x37\x13\xac\x1c\xa3\x30\x71\x9a\x88\xcb\xf1\x56\x3d\x25\x35\x87\x57\x2d\x68\x98\xc6\x29\xad\xac\x69\x71\x03\x88\x44\xaa\xaa\x08\x53\xc8\xc4\xcb\xf0\x50\x01\xd3\x10\x23\x64\x87\x10\x8d\x18\xa3\x26\xa4\xba\x68\x04\xe0\x0e\x06\x96\x75\xfa\xf1\x9c\xcb\xb8\x6c\xf1\x8f\x3e\x5c\xfc\xb7\x67\x8d\x6f\x0f\xd9\x1c\xfe\xf4\xf2\xfc\xd3\x8f\x67\x67\x6f\x8f\x5e\xbe\xfb\xf4\xeb\xcb\xb7\x1f\x8f\x58\xcd\x53\x59\xf3\xee\xe3\xe9\xd1\x87\x93\x57\x4d\xcd\x0b\x59\xf3\xfe\xec\xfc\xe4\xe2\xe4\xd7\xa3\x6e\x93\xc3\xb1\xb5\xd6\x5b\x9e\xfd\x7a\xf4\xe1\xed\xd9\xcb\xd7\x47\xaf\xbb\x1d\x3d\x1e\xcb\x56\xe7\x17\x1f\x4e\xde\xbd\xe9\x19\xca\x18\x0d\xf4\xb9\xe6\x8b\x60\x55\xc5\x9c\xf2\x79\xe2\x73\x6d\xcd\xf2\xe2\x26\xa3\x51\x42\x2d\x12\x14\x4b\xce\xa8\xb2\xcd\xc5\x49\x4f\x4d\x66\xb4\x52\x33\x2e\xb8\x2d\x0e\xf0\x26\xad\xa7\xd0\x3a\x2e\xd8\x56\x62\xeb\xb8\x68\x5c\x61\xa1\x0d\x6f\xa8\x39\xc8\x4a\x9e\x6f\x2e\x16\xde\x58\x13\xb6\xc0\x6c\x7d\x8b\x9c\x72\xde\x81\xf2\xf7\x7b\x31\x29\x2c\x80\xc5\xac\x2b\x60\xb0\x97\x59\x36\xb2\x4e\x62\x46\x44\xca\x66\xff\x5b\x69\x95\xef\xd6\x70\x2f\x89\x96\x80\xf8\xd6\x23\x2b\xad\xad\x9b\x82\x15\x27\xb4\xb6\x6e\xca\xb4\xae\x69\xce\x7a\x95\xdf\xad\x0d\xfc\xf5\xd9\xe9\x4b\x23\x0a\x7b\x67\xfc\x9c\x4e\x35\x1d\xca\x4f\x10\xc0\x38\x18\xb3\x7a\x64\xbd\x34\x9e\x2b\x10\x0f\x24\xe6\x46\x8c\x8c\xc3\xeb\x8f\x1e\x29\x72\x25\x97\xb0\xd9\x21\x1c\xd2\x7d\x43\x5d\x90\xf0\x3f\x33\x5e\x80\x64\x7d\xfc\xf0\x76\x64\x39\x5f\x1f\x79\x5e\x34\x2f\x8d\x5c\x73\x80\xef\xb5\xd8\xeb\x95\x67\x55\xe9\x3c\xcd\x48\xc9\xba\xef\x8c\xde\x0a\x96\xfc\x94\xd3\x10\x24\xa5\xd5\xc8\x40\xa8\xd5\xbd\xf3\x77\xff\x64\x9d\x1a\x91\xe3\x2b\x4f\x43\x52\xa0\x27\xea\x40\x16\x5b\xc5\x92\xc6\x71\x6b\xce\xdf\x60\xe8\xc6\xa1\xfd\x09\xe4\xf0\x4f\x76\x4a\xab\x18\x8f\x08\x86\xd0\x7a\x47\x12\x9d\x65\x5e\x51\xbe\xcf\x24\xea\xeb\x83\x93\x32\x27\x5f\xb9\x8d\x15\x15\x73\xf9\xbd\xaf\xf8\x26\xe4\x07\x35\xfc\x24\x95\x15\xd1\x2a\x2c\xd3\x80\x46\x6c\xff\x5e\xd3\x86\x74\x71\x7d\x97\x36\xef\xfc\x75\xcf\x52\xd4\xde\xe9\xc0\xe6\x74\x9e\xcb\x8c\x3a\xd5\xee\xdb\x82\xbe\x6a\xa9\xcd\x1d\xee\x8e\x77\xa4\x55\xaf\xd7\xd6\xdd\xa6\x79\xb1\x1f\x6b\x7b\x81\x6c\x69\xfa\x35\x80\x0f\x83\xd5\x03\xa6\x85\x20\xdb\xe0\xb4\x9b\x09\x40\x00\x89\xe1\x2f\x38\x5f\xb2\x65\x06\x16\x31\xcd\xb5\xb9\x92\x73\x6d\x59\x3b\x3b\x1a\x8a\xb7\xee\x73\xc8\x77\xdd\x3e\x06\xcb\xde\xb2\xc6\xc0\x11\x7a\xd6\x7f\x17\xcb\x5d\xc6\x53\x96\x2b\xb6\xf7\xeb\x42\xa0\x84\x49\x75\x77\xff\x67\xb5\x6b\xdd\x4c\xd3\x70\x6a\x4d\x49\x65\x91\xac\xa4\x24\x5a\x59\x01\xa5\xb9\x68\x4f\xa3\x11\x03\x65\xcd\xc9\x4a\x1c\x98\x69\x44\xf3\x1a\xf8\x56\xde\x02\xc0\x4f\xa9\x55\xb1\x8f\x34\xa0\x0b\x3c\xad\x6f\xd2\x90\x22\x46\xaa\x57\x0d\x20\xed\xdd\x9b\x42\xb4\x14\xbb\x6f\x4a\xae\x39\x8e\x67\x29\x6f\x61\x72\x01\x23\x1b\x59\xcd\xc4\x68\x3c\x20\x9f\x4f\x48\x0b\x25\xcd\xfc\x91\x85\x55\x5b\xd3\xfc\xef\x6b\xcd\x59\x0b\xb1\xbd\xb0\xb6\x46\x97\xf2\xcd\x2b\x03\xf8\x42\xed\x85\xb8\x10\x3c\x0d\xff\x9f\x91\x24\xc2\xd3\x06\x81\xfa\x9b\x00\x16\x7b\x70\x7e\x35\x2d\xf4\x1c\x15\x9e\x1a\x7b\x53\x6f\x66\xbd\x90\x6f\x6b\xd5\x46\xda\x0b\x4f\x63\xea\x9a\xaf\x44\xcd\xf6\x1e\x75\x78\x1c\xb7\xe9\xab\x95\x1f\xe3\xeb\xc0\x3a\x6c\x91\x09\x4c\x4f\xa9\xf2\x30\x60\x06\x9b\x64\x02\xeb\xcb\xd3\xf2\x30\xa0\xfd\x4c\x98\x09\xbd\x3f\x73\xca\xc3\xe0\x6f\x63\xdd\xcc\x1e\x78\xfe\xaa\xbf\x0f\xbd\x8f\xe5\x73\x05\xe0\x8d\xc4\xea\x1d\x47\xc7\xd2\x76\xa2\x13\x6b\xcf\x6a\x57\xeb\xb3\xd8\x53\xdd\x3f\x1d\xd6\xf7\xd8\x3a\xec\xa7\x4d\x1a\x55\xf2\x2c\xde\x38\x24\x39\xdb\xf8\x82\xc1\x13\xaa\x52\x64\x15\x0a\xb4\x56\xc6\xb8\x3a\x18\x90\x25\x45\x91\x65\x0d\x47\x3d\x63\x46\xe7\x41\x9a\x73\x37\x21\xeb\x7f\x56\xf7\x13\x83\x34\xb6\x9c\x0e\xc1\xdf\x4a\x65\x5d\x6d\x33\x83\xdf\xb5\xfe\x1a\x3f\x08\x4d\x48\x3d\x14\xc2\x32\xe7\xae\x0d\xc2\x78\x96\xab\xb5\xb9\x77\xb8\x70\xd6\x3d\x68\xcc\xdb\x7b\xe6\x7c\x5c\xcf\x17\x00\x70\xfd\x33\xfa\x47\xd4\x3a\xe9\xfe\xfe\x68\x4c\xb2\xc5\x47\xd2\x02\x7a\xcf\x28\x0e\x0e\xac\xd7\xc5\x4d\x0e\x82\x7a\x49\x63\x5a\xd2\x3c\xe4\xe2\xe0\xcd\x34\xad\x69\x96\x56\xb5\xc6\x28\x2a\xe5\x3c\x1c\xc2\x73\x3a\x0f\x68\x59\x4d\xd3\x45\x03\x8c\x49\x2f\x4c\xdc\x61\x00\xf7\xa5\xdc\x9f\xd6\x2b\x21\xf7\x80\x76\xa0\x82\x43\xad\x81\x5f\x17\xd6\x22\x0d\x67\xd6\x52\x83\xf3\x27\xb4\x8c\x97\x59\x56\x85\x25\xa5\xf9\x9f\x48\x1c\xa6\x8d\x84\x29\x85\x8c\x65\x25\xcf\xc9\xd6\xf1\x28\x04\xd9\x06\x28\xe8\x77\x00\xf0\x71\x03\x78\x60\xcc\xa9\x71\x38\x89\x23\x4e\x4e\x35\x9f\xbc\xcd\x80\xfd\xb7\x01\xe5\x93\x45\xab\x2c\xcd\xeb\x7d\x91\x89\xc1\x9a\x93\xdb\xfd\x8c\xe6\x8c\x51\x84\x7c\x6b\x17\x17\x1f\x4e\x7e\xfc\x78\x71\xf4\xe9\xdd\xcb\xd3\xa3\x4f\xe7\x17\x2f\x3f\x5c\x7c\x7a\xf5\xd3\xcb\x0f\x16\xb6\x6c\x95\xed\x4c\xa6\x3b\x13\xf9\xce\x64\xc2\x33\x91\xf1\x4c\xa6\x3c\x13\x39\xcf\x64\xd2\x33\x91\xf5\x4c\xa6\x3d\x13\x79\xcf\x64\xe2\x33\x91\xf9\x4c\xa6\x3e\x13\xb9\xcf\x64\xf2\x33\x91\xfd\x4c\xa6\x3f\x13\xf9\xcf\x64\x02\x34\x91\x01\x4d\xa6\x40\xe3\x39\xd0\xb8\xe6\x5d\x7c\x2d\xcd\x1f\xf0\xb1\xe2\x33\xb7\x4f\xc1\x9e\x65\xff\x21\x52\xab\x89\xdc\x6a\x32\xb9\x9a\xc8\xae\x26\xd3\xab\xf1\xfc\x6a\x60\x09\x03\xbd\xd1\xd9\xd9\xc5\x27\x13\xac\x85\xad\x5d\xf3\x5a\xd9\x6e\xa3\x1b\x3c\x25\x0b\xae\x08\x51\xd8\x61\x33\x09\x37\x22\x25\x97\x60\x6c\xd0\x7d\xe4\x52\xa4\x03\xf1\x3b\x65\x0c\x08\x97\xdb\x41\xe3\x51\x58\x15\xad\x19\x30\x03\xcb\x84\x7a\x1e\xa4\xfa\x23\x12\x4e\x25\x08\xa9\xa8\xf5\x84\x59\xc0\xe4\x5e\x58\x89\x65\x7d\x64\x1c\xd4\xcd\x94\xe6\x42\x39\xc2\x50\x78\x4e\xca\xd9\x72\xc1\x48\x34\x0c\xe2\xcf\x47\xcd\xad\x39\xf7\xcf\x51\x07\x12\x50\x18\x56\x6a\x30\x36\x1a\xf8\x22\x57\xe6\x30\x65\x39\xaa\x46\x96\xc3\x95\x9f\x79\x98\x2d\x23\x5a\x19\xbb\x9b\xf1\x88\x40\x4f\xa8\x15\x2d\x99\x04\xcb\xa1\xd1\x5b\xee\x08\x62\xc5\x24\xac\x8b\xb2\x62\x12\xe8\xa3\x36\xbf\xc4\x9b\x9e\xc4\x56\x5e\xe4\xfb\xc0\x3b\x71\xd5\x29\xeb\x99\x92\x48\xa8\x1e\x9a\xd9\x63\x7b\xd1\x08\xa6\xe4\xfe\x69\x91\xb8\xa6\x25\x07\x24\xa2\x36\x88\xe9\x19\xf1\x0e\x4d\x0e\x8c\x37\x94\x06\x41\x03\x38\x6b\x6a\x68\xa1\x48\x1e\x89\x2f\x8b\x98\x74\xd7\xac\xb7\x26\x2b\x3e\xea\xb0\x65\xf7\xf4\xd0\xd0\x21\xee\xcf\x26\x56\x13\x44\xd0\xc2\x22\x16\x1c\xd7\x2b\x7e\xc8\x4a\xd8\x06\x43\xf5\x80\xd1\xcb\x93\xba\x28\x2d\xc8\x48\x05\x23\x57\xa5\xec\x93\xd4\x28\x38\xb4\x87\x0f\xa5\x97\xc7\x7b\xc0\x90\x16\xe2\xbd\x2d\x63\x93\xd5\x1c\x52\xef\x48\xff\xc6\x20\xb7\xb0\x8a\xf7\x0c\x53\x70\x42\x80\x78\x30\xa0\x38\x23\x20\xce\xdf\xd0\x2c\x83\xbf\x6c\x67\x11\xad\x1b\xcb\xfa\x60\x8c\x07\xcc\x5f\xd9\xca\xa2\x60\x93\xa9\x0b\x3e\x30\xdf\x12\x96\x3f\x75\xc0\x09\x18\xf0\x16\x87\xd3\x7d\xb5\x2e\x97\xad\x37\xd5\x6b\x05\x1b\xfb\x4d\x5a\x09\xd3\x9d\x26\xfd\x70\x71\xff\x6e\xd3\x50\x30\x50\x62\x57\xac\x27\xf8\x60\xd2\x52\xed\x81\x19\x83\x1d\x86\x14\xc8\xb2\xa2\x11\xdc\x80\xce\x75\x24\xa6\x35\x5c\xdd\x05\x69\x36\x1f\x83\x84\xf8\xd8\x38\xa7\xc1\xd8\x93\xb4\xfa\x40\x2b\x5a\x5e\xf3\xcb\xf8\xd0\x46\xf1\x21\x32\x6e\x0d\xcc\xce\x80\x1f\x8b\xec\x1d\x50\x0a\x71\xe7\x48\xeb\x07\xeb\x31\x98\xb9\x59\xd9\xe5\xf8\x4a\x98\xa4\x77\x99\x34\x6f\x14\x9d\xed\xba\x4d\xbb\x43\x51\x98\x37\xed\x64\xd1\xbb\xdd\xaf\x76\xcf\x67\x97\xb5\x86\x20\x50\x66\x6b\x58\x0f\xd1\x98\xdf\xd8\x51\x26\x78\xed\xcb\x2d\x6e\xb6\xd8\x15\x3c\xf3\xae\x27\x38\x04\xe9\x63\x0d\x93\xa7\x66\xee\x65\x18\xd2\x45\xad\xe3\x27\x9f\x27\x5f\x83\xa4\xf4\x57\x02\x16\x2f\x15\x46\x77\xbd\x48\x18\xd8\xf5\x22\x61\xc1\x6f\x0d\x42\x7e\x89\x32\x74\x78\x1a\x97\x23\x96\x19\x59\xd5\x6a\x1e\x14\x99\xf9\xa6\x36\x63\x1b\xcd\x42\x91\x34\xd1\xd1\x19\xab\xc3\xbf\x41\xb7\x4e\x6c\x57\xa5\xe4\x42\x8d\xa2\x71\x50\x39\x70\x4f\x5c\x84\xf6\x8d\x7e\x1e\x38\x7b\x7f\x07\x05\xf5\x55\xed\xd1\x22\xf4\x7e\x99\x2f\xc0\xeb\x6d\x5b\x60\xef\x15\xf3\xd6\xeb\x4e\x7d\x57\xea\xec\x6b\xd5\x4f\xd2\xcc\xe1\xd3\x38\xbd\xb5\x30\x57\xaf\x1a\x9a\x15\x91\x8e\x79\x8c\xac\x6f\x5d\x5f\x5f\x1a\xfe\x06\x96\x6c\xd0\x2e\xef\xb9\x29\x65\x22\xe4\xfe\x2e\xac\x84\x49\x53\x80\xb3\xa1\x6c\x2a\x7a\xa8\x0a\x23\x58\x82\xc7\x01\x3e\xbd\x88\xb5\x35\xe6\xfe\x13\x7c\x69\x80\xb1\x4e\x85\xb7\xa8\x50\x86\xb3\x76\xc0\x1e\x54\x23\x61\x3f\xd4\xe8\x1b\xc7\x82\x01\xe8\xde\xe1\x58\x61\xc7\x40\x91\xb3\x63\xf9\xa7\x8b\xd3\xb7\x96\xbc\x35\x28\xfd\x88\x16\x65\x7a\x4d\x6a\xaa\xfb\x0e\xf1\xad\xb2\x81\xc1\xf6\x7b\x0a\x9d\x70\x86\xa3\xf5\x35\x6a\xcc\x6c\x38\x55\xdb\x4b\xa8\x8b\x6c\xfa\x1e\x30\x4d\x96\xbd\xfb\x40\xd9\xe9\xd2\xaf\xaa\x79\xa1\x59\x47\x49\x64\xe1\xe6\xd5\xae\x0a\x89\x1b\xc9\x3b\xca\x20\xe3\xa5\x4e\x6d\xf3\x92\xa1\x96\xe9\xbc\x64\xd4\x36\x2f\xf5\x2b\x75\x3a\x6f\xf7\x37\x6b\xc0\x6c\xd3\xdd\x74\x00\x6d\x6b\xd8\x80\xea\x53\xd4\x74\xc0\xf4\x35\x12\x93\xce\x70\xac\xa3\xdc\x95\x46\xd4\x03\xc6\x59\xe4\x16\x89\xc0\x28\xae\x19\xbd\xc1\x9e\x03\x1e\x3d\x55\x8d\x00\x69\x97\xa5\x30\x79\x57\x05\x6b\xcf\xd0\x6d\x0e\x4c\x33\x83\xc2\x70\xef\xcf\x45\x51\x55\x69\x90\xd1\x73\x21\x71\x00\xdf\xfe\xa7\xf0\x44\x60\xef\xd2\x1c\xa0\x84\x04\x84\x58\x02\xbe\x40\xe0\x2d\x00\xe6\xc0\x83\x03\x8e\xbe\xc2\x73\x06\x0c\x35\xba\xd9\x8f\x13\x2c\x25\xd1\x9e\x83\x44\xeb\x75\xf1\x83\xab\xc7\x0e\x0e\x34\x4b\x6e\x4d\xca\x84\x72\x59\x85\xde\x72\xa3\x50\x96\xe6\x33\xc1\x21\xfd\xb9\x28\x29\x23\x53\x7f\x82\x3f\x18\xef\xa5\x5a\xe5\xe1\x7d\xb0\xdf\x15\x35\xf5\xd8\x67\x97\x82\x27\x91\x36\x1e\xee\x1a\xc0\x64\x8b\x45\x49\xaf\x69\x5e\x57\x56\x5a\x73\x99\x2c\xa0\xec\xb3\xbb\xe6\x42\x09\xb3\xe0\xe4\x27\xcc\x52\xc6\x41\x55\x69\x44\xad\x80\x86\x44\x1a\xa3\x82\xb2\xb8\xa9\x68\x59\x59\x84\xf5\x99\x87\x45\x5e\x81\xaf\x4e\x3d\xb2\x4e\x84\xd8\x71\xc3\x26\x37\xcb\x2c\x71\xc3\x72\xc4\xbf\x45\xde\xb2\xdd\xfa\x3d\xac\x05\xc4\x56\xdf\xd6\x20\x24\x8b\x7a\x59\x52\xef\x5e\xdc\x16\x4d\xa5\x13\x42\x77\xb3\xaf\xb7\x82\x2f\x32\x31\xb8\xfe\x7d\x25\x5b\x19\x2e\x0b\xde\xd6\xdd\xd1\x34\x2f\x15\xe0\x9e\x06\xbb\x82\x9b\xd8\xdd\xda\x02\xfc\xda\xb7\xd7\x8a\x8c\x94\xdb\x1b\x14\x37\x39\xc3\xab\x87\x4c\x5b\x54\x92\x24\x79\xc8\x67\xc5\x45\x39\x7f\x57\xfc\x4a\xb2\x14\xae\xb2\x6e\xeb\x9b\x5f\xeb\xdd\x5a\x9d\x15\xc5\xe2\x3e\xf4\x7e\x45\xc0\x27\xcd\xb7\xfe\xe4\x21\xb9\x54\x7a\x4d\x30\x51\xb2\x73\x8c\xdf\x7c\x89\xd8\x69\xfa\x27\xaf\x54\xd1\x83\x58\x1b\x09\x48\x4e\x92\xd8\x69\xad\x90\x89\x7f\x72\x0c\x95\x2f\xfe\x2d\xa4\x99\x2f\xeb\xbf\x89\x66\xf9\xd7\xa7\xad\x58\xdc\x33\x69\x8b\x8c\xac\xaa\x93\x3c\x4b\xf3\xed\x00\x4a\x4a\xa2\xb3\x3c\xdb\xbe\x95\xa4\xb7\xd4\x3d\x0d\xae\x69\x59\xdd\xd7\xa0\xb8\x79\xc0\x6e\x29\x45\xea\xab\xee\x51\xc8\xeb\xab\xb0\x58\xdc\xd3\x49\x45\xc9\x3c\xa3\xd5\xf6\xdd\x23\x11\xe2\x6f\xad\x40\x95\x7e\xa1\x5f\x1f\x3a\x0f\x87\xb2\x6d\xe0\x8c\xb0\x2f\x17\x8b\xa2\xe4\x74\x7c\x51\x16\xd2\x02\x58\xd2\x64\x99\x71\xcb\xab\x25\x9c\x12\x2b\xeb\x3a\x25\xd6\xaf\x87\x70\xb2\x44\x56\x95\x15\x75\x65\x39\x56\x35\x25\x51\x71\x63\x45\xc5\xdc\xe2\x36\x8f\x4a\x4d\xd5\xbd\x03\x5b\xd0\x8c\xe7\x1b\xff\xda\x2e\x3d\x38\xb0\xc0\xa9\x4f\xa9\x12\xe8\xed\x22\x4b\xc3\x94\x49\xcc\x8c\xfd\x13\x9c\x66\xe3\x25\xc1\xce\xd9\x91\xe0\x26\x43\x79\x27\x45\xed\x22\x7a\xbb\xa0\x21\x13\xc3\xc1\xe9\x4a\xf3\xa0\x91\x5e\x58\x63\xd5\xed\x2f\x94\x2e\xd8\x89\x23\x7a\x68\x14\xcf\xf2\x28\x49\xc1\x79\xdc\x50\x59\x53\x98\xc9\xf3\x5f\xdf\xf0\xed\x58\x93\x80\xe7\x1e\xd3\xc0\xa6\x35\x9d\x9f\x33\x94\x61\x2f\xb3\xd6\xec\xbf\xd3\x34\x2c\x0b\xc6\x84\xcb\x15\x19\xa9\x8f\xa7\xd4\x12\x19\x2f\xab\x70\x4a\xe7\x04\x32\x5e\x46\x45\x58\x1d\x24\x15\x64\xe2\x81\x96\x0a\xea\x7d\xb4\xa8\xe3\x90\x07\x73\x5a\xd5\x64\x65\x7c\xe4\xbe\xf1\x95\xf5\x94\xae\xc0\x02\xdc\x10\xa2\x18\x14\xfe\x6d\xcf\x95\xca\x72\x98\x50\xd0\xe3\x3d\x42\xb3\xe2\x86\x63\x07\x01\xc1\xed\xd5\x94\x94\x15\xad\xd5\xac\x84\x19\xa9\x2a\x6e\x5f\x15\x25\xec\xbb\x8e\x8b\x52\x7b\xae\x17\x47\x9f\x97\xe9\xb5\x3e\x93\x2f\x9b\x0f\x01\x9a\xd8\x76\x0a\x51\x28\xd3\xb8\xa3\xb4\xd7\xb2\x99\x65\xee\x02\xc2\xc5\x03\x69\xf7\xe2\x6a\x20\xe5\x9d\x08\xac\x03\x9d\x92\xeb\xb4\x28\x85\x73\x02\x18\x09\xb7\x21\x30\x93\xce\xd8\x60\x7b\x1c\x97\xee\xfa\x66\x63\x97\x3f\xef\x87\xbc\x60\xb7\x33\x39\xbb\xf0\x7b\xb7\x35\x45\xbb\x71\x51\xee\x76\xa6\x69\x97\xfd\xde\x67\x24\xf2\x7a\x57\x1b\x48\xc7\xd3\xe6\x4e\xff\x92\xc6\x17\x05\x82\xc8\x98\xea\x0d\x53\x53\x62\x28\x4a\x34\xf9\x37\x6f\x22\x0b\x34\x6a\xa2\x5d\x78\x6b\xd7\xed\xb3\x23\xbd\x03\x7d\x86\x05\xc1\x4e\x2a\x70\x03\x93\x0c\x60\x5d\x52\x52\x83\x87\x2d\xd7\x2a\x73\x6f\x39\x70\x8e\x63\x9b\xae\xb2\x52\xcd\x48\xf3\x6a\x5a\x16\x73\x3a\xb2\xde\xd2\xda\x62\x74\x7f\xc5\xc4\xb6\xc4\xe2\x61\xc6\xb8\x8f\x37\x5b\x3f\x3e\xfc\x06\x71\x49\x25\x5c\x93\x46\x0d\x28\x36\x73\x95\x77\x70\x90\xa4\xf5\x74\x19\x8c\xc2\x62\x7e\x10\x0b\xbf\xfd\x03\x30\x15\x1c\xa4\x55\xb5\xa4\xd5\xc1\xf3\xc7\xdf\x3e\xf9\x1f\xf0\x3b\x2c\xe6\x6c\xa0\xfb\x8f\x9f\x3c\x1b\x3f\x7f\xfa\xe4\xf1\x33\x6d\xc6\x60\x46\x18\x3f\x0c\xde\xf4\xea\xd2\xc4\x7a\xcd\xe7\xca\x08\x73\x27\x27\x0a\xe4\x6f\xd0\xb9\xe8\x53\x0c\xed\x0d\xe5\xb7\x68\x8f\xac\xdd\x5d\x6b\x4f\x2c\x97\x9a\x64\x4b\xc4\x72\x12\x43\x80\x00\xac\x69\xbd\xb2\x86\x43\x6b\xc7\x28\x19\x05\x24\x3a\x61\xf3\xcf\xaa\xa0\xc6\xb8\xcb\x32\x22\x86\x77\x3a\xfb\x0a\xd6\x48\x1f\x19\xd8\x03\xf3\xdd\x5a\x4e\x35\xc9\x75\xbf\x3f\xd0\x93\x31\x76\x01\xc2\x54\x53\x7e\xf1\x23\x20\x91\xfe\x3a\xac\xff\x48\x2c\x23\x77\x8c\x0e\x33\x4a\xca\x66\xd5\x46\xd6\xcb\x28\x4a\x19\x0c\x92\x65\x2b\x64\x45\xac\x43\x1d\x04\xd7\x1d\x50\xc6\xfd\x0b\x6c\x6a\xbc\x57\x80\x8f\x47\x8d\xfe\x54\x76\x34\x4f\x93\xa9\x01\x84\x51\x80\x85\x55\xc4\xb1\x55\x97\x24\xcd\x18\x0e\x45\x34\x4c\xe7\x24\xb3\xc0\xe3\xbb\x02\x69\xab\x91\x25\x96\x15\x2d\x77\x2b\x1d\x42\xb8\x2c\x2b\x76\x9c\x82\x4e\xbb\x00\xf1\xe4\xaf\xe5\x7c\x21\xc5\x94\x80\x26\x69\x0e\x17\x1a\x84\x69\x83\x7f\xb9\x06\x41\x07\x76\x92\x2b\x07\x6b\x58\x21\xc4\x24\x13\xf8\x22\x92\x5b\x45\xfe\x63\xb6\x2c\x2d\x10\x8e\xf8\xb7\xc2\xbc\xd5\x65\x9a\x24\xb4\xd4\xc1\x80\x04\xaa\x76\x37\x49\x48\x9a\x73\xc5\x35\xcc\x0b\x5c\x38\x29\x2a\x6d\x10\x7f\x13\xd3\x5a\x16\xce\xfb\x04\x6e\xb8\x3c\xf1\x20\x91\x1b\xc0\xbc\x93\x2e\xde\xb7\x90\x11\x91\x93\xb5\xbe\xec\xcf\xac\x1a\xa8\xe0\xed\x3c\xeb\x6d\xf6\xcf\xd3\xb7\x3c\xf7\xb5\xf2\x88\xdc\x1d\x68\xda\xf2\xc6\xb5\x5f\x2a\xad\x98\xf8\x77\xfe\xeb\x1b\x43\x96\x67\x73\x9c\x53\xc6\xff\x34\x42\x6a\x9a\x27\x08\x74\x52\x02\x2e\x7b\xb6\x8a\x52\x1d\x22\x82\xe4\xc0\xc6\xd0\xd5\x53\xff\xbe\xbe\xe0\xd1\x7f\x42\x5b\xf0\xa8\xa3\x2b\x80\xd1\xb1\x2f\xd7\x0e\xd8\xb7\x69\x55\x83\x05\x45\x12\x47\x6d\x66\x2f\x3e\x1c\x9c\xff\xfa\xe6\x80\xd4\x35\xa4\x46\x14\x4c\xc9\x23\xeb\xfc\xf4\xe4\xad\x75\xbe\xa0\xe1\x3d\x2f\x56\xf3\x34\x1b\xe8\xb6\x60\xb6\xde\x97\x70\x12\xe6\xf5\xfe\x14\xf2\xbe\x32\xa4\x23\x99\x98\xbd\xfd\x80\x54\x94\x09\x0e\x50\x5a\x92\x20\x0d\x21\xcf\x21\x7b\x94\x55\xfb\xd5\x34\x8d\xe1\xb5\x90\x2c\x34\x20\x61\x96\x2e\xf6\x17\xa4\x9e\xaa\x87\x72\x99\x01\x20\x9e\x83\x11\x74\x91\x8b\x22\x03\x42\xb5\xa5\x78\x3f\x4e\xb3\x9a\x96\x55\x53\x2d\x32\x37\x36\x05\xca\x34\xcb\x8a\xa2\x62\x9e\xe6\xa4\x35\x6e\x6e\x0a\xdf\x0f\x48\x38\x4b\xca\x62\x99\x47\xac\x30\x4e\xb3\x6c\x5f\xe4\xb7\x55\xcf\x72\x80\x90\xa1\x76\x1f\xe0\x37\x8f\x7a\x63\x9e\xdc\x71\x9e\x66\xcd\x23\x93\x11\x8c\x87\x7d\x12\xfd\xb5\xac\xea\xa6\xac\x2e\x69\x1d\x4e\xb5\xe7\x55\xd6\xbc\x21\x3c\x88\xd4\xf3\x8d\x9a\x47\xc8\x15\x09\x59\x24\x9b\xa7\xa2\x4c\x69\x2e\x92\x5b\x4e\x8b\x32\xfd\x52\xe4\x35\xc9\xfa\xeb\xaf\x69\x59\xa7\x21\xaf\x85\xb6\xfb\x24\xba\xde\xbf\x6d\x1e\x8b\x32\x4d\xd2\x9c\x97\x40\x84\x76\x73\x4e\x33\x5a\xd7\xb4\xdc\x17\x9b\x0d\x4a\xd8\xd0\xd2\x3c\x69\x66\x68\x4e\xca\x19\x2d\xf7\x29\x9f\x5b\xf1\x34\x4f\xf5\x27\x90\x8e\xd8\x33\x78\x3c\x31\xbc\x91\x34\xdb\x28\xac\xa7\x69\x38\xcb\x69\x05\x4b\xbe\x20\x69\x5e\xef\x43\xea\x61\xfe\x98\x17\x15\xdd\x3f\x84\xdf\x05\x20\xca\x3e\xd7\x55\xb1\x12\x35\x68\x40\x21\x3e\x95\xd5\x94\x2c\x5a\x9f\x53\xd5\xc5\xa2\x19\x38\x3c\x69\x2b\xcb\x0e\xa4\x19\x15\x79\x09\x8d\x11\x9a\x35\xc6\x30\x79\x96\xe1\xfd\x48\xa6\x2c\x6e\x95\xf1\xd8\x80\x5a\x21\xfb\xd0\x90\x2c\x5a\x25\x7f\x15\x69\xae\x15\xcd\x55\x66\x63\xad\xd0\x1c\x29\x2b\xb9\x49\x23\xbe\xc3\x6a\x7a\x5b\xef\xf3\xf0\x8a\xea\x31\xa2\x61\x51\xaa\xfd\x05\x45\xc6\x5c\xc0\x75\xc7\xce\x5a\x34\xa5\xc6\x57\x2e\xf3\x34\x2c\x22\xba\x1f\xa4\x51\xaa\x3f\x43\xdc\x47\x51\x50\x57\xfb\x0b\xb6\x28\x40\x20\xae\xf7\x49\xb6\x98\x92\x80\xd6\x69\xc8\x9f\xa7\x24\x4f\x44\xd7\xd7\xfb\x69\x44\x8b\xa4\x24\x8b\xa9\xac\x9d\x13\x46\x6b\x89\x42\xd6\x6b\xb8\x4b\xb9\x4f\xe3\x98\x86\x35\x2f\x28\x6b\x40\xde\x95\x7a\xd2\x71\x57\x2f\x80\x16\x37\x45\x19\xe9\x78\x7b\x53\x42\x6e\xc2\xfd\x79\x11\xc1\x80\x6f\x35\x6a\xc5\x4f\x3c\x12\xd6\x4b\x52\x53\xad\xa0\x0c\xcb\x22\xd3\x0a\xa6\x25\x8d\x9b\x27\xb3\xae\x9a\x16\x37\xcd\x53\x9d\xd6\x7a\x25\xe3\x49\xe1\x69\x9e\x79\x8c\x3a\x89\xdf\x79\xe5\x89\xd3\x94\x57\x65\x84\x8f\x95\xfd\xe6\xe7\xe6\x95\x38\xe3\xcf\x7f\x7d\xb3\x4d\x1f\xde\xa3\x6e\x5e\xd6\xc5\x07\xae\x91\xd9\x2e\x32\x7d\x73\xc8\x05\x19\xe9\x3a\xf2\x81\xf2\xeb\xaa\xd5\x07\x43\xd9\x73\xdf\xab\x0b\x61\xaa\x79\xc9\x56\xfa\xbe\xe6\x5f\x17\xcf\xf4\x11\xef\x6a\x4f\xbb\x5f\x1d\xe4\xee\xd6\xba\xdd\xde\x51\xee\x1a\xcf\xbb\x5b\x87\x26\xee\x91\xf0\xf1\xc1\x2a\xbd\xe4\xf8\xe1\x59\xef\xce\x47\x50\x80\xb4\x3a\x8e\x2a\xbd\x75\x3f\x95\x34\xee\xad\xf8\xb0\xed\x8d\xf3\x69\x71\xd3\x5b\x71\xc1\xd0\xaa\xbf\x66\xb5\xe8\x56\xcc\xb3\x1f\x49\x25\x8a\xe7\x99\x2a\x7c\x4b\xf2\xa4\x53\x78\xce\x3d\xb2\x79\xa9\xc1\x5f\xbe\x7a\x79\x7a\xf4\xf6\xe4\xf7\x23\x0b\x5b\x07\x97\x7f\xec\xff\xe1\x5d\x39\x97\x64\xff\xcb\x95\x7b\x90\xc8\x2b\xa1\x8b\xb4\x86\x2b\x27\x16\xd6\x04\xdb\xba\x98\xd1\xdc\x30\xcf\x41\xc9\xe5\xe1\x95\x99\x22\xdd\x87\x9e\x80\x23\xe9\xe4\x57\xb7\x1c\xbe\xa7\x49\xd6\xc4\x04\x00\xc1\x50\xf8\x94\xca\xda\x91\xb8\x25\xea\xc8\xc1\x22\x6d\x54\x2e\x78\xa8\xf6\x6d\x21\xed\x8a\xc6\xa5\x02\x7b\x65\x61\x6b\xec\x6f\x7b\xa3\xeb\x08\x6b\xbc\x28\x07\xe4\x0f\x36\xac\xdb\x86\xfd\xde\x76\x63\xa1\xd7\xd4\xe5\xfa\x0f\x78\xb3\x6f\x78\xae\x7e\x2d\x1c\x92\xac\x7c\xac\xd3\xac\x6a\x4c\x67\x1f\xc5\x65\x59\x08\xfe\x02\x92\x7e\x3a\x5f\x66\x4c\x96\x23\x56\x5d\xae\xf6\x21\xfc\x36\x93\x4e\x3e\x85\x64\x99\x4c\x39\x8c\xc6\x51\xff\xd3\x94\x54\xaf\xf4\x0a\xee\xf4\x3c\x30\x81\x73\x31\x89\x5f\xc0\x05\x8f\x54\x6e\x8a\x39\x28\xe1\x08\xe5\xea\x1d\x88\xc6\xc7\xef\xeb\x42\x77\xa2\xae\xa7\xbf\x0f\x46\x4d\xd3\xa1\x9a\x21\xb9\x4b\x79\x41\xf3\xd5\xba\x96\x45\xde\xe8\x68\x6a\xb5\x6b\x28\xd2\xc7\xa4\xdb\x68\x94\xe6\xd7\xc5\x8c\xbe\x59\x92\x32\x6a\xa2\xbd\xb5\xc2\x3f\xf4\xba\x81\xef\x9e\x08\x60\x56\x2f\x08\xc7\x6d\x5c\xe0\xd4\x30\xcd\x8b\xbd\x42\xaf\xd1\x3f\x80\x07\x8f\x55\xf3\x89\x35\xef\x45\xb2\x06\x5a\xdf\xd6\xcd\x34\xcd\xa8\x95\xb0\xb7\x41\x76\x61\x92\xab\x5c\x21\x25\xdf\x2f\x16\x34\x57\x96\xfa\xb4\x16\xf7\xd2\x44\x5e\x72\x26\x28\xf3\x0b\xd8\x69\x6c\xa5\xb5\xb8\x2d\xad\xab\x02\xe0\xbe\xe2\xa0\xb9\xf3\x75\x02\x5e\x1c\x22\xe4\x01\xe2\xd2\x18\xfb\xff\x7c\xc1\x35\x20\x70\xad\x0d\x46\xa3\x21\x27\xc4\x22\x29\x29\xa9\xd8\xa0\x69\xa3\x9c\x78\x04\x57\xe0\xb4\x96\x22\x24\x43\xb6\xb2\x20\x18\x83\x90\xdb\xb9\x37\x7e\x75\x43\x16\x16\x77\x13\x53\x5a\x56\x0e\x44\x75\xce\x95\x28\x69\x6e\xbd\x3e\xfa\x95\x89\x78\xb4\xef\xb6\xda\xb9\xe6\xe5\x20\xd5\x0c\x30\x87\x0c\xef\x97\x15\xd7\x52\x67\x45\x92\x80\x1a\xa2\xb4\x22\x1a\x2c\xe1\xc1\x04\x23\x03\x1e\x6c\x60\x3d\xe0\x0b\x9b\x54\x30\x85\x40\x02\xf3\x95\x47\x1b\x65\x1b\xbe\xe0\x17\xe3\xe0\xb7\xe8\x16\x54\x0e\x21\xc9\x32\xe9\x7a\x2d\xc1\x99\x40\x46\xa3\xd1\xa3\x8d\x45\xca\xa4\xb2\x5e\xca\x88\x78\x5c\x55\xae\x37\xe7\xb7\xea\x7a\x90\xcb\xd0\x63\x82\x83\x1a\x7b\x46\x72\x30\xc8\x22\xc8\x0a\x90\x15\x22\x2b\x42\x16\xab\x75\xd5\x56\xed\x81\x36\x22\x8b\x45\xb6\x72\x5a\xb4\x0b\x59\x2a\x56\x1f\xa8\x41\x5a\x68\x7c\xce\x26\x9e\x54\xfd\x10\xf9\xe5\x09\xcd\xc1\x95\x1f\x44\x5c\x36\xe7\xb8\x8a\x18\xa6\x42\x62\x97\x6a\x20\xef\xc9\xa6\xb9\x45\xac\x24\x2b\x02\x92\x31\xbc\x49\x6b\xe9\xb6\x28\x88\x54\xce\x88\xdc\x9f\xe2\x41\x23\x87\x7f\x5a\x8c\x92\x96\x62\x57\x5c\x9c\xbd\x3e\xf3\xc0\xaa\x90\xc6\x06\x39\x05\xbd\x80\x41\xf0\x94\x5b\x64\x0e\xca\xf3\xff\x87\x68\xed\x85\x7c\x99\x47\xaf\xd8\x96\x86\x60\xaf\xf2\x24\xf8\xd7\x50\xaf\x85\x5e\xfd\x54\x53\xa0\x22\x23\x48\x6d\xfc\xe3\xaa\xe6\x36\x14\xf3\x5c\x74\xb4\xdb\x20\x10\xc2\x03\x16\x19\x77\xfa\x06\xbd\xab\xf1\x9e\xaf\xa9\xb3\x77\xda\xcd\xdb\xa7\xa1\xae\x17\xfe\x5a\x5b\x0b\x6b\x3e\x89\xbd\x2f\x94\x66\x6b\x18\x73\x8f\xde\xd1\xdc\x7e\xaf\x97\x60\xc6\xa1\x32\x22\x0c\x43\xcd\x84\xcf\xa5\x5a\xa0\x8a\x11\x5d\xae\x67\xe6\x8c\x40\x9b\x01\xe0\x37\x47\x38\x40\xd9\x54\xf1\x0a\x05\xdb\x18\x53\x92\x47\x59\x13\xae\xa3\x2e\x16\x56\x46\xaf\x69\x26\xde\xe7\xd5\x65\x73\x07\xb8\xbb\x37\x75\x7c\x69\x39\x12\x76\x1b\xff\x1d\x4a\xd4\xe1\x88\xb6\x75\xd3\xb7\x42\xda\x9b\x0d\xc4\x36\x56\xf4\xc1\xec\xc3\xc1\x16\xc0\x87\xa1\xa0\x4e\x98\xe4\x6a\xdf\xd7\xc6\xc2\xc2\x69\x74\x3b\xda\xbd\x32\x5a\x2b\x7f\x56\x6d\x2a\x34\xdc\x12\xb6\x93\xbb\x86\xdd\x69\xf1\x51\xed\xd9\x80\x98\x2a\x8c\xe0\x30\x74\x80\xab\x71\x12\x89\xa0\x1c\x10\x2c\x12\xb7\x99\x04\x37\x52\x59\x59\x3a\xa3\xd9\x8a\x1b\x13\x00\x8b\x88\x15\x2c\x21\xe5\x9d\x88\xc7\xf2\x3e\xa3\x84\x11\x51\xc6\x03\x91\xdc\x02\x53\xd3\x48\x9a\xd1\x4c\x7d\xfb\x36\x8e\xec\x5f\xa2\x47\x7f\x63\xfe\x1e\xb8\x2a\x10\x5c\x68\x99\x87\x2f\x19\xad\xc5\xd6\xcb\xb2\x24\x2b\x2d\x26\x2c\x78\xa8\x8e\xd8\xfc\x39\x0a\x9b\x91\xf5\x04\xbe\xb4\x2e\x57\x62\x21\x18\x00\xb1\x09\xd4\x07\x48\xa0\x1c\xf7\x2d\xce\x62\x39\x54\x47\xb5\xaf\x0c\x51\x5b\xf6\xaf\x7f\x77\xe3\x35\xcc\x26\x5e\x88\x2f\x27\x0d\x37\x06\xf6\x19\xc5\xc6\xf5\x2f\x0a\x3b\x60\x1a\x37\x37\x11\xcc\x52\x7a\xff\x91\x9a\x7b\xc7\x58\xf3\xa2\xa4\x56\x9e\x86\x0c\x43\x54\x70\x0f\xe1\xb9\xb6\x5b\x59\x32\x6a\x26\x67\x3c\xd3\x88\x12\x86\x51\x75\xa1\x34\x0b\x1c\xa0\xfd\x1e\x2c\x55\x45\x6e\xd1\xdb\x90\x82\x07\x52\x65\x2b\x2b\xf6\xc8\xfa\x51\x58\xf9\xb9\xbf\xc4\x4d\x49\x16\x70\xdb\x0e\xcc\x5a\xfb\x8b\xb2\xb8\x4e\x23\x1a\x0d\x0c\x07\x71\xc6\xd5\x6c\x63\x6c\x18\x0f\x21\x6e\x56\x08\xfe\x59\x7e\x9f\x55\xc4\x03\x61\xe8\xeb\x9b\x93\x65\x05\x81\x4d\x14\x97\x8c\xd4\x28\xb4\x81\x83\xbf\x1e\x58\x85\xe5\x98\xd8\x0e\xb2\xf8\x72\x6a\xed\x9a\x71\xc8\x59\x12\x41\x46\x16\xf0\xad\xcb\x3c\xa3\x15\xbf\x4d\x28\x02\xb8\x81\xb1\x8c\x4d\x3f\xc4\x57\x81\x90\x4d\xb7\x75\x49\xac\xaa\xa6\x0b\x76\x76\x80\xbe\x1e\x2e\xbe\xcb\xd9\xec\xf4\x39\x92\x16\x24\x0e\x69\x99\xd7\x69\x5e\x2f\xc1\x27\x84\x89\x10\xc5\x32\x99\x22\xe5\x53\xc1\x44\x51\x51\x28\x66\x7e\x0a\x64\x02\x60\xaa\x88\x51\x08\x9c\x1d\x1b\xb7\x50\x35\xd8\xdd\xca\x5a\xd0\x92\x21\x90\x04\x4f\x1b\xa2\xb2\xcc\x39\x9c\xd1\x40\xd8\x12\x0f\x0e\xac\x8b\x06\x2d\xc4\xd7\x2d\xb8\x14\x78\x3f\x7a\x20\x25\xc9\x70\x21\x46\x0c\x45\x49\x32\x5c\x0a\x51\x4e\x93\x1c\xf7\x57\x79\x38\x2d\x8b\x1c\x42\x2f\x59\x51\x5a\x2d\xa0\x29\xb1\x62\x32\xa3\xd2\x54\x59\x88\x67\x0e\x50\xde\x36\x43\xc2\xb4\x9a\x65\xca\xb2\xaa\x50\x10\x8a\xf9\xee\x29\x8b\x39\x63\x9e\xd3\x08\x68\x22\x87\x28\x8e\xda\x81\xba\xaf\x09\x1b\xa9\xe9\x72\x24\xdd\xba\x15\x18\x29\x06\x1a\x73\x67\x4b\x4a\x6d\x73\x09\x8f\xc3\x53\x5c\xb7\xd1\xd7\xc8\xfa\x71\x69\x78\xc9\xa8\x53\x9f\x8b\xa3\xc0\xae\xeb\x52\xdc\xc1\xc1\xff\xc7\xde\xdf\x77\xb7\x71\x23\xf9\xe2\xf8\xdf\xf1\xab\x80\x3d\x59\x93\x4a\x28\xca\x4e\x76\x67\x27\xd4\x68\x7c\xf5\xe4\x44\x37\xb1\xe5\x6b\x2b\xe3\xdd\xeb\xf5\x11\x41\x36\x48\xf6\xa8\xd9\xe0\x34\x9a\xa2\x39\x13\xbf\xf7\xdf\x41\x55\x01\x28\xa0\xbb\x29\xd9\x49\x7e\xf7\x9c\xfd\x6e\xfe\x88\xc5\x6e\xa0\x1a\x8f\x85\x42\x3d\x7c\x8a\x08\x14\x5a\xaf\x02\x07\xce\x6b\x91\x69\xc2\x4d\x01\x03\x42\xb5\x5e\xd5\x0c\x33\xc5\xee\xa5\xb9\x95\x56\x67\x85\xde\xe0\xa4\x8a\x73\x50\x40\xe7\xb7\xaa\xd8\xd2\xfd\x74\x9e\xdf\x2a\x23\xd6\x86\xcd\x8e\x9b\xc5\x10\x7b\x34\xad\x11\xde\x8c\xf5\x8d\x5d\x60\x5f\x2a\x59\x3f\x24\x9d\x09\xb8\x66\xe1\x20\x32\xb6\xe3\x9c\x93\x70\x8b\x1c\xbf\xba\x00\x19\x0a\xec\xa1\x56\x4a\x77\x57\x54\xa1\xd7\x95\x63\x6f\x34\xc3\xe7\x7f\x65\x7c\xa0\x9d\x05\x50\x68\x05\x29\x3d\x10\x01\x13\x3d\x26\x42\x1c\x0c\x43\x9a\xa4\x44\x54\x6e\x81\x01\xe2\x5e\x0a\x80\x19\x4a\x3b\x04\xce\x1d\x04\x93\xbc\x4d\x6d\x04\x39\x1e\x8b\x5d\x5b\x04\x94\x97\xd6\xc4\x51\xe8\xf7\x40\x05\xd7\xdb\xa3\x48\xf4\xce\x43\xfa\x4c\xdd\x7e\xee\x39\x2d\x82\xa7\x9a\x9d\x79\xbb\xae\xed\xd0\xb0\x10\xb7\x8e\x4d\x54\x2f\x2a\xb5\xf1\xb7\xcd\xa1\x78\xab\x02\x35\x84\xc3\xc1\xc3\xc4\x1e\x77\xc2\x2d\x02\xe7\xb8\x00\x9b\x06\x63\xf0\xf2\xda\xc7\xba\x09\xc4\xbc\xa4\x58\x4c\xef\x0c\xd1\x72\x07\xf3\x9b\xd1\xf7\x19\xd5\x39\x03\x31\xce\xf2\x8c\xee\xac\x20\x6e\x97\xea\x56\x55\x10\xa6\x18\x35\x8e\xbe\x48\x2c\xd7\xd4\x95\xac\xd5\x7c\x2b\x36\xba\xba\x31\xc8\x5b\xf3\x59\xb4\x6e\x73\x23\x66\x85\xbc\xd9\x5a\x06\x13\x68\xcd\x64\x5e\x60\x6c\xba\x65\x39\x76\xd1\xba\x7d\xce\xc5\xf7\x01\xf7\xf7\xb3\x3b\xd5\xb2\xc3\xca\x9e\xca\x3c\x46\x3c\xec\x7f\xdc\xe3\xb2\xb6\x07\xd8\x90\x89\xba\xae\x6b\x5e\x88\x60\xbe\x4b\xb0\x6e\x1a\xdc\x0c\x18\x99\x6d\x16\xe7\x63\x6f\xe9\x26\x12\xf1\xd9\x40\xca\x33\xdc\xb8\x1e\x29\xac\xc6\xd1\x76\x19\x03\xe7\xb6\x7c\xd4\xb6\xde\x77\x77\xa3\xe2\xe9\xdb\xb1\x8e\x78\xff\x3e\x53\xba\x73\x72\x1d\xc2\x88\xc9\xa2\x60\xba\xc8\xc8\xbf\xe8\xad\x12\xf9\x72\xa9\xb2\x5c\xd6\x0a\x20\x1a\x97\x9a\x4e\xb3\xf8\x68\x20\x1e\x4b\xe0\x9b\x5e\xc5\xc6\x49\x95\xca\xd8\xc3\x6f\xdc\xba\x1d\xc7\x40\xcf\x88\x4c\x03\x4b\x9e\x16\xd2\x2c\x86\xe2\xd2\x69\x0b\x07\x70\x0c\xa6\xa4\x60\x9c\x36\x10\xaa\x4a\xde\x37\xb8\xc0\xc3\x04\xd0\xf0\x1a\xf0\x2c\x29\xb7\x58\x63\x91\xcf\x17\xb1\xa3\x0e\x39\x28\x9a\x9a\x8d\xae\xf0\xcc\x86\x1c\xeb\x22\x78\xd1\xbe\xba\xad\x21\x5d\x65\x34\x7a\x03\xf2\x1e\x0b\x37\xeb\x3b\x85\x67\xfc\x8f\x2d\xd3\xe8\x8e\xf4\xb1\x65\xbd\xc6\xfb\x25\x39\x1d\xdf\x2a\x02\xff\xca\x0d\xd3\xb6\x07\x77\x2e\xbe\x77\x64\x0d\xf7\x24\x54\x63\x0d\xc5\x45\x6d\x25\x1c\xf2\x6a\x71\xa7\x90\xbf\x38\xb9\xdd\x01\xdb\x60\x96\x57\x0a\x44\xe5\x88\x5c\x29\x74\x39\x55\x87\xb0\x81\xd4\x07\x69\x0f\xa6\x81\xe5\x09\xa5\x2e\xf7\x9d\x67\xb0\x15\x1f\x0a\xa3\x69\xb6\x93\x9d\x11\xa8\x59\x91\x44\x46\x3b\x12\xda\xe3\x7c\xae\x00\x79\xd3\xf6\x95\x07\x2a\x9b\x1c\x03\x4f\x6a\x2d\x96\x1a\x9c\x89\x78\xeb\xb4\x21\xff\xc5\x21\xe0\xc4\xda\x76\xd9\xcd\xda\x32\x88\xd0\x3b\xba\x09\xf8\x5e\x0d\x1c\x14\x1f\xd2\x2b\xa4\xd7\x57\x60\x5d\x80\xcb\x00\x5c\x50\x7b\xab\x6c\x0a\x3e\x5e\x0a\x00\xa9\x03\x05\xcd\x40\x6e\xa3\x00\x82\x30\x1c\xfd\x6d\xf4\x3d\x36\xe9\xb4\x16\xba\x54\x9c\x43\xf6\x40\x90\x09\xf4\xfc\x2c\xc2\xa5\xa7\xe4\x5e\x99\xb5\x46\x47\x36\x14\x98\xd0\x39\x77\xa2\xea\x8d\x52\x25\x0c\xc8\x34\x08\x06\x44\x0c\x9a\xe1\x5c\x98\xb0\x11\x19\xad\x0f\x44\x3d\xc4\xa6\x25\x73\x89\x5b\x0d\x9c\x90\x1d\x4c\x5c\xe0\xd9\x7e\x58\x1c\x67\x27\xc9\x7b\xb2\xae\x1b\x3c\xdd\x2e\x51\x3b\x23\x28\xe8\xe2\x30\xe9\x40\x2e\x9f\x97\x76\xa2\xf2\x20\x14\xa6\xc7\xd9\x44\x91\xa1\xa8\x0b\x29\x2e\xd1\x8a\xc4\x36\x17\x34\x65\xb1\xa3\xd9\x36\x9b\x9f\xf5\xc9\x2c\xc1\xd9\x89\x2a\x89\xe4\x1c\x7a\xa3\xda\xf5\x20\x88\xcd\x7f\x5a\x69\x63\x2e\xc1\x62\x98\x94\x4a\xd9\xb5\xc6\x02\x7d\xf8\x24\x67\xd7\xae\x03\x78\x66\x45\x3a\x3b\x91\x34\x20\x56\xff\x59\x09\x90\x2a\x93\x8b\xb1\x95\xd0\x90\xcc\x54\x17\xa5\x86\xe7\x4f\xc2\xc3\x22\x2f\x95\x7b\xca\x5b\x20\xda\x3b\x12\x7f\xed\xe3\x2e\xde\xc6\xef\x2b\xf6\x10\xe3\xf3\x83\x1c\x57\x1c\x09\x94\xf1\xf6\x7b\xe2\x6b\x94\xdb\xc4\x33\x54\x85\x8f\x44\x0f\x0f\x17\xd2\x3a\xba\x65\xe6\xa5\x41\xe7\xc0\x2e\xe9\xa8\x8e\x0f\x09\x2a\x42\x32\xae\xcc\xb2\x98\xe3\xf7\x60\x88\x7a\x03\x37\x01\xe1\x20\x75\xe7\x44\xa3\xca\x1d\x87\x44\x68\xd3\x9b\xf6\xfb\x5b\x2a\x86\x10\x57\x89\xc5\x02\xae\x35\x67\x3b\xd6\xc0\x25\x87\xbb\xa6\x76\x0a\x5b\xc9\x28\xb7\x08\xd7\xb7\x20\x5a\xc3\x3f\xc1\x9f\x5c\xdd\xd6\xc3\xbc\xcc\x6b\x7c\xeb\xfb\x4a\x9b\x2d\x3e\x09\xfd\x18\x45\x5c\xc2\x56\xda\x8b\x50\xaa\xdc\xde\xe5\xab\x0a\xf4\xdf\x6c\xfd\xc6\x2b\x0e\x23\x2c\x02\x4b\x81\x9e\x59\x6e\xd1\xc6\x4c\x50\xb4\x05\x76\x32\x64\x34\xdc\xce\x29\xd5\x46\xe0\xe6\xea\x1d\x97\x4c\x95\x48\x96\x1e\xba\xff\x12\x74\x17\xe0\xac\x86\x58\x17\xfc\x20\x9e\x73\x76\x65\x3e\x72\xbc\x0d\x58\xd6\xc6\xb2\xcb\x1c\xb8\x99\xd7\x59\x38\x4d\x24\xf9\xd9\x3b\xb1\xf9\x91\xf8\x5a\xf4\xac\xe0\x9c\x97\xca\x18\x17\x54\x03\xe7\x46\x5e\x1b\x31\x51\x84\xc2\xc4\x55\x0b\x41\xa3\x60\x3f\xdd\x6b\x53\x2b\x38\x43\x91\x53\xce\x38\x8c\x26\x0a\xe8\x32\xe8\xe7\x0f\x2d\x3f\x3b\xff\x2b\xf8\x46\x09\x5d\x16\x5b\xbb\x7a\xa6\x37\xa6\x43\x3e\x50\xc6\xe9\x2a\xec\x3d\xc0\x1e\x26\xd0\x7c\x18\x1b\xea\xd0\x50\x5c\x55\x5b\xb7\x06\xdd\xad\x84\x2e\xff\xdc\xe6\x4b\x9a\x3c\xe8\x80\xae\x08\xf3\x81\x40\x1b\x25\xbc\xac\xca\x40\x13\x81\x6e\x85\x59\x83\x42\x86\x89\x2b\xb9\x41\x12\xfe\xc4\x75\x2a\x5c\xd4\xe7\xc1\x68\x0e\xc4\x6a\x97\x8e\x57\xc4\x7e\xfc\x4d\x9e\x16\xaf\xc0\xe6\xea\x79\x74\x2c\xa6\xb6\x0a\x79\xa1\x35\x56\x12\x9f\x54\x3b\x76\xe8\x5a\x0e\xf0\x37\xb6\xb7\x30\x84\x10\x5f\x05\x7d\xa0\xea\x3e\xad\x84\xe0\x09\x10\xb0\xb3\x2e\x5e\xc9\x8c\x0e\x0e\x66\x93\xe1\x52\x61\xc8\xc4\x3e\xb4\x82\x5c\xe1\x90\x0a\x60\x81\xc1\x89\x59\xce\x74\xb5\x94\xe4\x6b\xd0\x64\xcf\x9f\xa2\x97\xed\x28\xdf\xa9\xf1\x6d\xa8\xfa\x3f\xd9\x78\xf0\x49\x86\x09\x7e\xd2\x20\x80\x0c\xe3\xfe\xfe\xce\x12\xb3\xff\x36\x99\xbf\xe3\x04\x70\x58\xa7\xdd\xee\x19\xed\xfa\x07\x0f\xec\x81\x9e\x4c\xa9\xe1\x29\x52\x4f\x04\x90\x8d\xfb\x1a\x02\x77\x1a\x7a\xb8\x7d\xaf\x43\x09\x9f\x98\x00\xc3\x78\xde\xc3\xba\xc8\xa6\x0a\x2d\x77\x7e\xee\x3f\x72\xef\x7f\x74\x8b\x01\x20\x1c\xf0\xed\xa5\xf0\x0c\x9c\x97\x15\xe4\xc8\x32\x01\x72\x47\x85\xcc\x59\x97\xb6\xb4\x6f\x54\x0b\xb9\x65\x04\xaa\xee\x40\xd3\x39\x61\x72\xd4\x67\xf4\xa1\xd8\x95\xc6\x2f\xa4\xb0\x3e\xaf\x95\xe5\xf4\x14\x8e\xa0\x1c\x0d\x08\x5a\x08\x90\x76\xce\x0f\xc7\xb5\x1d\x24\x66\x2a\xea\x3a\xd8\x02\x93\xc1\x40\x2d\x2a\xf7\x19\xd6\xcf\xbc\x9c\xb3\xe9\x7f\x98\x0e\x83\x9b\x6f\x7b\x59\x97\x79\x0d\x3a\xf0\xc2\xf2\xb4\x71\x5a\x12\x62\x9f\x3d\x9c\x2d\x33\x47\x3a\x44\x93\x00\xd6\x0b\x95\x1c\x5c\x6f\x3c\x30\x7c\x7d\x61\xb9\x17\x18\xf2\x70\x94\x14\x7c\x17\xa8\xbc\x3f\x4c\xaa\x40\x7c\xa6\x13\x55\x59\x13\x87\x10\xcb\x70\x39\xeb\x87\xba\xb4\xc9\x1e\xf6\x79\xcd\xbf\x88\xfd\x76\xc4\xcd\x5e\x5b\x7e\x35\x71\x2a\x4b\x54\xf4\x02\x07\x8d\xd6\x17\x9e\x1c\xa4\x76\x50\x1f\xec\x84\x92\x36\x20\x99\xb8\x81\x18\xff\x8b\x19\x0f\x7b\x03\x36\x3a\xa9\x8b\x16\xa0\xd4\x44\xbd\x87\xe6\xbe\x0f\xe7\xc5\x54\x97\x75\x5e\x3a\xae\x89\xbc\xf6\x21\x1f\xc6\x21\xd8\x40\xa6\x28\x54\x99\xfb\x77\xf1\x3c\xea\x14\xf8\x93\x05\xd5\x30\xac\x06\x4e\x77\x4c\xd1\x9a\x28\xb4\xd8\x8e\x79\x75\xf8\xee\x1e\xb6\xf5\x4e\x1c\x45\x0b\x81\xcd\xf5\x7a\x52\xe4\x66\xa1\x32\xea\x4c\x5c\x6e\x08\xf3\x00\xc9\x49\xb0\x8a\x5f\x7e\xf0\xc2\xad\xbe\x84\x08\x73\xd5\xa3\x37\xf0\xfc\xb9\xae\x70\x44\xfa\x49\xf9\x77\x9e\xd8\xfb\x41\xf4\xf9\x41\xf8\xcc\x27\xac\xa4\xe7\x32\x2f\x50\xf1\x4e\xdf\xa1\xd5\x04\x43\x08\xf1\xdc\xb8\x6a\xdc\x5a\xf1\xdf\xd8\x35\xa8\x1f\xdd\x41\x40\xcc\xe6\x15\x75\xc1\x04\xe5\xa4\x73\x59\x0b\xfe\x47\x4e\x90\x0e\x9e\x10\x66\xbd\x5a\x15\xb9\x67\x3f\x81\xd3\x24\x60\xea\x54\x91\x3c\xc7\xcf\xdc\x65\x23\x4e\x28\x81\x3a\x17\x77\xf3\x68\xa3\xf3\x8a\x6f\x7e\xfc\xe1\x06\xc5\x4b\x79\xa1\x72\x03\xf1\xe7\xaa\x5a\x2b\xa7\x31\x0e\x37\x7d\xb3\x06\x29\x68\xb6\xb6\x92\x9b\x9f\xca\x61\x37\xc7\x6c\x5f\x04\x71\x1f\x77\x4c\xbc\x5d\x4c\x0f\x1f\xfa\x07\x67\x51\xbd\x06\x7a\xd6\xfd\x57\xcc\x0f\xeb\xc9\x48\xbc\x60\x2a\x24\xcf\x4f\x64\x5d\xab\xe5\xaa\x8e\x17\x91\x07\x0e\xa7\x6b\x0a\x2c\x98\xc6\x1a\x8a\xd7\x4d\x57\xa3\xd9\x8a\xb7\x37\xb9\xe8\x25\x48\x2a\xb0\x35\x17\xd2\xa8\x8c\xd6\x35\xcc\xb8\x87\x8a\x8f\x2a\x0c\x3b\x0a\x7a\x4c\xae\xf6\xd7\x6e\x97\x86\x13\xc5\x96\xf3\x5b\x7a\x77\xa5\x9d\x94\x1b\x98\xbb\x8e\x70\x03\xb6\xb8\x9d\x80\x65\x42\xed\x94\xdf\x79\x52\xef\x83\x94\x49\x13\x94\x16\xee\x68\x5d\xf7\x42\x6b\x3a\x4f\x35\x21\xd1\xc2\x8d\x23\x99\x83\x2a\xf9\x8c\xeb\x69\x57\xe3\xee\xa8\x7e\x57\x2b\x5b\xa0\xda\x62\x3c\xba\x56\x4e\x25\xf8\x67\x28\xa9\x06\x70\x2c\x54\x89\x82\xad\x32\x53\x65\x9d\xcf\xb6\x9c\x77\x61\xdc\x56\xca\xab\x1c\x60\x58\xda\x74\xf1\xba\xf9\x11\x08\xcf\xfc\x0d\x38\xd4\x2e\xf6\xd2\x18\xe2\xfb\x8f\x29\xb1\x98\xb4\x02\x16\x34\xef\xd2\xe7\xef\x7f\x2f\xce\xd2\x98\x9e\xc0\x60\x9a\xeb\x8b\xf3\x99\xfb\xb7\xbc\x29\x07\xa4\x65\xce\xd4\x4a\x95\x99\x2a\xa7\xf9\x3d\x08\x30\x01\x81\xf1\xb4\x61\xc6\x68\x00\x3f\x0b\xf2\x68\xc8\x35\x40\x5b\x3d\xfd\x44\x5b\xf2\x03\xa7\xd2\x68\x32\x84\x98\xdc\xfb\x16\x7a\xee\xe6\x37\x13\x8d\x15\x41\x00\x9a\xe5\x99\x5e\x4f\x0a\x75\x5a\xe4\xd3\x9b\x5e\x60\x51\x9d\x1f\x1d\xea\x32\x9b\x14\x53\x5b\xbc\xf5\x7b\x6d\xf2\x02\x12\x51\x95\xf1\xf2\x9f\x13\x17\x00\x46\xc4\x0a\x0c\x24\xfd\xc1\x8d\xc4\xab\x17\x93\xbd\x67\x94\x12\x49\xc6\xe2\x8f\x51\x2a\x50\x10\xd1\x55\xe6\x63\xb5\xd3\xfb\x0e\x83\x47\xf5\x97\xa8\x77\xef\x23\x74\xe7\x70\x2b\x0b\x27\x9d\x5d\xae\x59\x2c\x85\xc4\x97\xbe\x96\x43\x2e\xb9\x9e\x45\x94\x5b\x18\x91\x8e\x6f\x7d\x9e\x7c\xc7\xda\xfe\x64\xea\xa1\x33\x9d\xa4\xf9\xd2\xdf\x45\x3f\x24\x68\x6b\x7c\xc9\x38\x34\x03\x44\x67\x04\x27\x46\xcb\x5a\xc9\xc9\x03\xe2\xe1\x1d\xaf\xdd\xc8\xaa\x74\x37\x19\xa0\xa6\x67\x62\x99\x1b\xb8\xab\xc6\x6a\xef\xa1\x38\xbe\x95\x79\x61\xef\xcd\x96\x00\xe8\xfc\x72\x64\xff\x43\x9f\x18\x56\xfc\x13\xb3\x0e\x7e\x0c\x53\xdc\xb5\x82\xa9\x73\x07\x07\x56\xc4\x33\x75\xec\x44\x85\xb9\xad\xc0\x1b\x46\xed\x20\x41\xdf\x4f\xae\xf6\x08\x05\xcd\x34\x05\x6e\x99\xf5\x27\x5b\x37\xc1\x00\xec\xd8\x04\xb0\x77\xb5\x20\x7c\x1f\xdc\x88\x33\x35\xd5\xeb\x95\x15\xe6\xc9\xb7\xc9\x41\x40\x92\x9e\x94\x74\x6f\xe9\x8e\xf2\x9f\xcf\x01\x55\x93\x8c\x7e\x99\xaa\x55\xb5\xcc\xcb\xdc\xd4\xf9\xd4\x4e\x9c\xac\x32\x70\x77\xb3\x8d\x84\x0c\x7e\x88\x4f\x50\xee\xd7\x0b\xb5\x3f\x0b\x49\x63\x74\x39\x10\xaa\x9e\xa6\xe7\x1f\x84\x0f\x7f\x14\x2e\x6e\xe8\x3c\xb9\x26\x43\x51\x87\xe1\xd9\xb5\x77\x87\x69\xd8\x58\x4a\xe5\x63\x02\xa8\xd9\x5a\x28\x44\x4b\xb5\xea\x1d\x1e\x36\xf4\x11\xbf\xc5\xad\x3c\x8c\x72\x6c\x85\xc5\x1c\x3c\xb2\x52\x4e\x75\x1e\xd2\xfa\x40\xda\xc4\x65\x74\x2c\x4e\xf5\x0a\x12\xb0\xa2\x5b\x6f\x12\x4f\x75\x70\x20\x4e\x0b\x5b\x8a\xaf\x8e\x10\xe1\x41\x50\xa7\xd9\xb6\x94\xcb\x7c\x0a\x7a\x64\x42\x24\x1f\x3a\xd1\x3b\x56\x45\xed\xf0\xbe\xe8\x1c\x41\x3c\x21\x3b\x34\x3e\x5c\xcc\x72\xcb\xdf\xeb\x2c\xb4\x07\xce\x9e\x6c\xc5\x38\x9e\xf7\x31\x3a\xa7\xb2\xfd\xe0\x31\x99\x2c\x2d\xe2\x09\x61\x1d\x3b\x26\x6e\x29\xb5\xaf\x81\xb1\x5b\x9e\x4e\x37\x46\x57\x50\x5f\x55\x1a\xb1\x92\x15\x82\xce\xca\xb9\x72\x78\xf0\xf9\x3f\x90\x77\xe9\x8a\xad\xfc\xae\x6b\xa9\x23\xf6\x32\x56\xc3\xf9\x8c\x00\x9e\x01\x36\xf5\x77\xbf\x6e\x2f\x98\x13\x00\xe3\xbf\x6b\x37\x50\xb1\x7e\x7b\x3b\x43\x48\x6a\x6e\xdc\x1c\x9e\xe5\x55\xbd\xe5\xda\xd0\x0e\xfd\xda\x2e\x8a\xa4\xf4\x6b\x2f\xd2\xb8\x0b\x05\x0d\xc3\x6e\x8d\x53\x8b\xee\xae\xfd\x0b\x4d\x1d\x1e\x34\xa7\xbc\x6f\x33\x1c\x2a\x78\x3b\x45\xf0\x0b\xe4\xed\xe0\xe9\xc0\x76\x54\xfb\x4c\x0e\x53\x6f\x34\x83\x51\x8b\xb5\x80\x41\x89\x0b\xc2\x72\x2c\x1f\x77\x6b\x6e\xc4\xae\xde\xb5\xa9\xc5\x44\xcb\xfa\x08\x56\x94\x8f\x0c\x1c\x3d\x29\x17\x02\x48\x3a\xf9\x05\xb3\x26\xb4\x8c\x86\x38\x12\x78\x84\x0f\x67\x95\x52\xff\x50\xfd\x7f\x3e\xf8\x82\x7a\x3f\x72\xc3\x30\x78\xf0\x45\x97\xc0\x35\xea\x14\xc5\x06\x0f\xbe\xe8\x10\xa3\x46\x5d\xf2\x55\x4b\x15\x2e\x1e\x35\xeb\xf1\xb7\x83\x07\x5f\x74\x0a\x0e\xa3\x6e\x99\x62\xf0\xe0\x8b\x76\xee\x36\xea\x38\xf9\xda\x2a\x10\x13\x68\xa9\x42\x6f\x30\xd4\x9b\xf2\x4b\x43\x60\xf5\xe9\xba\xb2\xeb\xcd\xee\x0e\xf3\xbc\xd2\x4b\x72\x5f\x45\xd3\x05\x15\xbc\xa0\x84\x1f\x5d\xef\xed\x33\xfb\xce\x95\x0b\xa6\x8f\x08\xbd\xfa\xcb\x6f\x28\xb8\x1b\x9f\x9c\x3a\xdb\xf4\x55\xa5\x22\x98\x39\x27\x56\xb8\x35\x75\x47\x53\x5d\xf1\xe1\xae\x72\x87\x8e\x52\x4b\x5f\x38\x81\xf4\xb5\xaf\xd7\xd2\x47\x5e\x2f\x7d\x4d\x37\x2f\xc7\x2f\x08\x48\xa9\xdf\x46\xe8\xf1\xe3\xb6\x76\xc5\x3c\xc3\xc5\xff\xc5\xa7\x44\x34\x82\x94\x50\xd0\xc7\x72\x83\xe1\x95\xe0\x9e\x72\xe3\x85\xeb\xb6\x16\xe8\xd6\x59\x6e\x89\x29\x82\xff\xec\x9c\x12\x74\x1b\x1a\x20\xdd\x86\xb3\xf7\x5d\x3c\x66\x5a\x5f\x46\x06\xc3\xc8\x3b\x08\x3d\x90\xb0\xdc\x4f\xde\x47\xd3\x79\x0a\x5d\x37\x5e\x1d\x36\x6a\xb9\xb6\xb7\xd4\xf2\xaf\x98\xcb\xb5\x37\xaa\x5e\x98\xe3\x2a\x88\x47\xb9\x81\x7f\xfb\x8d\x0f\xee\x1d\x36\xab\xfe\xa4\x4a\x71\x94\x52\x7a\xd6\xec\x87\x4b\x60\x31\x6a\xe9\xe2\x33\xf1\x54\x8c\x7c\x22\x34\xdc\x2c\xd4\xda\xdd\x2d\xf3\x9d\x62\x2d\xf3\x55\xb1\x65\x09\xa5\x67\xcd\xb1\x6a\xb6\x2c\x0c\x63\xdc\x32\xb7\x7c\xd3\xd6\x1d\x35\x06\xe0\xf1\xe3\xa4\x1d\xbc\xc8\x4f\xaa\x6c\x59\xd6\x76\xcd\xc2\x92\x21\x93\xe0\x98\x16\xde\x47\x2e\x62\x7a\x33\x40\xd0\xc7\xd3\x65\xd3\x51\x8f\x54\x6c\x6f\xb6\x65\xbd\x50\x75\x3e\x85\x8f\x7d\xa4\x1a\xf1\x53\xf4\x35\xb4\x97\x4c\x5e\xd3\x1b\x00\x1c\xda\x44\xe6\xdc\x9a\xbc\x0f\x5d\x78\xd3\x9f\x2e\x64\x39\x57\x46\xa8\x0f\xa5\xf7\x64\xd9\xe3\xe4\x66\x3e\x88\xd9\xb5\x53\x1c\xaf\x56\x45\x3e\x45\xd0\x2b\x8c\x0c\x0d\x4e\x8d\x51\x28\x33\x80\x1a\x5c\xb8\x54\x08\xde\x95\xc7\x0f\x70\x2c\x11\x62\x5c\xab\x3f\xfd\x70\x87\x0d\x42\x63\x07\xbe\x05\x03\xa0\x10\x44\xc2\x1a\xdd\xd6\x70\xdf\xc0\x8f\x5f\x7e\x11\xbd\x75\x79\x53\xea\x4d\x89\xc8\x55\x3d\xaf\xd1\x1f\x4e\x91\xbb\x5e\x21\xe6\xfb\x51\x1b\x43\x81\x75\xb2\xd7\x16\x08\x78\xcf\x88\x69\x08\xf8\xe0\x0d\x66\x59\x7b\x91\x73\x74\xb7\xc7\xe7\x09\xa1\x95\xe3\x00\xf0\x0e\x0c\x18\x1c\x45\x5e\x2b\x9f\x94\x1c\x40\xb2\xbc\x15\xab\x67\xc4\x54\x17\x88\xbb\x1c\x74\xc0\xa4\x36\xea\x1a\x67\x65\x2e\xe8\x26\x9a\x0e\x78\x18\xe0\x4f\xe5\x6d\x9f\xce\xd9\x82\x96\xb1\x95\xf5\xf6\xc3\xa0\x39\xf9\xed\x2e\x8e\xd7\x30\x91\xe4\x80\x35\x23\x72\xf1\xe7\x4e\x1e\x77\x28\xf2\xaf\xbf\x8e\xcd\x24\xd8\xe4\xdc\xd8\xc3\x58\xce\x61\xdc\xdf\xd4\x7a\xb5\x52\x59\x3f\xb2\x88\x4c\x2a\x25\x6f\x62\x2b\x04\x5c\x82\xc3\x90\xc9\x32\x13\x61\x30\x20\xe8\x6f\xa3\xed\xbd\x4e\x16\x85\x2a\x04\xa8\x24\xc8\x5c\x6e\x5f\x92\xe6\x23\x2f\x21\x28\xc2\x79\xd3\xdd\xbd\x49\x1a\x7d\x7b\x97\xbf\x1f\x34\x67\xe3\x5d\xfe\x9e\x9f\x8e\x4d\xdb\x48\x18\x49\xea\xe5\x67\x7c\xba\xe5\xbb\x7e\x0e\xbb\xd6\x0f\xf3\x85\xe9\x5a\x2e\x2d\x9b\x04\x2e\xa5\x5d\x2b\xdb\x4e\xd8\x71\x7d\x55\xad\xd5\xc5\x72\x85\xc0\x8c\xbe\xe2\x39\x8f\xa6\x97\xe2\x11\xe2\x98\x3c\x0a\x0a\xd3\x7d\xca\xe2\xe0\x21\x64\x6a\x72\x7f\x2f\x83\x8d\x18\x34\x55\xd3\xe9\xda\xb1\x55\xca\xd4\x80\x0c\x57\x57\x0e\x53\x5b\x83\x7f\x63\x05\x19\xd8\x5c\x8c\xd2\x05\x0f\xbf\x41\x3d\x08\x84\x10\x7e\x25\x8c\x2a\x8d\xf3\x30\x77\x16\x5c\x04\x84\x46\x34\x7c\xb6\xc3\x45\x7f\xb2\x9e\x4c\x0a\xbb\x65\x6b\x2d\x6e\x94\x5a\x85\xb8\x29\xf0\xab\xff\xca\x59\x98\x20\x48\xc1\xd8\x4e\x28\x09\xa8\x2d\x4e\x55\xed\x86\x81\x60\x3c\xc8\x21\xb2\x56\x25\x68\x3b\x6d\x9b\xa8\x41\x2e\xc7\x57\xa6\x24\xc4\x40\x41\x9b\x1a\xc3\xa6\x82\xda\xdb\x59\xa6\xbf\xfa\x48\x68\x32\xa1\x21\xe0\x8d\x84\x5f\x76\xb7\xc3\xbc\x9c\xb3\xae\x0d\xe3\xc9\xda\x79\x3a\xee\x34\x83\xcf\x04\x22\x14\xdb\x2f\xb2\x71\xe3\x93\x96\x1b\x31\x07\x6f\xdc\x0a\x55\x5c\x4f\x86\x91\x72\xfe\xd8\x17\x35\x80\x4b\xee\x33\x04\x9a\xda\x25\xee\x01\xcf\x6e\x5d\x05\x66\x2f\xf2\x92\x0e\x79\x44\x60\xd0\x25\x85\x77\x81\xa2\x28\x18\xee\xec\xca\x00\x5f\xd3\xa5\x5a\xea\x6a\x0b\x41\xf3\xf6\x1a\x0c\x51\x01\x96\x2f\x80\xaa\x15\x8f\x5c\x1f\x07\xbc\x36\xc2\xc8\x69\x95\xcf\xf2\x29\x66\x20\x3a\x7e\x75\x01\x78\x06\x25\xfa\xb5\xbe\xc9\xad\x68\x3c\xa6\xe3\x65\xec\x94\x4a\xd0\xc8\x89\x9a\xe9\x4a\x51\xc6\x91\x95\x34\x98\x9b\x10\x08\x43\xa0\xc3\x57\x58\x0c\xc2\xde\x62\x98\xdd\x01\xad\x05\x07\xdf\x8a\xc8\xc8\x79\x2d\x30\x02\x4f\x87\x0f\xba\x8c\x8f\x63\x29\x8e\xd8\x40\x5f\x94\xb5\xee\xcb\x81\x98\xec\x1d\x8e\xa9\x04\x28\x93\x6d\xeb\x43\xb8\x89\x59\x49\x7b\xed\x46\x45\x76\x86\x2e\xae\xe3\x40\x04\x7d\x41\x8c\x5e\x2a\x0c\xbd\x80\x6e\xa3\x08\x15\xaf\xb9\x5f\x60\xf8\xfe\xfc\xd5\x5f\x3e\x8a\xe3\x32\xb4\xc2\x85\x6c\xda\x79\xa4\x69\x0e\x38\xc2\x71\x53\xa9\x3b\x03\x51\xaa\x0f\x24\x73\x3c\xec\xdb\xbf\xc5\x43\x07\x17\xde\xa6\x2f\x49\xa8\xe0\xdd\xe6\x98\x2f\x37\x58\x43\x3b\x97\x4f\xac\x53\xa5\x73\x8f\xda\x93\x82\x95\x3b\xa0\x72\xf5\xa1\x46\x0e\x8b\x3a\xd8\x13\x5d\x2f\xe0\x38\x01\xf7\xab\xe5\xaa\xde\x0e\xc5\x5b\x14\x86\x47\xe2\xa5\x0f\xa6\x10\x1f\x86\x53\x5d\x4e\x65\xdd\xdf\xee\x21\xcc\xcc\x96\x14\xc1\x18\xf7\x72\x70\x20\xa6\xaa\xaa\x25\x28\x37\x65\x2d\x3e\x40\x40\x4e\x89\xc2\xbd\xe8\x7f\x10\x53\x37\x71\xd2\xa1\xcd\x03\x5f\x40\xa2\xe4\x0c\x05\xf9\x66\x9a\x47\x37\x75\x68\x8f\x2b\xe4\xe2\x12\x30\xf2\x4c\xe3\x86\x15\x86\xab\xb5\x59\xb8\xd8\xaf\x68\x92\x12\x04\x0c\x7a\xc9\x15\x74\x9c\x44\x9f\xd5\x69\xd6\xf8\xf8\xa0\xb5\xd1\x51\x93\x0e\x0e\xc4\xb1\x98\x40\xd4\xa8\x16\x99\x15\xa8\x2b\xbd\x06\x5d\x2a\xe5\x0f\x1d\xdb\xe2\x63\xee\x12\x28\xde\xd1\x37\xde\xbb\x81\xf7\xad\x80\x2f\x26\xa5\xb0\x63\xef\xa3\x13\x2f\x36\x65\xc8\x0a\xce\x89\x47\x7c\x89\x3f\xf2\x6b\x9c\x7c\xd1\x73\x23\x54\x8e\x79\x13\xdd\xdc\x69\x30\x76\x48\xc7\x78\x6d\xe9\xa1\xf8\xd9\xa8\xd9\xba\xc0\x85\xb0\x92\x79\xe5\xf2\xb3\x40\x1c\x12\xdf\x85\x78\x3d\x0f\x1e\xf7\x12\x0e\x2e\x94\x53\xd7\x75\x5e\xe4\xf5\x96\x24\x1a\x34\x15\xe1\xa8\x10\xa0\x18\xe6\x94\x95\x4e\x66\xe5\x7b\x12\x4e\x21\x4c\x7c\x59\x66\x3e\xd4\x16\xec\x6c\xd0\x28\x9f\x58\x49\x7d\x90\x80\x3a\x66\x4f\x63\x5b\x53\xf4\x2d\x0f\x83\x00\x7f\x58\xf2\x14\xc6\x8d\xa6\x24\x60\xa1\xe0\x8f\x0e\x83\xb6\x37\x6c\xbf\xe8\x4c\x27\xc2\x7b\x17\xa3\xbc\x4f\xdd\x87\x23\x53\xb9\x70\xf0\x2a\x6a\x7a\x44\xeb\xd9\x47\xf1\x0e\x12\xa8\xbc\x17\x98\x14\xc3\xe5\xe0\x1c\x5b\x5e\x3a\xc6\x28\x7a\x16\x6e\xca\xc5\x73\x82\x65\x64\xac\xa2\x2f\xab\x6a\x20\xa6\x93\x01\x26\x65\x09\xbe\xaa\xf1\x92\x94\x55\xe5\x57\xa4\xac\x2a\x8f\xef\x18\x2a\x26\x5e\x30\xb6\x82\x4b\xf2\x38\x41\x53\x0a\x94\x1b\xd8\xea\x41\xdf\xe9\x6d\x24\x74\x8f\xfb\xfb\x5a\xd1\xc9\x8d\x5e\x87\x01\x8e\x9e\x9f\xa6\xf5\x42\xe5\x55\x74\xd4\x96\x99\x65\x28\x96\xd4\x46\xe6\x35\x99\x95\xa0\x5e\xa3\x2c\x09\x72\x59\xe2\x9c\xfc\x7f\xe0\xcb\xa9\x5b\xf2\x19\xff\x86\x0b\x54\x2e\x33\x51\x29\x88\x41\x30\xfe\x70\xf2\x87\xf1\x4a\xeb\x62\xe0\x00\x33\x56\xaa\x72\x79\xb2\x12\xcb\xc9\x33\x67\x3a\x49\x2e\xdf\xe1\xfa\x1e\xb9\x09\x0e\x7f\x97\x5b\x38\x73\x9a\x81\x71\x48\x45\xdc\xe3\x32\x7b\x8d\x1d\x6d\xaa\xa7\x1a\x77\x39\x7f\xa1\xe9\x90\xe9\x77\xdc\x05\x99\x27\xc6\x43\x7f\x27\xf2\x43\xc7\xef\x42\x2e\xae\xad\x34\x75\xb5\x9e\xd6\xba\x1a\xd2\x4c\xb0\x4b\x1c\xd3\xc9\xdd\xd1\xab\x37\x7e\x94\xa2\xee\x45\x58\xa7\x3b\xaa\xf7\xd5\x00\xf4\xff\x88\x7c\x7a\xc7\xb7\xae\xf4\xea\x27\xd0\x67\x7c\xf6\xa7\x5c\x50\xd6\xc7\xc3\x07\x3c\x93\x22\xec\x1d\xcc\x37\xd1\xaf\xe5\x3c\x06\x6a\x95\x73\x74\x65\x99\xac\xeb\x5a\x63\xa2\x57\xff\x0c\xb2\x28\xc4\x8f\x30\xb1\x52\xfc\xac\x56\x1f\x6a\x59\x29\xd9\x6b\xcb\x2f\xfa\x0a\xf3\xcc\xbd\xd0\x6b\x43\x81\x66\x68\x7d\x41\x15\x05\x64\x7e\xc4\x06\xb9\x2c\xb0\x25\x73\x81\xa3\xbc\xab\x25\xfa\xd7\x8c\x9a\xcf\x4e\x31\x02\x3a\x79\xc5\x9d\x72\x3a\xdf\xb4\x57\x85\x76\x9e\xe9\x4d\xd9\xf5\x7c\x47\xb5\x17\xfa\xb6\xf3\xf9\x8e\x6a\x3f\xaf\xda\x9f\xc6\x55\xfc\x8c\x3d\x7c\x08\xa9\x52\xcd\xd0\x27\x2f\x7b\xfc\x38\x9d\xe4\xed\x4a\xed\xed\xb5\x26\xa5\x6d\x4d\x3d\xdb\x48\xd7\x40\xe8\x84\x88\x9d\x32\x93\x53\xbc\x08\x26\x9e\xf5\x1a\x8d\xc4\xa6\x46\x84\x2e\xc0\x99\x21\x27\x63\x64\x47\x70\xc1\x8d\xea\xd8\x4b\x40\xf0\x5b\x87\x9b\x09\xc4\x18\xc3\x3d\x20\xa0\x5b\x53\x5d\xd1\x70\x6b\xf7\xc7\x64\x1f\xc5\xbc\x81\x38\xbb\x7c\x01\x2f\x51\x7f\x35\x10\xee\x39\x32\xcf\xbd\x91\xf8\xea\x23\x92\x12\xc2\xa1\x45\x0f\x29\x4b\x84\xa8\xf5\x8a\x34\x88\x9e\x2b\x52\x28\x32\xdc\x39\x50\x6c\xc4\x63\x9e\xa0\x7d\x5c\x16\x76\xe1\x3d\xae\x4c\xcc\x96\x0d\x4b\x19\x62\xa5\x55\x3b\xd6\x13\x85\x87\x56\x16\xb9\x67\x85\x21\x12\xa4\xb8\x05\x57\xb8\xb1\x37\x99\xbb\x2f\x5d\x42\xa8\x9f\x2c\x06\x71\x4c\x03\x04\xe9\xd3\x37\x41\x8c\x77\x2e\x81\xd2\x87\xc7\x00\x0a\x66\xb0\x93\x39\x82\x64\x6a\x77\x9a\x1e\x77\x0b\xac\xc8\xcd\x2c\xe8\x9b\x87\xe2\xaf\x78\x5f\x87\x7b\xbc\x1d\x11\x22\x6c\xbf\xe7\xa8\x4d\x5c\xc2\x2f\x22\x49\x19\xf7\xc5\x38\x35\xf2\x8d\x21\xcd\x7c\x87\x77\xee\x98\x0f\x46\xcc\xe4\xf8\xac\xe3\x97\x06\x3c\xaf\x32\xcc\xf7\x5e\xcb\x68\x91\xcc\xc7\x96\xab\xbe\x55\x55\x95\x67\x4a\x2c\xf4\x26\x1c\xd6\x73\x55\x1b\x3e\x2b\xe2\x64\xeb\x88\xd1\xde\x19\x44\x8a\x72\x3a\x3c\x57\xe0\xe5\x03\xe2\x99\x5f\xeb\x56\x40\x23\xff\x05\xe7\x1c\x9b\x07\x6c\x60\x7b\x3b\xc5\x85\x1c\x9c\x39\x10\x03\x37\x20\x70\x40\xba\x9d\x49\xa1\x82\x30\x60\x67\x75\x1a\xa9\x02\x28\xcd\x14\x65\xfa\x75\xe9\xe5\xb8\xdf\x64\x10\x5c\x82\xf1\xf0\xa9\x43\x86\xfe\x2a\x81\x1b\xbd\xd3\x19\x49\xf0\x76\x78\xe8\xce\x4f\xb3\xb5\xb6\x7d\xf8\xd7\xbb\x86\x74\x35\xe6\x1e\x76\xdc\xc3\xc6\x4d\x26\x34\xc7\x20\xfc\xa9\xb3\x13\x0c\xc2\xf5\x05\x74\x44\x80\x3d\x1f\x24\xd0\xe1\xbd\x3c\x9b\x5f\x12\x98\xab\x5f\x45\x7d\x35\x9c\x0f\xc5\x98\xce\xb1\xf1\x5e\x1c\x47\xf1\x2c\xdc\x07\xae\x00\xba\x44\x57\x31\x44\x0c\x97\xd9\xe7\x2a\x04\x31\xda\x46\xb7\xb9\xfc\x3a\x5d\xba\xfb\xfe\x21\xdd\xd0\x11\xba\xb6\xe3\xa8\xb6\x5d\x3e\xbb\x7c\xb1\x4f\xb9\xde\xa6\xc8\xc0\xd4\x2c\x2f\x73\x58\xad\xa4\x30\xf1\x97\xf4\x22\xbf\x55\xc2\xde\x8d\x0e\xe1\xe6\xe3\xce\x08\xcc\xe9\x0f\x71\xbe\x13\xc8\x32\x82\x59\x9f\x84\xd1\x10\xd6\x6e\x9b\x65\xec\x45\x95\xec\xc9\xb6\x0b\x43\xff\xc0\x85\x22\x3c\xf4\x4f\x78\x48\x1c\x45\x25\x03\x9c\x97\x15\xa7\xfb\xea\xc3\x48\x68\xc8\x6b\xea\x98\x23\xb8\xe0\x4c\x2b\x04\x7a\x2e\x20\xd2\x78\x2f\xba\x0b\x3b\x7d\x2f\x4f\x5a\x6e\xd0\x32\xd3\x69\x0f\xef\x87\xd6\xf8\x06\x32\x59\xa6\xb5\x71\x9d\x1f\xf5\x6b\xe2\x08\xbf\xdd\x74\x9d\x76\xdf\xe8\x12\xa9\x9a\xfe\xea\x30\x88\x5c\xc6\x4a\x35\x35\xec\xfb\x0f\xfb\x0f\x7d\x13\xac\x5c\x87\xd8\x5d\xa1\x55\xf7\x80\x40\x3f\x77\x27\x24\x44\x4a\xf9\xaa\x38\xff\x92\xf1\x6b\x87\xd0\x3c\xd7\xf6\xee\xed\xd5\xb0\x50\x0d\x3c\xeb\x5a\x1c\xd6\x07\x69\x93\x52\x0f\x76\xe8\x51\x58\xd9\x41\xa2\x39\xc6\x33\xc0\x1d\x6d\x51\xec\xa6\xd0\x80\xbb\xb6\x2e\x41\x4b\xa0\xfd\x89\x4e\xcb\x06\x58\x8f\x97\x10\x30\xa5\x13\x24\xa3\x74\x81\xfc\x89\x7b\x35\xd3\x33\xb7\xa8\xfa\x52\x31\xa1\xe1\xd7\x16\x59\xc8\x98\xcc\xd3\xaf\xe9\x56\x80\xe8\x0b\x98\x2a\xfa\x02\x36\x39\xb6\xe7\x1c\xaf\x4a\xec\x07\x8a\x42\x61\xcb\xe3\x17\x23\x0f\x35\x66\x8c\x72\xce\xdd\x2d\x26\x28\x4c\x24\x8d\x99\xff\x1c\xf3\x4d\xfd\x0b\x97\x72\x6b\xa7\x18\xf3\xe8\x0b\x59\x8b\x6a\x5d\xd6\xf9\x92\xa0\x3d\xb8\x27\x31\x45\x68\x1c\xf9\x20\xc3\x9c\xf9\x9c\xc5\x85\x12\x3c\x5b\x1c\x0f\x1e\x67\x18\x95\x1e\xfe\x46\x03\xc6\x01\x99\x93\x6f\x46\x38\x2c\xae\x15\x89\x8e\x15\x9f\x0f\xd2\xe6\xb6\x26\x74\x0b\x17\x3a\x9a\x9b\xb0\x64\xcf\x4b\x10\x16\x21\x69\x77\x7a\xe5\xb7\x32\x45\x50\x52\xb3\x30\x1b\x67\x15\x19\xaf\x2a\x3d\x55\xc6\x9c\x7b\x7d\x05\x45\x05\x47\x72\x0a\xb3\x91\x53\x67\x7e\xed\x8a\xc5\x36\xd3\x04\x28\x36\x64\xfe\xca\x1f\xec\x78\x5c\x95\xd2\x36\x84\xf0\x8e\xec\xd4\xa6\xa1\x07\xe2\xea\x16\x44\x6c\x8b\xc5\xef\xc8\xf6\x05\xad\xf2\xbd\x6e\x6f\x7b\x63\xc4\xfa\x89\xd6\x82\x32\x99\x8e\x15\x1b\xd3\x5a\x47\x86\x0c\xa2\x01\xfe\xb6\x75\x9a\x7f\xa0\x56\xf6\x2e\x30\x73\x80\x5a\x0e\xb1\x12\xd3\x72\xd2\xc8\x65\x94\x93\x21\x10\x1a\x86\xc3\x88\x9e\x9c\xf3\x81\x0b\x8d\xf1\x96\xca\x58\x3d\x45\xe7\x45\xdc\x15\xd1\xa6\xde\x6b\xfb\xc2\xe0\x5e\x3a\x11\xae\xd1\xfb\xed\xc8\x3b\x35\x88\x37\xd5\x92\x13\x3a\xf6\xaf\xed\xf0\x69\x4e\xe1\xde\x88\xe5\xb5\x74\xe3\xbd\x51\xf6\xc6\xd4\x35\xe0\xe1\x42\x80\xab\x46\xbc\x61\x69\x9c\xe1\xf6\xb3\x90\x08\x28\xba\x55\xb5\x98\x28\x55\xf2\xe4\x15\x2d\xfe\xe7\x70\x9b\xde\x04\xc3\xc4\x5c\xeb\x4c\x58\xd6\x88\x97\x2d\x44\x4e\xc8\x11\xb8\x4e\x73\xe5\x9c\x47\xb5\x03\x40\xc9\x61\x8b\x1b\x48\x13\x4d\x82\x1c\xca\x13\xe7\xd0\x1f\xd6\x93\x36\xbf\x50\x96\x4e\x85\xdd\x0f\x06\x0f\xbe\x60\x82\xe4\x88\x4b\x95\x83\x07\x5f\x44\x3c\x76\x14\x9f\x51\xf6\x35\xe7\x00\xa3\x98\x21\x0c\x1e\x7c\xd1\x98\xa1\x51\x73\xdf\x05\xdf\xca\x8b\xd2\x05\x5c\xc8\x5a\x79\x27\x3d\x3c\xb2\x0e\x0e\xc4\x09\x6e\x3a\x07\x17\xe6\xd0\xba\xd0\xca\xed\xf6\xb5\x04\x5b\x16\xe4\xf6\x05\x9a\xcf\xfd\x73\x4e\xf0\x29\x2a\xe5\x4e\x6d\x31\xfe\xfc\x1b\x7c\xfe\x83\x36\xf5\x6b\xad\xed\x93\x6f\xe1\xd3\xf0\x03\x2c\xf5\x0b\x6d\x6a\x51\x57\x4a\x0d\xc5\xa9\x9b\x63\xc2\x2d\xf4\x38\xba\x90\x0d\x05\xd3\x7e\x7a\x72\xaf\x74\x65\xa5\xd0\x23\xf1\xaf\x87\x68\xb8\x31\xeb\x49\x42\xc6\x2e\xc4\xb2\xb6\x47\xae\xce\x1d\xb0\x6f\x70\x6c\xc6\xcc\x6e\xaa\x0a\x24\x79\xc3\xff\x2d\x34\xfc\x4a\x7d\xb0\x4f\xfe\x48\x5d\x94\x45\xd4\xf3\x7f\x0f\x8f\x7f\xc0\xf5\xf6\x6a\x81\x5a\xdc\x3f\x1d\x52\x5e\x21\x7b\x40\xf1\x2a\xdf\xe1\x8b\xe7\x95\x9c\x2f\x69\xf8\x9e\xd0\x8c\x55\xb2\xcc\xf4\xf2\x47\xb5\x15\x47\xe2\x85\xac\x17\x43\x7c\xd0\xdf\x1b\xd6\x1a\xd3\x59\xf4\xbf\xfd\xe3\x1e\x46\x4d\xf4\xbf\xd9\x3b\xa4\xbb\x29\xf2\x63\xe7\x58\x81\xd5\x7b\xd7\xd7\x00\x6e\x73\x91\xbc\xfd\xb2\x27\xbe\x0e\xdf\x89\x29\xc0\x22\xa2\x6e\x98\x98\x4c\xf4\x2a\xa5\xc1\x4f\x01\x35\x95\xd3\x85\x02\x81\xdf\x8a\xf5\x5f\x3e\xed\xdb\x29\x26\xc1\xc1\xdf\x3a\xec\x5f\xef\x5a\x1a\xfe\x5e\x1c\x09\x57\x9e\x9f\xe6\xdf\xe7\xb7\xa0\x6a\x0a\x70\xcc\x4e\xef\xba\x50\x62\x5a\x68\xa3\x4c\xed\x93\xd1\x86\xc1\x46\xb3\x98\x7b\x6e\x67\xf2\xb4\xe1\xbe\x26\xc0\x19\xa5\x86\xa4\x4a\xc9\x6d\xf0\x14\x09\xa7\x1e\xa9\xfd\xd0\x0f\x97\xc0\xb8\xb5\x2f\xe9\x55\xa1\xab\x1c\xb7\xf4\xbe\x95\xc5\x8d\x58\xaf\x30\x67\x43\xa5\x14\x01\x95\x6c\x94\x98\xe5\x25\x78\x9c\xb8\xe6\x8a\x0d\xa0\x35\xfa\x6e\xb8\xdc\xbb\x30\xfe\x99\x3f\xf7\x64\x45\x62\xd6\x3b\xf8\x0e\xb2\xeb\xfe\xc3\x3b\x1b\x4d\x15\xc9\xb6\xea\x2e\x68\x2c\x6b\x34\x16\x78\x19\x25\x5b\x2e\xc9\x2b\x3b\x7e\xdf\x9a\xb6\x00\x90\xbf\x57\x8e\x63\xe3\xd6\x05\x56\x0f\x34\xb8\x41\xdd\xc5\xcc\x48\x82\x83\x82\x61\xe9\x03\x28\x76\xa0\xb5\x2e\x97\x7a\x5d\x82\xff\xd2\x4a\xd7\xaa\xac\x73\x59\x14\xdb\xbd\x61\xac\xae\x0d\xf0\x3c\x1f\xdd\x98\x43\x3a\x36\x5a\x40\x1c\xd5\xd0\xb9\xb2\x52\x77\x3a\x27\x0e\x82\x10\xe0\x92\x48\x6a\xfc\x98\x95\xfc\xf2\x8b\x68\xbc\xbd\xf2\x2e\x08\x0e\xa1\x1f\xb6\x0b\xa9\x4b\x41\xe7\x49\x6e\x63\x13\x45\x71\x81\x6a\x65\xdb\x57\x69\x5d\x47\xb7\xdf\x1c\xb6\x09\x83\xa5\x39\xc4\xe1\x7b\xfc\x18\x1b\xb5\xab\xf1\x7b\x87\x6e\xba\xfc\x54\xeb\x55\xb0\x00\x85\x31\x09\x1f\x09\xf2\x36\xbd\xbd\xf7\x16\x6d\xdb\x9a\xed\xfb\x12\x83\xaf\x9c\xc6\x48\x57\x28\x20\x12\x02\x06\x34\x78\x43\xf2\x03\x71\x70\x02\xf6\xc8\x0d\x45\xb0\x35\x76\x71\xba\x7d\xbf\x7c\xca\x36\xf0\xa7\x4e\x33\x77\x6f\xf8\x15\xd3\xde\x98\xc1\xc6\xfe\xe8\x58\xb1\xc9\x8b\xe6\xf0\xdf\x7f\xa4\x63\x1e\xaa\xab\x4a\x99\x95\x2e\x33\x0a\xff\x74\xd3\xd8\x1c\xcf\xd4\xcd\xf6\xcb\xa7\x6c\x64\x7e\xbb\xed\x20\x30\x95\x50\x6e\xc4\xdf\x5c\x7c\x2c\x28\x8b\x70\x11\x20\xa0\x77\xa9\x37\x00\x70\x2b\x8d\x59\x2f\x95\x47\x72\x24\x50\x6e\x80\xc7\x07\x01\x63\xca\x07\x03\x45\x0e\xf5\xa1\xb9\x95\x62\x6d\x99\x67\xc9\x04\x51\x8f\x0e\x54\xe0\x01\xe6\x65\xe7\x01\xb8\x5d\x61\xbe\xb5\x52\x97\xfb\x67\x97\x2f\xf6\xc3\xc7\x08\xcd\x0f\xf5\x9d\xa5\xfa\x50\xfb\x2c\x13\x58\x9b\xb2\x6d\xb8\x98\x08\xdc\x87\x4c\x4d\x6a\xd6\x2b\x55\x81\x31\x68\xed\xee\x32\x4d\xa9\xbd\x65\x46\x82\x2b\xbb\x83\xb4\x06\x5f\x76\x6e\x54\xdc\xa5\x94\x8b\x36\x48\xdb\xe1\x95\xca\x09\xef\x21\x80\xcd\x2d\x48\xff\x8d\xf5\x2a\x93\x35\x8a\x02\x40\x9f\xe8\x46\xd6\xca\x3b\xe8\x92\x26\xcf\x0b\xe5\x8d\xd5\x7d\x65\x0f\x83\xb6\x98\xad\x54\x10\x19\xb5\xc9\x26\x28\xab\x77\x1c\xf3\xa3\x1d\x22\x00\x56\x6c\xad\xd1\x64\x37\x58\xb8\x39\x49\xad\x7b\x09\x0b\x77\xce\xcd\xe8\x8e\x99\x1b\x3c\xf8\x22\x1d\xf6\x51\xcb\x44\xe0\x25\x81\xaf\x86\x57\xb0\xf8\xd8\x4e\xce\xb4\xcf\x3c\xe7\x8f\x81\x77\x3d\x5c\x0e\x3d\x52\x39\x79\xc5\xf7\xc5\xcc\xc3\x4a\xca\x20\xee\x6f\x94\x58\xc2\x3e\xdd\x48\xf2\xb4\x90\x79\x21\xf4\x9a\x76\x1e\x5c\xee\xd0\xbc\x83\x56\x17\x30\xb6\x01\xe8\xf4\x46\x61\x1d\xba\x0a\x90\x70\x6f\x44\xbf\x90\x5b\x70\x66\xb6\xc4\xc0\x59\xd6\x51\x72\x66\x43\x4d\x7e\x28\xb8\x99\x80\x3b\xa0\x57\x1b\x00\x6a\xcf\xb5\x77\xb7\x0f\xf2\x09\x29\x3b\x1c\x25\xe0\x0f\xc0\x64\x10\x1b\x55\xd6\x78\xfd\xf4\xf0\x9d\x33\xc7\x51\xc5\x4b\x54\x65\x82\x3a\x9f\xdc\x7f\x0b\x55\x8b\xb5\x71\xb4\x32\xe7\xaa\x02\xb7\x95\x99\x92\xf5\xba\x02\x9d\xde\x47\x27\x89\xc1\xe8\x52\xb8\x0a\xb0\xc5\x87\x29\xd3\xdc\x6b\x3b\x7f\x5a\x04\x80\x8e\x83\xe1\x75\x60\xf2\x85\xde\x28\xe4\x86\x4b\xcd\x04\x49\x3d\x13\xc7\xd0\x87\x93\xf4\xc0\xdd\x82\x65\x33\x47\x4f\x61\x7f\x75\x82\xa9\x68\xb1\x9d\x00\xf5\x53\x20\x7e\x4c\xb4\xa1\xcd\xc7\xa8\xae\x3e\x61\x91\x08\x6a\x55\x2f\x8e\x5d\xd6\x58\xaf\x4e\xad\xd5\x72\x75\x4c\x4b\xed\xf8\x10\x7f\x1e\xfa\xa7\x61\x91\xc2\x13\x2f\xa9\x20\xb1\xaf\xbf\xe6\xb6\x07\x78\x76\xd2\xfa\x81\x13\xfa\xc0\x09\x52\x76\xff\x34\x3e\x70\x12\x7f\xe0\xc4\x7d\x80\xd2\x2a\xd9\x31\x83\x85\xab\x56\x56\x74\x9b\x56\x72\x53\x88\xf5\x6a\x18\x64\x6c\xea\xe4\xbe\x6b\xcc\x5f\x02\x0a\x34\x74\x30\xfa\x22\x3c\xf1\xae\x06\xb6\xe2\xfe\x7e\xf2\xbd\x93\xfb\x7c\xef\xc4\x7d\xef\x38\xfd\xde\x49\xe3\x7b\x27\xfc\x7b\x27\xf1\xf7\xe0\x1e\x92\x97\xa2\xd0\xd3\x1b\xc8\x34\x94\xdc\x43\xc4\xd2\xa5\xbd\xf5\xc3\x2d\x8e\xe8\xcb\x87\x49\x9b\xf6\xf7\x53\xa9\xe9\x18\x0e\x7f\x6c\x15\x89\x04\xec\xd1\x50\x16\x70\x1e\xd4\xaa\x55\x5c\x3a\xe6\x2e\xa0\xbb\x47\x72\x57\xbf\xef\xde\x32\x39\xcd\xb1\x8c\xf7\xca\x49\xe2\xce\xce\x36\x18\xf2\x94\x70\x27\xa3\xdb\x0d\xba\x66\xef\xe7\xa5\x7f\xd3\xdc\x3d\xd8\xbe\x38\x74\x89\x1f\xc0\x09\x8b\x8e\x42\x8b\x72\xe7\xd1\x8e\x57\x29\x79\xab\x2a\x23\x0b\xbc\x33\xd5\x1b\xbd\x0f\xce\x02\x03\x9f\x54\x18\x19\x27\x69\xc9\x62\x1f\xfd\x90\xd9\x12\xa9\xa8\xab\x8d\x06\x85\x06\x19\x44\x67\x25\xa4\xf4\x0b\x3b\x79\x25\x61\xe2\xa3\xcb\x25\xe7\x53\xf6\x3d\xde\x21\x7d\x30\x96\x3f\x51\x1a\x5d\x0a\xfb\x37\xf7\xdb\x36\x87\x0b\x4a\xbd\x08\x86\x95\xfd\x7d\xbb\xb4\x0f\xbd\x2a\xb6\xec\xdb\xf7\x10\x1f\xd3\x73\x39\x92\x7a\xd8\xcc\xe8\x6e\xc4\x8d\x35\x11\xc1\x60\xa9\x89\x68\x51\x30\x46\x44\x8a\x39\xf9\xd0\x00\xe1\xa0\x5f\x9c\x89\x45\xae\x2a\x59\x4d\x17\x90\xc8\x85\x4c\x05\x26\x46\x1c\x1c\x4f\x27\x63\x01\x9c\x77\x2b\x2e\xce\x0c\xe5\xfe\xf8\xca\xd9\x22\x50\xc9\x59\xa9\xa9\x82\x43\x45\x8c\x97\x60\x99\xb4\xc2\x11\x3a\x7d\xc0\xef\x9f\x94\xbc\x55\xe3\x00\xc9\x05\xc2\x7a\x48\xd2\x64\x3f\x1b\x67\x0f\x20\x55\x7e\xa9\x64\xd5\xc6\xfd\x5d\x42\x80\x52\x83\x13\xbe\x25\xf7\x48\x95\x60\xe5\x7b\x64\xbf\xfa\xa8\x50\xb3\xfa\x11\x65\x96\x40\x3d\x6d\xc7\x5a\x81\x96\x42\xf3\xfa\xb3\x4a\x2f\x07\xa2\xd6\x7e\xc5\x3c\x87\x07\xb2\x9a\x5f\xe9\xb0\x78\xa8\x29\x47\x68\x24\x7c\xfc\xd8\x9e\xde\xcf\x3a\x8f\x12\x47\x73\x4f\x8c\xa2\xd4\x7d\x76\xc6\x2c\xf9\x74\x19\x82\xc3\x20\x87\x87\xb0\x04\x02\x47\x61\xa1\x5e\x1f\x7d\x19\x68\x88\x65\x44\xd8\xb4\x1d\xa5\xed\x97\x3d\x9f\xa2\x2e\x04\xc6\x15\x74\x25\xa1\xcc\x43\x96\x35\x80\xd5\xbc\xcf\xc7\x5c\x17\x71\x27\x41\x3f\x08\x0c\x14\xfb\x1d\x76\x92\x7f\xf7\x91\x8d\xce\x95\xbe\x73\x6c\x6a\x7d\xc7\xc8\xd4\xfa\xfe\xe3\x72\xcd\x07\xa6\xd6\x6d\xc3\x72\xdd\x3e\x2e\xd7\x9f\x31\x30\x57\x1a\x87\xa5\xd6\x34\x28\xb6\xa9\xfc\x30\xd7\x7b\x0d\xe8\xde\x84\x17\xc0\xd8\x76\xf3\x03\xfb\xba\x85\x27\x3c\xe7\x63\xed\x49\x5f\x3b\x8e\x75\xa5\x3d\xc9\xeb\x0e\xa6\x75\xa5\xdf\x5d\xb7\xf0\xad\x2b\xdd\x60\x37\x6f\xf4\x92\x67\x7c\x30\xe4\xaa\x6d\x77\x2d\x19\x1a\xb9\x6a\xbb\x81\x88\x65\x5b\xc7\xf2\xbd\x7d\x25\x1e\xc1\x99\x60\x20\xb6\x60\x15\x82\x22\x49\x07\x67\xcf\x78\xc3\xf2\x14\x41\xfa\xcf\x39\x68\x18\xa0\x5e\xc2\x00\x5c\xc1\xe3\x9a\x9f\x15\xe4\x7c\xcc\xa8\xc3\xdb\xb0\xfd\x9b\x58\x70\xc4\xd5\xee\x07\xae\xf9\x2e\xa5\xfc\xfe\x30\x3a\x2e\xef\xf2\xe5\x89\x1c\x1c\x84\x59\x82\x1d\x54\xd5\xc9\x88\xd8\xa9\xb4\x4b\xd2\x0c\x30\x70\x00\x72\x98\xd9\xfb\x39\xea\xe9\xa6\x53\xb5\xaa\x85\xa4\xea\x12\x94\x90\x80\x0f\x36\xe3\xd0\xf1\x18\xec\x35\xb7\xad\xc1\x04\x1e\xf4\x9d\x47\x3e\x72\xaf\x52\x32\xdb\xba\x50\x43\xf4\x03\x7c\x24\xf6\x5d\x9a\xdf\xaf\x40\x0e\x37\xaa\x36\xed\x1e\xfb\x05\x56\x07\x6b\x1a\x80\xb9\x80\xab\x35\x44\x3b\xf8\x6f\x05\x33\xb7\xa5\xe7\x5d\x4b\x7c\xe6\xcc\x83\x3c\xa3\x84\x9d\xc7\xaf\x2e\x50\xd4\x34\xf9\xbc\x84\x20\x80\xdc\x88\x8d\xdc\x12\x02\xdd\x54\xaf\x2b\x39\x57\x98\xd6\xc0\xd2\xe2\xa3\x45\x09\xcf\x72\x45\x9e\x1f\x3e\xbf\x40\x1c\x20\x18\xa2\x04\x06\xc2\xe4\xa8\xbe\x66\x40\x61\xee\xbe\x48\x81\x19\x68\xd4\x2b\xeb\x1c\x07\x21\x89\xfe\x23\xe3\x71\xf8\x80\x02\x4d\x18\xc6\xb0\x40\x38\x8c\x2e\x55\x1c\x05\x78\x25\xe7\xf6\xa2\x3a\x8e\x23\x10\xc7\x38\x62\xcc\x1f\x80\xb9\x70\x42\xee\x15\x6c\x3e\x33\x8f\x41\x70\x8b\xaa\xd4\x20\x0e\x8d\xb1\x47\x31\xc6\x44\x68\x31\xb1\xf2\xb2\xae\x04\xe6\x08\x61\x99\x4a\xc1\x15\x58\x3a\x80\x41\xf0\x0b\x78\xb1\xae\x65\x1d\x81\x6e\xf6\x8c\x58\xaa\xe5\x04\x22\x8f\xbb\xbe\x30\x75\x69\x61\x36\x15\x3a\x96\xc2\x06\x77\xdd\x78\xe4\x52\x22\x60\xfe\x56\x99\x93\x3e\x8a\xc5\xa2\xa6\xf8\x05\x07\x6d\x61\x74\x67\x10\x1b\x0a\xa6\x3f\x16\xd1\x8d\x7b\x8b\x04\x4c\x16\x94\xf0\xcf\x06\x60\xc3\x40\xf4\x5c\x3d\x04\xd4\x32\xcd\xb0\xcb\x5e\x74\x74\x31\x7f\xae\xdd\x1c\x06\xd8\x8a\xbb\x25\x07\xe7\x26\xe6\x28\xd1\x1e\xa1\xdc\xe6\x36\xd1\x52\x32\x20\x00\xd0\x01\xb3\x23\xa2\x79\x37\x49\x5f\x92\xb0\x0f\x52\x2e\x7f\x4a\xeb\x9d\xc7\x04\xbb\x88\x65\x5c\xff\xc5\x96\x81\x03\xd0\xca\xcf\xd8\xb0\xee\x0b\x03\x46\xa3\x1c\xb8\x50\xad\x4c\x6d\xf6\x86\xe2\x27\xf9\x8f\xbc\xd8\x86\xd8\x29\x40\xee\x83\xc0\xb1\x66\xd8\xea\x50\x88\xb7\x64\x80\x81\x64\xa0\xa4\x2f\xb1\xe4\xc2\x6a\x45\xcc\x7e\x55\x59\x0e\x97\xdc\x3a\xfc\xb2\x86\x30\xd9\xb7\xca\xe1\xc4\xb9\xd2\x7c\x63\xc6\xb5\xd8\x2e\x8f\x83\xc9\x88\xe1\xf9\x0c\xb5\xa1\x19\x4b\xb9\xc5\xf8\x32\x38\x0c\x99\x8a\x02\x5c\x91\x3a\xd7\xb2\xbb\xd5\x84\x85\xfc\x06\x1a\xc4\xc3\x6a\xbc\xcb\x4d\x48\xe8\x74\xbf\x73\xc9\x2d\xbc\xc6\x15\x8a\x16\x03\x77\xa5\xba\x63\x7b\x71\x98\x89\x48\x1a\xb0\xa7\xa5\x34\x3c\x8a\xaf\xab\x4b\x63\x0c\x05\x37\x37\xf9\xca\x80\xe7\x36\x4e\x17\xb6\xe1\xec\x93\x47\xe8\xcd\x4d\xbe\x42\x3f\xaf\xdf\x74\xac\x40\x39\xe3\xc7\x25\x60\x4c\x84\x67\x0c\x2f\xdf\xdf\x94\xad\x74\x19\x2a\x3d\x6b\xb9\x46\x87\xd7\xfc\xd6\xd0\x32\x37\x81\xe8\x67\x4f\x0a\x0f\x2d\x77\x69\x6d\x11\xe3\x12\x0f\xce\xca\x21\x59\xfa\x94\xba\x85\xd6\xa8\x4d\xc4\xd1\xc1\x00\xff\x54\x76\x1b\xb6\xcd\x36\x36\xac\x31\xd7\x30\xd5\xf4\x6d\xa4\xf6\xf7\x75\x4e\xd9\x84\x28\x67\x9e\x4f\x40\xf7\x42\x56\x37\xf6\x62\x49\x36\x46\x43\x1f\x89\x4e\xe7\x4c\xec\x58\x22\x8d\x53\x00\x93\xcc\x65\x67\xa1\xa7\xc9\x12\x71\xba\xce\xdd\x4b\xa5\x0b\xc7\xfb\x53\x44\xc6\x76\x44\xe0\xe4\x50\xb9\x97\x8c\xe8\x2e\x2c\xe9\xb1\xf2\xbb\x1c\x2c\xbf\xf1\xd1\xd2\xc4\x40\xe6\x6b\x94\x1d\x32\xa0\x0f\x68\x88\x43\xc8\x39\x00\x87\x96\xd8\x33\xf8\x46\x26\x0b\xe8\x6e\xc0\xa3\xdd\x12\xc5\xaf\xe3\xc1\x5d\x8b\xa5\x75\x99\xb6\x30\x60\xcb\x12\x1a\x1b\xfa\x5e\xfc\x30\xf2\xc7\x6c\x71\xd8\x73\x7e\xac\x77\xf3\xd4\xc4\x34\xb7\xb3\x42\xc2\x7e\x7f\x8b\xcf\x07\x9a\x9d\x0d\x09\x9a\x1d\xd6\xff\xc2\xfe\x1e\x08\xd0\x15\x61\x3a\x78\xd4\xce\xd8\x06\xed\x54\x09\xb5\xcd\xcd\x40\x70\x72\x9d\x0d\x49\x97\xcc\xa7\x8f\x42\xfb\xa2\x4b\xdd\xfe\xe8\x46\xa3\x61\x37\x37\x8c\x8b\xbb\xc6\x74\xb4\x73\xc4\x07\xbb\x2b\x87\xa9\xd8\x4d\x26\x94\x8b\x08\xb6\x4d\xd3\xe8\x8e\x69\x8c\x08\xa4\x83\x33\xda\x31\x70\xc1\xcf\x10\x52\xf6\x96\x35\x3a\x8c\xc5\x51\xdd\xdf\x2b\x4a\xc8\x7e\xa3\xb6\x3e\x42\xce\xa5\x70\x53\x1f\x6a\x57\x17\x38\x50\xe4\x73\x10\x87\xf1\xb8\x78\xa0\x1f\x77\x93\xd9\xe5\x5c\x3d\x57\x35\xba\x3f\x40\xc9\x63\xa8\xac\x2b\x9e\x33\x8a\xf5\xe3\xf1\xe3\x00\x29\x74\x5e\xde\xe6\x95\x2e\x31\xd1\xa3\x2c\x7f\x36\xea\xec\xf2\x05\x73\x58\x78\x55\xa9\x99\x15\xab\x02\x71\xc8\xe2\x50\x96\xaa\x02\xdf\x41\x27\xb6\x2e\x65\xb9\x75\x51\x0f\xc6\xa5\xab\x17\x13\x5d\x2f\x10\x26\x81\x72\x5c\xfe\xf5\x7b\xf1\x67\x4b\xeb\x2f\x4e\xdb\x6a\x28\x75\xa0\xab\x11\x28\xc3\x45\x17\x90\x14\xfe\x9c\xe5\xb7\x7f\x01\xc1\x02\x4d\xab\xd1\x94\xf4\x58\xd3\x7a\x90\x19\xcf\xe5\xad\x74\x7f\x50\x5a\x78\xf1\x2c\x29\x0b\xa9\x42\xe9\x6b\xbd\xc4\x68\x12\x3e\x71\x98\xc6\xbe\x2e\x54\xb1\x52\x3e\x15\x1f\x04\x5d\x19\xae\x0e\x21\xcc\x88\x78\x01\x80\xb1\x02\xd1\xd3\xc0\x4b\xc0\x81\x3d\x40\x50\xeb\x54\x2f\x57\xb2\xca\x0d\xde\x07\x5c\x1d\xba\xff\x00\x26\x01\x60\xdc\x38\x25\x55\xa4\x1c\xbf\x70\xf9\x34\x82\x07\x11\xe0\x4e\x60\x08\x36\xa4\xf6\x46\x53\x7a\xb1\xc5\x3c\xf2\x86\x92\xc8\xeb\x09\xdc\x8b\x2c\x0d\x98\xa5\xbc\x4e\x16\x2d\x28\xfa\x6b\xe3\xea\x8b\x95\x36\x39\xc1\x22\x63\x12\xc9\xcb\x17\x0e\xc0\x87\x0e\x4f\x17\xf4\xb2\x94\x5b\x8a\x9c\x80\x74\xe1\x18\xc7\x15\x04\x73\x6c\x66\xb6\xae\x5c\xdf\x89\xf0\x80\x9c\xe1\x09\xc2\x1e\x3e\xee\x3f\x5a\x6b\xb4\xcd\xd9\x87\x44\x72\x19\x86\xc1\x87\x32\x32\x72\x6f\x6a\x54\xd1\xda\xa5\x7c\x5d\x69\x5d\xa3\x88\x3c\xb0\x3f\x4d\x2d\x2b\xd8\x30\xec\xd9\x8c\x4c\x0a\xe1\x71\x12\x22\xef\x00\xad\x55\xbf\x23\x8e\x26\xfd\xf8\x10\x3e\x0b\x49\xd1\x92\xf2\x87\xad\xa5\x7d\xab\x50\x7c\xb3\x7f\xf5\xf7\x98\xda\x0f\x41\x82\xf9\xd9\x51\x29\xa3\xea\xfe\x5d\x5f\xa7\x8b\xc1\xee\x0f\x76\x97\xe2\x03\xc3\x61\xcd\x38\xf3\x39\x93\xb5\x64\xdc\x66\x37\x91\xc4\xcc\xbf\xbb\xf0\x21\xf7\x65\x84\x06\x1f\xf2\x1f\x10\x7c\x2c\x8e\x76\x75\x2e\x2a\xff\x13\xc2\x71\x1e\xb1\xda\x4e\x91\xed\x22\xa1\xca\x8c\xfd\xe9\xe8\x47\xf3\x41\xef\x3c\x2d\x57\xce\x53\x72\x2a\x73\xf8\x08\x6a\xe3\xf1\xcf\x3f\xf3\x56\xd0\xc3\xa0\x91\x87\x68\x0c\xdf\xae\x77\xf0\x27\x22\x64\xbb\x2f\xd0\xb3\x4e\xa3\x81\x1f\xa9\x65\x5e\x9e\x97\x99\xeb\x27\xb5\x74\x3f\x0c\x20\x34\x4f\x41\x89\xa7\x87\x96\xbc\xf8\xf3\x11\x55\x82\x9f\xbb\x1b\xe5\xe9\xa9\x32\x4b\x1a\x18\xc6\x05\xdf\xde\xdd\x54\x70\xf8\xbe\x92\x79\x81\x23\x29\xfe\x22\x9e\x02\x34\x2a\xd4\x17\xa3\x80\x35\x75\xaf\xe5\xe9\xe7\x02\xfd\xc8\xa1\xb9\x83\xf0\x0d\xbe\x9f\xee\x5a\x78\xc9\x1a\xc7\xf9\xf7\x6b\xbc\x07\x71\x89\x70\xe4\xb4\x6f\xbd\x3b\x97\x39\x78\xbc\x02\x95\xc6\xe9\xd3\x56\xf4\x5d\xd7\x21\xef\x30\x97\x84\x32\x45\x5e\xd6\x08\x50\xb9\x8f\xe1\x90\x23\xf1\x04\x74\xc3\x94\x80\xfc\xad\xac\xca\xe7\xba\x3a\xce\x32\x95\xbd\x54\x1b\x87\xd7\x1e\x10\xea\x11\xbe\xfe\x55\xa5\x3f\x6c\x29\xb6\x05\x60\x4d\x28\xb6\x12\x9e\x27\xb1\x9e\x58\xe7\xfc\xaf\xe7\x2f\xaf\xae\x5f\x5d\x5e\xfe\x74\xfd\xe6\xe2\xff\x9e\x73\xbf\x7f\x34\x00\x9f\x28\x0a\xdd\xc9\x5e\x79\x0c\x07\x71\x24\xde\xf5\xe2\x3b\x4f\x6f\x20\x7a\xec\x0e\x63\x7f\x32\xee\x69\x7f\xe6\xe6\x0c\x23\xee\x29\xc2\x15\xec\x4a\xbd\x36\xf4\x4b\xa0\xd5\xb8\x97\x46\x4f\xfd\xc5\xb2\xc7\x72\xd4\xfc\xaf\x80\x68\x71\x7e\xeb\x50\xfb\x0c\xa5\xd7\x1d\x1d\x1c\x6c\x36\x9b\xe1\xe6\xdb\xa1\xae\xe6\x07\x57\xaf\x0f\xce\x2e\x5f\xec\x43\x2c\xd2\xfe\xb7\xfb\x18\xcb\x72\xe0\x8f\x23\xf8\x7d\xe1\xa9\xe1\x61\x64\xc7\x32\x9c\x3b\x35\x49\xc4\xee\xf7\xc1\x81\x88\xd1\x56\x73\x03\x66\x01\x90\x84\x98\x32\xf4\x50\x94\x1a\x8f\xc9\x12\xb2\x5c\x50\x5c\x99\x3d\xfc\x1f\x88\x98\xc4\x08\x51\xd5\x5c\x74\xcb\x97\x4f\x87\xf5\x42\xd6\xe8\xd9\x61\x5e\xd2\x77\x61\x2c\x41\x12\x0f\x6d\x41\x83\xa0\x09\x0f\xa6\x76\xac\x20\x4d\x0c\xeb\x40\xbe\x54\x6f\x6a\xb9\x5c\x8d\xba\xa0\xa7\x79\x18\xe3\xd0\x17\x17\xbf\xfc\x22\xce\xec\xe2\x2e\xf5\x86\xa0\xeb\x2d\xb9\x2c\x99\xdc\xf0\xa1\xdc\x40\x32\x19\xf7\x88\x87\xe7\xbf\x49\x23\xfc\x64\x95\x66\x47\x8c\x70\x49\x20\x58\x98\x72\x7a\xe4\x70\x8c\xae\x74\x69\x10\x2d\x10\xd3\xc3\xc4\xa0\x1f\x99\x2a\x14\xd9\x80\x42\xbe\x74\x12\x09\x95\x51\xc2\x6c\x0d\x40\x98\x91\xaf\x03\xda\xc2\x0a\x9f\xe2\x46\x17\x04\x25\x55\xa9\x6c\x4d\xb2\xd0\xac\x52\x7f\x5f\xab\x72\x0a\x71\x5d\x73\x59\x4d\xe4\x1c\x84\x28\x06\xd7\x85\x51\xfd\x40\xda\x51\x9e\x2e\xd4\xf4\x46\x8c\x39\xae\x11\x04\x1a\xba\x58\x28\xe5\x23\x9d\x48\x26\xc3\xf6\x87\x78\x50\xc2\x39\xca\x62\xa4\x29\x92\x30\x11\x6b\x91\xc3\x5c\xfc\x6c\xd0\xc3\x17\x5d\x39\x00\xa9\x4c\x7a\x38\xaa\x2c\xa6\x4e\xee\x19\x63\x7a\xed\xd1\x3a\x1a\x93\x03\xf8\x67\x66\x3d\x81\xc0\x2b\x65\xf6\x12\xb4\x17\x7b\x51\x42\x8c\xa3\x6f\x05\x45\xf3\x1e\xbf\xba\x10\x13\x50\x86\x97\x56\xcc\x2e\xf2\x7f\xd8\x86\x3a\x79\xf3\xef\xeb\xbc\xba\x31\x43\xf1\xc6\x93\x0c\xd0\x6a\x96\x47\xca\x2a\x2f\xb6\xde\xa0\xc4\x52\xa2\x3a\x57\x70\xbf\xdf\x0f\xc5\x74\x6d\x6a\xbd\x14\x92\xe1\x47\x7b\x60\x03\x6a\xfe\x54\x96\xe8\x6f\xe9\xba\x00\x56\xb3\x7b\xa6\xda\x3c\x8d\x32\x6c\xba\xdb\x5e\x16\x90\xb7\x73\xd3\x92\x6f\xf3\xab\x8f\x5c\x17\x8c\xba\x29\x9f\x4a\x2f\x32\xa9\x31\xe3\x40\xa3\x29\x8c\x91\x3a\xe7\xce\x28\x4e\x3d\xaa\x14\x63\xe6\x7c\x6c\xca\xb0\xe2\x2a\x48\xf3\x89\x1a\x35\x56\x94\x35\x32\x71\x7e\x6a\x7c\xba\xbf\x8c\x62\xae\x79\xb2\x87\xcc\x01\x25\xe2\xc0\x20\x58\xc4\x0c\x92\xab\x83\x41\xce\x90\xdf\x5f\xa1\xc0\x18\x94\x9b\x21\xa3\x7b\xd8\x78\xb9\x42\x4e\x43\x87\x4a\xf3\xbd\xa9\xf5\x8a\x9d\x2d\x5e\x1e\x85\x97\xc9\xec\x36\x73\x6d\x52\xb9\xeb\x48\xff\x1f\x2b\xfe\xd3\x26\xc6\x17\x06\x9f\xae\x93\x1f\x23\x50\x85\xc3\x97\xf9\x97\x91\x47\xe8\xaa\xd2\x2b\x97\x61\xc6\x97\x88\x3c\x63\xfc\xd3\x46\x02\x17\xaa\x7a\x47\x16\x19\xf7\x8e\x0d\xd8\x3b\x57\xf5\xfd\x21\xce\x19\x45\xc5\xde\x39\x63\xc1\xc5\xc6\x6d\x72\x4c\x00\x41\x2d\x64\x74\x59\xac\x16\x15\x0c\xad\x8c\x9b\x00\x91\x2f\x54\x86\x5f\xdb\xf6\x5a\xc3\x52\x00\x64\xc0\x8d\x19\xa2\x96\xc1\x4c\xf5\x78\x68\x3f\x8c\x7d\xed\x91\xd0\xdb\xae\x76\x2d\xa4\xdb\x1a\x16\xaa\xa6\x7d\x8b\x81\x00\xbc\x1f\x6a\x7c\x32\xc6\x24\x86\x8d\xd7\x84\xfd\x2a\x9e\xed\x2e\x36\x8a\x5e\xe3\x59\x4d\xb7\x9e\x23\x96\xb8\x08\x70\xb7\x93\xba\xde\x18\x68\x87\xa4\x29\x97\x59\x69\xbc\x5b\xf0\xb8\x8a\x73\x9e\xfe\x0a\x4a\xcf\x03\x4e\x99\xa7\xd0\x94\x06\xef\x49\xc3\x87\x0d\xe5\x18\x98\x71\x8d\xf0\xc1\xfd\x98\xa7\x85\x2c\x5f\x03\x68\x79\xcc\x44\x46\x8d\xac\xfd\x8e\x5d\x34\xfb\x15\x32\xff\x78\x18\x0e\xb7\xc1\x1b\x6c\x2b\x20\x1b\xa6\xbe\xc3\x6e\x4f\xfa\x62\x8a\x5a\xc9\x9b\x95\x5a\x77\xe2\xb7\xfd\x78\x4f\x80\x5b\x1c\x4a\xfd\xaa\xb1\x32\xec\x8d\xcf\x25\x2f\xe8\xa5\x64\xa3\x25\x14\x16\x90\x5b\xd3\xbf\x6e\xb1\x00\x4a\x54\xc2\x92\xdb\x86\xfb\x77\x18\xcc\xe4\xab\x69\xb7\x93\xd7\x77\x0d\x27\x8a\xd2\x27\xe8\xad\xdc\x31\x9e\x10\x43\xa2\xc4\x29\x40\x6f\xb2\x90\x7d\x8f\x55\x63\xb9\xea\x23\xc2\xc4\xdb\x22\x42\xe7\x23\xea\xf6\x4c\x57\x81\xca\xc5\x39\xf9\xbe\x91\x38\xeb\x6c\xb4\x5e\x4f\x6b\x9b\x01\x01\x2a\x15\xc9\xf8\x05\x00\xe4\xc9\x32\x0b\x44\x64\xb9\x15\xa0\x0d\x56\x60\xb3\xab\xb5\x88\xfa\x80\x58\x05\x8f\x5e\x80\x43\x0f\x50\x9f\xe9\x75\x99\x3d\x1a\x0a\x71\x1c\x88\xd0\x18\xa0\x1c\xab\x67\xe2\x11\xf5\xfa\x91\x98\xe6\xd5\x74\xbd\x74\xde\x5f\x10\x6e\x63\xd6\x0a\x85\x45\x48\xe4\x68\x34\xef\x90\x70\x62\x99\x0f\x83\x6d\x19\xd7\x38\xb1\x16\x5f\x7e\x9f\xca\x1f\xe2\x05\xe8\x61\xca\xde\x7a\x89\x1a\x90\x46\xd8\x95\x23\xb5\x37\x1a\x92\xb1\x99\x7f\x47\xa1\xf5\x6a\x20\x64\x86\x51\x89\x96\x5c\xbd\x50\xcb\x16\x20\xd8\x38\x97\xa5\x74\xee\x6a\x0b\x5d\x64\x42\x97\x10\xfb\xef\x27\x86\x84\x75\x4b\x6d\x03\x9a\xf5\x89\xb2\x9f\xb0\x97\xa0\x26\xdd\x07\x0e\x1d\x8d\x64\xf6\x4e\xc6\xc5\x2f\x1c\x9f\x35\x50\xa7\x76\xc2\x0d\x46\xde\xf8\x75\xd8\x72\x2d\xe9\x6a\x24\x52\xd9\x95\x42\x3e\x37\x0c\x6a\x8c\xd3\x24\xc8\x53\x01\x48\x0b\x9b\xdc\x28\x06\x0a\xc7\xba\xb5\xf3\x96\x0c\xc7\x43\xdc\xa3\xf1\x2b\xdb\x86\x0c\x60\x21\xc6\xe0\xed\x80\x5e\x6f\xe3\x4c\x39\xb1\x0c\xfc\xe1\x61\xc2\x7d\xd0\x44\x5e\x7b\xd0\xdf\xd0\x8c\x50\xa3\x8b\x95\xdd\x5f\xf8\xbb\xaf\xf8\x27\x98\x68\x42\x36\x40\x54\xb3\x79\x11\x10\x43\x54\x1d\x91\x01\x38\xa0\x40\x97\x09\x9c\xdd\x15\x3c\x43\xac\x37\xcb\xf3\x42\xe1\x16\xb1\x6d\xaf\x35\x03\x7a\x9b\xd7\x72\xb7\xc6\xa8\x3d\x09\x0a\x88\x56\xdd\x95\xde\xe5\xef\xdf\x33\x0d\x77\x2a\xbb\xee\xea\x7d\xa2\x7c\xba\xc7\x10\x24\x35\x00\xff\xde\x77\x7c\xe7\xa7\xe2\xe3\xf8\x9e\x5f\x6b\x54\x4a\x16\xf1\x3d\xbf\x9d\x1c\x5e\xf7\xfc\x78\xb3\x56\xc7\xd7\xc9\x53\x63\xef\xf0\xc1\x83\x44\x8e\xe2\x0b\x3b\xd6\x96\x05\xed\xce\x0f\x68\x71\x0b\xfa\x93\x89\xce\x0b\x55\xad\x0a\x59\x13\xd6\xfa\xd4\xf9\xaf\x06\xad\x42\x7a\x1f\x0f\x58\x89\xb0\x63\x5b\x41\xb4\xfd\xb7\xe1\x3a\x9b\xb4\x54\xae\x01\xd1\x04\x6a\x47\xe8\xcb\xf0\x64\x90\xee\x30\xbb\xa4\xdf\x40\x88\xf3\x11\x09\x93\xf4\xf0\x3c\xaa\xbc\x07\x89\x92\x85\x38\x0f\x12\xa5\x38\xc2\x8a\xe1\xc9\x61\xc0\x79\xf2\x45\x4a\xb5\x11\xe7\x7d\xc4\xbc\x76\x32\x2a\x13\x4a\xa1\x51\x81\x02\xcc\x43\xf2\x0c\xe3\x8f\xc3\x17\x92\xd7\x9c\xc5\x88\x23\x7c\x0b\x5f\xc3\x72\x7c\xe2\xdc\xf7\xff\xf9\x71\x40\x4d\xf7\x6f\xf9\xb8\x84\x8f\x24\x63\x89\x75\xf8\x43\x5b\x54\x66\x84\x33\x8a\xfa\xb3\x2b\x8d\x23\x4d\xd0\xd5\x07\x5f\x7d\x85\xea\x68\x88\x4f\xc7\xa3\xf5\x56\x55\x5b\x4c\xb6\x01\x8e\xd4\xa9\x22\x02\x35\x7b\xa2\x52\x46\x17\xb7\x8a\x94\xd9\x28\x65\xe8\x12\x32\x75\x88\xb7\x6a\xf2\x63\x5e\x7b\x43\x36\xe2\x35\x90\x4f\x3c\x14\x20\xa8\xe2\xa0\xc2\x26\xdf\x75\x4b\x38\xe4\x54\xe9\x7f\xff\xc3\x1f\x9e\x3e\x79\xf2\xf4\xc9\x1e\xac\x24\xef\x22\x96\x28\xd6\xbd\x9d\xfd\x2b\xd4\xdc\xef\x13\x5a\xb3\x28\xf5\xbe\x5d\x22\xfb\x94\xba\x04\x0e\x09\x91\xa6\x56\xc3\x35\x00\x14\x93\xdb\xc9\x80\xdf\xd9\x71\x0e\xf9\xc1\x52\x13\x0c\xb2\xac\xe6\x11\x68\x1d\xbb\xfa\x50\xce\x0a\x57\x92\x78\x07\xfa\x62\xd3\x53\xb6\xb8\x88\x94\x67\xef\x03\xfa\x03\x88\xf0\x2f\xb3\x25\x35\x00\x41\xa5\xb3\x11\xa1\x6b\xfc\xa4\xa3\x56\x85\x8a\x03\x56\x53\xd8\x79\x68\xeb\xa7\x9d\xad\x01\xc2\x48\xee\x45\xe5\xc3\x8d\x1f\x25\x70\x2e\x0e\xf4\xc4\xe3\xc7\xe2\x21\x75\xb5\xf5\xb4\x6d\x53\x99\xec\xd9\x5a\x3b\x8e\xaf\xbc\xcc\xd4\x87\xcb\x19\x95\xb5\x17\xec\xfd\xa7\x69\x9b\x82\x67\xf9\x0e\x83\x0d\x40\xab\x43\xdb\x62\x8c\xfb\x81\x78\x04\xb2\x62\x0a\x0b\x98\x1b\x51\x29\x50\x37\x82\x4b\x26\xba\x2b\x83\x44\x82\x99\x2e\xcc\x50\x5c\xcc\xc4\x56\xaf\x7b\x95\x12\x8f\xc4\xd7\xe2\x91\x51\xca\x45\x04\x0c\xdc\x0b\x94\x55\x85\x84\xe9\x71\xf7\x0e\xe7\x10\x90\x7e\x12\xb9\xea\x10\xa8\xf5\xae\x7c\xca\x7a\x5b\xc1\x88\x12\xf2\xba\x38\x11\x6d\x28\xde\x28\x85\xd9\x34\x17\x75\xbd\x32\xa3\x83\x83\xd9\x64\xb8\x54\x07\x00\xcf\x84\xe9\xf1\xf6\x9d\x1e\xdd\x76\x00\xb2\x7c\x33\xa7\x0b\x9f\x47\x33\xfc\xb7\xd3\xda\x15\xae\x05\xee\xbf\x8f\xd1\x2f\x1c\x5b\x90\x5d\xac\xe8\xe0\x8d\x74\xe1\xbf\xc8\x26\xdf\x46\xe6\x63\x2a\xee\xd0\x6f\xbf\xd9\x55\xd9\xb9\xd7\xc1\x51\xaf\xc9\xff\xe2\x5d\xbe\xd7\x76\x42\x5a\x79\x23\x9f\x6d\xc3\x64\x10\x46\xaf\x93\x3f\x19\xe7\x42\x8b\x12\x89\x9e\x18\x58\x11\x79\x3b\x92\x57\x92\x93\xdf\x5a\x4f\xcc\xb9\xaa\xff\x4a\x29\xb7\x9d\x68\xee\x15\xdf\x91\xa0\x41\xab\xa1\x19\x19\x7c\x6f\x89\x12\x3f\xc5\x80\x6d\x8c\x93\x33\x82\x7d\x12\xcb\x34\x0c\x94\x7e\xb6\xfe\xe9\xfc\x87\x50\x07\x0f\x76\x2c\x3b\x83\xc8\xb0\x80\x7d\x18\x55\xe3\x2f\x30\x9c\xcd\x55\x8d\x59\x32\x1f\x88\xc0\x58\x8c\xaa\xfb\xb7\xb2\xe0\xf2\xb9\x74\x0d\x61\xad\x7a\x26\x7a\x46\xd5\x3e\xe2\x05\x91\xe2\xc1\xed\x88\x3f\x76\x9b\xa2\x77\xe8\x83\x4a\xfa\x92\x3c\x8c\x7b\x0e\x6c\x5f\xcd\x66\x6a\x4a\x0e\x35\xd2\xae\x18\xbd\xea\xc5\xe9\x80\x6e\x65\xe1\x35\xd3\x7c\x7c\xfb\xf7\x68\x25\xfa\x9a\xb5\xb4\x33\x7e\x91\xb4\x14\x3d\x96\xcd\xba\xa8\x1b\x04\x43\x8e\x00\x68\xaa\x6f\x10\x10\x75\x2f\xe9\xd0\x84\xc8\x98\x96\xbe\x23\xe9\xb8\x93\x38\xbd\xcd\x7e\xb6\x55\x64\xdd\x26\x76\x7a\xaa\x4b\x44\x7b\x8c\xb5\x52\x8e\xd9\xa6\xa5\x7e\x13\x4e\x1a\x31\x51\x60\xab\xf4\xe2\x5f\x0c\xc2\x19\x83\x6b\xa0\x63\x83\x07\xb8\x7b\x73\x95\xa5\x5f\x1d\x8a\x7f\x31\xc4\x49\x91\x38\xc6\xb0\x60\x1a\x3d\x80\xda\xcd\xe7\x79\x29\x1b\x58\xa7\x42\x56\x7a\x5d\x66\x03\x30\x44\x92\xd6\x0f\x4f\x8b\xfe\xde\x10\x19\xee\x1b\x32\x6c\x7f\x0e\xd3\x1d\x08\x37\xea\x61\x9f\xb2\x89\xfb\x98\xba\x50\xe0\x6e\xff\x2c\xab\xd0\x45\x94\x4e\x15\x5e\x9d\x46\x02\x2a\x0a\xd9\x78\xa4\xa7\xaf\x87\xca\x31\x52\xba\x40\xf2\xe5\x91\x87\x6c\xd3\x3b\xea\x01\x7e\x18\xae\x98\x46\x29\xc8\x4b\x14\x70\xbd\x3e\xa7\x67\xd1\x3a\xcf\x7d\x82\xeb\x18\xc9\xc1\x8a\xfc\xc9\xb7\x3f\x6b\x18\x53\x27\x32\x58\x7d\x7c\x6e\x98\x5a\xf4\x8e\xd1\x7e\x48\x2e\xec\xae\xc9\x7a\xd6\x28\xdd\x0e\x06\x7e\x55\x6d\xbd\x51\x9c\x14\x68\x0e\x5b\xd5\x4f\x08\x2a\x82\x24\x9a\xa8\xc1\x87\x92\x05\x41\x01\x0e\x78\x0c\xa8\x4a\x4e\xf4\x5e\x9b\xd2\xdf\xbb\xf7\x82\x10\x7f\x4e\x5d\x58\xdc\x12\xd9\xb5\x26\xd6\x66\xd1\xef\x74\xaf\x6f\x1c\xdf\xcd\x81\xb1\x5f\xe8\xa6\xef\xe3\xda\x1b\x45\xfc\x56\xa2\x58\xf0\x30\x75\xad\xc5\x2b\x9f\x7d\xa9\x39\xd7\xde\x37\x3c\x16\x2e\x20\x15\x44\xfc\xe8\x37\x74\x90\xf9\x03\x9a\xd2\xf7\x99\xa3\x13\x3e\xf1\x9e\x33\xa7\xe1\x4d\xab\x13\x4d\x26\x6b\xd9\xf4\x03\xf9\x5d\x8c\xef\xce\x3d\x3b\x0e\x0d\xf9\x9d\xad\xf0\xea\x43\xad\xca\xcc\x34\x82\x4e\x3a\x0c\xed\xe9\x70\x35\xd8\x42\xdc\xf8\xfb\xd9\xdd\x89\xed\xa4\x0b\x03\xd9\x1d\x1e\x69\xbf\xf2\x33\xb0\xf8\x1a\xf4\xb9\x22\xa0\xdf\xd9\xc5\x41\xf7\x1a\xd9\xfb\xdc\xa5\xfa\xcd\x93\xa7\xdf\x1e\xbc\x3d\xdb\x6f\x2e\xd9\x7d\xfb\xea\xe9\xd3\x27\xff\xe6\xd2\xbe\x08\xbf\x88\x21\x01\x56\xb2\x7c\x2f\xec\xb3\xff\x59\xb8\x77\x2f\xdc\x30\x50\xff\x0d\x97\x6c\xe8\xdc\xa0\x6d\x45\xb8\x10\x93\xf3\x97\x67\xd7\x3f\x9e\xff\xe7\xe9\xe5\xd9\xf9\x1b\xcb\xf3\xbf\x1b\x88\xa7\xdf\x0e\xc4\x37\xff\x3e\x10\xdf\x7e\x83\x5e\x14\x57\x72\x32\x20\x2c\xa6\x81\x38\x37\xd3\x81\x78\xb3\x92\x53\x85\x8c\xfb\xea\xf8\xf5\x95\x23\x20\x8e\xc4\x37\xdf\x7c\xe7\x62\x57\x20\xa0\x23\xdd\x26\x56\xce\xd9\x19\xfe\x21\x1e\x3f\x16\xbd\xb4\x16\x38\xba\x6e\xf2\x32\xd3\x1b\xa2\xee\xe2\x2b\x5e\x10\x2e\x2e\xa8\xd7\xe1\xb0\xbd\x9b\x3a\xaf\x1b\x45\x6d\x38\x78\xbe\x88\x74\x23\xa4\xe3\x05\xa0\x58\x7e\x7c\xf0\xe0\xe0\x40\xbc\x55\x93\x9b\xbc\x16\xda\x0a\x06\xf6\xca\x01\x89\x28\xd6\x98\x1d\x74\x5c\xab\x0f\x35\x8c\xfc\x98\xa7\x47\xa0\x34\xc3\xb4\x8f\x2c\x11\x0c\x60\xc5\x70\x85\x4a\x19\x5b\x72\x8c\x01\x18\x58\x1b\x7d\xf1\x2e\xce\x91\x62\xce\x29\xe6\x68\x4a\x95\xc6\xd2\xc1\xef\x0e\x84\xd1\x98\xe0\xb3\xec\xd5\x14\xcb\x30\x64\x33\x72\xe5\x5a\xf5\x09\xf3\x61\xeb\xa4\x13\x01\x2a\xaa\x68\xac\xec\x83\xdc\xbc\xaa\x94\xa9\x35\x28\x87\x11\x73\xf4\xe2\xfc\xbb\xaf\x07\x1e\x44\xd9\xc5\x16\x69\xee\x68\x2c\x5c\x34\x19\xe2\x02\x2a\x60\x54\x1e\xdd\xc9\xd2\x99\x50\x90\x09\x6e\x7d\x7e\x74\x97\x59\x88\x58\xc7\x7c\x6f\x80\xb8\x3a\xad\x87\xe2\x7f\xcb\x95\x2c\x95\x1d\x81\x4c\xe9\x79\x25\x57\x8b\x7c\x6a\x89\x19\xbb\x7c\xcd\x80\xf2\x53\x91\xbc\xd7\xff\xaf\xf5\xb7\x4f\x9e\x3c\xd9\xf3\xd9\x80\x2b\x35\xd5\x55\xa6\x32\x41\xf4\x8a\x2d\x0e\xe3\xda\xa8\xe7\xe4\xaa\xcd\xd6\xe9\x99\x6d\xf1\x7d\x06\xb3\xff\xb0\x63\x67\xfc\xf2\x8b\x48\x87\x33\xfa\xfd\x17\xf1\xa7\xc6\xb3\x3f\x1f\x89\xa7\x4f\xd9\x89\x73\xb9\x52\x95\x84\xa7\xdf\xd8\x81\x28\xd6\x99\x32\xc2\xcf\x5e\x98\x3c\x1c\x69\x6f\x8a\x9f\xe5\x98\x78\x14\x62\x70\x60\x81\xb9\x9c\x1a\xe2\x35\x24\xfd\x2a\xc5\x8d\xda\xae\x20\x81\x11\xe5\xc7\x49\xbc\xee\xc2\xbc\x7b\xc1\x1d\x32\x85\x89\x23\xfa\xe2\x10\x7e\x72\x27\x17\xd4\x9a\x50\xa9\xa3\x23\xd1\x43\x5e\x0f\xba\x4f\xfe\x72\x78\x6b\x2f\x8d\xf6\xe6\x1c\x69\x56\x6c\xb1\x95\xac\x8c\xba\x28\xeb\x7e\x54\xb0\xbf\x37\x10\x4f\x9f\xec\xe1\x30\x04\x11\xf3\xd5\xf1\xe9\xf9\xc9\xf1\xeb\x6b\xe2\x54\xdf\x12\x84\x7e\x78\xfe\xc3\xf1\x6b\x2b\x77\xc2\xc1\x35\x9c\x55\x7a\x79\xba\x90\xd5\xa9\xce\x54\x3f\xaa\x4b\x2b\x9b\xbc\x43\x31\xd7\xb8\xca\xab\x18\xe8\x37\xe8\x1b\x31\xd4\x3c\x24\x69\x85\x24\x7a\x74\x1e\xb3\x5d\x3e\x72\xb0\x6e\xed\xe1\xfc\xa3\x10\xc9\x80\x40\x49\x23\xd1\xd3\xe5\x49\xa8\xdf\x73\x7a\x6f\x07\x78\x94\x16\x70\xc9\x1a\x1f\x30\x2d\x39\x4f\xc9\x36\x12\xef\x7a\xb5\x5e\xf1\x65\x59\x82\x17\x7b\xad\x57\x3f\xaa\xad\x9d\x5e\x43\x3f\x3d\x0b\xa1\xdf\xaf\xa4\xa9\x55\xef\xbd\xf3\xa2\x9e\x46\x24\x3e\xab\x63\x69\x2b\xda\xfa\x16\x97\xb9\x67\xf7\x4e\x8a\x75\x45\xad\xee\xea\x29\xe4\xd6\x6c\xed\xf7\x8f\x6a\xfb\xf3\x8a\xfe\x0e\x69\x38\xdb\xfa\xfd\xa6\x96\xd5\xe7\x4d\xe9\x69\x42\xe4\xce\xbe\x43\xa9\x5f\xd5\x7b\xfa\xce\x6f\xd9\xff\x9f\x01\x17\xf7\xd7\x0e\x00\x52\xb9\x73\x04\xb0\xd8\xaf\x1a\x02\xf7\xa5\x5f\x35\x06\x28\x53\x1f\x88\xab\x4a\x4e\x6f\xbc\x2f\xfc\x46\xf5\x6e\x41\xc0\xad\xc8\x7d\x3f\x13\x32\x70\x53\x82\x10\x84\x13\xc9\x3e\x45\x46\xb1\x90\x06\x44\xac\x1f\x5d\x31\xaf\x34\x4c\xa0\x31\xdd\x47\xa4\x3b\x19\x3d\x61\x2f\x1f\x20\x82\x77\xe6\x33\x9d\x4d\xf5\x72\x29\x4b\xcc\xc6\xec\xd4\xa1\x15\x25\x1e\xf5\x11\xb5\xcf\xf3\x4a\xcd\xf4\x07\x38\x18\x8c\x18\x3b\xaa\x63\x9f\x7b\x4c\x57\x10\x78\x4c\xc4\xc0\x56\xd9\x9f\xae\xeb\x01\x84\x83\x0c\x28\x02\x74\x5f\x02\x04\x40\x3d\x1d\xee\x61\x44\x6d\xbd\x00\x80\xe0\x52\x8b\xe9\x42\x42\x0e\xaa\x0a\xb3\x3f\x19\x55\xf9\x74\xd6\xec\x4c\x71\xfd\x3f\xc5\xcf\x44\x4e\xb4\x5c\xe4\xe6\x2f\x86\xd3\xba\x2a\x7e\x54\x60\xa5\xe2\x8f\x65\x51\xb7\x3c\x5d\xaa\x5a\xfe\xa8\xb6\x7b\xe2\xf1\x63\x8a\x7f\xa1\xda\x08\x25\x68\xff\xb2\xd7\x9b\xbf\xaf\xf3\x5b\x59\x50\x00\xf2\x71\x51\x7f\x5f\x21\xf0\x98\x93\xbf\xd8\xa8\x8a\x87\xad\xad\x79\xfc\xb8\xa5\x35\x11\x52\xda\x55\x25\x4b\x03\x6e\x05\x34\x97\xb5\x5e\x09\x16\x08\x62\x50\x23\x45\xa2\xa4\x3d\x45\x52\x37\x03\x77\xe7\xe2\x09\xc6\xda\xcc\x23\xcd\x74\x1c\x89\x2c\x62\x2b\x46\x69\xca\xe2\x04\xc8\xcd\x37\x2e\x35\x70\x1b\x63\x49\x12\xfb\x86\x43\x70\x98\x32\xcc\xc3\x4e\x4a\x96\x41\xdf\x8b\xce\x39\x06\x50\xb6\x53\xa1\x5d\x7e\x2f\x42\x58\x36\x45\xa2\x01\x38\x50\xbd\xae\x84\x0b\xd6\x13\x13\x65\xea\xfd\xf9\xda\x6e\xb9\xa5\xce\x54\x61\xef\xc3\xe5\x4d\xe4\x68\x96\xcf\x21\x59\x71\x08\x65\xe1\x92\xef\x42\x1a\x31\x51\xf3\x75\xf9\xec\xbe\x93\xd9\x7d\x33\x7e\xd0\xe6\xa5\x96\xee\xa9\x16\xd9\x15\x06\x3f\x49\x4b\xd7\xb5\xd5\x78\x29\x72\x53\x0f\x1c\x33\x5d\xe5\x37\x6a\x7b\x0a\xb7\xa8\xa3\xa3\xf8\xa6\x78\xb8\x73\x4c\xed\x40\xfa\x71\x94\x35\x1f\x4c\x4a\x71\x6a\xa5\x7e\x08\x57\xf7\x7d\xf8\x7f\x38\x7c\xe7\x65\x76\xd7\xe0\xdd\x6b\xe7\xe0\xd1\x32\x0a\x8e\xa6\xc4\xf6\x2c\xa7\x75\x4c\x12\x73\x46\x29\x59\x89\x8b\x17\xe7\x28\xaa\x27\x99\x58\xf8\x85\xde\x9b\xfc\x5b\x26\x65\x0f\xdc\x0e\xf6\x9f\x1e\x36\x1a\xc1\x92\x8b\x43\x33\x30\x75\x26\x7c\xd0\x4d\xa8\x73\x2d\xbc\x51\xdb\x4c\x6f\x4a\xb0\x3a\x6d\x14\x24\x8c\x83\x6c\x61\xf6\x50\x0a\x04\xa6\x00\x0d\x40\xd0\x67\x70\x0b\x54\x1f\x72\x08\xe1\x92\x55\x91\x43\x3c\x1b\xef\x41\xdb\x0a\x7a\xd8\x5c\x41\x69\xb3\xf1\x94\x1e\xc5\xcf\xdb\xb3\xa5\x3b\x39\x80\x77\xf2\xd6\xc7\xee\x01\xa6\x1a\x25\x70\xf4\x78\x53\xc1\x33\xd9\x0e\x44\xd2\xe2\x60\x88\xff\x84\x64\xe6\xdf\x6b\x3d\x2f\x14\xea\x66\xc4\x95\xd6\x85\xb1\x97\x86\xdb\xdc\x5e\xd9\x38\x87\x80\xbb\xf0\x6d\x2e\x85\x14\xa7\x10\x20\x86\x4a\x1d\x4b\xc2\x63\x0c\x8e\x6d\xa1\x71\xb8\x74\xac\xf4\x0a\x71\x5a\x9c\x7f\xc4\x38\x53\xb5\xcc\x8b\xb1\x77\x8c\xa0\xbc\x02\xe0\x64\x64\x84\xbc\x95\x39\x84\x56\xc6\xe9\x09\x5d\x36\x6b\xd2\x22\xd8\x4a\xa5\xae\x07\x2c\x23\xc1\xaa\x90\x08\x62\xdf\xb8\xcd\xc3\xf9\xe8\x6e\xfd\x04\x81\x8c\x7e\xd3\xb2\x60\xd9\x4c\xbb\x42\xd7\xba\xf6\xa5\x03\x2c\x69\x9c\x61\xf6\x02\xfe\xdc\x5e\xda\xc2\x18\x35\xe5\x05\x0c\x65\xa9\x31\xde\x3b\x8e\x4c\xb1\x0f\x9d\xc5\x86\xae\x9f\xae\x64\x72\x39\xed\xd9\xc1\x46\xc5\x11\x14\x48\x42\x4d\xf1\xe1\xd0\x16\x4a\x6d\x68\x1e\x0d\xdd\x09\x89\x00\x27\x4d\x18\x17\x76\x7f\xf1\x51\x34\xb5\xac\xd7\x66\x40\x19\xf8\x86\x14\x1d\x4d\x7c\xa7\x9c\x37\x65\xc2\x30\x46\x6e\x10\x8f\xbb\x95\xf4\xc3\xd6\x94\xae\x0d\x55\xfe\x6f\x94\xdc\xf5\x8a\x39\x12\x3a\x36\x7f\x06\x03\xe4\x40\x1b\x5a\x75\x22\x11\xd2\x24\x9e\x38\xf7\x13\x57\x58\x6c\x0f\x84\x5a\xb0\x71\x8b\x10\xf3\x3f\xe7\x34\x4c\x62\x2f\xa8\x59\x77\x8a\x35\x1f\xe3\x26\x7d\xc6\x49\xd2\x36\x1a\x3b\xa5\xa0\x8f\x6e\x74\x1f\xfa\x62\x9d\x49\x96\xa9\x64\xb7\x72\x8b\xe1\xf2\x5c\xb1\x55\xcb\x57\x6c\x6e\x5c\x1e\x70\xbb\x76\x29\xc4\xd9\xb2\x01\x86\x46\xea\x68\xe8\x5b\x55\x6d\xaa\xbc\xae\x01\x68\x27\x2f\x22\xa5\x9e\x0f\xf7\x23\xd0\x9d\x74\x0e\x3d\x68\x99\x97\x42\x76\x0c\x7f\x98\xaf\x78\xf7\xec\xc4\x54\x69\xc4\xcf\xdc\xe7\x73\xe7\x65\xb6\x17\xc5\xf3\xb5\x2c\x3b\xfb\x1f\xdf\x01\xb8\xa2\x11\xc2\x64\x47\xfc\x9d\x0b\x27\xea\xde\xcf\xde\x14\x1b\x9a\xfa\x89\xc9\x85\x69\x09\xf0\xd6\x45\xd9\xa3\x00\x73\x08\x4e\x23\x87\xb7\x9c\x21\x14\xb1\x17\xdc\x20\x67\x81\x0f\xa0\x48\xdd\x48\xc2\xf2\xc9\x0d\x66\xb9\x20\x18\x7f\x7f\x6c\xe9\x99\xbb\xfb\x74\x9a\xd7\x86\x61\x0b\x00\x8b\x45\x36\xc8\x18\x4a\x12\xd4\x07\x8a\x6f\x38\x12\xe2\xd1\xde\x75\x54\x84\x18\x2d\x56\xd3\x81\xa9\xa7\xa1\x57\xd4\x88\x50\x32\x41\x19\xb9\x1b\xe9\x8e\xc3\x82\x28\x6f\x16\x4f\x8c\x73\x57\x8c\x2d\x98\x58\xac\x15\xaf\x41\x53\x8d\x73\x31\x3e\x41\xb3\x58\xb0\xc3\xcb\xb2\x36\xe3\x5f\x61\x54\x6b\x40\x85\x61\xbe\x7f\x42\x50\xe2\x3a\x4f\x98\xf7\xdc\xc4\xd6\x8b\x40\x2a\x49\x76\x06\x1f\xe4\x0a\xca\x85\xac\xd2\xe4\xd8\x9f\x27\x48\xef\xbe\x38\xde\x7b\x01\x74\x09\x97\x3e\x0e\x47\x40\x2c\xce\x85\x5f\xb4\x0d\x8b\x0f\xca\x93\x5e\xb8\x1a\xc0\x35\x67\xae\x65\x01\xf7\x18\x2d\x96\xf2\x46\x05\x42\x56\xca\xc2\xbc\x26\xcb\xa1\xf8\x41\x6f\xd4\x2d\xa6\x2e\x54\x95\x42\x61\xcb\x49\x4f\x53\x00\xca\xf0\x7a\xa3\x89\xac\x50\x75\x14\x9a\x54\x92\x65\x6a\xe0\x82\x43\x01\x5b\x01\x65\x53\x74\xfb\xf2\x35\x1b\x8d\x0e\x64\x50\xe6\x35\x5c\x59\x03\x97\x10\x70\xba\x9a\xac\x6b\x91\xd7\xe2\x2b\x59\x18\x6d\x8b\xae\x5d\xc6\x0e\x5a\x42\x81\x4c\xad\x61\x8b\x62\x78\x55\xad\x01\x46\xcb\xb5\xc5\x37\x63\xa2\x16\xf2\x36\xc7\x3c\x30\x66\x5a\x69\x14\xb5\x5d\xf2\x28\xa0\xb3\x92\x73\x15\x3a\x19\x9e\x83\x28\x05\xae\xc1\x5e\xee\x16\x5f\x79\xb7\x32\x7b\xf9\x18\xce\x41\xd6\xb6\xbc\xfa\x60\x75\x30\x5d\x54\x7a\x99\xaf\x97\x07\xe0\x7e\x6f\x0e\x50\x60\x7b\x96\x67\x47\xdf\xfe\xdb\xbf\x3d\x7d\xf2\x6d\xdb\x27\xb4\x90\xe0\xea\x13\x82\x03\x51\x2a\x26\x04\x3e\xae\x73\x93\x10\x69\x56\x6a\x3e\xb2\x81\x52\xd0\xcb\xb9\x55\x11\xba\x74\x40\x7f\x81\xdf\x20\xb8\xfd\xc7\x42\x2a\x3c\x3b\x64\xe7\x0b\x16\x82\xbb\x51\x64\xa1\x68\x71\x69\xf7\xf1\x47\x3e\x18\x51\xb4\xa9\x19\xb9\x4b\xb1\xb3\x67\x73\x03\xc9\xe1\x83\x78\x6b\x04\x53\x00\xbb\x4b\x11\x3f\x02\xe1\xd6\x2d\x1d\xe3\x14\x90\x10\x0e\x48\x27\xc4\xd9\xe5\x8b\x21\xeb\xb3\x2d\x6c\x52\xc1\xdc\x49\x89\xee\x18\x9a\x89\xbc\xee\x19\xbe\x82\xfd\x37\x06\x2e\x5d\xa1\xcb\x6e\x1e\x61\xf8\x93\xf6\x35\x90\xca\x6b\x41\xd0\xbd\x7e\x06\x51\xdd\x66\x45\x16\x48\xa8\x96\x2f\x97\x2a\xcb\x65\xad\x8a\xed\x50\x1c\x97\x59\x65\x97\xc0\xa9\x5d\x3e\x2a\x90\x71\xf9\xc9\xe6\x96\x05\xac\x8d\x25\x66\xd7\x9c\x71\x86\x58\x00\x2e\xb1\x9d\x2f\xe4\xf4\xa6\xc8\x4d\x0d\x06\xd9\x30\x89\xd4\xeb\x68\x12\x7f\x38\x7e\x6d\x65\x9c\x74\x82\xee\x3b\xb1\x0e\xca\xc9\x52\xa6\xc1\x4b\x2e\xa6\x07\x07\xe2\xb9\xdd\x6c\x98\x00\x1a\xd9\x17\xd3\x2c\x0e\x08\xc4\x64\x41\xc9\x11\x5b\x3e\xc8\xaf\xb2\x96\x94\xc7\x5f\x84\xc1\x27\x0c\x14\xba\xd0\xe2\x15\x34\x65\x34\x03\x77\xeb\x70\x78\x31\x72\x65\x25\x81\xca\x0e\xb8\x3b\x60\x6a\xc4\x19\x9a\xe9\xaa\xcd\x6d\xe3\x3e\x0a\xd0\xff\x17\xa7\xa3\x17\x88\xa8\x17\x3e\x43\xfb\xbd\x4e\x46\x27\x80\x7f\xea\xd9\x88\xbb\x63\xa3\xe0\xd0\x09\xc8\x8b\x53\x2f\xf3\xf6\x2f\x5e\x9c\xef\xc1\xea\x5e\x53\x66\x4d\xdf\xd0\x5a\xdb\x29\x33\x9a\x50\xa0\xea\x6a\xcb\xee\xe8\x94\xc7\xd4\x92\x51\x19\xdf\xd2\x30\xa6\x35\xef\x30\xa9\x17\x7c\x6b\x9a\x6a\x01\xce\xfa\xc0\x2d\xc0\x7d\x44\xba\xd1\x02\x5c\x64\x49\x29\x3d\x53\x2f\xbd\x41\x08\xa5\xf5\x35\x71\x23\xfb\x36\x90\xe9\xfa\x41\xa7\x0c\x8e\x59\x77\x5a\xf4\x98\x89\xe0\x20\x7e\xf9\x45\x74\x59\xeb\x1f\x3f\xfe\x1c\x65\x60\xd8\xc0\x9c\xdf\x35\x2e\x00\x04\xad\x78\xd8\x7a\x6f\x61\xee\xe3\xe9\x4e\x17\xfe\xf2\xd0\x76\xbf\xbb\x97\xec\x84\xb6\xdc\x51\xc4\x70\xa5\x58\xd9\xa7\x4e\x29\x34\x9d\xae\x2b\xe3\x71\x41\x1d\xef\x1c\x50\x10\xbe\x26\x17\x0e\xd0\x4d\x32\x1d\xa0\x6d\xe1\x50\xbc\x0a\x84\xa2\x90\xe9\x42\x49\x60\x92\x6c\xcd\xb3\x79\x6c\xe5\x77\xf7\x14\xcf\x8e\x21\xb3\xcb\xed\x37\xff\x3e\xf0\x56\xad\xa5\xdc\x82\x65\x2b\x39\xb9\x0d\x83\x7d\xe5\x26\xaa\x40\x8b\x72\xe0\x06\x83\x95\x38\x16\x33\xb5\x21\x6d\x61\x5e\xe4\x75\xae\xcc\xa8\x45\x7e\xd8\x17\x63\x38\xab\xc7\x76\xf9\x8f\x9f\x8c\x87\xe2\xb8\xb2\x83\x75\xa3\xb6\x06\x7c\xaa\xec\x5f\x68\x2a\xbb\xab\x36\x5e\x98\x94\xb1\x5b\x11\x4d\x70\x99\x42\x69\x8c\xda\xdc\x21\x5c\x08\x21\xce\x3f\x8c\x44\x0f\xac\x57\xe2\x6b\x91\x8d\x45\x5e\x8a\x57\xba\xc8\xcd\x02\x3c\x8c\x50\xca\x2c\xb5\x58\xea\x0c\xe3\x00\x82\xdc\x17\x00\x1d\x80\x10\xf0\x32\xb2\xff\x4d\xf2\x92\xa0\x67\xcb\xac\xd3\xb2\xe7\x2f\x85\x9c\x8a\xf3\x64\xc1\xd6\x3f\x7f\x4e\xd6\xc6\xe8\x40\xb6\x9c\x13\x3a\x05\x3a\xe4\xf1\xd3\x27\x4f\xc6\x42\x96\xdb\x8d\xdc\x46\x3d\x7b\xa9\xc5\x38\x72\x8c\x82\x99\x82\x95\xfa\x2b\x06\xd4\x9b\xf5\xa2\x7e\xfa\xe4\xe8\xf0\x65\x84\x2d\x5b\x43\x1c\x99\x1d\xdf\xf1\xe9\x32\xfb\xfa\x74\x3c\xb4\x4d\x6a\x1d\x8a\x01\x0d\x14\x27\x72\x77\xdb\x0f\x98\xc0\xf0\x70\xb7\x61\x94\x0b\x09\x88\x56\x11\xc6\x35\xb5\xe4\xe2\x62\x97\xb6\xfd\x15\xa5\xbf\x92\xa5\x50\x4b\xfd\xb7\x5c\xdc\xe6\x92\xd3\xb9\xd2\x6b\x54\xf8\x4f\xb4\xac\xc0\xfa\xf2\x16\x1c\x7b\xcc\x50\xd8\xfb\x86\xb1\x6f\x25\x6c\xca\x01\x7e\xca\xf6\x3e\xa8\xa4\x39\xa9\x85\x2e\x32\xf6\xa1\x30\x4c\x45\x7e\xa3\xc4\xf8\xbf\xd6\x67\x7f\xfa\xf6\xec\xbf\xd6\x67\xe7\x4f\x8e\xc7\x43\x21\x4e\xc8\x28\x6d\xef\x0d\xe8\x30\xcf\x89\xe5\x46\x7c\x33\x88\xd5\x08\x6e\x72\xbd\x7f\x53\x70\xac\x0b\x1f\x0d\x4e\x5d\x7c\xb0\x92\x8e\x6c\x14\xf7\xce\xf3\xd9\x28\x93\xbe\x39\x9f\x28\xa1\x67\x9c\x18\x1e\xb2\xd4\x98\xf0\x19\xc0\x8e\xe2\x16\x62\xbb\xbc\x13\xc3\x99\x7d\xe6\x82\x03\xfe\x22\x92\x28\xcd\x16\x33\x89\x2d\x1f\x22\x01\x99\xda\xaa\x71\x7d\x68\x25\xd5\xe6\xf3\xd4\xac\xc9\x3e\xf0\x20\xfe\xb7\x9b\x37\xef\xbe\x8a\xef\x70\xa5\x7b\x86\xf8\x51\xa3\x96\xcb\x80\xe8\xb4\xb3\xb4\xc9\xa6\xe7\x5e\xbc\x68\x11\x20\x11\x34\x83\x0b\x65\x03\x31\x01\x2c\x10\x2b\xaf\xe4\x4c\x3a\x86\x04\x0d\x4c\x82\xd5\x91\x0d\x18\xef\xae\x4d\x74\xf5\x16\x45\x7c\x2c\xbd\x36\x55\xf0\xec\x04\xfc\xad\x54\xf0\xe1\x1e\x10\x54\xed\xb1\x1b\xa8\x17\x03\x82\x44\xf2\xc9\xfa\x99\x86\xea\x8d\x11\xfb\x0c\x91\xf6\x30\xce\xd1\xcb\x4f\x16\x54\xab\x20\xe7\x0d\x6c\xb5\x6c\x91\x1e\x48\xc4\x40\x2a\x13\x05\x9c\x30\x1b\x7a\x58\x7a\xdb\x84\x5d\x1a\xf1\x56\xcd\x2b\x9b\xc0\x16\x9d\xab\x19\xb2\xd5\xf4\xe9\x0a\xd8\x58\xa7\xe8\xa4\xba\x5f\xa9\x43\x3c\xa5\x34\x66\xa5\x18\x47\x2e\x81\xde\x2f\x59\xa3\x3a\xf6\x01\xa9\x4d\x3e\x27\x34\xa1\x2d\x22\x21\xe0\x94\x7a\xfb\x3d\x62\xa0\x5a\xa6\xed\xb7\x19\xf3\xeb\x6d\xd1\x45\x7d\xc5\x6c\x93\x79\x49\x97\xef\x81\x78\x23\x67\xb2\xca\x07\xe8\xf0\x8a\x47\x6a\x82\x33\x85\x87\x1e\x48\xa9\xb0\x77\x75\xe9\xe4\xc4\x31\x14\x1f\xa7\x1e\x84\x94\x95\x85\xa0\xef\xc7\xba\x24\xef\x6b\xea\x44\x7c\x75\xcb\x0d\x68\xe3\x7a\x19\x49\x5e\x75\x80\xf6\x44\xa3\x2b\x4f\x49\x40\x58\x56\x5f\xe1\xd9\x11\x9d\xf5\xfe\x88\x72\x37\x65\x5b\x8f\x1c\xc8\x9b\xb8\xfe\x1b\x4c\x4c\x08\x56\x5b\x9f\xff\x0f\x73\x13\x66\x99\xdd\x03\x53\x5d\xd6\x95\xc4\xcb\x1b\xea\x07\xd5\xd4\x8e\xca\xda\x0c\xa2\xc1\x25\xb1\x67\xa2\x4c\x32\xc4\x7e\x41\xe4\x1c\xdb\x9f\x6b\x71\x42\x6e\xc4\xa8\x01\x6e\x1f\x22\x6a\x05\x7d\xbe\x8e\x51\x3a\xfd\x5a\x08\xab\x00\xb0\x4c\x09\x02\x17\xec\xed\x90\xe4\x6c\x99\x63\x8c\xf2\x98\xdd\xfe\xc6\xde\x49\xbc\x5e\xac\x4d\x94\xc3\x00\x13\xf7\x99\x05\xdc\x7b\xd9\x85\xd3\x33\x68\x10\x1e\x2d\x65\xc8\x36\x10\xcf\x24\x4d\x4d\xcb\xa7\x82\x93\x15\xc6\xd5\xa4\x9c\x99\xf0\xd0\xd0\x95\x37\x30\x80\x11\xfb\x1b\x50\x9b\x88\xb1\xe3\x86\x89\x30\x22\x7e\x15\x67\xf7\xfb\xfd\xdd\x6f\x6e\xbc\x1d\xfc\xf6\x87\xd1\xfb\x43\xee\x22\xf9\x33\xe2\x1d\x83\xcb\x38\x4c\x5a\x59\x57\xba\x28\xc8\x72\xa8\xfc\xe5\x12\x61\xe5\x68\x3a\x16\xd2\x38\x06\x0e\xf3\x31\xcb\x27\xaa\x8a\x12\xfa\x87\x2c\x29\xf6\xfd\x6b\x05\x83\xe2\x48\xfb\x52\x68\xc9\xc2\x58\x6c\x40\x47\x81\xdf\xcf\x2d\xb5\x50\x3a\xa2\xcb\x27\x6d\xc1\x5f\x5c\x2c\x57\x45\x62\x18\x85\x56\x05\x6e\x80\xdb\xd7\xe9\x08\xad\x18\x9b\x6d\x4b\xb9\xcc\xa7\x21\x82\x2a\x52\x13\x3a\x52\xd8\x28\xbc\x49\x47\xb4\x50\x90\x6c\xed\x7b\xa3\x69\x61\xcc\x29\x60\xde\x8e\xf6\x95\x87\x0f\x85\xa1\x62\x6f\xfe\xcf\x5a\xad\x43\x34\x4d\x94\xe9\xc1\xbe\x06\x38\xf8\xcb\x19\x65\x49\xaa\xd9\x52\x84\x48\x18\x96\xb5\xd0\xb2\x17\xf2\x66\x04\xe6\x55\x73\xa7\xad\xe0\x5e\x02\x59\x10\x8d\x76\xea\x5a\x24\x44\x89\x4a\x5d\xb2\x6e\x54\x3d\x81\xac\x4e\x43\x4b\x28\xe3\x18\x3d\x8d\xf9\x68\x2e\x42\x14\x35\xad\x47\xfb\xeb\x79\xa5\x97\x2f\xad\x28\x5b\x07\x9b\x2e\xde\x9f\x92\x6a\x6c\x06\x7f\x2e\x21\xd1\x2c\xa9\x89\x03\x24\xe3\x47\x70\xec\x6c\x19\xf5\x10\xac\xd0\x7c\x39\xa4\x81\x0b\xab\x8a\xf2\x82\x44\x81\x0c\xed\x21\xca\xb0\x1c\x61\x51\x38\xcd\x39\xae\x08\xd4\x25\xa3\x2e\x5b\x48\x1a\x12\xe2\xb3\x70\x59\x0e\x5b\xc9\x85\x70\xe0\xa1\x58\x55\x1a\xee\xa1\xf6\x8e\x55\x6c\xd1\x60\x93\x61\xfe\xe1\xc9\xda\xca\x51\xb8\x5f\x86\xe2\x15\xc6\xeb\xce\xf2\x02\x44\x06\x30\x76\xa4\xc1\xce\x0e\xe1\xcd\x89\x77\xb0\x77\x50\xe3\xf8\xca\x3e\xf6\x43\x9f\x0e\xf5\x10\xf6\xb7\x7d\x05\xd3\x71\xef\x31\xdb\x41\x68\xd0\x58\x06\x43\x84\xa1\x82\x06\x86\xfc\x53\xb9\xdb\xf6\x5f\x7e\x2b\x8e\xee\x66\x0e\x7c\x03\xa8\xf2\xef\x76\x6b\x40\x4b\x5e\x63\xfb\xa2\xf5\x6f\x57\x55\xb4\xbb\xb8\xa6\x91\x6f\x2e\x8e\xf6\x19\x9e\x52\x96\xed\x16\xcf\x83\xb6\xd2\xe2\x48\xbc\xc3\xb2\xef\x1b\x9e\x25\xee\x5c\x88\x37\x7a\xed\xc1\x81\x3f\xa6\x19\x5c\xfc\xbe\xbe\x98\xbd\x54\x2a\x53\x19\x4f\xdb\xd4\xda\xa5\x78\x4f\x84\xf4\x92\x10\xe0\xcd\xca\xbb\x65\x02\x23\x97\xe1\x33\x13\x0a\x41\x57\x50\x68\x6d\xe3\x4a\x8d\x2e\x13\x4f\x12\x3b\x99\x91\xdb\xe1\xd1\x37\x7d\x66\xf0\x16\xb0\xbf\xa8\x60\x3b\xbe\x5f\xeb\xf7\xa2\x7a\xef\xf2\xf7\x69\x52\xc0\x5d\xc7\x4f\x5b\xde\x33\xbf\x36\x47\x7c\x99\x0e\x1e\x7c\xd1\xb2\xf2\x46\x6d\xcb\x71\xf0\xe0\x8b\xb6\xd9\x1c\xb5\xce\x31\x82\xe1\xe1\x31\x9c\x09\xc9\x50\x3d\xa7\x68\xa7\x05\x14\x51\xf4\x80\x26\xa8\x1e\x1f\x50\x48\x00\xe8\x0c\xf2\x13\x62\x18\x2d\x9b\xae\x54\x99\xa9\x4a\x55\x43\xf1\x06\x74\x28\xbe\x6a\x2f\x49\xa5\x4b\xda\x56\xcb\x8f\xc0\x0b\xb1\xca\xc4\x4a\x56\xf5\xd6\x12\x2a\xf2\x49\x25\xab\xdc\x4a\xc5\x64\x37\x6b\x69\xd3\x10\xdd\x35\x41\xfc\x24\x6f\xc4\xe3\x57\x17\xa8\x38\x9b\x6b\x21\x6d\x6f\xec\xb7\x2d\x41\x06\xcc\x06\xb7\x0e\x9f\x94\x81\x54\x08\x43\xf1\x56\xf5\x8a\x02\x13\x53\x51\xef\x4c\xbe\xcc\x0b\x59\x01\xd1\x5a\x0b\xbd\xaa\xf7\xad\xf8\xad\x67\x10\x3d\x68\x09\xac\x2d\x83\xdd\xe8\xea\x06\xc3\x00\x48\xff\x93\x69\x61\xb6\xe5\x74\x51\xe9\x52\xaf\x0d\xbc\x1f\xc2\x40\x13\x44\xa2\x09\x72\xcb\x49\x3c\xc8\x1c\x96\x6f\x56\x0e\xc4\x44\xeb\x9b\x1b\xa5\x56\xde\x6a\xe1\x3c\x49\xcb\x3e\x7f\x75\xe8\x0f\xf7\xdc\xbc\x54\xc6\x0a\xcd\x44\x38\x18\x0a\x3c\xe1\x78\x0c\xdb\x3f\x83\x16\x93\x98\x14\x77\x02\x6a\xb1\x2f\xe5\xa5\xc1\x8b\x0b\x1a\x13\xe1\x2b\x03\x6e\xf8\xdc\xc8\xbc\x16\xeb\xb2\xce\x0b\x91\xfb\x6c\x6c\xb3\x75\x41\xb6\xa9\x42\xd5\x21\xd7\x38\x2e\x57\x70\x15\x85\xe4\x33\xa8\x98\xb6\xaf\x80\xa4\xcc\x32\x7e\xb1\x08\xe2\x92\xc4\xad\x0c\x49\xe4\x61\xd4\x99\x7c\xdc\x32\xde\x8d\xce\x3b\x7e\xd6\x32\x8c\xce\x24\x5e\x57\xdb\x58\xee\xbe\x37\x5d\x31\xcb\x4b\xb8\x29\xf9\x71\xfc\x41\x55\xe0\x11\xcd\x86\xc6\xae\xf2\x35\xad\x06\x58\x86\x2e\xf9\xbb\xbd\xd7\xa1\xa1\x3f\x37\x56\x16\xd4\x55\x2d\x4b\x3f\x8e\xb0\xc5\x50\xd3\xc8\x8e\xfe\xa9\x63\x36\x98\x30\x37\x2f\x45\x21\xb7\xaa\x22\xdb\xc4\xc1\x81\xf7\x8e\x98\xe7\xf5\x62\x3d\x01\xc7\x88\x99\x9c\x2a\xdb\x74\x84\xe0\x71\xce\x11\x4f\xff\xf8\xdd\x9f\x98\x78\x0b\x9c\xc0\x89\xed\x28\xab\x6b\xf0\x4f\x6d\xfd\x3a\x79\xef\x75\x2e\xcd\x94\xbf\x86\x43\xe8\xb0\xc1\x49\xbf\x57\xa5\xaa\xf2\xe9\x09\x31\x91\x1d\x42\x7c\x3c\x25\x5c\x76\xbf\x8e\xb7\x80\x3f\x19\x5a\x37\x64\x52\x38\x96\xa5\x03\x97\xfe\x57\x27\x4c\x74\x35\x90\x39\xe8\xa6\xd8\x0f\x0b\x59\x6f\xe6\xa0\x64\xb1\x17\x75\x73\xb0\x51\x93\x7d\xb9\x5a\x99\x03\xda\x5d\xfb\x76\x2d\x1f\x2c\xd7\x45\x9d\xaf\xe4\x5c\x1d\xd4\x0b\x85\xfa\x95\x7d\xca\x60\x38\x5c\xd4\xcb\xe2\x0f\xf8\xc8\x0a\x3d\xfb\xb2\xae\xab\x7d\xb3\x5e\x2e\x65\xb5\xf5\x17\x57\xe3\x30\x1f\xe1\x22\xc7\x03\x50\xa7\xba\xd0\x55\x80\x21\xc3\xa0\x3d\xfe\xab\xce\x97\xec\x49\xcf\x3d\xda\x2f\xf4\x54\x16\xbd\xf0\x46\x2d\x65\x5e\x84\x9f\x4b\x5d\xd6\x8b\xf0\xb3\x5c\x2f\x27\x8a\x7d\x67\x25\x8d\xd9\xe8\x2a\x0b\x4f\x2a\x7b\xcf\x0b\x3f\x8d\x92\xd5\x94\x11\xa8\x55\xc1\x7f\x7c\xa8\xd9\xaf\xa8\x85\xeb\x8a\x15\xdc\x28\x75\x83\xbf\x92\x6c\x7a\x26\x68\x3f\x71\x1c\xfb\x76\x3c\x83\xc2\xb4\xd4\x99\x72\x49\x90\x0b\xb5\x04\x77\xd3\x42\x2d\x87\xfe\x79\xfa\x60\x58\xeb\x9f\xf4\x46\x55\xa7\xd2\xa8\x7e\x70\xa5\x0c\x74\x00\xe1\x11\xfc\x64\x92\xcb\xfb\xc3\x87\x2d\xb3\xf3\x0e\x88\xdb\x09\x7d\x1f\x79\xe7\xc6\xf4\xec\x38\xc8\x4a\xc9\x94\xa4\x63\x58\x1f\x1f\x3c\x48\x23\x10\x82\x4e\xf0\x87\xab\x17\x3f\x41\x3f\xc1\x00\x0e\x18\x83\xa4\xdc\x09\xc6\x12\xe0\xb4\xf6\x35\xdd\xda\x6c\xf1\x07\x3e\xa3\xd7\xf9\x4f\xe7\x2f\xce\x5f\x5e\x5d\xbf\xc4\x78\xea\xa7\x78\x95\xbc\x3a\xff\x0f\xff\xe8\x5b\x7c\x74\x7a\xf9\x82\x17\xfc\x13\x3e\x3d\xbb\x3c\xfd\x99\x3f\xfe\x2e\x79\xfc\xfc\xf5\xf1\xf7\x11\xfd\xa7\x2d\xc9\x4f\x79\x52\x47\x70\x46\xf0\x81\x90\x91\xab\x06\x5c\x73\xa6\x53\x7b\xb3\x23\x77\x0c\x54\x53\x4d\x75\x89\xe0\x95\xd3\x1c\xf2\x68\xfa\x5a\x67\x97\x2f\xec\xe1\xdf\x99\x58\xe7\xd3\x7c\x43\xd2\x74\x36\xdd\xc9\x6b\xe6\xaa\x66\x25\xdb\xe3\x17\xda\xd2\x7f\xb8\x9c\x20\x49\x74\xa3\xa9\xa6\x2e\x01\xe9\x2f\xbf\x04\x00\x0d\x60\xe6\x2f\x7d\x9e\x13\x48\x8c\xba\x36\xca\xe7\x45\x75\x02\xda\x1f\xfe\xf5\xbb\x3f\x7e\xeb\x42\x22\x1c\x18\x29\x73\xf8\xfc\xd9\x28\x22\xef\xf1\xda\xe3\x2b\x47\x57\x71\xae\xdb\x47\x4d\x6e\xb0\xc9\x3b\xe1\xb0\x44\x34\x02\x3b\x48\x46\xf4\xed\x45\x6f\x18\xd6\x56\x6e\xc4\xb7\x7b\xe4\x65\x92\x72\x55\xcc\xc8\xb4\xb4\x15\x2c\x67\xfd\x9b\x39\x40\x92\xd7\x01\x7e\x12\xd8\x26\x8b\x69\xc3\xc6\xfa\xdd\x60\x77\x57\xf8\xd6\x33\xf7\x1e\x33\xd9\xdb\x96\x88\x91\xbf\x53\xd1\x11\xb5\x36\xea\x07\x69\x9e\x2b\x59\xaf\x2b\x75\x1f\x24\x12\x1c\xb1\xa8\x1a\x07\x1b\x49\xf4\x47\x0c\xf7\x21\x79\x35\x5c\x84\xfa\x2e\x86\xd5\xab\x50\x00\x3e\x1e\xf8\x81\x5d\xdc\xa5\xda\x28\xe6\xa7\x25\x8d\x58\x61\xae\x2e\x7b\x90\x97\x99\xac\xb2\x96\x11\xcd\xf4\x72\x08\x5a\x64\x76\x58\xfd\x21\xd3\xcb\xfd\x4c\x2f\xe3\x96\xec\x2f\xa4\x99\x61\x4b\x18\x8a\x4a\x77\x73\xfb\xbd\xde\x40\xf4\x7a\x18\x87\xe6\xd3\x8b\x3a\x93\x85\x87\xec\x97\xcc\x71\xc8\xb3\x4a\x17\xd6\xe4\xa2\x10\x94\x1b\x6b\xa1\xd8\x60\xd3\xe6\x7d\x79\x79\x75\x3e\x42\x2d\x08\xdc\x10\x4a\x5d\xa3\xe8\xee\x6d\xc0\x70\x37\x2c\x75\xb9\x3f\xc7\x33\xdc\x3b\xa8\xd0\x3d\x66\x8c\x7a\xc8\x31\x04\x5d\x8d\xc1\x3b\x67\x3c\x10\xe3\x42\xcb\xcc\xfe\x0b\xba\x95\x31\x5a\x21\xc6\x18\xfa\xec\xcd\x06\x27\xba\xb2\x03\x8e\xdc\xe9\x85\xce\x54\x55\xe6\xff\xa8\xba\x1c\xd7\xe0\xbb\x96\xc3\xbf\x59\xcf\x66\xf9\x07\x42\x7c\x2e\x01\xdb\x50\x0d\xe7\x43\xf1\x68\x5a\xe4\xd3\x9b\x47\x91\xc3\xda\x33\x9f\x90\x80\x22\xe4\x71\xf4\xf0\x72\xa5\xfc\x43\x88\xc2\x8f\x46\x71\xd8\x1a\xf1\xc8\xd2\x1a\xa8\x96\xa1\x6f\x64\x82\x16\xff\xab\xc8\xa7\xaa\x34\x2a\x74\x4f\x7c\x3b\x7c\x32\x7c\xb2\xaa\x94\xe8\xa3\x8b\xb5\x38\x59\xe7\x45\xb6\x27\x7e\x11\x2f\x2e\xae\xd2\x90\x4a\xe8\xa4\xc7\xa5\xee\x27\x63\x30\x70\x1d\x60\x8a\x89\x3b\x50\x56\x7e\xf9\xc5\x77\xfa\xf1\x63\xf1\xb0\xdf\x73\x70\x78\x2e\x0f\x63\x8c\xfa\x93\x1c\x9f\x2c\x58\x8f\x9b\x00\x49\x1e\xe8\xe9\xb2\x27\xbe\x4e\x27\xea\xd0\xe3\xc2\xf2\xc4\x95\xa1\x1e\xfb\x9c\x17\x0e\x1e\xb2\xc2\x51\xe6\x18\x62\xc2\x8c\x1b\x20\xf6\xb5\x93\x55\x7a\x59\x7e\xeb\x10\x58\x9d\x1c\x68\x54\x7d\x5c\xd7\x55\x3e\x59\xd7\x2a\x8c\xe0\x40\xf4\x48\x5d\xe3\xca\xc7\x0d\x74\x49\x61\x90\xc8\x3b\x5f\xef\x7d\x0b\x8a\xed\xc7\xb6\x76\xdb\xf1\x8d\x79\x98\x8b\xcc\x61\x8b\x18\x68\x6d\x16\x4a\x15\xbd\x48\x57\x8e\x31\x84\x80\x20\x5a\x16\x5b\xa7\x82\xa8\x95\x09\xb9\x61\xd0\x71\x52\x89\x31\x54\xf7\xa8\x47\x08\x2a\x34\x6c\xe9\xd1\x7d\xd8\x0e\x1a\x62\x86\xd8\xa2\x81\xe8\x7d\x3b\x7c\xd2\xdb\x4b\x05\x26\x46\x36\x46\xac\xcc\x0d\xec\x2e\x39\x29\x54\x22\x35\x12\xae\xbd\x97\xdd\x0e\xdb\xa5\x49\x2f\x34\x32\x93\x2d\x17\x2c\xdb\x65\x4a\x2e\x42\x02\x8c\x50\xed\x1d\x17\x21\x9f\xcd\x44\x7f\x00\x7f\xc5\xf0\xb8\x92\x59\xae\x7b\x7b\xcd\x54\xb2\x95\x9c\xde\xa8\x0a\x84\xc9\x48\xb7\x00\xf2\xc8\x35\x88\x82\x54\x26\xae\x9b\xa9\x5a\x4e\x17\xcd\xea\xcd\x7a\x5d\x99\x9a\x21\x2f\x93\xd7\x0d\x07\x0a\x76\x94\x6e\x29\x67\x53\xaf\xe7\xf5\xf4\xa1\x00\x87\x1a\x66\xc2\x2d\xf9\x77\xfa\xf9\x80\x0a\x61\x2f\x21\x41\x68\x1e\x8c\x91\xca\x20\x0f\x7b\xb5\x56\x00\x06\x0c\x1b\xbd\xd7\x12\x31\xc4\xea\xc5\xdf\x8b\x1b\xc1\x3b\x57\xdb\x8e\x43\xf7\x2e\xcb\xae\xce\x3d\xcf\x55\x91\x01\x5e\x71\xd2\x62\xdb\x2a\x6a\x20\x34\x0c\x93\xfb\x1e\xfa\x78\x55\x33\xad\xf2\x15\x42\x9f\x92\xe6\x70\xae\x6a\x86\xfe\x7e\xe6\x4b\xf4\xb1\xb3\x0c\x7e\x93\xa5\x65\x08\x8d\xd8\xf3\x09\x21\xe8\x00\xfd\xab\x1f\x7c\xf1\x35\x74\xfc\x5d\x28\xfc\xde\x49\x8c\xf9\x0c\xd2\x10\xe8\x52\x61\x4e\x3d\xf2\xab\x77\x79\x07\x24\x8d\x9c\xae\xbc\x75\x1e\x74\x6a\x13\x99\x17\x24\x97\x94\x19\x69\x11\x61\xb8\xa8\x3c\x9c\xc9\xe8\xe1\xa5\x11\x97\xdd\x6e\x3b\x70\x04\x9e\x91\x01\xd0\x90\x5b\x32\xc6\x9c\xf4\x8c\x98\x60\x1a\xbf\x1a\xbd\xd7\x16\xb2\xca\xc4\x4c\xe6\x05\x8a\x1e\x07\x07\xa2\x5f\x82\x1e\x01\x2d\x22\xaa\xaa\xa5\x95\x17\x94\xa9\xe9\x8a\x63\x56\xdb\xcb\x92\x80\xae\xe8\xea\x63\xdb\x86\xcd\xde\x63\x97\xad\x14\x66\x9f\x0d\xa1\xdb\x6c\x10\x27\xec\xc6\xdf\x4e\x0c\xc2\xf9\x07\x9c\xaa\xd6\x72\xa6\x51\xae\x4d\xbf\xfe\xa0\x2b\x73\x0a\xe4\xf1\x67\x13\xea\x52\x11\xa8\x72\xbd\x54\x84\x2d\xce\xbe\x16\x1e\x23\x2e\x4e\x17\x08\xf9\x5c\xb5\x66\x61\x62\xa1\xcd\xbc\xa3\x01\xd8\xd0\xa9\xbf\x19\x94\x79\xa0\x92\xe4\x3e\x68\x5b\x71\x11\xc4\x7d\x3c\x4a\x1c\x3d\x11\x29\x31\x55\x7b\x58\xc7\xb5\x67\x3c\xff\x74\x3d\x81\x2f\xec\xec\x0e\x6f\x4a\xda\x83\x46\xed\x4f\xeb\x86\x23\x54\xeb\x95\x0b\x4f\x6a\x6f\x4a\x0b\x53\x0d\x03\x01\x79\x2d\x9b\xdb\xd1\xf7\x9f\xc3\xa9\xb5\x71\x6c\x78\xc8\x58\x91\x5d\xd6\xe9\x09\xd0\xb1\xee\xec\x09\x7d\x79\x76\x39\x12\x97\x98\x39\xaa\x67\xc4\xdf\xd6\xa6\x16\x68\x97\xdc\x28\xc0\x31\x5c\xea\x5b\x45\xe6\x5e\x4d\xc7\xc0\xa6\x92\xab\x95\xaa\x40\x9d\xd7\x75\x36\xb4\x33\xcb\xb8\xe9\xa8\x0a\x85\x42\x17\x33\x4c\x42\x97\x25\x3d\x69\x3b\x1f\x9a\xc2\x5b\x58\x19\x69\xcf\x0f\x3d\x5b\xab\x99\xf7\xb3\x2b\xef\x70\x47\x56\x3a\x2f\x89\xeb\xac\x4b\x34\x9e\x52\x8c\x04\x40\x93\x20\x92\xb4\x9c\x4b\xc0\xd6\x2b\x0a\x7b\x67\x98\x2a\xb0\x1f\x43\x1b\x89\xdc\x2e\x15\x8d\x6d\x65\x21\x8d\x5f\x4b\x54\x65\xe8\xd6\x70\xc8\xfb\x5f\xaa\x0f\xbe\x54\xfb\x71\xea\xce\xce\x50\xd2\x72\x19\x4f\xdd\xdf\xd3\xe9\x13\x6e\xa1\x87\xf2\x31\x18\x78\x68\x67\x8b\x26\x29\x86\xb4\x03\xd0\x66\xd0\x29\x2e\x50\x97\xf7\x39\xd8\x5f\x50\xb5\x03\xf0\x0b\xde\x7d\x06\xca\x17\xd1\xc4\x1f\xf6\xf6\x44\x7f\x3f\xd7\xd3\xb5\x43\xf5\xe2\x68\x76\x0d\xf8\x2f\x8f\xf7\xf5\x46\x51\x76\x6c\xa2\x19\x50\xbf\xfc\xb2\x45\x49\xfd\xb8\xcc\x8e\xbd\xcb\x1e\xcb\xa0\x08\x38\xed\x89\xab\x4c\xdd\x86\x97\xd0\xc0\xbf\xfe\xf2\x69\xab\xb3\xe1\x97\x4f\x87\x38\xdc\x03\xd1\x4d\x3a\xa0\x93\x93\x84\xda\xc3\x3a\x3d\xda\x00\xcf\x0b\x39\xe7\x18\x3b\xe0\x96\x21\xd1\x00\xe7\x2d\x31\x4e\x4f\x6f\x85\xee\x1d\xe6\xf0\x5f\xe1\xad\xc8\x62\xc9\x2e\xce\x85\x59\xe4\xcb\x00\x69\x2c\x21\x01\xc5\xb9\xbf\x19\x05\xd7\x95\xe8\x0d\xa5\x38\x26\x5b\xb1\xcb\xcf\x7e\x7e\x7a\x75\x71\xf9\x72\xe4\x9c\x26\xdc\x65\xde\x7b\x18\xb2\xcb\x28\xba\x8b\xfe\x6c\xa2\x49\xdb\xa9\x1b\xbe\xbf\x4e\xb8\x29\xec\x83\x98\x8e\xfa\x02\x10\x13\xda\xd4\xc5\x9e\x6c\x10\xec\x67\x79\x61\xe7\x8e\x73\xcb\xa5\x2c\xd7\xb2\x70\xc3\xcc\x1b\xdf\xaa\x42\x74\x6b\xec\x8e\xd5\xda\x18\xdb\x64\x7d\xed\xd0\x56\xee\x1d\x06\xd7\x5d\x72\xe2\xb2\x12\x56\x9c\x2e\xd4\xed\xfd\x81\xd8\xa8\x5e\x86\xe7\xcb\x24\x2f\x33\x0c\x12\xc6\x68\x00\x89\xa6\x59\x24\x86\x16\x46\x17\x5a\x5d\x66\x68\x28\xcb\x6b\x31\xd7\x10\x7d\xb4\x9e\x2f\xd0\x16\xc3\xc3\xfc\xce\x97\xb9\x15\x16\x87\xe2\x4d\x8e\x47\xd9\x03\x1e\xb6\x09\x66\x45\x1c\xbe\x62\x2b\x0a\x50\x10\xf8\x6b\x27\xfb\x12\x3a\x69\xb9\x3c\xee\xb4\x03\x28\x47\xe9\xc1\x81\xed\x18\xe2\xda\x2e\x94\x90\x13\x83\x2e\xe7\x0e\x97\x16\x89\xa3\x72\x0d\x8b\x3b\x23\x11\x66\x23\xc2\x3c\xf1\x5b\x81\xa7\x50\x29\x74\x95\x61\x42\x1d\x55\x1a\x7b\xa7\x86\x93\xc6\x0e\x84\xf3\x83\xb3\xeb\xb8\x32\xa2\x5a\x97\xce\xb3\x19\x8c\xa7\xa0\xa3\x57\x1f\x6a\x51\x29\xb4\xc5\x8b\x3e\x82\xc0\x7a\xa3\x7b\xa8\x2b\x6b\x2b\x77\xa0\x81\x56\x96\x53\xd8\xc5\x48\x8c\xb4\x01\x86\x45\x35\x84\x20\x08\xf2\xd7\x85\xb5\xb9\x37\x14\x6f\x09\x1d\x09\xe5\xb3\x60\x02\x64\xb1\x7b\x68\x85\x44\xb1\x1f\xb4\x6e\xb8\x06\xc0\x70\x6c\x6b\xfc\xcd\x27\x52\xc9\x6b\x97\x9c\xd4\xa7\x84\x25\x3c\x42\x77\xe0\xaa\x40\x12\x61\x0b\xc9\xe5\x20\x73\x30\xac\x74\xa5\xa8\xd4\x2d\x86\x1d\xd1\xc0\xd0\x22\xf2\xf1\xed\x07\x07\x61\x20\xac\x1c\x53\xad\x4b\xcc\x02\x75\x6f\xb3\xe8\xbf\x3f\xf9\x93\x9d\xcf\xc4\xa4\x5e\xad\x1d\x5a\xc5\x09\x5a\xc1\x1d\xb7\x8b\xbc\x6e\xe2\x42\x3c\xdf\x05\x2d\x2b\x54\x50\x30\x56\x49\xab\x0b\x9e\x83\x43\x0c\xba\x89\x35\xef\xf6\x76\x93\x5e\xcc\xe0\x20\x77\x32\x53\xf0\xd1\x4c\x4d\x08\x2f\x11\xe0\x9a\xfe\xb2\x72\x84\x73\xa0\xfa\xf2\x29\xaf\xe6\x64\x8a\x56\x91\x2c\x90\x4a\xf5\x68\x71\xa2\xf9\x46\x3a\x96\x2b\xff\xfa\xb9\xae\x38\xd7\xe9\x72\x31\x0d\x82\x5f\x7b\xec\x26\x9e\x69\x77\x37\xa2\xeb\x58\xc8\x63\xbf\xf3\x03\x72\xab\x08\xce\xaf\x5c\xcf\x44\x52\xd0\x7d\xf5\xfc\x10\x87\xf5\x9d\x98\x16\x32\x5f\xa2\xb3\x32\x29\xb8\xfc\x66\xf2\x2b\xbf\x86\x9b\x2c\x14\xaa\xab\x7c\x3e\x57\x95\x65\x70\xe0\xcd\x82\x7c\xcb\xde\x0a\x20\x34\x5a\x7d\xa8\x5d\x8c\x79\x3e\x2f\x21\x3f\x0e\xec\xda\x38\x76\xb2\xab\x07\x0d\xbd\xab\xb7\x4f\x02\x48\x75\x2b\xec\x39\xc7\xa8\x1e\x26\xe0\xd4\xdf\x45\x60\x96\x7d\x3a\xc6\xff\x7c\xf4\xdd\x9e\x00\x18\x1e\x83\x42\x27\xc7\x46\xe6\xde\xbd\x1e\x0a\x75\x25\x8d\x51\xd9\x7e\x5e\x3a\x46\x04\xae\xde\x65\x06\xca\x81\xca\x05\x93\xe3\x3e\xf7\x01\x58\xc1\x89\x14\xf6\x73\x96\x83\xbf\xc1\x3a\x37\x0b\x0c\x6d\x73\xb0\xa5\x95\x5e\x5a\x72\x58\x9b\x74\x0b\x96\x0f\xfd\xef\x37\x89\x21\xce\xd8\x26\xbf\x25\x2e\xfd\x5c\x57\x6c\x4b\xf9\xd4\x7e\xe9\xd2\x4c\x85\x94\xe0\x76\xd7\x26\xa4\xc4\x2b\x33\x2a\x31\x44\xe6\x8c\xdb\xa1\xa7\xcb\x78\xbc\x7a\x03\x5a\xb2\x4e\x1b\x80\xcd\xea\x1e\xfe\xd7\xca\xde\xd3\x0c\x77\xbc\x25\x3d\x38\x8b\xe0\xf6\xfe\x3c\xfb\x78\x37\xc8\xdc\xf0\x83\xcd\x03\x31\xc8\x84\xfa\x90\x9b\xda\x34\x86\x4a\xaf\x3a\x46\x8a\xdd\xd5\xa2\x0e\xb6\xfb\x12\xc6\x63\x80\x17\xe3\x4f\x1e\x83\xe6\x34\x38\x87\xc2\x6e\x49\xb1\x63\xdc\x7e\x80\x2f\x00\xca\x5d\xcb\x82\x1d\x08\xa3\x4a\xca\x48\x18\x8b\x94\x22\x9f\xb9\x60\x0f\xd2\x88\xa1\x2d\x05\x1b\xe0\xf5\xfb\x0b\x69\x68\x09\xa6\xc0\xb7\x6d\x5d\x6b\x0a\x72\x69\x78\x9f\x6b\x24\x48\x90\xa0\x5b\x42\x3d\x62\xfb\x60\x93\x2a\xa0\xe5\xc0\x68\x8c\x93\x67\xec\xf7\x93\x32\x9b\xdc\x1e\xfb\x83\xa7\xda\x73\x5d\xb1\x08\x0a\x5d\x6c\x67\x79\x51\xb4\xf2\xfc\x4f\xe0\xfd\x78\x95\x8b\xc0\xaa\x2c\xbf\x1d\xa4\x13\x87\x31\x41\x98\x4e\xcc\xc4\x48\xf7\xa8\x5b\xb4\xff\xcc\xe7\x5b\x9f\x7b\x9e\xc1\x7b\x80\x71\x1a\xbc\xad\x10\x25\xdf\x90\x7e\x26\xc3\xb0\xa1\xa9\x2e\x6f\x55\x99\xc3\x16\x72\xf8\xc7\xb9\x2e\xf1\xc3\xde\x4b\x6d\xb5\x52\x12\xa1\x50\x80\x5c\x5e\x82\x68\x42\xeb\xa3\x52\x4b\x99\x97\xe0\xc9\x25\x8d\x32\xc4\xda\xa7\x94\x65\x45\x1b\xc5\x9b\x35\xd3\xd5\x46\x12\xc8\x8a\x5b\x75\x6c\xc9\xb1\xc5\xc5\xc6\x84\x22\x1a\x43\x6c\x2b\x4a\x65\x12\x43\x7e\xa6\x91\x98\xe4\x24\xa4\x88\xae\x8f\x4e\xf0\xd4\x91\x83\xfc\xef\x37\xd4\xda\x4a\xa1\xa6\x52\x48\x61\x50\x47\x0b\x11\x96\xa8\x47\x1f\x23\x93\x26\x2f\x37\x47\x4b\xaf\x93\x5b\x1c\xea\x2d\xc0\x21\x1e\x30\x22\x92\x38\x1f\x3a\xeb\x70\x44\x88\x87\x13\x2d\x47\x92\xb3\xa4\xfe\x1e\x4b\xf5\x2e\x45\x69\x2f\xb7\x20\x68\xdb\x59\x83\xf1\x2d\x0a\x7b\xc2\xc2\xed\xc3\x8a\xa4\xd2\x28\x0c\x46\x00\x52\xcb\x1c\x02\xc3\xa5\x98\x14\x6b\x77\x71\x32\x7a\xa9\x16\x7a\x33\xf4\x2a\xbe\x2e\xf6\x77\x48\x25\x3e\xe9\x2c\x49\xb0\x0b\x5b\x17\x3c\xe8\x37\xdc\x7a\xbf\xab\x05\x1f\x09\x72\x12\x79\xdb\x9f\x28\x58\xee\xbb\x61\xb7\x38\x76\xcf\x1d\x7a\x8f\x9d\x99\xaa\x4c\x40\x1b\xde\x01\x21\xfc\xf3\x6a\xe7\x6b\x50\xca\xb0\x3d\x7e\x49\xd0\xe9\xf1\x56\x73\xcc\x99\x79\x07\xe5\xa4\xba\x74\x02\x8b\xf7\xa6\x2c\x7b\xde\x8d\x72\xa1\x8a\xd5\x6c\x5d\xc0\x6a\x5d\xc3\xd6\x83\x2a\x60\x95\x49\x4e\x94\x90\x00\x23\x5a\x73\xdf\x7d\xf7\x2f\x6e\x23\xd7\xf9\x52\x0d\x1c\x36\xae\x20\x04\xdf\xf5\x4a\xc8\x4a\xd9\xfd\xe6\x2f\x7c\x43\x98\x0e\x2f\xee\x61\x16\x0e\xe1\xee\x93\x9c\x71\x91\x6c\x34\xcb\xab\x98\x6d\x51\xa0\x94\xcb\xe9\x39\xa6\x6d\x86\xae\x50\x7e\x37\x80\x3a\x1d\xda\x81\x0c\x10\xcc\xad\xd4\xbc\x01\x03\xf0\x80\x56\x0e\xc5\xa9\xbb\x9c\x62\xab\xd7\x06\xae\xaf\x8e\x1a\xb8\xf1\xe7\x48\x6e\xca\x4a\x42\x5f\x0b\xfb\x72\x8d\x61\x5a\xc1\x73\xc3\x5d\xa7\xa1\xf9\x8e\xce\x8d\xda\x9a\xba\xd2\x37\xb0\xca\x41\x48\x83\x58\x48\x00\x14\x11\x95\x5a\x29\x59\x8b\x7e\x5e\xf7\x10\x71\x43\x8a\x22\xaf\xeb\x42\x59\xa6\x2b\xb7\xe0\xd8\x9e\xcf\x17\x9e\x18\xbb\x00\x1b\x35\xd5\x84\x99\x0c\xe4\xf7\x86\xe2\x12\xb8\x1e\x0e\x1b\x66\x18\x35\xa2\xaf\x86\xf3\xe1\x00\x81\x4d\xf6\x84\x51\x6a\xc9\xbc\x89\xa1\xf9\xe9\xc2\x2a\xc1\x61\xca\x01\x06\x04\x30\xb9\x7b\x1d\xa1\x77\xde\x3e\xc0\xaf\xe3\x0e\x9d\x94\x2d\x92\xaa\xa4\x5c\x30\xdd\x22\xa1\x01\x88\x3e\xaa\x56\xd3\xda\xcb\xb9\x96\xc5\x93\xa9\x18\x66\x0f\x0c\xc4\x38\x2c\x86\x3c\x7f\xc0\x28\x0f\x30\x4c\x72\xba\x80\xeb\xba\x11\x72\x5a\x69\x63\xe0\xa0\x0a\x01\xad\x1b\xcb\x42\x99\x67\x4c\x9a\x4b\x06\xf0\x0f\xc0\xaf\x79\x6c\x19\xe7\x18\x6d\xf6\x70\x67\xfe\xfd\x4c\xe2\x89\x9e\x2c\xb2\x8b\x27\xef\x3a\x8d\xe3\xd1\xad\x34\x0c\xf8\xe7\x5e\x4a\x41\xdf\x9c\xdc\x49\xef\xbc\xa7\xdf\x7d\x5f\x06\x06\x7d\xf9\x5b\x5c\x9b\x51\xf3\xdd\xc9\x77\xdb\x6f\xd5\x9f\xd1\x03\x5c\xe7\x21\x1c\x06\xbe\x6b\x8f\x31\xa7\x13\xf7\xb6\x1c\x6f\x79\x02\x21\x0e\x15\xdb\x96\x87\xeb\xe9\x54\x9a\x5c\xa3\x27\xbd\x15\xdc\x87\xe2\xed\x62\xfb\xcc\xb9\x01\x80\x40\x1f\x43\x74\x36\x4d\x5a\x68\xbd\xb2\x8b\x1f\xd4\x84\x67\x97\x2f\x30\x8d\x2d\x59\xad\x48\xd5\x9d\x97\xc2\xa8\x95\xac\xec\xdf\xab\x42\x4e\x41\xbe\x00\x47\x6a\x0c\xdf\x83\x26\xc5\xa6\x2e\xa7\xbe\x8d\x9f\x06\x5f\x1f\xe3\x0a\xe1\x5f\x43\xe6\x2d\xef\x6a\xc2\xe2\x04\xb9\x1d\xdd\xa5\xbb\x2c\xc2\x0e\x58\xcb\x11\x00\xd4\xbb\x7c\x5e\x32\xe9\x4f\x3a\x57\x20\x17\x07\xee\xfc\xe4\xe8\x3e\x52\x82\x34\xd3\x70\xbc\x20\xdb\x7f\x70\x7a\xf0\x66\xf0\x39\x77\x2f\xf2\xf7\x0a\xdb\xd8\xc8\x2c\x0a\x65\x4d\x4b\x59\x6e\xbb\xe5\x6c\x90\x47\x83\xa3\x32\xda\x10\x4c\xc1\x69\x74\xa3\x02\xb9\xb1\x74\x1e\xab\x26\x8a\x0b\xa6\x68\x78\x60\x52\x10\x7f\xea\x14\x98\x6d\x70\x00\xb5\x90\x70\x3c\xa3\x24\x0f\x56\x3d\x0f\xf5\x6e\xf9\xff\x57\x8e\x34\xc8\xc1\x48\xa8\x67\xbc\xa7\x02\x6a\x3b\x29\xb1\xb2\x14\x33\xbb\xbd\x95\xf7\xe6\x0b\xea\x15\xaf\x43\x95\x95\x1a\x3d\x00\xc4\x21\x3c\x7e\xfa\x46\x29\x31\x6e\x3a\xa0\x8f\xf7\xb0\x94\xf3\xe9\xc6\x5f\x78\x04\x85\xbc\xa4\x61\xbb\xdf\x23\xf6\xfc\xcb\xa7\x10\x7d\x7e\xdd\xaa\x00\x1a\xb5\xeb\x85\x7e\xdf\x78\xf5\x86\xea\x31\x90\x10\xcf\xee\xd6\x43\x8a\x11\x77\x61\x46\x72\x31\x63\x5c\x97\xd3\x01\xbf\x6d\xda\x07\x01\xcc\xb7\xd5\xb8\xd3\xa2\xbf\x14\x4d\xaa\x64\x3d\xee\x50\x59\x36\xc0\xa2\x5b\x02\x0c\x5a\xbf\x83\x65\x5b\xe6\x81\xa3\xf4\xdc\xa7\x31\xcd\xf3\xc0\x63\x42\xc6\x81\xa4\x9f\x40\x2e\x92\xff\x03\xf6\x4f\x32\xbc\xe2\xe8\xee\xeb\x7d\x82\x6b\x1d\xc6\xa9\x4d\xb4\xf9\xfc\x09\xf1\x34\x9c\x87\x84\x9f\xf9\x46\xf5\x18\x87\x0f\xcf\x8e\xe6\x47\xba\xcf\x54\x0e\xc2\x9a\xfb\x43\x36\x50\xbc\xa7\x81\xad\xc5\x66\xdb\x05\x45\x2e\x44\x6a\x31\x8d\xc6\x34\xf4\x35\x99\x9f\xd0\xb2\xe4\x45\x6b\xe7\x30\x9e\xba\xd1\x51\x22\x7f\x70\x20\xde\x82\x47\x57\xb1\xae\xaa\xbc\x9c\x0f\x30\x8f\x7e\xcb\xb1\x03\xfe\xd4\x70\x8a\x91\x7c\xe9\x9b\x77\xf7\x75\x56\xec\x90\x15\x38\xcf\x61\x0b\x25\x8a\xbe\x0d\x96\xdf\x17\x3a\x5b\x17\x64\x3e\x03\x04\xb6\xbf\xa9\x69\x4d\x48\x32\xb5\x16\x63\xc6\x49\x7f\x58\x4f\xc6\x03\xe7\x1c\xa6\xa6\x98\xaf\x07\xb8\xb0\x15\xa2\xab\x65\x5e\xe6\xa6\xce\xa7\x68\x9a\x23\xdf\x34\x5e\x7f\x6c\x86\xe2\x98\x29\x81\x9c\x37\x2b\xa6\xe5\x47\xf8\x16\x4b\x0d\xcf\x3a\x2b\x40\xd3\x59\xb2\x90\xb7\x84\x73\xba\x92\xd3\x1b\x89\x87\x5a\xb5\x15\xba\x64\x60\xd0\xce\x57\xd6\xbb\xbd\x49\xc8\xb9\x41\x75\x89\xa6\xbd\x26\x41\xf3\x82\x7b\xbc\xb1\xf2\x33\x59\x13\x31\x91\x8e\xda\x42\xf4\xa6\xc7\x12\xf0\x06\xb6\xaf\xb0\x84\xef\xdf\xc6\xa9\x4c\xf2\x72\x56\xac\x55\x39\xc5\xa0\x59\xd4\xd0\xdb\x86\xc2\x20\xd8\xd2\xe0\x10\x3e\x7e\x8d\x61\x1e\x64\x73\xa5\x41\x41\xe0\x7f\x80\xb2\xf3\xb8\x3a\x6f\xc0\x33\x37\x2a\x45\xda\x7b\x18\x9f\x56\xb8\x6a\x52\xd1\xe5\x86\x8f\x70\x5e\xb6\x12\x73\x86\xbd\x80\xdb\xe2\xc2\x6f\xb0\xc4\x25\x0c\xc7\x91\x78\xd7\x6b\x6b\x72\x6f\x20\x7a\x0d\xa2\xf6\xe1\x95\x5c\x25\x4f\xce\xcb\x5a\x55\x3f\x29\x79\x9b\x16\x6d\x1c\xd3\x40\x14\x8e\xf2\xe4\x61\x3b\xa2\x4c\xef\x7d\x6b\x0a\xe9\x9f\x2f\xce\x6f\x3f\x27\xdf\xb9\x1f\x07\x22\x90\x26\x85\xbe\xcd\xd5\x06\x93\x42\x43\xd0\x1f\x80\x61\xff\x4f\x92\x68\xff\x92\x46\xed\xbf\x61\x86\x68\xea\xd9\xa0\xb1\x30\x58\x42\xd9\x2b\x06\xe3\x02\x5a\x25\x02\x07\xc5\xf4\x7f\x74\xbb\x90\xc6\xe8\x69\x0e\xf9\x20\x18\x24\x62\x98\xb3\xe1\xa7\xe7\xe8\xbf\x51\x5b\xb3\xff\x82\xbe\x65\x42\xd0\xa1\xfb\xfc\x8f\x6a\x7b\xa5\x5f\x55\x7a\x45\x8b\xf8\xb8\xa8\x47\xa2\x87\x59\xf5\xc0\x7f\x8c\x4e\x8f\x91\xe8\x51\x06\x3e\x78\xfa\x42\xd5\x72\x24\x7a\x94\xf5\x0f\x1e\xbd\x59\xe4\x33\x5b\xd7\xd8\x7f\xed\x43\x87\x51\x74\x71\xfe\xa7\xa0\xd5\xf0\xe1\x04\x56\x4a\x70\xed\xc2\x9b\x1f\x2a\xbe\x8d\x2d\xb1\x15\x4b\xb9\x12\x79\xed\x06\x46\x97\x05\x80\x1a\xf0\x41\x33\x42\x7d\x40\x20\x65\x62\xa7\xa4\xbd\xaf\x8d\x2a\x66\x83\xf0\x45\x67\x21\xfe\x49\x4f\x6f\xf6\x6d\xbd\xa1\xa5\x74\xea\xcc\x74\xa0\x16\x17\x4b\xf9\x37\x0e\xbd\xad\x3e\x4c\xd5\xaa\x26\x90\x34\x50\x6a\x45\xc6\x66\x46\x2a\x78\x0e\xf1\xbe\x7c\x0f\xe7\x4b\xff\x46\x6d\x8f\xab\x79\x70\x17\x30\xd1\x7a\xb2\x72\xfb\x22\x37\xde\x27\x91\x6d\xba\xa3\xa4\xe8\x90\xbd\x3c\x6c\x31\x59\xa5\x63\x99\x62\xf1\xed\x28\xea\x1a\xc9\x81\x48\x6e\xd4\x96\x96\x44\x63\x99\xbc\xc3\xe2\xef\x99\x82\xc9\x95\x7e\x26\x1e\x3e\x64\x5f\x7a\x47\xcf\xdf\x8b\x11\xf3\x75\x6c\x44\x68\xc6\x8d\xe9\xca\x96\xd7\x32\xba\x51\x72\x8f\xc0\xdd\x21\x51\xd9\xaf\x64\xf0\x81\x46\xca\xe3\xcd\xb4\x52\xaa\xfc\x8f\xc0\xe6\xf1\xc1\x7f\x86\x07\xd3\xc2\x1e\xaa\xff\x91\x3e\x60\x25\x56\x72\xae\xfe\x23\xfe\xc9\xeb\xe3\x2e\x63\x5f\xa0\xfd\x14\x9e\xe0\xee\x0c\xbf\x69\x17\x86\x07\xe9\x1c\x8f\xda\x47\xdb\x16\x9d\xac\xeb\x5a\x97\xa1\x2a\xfe\x36\xe1\x41\xa5\x20\xff\x19\xb2\x45\x7e\x89\x65\xee\x36\xb1\x44\x3d\x8c\xaa\x88\x5f\x7e\xa1\xb2\x00\x8b\xea\xcd\xc9\x2e\xf9\x0f\x8f\xad\x7d\xe6\xdc\x2b\xb5\x7b\x42\xf7\x70\x5e\x75\xef\x30\x15\x4f\xff\x3b\x1f\xa9\x74\xa4\x74\x1d\xaa\x61\xa5\xfe\x2e\xe7\x2a\x7d\xfd\x77\x3b\x57\x1d\xfd\xf6\x73\x35\x74\x6e\xd0\xb6\x25\xf7\x0e\x1b\xae\xd3\xdf\xd0\x36\x5d\x42\x69\x5b\x70\xe4\x17\x68\xec\x38\x0d\xae\xd0\x2f\x7c\xb1\x5e\xa7\x07\x34\x94\xb9\xf4\x4e\xcd\xf8\xf3\x56\x55\x21\x5d\x33\x7c\x0c\xe4\xd7\xbb\x3f\x06\xc5\x3e\xf7\x63\x1e\x34\xa3\x55\x62\xde\xad\xc3\xfa\x06\x34\x52\x04\xe8\x8e\xce\xc1\xb2\x00\xe3\x3d\x5e\x93\x80\x81\x4a\x72\x20\x54\x62\x0a\xf9\x76\xec\x65\xcb\x25\xce\x71\x90\xed\x80\xfc\x28\x45\xad\x57\xfb\x90\xe4\x03\xe9\x8d\x61\x10\xf4\xad\xaa\x08\x14\x14\x7f\x33\x68\x54\xb8\x14\x01\xe2\xfd\x50\x5c\x96\x05\x80\x73\xf2\x62\xfe\xee\x02\xf8\xf0\xca\x25\xbe\x70\xa9\x09\xb2\xf5\xaa\xc8\xa7\xd2\x63\xde\xb3\xc4\x3e\x4b\x7d\xeb\xb6\x21\x90\x8b\x30\xd2\xbf\xf2\xdb\x0c\xa4\x2e\xbd\xae\x01\x64\xc7\xc7\x2f\xa3\x81\xad\xd1\xde\xa1\xb8\x28\x91\x33\x78\x1b\x3f\xba\x4f\x3a\xf0\x51\xd6\x5f\x3f\x14\x2c\x3d\x17\xe0\x8c\xff\x6e\xfa\xbf\xce\xfb\x7f\x58\x30\x60\xc7\xe1\xe7\x7e\x83\x29\xf3\x97\x9c\xbd\x36\xa2\x7b\x02\x1a\xf5\xc7\xf6\xaf\x3f\x8c\xbe\x4e\x46\xa4\x1d\x25\x6e\x15\x57\x52\x1c\x1c\x88\x17\x21\xad\x9d\x90\x7e\x12\x05\xb8\x97\x40\x38\xdb\xba\x16\xfb\xe8\xaf\xd0\x9d\x47\xc5\x6b\x57\x20\xeb\x4f\x5e\x06\x7d\x65\x63\x1c\x87\xa8\xfe\x84\x61\xeb\x1c\x64\x68\xd9\xb8\xf1\x1a\x30\x5f\x57\x95\x9e\xc8\x49\xb1\x15\x92\x34\xa9\x2c\x5f\x87\xfd\x6f\x03\xdb\xb1\x51\xb7\x15\x92\xce\x9b\x69\x9e\xdb\x43\x0a\x3b\xbb\x59\x6c\xc5\x58\x6f\x4a\x55\x9d\x91\xad\x1d\x91\x72\xf5\x12\x50\x63\x8c\x58\x97\x2e\x5a\x30\xd8\x03\x5d\xdf\x33\x3d\x6d\xfb\xf8\x30\xa2\xc7\x15\x6f\x99\x9e\x72\xbd\x1b\x36\x3e\xd3\xd3\x21\x69\x0e\xfe\x9a\xab\x0d\x79\x2c\x12\x76\xc3\x5b\x52\x1f\x77\xa8\x46\x91\xc2\x26\x2e\x94\x4e\x91\x5d\x73\x87\x41\x9d\xad\x0f\xef\xb3\xb4\x19\xee\x8b\xc0\x1d\x9d\x3a\x00\x3a\x82\xb4\xde\x13\x78\x8f\x9d\xbb\xc0\x8b\x1d\x8e\x4e\xad\x01\x67\x0f\x09\x81\x62\xfd\xb4\xd0\x46\x99\x26\x32\x26\x15\xda\x13\x23\xbe\x1e\x1b\x13\xfd\x42\x3b\x25\x95\x64\x58\x2b\x8e\x29\x59\xc6\x82\x83\x36\x8c\x7b\xc8\x73\x13\x41\x9b\xd2\x2e\x33\xb5\x25\x56\x39\x3a\x12\xb5\x8e\x56\xf2\x4b\xca\x1c\xbb\xc2\x28\x4e\xb8\xcf\xe8\x75\x25\x96\xb2\x94\xf3\x08\xe9\xea\x3e\xfb\x6b\x46\x1d\x17\x47\xd4\x46\x6c\xa4\x78\x06\x73\x3f\xea\xb0\x41\xd8\xa2\x7b\x7c\xce\x9d\xf9\x42\xdf\x93\x40\xad\xf7\x98\xcd\xa2\xb0\x27\x20\x8f\xf0\x09\x42\x42\x7b\x90\xcf\x37\xc3\x70\x56\x0f\xa0\xe1\xf7\x54\x1a\xc3\x97\x7c\xd4\x0f\x10\x81\x47\xbd\xe8\xb5\xc3\x6c\x71\x83\xc3\x5f\xc6\x0b\xef\x88\xfa\xce\x3a\xa3\xec\x01\xfc\x19\x9d\x01\x59\x60\x20\x6a\x7d\xcf\xae\xc0\x77\xe2\xae\xc0\xa3\x5e\xf4\x3a\x6d\x66\x78\x95\x76\x24\x74\x16\x0a\x85\x98\xa5\x20\xa4\xb0\xa8\xa5\x02\x87\x5e\x61\xa3\x71\x06\xc2\xa4\x3a\x1c\x66\x5e\xea\x7d\x43\xdc\x1f\x83\xc9\xd9\xad\x8a\x17\x72\x35\x16\x4b\x99\x97\xb8\xaa\xa5\x58\xca\xd5\x0a\xc0\x89\x10\xc6\x68\xb5\x9e\x14\xf9\x54\xcc\xe4\xd4\x87\x60\xcd\xd6\x05\xc2\x16\x11\xd8\xad\xbd\x02\xef\xf9\xc8\x07\x87\xc8\x11\xf0\x9b\x24\x0f\x5c\x25\x25\x32\xf8\xd2\x19\xa2\x6e\xa9\x39\x7f\x18\xbb\xb7\xa7\xa0\x3d\xb0\xc4\xc0\x1f\x87\xbe\xed\xbf\x27\xc1\x36\x2b\xab\x39\x7a\x51\x41\x62\x57\xb9\x02\x15\x35\xe4\xf6\x7b\x80\xb9\xfe\x7c\x43\x88\xb4\x87\x61\xd1\xb5\x62\xf9\xdc\x97\xa8\x9c\xb7\xa2\x8a\x87\x12\x04\x08\x6f\x0c\xe6\xc0\x4c\x6e\x19\x61\xdf\x42\xff\x0b\x65\x80\x98\xcb\x5d\x2d\x26\x6a\xaa\x97\x68\x31\x46\x30\x72\xf1\x42\xae\x48\x8b\x8f\x72\x5f\xa5\xe4\x0d\x2a\x82\x23\x8b\xf3\xf1\xab\x0b\xe6\x14\x68\x6f\x09\x2a\x13\x63\xf4\xe7\x1c\x93\x63\x60\x2f\xf3\xd1\x3e\x4b\x79\xa3\x04\x46\xe2\x68\x02\xd7\x81\xbe\x56\xb2\x34\x84\x78\xac\x10\xd0\x1a\x6f\x5f\xe8\x62\x7a\x71\xee\x14\x2f\x43\x34\x9b\x04\x5c\x64\xa8\x94\x1b\x04\x41\xb4\xa4\x02\xb0\x0d\x79\xb0\x57\xaa\x04\xdc\x10\x4a\x12\x11\x2b\x20\x70\xe2\xff\x19\xa9\x32\x86\xd7\x15\x2e\x2f\x1c\x7c\x70\x74\x38\x4c\x3c\x30\xcc\x7d\x2b\x82\xe0\xe3\xcf\xea\x98\x8c\xc1\xef\x0f\xb8\xe5\xbf\x8b\xcc\x11\x83\x4a\xf0\x40\x7e\xae\x88\x71\xc0\x79\xc3\xeb\xeb\x37\xe7\xa7\xaf\xcf\xaf\xae\x2f\x5e\x5e\x9d\xbf\x7e\x79\xfc\xd3\x9b\xeb\xb3\xcb\xeb\x97\x97\x57\xd7\x3f\xbf\x39\xbf\xbe\x7c\x7d\xfd\x9f\x97\x3f\x5f\xbf\xbd\xf8\xe9\xa7\xeb\x93\xf3\xeb\xe7\x17\xaf\xcf\xcf\x22\x84\x6f\x5c\x3e\x97\x56\x4c\x70\x24\xfd\x37\x86\x8d\x22\x87\xa1\xe6\x99\x9a\xac\xe7\xf4\xee\x79\x85\xee\x48\x6d\xd5\x1b\xe5\x0e\xe3\xf9\xf0\xd0\xae\xf6\xd2\x84\x20\xd1\x0d\x54\x10\x78\x4a\xb0\x20\x71\x96\xf1\xe0\x94\x84\xab\xa7\x11\xc2\x42\x50\x22\x1f\xbb\xaa\x75\x40\x08\x40\x89\xa1\xbd\xe7\x16\x12\x9d\xc2\x09\x89\x60\x58\x92\xa7\x55\x47\x6a\xf2\x33\xf0\x0a\x0e\x7e\x10\x76\x69\x6f\x34\x01\x25\x8c\x60\xf8\x5e\xea\xf3\xd9\x4c\x4d\x6b\x44\xd2\x3d\x38\x10\xe1\xbf\x27\x93\x27\xf4\x1f\x94\x7c\x85\xa0\xe0\x2a\x7b\xab\xab\x1b\x80\x89\xf3\xc5\x7d\xc9\xa7\xf0\xd9\xff\xd4\x6b\x58\xfa\xcc\x01\xa3\x52\xa6\x16\x7d\x60\x07\x59\x26\x96\xba\x52\x7b\x98\x07\xfd\x55\x21\xa7\xce\xbf\xff\x9b\xb8\x01\x8e\xea\x53\xfc\x3e\x86\x66\x89\x23\xf1\xaf\x49\x3b\x7d\xc9\xa7\xae\xa5\x8e\xe6\x71\x99\xf9\x5a\x7f\x84\x5a\xae\x24\xd1\x3c\x83\x10\x1c\x80\x9e\xfc\x53\x6b\xef\x9f\xba\xde\x9f\xea\xb2\x56\x65\xfd\x5a\x19\x38\x74\x9e\xfe\x31\xe9\xfd\x53\x3f\x4e\xa7\x2e\x57\xc1\x91\xf8\xb6\xa5\x47\x4f\xc3\x88\x9e\x57\x76\x99\xff\xb1\xd9\x1f\x28\xf9\x94\x8d\xfd\x6b\x35\xb3\x1f\xfd\x26\x6d\x24\x94\x7c\xea\x66\x09\x55\x87\x97\x3f\xbf\xbc\xba\x78\xf9\x7d\x00\xf2\x83\x27\xe7\x67\x30\xc0\x38\x92\x2f\xc3\xa3\x6f\x63\x38\x45\xd8\xed\x2f\x10\x38\xfd\x62\xb9\x2a\xd2\x3d\x50\x92\xc8\x85\x4c\x89\x5c\xa2\x70\x47\xc8\x02\xb6\x5a\xad\x62\x94\x59\x1e\x91\xef\x8b\x10\xd4\xef\x32\x9f\x2f\xe8\xce\x55\xaa\x8d\xa8\x2b\xe5\x6d\xbc\x76\xe1\x86\x4c\x14\x48\x6d\xab\xec\xb5\x78\x26\x72\x5b\x80\x30\x49\x72\x3a\x20\x08\xef\x77\x45\x91\x1c\x3e\xbd\xad\x50\xb8\xbc\x6d\xef\xea\x90\x83\x1c\x9d\xa1\xf0\xdd\x95\x9c\x8b\xc7\x61\xd1\xa0\x37\x94\xdb\x17\x8d\xcb\xa8\x1b\x5f\x7e\x21\xc5\xb4\xe7\x40\xf3\x1d\xe1\x34\xf5\xde\x87\x9a\x34\x68\xf1\x6b\x7e\xff\xf9\x8c\xd6\x74\xb4\x27\x4a\x39\xce\xa5\xff\xcf\x6f\xe2\x47\xc6\xb1\xd0\xbd\x4d\xce\x81\x5d\xfd\xa0\x4d\xfd\x5a\xeb\x9a\x43\x41\xc1\x3d\x92\x81\x96\xe5\x46\x6c\x00\x96\xba\x54\xc6\x1e\x8a\xae\x8e\x43\xbb\xb5\xe7\x64\x4e\x69\xc0\x0e\x0e\x08\x78\xda\xee\x35\x99\x97\xaa\xba\x28\x6b\xfd\x66\x3d\xb1\xeb\x22\xf2\xd5\xa5\xe5\xeb\x38\x9f\x87\x33\xce\xf2\x0c\x90\xad\x73\x94\x7d\x2a\xad\x6b\x12\x22\x96\x4a\x96\xc6\x45\x96\xf5\x28\x60\x03\xc2\xcb\xa6\xba\x2c\x09\x8d\xbf\x52\x8a\x01\x42\x2c\xa4\xc1\x84\x28\x6b\x97\x49\x60\x18\xb8\xac\xdf\x42\x29\xa4\x14\xdf\x40\x7c\xf3\x78\x30\xaa\xae\x1d\x66\x47\xb4\x83\xa6\x23\xe7\x6f\x48\x48\x32\xb8\x62\x69\x7e\x62\xf2\x23\x72\x48\x12\x59\xb8\xda\x62\x51\x97\x02\x5d\x3c\x7e\x8c\x95\xfd\xa4\x82\x06\xf4\x34\xfe\x50\xf4\x19\x27\x0f\x68\x3c\x82\xc3\xdb\x3c\xa4\x6e\x08\x05\x03\xb8\xbf\x2b\xba\x91\x55\x99\x97\xf3\xbe\x2b\x3e\xbc\xb6\x4f\x54\x76\x3c\xd1\xeb\xfa\xb5\x9a\x99\x8b\xf2\x35\xac\x82\x81\xe8\xfd\x0b\x78\x0a\x58\x69\xd6\x18\x8c\xb1\xa6\xa1\x70\x50\xd5\x79\x6d\x68\xcd\xf4\xf7\xbc\x7a\x6b\x28\x7a\xe2\x6b\xd1\xf3\xcf\x79\xd0\xc8\xca\xca\x7e\x7e\x68\xf5\x8c\x72\x1f\x40\x5c\x38\xc2\x54\x5f\xb8\x54\x53\x48\xa5\x54\xb7\xaa\xa2\x26\xa0\xfa\x63\x81\xba\x3e\xc0\x57\xfd\xfb\x1a\x9c\x11\x4d\x2d\x0b\x85\x09\xf5\x7d\x18\xde\xaa\x52\xb7\xb9\x5e\x1b\xde\x98\x81\xc7\x21\xac\xd4\xcc\x0c\xed\x6d\x9c\x50\x57\x0a\x3d\xcf\xa7\xe0\xd7\xed\x86\xfe\x2c\xcf\xa0\xb3\xd0\x36\xa0\xc1\x5f\xd1\xb1\xe6\x22\x18\x7a\x83\xa6\xf4\x12\x26\x01\x10\x8e\x7a\xc7\x81\x76\x2f\xb8\x3d\xdd\x35\x0b\x51\x26\xe9\x8f\x1c\xe8\x64\x46\x0b\xc1\x8a\xb1\x61\x65\xc6\x87\x42\x37\xa6\xcb\xaf\xd9\x11\xd2\x58\xe6\x7e\x61\x5a\xb6\xd9\xc3\xfe\xbd\xe8\xb5\x67\xea\xf8\xb9\x94\xe8\x3d\x2a\x66\x39\x64\x76\xcc\xc0\xc3\x56\x32\x16\xc0\x10\xb1\xa3\x44\x1a\xbc\x79\xb6\xb2\x93\x31\xed\x97\x7f\xb6\x6b\xf7\x4d\xa1\x37\xaf\x64\xbd\x48\x0f\x54\x7f\x24\x7a\xc9\xd2\x3f\xf1\x43\xf9\xa9\x27\x2b\x62\x7b\x43\x6c\x88\x87\xde\x77\x2c\x19\xce\x4e\xc1\x18\x5a\xe2\x0f\xdd\x35\x7a\xb8\x00\x1e\xf6\xb1\xa0\xe5\x1f\x9e\x05\xfe\xe6\x83\xe9\x78\x95\xf1\x39\x56\xdc\x21\x77\xa7\x6a\x98\x03\xba\x37\x8e\x07\xbc\x05\x6e\x74\x70\x14\x9e\x54\xb2\x9c\x2e\x94\x01\xdc\x8a\xa2\x10\x1b\x59\xdc\xc0\x0d\x78\x23\xab\xcc\x88\xf5\xca\xd9\xff\xed\x51\x42\x67\x83\x16\x46\x29\x4c\xe0\xb5\x92\xf5\xc2\xbf\x46\x7c\x21\x7b\xff\x1e\xba\x88\x26\xc8\x5e\xa0\x00\x11\xd7\x9e\x49\xc1\x13\x0c\x49\x81\x7f\x9a\x2c\x28\x48\xd0\xee\x73\x6c\x45\xa6\x64\x81\x20\x0a\xe0\x34\xe6\x56\x0a\x97\xbb\xec\x83\x89\x38\x12\xd1\x62\xa1\x33\xde\xee\x57\xee\xa8\x8b\x1a\xd3\x63\x5b\x3a\x3d\xdb\xc3\xeb\x13\x71\xe4\x0b\x3e\x73\x7f\x85\xb5\x18\xa9\x15\x61\x51\xba\xc2\xbf\xfc\x22\xe8\xef\x93\x48\xdd\xf7\x16\x8e\x59\x19\x4e\x62\xa7\xd5\x83\xab\x7c\xea\x8d\x78\x31\x43\xbb\xce\x54\xaf\x72\x65\x5c\xf8\x15\xd2\x25\x4e\x83\xf0\x4d\x2e\x1d\x9a\xbd\x05\x4d\x17\x79\x01\x90\x23\xf6\xb6\xe1\x28\xf1\xc4\xf1\x98\xf1\x2c\x2f\x32\xa6\x9c\x20\xf5\xc9\x42\xae\x56\xaa\x0c\x39\x31\x26\x32\x2f\x20\x33\x44\x29\x0a\xbd\x71\xc4\x56\x55\xae\xab\xbc\xde\x8e\x30\xc9\x9a\xcc\x0b\x95\x81\x7e\x1c\x9a\xd4\x33\x44\xbd\x52\x6b\x43\x61\xd9\xce\x3f\x1f\x5e\x04\x79\xd3\x0d\x28\x96\xb7\x4b\x9a\xc6\x0c\x9f\xa4\xd9\xa4\xa1\x90\x88\x2a\xf9\xf3\x13\x27\x39\xa9\xe6\x12\xd0\x3b\xea\x32\xce\x0e\x8a\xf3\x71\xab\xbc\x0f\xa4\xe5\x0a\x76\x84\x8e\x1d\x70\xa7\x6b\x37\xee\x88\x21\xab\x9b\x72\x5b\x6a\x15\xf3\x66\x6d\x6e\x3b\x2e\x8a\x36\x1b\x37\xb9\x67\xe3\x4e\x7e\xd3\xc6\x45\x5b\x25\x6d\xa0\x1b\x72\x9c\x36\xcb\x1c\xf2\x72\x1e\x8b\xd4\x2e\x39\x96\xcb\x75\x0d\x82\x01\x5e\x3b\x18\x71\x50\x18\xc9\x72\x8b\x2c\xd6\x8a\x0a\x20\x33\x8b\x37\xcc\x8f\xc8\x53\x03\xd7\x52\xb0\xf1\x01\x49\x62\x4b\x5b\x5a\x9c\xe0\xe9\xca\x84\x68\xcf\x37\x07\x10\xc5\x0f\x40\x32\x43\x7f\x8e\xff\x5a\xfe\xdb\xd0\xe3\x33\x66\x01\xfc\x7e\xd2\x76\x6f\xa0\x54\x69\x34\xc4\xb0\x45\x55\x65\xb7\xef\xb1\x57\x67\x36\xdf\x9d\x84\xbd\x9c\xe5\x33\x48\x3f\xc3\xf2\x8b\xc3\x22\x32\x43\x3b\xd4\x7c\x2f\xc7\x64\x0c\x8d\xff\xb4\xca\x8d\xd9\x87\x90\x11\x40\xd0\x38\x06\x47\xd5\x40\x6c\xa2\x0a\x8d\xf6\x8e\xc0\x0b\xec\x0d\xde\xb6\x70\x88\x24\x11\xed\xf9\x04\x3d\x5c\x5b\xca\x07\x62\x54\xf1\x84\x2a\xba\xb1\x97\x61\xab\xba\x15\x33\xf1\x8f\x4e\x3a\x4d\x6e\x8d\xa1\x31\x2d\x2c\x0e\x45\x02\x4a\x6c\xe3\xb4\x98\x6b\x0c\x13\x0c\xb4\xc8\x4c\x36\x10\xa6\xd0\x1b\x38\x95\x46\xc2\x4c\x65\x19\x77\x1a\xd8\xaa\x92\xd3\x85\xe3\xab\x61\xd1\xe2\xa1\xc6\x16\x26\xc4\xd5\x62\x4d\x1c\x12\xd0\x2b\xe3\x63\xa3\x3c\x2f\x3f\x38\x08\x75\xde\x40\xa6\x07\x47\xfb\xd8\x33\x47\xa3\x6a\x6e\x1b\xcc\xb3\xe7\x56\x3e\xa2\xfd\x16\xa5\xc0\xb7\xef\xaf\xef\xc3\xfc\xae\x5b\xb9\xdf\x75\x27\xfb\x4b\x3e\x1a\x04\xda\xce\x09\x6c\x9d\x44\x7a\x1c\xce\x2f\xd1\x60\x72\xd7\x9d\x5c\xee\x8e\x36\x4c\xda\xdb\x20\x3f\xb1\x0d\x7e\xf8\xae\x77\x72\x32\x38\xc1\x79\x8b\x78\x5b\x1b\x73\x79\xd2\x32\x97\x22\x9d\xa9\x93\x78\xa6\x76\xcc\xd5\x5d\xb3\x75\xe7\x58\x75\x0e\x4b\xe7\x30\x36\x46\x8c\x8f\xd9\x5d\x33\x77\x8f\xf6\x74\x2c\x95\xce\xa5\x75\x47\x7b\xee\x98\x45\x5e\x38\x9a\xc5\x56\x41\x1c\xdf\xd8\x03\x04\xdc\x4d\xf4\x1a\xd2\x5c\x39\x04\x09\x9a\x62\xbb\xa7\x29\x38\xa1\xcc\xc0\xcd\xc5\x24\xe9\x04\xbd\x19\xda\x49\xc4\x11\xef\xba\x5f\xb2\x41\x91\x9a\xe1\x1f\xf6\x25\x93\x31\x69\xec\xdb\x3a\xf1\x9a\x09\x18\xc6\x1d\xc1\x94\x1d\x61\xa2\x90\xab\x01\xa6\x9c\xf9\xaf\x5e\xe0\x6b\xbf\x4f\xca\xc4\x70\xa7\xf0\xa2\x7f\x8e\x83\x2b\x21\x71\x27\x44\x74\x82\xfe\x6a\xc0\x94\x4d\x4d\x5d\xd3\x50\x5c\x0c\xd5\xd0\x45\x58\xb3\x2b\x99\x1d\x95\xa6\x92\xed\x37\xbf\x64\xc1\x21\x1f\x14\x34\x4e\x57\x14\x6f\xc9\xcf\x93\x1c\x3b\xae\x61\x10\xbe\xbf\xc9\x8d\x12\x27\xa0\x5e\x43\x93\x60\x93\x40\x53\x62\xeb\xb8\x5f\xdb\xd1\x81\x0b\x2b\x09\x7e\xe1\x5e\x4d\x44\x5f\xe1\xf2\x3e\xba\xe3\x52\x4e\xb5\xfd\x8d\x3b\xaa\x9d\xfa\x32\xf3\xbc\xe2\x07\x07\xe2\xa5\xfa\x50\xbb\x8b\x5b\x95\xdb\xff\xeb\x8d\x73\xdd\xf2\x18\x77\x6e\x86\x02\xf6\x43\x94\x2b\xf3\xe0\x4a\x7d\xa8\x87\xb1\x8e\x3d\x6a\x43\xc7\xf5\xae\x55\x27\x1b\xf2\x13\xfa\x80\x64\xf6\xd6\x7e\xa9\x79\x8d\xf6\x0a\x3a\x16\xd3\x47\x70\xeb\x11\xf7\x0e\xcf\x98\x74\x78\xc4\xea\x47\xaa\xe4\xf8\x48\xb0\xdb\x22\x2f\xb9\x2e\x29\x74\x00\x9a\xd7\x3a\xea\x9d\x57\x7d\x1a\x8e\x87\x18\xaa\x8c\x1c\x32\x0e\xc8\x7c\x18\xab\xb3\xdd\x70\xf0\x96\x77\x7f\xb5\xe5\xbb\x81\xef\xde\xa1\x2e\x77\xf1\xd3\xd8\xa8\xc6\x48\xa5\x55\xf8\x88\x31\x56\xff\xd1\x81\xba\xea\x8d\x4b\x1f\x1b\xf8\x2e\x68\x6f\x17\xaa\x52\x08\x5a\x74\xfe\xe6\x27\x2b\x3a\x42\x16\x3e\x74\x43\x80\x34\xe3\x68\xf2\x38\x38\x10\xca\x14\x79\x59\xef\x67\xb9\xb1\x0c\x63\xbf\x54\x1f\xea\xfd\x22\x2f\x95\x28\xf5\xfe\xba\xac\x2c\xff\xb4\x2f\x5a\xcc\x88\x3b\xb7\xdd\xdb\xbc\x5e\xbc\xd4\xaf\x74\x55\xcb\xc2\xfc\xcf\x1e\xfc\x3d\xf7\xa0\x43\xcf\x00\x42\x0f\x89\x10\x8e\xfc\xff\x6c\xcf\xff\xef\x6e\x4f\xb0\x38\x1f\xff\xf4\xd3\xc9\xf1\xe9\x8f\xd7\x27\x97\x97\x3f\xfe\x78\x7e\xfe\xea\xe2\xe5\xf7\xd7\xaf\x2e\x2f\x7f\xba\x7e\x73\xf1\x7f\x21\xe3\xda\x13\x34\xfc\x4e\xc9\x34\x7d\x12\xf2\x5a\xbe\xd2\xba\x10\x47\xe2\x1d\x8b\x54\x7c\xee\x36\x49\xa6\xd4\x4a\x99\x9a\xe4\xbf\xb0\x91\x5c\xae\xcf\x62\xeb\x44\x1d\xe7\xfe\x0c\xc2\x90\x53\x71\x7e\xc5\x10\x20\x83\xab\x13\xe2\x32\x11\x6c\x83\x2a\xeb\xbc\x52\xf4\x01\x2b\x13\x01\xce\x82\x33\x16\x52\xc2\x4b\xdb\x7b\x4b\x0d\xe4\xbb\x3d\xb0\x00\x37\x2a\xe8\x9a\x2a\x0d\x7c\xb2\x2c\x00\x16\x89\xa3\x16\xec\xf6\xb7\xc2\x94\x37\x30\x52\x66\x6b\x53\xa7\x80\x25\x35\x28\x6d\xc1\x64\x34\xd7\x3a\x13\x79\xa6\x24\x22\xab\x4d\x17\x01\x28\x9f\x62\x5c\xc5\xba\x0c\xd0\xbf\x67\x97\x2f\x48\x51\x5c\xc9\x5b\x55\x19\x59\x10\xac\x9c\xf4\x38\xc1\x59\x3e\x9b\xe5\xd3\x75\x81\x1a\x10\xcd\xb2\x57\xb9\x58\x62\x4c\x03\x2a\x91\xd0\x72\x4d\x0e\x60\x7a\x62\x54\x75\x8b\x80\xc2\x0c\xdf\x58\x16\x05\xa4\xb9\x23\x74\xa0\x61\x60\x53\xb6\x67\x4d\xad\x0d\x05\xc9\xc7\x2f\xb9\x5f\x0a\x80\xa2\x70\x36\x93\x5a\x79\xd1\x2d\xbd\xf4\x7a\xaa\x59\x24\xe7\x2a\x87\x47\x9c\x9a\x6d\x03\xd7\x0e\xd6\x1f\xfb\x29\x26\x82\x06\xcb\xef\x4c\x3b\x2f\x96\x9f\x29\x60\x06\x53\x95\x3a\x88\x63\xb1\xc8\x55\x65\x6f\xa9\x18\xa1\xa8\x57\x02\x5d\xe0\xdd\x1a\x8f\x21\x77\xc8\xa1\xf7\x94\x6d\x80\x1f\x71\x03\x24\xbe\xf0\x2d\xb0\xeb\x31\xf6\x4e\xc7\x1e\xa2\x94\xd3\x5c\xef\xce\x0c\xa2\x5d\x95\x56\x7a\xe5\xb0\xe5\xbc\x25\x2e\x76\x3e\x8e\xdc\xd8\x93\x92\x71\xc0\x5e\x12\xa1\xc7\x29\x06\x70\x8e\xa6\xe7\x2e\x9b\x08\x5b\x38\x99\x1f\x4a\x32\xc0\xda\x30\x8a\x7e\x61\x20\x09\xfb\xf4\x28\x1a\x41\xac\xed\xbf\x38\xe2\xa1\x06\xf0\xce\xcd\xa6\x19\x89\x77\xef\x31\x11\x46\x9c\xd7\x1c\xee\x63\xbb\xa6\x2f\x8f\x52\xff\x77\x8d\xa2\x5b\x7a\x5d\x63\x97\xbe\x8e\x86\xac\xf1\xd6\xb7\x9a\x66\x1d\x9c\xa7\xee\xb5\x3e\xc4\x9f\xef\xe0\xd6\x6e\x01\x75\xae\x98\xb5\x59\x84\x3e\x1f\x76\xa0\x33\xb9\x01\x03\x03\xde\x24\x8c\x56\x0a\x1c\x4d\x1d\x64\x25\x86\x7c\x7d\x20\xff\xf9\x49\xeb\x95\x07\x65\xb7\x5c\xde\xef\xbc\x81\x87\x59\x04\x5b\x64\xcf\x80\xe6\x9b\xb8\x77\xec\xcf\x6d\x2f\xcc\x75\x8f\xa5\x3d\xf6\x30\xbf\x93\xb5\x95\x6e\x20\xfa\xb8\xaa\xe4\x16\xb3\x10\xd3\xf8\x3a\xac\x01\x3b\x1a\xc0\x11\x4b\x4a\xd9\x11\x63\xa0\x0f\x1c\xfa\x41\x8a\x8d\x8e\xa9\x4d\xb2\x7c\x86\x01\xba\x67\x97\x2f\x06\xa2\x50\x32\x43\x1f\x78\xca\x1a\x92\x24\x0f\x05\xc3\x1b\x1c\x30\x60\x54\xe8\x19\x14\x00\x80\xf3\x23\xb6\xf8\x1f\x9e\x3e\x7d\xf2\x6f\xde\x2c\xe7\xf8\x51\xba\xb5\x32\xcd\x04\xc4\x87\xae\x58\x90\x60\xf8\xa0\x87\x05\x05\xf3\xeb\x0b\x7b\x7d\x32\xb7\x99\x39\xfe\x02\x87\xed\x51\xc7\xa1\x96\x90\x80\x36\x54\x8c\x8d\xb7\xd0\xbc\x7f\x83\x58\x9f\x77\x85\x24\xd8\xcf\xc1\x0a\x75\xe7\x11\x23\xf3\xa0\x3d\x8d\x7f\x7b\x1b\x5a\xd2\xf9\x77\xae\x5f\x5f\xeb\x5d\x4e\xf2\xdb\x75\xbc\x27\xfa\xd1\x6a\xef\x0c\x84\xe2\xa5\x76\xe5\x4a\xe8\x28\xb7\x17\x01\x76\xa2\x54\x61\x57\xe3\x46\x01\xca\x27\x84\x8e\x63\x6e\x2c\xf0\xcb\x7c\x06\xf2\xd9\xb5\x02\x7d\x4e\xd0\x31\xc2\xc3\xb8\xf9\xe2\xc8\xab\x70\x22\x57\xde\x1f\xe2\x4e\xc6\x95\x70\xd4\x9a\x94\xe2\x07\x0d\xf7\xe0\x73\x6c\x4e\x9f\x9a\x45\x54\x42\x23\x1f\x3e\xa4\xbf\x53\x8f\x25\x57\x31\xf2\x7d\xba\xe6\x85\x03\x2a\xc1\xca\xa4\x01\x6c\x46\x4c\xb6\x24\x02\xc5\x59\x04\xba\x92\x6d\x46\xcc\xfe\xb5\x9a\xea\x8a\xd0\x6c\xc7\x3c\x7d\xc4\xa9\x86\x15\x5a\x9b\x71\x6b\x9c\x2d\x31\x8d\x13\x69\x10\xad\x10\xcf\x06\x70\xde\xee\xf3\x8c\x9d\x7b\xad\xe1\xb5\x0e\x0b\xda\xc5\x0d\xeb\x92\xac\x25\xb5\xa6\x0c\x0d\x1e\xab\x3b\x4e\xd6\xf9\xcc\x51\x38\x2e\x29\x86\x0b\x39\x90\x14\x15\xa0\x7d\x07\x6f\x25\xa4\x07\xde\x8e\x33\x5d\x4d\x95\xf7\x39\x6f\xfc\x47\x35\x2d\xcb\x8b\x3f\xca\x92\x7d\x1e\x44\xc9\xa5\x56\x27\x98\xc0\xa3\x0d\x81\x30\x19\x98\x81\xeb\x2b\xc3\x04\x57\x6d\x68\xe0\x6d\xf2\x1e\xd0\x77\xc9\x3b\x87\xd8\xb8\xbe\xc3\x27\x6f\x7e\xc9\xc5\xf6\x62\x14\xca\x24\x2f\xb3\x3e\x84\x85\x47\x33\xbe\xb7\xd7\x5c\x51\x32\x5d\x53\xe9\x92\xc2\x8c\x44\xff\xb3\xa6\x7e\xcf\x35\x45\x29\x9e\xfe\xff\xbc\xa8\x28\xd7\xd4\x6f\xb4\xaa\x42\xce\x4c\x5e\xa9\xfb\xd2\xc0\xda\x7f\x1d\xb1\xcd\x06\xfa\x63\x02\xb9\xe1\xe3\x99\x76\xe4\xe2\x39\x6c\x13\xde\x76\x9c\xc0\xed\x21\x58\x21\x09\x38\x50\xe0\xbe\xa0\x2e\x22\xc1\xbf\xf5\x6a\x2b\x07\x65\x09\x79\x78\x13\x37\x57\x76\x4d\x8a\x3d\xd4\x36\xca\xb6\x2e\xc0\x07\xf7\xd5\x87\x91\xc8\x97\x73\xa1\xcb\x42\xcb\x6c\xcf\x8b\x77\x7a\xb9\xcc\xeb\xda\x39\x56\x3a\x0a\xc1\x5f\x91\x3c\xd6\x06\x21\x3d\x06\x25\x7a\xde\x88\x3e\x39\x8c\x0f\xec\x7d\xd3\xfe\x55\x0b\x69\xc8\xd3\x0d\x5c\x8f\xbd\x67\x10\xb6\x41\x97\x10\xfa\x58\xee\x07\x1d\xc2\x1e\x38\x1b\xa0\x33\xba\x2c\x8c\xbd\x90\x83\x7b\x69\x25\x20\x89\x8b\x67\x1a\x26\x42\x93\xa7\xf5\x40\x47\xf8\x92\x00\x9c\x29\x08\x9c\xa2\xb0\x45\xeb\x3d\xc2\x4f\x3f\x93\x1d\x08\xb5\xee\x57\xdf\x53\x41\xb2\xaa\xab\x6d\x98\x07\xe4\x39\x98\xe5\x68\xa2\x28\x6b\xc7\x54\x01\x18\x3a\x47\x17\x9b\x6e\xa7\x85\xa2\xb0\x32\x57\x77\x4c\x1a\x8e\x33\x74\x30\x18\x63\xa7\x92\x5c\x39\xcd\x2b\x47\x24\x3d\x91\x08\x38\xcb\x11\xef\xd5\xed\x85\x3b\x2f\x76\x0d\x12\x51\xec\x91\x83\x02\x73\xdb\x3e\x64\x54\x9d\x55\x4a\xfd\x43\xf5\xff\xf9\xe0\x0b\xbb\xf6\xbc\xb4\x62\x65\x91\x86\x24\x22\x3e\x0e\xa8\x58\x22\x1a\x45\xa5\x13\x29\x09\x2a\x35\x24\xae\x51\x53\x08\xc3\x62\x24\x0b\x8d\x98\x40\x35\x78\xf0\x85\x97\x91\x46\x41\x5c\x1a\x3c\xf8\x22\x3d\x8a\x47\x8d\xc3\x99\x0a\x45\xbc\x75\xd4\x64\xb7\x83\x07\x5f\x44\x1c\x6b\x14\x33\xb0\x07\x1f\x19\x34\xd4\xf7\x76\x00\x65\xad\x58\xec\xa2\x9e\xf9\x54\xf2\xe2\x56\x95\x99\xae\xc4\xaa\x52\xb3\xfc\x83\x32\x74\x8c\xa2\x82\x10\x43\xc0\x4d\xbd\x2d\x58\x0e\x17\x59\x66\xb4\xd9\xec\x49\xd7\x75\xc0\x42\xa5\x57\x95\x5e\xed\x4c\x9f\xce\xce\x35\xe3\x4f\xc6\xf8\xa8\x59\xca\x1b\xf5\x0a\x1a\xf7\x42\xae\xfa\x9e\xec\x20\x10\x09\xd7\x5e\xdf\x89\x23\xf1\xcf\x8f\xb0\x57\xdc\x93\x77\xbe\x62\x8c\x4d\xfd\x9e\xa7\xff\x6e\x66\x82\xf3\xd5\x7b\x6f\xd5\xe4\x26\xaf\x7b\xe2\xeb\xd0\x33\x5b\xb7\xb7\xf1\xcf\x3d\x99\xb8\xe2\x0b\xfd\x8f\x66\xad\x25\x3e\xec\xa8\xb2\x34\xcd\x1a\x2f\xde\xec\xa8\x70\xd9\x2c\xaf\xa3\xe2\x69\xcf\xc2\xe9\xea\x88\x70\x21\xeb\x18\x64\x00\xf0\x27\xf2\xf3\x8c\x91\xa7\x51\x46\x5a\x5f\x2a\x59\x42\x01\xd1\x0f\x5f\xbc\x62\xb3\xf2\xc0\x5e\x2f\xf3\x25\x68\x3c\x55\x99\x8d\x92\xe9\xed\x1d\xbb\x97\xbd\x81\x08\x3f\xce\xcb\xac\xb7\x37\xe0\x75\xf3\x5a\x21\xfe\xc9\x3d\x29\x5c\xb8\xf2\x09\x1d\xc8\xf9\x70\x4f\x1a\x90\x1e\x09\xeb\x43\x74\x68\xde\xd5\x89\x2b\xff\x16\x10\x09\xfd\x2f\xe8\x06\x0f\x35\x3e\xe7\xc3\x8b\x51\x29\xb7\xca\x27\x6c\x86\xf0\x14\xc4\x86\xa7\x60\x5b\x1a\xe1\x4c\xf4\xf3\x99\x90\x2b\x80\x2c\x99\x14\x6a\x2f\x8c\xb8\x2b\x71\xee\x66\xde\xef\x05\xf7\x49\x92\x36\xbd\xd7\xf8\x8c\x6f\x7e\x5d\x06\x52\xb8\xed\xe3\xda\x27\x5a\xd7\xc6\x72\x23\xf0\x51\x04\xbd\x34\xcf\x35\x74\xdf\x34\x5b\x8e\xf4\xce\xc4\xf9\x43\x28\xe5\xd4\x54\x97\x25\xc4\x67\x88\x55\x21\xeb\x99\xae\x96\x06\xb4\x53\x2b\x59\xd5\xf9\x74\x5d\xd8\xe6\xda\xb7\x74\xf0\x80\x2f\xdc\x71\x99\x55\xf6\x2a\xfd\xaf\xc3\x0f\x83\x90\x98\x6e\x5d\xee\xfb\x51\x7c\xe4\x97\xc1\x23\x18\xde\x47\x61\x5a\x1f\x39\x7e\x97\x93\x0d\xc2\x31\x43\xcc\xf0\x40\x1e\xde\xd0\x0d\x12\xc1\x27\xeb\x9a\xe7\x22\x84\xe9\xc4\x5c\x34\x90\x6d\xb6\x26\x7c\x1b\xf7\x71\x97\x11\xac\x54\x2e\x0b\x1f\xf7\xe3\x4f\x5b\xea\x04\x94\x4a\x89\xb5\xa1\x6c\x2b\x65\x66\x4b\x96\xba\x66\xc2\xfb\x32\x44\xa8\x2c\xe5\x6a\xe8\x64\x55\xb6\xa2\x61\x61\xf4\x04\x64\xc1\x2d\x33\xbd\xf1\x32\x1d\x65\x31\x8e\xb7\xec\x90\x6f\xd6\xf0\xe3\xf0\x3e\x35\xfc\x16\xfd\xc4\x7a\xb0\x25\xe3\x3a\xce\x10\xfc\xc6\x4a\x32\x12\xec\x6b\xb7\x2a\x74\x8e\xed\xb0\x4f\xeb\x5d\xb4\x8d\xd9\xaf\xc3\x04\xfe\xfc\xb8\xae\xd5\x72\x05\xde\xff\xc1\x53\x86\xf2\x1c\x82\x71\x27\x61\x81\xf7\x39\x20\x3b\xce\x40\x7a\x1d\x9f\x81\x73\x55\xff\x95\xb7\x3c\x6c\xef\x7e\x72\x0a\x82\x37\x7a\x83\x07\xbc\xf3\xa5\xde\x27\xf7\xad\x9d\x65\x0f\xe3\x0c\x37\x0f\xe3\xd1\xeb\x26\x1a\x9d\x52\x5e\x1c\x5e\x39\x06\x29\x8e\x44\x27\xa5\x58\x75\xe8\x8f\x34\xd8\xeb\xae\x3e\x37\xcd\xfb\x87\x69\x06\x78\x5f\x15\xf2\xe4\x45\x84\xe0\x47\xc3\xc2\xbd\x73\x24\xc4\x51\xf8\x7c\x10\x25\xde\x27\x71\x53\x44\xa9\xd7\x8b\x34\x16\xdb\x15\xf2\xa3\x4a\x6e\x84\xc9\xe7\x10\x51\xef\x77\xa9\x43\x8f\x9a\xca\x35\xdc\x4f\x90\x87\x78\x7b\x97\x5b\x3c\xcf\xb5\xcf\x8d\x07\xd9\x56\x7b\x66\x3d\x59\x5a\xb1\x03\x6f\xf8\x98\x1f\xca\x2b\xba\xeb\x62\x4b\x29\x5b\x45\x9f\x54\x00\x8a\x80\x10\x56\x08\xad\x5f\x58\x61\x00\x35\xdf\xf5\x42\x96\x62\xec\x38\xf1\x78\x6f\x00\xa9\x5d\x41\x1d\x5f\xb3\xe7\x08\x34\x0c\xc0\xfb\xa0\x8a\x4f\x01\xb3\x88\x9d\x61\x4b\x30\x9b\x29\x71\xa4\x85\x82\x6c\xc4\x74\xaa\xf0\x7b\x4e\xc8\x45\x5d\xeb\xd5\xf1\x44\x57\x80\x0d\x6a\xff\x05\x08\x33\xfb\x90\x49\x00\xa3\x5d\xdb\xa0\xc7\x19\x55\x0f\x43\xe2\xa2\x47\x29\xc1\x8b\x20\x40\xdc\x8b\x6c\x1e\x04\x88\x98\x78\x78\x91\x7e\xe2\x0d\xca\x16\xf7\x22\x6f\x50\xb6\x88\x49\xe3\x43\x22\x7b\x52\xac\xab\x91\xe8\x4d\x20\x63\x36\x3e\x3a\x95\xe5\x54\x01\x74\x2a\xfc\xc1\x1e\xbf\x2a\xe4\x16\x9f\xaf\x0a\xb9\x4d\x5e\x5c\xa1\xb1\x27\xbc\x27\xeb\x8f\x2f\x46\x89\xc1\x5d\xfa\x69\xf7\xb8\xc8\xa7\x37\xf6\x29\xe6\xe6\x76\x0f\xb5\x81\xa2\xf6\x5f\xff\xd0\xde\xec\xbd\xc8\x33\xa2\xd8\x46\xcf\x68\x5b\x8a\xd1\x50\xf1\x82\x51\xe7\x59\x51\xbc\x97\xc6\x65\x31\x53\x59\x28\x5c\xd6\xea\x43\xfd\x42\x95\x6b\x28\x06\xbf\x96\xaa\x5c\x87\x02\x2b\x18\x1d\xbd\x0a\x43\xb3\x86\xcf\xaf\xfd\x17\xcf\xf4\x7a\x52\x28\xd7\xe7\x6c\x52\x44\xdd\x3e\xab\xe4\xdc\x3e\xae\xe4\x9c\x3f\xc2\xde\xda\xa7\xac\x9b\xf8\x02\xb0\x02\xe9\x95\x03\x04\x74\x2f\x3f\xe4\xb5\x7b\xf7\x21\xaf\xf9\x2b\x82\xfd\x83\x77\x85\xc7\xf6\xa3\x97\x97\xb7\x9e\xa6\xbe\x8d\x49\xba\xf1\xb4\xef\xa2\x81\x3c\xab\xf4\x0a\x9e\xeb\x95\x7f\x44\xd0\x95\x7e\xda\x33\x7a\x10\x4f\xff\xf9\x72\x55\xe7\x90\xe3\x5d\xe1\x5f\xfe\x45\x39\xad\xb6\xab\x1a\x5f\xb9\xbf\xc3\xcb\x8c\x5e\x64\xec\x61\x55\x69\xdb\x72\x70\xdc\x75\x0f\x21\x37\xe0\x48\xf4\x66\x98\xee\x1d\x1f\x02\xe4\xf6\xc8\x25\x0f\xa2\x87\x94\x63\x6c\x24\x7a\x94\xce\x8a\xbd\x78\x55\x29\x63\xf0\x0d\x24\xcb\x62\xaf\x7e\x5e\xe1\xf3\xb5\xef\xf9\x4f\x5a\x66\x2a\x3b\x93\x80\x35\x5c\xc0\x8f\x4c\xd6\x92\xbf\xa6\x17\x71\x8d\x17\xaa\x96\x19\xaf\xb5\xa4\x07\xbc\x98\x9b\x02\x5b\x22\x9a\x02\x00\x5e\xa2\x0e\x00\x3e\x12\xef\x02\xbc\x7c\xa1\x61\xd2\xe1\xa5\x95\xec\xa2\x97\x97\x30\x20\x0e\x4f\x30\x7e\x85\x0b\xc2\x63\x07\x46\x2f\xa1\xfb\xf0\x2a\x0c\xc0\x2b\x69\x60\x2b\x41\x76\xad\xf0\x70\x6d\xf0\xe1\x3a\x6c\x69\x62\x28\x9c\x9b\xd8\x47\x79\x39\xa7\xa7\x79\xe9\x77\xc2\xab\x4a\xcf\x69\x1a\x56\xf4\xa7\x7b\xf5\xda\x27\x56\x18\x89\x5e\x25\x6b\x15\xaf\xb1\x37\xd3\x4a\x17\x96\xa1\x19\xf8\xc3\x3f\x56\xea\x06\x56\x91\x81\x3f\xf8\x63\x6c\x80\xc1\xbf\xc2\x8b\x28\x99\xdd\xc8\x25\x6f\x6f\xac\xe9\x37\x35\x40\x0a\xd9\x02\xf8\x97\x7f\xb1\x36\x2b\xb8\xd9\xf5\x0c\xfe\xe5\x5e\xf8\x7c\x21\x23\xd1\xab\xdd\xdf\xfe\x65\xbe\x54\x9e\x3d\xd5\xf9\x52\xc5\x7c\xe9\x4a\xcf\xe7\x05\xbc\x82\x3f\xc2\xe3\xf5\x74\xe1\x59\x79\x6d\x7f\xc5\xfc\x1c\x0a\x20\x6b\x81\xb7\xbc\x39\xf6\x37\x2d\x17\x78\xc7\x97\x0b\xbc\x74\xcb\x10\xde\x46\xeb\x30\xba\x97\xee\x3e\xa6\x22\x39\x99\x4e\xa9\xf8\x19\xd1\xfc\xab\x2e\xd6\xcb\x30\xc3\xb7\xf0\x33\x1e\xf3\xb7\x32\xaf\x71\xd6\x36\xf8\x97\x7f\xb1\x50\x30\x02\x1b\xfb\x6f\xcf\x83\x91\xb6\xda\x63\x82\xd8\x10\x84\x89\x51\x2a\x5b\x00\x89\x46\x3a\x6f\xc8\xcb\x1d\xe5\xf4\x36\x28\x0b\xb6\x24\xf5\x36\x77\x67\xf5\x76\x79\xe2\xea\x4a\xc9\xa5\x11\x12\xee\x7c\x59\xc3\x3e\xd5\x92\xc6\x02\x73\xb3\xf9\xac\x10\x18\xfe\x85\x9e\x75\x1a\x50\xa6\xd6\x65\x5e\x03\x76\x3b\xde\x8e\x09\x98\x0c\xa8\x8c\x9d\x77\xbd\x53\xfb\x75\xe4\xa6\xf5\x06\xe3\x5f\x07\x09\xea\x61\x70\xed\xc0\x47\xb0\xa3\x9f\x4f\xd8\x8e\xec\xae\x39\xf1\xfe\x8f\xd1\xac\x8a\xa3\xf6\x05\x11\x99\xfa\x4d\x50\x58\xbc\x59\x2f\x97\xb2\x02\xb7\x13\x1c\x3e\x5e\xfb\x7c\x99\xd7\xb5\xaa\xc6\xdc\xaf\xc4\x2e\x4d\x12\xba\xc5\xbe\xb8\xf2\xd3\x68\x2f\x90\x73\x49\x06\x70\x8f\xf2\x0c\x12\x35\xc0\xdc\x96\x2d\xa0\xcb\x14\xa0\x42\x06\xb7\xa5\xdc\x62\xd4\x3e\xe6\xd9\x20\xe5\xfc\x52\xc2\x1f\x95\x92\xa8\xe2\xc9\x9d\xa3\xa9\x59\x59\x71\x7e\x92\x17\x76\x11\xe8\x19\x11\x69\xd5\x8e\x0f\x7c\xa6\xcc\x90\x30\x04\xd3\x3e\x96\xe8\xba\x03\x66\x18\xc2\x2e\x23\x42\x76\xd9\xcd\x41\x8b\xe7\x72\xa5\xae\xab\xa9\x0f\xa9\xa1\x56\x40\x73\x37\xba\xba\xf9\xff\xb1\xf7\xae\xfd\x6d\xe4\xc6\x9e\xf0\x7b\x7f\x0a\xd8\x67\xc6\xa4\xc6\x14\xe9\xcb\xe4\x26\x45\xf1\xf1\x48\xf2\x89\x36\x96\xe5\xb5\xe4\xe3\xcd\x3a\x5e\x1b\x62\x83\x62\x47\xcd\x06\xa7\xd1\x94\xcc\xc4\x7e\x3e\xfb\xf3\x43\x5d\x70\x6b\x90\xa2\x3c\x33\xd9\xec\xc9\x99\x17\x63\xb1\x1b\x8d\x6b\xa1\x50\x55\xa8\xfa\x57\x88\xaf\x1b\xf6\x9c\x2a\xc3\xfe\x0f\xfd\xbc\xbd\x55\x3e\x0b\x18\x74\xa5\x50\xdb\x1d\x8d\x01\xa1\xec\x00\x05\x63\xe2\xd1\xf1\xc5\x8f\x8b\xb2\xb9\xec\x4e\xdd\x39\x28\x17\x8a\x5b\xb7\xbd\x82\x0b\x99\xa4\xe5\xe7\x3e\xdf\xae\x51\xbc\x2a\xd4\x60\x9f\xa3\xee\xc3\x4c\x08\x7e\xa7\x02\x52\x17\xad\x2c\x0f\x0c\x4c\x5d\xed\x56\x6e\xff\xba\x59\xaf\x05\xa8\x7d\x60\xe7\x91\xe6\xd2\xed\x68\xb4\xe3\x2c\x21\x6f\x2f\xd7\xa7\x1d\xe2\xb0\xac\x97\x1e\x85\xdf\xe7\x81\x77\x94\x37\x55\x19\x8e\x51\x62\xe6\xdf\x9a\x79\x12\x86\x46\xb9\x2b\x70\x59\xd7\xba\x95\xad\xbb\xb4\x42\xf0\x1d\x68\xf9\x9e\xe3\x14\xe6\xde\x00\xb2\xfe\xfe\x08\xd9\x62\xec\xce\xf0\x69\xc6\x21\xe5\xec\x01\x59\xaf\x3c\x48\x33\xfe\x76\x40\xe2\xeb\xba\x08\xbd\xf3\x6d\x05\x26\x31\xfe\xd2\x4a\x29\x57\xa5\xba\xb6\x2d\xe3\x2d\x1d\xc7\x12\x13\x25\x2e\x4d\xab\x66\xbc\x09\x1f\x6c\x07\xff\x3d\xb0\x23\x81\x7b\xe9\xcf\xf6\xaf\x83\x93\x63\xd0\xe0\x3f\xbb\xc7\x2b\x4a\x0b\x5f\x8c\xfe\x0b\x1e\x5f\xa5\x8f\x57\x36\xe9\xf9\x6f\xd0\xe4\x67\x21\xdc\x2d\xd5\xfa\x9e\x74\x6f\xdd\xe9\xbf\xb0\xec\x83\x15\xfd\x5d\xf5\xc9\x83\xcf\x41\x1a\x9c\xcf\x9b\x7d\xec\xdf\x7d\x26\x6c\x6f\xf8\xdb\x77\xfb\xf3\x9a\x6e\x5f\xad\xee\xf6\xe7\xb0\xf6\xcf\xee\xe3\x68\x2a\xa8\xd6\x75\x53\x10\x56\x16\x3e\x1f\x6e\x6f\x6f\xff\xe1\x73\x4c\x70\x9f\x73\x95\xc1\x43\x5c\x27\x1a\xd6\xe7\xce\xeb\x61\x3a\x49\xee\xe7\x83\xb8\xaf\x9f\xc5\xab\x46\xcf\xe5\x85\x6c\x75\x63\x3e\xaf\x20\x84\x95\x95\x7d\xe6\x7c\x44\xf8\xe4\x73\x38\x4c\xee\x19\x1d\x43\x6b\x7b\xf6\x7b\x58\xea\x70\xb5\x84\xf8\xac\x31\xc6\x13\x1e\xfe\xf4\x61\x8a\x45\x6b\x0f\x9b\x52\x99\x70\xce\xba\x0b\x90\xab\x6c\xc3\xd5\xbc\x91\x34\x36\x23\x41\xf1\x7f\x72\x0d\x6d\xb8\x73\xfc\xcb\xcf\xa0\x95\x8f\x40\xc7\x0e\x76\xce\x83\x75\x1f\x3f\x70\xdb\x2e\xbf\x73\x42\x22\xbf\xc5\x86\xff\xcc\xb7\x39\x20\x60\x7c\x76\xbc\x25\xaa\xf3\x73\xc4\xfc\xa2\xf1\xac\x7b\x9c\xe9\x58\xd6\x05\xc8\x3d\x46\xa6\xbc\x6f\x65\x06\x9a\x03\xbc\x42\xae\xc4\xab\x45\x33\xd7\x86\x1d\x9d\x68\x06\x4e\x81\x5f\xfb\xd4\x3f\x74\x7d\x85\x4c\xb1\xac\x2f\xce\x34\x5d\x22\x21\x6c\xb6\x1c\x83\x1f\x04\x1f\x39\xfb\xe0\x65\xd2\xa0\x8f\xb5\xb3\x99\x6a\xa1\x6a\x00\x72\xad\xc1\x5d\x63\x52\x95\xe3\x96\x7c\x77\x89\xe8\x75\xab\xea\xb6\x94\x15\xf5\x96\x7d\xa6\x0d\xa7\xe0\x9e\xcb\x0b\x15\x19\x1d\xb9\xc1\xa3\x83\x3f\xa9\xa5\xd8\x13\x3d\x04\x42\x0d\x9e\xf7\xc4\x03\xd1\x87\xec\xaa\xc7\xb2\x9d\x0e\x1b\x59\x17\x7a\xd6\xdf\xda\x1a\x9a\xaa\x1c\xab\xfe\xe3\xad\x04\x4e\xd4\x8d\xf0\xb9\x76\xb8\xe7\x7d\xf0\x0e\x79\xe6\x23\x4e\x20\x39\xee\x6f\x07\x80\xe8\x6f\x5f\x00\xd0\x3a\x45\x12\xd3\xcd\x11\xc8\x47\x5a\x01\x28\x22\x68\x01\x1f\x63\x5b\xf6\xc7\x3b\xe4\x92\x82\x61\x24\xee\x56\x87\x3c\x22\xe6\x8d\x6e\x35\xe0\x85\xc6\x9f\x61\x56\x0d\x6a\x76\xd0\x9d\x03\x77\x37\x42\x45\xde\x75\x4a\xbc\x07\x78\xf2\xfc\x82\x3d\x78\x40\xce\xc2\x9d\xd5\x7e\xb7\xba\xbe\xf7\x44\x09\x91\x7f\xd7\xed\x6a\x08\x95\xae\xb7\x2a\x0c\x94\x41\x8b\xb7\x15\xde\x16\x2c\x13\x39\x6a\x70\x29\xe5\x1d\x8e\x3e\xc5\x42\x59\xd9\xf8\x93\xb8\xfa\xed\xf0\xe1\x23\x04\x30\x75\x28\x2d\x18\x6f\xbe\x25\xd4\xa7\x69\x79\x5e\xb6\xe0\x07\xd1\x00\xe2\xe9\xb9\x9a\xca\xab\x52\x37\x10\xe4\x04\xd8\xcc\x0c\x06\xf3\x51\xd7\xce\x68\xf3\xd1\x5d\xda\xb5\x78\x37\xc9\xd6\xf6\xd6\x45\xeb\x87\x3d\xb3\xf5\x90\x4f\xdb\x10\x24\x2b\xb3\x9c\xcd\x5b\x3d\x33\xe2\x5a\x35\x8c\x9b\x39\x11\x4b\xc0\x54\xc7\x0c\x06\x58\x09\xa5\xa7\xd0\x57\xaa\xf1\x08\x76\x60\xa7\x27\x8f\x71\x17\x69\x85\x50\x89\x20\x6f\x23\x14\x09\x44\x6b\xa9\x4f\xd2\xca\x0f\x3c\x53\xe7\x72\x7c\x79\xd1\xe8\x45\x5d\x6c\xb1\x36\xea\x25\x64\x2f\x28\xda\x2f\xe3\xd1\x5e\x83\xe5\xdf\xc1\x34\x07\x09\x34\xb0\xdb\xb6\x26\x4c\x5c\x42\x7e\x54\x1f\x83\x8f\xf3\xcb\x94\x80\x80\xea\x89\x18\xeb\x45\x83\x59\x10\x21\xa5\x3d\x04\x47\x05\xf5\x18\x87\x9e\xad\xeb\x0b\x64\x17\xe5\xc9\x29\x69\x14\x03\xf1\xd7\x85\x69\x31\x63\x64\xa3\x4c\xdb\x94\xe3\x96\xa6\x2a\x37\x42\x02\x42\x48\xba\x04\x2a\xd1\xc0\xae\x69\xa5\xa4\x71\x29\xf3\xb1\x4f\xb6\x0f\x78\xb9\xce\x77\x3e\xde\xb1\xcc\x13\x96\xed\x73\x2c\x11\xa7\x59\xa4\xb0\xbf\x33\x5d\x28\xc8\x26\x75\x5e\xe9\x8b\x91\x6c\xc6\xd3\xf2\x4a\x99\xd1\xe3\x87\x8f\x1e\x8e\x1e\xfe\x6e\x04\xf6\xe8\x0f\x50\xd1\x87\x42\x55\xc3\x69\x3b\xab\xa8\xbe\x67\x95\xd1\x03\xf1\x11\x6c\x9d\x1f\x47\x1f\xd9\x16\x8a\x7f\x16\xfa\xba\xfe\xc8\xe9\x4f\xe8\x96\x88\xc6\xca\xb9\x26\x30\x9f\xf7\x39\x66\xc2\x04\x15\xc6\x97\x73\x57\xf6\x2b\xae\x35\xd3\xdc\x34\x02\xfe\x17\x28\x19\xe4\x1a\xfb\x51\xd7\x60\x5c\xff\x98\x77\x8e\x1d\x23\x20\x2f\xb3\x55\xf4\xbc\x12\xfc\x93\x34\x2f\x7d\x5d\x13\x48\x01\x07\x47\xc4\x36\x10\x6c\xf2\x4c\xf7\xd3\x4e\x0d\xf2\xf5\x7b\x63\x07\x31\x20\xb1\x97\x2f\xc8\x9e\x9a\xa5\x71\x5c\x0b\x3d\xfc\xd6\x1e\x09\xfc\x55\x98\x98\x07\x38\x6c\xdc\xb9\x83\xe0\xf5\xbb\xf4\xe5\xfb\x95\xb1\x15\x61\xad\xb9\x90\x8a\xa8\x65\x7b\x00\x86\x1f\xb8\x68\x0a\xbc\x51\x0f\xc6\x95\xde\xab\xfa\x2a\xe0\x62\x35\x28\xf9\xce\xbf\x7a\x9f\xe4\x4e\x0e\xdb\xa5\x7c\x1b\x60\xed\xeb\xa5\x20\x3f\x25\x5a\xd9\x5c\x7e\xe5\x3e\x59\x03\xb7\x62\xcc\x96\x8e\x4b\xbb\xaf\x71\xc0\x06\xc4\x81\x08\xe7\x1d\xff\x8b\x52\x3f\xa7\x2d\x01\x1b\xf9\x8a\xe6\x82\xef\xd6\xb4\x99\x40\xa2\xf1\xc9\x43\xa1\xc5\x9a\x3c\xd6\x15\x20\x89\x10\x68\x16\xf1\x79\xb4\x85\x07\xc9\x7f\x7c\x2d\x37\x30\x8e\x42\xcf\x46\xc8\x69\x46\xad\x32\xad\x19\x61\x55\xc4\x2a\x36\x1c\xde\xc1\xc9\x31\xdc\x1f\x9c\x92\x49\x3e\x37\xc4\x3b\x9d\xe9\xcd\xac\x38\x55\x10\x4e\x6d\xd7\x8d\x3c\x28\x38\xf0\xd7\x00\x9d\x36\xd7\xb7\x04\x57\x49\x3d\x48\x29\xd3\x7d\x99\xe4\x30\x5e\xd5\x09\xac\x63\xe0\xee\xa3\x32\xc3\xce\x7f\x08\xf5\x0f\xf8\xa2\x36\xf8\x2c\x44\x60\x8a\x92\x15\xd8\x92\x70\x44\x40\x53\x64\x05\x09\x6c\x32\x0d\x19\xe2\x30\x28\x00\x7c\x90\xc6\xca\x6f\x9b\x60\xaf\x52\xf3\x1d\x10\xa3\xa4\x0c\x8c\x2d\x29\xb4\x7e\x46\xf1\x7a\x62\x83\xed\xca\x37\x17\x50\x77\x66\x1b\x75\xe7\x6b\x9f\xbf\xf0\xdf\xae\xa6\xb0\xce\x50\xf0\xeb\xdb\x8d\x05\xae\xaa\x37\x18\x0a\x5e\x69\xdf\x62\x24\xf4\x81\xfb\xf2\x36\xe3\xb0\x9f\xac\x1e\x46\x64\xdd\x5e\xc3\x92\x53\xba\x8e\xb6\xb5\x2f\x17\xc7\x42\x98\x90\x73\x67\xf6\x1a\x53\xee\x0a\x5e\x9f\xc1\x10\x8e\xc3\xc5\x02\xc9\xfe\x59\x55\x85\xc7\x5b\xe6\x60\x8e\xf4\xa7\xff\x6b\x67\xec\xff\x5b\x47\x6c\x8a\xbf\xec\x51\xdd\x39\xc3\x44\x43\xc9\x3d\xd8\x25\xbc\xbc\x52\x35\x46\xf3\x5a\xa5\x84\x4b\x39\xe4\x94\x4a\xc9\x09\xbe\x62\xc8\x02\xc0\x12\x69\x54\x9d\x8a\x7d\x07\x27\xc7\xe4\xb5\xf9\xf9\xe0\xe4\xf8\x4c\x7d\x82\xb4\x4a\x5f\xe0\xe3\x28\x68\x69\x45\xc1\x8e\x9f\xdb\x0b\x25\x27\x18\xdd\xa2\x0b\x12\xc8\x02\x70\x7b\x07\x93\x02\xfd\x8c\xb0\xed\x42\x1c\x0f\xff\x36\xd1\x35\x11\x2a\x25\x98\x08\xca\x8b\x5f\xab\x4f\xad\x20\xf4\x0f\x56\x97\xa4\x17\x2b\x49\xad\x00\x2d\x04\x40\x84\x17\x73\x56\x8e\x0e\x4e\x8e\xd1\x17\xd6\x56\xdd\x33\x5c\x09\xdd\xe7\x81\x0b\xaf\xfa\x34\x95\x0b\x83\xe8\x5f\x5f\x37\x79\x4f\x37\x9d\xbd\x53\x6c\x7d\xf5\x04\x76\x60\x6d\xec\xc8\x4f\x53\xfc\x96\x60\xb6\xc2\x02\x29\xc6\x0a\x4f\x37\x62\xfb\x30\x0c\xfc\x97\x64\x7e\x49\x71\x2a\x94\x19\x37\xe5\x39\x07\x17\xd8\x0f\x0d\x23\x51\xe2\x3c\x8b\xf1\x54\x36\x72\x0c\x58\x99\xb2\x15\x7a\x32\x41\x2c\xca\x8d\xe6\x0c\x21\x9c\x7d\x39\x0c\x68\xfa\x42\xb5\x64\xe3\xe7\x3a\xb3\x07\x19\xc1\x74\xb3\xcf\xdd\x38\x81\x6f\xfb\x98\x68\x00\x2b\xea\xe4\xca\x08\x49\xd6\x85\x44\xf3\x7b\xb8\x7c\x67\xf8\x00\x7e\x78\x58\x17\x64\xed\xba\x61\x65\x74\xa1\x5c\x8a\xba\xb3\xc3\xff\x75\xf6\xe1\xe5\xc9\xc1\x61\x8c\x06\x84\x75\xf9\xa6\x1e\x10\x88\x90\xfa\xd4\x52\x4a\x13\xe6\x53\x77\x02\x71\xdc\x97\xff\xfd\x1e\x8d\x8b\x37\x96\xad\xf0\x0f\x7b\xd1\x60\x23\x92\x08\x4f\x41\x5b\x7e\x07\xfe\x3f\x08\x9e\xe2\xa7\x3b\x5c\xef\xb6\xef\x9d\x3f\x05\x3b\x47\x4b\x38\x59\xd4\x8d\x08\xb1\x36\x33\xd9\x39\x6a\xdf\x4a\xe9\xaf\x4b\x35\x5f\x84\x5e\xb4\x18\x45\xbf\x19\x51\x20\x11\x98\xbe\xfb\x2c\xc8\xb7\xcd\x5e\x25\x2e\x1b\xe1\xd0\xf6\xca\x3d\xbd\x7f\x3f\xf7\x98\xe2\x2f\xe0\x18\xf0\x35\x7c\xfe\xec\xab\x1b\x82\x9d\x09\x0c\x6d\xb0\xf8\x0f\xd7\xe1\x63\x11\x4a\xc1\x54\x37\x94\xed\xce\x57\xe3\x1f\xef\x46\x05\x71\x48\x99\xa2\xf8\x82\x0b\x83\x38\x6a\xbf\xfe\x06\xfc\x34\x7d\x61\xf7\x22\x2a\x99\xa9\x35\x78\xce\x7e\xfc\x47\x35\xeb\x3e\x83\xb0\xdb\x4e\xfc\x7d\x89\x68\x0c\xb5\x38\x57\xe2\x9e\xac\x75\xbd\xb4\x5a\x90\x28\xca\x2b\x73\x6f\x20\xc0\x74\xe0\xfc\xef\x17\xf3\x11\x20\x81\x51\x52\x69\xc2\x46\xfc\x3d\x38\x8b\x81\x0d\x66\xef\x1e\xb2\x81\x7b\x7f\x18\x8a\x67\x51\x5d\x6c\x00\x31\x4a\xcd\x1c\x56\x04\x26\x7c\x0f\x3c\xff\xad\xf0\x57\x5e\x5c\xa8\x06\xdc\x61\xc5\xbd\x57\xaa\x99\x95\xc6\x40\xc0\xa8\xaa\x4b\x55\x20\xf6\xe4\x3d\x38\x01\x6a\xf0\x32\x28\x5b\x73\x87\xc0\xc5\xa3\xf8\x01\xcc\x31\xa1\x0a\x34\xee\x81\x3c\x6f\xdb\x2e\xeb\x8b\x6a\xe9\x11\xeb\x01\x32\x5a\x0b\x09\x18\x00\x50\x37\x58\xa8\x00\xc8\xc2\xe5\x7e\x33\x46\x48\x1f\x8e\x85\x50\xe8\xcb\x79\x39\x86\x00\xbc\x6b\xdd\x5c\x1a\x0a\x9f\xac\xb7\xe3\x09\xa4\x00\xc7\xd1\x88\xad\x67\xf5\x92\xc0\x33\xd1\x34\x28\xc9\xea\x09\x18\x8e\xb2\x29\x0d\x22\x62\xe0\x27\x56\xcd\x34\x3b\xa3\xd1\xf9\xe2\xe2\x6f\x65\x55\xc9\xe1\x4c\xe3\xbf\x56\xd3\x34\x53\x7d\xfd\xe1\x7c\x71\x31\x1c\x5f\x94\x4f\xcb\x62\xef\xf1\xc3\xdf\x7e\xff\xf8\x37\x71\xac\xe2\x77\x09\x0e\x16\xa2\x5f\x2d\x8c\x2a\xb6\xd5\x27\x30\x50\x95\x76\x11\xbf\x1b\x31\x08\x05\xd1\x86\x63\x84\xc8\x11\x42\xaa\x4c\x5e\xf9\x26\x30\x02\x70\x5d\x0b\x5f\x68\x0e\xfa\x9d\x64\xf6\xe1\xe6\xa2\x67\x98\xf0\x5c\x35\x35\x31\x83\xe7\x8d\x9e\xbd\x82\x7c\x00\x9e\x2d\x84\xe4\x3c\x88\x36\xda\x20\xea\xf3\x20\xdc\x2d\x91\x0f\xd1\x6b\x1f\x03\x20\x9b\x76\x20\x54\x5d\x7c\x21\x27\xa1\x8f\xf0\xe8\xa3\x03\xe5\xe4\x13\x6a\x34\xd6\x85\x42\x63\x6e\x59\x17\xea\x13\x39\x8a\xf4\x57\x75\x65\xcb\xdb\x82\x95\x08\x4e\x09\xf0\x8f\x71\x43\xf9\x38\x40\x4a\xf9\x4e\x7c\x54\x75\xe1\x5a\xe5\x16\x44\xdf\x8d\x27\x1e\x0c\x9f\xd5\xaf\x03\x8c\x2e\xb2\xfe\x02\x58\x98\x28\x6b\x71\x21\x9b\x73\x79\x61\x2b\xb3\x9b\x14\x53\xf8\x31\xe2\xab\x4b\x7b\xfb\xd7\x85\x69\xc5\xb8\x91\x66\xca\x55\x1e\x7e\xa2\xbc\x7b\xb0\x73\xc0\xea\xaa\x4c\x4b\x01\xfe\x31\xc3\xfe\x85\x56\xca\x71\xfd\x18\x14\x88\xd2\x6b\xc0\xc9\xb5\xfd\x88\x9f\x28\x38\x97\xfd\x6f\x98\xba\xb7\x30\xf5\xcf\xa0\xbd\xf0\xf3\xe0\x25\x6b\xe6\x91\xc0\x20\xf6\xfc\x99\xc5\xcf\xbd\xc8\xe5\x22\x8f\xef\x08\x2c\xb6\xb3\x2a\x53\x04\x08\xb9\x41\xe9\x2c\xde\x61\x82\x0a\x18\xb0\xe8\xfb\xf7\x99\xae\x98\xd3\xdb\xa3\xc9\x21\x20\xae\x10\x57\x42\x19\x82\xe7\x89\x66\xf0\x81\x48\x4f\x1d\x91\x80\x58\xbb\x6e\x44\x47\x91\xed\x48\x74\xe2\xdc\xb6\x1f\xb8\x3a\xae\x17\xd1\x29\x95\xea\xbc\x9b\x4a\x63\xc2\xd5\xb7\xe7\xfb\xf1\x9f\xb2\x5a\x28\x27\x81\x65\xaa\xee\xf3\x9a\xa4\x3a\xcd\x1e\x85\xed\x87\x0d\x44\xa0\xd2\x41\xd6\x02\xca\xfa\x8b\xf0\x15\xb6\xa6\x8f\x90\xde\xb3\x35\xa4\xcd\x21\xc0\xe4\x47\xdb\xd4\x47\x36\x20\xc6\xf4\x93\x01\x90\x54\x9f\xe2\xdc\xbf\x37\x93\x4a\x22\x20\xb9\xee\x1d\x45\xac\x05\x90\x81\x59\x9b\xa4\x44\x71\x70\x63\x03\x60\xcf\x10\xae\xae\xc6\xba\x2e\x44\x5b\xce\x94\xb8\x2a\x4d\x89\x97\x34\xbe\xbe\xd2\xa5\x89\x9b\xc2\x3d\x5a\xa6\x36\x8c\xb6\x0b\xf4\x59\xad\xe7\x03\xe7\x66\x14\x64\x69\x80\x0a\xaf\x64\x55\x16\x81\x30\x67\xbb\xb3\x4a\x32\x81\x34\x26\xea\xc7\x85\xac\xf0\xd2\xa4\x34\xa4\xad\xf9\xea\xec\x07\x50\x0c\x25\x60\x23\x1e\x42\xa8\x22\xa9\x3a\xd2\x28\xcb\xf1\x7c\x56\x3b\x74\xd4\x2c\x30\xa6\x6d\x18\x2f\x36\xce\x69\x6e\x67\x84\xeb\xd7\xd9\xa6\x0f\x1e\x64\xf8\x8d\x2b\x75\xd2\x91\xed\xe3\x7d\xb9\x41\x73\xe9\x76\x8c\x1a\x24\x1e\xc6\xc5\xba\xcd\x85\xdb\x2f\xd7\x58\xb4\x29\x22\xfd\xf4\xee\xa6\xbb\x82\xa8\x38\x56\x4c\xb3\x74\x3f\x4c\xcb\xf8\xac\x35\xab\xf7\x55\x64\x2e\x08\x37\x56\xb2\x7b\xbe\xb0\xa0\x4f\x33\xbc\x67\xcf\x04\xcb\xa9\x60\x0a\xe0\x57\x0a\xbc\x98\xe4\x1f\x99\xcf\x55\x3d\x14\xfd\xb7\xf0\xd0\x03\x32\x82\x0f\x23\xac\xe6\x08\x8d\xc6\xa8\x4e\xdb\xa1\xf4\x1c\xc0\x06\xe6\xda\xad\x96\x9c\x4e\x0d\xdd\x22\x18\xb3\x13\x06\xbf\x75\x93\xe4\x83\x9d\xa3\x28\x69\x94\x4b\xee\xd0\x1a\xee\xd8\xff\x39\x50\x3f\x92\x61\x8e\x00\x91\x4d\x81\xf1\xa0\xde\x3e\x3a\x64\xaf\x4e\xc3\x89\x7c\xd8\x0d\x15\xb7\xc8\x84\xbc\x35\x61\xcf\x50\x62\x26\xc8\xb3\xcb\x9b\x31\xca\x4a\xbc\x23\x8e\x0e\x1f\x3d\x7c\xc0\x55\x20\xbb\xf0\xea\x16\x5f\x1a\x9f\x03\xf6\x2a\xb8\x54\xa0\x8c\xef\x1d\x5f\xe1\xde\x59\x7d\x6a\x41\xac\xc1\xbc\xc7\xec\xc6\x19\xe4\x10\x54\x57\x76\x96\xdd\x48\x8e\x0e\x07\xa2\x44\xa4\xb8\xd6\x89\xea\x94\x44\x19\x02\x1c\xe4\x6c\x26\x5b\x92\xbf\xc9\x57\x5b\xba\xe1\x04\xea\x90\x38\x9b\x2e\xcc\xc0\xa1\x7a\x1e\x1d\xda\x4a\xae\x54\x03\x62\x29\x4c\x10\xe5\xfe\x10\xba\x2a\xc4\xd1\x21\xe4\x3f\xf6\xfe\xdf\x7a\xd1\x64\x26\x66\x63\x63\x52\x72\xc3\x4a\xdc\x29\x16\x9f\x8c\xd7\x77\x41\xaf\xe7\x52\x01\xee\x4d\x46\xa3\x5d\x03\x81\x73\x83\x8a\xdc\x77\xe6\x12\x27\x55\x01\x46\xef\x85\x02\x14\x65\x92\x4e\x9f\x81\xd2\xa3\x9b\xfe\xd6\xfb\xe0\x30\x0d\x25\x2f\x70\xd8\x99\x95\x75\x9f\xfa\x3b\x24\x11\x9a\x60\x3b\x63\xb1\x8c\xcb\xf0\x26\x74\x09\x94\xc5\x53\xaa\x70\xa7\x5b\xa1\xaa\x8b\xa0\x3a\xd2\x65\x0f\xc5\xa3\x47\x02\x92\x43\x11\xa9\xb8\xe1\x22\x15\xb2\x57\x0f\xd3\x3c\x38\xb9\x02\xf5\x11\xf1\x0d\x19\x65\xb8\x9c\x67\x08\xc6\x70\x90\x38\xec\x1b\xe5\x60\x9e\x8c\xd5\x1a\x95\x00\x2b\xc1\xb0\x63\x4a\x18\x52\x0b\x10\xf6\x6a\x47\xf3\x07\x3b\xee\x50\x10\x6c\xd5\x6c\x2e\xf6\xec\xd3\xdd\x3b\x9e\x21\x43\xe1\xdd\x3b\xe1\x81\x60\x0b\xc6\xcb\x69\x5f\x1c\x4b\x70\xbd\xde\x5b\x63\x32\x43\xe2\x81\xd2\xe1\xe4\x6f\xfc\xa5\xed\xf0\x6e\xc4\x3c\xe9\xd3\xfb\xf7\x7d\x3d\xa1\xc5\x6c\xa5\xed\x04\xce\xa7\x9c\x49\x04\xde\x06\x55\x0f\xd9\xbe\x9c\x37\x8a\x74\x8a\x7b\xbb\x59\xc6\x30\x02\xa5\x5d\x47\x33\x55\xa7\xf2\xab\x2f\x9b\x9a\xde\xfc\xa6\x8a\xd0\x21\xc1\x13\xa9\x83\xa0\xf0\xda\x3e\x66\xcc\x59\xa4\x0f\xa3\x5a\xb0\xac\xf5\xd3\xb1\x0e\x32\xc3\xa1\x2f\x83\xd9\x04\xc7\x9a\x67\x55\x05\x35\x9b\x3e\xdf\x63\xfa\x43\x2d\xa2\xae\xf0\x53\x59\x14\xd8\x1d\xe8\x87\xbb\x4e\x4a\xe9\xb4\x1f\x4f\xd3\xa0\x3b\x15\x11\x6c\xba\x9b\x16\x1e\xdc\xe1\xe6\x55\xdc\xd8\xbb\xdc\xed\xd5\x51\xed\x2e\x99\xbc\x99\x96\x4e\x47\x32\x5c\xc3\x92\xf7\xdd\x52\xf0\x1f\x87\x0c\x51\x06\xdf\x85\xa7\xe4\xbf\x53\xf6\xf2\xf9\xc2\xb3\xc2\x1d\xe7\xc9\x68\x15\x63\xcf\x37\x31\xff\xfe\x50\xfc\x20\x0d\xc2\x4f\xb8\x2f\x86\x7f\x35\x03\x5b\x9b\xe5\x34\x00\x83\x5a\xfa\x3c\xfc\x8b\xb2\x05\x0b\x88\x3d\x6b\x1a\xe7\x64\x3f\x85\x64\xbd\x63\xbd\x00\x87\xaf\x09\x64\x47\x41\xe0\x8f\x3e\xb1\x2a\x5b\x1f\xe5\xe5\x62\xab\x1a\x48\xa9\x48\x6f\x9e\x33\x21\x92\x94\x2a\xd0\x7b\xe7\x28\xdb\x67\x68\x1c\x33\xaf\xa0\x77\x68\x98\xe2\xde\xc7\xe8\xc9\xb9\x3c\x27\xc7\x63\x40\x75\x8b\x4d\xec\x2f\x31\xdd\xbb\x7d\x01\x9b\xbf\x52\xb3\xa1\x7b\x9e\x3e\xe8\x02\xf8\x04\x37\x19\xfc\x45\xdf\x57\xbb\xb7\xc7\xa1\xa5\xae\x2a\x9f\xae\xbd\x55\x9f\xda\x1e\xab\x95\xbe\xbc\x7d\x2c\x1b\x25\xe1\x15\x7c\x42\x2e\x42\x87\x05\xcd\x39\x16\x6b\x16\xaa\x97\x80\xcc\x85\x27\xdf\x51\x3d\xd1\x0d\x86\x79\xf7\xfd\x88\x81\x2d\xa8\xc2\x52\x0e\x72\xc9\x67\x63\x88\x9b\x22\x60\x94\x70\x48\x7f\xf7\xd6\x30\xfc\x60\x27\xfc\x31\x88\xf7\xf1\x6b\x0c\xc8\x5b\x39\xef\xc1\x97\x5b\xe2\x69\xd4\xd1\x6f\x1e\xc5\x6f\x31\x55\x64\x2a\xf7\xfd\x7b\x03\xb0\xac\x2a\x20\xe7\x23\xb4\x89\x06\x7a\x95\x1f\x32\xb8\x40\x3a\x1f\xde\x6a\x29\x2a\x0d\x98\xd1\xdf\x09\xaa\x07\xb4\x3c\x0e\x45\x5a\x18\x35\x59\x54\x88\x29\x3f\xc7\x3c\xf5\xe0\xf2\x38\xa7\xc8\x7b\x8e\x57\x01\x21\x99\xc0\x50\x0a\x3d\xb3\xd5\x91\x5c\x5c\x17\x62\x5e\xc9\x31\x21\x12\x40\xfe\xf6\xb2\x1e\xd8\xc6\x16\x55\x8b\x19\xc5\xc9\xfb\x02\x31\xd4\x6c\x77\x12\xcb\x52\x3a\xc0\x3e\x64\x8f\xcc\xad\x67\x94\x22\xe3\xf9\x06\x2b\x8a\xe8\x18\xa5\x4e\x0a\xaf\x6c\x60\x18\x2c\x48\xf4\xfd\x69\xb4\xde\x6b\xab\x88\x49\xc3\xc1\x5b\xc7\x1d\xb6\xfa\x56\xa7\x63\x70\x25\x1d\x70\xc5\xb4\xc0\x56\x78\x2e\xaf\xa4\xb8\x95\x5f\x59\xaa\x6d\x93\x59\x0e\xca\x0d\x72\x23\xdd\x4a\x55\x37\xf8\x00\x8d\xf6\x35\x5f\x28\x60\x18\x2a\x9a\x18\xd0\xa5\x8a\xe1\x03\x82\xf8\x39\x2b\x0b\x9a\xb2\xa1\x74\x0c\x31\x06\xb4\xa1\x4c\x0a\xe9\x73\xd1\x9d\xa4\xdd\xd0\x66\x12\x94\xe3\x3f\x03\xad\x33\xb6\xa6\xb8\x02\x91\xbd\xe9\xf0\xc5\xe1\xf1\xe1\xcb\xae\xc9\x29\xc1\x71\x0e\x2f\xe7\xc8\x97\x78\xc7\x95\x09\xef\xe8\x2a\x35\x09\xde\x0c\x71\x3a\x5e\xa8\x49\x1b\x16\x6a\xf5\xbc\x53\xe6\x4c\xcf\xfd\x2d\xde\x56\xac\x75\xd3\xec\x3b\x19\xa8\xbb\xc4\xbb\x5c\xa2\xeb\x5a\xb1\x16\x0d\x9a\xcd\xa4\x13\x1d\x4c\xa1\x77\xa8\x10\xf0\x6a\xc8\xde\xd3\x7e\x34\x90\x06\x61\xa2\x87\x76\xb8\x6b\x8a\x9e\xe9\x39\x97\x6c\xf5\x3c\x91\x04\x98\xbf\x85\x2c\x71\x47\xfc\x87\x6a\xd9\x58\xc5\xdc\xed\x5c\x2f\xea\x02\x9c\x7e\x25\x33\x62\xc1\x67\xc5\x80\x4e\x75\xdd\xb0\x63\x76\x78\x5e\x80\x26\x6e\x5f\x6c\xff\x7b\x89\xa1\xe5\x2f\xb4\x06\x1f\x83\x5c\xed\x68\xe3\xb2\xe5\xf0\x13\x3e\x0e\x58\x47\xe7\x4f\x4e\xdd\x25\x42\xf0\xf0\xb0\x2e\x32\x4e\x03\x01\xab\x87\x8a\xf3\x37\x9c\x0e\x97\x1a\x29\xb5\x17\xb7\x04\xa0\x4b\xc1\xd7\x64\x41\x01\xad\x88\x23\x3b\xd1\x21\x9b\x66\xc2\x4d\xce\x30\x3e\xaa\x28\xb4\x3b\x30\x3b\xc0\x17\xc3\x64\x60\x77\x9c\x2d\xa9\x53\xe0\x90\x60\x3c\xbf\x04\xf8\x45\xae\x4b\x7c\xe1\xa1\x78\xf6\x75\xc3\xda\xf6\xea\x0e\x05\xd7\xc0\x38\xc4\xd4\x4c\x12\xdd\xe3\xfe\x9d\x3b\xfe\x90\xa6\xff\x61\x72\x56\x9a\x88\x96\x4e\xd7\xd3\x12\xf7\xca\x76\x14\xe7\xce\x59\x24\x95\x61\x9b\x06\xce\x40\x40\x43\x30\x39\xa7\xaa\xbd\x81\x84\xc2\x75\xc0\xaf\xd9\x68\x29\x08\x70\x13\xb0\x22\x21\x57\xa9\x6e\x66\x14\x86\x60\x68\xd8\x8a\x30\x93\x2f\x54\xfb\x5d\xc7\x8e\xe0\x59\x38\xb4\x94\x98\x12\x42\xe5\x3d\xd6\xd9\xfd\xc2\xc6\xaa\xba\x23\xbc\x8e\xda\xce\x04\x97\xa8\xb1\x5f\x36\xa6\xd4\x1c\x81\xc5\x0a\x71\x97\xc2\x42\xa3\x03\xd8\x06\xb0\xc8\x55\x60\xf1\xdf\xea\xd0\x9f\x49\xe8\xc8\x4f\x4a\x04\x81\x6a\x2e\xcb\x14\xc3\x82\x53\x59\xac\x47\xd7\xb3\x67\x73\x8f\xd5\x0f\xbb\xf9\x60\xac\x2e\x84\xe1\xfe\x7d\xd1\x51\x52\x6c\x29\xf1\xfb\x3d\xf1\xe8\x11\xe1\x2d\x80\xfb\x29\x22\x28\x3c\xa1\xbd\x88\xe3\xde\xa1\x41\xcc\xa7\x56\x13\x79\x9d\x38\xcd\x99\x1d\x9f\x7a\x00\x9d\x0e\x77\x44\x4f\xd7\x38\x8c\x1e\xaf\x2a\x79\x39\x87\xef\xc8\x8f\xb2\x87\x5b\x16\x0b\x86\x7e\x73\x3b\xe2\x5d\xe8\x56\x1b\xe3\xfb\xd0\x13\xe7\xac\xeb\xd1\x61\xfc\xaf\x37\x73\xfa\xdb\x01\xaf\x84\xbf\xdd\xdb\x64\xc2\x7b\xef\x71\x45\x68\x56\x64\x28\xb5\x81\x3b\x04\x5a\x4b\x3b\xef\x8e\x6a\x93\xbe\xaf\xa4\x09\x9c\x42\xc2\x37\x33\xee\x91\xcf\x95\x1b\x7a\x4e\x49\x8f\xef\xcd\xf2\x89\x14\x8b\xba\xfc\x71\xa1\x44\xa3\xe6\x8d\x32\xaa\xe6\xe4\x41\x93\x28\x5b\xa3\xd7\x73\xc9\x4a\x18\xe4\x23\x06\x12\xc5\x0b\x08\x08\x01\x51\x01\x70\x98\x90\x90\x6c\x99\xc4\x66\x1f\x94\x6f\x7c\x38\xc8\xb5\x16\x65\x61\xe5\xf6\xb1\xac\x42\x85\x50\x07\x60\xc3\xe4\x3a\x58\x55\x2e\xff\x8c\xfb\x02\x07\xb4\xc6\x7a\x99\x71\x7f\x5b\xe5\x9a\xe3\x59\x8c\xd7\xcc\x57\x6d\x78\x36\xc1\xac\x14\x48\xd1\x81\x28\xf6\x05\x48\x0e\x22\xcc\x11\xb6\xfa\x1c\x8a\xdf\xe7\x8e\x21\xdb\xbb\x35\x06\xd4\x8d\x2d\xa6\x9d\x1e\x7a\xbb\xd6\x4e\xd6\xda\x35\x88\xca\x9d\x90\x8f\x56\xde\xd4\xc5\x65\x9d\x24\xb7\x93\x33\x71\x45\xa5\xba\x15\x06\x8f\x83\x59\x08\x4e\xc1\x57\x56\x02\xf7\x83\xc5\x1c\xd5\x56\xc7\x83\xf8\x4e\xb0\xb7\xa3\xc4\xde\x71\x9b\x64\x0b\x76\x80\x29\x12\xbb\x72\x9d\x32\xac\x02\xbc\x4b\xe8\xc6\x12\x7b\xdb\x2c\xc6\x34\xa5\xe8\x1a\xbd\x09\x08\xca\x68\x24\x0e\x31\x28\xf5\x5a\x39\xb4\x16\xd1\x00\xae\xb8\x43\xa3\xc7\x3b\x46\x82\xf1\x5b\x58\xa1\x87\xc2\xf4\x8a\x46\x5e\x5c\x04\x69\xbf\xfc\xc8\xfb\x70\x1c\xcf\x08\x2f\x81\x10\x2b\x3e\xe2\x7b\x86\x26\xe1\x90\xc3\xad\xa1\x38\xaa\xc5\x1f\xcf\x8e\x5f\xfc\x6a\x40\x55\xdc\xa1\xb4\xea\x0d\xc4\xbe\x56\x4b\xa1\xeb\x40\x4e\x70\xd2\x43\x3b\x5d\x30\x22\x05\xa4\xf2\xa9\xb5\x93\x52\x39\x11\xc1\x35\x79\xfa\x60\x24\x1f\x63\x38\xb0\x81\xd9\xf3\xaa\xcf\x9f\xbb\xec\x90\x40\xe6\x33\xaf\xac\x0e\xd9\x55\x7b\x6f\xc8\xf8\x78\x02\x5e\x1e\x80\x9e\x6a\x95\x7e\x3f\x59\x60\xc1\xe2\x7b\x2d\x4f\x1f\x61\x42\xca\xd3\x58\x70\xf3\x3b\x27\xe9\x99\xcf\x45\x19\x33\xe8\xcf\x9f\xc5\x5d\x33\x05\xfb\xd6\xe1\x8f\x0b\x59\xf5\xa3\xd7\x83\x4e\x33\x6e\x2c\x29\x9f\x4f\x0b\x92\xfa\x03\x9b\x3c\xa2\x50\xb1\x27\x62\x92\xfd\xe6\x91\xdd\xf3\xaf\xb4\x86\xf4\x2c\xc1\x81\x4c\xdc\x65\x90\x3b\x73\x36\x40\xdc\x41\x21\x24\x6a\x8a\x0c\x5e\x0c\x91\xd5\xdb\xcd\x96\xe1\xec\x05\xc9\x14\x52\x8d\x72\x3c\x5e\xcc\x16\x95\x6c\xd5\xd9\xb5\x7e\x65\xc5\x83\x03\x07\x00\xd2\x8f\xab\xe2\x4e\xb0\xdc\x1c\xbd\x4c\xa5\x6a\x97\x06\x91\xc3\xc2\xed\x46\x41\xb8\x03\xba\x13\x33\xf6\x8c\xfc\xc8\xa2\x04\xef\x16\xd8\x80\x0e\x7f\xc6\x10\xf9\x50\xd0\x25\x58\x38\xf1\x94\x03\x91\x96\xa8\xdf\x9d\x48\x2e\x02\xc4\xbd\x11\xb2\x51\x3b\x20\x1d\xd3\xc6\xea\x5b\x4e\xf5\xb1\x34\x0e\x0c\x8c\x26\xe4\xe3\x16\x96\x8a\x24\xea\x54\xdd\x73\x07\x32\xa5\x0a\x84\x68\x5a\x2b\x45\x27\x08\x42\x80\xea\x31\xe3\x03\xde\xa1\xee\x4c\xb4\x25\x4c\x70\x53\x97\x4b\x43\xdd\x7a\x4e\xbb\xbf\xa3\x5a\x4e\x4a\x55\x15\x46\x48\x23\xae\x15\xa0\xd3\xe0\x08\xcc\x30\xfc\xce\xea\xe3\x63\x5d\x55\x72\x6e\xb9\x41\x24\x3a\xb8\x32\x98\xfe\x00\x19\x1a\xeb\x1a\x18\x5b\x1f\xb0\x51\x02\x04\x40\xa1\xd1\x93\xed\x4e\x24\x53\x0e\xec\x02\x47\x18\x52\x3b\x3e\x61\xc9\x4f\xc4\xa9\xa2\x10\x0c\x3d\x8e\x13\xe6\x61\x91\x21\x85\xb7\x82\x6b\x4d\x27\x33\xc7\xd3\xcc\x07\x4e\x70\xde\xc9\xbc\x8c\x0c\x34\x07\x27\xfb\x6f\x9c\x85\x26\x57\x57\xb6\x0a\x7d\x5d\x2b\x17\xc2\xb2\xeb\xdc\x00\x1a\x39\xbe\x74\x07\xa1\xac\xc2\xa0\x64\x04\xdb\xa6\xa8\x63\xb7\x19\xc0\x1f\xa6\xd6\xb5\xc2\xf7\x03\x04\x62\xe5\xfa\xec\xe9\xc3\xa0\x43\x0c\x4b\x05\x79\xce\x9e\xfc\xfa\xc9\xef\x86\xce\x52\x77\xd7\x4e\x9b\xe5\x7d\x6b\x03\x76\x02\x91\xde\xce\x73\x37\x08\x25\x4c\x14\xeb\x2f\x1c\x61\xbc\xe4\x75\x11\x24\xcd\x78\xea\x2e\x02\x1b\x3d\xe3\xfc\x26\xdf\x3c\x0a\x53\x8e\x88\x1d\x92\x82\x98\x7b\x5d\x97\xe0\xb6\x19\x25\x73\x71\x9d\x70\xd3\xe7\x94\xe2\x20\xec\xde\x9e\x1d\x70\xe6\x0d\x9d\x36\x62\x54\xa0\x3f\xec\x38\xd3\x16\x06\x84\xa5\xdb\xbb\xef\x87\x01\x10\x78\xfe\xe7\xba\x2b\x80\xc8\x65\xbe\xab\x46\xf8\x4a\x76\x57\x95\x73\x2a\x45\x9a\xdc\x11\xff\xcb\xab\x17\xce\x4a\x97\x77\x94\x71\x43\x07\xbd\xca\x8f\x7c\x95\x9e\xb3\xbe\x63\x71\x99\xf5\x1d\x8a\xba\x31\x1a\x89\x03\x90\x36\xe0\xac\xf7\x18\x50\x68\x39\x0d\x65\x28\x96\x9f\xe8\x56\x60\xe6\xe1\xa5\x7c\x55\x46\xcd\xa4\x55\x33\x0c\xab\x43\xc4\x52\x43\xfe\xdf\x59\x7b\xaf\x15\xfa\x59\x08\xf5\xb2\x38\x92\x32\x3f\x89\xa1\x46\xba\x93\x6d\xe0\xcd\x7c\x45\xf5\x41\xd0\x56\xb0\x8b\xbe\x46\x48\x0d\xe6\x74\x7f\xda\xe8\x19\xba\xae\x1d\x1d\xe2\xdc\xd6\xba\xde\x76\x39\x3f\x78\x92\x23\xd1\xaa\x74\x02\x37\x20\x61\x04\xd3\xaa\x67\xaa\x2d\x67\x10\xae\x83\x70\x0c\x53\x69\xea\x5e\x6b\x85\xd1\xc3\x1e\x07\xac\x92\x04\xba\x00\x8b\x91\x6e\x0a\xb6\xf7\x35\xca\xcc\x51\x4c\x15\x2e\xf6\xf5\x52\x61\x1a\x11\xdc\xa1\x1e\xaa\x03\x50\xda\x41\xc8\x22\x34\xe9\xd2\x8c\x6d\x7f\x4b\xb7\x6c\xa3\x91\xaf\x88\x63\xa8\x53\x2f\x8b\x04\xec\x13\x2a\x43\x64\x7d\x3f\x58\xd3\xca\x76\x61\x7c\x5d\x78\xbe\x01\x9a\x9a\xed\x9c\xaa\xdb\x66\x49\x38\x1c\xee\x1b\xca\xc0\x4b\x65\x09\x4a\x01\x5d\x97\x00\x61\xcf\xd7\x06\xc8\x0b\x03\xf6\x6e\xc6\xb6\x75\xed\x3f\xa1\xe3\x98\x8e\x74\xa0\x14\x3d\x11\x53\x5d\x01\xee\x36\x96\x89\x6a\x1b\xe0\xd4\xcf\x16\x55\x5b\xce\x2b\xe5\x6a\x0a\xf2\x02\x20\xee\xa4\x6d\x92\xb4\x00\x85\xdd\x10\xa5\x19\x06\xdc\xd1\xf9\x5b\x1a\x0d\x0e\x45\x72\x3e\x6f\xb4\x1d\xb6\x3d\x53\x8e\x0e\x1d\x08\xe2\x80\xa1\x2d\x44\xa3\xa4\xd1\x75\xec\x9f\xe8\x88\x3b\xb5\x9a\xc4\x3c\x74\x95\x21\x2b\x66\x8a\xd1\x9e\x8a\x3c\x5b\x27\xb2\xaa\x0c\x27\x27\x4d\x9b\x66\x43\x4f\x67\xc3\xa1\xcd\x67\xe7\xe7\xdb\x53\x5f\xee\xe4\x75\x95\x20\x31\x06\xe6\x49\x9b\xc8\x31\x81\x23\xe5\x60\x3d\xae\x9f\x40\xac\xc4\xd9\xeb\xd1\xd8\x98\x27\xdb\x1e\xe6\x7b\xf4\x6f\x71\x7a\x86\x6d\x57\x59\x54\x8d\xd9\x19\x8d\x0a\x7b\xe6\xe9\xb9\x6a\xa2\xf0\x0b\x55\x6f\xbf\x39\x1d\x15\x7a\x6c\x46\x6f\xd5\xf9\xe8\xd9\xab\xa3\x51\x5c\xa3\x93\xd6\xe2\xc7\x47\xae\xd3\x49\x6a\x96\x97\x72\xa6\xf0\xa2\xd7\xaa\xf9\x0a\x45\xc3\xb3\x32\x7c\x38\x37\x6a\x51\xe8\x43\xbe\x66\x82\x4b\xe1\x70\x42\x12\x65\x9d\xd5\xc9\x7d\x48\x20\x23\xf6\x39\x8f\x0c\xec\x2c\x86\xd3\xe4\x42\x28\xdc\x38\xbc\xc1\x0e\xc8\x08\x97\x23\xa7\x20\xfa\x07\x8d\x4c\x93\x25\x87\x18\x92\x32\x80\xb2\xd6\x0d\x06\x04\xf1\x32\x83\xdf\x89\x1f\xa1\x9b\x8a\x11\x7f\x5f\x6b\x56\x70\x2f\xe3\x19\xee\xc7\xe3\x1e\x24\x5d\xdf\x4c\xac\x25\xc2\xeb\xe8\x88\x00\xf0\x64\xa7\x6a\x20\x7e\x62\x33\xa0\x65\x75\xea\x97\x8b\x0b\xbb\xb8\xfb\x95\x34\xa6\xbf\x62\x80\x83\x55\x24\xb5\xf5\xd5\x9b\xa3\x2a\xe7\xe7\x5a\x36\xc5\xb6\x9c\x97\x66\xe4\x48\x77\x9f\x9f\x67\x49\xd7\x7d\x85\x70\xde\x5e\xa3\x50\x57\xdd\x2c\x83\xbd\xa8\x34\xd8\x07\x91\x58\x9e\xd2\xc2\x47\xef\x9d\x08\x1a\x3f\xee\xf2\x80\x7f\x55\x92\x8f\x57\xe6\xbf\x20\xc9\xc7\x03\x1c\xac\x22\xc5\x3c\xc9\x83\x72\xb1\x01\xdd\x1f\x9c\x1c\x6f\x83\x4a\xb3\xfd\x64\x1b\x15\x63\x4f\xfb\xbe\x8e\x94\xee\x1b\x55\xc9\x56\x15\x38\xa8\x7f\x2d\x36\xfc\xe6\x68\x2d\x55\xfa\x39\xfb\x45\x28\x92\x5a\xff\xc5\x28\x92\xeb\xcf\x53\xa4\x1f\xdc\x20\x47\x1c\x01\x25\x7e\x1c\x4f\x65\xb3\x0f\xd1\x0b\xee\xce\x08\xef\x9b\xd1\x8e\x2a\xee\xb9\x68\x42\x31\xd6\x85\xba\xc7\x30\xd4\x46\x4e\x00\xf1\x6b\x61\x94\x03\x12\xfe\x78\x0a\x4b\x3f\x9c\x34\x7a\xb6\xcf\xf5\x0e\xc5\x33\x23\xcc\x62\x3c\x1d\xa0\xe8\x79\xa9\x96\xce\x23\xab\x41\x20\xeb\x02\x7d\xe5\xcb\x9a\x4d\x60\x61\xac\xff\xbc\xd1\xc5\x62\xac\x84\xa4\x48\x1c\xdf\xe3\x81\x47\xa1\x56\x9f\xc6\x6a\xce\x37\x05\x1c\xe7\x03\x00\x9e\x43\xbe\xdf\x3a\x93\xe7\xdb\x56\x78\xb7\x8a\x0c\xa5\xf8\x54\x05\x28\x3e\xae\x65\x87\xb5\x08\x56\x11\xcc\xb6\x16\xb6\x67\xab\xb2\x73\xb4\x98\x41\x1c\x22\xe7\x9d\x0f\xa3\x09\x7c\x6f\x5b\x79\xbe\xed\xe7\xae\x74\x7e\x0e\x9d\xcb\xad\xdb\x11\x3a\x5f\x63\x30\x82\xc1\x4b\x36\x64\x86\x33\xe3\xe2\x7f\xbb\xf1\x8f\x08\x8c\x4e\x05\xfb\x9d\xe4\xb5\x60\x29\xa7\xb7\xec\x3c\x76\xa9\x96\xfb\x14\xb9\xe2\x8b\x0f\xe9\xa9\xf7\xf8\xe0\xcf\xf0\x42\x2d\xad\x58\xb8\x6a\x93\x7a\x7c\x6b\xce\x3d\xeb\x79\x10\x9d\xa1\xda\x70\x5c\xac\x75\xc0\xd2\x6e\x83\xea\x83\xfa\x93\xbc\x90\x65\x6d\x5a\x80\xb5\x43\xb2\x73\xa6\x2b\xdf\x2e\x44\x02\xde\xbf\xef\x07\xb4\xb7\x27\x1e\x3d\xf1\xea\x46\xd0\xc3\x47\x4f\x02\x4f\x9f\xc4\x49\xe4\xe8\xf0\xb7\xbe\x83\xce\x10\x1b\x11\xa6\x55\xb4\x5c\x57\xc0\xb4\x14\xa5\x03\x03\x37\x80\x74\x52\xdc\x84\x06\x19\xcd\x10\x19\x32\x24\x51\xd8\x3e\x56\xa3\x6b\x14\x19\xa2\xcb\x3a\x68\x7a\xe4\x5a\x1d\x38\xfd\xb8\x9d\xaa\x19\x85\x12\x1c\x2f\x4c\x8b\x17\x4e\xfe\x9d\xe8\xdb\x16\xb6\x7c\x13\x6e\x72\xf9\x72\xc7\x75\xf2\x0f\x7b\xe2\xc9\x63\xf1\xf9\xb3\x88\xe6\xd4\x4f\x21\xeb\x52\x01\x01\x85\x16\xfb\x87\xa1\xb9\x9e\x09\xd7\xdd\x50\x17\x96\xff\x8c\x01\x75\x1d\xae\xb0\x60\x02\x3f\xe2\x64\x99\xaf\x57\x75\xfe\xa4\x96\xfe\x30\xfe\xb7\x3f\xa9\xe5\x07\xc8\xa8\xe8\x0e\x4f\x77\x13\x80\xc0\xaf\x76\x20\x87\x66\xbc\x23\x7a\x87\x66\x2c\xe7\x98\x98\xe2\x74\x2e\xc7\xea\x5c\x36\x3b\xa2\x27\xe0\xc1\x0b\x70\x91\xeb\x3d\x6b\x1a\x7d\x6d\xff\x86\x87\x90\x43\x05\x1e\xbd\xc1\x1c\x2a\xaf\xcb\x8b\xa9\x2b\x06\x3f\xe0\x31\x65\x77\x81\xa7\x07\x9c\xdd\xe5\x00\xb2\x5b\x1c\x40\x22\x3a\x78\xf0\xb6\xb4\x85\x4e\x4e\xe1\x07\x65\x2b\x8a\x7c\x1b\xee\x08\xf1\x6c\x3e\x37\x99\xc7\x2e\x51\x0a\xfe\xf1\x42\x53\x6a\xa2\x63\xfd\xb7\x57\xbc\xca\x7f\x52\xcb\x1d\xd1\x7b\x53\xd3\x79\x5c\xaa\xa2\x17\x4a\x06\x90\xfe\xa3\xc2\xb5\x81\xfb\x87\x4a\x5d\xc8\xf1\x32\x20\xea\x56\x87\xcb\x64\xbf\x81\x6b\x39\x33\x57\xe3\x52\x56\x48\xa7\x86\x6f\x4b\x06\x60\xa9\x46\xd0\x54\xf2\xdf\x20\x93\x07\xac\x8d\xa8\xe4\x52\xa3\xbf\x11\xb1\xbc\x5f\x6e\xbd\x5b\x1a\x99\x3a\xd3\x7e\xc5\x7b\xbf\xed\xed\x88\xde\x0f\x72\x7c\x69\xec\x52\xc3\x6c\xf5\x7e\x67\x9f\x9d\xc9\x73\xfc\xf5\xe8\xb1\xfd\xb9\x5f\x29\xd9\xd0\x83\x27\xf6\xc1\xa1\xcb\xd7\xd4\x7b\xf4\x6b\xfb\xe0\x74\x5a\x12\x3d\xf4\x1e\xfd\xa6\x47\xab\xd3\xe8\x8a\x1e\x41\x43\xcf\x2a\x2e\x01\x6d\xbc\x72\xb9\x74\x7a\x8f\x1f\xc2\x27\x72\x6e\xdc\xaa\xf5\x1e\x43\x35\x01\x39\xf6\x9e\x40\x5f\x04\xfd\x78\x82\x75\x5c\x28\x22\xbb\xde\x93\xef\xf9\x89\x23\xaf\xde\x93\x5f\x61\x6f\x0b\xfa\x09\x7d\xfd\xa3\x9e\x71\x8d\xd0\x46\x4c\xcf\xbd\x27\xbf\xed\x25\x14\xdd\x7b\xf2\xbb\x5e\x97\xa0\x7b\xdf\x3f\xec\x75\x08\xba\xf7\x3d\xb4\x78\x54\x1b\xd5\x70\x31\x68\x34\xa0\xf1\xde\x23\x9c\xd5\xe7\x8f\xf8\x27\x8c\xe5\xf9\x63\xfe\x09\x03\x79\xfe\x84\x7f\x42\x8d\xcf\xbf\xe7\x9f\x50\xdd\xf3\x5f\xf1\x4f\x18\xc2\xf3\x5f\xf3\x4f\xe8\xfc\xf3\xdf\xf0\x4f\xe8\xf8\xf3\xdf\xf2\x62\x42\x8f\x9f\xff\x8e\x7f\x3e\xc2\x6e\x3c\xe4\xdf\xd4\x2d\xee\xd7\x63\xec\xd7\x23\xee\xd8\xf7\xd0\xb1\x97\x8b\x99\x5f\xa5\x47\x38\xde\x64\xcb\xf5\x1e\x3f\x86\xa2\xc7\xaa\x95\xbd\x75\xa2\xf7\xed\x4e\x7f\x96\xb1\xc3\xd3\x1f\xb8\xe5\x0d\x07\xff\x9f\xd4\xb2\x7b\xe6\x43\x9c\x76\x7c\xb2\x07\x5e\x9a\xae\x09\x51\xd6\x81\x2b\x10\xb2\x65\x7f\x0a\x9d\x2f\x9d\x80\x23\x8a\x85\x42\xd4\x14\x8c\xc8\x4e\xae\x2a\xc1\x6f\xf1\x5a\x37\x97\x60\xcd\x6c\xe4\xa4\x45\xa6\x31\x21\x80\xf3\xa1\x17\x04\xca\x46\x3d\xd7\x9f\x7c\x0d\x86\x46\x69\x8f\x57\xce\x89\xf9\x31\xe1\x6a\x1f\x39\x82\x92\x6b\xf1\x07\x5b\x20\x55\xf6\x6b\x3f\x73\xad\x16\x1f\x43\x46\xf8\x71\x2b\xc8\x35\x3f\x74\xd7\x54\x97\xc0\x2d\xc2\xe3\xe2\x5d\x32\x6b\xef\x21\x1e\x24\x7e\xe6\x51\xdd\xec\xf7\x77\xf7\xf6\x12\xa6\xdb\xb9\x22\x73\xdf\x7c\x09\x04\x01\xca\x4b\x93\x15\x3b\xec\x8c\x0c\xc4\x5c\x57\xcb\x09\xe6\x18\x11\xb3\xc5\x78\x8a\x68\x33\x68\x4c\x16\x63\x59\x0f\x33\x0b\xed\xa3\x59\x5c\x42\xb4\xf0\xa6\x34\x90\x4d\xd6\x0a\x8e\x5e\x72\xb3\x72\xb6\x62\xe9\x01\x80\x41\xd4\x78\x5a\x53\xec\x2b\x84\xf4\xc6\xb2\x76\x57\xfa\x1e\xfb\x94\xfd\xe0\x93\x02\x88\xd1\xe8\x15\x68\x49\xcc\xa3\x15\x0f\x44\xad\x09\xed\xbd\x23\x20\x51\x98\xf4\x30\x27\x93\x90\xc4\x22\x9e\x32\xeb\x16\x3b\x22\xa3\xb6\x38\x99\x67\x8b\x31\xe2\xd6\x4e\x1e\x24\x69\x4b\x57\x3f\x2a\xb1\x98\xf7\x82\x4d\xf5\x16\x6e\xb0\xe0\xf6\x2a\x3d\x03\x5d\x06\xd9\x48\x0d\x9b\x29\x59\x53\x6e\x76\x25\xc7\x53\xae\xc7\x1f\xc7\xb0\x1f\xed\x31\x0b\xf9\x86\xec\x69\xeb\x36\x3f\x1c\xc5\xa4\xcd\x2c\xea\xf2\x4a\x35\x46\x56\xa1\x10\xea\x70\x00\xc3\x93\x31\x25\x6e\xdb\x0c\x10\x78\x4c\xbf\x09\x84\x5e\x9c\xdd\x34\xb0\x73\x44\xc7\xf2\xd7\x9b\x3a\xa2\x6a\x52\x6b\xc7\xa5\x95\x69\x02\x56\x67\x19\x70\xa5\xc7\x94\xc8\x93\x4d\xd3\xe3\xb6\xa9\x40\xfa\xe1\x07\xc6\x9e\xd8\xd1\x13\x59\xc5\xbf\x67\xaa\x95\xd1\x83\x46\xcd\x95\x6c\xfd\x6f\xdb\x4a\x15\x98\xbf\x11\x68\xc6\xce\x50\x73\xda\x42\xc6\x37\xee\x56\xf4\x78\x80\xbb\xfb\x05\xca\x56\x47\xde\xae\xef\xc8\x75\xa5\xad\xd2\x2e\xbe\xd7\x8b\x7c\x5e\xa8\x45\xd5\x22\x87\xe5\x74\x87\x64\x61\xb1\x9b\x2b\xd1\xf0\xd1\xd5\x53\x4f\xfc\x86\x73\xe4\x96\xe1\x99\x9e\x2d\xbb\x9a\x4b\x13\x08\xed\x1c\x59\x0f\x67\x42\x25\xc7\xc8\x9d\xc8\xbf\x6d\xa9\x5a\x31\x29\x6b\x59\xd1\xb6\x6f\x3b\x87\x03\x2a\x32\xb2\x5e\x8a\x99\xfc\xab\x97\x03\x87\x28\x55\xba\x26\x11\x1f\x04\x87\xed\x55\x3c\x75\x13\x3b\x0b\xb1\x9a\x62\x46\xa6\x88\x85\xf9\xbb\x25\xaf\xac\x90\xc7\x31\x11\xff\xda\xa5\x70\xfb\x30\xbf\x12\x56\x2a\x1a\xbd\x99\x6f\xbe\x16\xf3\xe9\xd2\x80\x47\xac\x63\x0f\xa0\x8f\x85\x8c\xb6\xcb\x19\x7c\x45\x28\x62\x3b\xb7\x5b\xcb\x68\x4c\x2f\x65\x35\x5c\x19\x63\x8f\xd4\xe4\xf0\xcb\x49\xe5\x87\xe2\x99\x31\x8b\x19\x5a\xea\x24\xa0\x26\x80\x8f\xf1\x9b\xd3\x55\x35\xcd\x1b\x7d\x55\x42\x48\x9d\x30\x8b\x66\xde\x94\x06\x11\xcc\xe4\x78\xbc\x68\x64\x0b\x69\xc7\xe7\x80\x9a\xa1\x1b\x5b\x8d\x9d\x88\xc3\x85\x15\x59\x64\x8d\x9d\x1c\x72\x55\x07\x0b\xc5\xb6\x9c\x01\xb5\x5c\xa9\x49\xcb\x60\xf4\xc0\x3a\x5b\x1d\x9c\x83\xe0\x55\x69\x67\xbf\x9c\xad\xa7\x0c\xc7\xab\x33\xef\x02\x2e\x1d\xe7\xab\x1e\x06\xda\xf9\x4a\x42\x81\x89\x5c\x4b\x26\x50\x02\x93\x7c\xd4\x42\x56\xa5\x44\x6f\x1d\x55\xc2\x41\xe6\xa9\x48\x37\xe1\xee\xc6\xd5\x84\x45\xae\x9d\x4f\x83\xdd\xb0\xb6\xeb\xb4\xee\x81\xfb\xc2\xcf\xbe\x23\xfe\xa1\x13\xf9\xdf\xf6\x69\x78\x1d\x1d\x74\xff\x05\x4d\xd4\xd1\xf8\x06\x2b\xce\xf5\xfc\x95\x09\x64\x45\xfe\x69\x62\x84\xab\x22\x15\x21\x0a\xd9\x4a\xb0\x7d\x4c\x54\xf3\xaf\x75\x5f\x02\x8e\x48\x6b\x49\xd2\x4d\xda\x2f\x42\x8e\xbe\xfd\x5f\x8c\x22\x83\x26\xf2\x44\xe9\x46\x38\xc8\x50\x48\x9e\x18\x31\xfd\xee\xcd\xd4\x08\x79\x87\xb6\x55\x42\x87\xfe\xeb\x94\x10\x31\x97\xaf\xf1\x22\x25\x2e\xf9\x59\xfa\x98\x9c\xb2\x3a\xcf\x6f\x14\x61\x37\x10\x83\x37\x94\x62\xff\x55\x76\xc8\x0d\x1c\xdb\xaf\xe5\x7f\x41\x76\xed\x07\x37\xc8\x11\xed\x57\xbb\x73\x3c\x7e\xf8\xf0\x77\xa3\xb7\x07\xdb\xe0\xf3\xe4\x93\x46\x9b\x6d\xfb\xe2\xe1\x93\xc7\x0f\x47\xff\xe6\x9f\xd2\xf6\xd9\xfe\x7a\xe3\x70\x90\xd5\xfa\x2a\x74\x7c\x4a\x9e\xa7\x9b\x91\xad\x6a\xff\xed\xf8\xb4\x6e\x7f\xac\xdf\x1d\xf1\x0c\xff\x17\x74\x03\x49\x46\x38\x58\x49\x54\xf9\xcd\x02\x29\x75\x7e\xa2\x58\xe3\xeb\xe8\xc8\x35\xaa\x6a\xe5\xff\xba\xd1\xf3\x09\x8b\x65\x5c\x9e\xf0\x85\xd8\x01\xb3\xac\xac\x2a\x00\x49\x69\xb5\xd5\x68\x94\xaa\x0e\xe0\x2d\x5a\x5e\xdf\xaa\xf3\xcb\xb2\x25\x3d\x9f\x4d\xc7\x7d\x0c\x84\x2b\x0d\xa1\x6a\x5c\xa9\x2d\xd4\x55\x7a\xc1\xf7\x51\xb3\xb8\xd7\x87\xc1\x6b\xb1\x13\xa8\x5a\xd0\x9f\x3f\x6f\x36\x9e\x3f\xaf\x1a\xcf\x9f\xd7\x8e\xe7\xcf\xeb\xc6\x03\xfe\xb5\x6b\x87\xf3\xe7\xf5\xc3\x59\xdf\xf6\x47\x72\xb8\xfd\xfd\xef\x6e\xdf\xf0\xfa\x76\xbb\xb3\xf8\xbf\x99\x79\x45\xa6\x66\xe3\x92\x7b\xdc\x83\x52\xc7\xe0\xfc\x51\xb2\xc5\x9f\x50\x71\x1a\x79\x2d\xa0\x6e\xac\x8a\xf0\xa8\x75\x4d\xb1\x82\xb5\xb6\x5c\x8b\x63\x7f\x11\x56\xc5\xc3\xb9\x3e\x18\x6d\x8b\x47\x8f\x1f\x0e\x04\x38\xf0\x56\x4b\xa1\x7e\x5c\x94\x57\xb2\xa2\x8c\xf8\xf3\xf2\x93\xaa\x0c\x5d\x5c\x3f\x13\x17\x5a\x17\xe8\x8f\xfc\x89\x3c\x0a\xad\xea\x7b\x70\x72\xfc\xe1\xe0\xf0\xc5\xd9\xb3\x0f\x2f\x8e\x5e\x1e\x8a\xfe\xa3\x2d\xdb\xc0\xaf\xbe\xb5\xef\xae\x4a\x75\x8d\x2e\xdf\x76\xe6\x74\x83\x35\xfd\x7f\xdf\x3f\xa4\xaa\xd1\x89\xd9\xd7\x70\xba\xff\xfa\xf0\xf0\xa5\xe8\x3f\xde\x22\x83\xc3\x6f\x7f\x33\xcc\xd4\x34\xe4\x89\x3b\xc6\x0c\x07\xff\x42\x1c\xfe\x66\x1d\xc1\x73\xa0\xff\xb2\x4a\x82\x1f\xe2\x20\xc7\x70\x03\xee\x7e\xb6\x68\x6a\xf0\x5c\x78\xd7\x93\xe7\xba\x69\x7b\x03\x31\x1c\x0e\xdf\xdb\x27\x65\x8d\x59\xe4\x7d\xec\x1b\x32\xea\xef\xec\x5e\xc6\xc2\x3b\xfc\x7b\x3d\xa8\x02\xe7\xea\x0d\x71\x15\x9e\x61\x6b\xfe\x65\x84\xac\x00\x6f\x19\x58\xc1\x15\xfa\xe2\xfe\xca\xe0\x2b\x60\x85\xef\xa9\x08\x17\x1d\x0e\x81\x50\xbe\xec\x22\xdc\x29\x86\x5c\xe1\x99\x74\xa6\x0f\x62\xba\xf7\xa3\x73\xd5\xed\x88\xbf\x03\x20\x00\x95\xf8\xe2\xea\x1a\xa5\x50\x13\xdf\x07\x39\x82\x6f\x6e\xe7\xcb\xee\x1d\x3f\xe1\x3d\xe7\xb5\x0e\x77\xdf\xc1\xef\xa3\x96\x00\xc2\xa2\xa7\x88\x09\xe0\x33\xb4\xf9\xbc\x63\xf6\xaf\x57\x95\x5c\x06\x7f\x9e\x61\xec\x01\x66\xf5\x2a\xc7\x97\x61\x7a\xaf\xde\x38\x06\xa2\x18\xeb\x39\x7e\xba\x80\xea\x0b\xbd\x38\xaf\xd4\x3e\x7f\x55\x34\xf2\x82\xff\xa5\x8e\xe2\x9f\xe0\x5d\x40\x3f\x3e\x95\x2d\xff\x0d\x69\xa9\xf9\xc7\xc9\x95\x2f\xe4\xfa\x5f\x34\x1a\xc0\x2b\x0a\xe2\x35\x14\x82\x31\x10\x3d\x35\x9b\xb7\xa5\x82\x36\x54\x3d\x6e\x96\xf3\x96\x7f\x14\xf4\x47\xd3\xe8\x26\xcc\x6e\x47\x30\x78\xf0\x07\x78\xe1\xd9\x3f\x2f\x3d\x94\xc6\x25\x99\xe7\xe9\x6f\x44\xcd\xa8\xb4\x2c\xf8\x5f\x85\xae\xd4\xee\xd7\xb1\x6a\x65\x11\x3c\x71\xbd\x9e\x85\x28\x1c\xf0\xe3\x58\xe3\x40\xe1\xc7\xc9\xc2\x97\xe2\x51\xcf\x3c\x50\xc7\x5c\x9a\x56\xe1\x1f\x0b\x5c\x84\x39\x2d\x98\xfd\xb7\xac\x61\x8a\x01\x94\x97\x3a\xdb\xc8\x56\xf9\x89\x69\x94\x51\x6d\x94\x59\xb0\x67\x94\xba\xc4\x49\xb1\x7f\x51\x0d\xa6\x85\x24\xb6\xf0\xe7\xe2\x7c\x86\xab\x62\x16\xc6\x6e\x1b\xc0\x0b\x29\x67\xea\xcd\xbc\x90\xd8\x97\x56\x5f\x5c\x54\xf4\xd7\x62\x3c\xf5\x19\xed\xe0\x27\x2d\x36\xfc\xcd\x43\x85\x1f\x6e\x4a\xbc\xfe\x43\x65\xaf\x74\xb5\x98\x05\xdd\xbe\x96\x80\x82\xee\x93\x5b\xbe\x1f\x4e\x74\x73\x28\xc7\xd3\x7e\x56\x3c\x82\xbb\x5d\x39\x2f\x5b\xbc\xff\xc6\x63\x60\x0f\xf7\xdb\xbb\x87\xef\x87\xad\x7e\x33\x9f\x33\x4c\xa2\x78\x40\x47\x02\xa6\xb9\x7e\xe4\x20\xe9\x48\xaa\x15\x7b\x96\xa5\xf4\xc4\x83\x4e\x95\x5c\xb0\xd5\x73\x57\xb2\xd5\xf3\x7c\x51\x2e\x8b\xe1\xe6\xb7\x85\x92\x61\x91\xbb\x83\x23\xc3\x9d\x7c\x00\x3e\x35\x37\x21\xc9\x70\x4f\xdf\xdf\x21\x44\x8a\x90\x05\xbd\x83\x1f\x90\xcf\x8e\x52\x8a\xac\xe7\x44\xbe\x36\xf7\xc9\x17\x38\x1b\x08\xbf\x00\x8e\xfe\xb2\x16\x07\x87\xff\x89\x77\x00\x98\x07\xac\xbc\x52\xb5\x32\x06\x9d\x5d\xc9\x1f\x02\xbc\x0f\x6a\x7d\x5d\xff\xf1\xec\xf8\xc5\x59\x98\x9b\x4f\xec\x85\xfc\x79\x20\xe2\x94\x89\xf8\x83\x79\x96\xff\x15\xb0\xad\x30\x31\x61\xab\xe7\x07\x1d\x66\x61\x47\xe1\xf9\x85\xfd\x15\xb2\x0c\xf8\x5d\xf8\xbf\x99\x71\xb4\x7a\x7e\xc4\x2c\x03\xfe\x76\x5c\xc3\x4e\x1a\x31\x06\xfa\xd3\xf3\x06\xf7\x20\x64\x0f\xf4\xd0\x6f\x07\x3d\x7f\xc5\xbb\xdb\xfe\xed\x47\xf7\xca\xef\x71\xfb\x2b\xd8\xe6\xad\x9e\xbf\x8e\x76\xba\x7d\xc0\x9b\x1d\xe2\xd4\x78\x97\xd3\x0f\x5f\xcd\xa9\xdf\xeb\xf6\x97\xdb\xee\xf0\xc3\xef\x78\x3d\x3f\x4b\x36\xfd\xfc\x2c\xd8\xf7\xf3\xff\x4c\xf6\x6c\xab\xe7\x6f\x69\xdb\xbe\x27\x10\xa1\x53\xb8\xcb\x02\x92\xd9\x24\x54\xfe\xfb\x7f\x40\xa8\x7c\x7a\xb4\xde\x4c\xf1\xae\xcd\x30\x9d\x61\x5c\xcf\xda\xa0\x70\x6e\x1a\xaf\xa4\x38\x26\x4f\x53\x96\x83\xf5\xe1\xdd\x61\x88\x1f\x1e\x47\x3e\xca\x2f\x08\x08\x75\xd8\x10\x82\x2f\xc5\x38\x46\x55\x37\x89\xd3\x44\xab\x35\x45\x14\x23\x6e\xa8\x09\xeb\x83\x6b\xc8\xfa\x5a\xc2\xdd\x75\x5c\x95\x19\xa2\x13\xad\x55\x22\xa6\x98\xe8\x3c\xe3\xfe\x12\x56\x16\xf9\xb0\x0c\xc5\x49\xad\xc4\x35\x00\x96\xaa\x4f\x73\x35\x6e\xc5\x99\x3c\x27\xf0\x5e\x0e\x0f\xed\x13\x90\x7d\x89\xc1\xb6\x51\x64\xe5\x7a\x3f\xef\x28\x69\xd8\x8a\x95\x10\x61\xa8\xe5\x77\x71\xa8\x25\x27\x61\xfa\x9a\x68\xcb\x74\x5d\x43\x70\x93\xe8\x0e\xe8\xa6\xa0\xea\x28\x32\x7d\x65\xa8\xfe\xba\xe6\x7c\x60\xc4\x8d\x01\xdc\x20\xa5\xdd\x40\x4c\x20\x00\x12\x25\xe9\x9a\x90\x7f\x30\x47\x33\xbc\x32\x31\x25\x05\xb1\xe9\x98\xad\x8c\x29\x29\xa8\xc7\xc4\xab\x1a\x3a\xe4\x20\xfc\x32\x2c\xe5\xe3\x9f\x77\x29\x0f\x02\xc1\x34\x1f\xad\x9e\x5f\xe9\x63\x27\xac\xdd\x18\xe3\x3e\x1a\x89\xb3\x93\x83\x93\x1d\x71\x80\xb9\xbe\x02\x30\x15\x4e\x70\xa1\x5b\x11\xc4\x86\xe0\x34\x32\x42\xcb\xa6\x23\x39\x66\x89\x31\xdf\x21\x90\x1f\x3b\xaf\x72\xc1\xfa\xeb\xe9\xc8\x2b\x8c\x37\xd1\xd1\x81\x15\xf2\x3b\x2d\x1e\x90\xc8\xbf\xe2\x45\x9b\xeb\xe5\x01\xab\x03\xd9\x37\xa8\x1c\x64\x5f\xe5\x07\x7d\xe0\x14\x87\xcc\x2b\xbd\xe9\xfe\x75\x57\x66\x37\xcd\xc3\x59\x20\x07\x77\x1a\x3c\x63\xa9\x38\xff\x26\x4f\x61\x67\x5e\x62\xde\xac\xaf\xfe\x0e\xe3\xa6\xce\x3e\x0b\xf5\xc7\x4e\xc3\xcf\xba\xda\xe4\xea\x32\xb7\xe9\x60\x1c\x37\x7b\xe3\x8c\x46\x3a\xc2\x86\x53\x10\x9b\xa7\x6f\x6a\x82\xf2\xae\x6f\x56\x37\x5d\x26\xdd\x54\x27\xa6\x91\xdf\xac\x4a\x6f\x6a\xb9\x19\x6f\x63\xbe\xcc\x6c\xec\x1c\x23\x78\x05\x0a\xe3\x66\x1d\x88\xc3\x3a\x57\x74\xa2\x50\x13\xb9\xa8\x5a\x5f\x63\xc8\x9a\xc1\x0b\x38\x2b\xc7\x0f\x21\x43\xd2\xc9\x24\x91\x6c\xe2\x24\x40\xfc\xdf\xb5\x6c\xea\xb2\xbe\xe8\x03\x38\xc8\x40\xf4\x3a\x82\xe3\x8e\x78\x53\x73\xe2\x28\xb2\x05\x82\x14\xf8\xf1\x5b\xf3\x91\x93\x15\x63\x1d\xc2\x6a\x63\xbd\xd2\x88\xaa\xbc\x54\xd5\x52\x40\x40\x1b\x78\xda\x4a\x80\xff\x2f\x6b\x82\xe8\x17\xaf\x2a\x65\x27\x6d\x52\x82\xec\x22\x4a\x63\x16\x6a\xd8\x8b\x53\x85\x6f\x85\xc0\x33\x5f\x3a\x87\x0f\x30\x7e\x3b\x74\x9c\xe6\x48\x98\x5a\x7d\xdf\x31\x6d\x67\xd5\xaf\x46\x30\x3f\x43\xfb\xf7\xbf\xd1\x25\xe0\xc3\x8d\x16\x8d\xae\x6c\xb2\xab\xe5\xa5\x4d\x45\xfa\x69\x5a\x53\x80\xb3\x96\xda\x18\x6f\x21\x51\x63\x6b\x6b\x61\xd0\x42\x9f\xab\xd0\x5b\xca\x7b\x44\x19\xd5\xfe\x11\x96\x94\xe9\xa6\x3f\x8d\x7e\x06\x66\xc7\xa3\x1a\x50\x41\x31\xcd\x82\xa1\x24\x0f\x46\x57\x90\xaf\xea\xe0\xe4\x58\x4c\x4b\xd5\xc8\x66\x3c\x5d\x12\xf4\x3d\x28\x1b\x00\xca\xe2\x52\x26\x96\x50\x07\xa0\x3e\x0f\xf1\xef\x80\xbe\x4e\x6c\xd1\xfe\xc1\xc9\x71\xfa\x6c\x6b\x37\xf8\xf0\x31\x7d\xb8\xaf\x67\x73\x5d\xdb\xe9\x68\x94\xea\x03\x39\x1d\x9c\x1c\x47\x4f\x83\xce\x43\xc8\x5b\x39\x9b\xeb\xa6\x95\x35\xa1\xbf\x50\x17\x8d\x28\xeb\x71\xb5\x28\x90\x40\x69\xa7\x89\x3e\xdf\x53\x4c\x25\x0c\xb0\xd5\xa2\x51\x3f\x2e\xca\x46\x11\xfc\xf1\x6c\x6b\x83\x21\x99\x1f\xe0\x72\x17\x40\xd2\x33\xfb\xa9\xf3\x68\x70\x47\xa0\x88\x0f\x67\x6d\x54\x36\xfb\xd8\x96\x0f\x20\x4e\xb8\x6c\xe7\x11\x84\x6f\xa5\x98\x69\x3b\xdd\x47\xb6\xdc\x0f\x80\x2b\x83\x18\x54\x61\xe1\xfc\x73\xb4\x3e\x60\xaa\x1d\x2b\x74\x3d\x33\xcb\x7a\x7c\xba\x38\x6f\x1b\xa5\x9e\xbd\x3a\x72\x58\x46\x69\x89\xf1\x54\x15\x8b\xaa\xac\x2f\x7e\x58\x1e\xe0\x94\x1f\xd5\xbc\x88\x1e\xa1\x68\x34\xa2\x24\x9c\x86\x18\xc6\xf3\x46\x82\xf1\x3c\xa8\x0f\x5e\xf0\xf3\xd5\x9f\x1e\x9c\x1c\x73\xbe\x1a\xad\xc3\xef\xf7\xdd\x43\xff\xb1\x7f\xfb\xc6\xa8\xe6\xac\x9c\x95\xf5\x45\x38\x9a\x3b\x10\xf4\xd8\x4a\xb8\xb0\x9a\xe9\x42\x09\xa4\x40\xbb\x0f\x06\x94\x53\xe5\xd9\xeb\x33\xfe\x13\x2f\x43\xb6\x76\x82\x7a\xf9\xeb\xd7\x6a\xac\xeb\x71\x59\x41\x86\x22\xac\x1c\x7b\xae\x9a\x12\xa2\x5b\x2a\x51\x6b\x3d\xa7\x46\x08\xdd\xb1\x5a\x0a\x4c\x31\x1b\x55\xf9\x52\xeb\x79\x54\x5d\x34\x13\xbe\xbe\xb9\x6a\x38\xdc\x06\x6b\xdd\x3f\x8d\xea\x79\xe5\xde\xe7\x6a\xeb\x58\x9a\xae\xaf\xaf\xc5\xf9\xa2\xac\x0a\x33\x44\x42\x00\x5f\xe1\xd3\x56\x8e\x2f\x29\x77\xc1\x1d\x97\x69\xa4\x3c\x07\xe7\x1e\xf7\x86\xb0\xa7\x31\xc9\x2b\xe6\x2e\x0d\x40\x53\x61\x61\xf6\x17\x8d\xd1\x4d\x9f\xf6\x25\x24\xb7\x8c\x2e\x71\x28\x0a\x18\x27\x66\x47\x84\xe5\x5c\xbe\x90\xa0\xd2\xb9\x9e\xdb\x59\x34\xba\x19\x60\x77\x7c\xb0\x12\xf6\xe2\xf7\x5e\x89\xe5\xf3\x31\x3d\x19\xdf\xd4\xa8\x3e\xab\xc2\x56\x37\xec\x65\xfc\xbc\x5d\x8c\xaa\xcf\x4a\x01\xad\x41\xa8\x8e\x9f\x86\x77\xd0\xe6\xfb\xad\x4d\x9a\x7a\x0e\xdf\xcf\xf5\x7c\xae\x8a\xa8\x4d\x68\x07\xc7\x34\x64\x2c\xe6\xbd\x60\x15\xa8\x11\xb2\x86\x26\x4f\xc3\xdc\xac\x94\xdd\x25\xed\x5d\x80\xa6\x86\xf0\xe6\xf6\xe9\xf6\x76\x9c\x66\x06\x72\x41\xf0\xc4\x52\xd4\x48\x38\xbf\xf6\x9b\x07\x0f\x56\xf6\x21\xee\xfe\x0d\xbd\x81\x67\xbb\xeb\x47\x1e\xf7\x0e\x4c\xf0\xdf\x3c\xa2\xa4\x37\x94\x22\x03\xd7\xfb\x0f\x81\x28\xb4\x76\x76\x3c\x3d\xac\x9b\x21\x07\xdc\xe4\x66\x29\xc0\x58\x2f\x94\x19\x37\xe5\xb9\x72\xa7\xd4\xf3\x06\x33\x0d\x79\x03\x5b\x2d\x67\x00\x1e\xb6\x68\xc6\x6a\x20\x00\xac\xd1\x9e\x20\x11\xc9\xf7\xfe\x52\x63\x0b\x20\x67\xc1\x27\x14\x41\x03\x62\x60\x6f\xcb\x3e\xc5\x2a\xc4\x53\xd1\x13\x7d\xd9\x42\x49\x7c\x34\xb4\xc2\x16\x24\x2e\xa2\x88\x8a\xfe\xe8\xff\x0c\xbf\x7b\xf7\x97\xbf\xfc\x65\xf4\x7e\x34\x10\x3d\xf8\xbc\xb7\x13\x7c\x50\x95\xb5\x7a\x09\xc0\x00\xf6\xcd\x56\x4f\xec\xf8\x8e\x61\x03\xb8\x55\xe1\x00\xb5\xdf\xf9\xb7\x5c\xbe\x07\x69\x89\xc2\xdd\xcd\x73\x01\x64\xdd\x0f\x48\x85\xad\x71\xf0\x68\xd8\x4a\x67\xd9\x03\xf1\xfa\xa8\xe6\x48\x26\xcb\x1b\x78\x1e\x77\x7c\x81\xe7\xd4\x80\xac\x72\x6f\xe1\xd2\x35\xf7\xe2\x8f\xda\xb4\xc9\x73\xba\x90\xb0\x63\x61\xa2\x1b\x7e\x28\xd4\xf9\xe2\xe2\xc4\x3e\xdb\x0d\x0a\xd1\x64\xc7\xa5\x4e\xe1\x61\x58\xac\xc6\xd5\xbe\x50\xbe\x29\x10\x0f\x70\xf4\xbb\x69\xab\x94\x86\x2a\xb4\xb9\x58\x46\x02\xef\x42\xe9\x3d\x2c\xdc\xa9\x1b\x4b\xa7\xb9\x4a\x89\x92\xf2\x04\xb9\x92\x08\x77\xef\x64\x94\x91\x20\x44\x8b\xc1\xb6\x09\xf2\xcd\x73\x72\x59\x23\xa0\x06\xc4\xdd\x55\x56\x81\xa0\xac\x82\xd7\xba\xb9\xdc\x2e\xeb\x6d\xbe\x3d\xc3\x09\x04\x33\xe6\x68\x84\xdf\x14\x0b\xc8\x84\x7f\xae\x50\x9c\x14\x63\x6d\x85\xa6\x56\xe1\x45\xce\x50\x1c\x60\x52\x7d\x5b\xaf\x28\x5b\xc8\xd0\xd0\x60\x62\xfc\x76\xaa\x1a\x5b\xcd\xb8\x6c\xc6\x8b\x19\x02\x7d\x9a\x61\x8c\xe6\x6e\x77\xf1\xb3\xa2\x50\x75\xb1\x98\xfd\xb0\x7c\xab\x9b\xcb\xa3\x9a\x6d\xfc\x48\x9a\xd7\xd1\x33\x7f\xd7\x45\xa9\x61\x70\xdc\x41\xda\xec\xb8\xbc\x7d\x59\x68\x97\xf3\x61\xa2\xc5\x83\xbd\x84\xf6\x6b\x8e\x07\x44\x14\x6a\x97\x0c\xbf\x9d\xba\xa4\x17\x02\xd2\xad\xab\x46\xcc\xc0\xfe\x87\xc9\xd7\x29\x66\xe5\xba\xd1\x56\x3e\x6d\x94\xc2\x15\xa9\x7d\x9e\xd9\x77\x3d\xfc\xbc\xf7\x1e\xe1\xe0\x89\xf1\xb9\x06\x19\x28\xbf\x9e\xe8\x4e\xd2\xb0\x7d\xe4\xa7\xd0\xc5\x13\xa6\x00\x62\xa0\xde\x96\x8f\xcb\xb5\x47\x22\x96\xa5\xfa\xf0\x3b\xcf\xcf\xe3\x43\xb0\x9b\x68\x7a\x8d\xcd\xfe\x86\x0d\xe8\x76\x84\x4b\xd4\x2b\xee\xdf\x07\xcd\x54\x4f\x84\x7f\xd1\x73\x99\x3b\xb2\xb1\x2a\xab\xf7\xcc\x97\x38\x12\xd1\xc1\x43\xaf\x9a\xab\x88\xa2\xfe\xd1\xf3\x35\x1a\x89\x53\x39\x51\x1e\x43\x66\xe2\xb2\x33\x60\x4d\x88\xe5\x0b\x60\xbd\x88\xf6\x81\x02\x5e\x59\x5f\x0c\xb8\x02\x40\xe2\x01\x47\xa5\x8b\x85\x6c\x64\xdd\x2a\x97\xe1\x0f\xc8\x2d\xdd\xb1\x94\x4b\x36\x8a\xf9\xdc\x6c\x67\x79\xb6\xb7\x76\x82\xe1\xf0\x0e\xa7\x89\x66\xb5\x3b\x87\x96\x79\x0d\xfd\x7a\xb0\xa4\xc9\xb3\xb4\x7e\xd2\x6f\x2e\x08\x0c\xc7\x15\x0b\xbb\x98\x76\x30\x38\xce\x36\xee\xe5\x3a\x3a\xda\xa8\xf7\x4e\x2c\xfa\x09\xdd\x07\x0b\x42\x1f\x4a\xae\xea\x7e\x54\x17\xfc\xeb\xe4\xf8\x7c\x61\x06\xcb\x63\x11\xdd\xf9\x34\xdb\x6f\xc3\xe0\xd7\x64\x16\x77\xba\x8f\x20\xa0\x20\x2d\xb5\xb6\xcc\x2b\x6c\x24\x79\x40\x61\x08\x59\x1e\xb7\xb3\xf2\x4d\xe6\xab\x68\x95\x3a\x5f\x46\x6f\xd1\x9b\x6f\x24\x5e\x35\x6a\x52\x7e\x12\x33\x25\xcd\xa2\xe1\xfb\x09\xcd\xb1\x90\x3d\xe3\xb2\x3d\xdb\x4d\x37\x29\x2b\xcb\xf6\x11\x6b\x67\x34\x12\x2f\x74\x7d\x61\xb5\x00\xa8\x03\x93\x6f\x8b\x29\x20\xee\x68\xd1\x28\x89\x57\xff\xea\xea\x4c\xeb\xca\xe0\x0d\x3f\x24\xe2\x3c\x9c\xe9\xbf\x96\xf6\xb0\xfa\xcb\xe2\xf1\xaf\x7f\xf7\x43\x0f\x35\x5c\x52\x36\xa2\x97\x07\xdf\xd3\x4b\xce\x77\xed\x15\x60\x72\x38\xd0\x13\xce\x87\x68\xcf\xd3\x94\xb9\x06\xcc\x37\x28\x35\x9c\xc9\xe6\x12\xa3\xf8\x98\xe8\x56\x95\x1c\x57\x4a\x36\xc7\xb2\xb9\x34\x9b\x95\xa7\x79\xbc\x4d\xe5\xf8\x45\x5a\x3f\xae\xce\x9f\x94\x9a\x8b\x16\xe0\xbc\x75\xca\x3c\x79\x95\xae\x15\xf8\x4d\x50\x6e\xf3\x76\x0a\x80\x65\xf5\x75\x89\xe8\x33\xe0\x24\x04\x8b\x85\xb7\x51\x70\x8c\x57\x5a\x5f\x1a\x9f\xab\x46\x62\x3a\xf7\x37\x75\xd9\x9e\x4c\x2c\x6b\xb4\xeb\x66\xd0\x26\xa2\x9a\xa1\xd8\x97\x35\x64\xe6\xae\xcb\xc9\x12\x16\xff\xe9\x9d\x20\xd9\x04\xef\x2a\xdc\xc8\xa3\x91\x38\x9a\x88\x6b\xd5\x6b\x14\x83\xfb\xce\xca\xa2\xc0\x64\xab\x10\xd0\x3a\x86\xfc\xb4\x18\x8f\xeb\xe4\x2b\x4a\x06\x6d\xf9\x7c\xd9\x3e\xb5\xb5\xbc\x56\x98\xbe\xf0\x63\xd8\xcc\x47\xba\x30\xc6\x8c\x3d\x13\x2c\xe1\xa0\xe0\xf9\x9c\x71\xcd\x60\xfd\x20\x74\xf9\xec\x87\x24\xc1\x8d\xf5\x6c\x56\xb6\xb8\xed\x45\xab\xb5\xc3\x2a\x2e\x00\x8d\xbb\xa6\x73\x86\x66\xb2\x6c\x45\xdf\x94\xf5\x58\xd9\xca\xaa\x72\xa2\xc6\xcb\x71\xa5\x5c\x4a\x82\xa8\x32\xac\xc0\x72\x8b\x19\x5c\x82\x83\x34\xb4\x35\x0c\xe7\xec\x55\xc4\xfc\xd2\x17\x9d\x19\x3d\x28\x0b\xdf\xa8\x98\x6a\x7d\xe9\x96\x47\xc8\x5a\x2c\xc0\x23\xe3\xa9\x43\x36\xd6\x93\x56\xd5\x42\x46\x1b\x63\xde\xe8\x73\x48\x8a\x0a\x68\xd6\x76\x9c\x90\x9c\xe8\x32\x22\xb0\x92\xd2\xb7\x90\x09\x12\x0e\xde\x9a\x42\xbd\xed\xf6\x43\x3a\x82\xd2\x38\x62\x13\x18\xd3\xc7\xd2\x8c\x25\x04\xf0\x62\x7f\x68\xc7\x97\x56\xc1\x99\x95\x6d\x8b\x7b\x36\x30\x69\x4d\xa5\x21\xc3\x9b\x2a\xd0\xa9\xe4\xa8\x26\x7e\x85\x9f\x6c\x5c\x9c\xa7\x33\x28\x8d\xfd\x83\x24\xd8\xae\x98\x25\xed\x17\x1a\x52\x1d\x3e\x24\xab\xda\x64\x02\xc6\xdb\xb0\x94\x6b\x9b\xca\x94\x86\x9c\x58\x9e\xeb\x66\x9f\x3d\xd9\x43\x73\xd6\x41\x48\x50\x28\xcd\x80\xaa\x60\xa6\xfa\x5a\xc8\x90\xb5\x0a\x0d\x4b\x61\x25\x67\x24\x77\xab\xda\xdc\x41\x40\x70\x09\xc9\x05\x4d\xdb\x28\x74\x91\x4e\x88\x0a\x34\x94\xa8\xaa\x2b\xd5\x4c\x95\x2c\x86\x94\x60\xeb\x5c\x55\xa6\x3b\x86\x5a\x5d\x8b\x53\x05\x49\x56\xef\x60\x76\xdd\x66\x26\x21\xe1\xf5\xcb\x54\xd7\x9f\xd1\xc3\x48\xb9\x0f\xf8\xf5\x03\xd1\x03\x75\x9a\xcb\xed\xba\xcc\x60\x58\xe9\x0b\xdb\x85\xa8\x46\xe8\xd4\x80\x19\xfb\x37\xdf\x3c\xf2\xea\x0a\x1e\x19\x56\x3f\x71\x2f\xc5\xd3\xf8\x08\xc0\xf6\x76\x3a\x5d\x60\x05\xc7\x2c\x26\x99\x2a\x7a\xe2\x2d\xfe\xdc\x81\xce\x06\xef\x76\x48\x39\x72\x1a\xa2\x78\xc0\xdd\x78\x80\xf3\x27\x1e\x50\xa5\x7e\x68\xa0\xe7\x1d\xc3\x71\xb1\x72\xaa\xd2\x93\xa5\x1f\x4f\xb2\x2f\xbd\xe5\xeb\x75\xe7\xca\x86\xf5\xfa\x73\x68\x93\xda\x29\xf9\x77\x6e\x31\xb8\x78\x7e\x59\xb0\xee\x56\x15\x21\x85\xac\x68\x6f\x37\xfd\xc6\x11\x80\x27\x87\x0c\x09\x80\x53\x61\xb3\x64\xf7\xc7\xee\xd9\xd9\x8f\x2b\x1c\x74\x3b\x45\x59\x05\xc7\x10\x4c\xd0\x57\x8d\x95\x6d\xbf\x60\xe0\xc3\xd1\xc4\xae\xe9\x55\xa9\x17\x06\x86\x0a\x59\x96\x67\xa5\x71\x07\x85\xd1\x33\xc6\x73\x1f\xe0\xa9\x01\x7c\xb0\x9d\x36\xfa\x9a\xc2\x30\x80\x8d\x62\x26\x65\xd8\xc7\x53\x39\x9f\xab\xda\x6a\x2f\x68\x3f\x1f\x37\xd2\x4c\x19\xca\x43\x2c\x02\xf3\x2b\xe4\x57\x56\xb2\xa9\x4a\xc0\xe4\xf4\xb9\x1d\xe6\x56\xd3\xd5\x35\xed\x62\xdd\x28\x01\xee\xc7\x66\x48\xf1\x28\x80\xb8\x06\x1d\x36\xa2\x9c\xcd\x54\x51\xca\x56\x55\x4b\xcf\x17\x2e\x1a\xcc\x78\x73\xbe\x98\x4c\xb0\xee\xb5\xd4\x91\x4e\xd6\x4a\xa9\x23\x99\xec\x80\x86\x2e\x14\x1e\xb9\x59\x5e\x41\xcb\x0a\xda\xef\xd1\x41\xc4\x31\x78\x27\xf5\x44\xff\xdf\xec\x16\xa3\x32\x68\x7b\xeb\x56\xdf\xe5\x1a\xe3\x50\xf9\x1d\x88\xd2\x1c\x5b\xf6\xac\x8a\x81\x08\x14\x01\xab\x8d\x92\xd4\x9f\x68\xa3\x08\x1c\x62\x50\xa3\x84\xba\x4c\xd9\xd2\x5f\x35\x46\xdd\xb4\xb2\x02\x04\x8d\x48\xea\x8d\x81\x94\xc2\x3e\xc0\x60\xde\x81\x71\xd3\x75\xc6\x72\x1a\x3c\xe6\xc0\x9e\x38\xb3\x4f\xd1\x54\xf9\xbe\x97\xcf\xb9\xda\xed\x08\x9e\x01\x37\x34\x3c\x04\x36\x85\x7a\x4d\x98\x8d\x11\x18\x93\x5b\xa0\x68\x02\x41\xe8\x89\x66\x8b\x0e\xc4\xa0\xe6\x95\x66\xbf\xc8\x74\xcb\x5b\x9c\xd7\x30\x36\x7b\x1c\x1d\xf0\x7b\x3f\x2d\x5c\x42\x5a\x45\xa1\x96\xad\x72\x76\x10\x2e\x5b\xd1\x82\x47\x04\x70\xe3\xa2\x3b\x04\xd6\x48\x9c\xb8\x7f\x3f\x7f\xf0\x0d\xa7\xd2\x20\x8d\x6e\x05\x64\x41\xe7\x74\x7a\xb4\x0e\xbc\xd0\x07\x27\x76\xb1\x98\x57\xe5\xd8\x76\x1d\xeb\x66\xb1\x92\xab\x81\xf4\x71\x08\x12\x63\xb5\x9e\xc2\x9d\xc4\xe8\xe1\x7c\xa5\x9a\x65\x48\x58\x28\x51\x71\x13\x5c\xc9\xb5\x44\x93\xd9\xca\xf3\xfe\x5c\x2d\x75\x5d\x88\x5a\x8d\x95\x31\xb2\x59\x46\x54\xe2\x32\xa6\x58\xae\x97\x9f\x01\x59\x14\x34\x03\xce\xef\x7c\xe6\x77\x72\xba\xb9\xd3\x0d\x6d\xeb\x76\x47\x5f\xcc\xf2\x1d\x8e\xd6\x42\x25\xc7\xd9\xbf\x12\x35\x7e\xd5\x8c\x3a\x36\x1d\xce\x68\x70\x66\xdf\x3c\x81\xf9\x53\xfb\x5f\x72\x32\x49\xc6\x59\x2b\xd7\xf8\xd9\x45\x97\xcb\x23\x00\x3c\x64\xf5\x2a\x99\x62\x97\xe2\xf2\x8f\xda\xb4\x7e\x4e\x9d\xbb\xe6\xb9\x82\xac\xc4\x73\x3c\xf9\xed\x86\xb5\x67\x48\x55\xd6\x8a\x8e\xfa\xb7\x8a\xa4\x06\x44\x6b\x26\x85\x9f\x2e\x8e\xc0\x37\xc9\x6a\x98\x80\x6e\x88\x82\x87\xd5\xb4\x41\x22\x78\xfd\xf2\xe9\x8d\x57\x4d\xb6\x57\xaf\xb5\xbe\xe1\x96\xc8\x3d\x3f\x53\x9f\xd2\x47\xaf\x74\xd3\xca\x2a\x78\xf8\x1a\xb6\x72\xf6\xda\x8a\x1c\x18\x92\x5b\x15\x9f\x08\x2a\x7f\xeb\x12\xf0\xa5\x88\x33\xbc\x42\x64\x27\x50\xd3\x8e\x03\x1d\x26\x5c\x03\x7f\xae\x47\x3a\x72\x68\x46\xef\xea\xc8\x77\x93\xc3\x3f\xe6\x43\xfd\xce\x07\x83\xa8\x0e\x67\xec\x5d\xad\x7c\x8b\xbc\xc6\x2e\x6e\xa1\x8d\xf2\x4c\x80\x25\xe6\xac\x9c\xa9\xc6\x64\x06\x3e\x1a\x89\xd3\x56\xcf\x0d\xa0\x1a\x7a\xc7\x0a\x4c\x36\x96\x37\xcf\xb5\x53\xb5\x04\xc3\xc6\x39\x42\xb1\xcd\x54\x81\x15\x95\x13\xc0\xc3\xd4\x75\x5b\xd6\x0b\x30\xc3\x48\x51\xc9\x56\xd9\xdd\x3e\x51\x4d\xa3\x0a\x51\x59\x35\x18\x30\x8f\x9d\x15\x68\x51\x97\x80\xe5\x66\xc9\x72\x78\x27\xbe\x20\x08\x6d\x30\xbb\xfe\xce\x3a\xd8\x37\xc1\x05\x01\xf3\x10\xb3\xcf\xc3\x40\x8b\x9d\xbf\x2f\x08\x79\x1d\xf3\x37\x30\xbc\xe2\x62\x86\x77\x08\xdc\x03\xf8\x37\xb9\x41\x72\x53\x8b\xa3\xc7\xb9\x7d\xad\xc6\x8b\xc6\x94\x57\x56\x7c\x5e\xb1\xc7\x5d\x4f\x7d\x7d\x1d\x4a\x5a\x51\x65\xfa\x5d\x84\x9c\xb9\xd1\xe8\x63\xc1\x2d\x1c\xfd\xd6\xea\x41\xe5\x09\xe6\x35\x94\x40\x92\x89\x28\x84\xec\x82\x8d\x62\xfa\x29\xbc\xe8\x53\x49\xd3\xc6\x74\x30\x8c\xf7\x5d\x7e\x67\xad\x9a\x8f\xf0\xa3\x60\x00\xc1\x75\xc9\x58\x37\xc5\x21\xd8\x59\x82\x3d\x9e\x71\x67\x72\x39\xec\x57\xda\x64\x1e\x3c\x70\x97\xba\x49\xfd\xbc\x15\x71\x27\x6e\xd6\x4e\x2a\x4d\x7a\xf2\xdc\xc4\x30\xe5\x59\xa1\x87\x8f\xdb\x88\x71\xa1\x89\xda\x1d\x2f\x6f\xcb\xaa\x82\x03\xb1\xb7\x41\xc1\xd7\x6a\xac\xca\x2b\xf5\xaa\xd1\xf3\x10\xe4\x6e\x03\x5e\x14\x77\x37\x9e\x42\x48\xed\xfd\x5a\xfd\xb8\x50\xa6\x65\x03\x17\x2c\xf4\xe6\xf3\x98\x31\xcf\xdf\xbf\x2f\xee\xe6\x4c\x67\xbe\xdb\x2b\x0c\x6b\x61\xb6\x41\x2f\x83\xf6\xfa\x54\x18\x91\x8f\xcd\xb2\x1e\xc3\x25\xbb\xfd\x68\x38\x1c\x6e\xc5\x2e\x48\xf1\xf0\xf4\x3c\x3b\xba\xa2\x2c\x0e\x3f\xcd\xcb\x46\xfd\x84\x61\xde\x38\x9a\x28\xb9\x61\x70\xcd\xf1\x0d\x64\x8d\x74\x5d\xb0\xfa\x24\x5a\x17\xae\xa5\x11\xe7\x95\x1e\x5f\xa2\x55\x75\x26\x41\xd8\x68\x94\x2c\xac\xa6\x19\x7a\x5f\xb0\x04\x74\xe3\xd4\x0c\xc4\x06\x45\x12\x13\xcd\x4a\x42\x79\xab\x1b\x9a\xbf\x84\xa3\xde\x30\x77\x77\x33\x34\xf2\xf9\x73\x57\x30\xa3\x6a\xd3\xcb\xe5\xe4\x5e\x19\xee\x18\xf0\x48\x1d\xb8\x5c\x28\x90\x1c\x18\xb8\x97\x37\xdc\xdb\x33\x6e\x18\x3a\xe5\x3d\x0f\x0f\x94\x20\x7e\x6f\x0d\x5f\x5e\xd7\x97\xb5\x3c\x3f\xa0\xe6\x78\x26\x31\xde\xfe\x9f\x63\x2a\x5f\xab\x99\x02\x6f\xaa\x6b\x45\x55\x58\x55\xd8\xf9\xb5\x84\x36\x67\x77\xd3\x82\xa3\xee\x3a\x89\x4c\x2a\x39\x53\xe3\xa9\x6c\x5a\x34\xab\x01\xd0\xaa\x42\x48\x58\x34\xbf\xcd\xec\x61\xe5\x2e\x08\x36\x99\xc1\x60\x07\x25\xe2\x5d\xe6\xec\x4c\xf6\xfd\x3f\xc7\x0c\x47\xc4\x5a\xb6\x46\xcc\x65\x43\xb8\xc1\xb7\x27\xd9\x58\x06\xa2\xee\x6e\x28\x77\xdd\x9e\x7c\x83\xc9\xdf\x40\x68\xeb\x2e\xc0\x73\x59\x56\xaa\xf8\xef\x65\xf8\xf9\x96\xa1\x73\x86\xf4\x9e\xd5\x68\x4d\x86\xa3\x03\x0c\xd9\xb5\x28\x21\xf9\x13\x21\xed\xc0\xcb\x73\xbd\xa8\x0b\xd9\x2c\x7b\x37\xad\x66\x72\x10\x64\x8e\x00\x10\x2a\x82\xf5\xec\x58\x66\x6f\xbf\xac\xeb\x26\x67\x9d\x0a\xd9\xdf\xba\x91\x85\x63\xdf\xd6\x36\x90\x51\xff\x82\xe3\x21\xd1\x00\x43\x63\x6c\x42\xed\xc1\xc4\xfc\x52\x93\xf1\x13\x15\xe4\x0c\xfd\xdc\x28\x3d\x3e\x15\x3d\x57\x40\xc8\xce\x3d\x6f\x46\x2c\xd9\x58\x03\x5f\x21\x76\xac\xd4\xba\xd7\xab\xea\x2b\xa4\x95\x17\x1a\x81\x0b\x9a\x7e\xec\xe5\xb0\xd1\x12\xa5\x4e\x0e\x51\x0d\xbb\x5f\x4d\xd2\x37\xde\x4e\x8b\x38\x59\x71\xab\xe7\xa2\x52\x57\xaa\x02\xb1\xcd\x9d\xbc\xcf\xd8\xb1\x34\xd6\xff\x64\xa3\xf8\xca\x87\x9c\x5b\x4b\xf2\x88\x0b\x05\x6a\x94\x37\xcf\x1a\xa5\x04\x87\x56\x94\x10\x8d\xe9\x84\x69\xa7\x63\x22\x66\x7d\x5e\xc5\x2c\x6b\xe1\xbc\xef\x52\x3d\x93\xd5\xcb\x58\x7f\xec\xaf\x39\xad\xfd\x62\x81\x8b\x69\xb3\x98\xb7\xaa\xf8\x61\xf9\x4b\x6d\xa7\xce\x6e\xf0\x94\x86\x41\x18\x41\x1f\x32\x9b\xa9\x53\x66\xd8\xca\x0b\xb8\x92\x62\x73\x5d\xe8\x19\x9d\xb0\x6d\xbb\xa8\xdb\xb8\xa8\xb8\x93\x44\x50\x15\xba\xf3\xf0\x55\x66\xa3\xea\x42\x35\x3d\xe7\x37\x1d\xde\x2e\xf1\x30\x6e\xb4\x02\x27\x13\x9a\x5a\x83\xb3\x7d\x64\xe7\x12\x7b\x2e\x02\xa8\x4d\xe7\x62\x6c\xe3\x3e\xdf\x09\x7a\x0e\x5c\x6c\xdd\x1e\xf8\x83\x78\xd4\x09\x43\xa1\x3e\x9d\xc1\xfd\x0b\x90\x5e\xc7\xe5\xa4\xf7\x55\x9b\x0c\xa0\x56\xba\x24\xbe\xa8\xdb\xb2\xc2\x24\xfa\xea\x53\x48\xcb\x81\x25\x8f\xcf\x1f\xaf\x8b\xad\xd9\x55\x56\x0f\x5b\xfb\xfa\xe6\xa3\x17\xed\x0f\xbf\xf0\x11\x13\x7b\xec\x78\x7d\xfc\x16\x0e\x3b\xb6\x78\xfe\x62\x0a\x4e\x73\x9e\xb6\x90\x1d\x05\x8d\x62\xc4\xa0\x21\x3e\xd4\x65\x14\xbf\xf4\x2c\x6c\xc2\x1a\x6e\x9c\x8c\x55\xf4\xfb\x22\xef\xc8\x95\x3d\x5a\x77\x6f\xb9\x69\x1e\xae\x6a\x74\x3f\x88\x79\x4e\x5b\x01\x28\x4d\x74\x5a\xa0\x3d\x13\x6d\xa3\x5b\xae\xfa\xba\x1e\xa2\x01\xaf\x43\x61\x9b\xd3\x4c\xb2\xd7\x72\x24\x63\x37\x59\xfe\xf9\xa6\xbb\xcb\xb2\x6e\x34\x58\x9a\x5f\x76\xa3\xdd\xe4\x7d\xb6\x66\x87\xc0\x1d\x15\x75\xf2\x86\x6d\xf2\x0f\x1b\x0e\x1e\x42\x0b\xc4\x59\x5b\x39\xb4\xdd\x8d\x87\x9e\x5d\xe7\x70\xe0\x3b\x74\x24\x2d\x10\xfc\x4c\x9c\xe9\x56\x56\x1d\x0a\x88\xa7\x6a\x8d\xb6\xea\x08\xc0\xee\xd0\x7d\xf0\xef\xfc\x27\x5b\x7f\x59\x55\x76\x44\x9e\x83\x1c\xa3\x0b\xc9\x0d\x14\xf0\x8f\x1a\xcf\x2f\x48\x00\xab\x46\xbe\x8e\x04\x56\xcf\x56\x4a\x04\x7c\x91\x6e\x39\x84\x2a\x9e\x9d\xeb\x45\x7b\x8c\x3e\x63\xff\xa1\xda\xfd\x69\x59\x15\x84\x98\x43\xc8\x9b\x18\x55\xf6\x8c\x82\x3d\x39\xf4\x89\xdd\xb3\x67\xaa\xb9\x50\x85\x20\x68\x4c\x81\x78\xb4\x0e\x20\xb8\x95\xe3\x4b\xf2\x05\xc6\x02\xe0\x96\x8f\x71\xc5\x62\x2f\x0e\x33\x56\xb3\x79\xbb\x3c\x81\xef\xb7\x76\xd3\x26\xa5\x38\xd7\xba\x52\xd2\x2a\xfb\x05\xa4\x15\xac\x2f\xc4\xf5\x54\x81\x3a\x80\xfe\x24\xd8\x01\x4a\x27\x55\x5f\x28\x72\x16\x2d\xca\xe2\x15\x6a\x07\x96\x31\xaf\x69\x1f\x18\x33\xb6\x1c\x7b\xa2\x47\x82\x5e\x32\x50\xd4\x0c\xa4\x49\x46\x8c\x17\xe4\x0b\x8e\x24\x6b\xb5\x15\x50\x85\x1c\x8f\xad\xde\x40\x33\x48\x06\x19\xae\x50\x4e\x5a\x34\x4b\x62\x5e\xb7\xaa\x51\xb2\x58\xda\x8a\xe6\x0b\x70\xc0\x73\xa2\x19\x7f\x40\xa9\x99\x9a\x01\x01\x4a\x5f\x3b\x37\x6e\x58\x13\xfb\x41\xe9\xe6\x9d\xfc\x93\x79\x18\x7e\x85\x83\x59\xdf\x8d\x23\xab\xde\xd4\x33\x69\x2e\x15\x53\xc3\xca\x60\xbc\xa9\x34\x27\xd7\xb5\xaf\xb1\xe4\xda\x5f\x51\x07\xd3\x2f\x77\xef\x38\xa1\xc2\x7f\x18\xb8\x2e\x1d\x4d\x02\x13\x15\xb8\x1e\xa5\x43\x16\x65\x6b\x54\x35\x19\x58\x0a\x00\x6f\x7d\x8c\xbf\x68\xdd\xf2\x70\x55\xc9\x74\xf2\x5c\xda\x92\xfa\xba\x16\x63\x4b\xed\x7e\x49\xc3\x25\xb4\xd4\x17\xd7\xe5\x1a\x0f\x10\xad\xee\x19\xa5\xee\xe5\xab\x1b\x0a\x90\xdd\x27\x1a\xe4\x77\xec\x61\x90\xe9\xc9\x11\x54\x1f\xe9\x60\xcb\x75\xa3\xac\x4d\xcb\x0e\x56\xdd\xa1\x47\xae\x51\xc9\x72\x26\xe1\x5c\xdd\x2d\xe7\x83\xdc\x62\xfb\xfc\x78\xaa\xf2\xab\x3c\x10\x8b\x98\x0a\x06\x22\xfa\x19\x86\x64\x62\x90\x67\x27\x0a\x73\x68\x5a\xd9\xaa\x97\x94\x20\x8a\x8b\x0d\x3f\x7c\x00\x57\x67\x00\x59\xae\x65\x75\xac\x66\xba\xfc\x9b\x2a\x1c\xd1\xc5\x7c\x28\xe9\xc5\x26\x35\x1d\xe7\xea\x49\x6a\x49\x62\x09\x8f\xd7\xd0\x7b\x67\x26\xfc\xd0\x09\xe2\x34\x19\x36\x63\x8a\x06\xcc\x8f\x01\x3e\xed\xab\x61\xf8\x8c\x77\xc4\xdd\xf0\x61\x82\x7c\x1f\x6d\x54\x9f\x47\xf4\x19\x78\xcc\x36\x0a\x58\x19\x40\x62\x40\x27\x1d\xdd\x2c\xea\xca\xf2\x1c\xee\x7c\x9e\x4f\x22\x00\x9e\x84\x60\x44\x00\x2f\xd7\x81\xb7\x30\x25\xbe\x2b\x6b\xb1\xa8\x9d\x87\x1e\x58\x66\x80\x95\xad\xbc\xb3\x0d\x1d\x8c\x67\x72\x29\xda\xa6\xbc\xb8\x80\xc4\xf9\x93\xb2\x2e\x5b\x05\x3a\xa6\x81\x38\xc9\x55\x55\x50\x2b\x06\x42\x1a\x5b\x35\xbc\x25\xad\x81\xbd\x82\x8a\xde\xbf\xff\x95\xb4\xb7\xd7\xa1\xbe\x64\x61\x6e\x4f\x88\x6e\xfd\x02\xda\xa0\xc3\x56\xc0\xb6\xef\x73\x76\xda\xb2\x16\x39\x92\xa0\x67\xef\x20\x43\x6d\xa7\x7f\xf0\x78\x37\x46\xc1\x58\x17\x02\x9f\x32\xf6\xae\xad\x04\x7c\xbc\xec\x8a\x40\x2f\xfa\x61\x97\x06\xdc\x19\x8f\x8f\x6d\x25\x0e\x70\x4e\x5b\x11\xc0\xb8\x2e\x52\x6f\x2b\xa4\xed\x7d\xcb\x98\xba\xa4\x8b\x11\x3d\x63\x59\x93\xbb\xf8\x8d\xc4\x1f\xf9\x95\x82\x7f\x32\x71\x5a\x23\x1c\x7a\x02\x32\x6a\x90\x24\x2a\x69\x4c\xe0\xb9\x5c\x1a\x5a\xe2\xb6\x84\xa2\x46\x93\xcf\x9b\x5d\x29\xb7\xf8\x09\xbd\x79\x6f\xb6\xdb\xf0\x56\xea\xb7\x9f\x84\x98\x93\xc7\x0c\x6b\x2a\x99\xef\xa3\xda\x57\xf4\x23\xd7\xf4\x95\x72\x4f\xfe\x10\x70\xa7\xf6\xbe\xae\xcd\x22\xb9\xbd\x62\x8f\x37\xf6\xd5\x83\x5d\x11\xe3\x39\xd8\x0d\xe6\xbd\xff\x22\xee\x26\xee\xe6\x02\x5f\xbb\x62\xc2\x4f\x6b\x30\xd8\x5f\x6b\x5a\x9d\x3b\x3c\xc8\x5c\xb3\xc0\x83\x57\x75\x2c\xde\xf6\x6e\x89\xe6\x7a\xde\x5f\x39\xd7\x0c\xc4\xb2\x4b\x05\xbb\x47\xb2\x2f\x91\x74\x93\x61\xc0\xa8\x33\xc8\xf9\xc3\xce\xfe\x32\x0d\x2f\xcc\x74\x4d\xcb\xc1\x6e\x2f\xca\x02\xe9\x0e\x7b\x73\x37\xd3\xc4\x90\xe4\x77\x67\x49\x7e\x2a\xca\xfa\x4a\x36\xa5\xac\xdb\x1c\xcc\x0e\x6f\xdb\x89\x5e\x60\x3c\x27\x89\x62\x67\xfe\x62\xef\xeb\x81\xed\xb6\xc4\x8e\x00\x76\xf1\x10\x2c\x2b\x08\x9a\x93\x99\x15\x37\xc0\x60\x02\x6d\xd9\x35\x53\xed\xa6\x62\xc5\x9c\x36\xda\xf2\x9f\xf0\x04\x70\xd7\x75\x12\x55\xc1\xd5\xc2\x14\x92\x78\x74\xae\x61\x26\xef\x94\xdc\xf7\xd6\xee\x86\x5d\x62\xa9\x67\x27\x07\x27\xa2\x7f\x7e\x25\x17\x17\xd3\x7a\x4b\xbc\x46\x18\x1a\x8e\x28\x9d\xca\xab\x52\x37\x04\x10\x52\x07\x8b\xb5\xc5\x5e\xc0\x93\x45\xbb\x68\xd8\x07\xf8\x08\xc5\x08\x82\x17\x51\xb5\x90\x45\x81\x0e\xc3\xcf\xf9\x7a\x79\x26\xd9\xe1\xbf\xbf\xa8\xcb\xba\x55\x35\x02\xc4\x6c\xf9\xd6\xca\x5a\x9c\xa2\xd6\x84\x1b\x90\x5c\x89\x1d\x67\xbd\x48\xb4\xd2\xbb\x51\xe8\x70\x0a\x18\xf5\xf5\x2e\xe2\xc1\x2d\xc7\xdd\x1b\x75\xe3\x77\x51\x1b\xef\xd3\x8b\x8f\xdb\x7c\x9b\x78\x81\x75\x81\xa8\xbe\x35\x19\xee\x56\x1a\xce\xb1\x6f\x37\xc1\xa2\xf5\x91\x1a\x35\x28\x9b\x11\xb5\x6d\x71\x08\x26\x80\x43\x92\x9e\xe3\x26\x58\xfc\x59\x2f\xe0\x38\xa5\xa4\xb5\x18\x4f\x9e\xa9\x44\xd7\xe2\x5b\x23\x00\x7c\x70\xa6\xaf\x14\xd6\xd6\xed\x1a\x78\xda\x96\xed\xb0\x37\x10\x89\x3b\x7c\xf4\x33\x01\xc6\x89\x12\xc7\x46\xfb\x22\x16\x97\x62\x81\x9e\x77\x34\x13\xc0\x0a\x91\x23\x45\x59\xe8\x25\x83\xeb\x39\xd7\xd6\x15\x77\xfe\xf9\x0f\x92\xce\xac\x22\x59\xbc\x00\x48\xef\xcc\x6f\xdd\xe9\xc0\x8c\x13\x88\x89\xc4\xaf\xfe\x44\xd2\x62\xd0\x2c\x13\xa5\x63\xcd\x99\x32\x24\x56\xe6\x18\xf3\xb7\xa6\x3b\x8e\x1d\x90\x4a\xef\x7d\x6b\xee\x71\x1e\x70\x02\x1f\xc8\xd6\x6b\x29\x60\x93\xbd\x37\x08\x06\x11\xb2\x69\x1c\xe9\xcd\x02\xec\x8a\x88\x8f\xae\xdc\x9a\x76\x70\x10\xf5\x79\x40\xc4\x2c\x12\x39\xd6\xd9\x25\x2c\x2b\x97\xe3\xb6\x1c\x83\x1b\x1e\x6d\x37\x5d\x2b\x0c\x23\x28\x6b\x8a\xf3\xbf\x56\xe2\x1a\x22\xac\xc0\xe6\xc3\x87\xd8\x51\xdb\x33\x60\xaf\xe0\xea\x8c\x9e\xa9\x73\x5d\xb0\x2a\xb5\xb0\xc4\x73\x5e\xa9\x0f\x78\x95\x48\x38\x8e\x47\x75\xab\x6d\xf7\x64\x59\x83\x2d\x93\xc2\xab\xe8\x48\xe1\xaa\xdc\xc1\xc9\x3e\xee\xce\xb6\xe4\x84\x58\xb7\xd9\xcf\xd8\xc4\xe1\x9c\xd6\x28\x62\x94\x2b\x73\x00\x36\xb6\xc3\x7a\xd1\x82\x6f\x0d\x99\xc1\x9a\xe8\x16\x0f\x2d\x4f\x86\xcc\x59\x04\x93\x64\x4f\x84\x20\x1d\x3c\x9c\x0b\x46\xb5\x43\x77\xbb\xdf\xc8\x06\xc0\xf2\x21\x38\xc4\x4e\x13\x84\x64\x36\x43\xf1\x56\xf5\xaa\x4a\xc8\xca\x68\x66\x30\x60\x5d\x7b\xf6\xea\x68\xb8\x6e\x9b\x6c\xa6\x4e\x10\x63\xf9\x20\x8d\x29\x2f\xea\xfe\xdf\xbf\x24\x87\x6f\x4c\x0a\x19\xa9\xe8\x06\xa3\xd6\x3a\xf9\x31\x29\x9a\xe8\x8f\x41\x1c\xc9\xed\xf4\x5b\x34\x32\xda\xbe\x45\x16\x50\x69\xe0\x82\x6b\x69\xff\x08\xf1\x4c\x54\x0d\x60\x1d\xb8\xf6\x76\xad\x2e\x9a\xb2\x65\x95\x88\x6c\x6e\xae\x65\x08\xdc\xb1\xfb\x1b\x50\x8b\xc4\x52\xb5\x03\x07\xa3\x00\x2d\x82\x17\x8e\x6c\xc5\xa4\x6c\x0c\xa4\x69\x21\xf8\x22\x02\xb6\x13\x65\x6c\x4f\xa3\x90\x0c\xb0\xd7\x51\xc6\x21\xd4\xd8\x82\x9e\xb3\x7a\x3f\x63\xc5\x19\x4c\xcb\xfb\x79\x1e\xbb\x89\x42\x9f\xa9\xe0\xf3\xe7\xc4\xe2\x19\x7b\x85\x66\xec\xb2\x5e\xdb\x44\xb3\x2a\x08\x47\x65\x8b\x03\xe2\xd9\xab\xa7\xaa\x29\xdb\xe0\xf3\x9e\xb1\x52\xe1\x36\xf9\xa5\x6c\x43\xf4\x13\x26\xf2\x77\x51\xce\x65\x2d\x8b\x2b\xd5\xb4\x18\xfb\x02\x5e\xd0\x11\x9e\x84\xc8\x58\x6b\xd7\x99\xf4\xd6\xc8\xb4\xab\x67\x74\x20\x32\xc6\xd9\x0d\xe4\xdd\xf5\xaa\x65\xa6\xd6\x4e\x30\x65\xa8\x0a\x32\x41\xa8\xf5\x3b\xa7\xa3\x74\xdc\x62\xb3\xdc\x75\xe5\x72\x67\xdd\x21\xab\x20\xad\x26\x83\xb1\xb7\xeb\x58\x15\x03\xe4\x63\xe0\x70\xbf\x8c\x36\x62\x19\x47\x32\x36\x20\x2c\x58\x30\xa6\x48\xbb\xbd\xc0\xcc\xec\xb7\x0b\x86\x52\x5d\x96\x73\x72\x0b\x67\x30\x1a\xbb\x73\x81\x90\x2c\x45\x15\x48\x75\x66\xff\xcd\x30\xf2\xb4\x02\x32\x34\x81\x55\xaf\xac\x96\xc0\xe1\x67\xf3\x05\x5a\x53\x88\x6c\x90\x72\xc9\x83\x19\x77\x28\xd0\x91\x23\xcb\x9c\x86\x93\x2e\x5d\x42\xcc\xec\xca\x78\xfb\x2d\xbc\x17\x37\x4f\x82\x3b\xec\x62\x56\x66\x94\xd0\x55\x21\xfa\xba\xc1\xcd\xee\x6d\xeb\xb0\x79\xf1\x26\xe5\xda\x9e\xdc\x6e\x42\x8e\xd0\xce\xe3\x50\xaa\xbd\x67\x6c\xc8\x5a\x1d\x3e\xcc\x95\x6a\x8c\x42\x80\x6d\xf2\x92\x59\xaf\x8c\x67\x36\xd9\x6a\xbd\x3c\x5b\x78\x34\x12\x2f\xf5\xb5\xe7\xf6\x76\x00\x8e\xe3\xd7\x05\xe2\x3f\x10\x90\x55\x6a\xdc\x5d\xcb\x19\x82\xa9\x5c\xd5\xcf\xcd\xd5\xdf\xcc\xf7\x91\xfb\xd6\x57\x4d\xd3\x4f\x6b\x3e\x83\x67\xe7\x14\x9a\xbf\x67\x99\x6c\x62\x69\x5f\xcd\x73\xbb\x65\x6f\xe4\x8c\x41\xa4\x64\xd0\xad\x49\x59\x17\x24\xc3\xa4\xb7\x6e\x71\xb4\xae\x73\x96\x76\x61\x20\xda\xe1\x41\x03\x6d\xaf\x16\x1e\x77\x81\x29\x80\x08\x50\x4e\x44\xd9\x62\x85\x33\x79\xa9\x8c\x30\xaa\x36\x0a\xd6\x09\xd2\xbd\x82\x39\xa7\x44\xa4\x40\x8a\x5f\xe6\x7e\x78\xa3\x5b\xd6\x28\x97\xd7\x24\x1c\x77\x35\xd8\x2f\x66\x68\x94\xfe\x48\xcc\x28\xe8\x3a\xb1\xbc\xfe\x32\xac\x36\x80\x0b\x9d\x24\x11\x9e\xf6\x31\x0c\xec\x6e\xc6\xa7\x91\x23\xe8\xe2\x03\x0a\xf0\x3c\xbb\xd8\x90\xb6\x22\x77\xfc\x6c\xce\xdb\x52\xff\x02\x9a\xa7\x1c\xa2\xa8\x10\x77\xe9\x6d\x6e\xc6\x9f\x83\x05\x2d\x40\x6b\x29\x54\x2b\xc7\xd3\xce\x12\xfc\x02\x53\x2c\x3c\x0e\x2a\xb6\x91\xdc\x4a\x26\x73\x13\x9a\xb6\xed\x90\x5f\x6a\xc0\x64\xdb\x13\x0f\x77\x7d\x56\xa1\x37\xe0\xb1\x28\xf4\x5c\xfe\x68\xcf\xb2\xe5\x5c\x21\xb8\xd4\xe1\xe9\x8b\xb2\x6e\x85\x55\xb3\x2a\x46\xcd\x43\x99\x73\x59\xb7\xf2\x13\x65\x61\x5b\xd6\x63\xb1\x27\x1e\x21\xc0\xd5\x4b\x48\xdd\xb5\x27\x1e\x3f\xfa\xfe\x37\xdf\xff\xf6\xc9\xaf\xbf\xff\x0d\xb4\x73\x2c\x3f\x59\x99\xf8\xc9\xe3\x1d\x71\x2c\xdb\xe9\x70\xae\xaf\xfb\x8f\x07\xe2\xc9\xa3\x2d\xb1\x2d\x1e\x61\x45\x6f\x5e\x1e\x9d\x7d\x38\x3d\xfa\xdf\x87\xb6\x36\xc2\xcb\x3a\x7e\xf6\x1f\x47\xfb\x1f\x5e\xbe\x39\xfe\xe1\xf0\xf5\x87\x93\xe7\xcf\x4f\x0f\xcf\x6c\xe5\x08\x68\xf7\xc8\x85\x19\xab\x4f\xf3\x92\x12\x04\x03\x16\x4b\xa3\xe6\x96\x15\xd5\xad\x11\x8f\x1e\xce\x42\x60\xdc\x99\x39\xd3\x87\xae\xf4\x59\x39\x53\xfd\x99\x71\xfb\xff\x19\xe6\x59\x96\x45\x01\xf3\x31\x99\x18\xd5\x86\xd8\x78\x88\xec\x61\xf7\xd1\xd4\x9f\x75\x33\x79\x51\x8e\x45\x8d\x28\xd2\x13\xcd\x73\x3c\xf4\x6b\xd2\x9f\x19\x31\x0a\xc6\xf7\x59\x3c\xdc\x12\x0f\x72\x83\x4b\x6e\x8e\x15\x5c\x19\xf6\xeb\xc5\x0c\x0e\xf8\x71\x69\x4a\x5d\x47\x26\xfc\xbe\x7d\x29\x46\xfe\x2d\x57\xfe\x68\x4b\x7c\xe7\x9f\x26\xf5\x82\x08\xa2\xfc\x3c\xfc\xb0\x18\x5f\xaa\x96\x1d\xec\xed\xac\x0c\x82\x39\x3d\xaa\x8f\xcd\x40\x9c\x43\x99\xd3\xf2\x6f\xea\xd8\x44\x5d\xe0\x5e\x06\x5f\x8b\x07\xc9\xe7\xe1\xf0\xe3\xaa\xc2\x37\x5b\x01\x99\xfa\xf3\x82\x48\x01\x92\x2b\xa0\xcf\xa0\x41\x7a\xbb\x13\xb8\x48\xfc\x20\x8b\x63\x39\x7f\xa5\xab\xe5\xc4\xea\x50\x81\x1f\xa0\xc7\x87\x42\xd6\x54\x1f\x7e\x6a\x55\x0d\x6a\x1b\x1e\x2c\x62\x4f\xe0\x1f\x43\x7b\x56\xa9\xba\xa5\x02\xba\x36\xfd\xbf\x7f\x61\xf9\xe0\x3b\xa1\x4c\x55\xd6\xed\x76\x81\x29\xb8\x44\xad\xb7\xad\x90\x40\x59\xb4\xec\x9f\xc7\x72\xde\x7f\xf7\x2e\xd3\x02\xba\x08\xbd\x7f\x4f\x75\x31\x8e\x5a\xae\xe8\xfb\x4e\x7b\xe8\x56\x15\x35\xe7\xe1\xaa\x42\xa0\x22\xd8\xca\xfb\x1a\x82\x75\x9c\xb7\xa9\x90\xe7\x7a\xd1\x8a\x73\x59\x88\x39\x4d\x8e\x61\x4f\xcc\xce\x9c\x45\xf1\x85\xe0\x21\xf4\x9c\x9d\x44\x40\xc3\xd2\xb5\x90\xc2\xdf\x10\xc1\xae\xa8\x95\x2a\x0c\x1d\x35\x85\xae\xad\xd4\x06\x0e\x3b\xf6\x6f\xf2\xd1\xb0\xda\xdd\x1d\xb0\x55\x20\x5c\x55\x3b\x05\xd0\x6c\x04\xaf\xf3\xc7\xd1\x1d\xbf\xa0\x10\xbb\x04\xfe\x5c\xc0\x4c\x1e\xc5\xe4\x0b\x9d\xb2\xdc\xad\xdf\xca\x8b\x81\xb8\x54\xcb\x01\x7a\x8e\x03\x32\x3a\x9a\x9f\x18\xf0\x02\xb4\x47\x94\x81\x2d\x2d\x4c\x4b\x83\x47\xab\x68\xe5\xc5\x2e\x3f\xb9\x54\x4b\xb1\x67\xeb\x71\x4f\xc8\xe7\x80\xbd\x74\xe1\x99\x63\xaa\x21\x74\x3e\x64\xb6\x3b\x57\x0d\x15\x0a\x40\x00\x92\xaf\xd1\xf4\x95\x56\x59\x9e\x57\xe8\xb6\x1a\x3d\xe6\xa4\x11\x78\xa2\xc2\xa3\x46\x4d\xc2\x66\xe1\xd9\x9c\xc2\x98\xe0\x2a\x3f\xa9\x82\x75\x8b\xec\x4b\xd4\x81\xff\xe7\x42\x2d\x3a\x83\xe4\xef\xc0\x21\xa0\xd3\x62\x77\x96\xc1\x64\x90\x3e\xe4\x99\x21\x47\x49\xfe\x1a\xdd\xf4\xf0\xa3\x97\x1a\x5f\xba\x86\x6b\xf5\x89\x3c\x4b\x3b\xad\x82\x0d\x24\x79\x47\xaf\x2a\xd9\x79\xe3\x5a\x8b\xb8\x3c\x34\x89\x61\x36\x5c\xc0\x63\xcf\x74\x12\x45\xc0\xfb\x0f\x1e\xce\x26\xa4\x47\xf6\x3b\x0e\xca\x9c\x32\x46\xbe\xf7\xea\x0e\xde\x9e\x10\xca\x77\xf6\xe5\x0d\x01\x7a\x60\xf1\xea\x6e\x55\x0f\x01\xbb\x8a\x73\x25\x08\xb0\x5e\x84\x5a\xc9\xea\x6c\xa7\xd2\x68\xed\x20\x68\x08\x5c\xa5\x5c\xc2\x28\xae\x78\x20\x1a\x49\x3e\x82\xd2\x32\x87\x57\x27\xff\xe3\x24\x2c\x38\x10\xa6\x2d\xab\x0a\xfc\xec\x50\xb4\x21\x33\x19\x1c\xa6\x78\xe5\xa5\xab\x0a\xf0\xe8\x76\xe0\x4c\xdf\x12\x2f\x35\x98\x6d\xc9\x0d\x0c\xcf\xe2\xa5\x37\x17\x10\xd2\x19\x9a\xbf\x4a\x33\x74\xfb\xdb\xbd\x41\x18\x13\x5b\x9b\x10\xc8\x71\x8a\x72\x32\x29\xc7\x8b\x0a\x64\xe2\x79\xa3\x8a\x72\xdc\xa2\xb1\x0c\x70\x4f\x2e\x54\x2b\xf4\xbc\x2d\x67\xa0\x8d\x4b\xd4\x4a\x97\x10\xf9\x24\xab\x99\x36\x2d\xd5\x55\x83\x70\x53\xd6\x15\x98\xe4\xe7\x8d\x9e\xab\xa6\x02\x9b\xbf\xe5\x0d\xe5\x18\x98\x59\x59\xa9\xc6\x80\x8b\xe2\xe3\x74\x2c\x8d\x15\xfe\x74\x2d\x3e\xf2\x60\xf4\x44\x10\x14\x2d\x44\x43\x5b\xa6\xd3\x2a\xd3\x96\xf5\xc5\x50\xbc\xe5\x08\x6a\x6a\x5c\xa2\x6c\x02\xf0\xbc\x68\xe7\x6b\x19\x38\x0c\xe2\xa7\x47\x23\xf1\x64\xcb\x7e\x85\x40\xfa\x0c\x0a\xa6\x5c\x7e\x1c\x94\x58\x10\xe6\xb6\x5e\xcc\x54\x53\x8e\x31\x69\x2b\x60\xd1\xfa\x21\x2b\x69\x4a\x04\xba\xb5\xa4\xaa\xdd\xcc\x20\xf6\x4b\xad\xeb\xed\xff\x71\x74\x26\x54\x7d\x55\x36\xba\x9e\x01\xe7\x1e\x8d\xc4\xf7\xd0\x36\x5c\x73\x49\x53\x56\x4b\x71\xa1\xd1\x5e\x1e\x13\x0e\xf8\x9a\xa2\x57\x08\x9e\x2d\xe4\xe8\x59\x95\xad\x6a\x64\x65\x09\xde\x1e\x2b\xd4\x7a\x69\xc4\x44\x9a\x96\x86\xf7\xab\x2d\x71\xd4\x06\x08\x4a\x4a\x1a\x40\x35\x24\xb1\x14\x1d\x41\xa5\xd8\x17\xd8\x1a\x2c\x24\x60\xd2\xda\x67\x90\x8f\x0a\xd2\x04\x59\xba\xa5\xfa\xed\x7a\xc9\xd6\x9e\xbe\xe4\x45\x1b\x74\x2c\x44\x49\xd9\xe8\x9c\xf9\xe6\x79\xa5\xaf\x9f\x97\x9f\x8e\xd5\x0e\x0a\xc9\x53\x39\x27\x1c\x6b\xf5\x49\x8e\x5b\x01\x67\xe1\xf9\xa2\x15\xb6\xa0\x33\xcf\x5b\x9d\x20\x9c\x22\x13\xc8\xf2\xea\x7a\xd3\xc3\x2e\x49\x41\x82\x93\xe4\x12\xb3\xf5\x03\x0d\x32\x90\xdc\xee\xde\xf5\x2f\x86\xf3\x46\xb7\x1a\x48\xf0\xfe\x7d\x91\x79\x3c\x2c\x0d\x28\x29\xbe\xaa\xdd\x84\x45\x80\x52\xd3\x6a\x9a\x45\x2b\x41\x7b\x16\xeb\x02\xa2\x0b\xcd\xb2\xc4\x30\xcd\x87\x14\x03\xe9\xf7\x9d\xb1\x33\x3c\xe7\x42\xb9\xd4\xf2\x75\x6f\xa8\x8c\x8d\x13\x1e\x67\xc8\xf3\x79\x76\x5a\x4b\x4b\x76\x41\x1f\xc9\xb9\x58\x8a\x02\x72\xbb\x12\x52\xa6\xdd\x38\x73\xad\xd1\x8b\x4f\x8d\xa7\x75\x69\xd5\x25\xbe\xcf\xf1\xd0\xd9\xa0\x2b\xf4\xaa\x8a\x6b\x03\x1b\x02\xb0\x0e\xf0\x20\x96\xad\xb0\x3c\x45\xb4\xd7\x9a\x33\x0c\x18\xab\xc4\x20\xb6\x33\x6c\x7c\xdb\x0a\xd0\xd0\x3d\x08\xc8\xbc\x47\x39\xb1\xb8\x42\xd0\xff\xb8\x9d\x46\x89\x89\xd5\x38\x01\x26\x7d\x61\x94\xbf\x09\xaa\xe4\xdf\xec\x46\x64\x1f\x2c\x67\x19\x97\x55\xa5\xd1\xc5\x9b\x2b\x84\xa4\xd8\xb4\x15\x0d\x23\x33\xd4\x17\x14\x99\x69\x29\x18\x59\x1f\x0a\x0e\xc5\xd0\xee\x43\xb8\x48\xb2\x55\x5d\x8b\x85\xdd\x79\x5c\x57\xa3\xc6\x95\x2c\xf1\x9e\x0c\xeb\xb5\x32\x45\xb3\xb4\x53\x6f\xc7\xcf\x36\xb3\xee\x7a\xf9\xcd\xc7\x6b\x3f\x04\x9a\xe7\x1f\x40\xfb\xfc\x23\xbb\x07\xba\xf5\xb2\x24\xe7\x2a\x24\xb7\xd1\x4e\xb9\x50\xba\xe3\xc2\x81\x85\x3b\x72\x82\x18\x8d\xc4\xc1\xe1\x7f\x6e\xc3\xba\x4e\x4a\x55\x15\x9c\x99\x31\xa9\x33\x90\x20\xb8\xca\x10\x12\x6f\xe5\x17\x4e\x9e\x88\xbf\x8a\xb3\xee\x64\xbf\x64\x59\x23\xfe\x30\xc8\x29\x42\xf1\x68\xc9\xc7\xa1\x28\x14\x25\xea\xe8\xec\xa1\x6c\x16\x98\x14\xa0\xf4\xad\xf7\x08\x67\x6b\xbf\xab\x60\xe8\xcd\xc9\x56\xb9\x06\x2a\x41\x01\xae\x95\x17\x39\xca\x58\x21\x36\x7a\x53\xbb\xab\xa0\x2a\x4d\x4b\x1e\x1a\x15\x26\x13\x80\x7b\x8f\x6c\xa5\x19\x71\x33\x53\x2a\x2f\x79\x76\x8a\x65\xa4\x50\x9a\xe9\x74\x28\xa9\x4c\x1a\x3f\xd8\xed\x7e\x91\xc8\xf8\xe1\xcf\xdd\x4c\x03\xac\x65\xf0\xba\xc1\xef\x4c\xb5\xa9\x7a\xc0\xe5\xa3\xe7\x6b\xbe\x63\xf5\x20\xfd\x0e\x9e\x67\xbe\x8b\x35\x0e\xfe\x2a\x78\xea\x1c\xa8\x00\x6e\x97\xaf\xce\xf5\x95\x6a\x9a\xb2\x28\x54\x1d\x46\x83\xbb\x2b\xc0\xf8\xba\xbc\xdb\xaa\x57\xaf\xdc\x8e\xc6\x27\x99\x1e\xb2\xce\xe5\xf9\x4b\xa1\x3e\x65\xca\xa1\x22\xc6\xa5\x1a\x35\x09\xef\xde\xd2\xad\xf1\xa5\x93\xf3\x8f\xcd\x9e\x61\xb6\x97\x08\x1c\x2f\x60\x82\x5c\x96\xc1\x34\x9c\x51\x24\xc4\x4e\x25\x23\x6b\xb7\x25\xa8\xe3\x79\xa3\x67\x87\x28\xf7\xf4\x29\x65\x78\x4e\x7c\x58\x7d\xaa\xea\x44\x79\xc1\x3d\xce\x4f\xa9\xca\xe1\x07\xcd\x1c\xc6\x5d\xb2\xf3\x80\xbc\xdd\x32\xf0\xe5\xe7\xef\x00\xc9\x92\xf8\x19\x2a\xe1\xfc\x06\x94\xf1\xd8\x63\x0d\xbf\xcd\xaa\x35\xdc\x58\x2a\xf6\xb4\x90\x14\xf8\x69\x34\xab\xb1\x45\x7d\x8d\x58\xb7\x13\x7d\x96\xcf\xce\xb6\x4e\x20\x73\x1d\xe3\x33\xc8\x9f\x3d\xf8\x38\xd9\xdb\x3c\xf4\x39\xef\xbd\x20\x54\xb7\x33\x05\xa6\xb5\xdb\xa1\x33\x01\x29\xf9\xfc\xdf\xef\x28\x0a\x15\x2e\x6b\x49\x2e\x95\x15\x48\x97\x7c\xe1\xd1\x43\x43\x6a\x2f\x90\xc6\xfc\xad\x8c\x34\x80\x4c\xe9\x6e\x36\x08\x96\x12\x2d\xbf\xa4\xb7\x51\x4c\x90\x57\x8d\xf8\x2c\x1a\xc6\x96\x32\x7b\x70\x2c\xed\xe1\x2d\xcc\xd2\xb4\x6a\x06\xee\xea\xae\xa5\xf3\x46\x5f\x12\xcc\x14\x79\x0c\x80\x9a\xa7\x67\xe8\x8d\x64\x86\xe1\xf9\xd3\x28\xf4\x13\xa4\xea\x5a\xdd\x28\xd7\x7a\x92\x0a\x84\xd4\x37\x9f\xaf\x04\xef\x14\x8d\xbb\x85\x0c\x83\xff\x20\x42\x29\xe6\x29\x4f\xc5\x5b\x52\x5b\xe3\xc1\x5f\xa8\x96\x51\x12\x54\x21\xe8\x96\x89\x63\xb4\x82\xa6\x09\xce\x53\xd6\x28\x2c\x62\xf3\xd8\x13\xdd\xd0\x5b\x8e\x73\x1b\x57\xba\x56\xa2\x6c\xc3\xb1\xe2\xcc\xce\x1b\x7d\x2e\xcf\x2b\x08\x00\xaf\x40\x32\xbc\x96\x4b\x94\x40\x71\xe7\x2d\x1a\x74\x7a\x1d\x46\xd4\xf9\x95\x74\xe5\xad\xb7\x51\x62\x3a\x11\x21\x67\x38\x8a\x73\x09\x7b\xc4\xe7\xcf\xe2\x56\xe4\x48\xa6\x11\xab\x13\x23\xe7\x18\x56\xaa\xbe\x68\xa7\xf0\xe5\xc3\xd0\x07\x95\xb3\xdd\xf5\xc0\xb7\x93\x6e\x75\x26\xba\xb9\xd0\xac\x73\x5b\x95\x74\xa9\x17\x81\x7d\xd3\x7b\x8f\xc1\xed\x4e\x4f\x3c\x10\xf7\xc0\x07\xcc\xbb\xf8\x0d\xec\x1a\x2c\xf5\x82\x54\x78\x90\x9d\x66\x00\x0b\xbe\x98\xbb\xf4\xcd\x10\x8d\x28\xed\x2e\xc0\xeb\x74\x33\xbc\x17\x7b\x7a\x76\xd3\x2c\x22\xbb\x7e\xba\x2a\x1b\x5c\x82\xb9\xe3\xd2\xce\xf9\xec\x11\xc9\xa8\xff\x52\xff\xa5\xde\x47\x5c\x62\xa0\x7e\xc8\x4b\x48\x2e\xb0\x7a\x22\x3e\x76\x12\x65\x7e\x1c\xa6\xd0\x1d\xe4\x9d\xd0\xb9\xca\x44\x12\xc0\xb5\x81\xc8\x10\x10\xe1\x76\x84\xbb\x69\x93\x02\x59\x9f\xe8\xdb\xbd\x79\xbe\x28\xab\x76\xbb\x0c\xb0\xee\xcd\x16\x6e\x1b\xb8\xec\x1c\x05\x90\xad\x94\x5f\x31\x01\xce\x37\x5b\xb0\x3f\x2f\x74\xbb\x23\xbe\x35\xc3\x6f\x4d\x6f\xc0\xd4\x82\x74\xf1\x14\x7f\xee\x84\xa4\x34\x80\xa9\xd8\x4a\x62\x80\xba\x09\x32\xc3\x13\xd2\x04\xc2\x7b\x27\xdf\xdf\xea\xa3\x14\x8b\xde\x28\x37\xde\x46\x1e\x60\x3c\x66\x16\x08\xcc\x26\x12\x01\x9c\x1f\xeb\xc5\x15\xae\x77\xfd\x51\xb3\x6e\xe7\x9b\xdd\xcd\x47\x7c\x8b\x01\x9f\xa9\x4f\x2d\x7a\x67\xdc\x56\xfa\x59\x75\xac\x9e\x81\x37\x07\x4a\x65\xb7\x19\x27\x75\xe2\x97\x19\xa6\xed\x18\xdb\x42\x9f\xeb\xe6\x40\x55\xca\x16\xdb\x40\xc8\x0c\xa4\x84\x9c\xa4\x19\xc9\x06\xbd\x83\xc3\x17\x87\x67\x87\x07\xbd\x5b\xf5\x6d\x5f\x56\x55\x7f\x2c\xf3\xf3\x75\xbb\xf9\xb7\x55\x05\x1d\x06\x08\xab\x9b\x09\x8e\xcd\x00\xb6\xf4\x54\xd6\x45\x85\x7b\x2c\xbf\x4a\x12\x99\xe1\xcf\xbf\x44\x08\x92\xde\xc7\xf2\x2f\x21\x77\xd9\x4f\x9d\x8e\x04\x77\x7d\x23\xaa\xfc\x39\x87\x84\x40\xf0\x7d\x70\xec\xfa\x19\x56\xd7\x63\xcb\x0f\x04\xd6\xb9\xc1\xe2\xa6\x4a\x32\x7e\x07\xba\x6f\xa3\x6a\x2b\x07\xbc\x7b\x7f\xab\xd1\x27\x51\x41\x94\xe6\x11\x7d\x95\xc0\xdb\xe7\xa8\x9e\xe8\x1d\xd7\x50\xf8\x14\xd5\x19\xea\xd1\x3e\x75\x81\x52\x41\x5a\x19\xea\x0d\x79\x7e\x04\xa9\xea\x49\xc0\xc4\x23\x31\x32\x53\xbb\x26\x12\xeb\x35\x64\x7f\xdf\x70\x91\xac\x06\xd9\x8f\xbb\x28\xa6\xcb\xa2\x91\xad\xf2\x7e\x4f\xcb\x71\x05\xd7\x17\xa4\x38\x95\xba\x26\x33\xe2\x78\xaa\x64\x8b\x98\x96\xb0\x85\x48\x56\x6e\x40\x40\xb1\x02\xa5\x4f\x68\x32\x1a\x09\x3f\x63\x56\xfc\xae\x97\xec\x72\xbc\xa8\xcb\xba\x6c\x4b\x59\x95\x7f\x53\xc5\xf3\x68\xd9\x13\x85\x98\x15\xc5\x46\xeb\xd6\x4f\x3b\xe7\xd7\xec\xd6\x33\xc8\xad\xcb\xc6\x0b\x42\x7e\xe2\x33\x59\x42\xaa\xb0\x88\x0e\x76\xe8\xc2\x10\x0b\x81\xf1\xbb\x58\x3e\xd7\x0d\x02\x8b\xec\xe0\x2d\xdd\x80\xce\xf3\xba\x34\x53\x84\x26\x0d\x6b\x26\xe7\x9b\xf0\x11\xf7\xa3\xfb\x86\xd6\x64\x87\xff\x18\x90\xaf\xc0\xa7\xd6\x21\x26\x41\xca\x06\xf8\x84\x29\xa0\x3b\x21\x11\xd5\xda\x59\x0c\x08\x05\x7f\x92\x8b\x85\xae\x71\x24\x8e\x48\xa2\x14\x82\xd1\xdb\x37\xf5\x8c\x90\x58\x7c\x81\xa9\x34\x2f\xf4\xc5\x85\x2a\x0e\xc1\xb9\xc9\xdd\x5a\x86\xb8\x07\xed\x78\x0a\x6f\x4d\x7f\x12\x7b\xad\x78\xb1\x4c\x36\x0e\x05\xc6\x3b\x6a\xf8\x72\x35\x14\x20\xd3\x65\x9c\xa4\x2b\x94\xfd\x9b\x05\xdc\x5a\xdc\x8d\x3b\x15\xca\xae\x9d\xee\xae\x8f\x09\x43\x64\x35\x4e\x37\x2a\x54\x3d\xc6\xcb\x5f\xb8\x1e\x44\x7f\x2e\x2b\x2f\xf6\x06\xf6\xef\x4c\xa4\xd5\x97\xd4\x03\xdb\x6a\x16\xec\xa0\x66\xfa\xcc\xcd\x82\xb8\x06\x12\x2f\x3f\x7c\x78\x7d\xf8\x6c\xff\xec\xc3\xc1\xe1\x7f\x9e\x9d\x9c\xbc\x38\xfd\xf0\x1f\x2f\x4e\x7e\x78\xf6\xe2\xc3\x1f\x4f\x4e\xfe\xf4\xe1\x03\xea\x30\xdd\x7c\xcf\xe0\xbd\xea\xba\xbb\x22\xfa\x81\x7c\x65\xb4\xbe\x14\x7b\x37\xb4\xc3\x37\x25\xb6\xf0\xb0\x34\x07\xe8\xf2\x52\x84\xde\x26\x78\xc7\x60\xf5\x4a\x29\x1a\x25\x2b\xba\x0e\x6d\x97\x1c\x97\x60\xbf\x45\xe5\xb7\x6c\x39\xb3\x04\x58\x7c\xe1\x46\x51\xe8\x85\x8b\x61\xd1\x13\x3f\xd3\x18\x38\xe1\x15\x7a\x69\x8c\x1e\x63\x60\x38\xad\x91\x81\xe7\x95\xbe\xf0\x3a\xf8\xb4\x6d\xe7\x66\x67\x34\xba\x28\xdb\xe9\xe2\x7c\x38\xd6\xb3\xd1\x44\x8e\xd5\xb9\xd6\x97\x23\x70\x0d\x1c\x81\x23\x9d\x19\x3d\xf9\xed\x6f\x7e\x13\xce\x8e\x77\x78\xe1\xab\x76\x3b\x60\x06\x2a\x7a\x5e\x06\x19\x29\x12\x28\x34\x47\x29\x67\x1c\xd6\x01\xb9\xdf\xe9\x3e\xc7\x0e\x29\x21\x21\xb8\x9d\xd4\xe0\x38\x0d\x41\x46\x65\x55\x81\xc7\x28\x5c\x86\x41\xa4\x9f\x73\x28\x63\xf5\x3f\xad\xcc\xb9\x07\x12\xd4\x5a\xdc\xc2\x10\x6b\xe1\xb9\x98\x9c\x0f\x67\x0a\x47\xbf\x5d\xa8\xab\xd6\x16\xe9\x45\xb0\xa8\xa3\x51\x40\xe0\x94\x3c\x1b\xb0\xb5\xdb\xa9\x5e\x5c\x40\x10\x06\xdf\x51\xb2\xef\x1f\x72\x98\x55\x33\x18\x7b\x5a\x91\x31\xa2\x81\xeb\x0f\x24\x24\xd8\x05\x01\xf1\xef\x06\x17\x06\xa0\xec\x9a\x05\x40\xf8\x4c\x16\x15\x5c\xab\xff\x15\x54\xbe\x81\x30\x1a\x8e\x1a\xbc\xf0\x36\x72\x82\xfe\xf6\xca\x9e\x9c\x50\x33\x51\x42\x8e\xa3\x45\x4c\xc8\x71\x9d\x26\x02\xd3\xa4\xa1\x40\x1f\x3b\x75\xf4\xfd\x38\x06\xc0\x40\x79\x0e\xe9\xdf\x15\x8c\x32\xdf\x6e\x94\xe3\x64\x4d\xc3\x54\x4f\xd4\xb6\x8f\x97\xe6\xc6\x73\x0c\x11\x60\x1d\xec\x43\x59\x55\x94\x17\x30\x88\x38\x83\x5b\xda\x9a\x67\x10\xe0\x9d\xd9\xb0\xee\xce\x11\xd8\x7b\xc3\xb5\x34\xbf\x21\x77\x1c\x46\xec\x91\xb3\xcd\x77\xc9\x6e\x5d\xec\x0a\x4f\x0b\x2e\x85\x5b\xb6\x80\x63\x66\x56\x3d\x6b\x23\xce\xac\x2c\xaf\xe6\x97\x6c\x93\xbc\x08\x09\x80\x41\xae\x59\xb7\xee\x37\xb7\x1c\xd7\xba\x9b\xa2\x86\x15\x65\xf1\x56\x36\x35\x63\x23\x9a\xb2\xa0\x3c\x24\x91\x67\x3b\xac\x32\x66\x5c\x40\x07\x03\xcb\x49\x38\xc8\xa7\x20\xb0\xd1\xb2\xbe\x82\x6b\x5e\x5d\xdf\x81\x2f\x4e\xcb\xfa\xa2\x5a\x8a\xaa\xac\x2f\x55\xb1\x0d\x97\x65\x7a\xe2\xe2\xa1\xd0\xae\xe8\x12\x00\xc3\x4e\x63\xb9\x63\xc0\xbe\x26\x10\x7f\xde\xea\x3b\x64\xa7\xfc\x11\xee\x73\x28\x76\x31\x4e\x28\x4d\xc6\xd8\x6e\x4e\x7d\x14\xad\xc1\x6c\xda\x5e\x6b\xac\xc2\xd8\x0a\xed\x30\x8c\x9a\x4b\x2b\xfb\x70\xc4\xf5\x52\x98\x29\x78\xe1\x84\xe2\xb2\xb3\x30\x0e\xef\x8c\x46\x41\xce\xdc\x34\x78\x92\xed\xb6\xb6\x02\x0c\x78\x2c\xbc\x0d\x2e\xdf\x2f\xc8\x68\xec\xda\x46\xc1\x90\xcf\xb3\x68\x7c\x76\x00\xb2\x25\x67\x26\xba\x26\x2f\x27\x64\xad\x0d\xeb\xb5\x15\xda\x99\x3b\xd7\x0d\xb0\x32\x5b\x13\xfd\x48\x3a\x38\xd6\x57\xb0\x83\xce\x97\x60\x78\x85\xfc\x1a\xb6\xb7\x7c\xd5\x44\x83\x3d\xcb\x75\x1e\x17\xc2\xb6\x43\x0e\xcc\xc2\x2c\xce\x2d\x83\x4c\xd6\x06\xca\x71\x4d\xce\x90\x0c\x0e\xeb\x90\xa6\x14\x70\x0e\xb9\x9b\x9d\x56\xce\xd5\x58\xcf\x94\x09\x6b\x1c\xde\xe9\x28\x1d\x6f\xfc\xa5\x5e\xff\x5c\x1a\x05\x57\x82\x5e\xe9\xfb\x91\xee\x00\x71\x6b\xb8\x02\x3b\xfe\x4f\x14\x7c\xd5\x1a\x61\x1c\xae\x65\x43\xd9\xb9\x92\xf1\x6f\x4e\x47\xf2\xa2\x8c\x9f\x4f\xa5\x79\xae\x9b\x31\xf5\x31\x92\xe1\x4b\x73\xe4\x25\x69\x7a\xc3\x52\x36\xf6\x15\x27\xaf\x34\xaf\x30\x1a\x2b\xf1\xd5\x0b\x5c\xf0\x7f\xc4\x0b\xcd\x58\x00\x34\xaa\x69\x79\x57\xb7\x1a\xa7\x07\x0a\x32\xa1\x7a\x27\xf4\xb9\x55\x12\x60\x96\x3d\x5e\x32\xdc\x93\xd7\x05\x2f\xa8\xdd\xbd\x0c\xe8\x80\xfd\x02\x88\xec\x8c\x2b\xcb\xff\x64\xd2\x80\x50\x9a\x60\x20\x30\x89\x62\x4f\x84\x9f\x53\x83\x1d\xdb\xbb\x2f\x03\x17\xe7\x51\x41\xb1\xb2\x86\xa8\x7f\xa9\xd6\xbd\xc7\x0e\x99\x56\x3d\xcf\x16\xf9\x03\xd5\x35\xcc\xd9\x0f\x44\xfe\x9b\xbd\xfc\x37\x5d\x26\x9f\x2e\x48\x90\xfa\xa1\xb3\x20\x18\x38\x8d\x9e\x0c\xad\xb0\x22\x58\x0b\xee\xcb\x20\x9f\x06\xce\x3c\x45\x69\xda\xb2\x1e\xb3\x42\x4f\xbc\x8d\x75\x60\xe7\x01\x11\x65\x05\x88\xbd\x93\xdc\x06\x79\xe4\xde\x47\x77\xe4\xc1\x84\x3e\xca\x26\xab\x85\x9b\xad\xb7\xc9\x65\x13\xa6\x77\x83\x0d\x86\x1a\xba\xbb\x5f\xc7\x83\xe2\x5a\x21\x32\xa8\xcb\xd6\xc6\x21\x7b\x85\xb2\x94\x08\xae\x96\xe1\x95\x15\xe5\xb8\x40\xb4\x44\xe2\x03\xc2\xef\x1e\x87\x6f\xe2\x29\xce\x72\x55\xd7\x3a\x70\x97\x9a\x75\x01\x88\xa0\x88\xbc\x0a\xc0\xb9\x11\x25\x1f\x70\x84\x7c\x09\x71\x55\x73\xf0\xb1\x46\x71\x5f\xce\xe7\x4b\x8e\xbf\xb0\x4c\x6f\x3e\x6f\xb4\x1c\x4f\x87\x9e\x2e\xb2\xf3\xe7\x6c\x0e\x21\x8b\x0a\x50\x1f\xc2\x05\x78\x1c\x5d\x5d\xdb\x59\x4f\xd6\x2f\xc5\x6f\x77\x5f\xc5\xe5\xd2\xf5\x0b\x56\xf0\x71\x67\x05\x37\xaa\x65\xfd\x28\x48\xce\xea\x6c\xde\xc7\x91\x67\x4a\xf0\x90\xfe\xb0\xc3\xa1\x99\x7b\xca\xcf\x76\x22\x37\x77\x2b\x96\xc0\x19\x97\x15\x11\x08\x95\x04\x33\x85\xb8\x22\xde\x51\x78\xe8\xd8\xa8\x1d\x3f\x91\x70\xcc\x4c\x99\x0f\x3c\x8e\x2e\xe5\xf0\x51\x54\x12\xc2\xe4\xee\xae\x94\x94\x3a\xb0\xd5\x4e\x6e\xf5\x08\xf4\x7d\xc6\xbc\x1b\x70\x44\x3d\xfd\xd2\x10\xc2\x33\x76\x55\x5d\xcb\x70\x90\xa0\x61\x65\x47\xea\x07\x2a\xde\xc4\x0f\xc2\x9c\x9f\xf3\x45\x63\xfb\xe1\xb4\xbd\xbf\xa9\x46\x0b\x5b\xd1\x36\xba\x30\x99\xa1\x0f\xe0\x40\x47\x5d\x77\x51\x75\x50\x12\x60\x36\x5e\x6f\x21\x36\x0c\x67\xdd\xea\x39\x13\xc4\x3a\xf9\x31\xcd\xdb\x16\x42\x13\x34\xaa\x47\xc1\x8e\x96\xb3\xd1\xc1\x24\x8b\xee\x31\x24\x49\x8a\x00\xee\xa7\x3e\x95\xf1\x31\xd4\xa5\xe9\x35\x27\xdf\x23\xc7\x69\x77\x03\x95\x72\x37\xee\x1b\x81\xe6\xfc\x18\x1d\x63\x83\xf0\x9a\x1a\x7a\xa9\xc5\xb9\x6e\xa7\x01\xcb\xf5\x8c\x32\x3e\x1a\x3d\x99\xe5\x8f\xcc\x5b\xf4\x77\x4d\xd1\xc7\x9b\x0c\x0d\x7a\x6c\x4f\x72\x2f\xc3\xd3\xe8\x5c\xce\x0b\xbf\xd3\x5c\x6a\x4d\xb8\xf6\x74\x5f\xde\x89\x30\x45\xf4\xc4\x49\xc7\xb2\x02\xd9\x19\x38\xe8\xa9\x1e\xf8\x84\x5c\xb8\xca\x92\x84\x0c\x0d\xeb\xad\x27\x77\x9c\xf3\x01\x54\x3b\xbc\x73\x8b\x99\x18\x8d\xc4\x0f\xe8\xe3\x00\xce\xfe\x6e\x61\x98\x6c\xa6\x4a\x7c\xb4\xa3\xf9\xe8\x40\x4c\xf4\x84\xd7\xc0\xb1\xa2\x54\x7e\x48\xb0\x43\xb1\x1b\x49\xe4\x5e\x2e\x0d\xa7\x0b\x30\x5d\x09\x67\xb7\x22\x00\x95\x84\x37\x8e\x12\xf1\x16\xb3\x98\xf7\xae\x3c\x95\xa3\x62\x9d\x84\x97\x99\xba\xe9\x61\xf0\x5d\x47\x6a\x49\x26\x01\x78\xd4\xf3\x46\xcf\x28\x35\x25\x7e\x3a\x70\xb1\x11\x88\x02\x40\x9c\x0c\xbc\x28\xbc\xdc\x3d\x97\x8d\x3d\x9f\xd9\x71\x8f\xc4\xa4\xf0\xe9\x6e\xac\xe0\xc6\x1f\x64\x15\x5b\x3f\x3b\xcf\x6b\x8c\x47\x8d\x2a\x4b\x86\xf8\xbc\x1e\x5a\x86\xd5\x5f\xd3\xdb\x8e\xe0\xe9\xf1\xaa\xa2\x9a\xbf\xe4\x00\xe0\xc2\xf3\x70\x05\x50\xc6\x80\x39\x5b\xd8\x07\xf0\x2a\x47\x79\xe3\x30\x23\x69\x06\x49\x92\x72\xf9\x91\x86\xe9\xba\x43\x0b\xb1\x2f\xb9\x73\xa8\x21\xc7\xf8\x15\x0a\xdc\x20\xd4\xfd\x32\x6a\x1b\x4f\x39\x3d\x66\x8a\xfc\xd1\xcb\x16\xac\x5c\xad\xf5\xbe\xe4\xd3\x31\xd0\xbd\xc2\x1a\x87\x89\x22\xd6\x55\xc5\xa2\xd2\x89\x9b\x00\x7d\x42\x1a\x5a\x54\xd2\x41\xd9\x78\x8d\x2d\x7a\x6f\x1f\xf1\xeb\x44\x1b\x8b\xca\x45\xef\xf8\x03\xe7\x3a\x8a\xfe\xd8\xc4\x50\x23\x3f\x60\xc7\x25\x41\xb9\xc7\x8c\xb6\xe4\xa5\xec\x34\xdf\xa1\xaf\xce\xf9\x27\xcf\xf8\xe1\x2a\xad\x72\x85\x5e\x89\x27\x6d\xe2\x24\x32\x1a\x89\x53\x45\xd1\x2a\x93\x4a\x5e\x04\xf8\x37\xd7\x24\x60\xb1\x68\x02\x2a\x39\x9a\x95\x5d\x06\x36\x3e\x8b\xb9\x2e\x6f\xb4\xb2\x82\x19\x66\x6f\x0a\xe1\x7c\x57\x68\xad\xde\x6a\x7b\x27\xf1\xc5\x76\x97\x61\x69\x4c\xf5\x90\x52\xde\x99\xcb\x72\x0e\x7e\xb9\x10\x95\x45\x26\x8c\x81\x0b\x78\x18\x8d\x44\x59\x5b\x3a\x67\x6c\x76\x39\x1e\xeb\xa6\x00\xd3\x93\x63\xf6\x6b\x63\xf3\x7e\x3e\x35\xe6\x67\x55\x62\x7e\x36\x15\xe6\x06\x05\x06\x12\xcc\x13\x93\x8e\x15\x90\x1f\xbb\xd4\xcf\x6c\x86\x3f\xf8\x31\xde\xc0\x1d\x76\xba\xa2\x5c\x97\x63\x74\xfc\xb9\x3d\x21\x05\xcd\x47\x94\x44\xf6\x4b\x5d\xb7\xc7\x0b\xfb\xd5\x2b\x66\xee\x41\x29\x7f\x60\xb8\x4e\x00\x57\xd8\xf5\xd6\x4f\x40\xdb\x09\xec\x2a\x84\x1d\x41\x5f\xa5\x5a\x97\xaf\xf0\x70\x63\x43\x40\x78\x5c\x1f\xa6\x26\x87\xd5\xe7\x40\x78\xf1\x45\xbd\x71\x28\x5e\x74\x79\x31\x99\x94\xe3\xd2\x32\xec\x79\x53\x6a\x40\xff\x42\xf0\x20\x76\xa1\xe4\x8b\x91\xec\x7d\xb3\x9b\x91\x5c\x8f\xb1\xcf\x2b\xbf\x8c\x8c\x29\xab\x4a\xfd\x21\x3b\x53\xe1\x25\xe9\x68\xc4\xca\xcb\x7a\x56\xe0\x3e\x58\x6b\x83\x39\xcc\x8e\xe3\x4b\x30\x9e\xbb\xb4\xde\x61\x1f\x3c\x09\xc4\x37\xb4\x5d\x92\x35\x9e\x36\x7d\xb5\x04\x3f\x0d\xb9\xea\x69\x6b\xc2\x16\x27\x6a\xa0\x52\x8e\x06\xe9\x71\xed\xc0\x41\x84\x4b\x75\x1f\xc5\xcb\xe4\x16\x7e\xe5\xa2\xbb\x4f\x8e\x26\xf6\x0c\x72\xa9\x08\xd8\xde\x0b\x47\x8f\xe5\xa3\x73\x55\x0c\x44\xd1\x68\x82\x97\x62\x4d\x92\x6d\xd4\x78\x9a\x9f\x3b\x13\x8a\x2c\xae\x64\x3d\x66\xe1\x60\xaa\x64\xc7\x1c\xb8\x6a\x5a\x63\x8b\x5f\x66\xd0\x9e\xbf\x50\xa1\x8e\x65\x22\x31\xf3\x85\x0e\xa3\x5f\x92\x99\xa2\xa3\x26\x3d\xae\x2c\xed\x7f\x48\xc4\xd0\x10\xd5\xc4\xef\x4a\x08\x35\x04\xad\xdc\xb7\xcf\xac\x6b\x23\x31\xd8\xa4\x42\x25\x50\xd6\x5a\xd6\xd4\x49\x84\x97\x76\xf5\xeb\x1b\xb6\x03\x8b\x6a\x8b\x9c\x6a\x27\xa2\x9f\xe9\x59\x58\xa4\x13\x5d\x7a\x54\x5c\x8a\xa9\xbe\x06\x02\x87\x98\xe1\x29\xfa\x64\x43\x38\xf2\x30\xf8\x8e\x27\x2d\x84\x65\xa4\x2e\xc6\x1d\xf2\xfb\xac\x93\x0e\xb0\x5b\xcb\x4d\x35\xf8\xbd\x9c\x9d\xf1\x28\x8b\x79\xe4\x0e\x1c\x12\x00\xc8\x53\x45\x4a\xc2\xb1\xa0\xb5\x22\x75\x3e\xd5\xc1\xe2\x5a\x26\xd5\x62\x60\x65\xd7\x82\x6f\xc2\xb8\xbc\x09\x99\xf5\x87\x50\xe8\x73\x2c\x3a\x7c\x18\xad\x72\x5c\x3a\xb3\x89\x6e\xae\x4f\xec\x91\xb7\x5a\x38\x97\xd1\x67\x43\x80\xec\x8a\xec\x0b\x58\x6e\x15\x5b\xfb\x72\x27\x12\x21\xa2\xd6\xd2\xc9\x59\x19\x7c\xf7\x79\xcf\xdd\x39\x26\x31\x1f\x39\xc6\x01\x26\xba\xdc\x9a\x45\x3e\x24\x2a\xb1\xeb\x0c\x39\x86\x1c\x80\xc4\xdc\xb9\xb9\x56\x9d\x89\xe2\xed\x72\xec\x2f\x77\xa2\xac\x39\x4d\x62\x61\xfd\xa5\xd3\x21\xe6\x4e\x80\x5e\x23\x58\xc7\x60\xa3\xa4\xbd\x52\xd5\x09\x02\xcf\xac\x6c\xdd\x1d\x2e\xdf\x04\x8d\x53\xa4\xf2\x8d\xa8\x0f\x34\xd4\x75\x84\x17\x5a\x9f\x02\x15\x04\xcf\x0d\xbb\x05\x60\xc5\x00\x4e\xfc\x52\x21\x86\x19\xe8\x48\x85\x83\xd9\x25\x3d\x24\x84\x6f\xc1\xa4\x0c\x59\xfa\xe5\x25\x71\x20\xca\x25\x02\x4e\x95\xe2\xf7\xd1\x88\x28\xbe\x62\x57\x94\x0f\x1e\x74\x25\x3a\xf2\xc4\xe5\xc2\xef\x4a\xda\x15\xd1\xb6\xf4\xc4\x3e\x0e\x88\xb3\x73\x60\x63\x40\xc5\xb9\x43\xf6\x55\x85\x90\x17\xb2\xac\x87\x62\xbf\x52\x92\x52\x5c\x71\x95\x46\x13\x38\x6f\x5d\xb9\xb3\x97\x26\x80\x87\x2d\xd2\x56\xa3\x23\xf1\xae\xf3\xe6\xf2\xaf\x13\x03\x4a\x0e\x55\xec\x08\x83\x1d\x84\x6c\x2e\x16\x10\x05\x31\x97\xd8\x53\xe3\xfa\x36\x14\x87\x3e\x10\xc2\x9b\x9c\x8f\x28\xa7\x51\x83\xc9\x5d\x0a\xf2\x4d\x73\xcd\xa7\x00\x62\xee\x05\x5a\x64\xe2\xbc\x18\xe4\x1f\x38\x91\x97\x8a\x3d\xd6\x8e\x3c\x08\xe8\xdf\xbf\xa0\xff\x5f\x69\x9e\x35\x8d\x5c\x8a\x3d\x01\xff\x0e\xe9\xf7\x6e\xc7\x95\x01\x90\xda\x61\x97\x3d\x83\xe3\xc3\x8e\x0c\xdd\x28\xc9\x32\x87\x75\x06\x59\xd3\x4e\x6a\x9a\x89\x7d\x3f\xb9\xde\x87\x86\xbb\x8e\xae\xdf\x71\x94\x0a\x1b\xfc\xa3\x69\x67\xab\x2f\xad\xc9\x8a\x25\x01\x44\xee\xfe\x70\x38\xdc\xda\xf1\x73\xec\xec\xb0\x7a\x8e\xb8\xfa\xe2\x23\x7f\xfe\xd1\x2f\x13\x47\xa3\xe1\xed\xc0\xda\x45\x01\xd0\x76\xd7\xed\x81\xeb\x0c\x4e\xbd\x0f\x82\xc5\x00\x7e\xa3\xc5\x45\xa3\x8d\x21\x2f\xba\x9e\xf1\xf7\x8f\xb5\xae\xb7\xc7\x4d\xd9\x96\x63\x59\x81\x29\x9e\x3c\xec\xd8\xd1\xa1\x24\x8b\x2e\xf8\xde\x2d\x8c\xc2\x98\xad\x4a\xcd\x8c\xc7\x07\x98\x29\xc2\x08\xb9\x28\xaf\x6c\xff\xeb\x72\xac\x1a\x02\xab\x9b\x29\x63\xe4\x05\x58\x9b\xd9\x44\x20\xc7\xed\xc1\xc9\xf1\xa3\x5f\x0d\x37\x81\xd2\x6e\xb8\xf8\xaf\xbd\x6b\x3a\x56\x64\xa7\x78\x8b\x54\x71\x30\x58\x5c\x97\x60\x2b\x68\xf4\xb5\x11\x52\xdc\xfb\x90\x41\x3b\x65\x34\x74\x4f\xf3\xf7\xee\x10\x70\xc1\x58\xcd\xf9\x7e\x89\xe2\xb7\xd0\x39\xf2\x15\xb9\x23\xf6\x73\x74\x3c\x10\xbd\x5c\x33\xbd\x01\xd1\x91\x02\x7c\x14\x3b\xc6\xc8\x47\x00\x70\x5a\x77\x02\x5a\x0c\xdc\x50\x3b\xbb\x79\xed\x38\xae\x64\x59\x01\xac\x17\x43\xff\x89\x47\xbf\x7e\x40\x2b\x43\xe1\x64\x76\x75\x0c\x44\x83\x61\x1c\xd8\xa2\x6a\xcb\x79\xa5\xc4\x58\xcf\x4b\x65\xbc\x87\x21\xdc\x42\x37\x4a\xc8\xb6\xb5\x67\x28\xa5\x98\xaa\x95\xb1\xd3\x45\x75\xff\x8a\x7c\x3c\xe8\xd2\xca\x35\x89\x8f\xf1\xa6\x69\x83\x55\x1d\xd0\xb2\x95\xa6\xfe\x8b\xf7\x0a\x54\xc5\x50\x9c\x35\xcb\xf8\xfc\x70\xfd\x76\x77\x4a\x63\x3d\x5f\xfa\x5e\xf7\x6d\xb7\xcb\x42\xc9\xaa\x5a\x0e\x84\xb9\x2e\x21\x8f\x85\x76\x64\x36\x44\x5b\x29\x86\x02\x6c\x0d\x43\xcf\x45\x74\x7e\xa3\xc5\x9e\x34\x4a\xfd\x4d\x65\x17\xd9\xa3\xc9\x41\xa5\x70\x91\x9a\x5c\x0a\x84\x7c\x85\x6f\xf9\xc0\xcd\xa4\x0b\x91\xf7\x5c\x37\x94\x73\x9e\x6c\x23\x04\x47\x42\xbf\x02\xa1\xdd\xaa\xa0\x49\x8e\x23\x94\xa0\xe9\x4e\x34\xb2\x83\x34\xce\x20\x5b\x1a\xc2\x02\xdd\xf1\x7f\x92\x2b\x4c\x0d\xa7\xec\x29\x29\x20\x21\x01\x06\x76\xec\x40\x18\x0f\xf8\x4a\x94\xb8\x83\x03\x2e\x2e\x54\xeb\x33\x29\xed\x26\xd6\xcd\xe0\xd8\x4d\xe2\x29\x9f\x22\x2b\xdd\x11\xf1\x51\x2b\x92\xe4\x1c\x1d\xf6\x1d\xb0\xec\x1e\x1b\x27\x7b\x5b\xb9\xa0\xc5\x8e\x25\x61\xe5\x32\xf4\x43\x77\xc8\x44\x6a\xf0\xdd\x49\x2d\xd7\x79\x63\xb5\x88\x26\x6f\x27\x9e\x4a\x57\x86\x07\xe1\x87\xef\xdf\x39\x7d\x35\x62\x17\xf8\x06\x15\x99\xce\x0b\x2b\x9b\xef\xbb\x2a\x43\x63\x32\xbe\x73\x7e\xfe\x82\xad\xc8\x22\x73\xe5\x98\x73\x5b\xe1\xb2\x21\x41\x73\x91\xc4\x95\x86\x36\x55\x44\x66\xaf\x83\xfb\xf0\x3c\xa9\x99\x7f\x72\x1a\x0b\x6f\xf4\xff\x99\xe9\xcc\x7c\x15\x81\x59\x25\xe6\xff\x65\xfa\x8a\x2f\x4a\x32\xe4\xf5\x4f\x4b\x57\x81\x63\xc8\x3f\x33\x59\xc5\x6b\xfd\x53\xd9\x56\x4c\x6e\xff\x4c\x54\xe5\x24\x66\xaf\x55\x4f\xd5\xf8\xf2\x94\x30\x40\xe8\xec\x25\x53\x5d\x7a\x0f\xac\xab\x82\x0e\xf0\x5a\x5d\xd3\x5f\xba\x2a\xe8\xf8\xac\xd5\xb5\xff\x2b\x49\xf7\x03\xe1\xf1\x15\x23\xe7\x04\xfa\xc5\x1a\x2b\x45\x78\x6f\xbc\xba\xd8\x0a\x4b\x49\x98\x40\x24\x01\xcd\xf2\x28\x4b\x46\xc8\x9a\x8d\xf7\x68\xb3\x19\x84\x4e\xf5\x54\x51\x12\xb4\xe1\x8c\xb6\xb7\x48\xf4\xb0\x49\x4e\xd6\x7c\xa2\x31\x93\x5b\x98\x95\x38\x95\x69\xa2\xa8\x74\x01\x7b\xd9\xea\x7a\xd1\x96\xc2\x22\xce\x56\xb8\xbe\x27\x7d\x4f\x08\xd9\xe5\x77\x04\xda\xc9\x33\x95\xe5\x24\x56\x0d\x8d\xda\xbf\x1b\xf2\x23\xcc\xff\x94\xef\xc7\xd6\x8e\xc0\xa0\x5e\xf0\xe4\xf7\xe8\x10\xa8\x4d\x02\x50\x1c\x68\x9a\x9c\xb1\x1b\xb4\x92\xa1\x38\xf6\xb6\x1b\x1d\x2e\x34\xb8\xb4\xd9\xdd\x9d\x4d\x17\xb5\x2e\x39\x69\xc0\xe3\x62\xfa\x09\xc7\x15\xd1\x11\x2f\x7b\x0c\x26\x18\x3f\x19\x96\xe6\xd5\xa2\x51\x09\x96\x60\x1a\x13\x73\xd7\x4c\x01\x5b\xee\xf0\xc7\x85\xac\xfa\xdd\xdd\x0a\x3d\xed\x14\x4a\xb6\xef\x56\xd4\xb9\x4e\xc4\x52\x87\x75\x80\xd8\xce\xea\x43\x36\x03\xd1\x2f\xb0\x55\xc2\x43\x6e\xc3\x14\xb2\x21\x8d\xa3\xb6\xf6\x0a\xe1\xce\x43\x22\xc7\x17\x71\xde\xbd\xa8\x70\x7a\x0b\x91\x5f\x38\xc6\xe7\xf1\xeb\x47\x78\x1f\xab\x36\xae\xc8\xa6\xd8\x23\xcb\xca\x4b\x2d\x3e\xe2\xf7\x1f\x19\x30\xc4\x65\xa3\xc4\x3b\x47\x22\x7c\xaf\x3b\x01\xad\xf3\xa8\x76\x44\x51\x16\xa0\x5c\xca\xf1\xb8\x2c\x54\xdd\x5a\x05\x92\x97\x56\xd6\x0c\x27\xea\xee\xd0\x02\x60\xcd\xa7\x94\x70\x6c\xfd\x65\xc7\x2f\xd8\x75\x40\x76\x91\x84\x89\x87\x68\x31\xad\xaa\x01\x14\x13\x53\x02\x72\xfd\xc3\x4c\x4f\xd3\xad\x88\x60\xe6\xff\xa1\x5a\xba\x8f\x07\x82\x3f\xa9\x0f\x4f\x7f\x2d\xf6\x7c\x36\x9e\xe1\x45\x5c\xc0\xee\x9a\x55\xef\x1c\xc0\xa7\xdd\x05\xcf\xe6\xf3\x06\x0c\x49\xe1\x07\xd1\x8d\x2b\x4f\x54\xbe\x13\x98\xd2\x2f\x6a\x1a\x50\xc1\x89\x9b\x41\xaa\xc3\x81\x90\x62\x5e\xc9\xb2\x16\xff\x43\x5e\xc9\xd3\x71\x53\xce\x11\x5c\x9f\x63\x19\xcf\xc2\x24\x1c\xce\xda\x00\x66\x65\x28\xa6\x7c\x82\x61\xb4\x61\x60\x98\x24\x3e\xdb\x0f\x2a\x3a\x20\xa2\x99\x59\x7e\xe9\xe7\x5b\x92\x62\xee\x42\x57\x89\xc9\x76\x28\xc5\x4d\xf6\x01\x82\xf0\x00\x0b\xca\x4e\x76\x58\x20\x9d\xec\xf0\x5d\x76\xb2\xb3\x53\xdb\x69\x12\xa7\x36\x6a\xe8\xff\xe2\xd4\x42\xee\x08\xc6\x3f\x76\x13\xe9\xe7\xb8\x08\xfb\x49\xf3\xdb\xa1\x6f\x9c\x5f\xe6\xbc\x2e\xa3\x60\x34\xb9\x73\x7e\xda\x9d\xa5\xce\x87\x03\xd1\x73\xc5\xa3\xc9\x41\x39\xc9\xf1\xef\x30\x66\xf9\x5b\x33\x14\xd1\x60\x60\x78\x99\x11\xf9\x9a\x37\x1b\x4e\x92\x46\xd6\x8f\x28\x4d\x51\x9f\x1f\x54\x9c\x50\xb1\x17\x65\x7e\xfe\xb9\x87\x16\x55\xbe\x7e\x74\xee\x80\x3a\x8d\x85\xac\x54\xea\x1b\x67\xcb\xc5\x49\x66\xbb\x83\xcf\xd6\x0e\xdc\x18\x65\x5d\xe6\xc0\x74\x2d\x83\xde\xf0\xb9\x6f\xfa\x5b\x43\x11\xed\xfe\x15\x32\xd7\x53\xde\x16\x0a\x0f\xe1\xd2\x88\xf9\xb4\x91\x74\xfd\x22\xc5\x8f\x0b\x65\x40\x50\x08\x9c\x08\x45\x90\x6c\x1b\x3f\x57\x41\x9e\x33\x3e\x93\x48\x3e\x4b\x67\xf1\xab\x45\xa5\xe0\x60\xbe\x41\xb4\xbe\x9b\x07\x0b\xc8\x9f\x72\xd9\x79\x5d\x31\x59\xb4\xf5\xf3\xad\x92\x97\x79\xad\xe1\xbe\x0d\x53\x27\x4d\x55\x2d\xd4\xa7\x16\xb1\x2f\x88\x95\xd8\x91\x79\x98\x69\xac\x91\xe2\xdb\xb1\x28\x95\xf3\x03\x2f\x27\xf9\x0e\x31\xf6\xf4\xc6\x02\xee\x33\x08\xc4\xf0\x07\x75\x5e\x9b\x0f\xa8\xf0\xa0\x2c\x7c\x68\xf7\x4a\x0a\x0f\x4a\x6d\x4c\xdf\xfe\x9b\x4d\xa9\xdb\x7f\x61\x17\xe2\x87\x24\x35\xb1\x59\x8c\xa7\xa2\x2a\x27\x6a\xbc\x1c\x57\x0c\x89\x9f\x3b\x05\x5d\x7d\x6f\xcb\xaa\x72\x15\xae\x38\xf9\xc2\xee\xbe\xc6\xeb\x2c\x06\xdb\x59\x37\x1b\x51\xd1\xdb\x4c\x49\xf8\xe1\x2d\xe6\x25\xfc\xec\xb6\x93\x73\x34\x71\x73\xd3\x26\xc1\x0b\x28\x24\x94\xe0\x95\x30\xd7\xb5\x01\x0d\x0b\xf2\xbf\x01\x22\x38\x75\xd2\x56\x62\x19\x43\x34\xb1\x69\x8f\xd2\x56\x26\xaa\x1d\x4f\x45\x21\x5b\x69\xd5\x34\xa8\xa3\x59\xd4\x51\x48\x90\x7d\x31\x5b\x20\xf0\x8f\x11\x72\xd2\x2a\xba\xd0\x80\x39\x21\x44\x6e\xe8\xe7\x9b\xa3\x81\x88\x7a\xe0\x62\x86\xfa\x5b\x37\x71\x71\xea\x6c\xa9\x36\x58\xd9\x4e\xd9\x8d\x97\x36\xfd\x72\xd3\xb5\x4d\xbf\xeb\x70\xf5\x35\x93\x9e\x25\xe9\xa9\x34\xe8\x98\xe4\x10\x90\x23\x39\x03\x87\xb4\x06\x8a\x39\x1d\x63\xf2\x75\x07\x87\xf2\x6e\xd2\x60\xa8\x58\x40\x1c\xb6\x1d\xb6\xa5\x26\xf0\x12\xc6\x7c\xf0\x1f\xbf\x35\x1f\x07\xa1\x4b\x86\x06\x87\x00\x44\x8e\x5c\xcc\x7d\x44\x10\xb6\x09\xa1\x59\x31\xe4\x64\xcf\x44\xb9\x17\xac\xb4\x80\x2e\x05\xc3\x7b\x94\x7b\x79\x9d\xdc\x12\x49\x98\xa1\xdc\x12\x8a\x74\xab\xe5\x96\xf0\xf3\x81\xe8\x9d\xaa\x16\xb3\x65\x86\xb5\xae\x95\x59\xf8\xb2\xd4\x4b\xa7\x0e\x38\xe5\x5c\x89\xf2\xa2\xd6\x8d\xe5\xf9\x96\x50\xf8\xae\x7d\x90\x95\x3a\x81\xbc\x52\x09\x15\xc5\xa2\x5e\x66\x1e\x02\x9b\x18\x7b\xbe\xe5\x34\x20\x7b\x80\xe3\xfb\xfb\xf7\x9d\xb1\x0b\x1f\xdc\x0d\x91\x46\xad\x12\x80\xbe\x11\x58\x7c\x6b\x6b\xdd\xad\xf1\xb7\x64\x43\xd8\x11\xb3\x85\x69\x03\xcc\x1c\xaf\xdb\xea\x06\x6c\x89\x1b\x1c\x76\x5b\xa9\x67\xdc\x4d\xb9\xff\x57\xe9\xf4\xce\xa1\x25\x63\xc5\xc8\x24\xcf\x0f\x91\x56\x6f\x93\xfc\xbc\x5b\x13\x4f\x42\x90\x06\x1d\xb2\x82\x02\x87\x36\x99\x24\xfa\x9b\xc8\x00\xa9\x37\xcc\x97\x8e\x35\x08\xdc\xcf\x8e\xea\xf9\xa2\x7d\x85\x11\x6b\xa6\x63\x7f\x74\x77\x10\x3e\x6e\x30\xe2\x00\x6b\x11\xd7\x77\xe3\x4f\xcc\x86\x4e\xf8\x71\x27\x65\xa1\xe7\xed\x3a\x93\xd5\x9a\x4e\xfa\xcb\x67\xfa\x0b\x7b\xb4\x26\x27\x02\x7f\x1a\xb8\x57\x05\xf9\xac\x31\x0b\x98\x1c\xa3\xdf\x2f\x25\xf6\x81\x1b\x1b\xce\x9e\x47\x20\x50\x6c\xde\x8f\x40\xef\x4c\x70\xa7\xb3\x22\x4b\xa9\xdf\x31\x9c\xd0\x36\xca\xf9\x18\x38\x28\xe5\x5c\x01\x56\xad\xb3\xe3\x8e\xeb\xa7\x31\x08\xa5\x23\xb7\xbc\x16\x30\xc4\x56\xda\xf4\x10\xf3\x2e\xca\x34\x8a\x66\xbd\x34\xfd\x68\x76\xac\xc0\x86\xed\x84\x06\x69\xb9\xf9\xef\x7d\x5d\x9b\x45\xd7\x1e\x1e\x7c\x39\x76\x1f\x45\x75\x00\xfa\xef\xf1\x9a\xc6\x07\x69\x8f\xed\x36\x49\xf2\xaf\x76\xcc\x9f\x90\x26\xb7\xd5\x4d\x9f\xa4\xa0\x71\x64\x2c\xbf\x0d\x85\xfa\x8c\x0e\xfb\x72\x3c\x55\xae\x33\x99\x44\xe1\x98\xc5\xa4\x51\x60\x8c\x80\x44\xca\x71\xc9\x45\x5d\x59\x32\xe4\xb4\xcb\xcb\x20\xe5\x84\xf3\x03\xe1\xa2\x66\x01\x06\x44\x76\xcd\x07\x4f\xea\x31\x74\xe0\x7c\x01\x14\xdb\x6b\xc1\x28\x52\xab\xeb\x6a\xb9\xcd\x26\x11\xee\xb5\xf1\x4e\xf7\xe1\x64\x7b\xc6\x09\x55\x6d\x38\xdf\xe9\xec\xc5\x66\xeb\x70\xff\x25\x44\x1c\x02\xa2\x5a\xf9\x07\x9c\x47\x6e\xe4\x05\x37\x5e\xb0\x8c\x3b\x75\xf6\x02\x32\x63\x6b\xfb\xaa\xd3\x31\x2b\x35\x62\xcf\x78\xad\x57\xdc\xa4\xd0\x05\xdb\xa9\x3b\x4a\xe3\xfa\xfd\xe4\xae\x53\x67\xb3\xed\xee\x08\x74\x41\x04\x39\xa4\x6c\xd4\x18\x32\xfd\xea\x20\xbd\x1f\x6b\xf2\xf7\x0a\x35\x6f\xd4\x18\x16\xbb\x8f\x4e\x66\xde\x7b\x2a\x94\xaf\xee\xa1\x9c\xea\x84\xac\x2d\xb4\xb4\xf8\x18\x3e\x6f\x44\xd9\xf0\xb4\xf6\x4a\x28\xb1\xe6\x61\xc6\x31\x23\x60\x97\xf1\xec\x20\xfe\xeb\xd6\x4a\x86\x97\xd2\x4a\x24\x2b\xaf\x22\x99\xf0\x92\xb4\x7b\x21\x7a\x3b\x42\x0a\x1b\xfc\xc9\xf4\x14\xf5\x3e\xdb\xc7\xdd\x9b\x28\x2d\x39\x84\x2d\xbd\x71\x57\x72\x94\x86\x1c\x36\x58\xc5\x0d\xae\x6b\xc0\xe6\xe0\x4a\xf4\x76\xa3\x5b\x97\xbb\x1b\xba\xc9\xbe\x8b\x5a\x7d\x7f\xd3\x7d\xcb\x9a\x79\x5a\xb9\x0d\x80\xf0\xe3\xbd\xf0\x0b\x6c\x83\x68\x1c\xc1\x0d\x87\xd8\xd4\x61\x38\x99\x89\x4e\xa4\xd8\x97\x5f\x6c\x1b\x41\x32\xd1\x2b\x7d\x49\x18\x58\x68\xea\xa9\xca\x89\xda\x06\x83\x82\xc1\x04\xa9\x1c\xef\x55\x2d\x29\x6b\x96\x4b\xcb\xe0\xda\x08\xb7\x24\xd4\xb2\xfe\x90\x5c\x17\x94\x18\x04\x84\x77\x25\x92\x00\x5c\x28\x92\xa2\x6e\xbe\xed\xfc\x69\xee\x01\x79\xbd\xc9\xee\x03\x87\x28\x43\xa8\x04\x79\x61\xb9\xab\x6a\xdf\xc5\x92\x39\x5d\x02\xb3\x52\xb0\xa6\x40\x9f\x52\xcd\xf6\xe8\x06\x0d\x13\xee\xa1\x70\xae\x7f\x99\xbc\xe7\x3f\x45\xe8\xcb\x2b\x10\xf3\xaf\xd4\x14\xe2\xd0\xc8\xe0\x3e\x78\x62\xba\x19\xf5\x23\xce\x1a\xf4\xf9\x76\x92\x62\xc0\x4f\x31\x5d\x31\x24\x6b\x26\x17\xe2\x67\xaf\x8e\x32\x7e\x2f\x94\x7d\x63\x95\x5b\x4c\x62\x1a\xdf\xb4\xa0\xf7\x4d\x2f\x0d\xf4\x21\xb1\x9d\x5b\xcd\xd4\x72\x8b\x00\x23\x28\x4d\x03\xd5\xc9\x70\xfb\x79\x2f\xca\x3d\x9d\x75\x78\x58\x69\x27\x3b\x5e\x83\x0b\x29\x6e\x2d\xba\xed\x46\x0e\x41\xd7\x4a\x4c\x25\x64\x48\x2d\x29\x3a\x21\xf4\x33\x36\x3e\x65\x16\x10\x39\x73\xa9\x81\xa8\x54\xdb\x33\xbe\xa6\xb9\x0f\xd7\x9c\x89\x5a\x5f\x87\xe1\x6f\x71\xa8\xd5\x6a\xd7\xa5\xf0\x56\x23\xe7\xf8\x14\xa7\x11\x49\x88\xf9\x36\xf8\x1d\x41\xe5\x9b\xa2\x78\xac\x0a\x35\x5c\x67\xb9\x5e\xbf\x6c\xeb\x62\xe4\x62\xaf\x18\x7f\x70\xec\x73\x00\x11\x9e\x10\x80\x7c\x0a\x00\x4f\xe0\x2a\xee\x3a\x41\xae\x3f\x06\x5d\x76\x10\x53\xb2\x51\x98\xf5\x08\x47\x87\xd5\x8d\x19\x52\x0a\xd2\xf8\x14\x04\x77\x10\x1a\x30\x16\x33\x75\xdc\x3d\x5a\xb0\x5c\x3a\x84\x1d\xe1\xc0\xd4\xe1\x2d\x87\x32\xbf\x50\x57\xaa\xda\x11\xaf\xc2\x9f\x54\x68\x6b\x47\xb0\x03\xd2\xdf\xf9\x33\x10\x00\x36\x3d\x29\xe0\x8b\xdb\x18\x5a\x38\x3a\x46\x58\x02\x76\x3e\x3e\x1b\x98\x4d\xc2\x6f\x5e\x6d\x76\xe0\xc0\x27\x20\x9e\x79\x87\x23\x37\xcc\x08\x36\x8b\x41\xb0\xeb\x25\x28\xc3\x44\x88\x00\x0f\x01\x98\x18\x2e\xcf\x92\xc7\x88\xc0\x42\xc3\xa8\x3a\x04\xdb\xe7\x45\xc5\xc4\xb9\x1e\x9c\x64\x5e\x29\x40\xc0\xf6\xc0\x16\x02\xf3\xc8\xaf\x18\x4e\xc7\xd8\x44\x5f\xf8\xc3\xd3\x3f\x0b\xea\x21\x2e\x3b\x08\x5f\xd2\xf1\xca\xd9\x98\x11\x5f\x34\x38\x67\x21\x56\x28\x1a\x57\x72\xbc\xf6\xc4\x83\xb0\x3e\x21\x7a\x5f\x79\xe0\x06\xdd\xda\x72\x63\xfa\x12\xd3\x5e\xad\xae\xdf\x7c\xa5\xdd\x25\xae\x65\x7f\xf3\xc3\xb0\xdb\x66\x40\xaa\x58\xa1\x0e\x4c\xac\x9d\x03\x77\xb7\x53\x76\xb3\x55\x0d\xc9\xd4\x4f\xcd\x4d\xb7\x36\xc1\xdd\x5d\xc4\xdd\xc4\xfd\xfb\xbe\x12\xef\xe0\x0a\x0c\x9c\xe9\xe3\xf3\xe7\x70\x24\xf4\x8a\xc7\xcc\x5f\x47\x1b\x65\xbd\xbe\x19\xd2\x45\x32\xab\xe1\x2b\xc7\xe6\x73\x44\x9b\x3e\x64\x63\x4a\x9e\x58\xf8\xaf\x2c\x4a\x01\x03\x2e\x60\x02\x39\x77\x23\x93\xbb\x72\x8e\x97\xec\x36\xa7\xa4\x5b\xb2\xd5\xc7\xa4\xdf\xde\xa7\xab\x4f\xc8\x0d\xe7\x2e\x3c\x2f\x37\x99\x53\x17\xf4\xb2\x7e\xa2\xe7\x99\x13\x61\xcd\x5c\x23\xa0\x0f\xfa\x65\x40\x42\x3a\x25\x2b\x42\xd8\xf1\x3a\x22\x98\x89\xa7\x00\x4c\xa7\x0a\xba\xe8\xe4\x00\xcc\xa0\xae\x8c\x78\x25\xeb\x82\x57\x0d\x0d\x78\x9d\x22\x4f\xed\x72\x43\xca\xba\xa0\xa6\x45\x1d\x5e\x2d\x2d\xaf\x25\x42\x77\x64\x36\xd5\xdd\x35\x9e\xe5\x1b\x2e\xc4\xba\xbd\x7c\xf3\x7c\xaf\x3b\xe2\x36\x5a\xc2\xcc\xb6\xc8\x6e\xd8\x18\x02\xc6\x49\x29\x4c\x2e\x3d\x13\x41\x5c\x0c\x30\xf4\x94\x18\x02\xa1\xfb\x19\xc8\x22\x10\x55\x49\x19\x05\x30\x5b\xf5\xb9\x2c\x61\x63\xe9\x45\x3b\x0c\x8f\xa6\x44\xfd\xe1\x79\xd8\xcd\x94\x61\xc9\x91\x47\x9b\x2b\x13\xda\xc1\x79\xf8\x41\xb9\x34\x3f\x46\x97\x68\x83\x79\x28\xad\x84\xe2\xc7\x57\xeb\x6b\x77\xaf\xe1\xd2\xe6\x8f\x75\xd3\xa8\x71\x8b\xce\x2e\xd7\xc8\x3f\xd6\x92\xad\x23\xb5\x1b\x47\x7e\xf3\xb8\x6f\x18\x75\x48\xd5\x5f\xa9\xae\xac\x62\xe8\x1b\x68\x2c\x9e\x0e\x32\x6d\x39\x87\x58\x76\x39\x62\xf4\xb2\x95\x0c\x3a\x20\x1a\x7f\xe8\xdf\x96\x03\xb3\xd1\x3e\xfa\x32\xcb\x86\x6f\xc3\x88\xd7\x72\x00\x91\x74\x34\x79\x99\xe5\xc8\x2b\x36\xf4\x0a\x2e\xb1\x9a\x2f\x87\x9c\x39\x10\x9a\xbe\x6c\x46\x19\x6b\x15\x22\xaa\x73\x33\x9d\x28\x6d\x75\x35\x61\x7b\x0d\x21\xf2\xda\x1f\x8d\xb2\xa6\x38\xa2\x8f\xd0\x16\x67\x39\x53\x93\x2a\x53\x65\x4b\xe7\xb9\x95\xd9\x1b\x85\x1a\x55\x64\x8e\xc3\x9a\x62\xa5\x69\xa5\x36\x7a\x93\x61\x6e\x63\xa3\xd9\xad\xf5\x20\x67\x34\xdf\x54\x03\xe0\x6b\xc5\x4d\x35\xa0\xac\xfa\x23\x12\xdd\x47\x36\xea\xeb\x95\x1f\xf1\x15\x9a\x8f\x88\xd5\x1e\x1e\xff\xae\xf3\x53\x48\x75\x99\xbc\xfb\xc1\x4f\xd5\x69\x7e\x06\x93\xa1\x70\xb6\x08\x5a\xc8\xf5\x0a\x82\x5b\xbe\xaf\x55\x6f\x5c\x05\x3f\x83\x66\x43\xc8\x38\xad\xda\xe1\xdc\x1b\x2d\x60\x6f\x06\xdb\x6f\x90\x1c\x6b\xa3\x64\xab\xdb\x13\xf3\x7a\x2a\x5d\x0e\x28\x30\x94\x43\x72\x77\x6f\x3d\x27\x44\x03\x76\xa7\x85\xa8\x93\x6d\x70\x09\xb2\x05\xef\xd1\xae\xbc\x37\x14\x7f\xd4\xd7\xf6\xfb\x01\x57\x46\x86\xaf\x0c\x76\xf6\xb5\x42\x1f\xaa\xa8\x02\x26\xc9\xcd\x2c\x7a\xeb\x75\xa8\xaf\x52\x9d\xd6\x18\x04\x7f\xca\xfd\x5c\x64\xa9\x04\x60\x3c\x88\x46\xf5\xa0\x78\x64\x2e\x34\x0c\x29\xe7\x88\x9e\xd6\x28\xce\x42\x91\xa0\xd0\x06\x17\x76\x37\x83\x47\x3a\x1d\xe0\x15\x83\xe1\x61\x13\x84\x5a\x62\x77\xea\x30\x24\xd2\x55\xf8\x70\x1b\xc4\x58\xfa\xc9\x5c\x7f\x6e\xaf\x64\xea\xab\xdb\xc8\xcf\xf8\x1a\xa3\x63\x12\x5f\x14\x74\x88\x67\xaf\x63\x4d\x8e\x43\x4b\x99\x7c\xee\xdf\x0f\xe6\x7b\xcf\x9f\x93\x9c\xf5\x8e\xbd\x43\xa6\xb2\xbe\x50\x45\x1f\x11\xf2\x37\x99\xad\xdb\x45\xa4\xa6\xa7\x80\x87\xbf\xbf\x96\x3e\x1a\xb5\x04\x48\x66\x9e\x4d\xc7\x67\x9d\xeb\x8f\x8b\x54\xf5\x75\xa1\xb8\x10\xa5\x1f\xeb\x28\x0b\x03\x27\x73\x8f\xdf\xbe\x19\x8d\x0f\xde\xa0\xd8\x0d\x62\xe3\x30\xf1\xaa\x5f\xe9\x9f\xbd\x3e\xe8\x34\x59\x02\x3b\x49\x8c\x0d\x1b\x1d\xa8\xb4\x9d\xbd\x8b\x42\x5a\x2a\x83\xe1\xb7\xa9\xd1\x58\x64\xae\x30\x53\x65\x25\x76\x52\x8c\x03\x30\x7e\xd9\x20\xe8\xe0\xa6\x27\x6c\x37\xc9\xc7\xb8\x8e\x7f\xde\xb8\x04\xb7\xf3\x27\x48\xe3\x7e\x57\xb9\x0a\xdc\x2e\xc8\x37\xe7\x32\x10\x2f\xc9\x4f\xa6\xb4\xcd\xe9\xe1\x4b\x8e\x97\xfc\xf7\x06\xfc\xc7\x6c\xc0\x68\xba\xf3\xe1\x27\x2e\xf2\x93\xc4\xcb\x60\xc6\x21\x1f\x82\x0f\x25\xf0\x95\xc5\xf2\xe5\x08\x4f\xc3\x56\x8b\xb2\x2e\xca\xb1\xb3\x86\x81\x35\x0b\x32\x44\x3a\x78\x2f\xbe\xed\xb1\xff\x85\x48\x44\x39\xe1\xed\x55\x04\x43\x1a\x22\x15\xe5\x4a\x67\x42\xa6\x7f\x4e\x6b\x10\xd4\xb6\x32\x84\x27\xd2\xd4\x86\xf9\x0b\xf1\xd0\x2e\x72\x83\x51\x64\x13\x8b\xc8\xca\x70\xf6\x10\xbb\xf1\xef\x2b\x1c\x19\x77\x32\xcf\x5c\xd2\xdf\x8c\x4f\xe9\xce\x8a\xe7\xf8\x4d\xd7\x07\x64\x27\xf3\xcc\xc9\xb7\xab\x6e\xf7\xb0\x40\x46\x83\xdd\xc9\x3d\xa4\x34\xb5\xbb\x77\x38\xad\xdc\xe9\x72\x76\xae\x2b\x0c\xd9\x6a\xb5\x68\x25\x4a\x85\x66\xae\xc6\xa5\xac\x28\xe8\xc4\x6e\x6e\x33\x0c\xaf\xbf\x44\xad\x45\x2d\xdb\xf2\x8a\x6b\xb0\xf5\xd5\xba\x11\x73\x5d\x2d\x27\x65\x55\x91\x46\xc8\x11\xa9\xf5\x62\x46\x00\xec\xd0\xd2\xc4\x96\x54\xcd\x44\x37\x33\xf4\x8d\x01\xc4\x2e\x48\x4e\xfb\xea\xe4\xf5\xd9\xb3\x17\x1f\xce\xfe\xfc\xea\xd0\xc7\xa3\x50\x2f\xbb\x92\x37\xbe\x78\xd7\x9b\xe8\xa6\xf7\xbe\xf3\xa0\xdf\x03\x87\xe1\x21\x26\xd4\xee\x81\x53\xd6\xc3\x4f\x4a\x8e\xe5\x6e\x27\x85\x1d\xa2\x8e\x7d\xf3\xa8\xcf\x29\xc4\x07\x69\x4a\x69\x27\xcf\x4e\xca\x8b\x45\xa3\x2c\x77\x84\xb9\x7a\xf6\xea\x08\x63\x68\x1b\x6d\xcc\x36\xa7\xef\x4c\xb2\x7a\x0f\xef\xc4\xbf\x3d\xdc\xe7\xa5\x5a\x8a\x3d\x07\x2c\x68\x08\x1f\x53\xfc\x41\x3c\xb1\xe3\x71\xcf\xdf\x3d\x79\x1f\xc3\x49\x88\xa7\xf1\xcb\x20\x73\x53\x44\xc7\xac\x6e\xdb\xa5\x05\xe4\x04\xb1\x00\x77\xed\x45\x5d\xfe\xb8\xb0\x1a\x2d\x84\xd4\x97\x93\x25\xe1\xd2\x1b\x87\x15\x87\x53\x02\x95\x7c\xf3\x0d\xae\xc4\x4e\x77\x95\x90\x00\x2f\xd5\x72\x07\x87\x42\x32\xa6\x03\xdf\xe9\xf5\xc4\x03\xfb\x86\x76\x8a\x4b\xc6\xed\xe6\x99\x77\xd0\x0d\xd9\xbc\xd3\x2c\xe9\xb9\xf4\xe8\x84\xfd\x76\xa1\xda\x7d\x3c\x1b\xe0\x8a\xfb\xb4\x95\xe3\xcb\x67\x45\xa1\xea\x62\x31\xfb\xe6\x91\xd8\x23\xc4\x39\x75\xbe\xb8\x08\xcb\x0d\xd7\x7d\xb7\x7b\x27\x8f\x72\x79\x2c\x81\x4f\x79\x9b\xf2\x77\xdf\xd9\xee\x7e\xe7\x72\x67\x71\xa2\xa5\x5a\xc3\xfc\xa8\x4f\xf3\xaa\x1c\x97\x6d\xb5\x84\x28\x0f\x5d\x8b\x62\x59\xcb\x59\x39\x16\xb2\x69\xe4\x12\x40\xfe\x5c\x16\x7b\x00\x62\x14\xdf\x71\x14\xc8\xa5\x5a\x26\xa9\x3f\xc9\x48\x01\xeb\x6a\x68\x61\x2f\x95\x9a\x8b\xb6\x91\xe3\xcb\xa8\xae\x73\xd5\x5e\x2b\xe4\xca\xdf\xb9\x0c\xa0\xf0\x6b\x44\xc3\xd2\xd7\xb5\x6a\xfe\x28\xcd\x9f\xd4\xf2\x8d\x51\x6f\xd1\xbf\x90\xa0\x3a\xe3\x12\xcf\x69\xef\x9c\x2d\xe7\x49\xb9\x00\xd2\xf3\xb9\x6e\x8e\x4b\x00\xc9\xfd\x13\x90\x78\x00\xe7\x69\xfb\x14\x62\xeb\xc0\x83\x2c\x70\x27\xbc\xb8\x1b\xc5\x96\xc4\xa8\x21\x69\xb8\xcb\x5d\xf8\x64\xf8\xc1\xb4\xba\x01\xef\xb3\xf0\xf7\xd0\xe7\x4b\x75\x6f\xec\xa2\xdc\x4d\xd5\xc8\x6e\xdd\x2e\x1c\x26\xaa\xff\xe6\xa8\x17\xdc\x4a\x41\x40\x6b\x9d\x99\x1c\x12\x1d\x30\xdd\xa0\xa0\xbe\xfe\x32\xf6\xa7\x15\xd3\xc1\x0e\x95\xa9\x7f\xa1\xeb\x38\xe4\x35\xb6\xbb\x51\xec\x89\xde\xa1\x1c\x4f\x69\x6d\x4a\x80\xe0\x00\xda\x15\xb6\xa3\xad\x6a\x64\xab\x9b\x64\x48\xc8\x6c\x30\xc2\xef\xde\xa5\x5a\xa2\xfd\x65\x28\x4e\x95\x12\xb9\xec\xd5\xe4\xdc\xba\x0d\x14\x3f\xe1\x30\x49\x80\x22\x2e\x6b\x38\x36\x80\xa9\xda\xa7\xfd\xf5\xbb\xbd\x8f\xae\xb8\xac\x2c\x80\xa8\x99\xa3\xf3\x77\x2b\x07\xfc\x7e\x1d\x59\xdc\xb6\xae\x78\xa2\x53\x1f\xde\x7f\x96\x79\x05\x24\xe1\x9b\xe6\x95\xf1\x6b\x89\xe9\x52\xc0\x1b\xf0\xd7\x14\x1e\xd8\xbe\x3f\x3a\x3b\x7c\xfd\xec\xec\xe4\xf5\x87\xd3\x3f\x1f\xff\x70\xf2\x62\xe3\xc3\x7d\xc8\x43\x47\x0c\xe2\xe7\xcf\xde\xfc\xaf\x0f\xdd\xba\x7a\xff\xfe\xef\x5c\xae\xb7\x6b\xcf\xbc\x1f\xf0\x6e\x98\x2a\xb7\xf2\xcc\xf0\x26\xa1\x07\xf6\xd1\x21\x1e\x2a\xdb\x76\xbb\xfd\x43\x05\x9f\xc3\x17\x87\xc7\x87\x2f\xcf\xe0\x4c\xdd\x0d\x9e\xef\x3f\x7b\xf1\xa2\xf3\xf0\xf5\xe1\xd9\x9b\xd7\x2f\x3b\x8f\x9f\xbf\x7e\xf6\x1f\x41\x25\x81\x62\xb6\x99\x04\x85\x94\xde\xed\x8f\xd8\xcb\x0b\x56\x0a\x27\x0b\x37\x57\xd2\xdd\x55\xdf\x58\xdd\x31\xfc\x20\x18\xca\xaa\x4f\x70\xdb\x85\x1f\x45\x03\x5d\xf5\xd9\xa4\x91\x17\xdc\xbd\x40\x93\xce\x0e\x0f\xc4\xc2\xdf\xe4\x87\x01\xef\x7e\xbb\xaa\xc7\xf0\xf6\x77\xab\xbb\x06\xef\xcf\x3b\x79\xdd\x8e\x88\x5a\x9f\xd7\xfd\x99\x5c\x9e\x2b\xf8\x7d\x5e\x05\x09\xc8\xa2\xc7\xb9\xc3\xb1\x5b\x20\x83\xfc\x40\xb2\x60\x98\x07\x14\x76\xab\x6b\x5e\xec\x75\xb6\xe6\xfd\xfb\x71\xdd\xef\x92\x02\xef\x6d\x27\xe2\x12\xb9\x6d\x09\xd8\xed\xa1\x71\x20\x68\x33\x6b\x0b\xe0\xb0\x27\x57\x6e\x37\x4e\x9b\x87\x83\x88\x31\xf5\x55\x33\x56\xaf\xd5\xc4\x9b\x76\x89\x26\xbd\x80\x3d\x2b\x3f\xa9\xe2\xb5\x9a\x88\x3d\x7e\x37\x6c\xd4\x84\xfb\xe6\xde\x86\xd6\x51\x9e\xe0\xf0\x5d\xb7\xbb\xe0\xfa\x4c\x35\x7e\x80\x83\x20\x86\xaf\x84\x47\x41\xab\x58\x26\x0c\xbc\xb6\x0a\x6b\x62\xf1\x0e\x8e\xa8\xad\x24\x06\x05\x1e\x72\x26\xe1\xa8\x2e\x2b\x9e\xf8\xb7\x90\xee\x70\xaf\x93\x0e\x31\x2f\x9f\x80\xfa\x0c\xb1\x73\x61\xa2\x02\xfc\xc2\x88\xb1\xac\x5d\xae\xa3\x46\x4d\x4c\x57\x9e\x60\xbd\x9b\xbb\x84\x3d\x48\xae\x3a\xbd\x71\x05\x22\xca\xb3\x1d\x21\x71\x88\x66\xcd\x32\x4a\xd3\x52\x8e\xf7\x09\xa0\xd9\xfc\x2c\xe2\xd0\xc0\x2d\x6a\x77\x20\x18\xc5\x60\xdb\x44\x6a\x01\xcd\x85\x8b\x07\x6e\xd8\xfb\x53\x35\xbe\xb4\xcb\x34\xf7\x17\x1b\xae\xa7\x33\xd9\x8e\xa7\xca\xc0\xdd\xa8\x7f\x1c\x2c\xed\xba\xbc\x82\x4d\x42\x87\xc1\x73\x2b\xb2\xb9\xae\xed\xed\xf9\x8e\x86\x54\x42\xfb\x24\xf8\x2c\x07\x72\xd2\xc0\xe8\xbc\x38\x0e\x60\x35\x29\xb1\x51\xe8\x80\x5d\x2e\x0a\x23\xd8\x8b\x02\x09\x60\x0d\xdd\x3b\xf1\xf7\x2f\x62\xc7\x3f\x88\xc3\x9d\xa0\xfe\x6c\x66\x14\x21\x0a\x55\xa9\x16\x69\xeb\x9d\x1b\xd2\xfb\xc0\x28\xd7\x45\x6b\x4b\xca\xda\xfd\x63\x1b\xc8\x18\xf2\x76\x9d\xd8\x16\x4f\x9f\x9f\xbc\xdd\xd8\xd8\xee\x26\x2c\x69\xd6\x09\xff\x9e\x97\x58\x8e\x80\xd5\xac\x10\xfc\x5d\x42\x01\x3b\xdd\x9c\x2e\xc0\xe7\xee\x6b\x00\x9f\x00\x52\xc5\x65\xf6\xd4\xdd\x98\x67\xe4\x1b\xc0\x22\x50\x3f\xa4\x2c\x9e\xab\x71\x39\x29\x19\xbd\x88\x88\xaf\xff\xad\xd9\x82\xb8\xd6\x5a\xd3\xd6\x82\xb2\xaa\x1d\x8a\x3f\x87\xd8\x74\x2b\xb1\xe6\x2b\x2d\x0b\x55\x0c\x45\xbf\x50\xad\x2c\x2b\xb3\x93\x15\x2c\xed\xa2\x6c\xcf\x16\xa6\xdd\xb6\xb5\x6d\x23\xff\x5a\xb7\xdd\xbe\xc4\xac\xdd\x6f\xb3\x90\xbd\x43\x86\x00\x87\xcf\x8b\x84\x67\x75\xce\x3e\x7e\x45\xe0\xec\xb5\xba\xde\xf7\x1a\x25\x26\x4d\x73\xaf\x39\xe8\x64\x4f\xf4\x5a\xf5\xa9\x95\x8d\x92\x51\x2e\x53\x49\x12\x2d\xec\xf7\x38\xee\x3c\x7c\xd5\x41\x71\xa1\xbb\x69\x29\xc6\xba\xaa\x94\x4b\xc8\xe8\xad\x47\x0b\xa3\xbc\x04\xef\x50\x01\x21\x20\xee\xd6\x5a\x0b\xa9\xb7\x1d\x12\xc0\x19\x49\x6c\x02\xa1\x09\x07\x75\x89\x3e\x80\x16\xee\x88\x6f\xcd\x16\x8a\xf6\x04\xa4\xef\x43\x68\x5a\x7d\x8a\xb4\x08\xb9\x41\xfc\x84\x02\x99\xbf\x23\xf3\x03\x7e\xf5\xbe\x27\x9e\xb2\xce\x8b\xfe\x9c\xa0\x4c\xfc\xdd\x8e\x8a\xea\xb5\x0f\x7c\x25\xc3\xbf\xea\xb2\xee\xf7\x06\xa2\xb7\x65\x67\xe1\x4b\x4f\xec\xb8\x25\x1b\xb8\x49\xf6\x89\x48\xdc\xea\x23\x38\x73\x68\x6b\xe8\x07\x59\x72\xd6\xe9\xa7\xcf\x5d\x1e\xee\xf5\x33\x43\x87\x0a\x6e\x82\xf9\x5c\x81\xc1\x06\xd6\xca\xae\xb5\x43\xf3\x0a\xb5\x77\x87\xc8\xfa\x7b\xff\x74\xf4\x07\xf4\x61\x21\xd7\x22\xac\xe1\xa4\x41\x11\x29\x26\x1b\x3b\xbf\x94\x09\xd4\xc5\x6d\x48\x48\xe1\x09\x29\x76\x9c\x04\x74\x4b\x22\xb9\x13\x6b\xb6\x19\xfb\xcc\x06\xfa\x6d\x9c\x32\xe8\xeb\xea\x0a\xf5\xdb\x54\xbb\xfd\x2f\xb0\x2a\x1b\x29\xc6\x6e\x55\xbe\x90\xc6\x59\x1a\x71\xdd\xd8\x91\xf8\xdc\xf8\x78\xb1\x62\x1c\xb4\xdc\x91\x40\x1c\x39\xe8\x4d\xa5\x6b\x45\x48\xa6\x05\x80\x50\x29\x39\x9e\x8a\xb9\x6c\xa7\xb6\x3e\x3a\x4b\xac\xcc\xdf\x6a\xc8\x52\x33\x2b\xff\xa6\x7c\x19\xb8\x4f\xba\x2a\x0b\x44\x39\x38\x5f\x8a\xf3\x46\xd6\xe3\x29\x24\x75\x94\x4d\xb5\xa4\xe9\x05\xf0\x02\x5b\x1f\x46\xf5\x96\x95\x6a\xec\xa9\x44\x78\x0b\x85\x16\x65\x2b\x66\xb2\x86\x5a\x86\xe2\x8f\xaa\x9a\xab\x86\x10\x87\x30\x47\x14\x66\x38\xb6\x55\xb9\x06\x6c\x75\x95\xd5\x8d\xf5\xa2\x85\x88\x61\xc8\x55\x18\x4c\xeb\xd0\xef\x6e\xd8\xff\xaf\xd5\x58\xd7\x63\xdb\x36\x5d\x2d\xef\xdb\xb1\x0f\xc8\xca\x71\xd6\xc8\xf1\xe5\x69\x59\xa8\x43\x84\xc5\x42\x42\x75\x35\xa0\xec\x00\xf5\xc4\x07\x02\x50\xd1\x99\x3e\x80\xf7\xa1\xb4\x7e\x77\x5d\xbd\x82\x7d\x9c\xf4\x7c\xb8\xde\xc4\x18\x74\x35\xfa\xf4\x2d\x39\xc1\x35\x56\xa0\xc1\x81\xe1\xd5\x99\x80\xf0\x63\x0c\xde\xbb\xe2\x64\xd0\xe1\x95\x2d\x64\x4a\x19\x8a\xb7\xc1\x6d\xa1\x1c\xb7\xb8\x82\xd7\x40\xa4\x41\x6a\x68\x2c\x9b\x18\x25\xc2\x97\xce\x1d\xcf\xd7\x16\x2e\x99\x26\xeb\x30\xcc\x9f\x9d\xc8\x10\x7a\x2c\xbc\xd4\x8d\xe6\xd1\x07\x16\x67\x45\xb9\x70\xaa\xbc\x08\x16\xd5\x00\x8e\x0a\xd9\x1a\xc3\x19\x1e\x8d\xc4\x01\x75\x0c\x19\x85\x3d\x21\x0a\x84\x62\xbb\x52\x8d\x95\xf6\x11\x0e\x08\xc1\x41\x64\x51\x58\x4a\x65\xfc\x99\x46\xd7\xad\xc3\xfe\x78\x46\xb7\xa9\x70\x2d\x39\x08\x10\x7b\x11\xa7\xa6\x67\xf8\x0a\x1c\x72\xa2\x71\x42\x3a\x4a\x30\x44\x69\x90\x70\xf6\xb8\x43\x83\x00\x92\xe4\xaf\x0b\xd3\xba\x9c\xfa\x53\xe5\xa7\x93\xfa\x02\x09\x3a\xc1\xde\xe4\xb2\xaa\x72\x7d\x0c\xf3\xc6\xbe\x94\x30\x42\xcc\x68\x8c\xdb\x1e\x7d\x20\xc5\x7c\x2a\x8d\x1a\x8a\x93\x1a\x89\xc7\x5d\x79\x44\x97\x82\x65\x7d\x31\xc0\x71\x5a\x8e\x49\x18\x8c\x96\x09\x7b\xef\x2a\x4a\xe0\x19\x8a\x45\xf6\x11\x92\xbf\x37\x8c\x42\xb1\xae\x4f\x95\x7d\x0c\x79\x05\xb1\x7c\xba\x8c\xb1\x0c\x9d\xd6\x9e\x2f\x9d\xc8\xd7\xe1\xa7\x90\x53\xd0\x7d\x7b\xab\x4a\xef\x74\x48\x2e\xee\xb6\xcf\xd6\x16\x17\xf2\x6e\x01\x7b\x8e\xf6\xba\x98\x2b\xc8\x6e\x5e\xf3\x5a\xee\x93\xa4\x97\xb0\x1e\x3e\x18\x1a\xd3\xee\xa7\xd7\x1c\x5f\xc7\x7e\x82\x6e\x07\x99\x69\xe1\x26\xf2\xb9\x46\x07\xca\x80\x21\x89\xb1\x34\x6a\xc0\x31\x31\xe4\x61\x3b\x2b\xc7\x8d\xde\xe6\xa3\xa2\xb0\xba\x72\xd9\x86\x59\x66\x0d\xd2\x11\xb2\x77\x1f\x86\x83\xf9\x1d\x51\x88\xbc\x56\xbd\x2b\x9f\x3d\x1d\x49\xd6\x6e\xc8\x65\x3b\x75\xf9\x11\x41\x30\x4b\xb7\x7c\x3a\x23\x04\x3b\x85\x39\x9e\xe3\xd2\x5d\xda\xdb\x90\xc7\xef\x6e\xc4\x6f\x4c\x79\x6e\x19\x72\x48\x2d\x1d\xf3\x58\x04\xd3\x20\xe7\x5f\xbb\xdc\x96\xfb\x14\x45\x92\x53\xd9\xdd\xc5\xb5\x5a\x48\xd1\xaa\xd9\x5c\x37\xb2\x59\xda\x76\x9c\x9b\x0d\x31\x97\x49\x89\x5c\x65\x16\xac\x12\xc8\xd9\x3f\x2e\xca\xf1\xa5\x3d\x91\x8f\x66\x78\x91\x28\xfa\x38\x63\xf0\xf6\x42\x31\x37\x21\x88\x1b\xb8\x64\xa4\xac\xe3\xaa\x6c\xac\x6c\xa0\x3e\xb9\xb5\x62\xef\x0e\x1e\x1c\xa1\x3b\x1d\xcb\x79\x3f\x74\x39\x8f\x8a\xdd\xb8\xa4\x71\xe9\xee\x92\x82\xd9\x2c\x2c\x43\x57\x70\xdd\x33\x25\xed\xde\xd0\xa8\xb6\xfb\xe9\x20\x2e\xe7\xbd\xb6\x52\xd3\xc1\x06\xd5\xc1\xf4\xac\xac\xf0\x4e\xa6\x1e\xb1\x17\xff\x5e\x43\x64\x69\xfb\x5d\x82\x5b\x18\x15\xe5\x49\x09\x1d\xf4\x3b\x29\x51\x3c\xa5\xbd\x75\xb2\x01\xdd\x2a\x53\x1f\x5c\x9a\x4f\x48\xbc\x66\x87\x66\x9f\x3c\x14\x20\x36\xb0\xe4\x59\xe2\xc9\x27\x8d\xa3\xb3\x56\x03\x52\x3d\x62\x10\x16\x9a\xc3\xec\x70\x14\x20\xd0\xb4\x43\x71\x38\xbc\x18\x82\x95\x0e\xf8\x4f\x59\x5f\x54\x8a\x18\x85\x65\x40\x1e\x23\x2b\x2b\x2b\x01\x9f\x00\x6e\xb5\x47\xee\x17\x6f\x23\xdf\xa4\x8d\xc6\xef\xf6\xbc\xad\x08\x57\x0e\x52\x8e\x46\x8f\x79\x26\xe2\xec\xd5\x6c\x27\xb3\x45\xb2\x07\x12\x4e\xaa\xbe\x52\x4d\x63\xc5\x58\xf4\x84\x8a\x12\xa2\xa3\xdb\x1c\x86\x97\xc0\xfc\x35\x55\xf9\xff\xb3\xf7\xee\x5d\x6e\xdc\x56\xbe\xe8\xff\xfa\x14\x90\xd7\x44\xdd\x7d\x42\xb1\x13\xdb\x99\x7b\xae\x3a\x6d\x2f\x59\x8f\x44\x77\x22\x59\x57\x92\xc7\xf7\xac\x4c\x96\x02\xb2\xc0\x66\x9d\x2e\x16\x98\x42\xb1\x29\x8e\xa5\x59\xf3\x21\xe6\x13\xce\x27\xb9\x0b\x7b\x6f\x00\x1b\x28\x54\xb1\xd8\x0f\x1f\xc7\xb1\xfe\xb0\x25\x16\xde\x8f\x8d\xfd\xfc\x6d\x3b\x64\xbf\xac\x8b\xd0\x54\x97\x25\xb4\x54\x56\x54\x00\xc7\x07\x8d\xc1\xd5\xc7\xec\x7f\xcc\x09\x4c\x1a\xce\xc0\x6d\xeb\x87\x14\xea\x63\x69\xb8\x7b\x23\x60\xa5\xba\xe9\xd8\xf3\x09\xe5\xa9\x30\x7b\xee\x5e\x69\xce\x04\xb8\x12\x9d\xc5\xc4\x9f\xf3\x8b\x89\xdf\xf8\x56\x89\x73\x91\x03\x4e\xe5\xbc\x57\x02\x96\xe0\x6f\x00\x30\xca\x48\xee\x6b\xb5\x25\x2a\x6b\x1f\xfe\xd7\xf6\x43\xf1\x02\xef\x67\xad\xb6\xf0\x37\x77\xa2\x5c\x51\x3f\x70\x57\xe0\xec\xa6\x6f\x6f\xd2\x75\x1a\xc3\x11\x50\x78\xfc\x10\x12\xa6\x36\xa7\xf2\x4d\xcc\x04\x15\xb6\x1d\x08\x2b\x4e\x23\xb2\x07\xb8\x32\xbf\x4f\x47\x94\xe4\xf2\x77\x18\xff\x52\xac\xf4\x15\xcb\xda\xef\x87\xc7\x37\x1f\x9a\xb1\xfc\xe4\x59\xaa\x41\xce\x4e\x3b\x43\x52\x7d\x8f\xad\x5a\x21\xd6\x63\x2b\x77\x5e\xe0\x99\xa6\xcd\xba\x69\xec\xf3\x72\xf5\xb3\xa8\x29\x8f\x14\x65\xfb\x1c\x3f\x93\x7d\xdb\x97\x39\x75\x6f\x81\x88\xc5\x67\xef\x24\x71\xa2\xb2\x0f\x2a\x70\xe1\xcd\x00\xed\x03\xd2\x51\x03\x14\x14\x3e\xc4\x85\x16\xd2\x35\xb3\x76\x23\x85\x06\x68\x76\xf5\x05\xa2\x2a\xba\x87\x29\xa1\x9e\xe9\xa1\x15\x0f\x1e\x64\xce\x5b\x46\x2c\x1b\xb3\x56\x31\x1f\x44\x15\x32\x4f\x13\x78\x0c\xbd\x53\x1f\xda\x57\xba\x50\x59\x2e\x68\x22\x08\xad\xb2\x45\x43\x5c\xf6\xb9\xe2\xf7\x81\xdb\x34\xdd\xd1\x6f\xe5\x05\xdc\x93\x3f\x6a\xd3\xbe\x8b\x70\x15\x21\xfc\xcf\x2e\x17\x7f\x44\x08\x9c\xd1\x3d\x23\x30\xa0\xe7\x8d\x5e\xd9\xaa\xc7\xd1\x70\xb8\x24\xd1\x45\xfc\xe9\x7f\x5d\xb0\x87\x3f\x1f\x91\x11\xfa\x2f\xb1\x50\x92\xbe\x28\x58\xba\xef\x4d\x89\x3c\xb0\x39\x67\x25\xce\xc3\xdb\x3f\x6a\x35\xcf\x12\x5e\x64\xe4\xf8\x5c\xf1\xbe\x8b\x80\xbb\x4c\x96\x85\x9e\x4d\x26\xd3\xc4\x98\x0d\xce\xd9\xb2\x30\x37\xd2\x79\x30\x8b\xda\x1f\xa2\x5d\x7e\xa9\xaf\x94\x98\x41\x1e\x06\x5d\x33\x8e\x75\xc4\x92\xb9\x36\xd7\x83\x1c\x83\x6b\x62\x8a\x96\xb0\x01\x23\xf2\xa1\xcb\xdc\x65\x36\xa7\xef\x0b\x35\xdb\x5c\xbc\xd5\x9b\x06\x62\x42\xbd\x61\xc7\xc0\x2f\x67\x7d\x15\xbe\x1d\x34\x1e\x7f\x1a\xdc\xd6\x6e\xd4\xc0\xe8\x7b\xe3\xb6\xde\x6f\xf2\xcd\xae\xcd\xf8\x15\xbe\xc9\x3d\xeb\x39\xc6\x4f\x64\x55\xf5\x9c\xe1\xb9\xac\xaa\x01\x86\x3a\xc2\xae\x40\xb7\xd8\xca\x68\xd0\xcb\xc8\x46\x89\xa5\xac\x8b\x0a\x01\xa9\x0b\xd5\xaa\x66\x55\xd6\x4a\x6c\x97\x0a\x35\xc6\x1a\x3d\xf6\xbf\x3e\x88\xdc\x3d\xe1\x41\x80\xd7\xa4\x79\x30\x5f\x9c\xd9\x4f\x81\xd8\xdd\xe0\x1a\x67\xb7\xe7\x4e\x49\x1e\x42\x70\xf5\x9c\x16\xfc\xd5\xbe\x7b\x37\x7d\xd5\xb0\x9b\x9b\x6e\x74\x34\x58\x1c\xd6\x0d\xaf\x29\x25\xac\x0b\x2d\x4e\x23\x9b\xfa\x4f\xe5\x5c\x00\x52\xd5\x5e\xaa\xbe\x67\x32\x77\x72\x7e\xd0\x57\xbe\xe7\xfc\x60\xfc\xc1\x6d\x70\x44\xd8\x0d\xff\xea\x3d\x6d\xa6\x91\xcf\x3c\xd4\xc0\x7e\x93\x0f\xd9\xba\xb1\x33\x3d\xaf\x9c\x0b\x5b\x38\xf8\xc0\xd2\xea\xb8\x75\xf8\x29\x50\xa7\xc3\x58\x31\xb7\x92\x4e\x4f\xf6\xf1\xa3\xf8\xf3\x5f\x7e\x5c\x0a\xf5\x9c\xbc\x19\x7b\xce\x98\x73\x76\x4c\x07\x35\x11\x97\x6a\x77\xe8\x51\x73\x7d\x5d\x73\xbb\xfd\x50\xc3\xa0\x0e\xdb\x72\x1c\xf4\x4f\x60\xdf\xfb\x56\xf5\xae\xb6\x9a\x72\xed\x75\xd5\xdd\xc1\x61\xa2\x9f\x88\x90\x8f\x92\x2b\x1a\xf9\x28\x31\xb7\xd1\xf8\x3b\x3a\x28\x1f\x45\x3b\x6d\x85\x27\x51\xeb\x42\x19\xb2\x1b\x82\xd5\xf2\x52\xed\xbc\x2f\x74\x70\x7d\xab\xc1\x44\x6d\xc0\x36\x45\x71\x2d\x97\x6a\xa7\x0a\xae\xfd\x02\xcd\x80\xa5\x42\x65\xbd\xa1\x54\xb5\x68\x10\x2d\x51\x37\xad\x37\xad\x90\x33\x8d\x82\x70\xac\x57\xab\x75\x0b\xaa\xf2\x0f\x6d\x68\xd0\x76\x39\x1d\x2d\x04\x82\x17\x5f\x58\xbe\xff\x03\xb4\xa7\x03\x32\x11\xef\x80\x4b\x1a\x83\x42\x7d\x9f\xd6\xdc\x6c\xcb\x76\xbe\x14\xde\xad\x66\xea\x42\xb2\xb8\x02\x68\x2e\x8d\xca\xf8\x37\x3f\xf2\x05\x44\xe4\x49\xe7\x01\x91\xb0\x45\x2f\x99\x65\x1c\x99\x4f\x92\x8a\xb8\xf2\xef\xf7\x93\x00\xdf\x3a\x02\x6e\x04\xff\xa8\x43\x29\x82\x6f\x88\x93\x06\xf7\xe7\xfd\xc8\xfd\x71\x7f\x68\x9f\xde\x47\x1b\xe5\xfe\x64\x7c\x0e\xd3\x09\x7f\xde\x2f\x39\xdd\xf8\xa8\xa5\x73\xfa\xbc\x23\x44\x21\x1b\xe4\x1d\xac\x7a\x2b\x5e\x73\x35\x3e\x4f\x96\xe3\x1e\xff\x7b\xee\xac\x79\x67\xf9\xfe\x83\xc6\x17\xef\x8b\x1e\xd1\xe5\x96\x56\xce\x77\x33\x6e\xfa\xc9\xe4\xbf\x38\xdb\x3b\x5d\xe6\xff\x3f\x6e\xc2\x5f\xf6\xb2\xf0\xb7\x3c\xe5\x2f\x1d\xef\xeb\x2f\x4b\xe2\x1a\x1b\x15\xbe\xd6\xfa\x7c\xb9\x7f\x7d\x58\x70\xe8\xb8\xf5\xf9\x5d\x2f\xc7\x78\xcb\xeb\xf3\xbb\x6b\x4d\xf9\x77\xf1\x94\x93\xa9\x43\x42\x09\x17\xfb\xc4\x5c\x27\x3f\x7e\x4c\xc2\x3c\xfc\xa7\xd4\xd5\xda\xf5\xf3\xcf\x23\xc8\xe8\x35\xe8\x66\x48\x6a\xc0\x97\xe2\x9f\xf7\x2f\x45\xb2\x0c\xff\x7c\x96\x4e\xfd\x40\xf7\xdc\xe8\x39\xcc\x60\x87\xc4\xcf\x62\x1e\x40\x23\xe3\x12\x9a\x18\x13\xa2\x30\xff\xbc\x5d\x1f\x19\xea\xb7\x95\x4e\x98\x69\x5d\x15\x23\xd9\xad\x18\x24\x01\xb3\x5e\x61\xac\x2f\xda\xe1\x21\x0a\x60\x22\x74\xbb\x54\xcd\xb6\x34\x8a\x8f\x67\x1a\x0c\xeb\x18\xfb\xed\xba\x0d\xea\xd2\xaf\xfd\x6f\x60\x1b\x7f\xc4\x53\x28\xfc\xa3\x72\x7a\x76\xde\x7d\x8e\x02\x1d\x47\x99\x8e\x86\x74\xc8\x7c\x11\xb6\x3d\xe1\x15\xb3\x34\xe5\xef\x86\x9d\xc3\x68\xfc\x73\x2e\xff\xf5\x94\x3c\x8c\xf1\x4b\xd6\x34\x2f\x97\x76\xaf\x52\x87\x01\x1c\x12\xf9\xdc\x9f\x4f\x79\x4e\x65\xc0\x4c\x31\xe2\x0e\x8f\xe2\xf6\x32\x47\xaa\x3b\xa4\x6b\xb3\x43\xe3\x37\x2a\x9a\x71\x57\xa3\xfd\x13\x98\xee\x28\x76\x08\x32\xb1\xb5\x00\xf7\x72\x53\x42\xe3\x1b\xbc\x39\xb9\x49\x5b\xdc\x95\xaa\x2a\xa6\x9d\x9d\x72\x1b\xd4\x0d\x5f\xea\xec\x50\x4e\x8f\xfc\x13\xd8\xa3\x51\x2c\xd9\x35\x0f\x65\x4e\xf5\xf9\x23\x4f\x39\x99\xfa\xcd\x58\xb2\xa1\x87\xa6\x67\x44\x6c\xd1\xaf\x45\x1b\xf7\x70\x6d\x3f\x13\x86\xcb\x32\xb4\x2f\xe5\xfa\x38\xf5\x83\x8b\x78\x5a\x74\xee\x29\x3e\xfc\x64\x54\x5e\xce\xe5\xbb\x56\x25\xd8\xf7\xe0\x03\x24\x03\x57\xf3\x4b\x20\x5c\x1a\x52\xdf\x37\x8c\x6d\x51\x5b\x24\x62\xce\x47\xe4\x52\xa1\xc3\xfe\x4c\xb7\x4b\xf0\x69\x6f\x7d\x77\x13\x44\x13\x07\x86\x91\x2b\xb5\x30\x8e\xb4\x70\xe1\xbe\x1d\xdf\xc5\x0b\x05\x42\xc1\x8b\xe2\xc3\x49\xc8\xb1\x95\x39\x82\x79\x96\x87\xb7\xfe\xf7\xcf\xf6\x80\x10\x35\x72\xc1\x62\xea\xe6\xa0\x8a\x60\x21\x59\x5c\x1a\x28\x99\xd2\x75\x0d\xf7\xe7\x9a\x9c\xd3\x08\xda\xf0\x3e\xde\x99\xd1\xcc\xd3\x80\x76\xec\x53\x4e\xb6\x1d\xe0\xa0\x7a\x86\x30\x48\xc0\x6f\xa6\x17\xe2\x1d\x7e\x7e\x97\x7b\xb7\x87\x99\x8a\x07\x72\xa3\xa9\xdf\x90\x29\x3a\x94\xe8\xf8\xf6\xf6\x93\x1e\x9c\x71\x96\xee\xf4\x6c\xc9\x17\x07\xd2\x9f\xcc\x5a\xe7\xd8\xa2\xb8\x8f\x1b\xad\xf6\x78\x8d\x13\xef\xf3\xcb\x1f\xed\xa8\xe5\x58\xa4\x78\x28\xa3\xa7\x9f\x2c\xc3\x2d\x68\x9f\xf8\x38\x7e\x77\xf0\x56\x1f\x4a\xd3\x7e\xf7\xb3\xe7\x7a\x22\x04\x38\xe3\x21\xe0\xd0\x2b\xb7\xd8\x58\x99\x46\xb6\x0a\x00\xe7\x09\xf2\xe2\x52\x81\xef\x3d\x00\xb1\x25\xd1\xcf\x34\xe9\x7f\x51\x3b\x0c\x95\x99\x88\xcb\x5a\x6f\xeb\x7f\x51\x3b\xef\xba\x9c\x99\x62\x17\x36\xcd\xe3\x9d\x0d\x04\xef\x85\xa6\x53\x25\x8a\x7b\xb6\xe7\xd7\x7f\xb3\x87\x9f\x85\xfd\x77\xb9\x03\x9a\x46\x28\x72\xfc\x76\x04\x95\x9a\x87\x76\xe3\x9f\xd9\x02\x39\xfe\x3e\x40\x38\xc4\xb4\x62\xd6\x28\x79\x99\xbb\x78\xae\x1d\xbf\x54\xbd\x82\x21\x2b\x01\x54\xf9\xad\x6a\x8f\x93\x97\xd9\x17\x99\xca\xa2\x38\xee\xbe\xdc\x7b\x47\x71\x3f\xb4\xb0\x94\x06\x5a\xe8\x1d\xc6\x75\xfa\xe8\xe0\x93\xd5\x73\xbd\xa9\x5b\x48\x6c\xdb\x6e\x75\x08\x68\x72\x11\x46\xc2\xc8\x15\xbc\x39\x13\xf1\xd7\x5f\x99\xbf\x52\xd0\x35\xac\x02\x01\x97\xcd\x94\x03\x2d\xf3\xc0\xc2\x01\x6e\x66\x25\x4b\x70\x55\x71\xc1\x4a\x80\x4c\xd9\x12\x7c\x82\x04\x80\x4d\x0f\x5d\x28\x5e\xe9\xfa\x21\x35\x45\x3a\x57\x82\x83\x89\xe2\xac\x66\x84\x8e\xe6\x2f\x5e\x21\x64\x5d\x9c\xea\x46\xe8\x55\xd9\xda\x7f\xfe\xf7\x7f\xfe\x17\x0c\x7d\xa6\x96\xf2\xaa\x44\x74\x99\x38\x4d\x54\x81\x4d\x60\x38\xdd\x1c\xf0\xd6\x01\x9f\x4d\x2c\x36\xed\xa6\x51\xe2\x4a\x35\xc6\xc3\xa6\xc1\xe4\x47\x61\xa7\xf5\x6c\x41\xa1\x16\x72\x53\xb5\x8f\xfa\x4a\xf0\x9c\x96\xb9\x8b\x1b\x8b\x5e\x2e\xea\x44\x39\x72\x0e\x6f\xc5\x9e\x28\xb6\x40\x4d\x33\xcc\x66\xea\x13\x2f\xab\x0b\xdd\x94\xed\x72\x45\xa9\xf3\x7d\x44\xfa\x6c\x27\x8c\x92\x0d\x86\x9e\x43\x28\xbe\x65\x42\x8c\x50\x75\x61\x84\x29\x31\xa8\xd5\x35\xc5\x18\xa0\x99\x9c\x5f\x7a\x24\x61\x4d\x01\x23\x66\x2a\x5e\x1c\xad\x44\xdb\xec\x28\xb0\xc9\x28\x25\x96\x7a\x2b\x16\xd2\x07\xad\x5f\x28\x1f\x19\x4b\x07\x52\xb6\x62\xa5\x0b\x55\x01\x0b\x54\xb6\xd8\xf5\x66\x4d\x51\xb2\xb6\xa5\xad\x6e\xe8\xe8\xb6\x8d\x2c\x94\x5e\x2c\x10\x3f\x7b\x2e\x3d\x80\x31\x85\x18\x43\xb8\xce\xd4\x47\x60\x3e\xbb\x72\xe7\x5e\xc2\x5d\x50\x75\xa1\x0a\x37\x79\x58\x2c\xdb\xce\x51\x41\xf1\xdb\x2c\x52\xdf\xb1\x66\x96\xe8\xf9\xf1\xc2\x13\xe1\x33\xac\x88\x05\x84\x03\xd8\x93\x86\x59\x6d\x66\xcd\xa6\x85\x9a\x73\xe5\x43\x84\x65\x53\x1a\xf0\xa0\x73\xe8\x07\xae\xb1\x0b\x0d\x2b\x4e\xdd\xbc\x94\xeb\xa9\x78\xd1\x1e\x15\x02\x31\xed\x34\x60\x90\xea\x46\x89\x65\xd9\xb6\x3e\xea\x13\xa0\x03\x30\xe0\xb3\xf4\x53\x5f\xe8\x66\x2b\x9b\xe2\x21\x84\x33\xd8\x95\x84\xc1\xc0\xbf\x2e\x34\xef\x41\x68\x8a\x51\xae\x75\x5b\xce\x95\x8f\x65\xac\x15\xe9\xed\x4e\x4f\x45\xa5\x5b\xc0\x95\xa9\xb4\xbe\x14\x72\xa9\xa4\x43\x7a\x28\xb4\x32\xb8\xfb\x75\x51\x29\x8a\xf3\x96\x95\x90\x46\x6c\x55\x05\xff\xf7\x2b\xec\x1a\xc3\x93\x05\xc8\x36\xb6\xaf\x23\x7b\x67\x37\x66\x23\xab\xa9\xf8\x46\x99\x12\x24\x6b\x37\xbe\xfc\xf6\x88\x56\xfb\xd5\xd7\xcd\xa5\x3d\x69\x0e\xce\xcc\xd0\xd6\xb9\x00\x8e\xb9\x5e\xef\xa0\xa5\xed\x52\x57\x90\xe2\x3c\x9c\x83\x17\x35\x41\x1c\xe0\xd2\x01\xc7\xe5\x36\xbf\xaa\x30\x4a\x1c\x30\x11\xe0\xac\x84\x25\xb7\xe7\xbc\x88\xce\xc0\xb1\x2c\x0a\x52\x54\x52\x54\x2d\x06\x8a\xbe\x94\xeb\x13\x4b\x6f\xec\x74\xe0\x1b\x85\x8d\x9c\x62\x88\x8f\x1f\x08\x22\xd4\x10\x7d\xa2\x00\xe0\x42\x4d\xd0\x77\x79\xe3\x30\xb7\x13\x72\xe0\x58\xc4\xe3\x13\xb1\x5d\x96\xf3\xa5\x6b\x6d\x63\x28\xcd\x12\x50\x74\x7f\xc7\xa7\x31\x5b\x75\x7a\x2a\x80\x6a\x4c\x84\x83\x12\x45\x9d\x2e\x53\x64\x44\xef\x20\x0f\x1b\xd3\x8d\x38\x06\x10\x34\x08\x34\x13\xa5\xf8\x3d\xa7\x3a\x84\x83\x7c\x26\xca\x5f\xff\x3a\x65\x59\x89\x91\xe1\xc5\xff\x5c\x32\xd0\x28\xde\xe5\x7e\x36\x2a\xcb\xd8\x21\x04\x96\xd9\x54\x76\xb7\x02\x61\x8c\xe6\x80\xc9\xcc\x51\x69\xfd\x8a\x02\x67\x7c\x01\x5f\xc2\x5b\xf7\x7a\xe3\x66\x5d\x84\x3e\x0b\x54\x0a\xb1\x77\x94\x1c\xc5\xca\x1d\xc9\x6f\x1f\xda\x6f\x43\xd3\x61\x54\xb0\xae\x67\x19\xa3\x22\x6a\x66\x6c\x43\xf9\x85\xc6\x8f\x7c\xb5\x29\xf2\x8c\x87\xd6\x7d\x25\x9c\x24\x10\xb6\x24\x19\x8a\xab\x11\xf6\x43\xe7\xc6\x99\xd1\xf9\xf6\x34\x14\x87\xd4\xc6\x58\x66\x75\x58\xf7\xf1\x56\x5d\x7b\x5e\x70\x1a\xfd\x3e\x9c\xa4\xe6\xa1\xc6\x33\x3c\x9e\x0f\x13\x78\x87\x10\x28\x4a\x5e\xc2\x6b\x85\x18\x12\x06\x88\x1d\x10\x5c\x58\x7c\x1f\xda\x25\xde\x01\xb5\xe2\xcd\x6c\xea\x85\x6e\xda\x0d\xc4\x70\xb1\xa8\xdc\xb6\x29\x2f\x2e\x10\x73\x45\xd9\xf6\xb6\x48\xa2\x11\xaa\x46\x41\xdc\x28\x84\x9a\x79\x12\xeb\x9e\x2b\x31\x53\x6d\x0b\x40\x5f\x3b\x24\x5e\xab\xd5\xa6\x46\xa1\xc3\x07\x29\x50\x7c\xa9\x90\x20\x84\x58\x61\xc4\x65\x01\xf6\xed\x50\xaa\xe7\x49\x80\x1c\x9f\x08\xd5\xce\x83\xb2\x80\x1f\x8f\x1e\x36\x98\xef\x3c\xdb\x5c\xae\x39\x1f\xe0\x71\x86\x62\xe0\x32\xf9\x23\xb0\xa7\xb1\xb1\x71\xc2\x87\xf9\x92\x78\xea\xd6\xb9\x9d\xc0\xab\xb2\x55\xa2\x28\x29\x67\x9c\x4b\x68\xe6\x7d\x45\x29\x3e\x19\x94\x34\x71\x7b\x3e\xe6\x0f\x21\x08\xa2\x5a\x28\x95\xb0\xf2\xbd\xe8\x06\x6e\x36\x27\xdd\x95\x72\xff\xef\x52\x8c\xf1\xb1\xb3\xc5\x87\xe8\x9c\x77\x89\xd8\xd0\x79\x07\xff\x7d\xbd\x69\x11\xdc\x47\xd9\xe7\x7c\x4d\x0f\x39\x30\x06\x88\xd9\x64\xfc\xeb\x8b\x0f\x63\xb3\xa9\x79\x38\x68\x96\xb2\xb2\xe0\xc3\x2c\x7d\xf0\x43\x78\xaa\x16\xaa\x71\x51\xee\x20\x62\x63\x88\x35\x18\xf5\x10\x2c\xa7\x29\x2f\x96\x2d\x05\xbd\xe3\x48\x4a\x03\xbb\x3b\xe5\xcd\xbd\x98\xaa\x29\x56\x87\xb4\xfa\x70\x55\xc1\x65\xca\x50\xd4\xbb\x87\xd2\xf1\x6c\x5c\x01\x7d\xdb\xe6\x78\x43\xf0\x36\xcb\xf9\x92\x35\x11\x72\x94\x01\x4e\x8d\x7d\x84\x91\xc9\xdd\x72\xd4\xa9\x40\xb5\x78\x73\x5e\x9e\xf2\x46\x51\x5d\xb3\x70\xda\x74\xc3\x78\x64\x76\xba\x88\xf7\xf2\x55\x32\x45\x07\x2f\x2b\xd3\xff\xbb\xe7\xe8\xfc\x3c\xf3\x8e\xc4\x80\x48\x80\x19\xd2\xd8\x85\xa1\xfb\xa5\xea\xc2\x9d\x9b\x28\xe2\x15\x30\x0c\x64\xcd\xaf\x4d\xa3\x8c\xdf\xac\x51\xd8\x2b\x9d\x4b\x43\xd2\x51\xe6\xb4\x75\xe6\x34\x40\xc7\x90\xb5\xb2\xe4\x20\x88\x28\xb2\xb6\xec\x70\x93\xde\xed\xc6\xa5\x81\xad\xc5\x7c\xa9\xb5\x01\xc8\x47\x69\x90\xb9\x0e\xcd\xa1\xec\xe3\xe6\x28\xb6\xa5\xe5\x71\xab\xca\xca\xaa\x3e\xdc\xd9\xf3\x50\xf4\x9e\x1f\xf8\x74\x93\x6e\x8f\x3d\x8f\x7b\x5d\xcb\xc7\xbc\x8a\xa4\x76\x78\x9f\xc6\x47\xe3\x1f\x67\x89\xcf\x91\xf7\x41\x72\xf5\x7e\x3c\xbd\x3a\x80\x62\xdd\x2e\xcd\xea\xa3\x5a\xef\xd3\x6b\x94\x35\x66\x0f\xdc\xd8\x5c\x03\xbd\x37\x3d\x57\xfe\xd3\x61\xc7\x9d\xa0\x69\x24\xe3\x4a\x50\xce\xb8\x54\x08\x45\x63\x17\x01\x60\x66\x40\x52\xdb\xb8\xcc\x9d\x3d\x80\x31\xfb\x41\x72\xd8\xbd\x74\x03\xf8\x17\xa5\xd6\xc2\xcc\x65\x0d\x78\x22\x56\xa6\xf4\x39\x43\xe5\x1a\x1d\x39\x30\xc1\x02\x5e\xfc\x02\x00\x06\x20\x39\x89\x95\x79\x68\x40\xd7\xbb\x19\xd1\xbd\xf8\xdc\xf3\x8d\xd7\x34\x4e\x8f\x65\x25\x43\x8f\x29\xe3\xb2\x9f\xbd\x49\x5b\x60\x6c\x4d\xde\x47\x81\x74\x33\x48\x62\xc9\x39\xd1\x64\x50\xe7\x90\xd1\xf1\x0a\x6a\x82\x24\xec\x78\xc5\x84\x80\xf4\x04\xa5\x64\xeb\x92\x53\x05\x2f\x48\xcf\x91\x06\x1e\x28\x6d\xae\x6c\x51\x19\x04\x6a\x0c\xb8\x44\x00\xbf\xc6\x00\x90\x90\xd0\xc6\xc8\x6e\x0e\x5d\x2d\x6d\x0d\x50\xd6\xa2\x1f\xd3\x1d\xfc\xf3\x11\x8e\xe3\xe8\x2f\x7c\x0d\xfb\x4c\x3b\x71\x91\xac\xf1\xe5\x70\xb2\xf6\xf9\x2d\xd3\xb5\x3d\x94\xe8\xf3\x1b\x93\xa2\xcf\x0f\xa5\x45\x9f\x67\xa5\xe8\x31\xe7\xdb\x92\xa3\x7a\x97\x79\x48\xe9\x34\x20\x44\xde\x5c\xd7\x66\xb3\x52\x85\x90\x33\x4b\xca\xed\xcf\x8e\x36\xa4\x42\x10\x22\x18\xc9\x82\xf0\xb3\x92\xf3\x13\x1d\x98\x8e\xa9\x6b\xa1\x9b\x67\x72\xbe\x3c\xee\xc9\x55\x23\x02\x95\x1d\x06\x26\x0b\x4a\x85\xd8\x1c\x35\x4c\xa2\xf7\x68\x6e\xbd\xaa\xe6\x00\xe5\xad\xd3\x68\xed\x53\xe2\x96\x4c\xd9\x93\x04\x83\x4a\xd3\xa7\x44\x3e\xf1\xd9\xc9\x2c\x1d\x09\x39\x65\x7d\xb2\x12\x87\x78\x1c\xb4\x21\x51\xde\x81\xbc\x85\x92\x8d\x9a\x16\xef\xfe\x88\x0c\x02\x39\x84\xec\xc7\xb5\xcb\x9c\xe4\x1c\xfe\x28\xb9\xc0\xac\xba\x8b\xf4\x3a\xa9\x66\x0c\x32\x40\xc9\x99\xf6\x6b\x03\xb9\xa2\xa4\xf1\x47\x9c\xbd\x0f\x89\x6d\x92\xad\xc1\x54\xd5\x6d\x53\xaa\x34\xef\x70\xca\xea\xad\xb5\xb1\xf7\x58\xbd\x94\xeb\x58\x33\xe6\xda\x49\x08\x4d\x28\x1e\x75\x10\x56\x38\x49\xa4\x48\x96\xa0\x34\xf5\xd5\x44\x1c\x7d\x97\x9d\x5b\xce\x8a\x02\x8c\x2e\x2d\x34\xb8\x5a\xa2\x5d\x65\x53\xab\x80\x95\x6e\x2f\x86\x99\x8a\x27\xba\xbe\x52\x4d\x4b\x0f\x80\x14\x46\xfd\x6d\xa3\xea\xb9\x3a\x75\xfb\x27\xd0\x8a\xa7\xa8\x0d\x9e\xbb\xc5\xf8\x73\x37\x3e\x8f\x8d\xfb\x93\x49\xed\xe5\xd2\xd0\xc7\xe4\x90\x67\x89\x1c\x52\x81\xa2\x14\x54\x55\x08\xcd\x27\x8a\x72\xb1\x50\x10\x7f\xeb\x2f\x09\xc2\x80\x39\xce\xd3\x72\x52\x90\xaf\x7a\x9a\xf0\x2b\x8c\xe5\x0a\x9b\x14\xe3\x75\x77\x6f\x4e\x60\x1d\x5c\x81\xf4\xdc\xf4\xa9\x67\xa9\x63\xd3\xaa\x35\xd1\x79\x4f\x24\xad\x70\xc8\x4d\x99\xc4\x87\xdd\x87\xc2\xd3\x42\xd7\xea\x6c\xa8\x62\x7c\xb0\xb8\x3e\x17\x1b\xe8\x84\x2c\x5d\x4f\x9d\x9b\x6a\x4c\x98\x62\xf7\xba\xab\x79\x9f\x7f\x1b\xce\x36\xff\x38\x50\x1a\x47\x83\xd6\x8d\xbe\x2a\x0b\x55\x88\x5a\xfb\x3e\x33\x04\xe4\xef\x53\xf3\xec\xbf\xd2\xbe\xf7\x9d\x97\x21\xed\xf4\x7d\x76\x7e\x1c\xdf\x3e\xe9\x6f\xf0\xe7\xab\xa7\x0e\xd7\xe0\x17\xf5\xf4\xcd\xd4\xd3\xf7\xbd\xec\xf9\x8b\x5a\xfa\x17\xb5\xf4\x2f\x6a\xe9\x9f\xb3\x5a\xda\xbf\x1e\xbf\xa8\xa0\xef\x46\x05\x7d\xed\xf7\x39\x51\xba\x7d\x31\xa4\x8d\x1e\xf1\xf6\x25\xfa\xb0\x2f\x7a\xa8\xe8\xcd\xb5\xd1\x5f\xfc\x3d\xab\xa3\xbf\xb8\xb1\x12\xe8\x8b\x43\x95\x40\x5f\xfc\xa2\x91\xbe\xd9\x45\x89\xae\xc9\x97\xd7\xd5\x4d\x8f\x64\x1f\x59\x47\x39\x35\xf2\xb5\x74\xd3\x5f\xfe\xa2\x9b\x66\xad\x5d\x4f\x37\xfd\xe5\x7e\xdd\xf4\x97\xb7\xa8\x9b\xfe\xf2\xc7\xd5\x4d\x7f\x79\x63\xb2\xf4\xe5\xa1\x64\xe9\xcb\x5f\x74\xd3\x77\xa6\x9b\x46\xd0\xec\x41\x58\x68\xae\x99\x1e\x01\x10\x8d\xe4\xc1\xa5\xcc\xf7\x1e\x98\x10\xf8\x64\xe9\x2b\xf8\x7a\xeb\x9a\x85\x50\x7a\x5f\xe2\x88\x3d\x72\x8d\x91\x98\x89\x32\x22\x2c\x7b\x80\xd7\xee\x8c\x30\x87\x58\x1c\xbe\xfa\xc4\xaa\x59\x70\xea\xef\x43\x76\x14\x62\xd0\xc2\xc1\x81\x90\x2c\xa3\x45\xa5\xda\x23\x83\x3e\xa1\xe4\x90\x59\xb6\xf0\xd8\x44\xe4\xc8\x9e\x92\xeb\x70\x9f\xdd\x01\xd3\xf5\xf1\x5b\xbe\x07\xf0\x6e\xec\x56\x9d\x25\x67\xf4\xda\xe8\x77\xfe\x35\x60\x22\x6c\x48\x39\x13\xa1\x82\xf8\x35\xdc\x06\x22\x8e\x5c\xa4\x15\x42\x5c\x5b\x61\x2d\x63\x19\x57\xd7\xee\x8d\xbe\x66\x1a\x9f\xa0\xff\xba\x6b\xcc\xf1\x51\x50\x66\x5d\xa0\xb9\xc1\x0b\x3a\x84\xe8\xcd\x37\x7d\x0f\xb6\x77\x08\xb0\x71\xb0\xd4\x3e\xc4\x86\xeb\x71\x47\xa4\xfc\xc9\x70\x07\x9e\x3b\x7e\x81\xf1\x39\xfe\x05\xb4\x7b\x3a\xef\xc4\xe3\x91\x08\xdc\x7a\xa6\x59\xae\xd7\x55\xa9\x8c\x73\xeb\xf6\xd7\xc8\x3b\x66\xaf\x04\x46\x96\x44\x64\xd6\xe7\x39\xeb\x43\x3c\x08\x05\xdc\xed\x77\x51\x6e\xe2\xeb\x08\xc3\xbc\x2f\x0e\x58\x3c\xa2\xd1\xef\x41\x3e\x1f\x7f\x38\xb3\x57\x7b\xf0\x7a\x47\xbb\x3b\x3c\xda\xaf\x63\x10\xf5\x80\x79\xfa\x68\x24\xba\xba\x18\x44\x58\x8f\x46\x92\xad\x33\x06\xa3\xeb\x87\x2c\x57\x35\x1a\x6b\x3d\x53\x69\x18\x6f\x5d\x24\x81\x51\x59\x82\x26\xf2\x3c\xcd\xf8\x3d\x1d\x8a\x0a\xfa\xd4\xa7\x7d\x1a\xfb\xd8\xd3\xff\xfd\x1d\x5d\x66\x92\x15\xf9\x87\x71\xcc\x49\x49\xd2\xf9\xec\x45\x82\xcc\x1f\xab\xc3\x01\xcd\x18\xe9\xb9\x03\x88\x58\x0e\xc8\xf6\x7f\xdd\x1d\x3e\xbe\xef\xa2\x0f\x21\x3f\x43\x95\xbb\x95\x47\xce\xd7\x97\x0f\x0f\xef\xe0\x6b\xd1\x0b\x9c\xcf\x07\x35\x04\xa1\xcf\x02\x31\x65\x55\xfd\x43\x3e\x12\x3d\x80\xfe\x87\x11\x84\xeb\x10\xf9\x41\xec\x7c\x71\x20\x9d\xfd\x39\xd3\xb9\x3b\xcd\xa5\x70\x17\x4c\xdc\x40\x8e\x02\x7e\x31\xf1\xfb\x50\xb6\x82\xb1\x22\x16\xf8\x68\x98\xa0\x2b\xde\x1d\x35\x4a\x00\x68\x7c\xa5\x8c\x99\x8e\xbd\xd2\xfe\x72\xf4\x24\x03\x8c\x2f\x4e\x6f\x8a\x84\x1b\x5e\x9c\x3d\xd7\x66\x30\xb5\xc0\xf8\xe4\x02\x87\x5c\xaf\x9e\xcb\xd5\x73\xf2\x0f\xba\x58\x1d\x97\x87\x3b\xcf\x25\x31\x2a\x93\xc4\x5d\xdc\x8a\x81\xcc\x0b\xfc\x56\x0c\xe7\x60\x08\x0f\x16\x21\xfd\xff\x23\x3e\x59\x2c\xc1\xc4\x83\x07\xee\x1e\xf5\xa4\x97\x38\xef\x4b\x2f\x91\xa9\x99\xf8\x13\x9e\xef\x4f\x2e\x71\xe3\xcb\xbe\xf7\xba\x1f\x96\xd0\xe1\xb0\x7b\xfd\x0f\xfc\x6c\xde\x46\xa2\x8f\x9b\x10\x09\xe7\xce\xfa\xf8\xf5\x0b\xb4\x69\xda\xb3\xed\x95\xf9\x31\x52\x45\x48\x7a\xee\xcc\x70\x3e\x43\xa7\x24\x6d\x3e\x58\x04\x8c\xaa\x16\x90\xc7\x7b\x87\x4d\xce\x14\x4f\xb1\x1b\x37\x04\xd6\x02\x08\x5b\x07\x1f\x3e\x80\xae\xd9\x5c\x40\x87\xd8\x9c\x1f\x87\xa4\xac\xe1\x6b\x09\x99\x37\xfa\x1d\x7f\x61\xd2\x66\xb4\xcf\xef\x3e\x47\x5f\xdf\x0b\x29\xd7\x1a\x35\xdf\x34\xa6\x74\xb9\x22\xd1\xd2\x0c\x0e\x3c\x7a\x2d\x2a\x75\xa5\x2a\x22\x31\x90\x8d\x51\x36\x8d\xdc\x81\xe3\x40\x6b\x57\x1e\xb4\x97\x06\xdc\x33\x61\x11\xbd\x50\xe7\xda\x02\xf5\x9d\x2d\xe0\x12\x69\x4c\xc5\x2b\x65\xc0\x1f\xd4\xb6\x84\x8a\xdc\xa5\x42\xa0\x64\x88\xff\xf7\x6b\xdc\xd2\x19\xa3\x24\xa8\xa7\xa7\xbe\x0d\xd4\xfa\x4e\xc5\x1b\x1c\xba\xae\xbd\xbd\x94\x9c\x2c\x6a\xdd\xac\x64\x25\x16\x95\xde\x86\xf0\xf8\x3f\x22\xb8\x40\x98\xd6\xa6\x46\xff\x51\xd7\x2c\x18\xf3\xd0\xe0\xb4\x43\x25\x3e\x8e\x71\x1a\xad\x5f\xa5\x64\x61\x40\x89\x5f\x0b\xb9\x9a\x95\x17\x9b\xb2\xdd\x89\x99\x6a\xb7\x4a\xd5\xe2\xf7\x5f\xfd\xf0\xe7\xe9\x74\xfa\x97\x4f\xbf\x3f\xfd\x0a\xb6\xf8\xf7\x5f\x4d\xa7\xd3\xdf\x9f\x7e\xe5\x1b\xf9\xde\x2d\x9d\x1d\x28\x36\xa0\x37\x06\x70\x00\x0c\x19\x10\x9c\x23\x76\xd0\x53\xab\x5a\xce\x2c\xff\x27\xe7\xad\x57\x3e\x3d\x78\x90\x47\x37\x1c\x02\xe2\xe3\x3f\x0e\x6b\x81\x78\xc1\x3c\xfc\x69\xe8\xb5\x0f\xa5\x2e\xb5\xf1\xd2\x0e\x90\x3b\xa4\xed\xde\x78\x8a\x52\x1a\xc4\x75\x12\xe7\x87\xcf\x8a\x01\x63\xbb\x66\x6e\x1f\x71\x90\x08\x4e\x27\x53\xe8\x35\x15\xad\xbd\xd7\xd5\x99\xa4\xc5\x08\x28\xbd\x91\x63\x1a\x25\xce\x0f\x0d\x28\x33\x9e\x1e\x7c\xbb\x91\x23\x1a\x29\xc9\x1c\x38\xa6\x1e\xe4\xa8\x91\x63\x1a\xc9\x47\xee\x1f\x53\xc7\xca\x78\x3b\x20\xa5\x23\xa7\x31\xda\x14\x37\x0c\xfa\xd9\x45\xfd\xcc\xa0\xcc\x75\x06\x77\x43\xb0\xa1\xfd\xd0\xa3\x7b\x31\xed\xfa\x06\x72\x70\xec\xcc\xfe\xb1\x74\x69\xcd\x4f\x13\xa8\x6e\xb0\x55\xef\x3c\x7b\x94\x7a\x9b\x45\xfe\x71\x18\xcd\xe1\xfd\x6c\x1d\xf3\x42\xab\xcd\xdc\x38\x00\xcc\xcb\x94\xdc\x94\xe9\xf1\xbd\x26\xb8\x40\x60\x18\x6d\x1a\xdd\x00\x28\x13\x5a\xeb\xa9\x21\x78\x13\x00\xff\xa8\x28\x8d\x7d\xf2\x8a\x49\x68\x67\x1b\xec\xab\xed\xb2\x51\x5b\x7c\x2d\xa7\x09\x9d\xe7\x2c\x67\x2b\x2f\x3a\x54\xfe\x49\x25\x8d\xf1\xda\x85\x7e\xb4\xc8\x14\xbb\x15\x1e\xa9\xda\xb4\xb2\x9e\xab\x98\x21\x0d\x92\xce\x59\x52\x07\x4e\x09\xd5\x99\x36\xaa\x2e\x54\x33\x7d\x5f\x9a\x97\x7a\x7e\xe9\xb6\x2c\x07\xaf\xef\x6c\xc9\x95\x5d\xab\x4d\xab\x1f\xae\xf4\xfc\x12\x78\x8e\x75\xa3\xe7\x0a\x78\x22\xc7\xa8\x1c\x45\x89\xf9\x31\xbd\x44\xda\x5e\x07\xe2\x4d\x74\x50\x61\x73\x70\xda\x84\x6e\xd4\xaa\xda\x0e\x54\x56\xd5\x4e\x2c\xd0\xbb\x9b\x78\x5a\x4d\x67\xe4\x43\x0b\x4b\x3b\x41\x00\x21\x42\x71\x32\x00\xf6\xc5\x9b\x72\x07\x18\x01\xad\xe6\x76\x1f\x54\xe4\xac\xaa\x4c\x55\xd6\xed\x43\xda\xfa\x87\xb6\xe1\x87\x95\x3d\x70\xa2\xd6\x0f\x6d\xd7\xd4\x73\xbc\xa1\x6e\x25\x65\x35\x62\x57\xed\x2e\xfa\x62\xc9\x36\xda\xc3\x17\xaf\x52\x37\xac\xe3\x57\xe6\x78\x3a\x9d\x9e\x3c\x12\xaf\x34\x02\x34\x6d\x21\x3a\xce\x36\x02\x9c\xa4\x5e\x09\xda\x67\xe4\x16\x01\x91\xaa\xda\x91\x63\x92\x74\xe7\x1c\x4e\x0c\x70\x71\xa5\x71\x28\x90\x53\xf1\x6d\x33\x41\x47\x33\xdb\x80\x65\x9d\x6d\x0f\x93\x28\x75\xc8\xd1\x24\x0c\x7f\x5a\x94\x66\x5d\xc9\xdd\x2b\xb9\x52\xf6\x19\x09\x1f\x6a\xfa\xe5\xc8\xff\x74\xd4\x83\x22\x2a\x22\x06\xcd\x0b\xa1\x8e\x1d\x6d\x14\xfa\xf3\x7b\x56\x1c\xc3\x07\xa6\x5c\x04\xbb\x81\x3d\x1d\x7a\xce\x52\x6c\x14\x7a\xce\xee\x7d\xba\x77\x0f\xe3\x61\xba\x1f\xc5\xb9\x80\x7f\xbd\x71\xdf\x9a\xe3\xb6\xd9\xa8\x09\xc4\x6b\x59\x2e\xaa\xaf\xe2\x8b\x1a\x7c\x9d\x32\xf5\x69\x97\x79\x03\x2b\xbd\xa9\xdb\x43\x2a\xc3\xff\x6c\xed\x90\xd3\xaf\xd2\x75\x24\xca\x79\x9f\xb5\xad\x6e\x2e\x5f\xd4\xaf\xc9\xe3\x0d\x49\xc1\xfd\x6c\x82\xc6\xb8\xe4\x34\x20\x79\xba\xcc\x8d\xe4\x0a\x94\x0b\x45\x7a\xa3\xcc\x66\x45\x50\x77\x97\x20\x91\xed\x54\x1b\x82\x3c\x55\xd1\x09\x42\xb2\x74\xab\xb7\x47\x2e\x05\xe0\xde\xf9\xad\x04\xd5\x00\x0e\xc8\x89\x06\xb9\x66\xce\xee\xc5\x61\x58\x5e\x8d\xf0\x7d\x54\xf8\x98\x37\x35\x89\x1a\x9e\xae\x55\x5d\x94\xf5\xc5\x6b\x34\x44\x47\x9f\x32\xcf\x76\x7e\x2e\xbe\x7f\x98\xb3\xfb\x47\xa4\x76\x88\x2b\x42\x53\xa4\xeb\xe3\x3d\x3a\x1f\xb5\x54\xf5\x97\x2c\x45\xae\x0e\xde\xca\x9c\x28\x15\x1c\xdf\xee\x76\x6d\x46\xcf\xfc\x13\x5b\x24\xee\xd8\x0f\x02\xd8\xa7\x7b\xf7\x7e\xa0\x5d\xb5\x2c\x89\x2a\x20\x80\xf2\xad\x33\x15\xbc\x51\x0b\x7b\x5f\x7f\xf8\xe4\x6f\x34\xca\xb2\xf6\x3e\x7c\xa3\x2e\xca\xda\xce\x4e\x9c\x0b\xe6\xda\xa6\xeb\x45\x79\x31\x11\x4b\x6d\x5a\xd2\x18\x4d\xc4\x72\x57\xe0\xe8\xfd\x2f\x66\xbe\x54\xc5\xa6\x82\xd5\x99\x00\xa7\xb1\x69\xd5\x33\x3f\xcb\xe7\xba\x61\xd1\x3f\x10\x9e\x06\x1e\x7f\x6f\x15\xb8\x6f\x91\x9f\x0e\x98\x5f\x6d\x77\xd3\xdc\x57\xc7\x81\x6c\x8c\x7a\xbb\xab\xe7\x6f\xb1\x47\xda\x1a\xac\xd6\xf9\xe4\xea\x60\x7b\x4f\xd5\xba\x29\x75\x53\xb6\xe5\xbf\xab\xb7\x9b\x59\xdb\x28\x95\x76\x99\x29\xe2\x6e\xc9\x7a\x63\x96\x7f\x0c\xab\x20\xce\xf9\x9a\x4c\x93\xaf\xae\x63\xfe\x33\xe8\x66\x07\xaa\xc1\x77\xd7\x9b\x25\x08\xcd\x1f\xdd\x3a\xc3\x06\xda\xaa\xc9\xc2\x4f\x33\xc5\x26\x9e\x03\x37\xaa\xdd\xdf\x42\xa6\x98\x6b\xa1\x6d\x76\xef\xf4\x93\x4a\x96\xab\x57\xea\x03\x95\xb1\x1c\xc1\x8b\xc0\x7e\x75\x9a\xdb\x57\xe7\xcc\xd1\xa7\xf7\xe1\xe4\x05\x56\x50\x9c\x8b\xdc\xcf\xf6\xe5\x3c\x1e\x79\xc4\x26\x62\xa5\x56\xba\xfc\x77\x45\xf7\x8e\xfe\x05\x13\x3b\x71\x33\x93\x85\x5e\xb7\xd0\x3e\x9b\x4b\x76\x44\xd3\x6e\x51\xd7\xc8\x5c\xd7\xa6\x6d\x36\xf3\x91\x0d\xe5\x8b\xbb\xc6\xf0\x7d\x1b\xd5\x50\xb7\xa8\xbf\x1a\x88\xa7\x3f\xaa\x95\x4c\xd9\x33\xa7\xb9\x05\x2b\xc9\x1b\xb5\x42\x25\x58\x69\xbc\x1b\x7e\x57\xae\x6c\x9f\x45\xa4\x4c\x14\x65\xa3\xe6\x6d\xb5\x9b\xde\x1b\xc6\x50\xe8\x7b\x7c\x27\xc0\xc7\xa6\x41\xd2\x7b\xfb\x1d\xd7\x5c\xfa\x35\x47\x87\xf7\xa1\xf6\x5e\xb3\x63\x64\x26\x9f\x8d\x4e\x3c\xde\x95\x02\x11\x1c\x42\x8a\x45\xa3\xcc\x12\x25\x42\xcf\x40\x83\x1b\xf4\x52\x02\x78\xeb\x4c\xa9\x9a\xba\x53\x85\x65\x31\x26\x21\x08\x11\x20\x56\x6d\x21\xef\xf4\x4a\x40\x01\xa0\x38\x9e\xa1\x8d\x0b\x80\x7d\x57\x65\x5d\xae\x64\xc5\x95\xea\x66\x2a\x5e\x60\x3c\x7f\x2c\x0c\x62\xcc\x92\x73\xa5\x06\x3e\x55\x33\xc7\x7d\x0c\x94\x13\x65\x2b\x2e\x54\x6b\xfc\xc8\x30\xc2\x15\x19\xf2\xa8\xb9\xb9\xac\x03\x44\x2f\x4c\x3b\x36\x07\xa0\x42\x7f\xb6\x03\x0e\xaa\x6d\xe4\xfc\xd2\x8e\x37\x1a\x27\xb5\xd7\xc3\x6e\xf4\xb0\x92\xc7\xe9\x06\xe6\xaa\x8f\xda\xd6\xc8\x9f\x89\x6d\x2e\x63\xde\x72\x6d\xe7\x04\x7f\x77\x2c\xbc\xf0\x1f\x90\x60\xf1\xef\xdd\x70\x8d\x92\x87\x5f\x44\x2b\xbb\x94\x57\xe0\x27\x6f\xd9\x4e\xd3\x4a\x82\x83\xd8\x79\xd4\xdd\x76\xa9\x18\x68\xf7\x14\x7d\x13\x30\xca\x71\xab\xec\xfd\x8f\xed\x9e\xc0\x4f\x33\xd4\xe9\xe0\x07\x2c\x11\xa8\x57\x2f\x7c\x14\x72\x34\x0f\xdb\xf8\xbd\x68\xaa\x14\x5f\x69\x07\xe3\x26\xa2\x0a\x1c\x17\xa9\x1a\x28\xb0\xc4\x5e\x02\xd4\xea\xa0\x8d\xa1\x34\x02\x10\xaa\x85\x61\x46\x59\x74\xee\x46\x1d\x47\xd9\x0a\xbd\x69\xf7\x9c\x88\xac\xa1\xe7\x6e\x8e\x43\xb4\xc5\x93\xae\xd9\x65\x42\x69\xd1\x9c\x86\x05\x01\x4b\x24\x2e\x76\x14\x5d\xb3\x55\x47\x57\x6c\x47\x5c\x85\x99\xba\xd8\xd4\xc2\xe8\x95\x62\xfb\x6a\x0f\x8e\xe5\x76\xc0\xae\x93\x64\x6b\x43\xc4\xeb\xad\x12\x95\x5a\xb0\xf3\xa2\x17\x0b\x7b\xc9\xfc\xdd\xb3\xa3\xb8\x90\x65\x6d\xda\x4c\xd0\x32\xec\xe8\xc1\x4b\x7c\x57\x17\x6f\x5f\xe2\xfe\x41\xb9\x2f\x60\x2b\xb0\x48\xb6\x64\x44\x9c\xb3\x0f\xae\x35\x4b\x69\x88\x0b\x7a\x02\xd0\xcf\x05\x8f\x28\x3b\x3d\x15\xaf\xc0\x1a\x56\xed\xdc\x0e\xcc\x64\x59\x61\xf0\x21\x5c\xdf\xb5\x11\xea\x6f\x1b\x59\x81\x19\x0b\x43\xae\xe6\xc4\x6a\x2e\x01\xcf\x05\xda\x8c\x2e\x34\x86\x59\x14\x9a\x50\xac\xcb\x0a\xf2\xec\xe1\x1e\xbb\x4c\x35\x18\x9d\xee\xb7\x0b\x3b\xf2\x78\x40\xa4\x5f\x01\x10\x03\x3e\xe3\x4c\x44\xd1\xf0\x92\x10\x9b\x55\xb0\x35\xf1\x7a\x8d\x40\x08\xb3\x9d\x64\xe4\xea\xa8\x35\x02\xb8\xec\x72\x05\x5e\x67\x41\x53\xff\xb6\x7e\x8c\x97\xe0\x79\x59\x97\x66\xa9\x0a\xcb\x2a\xf6\xee\x36\x0f\x7e\xb8\x2e\x7b\x82\x6d\x70\x86\xb3\x73\x98\x33\xe5\x69\xd4\x7d\x22\x79\x7c\x76\x57\xb2\xb9\x64\xee\xa8\x43\x87\x16\x3d\x58\x93\x66\x1b\xb5\x08\x47\xd4\x96\xe0\x36\xc8\xe3\xfb\x8e\x30\x7f\xfc\xe8\x55\x18\xae\x50\xa3\x16\xf1\x01\x26\xb9\xca\xd2\xf7\x37\x6a\x21\xf0\xb5\xcd\x5f\x7b\xfc\xf6\x4e\x5e\x88\x8f\x96\xa5\x5f\xec\xb9\x99\x5d\xd5\xe1\x98\xf9\x2e\x32\xe7\x30\x28\x0f\xdd\x35\xa6\x33\x34\x7c\x87\x7d\x8d\xe4\xe4\x8d\x38\xe6\x3f\x8f\xab\xcf\x6e\x5a\xe6\xde\xbb\xd5\xd8\x7f\xcb\x7f\x18\x6c\xd7\x1e\xb3\xfc\xdd\x86\x7f\x65\x42\xe8\x6e\x70\xb5\x83\x7e\xd5\xcb\x34\x56\x06\x2b\x0b\xd5\x88\x59\x53\xd6\x17\x10\xe6\x54\x93\xe4\xef\x4f\x1e\xe6\x93\x3e\x3e\x81\xf4\x17\x0c\x3d\xea\x45\x2b\x30\x8c\x15\x72\x99\xd8\x47\x73\xca\xd5\xb6\xf6\xf0\x6c\xea\x95\x34\x97\xaa\x08\x2a\x82\x0b\xd5\x7e\x17\xff\x78\x9c\x1d\x2b\x68\xec\x78\xad\x97\x03\x75\x26\x69\x47\x27\x67\xf7\xb2\x2f\x57\x02\x85\x06\x72\x20\x41\x70\x41\x98\xc5\xd4\x4b\x1d\x19\x3d\x93\xaf\xf1\x54\xcd\x36\x17\x1c\xb9\x6b\x6a\x3c\x92\xd7\xeb\xa5\x34\xea\xf8\x08\x5f\xe3\xa0\xdc\x4e\xde\x8a\x45\x1d\xce\xc2\xc4\xcd\xf3\xe4\xc0\x4e\x58\x4e\xaa\x4f\x41\x51\x2e\xe7\xad\x78\xaa\xae\xde\x69\x5d\x59\x41\x01\x7c\x42\xc0\xbd\xa6\x92\x17\xb8\x3f\x43\x94\xe9\xb5\x6a\x16\xba\x59\xe1\x71\x3a\xfb\x31\x9e\x02\x3c\xe7\xd7\x78\x07\x98\xbc\xbe\x97\x48\x0e\x8b\x9b\xa7\xa7\xe2\xf5\xc6\x2c\xfd\x79\x23\x3c\xac\xc6\x08\x25\x9b\x6a\x87\xf6\x2d\x75\x05\xec\x3a\x15\x31\xad\x9c\x5f\x8a\x55\x69\x10\x0b\x27\xb8\xe2\x3c\xdd\x34\x20\x2d\x5a\x91\x0a\x54\xdb\x8e\x32\x5d\xd6\x7a\xcb\x84\x40\xd7\x90\x15\x3d\x48\x72\xf1\x46\x3c\x97\x75\x04\x08\x15\xf7\xcf\x01\xc1\x92\xd8\x7d\x97\xe2\x3d\x6e\xae\xac\xc5\x02\x08\x42\xb2\x2e\x27\x84\xef\x22\x17\x2d\x18\x35\xed\x62\x94\xf5\x45\xf0\x94\x0e\x04\x5b\x9c\x83\x92\x8e\xfe\xf5\x9a\xd6\xa2\x7b\x4b\x7d\x55\x24\x17\x94\x75\xfe\xdc\xab\xeb\xc5\x5e\x41\x1e\x70\x90\x92\xcd\xf6\x26\xcb\x04\x4a\xe7\x45\x4d\x6b\x54\xb6\xa5\xac\x50\xe4\xdd\x2a\xb1\x82\x59\x85\x6c\x28\xa4\x51\x8a\xd6\x33\xd8\x1d\xf3\x1a\xa7\x7d\xec\x36\x7f\x18\x99\xb5\xaa\xab\x75\xea\x34\x34\xc0\x93\x0b\xaf\x84\xf5\x0b\xc7\xe1\xfc\x3a\xde\x92\xd7\xb3\x9e\x9c\x25\x4b\x28\x21\x88\x7a\xa5\x5c\x0e\x98\x34\x2c\xd8\x1f\x41\x7a\x96\xe1\xc1\x8c\x00\x80\x92\x31\x63\x73\x2f\x6f\xb8\x14\xd9\x07\x33\xe9\x29\xa3\x9e\x3b\xf0\xb6\xc7\xfc\x2d\xf9\x07\x64\xee\x4a\x6f\xab\x7c\x44\x13\x76\x63\x32\x6a\xb2\x5b\x6a\x38\x10\x28\x30\x54\x50\xa6\x32\xd2\x55\xb9\xb4\xe1\xd9\xe7\xda\x65\xd3\x44\xb3\x1f\x92\xe2\x3d\x8c\x33\xf3\x56\xbb\xcf\x47\x14\x31\x6e\x4f\x3a\x34\x92\x06\x45\x30\x4f\x5a\x98\x27\xdf\x41\xac\x86\x27\x32\xec\xb6\x77\xa7\xe6\xce\x36\x52\xb4\x61\xa2\x13\x6c\x98\xee\xd8\xdc\xa2\xd4\xe3\xc9\x19\xf3\xa5\xe8\xa3\x4d\x67\xcc\x30\x8d\xd3\xbc\x77\x1d\x76\x22\x23\x57\x73\xe2\xf9\xc3\xed\xf2\x1c\x89\xbf\xc7\xf1\xcf\x92\xdd\x38\x3d\x15\x2f\x91\xe3\x20\xee\xde\x4a\x00\xb0\x6f\x0c\x05\x98\x00\xcb\xb6\x8a\xf0\x0e\x88\x89\x25\xff\x88\x7b\x11\x83\xfc\x46\xe1\x8b\xb1\x69\x42\x88\xff\x15\x3c\xa1\xb2\x70\x0d\x79\x60\x96\xf8\xc5\xe1\x86\x96\xce\x49\xf6\x45\x61\x70\x63\x98\x25\x5f\x63\x4d\x0f\x91\x1f\x28\x64\x5d\xc3\x6b\x89\xef\x21\x90\x73\x12\x92\x12\x60\x82\x46\xcd\x65\x35\xdf\x54\xa8\xec\x9e\x66\x04\x36\xf6\x3e\x8f\xbe\x97\xe4\x98\x20\x3a\x98\x1d\xe3\x58\x39\x67\xf4\x7b\xa3\x75\xdb\x23\x15\x70\xa9\x5e\xeb\xee\x8d\x4a\x7d\x9d\x40\xb8\xd7\xba\x75\xaf\x77\x67\x72\xb6\xcf\x77\x7a\xfd\x27\x75\xa5\x9c\xe7\x3f\xfa\xc5\x75\x9f\xae\x6e\x33\xd9\x1f\x51\x47\x60\x7f\x8f\x19\x7a\xa6\xee\x89\xbe\x46\x9a\x04\x24\xa2\xb2\xda\xca\x9d\xb1\xe2\x94\x51\xed\xf5\x06\x3a\x77\x23\xe4\xb4\x12\x2f\x6c\xc7\xb6\xda\xdf\x82\x0f\x9b\xc9\xbc\x6d\xf8\xfc\xb8\xfd\xba\x1e\xcb\x3d\x62\xc7\x03\x8d\xc4\x0e\xff\xdf\x8d\xda\x64\x88\x32\xfb\x18\x76\x9e\xd7\xe8\xc6\x3d\x39\x90\x5a\x67\x02\xee\x51\x69\xc0\xe7\x33\x56\xc7\x50\x79\x70\x76\x33\xe6\xbb\xd0\x49\xff\x22\xb0\x91\xb8\x50\x3e\xfc\xef\x20\x43\xe4\x50\x8d\x68\x84\xe7\xe7\xd8\x77\xca\x13\xa3\x49\x04\x87\x95\x98\x42\x02\x1a\x23\xa4\x20\x94\x5e\x25\xe2\x80\x52\xd1\xc2\xc0\x9b\xab\x35\xb2\x92\xa0\x52\x07\x43\xa0\x32\xde\xa8\x00\xa8\xa9\x4c\x17\xd1\xb1\x91\x73\xdc\xe5\xdb\x54\x55\x80\xed\x1f\x59\x5a\x41\xcb\x30\xa5\x7f\xf3\xbd\x19\x45\x14\x70\x61\xb3\x7e\x4c\x5d\x8b\x14\x9e\x99\x07\x0f\xf0\x52\xa0\x5d\x5f\xd9\x7f\x67\x5c\x0c\xd2\xb3\xdb\xdd\xa8\x2e\x44\x62\x6a\x01\xc2\x75\x46\x02\x3e\x53\x2c\x90\x8e\x63\x6e\x07\x1f\x4c\x20\x14\x6d\x03\xd2\x29\x0d\x6e\xca\xec\xa2\x80\x05\x16\xbc\x11\x5c\xd0\x0f\x58\x36\xec\x38\x78\x7b\x33\x1a\xd0\x32\x20\xdc\xb9\xe9\xa2\xe3\x64\x69\x48\xb7\x59\x5e\xa9\x6a\x17\xce\x19\x7a\x1a\x4a\x13\x9f\xa2\xd6\x75\x6b\xe5\x4b\xfe\xe9\x9d\x37\xd9\xce\x4a\x88\xca\x91\x62\x29\xe7\x97\x53\x0c\x3d\x91\x94\x3f\x7e\xa9\x4d\x8b\xdb\x09\xf1\x39\xe0\x56\x0e\xbb\xef\xc3\x0c\xa1\x31\x92\xa7\x01\xed\xea\xa8\xf1\x06\xb5\x6a\x87\x09\x70\xbd\x00\x8e\x27\x06\x6d\xab\x5b\xb9\x13\xa5\x01\x69\x25\x86\xfe\xb5\xdb\x07\x51\x36\x0e\xef\x1d\xc6\xb4\xb2\xdc\x01\x1c\x75\x5c\x55\x32\xdc\xce\xf5\x6a\x85\xc9\x32\xa3\x5d\x71\x48\xab\x04\xf1\x53\x1a\xb1\x25\x24\x54\x82\xfd\xf1\x3d\x03\x53\xb2\x28\xeb\xe2\xe9\xb7\x2f\x21\x0e\xd1\x37\x33\xc8\x2b\xb9\x85\x38\x8b\x16\xf5\x59\x6d\x36\x0d\xa5\x35\xf5\x3b\x08\xb3\x17\x65\x0d\x76\xe7\xd2\xe0\x72\x6e\xcb\x76\x69\x29\x80\x33\x11\x47\x62\x5d\x64\xd5\xc6\x04\x04\xd0\xb0\x49\xf0\xe5\x10\x6a\xd0\x8f\x85\xce\x85\x11\x0c\x63\x0e\x0e\x41\xe1\x6b\x52\xd4\x14\x9d\xa8\xa2\x77\xb2\xb7\x63\x8d\x66\xf0\x17\x43\x02\x67\x06\x29\xf7\x5b\x7b\x3b\xb6\x25\x38\x75\xd8\x2d\x0f\x77\x87\x08\x6c\x8d\x6e\xbd\x5b\x25\xe4\x2c\xa4\x0e\x40\x09\xd8\xfe\x1d\x6c\x96\xbc\x45\x20\x1c\xe3\x69\xe6\x68\xbe\x37\x45\xdd\x70\xa4\x72\x90\xe1\xe4\x7c\xe6\x5e\xf6\x2c\x88\xc9\xbd\x63\xf6\xef\x0f\x26\x90\xaf\x7d\x22\xd7\xbf\xe1\x5b\xd7\xfb\xf0\x80\x7b\xbe\x3d\x8f\x4b\x09\xd5\x30\x34\xeb\xde\x6d\xbc\x1b\x7d\x7c\xca\x0d\xf5\x83\x89\x2b\x5b\x8f\x2a\x6c\x58\xd7\xb5\xcf\x0d\x2c\xcf\xfd\x30\xb1\x94\xc2\xd7\x07\xad\x3b\x87\xdb\x6a\x0e\xb2\x09\x89\x11\xe6\x91\xbd\xc6\x91\xfb\xac\x7a\x60\xcd\x72\xee\xc1\xdf\x2b\xa7\x5b\xa0\xd7\x0e\x9e\x4e\x1a\x92\xd0\xde\xa3\x97\x4e\xd0\xed\xa7\x4d\x09\xf7\xc0\x71\x8c\x6e\x66\xae\xe7\xfb\x01\x0b\xd3\x31\x10\xf1\x1e\x3c\x4a\xe3\x00\xff\x5e\x0d\x63\x89\xcd\xfa\x9a\x56\xac\x5b\x55\xd4\x24\xfa\x0d\xdf\x5d\x12\xe6\x89\x41\x9c\x4f\xc1\x0d\xef\x9d\xab\x62\x59\xc9\x8c\x4b\x2d\x84\x22\xc5\x76\x09\xbf\x73\x9d\x36\x52\x8c\x45\xb3\x56\xf3\x52\x56\xf8\x4a\x48\x72\xfc\x43\x84\x40\x7c\xdb\x90\xe3\xb1\xec\x8d\x7d\x1f\xa7\x8c\x1f\xb2\x2c\x85\x7f\x41\x4f\x4f\xa1\x09\x60\x41\xb6\x9a\xa5\x1f\x77\x31\xcd\x8d\x2a\x17\xa5\x72\x10\x0d\xcc\x30\x80\xe9\xd6\xb1\x74\x68\x0c\x39\xc2\x3a\x30\x57\xaa\xbe\x2a\x1b\x5d\xaf\xbc\xa3\x1c\x60\xad\x23\x63\x3a\xb7\x92\x8d\x70\x7c\x83\x3d\x08\xc8\x3b\x85\xe6\xa4\xbd\x1e\x06\xa2\x80\xe6\xc0\xe4\xb9\xa7\xcf\x83\x4f\x52\xd8\x15\xc4\x62\x35\xf2\x4a\x35\xa0\x79\x29\xfd\x5b\x98\x6e\x9c\xcf\x68\xc1\x0e\x59\xb8\x6d\x0f\x1e\x0c\x6d\x95\x2f\x77\xd2\x05\x25\x07\x50\x18\x88\xbe\xf2\x79\xfe\x73\xdb\x02\x80\xce\x14\x99\x4d\x5c\x84\x6e\x22\x50\x0b\x88\x2d\x99\x70\x35\x8a\xf3\xbd\xc5\x80\x74\x68\x8b\x5c\xb6\xd1\x1a\x0a\x0f\x67\x8f\x07\x50\xc4\xd5\xd1\x6c\xde\xd8\xf2\xd1\x09\x1f\xa9\xad\x3d\x3d\x15\x4f\x00\x1e\xc7\xef\x2e\xba\x6f\xc3\x20\x95\xa2\x68\x2c\x16\xdd\xdf\x28\xa1\x17\x0b\x33\x6f\x94\xaa\x4f\x97\x65\x51\x38\x4f\x25\x74\x87\xe8\xbe\x82\x40\xe4\x5e\x81\xd2\xeb\xc1\x03\x71\xbf\xeb\x6d\xee\x37\x28\xe3\x2b\xde\xb9\x50\xd1\x2e\x3d\xd5\xdb\xfa\x61\xa8\x13\x8d\xb4\x6f\xf1\xe2\xb1\xd1\xc8\xce\x42\x9b\xdf\x30\x0a\x37\xd7\x2b\x05\x56\x6b\x7f\xa0\xf1\x64\x42\x62\xa3\x69\x4c\x93\xd8\x29\xbc\x77\x0b\x8a\xc8\xbb\xb6\x7b\xba\xbb\xb6\xcf\x2d\xe4\x6e\xb8\x92\x3b\x67\x1d\xf6\x73\x2e\x9f\x0e\x5f\x66\x78\x5e\x51\x66\x6d\xb5\x7d\x11\xc1\x67\x21\xa4\x99\x53\xcd\xaa\xac\x65\x35\xa5\xbc\x58\xf4\x64\xce\xf5\x6a\x4d\x28\xc8\xa6\x55\x6b\xd7\x52\xb9\x5a\xa9\xa2\x94\xad\x65\x32\xc0\xaa\x1a\xb1\xb0\xee\x34\x25\xae\x4b\x56\xb4\x79\x51\x17\x8a\xba\x6a\xd5\x0d\x39\xd3\x6e\x4c\x56\x7f\xd2\x27\xde\x2d\xf3\x94\x26\x16\x0b\xb5\xda\xf0\x06\xac\x50\x4a\xbd\x23\x86\x6a\x9c\x9f\xd2\x7a\xec\xa1\xfa\xa9\x78\x99\x10\x96\x54\x64\xb8\xb1\x07\x7e\x51\x4f\xd7\x8d\x6e\x35\xb0\xef\x01\x19\x83\xff\x4c\x06\x99\x3d\x69\xf4\xfc\x8e\x41\x54\x25\x0c\xf6\x09\xff\x29\x3f\x41\xc1\x32\xe4\xd1\x61\xf8\xec\xdd\x52\x89\xdf\xff\xca\x88\xd3\xaf\xd8\x31\x90\xeb\xb5\x92\x0d\xbc\xfc\xc8\x08\xb8\x68\xcf\x95\x6a\x97\xba\x40\xd0\xfb\xe0\x98\xd0\xaa\xba\xa0\x7d\x0f\xd1\x9d\xe2\x33\xf1\x6b\x71\xe4\xae\x13\x9d\x17\xc8\xdb\x02\xdc\xa5\x3d\x48\x66\x2a\x90\xef\x15\xbf\x82\xbe\xf2\x2d\x79\xd6\xf3\x68\x12\xcf\x3b\xf9\x67\x47\x02\x3e\xdc\xa1\x07\xf6\x0d\x3d\x72\xd6\x39\x6f\x9c\xbb\x32\x75\x79\x8a\x48\x07\x82\xc6\x91\x20\x8a\xe0\xaf\xdc\x41\x91\x17\xdf\x77\x70\x4e\x4f\xc5\x6b\x8a\xcb\xde\x40\x41\x40\x76\x31\x66\xb3\x5a\x03\x39\x02\xde\x2f\xc4\x51\x40\xe0\xb3\x37\x33\xe5\x9f\x5f\x40\xe4\x4a\x42\xd5\xcf\x98\xeb\xfa\xed\xf8\xd1\xdc\xa5\x27\xcd\x1d\xfb\xd2\x5c\xd7\x9b\x06\xeb\x76\x63\xab\x3a\x34\x08\x76\xde\x57\xb8\xa9\x13\xca\xb5\xfc\x20\x30\x9a\x39\xf1\x7f\xc8\x39\xf4\x1f\x72\xfa\x16\xde\xe5\x35\xdc\xf1\xa1\x33\x98\x71\x91\x75\x93\x8a\x09\x27\x8f\xaa\xcf\xbe\x39\xbe\xb4\xbd\x8e\x3d\xc8\xa8\x8e\x86\xde\x0f\xd4\x0e\x0e\x8b\xc3\x0c\xdb\xad\x95\xe1\x51\xf8\x9d\x8f\x56\x98\xaf\x35\x68\xf6\x09\xac\xc2\x4a\xf4\xf9\x69\xdf\x4a\x30\xfd\xa7\x68\x5a\x5d\x1f\xe8\x9e\x2c\x28\xe8\x01\xb1\xd0\xe2\x5c\x1c\x1d\x9d\x25\x1f\x00\x79\x9a\xde\x9f\x1e\xaf\x81\x24\xa7\xe9\xb7\xae\xc6\x71\x14\xe7\x0f\x59\xa5\xdc\xa7\x14\x69\x02\xba\xff\xf5\xb9\x38\xfa\xb7\xfa\xdf\xea\x20\xdc\x44\xef\x91\x95\xa5\xff\x7a\x24\x7e\xcd\x86\xf4\x6b\x71\xf4\xd7\xe9\x51\x8c\x26\x90\x8c\x9f\x76\xf1\x5f\x00\x4f\x31\xd4\xec\xba\xdb\x23\xf2\xf6\x8b\xa7\xb0\xbc\x9d\x65\x88\xb1\xbc\xb3\x55\xdf\x76\x70\xbd\xed\x94\xd9\xa7\x74\xd2\xd1\xd0\x58\xb9\xa9\x65\xa7\xdc\xfc\x1e\xd9\x19\xf3\x8f\x55\x59\xab\x57\x80\xc7\x93\x43\x51\x10\xde\xc7\xae\x27\xf2\xf9\xcf\xa1\xd7\xbf\xe4\x06\xb4\xaf\x4e\x27\x07\xad\xe8\xb2\x1b\x47\xbe\x76\xe0\x83\xfd\x49\xe7\xd7\xe2\xa2\xbc\x82\x38\xbd\x85\x99\x62\xe6\xdc\xc7\x6d\x6b\x05\x6f\xc4\x34\x23\xbd\x04\x46\xbf\x2d\x90\x7a\x2f\x64\x59\x4d\x7f\x65\x20\x97\xae\x3d\x34\x93\x91\x87\x32\x4a\xb4\x9b\xa4\xd9\xed\xa6\xab\x09\x29\xa3\x46\xcb\x83\x09\x8d\x1e\x92\x51\xd6\x91\x57\xe1\x28\xb5\x7c\xd6\x0d\x96\x83\x3a\x5f\x4f\x96\xf0\x2a\x35\x59\x55\xff\x40\x11\x3e\x30\xdb\xbe\xe8\x1e\x5c\x0a\xc7\x43\x86\xcc\x2b\xf9\xe8\x1e\xa7\xdc\x86\x6a\x7f\x07\xba\xed\xbe\x78\x24\xbe\x24\xe3\x63\x91\x64\x2a\xcb\xe7\x0f\x52\x76\xe5\xbc\xf9\xf4\xfb\xa5\xc2\x53\x02\xcb\xb0\x81\x50\xdd\xc4\xc9\xd7\x21\x32\x39\xcf\x87\x57\xba\x50\x6e\x77\x43\x73\x9a\xe9\xbd\xa6\xe2\x9d\x03\x91\x2e\x5b\xf0\x4d\xb4\x63\x62\xec\xe0\x5d\xab\xa5\xed\x4a\x30\xad\xb4\x13\x29\xac\x20\xb6\xd0\x55\xa5\xb7\xa0\x1f\x05\x2e\x08\x22\x14\x17\x23\xe2\xca\x7d\x62\x7b\xd7\x5a\x58\x8c\x56\x93\x99\x36\xac\xc0\x08\x5d\x50\x9f\xeb\xc4\xf5\x4d\xb2\xbe\x89\x1f\x27\x48\x78\x60\x02\xd7\x89\x67\xbd\xc1\xe8\xaf\x39\xa2\xbb\x5c\xd6\x7b\xe3\xd4\x65\x70\x8b\xcf\xc2\x01\x2d\x8d\x97\xa1\x5a\x79\xa9\x84\x6c\x66\x65\xdb\xc8\x66\x07\x0e\x41\xe4\x5b\x38\x07\x42\x66\x76\xf5\x7c\xd9\xe8\x5a\x6f\x4c\xb5\x43\xcf\xca\x99\xba\x28\x6b\xd7\x98\x92\x17\xca\x4a\x81\x44\xbb\xb7\x74\xd2\xb3\x5e\x00\x12\x30\x5d\x29\xe8\x1d\xe6\x32\x1d\x50\x94\x46\x5e\x3e\xb9\xd7\x11\x11\x14\x6f\xd1\x0a\x9c\xf7\x9e\xeb\x1b\x56\xc6\xa3\xee\x97\xa0\xda\x71\x41\xb5\x07\x3f\xbd\xcb\x31\x39\xf0\x7f\xd2\xaf\xef\x4f\x2c\x1a\x78\xc4\xcb\x61\x25\x7d\xb8\x61\x08\xcc\xe6\xec\xa0\xcc\xd3\x90\x72\x53\xae\xed\x12\xc7\xf6\xa8\x82\x69\x79\x42\x73\xf6\x64\xca\x96\x3c\xad\x18\xee\x02\x37\xc1\xa1\xc7\x58\xc8\x09\x4c\xbe\x6a\x01\x66\x39\x34\xb7\xa8\xf4\xd6\xd3\xb1\x42\x47\x9d\x4e\x63\x2a\x87\x80\xcd\x3e\x29\xb6\xd6\xde\x71\x25\x34\xe7\xbf\xd0\xe9\x01\xe8\x08\x83\x00\xde\x52\x7c\x46\x0b\xf5\x99\xfb\x21\xe4\xb1\x9f\xa6\xec\xce\x13\x17\x7e\xb9\xa9\xcb\xc5\x0e\xfd\xd3\x4b\x6a\x69\x49\x5a\x2e\xf4\xdd\xd2\xcd\xe5\x3e\x18\x8f\x1f\x11\x51\xe0\xf0\x10\xef\xe4\x65\xbc\x99\x71\xed\x1a\xdd\x8f\xb6\xb3\x9d\xfe\x8f\x18\xee\x66\x63\xfc\x18\x29\x0b\x27\x07\x10\x14\x8f\x04\x81\x2c\x2d\x42\xaa\x46\xfa\xcd\x5d\x90\x4a\xb5\x1e\xbd\x7e\x91\x64\x68\x28\x34\xbf\x45\xdc\x97\x2f\xf8\x7f\x5a\x52\x5b\x49\xe3\x7c\xed\x1c\x6b\x8b\xf8\xec\x62\xae\x9b\x46\x99\xb5\xae\x0b\x86\x1a\xc3\xf1\x66\x1a\x55\x1f\x99\x7c\x53\x9c\x32\xdf\xe7\x88\x93\x50\x1a\xa7\xdb\x0d\x41\xee\x14\xf1\xa8\xfc\xec\xb7\x54\x33\x1f\x92\x3a\xd8\xfe\xbb\x4d\xa3\xf5\x39\x34\x9f\x2f\x15\x0f\x21\x94\x81\x7c\xc5\xfb\x07\xc3\xc5\xfb\x7c\x43\xbe\x76\xf8\x29\xa5\xd6\x51\x52\x8d\xf3\x4c\xa2\x07\x5b\xf0\x7f\x9c\x46\x6c\xc8\xb5\x28\xb0\x03\xeb\x93\xf5\x5c\x55\xb6\xa4\xbd\x80\x7d\x81\x98\x41\x82\xf2\x6f\x5b\x59\x28\x60\x04\x66\x4a\xc8\x19\x00\xcc\x07\x66\x00\x15\xf2\xa9\x73\x00\x3c\x83\xb5\x76\x0d\x42\x12\x77\x74\x09\xd7\xa2\xd0\x2c\x3f\x7f\x36\xaf\xa9\x30\x6a\x2d\xc9\x65\x52\x2f\x42\xc6\xff\xd3\x53\xbc\x0f\x47\x46\x90\xad\x7f\x07\x07\xd1\x63\x2d\xd9\xae\x77\xaa\x15\x0f\x13\x1d\xbf\x73\x58\x2d\xb4\xa5\x8c\x95\x6e\x7d\x7b\x74\x05\xc0\x09\x19\x06\x08\x15\x85\xac\x77\x5b\xb9\x9b\x8a\x6f\x69\x74\xc8\x9d\xd8\xdb\xc4\x86\x46\x7c\x91\x65\x50\x5d\x73\x7e\x59\xd0\x9b\xb1\xb3\x2a\xe0\xa7\x18\x56\xc3\x03\xed\xb8\xd9\x00\x6c\xbf\x0f\x1c\xca\xe8\x5b\x5d\xc9\x6f\x17\xfe\x79\xff\xfd\xb9\xaf\x0f\xa1\x1d\x2c\xd6\x2f\x76\xae\x84\x27\x95\xb9\xe7\x92\x2b\x0f\x03\x26\x72\x68\x57\xb0\x79\x68\x08\x99\x29\x55\x47\xcd\x91\xd3\xb2\x2a\xf8\x13\xaa\x62\x7a\xb3\x13\x17\x0a\x79\x1e\x60\xd4\xdb\x46\xd6\x66\xa1\x9a\x46\x15\x62\xb3\x9e\x86\xe6\x38\x37\xc0\x18\xb3\x90\x66\x66\x48\x4e\x83\x16\x44\x9e\xb0\xa6\x84\x9c\x67\x02\x81\x7a\x9f\xc2\x5f\x3b\x6e\x1b\xa7\xa7\x8e\x5b\x19\x8d\x6b\x7a\x0d\xef\x0b\x7f\x93\xff\xa4\xb7\xaf\x69\xff\x6e\xf9\x06\x53\x36\x82\xc8\x71\x55\xb4\xf2\xc2\xe0\xf1\x84\x24\x1e\x2e\x49\x8f\xac\xaa\x8e\x7b\xea\xc9\xd7\xae\xbd\xb7\x4a\x89\xd7\x6f\xc4\xff\xfc\xdd\xff\xfd\x1b\x51\x94\x66\xbe\x31\x90\x94\x62\xa1\xbd\xd5\x1b\x4a\x3a\x84\xea\xae\x9d\x25\xd0\x5e\x70\x6a\x73\x11\x3b\x01\xc6\x78\x74\x1c\x8f\x48\xe1\x9e\x07\x31\xaf\x0f\x30\x99\xe5\x9a\x0d\xf9\x82\xba\x23\xbd\x25\xf1\x2d\xe9\xf8\x53\x42\x84\x01\x9a\x2b\x80\xd4\x45\xc1\x09\x0e\xd0\xcb\x6f\xd3\x1f\xf5\x16\x48\x12\x5d\x63\xcb\x80\x7e\x0d\x3f\x96\xa4\xf1\x46\x0d\x39\x80\x4b\xd9\xa3\x5d\x7c\xcd\xcf\x6d\xe4\x6a\x92\xc6\x21\x70\x3e\xe9\x14\xa3\x89\xec\xb9\x41\x20\x43\x1d\xd8\xb0\x53\x27\xd7\x05\x45\x5a\xf0\x5a\x19\xe7\x63\x43\x47\x65\x58\x54\x09\xe5\x33\xde\x31\x43\xee\xeb\xb6\xde\x5b\x1e\x03\x35\x14\xb4\x45\xfd\xb0\x00\x2e\x70\x36\xb3\x0f\x8b\x0b\xe7\x50\x71\x64\x96\x73\xee\x0f\x24\xd7\x49\x83\x58\x0c\x92\xba\x18\x05\x51\x1f\x9e\xce\x1b\x72\xb5\x04\x21\xb0\x1b\x14\x36\xed\x12\x0f\x87\x28\x7b\x3d\x0d\x44\xe6\x61\x49\xdd\xe1\xce\xcf\xc5\x2b\x0d\x98\xb5\x5d\xa9\x31\x29\xfb\xd5\x60\x5f\x5d\xe1\x71\x0c\xc1\x8b\x84\xc6\xd1\x64\x25\xef\x11\xf5\x28\x61\xd5\x6e\xd1\x7b\x2a\x22\x16\x83\x30\xed\xd4\xf5\xe1\xa8\x4c\xa3\xc8\x5c\xd4\xfa\x8d\x90\x4c\x3a\xe4\x2f\x26\xd3\x51\x47\xd7\x8c\xdc\xec\x74\xb1\x6f\x42\x37\x89\xbc\xe8\x74\xf6\x4e\x7d\x18\xea\x67\xd0\x15\x32\xde\x0b\x59\x55\xf8\xc2\x36\x10\xd7\x1e\x1a\x8d\x22\xd4\x1a\x05\x52\x3d\x5d\x7b\x74\xf3\x95\x17\x4e\xb0\xf2\x30\x24\xb6\x85\xde\x88\x26\x72\x96\xe1\xa6\x39\x66\xf0\x18\x48\x60\xe0\xf2\x5a\xe2\x60\x9c\xbb\x4b\xc8\xbc\xc4\xa6\xb2\xf7\x54\xdd\xc0\x30\x18\xad\x5b\x92\xfd\x32\x5a\xb6\xc7\x3e\xeb\x59\xf0\xe0\x32\xa8\x02\xa6\x00\xbe\xa5\xae\x0a\x2b\x38\x30\xe6\x5b\x34\x9b\x3a\x49\x43\xe6\x1b\x84\xd4\x0d\xba\x56\xdc\xcb\x72\x9a\x4e\x30\xb0\x7e\x03\xcf\x7e\xb4\x18\x37\xd3\x03\xc7\x54\x83\xb0\x13\xfb\x48\xc5\x3e\x68\x45\xd7\x58\xa1\x16\x72\x53\xb1\x66\xba\xda\xca\xef\x6a\x2b\x0d\xd5\x62\x53\x63\xd4\x24\x4a\x64\xf2\xe2\xb6\xf4\x92\x7d\x96\x65\x78\xad\x9e\xcb\xb2\x1a\x96\x53\xaf\x8b\xad\x04\x2f\x6d\xab\x31\x9e\xc0\x9e\x93\x8d\x59\x9e\xae\xf5\x9a\x61\x19\xa0\x57\xd8\xf4\xb0\xd7\xe4\x0e\x79\xca\xdb\xe2\x7d\x47\x6c\x3a\xa5\xea\xc1\xb0\x2f\xda\xf4\xdb\xde\x70\xb7\x41\x8f\x8b\xc2\xa7\xbe\x71\x4a\x26\xb2\xec\xc8\xda\x05\x9f\x00\xc6\x29\x94\x20\xed\x29\xf9\x46\xaf\xca\x16\xc9\x60\x8e\x2b\x8b\x3c\x20\x9f\x35\x0d\xb7\x7d\x3a\x4a\xbb\x55\x65\x53\x50\x68\xa5\x43\x5e\x2d\xb4\xf8\x0c\x03\x2b\x3f\xc3\xe3\xfe\xdf\xff\xf9\x5f\x2c\x38\x7d\x01\x87\xd2\xc5\x9c\x9e\x9e\x0a\xbd\x69\x9c\x86\x0b\x9d\x46\xa6\xe2\x9b\xa0\x7d\xae\xb5\xa8\x74\x7d\xe1\xfc\x9b\xa5\xe5\xa7\x49\x49\xf1\x59\x40\xd7\x75\x6d\x41\xb4\x6e\xa9\x6b\x33\xf9\x8c\x71\x8b\x3e\x54\xa4\x0b\x42\xdc\x6a\xb1\x92\x97\x4a\x80\x2c\xed\xc3\x7d\x3d\x97\xd8\x22\x4c\xec\x94\x18\xf3\xe7\x65\x6d\x4f\xfb\x4c\xb5\xad\x6a\x20\x22\x19\x5c\x6e\x69\x8d\x4b\x33\x11\x6b\xd5\x2c\xe5\xda\xb8\x75\x96\xa0\x79\x70\xcd\x5d\xa8\x5a\x35\xb2\x12\xfa\xca\x96\xda\x54\x76\x12\xb8\x2d\xd0\x86\xf7\x43\x3c\xc8\xd6\xeb\xf3\x4e\xe4\x22\x71\xb2\x65\xef\x77\x33\x7c\xec\x69\x3b\x2a\xdd\x31\x2e\xfc\x1d\xb1\xb5\x49\x3c\xbf\xd3\x1d\x4d\x28\xe0\xe8\x02\x94\x55\x33\x84\x86\x5f\xad\x37\x2d\x7a\x32\x34\x41\x5b\x13\x00\x59\x5c\x7b\xad\x16\x45\xa3\xd7\x50\x8c\xe5\xeb\xcc\x3a\x15\xc7\x7a\xd7\xb0\x63\x49\xb1\x48\xa5\xc9\x62\x10\x4f\x4f\xc5\x77\x35\x86\x87\xe7\x60\xa8\x43\x02\x27\xf6\x96\x7b\xec\x74\xdb\x0e\xb4\x92\xf3\x73\xf0\x23\xb9\x5b\x88\xf8\xb3\xde\x43\xe3\x13\xdc\x47\x0f\x40\x0c\xfb\x31\x0a\xdc\x29\x7b\x8e\x53\x41\x36\x86\xe3\xd9\x53\xc9\x49\xa5\x31\xea\x4f\x12\x6e\xb4\x5f\x0b\x45\x65\x70\x42\x5e\x98\x7c\x14\xfe\x3a\x09\x5f\xc2\xc3\xfd\x28\xfd\xc1\x36\x77\x76\xef\xd3\x59\x9a\xf0\xe4\x09\x46\xba\xa8\xeb\xe5\x3c\x09\xa9\x4c\x10\xf4\x9c\x25\x5c\xa0\x8c\x22\xf1\xef\x3e\x6b\x04\xfc\x6a\x19\xf8\xbe\x1a\xfc\x9b\x4f\x58\x01\xb6\xc4\x17\xc8\x87\xfb\x44\x36\x58\xab\xfb\xcd\xd5\x5a\x94\xb5\xac\xca\x7f\x57\xfc\x1b\x19\x9a\xb1\x6a\x4f\x01\x9f\xbd\xa4\x51\x6b\xd9\x28\x0f\x4a\x47\xb5\xa2\x9f\x7d\x02\x8b\x8d\x4b\x2b\xed\x8a\xb9\x5f\x7c\x6b\xaa\x31\xa5\x69\x55\x34\x65\xf6\xe3\x19\xad\xe7\x85\x02\x1e\x63\x28\x6d\x4a\xae\x88\xef\x46\xaf\x07\xd2\xb4\x44\x1f\x5d\x95\x0b\xd5\xf6\x57\x89\x3f\x66\x7a\xc9\xe6\x75\x49\x3e\xbb\xb9\xd1\xd2\xbd\xd3\x18\x7c\x06\xc2\xdc\x50\x3a\x95\xa1\xf2\xc9\x2e\x45\x65\x92\xf3\x35\xaa\xdd\xdc\xb9\xb3\xf3\xd8\x9b\x42\xa6\x53\xe8\xec\x5e\x07\xc2\x9a\x50\x75\xf3\x1a\x63\xcb\x20\x51\x7e\x68\x8c\x58\x44\x53\x72\xed\xa1\xff\xd0\xea\x85\x5c\x14\xe2\xfc\x49\x06\xca\x51\xd6\xad\x37\xe2\xc8\x5a\x60\x57\x8f\xeb\xc2\x97\xd8\x1f\xae\x82\x75\x32\x4a\x3a\x0a\x4b\xcd\x8f\x7b\xa8\x45\x02\xbd\x8e\x9b\xc3\xab\xfa\xb8\xaa\x50\xbc\x74\xb6\xd5\x8e\x36\x36\x72\x52\x45\x0f\xaa\x61\xfa\x0d\xee\x14\x11\x8c\xa8\xfd\xd7\x9e\x4c\x52\x4e\x8f\x4b\x26\x3e\xe8\xa8\xeb\x26\xef\x9a\x8e\xd2\xd3\x07\x4d\xfd\xc7\x8f\xa2\xf3\x15\xa2\xa2\x73\x1f\x50\x22\x4d\xc1\x10\x93\xe0\x3d\x54\xf3\x93\xa7\x34\xb0\xb0\x14\xe8\xeb\xba\xf4\x31\xb3\x47\x29\xc2\x49\x67\xac\x89\x18\xdf\xb5\xee\x1a\x48\xc1\x44\x95\x76\xeb\x0e\x66\x8a\x6f\x31\x30\x82\x1d\x1f\x1e\xff\x39\x5a\xef\x3a\x4a\x44\x49\xbb\x18\xca\x86\x4f\x2e\x13\x43\x6a\x43\x66\xdb\x12\xf2\x7c\x65\xfa\x77\x43\xe4\xbd\x33\x67\x9a\xcc\xa7\xfc\x61\xe3\xcb\x92\x33\x21\xb3\x29\x84\xf6\xd2\x41\xf3\xd1\x76\x96\xa3\x5b\x8d\x2f\x4b\x92\xe4\xbe\x1b\x4d\x7a\x05\xea\x9d\x77\x9a\xeb\xb3\xae\xef\xfc\x3d\x1f\xeb\xaf\x7b\x1f\x4a\xe6\x1c\xab\x08\xc6\x0e\x03\xe0\x75\x75\x85\x62\x69\xad\xb7\x77\xe0\x43\xe5\x08\x1c\xa4\x6e\x84\xd0\x5c\xef\xf4\x6b\x87\x07\xde\x6c\xc4\xd0\x14\x53\xf1\x4a\x6f\xb9\xe5\x93\xbc\xd9\x8c\x65\x55\x8b\x04\xf2\xf1\x45\x2b\xb6\x6e\x1a\x75\x39\x57\x2c\x26\x72\xb5\xa9\xda\x52\x98\x56\x5e\x50\x2f\x8d\x5a\x5b\x19\x11\x50\x9d\xec\x2c\x5c\x4b\x06\x52\x1e\xf3\x0c\xb3\xba\x11\xb2\x15\x76\x56\xad\x68\xad\xcc\x00\xf5\x7d\x5e\x9f\x1a\x93\xcf\xeb\x5a\x99\xa9\x78\xe2\xcc\x45\x5e\x40\xb0\x52\x6f\xa3\xfe\xb6\x41\x4c\xb6\xa2\x28\x29\x66\x68\x51\xaa\xaa\x48\x31\x9a\xb6\x12\x71\x08\x20\x05\x91\x0e\xaf\x88\x9f\xe7\x5b\x07\x0b\xe5\x5a\xa4\xde\x51\x0c\x6d\x02\x9a\xf5\x2b\xdd\xaa\x47\xb1\x83\x14\x30\x31\xa8\x0e\x90\x55\xab\x1a\x08\x27\x46\x3c\x8b\x17\xd4\x7f\xbb\x2c\x6b\x70\xb5\xb6\xab\x6d\x44\x78\x8b\x98\x5e\x13\xd7\x10\xc6\x60\x45\xec\x85\x6e\x84\xba\x52\xcd\x8e\xa1\x9d\xf5\x6a\x53\xf9\x71\x0f\xe7\xe0\x9b\x4d\x09\xd8\xb8\x2c\xff\xaf\x49\x76\xd6\x92\x3d\xd9\xd0\x08\x00\xf6\x01\xc5\xe9\x56\x37\x76\x7f\xf4\x5a\xfe\x6d\xa3\xc4\x52\x55\x96\x09\x83\x33\x2a\x9e\x44\x70\x04\x98\x54\x02\x1f\xdc\x73\xf1\x67\xba\xb5\xa3\x1f\xb1\x24\x02\xda\x9e\x80\x29\xad\x79\x37\xf4\x19\xbe\xae\xbb\x50\x3d\x31\x8c\x3c\x05\xad\x52\x8f\x3c\x22\xb9\x93\xd9\x74\x18\xb7\x66\x4e\xae\x4b\xbd\x12\xe5\x41\xb9\x81\xb2\xf9\xab\x47\x3a\x97\x1d\x64\x8f\xf7\x6b\xef\x1d\xc9\xd0\x2f\xaa\x8f\x81\xc0\xe0\x4f\x5d\x57\x3b\xe7\x1d\x62\xef\xf7\x9a\xb2\x3d\xe3\x3d\xb2\x94\x83\x12\xcb\xce\x36\xad\x27\x1b\x8d\x9a\x6f\x1a\x63\x2f\xd9\xb6\x16\x65\x70\x46\xe1\xb8\x79\x0b\xd0\xee\x50\x8e\x27\x07\x28\x80\x70\x68\xd3\x3d\x0c\x0c\x7b\x04\xef\x84\xff\xe0\xaf\x5a\x57\x42\xf2\xcb\x86\x2f\x8f\x47\x61\xdf\xc7\x4f\xe4\x99\x18\x96\xc4\x0a\xe8\xe6\x1a\x4a\x38\x74\x95\xd6\xe1\xe2\x45\xd4\x8a\xa0\x62\x22\x3b\x80\x5b\x6a\x96\x83\xcb\x65\x5c\x23\x04\xf3\x0b\xd5\x72\x1f\x50\x00\x79\x51\x72\xbe\x74\x09\xc2\x22\x58\x3a\x70\x9b\xc3\xa1\x84\xb4\x7c\x3f\x15\xee\xc6\x75\xbd\x87\x21\x89\xd9\x91\x5f\x58\x23\xce\x1a\x05\xb0\xd8\x54\x14\x0d\x8e\xd7\x69\x99\x10\x1c\xdc\x57\xe6\x1d\x8a\xc0\xe1\xb3\x5d\x44\x27\xcb\x73\xdb\xbc\xaa\xe5\xac\x52\x2f\xe1\x4b\x7d\x11\x32\x30\x47\x9e\xd2\x2f\x9d\x5a\x60\xa5\x0b\x77\xd6\xf3\x63\x0e\xfa\x97\xfe\x3d\x80\x37\x5a\xaf\xdd\xc2\x9e\x65\x1a\x0c\x13\x64\x0a\x9d\x61\xb8\xda\xd7\x72\x57\x69\x7b\xc7\x10\xbd\x47\x57\x05\x65\x2a\xa9\xd5\x96\xfe\xd6\x90\xd1\x83\xfc\x62\x50\x48\x4e\x46\x86\x8f\xee\xbb\xdd\xda\xbd\xf9\x6b\x35\x2f\x17\xe5\xdc\xa3\xf1\x38\xe3\x46\x88\x7c\xf6\xd5\x13\xe2\x18\x43\x00\x47\xa3\x3c\x4b\xa8\x4e\xf0\xed\x10\x6b\x2c\x21\xca\xba\x28\xe7\xb2\x75\x90\x94\x1e\xb4\x50\x52\xbc\x83\x7d\xfc\x4b\xf2\xb7\xe3\xad\x41\x91\x5a\x6d\x31\xe4\x54\x81\xf0\x4b\xf9\x3f\x4d\x90\xc6\xa7\xe2\x31\x11\x7c\xb0\x50\x00\xaf\x54\x23\x5e\x24\x98\x47\xbe\x67\xc1\x66\x1c\x9e\x98\xc6\x1f\x5f\xa9\x7e\xd5\x40\xf7\x9a\x65\xb6\x9b\xce\xea\x88\x9d\xd6\x55\xf1\x0e\xf4\x78\xb5\xda\xa6\xcf\x43\x58\x48\x50\xff\x14\xe5\x62\xa1\x1a\x33\xc1\xf9\x13\x0a\x59\xdf\xec\xeb\xbd\xb3\xa7\x9e\x91\xb8\x76\x3b\xbf\xd6\x1a\xa4\xc9\x96\x3a\x92\x89\xbb\x95\x81\x7d\x01\x39\x84\x52\xfa\x17\xb1\x19\x94\xc1\x90\x05\x6d\x5c\xf7\xa6\xbf\x76\x1f\xdb\x9e\xbb\x1e\x0a\xa0\xc4\x0e\x29\x07\xd9\xbd\x07\x36\xad\xd2\x35\xd7\x95\xb2\x1e\xa7\xd1\xb7\x09\x5b\x21\x64\x4f\xfc\xfd\x83\x17\xfc\xad\x6a\xd3\xea\xf9\x52\xbc\x21\x64\x04\xe0\xcb\x3b\xbd\xaf\xbd\xe1\xc2\xbc\x59\xa7\x46\x8d\x0b\x21\xd3\xca\x5b\xec\x2d\xc7\x31\x45\x1e\xd7\x62\x53\x2f\x74\xd3\x6e\x40\xd6\x70\x21\x92\x1d\xce\x2f\x86\xb6\xb6\xbc\xdd\x56\xd3\xd9\x85\x58\x1e\xf4\x97\xb7\x34\xc7\x78\x5c\x62\xbb\x03\x9d\x86\xd8\xe4\x52\x35\x78\x32\xe5\x81\xd7\xf1\xb6\x19\x4d\x71\x0d\x66\x53\x8c\x65\x38\xc5\x5e\xa6\x53\xdc\x0e\xe3\xb9\xff\xcc\xe5\x56\xb9\x87\x27\x15\x07\xf3\xa5\xe2\xb6\x78\x53\x71\xfb\xfc\xa9\xd8\xcb\xa3\xe6\xe6\xdb\xcf\xa7\x8a\xb1\xbc\xaa\x18\xe6\x57\x45\x86\x67\x15\x19\x94\x89\x11\xbc\xab\xc8\xf0\x8c\x71\x43\x63\xf9\x58\x71\xeb\xbc\x6c\x7e\x6c\xf1\xe8\xf6\xf0\xb5\x69\xf1\x03\xf9\xdb\x74\x1f\x22\x1e\x57\x0c\xbf\xfb\x87\xf2\x8d\xa0\x68\x80\x53\xf6\x6d\xf3\x66\x1c\x74\x3e\x3d\x57\x74\xd0\xbf\xab\x5d\x7e\x91\x4e\xcd\xc8\x42\x7d\x7e\x1e\xf9\x69\xb1\x40\x20\xde\x48\xbc\x15\xc0\xd4\x12\x6b\x66\x26\xe4\x2c\xa6\x1c\x76\xb4\x0f\x32\xed\xe6\xf7\xea\xc0\x7a\x07\x84\x37\xb7\x38\x7c\xd2\xb1\x63\xf7\x59\x52\xab\x56\x5b\xf6\x0e\xf6\xbc\xa5\x81\x5a\x75\xf0\x6d\x7a\xdf\xb6\x50\x67\xc2\x3b\x39\x49\xcf\xe3\x18\x36\x28\x3e\x70\xd1\xe4\x5c\x72\x12\x0e\x45\xe0\x3b\x3b\x8b\x97\xfb\xc5\x82\x61\xc7\x77\x52\xc8\x4c\x78\xa4\x6f\x2e\xaf\x39\xc3\x3a\x15\x5c\x1f\x96\x79\x50\x8f\xd9\x20\x7a\x9d\xe2\x68\x54\x21\xbd\xaa\x37\x7c\x51\x7a\xe8\xb0\xa3\xad\x16\x66\x2b\xd7\x10\xbd\x13\x7d\x99\xde\x1e\x53\xfd\x7f\x52\x86\x8a\xc2\x80\x6a\xed\xf1\xf6\xa5\x31\x7a\x5e\x02\xeb\x00\xb6\x41\x8a\x13\x28\x14\x3d\x61\xb5\x65\xc2\xf5\x22\xf6\x3c\x71\x29\xc5\x9d\x4f\x7b\x24\xac\xd9\x06\x2e\x36\xb2\x91\x75\xab\x18\xec\xbf\x4f\x03\x07\x1b\x8e\x1a\xf6\xd5\xf4\x76\x69\x02\x53\x57\x72\x1f\x00\xd2\x4c\x66\x28\x51\x96\x88\x88\x07\x0f\xe2\xb5\xef\x79\x39\xae\x4d\x5e\xbc\x4a\x9c\x61\x97\xe1\x6d\x69\x14\x9a\x2b\x24\x00\xdc\x95\x7a\x63\x90\xaf\xe7\x75\x07\xc0\x20\x92\xb9\x9f\xed\x23\x68\x8d\x9a\xef\xe6\x15\x07\x6a\x1d\x45\xbf\x3d\x5d\xe3\x8b\xcc\x45\x8c\xe3\x64\x20\x07\x9c\xe5\x6c\xe8\x16\xdf\x9d\x49\x66\xd4\xbd\x34\x33\x71\xbf\x38\x66\x63\x76\x83\xd8\x77\x8d\x6e\x4e\x4d\x07\x36\x8c\x8d\x27\x9d\xc2\x9e\xb7\x2d\x7b\xa9\x11\x3e\x3b\x8a\xef\xa3\x04\xf5\x11\xe8\xf4\xa2\x92\x17\xe1\xa2\x5b\x29\x7c\x29\xaf\xc0\xbd\x2c\x3e\x69\x18\x4b\x7c\x05\x81\x81\xe0\x5d\x8d\x9e\x69\xb5\x6e\xc9\x3b\xad\xd5\xc2\x1e\x77\x02\xc3\x91\xf5\x0e\x40\x71\x3b\x4d\x84\x8c\x18\x28\x3b\x19\x82\x23\x0f\xa9\x57\xd8\x2c\xd4\x36\x92\x4d\xd6\x8d\x5e\xcb\x0b\xc8\xbb\xb6\xde\xca\xa6\x30\xd3\xeb\xec\x46\xf7\xf8\xdf\xc1\x73\x95\x79\xb0\xe2\x03\x37\xea\xbc\xdc\xb9\x52\x66\x94\xea\x24\xd1\xdc\x38\x50\x72\xaf\xc1\x41\xa1\x04\x99\x19\xd2\x6d\x11\xd6\x25\x51\x04\x7b\x20\xca\x68\x79\x5c\x76\xa5\xce\x15\x43\x10\xda\x8e\xdb\x51\x8c\xf4\xc7\x48\x7b\xec\x51\x14\x7b\x11\xc5\x95\x86\x48\x65\xc7\x23\xec\x98\x16\xa2\x87\x10\x4c\x32\xdd\xef\x63\x3c\x10\xff\xd9\x1d\x21\xa6\xf5\xa2\xfb\x26\x6b\xba\xac\x13\x4c\xc2\xe9\xaf\x19\x5d\x10\xff\x96\xe0\x83\xd7\x77\xc9\xdc\xab\x5b\xa9\xd6\xb0\x90\x7e\xc3\x2e\x98\x37\x19\xd3\x73\xde\x2e\x55\xd9\xc4\xa1\xc9\x74\xea\x6f\xc8\xef\xec\x55\xa0\x31\x5d\xd6\x78\x15\x5a\xaa\x31\x7b\xa5\xf5\xba\x47\x57\xf6\x4a\xa3\x8e\x4c\xaf\x15\x5a\x04\xcd\xcf\x5b\x39\x3e\x3c\xb2\x5b\xd3\xe3\x76\xbb\xd9\xbb\xd3\xb6\xca\xa8\x3d\x8e\x0c\xb1\x73\xe6\x3c\x7a\xed\x50\x91\x3f\x90\xb7\x7d\x65\xd9\xd3\x96\xa7\x06\x22\xce\xe5\x40\xb0\xf9\x6d\x3f\xd6\x7c\x5f\x53\x39\xa8\xf9\x5e\x67\x78\xd5\x97\x29\xe1\xe3\xc7\xec\x54\xd1\x93\xdd\x96\x88\xce\x7e\x88\x31\x73\x51\xa7\x64\xd6\xdf\xd4\x95\x87\xbd\xdc\x42\xee\x8f\x22\x4a\x99\xc0\xa0\xb1\x3a\x54\x93\xaf\x49\xec\xdb\x7f\x60\x78\xe6\x98\x00\xc9\x4e\x2c\x56\x5f\x14\xce\x0f\x29\xa5\x05\xee\xa1\x52\x48\x58\xd1\x4c\x84\xa9\x23\x26\xc2\x68\xc1\xe3\x81\xca\x85\xa5\xa2\xd3\x48\xde\x5d\x8f\x8e\xe8\xc9\x0e\x35\x90\xc1\x9e\x18\x9f\x1f\xe2\xde\x86\x02\xc8\xa3\xbe\xd6\x7a\x3d\x26\x67\x67\xe7\xa9\x04\x3f\x9d\xd1\x0a\x19\xc7\x34\x53\x9d\xde\x5c\xa7\xf8\x27\x94\x0b\x90\xf7\x7d\x75\xcf\x7a\x6a\x26\x19\x4f\x53\x41\x2e\xc1\xdc\xcd\x05\xa1\x0c\x25\x5b\xec\x53\xd4\x52\xea\xb8\x09\x1c\x07\xa3\x23\xd9\x94\x92\xeb\x59\xb1\xb6\x51\x2b\x59\xd6\x10\x26\x4f\x0f\x64\x57\xb9\x0a\x15\x1b\x05\xa8\x25\x9d\x8c\x74\x22\xe7\xe0\x3b\xb4\x65\xe1\x0d\x07\x37\x26\x7c\xc5\x97\x72\x7e\xb9\xa3\xa4\x71\xa0\xa5\xff\xc0\x52\xff\x0d\xe4\x10\x14\xa2\x1b\xbf\x7f\xcd\x3c\x82\x62\xc8\x17\xf7\xc1\xb9\xf8\x0f\x96\x4c\x90\xef\x5d\xf8\x7b\xe6\xd5\xbd\xf9\xdd\xda\x43\x0f\x62\x5f\xf4\x7d\x57\xe5\x66\x3c\xe9\xbe\x74\x6a\xdd\x03\xcc\x51\xf8\x7b\x19\xd4\xfb\xfb\x8e\x32\x25\xda\xf7\xae\x73\x98\x28\x4f\xac\x94\xac\x4d\x40\x43\xf7\xfa\x2e\x82\xd9\x23\x09\x30\x6d\xd3\x67\x21\x92\x1c\x21\x86\xf9\x37\x76\x14\x3d\x6e\xfa\x8e\x6b\x61\x6a\x96\x1e\x5c\xbd\x68\xf8\x17\xaa\xa5\x36\x0b\x6f\x6d\xcb\x29\x9a\xa8\xcc\xc4\x5b\x52\xd2\xe6\x10\xac\xc6\x3d\xc2\x10\x11\xc5\x59\x6e\xaf\x8e\x59\xf5\x5c\x8f\xb7\xeb\xaa\xe4\x30\x0e\xe2\xf1\xeb\x17\x96\x41\x27\x9c\x1f\x94\x63\xe0\x41\x85\x0e\xae\xcc\xb4\x93\x58\xc8\xb7\x08\x92\xb2\x8b\xc7\x73\x8e\x9f\x25\x13\x31\x1d\xc1\xe0\x09\xbe\x0a\x01\x79\xb3\x2a\xcb\xfb\x77\x97\xf7\x80\x30\xa3\x50\xe9\x60\x31\x89\x3b\xaa\x78\x95\x57\x1c\xa3\x72\x5c\x26\x6a\x93\xd1\xec\x6a\x4e\x6e\x3a\x39\xbb\x17\x75\x7f\x50\x9c\xff\x0d\xb9\xe7\xa4\x6b\x0e\x10\xeb\xd0\xec\x93\xa5\x6e\xd4\xa2\x6b\xe2\xe9\x89\x5f\xe8\xb7\xf9\x64\x75\x10\x00\x98\xe6\x46\xdc\xed\xe4\x7e\xca\x54\x71\x02\xb1\x07\x98\x12\x92\xce\xba\xeb\x41\xc7\xd7\x1e\x66\xfb\x2f\x88\xdb\xbb\x3b\x3c\x4a\x7e\xcb\x6c\x0f\x18\xfd\x0b\x78\x88\xee\x09\x82\xcc\xa7\x11\x7c\xb2\xfb\x93\x7d\x01\x44\xca\x11\xe0\x91\x7d\x7f\x8d\xa3\xee\xaf\xfe\x4b\x7d\xa5\xd2\x10\x33\x48\xba\x46\x31\x70\x40\x33\x2f\x95\x5a\x5b\x99\x1d\x72\x2c\x70\xac\x23\xd6\xdc\x67\x90\x7c\xe4\x33\x97\x34\x04\x85\x6f\x00\x9b\x74\x6e\xa5\x51\x58\xa4\x25\x7f\xda\xae\xaa\xef\x29\x6d\x50\x37\x91\x14\x24\x0a\xe5\x21\x45\x61\xf1\x22\xbf\xec\x25\xe8\xc9\xd6\x0f\xbf\x02\x1b\xb2\x6e\xd2\xc6\x66\xba\x6d\xf5\xea\xe1\x57\x9b\xf5\x54\xbc\xf3\xe5\x4a\x23\x16\xd2\x58\x4a\x55\xd6\xe2\xc5\xb3\xdf\xfe\xb6\x4b\x7b\xb6\xd2\x50\x0c\x13\x50\x83\xc3\xd8\x19\x90\x71\x42\x03\xdd\xa3\x1d\x6f\x03\xfa\x42\xd9\x85\x8a\xf7\x03\xbc\xf1\x29\xfd\xb0\xc2\x05\x7b\xed\x63\xc4\xa3\xc6\x5a\x6d\xb7\xc7\x68\xcc\xc2\x92\x1e\x2a\xca\x04\xd8\x1b\xf1\x95\x4d\x60\x9f\x21\x65\x99\x03\xd7\x51\x10\x0b\xa6\x5b\x04\xd3\x80\x53\x17\x3a\x3e\x11\xb5\xae\xce\xa7\x1d\x60\xf5\xd6\xeb\xaa\xc4\xa7\x80\x03\x58\xb0\xd6\x90\xcf\x7b\x08\x01\xf2\x1d\x0f\x32\xb3\x71\xe0\x06\xfc\xcf\x38\xd5\xa8\xe8\x98\xa6\xb3\x84\x8a\xee\x1b\x7b\x8f\xe2\x9d\x3a\x1e\xa5\x4c\xcf\x2e\x60\x5f\x46\xc2\xf0\xa7\xab\x56\x7d\x5f\xf6\x2b\x55\xbb\x67\xe3\x89\x6a\xec\x38\x5c\xfc\x71\xe3\x03\x16\xdc\xb2\x02\x06\xb5\x53\x9b\x83\xe6\x92\x70\x59\x10\xd9\xb5\xdb\xe2\xb1\xba\x10\x4f\xbf\x7d\xe9\x5b\x14\x66\xb3\x5e\xeb\xa6\x35\x42\x6e\x5a\xfd\x70\xa1\xe7\x1b\x6c\x68\x4e\x5d\x53\xaa\x65\x73\x92\x69\xec\xa5\x0f\xfa\xb7\x1b\xc9\x46\x69\xb9\x24\xc7\x9a\x15\xd0\x1c\x24\x1c\xcc\x92\xcd\x21\xab\xc7\xfb\xf4\xf1\x3e\xd4\xe6\x71\x93\xe3\x34\xa8\x85\xf5\x23\x1b\x24\xf5\x07\x25\x9e\x11\x89\x69\x84\x50\x78\x16\x48\xc2\x7d\xd6\xd4\x6c\x12\x4e\x09\xc1\x12\x33\x39\xbf\xbc\xf1\x6b\x7f\xb0\x4c\x13\x03\x13\xa5\x96\x3a\x52\xca\xa1\xc9\xa8\xc3\x59\x27\x40\x8a\x87\x4a\x15\xc4\xc8\x53\x07\x87\xf0\xf1\x37\x10\x43\x3a\x22\xb5\xbe\xa6\x18\x32\x0e\xbc\x29\xa3\xe0\xdc\x6b\x21\x62\x69\xd5\xdc\xfa\xdb\x33\x77\x64\xda\xa6\xac\x2f\x8e\x7e\xe1\xd7\x7a\x4f\x77\x7a\x05\xe8\xf9\xb8\xbe\xa8\xdd\xcb\xef\x7d\x3e\x4a\xb6\x79\x7f\x63\x66\xe6\xfd\x20\x37\xd3\xc7\x5f\x44\xf6\xa5\xa4\x8f\xdb\x24\xb2\x3d\x6f\xf6\x35\xed\x5f\xf9\x7d\xca\x3e\xde\x9f\x0f\x9a\xc0\x6e\x42\x13\x87\x41\xc9\x6e\x25\x66\xf5\x2c\xed\xaf\x17\xcf\xad\x03\xde\x56\xeb\x2d\x30\x6e\x84\x16\x84\x7c\x19\x44\xda\xdd\xeb\x59\xfc\x01\x10\xb7\x7e\xed\xf7\x10\x58\xda\x53\xad\x00\xd1\x33\xb6\x06\xf6\xb5\xd4\x8b\x33\x36\x0a\xfd\x6c\xbc\xca\xfa\x20\x7d\x5f\x66\x08\xa7\xa7\xe2\x19\x10\x38\x3b\x16\xc3\xc7\xb5\x0f\xdd\xf1\x3a\xd9\x6a\x81\xde\xce\x14\xe4\x77\xe6\x05\x83\x76\x15\x52\xf6\xd6\xb7\x8c\x91\x86\x79\x4c\x4c\x55\xd6\xed\x43\x32\x89\x3d\xac\xd5\x87\xf6\x61\x55\xd6\x4a\xd4\xfa\xe1\x42\x56\x15\x41\xda\x51\x85\x9f\x1e\xbe\x5b\x04\x22\xc3\xe5\xd5\x47\xd1\xbf\x62\x90\x98\xb2\xbe\xd2\x97\xea\x0f\x1b\xd9\x14\xaa\x78\x42\xcc\xd6\x3f\x7d\xee\xf2\x00\xc2\xd6\x7f\xd7\x96\x95\x99\x66\x4b\x9e\xdd\x73\x59\x31\xe5\xe6\x62\x89\xc5\xff\xe9\xb7\x99\xda\x71\x11\xac\x36\xaf\x94\x6c\xf6\x55\x4c\x0b\x9d\xdd\xcb\xa0\xdb\x50\x38\x4a\x16\xdb\x66\x2e\xd7\xed\xa6\x51\x50\x39\x40\xd9\x5c\xa8\xf6\xf5\x66\x56\x95\xf3\x2e\x36\x4d\xe7\xd3\x6d\x02\xbf\xb8\x68\xb6\x39\xa7\x3b\xdf\x97\x55\x45\xe0\x4d\xdf\x97\xed\x12\xc0\xa4\xf3\x46\xe2\x32\xb1\x39\x03\x96\x25\x90\x47\x44\xa0\xf6\x05\x8f\xe6\x99\xc6\xdd\x91\x89\x21\x8e\x86\x59\xcc\x18\xd9\x28\x53\x96\x81\xf1\xfa\xb2\xb9\xce\x1d\x1b\x60\x5a\xbd\x66\x23\x46\x64\xfd\x33\xc2\x38\x7e\x82\x9b\x45\x39\x85\xd1\x24\xa4\x76\xe4\xb4\x5f\xd6\xad\x6a\x9a\xcd\xba\x15\x9b\xda\x65\x8f\x9d\x72\x53\xb5\x91\x0b\x55\xed\x9e\xf4\x2c\x6d\xff\x2a\x32\x93\x79\xee\x32\x1c\x5b\x7a\x38\xd9\xbf\x65\x13\x41\x05\x3b\xfd\x38\x2a\xe3\xf2\xfc\xf0\x33\x7f\x7c\x92\xfa\x6f\xd3\xec\x90\xec\x9e\x67\xae\x09\xe7\xa8\xf8\xf1\x0e\x33\xe4\x4d\x24\xc9\x94\xbb\x16\x7e\x5c\xb6\xa7\xaa\x95\xf3\xa5\x15\xaa\xa8\x15\x0e\x21\x61\xe5\xb5\xb0\xf5\x0d\x22\xbe\xb8\xe4\x0e\x39\xc9\x2f\xc2\x3d\x19\x58\xd4\x46\x2d\xdc\xb2\x41\x03\xb1\x2b\xe8\xf0\x5a\xf9\xa1\x8d\x5b\xa9\xbe\xb5\x72\x0d\xe4\x7c\x68\x7a\x56\x0c\xd5\x14\x7f\x2a\x17\xea\xc9\x6e\x5e\x29\x06\x44\xbf\x60\x09\x20\xfc\x25\x25\x83\x3c\xff\x76\x00\xbe\x65\x3a\x61\xa6\xf3\x89\x5a\x1c\xb0\x23\xb3\x52\xcc\x5c\x48\x58\x40\xb9\xf0\x8b\x7e\x84\x41\xf7\x27\xa5\x3c\xbc\x13\x4e\x7e\x9e\x96\xc5\x4b\x4e\x7b\x58\x3f\x29\x15\x8a\xc6\x39\x20\xed\x66\x88\x52\xb6\x2a\xa3\x4c\x99\xaa\x9d\x11\xa6\x72\x4a\x9e\x54\x85\x3f\x03\x7a\xb9\x75\xa3\xae\x0e\x30\xc3\x85\x4a\x6f\xf7\x13\xd9\x6b\x6d\x01\xee\xf4\x4f\x7a\x0f\x48\xcc\xf2\x4b\x37\x09\x0b\x72\xe8\xc6\xf4\xc8\x38\xc1\xa8\xe6\xe2\x8d\xa3\x21\xb3\x4f\xe9\x0d\xe2\xb5\xfa\xb4\x5c\x48\x13\x1c\x81\x33\xc7\x09\x0c\x7d\xc6\x31\xba\x2b\x7f\x5d\xcb\x7d\x05\xe4\xe9\xeb\xcd\xeb\xfd\x98\x89\xa5\x8a\xe6\xa8\xf1\x38\x4c\x4d\x7c\x9d\xf9\xca\xc4\xdc\x47\x19\xb5\x44\xba\x6e\xef\xa3\x85\x7b\x7f\xf3\x95\x1b\x41\x52\x7d\x2f\x9f\x0f\x10\x55\x56\x07\x24\x50\xa7\x15\x5e\xc9\x5d\xd0\x94\x6d\x29\xab\xce\x4c\x61\xb8\x34\xe6\x92\x8f\x61\xbd\x30\x9b\xda\x0a\x7d\x3d\xe2\x56\x3b\x7a\xec\xa8\xf1\x44\x97\x5d\xd6\xeb\x4d\x8b\x66\x9a\x85\x6e\x56\x60\x0e\x6b\x74\x15\xeb\xb4\x31\x1d\xa9\x09\xea\x74\x92\xb4\x20\x80\x75\xa6\x78\xfe\x98\xa5\xaa\xd3\x41\xa2\x34\x4d\x43\x9d\xc4\xcd\xca\x4b\x89\x75\xbc\x5e\xb7\xd6\x8e\x70\x9d\x7a\x05\xe4\xb4\x47\x2d\x7a\xce\xbc\x2e\x0e\x7c\xa0\x98\x9b\x47\xfc\xa4\x26\x4e\x1e\x31\xec\xce\x58\xca\x86\x0b\x82\x2f\x42\x38\x17\x4e\x53\x4f\xfe\x7b\xd1\x33\xdf\xeb\x26\xb5\xf7\x68\xf6\xeb\x98\xd1\x85\x8e\x52\xff\x88\xaa\x5c\xa8\x87\x73\x60\x35\xba\x01\x42\xea\x43\x64\x11\xd9\xdb\x69\xaa\x4b\xb8\x5e\xb7\x18\x92\x66\xc6\xf4\xdc\x11\x95\xa3\xd8\xe3\x8e\xd8\x0c\xc2\x71\x2a\x33\xbb\x63\xeb\x91\xf2\x78\xe6\xa4\xdb\x56\x06\xec\x63\xfc\x1e\xb7\x8e\x55\xce\xb1\x7b\x81\x5f\x8e\x8e\xdc\x08\xa6\xf9\x20\xee\x6e\x3f\x57\x39\x4c\x03\xed\x7e\x2d\x8e\x3b\xc2\xae\x77\x2c\x89\xd3\xa7\x47\x30\xe7\x99\x2d\xc5\xd6\x3a\xc4\x7a\x78\x1d\x07\x45\x0e\xfa\xe9\x4d\xbf\xe4\xc1\x4a\x74\xd7\x32\x7c\x3c\x66\x82\xc5\x27\x96\x4f\xe7\x3b\xa3\x9a\x87\xba\x29\x2f\xca\x1a\x11\x24\x48\xe8\x3c\xb6\xc7\xde\x9d\xfa\xba\x80\xcc\xf5\x27\xfc\xfc\x79\x39\xf4\x5e\x84\x2b\x0e\x7e\xad\x28\xa9\x56\xa8\x9c\x5c\x41\x1a\x84\xed\x14\xb6\x20\xd7\x15\x36\x8a\xcd\x04\xe9\x36\x6a\xb0\x6c\x8f\x8c\xd0\x97\x72\xd7\x5d\xbe\x44\xae\xe5\x38\x16\x64\x25\xd1\xf5\x13\x5e\x12\x88\xee\x91\x6b\x85\xd9\x4b\x92\x72\xbe\xc5\xac\x5f\xb1\xdb\x8b\xeb\x49\x30\x7d\xc2\x66\xea\xc7\x57\x8e\x8a\x17\x8c\x66\x3b\xa8\x7e\xe8\x9d\x3b\x1f\xd6\x01\xaa\x83\xbb\x62\x47\xc6\xac\xcf\x60\x1f\x3d\x7a\x7a\xde\x07\x1e\x9f\x57\x80\x0d\x48\x33\xf4\x22\x6c\x0f\x1c\xc3\x4d\x5f\x15\xf4\x2d\x71\x06\x48\x04\xc2\x28\xaf\xd2\x18\x4c\xf2\x1a\x97\x95\xd1\x70\xd3\x20\x0f\x3a\xe5\xe4\x43\x94\x8f\x38\x67\xab\xe8\x40\x2b\x6c\x4b\xc2\x66\x58\x6f\x2c\x51\xcc\xe7\x19\x19\x46\x75\xb2\x1c\x49\x8a\x02\xe5\xfe\x90\x5e\x25\xda\x47\x93\xdd\x23\x16\x5b\xd0\x0f\x2a\x63\xbb\xca\x20\xd1\xb8\x3f\x6a\xb5\x6e\x77\x2e\xb7\x89\x53\xde\x67\x3b\xdb\xbb\x53\x7d\x24\x38\x39\x04\x8d\xd6\x2d\x47\xd4\x03\xd4\x06\x8c\x32\x2c\x21\xa3\x2d\xd8\xee\x57\xfa\x4a\x15\xb1\xe9\x3e\x86\xd5\x98\x4b\xc2\x93\x87\x1c\xfc\x60\x1b\x02\x39\x81\xa2\xbc\xcb\xba\x56\x08\x5e\x62\xbc\xb7\x69\xbb\x54\x3b\xdb\x8d\x6b\x7d\xb6\x73\xc8\x2a\xae\x21\xc0\xd5\x74\x99\x20\xbf\xa7\x53\xc2\x7b\x14\xd9\x7b\xaf\x6b\xc1\x46\x03\x45\x4c\xd9\x42\xcf\x0b\xed\x30\x23\xc3\x5c\xe0\x74\xe2\x10\x00\xd3\x03\x06\xd1\x28\xc5\x92\x15\xfb\x27\x8a\x40\x1d\xec\xa2\xe1\x7a\x13\xca\x45\xdb\x6c\xd8\x5e\xc6\xc4\xba\xe6\x37\xeb\xf4\x54\xfc\x6b\x69\x4a\x06\xd3\xcf\x97\x03\x98\x7f\x8a\x7b\xc7\x2c\x95\x7e\xf4\x42\x37\x61\xcc\x86\xa5\x1f\x7e\x7b\x59\xae\x1d\x6f\xe6\x1b\x8b\x47\x70\xc2\xb2\xd6\x5d\xd9\xde\x0d\xbe\x55\xfe\x52\x86\xab\xd2\x83\x46\x62\x8f\xed\x71\xe8\x13\x5d\x0f\x6c\x47\x5e\x43\x6e\x4f\x44\x63\xaf\x22\x3a\xb7\xd5\xad\xf6\x83\xc2\x3b\x1d\x0d\x49\xc8\x99\x0e\xb4\x20\xc9\xc3\x30\xb6\x5d\x14\x42\xe2\xcc\xe4\xf7\x7d\x45\x8e\x61\x73\x3f\x86\x91\xf9\xd1\x31\x00\xf9\x25\xeb\xde\xd8\xbb\x47\xfe\x4b\xfb\xff\xe9\xe1\xfd\x79\x22\x55\xc0\x3b\x08\x66\x9e\x94\xcd\x39\x3d\x15\x4f\x36\x56\x46\x58\x30\x60\x58\xb1\xd6\xc0\x47\x81\x23\x5f\x51\x9a\xb9\xae\x6b\x35\x6f\x21\x22\x3a\xbe\xcd\x2f\x30\x89\xee\x44\x6c\x7d\x0a\x16\x62\xf1\x40\x8b\xcc\x72\xc3\x50\x93\x49\x7a\xe6\x80\x91\xdb\x6a\xe2\xf7\x42\x5a\x5c\xfb\x00\xfd\xe1\xc9\xa3\x00\xff\xc4\x93\xdf\x42\x36\x73\x2b\xbf\x63\x5e\x19\xf8\x27\x35\x5a\x1a\x9e\xbc\xc3\xb5\xa6\x6b\x15\x3c\xe9\x8d\x6a\xdb\x0a\xdd\xe0\xff\xf0\xe4\x91\xcb\xd7\x43\xa1\x55\x2e\x3d\x2f\x25\x2f\x26\xef\x11\xfb\x77\xd7\x56\xd9\x1a\x55\x2d\xf0\x99\x9c\x29\x1a\xa4\x93\xe2\xdd\x30\xc8\xad\x07\x53\xae\xab\x0f\xad\x68\x4b\x97\xa1\x8c\x86\x16\xef\xb2\xd7\xe9\x24\xf1\x3f\xec\x0b\x77\xeb\xf6\x4b\xd7\xe1\xd6\xc3\xa7\x4c\x13\x99\x52\x3d\xc3\xf0\xe7\x08\xdc\xb9\xd3\xb7\x1c\x91\x63\x40\xe9\x94\x05\x92\x14\x7d\x00\x71\x4e\xb4\x83\xc4\x67\xfb\x10\xd0\xfa\x8a\xdd\x1a\xda\xdb\x19\x87\x3a\xcb\x71\x0a\x39\x0b\x62\x1e\x2a\x68\x98\xc7\x8e\x90\x76\x5e\xd4\x0b\xed\xd1\x76\x52\x9c\x9d\xa8\x0a\x0c\xe9\x10\xa0\x9d\x24\x09\x6b\xdf\x02\xc6\x15\x26\x71\x3f\x41\xf0\x3c\x8b\x5e\xdf\xfc\xa2\xe4\xa4\x77\x31\x52\xb4\xde\x23\xf2\x88\x84\x05\xce\x51\x59\x91\x70\x6e\xc3\xd2\xfa\x0d\xda\x8b\xd5\x4c\x37\x6a\x2a\x56\x43\x0f\xf0\xff\xb9\x5e\x32\xe0\x54\xfb\x2d\x58\x62\xf0\x08\xe6\x00\x9f\x26\x49\x6d\xfb\xe7\x7d\x17\x35\x69\x08\x54\xa9\xe3\xb5\x3c\xf6\x34\xa6\xfd\x74\x4c\x17\xfb\x56\x3a\xa3\x59\xe9\x2e\xe4\x4f\x53\x69\x26\x86\x70\x33\x12\x6b\xd9\x75\xae\x65\x3e\xea\xdd\x53\xec\x01\x31\xeb\xe3\x47\x31\x8c\x53\x10\xf9\xce\x84\xf1\x81\x9b\x99\xbd\x3d\x4f\x10\x6f\xe3\x51\xff\x28\x3f\x4d\x92\xba\x3e\x12\xf3\x90\x4a\x4f\x49\xf5\xf3\x68\x98\x74\xa3\xbf\x19\xf0\x46\xa0\x9e\x0a\x39\xc3\xf3\x9e\x17\x4e\xf0\xda\x2e\x75\xe5\x99\x85\xe9\x48\x8d\x40\xb4\xc3\x39\x86\x8c\xf1\x8d\xe9\x7c\xd0\xfd\x28\xe3\xc8\xd2\xb7\xc7\x9d\x93\x71\xdc\xa3\x6a\xff\x34\xb9\x97\xf4\x15\xcc\xf1\x8f\x3a\xbf\xa4\xe3\xf2\x1a\xdc\x47\xe9\x0f\xdd\x1d\x49\x4a\xfa\x1f\xb2\xe7\xbb\x97\x75\xb8\x11\xf0\xc6\xed\x21\x3b\x70\xf6\xe7\x25\xea\xc5\xbc\x74\x35\x65\x3f\x4f\x62\xe1\xd5\xe5\xc5\x4a\x8a\xc6\x89\xb1\x9a\xe4\xb6\xf0\xf2\xe9\xb7\xb8\x7d\xfb\xa1\xaf\x8f\xf0\x2d\x4e\x11\xe6\x52\x1f\xf8\xe2\xec\xe7\x4c\xc9\x18\xfb\x35\x57\x89\x95\x98\xf8\x95\x36\xaa\x69\xbf\x41\x45\x01\xab\xc5\x7f\x8f\xcb\xbe\xa8\x7d\x23\x7d\xd5\x3a\x45\xc2\xfa\x05\x4d\x49\xb4\x74\xfe\xe7\x4c\xc9\xe7\x8d\x5e\x65\x67\xd6\x57\x26\x49\x59\x45\xbe\xda\xaf\x25\xa6\x75\x98\xc1\x8d\x9b\x05\xda\x08\x6f\x36\x8a\x05\x84\x2a\x90\x0a\x74\x24\xa8\x52\xa1\x7c\x5a\x83\xd2\x84\x4e\xa8\xe4\x49\x57\x04\xa6\x8e\x52\xf1\xd2\x77\x8f\x7f\x49\xfb\xa7\x17\xa0\x73\x29\x9e\x7d\x58\xab\x79\x4b\x08\x5b\x98\x9c\x13\x54\x26\x21\x1e\xf0\xb6\x9e\xbf\x58\x66\x8d\xe6\x1a\xad\x25\xcd\x12\x73\xb6\xf4\x62\xed\x76\x3f\x03\xaf\x94\xfd\x82\x5c\x57\x77\x0c\xb4\xab\x6f\x51\xba\x8e\x47\x81\x38\x48\x3e\xa3\x65\xab\x85\x51\xb2\x41\x99\x74\x2b\x9b\x22\xc4\xf7\x81\x48\xb9\xa9\xdb\xb2\xb2\x32\x2c\xad\xa1\xd3\x45\xd8\xb5\x74\xed\x61\x9a\x98\xef\x02\x98\xb3\x15\xac\xcb\x05\xa6\xd5\x59\x57\x8a\x23\xe5\xca\x46\x79\x24\x71\x29\x1a\x4c\xdf\x43\xf1\xe1\x5e\x12\xc7\x01\xad\x21\xa7\xce\x52\xad\xa6\x0e\x4f\x49\x62\x88\x9e\xfa\x80\xcb\x55\xca\x8a\x0d\x3e\xc8\xab\x34\xc6\x4e\x66\x0e\x58\x07\x72\x43\xc4\x22\xe6\x51\x5e\x69\x17\x94\x50\x65\x61\x45\x77\x9c\x3c\x61\x3d\x4d\xac\xc0\x7f\x64\x44\xdb\xec\x7a\xfa\xbc\x35\xf5\x4d\x74\x98\xe2\x72\x27\x39\x84\xb0\xad\x02\x2c\x0d\x0d\x9a\x11\x54\x8c\xd8\xc3\xa3\x1b\xb1\xa4\xb8\x7a\x07\x97\x1d\x52\xd0\xa1\xd2\x3d\x0e\x74\x3c\x3d\x15\x95\x5d\xfd\x64\x56\x62\x5f\xa8\xc0\x8f\xac\x31\x8a\xd7\x99\x2b\xf7\xc2\x95\x7a\xf0\xa0\xab\xfa\xcb\x03\xe3\x97\x2d\x7a\x31\xb4\x4c\x1f\x2c\x6b\x44\x3b\x60\x70\x74\x3c\x6a\x8d\xb4\xe2\x1c\x59\xed\xf4\x54\xbc\x6b\x76\xec\x5e\x15\xe8\x04\xce\xaf\x51\x04\xec\xe7\xb5\xac\xdc\xf5\xc1\xb3\x8f\x3d\xbb\x8c\x1a\x25\x1a\x8f\xc3\xb8\xa6\xf3\xe8\xce\x76\xaa\x0e\x15\x4c\x43\xe9\x0b\xe5\xf6\xf0\x86\xbd\x90\x25\xa7\x32\x5a\x98\x9c\x3e\x1a\x94\xdb\x92\x90\x0b\xd7\xb2\x69\xbd\xde\xca\xa3\xe9\x67\x56\x27\x06\x95\x19\x99\x75\x6f\x78\xc2\x5d\x0f\xbe\x91\xc0\xda\x03\x2a\xe0\x4f\xc9\x51\x3f\x3d\x15\x4f\x96\x6a\x7e\x89\x89\x28\x52\x5b\x83\x69\x2d\x97\x06\x49\xc4\x66\x00\x75\x0b\xae\x43\x20\x6b\x16\x5c\x0b\x7f\x7f\xe8\x84\x24\x27\xf9\xb9\xde\xd4\x85\x28\xdb\xfb\xe9\xf3\x1a\xc3\xad\x8f\xb3\xd1\xfb\x5e\xb2\x62\x19\x38\x42\x79\xb3\x01\x91\x79\x80\xcf\x08\xd6\x89\xf0\x9e\xd0\xcb\x9b\xf0\x15\x08\x9c\x7f\x9e\xe7\x44\x3a\xbc\x7f\xc4\x8f\x70\xa5\x1d\x18\x8d\x4d\x9f\x4a\xcf\xa9\x74\x58\x97\x19\x03\x76\x8f\xf2\x25\x61\x40\xb0\x76\x0e\xbd\x36\xea\x1e\xf8\x90\xf0\x71\x54\xe6\xf9\xc1\x8e\xfa\x60\xad\xe3\x6e\xed\x3b\xb6\xaf\xd7\x4e\x38\xd1\xdd\xf6\x7b\x40\x5a\x7c\xc6\xa1\x11\xbb\x73\xeb\xc1\x32\xa4\xdf\x65\x33\xe5\xb7\x8a\xe4\x13\x90\xfc\x7b\xb0\xdc\x22\x04\xce\xd8\x2a\x40\x36\xc5\x42\x23\x9a\xe4\x8e\x31\x3e\x3d\x42\x92\xe3\x86\x99\x49\xf0\x09\x18\x20\xf8\x40\x82\xf1\xc2\x85\xe0\xca\x8b\x88\x39\xee\xcc\xe3\x5c\xfc\x07\x6f\x20\x72\xe4\xb0\x37\x65\xe6\x84\x93\x0e\xa7\xd8\xb9\x71\x23\x13\x5e\xe0\x4c\xef\x38\xb5\x1a\x1f\xde\x80\xc9\xf5\x16\x12\x5a\xd8\x26\x70\x91\xba\xb9\x32\xd8\xc1\xef\x38\xcf\xe7\x45\xbc\x9e\x2c\x6c\x13\xda\x87\x11\xa1\xcf\x4c\xe2\x3c\xa8\xb1\xa1\xc7\x6e\xcf\x5c\xf2\xb2\xf1\xbe\x84\x72\xbd\x53\x60\xcd\x8d\x6a\xa3\xfb\xa2\x5e\x23\x55\x1d\xba\x1b\xd0\x1d\x74\xd6\x2f\x80\x20\x40\xa6\xe4\x97\xa4\x75\x23\x0c\xd6\x7d\xca\xba\x1f\xdb\x70\xdd\xaf\x34\xfc\xc9\x1a\xb0\x87\x1d\x86\xb8\x44\x7e\x9b\x14\x96\x51\x4c\xea\x2a\xa4\x53\x7d\x66\xcf\x63\xd9\x12\x18\xaf\x8f\x56\x7b\xed\x2d\xd0\x6b\xbd\xde\x54\xc1\xd1\xd7\xb6\x73\x64\xa2\x87\xb9\x5c\x58\xce\xdd\xd3\x72\xde\xc0\x0b\xf3\xaf\xf6\x1d\x0f\x84\x3b\xf7\x35\x66\x8e\x3a\xa5\x32\x8c\x5d\xd2\x4a\x8e\xcb\x1b\x7e\x0d\xee\xe7\xc6\xd1\xb1\x86\xba\xee\xfb\xf2\xb8\xd8\xa7\x0a\x5b\xe8\x51\x1b\x08\x00\x9d\xe8\xa8\xc2\x72\x10\x13\x3f\x8e\x7a\x2a\x8b\x2d\x11\x33\xc3\x5d\xcb\xe6\x7e\x53\xa4\xe8\xec\x18\xb5\xd5\x6b\xc2\x1b\xd8\xc1\x84\x51\xc6\x3f\xc0\x40\xb2\x05\x3f\xcb\x8f\x2f\xb5\x47\x8e\x19\x5a\x7f\x7a\x98\x3d\x03\x8d\x59\xdc\x83\xc6\x99\x33\x8f\xfe\x84\x46\x1a\x25\x9b\x19\x56\xb7\xc6\xc5\x7b\xae\x37\xef\xdf\x87\x44\xdc\x02\x57\x96\xb5\x53\xd5\x31\xeb\x70\x7a\x2a\x1e\x43\xd4\x8d\xe3\x29\x19\xaa\xfa\x95\x72\x14\x59\x15\x13\xaf\xef\xd9\x82\xd7\x2d\xe2\x53\xae\x10\xfe\x2c\x7a\xf8\x81\x94\xc6\xfe\x43\xd1\x2b\xd6\xb7\x11\xe9\x1b\x95\x57\xc8\xc7\xd5\x07\x78\xa2\x0c\x57\xc5\xda\x1c\xdf\x0c\x9f\xda\x53\xe0\x7a\xae\xf2\x4e\x88\x5b\x25\x64\xd5\x28\x59\x90\xa3\xa0\x2a\x22\xe8\xce\x83\xf9\xb1\xef\x89\xd5\x02\xb8\x3d\x48\xd3\xed\x98\xb0\xb2\x25\xd4\x07\x13\xe9\x28\xfd\x86\xd8\xc5\x4f\xf5\x4b\xe0\xc3\xd4\x28\x69\x4c\x79\x51\x43\x0b\x72\x7e\xe9\x01\x72\xd6\x7a\xcd\x39\x2c\x67\x00\x95\x3b\xb1\x59\x4f\xf3\xc7\xd7\x3f\xe9\xfb\xae\x5f\xbf\xdb\xa6\xd3\x74\xa1\xb6\xd0\xf9\x6e\x26\xe1\x5f\xbd\xba\xad\x7c\x04\xde\xcd\x55\x52\xb9\x3c\x6f\x09\x53\x9d\x5e\xb1\xac\xbb\xea\xd0\xcc\x01\x03\x6f\x87\x2f\x19\xf8\xaa\xa6\x31\x6f\x33\x55\xe9\xed\x4f\x6b\xea\x39\x5e\x37\x63\x6d\xff\xb1\xd9\xdc\xac\xc1\xff\x9a\x1c\x6e\x0f\xd5\xcd\x29\x4a\xe3\x0b\xca\x2c\x08\xee\x92\x32\x84\xb6\x46\x99\x16\x9d\xa7\x63\xad\x9e\x6f\xe9\x6d\x59\xcf\x99\x63\x38\xc0\x76\x4a\x01\xc0\x9c\x2e\xd7\x14\x34\x08\x97\x98\x99\x70\xe2\x14\x25\xfb\x99\xc7\xdc\x7e\xde\x1d\x37\x1f\x3b\x69\x64\xd8\x78\xae\x0c\x75\x00\xe6\xb1\x32\xd4\x3f\x23\x7c\xd9\x6e\xcd\x9b\x63\x4c\x7c\x42\x9f\x0b\x47\x6e\xaa\x71\xd2\x87\x3b\x06\x37\xb8\x8d\x48\xde\x83\xc1\x11\x7c\x85\x7e\x84\x6f\x8c\x8d\x0a\xa9\x90\x09\x58\xac\x10\x4a\x36\x55\x19\x67\xa4\xeb\x24\xb4\x18\x1b\x76\x0a\x7a\xfb\x86\x30\x49\xc9\xd5\x3d\x24\x2f\xf3\x79\xaf\xdb\xa5\x93\xfe\xda\x46\x21\x3c\xa9\xc7\x5a\x4e\xdb\x93\xce\x83\x17\x07\x03\x11\x0c\x09\xaa\x34\x5c\x3f\xf7\x4c\xa1\x1b\x35\xa4\x4c\x85\xe4\xd9\xb9\x1c\xa6\x80\x46\x67\xd4\x18\xe0\x71\x1e\x15\x9e\x05\x41\x10\x8f\xb2\xe0\x89\x87\x04\xf8\xa6\xc9\xc8\x55\x14\xe0\x8f\xc6\x14\x9e\x9d\xbc\xf7\x25\x16\x3d\xa0\xdb\x63\x22\xe9\x45\x6f\xa9\x4c\x1e\x85\x4c\xa2\xf0\x01\xe0\x4c\xee\x66\xc3\x20\xbf\x47\x43\x6e\xf7\xc6\x29\xef\x43\x82\x1b\xb8\x85\xfd\x41\xcb\xf7\x8f\xf3\x77\x6e\x8f\x24\x0c\x92\x2e\x07\x00\x93\xa8\x62\x27\x03\x2b\x60\xa7\xda\x43\x73\xa7\x32\x31\x9c\x39\x86\xbe\x37\x8a\x80\xc4\x48\xa0\xe3\xae\xfa\xed\x5e\xf4\xdb\xbe\xe6\x7d\x97\x3c\x0b\x49\x3a\xf2\x86\xbf\x4b\xf2\x8e\xa4\x7e\x5d\xc7\x7c\xdd\xf7\xe0\x82\xde\x00\x27\xe3\x1f\x26\x3c\x3d\xf5\x5a\x4d\xf9\x94\x8e\x09\x2a\x1f\xfa\xe9\x23\x28\xfa\x02\x25\x13\xb7\xa6\xd8\xb5\xb7\xeb\x3a\x9b\xff\x3d\x76\x04\x64\x4e\xb3\xc9\x0f\x71\xb9\xe0\x27\x1b\xff\x3b\x2e\xe5\xc1\xef\xe8\xef\xf1\xd7\x31\xfe\xa2\x63\xbd\x45\x47\xf9\x8a\x82\xa7\x68\x9c\x40\xad\x73\xba\xdc\x2a\x0f\x7b\x73\x7e\xf2\xf8\x7d\xaf\xbe\x7d\xff\xe4\xdb\x57\xef\x9e\xfd\x7f\xef\xc4\xb9\xf8\xc1\xfd\x1a\xc0\xf1\x62\x24\xfe\x14\x1d\x2f\xc2\xc3\x03\x2d\x42\x5c\x3e\x20\xe2\xa5\x1f\xdd\xc4\x13\xa4\xd8\xb4\x5a\xf2\x8d\xe1\xdf\xe1\x0f\x6f\xad\x40\xf0\x64\xd3\x18\xc4\xef\xc2\x10\x11\xf8\xe7\x71\x98\x19\x4c\x99\x55\x82\x89\x1d\x56\xb3\xd1\xda\x53\x98\xb1\x35\xf9\xc5\x22\x7c\xf2\xc2\x41\xda\xce\xdd\xd9\xbf\x7f\x3c\xc7\xec\x60\xa1\xe6\xb0\xb6\x97\x38\x10\x5c\x2a\x70\x65\x2b\xcd\x5d\x69\x7b\xe9\x62\xce\xb3\xfe\x81\x19\x80\x5f\x0e\x60\xc1\x16\x4c\x9c\x77\xe6\xdf\xb3\x9e\xd3\x58\xd2\xa0\xfe\x79\xe1\xee\x50\xd6\x1b\xb3\x8c\xc7\x01\x76\xff\x09\x78\xd5\xbd\x61\x55\x99\x98\xf5\x7a\x63\x96\xfe\x11\x02\x07\x37\xcf\xc6\x6b\xe7\x6c\x02\xb2\xa6\xb7\x60\xc3\xfa\xca\xaa\xd2\x5b\x23\x36\x86\x44\x58\x45\x95\x41\x67\xe4\x54\x37\xb2\x01\xe5\xd1\xda\xf9\xdf\xd8\xf1\xf5\xcd\xb7\x3b\xc8\x09\x7a\x2d\x38\xd8\x7b\x64\x10\xb0\x48\x94\x10\x23\xb9\x18\xc7\x9d\xc9\x06\x83\xcd\xbb\xc6\x0a\xcd\x2e\x07\xb6\x6d\xc1\xca\x87\xf6\xdf\xcc\x3e\xb4\xc6\x3c\x69\x85\x17\xa0\xdd\x9c\x91\x78\xbb\x49\x83\x6f\x60\x5d\xed\xb0\xaa\x89\xea\xda\x47\xed\x6f\x1b\xdf\x8b\x61\xd3\xef\xb9\x78\x34\xd9\x30\xe7\xb4\x42\x76\xa9\x7c\x9a\x81\x50\x2b\x39\x11\x29\xb8\x6d\xe4\xbe\xba\xd6\xeb\x6c\xf3\xd1\x18\x42\x99\x9e\x31\xb3\x82\xbd\x7b\xdb\x37\xbe\x14\xde\x3a\x8a\x2b\x74\x7b\xdc\xa1\x18\x9d\x21\xe7\x2f\xcb\x3c\xe4\x69\xeb\xbf\x27\xb6\xc1\x8e\x97\xf6\xad\x5c\xd9\x1b\x4e\xc2\x9d\xf7\xe8\xac\xa7\x6f\x87\x6b\x66\xe2\x1c\x9a\x41\x7c\x69\xf2\xa7\x1f\x15\xd4\x76\xf2\xc8\x98\xc2\x7e\x1e\x19\x3f\x48\xca\xa4\x08\x30\x29\x78\x80\xf1\xdc\x82\x5e\xde\x8d\x02\xb2\xea\xfa\x51\xa5\x61\x3f\x91\x73\xcc\xcf\xec\xc2\x1d\x72\xd9\x3a\xa7\x0a\x96\x1f\x9d\x34\xf5\x3a\xca\x59\x89\x0b\xe1\xd7\x80\x05\x2d\xbb\xd9\xf8\x45\x49\xcf\xed\x09\xae\x07\xe0\x73\x98\xf1\xcb\xc2\xf6\x33\x5d\x95\x29\x17\x47\xa2\x09\x64\x77\xf8\x16\x09\xc8\xa7\x84\x49\x30\xaa\xe7\x49\xed\xbf\x38\x82\xf3\x0e\x44\x09\x86\x6f\x6a\xa7\x46\x17\xfd\x39\xa6\x50\x8f\x92\x7f\x4f\xee\x65\x38\x37\x18\xef\xa3\xec\xaf\x13\xb7\x24\x49\xd9\xf4\x97\x4e\x39\xe8\x3b\xfe\xf7\xc4\x1f\xd9\xb4\xb1\xf4\xa7\x6e\x49\x6c\x2e\xfe\x61\x12\x24\x9a\xa4\xc1\xee\x6f\x31\xf2\x35\xe3\x91\x9d\x28\x3e\x86\x51\x46\x41\xef\x6d\x1a\xe8\x44\x2c\x6f\xee\xab\x63\x95\x83\xc4\xef\x8b\xfb\x9f\x1c\xfe\xf1\x0b\xf2\x11\x2e\xb4\x32\xde\xf3\x3a\x54\x5c\x41\x32\x48\x17\xd8\xee\x7f\xef\x11\xc4\x54\xdd\xb2\xc9\x01\x92\x26\x8f\xc5\xcb\xc4\xdf\x44\x8a\xf5\x4f\x51\x5c\xd7\x60\x3b\xbe\x68\xdb\xec\xde\xe9\x27\x95\x2c\x57\xaf\xd4\x07\xaa\x63\xc9\xa1\x3b\xce\x7d\xf5\x86\x72\x41\xf5\x8d\x79\x80\xc9\x1e\x4c\x2d\x75\x02\xf9\x02\x20\x9b\xef\x0c\x73\x04\xdc\x9e\x6a\xa9\xb3\x76\xfb\x92\x50\xdc\xd2\xe4\xa2\xbc\x11\x3f\xee\x04\xd3\xd4\x1d\x71\xb8\xeb\x2c\xb6\x82\x67\xcf\x19\x13\x8e\x03\x3c\x7a\x4d\xb3\x63\x1c\x8d\x3f\xef\xd3\xee\x67\x2f\x88\xfb\x2f\xef\x62\x65\x5e\xae\x32\x2f\xc2\x04\xda\xf8\xe8\xbe\x75\xb6\x3d\xd6\x44\x5f\x21\xd6\xc8\xf3\xb2\x31\xac\x80\x8b\xea\x8b\xda\xc8\x95\x89\xa9\x45\x7e\xfa\xcb\xfc\xdc\x97\x7b\x26\x9e\xf9\xee\xaa\x16\x65\xf1\x4a\xb7\x2f\x65\x3b\x5f\xba\xa4\x2a\x9e\x6c\xf6\xb6\x37\xb6\xd2\x40\x27\x87\xb4\xdd\xdf\x24\x95\xc8\x65\xb2\x49\x5b\xec\x2b\x9a\x6d\x70\x7f\x3b\xf9\xea\xcf\xcb\xba\x60\xdb\x3a\x62\x58\x7b\x6a\x8c\x6a\x7e\xcf\x5a\x8e\xa8\x35\xd4\xcd\xe8\x96\xc7\x34\x76\xd0\x50\x79\x61\xf7\x4e\xbe\x5b\x2a\x51\x28\xb5\x56\xa6\x25\x5e\x94\x6c\xa2\x68\x61\x2e\xeb\x2b\x5d\x5d\x59\xe6\x1c\x72\x8c\xf9\xf7\x93\xf1\xa6\x8e\x5d\x5f\xc9\x9d\xcb\x3a\xa2\x6a\xa0\x74\xde\x5b\x58\x37\xbc\xf2\xd4\xd1\x26\xff\xcb\xeb\x28\x7c\xc5\x19\x7a\x9c\x08\x94\x5d\x3a\x5e\xa8\xa4\xfc\x45\x48\x5c\x88\x24\x72\x7e\x32\xf3\x7e\xf7\xc5\xe6\x46\x56\x8b\xbd\xc1\x1b\xbd\xc3\xeb\xa1\x49\xc7\x71\x27\xf4\x08\xf4\xac\x03\x8b\xb1\x8c\x67\x18\x7c\xc2\xe8\x15\x70\x3f\xa4\x90\x4f\x95\x6a\x55\x77\x78\xc7\x58\xeb\x39\x0a\x40\x7d\x29\x1c\x9c\x39\x9a\x15\xee\x05\x45\x4d\x7d\x07\x87\x29\x44\xd4\x64\xcf\xf2\xf6\xe0\x43\x26\xe0\xa9\xc3\xce\x95\x59\xfa\x12\xcf\x07\xe5\x65\xf6\x4b\x64\x74\x89\x3f\xb1\xf0\x80\xfd\x63\xfb\xc4\xe5\x24\x78\x87\xd1\xf9\x9f\x92\x96\x3b\x6d\x29\xb4\xfc\xbc\xd1\x2b\xce\x57\x3d\xd7\x8d\x77\x8c\xa0\x1e\xa2\xda\x51\xb6\xab\x38\xcd\x60\x54\x2e\xf2\xd8\x60\x33\xc9\x35\x19\x02\x5e\xce\x85\xeb\x9c\x29\xce\xe0\x7e\x83\x27\x96\x51\x6a\x05\x3c\x0f\x7a\x9a\x55\xba\xbe\x30\x96\x64\xac\x29\x07\x92\x2a\xe0\xdc\xbb\x36\xa6\xe2\x8f\x7a\x6b\x19\xa8\x89\x6b\xab\x05\x0c\xed\x90\x36\xb6\x13\xbc\xa8\xbc\xc6\xbe\x44\x5a\x53\x95\x06\x3e\xc5\xe9\xa9\x5d\x5a\xea\x72\x11\xb2\xb8\x21\xc8\xac\x57\xf8\x47\x3e\x8b\x94\xbf\x0f\x0c\x78\x2d\x46\x95\xd2\x33\xee\x9a\x93\x17\xd2\x52\x39\xd2\x50\xa0\x93\x89\x1d\x9e\x69\x6d\x1d\xb2\xf7\xf9\xb8\x4a\x4a\xa9\x62\x94\x83\x00\x73\xcd\x34\x0a\xf7\xb6\x08\xe2\x36\x3f\x46\x95\x34\xed\x33\x8c\x3d\xea\x5a\xab\xf3\x05\xa7\x96\xcc\x50\x9d\xf3\x78\xe3\xce\x06\x2b\xe6\x4b\x27\x8e\x6a\xbc\x2a\xa0\x94\xfb\xba\x07\x35\xda\x8d\xde\x07\xf2\xff\x4a\x3b\x1e\xb1\xc8\xd3\x9f\x88\x0e\x2f\x92\xe8\xab\x8f\xe7\x22\xc9\xc3\x7f\x1b\xe4\x29\xf6\x0d\x08\xb4\x9f\xfb\xfd\x8e\xa0\x51\xb1\x17\x40\x70\xdf\xc9\x0c\x65\x0c\xb9\x0a\xa3\xf1\x1e\x1b\x8e\x46\xa5\x0e\xc8\x29\x1e\xbb\x2d\x47\x70\x49\xd9\x0c\x13\x23\xd9\xa9\xe3\x64\x19\x22\xa8\xf6\x0e\xfe\x52\x87\x1a\x27\x93\xec\x62\x65\x09\xe6\x1d\x70\x1b\xe3\x8e\x64\xb5\xee\xd8\x53\x8b\x77\xef\xa0\xe3\x8c\x83\x9d\x02\x9f\x46\xbe\x37\x7d\xc7\xea\x1d\x6e\x67\xfa\xf0\x74\x3d\x75\xb0\xb8\x73\xfe\xe9\x7d\x96\xfa\x2a\x46\x2a\xeb\xcc\xe9\xbd\xb3\xf3\xfa\x7e\xe4\x81\x7d\x7f\xd3\x13\x9b\x6c\xf6\x3b\x3c\x9d\x61\xd5\x26\xc9\x4a\x4c\x70\x68\x13\xea\xf9\x16\x8f\xf0\xfb\x1b\x9e\xe1\xcc\xd1\x1d\x35\x9b\xdb\x3f\xd3\x59\x00\xfa\xae\x9b\x6e\x97\xbe\xb7\xcd\x8e\x28\x3b\xb7\x33\xa6\x36\xc6\x81\x63\x76\x88\x37\xe2\xe0\x09\x1b\x4f\x0c\x53\x3c\xf4\x8e\xf6\xe3\xb8\x8e\x3c\x68\xfa\xe8\x5f\xe2\xef\x98\x77\x3a\x4b\xe4\x87\x0e\xb3\x16\x2f\x77\x27\xd2\x24\x93\x54\xb4\xc7\x5d\x77\x64\xa6\xe5\x51\x47\x36\xe3\xbd\x95\x57\xf3\xa4\x2b\x95\x9e\x4c\x80\x93\xe7\x0d\x8d\x5f\xa6\x36\x92\x53\x6f\x75\xa9\x3a\xa7\xbd\x5b\x3c\x7b\xd2\x07\x75\xb1\xb1\x2c\x09\x1a\x65\x26\xb0\xf5\x99\x50\x04\xb3\xf2\x71\xc1\x36\xdb\xc5\x59\x68\x3a\x77\xcb\x08\xd2\x0f\x30\x75\x18\x67\x3b\xc5\x0c\xec\x65\x1b\x89\xe3\x1e\x0d\xa3\x97\x41\xcb\x09\xa4\xb1\x59\x27\x15\x49\xa3\xe5\xde\x2f\xcf\xe6\xd6\x02\x26\xb7\x87\xa8\x64\x60\x85\xe6\x12\xd4\xfb\x58\x89\x70\xf1\xdd\x6a\x66\xc0\x85\x18\x5e\x0c\x06\xbf\xa0\xbf\x60\x69\x84\x34\x42\x8a\xa5\xda\x34\xa5\x69\xcb\xf9\x54\xbc\xb0\x75\x67\xd2\x28\x40\x5b\x2f\xeb\x76\x53\xc2\x69\xb0\x02\x82\x95\x58\x0a\xd9\x4a\xcc\x2b\x11\xda\x43\x19\x69\xa6\xc4\xa2\x92\x5b\x5b\xb1\x11\x9b\xba\x56\x73\x65\x8c\x6c\x7c\x50\x72\xb2\xe3\x7d\x3a\xd0\xe8\x86\x45\x99\x0f\xa3\x33\x20\x3e\x7e\x14\xe3\xd7\xed\x5a\x27\xe5\xa6\x67\x65\xf0\xb4\x8c\x3b\x2f\x7d\xc1\x23\xb8\x89\x2b\xd9\xce\x97\x64\x3e\x75\xdb\xec\x42\xc9\x6b\xbd\x15\xd2\x98\xcd\x4a\xa1\x04\x88\x78\x4d\x8d\x81\x42\x62\x2b\x4d\x68\xc9\x6c\xd6\xaa\x59\x54\x1b\xbd\x31\x94\xd0\xdd\x36\x40\xe1\x07\x65\x3b\x0d\xc1\x18\x78\xea\x94\xbc\x50\x4d\x08\x50\xe0\x27\x01\xab\x12\x1a\x17\xcf\xff\x5e\x78\xc9\xf8\x1d\x65\x7f\x97\xed\x04\x4f\x20\xb8\xe9\xd6\x4a\x15\xf6\x24\x16\x9b\xd5\x6a\x17\xda\x43\x84\xa9\x34\x77\x50\x08\xf2\xe8\x55\xf6\xe4\xf7\x27\x4f\x65\x22\x6c\x8f\xfd\xbb\x72\xb0\xf6\xab\x73\xa0\x13\x0b\xfa\x90\xb1\x89\x8e\x75\x4f\x02\xef\x65\x30\x64\x72\x9d\x5e\xd9\xab\xcd\x0b\x5e\x16\xa9\xa3\x7a\x62\x13\x60\xce\xe2\xdc\xc9\x62\x91\x55\x17\xed\x1d\x5c\x7c\x33\x52\xa7\xfb\xd2\x44\x3e\xf6\xf0\x03\x70\x3e\x7a\x11\x7c\xed\xa7\x4c\x52\x8e\x3d\xe4\xa3\x99\xf8\x1e\x08\xbb\xc1\xfb\x43\xe3\x3c\xcb\xba\x28\xe7\x84\x4d\x8e\x97\x02\x33\x8f\x49\xe7\xcc\xac\x1b\xc4\x59\x52\x8d\xd7\x6c\xc0\xe7\x5a\x6d\x21\x29\x13\x84\xa9\x35\x97\x81\x76\xd6\xd4\x45\x50\x7b\xec\xf3\xcd\xef\xbc\xe6\x78\xf0\xd2\x27\x79\xff\x21\x89\xf8\x92\x8e\x62\xb7\xe3\x8c\xde\x73\x10\xda\xc8\x0e\x9d\xd9\xe0\x50\x14\xad\xd3\x1e\x68\x33\x63\x0f\x4a\x5c\xb1\x59\xdb\xf1\x11\xe0\xa1\xf5\xbc\xd5\x34\xe0\x53\x45\x34\x6c\xdf\x22\x08\x70\x3c\xaf\x2a\xa7\xb8\x77\xee\x37\x5b\xd8\xe6\x24\x28\x37\x68\xf5\x63\xf0\x7c\xfa\x57\x1c\xe9\x91\x00\x8c\x45\x29\xd3\x10\xd4\xdd\x4b\x9e\xdc\x1e\xc1\x68\x48\x1c\x50\xc7\xcb\xe7\x39\xc4\x11\x9a\x1e\xb1\x2f\x90\x3d\x95\x6c\x6f\x4d\xeb\x23\x0e\x30\xf9\xe5\x55\x14\xd9\x33\x32\x56\x52\xfd\x94\x5f\x82\x5e\x79\x7d\x68\x1d\x46\xa9\x29\xc4\x4d\x54\x15\xe2\x06\xea\x8a\x9e\x85\xbe\x9e\x1c\x7d\xab\xeb\x9e\x81\xd7\xe9\x12\x33\x7e\xb5\xb3\xae\x63\xef\x34\xf0\x80\x3d\x78\xa7\xd7\xc5\x8e\x85\xb4\x48\x1e\x9b\x22\x0f\xe9\x98\xf9\xfe\x26\xca\x6b\x32\x0a\x35\xb6\x87\x5b\x08\x38\xb4\x5d\x67\xb9\x01\x7b\x1c\x26\x5b\x76\x34\x21\xd7\x76\x24\x09\x20\x0a\x2b\x98\x31\xc1\xa9\xb0\x8e\xfc\xe8\x3a\x56\xcb\x89\x4f\xc1\x54\x7b\x28\x98\xd0\x18\x47\x25\xc8\x4b\x87\x43\x32\x9e\x93\x4b\x8e\xc8\xae\x11\x32\x04\x2d\x3d\x03\x8c\xe1\x48\x98\x0a\x2a\x67\x55\x45\x28\x25\xce\x4b\x8a\xad\xa5\xdb\x91\x4d\x15\xc5\x90\xad\x0f\x24\x06\xc7\xc2\xb5\x68\x14\x18\x3b\x59\xa3\x7a\x21\xf4\xa6\x61\x4c\x2e\xa1\x37\xba\x39\xf6\x1f\xbe\xbc\xa8\xc7\x85\xef\xdc\xfa\x84\xf7\xb4\xab\xb3\xb9\xc7\x97\x88\x42\xd4\xea\x9d\x68\xd4\x4a\x96\x35\x60\xe1\x7a\x8e\x11\x0d\x30\x51\xac\x34\xb1\xd9\x90\x63\xa9\x76\x21\xf0\x0c\xf2\xa7\x20\x96\x89\x1f\x84\xa5\x92\x05\xac\xd5\x4c\x17\x3b\x61\x80\x7f\x07\xd4\xcc\x56\xd5\xd0\x28\x0c\xa2\x91\x75\xa1\x57\xae\x3d\x6d\xb9\x1e\x0f\xb9\x48\xb8\xb9\x0e\x87\xb3\xbc\xa8\x7d\x02\x29\x8c\xc7\xc7\x2c\x9e\x9b\x26\xc1\xb3\xa3\x68\x30\x58\xf1\x42\xb9\x58\xed\x69\xcc\xf8\x7d\xa3\x5a\xd8\x2d\x2f\x76\xc6\xc7\xbf\xe7\xd6\x7e\xfc\x88\x8b\x6b\xbf\x1c\xd9\x19\x1e\xd9\x8b\x1c\x7e\xb2\x73\x85\x9f\xee\xe7\xdc\xe8\x8e\x7b\x39\xd8\x93\x38\x41\xcb\x01\x9a\x89\x10\xc5\x9f\xd5\x4e\x0c\xc8\x27\x39\x71\x35\x90\xdb\x1b\x89\xca\x91\x11\x76\xdf\x31\xef\x15\x66\xb2\x94\xed\xeb\xfe\xa1\x24\xfc\xe5\x49\x94\xab\x79\xd0\x60\x9f\x71\x0f\xf4\xae\x6c\x7b\x7c\x25\x06\xc6\xcf\x52\x07\xe5\x85\xf0\xae\xd7\x6b\xd6\xdf\x31\xf3\x23\xf7\x19\x4d\x4a\x67\x7e\xc4\xd2\xfb\x1d\x1b\xf7\x95\x20\x7f\xd6\x41\x47\xc7\xa1\xaf\xfd\xf5\x63\x7f\xc2\x7d\x25\x82\x97\x6e\x32\xf7\xce\x4f\xc1\x5f\xd6\x19\xd3\x2b\xd5\x82\x63\xfb\x52\xeb\x4b\x84\x70\x21\x8f\x78\x4b\xe5\x66\x9b\x0b\xb1\xb5\x6c\x3e\xf8\xe2\x03\x04\xe6\xd4\xd6\x7c\xab\x94\x58\xb6\xed\xda\x3c\x3a\x3d\xbd\x28\xdb\xe5\x66\x36\x9d\xeb\xd5\xe9\x42\xce\xd5\x4c\xeb\xcb\xd3\x46\xc9\x79\x7b\xba\xde\x54\xd5\xe9\xff\xfc\xcd\x17\x5f\x4c\x7d\x6f\x84\xc5\xcc\x6d\xec\x6b\xc8\x55\x2b\x1e\xbf\x7e\x31\x81\x6f\xea\x4a\xd5\x80\x1b\x01\x5e\x8b\xe2\xa9\xba\x7a\xa7\x75\x65\xa0\x8d\xff\xa5\x37\xe0\xdd\x03\x44\xb6\xac\xff\xb7\x9a\xb7\xa0\xc8\x98\x6d\x2e\x6c\x21\x4b\xae\x76\x7a\x83\x21\x9c\x9a\xfc\x1e\x69\x3e\x88\x13\x38\x4d\xfc\x84\xed\x0a\x36\x9b\x95\xaa\x5b\xe7\xc6\x6b\xcf\x9d\x6f\x10\x2f\x4c\xc6\xbf\x38\xa9\xf7\xfe\xb7\xe2\xbc\xff\x2b\xd5\x26\x8d\xef\xdb\xa5\xde\x3e\x2d\x65\xa5\x2f\x62\xa7\x64\xb9\x6e\x37\x8d\x2a\x9e\x35\x8d\x26\x9e\x22\xba\xa2\x6e\x0c\x86\x57\xef\x34\x79\x76\xef\x9e\x6f\xb2\xd2\x17\x4f\x78\xa3\xb9\x2e\x6c\x8b\x95\xbe\x80\x5f\xc4\x39\x6b\x3c\x29\xec\x9c\xb4\x1e\x57\x95\xde\xd2\xca\xab\x82\x97\x07\x0f\xd5\x75\x63\x77\xaf\x75\xe3\xb2\x2f\x90\xd1\x95\x9a\xa2\x8f\x6a\xa5\x2f\x2e\x08\x78\x3c\x8d\xac\x68\x7c\xea\x75\xf0\xe8\x80\xa5\x7c\x25\xdb\xf2\x8a\x22\xfe\xe1\x6d\x5a\xc9\x5a\x5e\x28\xd1\xa8\x62\xa6\x3f\x88\x99\x5a\xca\xab\x52\x03\x54\x83\x7d\xa6\xc2\x34\xce\x89\xa4\xc4\x3e\xd4\x9e\xc0\xf0\xd0\x1e\x7a\xc7\x5e\xc9\x15\xda\x17\xd8\x9c\xa7\xd1\xd7\x28\x87\x08\xfe\x0c\x7e\xfc\xfd\xb5\xe0\x73\xa8\x06\x4b\xf0\x8d\xde\xd4\x85\x6c\x76\xd9\xfe\x3a\x25\x7a\x2a\x23\x16\xf4\x60\x6d\x28\x12\xaa\x6f\xcb\xaa\x7a\xa3\xda\x66\xd7\xa9\xe5\xbf\x60\x18\x67\x66\x59\x5e\x2a\x63\xec\xaa\x9f\x27\xab\xf5\xb5\x38\x7a\xb7\x54\x98\xe6\x91\x7c\x90\xf5\x1c\x78\xcc\xc2\x79\xa8\xfc\xfe\x48\xfc\x3a\xa9\xf5\x6b\x71\xf4\x55\xf8\xe9\xd1\x91\x78\x34\xdc\x8c\xae\x81\x5f\xd9\xe9\x8d\xa3\x07\x81\xdd\x79\x74\xc4\x22\xf2\xa2\xe9\x87\x31\xf3\xd0\xc9\xd3\xd3\xdc\x3a\xce\x11\xc8\xdb\x08\xb3\x59\x2c\xca\x79\x69\x85\x84\xcc\x66\xf9\x62\xad\x16\x46\xb6\xa5\x59\xec\xc4\x73\x8f\x7e\x04\x21\xd5\xdd\xb6\x1f\x3c\xe8\xb6\x14\x63\x18\xfa\xf5\xe7\x1c\x4a\xcf\x5c\x8e\x70\x01\xb8\xdf\x90\xf3\xf0\xa1\x00\x7f\xcf\x96\x81\x5b\x10\xc0\xd2\x98\x79\x63\xa5\x54\x61\xb7\xe2\xf8\xc8\x25\xdf\x75\x4b\x3d\xa3\x4e\x80\x6a\xba\xd0\x9f\x09\x14\xee\x2e\xc1\xaf\xc5\x11\xf7\x16\x4f\x41\xa6\xfa\x46\xcd\x9c\xd4\x11\xf1\x12\xc0\x1f\x00\x17\xb3\x2e\xaa\x90\x16\x36\x19\x51\xff\x18\xfe\xad\xb6\xdf\x8e\xde\xe0\xdc\xdd\x84\xba\x53\x5e\xc8\xd2\x36\x6f\xb4\x60\x0b\x47\x68\x3a\x01\xf5\xed\x28\xe1\xd1\xe2\x69\xf5\x4d\xea\x89\x06\xb9\xad\x11\xb2\x28\x10\x17\x3a\x1d\x7f\xab\xf1\xd4\xc2\xb8\x5a\x2d\xe6\x1b\xd3\xea\x55\xf9\xef\x6e\xa2\x30\x7b\x90\xc1\x1c\x1d\xa3\x79\x21\x18\x97\x7b\x5d\x17\xb3\xe9\x4a\xe1\x7b\xfa\x10\x2a\x3e\xa4\x1e\x4a\x65\x30\x4d\xa5\x6c\x28\x93\x2c\xa2\xcd\x47\xc3\x28\x95\x71\x13\xfc\xc4\xaf\xf7\xac\xac\x55\xc1\xa6\xd3\xb9\xa8\xee\xdb\xaf\x53\x72\xf7\x6b\x71\xf4\x6f\x35\x8e\xf4\xf8\xa8\xb3\x47\x54\x8d\xc5\xfa\xbd\xa8\x45\xa1\xae\x54\xa5\xd7\x10\xf1\x0f\x30\x6e\x14\x13\x66\x57\x47\x6f\x6b\xb1\xa2\xbe\x40\x7a\xf9\xdf\x1b\xcc\x0f\xc2\x0e\x33\xf8\xff\x72\x11\x0b\xf1\xa7\xca\x7a\x5e\x6d\x0a\x74\xad\xa3\x3c\xec\x15\xcd\xde\xb5\x68\xa5\xad\xff\xe7\x2d\x39\x10\xb3\x4c\x05\x62\xd6\xe8\xad\x51\x8d\x6b\x73\x29\x8d\x47\xc5\x5b\x37\x65\xdd\x62\x0c\xa0\x77\xeb\xb3\x55\xe4\x7a\x5d\x95\x73\xe4\x12\xcc\x96\xc2\x8e\xfd\xb9\x75\xc0\x83\xe0\xa1\xe7\x9a\x2d\x4a\xb3\xae\xe4\x2e\x1c\x71\xea\x16\xe4\xc1\x4b\x23\x28\xaa\xf9\xe9\xb3\x7f\x7d\x08\x0c\xcd\x42\x5e\x2a\x81\x0f\x68\xdb\x94\xe0\xf3\x8c\x47\x17\x68\xf5\x77\x6d\x59\x91\xa8\x1c\x3d\xab\xc7\xc9\x7e\x3a\x34\x01\x64\x17\xca\xfa\x4a\x5f\xaa\x3f\x6c\x64\x53\xa8\xe2\x89\xac\xaa\x99\x9c\x5f\xfe\x93\x67\x57\x58\xcb\xd9\x92\x67\xd0\xc8\x52\x9a\x27\x72\x73\xb1\x6c\x1d\x9f\x90\xd6\x8d\x0b\x60\x25\xc8\xb9\x3a\x5c\x2d\x2d\x62\x1f\x21\xc7\x95\x14\x65\xf1\xbd\x6c\xea\xc7\xf6\x50\x03\xeb\xfa\xae\x91\xb5\x29\x89\x4b\xf3\x22\x03\x2b\xfa\x56\x61\x41\xb0\xf0\xb0\xb8\xaf\x5c\x51\x5b\x0e\x75\x60\xcf\x75\xf3\x9d\x83\x8f\x0c\x72\x2d\x01\x2f\x60\xa5\xad\x1b\x07\xd6\xf8\xb6\xf6\x15\x92\x1c\x77\x89\x9e\x2c\x65\x2f\x2e\x54\x90\x9c\xed\x4f\xae\xc6\xc7\x8f\x44\xdb\x01\x51\xeb\x28\x58\xd8\x47\x8e\xf6\xcf\x51\x47\x7f\x19\x32\xf3\xdb\xa9\x80\x68\x48\x11\x48\x4f\x64\x8d\xcc\x34\x19\x65\xa4\x70\x33\xb3\xd7\xc8\xfe\xd5\x92\x28\xa0\x4b\xc1\xec\x83\xac\xdb\xc6\x6c\x80\x8c\xaf\x94\xac\x0d\x3c\x20\xa4\xe7\x37\xb4\x0f\x13\x97\x61\x91\xfe\x05\xad\xe8\xc6\xf2\xf6\x73\x9a\x0e\x64\xf2\xae\x03\x7e\xa7\x48\x3b\x41\x43\x8f\x7e\xa8\xd7\x53\x4b\x76\x28\x82\x09\xc7\x03\x2f\x32\x92\x8a\x42\xf9\x64\x41\xbf\x62\xef\xe0\xf4\x68\x12\x6f\x82\x83\x4b\xbb\xd6\xba\x32\x8d\x53\xe6\x6c\x50\xb6\x83\xef\x28\xcf\x2e\x3f\x18\xa9\x63\xbb\xb3\x23\xc0\x9e\x3f\xb5\xb2\xc6\x13\xd4\xcd\xa1\xde\x79\xbd\x94\x46\x25\xce\x49\x47\x2e\xe6\x9a\xce\xf5\xd1\xa3\xc8\x76\x31\x70\x03\xc6\x42\x0e\xa6\x27\xc3\xed\xe2\xf1\x74\x3a\x3d\x79\x24\x9e\xc8\x1a\x94\x88\x12\xf3\x15\x3b\x95\x00\xa9\x2f\x93\xd1\x1d\x9f\x70\x64\x9b\xe1\xeb\xb9\x2f\xb7\xc5\x11\x8a\x06\xf9\x09\xe7\xa8\xc3\x75\x27\x4c\x33\xa4\x8b\x50\x6c\x1a\xf7\xae\x7f\x28\x0d\xdc\x02\x50\xa4\x88\x36\x90\xa1\x63\xb3\x99\x2f\x85\x44\xbd\x5b\x59\xc3\xb1\xfc\xec\xaf\x38\xde\xbf\x42\xa8\x49\x8d\x0a\x3c\x7f\x8e\x30\xc8\xdd\x0a\x87\xf3\x56\x37\x27\x53\xf1\x06\x0a\x8b\x95\x6a\x97\xba\xf0\x88\x59\x9f\xd9\xf3\x3d\xb3\xb7\x11\x94\x79\xfe\x24\xe9\x05\x79\x97\xd9\x87\x0d\x86\x73\xc6\xdb\x8b\x10\x8a\xc0\x61\x1c\x2e\x8a\xb4\x77\xac\x2d\x1f\xae\xa5\x95\xa2\xea\x09\x68\x7d\xe7\xb2\x16\x33\x25\x30\x2b\x7e\xab\xc5\x5f\x23\x5c\x42\xc8\x17\xf8\xd7\x69\x66\x17\x7b\xe8\x71\xef\x2e\x7e\x22\x8d\x43\x2a\x40\xbf\x25\x3f\x84\x66\x30\x32\x77\x19\x61\xd0\x64\x21\x70\x5c\x9d\xb3\x34\x94\x27\x5b\x2f\xf9\x98\x56\x4e\xc3\x9f\xc5\x39\x1f\xc2\x34\x1f\x1d\x9d\xc6\x47\xf7\x57\x62\x20\x3b\xdd\x50\xe6\xa4\x5a\xb7\x80\xa7\x39\xef\xc3\x84\xbe\x51\x17\x65\xfd\xbd\x6e\x2e\xa3\x69\xfa\x5f\x69\x7e\x89\xe1\x3f\x5d\xa2\x89\xf7\x0a\x01\x44\x25\x38\xae\x9b\x56\x3d\xfb\xb0\x2e\xb1\xdc\x73\xdd\xa0\xa9\xc3\x8d\x7e\xc6\xba\xcd\x8d\x66\xea\x0b\x44\x35\x9e\x03\x47\xbe\xb7\x5e\x28\x96\x9b\xb2\x25\xcf\x95\x6a\xd5\xf7\x3a\x9a\x73\xf8\x79\xec\xb4\x4f\x18\xd2\x93\xaf\x1a\x0f\x2c\x34\x3a\xe5\x85\x7a\x86\x45\x90\x54\xe9\xb0\x3c\xe6\x26\x0d\x8a\x24\x70\x54\xac\xc4\x68\x53\x29\x92\x56\x67\x34\xd4\xd6\xf4\x20\xe0\xad\x3d\xad\xec\xc1\xe3\xda\x53\xbb\x1f\xa6\x6b\x4f\xc5\x21\xf4\xae\x3d\x55\xf7\x82\x7a\xed\xa9\xbf\x0f\xeb\x6b\xef\x94\xa9\x9c\x3f\x07\xb5\xde\x06\x04\x80\x5a\x6f\x5d\xbb\xee\x5e\x3d\x55\x0b\xd5\x34\x81\xad\x66\xe8\x02\x3d\x25\x5c\x0b\x1b\xa3\xde\xee\xea\x39\x91\x4b\xd4\x97\x53\xd5\xce\xa7\x24\x40\xfd\xb9\xa6\xa1\x87\x2a\xe9\x97\x88\x1a\x01\xc2\x7a\x5a\x23\xfd\xe2\x14\x81\x6f\xd4\xda\x7e\xaa\x5b\x13\x59\x38\xdb\x72\x05\xb6\xc4\x95\xf1\xb1\x95\xa6\x95\x4d\xfb\xae\x5c\x21\x20\xef\xf6\xd8\x13\xdb\x95\x36\xed\x1b\x35\x57\x75\x4b\xec\x0f\x15\x5a\x99\x77\x3a\xd0\x1e\xfb\xe3\xf1\x6f\x4e\x7a\xfa\x55\xbe\x1c\x76\x0d\x3e\x29\x65\x3d\xd7\x2b\xbb\x54\x1b\x62\xc6\xe8\x59\xdd\x18\x35\x15\xc7\x84\xc7\x70\xcf\x39\x12\xbd\xd2\x48\xf5\x9c\x6c\xe8\x74\x97\xa6\x6d\x64\xab\x2e\x76\x8f\x84\x34\xbb\x7a\xee\x1b\x2b\x6b\xfa\x61\x05\x11\x78\xf6\xaf\xd8\x16\x2b\xe0\xbf\x4f\x4f\x68\xb2\x61\xa0\xe1\x95\xc0\x9e\xfd\x21\x2a\x8d\xfd\x67\x1a\x3a\x4a\x91\xb1\xe0\x4b\x08\x7a\xed\x32\x84\xb8\x91\x2f\x1e\x86\x93\x81\x19\x37\x18\x79\xb7\xd4\x16\xfa\x4e\x3a\x23\xda\x77\x75\xd9\x7e\xbb\xa0\xdb\x99\x86\xb7\x52\xfe\x76\xf7\x33\xf5\x0c\xeb\x6a\x3b\x58\x96\xf3\x65\xa7\x1b\xe4\x76\x6c\x47\xb6\x43\xde\x15\xb2\x36\xf1\x46\xc6\x93\xe6\x53\xa3\xbc\x95\x65\xbb\x04\x9e\x8b\x52\x62\xe5\x26\x86\x77\xb0\x25\x45\xb2\xeb\xcd\x47\x84\xe1\xe8\xb1\xf5\x7f\x51\x6a\x6d\x19\x36\x04\xa8\xc6\x09\x2c\x10\x9d\x06\x8c\xad\x4e\x17\x1a\xd4\x37\xd0\xa3\xb3\xf2\xce\x94\xd3\x51\x91\xca\x1a\xd6\xad\x34\x84\x60\x5f\x38\xe0\x67\x50\xbd\x55\x95\x42\x26\x46\x42\xa2\x02\xcf\x4e\x3d\x2d\x8b\x27\xa0\x8e\xf2\x8e\x50\x53\x0f\x88\xc0\x34\xb1\x26\x5e\xf8\x7d\x23\x27\xdd\x16\x71\xa9\xfc\x06\xce\xa0\x33\xc2\xb1\xe4\xaa\x76\x10\xa5\x8a\x72\xb1\x50\x50\x0e\x33\x9f\xc9\x3a\x19\xc6\xc4\xeb\x49\x42\xe6\x4c\x84\x55\x83\x6c\x97\xf7\x7c\x9a\x23\x55\x17\xce\x82\x03\x5d\x06\x81\xcd\x2e\x1f\x79\x02\x34\x7a\x2d\x2f\x2c\xd7\xac\x70\x8e\x73\xdd\x60\x56\x24\xcb\xc4\xcb\x7b\xe4\xea\x3a\x43\xdd\x9d\x2c\x2b\x83\x9a\x2c\x18\x97\xae\xe7\xca\x2d\x15\x4e\xf7\x9b\xa0\xf9\x8a\x16\xeb\x59\xa2\xf2\xc2\x5d\xec\x6e\x6e\x66\xb5\xf0\x30\x4d\xa3\x1c\xda\xaf\xad\xfc\x95\xed\x0b\x86\x52\x36\xa6\xfd\xae\x9e\x47\x8a\x0d\x5e\xa0\x28\x8b\xe7\xb2\x95\x55\x74\x8b\x5d\x26\x43\x77\x74\x53\xbd\x44\x69\x48\xfc\xcc\x5c\xff\xef\x8c\x3d\x6a\xba\x11\x6b\xd5\x2c\x74\xb3\x02\x6b\x2a\x9c\x0d\x76\x07\xca\xba\x55\x4d\xb3\x59\xb7\xaa\xf8\x66\xc7\xaf\x41\x6c\xd3\x7d\xc2\x40\x8b\x8e\x23\x90\x73\x97\x09\x0f\x94\x65\xc1\x9a\xfa\x4f\xbf\x3d\x0e\x2e\xa2\xa1\xd4\x1c\xe0\x8b\x4c\x28\xe7\x25\xbf\xb3\x7b\x79\xf6\xf6\xb8\x17\x90\xfc\x71\x55\xd9\x92\x78\x83\x8d\x1f\x15\x33\xe3\xf7\x46\xa9\x06\x49\xaf\x47\x96\xb6\x23\x63\xff\x66\xad\x9d\xa4\xfe\xdb\x8d\x9a\xeb\xa6\xc0\x8f\xc7\x4e\x83\x49\xc4\x9b\xc5\x24\x87\x16\x42\x74\x28\xf7\x88\xdf\x9f\x78\xb0\x8f\xd9\xcb\x0f\xae\xa7\xe9\x37\x6a\x91\xa6\x3a\x0a\x58\x52\x6c\x8c\xb2\xb2\x32\x9f\x6c\x55\xec\xec\x98\xa2\xfd\xe6\xf2\xf5\x7b\x36\x27\x01\x9b\x17\x91\x83\x59\x70\xe7\xb1\xb4\x7c\xa1\xab\x4a\x6f\x41\x5a\x46\x25\x07\x48\xa9\x2b\xf2\xe5\x04\x4d\xd3\xdc\x5e\xec\xa6\xb6\x17\x13\x14\xd6\xeb\x94\xfd\x0c\x4f\xe9\x04\x04\x5d\xe7\xa7\x6e\xc0\x51\x5d\x82\x49\xc7\xd2\x18\x8a\x1b\x90\x45\x21\x24\xea\x0a\xec\x25\x51\x57\xaa\x61\xde\xea\x6b\x6d\x4c\x39\xab\x94\x98\x95\xed\x4a\xae\xc5\x95\xac\x36\xe0\x90\xcf\xf2\xc2\x08\xa3\xe6\x1a\xb5\xf6\x4e\x78\x76\x90\xfe\xa1\xa1\x90\xa5\x11\xa5\x6f\x9c\x1e\x40\x54\xc8\x16\x9b\x9d\xb2\x23\xb3\x6e\xca\x95\x6c\x76\xcf\xd8\xc9\xe1\xdb\xf7\x1f\xc7\x9e\x15\xfc\x68\xe9\x97\xf8\x18\x27\x87\xfc\x68\x37\x58\x7c\x14\xaf\xf1\xca\x27\x68\xdf\x3e\xd9\x53\xd2\x49\x27\xe6\x38\x60\xef\xb2\xdd\x4d\xbc\x55\x93\x94\xb0\x99\x43\xe8\xd7\x00\xb3\x58\xda\x15\xfb\xcc\xef\xda\x67\x94\x12\x2f\x2c\x8f\xd1\xee\xe1\x16\x97\x96\x31\x26\xb7\x6e\x7c\x1c\x9c\x97\x9b\xcb\x6c\x98\x76\x21\xeb\x9d\xa8\xca\x85\x7a\x38\x47\x41\x00\xcc\xc1\xfc\x31\x05\xd5\x84\xb8\x50\x2d\x7f\x4e\xa3\x26\xd0\x9f\x69\x51\xd6\xc5\xd3\x6f\x5f\x42\x20\x97\x83\xde\x6a\x54\xb5\xc3\x2d\xb3\x8f\x61\xbd\xc3\xd7\x66\xb6\xb1\x87\xf3\x25\x2a\xff\xd2\xc6\x6c\x55\xd8\x70\x5f\x02\xb0\x7b\x2d\x17\x3a\x87\xe8\x07\x59\xef\xb6\x72\x67\x27\xbd\x55\x8e\xd1\x9c\x29\x21\x67\x55\x67\x6e\xad\x16\x97\x60\xbc\x5b\x96\x09\x4c\x7d\x8e\xa8\x40\xc2\xcf\x24\xe6\xdc\xfd\xd9\x17\x19\xec\xab\x3d\xae\x49\x23\xd9\x7f\x00\x4e\x4f\x43\xf1\x9f\xf3\xc9\x18\xb3\xc6\x69\x9f\xb8\x76\xd1\xaf\x20\xf6\x8f\x25\xb5\x22\x12\x88\x8f\xdf\xfb\xb4\x1b\xbd\x6b\xb9\x6f\x67\xf7\xed\x26\x1f\xde\xe7\xd7\x1d\xdf\xe7\x37\x18\xa0\x87\xf1\xee\x1d\x62\xc2\xeb\x74\xf3\x9a\x25\x29\x59\x7a\x87\x92\x67\x9a\x46\x0d\xd6\xe7\x95\x89\x44\x87\xb0\x56\xe1\xaf\x91\x33\xa9\x9b\x48\x0f\xb7\x81\x9c\x10\xe7\x37\x4e\xfa\x22\x39\x3d\xeb\x13\x74\x19\x07\x71\x3e\xe3\xd8\x92\x1e\xe6\xe1\x98\xac\x2f\x1f\x85\x7b\x85\x4e\x62\x44\xb7\x98\x13\xe2\x67\x6b\xec\xc9\x4f\x15\x35\xc7\x43\x47\x7f\x2c\x97\xd3\x37\xb0\x44\xab\x73\x10\x23\xf5\xac\x69\xc6\x77\x01\xfc\xfe\x1f\xc9\x72\x3f\xd8\x8d\x93\x4b\x87\x8f\x15\x8a\x2f\xb5\xd9\x34\xca\x53\xc6\x79\xa5\xd0\x6d\xdc\x28\xb1\x59\x73\x9a\x89\x76\x6f\x39\x9f\x97\x85\xaa\x5b\x30\xbe\x41\x12\x26\x9e\xc0\xed\xf4\x54\xbc\x38\x5a\x81\xd8\x26\xe7\x2d\x5a\xe8\xa8\x79\x40\xc6\x6a\x5b\x2b\x43\xb2\x0c\x5f\x18\x3f\x88\x22\x1e\x03\x5d\x09\xcd\xd9\xc7\x8f\x61\xae\x04\xc7\x65\x2b\x96\xeb\x1a\x19\x2e\xf0\x51\x46\xff\x3d\x6f\xc1\xc7\x55\x5e\x6c\xaa\xd0\x96\xae\x95\x99\x8a\xb7\xda\xfb\x5c\xb7\x9a\xe6\x0b\xad\x60\x2c\xa8\x34\x21\x7f\x06\x61\xdf\xc0\x1b\x3b\xed\xdc\xd9\x69\x46\xf2\xef\x5b\xd6\xc6\xcb\x2e\x61\xf7\x21\x06\x89\x2d\xf0\x5c\xd6\x9e\x47\x50\xc9\x32\xb4\xf2\x82\x30\xc6\xa5\xb1\x52\x3e\xa6\xf6\x67\xa2\x64\x78\x9b\xba\x03\xa5\x53\x30\x4c\x0c\xde\x68\xdd\x9b\x91\xff\x7b\x45\x5b\xdd\xf8\x6c\x5b\xa5\xf1\x43\xe7\x1a\x65\x98\x04\xa9\x23\xe0\xcd\x0c\x72\xb1\x6b\x8c\xd7\xc9\x4b\xc7\xa8\x04\x04\x43\x24\xe6\x1e\xa1\x59\xe3\xa9\x94\x8d\xaa\x8f\x7c\xae\xd8\x4a\xcf\x65\xe5\x83\x04\x03\xe8\x4e\x38\x65\x24\xfc\x43\xb7\xe0\xdc\xe5\xfa\x9a\x7f\xff\x9d\x6d\xcc\xb5\xe4\x25\x76\x55\x19\x05\x01\x62\x13\xee\x54\x08\xb1\x83\xe4\xbe\x03\x9c\xc5\x4c\xd9\x46\x98\xe4\x4b\xce\x58\x4c\x8f\x16\x1e\x97\x44\xfa\x0e\x1f\x40\x3f\x89\xdf\xde\x95\x2b\xa4\xd9\xf7\x04\x03\xe0\xde\x93\x36\xe6\x3e\xc0\x70\x27\x80\xc5\x7c\x13\x73\xb9\x03\x9c\x39\x35\xa4\xa1\x32\x72\x45\x4e\x4c\xd2\x10\x07\x14\x54\x2a\xeb\x46\xcf\xe4\xac\x72\x90\x9e\x8d\xc2\x64\xbe\xe4\x40\xe2\x62\x1f\x4a\x55\xdd\x55\x42\x1d\x98\x62\x69\xde\x28\x59\xec\xb8\x5e\x39\x28\x2a\x22\x05\x01\xfa\xc9\x41\xdc\x0f\x65\xa5\xb7\x1c\x99\x5d\x79\x7b\x4b\x90\x81\xbb\xe7\x1f\x52\x7a\x31\xbf\xdd\xd6\x8a\x23\x22\x7b\x15\x06\x53\xbc\xf8\xeb\xc4\x07\x87\x41\x0a\x6c\x87\xc2\x0d\xff\x2a\x91\xa0\x78\x74\xcc\x63\xd4\xa8\x1d\x19\xc7\xa2\x02\xbc\xd7\x5c\xd7\xa6\x34\x2d\x09\xab\x7a\x11\x65\x07\x47\x0a\x47\xae\xc4\x96\x8e\x95\x0b\x46\x21\xec\x56\x68\xc8\x16\x63\x82\x12\x33\x8a\x1b\xb1\xb2\x6a\xd9\xba\x7d\x63\x2a\xb4\x8a\x32\x46\x30\x81\xb3\x51\x66\x53\xb5\xb8\x66\xc6\x87\x42\x92\xda\xae\x15\x5b\x92\x34\x2a\x8d\x62\xb0\xeb\xfd\xc8\x08\x97\x89\x9d\x0f\xae\xb4\xc3\x2a\x2c\x01\x3e\x23\x25\xb9\x95\xae\x29\x9b\xaa\x93\x7a\xc9\x6f\x13\x4e\x21\xba\x57\x39\x8a\x00\xfb\xcf\x5e\xd0\x68\xb9\x07\x81\xc4\x92\x4c\x5a\x7d\x58\x62\xbc\xd0\x19\xab\xca\xf7\x3c\x6a\x88\x7d\xea\x75\x49\xec\xaf\x3e\xe8\xf4\x87\xba\x0c\x8c\x42\xae\xb5\x3b\x1d\x84\x46\xc9\x57\xe2\x90\xe1\xb9\xe0\x8f\xc4\x02\x73\xcc\x7c\xe5\xe8\x56\xb9\x5d\x89\xac\xf9\xe4\x62\x20\xd1\x69\x51\x7c\x8f\x78\x00\xda\xc1\x4c\x88\x76\xab\xc5\x5a\x1a\xa3\x0c\x83\xae\x77\xf0\x02\xf6\x83\xd3\x1e\x1a\xdf\x3e\xc4\xcd\x86\xd4\xf6\x93\xa0\x75\xf1\x1a\x17\xfb\xf8\xdf\xf3\xe7\x71\xe1\xc8\x2f\xf5\x91\x6c\x60\x32\x61\x46\x57\x99\x7a\xcf\x93\x58\x71\x00\xa3\x5b\x94\x85\xd3\xb4\x46\x4c\x3e\x08\x3b\x8a\xbe\xc4\xf9\xbf\x22\xd8\xe5\x9c\x07\xdc\xb1\xed\x66\x92\x55\x41\x4e\x70\x08\xb1\xc6\x2c\x76\x71\x3b\x3e\x89\x35\x66\x6c\x84\xa9\x3c\xe3\x07\x98\x7a\xbb\x1d\x67\xf5\x69\xa1\x47\xd7\x26\xef\xe9\x7e\x7e\xb1\x72\x4f\xcc\x5b\x96\x7d\x0d\x38\x51\x3c\x4a\x77\x98\x71\x8d\xb3\x21\x6c\x9c\x13\x5a\x82\x38\xe7\xec\x13\xcb\xf6\x3d\xdc\xac\xa3\x45\x1e\x3c\x09\x9d\x23\x37\xc8\x58\xe7\x83\x60\x4d\xab\xd7\xfd\x67\x12\x9f\xba\xc4\xe2\xc9\x6f\xe8\x3b\xca\x17\xf9\xb0\xac\x1f\x7a\x23\x1c\x92\x4b\x4c\x3a\x1d\xd9\x42\xe1\xa6\x22\x62\xe5\x06\x23\xd7\x15\x5a\x87\x02\x23\x16\xdd\x50\x7a\x0b\x38\xf7\x35\xf1\x3c\x1e\x84\xca\x34\xea\xaa\xd4\x9b\xd0\x65\xe4\x6e\xea\xfa\x75\xcc\x55\x26\xd1\x28\xfa\xfe\xd0\x93\x1c\x34\x9f\xd0\xbd\xef\x2a\x1e\x1d\xd2\x34\x32\x3d\x9a\xde\x4e\x9c\xfe\xe5\xf4\x3b\x06\xbd\x10\x31\x46\x29\x01\x76\xdd\xbc\xa8\xd3\x91\x10\x64\x09\x11\x2c\xa0\x57\x5c\xf1\x83\xd8\x9a\x0b\x60\x29\xec\x5d\x0e\x14\xef\x4f\xac\xd4\x52\xae\xd7\xaa\x46\x2c\x1d\x63\x69\x2e\x62\x4e\x98\xc0\x35\xdb\x76\xbd\xb2\x8a\x91\x3f\xd7\x5a\xa4\x7b\x76\x6f\xa3\xaa\xdb\xb2\xa1\x27\x12\xa3\x46\xc9\x6f\x18\xb0\x86\x91\xd6\x14\x71\xf6\x10\xe8\x14\x22\x36\xdb\xa6\xbc\xb8\xb0\xf2\x17\x86\x9a\x62\xc8\xcb\x43\x0f\xb4\x41\xae\xf1\xee\x39\x3e\x90\xc8\x06\x59\xfb\x5a\x34\xf6\xfd\x7e\x22\xfb\xf9\xcd\xa9\x2c\xf3\xdc\x38\x9c\xc8\xbe\xdf\x4b\x65\x3f\xbf\x06\x99\x7d\xff\x73\xa3\xb3\x9f\x27\x8b\x7a\xa7\x44\x35\x27\x5b\xb1\xe3\x93\xf1\x69\x88\xc9\x70\xcf\xa9\x0d\x05\xa2\x9f\x01\xca\x6d\xb7\x56\x7a\x21\x74\xfd\xc4\x4b\xcd\x10\xf2\x75\xe4\x44\xcf\xa3\x30\x3b\x5e\xa8\x27\x91\xe9\x49\x1a\x4d\x6f\x4f\x96\x78\xf0\x60\x28\xd8\x6f\xea\x03\x04\x4f\x62\x95\xe0\xbe\xe2\x53\x37\x20\x50\xb7\x66\x32\xb9\x7e\x4a\x02\xd3\xd1\xcc\x0c\xf4\x82\xa4\x68\x2f\xa6\x63\xc0\xcf\xaa\x64\xee\x7b\x96\x42\x95\x4d\x4e\xe2\xd7\x1d\x48\x9c\xac\xad\xfb\x24\xc9\xf8\x98\x7c\x9e\x2e\x74\xf3\x4c\xce\x97\xc7\xae\x43\x38\x82\x6f\xd4\x5c\x5f\xa9\x66\xe7\x8f\xdd\x3e\x33\x7a\x38\x37\x20\x49\x74\xec\xe9\x3d\x04\x0a\x16\xe0\x0b\x47\x05\xa3\x2a\x67\x9c\x21\xef\x33\xce\xe3\x81\x88\xbe\x1e\x53\xa3\x27\x1d\xc8\x00\x0f\x04\x40\x6e\x2b\xfc\x29\x9b\xaa\xc8\xa9\xe5\x2c\x4c\x26\xa9\x75\xee\xdc\x5d\xb8\x37\x77\x8f\xd3\x07\x0c\xbf\xdf\xcd\xc1\x0f\xce\x25\xe0\xe3\x3d\xf5\x04\x70\x27\x4e\x54\xf6\x09\x7f\x51\xbf\x26\xb6\x65\x42\x0f\x90\xfd\xc4\xc1\x2e\xc2\xaf\x98\x04\x11\x72\x8e\x3c\x78\x20\xe2\xda\xc9\x12\xe0\x54\x6d\xd1\x93\x44\x8a\x0a\xf8\xda\x4e\x69\x15\x02\x7b\x64\xa3\xc4\xb2\x2c\x0a\x55\x4f\x29\x27\xd8\x6c\x33\x9b\xb9\x63\x1c\x9a\x49\x9c\xbc\x4c\x8c\x89\x91\x5e\x9c\x27\x10\x17\x80\xfe\x12\x80\x2c\xe9\x1e\xf6\xa9\xdf\xdc\x5a\x6d\x3b\x7e\x49\x17\x8a\xc2\x3b\x06\x57\x8d\xf3\x82\x60\x66\xb4\x4f\x9d\xf1\xf2\xfd\x15\xc4\x6e\x79\xda\xe2\xcb\x7e\x83\xf3\xda\xac\x91\x87\x80\x1c\xe3\xa6\x4d\x27\x16\x06\x38\xa7\xd4\x22\xc9\xa2\xc3\xcf\xd1\xb3\x8e\x05\xbb\x17\x06\x6e\xb8\xfd\x96\x6e\xd4\x7d\x7f\x26\xed\xa6\x1e\x67\x56\x22\x14\xf8\xf8\x31\xb3\x52\x5f\x89\x5c\xbb\xd1\x4b\x9d\x5b\xde\x5c\xa5\xd4\x03\xc3\xcd\x1a\xcb\x76\xf2\xf6\x8b\x7d\x67\xb0\xdb\x71\xd6\xe5\x04\xdc\x78\x83\x23\x5c\xba\xc3\xb1\x11\xc6\xbe\x06\xdd\x33\xed\xb3\xe7\x57\x1b\x4b\xc0\x27\x14\x1b\xe0\x8e\x38\x3a\xb3\x91\xc6\xc6\x1b\x47\xb8\x8a\xbe\x50\xa0\x99\xaf\x09\xfe\x90\xec\xc6\xdc\x3e\x8d\xac\xba\xfd\x05\xbd\xf8\x40\x83\xa3\x1a\xa6\x20\xc2\xc0\x9b\xd8\x38\x00\x07\x51\xd6\x10\x96\x68\xe7\x2b\x2b\x54\x0b\x3a\xed\x05\x79\x10\x86\x46\x9c\x14\xc3\x7d\x17\x02\xc7\x9e\x2c\x78\xc7\xce\x73\xb0\xff\x4d\xe7\x36\xc5\x27\x80\x59\x4d\xe6\x91\x3f\xb7\x5b\xf0\x94\x86\xf5\x39\x1a\x9e\x8c\x1e\x61\xaf\xcd\x2e\x31\xe6\xc4\x70\x62\xf1\x38\x52\x20\x22\x72\x7c\xc5\x03\x9c\xaf\x12\x8e\xb7\x27\x66\xfb\x29\xf6\xc0\x6c\xd9\xbd\x87\x05\xcc\x71\x7a\x96\xa9\xb2\xcb\x89\x2c\x55\xcf\x56\xdc\x88\x09\x12\x87\x31\x42\x61\x83\x7b\x07\xf3\x89\xeb\x0c\x5e\x2c\xdc\xb1\xf0\x2c\x10\x1c\x68\xb3\x96\xdb\x5a\x15\x80\x08\xb8\x05\x67\x5e\x82\xb3\x84\x15\x73\xda\x32\x2b\x7f\xf3\xd6\xc0\xfb\x06\xf4\x7c\x90\x6f\x21\x78\x0b\xd0\x13\x5b\xb3\x1c\xe7\x91\xf9\x70\x1f\x52\xdc\xe9\xa9\x78\x6c\x85\xcf\xa2\xa3\x60\x25\x09\xdf\xb9\x3c\x62\x86\x07\x4f\x30\x7c\x9e\xdb\xc8\xf6\x84\x46\x16\xca\x3c\x11\xd0\xf0\xd0\x2e\xe3\x96\x03\x52\xdb\x14\xb6\x8d\x45\x94\x6b\x42\x48\xea\x39\x41\xda\x63\xba\x45\xac\x38\x8d\xb6\xbf\x37\x13\x43\x56\x7e\xe8\xcf\xdb\x90\x9c\xf9\x8c\xce\x96\xef\x30\x04\xc4\xc7\x35\xf6\xa8\x96\x0f\x4c\x6a\xd1\x1d\x6e\x9f\x3a\x7a\xcc\xc0\x73\x68\xcf\x99\x14\x15\xbd\x33\xe2\x4b\x90\x9c\x72\x76\x28\x96\xb2\x88\x34\xc1\x60\x4f\x90\x78\xbc\xca\x56\x3c\x7e\xfe\xee\xd9\x9b\x68\xcb\x8f\x4c\xcf\x46\x1b\x80\x8e\x9a\xcb\xda\x6b\x56\xe6\xaa\x69\x65\x59\xc7\x9a\x66\xe4\x4e\x9a\x60\x3d\x80\x76\xd0\xa9\x77\x62\x05\x57\x80\x81\x11\xab\x4d\xd5\x96\xeb\x4a\x91\xd6\x59\x58\x11\x80\x1d\x5e\xb2\x68\xf8\x68\xed\xad\xac\xa3\x03\xcd\xa1\x68\x5d\x20\x78\x74\x28\x6b\xff\x33\x9c\x7d\xef\x95\xbc\x00\xb3\x09\xd3\x1b\x82\x6a\x1a\x81\x0d\xfc\xa9\x47\x05\x12\x13\x8b\x4a\x13\xd4\xf8\xad\x26\x0b\x0e\xd9\xb2\xc1\xc1\x9c\x37\x47\xda\x36\x55\x17\x31\xa2\x24\xf7\xb7\x48\x59\x91\xd4\x15\x14\x1a\x7a\x7b\x59\xae\xc5\x4c\xb7\x4b\xc7\x51\xd9\x0b\x1f\x19\xa4\xd0\xac\x0c\xc9\xaa\x23\x34\x03\xbe\x88\xbc\xc5\xb8\x32\x95\x02\x8f\x74\x09\x4a\x85\x18\x33\x07\x58\x08\xe4\x2d\x80\xbb\x76\xba\xc5\x96\xfb\x46\xc5\x0e\x11\xbd\x06\xb3\x1f\xed\xb2\x45\x17\x2c\xb5\xe8\x1c\x42\x6e\x6e\x78\x53\x07\x9c\x5d\x47\x3d\xa4\x37\x7a\x46\x6f\xf3\x11\x8d\xde\xae\x88\x29\xe9\x79\xbc\x5e\x2c\x02\x0a\x2f\x78\x48\xc2\x23\xdb\x02\x48\x74\x49\xde\x93\x51\xe6\x9c\xe8\xb5\x4d\x9f\x51\xde\x63\x62\xa9\x1b\xf9\x98\xba\xf1\x1c\x81\x39\x2e\x8c\x28\x33\x96\xa9\x70\x2b\xc2\x2c\xe3\xf8\xc5\xb7\x18\x2f\x53\x2e\x23\x95\xa0\xf4\xbe\x65\x1d\x94\x8c\x9d\xa3\x88\x68\x8f\x57\xe0\x1b\xe1\x21\xbf\xb9\x75\x30\xf2\x20\x48\xb9\xbf\x2e\xb6\x68\x9f\x89\x3d\xd6\x74\x3a\xde\x84\x69\x0d\x3e\x25\x02\xf0\xf7\x65\xbb\x44\xe7\x14\x4b\xf5\x3e\xac\xab\x72\x5e\xb6\x68\x8c\xa7\xda\xcf\x2b\xbd\x45\xd6\x41\x96\x35\x70\x25\x25\x46\xaf\x7b\xc8\xa9\xdd\x5a\x71\x39\x57\xbc\x09\xce\xd2\x08\xd5\x03\xe2\x11\x49\x47\x95\xd6\x6b\x57\x5a\x99\xaa\xac\xdb\x87\x45\x69\xe4\xac\x52\x0f\xed\x89\x78\x58\x95\xb5\x12\xb5\x7e\xb8\xa9\x61\xa9\xbc\x6b\x6c\x32\x97\x04\x97\x13\xc9\xd0\x5e\x39\xed\x16\x44\xb2\x5b\x10\xc8\x6e\x41\x1c\xeb\x08\x63\x63\x45\x31\x57\xfb\xad\x82\x1b\x05\x21\xb4\x75\x86\x41\x66\x97\x79\x4a\x4a\x56\xd9\xb4\x7b\xe8\xd8\x1e\x8f\xc7\x51\xf2\x5d\x9c\x61\x42\x9c\x87\xf0\xe1\x6b\x0b\x76\x37\x71\xc4\xfc\x51\xd4\xbc\x21\x04\xbb\x67\x49\xfc\x40\x6a\x9f\xce\x3e\xa2\x7c\x99\xcc\xd1\xb0\x8b\x4c\xc8\x99\x73\x52\xe7\x4e\x4a\xd8\x5e\x91\x8a\xd2\xfd\x77\x29\x1a\xd4\x48\x9f\x9c\x44\x4a\xca\xde\x5e\x8c\xe4\xfe\xe5\x0e\xff\x5c\xef\x70\x88\xd4\xff\xe5\x26\xff\x4c\x6f\xb2\x6d\xff\x4f\x5a\xaf\x8f\x13\x85\x2f\x33\x19\x24\x36\x8d\x2e\x17\xc7\x79\x4a\xd9\x28\xb1\xa9\x1d\xf6\x9b\xa2\xa0\x53\x8a\x68\x22\xfd\x87\xb1\xfc\x09\x1c\x7a\xcb\x5a\x30\xbd\x29\xea\xdc\xff\xa8\xb7\xe0\x4c\x07\x76\x51\xb4\x29\x20\x3a\x1f\x5e\xc8\x85\x04\x87\x8a\x76\xf9\xb5\x78\x29\x77\x33\xc7\x09\xa2\xb5\x3d\xb4\x35\x07\xea\x70\x99\x09\xb4\xb5\x9c\x18\xc5\xd9\xa6\x23\x05\x09\x0e\x40\x70\x64\x68\x69\xa1\x9b\x4b\x55\x88\x2b\xd5\x18\x42\x69\xc1\xde\xde\x30\x66\xd0\x4e\xe9\x7b\x5a\xca\x77\x4b\xd9\x82\x95\xc2\x3c\xd7\x0d\xbb\x42\x2a\xaf\xc2\xcc\x27\x28\xea\x0f\xb1\x4e\x14\xf8\x3d\xc5\xbe\x12\xf9\x0d\xcd\x9a\x55\x06\x3b\xfc\xfd\x79\x3e\x94\x3f\xda\xff\xe7\x96\xa4\x83\x3e\x0c\xba\x25\x8f\x12\xb7\x3a\xcc\x49\x81\x45\xa8\xe7\xc4\x81\x4e\x10\x7b\x97\x4f\x8c\x8b\xa4\x18\xcc\x1d\x57\x3f\x1a\x99\xd9\xd5\xf3\x65\xa3\x6b\xbd\x21\x7a\x0b\xf1\xce\x84\x08\x20\x0b\xe0\x61\x9b\x8d\xe5\x96\x37\xa8\x89\xf3\x06\x9b\x7d\xc3\x67\xf0\xd7\xff\xcb\x3e\x1c\xc7\x27\xb7\x3a\xa1\xce\x8d\xbd\xc6\x51\x63\x97\xf9\x1f\xf4\x5c\x79\xef\x13\x0e\x98\x9b\x2c\x7c\xac\xdb\xc0\xc8\x6c\x21\x33\xd7\xbf\xb3\x85\xac\x5a\xdf\x7e\x77\x58\xa5\x9e\x5d\xcf\x2a\x45\xae\x7f\x88\x3a\x1e\x1d\x3f\xb5\xfb\xf1\xcb\xc6\xf4\xdd\xf3\xf0\xc8\x00\xc0\xc4\x37\x95\x9e\x5f\x42\x2c\xc2\x84\x1c\x09\x10\xd7\xc4\x21\x92\x4e\x7a\x2e\xa6\xcf\x5a\x71\xa1\x29\xa2\xba\x51\xc0\x55\xe6\x50\x59\x63\x64\x05\x5f\xc0\xf3\xe0\x4f\x74\x3d\x57\x6b\x8c\x3b\x9a\x10\x74\xc7\xa6\xde\x96\xb5\xf7\x24\x47\x34\x4f\xf1\x7d\x70\x8a\xc7\xef\xde\x42\x01\x4f\x33\x42\xa4\x40\xd9\x89\x68\xb5\xc6\x0e\xb0\x24\x41\x0d\x98\xe3\xdc\x2c\x4f\xa2\x60\x84\xbe\x69\xa0\xba\x38\x73\x42\x3c\x17\x9f\x6e\x13\xce\x1c\x73\x07\xa0\x00\xe2\x1a\x3b\x0a\xe1\x01\x68\x93\x41\x17\x41\xd7\x92\x43\xa1\xdd\xcc\x1a\xe5\x33\x74\x07\xc4\xc3\xa9\x78\x9a\x8f\xbb\x99\x08\x89\x29\xb8\xa4\x77\xf0\xf4\xb1\x13\x84\x17\xc7\x72\x2b\x91\x2c\x12\x4f\x73\x42\xfc\x8c\x73\x3b\x74\xed\x48\xd1\xa8\x87\x78\x7a\x82\x8f\xe1\xa8\xa3\x9f\x59\xe5\x27\xa4\x27\x73\x80\x33\xd8\x62\x1f\xd7\x98\xf3\x54\x71\xa7\x98\xce\x6e\xfe\x94\xde\xbf\x1f\x5c\xc9\x72\x5e\x78\xa1\x19\x40\x19\xa6\x65\x69\xd4\x7c\xd3\x98\xf2\x4a\x55\xbb\x3b\xf2\xc7\xeb\x06\x1b\xc5\x97\x8a\xe2\xc4\xb4\x58\x6d\x10\x3e\xb0\xcf\x83\x78\xea\xd2\xa3\x35\x6e\x0e\xe4\xbe\x12\x2e\x05\x3a\x7b\x95\xad\xa8\xb5\xa8\x74\x7d\x01\xc2\xf0\x23\x97\x5c\x90\x6e\x93\x17\x25\xca\x96\xdb\x35\x47\x06\xf0\xa0\xf3\x4c\xe9\xf2\xc6\xc0\x05\xb2\x93\x83\x78\x2b\x29\x16\x8d\x32\x4b\x77\x2d\x31\x2f\x1b\x16\x6c\x94\xd9\xac\x5c\xc1\x20\x0a\xa3\xbb\x72\xb5\x13\x3b\x4b\xd8\xa3\xc7\x19\x74\xbf\x76\xaa\xf0\x0c\x38\xf4\xa1\x8f\x1f\x45\xc6\x61\xa5\x97\x45\x20\x46\x84\x9f\xdd\x9c\xf0\x91\xa0\x9b\x38\xf8\xc4\xa6\xf5\x28\x49\x0e\xef\x21\x52\xe0\x66\x10\x53\xce\x98\x3c\x46\x70\x49\xb6\x46\xf4\x73\x1e\xf7\x28\xef\xfa\xd2\xb9\x79\x88\xe7\xfd\x7d\x24\xd4\x1d\xbb\xde\xa6\x21\x88\x16\xdc\x6a\xb3\x02\x03\xb1\x56\x5e\x31\x00\x6c\x20\x28\x07\x3a\x2f\x8d\x97\xe9\xf3\xbe\xbf\x1e\x57\x3d\xf2\x43\xf3\x2e\x46\x83\x1e\xbf\x8e\x00\x0c\x0e\x75\xbf\xd3\x6f\xaf\xc7\xef\xfe\xa0\x8a\x54\x2d\xfe\xb8\x66\x28\xe4\xed\xb2\xd1\xdb\x9a\xc7\x3c\x22\x01\xa1\x98\xc7\x7b\x8c\x6b\xe9\xba\x07\x53\x70\x06\xa0\xfc\x24\xa6\x0a\xa0\x31\x5b\x70\x3a\x5f\x00\x08\x10\x3e\x8f\xe4\xde\x26\xdb\x56\xad\xd6\x2d\x21\xb7\x83\xc5\x14\x0e\x5e\xc9\x6c\x06\x59\x17\x46\xc5\x9d\x1c\x93\xb0\xf6\xc8\x4b\x65\xc1\x11\x16\xe3\xfd\xe6\x4b\xce\x8b\xf5\x38\x30\x64\x56\x6b\xb6\x69\xb9\x21\xc6\xe9\x12\x36\x75\xd9\x7a\xc0\x29\x5c\x81\xb9\xac\x79\x63\xe4\x8b\xdf\x13\x61\xea\xb3\x3b\x1e\x99\x40\x84\xb9\xcc\x3e\xe5\xc7\xc1\x61\x2b\xc5\xc7\xa1\x63\xad\x61\xb8\x34\x9f\x11\xef\xf8\x19\x7f\x22\x77\x00\x10\xe2\x86\x53\x2b\x69\x99\x1e\xff\x72\x4e\x23\x1b\x58\xad\x43\x63\x9d\x17\x56\x79\xe0\x38\x4e\x3a\xec\x5e\x78\x6e\xe3\x3c\xf6\xd8\xe6\x6c\x4b\x1c\x18\x73\xdf\x3f\xb0\x07\xf8\x9c\x2f\x20\xd5\x40\x07\x80\xfe\x0e\xde\xbb\x31\xc7\xdf\x2d\xf0\x56\x61\x20\xb8\xe7\x15\x33\x97\x02\x06\x88\x67\x23\xf2\x59\x00\x73\x78\xd8\x2b\x8f\x22\x66\x78\x9c\x63\x06\x29\x6c\xcf\x51\xe8\x0b\x70\xe8\x92\xb8\xf1\x81\x0d\x39\x1e\xdc\x91\xbc\x03\x58\xf1\x5b\x0a\x35\x1b\x13\x69\xd6\x5d\xa0\x6e\x58\x84\xe7\x5e\xa2\xf0\x1f\xcb\xdc\x89\x67\x1f\x4a\xce\x51\x73\xfd\x5c\x84\xfa\xeb\x1f\x90\x4d\x42\xca\x72\xce\xdb\x31\xcb\x54\xe8\x5a\x39\x0e\xd4\x03\x0b\x0a\x78\x46\x3d\x5c\xc0\x66\xed\xd4\xdf\x68\x89\x0f\x8f\x5c\x04\x84\xe6\xc2\x06\xb2\xe0\x68\xa2\x3f\x3e\xa1\x8b\xe1\x26\x86\xbd\xcb\x3d\x4b\xb3\xd9\xe3\xc9\x9e\x3a\xa0\x47\xe5\x4f\xb2\x9e\xde\x59\xce\xed\xeb\xd8\x23\xdd\x9b\x12\x58\x8e\xaf\x4f\x1e\x32\xd3\xb6\x13\x0b\x2d\x7d\x82\x1c\x70\x75\x20\x94\x53\xda\x03\x4f\x3f\x30\xdb\x5c\x11\xf9\xd2\x0e\x53\xb5\x20\x5f\xbe\x20\x28\x41\xc7\xb5\xa2\xad\x99\x81\x50\xa8\x0f\x65\x4b\xc3\xd8\x18\x40\x4f\x2c\xe8\x46\xef\x57\x61\x8b\x1b\x19\x11\xdc\x10\xdf\x2a\xd9\xcc\x97\x1e\x45\xde\x3d\x08\x09\x4d\xbd\x97\xa1\xed\xec\x00\x9c\x9e\x8a\xd7\xd2\x18\x64\xc4\x3b\xe9\x97\x4e\x62\xa6\x2a\x4d\xe7\x93\x30\x5e\x3c\x67\x4f\x8e\x27\x4b\x52\x09\xc5\xa3\xf8\x23\x66\xca\x25\xe8\x3d\xc4\x02\xf7\xe2\x24\xe0\xf4\x78\x71\x83\xe4\x53\xb4\x62\xa1\x5b\x14\x20\x45\x2e\xb5\x69\xb9\x3c\xee\x12\xc5\x5a\xda\x5c\x02\xb8\x08\x24\x5b\x2e\x5b\x03\x4e\x5a\xec\xe5\xac\x41\x1d\x47\xc8\xe7\xd2\x60\xea\x44\xd7\x14\x25\x2d\x0c\x86\x33\xec\xd2\x72\xe4\x10\x70\x6f\x70\x1f\x2c\xc7\xb1\xb9\x58\x32\x7f\x47\xc3\x12\x12\xfa\xa3\x06\x59\x09\xcf\xb3\xb9\x42\xd9\x0e\x2d\x62\x3c\x69\xd7\x4c\x69\x9e\xf3\x78\x8b\x1d\x6b\x37\x4d\x53\xef\xec\x37\xf0\xf0\xb8\x88\x3f\x2c\x3e\x21\x3e\x01\x42\x3c\xe1\x41\x86\x48\x40\xff\x1e\x6f\x43\x02\x4d\x72\x2e\x03\x1e\x90\x54\x2d\x0e\xcf\xa2\x8c\x12\x1e\x6c\x75\x63\xda\x87\x00\xa7\x64\xe6\xaa\x96\x4d\xa9\x7d\x24\x36\x35\x43\xc6\x4d\x58\xb3\x99\x0a\x30\x77\x37\xe6\xa5\xb2\x6a\x40\xc4\x38\x2e\x54\xb4\x98\x5d\xaf\x67\xa7\xe7\xb3\x25\xb9\x76\x2f\xec\x45\x8f\xe6\xd5\xd6\xf0\x7b\x09\x59\x30\x7c\x12\x86\xf8\xf1\x4b\x52\xa9\x43\xbd\x6c\x9e\x5e\x16\x29\xe6\xca\x4f\xbb\x98\xac\x7d\x71\x63\xec\x39\x4d\xaf\x69\x17\xae\x2a\x77\x1d\x3b\xa9\x3e\x6a\x0c\x35\x8b\x2a\x9e\x9e\x8a\xe7\x79\xe6\xed\x7e\x54\x8e\x13\x9b\x4e\x3a\x62\x4e\x27\xd2\xb1\x7d\x4a\x55\x93\x9d\xb5\xee\xde\x1b\x1a\xd8\x3b\x2b\x87\x06\x66\x0b\xc0\xd6\x28\x13\x47\x32\xd6\x7b\x23\x06\xca\x1c\x5c\xb3\x37\x0f\x56\xa7\x3b\x06\x7b\x21\x7c\x9b\x65\xc8\xd1\x03\x40\x08\x4e\xb1\xd6\x82\x0f\x40\x5c\xd3\x27\xbe\x0d\xb0\xc1\x1b\x0f\x15\x36\xc1\xc7\xcf\xd9\xfa\x79\x76\xaa\xb8\x15\x12\x7b\xf0\x54\x87\xfa\xac\x6f\xf4\xe3\x06\x6d\x26\x5d\x48\xa4\x6f\x69\x3b\x91\x9a\x94\xaf\x43\x00\x30\xcb\x3b\x4e\x46\x4c\x69\xb2\x92\xf1\x4c\xe9\x9e\xc7\x2a\xc4\x00\x49\x48\xd9\x52\xb4\x30\xe0\x61\x90\x0e\x90\x2f\xb4\x5b\xe5\x01\x00\x5d\x1f\x7b\x38\xcd\xec\x18\xd0\x2d\xc8\x9a\x11\x20\x80\xbc\xb7\xb0\x03\x02\xc6\xf4\x13\x91\x18\x1e\x37\x25\x85\x29\xeb\x8b\xca\xcf\x68\x4b\x5e\x6d\x9e\x97\x2b\x75\x9d\xae\x67\x3e\xf0\x90\x53\xa2\x7c\x91\xe9\x52\x1a\x3c\x83\xa0\x51\xb2\x17\x24\x30\x54\xbc\xfa\x70\xed\x50\xe9\xe4\x24\xdd\x4e\xdc\x2a\xa3\xf9\x9e\xf8\xb7\xd0\x1d\xc1\xe9\x75\x4e\x40\x90\xb9\xa8\xd9\x80\xba\x4c\xe2\x12\x38\x0f\xf8\xed\x7d\xf8\xdf\xff\xf9\x5f\x80\xc0\xa8\xd4\xda\xf2\xef\x41\x69\x8b\x7f\x3a\xac\x4d\xf8\xd4\xc3\x93\x24\xa3\xa2\x87\xc2\xfe\xaf\xfb\x44\xc4\x71\xc3\x0b\x91\x93\x78\x39\x46\x4f\xe1\x51\x8e\x18\xc4\xb6\x5e\xb8\x1b\xc8\xf2\x9c\xc5\xe9\x4c\x3d\xbe\x64\x68\xcb\x6c\x66\x46\xfd\x6d\x63\x79\x47\x3a\x85\xce\x81\xd4\xc5\x63\x8c\x5a\xc0\x69\x47\x8f\xc2\x03\x36\x73\xf8\x37\x99\xa8\x4e\xb5\x15\x6f\x55\x9b\x2a\xab\xba\x65\xa7\xb2\x28\x3a\x5a\xf7\x70\xd5\x82\x1d\x60\x53\x1b\xb9\x50\x42\x6f\x5a\x96\xe3\x19\x9d\x74\xd0\x67\xc1\xa9\x85\x81\x32\x98\x29\x97\xf4\xc4\xaa\xbc\x58\x82\x7b\x78\x86\x88\xa0\x34\xee\x49\x00\xdc\x6f\xa4\x0b\xdc\x2f\xc3\xbe\x13\xa5\xc1\x04\x89\x0e\xad\x82\xce\xef\x5a\xb6\x4b\x86\x94\x8e\x9e\xbe\x2b\x09\x7e\x5a\x80\x94\x3a\x9f\x6f\x9a\x38\x3c\xee\x9d\x6d\xc2\xb5\x27\xe7\x73\xb5\xc6\x44\xdc\x17\xe5\x15\x69\x06\x66\xaa\x56\x0b\x54\x3b\x61\x3a\x39\x88\xf3\x34\x96\xd7\x5d\x61\x52\x6c\xcc\xa2\xc2\xf8\x97\xf7\x9d\xc4\x9d\x17\x0a\xff\xfa\xb8\x28\x54\x5d\x6c\x56\xdf\xec\x62\xbd\x2b\x8a\x0a\x8c\x2b\x3c\xcb\x36\xd7\x9b\xdd\x8b\x57\x1c\x71\xa4\x03\xfc\x19\x9c\xce\xc0\x10\x9a\x56\x03\x19\xb6\x2c\xdd\x45\xa5\x67\x92\x21\xea\xad\xe4\xda\xd6\x65\xde\x29\x18\x03\x9e\xa4\xcf\x03\x94\x36\xe8\xe8\x52\xf1\x84\x74\x71\xa4\x78\x17\x1d\xce\x67\x1c\x5f\x69\x03\xaf\xa8\x21\x7a\xf5\x52\xae\x71\x40\x6f\x55\x7b\x86\xe9\x81\x25\xfc\x08\x1c\x69\xcb\x34\x66\xe8\xa6\xe3\xf2\x24\x92\xef\x1c\x4f\x33\x0c\xd3\xeb\x3e\x92\x19\xcf\xa2\xdc\xed\xea\x06\x54\xab\xad\x1d\x48\x4f\x18\x5f\x54\x9c\xd2\xfd\x52\x43\x7c\xf3\x1e\x25\xfb\xdb\x97\xfe\xf5\x51\x7a\xac\x92\x9c\xad\x8f\x48\xac\x8e\x7f\x75\x7c\xcf\xa3\x1c\x8b\xf9\x75\xa0\x34\x9e\xb3\x25\xa9\x7e\x28\x21\x6c\xae\xad\x81\xec\xb3\x8f\xba\x3f\x65\xf2\xc5\x3e\x0a\x7f\x75\x8b\xe9\x8f\x72\xbc\xf0\x53\xa3\xda\xe3\xa0\xdf\xca\x64\x0f\x16\x98\x72\x9b\xad\xf8\x9e\x04\xc5\xc1\xf3\x7e\x0e\xcc\xfa\xb1\x4a\xa4\xb2\xd7\x04\x0c\x88\x36\xd1\x72\x91\x11\xb9\x91\xc3\x30\x51\x0c\xcd\x63\xaa\x60\x69\x10\x00\xe8\x10\x28\x61\xa6\x01\x12\x9b\xec\xd9\x66\xc9\x55\x91\xc0\xc5\xed\xc6\x29\x19\x55\xf7\xf0\xed\xe5\xd5\x0a\xb5\x50\x8d\x8b\x59\xa2\xdc\x63\x1b\x9f\x25\x2f\xc2\x22\x0f\x76\x6c\xf0\xc1\xc0\x8c\x13\xac\x45\x8a\xb2\xb7\xf4\x3e\x92\x77\x03\x4a\x47\x2a\x80\xf5\x40\x36\x0c\xa0\xc3\x67\xe0\x1d\xd2\x47\x2d\xc2\x06\xce\x72\x4e\xc9\xeb\xe6\xf6\xbb\x1b\x69\xf1\xad\x15\x6a\xb7\x25\x00\x22\xb9\xa8\xae\xb0\x3e\xb5\xcb\xc3\x2b\xb8\x9b\xe0\x0b\xe2\xee\x3d\x0e\x6a\xad\xe6\xca\x18\xbb\x6e\x3d\x76\x9f\xaf\x6d\x9d\x32\x8a\x53\xf3\x82\x75\x70\x54\xc0\xe7\x94\xac\xde\x21\xff\x89\x64\x38\x8e\xeb\xa6\xd4\x4d\xd9\xee\x26\xbc\x29\xc7\xc1\xce\x35\xf2\xaf\x0e\xbb\xb2\x96\x15\x4a\x31\x5f\xfb\xd2\x59\x7c\x8d\xcc\x4a\xd1\xff\xe9\xa5\x75\xdf\xcf\xb8\x08\xdf\x83\xb1\xd1\xe7\xa6\x5a\xeb\x48\xe2\x02\xe3\xc2\x24\x31\x31\xc3\xd9\x0f\x04\xdb\xb1\x2e\x7b\x0c\x57\x9f\xb8\x52\x33\x1f\xf3\xd1\xf1\xf3\x89\x52\x6a\xfa\x8d\x4d\x48\x3e\x71\x6d\xe1\x19\x09\x13\x70\xf9\xf1\x83\xbb\x28\x25\x0e\x70\x0d\xb6\x5a\x84\x3c\x92\x89\x4b\x39\x0d\xb5\xc7\xbb\x15\xa5\x89\x98\x06\x5a\x41\x20\xe4\xf4\x84\xbf\xf5\x09\x12\x3d\x15\xb9\x08\xd1\x5d\x9f\xae\xc6\x2a\xbb\x3e\x1d\x86\xf3\x90\x15\x72\x4d\xb1\x0c\x0b\xfb\x56\xa8\xd3\x5f\xb4\x46\x1d\x96\x76\xfc\x2a\xf5\x57\x1d\x5e\xa7\x1c\x58\xb3\x47\x23\x7e\xde\x49\xd3\x9a\xb0\x04\x29\xb4\xe8\x5e\xf7\xe6\xb4\x81\x64\x73\x2f\x54\x9b\xf6\x7e\x96\x7d\x43\xff\x7c\x84\xfe\x45\x47\x7f\xe9\x2b\xdf\x19\x8e\xe8\x51\xa8\xc5\xf5\x33\xcb\x1b\x93\xf4\xb8\xb8\xcf\x55\xd1\xad\x1f\xd9\x91\xae\x3d\xed\xeb\x4c\xbd\x07\x7a\xea\x7e\xb2\x1e\xf7\x87\xcc\xa6\xaf\x34\x49\x31\x0b\xdd\x90\x30\x91\x31\x5e\xdf\xba\xc9\xd4\xa5\xeb\x48\x16\xb5\xe5\x09\x3b\x40\x69\x12\x6b\x3e\x03\x82\x7e\xa2\xf5\x4c\xda\x61\xfa\xcf\xa4\xc6\x42\x47\x1c\x6e\x97\x79\x8d\xd6\x6e\x1a\x7f\x0d\xeb\x7e\x16\x85\xa7\x3f\xae\x2a\xa2\xfe\x3c\xd7\x39\xba\xc9\x73\x43\x92\xcb\x0f\x3c\xdb\x31\xa6\x26\xd2\x84\xfb\xf7\xdb\x47\x64\x87\x33\xdc\xab\xb3\x8d\xf7\x7b\xea\xb2\x6f\xd7\x0b\x7d\x92\x46\x49\x9e\xf1\xb5\x75\x9a\xce\x38\x8f\xec\xa8\x97\xb1\xf7\x75\xcb\x0c\x25\xc7\xfb\xc4\xa3\xa1\xfc\x72\x6c\x1c\x9d\x73\x4a\xb9\x84\x21\x0c\xf3\xb6\x0f\x67\x78\x8c\x63\x9a\x99\xfa\x56\x36\x7a\x65\x1f\x05\x4e\x28\x9d\x05\xa0\xd1\xab\x08\x84\x28\xd2\xf7\x87\x65\x73\xc7\xde\x29\x9c\x3b\xd9\x69\xfa\x8e\x3b\x24\x54\xa5\x91\xbc\xc6\x64\xf1\x8d\x53\xa0\x87\x32\x49\x6e\x07\xbf\xc9\x7d\x0d\xf2\x9c\xb1\xa3\x1b\x8b\x4f\x8c\xe8\x24\x88\x1d\xdf\xd2\x6b\xdd\xb4\xb2\xba\x41\x5b\x1c\xb3\x10\x77\xe2\xfc\xdc\xde\x9c\xae\xc6\x12\x3f\xa4\xc8\x2f\xc1\xfb\x9f\xbc\xc1\xe2\xde\xe2\xbe\x52\x16\x3c\x8e\x78\x8f\xaa\xfa\x54\x1a\xfd\x6a\xbf\x2c\xe2\xfd\x7a\xd3\xaa\xc7\x66\x57\xcf\x83\xab\x1c\xcf\x48\xf6\x07\xaf\xeb\xf1\xb9\xda\x2a\x6d\xd9\x90\x72\x05\x99\xc5\xd1\xa6\x0d\xf9\x99\x63\x10\x2d\xf1\x3d\xba\xe4\x34\x96\x3a\xc5\xac\x1e\xe6\xc6\x03\x5b\x86\x4b\xd6\xd8\xea\x0b\x65\x65\x0b\xef\xc1\x4c\xae\x35\x5e\x5f\x46\xc0\xcb\xff\xf1\xdb\xdf\xfc\xe6\x37\x2b\x33\x15\xbf\xfd\xdc\xfe\x5f\xac\xe4\x87\x4e\x84\x9f\x83\x8a\x53\x73\x59\xcd\x37\x95\x6c\x15\x8b\x5a\x70\x62\x51\x9c\x0c\xf2\xa5\x15\x9c\x6c\xd3\xe1\xe3\x6c\x33\xbf\x54\xed\xdb\xf2\xdf\x15\x7c\xfc\xdc\x7d\x73\xec\x68\x9a\x9c\xf7\x1b\x28\x7f\xcc\xc6\x30\x89\x3a\x98\x44\x2d\xe6\xb9\xa5\x7c\xba\xdf\x6e\x46\xfb\x0e\xe2\x56\xca\x2b\x75\xd3\x5c\xde\xcf\x80\xe0\x91\x7f\x99\x0b\x4d\x67\x3b\xe8\x3c\xbf\xb7\xd2\x08\xa3\xbc\x5f\x65\xa7\xdf\x4e\x3f\x1d\x99\xc7\x7b\x76\xc4\x7e\x7b\x7d\x42\xb0\x4f\xf6\x93\xcb\x53\xd0\xd1\x89\x1a\xe6\x7f\x05\xb9\x3e\x9d\xc0\xc7\xdb\x9b\xed\x1c\xad\x0f\xc2\x69\x67\x22\x6f\x77\xf5\x7c\x48\xf0\x75\x83\xea\x91\x58\xdd\x48\x30\xf8\x25\x92\x41\x31\x6f\x67\xe4\x58\xe5\xad\xee\x84\x00\x4f\x19\x14\xc8\x36\x5c\x0c\x0c\xb3\xcf\xb1\x75\x5f\x70\x95\xe5\xb8\xf6\x6f\x33\xe6\x79\x43\xdd\x08\xa4\x45\x70\x56\xbb\xd0\x50\xc7\x1f\xe8\x89\xbb\x63\x42\x82\xe6\x21\x8b\xa5\x47\x3e\x39\x9d\x1c\xba\x0f\x1e\x88\xfb\x24\x48\x38\x11\x9c\xce\x11\x26\x85\x01\xba\x44\x4b\x9f\xfa\x02\x04\x33\x3d\x4b\x0b\x7b\xfd\x0d\xf6\xcd\xd5\x51\x9e\xd9\xfe\x06\xfb\x48\x67\x37\x2c\xcc\xd3\x8c\xae\xef\x71\x12\x31\xc6\xd2\x7f\xe3\xb2\xf4\xb9\xe1\x3b\x4c\x0f\x56\xe1\xc5\x6a\x5d\xe5\x2b\x4d\xd0\x48\x94\x21\x39\x63\xeb\x97\x26\x46\x18\xf5\xa3\x98\xeb\xa6\x70\x29\xe4\x71\x9f\x3c\x4c\x37\xbf\xed\xf7\x93\x06\x40\xa8\x74\xcc\xf7\x1e\x67\x83\x84\xe9\x5e\xa4\xbc\xb6\x2b\xb7\x75\x59\xf1\x89\x6b\xa3\x63\x73\xec\xea\xe6\x1d\x92\x39\x3f\x15\x80\x47\x86\x19\xaa\xd3\x53\xf1\xbd\xac\x2e\x99\x53\x0c\x1a\x57\xb8\x57\xa4\x04\x70\x24\xe0\xaa\x95\x9c\x2f\xa1\x8f\x23\xa6\xdd\x1f\xb8\x26\xc0\x45\xe4\x70\x3d\x43\xd0\x5f\xa6\x44\x7f\xbc\x9f\xc8\x96\xef\xf3\x84\x4f\xd9\x9b\x3d\x32\x6b\xb7\xd8\x88\xa1\xf7\x96\x1d\x9a\x84\xd8\x53\xb7\x6f\x42\x79\xb4\xe9\x98\x3d\x1a\xe7\x10\x93\x77\xd2\x60\xe0\x32\xc3\x6e\x30\x2c\x72\xe6\xc1\x03\xaa\xc2\x63\x2e\x1e\x3c\x48\x89\xcc\xef\xfb\x09\x7e\xc6\xae\xcd\xe3\xac\xa0\x75\x1f\x4c\xd1\x06\xe7\x50\x36\xb5\xfd\xc1\x98\x39\xe2\x18\xd9\xfd\xc5\xf1\x70\x52\xdc\x93\xa4\xa9\xd4\x01\x74\x11\x63\xfd\x88\x04\x21\x4a\xe4\xd2\x61\xc7\x1f\xb3\x89\xb4\x93\xfa\xc3\x09\xb0\xf3\x5d\x37\xea\x6f\x1b\x65\x10\x1f\x3a\x1b\x0f\x35\x18\x6e\xf8\x43\x67\xb5\x6f\x42\x01\xf1\x8f\xa7\x6f\x48\xd8\xbe\xad\xbf\x73\xb1\x6b\xc4\x1f\xf6\xaf\x63\x17\x75\xab\xff\x72\x1c\x24\x3e\xe4\xf5\xe3\x11\xbb\xda\xf7\xc4\xd8\xf7\x78\x02\x9e\x52\xd9\x60\xb4\x3c\xeb\x1e\xc4\x92\xb7\x9b\x99\x3d\x65\xad\x07\xeb\x07\x36\xcb\x68\x51\xb6\x62\x51\x42\x0e\x1d\x30\xc0\x7f\xf1\xf9\xac\x6c\x8d\x27\xf5\x2b\xe3\xb2\xdf\x8b\x87\x21\x23\x3e\x4e\xef\x80\x3c\xf8\x2b\x73\x12\x09\x03\xd9\xaa\xdd\x69\x81\x69\xa9\x51\xfe\x69\x5a\xd4\x9c\xa9\x77\x61\x5a\xcf\x32\x29\xea\x7b\xf8\xec\x5c\x36\xfb\x61\xbe\x84\x5b\xfe\x9c\xda\xd8\x7f\xfc\x24\x16\x65\x0d\xca\xa2\x1f\x3a\x0c\x7f\xe8\xa0\x77\x9c\xbd\xa7\x24\x30\x71\x77\x33\xe5\xc0\xdb\xfd\x88\xd3\xf3\x6a\xfe\x67\x21\x65\xde\x4c\xa1\x4e\x0e\xa9\xe5\xb6\x29\xdb\x16\x73\x5f\x94\x0b\xcc\xfc\x64\xd0\x2b\xb5\x2a\x17\x21\x6f\xd8\x3d\xc2\x4e\x44\xc7\x50\x33\x15\x2f\x92\x9c\x42\x92\xd2\x39\x3f\xdc\xac\xa7\xd4\xf3\x9f\xca\xfa\x52\x15\x0f\x1d\x1c\x29\x20\x65\xf0\xc4\xe8\x8e\x27\x2b\x12\xe2\x69\x0b\x54\xb2\xef\x7b\x48\x90\x4e\xf1\x15\xbe\x58\x37\x4f\xfa\x1b\x6f\x70\x4b\x3e\x59\x92\xfb\x1c\x81\x83\x32\x9d\xb3\xaf\x03\x14\x19\x62\xe1\x28\x9a\xfd\x69\x89\x25\x55\xda\xd1\x52\x9a\xef\x1c\x2c\x48\x27\xa0\x04\x43\x1e\x92\xaf\x51\x7a\x78\x17\x2c\xdf\x99\xfc\x37\xb2\x9d\xdb\xdd\x74\x22\x5f\x26\x45\xfc\xac\xaf\x88\xcf\x14\x4f\x29\xfa\x58\xda\x3c\x78\x3b\x17\x96\x5c\x29\x08\xd7\xb0\xfb\x56\x2b\x63\xcf\x01\x29\x41\xa8\x83\x57\xcf\xde\xbe\x7b\xf6\xf4\xfd\x77\xaf\x9f\x3e\x7e\xf7\xec\xfd\x9f\x5e\xbc\x7c\xf1\x8e\x29\x27\x70\x11\x6d\x35\xec\xfc\x09\xf8\x2d\x9f\x93\x92\xdb\x7e\xb5\x94\xf0\x8f\x6a\xd3\x94\xa6\x2d\xe7\xcf\x75\x13\x3d\x91\xbf\x75\x63\x64\x0f\x1c\x8b\x5f\x26\x7f\x14\x47\xb4\xd1\x6d\x1a\xa0\xe7\x25\xf2\x14\x8d\x9a\xab\xf2\x0a\xb2\xbf\xb0\x54\x06\x10\x5b\x70\x64\x00\x58\x5d\x47\x7e\xce\x60\xb7\x92\x00\x79\xe7\x03\x83\x65\x2b\x8c\x5e\x29\xb1\xd6\x65\xdd\x7a\xb4\x98\x4d\xbb\x69\xa0\x31\xf6\x0a\xec\x79\x83\x23\xb8\x8c\x74\x49\xbe\xca\x2d\xe4\x09\x0f\x9b\x4c\xb4\xbd\x2f\xe5\x87\x72\xb5\x59\x39\xb6\xbd\x50\xeb\x76\x29\xfe\x7f\xf2\xfe\x75\xbd\x8d\x1b\xd9\x17\x87\x3f\xbf\xba\x0a\x38\x93\x84\x52\xc2\x83\xe5\x24\x33\x13\x29\x4a\xb6\x22\xc9\x89\xd6\xb2\x25\xbf\x92\xec\xcc\x6c\x27\xdb\x02\xbb\x41\x12\x51\xb3\xc1\xd5\x68\x8a\x62\x26\xbe\xf7\xff\x83\xaa\xc2\xa9\x1b\x4d\xc9\x8e\xb3\x66\xaf\x67\xfb\x83\xc5\xc6\xf9\x58\x28\x14\xaa\x7e\x25\xee\x32\x40\x5c\xf5\x06\x75\xd6\x8a\x0e\xf5\xb1\x02\x7d\x84\x4a\x2c\x04\xaf\x45\x0e\xd2\xe0\xa2\x80\x1b\xf5\x25\x18\x1b\xd3\x59\x14\x7b\x02\x22\x95\x82\x2a\xf2\xdd\x43\x5e\x7b\x08\x3f\xb4\x90\x73\x89\x98\xc1\xac\x5c\xce\xc7\x08\x2b\x1c\xaf\x99\x70\x85\x45\xcb\x4b\x07\x32\x66\x7b\x68\x82\xca\x93\xe5\x0e\x2d\xc6\x0f\x4d\xb5\x87\x0e\xb0\xa6\xc7\x5e\xd3\x3e\x50\xf9\x5d\x18\x0e\xd3\xc2\x27\x47\x59\xad\x21\x31\x60\x8a\x36\xe8\x4b\xea\x0a\x75\x15\x16\x5f\x06\xfa\xfc\xb6\xd8\x7c\x08\x0d\xf6\xca\xad\x50\xba\x73\xb8\xf0\x40\xcb\x5e\xd3\xac\x04\xc5\x4b\xfa\xc7\x4b\x10\xce\x14\xb1\x0c\x2d\x8d\xa9\x55\x89\x3e\x47\xc9\x5a\x3c\x62\xab\xdc\x7b\x8b\x48\xe4\xb9\x3f\x45\xb2\xd4\x76\x47\xef\x13\x1f\x5d\xa5\x96\x82\x9b\x27\x44\x73\x33\x2b\xd5\x8a\xdf\x40\xa7\x07\xa4\x72\xb2\xcc\x2a\xc1\xb5\x17\x6a\x45\x4e\x3d\x5a\x73\xb8\x69\x8a\xc3\x19\xed\x2c\x21\xba\x6c\x36\xaf\x53\x5d\x15\x27\x05\x90\xe4\xe9\x0b\x3b\x34\x8c\xa7\xfb\x5d\x17\x61\x4b\xdb\x36\x38\x3f\xa3\x4d\x61\x55\xa9\x2a\x21\xca\xba\xe2\x65\xb6\x36\xb4\x80\x2a\x43\x99\xa1\x85\xae\x70\xc3\x1f\xe0\x24\x5b\xe4\x0c\x27\x65\xf4\x7a\xf7\x5e\x41\x06\x0e\xaf\x0d\xbe\x3b\xb0\x7d\x8d\x53\x30\x01\xf6\x03\xad\x89\xea\xc6\xd7\xc8\xb0\x78\xab\x5d\x3f\xee\x2a\x0d\xca\x1b\x0e\x87\xcb\xb2\x10\xe8\x71\xac\x72\xf4\x72\x89\xd9\x1c\xbf\xdc\x37\x67\x05\x42\x69\xc0\x73\x8e\xd3\xe0\x0e\xcb\x02\xcc\x42\x04\x67\x08\x94\x91\xe8\x76\x6a\x16\xc6\x79\x19\x80\x5c\x18\xce\xb1\x43\x8d\xa7\x49\x3c\x91\xd9\xfb\x41\xd4\xac\x92\xd0\x59\x93\x17\xe5\x3c\x3a\x70\x36\x27\xe7\xa4\x3f\x14\x8b\xe1\xdd\xea\x84\x1a\x5d\xf7\x83\x76\x6d\xe3\x8d\x28\xf0\xc6\x15\x48\xd1\x1f\x25\x78\xb2\xe0\x2c\x4b\x32\x6c\xa1\x15\x0a\x5c\x75\x2e\xf0\x3c\xb5\x69\x23\x8f\x4e\xfe\xa2\x76\x4c\x97\x14\x9b\x6c\x9b\xda\x08\x17\x8a\xc8\x45\x52\x93\xcf\x9f\xc8\x32\xff\x51\x4e\x67\x42\xd7\x2f\x68\xdf\xc0\x50\x87\x1c\xff\x2c\x8e\x27\xae\x24\xbc\x8b\x27\x52\x35\x99\xd4\x2e\xaa\x9e\x76\x58\x64\x19\xfa\x7b\x49\x7b\xa8\x56\x5c\xdd\x47\x2a\x49\x44\x58\xa5\xeb\xfd\x10\x74\xee\xa1\x94\x2e\x6d\xaf\x03\x0d\xf3\xa6\x9e\xe6\xea\x81\x02\x7b\x82\x10\x96\x81\x7c\xc8\xb1\x7b\x4d\xfb\x1d\x5c\xf3\x57\x01\xb4\x9f\x66\x95\xc8\x97\x39\xb7\x3e\x0c\x01\xc2\x18\xf4\x1c\xcb\x89\x7d\x01\x07\x2a\x60\x88\xd7\x2c\x2e\x0d\x6f\x47\xe0\x50\x1a\xf6\xae\xa8\x13\x47\x1a\xf9\x2b\xee\x33\x81\xef\x8e\x60\x7e\xb8\x12\xf8\x2e\x1a\x97\xe7\xda\x0f\xec\x74\x05\xca\xf3\xa0\x83\x19\x0a\xbb\x1e\x6d\xa7\xe7\x3f\xd4\x6f\xda\xb4\x92\xee\x33\xfb\xe7\xde\x1b\xa4\xf5\xd0\x8e\xb3\xfb\xe7\xf9\x9d\x0b\x40\x5b\xcc\x2a\x48\x33\x20\x09\x01\xa1\x95\xe2\x99\x21\x03\xf5\x70\x3c\xd1\x91\xff\x8e\x21\xee\xd9\x26\xc6\xa6\x2d\x66\x7b\x30\xeb\xd4\xce\xda\x78\xa7\x8f\x31\xc9\x6d\x17\xdb\xe5\xdf\xd3\x3d\xf4\xe6\xb9\xb9\x7f\x01\x88\x6a\xba\xab\x0f\xe8\x63\xe8\x9b\x04\xff\x3d\x8c\x05\x6b\xe7\x7b\xf0\x68\xa7\xc6\xa7\x55\xe9\x3d\xc3\xe3\x56\x69\xf7\xe8\xa4\x66\x2f\xb9\x93\xde\xa7\xfb\xdd\x64\xf5\x9d\x97\x5e\xd7\xfa\x89\xfb\x9f\x6c\x79\x27\xcb\x7d\xdf\x52\x78\xf8\x5c\x6d\xc5\x99\xba\xc6\x70\x53\x85\x89\xfe\x00\x38\x45\xea\x20\x8d\xb8\xdf\xae\x93\xe3\x9b\xd4\x21\x9c\x58\x30\x09\x36\xb8\x8f\x82\xac\x9e\xc6\x22\xaa\x28\x4b\xfa\x68\xbf\xf7\x90\x4b\x64\x4d\xde\x6d\xe2\xd1\x7c\xb7\xe5\xdf\x5e\x24\x5b\xf7\xac\x8d\x44\xf5\xd5\xc3\x16\x48\x52\x3d\xd2\x21\xef\x22\xc5\xb1\x57\x29\xa7\x24\xc0\x35\x8b\x1c\x0b\x23\x77\x5a\xbb\x27\x6e\xbc\xf4\xdb\xa2\x48\xf0\xc2\xae\xba\xa5\x4b\x7d\xbc\x79\xcd\xd1\x50\x42\xc4\x52\x03\x96\xa9\x65\x59\x0f\x5b\x62\xd8\x86\xd8\x2e\x16\xe4\x79\xe5\x92\x54\xf2\xf0\x38\x4d\x16\x77\x70\x90\x9a\x65\x3f\x51\x2d\x01\xce\xe7\x9f\xef\x77\xdc\x46\x11\x46\xcc\x49\xa6\x0c\x2b\x81\x2a\x6e\x20\x06\x1d\x76\x15\x88\x42\x32\x3f\x35\x6d\x41\x65\xa2\x81\xfb\xcd\xa4\x2d\x56\x2e\xb1\xec\xdb\x92\xff\x26\x0f\xbd\x9d\x3b\x66\x31\xbc\x02\xe0\xe6\xed\xb3\xbc\x48\x3c\x8a\x84\x09\xe7\xb2\x3c\x69\xbc\xd1\xfb\x12\x03\xd1\x66\x1e\x80\x51\xfc\xa7\x10\x0b\x07\xb4\xa6\x4a\x82\x57\x76\xf0\xa1\x2d\xbf\x1e\x80\x41\xe2\xd1\x45\x57\xe4\x61\xc3\x16\x17\x22\x8e\xe2\x98\x77\xf2\xff\x01\xd3\x2e\x4a\x3e\x2e\xc4\x4b\x0d\xae\x2d\x65\x39\x3d\x7c\x71\x6a\x96\x8c\x6b\x72\xb7\xe3\x79\x2b\x03\xee\x9e\x8b\x6f\xee\x51\xf9\x42\xf5\xb9\xe4\x2d\xc8\x55\x10\xcb\xcc\x02\xc0\xd4\xae\xc5\xde\xdd\x9c\x86\x8b\xc7\xd6\x94\x25\x90\x7c\x3b\xfa\x75\xc0\x5a\x99\x77\x40\x77\xa6\x25\x23\x4f\xde\x2c\xe9\xc6\xdb\xe8\x45\xbf\xbb\x46\x37\x5e\xe6\xae\x4f\x98\xa0\x48\xb8\x68\xb1\x7b\x41\x4f\x88\xf2\xbb\x61\xfe\x63\x52\x18\xe0\x0b\xc1\x75\xdd\x6b\x13\x9d\x48\x80\x2b\x31\x6b\x8d\x97\x21\x84\xad\xb3\x11\xb6\xde\xc6\x9d\x7b\x70\x44\x8a\x69\x7b\xa5\x29\xc4\x04\xad\xd5\x99\x5e\x4e\x26\x32\x93\xa0\xa7\xe1\xe4\x39\x01\x59\x8e\x84\x0e\xdc\xd7\xc0\x10\xad\x50\x82\x90\x15\x78\x7f\xe7\xa9\x8a\x40\xb5\x48\x39\xd1\x0b\x29\x01\x93\xab\x7b\x2d\xdf\xf3\xb2\x62\x29\x53\xec\x6b\xc7\xf7\x46\xdd\x8a\x2a\x34\xbc\x02\x85\x2b\xdb\xdc\x61\x20\x0b\xef\x5e\xae\xff\x57\x0a\x12\x9c\xe8\xb9\x10\xbc\x1c\x58\x4c\xa9\xd6\x0b\x4d\x18\x98\x7c\x15\xea\x24\xfa\x6e\x68\x5a\x6f\x46\x29\xdf\xc6\x5f\xb2\x83\xc6\xdb\x91\xed\x5a\xe7\x8b\x12\x30\x31\x9b\xde\xa3\xcc\x3f\xb4\xd7\xa2\x3a\xba\x84\x28\x5d\x92\xaa\x6e\x38\x56\xff\x12\x97\xba\xab\xb6\xca\xfb\xef\xc3\x65\xc5\x51\x8f\x5e\x0a\x63\x68\xd6\xf8\xa9\xc1\x30\x3a\xa0\x79\x07\x0b\x5e\x55\xf0\x6e\x3c\x6a\xc3\x89\x3b\xb9\xc4\x0b\xae\x75\x24\x78\x03\x4b\xe8\x6a\xba\x44\xae\x47\x05\x6f\x4e\xd6\xf5\xbd\xf9\xdd\x25\x9d\xfb\xa6\x5b\x65\x38\x21\xfd\x74\x2d\x0d\x05\xdb\xa1\x27\x71\xcb\x2a\x86\x61\xa1\x08\x3b\x4a\xdb\xe1\x71\x2b\x29\x77\xb7\x54\xc7\xb9\x11\xb4\xd6\xa6\x75\x43\x4a\xdd\x68\x4d\x7c\x39\xb9\x47\x8e\x9d\xa5\xfd\xb5\x77\x1b\x87\xde\x5f\x63\x73\x70\xee\x01\x1c\x8e\xc5\x60\xf7\x8e\x96\x3d\x58\x6e\x45\x40\x96\x1d\x1c\x24\x3b\x6a\x8f\xd1\x1f\x1e\x83\x77\xc2\x6c\x6f\xad\x95\x37\xef\xb2\x58\xde\xfc\x8f\x59\x2d\x6f\x3e\xd4\x72\x69\x8d\xcf\x3b\xad\x97\xfb\x07\xec\xbe\x05\xe3\x8c\x2d\xdd\x39\x64\xf8\x15\x44\xbb\x94\x73\xd1\x14\x6d\x4e\x10\xee\xc2\xea\xb4\x37\x21\x71\xba\x81\xf5\xa9\x84\x4b\xb0\x80\x07\x2a\x66\xce\x7a\xb7\x62\xdb\xde\xec\x3e\xc4\x7c\x24\xe7\xc4\x2d\x23\xc7\x4d\x05\xcd\x79\xce\x41\x5f\xdd\x81\xaf\xe9\x68\x65\xb5\xfc\xfa\xda\x71\xb1\x30\xcf\x6e\xd5\x31\x43\x5c\x9b\x08\x3b\x89\xc5\xf0\x26\xb5\x15\x58\x0c\xa6\x95\xba\x69\x77\x68\xa6\x58\x95\x9d\x9f\x66\xa2\x0c\x2f\x41\x7e\x6f\xf6\x49\x6f\x21\x53\x65\x26\x0b\x51\x31\xae\x6f\x74\xac\xcb\x80\x5a\x3c\xee\xcd\x69\x34\x62\x80\xa7\xcd\xc4\x9d\xc8\x96\xa8\x10\xf9\x54\x55\xec\xf8\xfc\x39\xc0\x0b\x49\x33\x3e\x74\x03\x97\x1a\x79\x51\xd2\x69\x38\xcd\x0b\x71\x14\x30\x6e\x5e\x57\x2a\x5c\x26\x81\x7e\x83\x67\x86\x5a\x4b\xd9\x59\xff\x36\xb8\xc8\x30\xdb\xd0\xcc\xa4\x7b\x48\xdc\xde\x61\xdf\x6e\x50\x13\xb9\xbf\xe8\x14\x17\xe6\xb9\x44\xeb\xbc\x90\x02\x62\x6d\xa9\x33\x55\x83\x06\xc5\xda\x42\xb2\x03\xf8\xac\x52\x37\xc3\x86\xd3\x82\x40\x61\xc4\x79\x10\x83\x72\x39\x16\x57\x2f\x17\x05\x58\xe5\x6d\x37\x41\x39\xfb\x0e\x9b\xd5\x42\x60\x86\x23\xdc\x44\xfe\x8c\x40\x32\x1f\x75\x32\xcf\x1b\x5f\x02\xc6\x22\x5a\x53\x7f\xe6\x03\xc0\x68\xc4\x5e\x96\xb1\x47\x5d\xd8\x90\x5a\x79\x57\x69\xc8\x40\x95\x0e\x7a\x3e\xbe\xe4\xdb\x62\x78\x89\xd8\x90\x5e\x8d\xa7\x25\x13\xd9\x40\x62\xc2\x27\x3b\x20\x70\x1b\x58\xeb\x14\x67\x1c\x5e\x2a\x5a\x6c\x75\x03\xae\x20\x5e\x41\xf6\x65\xda\x2e\x8b\x71\xb0\xd3\xfc\x6b\xb8\xdb\xb4\x85\xb8\x15\x45\x1f\x34\x4c\xf0\x8a\xb7\xe5\xc4\x17\x7e\xb3\x47\x7b\x30\x7e\x75\xde\x9e\x94\x7d\xc6\x53\x5a\x8b\xa7\x09\x55\xb1\xd6\xc3\x39\x8d\x50\x22\xa9\x1f\x81\xb4\xd6\x22\xef\x54\x5b\x4c\x95\xd6\xd9\xa8\x90\x8d\x78\xd4\xce\x89\x77\xc2\x84\x36\xc2\x3d\x8f\xd3\x2d\x7f\x28\xff\x7d\xf3\xd3\xd4\x0b\x08\x94\x4a\x93\xba\x0b\xd4\xc7\x0d\x5a\x08\x69\x9d\xbe\x70\x89\xc6\x88\x39\x2d\xd5\xd2\xd4\x2c\x75\x15\x1b\xdd\x09\x13\x56\x42\xb6\xd4\x0f\x35\xaa\x68\x39\x79\xef\xa8\x82\x24\xc6\x4c\x73\x87\x8e\xee\x9f\xb9\xda\x1b\x1a\xc2\x1f\x74\xdd\xdf\x7f\x45\x76\x3d\x0f\xaf\xc6\xe8\x10\xc0\xca\x84\x9a\x2e\x5f\x86\xec\xb4\x36\xdc\x34\x61\xa7\x51\x1e\x50\x09\x44\xd5\xbd\x80\x03\x77\x9a\x37\xa9\xd7\xdc\xcd\x0a\x20\x76\x15\xd0\x30\xe1\x38\xa4\x15\xbc\xf7\x3a\xc2\xfb\x61\x9e\xb6\x6d\xe9\x5e\x77\x14\xe6\x0c\xf5\xf7\xf7\xa2\x2f\x8c\x8f\xb7\xe2\x5e\xe3\x1b\xd3\x34\x37\xec\x5e\x5b\xb5\x07\x05\xc8\x76\x22\xf6\xfc\xcf\x3e\x31\x1c\x91\xe6\xfc\x5e\x33\x60\x0b\xe0\x11\xde\xee\x6f\x6d\xfd\x6b\xcb\x89\x8c\x7f\xb2\x16\x13\x67\x81\x54\x28\xd8\x81\x6f\xb7\xb6\x46\x23\xf6\xd8\xcc\xd5\x8b\x8b\xf3\xe3\x3e\xdb\x35\x3f\x8f\x4f\x5e\x0d\x4d\xf8\x73\xd4\x27\xc8\x73\x13\xf9\xf4\xf4\xd9\x89\xe5\x5c\xb7\xb6\xdc\x9e\x99\x3a\xbf\x24\x4f\x55\x75\x89\xe8\x85\xdb\x68\x12\xd6\xb0\xe4\x00\xea\x9b\x8c\xf1\xd6\x81\xf3\x45\xbd\x3e\x1f\xff\x2a\x32\xef\xfe\x11\x85\x0a\x88\x05\x32\x15\x75\xab\x6c\xab\x11\x6c\xc3\xad\x12\xfb\x44\x96\x39\x49\x30\x5e\x96\x73\xae\x6f\x84\x85\x14\x08\x8c\x45\xa8\x5e\xa9\x9b\x36\xfe\x64\xc0\xf1\x1d\x5b\x54\x2a\x13\x5a\x1f\xcd\x64\x11\xe7\xef\xc7\x35\x9a\x75\x1d\x05\xc0\xe0\x9a\x86\x79\xef\x9e\x17\x8e\xec\x7c\xbc\x6b\x5a\x68\xc7\x70\x3b\x53\xe5\x44\xd2\xc1\x63\xb2\x4c\x45\xfd\x62\x39\x2e\x64\x76\xea\xad\xfe\x30\xcd\xb0\x15\xe5\x94\x9e\xdf\xf8\x8a\x2e\x9d\xf2\xf2\x01\x4b\x84\xda\xfa\x2c\x26\x54\x7a\xdb\x98\x1b\x48\x22\xf3\x70\xd3\x26\xdb\xb0\xcd\xee\x29\xae\x6b\xf3\xc5\xdb\xaf\xab\x90\xf6\xa6\x6c\x6e\xcb\xae\x9c\xa9\x4d\xd8\xde\xae\x5d\xb9\xd3\x9b\x38\xd8\xc6\x5d\x19\x1b\x9b\xbb\xb5\xbd\xbb\xf2\x35\x92\xed\x27\x6d\x91\xae\xd4\xe2\x99\x39\xfc\xc8\x1c\xd5\xb9\xea\x11\x78\x56\xf6\x9d\xc0\xdc\x6e\xbf\xd0\x50\xb5\x03\xb8\x1e\x6d\xbc\x01\xa5\x1a\xa9\x79\xcf\x39\xba\x6d\x27\xb6\x12\xc9\x48\xec\xde\x49\x8e\x1a\x5e\x76\x3a\x69\x56\x8c\x29\xbd\xe2\x15\x5c\xe4\xec\x11\x86\x07\x1c\x1d\x4e\x3a\xe0\x11\x38\x5b\x2c\x2b\x11\xdc\x7e\x00\xa8\x73\xa1\xad\xef\xa5\x5a\xec\xb3\x1e\xfb\x9c\xf5\xc8\x39\x99\x39\x23\xe9\xad\xd8\x6b\xb6\x5b\x5d\x73\x38\x13\xc9\xec\xdd\x29\x6d\x17\x6a\x25\xf2\x21\x16\x72\x3a\xf1\xe0\x6e\x7d\xeb\xef\xac\xa9\xb1\x2e\xcb\x94\xca\xfb\xcf\xe5\xcf\x25\x94\xe1\x05\x2f\x55\xd8\x29\xd3\xf2\x4f\xf4\xb0\xd7\x6f\x03\x7c\x6e\x9e\x07\x40\xb7\xea\xbd\x2c\x6f\x4a\xb5\x2a\x7b\x69\x2b\x60\xbb\x24\x00\x4b\xc6\xfe\x3c\x38\x60\xcb\x32\x17\x13\x59\x8a\x9c\x7d\x87\x53\xb9\xe7\xe2\xf7\xa3\xb5\x63\xe7\x23\xca\x0d\x39\x7e\xff\x9d\x11\xfe\x79\x14\xe7\xd1\xce\x9d\xd3\xb4\xed\xe1\x70\xb8\xb3\xc7\x4e\xee\x16\x22\xb3\xb2\x28\x50\xd4\x51\x60\x6c\xc9\x0b\x76\x6d\x8b\xb8\x8e\xc4\xdc\x30\xcd\x30\x76\xb6\xd0\x21\x33\x04\x52\xf0\xdc\xda\x6b\xe4\x7b\x34\x78\x6e\xf1\x47\x6f\x2f\xf7\x62\x4a\xc4\xc2\x7a\xb0\x28\x1d\x00\x8b\x69\xb7\x55\x64\x3a\xbf\xaa\xf8\x62\x21\x02\xcb\x86\x21\x81\x2e\xdb\xb2\x6a\x40\x35\x0f\x4c\x18\xbc\xdd\x34\x3d\x02\x84\x30\xfc\x63\x59\xb3\x95\x90\x55\x0e\x1a\x87\x84\x2c\xec\x6e\xb1\x08\x6b\xca\xb4\x58\xf0\x8a\xd7\x82\x5d\xe3\x68\x02\x85\xbe\x66\x87\x2f\x4e\xfd\xc3\x18\x3e\x3e\x43\x0c\x1d\xd6\xf4\xfc\x6c\x3b\xf1\xc8\xef\x58\x0a\x1a\x02\xf6\x4f\x47\xf8\x70\x51\xa9\x5a\x3d\x2c\xc5\x70\x69\x8e\xac\x71\x21\xde\x48\x0d\x2d\x40\x8f\x1a\x6e\x8f\x01\x58\x4c\xb5\x0c\x5e\x70\xdf\x11\x71\xa0\x21\xce\xeb\xca\x9d\x80\x17\xb1\x1b\xa5\xb5\x24\x48\x5b\xe4\xa0\xa3\xd0\xbd\x26\x4e\x80\xe5\x69\x79\x55\x4b\x5e\x80\xed\xcb\x1e\xfb\x97\x1d\x90\x3d\x37\xcc\x6f\xdd\x79\x49\xab\x71\xaf\xf1\xac\x8b\x62\xbc\x45\xc1\x33\xb1\x87\xdc\x9a\x0f\x7f\xaa\xaa\xcc\xac\xe7\x28\xb8\x14\x77\xee\x39\x32\xc6\x68\x35\x31\x18\x82\xbd\xa3\x1b\x4a\xa9\x45\x45\x96\xb4\xa7\x65\xad\xa2\x81\xe8\x53\xc7\x69\x40\x22\x54\x06\x7f\x9c\xdc\xe7\x50\x11\x5e\xc3\x95\xae\x2d\xab\xd2\x46\x71\x99\x29\x5d\x5b\xee\x20\x60\xd8\x7e\xb4\xc1\x91\x5d\x2f\xbc\x5e\xfa\x0c\x5d\x52\x40\x2f\x43\x8f\xee\x94\x2e\x67\x6c\x9e\x9e\xb8\x5c\x80\xdf\x3b\x87\x85\xb4\x17\xf3\x69\x18\x78\x5a\x4e\x54\x9f\xcd\xd6\xb9\xd9\x6f\xad\x16\x60\x09\xc8\xf2\x29\x55\x77\x65\xa3\x46\xd2\x05\x81\x1e\x6c\x13\xb5\xfa\x63\xdb\x3b\x3f\x69\x70\xc1\xed\x23\x3d\x44\x1f\x9d\xb4\xd4\xa8\x62\x3f\x2a\xe0\xd7\xbf\xec\xd5\x6c\x9c\x76\x1f\xe6\xfd\xdc\xb8\x6c\xf6\x68\x71\x80\x6c\x31\x68\xc0\x3b\x3a\xc0\xb7\xd9\xda\x3e\x84\xd2\x10\x68\x0f\x77\x99\xff\x5c\x2d\xcb\x00\xd7\xca\xb5\x3f\xf5\x0c\x00\xf4\x91\xf6\xe7\x1f\xad\x97\x2c\xd3\x1f\x58\xf3\x7b\xd6\x11\x2f\x99\xae\x2a\x12\x8f\x05\xe1\xdc\xba\x0b\xd3\x83\x6e\x72\xa1\x28\x2d\x58\x0c\xb6\x90\x14\x2a\x76\x3b\x95\xad\xb4\xf3\x69\xcc\xe7\x21\xcf\xa3\x47\x9d\x59\xb7\x1a\xb7\x84\x87\xf3\xbe\x6e\xfb\x6d\x3d\xe8\x16\xff\xe0\x6b\xfc\x83\x6e\xeb\x94\x2c\x7d\xdd\x87\x28\x77\xd1\x33\x24\xc4\x52\xd0\x24\x31\x8a\x15\x38\x5c\xb0\xa5\xab\x89\x3d\xeb\xe7\xf0\x51\x9c\x7c\x08\xfe\x83\x77\xda\x72\xbe\xf0\x61\xd2\xae\x23\x8b\xaa\x97\x2a\x22\x89\xb2\xd7\x89\x89\x47\x95\xb4\xee\xb6\xe9\xa2\x1d\xfd\x0e\xd6\x79\x0b\xca\x30\x40\x29\xdb\x54\x44\x83\x17\xb6\x8b\xa1\x79\x72\xed\xb5\x42\xfa\xe9\x84\x3f\xc9\x7a\x76\xa6\x10\x61\x4f\x87\xb3\x15\x1d\x7d\x0f\x3b\xfc\xa2\xb2\x1a\x08\x17\xf7\x9d\x85\x1b\x27\x6e\xf3\x89\xe8\x8e\x24\x59\xfe\x2a\xb2\xda\xf0\x06\xc7\xe2\xd6\xd0\x9c\xa8\x43\x39\x85\x1d\x05\xb2\x0b\xe6\x95\x40\x72\x28\xf9\xfb\x75\x38\x38\xec\x80\xc5\xb9\x86\x1d\x09\xdd\xa9\x62\xe5\x33\xb6\x25\x80\x8f\xa5\xb7\xdf\x70\xad\xe5\xb4\xdc\xfe\xd7\xdb\x7e\xa3\xc4\x7e\x64\xcd\x1a\xcf\xcd\xf7\x6b\x92\xf7\x75\xce\x4a\x50\x65\x07\xef\x12\x28\x3e\xf4\xa3\x8a\x12\xbd\x08\x2b\x72\x10\x4c\xad\x33\xef\x51\x47\xee\xc4\x03\x39\xca\xe3\x48\xe0\x1a\x8a\xbe\xc9\xe2\xa8\xed\x59\xab\x63\x21\xb0\x24\x22\x4a\x57\x3f\xda\xf8\x51\xc1\x59\xb2\x13\x0a\x6a\x51\xfe\xd8\x29\xf4\x7a\xc2\x0e\x18\x4a\xf7\x86\x93\x4a\x88\xdf\xc4\xf6\xbf\xb6\xfe\x7f\x76\xe7\x76\xc8\xc9\xb6\xde\xee\x6c\x2a\xf2\x0b\x76\xc0\xb6\xbb\x6a\xb3\x02\x8a\xb6\xf0\x0d\x6e\xc4\xe9\x5c\xfb\x20\x12\x45\xce\x69\xbc\x04\x28\x59\xb0\xf0\x32\x37\x18\x7a\xc1\x46\xd4\xab\xec\x86\x4f\xc5\x70\x6b\x2b\x48\x9f\x8b\x0c\x5c\x9e\x94\xcd\x1b\xe2\xdd\x42\x55\x35\x9b\xa8\x6a\x0e\x82\x55\x7b\xb1\x9b\xf1\xec\x66\x0d\x57\xba\x39\xbf\x11\x9a\xc9\xda\x1a\xb8\xd6\x33\x36\x56\xf5\x8c\x5d\xa8\xa2\x58\x2e\x40\x54\xf1\x1f\x42\xd7\xc3\x2d\x34\xaa\xe3\x59\xed\xdb\x1c\x09\xf9\xc2\xb1\x79\xdd\xa3\xc1\xed\xfd\xc2\xbe\x7b\x40\x9a\x8e\x39\xf8\x22\x1c\x12\xcb\x49\x5a\x0f\x7e\xd6\xad\x92\xac\x0d\xf9\xd6\x66\x59\xaa\xca\xac\x49\x82\x09\x1c\x2f\x0d\xbd\x0d\x66\xf0\x15\x79\xb8\x3f\x60\xbd\xdd\xbf\x0e\x77\x87\xbb\x3d\x2c\x9e\x5b\xc5\x80\xc3\x52\xce\xf1\x76\x56\xf1\xb9\xe8\x03\x56\xb8\x05\x1c\x04\x6d\x0c\xeb\x19\x11\xb1\x9e\xc8\xe6\x76\x82\x89\xeb\x99\x28\x4d\x69\xa1\xf3\x02\xb6\x50\xba\x7e\x2e\xb4\xe6\x53\x41\xc6\xb3\xd0\xd4\xc0\x7c\x18\xdc\x16\x2c\xb8\x34\xf7\xf4\x9f\x10\x66\xb3\x9e\x89\x2d\x44\xdd\x77\x79\xf1\x89\xb6\x62\xb9\x32\x97\xf4\xf9\x32\xb3\x16\xc0\xda\x83\xf3\xd3\x3b\xb3\x69\xe7\xe7\xd8\x28\x86\x2e\x65\x46\x23\xf6\xfd\xda\xde\xd1\x6d\x7f\xa4\x59\x5e\x00\x0e\x21\xcb\x5a\x85\x77\x78\xb4\x69\xa8\x65\x76\x03\x5e\x29\x4b\x8d\x3e\x50\x78\x6d\x0a\x2a\xf8\x5a\x2d\xeb\x3e\xb6\x18\x3d\x16\xc2\x3b\xf6\xb8\x52\x2b\x2d\x2a\xf2\x67\xa8\xd1\xc8\xc1\xf4\x6f\xca\xcd\x1e\x46\xe0\xf4\x5b\x2e\x0b\xf0\x61\x83\xa8\x6b\xe4\x33\xc7\x37\xd5\x64\xcc\xd7\x25\x9f\xcb\x0c\x9e\x9e\x78\xfe\xeb\xd2\xdc\x19\x86\xf8\xb2\x60\x68\xd6\x89\xd5\xf6\x38\x29\x6f\x65\xa5\x4a\xb8\xec\x67\xbc\x7c\xa9\xc5\xf1\xf9\x73\xb3\xef\x48\xe0\x93\x9c\x52\x10\x0b\xb6\x7d\xdd\xb5\x05\x7a\x3c\xab\x59\x2e\x0c\x0b\xa8\x99\x07\xc3\x88\x0b\x1b\xb2\xe7\xfc\x46\x30\x37\x3c\x6c\xad\x96\xac\x50\x3c\xb7\x02\xa1\x85\x2a\xd6\x13\x09\x23\xcc\x54\x91\xfb\x51\xd2\x43\x36\xab\xeb\xc5\xde\x68\x34\x19\x0f\xe7\x62\x04\xbb\x6a\x60\x93\xeb\x1e\x5d\x68\x49\x8a\x3f\xe3\xfa\x8c\xd7\xf2\x56\xbc\xf0\x28\x5f\x67\x6a\xc5\x0e\x6c\x57\x43\xf4\x2f\x10\x6f\x29\xa0\x74\xbd\x60\x34\x82\x24\xc3\xd2\xe4\x8d\xc6\x81\xc8\x1c\x44\x38\xc9\x13\x69\xec\xa6\xaa\xc6\x71\xc3\xe4\xfe\xa0\x69\xbc\xa8\x34\xaa\xa4\x67\xd5\xfd\xad\x80\xe5\xbe\xa7\x84\x63\xb3\x7a\xa3\xac\x01\x35\x08\x14\xa5\x56\x7c\x8d\x48\x27\x65\x26\x8a\xbe\xa3\x0b\xc8\xa0\xe4\x4a\x68\x74\x3b\x3e\x27\x12\x76\x7a\x14\xf4\x12\xba\xf9\x68\xf3\xaa\xc2\x66\x61\xbe\xe0\x00\x37\x6b\xe0\xa8\x71\xf7\xd5\x02\x94\x56\xd5\xb2\xde\x6e\x77\x8b\xb1\x28\xcf\xb6\x3f\x65\x23\x05\xa1\xbd\xc4\x88\x44\x87\xe5\x29\xda\x1a\xad\x53\x67\x22\x1d\x89\x31\x42\xd6\xe3\x78\xe8\x03\xb7\x90\x09\x8d\xa8\xe4\x1e\x19\x8d\xd8\x0b\xbb\x9a\x93\x5a\x54\xf4\x12\xe4\x08\xdb\xc5\xe9\xd1\x91\x97\xeb\x36\x40\x7e\x4c\xd6\x0d\xe8\x46\xf1\x36\x4b\x24\xb4\x6f\x73\x26\xfa\xd8\x2b\xaa\x43\x37\xd1\x99\x17\x11\xe8\x65\xcd\xb8\xd6\xcb\x39\x12\x3d\x5e\x83\x6d\xc3\xb2\x64\xbc\x66\x5f\x3c\x9e\x2c\xb4\xf5\xe6\x8e\xa7\xe6\xcc\x2a\x64\x39\x0c\xbd\x2d\xf2\x59\x52\x14\x44\x8b\xf0\x10\xba\xe5\xc5\x12\xe0\x85\x38\x9b\x70\x6d\x08\xb8\x29\x4b\x4e\x4c\xf1\x53\x41\x5e\xb9\x27\x15\xf9\x59\xe3\xb6\x3b\x5b\x64\x38\xcd\xe7\xe8\x7b\x2c\xb2\xfe\x32\xa1\x24\x2c\xfc\xe2\x0b\x3b\x16\x3c\x33\x9b\xaf\x19\x97\xea\xbe\x7f\xba\xbc\x77\xdf\xb2\x54\xce\x40\xce\xf8\xa0\xc5\x88\xc3\x0c\x83\x4b\xd4\x0f\xbb\x6f\xcd\xb2\x43\x40\x42\x39\x07\xcf\x3c\x56\x4b\xe2\xf0\xa9\xbb\x09\x87\xc5\xc1\xc1\x98\xca\x09\xa3\x3d\x04\xdd\x35\xa0\xb5\xa1\xca\x7a\xb1\xe2\x6b\x0d\xa2\xdb\x61\xf3\xfa\x11\xaf\x8e\x41\x9a\x1e\xf9\xcd\x03\xb2\xc9\x48\x1c\xf0\x61\x46\xe9\xa9\xdd\x05\xb5\x0a\x08\xda\x7d\x8d\x8d\x49\x5f\xb3\x95\x5b\x6e\x9d\x5b\xb7\xfb\x21\xaf\x50\x57\x12\xab\x43\x67\x4a\x70\xd0\xc3\xb1\xdc\x74\x94\x54\x09\xe4\x3b\x68\x3d\xcd\x31\xff\x7f\x8a\xb5\xe1\x90\xde\xbc\x81\x53\x29\xdc\xe5\x1f\x9b\x53\xed\x39\xaf\x67\xc3\x8a\x97\xb9\x9a\x6f\xef\x0c\x6b\x75\x59\x1b\x16\x69\xfb\x8b\xbf\xee\x0c\x75\x21\x33\xb1\xfd\xc4\xbd\x8b\x9b\x9a\xaf\x24\x10\x80\x40\xa4\x78\x1b\x3c\xbe\x83\xdc\xcb\x04\x0c\xb5\x5a\x56\x19\x9e\xcf\x2b\x59\xe6\x6a\x05\x10\x32\x10\x95\xf3\x9a\x43\x84\x6f\x60\x53\xee\x19\x69\x5e\x76\x93\x17\xeb\xea\xc4\xd1\xa5\x14\xb9\x8a\xe5\xce\x49\x42\xc6\x9c\x17\x92\x80\x64\x36\xdd\xa1\x10\x91\x4f\xac\xa2\xf8\xde\x82\xe0\x50\xb0\x91\xb4\x23\x52\xb8\x8d\xf2\xfc\xc4\x8c\xc0\x33\xa9\x6b\x51\x9a\xa9\x24\x33\x2c\x11\x9c\x52\xf6\x6a\x26\x04\x69\xc5\x6a\x35\x17\x16\x10\xaf\x06\xda\xa4\x2a\xc3\x7e\xb0\xd3\x13\x33\xd3\x38\xba\xc3\x66\xd9\xdb\x3d\x1a\xdd\x5e\xdf\xcd\x9b\x87\x2e\xb6\xe4\xc8\x52\xb2\xd6\xac\x56\x7c\x12\x81\x82\xdd\x4f\xc3\x59\x00\x02\x10\x12\x38\x2a\x89\x0d\x1a\x7b\xe2\xf3\x26\x31\xf4\xd3\x10\x17\xf1\x4d\x8b\x6a\x86\x56\xb1\xdd\xc9\x62\x88\xf4\x66\x99\x7f\x6f\x6c\xeb\x63\x31\x11\xa5\x96\xa0\xbf\x9e\xcb\x72\x0a\x1a\xfe\xa8\x00\xaa\x97\x0b\xb8\x73\xa1\x95\x76\xc0\xde\xc2\xf4\x96\x6c\xf7\xc9\xe3\xd9\x6f\x91\xab\xae\x53\x77\x72\x14\x6a\x85\xb4\xb2\x84\xa5\xd0\x67\xe8\xc8\x6c\x51\xa9\x31\x1f\x17\xa4\xb6\xea\xf3\x36\x07\xef\xef\x4d\x79\x0b\x16\x0e\xb6\x7e\xd0\x8c\xa9\x12\x1a\x50\x49\xfa\xfe\xd8\x03\xdb\x42\x93\x84\xfc\xd1\xea\x99\x69\x3d\x30\x54\x75\x36\x63\xcb\xc5\x30\x2a\xac\x5e\x29\x3a\xc3\xc0\xa3\x3a\xa6\x96\xa8\x78\xbb\x72\xc5\x72\x70\x86\x58\x32\x59\xe6\x92\x9c\x2e\xd2\xda\xf6\x85\x39\x9f\x64\x74\x68\xb4\x06\x0c\x07\x62\x85\xf9\x62\x4f\xc6\x6a\x51\xcb\xb9\xfc\x2d\x50\xf6\xa7\x13\x09\x8f\x69\xb5\xac\x82\xe3\x3c\xba\x53\x64\x99\xaa\xcc\x8c\x15\x6b\x54\x18\x17\x77\x7c\xbe\x28\x44\x1f\x0f\xb0\x5e\x15\x34\xb0\x5a\x96\x25\xa9\x15\xc3\xa4\xb1\x5c\xea\x45\xc1\xd7\x4c\x55\xec\x6b\xf3\xfd\xea\xc2\x06\x85\x8e\x3b\xcd\xad\xc0\x0c\xec\x9c\xdf\xd9\x3b\xa2\x19\x34\x59\xa2\x2c\xd2\x0c\x35\x06\xcf\x41\xe7\x8d\x97\x8c\x97\x6a\xce\x8b\x35\xcb\x81\xad\xf0\x45\xcd\x25\x38\xd2\xc7\x11\xb1\x7a\xdf\xce\xc8\xba\xcd\x1d\x34\x57\x6d\x7b\xd9\x7f\x97\x08\xdb\x8b\xf3\x25\x5f\x34\x53\x7c\x4a\x2a\x57\xfb\xe4\x0c\xf6\xf4\x86\x3d\xfc\xa8\x41\xb6\x43\xf5\xd0\x26\x3d\x0f\xb5\x31\x88\x9c\x05\xe7\xdf\xb6\x3f\x26\xfa\xac\xf7\x59\x2f\xa6\xb6\x09\x46\xbe\xf9\x7e\x65\xa5\x24\xbc\x41\x93\xd1\x35\xbf\x55\xfe\xc6\x0d\x43\xf4\x9f\xd7\x8c\xe3\xcd\xdb\x5e\x3e\x70\x07\xd8\xf2\x66\x6a\x45\xd7\x91\xa5\x06\x61\xcb\x70\xd3\x21\x13\x6b\x39\xd0\xe8\x74\x10\xd4\xa6\xeb\x3a\xc3\x5d\xe5\x32\x87\x1b\x4f\x03\x2a\xce\x34\x19\x4c\x23\xac\x0b\xbb\xc0\x96\x15\x66\x6c\xd8\xf5\x7c\x07\x85\xd2\x3d\x6a\xce\x6b\x51\x49\x5e\xc8\xdf\xc2\xce\x0a\x27\x00\xa8\x67\x95\xaa\xeb\x42\xe8\x7e\xb4\xd7\xd1\xbb\xee\x8a\xa3\xd2\x04\x7a\x9c\x44\xcf\x11\xee\xc6\xe4\x54\x56\xcc\x04\x81\x5b\x55\x33\x08\x88\x6a\x89\x52\x08\x5f\x9c\x9d\x13\xf0\xdf\xdc\x74\x8b\xe0\x16\x4e\xf7\x21\x14\x2e\xa1\xe4\xe5\x7e\x3b\x3a\xeb\x76\x12\xaf\xba\x8f\xdb\xf7\x59\x5c\x59\x89\xfb\x11\x5e\x5d\x3f\xfb\x6c\x8b\x7d\x66\x68\xce\x8d\x55\x71\x9d\x8c\x7f\xd5\x23\x92\x3e\xec\x99\xc8\x59\x5d\x2f\xf4\xde\x68\x34\x95\xf5\x6c\x39\x1e\x66\x6a\x3e\x9a\xf0\x4c\x8c\x95\xba\x19\x41\xe2\x71\xa1\xc6\x23\xf1\xd7\xbf\x8e\xf9\x93\xc7\x3c\xff\x6a\x2c\xbe\xfc\xe2\x0b\x31\xfe\xea\xcb\x2f\x9f\x7c\x31\x79\x32\x7e\xfc\xf5\xdf\xf2\xbf\x3f\xf9\xfa\x8b\x27\x5f\xe6\x5f\xe7\xe2\xaf\x23\x12\x15\x6a\xcc\xab\xab\x6c\xf4\xe6\xcd\x44\x55\x37\xfa\xcd\x1b\x5b\xed\xf0\x57\xbd\xc5\xa0\x61\xe7\x66\x7d\x67\x33\x5e\x4e\x41\x10\xb3\x42\xee\xd2\xfa\xf4\x34\xc9\xc1\x15\x80\xe0\xa0\x0e\x14\xf9\xfa\xec\x9b\xfc\xbc\xcc\x59\xae\x58\xa9\x90\xfb\x00\x7d\xdc\x1e\x25\xeb\x59\x95\x25\x3a\x1c\x01\x92\xf0\x33\x32\x9a\x13\x40\x98\xb5\x9c\x2f\x0a\x39\x91\x42\x93\xab\x91\x5c\x40\x9a\xc1\x60\x60\xfe\x5c\xca\xb9\x2c\x38\x40\x9a\x3a\x25\x62\xb8\xbe\xc1\xb6\x2c\xd4\xd4\x2c\x18\xea\x93\x55\x94\xc9\x54\x99\xcb\x1a\x9d\x06\x42\xed\x73\x51\xfb\x7a\xe9\xb8\x03\x8b\x90\x5a\x99\x22\xd0\xec\x03\x94\xa4\x72\x71\x2b\x0a\xb5\x80\x17\xd9\x80\xdd\x42\x05\xaa\x4a\xd6\xe6\x34\x31\x25\x2d\x78\x3d\xd3\x84\xeb\x65\x45\x6b\x85\x9a\x4e\xcd\x6f\xd3\x05\x84\x67\xaf\x54\xbe\x44\x6a\x13\x95\x05\x17\x4b\x58\xc2\x80\x44\xfc\x19\xc2\x91\x14\x6a\x2a\x11\xdb\x0e\x91\x87\x3d\x50\x09\x14\x88\x35\x6e\xb1\xcf\x46\x28\xb5\x29\xd4\xca\xc1\x5f\x50\xf7\x1b\x32\x95\x50\x33\x77\x51\xc9\xb2\x4e\xa5\x83\xbb\x91\x63\xcc\x4d\xab\xb7\x41\xb5\xb3\x10\x25\x3b\x70\x1a\x4f\x7a\x58\x88\x72\x5a\xcf\xfa\x26\x44\xb3\x03\x76\x58\x55\x7c\xbd\x0d\xa9\xbe\x65\xbb\xec\x3b\xcc\x30\x60\xbb\x6c\x8f\x3d\xde\xe9\xb3\x37\x37\x70\x9d\xd8\xdd\xc7\x5f\xdf\x40\x3c\x7e\x7c\xfe\xb9\x27\x5e\xa6\xb4\xd7\x90\x62\xc0\x76\x7f\x09\x2b\x84\xd0\x5f\x5a\xda\x31\xbc\x9a\x9e\x96\xb9\xb8\xf3\xb8\x22\xc1\x15\xc6\xdc\x5f\xa8\x8f\x7b\x20\x8a\xc3\xce\x0d\x2b\xd4\x6a\xd9\x1e\x7d\xa2\x47\xd3\x7e\xf2\xce\x66\xcd\x9c\x4c\x7b\x6c\x1d\x9f\x7f\xfe\x4b\x2c\x56\x09\x04\x28\xb4\xbe\x51\x68\xe2\x34\xd6\x7a\xc1\x45\x20\xd8\x3f\xf6\x68\x8a\xc8\x49\xa8\x91\x3f\x1a\x99\xe5\xce\x7e\x12\x45\xa6\xe6\x02\xef\x70\xe3\x25\xae\x26\x14\x4a\xc2\x6e\x60\xe1\x31\x85\x36\x4e\x2b\x00\xb1\xa9\xd4\xaa\x44\xd2\x99\xa9\xf2\x56\x94\x52\x98\x6b\xb4\x56\x5e\x3e\x69\x16\xbd\xf3\x5f\xad\x03\x17\x77\xe8\x1c\x6a\x62\x01\x27\x00\x44\x57\xd6\xc2\x7a\xc2\xc6\x5d\x02\xfa\x1a\xb4\x78\x20\x75\xe5\x0e\x0d\xb4\xaf\x2f\xc5\x8a\xa1\x65\x57\xa3\xab\xd6\x7d\xf1\x9d\x59\x8f\xee\x28\xbe\x67\xed\xba\xfd\xdb\x67\xf1\xf2\x04\xa3\x64\x08\x89\x35\x05\xfd\xb0\x37\x9b\xd3\xbb\x76\x5a\x82\xcd\x42\xfb\x6c\x38\x1c\x9a\x09\xdf\xb9\x06\xda\x2d\x2b\x11\xd2\x12\x10\xe5\xda\x85\x65\x97\x65\x6f\xa7\x69\xec\xf7\xc8\x95\x1b\x88\xfb\xc2\x5d\xf4\xe4\x61\xdb\xe8\x09\xfb\x96\x3d\xa1\x7d\xf4\x84\x0d\xd8\x93\x60\x23\x99\x22\x9e\xec\xd3\x4f\xdc\x4a\xf6\x33\xdc\x4c\xc1\x76\x82\x12\xda\xfb\xe9\xc9\x2f\x2d\x2d\x86\x90\x30\x0c\xf9\x62\x51\xac\xb7\xdd\xb0\xf6\xd9\x6b\x1c\xaa\x5f\x86\x99\x2a\x33\x5e\x6f\xc3\x70\x35\xde\xdf\xba\xc8\x11\x68\x9c\xb7\x83\xf1\xed\x45\xea\xc3\xba\xae\xe4\x78\x59\x8b\x33\x73\x46\xf3\x89\xd8\xde\x81\x07\x04\xc7\xea\xe7\xcb\x45\x61\xee\x10\x22\x37\xc4\xf7\xf8\xfc\xf9\x73\x5e\xdd\x2c\x17\xe7\x0b\x81\x2a\x60\x7a\xe8\xa5\xc2\x00\x98\xc2\xed\xcd\x17\x76\x3b\x3d\xda\x48\x8d\xe2\xdf\x57\x87\xcf\x4e\x8f\xdf\x1c\x5e\x5d\x5d\x9c\x7e\xff\xf2\xea\xe4\xcd\xd9\xe1\xf3\x93\x37\x17\x27\x3f\x9c\xfc\x83\xbc\x37\x5f\x88\xe9\xc9\xdd\x62\xbb\xf7\x7f\x5e\x9b\x99\x6f\x24\xbc\xbc\x3a\xbc\xb8\x7a\x73\xf4\xe3\xe1\x85\x59\x15\xbf\xa4\x92\xb8\xc8\xcf\x3e\x36\xab\x04\x04\x21\x45\x21\xa6\xbc\x88\x7a\x7a\xc4\xb3\x19\x68\xf7\xbd\xc5\x34\xe0\x36\xc7\x74\xb2\x33\x55\xe0\x01\xb7\x3d\x66\x3c\x0c\xf1\x56\x0f\x1b\x4a\x1d\xce\xb8\x3e\x5f\x95\x2f\x2a\xb5\x10\x55\xbd\x6e\x94\xd0\x10\xc5\x7b\x73\x52\x32\xf3\xea\xea\xd1\x3b\x95\x1a\x18\x08\x63\xb1\xdd\x93\x33\xac\x85\xae\x3b\x4a\xdb\xd0\xc9\xd7\x51\x8e\x5f\x36\x5b\xca\xb2\xee\x89\xea\x2e\x27\xfd\x82\x64\x9d\x57\xba\x6c\xac\x04\x7f\xf3\xd7\x9f\xe8\xeb\x5e\x9f\xc5\xfd\xb0\xb5\xc7\xa3\x82\x8f\x1d\xa8\x4c\x7e\x3a\x2d\x55\x25\x5e\xf1\x62\xf9\x27\xee\x8e\x86\x19\x74\x58\xe7\x82\xa6\x13\xb5\x08\x41\x20\x4b\x8f\x22\xd8\x64\x14\x88\x07\x5a\xd7\x61\x06\xb3\x24\xbe\x57\xaa\x10\xbc\x84\xd2\x40\x25\x1f\x73\x24\x52\x9e\x2d\xe7\xa2\x92\x99\x4b\x29\xf5\x19\x3f\xdb\xa6\x2a\x13\xe9\x5f\x28\x2d\xcd\x9d\xb2\x99\x0f\x2b\xf8\x86\xed\xa6\x32\x9d\xdf\x8a\xaa\x50\x3c\x17\x79\xb3\x61\xb6\x27\x91\x9d\x12\x32\xee\x7e\x48\x61\xd0\x72\xc1\xe1\x91\x17\x5e\xcc\x8f\xcf\x9f\xdb\x4a\xa4\xb0\xdc\x19\x3c\xd0\x63\xde\x1f\x04\x0a\xbf\xb1\x78\x93\x9d\xbb\x46\xa1\xd5\x32\xb8\x2f\x42\x1e\x1c\xce\x5a\x33\x99\x27\xaf\x20\xe9\xe5\xe5\x85\x5d\xe3\x52\x95\xc4\xc0\x0a\xf6\x91\x20\x65\xf5\x8f\xbc\x42\xba\xd4\x98\x1b\x78\x80\x99\x2c\xd1\xad\xaf\x15\xbd\xdb\x0c\xd4\x0c\x09\x0d\x65\x97\xe0\x0e\xc0\x35\x1e\xaf\x65\xf3\x65\x51\xcb\x45\x21\x98\x39\x10\x6f\x79\x61\x0a\x87\x5c\xd4\xb9\xd0\x0a\x0b\x06\xef\xa9\xaa\xdc\xa6\x37\x7d\xe9\xc3\x8a\xef\xbb\x3a\x71\xbd\x84\x96\x8d\x7e\x4a\x50\x05\xf0\x45\x10\xb2\x5d\x72\x87\x2a\x81\xa8\x77\x3e\x2e\x56\xf8\x99\x2f\x51\x43\xf1\x39\x1a\x2a\x1c\xc4\x73\x1d\xc7\x86\x2a\x4c\x8d\x7c\xcd\x45\x32\x5f\xea\xfa\xa5\x16\xb6\x4d\x29\xf5\x26\x95\x8b\xd7\x51\x1e\xfb\x01\x24\xa2\x53\xc3\x10\xb8\xd7\x70\xff\x37\xdb\x1c\x45\x36\xdc\x19\x6b\x90\xb6\xe3\x6a\x8d\x30\x99\x53\x03\xd5\xbd\xd2\xdb\xba\x40\xb0\xfc\x66\xdc\x9f\x2c\x1d\xb4\x36\x6c\xcc\xad\x6d\x86\xc9\x3b\x15\x75\x57\xde\xfd\x28\x27\x1d\x4b\xb4\xcb\x7a\xbd\xb6\xb3\xa5\x06\x61\xf6\xff\xde\xb6\x0a\xba\x8f\x54\xb9\xd5\xd7\x59\x0b\x34\xe5\xbe\x6a\xc2\xf6\xb2\xcf\x1b\x6b\x3a\x51\xa8\x4d\xb0\xa9\xdc\xae\xfa\x03\xad\x59\xff\x5c\xfb\x6e\xd3\xf3\x87\x46\x06\xe5\xa8\x33\x9e\x83\x60\xd2\x9d\x5f\xe6\xaa\x8d\x65\x96\xbd\x1a\x69\x84\x49\x03\x32\x25\xad\xcc\x25\x3e\x67\xb2\x6e\x96\x64\x15\x66\xf0\x92\x42\x5c\x74\x5a\x49\xec\x1d\x16\x51\x13\x8b\x74\xd3\x69\x93\xe8\x9e\x15\x6b\xad\x50\xc8\x84\x89\x41\xd4\x1e\x08\xb9\x6a\xf0\xbf\xc2\x43\xb2\x2d\x75\xb3\x24\x50\xff\x31\xd7\xb2\xe8\xdd\x46\x26\xe1\x45\xed\x80\x27\x7b\x9f\x5a\x30\x61\x2f\x47\x23\x76\x72\x2b\x4a\xf7\xf6\xe9\xce\x0e\x90\x27\x72\xa0\xb5\x7a\xc1\x11\x1e\xcf\xdc\xef\xc2\x91\x8c\xcb\xb1\x42\xbb\x95\x7b\xbe\x95\xb5\xf6\x05\xe4\xf0\xb3\xd9\x01\xb5\xac\xac\x19\x68\x5c\xda\x95\x6a\x55\x77\x76\xe9\x85\x8c\x20\x0d\xc9\x78\x81\x85\xa2\x06\x94\x43\xca\x30\x83\x15\x97\x26\xcb\xa0\x26\x54\xd9\xf0\xf1\x0d\xda\xf7\xe0\xf5\xf2\x36\xa6\x90\xef\xb9\x31\xac\xb1\x7c\xd8\x08\xcb\xf0\x7c\xe7\x4f\xd6\xbd\x30\xc5\x7e\x6a\x2b\x37\x4b\xd8\x40\x51\x3a\x17\x47\x42\x79\xbf\xdd\xbe\x84\x7a\x88\xbf\xaf\x05\x7c\x4d\x8a\x37\xf1\xfb\xfe\x3d\x99\x93\x7a\x26\xab\xfc\xfd\xf9\x12\x60\x4a\x40\xa8\x68\x1b\xf2\x07\xf8\x12\xbf\x44\xee\x63\x4c\xac\xac\xbd\x75\xbd\x2a\x63\x22\x9b\x78\x75\x36\x39\xdb\x54\x3a\x99\xcf\xf7\xb7\x69\xe6\xe8\x7f\xef\xb5\x8c\x89\x36\x9f\xb8\x0d\x7e\xe9\xde\x03\x2b\xb9\xb4\x22\xf9\xb6\x3b\x98\xc2\xb5\x72\x29\xc8\x25\xd2\x3d\x8c\x2c\x89\x94\xff\xd7\x82\x57\x7c\xce\xfe\x75\x7c\xfe\xfc\x04\x55\x86\xdf\x42\x7c\x18\x87\x2b\xf6\x2d\xcc\x4a\x18\xfe\xd9\x5b\xac\x24\x9e\x56\x7d\x0f\xbb\x19\xdc\x4d\x1e\xce\x65\x6e\xb5\x8f\x11\x73\x17\x40\x4a\x71\xd9\x1c\x66\x5b\x49\x68\x4d\xf6\xee\x5c\x68\x9b\x07\xf5\x93\x13\x87\x53\xff\xb0\xd2\xe8\x71\xee\x21\xe4\x2c\x6e\x2b\x63\xb9\x28\x44\x2d\x36\x8c\xe1\xce\x7e\x6a\x91\xfb\x0a\x1f\xc6\x26\x8f\x46\xec\x48\x95\x75\xc5\x2b\xd0\xcd\xbb\xd6\xc1\x28\x5e\xf7\x19\x6a\x28\x86\xb7\x0e\x5e\xd9\x4b\x48\xe8\xf1\xfa\xda\x2a\x98\x5c\xa3\xae\xf9\xe9\xc9\xdf\x47\x5f\x3b\x90\xe9\xcd\x1c\x38\x3b\x08\x99\xab\x06\xc9\x7c\x57\x2e\xdc\xe7\xf2\x47\xed\xa6\x1c\x90\x62\x3f\xe8\x48\x34\x00\x78\x69\xc4\x41\xd0\xe6\x44\x56\x73\xa1\xf1\x25\xe3\xfa\x35\x06\xff\x72\x6d\xa8\x2c\xf4\xb7\xef\x8b\xd9\x86\xed\x4c\x8b\xdc\x69\x6e\xab\x65\xbd\x40\x45\x36\x96\xa9\xaa\x32\x23\xeb\x14\x73\x76\x06\xa8\x3f\x15\x5c\x7d\x5c\x0f\xc2\xd3\x06\xdd\xe7\x46\xc7\xb8\x4f\xd8\x90\x58\xf4\x59\xd0\x8c\xc6\x45\xe7\x3e\x7e\xec\x7d\xaf\xe3\xb1\x79\x6e\xa2\xbd\xdb\xad\x26\x76\x03\x20\x3e\x20\x73\xbb\x7f\xfe\xf0\x0c\x8b\xd3\xf7\x9d\x33\xf7\x50\x11\xf6\x1d\x75\x72\x2f\x04\x9f\xf1\x7b\x0f\xb8\x17\xac\xca\xd2\xe2\x14\x31\x4c\xd7\x1d\x50\xc3\x87\x1d\x6d\x61\xbd\xf1\x49\x12\xe9\x37\xc1\xf8\x55\xe0\xcb\x26\x71\x04\x45\xe3\xd3\x1e\xea\x32\x35\xc2\x89\x6e\xd2\x91\x73\x0c\x04\x4b\x47\xb7\x11\x42\x43\xf8\xc3\x87\x4d\x70\xb0\xc4\x74\x31\x35\x9c\x56\xeb\xb9\xbb\xeb\xed\x46\xff\xa9\x47\x65\x67\xeb\x53\x54\xfd\x1d\x8f\xc4\x6e\xb1\xcb\x7f\xd3\x71\xe7\xdf\x74\xde\xf3\x04\xb2\x7d\x4d\x11\xf7\xf0\x9c\x08\x85\x42\x0f\xbd\x48\xba\x93\xc7\x1e\x34\x31\xac\x58\x8a\xdc\x44\xc9\x7b\xbd\x06\x55\x89\x73\x24\xd7\x58\xf7\x59\x13\xbe\xc3\xb4\xb6\x5e\xf7\x2e\x8d\x50\x82\xe0\xb0\x56\x45\x21\x72\xe8\xac\x19\xce\x2b\x30\x3b\x42\x8d\x57\x70\x40\xe5\x02\xc9\xa4\x3f\x7c\x57\x9e\x71\xc0\x81\x34\x57\x04\x7b\x43\xc3\x46\x8c\x97\x75\xad\xca\x3d\xa0\xdf\x04\x87\x65\xca\x1a\xab\xbb\x30\x4c\xce\xf9\x54\x84\x01\x33\x99\xe7\x22\xca\x56\xf1\x5c\xaa\x28\x40\x68\x51\x87\x01\x7a\x39\x9e\x4b\x0a\x71\x4f\x8c\x76\x19\x84\xbd\x61\xb8\x27\x43\xad\x5d\xc0\x65\xe9\xbb\x05\xd3\xf7\xf0\x19\xfe\x41\xc5\xf1\xf9\x90\x38\x98\xd0\xdf\x7f\x6f\xf5\x1f\x62\x35\xc0\x50\xfc\x62\x8f\x3c\x3d\x54\xe5\x11\xea\x57\xb8\x90\x8a\x32\xf9\x90\x5c\x6a\x3e\x2e\xc4\x43\x4d\x61\x6d\x94\x7f\xe9\xfc\xa7\x5a\x9a\xa2\x6e\x65\x6e\x2e\x5c\xec\x1a\xfa\x7a\x0d\xa5\x93\xce\xba\xaa\xe6\x6c\x02\xe0\xa9\x86\x0f\x01\x2d\xf9\x12\xdf\x39\xaf\x6d\x0b\xaf\xad\xc9\x11\x61\x81\xac\xa4\x73\x23\x0b\xf6\x52\x3c\x1f\x00\xbb\x02\xc5\x00\xc2\x08\x02\xd9\x80\xfb\x27\x53\xb2\x47\xc1\x31\xdb\x1b\xec\x93\xb4\x60\xd7\x64\xf2\x05\x63\x74\x3d\x64\xe7\xf5\x4c\x54\x2b\x09\x6f\x26\x26\xbf\x16\x35\x13\xe8\x86\x20\x68\x8a\xaa\xd8\xb5\x1d\xa8\x6b\xef\x5a\x35\x58\x4e\x80\x49\xf1\xc1\x26\xf3\xdf\x38\x59\xd4\x9b\xff\xcb\xa6\xeb\x88\x5a\xf5\x07\x27\xcc\x6d\x4a\x38\x25\x19\xfb\x8c\x11\xea\x19\x80\xfc\x95\x37\x22\x77\xab\xd5\x0b\x20\x26\x0a\x2d\xcb\x91\x3a\xc1\x68\xe8\x21\x33\xe3\x46\x6d\x2e\x55\x6d\x1a\x8b\x05\x82\x74\x4c\x2d\x6b\x80\x0e\x24\xe5\x4b\x84\x28\x3a\x7f\xde\x2c\xc6\x2f\x0b\x54\xa9\xfc\x6c\xb4\xc5\x36\x53\xc3\x61\x4c\x07\x23\x65\x85\x9a\x4f\x71\xb1\xd1\xea\x9b\x82\x03\x62\xaf\x56\x18\x67\xdd\x76\x34\xc9\x65\xe8\x99\xbf\xbd\x3e\x73\x05\xb9\x12\x12\xe6\x4f\xb9\x04\x36\x1f\x6d\x1e\x11\xdf\x16\x34\xbf\x07\xa4\xf2\x05\xca\x5e\x9f\xc1\xad\x6a\xcc\xf3\x21\x7b\x2a\xef\xd8\x5c\xe0\x13\xf8\x54\xd4\x21\x56\xd3\xf9\xaa\x14\x95\xa9\x11\xac\x64\x3b\xf0\x9c\xba\xf2\xec\xa7\x4a\x84\x56\x1f\x1a\x02\x9e\x2f\xe7\x60\x28\xfb\xb0\x52\xa3\x7c\x64\x94\x46\xb0\x5c\x30\x0f\xc7\x01\xf1\xf0\x87\x6e\x90\x8a\xd6\xe9\x71\xb4\x6a\xd3\x29\xdd\x0c\x5f\xa9\x97\x65\xb0\x30\x52\x89\xc3\x04\x57\xea\x28\x91\x38\x7c\x9c\xf7\xf1\x48\x88\x3c\xeb\xb5\xd4\x42\xfb\x46\xf9\x13\x02\x05\x35\xf6\x5c\xec\x79\xf2\xe2\x23\xe1\xf4\x03\xae\x81\x68\x48\x58\xd6\x77\x94\x9c\x88\x87\xc3\x43\xda\xa3\x70\xe4\x40\x1f\xd9\x07\x23\xcf\xa6\x9e\x5a\x4b\x6e\x60\xaf\xbf\x91\xe5\x62\x59\x7f\x0b\xd6\xf9\x01\x00\x19\xc8\xb6\x01\x6a\x0c\xbc\x6a\x5b\x0b\x52\x2d\x1c\x36\x16\x28\xc2\x99\x9a\xf6\x3c\x01\xeb\xdb\xad\xdc\x6f\x51\x91\x3e\x28\xb7\x35\x8e\x02\x62\x83\x4f\x27\x01\x0d\x34\x64\xc4\xd2\x83\x4a\x38\xfd\xc1\x42\x8a\x9c\x6d\xab\x0a\xba\x33\xf2\x8c\x62\xdf\x0c\x0a\x1a\x4d\xa9\x52\x6f\x01\x35\x30\x4d\x9f\x4c\xe0\x46\x6c\x6e\xc7\x34\x40\x80\x3a\x60\x8a\xc7\x91\x01\x6a\x69\xb5\x4f\x1b\xc0\x58\x16\x50\xca\xb7\xaf\x9e\x89\x35\xaa\xbe\xbb\xb6\x98\xfe\x98\xd6\xb5\x1a\x14\xd8\xc6\xe7\x0e\x81\x09\xaa\x2b\x55\x0d\x2d\xdc\x5c\xab\x85\x12\xeb\x93\x87\x32\xb5\xd0\x6c\x0e\xde\x6f\x48\x4f\xb3\x64\xaa\xca\xd1\xc8\x03\x3b\x9c\xa8\x0f\x51\xca\xb0\x86\xdc\x76\xe4\xaa\xb3\x65\x63\x53\xac\xac\x51\xc7\x17\x44\xb6\xcb\xd2\x0e\x9c\x19\xf5\xe6\x74\xee\x98\xe2\x40\xa0\xc1\x09\x47\x93\x86\x35\x4c\x8c\xb3\xbc\x63\x6b\xbf\x14\xc2\x9a\xc0\xae\x56\xab\xe1\xea\x8b\xa1\xaa\xa6\xa3\xab\x8b\xd1\x93\xc7\xbb\x4f\x46\x3f\x1d\x0f\x66\xf5\xbc\xf8\x6a\x60\xbe\x76\x1f\x3f\xf9\x6a\x54\xcf\xc4\x00\x56\xe7\xc0\x8e\x8c\x49\x80\xcf\xec\xa1\xc8\xf7\x47\xa5\xe1\x3a\xa3\x3d\x74\x51\x63\x0f\x1a\xa6\x98\x1d\xd8\x1e\x5b\x53\x25\x2b\x58\x0d\xf6\x8b\x8d\xca\x1a\x1b\x96\xbe\x1d\x73\x39\xb3\x55\xb2\x03\xe6\xd0\x21\xb6\x48\x5e\xe3\x2d\x84\xc9\xe7\x2a\x6e\x69\xf2\x58\xc0\xcb\x35\x99\x4f\x07\x82\xb0\x6d\xbb\xc7\x86\x24\xfe\x8c\x9c\x1c\x60\xfe\xb9\xe0\xa5\xa6\x04\x00\x6f\x6e\x76\x2c\x88\x8b\x76\x77\x61\x73\x81\xb7\x57\xb4\x32\x33\x19\xf6\xfc\x75\xaa\xdf\xdd\x34\x5d\x8b\x85\xab\x87\xa6\x30\x6e\x8c\x8b\x35\x49\x6d\x41\xcd\xc6\x54\xca\x54\x96\x9b\x2b\x2e\x20\x11\xf5\xd9\x98\x6b\x80\x20\x54\x25\x83\x3a\x16\x95\xc8\xa4\x96\xaa\xc4\x16\x9a\xb0\x87\xb5\x70\x2e\x4b\xf6\x29\x1b\xce\xf9\x5d\xb3\x9d\x4e\x47\x9c\x86\x12\xb7\x85\x2d\x09\x50\x0f\xab\x52\x54\x60\x81\xa1\x99\x5e\x66\x33\x30\xa4\x87\xfd\x03\x86\x1a\xb9\xa8\x24\x68\xf0\x82\x64\x01\x4a\xed\x33\x31\x9c\x0e\xd9\xa9\xd6\x4b\xc1\xfe\xf2\xb7\xdd\xbf\x3d\xc6\xf6\xce\x65\xd9\x6a\xee\x9c\xdf\x05\x61\xe6\xbc\x76\xe7\x3a\x2e\x86\x78\xd3\xb4\xf2\x87\xdb\xa4\x15\x49\xb7\x95\x88\x8c\x87\x72\x23\x73\xcf\x7b\x43\xb8\x7f\x00\xfc\x36\xa4\x0d\x0c\xc5\x35\xd8\xe4\xe6\x21\xf1\x9d\x0b\xd9\x54\x12\xb5\x7b\x0b\x95\x60\xb7\x22\x24\x17\x58\xfd\xfb\x91\x64\xca\xe4\xfa\x29\x28\x26\xb9\x1d\x71\x60\xde\x85\xe1\xda\xee\x01\x11\xe8\x85\x4c\xd6\x06\xc6\x23\xf4\x7d\xd7\x3c\x21\xc3\x87\x17\x30\x10\x03\x76\x3e\x66\x1c\x5a\xa9\x1e\x6d\xe2\x33\x76\x5a\x80\x94\x56\x1b\xec\x13\x6d\xb1\x80\xc8\x26\x6a\x41\xbe\xd5\xcc\x5e\xfe\x44\x07\xa0\x1b\xb6\x7d\xa0\x4b\x1f\x37\x06\x5b\x48\x50\x9f\x50\x82\xb0\x67\x37\x9c\x08\x63\x61\x19\xf1\x80\x9b\x01\x27\x82\xc1\x37\xe4\xde\x06\x04\x8d\xc9\xda\xa6\x0f\x4f\x46\x53\x4b\x9f\xdc\xba\xa5\x5a\x80\x8e\xa7\xcd\x59\x07\x45\x99\x46\xef\x0c\xd9\x31\xa2\x8f\x8c\x45\xbd\x12\xc2\xf0\x26\x88\x7e\xb1\xa1\x21\x38\x06\x50\x86\x3d\x7c\x4c\x9f\x51\x5a\x11\x98\x48\x69\x61\x3b\xfe\x5c\x81\x9f\xb8\x89\x42\x95\xee\x9e\x35\x95\x08\x21\x14\x7c\x05\x03\xcf\xdb\xf7\x5a\xcb\x24\xe0\x78\xb7\x11\xa1\xf4\xd0\xf3\x3b\x76\x71\x01\xa5\x75\xd2\xdf\x7b\x18\x4c\xaf\xab\xf2\xb6\xb1\xe2\xec\xa6\xdd\xb4\xde\x5e\xa5\xd3\x3c\xea\xe2\x7d\x3f\xc4\x4a\xc3\x76\x05\xeb\x0c\x1b\xf1\xe7\xae\xb2\x5b\x57\x47\x73\x8d\xbd\x0a\x62\xfe\x9f\x5e\x61\xa9\x8b\x4e\xbc\xba\x1c\x36\x79\x1e\xa7\x6a\x2f\xa9\xfd\x4e\x9e\xa7\x4d\xe8\x9d\x68\x2c\x26\xf8\x7b\x1d\x57\x8b\xe6\x95\x63\x2f\x49\x41\xfb\x61\x89\x74\xb6\x25\xae\x24\xae\x34\x7b\xa2\x85\x9d\xb0\x18\xfa\x76\xdc\xf7\x52\x57\x2c\x77\x41\xf6\x7e\x2a\x80\xdd\xa5\x33\xe8\x1d\xb8\x41\x2f\xe4\x8e\x2e\x85\x89\x3a\x83\xc3\xe5\x51\xe2\xe0\x0c\xb2\x7f\xfa\x29\x8b\xbf\x1e\xdd\x73\xb1\xec\xde\xe0\xc1\x32\x02\x3d\x60\x73\x0d\x80\xad\x50\xa6\x56\x7f\xb0\xf3\xf1\x12\xe0\x53\xa4\xf7\x78\x20\x52\x21\x8c\x3d\x60\x87\xa2\xa2\x6b\x15\xf6\xc6\x30\xf9\xb7\x32\x13\xec\x56\x54\x9a\xef\x50\xb1\x1f\x64\xbb\x5a\xe5\xb1\x42\x4e\x04\x18\x57\x2a\x6b\xd6\xe5\x90\x8d\x83\x2d\xfb\xe0\xdd\xfa\x89\x8e\x36\xe0\x7d\x4c\xc4\xf6\x4e\x73\x8b\x6e\x10\x07\xa4\xce\x81\x7b\xd7\xc6\xa3\xf4\xe2\xe8\x12\x51\xbc\xc7\xe2\x60\xf7\xaf\x8c\x70\x32\xde\x69\x6d\xc4\x2b\x23\x9a\xd3\xff\x07\xd7\xc6\x06\xb9\x52\x07\x15\xef\xbc\x5f\x12\xc6\x44\x4c\x78\x77\xda\xcf\xce\x8d\xd7\xbe\x1e\xe5\xe8\xf5\x5d\xd1\xbf\xff\xee\x90\x1c\x82\x8a\x3b\xee\xbc\xfe\xd1\xb7\x51\x65\xac\x57\xf4\x18\xfc\x2f\x9b\xa5\x9d\x56\xe6\x0d\xa3\x58\xef\x71\x2f\xd0\x85\x38\x53\xb5\xd8\x63\xa7\x27\x5f\xb3\x4a\xa0\xf8\x92\xb3\x72\x39\x1f\x03\xc2\xc5\x62\x69\xbe\x35\xeb\xd5\xe2\xce\x9c\x94\x5a\x61\x37\x48\xf8\x41\x16\xa8\xc3\xd4\x9b\x60\x28\x2f\xc3\xf2\x7a\x91\x42\xca\xa5\x9c\x83\x77\x51\x76\x0d\xd5\x60\xeb\x0e\xf5\x19\x24\xbd\x1e\x42\x8b\x72\x25\x22\x43\x55\xaf\xd3\xea\x86\xcc\xe6\x30\x43\xc7\x2b\x2d\x9e\x16\x8a\xd7\xdb\xbe\xbf\x70\xde\x3f\x76\x7a\xd9\xa6\x75\xbe\x0d\x42\x17\xb2\xac\x07\xf4\x6e\x30\x28\xc5\x5d\x3d\x28\x64\x29\x5c\x25\x34\xf0\x71\x4d\xbf\xff\xfe\x8e\x25\x1c\x34\x4b\x88\x27\xcb\x56\xd0\x00\xb5\x38\xe2\xba\x76\x12\x37\x04\x85\xab\x2b\xb2\xf5\x73\x38\x70\x5e\x1b\x16\xee\xe4\xa4\x70\x52\xac\x87\xec\xa7\x99\x2c\x44\x58\x9e\x85\x3b\x33\xa4\x86\xe0\x17\x72\x85\x22\x7a\xae\x43\x67\x05\xbf\xea\x5c\xcd\xad\xf6\xed\x30\x56\xd3\x70\x6b\xc8\x29\x0c\x24\xdf\x4e\x1d\xa5\xf5\x0c\x77\xa8\x2b\x13\xea\x25\x7d\xb8\x5e\xfe\xe1\x3e\x6e\xec\x61\xeb\x41\xb7\x79\xab\x88\xdc\xfe\x27\xee\x13\x0d\x4c\x9a\xd1\x88\x9d\x96\xec\x68\x56\xa9\xb9\xe8\x33\x14\x55\x99\x7e\x47\xb9\xcc\xe9\x2e\x2a\x73\x83\x20\xb2\x8b\xe8\x93\x24\xa7\xd4\x14\x18\x69\x7c\xda\xc2\x9f\x82\x48\x36\xd8\xc7\x28\xb5\xb4\xa0\x19\xd8\xe6\x42\x69\x28\x8e\xcb\x02\xeb\xce\xe4\x9c\x17\x6c\xa1\x64\x59\x6b\x42\xe4\x98\x73\x59\xd8\x22\x82\x79\x83\x86\xb3\x8a\x4b\x53\xc2\x47\x57\x33\x81\x50\x90\x13\xe9\x34\x47\xbf\xb9\xfb\xd6\xf9\xc6\xc0\x36\x52\x61\x3c\xcf\x2b\xa1\xf5\x47\xbe\xb5\xbe\xdc\x1f\x05\x4a\x98\x90\xcc\xd4\x8a\x69\x21\xac\x05\x79\x34\x34\x33\xae\x3d\x66\x09\x0a\x60\xf3\x3e\xfa\x40\xf0\x32\xf1\x45\xa5\xc6\x85\x98\x6b\x5f\xfe\xca\x02\xad\x80\x74\x5a\xd2\x10\xa2\x18\x5d\xdc\xd5\x89\x16\x6d\x42\x01\x80\xc3\x6b\x84\x86\xea\xa3\xbf\x3d\xf9\xea\x8b\x50\xb1\xcb\xac\xa6\xd6\x9d\x12\x96\x55\x7b\x7d\xb4\x94\xa9\x1a\xd7\x89\x8e\x6c\x6d\x75\xa8\x94\x7c\xa5\x6b\x65\x1e\xa5\x4f\xb3\xb8\x05\xfe\x5a\xfd\xe8\x51\x2a\x77\x78\x88\x86\x2c\x3f\x80\x80\xa8\x65\x59\xbf\x2b\xd7\xbf\x45\x90\x3e\x35\xcf\xec\xc5\x18\x58\x9b\xb0\xdf\x00\xf0\x83\x58\xf5\xb9\x62\xbc\x5c\x23\xca\x81\x05\x8d\x09\x5c\x50\x12\x0c\x13\x28\x23\x18\x56\x06\xf4\x14\x82\x93\xad\x9e\x29\x4d\xe4\x45\xb3\x4f\xa3\x4a\x50\x0d\x12\x9f\x42\x87\xec\x6a\x26\xd6\x58\x98\x7d\xfd\x80\xa2\xe0\x75\xd6\x74\x41\xa3\x65\xb7\xd4\x4c\x59\xd3\xb4\xa6\x05\x83\xb9\xf1\xda\x25\x8b\x45\xe1\xfd\x57\x5b\xba\x35\xa0\xea\x6d\x7b\xb6\xc5\x94\x7d\x74\x89\x6d\xff\xff\x2f\x45\xb5\xfe\x68\x07\x17\x70\xa9\x42\x2b\x88\xd1\xc8\xbd\x5a\x03\xf6\x9f\x05\xe4\x0e\xee\xb5\xf6\xd9\x93\x6b\xc1\x7a\x38\x1a\xbd\xbd\x20\x08\xfa\xd2\xb3\xb0\xd9\xe3\x4a\x70\x02\x3c\xc1\xe8\x4c\x15\xaa\x8a\x32\x98\xfb\x5c\x2b\xc0\xf0\x7e\xc9\xc0\x01\xd8\x1d\x44\x51\x73\x55\xd6\xb3\x28\xa4\x95\x7b\x25\xc4\x8d\x6b\x93\xb5\xb0\x9f\xc8\x3b\x52\xe5\x2a\xd5\x40\xcf\xd4\x0a\x71\x22\xc0\xc9\xe7\xf9\x25\xbb\xe4\x13\x5e\x49\x18\xea\xc3\x32\xaf\x94\xcc\x89\x54\xed\xbd\xd7\x8e\xfe\xe2\x8b\xf4\xd9\xb0\x9f\x0a\x6e\x6d\xdc\xfd\xf6\x78\x36\x00\xca\xdb\xf9\x6f\x93\x19\x2d\xca\xdc\x99\xaa\xe6\xe8\x14\x76\x25\x7a\x39\x03\x78\xa5\x5c\xb1\x6b\xc8\xea\x99\xd7\xf0\xf3\x1a\x65\xfd\x74\xef\xb7\xaf\x00\x85\xd0\x1a\x97\xeb\x78\x39\xb5\x1e\x11\x11\xc7\xaf\x14\x22\xc7\xfb\x03\xa2\xda\xc2\x13\x82\xb9\x13\x20\xc9\x1f\x2f\x01\x4e\xa4\x12\xee\xfd\x31\x26\x08\x01\x4c\x23\xa0\x9f\xc9\x39\x80\x78\x4c\x8a\x25\xe0\x1f\xf8\xd3\x5c\x4d\x1c\x4f\x0c\xb8\x73\x04\x86\x97\xc3\xce\x37\xb4\x60\x67\x88\x65\x5d\x88\x89\xa8\x04\x20\x69\xdb\xa9\x1b\x2f\xa7\x86\xbe\x55\x6a\x2e\x97\x73\x78\xae\x5a\x8c\xec\xa7\x9d\x3d\x53\x90\x2c\xbe\x93\xf9\xc1\x5f\x1f\xff\xfd\xcb\xdd\xbf\x3a\x9c\x3e\x0b\xb9\x53\x8b\xf9\x42\x55\xbc\x92\xc5\x9a\x2d\x4b\x43\x17\xc0\x30\xc6\x70\x21\x80\x48\x9a\x4b\x5d\x2d\x17\xd0\x45\x78\xf1\x25\xf5\x29\x36\xad\xd4\x72\xe1\x40\x23\x4b\x54\x69\x83\x21\x2f\x49\x85\xcd\x2a\xf6\x12\xc9\x8f\x34\x35\x29\x3d\xae\xa1\xb7\x5b\x9d\xd4\x36\x11\xbc\xff\xce\xa9\x1f\xd0\x10\xdb\xe6\x98\x7c\x57\x42\xd7\xaa\x12\xfe\x06\x05\x77\xe5\x8f\x77\xdf\x41\x78\x13\x0b\x7d\xf0\x3e\x64\x85\x35\x36\xf6\x8c\xcf\x45\x7e\xa4\xcc\xb5\x53\x37\x92\xb4\xe5\x47\x51\xe2\x4a\xa9\xfa\x2c\xc8\xe0\x1b\xe2\x55\x0c\x75\x34\x21\xe9\x57\x7c\x60\xc6\x71\x84\xa2\x53\xd0\x14\xf5\x5f\x86\xe6\x82\xef\x63\x74\x4a\x8f\xd0\xf8\x10\xbd\x32\x8c\x27\xdb\x76\x29\x86\xe8\x21\x03\xdc\x11\xb8\x73\x34\xcc\x9f\x4a\x19\x01\xa9\xa0\x2d\xdc\xb5\xad\x67\x38\x51\xd5\xfc\x1a\xcc\xe2\x4a\x55\x0e\xc0\x91\x0f\xe2\xb9\x19\xee\x08\x2e\xff\x75\xb5\x66\xd7\x00\x26\x6e\xc5\x02\xd7\xee\xb9\x0e\xb1\x54\x79\x1d\xec\xc1\xb1\x98\x71\x73\xd8\xe8\xba\x32\xdc\x52\xb1\x26\x9d\x76\xf4\x87\x0f\x25\xf2\xc2\x1c\x62\xd5\x1a\xe5\x00\xb6\x2c\xac\x63\x2a\x6a\xd2\x85\xd5\xdf\x83\xae\xe6\x75\xdf\xd7\x02\xdb\x1d\x94\x9a\xe8\x29\x8a\x54\x62\xc0\xcd\x42\x25\x4a\x5b\x94\xa1\xcb\x78\x6e\xcb\x32\x2b\x96\xb9\xb0\x47\x31\x94\x62\xe1\xab\x7e\xbc\x7a\xfe\xec\x2b\xac\xf6\x20\xd0\x3e\x1a\xb2\x4b\x59\x66\xee\x11\x16\x80\xb3\x81\x01\x9e\x3b\x40\x7c\xa0\x23\xf0\x66\x4e\xba\x5a\xe0\x9e\x34\x19\x0f\x28\x3f\x58\x52\xae\xb2\x25\xbe\xf0\x3f\x13\x75\x4f\x23\x59\xb5\x8d\x41\x93\xb9\x6b\x98\xbf\x4b\x51\x88\xac\x56\xd5\x61\x51\x5c\x07\x37\x14\x6b\x44\xe7\x1e\x61\xa5\xd6\x8e\x2b\x19\xba\xe5\x04\x74\x23\x5a\x0a\xcd\x42\xe9\x49\xed\xb5\x59\x90\x07\x86\xe5\xfb\x8f\xcb\xf3\xb3\x21\xde\x88\xe4\x64\x8d\x06\x07\xa8\x41\x0c\x88\x17\x66\x31\x1f\x7c\x04\x0b\xf9\xa3\x5f\x7a\x56\x08\xea\x90\x4e\x24\x00\xf2\x30\xc9\xbe\xc1\xba\x09\xe8\x64\x9f\xc9\x10\xa1\xc4\xa4\x84\x87\xef\x33\xdc\xc2\x90\xf4\xb5\xfc\x25\xd4\xc5\x0d\xe2\x0f\xfc\x5e\x30\x77\x6b\x17\x03\x0b\x16\xe8\x4c\xb4\x84\x9b\x3e\x60\x64\xd9\x64\x5b\xfd\xd9\x8e\xaa\x1f\x00\x16\x23\x27\x11\xcd\xd5\x5e\x3d\x62\xbc\x66\xb9\x9c\xc0\x89\x60\xae\x82\x0b\x29\xb4\x39\x4a\xe0\xe5\xd2\x97\xc7\x09\x3a\x07\x6c\x26\x61\x7f\x1b\xb6\xcd\x15\x02\x30\xeb\x2e\x1e\x5a\xbe\x6d\xcd\x2b\xff\xb2\xfb\xf5\x17\x5f\xef\x84\xf8\x6b\x08\xa0\xe8\x70\x1f\xd5\x0d\x5f\xef\x7b\xcb\x49\x2f\x9c\xc0\x85\xc3\x75\x2b\xce\x97\x35\x97\x77\x1e\x3f\x28\xee\x21\x3c\x07\x99\xbd\x8e\x91\x2a\x00\x17\x74\x53\x64\x75\x1b\xa6\x02\x45\x60\x24\x0e\x83\xe0\xa7\x95\x9a\x9b\x61\xff\x78\xd7\x4f\x97\x93\x88\x3d\x0a\xb2\xa7\x3c\xff\x5a\xb5\x3c\x10\x33\xee\xb1\xe7\x61\x33\x51\xa1\xc6\xb6\x0b\x1b\x4d\xdb\xd6\xf9\x41\x80\xc1\xbb\x36\x03\x7d\xdd\x46\x17\x4b\x78\xfb\x0d\x2c\x7f\xa5\x8e\x05\x8e\xed\xb3\x16\xc0\x81\x32\x07\x96\x8f\x37\xe1\x19\x0f\x86\xd5\x90\x49\x8b\x8a\x08\xf7\x41\x3c\x18\x6b\x65\x3d\xb7\xc1\xd2\x72\x2e\x0a\xac\xfc\xdd\xdc\x60\xc5\x20\x73\x8c\x8b\x5d\x3c\x9a\xf1\x85\x39\x2e\x2a\xe9\xfc\xc1\x37\xcf\x33\x37\xc4\xfd\x60\x66\x76\xba\x6e\x43\x93\xc2\x5c\x01\xca\x23\x22\x87\xdb\x96\x2e\xfa\x63\x0b\x1c\x1a\x81\x73\x2d\xc3\x19\x20\xaf\xf2\x14\x73\x39\x2a\x8a\xe4\x13\xb0\xdf\xbc\xe6\x13\x2c\x33\xa0\x10\x9a\xb9\x3b\xbf\x26\x28\x5b\x49\xd0\x27\x28\x37\x30\x5b\x40\x82\x71\x5a\x3e\x74\xdc\x50\xc6\x4b\xa6\x65\x81\x00\x26\xfa\x46\x2e\x10\x0c\xd3\x39\x74\xa0\x12\x8e\xcf\x9f\x83\xd3\x30\x40\xd9\x40\x51\x37\x16\x01\x58\x52\xc8\x92\x6b\x41\x2a\x1d\xb2\x44\x84\xc5\xa1\xd5\xe1\x1c\xda\x9e\x1b\x9a\x70\xc2\xb3\x99\x1b\x81\x10\xf9\x2b\xf2\x3a\x84\xf2\x56\x59\xe4\x4d\x7b\x97\x2e\x8b\x4f\x0b\x02\x46\x79\x0e\x58\x0f\x87\xa5\x17\x7a\x9e\xf4\x91\x2d\xa1\xa4\x9d\x81\xcf\x0f\x30\x59\x30\x97\x91\x96\x05\xa5\xdb\xa0\xba\x87\xaa\x78\x69\xdd\x3d\x33\x76\x1a\x6f\x71\xd7\x1a\x28\xbf\x61\xd1\x51\xb2\x35\x6c\xe8\x50\x59\x2c\x9d\x6e\x25\x2a\x52\x41\x65\xdb\xeb\x65\x39\xd5\xb5\xa8\xf4\xce\x1e\xe2\xdf\x09\x47\x97\xcc\x71\x10\x56\xe5\x1b\x38\x6c\x41\xe6\x20\x8f\x64\x13\xdb\x91\xef\xb3\xde\x4b\x3a\x0d\x63\x15\xb2\x50\x29\x10\x45\xc2\xaa\x64\xdf\x60\xf6\x6f\x43\x80\x42\xab\x9e\x0c\xcb\x27\x68\x8c\x0a\x1a\x13\x78\x5a\xe8\x94\x22\x74\x30\xa0\xa3\x11\xde\x29\x0e\x3e\xfa\xc8\xbe\x8c\xcc\xf9\x8d\x40\xb9\xd3\x52\x04\x0a\xcc\xdb\x7f\xf9\xeb\x93\xdd\xaf\x77\xb6\x52\x5a\x01\xd1\x2a\xb3\xaa\x6d\x91\xb5\x54\x0f\x92\xba\x57\x89\xd0\x62\xea\x6d\x87\xee\xdb\x06\x96\x39\xa9\xac\xe6\x36\x7b\xa0\x78\xe4\xf4\x97\x3c\xfa\xb3\x27\x17\x4d\xd2\x62\x65\x3f\x44\x60\x9c\x41\x2d\xe5\xb0\xfd\x73\x95\xbb\xa4\xd6\xab\x5a\xe9\x9d\x6e\x27\xf5\x8a\xfe\x5c\xb5\xe7\x87\x2b\x28\xbf\x8b\xda\xf3\x97\xef\xad\xf6\xdc\x74\xa3\xde\x52\x09\x40\x1f\xde\x0e\x9f\x28\x5c\x04\xc7\x22\x2b\x38\xca\x82\xc0\xc2\xc0\x16\xbb\xed\xd7\x80\xb2\x9d\x20\xcf\x7b\xe9\x31\xd9\x76\x46\x60\x2e\x7d\x03\xbd\xab\xf7\x73\xf9\x73\xb9\xc1\x61\xf0\xb5\xd9\x81\xbe\xb2\xcf\x59\xef\x7a\xd8\x6b\x60\x5d\x99\x83\x87\xcc\x90\x6e\xad\xe2\x17\x98\xcf\xb2\x03\xf6\xda\x2d\xfd\x5e\x48\x01\x7a\xbf\xec\x3b\x22\xf8\xca\x89\xa1\x03\xd7\x9f\xa1\xd6\x70\x52\xcf\x38\xb0\x9b\x83\x73\x18\xb9\xe1\x58\x35\x9f\xf6\xcc\xbb\x29\xa7\x21\x91\x79\xa0\x76\xda\x97\xb8\x4f\x52\x9c\x73\x3c\x14\x29\x16\xba\x61\xdc\x16\x67\x70\x8c\xb4\xa3\x37\xa1\xf1\x59\x0b\xa9\x3e\xe2\x90\x3d\xd6\x80\xd4\x00\x4a\x68\xc1\x09\x87\xf4\xdd\x2c\xb0\x01\xd2\xa4\x87\x0e\xa1\xe1\xd3\x4f\xd9\x23\xca\xd4\xfd\x64\x7d\x65\x08\xfc\x27\x9a\xec\x5d\x9c\x46\x75\xad\x3c\x4d\xb7\x7a\x47\xbc\x64\x1c\x5a\x24\x89\xb8\x5f\xdb\xaa\xe0\x30\x03\x27\x10\xee\xfd\xd6\x59\x50\x74\x6f\x88\xb6\x61\xe1\xa3\x76\x0f\x3e\x68\x07\x98\xce\x78\xc1\x2b\x6c\x3d\x49\x53\x27\x2c\xee\x06\x94\xfb\x5e\xfd\x68\x9d\x09\xc8\x3d\x9e\xc3\x59\x67\x45\x1d\xb6\x2e\x2c\x1d\x15\x6c\x0c\x1f\x40\xe4\xe5\x92\x8e\xc9\x80\x5a\x60\x76\x2b\x6e\xa2\x4f\x47\xe2\x6d\x79\xe1\xc2\xb4\x67\x2d\x89\xb4\x0f\x7c\x55\xfb\xe9\x34\x04\x70\xd8\x75\x91\x8c\xcb\x4b\xdf\x28\x47\x23\xf6\xa2\x12\x13\x79\xe7\x65\x69\xd9\x8c\x2b\xba\x2e\x58\x97\x61\x37\x62\xed\x2e\x38\x51\xa9\xaf\x7b\xe0\xdc\x22\xae\xe9\xb5\xfc\xe5\x97\x84\x4e\x87\x47\xf5\xa4\x36\xbe\x31\x8d\xa4\x81\x71\xad\x7b\xd3\xba\xf0\x7a\x16\x27\xae\xa7\x09\x99\x88\x4d\xa1\xf2\x5e\xbf\x91\xbf\x0c\x63\x43\x74\xa0\xc9\x41\xac\x2b\xd7\x5c\x84\x75\x34\x81\xf8\x2f\x99\xd8\x27\x6d\x5e\x8d\x01\x55\xc2\x26\xfb\xf4\xd3\xce\xd5\xd1\x2e\x3c\x8f\x93\x35\x70\xb6\x3b\x0c\xe8\x47\x23\x76\xac\xf0\xf6\x26\x6a\xcb\xa8\x0d\x2d\x01\xd7\x4c\xdc\x99\x2b\x20\x48\x92\xa4\x32\x64\xc9\xdc\x3e\x32\x55\x6a\xf0\x5c\x51\x33\x9e\x55\x4a\x6b\xc6\xc9\xc7\x74\xf8\x24\x0b\x36\xd7\x70\x09\xd3\xf6\x62\x0b\xf3\xd6\x5c\x7c\xee\xa9\xab\xb1\x48\xdb\xfd\xf1\x46\x7d\xc1\x2a\x78\x62\x97\xc1\x93\xe4\x3a\x88\xb0\x59\xe3\xc9\x7b\xf2\x4b\xa0\x3d\x11\x37\x2b\x3d\xc6\x4f\xa2\x19\x8c\x11\xd2\x70\xde\x36\xcd\x55\xa3\xa4\xcd\xd3\x15\x02\x50\x85\xb7\x9f\x78\xa1\xb4\xca\x08\x5e\xfe\x1e\xc5\xb5\x25\x4c\x25\xdb\x2d\x08\xb3\x74\x3d\x35\x36\x73\xb5\xbd\xaf\x34\x52\xa4\xc7\xac\x89\x83\x14\xde\xa8\x3c\xf1\xde\x60\x0c\x65\xcd\x9f\xcc\x25\xd6\xdb\x45\x39\x63\xa8\x4d\x5c\x08\xc8\x5d\xdb\x74\xdf\x9b\xf9\xf8\x43\x03\x70\xc1\xe1\x56\x69\x86\x2f\x91\x13\x0c\xa0\x13\x19\xed\x71\xa9\x26\x41\x7e\x1d\x1a\x5a\x51\xfb\x02\xe1\xc9\xc3\x4c\xab\x08\x14\x1a\x4d\x90\x2c\x74\xb9\x1d\x62\x1c\x95\x8d\x36\x55\x4e\x26\x66\x37\x8b\x6f\x13\x62\xa7\xbd\xab\x65\x95\x3d\xa4\x42\xcb\x2a\x92\xc2\x48\x78\x58\x58\xa8\x52\xc3\x33\x4b\xd8\x8d\x86\x75\x55\x64\x28\x1d\x1b\x59\x99\xf2\x9c\x9d\x55\xba\x6a\x27\xf7\x09\x07\x38\xbe\xb9\x22\x6e\x1b\x3c\x9a\xf6\xd1\xf6\xc7\x35\xdb\x8a\xb4\x6c\xbf\xe9\x35\x96\xec\xb1\xc2\xf1\x6d\x5e\xd8\xa3\x8b\xdf\x93\xe4\xc5\x8f\x78\xed\xd0\x75\x6d\x64\x9a\x72\xdb\x30\x3a\x21\xf1\xc3\x26\x7b\x8e\x77\x7a\x95\x09\xec\x5f\xd3\xac\xf6\x43\xd4\xd2\xee\xd7\x58\x7e\xb5\xd9\x4a\xa6\xad\xca\xd0\x27\x39\x84\x7e\x4e\xdb\x69\xcf\x29\x1c\xd8\x0d\xe6\x2c\x96\xd3\x0a\x38\x1f\x56\xad\xff\xe3\xdd\x6e\x36\x13\x07\xee\x7f\xac\x32\x3e\xae\xde\xff\x26\x6d\xfc\x7b\x55\xea\xe1\xfe\x9c\x38\x08\xba\x65\x40\xe9\x8d\xb5\x41\xb7\xde\xdd\x21\x0e\x5a\x6b\xea\x1e\x9b\xc3\x4e\xfd\xcb\x14\x3b\xdf\x2c\xbb\x6f\x2d\xd7\x02\x7d\xcf\xa6\x92\xe4\x26\x25\xb1\x87\xd5\x91\xd8\x4a\x88\xcf\x94\x96\xa6\xbd\x7c\x4f\x55\xfc\xd1\x88\x1d\x3a\x67\x75\x0d\x65\x82\x95\xd3\x65\x77\x94\x71\x50\x0a\xad\xd9\x9c\x97\xa8\xa0\xa5\x15\x3d\x88\x2c\xb8\xd6\x81\xba\x01\x8e\x6d\xae\x56\x65\x92\xaa\x44\xa6\x73\x2c\xd8\xba\x4e\x0e\x16\x10\x0c\x7b\x2b\x8a\x4b\x08\x12\xa4\x29\xd7\x30\x2e\xa2\xbd\x40\xfe\x6d\x2b\x24\x6c\x98\x21\x5c\xcd\xdc\x81\x8f\xa4\xa7\xaa\x22\x9f\x2d\x99\xac\xd7\x7d\x56\x09\xf0\x1a\xd0\x3a\xf4\x5a\xec\x8a\x9a\x4e\x0b\x0b\x83\xfa\xb0\x55\xf9\x41\xd6\x65\x0b\x65\x07\xd4\x3c\x6e\x45\x85\xa6\xe1\x44\xa1\xac\xab\x46\x59\x6b\x4b\x0d\x41\x51\x83\x98\x1b\x30\x1c\x1f\xbe\x47\xa3\x1c\x3d\xf8\x8e\xbd\xfe\x85\xed\xb1\x5e\x2f\x9c\x81\x14\x0d\xea\x50\x87\x78\x17\x4a\xd4\xb9\x86\xfe\x8c\x45\xf4\x67\xc9\x69\x63\xa9\xd9\x57\x1f\x08\x4c\xc2\x1f\x07\x01\x88\x43\xf2\x22\x50\x8b\xbb\x9a\x57\x82\x3f\x08\x17\xc1\x61\x1e\xf0\x32\x37\x45\x35\xd9\x7e\x78\x73\xc6\xb7\x64\xc2\x30\x03\xef\x70\x15\x47\xd7\x21\xbc\x80\x47\xaf\xc3\x17\xa7\xee\x31\xcc\x2b\xdd\x7d\xc6\x96\x7a\x69\x6f\x1b\xe6\x66\xfc\xe2\xe8\xf8\xf0\xea\xd0\x49\xef\x3f\x1c\x67\xef\x11\x13\x4c\x79\xef\x83\x91\x10\x34\xe0\x8f\xa0\x24\x98\xd2\x4c\x8e\x77\x42\x49\x78\x3f\x3e\xfe\xc3\x80\x25\x24\x60\x10\xfc\xd5\xac\xbd\x20\xcc\x2e\x74\x3a\xcc\x8e\x0b\x73\xaf\x23\xf6\xc5\x65\x3b\x17\x8b\x4a\x80\x93\x87\x9d\x8d\xfc\xff\x17\xef\x40\x1c\x1e\x59\xc2\x6b\xc6\xa6\x82\x47\xec\x4b\x51\x9f\x96\xa5\xa8\x7e\xbc\x7a\xfe\xcc\x0b\x8a\x53\x6f\xf7\xd7\x1d\xb9\xae\xbd\x01\x05\xbc\x86\x69\x51\x82\xc7\xc3\x60\x1b\xc5\x4f\xf3\x74\xcc\xa3\x1f\x5f\xd0\xb4\xb7\x9d\x0f\xb5\x25\x50\xab\x85\x9d\x96\xec\xf4\xe4\xeb\x7e\x40\xaf\x81\x50\xc2\xe4\xe2\x72\x21\x47\xc2\x56\xe7\x76\xc2\xae\x4d\xbd\x47\x38\x8e\xb0\x1c\x01\x6c\x4e\xe4\x43\x16\xa8\x20\xe5\xa8\x6b\x28\xb2\x1b\x73\x5d\xd4\xa2\xbe\xf2\x99\xb6\xac\x6b\x24\x74\xff\x17\x61\x25\xcb\xc9\xc8\x29\x77\x13\x5b\xd1\xdc\xda\x30\xee\x84\x51\x40\xf0\xd7\xa6\x4e\x7a\xc7\x56\x86\xd2\xd4\x02\xb8\x95\xe2\x96\xbc\x32\x9d\x9e\x7c\xcd\xc6\xcb\xe9\x0e\xf2\xde\x97\x62\xcc\x75\x2d\x79\xf9\xf9\xa5\x5a\xcc\xa4\xe9\xb8\x98\x93\xc7\x32\x79\x83\x59\xac\xe3\xd7\x02\x7c\x98\x83\xe2\x30\xd5\x49\x3e\xce\x1c\xca\xb9\x59\x62\x84\xbd\x4a\x5e\xa1\x7a\x9a\xad\x66\x6b\x26\xcd\x8f\x89\xaa\x32\xab\x4d\x89\xfb\xc0\xda\x46\x0c\x37\xbd\x1f\xde\x77\x9f\x7c\x00\xc2\x81\x7f\x81\x44\x7d\xa3\xcd\x6c\xd9\xfb\xa2\x10\xbc\xd3\xe1\xf9\x3e\xe8\x04\x76\x91\x3f\xf0\x09\xe8\xab\xd6\xe3\xc9\x87\xb9\x56\xfa\xc3\x6d\xc3\xbb\x05\x35\xf5\x7f\xec\x95\xd2\x8e\x35\x16\xf3\xdf\x79\x99\x8c\x78\x87\x0e\xab\xbe\x0d\x80\x32\x8d\x0b\x86\x67\xc9\x46\x23\x84\x58\x1f\x23\x26\xcc\x44\xd4\xd9\x2c\x50\x76\x76\x44\x87\x2c\x0e\xa6\x8a\x8c\x96\x50\xc3\x68\x13\x5e\xeb\x83\xad\xc5\x1f\xae\xde\xd1\x3a\xa4\x64\x44\xe4\x5d\xb5\xc1\x53\x7f\xac\x26\xb0\x1f\xab\xdc\x98\x24\x2d\xb6\xdf\x4b\x8a\x9b\xcb\xf7\xa1\xca\x21\x81\x42\x88\xe5\xd1\x60\x01\xb8\x3a\x9b\x67\x53\x53\xc8\xfd\x68\x3b\x1e\xb8\x4d\xa7\xe2\xe9\x04\x7c\xec\x01\xc7\xd3\xba\x08\x01\xe2\xab\xaf\xaa\x4f\xbe\x32\xe1\x7a\xea\x79\xb8\x84\xde\x9a\x19\xa2\xf8\x09\xd6\x69\x5a\x84\xb2\xf4\x47\x2e\x98\xde\x1e\xd8\x37\x07\x6c\x37\xdd\xd0\x80\xa9\x35\x27\x04\x1c\x6d\xe8\x84\xb9\x66\x73\xc3\xe5\x82\x77\x5b\x53\x5c\xaa\x41\x2c\x9c\x54\xfb\xf3\xf5\xe3\xb6\x4f\xb9\x94\x45\x51\x3c\xfd\x2d\xa1\xfe\xab\xd4\xf2\x4d\x94\x14\x65\x8f\x37\x54\x73\x4d\x43\x73\x1e\x2c\x3e\x84\x46\x36\x0f\x9b\x0d\xd0\x02\xef\x24\x09\x7d\x9f\x4b\xfd\x87\xb4\x58\xfc\x83\xf6\x8a\xe8\xaf\x7d\x15\xcd\xa7\x27\x5f\xd6\x1f\x08\xbe\xbe\x02\x00\xa3\x80\x8b\x84\x66\xdb\x16\x70\xa9\x50\xda\xda\xbd\x79\x0e\x6e\xa7\xef\x99\x2b\x47\xe3\xc8\xbe\xce\xad\x0f\x57\x2f\xbc\xf6\x04\xc6\xb6\x49\x83\x63\x9b\x3a\x8d\xc9\xb2\x79\xad\xa5\x8c\xe1\xda\xe5\xbd\xdd\x7a\xa8\xf4\x22\x55\x5e\x9a\xfa\xde\x23\x84\x7c\x17\xee\xde\xea\x37\x83\xb9\xa1\x2f\x2a\xf4\xfe\x02\x36\x29\x3c\xcb\xc0\x2c\x07\x99\x6d\xd0\xb8\x84\x1b\x3f\xf2\xaa\x78\x7f\x24\x1b\xb4\x5b\x2e\x0b\x44\x06\x2d\x6b\x59\x90\xe9\x4c\x64\x73\x0f\x16\x92\x20\xa0\x43\xf9\x8e\x69\x5a\xc0\x7f\x5b\x69\x59\x10\x14\x9d\x7b\x60\x0e\xe3\x67\x51\x4e\xa2\xcc\x52\x33\xf1\x5f\x4b\x5e\xb8\xcb\x1f\xb9\xae\xb0\x5a\xa7\x28\x1e\x84\xac\x74\x53\xd8\x7d\x3c\x02\x40\xb4\x1a\x4c\x87\x40\xe7\xd7\x5b\x12\xc1\xa5\xac\xe0\x99\x98\xa9\x02\x50\x52\x03\x6f\x39\xd6\x98\x68\xa1\x16\x68\x30\x1e\xb6\x03\x74\xad\x8b\x82\xb4\x59\x2d\x23\x41\xfe\x82\x45\x35\x9c\xcb\xac\x52\x5a\x4d\x6a\xb0\xf2\x72\x5f\x03\x91\x4f\xc5\x68\x51\xf0\x7a\xa2\x2a\x67\x30\xb4\xfb\x78\xf7\xab\x27\x5f\x8d\x68\x2d\x45\x63\x75\x90\x94\x2d\x86\x94\x29\x5a\x60\x76\xe5\x47\x83\xfb\x40\x99\x52\x7a\x61\x8d\x46\x0c\x41\x53\x03\x48\x09\x74\xdc\x4d\x53\xbc\x4f\x94\xb0\x69\x78\xd3\x26\x89\x4e\xc9\xcb\xdc\x11\xc1\xab\xe3\xe5\x8b\xc3\xa3\x13\x90\xc3\xf7\xda\x38\x80\xbb\x5f\x7f\xfd\xf5\xe8\x6e\x56\xcf\x8b\x1e\x2a\xda\x3d\x3f\xbc\xfa\xd1\x67\xeb\xcc\xf4\xf7\xd1\x73\x5e\xcf\xe0\xbf\xe7\xcf\x28\xeb\xe5\xab\x1f\xee\xcb\xf9\xe4\xf1\xe3\xc7\x23\x7d\x3b\xed\x91\x94\xc8\xf9\x6f\xb0\x78\xd1\xa6\x25\x7b\xad\xb6\x9b\x9b\xcb\x9c\xd7\x33\x13\x17\x37\xd0\xc4\xe8\xdb\xe9\x5e\x5c\x39\xe0\x65\x9b\xcb\xae\xf3\x2b\x4f\xcb\xb2\x54\x0c\x0d\x74\xbc\x6f\x89\x61\x74\xc1\x3f\x2d\x0d\xb9\xd7\x32\x73\x2d\xdb\xf6\x26\x96\xd6\xf4\x32\x61\x74\x79\x3b\x75\xb6\x8c\x74\x51\x8a\x1a\x14\x9a\x5b\x9a\x8e\x34\x13\xc7\x9d\x4a\x1a\x13\x52\xca\xe6\xd0\x24\xf5\x53\x41\x5d\xd4\xf7\x80\x6c\x92\xbc\x8b\x09\xdf\x01\xa0\xab\x71\x74\xe4\x5c\xb2\x15\x75\xd0\x6a\x41\x70\x7a\x9e\x29\x90\x7b\x51\xcb\x77\x5a\x63\xbd\xc7\x16\xca\x6c\x17\x43\x3e\x44\x59\x57\x6b\x34\x46\x1f\x86\xba\x8e\x1b\x26\x21\x74\x96\x90\x6a\x59\xbc\x00\x3f\xfd\x94\x79\x73\xb0\x89\xaa\x84\x9c\x96\xe7\x70\x21\xef\x05\x4d\xfe\x09\x18\xfc\x42\x70\x40\x24\xbc\x7c\xf5\x43\xd4\x98\xf4\x68\x43\xc6\xef\xd7\xb6\x9f\x7d\x64\x2c\xbd\xb7\x12\x80\x84\x1c\xfa\x3b\x73\xa3\xad\xa4\x5b\xce\xa6\x85\x1a\xf3\x42\xb3\xe7\x97\x87\x8b\x05\x88\x9a\x48\x2a\x7a\x54\x09\x43\x0a\xb9\xd7\xb4\xc4\x33\xc2\xd0\xfc\xde\xb2\xd4\x7c\x22\x7a\x6c\x51\xc9\x5b\x59\x88\xa9\xd0\x6c\x9b\x7c\x29\x83\xf9\xcc\x4a\x96\xb9\x5a\xe9\xbf\x33\xbe\x00\xb4\xa6\xcf\x46\xb0\xd3\x32\x28\xf3\xb9\xa5\x91\x2f\xa1\x94\x67\x2a\xe3\xc5\x53\x5b\x49\xe4\xa3\x7c\x59\x66\x7e\x85\x90\x7e\x3d\x36\xb4\xe1\x7f\xdb\x8c\x33\x44\x0c\xc5\x9d\xc8\x12\xe5\x36\x3d\xd1\xba\x3a\x78\x35\x7d\x0c\x6e\x99\x77\xe1\xff\x27\xf0\xff\x17\x9e\x3b\xd8\x58\xea\x76\xca\xa5\x78\x54\x49\x57\xf9\x8e\x77\xb6\xef\x01\xfb\x4d\x3d\xa9\xa0\x10\xda\x5e\x48\x4e\x2e\x5f\xfd\x00\x66\xa5\x16\xf8\x8d\x84\x9b\xa7\x27\xac\xe0\x19\x98\xa4\x4b\x2b\x9d\x83\x31\xaf\xc4\x12\x14\x71\x2e\x5f\xfd\x70\xe4\x72\x1c\x78\x81\x9c\xf7\xf4\x44\xef\x6e\x56\x20\xb8\x70\xbe\x2b\x26\xe4\xbb\xe2\x3d\x5c\x57\x10\x6c\x2b\xfb\x5f\xb2\xac\x45\x85\xd8\xc1\xb8\x16\x74\x24\x7c\x7c\xc0\xd2\x08\x06\x1b\x79\x16\x53\xb6\x3b\xba\x4e\x4f\xbc\x28\x12\xbd\xf2\xb9\xc2\xc1\x6d\xd9\xab\x1f\xd0\x86\x1e\x10\x66\xec\x2d\x71\x65\x92\xfd\xea\x64\xdf\xa6\x9c\x52\xac\xd8\x1c\x5c\xea\xa2\x85\x1f\x0c\x35\xf0\x5b\x64\xef\x55\x32\xb8\x1b\x3b\xc1\x2d\x99\xe6\x93\x5a\x9a\x2c\x6b\xb5\xe5\x6c\x07\x6b\x5e\x4d\x89\xc9\xb1\x6f\x30\xce\x2e\x16\x76\xe1\xcb\x8b\x53\x20\x0d\xfe\x08\x1a\xea\xdb\x29\x88\x77\xb6\x7b\xae\x07\x3d\xd3\x14\x93\x31\xf0\xdb\x92\x9c\xd4\x64\xf0\xef\xbf\x7b\xeb\x43\x1c\x65\x9a\xb5\xed\x5e\x2e\x6f\x7b\xce\x03\x4d\x3b\xeb\x50\x06\x13\xd4\xfb\x46\xdf\x4e\xbf\x35\x57\x00\x33\xee\xe6\x4e\xfd\xcd\x08\x42\x02\x25\xcf\xdb\x29\x19\xf8\x25\x4b\x9b\xc8\x4a\xe3\xa9\x80\x59\xc8\xc0\x15\x46\xc4\xc7\xed\xa4\xdc\x62\x40\x4c\x2b\x65\xc8\xed\x53\x61\xd4\x84\xee\xf2\x0c\xc7\x52\xe6\x58\x5e\x22\xf1\x26\xd7\x1a\xe1\x68\x98\x31\xa0\x6d\xb9\x83\xfb\x32\x33\x3d\x07\x63\x41\x84\xf3\x9c\xab\x1c\xa1\x4a\x40\x36\x2c\x74\xc6\x17\x02\x60\x8e\xed\x8e\x7b\xae\xf2\x65\x61\x6e\x71\x95\x74\x9a\x5a\xec\x7f\x19\x8a\x0a\x3c\x96\x21\xc5\xe0\x7b\x85\xd7\xd9\xec\xc7\x7a\x5e\xa0\xa3\x72\x76\xc0\x46\xaf\x3f\xea\x7d\xfa\xcd\xb7\xbf\x8c\xfc\xee\x3d\x81\xe2\x9d\xde\x6b\x36\xe3\x15\xcf\x6a\xc4\x6f\x81\x95\x38\x95\xb7\xc2\x7a\x0b\x34\x1b\xda\x34\xa4\xe1\x8a\xc6\x6f\x5a\x4a\x06\x88\x2b\xfe\xe2\x89\x55\x98\xcd\x24\x4b\x2d\xaa\x1a\x49\x4d\xad\xe0\x7c\x82\x72\x88\x64\xd9\x72\xb0\xec\xe5\xb8\x90\x59\xe3\x11\x03\xcb\x32\x9d\x22\xf7\x88\xfe\x6a\xa3\xeb\xca\x5e\x35\x31\xca\xde\xa3\x61\x1c\xd8\x41\x73\x3c\x80\x34\x9b\x52\xbc\x19\xca\x23\x48\xd2\xa0\xf8\xba\xae\x22\xb5\x23\x6c\x82\x2d\x1c\x96\xb4\x95\x33\xa0\xd0\x2e\x17\x77\xa0\xe7\x49\x01\x05\xd7\xf5\xa9\x0f\xb4\x9a\xfc\x36\x1d\x54\x39\x84\xaf\x7d\xca\xfc\x8d\xa9\xd3\x6b\x2f\x9b\x30\xaf\x19\x6a\xb9\x38\x93\xc4\xcc\xd6\x91\xca\xc5\x61\x8d\xc5\x05\x62\x1e\x60\xd6\xbe\xf8\x72\xcf\x1d\x2d\xa3\x11\xfb\xc8\x7d\xd0\x94\x1c\xb0\xde\xa7\xff\xb5\x54\xf5\x7e\xcf\x4b\x6c\x02\x3c\x08\x5b\xca\xdf\xa3\x52\x3e\x4d\x95\xc2\xe7\x8b\x7b\x0a\xf9\x3a\x2a\xa4\x97\x2a\xe4\x2f\x77\x4f\xfe\xb6\xdf\xdb\x07\x53\xd4\xae\x3d\xb0\x8f\xee\x21\xf1\xd1\xa1\xf7\xe9\x5f\xbe\xf8\xba\xb7\xa1\xd6\xbf\x3e\x8e\x6a\xfd\x26\x55\x6b\x71\x4f\xf7\xff\xfa\x24\x2a\xe3\xdb\x54\x19\xd3\xee\x32\x1a\x7c\x70\xdb\x8c\xc2\x89\x1c\xfc\x42\x31\x3c\x0a\x4e\xa8\x9b\x4f\x24\x9d\x07\xb0\x32\xf4\x72\x8c\x2b\xdc\x67\xe9\x53\xfa\xa8\xd0\x70\xe5\xe1\xca\xfa\x9c\xed\x62\x0a\x5b\x9c\x5f\xcc\xa1\x4d\x55\xa2\x25\xec\x3b\x4b\xbd\xef\x69\x01\xdb\x23\x12\xf7\xd6\xd0\x36\x51\xe6\xef\x40\xdf\x62\xa2\xa4\x51\xfa\x53\x2b\xb0\x9e\x35\x9c\xb8\xce\x2a\x89\x98\x17\xbc\xae\x79\x76\xa3\x9b\x3e\xb1\x3e\x7b\x8b\x79\xae\xcc\x7f\x78\xd1\x75\x04\x68\x98\xa2\x34\xec\xd0\xd2\x94\xdc\x3f\x60\x85\x76\x3f\x18\x19\x3c\xf3\x3d\x55\xd5\xf7\x28\x19\x83\x5b\x78\x8b\xcb\x84\xfa\x81\x69\xa7\x97\xb4\xd0\xc4\xd3\x47\x36\x2c\x3c\xad\xce\x91\x9e\xa9\xaa\xce\x64\x95\x2d\x65\xcd\x66\xa2\x58\x68\xb6\x10\xd5\x04\x5f\xa1\x11\x5f\x8b\x1c\x08\xdf\x94\x6a\x45\x6a\xac\xe2\x56\x54\xde\x47\xee\x68\x94\xa0\xe6\x7d\x26\x28\xb0\x58\x13\x49\xaf\xd1\xa9\xaa\xd4\x2c\x70\x49\x81\xbb\x4b\x4d\x6a\x0f\x8b\x30\x41\xc3\x5d\x51\xc9\x8c\xe5\x6a\xce\x64\xae\xa3\x4b\x06\x50\x5c\xd3\xb1\x86\xc5\x56\x40\xaa\x61\xa0\xf6\x63\xef\xa0\xc8\xe6\x04\x72\x8c\x36\xd7\xd8\x47\x99\x25\xaa\x4b\x9b\x5e\xcf\x64\x4d\x77\x14\xd0\x90\x15\x5a\x54\xb7\x02\xd4\x27\x00\x3b\xc1\x42\x46\xc0\x71\x0b\x4b\x00\x44\x39\x0b\xa5\x2a\x06\x2b\x56\xd6\xd6\x4f\x4c\x24\xa7\x29\xf3\x3e\xe3\x73\x55\x4e\xd9\x9c\x97\x6b\x53\x1c\x0a\x5d\xfa\x74\x5e\x69\xf6\xcd\xb8\x8a\x4c\x46\x11\x50\xb2\x16\x15\x37\xc3\xbf\x2a\x24\x48\xc1\x79\xa5\x87\x01\xf7\x48\x98\x16\xe0\x9c\x16\xbc\x2f\xa2\xf5\xe7\xfb\xf8\x71\x43\xf8\xaf\x0e\x66\xf8\x2a\x12\x9c\x35\x79\xdd\xc6\x22\x75\x5f\x78\x38\x79\x06\xc6\xca\xdc\x42\x5e\xcb\x91\xa6\x20\xd9\xa7\x9f\x46\x99\xac\xf0\xc9\xd0\x81\x44\x82\xa1\x89\xbc\xb2\xf7\xd8\xab\x93\x7f\x5c\xbd\x39\x3b\x3f\x3e\xf1\x74\xad\x91\xf4\x55\x20\x9c\xda\x8f\x44\x07\xb1\x40\xb5\x29\x1e\x74\x59\xcc\x5d\xc7\xb4\xf8\xe4\x4e\x64\xf0\xc8\x7d\x52\xde\xca\x4a\x95\xc8\xc4\xf2\xf2\xa5\x16\xc7\xe7\xcf\x03\x4f\x87\xf8\x16\x4b\xc5\x00\xbf\xec\x78\x5e\xfb\x83\xa6\x67\x27\x80\xd4\x7c\xe8\x98\xb3\x10\x70\xed\xbe\xb1\xb0\xd8\x37\x1d\xe3\xd0\x65\x5d\x11\xde\x87\xa8\x01\xf7\x52\xad\xe8\xf2\x68\x65\x6e\x71\xbf\x40\xe6\x16\x07\x79\xb6\xf1\xe8\xf2\x32\x74\x45\x81\x17\x7c\x9e\x65\x62\x51\x5b\x2b\x7f\x78\xbd\xb5\x78\x64\xb2\x64\xcb\x52\xd6\x80\x86\xf1\xd1\xe2\xee\xa3\xa1\x5b\xc0\x52\xbf\x2c\x65\x5d\x08\xed\xc1\x32\xcd\x78\xf0\x52\xce\xc1\x86\xed\xb4\x26\xc4\xb2\x23\xb5\x2c\x03\x2f\x6e\x63\x50\xcf\x39\x9d\xf3\xa9\x38\x5f\xd6\x91\x83\xb7\x20\xea\xb2\x90\x99\x48\xc6\xfc\x24\xf3\x7a\x16\xc6\xdc\x3d\x2d\xc4\x5d\x2b\xe0\x87\x4a\x2d\x17\x51\xe8\x79\x95\xcb\x92\x17\x8d\x88\x4c\x15\xcb\x79\xb3\x8d\x18\xa8\x7d\xc0\x24\xaa\x62\x82\xe5\xaf\xe2\x90\x17\x4a\xcb\x5a\xde\x8a\x38\xf4\x72\x56\xc9\xf2\x26\x0e\x3b\x13\x53\xde\x4e\x79\x6e\xba\xe8\x83\xa6\x95\xcc\x2f\xc2\x3a\x28\xe0\xa4\xcc\x5b\x61\x97\x0b\x5e\xb6\x03\x6b\x5e\xd5\x71\xe8\x11\xf4\x2b\x15\xd6\x2a\x15\x83\xdb\x05\x53\x78\x5c\xf6\x44\x95\xf5\x4f\x42\x4e\x67\x41\x98\xa1\xad\x47\x05\x9f\x2f\xe2\xa0\x1f\x1b\xc9\xd4\x82\x67\xb2\x5e\x07\x01\xf1\x30\xa8\x6a\x31\xe3\xe1\x54\xd4\x7c\x7c\x29\x7f\x0b\xc6\x6e\x25\x73\xb5\x0a\x12\xfc\x06\x6c\x4d\xf0\xad\xd4\xdc\x7e\xe1\x45\xfd\xf2\xd5\x0f\x83\x4a\x14\xbc\x26\x97\x07\xb8\x19\x4c\x3f\x64\x51\x9c\x37\x1b\x34\x29\x94\xca\x5b\xa1\xba\x56\x8b\x44\x60\xa5\x6e\xc4\x31\xd7\x33\x30\xcc\x49\x45\xa8\xc9\x24\x5a\xf3\x18\xf3\xdc\x9c\x49\x85\x74\xce\x0d\x7d\x4c\x47\x1d\xc1\x2e\x40\x31\xd1\x67\x9f\xa5\xce\x9f\x05\x5a\x4c\xde\x8a\x32\x57\xd5\x80\x14\xd1\x32\x0a\xee\x33\x31\xdd\x63\x3f\x89\xf1\x8d\xac\x53\x99\x6f\xc4\x9a\xe9\x7a\x5d\x08\xeb\x4f\x7d\x6a\x2a\xe4\xa5\x06\x4d\xc6\xe3\x25\x6e\xef\x24\x77\xe6\xb3\x51\x5d\x56\x73\xee\x1a\x3f\xaf\xfb\x34\xf0\xc5\x9a\x65\x7c\x2e\x8a\x23\xae\x45\x0e\x55\x98\xf2\xb0\x4d\x57\xa9\xba\x02\x16\x0f\x8b\xfa\x4f\xb1\xde\xb6\xfd\xb9\x11\xeb\xc8\x20\x86\xba\xff\xb9\x89\x80\x4b\xd7\x61\xbd\xfd\x78\x67\x58\xab\x97\x8b\x85\xa8\x4c\x9d\xdb\x3b\x14\xeb\x39\xe3\xdd\x98\xe3\x21\x8d\x08\xdf\x23\x62\xe5\xe6\x7c\x8d\x60\x2f\x0b\xae\xc9\x63\xbe\xeb\xea\x78\xcd\x78\x0e\x90\xa1\x0b\x51\x59\xe7\xa7\xc0\x50\xa8\x09\x4d\x86\x4d\xac\x3d\x45\xb5\x21\x60\x19\x8f\x43\xd0\xeb\xb3\xde\x5c\x9b\xff\x9f\xab\xdf\xcc\x9f\x73\x34\x8e\x1f\xb1\x97\xf0\xcc\x8a\x82\xe5\xe1\x8d\x58\x6b\x36\x13\x95\x00\xa5\x1c\x90\x62\xe0\x73\x71\x29\x8b\x02\x30\xab\x06\xb2\x64\x85\x52\x0b\x72\x29\x7d\x7a\xf2\x77\x36\x55\x78\x99\xe7\xe5\x16\x3c\xaf\x4d\x64\x29\x6b\x01\xa9\xfa\x1e\xa9\xa5\x66\xc0\x2e\xd5\x42\x33\x75\x4b\xcf\x81\x86\x73\x82\x1e\x5a\xa7\x25\xac\x56\x6a\xb8\x15\x34\x66\xbb\x79\x3a\xec\x38\x8c\x96\xd8\x89\x23\x4e\x97\x1b\x8b\x54\x22\x13\xe5\xf0\x5b\x1a\xc5\xbe\x6e\xaf\x01\x28\xf5\x17\x00\xf4\x6f\xa5\x55\x0b\x50\x61\x00\xdb\xa7\x9d\xe0\x50\x54\x25\x68\x89\x5b\x64\x0f\x07\xe4\x84\x6b\x94\x65\x5a\xb3\x55\x25\x11\x97\x93\xde\x1f\x51\x54\xe2\x56\x39\xa2\x14\x81\x19\x97\xf3\xb3\x58\xa8\xa9\xcc\x78\x61\x98\x08\x36\x5b\x2f\x66\xa2\xd4\x3b\x7d\xc3\x52\x3a\x85\x50\x60\x59\x4b\x76\x7d\x74\x79\x69\x8d\x83\x87\xcd\x66\x5f\x37\xf9\xce\xd0\x47\x70\x78\x9e\xaf\x31\xc4\x3e\xc4\x5f\xd7\x6a\xf1\x9c\x57\x53\x59\x5e\x0f\x53\x5e\xf7\xe3\xac\x18\xe4\xf2\xee\x3e\x5e\xdc\x5d\xa7\x2f\x5e\x88\x16\x09\xba\xb0\xd8\x7f\xab\x3d\x5c\xcf\x58\x2e\xe7\xa2\xd4\xa0\x66\xcc\x51\x27\xb8\x71\x2b\x73\x4a\xa5\x97\x26\x2b\x7a\xb3\x0f\x1c\x59\xf7\x99\xd4\x47\x4b\x5d\xab\x79\xec\xed\x97\x20\xc5\xed\x1d\xaa\x77\x2b\x48\x15\x2c\x0f\x38\xa6\x80\x55\xda\x61\x19\x2f\x0a\xdc\x12\x4c\x4b\x82\x88\xa4\x77\xdf\x99\x2a\x9c\x94\xcb\x6a\xf8\xda\xab\xa4\x53\xf6\xf4\xe0\x2e\xf0\xbe\xfe\x2b\x1a\x07\xc4\xb2\x5e\x14\x1a\x83\xbd\xe6\xda\x3b\xf9\x64\xf8\x52\x82\x4a\xd7\x39\xaf\x39\xb3\xaf\xd1\x6b\x50\xc5\xc1\xc2\x2c\xea\xeb\x58\xa2\x07\x7d\x33\x19\xc8\x8c\x19\xba\x32\x76\x28\xc3\xbc\x96\x19\xdb\x3e\x45\x3d\xd6\xb2\x57\xb3\x4a\x2c\x2a\xd4\xe6\xd8\xd9\x8b\x1f\xa8\x57\xab\xd5\x50\xad\xb8\x5e\xc0\x93\x27\x5c\xea\x87\x8b\xd9\x62\xf4\x8f\xcb\xcb\x37\x4f\x65\x51\x8b\xea\xcd\xc9\x2d\x37\xb3\xf3\xe6\x68\x26\x78\xfd\xe6\x72\x26\x44\xed\xcb\xa0\x22\xea\x99\xb9\xaa\x19\xbe\x74\x98\xa9\xe1\xf2\x66\xf4\xe4\xf1\xe3\xbf\x8d\x76\x77\x47\x4f\xfe\x3a\x5a\x16\xb5\xe1\xee\xc4\xe0\x4e\xeb\x41\xa6\xf5\x00\x3b\x23\x55\x39\x8a\x35\x12\x00\x9f\xb9\x64\xff\xb8\xbc\x64\x30\xdc\x86\xa5\xb4\xd7\x30\x1e\xbc\xc6\x99\x6e\xbb\x32\xf0\xf6\x66\x67\xc9\xbe\x3c\x15\x26\x0f\xa8\xc4\x4c\x41\x94\x5d\xb1\x5c\xea\x6c\xa9\x4d\x47\x18\x1f\xab\x65\xcd\x66\xe6\x46\x1d\x69\xcc\xd1\x24\x55\x4b\x5d\xb3\x97\x17\xcf\x34\x9b\x2b\x74\xfd\xa5\xaa\x15\xaf\xf2\x21\xb8\xa7\xfb\xcb\x93\xdd\xdd\xaf\xbe\x7e\xbc\x6b\x05\x84\x52\x9f\x80\x52\xf7\x01\x8b\xc1\xb7\xbd\x18\x20\x00\xc2\x0f\x85\x04\x21\x3e\xbe\xd5\xf4\xa1\xc2\x9a\x88\x2a\x3d\x27\xb2\x21\x77\xed\xf1\x72\xb7\xaf\x87\x71\x5d\x24\x73\xf0\xee\xf2\x1f\x59\x78\xfe\x47\x2d\x42\xdb\xc4\x1a\x40\x60\x3f\xc0\xb9\x68\x90\xc3\x12\xc0\x3d\x1a\x0d\xc4\xf2\x3f\x67\xbd\xc5\x1d\x0a\xf4\x5e\x54\x02\x1f\xb3\xad\x21\x10\x44\x31\xbd\x9c\x98\x93\x75\x02\x3a\x9b\x58\xac\xbd\x3f\x34\x64\x52\xdb\x01\x48\xfb\xb0\xae\xe4\x7c\xdb\x2b\x0b\xac\x50\xdd\x52\xe6\x40\x0e\xd8\x01\x6a\xd5\xdb\xe7\x9f\x8f\x77\xc9\xfd\xf4\x68\x64\x4e\x41\x60\x07\x26\xaa\x9a\xf7\xc0\xf5\x05\x6a\x3f\x59\xb8\x48\xe1\xdc\xec\xd1\x19\xea\xc9\x70\xc6\x17\xb2\x46\x8a\x45\x13\x3d\xe6\xf9\x2b\x38\x84\x05\x56\x7c\xc6\xe7\xe2\x05\xc0\x29\x97\xec\x80\x8d\xfe\xcf\xf6\x77\x7b\x2b\x38\x7e\x7f\x9f\xab\xdf\x7e\x57\x3b\xaf\x0f\x07\xff\x1b\x64\xef\x28\xa4\xf1\x54\xcf\x56\x43\x80\x05\x80\xa9\xce\x99\x16\x73\x99\xa9\x02\x70\xa2\xa9\x3a\x4f\xee\x7e\x92\xf5\xec\xd2\x26\x08\x2a\xdd\xff\x59\x7f\xf6\xf1\x28\x30\x41\xab\xca\xa0\x75\xda\x01\x68\x34\x22\x1d\x02\x47\x33\xf6\xa9\xaa\xce\xf8\x59\xc3\x91\x6a\x23\xc1\x29\x9e\xf9\xeb\x46\xaa\x20\xd9\x8f\x70\x6c\x19\x46\xd9\x35\x25\xbe\x36\xc7\x6e\x6c\x03\x23\xda\x66\x07\x3a\xd7\x65\x33\x21\xad\xcb\x0e\x5c\x36\x7c\xf9\x49\x66\x89\x54\x75\x5b\xda\xa4\xa5\x43\x0e\xa4\x09\x74\x47\xdf\x27\x7a\xc8\x8e\x65\x0e\x34\x7c\x2e\x78\xc9\x3e\xd1\xdf\x01\x3a\x0b\x76\x0e\xd8\x53\xf9\x9b\x70\xd5\x61\xd3\x7d\xaf\x09\x9f\xe5\x6d\x34\x70\xdf\x27\x96\xd8\xff\xfc\x91\xa3\x7b\x84\xe3\x73\xdf\x6d\x24\xcd\xff\x1b\xb8\x70\x88\xd6\xe6\xde\xbf\xbd\x7b\xdf\xf0\x76\xec\xa7\xc4\x08\x13\x5f\x71\xcf\x40\x13\xf0\x4c\x63\xa4\x49\xff\x30\x1e\x6a\x42\x8e\x81\xb8\x07\x0f\x76\x94\x69\xd3\x70\x7f\x74\x19\x0f\xe9\x43\xc8\xcc\x90\x7d\x64\x28\xf6\x55\xb5\x66\x1f\x7d\xa2\xf7\xd8\x27\xfa\x23\xe7\x45\x25\x18\x7e\x64\x5c\x2b\x01\x3a\x71\xdb\xf7\x12\xa5\x3e\xeb\xf5\x1e\x3e\x0d\xa7\xfa\x8c\x9f\xbd\xcf\xf0\x07\x74\xea\x01\x83\x19\x53\xb5\xee\x45\x7b\x7d\xc6\xcf\xc0\x18\x08\x18\x2e\x04\x9b\x24\xd8\x7f\xb2\x5a\x00\x44\x27\xc3\xd8\xc7\x6b\x38\x1c\xb0\x07\x77\xdd\xd2\xd1\xf7\xec\x7f\x44\x86\x1f\x36\x08\x4d\xca\xbd\x61\x24\x6c\xd2\x3f\x67\x38\x5a\x27\xf8\x3b\x0c\x00\x6c\x78\xe0\x53\xcf\x27\xdb\xbd\x41\x6f\x87\x7d\xcb\x06\x0d\x84\x84\xc4\x01\xd4\x24\x9d\x2d\x90\xaf\x0d\xc7\xfb\xb0\x16\xba\x46\x0a\x1a\xd7\x93\xa2\xd7\x0f\xa9\x68\xf3\x1e\xc2\xea\x90\x8c\xc4\xf5\x75\xe4\xeb\x18\xb4\xd6\x93\x63\x27\x8f\x18\x4b\xaf\xa5\xd9\x95\xad\xfa\x9b\x2d\x80\xbd\xbb\xb1\xe6\x18\x43\x4d\xea\xa7\x20\x2a\x78\x40\xc1\x76\xf1\xdd\x57\xba\x7f\x23\xe8\xe0\x0d\x41\xa8\x1d\x07\xf9\xfb\xfb\xb9\x75\x8e\x81\x80\x50\xb9\xe0\x05\x5e\xee\xea\x59\x43\xe0\x4d\xb6\x95\x94\x0f\x6e\x2b\xa8\x20\xa3\x03\x95\x7b\x73\xc9\x94\xda\xa9\x1f\xd3\x9b\xb5\xf8\xaf\xa5\xbc\xe5\x05\x59\x90\xd6\xf6\xfa\x0f\xaf\x44\xee\xb2\x38\x15\x25\x08\x4b\x40\x04\x04\xaf\x5c\xd5\x00\xf4\xe4\xd1\xb6\x14\x6d\x1c\x6b\x36\x5e\x0f\x40\x6a\xa4\xed\x76\xd5\xd6\x9c\x58\x8b\x6c\x59\x19\x52\x02\x86\x67\xe0\xff\x03\x0c\xf7\xc0\xc8\xd7\x5c\x2b\xc9\x1a\x28\x00\x3a\x00\x0c\x2c\xeb\xad\x44\x91\xa5\x16\x07\xb9\x5c\xa6\xe6\x0b\x5e\x49\x6d\xce\x88\x53\xe8\x14\xa8\xe1\x2f\x49\x5e\x75\x7c\xf2\x0a\x55\xa5\x2e\x2f\x62\x7f\x3f\x11\x80\x22\x8c\xcf\xb1\xbf\xb8\x9b\x5e\x3c\x55\x15\xcc\x81\xde\x86\x41\x88\xdc\xfd\xe2\x8b\x44\x65\x0d\x66\xbd\x2d\x07\xda\x28\x81\x94\x53\x54\x41\xb8\x03\xda\xd2\x8e\x53\x92\x25\x0b\x0b\xb6\xeb\xf9\x11\x06\x36\xcf\x69\x97\x6f\xe7\x21\xc0\xe0\xae\x26\x4b\x3c\xb1\xd0\xd7\xae\x94\x08\xa4\x3c\x48\xd9\x32\x5e\xb2\xd7\xc6\xc6\x1d\xee\xc0\x77\x24\x20\x6f\x86\xbe\x81\x5b\x35\xff\x2c\x14\x8c\xd2\xe7\x07\xc1\xd0\x7c\x4e\xe2\x22\x5e\x07\x5c\xa7\xef\xa4\x39\xec\xf7\x7a\x9d\xc5\x24\x44\x2c\x2e\x6f\x3f\xe8\x79\x42\xd8\xe2\x5c\x9a\xb1\x78\xa2\xbc\x92\x44\x88\xd4\x65\xf5\x6c\x7c\xf5\xbf\xff\xee\xf0\xd3\xde\xc6\xaf\xc6\x3a\xb0\x5f\x31\xf3\xed\xd0\x12\x70\xf0\xd1\x76\x0a\x5e\xd1\x18\x3b\x9d\x78\x49\x5c\x20\x2c\x63\x1c\x24\xa8\xbd\x1e\xdb\x46\xe3\x6b\x52\x24\xea\x93\x89\x42\x85\x28\x50\x20\x76\x6d\x30\xa6\x56\xcc\x03\x0e\x39\xde\xe5\x1d\x17\x2d\x69\x49\x9e\xad\xe3\x8d\x11\x38\xe8\xa3\xbd\x80\x6f\x78\x98\xb6\x79\xe4\xb9\x55\x67\xdf\x6b\x35\xd2\xb0\x87\x2d\xff\x77\x5c\xfc\xdd\x88\x9f\xef\xb3\x54\xa3\x1d\x98\x16\xd0\x79\xea\x1f\x92\xec\xd6\xba\x0b\x37\xd9\xc6\x63\x20\xb1\x4b\x1f\xb2\xae\xe3\xf2\x13\xcb\x3b\xda\xd5\x78\x27\x03\x35\xed\x42\xf1\x3a\x38\x3b\x83\x68\xd6\xcb\xb4\x06\x07\x80\xbd\xa6\xa9\x51\xf7\x50\x40\xfe\xa1\x16\x75\x7b\x96\xc2\x1d\x98\x46\x2d\x81\xf8\xa0\x23\x76\x92\x5a\xe6\x49\x08\xc7\xf1\x54\xa1\xd1\x45\xdf\x79\x75\xab\xf9\xd4\xc9\x3f\xd4\x5c\x82\x78\x44\x56\x2c\x2b\x94\x39\x38\xf8\x14\x7c\x73\xdc\x08\xb1\x60\x1c\x55\x33\x0a\xa9\xc1\xe4\x73\x0b\x04\x9b\x26\x15\xe9\x9c\x0c\x40\x91\xca\x94\x37\xc4\x43\xd9\x14\x57\x8b\xfc\xc8\x14\x75\x65\xaa\xa1\x47\xdf\x4a\xf0\xe0\xad\x95\xeb\xf0\xe9\xb6\x8a\xde\x55\xfd\x87\x98\x8f\x45\xf0\xe8\x38\x0b\xd2\xc9\xf9\x34\xf8\x40\xef\x01\xf6\xf3\x46\xac\xa7\xa2\x8c\x1e\x15\x83\xe7\xd5\xb9\xa8\x83\x96\xc0\x2e\x0e\x9e\xce\xd4\xb2\x0a\x5f\x95\xeb\x8a\x67\x41\xde\x95\x6d\xaa\x55\xbc\xee\x18\xda\x8c\x97\x4e\xe7\xd8\x59\x64\x22\x33\x31\xe3\xda\x63\x1a\x2c\x96\xd5\xc2\x0c\x26\xd7\xa6\xb0\xeb\xe6\xd8\x5d\x33\x71\x07\xef\xee\xc0\x70\x5c\xcf\x45\xb9\x94\xb5\x98\x5f\xdb\xa9\x43\x4b\x1c\xd4\x6c\xae\x35\x4c\x1f\xb0\x27\x7c\x4a\x93\x71\xab\x64\x4e\x94\x8b\xe6\xc2\x19\xec\xc3\x48\x60\x79\xb6\x4b\xfd\xd6\xe4\xed\xec\x7b\x93\x1d\x34\xd4\x79\xf3\x86\x4c\x72\x3c\x95\x33\x6c\x4a\x55\xc3\xae\x46\xc4\xf8\x9a\x4f\x43\xdb\xf7\x80\xc4\x79\x80\xdd\x58\xa8\x18\x58\x2f\x90\x14\x1f\xa4\xe3\x80\x20\x7d\x70\x70\x4d\xb2\x5e\x62\x78\x26\x04\x60\x82\xd6\xe0\xa4\xed\x3f\xb4\xe6\x93\x71\x8f\x5f\xd7\x7c\xea\xae\xe0\x8f\x1a\x20\xe5\x09\x0f\x75\xef\x83\x83\xf1\x09\xf9\x92\x00\xed\x79\x07\x21\xc2\xa7\xa8\x11\xb7\xd4\x35\x2b\xc9\x3c\x1e\x66\xea\xda\x56\x7f\xcd\x4a\xd3\x03\x2d\x58\x27\x92\x06\x5e\xae\x60\x3c\x83\xbb\x55\x64\x8c\xdb\xb0\x41\xec\xe8\x40\x83\x31\xe9\x1a\x89\x74\x07\x8f\xac\x79\xb0\x16\xb5\xb5\xac\x0f\x7a\xa1\x2a\x76\xbd\xb1\xf6\xeb\xb6\x01\xf1\x23\x7b\x3f\xb9\x6f\xdc\x0f\x58\x0f\x4f\x58\x90\x6d\xd3\x3a\x84\x87\xd4\x0d\xf9\x3a\xf0\x4a\x36\x37\xd2\x61\x1f\x90\x76\x34\x78\x67\xb9\xfe\x17\x2e\xf8\x3d\x36\x1c\x0e\xdf\x5e\x0f\xd9\x8b\x42\x18\x82\x77\x2b\xb5\xac\x93\x2e\x85\x5d\xbd\x83\xa0\xa2\x81\x16\x26\xa6\x14\x15\x68\x43\x22\x7f\x63\xe1\x08\x2a\xd4\x86\x69\x0e\xd2\xdb\x2e\x2f\x09\xcb\xc5\xa2\x12\x5a\x93\xe2\xce\x49\x8e\xaf\x8e\x3f\x61\x22\xc3\x60\x11\x50\x53\x16\x27\x00\xab\xa9\xe4\xac\xb7\xbd\x46\x5f\x37\xf2\x22\x7e\x29\x09\x96\x74\x38\xf9\x73\x5e\xf2\x29\x5e\x66\xc0\xa6\x1e\xdd\x6e\xd0\x55\xa2\x54\x2b\xb6\x56\xcb\xca\xa2\x6f\xca\xb1\x2c\xcc\xcd\xa5\x56\x6c\xba\xe4\x15\x2f\x6b\x41\x2f\x76\x25\x2d\x2b\x28\x03\x0f\x18\x32\xa1\xa8\x0c\x4f\x66\x2f\x5a\xc5\xda\xab\x98\x9a\x6b\xdc\x72\x51\xc8\x0c\xa1\x5c\xec\xbb\x12\x94\xe0\x7c\xe6\xa0\x82\x12\xbc\x25\xa9\x92\x17\xb8\x9f\x9a\x62\x8a\x00\x08\x87\xf8\xaf\xd6\xb3\x4e\x1c\xeb\x17\x65\x7a\xa5\x01\x1e\x38\x24\x26\x04\x22\x6c\xbf\x21\x12\x73\xbe\x58\xc0\x33\x53\xa5\xe6\x31\x0f\x2a\x11\xd3\x08\xc5\x79\x7d\xf2\x5f\x4a\x8a\xab\xe8\x12\xf5\x8e\xcf\x01\x77\x0b\xb2\x1d\xfc\xeb\x5f\x73\x78\xbb\xbd\x40\x6d\x19\xbd\xe0\xe0\xaa\xe6\x73\xf6\x73\x4f\xcc\x7f\xee\xbd\x7d\x8b\x4f\x95\x88\xa2\xf1\x1f\x97\xff\x68\xf5\x3d\x58\x6d\x11\x60\x0a\xf1\x2c\x47\x76\x41\x18\x7a\x8e\x7c\x49\x40\xb9\x41\xc4\x80\xe1\xb1\x80\xc6\x8c\x8e\x17\xd1\xd0\x05\x20\x1a\x45\xa9\x23\x37\x29\x76\x0a\x9c\x0d\x23\x96\x1a\xa8\xcf\x5e\x01\x8a\x07\x3a\x52\x42\xbd\x50\x30\xdd\x31\x4b\x12\xcd\x3c\x1d\x7e\xc9\xd0\x66\xf9\xc9\x7a\x42\x9a\x4b\xb0\xd0\x91\x3a\xe0\x63\x6a\xa5\xd8\x7c\x99\xcd\x42\x43\x68\x9c\x21\x72\xd2\x83\x6a\xb7\xd3\x0a\x6d\xe5\x6c\x1b\x18\x2f\x40\x43\xb3\x96\xb7\x02\x41\xec\x90\x3d\x40\x85\x07\x67\x63\x87\x3e\xc0\xc4\x0a\x2d\x8b\xb5\xb7\xa2\xce\x54\x79\xab\x8a\x65\x6d\x71\xef\xc2\x87\xd9\x2f\xb2\x21\xb9\x85\x94\x6a\xb4\x12\x63\x0f\x3e\x32\x32\x8c\xd6\x28\x83\x29\x19\xfd\x05\xff\x0e\x6c\x7f\x07\x99\xaa\xc4\x20\x53\xa5\xe1\x12\xd0\xdd\x2c\x9a\x72\x02\xff\x01\x64\x65\x70\x37\x8f\x3d\x60\x82\x53\xcd\xc1\xa2\x52\x13\x59\xc4\x8e\x2f\x27\xaa\xac\x07\x13\x9e\x75\x84\x0e\x74\x95\x75\xc4\x2c\x2b\xd9\x11\x83\xe4\xad\x23\xd2\x0c\x5a\xec\x9d\x53\x6a\xb3\x5c\x07\xd3\x62\xbd\x68\x99\xa2\xba\x17\xaa\x2e\x0b\x54\x2b\xe2\x74\x5a\x8f\x66\x5b\xbe\xf0\xbb\x0b\x39\xd1\x9e\x09\x1d\x64\x08\xc8\xd3\xdb\x63\x8f\xfb\xf8\x64\x87\x46\xcc\x18\x8b\x3e\x1c\x35\xc4\xfa\x40\x02\xaf\xee\xc8\x33\x93\x79\x2e\xca\x8e\x48\x12\xa9\x76\xc4\xde\x88\x35\x6a\x87\x2f\xeb\x46\x9d\x05\x1f\x8b\x22\x0e\xaa\x54\x21\x72\x41\xfa\xf2\xaa\xb4\x91\x66\xd1\xcb\x7c\x2a\x6a\xe6\xfc\xc6\x68\x97\x87\x2f\x6b\x65\x81\xa6\xe2\xd2\xac\xa3\xf8\x28\x50\xdc\x2d\x78\x99\x37\x43\x67\x5c\x2f\xd4\x62\xb9\x68\xb4\x50\xdc\x36\x5b\x38\x57\x39\x6f\x06\x99\xcb\x7c\x21\x4b\x91\x08\x46\x0c\x08\x33\xb4\x71\xa4\xaa\xa4\x28\x71\x11\xc7\x11\x81\xc9\x7e\x23\xc2\x9c\x8b\xcd\x66\x57\x82\xe7\x86\x7b\x69\x86\xa2\x61\x6a\x1c\x6a\x31\x1e\x1b\xa1\xaa\xaa\xe3\x10\x20\xd2\x73\x7e\x97\x0a\x95\x65\x22\xb4\x54\xab\x44\x28\xb8\xb7\xf7\xf3\xf7\xcc\x10\x96\x0b\x31\x35\x54\x38\x35\x89\xb5\x9a\xcb\x2c\x2e\x66\xbc\xd4\x8d\x8e\x15\xf2\x56\x34\xbb\x5a\x88\x5b\x5e\x86\x35\x1d\x57\x7c\x3a\xe0\x65\x3e\x38\x36\xa7\x53\xa2\xae\xdc\xec\x1a\x00\xee\x88\xcb\x9a\x56\x7c\x3c\xf6\xe3\x03\xf0\x99\x05\x0a\x56\x67\x32\x59\x12\xcf\x0c\xbd\x34\x0b\x56\x94\x79\xd0\x0a\x5a\x7e\xaa\xc8\xd4\x32\x11\x0a\x67\x4a\x2b\x54\x2f\x78\xd9\x0c\x04\x18\x83\xe6\x56\x85\xfd\x31\x16\xf9\xb8\x31\x3a\xa2\xaa\x54\x35\x17\x5a\xf3\x69\x63\x94\x26\x85\x5a\xd5\x2a\xb1\xfb\x8a\x76\x29\x6a\x55\x36\x2a\x5c\x98\x9b\x17\xf8\x32\x8e\xb7\xea\x2a\xd1\xbb\x4a\xad\x12\xbd\xab\xd4\xaa\xdd\x3b\x2d\x6a\x2d\x7f\x83\x96\xc2\x8d\xd3\xbf\xcd\xc7\x64\xed\x2d\xe2\x1c\x54\x87\x17\xa7\x87\x88\x54\xc2\xd0\x12\x6e\xbb\xf7\x7f\xb6\x4d\x49\x3b\x83\xd7\x86\x31\x3a\xbc\xba\xba\x38\xfd\xfe\xe5\xd5\x09\x98\x8e\xbf\x39\xfa\xf1\xf0\x02\x3c\x3a\x7e\xf6\x71\x6f\x27\x28\xe2\x88\xcf\x45\x91\x2e\x07\x14\x1d\x1e\x50\x16\x14\x16\xcb\xa1\xd8\x81\x55\x46\x5c\x54\xaa\x56\x86\x27\x68\x48\xaa\xf6\x63\xb0\x80\x08\x28\x6d\x3b\x14\x92\x99\x53\x37\x85\x01\x5a\x19\x76\xa4\x9d\x73\x7f\x2b\x30\xf9\x33\x79\x3d\x32\x38\x7e\xef\x59\x27\x44\x49\x1f\x68\x20\x9e\x71\x4c\x50\xe9\x98\x13\xc3\x03\xc5\x1d\x18\x66\xbc\x28\xb6\x9b\x33\x64\xf3\xb8\x57\x62\x1f\x15\x3f\xc8\xb7\xce\x31\xaa\xc4\x4f\x4a\xe2\x75\xca\x1e\x74\x56\x18\x05\x0b\xa7\x17\xbf\x96\x7f\xb9\x33\xac\xd5\x33\xb5\xb2\x6f\xe9\x5e\xda\x4e\x4a\x32\x94\x39\x3e\x30\x9b\x72\x44\x5b\x8b\x61\x7a\x5d\x8d\x7b\x24\xcf\xb5\x2c\x4d\xe8\x5e\xb1\x84\x64\x83\xe0\xf9\x03\x95\x71\x48\xfd\xcb\x30\x63\xf8\xcc\x60\x38\xa8\x9b\x52\xad\x4a\x76\x7c\xfe\xdc\x96\x74\x7c\xfe\x3c\xe0\x8d\xc9\x0b\x2d\xfa\x06\x08\x1e\x29\x9b\x35\x78\x4c\xe1\xa8\x6b\x4d\xc1\x7c\xf3\x11\xf4\x94\x8a\x83\x1d\xe4\x5f\x6b\xae\x3f\xd1\xd7\xc3\x46\xa0\x66\x13\x55\x14\x6a\x85\xfa\x9f\xa4\x9f\x63\x9b\x61\xaf\xfc\xa0\xdc\xb9\x12\x95\xe1\x6b\x52\x4f\xa4\x2d\xd7\x3d\xac\x63\x6d\x34\x3c\x72\x34\x96\x88\x15\x36\x82\xa6\x60\x3c\x10\x3a\xd2\x33\xa5\xa6\xec\x33\xbd\x9c\x4e\x85\xae\xc9\xc7\x2c\x05\xb3\x5b\x51\x69\x7c\xd8\x61\x0d\xef\xcd\xc1\x28\xbe\xe7\xe8\x45\xfa\x1e\x26\x28\xd2\x9d\xf1\xc5\xff\x49\x83\x13\xef\xa2\x8e\x0d\x54\xd8\xbd\x91\x9f\x79\xf7\xd4\x5d\x7b\x46\xd7\xbc\xcc\x79\x95\x3f\x68\xd3\xc4\x25\x9b\xad\xd3\xa8\xeb\xff\xde\x0d\x14\xf7\x33\xb5\x83\x1e\x3a\x23\x01\xeb\xfe\x67\xaf\xd7\xb0\xd1\xdd\x0b\xf6\x65\x89\xa3\xf5\xee\x0b\x36\x2c\xff\xcf\x5c\xb1\x51\x4c\x78\x32\x99\x72\x69\xbf\x99\xd6\x93\xc8\x75\xbd\x68\xbb\x24\xa7\x19\xb6\x58\xad\xaf\x7f\x89\x9d\xcd\xdd\x88\xb5\x93\xa4\x85\x7b\x41\x6a\x90\xe5\xa2\x92\x6b\xe3\x10\x84\x6a\x6e\x44\xf8\x50\xf2\x88\xd2\x07\xef\xb0\x41\xbd\xc3\xc5\x52\xcf\xb6\x7d\x8e\x08\x20\x73\x89\xb3\x60\x12\xe2\xa3\x31\x58\x33\x07\x99\xe7\x7c\x91\xb4\x06\xf0\xda\xb2\xd7\xd6\x6d\x13\x38\x83\x43\x61\xc2\xce\xf0\x57\x25\xcb\xed\x5e\x9f\xf5\x3c\x00\x40\x54\x2e\x81\x23\x1e\x1c\x00\x3a\xe2\xbf\x92\x6a\x31\xa7\xc1\xfe\xc0\x1a\x3e\x41\x3f\xa3\x9f\xe8\x6f\xf1\x8d\x04\x44\x4d\x4f\x41\x9d\x00\xae\x8b\x7d\xa6\x85\x68\x08\x05\xa9\xda\x01\xdd\x4f\xd4\x02\x96\x52\xab\xe3\x88\x7c\xd4\xb9\x9e\x02\xdd\x8a\x54\x3f\xbe\x7d\x87\x5e\xe8\x7f\x67\x37\x36\xb1\x58\x52\x24\x96\x71\xf8\x88\x16\x08\xa4\x82\x64\xe9\x87\x84\x7b\x37\x89\x53\x22\x09\xfd\x83\x9c\x19\x9e\xd0\x2b\xb9\x76\xf2\xa2\x1f\xef\xfe\x7b\xb9\x51\x29\xf4\xc7\xbb\xe9\xc1\x02\x60\x29\x00\x42\x82\x47\xb1\x9e\x03\x9b\x82\x30\x87\x4d\x1c\x07\x93\xcf\xca\xd4\x50\x86\xaf\x0b\xae\xa1\xee\xbd\xc4\x6b\x17\x39\x7f\x5f\xcd\xf1\xb4\x85\x26\xc6\xd9\x53\x3d\xd7\xf2\x83\xa0\x39\xbe\x9a\xa6\xe7\x89\x84\x0e\x5b\x88\xf7\xae\x90\x6a\xdb\xf3\xc4\x9c\x94\x63\x01\x2d\xa4\xc5\x7e\xa4\x4a\x2d\x73\x51\x59\x88\x61\x8b\xd5\x8e\xbe\xb2\xd0\x49\x72\xe4\xaf\x02\x20\xbf\x15\xbb\x36\x2d\xbe\x26\x21\xb5\x62\x59\x21\x78\x13\xfd\x50\x55\xec\xda\x3d\x4a\x5d\x93\xf6\x7b\x80\x58\xec\x05\x7b\xf4\xb6\x93\xdc\x2f\x66\x81\xa5\x9f\x7e\xff\x9c\x8e\x7b\x44\x97\x07\xf4\x09\x4a\xfa\x00\x1d\x0b\x5e\xa8\x7f\x32\x43\x4e\xf6\x70\x01\x43\x40\x5a\x54\xf0\x14\x44\x78\x4d\x4e\x8a\xdb\x37\x5d\x43\xd8\x53\x65\x8a\xe0\x85\x56\x80\xe2\x0e\x6e\xc4\x6b\x82\x33\x9d\x23\x9e\x8e\xc7\x48\xcd\x38\xf5\xdc\xb0\x4d\xc4\x7c\xc2\xc9\xbe\x05\xee\xdc\x51\xd5\x0a\x7d\x50\x2c\x94\xd6\x72\x5c\x88\xcb\xe0\xc4\xb7\x42\xc4\xd1\x88\x10\x6e\xc8\x32\x7a\x8f\xf5\xf0\x47\xaf\xef\xc2\x00\x35\x40\xf8\xa8\x23\xfc\xee\xe1\xf5\x1e\x82\x06\x94\xa6\x97\x4c\x84\xb8\x9c\x37\x62\x4d\xb1\x5a\xff\xa7\x58\x53\x8c\x21\x0b\x10\x0c\xe2\x31\x08\x33\x77\x92\xc9\xb2\x28\x74\x56\x09\x40\x51\x87\x90\xa7\xcb\xa2\xb8\x84\x10\x4a\x05\x0d\x2a\xa8\x06\x6d\x3e\x34\xfd\x5e\x97\x19\x7c\xae\xcb\x0c\x43\x96\xb5\xf2\xa6\x11\x26\x6a\x59\xab\x23\x17\xe0\xd3\x90\x64\xd1\xa6\xb0\x82\x46\x1f\x0f\xc3\xec\xa2\xe1\xcb\xc5\x4e\x54\xb6\xd4\x14\xf7\xd4\xfc\x76\x31\x8b\x82\xaf\x29\xe2\x45\xc1\xd7\x2e\x5c\xf3\x5b\x5b\xd7\x25\xbf\xc5\x7a\x32\xbe\xa8\x97\x95\x09\xa6\x5f\x18\x2a\x8a\x62\x81\xeb\xca\xc4\x88\xa2\x78\x81\x5f\x2e\x96\x9e\x4d\x28\xf6\x12\xbf\x30\x76\xc6\x0b\x73\xbe\x42\x99\xf6\xb7\x8d\xa1\x89\x35\xbf\x2e\x69\xb6\x48\x92\x0a\xa1\x28\x53\xc5\x50\x07\x6a\x6f\x7f\x62\xb8\x84\xf1\x32\x7f\x70\x41\x64\x05\xd7\xda\xac\x03\xf8\x61\xd6\x1a\xa6\x33\x5f\x32\xb7\xe1\xa7\xc7\x3e\xd4\xac\xda\x76\x7a\x55\x98\xc1\x34\x7f\xdc\x37\x58\x68\x9b\xa0\xcb\x05\xa7\xda\xf1\x79\x0f\x42\x11\x1d\x21\x08\x15\xf4\xe8\xe7\x63\xed\x33\xa0\x4f\x75\x57\xcf\x45\xb9\xb4\x29\xee\xea\xe7\xa2\x5c\xba\xd8\xca\xb6\x81\x44\x73\x61\xb8\xd9\xba\x41\xdc\x33\xa9\x6d\xdd\xaa\xca\x31\x97\xf9\x81\x61\x95\xd2\x5a\x55\x72\x2a\xa1\xfd\xe6\xeb\x1c\xbe\x20\x36\x78\x5e\xd5\xa2\x86\xc7\x55\x7c\xa9\xed\x75\xbc\xf0\x52\xae\x9a\x43\x92\x9a\xdb\x6f\x51\x4b\x18\x48\xf3\xf3\x4a\xd2\x38\x5a\x77\xd3\x66\x46\xec\x4f\x48\x8f\xbf\xfd\x64\x53\xc0\x51\x30\xe7\x14\x44\x2e\x10\x62\xc7\xd5\x14\x2f\x2a\x8c\x10\x15\x86\x48\xf8\x96\xf6\x0b\x1f\x1a\x20\x88\xde\x1c\x20\x5c\xad\xca\x42\x71\x08\xa7\x9f\x18\x5e\xf1\xe9\x94\x66\xcc\xfd\x86\x18\x51\x66\x86\x0e\xef\xb1\x9e\x28\xb3\xab\xf5\x82\xfa\x36\x51\x95\xe9\x97\x19\xae\xa7\x0a\xeb\x9c\xa8\x6a\xbe\x07\x31\x73\xf7\x8d\x6e\xbc\x29\xf4\x39\x7c\xb8\x38\x47\x81\xcc\xc7\xa1\xa7\x42\xe6\xd3\xd7\x6a\xbe\x4e\x82\x9a\xcd\x77\xa9\x2c\x37\x43\x09\xce\x14\xb9\xf0\xf6\x69\x10\x23\x8f\xe2\xaf\xe0\x03\xe3\x0c\x4b\x35\x26\xfb\xff\x1e\x7c\x7d\x0f\x5f\x10\x3b\x13\x3c\x17\x95\x59\x44\xf4\x8b\x42\xf1\x81\xb4\x87\x3f\x30\x0c\xde\x6a\x4c\x18\x3e\xda\x60\xd8\x74\x06\x21\xd3\x19\x7e\x57\x62\x62\xbe\x2b\x31\x71\xdf\x05\x07\x52\x61\x7e\x3e\xe3\x44\x27\xcc\x28\x4e\x54\xd5\x18\x4f\xc3\x3e\x83\x3e\xf0\x1e\xa2\xcd\x9e\x98\xdf\x38\xfa\xe6\x73\x00\x71\xbd\x56\xa4\xcc\x60\x50\xcd\x1f\xfc\x36\xc3\x2f\x71\xd8\xc3\x25\x2e\xa3\x45\x0d\xac\xde\x5c\xe5\x62\x8f\xd8\xbe\xe7\x2a\x17\x14\x53\x8b\x69\x05\xe8\x00\x3d\xf7\x1b\x63\xcc\x38\x49\x1c\x22\x59\x8b\x39\xd6\x54\x8b\x39\x91\x18\xf3\xd3\x30\x15\x14\x6a\x38\x4f\x17\x8e\x23\x63\x7e\x5d\xd0\xe0\x98\xdf\x3a\x53\x30\xe9\xe6\xf7\xa5\xf9\xed\x62\x68\x35\x98\x9f\x6e\x29\xdc\x88\x35\xe8\x5e\x99\x66\xdc\x88\xf5\x0b\xf8\x6d\x63\x28\xc3\x8d\x58\xfb\xf4\xb2\x34\x2d\x34\x7f\xe0\x1b\x64\xf3\x7b\xac\x87\x2f\x64\x18\x02\x93\x53\xd8\x89\x21\x52\x53\x58\x12\x53\x28\xe8\x8d\xf9\x43\xdf\x2b\xf8\x5c\xc1\xd7\x9c\x97\x72\x22\x20\x87\xfd\x49\xe1\xd5\x54\x96\x2b\x04\x53\xe8\xe1\x17\x40\x2b\x04\xb1\x6e\x89\xe1\xe7\x8f\x7e\xa1\xcd\xf9\x1d\x04\xdf\xd9\x2f\xbc\xb1\x61\xd8\x33\xf8\x8d\x31\x22\x97\x86\x2e\xc1\x5f\x1f\x32\x45\x24\x12\x0c\x06\x58\x12\x8a\xa3\x8d\x39\xf7\x9b\x72\x0e\x44\x72\x4e\xc4\x71\x2e\x4b\x5f\x93\x2c\xc3\x9a\x9c\x9f\xcb\x9e\xfd\x49\xe1\x35\x50\x1c\xf8\x0b\x21\x74\xbe\x94\xf6\x68\x29\x55\x99\x41\x80\xf9\x4b\x21\xc1\x56\x2e\xe3\x6d\xac\x16\xb0\xc1\xcc\x1f\xfa\xae\xe5\x7c\x39\x87\x20\xf8\x05\xa1\x24\x3e\xdd\x63\x3d\xfa\x85\xa1\xfe\x81\xcf\xc4\x04\xcf\x7d\x14\xbb\xd6\xb2\x2c\x64\x29\x30\x76\xad\x4f\xe1\x0b\x63\x95\xae\x31\x1b\xfc\xc0\xb0\x4a\x10\xdd\xa4\x5f\x14\x0a\x4f\xe0\x10\x8a\x8f\xe1\x26\xb4\xe2\xb9\x54\x76\xdc\xe1\xc3\x8f\xbb\x7d\x4a\x34\x31\x82\xe7\xe7\x65\xb1\xa6\xf0\x89\xa8\x2a\x51\x2d\x54\x21\x33\x8c\xc5\x80\x17\x10\x40\x69\x0a\x88\x28\xe8\x0b\x9f\x1f\x21\x88\x5e\x22\x31\xfc\x56\x54\x9a\xc2\xf1\x27\x86\x2b\x68\xa8\xf9\x43\xdf\x2b\x0d\xdf\x2b\xed\xbe\xf1\x98\xaf\x10\xeb\x05\x42\x35\x2f\xf3\xb1\x32\x2b\x90\x7e\x61\x28\xed\x53\xed\xf6\x28\xfc\xca\x6d\x50\x4e\x61\x86\xb1\x47\xd6\xc8\xfd\xc6\x18\xc1\xe7\x85\xd0\xa6\x7e\xfb\x93\xc2\xf1\xf1\x74\xcf\xde\xe0\x6c\x49\x33\x8e\xf5\x99\xbf\x18\x82\xec\xa4\xb6\x4c\xa4\xf9\xa1\x29\x80\xca\xc2\xce\x68\xd7\x93\x85\x28\x0a\x38\x74\x21\x54\x14\x05\x1c\xb8\x18\x57\x19\xb6\x55\x57\x99\xfd\xca\x15\x05\x1c\x2b\x17\x46\xc4\x41\x57\x99\x23\xdc\xba\xca\x90\x8b\xd3\x55\x66\x99\x38\x8d\xa8\x35\x3d\xf8\x4b\x21\x62\x01\x01\x62\x41\xdf\x6b\x98\x0a\xf8\x8b\x21\xcb\xf9\x9c\x57\x66\xda\xe9\x17\x84\xd6\x7c\x2c\x11\x65\xa6\x57\xf3\x31\x00\xce\x50\x38\x1d\x6d\xb5\x3f\xd6\x6a\x59\x43\x99\xf0\x17\x43\x90\x00\xd6\x96\xfa\x2d\xb5\x98\x73\xd3\x8e\xa5\x16\xcf\x39\xb6\xc4\xf2\x17\xb7\x8e\xb1\xb0\x54\x6a\xe5\xe8\xd3\x8a\x4e\x05\xf8\x8b\x21\x15\x94\x63\xfe\xf4\x02\xb4\x1b\xc3\x5a\x8f\xd5\x12\x98\x74\xf3\x17\xd2\x9a\x4b\x47\x59\x3b\xea\x86\x9f\x01\x75\xa3\x90\x01\x9d\xac\xa9\x24\x3c\xcb\x96\x73\x00\xd0\xc7\x58\xfa\xc0\xb8\x3c\x27\x38\xa4\x9e\xfd\x89\xe1\x85\x9c\x02\xaa\xd7\x98\x6b\x41\xdb\xdc\x85\x7d\x4f\x61\xd4\x00\x1b\x3c\xb0\x69\x7b\x9d\x89\xe1\x3a\x54\x09\xcb\x3d\xc0\xe7\x85\xf0\xec\x03\x2f\x16\x33\x3e\x16\xb5\x84\x5b\x90\xfb\xc0\xb8\xf9\xa2\x90\xf5\x12\xc6\xd2\xfd\xc6\x98\x8a\x8f\x65\x46\xec\x13\x7e\x3c\xb5\x4c\x14\x7d\x83\x12\x4c\xaf\x1d\xcd\x75\x86\x4c\x38\xfe\xc0\x30\x7b\xfb\x25\xea\xeb\xbe\x1d\x87\xef\x42\x68\x8d\xb8\x6f\x77\x54\x9a\x8b\x11\x51\x0f\xba\x26\x5d\xe0\x17\xc6\xfe\x26\xe7\x4b\x58\x26\xf4\x0b\x42\xcd\xf0\x4d\x0c\x29\x12\x25\x50\x30\xf3\xfd\xd4\x7e\xbb\x14\x66\x2c\xf5\x4c\x4e\x6a\x4a\x61\xbe\x2f\xcd\x37\x76\xd7\x06\x0d\x20\x4d\x2f\x99\xc8\x84\x78\xca\x6b\xbe\x5e\x04\xd4\x77\x8c\xe4\x6a\x6c\x69\xd5\x58\x20\xf3\x0f\x7f\x31\x44\xc2\xa5\xd5\xfc\xc1\x6f\x68\x2d\x36\x31\xe3\x45\x46\x0b\xde\xfc\x74\x5c\x50\xc6\x17\x6e\x11\x67\x7c\x11\xae\xe0\x8c\x2f\x82\xe5\x1b\x47\x66\x85\x5c\xc0\x05\x4b\x2e\xdc\xf7\x82\xc3\xd0\x99\x9f\x2f\x38\x8d\x1d\x7c\x0d\x16\x80\x9e\xdf\x88\xb2\x59\x00\x21\x2d\x88\x7c\x69\xbe\x5d\x8a\x6a\x89\xb7\xad\x42\x2e\x2e\x96\x85\x08\x0a\x35\x31\xbd\x66\x14\x68\x70\xed\x91\x26\x97\x0f\x01\x00\xc1\x85\x42\x75\x0c\x1b\x7d\x1a\x06\x52\xc1\xa0\x00\x16\xa5\xee\x75\x27\x6f\x17\x3d\x01\xa4\x10\x9d\xcc\x82\x28\x22\xba\xb3\xa2\x01\x65\x4e\x57\x18\xe6\x86\x58\xbf\x50\xe0\x33\x5c\x29\x4d\x3d\xb6\x44\x12\x08\x70\x66\x75\x36\xc5\x85\x0d\x08\x8b\x71\xa9\x7a\xe9\x64\x74\x11\x46\xad\x2b\xda\x78\x14\x76\x09\x61\x6e\xf3\xd9\x94\xe6\x78\x68\x24\x34\x41\x3e\xdd\xb2\xd2\x38\x8b\xf0\x03\xc3\xcc\xda\xcf\x70\xe5\xc3\x2e\xa4\xad\x07\x37\x3e\xfc\xc5\x6b\x4e\xa5\xda\x9f\x18\x2e\x32\x51\x80\x5d\x21\xdc\x2b\xed\x07\xc5\x59\x3a\x43\xbf\x30\x54\x4e\x26\x4b\x2d\x32\x55\xea\x9a\x63\x2c\x86\x1c\x51\x08\xa5\xaa\x84\xbd\xe9\xb9\xdf\x14\xa3\x49\x3e\x43\xbf\x28\xf4\x56\x62\xb7\xe8\x17\x86\xaa\xb9\x2c\x79\x44\xcf\x6d\x50\x4c\xce\x6d\x68\x44\xcd\x93\x49\xf3\x25\x54\xb2\xa4\x0a\xcc\xc0\xe5\x38\x70\x39\xb4\x09\x9b\x23\xf2\xa9\x20\x82\x60\x7e\x3a\x82\x00\x1a\x51\xd4\x2d\xf7\x1b\x63\x4a\x73\x79\x1e\xf3\xec\xc6\xf0\x80\x70\xe5\xc0\xa0\xef\x5d\x10\x36\x15\x43\x07\x3e\x65\xaf\x2b\xa9\xa0\x52\xe8\xeb\x0e\xc5\xa4\x26\x88\x7e\x52\x38\xc2\x7f\x56\x02\x6d\x50\x74\xc0\x22\xda\xb8\x0b\x1b\x77\x11\xf2\x8c\x13\x59\x18\xd6\xd2\xfc\x71\xdf\x0e\x33\xaf\x17\x00\xd6\x61\xc3\x4d\xc0\x80\xe2\x7b\x89\x04\xe6\x9b\x08\x92\xf9\xe9\x09\x12\x64\xb4\x04\x29\x8a\xc2\x4d\x8d\xa1\x96\xe7\xc6\x9f\x15\xf0\x75\xf8\xfb\x82\x78\x3b\xfc\xb2\x14\x11\xbf\x3c\x3d\x04\x2c\xbd\xa0\xf9\x01\xb4\x1e\x35\xc3\x84\x44\x1d\x68\x26\x81\x00\x4b\x24\xe1\xe3\xc8\x51\x4a\xca\x8e\xa4\xb3\x1d\x0d\xc2\x48\x12\xa5\xb8\xdf\x14\x53\xd6\x13\x3e\x97\xc0\xfd\x9b\x8f\xa7\xf0\x41\x85\xa2\x4a\x2b\x04\xb4\xa3\xcd\x27\xb1\xbc\xe6\xe7\xa5\x65\x7b\x31\x1b\x29\x78\xc5\x51\x36\x0b\xcf\x7f\x5d\xea\x3a\x88\x3d\x84\x80\x46\xf6\x01\x26\xeb\xa5\xd3\x41\x59\x75\x25\xea\x6c\x66\x13\xe0\x57\x58\x0a\x85\x24\x12\x60\xf6\x75\xe1\x9a\xef\x18\x5f\x9b\x75\x5d\xf8\x0e\xb8\x48\xf3\x45\x7a\xf1\x14\xf7\x0a\xbf\x82\xac\x14\xdf\x4b\x24\x30\xdf\x2b\x7b\x66\x7b\xf0\xc8\x20\xf3\xca\x9d\xda\x8d\x68\x54\x39\x26\xe1\x11\xb7\x82\x23\x05\xe2\xad\x4a\x91\x78\xcb\x10\x8c\x09\x12\x8c\x09\xcc\x28\x4e\xd5\x74\x77\x8f\xf5\xa6\xbb\xf8\xfb\x89\xf9\xfd\x04\x7f\x17\xeb\xc5\x8c\x58\x32\xf8\xed\xd8\x31\xfc\x24\x55\xe6\x66\x24\x7c\x05\x7a\xac\xe6\xf7\x6f\xaa\xac\x79\x61\x93\x9e\xfb\xc8\x1f\x5d\x64\x58\x70\x90\x7b\xe0\xb3\xf7\xee\xcf\xdf\xac\xfb\x56\x54\xb5\xcc\x92\x35\xbf\xa2\xa8\xae\x7a\x6d\xd6\x54\xad\x51\x5e\x88\x44\xe9\x10\xfc\xb4\xe2\xa1\xa9\xb9\x48\x8b\xb2\xae\x2d\x40\x93\x49\x40\x61\x1e\xb4\x29\x4c\x69\xc9\x83\xfd\xf6\x04\x62\xc6\xcb\x29\x1e\xe7\xf4\x0b\x43\x4d\xe7\x79\x7e\x6b\xe6\x15\x7e\x1f\xe6\xb7\xff\xc0\xfe\xc0\xe7\x80\xe7\xb7\x83\xbb\x5e\x2b\x16\x87\x14\xa4\xca\x2e\x2b\x0a\x99\xa3\xdc\x98\x22\x28\x20\x4c\x23\x73\xa1\xa6\x15\x5f\xcc\xe0\xe6\x10\x7c\x61\xec\x9c\x4f\x45\xc8\x85\x40\x40\x83\x0b\x81\xb0\x98\x0b\x49\x24\x93\xe5\x13\x90\xe3\x3d\xa1\x4c\xc0\xb7\x11\x5f\x2c\x4b\x92\x77\xe1\x0f\x0a\xab\x45\x45\xcf\x53\xee\x37\xc4\xdc\x98\x75\x7e\x83\xeb\xfc\xc6\x14\x7a\x83\x65\xde\x7c\x61\x7e\x7f\x81\xbf\xbf\x34\xbf\xbf\xc4\xdf\xe6\x27\xfe\x12\x55\x29\x8a\x39\xaf\x2b\x79\x07\x22\x3a\xf3\xf9\x1c\x3e\x83\x78\x44\xfc\x22\x01\x14\x06\x99\x19\x0c\xe4\x50\x26\x10\xc7\x83\x7e\x51\xe8\x1a\x1c\x2f\x59\xa9\x20\xfc\xb6\x31\x7a\x01\xf7\x0f\x8c\xba\xc4\x0f\x1b\x57\xcb\xb9\x8d\xb9\x32\x3f\x21\x1c\x5b\xe0\x68\x28\x7e\x06\x94\xb1\x10\xb5\xe1\x37\xdd\x13\x10\x7e\x87\x8f\x40\x14\x34\xa0\x34\xbd\x64\xa2\xc2\x90\x1e\x59\x4e\xed\x91\x63\xbf\x83\x53\xc7\x06\xf9\x83\xa7\x9d\x08\xac\xe9\xa1\x98\x52\xf0\x72\x0a\x04\xd7\x86\x1d\xa9\x52\x1c\x9a\x30\x4c\xa9\x70\x1f\xc3\x5f\x08\x99\xf3\xea\x06\x16\x19\x0a\x21\x6f\x44\x75\x62\x19\x15\xfc\x1c\x08\xe4\x50\xe2\x48\xfc\x0a\xc5\x97\x37\xa2\x8a\xc4\x97\x26\x00\x65\xc3\xf8\xfb\xb9\x8c\x8b\x9d\xcb\xa0\x58\x1b\x89\x5f\x56\x96\x82\x5f\x97\x4e\xa2\x62\xb3\xa2\x8c\x25\x91\x00\xbf\x2d\x05\xc0\x2f\xbf\xff\xf1\x3b\x10\xc8\xde\x88\x2a\x14\xc8\xea\x1b\x08\xd6\x37\xee\x9b\xf8\x6f\x5f\xa0\xbe\x21\xe3\xb9\xb0\x54\x7d\x13\x26\x08\x63\xea\x19\xa2\x2c\xc2\x98\x87\x9f\x18\x8f\xfc\xa5\x13\xb0\x94\xcb\xb9\xca\x6a\x7e\x0b\xcb\xb1\x5c\xce\xcf\xf1\x03\xe2\x2c\xb4\x6f\x0f\x7f\x60\x98\xe3\x75\x54\xc0\xc3\x28\x00\x2c\x81\xe5\x64\x7f\x62\x38\x49\x2f\xbc\xd8\x02\x09\x35\x04\x49\xcb\x4c\x06\xc4\xdb\x45\x78\x1e\xd7\x3d\xa9\x29\xff\x9a\xa6\x6e\x45\x35\x41\x89\xb8\xfd\xe9\xc2\xcd\x46\x5b\x28\xc4\xd9\xa5\x78\x13\xf4\x82\x82\x70\x52\x6d\xe8\xc0\xa6\xec\x75\x25\xb5\x81\xf5\x4c\x66\x37\x25\x0a\x12\x6d\xd8\x95\x0d\x6b\x14\xea\xd2\xf6\x3a\x13\x2f\xb8\x2c\x6b\x3b\x3c\xf0\x71\xee\xc6\x08\xbf\x07\x38\x68\xed\xe8\x05\x2f\x95\x16\xbb\x10\x01\xbf\x6c\x26\xf3\x31\xd8\xed\x35\x22\xcc\x85\xde\x11\x37\xf3\x11\x90\x35\x12\x63\x37\x96\x1c\x85\xb6\x56\x1d\x85\x87\xc7\x22\x05\xc5\xa7\x22\x05\x36\x8a\x0b\xca\x51\x40\xde\xc1\x95\x06\x24\xc0\xef\x13\xf8\xa6\xce\x60\xd0\x00\xd3\xf4\x92\x89\x1c\xe9\x5d\x78\xba\x8b\x3f\x79\x7d\xe7\x82\x0f\xeb\x7f\x44\x31\xeb\x20\xe6\x9f\x51\xcc\x6f\x41\xcc\xff\xc6\x18\xc0\x85\x43\x41\xfc\x84\x4e\x0c\xeb\xed\x01\x44\x6e\x18\x05\xdf\x87\xe6\x3b\x4e\xa1\x17\x22\xab\x01\xc8\x27\x4c\x07\xa1\x17\x26\x94\x52\x03\xd1\xbc\x15\x6e\xb8\x6c\x40\x30\x60\xa4\xd1\x88\xc2\x7f\xf8\x09\xe1\x66\xed\xe0\x9a\x30\x7c\x07\xe8\x25\xe0\x0f\x0c\x13\xc0\x37\x56\x62\xf2\x0f\xfb\x4d\xd2\xfe\x7f\xd2\x37\x9d\xd6\xd2\x3e\xaf\xbb\x90\x53\xff\xcc\xee\x03\x07\x98\xae\xd7\x91\xb0\x12\x0b\xc1\xeb\x0c\x81\xe7\x7b\xf8\x05\x30\xf4\x41\x2c\xde\x83\xf1\xf7\x31\xdd\x86\xed\xcd\xd1\x5c\x1b\x11\x6b\x37\x78\x66\x38\x71\x81\x51\xda\x89\xe0\xf5\x12\x6f\x6b\x36\xe8\x29\x05\x51\x3a\x0b\x8d\xd0\xb3\x3f\x6d\x38\x91\x79\xfa\x65\x43\x97\x05\x05\xda\x97\x73\xfc\xa9\x5d\xa0\x7d\xb8\xa8\x51\x68\x81\x3f\x30\x0c\x06\x19\x17\x07\xc8\xd5\x49\xa4\xae\x33\x8e\xa2\x77\xf3\x17\x43\x08\x0b\x09\x9e\x1c\xf0\x27\x85\xd3\x33\x44\xf8\x04\x11\xf2\x60\x10\xd0\xe0\xc1\x20\x2c\xe6\xc1\x12\xc9\x74\x41\xaf\x27\x85\x7b\x3d\x71\xfc\x83\x0e\x98\x02\xb3\x28\x97\x05\xaf\x02\x01\x8b\x0d\x8a\x24\x2c\x36\x30\x90\x0b\xd8\xa0\x93\x50\x3e\xa0\x17\xd4\xa7\x85\xeb\xd4\xa2\x12\x3c\x77\x6f\x81\xf8\x19\x3c\xd3\xc3\x74\xb8\x13\x07\xbe\xce\xfd\xb1\xa3\xeb\x3c\x17\xb7\xd2\x9e\x11\xba\xce\x8f\xed\x27\xc5\x8b\xf9\x0c\x1f\x3e\xe6\x33\x17\x72\x4b\x21\xb7\x14\x22\xeb\x6c\x56\xcb\x02\x5f\x6f\xe0\xeb\xca\x7c\x51\xac\x5a\x58\x96\xc8\xfc\x0e\xd8\x21\xf3\xe9\x59\xa1\x38\xd2\x7c\xf9\x33\x31\x00\xd1\x0f\xb2\x06\xb7\xff\x66\x02\x5d\x57\xf2\x46\xd4\xb3\x4a\x2d\xa7\xb3\xe0\xd4\x8a\xc2\xe3\xa3\x2b\x8a\x8a\xce\xaf\xee\x4c\x51\x4c\x78\x92\x45\x11\x8d\xe3\x2c\xae\x28\x3a\xd3\x36\x64\x43\xe5\xbc\x3d\x67\x30\xdd\x77\x10\xff\x18\xa6\x6e\x44\x10\x96\x7b\xd7\x02\xbd\x86\xb3\x01\xd7\x08\x75\x23\x06\x2e\x5d\xaf\x23\xa1\x2f\x2e\x58\x43\xb1\x8f\x82\x56\x81\x14\xdc\x95\x14\x03\xcd\xd1\x9d\xf1\x85\x4b\xf4\x0c\xbf\xa3\xc2\x28\x4d\x2f\x99\xc8\x17\xf3\xab\x92\x65\x94\xc4\x04\xb4\x0a\x82\xc0\x74\x32\x0c\x9a\x07\xbe\x15\x7a\x4d\x77\x0b\x51\x71\x3e\x65\xaf\x2b\x29\x06\x5a\xfe\x34\xf0\xc5\x10\x15\x84\x4f\x74\x89\x04\xf8\x1d\x6e\x80\xc0\xc7\x43\x54\x44\xb4\x09\x9a\x89\x2c\x4a\x44\x43\xa7\x8b\x34\x1c\xe1\xad\x72\x13\x8c\x44\x54\xc6\x6c\x9d\x23\x78\x5e\x3b\xf7\x8f\x36\x2a\xce\x57\x4d\x78\x26\x1c\xb9\xc6\xcf\x4b\x4f\xb5\xd7\x86\x84\x14\xbc\x9c\x2e\x39\xa8\xd7\x61\xc0\x33\x0a\x80\x34\xd0\x18\xc4\x42\xc0\x17\x54\x8b\x90\x4a\xb1\xd5\x54\xd4\x77\xee\x15\xf5\x1f\x41\xe8\xda\x85\xe2\xa1\x0c\x3a\xcf\x65\x36\x03\x3a\x64\x3e\x0e\xe1\x03\x87\xd2\x7c\x0f\x30\xb6\xd7\x8e\x36\x9f\xb9\xc8\x54\x65\xa9\xa4\x09\x38\x76\x01\x41\x11\x3e\x55\x2f\x9d\xcc\x04\x39\x9e\xd1\x7c\x04\x3c\xa3\xf9\x0c\x0f\x27\xf3\xdd\x38\x9b\xa0\x92\xe8\x68\x6a\x27\xaa\x0d\x53\x54\x23\x0f\x14\x72\x94\x75\xc4\x4a\xf6\x10\x8b\xa1\xb7\xe7\x7e\x99\xd0\xa5\x61\x7e\x97\xc8\xde\x2e\x9f\x98\xdf\x28\x0f\x58\x9a\x0a\x1a\xfc\xbf\x0b\x8b\xa9\xa8\x0b\x8e\x28\x68\x3a\xb1\x0b\x0d\x29\xa7\x0b\x6c\x50\x4d\x5f\x70\x44\x31\x3b\x92\x2f\x4b\x99\xe1\x8d\x8c\x7e\x85\xa1\x63\x99\x4b\x1f\xf3\xbd\xcc\xa5\xad\x02\x02\x06\x26\xbe\x97\x48\x40\xdf\x15\x47\x75\x50\xfa\xbc\xe0\x56\x23\xd4\x15\x00\x29\x7a\xa9\x24\xc0\x8c\x1a\x26\x64\x8e\xb1\xb5\x7e\x21\xaa\x93\xb9\xcb\x5e\xeb\xc1\xc2\xb0\xe7\xf3\x5e\x3b\x7e\x59\x7a\x1b\x79\x88\x0d\x4c\xe6\xfb\xa8\x09\x10\x3c\x5d\xdf\x1e\xc6\x6f\xd7\xbd\xdb\x41\xf0\x9a\x9d\x48\xe0\xb6\xd9\xad\xdf\x61\xb7\x22\xab\x55\x85\x26\xe0\x26\x06\x3e\x4f\xd0\x22\x1c\x0b\x85\x90\x81\x33\x12\x6f\x27\x21\x1b\x2d\x88\x82\x5f\x36\xb4\xe6\xf9\xed\x1a\x83\xeb\xc3\xfc\xf6\x9f\xb6\xc0\xaa\x06\x29\xdd\xba\xd7\x8c\x33\x1f\x5e\x46\x67\xbe\x22\x11\x1d\xe4\x0c\x25\x74\xcd\x14\x3e\xff\x3a\x8a\xfd\x67\x3b\xff\xba\x97\x48\x71\xeb\x65\x8e\xb7\x3f\x06\x42\xc7\xde\xed\xc0\xca\x20\x9b\x51\xb7\xb1\x50\xf0\xf6\xb4\x21\x15\xec\xdd\x0e\x42\x41\x61\x2a\xc9\xad\x14\x2b\x7c\x0e\x37\xbf\xbe\xa7\x17\x71\xf3\xdb\xe9\x90\x98\x8f\x40\x3d\xf2\x56\x5a\x88\x1d\x88\xb3\x1f\x18\xd7\x90\x63\xdc\x3e\x6f\x0a\x32\x7a\xb7\x83\x48\xb8\x91\x4c\x74\xab\x32\x3e\x36\x31\xe6\x2f\x84\xc0\x49\xa6\xad\xd6\x09\xae\x9e\x95\xaa\x72\xcf\x16\x9b\xaf\x48\xa8\x66\x02\x42\x91\x5a\x33\xc1\xaa\x02\xa1\x97\xd5\x5d\xc1\x2f\xf7\x78\x67\x03\x06\x20\x72\x49\x24\xb8\x33\xc4\xec\x0e\x89\xd9\x9d\x21\x66\x77\x48\xcc\xcc\x50\xe2\x20\xde\x65\x33\x5e\x96\xa2\xc0\x7d\x04\x27\xc3\xdd\x11\x06\x5d\x52\x10\xa6\x73\xa2\xb1\xbb\x50\x69\xe0\x2e\x50\x19\x08\x23\xee\x0a\x59\xde\xf0\xac\x5e\xe2\x95\x06\x3e\x0f\xf1\x93\x32\x02\x14\x1d\xa5\xe8\xa5\x92\x60\x11\x55\x46\x0a\x5f\x18\x8f\x9f\x51\x11\x14\x94\x4a\x02\x01\x24\x85\x87\xdf\x3f\x5a\x15\x56\xca\x0c\x2a\xad\xad\x48\xf8\x0a\xab\xbd\x68\xd4\x19\x55\x78\x11\xd5\xa6\x67\x20\x39\x82\xdf\x97\x33\x12\x1d\x51\x36\x13\xd7\x6b\x45\xc2\x97\xd5\x7b\x82\x8f\x2b\xa7\xfc\x44\x19\x51\x1b\xaa\x1d\x8d\x59\xf1\x11\x1c\xa3\x9c\x62\x33\x65\x34\xdf\xad\xc8\xbb\x79\x81\xb0\x83\xbd\xbb\x79\xf1\x3d\xd7\x36\xcb\xbc\xd8\x33\xe1\xbd\x46\xc4\xdd\xbc\x20\x9d\xb1\xbb\x79\xe1\x74\xc6\x20\x39\x68\x98\x36\x22\xee\xe6\x05\x5c\xb3\xe1\xaf\x4f\x0a\x90\x40\x94\xf6\x12\x7e\xbb\xc4\xd8\x56\xca\xf1\x0f\xf3\xe1\xb2\x95\x7a\x0f\x62\x7b\xed\xe8\xbb\x39\x98\x2c\x88\x66\x91\x6b\xb3\xe6\xd7\xb8\xe6\xd7\x66\xcd\xaf\x71\xcd\x1b\x4a\x80\x04\x60\xdd\x5e\xf3\xeb\xd4\x9a\xff\x6d\x8f\xf5\x7e\xc3\x5f\x4a\xcd\x79\x99\xa3\x2a\x9e\xf9\x38\x2c\xf3\x17\xbc\xec\x01\x14\x45\xb7\x71\xdc\x93\xff\x1e\xe3\xb8\x7f\x45\xbe\x2a\x42\xcb\xb8\xc8\xd7\x45\x6c\x8e\x0d\x91\xf7\xa2\x50\x60\xce\x93\x57\x27\x67\x57\x08\x6e\x71\x71\xf2\xc3\xc9\x3f\xc0\xf1\x87\x2a\xad\xab\x0f\x4c\x04\x46\xe5\x50\xea\x7b\x82\x6e\x04\xc5\x00\xc2\x43\x57\x59\x0f\x06\xde\xc0\x02\x9b\xa6\xbb\x50\xac\x37\xa5\x8d\xd0\x2c\x08\x75\x3b\x44\x92\x6d\x8e\x5a\x1a\xd8\xe2\xe3\xdd\x0d\xd0\x16\x1f\xef\xa6\xbd\x4d\x44\xc6\xce\xae\xc2\x4a\x4c\xa5\x46\xd1\x5e\x69\x5a\x86\x8e\xd0\xd3\x9e\x2d\x1e\x56\xe2\xa2\x58\x4e\x65\x19\xd9\xfa\x82\x43\x9c\xe6\xb4\x26\x01\xdf\xd1\x0e\xbf\x54\x0c\xbd\x13\x53\x59\x08\xe0\x38\x16\xa2\x74\x0e\x9f\xfa\x6c\x25\xd8\xdc\x9c\x00\x04\x1d\xc8\x09\xd4\x9b\x89\xc0\x3b\xa9\x2f\xf5\x18\x50\xc9\x40\x93\x15\xcb\x26\x6f\xec\x52\x03\x04\xd6\xf0\x9e\x8e\xbd\x33\x56\x41\x73\x5c\xd9\x81\xb3\x6b\xbb\x68\x44\x3d\x00\xba\xa0\x33\xeb\xeb\x38\xed\x2f\x31\xaa\x41\x6a\x82\xdb\x58\xd9\x5d\xa6\xcb\x38\x05\x33\x5e\xe6\x05\xb8\xef\x21\x34\x99\x07\xd8\xea\x37\xeb\x4c\xd8\x23\x3e\xd9\x60\xb1\x6f\x57\xf0\xfd\x36\xfb\xae\x97\xf1\x30\x78\x64\x3c\x55\x5a\xc0\x64\xb3\x04\x1b\xa9\x9c\x15\xf7\x93\xfb\x01\x0b\x36\x0e\xc6\x69\xed\x70\xac\xe5\xb4\x54\x95\xc8\x37\x41\x8f\x7c\xc8\xbe\x8f\x46\xec\x19\x39\x7e\x6e\x40\x2a\xcc\x94\xba\x71\xd4\xa8\x89\xa4\xe2\x57\x07\x92\xd1\x60\x2f\xb2\xdf\x7f\x8f\xa8\x62\x72\x9b\x3e\x7c\x2a\x08\xb5\xb1\x04\xa5\x1e\x89\x4e\xb9\x36\xa4\x50\xcb\x10\xec\xb9\x39\x19\x70\x9a\xb1\xa5\x06\x54\x72\xb0\x59\x04\x83\x52\x55\x7e\x5f\x2c\xab\xd0\x99\x34\xc5\x9e\x96\x14\x0f\x5f\xe7\xcb\x9a\xcc\x71\x0f\x8b\x02\x4f\x46\x4b\x0a\xd0\xa7\xae\xf3\x9e\x57\x2b\x36\x5e\x8e\xc7\x80\xf9\xa8\x3a\x0b\xc3\xb2\xac\x3b\xde\x52\x88\x5c\xe4\x23\xef\x91\x67\xbc\xc6\x3a\x86\xbd\x3f\x6f\xa1\xe3\xd8\x39\x03\xa5\x0d\x43\x77\x0c\x4a\x84\x88\x25\x0b\xee\xde\xfd\x12\x96\x1e\x8a\x95\xf0\x4d\x16\xa2\x42\x40\xe2\x00\xa4\xa0\x09\x9b\xda\x67\x85\x52\x37\xcb\x85\xf3\xed\x0c\xa1\x60\x0a\xbd\x01\x8e\xf6\x4f\x1e\x09\x73\x62\x6f\x18\x04\xc0\x07\x35\x69\xae\x63\x2f\x82\x0e\xde\x72\xa2\x2a\x36\x59\xd6\xcb\x0a\x61\x90\x65\x49\x53\x88\xc3\xf0\x82\x6b\x73\x6a\xe4\xf2\x56\xe6\x4b\x5e\x60\x51\x83\xeb\xd0\x72\xda\x3a\xf7\xf9\xf3\xe7\x5c\x37\x9c\xce\x59\x20\x00\x1f\xe2\x4c\xc7\x5b\xae\xeb\x1e\x05\x30\xa0\x9b\x76\x5b\x26\xa4\x19\x15\x8e\xd6\xed\xe0\xcd\xc2\x9a\xac\x07\xd8\x2d\x12\x48\xa0\x47\xcf\xb1\xa0\xb1\x7d\x73\xb2\xd6\x16\x5a\xd6\xba\x18\x00\x7f\x81\x04\xaf\xea\x0c\xd6\x6d\xcb\xfe\xfc\x83\x62\xa3\x0b\xbf\xb4\x53\x96\xce\x71\x39\xe3\x67\xb1\x97\x1e\x8f\xe5\xf3\x07\xc6\xe3\xcf\x3f\x34\x10\x6c\xe6\xc2\x2e\xfa\x83\xe0\xc3\x94\x89\xc4\xde\x03\x23\xfd\x27\x1c\x80\x6d\xbc\xa0\x39\xaf\xb3\x19\x42\x16\xa0\x71\xbf\xf7\x07\x41\xc8\x48\x8e\xc6\x64\xaa\x9c\xc8\xa9\x47\x0d\x4a\x9a\xf8\xdf\xc3\x06\xf9\x09\x49\x60\x41\x25\x0b\x6c\x32\x47\xb1\xf3\x90\x20\x3f\xec\x9f\x08\xb7\xa8\x9b\x2b\x0a\xc0\x9d\x1e\xc4\x0b\x6d\xc6\x2d\x8a\xa6\xf5\xc1\x13\x9b\x98\x5a\xe7\xa2\x21\xf2\x06\xe4\xe6\xf8\xd3\x4f\x99\x43\x6a\x6a\xb2\x97\x01\xef\x6d\xb9\x9d\xf6\x64\x03\x07\xee\x71\xa0\xec\x8c\x93\x03\x57\x5e\xf7\x34\xf8\xfa\xac\x67\x62\xed\x8b\xb3\x4c\x91\xc9\x92\x33\x5e\xae\x57\x7c\x8d\xbe\x7f\x88\x57\xf7\xbe\x77\x36\x9e\xf8\xb9\x12\x78\x30\x55\x22\x53\xd3\x52\xfe\x26\xfc\x9e\xb3\x00\x1c\x1c\x66\x86\x00\x7a\x9d\xe7\x57\xd8\x6c\x01\x10\x75\xb1\x66\x2b\x5e\x5a\xbc\x61\xbe\x58\x08\xc0\x6b\x82\xe2\x4c\x7e\xae\x19\x67\x08\xf6\x4b\xc7\xbb\x07\x00\x03\xf3\x37\x93\x93\xeb\x60\x24\xa0\x11\x96\xec\x63\x1e\xaa\x9b\x67\x99\xcc\xcd\xc1\x68\x6a\xb5\xae\xa8\x6b\x44\xa0\xe6\x6c\xc1\xcd\x75\xdc\xc3\x77\xf4\xc9\x6f\x2e\x35\x99\xd2\xd9\x76\xd9\x7e\x05\x0b\x2b\x9e\xc6\x7f\x07\xe5\x74\x8e\x56\x3f\xfd\x94\x3d\xc2\x75\xe2\x80\x48\x0f\x01\x55\xe3\x7b\x4c\xe1\xbd\x09\xef\xc4\x5e\x83\x6e\x63\xbf\x6a\x1b\x68\x6d\x70\x02\x95\xaa\x1c\x50\xd5\x4d\x08\xb1\x9f\xcb\x9f\xcb\x70\x0a\x60\xae\x6b\x05\x82\x4d\x41\x93\x4e\x43\xda\x87\x29\xf1\x07\x1a\x4d\xe1\x1e\x8e\xff\x27\xfa\xe0\xa3\x4f\xf4\x47\x4c\x55\xec\x13\x7d\xf0\x2f\x74\xd0\x57\x2b\x44\x5b\xda\xde\x79\x8b\x13\x41\x67\x56\xd9\xbc\xd1\x3f\x88\x88\x37\x00\x66\xfe\x07\xf5\xbd\x59\x13\x38\xad\xaa\x95\xa1\xf2\xb9\x74\xfb\x0c\xfc\x9b\xc8\x1a\xf7\xbb\x29\xc8\x45\x3b\x36\xe5\x6d\x9f\x60\xe3\x4d\x6b\xe2\x24\xdf\xd1\x42\xdb\xf3\x6c\xcc\xdb\xd8\x75\xe2\x7d\x83\x1f\xfe\xbf\x79\x22\x3e\xd8\x55\xec\x0c\x28\xa0\x73\x84\x6d\x6f\x5f\x39\x91\xcb\x3e\xcb\x15\x90\x31\x1b\x61\xf3\x81\x2f\x6a\xb3\xbf\xd0\xc9\x86\x63\x47\x01\x85\xc9\x6d\x40\x4f\xce\xef\xbf\x88\x8d\x46\xec\x27\x5e\x95\x88\xa9\xc4\x59\x83\xaa\xa3\xdf\x8c\x31\xcf\xa1\x52\x8f\x28\x87\x7b\xf8\x52\xd4\x6e\x1b\x87\xde\xe1\x76\xba\x31\x08\x37\x0f\x55\x84\x42\xb8\x95\x68\x76\xec\x5a\xee\xa5\x47\x37\x73\x48\xbb\x81\x04\x2d\x85\xb8\x17\x00\xa2\x59\xc4\xbd\x3f\x04\xb8\xe7\x50\xbe\x6e\xc4\x9a\x2a\x7b\x7d\x23\xd6\xbf\x6c\x84\xdf\x0b\x1b\xf1\xce\xf0\x7b\x51\xe6\x0f\x01\xbf\x87\xad\x8c\x8a\x7d\x17\xf4\x3d\xef\x0f\x2c\x09\xc1\x77\x82\x8e\x55\xe8\xc8\x0a\x4f\x2b\x3a\xa9\x68\x67\x9b\xfc\x11\xa9\x01\x1f\x32\x86\xe1\xf6\xec\x2f\xf8\x3b\x32\xb4\xc2\x1d\xc3\x0f\xc3\xc6\x43\xbf\x1f\x6e\x51\x0f\xc6\x62\xc6\x6f\xa5\xaa\xde\x0d\x22\xcf\x91\x82\x80\x73\x4a\x8d\xda\x03\xb0\xfe\xc8\x23\xac\x1d\xb4\x36\xe2\x5f\x3c\x6a\x00\x98\xf5\x47\xc7\x0d\x0a\xf9\x77\x8f\x5c\xfc\x30\x91\x00\xcd\x7b\xf2\x61\x11\x06\x5b\x14\xa2\x0d\x31\x38\x1a\xb1\xab\xf3\xe3\xf3\x3d\xb2\xa4\x64\x72\xbe\x50\x55\xad\x59\x21\x6f\x04\xd3\x6a\x2e\x06\x0b\x9e\xdd\xf0\xa9\x18\xe9\x2a\x1b\x7d\x06\x12\xa0\xb1\xe1\xe0\x9e\xca\x3b\x36\x17\x88\x44\x36\x15\xb5\x7d\x36\x91\x63\x51\x9d\xaf\x4a\x51\x19\x66\x0b\x84\xfa\xed\xa7\x15\x93\x66\xd8\x95\x67\x3f\x55\x62\x63\x3c\x1f\x5c\x6a\x94\x6f\x3f\x02\x54\xa4\xc5\xe8\x14\x84\x3c\xae\x62\x90\xe8\x72\xc6\xf3\xb5\xe1\x2b\x3d\xe8\xa2\x89\x3d\x3e\x3c\xfb\xe1\xe4\xe2\xfc\xe5\xe5\xb3\x7f\xbe\xb9\x3c\xb9\x7a\x73\x7a\x76\x76\x72\xf1\x06\x3d\x02\x75\xc3\x3b\x61\xc9\x97\x2f\x5f\xbc\xb8\x38\xb9\xbc\x7c\x73\x74\x7e\x76\x75\x72\x76\xf5\xe6\xe4\xf8\xf4\xea\xf0\xfb\x67\x27\x6f\x7e\x3a\xbc\x38\x3b\x3d\xfb\xc1\x14\x71\x8f\xf2\x53\xa3\xa4\x1f\xff\x79\x7c\x71\x78\x75\x7a\x7e\x66\x8b\x40\x57\x58\x9d\x3a\x50\x98\xfd\xf0\xe5\xd5\xf9\xd3\xf3\xa3\x97\x97\x00\xca\xed\xc0\xcd\x30\xf2\xe8\xc7\xd3\x67\xc7\x17\x27\x67\xe0\x3d\xce\xe2\x82\x51\xb5\x57\xff\x7c\x76\x02\xe5\x83\x2d\xdd\xbe\x73\xc0\x15\xbb\xdf\xb2\xa1\xf0\x92\x71\xf9\xe2\xf0\xc8\xe4\x39\xb3\x5e\x48\xf4\xd0\xa4\xdb\xdf\xda\xb2\xb3\x7d\x49\x0f\x71\x0d\xf7\xf9\x43\xc3\x26\x5c\xc0\xc2\xd6\xdb\x3d\x78\x3f\x32\x8b\x3d\xc8\xb0\x79\xa5\x34\xbc\xd1\xd3\x86\x08\xfc\xbe\x01\x0b\x70\x34\xab\xd4\x1c\x7d\xa6\xcc\x04\xba\x92\x9a\xf3\x5f\x55\xc5\xc6\x95\x5a\x69\x51\xa1\xef\xd2\x99\x44\xd7\x38\xdf\xd4\x72\x2e\xbe\x1d\xb2\xef\x97\x70\xc5\x51\x13\xf6\x1f\xcb\x62\x6d\xcb\x7a\xf2\x78\xf7\x6f\x48\xa5\x6b\x51\xe6\x80\x11\x08\xae\x07\x64\xcd\x72\xa4\x47\x2b\x99\x0b\x54\x86\x65\x4b\xcd\xa7\x02\x9c\xd9\x45\x77\x2f\x5b\xd6\x67\xe0\x23\xe6\x33\x68\x3c\x90\x4b\xac\x1a\xa4\xb1\x86\x30\x80\x5f\xd5\x65\xe9\x6e\x7b\x20\x4c\xa5\xce\x90\xef\x18\x5b\x94\xac\x99\x56\xaa\xb4\x57\xcd\x3e\x22\x81\xf3\x72\x6d\x2e\x77\xe1\xc3\x11\x22\x2f\x9a\xdb\x1b\x5c\x43\xf1\xc2\x89\x08\x64\xd6\xcb\x9c\x75\x38\x53\xa1\xd3\x9b\x95\xaa\x6e\x40\x52\xaa\x8a\xf5\x44\x16\x05\x52\xf6\x6f\x72\xc9\x0b\x35\xfd\x76\x08\x82\xf7\x85\x50\x8b\x82\x84\x85\xf4\xdc\x84\xf1\xe4\xdb\x2d\xf4\x4d\xdd\xa6\x8b\xa7\xe5\xb1\xb8\x15\x85\x5a\x80\xeb\xb2\x8d\x5c\x0e\xbb\x0f\xb6\x75\xbf\x23\x51\x03\xb0\xb4\x33\xd9\x93\x56\x32\x6c\x39\x21\x2e\x9a\xfb\x2a\x8c\xa0\x13\x93\x6b\x76\x74\x01\xa3\x7d\x74\xf1\xec\xa9\x99\xff\x67\x4f\x87\x98\xfe\xb4\x46\x54\xc8\x8c\x97\x0c\xd8\x95\x9f\x97\x8f\x1f\x3f\x7e\x6c\xd6\x82\x62\x3f\x2f\x9f\x3e\x7d\x7a\x6c\x58\x79\x99\x8b\x40\xd0\x40\x79\x9d\x67\x9e\xd5\x6a\xb8\xfa\x62\xa8\xaa\xe9\xe8\xea\x62\x64\x36\xd5\x57\x23\x53\x7f\x61\x08\xf7\x54\xc0\x36\xfb\xcb\xa2\x12\x8b\x4a\x65\x02\x9d\xd7\xd4\x33\x31\x00\x14\x2e\xb0\xaa\xe5\xf3\x2d\xfb\x9c\xb8\x12\xb8\x0e\x38\x9b\x4b\x0d\x52\xab\xbe\x59\x08\xee\xf5\x10\x16\x14\xac\x31\xb3\x2b\xa9\x21\x3f\x09\x5c\x53\xe8\xeb\x6f\x01\xb2\xae\xe5\x22\x7a\x34\x04\x48\x70\xb3\x85\x26\xb2\x42\x89\x04\x71\x06\x43\x9a\xf1\xb3\xf3\x8b\xe7\x87\xcf\x4e\xff\xf7\xc9\x9b\xb3\x93\x9f\x9e\x9d\x9e\x9d\x5c\xfa\x17\xed\x9f\xab\x9f\xcb\xef\x46\xd3\xfd\x76\xd2\x97\xcf\x9e\xbd\x39\x3c\x3b\x7e\x73\x71\xf2\xe2\xd9\xe1\xd1\xc9\x73\x43\x4c\x7d\x36\x18\xca\xdf\x71\x14\x4d\x76\xca\xef\xa6\xe5\x39\xaf\x6e\x96\x8b\xa7\xaa\xba\x12\x77\xf5\x79\xe5\x38\xf9\x68\x79\xcd\x21\x51\xc8\x0b\x63\x88\x63\x47\xe9\xb2\x8f\xa1\x91\xdb\x28\xf6\x9d\x0d\xdd\x63\x3d\xc3\x6c\xe0\xd7\x7e\xc8\x9e\x86\x85\x39\xb7\xf6\x5d\x83\xd1\x67\xbd\x9f\xcb\xde\x4e\x2a\x5d\xe7\x48\x80\x07\xfc\xb6\xe7\x77\xea\xf5\xb1\x9c\x4c\x44\x25\xca\x2c\xee\x34\xca\x9c\x4c\x82\x3e\xcb\x0a\x30\x81\x15\x77\x75\xf8\xfa\xde\x71\x84\x76\x39\x7e\xb7\x63\xe7\x5f\x8e\x8e\x5c\xb1\xe0\x4b\xf6\x9e\x29\xd9\x0e\x5a\xb1\x9f\x28\xed\xd2\x35\xf8\x41\xa5\xf9\xfe\x05\xd7\x94\x74\x69\x07\x07\xc9\x46\x6f\xea\x68\x37\x7b\xd1\xed\xe1\x1e\x2a\x23\x4d\x68\x53\x00\x6c\x16\xd8\x80\x43\x86\xcd\xd9\x63\x20\x6a\xc0\x26\xe0\x47\xaf\x9f\x1c\x82\x7e\xba\xc5\xc9\x45\x60\xc8\x5a\xc7\x22\x30\xe4\x8d\x9c\xbd\x42\xd1\xe4\x6f\x19\x67\xe2\x55\x53\x1d\xe3\x03\x2d\x08\xeb\x28\xf7\xa1\x2b\x22\x74\x41\x9b\x5a\x12\x0f\x2f\x2f\xe8\xe4\x86\x45\xf1\xca\xc3\x49\xa7\x5a\xfe\xa1\x97\x85\x99\x1e\x14\x6a\x75\xac\x89\x4f\xb4\x5b\x11\x70\x25\xf1\x93\xf6\x1f\x97\xe7\x67\x43\xa4\x44\x72\xb2\x4e\x77\x64\x67\x43\xb2\xb0\x57\xe9\xb5\x73\x72\x57\x57\xdc\xfb\x53\x8a\x16\x4f\x04\x0a\xa5\xff\xe0\x42\x79\xc8\xc8\xc1\xe4\x13\xfc\xf1\x6b\x7a\xbf\x88\x1b\x31\x9c\xa8\xea\x84\x67\xb3\x40\x5e\x10\xbf\x64\x40\x76\x14\x47\xd0\xbb\x0e\x34\x61\x27\x3d\x35\xd0\xfb\xc8\xe5\x8a\xbd\x9f\x6a\x37\x37\x24\x81\xd6\xe9\xf1\xa3\xfe\x80\x75\xe3\x33\xa9\x6b\x51\x82\xa3\x72\xdf\xbc\xb6\x72\x48\x41\xc9\xc2\x01\x2d\x5c\xd6\x03\xba\xa3\x74\x3f\xc8\x9d\xd0\x03\x1b\xae\x29\x97\xb3\x56\xe6\x70\xe7\xae\xea\xbe\xd3\x10\x98\xaa\x9a\x5d\x43\xee\xb6\xd8\xf4\xdf\x23\xcc\x6c\x0f\xca\x43\x42\x36\xdf\x11\x1e\x0a\x65\xfe\x5e\xc3\x67\xdd\xc0\xab\x09\x66\x03\x7d\xbe\x8e\xae\x10\x33\x61\x4b\x7e\x78\xbb\x43\x26\xf4\x05\xaf\xb4\xf0\xb0\xe4\x86\xf1\x84\xab\x86\xac\xd9\x18\x9c\x41\x2a\x4f\xbc\x7c\x32\x92\x9e\x68\x85\x72\x59\x59\x63\x61\x86\x33\x1d\x0b\x9c\x6b\xc3\xd4\x67\x6a\xbe\xe0\x95\xd4\xe8\xd9\x24\x22\xb9\x74\x03\x0c\x4e\x10\x78\xb8\xe9\x03\xfe\x6c\xe0\x2c\xf3\x27\xc1\x32\xff\x52\x96\x55\x02\x04\xbf\x9c\x69\xb1\xe0\x15\xaf\x85\xd3\x93\x60\x70\xc1\xa8\x15\xe3\xb7\x4a\xe6\x36\x7b\x65\x78\x57\x59\x83\xbb\x7e\xd3\x62\x7a\x83\xb2\x0e\x27\xcd\x9e\xa8\x67\x62\xcd\xc4\x9d\xd4\x35\xde\xd1\x80\x0f\x1d\x57\x82\xdf\x68\x5b\xca\x4c\xad\xd8\x37\xa5\x42\xb8\xac\x6f\xcd\xc5\x6f\x2c\x4c\x69\xa8\xb7\x94\x0f\xd9\xa5\x32\xdc\xf0\x92\x46\x12\x7c\x61\xdb\x76\x39\xe7\x98\x97\x02\x63\x73\xa9\xb3\xa5\xd6\xe0\x9b\xb4\x74\x8c\x39\xb9\xcb\xcc\xd4\x7c\x34\xe1\x99\x18\x2b\x75\x83\xf2\xa4\xd1\x62\x59\x14\xa3\xdd\xdd\xdd\xaf\xfe\x36\x74\xc4\xab\x16\xba\x26\xb7\xd0\xec\x80\xde\xbc\x86\xce\x67\xe7\xcb\x8b\x53\xd8\xdf\x8d\xfb\xf4\x77\x36\xa1\x5a\x95\xa2\x3a\xb6\xed\xc3\x31\xa5\xd2\x68\x1a\x86\xce\x6b\xe9\xde\x03\x32\x9d\x5d\x6e\x27\x9a\xd0\x67\x8d\xb2\x70\xf5\x05\x4d\x1f\x4a\xef\x19\x99\xe1\x05\x3f\x94\x62\xa7\x12\x7a\xb1\xb6\x5b\x39\x88\x84\x8f\x34\x51\x96\xd3\x2b\xb5\x5d\x29\x55\x1f\xa1\x73\x5f\x51\x9d\x58\x01\x60\x73\x03\x05\x8e\x65\xb4\xed\xd7\x79\xf5\xb4\xe2\x53\x1a\xd6\x54\x31\xc3\x52\xe5\x00\x7a\x06\x03\x7c\x7c\x7e\xf4\x12\xb8\xe7\xb3\xf3\xe3\x13\xd0\xf0\x7a\x78\x96\xa7\x17\x87\x3f\xb8\xbc\xf6\xba\x92\xab\x0c\xf4\x06\x12\xed\xf9\x2e\x59\x38\xdb\x4b\xd7\x19\xcd\xd6\x3e\xa1\x07\x8b\xd2\x0c\x4e\x8b\x8e\xe4\x2a\xdb\x89\x87\x74\xfa\xff\xb1\xf7\xed\xef\x6d\xdb\xc8\xa2\x3f\xaf\xff\x0a\x24\x9b\x46\x52\x22\x53\xb1\xf3\x6a\xe5\xb8\x39\x6e\xec\x6c\x7d\xda\xd8\x3e\xb1\xd3\xdc\xbd\x3e\xbe\x0e\x44\x42\x12\x6b\x8a\x50\x09\xca\x8e\x36\xf6\xff\x7e\x3f\xcc\xe0\x49\x82\xb2\x1c\xbb\xdd\xdd\x73\xba\xfb\x7d\x8d\x4c\x82\x03\x60\x30\x18\x0c\xe6\xc9\xca\x7d\x17\xc0\xdb\x82\x4f\xde\xbb\xdd\x04\x51\x8c\x08\x55\xab\x77\x53\xe4\xdd\x6a\x7a\x4a\x31\x69\x54\x0c\x82\xa3\xae\x02\xf2\x0c\x2b\x67\x34\xbc\x9b\xd2\x33\x26\x88\x60\xb9\x00\x56\xf1\xeb\x4c\x94\xf2\xcb\x09\x4d\xa1\x03\x42\x01\x4f\xa4\xa0\xa0\x50\x2e\xc7\x34\x57\x2c\x87\x50\xf2\xa9\x2c\xe8\xf4\x07\xf0\x5f\xc3\x63\x18\x8d\x87\x8c\xc6\x63\xd0\x4a\x41\x67\x98\x7d\x40\x29\x8b\x4a\x3e\xdd\x1a\xf0\x42\x25\x21\x55\xb1\xe4\x25\x9f\xbe\xa1\xf9\x01\xe6\x9a\x8b\x69\x6e\x72\xcd\xd9\x17\x47\x18\x36\x6b\xdf\xab\x38\x5a\xdd\x6c\x7b\x86\xcb\xf7\x66\xac\x02\xb8\x12\xf5\x20\x1e\x9b\xf8\xac\x92\x4f\x77\x26\xd3\x32\xc5\x84\x6b\xf8\xcb\xbc\xc8\xe3\x62\x3e\xc5\xd4\xb6\x4c\xff\xb6\x2f\x13\xf5\x22\x71\x1e\x16\x05\x78\xd8\x43\xbd\x49\xfd\xf0\x67\x4e\x13\x96\x6c\x63\x06\xfa\x0c\xfe\x30\x79\xe8\xcd\xeb\x77\xac\xa4\x89\xdb\x64\xa2\x1e\xb8\xcd\x0e\x55\xcc\xbd\x6c\x61\xa3\xee\x4b\x3e\x3d\xa0\x33\x08\x71\x98\xca\x7f\xcd\x43\xc4\x9d\x8b\x38\xf9\x08\x83\x73\xa6\xf8\xcb\xbc\x28\xf8\xa8\xc0\x78\xbc\xa9\xfa\xa9\x5f\xbd\xa7\x25\x33\x18\x94\x47\x89\x8f\xbd\x43\xc6\xce\x74\xd4\xfd\x99\xc5\x84\x7c\xac\x62\x46\xf1\x97\x79\x51\xd2\x0c\x93\xdc\x0b\xfc\x65\x5e\xcc\xc4\x14\x33\xd9\x08\xfc\xa5\x5f\x1c\xa5\x13\xf6\x61\xaa\xd2\x4d\x97\xe9\x84\xcd\xa6\x26\xdd\x74\xc9\xa7\xbf\xf0\x6c\x36\xb1\x23\x3c\x87\x3f\xfd\x31\x7e\xa4\x10\x29\xd4\x27\xad\x0b\xfc\x55\x89\x65\x90\x14\xfb\x26\x4b\xe3\xb3\xfd\x7c\x8f\xe7\x90\x9b\x12\xeb\x97\x6a\x6e\x2f\x37\x64\x47\x57\x00\x79\xc7\x07\x69\xc6\xc8\x21\x1d\xd2\x22\xb5\xce\x21\xa0\x85\x41\xd7\x9c\x6c\xae\x1c\x38\xe5\xc5\xce\x7a\x7c\xf3\x1c\x01\xe4\x3c\xc7\xf4\x98\xd8\x89\x39\x65\xbb\xaa\x68\xf4\x84\xd1\x5c\x90\x84\x65\x6c\x84\xe6\x5b\x00\xa2\xe5\x17\xa1\xcc\xb8\x08\x4b\xf6\x1a\x41\x99\xea\x0b\x5e\x9c\x51\x48\x3f\xa8\xbc\xc2\xe4\xf1\x3b\x1b\x91\x34\x3f\xe7\xd9\x39\x13\x52\xac\xa6\xf1\xd8\x2b\x00\x03\x90\x11\x90\x11\xbc\x38\x5a\x73\x30\xd8\x0c\xca\xb1\x3b\xba\x31\xa5\x1a\xfb\x6d\x96\x16\x67\x62\x22\xdf\xf1\x62\xd4\x1b\x64\x7c\xd4\xa3\x45\x3c\x4e\xcf\x99\xe8\xad\x3f\x59\x7b\xd2\x7b\xf2\x5d\x0f\x80\x9f\xc2\xdc\x4f\x13\x96\x81\xce\x0c\x21\xfd\xe7\x4c\x94\x50\x5c\x27\x2d\x95\x62\x14\x15\xc4\x38\x51\xe3\xde\xa4\xc5\xa6\x0b\x5d\xd5\x1b\x64\x9b\x92\xab\xea\xf3\x84\xe6\x73\x84\x27\xa5\x80\x33\xc6\xb0\xc2\x3a\x2f\x48\x5a\x46\x64\x8f\x97\x58\x27\x26\x05\x0d\x5c\xce\x94\x5c\x0d\x85\x6e\xa4\x28\x3d\x66\x38\x51\x33\xf1\x54\xac\x28\x59\x68\xc2\xcf\xb1\x5a\xb7\x31\xe3\xec\xe7\xd9\x5c\xe2\x1d\xb0\xaa\x9d\xee\x74\x85\x5d\x45\x0a\x82\x4c\xe8\x7c\xc0\x5e\x43\x86\x74\x89\x19\x35\x9f\x9a\xf6\xdd\x3f\x44\x04\x2b\x77\x51\xf4\xda\xde\x7f\xe7\x6a\x57\x29\x58\xec\x27\xf6\x60\x0e\x1e\xd7\x39\xfb\x5c\x82\xa5\xb0\x5b\x2f\xe1\x7e\x44\x47\x48\xb5\xc6\x16\x2d\x71\xfb\x13\xda\xa3\xcd\x87\xee\xbd\xe7\x9e\x79\x5a\x75\x87\x53\x5f\x3a\x56\xf8\x98\xe7\x65\x9a\xfb\x05\x29\x41\x76\x55\x20\x20\xa0\x45\x41\x3b\x56\x9f\x9f\x58\x2d\x80\x1e\x8a\x3c\xe3\xc0\xf8\x61\x21\x5b\xa7\x14\x50\x17\x28\x20\xae\xa3\x0e\x2c\xcd\xdb\x82\x31\x25\x6d\xcb\x36\xaa\xae\x3e\x96\xe8\x77\x89\x47\x8a\xdb\x54\x88\xd9\x04\x4c\xc5\x17\x40\x4a\x03\xe6\xc3\x9a\xcc\x4a\x0a\x1e\xc7\x1f\xb5\xb6\x36\x93\xf2\xfd\x5c\x59\x38\xec\x96\xd2\xbe\x85\x54\x98\xf8\x0e\xf9\x3f\x15\x5c\x34\x84\x21\xd9\x21\x5b\x97\xb9\xab\x8a\xbb\x07\xd6\x50\x4e\xc1\x97\x9c\x7c\x42\x96\x06\x69\x14\xc5\x0f\xf3\xdd\xed\x4f\xa8\x97\x90\x83\x92\x44\xfd\x09\xa6\x86\x4c\x50\x7c\xd2\xfd\x0a\x86\xaa\x84\xb7\xbc\xc0\x2f\xdb\x2e\xb9\xe8\x31\x58\xcb\xa9\x7f\x1f\xab\xae\x41\xb3\xf5\xcd\x77\x7d\x94\x70\x7f\x2c\x27\x99\xb3\xbc\xe4\xb5\xf9\x79\x2c\x3f\x38\x71\xaf\x9a\xae\xdb\xa3\xf9\xb6\x16\x05\x42\x70\x1f\x28\xf1\xb5\x36\x11\xf9\x51\xa7\xd1\xd5\xd0\x9d\x86\x36\xb1\xf9\x9e\x5e\xea\x0e\x68\x49\x33\xe8\x82\x0c\xab\xb2\x25\xef\x45\xc6\x4f\x5d\xdd\x8a\x20\x58\x5f\x99\x0d\x2d\xeb\x90\x0f\xc1\xc5\x56\xee\xef\x88\xec\xe6\x64\x77\x67\x6d\x4d\x7f\xeb\x02\x75\x3f\x07\x6f\xc1\x57\xba\x26\xdb\xf7\xa8\xe7\x07\x23\x00\x52\x96\xad\x7b\x80\xb7\xca\xd2\x05\x24\xe4\x1d\xeb\x22\x2d\xc7\x8a\x0e\x1d\x38\xb3\xbc\x4c\xc1\x41\x70\x4c\x05\x1a\x9d\x20\xa6\x01\x5c\x1f\x13\x32\xc8\xe4\x95\x37\x21\x74\x44\xd3\x3c\x72\x41\x5e\x7f\xb5\x4a\x85\x98\x31\xd1\x7b\xf1\xf2\xe9\xda\x5f\xe1\x77\xcc\x27\x90\x7d\x7d\xfd\xf9\xb3\x6f\x5f\x3e\x7b\xfe\xfc\xa9\x81\x07\xc5\x85\x69\x7e\xc8\x40\x3f\xaa\xa7\xbc\x49\x4a\x3a\xaa\xd6\xa2\xbb\xbc\xb4\xeb\x01\xaf\x5a\x1b\xde\xbe\xaf\x81\xf1\x19\x80\xf0\xde\x3d\x58\x0b\x12\x7f\x68\x03\x5a\xba\x09\x52\x85\x72\xc8\xae\x90\x66\x73\x57\x60\x85\xa8\xf5\xb7\x90\x46\xaf\x37\x56\x5f\x5e\x92\xe0\x07\x01\x9b\xb4\xe7\x41\xbb\xc7\xf9\x74\x51\xcf\xc6\x3a\xed\x7d\xf5\x91\x19\x2b\x23\x58\x34\x95\xce\x20\x9b\x6b\x61\x00\xf5\xc2\x24\x99\x81\x3a\x43\xae\x7e\xea\x46\xb7\x7d\x64\x64\x90\xd1\xf8\x0c\x2e\x05\xa9\x52\x31\xb8\x97\x83\xaa\x43\x36\x34\x54\xa6\x54\xc9\xa1\x99\xd2\x6f\xa5\x39\x39\x3c\x7c\x1f\x55\x67\xb0\x64\x94\x60\xfd\x88\x72\x8f\x8f\x10\xcf\x01\x22\x28\x66\xcc\x09\x51\xf0\x49\x52\x9f\xd2\x2d\x9f\xf6\x16\x28\x1b\xf5\x28\x16\xd2\x20\x59\xfa\x36\xae\xe7\xd4\x48\x57\xcd\x87\x7e\xe5\x88\xb0\x5a\x79\x97\x7a\x9b\x46\xeb\xf4\xd0\x8c\x40\x6d\xdf\x6c\x15\x8c\xc0\x09\xa6\xaa\x09\x42\x30\x08\x54\x0a\x54\x67\x00\x84\x4b\x2a\x57\x6e\xeb\x7e\x64\xe8\xc1\x82\xf3\xbc\x8e\xa5\x14\xe5\x86\x55\xa5\x39\x4d\xce\x59\x21\xf7\xa0\x13\x49\xe4\x46\x30\x90\xa3\x71\x2a\x2c\xb4\x81\x7c\x28\xc8\x0c\x4e\xed\x2c\xcd\x19\x2a\x50\x8d\xee\x49\x3b\x1e\x19\x13\x2d\xe8\x9a\x90\xe1\xa3\x6f\x78\xe0\xa8\x35\xe4\xb6\x14\x1a\x6b\xe5\x4f\xf1\xa4\xf7\x45\x3d\x17\x12\xbe\x3f\xa0\x73\x79\xc9\xeb\x92\x0b\x1a\x58\xdf\x45\xa2\x9e\x11\x59\x7f\x04\xa5\x5b\x18\x80\x2b\x12\xa6\x64\x93\x3c\xd9\x20\x29\x79\xe5\xf7\xad\x3c\xcf\xe4\x9b\xc7\x9b\x36\x46\xd1\x95\x22\x37\xfd\x2f\x8e\xd3\x93\x0d\xaf\x8d\x36\x14\x55\x5a\x91\xc7\x64\x6d\x39\x41\x70\xb1\x84\x63\xba\xb8\x4b\x11\xa7\x51\x0c\x31\xbd\x2d\xee\xa3\x2e\x7f\x2c\x3c\x3d\x16\x40\x5d\xbc\xb3\x75\xbf\xbf\xa8\x90\xaa\x90\x3c\xb5\xe4\xd6\xaf\x8e\x21\xe0\x1c\x2e\x2f\xa3\x25\x5b\x0a\xde\xe2\x23\xb0\x61\xb8\x4b\xef\xaf\x06\x7c\xfd\xef\xe3\x48\xfe\x8a\x2c\x42\x5a\x23\x2b\xf2\x94\xd3\xbe\xa3\x4e\xd3\x6d\x13\x55\xd5\xc6\xdf\xcc\xb0\x9c\x8f\xda\xe6\x20\x05\x3d\x73\x49\x32\x6a\x6e\x89\xab\x72\xcc\xd2\xc2\xc6\x9d\x28\xc8\x5d\xc2\x3e\xc7\x6c\x5a\xea\xba\xaa\x92\x75\x78\x5a\x4b\xf4\x45\xfb\x1a\x35\xab\x55\x16\x6b\x94\xe8\x27\xbe\x05\xa0\x3a\x29\xed\xbc\x7c\x8d\x9d\x40\x13\x6f\x05\xd8\x48\xf2\x0f\xb9\xf6\x22\x8d\x0d\x48\x40\x6d\x47\xfb\x90\xde\x00\xb8\x7b\xf1\x0a\xf1\x03\xd0\x82\x2f\xf2\x62\xdd\xb0\xb4\x77\x88\xd4\x8e\xfe\x43\x90\x89\x60\xc0\x08\x6a\x98\x06\x73\xbd\x30\x66\x5c\xaf\xad\x06\xe5\x82\xe9\x68\x0e\x0b\x0c\xca\x28\x91\x57\x87\xbf\xfc\xed\x7b\xb9\xaf\x5e\x4d\xb6\x8e\x7e\xfc\xbe\x1a\x46\x15\x1c\xf1\xe5\x25\x31\x35\x9f\xc1\x6c\xe7\xa5\x30\xe8\x92\xd6\xab\x6f\x04\xe9\x81\xf5\x08\x75\x43\xb3\xe9\x54\x05\x3b\x49\x1c\x45\x64\x2b\xbb\xa0\x73\x01\x56\x24\x1b\x07\x05\xd6\x11\xa0\x3d\x15\x73\xa5\xa3\x9f\xd1\xfe\xd7\x09\xc6\x13\xa9\x6b\x20\x98\xab\x5a\x9e\x58\xf3\x46\x11\xb3\xdc\x97\xf0\x9a\x9c\xa7\x94\x38\x86\x18\xc1\x49\x5a\x0a\x72\x7f\x4a\x0b\xc1\x8a\xd5\x34\x17\x92\x0d\x24\xf7\xc9\x30\xa3\x23\xe2\x6e\x79\x55\x44\x1a\xc4\x4c\xa8\x3f\xec\x04\x94\xb1\xcf\x2c\x9e\x95\xcc\x59\xe4\x24\x3d\x27\x9b\x64\x91\xe5\xa9\x95\xa4\xe7\x36\xbe\x37\x49\xcf\x3d\xf3\x50\xeb\x95\xb2\xbe\xbd\x02\x3c\xf4\xd4\x5f\xad\x0d\x39\x14\x26\xb2\x34\x2f\x57\x55\x75\x51\x48\x92\x68\xc7\x79\xa4\xe2\x45\x47\x33\x5a\xd0\xbc\x54\xfa\xb2\x79\xca\x32\xb0\x23\x22\x16\x74\x20\x98\x33\xe2\x61\x5a\x88\xf2\xcd\x38\xcd\x12\xb2\x09\xc3\xb1\x0f\xcc\x20\xcd\x0e\x54\x4d\x90\xe3\x42\x9b\xb6\x6d\x5e\x3f\x02\x95\x4c\x8e\xe5\xc0\x53\xd1\x70\x6d\xef\xf5\xc8\x83\xb7\x19\xbf\xd8\x95\x57\x53\xf2\xc9\x43\x97\xa9\x8a\x3d\x50\x07\x82\xd2\xe5\x7c\x64\x03\x62\xc8\x52\x84\xc6\xb9\x68\x0d\x70\x87\x7d\x81\x6a\x9a\x66\x70\x57\x8d\x47\xd2\xa1\x36\xc2\xc2\x8b\x41\x41\xf3\x78\xec\x1e\x23\x48\xe7\x9f\x0c\xa4\xcb\x4b\xe2\x14\xde\xa6\x03\x7e\x6e\x1c\x4f\x65\x73\x4a\xde\xa6\x05\x1b\xf2\xcf\x64\x30\x1b\x45\x6e\x37\x5f\x69\x35\x7d\xf1\xed\x77\x2f\x9c\xad\x9d\x27\x0d\x60\x06\xb3\xd1\x3f\xd2\x2c\xa3\xd1\x84\xe3\xbf\xbc\x18\xf5\xc4\x98\x5f\x9c\xca\x81\xc4\xa3\xf4\x75\x9a\x6c\xae\xad\xbf\x7c\xb1\xfe\xec\xc9\xd7\xa0\xd4\x3d\xa9\x5c\x24\x2e\x0b\x64\xef\xb0\xed\x5b\x56\x1d\xb6\xbb\x42\x1c\x35\xe7\x92\xdc\xd7\x84\xda\x04\xd8\xd8\xc3\x87\xf5\x84\x42\x3a\x4a\x0d\xd3\xe6\xd8\x51\x63\x0e\x90\xd6\xb1\x52\x4d\xca\xce\x94\xcb\xb4\x6a\x70\x82\x41\x8c\xd7\x64\x28\x72\xb3\xf1\x38\x2e\xd7\x6a\x9a\xd5\x38\x46\xaf\xcd\xb1\x6c\x52\x8f\xe3\x0d\x65\x28\x28\xe9\x08\x63\x46\xd2\x8a\x13\xb4\xf6\x3d\x55\xde\xdb\x7e\xb4\xe9\x84\xa9\x78\x3f\x94\x52\x08\x55\x19\x2e\x9c\x00\x53\xb0\x58\x01\xd7\x84\x58\x60\x10\x7c\x30\xc8\x35\x77\x78\x3c\xd6\x59\xa8\xf0\x6d\x23\x4c\xea\xa5\x54\xd6\x53\xf7\x68\xaf\x4b\x36\x52\xea\xde\xe3\x09\x93\xa2\x0d\xb8\xf0\x5d\x6b\x8d\xfd\x4a\x49\x23\xf2\xfb\x83\xde\x3a\x4d\x5a\x7e\xcf\x37\xda\x15\xd7\x40\xe1\x5f\xd0\x8b\x83\x66\x01\xcc\xb5\xc5\x2f\x2b\x0c\xb8\x50\x01\x9d\x4d\xfe\xdc\x9e\x3b\x78\xe0\xbb\x86\xa0\x19\xb5\x19\xee\x55\x63\x3b\x1e\x3e\x74\x96\x27\x12\xf2\xb1\x44\x65\xb3\x1f\xd5\x37\xc2\x9e\xf9\xd0\x1c\x23\x8a\x3e\xf8\x0f\x90\x6e\x14\x71\xd1\x1c\x29\x48\x6b\x4f\x41\xb8\x2e\x39\xba\xa5\x10\x31\x1b\x94\xd9\x5c\x92\x52\x73\x24\x4d\x1b\x32\xce\xb4\xb6\x2c\xa1\xba\x67\x6b\x35\x5a\xc5\x0d\x74\x54\x94\x68\xee\xdb\xef\xe8\x19\x43\x79\xc9\xd8\x1d\x40\xc8\x4a\xc5\x3b\x3e\xcb\x41\xca\x62\x43\x5e\x30\x79\x60\xa2\x11\x6e\xae\xc4\x62\xc1\x94\x85\x50\x7b\xff\xc0\x41\x20\xfb\x11\x17\x69\x19\x8f\x21\x6f\x97\xc6\x1b\x6c\x92\x56\x0a\x45\xb0\x5b\x7d\xe7\x11\x32\x17\xf5\x08\x52\xc1\x7a\x56\xf8\x76\x4b\x19\x91\x5b\x5d\x34\x20\xb7\x5c\xeb\x92\x99\xf3\x54\xc5\x30\xea\x95\xd7\xcf\x01\xa3\x1b\x4e\x77\x90\xe9\xd2\x1b\x00\x9d\x25\x29\x37\xfd\x5b\x21\xca\x18\xd8\xb4\x1b\x80\xeb\x6f\xa0\x5a\x1b\x6d\x04\x26\x3a\x4a\x73\xd7\x4d\xa0\xaa\xb1\x73\x5e\x55\x55\x80\xf0\x79\xc7\x57\xd6\xd5\x30\x01\x8d\xba\x6e\x0f\xc7\xf0\xe8\x24\x88\x91\xba\xe9\x66\x69\x1c\xa9\x84\xf9\x0b\x97\x64\x07\x5d\x05\x8c\xcf\xc0\xad\x16\x25\x9d\x8c\xbc\x25\x81\x62\x42\xb7\xef\xff\xf7\xa6\x25\x2c\x94\xba\xa8\xb3\xf7\x0c\x92\x89\x43\x11\x01\xf8\xb1\xec\x28\x0f\x67\x03\xc8\xd0\x4d\x5a\x42\xff\xba\xcd\x48\x55\x54\xe3\xe2\xc1\x1e\xf1\x11\x94\xec\x21\xad\x52\xff\xba\xd5\xa2\xe6\xd3\x99\xdd\xd7\x69\x9e\x96\x1f\x0b\x2a\xcf\xcb\xc3\x92\x56\x54\x30\x15\x7e\x6d\x3b\x19\xb1\xf2\x47\x2e\xd0\x16\xbb\xf8\x8b\xe0\x8c\x94\xa2\x5b\x4e\x29\x35\x3f\x03\x73\xea\xf5\xc8\x5b\xf0\x67\xcc\xcb\x82\x67\x19\x4b\x2c\x5b\x15\x92\x23\x52\xbc\xba\x69\x63\x3c\x2a\xc1\x95\xba\x26\xd3\xba\x70\x0b\xab\xe4\x44\x7b\xef\x44\x64\x47\x45\x67\x95\x60\x5d\x80\x54\x51\x86\xb5\x68\x21\x78\x59\xad\x7a\x4b\x83\xb5\xcc\xbe\x86\x76\x3e\xc5\x64\xd6\xe6\xaa\x63\xcf\xcb\x6b\x50\x18\x42\x7a\xe5\xac\xaf\x7d\x53\xe7\x1d\x90\x9c\xb3\x71\xd9\xaf\x83\x17\x1c\xc3\xfa\x9f\x4b\xbf\xd4\xd2\x1b\x1b\x65\x23\xf6\xaf\xc1\x64\x10\xfb\x4f\xff\xc4\xfe\x35\xd8\x4f\xd8\x90\xce\xb2\xb2\xbf\x80\x43\x82\xcc\x45\x85\x60\x45\x09\xf9\x0f\x70\x3b\x82\xb0\xaa\x14\x97\x8e\x29\x60\x85\xdc\xd6\xbb\x66\xba\xc0\xb3\x06\xe1\x37\x4a\x68\x1e\xd7\x0e\x48\x89\x56\x40\xb4\xb9\xba\x30\xda\x6f\x96\x4f\x94\xc4\xc8\x0b\x92\x70\x90\x14\xe3\x8c\xd1\xdc\x02\x9b\x4d\x49\xce\x62\x26\x04\x2d\xe6\x2a\x0d\x12\x38\x39\x9d\xb3\x02\x2a\xa9\x48\x6a\x8a\xcf\x94\x98\x39\xe1\x85\xc9\x30\x0a\xcf\xdb\xa1\xe3\x88\x8b\x12\x04\x55\x45\xe7\x37\x64\x57\xb5\x2d\xf3\xef\x37\xe3\xeb\x36\xe8\x75\x27\x44\x0d\xde\x2d\x59\x7e\x0d\xde\x35\x4c\xa7\x79\x23\xd5\x54\x69\x3c\x7f\x83\xae\x69\x8d\x36\x6e\xb3\x7c\x47\x2a\xdc\xb4\x24\x13\x3a\x07\xa5\xe5\x80\x11\x61\xdc\x0c\x0f\x7f\xf9\x5b\x97\xbc\xa3\xe5\xf8\xdd\xcf\x72\xed\x2a\x71\x03\xd6\xcf\xe4\x5a\x17\xcb\xc0\x02\x5d\x55\x27\x76\xa5\x3c\x98\xdf\xd0\x2c\x9e\x65\x5a\x41\x9b\xa4\xc3\x21\x19\xb0\xf2\x82\x69\xb7\x9c\x0b\xae\xbc\xc0\x44\x64\x6f\xe0\xb2\xd9\xe2\xbb\x77\x46\x45\xf9\xde\xdc\xbf\x73\xf6\xd9\xf9\xab\xf9\x36\x7e\x83\xeb\xb4\x0b\xd2\xaa\xa5\x20\x27\x8b\x6b\x21\x25\x9b\x36\x8b\x2e\x64\xfe\xa5\xea\x08\x31\xf6\x0b\xed\x56\xb7\xf8\x8e\xe8\x71\x20\x03\x64\x91\x34\xe8\x62\xc0\x2c\x83\xe9\x6d\xd1\x97\xb5\xa9\xc9\xff\x55\x67\x75\x7c\xb2\xec\x5e\x6a\x1a\x6d\x65\xd9\x6e\x34\xde\x80\x8b\xd0\x6d\x46\x5c\xd9\xad\x8d\x23\x5e\xbf\xc5\x88\xd7\xef\x74\xc4\x35\x1e\xdd\x38\xe6\xa7\xb7\x18\xf3\xd3\x3b\x1a\x73\x85\x87\xb9\x63\x75\x07\x14\x1a\x8f\xdb\xe9\x46\x9d\x07\x1a\x50\x86\x0f\xfa\xbe\x3e\x01\x6f\xa0\x7f\x63\x96\xd9\x28\x2f\x39\x9e\xc3\xbe\xcc\xe4\xb8\x78\x6c\x98\x84\xfe\xf3\x8c\x61\x1e\x19\xe7\x81\x72\x48\x35\xfc\x4a\xe9\x71\x1c\x27\x63\x83\x6a\xd7\xc9\xf8\x5a\x1f\x63\x72\x79\x49\xee\xd9\x55\x5a\xd0\xca\x34\x32\x0e\xc6\x64\xb3\xea\x5b\x10\xf2\x53\xbe\xc6\xef\x44\x73\x5d\x70\x3a\x51\x04\x17\xf2\x63\x56\x13\x36\xd8\xd1\x53\x86\xef\xaa\x6a\x2b\xf3\xa2\x3a\x21\xf3\x79\x45\x71\x85\x49\xd1\x1c\x44\xfb\xaf\x49\x75\x11\xb0\xfa\x81\xfe\xdf\xd5\x4a\xb8\xe1\xb1\xe9\xee\x84\xf8\x4e\x97\xbe\x9e\xeb\xc6\x3e\x34\x55\xa7\xc5\xba\x27\x8c\x72\x50\x8c\x8c\xad\x51\x05\x06\x62\xee\x0b\xa6\x9c\xf3\xc1\xab\x16\x43\x38\x52\x31\xa9\x39\x03\xfe\x2b\x3b\x52\xe2\xec\x76\xd1\xc2\x9b\xb7\x4a\x08\xca\x20\xc6\xeb\x4b\x78\xd9\x5f\xee\xc2\xc1\xd1\xb1\xdb\x52\x4c\x80\x4b\x33\xac\x28\x40\x76\x87\x20\x46\x1b\xed\xab\x1e\x82\x13\x0c\x81\xb7\x36\xe7\xda\x37\xa6\x98\xcc\xfd\x7e\x8c\xda\xf2\xfb\x64\x98\x0e\x58\xa1\x0b\xcd\x4a\x3e\x21\x8c\x19\x55\x70\x03\x8b\x2a\x9f\x50\xef\x06\x89\xed\x50\xd2\xaf\xd8\x8d\x81\xb2\xbd\x53\xc0\x25\xed\xe6\xe3\xc1\xa3\xcc\x2f\xfe\xdd\x97\x66\x19\xe1\xe0\x72\x8a\xae\x31\x89\x76\xe6\x49\x71\xd2\x34\x49\x9c\x34\x94\xbf\xcd\xd8\x0c\x53\x04\xe9\x6c\x3e\x0a\x03\x8c\x5c\x8c\xd3\x92\xa1\x2b\xab\xf2\x7e\x85\xb9\x91\xe9\x98\x0a\xe3\xfd\xa3\x67\xd2\xae\x0e\xd6\xff\xfb\xf2\x92\x1c\x9f\x74\x30\xfe\xdd\xfa\x08\x4a\xf6\xe4\x9a\x11\xea\x7c\xb3\x16\x9c\xb1\x64\x60\x85\x2b\x2e\xba\x7c\xcb\xa9\xa7\x12\x60\x99\x35\x6f\xfd\xe5\x42\x41\x3c\x0f\x6e\xb9\x29\x4c\xcf\xfe\x0b\x93\x1c\xdc\x8e\xec\x0e\x78\xf4\xff\x86\x20\x11\x7d\x6c\x54\x67\x06\xb9\x92\x05\x53\xb3\xc1\x10\x12\xdd\xee\x93\xc9\x0b\x24\x9f\xea\x4e\x3e\xd9\x71\x84\x8f\xac\x3a\xf2\xdc\xce\x9b\x8f\x2c\xb9\xae\x96\x56\xe0\xe4\xd6\x7f\x2c\x38\xe7\xaa\x27\xd9\xb5\x47\xdd\x35\x87\x9d\x7f\xdc\x2d\x7b\xe0\xb9\x5f\x5d\x79\xc8\x45\xd6\xa5\xb0\x0b\x24\x82\x11\x85\x89\x52\x3d\x58\x6c\x2f\xc2\x6b\x98\x28\x5d\x72\x5d\x8c\x57\xdd\x89\x3b\x03\x48\x16\xae\x83\x6d\xec\xf3\x7f\x1e\x42\x03\x83\x59\x8c\xe1\x9a\x73\xe9\x1d\x84\x42\x5d\x3b\xe1\xc5\x27\x0e\x59\x78\xea\x54\xb1\xe1\xbb\x49\xfb\xbc\xdd\x1b\x41\xc8\xf1\xbf\x2a\x38\x2b\xec\x2d\x15\x37\xf2\x7b\x87\x68\xe9\xd3\x43\x7d\x6b\xd8\xb5\x3d\x34\xbe\x3e\xbc\x4b\x73\x13\xf5\x7e\xd3\x86\x75\x79\xeb\xf0\x35\xe7\xa9\x89\xc0\xf1\xa2\xc4\x16\x13\x1c\xde\xd4\x76\x9d\x34\x6c\x25\xe7\x04\x75\x4a\x3a\x4a\x14\x59\xb9\x4d\xe0\xa6\x33\x36\xba\x70\xb4\xe3\x9f\x3e\x0a\xa2\x65\xd6\x31\x1c\xa3\x66\xd0\xed\x6e\x71\x60\xaf\x8b\xa2\xd7\xb4\x3f\x65\x63\x1c\x93\x8b\xdf\x5b\x61\xf7\xe0\x5f\x34\xbe\xe9\x77\x8b\x0e\x42\xbf\x66\x46\x47\x10\xd1\x8d\x82\x34\xca\x8f\x52\xa2\x3d\x07\x6d\x23\x9f\x8d\xc6\x9a\x40\xa0\xc4\x17\xc8\x8a\x92\x20\xe6\xac\xf4\xb9\xd3\xbf\x63\xa0\x51\x88\x71\x7a\x92\x9c\x4b\xab\x55\x65\xc8\x1d\x5d\x4c\x9a\xae\x26\x68\x1e\xba\xe1\xd5\x64\x89\xcb\xc9\x57\x5f\x40\xf2\xb9\xba\x80\x98\x38\x37\x6b\x79\x0b\xdc\x3e\xc0\xd1\xb2\x1c\xb3\x9c\x5c\x38\x37\x90\x61\x9a\xc9\xe9\xa4\x25\xe1\x33\x37\x3a\xde\xde\x4a\x54\x14\x9e\xbd\x99\xdc\xea\x2e\x12\x8a\x57\xd2\x35\x4a\xea\x87\xe9\x0d\xba\x00\x71\x3d\x70\x20\x5e\x59\x77\x3b\xef\x63\x9d\x9e\x64\x6b\x3a\xcd\xe6\x46\xb1\x1f\x55\x23\xa7\x1a\x55\xf8\x95\xc0\xa9\x6b\x34\xfa\xd6\x93\x2e\x18\x20\xd5\xec\x4a\x57\x53\x86\xde\xdc\x1b\xaf\xa6\x13\x0d\xcc\x9a\xfc\x9e\x81\x62\x1b\x9e\xe3\xda\x4e\x6e\xbd\xd6\xa8\x46\x33\xee\x27\x11\x8f\x99\x64\xa6\x89\x24\x08\xeb\xb0\x66\x36\xb4\xae\x10\xd0\xeb\x69\xf9\x38\xba\x91\x4d\xf4\x83\xde\x85\x8c\x5c\xa0\x91\x8b\xa8\x14\x16\xd0\x54\x90\x47\x74\x58\xb2\xe2\x91\x8d\xe5\x41\xfb\x15\xf2\x96\x31\x15\x5e\x4c\xc2\x58\x42\xc8\x09\x7c\xa2\xe5\x48\x0f\x7f\x9f\x22\xb2\x2f\x37\xe8\x45\xaa\x22\x06\x9e\x63\x3f\xda\x7a\x93\xf2\xdc\x71\xdc\x2f\xa8\x6c\xa6\xbc\x14\xb1\xd4\xdb\xb4\x40\xff\x34\xbc\x4d\x5e\xe8\x34\xf5\x05\x9f\xa8\x4c\x57\x54\x88\x74\x94\x33\xa3\x1e\xc0\x41\x84\x4c\xaa\x15\x22\x58\x71\x8f\x1c\x4c\x5f\x0b\xa6\x52\x7d\x3d\xd5\xe7\xcb\x24\x85\x42\x2e\x3a\xff\x19\xc2\xef\x12\x31\x8b\xc7\x50\x3d\xc6\xc2\x79\x4f\x93\x94\x93\x51\xc1\x67\x53\x22\xc6\xe9\xb0\x34\x4c\x43\x02\x66\x89\x53\x00\x2a\x47\xb6\x95\xd3\x09\x4b\x48\x01\xdf\x01\x5e\xfc\x59\x40\xac\xd1\xee\x10\xed\xf7\x49\x48\xfb\x7c\xbd\xc5\xc1\xc3\xc7\x32\x06\x99\xeb\xcc\x2e\xbd\x1e\x79\x85\x8f\xbe\xf7\x50\x02\xcc\x1f\x7c\x41\x79\x1c\xcf\x0a\x45\x14\xaf\xd0\xcc\xf4\x7d\x55\x94\x83\xac\x1f\x31\xcf\xe3\x34\x4b\x81\x0c\xd4\xf3\x29\x17\xe5\x87\x65\x97\xb0\x32\x60\x3f\xd6\x4a\xee\x6a\x4c\xb2\xe8\x17\xae\x58\xe4\x01\x5c\x89\x4b\x5a\xc6\x08\x59\x90\xa6\xf4\xe4\x8e\x1f\xc5\xf1\x22\x71\xeb\x04\x03\x73\xbc\x1c\x90\xb7\x70\x36\xfe\xd3\xd1\xf8\x5f\xd5\xd1\xf8\x8f\xf7\x2d\xfe\xd3\x87\x38\x60\xa0\xbb\x6b\x5f\xe1\x7f\x71\x9f\xe0\x7f\x3d\xdf\xdf\xdf\xd3\xc7\xf7\x4e\x7d\x79\xff\x74\x10\xbc\xb5\x67\xee\x5d\x7b\xd9\xfe\xb9\x24\x77\xe5\x31\xfb\xbf\x1e\x93\x0b\x1c\x35\xac\x44\xe8\xfb\x69\x58\xa1\x8f\x79\x59\xc3\xf7\x54\xca\x6e\x79\x43\x39\x64\xa5\x5b\x17\x9e\xba\x99\xc5\x1d\xa9\xc9\x3e\xc7\xb6\xa1\xec\x20\x4e\xb1\x0c\x93\x1a\xe4\xf1\xe3\x8a\xe6\x19\xeb\xa1\xda\xa6\xc7\xe9\x49\xd4\x54\xa8\xde\xca\x20\xd5\xea\xa7\xbd\x1e\xf9\x61\x96\x66\xe5\x2a\x26\x04\xf2\x4b\xc7\x19\x4d\x08\x4b\xcc\x07\x8a\x73\xd3\x92\xae\x42\x5c\xab\xc4\xbf\xa1\xc5\x0a\xc5\xaa\x0e\xde\x58\x6a\x71\xb0\xa2\xeb\x69\x9b\xe2\x79\x75\xa5\x31\xe4\x02\xc4\x42\xeb\x58\xff\x8a\xe7\x2e\xe9\x95\x74\xe4\x38\xf1\x28\x41\x47\xde\x4c\x16\x8d\x07\x9b\xa9\x9b\xd9\xf5\x0d\x91\x6d\x2d\x6e\x59\xf1\x9f\x52\x53\xd8\xf5\x8a\x91\xea\x9c\x63\xbc\x48\x47\x69\x4e\x33\x58\xbf\xc8\xff\xe2\xab\xa3\x8a\xd7\x9e\xbc\x78\xf9\xc2\x05\x16\xa0\xd2\x88\x26\x49\xbb\x4e\x2d\x4d\x61\x9f\xcd\xae\x92\xe1\x1c\x87\x85\xa7\xed\x51\xca\x4c\xfd\xf0\x4e\x32\x1c\x9a\x3b\xd5\xe2\x04\x87\x41\x5f\x18\xc9\xb3\x4a\xb7\x46\x85\xbe\x95\x82\x4c\x0f\x39\xc1\x19\xe6\x6b\x13\xa5\x9b\x41\xae\x9a\x54\x04\x4d\x18\x58\x0f\x99\x26\x3a\x6d\xbc\x4a\x89\x00\x79\xc7\x05\x19\xa7\x49\xc2\x54\x41\xc6\x0b\x66\x72\x97\xc3\x25\xc8\xe1\x7c\x6e\x27\x3b\xd1\x28\x22\xf7\x87\x9c\xdf\xc7\x14\x75\xd8\xc1\xfd\xe1\x2b\x31\xa5\xf9\xf7\x9c\xbf\xea\xc1\x8f\xfb\x60\x6f\x86\x7e\xc0\x99\xdb\x42\x13\xb4\x4c\xc5\x10\xec\x7a\xb3\x82\x14\xec\xb7\x59\x5a\x20\xbb\x21\xfb\xfe\x03\x5d\xf9\xbd\xe4\x72\xf5\x92\x59\xcc\xc8\x94\x15\x43\x16\x3b\x1e\x25\x26\xef\xba\xc3\x87\xc8\x6e\xc2\xb0\xaa\xae\x49\xe6\x32\x55\xe5\x2b\x89\x28\x8b\x59\x0c\xb5\xd4\xe5\xf8\xd2\xb2\xe5\x60\x8c\x9f\xe9\xee\x90\xb3\x93\xf3\x14\xea\x37\x9b\x95\x30\x9e\xe9\x2c\x07\x0d\xbf\x6c\x99\x27\x69\x2c\xef\x22\x17\x63\xea\x0c\x0b\xec\x00\x36\x37\x2b\xde\xb2\x72\x9e\x30\x61\x4d\x4b\x17\x69\xc1\x12\x32\x9b\x92\x92\x3b\xe1\xfa\xc8\x4d\xa0\x4e\xa6\x7b\xbe\x4c\x90\xaf\xd0\x9c\x50\x82\x25\x87\x60\x59\xf6\x78\xc2\x54\x7d\x60\x49\x25\x35\x38\x2a\xbb\x87\x4a\xaf\xee\xb0\x76\x9b\x5f\x01\xf2\x4a\xff\xa2\xb5\x3e\x8a\xc0\x5e\x3b\x7a\xfe\x65\xb3\x24\x42\xc9\x09\xdb\x83\x9b\xdc\xb0\xc9\x1e\xe0\x9b\x40\xee\x35\x69\x29\xaa\x46\xd9\x60\x59\x9d\x86\xbe\x83\x86\x90\x05\x96\x5b\xb2\x49\x8e\xf5\xbe\xb4\xdf\x9e\x34\xda\x0f\x6f\x92\x31\xf0\x1a\x0c\xf9\x36\xb5\x7f\x27\x34\x79\x23\x0f\xe1\x6a\x85\xfc\x99\xbb\x6f\x99\x84\x58\xce\x39\xf0\x8b\x92\x35\xac\x91\xcb\xf1\x5c\x8b\x79\x51\x30\x31\xe5\x79\xa2\x8c\x47\x69\x61\x4a\xfa\xab\x92\x9f\x6e\x36\x16\xa7\xe2\x8e\x6b\xd5\xd7\x16\xa9\xdd\x7c\xc8\x5d\x8b\xfd\x32\x04\xd6\xeb\x91\x6d\x74\x87\x42\x35\xb1\xaa\x56\x91\x8f\x22\xf2\x11\x44\x68\x90\x85\x40\xd3\x94\x65\x8a\x01\x6a\xad\x79\x54\xdf\x42\xbf\x9b\xa1\x98\x5c\x5e\x3a\x7a\xa3\x1b\x49\x77\x5f\x23\xdb\xb9\xc3\x52\x02\x5e\x75\xb4\x46\xa0\xab\xbd\x30\x02\x5c\x05\xd1\xc6\xbe\x7d\x2b\x1f\x10\x5c\xf3\x82\x5e\x5c\xeb\x04\x72\x79\x29\x77\x74\xdf\xf3\x8a\xb2\x64\xa4\x72\x0a\x39\x7c\xc4\x2b\x30\x61\x9b\x6b\x82\x54\x1f\x78\xd5\x4b\xaa\xf7\xbe\x8a\x93\x86\x9c\x9f\xf7\xb9\xdc\xbb\xb6\xfb\xe0\xde\x3d\xf0\x0a\x6c\x39\xce\x37\xe6\xb3\xae\x37\xa4\xc5\x59\x60\x17\xf8\x18\xda\xdc\x42\x6f\xd3\xcf\xef\x18\x59\xd5\xc7\xec\x80\x91\x34\x1f\x32\xcc\xa8\x8b\xb2\x8b\xf1\x88\xb1\x22\x6f\x40\xe0\x3d\x6e\xa1\x77\x6a\xeb\xa4\x5d\x65\x0f\x3e\x2a\xb5\xeb\x39\xa6\x16\xd9\xd6\xc5\x4f\x31\xc1\x8c\xcd\x87\x18\x60\x54\xc2\x2b\xd2\xe5\x2c\xde\xc8\xad\xac\xad\xea\x8c\x36\xac\x04\xf6\x6e\x97\xe2\x97\x6a\xa5\xfc\x25\xd7\x42\xa5\x67\xf4\xc0\x2e\x5e\x8d\xc5\x59\x0f\xff\x88\x05\xf1\xaf\xaa\x8d\x88\x1d\x7d\x4d\x6a\x55\x0f\xd9\xde\x71\x75\x27\x78\x5e\x2e\xed\x71\xa0\xce\x7a\x7d\xac\xd5\xa3\xd6\x3d\x41\x70\xf6\x07\xce\x93\xc0\xf9\x7d\xeb\xc5\x5a\x66\xb9\x74\xff\x91\x57\x96\xcc\x13\x6c\x1a\x57\xed\xe0\x26\x89\x5c\x49\xc8\x8f\xcc\xa4\x2b\x34\x36\xba\x70\x36\x41\x17\x8f\x7e\xeb\x05\xa9\xa7\xf0\x7f\x15\xe0\x0d\xd9\x05\xc1\xa6\x6f\x3f\xba\xba\x5d\x9f\xb7\x5c\xb5\xdb\x6e\xb3\x20\xa2\xff\xa8\x51\x35\xe2\xf1\x0e\x36\xbf\x05\xfb\x4f\x64\x03\xbe\x42\x05\x7b\xf8\x6a\xd4\xe2\x91\x51\xd7\xea\x88\xf4\x1f\x8c\x7c\x4f\x9e\x2c\x79\x89\xb9\xc5\xd2\x86\xcb\x26\x86\x06\xd5\xa9\xd8\x53\xff\x8c\xdc\xff\xdf\x1b\xb9\xef\x99\x7d\x82\x46\x25\xa5\x9e\x43\xf7\x20\x70\xd4\x53\x68\x02\x5c\xa0\x89\x5f\xdb\x15\x20\xc3\xe7\x98\x29\xff\x13\xe3\xfc\xe7\x6a\x89\xe4\x88\x09\x60\x4a\xde\xe2\x86\xbc\x88\x99\x72\x07\x4c\xd2\x73\x56\x8c\x94\x13\x91\xab\xda\xfa\x91\x5f\x48\x14\x75\x65\x6b\x47\x73\x05\xc3\x84\x11\xe1\x24\x6c\x75\x9c\xdf\x66\x29\xd4\xf9\xb3\xd9\x84\x4b\x55\xed\x47\xb7\xb5\x60\x94\xbe\xad\x60\x22\xc5\xd4\xfe\xca\x31\x71\x7b\xff\x1d\x11\xa5\xbc\x8b\x82\x3f\x97\x2a\x5e\x68\xba\x48\x54\xbc\xcc\x98\xd9\x55\x32\xe4\xf2\x86\x43\x51\x6d\x2c\xeb\x9e\x70\x74\x37\x52\xe5\x72\xea\x78\x8c\xea\x6b\xd3\x9c\xb5\xc0\xa8\x6c\xff\x9d\xa3\x70\x1b\x9d\x1e\x83\x4e\x42\x47\xec\x73\xa9\x12\x17\xee\xf1\x84\x75\x01\x71\x5e\x2d\x3e\x75\x0a\x40\x75\x0d\xd5\xca\xd1\xf0\xc9\xc3\x44\x3e\xde\xb0\x3d\x3b\xdf\xf8\xfd\x2a\x26\xfa\x21\x07\x15\xef\xc2\xbe\x11\xd1\x61\x7d\x53\x7d\x14\xea\xcb\xba\x3b\x94\x02\xb0\x8d\x91\x7a\x38\x67\x3a\xc8\x9c\x64\xd4\x4a\x8c\x82\xee\x41\xe3\xe9\xf6\xff\x3b\xd6\xbc\xad\x3a\x0b\x6d\xab\x1a\xc1\x78\x85\x51\xe7\xac\xd2\xad\x73\x9d\xc7\x9a\x50\x95\x32\x33\x87\x7f\xa3\x96\x1a\x33\x60\x62\xaf\x66\xfe\x32\xae\x5d\x1a\x59\xf5\x26\x37\xc0\x99\x5a\xad\x7f\x2f\x84\x99\xf2\x39\x90\x52\x1d\xaa\x70\x07\x91\xa7\xc8\xe8\x16\xf8\xda\x55\x11\x1a\x7a\x63\x85\x49\xcc\x66\x10\xfa\x27\xa1\xcd\x94\xc1\x6d\xa4\x30\xd8\x9c\x92\xab\x56\x49\x0d\xc7\x7e\x77\x18\x0a\x10\x54\x95\x01\x00\x6f\xd6\xb5\xdc\x5b\xad\x6a\x35\x19\xb5\xf6\x60\x35\x91\xb0\x55\xb9\x39\xb3\xe0\x42\xc9\x01\xe5\x98\xcd\x5b\x4a\x27\x57\x30\x30\xdd\x80\x2c\x91\x3a\xe2\x83\x2e\xa6\x5b\x3b\x6f\xde\xeb\xb4\xfd\x52\x18\x71\x22\x0c\x54\xc8\x4e\x4c\x73\x28\x5c\x89\x85\x6e\xd5\x40\x24\xfa\x60\x2c\x0e\x7c\x33\xa8\xa8\x71\x41\xff\x35\xe9\xc0\xee\x1f\x79\xa0\x55\xf7\x10\xa6\xbc\xfd\x1a\xb2\x28\x98\x28\x79\xc1\xac\x0a\xb5\xee\x9c\x54\xdd\x2e\x4b\x0a\xd3\x61\xc8\x81\x92\x18\x56\x76\x73\xb1\xda\x20\xb0\x36\x40\x7d\x7a\x23\xa8\x15\x4f\xa0\x06\x98\xeb\x4b\xc1\x04\x74\xca\x53\x1a\xbc\x47\xb7\xf7\xdf\x81\x33\xa8\xd1\x68\x91\xcd\x4a\x24\xf0\x97\x95\xbf\x78\x79\xac\xfb\xd5\xd2\x0c\x5d\xdd\x40\xa7\x18\xee\xd7\x52\x1c\x77\x57\xfe\x12\xca\x31\xdc\x6f\xc8\x3c\xdc\x5d\xf9\x8b\x9f\x10\xa9\x5f\x4b\x90\xd4\x5d\xf9\x4b\x35\xe4\xa2\x1f\x08\xc2\x50\x90\xea\xce\xcd\xfd\x46\xa7\xe7\xca\x27\x72\x12\xfd\x80\xf0\xd3\x5d\xf9\x4b\x48\x32\xe9\x37\xc8\x2b\xb6\x79\x93\x58\xd1\xbf\x5e\xee\x58\x00\xc4\xeb\xbb\xe1\x14\xb6\x9f\x37\x1c\x3b\xfd\x6b\x8f\xa5\x66\x10\xde\x00\xc2\x4c\xbb\xbb\xf2\x97\x30\xe5\xf6\x1b\x28\x7a\xe5\xaa\xb3\x81\x55\x81\x81\xa7\x26\x69\x21\x19\x77\x3a\x99\xf2\xa2\x14\x24\x4b\xe5\x0d\x90\x4f\xd8\xea\x94\xc6\x67\x74\xc4\x7a\xa2\x88\x7b\x8f\xc0\x8e\x32\xa0\x49\x44\xde\xa6\x9f\xc9\x84\x45\x40\xec\x0b\xcb\xaa\xbf\x20\x9b\x6a\x37\xb0\xc1\x6c\xe4\xb6\x8b\x16\x7d\xb7\x81\xfb\x48\xdb\x6b\xb6\xf7\xdf\xed\x31\x51\xa2\x3b\x7b\xad\xaa\xe6\x8a\x2a\x46\x02\x92\xbf\x0d\xe9\x20\xb1\x64\x91\x17\x54\x90\x8b\x22\x2d\x4b\x96\x93\x01\x15\xf2\xc2\x9a\x9b\xb3\xe5\xb9\xe4\x93\xe8\xfe\x3d\x65\x71\x7f\xc5\xab\x8b\x37\x2e\x27\x59\x24\x9f\x47\x17\x63\x5a\x5e\x8c\x20\xeb\xfd\x64\x96\x95\xe9\x14\x30\x32\xcf\x4b\xfa\x19\xaa\x9b\xfe\x75\x4c\xc5\x2a\xcd\x57\xd5\x2d\x62\x35\xcd\x57\x45\xcc\xa7\x0c\xe0\xad\x28\x03\x8f\x5c\x0b\x38\xb3\x4c\x15\x88\x18\x3d\x37\xb2\x8c\x28\x2f\x37\x92\xe3\x24\xbb\x24\x87\x5b\x35\x13\x70\x59\x2c\xe6\xf2\x20\x68\x53\xa1\xbd\x19\xa0\x96\x6c\xa9\xa2\x55\xe5\xe0\xc8\x14\x2e\x27\x31\xcd\xc8\x80\xe5\x6c\x98\xea\x8b\x98\x00\xc7\x8a\xf3\x34\x61\xa2\xb3\xa1\x73\x58\x74\xb1\xb2\x47\x91\x13\x9e\x67\xaa\x94\x2a\x94\xa3\xa7\x82\x09\x72\x81\x85\xe2\x21\x8d\x41\x21\x58\x81\x4e\x20\xa3\xf4\x9c\x11\x8a\x8f\x48\x59\x30\x8c\x57\x62\x60\xfe\x83\x2b\x2c\x0c\x03\x56\x7a\x45\x05\xc8\x96\x50\x22\x39\x82\xfb\x34\xfb\x4c\x27\xd3\x8c\x75\xc9\xab\xc1\xf7\xaf\x92\xf4\xfc\xfb\x57\x3d\xfc\xef\x00\xf2\xcd\xeb\xf9\x0f\x66\xce\xbd\x56\x8e\x50\xd5\x79\x55\x35\x10\x52\xe5\x6a\x82\xc3\x50\x36\xd2\xb8\xcc\xe6\x1b\xf8\x15\x4e\x4a\x4e\x45\x59\x2c\x61\x42\x40\xcc\x12\xb3\x60\xf6\xeb\xf5\xc8\xab\xe9\xf7\x58\x32\xc4\x4e\x75\xc0\x46\x69\x0e\xe1\x12\x3a\xd2\x89\xc5\x3c\x4f\xf4\xbd\x50\x6e\x8c\x2c\x8d\xd3\x32\x9b\x93\x38\xe3\x02\x92\x03\x30\x53\x89\x57\x94\x5d\x28\xe4\x08\xb7\x6e\x79\x62\x0f\xf1\xf7\x84\x09\x11\xad\x7c\x35\x55\x29\xe1\x46\x67\x5e\xc2\xbf\x8e\xe4\xc0\x37\xc9\x71\x8b\x26\x09\x96\x6b\x26\x2d\x3a\x9d\x66\xe8\x2a\x0d\xe7\x23\xfc\x5b\xa6\x31\xfa\x29\x53\x79\x39\x97\x3f\x24\xf5\xeb\x7f\x87\x3c\x87\xf6\x83\x11\xdc\x8c\xe1\x67\xc6\xe3\xb3\xdf\x66\xbc\xc4\x46\x3c\x99\xc3\xbf\xe0\x0f\x3e\x98\x95\x25\xcf\xe5\xaf\x98\xa2\xbe\x44\xfe\x94\x32\x1b\xbc\x8e\x79\xa6\xfe\x81\xb0\x23\xf9\x3b\x01\x98\xda\xa5\x5a\xfe\x4c\x0b\xfc\xe7\x1c\xfe\x81\x0f\x12\x18\x03\x9b\x0c\x18\xb4\x1e\xa6\x2c\x4b\x94\xcf\xf7\x30\x1d\x39\x5d\x0d\xd3\xd1\xac\x80\x71\x0d\x39\x57\x9d\x82\x03\xb9\xfc\x17\xa2\x16\xf4\x0f\xf5\xf9\x78\x0d\xfe\xbb\x0e\xff\x7d\x0a\xff\x7d\x06\xff\x7d\x0e\xff\x7d\x01\xff\x65\xe8\xb4\x2e\xff\x45\x90\x63\x33\xfc\x31\xfe\x5d\x4e\x60\x9c\xa9\xe9\x23\x9d\x8c\xd0\x2b\x55\x4a\x37\xf2\x87\x48\xf3\x84\x7d\x06\xdf\xf7\x14\xff\x9b\x9f\xe1\xbf\xb0\x93\xe5\xcf\x09\x4d\x73\xfc\xb7\xf8\x6d\xc6\x00\xcc\x84\xe5\x33\xfd\x6f\x5a\xb2\x09\xfe\x2e\x61\xe9\x72\x0a\x18\xca\xb9\xc1\x4b\xce\x71\x6a\xf8\x5b\x95\xad\xe9\x9a\xe8\x0c\xf9\x0b\x86\x09\x23\x9f\xd2\x82\x02\xbc\x69\x46\xe5\x1e\xfc\x0c\x0d\xa6\x88\x3d\xfb\xad\x60\xb1\x46\xae\x92\x80\xba\x26\x16\x41\xfe\x02\x23\x21\x78\xd0\x4f\x26\xb4\x00\x52\x80\xe3\x0e\x7e\x68\xe2\x28\x61\x78\x25\x9b\x4c\x33\x8a\x64\x63\x64\x34\xf9\x5b\xae\x15\xfc\x18\xe3\x7f\x15\xbe\xcb\xb4\x54\x70\x0a\xfc\x2f\x8d\x01\x65\x33\x98\xc4\x05\x52\xdc\xe7\xc9\xb4\x75\xb2\xf1\xf5\x7b\xa7\x99\x23\x83\x16\x25\x3f\x94\x7f\xd9\xbd\x64\x36\x90\x43\x74\x7a\xf5\xed\xbc\x13\x3b\x1b\x67\x31\xed\x32\x58\x4c\xdc\x62\xe0\xe5\x24\x83\x2a\xe1\x23\xbc\x34\xac\x42\xa0\xb3\x1b\x07\xb4\x8d\xa4\x35\x4b\xc5\x98\x0c\xe6\x4e\xb1\x2d\xe0\x66\xab\xab\xc0\x00\x5f\x01\x96\xbf\xef\x92\x34\x8f\xb3\x59\x02\x25\x6d\x51\x7f\x87\xa0\x58\x51\x08\x7d\x12\x4a\x06\x21\xf9\xde\x90\x5d\x48\x76\xaf\x5c\x38\x56\x08\xec\x31\x96\x8e\xf2\x7d\x33\xc3\x84\x89\xd8\xae\xe1\xdd\x2e\x10\x32\x19\x6f\x9d\xf0\x91\xbb\x56\xce\xca\x45\x31\xcf\x63\x5a\xb6\x8f\x35\x7b\x3a\xe9\xdc\x62\x3c\x23\x96\x33\x29\x50\xad\x02\xab\x67\xc9\x2a\xcb\x93\x55\x79\x4a\x68\x92\xc1\xc7\x3b\x79\x62\xa8\x46\xf1\xb8\xd2\xee\x7e\x6e\x88\x87\x4f\x4b\xc3\x4c\xe0\x3f\x05\xfe\xb7\x54\x48\x03\x93\xbf\x14\x64\xb6\xf2\x18\x04\x34\x65\x5f\x55\x77\x28\x94\x8b\xfa\xe0\xfc\xd4\x45\xb3\x91\xe4\x77\x47\x74\xa4\x9f\xc9\x47\xf4\x88\x8e\x76\x11\x21\xee\x63\x44\x47\xf8\x5d\xce\x07\x45\xf8\xcd\x14\x1e\xff\x60\x31\xee\xf5\x2e\xf9\xd9\x6e\xc9\xe4\x08\xb6\x66\x25\x97\x87\x20\x54\xd6\xb7\xdf\x27\x59\xd3\x7b\x79\x33\xda\xf0\xdd\x78\x13\x77\xda\x0f\xd6\xc8\x26\x31\xb7\xd0\x36\xcf\x12\xf9\x54\x5d\x36\xa5\xcc\x42\xf3\x98\xb9\x09\xb1\xa8\x8f\xb3\x53\x8c\xbe\x6d\x7f\xb9\xea\x12\xf5\x31\xb9\xbc\xac\xa3\xd7\xf1\x87\x4f\x15\xb6\x65\x1f\x7d\xbf\xa3\xbe\xf9\xa5\x46\xad\xc2\x12\x1d\xc2\x03\x9e\xbf\x3f\xc4\x5b\xef\xbd\xcd\x4d\xb2\xea\x64\xab\x70\x07\x17\x39\x2b\xe4\xb8\x2c\xd7\x9a\x55\x57\x6c\x51\x5b\x7f\x05\xbd\x96\x56\x69\x51\xd9\x38\x37\x18\x71\x8d\x0c\x2a\x3d\x68\xc3\xe1\x21\x63\xa4\x98\x65\x0c\xf5\xfc\x8a\xfe\xcd\x8e\x50\x45\x7f\x54\x51\x40\xfd\xcd\x57\x6c\x4b\x25\x9f\xaf\xca\x43\x74\x35\xcd\xe5\xc9\x63\x26\xe9\x48\x44\xa1\x09\x82\x83\xa0\x2e\x3f\xad\xa5\x25\xef\xa1\x14\x46\xbc\x07\xd3\x56\x03\x56\xc2\xe4\xbf\x68\x99\x42\xdb\x21\x84\x4a\xef\x23\x6d\x60\xda\x04\x02\x75\xa8\x4f\x8e\x10\x6d\x1f\x52\xea\x69\x18\xa4\xe2\x10\xe6\x6b\x9f\x24\x0c\x08\xda\xf4\xbd\x4f\xac\x0b\x61\x28\x8e\xdb\x00\x28\x40\xce\x0b\xa1\x49\x92\x6e\x82\x55\x23\xf7\x85\x90\x1a\x17\x30\x44\xd6\x0b\x21\x65\xe9\x8d\x69\x61\x21\xbc\x04\xbd\x01\xed\xdf\x65\x13\xfc\x06\xca\x71\xa1\xaf\x58\xbd\x93\xf7\xed\x86\x61\xb5\xbd\x47\x8f\x64\xa3\x47\xe4\x3d\xb4\x82\xbb\x8e\xbc\x13\xc1\xc3\x9e\x31\x26\x1d\xd1\x11\x78\xa1\x7e\x4c\xcb\xf1\x01\x55\xb4\x67\x59\xb1\xa3\x61\x76\xdc\xb1\x7a\x3d\xf2\x16\x2f\x3d\x52\x68\x12\xd6\x44\x8c\x91\x55\x69\x0e\xe9\x24\xf2\x99\x98\xd1\xcc\x5c\xb0\x27\x3c\x61\x51\x84\xaa\x56\xad\x35\xac\x41\xbe\x23\x2e\xe1\x59\x3d\x83\x6a\x3e\x83\x3d\xb3\x1e\xea\xe8\xf6\xd6\xc8\x1c\xe2\xde\xd3\xbf\x82\x50\xbd\xe1\x81\x37\x2d\x6f\xd6\x81\x0f\x4a\x72\xd5\xb2\x48\x63\xa8\x29\x3b\x65\xf4\x0c\x54\x01\x82\x61\x86\x89\xdc\x66\x31\xd0\x59\x46\x27\x8c\xe6\x0e\xd2\x4d\x46\x04\x0b\x6f\x30\x2b\xab\xe3\x74\xad\xdd\xf5\x51\xd6\x46\x74\xfb\xd5\x28\x93\xbb\x84\xa6\x04\x74\x0b\x72\x8f\x1b\x2b\x80\xa9\xa2\x6b\xac\x0c\xc2\x1c\x52\x34\xcb\xc8\x80\xc6\x67\xa4\xe4\xe4\x7e\x9a\x13\x79\x92\xdc\x07\xaa\xf4\x0d\xed\xb2\x9d\x2a\x4d\xab\xc1\xc2\x05\x40\xd9\x2f\x2e\xc6\x69\x3c\x26\xa8\x8e\x18\xd0\xc4\x90\xb7\xe9\x5a\x67\x7a\xbd\x53\x0c\x16\xde\x22\x96\xc5\x82\x05\x2c\xc7\x3e\x89\x95\x15\xbe\x83\x37\x3b\xff\x11\xde\x0a\xfd\xcf\xf4\x55\xe6\x6e\x49\xc1\x9c\xdf\x66\x2e\x70\x97\xec\xfb\xcf\xe0\xa6\x58\x79\x36\xf4\x23\xfb\x6a\xd3\x2e\xfe\x85\xa6\xa9\x15\x21\xde\x0c\x8c\x76\xa4\x79\x12\x31\xcf\xfe\x90\x55\x90\xf4\xec\x63\x17\xae\xb8\x0b\x06\x46\x03\xcc\xcb\x4c\xc8\x1f\x32\x2c\xa8\xff\x08\xd6\xce\x7f\x04\x4b\xfc\xaf\xb3\x62\x72\x38\x1e\x46\x3c\x12\xac\x23\x04\x74\x69\xde\xb8\x8c\x56\xcd\x7f\xaa\xf4\x6b\xde\x43\xd0\x11\x79\x4f\x40\xf7\xe3\x4f\x13\x2e\xd8\xde\x23\xa3\xfa\xa9\x3c\x55\xca\xa1\x3f\x1a\x99\x6c\x42\xf3\x32\x8d\x05\xe2\xb3\x1c\xb3\x55\x50\x5d\xa8\x0b\xbd\x8f\xcc\x72\x92\x2d\x40\x66\x9d\x16\x80\x86\xfc\x13\xf6\xaf\x89\xaa\xcd\xb9\x08\x90\xec\xa7\x7a\x51\x39\x28\xf8\x80\x0e\xb2\xb9\x4e\xce\x6b\x99\xbf\x2b\x9a\x74\x95\xbf\x13\x9f\x95\x19\xbd\x00\xc5\x38\xc0\x8d\xf9\x64\xc0\x85\x86\xe5\xeb\xc6\xe5\xb7\x78\xba\x28\xf5\xb4\x52\x12\x13\x3e\x65\xb9\x00\xef\x22\xa5\x2b\xe6\x64\x00\x89\xa8\xb5\xff\xe2\xdd\xde\x85\x02\x46\x58\x83\xf9\xb5\x0a\x1f\x1d\xaf\x57\x1f\x3c\xad\x3e\x78\x56\x7d\xf0\xbc\xfa\xe0\x45\x7d\x0d\x8c\x28\x87\x17\xa9\xf1\x1a\x5c\xac\xaa\x4f\xd7\x83\x4f\x9f\x06\x9f\x3e\x0b\x3e\x7d\x1e\x7c\xfa\xa2\x65\x5c\xec\x71\x88\xc5\xb4\x32\xe6\x22\x40\x37\xbe\x4a\xc7\x5c\x21\x1d\xa9\x74\x13\x2e\x92\x15\xd8\x81\x13\x4b\xf3\xc7\x7e\x95\xe3\xd7\x9f\xf8\x67\x80\xca\x85\xe2\x24\xde\x09\x32\xa0\xc0\x36\x5a\x70\x7c\x2e\x3e\x3b\xf5\x19\xbb\xcc\xa1\xeb\x0a\x1a\x60\x60\x93\x02\x15\x5c\xea\x69\xc1\x70\x93\xa0\xe1\x06\x72\x26\x51\x32\x64\x17\x6a\x6d\x54\xf6\x64\xc8\x9f\x6a\x9c\x34\xc6\x69\xe6\xc5\xd5\xfb\x9b\x68\x75\xd5\xde\x21\x12\x7e\x91\x83\xb6\xb2\x8b\x99\x12\x73\x9e\x33\x34\xcd\x70\xc1\x88\x32\xff\x12\x9a\x7b\xe0\x70\x07\x63\x85\x7a\xb9\x0b\x21\xa6\x6b\x68\x0d\x4a\x67\x39\xbf\x40\x3b\x95\xda\xc1\x18\xf1\xdb\x85\xf0\x5a\x9d\x45\xde\x05\x88\xf6\x23\x0a\xe2\x35\xcc\x33\x6a\x26\xfb\xcd\xc0\xdd\x5e\xf3\x27\xe5\xf4\x71\x83\x9b\xd9\x30\xcd\x13\xe5\x3e\xa2\x35\x58\x6f\x79\x81\x97\xfb\xca\xf5\xcc\xbd\xff\xe9\xed\xbf\x80\x23\x68\x45\x88\xbf\xd2\xda\x5e\x54\x79\x0a\xa6\x23\xff\x99\x63\x26\xaa\xd0\x36\x9a\x83\xfc\x87\xd5\x9c\x3a\xea\x69\x4a\x33\x3e\xaa\x3d\xac\x7d\x9c\x9e\x57\x9f\x54\xe9\xdf\x98\x8c\xaa\x8f\x47\xe1\x2d\xa9\x0c\x49\x95\x87\x68\x53\xaa\xef\xbf\xfa\xc3\xd0\xee\x05\xfb\x4e\xe5\x11\xcb\x67\x95\x47\x39\xad\x4e\xa6\xc6\x1d\xaa\x80\xb5\x8d\xa6\xf2\x54\x59\x64\xfc\xa7\xb3\x1a\xb0\xda\x34\xb5\x49\xaa\xbf\x40\xf4\x53\xd3\xac\xce\xfb\xf3\xa4\x3a\xb6\x3f\xec\x60\x59\xac\xc5\xa9\xb0\x66\x2f\xa9\x54\x18\x84\x56\x92\x5d\x5e\xde\x0c\x74\x96\x5e\x03\x38\xac\x16\xaa\x40\x49\xaa\x2c\x36\x09\x9c\x4b\xd7\x6a\x83\xaa\x07\x12\x2a\xe3\x16\xc3\xa9\xea\xe4\x2a\x30\xa8\xcf\xe9\x0f\xa7\x2c\x26\x02\x9c\xdc\xf9\x84\x29\x7f\xf2\x01\x9f\x95\x44\x02\x44\x3b\x37\x24\xa5\xe5\x43\x32\xa1\xc5\x19\x2b\x44\x57\xe5\x5b\x40\x5f\x6b\xe1\x42\x63\xbf\xcd\xd2\x73\x9a\x19\x7f\xf3\x54\xe9\x8c\x6a\xec\xb4\x49\x1d\x59\x19\x2c\xe8\x0b\x17\x4f\xd7\x57\x1b\x86\xb8\xb2\xe6\xd6\xd6\x34\xa1\xdc\xf6\x54\x4e\xfc\x15\x12\x76\x3f\xb1\xec\x17\xce\x33\xc8\xb6\x8a\xbf\xc0\xf1\x2e\xc4\x8e\x2b\xf6\x0a\xef\xcf\x90\xa1\xc2\xda\x29\xf0\x7c\x09\x7c\xa7\x55\xc5\xd5\xa6\x78\x44\x38\x9f\x19\x69\x09\xbe\x2a\xe9\xc8\xd1\x2a\x9b\x61\xd7\xe3\xec\xb5\x7b\xa2\x9e\xa3\x3e\xdf\xba\x10\xf3\x5c\xc1\x4a\x1f\xf3\x8b\x58\x70\xa9\x20\x53\x2a\x04\x4b\x34\x6a\xe8\x48\xe7\xe9\x18\x30\x80\x63\x03\x50\x6d\x0f\xbe\xf6\x49\xad\x16\x5a\x6b\xa0\x4f\xa3\xa0\x0c\xe9\x2d\x9d\xd5\x70\x04\xb8\xd7\x58\x83\xa4\xef\xe0\x60\xa3\x0a\x56\x63\x1e\x74\xac\x6e\x47\xe6\xe3\xc6\xd3\xd8\xe9\x94\x36\x19\x9a\x1c\x88\xfb\x45\x63\x5f\x97\x97\xd5\xe1\xd8\x84\x32\xf7\x1a\x80\x34\xb9\xa0\x9a\xce\xf5\x98\xb4\x51\x20\x08\x05\x69\xc2\x7c\xa2\x1c\xb0\x30\xd6\x6d\x81\x5f\x57\x5b\x47\xb5\x62\x2e\xe5\x22\x87\x50\x6a\x72\xcf\x1f\x2c\x79\x4c\x5a\x97\x2d\xf2\xd8\xae\xb2\x7e\xe0\x8e\xcd\x3c\x33\xde\x5f\xc4\x77\xbe\x3d\x56\x1d\x9c\x2c\xe1\x75\x6b\xda\x1a\x77\x5b\x33\xcc\x92\x8e\xb6\x53\x31\xcd\xe8\x7c\x0f\xf3\x55\xe9\x51\xd9\xf9\x43\x92\x29\x30\xa7\xab\x4d\xa7\x23\xe4\xed\x7e\xf1\x55\xa5\x7e\xe2\x8a\xde\x7f\x1f\xf6\xa2\x92\x89\xd2\xee\x2d\x2f\x34\xb6\x36\x82\xd6\x91\x71\x43\x36\x17\xde\x5a\x18\x64\xfd\xab\x8f\x66\x98\x8e\x1f\xb3\x13\xcb\x5f\x9b\xc6\x7d\x27\xaa\x6b\xce\x67\x4a\x22\xc6\x62\x36\xf9\x1c\x63\x24\x9d\xaf\x6c\x5d\x4d\x29\xec\xf3\x9c\xdc\x97\x8b\x04\x09\x38\xb3\x14\x45\xf1\x39\x9f\x15\x04\x3d\x46\xc0\xd3\x2e\x6a\x2d\xcc\x77\x51\x9f\xc3\xab\x2a\x5d\x7c\xef\xef\x7c\xb4\xba\x3a\xc4\xe4\xa7\x1c\x4b\xfd\xf5\xc1\xf6\x1e\xc5\x83\x86\x03\xc4\x1b\xc9\x05\xfd\xc5\x2b\x2b\x79\x5b\x24\xb0\xc7\x9b\xa4\x45\xb6\x92\x84\x50\xf2\x0a\x2e\x56\xdf\xcb\xe3\x0a\xe6\x09\xae\x84\x25\x57\xb9\x90\x74\xc4\x14\xf8\xc1\x69\xc7\x01\xa8\x66\x06\xc9\x62\xc1\xa1\xac\xe0\x17\x82\x15\x55\xa4\xd4\xfd\xbe\xeb\xdc\xb4\x1d\x45\x51\xa7\x4f\xbe\x11\x24\xa6\x79\xce\x4b\x42\xa7\x53\x26\xb7\xa6\x49\x02\x24\xd1\x0f\xee\xde\xdf\x08\xf9\x7f\x0c\x05\x70\xb0\xdb\x75\x77\x57\xb7\x42\x0c\x5d\x98\x6c\xd7\x6c\x36\x1d\x1f\xe9\x2f\xd7\x2d\x87\x99\x30\x11\xb3\x3c\xa1\x39\x48\x08\x80\x15\x35\xe0\xeb\x06\x5b\x1d\x96\xbd\x37\x69\xff\x17\xbc\x53\x61\xb9\xa5\x92\x13\xaa\xf2\x57\xb3\xcf\x53\x5e\x94\xc1\x53\x3b\x0a\x38\x1d\x98\x1c\xf6\x15\x57\x04\xdd\x17\x26\xe9\x82\xcf\xc3\x30\xed\x21\xb4\x9b\x43\x8a\x9d\xcf\x01\xdb\xd9\xbf\x81\x34\xe0\x88\x44\xc1\x73\xb5\x6a\x03\x7c\xf8\x90\xdc\x6b\x3e\x10\xeb\xb3\x56\x32\xd6\x55\x93\x47\x2f\x78\x7f\xd4\x1f\xdf\x95\x77\xb2\xe7\x51\x6f\xf2\x6a\x18\xaf\xeb\x0d\xa7\x91\x76\xaa\x37\xad\xac\x97\x3d\x36\x0b\xb9\xd4\x93\xcd\x06\x4f\x7b\xfc\xc4\x77\xae\x27\x9b\x35\x6f\x7b\x6c\x56\x75\xaf\xb7\x15\x16\x82\x10\xeb\xce\xf5\x0a\x72\xc8\xeb\xbe\xfe\xd9\x11\xd2\x6a\xdd\xf3\x1e\x9b\x86\xdc\xec\xc9\x66\x83\xf7\xbd\xf7\x49\x93\x7f\xbd\xfd\xba\xd9\x03\x7f\x31\x20\x7f\x0c\x0d\x5e\xf8\x1e\x88\x06\x47\x7b\x0b\xa4\xd1\x13\x7f\x21\x18\x7f\x20\x61\x6f\x7c\x77\x4d\xab\x4c\x27\xb4\x01\x42\xfc\x09\x61\x4c\x0b\x16\xd3\x78\xcc\x40\x02\x53\xb4\x59\x7b\xe6\x77\x08\x8f\x0f\x54\x45\xdc\xea\x23\xe0\x6f\x2b\x3a\x98\xb4\x39\xab\x92\x3c\x58\x9b\xe2\xf7\xe1\x48\x73\x82\x74\xdf\xd1\x6a\xe2\x2d\xc9\xc6\xde\xd1\x69\x34\x2d\x78\xc9\x65\x2b\x53\x0c\xd0\x16\x2d\xf2\xde\xcb\x5b\xf9\x8e\x14\x2e\xea\x70\x54\xf3\x43\x56\x06\x5e\x1e\xb2\x72\x61\x27\xde\xfb\x08\xfd\xe5\x17\x75\x71\xed\x88\x3a\x4e\x20\xac\x7b\x3c\x62\xba\xf8\x84\x4d\x59\x9e\x80\xbc\x24\x91\x42\xf3\x04\xc6\x3d\xd0\x29\x4d\x25\x60\x11\x55\x13\xb9\x4b\x71\x0c\x12\xae\x51\x3c\x28\xa7\x3c\x9b\x0f\x53\x88\x0a\x20\x3c\x4b\x58\xa1\x85\x09\x11\x81\xd5\xa0\xdf\xeb\x0d\x07\xd1\x84\x61\xce\xcd\x55\xdd\x5c\xb4\x6c\x48\x57\x9a\xff\x8a\xba\xa3\x07\x4f\x23\xfc\xad\x22\x91\x74\x0c\xc8\x8f\x5c\x94\x36\x7d\x7f\x38\x5c\xa9\xa3\x82\x30\x30\x75\xfc\x4e\x2e\xf7\x99\x4d\xbc\x89\xfc\x30\xc3\x6e\x24\xc1\x16\x13\x1d\xe4\xa6\x8a\x98\x83\xa2\xf3\x11\x39\x2a\x66\x4c\xa7\x5b\x94\x24\x95\xa5\x2c\x01\xe9\x09\x22\xd8\xa0\x4e\x90\x0a\x7e\x90\x7f\xdb\x9a\x3c\xf0\xf1\x7f\x80\x3b\x33\xf9\xf2\x7a\x7b\xff\x9d\xda\x9f\x57\xd8\xf0\x68\x0c\xa1\x7e\x09\x66\x50\xd3\xf0\x22\xf8\x48\x1d\x67\x5f\x06\x9c\x67\x8c\xe6\x57\xde\x18\x64\x53\xa7\x57\xff\x4b\xa8\x29\x94\xd3\x6c\x85\x3c\xea\xd9\xc0\xb8\x54\xc0\xa1\x68\x32\xbd\xb5\xe5\x07\x48\x0a\xaa\xab\x7b\xf7\xe0\x19\x54\xed\xca\x75\xd0\xdd\x11\x12\xe5\x26\xd9\xf9\x79\xe7\xdd\xce\xde\xd1\xe9\xde\xfe\xf6\x0e\xd4\xc8\xac\xb5\xd8\xde\x7f\xf3\x61\xd9\x26\x6f\xdf\x6f\xfd\xed\x9a\xb6\x6f\xf6\xdf\xd9\x16\x0f\x1f\xda\x16\x2a\x8f\x89\xa4\x69\x82\xe4\x03\xc9\x09\xd0\xc9\x78\x75\x96\x0b\xf4\x75\x68\x75\x3a\x7e\xa4\xf8\x88\x95\x40\x24\xef\x39\x2f\xd5\x3a\xa0\xd4\x83\xf8\x88\xf5\x2f\x44\x0a\x5c\x5a\x2b\xcf\xea\x7a\x97\x15\xd5\xd2\x34\x5c\x80\x92\x0a\x0c\xfb\x89\xb6\x0a\xaa\x41\x01\x60\x57\x92\xad\x7d\x60\xd3\x62\xd6\x03\x20\x51\x45\xa1\x78\xf9\xf6\x8c\x1d\xf1\x9f\xd9\x88\xc6\xf3\x1f\xd9\xac\x48\x45\x99\xc6\xd5\x89\x42\xba\x35\x8b\x12\xbc\x34\x2f\x87\xa8\x0d\x8f\x78\x5c\x20\x0f\x1f\xba\x30\x17\x50\x52\xa5\xe1\x98\x0a\x9b\x93\xe6\xfd\xfe\xfe\xd1\xe9\xd6\xd1\xd1\xfb\xdd\x1f\x3e\x1c\xed\x40\xce\x9f\xea\x9a\xe2\x6c\xb7\x66\x25\x7f\xcb\xe3\x99\xf0\x59\x82\x64\x55\xe1\x48\xcf\xf9\x94\xf9\xa1\x9e\x9e\xfa\xb1\x1e\xfd\xd9\x98\x79\x23\x10\xcf\xa9\xd0\x81\xc5\x7e\xa8\x1e\xd9\x86\x5f\x3d\x0a\x78\xae\x11\x28\xb7\xf7\xdf\xbd\x67\x79\xc2\x0a\x56\x90\x4d\xa4\xe9\xf7\xaa\xa4\x0b\x2b\xda\x72\x9c\x72\x49\x38\x2f\x71\x7e\x20\xa7\xf7\x1d\x31\xdd\x4b\xe1\xb8\x1b\x70\x36\xc6\xa3\x85\x40\x30\xf1\x13\x2b\x60\xe7\x4e\x76\xa6\xda\x3b\xb3\x64\x24\x08\xde\xac\xe9\x86\x67\xad\xd1\x4f\x2b\x26\x1b\x6f\x23\xf4\x83\x6f\x3c\x96\x60\x15\xa3\x5e\x25\x0b\x1c\xcf\x02\xae\xf3\xda\x35\xb2\x93\x3e\x69\xfd\x75\x58\xd0\x11\xfc\xe5\x26\x47\xd2\x34\xdf\x38\xb9\xc0\x96\xd4\xff\x73\x91\x06\x30\x5e\xc3\x3f\x91\x79\xfe\xe1\xfd\x2e\xe9\x83\xe6\x49\xee\x50\x9b\xe9\x4a\xa9\x1e\x5b\x5e\x9a\xa6\x4a\xe2\x6b\x7d\xc3\xae\x25\xc0\xae\x26\xee\x32\x9b\xb0\x8a\x0f\x8f\x6d\xbe\x6e\x98\x9e\x8d\xac\x26\xfd\x70\x93\x2a\xb6\x2a\xb9\xbc\x1c\x7e\xe7\x4e\x5b\x32\x72\xc7\x99\xd8\x59\x33\xfb\x41\x49\x47\xba\x18\x7f\x08\xa5\x75\xbc\xb9\x5d\x77\x01\xde\xf5\x18\xc4\xff\xba\xaa\x16\x93\x36\x13\xef\x93\x20\x1f\x05\xf3\xba\xcb\xc6\xa7\xf4\xda\x5b\xb6\x5a\x4e\x17\xac\x57\x1d\xdb\x6c\xf5\x2f\x76\x7a\x7d\xfb\xd3\xbf\x60\xf6\x2b\x3d\x5e\xb9\x3a\x41\x7d\xe6\xb8\x59\xd9\xae\xba\xc8\x14\x00\x55\x0d\x5c\x01\x17\xd9\x79\xa9\x90\xa7\xd0\xe2\x22\xa7\xd6\x74\x9b\x9d\x9b\x4b\xb7\xf3\xd8\xc3\xd1\xe2\x55\x0b\x81\x8c\xf2\x86\x75\xac\xe1\x7c\xbd\x01\xe9\x41\xa8\xee\x87\x08\x78\x89\x95\x38\x5d\x6e\x29\xd6\xfd\xb5\xb0\xc8\xaa\xa7\xcd\xab\xe1\x49\x75\xdb\x84\x9b\x10\x51\xeb\x75\x3d\x98\x0d\xb2\x34\xde\x35\xe1\x1c\x76\x55\xab\xb1\x24\x5a\xed\xe1\xec\x5b\x00\x32\x2d\x98\xec\xe6\x2d\x97\xc2\xf0\x24\xf5\x28\x43\x7f\x5b\x95\x8a\x53\xfd\x5b\xef\x86\x06\xe1\x78\xc4\xca\xc3\xc0\x1b\xfb\x55\xa9\xe1\xc0\x39\x67\x67\x06\x55\x70\xb6\x86\x25\x5b\x30\x28\x15\xeb\x6d\x3a\x68\x87\x06\xb1\x78\x7c\x96\x07\x39\x43\xf1\x26\xab\xbe\x0f\x5f\x0b\xd4\x60\x51\x7f\x12\x5a\x03\x47\xb0\xe8\x86\xd9\x67\x97\x8c\xdd\x7d\xa7\x45\x72\xfd\xfa\x47\x9a\x27\x99\x77\x42\xd7\x89\xca\x3d\x90\x1d\xcf\x72\xa5\x3f\x94\xd7\x2f\xbb\x01\x51\x89\x18\xc7\x90\xa4\x0b\xec\x58\x3a\x84\x3c\x1f\xb9\x19\x96\xc7\xd5\x1d\x3e\x0e\xed\xed\xfa\xe5\xbe\x6d\x37\x55\xb7\x02\x24\x0a\x18\x8d\xbc\xab\x35\x0a\x42\xa6\x3c\x40\x43\xfd\xdf\x50\xab\x40\x6e\x72\xb8\xb1\xc1\xc7\x44\x65\x22\xf7\x3f\xdc\x58\xa9\x1c\x5a\xd7\xab\x4b\xdb\x0b\xe6\x13\xe4\x26\x0d\x28\x42\xe4\xe0\xe0\xba\xd5\xae\x6b\xe9\xb5\xea\xeb\x3d\x6e\x60\x95\x55\xf6\x63\x93\x78\x54\x35\x81\x4b\xd1\x65\xa5\x63\x35\xb0\x9a\x3e\xa6\x1d\x26\xd9\x40\x09\x9b\xaa\x7a\xa6\x31\xcb\x88\xe2\x54\xf6\xb5\xd9\x69\x50\xfb\x32\x51\xfa\x47\xe0\x95\xf5\x73\xcc\xce\xc0\x49\x10\x45\x88\xff\x32\x42\x48\x00\x02\xad\x57\x96\xf7\x0c\xd3\x1c\xf2\x3a\xbb\xdd\x14\x2c\x77\x7b\xf2\xb2\xc4\x5c\x8b\x4b\xe3\xa8\x14\x50\x9d\xde\x14\x94\x87\xa1\xa5\x2f\x35\x55\x66\x8f\xe5\x1e\x17\xcf\x88\x67\x89\x29\x29\xab\x4b\xf3\x5c\xcf\xc2\x42\x42\xc3\x32\xcc\xc4\xab\x3b\xa0\xf2\xe0\x99\x4d\x0e\x69\xde\xf0\xa5\x1e\x95\x7d\xe9\xd5\x0e\xaf\x7e\xd9\x58\x44\x3c\xd8\x30\x54\x4d\xbc\xce\x48\x6a\x1f\xff\x9b\xf0\x12\x4f\x48\xf4\x35\xf3\xb7\x59\x7e\x4b\x5c\x26\xe5\xf2\x91\x2d\xc4\xd0\x70\x1a\x56\x84\x92\x52\x5f\x4a\xec\x3d\xf9\x1a\x96\x7f\xa3\x83\xa1\xd6\x2a\xd1\x99\xc6\xb3\xf9\xa1\xdc\x94\xb9\x4e\x03\x0f\xb1\x4b\x18\x00\x0e\xe6\xa3\x85\xad\xef\x69\x1d\xac\x2d\xce\xb0\xf0\x83\xe8\xf4\x74\x0c\xb9\xea\x9d\x09\x54\x90\xb7\xcd\xa6\x45\xca\x8b\xb4\x4c\xff\xc1\x0e\x67\x83\xb2\x60\x4d\xf2\x44\x05\x83\x5a\x8f\x80\x25\x70\x2a\xa2\x89\x5c\x8f\xa0\x78\x02\x32\xc7\xed\xe5\x92\x9b\x6e\xf6\x05\xa4\x8c\xdd\x5d\x2f\x39\xd8\x63\xae\x6c\x32\x64\x2d\x9a\xde\x8d\x4f\x33\xdd\x8b\xcf\x80\xf5\x53\x85\xef\x95\x15\x42\x72\x7e\xd1\x97\xff\x81\x50\xf2\xc9\xac\x04\x51\xb3\xaf\x75\x48\x20\xcc\x42\x56\xd7\xc5\xcc\xd7\xee\xb9\xc5\x98\x27\x5e\x11\x1c\x79\x08\x68\xd9\xfa\xaa\xeb\xf4\xb8\x98\xdf\x57\x8b\x8a\x37\xee\xff\xeb\xc6\xe2\x17\xbb\xc6\xd2\xf5\x63\x68\x43\x04\x37\x85\x5c\x95\x67\x72\x1a\x8f\x55\x13\xaa\xc2\x0c\x78\xce\x04\x38\x57\x5b\x70\xe0\x6a\xad\x03\x85\xb1\xe4\x29\x02\x2c\x84\x5f\xb7\xb9\x41\xac\xd0\x63\x77\xab\xe8\xf9\x55\xc8\xdd\xa4\xb0\x4a\x35\xee\x80\x5d\xae\x2c\x79\x13\xc6\xfc\xa5\x80\x3b\x4d\x03\x6b\x74\x84\xa5\xd0\xca\xba\xa5\x75\xac\x17\x88\xb7\xc4\x12\x70\x7d\x99\x4b\x67\xe7\xc3\x08\xd1\x6f\x2f\x67\x17\x47\xce\x61\x4d\x88\xdb\xce\xd5\x9d\xeb\x96\x5e\x87\x8e\xec\xb4\xb4\xf8\xb5\xa4\x00\x16\xea\xe3\x88\x9b\xed\xeb\x76\x67\x14\x45\xb5\x9e\x16\xe8\xd9\x5d\xa5\x97\x7b\xca\xdb\xe6\x4e\x2e\x41\xcc\xa6\xf8\x03\xd4\x19\xc6\x31\x76\x89\xaf\xd3\x26\x21\x07\x26\x0b\xab\x69\x8e\xe6\x44\xc6\xb9\xba\xfd\x5c\x8b\xd0\xae\x2a\x7c\xfc\x66\x21\x76\x43\x43\x77\xbf\xdb\xa8\xf7\xef\x68\xee\xeb\x43\xa9\x22\xbb\x61\x14\xbf\x27\xe6\xeb\xc3\x5f\x88\xfb\xa5\x41\xf8\x5b\x74\xc2\xcf\xd9\x2d\x29\xdb\x01\x12\xa2\x6c\xe7\xf5\xdb\x82\x4f\xfe\x49\xb4\xdd\x34\xc8\x85\x38\x5d\xf0\x91\x39\x94\xaf\xe0\xe0\x1b\x6b\x33\xba\x39\xf9\x68\xae\x4c\x4d\x8b\x74\x55\xde\x15\xc8\x9f\x74\x5a\x35\x27\x80\xf8\x55\x35\x36\xd6\xb5\xb5\xd0\xcc\xfb\x38\x90\x1e\xd4\x99\x6d\xc5\x70\x47\x9c\xab\xb8\xce\xba\x37\x86\x3c\xfd\x17\x64\xc0\x58\x4e\x0a\x4c\xd5\x2f\x8f\x11\x9a\x9b\x14\x6a\xee\x49\x12\x50\xbc\x59\xde\x6d\xd0\xd2\x24\xa3\x39\xa8\xf1\x38\x76\x25\x39\x2d\xfa\xd4\x86\x50\x74\xb4\xf3\x7f\xea\x34\xd1\xeb\x91\x1d\xc8\x56\x8b\x62\xa8\x2d\x1a\x05\xc9\xe6\xc0\xbb\x0f\x44\x5c\x38\xb6\x59\xc1\xc8\x05\x16\xc7\x62\x90\xf2\x0d\x12\xd1\x29\xf7\x40\x37\x4b\xfa\xed\xb0\x67\x9d\x3b\x97\xc1\xdc\x88\x95\x7b\xec\x73\x69\xbd\x62\x0e\xd3\x41\x06\xee\xd9\xcd\x2a\x50\x6b\xb0\x22\x2e\x4d\xb0\xcf\xa5\xfa\xd8\x4d\x4e\x70\x96\x4e\x49\xce\xf3\xd5\xb1\xe9\xc1\x4f\xa0\x7b\x31\x4e\x33\x46\x8c\x25\xdc\xb7\x4b\xd7\x68\x33\xd8\x22\xb8\x34\x6a\x78\xd8\xba\x3e\xb4\x2b\x1f\x37\xb9\x92\x3e\x5d\xbc\x40\xbe\x0a\x8b\x98\x6b\xd8\x59\x05\x39\xe8\xf1\x53\x61\x69\xbe\x1d\xf9\xa6\x18\x92\x20\xe5\xfc\xd9\xe7\xf2\x1a\x0c\xd5\x5a\x84\x31\x84\x63\xc4\xd6\xd7\x63\xa8\x2a\xbe\x8c\x6f\xc8\x87\xee\xe2\x86\x74\x93\xab\x46\xea\xdf\x51\x1c\x65\xee\x01\x17\x22\x1d\x64\x73\x92\xb0\x21\x2b\xd0\x2d\x74\x96\x97\x29\x14\xa4\x53\x72\x20\x99\x8e\xa9\x60\x2a\x78\x57\xd5\xaa\x53\xea\x6b\x0b\x6e\xc4\x4a\x42\xcb\x52\x8e\x27\x69\x94\xa3\x2d\x32\xfc\x14\xc0\xd7\x6b\xa1\x49\x45\x7f\xb2\xcc\x9d\xf0\xe6\x9a\xce\xda\x4a\x87\x7d\x02\x9b\x16\xb5\x66\x5b\x59\x74\x51\xf4\x49\x67\xd1\x7d\x7a\xd7\xe3\xd7\x77\x49\x17\x2e\xf4\xaa\xc5\xaa\xea\xdd\x18\x18\x8a\x3f\x93\x24\x4d\xf6\x78\xf9\x4e\xb2\x70\xfd\x9d\x99\x7b\xd3\xf4\x10\x63\x6f\xac\x6c\x12\xe8\xc4\xcc\xcb\x52\x40\xc8\x95\xb2\x79\x7c\x15\x89\x2c\x30\xce\xc5\xc3\x3b\xc2\x35\x86\xdf\x07\xee\x4a\xfb\xbd\x35\x0d\xdb\x2d\xb8\xe9\x00\x39\x6e\xf6\x1e\x3c\x41\xf5\x64\xe1\xd7\x32\xba\x83\x49\xab\xf9\xd6\x48\x72\xe1\x92\xd4\x8f\x3c\xbf\xc2\x59\x5d\x46\x90\xf2\xc3\x5a\xb0\x0c\x53\x93\xfb\xea\x82\x5e\x1d\xf3\x7a\xbd\xbc\xd5\x22\x7f\xd6\xe5\x60\x5e\x8b\xac\x5b\xd1\x45\x1d\x77\x77\x45\x0d\x77\x8c\xf9\xc0\x90\x6f\x8b\xf8\xc5\x20\x9b\xf1\xfe\x36\xcd\x1d\x80\x37\xa3\xd5\xa0\xac\x5f\xdb\x42\x0d\x9e\xcb\x8b\xc1\x2d\xd8\x56\x0d\x23\xbe\x11\xd3\xbb\xc1\x70\xc3\xc4\x7d\xdd\xde\xf7\x07\x79\x3b\x6e\xd7\x74\xa3\xba\x43\x36\xb7\x78\x8d\xc2\x63\x59\x7a\xf6\x77\xc2\xef\xff\xb0\xa9\x07\xf7\x54\x68\xb9\xcd\x5d\x59\xc8\xf3\x61\x96\xb1\x6d\x86\x65\xe0\xde\xd0\x2c\x1b\xd0\xf8\xac\x4f\x8a\xdd\x37\xd0\x62\x26\xd8\xe1\x3c\x8f\x0f\xb1\x21\x5c\x72\xee\x31\xf0\x45\xd8\x12\xde\xf3\x1f\xe6\xdb\xe8\x0f\xb6\x9b\x6b\x37\x67\xcc\x7d\x6f\x7d\xa4\x9f\xb9\x3e\xd2\x3f\xe0\xe1\x84\x7a\x43\xd1\x76\xdc\x0b\xa3\x81\xf7\x4a\xbb\x47\xcb\x49\xb3\x64\x6b\xc0\x67\x9a\xe3\x6e\x1d\xec\x92\x4d\xed\xa6\xe8\x96\xd7\x90\x70\x94\x09\x63\x37\x2f\xad\x0e\xcf\x6c\x06\x65\xa8\x54\x2a\x8e\x82\xe5\x8e\x76\xad\x8b\xe5\xc3\x54\x1f\x5d\x12\x2b\x9c\xe0\x02\xdc\xab\xf9\x28\x3b\xae\xaa\xaf\x21\xf6\xb3\x48\x69\x5e\x1a\x8f\xf5\x23\x5a\x48\x91\xd7\xfa\xc2\xa9\xd2\x60\x14\xd4\xbe\xda\x0d\xbb\xd5\x21\x7d\x23\xc7\x7a\x55\x60\xac\x0a\xe4\xb4\xd0\x0e\xaf\xa6\x73\x88\xb7\xab\xab\x64\xee\x35\xaa\x64\xb4\x48\xac\xe9\x83\x6c\xba\x8e\x9d\xd1\x50\x52\xbf\xf3\xfa\x63\x5a\x8e\xf7\xf8\x01\x2f\x4a\x9a\x89\xc5\x43\xd1\xa1\x51\x9e\x7b\x85\xdb\x55\x95\x80\xd3\x7c\xe4\xbd\x77\x1d\xfe\xe4\xf1\xe4\x2c\x48\x0b\x97\x54\x45\xc2\xed\x96\x24\xe3\xfc\x4c\xc5\x27\xc9\x3b\x06\x10\xdc\x2a\x36\x62\x09\x7c\xc9\x30\x22\x0e\xee\x29\xe0\xed\x6f\x17\xe0\x82\x0a\xa5\x09\xc3\x7c\x2a\x7c\x56\x12\xcc\x23\x0f\x70\x22\xd4\x15\xa8\x65\x82\x6f\xc5\x6c\x3a\xe5\x72\xa7\x41\xa8\x01\xe4\xe9\xc7\x4c\x44\xac\x28\x78\x21\x22\xb2\xab\x13\xfe\x4b\x62\xc1\x6f\xf4\x26\x88\x54\x05\x3f\x43\x74\x5b\x38\xc5\x92\xab\xa2\x3d\xd4\x59\xc1\x56\x6d\xa7\xae\xe8\x55\x4b\x85\x44\xb7\x5a\xa9\xe4\x87\xf9\x21\x9f\x30\x8c\x86\xd8\x24\xf7\xee\x2d\x5c\x1a\xeb\x30\x8b\x6e\xcc\x37\x75\x9f\x56\x64\x43\xc5\x1e\xcf\x71\x10\x34\xc6\x2b\x39\xf4\xad\x9c\xaa\x25\x2d\x42\xf9\x54\x5c\xce\xb7\x05\x9f\x60\xd0\x8c\x7a\xdf\xd1\x81\xcc\x7a\xf1\xef\x05\x21\x5e\x5e\x36\x4f\xb5\x4a\x09\xef\xd9\x34\xa3\xb1\x59\x39\x87\x02\xb4\x29\x56\xe5\xcb\xc9\xd9\x05\xfa\xc1\x2a\x52\x50\x4b\x11\x91\x5d\x88\xaf\x35\x45\x14\xe4\xaa\xcc\xac\x19\xc9\x80\xd1\x94\x94\x43\x06\x2b\x00\x22\x3f\x53\xa1\xf6\xaa\xdc\x03\x46\xf9\xc2\x9d\xf7\x33\xa6\x00\xb1\x00\x2c\xd0\xb4\x50\x05\x00\x01\x8a\xa4\x27\x1c\x35\x7c\x28\xc7\x69\x46\x27\x0c\x60\x3e\x04\xc2\x32\x13\x95\x64\x85\x5f\x01\xc5\x78\x58\x6d\x60\x07\x55\x6d\xe5\xbd\x9a\xb3\xab\x7c\x5a\x7b\x18\x95\xfc\xc3\x74\xea\x29\x34\x5b\x3f\xec\x6f\xff\xbd\x65\x97\x02\xd6\x41\xfe\x82\x09\xdb\xc1\x63\x30\x21\xe4\x03\x2b\x39\xd1\xce\xca\xd1\x80\x27\x73\xa2\x37\x65\x92\x8a\x98\xcf\x0a\x3a\x62\x49\x57\x25\x93\x4c\x4b\x61\xd1\x06\xd9\x8f\x86\x25\xcb\xc9\x84\xe6\xe9\x74\x96\xe9\xf8\xdf\x72\x9c\x16\xc9\xea\x94\x16\xa5\x8a\x05\xc6\xac\x6b\x02\x36\xa8\x0a\xe3\x21\xec\x73\xc9\x72\x91\xf2\x5c\xa8\x3d\x3d\xa1\x73\x92\x49\x84\x96\x9c\x88\xd9\xa0\xcc\xd4\x2a\x14\xca\x91\x3d\xa5\x2a\x0c\x45\xcc\x98\xfc\xa6\x98\xab\xc5\x81\xb4\xee\x18\x04\x6b\xf9\x88\x56\xb8\xa2\xe9\x37\x41\x50\x43\x5e\x60\x24\x33\x9d\x4e\x23\x1d\x29\xb4\xe2\x79\x73\x5f\xbb\x57\x21\xac\x43\x36\x76\x9d\xef\xbc\x98\x09\x79\xec\x39\x87\x94\x5c\xba\x9b\xc4\x54\xe0\xa6\xd6\xe9\x65\x55\x7d\x13\x0c\x4f\xd7\x84\x8b\x2c\xd4\x56\xa1\xbd\xe7\xc1\xf7\x0f\x14\x3c\x99\xed\x51\x6c\xdf\xc8\x49\x28\x15\x59\x4d\x4f\xa3\x54\x74\x7e\x13\x8b\x9b\x8c\x2a\xb5\x9f\x7b\x6e\xb8\x37\x0b\x18\x95\xea\x5a\x45\x68\x28\x38\xd7\x87\x72\xe8\x86\xd7\x87\x72\x78\x5d\x12\x3b\x55\x5b\x60\xac\x7a\xa6\xe9\x83\xdf\x6e\x0f\x25\x02\x80\x76\x75\x4c\x05\x24\x72\x99\x4d\x89\xe1\x56\x83\x39\x51\xec\x6d\x30\x2b\x95\xd2\x1b\xb9\x43\xc1\xc8\x2c\x2f\x18\x92\x3d\x26\x46\xa5\x82\x5c\xb0\x2c\xb3\xa7\xd4\x84\xcb\x25\xe4\x93\x09\xe4\xe1\x82\x73\xc9\x86\xc8\x43\x48\xfa\xaa\x76\xc0\x44\x71\x91\xd0\x02\xaa\x74\x62\x01\x34\xcb\x34\x71\x58\x51\xab\xa1\x44\xf3\xd5\x35\x56\x19\x07\xaf\x41\xef\x1f\x57\x08\xf6\x89\x19\x22\x9d\x5d\x72\x96\x0f\x82\xe2\x5e\x55\x86\x08\xc9\x83\xfe\xca\x64\xfc\xe2\x00\xdd\x5a\xe6\x2a\xac\xf2\xc1\x5a\x60\x89\xde\x84\xd9\x6b\xbb\x23\x59\x85\x52\xbd\x35\x20\x4c\x21\x5a\x0a\x05\x50\x6d\xf7\x82\x17\x67\xc8\x2f\x10\x1a\x39\x5f\x7b\x19\xa9\xa3\xca\x11\x57\xbc\x4e\xac\xd8\x00\x07\x96\x69\xa0\x7a\x6e\x77\x24\xd6\xe4\x89\x73\x41\x73\x55\xfd\x07\xec\x16\xa0\x47\xd5\x6e\x04\x4e\x41\xbb\x80\x20\x41\x8c\x96\xfd\xe2\x3d\xf2\x21\x57\xf0\x43\x1e\x16\x10\x00\xba\x3e\x63\xd1\x3e\x28\x4b\x70\x32\xb4\xe0\xcb\x47\x86\xdd\x28\x17\x44\x55\xa8\x57\x9d\x9e\xaa\x72\xac\x12\xfa\x91\xe3\xb8\x43\x9b\xe5\xfe\x7d\xa0\x5d\x77\xc7\xae\x7c\x00\xed\x9c\xb9\x18\x19\x5f\x8d\x47\x5f\xd3\xdc\x7b\x80\x16\xf2\x95\xa6\xb2\x53\x0b\x70\x5b\xae\x87\x62\x09\xf0\x4e\x88\x95\x0b\xd4\x78\xd4\xcb\x21\x6a\x29\x0a\x76\x55\x25\x9e\x0c\xd7\x0a\x85\xf2\x76\xe0\x02\x63\x43\xe6\xce\x20\x55\x0c\x2d\x46\x33\x2c\xba\x9b\xb1\x7c\x54\x8e\xc9\xf7\x64\x5d\x6e\x31\xf3\xfc\x78\x1d\xaf\x99\xa6\xf8\x37\x79\xed\xbf\xec\xeb\x50\xd3\x3f\xe6\xfe\xe3\x98\x1d\xa6\x54\x08\xb3\x1d\xc8\x14\xe6\x0c\xf9\x24\xe1\x33\x3c\xae\xa9\x40\x71\xc0\x8c\xd9\xe2\xd7\x45\xd5\x83\xb5\x10\xb2\xb4\xc3\xf8\x19\x94\xa6\x77\xd1\x6c\xe4\x63\x77\x33\x8c\xdd\xf3\xcf\x39\xd3\x97\xdc\x4b\x63\x67\x17\x49\x81\xb2\x61\xdf\x14\xb0\x69\xae\x56\xcc\x10\x9c\x78\x69\x25\x2d\xd6\xf2\x63\xe1\xb4\xbc\xbb\xaa\x33\xbe\xa6\xce\xe4\x40\x6e\x42\xd9\x88\x2c\x87\x9c\xaf\x36\x82\xa3\x54\x97\x1e\x7f\x98\x77\x3d\x38\x1c\x4c\xf3\xc0\xbc\x12\x91\xaa\xe6\x8b\x4b\x11\x7d\xef\x2f\x50\x77\xc8\x0b\xf0\xf6\xfe\x3b\x2c\x01\xe9\x3a\x45\xa8\xad\xbc\x5f\x54\x7c\xa5\x5c\x39\x88\x5f\xe0\xf2\xe1\x6d\x06\xaf\xc3\xfb\x17\xce\xdd\xd8\xbd\x1a\x63\x63\xed\xc7\x59\x75\xfb\x75\x0e\xb7\xf7\x6c\x28\x76\xf3\xf7\x7a\xd9\xe1\xbb\x08\xae\x10\xe0\x4d\x71\xda\xd0\x74\xa3\x76\xd9\x6e\x68\xd8\x25\xad\x6f\x40\x90\xa0\x71\xcc\x04\xdc\x83\x1d\x2c\x48\xa9\x21\x4d\x50\x2c\xd7\xc7\x55\xa4\xa5\x66\x75\x7a\xd9\x8c\x63\x94\x4c\x67\x05\xb3\x88\xd3\x6e\xa9\x58\x23\x5d\x8e\x39\x92\xd7\x77\xf5\x01\x40\xc1\x3a\xf5\xd8\xb7\x93\x04\x0f\x3c\xf6\x0a\xf6\xdb\x2c\x2d\x98\x90\x9f\x66\x8c\x24\xb4\xa4\x58\x04\x0f\x7d\xfc\xd8\x79\xca\x67\xc2\x1d\x4c\x97\x88\x59\x3c\x26\x70\xc1\x1f\x8a\x88\xbc\x33\x05\x6c\x33\x3e\x4a\x63\xac\xf3\xaa\x96\x72\x3b\x4d\xc0\x1b\x12\xc6\xe6\xdf\x0b\xb7\x53\x75\xd8\xe8\x1b\x58\xd4\xea\x42\x88\x94\x6e\x20\xaf\x46\xb8\x82\x1d\x29\x7b\xb7\xb6\x2c\x58\x57\x7c\x5a\x76\xad\x2a\x52\x8b\x7b\x64\xa3\x0a\xa8\x4a\x7d\xa4\x46\x36\x35\xef\x87\x45\x9f\x37\x0b\xc8\x35\x80\xf5\x8f\x37\x6a\x9a\x89\x5c\xa8\x88\xec\xd0\x3e\xd9\x30\xe3\x90\xed\x6a\xf0\x17\x69\x9f\xf0\x0b\xaf\x3f\xc7\x57\x3f\x30\x2d\xcd\x1b\x1b\x8a\xd7\xd7\x0f\xa7\x0f\xa0\xc9\x94\x64\x21\xfb\x46\x09\x9d\xab\xb2\x1a\xc0\xc0\x40\x9b\xa4\xb5\x05\xad\x70\x0a\xa7\x3a\x58\xbd\x4a\x98\xa9\x49\xe7\xa5\xce\x59\x0a\xd5\x12\x91\x3d\x98\x62\xb5\x39\x87\xe0\x6a\x20\x10\xf2\x13\x9b\x8b\x3e\x81\xec\x4d\xaa\x84\xed\x19\x9b\x8b\x10\x5e\xdd\xbc\x4d\x5d\xe3\xf6\xe4\x71\x2d\xa6\x7d\x46\x5d\x9f\x2e\x8f\x09\xbb\xd1\x5a\xe3\x82\x5f\x10\x8e\xac\x47\x97\x78\x96\xdb\x14\xf2\x97\x21\xf0\xd7\x2b\xce\xca\x2d\x50\xb3\x22\x33\x0e\x75\x2f\xc9\xbc\x2a\x0e\x61\xd0\x9d\x04\x76\xd3\xc1\xdf\x66\x24\x6a\xad\xea\x43\xd1\xc9\x19\x4e\x9b\xc1\x86\x8c\x34\x46\xd6\xab\x77\xa6\x6a\xc6\x57\x06\x7f\xaf\xfa\xa9\x4e\x0e\x29\x65\xb3\x31\x15\xd5\xd7\x9d\xb0\x7c\x55\x05\x32\x99\x09\xe5\x2c\x85\x79\x37\xf0\xb2\xf0\xc6\xb2\x27\x4f\xd0\x5a\x06\x87\x4b\xcf\x70\x01\x4a\x43\x2a\xd0\xa0\xd7\xa1\xc1\xce\x4d\xe5\xcc\x70\x1f\x4a\x51\xf8\x75\x4a\xf8\x25\x14\xf0\x21\x6b\xdc\x6d\x14\xad\xe6\x7b\xa3\xfc\xdc\x86\xf2\xaf\x2c\x2f\xb5\xb2\xd7\x6a\x5b\xef\x2d\x54\xb7\xd6\x05\x80\x7b\x4d\x50\xbb\xe4\x7e\x03\xfa\x24\xee\xc6\xe8\x5b\x25\xef\x9f\xad\x82\xc9\x4b\x27\x9b\x4c\x41\x4b\x54\x72\xbd\xb4\x98\xb7\x10\x35\xeb\x56\xab\x41\x73\x55\x1f\x96\x4f\xe7\x52\x16\x40\xfd\xba\x7b\x37\x55\x3f\x7a\x3d\xf2\x21\xbf\xf6\x56\xf8\x15\xf7\x42\x72\x3d\x73\x50\x92\x63\x8d\x33\x84\xc1\x91\xeb\x2f\xbd\x5e\x72\x81\x2b\x3b\x59\xd7\xa9\x4a\xe9\x9d\xe1\xde\xdf\x64\x20\xb8\x48\x41\x69\x43\x7e\x9b\xa5\xf1\x99\x14\x6c\x40\x3c\xe3\x79\x17\x56\x02\xca\xfd\x11\xeb\x53\xf5\x49\xb2\xd6\x4f\xf8\x55\x44\x8e\xc6\xb4\x6c\x09\x29\x7c\x61\x4d\x06\x79\xad\x7b\xed\x9f\xbc\x56\xe2\xa8\x9c\x67\x3e\x25\x9f\xde\x96\x94\x9b\xed\x06\xa7\xd7\x19\x0e\x4e\x2b\x96\x03\x35\xdd\x37\xba\x0e\x16\xba\x9e\x99\x3d\x5d\x0a\x96\x0d\x31\xe7\x10\x6e\x16\xb8\x5f\xb8\x5e\x9d\xda\x94\x62\x46\x6d\x26\xe4\xe7\x8b\xf0\xdc\x24\xe4\xf8\x9a\xb9\x91\x63\xb6\xc2\x9c\x7d\xf7\x82\x4e\xcf\xc1\xeb\x4d\x7d\x87\x86\x90\xf5\x7b\xed\x4e\xc4\x91\x94\x7e\x0d\x37\x2c\xf9\x74\x35\x63\xe7\x2c\x73\x90\x81\xd2\x48\x10\x67\xaf\x49\xeb\xef\x7c\x06\x6a\x75\xcc\x70\x1a\xc7\x69\x22\xef\xe5\x59\x36\x57\x89\x89\xb1\x60\x56\x65\x39\x8c\x61\x03\xc4\x6e\x3e\x44\xa5\xbf\xb5\x82\x91\x3e\x69\x19\x93\x9a\xb1\xaa\xa8\x42\x02\x46\x16\xd2\x46\x15\xf9\x31\x9a\x54\x8c\x24\x5f\x30\x25\x0a\xa6\x39\xe1\x05\x58\x57\xb8\xb2\xf9\xa9\xb4\xd8\x35\xa1\xce\xe1\x46\x7e\xfe\x1b\x47\xca\xd2\xe9\x31\xd9\x64\xca\x0b\x5a\xcc\x09\xcd\x52\x2a\x94\xe1\x02\x4a\x22\x14\x8c\x26\x73\x22\xc6\xe9\x74\xca\xf4\xd9\xbb\xf6\x82\xbc\x7f\x83\x96\xa8\x14\x34\xea\x46\xe6\x52\x23\x32\x9a\xc2\xb5\x97\x91\x2b\x80\x5c\x73\x57\x35\xed\x7c\x3e\xd8\x27\xfe\xdf\x7e\xdb\x44\x59\xfa\x4d\x63\x97\xa5\x56\x5e\xe2\x8d\x38\x9b\x89\xf1\xe1\x3c\x8f\xfd\xa6\xe6\x31\x34\x3a\x3d\x3d\xdc\x79\xf3\x7e\xe7\xe8\x74\x77\xef\x68\xe7\xfd\xde\xd6\xcf\x87\xa7\xdb\xfb\xa7\x7b\xfb\x47\xa7\x1f\x0e\x77\x4e\xf7\xdf\x9f\xfe\x7d\xff\xc3\xe9\xc7\xdd\x9f\x7f\x3e\xfd\x61\xe7\xf4\xed\xee\xfb\x9d\xed\xbe\x95\x3f\xdf\xf2\x82\x1c\xd1\xe9\xce\x39\xcb\xcb\x83\x6c\x36\x4a\x73\x15\xa2\x95\x0a\x32\xe5\xd3\x59\x46\x71\x1d\xa7\x2c\x57\x79\x70\xe1\x4b\xa7\xfd\x8f\xb3\x41\xbf\xf2\x77\x57\x43\xff\xa0\xd4\xe1\x25\x13\xe5\xea\xac\x4c\x33\x51\xfd\xfa\x3d\x1b\xa5\xa2\x2c\xe6\xfd\xd0\xc3\xae\xd3\xba\xe0\x53\x3a\xa2\x25\x2f\x44\xbf\xf6\x04\xdb\x29\xd1\x5e\x67\x7f\x33\xfb\xb5\xdf\xf8\xc6\xf9\x6e\x7b\xff\x9d\x79\x7c\x04\xd1\x97\xc1\xc7\xfe\x17\x30\x8e\x9f\x53\x51\x32\x90\x4b\x83\x8f\x31\xff\xd6\xc6\xca\x8a\x14\x67\xd0\x79\xe3\x0d\x10\xd3\x7b\x63\x63\x32\x1a\xe7\xd8\xbc\x70\x75\x37\xf6\xa9\xab\xcd\xc2\x22\x77\xc2\xb5\x52\x8d\x8d\x7d\x4a\xbd\x74\x85\x5a\xf5\x28\x32\x8d\x36\xdd\x7b\xaf\xf1\x99\xbe\x58\xac\x7a\xdb\xf0\xf2\x9c\x0e\xf9\x2c\x4f\xb6\xd9\xf9\x11\xe7\x99\xa8\x28\xe2\xd0\xdb\x44\x9e\xf9\xba\x01\xe4\xa9\x92\x57\x3d\x74\x41\x99\xbb\xb7\x4d\x4c\x87\x04\x85\x84\x6a\x67\x91\xc4\xf9\x60\x96\x27\x19\x1c\x0b\x7d\xb2\x26\x1f\x9c\xb3\x42\x40\x98\x09\x0c\xf7\x17\xfc\xcb\x5e\x66\x58\x71\x80\x59\x53\xf7\xe8\x84\xf5\x25\x4f\xa2\x71\xb9\x9a\xf0\x49\x0b\xfd\x62\x4c\x02\x37\x7f\x0a\x0f\x1f\x92\x9d\xcf\x2c\x9e\x49\x54\xed\xe4\xe7\x69\xc1\x73\x10\x4e\x63\x9a\x7f\x10\x4c\x8a\xab\x0f\x1f\x92\x8b\x34\x4f\xf8\x45\x54\xf2\x29\x20\x51\xfd\x29\x8f\x3f\xe7\x5e\xb7\xeb\x14\x8a\x7c\x33\x2e\xf8\x84\xc9\xeb\xdd\xdb\xb4\x60\x43\xfe\x19\x5c\xa1\xce\xd3\x44\x5e\x14\x12\x7e\x91\x43\x62\xc4\x2c\xcd\xe1\x5c\x95\x87\x01\xf8\xe2\x49\x52\xb5\x36\xc0\x9c\x9e\xa7\x40\xed\xd1\x4c\xb0\x62\x6b\x24\x87\xa5\x8b\xf9\xb4\xb0\x87\x56\x87\x7c\xaf\x4a\xc2\x2e\x6c\xbd\x93\x8c\x64\x5b\xac\xfb\x03\x29\x99\x16\xb5\x56\x63\x56\xc0\x7d\xe3\x23\xe8\x1c\x63\x2e\x05\x14\x85\x86\x8c\xc7\xa0\x18\x8e\xf4\x2b\x47\xee\xda\x86\x58\x12\xbc\xe2\xe6\x84\x7d\xe6\x65\x1a\xab\xf2\x33\xe0\x4d\x12\xc3\x2c\x56\x8d\xe5\xb8\xdf\xeb\x45\x8e\xd2\xae\xf7\xff\xda\x50\x4f\xea\xf5\xe5\x30\xcd\x58\xa7\xff\x40\x25\x21\xd7\x3d\x75\x2a\xc1\x4f\x82\x67\x2c\x4a\xf3\x21\x6f\xb7\xbe\x89\xb7\x35\x9a\x8d\x0d\x88\x98\x55\x37\xb6\x63\x4a\x06\xac\x2c\x59\x41\x12\x79\x0c\xf3\x29\xe8\x11\xd8\xe7\x29\x2b\x52\x06\x44\x0a\x2d\x75\x51\x2b\x37\x3f\x65\xc2\xce\x4b\x09\x4b\x36\x68\x5b\xac\x80\x2e\x24\xcd\x58\xbf\x25\x8f\xeb\xff\xce\xe1\xc0\x4e\x47\xe3\x92\xe4\x4c\x39\x3c\x08\x49\x04\x12\x6b\x19\xf9\xf1\xe8\xe8\x40\x1b\x92\xda\x8e\xfb\x01\x40\xe8\xf5\x3a\x4b\xf4\xbf\x3a\xa4\xbf\xc1\x09\xde\xea\x74\xe5\x9c\xf2\x72\xf5\x82\xc9\x0e\xfb\x03\x9e\x25\x21\xc3\x14\x24\x07\xf4\xb5\xb5\x0f\xd6\xc9\xa6\xd6\x80\x0c\x0b\xc6\xfe\xc1\xda\x5f\x56\xfe\xa2\x33\x8e\x11\xdf\xc3\xcc\xfb\xf0\x29\xd9\x24\x6d\x17\xce\xc3\x87\x56\x07\x0c\xda\x3a\xfb\xce\xcb\x7d\xcc\xe2\x14\xb5\x3f\x72\x79\xac\x20\x84\xe9\xae\xa1\x2a\x78\xb4\xa2\x03\x89\x20\x96\x28\x3e\x9b\x83\xc1\x76\x42\xcf\x98\x20\x69\x09\x96\x3f\x3c\xe7\x07\xbc\x1c\x93\xf7\x3c\xcb\x66\x98\x9d\xf4\x3f\x99\x28\x31\x4d\x32\xe0\x6a\x9b\x4f\xb4\x9a\x18\x86\x7c\xdc\x52\x33\x6b\x9d\x90\xd7\x0d\xcf\xfb\xce\xf3\x8d\x95\x95\x09\x4f\x66\x19\x8b\x70\x74\x42\x67\xe4\xdb\xe6\x90\xd3\xff\xaa\xd3\x46\x63\x46\xef\x11\xf9\xb8\xf3\xc3\xc1\xd6\x9b\x9f\xc8\x2f\x5b\xef\xc9\xee\xde\x7f\xee\xbc\x39\xda\xdd\xdf\x23\x8f\x7a\x57\x91\xbc\x7c\xb4\x15\x80\x2e\x39\x3d\xbd\x60\x83\x29\x8d\xcf\x4e\x95\xd6\xf5\xf4\xb4\xfd\xb4\xd3\xe9\x40\x7e\xd1\x47\x3d\x72\xd5\xe9\x4a\x70\xcf\x9e\x7c\x47\x1e\xf5\xd4\x33\x73\xe5\x6a\xe3\x70\xba\x64\x11\x38\xb9\x37\x56\xee\x4b\x6a\x13\x50\x7d\xf5\xfe\x86\x4e\x5d\xfa\x86\x4f\xe7\x05\xd0\x64\x3b\xee\x90\xf5\x27\x6b\x4f\x57\xa7\x05\x13\xa0\x63\x78\x4b\x63\x36\xe0\xfc\xac\x4b\x76\xf3\x58\xa7\x2b\x85\x45\x70\x72\xe2\xcb\x05\xc9\xd2\x98\xe5\xf2\xb0\x9f\x19\x77\x9a\x77\xbb\x47\xfa\x31\x1e\x14\xaa\x36\x9d\x04\xf1\xf3\xee\x9b\x9d\xbd\xc3\x1d\xa0\x6c\x5d\xb2\x0e\x04\x54\xf4\x5b\xe1\xc5\xdc\x78\xfd\xa8\x8e\xe4\x05\xd2\xe4\x4b\x2d\xe7\x53\x06\xb5\x55\x04\xa4\x30\x55\xe4\x3b\x9e\x4f\xc7\x2c\xc7\x03\x30\x84\xd0\x67\x6b\x4f\x34\xc1\x4e\xc4\x81\x94\xd5\xa1\x0c\x4a\xef\xff\x4d\xc4\x6a\xcf\xa6\x72\xfd\x51\x83\x81\x4c\xf4\x74\xc2\x32\xc9\xa2\x12\xf2\xe6\xf0\x10\xf4\xe9\xac\x28\xe7\x90\x59\x09\x7c\x15\x09\xfb\x4c\x27\xd3\x8c\xf5\xd5\xd8\x08\xf9\xde\x0e\xe4\xb0\x9c\x67\x70\x02\xb5\x5b\x03\x1a\x9f\x8d\xc0\xf4\xff\x86\x67\xbc\x68\x75\xb0\xf1\x2b\x72\xdf\xbe\x59\x8d\xe5\xab\xfb\x8b\xc0\xbc\xe3\xff\x38\x2a\x68\x2e\x52\xd4\xae\x1a\x20\xab\x13\xfe\x8f\xd5\xd2\xbc\x59\x08\x63\x22\x1a\x40\x88\x0a\x04\xf9\x6a\x4b\x90\x77\x3c\x61\x45\x9e\xfe\xa3\x20\x62\x36\x1a\x31\x51\x0a\xd2\x56\x29\x7a\x27\xfa\x55\x14\xf3\x49\x2f\xe1\xb1\xe8\xfd\x75\x5a\xb0\x61\xfa\x99\x25\x9d\x2e\xa1\x39\xf9\x34\x11\x9f\x08\x3e\x92\xe0\x40\xfa\xcf\xcf\xd1\x15\xa2\xe4\xe4\x93\xec\xf5\x53\x35\x11\x2e\x06\x27\x5e\xa9\x20\x45\x2f\xdb\xad\x7a\xe5\xa7\xae\x0d\xcc\x12\xdb\x79\xe9\x6b\x4d\x2b\xfd\x32\x2a\xd0\x2f\xa0\x6d\xc8\xa1\x4b\x5a\x72\x40\x2d\xdc\xc0\xb5\x6d\x5e\xef\x67\xa3\xba\x43\xd7\x9e\xdc\xe1\x0e\x5d\xf9\x1f\xb4\x47\x41\x9d\x31\x9b\x4e\x59\x21\xb7\x93\xb3\xfd\xda\xc7\x5b\xab\xff\xf7\xa4\xd3\x1b\x5d\xbf\x05\x75\xbe\x9b\xeb\xf6\xdd\x4d\xb7\x9b\x7c\x29\x2f\x42\x72\x8b\x43\x51\x51\xcc\x9c\xd6\x85\xd3\xf9\x53\x7d\xd5\x3f\x99\x3b\x34\xde\x95\xe4\xd9\x23\x14\x73\xc8\xe6\x12\x1a\xba\x3e\x66\x19\x39\x67\x79\xc2\x0b\xb5\x03\x18\xe4\xd2\x88\xb3\x59\x92\xe6\x23\xd8\x1a\x77\x46\xf9\x21\x82\xc7\x47\x86\xca\x6b\xd8\x97\xd4\xfe\x60\xad\xd5\xa9\xa6\xb9\x5c\x48\xfa\x75\x8a\x5f\xfb\xf3\x4c\x6a\x3c\x93\x80\x78\xd3\x7f\x34\x1f\x49\xeb\xe1\x23\x69\xd5\x3f\x93\xde\xe8\x3d\x20\x37\x84\x59\x8a\x9b\x9c\x49\x7a\x20\xc1\x23\x09\x77\x42\x70\x93\xbc\xf1\x8e\xa4\x00\x94\xca\xc9\xe3\x00\xf1\xce\xaa\xc5\x20\x44\x18\x82\x7b\x52\x39\x07\xd2\x56\x9e\xa4\xe4\x70\x22\xb7\x98\x3e\x91\xe4\x1b\x7d\x28\x5d\x5c\x5c\x44\x34\x4f\x52\x21\x5b\xc0\xc1\x34\xc8\xf8\xa8\xb7\xfe\x64\x6d\xbd\xf7\x64\xdd\x9e\x59\xab\xfa\xa4\xea\xa9\xa3\x6a\x75\xf1\x59\x95\xc9\x3d\x02\x29\x89\xef\x62\xe7\xd6\xf1\x10\xd8\xc1\xba\x51\xbb\xb2\x95\xdd\x03\x0b\xce\xab\x86\x5d\x5b\xeb\xa4\xbe\x7b\xd7\xff\x3c\xaf\x9a\xcf\x2b\xdc\x6a\xce\xc6\x5c\x6d\x47\xde\x49\xd5\xb4\x31\xaf\x39\xa9\xcc\xba\xde\x70\x13\xde\x05\xc1\x2d\x73\x52\x78\xf3\x76\xad\x31\xa7\x5d\x12\x8f\x69\x41\xe3\xb2\x96\xf2\xde\x3c\xf7\xdd\xd6\xf1\x4a\xb4\x98\x3c\xeb\x54\xf9\xf4\x4e\xcf\x94\xc6\x7b\x98\x85\x3d\x2d\x78\xcc\x04\xa8\xd3\x56\xd4\xd5\x17\xfd\xf1\x54\x40\xf9\xdc\x5e\xd6\xee\x9f\x9e\x32\xf1\x0e\xc6\x72\xbf\xab\xdc\xa9\xb2\x19\xeb\x83\x3a\xcd\x5e\x8a\x4f\x41\x8f\x91\x88\xf5\x26\xde\x5f\x6d\x28\x2f\xcf\xa7\x10\x04\xce\xa7\xef\xb1\x99\x8a\xea\x6a\x1b\x58\xe6\x1b\x7f\x70\x4d\x7d\xbc\x6c\x68\xbf\xa8\xab\x0a\x64\x03\x61\xc4\xca\x03\xed\x62\xb6\x3f\x6c\xe8\xf0\xdb\x86\xe6\xeb\x0b\x3a\xf4\x5b\x1a\x00\x71\x46\x85\x78\x43\xb3\x0c\x2c\x4e\x4d\x33\xfc\xae\xa1\xfd\xa2\x19\x56\x20\x5b\x08\xe8\x3b\x28\xdf\x36\x75\x67\xaf\x90\x6e\xeb\x85\x9d\x39\x40\xcd\xb7\x53\x4c\xe8\xc0\xde\xf0\x5c\x94\xc5\x4c\x72\x27\x2c\x94\xdc\xd8\xef\xda\xf5\xdf\x2e\x1a\x45\x73\x87\x06\x6e\x9a\x8f\x59\x91\x96\xcd\x53\xaf\x37\x5d\xd4\xa3\x01\x67\xbe\x2a\x94\x0d\x3d\x08\xdc\x6f\xb5\x88\x5c\xa0\x81\xc5\x46\xc1\xa7\x47\xf3\x29\xd4\x86\x0a\x01\x7e\x52\x6f\xb9\x08\xb8\x69\x64\x3e\x1b\xc8\x23\xbf\x69\xd8\xcf\x9e\xbd\xac\x34\x5c\x04\x1c\x5b\x98\x0f\xca\x31\x9b\x30\x6d\x26\x68\xc2\xcb\xcb\xf5\x70\xfb\x45\xfd\x78\x0d\x1d\x2e\x43\x63\x30\x9a\x34\xce\xe5\xdb\x7a\xdb\x45\xdd\x98\x46\x1d\x37\x00\xb4\xa1\x35\x1f\xfc\xda\x21\x5f\xf4\x59\xc1\x07\xbf\x82\x4d\x62\xf0\x6b\x64\x99\x29\x79\x0d\xcf\xfb\xe4\x8b\xa9\x6e\x00\x0f\xae\x36\xc8\x95\x2d\xb4\xe3\x19\x10\x21\xcd\xb5\x3c\x7a\x3f\xc1\x9c\x3f\x19\x61\x18\x0a\xdd\xec\x6a\xf5\xa0\x14\x05\x74\x0b\x7a\x4e\xd3\x0c\x1c\xcf\xa0\xfc\xba\x55\x07\x43\x9d\xc3\x72\x4c\xf3\x33\xf0\x19\xc3\x87\x31\x66\x21\x89\x02\x5d\x2b\x5f\x09\x29\x2f\xb2\x02\xec\xfc\x03\x46\x20\xfe\x83\x96\xe4\xd1\x23\x23\x7e\xe8\x2a\x92\xce\xa0\x0b\xc6\x1e\x3d\x8a\xe0\x78\x96\xe8\x7e\x37\x4b\x8f\xe4\xe0\x0e\xd0\x28\xe0\xfb\x17\x9f\xc2\x40\x1e\x58\x4f\x24\x38\x71\xda\x4f\xba\xce\x36\x8c\x14\xbe\x3a\xed\x2a\xa8\x2e\xa9\x7d\x0f\x96\x6f\x03\xbf\xfa\x41\x5b\x65\x49\x89\xfd\xb4\xbe\xd0\x5f\x85\xc3\xda\x5e\xa5\x50\xd5\xad\x81\xd2\x8e\x03\xbd\x1e\xf9\x1b\xc3\x72\xf4\x7c\x56\xa2\x24\x37\x61\xd6\x97\x34\xd6\xa9\x74\x62\x9a\xeb\xca\xb9\xc6\xa6\x75\x0a\x02\xdb\x26\x0e\xa0\x99\xf5\x55\xc7\x52\x43\x44\x74\x7a\x0a\x6a\xf9\xd3\x53\x72\x79\x89\xd0\x2a\x27\x54\x33\x12\x3b\x1d\x54\xd7\x22\xe8\x0a\x82\xf4\x2c\x61\xa0\xd1\xa0\xe0\x34\x51\x0c\x03\x3a\x51\x5c\xc1\x02\x57\x2a\x78\x6c\x3e\xcb\xc5\x6c\x20\xe2\x22\x1d\xb0\xdd\xc4\x73\x5f\xc1\xf7\x80\x2f\x18\xcb\x75\x2f\x2b\xdc\x41\xf7\x17\xa5\x18\xf5\xd1\xd6\xc3\x35\xe1\x20\xda\x7c\x8a\xe6\x7d\x5c\x12\xc1\x49\x5a\xea\x65\x40\xaf\x60\x1d\xf1\x67\xe3\x31\x43\xb3\x8d\x04\x2b\x0f\x4b\x5a\xb2\x36\xbe\x98\xb0\x62\xc4\xf6\xe5\xf8\x7e\xe6\x31\xcd\x60\x90\xea\x15\xa6\xab\x85\xfe\x3a\x7e\x52\x55\x78\x6f\x62\xf6\x90\xe2\x9c\x33\x76\x11\x91\x1f\x23\x95\x9e\xb1\x79\x9f\xb4\x74\x39\x05\x95\x41\xa8\xd5\x55\xc4\x04\x32\x9a\x5b\xec\xc9\x6d\xd5\xf6\x0d\x5b\xa7\x05\x1b\x6e\x54\x5c\x12\xe4\x33\x28\x9b\xdd\xc5\xc1\x55\x44\x2a\x3b\x3e\xd9\xb0\x5b\x59\x91\xe8\xcd\x8f\x5b\x7b\x7b\x3b\x3f\x77\x89\x8f\xb9\xce\x72\xc0\x5a\x93\xca\x9c\xf7\xd1\x9c\xdb\xea\x3a\x36\x2f\x31\x66\xac\x14\xef\x68\x4e\x47\xac\xe8\x13\x07\xdd\xde\x9b\xae\xf9\x20\x49\x05\x64\x50\x93\xb7\x43\xf1\x37\x2c\xf1\x0a\x46\x55\xe7\xd3\x86\x36\xc6\xaf\xaa\xab\x70\x65\x3d\x35\x88\xbb\x18\x35\x8f\xef\x86\xe5\xa8\xb5\xab\x2e\x88\x1c\xd2\xba\x8a\x57\xd8\x70\x5c\xd7\x0e\xf5\x06\xd2\xd6\x23\x87\xc7\x74\x49\x3a\x24\xea\xe2\xa9\xbe\x08\x6e\xbb\xa6\xcd\x63\x5a\xc1\xd6\x8f\x0c\xa3\xb2\xdc\xd9\xee\x41\xd7\xf8\x88\x83\xf5\x37\xa8\xfd\x63\xc3\x75\xa7\x7a\xcb\x8b\x0b\x5a\x24\xae\x8f\x0d\xee\x45\x1d\xb4\xcc\xeb\x9b\xcf\xe9\xa2\x69\x07\xae\x2f\xd8\x82\xeb\xa1\x3d\x68\x5d\xe4\x16\x2d\xe2\xc7\x34\xcb\xde\xb3\x98\xa5\xe7\x40\xaa\xe2\xba\xc5\xac\xb6\x87\x9c\x70\x07\x7e\x4a\x12\x8f\x17\x69\x53\xa8\x8b\x03\xc7\x04\x5c\xe5\x20\x18\xc2\xa1\x61\xaa\x19\x39\x0b\xd1\xc4\xa5\x9a\x99\x54\x15\x58\x30\x7b\x47\x33\x72\x94\x23\xe5\x32\x78\x51\x4d\xdb\x95\x0c\x25\x75\xfa\x0c\x85\xa9\x34\x51\xac\xf3\x65\x85\x66\xeb\x80\x83\x51\x8a\xbd\x1e\xf9\xc8\x4c\x56\x48\xcc\xcc\x60\x65\x24\xf4\xf4\x72\xfd\xba\x28\xb8\xec\xce\xf2\x9c\xc9\xd3\x82\x42\xd0\xb6\x8a\x8e\x5f\xa9\xe3\x2a\x84\xf2\x16\xba\x76\xe1\x66\x86\xe8\x32\x02\xcd\x6c\x75\xee\x8a\xe0\x40\x73\xdc\x2e\x0e\xa5\x04\xb1\x1d\x5c\xdf\xcc\xfc\xf4\x28\xf0\x88\x13\x95\x67\x02\x17\x09\x75\x8e\xa8\x30\x62\x13\xe6\xba\x21\xa8\x08\x08\x0b\xa8\x31\xe4\xc1\x9c\x1c\xb6\x6d\xbb\x72\x72\xd7\xfd\xdf\xc0\x2b\xa5\xda\x6a\x11\xc8\x26\x0f\x3a\x38\x56\xb4\x6a\xc1\x9e\x27\xf2\xf8\xaa\x80\xef\x3a\xd0\x9a\x99\x00\xae\x6a\x03\x65\x9b\x70\xa4\x4a\x84\x89\xb3\x61\xfd\xaa\x09\xd0\xc1\x89\x5b\x20\xb0\x7a\xaa\x6f\xac\x5c\xa9\xcb\x9e\x25\x6f\x4f\x8a\xad\x89\x78\xaa\x95\x2e\x0b\x2b\x87\xd2\x78\xc2\xa1\x9f\xf1\x4a\xed\xd0\x04\xe1\xf3\x6a\x63\x25\x00\xde\xbd\x6a\x2a\x75\x51\xc4\xf2\xf3\x68\x6f\x7f\x7b\xe7\x74\x67\xef\x17\xd8\xa8\xf7\xa7\x05\x4f\x66\x80\x94\xfb\xe4\x35\x8c\x01\x6e\x2e\x84\x3c\x22\x7f\x07\xa7\xe3\x9c\x40\xac\xb8\xf5\x00\x92\x7b\x2c\x33\x45\x41\xd1\x74\x04\xf3\xfe\x8f\xb5\xe7\x5d\x42\xd1\x69\xd3\x7d\xfa\x02\xc8\xf1\x51\x6f\x85\x98\x73\xa1\xef\xde\x6f\x0d\xba\xc0\xfb\x36\x15\xea\x2a\x96\x74\x43\x83\x51\x18\x82\x1d\x35\x32\x08\x52\x94\x8f\xd6\x30\x4c\xce\x8e\xaa\x53\x74\x23\xc3\x01\xc8\x0b\x96\x12\x16\x67\x82\x0d\x67\x19\x56\x16\x2a\x0b\x0a\xde\x59\x1e\xe7\x80\xdb\x15\x9f\x95\x10\xcf\xa6\x80\xff\x78\xf4\xee\x67\x04\x64\x13\x3d\x88\x92\x4d\xf5\x49\x8e\xae\x30\xaa\xaf\x9f\x59\xd9\x12\x44\xd0\x39\xf8\x6e\x43\x70\x3e\x74\x81\xfe\x2f\x74\xca\xb3\x8c\x43\x5e\x97\xcf\x65\x01\xae\xb5\x78\x89\x78\x04\x90\x7e\x9b\xb1\x22\x65\x82\x4c\x68\xc2\xb4\x3c\x0b\xf7\xd4\x21\x8d\x4d\xec\xb6\x1c\x5a\xe4\x23\x47\xa4\xa3\x3c\x1d\xa6\x31\xcd\xcb\x6c\x4e\xc4\x94\xb1\x84\xcc\xa6\x28\x31\xe3\x2c\x69\xe6\x20\xc7\xb9\x7d\xaa\xf5\x69\xa4\xbf\xd0\x72\x0d\x38\xcf\xbc\x35\x3a\x92\x48\x70\xe9\x93\xa4\x02\xaf\x98\x25\x27\x09\x4b\x66\xd3\x2c\x8d\x21\x38\x1e\x8c\x96\xd0\x94\x98\x94\x4f\x5a\x09\x3e\xa5\x23\x66\x16\xac\x25\x9c\x0f\x25\xfe\x2c\x8b\x6f\x2b\x99\x09\xd7\xbc\x43\x62\x3e\x9b\x66\xfa\xcb\x7d\x77\x49\xc0\x09\xde\x5e\x80\x35\x21\xe7\xec\xc2\x64\x91\x43\xcd\x37\x8d\xc7\x10\x47\x08\x1e\x38\x1a\x27\x95\x1d\x17\xc2\x04\x96\xe2\xf0\x70\xb1\xa5\xb8\x3f\xbe\xb2\xd0\xe0\x69\x03\x94\x9c\xed\x0f\xe5\xb3\xf6\xf1\x82\x4e\x82\x9f\x4a\xc6\x76\xd2\x71\xf6\xce\xca\x15\xe9\x93\x2f\x57\x21\xb6\x13\x3b\xd7\x08\xcd\x1f\x16\x30\xdf\xa6\xa3\x3b\x76\x20\x20\xe7\x6d\x90\xf9\x17\xa1\x0c\xd5\xcf\xf5\x21\xfa\xa3\x5b\x66\x08\xe8\x9e\xb5\x95\x24\x84\x92\x8b\x82\x4e\xa7\xcc\x53\x61\x70\xcd\x2c\xb0\x48\x3d\x19\xb3\x4c\xb6\x98\x48\x21\x60\xc4\x84\xa6\x3d\xc7\x91\x4e\x82\x63\x8e\x4f\x25\xfc\x2d\xb2\x34\x2f\x57\xd5\x2e\x59\x95\xc2\xd7\x6a\x96\xe6\x4c\x55\xc1\xef\xe5\x7c\x75\x32\x03\xdf\xe9\x55\xa5\x7e\x0f\x2a\x4c\x3e\xaa\xf1\x6d\x06\x0e\x11\xf0\xbb\x6d\x64\xd7\x2d\xcb\xae\xd5\xc1\xdd\x0c\xbb\x51\x67\xa2\x9a\xb4\x43\xf5\x59\xaa\x27\x98\x5f\x8f\xab\x7e\x93\x75\xea\x36\x6d\x34\x8f\xc6\x3b\x8b\x14\xad\x69\x8d\x5d\xf3\x3d\xd9\x7e\xd5\x25\xad\xea\x4b\xe5\xf3\xa2\xd0\xac\x81\x04\x50\xaa\x86\xb0\xd0\xae\xf2\xb5\xfe\x6d\x6b\xcf\x6e\x65\xf7\x09\x9b\xd8\x9f\x77\x36\xea\xa6\xa7\x50\xd3\xf5\xa7\x9d\x48\xd9\x7e\xa8\x90\xac\x5f\x59\x34\xdd\x01\x3e\xbf\xd5\x00\x7b\x3d\xb2\xf6\x5d\xb4\x16\x3d\x8d\xd6\x88\xd7\x53\xbb\x84\x20\xb9\xae\x32\x4d\x76\x80\xcc\x1f\x28\xf7\xc7\x86\xd1\x82\xea\x59\xb5\x69\xab\x7f\xa3\x43\xf2\x58\x7f\x17\xbd\xed\x92\x16\xf6\xd2\xea\x92\x2f\x04\x7b\xea\x37\x38\x22\xbc\xe8\xc0\x0d\xb0\x36\xe1\x17\x77\x69\x1f\xd6\xf3\x5f\xbf\x66\xfe\x5d\x12\x45\x11\x22\x61\xc4\xca\x9f\xd8\xbc\x69\xc9\xbe\xfd\xae\x83\x55\xda\x47\xfb\x07\x87\x4d\x3a\xf4\x17\xcf\x54\xa3\xe9\xee\x4e\xa3\x7d\xe5\x85\x6a\x53\x72\x1c\x58\x93\x45\xed\xa9\x6a\xb7\xbb\xb0\xd9\xda\xf3\x97\xaa\xdd\x03\x9c\xa0\xf5\xa8\x35\xa4\xd5\xeb\xe9\x23\xd4\xfa\xae\x8a\xf9\x64\xc0\x33\x15\xb2\x8f\x2f\x21\x04\x27\x61\x25\x2b\x26\x69\x0e\xc9\xa4\xac\xcb\x07\x5e\xc3\xda\xbf\x7c\x4b\x06\xb3\x51\xa7\x4e\xe5\xf7\x74\xef\x97\x97\xc1\x61\xbe\x58\xeb\xd4\x22\xf7\xe4\xa0\xb7\x40\xcf\xb5\xa1\xfe\xfa\xc1\xfc\xb5\x88\x65\xe7\x7c\x15\x72\x98\xa8\x8f\xe4\x6a\x1c\xc2\x6c\x50\xe5\x29\x9f\xfd\x44\x36\x49\x8b\x0e\xe2\x84\x0d\x47\xe3\xf4\xd7\xb3\x6c\x92\xf3\xe9\x6f\x85\xc0\xda\xcb\x5b\xc7\x87\x27\x64\x93\xbc\x94\xbf\x7f\x8a\xc4\x34\x4b\xcb\x76\xab\xd5\x89\x86\xbc\xd8\xa1\xf1\xd8\x19\xe8\x59\x87\x7c\x21\x3f\x1c\x9f\xc9\xe6\x67\x1b\x4a\x73\xa1\x18\xae\x9a\x31\x1c\xb5\x5b\x1d\x09\xf2\xde\x26\x79\x29\x11\xe0\xc6\x74\xbb\xad\x7e\xe8\x74\xa2\x5f\x79\x9a\xcb\xce\x64\xe3\x9f\x36\x56\xae\x3a\xe4\xb5\xe5\xf7\xe1\x2d\x4a\xbe\x04\xd0\x61\x31\x21\xc5\xb4\xd5\x73\x5a\x08\x35\xf7\x23\xb2\x69\x68\x4b\x81\x32\x78\xa1\x3f\xb3\x3c\x90\x2b\x46\xbf\x06\x57\x7c\xb2\x49\xd6\xf4\x83\x11\x2b\x0f\x15\xa1\x6c\x02\xe5\x47\x43\xd3\x56\xec\xe4\xb3\x89\xbc\xa1\xec\xee\xe0\x53\x95\xea\x0b\xfa\xf8\x1e\x61\xb9\x41\x23\x72\x9d\x14\x2d\xb7\x6d\xde\x19\x68\xf6\xf8\xf1\x89\x93\x82\xf0\x0c\x77\xa1\xd3\xf7\x6b\xbd\x39\xdb\x87\x1d\x29\x3b\xc4\xb4\x6c\xdb\xd7\xed\xc3\x4e\x07\xcb\x5c\xab\x26\x16\x94\x4a\x85\xb3\x09\x30\x9d\xc9\xe2\xdb\x5f\xc9\xa6\x5b\x67\xfc\x8c\xcd\xf1\x0f\x35\x11\x93\x47\xe7\xd7\x0e\x66\x36\x80\x19\xe3\x81\x73\xd8\x55\x69\x77\x24\xe0\xe3\x5f\xe5\x04\x3a\xe4\xe8\xf8\x8c\xcd\x25\xa9\x1c\xc2\x0f\x4c\x2e\xa4\xa8\xe5\x68\x03\x04\xbb\x07\x8d\xfc\xfe\xe5\x6d\xf9\x3d\x5c\x34\xc9\xea\xf7\x64\xab\x28\xe8\xfc\xaf\x2a\xac\x42\xbe\x81\x64\xb4\xee\x9b\x38\x9b\x25\x4c\x28\x2e\xb4\x98\xbf\x80\x59\x10\x1b\xfe\xac\x91\x19\xe6\x6b\xcf\x4c\xc3\xad\x81\xe0\xd9\xac\x64\xbb\x8a\x9c\xc2\xe7\xc0\xb7\xa1\xd3\xd2\x6e\xbd\xdd\xc3\xd3\xdd\xbd\x37\x3f\x7f\xd8\xde\x39\xf4\x3c\x48\x6c\x8b\x07\x68\x26\x61\x59\x17\x4c\x3c\xbb\x55\x82\xdb\x87\x8d\xa0\x49\x0e\x5a\x87\x48\x43\x4f\xac\xbd\xaf\x08\xc4\x69\xa4\x37\x44\x65\x4e\x6d\xd3\x5f\x97\xd4\xbe\x01\x8d\x85\xb1\x7e\xf8\x28\x97\x77\x2a\x41\x0e\xe9\x04\xcb\x5f\xfd\x5f\x56\x70\xc2\x7e\x9b\xd1\x2c\x2d\xe7\x84\x66\x23\x5e\xa4\xe5\x78\xa2\xbf\x5d\xc4\x01\x05\xcb\x86\xab\x52\x4c\xa6\x05\x33\xa1\x3b\x0e\xce\xc8\xc3\x87\x84\x65\x92\xcb\xb0\xac\x53\xa3\x68\x6f\x73\x2a\x25\x8b\x3c\x38\xcc\x76\x74\x82\x69\x6e\x34\x0a\x1c\x07\xc2\xbb\xb7\x89\x80\x3b\xf5\x58\x64\x07\x31\x40\xa5\x24\x1d\xe5\xbc\x60\x82\x8c\x79\x26\x85\xc6\x0a\xd6\x56\x49\xce\x4b\x37\x88\x59\xde\xf9\xda\x1b\xfe\x74\x36\x88\x1a\x7c\xa7\x86\x0b\x28\x5d\x23\x57\x32\xcd\xc9\xbe\xaf\x06\x55\x53\x3e\x01\xdd\x9a\x44\x95\x1a\x6b\xf0\xf3\xcb\x4b\xcd\x2f\xcc\xbe\xbe\x57\xc1\xf9\xea\x9a\x8e\x5c\x0b\xec\xf1\x6f\x6f\xb5\xc7\xd5\x76\xcd\x4b\x36\x6a\x36\xe3\xbf\x78\xa2\xb6\xe1\x84\x4a\xc2\x7d\x47\xcb\x71\x34\xa1\x9f\xd5\xb3\x34\x37\xcf\xd2\x7c\xe1\xf6\x4b\x3d\xea\x06\x94\xd9\xcd\xa0\xc6\x80\x8d\xdc\x33\x11\x9b\xbc\x22\x4f\xc8\x6b\x39\x00\x6c\x40\x1e\x2b\x30\x5d\xf2\x44\x32\xea\x49\x9a\x57\xc0\x87\xb1\x75\xbb\x10\x94\x20\xd3\x59\xd7\xd8\x79\xb0\x90\xe9\x59\xf9\x7c\x11\x8e\x2a\x6e\x5b\x69\x09\x67\x42\x97\x24\x4c\xc4\x1e\xcb\x7a\x10\xf6\xf3\xf2\x3f\x08\xe2\x60\xfd\x76\x4e\xfe\x4b\xca\xf6\x56\x58\x7e\x46\x7a\x64\xed\x79\xb4\x1e\x3d\x8d\x5e\x90\xf0\xa8\xf7\xbb\xe4\xa0\x4b\x4c\x3e\x4d\xd1\x59\x7c\x33\x20\x8f\xc8\xbd\xe0\xa5\xec\x65\xc7\xbf\x34\xf8\xdd\x84\x2f\x0f\x4f\xd7\x3b\xd1\x30\x78\x7b\x58\xbf\x9d\x6f\x78\x98\x58\xd6\xbf\xe2\x3e\xe7\xdb\xfa\x03\x03\xbd\x9d\x1b\xac\x5d\xaa\xef\x48\xb0\xc7\xf6\x7e\xe7\x46\xb7\x8b\x07\x4b\x79\xdb\xad\x3f\x03\xf7\xa6\xf0\xab\xb5\x4e\xbb\xe5\x43\x69\xd5\xf3\x6a\x54\x4f\xef\xca\xa8\xd3\xb2\xa2\xce\xa8\x8c\xab\x6d\x24\xda\x54\x25\x45\x92\x2c\x36\x44\x08\xb7\x73\xe8\xac\x2d\xf7\x17\x72\x5f\x69\x28\xee\x37\x5c\x68\xd7\x9f\x75\x24\x3c\xed\x5c\x84\xde\x99\x72\x78\xd5\x91\xdd\xbd\xca\x61\xed\x85\xbc\x4c\x86\x57\xe5\xe9\xb2\xc4\xbb\xf6\xe2\xbb\x4e\x34\x6c\xb7\xd2\x92\x15\xb4\xe4\xa0\x9f\xa9\x8d\xfd\x76\xda\x88\x9b\x9d\x5c\x3a\x3d\x65\xd3\x85\xf7\x3b\x64\x59\x46\xaa\x3d\x04\x9f\xe2\xbf\xd2\xd2\x93\x82\xd5\xd3\x98\x27\xec\x80\xa7\x79\xb9\x55\x2e\x3a\xee\x8e\xf6\x4f\x0f\x8f\xde\xef\xee\xfd\xad\x41\xd6\x2c\xc7\xb4\xec\x92\x29\xf7\xc2\xe0\x25\x08\xec\xa6\xad\xc6\x0c\xed\x3a\xae\x00\xe9\x9d\x97\xf2\x7b\x47\x02\x25\x9b\xa4\x7e\x29\xa1\x5d\x32\x70\xb2\xa9\xc1\x61\x2a\x05\x10\xf2\xfd\x26\xb1\xe2\x89\x19\x2f\x79\x4d\x5a\x2d\xd2\xb7\x59\x3d\xf1\x5b\x0a\xb0\xe3\x31\x2d\xde\xf0\x84\x6d\x95\xed\xd4\x77\x81\xa1\x12\xee\xe7\xe4\xdb\x27\x00\x9c\x92\xef\xe5\x5f\x83\xe1\x10\xbb\x7a\x4c\xd6\x40\x1e\xca\xc0\x85\x69\x50\x83\x25\x1b\x74\x3a\x08\x22\x46\x10\x03\x04\x31\x1c\x0e\x95\x70\xf5\xda\x1b\x23\x7e\x0f\xe3\x20\x7d\x42\x55\x9b\x7e\xa5\x8d\xc8\xd2\x98\xb5\xd3\x2e\x0c\x61\x5d\xb6\x6c\x53\xb2\xaa\x07\xfa\xea\x15\x59\x7b\xd2\x21\x8f\xe5\x88\x56\x55\xd7\xf2\xcf\x27\x9f\xd7\x9e\x3c\x79\xf2\xa4\x59\xee\x5a\xbf\x53\xd5\x12\x44\xdb\x80\x72\xb5\xf1\x2a\xf4\xad\xa1\x64\x4c\x58\xce\x9b\x88\xfe\x5b\xdd\x52\xb0\xf2\x88\x23\x2d\x1d\xd1\x51\x23\x60\xad\x84\xda\x55\x7b\xd5\x70\x48\xa5\x38\x91\x3b\x60\xfd\x39\xea\xbd\xa2\x35\xf2\x4d\xad\xdd\x37\xc7\xff\xf1\x1f\x7a\xa3\x9f\xb4\x3b\x41\xde\xf1\xfc\x49\xa7\x5d\xfb\xb0\x41\xb5\xfa\xa4\xe3\x32\x8e\x0a\xdb\x77\x6d\xb3\xa8\x3c\x59\xb4\x05\x1d\x5f\xbb\x2e\xd9\xdb\x7a\xb7\xd3\x05\x87\x0b\xdc\x70\xce\x4b\x9b\x7f\xd4\x14\xe4\x0e\x0d\xf7\x0b\x7c\xdd\x77\xd6\xa0\xbd\xa6\x21\xa2\x1e\xc7\xc7\x79\xbd\x7f\xf2\x98\xb4\x0c\xa6\x5b\x0d\x02\xda\xed\xae\xed\x40\x24\x07\x0d\xcb\xfd\x54\x5f\xbd\x69\xbe\xf0\x2c\x37\x8c\x73\x09\x0d\xe6\x72\x47\xc2\xd3\x97\x1d\xf2\x3a\x28\xff\xa5\x4c\x90\x7e\x83\x08\x9c\x32\x01\xd2\xa1\xf9\x0b\x97\x4e\x8f\xbe\xbd\x6f\xd4\x50\x56\xc3\x03\x1a\x1b\xe7\x0b\xdd\xa2\x49\x71\xa3\x79\xea\x13\xfd\xc7\x81\xa3\x79\xb2\xf7\xc1\x0e\x49\x0e\xa2\x21\x8c\x46\xeb\x68\xd2\xc7\x8f\x4f\xdc\xc1\x1d\x1f\x78\x4e\x01\xfb\xe1\xe5\xbd\xfd\x8d\x4d\x97\x44\x68\x42\xf5\x8b\x4e\xa4\x9b\x04\x0e\x6c\xf3\xf5\xc3\x87\xb6\xb8\x82\xfe\x61\x52\x75\xd6\x86\x7d\x97\xd1\xfb\x48\x82\x49\x72\xc4\x3f\xe4\x22\xe6\x53\x3a\xc8\x1a\x9d\xe0\x9f\x3d\xd5\xb4\x08\xe6\xf5\x26\x61\xf2\x59\x85\x8d\x35\x81\xfb\xee\x89\xd1\x29\x2d\xa1\xa5\x02\xe6\xb7\x0e\x46\x8f\x67\xa8\x41\x70\x52\x15\xb3\xbc\x2c\x24\x81\x76\x9c\x56\x6b\x4f\x6b\xcd\x40\x67\xeb\xb6\x59\xff\xae\xd6\x06\x94\x1a\x7e\xab\xa7\x4f\xaa\xad\x2a\x7c\x76\x49\x49\xec\x65\xa7\x0d\x70\xba\xa4\x05\xff\x7a\x82\x34\xc2\x63\x49\x97\x9c\xa5\xb9\x2a\x98\x80\x49\x95\x4b\x4f\xd3\xa5\xdb\x75\x36\x88\x14\x93\x40\x03\x6c\x9a\xe2\xe6\x21\xf5\xff\xf5\x7a\x58\xf6\x14\x6e\xe6\xa6\xf9\x99\xdc\x3e\x69\x9e\xd4\xbe\xe8\xf5\xe0\xb9\xc1\xc1\x73\x30\xb5\x7c\x03\xa3\xae\x9f\x3a\x50\x45\xb5\xdd\x59\xb9\xaa\x5f\x0c\x8c\xa6\x0e\x67\x62\x58\x44\x9a\x27\xe6\xe9\x59\x55\x41\xad\xe6\xf2\xf8\xb1\x29\xa4\xb1\x6f\xb5\x34\xdf\x6f\x12\xa3\xca\x53\xd2\x9a\x45\x53\x45\x4e\x32\x61\x69\x6c\x0a\xa1\x21\xe8\x2f\x24\x21\xe2\x00\x36\x49\x4b\x92\x44\xab\xe3\xb5\x7c\xd2\x25\x56\xf5\xe1\x35\x46\xda\xa8\x37\xd7\x6a\x26\x97\xe5\xe8\x77\xc7\x4a\x19\xa2\xdb\xc8\x46\x57\x5d\x0b\x0b\x29\xdb\xa8\xcc\x7f\x4e\x45\xe9\x52\x17\x49\x85\xc2\x3b\xe0\xfb\x14\x3f\xfb\x86\xb4\xbf\x8b\x9e\x45\xcf\xa2\x17\x5d\x82\x3f\x5e\x76\x56\xcc\x7e\x8b\xb6\x34\x34\xb2\x49\xdc\xa7\x05\x9d\x6f\xac\xac\x54\x77\x7b\x5b\x21\x61\x23\xf0\xc6\x8e\xb2\xfe\x4e\x6d\xba\xd0\x8d\xe2\xe9\x32\x9a\x8d\xf0\x95\xcc\x97\x31\x7a\x8f\x54\x85\x25\x09\x3c\xd0\xcf\xed\x14\x03\x5f\x71\x1f\x7c\xba\xbe\xdc\x7d\xf0\xe9\xed\x34\x01\xe1\xbe\x9f\x36\xde\x07\xbf\x6d\x78\xf3\xec\x69\xd3\x1d\xf2\xd9\xd3\x97\x37\x51\x80\xa0\x35\x26\xb0\x02\x77\x19\x62\x29\x77\xc2\xce\x9b\x77\x5b\x87\x20\xd3\x91\x17\xc6\x8e\x29\xc6\xe9\x04\x85\xa0\x8c\x0f\x68\xd6\x7c\xda\xe2\x81\x32\xa6\x4d\x53\x79\xa1\xa5\xae\xed\x9d\xc3\x37\xef\x77\x0f\x8e\xf6\xdf\x37\xd9\x7b\x9f\x1a\xd3\xeb\xf5\x3a\x36\xcc\x0a\x84\xbc\xa7\xf1\x5c\xd4\x5d\xbf\xdb\x39\xda\x6a\x8c\xd3\x7a\xd2\x89\x7e\xda\xf9\xbb\xea\x78\x48\xd3\xac\x71\x26\x6b\xfa\x2c\x1e\xd3\xa2\xf9\x3e\x6d\x26\x7c\xc3\x3b\xc8\x2c\x6d\x04\x09\x9e\x10\x90\xe0\xfe\xac\x51\xc4\x7c\x62\x9b\xec\x7c\x6e\xb4\x6e\xbf\xf8\xce\x36\xdb\x5e\x84\xbc\xb5\x97\x7a\xb6\x2c\x9f\x4d\x16\x88\xc1\xcf\x9e\x6a\xe9\x23\x15\xc0\xef\x1a\x57\xe3\xf9\x0d\xc5\xef\x1b\x98\xd2\x0e\x8a\x74\x92\x96\xe9\x79\xe3\x6c\x9e\x6b\x42\xc5\x0b\xce\x36\x13\xf1\x75\x57\xc8\xd3\x25\x2f\xa5\xa3\xfd\x83\xbd\x66\x8c\x3f\x7b\xaa\xa7\xfd\xe0\x6f\xfb\x07\xdb\x8d\xc8\x31\xa4\xbf\x7d\xed\xf5\xe5\xc1\xd9\x72\x6e\x15\xb2\x33\xe8\x34\x1a\x6e\xd8\x9b\xd1\x83\xed\x03\xfd\xb7\x1c\x39\xda\xa1\xe5\x04\xf4\xd3\x07\xc8\x78\xe4\x0b\xd8\xfa\x86\x11\xc1\xcb\xff\x3c\xdc\xdf\xb3\xaf\xe4\x5f\x0a\x5b\x18\x89\x9e\x0e\xe5\xfa\x63\xab\x87\x0f\xf1\x47\x64\x5e\x61\xd3\x83\xf7\xfb\x47\xfb\x47\x7f\x3f\xd8\x21\xe8\xc6\x85\x32\x4d\x0b\x5f\xfe\xb8\xbb\xbd\xbd\x23\x7b\xb8\x38\x13\xed\xd6\xe9\x38\x4d\x12\x96\xb7\xd4\xa4\x8e\xf6\x4f\x0f\xde\xef\xbe\xdb\x3d\xda\xfd\x65\x47\x37\x71\x16\xbf\x65\x08\x51\x99\xd2\xbf\x5c\x45\xda\xe3\x62\x17\x9e\x41\xbc\x1f\xc3\x56\x38\x2d\x9d\xb1\x92\x6c\xaa\x6d\xdd\x6e\x21\x0b\x5c\x2d\xd4\x1b\x0d\x75\x2b\xcb\xac\xed\xde\x6f\x2b\x74\x9b\xfd\x83\x7a\x13\x3e\x5d\xad\xb6\x02\xaa\x06\xe9\xc2\x78\x97\x1c\x1b\xac\x9c\x60\xa3\x0f\x87\x3b\xa7\x7b\x5b\x6a\xa6\xca\x75\xdd\x2c\x8d\xeb\xb6\x8e\xcd\xff\xcb\x6c\x15\xb5\x34\xff\xa5\x0d\x2e\x26\x7f\x1f\x30\x7e\x48\x93\x07\x5e\x7e\xff\x55\x12\xe4\xfa\x5d\xa2\x13\xd3\x8d\xd2\x72\x3c\x1b\x40\xe6\x8d\x7f\x64\x3c\x2d\x78\x7c\xd6\x8b\x79\xc1\x56\x7f\x15\x3d\x2c\xef\xd6\x5b\x7b\xf9\x54\x33\xb7\x12\x74\x8f\xf7\x74\xcf\x97\x97\xe6\xb7\x33\x99\x86\xc7\x50\xb5\x00\xc2\xb8\x36\xb4\xb1\x1d\xb2\x9f\x83\x25\x92\x67\x09\xd9\xca\x93\x82\xa7\x89\x1d\x5b\xcc\x13\x16\x8d\x38\x1f\x65\x0c\x06\x38\xed\x9d\x7f\xab\x07\x95\xb0\x92\xa6\xd9\xeb\x34\xd9\x7c\xf1\xed\x4b\x3d\x3c\xc4\x95\xda\xe9\xee\xe1\x23\xe9\x12\xf8\x7c\xcd\x83\x46\xbb\xfe\x29\x2d\x48\x72\x00\x6e\x26\x2d\x6a\x82\xb5\x46\xac\xec\x87\x75\x32\xc9\x81\x8a\x32\xc4\xd6\xda\xcf\xfe\x25\xb9\xea\x44\x74\x03\xbd\xe6\x3b\x9d\x88\x82\x53\x4b\xd5\x4f\xc5\x9a\xae\xb6\xad\x10\x0f\x3b\x43\x0d\x5f\xee\xe6\xb6\x43\x36\xba\xf2\x0e\x4a\xcb\xa6\x65\x87\x24\x50\x31\xda\xa5\x30\xe3\x3a\x91\x1c\xb8\xdd\xd4\xbe\x85\x7c\xcd\x25\xf8\x56\x3a\x5f\xcb\x8b\x7f\xad\xe3\xae\x1d\x5b\x07\xdd\x30\x92\x03\x5d\x6e\xb6\xa0\x53\x4f\xa4\x2c\xe9\xc8\x4e\x49\xcc\xe5\xae\xb4\x1b\xe9\xb8\xa4\xa3\x13\xc9\xc9\x14\xc2\x15\x7d\x3b\x74\x82\x8a\xa5\xf9\x04\x6f\x4e\x25\x1d\xb9\xf2\xfe\x7c\x62\x0b\xd6\xa4\xc2\xb0\x2d\x67\xe7\x3c\x7c\x58\xd9\x3a\x91\x16\xf3\x61\x0f\xe1\xbe\x6c\x55\x96\xc2\xa3\x05\xf5\x79\x5a\xba\x1f\xe0\xa4\x1b\xbf\x49\x4b\xe3\x4d\x6d\x7b\xb6\x43\x7d\xe0\x9b\xe6\x96\x31\x81\x2a\xb2\x00\x0d\x76\x09\xaa\x64\x6f\x8d\x1e\x54\x6d\x8a\x9a\x0d\x79\xcb\x6d\x14\x47\x29\x3a\x30\xa1\xc3\x8d\xc3\x3f\xdb\xd0\x18\xca\x26\x7b\xed\x2d\xb5\x8c\xa9\x68\xdb\xe5\x43\x2a\xec\x38\x65\x77\xef\x6d\x47\xcc\xb0\x59\xdf\x31\xe0\x9e\xfc\x56\x4e\x08\x39\x7c\xa7\xa3\x09\x12\xff\xee\x3a\x27\x73\x7b\xad\x4b\xbe\x5c\xd9\x08\xae\xb4\x3c\xc6\x46\x27\xda\x21\xa8\x31\x0b\xbb\x1e\xa4\xd3\x11\x12\xb6\x07\xa1\x13\x00\xe9\x55\x61\xdc\x76\x88\x72\x5b\x6e\x67\x3b\xab\xbe\x3b\xd0\x27\x2a\xef\x7d\xc7\x06\xe1\x19\xea\x74\x39\x50\x75\xe7\x5d\x39\x6c\xc3\x7b\x75\xb5\x11\x20\x91\x94\x35\xdb\xc9\x53\x86\x93\x3d\xa8\x28\x07\xd3\xb2\xaa\x1d\xd4\x72\x5c\xfb\xc0\xd3\x6e\x1c\x74\x3a\x41\x45\x60\x16\x56\x16\x2a\xa7\x2e\xad\x21\x44\xe5\x60\x95\xfe\xd4\x94\x2a\xaa\x42\x44\xbd\xeb\xdd\x50\xda\x09\x1b\x61\xab\x92\x3d\xd9\x9d\x9c\xfa\xec\x00\x36\x80\x5b\x76\xed\xd4\xb4\xed\x90\x7e\x1d\x79\x6d\xe7\xbd\x04\x66\x7b\x0d\x49\x07\xee\x18\x42\xef\xe5\x2e\xb1\x2c\x4d\x9e\xce\xae\x23\x1b\x1e\x02\x8b\xb6\x96\xd9\x4c\x18\x20\xef\xef\x65\x5d\xc5\xa4\xba\xc9\x20\x47\xbe\x7c\xe1\x6f\xed\x4e\xa7\x96\x76\x5d\xfd\x8d\xe5\x6a\xe5\x17\x66\x44\x1d\xf3\xa8\x06\xfd\xf2\x92\xd8\xa6\xce\xbe\x91\x0f\xfc\x8d\xf2\x9a\xec\x90\xbe\xda\x7f\x57\xd6\xe4\xbd\x7f\x91\xeb\xd5\xdf\x76\x8d\x34\xae\x7d\x3a\xd8\x46\xd3\x8a\x62\x70\x55\xcd\xdb\x52\x8c\x2a\xcc\x16\xbf\x16\x95\x9a\xd2\xb7\xf5\xb9\xab\x47\xa8\xbb\xda\x5e\x08\x79\x19\xf6\xd3\x21\x2e\x9f\x74\xf8\x99\x2e\xef\xd4\x84\xdb\x3d\x3a\xf1\x79\x41\xe0\xb5\x39\x8d\xe4\xf7\xb9\xfa\x40\xca\xf8\x6d\x0f\xb1\x66\xd7\x17\x4c\x60\xbc\xc0\xf1\x49\x90\x11\xf8\x3b\x1e\x00\x46\xae\x65\xc0\xe1\xfe\x01\xa4\x90\x4d\x1c\x03\x30\x01\x40\x86\x7c\x78\x6f\x53\x0b\xfa\xf6\x81\xbc\xa4\x77\xd4\x68\xa2\xe9\x4c\x8c\xdb\x1a\xe9\x57\xb6\xdc\x8e\x7c\xd9\x84\x1c\x2b\x7a\x37\xa0\x47\xfb\xb7\xba\x08\xda\x3d\x3c\xdd\x97\x0c\xb1\x4e\x3f\x1b\x21\x14\x62\xf3\xd7\x8e\xa0\xdf\x27\xbf\x37\x5a\x97\xc2\xaa\x19\x19\x50\x76\x55\x52\x54\x5b\xb6\xe3\xe3\xd7\x11\xc4\x0c\x6b\x0e\xe1\x5a\x79\xc9\x3c\x03\x1b\xa8\x72\x0d\x3f\xd6\x76\xc0\x94\xe7\x27\x1d\x88\xd5\xb9\x67\x05\x2f\x1c\xbe\xbd\x49\x9a\x05\xd1\x8e\xe5\xce\xf4\x80\x0d\xd6\xe5\xa5\x8e\xaa\xad\x75\x34\x9f\xb2\x9d\xa2\xe0\x45\xbb\xa5\xc0\x99\xba\x1b\xb1\xb5\x30\xde\x6b\x39\x8e\x00\x25\x68\x5b\x66\x69\xd2\x0e\x14\xf1\x7c\xe2\x95\xe9\x7c\x72\xe2\xda\xfa\x1d\x18\x0f\x04\xf3\xeb\x30\x2a\xd7\xcb\x6a\xc8\x77\x40\x18\x13\xac\xc4\xb3\xc0\x61\x30\xf8\xf5\x46\x45\x4a\xa9\xf1\x5b\xfd\x50\xb3\x8b\xae\x9c\x4b\xa7\xe3\xf3\x61\x25\x34\x7b\x02\x8b\x2f\x6d\x20\xdc\x92\x8e\xaa\x52\x15\x0e\x43\x8b\x2a\xd6\x2d\xa2\x72\x3d\xc2\xcb\x5d\xa7\x02\xd5\xa3\x2a\x00\xfe\x45\x2e\xc1\x30\x1d\xcd\x94\x64\x84\x75\xca\x84\xbc\x24\x01\xfe\xae\x7c\x27\x09\x79\x39\x80\x0b\x81\x89\x92\xd2\x1a\xbc\x80\xe4\xdf\x25\xad\x52\x69\xcf\x5c\xab\x8d\x7e\xd6\xae\xf8\x37\x39\x86\x8d\x2b\xcc\xec\xa2\x54\x1f\x64\xb3\xf9\x80\x92\xad\x41\x1f\x22\x1b\xf9\x32\xcc\x06\xd4\xe7\x08\x69\x6a\x5e\x74\xa0\xbd\xd1\x9a\xd4\x3b\x00\x36\xdc\x04\x60\x6d\x4d\x01\x08\x0a\x1f\x8d\x5f\xbd\x78\xd6\x09\x75\xa5\x08\x0c\x26\x1c\x58\xc8\xa0\xab\xe0\xda\x8b\x6f\x3b\x16\x7b\x6a\x01\xbc\xc5\x6d\x85\x86\xd6\xea\x86\x87\xec\x1c\xc4\x10\xc9\x8e\x0a\x48\x18\xac\xdd\x3d\x92\x5b\x55\x56\x0c\xa8\xe1\xe2\x4c\xe0\x3b\xa7\x40\x45\xd5\xff\xf1\x6f\x8e\xff\xe3\xc7\xaa\x2f\xa4\xe5\x39\x92\x1c\x11\x1d\x7d\xc3\x79\x80\x14\xc0\xb9\x19\x34\x99\xe2\x85\x3d\x23\xda\x18\x15\x03\x7c\x6d\x3d\x5a\xef\xea\x5f\x4f\xcd\xaf\x67\xe6\xd7\x0b\xf3\xeb\x5b\xf3\xeb\x3b\xf3\x6b\xed\x89\xfd\xb9\x66\x7f\x5a\x90\x6b\x16\xe6\xda\xb3\x15\x42\x5a\x63\x2a\x74\xad\x8c\x2e\x94\x08\x8a\x69\x79\x38\x2d\x18\x4d\x00\xa1\xfa\x8e\xda\x9d\xd0\x32\x1e\x77\x55\x72\xc7\xae\x60\xb4\x88\xc7\x5d\x31\x65\x71\xca\x44\x17\xe2\x6c\xba\x8e\x54\xd4\x2d\xad\xb6\xb9\x3b\xb3\x76\xa3\xd6\x4a\x47\x07\xe5\x74\x5b\x9d\xae\x0a\xd3\x70\xb0\x61\x99\xe3\xaf\x1b\x1d\xb9\x22\xf6\x15\x86\x62\xb8\x48\xbc\x60\x59\xf6\x53\xce\x2f\x72\x8b\x4a\x50\x48\xca\xa5\x8c\x44\xc9\x0b\xd6\xe9\x92\x33\xec\xa2\xda\xd6\x76\x74\xb6\xd1\xb1\x2a\xe8\x76\xb5\xdd\xf1\x99\xea\xf5\x5a\x57\x58\x77\xf9\xd5\xf9\xa0\x94\x35\x76\x6d\xf5\x99\x15\x0d\x79\x01\x32\x85\x5c\x82\x21\x2f\x5a\xee\x15\xde\x88\xa0\x36\xeb\x38\x15\x6d\x5f\x47\x88\x47\xef\xe3\x4d\xd2\x6a\x75\x8c\x57\x96\xdf\x04\x0e\x52\xe3\x8d\x15\x78\x27\xd1\xa5\x0e\x41\x23\xde\x74\xbd\xe1\x3e\xd7\xc3\x3d\x63\xf3\xb7\xbc\x68\x8b\xf9\xa4\x83\x42\xf0\x5b\xee\xd6\x50\x74\x5e\xbb\x32\x98\x56\x84\xc0\x8b\xfa\x21\x2a\xe6\x13\xf0\xc3\x31\x87\x28\xaa\x34\xcc\xf9\x69\xd6\x59\x4e\x35\xcd\x2b\x53\xc0\x50\x80\xe0\xb4\x36\x37\x09\x0c\x45\x61\x4f\x89\x37\x58\xc8\x50\xb0\x43\x38\x51\xaa\xba\x33\xa3\x44\x04\xf9\xd7\x36\x86\x64\x22\x8d\x8d\xf1\xe0\x23\x57\xe8\xaf\x7a\x33\x12\xb1\x0e\xd2\x06\xe7\x6b\x72\xfb\x6b\xe7\x1c\x75\x51\xdc\x27\xc7\xae\x6f\xcb\x49\xc7\xd4\x40\xee\xeb\xab\x6a\xd7\x03\xf0\x6c\x69\xef\x6e\x52\xf3\xcc\xae\x9c\x3c\x3e\xe0\xa7\x4d\x6e\x43\x15\xd7\xa0\x2a\xdc\x94\x89\xc0\x4d\xd8\x87\xfd\xc2\x71\x79\x0e\x5f\xce\x64\x1f\x12\x74\x53\x83\x7e\xf3\xd9\xea\x77\xf5\x32\xdc\x15\x5e\x58\xf6\xeb\x5d\xc0\x8b\x1a\x74\x78\xea\x03\xfe\x36\x0c\x58\x8b\xfa\x01\xd0\xea\x55\x0d\xb8\x7a\x8e\x54\xd5\xeb\x91\xf5\x67\xd1\xd3\x68\x9d\xf8\x16\x0c\x15\x8a\x73\xdc\x25\x8a\x2b\x17\xf2\xb7\x98\xd2\x98\x9d\x9c\x74\x56\xac\xe1\xe3\x1a\xaa\x74\x85\x65\x79\xfb\x6e\x50\x48\xeb\x38\xbf\x07\x6e\x40\x66\xaf\x47\xde\x1d\x92\x9d\x64\xc4\x74\x9a\x6b\xa1\x76\x31\xca\x77\x90\x05\x11\x06\x42\x05\xf9\x72\xb5\xa2\x72\x03\x0d\x7e\x4a\xcb\x25\x3e\x50\x49\xfc\x7a\x3d\xf2\xcb\xb7\xc8\x3d\x04\xe1\x39\x19\xf0\xcf\x2c\xd1\xd6\x61\x47\x55\x6e\x31\x73\x7c\x78\x02\x51\x98\xad\x63\x09\xe2\xa4\x05\xa1\xab\xf6\xf5\x17\x42\xfb\xe4\x90\x5c\x61\x9b\x2f\x57\xd5\xf7\xea\x0a\x75\xd8\x31\x0d\x36\x56\xae\x3a\x9d\x2e\x69\xc9\x91\xa9\x1d\x6b\x9a\x3b\xcc\xc1\x82\xb0\x4e\xef\x8e\x46\xc0\xea\x89\x2e\x2f\x8d\x96\x18\x6e\x6a\xfa\xbe\x0f\x55\x9f\x76\xbe\x55\x7f\x0a\x05\x50\x4e\xda\x7c\x6b\xbd\x89\x8b\x91\x3c\xf1\x8e\xd3\xf2\xc4\x77\x4a\x5e\xb3\x7f\x6a\xca\xe8\x92\x07\xfa\xa7\x17\x07\x19\xb8\x94\xa4\x1d\x80\x8c\xd7\x32\x27\x98\xd3\x06\x72\x1a\x72\x83\x68\x53\x71\xbc\x76\x62\xa5\x77\xa5\xa3\xb6\x4d\xfc\xac\x46\x0f\x9c\x6f\xfd\x01\xc9\x8f\xed\xdb\xcb\x4b\x72\x4f\xd9\x70\xdb\xfa\x21\x60\xc9\x7c\xed\x1d\x97\xfa\x36\xe1\x5d\x89\x0c\xb4\x8e\x09\x82\x33\x8f\x2a\x0a\xb2\xd0\xa5\xc8\x9e\x5e\xea\xa6\xa2\xe9\xcc\x09\x02\x54\xd7\x16\x85\x85\xda\x9c\x6a\x84\x19\xd1\xe9\x34\x9b\xb7\x61\x6b\x76\xe1\x33\x25\xab\xea\x8d\x0e\xe7\xee\xd3\xe8\x99\x3e\x77\x5d\x9f\x33\x47\xbc\x3a\x69\x8f\xd3\xbc\xec\xac\xd4\xaf\x2a\xc7\xae\x5d\xf2\xa4\x29\x64\xfb\xf9\x93\x4e\xf0\x9a\xe3\x7e\xdc\x25\xf5\x16\xe8\x1f\x07\xf9\x95\xed\x60\x9f\x87\x07\x6b\xe4\xbf\x93\x95\x8a\x37\xae\x82\x6b\xa5\x24\x04\xb7\xfe\x04\x5c\x9b\xbf\x83\x20\xb6\x6b\x40\xc8\x26\x5d\xd2\x92\xff\xb4\x8c\xd0\xaf\x19\xe5\x53\x60\x20\xd7\x40\x70\xac\xc6\x76\x5f\x2b\x40\x35\x37\x97\xdb\x85\x77\xf4\x7a\x50\xc5\xc3\xd1\xb2\x61\x9e\x15\xd0\x48\xeb\x62\x1e\x4c\x18\x8e\xb6\xa4\xbf\xef\xf9\x5d\x65\x2c\x58\x14\x2a\xe8\xa8\xa7\x8c\x16\x49\xfb\xf6\x3a\x7a\xfd\x86\x60\x72\xb9\x8f\xec\x2b\x2f\xbe\xc2\xb6\xb6\xc1\xde\x69\xe9\x86\x57\xd4\x82\xd0\x2b\x9a\xab\x70\x64\xb7\xa8\x8a\xf7\x69\x3d\xc2\xdb\xda\x04\x54\x6b\xe4\x6e\xcb\x6b\xfc\x6a\x04\x72\xeb\x8c\x1e\x9e\xd1\x79\x77\x67\x6d\x8d\x0c\x66\xa3\xd1\x7c\x81\xa8\xa2\xea\x91\x0e\x0b\xaa\xd2\xd9\x61\xf1\xbc\x9b\xb9\xab\x28\xb7\x8b\x66\xed\x82\xf6\x6a\xc1\x8d\x83\x7e\x0c\xfa\x2f\x6d\x67\x85\x7e\xb5\x3a\x58\x1d\x00\xf8\x10\xd8\x3f\x12\x7b\xcb\x56\x3d\x94\xbf\x9a\xe7\xb5\x42\xac\x7f\x7a\x48\x42\x43\x18\x1d\xd2\x07\x6d\xa6\xde\x2c\x1f\xbd\x41\xd4\x09\xb8\x2c\xe6\xfe\x95\x0a\x54\xa8\x8a\xe0\xae\x48\x2c\x6f\xb7\xa4\x5d\xd3\x0b\x58\xa8\x2a\x80\x45\xf3\xeb\x9a\xbb\xbd\xaf\x64\x58\xa4\x0b\xaf\xc3\x06\xf3\x86\x42\xaa\xa6\xd0\x0e\xe0\xee\x58\x71\x0a\x9c\xde\x49\x0b\xd3\x25\x38\x93\x55\x76\xa6\xa0\x4e\x3d\x44\xa8\xb7\x0b\x97\x69\xf2\xce\x6a\xb7\xa8\x98\xe7\xf1\xee\x82\x30\xb3\xa7\xb7\x8b\xa6\x68\xee\x99\x0f\x04\x2b\xce\x41\x2b\x14\xea\xf6\x76\x5e\xfe\x5f\xe3\x23\xfa\xdd\x92\x3e\xa2\xbf\x43\x0c\x34\x84\x72\xde\x34\xac\x55\x5c\x13\xd6\xfa\xec\x76\x81\xca\x4e\xba\x22\x13\xd7\x2a\x2a\x71\xad\xca\x8b\x63\xe9\x8c\x45\xb5\x2b\x8d\x1f\x6f\xec\x83\x6f\x58\xa7\x67\x6b\x9d\x48\x2b\x86\x6b\x53\xbe\x9d\x67\xb1\xbc\xe3\x40\x35\x2f\x60\xd1\x36\x69\x38\xcf\xb3\x79\x44\xf6\xb3\x84\x9c\x7f\x4b\x62\x0a\x85\x4c\x4d\xd6\x1e\xa8\xb1\x0b\x2d\x95\x78\x20\x22\x39\x16\x3f\x45\x03\xc9\xf9\x2a\xb6\x51\x69\xdf\x53\xb1\x90\xd1\x3f\x5f\xbb\xa1\xa3\x23\x54\xaf\xf1\x38\xa8\x59\x9c\x50\xc4\x8f\x12\x94\xd5\x33\xd5\xee\xe1\x43\x35\x0f\x9b\x74\xb6\xaa\xfa\xc1\xf7\x8f\xc9\xfd\xbe\xc2\x83\x5c\x09\x2a\x88\x11\x21\xef\xdd\x47\x06\x56\xdf\x80\x18\xdd\xd5\x0f\x93\x12\x04\x35\xb6\x0c\xc6\x5b\x24\xcd\xc9\x97\x2b\xf2\xba\x21\xcb\x0e\xaa\x99\xac\x83\x10\x13\x65\x17\x0f\x5e\x30\x1d\xd8\xfb\x84\x3d\x3e\x94\x85\xa3\x09\xdf\xdf\x75\xda\x6f\x15\x3c\xe0\xe4\xe1\xd8\xba\xf5\x67\x2f\x3b\xd1\x50\xdd\x33\xad\xdc\xdc\x25\xce\xd0\x81\x3a\xbb\x64\xdd\x29\xc6\x2f\x58\xa9\xc6\x78\x7c\xe2\x3c\x46\x49\x61\x93\xdc\x83\x97\xae\xfd\x0a\x2e\x50\x36\x3d\xac\x7b\xcc\x99\xaf\x94\xbe\xcb\x4f\xb9\x6a\x6f\xb4\x0d\x3b\xd5\xad\x92\x2b\x49\xc6\xbe\xb1\xe3\x92\xc4\x01\xbd\x74\xc8\xbe\x93\x3a\x7f\x13\x1b\xda\x76\xe0\x35\x23\xe7\x16\x80\x61\x43\xb8\xd4\x1c\xd4\xc5\x0b\xbc\xe1\x94\xbf\x8b\x6b\x35\xeb\xae\xa8\x01\xf5\xf1\x9f\xd0\x21\xf8\xec\x76\xde\xf9\x5f\x71\x26\x3c\x7b\xba\xdc\x99\xf0\xec\x76\xfe\xf4\xe1\xbe\x9f\xdd\x61\x5e\x0c\xa5\x93\x3c\x30\x6e\x60\x95\x34\x18\xee\xfb\xa0\x00\xf2\xec\x76\x57\xa9\x1b\x67\xbd\x58\xb7\x59\x2f\x9e\x5f\xab\x58\xbd\xe6\x58\xd1\x5a\xd7\x26\x1f\xec\xf0\x51\x72\xbb\xab\xc1\xad\xaa\x50\xfd\x5b\x16\x52\x33\x65\x0f\x21\xf4\x47\x33\xd3\x26\x97\x76\x7d\x11\x4e\xf3\x73\x5a\xa4\xb4\x31\x16\xf3\x5b\xed\xd4\x7e\x41\x8b\x1c\x6f\x32\xe1\x65\x34\x81\xb9\x3a\xe3\x5e\x10\xda\x0b\xaf\x6a\xf5\x81\x4e\x89\x79\xc8\xe2\xa2\xf1\x6c\x58\x7b\xfe\xdc\x3d\x64\x0f\xae\x29\x3a\xb4\xf6\xfc\xd9\xc2\xa8\xea\x76\x2a\x7e\xa1\x59\x9a\xa8\x48\xd1\x2e\x9e\xb1\xfb\xf9\x36\x20\x78\x2b\xd6\x95\xc8\x08\xe9\x3d\xd2\x91\x33\xca\x14\x09\x39\x6f\xc1\xe3\xe4\x68\xe7\xfd\xd6\xd1\xfe\xfb\xd3\xc3\xbf\xbf\xfb\x61\xff\x67\x7b\x7d\x33\xce\xdd\xae\xfa\x4e\x1e\xec\x15\xd7\x55\x7d\xff\x7f\xbb\xf5\xe1\xff\x9c\xd6\xa1\xb5\x6c\x2c\x5b\x0b\x74\x9b\x3f\xb0\x21\x2f\x98\x06\x2f\xa6\x2c\x86\x0c\xef\x26\x41\xef\x7b\xa5\xf7\x84\xdc\xca\xda\x3d\x76\xc2\xca\x31\x4f\xdc\x0c\xf8\x79\x49\x41\x8d\xaa\x72\x3c\x43\x4b\xab\x57\xc1\xbc\xbe\x08\xf0\x07\x46\xc4\xac\x80\x12\x08\x69\x7e\xce\xcf\x30\x47\xb5\x01\xa5\xd2\x2e\x3b\x20\xa8\xd0\x55\x59\xfa\x0e\x18\xa3\x7c\x50\x63\x7a\x9b\xa3\xe6\x62\xd7\xfc\xdd\x9e\x60\x6c\xe4\x20\x53\x6a\xc4\x47\xc4\x6a\x7f\x75\x23\x75\x6c\x3e\x52\x87\x9b\x0b\x11\xfc\x7e\x74\x3b\xbc\x04\x86\x21\x12\x12\x45\x91\xfd\xf3\xca\x19\xa5\xae\xea\xf7\x1a\xf1\x70\x45\x26\x74\x3e\x60\x1a\x88\x6a\xa3\xeb\xfb\xbd\xd6\x48\xb8\x32\x69\x90\xdd\xeb\xab\x3b\x33\x17\x8a\xab\xc4\xf1\xb0\xe1\xb5\x42\x37\xa0\x0a\x3d\x3c\x7c\xe8\x37\x3a\xae\x34\x00\x75\xa5\xdf\x22\x44\x57\x5a\xf4\x71\xd4\xcd\xee\x40\x1a\xf2\xe8\x1b\x3f\x4f\xdd\x72\xc3\xa6\x90\xf7\x48\xf0\x0d\xcf\x32\x95\xfb\x9a\x0f\x15\xed\x49\x82\xa4\x90\x0e\x9c\x5f\x90\x84\xc5\x19\x55\x19\xce\x69\x9e\x90\x73\xb9\x0b\x4d\xc2\x73\xc8\xbd\xab\x9a\x17\x0a\xe7\x62\x36\x9d\x66\x29\x66\xdc\xd6\x25\xa1\x54\x12\x64\x11\x91\x1d\x2c\xed\x48\x66\x82\x8e\x98\x4f\x74\x10\xa2\xa2\x32\xd1\x2b\xce\xd0\x6e\xf9\x2c\xa7\x65\x69\x03\xc2\xcb\xe6\x5b\x45\x99\xc6\xe0\xc9\x07\x0d\x23\xa7\xfc\x4d\xdb\xa1\x3e\x93\xc6\xb7\xef\xd3\x64\xaf\x47\xb6\x72\x95\xa1\x9d\x66\xda\x00\x21\x5b\x83\x9b\x57\x22\x65\x1d\xe3\x6d\x75\x3f\x72\x3f\x75\x5e\xf4\x71\xd8\xca\x58\xd5\xad\xec\x24\xec\x45\xcf\x28\x01\xcd\xa8\xd7\x45\x4c\x4b\x36\xe2\xc5\xdc\x87\xaf\x9f\x6a\xe0\x90\x9a\xbb\x7d\xdc\xda\x63\x17\xa2\xd5\x6d\x1d\x8c\x79\xc9\x45\xcb\xcb\xb8\xdd\xd0\xb3\x37\x9d\x94\x66\x7c\x74\x1f\x97\x4c\x0d\x49\x10\x9a\xdb\x2c\xe4\x7c\x48\xb6\xa1\x91\x3f\x5b\x78\xa4\xc7\xa2\x1b\xef\x0f\xdb\xd8\xd6\xcb\xfb\x6d\x77\x6b\xd7\xfe\xc6\x7c\xf5\xd6\x7a\x04\x96\xe5\x28\x8a\xd4\x96\xb6\xd5\x54\x4c\xf2\xf2\x89\xe4\x9d\x43\x5e\x4c\x28\xf2\x4e\xc8\x2a\xaf\x09\x6f\xcc\x2f\x24\x27\x13\xcc\xd0\x2c\xe6\xb7\x67\x89\x4f\x53\x90\x5d\xa3\xbf\x49\xa8\xbc\x1b\x5c\x0e\x38\xcf\x2e\xe5\x08\x2e\x91\x67\x5c\xe6\xb3\xc9\x80\x15\x97\xb8\x70\x97\x0a\xc5\x51\x14\x9d\x74\x2e\x9d\x39\x42\x66\x5d\x05\x50\xee\x07\x09\xd0\xa7\xcb\xe8\x8b\xec\xe8\xaa\xed\xa0\xa1\xf3\xda\x19\xc8\x0e\x8d\xc7\xb0\x7d\xd8\x39\x2b\xe6\xde\xa6\xc2\x74\xda\x50\x92\xad\xce\xa8\x05\x9d\x30\x48\xa9\x4f\xcb\x59\xc1\x22\x90\x55\x10\x22\xec\x4e\x3c\x3a\x80\xe6\x15\x5e\xe2\x99\x28\xf9\xc4\xdd\xa5\x1a\xa8\x88\xa0\x60\xb7\x2d\xad\x6a\xb1\x84\x5b\xe9\xe7\x34\x3f\xbb\x66\x1f\x35\x6c\xa3\xf0\x2e\xe2\x05\xf9\xf0\x7e\xd7\xa3\xbe\x71\xc1\x86\x1e\x95\xcb\x07\x0e\x4d\xa8\x42\x61\xf2\x9f\x3d\x28\xcd\x6c\x38\xc7\x9e\x75\x63\xd2\x24\xa9\x63\x75\xa6\xbf\x28\x7b\x17\x7c\x7d\xac\x3f\x3e\xf1\x4e\x11\x1d\x72\xa3\x1a\xdf\xc3\xab\xba\x13\xa6\xe2\xbe\xdb\x24\x2d\x9c\x83\x14\x02\x3c\x28\xf2\x7f\xf7\x1c\x38\xce\xed\xf3\xc3\xfb\xdd\x4e\x75\x84\x86\x11\xe7\xec\x82\xa0\x2e\xa0\x06\xae\xb5\xf3\x79\xca\xe2\x92\x25\x84\x3a\x98\xa3\x39\x20\x6f\xc8\x0b\xd2\x22\x8f\x0d\x46\xd0\x83\x24\x97\xcf\x6a\x80\x3c\x5c\x55\xde\xfa\x47\xaa\xdd\x73\xde\x6f\x67\xbb\x86\x76\x6b\x14\x45\xba\xad\xbf\x55\xff\x03\xea\x42\xe4\x34\x53\x47\xab\xce\x88\xbc\xb7\xbf\xf7\xf7\x77\xfb\x1f\x0e\xa5\x68\xf4\xea\x15\xcd\x79\x3e\x9f\xf0\x99\xf8\xfe\xfb\x16\x78\xcd\xf5\x7a\x64\x17\x72\xd6\xd3\xbc\xbc\x87\x7f\xff\xc4\xd8\x14\xc5\xe4\x2c\x85\xbb\x3d\x11\xf3\x3c\xc6\xed\x60\xd3\xce\x13\xa8\x95\x81\xd5\x1a\x3e\x45\xbd\x21\x05\x09\xfb\x63\x5a\x8e\x8f\xa4\x50\x98\xe6\xa3\xc3\x71\x3a\x11\xd1\xaf\x50\x72\x9a\xd4\x05\x57\xa5\x58\x21\xc8\x15\x74\x5c\x89\xb1\x37\xca\x36\x50\xaf\x8f\x15\xed\x16\x34\x69\x75\xb0\x86\x8b\xe4\x1f\x8b\x9b\xcb\x16\x8c\xe6\xfa\x03\x89\xbf\xc5\x1f\xd8\xc3\x1b\xbf\x40\x8e\xb4\xf8\x1b\x6c\xa3\xbf\x40\x56\xb6\xf8\x0b\x65\x95\x50\x5f\x20\x99\x2d\xfe\x42\x6d\x00\xfd\x85\x72\xef\x5b\xf8\x85\x32\x6f\x76\xb1\xaa\x0e\xcd\x0d\x66\xb7\xf2\xb9\xdb\x52\xc1\x04\xcc\xee\x0f\x4d\x23\xfc\xd3\x69\x88\xcd\x54\x91\x17\xdd\x4c\x5d\x00\x02\xf0\x2c\xc3\xd6\x6d\xb5\xab\x5f\x0d\x66\xce\x13\x13\x4e\xb4\xc7\x93\x2a\x24\xc4\x96\x85\xb3\xaf\xfe\xae\xc1\x81\x03\xc3\x8c\x2c\x9f\x4d\xc2\x2d\xe4\x53\xdd\xea\x43\x9e\xf2\xbc\xd6\x4c\x8c\xa9\x6d\x72\x28\xff\xa8\xe3\xe1\x33\xb5\xab\x7c\x08\x77\xe4\x50\xc3\xab\x0d\x4f\xbe\x4b\xf3\x0c\xee\x0e\x4a\x19\x90\x0a\x32\xe5\xd9\x7c\x98\x66\x99\x2d\x45\x85\x62\x80\x64\x3c\x31\xcf\xc5\x6c\xc2\x0a\xc8\x42\x00\x45\x5b\xd2\x82\xf0\x8b\x1c\x61\xe9\x80\x50\x55\xa1\x82\x15\xd1\x84\xff\x23\xcd\x32\x1a\xf1\x62\xd4\x63\xf9\xea\x87\xc3\x5e\xc2\x63\xd1\xfb\xc8\x06\xbd\xff\xa4\xe7\x14\xa3\x5c\x7b\xef\xd9\x90\x15\x2c\x8f\x59\xef\x6f\x70\x31\x3b\xc5\xc1\x88\x1e\xfe\xdb\x53\x47\x5a\x0f\xc6\x5d\xd7\x00\xbb\xa9\x79\x7d\xc1\x3d\x15\xed\xcf\x5d\x62\xdc\x07\x7b\x3d\x9b\x90\xb8\x92\x83\x58\x72\xff\xcf\x20\x2d\xcf\xbd\x22\x56\x87\x25\x9b\x0a\xb2\xb6\xfa\xbc\x4b\x5e\xae\xae\x3d\xa9\xbe\x78\x11\x0d\x56\x5f\x44\xac\x4f\x1e\x3f\x91\x47\xc6\xea\x13\x5f\xbc\xfe\x0c\x67\x05\x64\x8d\x5b\x23\x3d\x82\x1d\xc8\x5f\xf3\x60\x88\x9c\x02\x4b\x5e\x44\xb4\x4f\xf6\xe8\x1e\xd9\xdc\x94\xff\x84\x60\x7e\x96\x27\xd3\x1c\x7e\xce\x5d\xd1\xdd\xc1\x10\xcb\x1b\x10\xe4\x2e\xff\x47\x90\x89\xe4\x69\x02\xa7\xcf\x6a\x96\x9e\x19\x7b\xbc\x3c\x5b\x06\x34\x3e\x83\x62\x7a\xf0\x79\x99\x0e\x52\x4c\xe0\x2c\xc8\x94\x71\xa8\x2b\x46\xe7\x24\x36\x85\x81\x2c\x07\x45\xc5\x46\x36\x07\xa1\x26\xcd\xa5\x7c\x56\x6a\x7a\x99\x95\xd3\x59\x19\x91\x1f\xf9\x05\x83\xca\x37\x17\x8c\x24\x26\x0e\xba\x60\xea\x9c\xc0\x11\x49\xd9\x73\x2e\x25\xbd\x48\x8e\x15\x9b\xf9\xe0\x44\x49\xe3\x33\xd9\xea\x82\xce\xbb\xd0\x1d\xca\x3b\x58\x82\x67\xa2\xc8\x1c\x94\xe9\xe3\x74\x00\x6c\x29\x9b\x13\xf6\x79\xca\x72\x91\x9e\x33\xb9\xf4\xe5\x98\xcd\x41\x3e\xc4\xcd\x23\x6f\x26\x9c\xf0\x61\xc9\xf2\x2e\x11\x33\x29\x99\x09\x72\x31\xa6\xa5\x22\x73\x3a\x95\xdf\x42\xcd\x36\x53\x0e\xa7\x03\xe8\xa2\xf9\x1c\x25\xca\x01\xde\xec\xa1\xce\x5a\xce\x50\x9a\x06\x9f\x61\x96\x44\xf5\x0b\xa6\x46\x1b\x4a\x00\xaa\xe0\x8b\x97\xd1\x47\x3d\x93\x17\x4b\xfc\xb5\x61\xdf\x21\x02\x36\x49\xab\xa5\xb3\xfa\xf4\x7a\xe4\x1d\x3d\x63\xe4\x93\x23\x7e\x00\xec\x4f\x44\x94\x72\x6b\x83\x9d\x45\x0e\x18\x89\x4a\x5e\x3a\x00\xd9\x72\x6c\xde\x60\xbc\x14\x74\x95\x27\x7e\xd5\x5b\x25\x10\x8e\x69\x0a\x74\xe7\xf2\x5f\x25\x6c\x32\xd7\x07\xec\x06\xe5\x63\xb4\x28\x37\xa1\xf9\x8c\x66\x7a\x78\x50\x34\x97\xc6\x63\x66\x2a\x29\x84\xdb\x7d\x44\x0d\xd7\x1b\x3e\x03\x6d\xd8\x13\xbb\x5b\xdc\xc1\xcb\x91\xc2\x3a\x3a\x97\x25\xb2\x58\xda\xc4\x12\x6f\xf2\x73\x6c\xf2\x76\x96\x65\xf8\x5c\x80\xde\xcb\x0e\xde\xfb\x8c\x6c\x56\xfe\xbe\xbc\xb4\x92\x90\x9e\x86\x0b\x4f\x09\xae\xe6\xcf\xcb\x4b\x33\xa2\x0d\xb7\xc2\x1d\xf6\x0a\x38\x0c\xa9\xe1\x5c\x1b\x05\x86\xc8\x34\xe8\xc7\xf4\xff\x7a\x3d\xb2\xc7\x2e\xc8\x80\x8d\xe9\x79\xca\x0b\x2c\xb1\x26\x69\x66\x26\xe4\x01\xc0\x87\xe4\x93\x1c\xc7\xaa\x24\x05\xf1\x89\x4c\x69\x7c\x46\x47\xcc\x01\x60\x94\x90\xed\x15\x57\x0c\x35\x65\xe2\x1c\x11\x57\x2e\xa6\xdc\xb0\x96\x7f\x28\x9a\x91\x0c\xc0\xb0\x12\xe5\x19\xad\xaa\x0a\xda\x32\xba\xa1\x71\x44\x5a\x04\xb6\x9d\x7c\x10\x8c\x7c\xb2\x37\x32\x5f\xed\xd8\xee\x7c\x92\x07\x9e\x64\x65\xc0\x36\x02\xdf\xbf\x67\x34\xc1\x4b\x27\x2d\xe1\xac\xeb\xf7\x7a\xc3\x41\x34\x61\xbd\x99\x60\xab\x00\x6e\xd5\x8e\xa4\xb5\x52\x95\xae\x89\xc3\xf2\x97\xde\x02\xce\x0d\x44\x1e\xbe\x3c\x53\xf7\x0f\x63\xe3\x69\xd5\x56\x6d\x3f\x4b\xec\xaa\xc9\x05\x53\xac\x1a\xcb\x92\xe1\xf5\xcd\xcc\xdb\xf9\x14\x74\xb1\x72\x47\xfd\x04\xce\x40\x3e\x95\x3e\x26\xad\xbe\x7b\xd1\xd8\x70\x17\x7a\x48\xfc\x25\xbe\xd7\xb0\x55\x8f\x35\xf8\x13\x75\x6f\x72\x87\xbd\x05\xb2\x86\x98\xd2\xc9\x44\x97\x4f\xd3\x33\x1e\xb0\x98\xca\xb3\xc1\xf0\x69\xe0\xcd\xe8\x26\x0f\x68\x82\x93\x8e\x7d\x8e\xd9\x14\x8f\xad\x2c\x1d\x10\x3a\x2b\xc7\xbc\x10\x5e\x37\x0b\x58\xc3\x2b\xf2\xd4\x5d\x31\x0f\xa9\x44\xeb\xc9\xfd\x69\x06\x69\x99\x90\xd6\xdf\x55\x35\x3d\xec\x2d\xc3\x03\x52\xce\x89\x56\xb1\xef\xde\xc3\xab\xf4\x46\xac\xe2\x0e\xe6\x04\x94\xfe\x8d\xc0\x82\xec\x84\xe7\xf0\x07\xde\xf8\xe5\xce\x48\xd8\xb4\x60\x31\x9c\x5e\x01\x48\xe8\x11\x05\xb4\x5d\xf0\x0b\x6d\x82\x90\x87\x43\x42\x33\x79\x42\x2d\xb7\x87\xd4\xe4\xe4\xa1\x3f\x60\x44\x30\x86\x2b\x95\x0a\x63\x48\x48\x66\xa0\x5d\xa6\xf2\x69\x91\xac\x4e\x69\x51\xce\x9d\x6d\x1d\x00\x98\xa5\x83\x82\x16\xf3\x88\x1c\x32\x66\x44\x48\xdc\x57\x58\x88\x50\x81\x5e\x4d\x78\x5e\xae\x4a\x54\xc2\x2e\x2b\x35\x3c\x88\x18\x21\x98\x68\x44\x44\xad\xea\x6a\x78\xac\xb9\xf2\xae\x76\x23\xb6\xeb\xbf\xb1\x80\x6e\x42\xf4\xec\x66\x3e\x08\x7f\xe5\x52\x1b\xa6\xf3\xd3\xff\xbb\x5a\xa9\xfe\xba\x72\xf8\x7a\x45\x6b\x41\x02\xa5\x6b\xd1\xa3\xcf\x28\x96\x3c\xda\x0d\x83\xa8\xc3\x20\xbe\x32\xc2\x17\x49\x5a\x47\x63\x06\xb8\xd6\x47\x1e\xe8\x19\x3e\x69\x86\x60\xce\xa6\xc7\xa4\xf5\x49\x12\xe3\x84\x16\x67\x2c\x91\x62\x93\xd1\x6a\xca\xb6\xed\x96\xbc\x91\xcb\x5f\x35\xe6\xf2\xa9\x4b\x06\xb3\x92\xa4\xa5\x50\xee\xc9\xa9\x20\x9f\xe4\x18\x3f\x45\xad\x4e\x27\x8c\xad\xdf\x77\xc0\xa8\x45\x21\xed\xd6\x0d\x06\x6c\xb8\x72\x65\xd4\x76\xcc\x7a\xc4\xa6\xf0\x7c\xed\x16\x40\x1c\xcf\x6a\x10\x9b\xae\xd1\x7a\x35\xc9\x21\xb5\x5a\xc4\xf0\x0f\x1a\xdc\xc0\x5e\xf4\x46\x0b\x3d\x92\xd9\xeb\xdf\xd1\x20\xcd\x93\xb6\x1c\x9e\x76\x28\x40\x30\xd5\x6f\x1c\x45\x66\xd3\xe7\xda\x7d\xd8\x99\x52\x15\x8a\x09\x4d\xac\x88\x91\x41\x05\x02\x53\x7a\x30\xf9\x4c\x53\xae\xf9\xee\x96\xc8\xaa\x0b\x6d\xcb\x28\x0f\x9d\x66\x0a\x8f\x98\xcb\x1f\xfe\xb2\x5a\x40\xcf\x91\xde\x34\x96\xc7\x78\x68\x4a\x04\x8f\xc3\x4f\xe6\xf3\x4f\x64\x00\x7c\xd6\xd1\xc0\x77\x89\x90\x97\x1d\x39\xe1\x5e\xc1\x46\xec\xf3\xb4\x4b\xa6\x54\xa0\xba\x57\x2b\x73\x5c\x68\xb0\x40\x48\xb1\x17\x0c\x2b\xe6\x0e\x87\xac\x20\x14\x05\x1a\x79\x74\xa4\x82\xe1\x2d\x40\x5f\x31\xc8\x98\x15\x8c\x14\xb4\x1c\x83\x85\x9b\xe6\x2e\xc0\x16\x1f\xe2\x4d\xe7\x13\xf6\xf6\xa9\x15\x99\xd7\x88\x13\x80\xe8\xa2\xc5\x3c\xf0\x30\x53\xdb\x19\xf5\xbd\xbc\x9b\xc3\xea\x2e\xbd\x9f\xf5\xd0\x9c\xed\xeb\x0e\x07\xda\xb8\x46\xa8\xc6\x0d\xae\x97\x87\xb4\x3a\x16\x94\xbb\x66\xd0\xce\xdd\xea\x15\xc7\x21\xbb\xcd\xaf\xbc\x6d\xb0\xc4\x5d\xa9\x69\x6b\x54\x75\x65\xbe\x8b\xee\x02\xc8\x9e\x03\x41\x24\x6f\xa4\xca\xbc\xbc\x27\x4f\x82\xc6\xee\x6a\x5a\x37\xb0\x32\xaa\xdf\x77\xbd\x0d\x2b\x51\xfc\x28\xf7\x3a\xfd\xa1\xec\xbb\xa8\x2e\x78\x80\x7c\x4c\x3a\xa7\x66\x72\xb1\x55\x58\x1b\x68\x01\xd2\x68\xa6\x8a\x0e\x35\x7c\x29\x80\x22\x31\xa6\x39\x14\x61\x56\x1a\xcb\xa8\x55\xa3\x87\x25\xb9\x09\x38\x10\x62\x7e\x65\x1d\xef\x63\xf7\x8a\x3b\xdb\x1b\xb1\x9d\xdf\x7d\x6f\xa9\x71\x7c\xc5\xc6\xa2\x39\x22\x2d\xb4\x87\x4c\xc0\xab\xca\xe4\x9c\x92\x57\x16\x87\x3a\xf9\x11\x49\x1f\x3f\xae\x22\x06\xb9\xd8\xa6\x4b\x38\x16\x2b\x5d\x92\x2e\x49\x8c\x72\xac\xc7\x72\x06\xa9\xfc\x75\xd2\xea\x86\xef\xd5\xbe\x87\x1f\xf6\x5d\xd5\xbb\xf8\x82\x96\x5a\x0d\x68\x5a\x97\x11\x7e\x7f\x16\x12\x52\x91\xff\x6e\x1b\xf9\x26\x94\xef\xfb\xf0\xfc\x4f\x27\x7d\x5d\xa5\x1e\xa8\x4a\xcd\xf9\x8f\x3d\x4b\x02\xf6\x0f\x23\x65\x81\x69\xf7\xf7\xe5\xef\xf7\x6a\x17\x13\x67\xdf\xf8\xe3\xa8\x6d\x71\xf7\xad\xd2\x92\x79\xcf\xa2\xbc\x49\xb7\xa6\xc2\x45\xe3\x72\x46\x33\xf7\xf3\x11\x2b\xcd\x9f\xd5\x81\xfd\x51\xf4\x54\x1d\xd5\xd7\x8b\x2a\xae\xbb\x86\x27\xb6\xf8\xc0\xff\x58\x7a\xab\x58\xc0\x0c\xad\xc1\x9e\x15\x5e\xb2\x04\xff\x10\xac\x34\xb4\xd4\xb0\x9c\x0e\xed\xb5\xd1\xdf\xa0\xc2\x86\x98\xb5\xd2\x11\xbd\x1e\x92\x41\xab\xef\x1f\x52\x2e\x3a\xf5\x81\x45\xfa\x04\x54\x56\x4f\x36\x7c\xc4\x2d\x14\xb4\x36\xdc\xcb\xd8\x3f\x8d\xdb\x86\x8e\x56\x1f\xc7\x4d\xe7\x2b\xaa\x1a\xdc\xe3\xd4\xff\xee\x38\x3d\xe9\x04\x4f\x3b\xf7\xc6\xeb\x1e\x76\xce\xc0\x31\xe4\xdd\xc4\xd6\x55\xe2\xfb\x2b\x34\x50\x41\xfa\xdd\xec\x47\xbc\xc9\x9b\xf7\x88\x45\x78\x89\x9b\xf4\x66\x5b\x91\xe7\x40\x2f\xb2\x9d\x37\xb5\xc7\xa4\x65\xf7\xdd\x9d\x6d\xae\x80\x11\xfa\x4f\x51\xbd\x51\x54\xd7\x26\xfc\xaf\x97\xd5\x6f\x77\xf3\x37\x1e\x17\x4b\xe1\xe5\x9f\x2d\xaa\xe4\xda\x97\x78\x91\x98\xae\xf2\xd2\xd8\xc9\x57\xd8\x86\x95\xdd\xc7\x54\x38\xf1\xa0\x6d\x37\x57\xad\x73\xc4\x2f\x96\xe2\x21\x4f\xc1\xd2\x72\x7c\x24\xe7\x08\x9f\x5c\x23\xc3\x2f\x2f\xc5\x37\xc9\xf1\x8b\xf4\xb9\xbf\xdf\xd1\x5a\x75\x1b\x69\xd3\xda\xc5\x7d\xd1\x01\x1b\x6a\xfd\x47\x9c\xb2\x47\x10\xe7\xf5\x07\x9c\xb4\x81\x03\x2f\x30\xe7\xf0\xa9\x67\x82\x14\x54\x92\x8f\xda\x67\xc7\xa9\x77\x8f\xd1\xf6\xba\x6b\x19\x61\xc0\xaa\x54\xb3\x28\x2d\x89\xc4\x88\xec\x54\xef\xd4\x44\x8f\xc1\xba\x78\xa2\x06\xd0\x37\xc2\xb4\x0a\x16\xb3\xf4\x9c\x25\xe4\x1b\x41\xa8\x2a\x8b\x44\xbe\xa9\x98\x52\x24\x7b\xe3\xa2\x1c\xa6\x9f\xdf\xf2\xc2\x31\x67\xb4\xd5\x2c\x3b\x6e\xe3\xd4\xfc\xae\x0b\xce\x4b\xac\x59\x45\x65\x7d\xf7\x27\xd6\xad\xa8\xe1\x66\xf4\x80\x14\x11\x3b\xfc\xeb\x6b\x94\xd3\x61\x83\x7e\xd0\x8a\xb3\x9c\xb8\x75\x77\x47\x8d\x4b\x8d\x0b\xed\x25\xbf\x83\xc8\xe3\xb9\xe6\xfd\xbe\x57\xd5\x54\xc8\xce\x6a\xf7\xc2\xdf\xe7\xf8\x5e\x1a\xa7\x9e\x3a\x01\x88\x44\x8e\xf2\x8f\xbd\xd4\x55\x9d\x0c\xdb\x42\x3f\xf8\x1d\xd5\x07\xff\x83\x64\xb4\x80\x74\xf6\x35\x97\x0d\x6d\x87\x59\x46\x44\xab\xaf\x50\x9d\xad\xd9\x36\xa6\x4e\x85\xb3\x1d\x62\xff\x52\x81\xff\x8b\x79\x5e\xa6\xb9\x6b\x05\xbf\x0a\xea\x65\xe3\x3f\x4c\x9a\x33\xb2\xdc\xbf\x96\x02\x36\xec\x9d\xfb\xe7\xc6\xf9\x97\xdb\x38\x90\x9e\x8f\xe4\x0c\x61\xa1\x30\x45\xb3\x0c\x0b\x37\xa4\x39\x89\xa9\x60\x44\xf0\x09\x03\x7f\x1f\xe3\x3a\x20\x85\xac\x49\x2a\xc0\xdf\x6a\x58\xf0\x89\x85\x06\xe8\x8e\x1c\x24\xd3\x2c\x53\x99\xad\x30\xc4\x16\x22\xf9\x2b\x8b\xd2\x75\x37\x6c\x4d\x85\xa3\xf6\xb4\x02\x74\xa7\x1b\xba\x71\xcd\xbc\x6b\xd0\x8d\x17\x50\x8e\xf8\x93\xda\xc2\x4b\x5f\x47\xa3\x9a\x3f\xde\x7f\xe7\x3f\xd0\xc4\x44\x37\xc8\xaf\x2a\x1a\xa3\x1a\x1a\xd1\x2f\xa1\x45\x40\x49\x5a\x05\x06\xa6\x07\x58\x59\x04\x56\x85\xa6\x3c\xe4\x21\xa3\xae\xb3\x1e\x1e\x54\x07\x66\xd0\xfb\xe3\x7f\x06\x17\xbc\x3d\x1b\x74\xa4\x29\x4f\x55\x20\x2e\x52\x48\xc9\x51\x8d\xb9\x72\x7c\x69\xe5\x8e\xd3\x01\x2e\x7d\xef\xa1\x8a\x48\xf1\x1f\x5a\x3f\xc9\x7e\x95\x15\xb9\x0e\x5b\xd8\x58\x07\xe7\xd4\x9a\xde\x33\x23\xf1\x3f\x50\x7c\xae\xef\xa1\x7a\x19\xfb\xad\x81\x6c\x95\x22\x10\xf9\xd7\x46\xcc\x04\x89\xc7\x8f\x50\xd3\x3e\x5c\x98\x3c\x73\x09\xbb\x59\x70\xde\xce\x95\xe0\xda\x90\xee\x90\x75\x2d\x18\xd0\x1d\x00\x17\x88\xe7\x0e\x81\x53\xd9\xf0\x4a\x36\xad\x6a\x64\x9c\x71\xc9\x13\xc6\x41\x1b\x56\x5e\xad\x39\x6c\x62\xfe\xbb\x7b\x6d\x55\x9e\x59\x7f\xaf\xea\xf3\x76\xa2\x84\xe7\xac\xfa\x91\x2f\xeb\xcb\x2f\xa3\xf3\x00\x1e\x3d\x6c\x7a\xc9\xfe\xeb\x8b\x56\xfd\xab\xe6\xec\x45\xf0\x60\xd0\x78\x46\x2f\xcd\x69\xc1\xcf\xd3\x84\x11\x39\xb9\x39\x39\x3e\xeb\x9e\x9f\x90\x72\x36\xcd\x98\x70\xfd\x71\x94\x56\x39\xba\x8b\x89\x03\x67\xca\x55\xb9\x3d\x33\xf1\xea\xbc\x80\x93\xe4\x90\x6e\xba\x8e\x10\x17\x77\xd0\xe8\x78\xad\x6a\x0b\x58\x06\x77\x55\xec\x2d\xc4\xe6\xca\x02\xbc\x86\x3b\xb9\xaa\x79\x1c\xb9\xfb\x41\x65\xae\xa9\x31\x00\x07\xc8\x55\x80\x9b\xa9\xd4\xa8\x5a\x18\xe9\xd6\x39\x57\xaf\x47\xf6\x28\xd4\xc1\x54\x39\x23\x8c\x26\xce\x8a\x59\x4e\x1d\xb3\x5a\xa4\xbe\x53\x57\x6b\x45\x03\x5c\x36\xe3\x28\x42\x56\xd9\x45\xbd\x7e\x61\x88\xc7\x2d\xaf\x79\xcb\x6f\xbf\xd4\x48\xde\xba\xf9\x1a\x73\x9e\xaf\x8a\x29\x8b\xe1\x24\xcb\x20\x0b\x89\xce\x86\x79\x31\x4e\xe3\x31\xc8\x4a\x3a\xca\x4c\xc5\xc3\xb8\x7a\xb3\xc6\x6c\x1b\xd3\x50\x58\xad\xae\x49\x72\xdd\x28\xab\x0b\x79\xa5\x42\x4c\x77\x7e\x9b\xa5\xe7\x34\x63\x79\x09\xa6\x52\x1c\xc3\x27\xf4\x94\x4b\xcb\x31\x46\x96\xd3\x8c\x8c\x69\x9e\x80\x13\x37\xc4\xf9\x80\x7e\x8d\xe6\x09\x41\xef\xbb\xa8\x92\x2e\x22\x20\x2c\x3b\x89\x22\x1c\xc1\xba\x7a\xd0\xd9\x5c\x0e\xd7\x9f\x22\x6a\x46\x2a\x02\xd5\xbd\xa2\xf8\x27\x85\x83\xac\xf7\x6c\xb4\xf3\x79\xea\x45\xb8\xed\x67\x09\xb9\x60\x83\xb3\xb4\x14\xa4\x4d\x4b\x92\x31\x2a\x4a\x32\xcb\xcb\x34\xd3\xa5\x1e\xc9\xb3\xe8\x89\xc9\xf7\xeb\x2c\x49\xdd\x35\x10\x1c\x03\x55\x82\x4b\xf0\x59\xc7\xe9\x51\xd5\x71\x44\x3e\xb2\x56\xf6\xff\xd9\xfb\xf7\xf7\x26\x72\xa4\x51\x1c\xff\x79\xf2\x57\x88\xec\x2c\xb6\xc1\x97\x38\x37\x20\xd9\x2c\xc3\x84\xb0\xcb\x3b\x03\xe1\x21\xcc\xcc\x77\x4e\x26\x07\xda\x6e\x39\x6e\xd2\xee\xf6\xdb\x6a\x27\x64\x20\xdf\xbf\xfd\xf3\xa8\x4a\x97\x92\x5a\x6d\x3b\x24\xb0\xec\x79\x66\xce\x7b\x96\xb8\x55\x92\x4a\xa5\x92\x54\x2a\xd5\x25\x65\x19\x38\xed\x27\x7f\x72\xb4\x1d\x07\x3b\x43\x91\xa3\x97\x54\x6f\x90\x46\x3d\x22\x30\x47\x42\x70\x61\x2d\xc8\xbb\x24\xa8\x09\xa1\x81\xea\xd4\x27\xc2\xdc\x95\x59\xa5\xa4\x49\x22\xc8\xfc\xdb\x9e\xae\x4f\x39\x07\x2c\xef\x81\x2d\xb8\x40\x33\x4a\xb4\x49\x87\xad\xf9\x1d\xe1\x82\x77\x5d\x76\x98\xa5\x97\x10\x7d\x00\xc8\xe2\x98\x59\xc2\xfe\xdd\xeb\x81\xf9\xfb\xbb\x7a\xf3\xd7\x77\x55\x1e\x0b\x19\x54\xd2\xf4\x3d\xbe\xe3\xfa\x9e\xeb\x38\xa2\x3d\x89\x5c\x79\xa2\x4a\x15\xe7\x35\x94\xd2\xe6\x1a\x97\xc4\xea\x46\x57\xb9\x22\xd6\x32\xed\x53\xe2\x3a\x46\xf1\x92\xb2\x65\xc3\x33\xa2\x5e\x9a\xf3\x6d\x33\xb8\x82\x1b\xbe\xea\x79\xc1\xe4\xeb\xd0\x3c\xc6\x27\x1f\x98\x17\xdc\x67\x41\x4b\x8e\x77\x99\xc8\xf8\x45\x44\x83\x7c\x56\xe2\xfb\x06\x5e\x96\xe4\xec\xa8\x99\x27\x61\x17\xda\x6c\xd5\x4c\xd0\x2a\xcb\x0b\xb6\xaa\x6f\xbb\xb0\xca\x57\x7d\x1e\x08\xaa\xe4\xcf\xfd\x0d\xa7\x0c\x5a\xe1\xd2\x20\xdf\x54\xf0\xf6\x85\x6d\xdc\x5f\x76\xe6\x0b\xbe\x66\x33\x42\xab\xf9\x52\x91\x8b\xd5\xca\xd6\xf8\x15\xe6\xd0\xfd\xa4\xe6\x23\xd0\x74\xa5\xe5\xba\xd3\xda\xc2\x5c\x05\xa6\x6c\x98\x46\x42\x40\xc4\x09\x0c\xba\xa5\x1f\x83\xdb\x92\x7b\xa2\xec\xd2\x5f\x68\xae\x55\x50\x65\x99\xd9\xbb\x41\x97\xa4\xbd\x82\x98\xed\xc1\x92\x6e\xe6\x28\x64\x14\xca\x9e\x99\x52\x85\xff\xc2\xcd\x18\x8e\xf4\xa2\x8d\x54\x42\x6a\xb9\x1f\x76\xab\x35\x28\xb0\x5b\x04\x26\xda\x0a\x13\xbf\x04\x63\xf6\xd5\x46\x61\xbb\x42\x49\x7f\x5e\x58\xb7\xe6\x46\xab\xd5\xaa\x44\x89\xbb\x59\x5c\x5e\x3f\x4a\xdc\x5f\x61\xdf\xfc\xb0\x6f\xd7\x8e\xd3\x36\x27\xf0\x1a\xb2\xb2\x0d\x91\x39\x4e\x26\xb7\xe4\x84\x41\xbc\x5a\xf7\x16\x7a\xb5\xc2\x1d\x4a\xce\x11\x7a\x38\x8b\x68\xc4\xd9\xc5\x98\x67\xe0\x7c\x27\xcf\xdd\x22\x9f\x28\xf7\x3b\x67\xe5\x39\x22\x83\xef\xb1\xea\xbc\xc6\x7e\x61\x2f\x55\xf0\x4f\xad\x77\x4f\xad\xf5\x4e\xfd\x2c\xbf\x54\x9b\xe8\x4d\xce\x97\xeb\xcc\x23\xbf\xec\x7a\x7b\xe0\x91\x9c\x55\xcf\xd7\x40\xc3\x41\x33\x5f\x22\x58\x0b\x7d\x8a\x5d\x3a\x56\x8b\xc4\x8a\x06\x63\xb1\xbf\x31\xd6\x8a\xfd\xad\x23\xa9\xd8\x2f\x5a\x97\x68\xbf\xe8\x48\x28\xe4\x8b\x8a\x74\x82\x5f\xb0\xe7\xcc\xe9\xd7\xc4\x2d\x51\x74\xf3\xc2\x94\x58\x40\x1a\x90\xc4\x81\xc5\xf0\x23\x3e\x5e\x15\x30\x15\x5d\xa4\xfa\xed\x0d\xc4\x13\x71\xbe\xab\x00\x22\x2e\x4a\x18\x31\x44\x7d\x33\xb1\x41\x16\x9d\x25\xce\x96\x74\xab\x47\x89\x7f\x0c\xcc\x0d\x92\x6e\x37\x2b\xb5\x29\xbd\x7d\xbb\xec\x91\x10\xce\x08\x15\x6c\x70\xd5\xc6\xa9\x5d\x25\xd9\xe3\x31\x62\x6d\x6b\x77\xc5\x7b\xd9\xf9\xb1\xc8\xa3\x78\x28\x6f\x50\xcd\x24\x4b\xca\x24\x4a\x8f\x4a\x23\xbe\x42\xf2\xe6\x44\x94\x3c\xe3\x85\x30\x61\x0b\x60\xe3\x8e\x75\xa2\x1a\xf9\xeb\xad\x28\x31\xe3\x32\x6d\xc2\x8d\xb6\x20\xe7\x0c\x80\xfc\x45\x89\x75\x2b\x2a\x0a\x61\xe0\x45\x49\xc4\x69\xd3\x93\xc0\x2e\x18\x73\x12\x53\x53\x95\xb7\x41\x9c\x26\xa5\x70\x93\x4f\xa4\x3c\xab\xa6\xa6\x56\x2f\x15\x68\x64\x91\xf2\xcc\xb3\xa6\xe8\xf5\x40\xea\x32\x74\x91\x23\x13\x6c\x96\x89\xd9\x40\x0c\x8b\x64\xc0\x63\x16\xcf\x40\xc0\x36\x43\xb8\xe0\xec\xfd\x4c\x94\x4c\x9c\x25\x53\x96\x94\xe4\xfa\x60\x70\x3c\xc6\xec\xd6\x27\x27\x2d\xf6\x91\x55\xbf\x2a\x22\xec\x12\x61\x5f\x0b\x89\xa6\x5f\x7c\xf0\x89\xb2\x53\x08\x7f\x17\xdb\x6c\x96\x5c\xc3\x40\x38\xb3\xe7\xb1\x43\x66\x53\xdb\xe0\x12\xb8\x91\x99\xb1\xd6\x59\x06\xa1\x93\xb6\x8d\x09\xd6\x30\x35\x26\x72\xe0\x03\x4e\x62\xc1\x75\xd5\xab\x83\xbd\x92\x0d\x67\x45\xc1\xb3\xf2\xb9\xe4\xa9\x24\xc6\x39\xb0\x34\x30\xa5\x27\x6c\xcf\x7c\x56\x97\xb4\x98\xdd\x37\xf9\x92\xb4\x7e\x5f\x83\x13\x1a\x15\x7c\x92\x9f\xbb\x64\x90\x87\x1c\x7c\xd6\xae\xfb\x06\x63\x8d\x27\x25\x13\x99\x5e\xd6\x4c\x8c\xc3\xb2\x45\x32\x01\xec\xcc\x4d\xc8\x88\xb9\x3a\x5a\xa7\xe1\xff\x1d\xf3\x57\xdb\x30\xc8\x8e\xf9\xab\x6d\x27\x64\xc7\xfe\xd9\xa6\xfd\xef\x38\xc8\x5c\xad\x5c\x81\x40\x3b\x8e\x8a\x49\x9e\x5d\xea\x0b\x86\x12\x39\xd9\xbd\x5e\x68\xd7\x39\x36\xf1\xae\x25\xd2\x4d\x6f\x23\x08\x05\x41\xbe\x59\x16\x06\x77\x2f\x5b\xa9\xd9\xcd\x4c\x33\xde\x0e\x06\x7b\x8c\xd9\xc3\x20\xd5\x92\xce\xd9\xa1\x54\x5d\xc6\x08\xd7\x99\x01\x90\x1b\xdf\xba\x9d\xac\xd7\x25\x54\x69\x85\xe1\x37\x24\x3c\x04\x83\xcb\xa7\x4a\xe0\x78\x8a\xa4\x6b\xfa\x2d\x9b\x16\xce\xea\xf3\xfe\x6c\x6c\x38\x50\xeb\x73\x5a\x97\xe5\x06\x98\x7f\x28\x79\x16\x8b\x8d\x3a\x71\xda\x07\xdc\x9c\xd3\xb0\x6e\x4b\xd6\xd1\x74\xd4\x5c\xb3\x87\x27\xac\x1c\xd3\xee\x8a\x3d\x29\x6a\x9a\xca\x07\xef\xe5\x6e\xa5\x58\x3c\x1f\xbc\x67\x77\xef\xca\x7f\xba\x76\xfe\xd8\x63\xf8\xbe\xc3\x3e\x9a\xab\x2f\x7c\xb8\x92\x3b\xd9\x8a\x56\x49\x21\x23\x49\x39\x74\x10\x09\x0c\x0b\xac\xc3\x2a\x9c\x26\xe5\x78\x36\xe8\x0e\xf3\x49\x2f\x4a\x8a\x41\x36\xe8\x59\xc1\xb0\x03\xc8\xb2\x82\x4f\x73\x91\x48\x19\xac\x2b\x5b\x34\x41\x9a\x92\x8c\xe5\x05\x5c\x7a\x72\x56\xf0\x78\x36\xc4\xe8\x46\x28\x44\xc9\x6b\x4c\xcc\xa7\x3c\x8b\x79\x36\x4c\xd4\x8e\x09\x80\xb8\x53\xe4\x13\xce\xf8\x87\xb2\x88\x50\x2e\x07\x91\x42\xc8\xe6\x65\x13\x0a\xdf\x8b\x48\xc8\xa3\xe2\x8c\xc7\x5d\x24\x7f\x95\x1d\xeb\x19\xb5\x01\xc8\x83\x98\xbb\xc3\xfe\x98\xad\xaf\xad\xfd\xd8\xa0\x34\x37\x13\x61\xb4\x50\xc2\xbb\x94\x3c\xcf\x88\x8d\xaf\x9a\x84\xe6\x5a\xdb\x32\x81\x9e\xd6\x96\x79\xa2\x57\xcd\x00\x94\xc7\xe8\x2e\xb0\x87\x2f\x49\x9a\x8c\x37\x25\xaa\xab\x99\x65\x67\x59\x8e\xc6\xd1\x90\x0c\x57\x36\x0e\xdc\x6d\x9b\xc4\x3a\xdd\x51\x92\x96\xbc\x68\xba\x6d\x55\x14\x0b\x77\x0c\xa6\xbe\xd9\x35\x80\xab\xeb\x0f\x51\xd3\x51\x04\x48\x72\xee\x4a\xc3\xf2\x78\xb2\x16\x01\x21\x5a\x42\xd0\x18\x3d\x20\x15\x0a\x18\xae\xc8\xf8\xc0\xee\x74\xf4\x3e\x4f\xb2\x66\xa3\x8d\xee\x4b\x8d\x2e\x7b\x95\xf2\x08\xa2\x81\x01\x03\x49\x36\xa1\xed\x60\x8c\x7a\x63\xbb\xef\x68\x4b\xf4\x4b\xf5\x15\x24\xfd\xa9\xec\xbd\x5f\x20\xcf\xcc\xd6\xe7\xe4\x99\x91\x73\x5a\x3d\x1a\xb6\x6e\x27\xbb\xcc\x7a\xb7\xbf\xe9\x48\x6f\x87\x2d\x95\xb9\x6a\x7e\x22\xac\x0d\x9d\x1c\x61\xce\xae\x0b\xd9\xd6\x82\x84\x58\xdf\xec\xb7\x9a\x0d\x59\x95\xe6\x05\x6f\x3a\x4b\x8a\x26\xc9\x15\x24\x2f\xa4\xce\x9c\x00\x9f\x35\x9a\x26\x6d\xff\xd5\xee\x4a\x28\x9b\xc0\xd6\xcd\x12\xd3\x7c\x46\xea\x8a\xad\xf5\xe5\x52\x57\x6c\xdd\x2c\xa9\x46\x98\xba\x0f\x5b\xbb\xe1\xcc\x4f\xdb\xdb\x35\x25\xeb\x9b\x1b\x35\x25\x9b\x5b\xb5\x25\x90\xfd\x26\x5c\x52\x5f\x67\xeb\x3a\x4b\xe0\x45\x34\x0d\x4c\xe6\xcd\xb2\x7d\x78\x52\x11\xda\x11\x14\x79\x6d\x6e\x83\xcd\x2d\x9d\x09\x44\xdb\xa9\xd4\x21\x6c\x12\x15\xbc\x78\xf2\x4a\x1e\x35\x2f\xa2\x69\x43\x25\xa2\xdd\xe8\xf6\xd9\x8b\x68\xaa\x96\x9a\x58\x8e\x02\x9b\x5b\xdb\xad\xe6\x8b\x27\xaf\xe8\x1a\x39\xe5\x65\x78\x99\xbc\x88\xa6\x4d\x22\x16\x9c\xf2\x52\xe5\xe9\x0c\xe4\x2a\x5d\x63\x8f\xed\xe7\xe3\xb5\x13\x27\x15\xcc\x2e\x2c\x22\x93\x5e\x59\xa2\xde\xdd\xe8\x6e\xcb\x0e\xec\xc3\x71\x57\xb6\xaf\x12\x71\x9f\xf2\x72\xc7\xb9\x70\xd2\x4c\xdc\xae\xb9\x80\x24\xb3\xac\x7a\x20\xbf\x18\xbb\x1f\x85\xe8\x8b\x27\xaf\x5a\x60\xda\xd4\x72\x2e\x16\x58\xfb\xee\x5d\xfc\xa3\x7b\xbe\x4b\xf2\x6d\x2b\xe4\x1e\x79\xc8\x09\xc4\x41\xa7\x27\xd5\xa9\x8f\xe8\x25\x37\x90\xfe\x54\x6b\xab\x10\xcb\x98\x8f\x6a\x11\x04\x2d\xa3\x24\xe2\x1a\xdb\xf1\xf3\xa0\x5e\x49\xda\x61\x1b\xb5\x89\x31\xb7\x6e\x96\xcd\x25\xc0\xc1\xf1\xab\x3a\xd1\x77\xdd\x64\x23\xc4\xfb\x46\x6d\x06\x8f\x87\x8a\x79\x0b\x8e\x9c\xf0\x24\x4d\x6b\x53\x1c\x6a\x3d\xf2\xb0\xfc\x50\x9f\xd1\x49\x67\xd0\xd2\xce\xe3\xb5\xcb\x46\x27\xd1\x1a\xe5\xc5\xe1\xa8\x0e\xbf\x75\x0d\xf5\x7d\x52\xf2\x02\xb3\xce\xd7\xa6\xf0\xd4\xea\x6b\x65\xda\x12\x1e\x84\x5e\xd6\xf2\x12\x88\x09\xf9\x6b\xd7\xa1\x5e\xd8\x4f\x0f\x8e\xf6\x5f\x3f\x7f\xf5\xe6\xf0\x75\x5d\xfa\xd0\x0d\xdd\xf5\x28\x12\x25\xc6\xc7\x0b\xe7\xe0\x5b\x6b\x75\x15\xc8\x35\x37\x97\xa3\xe7\xff\xe7\x80\xed\x39\xa8\x3c\x66\x8d\xb7\xa2\xc1\x76\x58\x43\x24\x7f\xf2\x86\x4d\xef\x78\xa0\x56\x1e\xc9\xd5\x35\x8e\x30\x8b\x67\x4b\x2f\x70\x89\x05\xbc\xa8\x69\x15\x13\xb8\xf5\xec\xe9\x01\x98\x84\x9e\x66\x25\xef\xaa\x04\x66\x08\x08\xaa\x89\x67\x8d\x96\xd5\x7b\x44\x65\xf7\x6d\x72\x0c\xa5\x27\x4a\xe3\x3b\x2a\xf2\x3f\xb9\xf6\x0d\xd4\x9d\x81\xba\x47\xef\x0d\x58\x6d\xb4\xab\xba\x30\x7b\x06\x2e\xfa\x8c\x2a\x47\xf0\xd3\x19\xdb\xdb\xc3\x71\xd0\x7d\x62\xb7\x26\xcd\xa4\x52\xfe\x9e\xf2\x72\xdf\xbe\x8c\xd1\xf4\xf4\x17\x45\x34\x9d\xca\xeb\xcb\xcb\x27\x2f\x0e\xda\xec\xf9\xd1\x5b\xd8\x78\x9f\x3c\x7d\x7a\xf0\x9a\xee\x65\xfb\x6c\x8f\x29\xd8\xa6\x4f\xd5\xc4\xcb\xf5\xc1\x08\xf3\x2b\x90\x7d\xdd\x41\xe3\x6d\x62\x1d\x4a\x71\xf0\x52\xd8\x92\x85\xbb\xfa\x91\x12\xe2\x31\xd9\xb4\x1a\x72\x6b\x73\x2a\x24\x6c\x4f\x67\x96\x82\x07\x79\x48\x15\x03\x74\x77\xc0\x46\xce\xfd\x5c\xb5\x3b\x4a\x0a\x51\x22\xcd\x1c\xe0\x34\x04\x9c\x46\x01\xd8\x63\xc9\x88\x27\xe8\x17\x45\x10\x96\x1c\x48\x34\x6d\x26\x41\xcc\x1d\xd2\x6e\x0b\x97\xba\x29\xb4\xf4\x86\x86\x81\xe8\x27\xf8\xc3\xbb\x77\x90\xcd\xa9\xb9\x4f\x33\xc0\x11\x35\xa1\x3a\x14\xfa\xde\xa1\x30\x4c\x79\x54\x34\x5b\x0e\xdc\x3a\xe4\x87\x3f\xe2\x65\x2d\x1c\xfc\x22\x8c\xa2\x4a\x89\x79\x80\xb1\xaf\x86\x87\xfd\x3d\xe6\x1d\x1a\x72\x46\x5b\x10\x81\x2b\x32\x6c\x9e\xb4\xd9\x35\xf9\x1e\xff\xc3\x8f\x45\x20\x86\xa0\x5d\x17\xd3\x96\x02\x9b\x9a\x56\xa6\xdd\xcc\x57\x92\xe9\xff\x62\x9e\xf2\x92\x03\x76\xc7\x08\x4c\x3d\xd2\xac\xd5\x9c\xe5\xa4\x10\x9b\x38\x60\x84\x2f\xb4\xa5\x44\xbb\x32\x39\x1b\xde\xe4\x20\x1e\x5a\xa2\x70\x27\x68\xd3\x9b\x20\x05\x6b\xce\x76\xf9\x5f\x03\x3f\x36\x76\xdc\x04\xe7\xbe\x91\xfb\x9c\x29\x72\xa3\x7e\xe8\x69\x30\xb2\x8a\xdd\x37\x3d\x73\xe9\xaa\x91\xa3\xac\x9f\xf1\x0f\xa5\x9d\x45\xdf\x6e\x75\x5a\xf0\x73\x3b\x3b\x81\xf9\xd0\x9b\x68\x75\x4a\x16\x31\x81\x6c\xba\x05\x1d\xc0\xa4\x4b\x3c\x7c\x10\xf9\xad\x05\x25\xc0\x23\x12\xd6\x07\x31\xd3\xad\x90\x6c\x11\x06\x08\x35\x69\x98\xc2\x83\x4f\x03\xed\x5b\x1e\xe9\x74\x08\xab\x19\x35\xc4\x1d\xb3\x91\x07\x78\x67\x1d\x44\x51\x97\x1f\x46\x79\x71\x10\x0d\xc7\xcd\xa1\xb2\x2d\x1c\x65\x6d\x78\x4d\x7c\x52\x9c\x52\x2e\x6d\x55\x98\x70\xcb\x63\xc2\x6b\x36\xa4\xc0\x09\xcb\x55\x1b\x60\xbd\x7b\xac\xad\xd9\xce\xb4\xc0\xee\xf5\x5c\xce\x5c\xc4\x8e\x92\xee\xc3\xf2\x83\x83\x59\x40\xae\xef\x3b\x72\x7d\xdf\x91\xeb\xdb\x6c\x23\xc4\xe3\xf6\x93\xb2\x07\x76\x36\x20\xf6\x58\xb3\x30\xdb\xc1\x18\xe2\x6f\x47\x2e\xb3\x8f\xd4\xb6\x73\xae\xb6\xb4\xee\x19\xd2\xcc\xb1\xd5\x86\xa7\x80\x73\x5e\x94\xac\xcc\x51\xe9\x0f\x07\xca\x87\x44\x40\xf4\x75\x7a\xb2\x54\x30\x31\x82\x7f\xd1\xf2\x36\xc7\x69\xc0\x17\xa1\xba\xd3\x3c\xf0\x26\x79\x1c\x89\xf0\x36\xf3\xc0\x63\x2b\x09\xe8\xec\x31\xe3\x48\x90\xb9\xd6\xed\x54\x0d\xc5\xee\xdc\xa9\xbb\xe1\xa8\xb3\x80\xee\x22\x57\x15\xb5\x1a\x11\xec\x5a\x2c\x7e\xe5\x1e\x73\x28\xe0\xd9\xe3\xce\xbd\x7b\x35\x03\xd8\x84\x50\xc0\xe5\x17\x46\x41\x55\xdb\x37\xd7\xac\x98\x26\xd6\x21\x02\xa4\x77\x7b\x5a\x6a\xd7\xd4\x9b\x5f\x1b\xc5\x14\xfc\x08\x51\x27\xa3\xec\x94\x87\x38\x22\xb0\xc7\x2a\x86\xc3\x7d\x5c\xef\x80\xb2\x11\xbc\xdf\x64\xfc\x82\xd4\xf7\xcc\xbd\xed\xb6\xa4\x71\x25\xa1\x27\x76\x42\xb2\xaf\xba\xc4\xb5\x65\x0f\xff\xe8\x38\xe2\x15\x63\x67\xea\xfa\x57\xf3\x1f\x56\x39\xe3\x96\xb9\xcf\x77\x10\xe9\x9a\x2a\x58\x01\x20\x4c\x95\xe9\x8e\x3e\x2f\x14\xf2\xed\x40\x15\x09\x91\xe4\x33\xe1\xad\xa5\xcc\xd9\x00\x6a\xba\x83\xb3\xca\xad\x27\x25\x9e\x48\xd2\x6d\x1e\x9a\xa8\x72\x8d\x35\x17\x51\x27\xbf\x3b\xea\xb8\xa0\xe7\x86\xb3\xdd\x04\x8e\x2a\xa7\xdc\x1e\x12\x36\x02\x72\xaf\xc7\xa2\x38\xc6\x94\x84\x76\x12\x02\x37\x11\xf7\x0a\xe2\x36\x7d\x45\xef\x29\x86\xc7\x35\xc3\xee\x98\xbf\xda\xa8\x34\x38\x82\x8b\x3c\xe5\xff\x7d\xf7\x8a\x40\xcc\xf6\x25\x72\xa0\x44\x6d\x33\x74\x8a\x90\x7f\x28\xaf\x93\x36\x3b\xb6\x39\x1d\x4f\x74\x0d\xb5\x45\x6d\xb6\xf5\x5f\x0f\xcd\x5f\xfd\xbe\xfd\x73\xbd\xad\xf7\xa8\x2d\xf3\xd7\x43\xf3\x57\x7f\xcd\xfe\xd9\x87\x96\xc9\x0d\xd9\xa2\x4b\x73\xfb\x4b\x34\x24\x43\x9c\x25\x59\x4c\x1f\x93\xe5\xfe\xee\xc8\x47\x16\x14\x0f\x25\x89\x74\x19\x15\xa7\xbc\x74\xea\x9c\xb1\x3d\x68\x6b\xb7\x8e\x5b\x64\xa1\x53\xa3\x7a\xcd\xf0\x6a\x68\x86\xc6\x49\xab\x6a\x89\x99\x2b\xd1\xc9\x56\xa9\x4b\xaa\xec\xd0\xac\x98\x33\x5a\xe2\x0a\xde\x29\x61\xae\x65\x8f\xa8\xeb\x1e\x4f\xbd\x9e\xe4\xaa\xea\x32\x23\x0b\xa5\x04\x2b\xd0\x66\x75\x77\x0a\x9d\xc2\x50\x41\x2e\x2e\x2f\x10\x70\x5e\xb0\x51\x92\x25\x82\x64\xe6\x54\xef\xe9\x76\x4d\xe1\xfc\x06\x24\x77\xa3\xfc\xe2\xd3\x66\x3f\xe4\xde\x4a\x00\xd8\xe0\x92\xce\xa8\x1c\x07\xd2\x7b\x8f\xa1\x52\xbf\xe5\x34\xb7\x66\x44\x03\xc7\x11\xd8\x54\xc1\xb5\x52\x57\xe9\xdc\x0f\xe0\xa5\x8b\x8f\x8d\xbc\xa1\x00\x75\xf0\xbd\x2b\xbd\x36\xd9\x63\xd6\x50\xeb\x0f\x94\x23\xaa\xa3\x36\xbb\x63\xae\x9b\x24\xf2\xb4\x5a\xc1\xc7\x3f\xfc\x20\x50\x1b\x74\xa2\x56\xe0\x7a\x57\x2f\xc0\xf5\xee\x3a\x80\x5a\x8d\x51\xd3\x08\x6b\x57\x21\xc3\xa4\xad\xdb\xcc\x62\x8c\x4a\x1d\xcc\x48\x5b\xa3\x7c\xda\xd6\x7a\xb9\xbc\xa8\x55\x24\xe9\xa7\x9b\x79\x2a\xc3\x6b\x6b\xbb\x8e\x5e\x1d\xec\x3f\x3f\xa8\x05\x5b\x6b\x35\x1b\x8a\xaa\x8d\xb9\x46\xa2\xac\xf9\xd3\xc1\xef\xd6\x08\x6a\xdf\x7a\xbe\xc8\x21\x1d\xff\x74\xf0\x3b\xc4\xb5\x27\xbe\x25\x8f\x49\xc9\x8e\x22\x0f\xfc\xd2\x6a\x2a\x3a\x8a\xbb\x77\xd9\xbe\xfc\x9f\x3b\xfb\xc7\x0a\xe3\x13\x29\x63\x75\x47\x72\x9f\x54\x5f\xb4\x70\x35\xcc\xb3\x51\x72\x3a\x03\x05\x05\x3e\xdf\xa0\x70\x59\x15\xb9\xec\x91\x92\x08\x34\x15\xba\x0a\x67\xf1\xde\xba\x4d\x73\xe5\x6b\xb0\xc3\x12\xa9\xbf\x21\x1f\x0e\x07\x1d\x45\x9d\xbe\x52\xeb\x35\x93\xb4\x4e\x51\xba\xdd\x57\x40\xe3\x24\xae\xe3\x3f\xa3\xed\xbd\x8e\x9e\x79\x39\xcd\xf0\x35\x54\xcd\x89\x98\xfb\xbe\xb9\xd5\xb7\xba\xe1\x37\xd6\xe3\xad\x56\x77\xfe\x68\x89\x35\xa5\xd5\xf0\x3c\x1a\x8e\x6b\x15\xcd\x0f\x5a\xcd\xb5\xeb\xad\xbe\x79\x6b\x09\x4f\x7e\xa3\xda\x54\x09\x4e\xc1\x9e\x61\x92\x67\x56\xeb\xf6\xfc\xe8\xed\x6f\x07\x4f\x7e\xb2\xeb\xee\xc7\x48\x80\x1f\x08\xae\x26\xd9\xcc\xc9\x2e\x59\x92\xb2\x58\xff\x06\x65\x1d\xdb\x23\x5b\xae\xe0\x25\x6c\xb7\x51\x1c\x37\x34\x14\x5c\x61\xd8\x1e\xae\xbe\x7d\x9a\x1a\x0a\xcb\x0f\x8d\x95\x23\x9c\x8a\x74\xec\x9f\x3e\xe9\x2d\x60\x9f\xdd\x71\x96\x3e\x9c\x99\x0a\x77\xe5\xa3\x54\xe6\xfa\x16\x0f\xcb\x1c\x98\xb5\x59\x95\x1d\xe4\x1d\x61\xbf\xd9\xd2\xd2\x59\xb3\xa5\x9c\x5e\x95\x39\x00\x11\xea\xd4\xa5\x82\xa8\x61\x89\x6b\x05\x00\xed\x63\x0a\x9c\x49\x9e\x75\x5d\xf5\xf2\x7c\x9d\xf2\x02\x7d\xa6\x9a\x2b\x05\x26\x57\x66\xf7\xe5\xc1\xc1\x53\xa2\xf5\x71\x6e\x36\x35\x6a\x69\x10\xd5\x16\x29\xa6\x15\x10\x51\x4d\x0f\x89\x6a\x1a\x4a\xbb\x6f\x87\xa0\xf9\xb9\x80\xa9\x6f\x3a\xe7\xf8\x75\x35\xbc\xd0\xa0\xd5\xf1\xc2\x4f\x4f\xcb\x2b\x97\x48\x53\xf2\x4f\x1b\xd4\xad\x6d\xd4\x8a\xb5\xd5\xcc\xb6\x25\xba\xe3\x48\xb4\x05\x2f\xdb\x20\x6f\x2b\x69\x5b\xcb\xda\x65\xfe\x3f\x47\x87\x2f\x1b\x5d\x31\x4d\x93\xb2\xd9\x68\x37\x5a\xed\xd0\x01\xa3\x25\xc2\xe7\x47\x6f\x35\x13\xff\x74\xf0\x3b\x1c\x2f\x92\x75\x25\x47\xe9\xdf\x92\xa5\xe9\x98\xe5\x77\x8c\x60\x58\xe6\xc0\x68\x86\x0d\xef\xde\x35\x95\x00\xf7\x46\xab\x05\xbb\xa1\x3b\xbb\x3f\x1d\xfc\x4e\x51\x8a\xda\x6c\x40\x85\x39\xe7\xd9\x40\xde\xda\xf7\xa1\x8a\xa7\x7a\xbc\x63\x10\xbf\x7b\x97\x91\xfe\xef\xe8\xcd\xad\x19\xb5\x8c\x50\xa5\x91\x3a\x95\x8b\xf3\x31\x51\x45\xed\xf8\x7e\xcf\xb8\x37\x0b\xb4\x4b\x43\x69\x7d\x08\x07\x6a\x33\x72\xde\x3d\x01\xe9\x8a\x00\x69\x70\x7a\x8c\x16\xfd\x3b\xaa\x2d\x23\x51\x7a\x53\x4d\x96\xef\xcd\x75\x1d\x0a\xdb\xae\xac\x18\xd2\x6e\x80\x69\xa8\xbb\xa5\xeb\x0b\x12\x4a\x81\x87\xb8\xd7\xc9\x8d\x4a\xc2\xab\x73\xb3\xa9\xfe\xed\xfe\x8b\xdd\xd7\xdf\xba\xbf\x91\xbf\x9f\xb5\xd9\x21\x36\xa0\xe7\x05\xb7\x53\xb5\x2d\x98\x7b\x64\xe5\xf2\x48\xed\xdc\xf7\xc3\x22\xc3\x5c\xd3\xf6\x65\xec\x7c\xd6\x58\xe7\x9f\x0c\x9c\x83\xff\xa6\x16\x10\x58\xff\xd8\xaf\x93\x68\x0a\x36\x0a\x04\x0e\x0c\xc6\xe4\xc7\x0d\xfb\x51\xe4\x13\x2e\x3f\x6d\xda\x4f\x10\x89\x42\x7e\xdb\xa2\x75\xb3\x58\x7e\xda\x76\x3f\x3d\x87\x2b\xfb\x92\x6f\xc6\xcf\xe7\x1e\xce\xfd\x2d\x2d\xb0\x2c\x6b\xa5\x54\xe6\x3f\xa3\x8a\xb4\xee\xfc\xd6\x4f\xc1\x91\x18\xd6\x1e\xcd\x0f\x43\x86\x2b\x96\x1d\xdf\xfc\xfe\xea\xa0\xcd\xbe\xc7\xf3\xc2\x9e\xa4\xea\x58\xdc\x63\xb2\x5c\xae\x40\x63\xbc\xff\xfc\xe8\xed\xb3\xe7\x3f\xbf\x81\x7d\x47\x17\xae\x93\xc2\xa3\xc3\x17\x07\xa4\x68\x83\x14\x1d\xfc\x7a\xf0\xfa\x77\x52\xb6\xe9\xb4\xf9\xf2\xe9\xdb\xe7\x2f\x9f\x1e\xfc\xff\x08\xc0\xb6\x06\x78\x79\xf8\xf6\xdf\x87\x3f\x83\xa0\xae\xcb\xb6\xe4\xda\x73\x2a\x6a\x60\x63\x30\xa0\x46\x25\x01\x23\x31\xdc\x0d\x58\x9f\x34\xbf\xc7\x8d\xca\x55\x9d\x47\x25\xd5\x0e\xca\x33\xde\x18\x6c\x7d\x4f\x94\xc4\x28\x68\xa5\x52\xc0\x53\x33\xdf\x3c\x24\x45\x21\xe5\x37\x2a\x16\x37\x5a\x8e\x4f\x01\xce\xb0\x9e\xec\xa6\x6c\x52\xe9\xc6\xa9\x2b\x82\x52\xf1\x11\x77\x04\xb3\xdb\x19\x19\x46\xbd\xaa\xaa\x41\xa9\x36\xd8\x0e\x99\x33\x1f\x66\xad\x45\x95\xed\xb6\xed\xf3\x28\x6d\xcb\x0e\xa8\x87\x83\xd1\xd7\xa3\x12\x14\xff\xb9\x7f\xbf\x05\xbb\x87\x99\xa1\x4f\x9f\x14\xae\x49\x06\xd4\xa1\x87\x96\x94\x98\xe5\x37\xf2\xca\x8e\xdb\x20\xf0\x64\x13\x3a\x85\x22\xdc\x98\xec\x99\x21\x27\xdd\x0f\xb7\xab\x15\x59\x48\x06\xab\x35\x93\x58\xa3\x10\x24\x77\x08\x5d\xc3\x78\x4f\x17\x5c\xb4\x8c\x3b\xb0\xdf\xae\xf2\xd1\xdd\xd8\x71\xc2\x2c\x30\xfa\x5f\xaf\x07\xe6\xbe\x7e\x95\xad\x1d\xa2\xb9\xf6\x34\x43\xf0\x6e\x6d\xf4\x0e\xa6\xca\xb6\xa9\xa2\x08\x5a\xad\xf2\xdc\x51\xdb\xaa\x7a\xeb\xfa\x70\xea\x4e\x67\x62\x2c\xa9\xd6\xda\x75\xea\xc1\x2e\xa8\xbf\x10\xc7\x71\xbd\x04\x5b\x6e\xb0\x08\x59\x09\xb7\x44\xe7\xe8\x59\x71\x8f\x47\xb2\x40\x1f\xb3\x4e\x1f\xb9\x0a\x16\x3b\xae\x43\x5c\xdc\x8f\xed\x9f\xf4\x08\xbd\x0a\x1f\x12\x37\xf3\x13\xe8\xf5\xd8\xa3\xee\x66\x77\xbd\xbb\x81\x1b\xb6\xd2\x6d\xec\x23\x83\xe7\x45\x72\x9a\x64\x51\x0a\x45\x66\x31\x58\xc3\x6b\x2e\x88\xcc\x5b\xbb\x7b\x3e\x5a\x70\x55\xd1\xbd\xd8\xd5\x46\x8c\xdc\xa4\xe0\xd9\xac\x76\x66\x2a\xb5\x5a\x4d\xb3\xce\x43\xe4\xb9\x99\x29\xef\x75\xee\x8b\x2a\x0c\x47\xed\x85\x76\xeb\xd6\xf5\x25\x86\x06\x56\x69\x62\x0c\x74\x54\x4c\x10\x4b\x26\x72\x5b\xd0\x1f\xa9\xab\x38\x79\x4a\xc9\x85\xe8\x14\x3c\x4a\x27\x92\xb7\x61\xdb\x35\xcf\x31\xe6\x36\x56\x89\xbb\xd2\xdc\x07\x09\x11\x49\x00\xe1\xa6\x10\x01\x22\xd6\xc9\xcb\xd5\x7e\x55\x05\x89\xe8\xaa\xcd\x7f\x9f\x68\x36\x25\xac\x55\xd6\xd0\xad\x6c\x9f\x44\xa2\x08\xb4\x08\x6a\x18\x23\x5b\x01\xac\x15\x7a\x1f\x2b\x1c\x77\x6a\xa4\xae\xed\x1b\x5b\x57\x07\x1c\x29\x9e\x46\xe7\x49\xfc\x63\x31\x8b\xb2\xb2\xf7\x22\x9a\x76\xdc\xe7\x46\xbc\xb4\x2c\xab\xae\x59\xf1\x45\xd3\x57\x44\x1c\x7d\xdd\x46\xdb\xd3\x36\xfb\xc8\xb0\xd9\x1a\x23\xe5\xed\x7e\xab\x09\x90\x2d\x16\xb2\x9a\xde\xbe\x99\xd5\xf4\x0d\xa9\x00\xd1\x17\xf2\x3a\xad\xcf\xba\xb1\xca\x05\x7f\xed\x9a\x6d\x67\x7b\x7d\xbe\xd0\x06\x92\x7f\xd0\x9c\x16\x11\x69\x52\xbb\x33\x85\x10\x5c\xc9\x5a\xf2\xb6\x8b\xb5\xd1\x07\xcf\x3a\x38\xc8\xaf\xec\x3e\x5b\xfd\x1b\x36\xc1\x12\x91\x35\x4a\x76\xca\x33\x5e\x24\xc3\x55\xf7\x95\x55\xe2\xde\x34\x92\x50\x78\x73\xdf\xbe\x99\x85\xf8\x72\xea\xb3\x79\x44\x92\x77\xf8\x36\x7b\xfe\xe6\xe0\xf5\x93\x37\x87\xaf\xed\x3e\x63\xc4\xa6\x63\x58\x97\xf6\xc2\xaf\x12\x42\xb6\xe9\xe9\xaa\x7f\x90\x86\x88\x1c\xa9\x0f\xb8\xd0\xf0\x6f\x66\xed\x4d\x98\xb0\x1c\x6e\x3c\xea\x2a\x4e\x4c\x72\x70\x68\xca\x45\x94\x76\x04\x2f\x27\xd1\xb4\x93\x8f\xe4\x6c\xf4\xfe\x26\xf8\xb0\x33\x89\xa6\xdd\x7c\x54\x63\xc1\xbe\xa9\x17\x4d\x00\xd9\x5b\x35\xec\xbd\x36\xee\x4b\xef\x1e\x73\x66\x7b\xff\xf0\xe7\x9f\x31\x2e\x07\xce\xb4\xbf\xd1\x1c\xb5\x99\x05\x91\x3b\x4c\x4e\xcd\x03\xf2\x51\x93\x8a\xfc\x46\x28\xf7\x8d\x55\xac\x80\xfc\x84\xa9\x03\xa3\xe9\x88\xea\xea\x91\x0d\xbf\x75\x3a\x2d\xf6\xe4\x18\xff\x3e\xa1\xad\xe9\x6f\xce\xa2\x92\xd2\x82\x5c\x53\xcd\x27\xb8\xaa\xea\xb4\xf1\xdb\x37\x7b\x9c\xf9\x7c\xce\x82\x48\xaf\x61\xde\xda\x9e\xc3\x5b\xb7\xfa\x78\xf0\xc5\x78\x0b\xae\xd1\x0b\xe2\x90\xac\xdb\x87\xaa\xc5\xca\x80\x9b\x6d\x5e\xd7\x66\x67\x39\x58\x6a\xd2\x25\x77\x68\x15\x73\x05\x6c\xb9\x26\xd1\xf4\x19\xb1\x0b\xb3\x96\x5c\xf0\x82\x22\x0b\x1d\x06\xed\x9f\xec\xd2\xd2\x69\x92\x9d\xb6\xd9\x93\x36\xcb\xda\x6c\x38\xc0\x22\x43\xad\x26\xb9\x13\x2b\x58\xb6\xa7\xda\xbc\xb3\x17\x94\x99\x14\x58\x8b\x34\x02\xf0\xc4\x9e\x48\x21\xbf\xe7\x68\x67\xfd\xa5\xa2\xe0\x9f\x98\xdd\xdc\x6b\x5e\x8b\x63\x19\xb5\xeb\x1c\x0e\xd4\xcd\x5c\xd1\xc4\x8e\x7a\xfd\xa4\xcd\xd6\x69\x04\xe2\xc3\x91\xc2\xc3\x9c\x0d\x76\x8a\x32\xfe\xa1\x7c\x5e\xf2\x09\xbd\x3f\x3e\xc1\x2b\xd9\x70\x60\x4a\xdb\x2c\xbb\x7f\x9f\x04\x5e\xd6\x7a\x44\xd7\xbe\x27\xd8\xd5\x13\x75\x02\x3d\x09\x7a\x01\x2e\xbb\x5b\xdc\x4c\x11\xf7\x19\x2e\x64\xdb\x0f\x97\x73\x21\xdb\xbe\xd9\xed\x2f\xdc\xf7\xa3\x90\xe0\xd4\x59\xfb\xd0\x1f\xd1\xff\x02\x64\xba\xd9\x5d\xab\xd7\x63\xeb\x6b\xe8\x97\xb8\xc6\x5e\x82\xcb\x70\xf7\xc5\xf3\x97\x6f\x8f\x9e\x3c\x3b\x78\xfb\xfc\xe5\x9b\x83\x7f\x1d\xbc\xfe\x6c\x19\xf9\xa8\xcd\x1a\xd8\x26\x88\xc6\x7e\xbb\x3b\xd5\xf1\x05\xc5\xe2\x07\x37\xbb\x1c\x2c\x08\x3a\xb5\xbe\xd6\xdf\x6a\xb3\xdf\xa3\x71\x9e\xdf\xd1\x51\xa6\x6c\x71\x30\xb2\xd4\x4b\x7e\xc1\x7e\x3c\x7a\xca\x7e\xc6\x22\x4c\x90\x2f\x0b\xa2\xe1\x30\x9f\x4c\xa3\xec\x52\xee\x24\x4e\x8c\x29\x88\xb9\xc8\x8b\x89\xd0\x31\xa4\x20\x5e\xce\xc1\x93\xfd\x37\x6f\x8f\xde\x3c\x79\xf3\x7c\xff\xc8\x98\xc6\x0d\xc7\x49\x1a\xef\xe7\x59\xc9\x3f\x40\x26\x50\x41\x1f\xc3\x87\x35\xdf\x15\x6b\x83\xcb\xae\xf3\x3d\x11\xd3\x34\xba\x7c\x19\x4d\xfc\x37\xf5\xa7\x35\x35\x26\xc9\x87\x24\x73\xbe\x18\x3f\x65\xfa\xb1\x84\x48\x36\x18\xa9\x40\xbd\x8d\xff\xf4\xf2\xf0\xb7\x97\xde\x70\x32\xa7\x63\x94\x1e\xec\x6f\x73\x0f\xb1\x9f\x20\x28\x54\xe1\xfd\x26\xe5\x66\xcf\xa3\x9f\x92\xf2\xd2\xc3\xc5\xf5\xfa\xb6\x11\x53\xdc\xef\xbb\xda\x6f\x87\x78\x5f\x4b\x52\x91\x10\x2b\x81\xc2\x50\x2d\x1d\x47\xb5\xa6\x9e\x2a\x0e\xd5\x7c\xca\x31\x56\x07\xe8\x72\x82\x95\x2d\x84\xa9\xff\x4a\x13\x0e\x4e\x6a\x5b\x8b\x7c\x47\x58\xf4\x00\x32\x9f\x4d\x30\x48\x53\xfb\xee\x5d\xef\x8b\x0a\xa7\x3e\xff\x98\x1f\xe7\x89\x28\x5f\xe6\x19\xc4\x0a\x3a\x2a\xa3\x32\x19\x0a\xf5\xb0\xb9\xaf\xfd\xcd\xdb\x2a\x74\x1a\xf9\x30\x48\xa3\xe1\x59\x9a\x88\x32\x10\x7b\xc5\x03\x46\xeb\x42\x15\x39\xbc\xc5\x3e\xb2\x5e\x8f\xc5\xb9\xbc\xd9\x41\xdf\x2c\x3f\xe7\x85\x8e\xf0\xd8\x1c\x97\x93\xb4\x65\xa3\x06\x88\x15\x47\xdf\xea\xd1\xc0\x0f\x7c\x8c\x4a\xea\x31\x2f\x92\x92\xc7\xb6\x7f\x9f\x52\x4d\x0f\x41\xc7\xe0\x5a\x9b\x45\x56\x5a\xb9\x7b\x37\xd4\xb6\x1c\xdb\x02\xac\xe4\x7f\xcb\x51\xb9\xda\x3e\x25\xb4\x8b\x25\x4d\x80\xe6\x3c\x40\x2a\xb7\xf2\x00\xb7\x07\xc6\xed\x50\x37\xc8\xe8\xfe\x68\x54\xf3\x10\x81\x68\x98\x67\xc3\xa8\x0c\xd7\xab\x74\xe6\xc4\x5b\x37\x7f\x86\xd2\x44\xd1\xe8\x46\xec\xfe\xfd\x24\x34\xcd\xe0\x4a\xca\x54\xb0\xa1\xea\xfc\xdd\x71\x36\x64\x48\xc6\x00\xef\xbb\xce\xc6\x66\x3e\x37\xef\x18\x2a\x83\x65\x84\xf9\x05\x10\xc1\xf8\xda\xb8\x33\x91\xf5\x5e\xb7\xd0\x7d\x3a\xf8\x9e\x30\xfa\xbf\xb2\xb8\xc4\xa5\xf1\x04\xd2\xb0\x8d\xa2\x24\x9d\x15\x5c\xa0\x8e\xa6\xe0\x51\xdc\xc9\xb3\xf4\x92\x44\x66\xa8\xb4\xc0\xf0\xf0\xa0\x01\x6a\x2a\x1c\x06\x26\xd7\x16\xef\x00\x1e\x57\x6c\x18\xc1\xbb\x84\xe4\xe3\xba\xa8\xe0\x81\x00\xdf\x6e\x4f\x5a\x5a\x5c\x99\x07\x12\x10\x15\x1f\xdc\x4c\x6f\x76\xeb\x61\x7b\x30\x46\x4d\x26\xbe\x7f\x2f\xc4\xf7\x99\xf8\x5e\x8c\x39\x2f\x0f\xa7\x65\x92\xeb\xb2\x29\x89\xc4\x16\x92\xa7\xd6\x48\x2b\xb5\x0a\x39\x13\xcc\x07\x61\xdc\xe0\x35\xbf\x25\x69\x3c\x8c\x8a\xb8\xf9\x36\xb3\xf1\x75\x4c\xb7\x75\xf1\x81\x36\x1f\xac\x57\x81\xe7\x05\x07\xb2\x2d\xb6\x6e\x3d\x92\x4e\x43\x09\x35\x0d\x1a\x4b\xa7\xae\x0b\x33\x5e\xd5\x87\xda\xf8\xab\x1d\xb8\x08\xec\x9a\x0b\x8d\x72\x23\xbb\x38\x1c\xbc\x47\xdb\x28\xd3\xc4\x1d\x13\x7f\xb9\x92\xdb\x85\x74\xa6\xb8\xc6\xf1\x67\x21\x6b\x1b\x03\xae\xe6\x83\xf7\xb8\x94\x5b\xaa\x2b\xdc\x4d\xe0\x34\xc0\xe4\x2f\xf2\x42\xa4\xcb\x0c\x01\x14\xc4\x2e\xb9\x43\x1d\x22\xee\x0e\x45\x3c\x8e\xd5\x9d\x59\xc7\x11\xb4\x03\x76\x50\x0f\x33\xbb\xad\x6a\x02\xeb\x29\x37\x0a\x9e\xcd\x26\x9c\xda\x68\x86\xec\x36\xd9\x45\x91\x94\xf6\xb7\x94\xea\x2d\x9d\x73\x3b\x6a\xf4\x27\xb1\xcf\x06\x38\x21\x26\x5e\x93\x4b\x80\x66\x70\x45\xc1\x5c\x55\xc2\xfc\x84\x61\xdb\x2c\x13\xdd\xf7\x42\x6e\x05\x96\xb9\x49\x27\xb2\xac\x75\x9d\xb6\xec\xcf\xcc\x69\x54\xc5\x42\xbf\x7e\x5b\xe2\x35\x3f\x4d\x44\x59\x5c\xd6\xa2\x58\x28\x80\x6b\xb5\x3d\x89\xb2\xe8\x94\x17\x75\x38\x86\xea\xb5\x2a\xd7\xde\x07\x37\xd3\x8b\x7f\xa1\x5d\x76\xa9\x9d\x34\xc8\x4f\xb2\xcd\xf7\x42\xec\x60\x24\x27\x4b\x17\x08\xc8\xd9\x6a\xe2\xe9\x9d\xe3\xe4\xce\x07\x62\xca\x36\xe1\x5f\x3c\x03\xf7\x0d\x13\x97\x7a\x87\x56\x91\x24\x23\xf1\x5c\x95\x99\x14\xf9\xa2\x6e\x78\x2a\x11\xd9\x65\xca\x8f\xe4\x6c\xcc\x6b\xa3\xad\x4e\xca\x49\x7e\xbe\x64\x0d\xb0\xb7\x6c\xc3\x43\x00\xf2\xd1\xfc\x91\x45\x71\xbc\xb8\x7f\x9d\xa2\x62\x61\xbf\x2b\x55\x5d\xca\x83\x5b\x8d\x2d\x73\x5b\x4c\xa5\xae\x24\xc6\x16\x9e\x24\xbe\x58\xd5\x48\xae\xca\xa3\xc5\x29\xef\xda\x9c\x3a\x12\x10\xe3\xd1\xae\xb2\xc7\xf4\xf1\xd8\x39\x00\x55\x6d\x75\x0c\xed\xd4\xc2\xa9\x73\x6c\x11\x32\xf2\x9c\xa3\x81\xce\x25\x84\x02\xc6\x52\xb8\x77\xf8\x29\x49\xd8\x63\x8b\xea\x8e\x8b\x12\xce\xd6\x0a\xbb\xc7\x0e\x3e\x94\x45\x34\x2c\x31\xaa\xfe\x65\xca\x85\x0e\x2d\x01\x31\x83\x8d\x8c\x29\xd0\x3d\x68\x98\x67\x65\x94\x64\x4e\x92\x3c\x4c\x87\x73\xaf\x17\x5e\x8b\x76\xe4\xd8\xbc\x09\x96\xc1\x45\x9a\x64\x65\x27\x4e\x84\x3c\x4e\x3a\x19\xff\x50\x76\xd2\x24\xe3\x2c\xcb\x3b\x62\x1c\xc5\xf9\x05\x0d\x5f\xc9\x11\x4d\xa7\x11\xe5\xb6\x24\x0f\x0a\x0c\x40\xb6\xc2\x42\x89\x17\x9d\x1a\x24\xeb\x3d\x84\xd1\x91\x65\x4e\x6e\xb6\x73\x1b\xbb\x5f\x51\xec\x3c\x98\xc8\xe1\xb1\xf3\x6b\x47\x73\x96\x89\xf0\x4f\x9e\xd7\x4b\x93\x80\x21\x98\x91\x18\x9d\x97\xf2\x16\x8e\xe4\xe3\x15\x89\x01\x90\xbb\xc7\xa9\x56\xd8\x5a\xf3\x99\xd2\xcf\xed\x20\xf9\x01\x11\xbe\xa3\x93\x55\xc9\x7b\x8e\x9b\xd9\xa4\x9a\x60\x09\xac\xe9\x91\xc4\x10\x8f\x5a\x93\xfb\x3c\x90\x7b\xca\xc0\xb9\xf7\xa0\xfa\x61\xd0\x81\x98\xca\x01\x8f\xe3\xd0\x1d\x21\xdf\xf5\xe2\x90\x7a\x8c\xb0\x1b\xda\x79\x6e\xf5\xe9\xf0\xb6\x76\x1e\x95\xb5\x0d\x12\x21\xec\x79\x5e\x2f\xe6\x97\xd3\x49\xc2\x85\x31\x29\xd7\x31\x0b\x83\x17\xe4\x29\x89\x1b\xa8\x63\xfd\x56\x6f\xa4\x98\x9a\x2f\x39\xd9\x25\x9f\xbb\x56\xe8\x63\x7b\x35\xdf\x3f\x7d\xd2\x46\x59\xa4\x9c\x8a\x86\xda\x92\x1e\x58\x60\x15\x46\xbf\x2a\x57\x1e\xb9\x57\xd2\xaa\x5a\x82\x34\xd5\xc2\x04\xd6\x23\x27\x35\x2b\xb7\x55\x10\xa9\x2b\x06\x94\xc4\xae\xa9\x8d\x8a\xc8\x57\x18\x1b\x5f\x80\xa2\xe5\x95\x26\xa5\x4a\x5c\xa2\x8a\x5b\x55\xe2\x93\x86\xa8\x35\x35\xa9\x83\x63\x76\xda\x9d\xd7\x8a\x8b\x82\x11\xfa\x09\xc4\x2e\x5c\x86\x9a\x86\x6b\x74\x2e\x93\x9a\x47\xbb\x4d\x1f\x70\x5e\x40\x56\x05\xf2\xd5\xaf\x73\x60\xed\xb1\x1f\xa5\x29\x44\x96\x6f\xea\x10\xec\x6d\x3a\x6e\x3d\x1f\x77\x4c\x31\xcd\x24\x43\x01\x25\xa4\x0d\xd6\x6c\x8d\x45\x56\xf7\xa3\x2c\xcb\x4b\x0c\xd8\x1f\xa9\x8c\x23\x91\x20\x61\x9b\x57\x5b\xea\x5e\xa5\x8e\x3e\x10\xa9\xc4\x0b\x94\xa0\x31\xd5\xc4\x19\x67\x11\xfb\x8d\x47\x67\x2f\xa2\xa9\xca\x9c\x95\x08\xc9\x72\xc9\x69\xa6\x12\x92\xe6\xb3\xac\x64\x56\x24\x93\x0d\x69\x4c\x31\x06\x6b\x54\x96\xd1\x70\xdc\x8b\xb9\xfc\x87\x45\xb3\x32\x9f\xc8\x39\x8f\xd2\xf4\x12\xcf\x49\xb0\x5a\x73\xfa\xde\xab\x18\xe3\x9b\xdf\x0e\xa0\xb1\x08\xf0\x69\x8a\x96\xb3\x0e\xac\x3e\x83\xc0\x92\x1f\xaf\x20\xe4\x49\x12\xbe\x16\x7c\x54\xf9\xa6\xf4\x79\xf8\x0d\x36\x5e\xba\x73\x35\x9d\x2e\xda\xec\x18\xd1\x39\xe3\x97\x3b\xe8\x10\xd1\x56\xe7\x32\xec\x80\x75\x91\xec\x5c\xf3\x61\xd3\x6d\x17\xbe\x1c\x8e\x9a\x54\x23\x46\xfd\x11\x70\x14\x8e\xa5\x2e\xd8\xa6\x69\xc7\x06\x44\x23\x8a\xe3\x1a\x34\xa2\x38\xc6\x38\x04\xd0\x90\x8b\x8d\xa1\x10\xe9\x89\xe6\xd7\x57\xb4\x32\x74\xa3\x65\x8a\x66\x66\x20\xe6\xf4\xa7\xc3\xc4\x26\xcd\x18\x11\x05\x47\x4e\xb0\xbe\xf7\x9d\x7e\xcb\xb5\xc3\xd5\x60\xaa\x11\x78\xd1\xd5\x2d\x58\xfc\xf0\xfb\x9a\xf9\x06\x44\x85\x6f\x48\x51\x97\xa4\xaa\x2d\x65\x58\xd2\xd1\x41\xc8\x03\x14\xc5\x4b\x66\x0d\x51\xb1\xf0\x73\xa7\xd7\x90\xde\xa5\xbc\x67\x8d\x8d\x81\x71\x14\xe5\x8d\x59\xf5\xde\x1e\x5b\x6b\x61\xed\x2e\x2e\xba\x26\x89\x03\xe6\x42\xdb\xd8\x07\xca\x57\x5c\x21\xa5\x8a\x5b\x04\x4d\x31\x4d\x93\x21\x6f\x2a\xa3\xef\x35\x57\x41\x4b\x69\x57\x4b\xaf\x59\x36\x97\x62\xba\xf8\x73\x69\x66\x79\x65\x4f\xf1\x8a\xe3\xbc\xae\x04\xeb\xe4\x34\xcb\x0b\x4f\xae\x96\x77\x88\x3c\xb5\x86\xe2\x70\x41\xd4\x27\x07\x91\xdb\x5b\x4d\xf5\xde\xdf\x70\xd6\xfb\x0e\x1b\x46\xd9\x1f\x8d\x12\xec\xc0\xd5\xb4\x95\xb9\x19\x4f\xa3\xe2\xc3\xe4\x3b\xbf\x07\xe7\xd1\x09\x74\x5c\x9d\x39\x1a\xda\x68\x1e\x1f\x54\xb9\xa7\x8b\x5b\x70\xd3\x8f\x10\x53\x9d\x30\x74\x8f\xd2\xef\xa7\xde\xc6\x55\xcd\x73\x68\x66\x87\x5a\x60\x41\xb3\x27\x8e\x1f\x92\x43\xbc\xdd\x15\x3c\xd6\x83\xb7\x24\x0f\xd2\x17\x68\x6f\xd5\xf7\xfd\xaf\xab\xf4\x6d\x5f\xa5\x83\x53\x3a\x4c\xf3\x0c\x55\x37\x9a\x60\x89\x38\x1c\x08\x5e\x9c\x2b\xe1\x37\xa8\xfa\x07\xbf\xef\x2a\xf8\x3c\xb1\x8e\xc2\x7d\x25\xd9\xce\xb5\xcf\x77\x2e\x97\x34\x3d\x8b\xa1\x00\xde\xd6\xcc\xd5\xff\x08\xf3\x34\x61\x56\x1b\xa5\x42\x30\xa9\xdd\x67\x82\x17\x8c\x67\xb1\x60\xb3\x29\x2a\x21\xca\x31\x9f\xb0\xc1\x25\x8b\x86\xc3\x24\xe6\x19\x24\x93\x42\xb1\xfb\x32\x05\x6b\x2c\xd4\xe1\x9b\xa0\x16\x48\x72\xa7\x27\xf5\x9c\x8c\x37\x63\x79\x85\x3a\x4a\x26\xd3\x94\xbf\x9e\xa5\x5c\xa7\x38\xc2\xb7\xe0\x23\x6c\x53\x4f\xb1\xee\x62\xb9\xbb\x3f\x8e\xd2\x78\x2f\x3a\x2d\x92\x37\x6f\xed\x87\xed\x94\xa9\xf4\xda\xc1\xb2\x8a\xda\xc0\x1d\xaa\xcd\x12\xa2\x87\x8b\xb9\x52\xe5\x38\x9f\xe5\x59\xf9\x2c\x1a\x9a\x91\x52\x67\x06\x44\xd7\x25\x5c\x77\x12\x4d\x9b\x76\xe2\x5a\x3e\x21\x09\x07\xe3\x0d\xbc\xcb\xc8\x37\x01\x79\x66\x93\xc9\x64\x56\xa2\xab\xb2\xc8\xd9\x05\x57\xaf\xfb\x19\x07\x09\x7a\x45\x05\xe3\x9c\x5e\x62\x5a\x2d\x85\x14\x1c\x45\x0e\xcb\x3b\xe7\x51\x08\x57\xc0\x4d\xbd\xed\xe8\x79\x43\xbd\x83\xb9\x24\x43\xc6\x41\xad\x04\xa2\x5a\x23\x47\x03\x74\x2c\xc1\x88\xad\x5e\xf3\x06\x9a\x9f\x56\x4d\xaa\x4d\x8d\x23\xf6\xe5\xec\x0f\x9e\x96\x65\x98\x67\x65\x92\xb9\x69\x3f\x2b\xb5\x8d\x42\x88\xea\x46\x34\x54\x20\x06\xff\x83\x9b\x99\xbc\x2e\x17\x64\xfb\xc1\x83\x90\x8d\xd7\xcd\xac\xfd\x7c\x1b\xaf\xda\xc4\x87\xb6\x6d\x8c\xb5\xd0\x56\x49\x2e\xa0\x95\xdb\x7a\x92\xc8\x33\xc8\xa0\x5c\x4b\x80\x87\x15\xd0\x79\x3b\xb7\x86\xf9\x8a\xbb\x76\x91\xe7\xe5\x2e\xeb\xdd\xd3\xe1\x4e\x2e\x92\x2c\xce\x2f\xd0\x70\x8d\x9a\xec\xf0\x74\x84\x76\x3a\x96\xd5\x95\x77\x47\x9e\x97\xca\x65\x72\x77\xc5\xd3\x44\xe6\x23\xdd\xde\xbc\xaa\x08\x12\xaa\xac\x70\x9a\x57\x19\x41\xdc\xca\x85\x0e\x9d\xa7\x60\x70\xde\x0d\x0c\x29\x31\x96\xbd\x0d\x22\xca\x35\x5a\x4d\xcc\x5a\xe1\x78\x62\xe0\xdb\x89\x9e\x44\x67\x2f\x92\x8d\xd9\x14\x3e\xee\xa9\xaf\xdd\x2f\x6e\x98\xa1\x73\xb3\xdf\x0a\x17\xf4\x1f\x6c\xb6\xd4\xe2\x09\x24\xf1\x7c\xf0\x1f\xcd\x72\xf4\x5d\x4d\x92\x23\x97\x42\x28\x46\xd9\x7d\xfe\x95\xa2\x31\x11\x1c\xea\x40\x90\xf2\xd8\x53\x61\x48\x0d\x3f\xde\x6a\x81\x0f\xa6\xba\x8b\xbf\x76\x57\x56\xbe\x23\xec\xf5\x36\x98\xe5\x1c\xda\x03\x30\x55\xde\xcd\xad\x38\x05\x65\xdf\x19\xa6\xa8\x42\xec\xae\x7c\xf7\x9d\xe1\xb3\x00\x68\xb3\x61\x61\xe5\xfd\xe8\xbb\xef\xbe\xab\x36\x42\xf8\xe6\xbb\xef\xae\x56\x68\x83\xa6\xbd\xc6\x0f\x3f\x90\x96\x76\x57\xbe\xbb\x5a\x59\xf9\x2e\xe0\xf3\xe3\x31\xc4\xcd\x6c\x88\x3f\x63\xf3\x9d\x16\xf9\x90\x0b\x71\x9b\xbb\xee\x17\xd2\x81\x42\x95\xb9\x51\x9f\xfa\x0f\xb6\x3c\xc0\x79\x4d\x23\xc4\x57\xdc\xcb\xf7\x8f\xc0\xeb\x55\x61\x46\x4d\x09\xf6\x8f\x8e\x14\xde\x3c\x3b\x47\xd5\xbf\x9c\x94\x2e\xcf\xce\xbb\x2f\x0f\x9f\x1e\xbc\x3d\x78\xf9\x6b\xdd\xbd\x85\x3e\xd8\x15\x46\x64\xff\xcd\x93\xe2\x18\x17\xc3\x68\xca\x59\x52\xaa\xe8\x2d\x2a\xb5\x68\x9b\x0d\xf8\x30\x92\x6c\x73\xc1\x41\x18\xcc\xf2\x92\xcd\x84\x9c\x3e\x29\xd8\x37\x04\x36\x97\x64\xd3\x59\x09\x62\x9a\xe0\x29\xa4\xe5\x15\x6d\x5d\xe3\x14\xdf\xda\x21\x83\xb7\x29\x06\x13\xd0\x94\x97\x1c\x94\xa8\x2a\x96\xe9\x39\x2e\x65\xdb\x3b\x8d\x7c\x57\xd8\x28\x22\x92\x50\x9f\x3e\x31\xf9\x6f\x17\xf1\xd6\x72\xd9\x62\x05\xc8\xf1\xff\x1c\x1d\x9d\x30\x5b\x93\x4d\xf3\x14\x65\x80\x24\x63\x4f\x0f\x7e\x95\xa7\x0d\x24\xfe\x52\x6c\xa3\x72\x11\x27\x82\x0d\x8a\xfc\x42\xf0\xa2\x0d\x89\x97\x1a\x90\x7f\x8b\xe5\xb3\x32\xe4\xc9\x39\x89\xca\x71\x12\x89\xc1\x65\xc6\x33\xd1\xb3\x9d\x35\x5c\x1f\x47\x18\x94\x2b\xf2\x59\x58\x98\x2e\xd8\x03\xbe\x40\x76\xe8\x87\xb7\x69\xa8\xff\xd7\x93\xda\x5f\x4f\x6a\x7f\x3d\xa9\xfd\xbf\xf5\xa4\x26\x09\xf6\x2a\x9d\x9d\x26\x99\x31\x74\x9b\xf7\xaa\xe5\x81\x2e\x78\xd7\xf2\xa0\x9d\x97\xad\x71\x9e\x9f\x09\x12\x7c\x3a\xcf\x30\xd8\xc6\x6b\xf0\xf3\x3a\x3e\x69\x9b\xef\xaf\xf0\x10\xac\x2d\x80\xab\x73\xb8\x04\x6d\xaf\x68\xc9\x3e\x84\xd9\xfe\x15\xb7\x25\x5a\xf0\xcb\x34\x86\x7c\xa8\xc7\x27\xfa\xb9\x05\x5e\x1b\xf1\xbf\x7b\x4c\x0e\x8d\xbd\xa3\x48\xbe\x63\x38\x04\x92\xf0\x36\x32\xf9\x5d\x92\x91\xfa\x86\x39\xcd\x23\x80\xed\x9a\xe6\x7a\xa8\x22\x08\x3f\xd5\x79\x54\xf3\x1e\xeb\x28\x0a\x35\xef\x14\x14\xa4\x99\x41\xb2\xf8\x98\x0f\xd3\xb6\x36\x9d\x6b\x51\x5f\xc1\xca\x0e\x6a\x67\xa7\x4b\x1b\xf2\xf6\x54\xc7\x02\xa5\x98\xe1\x16\x16\xae\x79\x9c\x9c\x04\xb1\x70\x9f\x07\x0a\xb8\xf2\x6b\xc1\x78\x96\x72\xff\x0d\xc2\x4b\x59\x68\x2c\x4e\xcc\x34\xd9\x49\x22\x1c\xa3\x66\x49\x91\x5e\x5e\x97\x2b\x8f\x08\x0e\x7c\x2d\x49\x09\x8c\xc2\xf5\xe3\x8a\x8b\x7d\x37\x11\x0a\xc8\xba\x97\x86\x9e\xcb\x00\x56\x11\xa1\xab\x1e\xa4\x96\x9d\x0f\x82\x45\xdd\x84\xd4\xc1\xcb\x69\x28\xe0\xd8\x77\x1f\x20\x8d\x0f\x40\xaf\xc7\xbe\x7f\x96\xe6\x17\xcf\x92\x0f\x2f\xb8\x3f\x36\xa5\x88\x83\xc6\xdd\x95\x47\xca\xdb\xcc\xed\x40\xcf\x9c\x47\x1c\x27\x6f\xc7\xc2\x59\x84\x4e\xae\x33\x8d\x50\x61\xd1\x3c\x12\xf5\xb6\x8b\xb5\xf3\xae\x97\xf1\x0f\xa5\xd6\x50\x5a\xd5\xe5\x75\x66\x0a\x6a\xd7\x4d\x15\x6d\xbe\xb6\x32\x2c\x1f\x0d\xe8\x53\x58\xb7\x14\x9a\x3b\x45\x78\xa5\x0a\xb7\x9d\xf9\xaf\x6a\x8b\xe8\x2f\xbb\xba\x16\xfd\x65\x85\x85\xf4\x97\x40\x4d\x8f\xe4\x4b\x13\x15\x9e\x8e\xaf\xc1\xff\x50\x41\x12\xd2\x67\xfd\xf9\x14\xc0\x33\x61\xa9\xb1\x23\x68\xed\xa8\xb1\xb8\x19\x47\x65\x54\xc3\x6e\x0b\xc7\x8e\x4d\x2c\x35\x6a\x04\x95\xe3\xad\x76\xb8\xec\xd8\xc9\x41\xb9\x14\x01\x08\x7c\xfd\xb1\x64\x61\x9a\xca\x79\x41\x4a\xe2\x88\xa0\xbb\xf2\xa6\x7a\xb3\xf8\x55\x29\xfc\x1d\x4b\xca\xc5\xe7\x96\xed\xa9\x8e\x62\x95\x1e\xea\x1a\x90\x74\x74\x81\x1d\xb4\x6b\xce\x29\xb7\x46\xdd\x5e\x87\x87\x3c\x2f\x58\xc4\xa6\x70\xec\x6b\x22\xb3\xe7\x23\x4b\xb9\x44\xb0\x69\x24\xdb\x6a\xc3\xbd\x1d\x6c\x7e\xc7\x79\x51\x0e\xd5\x5d\xfc\xdd\x47\x67\xa7\xbf\x7a\x37\x6f\xaa\x66\xa2\xd6\xbe\x41\xf0\x26\x62\x11\x60\x4b\xfd\x22\xe3\x03\x90\xc7\x7d\xa0\x1d\xbe\x74\xb4\x98\xff\x05\xed\x59\xb0\xb6\x82\xd9\x05\x6d\xd9\xb2\x57\xf9\x5f\x54\x4e\x63\xd9\x26\x5b\xfd\xbb\x58\xed\x36\xda\x80\x55\xc8\x4c\xc0\x7d\xcf\xf7\x24\xaa\xb9\x2f\xfa\x15\x58\xff\x46\xfd\x4d\x7a\xb6\xd9\x67\xd1\xda\x07\xea\xad\x00\xf0\xbc\x2b\x92\x85\x32\x15\x7f\xe2\x97\xa3\x22\x9a\x70\x31\xb7\xa3\xed\x30\xfc\xbc\xbe\x1c\x40\x53\x7d\x3f\xcf\xe2\x44\x92\x37\x4a\xe7\x76\xf8\xa0\xae\xc6\xbc\x2e\x3d\x50\xd3\x04\x7d\x78\xad\xed\xf1\x61\x10\x7c\x5e\x77\x14\xce\x54\xfe\x35\xe1\x17\x72\xa2\xe7\xf6\xf5\x28\x08\x3e\xaf\x2f\x0a\xf7\x15\xd5\x9a\x70\x05\xe4\xfa\x4e\xd7\xf8\x61\x38\x8e\x0a\xc1\x25\x1c\xe5\x38\xb2\xda\xda\x00\x96\x4c\x24\xae\x8b\xa0\xe4\x42\x17\xd3\x68\xc8\x17\x01\x9e\x69\x56\x92\x80\x2e\x03\x56\x60\x27\x3c\x4e\x22\x09\xe7\xf3\x4d\x05\x52\xe0\x33\xba\x58\x0a\x78\x94\x67\x65\x67\xa4\x70\x75\x18\xa4\x02\x7a\xae\xa6\x4a\x42\x3a\xd3\x5b\x81\xec\x4c\x44\x67\x19\x68\x78\xf7\xc7\x03\xe6\x1e\xd3\xee\x4f\x6a\xd7\x16\xca\x34\xf6\x22\x49\x53\xe5\x6e\x24\x8f\x1e\xf9\x63\x96\x72\x3c\xe0\xef\xf5\x56\xae\x6a\x5e\x80\x68\x92\x74\x35\xd9\x2d\xb0\x3b\x08\x24\x1c\x24\xc1\x95\xde\x8b\x29\x2f\x46\xa0\x2f\x05\xfb\xae\x7c\xd4\x39\x17\x1d\x31\x1b\x88\xb2\x90\x7f\x15\xfc\x94\x7f\xe8\x44\x65\xa7\x1c\xf3\xce\x80\x9f\x26\x99\x3c\x0a\x3a\x1b\x26\xc6\x9a\x8a\xbb\xfe\x9a\x9f\x1e\x7c\x98\x36\x1b\xff\xb7\xc1\xee\x33\x9a\x92\x95\x5e\x36\xa9\xf2\x62\xd9\x7b\xb0\x79\x8d\xe9\x96\x5c\x94\x00\xd9\x62\x8f\xa1\x4f\x35\x4c\xf0\x82\x08\x37\xb1\x63\x93\xe8\x93\x68\x6e\x1f\x3d\x7d\x86\x83\xa2\xce\xd0\xee\x1d\x2c\xdf\xa4\x33\x1f\xdc\x18\xe6\xec\x4f\x90\xe6\xdc\x03\x9d\x7b\xaa\x68\x20\x4f\x19\x3c\xa7\x8b\xfe\x7a\x3f\x00\x3c\xaf\x13\x0b\x15\x34\xca\xfa\xef\xb6\xe1\xaa\xf5\x9c\x74\x39\xee\xda\xab\x00\x55\x8e\xf3\xad\x79\x64\x45\x6b\xcc\x43\x9c\xb7\x7a\x3d\xb6\x1f\x89\x92\xbd\x93\x10\xef\x58\x99\xb3\x77\xb6\x8d\x77\x6d\x26\x12\x50\x63\x96\x4a\x8e\x85\xd0\x3c\x60\x9f\x77\x3a\x8b\x8a\xb8\x6b\xcc\x7b\xe0\xb2\xfa\x3d\xe8\xdf\x87\xba\x6d\xa2\x61\x02\xf4\x08\x0f\x38\xc8\xe1\xd8\x3e\x5e\x51\x0d\x93\x46\xee\xcd\xe1\xd3\x43\x8b\xa8\xbc\xe1\x88\xb2\xe0\xd1\xa4\x2b\xb7\xa1\x61\x91\x0c\x78\xb3\xf5\x4e\x8d\x0b\xc4\x6b\xfc\x3c\xc5\xa7\x31\xdc\x35\xc5\x38\x9f\xa5\x31\x1b\x70\xb9\x18\xd3\x64\x98\x94\xe9\xa5\x6e\x73\x96\x99\x86\x62\x0c\xf5\x70\x31\xe6\x19\xbb\xe0\x4c\x0a\xad\xf8\xae\x84\xfa\x9f\x44\xb0\x2c\x67\x69\x9e\x9d\xf2\x02\x1e\xe5\xb8\x1a\x3e\x0e\x9d\x20\xe4\x79\xe0\x05\x64\x72\x79\x0b\xa9\x58\x49\x99\x8b\xbf\x2c\x6d\xe2\x45\x05\xad\xa5\xe4\xdf\x27\x81\xb4\x8b\xce\x26\xa8\x34\x6f\x90\x13\xce\xd3\xbd\x2e\xa1\x0d\x43\x26\x82\xd9\x22\x3a\x6b\xb2\x35\xd0\x19\x73\x95\x64\x66\xfa\xd5\x56\x60\x75\x80\xa6\x44\x6b\x61\x5e\x1b\xbd\x06\x61\x91\xb7\x69\x9e\x4f\xe9\xf6\x0f\x1f\x80\x00\x73\x9c\x08\x91\x28\x8e\x8d\xf9\x82\x35\xa0\xcd\xc5\x14\xc1\x1a\xda\xec\xcb\x64\xc7\x50\x09\x6c\x03\xcd\x43\x55\x32\xc3\xae\x26\x88\x10\x18\x52\xb1\xc8\xff\xf9\x95\xe6\x97\xc4\xff\x2c\x05\xc8\x04\x5b\xd8\x80\x7f\x9e\x8e\xf9\xe6\x3b\x5a\xd6\xb0\x0f\x10\xb3\x00\x55\x25\x21\xa1\xe3\xf1\x80\xc5\x90\xe1\x43\x8f\xbe\x15\xb0\x7f\xbb\x0a\x58\x36\x3c\xfc\x26\xdd\x8b\x25\x3d\x7f\x4e\x44\x5d\x30\xb5\x47\xfd\x0a\xe4\xbc\x53\x41\xc3\x7c\xc5\x53\xf4\x8c\x0f\xa2\xc1\x3e\xe6\x2c\x0a\x1a\x26\x3d\xdc\xac\xc2\xce\xeb\xc2\x00\x7d\xbd\x83\xfa\x2b\x1c\x9e\xbd\x1e\x7b\xa2\xcc\x94\x58\xc1\xa7\x69\x34\xe4\x13\xb0\x4c\x06\x15\x47\x7e\xc1\xf6\xd8\xd3\xa8\xe4\xdd\x2c\xbf\x68\xea\xe0\x9b\x19\x2c\x2c\xf1\x52\xde\x6c\x1a\xfa\x97\x94\x41\xb3\xfc\x42\x83\xc0\x84\x68\x08\x54\x40\xb3\xfb\xec\xfe\x7d\x00\xf9\xa2\x47\xb6\xb2\x91\x92\xe5\x68\x80\x47\x0c\xa4\x2a\x4f\x26\x37\x39\x4a\xf5\xb9\x72\x6c\x46\x7b\x62\xce\xe9\x85\x07\x88\x7a\xa3\x5b\x42\x0f\x4f\x8d\x7d\x47\x19\xf1\x48\x5e\x66\xdb\x5a\xb0\xb5\x3b\xe6\xc1\x3e\xb1\xdc\xed\x6b\xde\x36\x3e\xca\x8e\x81\x7a\x76\x1d\x39\xc4\x83\xed\xd2\x73\xfe\xbe\x32\xe4\x73\x4e\x36\x45\x4f\xcd\x60\x60\xc6\x93\x79\xa6\x23\x97\x0e\x3d\xf5\x33\xe5\x3c\xdd\x32\xc9\xdd\xf5\x5c\xa9\x0b\xe1\x7e\xa7\xa3\x00\xf0\x02\x3d\x26\x25\x45\x79\xf7\xb4\xcb\xbc\x1b\x6d\xd7\x30\x17\xc8\x11\x58\x97\x1e\xe7\x66\x0f\xa4\xe3\xb6\xde\x36\xa6\x52\x77\x66\x51\xf3\x3c\xb1\x28\x59\x3e\x53\x68\xa8\x92\xd4\x8c\x7a\x24\x25\xaf\x71\x74\xce\x59\x24\x99\x48\x79\x2a\x4c\xa2\xa9\x55\xa0\x42\x45\x70\x53\xa8\xc6\x44\x20\xa3\xa7\xb3\x33\x47\x02\xab\x07\xad\x0a\x63\x3e\x2c\x32\x17\x12\x29\xac\x9e\xaf\x0e\x92\xec\x3a\xaa\x80\x2c\xcb\x1a\x42\xa0\x08\xa5\x47\xdb\x06\x19\x9c\x67\x65\x52\x70\xec\x20\x11\x2c\xbe\xcc\xa2\x49\x32\x84\x37\x6d\x04\xc7\xf7\x6c\xdd\x1e\x28\x0e\x06\xdc\xbe\x6d\x83\xa8\x0b\x11\x26\x74\xbb\x96\x7c\x0a\x21\xcf\x5d\x53\xa1\xac\x0a\x5d\xd6\x30\x64\x7d\xbb\x84\x64\xfb\x96\x8a\xb6\x6f\x83\xb2\x6d\x9d\x08\xf2\x8d\xc5\x19\x40\x2d\xc7\xe9\xc1\x07\x29\xbe\xf6\x9a\xc7\x4f\x3a\xff\xe7\xa4\xd5\x3b\xd5\x05\x70\x4a\x51\xc1\x56\x7d\xb2\x76\x7e\x6a\xaf\x58\xed\xac\xb2\xfb\x12\xb3\x6e\x99\xff\x9c\x5f\xf0\x62\x5f\x65\xaa\xa3\xbe\x4e\x26\xe4\x6e\x8d\xcd\xa0\x35\x59\xeb\xea\x7e\x10\xb7\xb6\xee\x37\x18\xbb\xe1\xe1\x37\xe9\xea\xf6\x97\xa1\xd9\x5f\x86\x66\xdf\x8c\xa1\x19\x54\x31\xee\xea\x61\xbb\xe5\x6d\x0f\x70\x5e\xd3\x08\xf1\x15\xef\x18\xff\xad\x36\xd7\xdf\xb0\xf9\x9d\x8a\x68\xf1\x2f\x5e\x9a\x03\x7a\xaa\xc3\x13\x42\xcc\x09\xea\xd1\x8c\x27\xe6\x10\xd5\x2e\xb8\x3d\xe1\x9e\x0d\x31\x47\xa9\xd4\xa8\x60\x50\x47\xa2\xa2\x10\x43\xa3\xf8\xf6\xae\x2e\xf4\x34\x48\x68\x51\x50\xa9\xf1\x80\x4d\xa2\x4b\x35\xb6\x64\x64\x50\x92\x22\xc2\x0c\x9f\x61\xbb\xb4\xbb\x46\x03\x2d\xd9\x48\x88\x8e\xc5\x03\x12\xc1\x01\xd9\xc8\x88\xce\xb8\xdc\x01\x09\x3b\xa0\x26\xad\x74\x8b\x43\x32\x19\x41\xaf\xec\x99\x88\x46\x4b\xd6\x88\x5f\x62\xa4\x03\xdd\xc9\x8e\x8e\xde\xfc\xfe\xf3\xc1\xdb\xd7\xbf\xfc\x7c\xb0\xc3\xfa\x52\x5c\xff\xe9\xe0\xf7\x67\xaf\x9f\xbc\x38\x38\x52\x1f\x1f\x78\x8f\x33\x25\xc8\x60\xfb\x47\x47\x0c\xd6\xed\x19\xbf\xd4\x4f\x30\x2b\x57\xbb\xe7\x18\x57\xfa\x27\x1e\x32\xc8\x24\x71\x9f\x3c\x00\xfb\x55\x12\xf6\x0d\xff\xe0\x24\x20\x54\x99\x82\xfc\x5c\x24\xec\x9f\xac\x2f\xd7\x15\x4d\xda\xe0\xe6\x5b\x60\x8f\xdd\xc2\x1d\x9d\x03\xc1\x72\x9c\xec\xab\x8b\xcf\x3a\x4d\xd9\x4f\xdb\x7c\xd4\xc1\x10\x1a\x1f\x1b\x2d\xd6\x61\x7d\x9d\xea\x27\x94\x45\x51\xcd\xb4\x93\x75\x48\x4d\xbe\x09\x9a\x45\x69\xdf\xb5\x54\x6f\x55\xd8\x5f\x39\x21\x48\x24\x76\x97\x6c\xce\x9d\x33\xcf\x1c\x2c\x9a\xc8\xdd\x55\x37\x20\x7f\x3a\x6a\x31\x7c\x39\xd2\x8b\xc2\x3e\x45\x82\x27\x81\x03\xdd\xeb\xb1\x37\x63\x5e\x70\xa5\x0e\x2e\x74\x73\xe8\x84\x20\xaf\x66\x69\x9a\x5f\xc8\x43\x48\x79\x23\x88\x1d\x5b\xb3\x23\xb9\xf9\x11\xfd\x7d\x14\x8d\xa2\x22\x61\x0f\xba\xfd\xee\x43\xfa\xfd\x45\x3e\x48\x52\xae\x8b\x1f\x75\xd7\xba\x6b\x64\x38\x6a\x7a\xc8\x88\xd4\x17\x3f\xe2\x48\xe3\x07\x39\x80\x2a\x67\x05\x66\xd8\x3e\xbf\xb6\x5a\xae\xd1\x4b\x8f\x5e\x33\x85\xb3\xd8\xdc\x96\x29\x26\x26\x29\x54\xb3\xb5\xeb\x6c\x2e\x92\x48\x7a\x7a\x03\x1b\x8b\x2a\xb1\x7b\x0b\x65\x05\x9c\xd4\x10\x93\xa0\x83\x24\xe1\x19\x7c\xc9\x7c\x4d\xf6\x04\x39\xd1\x82\x97\x25\x2f\xd8\x45\x24\xc0\x4d\x46\xcc\x86\x43\x2e\xc4\x68\x96\x76\x11\x7e\x7f\x56\x14\x3c\x2b\xd3\x4b\x76\x91\x17\x67\xe8\x22\x3f\x2e\xf2\x09\x87\xb8\x7c\xdd\x95\xea\x3e\xed\xe0\xb0\xe7\x63\xe1\x1c\x14\x02\xc6\xfe\x6e\xcc\xa3\xf8\x1d\xe3\x29\xe8\xaf\xd8\x6c\x9a\x2b\xc6\x49\x0a\xa1\x4f\x9e\x2c\x66\xc3\x68\x38\x96\x97\xf7\xd2\x46\x30\x3a\xe5\xe5\xbf\x79\x14\xd7\x6c\x2a\x63\x2c\x82\xd8\xd5\x6b\xbb\xa1\x05\xea\xa8\xfa\x25\x78\x4b\x57\x8a\xf3\x21\x6c\x10\x5d\xf8\xfd\xe9\x93\xfd\x70\xca\xcb\x03\xc4\x54\xfc\x78\xf9\x26\x3a\x7d\x19\x4d\x78\xb3\x21\xc1\x1a\xad\xe3\x35\x37\x77\x91\xfc\x1a\x9a\x75\x18\x7a\x24\x2f\xf1\x2c\x1f\xe1\x8d\x15\x32\x5f\xb3\x0b\x58\x48\x72\xf0\x74\x53\x8f\x32\x36\xcb\xd0\xc3\x26\x86\x90\x82\x92\x1c\x70\x4c\x40\xe4\x27\xd9\xd4\x34\x2f\xe5\xfd\x37\x4a\xd3\x4b\xa6\x21\xf3\x8c\x43\xba\x09\x54\x9c\xcc\x04\x3a\x4d\x41\xf8\x82\x64\x74\x09\x7b\x35\xea\x43\x64\x73\xb2\xcf\x61\x5e\x14\x5c\x4c\x25\x6b\x67\xa7\xec\x7f\x74\x79\x97\x3d\x01\x1c\x54\xcd\x84\x17\xb2\x55\x79\x91\xd8\x3f\x3a\xb2\xa2\xda\x05\x67\x59\x5e\x4c\x00\x05\x79\x05\x7a\x47\x27\xfe\x5d\x97\xbd\x19\xe7\xb3\xd3\xb1\xa4\xb5\x4e\x56\x68\x3d\xab\x4a\xfe\x01\xa2\x58\x29\xad\x8e\x30\x63\x18\xe6\x31\x67\xd3\x3c\xc9\x4a\x81\xfa\x9d\x77\x3b\x59\x5e\x36\xff\xf6\xc7\x1f\xeb\x6b\xad\x77\x6d\x89\xc1\xe1\x0b\xbc\xcb\x0f\xf3\xc9\x54\xee\x10\x09\x04\x84\x51\x70\xac\xf5\x4e\xb6\x0b\x4a\x80\xdc\x0c\xb9\x21\x3c\xec\xd8\x05\x38\x96\x4d\xe0\xb8\xd5\x03\x77\x16\xa5\x6c\x45\x5b\x01\x5c\x5c\x5c\x74\x2f\x36\xba\x79\x71\xda\x7b\x2e\x05\xbd\x2c\xc2\x9d\xa0\xf7\xbf\x33\x2e\x40\xc7\xd8\xfb\xdf\xa8\x83\x43\x10\x7f\x1b\x0a\xa1\xfe\xa4\x7c\xfb\x8b\x9e\xd0\x9f\xf8\xa5\x78\x11\x4d\x6b\x78\x58\xeb\x18\x2c\x13\xab\xb8\x17\x10\x6b\x08\xec\x8f\xd5\xf1\x1e\xe2\x6f\x98\x3e\x2f\xa3\x11\x51\x43\x86\x53\xfa\x8d\xa2\x21\x1f\xe4\xf9\x59\x6f\x94\xe6\x17\xbd\x44\x88\x19\x17\xbd\xf5\xed\x47\xdb\x76\xa9\x28\x55\x86\x46\xce\xac\x0d\xbc\xa3\xaa\xe5\xd1\x6c\x40\xb9\xf6\x1f\x0b\x5d\x3c\x91\xbd\x82\x46\x8d\x44\xbd\x0b\x50\x24\xa4\xfe\x35\x75\x6c\xbe\x32\xf4\x3c\xb2\x1e\x7f\xda\x84\x5d\xff\xde\xb5\x27\xce\x61\x26\xf9\x58\xcd\x92\xad\x00\x99\x21\x90\xeb\x92\x91\xe4\x35\xc3\xb2\x11\x1b\x44\xc3\x33\x26\xd2\x48\x8c\xbb\xf4\x28\x35\x75\xef\xde\xb5\x2c\x65\x4e\x99\x3f\xfe\x68\xb4\x4c\xc0\x2d\x27\x88\xd2\xcf\xd1\x9f\x89\x5c\x4c\x18\x57\x0a\x5f\x61\xe9\x2b\xab\xa1\x85\x65\x07\xf7\x79\x4d\x6d\x8f\xcd\x56\x37\x9a\x4e\x79\x16\xef\x8f\x93\x34\x36\x11\x42\x2c\x9c\xc3\x4e\xd6\x9c\x9d\x39\xf1\xf5\x51\x5c\x95\x0b\x15\xb2\xc7\x64\xf4\x80\x61\xf7\x59\x83\x7d\xbc\x6a\xd8\x7a\x78\xef\xa3\x0f\x9d\x34\x58\x19\x33\x0e\x04\x6f\x95\x14\xec\xb8\x0e\x28\xb2\xb9\x46\xc5\xe4\xa4\x7f\x0d\xbb\x96\x0a\x67\xd6\xd5\x1f\x48\x75\x47\x38\x12\x2d\xc9\xf6\xc7\xfa\xd7\xf1\xda\x89\x73\x46\x9d\x68\x1e\x38\xe3\x97\xf5\x01\x41\x99\xc9\x6a\x5a\x25\xb5\x25\x33\xc6\x4a\x0e\x91\x39\xb4\x62\x99\x9f\xbc\x6a\x12\x4d\x43\xa7\xc5\xb3\xc4\x44\xf4\xe3\x3a\xe4\x15\x68\x7b\x23\x15\x9a\x8d\x8d\x93\xd3\x31\x64\x0f\x8a\xf0\xe4\x54\x96\x09\xea\x00\x20\xf2\xc4\x28\xc9\xe2\x7f\x03\x30\x1a\xad\x17\xc6\x31\xc7\x79\x8e\x09\xae\x55\x05\x1a\x5a\xae\x8e\x4b\x88\x82\x33\x0b\xd6\xcc\x65\xd7\x8c\x41\x2e\x04\xf8\xa2\x5d\x47\x70\x18\xff\x64\xee\xef\x00\x98\xe0\x85\xfc\xf3\x95\x3c\x11\x40\xba\x08\x17\x55\xe2\x65\xf9\xc1\xd2\x56\x3c\x27\x9c\xab\xc5\xd4\x96\x84\x05\x42\x8b\x12\xc9\x5e\x47\x5b\x51\x2e\x4f\x5c\x8f\xaa\x10\x02\x8f\x25\xec\x9f\x48\xf6\x4e\xe7\x16\x29\xfc\xb5\x48\x27\x0f\x62\x10\xe4\x80\x6a\xab\xef\x85\x58\x95\xfb\x74\x12\x87\x98\x71\x1f\x61\x5f\xe6\x31\x6f\x96\x46\x9e\x25\xd2\x9b\x59\x5c\xbb\x35\x7c\x29\xe1\xba\x90\xd5\x4a\x36\x12\x3c\x4d\xf0\x41\x34\x96\x5b\x91\x07\xed\x90\x50\x82\x74\xe5\xff\xbc\xd1\xb7\xa9\x87\x92\x8e\xe6\x33\x9a\xe0\x97\x45\x32\x69\x62\x84\x9d\x92\xdc\x48\x2d\x51\xf2\x98\x5f\x87\x5a\x80\xd8\x80\x8f\xf2\x82\x6b\x93\x46\xce\x86\xb0\xb4\xe5\xb4\xe0\xed\x00\xa6\xb2\x4a\xbd\x57\x05\x3f\x07\xd2\x39\x0c\xa6\x74\xf0\xda\x01\x52\xab\xdf\x42\x71\xfe\x77\x57\xb4\x83\xba\xcf\x88\x24\x22\x9e\xbc\xe0\x15\x97\x20\x3b\x22\x4a\x0a\x5b\x89\x59\x26\xa5\x7c\xb5\xfd\x68\x2c\x3d\x76\x5d\xbc\xe7\x78\x5c\xdc\x72\x38\xaf\x5b\xf0\x2c\xe6\x05\x2f\xba\xea\x82\x60\x9f\x84\x0e\xcb\x31\x2f\x2e\x12\xc1\x35\x62\xd1\xa8\x54\x49\xd4\xd2\x48\x94\x66\x15\x2b\xa3\x24\x1f\x9f\xfa\x75\x7a\x3d\x84\xba\x92\x08\x4a\xe8\x39\x4a\x06\x69\x92\x9d\xd2\x80\x58\x8a\x76\x23\x77\x71\xc0\xf3\xc3\x38\x4f\x63\x5e\xa0\x87\xa5\x9a\xaf\x44\x60\x48\x32\x1d\x12\xcc\x5f\xb7\x35\xab\xd6\x04\x1a\xf0\xe0\x6d\x34\xba\xc0\x06\x40\x12\x60\x99\x59\xd3\xf8\xed\x55\x96\xa7\xb7\x4d\x10\x25\x04\x02\x59\x95\x05\xfe\x06\xb2\x10\x7a\xe8\x57\x3c\x08\xae\x06\xe9\xd0\x47\x09\xc7\x8b\x85\x6e\x19\x25\x7d\x90\xd6\xa5\x64\x15\x49\x99\x7c\xc0\xd9\x28\x9f\x65\xb1\x56\x27\x68\x61\x93\x75\x74\x9b\x83\x28\xd6\xed\x0d\x13\xb8\x31\x09\x7c\x22\xbd\x64\x52\xee\x89\x0a\x9c\xff\x7a\xe7\x8c\x10\x69\xde\x0b\xd1\x30\xfe\x1a\xcf\x3d\x04\x57\xff\x2e\x56\xe1\xba\x0c\x98\x75\x1b\x6d\x16\x20\x8e\x13\x15\xcb\x5b\xfb\xd8\xa0\x12\xa0\xf5\xc5\x37\xc9\xca\x1c\x86\xf8\xf4\xf0\x85\xb7\xd8\xb1\x79\xc7\xc0\xa0\xb2\xe4\xaf\xc3\x29\xf8\xde\x8b\x9b\x87\x9a\xea\xca\x5e\x62\x58\x4a\x03\x52\x36\x99\x46\x85\xe2\x0b\x78\x19\x42\x80\xae\xfd\xaa\x16\x29\x54\x37\x1f\x5b\xa4\x9a\xc2\xea\x47\xd8\x4a\xf4\x98\x4c\x4f\xf4\x16\x4d\xd7\xd2\x6f\xa0\x83\x80\x83\x25\x51\xfa\x28\x08\x77\x9c\x5d\xe2\x3e\x5a\x82\xde\xeb\x7a\x4b\xc1\xdd\xf2\x75\x10\x3c\xb2\xf9\xe9\x3b\x92\x28\xa3\xe1\x99\x94\xff\xe5\xc5\x08\xae\x4a\xf6\xbe\xb7\xd9\xdf\x58\x7f\xf8\x60\xfd\x61\x6f\x94\x17\x43\xde\x19\x46\xa2\x4c\xb2\xd3\x4e\x92\x75\x24\xb0\x21\x9b\xdb\xb3\xda\x33\xd8\x1e\xf3\xa7\xc8\x88\xd0\x0e\x9d\x83\xb5\xc3\x44\x7f\x4b\xa9\xfe\x76\x01\xd9\xc3\xed\x92\xe5\x7b\x4d\xf7\x26\x7f\xb9\x24\xa8\x5b\x52\x0b\x58\x72\x77\x23\x3c\xc3\x56\x92\x5e\xc0\x1d\x4a\x71\xfd\x34\x9f\xbc\x56\x9b\xf1\x3c\x4f\x7f\x02\xe6\xde\x2a\xc2\xae\xfe\x04\xdc\x71\xf3\xd7\xcf\x16\x28\x95\x10\xff\x53\x0c\xfb\x6a\x4b\x45\xb8\xd4\xde\x39\xc9\xaf\x5d\xa7\x7d\x54\x80\xe3\x1f\x6e\x49\x40\x5f\x10\xf8\x4a\xea\x8c\x23\x81\xf3\xc0\x63\x7d\x5f\xb2\x9a\x82\x8a\xd6\x56\xc9\xb9\xf2\x8a\x29\xe7\x48\x1f\x71\x46\x71\x04\xca\xf6\x88\xc9\xdb\x76\x1c\xa5\x79\xc6\x99\xb9\x6e\x77\xfd\xc3\x32\x24\x70\x44\x71\xec\x86\x9b\xb6\xa1\x72\xf5\x45\x8e\xda\xbf\x16\x7c\xe4\x04\x63\x66\x8f\xc9\x0f\x2d\xd3\xb2\x1d\xf6\xf1\xca\x5e\x2b\xc1\x03\x46\xca\x3b\x05\x1f\x75\xe1\x07\x2d\x2b\x49\x51\x49\x4a\xb8\x59\x83\x50\xe8\xca\x18\xd0\xa7\x85\xd0\x7f\x51\x75\xe0\x3c\x95\x07\xad\xae\x54\xf4\xac\x21\x85\xc6\xde\x50\x88\x46\x00\x46\xf0\xf2\x49\x59\x16\xc9\x60\x56\xf2\x66\x23\x8e\xca\xa8\xa3\xce\xa1\x06\x39\x6f\x61\x6c\xad\x79\x35\xd1\x19\xa8\x8d\x24\x71\x6a\x96\xf3\x2b\x42\x97\x12\x0a\x2a\x1b\x73\x96\x05\xa9\x52\x20\x77\xad\x18\xe6\x05\xef\xc4\x51\x76\xaa\x82\x3b\xa3\xd4\x9d\x81\xbd\x47\x28\x40\x94\x7d\x79\x05\xa8\xb7\x6f\xa9\x24\x9e\x0d\xf9\x5c\x44\x01\xa2\xd1\xc6\x0e\xec\x71\x6b\x1e\xa4\xea\x0f\x58\x64\x6d\x56\x16\x9c\x9b\x17\x2a\x3c\x5c\xfe\xfd\xe6\xc5\xcf\xc0\xd5\x7a\x5f\xce\x38\x8f\x05\x1b\x25\x1f\x92\xec\xf4\x7a\x9a\xb2\x4a\x20\x0c\xb2\xa7\x78\x41\x30\x50\x48\xad\x8b\x16\xaf\x42\x8a\x9b\x4b\x86\x14\xa1\x70\x89\x42\xa0\x5a\xb0\x7b\xd2\xd8\xaa\x20\x50\xfc\x03\xa8\x24\x53\x2d\x46\x25\x82\x45\x69\xc1\xa3\xf8\x92\xee\xc0\x44\x3f\xe5\x90\x99\x1c\x38\x9f\x3e\xb1\x3b\x76\xd5\x79\xc6\x6a\x78\x1c\xcb\xfd\x42\xe9\x90\x0b\x2d\x85\xf3\x58\x05\xdb\x7a\x87\xbf\x31\x74\xc5\x93\x57\xcf\xdb\x4a\x3e\x7f\x87\xab\x58\x47\xc6\x36\x71\xd3\xdf\xd9\x86\xf5\x4b\x91\xca\x3e\xc5\xca\x71\x2e\x38\xf1\xec\xb2\x9e\x10\x0c\xcc\x48\x38\x44\xb5\x02\x85\x1c\x28\xe2\x66\xa7\x38\xfa\x91\x22\x00\x79\x14\x35\x72\x44\x54\xa0\x58\x29\x18\x70\x45\xcc\xa7\x69\x7e\x69\xaf\x5b\xfa\x96\x83\xd8\x41\x24\x30\x4c\x50\x24\x45\xe6\x0a\xf9\xfc\xdd\xb6\xe2\xcf\x8e\xcd\x37\x89\xde\x6d\xc1\x2e\xad\xf5\x4f\xba\x27\x22\x01\xd2\x09\x6b\x07\x36\xc6\x56\xbd\x8b\x36\x50\xd3\x5d\x15\x2a\x9b\xa7\xbb\x2a\x6a\x1c\xae\x71\xce\x6a\x98\x55\x4f\xa8\x19\x7a\x0d\x63\x39\x6a\x32\x0a\x53\x8b\xf7\xf3\x0c\x22\xd1\xec\x1f\x1d\xe9\x28\xca\xb0\x94\x75\xd3\x73\x11\x96\x64\xaf\x45\x18\xe7\xc4\x09\x7f\x12\x64\xf9\xc0\x78\x5c\x4d\x68\xe3\x8f\xac\xc1\xee\xd3\xb9\xd0\x79\xcb\x9a\x2d\x76\x1f\x8a\xeb\x07\x87\x77\x57\x65\xb9\xb8\xe4\xc0\xec\xda\xaa\x19\x9c\x05\x50\xa1\x52\x40\x67\x15\x48\x38\xa1\x0f\x5a\xb3\xd1\x5a\x7d\xcf\xb2\x1a\x57\x7c\xa9\x30\xda\x74\x3b\x74\x47\x65\xaf\x10\xd0\x09\x06\x74\x2b\x26\x82\x3d\x85\x05\x1b\x3e\xd7\x7e\x41\x4f\x82\x31\xa4\x60\xfa\x52\xdf\x25\x63\x15\x65\xa1\x87\x6a\xd6\x50\xc0\x8c\x82\x5d\x27\xf0\x5e\x94\x29\xf9\x15\x27\x2a\x03\x17\x29\x70\xa2\xe5\x31\xce\xda\x1f\xd9\x1f\xc5\xdf\xe5\x41\xed\x84\x51\xa8\x5a\x60\x30\xa2\x5a\xae\x5b\xff\xa8\x80\x77\x95\x4a\x46\x79\xed\xe6\x1d\xf1\x59\xe9\x29\xda\x79\x23\x2b\xcd\x5f\x16\x12\x70\x0e\xf7\x58\x00\xdf\x8a\x61\x31\xe7\x10\x30\x27\x99\x84\x7e\xf2\xd0\x0d\xd6\xe7\x92\x08\x91\x4d\x1f\x1a\x06\x2f\x77\x92\x1d\xbb\x96\x30\x75\xfe\xc5\x95\xe2\x96\xe5\x23\x16\x19\x5b\x95\xf9\xab\x0c\x50\xae\x5d\x62\xee\x80\x1c\x0a\x91\x55\x53\x25\x52\x75\x09\x59\x7b\x61\x4d\xb3\xb5\x5d\xfd\xf7\x3f\x2a\x6b\x45\x95\xb8\x51\x40\xc8\x9b\x07\x50\xd2\x30\xcd\x5b\x9d\x60\x44\x11\xe9\xad\x4a\xe8\xe2\xf2\xa3\x2a\xec\xf4\xeb\xe9\xa7\x3c\xb0\x23\x30\x12\xd3\x8f\xa9\x2a\x6a\x18\x9a\xf6\x82\x40\xf2\x21\x81\xdb\xaf\x7a\x7f\xa8\x25\xae\xaa\x33\x87\x0b\x09\x84\x35\x7f\xa8\x06\x58\x59\x8a\xcb\x30\x06\xd2\xc5\xbe\x26\x90\x86\x0e\xee\x92\xc1\x1d\x7f\x39\x0e\xb4\x7d\xcc\xe3\x43\xe3\xa8\xae\xf7\xfa\xb9\x21\x69\x4e\x39\xa0\x28\xea\x53\x1b\x41\x71\x4d\x9a\x90\x3a\xce\x63\xe1\x08\x23\x44\x54\x9d\x1b\x5d\xc4\x81\xf3\x4d\xa8\x6f\x16\xea\xfd\x2f\x13\xea\xbf\x4c\xa8\xbf\x05\x13\xea\x6f\xda\xda\xd6\xbb\x92\x23\xb4\xbc\xbc\x8f\xf3\x58\x74\x66\x82\x77\xc0\x55\x5b\x6e\x28\x4a\xeb\x8c\xcb\x15\x2c\xf1\xa2\xe1\x19\xcf\xc0\x1e\x28\xce\xa5\x70\x33\x46\xa1\x1a\x2e\x91\xef\x85\xb5\xb0\xfa\x35\x29\xca\x59\x94\x2e\xa3\x65\xf3\x40\x17\xc4\xd3\xf4\xa0\x5b\xe1\xf8\x91\x1e\x94\x77\x75\xd6\x7a\xb6\x9a\x6d\xd1\x58\xe5\x56\xb7\xc5\xc2\x71\xed\xad\x6c\xb6\xf3\x5a\x3d\xad\x6d\xb5\xd1\xa8\x6d\x93\x28\xfc\xe6\x20\xab\x2d\xfd\xae\x8d\xef\x4f\xbc\xee\x8a\x83\x85\xd7\xc2\x75\x49\x85\x44\xa0\xe6\x92\xb7\xc3\x60\xcd\xa5\xae\x69\x81\x9a\xd7\xb9\x07\x55\xa8\xe0\x19\x62\xdc\x40\x48\xbe\xde\x94\x5d\x4f\xf2\xb9\x26\xda\xd7\x10\x16\x82\xf4\x5c\x46\xe2\xad\xa0\xd4\xe9\xd7\xca\x13\xde\x1a\x9e\x2b\x53\x54\x60\x7d\xb9\xe2\x36\x13\xb9\xdc\x9a\x5c\xf1\x5e\x88\x37\x7c\x32\x4d\xa5\x6c\x5c\xe7\xb2\xfe\x30\x04\x3d\xcf\xad\x84\x80\xd1\xaa\xff\x9a\xe7\xb8\xb2\xf9\x68\xad\x0a\xbb\xa0\x93\x7f\x19\xf7\x15\x5d\xed\xe0\x43\x29\xcf\x86\xba\x2e\xfa\x55\xd8\x05\x5d\x20\x10\xad\xf6\x92\x0b\x4c\xf2\x1c\xee\x62\xb3\x0a\xbb\xa0\x0b\x04\xa2\xd5\xf6\xf3\xc9\x34\xaf\x8f\x21\xf0\x68\x2b\x00\xbc\xa0\x13\x05\xe5\x54\x8c\x26\x3c\x9d\x17\xab\xe0\xd1\x76\x10\x7c\x51\x4f\x1a\x8e\x56\x56\x00\xbf\x64\x49\x5d\x6c\x87\xcd\x47\x0f\x6a\x2a\x2c\xe8\x8f\x40\xba\xb3\x3b\x8d\xe6\x70\xc2\xa3\x2a\xec\x42\x4e\x90\x40\xb4\xda\xaf\x3c\x8b\xf3\xe2\x55\xc1\x47\xc9\x07\x90\x2f\x42\x5d\x6d\xad\xf5\xeb\xeb\x2c\xe8\xd2\x05\xa6\xcd\x80\x08\x78\x94\x17\x75\xd4\xdc\x5a\xdb\x0e\x82\x2f\xe8\xd0\xc0\xdd\xbe\x4b\x98\xda\x2a\x03\x21\x94\xba\xaa\xa8\xc6\x8c\x58\xbf\x98\x05\xdd\x65\xd6\x5c\x77\x99\xb5\x79\xee\x32\x6b\x27\xf0\xea\x46\xc3\x83\xc1\xbe\xaf\x82\xb2\xed\x30\x0c\x27\x40\xf7\x38\x8d\x5a\x4b\x5b\x16\x74\x4b\xbd\xaf\xb5\x99\x86\x56\x5b\x55\x15\x56\x79\xd7\x59\x48\xb5\xe3\x54\x21\x39\xee\x32\x16\x52\x6d\x1c\x55\xc8\x0c\x37\x0b\x0b\xa9\x97\x7f\x15\x74\xa8\x96\x3c\x81\x35\x4b\x38\x00\x6d\x96\xad\x85\xa7\x8b\xb0\x5a\x23\x26\x0b\x8f\x8e\x11\xd6\x52\x68\x8c\xb0\x7e\x2c\xa4\xb7\x14\xaa\x35\xce\x5d\xf6\xb7\x35\x2d\x3b\x57\x2b\x4d\x0d\x0b\x9f\x28\x7b\xd4\xea\x49\xfc\x1f\x4d\xf3\x54\x9b\x1c\x2d\x2a\xe6\x84\x8d\x79\xe4\xc2\xcd\x4d\x8b\x26\x01\xbe\x62\xc0\x49\x27\x0c\x95\x1b\xf8\x2f\x1c\x9f\x8a\xc4\x00\xa1\xa1\xb1\x03\x56\x5d\x4e\xe4\x6c\x4c\x29\x06\xa3\x77\xf3\x89\xd9\xc0\xe8\xbb\x26\xd4\xc0\x82\xdc\x3c\x8e\x93\xfd\x47\x3f\xc2\x96\x3b\xa2\x30\x0f\xdd\x66\x66\xa8\x6f\x3d\xd5\xd3\x57\x62\x24\xc1\x27\xc9\x6f\x49\x39\x7e\x29\x65\xc4\xde\xee\x1f\x59\xcf\x1a\x92\xbf\x8c\x92\x73\xf4\xd1\x04\x0e\x00\xbf\x16\xd6\xd1\x79\x35\x05\x78\x74\xa1\x4a\x77\x90\xc7\x97\xac\x99\xe5\x36\x35\x52\x0b\x61\x15\xd2\x02\xfa\x19\xe6\xa9\xbc\x12\x66\x31\xa8\x31\xc0\x1a\xc0\x5a\x60\x62\x64\x9a\x26\xff\x30\xe4\xd3\x92\xe5\x23\x34\xc9\x94\x40\xaa\xa9\x97\x39\xc3\x8d\x58\x29\x42\xd5\x93\x0a\xa8\x1e\x16\xb1\x9e\xe3\x0e\x4a\xfd\x64\xf0\x68\x82\x2f\xd3\x34\x51\xfe\x80\xe8\xcd\x29\x7f\x37\x2d\x79\x6a\x0d\x8a\x01\xb0\xce\x8c\x18\x62\x13\xed\x21\x0c\x18\x0f\xaf\x68\xcd\xfb\x1d\x08\x28\xe8\x79\x9b\xa0\x45\x65\x9a\x67\xcf\x95\x8a\x5a\x02\x59\xdf\x8f\x9d\x86\x63\x46\x69\xe1\x3c\x77\x90\xc5\x2f\x55\x2f\xa2\x74\x94\x17\x13\x1e\xd3\x47\xd2\xd5\xbf\x8b\xd5\x06\xc6\x5b\x9a\x9b\xd9\xd3\x44\x7f\x51\xf8\x29\xc7\xd7\xb5\x36\xc1\xbd\xa5\x0c\x9f\xed\xb8\x74\x80\x22\x5a\x85\x8c\xe1\x3e\xeb\xbb\x75\x48\xf4\x21\x37\x79\xa8\x1f\x20\xa8\xba\x51\x3c\xfa\x26\x53\x3f\xa1\xc0\x21\x6c\x34\xd9\x48\x88\xe4\x34\x03\x6d\xad\xe1\x54\xd4\xa1\x56\xd4\xc6\x7d\xe4\x35\x5f\x1a\x73\x54\xc7\x22\x9f\x15\x60\x3d\x63\xc5\xaf\xe4\x64\xd7\xb6\x73\xc6\xc1\xa2\x03\xc1\xb4\xf2\x51\xa1\x62\x74\xa5\xdd\x71\x24\x0e\x2f\x32\x3d\x4a\xcc\xbd\x85\x55\x30\xab\x3c\xe8\x22\x01\x49\x88\x0c\x2b\x99\x1b\x4a\xe1\x17\xaa\x77\x8d\x82\x17\xe1\x30\xe1\xf4\x5f\x1a\xf5\xbf\x34\xea\xd7\xd7\xa8\x07\xf7\x75\x23\xff\x93\xdb\x56\x5d\x60\xdb\xad\x87\xdf\xb8\x62\x5e\x6f\xa6\x68\xca\xd9\xf8\x01\x2f\x30\x8d\x5d\x55\x20\xe5\x70\xb7\x88\x35\xd4\xb0\x91\x06\xfb\x3a\xb0\x99\x2f\x09\xfa\xfa\xf6\x00\x78\x13\x98\x09\x93\x62\x57\x22\xec\x85\xf5\xf0\x81\x56\x1c\x13\x4d\x6d\xb6\x68\x86\x61\x8b\xce\x60\x18\x67\x8e\xa5\xaa\xbd\x68\xaa\xbf\x48\x59\xa1\x9e\xc3\x25\x69\xe5\x14\x77\x75\xec\xb5\xa6\xde\x4a\x9b\x24\x4c\x5f\xdb\x9c\x7e\x68\x39\xb4\x03\x8d\xe0\xa9\xd5\x6a\xf9\xf1\x3f\x8d\x27\xa2\x0e\xb4\x25\x3c\x33\x24\xb4\x1d\x03\x33\x54\x05\xaa\x09\x75\xac\x3f\x9c\xb4\xd9\x47\xd3\xd0\x8e\x6d\xf2\xca\xb5\x4b\x22\xcd\xa9\xc4\x18\xcd\x80\x01\x22\x86\x41\x31\x76\x18\xca\xca\xd0\x79\xdc\x08\x90\xde\x7b\xe0\x50\xba\xda\xf9\x9a\x5c\x15\xaa\x21\xf4\xf2\x8b\x58\x9e\x72\x15\x08\xbc\xee\x41\x1a\x23\x34\xaa\x77\x7c\x15\x49\xbd\x50\x6f\xed\x3a\x4b\xc6\xdc\xf7\xe9\x28\x8e\xe7\xe0\xa9\x4a\x55\x24\xc6\x90\xfb\x02\x0b\x24\xdf\xb2\x13\x16\xac\xe7\xbc\xd0\xeb\x7b\xab\x64\x2a\x8d\x6e\xe0\xe2\xe4\xbd\xd4\x17\x0b\xde\xe8\x89\xad\xc8\x22\x7b\x9a\xe5\xb4\xe6\xae\xe5\x42\x75\xa2\x1c\xb8\x45\x56\x18\x42\x99\xb0\x38\x06\x89\x41\xe4\xb4\x39\x56\x0d\x76\xc4\x50\xad\x1e\x35\xdf\xa4\x2b\xa0\xe7\x0f\xb0\xb3\xd6\xf5\xdb\xdd\x4d\x29\x22\xe2\xe5\x36\x37\x0a\x3d\x97\x7d\xe6\xed\x6d\xb4\x11\x67\x6b\x53\x21\x50\x30\x98\xc9\xa2\x1d\xcc\xf3\x1a\x97\x95\xb4\xd0\x6b\x36\x75\x25\xad\xb4\xbc\x3d\x8f\xb8\xe2\x48\x06\xb5\x81\x4a\xfd\xad\xa8\xcd\x96\xdf\x08\xb5\x05\x7b\x75\xbf\xb2\x5b\x64\xe8\x45\xb5\x4a\x13\x6f\xcf\x59\x96\x5b\x2a\x0b\xd8\x67\x9a\x6e\x05\x74\x01\xeb\x50\xa4\x28\xe7\x08\x3e\x8d\x8a\xa8\xcc\x8b\xd7\x26\xb0\xe0\x1f\xe2\x5e\xfb\x0f\x71\xaf\x77\x4a\x65\x81\x28\x8e\x8f\x86\xf9\xd4\x21\xab\xfc\x6d\x6f\x89\xd3\xa8\x80\x80\x65\xc6\x0b\x5f\x5f\x0a\x9d\x0e\x4c\x32\x06\xa8\x1d\xcb\xd3\xaf\x51\x77\x59\x84\x16\x43\x97\x45\x55\xf7\xfe\x1e\xfe\x05\x1e\xf2\x0d\x76\x1f\x2b\x1c\x27\x27\xce\xd5\x48\xb9\x49\xc9\x02\x79\x6f\x3a\x69\x91\xea\x8d\x36\x6b\xf8\xf7\x24\x28\x04\x2f\x18\x33\xf8\x71\x94\xc5\x29\x47\x95\x67\x48\x32\xb0\x7b\x8f\xab\x0f\xa6\x19\xfc\x0c\x4f\x91\x58\x9c\x24\x36\xb9\xde\xa1\x85\x13\x95\xf6\x27\x79\x4d\x30\x69\x8e\x55\xc4\x09\x62\x2a\x5e\xc9\xba\xe4\x04\xa5\x70\x72\x07\x76\xdd\x93\x02\xe3\x3e\x40\x7e\xa5\x45\x2b\xc3\xae\x02\xc3\x04\xb6\x0d\xe3\xee\xdf\xaa\x2c\x8d\x4a\x60\x5c\x1c\x4d\x95\xb0\x9a\x37\x91\xb4\xb7\x45\xd1\xf9\x71\x80\x95\x28\x3f\x25\xf7\x71\x85\xa2\xde\x68\x40\x51\xaf\xbe\x51\xd5\x43\x68\xc7\x32\x84\xa1\x4d\x7a\xed\xf9\xf4\xda\x9d\x33\x47\xde\xde\x85\x17\xfb\xe5\xe7\x29\xb4\x5b\xd5\x05\x2a\xa6\xd1\xd8\xf6\xf3\xec\x9c\x17\xa5\xab\x3a\x2a\x73\xbd\x49\xc8\x29\xd7\x2e\x03\x7c\x82\xb6\xed\x36\xdc\x0c\xc8\x7b\x3a\x9a\xcb\x0f\xb2\xc2\x84\x7d\x94\xa3\xb9\x82\x86\xe0\x6b\x34\x4d\xd8\x74\x36\x48\x93\xa1\xeb\x82\x69\x2e\x29\xfe\x51\x15\x88\x70\x5d\x23\x81\xeb\xb8\x5a\xa0\xdf\x31\xd3\xe6\xfb\x8f\xf3\x8b\xa0\x68\x1f\x6e\xd9\x91\x12\x74\xfb\xc7\x6b\x27\xa8\x09\xfe\xa1\x01\x0e\xec\xe4\xac\x02\x1e\xf2\x8e\x2b\x85\x8e\xfa\x3a\x07\xa1\xba\xe3\xb8\x0e\x1f\xeb\x28\x4a\x8e\x40\xfc\x80\x8e\xe7\xd4\x41\xd4\xb5\xc2\xc7\x6f\x36\xae\x99\xbe\x7f\xc8\x8b\xbb\x2a\x73\x1b\xac\x82\x52\xd3\x58\xf7\x35\xc9\x8b\x72\x72\xe5\xd3\xd0\x7b\x7b\xb2\x0b\xc0\x3d\xff\xdd\x6c\x13\x26\x75\xce\x8a\xcb\x1c\xf3\xd2\x4b\x14\x26\x76\xdb\x1d\x54\xdc\x83\xf3\x98\xeb\x68\xb3\xd4\xc6\xbe\x4b\x40\xeb\xb6\x2a\xdf\x27\x79\x5e\x5e\x9f\xf6\x62\x6d\x7e\x45\x47\xf7\x4d\x26\x93\x53\x4f\x24\x7b\xda\xf5\xf7\x08\xe3\xe5\x4b\x3e\x59\x35\x57\x77\xe2\x1a\x8c\xe5\xdd\xa4\xe4\x20\x10\x20\x20\x06\xd9\x5f\x65\x8f\x89\xbc\xea\xaa\xeb\x55\xed\x7c\xf0\x7e\x97\x5d\xb1\x9d\x5a\x38\xa5\xd6\x5f\x84\x4c\x3e\x78\xdf\x1d\x5a\xb5\x04\x40\x28\x60\x2c\x05\x7e\x51\xb8\x1a\x25\x0e\x7b\x6c\x51\xdd\x71\x51\x9a\xa3\x79\xc1\xf7\xd4\xaf\x11\x2f\x76\x89\xbc\x45\xfd\x07\x0f\xfe\x1b\xf2\x16\x61\x0c\x2e\x64\x51\x7a\x8b\xd1\xdf\x54\x1f\x76\xad\xa9\x5e\x9a\x76\x52\x70\xab\x32\x8f\xec\x0d\xf6\xd8\xf9\xb5\xa3\x59\x17\x9a\xc2\x2d\xba\x81\x01\xcc\x61\x4f\xbf\xf3\xa4\x28\xa2\xcb\x6e\x22\xe0\x5f\xec\x4f\x7e\x5e\x90\xf0\x45\xc2\x19\x05\x3b\x9a\x84\x0e\x67\x85\x48\xce\x79\x7a\xc9\xf0\xe4\x26\xa7\x24\x39\xfd\xb0\xac\x36\xc9\xb0\x32\xae\xd7\x0e\xd0\x01\x23\x83\x0d\xd7\xc8\x60\x63\x9e\x91\xc1\x86\x36\x32\x70\xdf\x39\x31\x54\x94\xc2\x32\xf4\xd2\x19\x88\x1a\x85\xb1\x50\x46\xea\xba\x89\x12\x8c\xd6\x9b\xd0\xf6\x1c\x67\x14\x55\xc1\xf7\xad\x30\xed\xec\xed\x29\x27\x84\x65\x3d\x88\x9e\xa0\x66\xa3\x2c\x12\x14\x56\xd4\x18\x92\x52\xf0\x74\xc4\xfe\x28\xfe\xc8\x88\xf3\x10\x57\x91\x19\x75\x7f\xde\x41\x57\x8d\x88\xa5\xe5\x1b\x13\x42\x3f\x58\x4f\x5d\xe4\x8b\xe8\xe2\x98\x0e\xfc\x84\x06\x02\x53\xb3\xec\x34\xe8\xcc\x76\xdb\xcc\x72\x28\x39\x8f\xbd\xde\x31\x33\x08\x97\x4f\x1d\x92\xeb\x91\xd8\x7b\x95\xf5\x7c\xd1\x8e\x2f\xb4\x82\xbd\x66\xf9\xbe\x2f\x94\x3b\x15\xb0\xf2\x94\x9a\x8f\x3d\xc1\xd5\x43\xc5\x11\xc8\x35\xc2\xae\x84\x02\x0f\x66\x92\x0b\xb1\xd4\x91\x37\x02\x08\xa9\x7f\x16\x91\x93\x90\xce\xec\x26\xce\xb8\x30\x3b\x80\xcf\x9b\x77\x74\x43\xaa\x9c\xb9\xbf\x49\xd0\xbf\x3a\x7a\x29\xf9\x3d\x88\x9d\x9f\x6e\x8b\x92\x8c\x41\xca\x27\xaf\xb3\x6a\xcb\xbe\xb0\x85\xff\x1f\x22\xa9\x4e\x2f\xd9\x20\x12\x4a\xea\xef\xae\x2c\xcc\x9d\x80\xf1\x2d\xaa\xe4\x77\x9f\x36\x1d\x0a\x1a\x04\x55\x72\x05\xb9\x19\xb9\xe4\xd5\x25\x61\xa6\x52\xa5\x75\xe4\x71\x52\x36\xd4\xce\x60\xb5\x0b\xaf\x01\xb6\xb7\xb0\x53\xb7\x8f\xfa\x76\x68\x03\x34\x1a\xd5\x0a\x15\xeb\x55\x90\x0a\x7b\xb9\xfa\x37\x08\x90\xec\x1d\x62\xf1\xce\x09\x77\xfd\x79\x57\x26\x94\x2e\xaa\x57\xa6\x25\x53\xd7\xd3\x87\x61\xbd\xf3\x3f\x9e\x77\x18\xed\x90\x2c\x33\x2b\x41\xeb\x14\x95\xbe\xc7\xfd\x1d\x96\x68\x6f\x33\x8b\x65\xef\x1e\xfb\xed\xe0\xc7\x57\x4f\xf6\x7f\x62\xbf\x3e\x79\xcd\x9e\xbf\xfc\x9f\x83\xfd\x37\xcf\x0f\x5f\xb2\x7b\x3d\xdb\xb6\xbe\x70\x7c\xec\xdd\x63\xea\xaa\x72\x91\x64\x71\x7e\x81\xef\x07\xd8\x75\x57\xf5\x5c\x6b\x96\xb9\xd1\x52\x0d\xc9\xcb\x92\xaa\xff\xe9\x13\x28\xe6\x30\xaa\x60\x2d\x26\x57\xf8\x3c\x3c\x6f\x68\xcd\xcd\x7e\xab\xd5\xaa\x90\xea\x76\x33\xa1\x55\x06\x6a\xdd\x24\x40\xbe\xb5\xe2\xcd\xab\x3c\xbb\x1c\x25\x69\xda\x2c\xf2\x1c\xb8\xe6\x3b\x3c\xf1\xc5\x2c\x2d\x77\xf1\x87\x96\xb2\x99\x04\xe9\xe2\xaf\xdd\x95\x95\xef\x88\x64\x41\x04\x71\x9a\x46\xe9\xe3\xca\x77\x00\xa5\x04\xed\xdc\x8a\x99\x50\xf4\x1d\x76\xc3\x8c\x24\x6e\x01\x76\x57\xbe\xfb\xce\xac\xd1\x2a\x64\xb3\x61\x41\x1b\x2d\x09\xfc\x5d\xa5\x09\x38\xc8\xd5\x30\xbe\xbb\x5a\xa1\xcd\x99\xd6\x1a\x3f\xfc\x40\x1a\xda\x5d\xf9\xee\x6a\x65\xe5\x3b\x93\x02\x16\x2b\x4b\x31\xca\x9f\xad\x6f\x2c\x69\xcc\x5f\xe6\x14\x21\x3b\x5e\x63\xc1\xfa\x5f\x65\x98\x16\x30\x51\x5e\xac\xc3\xb7\x8a\x22\x5b\x7c\xd7\x66\x0d\x1a\x91\x4a\xdf\x37\x8f\xff\xb8\xe8\x9c\xdc\x87\xa4\x42\xdf\x82\x52\x10\xe7\x48\x9d\x70\xbd\x9e\x7a\xf8\x25\xef\x25\x6c\xc0\x55\x0c\xa5\xbc\x60\xdf\x17\x7c\xe4\x66\xeb\x63\xee\x83\xae\xf2\xfb\xe1\xa3\xa6\xc9\x70\xe6\x1d\x86\x76\x31\x40\xb8\x6a\x64\xbb\xd0\x33\xaa\x69\xc0\xdc\x78\x74\xa6\x69\xaa\x7f\x6a\xd1\xe7\xd0\x4a\x20\x64\xe7\x86\x63\x0d\x85\xbd\x00\x09\x90\x4c\x16\xe2\xe1\x25\x2a\x94\x78\xc1\x47\xbc\xe0\xd9\x50\x07\x48\xf8\x3b\x44\x8e\xff\xbb\xe8\x36\x00\xdf\x36\x41\x4e\x5f\x53\x20\x46\xd3\xa7\x4f\xb6\xc4\x7f\xaf\x35\x96\x06\x57\xe6\x78\x87\x40\xa1\x91\x78\x92\x39\x31\xe0\xf1\x8b\xcd\x03\xe5\x64\x82\x32\xc6\x77\x77\x4d\xdc\xe5\x5d\x93\xc2\xc1\xf7\xbf\x7a\xa5\x98\x72\x24\x9a\xc8\x5b\xaf\x20\x45\x07\xf2\xea\x2b\x92\x8e\xd5\x72\xb0\xf6\xe2\x93\x1b\x99\x85\x9b\xf3\xd2\xa4\x6f\xcf\xb2\x79\x5a\xd9\x76\x58\x5b\x79\xc5\x5e\x71\xf5\x89\xd0\xf0\x2d\x23\xdc\xc7\x2a\x8a\x60\x7d\xe0\x6d\xa3\xb4\xf5\x6a\x58\x8b\x47\xd2\xc1\x7b\xec\xe0\x3d\xfb\x87\x3f\x08\xd3\xc1\x7b\x37\x50\x81\x1d\xaf\x19\xa6\xed\xe2\x3d\xb9\x91\xe2\x2d\x58\x0e\xad\xa5\x87\x48\x5e\xc4\xf0\x3f\xc8\x69\x80\xc1\x07\xa2\x34\x65\x77\xd9\xe0\x52\xc5\x40\x86\x31\xe4\xda\xe8\x86\xdd\xb5\x61\x7c\xd5\x8d\xd8\xb4\x61\xdb\x56\xac\xa3\x3c\x04\x20\x73\xba\xfc\xcb\xe4\x0f\xa3\xbb\x94\xe6\x03\x29\x75\xaa\xde\xf4\x2b\x5f\xa6\x36\x6e\xf7\xce\x43\x59\x51\x1f\xcf\xbe\xc2\xf8\x94\x97\x87\xb8\x20\x54\x40\x02\xb3\x1c\x2a\xcf\x09\xbd\x1e\x53\xa0\x12\x6d\x36\xe0\x3c\x33\x91\x9e\xf0\xc9\x37\x6e\x43\x22\xd0\x0b\x4c\xd6\xc0\x92\x4c\x7e\x86\x70\xa9\x18\xbe\xd8\xd5\x77\xdb\xf8\x10\xe1\x37\x1c\xac\xb6\xe3\x05\x69\xbe\xcf\xfa\x36\xf3\xb2\x9e\xd9\x24\x3b\xfd\x99\x9f\xf3\xd4\x7b\x0e\xeb\xd2\x32\x55\xc5\x03\x77\x7f\x7a\x2a\xa2\x3e\xdb\x71\x01\xee\xb3\xbe\xab\x85\x77\x50\x77\x5e\xe2\xc8\x65\xc9\x36\xe0\x36\xa7\x5f\xeb\xd4\x38\xed\x16\xe5\x1a\x70\xdc\x67\x7d\xf5\x6a\x35\x47\xdf\x5f\x9b\x0c\x74\xa1\xde\xdf\xde\x60\xb4\xfd\xb0\xce\x74\xe9\x11\x53\xbf\xa4\x68\x40\xfb\x04\x69\xb3\x05\xe8\xed\x41\x9f\x2a\x5e\xe1\x32\x89\x48\x13\xeb\xad\xa7\x56\x87\xc9\xb9\xe4\x83\x90\xac\x28\xca\x36\x93\x3c\x45\xb9\x01\x7e\x4c\xab\x77\xef\xb2\x3b\x81\xfa\x95\xe7\x4c\x46\xc6\xb7\xcc\x22\x71\xba\xd3\x1d\xf8\xbb\x10\xcd\x03\x50\xd9\xf1\x6d\x8a\xcb\xae\xf3\x5a\xc9\x48\x78\x7e\xbd\xd2\xf4\xa1\xa7\x9b\x29\x2c\x4b\xbc\x9f\x89\x92\x41\x1c\xbc\x91\xdb\x80\xdc\xae\x1c\x89\x45\xee\x4f\x2a\x44\x1b\x89\xa5\x2c\xff\x6b\xed\xe2\xeb\xba\x99\xc7\x96\x3b\xa7\x35\x92\x43\xdd\x26\x29\xa5\x10\x41\x5b\x17\x34\x36\xa5\xb2\x8d\xb0\x29\x13\x47\xaf\xdd\xac\x89\xb2\x7f\x12\x6d\xdf\xae\x93\xcf\x7b\x1b\x0e\xdb\xdc\x85\x35\x62\x01\x3e\xf9\x58\x45\x84\x8e\xfb\x15\x8c\x7a\x48\x38\xb3\x48\x4e\xc7\x34\x56\xb4\xda\xbb\x51\x45\x9b\x33\x9e\x89\x59\xc1\x15\x54\x5e\x60\xc4\x04\x4b\x2c\x33\x48\x95\xad\x7c\x96\x92\x64\xc6\xa6\x50\x67\x14\xf0\x28\x40\xc7\xea\x30\x96\x31\x32\x24\x21\xdf\xea\xb2\xf6\xba\x07\xc9\x2d\xea\x3b\xbe\xb1\xbc\x97\xc1\x2b\x91\x72\xd5\xfb\x6f\xbf\x13\x91\xf4\x4f\x7e\x96\x19\x7d\x05\x41\xfa\x5d\xd9\x9b\x8a\xb9\x8d\x28\x00\xb4\xae\xba\x42\x6b\xe4\x97\xd1\x44\x85\x00\x51\x16\x81\x00\xa9\xd9\xe1\xc7\x3c\x4f\x79\x94\x5d\xb1\x51\x1a\x9d\x42\x90\xa3\x64\x18\x41\x8c\x26\x33\xd2\x8b\x48\x90\xec\x4f\xa9\x14\x9c\xb2\xbc\x74\xaf\x3b\xda\x3a\x14\x4d\xc9\xd4\xd6\xab\x7b\x37\x37\xa0\xa3\xb3\x64\x0a\xd6\xf5\x97\x2a\x0d\xb1\x36\x0e\x22\xa0\x4e\x94\x04\x55\x0d\xfd\x7f\x58\x54\x14\xd1\x25\xcb\x47\x6a\x34\x19\x44\x79\x7e\xf7\x51\x79\x62\x8a\x1d\x76\xdc\x18\xe5\xb9\x14\x02\x07\x51\xd1\x38\xb9\x7a\xa7\x9a\x77\x5f\x1a\x6c\x5f\xcb\x3c\x33\x18\xe8\xfa\x37\x06\x3c\xe7\x8e\x78\x89\x47\xe1\x5c\x52\xa8\xc7\x07\x2f\xfc\x9d\xaa\x1c\x0a\x6f\xe6\x2e\x69\x6d\x9c\x70\xe5\x51\x46\x4c\xe5\x56\xa6\x2f\xb5\x71\x2d\x81\x24\x7d\x98\x24\x8e\xa1\x8d\x1d\x9f\xb9\xfe\xb0\x46\x8b\xfd\x93\x78\x19\x19\xb9\x74\xce\xb8\xd4\x45\x44\xd6\x6d\x39\x77\x30\x73\x61\x08\x0a\x28\x2b\x6e\xfe\x6e\x3e\x92\xdb\x6c\xc4\xd2\x7c\xa8\xb8\xba\xbb\xe2\xe3\x69\xe4\x86\xef\x9d\xe8\xf4\xf6\x29\x4f\x89\xf0\xfa\x66\x4b\x50\x44\x43\x97\xbe\xb1\x11\x57\x27\xa7\xf7\xa4\xb7\xd4\xc5\xf6\xb5\x77\x8b\x55\x81\xac\x95\x40\xda\xf5\x5f\xee\xdc\xeb\x6a\x75\x7a\xc3\x8f\x88\xd7\xc2\x68\xff\x72\x98\x26\x43\x86\x73\x9d\x28\xf7\x9a\x92\x0f\xcb\xcf\x40\x47\x91\x10\x48\xc7\xc5\xb1\x3e\xb2\x4e\xe0\x8e\xa5\x8d\x15\x1d\x08\xf5\xb0\x78\xa6\x4d\xfe\xc2\x1c\x1b\xe0\x81\x79\x9d\x98\xa9\xa3\x16\xa1\x26\x3f\xa5\xa7\xe1\x51\x4c\x6e\xd3\xa3\x49\x4e\x8a\xcd\xd1\x0e\x6d\x19\x6d\x8f\x01\xba\x5d\x8d\x8f\x3a\x82\x96\x7f\xd4\x70\xd2\xcc\xe1\x5b\x86\x5e\xac\x21\xa1\x3f\xb4\x04\xbd\x5a\x26\x2c\xb3\x8a\xe8\xaa\x0b\x1c\xba\x4c\x0b\x7e\x8e\x61\x8f\x47\x49\x96\x94\x9c\xa5\x79\x3e\xed\x56\xec\xec\x4c\xab\xbb\x35\x62\xc5\x0d\xa5\x8a\x6f\x2c\x14\x5c\x30\x79\xb8\x71\xdc\x9f\x93\xc1\xdc\x9a\x4c\x28\x41\x5a\xbb\x59\xaa\x6c\x4b\xc0\x64\x78\x26\xff\x4d\x09\xca\xdd\xd0\x71\x2d\xca\xc2\x39\x9b\xd5\x77\xff\xa4\xbd\x6e\x5e\xf4\xea\x52\x91\x63\x82\x30\xd1\xb1\x65\x0b\x3c\x2c\xca\x9c\xc5\x91\x18\xdb\xa3\xa4\x4e\xf6\x00\x2e\x70\xb0\x55\x25\x2e\xb6\x43\xec\x12\x70\x21\x37\x48\x75\x7b\x3d\xc7\xa0\xd0\x7b\xda\xa4\x63\xfe\xa5\xd3\x54\x00\x91\xb7\x36\x71\xfb\x89\x63\x84\x7c\x62\x36\x1f\x74\x5d\x93\x6c\x3d\x8a\xd2\x74\x10\x0d\xcf\x1c\xf3\xcb\x90\x39\x82\x05\x6c\xd9\xde\xed\x57\xf3\x9c\x6d\xbe\x74\x27\xd1\xb4\x49\xc6\xac\x6c\x36\xc2\x75\x2b\xb4\x21\xfd\xf9\x62\xbb\x69\x81\xce\xe7\x93\x34\xcd\x2f\xe6\xcd\xe6\xe0\x52\x57\x94\xdc\x08\x2a\x6e\xc8\x44\xa7\x66\x99\x17\xc9\x9f\xd5\x19\x76\xb6\x3b\x3a\x95\x7a\x25\x2c\xb3\xbd\x2d\xa0\x6c\xcb\x89\x5b\xae\x1e\x97\xf1\xaa\x9b\x26\x67\x9c\xfd\x30\xca\xb3\xb2\x33\x8a\x86\xbc\xad\x52\x1f\x0d\xa3\x8c\x8d\xa3\x73\xce\x26\xb3\xb4\x4c\xa6\xa9\xda\xa2\x40\x79\x1c\x65\x28\x1a\xfa\xfa\xc7\x5a\xab\x91\x5a\x51\x4e\xfb\x22\xa3\x94\x16\x9a\x23\x5f\x80\xf3\x62\xa4\x92\xcd\xda\x95\xdc\xaa\x0b\xe1\x76\x6e\x66\xdf\x64\xd8\xab\xbf\x6c\x2b\xe7\xda\x56\x92\xd0\x2e\x5f\xd9\x02\x12\x2a\x93\xee\xeb\x4d\x05\x1e\x06\xc1\xe7\xf5\x45\xe1\xbe\x92\xb5\xa5\x3e\xd7\xd2\x3c\xe3\x98\x31\x18\x0d\x21\x31\xf5\x4f\x1c\xcb\x4b\x45\x70\x7b\x3c\xe7\x85\x48\xf2\xcc\x33\x65\x8c\xe2\xd8\xc4\xf0\x89\x7f\x45\x10\x6b\xb0\xe9\x1d\xff\x9d\xe3\xa8\xf3\x27\x9e\xff\x8e\x2a\x95\x3e\x37\x55\xce\x6a\xfa\xde\x74\xdc\x3f\xe9\x96\xf9\x2f\xd3\xa9\x3d\xaa\xd5\x03\x96\xb2\x99\x3c\x1c\xbc\x37\xd6\x59\xfe\x5b\xb4\xc1\x8a\x29\x48\xfd\xa6\x9c\xab\x3f\x77\xbd\xb2\xb9\xc7\x25\xad\x74\xe5\x18\x02\x1d\x0e\xde\x9b\x9c\x3a\x33\xc5\x30\x41\x32\xb9\x6c\x42\x2d\x1e\x03\x26\xa5\x2c\xe6\x7c\xaa\x13\xe7\x47\x42\x50\x75\x83\x77\x1a\x19\x55\x06\x66\x9b\x36\x53\x48\x61\xd4\x5b\xfc\x27\x38\x60\x3e\xbd\x84\x34\x4d\x9f\xb0\x62\xeb\x8a\x4c\xba\xce\x8b\x5c\xd1\xa3\xe0\x8d\xc4\x91\x66\xe6\xb7\x89\x6f\x34\x12\x6d\xdd\x28\x4d\xc9\x05\xdb\x18\xa7\x49\xfb\xbd\x17\x1a\x10\xf7\x31\x9b\xbf\xa6\xb5\x8a\x7a\xe1\xcb\x46\xbf\xaa\x50\x1a\x6e\xb1\x72\xbd\x56\x9b\x8d\x0a\xb7\xb1\xa4\xd5\x30\x76\xbb\x4b\x0c\x68\x1d\x13\xe2\xfa\x83\x1b\x2b\xb6\x74\xe7\x0d\x38\x72\x1b\xd6\xa4\x6e\x81\x81\xb1\x5f\xdd\x31\x4f\x51\x27\xa1\xb8\x48\x20\x1c\xbf\x84\x31\x52\x5f\x24\xb8\xc1\x6e\x27\x68\x66\x69\xc4\x26\xc7\xd2\x92\x88\x01\x19\x2f\x5e\x29\x89\x52\x51\xdd\xb5\x94\x4d\x67\xf2\x5c\x57\x50\x72\x41\xe8\x29\x34\x1f\xdb\x15\xa8\xaa\xc3\x31\xcd\x89\x3b\x28\x78\x74\xe6\xcb\x08\x34\x92\xfb\x3c\x94\xb0\xab\xb7\x41\x8c\x60\xd4\xf7\x59\xa3\x23\x2f\xc8\x6f\x2b\xf8\xbd\x9d\x87\xa0\xc6\x83\x20\x87\xd4\xc5\xa9\xdc\xa9\xc8\x4f\xf6\x81\x18\x5a\x0f\x3f\x0b\x1b\x02\xfa\x68\x1a\x9a\x5d\x07\x15\x95\x64\x8d\x4e\x34\xf2\xb7\x3c\x7b\xd7\x3c\x9d\x7e\x60\x8d\xb0\xfb\xe6\xd5\x52\xd9\x9c\x7e\xfa\x84\x3b\x97\xfd\x69\x72\x26\x05\xf1\xd0\x3a\x59\xbf\x24\x28\x8e\xff\x8a\xeb\x92\xc8\xe4\x71\x0c\xdd\x49\x19\x1b\x82\x8a\x24\x43\xa5\xeb\xf4\x0e\x1b\xb2\x5f\x7e\xd1\x70\x7c\x7a\x47\x31\x3b\xf6\xa1\xed\x22\x78\xde\xd1\x57\xb2\x2f\xf1\x7a\xb9\xd4\xf3\xa2\x1b\x12\xc8\xe5\x2a\xe7\xdd\xa4\x32\xae\xd6\xe2\xa7\x10\xea\xa0\x37\x8e\xb2\x53\xcc\xdf\xda\x54\x3b\xf5\x94\x18\x6f\xa8\xea\xc1\x1d\x3d\xdc\xf3\x75\x24\xfa\xb6\x8b\xc0\x8e\xfb\x33\x2c\xef\x7f\x63\xc1\xf5\x14\xd7\xeb\xd0\x03\x31\x7b\x2f\x44\x47\xb1\x76\x07\xd6\x01\x04\x15\xd3\x47\x30\x2c\x44\x7d\xc2\x03\xa3\xe0\xc6\x0e\x4b\x23\x28\x2b\xcb\x4e\x1b\x51\x96\x4c\x20\x93\x7e\x27\xe6\xa9\xdc\xa9\x58\x63\x82\x51\x8c\x69\xd1\xac\x80\x3f\x68\xa9\x3c\x15\x4e\x21\x9b\x53\x47\x6b\x45\x65\xf1\xf4\x43\x6d\x71\xe7\xc3\x22\x80\xcb\x1a\x00\x91\xfc\xc9\x49\xd1\x00\x1e\x08\x29\x28\x7c\xe8\x0c\xf2\xb2\xcc\x27\x8d\xba\x82\x4e\xca\x47\x65\xa7\x88\xe2\x64\x26\xea\x81\xe0\x09\x72\x21\xd4\x45\x12\x97\xe3\x40\xb1\xec\xa2\xe6\x73\x6d\x9d\xda\xbe\x00\x95\xba\xef\xb5\xcd\x89\x69\x34\x4c\xb2\xd3\x40\x49\x99\x4f\xc3\x5f\x17\x50\x46\x42\x2c\x20\x8b\x04\xa9\x43\xa8\xee\x3b\x3c\x06\xd7\x96\x62\x26\xb0\xda\x62\x9e\xc5\xb5\x65\xe3\xbc\x48\xfe\xcc\xb3\x32\x4a\xe7\x10\x43\x94\x51\x51\x4f\x44\x50\xec\x0c\x83\x0d\x20\x07\x38\x55\x3e\x74\xc4\x38\x8a\xf3\x0b\xda\xd0\x30\x4f\x67\x93\xac\x73\x1a\x4d\x03\x5f\xe5\x6e\x5e\xf3\xb9\x8a\x92\x2a\xac\x7c\x1f\xa5\xfc\x43\x67\x10\x89\xc4\x99\x10\x50\xef\x78\x0b\xc6\x7e\x94\xab\xbc\x8c\x48\xd1\x98\xcb\x89\xb5\xbf\x25\x27\x90\x8a\x29\x2f\xcb\x30\x4f\xa5\xf9\x29\x10\x08\x1b\x08\x95\xf8\x08\x4f\xa2\xe2\x34\xc9\x08\x20\x7e\x40\x3e\x68\x54\xbf\x23\x07\x84\x0a\x2a\xeb\x5c\x15\xf8\xab\x4f\x7d\xae\xac\x23\xf5\xdd\x5b\x0f\x93\xe8\x43\x60\x34\xf2\x6b\x85\xf4\xaa\x01\x9e\xc5\x81\xaf\xc0\x59\xee\x77\x71\x56\xb3\x0b\xba\x45\x97\x95\x22\x7f\x22\x25\x36\xf5\x94\xa7\xa5\x55\x9c\x93\x2c\x54\x25\x09\x70\x96\xfc\x38\xa7\x17\x52\x5a\x99\xe3\x5c\x0e\x84\x02\xc3\x87\x4e\x3e\x1a\x09\x4e\x5b\xc9\x67\x65\x9a\x64\x9c\x40\xaa\x2f\x55\x50\x53\xe2\x77\x36\x8d\xe2\x38\xc9\x4e\x09\xa4\xfa\x12\xe0\x10\x5d\xe2\xb3\x88\xfe\x5e\xe1\x11\x5d\xe0\x31\x89\xfe\x5c\x61\x5a\xd3\x75\x85\x6b\x75\x89\xc7\x2d\xfa\x73\x85\x5d\xa6\xbc\x10\x53\x3e\x2c\x93\x73\xde\xc1\xf7\x33\xe4\x99\xbf\xd7\x16\x5f\xda\x62\x52\x6a\x9b\x2c\xdc\x35\xde\x10\xe3\x68\xca\x3b\xc8\xae\xa4\x67\xc9\x6c\x04\xaa\xe4\x1f\xca\x4e\x92\xc5\x3c\x73\xd0\x83\xcf\xa2\x2c\xf2\x33\x5e\xf3\xb9\x32\x51\x65\x3e\xa5\x90\x45\x94\x89\x51\x5e\x4c\x14\xfa\x64\x6c\x7e\x91\x33\xf0\x4a\xe1\xe5\xbc\xc2\x3f\xfd\xc2\x24\x2c\xe5\xd0\xb2\x80\x98\x63\x0e\x82\x28\x4d\x4e\x29\xb1\x60\x8c\x64\x54\x17\x79\x11\x07\xf6\xc9\x5e\x8f\xbd\xcc\x4b\x9b\x9e\x6b\x6a\xc2\xf9\x75\xb1\xf4\x17\xc1\x21\x25\x4c\x04\x26\x82\x2a\x8d\x3a\x18\xcd\x4a\x79\x0f\x63\x4f\x33\x50\xf3\x9d\x22\x76\x5d\xf7\xcc\xf1\xa4\x2a\xfb\xfd\xb2\xe6\xfb\x20\x9d\x15\x35\x45\x62\x5a\xf0\x28\xae\x1c\x1c\xb0\xf8\xaa\xfb\x00\xce\x78\x00\x09\x5a\x70\x59\x57\x40\xd0\x08\x05\x1f\xfd\x26\xa3\x14\xff\xa5\x7c\xf7\x94\xef\xae\x99\x18\x46\x50\xff\x4f\xe8\xdd\x21\x22\x69\x6d\x46\x81\xb5\xaf\x62\x5d\x66\x3b\xf0\xd8\x2c\x1f\xbc\x57\xfe\x17\x5a\x1d\x05\x37\x7a\x47\xdd\x5c\x13\xba\xd4\x56\xfd\xa8\x59\x52\x5d\x91\x6d\x58\x55\xe4\x52\x30\xc7\x35\x81\x54\xf5\x37\x1d\x21\x15\x7f\xb3\x2b\x88\x97\x89\x2e\x6d\x46\x33\x6d\x54\xa0\xd6\x47\x0a\xa7\xd9\x28\x5e\x5e\x44\x53\xa5\x68\x61\x83\x4b\x76\x9a\x9c\xf3\x0c\xf6\x31\xff\x79\x13\x94\x99\x57\xd6\x96\x4c\x1b\xa2\x55\x55\xce\xc6\x2c\x24\xa4\x73\xae\x00\x19\xfb\x10\xef\xf5\x9e\x4d\xa2\xe9\x94\xc7\xb6\x1f\xa2\x03\x9a\x44\x53\xb8\xea\x8b\x1f\x2f\x25\x35\xa9\x06\x82\x2a\x57\xa8\x8a\x18\x5e\x98\xed\x5a\x4b\x4a\x3e\xf1\x94\x15\x78\xa3\x7e\xa3\x43\xac\x49\x08\xa7\x49\xd0\x52\x04\xed\x02\x90\x26\x65\x6e\x23\x07\x7e\x09\xca\x19\x0b\x82\x31\x9f\xf0\x36\x68\x82\xc8\x23\x35\xb4\x2e\x50\x23\x24\x1b\x13\xcb\x19\x3e\xfa\x44\xb7\xc6\x05\xc6\xe6\x91\x3e\xf4\xc8\x4e\x0c\x85\x1c\xaa\x8b\x21\xa2\xe5\xc6\xd3\xc7\xaf\x5a\x1f\xb5\x07\xb6\xbd\xae\xea\xbe\xfb\x3e\x4f\xb2\x66\xa3\xdd\x30\xaa\x75\xaa\x32\x85\xed\x6c\xad\xe5\xe6\xd8\xaa\x51\xb1\x1f\xaf\x9d\xb4\x0c\x64\x00\xd3\xe3\xb5\x13\x17\x59\xd3\xa3\xa3\xe2\x97\xcd\x54\x83\x83\x54\x95\xf4\xd6\x9e\x8c\xf4\xee\x30\xd4\x62\x2e\xf5\xde\x8d\x28\x41\x58\x23\xc8\x6a\xea\x9d\xae\x96\xd7\xcc\x4c\x23\xdc\xcd\xb9\xad\xd6\x56\xd6\x18\xc0\x26\x82\xe9\x87\x04\x68\xe9\x33\xf8\xca\x5b\x7a\x15\x42\xb5\x59\x22\x9e\xa9\x3e\xc8\x4b\x10\xc6\x2c\xc0\xe4\x1a\x87\x83\xf7\x56\x51\xad\xbe\x0f\x67\xa2\xcc\x27\xaf\x68\x69\xcb\xe1\xa5\x15\xcf\xd7\xeb\xf8\x44\x9b\x56\x42\xd0\x4b\xd9\x0b\xc8\x76\x82\x45\xd9\x25\xcb\x72\xb8\xfe\x65\x71\x54\xd0\xf7\x34\x1b\x3d\x21\xdc\xa3\x31\xb6\x44\x6d\xbb\x05\x11\x72\xc0\x97\xa9\x51\xa0\xe2\x48\xeb\x5b\x72\xa8\x40\xad\x59\x5f\x45\x42\x40\x90\xe5\x19\x98\xe1\xa7\x29\x73\xd0\xd4\xd6\xc2\xea\x14\x3a\xe3\x97\x42\xbd\x2a\x99\x78\x65\x9e\x3d\xef\x20\x12\x5c\xbf\xb2\x84\x68\xec\xc6\xed\x40\xfe\xd7\x75\x4e\xfc\x40\x1a\xa1\xa5\x6a\x81\xdd\x27\x25\x9c\x89\xee\x74\x26\xc6\xcd\xd0\x12\x36\xf5\xda\x06\xc7\x36\xc5\x10\xfa\x78\x9e\x1d\x0e\xde\xb7\xe8\xf3\x12\x9e\x8a\xb4\x71\x1f\x8d\x5d\xc7\xe5\xc1\xc6\xbc\x20\xce\x03\xbd\x1e\x3c\x52\x68\xa1\x08\xe7\x13\x4c\xd4\x50\x40\xc1\x23\x9a\xe6\xb1\x0f\x91\xce\xf6\xc9\xee\xe8\xfd\xf0\xe3\x4a\x68\xfc\xf3\x6b\xb7\x42\xe1\x3f\x56\x3c\x67\xb8\xf9\x7b\x09\xb2\x18\xb9\xb4\x68\x39\x00\x76\x17\x30\x12\xc2\x5b\x2c\x5a\x40\x95\x39\x9a\xec\xc6\x49\xc1\x87\x65\x7a\xf9\x19\x3b\xcf\xd2\x06\xf8\x7a\x75\xb5\x59\x39\x8e\x4a\xed\x86\x02\xa1\x3e\x93\x28\xad\x62\x7e\xfd\x8d\x49\xa3\x82\xd3\x28\xaf\x64\xf9\x2c\x40\x12\x85\xc0\x45\x24\x8c\x23\x60\x14\xc7\x78\xa9\x0b\x98\x7a\x2d\x58\xdb\xa4\xbc\xba\xa5\x55\x9e\x76\x08\xb4\xe3\x14\x5b\xe4\xd3\x97\x18\x68\x97\x40\x68\xa3\x3d\x6d\xc6\xfa\x7c\x54\x79\xfa\x67\x71\xce\x45\xd6\x50\xf7\x55\x33\x1e\x15\x40\x94\x75\xe4\xc8\x20\x36\x61\x9e\x71\xf3\x34\x45\xdf\xca\xd5\x06\x7b\xc7\x7b\x31\xbf\x7b\x97\x35\xed\x60\xe4\xfe\x0b\x41\x4b\x81\x73\x9b\x1a\xdb\x56\xcb\x35\xfc\x97\xc2\x5d\x16\xdb\x47\x48\x60\xb8\xa7\x60\x78\x9d\x17\x4d\x5f\xca\xfe\x78\xd5\x36\xe3\x6e\x53\x64\x54\x80\xcd\xd6\xb1\x2e\xb5\xee\xb4\x6a\xbd\xa2\xb5\x84\x66\x5a\x3d\x5a\xc7\x93\xcd\xce\x83\x8d\x26\x6a\x6d\x0a\x6d\xd3\x6c\xcf\x45\x1b\x8d\x14\x6d\x9d\x39\x90\x2b\x76\xa9\xf6\x7a\x3a\xab\xbc\x3d\x14\x1d\xe3\x6b\xd0\x15\xc4\xf9\x0c\x52\xd0\x1a\x09\x8f\x5a\x19\x13\x02\xf8\x6f\x67\xe7\xfe\xc3\x2a\xd2\x54\x8e\x34\x52\xb4\xc8\x38\x8f\x85\x72\xa3\xb7\x16\x96\x0b\xed\x55\xbd\x82\xcf\x93\x07\x74\x6d\xd3\xef\x91\x6a\x9f\xac\x22\x97\x15\x9c\x98\x34\x0b\xd7\x8c\xf3\x1c\x4a\x73\xaa\x38\x96\xad\x0b\x2c\x35\x88\x89\x25\xca\x01\x6a\x32\x94\x8c\x6d\xe6\xa8\x40\xbb\x1c\xd4\xda\xe8\x26\xef\xd4\x8a\xa6\xee\xb1\xb8\xc8\x0c\x63\x19\x7b\x4c\x6b\x3f\x3b\xc7\x32\xd3\x3c\x0b\x13\x96\x36\x76\x9a\x01\x5a\x57\xc0\x34\xf1\xe5\x2d\xb3\x45\x83\x9b\x5d\x91\xbf\xfd\x63\x93\x1c\x9c\xfe\xab\xf4\x9c\x5b\x84\x7f\x94\xb7\x1c\xaf\xf4\x27\x40\x75\x70\x0f\x75\xb5\x6d\xa8\x52\xe3\x93\x69\x49\x1c\xa4\xc8\x94\x08\x1a\xc7\xab\xce\x09\xd0\x1c\xa5\xd6\x3b\xb2\x79\x03\x4b\xa1\xcf\xb9\x44\xb4\xea\x02\xa2\x85\x59\xc4\x9b\xae\x45\xd3\x59\x33\x8f\xb5\x02\x8f\x3b\x6b\xd7\x92\xd1\x77\x57\x6e\x30\x69\xcb\x4f\xd9\x95\x39\xee\x5e\x44\x97\x03\xce\x22\x70\xdb\x98\x95\x5a\x6d\x40\xec\xcd\xd0\xdc\x19\x7b\xd3\x57\x10\xc6\xec\x54\x3b\x83\x95\x24\x6f\xd4\x75\x4b\x77\x5b\xe1\xc7\xfb\x7a\x12\xc7\x82\x4d\x73\x21\x92\x41\x92\x26\xb8\xa1\x5f\x14\x49\xc9\x19\x2a\x7b\x79\x7c\x63\x67\x19\x54\xc4\xdd\xc4\x57\x46\x1e\xd1\xcb\x9b\x9c\x2c\x65\x8a\x0e\x57\x10\x34\x44\xcf\x33\xce\x06\x97\xf0\x0f\xe6\xbf\x18\xe5\xc5\x24\x2a\x41\x88\xfc\x02\x96\xe6\x01\x96\x77\xf6\xad\x6b\x5b\x9c\xd7\x1e\x3f\xb7\x62\x79\xbe\xb5\xf6\x8d\x65\xde\xd2\x8c\xab\x94\x22\xbe\x5e\x89\xac\x57\xb8\xeb\x18\x5d\x57\xc1\x4f\x67\xa9\xce\x13\xd7\x55\x6e\x15\x14\x3c\x4d\xc0\x11\x7f\xc0\xd3\xfc\x82\x5d\x24\x69\x2a\xe5\x0d\xf3\x92\xa3\xde\x45\xb4\xc7\x8f\x75\xc1\x1c\x5c\xa2\x57\xa6\xcd\x98\x6f\x4e\x03\x88\xe6\x87\xaa\x69\xfa\xed\x63\xd8\xa0\x04\x94\xa4\xf5\xc6\x2c\xba\x58\xdb\x9b\x58\x70\xcf\xde\xc4\x2f\x50\x8f\x8c\xfe\x67\x7c\x4a\xf4\xbf\xea\x97\xc7\xca\x77\x6d\x6b\x41\x0a\x88\xa1\x81\xfe\x3a\x4a\xf9\x07\xfb\x4b\xbf\xb1\xeb\xdf\xe6\x89\x54\x7f\x30\xef\xae\xa6\xd5\xc0\x73\x9c\x2e\x33\x45\xde\xa7\x04\x1f\x79\x91\x41\xac\x11\x72\x1d\x83\x58\xa1\xc8\xe1\x08\xc1\x92\x4c\x24\x31\x67\xf8\xb0\xc0\x87\x25\x6c\x79\xec\x59\x5e\x30\xde\x3d\xed\xee\xb0\xd5\x8f\x7a\x36\x76\xd8\xf1\x5a\x9b\xad\x9d\x5c\xad\xb2\xbd\x7f\xb2\xd5\xc0\x7c\xed\xb0\x35\xb6\xb6\xbb\x1a\xe0\x09\xb8\xec\x87\x18\x43\x17\x48\xee\xb0\xcd\xa0\xe6\xbc\xd7\x63\x81\x4e\xcc\x23\x29\xa8\xd3\x5d\x18\x59\x50\x4b\x8d\x69\x54\x80\x29\xb6\xdc\xee\x06\xb3\x24\x85\x3b\xf3\x30\x2f\xe4\x95\x43\x53\x03\x15\x05\xe8\xd7\x46\xe8\x61\x47\x53\x1d\x06\xc1\x5f\x4f\x34\xee\x82\xf0\xe2\xba\x86\xb1\x55\xd4\xeb\xaf\xfa\xa5\xcd\x57\xd4\x4f\xb4\xf7\x58\x83\x04\x36\x84\x7f\x6e\xd6\x8a\xa5\x8a\x6e\x29\x2a\xcb\x68\x38\x9e\x40\x26\x15\x88\xde\xa0\xdc\xce\xd2\xbc\xa0\x1f\x92\x49\x74\xca\xe9\x07\x3b\x2d\xf6\x5b\xc1\xa7\x3c\x52\xed\x98\x1e\xd5\x12\xc5\xde\xd4\xdb\xac\xad\x22\x70\xef\x0d\xf6\xac\x9b\x70\x57\xe9\x2d\x34\xa4\x17\xf6\x2d\x34\x65\x76\x9a\x5b\x68\x4b\x6d\x4e\x37\x68\xc9\xec\x21\x37\xc1\x46\xee\xfd\x1d\x94\x29\x0c\xbb\x5d\x4e\x17\x4e\x3e\xe1\x10\xdd\x14\xdd\x92\xb0\x21\x7d\x57\xa6\x15\xf5\xe3\x3e\xfd\xd6\x28\x93\x49\x92\x9d\x76\x4c\xf8\x49\x5a\x88\x65\xcf\x54\x91\x2a\x81\xf7\x7c\xce\x63\x15\x59\x0e\x2e\x79\xb8\x94\x27\x49\x1a\xa9\x78\xe4\xee\x13\x3e\x18\xb3\x76\x86\x91\xe0\xfa\x7e\x1e\x5d\xba\x03\x30\x86\x96\x1a\xff\x2c\x9a\xf0\x2f\x8a\xbb\xb9\x9f\x4a\x61\xf8\xfa\x88\x2b\x0c\xf0\x5d\x3b\xc9\xb3\xce\x30\x9f\x81\x91\x08\x99\x27\x5d\xb6\x2f\x8b\x6e\x09\x03\xd0\xd0\xf8\x74\x18\x25\x69\xda\x99\xe4\x31\x77\xfa\x97\x5f\x5f\xe4\x31\xbf\x9d\x9e\x1b\xd3\x34\xba\xec\x88\x32\x2a\xdd\x5e\xe4\xe7\x23\xf9\x15\x3f\xde\xa8\x97\xab\xea\x19\x8f\xdc\xf0\xc1\x6c\xb3\x97\x76\xff\x4d\x67\x85\xf9\x81\x66\x1b\xe6\x67\x75\x57\xcd\x04\xf7\xf6\x4b\x6a\x8a\xb1\x44\x47\xb5\x4b\x79\x99\xe3\x3f\xf4\x28\x92\x90\xd3\x1f\xc5\x53\xf7\xe4\x4f\xb2\x61\x3a\x8b\xb9\x2f\x0c\x59\x2d\x98\xaa\xac\xca\x1b\xa4\x15\x3c\x2f\x9d\xc7\x11\x72\x6a\xfa\xdf\x3f\x56\x0e\x0f\xec\x6a\xc7\xef\xba\xfe\x6c\x53\x66\x53\xbe\x78\xe9\xec\x57\xb4\x14\x3e\x99\xf6\x46\xb9\x5c\x1e\x1f\xe9\xc6\xa9\xcc\x35\x61\x6f\x6c\x6b\x35\x55\x12\x49\x38\x2c\x52\x3f\x55\xe1\x85\x36\xe1\x84\x32\xfc\xd5\xd0\x3b\x71\xc1\xcb\xe1\xd8\x36\x09\x3f\x75\x21\xe2\x6d\x0d\x46\xd5\xca\x89\x26\x49\x7a\xa9\x0b\xf0\x97\x2a\x92\xbb\xfe\xbf\x75\x6f\xd4\x2a\xe8\xc6\xeb\xcb\x33\x31\xa2\x3f\x0d\xa1\x40\xd0\x45\x42\x9d\x16\xf9\xc5\x8e\xb2\x80\x95\x7f\x2b\xfc\xc0\x18\x76\xc7\xb1\x8c\x6d\xfb\x3b\x07\x16\x9a\x0f\x9a\x86\x45\x34\xd5\x65\xf2\x6f\x4d\x8b\xd4\xf6\x23\xff\xd6\x94\x1b\x17\x49\x76\xa6\x0b\xf0\x97\xc1\x13\x0c\xc5\xcc\x8c\xf2\x74\xb4\xc3\x1a\xf0\xad\x23\x7f\x34\xcc\xf6\x38\x11\xa6\x00\x7e\x35\xf4\x02\xcb\x4a\x10\x93\x54\x99\xfa\xdd\xa0\xab\x8d\xde\x15\xbf\xb1\x0c\x30\x75\x19\x4f\x7e\xe5\x59\x9c\x17\x2a\x4d\x4e\x61\x52\x19\xeb\x82\x5a\xdb\x9d\x75\x6d\xe3\x73\x6e\xe0\x5c\xfb\x9d\xdf\x92\x34\x1e\x46\x45\xdc\xb4\x8d\xcd\x33\xf7\x31\xe0\xca\xee\x06\x42\x31\x86\x8c\x7d\x5c\x63\x20\x62\x37\xe3\xbb\x90\x9a\x26\xec\x63\x5d\x8d\x4f\xe9\xf2\xc1\x8d\xb5\xdd\x4f\xab\x55\xe7\x83\x0a\x21\x8d\x55\x99\x43\x6b\x40\xd6\xf5\x32\xc5\x1c\xb9\xc4\x8b\x4a\xd1\x52\xc5\xe8\x84\x4b\xb6\x13\xde\x80\x5d\x8c\x79\x06\x8f\x00\x0b\x62\x18\xcc\xd5\x42\xb9\x53\x5e\xab\x8d\x5a\x90\xa4\x09\x34\x6d\x67\xfc\x72\x54\x44\x13\x4e\x95\x9b\x3a\xaa\x0d\xc3\x9c\x5b\xf7\xd5\xa8\xba\x38\xaa\xee\x50\x08\x76\xdf\x00\xd9\x08\x45\x5e\x60\xfe\xff\x98\x1b\xd6\xfc\x97\x07\xe5\x59\x06\x2e\x4b\xaf\x30\x4b\x3c\x89\x25\xa4\xe2\x28\x62\x84\x2a\x0c\x57\xcb\xf6\xf4\xf8\x9d\xcf\xb0\x7c\x9d\xd0\x91\xa0\xc9\x74\x6a\xde\xbd\xeb\x35\xa5\x13\xdc\xb5\x5c\x04\x4c\xdc\x30\x17\x3d\xfd\x3c\x57\x8f\x9f\xf1\x22\xf4\x10\x44\xdf\x30\xa7\x6f\x6d\x23\x17\xc4\x16\xdb\xa1\xe8\xfe\x6a\xfc\x17\x95\x69\x9d\x8b\x92\x83\x31\x84\xba\xb2\xe3\xf9\xf4\x89\x02\xfb\x4f\x2f\x16\x70\xde\x6b\x80\xd6\x34\xba\xe4\xfb\xf4\x89\x99\x8c\x10\x2e\xa2\x9f\x3e\xd9\x14\xfc\xac\x26\x46\xed\x0d\xfd\xe9\xc2\x34\x9e\x7a\xa4\xad\x51\x51\x06\xd2\x8e\xb5\x6f\xdd\xd1\x6e\x6b\xed\x36\x53\x3c\xdc\x62\xc8\xc3\x0a\xbf\x56\x0a\x74\xeb\x8e\x16\x06\xf6\x50\xe2\x2b\x6a\x6d\x52\x55\x49\xd8\xf2\xf5\x61\xcb\x05\x9c\x67\xf3\x8a\x10\xa6\x42\x08\x9f\xf0\xe9\xb9\x51\x5f\x67\x5e\x7f\x15\xe0\x6a\x33\x9a\x46\xe1\x7e\xb7\x6a\x2a\x2c\xd5\xe9\xaf\x8a\x4d\xbf\x46\x98\x8b\x5a\xc7\x48\x24\xf9\x8e\x99\x1d\x02\x01\xae\x12\x3e\x85\x76\x42\x24\xae\xab\xa4\x96\x8a\x4f\x1c\x02\xbe\x72\xb5\x6b\xf2\x4f\xdf\x03\x47\xcf\x5f\x9d\x33\x1b\xe3\xcf\x81\xc1\x65\x46\x6c\x03\x46\x3c\x2a\x67\x05\x67\x25\x06\x58\xc6\x47\x67\xdd\xca\x0f\xc3\x7c\x7a\x89\x11\x56\x0f\x53\x7e\xca\x8e\xd2\x7c\x90\xc7\xe2\x2c\x4f\xd8\xfa\x5a\x7f\x4b\x43\x5d\xf0\x81\x48\x4a\xce\xc6\x65\x39\x15\x3b\xbd\xde\x69\x52\x8e\x67\x83\xee\x30\x9f\xf4\xde\x0b\x54\x55\xf6\x86\x42\x74\x70\xa7\xd1\xb5\xd2\x64\xc8\x33\xc1\xd9\x8b\xe7\x6f\xf0\x53\xcf\x1a\x89\xdb\x95\x50\x25\x66\x60\xf9\x51\xae\x9e\x4b\xd3\x39\x4b\x77\x0e\x69\xab\x22\xf4\xed\xe6\x51\xf9\x32\x22\x74\x85\x10\xd6\x6e\xfe\x79\xf6\x63\x91\x5f\x08\x5e\x27\x44\xf7\xd7\x37\x5a\x01\xe8\xf9\x46\xf6\x06\xac\xf5\xe5\xf7\x33\xb8\x0c\x26\x7f\xd6\x6f\x27\x9b\x15\xd0\x79\xad\x6b\x98\xaf\x98\x97\x10\xa2\xa8\xeb\x18\xdf\x18\x13\x60\x38\xe6\x3a\xfa\x1a\x18\xfa\x51\xca\xd3\xe8\x1d\xc0\x02\x50\x3f\xce\x87\x10\x61\x40\x25\x2b\x3f\x48\x21\x59\x45\xb3\x31\x6d\x60\xc4\x00\xb5\x1f\xdc\x63\xbf\xe1\x02\x67\xfc\x9c\x17\x97\x76\xf1\xe7\x99\x27\xd8\x2b\x12\xea\x94\x17\xec\x1e\x3b\xcc\x86\x58\x97\xc7\x6d\x6d\xd3\x9a\x08\xc4\x36\xee\xb2\xe7\x25\x58\xf7\x0b\x36\x13\x6c\x36\x95\x17\x83\x07\x6b\x7f\x67\x53\x5e\x8c\xd8\x20\xcf\x85\x6e\x45\xee\x0c\x3b\xbd\xde\x7b\x21\x4b\x60\x63\xe0\x88\x2b\xea\x2c\x3a\xa8\x8b\xe9\x44\x10\xd7\xb6\x73\x2e\x3a\xd3\x34\x4a\xb2\x8e\xf6\x47\x57\x3b\xd2\x3d\x06\x57\x83\x34\x55\xc4\x02\xdd\xc0\x59\x96\x5f\x64\x4c\xca\xee\x44\x51\x04\x0f\x47\xf1\x6c\xc8\x59\x34\xc9\x67\x59\xc9\xf2\x11\x36\x40\x2d\x05\xd0\x68\x49\xc2\xd2\x4d\x90\x45\x25\x2b\x66\x59\x99\x4c\xb8\x8b\x7c\x1c\x9d\x27\xf1\x45\x94\x8a\x31\xa4\xa4\xef\x21\xe5\x3a\x48\xb9\x15\xdc\xc0\x74\xc0\x18\x65\x2f\xb0\xa7\xf2\x3a\x75\x4f\x79\xb9\xaf\x3e\xe2\x65\xc1\xcc\x9c\xfe\x43\xcd\x5d\x5b\xc7\xc3\xf0\xef\x83\xba\x4d\xe7\xe1\x3d\x11\x2f\xa3\x97\x4d\xbc\xf5\x01\x49\x8e\x35\x18\x5c\xf9\x30\x66\x1a\xf9\xe0\x67\x69\x7e\x23\xc7\x0b\x46\x5c\x56\x4b\x26\xec\xc6\xd1\x56\x5c\x4e\x3e\x59\x40\x20\xbe\xde\xd1\xef\x69\x06\x4a\x46\x9a\x87\xe2\x2e\x7b\xad\x6a\xbf\x03\x41\xff\x9d\x2c\xcc\xf2\xd2\x36\xe6\x5f\x14\xa9\xa1\xa6\x17\xf9\x30\x60\xff\xfd\x49\x1b\x87\xcd\xbd\x55\xd6\xdc\x6d\x74\x10\xe4\x67\x79\xc1\x04\x2f\xce\x79\xd1\x01\xed\x60\xc1\x33\x1b\x49\x1c\x68\xcc\xad\x6f\x81\xac\xa9\x6d\xb9\x7f\xe3\x18\x01\x4f\x0e\x08\x97\x07\x64\xee\x42\xdc\x2f\x79\xd9\x66\x29\x2f\x05\x8b\x73\x88\x84\x25\x21\x74\x8b\x38\x51\x53\xd7\x5a\x57\x87\x32\xb1\x65\xc6\x68\x1c\xf7\x26\xad\x14\x33\xe4\x65\x03\x3e\x8c\xe4\x41\x72\xc1\xd9\x30\xca\x1a\x88\x06\x9b\x09\xb4\x42\xe9\xf5\x60\x4d\x88\xcb\xac\x8c\x3e\x00\x37\xf1\xee\x69\x57\x72\xd2\xb3\x67\xca\x8f\x50\xcf\x7e\x70\xee\x59\x24\x58\x22\x97\xba\x46\x1b\xec\x8c\xcc\x66\xea\x44\x13\x42\x8a\x26\x19\xe3\x69\xd7\x0d\x12\x49\x86\xba\xa7\xc8\x67\x32\x0a\xce\xef\x9e\xb0\x97\xe2\xad\xee\x0a\xb1\xac\x09\xc8\x05\xdd\xf7\xf2\xfa\x3e\x07\x4d\x0c\xd3\x53\x8b\xac\x8f\x6e\xa8\x0b\x54\x11\xe8\x81\x54\x12\xfc\xb9\x0d\xf8\xa1\x7c\x43\x73\x5c\xbd\xea\x7c\x63\x49\xbf\x82\xa2\x85\xa6\xaf\x1f\x86\xf5\xb8\xf3\x87\x38\xb9\xdf\xec\xb6\x1e\x87\xd2\x3e\xb9\x2b\x5a\xbb\x14\xc9\xfd\x97\x84\x85\xab\xdb\x13\x96\x0a\xc7\xaa\xf1\xaa\xc4\x63\x15\x65\x51\x89\xb9\xa6\xc2\xbd\xa1\x15\x3b\x49\x04\x05\x5f\x75\xd2\xa6\xa1\xd3\xcc\x90\x3d\x66\x43\x37\x4e\x1c\xdb\x01\xa7\x8f\xea\x3c\x7e\x9b\x51\xfa\x6b\x44\x44\x65\x4f\xfc\xff\x82\x7c\xf8\x95\xe4\x37\x2a\xae\x55\xe4\xb9\x05\xf2\xdb\x12\xb2\x9b\x09\xd2\x87\x27\xe8\x54\x25\x8b\x57\xfa\x3f\x79\x90\xa2\xaa\x35\x74\xc6\x2a\x18\xb1\xfc\x61\x5b\xe7\x4f\x69\x83\xf4\xdd\xe8\xe8\xb5\x1a\x25\x74\xbf\x20\x31\xd6\xae\x7b\x04\xdb\xd0\x7b\x24\x54\xbd\x32\xf7\xca\x0b\x16\x31\x0c\x59\x26\x4f\x2f\xf3\x1d\x82\xd8\x36\xfa\x8d\xae\x39\xb9\x2f\x22\x29\x12\x66\xe9\xa5\x22\x2c\x38\x1c\x2b\x3f\x95\x31\x2f\x78\x77\xa5\xea\xa7\xa0\xd5\xb7\x90\xca\x1a\xfc\x11\x50\xfa\x9a\x46\x85\xe0\xcf\xb3\x52\x6b\xd8\xfa\x6b\xad\x56\x5d\x20\x41\xc9\x33\x3f\x81\xfe\xd9\x1c\x7a\xf7\x09\x8c\x95\x0e\x34\x64\x9d\x84\x60\xca\x0d\x29\x0e\x20\x28\x2f\x3f\xe7\x19\x38\x6d\x5d\x80\x61\x6a\x51\xe4\x05\x26\x4b\x9c\x70\xd8\x5e\x45\xdb\x8a\x02\x3a\xaa\x38\x3c\x16\xb1\x3d\xcc\xd3\x00\xc6\x11\x97\x36\x73\x15\x1c\xd2\x38\x7e\x2a\x10\x30\x73\x7a\x1e\xeb\x91\x58\xaf\x60\xc8\xd6\x3c\x8c\x20\x78\x20\x2f\x0a\x57\x18\xb0\x23\x73\x0e\x48\x3f\xfa\xbd\xf6\x42\xfb\x55\xf3\x72\xbd\x60\x12\xc0\xe4\x8e\xb2\xb5\xad\xeb\x98\xe0\x49\xce\x6f\x77\xb8\x61\x01\xc4\xba\xdc\xd5\x8b\x07\x76\x42\x55\x40\xe5\x22\x1e\xe6\xb1\xba\x5d\xc8\xd3\x4e\x9d\x87\xab\xa3\x94\x7f\x58\x95\x5f\x56\x3b\x13\xd1\x91\xbf\x06\xf9\x87\x55\x98\xa1\xe7\x07\xfd\x35\x9b\xf9\x8b\x98\x8a\x6b\xc8\x46\xcb\x60\xd2\x20\xb5\x75\xfa\xa6\x79\xd3\xa3\x11\x0b\xd0\xb6\x6e\xd0\x0b\xe8\x3c\x8f\xc2\x2b\x26\xad\x88\x0b\x14\xaa\xa5\xa6\x7f\x45\xc5\xcc\x17\x5c\x59\xba\x29\x27\xd6\x95\x9a\x71\x29\xaf\xcb\xba\x15\x52\x3d\x9b\xbf\xd1\x58\xf7\xfe\x0b\x28\xf8\x60\x1d\xe5\x45\x69\x0c\x6a\xe5\x0f\xe5\x19\x38\xb8\x64\x68\xcf\xdc\xad\x3c\xa3\x99\x7a\xfe\x0b\x9a\x90\xdf\x64\xf5\x35\x7c\x09\xf0\xb3\x8a\x40\x91\xf6\x92\xee\x20\x88\xb6\x9a\xfe\xe2\xcf\x5f\xea\x95\x54\xa7\xc7\xd7\x89\xd0\xf5\x83\x18\xc9\x38\x0b\xce\xa6\x28\xbb\x77\x61\x48\xf2\x7f\x5a\x35\xa9\xd2\xa6\xd4\xd5\xcd\xcb\x81\xae\x1c\xdc\xdc\x20\xf5\xfa\x23\x75\xaf\xaa\x24\xe3\xbe\x0d\x9b\xed\x6f\x32\x5a\x38\xaa\x5c\x7e\x43\xd7\xc5\x57\x46\x5b\xb2\x5e\xa7\x69\x5b\x54\x71\x63\x8e\xd0\x56\xd7\x57\x2b\x18\x2e\x04\xe5\xa4\x37\x97\xd3\xfc\xb4\x88\xa6\xe3\x4b\x1b\x12\x9b\x4f\x27\xbc\x38\xad\x0d\x19\xb2\xbe\xd9\xaa\xc0\xce\x8f\x9d\xad\x80\xbe\x4e\x8a\xa9\x1e\xfb\x07\xeb\x9f\x0d\xd8\x34\xba\x4c\xf3\x28\x66\xf9\x39\x2f\xc6\x3c\x8a\xf1\x49\x3d\xcd\xe5\xb5\xa9\x87\x03\x4c\x04\xfb\x27\xdb\x38\x1b\x74\x09\x5e\x60\x21\xd4\x24\x22\x95\x42\xe5\x45\x54\x8e\xbb\xa4\x90\xdd\x63\x7d\xbe\xd5\x62\x3d\xf9\x8f\x7b\xe7\xf1\x29\xdb\x9c\x46\x10\xc5\xad\xcd\x4a\xf3\xcd\x46\x45\x7d\x5b\x70\x12\xd0\xc6\x42\x78\x79\xb9\xd9\x63\x52\xa6\x5b\x6c\x61\x60\x18\xf5\xb5\xad\xd6\xa4\x6c\xf1\xfb\x51\x9e\x95\xcf\xc0\x74\x48\x4e\x4d\xc1\x47\x5d\xfb\x45\x03\x56\x60\x9c\x5a\x5e\xf8\xd5\xc6\xea\xeb\x7c\x90\x97\xf9\x6a\x9b\xad\xfe\x9b\xa7\xe7\xbc\x4c\x86\x91\xfc\xf1\xa4\x48\xa2\x74\xb5\xcd\x44\x94\x89\x8e\xe0\x45\x32\x02\x47\x2b\xb7\xb9\x0a\x6e\x47\x4a\xdd\xac\x31\x93\xbf\x29\x5e\xa4\x9c\xc0\xfb\x99\x31\x37\x69\x4f\xb4\x09\xf3\xf1\x37\xb0\x61\xfa\x19\x1e\x5d\x48\x77\xe4\x33\xed\xb5\x0a\x5d\x6d\xc4\xc3\x61\x63\x6d\x8d\x22\x11\x68\xd8\x2b\x7b\x0d\x26\xf8\x55\x64\xf0\x7b\x51\x45\x47\x15\x54\x11\xd2\x2d\x79\x18\x6d\x86\x30\x42\xd8\x1a\x94\x5e\xf0\x38\x99\x4d\xaa\x28\xe1\xf7\x2a\x46\x0e\x7c\xa0\x1d\x0f\xa1\xad\x10\x42\x6e\xdb\x50\x38\x2e\x27\xe9\x33\x8f\x37\xe8\x37\x0d\x1c\x80\xf3\xea\xfa\x7c\xb2\xad\xfb\x0f\x35\x97\x97\x63\xb8\x9a\x83\xae\xab\x6e\xdf\xb5\x5e\x80\xb2\x9d\x36\xa4\x63\xd3\xcc\xdd\x68\xa3\xad\xde\x11\xd8\xf0\xe1\xdf\x84\x0f\xdc\x4f\x6a\x36\xdd\x8f\x48\x0c\xf9\x8d\x22\x88\x01\xe6\x89\x8c\x30\xfd\xf0\x26\x7f\xcd\x27\x4d\x27\xaa\x36\xbd\x1b\xb1\x9e\x4b\x9c\xfb\xac\x51\xf0\x49\xc3\x3f\x60\x61\xa4\x76\xf3\xb6\x63\x53\xd6\xdb\xd8\xcd\x8e\xfe\x43\x99\xe2\x99\xf1\xee\x30\x7f\x61\xeb\xd1\xef\x30\x77\x21\x7a\x94\xd8\xf1\x3f\xf8\x50\x8a\x38\x3b\xd5\x4f\x3e\x24\x52\x6c\xa7\xf2\x45\x9b\x1b\x8a\x69\x1a\x5d\x6e\xee\x18\x41\xc5\x62\xa8\x89\xd8\xef\xaf\xb7\xaa\xac\x5d\x83\xe2\xfc\xe1\x33\x86\x61\x3a\x8f\x30\xfa\xdc\x0e\x6b\x74\xba\x6b\x9b\x7c\xd2\x30\xc5\xc4\x6e\x13\x0f\x91\xfe\xfa\x43\x79\x76\xf4\xd7\x5b\x72\x92\x08\x28\x3a\x80\xfc\x8c\x51\x40\x3b\xdd\xb5\x6d\x52\xa6\x6c\x7f\xd5\xee\xdf\x2d\xf9\x87\xb2\x2b\xf8\x30\xcf\xe2\xa8\xc0\x0c\x31\x57\xce\xf8\x37\xe6\x8d\x7f\x6b\x7b\xc1\xf0\x03\x1b\xd2\xb5\x08\xb0\x3e\x97\x00\x0f\x36\x58\x8f\x6d\x6d\x2f\x1a\xfe\xe6\x0d\x86\xbf\x3e\x6f\xf8\x9b\x5b\xb7\x3a\xfc\xca\xf8\x36\xe5\xfc\x6e\x6e\x7d\xc9\xf1\xf5\xe7\x8d\x6f\x63\xf3\x0b\x8f\xaf\xcf\x7a\x6c\x63\xf3\x8b\x8c\x4f\xca\x6b\xd4\xc1\x25\x34\xbe\xf5\x2f\x3c\xbe\x8d\xf5\xee\x16\xeb\xb1\xf5\xca\x08\x43\xa3\x98\x16\xc9\xc4\x1b\x43\x99\x94\xe9\xfc\x01\xf4\x17\x0c\xa0\x7a\xfa\x5e\x07\xff\xf5\x4d\xc4\xbf\xff\x99\xf8\x8b\xd9\x40\x4e\x03\x71\x69\x0b\x6e\xa2\xb7\xbb\x89\x04\x46\x21\x77\xc9\xca\x2e\xb1\xe4\x18\x06\x79\x3c\x7f\x13\xe8\x2f\x62\xa2\x9b\xce\x81\xc4\xfe\x73\x39\x48\x62\x3f\x77\x89\x2f\xc4\xfe\xa6\xc4\x5f\x03\x16\xfa\xec\x01\x0c\xa3\x29\x75\xaa\x0a\x0e\x61\xd1\x19\x7c\xc3\x21\xf4\xb7\x71\x08\x95\x63\x76\xe9\xbd\x68\x30\x2b\xcb\xf9\x63\xd0\x5f\xcc\x48\x64\x63\x6f\xac\xe7\x6e\x63\x36\x9d\xf2\x62\x18\x09\xde\xb8\x39\xb3\x19\x2d\xca\x55\x1b\x05\x57\x9d\xe2\x7f\x98\xe6\x72\xc3\x04\x9d\x1f\x06\xbd\x35\xf6\x18\x50\x04\x79\x89\x9c\xf0\x88\x54\x79\x72\x9b\xa9\x17\x7a\xf7\xd8\x6f\x07\x3f\xbe\x7a\xb2\xff\x13\xfb\xf5\xc9\x6b\xf6\xfc\xe5\xff\x1c\xec\xbf\x79\x7e\xf8\x92\xdd\xeb\xd9\xb6\xa7\xa8\xcf\x81\xea\xb7\x97\x33\x3b\x2a\xce\x88\x69\x68\xaa\xee\x71\x15\xcb\xd0\x33\x7e\x59\x17\xac\x74\xc3\x3e\xc5\x49\xa8\x79\x8a\x0d\x59\xfe\x5f\xa3\xe8\x79\x85\x8c\xfe\x85\x33\x88\x7f\x05\x0d\x92\xca\x31\x14\x27\xa7\x79\x4d\xfb\xeb\x0f\xd6\x3c\xc0\xb9\x2f\xa9\x00\x61\xdf\x46\x93\xec\xac\xb6\xdd\xbe\x03\x36\xf7\x01\x35\xc9\xce\x0c\xf0\x69\xc1\xeb\x2c\x84\xfb\x0f\xd7\x1c\xb0\x79\x6d\xca\x72\x03\x5c\x80\x3d\x54\x18\xcd\x75\x0a\x35\xaf\xc5\x82\xc7\xd6\xb0\x2f\x9f\x4c\xf2\xac\x16\xcd\xbe\x07\x38\xd7\xfe\x0f\x20\x48\x85\x34\x2f\x5e\x44\x59\x32\x9d\xa5\x18\x85\xb9\x86\x2d\xb6\xbe\x61\x0d\xa1\x1c\x89\xde\x4f\xfc\xfd\x45\x6e\x49\x72\xcf\xb7\xde\xcf\x70\x14\xee\xb0\x46\x71\x3a\x88\xe4\x65\x5b\xfd\x5f\xf7\xe1\x83\x96\xf6\x60\xd3\x67\x4d\x00\x6a\x6b\xb3\x65\xdc\xe6\x44\x34\x48\x79\x1c\x00\xda\x78\xa8\x81\xc6\x09\x78\xab\xd5\x03\x24\x43\xf0\xbb\xab\x07\x88\x93\xf3\x04\x13\xba\xf8\x30\xfd\xf5\x96\x71\x3d\x3c\x1d\x97\x4f\x6b\x01\xd7\x1e\x6c\xb5\x8c\x07\x5e\x92\x4d\x67\x86\x1a\xe8\x3a\xff\x33\xe6\x1a\xf0\xab\x6d\x9a\xf6\xc7\x3c\x9d\xf2\xe2\x0d\x90\x71\x0e\x45\xd2\x68\xc0\xd3\x85\x50\x80\x40\x0d\x94\x9d\x83\x39\xd4\x95\x78\x19\x7f\xc2\x21\x95\x62\x22\x1d\xda\xff\xb3\x66\x6d\x7d\xbb\x35\xc7\x91\xd5\x70\x2b\xee\x05\x7a\x13\x3f\xde\x5a\x3b\x51\xee\xce\xd1\x54\x52\x5f\xaf\x41\x0d\xd0\xbd\x18\x27\xa5\x52\xb9\x44\xd3\xe9\x8f\x51\x51\x69\xa2\xbf\xa6\xdb\x50\x4f\xd4\xcf\x0a\xf0\x71\xf7\xc0\xd6\xd7\xd6\x4e\x34\x7e\xf4\x06\x26\x4a\x3e\xc5\xae\x5d\xf8\x4d\x05\x0f\x8e\x91\x72\x8d\x78\x47\xb0\xfa\xb9\x60\x85\xac\x6f\x6d\xb5\x99\xfd\x9f\x7e\xed\x22\xf1\x00\xd7\xba\xb5\x73\x59\x81\xdc\x0a\x2d\x97\x7a\x28\xba\x66\xea\xa1\xbc\x85\x53\x01\x9c\xbf\x7c\x2a\xe0\xd7\x59\x44\xf5\xa4\xa8\xae\xa4\x7a\xd8\xca\x72\xaa\x07\xad\xac\xa9\xba\x59\x5b\x66\x2a\x96\x59\x5b\x9f\xdd\xfe\xc6\x52\x6b\xac\xf1\xb7\x8d\x35\xf9\xff\x1a\xee\xd2\x72\xf9\xfb\xa1\x59\x36\x35\xeb\xea\xd1\x72\xeb\xea\x51\xcd\xba\xea\xf5\xd8\x9b\xc3\xa7\x87\x3b\xec\xb7\x71\x54\x32\x31\xce\x67\x69\x0c\x26\xae\xb0\x70\x4a\xf0\xe6\x07\xc3\xd8\x51\x5e\xe8\x45\x08\x0d\x3c\x86\xac\x16\x10\x10\x21\x36\xce\x8d\xec\x74\x96\xc4\x7c\xf9\x05\x6b\xce\x5a\x30\xa8\xce\xca\x22\x12\x30\xc3\x4d\x38\xb2\x6d\x14\x67\xb4\x02\xf5\x8e\xf1\x2e\xa9\xf4\x3a\x2a\x93\xbc\x85\xd5\xda\xd5\xed\x69\x90\x42\x34\xc8\x7f\xb0\x07\x9e\xd2\x5a\x8e\xd2\xb9\x3e\x7a\xd1\xb6\x61\xd5\x78\x00\xd5\xa7\x36\x25\xdb\xda\x57\x31\xf3\xb6\xa6\xbe\x7c\xaf\x2a\xb3\x3d\x73\xe1\x53\x5f\xf4\x65\xcb\x02\x54\xeb\x78\x8f\x09\x5a\xa6\x34\x22\xf6\x4e\xa5\x8e\x79\xd5\xd0\xdf\xcd\x46\x46\x30\x30\xdf\x34\x34\x05\x0a\xd5\xf4\xf1\x00\x19\x34\x84\x45\xa5\x65\x53\x82\x26\x4c\x16\x07\xf8\xad\xa1\x74\xa1\x0f\xed\xf7\x2b\x85\xca\x50\xb7\x4e\x63\xe6\xab\xca\x89\x6a\x2e\xda\x97\x53\xf3\xf0\xa2\x8a\x3c\x50\xff\xdd\x11\x78\xa0\x41\x3b\xa2\x6d\x5c\xf3\xf1\xc6\x3c\xc5\x1e\x37\xd4\x5c\x35\xda\xac\x61\x08\x26\x7f\xc0\x30\xe4\x1f\xb2\x1b\xfd\x04\x03\xee\xb4\xe3\x28\xe6\xf2\xde\xf8\x11\xf8\x76\x07\xfe\xb7\x8d\x3c\xba\xa3\x84\x43\x4c\x4a\xa9\x2e\xb7\x5d\x9e\x9d\x77\x5f\x1e\x3e\x3d\x78\x7b\xf0\xf2\x57\x30\xd8\x58\x9d\x16\x79\x3c\x53\x99\x41\x1e\x23\xd2\xfa\x86\x65\x91\x54\xe6\x80\x4d\xec\xf0\x58\xe2\x71\xd2\x6a\xb3\xc6\x8b\xa8\xe4\x45\x12\xa5\x9d\x5f\x9e\xef\xc0\x26\xa1\x46\x83\x84\x7c\xd7\x60\xf7\xf1\xaf\xfb\xac\xf1\xae\x6a\xb0\xd8\x68\xb1\x1d\x6b\x52\xa9\x2c\x41\xb0\x81\xc3\x59\x39\x9d\x95\x9a\x8a\xf5\x0f\x43\xb8\xae\xab\xf2\x87\xd2\x78\x42\xf4\x20\x3b\x39\xe6\x90\x77\x56\x05\x39\xd3\x3d\x3e\x05\xc2\xef\x30\xc2\x46\x72\xeb\xf2\x77\x30\xd5\x0a\x90\x66\x47\xfd\xab\xfa\x87\xb3\x89\x12\x0d\x76\x0e\x72\x7a\x79\xa5\xf0\xad\x6d\x4e\x1e\x39\x32\xa7\x1c\x3f\x2a\x35\x10\x39\x48\x1c\x20\x5b\xa0\x0f\x7a\xb9\xbb\x3b\x20\xf2\x93\x1a\x90\xbb\xcf\xee\xf8\x1f\x6e\xa8\xd7\x59\x51\x91\x8b\xcf\x99\x62\x2a\x1d\x56\xbe\x96\x21\x1b\x96\x21\x1b\x34\x24\x6f\x9c\x8c\x46\xbc\xe0\x99\x9b\xf3\xdb\x7e\x6d\x0e\x22\x01\x29\x4f\x26\xd3\xa8\xe0\x6e\x48\xd4\x3b\x95\xaf\x4c\x03\x12\x43\x24\x12\xc4\x94\xbe\x4a\x82\xd2\xc5\xf2\x9d\xec\xa6\xd5\x1d\x25\x69\xc9\x0b\x92\x1a\x64\xec\x3a\x8c\xab\x06\x74\xc7\xc7\xe3\x19\xb7\x01\x63\x75\xc0\x01\x62\x17\xa5\xd8\x7e\x5f\x1e\x57\x07\x6a\xd7\xb3\x8f\xac\x7e\x61\x33\x83\x88\xd6\x35\x23\x96\xed\x4d\x12\xcc\xf3\xbd\x57\x4f\xa1\x5d\x73\xd0\xdc\x68\x6b\x50\x3d\x39\xa9\x37\xe4\x66\xe6\x6c\x0d\x72\x23\x80\x28\x12\xf7\x59\x03\x15\x9d\x72\x37\xd0\x48\xca\x8d\x63\x94\xa7\x69\x7e\x21\x7f\x8d\x67\x72\x19\xc9\x1a\xba\x69\x93\xec\xa3\xcd\x1a\x47\x9c\xa3\x34\xa2\x76\x7b\x68\x4c\xb4\x19\x1e\x81\x6d\x96\x17\x4c\x9e\x42\x6d\x16\x09\x25\xf2\xf3\x18\xc3\xe8\x4d\x34\x42\xb3\xa4\x87\xb5\xba\x8d\x13\xd5\xf6\x1f\x59\xa3\x45\x37\x23\x3a\x3d\x55\xea\x93\x8d\xda\x3f\x7a\xdb\xee\x06\xa6\x0f\x75\x45\xec\x40\x53\x74\xa3\x77\xcf\x4f\xbf\x29\x03\x59\xdf\x98\x3e\x28\x9c\x03\xd1\x6f\x07\x80\xea\xdb\x90\x5b\xdb\xa2\x26\x94\xde\xc7\x7d\xc2\x77\x40\xa4\x50\x34\x47\xeb\x7a\x85\x31\x4d\xe6\xa9\x71\x9b\x1b\xad\x56\xab\xa2\x15\xfe\x26\x73\x80\xb9\xf5\xeb\x14\xac\x0f\x6a\xe0\xe7\xe9\x55\xbd\x96\x4d\x0b\xfc\x43\xc9\xb3\xb8\x56\x97\xbb\xe9\x03\xce\xeb\x43\xb7\x35\x4f\x57\xfb\x22\xf9\x90\x64\xe2\xab\xa6\xcc\xa2\x1d\x37\x21\x2d\xf8\x34\x4f\x32\x39\x2d\x2a\xa3\x5e\x9b\x4d\xa0\x90\x08\xd7\x65\x9e\xa7\x83\xa8\xd8\xf5\x0d\x4b\x34\x15\x7c\xe9\xe1\x74\x56\x96\xbc\x10\x24\x9d\x9a\xfa\x82\xc6\xa7\xc2\xcb\x90\x2d\xba\x2a\xa4\xe6\xcf\x7c\x24\x69\xa3\x10\xe9\x42\xe6\xe5\x7b\x6c\x7d\x37\x08\xfc\x5a\xe9\xe4\xe6\x43\x1f\x93\x21\x76\x67\xd3\x66\x43\x4c\x1a\x2d\x1d\x79\x40\x6d\xd4\xb6\xf3\x1d\xbf\xb5\x8d\xb6\x0f\xf6\x1a\x85\x40\x1f\x4e\x9f\x41\xbb\xee\x49\x87\x48\xec\xd2\x67\x26\x45\xcc\x1d\xd6\xd4\x74\x25\xd8\x4c\x92\x4c\x3f\x6b\x6d\x6d\xab\x5a\x5a\x56\x73\x98\x9b\x58\x29\xa9\x56\xda\xcc\x1f\xea\x07\xd1\x80\xc7\x30\x08\x5c\xd0\xcc\x8b\x84\x67\xa5\x0a\x6e\x98\x46\x59\x2c\x86\xd1\x94\xb7\x1a\xed\x50\xe7\x9b\x0f\xb1\xf3\xd6\xe7\xf7\x2e\x09\x1d\x6c\x7b\x7b\xd3\xb4\xad\x6b\xb7\x50\x1c\x52\x8c\x17\x78\xb6\xea\x7f\x63\x71\x9a\xf5\x2d\x21\xbf\xf8\x89\x5f\xfe\x32\x19\x14\xd1\xa1\x64\x08\x88\xa4\xb0\xd6\x5d\xf7\x00\x5e\xf1\x6c\xe6\xc3\xf4\x37\x29\xd0\x93\xc9\x40\xce\xce\x11\xfc\x70\xc0\xd6\x77\x2b\x8b\x17\xa1\x9a\x8e\xd5\xea\x71\xb3\x92\x6a\xff\x1f\x7b\x6c\x8d\x3d\x26\x57\xac\x1d\x27\xb3\x3e\xb0\xc6\xf4\x03\x48\x04\xc1\xca\xfd\xda\xca\xfd\xc5\x95\xd7\x6b\x2b\xaf\x2f\xae\xbc\x51\x5b\x79\xc3\x54\x76\xf5\xad\xb2\xa9\xf0\x7c\xdc\x67\x0d\xc9\xe3\xc1\x7e\x36\x6b\xfb\xd9\x5c\x8c\xe4\x56\x6d\xe5\xad\xc5\x95\xb7\x6b\x2b\x6f\x2f\xae\xfc\xa0\xb6\xf2\x83\x65\xc8\xe3\x73\xe3\x3c\x0a\x3d\xac\xed\xea\xe1\x62\x3c\x1f\xd5\x56\x7e\xb4\x04\xf7\xd5\xf3\x6e\x7f\x19\xe6\x9d\xc3\xbd\xfd\x85\x54\x0a\x2e\x47\xa0\xd3\x09\x4d\x91\xa7\x5c\x1a\xb1\x8e\x60\x7b\xec\xb8\x91\xe5\x19\x6f\xb4\xdd\x85\xba\xd6\x66\xfd\x36\xdb\xd0\xdd\xf4\xe1\xff\xf0\xef\x75\xf8\xbb\xd3\x6f\x05\xab\x6c\x11\xb0\x75\xfd\xf7\x06\x56\x59\x0f\x57\x79\x48\xc0\x36\xc9\xdf\x1b\x35\x55\xd6\x01\xac\x83\x08\x6d\x92\x2e\x25\x96\xf2\xaf\x40\x9d\x0d\x00\x53\x75\xb6\x48\x9f\xb2\xce\xe6\x12\x75\xb6\x55\xdb\xa6\xd2\xc3\x70\x25\xc4\xa7\x83\x43\x7f\x80\x95\xfa\x86\x6e\xb2\x95\x40\xa5\x2d\xac\x84\xe4\x7e\x48\x2b\x6d\x20\x7a\x21\x32\x6c\x01\x52\xaa\xd2\xa3\x36\xeb\xaf\xd3\x4a\xdb\xe1\x4a\xdb\xb4\x12\x74\xb3\xa9\x6b\x6d\xe2\xa0\x36\xc2\xb5\x1e\xb4\x59\x07\x27\xa7\x2f\x47\xbf\x45\x6a\xad\xaf\x85\x6b\x3d\x80\xb1\xe8\x5a\x12\xbb\x07\x9a\x27\xb6\xda\x6c\x5d\x4e\xe3\xc2\x5a\x72\x28\x8f\x68\xad\xcd\xda\x5a\x8f\x6c\x2d\x89\x54\x9f\xd6\xda\x0e\xd7\x7a\x88\xb5\x90\x81\xfa\x0a\xa9\x75\x3d\xdf\xeb\x0f\xdb\x6c\x2b\x5c\x4b\x52\x4e\x57\xdb\x46\xac\x4c\xb5\x8d\xb5\xfa\x6a\x7d\x5b\xed\x01\xa2\x65\xab\xad\x87\xab\x3d\x72\xab\x3d\x44\xbc\x0c\x7f\x6d\x6c\xb6\xd9\x76\x4d\xb5\xf5\x36\xeb\x6c\x63\x35\x49\xc3\x47\xb4\xda\x76\xb8\x5a\x5f\x11\x5d\xd5\x83\xa9\x35\x1b\x81\xe4\x8e\x87\x6d\xf6\x60\x89\x7a\xb2\xce\x06\xa9\xb7\xb9\x36\xa7\xde\xa6\xad\xb7\xde\x66\x1b\x5b\xb4\xde\x7a\x4d\x3d\xb5\x6e\x3b\x0f\xb0\xde\x06\x0e\xc9\x2c\x86\xcd\xcd\x36\x7b\x58\x57\x6f\xcb\xd6\xdb\xc4\x21\xd9\x7a\xdb\xb2\xde\x49\xf0\xfe\xa3\xf6\xcc\x4a\x84\xa8\xfe\xcd\x82\xac\x06\x2d\x70\xfa\xf2\x0e\x86\x4d\x74\x55\x0b\x75\x16\x15\x1b\xad\xee\x4b\x70\x84\xee\x82\x93\xb2\x94\x15\x3d\xfc\x6e\x16\x51\xaf\xd7\x63\xeb\x6b\xdd\x7e\x77\xbd\xbb\xc9\x68\x47\x4d\x74\xbf\x6e\xc1\x79\xf2\x3d\x36\x53\x6b\xf5\x21\x6f\x94\x0a\xa6\xa9\xfe\xed\x1e\xb5\x59\x03\x1b\x54\x02\x3d\x34\x4b\x6e\x60\x4e\x37\xf6\x4d\x8a\x8b\x34\xc9\xca\x8e\x7a\x69\xeb\x64\xfc\x03\x26\x21\x67\x59\x0e\x41\x74\x3b\x4a\xad\x45\xdf\x72\x94\xab\x38\x78\x58\xcb\xbf\x54\x74\x9c\x56\x80\x5a\xdf\x58\xbc\x2f\x98\x00\x15\x3c\x39\x12\xa0\xf0\xfa\xf3\x39\xa4\xba\xb9\xc8\x8b\x33\x15\x34\x39\x1a\x88\x3c\x9d\xe9\xc4\x6e\x02\x2d\x42\x14\x18\xde\xd4\x26\xf9\x20\x49\xf9\x91\x7e\x78\x7b\xb4\x06\x11\xbc\x27\x3c\x9b\xed\xb0\xfe\x1a\xfe\xd2\xaf\x88\xfd\x3e\xfe\x8e\x8b\xe8\x82\x17\x87\xe7\xbc\x80\xd8\xee\xfd\x75\xfc\x9c\x45\xe7\x4f\xa1\x64\x87\xf5\x37\x14\x64\x12\xa5\xf9\xa9\x85\xdc\xa4\x9f\x77\x58\x7f\x0b\x7f\xa7\xd1\xa5\xac\xb5\xae\xfa\x9b\xe6\xd3\xfc\x1c\x3e\xa8\x0e\x45\x16\x0d\xcf\xe0\xa2\xb9\xae\x10\x94\x97\xad\x32\x99\xee\xb0\x8d\xb5\xb5\xb5\x95\x70\x6e\x71\x1c\x67\x75\x59\x7e\x9b\xd1\x55\x08\xe2\x2a\x28\xc2\x93\x34\x05\x4d\x6c\x9e\x49\x59\x0f\x23\x44\x43\xd8\xdd\x8c\x3d\x8c\xa7\x4c\xfc\xef\x2c\x2a\x38\x68\x78\x81\xcb\x4f\x8b\x04\xd3\x0b\xe0\x94\xb6\x19\xe4\xf0\x2e\xdb\x70\x65\x8e\xb9\x38\x2b\x21\xf7\xb6\x6c\x59\x07\xe9\xd3\xfa\xce\x6e\x92\xf7\xe0\x15\x56\x36\x24\x7a\x69\x74\x99\xcf\xca\xde\x84\xcb\x51\x8a\xce\x19\xbf\x84\xef\xe0\xd6\xf4\x37\xff\x6b\x47\x23\xd0\x91\x08\x88\x15\xc6\x66\x59\x52\xee\xb0\x87\x81\xb0\xd3\xfd\xdb\x0c\x88\xf2\x1f\xb4\xd8\xf4\x54\x5f\xff\xe2\x19\x2f\xa2\x92\xef\xa7\x91\x10\x2f\xa3\xc9\x97\x36\x58\xfc\xe2\x1a\x36\x4c\xd5\x3b\xe0\xe9\xab\x74\x76\x9a\x64\xcf\xd2\xfc\xe2\x35\x8f\x86\xf0\x3a\xf9\xe6\x72\xca\x05\xa4\xd3\x2b\x2f\xa7\xfc\x2d\xf8\x36\x1f\x8d\x39\xaf\xdb\xe3\xfb\xeb\xeb\xad\xee\xf5\x1b\xfb\xf4\x29\xd8\xda\x5a\xab\x1b\x65\xda\xed\x77\xc9\x56\x4f\xfd\xe9\xa9\x3d\x8d\x36\x97\xc6\xb4\xda\xe6\x2d\x22\xfc\x7a\x96\xde\x06\x8e\xd0\xcc\x32\x68\xa9\xc1\xe4\x05\x64\xdd\x80\x97\xe9\xb5\x5d\x38\x5f\x74\x64\x99\xc8\x1e\xbe\x17\xe3\x64\x38\xd6\x55\xb8\x90\xab\xfd\x7f\x67\x9c\x0d\x25\x21\xe0\x01\x47\xc0\x96\x14\xb3\x3c\x63\x43\x6c\x4f\x74\x65\x5b\xbf\x61\x74\xf0\x0b\xdb\x1d\x3d\xd1\xd5\x52\x8a\x31\x7a\x80\xae\x89\xc1\xce\x04\x2f\xb1\x05\x1b\xad\x0f\x3e\xc2\xa1\xe7\x80\xcb\xed\xef\xe8\xe8\x35\x06\x38\x89\x86\x63\x88\x94\x06\x71\xd7\x7a\xbd\x15\x88\x16\xd3\x10\x72\xff\x4c\x26\xd3\x22\x3f\xe7\x31\x3b\xe7\x90\x67\x93\xe5\xa3\x15\xb2\x2f\x92\xe0\xa5\x43\x21\x92\xec\xbd\xe8\xbd\x17\xa2\x37\x48\xf3\x41\x6f\x93\x6f\x47\x6b\x5b\x71\xbc\x31\x7a\x30\xd8\xde\x7a\xb0\x3e\x8a\xe3\x8d\x68\xb0\xde\xdf\x7e\xb8\xdd\x8f\x1f\xf1\xcd\xcd\xed\xe1\xfa\xda\xc6\x46\xbf\x27\x8a\x61\x6f\x56\x26\xa9\xe8\xd5\xec\x12\xdd\xf7\xc2\x57\x87\x55\x60\x9a\x56\x75\x2d\x07\xea\x4e\xd0\x9c\x67\xd2\x3d\xef\x99\x54\xee\x00\xca\x5b\x1b\xc3\x11\xfa\xc9\x76\xb5\x1c\x55\xe1\x85\xfb\x7b\xac\x4f\x12\xf6\x55\xca\xff\xc9\xd6\x9d\x84\x7d\xf3\xa4\xb0\x61\x9e\x89\xdc\xe4\xc8\x55\xbf\xf0\xb5\xa9\xe9\x3d\x07\x5e\x28\x13\x22\x0c\x59\xcb\x63\x36\xc9\x0b\xce\xca\x71\xa4\x23\xcc\xab\xcc\x8f\x30\x77\xc0\x08\x96\x03\xed\x20\xba\x8d\x36\x6b\xfc\x9e\xcf\xb4\x91\x12\xc4\xfb\x91\xa7\x48\x9e\x85\x2b\x48\xae\xc5\xc6\x12\x9e\x95\x4c\x24\x31\x87\x36\x9e\x8f\xd8\x65\x3e\x63\x71\x8e\xef\xdc\x17\x89\xe0\x6d\xf8\x52\x46\x67\xf8\xda\x58\x24\xe2\x4c\x72\x26\x60\x3d\xcc\xb3\x51\x9a\x0c\x21\x91\x09\x5d\x19\x18\x8b\x42\x4d\x8a\xf7\xb6\xe8\x85\x98\xd7\xd1\x70\xcc\xf3\x31\xe6\xc2\x14\x72\x77\x34\x06\x49\x84\x25\x70\x9e\x6e\xe1\xb5\x96\x36\xfa\x0f\xd6\xe7\xfd\xea\x5b\xad\x1c\xf8\x04\xde\x2c\x60\xb4\x11\x9b\xf0\x49\x5e\x5c\xb2\x94\x47\x67\x40\xae\x37\x6a\x61\xee\xdb\x65\x6c\xec\x3a\x04\xae\xe0\xd3\x22\xbf\xc0\x1c\xd8\x93\xd9\x70\x6c\x69\xe1\xbe\xb2\x1a\xbe\x5b\x8a\xcb\x49\x98\x7f\x95\x8b\x7f\xd8\x50\xe1\xfc\x15\x26\x4e\x5e\x46\x08\x13\x0f\xa7\xcd\xdd\xbb\x48\xd8\x6e\x0e\xce\x3f\xa2\x3b\xe1\x65\xe4\x3d\x97\xf3\x32\x82\xcb\x9e\x0f\x46\x52\x92\x1e\x45\x59\x52\x26\x7f\x22\x43\xa8\xc8\x53\x91\x30\x39\x0a\x67\x02\xcd\xde\x62\x7e\xce\xd3\x7c\x3a\x91\x1c\x56\xe6\x26\xa1\xc2\xd8\xf0\x21\x8f\x6d\x9b\x96\x7d\x74\x32\x60\x85\x89\xfc\xc7\x04\xb4\x93\xfb\xea\x6b\x08\x6a\xd7\xec\x1d\xdf\x59\xfd\xdb\xf7\x7f\xbf\xdb\x68\xb6\xee\xdd\x6f\x77\x7b\x3b\xbb\xec\x1f\x7b\xff\x7c\xfc\xc3\xf1\x1f\x7f\xfc\x71\xf2\x7f\xdf\x7d\xfc\x74\xf5\xff\x3f\xe9\x9d\xb6\xda\xac\xd1\x51\x21\x62\x09\xc1\xa0\xed\xfb\x0c\xc3\x24\x9a\x5c\x09\xf4\x43\x88\x90\x3a\x37\xfc\x02\xf8\xab\x2f\xf4\xe4\xdb\xbf\xcd\x58\x3e\x5f\x5f\xac\xfc\x62\xee\x3d\x5f\xea\x09\xf8\xbf\xdc\x19\xe7\x1b\x75\xd6\x70\x0c\x5b\x41\x12\x16\xfb\xf2\x88\xd3\xb9\x62\xc5\x61\xa1\x7e\x7b\x11\x9d\x50\x74\x68\x82\xdd\x6d\x1b\x76\x0a\x6a\x14\xa5\xd2\x44\x9a\x60\x2d\x5e\x5b\xd5\x88\x2d\x1e\x00\xb6\x2b\xf7\x64\xaf\x80\x6c\xce\x77\x00\xa6\x2b\x87\x59\x24\x31\x17\x10\x1a\x2f\x53\x52\xb1\x5f\x78\x2c\x0b\x4e\x2a\x5b\xb5\xf3\xbc\x6c\xad\x9e\x6c\x9b\x7b\x2c\xd8\xd0\xae\x37\xd2\xdf\x92\x72\x7c\x48\x2a\xd5\xbd\xee\x5f\xb5\x55\x05\xbd\x07\x86\x2c\xb9\x4c\x5f\xad\xee\x28\x2f\x0e\xa2\xe1\x98\xd8\x73\x9d\xf1\x4b\x3b\x8a\x1b\x1e\xba\x01\xdc\x21\x5a\x73\xf0\xe8\x95\xd7\xfe\xb2\xb8\x04\xbb\xa8\xdc\x50\xc8\xa4\xe1\x87\x43\x35\xce\x39\x9e\xb9\xfc\x43\x22\xca\xae\x71\xe2\xec\xf5\xd8\xf7\xf2\xd2\xf0\x2c\xf9\xf0\x82\xb3\x0e\xe4\xaa\x62\x89\xc8\x1a\x25\x13\x93\xa8\x28\x19\xcf\xf2\xd9\xe9\x58\x41\x37\x9e\xa9\x83\x09\xec\x34\xd5\xd6\xfe\x0e\xfe\xc8\x47\xec\x9d\x37\x21\x5d\x6a\xc3\xf5\x6e\xbe\xe9\x14\x0b\x4d\x97\xce\x57\x54\x6b\xd1\x59\x4f\xa6\xdc\xf9\xad\x85\x29\x3d\xb7\x0e\x8f\x39\xd5\x2b\x61\xbc\xd0\x7e\x11\x96\xd4\x8e\xfa\x17\x69\xa7\xce\x7c\xeb\x54\x0b\xc9\xa0\x77\xec\xcb\x9c\x63\x19\x31\xe6\x93\x24\x3b\x3d\xc8\x94\xd1\xff\x52\x8b\x4f\x1f\x91\x01\x45\x83\xbf\x25\xcc\x3d\xa7\x3e\xfb\x1c\xfd\x0f\x47\x23\xab\x3b\x1a\x71\x16\xe0\x4e\x44\x6d\x1e\x9b\x90\x33\xcb\x98\x79\xd2\x6e\x12\x2e\x9a\x65\x54\x9c\xf2\xb2\x6d\x82\xbf\x91\xe4\xe0\x2a\x31\x38\xfb\x07\x16\xda\xa4\xe0\x90\x10\x1c\x6d\x49\xb9\x18\x16\xc9\x14\x3d\xff\x30\x24\x5c\x72\xb2\x4b\x3e\x77\x79\x36\x9b\xf0\x02\xc2\x86\xee\xd5\x7c\xff\xf4\x49\x85\x33\xa4\xe5\xf2\x6e\x90\x9c\xce\x74\x4d\xc8\x36\x04\xbb\xe8\x2a\x8c\x7e\x15\x25\x44\x0d\xde\xa2\x55\x2f\x8a\xa4\x74\xaa\x85\x49\xac\x47\x4e\x6a\x9e\xf1\x4b\xfa\xbb\x85\x99\xc0\x2a\x77\x8c\xfd\x3c\x13\x65\x31\x1b\x96\x79\x01\x84\x2b\x73\x88\x23\xd8\x06\x9f\x8d\x64\xf8\x4a\x93\x52\x49\xe4\xaa\xb8\x55\x25\x3e\x69\xc8\x26\x2d\xa3\x4d\xb6\x76\x55\x76\x7c\xd2\xee\xbc\x56\x5c\x14\x4c\xae\x32\x02\xb1\x0b\xa7\x6f\x93\xb8\x91\x46\xc3\x5a\xa5\x94\x0b\x35\xdf\xdd\x34\x1a\x96\x24\x0a\xb1\x52\xb3\xd4\x34\xbc\x56\x85\x9c\x1f\xb2\x58\x01\xd9\xcc\x37\xfa\xb8\x0e\x3e\xff\xd8\x70\xc8\x47\x49\xcc\x7f\x8c\x6a\x33\xe0\xf5\x2b\x90\xf3\xd0\x50\x20\xa6\xca\xbf\x79\x14\xd7\x06\x7e\xde\x7e\xb0\xe9\x01\xce\x6b\x1a\x21\x4c\x85\x17\x51\x52\xe7\xae\xbb\xfd\x60\xdb\x01\x9b\xd7\xaa\x2c\x37\xc0\xfb\xf3\x9c\x80\x1f\x7d\x1d\xff\x5c\xdb\x41\x99\x4b\x9e\x9c\x4d\xe4\x3a\x85\x7c\xe1\xcd\x08\xe2\xdf\x02\xbb\xc3\x87\x6e\x22\x6c\x41\x75\x63\x6a\xb3\xa8\x00\x92\x1a\x20\xb5\x3f\xb5\x70\xcb\xb2\x1f\xcc\x86\x25\x2b\x1c\x27\xf2\xe4\x8c\x8a\x02\xf6\x29\xb3\xb6\x65\x11\x49\x43\xa8\xbe\x22\x1e\xa3\x22\x9f\x00\x12\x2a\xd7\x9f\x1d\x04\x5c\x3a\xf7\xa3\x34\xdd\x1f\xf3\xe1\x59\x33\xc9\x44\x19\x65\x43\xde\xa6\xeb\x4d\x8f\xe9\x8e\x29\x66\xfa\x8f\x7c\xe4\x00\x4a\x48\x0c\x48\x2c\xaf\xa9\x92\xdf\xd1\x90\x78\x75\x3f\xca\xa4\x88\x22\x4f\x2b\x16\xa9\x9b\x6e\x44\xb5\x8d\xab\x55\xd4\xa6\xb9\x10\xc9\x40\xde\x2b\x4d\x07\xa8\xa5\x6c\x0a\x9e\x8e\xda\xd0\x98\x41\x4d\x7e\x72\x7b\x7f\xcd\x95\xa9\xbb\x42\x01\x12\x36\x8c\x23\x10\x80\x06\x9c\x67\x2c\x91\x57\xf8\x28\x4d\xe4\x5d\xbd\xc3\xc4\x6c\x0a\x49\x08\x29\x84\xec\x81\xc7\x88\x9a\x89\x37\x9b\xa6\x92\x65\x74\xb4\x68\xf8\x2d\x0f\xf7\x55\xf4\xee\x59\x95\x47\x41\xa5\xcc\x8e\x92\x3d\xc6\xcf\x3b\x90\xfa\xd3\xe3\xa8\x24\x1b\xf3\x22\x29\x45\x53\xcc\x06\x70\x08\xb6\x11\x2d\xf8\x5b\x0f\x55\x0b\x18\xa6\x00\x85\x4f\xd3\x85\x4a\x80\x47\x0b\x75\xda\xc9\xe0\xd4\x1c\x49\x58\x79\xe6\x17\x5c\x80\x86\x74\x32\x13\x25\xe3\x09\x78\x2e\x0d\x38\x26\x2e\x86\x68\xdb\xba\x8b\x36\x88\x9b\xab\xca\x9f\xc7\xc1\x05\x48\xa5\xb1\xb7\xe7\x81\x8d\xe6\xaa\xae\x30\x04\x41\x07\x5d\x7a\x84\x7c\x04\xbd\xa1\x9a\xf9\x1d\x38\xad\x41\x66\xb0\xc4\xb1\x07\xb0\xf2\x40\x69\x33\x7d\x70\xea\x3c\xfd\xf4\x0c\x56\x69\xf9\xaf\xa4\xb4\xa8\x33\x07\x1a\xe2\x2a\xfc\x04\x2f\x5f\x69\x14\x0e\x47\xec\x71\xf8\x7b\xcd\x04\x59\xdc\xba\x6f\xdf\xc2\x48\xde\xbe\xc5\xc0\xfb\x0a\x44\x52\xa7\xd7\x63\xfb\x26\xd1\xd6\xfa\x5a\xff\x01\x7b\x33\xe6\xec\x34\xef\x70\x49\x71\x3e\x9b\xb0\x27\xb3\x72\x9c\x17\x42\xde\x2e\xdf\x48\xa6\x1d\x25\x29\x5c\x1f\xa7\x52\x6a\x57\x3a\x50\x0a\x9f\x26\x83\x22\x2a\x2e\xb5\xea\xdb\x6f\x4e\x15\xcb\x16\x46\x05\xe7\x4c\xe4\xa3\xf2\x22\x2a\x38\x5e\x31\x86\x51\xc6\x0a\x1e\x27\x52\x9c\x1b\xcc\x4a\xce\x92\x92\x45\x59\xdc\x83\xe7\xc5\x38\x19\x5d\xca\x26\x93\x12\x84\xdf\x42\xa5\x37\x29\x26\x42\xe3\xf1\xaf\x97\xbf\xb0\x9f\xb9\x10\xbc\x60\xa8\xd2\x4e\xd9\x2b\x88\x0e\xcf\x7e\x56\x19\xbf\x22\x81\xf1\xe2\xc5\x98\xc7\x6c\x00\xcd\xc9\x8a\xcf\x24\x2a\x47\x0a\x15\xf6\x2c\x9f\x65\x71\x84\xcc\xa5\x58\x4f\x2b\xec\x37\x74\x57\xaa\xc1\x36\xcb\x0b\xd9\x48\x33\x2a\xe5\x00\x0a\x25\xae\xb7\x58\x94\x5d\xb2\x54\xde\xa0\x74\xd5\x25\x08\x62\xc7\x0d\xfa\x3a\xd9\xcd\x38\x9f\xaa\x9b\x55\x52\x52\x85\xde\x68\x96\xb6\x65\x6b\x83\x59\xc9\x7e\x7b\xfe\xe6\xdf\x87\xbf\xbc\x61\x4f\x5e\xfe\xce\x7e\x7b\xf2\xfa\xf5\x93\x97\x6f\x7e\xdf\x85\x87\xf8\x7c\x56\xea\xb8\xec\x9c\xfd\x7f\xec\x7d\x79\x73\x1b\x37\xb2\xf8\xff\xfe\x14\x70\x7e\xfb\x4c\x32\xa6\x48\x49\xbe\xe9\xf5\x66\x1d\xd9\xde\xe8\xc5\x57\x59\xf2\xe6\xa5\xf4\x54\x34\xc8\x01\x49\xac\x86\x83\x79\x33\x43\x49\x8c\xa3\xef\xfe\x2b\x74\xe3\x9c\x8b\x97\xa8\xd8\x89\x5d\x5b\x1b\x11\xd3\x68\x1c\xdd\xb8\xfa\xe4\xd3\x38\xe4\x2c\x20\x17\x34\x49\x68\x94\xcd\x95\xf2\xe1\xcd\xcb\x0f\x07\x3f\x3d\x7f\x7b\xfc\xfc\xc7\xc3\xd7\x87\xc7\xbf\xca\xc5\xf5\xea\xf0\xf8\xed\xcb\xa3\x23\xf2\xea\xdd\x07\xf2\x9c\xbc\x7f\xfe\xe1\xf8\xf0\xe0\xe3\xeb\xe7\x1f\xc8\xfb\x8f\x1f\xde\xbf\x3b\x7a\xd9\x21\xca\xd7\x45\xd6\x5f\x3c\xe7\xa8\x1c\x4e\x40\xa8\x4e\x79\x98\xea\x99\x70\x04\xe4\x20\xcf\x4d\xd8\x90\xf1\x73\x16\xc8\x3d\x59\xc4\xf3\xa5\x89\x2a\x71\xd1\x50\x44\x63\x34\x3e\xa8\x62\x48\x72\x08\x39\x80\xda\x24\x65\x8c\xfc\x5d\x65\x56\xba\xb8\xb8\xe8\x8c\xa3\x59\x47\x24\xe3\xae\xca\x0a\x97\x76\xff\xd1\x01\x61\x0a\xbe\x7c\xa0\xfb\x12\xe7\x0b\x9a\x4e\x06\x82\x26\x81\xd5\x8e\xa3\x61\x83\xb9\x3b\xd9\x60\xd7\x50\xa2\x45\x18\x9e\x17\xaf\x35\x9a\xa7\x71\xac\xfc\x9f\x6d\x19\x3c\xe9\x45\xca\x55\xf6\xe7\x84\x85\x34\xe3\xe7\x36\x16\x12\xfe\x53\x21\xed\x54\x4a\xe7\xdc\xc7\x0b\x1e\x64\x93\x1e\x69\xec\xed\xee\xfe\x57\xee\xd3\x44\x67\xc3\x2e\xf9\xe6\xfa\xec\xe1\xfb\x5a\x7b\xa1\xda\x2f\xfa\x61\x68\x2a\x5e\x69\x77\xa4\x2b\xd4\xdb\xd9\x29\xe2\x68\x1a\x32\xa5\x2a\x7f\x14\x4c\x57\x5b\x69\xf1\x30\xcd\x02\x42\x5c\x4c\x44\xc8\x48\x4c\xc7\xac\x4d\xa6\xf4\x8c\xa5\x72\x93\x8c\x54\xba\x40\x43\x4f\x4c\xd2\x00\x26\x05\x21\x4f\x33\x16\x21\x59\xa6\x2c\x4d\xe9\x98\x39\x8a\x3e\x20\x3a\xa4\x66\x90\x47\xea\x50\xc8\xd7\xb0\x06\x6b\x93\x59\x1c\x80\xf2\x10\xfd\x41\xc7\xac\x91\x6a\x4f\x74\x32\x14\x49\xc2\xd2\x58\x44\x01\x8f\xc6\xe1\xbc\x83\x97\x3c\x3b\x20\xf7\x01\x28\xaf\x7e\x38\x22\x4d\x5c\x7b\x58\x9a\x1a\x6d\xe2\x80\xe9\x34\xbb\x1a\x85\x81\x6a\xe6\x62\x84\x93\xc2\x25\x48\xde\x14\xda\xb6\x82\x15\x9d\x6b\xcf\x12\xb9\x29\x3f\xab\xbb\xa0\x20\x06\xdb\x33\xe7\x38\xf8\xfd\x77\x7d\xa4\x8c\xfd\x23\xc5\xb6\xd7\xc2\x57\x3d\x22\xc1\xde\xba\x7d\x80\xf6\x3b\x09\x53\x54\xcb\x3f\x94\x3d\x1e\x83\xc5\x82\x94\x7c\x06\x07\xff\x2f\x6c\x70\x24\x86\x67\x2c\x6b\x36\x55\xb6\xb2\x50\x0c\x61\xe3\xc5\xa3\x77\x28\xd4\x95\x05\x35\xa4\xdf\x91\x1f\xc8\x77\x17\x69\xda\xeb\x76\xbf\x23\x3d\xf9\xa7\xfc\xab\x45\xee\x92\x7c\xed\x89\x48\x33\x72\x97\x7c\xd7\xa5\x31\xff\xce\xed\x2e\x48\x80\xa0\x0b\x1d\x11\x29\xbe\xf0\xfa\x2c\xb7\xcb\x2c\xdf\x71\xdd\xf9\x69\x3a\x26\xcf\xc8\x7f\x1f\xbd\x7b\xdb\x81\xdc\x1b\x08\xdd\x09\x68\x46\x5b\x4f\x0b\x35\x4c\x34\x00\x7c\x29\x74\x78\xfa\x76\x16\x86\xef\x92\x8f\x5a\x72\xd3\x6a\x4e\xd3\x71\xab\xac\x31\x62\x36\x8c\x22\xda\xab\x42\x09\xd2\x00\x99\x1b\x50\xfa\x95\xae\xaa\xc6\x3f\x0c\x45\xca\x6a\x29\x86\xe0\xd9\x31\x9f\x32\x31\xcb\x9a\x39\x62\xb7\xc1\x0c\xaa\xd8\x5a\x59\xc3\x6e\x1f\xbd\x26\x65\x7f\x73\xad\x6a\x0d\x6d\x28\xc6\x25\xc3\x41\x4c\x29\xcb\x8e\x32\x39\x5e\x8b\x29\x4e\xd8\x39\x94\x55\x91\x0f\x62\xe8\x63\xfb\x27\xa7\xc5\x89\xd5\x9f\x3b\x78\x28\x7d\xd4\x7d\xfd\x7c\x55\x84\x85\x67\x53\x94\xb2\xc4\xe3\x78\x2c\x69\x82\xd4\x03\x4d\xdf\xda\x24\xe4\x53\x5e\xca\x50\x6e\x93\x5a\x02\x79\x72\xda\x19\x8a\x68\x48\xe5\x54\x17\x1e\x74\x66\x7c\x28\x6b\x6c\x97\x3d\xfa\xb0\xd5\x56\x09\x37\xca\x7f\x17\x13\x79\x79\x6b\x7a\xad\x6a\x8b\xff\x7f\xd4\xf7\xb4\xd0\xdb\x4e\x3a\xe1\xa3\xac\x59\xd1\x52\x91\x49\x2b\x67\x58\x8f\x1d\xf3\x5f\x17\x10\x15\x8b\xe4\x75\xeb\x03\x6b\xe9\x17\x93\xd1\x7b\x4a\x6a\x99\x13\x23\xa6\x69\x46\xe4\xc2\xec\x94\xae\xcb\xdb\x8b\x17\x66\x67\xc2\xd3\x4c\x24\xf3\xca\x05\x8a\xea\x59\xd0\x40\x3f\x33\xb8\x5e\x3c\x3f\x7e\xde\xff\xf9\xe5\xaf\x47\x1d\xfc\x54\x3e\x3d\xb2\x6a\x96\xd0\xd1\x88\x0f\x4b\xeb\xaa\x6f\xe5\x95\x0d\x19\xb0\x85\xd3\x0a\x76\xf6\x40\x15\xc2\x3a\xd8\x15\xa7\x45\x8d\xef\x88\x4e\xe3\x50\x72\xdc\x32\x7c\x63\x3b\x5c\x89\xa8\x33\xa5\xb1\xb3\xa6\x59\xc8\xa6\x75\xa8\x49\xce\x25\xbe\xba\xeb\x12\x53\x47\x05\x03\xff\x81\xec\x92\x1e\xb1\x25\xe5\x13\x42\x1c\x8f\xf8\xb2\x7f\xf9\xd5\xa4\x46\x67\x17\x94\xee\xcd\xeb\xc3\x37\x87\xc7\x6a\x98\x8b\x06\x53\xc0\x56\xbb\xcc\x48\xe5\x52\x23\x95\xcb\xcd\x12\xa1\x7c\xc5\x55\xe3\x5c\x95\x43\x14\xd3\xad\xc4\x22\x0e\xa3\x56\xa3\xfa\x8a\x99\x44\x8f\xaf\x8a\x4b\xd4\xf7\xa5\xd9\xc4\xe0\xbb\x76\x3e\x71\x28\xb1\x0a\xa3\x14\x4b\xba\x5d\x72\x88\x47\xa5\xdc\x98\xe5\xbd\x4f\xee\xcb\x24\x55\xb4\x5c\x7b\x7f\x56\x0b\xaa\x6a\xaa\xd4\x61\x5c\xb5\x31\xb7\xc9\xc9\xd2\x6d\xf8\x2c\x91\x2f\x3f\x6d\x97\xaf\xf4\x65\xae\x6e\xcb\x8e\x55\xb3\xc5\xca\x83\x55\x15\x97\x1b\xad\x02\x2e\x0e\xd7\xfb\x50\x18\xaf\xee\xdc\x75\x0e\x38\x14\xd5\x37\xe3\xca\xc1\x86\x62\x9c\xb6\xc9\x89\xaa\x5f\xe8\xa7\xc4\x59\xd6\xc7\x42\x91\x9b\x73\x89\x66\x39\xd6\x77\x57\x7b\xf1\x86\x3b\x9c\xd0\x68\x2c\x1f\x61\x2a\xb5\x9d\xdd\xa5\x30\x60\x5b\x7e\x4c\xeb\xdd\x66\x4d\xd2\x2c\x05\xd3\x41\xe4\x20\x5f\x55\x7f\xfe\x40\x3e\x9b\x18\x71\xaa\xe8\x8a\xf4\x0a\x97\xd9\xfa\xd1\x88\x98\x45\x56\xe5\x53\xfd\x4e\xc8\x8d\xe2\x33\x58\x30\x82\xf3\x06\x0a\x39\xeb\xa7\x4c\x3e\x43\x36\x6b\x05\x23\xfe\xd4\x37\x93\xaa\xab\xbf\x8f\x53\x4f\x91\xe6\x94\xe3\xe7\xff\x3a\xea\x4c\xc4\x94\x75\x78\xd0\x96\x5b\x97\x9a\xbb\x29\x8b\x66\xfe\x2b\xca\x1d\x21\x40\xc2\x50\x39\x0a\xad\xe4\xd7\x01\x05\x0b\x44\x39\x87\xc6\xb2\x0e\xff\xe1\x06\xd1\x23\x27\xa7\xbe\x10\x46\x2d\xa4\xe2\x07\xc9\xd8\xc5\x52\x77\xbb\x96\x94\x75\x07\x9f\xe3\x14\x98\x02\xcf\xca\xa5\xdb\xb5\x82\x99\x17\x3c\x78\x03\xb9\xca\xf1\x4e\xad\x45\x24\x2c\xcd\x28\xc8\x4a\xc1\x64\x50\x89\xe3\x46\x3c\x49\x33\x72\xc1\x06\x29\xbc\xdc\x5d\x71\x0d\x1d\x65\x4a\x2a\x6b\x30\xa3\x25\x75\x14\xb0\x84\x05\x9d\x5b\xd8\xb2\xab\x58\x77\xe5\x25\x27\x96\x32\x67\x6c\xde\x23\x8d\x42\xff\x1c\x99\x95\x12\xbf\x5b\x6b\xa4\x3c\x6c\x81\x7b\xfc\xb7\xab\x7b\x52\x3a\x3b\x40\xb7\x4b\xac\x2c\xc3\x8c\x9f\xa5\x84\x96\x0f\x39\x27\xa1\x6a\x7b\xe2\xa9\xbc\x00\x2a\x75\x9b\xa1\x51\x40\xb2\xc4\x64\x8c\xd7\x6d\xc2\x50\x0c\xfa\x50\xa4\xa9\x9e\x36\x55\x4f\x3d\xa1\x69\x44\xc3\xf9\x6f\x8a\x50\x45\x49\x97\xc4\xee\x4a\xbb\x86\x13\x9a\x64\x69\xa3\x46\xdc\xe5\xb6\x71\x8c\x35\xa2\x31\xd3\x54\x57\xab\x00\x42\x60\x6a\x63\x65\xbd\x64\x2d\xb1\x41\x40\x9d\x25\x7c\x3c\x66\x90\x10\x95\x5d\x28\xe2\x6b\x71\xf6\x1b\x4f\x1e\xd8\xb9\xa5\x6c\x57\x48\x9e\xf2\x58\xab\x86\xdc\x08\x50\xa0\xb1\xee\xbb\x64\x2d\x96\x7a\xf9\xbd\x79\xf4\x1f\xb4\xe8\x1e\x60\x02\x79\x94\xee\x36\x5b\x9d\x82\x88\x4a\xd7\x7e\x86\x2c\x83\xb6\x1a\xaa\xf0\xe9\x2d\xff\xb4\xd0\xcb\x0b\xf5\xf9\x26\x88\xa3\x9f\x58\xb7\xb0\x7d\x37\x02\x7e\x9e\x93\xbf\xca\x7f\x9f\xb1\xe9\xb7\x20\x14\x56\x0d\x76\xb4\x98\x58\x9b\xf8\xb8\xff\xea\x9b\xd5\x6a\x72\x1b\x2b\xa9\xfc\x38\xc5\x0d\xaa\x47\xec\x2e\xd9\x51\x9b\x5b\xb1\x45\x0d\xaf\xa0\x9d\xf3\xa1\x78\xae\xb6\x56\xee\xb0\xb6\x19\xb8\xee\x1e\xc3\x09\xa3\xc0\xdd\xd3\xa6\x02\xda\x3d\xc2\x75\x2d\xb7\xec\x3a\x86\x0a\xa6\x06\xd7\x3d\x4e\x7d\x98\x39\xf0\x58\x54\x0e\xae\x8f\x21\x07\x5c\xdd\x8d\x4b\xc1\xcd\xe9\xe4\xc0\xeb\xeb\x65\x69\x05\x3c\xb5\x1c\x68\xb8\x9f\x95\x82\xfa\x47\x99\x3b\x5e\xe7\x43\xc9\xbc\x7b\x45\xde\x96\x0e\xff\x7f\x9a\xb3\xc4\x33\xa7\xcd\xd3\x5b\x57\xca\xc6\xa6\xe3\x49\xe9\xad\x90\xdc\x35\xb9\xd1\xd1\x05\x61\x45\xf6\x5c\x23\x1b\x43\x5e\x54\xb8\x77\x78\xaa\x4c\x3c\x82\x0a\xef\x50\xb8\xfa\xaa\x30\x4c\x76\x1b\xd2\x26\x86\xad\xa6\x27\xe8\xcf\xd9\xc9\x5d\x67\xe2\x89\x6f\x76\x72\xdf\xec\xe4\xfe\x50\x3b\x39\x65\x1b\x6d\x8d\x31\x68\x9a\xf2\x71\x04\x44\x31\x03\xc6\xa9\x2a\x70\xc7\x9e\x36\x49\xf2\xa3\xd6\x78\x1c\x92\x8a\x59\x02\x11\x39\x6d\xd8\x1a\xc9\x21\x06\xcf\x19\x9b\x63\x7e\x72\x09\xa6\x27\x4d\x75\xc5\x4c\x49\x67\x42\xd3\x77\x17\x91\x26\x1d\xaa\xc2\xb0\x4a\x5b\x62\x40\x1b\x23\xe8\xa4\x16\x63\xe3\x57\xf8\x85\x54\x34\x74\x44\x38\x98\x87\x6f\x66\x17\xdf\xcc\x2e\xbe\x99\x5d\x94\x98\x5d\xfc\x05\x4c\x68\x31\x58\x45\xa5\xa3\xf5\x83\x1c\x60\x5d\x27\x10\xc2\x54\xd0\x71\x15\x3e\xf2\xaa\x5e\xdc\xb3\x36\xb4\xaf\x79\x5a\x39\xc7\x8f\x1f\x79\x60\x75\x5d\x90\xdf\xad\x49\xec\x84\x9d\x27\x22\x52\x41\x28\xcb\xad\x6d\xef\x95\x41\xd7\xb5\xe0\x80\x7d\xa1\xb6\xb7\xdf\xcc\x56\xbf\x99\xad\x7e\x33\x5b\xbd\x41\xb3\xd5\x32\xf3\xbc\x82\x34\x6a\x23\xe3\x3c\x8c\x35\xf4\x1e\xf3\x9c\xac\x6a\x9f\x57\x67\x67\xa7\xcc\xf3\x8c\xee\xe2\xc3\xf3\x5f\x5e\x7e\xe8\xff\x72\xf8\xe2\xf8\x27\xfb\x78\x6d\xe7\xfa\x81\x82\x9c\x9e\xb9\x34\x37\xfd\x1e\xd5\xda\x03\x42\xfc\x9e\xc3\x8c\x4d\xd3\x1e\x69\x0c\x99\xdc\x0b\x73\x10\xff\x99\xa5\x19\x1f\xcd\x8d\xc0\x03\xb0\xec\xb0\x28\xc8\xc1\xa9\xf0\xbd\x3d\xd2\xd8\x25\x8f\xe3\xcb\x86\xd3\x5f\x65\x32\x88\xd1\x67\x3b\x26\xa0\xed\xe7\xbc\x74\x3b\xc2\xa9\x7b\x31\x4b\xa8\x9f\xed\xd2\xfe\x83\x1e\x6a\x1b\x44\x5b\x25\xed\x04\xaa\x52\x07\x20\x78\x34\x3e\x1a\x26\x8c\x45\x45\x79\x02\xbb\xe4\x59\x2d\x82\x90\xd1\x73\x53\xdf\xd7\x86\xd8\x31\xa1\x68\xc1\xda\x36\x6a\xfe\xd2\xc6\x8b\xd4\xc8\xf8\x5d\x79\xa6\x64\xb9\x32\x55\x46\x9d\xc9\xa0\x16\x46\xd5\x19\x0c\x2a\x98\x65\xcd\x05\x1d\xcf\x1a\x0d\x08\x3e\xfd\x7c\x78\xf6\x0e\x04\xcc\x19\xe5\x51\x4a\x44\x74\x20\x8b\xe0\xb2\x9a\x99\xc6\xec\x9a\x9a\xb2\x68\x46\xb8\xe4\x9d\x8e\x8b\xe7\x10\x0e\x2e\x50\x14\x60\x68\x0b\x01\xa7\x1d\x8d\x02\x92\xb0\x59\x8a\xf6\x38\xe0\x00\xca\xa3\xb1\x83\x16\x83\x0e\x40\x5b\x20\x93\xb6\x91\x34\x5c\xec\x72\x6b\x75\x2d\xaa\xe0\x8c\x4c\x65\x1f\x93\x39\xc9\xf8\x54\xc5\xbd\x40\xb9\xf2\x94\x65\x13\x81\xe6\xa6\x28\x76\x66\x41\xc7\x11\x1a\xaf\x62\x1f\xa9\xe6\x6c\x19\xeb\x48\x3d\xbd\x4b\xd9\x46\xea\x59\x47\x43\x32\xbf\x73\xa1\x10\xb1\xcb\x27\x50\xe0\x7b\xf8\x5a\x68\x1e\x38\xb6\x42\xc7\xcf\xff\x75\x84\x76\x58\x3c\x28\xb3\x8f\x53\xad\x9e\xf0\xe0\x74\x39\xfb\x46\x34\x65\x54\xf4\xd1\x97\xa4\x12\x75\xa9\x6b\x9c\x87\x75\xf0\x5d\xdb\x39\x63\x65\x2a\xef\xbe\x2b\x43\x77\x85\xa8\x4d\x1e\x2c\x67\x39\x98\x7f\xb1\xbb\x33\x50\xd0\x10\x9a\xf9\xcb\x8b\x02\x49\x9d\x2e\xcc\xd3\x48\x99\xe5\x58\xd0\x47\xad\xab\x95\x30\x7c\xb8\xaf\x74\x0a\x39\x83\xcc\xaf\x44\x6b\xa1\x1f\x24\x7e\x76\x19\xf7\x5f\xb9\x14\x1b\x73\xdd\x34\x62\xf9\x20\x4f\x25\xe9\x4b\x54\x1f\xc4\x95\xaf\x7e\xd6\x09\xc6\xb4\x0e\xc4\x39\x8d\xcb\xd4\x20\xc4\x57\x4a\xe0\xd0\x4b\xd4\xae\xc4\x3f\x5b\xcd\xb8\x56\x9b\x06\x52\xad\xc0\x91\xff\xe4\x55\xaf\xfc\xcb\x1a\xed\x2c\x68\x8b\x54\x29\x8d\xdc\x6b\x43\xd5\x8c\x6d\xd0\x25\xa8\x6a\x5f\x9b\x9d\xc3\xa1\x88\x7e\x84\xdc\xcf\xd5\x4d\x61\x5f\xd5\x89\xd3\xf3\x99\x54\xa4\xa5\xea\xad\xe5\x7b\xea\xbd\x25\xad\x56\x05\xee\xec\x95\x68\xcb\xbf\x94\xa8\x72\x16\xb7\x5f\x3d\xc1\xf0\x7e\xae\x5e\x31\xfa\x5f\x35\xd7\xc8\x7f\xea\x14\x42\xe3\xde\xa6\xb7\x01\xe6\x4c\xe1\x32\x5a\xb0\xa6\xce\xff\x5b\x6f\xf1\x97\x0e\xac\x23\xff\x4f\xde\x2d\xeb\x69\x47\x80\xf4\x3a\x39\x38\xbe\x29\x60\x47\xcd\xe8\x18\xcc\x2c\x0c\x57\xe0\x2e\x69\x0e\x2f\xfc\x7e\xba\x88\x37\xc8\x62\xfe\xf0\x7a\x7b\xcc\x2e\x33\xf9\x34\x32\x49\xb7\x64\x3b\x19\xcf\x42\x96\xd7\x28\xe5\xff\xd5\x99\xd7\x55\xb0\x53\xa1\x74\x55\x9d\x95\x3a\x8f\xaa\x34\x56\xfa\xda\xb2\xa9\xbe\x4a\x47\x9b\x40\x8d\x63\x59\x95\x81\x10\x61\xa1\x82\x52\xad\x96\xc1\x4b\xae\x2c\xc2\xfb\xca\xd5\x25\xea\xad\xa9\x48\x73\xae\xc0\x39\x35\xda\x17\x96\xa9\x47\x0f\xcd\xbc\x54\x0b\x29\xd8\xb7\x1a\x50\xe9\xe6\x53\x04\x7d\x29\xe9\xdf\x31\x91\xb8\x2f\xab\x28\xef\xc2\xe3\x0a\xf0\xda\x0c\xe4\x1e\xa4\x55\x96\x7a\xcf\xb5\xaa\x31\x3f\xa9\x80\xaf\x1b\x6a\x0e\x73\x99\x7a\xb6\xaa\xb9\xbd\xdd\x32\xe8\xda\xc6\x1c\xa4\x56\x70\x5e\xf5\xc4\xaa\x6c\x77\x6f\x71\xdd\xba\x5e\x54\x37\xe8\x24\xb5\xc7\x57\x76\x65\x17\x8a\xa0\x75\x2d\x1a\x74\xdb\x8d\xf7\x01\xb4\xc4\xd8\x8d\x15\x7a\x82\x12\xd0\xda\x34\xf3\x06\xca\x06\xbb\x10\x01\x0d\x2b\x67\xe5\x91\x0f\x57\x1b\x15\x43\x02\xd8\xb8\x6b\x66\x2f\xae\x52\x01\x94\x80\xd6\x46\x69\xb3\x9b\xbb\x89\x2d\x12\xf2\xa0\x32\x54\xad\x93\x7e\x1f\xe0\x6a\x23\x90\x48\x00\x03\x8e\x0f\x8c\x8a\x5d\xe8\xbe\x0f\x56\x87\x15\x00\x0c\x38\xa6\x98\xae\x24\xa4\xc5\xeb\xc8\xaa\xaa\xa6\xee\xfe\x97\x16\x87\xf9\xad\xa8\x24\xc4\xde\xd2\x11\x83\x01\xc9\x82\x88\xc1\xdd\x2e\xf9\xa7\x5a\x7c\x2c\x30\x17\x20\x02\xbc\xb7\x52\x8f\x8f\x0b\x52\xc8\x2a\xca\xec\x2e\x3d\x80\x12\x9c\x8b\x02\x20\x7b\x51\xf7\x24\x17\xbe\xe0\x09\x1a\x7d\x36\x69\x34\x9c\xb8\x19\xa5\xf1\x37\x06\xed\x0a\xd9\x28\x6b\xe4\xa4\xd6\x0d\x30\x23\x68\x40\x48\x31\x0c\xb8\x92\xaf\x85\x00\xf9\x6a\x80\xab\xa6\x56\x26\xe2\x42\x9d\x40\x5c\x44\x0d\x13\xbc\x0c\x34\xf0\x4e\x0d\xcc\xbc\xde\x68\xd9\xb8\x66\x8d\x59\xdc\xb0\x59\x7e\xf4\xb6\x50\xb8\xf2\xd4\x08\xe7\x3d\xd1\x7c\x20\x86\x67\x2c\xb0\x62\xe3\x51\xc8\x2e\x41\x1e\xbd\x4b\xe8\x2c\x13\x0d\x65\x4f\x0a\xff\x89\x7d\xe1\xbd\x38\x67\xc9\x28\x14\x17\xbf\xf6\x48\x03\x60\xf5\x9b\xa2\x42\x7a\x2e\x7f\x18\x9a\x80\x31\x72\x38\x9b\x46\xe6\xb3\x2b\xe3\x3f\x9f\x78\xb5\x64\xa1\xee\x90\x2e\xc7\xa4\x00\x5a\x2a\x8d\xbf\x3a\x26\x73\x81\x86\xfa\x85\x0d\xce\x78\xf6\x4e\xf5\xf4\x68\x98\x88\x30\x44\x89\x7b\x26\x66\xc3\x49\x03\xcc\xcc\x9f\x07\x01\xe1\xef\x8e\xc8\x54\xc8\xa7\xcd\x6c\x4a\x52\x0d\xa7\x85\x42\xdd\x2e\xc9\xd8\x34\x16\x60\xe0\x00\x33\xaa\x3e\x38\xaa\x8b\x11\xbf\x64\x56\xc0\x9f\x89\xb8\x47\x76\x0b\xb3\xf7\x1c\x68\x8b\x69\xfd\xf4\x3c\x86\xf0\x6b\x57\xd7\x4c\xd4\x34\x94\x4f\x3f\x22\x50\x09\xff\x7c\x0c\x3e\x11\x14\x9a\xaa\x2e\x1c\xcb\xfe\x7d\xf6\x3a\xdb\x2e\xef\x0f\xb2\x60\x15\xfa\x02\xf5\x3c\xa8\x29\xbd\xfc\xc9\x27\x6b\x45\x77\x7e\x54\x8d\x78\x3d\xf2\x71\x55\x74\x2b\x3f\x6f\xd7\xd5\xa3\x17\xb0\x30\x7c\x4a\x0d\x44\x12\x30\x3d\xf9\x8d\xbd\xf8\x92\xa4\x22\xe4\x01\x24\xe9\xf2\x43\x3c\x40\xd2\xf8\x80\x9f\xf3\x80\x25\xb5\x0d\x78\x74\x40\xfc\x7a\x2e\xae\xa7\x81\x1c\xab\x60\x13\x38\xac\xeb\x69\x20\x4f\x3a\x6c\x01\xc6\xb5\x56\x03\x53\x79\x00\xf5\xc8\x67\x08\xa5\xf3\xdf\xb3\x34\x23\x10\x81\x22\x15\x24\x66\x22\x0e\x19\xd8\x56\x99\x58\x99\xe8\xa8\x3c\x0f\x21\xa8\xb2\xd2\x2d\xad\x70\x76\x3d\x57\x7b\x6d\xd5\xd1\x22\x22\xf6\x6e\xd4\x3c\xc1\x9d\xbd\x8d\x3b\x78\x5b\x6f\xff\x6d\xb3\x3f\x9f\xb6\x56\x6b\xf6\x58\xe5\x9e\xaf\x6f\x34\x66\xc9\x94\x46\x20\xde\xf5\x85\xbd\xa4\x61\x76\xa3\x95\x9b\x06\x7b\x42\x9d\x9b\xe4\xfb\xef\xe5\x94\x7f\x0f\x12\x11\xcc\x9c\x8c\xf1\x44\x20\xeb\x32\x5a\xd5\x80\xad\x16\x8d\x63\x46\x13\xd8\x0d\xbf\xef\xde\x22\x04\x8f\xa8\xde\xc6\xb3\xd6\xbe\xe5\xf6\x02\x44\xf6\x28\xc7\x30\x96\x70\xd8\x0b\xdb\xf2\x70\xc2\xc3\x20\x01\xc9\x34\x6a\xf9\x57\xba\x56\xe5\x43\xe4\xae\x50\xd9\x91\x9f\xac\x5f\xb1\xb7\x52\x77\x2b\xe7\x37\x9d\xd0\x98\x35\x57\x40\xd5\xf2\xa4\x46\xee\x9c\x7f\x04\x13\x3c\x92\x09\x82\x72\x0c\xbb\xa0\x24\xd1\xc1\xce\x2e\x13\x4e\xf6\x1a\x87\x12\x46\x18\x56\xc1\x04\x20\x28\xf0\x5b\xfb\x27\x1f\x47\x02\x13\x37\x59\x1c\x28\x68\xaf\x1a\x2a\x04\x5f\x2f\xf2\x09\x0b\xd9\xb9\x97\x35\x20\xcf\x28\x06\xa0\x12\x35\x26\x8a\x2a\xa2\xd6\x5a\x6d\xa3\xb4\xb5\xcf\x88\x36\xe1\x11\x99\xf2\x30\xe4\x98\xa1\x5b\x4d\x07\x58\x00\x4e\xe9\x9c\xa4\x31\x1b\xf2\xd1\x1c\x54\xd9\xd1\x38\x64\xa0\x5d\x15\xb3\x0c\x50\x51\x70\xe5\x31\x2f\x12\xc8\x5f\xce\x23\xd8\x01\x67\x34\x0c\xe7\x2a\xd3\x13\x3c\x30\xd8\x30\xb3\x43\x29\x53\xf3\xaf\xc6\xfd\x65\x57\xf4\x35\xd7\x42\x09\xaa\xeb\xe1\xd3\x22\xe2\xdc\xf6\x60\x85\x4d\x2e\x6b\x42\x50\x63\x78\xb4\x7c\x02\xd7\x72\xb0\x1a\xd0\x33\x07\xe5\xb0\xe3\xad\xc4\xa6\x07\x34\x0c\x07\x74\x78\x46\x46\xb0\x6a\x2f\x54\x1c\x24\xc7\x2f\x4b\xa5\x23\x01\x0d\xfc\x80\xa1\xcc\x16\xf5\xe4\x9a\xd3\x63\x9a\xd0\x29\xf9\x8c\xe8\xaf\x94\x41\x00\x70\x2e\xfc\xa5\x8c\xa9\x75\xca\x0b\xd5\xa0\xe9\xb8\x88\x3e\x60\x0b\x07\x4a\x1a\x5c\xde\x79\x49\x3f\xbf\xeb\x87\x23\xf2\x29\x4b\x66\xec\x53\xdb\xdd\xc4\x95\xd3\xa4\x9d\x18\x54\xee\x55\x60\x1d\x08\x11\x16\xd6\xad\x88\x9c\x75\x0b\x27\xf9\x82\x29\xad\xdc\x72\x6a\xe8\x08\xef\xb6\x12\x3a\x42\xf9\xea\x74\x94\xd3\x0d\x86\x5e\x62\x54\xd8\x1f\x50\x87\x7a\x3d\x27\xb0\xb9\x75\x18\x4b\x54\xc7\x4e\x05\xf8\xfd\x6f\x39\x6b\x15\x90\xb5\x1b\xf1\x98\x8d\x8b\xad\x5e\x2f\xa4\x50\x0b\x34\x18\x36\xda\x15\x80\x35\xdd\xf0\xf0\xfd\x84\x8d\x9e\xda\x70\xeb\x7d\xd9\xbf\x36\xaa\x7f\x20\xc3\x7f\xe6\x46\x47\xcf\xc9\x40\x6d\xfb\x2a\x36\x96\xb1\x82\x25\xae\xb9\x40\x3f\x64\x91\x6b\xfe\xaf\x9c\x04\xda\xb2\x24\x35\x71\x4e\x25\x54\x0b\x23\xb0\xa3\xdb\x09\xfc\xf5\x77\xa8\x8d\x3f\xc0\xa5\x40\xdd\x16\x65\xd5\x93\xbe\xb2\xf4\xb7\x8e\x05\x50\x52\x96\x9a\x42\x8e\x84\x3c\x23\x4d\x18\x1f\xfe\x81\xe6\x28\x30\xae\x6a\x99\x67\x7e\x88\x4d\x39\x5f\xe4\x99\x1a\xaa\x6f\xa2\x02\xa8\x72\x72\xe9\x3c\x89\x94\xa5\x4a\x47\x72\xf0\x1c\x90\xb5\xc9\x89\x44\x6d\xe2\x0d\xc9\x91\xb5\x5a\x2d\x45\x03\xfd\xdf\x82\xd3\x74\xb7\x4b\x5e\x33\xc8\x66\x94\xa6\xb3\xa9\xb2\x91\x87\xe8\x78\xee\xfd\x2b\xbc\xa0\xf3\x54\xee\x34\xda\xf5\x97\x88\x88\xcc\x52\x96\x40\xd2\x77\xe6\xbc\x53\x7f\x01\xb3\x7a\x44\x83\x6d\xc9\xc5\x9f\x80\x9b\x81\x20\xe9\x19\x8f\xd1\xfd\x14\x6e\x74\xce\xd1\x22\x8f\x3d\x08\x44\x3f\x61\x16\x99\x32\x46\x25\x53\xf0\x65\xd6\x9b\x95\xb5\xce\x52\x4f\x74\x9e\xa4\x19\xb8\x08\x2b\x25\x0c\xde\xe6\x91\x07\x75\xb6\xf6\x65\x48\xe3\x70\x6b\xcb\x88\x44\x90\x61\x1d\x21\x7a\x71\xb5\x28\xbb\x92\x9c\x8f\xf3\x2f\x3c\x0c\x3f\xa0\x29\x3e\x6c\x1d\xea\x0d\x58\xe9\xe7\x9c\x87\x77\xac\x4e\x72\x6e\xf2\x46\xc1\xe8\x8e\x1c\x4c\x3d\xd5\x97\x2b\x37\x09\x90\xb6\xda\x2b\x31\x79\x59\x68\xee\x62\xcc\xe7\x7d\x33\x14\x57\x7b\x8b\x77\x71\xd9\x63\x30\xca\x02\x03\x00\x2c\x73\xa1\xf4\xbd\xd9\xc2\xe8\x12\x0f\xca\x98\xbc\xf4\x3d\x73\x97\x02\x8c\xce\xbe\xe6\x40\xc9\x22\x17\xce\xde\xd0\x0c\x9c\x29\x72\xe1\x8a\xb7\x1b\x5b\xa1\xf8\xcd\xad\x69\x4f\x77\x5b\xc3\x96\xb9\x90\xfe\x71\x6a\xa1\xfd\x72\xaf\x46\xec\xce\x95\xfc\xe5\x7e\xb5\xe7\x91\x85\xb1\x65\xde\xe8\xe4\x49\xe9\x0c\x08\x72\x7b\xb8\xdf\xd5\x4b\x50\x7d\x9e\xc7\x7e\x2f\xc0\xdc\x59\x6d\x6e\x55\xca\x3a\x67\xfd\x20\x73\x90\x93\x06\x32\x80\x3c\xa7\x34\x99\xe1\x6f\xa4\xa6\xf9\x53\x92\x4c\xfe\x30\x74\x81\x83\xad\x30\xe7\xb2\xd4\xce\xab\xfc\xe5\xcf\x1b\x94\xc4\xd8\x84\x9d\x05\xc0\x25\x87\x0b\x7f\xcc\x63\x86\x4f\x55\x87\xb1\x93\x2c\x34\xc9\x40\x02\x2d\x18\x54\xf2\xd5\x2c\x6c\x3c\x75\x40\xb5\x4c\xd4\xe1\x76\xfd\x99\x8f\x48\x53\x62\xba\x73\x87\xd8\x17\x27\x3e\x35\x4f\x3b\x3c\x1a\x86\xb3\x80\xa5\x5a\x04\xec\x9a\x72\xe4\x70\x3a\xe2\x60\xf2\x83\xc6\x40\x7a\x8e\x54\x97\xb8\x91\x0d\xc0\x67\xd2\x38\x9e\x2c\x67\xfa\xa1\x14\x1d\x45\xe3\x95\xcf\x65\xeb\xa6\xa7\x98\x03\x24\xc7\xe6\xb6\x41\x7e\x70\x56\x96\x23\xee\x92\xff\x30\x93\xa8\x32\x08\x29\x5b\xb2\x3d\xe7\xf8\x47\x0d\x97\x65\x1e\x6d\xe9\x04\x02\x9e\xb6\xde\x0a\x4e\x1a\x8e\xc0\x07\x32\xdb\x4b\x04\x4a\x03\xd3\x19\xd2\x98\x67\x10\x31\xee\x95\xdc\x09\x5f\xb3\x2c\x63\x49\x4b\x4f\xf6\x69\x5b\x27\x00\xf1\x14\xdc\x7e\xee\x96\xb2\x76\x50\xb0\xb4\x7a\x6b\x30\x5f\xb7\xfd\xf9\x6a\x59\xeb\x10\xc7\xe8\x45\xaf\x0a\x55\x60\x6d\x4c\xb5\x2f\x83\x4a\x49\x66\xee\x7f\x2e\xe3\xac\x6a\xef\x53\xb0\x37\xab\x4a\x65\xb3\x1a\xa1\x50\x74\xdf\xb6\x95\x5a\xf2\xac\x81\x2d\xc3\x33\xb9\x42\x2e\x35\x05\xad\x52\x56\x4e\x43\x1e\xf0\x68\xfc\x62\x55\x8e\x46\x85\x60\x91\xa3\xab\x86\xe8\x4e\x0b\x8f\x1a\x3d\x92\xdf\x5a\x03\xab\x21\xa8\x54\xe4\x78\x1b\x28\xbe\xb0\x7b\x25\xe7\x88\x77\x4a\xc2\x7d\xa7\x47\x6e\x3b\x9e\xf0\xf6\xf4\x76\x58\xc4\xd9\xdb\x5b\x79\xaf\x81\xc5\xdc\xa2\x1f\x08\x5f\x31\xbb\x78\x9c\x50\xc3\x35\xdd\xae\xdd\x9f\xcc\x72\xbb\xb5\xce\x90\x95\x42\x7c\x2d\x26\xfa\x91\x0e\xcf\x82\x44\xc4\x45\xe9\xc1\x22\x8e\x58\x69\xf2\x40\x28\xed\xce\x9d\x37\x63\x13\x71\x51\x64\xe4\xfc\x13\xde\xff\xed\x72\x1c\xd0\xa0\xed\x5c\x67\x1c\xec\x65\xd4\x70\x2f\x97\x98\x21\x49\x07\x63\x00\x28\x6b\xd7\x66\x67\xde\x0f\xc9\x80\x6f\x1e\xf5\xcd\x15\x08\x6b\xb9\xae\x3a\x47\x7d\x31\xda\xde\xc3\x76\x85\x30\x0a\x09\xa2\xfc\x4c\xfa\x4b\xbb\x98\xa0\x5b\x49\x39\x7c\xde\xa3\x04\xf6\x6e\x94\x5a\xa0\x4f\x95\x79\xc2\xbb\x67\x63\xb7\x4b\xde\x40\xd2\x6c\xbc\x99\x77\xe4\xc3\xbc\xc2\xd0\xcd\x31\x95\xc8\xa7\xa5\x6a\x93\xcf\x64\x14\xf2\xd8\xba\x6f\xf1\x6c\x72\x8c\x22\x0f\xb4\xb5\x8c\x80\x6d\x1a\x6f\x66\x1c\xe7\xb2\x41\xae\xcc\xc3\xb0\x60\x1e\xb7\xbf\xfb\x55\x67\x35\x5c\x6c\x4d\x77\xf3\x06\x6f\x5b\xc8\xb1\xf8\x45\xd9\xd0\x6d\xd5\x3e\xf1\x9b\x81\xde\x37\x03\xbd\x2f\xcf\x40\x0f\x7e\xbd\x10\xd3\x2a\xdb\xa1\x27\x05\xc8\x85\xb8\x5f\x88\xe9\x8d\xda\xff\x6d\x33\x93\xea\x19\x9b\x0f\xab\x2d\xc3\x9c\x18\x07\x0a\x70\xc1\xbe\x27\x41\x1c\x2e\x78\xf1\xee\x4d\x95\x81\xdc\x03\x1f\xac\x0e\x2f\x00\xd8\x69\xd4\x3e\x91\x55\x5c\xf8\xb8\x00\x5a\x3b\xdf\x0a\xc6\x54\xc2\x38\x5c\xea\x32\x59\x19\xfc\xe1\x61\x39\x7c\x5d\x4b\x1e\xa0\xdd\xe6\x2f\x22\x26\x1f\xa6\xb3\x9a\xe6\xf6\x1c\x2e\xf5\xe0\xeb\x9a\xf3\x00\x6d\x6f\x83\xe0\xe5\x39\x8b\xb2\xd7\xf0\xa0\xa8\x89\x6e\xf1\xa8\xb2\x4a\xed\x18\x73\xb0\xab\xdb\x56\xbe\xa2\xd5\x06\xa3\x8f\x1e\x7b\x60\x75\x1d\x91\xdf\x6f\xd4\xd2\x15\x6e\xf2\x6f\x68\x44\xc7\xd5\x96\xa9\xfb\xf7\x4a\xc1\xeb\x5a\x72\xe1\x4c\x65\xfd\x38\xa9\x6c\xe7\x61\x01\xb4\xae\x0d\x0d\x63\xed\x66\x45\x92\x55\x5a\x1c\x3f\x70\x2c\x8e\x11\xb0\xd6\xc2\x16\x20\xbe\x34\x63\x58\xb5\x08\x6b\xcc\x65\x96\xb7\x89\x75\x71\x2d\xb2\x25\x5d\xbd\x8b\xd7\xd5\xbd\x85\x5d\x83\x27\x4e\x40\xc3\x94\x04\x22\x6a\x64\x28\xa8\x56\xf1\x43\x55\x2a\x98\x54\x80\xaa\x80\x5c\x00\xc0\x20\x61\xf4\x8c\x0c\x45\x34\x9c\x25\x09\x8b\x86\x10\xd1\x8a\x1c\x40\xb8\x22\x1a\xa6\x82\xc4\xb3\x0c\xe1\x31\x52\x2a\xd8\x65\xad\x67\xff\x6b\xf4\xe6\xd7\x68\xff\x6b\x70\x5e\x23\xcd\xbe\x10\x8b\x65\xd9\xe3\xdc\x76\x04\x4f\x53\x6f\xcf\xb1\x8f\x53\xbd\x9a\x37\x37\xfa\x4d\x84\x70\x4c\x02\x2b\xcc\x75\x4b\xd3\x5e\x95\x07\xe2\xa8\xb4\x82\x2d\x35\xd2\x0d\x38\x0d\xc5\xd8\x37\x94\xcd\x19\x79\xba\xf6\x80\x13\x1e\x04\xcc\x09\x6c\x71\xce\x53\x3e\xe0\x21\xcf\x64\x8f\xf1\x63\xc3\xca\x43\x56\xb6\x00\x2c\xb5\x87\x3b\x9e\x30\x72\x70\x74\xa4\x42\x02\x41\x26\x6c\xa5\xfc\x1c\xe8\x2d\xbd\x60\xa3\xa0\x77\xe7\x83\xb5\x6c\x9a\xde\x43\xec\x21\xc7\xc2\x04\x9b\xce\x04\x68\x73\x69\xea\x35\x5e\xd2\xa8\xae\xb7\xaa\x65\x90\xb7\xc3\xae\x69\x12\xe4\xe2\xb8\x1e\x5b\x20\x07\x63\xab\xd6\xbe\xc5\x90\x03\x3c\xfb\x81\x35\xd0\x14\xd4\x9f\x9e\x43\xfd\x69\x05\x9b\x97\x52\x53\x30\xd3\xde\x1f\x6d\x13\x56\x2b\xf7\xfc\xeb\xd9\x86\x3d\xd7\x93\x0b\x8a\x1d\x13\x94\xbb\xb0\x48\xd7\x35\x1f\x35\xa7\xfc\x66\x4b\xe4\x7a\x97\x47\xeb\xeb\x37\xe5\x7c\x8e\x86\x2d\x67\x8c\xc5\x2a\xaa\xba\x32\x53\x50\x61\x23\x5f\xbc\x7b\xd3\xd1\xcb\x91\x3b\x81\x3c\x86\x34\xb2\x01\x24\x25\xf0\xd1\xcb\x77\x24\xe5\xd9\x4c\xd9\x84\x26\x58\x09\x2c\xf7\xe6\x62\x46\x2e\x68\x94\xc9\xd1\x4f\xe9\x25\x9f\xea\x04\x57\x18\xaf\x3d\xe5\xe7\x2c\x62\xa9\xb1\x38\x86\xdb\x95\x9d\x1b\xd9\x35\xd0\x11\x81\x13\xf7\xb2\x9b\x47\xcd\x36\x15\xf0\x94\x0e\x42\x6d\x2d\x28\x9b\x50\x25\x7a\x49\xaf\xd7\x0c\x78\xf8\x2b\x03\x1e\xdb\x1e\x58\x0f\x45\x22\x03\x4b\x46\xb4\xb1\xf3\xf5\x10\x9f\x8c\xed\xa1\xed\x0f\x52\xd6\x9e\x67\x18\x48\x60\x8d\x3e\x4d\x78\x06\x01\x8b\x58\x3a\xa4\x31\xdb\xa4\x33\x2f\x01\xc3\xcf\x6c\xfe\x71\x95\xe9\xc9\xf3\xa8\x7b\xb1\x5a\xdf\x20\x34\xb5\x06\xa1\x2e\x5d\x81\x00\x60\x98\xe5\x98\x59\x46\xcb\xcd\x62\xd1\x8e\x33\x67\x82\x3a\x60\x23\xa1\xe6\x0c\x06\x21\x1b\xd4\x2a\x15\xb7\xb9\x97\x2a\xd6\xd7\x9a\x27\x80\xbd\xc0\x6f\x7c\x02\x18\x54\xd7\x7d\x02\x68\xc4\xad\xe5\x6c\x76\x17\x4f\x17\xf8\x83\x7d\x9b\xb1\xdc\x8c\x4d\xa8\x9a\x32\x77\xa7\x52\x33\x06\x11\xf4\xff\xe2\x13\xe6\xec\x02\x6a\x7b\x83\x68\x5a\xf2\x8c\x62\x69\xca\x02\x4c\x47\xe2\x32\x20\x97\xd7\xc8\xe1\x2c\xf5\xa6\x73\x89\x7d\x6d\xbd\xcd\xe1\x92\x67\x79\x66\xc7\x28\x7e\x7f\x71\xba\x95\x6e\x0d\xe5\x93\xf5\x6d\x63\xa8\xdc\x18\x2e\x79\x96\xdb\x17\xa0\xe4\xdb\x74\x7d\xd5\xde\x22\x6f\xf4\x82\x28\x3c\xa4\xd1\xc4\xa5\xe6\xe2\x95\x0f\x2f\x04\x4d\xe0\x23\x1a\xd9\xc6\xce\x46\x9c\x88\x73\x1e\x40\x06\x28\xf4\x0d\x1d\x99\x30\xf5\xf0\x26\xc6\x28\x96\xd1\x98\xa0\xa0\x28\x6d\x4b\x44\xb1\x88\xc5\x39\x4b\xf0\x85\x7c\x31\xa1\x19\x3b\x67\x09\x78\xd9\x77\x6e\x19\xd7\x41\x3b\xdf\x18\x51\x94\x67\x29\xf9\xa4\x9f\x14\x9f\x48\x24\x02\x06\xbb\x70\x22\xd0\x9a\x9d\xda\x0b\x9c\x6b\xd4\x6e\x7a\xae\xfd\x8a\xc4\x68\x84\x01\x4a\x47\xec\x82\x4c\x58\x18\xcb\x47\xc7\x88\xd1\x6c\x26\xcf\x01\xd9\x2f\x32\x93\xef\x4f\x08\xfc\x4a\x28\xf9\x84\xd2\xf4\x4f\x4e\x97\xe4\x69\x90\x8a\xa9\x7a\x90\xa5\x3d\xd9\xc4\x0e\xc1\xbb\x68\xaa\x46\x4a\xd2\x8c\xe2\x1d\x1e\x78\x48\x44\x6c\x87\x66\x3b\x74\x07\x42\x74\x02\x6a\x0e\x51\xa0\x59\x24\x66\xe3\x49\x07\x51\x1c\x80\x5a\x3a\x75\xc6\xd2\x86\x59\xc4\x47\x85\x44\x06\x62\x7c\x8a\x82\xc1\x01\x0b\xc5\x85\x5d\xcc\x0a\xc7\x61\xa6\x5e\x56\xe1\x9c\x4c\x55\x97\xe0\xa8\x7a\x4a\xa6\xe2\x1c\x1e\x15\xc2\xd9\x01\xd4\xeb\x1a\xe8\x42\x60\x64\xf2\x91\x04\x4d\x65\x2a\x5f\xfc\x2c\xca\x78\xe8\x6f\xb2\x86\xeb\x55\x8b\xea\xd5\x93\x5a\x6f\x7b\xcd\xdf\x31\x1d\x1b\x47\x50\x95\xee\x53\x79\x2f\xc9\xaa\xcf\x83\x20\xd5\x2e\x0c\x89\x88\x13\x08\x9a\xfa\xfc\xc3\xe1\x73\x92\x08\x89\x8e\x26\x0c\x22\x05\x4c\x69\xc6\xe5\x4a\x99\x5b\x8a\xca\x5e\x18\x8a\xa4\x13\x2a\xa9\x37\xa5\xd1\x1c\xa4\xe3\x2c\xce\x52\x14\xb7\x9c\x80\xf6\x78\x47\xd2\x35\xa4\xf3\xf4\xb4\x89\xc9\xd2\xbb\x5d\x2c\x1f\x08\x91\xa5\x59\x42\xe3\xce\x98\x67\x93\xd9\xa0\xc3\x45\xd7\xaf\xd1\xfd\x7f\x30\xea\xb4\x25\x9b\xee\x82\x34\x52\xc7\x86\x59\xd7\x31\xe8\x0d\x1a\xa0\x2d\xf0\x0b\x02\xa8\xad\xb9\x05\x99\xb0\x34\xe4\xcf\xee\x15\x84\x32\x80\x15\x9c\x82\x70\x6a\xd6\xf0\x09\xb2\xe1\xde\xdf\xa3\x2b\x05\x0d\xc3\xa6\xf5\x18\xda\xb2\x03\x8d\xe2\xaa\x6a\xff\x19\x37\x49\x60\xad\xe3\x4c\x3e\x43\x20\x84\xbf\x77\x42\x52\xca\x03\xc4\x35\x8a\xcd\x27\x9e\x64\xfa\xfe\xe0\x67\xb7\xbc\xb2\x92\x7d\xdf\x8d\xa6\x2a\x93\xe1\x2a\x59\x0c\xa1\x0f\x53\x94\xed\xe4\x72\xf2\x82\x61\xef\x82\xde\x4f\x68\x14\x84\xec\x68\x22\x2e\x9a\x2b\xf4\x77\x63\xaf\xa4\x88\x5d\x66\xef\xfd\xa0\xd5\xb2\xb7\xa6\x18\x3a\x4b\xee\xdc\x71\x73\x7e\xe1\xec\x2e\x33\xff\xf9\xbc\x9f\xcb\x0d\x08\xb3\x89\x2d\x33\x14\x84\xac\x1a\x44\x9e\x63\xe4\x30\xfc\x81\x15\xc6\x30\x94\x5b\xd5\x2b\x91\xbc\x92\xe7\xd5\x2a\x84\x78\xc1\x83\xe5\xba\x6d\x00\x21\x83\x6c\x59\xaf\x4d\xb9\x3f\xf7\x6b\xf1\x8e\x76\xe2\x93\xc7\xd8\x05\xe5\x18\xf0\x5b\x69\x1f\xf4\x35\xdb\xdc\x00\x41\xa0\x4b\x43\x79\x29\x97\xf8\x7e\xe2\x81\x72\x05\x5c\x48\xb0\x68\xba\xec\xca\x56\xa0\xb9\xb5\x9d\x27\xd4\xef\xbf\x7b\xa6\xf5\x15\x0c\x67\xbb\x59\x1c\x76\x6e\x35\x62\x1e\xb1\xca\xc1\xb8\x54\xaf\x1a\x85\xcf\x19\x5e\xf7\x95\x31\x93\xd9\x09\xf3\x1d\x0d\x69\x9a\x41\x3d\x7d\x86\xf8\xd6\x43\x9e\x52\x76\x01\xc3\x25\x2c\xcd\x44\xc2\x5e\x6b\x8c\x95\xae\x7f\x3e\x58\xd9\x7c\xdb\x5e\x69\x16\x33\x25\x1d\xb8\xaf\x55\x8f\x03\xbf\xbb\xe1\xc7\x0b\xe3\x74\xec\x7a\x17\x0c\xc9\x72\x6f\xc5\x60\x5c\xf6\xf6\x7c\x19\x03\x31\x34\xee\x6c\x9e\x81\x94\x73\x86\x19\xfb\x3e\x1b\xbf\x94\x47\xc1\x8b\x77\x6f\xde\x8a\x80\xc1\x44\xb4\xcc\x30\x1c\x36\x74\x85\xbb\x1d\x1a\x04\x08\xe9\x01\x8a\x48\xb7\x07\x12\x17\xc7\xb6\x0a\x69\x9c\x37\xa0\xb2\x9d\x0a\xc4\xb0\x4d\x1a\x67\x6c\x3e\x8b\x1b\x6d\x97\x97\x3d\x84\xf9\xd6\x60\x66\x57\x6e\x65\x84\x5c\xe2\xb6\xe2\x21\x6a\xc3\x49\xe5\xb7\xe5\x51\xb7\x84\x62\xa3\x1a\xce\x1b\xe5\xd8\x0d\x62\x9f\x83\xad\xc8\x72\x4b\x60\x73\x6a\xb6\x5c\x57\x3f\xa0\xa3\x4d\xf7\xad\xb6\x05\x79\x7b\xd6\x4c\x8f\x4f\x17\xc9\xba\x07\xf2\x6d\xe7\x56\x86\xb1\x1c\x46\xfa\xb6\xed\x0d\xe3\xce\x1d\x75\x15\xd2\xd6\x86\xb6\x97\x6e\x9b\x6d\xaf\x96\xef\xeb\xe3\xf5\xed\xce\x1d\x72\xdb\x6d\xcf\x5d\x7c\x70\x2c\xb8\xd0\x9d\x09\x4d\x9f\x67\x2a\x2b\x5a\xb3\x91\xd1\x01\x18\x43\x34\x72\x29\xd9\xbd\x2a\x29\xcb\xca\xaa\xb4\xc9\xce\x9e\x17\x36\x59\x99\xfb\x77\x58\x74\xde\x79\xfb\xee\xc5\xcb\xfe\xcb\xb7\xff\xc6\xf4\x3b\x71\x22\x82\x99\x4a\xc0\xf3\x83\xf2\x7b\x50\xb6\xa7\x76\xf0\xca\xc9\xa1\xf1\x46\x85\x1f\xdf\xf9\x78\xd8\x2b\xbe\xf6\xf0\xf5\x1c\x08\x96\x82\x0a\x87\x0e\xe5\x83\x49\x09\x34\x21\xba\x53\xe3\x95\xd6\x91\xb3\x88\x8d\x38\x3e\xb0\xd3\x94\xa7\x90\xe7\x38\x63\xc3\x49\x24\x42\x31\xe6\x2c\x6d\x23\x3c\x84\x56\x51\x83\xd2\x4f\x3f\x7c\xa2\xa7\x64\xc0\xe4\xb9\x97\x32\x50\xda\x7d\xb7\xb3\xf7\x5d\xa7\xd1\x22\x3d\x72\x2e\x78\x40\x76\x4b\xf3\x4c\x7b\x33\x37\x5a\xf2\x32\x60\xcf\xa3\xda\x8d\x0c\x0f\x2c\xff\xde\x58\xb2\xe9\x24\x6c\x2a\xce\x99\xbf\xef\x98\xbd\xbb\x62\xef\x69\xd5\xee\x4c\x1a\x65\x19\x3a\x6f\x4f\x68\x95\x6e\x39\x85\xea\x2a\x63\x77\xfe\xa4\x59\xe0\xac\xae\x75\x58\xb5\x4e\xeb\x1a\x28\xb7\x91\x68\x0f\xe6\xfc\xf3\x90\xfc\x83\xec\xca\x15\x64\x1f\x77\xbb\xa7\xc0\xb3\xe6\x14\x22\x3f\xf8\x1f\xdd\x4c\xfb\x4b\xb8\xc5\x17\x2c\x63\xac\x97\x75\xe1\x53\x69\xbd\xa2\x9b\x7b\xe1\x53\x59\xbd\x72\xdb\x32\x1f\x41\x11\xa6\x0c\x93\x31\x5a\x29\x22\x30\x9f\xf2\x6e\x68\x16\x54\xfe\xb2\xee\xd6\x2b\x3a\xe4\x81\xd5\xee\xf2\xfe\x78\xc6\xbb\x12\xbd\xa3\xd0\xb1\x53\x76\xa0\x6d\xdd\x33\x6b\xe6\xa7\xc4\x0d\xb1\xbe\xa3\x45\x02\x7a\x9b\x28\xb7\xd6\x3e\xb5\x13\xe6\x98\x2c\xd4\x92\xd6\x4f\xb1\x80\x5b\x82\xa7\xd7\xb5\xfb\x91\x76\x36\xbe\xd6\xf8\x0f\xa5\x89\x4e\xec\x12\xd8\xaf\x5c\x03\x39\xc3\x02\xc3\x1c\xfb\x9d\xdc\x97\xe5\x16\xce\xfe\xba\x2b\x67\x7f\xe3\xa5\xb3\xbf\xf1\xda\xd9\xaf\x5f\x3c\x25\x36\x0f\x4e\xd5\x92\xaf\xc5\xca\x8e\x2e\xaf\x50\xd5\xf9\x56\x1b\x95\x63\x7f\xa9\xb0\x1c\xfb\xcb\xc5\xe5\xd8\x2f\x0f\xcc\xe1\x58\xb4\x38\xa0\x4e\x69\x3b\x7f\x21\x51\x07\xdc\x7b\x9f\x87\xdc\x4f\xfe\x72\xa9\x9a\xc6\xdc\x17\xbf\x52\xf9\xf4\x79\xe5\x4b\x84\xf4\xd8\xaf\x8b\xe9\x81\xda\x6b\x1f\xbb\x2c\x29\x01\x52\x7e\x3c\x3e\x1c\x98\x2f\x15\x40\xbd\x69\x34\x65\x39\xc0\x4b\x9e\xf9\x50\x97\x3c\x2b\x82\x14\x5a\xc5\xb2\x22\x60\xbe\x4d\x28\xaa\x3c\x0c\xf6\xe1\x34\xd8\x38\xb0\xc8\x7e\x9b\x9c\x34\x72\x3b\x47\xa3\x4d\x1a\x85\x5d\xc1\x2b\x74\x03\x8d\x54\x2f\x62\xf7\xab\x59\xa0\xb2\xb0\x64\xe9\xd9\x62\x87\x37\x96\x8d\x75\xe2\xf0\xb9\xfc\xe9\x32\x31\x46\x36\x29\x34\xe5\xb1\x60\x45\xf4\x13\xa4\xba\xf3\x27\x8f\xc6\xce\x2f\x6c\x0b\xe9\x64\xff\xb2\x30\x40\x3e\xf9\xb7\xa4\x93\x17\x27\x05\x1e\x12\xee\x8a\x95\xaf\x8e\xa5\x24\x7c\xea\xc8\x8f\x66\x61\x58\x1a\xf1\x21\x2b\xe8\x35\x53\x27\x2c\x95\x63\x4c\x54\x58\x24\xae\xdd\x4c\xd9\xca\x70\xac\x44\x4a\x96\x83\x36\x44\xc8\xaf\x01\x47\xe7\x5e\xc2\xf8\x8e\x86\xd9\x1e\xc2\x96\x8d\xf0\xa3\x1e\xa6\x77\x48\xe2\xc3\x00\xcc\x42\x8b\x61\x2d\x0e\x14\xc7\x74\x44\x14\xce\x9b\x9a\x7f\xbc\xf7\x68\xdf\x22\xf8\x9b\xbe\x72\xda\xa2\xe2\xa1\x9b\x08\x3c\x75\xf2\xd5\x3a\xf2\x83\x17\xb9\x42\xbf\x7d\xca\x80\xf5\x47\x6f\x28\xd0\x3f\x63\xb0\x7e\xe5\x3d\x4d\xb1\x59\xf7\x02\xed\x32\x83\xad\xd9\x51\xfd\x2b\xc2\x93\x1f\x48\x23\x50\xaf\x90\x06\xe9\x01\x44\x81\x73\xe0\x01\x62\x3a\xbe\x44\x73\xce\x28\x9d\x7a\x98\xbf\xf5\x07\xb2\xb3\x47\x7a\xc4\x8e\xb5\x84\x4d\xb5\x56\x53\x0f\x5b\x3f\x01\xad\xb0\xf4\x10\xa2\xa7\x11\xcb\x0c\x24\xe4\x67\x8e\x3a\xb8\xf0\x7e\xb7\x74\xcb\x65\xa3\x6f\xca\x9b\xab\xf7\x22\x87\xfd\x11\xfc\xc8\x1d\x55\x51\x71\xe1\xb4\x3a\x23\x91\xbc\xa4\xc3\x89\x93\x38\xaa\x90\x73\xd0\x4e\x8a\xce\x6c\xef\x47\xb7\x41\x0d\xcd\x84\xca\xc9\x7c\xa5\xd0\x94\xb6\x06\xd5\xdb\x05\x26\x84\x62\x37\xfb\x91\x7d\xff\x62\x38\x7a\xdb\x99\xfc\xa4\x96\x34\x52\x4a\xf9\xb2\xe9\xb0\xc3\x6a\xa9\xb7\x9d\x3b\xec\xda\xd5\x37\x0c\x45\x64\x2e\xf5\x16\xb2\xed\x4c\x55\x31\xee\xc8\x8a\x4f\x19\xe5\xfa\x56\x1f\x73\x49\xe5\xba\xcb\x85\x4d\x4a\xd8\xc8\xbb\x9b\x8f\x9a\x91\x08\x58\x21\x43\x22\x66\xd8\x02\xc9\xb5\x4a\xde\x00\x52\x8c\x1f\xe0\x3f\x9d\x31\xcb\x5e\xd3\x39\x5c\xea\x7b\xde\x66\x4c\xfc\xec\xa8\xcb\xbe\x7d\x9c\xda\x4b\x07\x8a\xf1\xfa\xbb\x52\xdc\x93\x44\x88\xcc\x09\x7b\xb2\x42\x40\xa7\x0e\xba\xe6\xb4\x4b\x0e\x29\x37\x5f\x97\x0d\x7f\xe2\xf7\x72\xb9\xb9\x77\x66\x1f\x05\x7e\x12\x28\x97\x03\xd3\x6d\xcc\x0b\xdb\x72\x3b\xff\x3c\xba\x73\x27\x77\xd6\xfe\xfe\x3b\xa9\x53\x6e\xe8\x13\x38\x27\x00\xf1\x16\x57\xab\x70\x99\x06\x16\x37\x85\x65\x0f\x46\x2f\xa6\x0b\x88\x16\x17\x86\x74\x41\x85\x75\x49\x44\x97\x12\x07\x21\xeb\x6b\xea\x2e\x8a\x3a\x87\x92\x7b\xbb\xbb\xed\x72\x6f\x1a\x13\x8b\xc5\x33\x93\x37\xa5\x05\xcb\x76\xf3\xa5\xd4\xc6\x3c\xf7\xd5\x33\x8e\x34\xdf\x7c\x23\x6e\xf7\x97\x71\xfd\xca\x6b\xd5\xbd\x84\xb0\xb9\x6f\xea\xb1\x6d\x1e\xda\xf7\xdc\x87\x76\x49\xc4\x4e\x4f\x51\x7a\x4b\xe5\x58\x5d\xa0\x5d\xd0\xcb\xbe\x42\x2d\xe0\x7d\x2e\xd1\x80\xd5\x6b\x6a\x1c\x01\x79\x19\x2a\xbd\x25\xc1\x87\x5b\xa4\x52\xab\xe0\xd9\xa6\xe8\x75\x06\xb7\x4f\x9c\x16\xd3\x31\xb9\x18\x54\x51\x89\x0c\x94\xa7\xc7\x22\x46\x33\x14\x04\x72\x8e\x53\xe4\x68\xcf\x7e\xe3\x26\x75\x0d\xba\x3f\x6a\xa9\x95\xe8\x1a\xcc\x48\x95\xb6\xc1\xfd\xed\xea\x1b\xcc\xdc\xe4\xf5\x01\xde\xef\xdb\xcf\x8a\x0a\x88\xdb\x6b\x68\x20\xec\x04\x56\xcb\xb8\x95\xef\xa3\x4f\x5f\x8f\x1d\xab\x73\x16\x6f\x9d\xc8\xee\xcd\x01\x62\x53\xd8\x61\xab\x8e\x40\xcc\x3e\x96\x0e\x1b\x0b\x99\x05\x5f\xa2\xf7\x2c\xb1\x72\xf7\xef\x72\x39\xc2\xbd\x2a\x39\x42\x85\x14\xe1\x5e\xa5\x14\xa1\x5a\xd4\x73\xaf\x28\xea\xd1\xcf\x38\x39\x01\x5e\x07\xec\x30\xbd\x62\x35\x1d\x85\xc9\xcb\xf5\x52\xf2\x51\xa1\x2d\x17\xa5\x0b\x9d\xc3\x59\xc2\x26\x79\x69\x4d\x0d\x9b\xb8\xe9\xa9\x81\x68\x58\xa0\xd8\xf5\x18\xca\x97\x24\xe1\xfd\x1a\x12\x96\xcb\x8f\xee\x57\xcb\x8f\x2a\xc8\x78\x7f\x01\x19\xab\xda\x29\xf9\xea\x93\xd2\xfb\xe4\xce\xbc\xf7\x61\x65\x72\x56\xa2\x5d\x8d\xa0\xf9\x67\x71\xe5\xd6\xee\xad\x70\x0d\x5d\x16\x7c\xf8\x81\x79\x6f\x29\x51\xd0\x83\x1c\xf5\x5a\xa6\xba\xb6\x7e\x43\xb0\xb6\xd5\xe1\xf8\xf3\xa0\x2a\x2f\xb2\x00\x53\x60\x79\xbb\x11\xe5\xe6\x7d\x0d\xa1\xdd\x6c\x24\x37\xd8\xcf\x20\x90\x9b\xb6\x73\xac\x89\xb5\x76\x85\x86\x7a\x75\xc1\xdb\x9a\xf2\xa8\x29\xc4\x82\xdb\xfb\xb2\x52\xa5\x6e\x29\x00\xd0\x8d\xc4\x10\x01\xf5\x80\x69\x49\x44\x92\xb5\xaf\x9e\xde\xaa\x34\xef\xf1\xe1\x61\x21\x98\x95\xa0\xe5\x1e\x9d\x42\x60\x1c\xdd\x49\x5b\x51\xbe\x31\xda\xb8\xf3\xe1\x9b\x08\xb9\x33\x69\x93\x21\x8d\xb3\x59\xc2\xf2\x3b\x20\x3e\x04\xf3\x98\x9b\x35\x18\xe4\xf9\x0b\x0c\xaa\x17\xcd\x53\x93\x4f\xce\xf6\x34\xcb\xe8\x70\xf2\x12\xb7\xe8\xa5\x3b\x59\xd1\x37\x8b\xab\xd9\x10\x51\x83\xdc\x75\xab\x3a\x07\x82\xfb\x00\x93\xfb\x2c\xf4\xf4\x82\x47\x81\xb8\xe8\x40\x0d\xfb\xf8\x62\xfa\x9c\x78\x66\xff\xfc\xfd\x77\xc2\x3a\x69\x32\x54\x17\x3b\x17\xd8\x3b\x43\x0a\x2f\x39\xd5\x7b\x5c\x75\x6a\x6c\x56\x34\x60\x66\x49\x6e\x0d\x72\x87\xb8\x2a\xdb\x1b\x44\xf4\xf4\x16\xae\xb4\x8e\xfa\x68\x63\x68\x9c\x34\x14\x5c\xe3\xb4\x18\xbf\x71\xff\xdb\x9a\xbd\xb6\x35\x3b\x1a\x79\x8b\x76\x34\x5a\xb8\x6a\xfd\x1a\xde\xf9\x75\x03\xab\x16\x2d\x28\xbe\xd8\x85\x1b\xb0\xba\x85\xab\xab\x2e\xb7\x3c\x46\xa3\x35\xd7\xc7\xbd\xaf\x3a\xbe\xe9\xf6\x63\xf7\xf1\xf4\x17\xd8\x21\x2b\x03\x75\xdd\x2f\x80\xd6\xae\x58\x05\xf3\x47\x85\xa6\xdb\x4e\xb8\x40\xf4\x02\x1a\xd0\xe4\x88\xff\x56\x9d\x89\x78\xb7\x1c\xbe\xae\x19\x0f\xd0\xc6\x75\x83\xa7\xec\xf3\x84\xd3\x9f\x40\x4e\x59\x49\x9b\x07\x37\xb2\x37\x76\xbb\xe4\x98\x9e\xb1\x08\x93\xf0\x69\x7f\x23\xe5\x5f\x34\x14\xd3\xbc\xeb\x51\xde\xe1\x68\x10\x8a\x41\x77\x4a\xd3\x8c\x25\xdd\x34\x19\x76\xdf\xb8\xcf\xf5\xff\xa4\x7e\x76\xdc\xf7\x34\x08\x78\x34\x86\xcc\x90\x8e\x58\x55\xf5\x3e\xa6\x49\xca\x0e\x23\xfc\x82\xb1\xa5\x3a\xb1\x53\x43\x6e\x71\xbb\x6d\x02\x01\x54\xb1\xe7\x2f\x04\xb9\x60\x64\x42\xcf\x19\xa1\xca\x9b\x8b\x0c\x68\xf2\x83\x6d\x74\x20\x82\xf9\x61\xaa\xd3\xb0\xf2\x68\xec\x34\xbb\xa4\x59\x70\x84\x11\x2b\x11\xfe\x82\x47\x1a\xde\xac\x18\xcf\x8c\x16\xcd\x36\xd5\xac\x82\xeb\x35\x1d\x0e\x21\x89\x4d\x2c\x32\x16\x41\x52\x9b\x48\x44\xe4\x37\x96\x08\x32\xa5\xc9\x98\x9b\x20\x6a\xb2\xaf\x1d\xd5\x0e\x46\x4f\x79\xa6\x6f\x38\x63\x96\x1d\x88\x69\x3c\xcb\x58\x00\xef\x0b\xd9\x52\x47\xc2\x9b\x8e\x21\xaa\xd7\x6c\x24\xd7\xa1\x99\x49\x9c\x44\x74\x1e\x82\xfd\xe9\xdf\x72\x0f\x6a\x36\x10\x7a\x07\x53\x10\xab\x29\x75\xf1\xe0\x7c\x2f\x8f\x48\x65\x25\x56\x98\x2c\x49\x9d\x5e\xdd\x25\xba\xcf\x9d\x61\xc8\xc1\xc4\x3f\xc8\x26\xe4\xae\xd7\xe2\xdf\xe5\x80\x3b\x3c\x8a\x58\x02\x9f\x35\xa1\x75\x82\x46\xca\x23\x96\x90\x74\x22\x66\x61\x00\x21\xe6\x20\x12\x4b\xe0\x87\xa1\xc3\x18\x72\x8a\x28\x07\xa6\xd6\x33\x92\x3b\xe6\xc9\x0f\x7a\x7a\xcd\x09\x29\xbb\xa7\xec\xfd\xb4\x23\x29\xbc\x12\x95\x73\x22\x6c\x73\xa8\x36\x03\xd7\x08\x74\xb6\xeb\x86\x74\xce\x92\x14\xbc\x04\x8f\xf8\x34\x0e\xf9\x88\xb3\xa0\x4d\x06\xb3\x8c\xf0\x28\x8d\xd1\x55\x7e\x4e\xbc\x95\xd3\x48\x89\xbb\x54\x50\x79\xa1\xfc\x05\xff\x09\x6b\x3d\xa2\x21\xf9\x98\x62\x55\xeb\x23\x9b\x09\xc2\xa2\x54\x1e\xf8\xe8\x38\x89\x86\xb0\x4e\xff\xd0\xf3\xcf\xfa\x22\x80\x0e\xc7\x6d\xca\x95\x3b\xa3\xd3\xd9\xf5\x98\x48\x6a\x19\x87\x44\xfa\xb7\xa1\x3b\xed\x09\x1b\x75\x4c\x81\x06\xcb\x43\xb8\x55\x72\x4d\x15\x48\xd9\xcb\xd5\xf0\x9a\x9e\xf0\x80\x1d\x71\xf0\x40\x7d\x2b\x02\x34\x5e\x92\x3d\xc8\x97\x9b\xc8\x72\xe5\xf0\x25\x78\x72\xdd\x02\x79\x41\xaf\x1c\x18\x16\xc1\x86\xe6\xd1\x76\x42\x6e\x2b\xbd\x75\x9b\x34\xfe\x37\xf2\xac\xa5\xe7\x62\x06\x0e\x3b\x53\x91\x66\xa0\x7d\x0e\xe7\x84\xc9\x8b\x06\x3a\x32\xa3\x37\x78\xc0\x9c\x48\x0d\xff\x1b\x0d\x12\x71\x91\xb2\x04\xfc\xe9\x29\x19\x4e\x68\x34\x64\x92\xaf\x24\x7f\x62\x06\xd6\xbf\xcb\x75\xf0\x8f\xce\xff\x46\xef\x43\x46\x53\x89\xfd\x1c\xa3\x3c\xf0\xa9\xbc\xdd\x10\x95\x28\x8c\x45\x81\x36\x9f\x36\x35\x08\xf1\xec\xa5\x6f\x39\xe2\x6e\x39\xb3\x27\xa7\xa6\x2c\x4e\xd8\xb9\xde\x98\x1d\xf5\xba\xfd\xa8\x4e\x0b\xa7\x9a\xe1\x6a\x1a\x04\x28\xb8\x76\x3d\x4e\xa1\xe0\x30\xb8\xd4\x66\x12\x69\x87\x47\x01\xbb\x7c\x37\x52\xa0\x79\xf1\xb9\x04\x95\x33\xbb\xb3\x57\xb8\xe2\xea\xef\x9e\xe4\xa8\x88\x1f\x97\xcb\x53\xfb\x35\xed\xc4\xb3\x74\x52\x6c\x2f\xcf\x1e\xb6\x41\x8c\xbb\x98\xbb\x13\xb8\xbc\x9a\x3a\x8c\xa0\x54\xef\x56\xbf\x52\x14\xf1\x79\x3d\x03\x96\x75\x46\xd7\xed\x92\x23\x79\x58\x8a\x99\x51\x7e\x98\x64\xea\x24\x85\xc3\x74\x48\x23\x92\xb0\x73\x96\x64\xb6\x8e\x76\xf8\xe2\x19\xfa\x87\xd3\x30\xd4\x14\x95\xbc\x87\xfe\xd5\xb7\x15\x7c\x8e\xac\xa6\xef\xea\x40\xd7\xcd\x79\x26\x24\xc5\x53\xda\x54\xf3\x8c\x22\xf2\x5c\x91\xbf\x52\xd8\x5a\xa7\xf6\x05\x0f\xc7\x69\xee\x8e\x07\xb3\xee\x5f\xe4\x4a\x3c\xab\x48\xa1\xf7\xde\x75\xe4\x99\xd7\x1f\xb9\x0d\xde\xcd\x35\x74\x97\x34\xe2\xcb\xc6\xd3\x5b\x5e\x5f\x20\x50\xa5\xde\x69\xcc\xc9\xf3\x7f\x33\x96\xcc\x8f\x58\xc8\x86\x99\x48\x9e\x87\x61\xb3\xd1\x99\xce\xf8\x0e\x46\xb5\x74\x7a\x64\xbc\x9f\x39\x7a\x33\x73\xf2\x77\x07\xa3\xe6\x48\xc2\xc9\x5d\x8f\xf2\xba\xf1\xdc\x00\xf2\x13\x68\x31\x9d\xf0\xd3\x9c\xab\x87\x1d\x2a\x32\xb9\x8b\xca\x03\xf5\x90\x54\x4c\x9c\xfb\xb3\x6a\xd6\x34\xbe\xab\xbc\x21\x46\x15\x4f\x91\x67\x26\x2e\x67\x99\xaf\xb6\xbb\xa8\xaf\xbc\xed\x44\x79\x2b\x5c\xcb\x8e\xf2\x6c\xd5\x1d\x25\xed\xa4\x71\xc8\x87\xcc\xa0\x68\x93\xbd\x02\x66\x6f\x45\xef\x5a\xec\x35\x53\xe1\x2e\xc4\xa7\x15\xe0\xf5\xfc\xec\x99\x80\x6d\xc2\xb6\x6b\x33\xed\x32\xac\xe4\xf6\x99\x93\xbb\x64\xef\x34\xc7\x41\x86\x6f\x72\x5b\x53\xc1\xed\xb0\xe4\xd0\xb1\x7b\x54\xf5\x16\x5e\xb5\x89\xa7\x13\x71\xb1\xc2\x26\x6e\xbc\x85\x88\x91\xdc\x54\xb7\xd9\xed\xa2\xf5\xca\x05\x97\xc7\x33\x3d\x63\x04\xee\x84\xe0\xc9\xc4\x2e\x33\x92\x89\xd8\x06\xc0\xd0\x16\xe9\x99\x20\x94\x1c\x7d\xa8\x3d\x79\xa8\xf9\xd3\xf8\x67\x21\x03\x9e\xf8\x7c\xb8\x43\xf6\x4e\xab\xce\xa1\x85\xeb\xcd\x51\xe3\x7a\x6b\x4e\x55\xbc\x7d\xdb\x6f\x4b\xeb\xb7\xcb\xfa\x00\x0b\x62\x8a\xa6\x2a\xaa\x99\x92\xe8\xc6\x9f\xe5\x8d\xa1\x27\xff\xaf\xad\x16\x7b\x4f\xfd\xb7\xed\x74\xa6\xe7\xfc\xad\x94\x5b\xee\x50\x14\xba\x0a\x29\x56\xf1\xa2\xbd\x1d\x3d\xce\xfd\x2f\x4b\x26\x5c\x9c\x88\x31\xcb\xf0\x61\xfc\xd4\x7b\xfb\x63\x59\xf1\xd5\x1f\xe9\xfc\xf8\xf0\xea\xc7\x07\x99\x32\x61\x23\x3d\x2c\x94\xff\x67\xe2\x04\x3f\xd1\xf6\x6d\xaa\xc5\x7f\x73\x06\x76\x52\x50\x16\xd3\x04\x5e\x96\x80\xa4\xa7\x0d\x59\xae\xaa\xa5\x8b\xdf\x29\x2c\xdf\x95\x48\x17\x1f\x7c\x99\x33\x4d\x5d\xd1\x91\xfd\x61\x01\xdc\xcb\x23\x79\xe6\xbe\x6f\x52\x27\xa9\x92\xb3\x39\x91\x67\xc4\xfd\xf9\x54\xbe\xb8\xc9\x05\xa3\x67\x28\xb2\xfa\xf1\xf5\xf3\x83\x9f\x5f\x1f\x1e\x1d\xcb\x3d\x11\x92\x5e\x85\x10\xbc\x80\x34\xd2\x61\xc2\x63\xb0\x2b\x87\xad\x19\x44\xb4\xb0\xcd\xa7\x3f\xf1\x80\xa2\x13\x8c\xb3\xe8\x55\x21\x04\x28\xb1\x8f\x50\x4b\x5d\x7c\xa7\xe9\xdf\x26\x4e\x37\x1d\x6b\xe7\x12\xf9\x59\xfd\x7c\xea\x73\x90\x61\x8f\x3d\xb9\x5b\x98\x1e\x9b\xf3\x5a\xd5\xea\x64\xe2\xb5\xb8\x60\xc9\x01\x4d\x59\xb3\xd5\x52\x87\xb5\x0d\xdd\x9d\xda\x19\xb1\x21\xcd\x55\x99\xbf\x83\xcf\xc0\x5a\x66\x80\xc3\xc0\x2c\xc5\xf2\xc4\xd0\xf1\x56\xa0\xa4\xf5\x54\xee\xd3\x2c\x0d\x79\x94\xed\x28\x8b\xb4\x9d\x90\x47\x8c\x44\x62\x07\x02\x6f\xed\x24\x8c\xa6\x29\x1f\x47\xb7\x88\xac\xac\x6c\x79\x71\x6b\xb0\x67\xb5\xf1\xcc\xc9\x49\xeb\x5d\x8d\x04\x34\x68\x86\x8b\x5f\x71\x74\x72\x42\xec\xdc\xc3\x17\xe7\xfe\x30\xb0\xf2\x2d\xa5\xd4\x6f\xe1\x74\xd8\xb7\x96\x61\xb1\x26\x7a\xd6\xd9\xa6\xc1\x80\xc7\xed\x89\x35\xbc\xb8\x52\x9f\xdd\x20\x14\x28\xd7\xf3\x7c\x8b\x25\xf2\x1d\x75\x67\x83\x14\xb0\x33\x86\xd7\x06\xcf\x72\xd8\x51\x88\x54\xd4\x55\x41\x67\xae\x9c\x7e\xbb\x7c\x5f\xa0\xdd\x5b\xd3\xe9\x4a\xf2\xbe\x05\x7d\x48\xf9\x8c\x2b\xce\x73\xa6\x46\xa5\x67\xd3\x73\x79\x85\x32\x4a\xcb\x44\xce\xfa\xda\x7e\x67\xb4\x89\x41\xae\x37\xb9\xfd\xed\xe1\x57\xad\x3d\x59\x9c\x1d\x6e\xab\xb9\xcc\x6e\x3e\xf5\xdc\x17\x95\x27\x0e\x83\x7b\x6d\x2f\x29\xd7\x8d\x64\xcd\xda\x6e\xd2\x9f\x2f\x29\x9d\xcd\xdb\xea\x0c\x5e\xcb\x27\x8a\x01\x24\xcb\xa4\x16\xb9\xee\x3c\x21\x3a\x99\xc7\xce\xde\x75\xa6\x08\x29\xcd\xff\xd1\xb6\xef\xab\x0f\x70\xde\x90\x71\xc2\xe6\x64\xc2\xc7\x93\x50\x62\x57\x9f\x7f\x61\x83\x33\x9e\x1d\xd3\xf8\x27\xfd\xe1\x40\x84\x22\xd1\xf9\x46\x62\x1a\xb2\x2c\x63\x9d\xa1\x98\x4e\x45\x84\xc9\xe4\xf1\x6a\xaa\xf1\x0f\xe8\xf0\x6c\x9c\x88\x59\x14\xd4\x55\x04\xcc\x3f\x86\xd4\x5a\x1c\x5a\x7f\x19\x5d\xc5\x4d\x62\x8a\x6f\x90\x66\x43\xc4\x74\xc8\xb3\x79\xa3\x65\xe7\x2b\x0c\x0f\x26\x34\x1a\xb3\x1e\x31\x5f\xf5\x47\xf5\x3b\x97\xfd\xc4\xf1\x65\xff\xbc\x52\xa7\x9d\xd1\xba\x96\x82\xd7\x91\x1d\xe5\xc0\x04\xdf\x0f\x30\xd6\x24\x8f\xd2\x8c\x46\x43\xd6\x46\xf9\x75\x14\xb0\x84\x50\x02\xdd\x81\x8f\x3c\xc0\x37\x31\x3d\xa7\x19\x4d\x36\xcf\xc6\xf0\x56\x3f\x56\xd6\x09\x14\xfb\x16\x9f\x34\xd7\x11\x1a\x16\x6e\x0c\x5f\x7f\x12\x86\xd5\x72\xaa\xf0\xa5\x72\xa9\x00\xa3\x69\xe5\x9d\xea\x26\xd9\x21\x46\xa5\xe6\xc5\x5b\x75\x14\x65\xc6\x8b\x26\xb6\x71\xd6\x8c\xeb\x23\x7a\xca\xa3\xb9\x6a\xde\x4f\xde\xfa\xc8\xab\xef\xbe\x87\xbc\xeb\x1d\xef\x00\xb8\xbe\xf1\xdc\x89\x19\x80\x20\x3c\x1f\x29\x60\x45\xb7\x69\x34\x6c\x26\x27\x4b\x39\x26\x9b\xc6\x8c\xff\xaf\xeb\xfe\x08\x6e\xd4\xba\xe5\x25\x5c\xb6\x96\xf7\xd3\xb2\x83\xb4\x33\xd0\x72\x53\x5d\xbb\x12\x98\x25\x7c\xd3\x1c\xaf\xb4\x65\x12\x97\x7b\x03\x6c\x13\xef\x39\xd1\x53\x4f\x91\x7c\x84\x10\x27\x7b\x3f\x5e\xa9\x35\xd7\x80\x31\x32\x2c\x52\xa4\xe1\x72\x7a\x3f\xa5\x7f\xfd\xbc\xf4\x22\x74\x82\x1d\xb7\xff\x2c\xdb\xd8\xad\xab\x45\x4c\x83\x01\x4d\x1d\xfe\xad\x9d\xa3\xd6\x2a\xe8\xd4\x1a\xa8\xdd\xb3\x96\x45\xc8\x9d\xe8\x01\x35\x1b\x54\x0b\xc2\xa4\x8e\x5a\xca\xce\xc0\x70\x50\x89\x0f\x1d\xcf\xf9\xbb\x6d\x60\x7b\x6e\xcd\xcd\x4d\x00\x05\x72\xd5\x6a\x3a\x99\x1d\xb7\x21\xac\x7c\xf4\x55\x3f\x31\xbf\x65\xad\xfe\x96\xb5\xfa\x2f\x9a\xb5\xfa\xeb\x34\xf2\xfe\x22\x5f\xc3\x9b\xa6\x83\xd4\x61\x10\x33\x41\x62\x4c\xbb\xcb\x23\x22\x12\xf9\xd4\x91\x97\x7d\x4c\x01\x83\xd1\xeb\xc1\xa0\x43\x12\x0e\x04\xa6\x7f\xe6\xd7\x8e\x79\x39\xf8\xc9\xdb\x20\xd1\xd7\x80\x11\xed\x4d\xca\x23\x95\x3f\xc0\xa4\x73\x83\xac\x15\x10\x74\x61\xd1\x1b\x62\xe9\x27\x84\x24\xb2\x49\x88\xbc\x6e\x98\x7d\x44\xb0\x30\xce\x3e\x82\x6d\x2d\xd0\xbe\x4d\xc6\x4c\xfe\xec\x91\xf6\x71\xa8\xab\x84\xda\x57\x93\xb3\x46\xac\x7d\xe5\x47\x3f\x37\x4e\xf7\x37\x10\x61\x5f\x33\x54\x79\x88\xfd\x0d\x82\xd7\x77\xbb\xe4\x68\x16\x83\x1d\x20\x1c\x1b\xff\xdc\x7b\xd0\xb9\x6c\x9b\xa5\x87\x6a\x9a\x80\xd0\x0c\xd3\x8e\xc4\x82\x7b\x91\x70\x6e\x97\x38\xcb\xe3\x08\xd4\xfc\xe6\x23\x49\xa3\x58\x47\x85\x32\xd9\x6a\x94\xf5\xaf\x6e\x8c\x1b\x07\x54\x87\xc6\x67\x51\x49\xf3\x25\xcd\xea\x80\x32\x15\x4d\x39\xf1\x66\x8a\x91\xf5\x81\xf9\x4b\x82\x84\xe3\x92\x30\xe6\x44\xfe\xab\x1e\x1e\xf4\xc5\xc0\xe1\x73\x96\xe4\xb4\x88\x01\xcd\xe8\xce\x74\xc6\x77\xf0\x80\xf4\x35\x89\xb6\x2b\xbe\x99\xb7\x8d\x64\x9e\xeb\x1a\x21\x1e\xa0\x5c\xe9\x2c\x0a\x20\x02\x43\xd3\xa9\x51\x63\xa0\xa6\xb6\x2c\x0b\x5c\x39\xa7\xde\xdc\x57\x4c\x6c\x8e\x3e\xcb\xcc\xae\xeb\x00\xef\xf4\xeb\x06\xd9\xba\x04\x74\x86\xec\x67\x8e\xb6\xe7\x99\x89\xc4\x9d\x9b\x52\x2f\xf4\x93\x47\x0c\xb7\x09\x9f\x4a\xd8\xf9\x4a\x2a\x79\xc1\xfe\xdd\xad\x78\x41\xbc\xd4\x3a\xc2\x94\x93\x65\x89\x10\xc1\x85\xe8\x9b\xa5\xc1\x37\x21\xc1\xbe\x81\x90\xbf\xfc\xe8\x7c\xb2\xc4\x9d\x8f\x6e\x97\xfc\x38\x87\xac\x0c\x68\xfa\xcd\x53\x32\x65\xd9\x44\xc8\x6b\x50\xe9\x8e\x4e\xa3\xc0\xad\x5c\xb6\x23\xb6\xc9\x5c\xcc\x1a\x09\x23\x6c\x34\x62\x10\x1a\x25\x9c\xdb\x3c\x59\x94\x7c\x77\x21\x92\xe9\x44\x84\xec\x3b\x92\x4d\x68\xe6\xa2\x1b\xcd\xa2\x88\x85\x29\x81\x0b\x4d\x23\x25\x13\xce\x12\x9a\x0c\x27\x7c\x48\x43\x32\x03\xfc\x29\xc9\x26\x89\x98\x8d\x27\x68\x9a\xa6\x6f\xae\x44\x44\x84\x46\x2e\x2e\x16\x65\x3c\x91\x4d\x07\x7c\x34\x62\x70\xcd\x8d\x69\x92\xb9\x79\x9b\x3a\x06\x5e\x12\x00\x28\x6c\x72\x27\xaf\x1a\x7d\xaf\x82\x7d\xd3\x8c\x0e\x42\xd6\x47\xb2\x1f\xcd\x06\x59\xc2\xd8\x61\x94\x09\xe3\x98\xa0\xae\x18\x6e\xe3\x2a\x0c\x95\xdd\x1c\xab\x63\xa3\x55\x6f\xc6\xb5\x49\x1e\x56\x8e\xea\xbb\x20\x76\xef\x92\xa1\x61\x3d\xee\xdc\xd7\xec\xb9\xc1\x3e\xb3\xe6\x46\x53\x17\x6d\xb2\xdb\x25\x07\x54\xf9\x09\xe1\x5c\xb0\x40\x39\x09\xed\xa4\x26\x65\xc9\xc2\xc4\x1c\x65\x8b\x2d\x27\x98\xae\xec\x6a\xd3\x1a\xef\x54\x31\x82\x17\x4d\xbe\x9e\x09\x6e\x55\x8c\xb9\x18\xbd\x0b\x5b\x5f\x18\xbe\x4b\xdd\x82\x4b\x64\x8f\xf8\x48\x32\x62\x47\x05\xb8\x8e\x98\xfb\xf3\x9f\xe7\x09\xba\xd4\xdb\x51\x09\x76\x8b\x72\x5a\x4d\x93\x6d\x48\x5a\x1f\x7f\x99\xc6\x8a\x31\x4d\x53\x7e\xce\xde\xc5\x2a\xa8\xb6\x9d\x14\xe3\x3e\xee\x94\x3a\x0e\xea\x4e\x69\x89\x27\xbc\x5b\x27\xe7\x81\xef\x7c\x1a\xd2\xe8\x63\xca\x50\x90\x55\xb0\x0e\xf2\xc7\x56\xe9\x85\xfb\xa4\xce\xe2\x67\x29\x0b\x9e\x9b\x72\xe3\x3d\x74\x5c\x0d\x4b\xfc\x78\x47\x74\xc8\x06\x42\x9c\x75\x47\x83\xff\xf8\x6e\xbb\x72\xcc\x74\xcc\x52\xfc\x92\x26\xc3\xee\x50\x24\xac\xfb\xf2\x92\x0d\x67\x10\xcb\x27\x3a\xe7\x89\x88\xe0\xaa\xf5\x9f\x14\x26\xc3\x9d\xd9\xb2\xd9\xbe\x7d\xbb\xa9\xd6\xb9\x32\xe8\x85\x38\x5b\x86\x06\x0d\x39\xbc\x9c\xef\x65\x49\x91\xff\x1c\xd0\x84\xa8\x21\x78\xc9\x27\xdb\xab\x3b\x77\x48\x23\x0f\xd0\x90\x57\xa3\x0b\x65\xad\x2c\x91\xd7\xf3\x5a\xf9\x57\xbf\x89\x12\x18\xaf\x15\x20\xd5\xcb\xc7\x77\xf5\x09\x89\x63\x2a\x65\x7c\xbf\x34\x37\x12\xfb\xad\x30\x88\xf2\xc5\xe5\x97\xfa\xd8\x9c\x6f\x85\xce\xbe\xc7\x25\x4c\x04\xac\xe1\x74\x09\x56\x7b\x23\x02\x96\x44\xfc\xb7\xc4\xf9\xcb\x65\x38\x95\xc0\x74\x27\x60\x19\x1b\x66\x69\x37\x10\xd3\xae\xda\x28\x20\x86\x44\xa8\xe6\x2d\xd5\xec\x56\xb5\x8b\xe4\xcb\xf3\xc1\x3a\x90\x55\x87\x13\x2f\x0e\x61\x21\xf0\x85\x6b\x46\x8b\xd0\xda\xdf\xb2\xe0\xc5\x03\x9f\x0b\x71\xc5\x52\xa4\x64\xfa\x3e\xdf\x1d\x34\x3f\x07\xb8\x2c\x99\x1b\x64\x8a\xcd\x0b\x71\x79\x1a\x19\x4b\xb3\x46\x5b\x49\x88\x4a\x74\x8e\xfb\xbe\x22\xbd\xa1\xc6\xdf\x70\x63\x98\x8e\x59\xe6\x3f\xca\x9b\xfe\xb5\xa5\xaa\xb3\x6e\x12\x42\xe7\x49\xab\xaf\x29\x57\x64\x48\xb3\xe1\x04\x23\xf1\x5c\xd5\xd8\x35\xb3\x69\x9c\xcd\x71\xcc\x7a\xea\x4b\x9b\x7c\xea\x49\xf7\x2a\x40\x74\xd8\x10\xf9\x7f\xf9\x13\xef\xc9\x97\x75\xe2\xad\x70\xaa\xec\x39\x1a\x94\x4d\x4e\x95\xe2\x0d\xc3\x87\xb9\xa1\x83\x47\xb9\x0a\x98\xa6\x72\x73\x28\xda\x24\x6e\xcb\x1d\x2e\xf1\x0c\xfd\xea\xd9\xdb\xa9\x54\x62\xba\x7c\x6f\x77\x23\xda\xc3\x46\x2f\x44\x95\x4e\xee\xde\x93\x96\x15\xff\xff\x8b\x65\x98\xf4\x37\xe3\x53\x96\x66\x74\x1a\x9b\x8c\x51\xb3\xe9\x80\x25\xf2\xd7\x94\x87\x21\x4f\xd9\x50\x44\x90\x20\x98\x66\x18\x92\x82\x85\x34\x4e\xe5\x83\x83\x47\x43\x26\x71\xc9\x5a\x1f\x23\x7e\x49\x58\x2c\xe4\x52\xda\x23\xff\x4d\xa3\x19\x4d\xe6\x64\xef\xc9\xa3\x5d\xb2\xbb\xdb\x83\xff\x91\x8f\xc7\x07\x2d\x9d\x3b\xf8\x9f\x69\x46\x33\x3e\x84\x3f\xa7\x4c\xb6\xf8\x6e\x44\xfa\xf8\x45\xe2\x25\xfb\x9d\xfb\x9d\x5d\xf8\x3d\xa4\x19\x1b\x8b\x64\x4e\x5e\xd0\x0c\xda\xfb\x27\x4e\x75\x4a\x3e\x63\x5f\xaf\xc8\x07\x55\xe0\x0d\x08\x02\x17\xfc\x93\x5d\xd2\x69\x1c\x32\xd5\x6c\x5f\x92\x82\x25\x76\x72\x01\x12\x08\xf8\x3d\xfa\x11\xa6\x22\x64\x9d\x50\x8c\x9b\xfd\x4e\x04\xd9\xf6\x76\x08\xc2\x3c\x95\x20\x57\x6d\xa2\xca\xf1\x77\xb7\x4b\x9e\xfd\x83\xbc\x16\xe3\xb4\x6e\xee\x78\x46\x32\x21\xce\x4c\xda\x49\xe8\x43\x02\x7a\x9c\x73\x31\x84\x98\xc0\x56\xe5\x12\x81\x13\x9f\xe9\xa0\xc7\x5c\x92\xba\x1d\x39\x0d\xd8\x07\xb4\x3e\x2c\x38\x01\x45\x98\xa8\x28\xc7\x5b\x9b\x05\xca\x93\x3d\x3b\x9a\x4f\x07\x22\xac\x52\xdc\xdf\x53\xdc\x85\xc1\x1d\xe4\x50\x07\x33\x1e\x66\x3b\x3c\xd2\xe2\x9a\x84\x81\x8c\x63\xc8\xd2\x8e\x1e\x2c\x9a\xb6\x80\x5e\x82\x3c\x23\x6a\xb3\x8a\xb5\x9a\xc2\x45\x98\x09\xcc\x3f\xa9\xaa\xa4\xd0\x82\xb8\x88\x54\xbc\x88\x8c\x3b\x58\xfd\x20\xf4\xe4\x99\xdb\x4c\x2e\x42\xbd\x5d\x11\xba\x95\x84\xa5\x22\xc4\xb8\x00\xb2\xf8\xe4\x53\x26\x8e\xc0\x5e\xe6\x98\x8e\x3f\x61\xea\xea\x5e\xb7\xcb\x86\x53\xba\xa3\x34\x67\x72\x26\x69\xd8\x11\xc9\x18\x8b\xf7\x1f\xee\x77\x1f\x75\x76\xbb\xff\x2f\x65\xc3\x1d\x91\x1b\x53\x27\x13\xca\xfc\x46\x62\x17\x23\xdc\x70\x53\x87\xfe\x34\x93\x27\x05\x54\x3b\x56\x4d\xe7\x86\xa0\x7b\xa4\xe6\xe7\x47\x3d\xcf\x80\xaa\x6c\x9a\xd3\xf9\xf4\xd8\x8e\x82\x3c\xd3\xa4\xfc\x41\xfd\xd1\x71\xc6\x48\x7a\xde\xa3\x42\xcd\xce\x73\x92\xc6\x6c\xc8\x69\xc8\x7f\x63\x01\x39\x67\x49\x8a\xe1\xc6\xc8\xa7\x01\x4d\xd9\xbf\x58\x26\x67\x87\x5c\x4c\xf8\x70\xa2\x62\x81\xa6\xe4\x53\x11\xf9\x27\x67\xb8\xb0\x3c\xe3\x84\x9f\xeb\x65\xad\x72\xf6\x7f\x7f\xa5\x06\x72\x3c\x61\xea\xaf\x4c\x10\xf0\xc8\xed\xf8\xcb\x1f\x27\xd2\x5f\xfe\x09\xbd\x20\x1e\xc9\x72\xf6\x90\x63\x96\x7d\xa0\x17\xc7\x74\xdc\x04\xd4\xf6\x42\xc5\x25\x5b\x90\x67\x39\xe6\xc1\x77\x2b\x80\xb6\x73\xd3\xd8\x72\x3c\xb9\xc8\x33\xec\xe9\x89\x0f\x82\xae\xc6\xf6\x8e\x54\x0a\x53\x74\xd9\x95\xdd\x99\x45\x53\x9a\x9e\x79\x79\x94\xfd\xbb\x8a\x36\x68\x4c\x58\x8a\x87\x64\x19\xe3\x38\xdd\x87\x0b\x8f\xbc\x0b\x6a\xcc\xee\xfd\x10\x06\xef\xca\xd3\xca\xfb\x99\xd1\xb1\xbe\x36\x79\x42\xbe\x80\x85\x2c\x63\x55\x53\x60\x24\x39\xce\x46\x06\x9d\x86\x23\xb0\xb0\x7d\x19\x0a\x95\x6c\x62\xcb\x44\x0e\x84\xfd\x6a\x1b\x1b\xd1\x57\xbd\x4b\x48\x3c\x07\x22\x3a\x67\x72\x92\x3f\x01\xba\x4f\x28\x9e\xc6\x86\xc8\x2c\x95\xff\xff\x29\x3f\x74\x83\xe6\xd3\xea\x6b\x76\x88\xed\x2d\xb1\x6a\x15\xa4\xbc\x55\x20\xdf\xfa\x8b\x56\x78\xe3\x74\x57\xae\x16\x19\x2e\xe4\xfd\x32\x4e\xf3\xd1\x96\xb0\xdb\xd7\x1d\x88\x6f\xb1\x2b\xd9\x5f\xdc\xdb\x6b\xab\x9e\x74\x7f\x0a\x57\xb2\x2d\x06\x71\xfc\x0b\xb9\xa9\x29\x49\x9f\xf6\x06\xdf\xc8\x3e\xcf\xc5\xb5\x35\xa7\x35\xa8\x38\xa1\x81\xb8\x70\x12\x63\xa1\x57\x94\x2a\x2e\xc9\xcf\x84\x5f\xda\x04\x9c\xb5\xf5\x5d\x42\x81\x9f\x34\xf0\x8f\x06\xb9\x8b\xdf\x4f\x9d\xd4\x68\x03\x71\x79\x04\x5f\x7b\x0a\x1c\x6f\x0c\xda\xc3\x37\xf7\xb6\xae\x4a\xc7\xe3\xfb\xd6\x2d\xf0\xe9\xb2\x9f\x3b\x31\x8d\x59\x82\x2d\xb6\x15\x22\xb9\x4f\x06\x0e\x2e\xb0\x4a\xfc\x40\x03\x3e\x4b\x7b\x64\xdf\x55\x59\xaa\xe1\xb5\xae\xc7\x0f\xec\x6b\xf4\x75\x42\x53\x4e\x9d\xd9\x74\xa6\xaf\x5c\x70\x15\x17\x22\x73\x4c\x36\xc9\x4b\x0e\xde\x3e\xe6\xc6\x91\x09\x09\xaf\x14\xe4\x4c\x29\xb5\x85\x04\x70\x2d\x11\x75\xef\x6c\xbe\x9d\xd5\x54\x6d\xde\xe2\x5b\x53\xe3\xe6\xe2\xb8\x1e\xc5\x9b\x83\x31\x67\x02\x8a\x4b\x81\x04\x2c\xce\x26\x6d\x32\x14\x49\xc2\xd2\x18\x45\x30\x82\x7c\x0a\xe2\x4f\x84\xab\xa8\x90\x31\x1b\xaa\x99\xc5\x8c\x6d\x90\x41\x5c\x4e\x2c\x5e\x16\xc9\x80\x65\x17\x8c\x45\x64\x97\xd0\x28\x20\xfb\xf7\x09\x8f\x86\xe1\x2c\xe5\xe7\x8e\x0d\x2d\x0b\xd9\xb9\x4a\x4a\x54\x31\x2c\x94\x69\x54\x3a\xb8\xa9\xd5\x22\x3b\x1a\xb1\x04\x23\xa7\x29\xd9\x69\x60\x9b\x49\xff\x6f\x46\x93\x65\x1c\xdc\xac\x45\xa8\x5c\x96\x05\xa7\xb5\x25\x7d\xd2\x54\x62\xd5\x0a\xbf\x34\xa3\x29\xf6\xc1\xf2\x29\x78\xb1\xcf\xe6\x3b\xfe\xd4\x1f\xcd\xbc\x99\xef\xa6\x64\x63\xdf\xb6\x0a\x7f\xb6\xa1\x9b\x0d\x14\x7b\x23\xff\x32\xed\x1a\x37\xb7\x0d\xe3\x33\xda\xa1\xfd\xe3\x19\x06\xcc\xb4\x25\x7f\x27\xfb\x0f\x8a\x99\xed\x79\xea\x80\x7c\x82\x98\xd9\xe6\xe7\x5d\xd2\xf8\x44\x38\xe6\xb8\xe7\xd3\x18\xd9\x9e\x05\x9d\xb2\x70\x8a\xae\x4f\xe1\x4a\xa9\xd4\x98\x77\xc0\xe4\x47\xf0\x83\xd3\x9d\x1e\xd9\x6d\x9d\xae\xe2\xcd\xa7\xf8\xbb\x4d\x6e\xe3\x94\xbb\x9e\x7c\xef\xd1\xc3\x68\x59\x6f\x3e\x8f\xef\xda\x4b\x39\xf3\xd9\x19\x31\x1e\x7b\xf8\x96\x81\xe5\xf1\x07\x79\xe7\x7d\x21\x3b\xb1\xd3\xad\x8d\xeb\xf7\xbe\x8c\x93\x20\x37\xd3\xcb\x6e\xce\xb9\x6a\x4b\x6c\xb6\x4e\x8d\x3f\x8d\x9f\xa2\xbb\x3f\xfe\xd9\xae\x08\xcb\xce\x81\x3d\x0c\x2a\x27\x15\x59\x66\x59\x84\xe6\x9c\x59\xde\xf3\x13\xb7\xa6\x12\xd3\x2b\x67\xe3\x30\x3e\xcd\x0e\x8b\xef\xbb\xbc\x7b\x7d\x7e\xa1\xd0\x1d\x70\x0a\x85\xbf\xb6\xe3\x11\x7a\xaf\x36\x7c\x9d\xc5\xa2\x10\xf7\xfb\xcb\x4a\x8d\xca\x85\x40\xa5\x08\x73\x02\x21\x57\x1c\x04\xef\xa8\xee\xf7\x64\x42\x93\xa9\x88\xe6\x3a\xde\xf1\xf7\x5d\xb4\x9c\xec\xab\xe9\xe8\x1f\xbe\x79\xff\xee\xc3\xf1\xcb\x17\xfd\x37\xef\x5e\x7c\x7c\xfd\xb2\xbf\xdb\xef\x3f\x8f\xe3\x1f\x69\xd2\xef\x57\x66\x10\xb8\xbf\x31\xea\xbe\x25\x6d\x49\x13\x9d\xa8\xb9\x14\x16\xbf\x1b\x09\xc3\x99\x21\x4d\x8d\x1c\x12\x01\x44\x22\xda\x99\xd0\xa9\x48\xe6\x2d\xd9\xc5\xb2\xe6\x82\x8a\xd9\xc5\x76\xbe\x6b\x7b\xaa\x39\x73\xf0\xaf\x32\xce\x0e\x7d\xba\x2e\x41\xf6\xfa\xfd\xe7\x10\xf3\xa3\x92\x20\x0f\xee\x3d\xdc\x18\xf5\x06\x04\x71\xb0\x6c\x9d\x20\xd0\xce\xca\x04\x29\x19\xe7\x06\x04\xd9\xef\xf7\x7f\xa4\xc1\x98\xd5\xd0\xe3\xd1\xa6\x98\x37\x20\x87\x45\xb2\x6d\x6a\x40\x33\x2b\x13\xa3\x38\xc8\x0d\x68\x71\xaf\xdf\xff\x51\x64\x99\x98\xbe\xa5\xe7\x7c\x0c\xa7\x4a\x0d\x59\x9e\x5c\x63\x23\x1b\x50\xa8\x14\xdf\xd6\x89\x95\x6b\x71\x65\xba\xd5\xce\x42\x09\x09\xed\x10\x06\x3c\x0a\xe4\xa5\x4e\x76\x99\x8f\x9a\x65\xbd\x16\xab\x4e\x57\xc9\x88\x7e\x9c\x65\x99\x88\xbe\x6b\xb5\x36\x9a\x17\x85\xe5\x5a\x66\xe7\xa4\x0a\xfb\xe9\xda\x0c\x7f\xbf\xdf\x47\x1c\x35\xc7\xf3\x9a\xbb\x8f\x83\x7a\x03\xe6\x76\xb0\x6c\x9d\xa5\xd7\x23\x55\xc9\x38\x37\xd8\x81\x1e\x68\x6c\x3f\xd2\xb4\xfa\x48\xb8\xff\xe0\x5a\xb0\x6f\x40\x97\x1c\xa6\x9b\xa1\x8d\x6c\x6b\x65\xfa\x54\x8c\x79\x03\x1a\x3d\xec\xf7\x0f\x68\x12\x54\x9f\x0c\x0f\xd6\x24\x8f\x41\xbc\x01\x61\x0c\x8e\x6d\x93\x44\xb6\xb2\x32\x31\x0a\x23\xdc\xe6\x4e\x6f\x1a\x53\xbd\x7d\x0e\x1d\x4d\x57\xdd\xd2\xdd\xaa\x6b\x8f\xf7\xc4\x43\x53\xdc\xb0\xb7\x36\x68\x95\x9b\x7c\x9d\x41\xeb\xaa\x1b\x0e\x5a\xa3\xb9\xc1\x41\xff\xc4\x68\xc0\x92\x75\xc6\xac\x6a\x6e\x38\x64\x85\xe5\x06\x47\xfc\x86\x05\x9c\xae\x33\x60\xac\xb8\xe1\x78\x11\xc9\xfa\xd7\x90\x47\xfd\x3e\x84\xdd\x18\x88\xcb\xea\x5d\xf5\xe1\xde\x35\x20\xdf\x60\x67\xf5\xf0\x6c\x7d\x77\x55\x2d\xad\x4c\x99\xd2\xd1\x6e\x70\xd8\x3d\x96\xf8\x78\x5c\x4d\x96\x47\x6b\x92\xc5\x20\xde\x80\x24\x06\xc7\xf6\xc9\xc1\xe3\x95\x49\x51\x18\xe1\x06\x64\x78\xd2\xef\xcf\x32\x1e\xa6\x7d\x48\x44\xff\xfc\x82\xce\xb5\x73\x4c\xf5\xcd\xfd\xc9\xee\xf5\xb7\xb5\x01\xb1\xea\xd0\x6e\x9d\x7e\xf9\x26\x57\x26\xe6\x32\x93\xb2\x89\x58\x6e\xb7\xdf\x7f\xc1\x69\x28\xc6\x35\x2b\x6d\x4d\x41\xa9\x8b\x7b\x13\xc1\x9c\x83\x66\xdb\xf4\xc2\x76\x56\x97\xcc\x95\x8c\x74\x9b\x37\x4c\xb7\x3d\xd3\xeb\x35\xaf\x99\x7e\xe5\x4d\x46\x7e\x92\xc3\xb5\xc5\x6b\x48\xe9\x04\xac\x79\xe5\xf4\x2b\x5f\xc7\x04\xdc\xc0\xcd\xb3\x6e\x02\x8e\xd9\xe5\x66\x93\x00\x08\xae\x71\x22\x00\xdf\x4d\x4f\xc6\x31\xcf\x42\xb6\xde\x34\x60\xd5\xeb\x98\x00\xc4\x74\x73\x43\xbf\xe0\xd9\xe4\x8d\x18\xf0\x90\xa9\x9d\x6c\xc5\xf1\x17\xea\x6f\x36\x09\x05\x74\xeb\x5f\xd5\xf7\xf6\x24\xe2\x73\x1e\xd4\xdc\x3c\x1e\x3c\x5e\xf3\x4e\xe8\x21\xdf\xe4\xa8\x72\xf1\x6c\xff\xac\x82\x86\x56\x27\x51\xd9\x60\x37\xb9\x42\xec\xf7\xfb\x2f\x12\x7a\x51\x77\x25\x7c\xb4\xa6\x64\xca\xc5\xbd\x09\x5d\x1c\x34\x5b\x27\x0b\xb4\xb3\x3a\x55\x4a\x46\xba\x09\x51\xee\xf5\xfb\xaf\x44\x32\xad\xb9\xa5\xaf\xbb\x56\x0c\xe6\x4d\x08\x62\x90\x6c\x6b\x5f\x34\x0d\xb4\xc9\x77\xf2\x0f\x79\x14\x25\x22\x5c\x75\x43\x74\xab\xae\x4c\x52\xd3\x87\x13\x0f\xcf\x36\x8f\x83\xfc\xb0\xff\x95\x88\x59\xbc\xce\xa0\xb1\xe2\xa6\x43\x46\x2c\x37\x39\xe0\xd7\x74\xc0\xd6\xa2\x32\x56\xdc\x74\xc0\x88\xe5\x26\x07\xfc\x13\x64\xbf\x5f\xe7\xce\x97\xab\xbd\xe9\xd0\x1d\x54\x37\x39\x7e\xb5\xaa\xd6\xa6\xbb\x57\xff\x9a\x96\x78\x15\x17\x2c\xbd\xc7\xde\xef\xf7\x31\x73\x5c\xcd\xfe\xbd\xee\x91\xea\xe0\xde\x64\x07\x77\xd0\x6c\xfb\x48\xc5\x76\x56\x27\x4e\xc9\x48\x37\x39\x52\x1f\xf4\xfb\x87\xc3\x1a\x95\xf5\x93\x75\xe5\x24\x06\xf1\x26\xf4\x30\x48\xb6\x4d\x0d\xd9\xca\xea\xb4\x28\x8c\x71\x13\x4a\x3c\x44\x64\x0b\x4c\x08\xf6\xee\xad\x29\x88\xcc\xe3\xdf\x84\x2c\x39\x54\x37\x41\x9c\x35\x0d\x0a\xaa\x46\xbd\x09\xa1\x1e\xf5\xfb\x87\x51\x3c\xcb\x6a\x68\xb4\xee\x35\xd4\xa2\xde\x84\x3c\x16\xcb\xd6\x29\x23\x9b\x59\x9d\x28\xc5\x61\x6e\x55\xb0\x68\x9b\xd3\x5d\x5e\xeb\x60\x75\x6a\x6e\x30\xe2\x13\x17\xcf\x36\xef\x14\xc5\x51\x3f\x0f\x44\x02\x01\xf6\xd6\x1a\xb9\xad\xbd\xf9\xe8\x2d\xae\x0d\xee\x13\x8f\xfb\xfd\x7f\x25\xbc\xda\x74\x64\xff\xc9\x9a\xd6\x56\x16\xf3\x26\xab\xd0\x20\xd9\xf6\x22\x94\xad\xac\x4e\x93\xc2\x18\x37\xd9\x12\x9f\xf4\xfb\xaf\x79\x5a\xb3\x23\xae\x6b\xf8\x66\x31\x6f\x42\x0a\x83\x64\xdb\xa4\x90\xad\xac\x4e\x8a\xc2\x18\xb7\xba\x1b\x9a\xd6\x54\x7f\x0f\x33\x36\x5d\x75\x43\x30\xf5\xd6\x1f\xeb\x89\x45\xb2\xcd\x5d\xb0\x6c\xb4\xca\x54\x7d\xcd\x31\xaf\x6b\xe8\x5e\x32\x72\x85\xea\xa6\xc7\x0f\x97\xdd\x35\x47\xbf\xde\x45\xb9\x64\xec\x80\xe8\xa6\x47\x7e\x04\x21\xe0\x68\x32\x47\x75\xde\xba\x93\x90\x47\x73\x1d\xf3\x91\xc7\x79\xd3\x53\xb3\x8e\xb0\xc5\xab\x7b\x1d\x93\xb0\x75\x41\x4b\x7e\xe4\x47\xb3\xc1\x64\x2d\xfb\x36\xbf\xf2\xa6\x63\xb7\x98\xd6\xbf\x0f\xed\xef\xf6\xfb\x6f\x58\x34\xab\xb9\x0f\xad\xe9\x64\x61\x31\x6f\xe2\xfb\x62\x90\x6c\xfb\x10\x96\xad\xac\xee\xfa\x52\x18\xe3\x36\x0f\x61\xdb\x9a\xea\xef\x3a\x87\xb0\xa9\xb7\xfe\x58\x4f\x2c\x92\x2d\xae\xba\xc2\x68\xe1\x9a\xb4\xc6\x68\xd7\xba\x5e\xe5\x47\x0b\x48\x36\x58\x66\x7b\xfd\xfe\x1b\x11\xd0\xb0\xfa\xb2\xbb\xbf\xae\x8f\x99\x45\xbd\xc9\x42\xb3\x58\xb6\xbe\xd2\x64\x33\xab\x13\xa4\x38\xcc\x4d\x5c\xfe\xf6\xfb\x7d\x70\x25\xae\xd6\xa0\xaf\x29\xc2\x74\x30\x6f\x42\x0e\x8b\x65\xdb\xe4\x80\x66\x56\x27\x47\x71\x98\x9b\x90\xe3\x5e\xbf\xff\x5e\xc4\xe2\xbc\x86\x20\xf7\x76\xd7\x94\x8f\x79\xc8\x37\xa1\x89\x8b\x67\xeb\x54\xc1\x86\x56\xa7\x4b\xd9\x60\x37\xa1\xcc\xfd\x7e\xff\x7d\x22\xc6\x09\x4b\xd3\x4a\xd2\x3c\xdc\x5d\x77\xef\xf2\xb0\x6f\x42\x1b\x0f\xd1\xb6\x4e\x24\xaf\x91\x36\xf9\xee\x80\x27\xc3\x59\x48\x13\x5d\xb8\xb2\xf5\x7f\xbe\xfe\xca\xd4\xf6\x7a\x74\x52\x44\xb8\xcd\xf3\x39\x3f\x1b\xaf\x79\xc4\xd6\x9f\x8b\x5c\xed\x4d\x67\x22\x87\x6e\x83\x93\xfb\x41\xbf\xff\x81\x06\x5c\x54\x73\xff\xde\x9a\xca\x15\x07\xf5\x26\xac\x6f\xb1\x6c\x7b\x53\x82\x66\x56\x27\x4d\x71\x98\x5b\xbd\x25\xdb\xe6\x74\x97\xd7\x32\xfd\x70\x6a\x6e\x30\xe2\x13\x17\xcf\x06\x5c\xf8\xb0\xdf\x3f\x62\x21\x1b\x56\x4b\x4b\xef\xed\xde\xdb\x1c\xf7\x26\x7c\xe8\xa0\xd9\x36\x23\x62\x3b\xab\xd3\xa5\x64\xa4\x9b\x9c\x8d\x8f\xfa\xfd\xa3\x88\x0e\xcf\x06\x35\xb1\x3c\x1e\xee\xad\x7b\x36\x7a\xd8\x37\x21\x8c\x87\x68\xeb\xa4\x51\x2d\xad\x4e\x9c\xd2\xf1\x6e\x75\xa7\xf0\x5a\x74\xfa\xbe\xa6\xf9\x7c\xbe\xfa\x66\x33\x70\x52\xc0\xb7\xc1\xf6\xf1\xb8\xdf\x3f\xca\x58\x5c\xf7\xe0\x79\xb8\xb7\xae\xa0\xc7\x45\xbe\x09\x9f\xba\x78\xb6\xce\xa6\xd8\xd0\xea\x34\x2a\x1b\xec\x56\x99\xd4\x6d\x50\x75\x7c\x65\xc6\x94\x75\x36\x1a\xe9\x09\xe2\xd8\xe6\x75\xb2\x64\x9c\xeb\x05\x00\x71\x6a\x5e\xc3\x98\x2b\x03\x7c\x6c\x75\xe4\xeb\xee\x40\x4e\xd5\x6b\x18\xfb\x0d\x78\xef\x94\x0d\x7e\x2d\x3b\x0b\x5b\xf1\x1a\x06\xbe\xa9\xd5\xe2\xfe\x93\x7e\x1f\xe3\xd8\xd5\x78\x68\x6c\x8e\x7a\x93\xcd\xd6\x41\xb3\x2d\xd2\x3a\x4d\xb4\xc9\x77\x6f\x66\xfc\x78\xc2\x20\xe0\x2a\x7a\x6b\xac\x2a\xca\xcd\xd7\x5f\x99\xce\x4e\x7f\x4e\x8a\xe8\xb6\xc9\xe4\xfe\x4c\xd8\xb0\x87\xeb\x38\x25\xa9\x9a\x9b\x8d\xde\x41\x74\xb3\xe3\x86\x39\x5f\x67\xd8\x58\x71\xf3\x51\x23\x9e\x9b\x1b\x34\x86\x0f\xd6\xdc\xb6\xea\xc8\x73\xb5\x37\x1b\x7e\x0e\xd9\xfa\xdb\xdb\xbd\xdd\x7e\x7f\x28\x42\x91\xd4\x88\x04\xf7\xd7\x34\xca\x76\x71\x6f\x12\x92\xcd\x41\x53\x45\x68\x0c\xed\xa9\x32\xc8\xac\x7c\x83\x44\xec\xab\xc7\x15\x73\x3a\xb6\x3e\x01\xf6\xfa\xfd\xa3\xf3\x71\xad\x0d\xf6\xda\x04\x70\x71\x6f\x42\x01\x17\xcf\xd6\xaf\xf3\xd8\xd0\xea\xd4\x28\x1b\xec\x26\xe1\x0b\xf7\xfb\xfd\xa3\x0b\x9e\x0d\x27\xd5\x2b\xe3\xfe\x9a\x7a\x0c\x17\xf7\x26\x74\x71\xd0\x6c\x9d\x2c\xd0\xce\xea\x54\x29\x19\xe9\x26\x44\xb9\xd7\xef\x1f\xd3\x41\x58\x1d\xcd\xed\xe1\xfd\x35\x65\x67\x0e\xea\x4d\x48\x62\xb1\x6c\x9b\x22\xd0\xcc\xea\x04\x29\x0e\x73\xab\x01\x22\x6d\x73\xba\xcb\x3f\x8a\x60\xbe\xea\xe1\x69\x2b\x6e\x30\xde\x13\x07\xcd\x16\x6f\x0d\x25\x43\x3e\x60\xe1\xca\xaf\x20\x5b\x71\xf3\x21\x03\x9a\x9b\x1d\xf2\x2b\x21\xb2\xd5\x5f\x06\x6e\xd5\xcd\x87\xad\x10\xdd\xec\xc0\x7f\x62\x34\x58\x6b\xd8\x50\x71\xf3\x41\x03\x9a\x9b\x1d\xf2\x7b\x3a\xe6\x98\x51\x71\xad\x81\x3b\xd5\x37\x1f\xbe\x83\xec\x66\x27\xe1\x83\xb8\x58\x6b\xf4\xb2\xde\xe6\xc3\x96\x58\x6e\x76\xbc\x47\x22\x59\xcf\x8d\x26\x57\x7b\xf3\xb1\x5b\x5c\x1b\xbc\x83\xee\x03\xd6\x9a\x57\xd0\x83\x75\xef\x15\x06\xf3\x26\xd7\x0a\x83\xe4\x06\x6e\x15\x6b\xbc\x84\x0a\x63\xdc\xea\x9d\xc2\xb4\x86\xfd\x5d\x83\x01\x37\x18\x21\x30\xdd\x26\x9c\xf6\xa0\xdf\x3f\x9e\xc7\x62\x9c\xd0\x78\x32\xaf\x8e\x4a\xbc\xa6\x25\x42\x1e\xfd\x26\x4c\x97\x43\xb5\x75\xd6\x33\x6d\xad\x4e\x9e\x8a\x51\x6f\xf2\xd4\x78\xd8\xef\x1f\xb3\xcb\xec\x15\x67\x61\xb5\x8f\xd9\xc3\x87\xeb\x6e\x0b\x3e\xfa\x4d\xc8\xe4\x63\xda\x3a\x95\x74\x53\xab\x13\xa9\x7c\xc8\x9b\xd0\xe8\x51\xbf\x7f\x2c\x44\x58\xa7\xb5\xdf\x7b\xbc\xa6\x78\xde\x43\xbe\x09\x7d\x5c\x3c\x5b\xa7\x0e\x36\xb4\x3a\x6d\xca\x06\xbb\x09\x65\x1e\x23\xbe\xac\x26\xda\xe9\xc3\x87\xeb\xca\xb5\x5c\xe4\x9b\x50\xc6\xc5\x73\x13\x94\xc9\xd6\x08\x7c\x5a\x3a\xd8\x4d\x28\x63\x82\x6f\x5e\xf0\x6c\xf2\x0b\x0f\xb2\x6a\x01\xd7\xde\xba\xe9\x84\x4a\x1b\xd9\x84\x52\x65\xf8\xb6\x4d\x31\xd3\xd4\xea\x34\xab\x1b\xbe\xa6\xdd\x82\x7f\xdd\x2e\x61\x69\xc8\xa3\x6c\x47\xe5\xef\xdc\x89\xd8\x65\xb6\x13\xf2\x88\x29\x32\x74\x47\x3c\x49\xb3\x62\x45\x3f\x15\xd6\x83\x3f\x79\xd2\xf4\xad\x66\x0d\xff\x8b\x67\x64\x87\xa4\xe9\xdd\x2e\xf9\x27\x8f\x26\x2c\xe1\x19\x0b\x4c\xd2\x4c\xcc\x08\xfb\xd5\x67\x54\xdf\x6e\xd6\x73\xa8\x38\x81\x10\x52\x95\x83\xb0\x0c\x0a\x33\x5a\xe7\xc3\xe2\x80\xd5\xf5\x41\x27\xd6\xfb\xa2\x92\xae\xbf\x15\xc1\xe6\xd9\xd6\x01\xc9\xd6\xd2\xac\xab\x79\x28\xcb\x5f\x1e\xf0\x34\x0e\xe9\xbc\x47\x1a\xa3\x90\x5d\x36\x74\x4e\x61\xf9\xe3\x05\x4f\xd8\x10\x53\x26\x36\x86\x22\x9c\x4d\x23\xf3\xf9\x42\x6e\xfc\x3d\xd2\xd8\xdb\xdd\xfd\x2f\x53\x38\x10\x97\x47\xfc\x37\x1e\x8d\x7b\xa4\x81\xa9\xcc\x77\x06\xe2\xb2\xd1\x26\xdd\x2e\x79\x9f\xb0\x73\xb9\xb6\x62\x1a\xc8\x07\x32\xe1\x69\x3a\x63\x44\xf2\x14\xa4\x98\x06\xa7\x29\xc8\x1e\x3d\xe2\x97\x2c\x20\xb1\x48\xb9\x6c\x99\x05\x04\x93\xda\x75\x54\x1b\xbf\x1d\x46\x01\xbb\xd4\x59\xd6\xf1\x57\x87\x02\x88\xdb\xf5\xa3\x49\xc2\xa3\xb3\x1e\xd9\x75\xf3\xad\x6b\xa4\xaf\x64\x13\x76\x06\x74\xb1\x9c\x02\xf9\xc5\x8c\x27\x13\x71\x8f\xec\xea\x5f\x21\x1b\x65\x3d\xd2\xa0\xb3\x4c\x18\x88\x84\x8f\x27\x59\x45\x2b\xcf\x07\xa9\x08\x67\x19\x2b\x6d\x88\xaa\x8f\xd7\xd4\xd6\x51\x46\x33\x3e\x2c\x6d\x29\x85\x4f\x8d\x85\x93\x03\xea\xde\x17\x7a\x21\xac\x9e\xdd\xde\xa7\xc1\xb0\x0c\x7a\xcc\x32\x08\xb8\x46\x53\x08\x31\xdc\x5c\x80\xab\x55\xe8\xde\xfb\x84\x4f\x69\x32\x5f\xba\x7b\x31\xc2\x9f\x3c\xd8\xdd\x3d\xdd\xa0\x67\x2e\x9a\x62\xa7\x9e\x0f\x87\x90\x69\x74\xc9\x3e\xa5\xda\x19\xbe\xf3\x7c\x7f\x77\x77\x83\x5e\xf9\x88\x54\xbf\x6e\x11\x72\xf5\x14\xb2\x99\xae\xb0\x81\x41\x3f\x2b\x76\xb0\xdd\x56\x47\x44\xec\xdd\xa8\x79\xd2\x50\x27\x65\xa3\x4d\x1a\x6a\x46\xe4\x9f\x14\x86\x2f\xff\x52\xbb\x28\x66\x07\x5f\xa1\xf9\xf7\x8a\x59\x17\xf7\x40\xf3\xb2\x59\xa8\xce\x42\x5a\xb9\x55\x27\x5f\xac\x49\x37\x7f\x3c\x61\x64\x88\xf6\x84\x44\x8c\x60\x67\x32\xb9\x64\x6d\x8e\xf9\xe1\x84\x87\x41\xc2\xa2\x55\xd3\x52\xe3\x41\xb1\x66\xda\x5f\xa8\x7c\x3d\xf9\x7e\x25\xaa\x96\x9f\x67\xff\x63\xca\x46\xb3\x90\x64\x82\xe0\x45\x11\xf3\xfe\xcb\x73\x84\xd0\x38\x0e\x39\x0b\xe4\x37\x33\x17\xa9\x33\x19\x4b\x65\xf6\xf6\x5b\xfb\x27\x1f\x47\x22\x61\x3e\x0e\xcc\x43\x5e\x35\x3e\x48\xd0\xec\x63\x41\x62\x49\xd6\x2d\x90\x8a\x1c\x66\x8d\x94\xcc\x52\x79\xd2\xc8\x2f\xb0\x72\x88\x5a\x39\xe4\x62\xc2\x22\x92\x4d\x68\x46\xa6\xf4\x8c\xa5\x24\x65\x51\xca\x9c\x11\xe1\x5a\xbc\xb6\xd5\x50\xec\xb5\xde\x9e\xa1\x7b\xf3\xd8\x69\xdb\x6e\xdc\x1b\x2d\x05\xd8\x01\xec\x25\x09\x8f\x50\x4c\xfc\xdf\x52\x8f\x11\x7d\xb7\x94\xd3\x9e\xda\xc4\xf8\x8a\xb5\x31\xcd\x7b\x9c\x76\x74\x81\xd9\xa8\x90\xdc\xf6\x3b\xfe\xf6\x3e\xeb\x8c\xf5\x3e\x90\x2c\xf5\xb6\x3b\xfb\x59\xfe\x6a\xe7\x8e\x2e\xf3\x55\x17\x68\x00\x48\x4e\xaf\x93\x33\x57\x3d\x0d\x6c\xa6\x66\x40\xd2\x26\x27\x0d\x3d\x92\x86\x97\x61\xdc\xcb\x0e\xde\x80\x9e\x00\x49\x55\xa3\xb8\xad\xe8\xc9\x31\x39\xf2\x55\xeb\xce\xe5\xdc\x36\x68\xf3\xf9\x8b\xcc\x64\xf7\x3f\xb1\x18\xc9\x5d\xac\xac\x2e\xcf\x9d\x21\x8d\x79\x46\x43\xfe\x1b\x7b\x25\x1f\xbd\xaf\x25\x8b\x26\xad\xa6\x86\x6f\x9d\xb6\x49\xd3\x21\x95\xdc\xb2\x16\x27\x52\xb7\xf0\x4e\x17\x70\x74\x4b\xb6\x0f\xc0\xb2\x71\xa4\xd5\x6d\xb9\x6d\x69\x9e\x5f\x9c\xd3\xdb\x6d\xbf\x31\x9d\xf1\x1d\xcd\xa5\x96\xbc\xb0\x0f\x42\x69\xab\xed\xf2\x62\xab\xed\x73\x51\x0b\x98\x53\x0b\x26\xf0\xa5\xa5\x5b\xea\xa0\xb5\xa0\x4a\x60\xde\x04\x0e\x51\xaf\x08\x0d\x82\x6c\x03\xdd\xd5\xcf\x64\xdb\xcf\xcf\x26\x0d\xb8\x7c\x96\xb7\xbd\xc4\xe1\x18\xb5\xa4\xd1\x76\x33\x87\xdf\x6f\xbb\x7b\x95\xe5\x87\xab\x36\xb2\x65\x4b\xdd\x0b\x14\xab\xdd\x22\xa4\xf5\xf4\xd6\xd5\xad\x5b\xea\x0e\x1b\xeb\xbd\x18\x99\x7b\xc8\xd2\xb4\xc3\xa2\xf3\xce\xdb\x77\x2f\x5e\xf6\x5f\xbe\xfd\x37\xcc\xf2\x77\x71\x22\x82\x19\x46\xca\x21\x3f\x10\xc8\x8f\xae\xf3\x9a\x2f\xb5\xd7\xe6\x92\xf4\x5f\xf7\x76\x96\x43\x7f\x4d\x3b\x56\xbe\xd3\x7f\x86\x23\xf6\xd6\xe2\x75\x8a\xb9\xef\xed\x76\x54\x4b\xd8\x65\x53\xe9\xbb\x5b\x5a\xed\x79\xba\x34\x42\xb5\x2d\x5e\x1b\x0f\x2d\xdb\xb0\xd9\x34\x17\xb6\x5d\xcf\x5d\x72\x87\x49\xd8\xa8\x25\x5f\xfb\x57\x4f\xf5\x72\x54\xad\xb9\x37\x41\xb5\x58\x6c\xff\x6f\x95\xbc\x0f\xe1\x74\xd5\xcf\x6f\x2b\xf9\x85\x11\x39\xb2\x14\x3b\x1a\x7c\x90\xb7\xc9\x67\x12\xc1\xc6\xd1\x78\x33\xe3\xd8\x87\x06\xb9\x6a\x35\xf1\xcf\x56\xad\x10\xf2\xaa\x33\xa4\x61\xd8\xac\x93\x6a\x36\xef\xb5\x5a\xad\x82\x90\xf4\xe1\x35\x0a\x49\xaf\x41\xea\x89\x82\x1e\x8c\x0e\x57\x99\x4a\x18\x44\x7f\x0b\x9a\x32\xdc\x84\xed\xb0\x68\x36\x65\x09\x1d\x84\x7a\x2f\xbf\x45\xc8\x98\x65\x3d\x2b\x15\x19\xb3\xac\xd9\xd2\x22\x10\x75\x9a\x54\x88\x99\xb0\x7b\x2d\x4d\xc0\xa7\xf2\x55\x85\xbd\xdf\xba\xdc\x29\x47\xbd\x47\x5f\x22\xf5\x20\x91\x7a\x65\xba\xf3\xc7\x7f\x30\xf1\xa0\x77\x5f\x02\xed\x1e\x7f\x53\x4f\x7c\x53\x4f\x6c\xa0\x9e\x20\xdd\x2e\x21\x17\x8c\x9e\x7d\x53\x45\x5c\x8f\x2a\xe2\xaf\xab\x34\xf8\xf0\xfc\xc5\xe1\xc7\x23\xf2\x8c\xec\xed\x6f\x49\x8d\xe0\x5c\x92\x12\x16\xd2\x8c\x9f\x5b\xd9\xb6\x55\x31\xf0\x28\xe4\x11\xdb\x01\x4d\x83\x2b\x48\x1d\xc8\x3d\x7b\x65\x9d\x44\x22\x2e\xbc\x6f\xbf\x24\x34\xee\x91\xc6\x45\x42\x63\x53\xfe\x9f\x59\x9a\xf1\xd1\x5c\x39\x09\xf7\x48\x43\x5e\x46\xe5\xb3\x4e\x7d\xa7\x21\x1f\x47\xf5\x5f\x0f\x33\x36\x4d\x8b\xdf\x16\x4a\xf3\x77\x70\xd6\x73\xf2\xfb\x5c\xe9\x48\x44\xd9\x2b\x3a\xe5\xe1\x5c\x4b\x7f\x33\x63\xec\xd5\xb1\x1f\x5d\xf0\x5f\x18\x62\x2a\x05\xc7\x8f\x2e\xf8\x11\xff\x8d\x95\x00\xc7\x97\xc7\xe2\x03\x9b\x36\xb1\x3b\xad\x9c\x62\x47\x31\xcc\xf7\x64\x5f\x7f\x98\xa8\x56\x8b\x5f\x50\xd5\xf3\x81\x06\x7c\x26\xa7\xe9\x81\xab\x11\xaa\x97\x85\x7b\x82\x9f\x52\x11\x78\xc6\x2e\xb3\x03\x17\x4a\xeb\x7f\xf6\xe4\xee\xf8\x81\x45\x01\x4b\x40\xc2\x07\x1c\x44\x44\x24\xa7\x9e\x88\x11\x89\x85\xa4\x28\xa7\x21\x49\x78\x1c\x87\x0c\x25\x96\xdf\xb4\x09\xdb\xd7\x26\x2c\x14\xac\x27\x40\x35\x16\x80\xf6\x8f\x47\x96\x7c\x56\x0c\x0a\x3f\xcd\xaa\xbc\x61\x11\x80\x23\x8a\x58\xbf\x62\xef\x8f\x12\x3a\x78\x82\x94\x3c\x09\x70\x95\x5c\xf0\x30\x24\x03\x46\x68\x10\xb0\x80\xe8\xed\x9a\x64\x82\x64\x13\x9e\x92\x48\x0e\xe5\x8f\x57\x76\xfc\x49\xc9\xf0\x4d\xd3\xb2\xaa\xa6\xc5\xbe\x15\x4b\xc4\x4a\x05\x5d\x07\x3c\xff\xf2\xaa\x0e\x77\x3f\x31\x8a\x05\xb7\xf0\xc6\xd4\x1b\x0b\x15\x2c\xeb\xaa\x37\xdc\xd1\x2c\xa5\xe2\x30\xfa\x90\xd3\xd6\xd3\x8d\x35\x1c\x8e\xb0\xde\x9d\xf1\x95\xd0\x41\x95\x45\x82\xc1\xcf\x57\xd7\xa9\xd0\xd0\xac\xd5\x5a\x55\xc9\xd0\x08\xf8\x79\x63\x81\x6a\x61\x15\x4d\x01\xfe\x5a\xa2\x61\x42\x1a\x69\x4c\xad\x21\x8e\xd7\x4c\x6e\xd2\xaf\xec\x35\xcc\xf2\x06\x14\xb5\x8c\x66\x02\x96\xcb\x1f\xa3\x98\xf8\x76\xc8\x5f\xcf\xe9\xf2\xed\x8c\xde\x7c\x16\xff\x6a\xaa\x9a\x05\x67\x6a\x4e\x5f\x82\x9b\x44\x8d\xba\x44\xa3\xbb\x16\xcd\x08\xb4\x06\x8a\x11\x14\xe5\x6e\x47\x2f\xf2\xe4\x8b\x94\xac\x8b\x2c\x13\xd3\xb7\xf4\x9c\x8f\x69\x8d\x49\xd4\x03\x70\xa1\xfb\x43\x85\xec\xb9\x8e\x96\xc9\xdb\x4b\x47\x84\x91\xea\x2a\xc7\xb5\xb7\xcc\xb8\xca\x71\xde\xc4\x30\xb1\xa5\x2f\x40\xb9\x70\x7f\xf7\x4f\xae\x5c\xb8\x79\xf9\xff\x56\xd5\x19\xdf\x94\x0b\x5f\xa9\x72\xe1\xaf\xab\x33\xb8\x21\x47\x83\x45\x02\x7a\x2d\x77\x7e\xf0\x70\x49\xa1\xb2\x63\x47\x1e\x83\x23\xcf\x16\x45\x99\x5f\xa0\x8d\xf0\x9f\xe6\x4a\xfe\xf5\x8b\xcd\x0e\x68\x18\x4a\x6e\x24\x23\x98\x54\x25\x0c\x63\x78\x1a\x92\xe1\x84\x46\x63\xa5\x97\xd0\xcd\xc6\x34\xa1\x53\xf2\x19\xbb\x74\x45\xd0\x65\x46\x32\x1c\xfe\x95\x8a\x59\x32\x64\x86\xeb\x14\x7a\xbf\x2e\x8d\xe6\x57\xaa\x85\x5f\x98\xde\x70\x50\xb6\xcb\x08\x8f\x02\x76\x69\xea\x4b\x16\x35\x43\x14\xd1\x01\x74\xa8\x72\x84\x92\x1f\xfd\xf1\x1d\x8e\xc8\x27\x79\xa4\x7f\x6a\x13\x1a\x86\xe4\x53\xf9\x6d\xe9\x53\x8a\x02\xe7\x74\x22\x2e\x64\xbb\x3c\x21\xa1\xe4\x08\x35\x72\xf2\xe3\xdc\xf4\x52\x44\xe1\x1c\x09\x0b\xf1\xef\x59\x50\x89\xd3\x41\xc9\xb3\x14\x11\x5a\x92\xcb\x72\x08\x9b\x52\x4d\xf5\x81\x10\x61\x51\xc8\x89\xf3\xa6\xe7\x67\x96\x24\x2c\xca\xc2\xf9\xe2\xee\xd8\xa6\xd5\x4d\xc7\x6c\x91\xf0\x5b\x4b\xe9\xe4\x7f\x40\x4e\x68\x19\x55\xfe\xd4\x97\x51\x3e\x22\xcd\xdb\xea\x6e\x15\x27\x22\x13\x60\x1b\x3e\xa1\xe9\xbb\x8b\x48\xdf\x57\xf0\xb9\x93\xc3\xd7\x6a\x99\x5d\x36\x9b\x24\xe2\x82\x44\xec\x82\xbc\x4c\x12\x91\x34\x1b\x20\xa9\xfc\xd4\x20\x77\x0d\x34\xb9\x4b\x1a\x9f\xc8\x84\xa6\xb0\x35\x91\xff\x6d\xd0\x68\xfe\xbf\x8d\x36\x19\xcc\x32\x72\x41\x53\x12\x89\x4c\xc2\x9e\xf3\x00\x17\x15\x54\xf6\x3a\x0c\x18\x3a\xe4\x3d\x4d\x53\x7b\x73\x23\x22\x21\x34\x9a\x2b\x01\x26\x8c\xbb\xd3\x00\x79\xa0\xda\x7e\xf3\x82\xda\xdc\x54\xe6\x65\xb6\x7a\x07\xf5\x45\xad\x5b\x31\x47\xd7\xbc\x6f\x20\x74\x81\x06\xb0\x0c\x65\x40\x6c\x91\x06\x42\xe6\xd1\xdf\xe1\xd7\x4d\xd8\xac\xeb\xbe\xca\xbf\x6d\xa7\xe4\x2f\xe8\xc2\xf5\x58\xb0\xfb\xc6\xd8\x39\x4f\x81\xbc\xd8\xf2\x40\x7d\xea\x4c\x69\xdc\x74\xc9\x68\x9d\xcd\x09\x96\xb7\x11\x0d\xe8\x74\xbd\x55\x90\x47\xc9\xd3\x7f\xd3\x90\x07\x5a\x14\x0a\xb5\x5a\x2d\x7d\xdd\x88\x66\x61\x88\x8c\x66\x7a\xf6\x6f\x45\x0c\xf8\xd1\x71\x48\x22\xef\x3e\xb6\xd1\xa7\xde\x2b\x30\x2f\x7e\x0d\x45\xc4\xbc\x26\xdb\x66\x9d\xe9\x2d\xa1\xe7\x35\xf7\xec\x19\xf1\xe8\x6e\xe8\xd1\xf3\x3a\x62\x8a\x41\xae\x6a\x57\xd0\x0f\x15\x50\x3d\x52\xc1\x6d\x6e\xeb\x79\x66\xee\x99\xbf\x70\x09\xc2\x52\xbc\xfa\xa3\x05\xdd\x56\xf0\x9c\x5b\xfe\x7f\x8c\x0c\x7a\xc9\x93\xe2\x9b\xbc\xf5\x9b\xbc\xb5\x1c\xa1\xb3\xfb\xd6\xdc\x9b\x96\xc5\xe6\xed\xdf\x35\xfc\xb8\x2c\x3e\x3c\x01\xda\xeb\x5c\x47\x36\xbf\x8c\x7c\x89\x57\x91\xab\x5b\x57\x79\xd9\x76\x7e\x1f\x2a\x11\x73\xbb\xbb\xc4\x88\x86\x29\xbb\x1e\x39\x77\xae\x65\x14\x79\xe7\x05\xab\x5b\x91\x7e\xdf\xdf\xfb\xb2\xa4\xdf\xdf\x8c\x8d\xff\x48\x79\xe0\x98\xc9\x62\x5c\xe1\xef\x46\x15\x5d\x78\x5c\x01\x5e\x27\x4a\xf3\x21\x7d\x59\x9f\x7c\x1c\x1f\x4c\xd8\xf0\xac\x6a\xcc\x4f\x2a\xe0\xeb\x86\x9a\xc3\x6c\x31\xc0\xc5\x06\x34\xe3\x55\xcd\x41\x7e\xc4\x02\x74\x6d\x63\x0e\x52\x53\x37\x16\x69\xca\x07\x21\x3b\x10\x51\x9a\x25\xb3\x61\x26\x92\x0f\x70\xd9\xaa\x6c\x77\x6f\x71\xdd\xba\x5e\x54\x37\x68\xf0\x2a\xbf\xac\xea\xa1\x17\x41\xeb\x5a\x34\xe8\x7c\xb1\xf0\x37\xe1\x71\xb9\x65\x3a\x8a\x08\x7e\xa4\x69\x95\xec\xf6\xfe\x83\x12\xd8\xba\x46\x2c\x94\xa9\x78\x38\xac\x54\xaa\x3d\xb9\xef\x41\xd5\x21\x96\xdf\xbf\x34\xa1\xb7\x7a\x8d\x6c\x2c\xf7\xd6\x78\x16\x88\xbe\x2b\x42\x42\xd9\x29\xff\x0b\x49\xec\xb3\x84\x46\xda\xc6\x5d\xd9\x8f\x9b\x92\x54\x3d\x16\x9b\x27\x8e\xd3\x3c\xc6\xf6\xd9\xc9\x44\xdc\x38\xb5\x4f\x65\x42\x82\x59\x42\xab\xd0\xe8\x6f\xf2\xb9\x9b\x64\xaa\xca\x95\xb1\x47\x57\x38\x8f\x45\xdc\x23\x8f\x73\x85\x78\x57\xea\x91\xbd\xdd\xdc\x87\xd7\x10\x3e\x67\x6f\x3f\x57\xfc\x01\x35\x09\xb6\x7c\xca\xa3\x5f\xd0\xde\xfd\xb1\x41\x31\xa5\x97\xaa\x6c\xef\xe1\xe3\x85\xb6\xe9\xd6\x6e\xda\x75\x44\xe8\x91\xc6\x9e\xe7\xdf\x60\xa5\x05\x9f\x4b\xc6\xf5\xb0\xb6\x19\xd7\x5e\xbc\x0c\xa7\x5c\xb4\xef\xa2\x70\x5e\x8e\x1b\x71\xa5\x31\x1d\xf2\x68\xdc\x99\x45\x3c\x23\xdf\x93\x7d\x17\xcf\x45\x42\xe3\x98\x25\x65\x8a\x1a\xd7\x5d\x63\x19\x97\x88\x45\xba\x9c\xd2\xa8\x51\x15\x91\xa6\xdc\x2e\x86\x28\x42\xf9\xbc\xbe\xcf\xc4\x02\x27\x88\x52\x2c\xb2\x0e\xd9\x21\xfb\x86\x17\x85\x9c\xc5\x6c\xde\x23\x7b\xed\x92\x15\xd2\x90\x75\x76\x52\x59\x69\xb7\xb3\x9f\xb6\x35\x38\xfc\x6a\x14\x6b\xbc\x60\x38\xc9\xbb\x9d\xbd\xb4\x94\x59\x5e\x17\x47\xbd\xee\x30\x3c\x3f\x83\x09\x0f\x02\x16\xe5\xb0\x9b\xb1\xed\xd6\xf4\xd4\xef\x27\x1f\xca\x61\x17\xb9\x66\x10\x8a\xe1\x59\xc3\xae\xa7\x64\xcc\x23\x1d\xcc\xea\xba\x95\x71\x5f\xa3\x5a\xe8\x78\xc2\x60\xee\x08\xc3\x23\xa9\x43\x0e\x47\x84\x12\x04\x25\x3c\x35\x2f\xde\x36\xe1\x99\x31\xd6\x9f\xa5\x2c\x20\x34\x25\x14\x18\x81\x84\xf2\x7d\x38\x4b\x1c\x63\x6a\x24\x47\x9d\xdd\x97\x9c\xd0\xe6\x49\x7d\x4f\x57\x94\x68\x99\xd3\x79\x4d\xa1\x96\xae\x7f\x3d\x52\x26\x85\xad\x55\x16\x73\x07\xf6\x10\x33\xe5\x66\xd6\xd4\xd6\xf2\x15\x47\x99\xa8\x67\xd1\x35\xd4\x7a\x25\x28\x42\x3e\x3c\xdb\x00\x83\x3d\xfe\x96\xd6\xc6\x39\xba\x45\xb9\xa4\x2b\xcc\xc8\x96\xd3\x02\xae\xd0\xec\xaf\x62\x46\x86\x34\xd2\x4b\x90\xcc\xc5\x2c\x21\xe2\x42\x09\xce\x3a\xe4\x5d\x36\x61\xc9\x05\x4f\x59\x9b\x5c\x30\x32\xd2\x0a\x5e\xa5\x5e\x05\xb9\xb0\x0d\x71\x03\xda\xd6\x6f\xaa\xc1\x65\x55\x83\xf2\x2c\xa8\x34\x17\xb4\x8a\xa3\x3e\xac\x86\xbf\x99\xbb\x39\x0e\x10\x44\x6f\xe6\xf5\x6a\x05\x6f\xe5\x08\xdb\xa4\x80\x05\xf4\x22\x95\xca\x49\xac\x66\xcc\x06\x6d\x08\x59\xfb\x33\x63\xd3\xb8\x4d\xfa\xd9\x84\xa7\x20\x61\xcc\xd4\x47\xab\x67\xb3\x22\x0c\xdb\x3f\x04\xaf\xb0\x33\x54\x18\x46\x22\x21\x4d\x68\x23\x04\x7d\x1b\x4d\xc6\xb3\x29\x9c\x66\x21\x8b\xc6\xd9\xa4\x2d\x4b\xe4\xd1\xf8\x3c\x49\xe8\xbc\x29\xa1\x5a\x6d\xd2\x3f\x63\x73\xf2\x8c\xec\x3e\xc5\xbf\xfe\x0e\xb5\xf1\xc7\xdd\xbb\x96\x2b\x64\xd5\x13\x59\x78\xea\x62\xc6\x12\x4d\xa1\x9c\x92\x0c\x44\x9d\x30\x5e\xfc\x63\xc2\x53\x2d\xfc\xac\x16\x61\xe4\x87\xac\x55\x37\xe5\x43\xef\xf4\xfb\xc0\xe6\xfd\xbe\x7c\xf9\x00\xea\x9c\xd8\x69\x11\x89\x5b\x2d\x58\x0f\x1d\x79\x0d\x98\x2b\x79\xf8\x89\x6c\xfa\xb4\x33\x14\xd1\x90\x66\x4d\x39\xf2\x16\x98\x3a\xcb\x62\xfd\xdf\xce\x84\x46\x41\xc8\x8c\x42\xd8\x32\x1e\xd8\x60\xd8\x89\x43\xa2\x4f\x78\xfa\xb7\x58\xdd\x4c\xb0\x3e\x2e\x40\xf3\xf6\xf1\xb4\xcb\x0e\x7c\x41\xc7\x4c\x1c\x15\xb2\x0b\xe7\x29\x14\x15\x3e\xb9\x1f\x17\xd1\xc9\x52\xd4\xf5\xea\x2d\x43\xb7\xd1\x72\x1e\x63\xba\x0c\xc7\xd3\xc6\x36\xd5\x62\x34\xc4\x36\xd5\x25\xce\x5c\x6d\x59\xa4\x26\xc3\xd6\xc2\x7b\x21\xae\x02\xad\x9d\x58\x86\x19\x9c\xf5\xa2\x04\xf4\x7a\x31\xbb\x52\xb8\xc5\xeb\xf9\x04\xbb\x78\xc6\xe6\xe0\x81\x1e\x05\xe6\xd9\x91\xdf\x76\xf1\x63\x33\x47\x48\x37\x60\x99\xf3\x63\xff\xe9\x2d\x17\x4a\x53\xba\x9c\xd0\x78\xc5\x78\xa6\xc0\x3a\xf0\xd3\xfd\x2e\x6f\x68\xca\x10\x41\x81\xc8\x12\x17\xc2\x18\x9a\x18\x08\x5d\xe2\x42\x59\xa3\x87\x7e\xa9\xd5\x03\x29\xb1\x7c\xe8\x57\x98\x3e\x10\x57\x4b\xed\xc3\x9a\xe2\x2a\x66\x5e\x82\x8f\xab\x58\x78\x35\x7b\x88\xbe\x31\x88\x80\x39\x6d\xb4\x49\x43\xce\x1c\x58\x3c\xa8\xf9\xa9\xb3\x90\x30\x03\xc9\x9b\x4b\xf8\x06\x12\x9a\xca\xeb\x18\x49\x5c\x4b\x84\x3e\x4b\x6c\xc3\x08\xab\x45\xda\xcb\xe3\xd1\xa2\x81\x36\xb9\xed\xd3\xf8\xce\x1d\x72\xdb\x69\x62\x61\xf4\x3d\x3d\x35\x1c\xc5\x8c\x68\x6f\xe1\x6c\x14\x9a\xb3\xdd\x9d\x42\x96\x2f\x30\xe3\xb0\xd5\xee\xdc\xd1\x57\x70\xb3\x48\xc0\x41\x0f\x5f\x25\x0d\x17\x2f\xd1\xbd\xa8\x35\xd7\xd0\x68\xda\x5e\x4d\xef\xc9\xb6\x98\xb6\xb0\x3c\x4d\x8f\x3a\xb9\x25\xd4\x72\x10\x5f\x99\xad\x90\x90\x2b\xc2\xc2\x94\x2d\xd5\xe3\x32\xff\x3e\xfc\x87\xb2\x5a\x3f\x88\xa1\xfe\x27\xa7\xdf\x2f\xd1\x5d\x74\x0a\xdd\x0e\xe5\xf7\x76\x49\x4a\x58\x49\xab\x39\x68\xe2\x86\xe6\xf1\xfa\xfe\xaa\xcc\xbe\x5f\xe4\x52\xdc\x63\xd6\x62\x79\x07\x9b\x23\xd5\x58\x81\xdd\xf7\x5b\x96\xc1\x97\x37\x8a\x01\x02\x39\xb2\xfa\x22\x99\x56\xb2\x95\x69\x93\x91\x18\xce\xd2\x0f\x10\xa8\x02\xb5\xa2\xc6\x7c\xa6\x4d\x3e\xdb\x07\x58\xf1\x7e\x62\x05\xa5\x4b\x7a\x8f\x92\x82\x07\x29\xc9\x7b\x91\xea\x19\x55\x82\x41\xeb\x46\xaa\x39\xcd\xfd\xbd\x02\x4b\x17\x9b\xcd\x35\x9c\x63\xc9\x2b\x1f\x14\xbe\xba\x0c\x7e\x2b\xff\x97\xfb\xa2\x38\x85\x1f\x8a\xa4\xe5\x97\x86\xa7\xb7\xae\x0a\x1b\x94\xf7\x1e\xb8\x6e\x05\xbf\xf2\x53\x2a\x53\xf3\xdb\x0b\x7f\x4e\x51\xbf\xff\x4d\x51\xff\x4d\x51\xff\x4d\x51\xff\x4d\x51\xff\xe5\x2a\xea\xe1\xd7\x0b\x31\xad\x52\xd3\x3f\xb9\x51\x95\xfe\x19\x9b\x0f\xab\xb5\xae\x8f\x1e\xe4\x01\xeb\xd0\x2b\x90\x1b\x35\x17\x38\x63\xf3\x81\xa0\x49\xf0\x4a\x5e\x09\x2a\xfd\x64\xef\x19\xf8\x63\x31\x1b\x4e\xf0\xea\x50\x09\x7d\xbf\x0c\xba\xae\x5f\x0e\x58\x6e\xb1\x61\xe1\x4f\x70\x07\xa9\xcc\xe8\xf3\x20\xbf\xa0\xbd\x5a\xb5\x04\x2d\x82\x7f\x69\x06\x09\x37\xa5\xd3\xcf\x79\x68\xae\xa6\x02\x91\xa5\xd7\x65\x32\x01\xb8\xfe\x58\x8f\xc1\xeb\x56\x44\xd7\x45\x2b\x84\xb8\x72\x53\x71\xce\xc8\x38\x61\x73\x32\xe1\xe3\x49\xc8\xc7\x13\x6d\x9a\xf0\x0b\x1b\x9c\xf1\xec\x98\xc6\x3f\xe9\x0f\x15\xa1\xed\xa6\x53\x11\xa1\xa5\x43\x4c\x13\x27\xc4\x50\xc1\x7d\xb1\xe1\x00\x61\xb2\xa4\x0f\x2c\x65\x99\xf1\x8a\x82\x3b\x98\x56\xd3\xce\x32\x39\x13\x3d\xd2\x88\x44\xc4\x1a\x7e\x08\x3e\x47\x79\xeb\xc7\xe4\xb3\x81\xe1\x66\x49\x8a\xf1\xad\x05\xf7\x26\x64\x96\xb2\xe4\x08\x5e\x48\x79\xd4\xf2\x0d\x40\x13\x1a\x0d\x0b\x8d\x66\xec\x32\x7b\xc1\x86\x42\xdb\x76\xf8\x5f\xbb\x5d\x72\x24\xc8\x05\x23\x19\x3d\x63\x24\x4e\xd8\x90\x05\xe0\x32\x79\xae\x22\xf6\xa1\x96\x56\x8c\x08\x25\x11\x06\x20\xfb\x3b\x25\xdd\x7f\x78\x2a\x3a\x6b\x13\x61\x83\x8b\xab\xf2\xc6\x9d\x5e\x6f\x67\x2a\x7e\xdb\x81\xb7\xd3\x0e\x8f\x22\x96\x34\x7a\xce\xab\x1b\xa7\x00\x76\x57\xdd\x37\x87\xb6\xaf\x78\xc2\x46\xe2\x92\x04\x22\xcb\x58\xa0\xe7\xb5\x93\x93\x67\xde\x52\x6c\x48\x07\xa1\x9f\x31\x0a\x66\xef\xe5\x39\x8b\xb2\xd4\x0c\x5c\x62\x7f\x81\xb0\x24\xe4\xd1\x19\x01\x20\x0a\x8c\x9f\xe6\x09\x60\x22\x66\x90\xeb\x55\x88\xe7\xf4\x66\x2a\xf8\xa1\xd1\x22\xe3\x3a\x60\x41\xc7\x28\x46\xe7\xe4\x42\x44\x8d\x8c\xa4\x19\x4d\x32\x42\x33\xed\xfa\x96\x8a\xc4\x1d\x80\x59\x32\x8e\x06\x1d\x70\xe9\x57\xeb\x4a\x7e\x76\x5f\xb0\xff\xec\xb7\x1c\x3b\x45\x62\x69\x2b\x38\xb0\x41\x18\x09\x5c\xbf\x72\xaf\x76\x62\x05\x92\x97\x1c\x84\xba\xc6\x90\x21\x13\x12\x9e\x50\xf2\xe2\xdd\x1b\xbd\xa8\x41\x11\x98\x27\x37\x34\xe2\x6d\x76\x84\xa7\x84\x92\x4f\x83\xbc\x73\xa5\x93\x9e\x63\x2d\x33\x05\x3c\x15\x37\x33\x55\x00\x1c\xd7\x6a\xae\x20\x4b\x5b\xb5\xda\xef\x01\x4d\x19\x19\x38\x2a\xef\x01\x33\xbb\x92\x9d\x1d\xbb\x4f\xad\xab\x65\xc7\xdd\x82\xb0\xd1\x88\x0d\xb3\xc5\x2d\xad\xbc\xf4\x17\x0d\x6b\x42\xcf\x25\xc3\xe8\x2b\x30\x8a\xc5\x54\xaf\x14\xaf\x7c\xf2\xda\xfe\x44\xa6\xb3\x34\x23\x34\x4c\x85\xec\xe9\x27\x70\xce\x70\x18\xc6\x93\xab\xad\xb4\x43\x1d\x1c\x1d\xe1\x92\x31\x6b\xf3\x62\xc2\x43\xe6\x6f\x57\x92\x4f\xfd\xce\xba\xb3\xe4\xdd\xe4\x59\x70\xb0\xd6\x02\x2c\x1a\x63\xfc\x18\xce\xaa\x63\x26\xde\x84\x35\x87\x88\x60\x44\x2b\x60\xa8\x72\x84\xf7\x26\x52\xcd\x1f\xe6\x84\xb4\x4c\xa0\xe8\xfe\x0b\x23\x59\xc2\xc7\x63\xd8\x61\x3e\xa9\x2e\x7c\x32\x3e\xf0\x24\x13\xa2\xe3\xf4\xf0\x67\x77\xee\x37\x1a\xeb\xcf\x6c\xfe\x42\x5c\x54\x5b\x56\x2d\x89\xe3\x63\xbc\x11\x86\x37\x62\x96\xb2\x8d\xfb\x01\x58\x5e\x33\x7a\xbe\x99\x39\x10\xa0\xd9\x70\x40\xf0\xc2\x7c\x19\x55\x6f\x56\x4b\x23\x79\x23\x36\x1c\x0e\x60\x39\x92\xd7\x9f\x0d\xd0\x24\xa2\x66\x8b\x29\x5b\xd8\x1f\x53\x86\x91\x51\x63\x25\x73\x94\x07\x66\x0c\x1b\x0e\x49\xd8\xc8\xe5\x6c\x7b\xdc\x96\x5c\x94\x64\xf9\x07\x36\xda\xa0\xeb\x19\x1d\xa8\xa0\xda\x6b\x1b\x0f\x46\xb3\xe9\x80\x25\x0b\x5c\x2a\xf3\x56\x79\x85\x7e\xcc\xe3\x45\x53\xe8\x79\x90\x6a\x93\x21\xd7\xbf\x62\x6d\x33\x21\x83\x64\xb1\x69\x90\x01\xdd\x9e\x39\x90\xe7\xe0\x41\xfe\xf4\x26\x40\x66\xb8\x2b\x99\xfd\xd8\x49\x5a\xd7\xd4\x27\xcd\x68\xc6\xd4\x0b\x8a\x90\xc2\x89\xad\x9d\x3d\x89\xb6\x6d\x91\x75\x72\x67\x8b\x95\x84\x55\x1a\x0a\x61\xbd\x33\x3c\x47\x24\xa0\x44\xfa\xd4\xfb\x98\xb2\xec\x48\xf6\xa5\xf9\xb9\xd8\x07\x54\x07\xb6\x3c\x7d\xbb\x63\x69\x94\xef\x90\xab\x2a\xaf\x01\xab\x36\xe0\x91\x55\x12\x2d\x4f\x04\x55\x73\xf9\x08\x74\xf1\x40\x9b\xe8\xe5\x60\x6d\x5b\xc7\x7c\xca\xc4\x2c\xab\x03\x81\x75\x20\xe1\xc8\x33\xf2\x60\xb7\x14\xe4\x0d\xbd\x34\x50\x92\xd9\x1e\xf8\x06\x5b\x3f\xdb\xde\x6d\x6c\xb1\x65\xef\x25\xbe\x8d\x95\x29\x77\x81\x9d\x3b\x66\x0e\xdc\xf9\xe2\x9b\xd0\xd8\xbe\xfa\x16\x5c\xaa\x7c\x15\x63\x2f\x3b\x32\x5c\xeb\xb0\x66\xb4\x68\xdb\x2e\x16\x4d\x6d\x2b\x9c\x81\xb9\x94\xcc\x24\xeb\xc9\xf7\x56\x98\x30\x1a\xcc\x49\x20\x3b\x96\x09\x42\xcf\x05\x0f\x48\xc2\x62\x46\xb3\x94\x0c\x98\x7c\xd2\x0d\xc5\x2c\xca\xd0\x0c\x7d\x3a\x0b\x33\x2e\x87\x4c\x87\x19\xc7\xf4\x88\xa9\xc3\xa0\xee\xa4\xdc\xb9\x43\x6e\xfb\x1c\x74\xe7\x8e\xbb\x00\x3b\x39\x96\x97\x9f\x61\x30\x60\x00\x12\xd3\x21\x6b\x14\x99\xda\x32\xa3\x5c\x1f\xd6\xd6\x01\x06\xda\x89\x59\x92\xf2\x34\x6b\x3a\x46\x10\x2e\x63\x77\xd2\x4c\xc4\xda\xfe\xcd\xb2\x8b\x6f\x65\x92\xab\x40\x93\x2c\xb7\x66\x5c\xab\x8f\x9c\xd9\x9c\x22\xa4\x6f\x38\xa7\x0a\x0b\x2b\xcf\xd2\x44\xaf\x50\x42\x87\x43\x26\x77\x51\x1e\xf2\x6c\x0e\x9b\x7f\x04\xf6\xc4\x4a\x1c\x73\xce\xf4\x83\xda\x9d\x73\x1c\x7a\x46\x93\x31\x43\x83\x7c\x6f\x7d\xde\xb9\x63\x78\xe9\xce\x1d\x87\xc3\xbd\x1f\x60\x73\x43\x1b\x25\x85\x03\xa5\xbb\xbe\x73\x87\x34\x73\xc4\x91\x5b\xb5\x29\x42\x39\x6b\xcb\x1d\xb9\x22\x09\x26\x80\xd7\x12\x7b\x67\x16\x17\x9a\x14\x7a\x8b\xfc\x63\x5c\xb7\xc4\xf3\x9b\x63\x8e\x0f\x6b\x57\x87\x37\xa6\x7a\x16\xad\xe3\x47\x6f\x7b\xbf\x4e\x86\xd4\xa7\xaf\x5b\x2f\x9e\x85\xa9\x3c\x37\xea\x38\xb3\x7c\x66\xd4\xab\xa4\xf6\xb8\xf8\x18\x2f\x43\x14\xf3\x36\x31\x46\x44\x25\x3a\x9f\x82\xc5\x67\xc3\x54\x03\x13\x3d\xb9\xbe\x1a\xe5\x63\x1f\x86\x8c\x26\xea\x0c\x69\x56\x1f\x2f\xa6\x93\x9a\xc8\x16\x02\xd9\xe0\x67\x36\x7f\x9f\xb0\x54\x92\xaf\x09\x44\x32\x35\xec\xdc\x2c\x49\xed\xba\xf3\x1a\x50\x17\x08\x70\xd5\x2a\x99\x34\xe0\xe5\x55\xa7\xec\x63\x8c\x13\x26\xe2\x46\x19\x4e\x78\xde\xad\x81\x16\xea\x19\xcc\xed\x65\x96\xd8\xc2\xc9\xaa\x5f\xf9\xe5\x13\x63\x5f\x63\xab\x0d\xc2\xd6\xb3\xfc\x54\x86\xfa\x65\x14\xac\x81\xf8\x65\x14\x54\xcd\xba\x79\x84\x5e\x2f\xda\x1f\xc3\x59\xb2\x1a\x46\x59\xa3\x94\x80\x37\xb9\x94\x56\x5d\x1f\x79\xf2\x6b\xb5\xf7\xd2\x3b\xbc\x96\x4e\xba\x7c\x87\x3b\x65\xd9\x09\xfb\x8a\x5f\xc2\x71\x3a\xc9\xb2\x38\xed\x75\xbb\x63\x9e\x4d\x66\x03\x79\xb1\xeb\x8e\xe8\x90\x0d\x84\x38\xeb\x82\x3d\x43\x97\xa7\xe9\x8c\xa5\xdd\x47\x8f\x1e\x3e\x71\x5a\xbe\xed\x9e\xa9\xc5\x7d\xc1\xdc\x85\x91\xf3\x55\x04\xc1\x63\x38\x92\x0b\xdd\xa9\x38\x19\xd4\x5d\xce\xb9\x1b\x6b\x49\xc0\xb3\xda\x27\x48\x67\xc0\xa3\x40\x33\x83\xbf\x6d\x97\x90\x31\x60\x19\x1b\x66\xfe\xcb\xc1\x18\xe3\x3b\x63\x69\x97\xf7\xa5\xee\x39\xb2\xe0\x19\xb2\xe0\xf9\xb1\x6d\xff\x01\xe7\xa1\xef\xf9\x0c\x98\xfb\xce\x0b\x1e\xbc\x91\xf7\xdc\x0a\xf7\x81\x02\x5c\xd3\xf5\xb0\x72\x79\x00\x7a\xa1\x8d\x63\x3a\x23\x1e\x05\x2f\xde\xbd\x01\xbd\x10\xbc\x7f\xeb\xa8\x13\xf2\x34\x63\xd1\x2b\x91\xbc\x52\xab\x2d\x6d\x35\x5d\xeb\x46\x6d\xd5\x9c\xeb\xfa\x2f\x3c\x0c\x3f\xc6\x01\x35\x99\xe8\x2a\x3b\x6f\x21\x9b\x11\xbb\xc4\x60\x47\x6d\x22\xff\x84\x75\xeb\x2f\xb7\xea\xfb\x94\xa9\x50\x76\x87\xbf\x5d\x7f\xc5\xbf\x5d\x5c\xc4\xca\xe2\xc4\x61\x9d\xb2\xbb\x4e\x9e\x6b\x16\x4d\x48\x34\x5d\x86\x9c\x0e\x68\x25\x45\x6d\x9c\xc1\xdc\x56\xba\x68\x27\xbd\x92\x7b\xcf\xc7\x14\x35\x7c\x13\x16\xc6\x24\x4b\xe4\x8a\x3e\xb3\x17\x7e\xfd\x8a\x22\xea\x26\x79\xab\x38\x2c\xf4\x5c\xc1\x49\xaa\x75\x6e\x41\x90\xbc\x8b\x8b\xec\xe4\xbe\x72\x5e\xf1\x96\x6f\x25\x25\x2a\xc8\x54\xb2\xd7\x2e\xb0\x03\xf6\xec\x8e\x8c\xb5\xb4\x6f\x22\x1f\x45\x2c\x01\x41\xa6\x19\x8c\x2e\x6a\x46\x72\xd1\xe4\x0c\xf9\x71\x38\x8e\xa4\x42\x04\xce\xad\x9b\xf8\xd6\xc3\xa8\xaa\xee\x39\x7e\x3b\x1d\x57\x7b\x5d\xf7\xa0\x2b\x84\x98\x2c\xe1\xb7\x8d\xfc\x8d\x56\xf1\x30\x72\x3b\xed\x38\xf5\x38\xa5\x1e\xb4\x13\xa2\xb3\x3c\x7c\x2a\xd9\x82\x37\x91\x27\x3c\xa9\x91\x9b\x68\x66\xb2\x60\xba\xa4\x04\x2a\x3f\x64\xaf\xb8\x46\x1a\x53\x2b\x88\xa9\x52\xd0\xd9\x8a\x55\x10\xbe\x84\x46\x5d\xd5\x8c\x3f\x94\xfc\xed\x43\x18\x63\x3e\xef\x10\x2c\x08\x85\x7c\xc3\xbf\x52\xb9\x5d\xa5\x20\xa9\x56\x86\xa4\xdf\xcd\x7d\xef\x71\xe7\xc3\xb8\xcf\x38\x03\x67\x0a\x4b\x60\xf5\x4b\xc3\x07\x86\xd2\x12\x68\xbf\x7d\x55\xe4\xc3\x39\xf7\x73\x03\xa8\xcb\x4a\x20\xd5\x9d\xdb\x07\x95\x85\x25\xb0\xfa\x41\xe1\x03\x43\xa9\x0b\xad\x94\x29\x16\x50\x15\xb8\x30\x5a\x5d\x62\x81\x74\x89\x07\xa5\x0c\xf0\x14\xc4\x3c\xbe\x1e\xff\x37\x77\xa9\x7b\x49\xdc\x6a\x33\xbe\xa9\xd5\x27\x7f\xe8\x35\xe6\xfc\x6d\xb1\x39\xeb\x44\xfe\xac\xe2\x7e\x74\xa3\xd3\xcf\x0d\xc5\xcc\xf8\xa7\xc7\xab\xa6\x48\xbf\xf2\x15\xdf\xe1\x9f\xde\xfb\xdf\x65\x1e\xe7\xb7\x86\x75\x1f\x4b\x0e\xa1\x9d\x9f\xe6\xe5\xa7\x28\x26\xff\xd4\x74\x81\xbf\xe7\xf1\x97\xe4\xe9\x67\xb6\x3a\xb3\x0d\xae\xe6\xe9\x57\xb9\x75\xfd\xfe\x3b\x69\x34\xda\xa4\xe6\x7d\xbe\x82\xbb\x1f\x5e\x7c\x8c\x9d\xd9\x95\xf7\xd1\xe8\xc7\xd4\x99\x60\xd8\xcc\xbf\x5b\x78\x60\x79\xff\x40\x58\x07\x9d\x09\x84\xe3\x74\x8f\xf7\x3c\xee\x06\x6d\xd4\xfa\xd7\x15\xe0\x95\xb8\xb2\xc6\x07\x4e\x36\x9f\xab\xe6\xc8\x39\xdd\xee\x38\xb3\xd0\x51\xcb\x3a\x53\x26\xb1\xf9\x76\x6a\xb0\x2b\xd1\x6a\x15\xe2\x44\xc0\x81\x55\x28\x2a\x69\xc4\xaf\xe8\x1c\xa3\xfa\xcf\xaa\x3b\xcc\x92\xbe\x5a\x5e\xbf\x17\xbb\xb4\x15\x8e\x42\xcf\x4f\xad\xe2\x2c\xf4\x60\xaa\x0f\x36\x0f\xac\xfa\x64\xcb\x83\x55\x1e\x6d\x1e\xe0\xc2\xb3\xad\x08\x5d\x7d\xb8\x15\x61\xab\x4e\x37\x0f\x72\xc1\xf1\x56\x84\xad\x3b\xdf\x8a\xd0\x85\x03\xce\xea\xfa\x0d\xdf\xfc\x40\x76\xf6\x48\x8f\x94\x1d\x62\x65\xce\x8a\x76\x45\xb5\x5d\x3e\xb4\xee\x8a\x9e\xc4\x7a\xd4\xd3\x67\xaa\x73\xc7\xb6\x4d\x14\xef\xa3\xf8\xe0\xf3\x5e\x31\xea\x5b\xb5\x77\x9f\x79\xd2\x2f\xf4\xe8\x73\x34\xcd\x65\xd9\xec\x3c\x83\x56\x54\x72\xe6\x8d\xc8\x4c\x69\xce\x06\xce\x94\xdb\x19\x06\xab\x6b\x34\x6a\xd0\x4b\xf8\xd6\xd5\xd3\xcd\xbd\x0a\xcd\x18\xd0\x93\xd0\xb3\x15\xc8\x79\x0f\xde\xfb\x53\x64\x09\xcb\x89\x1c\xc9\x33\x92\x2b\x71\x27\xb5\x20\xd6\x92\x1b\x63\xb1\xd4\x56\x29\xca\x5a\xc8\x33\x52\x2c\xbc\x11\xff\x22\x9a\x44\x3c\x1a\x57\x39\x6e\xdc\xcf\x03\xd6\xba\x16\x21\x88\x75\xc4\x11\x51\x46\x79\x54\xe5\x52\xb4\xb7\xff\xb8\x00\x5a\xeb\xa8\xa3\x60\x4c\x25\x1a\x04\x60\x0f\xff\x1a\x66\xae\xd2\x37\x68\xff\xd1\xa3\xca\x2a\x75\xed\xe5\x61\x6f\x26\xe7\x9e\xe7\x81\x03\x8d\x44\x34\x54\xbb\x05\xb2\x08\x8f\xc6\xf9\xad\xc2\xf2\xa5\x1b\x2d\xdc\x74\x36\x07\xd3\x8c\x95\x20\xdd\x44\x5d\x57\xa6\xcd\xaa\x1c\x2f\x0e\xc6\xcd\xd6\x5c\x20\x74\x6f\x4a\x56\xc7\x8f\x42\x84\x8c\x46\x06\xb3\x91\x8b\xaa\x99\xa8\xaa\x0a\x79\x19\x4c\x3f\x4b\x16\x4d\x93\x47\x69\x46\xa3\xa1\xdc\x3c\xf0\xd6\xd0\x36\x76\x6a\x36\x71\x0b\xcd\x32\x36\x8d\xb3\x12\x2b\x25\xf2\x0f\x72\x4f\xd2\xc0\xda\x18\xdd\x3b\x2d\xa4\xc0\xf0\x3e\xf6\xc8\x1e\x5c\x27\x97\x4e\x08\x01\x5b\xa9\x5a\x1d\x76\x1f\xd5\xfd\xae\x30\x3a\x69\x93\xc6\x1b\x9a\xb1\x84\xd3\x70\xe7\xe3\x61\x8f\x4c\x79\x0a\x09\xcd\x17\x54\x6b\xb4\x48\x8f\x80\x99\xc4\xee\xd3\x6d\xf5\xd1\xb3\x7a\x59\xad\x9f\x5e\x55\xaf\xaf\x92\xd1\x4a\xab\x58\x4b\x9d\x94\x65\x5a\xb8\x59\x54\x24\x19\x0b\x0f\x87\x8d\x21\x86\x47\x33\x10\x43\x20\x5e\x07\xcd\x14\xdc\xf0\x80\xcc\x06\xe0\xc5\xb7\x96\xde\x65\x1c\x3d\xbc\x66\xaa\x72\x34\x2d\xc7\xac\x40\xb3\x9d\x11\x8b\xe3\xa3\x40\xf6\x4c\xf3\xdf\xdf\x97\x99\x17\x8b\x71\x45\x7e\x6f\x1b\x3e\xbf\x4b\xf6\x7c\xd9\xfc\x02\xb6\xc1\xfc\x27\x72\xa5\xbc\x7a\x77\xf0\xf1\xa8\xff\xf3\xcb\x5f\x8f\xc8\x33\x72\x22\xdf\xab\xf2\xa9\xaa\x5c\xd5\xb4\x29\x82\x2c\x49\x87\xf2\x3f\x33\x78\x0d\x07\xea\xc9\x1c\xb2\x11\x3e\x78\xf9\x78\x92\x35\x4e\xdd\x2d\x86\xa7\xfa\xd8\x72\xb5\x67\x6a\xf5\xdb\x46\x3b\x10\xa0\xee\xdd\xa8\x59\x6b\x16\xd1\x02\x1e\xde\xd9\xf3\x77\x87\xe2\x01\xa9\xb8\xa3\xdb\x25\x87\x59\x23\x25\x94\x48\xd6\x0c\x19\xe8\x90\x2e\x18\xe6\xf6\x8a\x18\x8a\xc0\xb1\x36\x11\x72\x92\xb0\xce\xf3\x30\x15\xf8\x6c\x25\xa1\x18\xf3\x21\xe1\x29\x19\x86\x1c\xb2\x9e\xf1\x00\xab\x03\x9e\x00\xbc\x95\x00\x11\x25\x19\xa3\x89\x9c\x8f\x8e\x4e\x58\x61\xb6\x36\xb3\x3b\x6b\x02\xc3\x18\x0b\x27\x8e\x1d\xec\x05\x8f\x02\x71\x81\x52\x8f\xd9\x42\x05\x78\x61\x86\xbd\x97\x6d\xf5\xd6\xec\x1a\x2b\x69\xfd\xf7\x53\x7f\x3f\x37\x3d\x77\xc0\xaf\x6e\x5d\x6d\x25\x0d\xc4\xfd\x2f\x3c\xba\x84\x2e\x78\xf1\xf2\xf5\xf3\x5f\xfb\x1f\x0e\xdf\xbf\x7f\xfd\xf2\xc6\x83\x4e\x7c\x51\x21\x20\x32\x71\x20\xa2\x74\x36\x95\x6f\x0f\xb0\xf5\xad\x8c\x15\xf0\xb8\xa6\x52\x5d\x17\x8a\x2d\x7c\x8b\x3f\xf1\x2d\xfe\xc4\x9f\x22\xfe\x84\x86\x5c\x88\xfb\x85\x98\xda\x90\x09\x26\x0e\xf6\xbf\x12\x31\x8b\xab\x5a\x79\xfc\xb0\xaa\x46\x6d\xa0\x05\x1f\xf4\x4f\x97\xfc\xa2\x3e\x30\xc5\x83\xbd\x1c\x60\x1d\x76\x1b\x8e\xe2\x86\xdf\x7d\x2f\x3e\x7e\x78\x0e\x07\xed\x33\xf2\xe0\xc1\xee\x53\x2c\xf3\x0f\xa4\x8a\x73\xea\xf1\xee\xd6\x23\x23\xf8\xc1\xd6\x9d\xb8\x06\x74\x90\x8a\x70\x96\x59\x87\x7c\x71\xce\x92\x51\x28\x2e\x7a\xa4\x81\xb1\xd2\x1a\xe5\xc1\x02\x0a\x9e\xf6\xa5\x51\xfb\x75\x5a\x66\xbf\x34\x84\xc4\x0b\x36\x84\xbc\x88\x9d\x5f\xe5\x5e\xf3\xea\xe3\x6f\x5a\x68\xa6\x2c\x81\xe0\x3f\x85\xd4\x04\x36\x02\x7f\x09\xd8\x6b\x46\xcf\xe1\x39\x5e\x1d\xd3\x9e\x46\x7c\xaa\xa3\x15\x4c\x67\x7c\x07\xad\x07\x76\xd8\x25\xcf\x48\x83\xdc\xb5\xa4\xbe\x4b\x1a\xd3\x14\x8a\x8a\x19\x2b\x18\x95\x37\x5b\xf9\x1f\x76\x18\xbd\x9b\x65\x25\x5d\x79\x0f\xa6\x2a\x5e\x67\xea\x48\x53\x3b\x6d\x55\xb4\x5e\x81\x2c\x15\xc3\x56\x06\x35\x64\xef\xc1\xee\xee\xd2\xa3\x95\x53\x43\xf6\xa1\x02\x8f\x46\x3c\xe2\xce\x38\x10\xef\xbf\x39\x9c\x33\x6e\x2c\x06\x4b\x89\xce\xbe\x7f\xfb\xc5\xaa\x8d\x7f\x9e\xb1\xf9\x28\x81\xfd\xce\xa5\x0b\xbc\x84\x2c\xa2\xc6\xee\x7f\x79\x21\x1e\xa0\x9f\x23\x91\x4c\x7b\xa4\x91\x0e\x69\xc8\x9a\xbb\xad\x86\xc6\x6f\x02\x45\xc0\x54\xd4\x57\xdb\xb3\xd5\x96\xe9\xd6\x25\xcf\x6a\x7a\x95\x63\xd2\xda\xae\xd8\x89\x59\xa1\x7d\x45\xb7\x95\x26\x66\xaf\x64\x62\x1e\x2c\x9e\xce\xce\x93\x6b\x9d\xd0\x44\x49\xcb\x3f\xfb\x3c\xfc\x60\x37\xcf\xbf\xb6\xa4\x76\x6d\x14\x57\x78\xdd\x32\xcb\xed\x73\x0f\x9c\x15\x62\x83\xb2\xf4\x48\x43\x99\x6d\x42\x78\x96\x46\xb1\xfb\x05\xfe\x76\xb8\xfb\x9e\x97\x3d\x23\x3f\x25\x8b\xb6\x21\xc9\xee\xd7\xb3\x0f\x21\xc6\x57\x34\x75\x0e\x0d\xd3\xea\x0b\x93\x8e\xa7\x01\x0b\xf9\x66\x82\x90\x60\x84\x91\xd4\x84\x18\xc1\xd1\xe6\x23\x80\x20\x82\x84\x82\x81\x44\x36\xa1\x91\x86\x87\xd3\x43\x82\x3b\x41\x49\xf2\xb1\x48\x56\xf0\xf1\xff\x3a\x82\x71\x00\x35\x00\x8b\xc1\x41\x76\xac\x20\xda\x75\x07\xfe\xbe\x0b\x64\xf3\xc3\x81\xad\xeb\x0e\xeb\x60\x59\xe8\x0f\xeb\xc0\x6e\xcd\x21\x36\x17\x8f\x8c\xfc\xd9\x3d\x62\x9d\xf1\xae\xe2\x12\xeb\x4e\xd3\x75\xf9\xc4\x46\xec\x32\xfb\x99\xb9\x5b\xac\x8a\x29\xd4\x23\x27\x3a\x1f\x95\xaa\x0a\x0c\xca\xa3\xb1\x6b\x49\xe6\xb9\x8a\xc2\x0e\x70\xcc\xa7\xa0\x1d\x72\x7d\x41\xed\x87\x03\x31\x9d\xf2\xbc\xab\xa8\xbe\xa8\x3c\x2b\x75\x6a\x70\x50\x34\x3f\x5f\xb5\xc9\x67\xa2\xe0\x1d\xdf\x59\xaf\x9f\xa9\x32\x06\x2b\x43\x26\x39\x0a\x24\x7a\xe5\xea\x8b\x5d\x5f\x7d\xb1\x5b\xa7\xbe\xd8\x3d\x55\x29\x66\x2d\x66\x11\xc3\xd6\x5d\x8e\x7b\xcf\xc7\xbd\x57\x87\x7b\xaf\x88\x7b\x38\xf0\x78\x75\xff\xd4\xfd\xd8\x57\x2d\xff\xcd\x4e\xa5\x2a\xd1\x93\xeb\xea\xfd\x2d\x50\xb1\x5e\xae\x4b\xe8\xcd\xd1\x2b\x00\x7a\x31\x82\xf5\x37\xb5\xe7\xdb\xb6\xb1\xa0\x68\xe1\xea\xb6\xac\x4b\x72\x0d\xf7\x0b\xb6\xbc\x72\x7d\xe4\x06\xe5\x76\xac\xd8\x96\xf9\x34\xa2\x67\x56\x55\x61\x70\x38\xa5\x9e\x85\xa9\x07\x5c\x8e\x63\xd1\x24\x39\xc0\x7e\xc2\x06\xe5\xc3\x69\xe2\x14\x4d\xe5\x52\x02\x89\xbf\xf5\x48\x2c\x2c\xb3\xa2\xaf\x45\xe5\x4a\xb4\x36\x44\x15\x3e\x32\x65\x9d\xc8\xe4\xb6\xa2\x3c\xaa\x96\x6a\xca\x97\x72\xbb\x2b\xcb\xcc\x9b\x3b\x5d\x3f\xc0\x62\x97\xf3\x63\x04\x34\xc6\x7c\xc3\x71\x9b\xc0\x4d\xd5\xf3\x93\x49\x18\x88\x93\x98\x41\xd4\xed\x92\xbf\xc9\xeb\xca\x2b\x7e\xf9\x46\x9b\xaa\xe8\x80\x72\x63\x96\xfd\x28\x6f\x78\x3c\x1a\x1f\x80\x66\xe1\x03\x1b\x66\x4d\xc8\x03\x6d\xc6\xa4\x2e\xa4\xbb\x96\xe0\xfa\x46\xea\x14\xe5\xae\xa4\xfa\x52\xaa\x07\xec\x7a\x59\xff\x8b\xe1\xed\x05\xd2\xc2\xa9\xbb\x4e\xe2\xda\x9c\xc3\x28\xa0\xe0\x7f\xc8\x33\x47\x99\xe8\x7f\xfb\xb5\xe6\x1b\xa4\xa9\x7b\xe6\xea\xf6\x34\x1d\xed\xb2\x50\xee\x48\x30\xea\xff\x01\xa2\xc2\x46\xe6\x16\xff\xaa\x8a\x7f\xff\x9d\xdc\xf6\xc1\xef\xdc\xd1\x25\xc0\x08\xcc\xf3\xed\xb1\x7d\x7f\x43\xb3\x49\x07\xae\xd0\x4d\x49\x96\x0e\x4c\x25\xe9\x92\x7d\xc7\x2d\xd5\x8e\x26\x0f\x8d\xd3\xec\x81\x17\xec\xfc\xd0\x64\x53\x8d\x21\x37\xa6\x1f\x72\xbf\x7b\xc4\xeb\xf2\xc9\xee\xa9\xfe\xf4\xb4\x04\xdf\xaf\x39\x7c\xbf\xe6\xf0\xfd\x5a\x8d\xef\xd7\xfc\xe8\x72\x73\xa1\x3b\xb4\x03\xcc\xda\x91\xbc\xb3\x68\x42\x74\x9b\xaa\x4a\x06\x66\x99\x25\xeb\x14\xe9\x5b\xa4\x86\xe2\x08\xc0\x98\xfe\x5f\x92\x35\x9b\xfb\xe4\x7b\xfc\x19\x8b\x0b\x87\x3a\x6d\xb2\xdf\x22\x77\x73\x5f\x90\x12\xf2\x53\x8b\x74\xc9\x3d\x6b\x11\x8a\x0e\x74\x22\x21\xa9\x98\x32\x92\x30\x9a\x0a\x0c\xe3\x64\x1e\x16\x84\xa7\x64\x90\x88\x33\x50\xed\x91\x37\x62\xc0\x43\x46\x0e\x26\x89\x84\xe7\x23\xbb\x10\xf8\x08\x66\xb3\x63\x10\xcb\xd1\x38\x7d\xff\x2f\xb2\x8f\xdc\x98\x73\x80\xb6\x10\x77\x9f\x91\xbd\x12\xe3\xce\x32\x8e\x91\x2d\x1a\x9a\x4c\xe9\x65\xd3\x1d\x4e\x61\xb3\x20\x08\x47\x07\x69\xb3\x69\xb7\x15\xbd\x85\x20\x65\x20\x3f\x28\xe9\xc9\xee\xed\x68\xa2\xb7\xda\xe6\x2f\xf2\x3d\xd9\x27\x77\xc9\xfe\xd3\x42\x37\x7e\xbd\xd6\x6e\xfc\x84\x4b\xc6\xeb\xc7\xaf\xa6\x1f\xbf\x96\xf4\xa3\x82\x3d\x0c\xfd\x61\xaa\xf2\x4c\x01\x1d\x07\x76\x28\x73\xa8\x84\x2b\x27\x23\x01\x3b\xe7\x43\x56\x12\x8d\xa0\xb8\x63\x74\xbb\xe4\x7d\xc2\x62\x9a\xb0\x62\xcc\xb9\x4e\xee\x70\x29\xb9\x17\xd6\x87\x6b\x80\x0a\x08\xdb\x74\xee\x81\xfa\x52\xa2\x69\xd4\xd3\x7f\x98\xd9\xd2\x25\xbf\xb6\x9d\x59\xea\x39\x7f\xb7\xc9\x70\xd0\x93\x97\x2c\x2f\xd5\xc7\x53\x77\x58\x2f\x58\x1c\xd2\x39\x8c\x8a\x5d\xb2\xe1\x0c\xba\xe9\x6d\xfa\x0b\x87\xb9\xc8\xf2\xa2\x6e\x72\xdc\xe0\x02\x35\x13\xe8\x3a\xb1\xc1\xa5\xd8\x15\x5a\xb7\x20\xec\xf0\x2f\x0c\x43\xf1\x65\x82\x4c\xe9\x19\x23\x94\x64\x09\x0d\x98\x18\x8d\x30\x3a\x1b\x3c\x6e\x30\x8d\x5b\xd5\xca\xfb\x03\xc8\x71\x55\x72\xcb\x2f\x61\x9b\x98\x26\x74\x9a\xfa\x37\x7e\x7b\xe1\xc5\xaf\x65\x97\x62\xbb\xbb\x2b\x18\xdd\xe7\x02\xcc\xaf\x79\x98\x5f\x8b\x30\x6a\x11\x7a\x60\x30\x2e\xf7\x2e\x3c\xb0\x10\xc3\x81\x67\x7c\xaf\xe3\xba\x3e\xf3\xa2\x54\xa8\x52\xf7\x02\xf2\x3c\x08\x08\xd5\xdc\xa7\x43\x89\xa9\xca\x54\xbe\x8c\xfd\x47\x1d\x79\x46\x4e\xcc\x0b\x11\x1e\x9b\x45\xdd\xb1\x7d\x6f\xaa\x4a\xad\x36\x39\x59\xe0\xff\x57\xe3\xfa\x07\x2e\x74\xee\x28\xd4\x8b\xd3\xb1\x12\x36\x12\x17\xf7\xce\x9f\xf7\x52\xcb\x70\xd1\xf4\xbc\x95\xc2\x2e\x79\xd6\x33\xe2\x34\x77\x72\x95\xc0\x48\x7f\x72\x16\x84\xf9\xb3\xc0\xaf\xf9\x93\xde\xf2\x6d\xfe\x40\xb7\xfc\x5b\xb2\xf9\xba\x7c\xac\x79\xb7\x75\x6a\x0f\xda\xbc\x0f\xbd\x41\x61\xde\xe2\x25\xd3\x45\xee\xda\xb4\xc4\xce\x1b\x5d\xfd\x71\xcb\xac\xf6\xe1\xa0\xf8\x1c\x16\x25\x31\x55\x00\xb2\x2e\x70\x80\xdd\x5a\x5a\xc5\x4b\xe9\x12\x9c\x79\x3c\x91\x0c\x39\x1b\x4e\xbc\x30\xc3\x62\x38\x9c\x25\x2c\x95\xac\xfa\x7f\x33\x3e\x3c\x0b\xe7\x1d\x5b\xe5\x17\x46\xd2\x8c\x87\x21\xb9\xa0\x51\x26\x41\x20\xf5\x67\x6e\x6b\x5d\xf4\x90\x61\x51\xe0\x87\x77\xf1\x36\xc8\x92\xf0\x15\x55\xa1\x5b\xea\xf6\xdf\x25\x77\xdf\xcd\xb6\x7f\x1b\x32\xc6\x10\x55\x11\x76\xb7\xb5\xf0\xa1\xb7\xa0\x87\xce\x2c\x6a\x8a\xde\xb9\xa3\x89\xab\x64\x16\x75\x71\x51\x0a\x1b\x9e\xe5\xc5\x4e\x1a\xf2\x21\x6b\xee\xb5\xdc\x1e\x3b\x23\xb8\xb9\x60\x00\x9e\x98\xb3\x3c\x1a\xc0\xc6\x1e\xe4\x45\x3f\xf1\xc2\xc2\x51\x34\x71\x5c\xc4\x47\x3c\x04\xe1\xf8\x2c\x23\x20\x01\x20\x6c\x3a\x0b\x69\xc6\x02\xe4\xc9\x54\x5e\xaf\xa7\x70\xbd\xee\x98\xba\xbf\x30\x15\x6f\x39\x03\x4e\xe2\x11\x01\x75\x87\x44\x07\xb6\x77\xb0\x56\xdc\xed\x1f\x02\x39\xc3\x02\xfc\x6e\x18\xf2\xe1\xd9\x77\x24\xe4\x67\x4c\xb5\xd0\x71\xd0\xa2\xc9\x9d\x5e\x73\x4a\x1f\xe9\xde\x6a\x2c\xa6\x74\x98\x88\x30\x34\x38\x6e\x99\xb5\xce\x53\xf9\x38\x90\x75\x26\x42\x9c\x81\x15\x25\x0b\xc0\x00\x10\xa5\xfb\x09\x3b\xe7\x62\x96\xea\x5d\x5c\x02\x43\x3c\xb2\x4e\xa5\x1f\xfc\x4a\xee\xd6\xcb\xb8\x55\xe7\x1d\xaa\xd7\x76\x92\x5e\xe0\x20\xbd\xa1\xf3\x67\xa5\xab\xa7\xeb\xdd\xb8\x62\x2e\xb3\xbc\xc5\xca\xf2\x09\xcd\xdc\xf1\xdb\xe8\xdc\xc5\x54\x5f\xda\x01\x3f\xf1\x13\x41\xe2\xf9\x9c\x2f\x5d\x29\x49\x1f\xba\x65\x96\x64\xe5\xd3\x29\xd4\x5a\x39\xef\x22\xef\x44\x52\x9f\x2a\x9d\x8b\x9c\x2d\x62\xa1\x77\x91\x2b\xb5\xaf\x74\x2f\x72\x7c\x02\xd6\xf3\x04\x1a\x85\x3c\xd6\x2e\x07\x8e\x5b\x90\xd3\x38\xf8\x05\xe5\x54\x26\x39\xc3\xcf\x07\x1b\x19\x7e\x22\x60\x47\xc1\xc9\xe1\x91\xef\x54\x4f\xbf\x2b\xd7\x68\x3d\xb8\xff\xb0\x25\xf1\x69\xfb\x1b\x2d\x9a\x2f\xf6\xec\xe1\x46\x3d\x2b\x35\x2c\x7b\xf8\xb0\xf5\xb4\xf4\xcb\x83\xfb\x8f\x5a\x4f\x8b\xa3\x29\xb5\xb7\xba\xd7\xea\xc0\xf5\xb7\x33\x4a\xc4\x54\x2e\xb4\x5c\xbf\x1f\x5d\xa7\x29\x2d\x48\xa6\xb2\xcb\x2a\xbb\xa9\x27\x2d\xb4\x42\xfa\x1b\xe2\xad\x74\xb5\x51\x60\x99\x40\xcb\xdc\x2a\x9f\xa5\x7b\x0a\x4e\x6e\xca\x55\xb8\xc0\x54\x0b\xbc\x60\x52\x98\x86\xc3\xac\xda\xc5\x07\xd2\xff\x60\xc3\xaf\x51\xb9\x51\x65\xd1\x78\x5f\xb7\x0c\xfb\x92\x36\x19\xae\xcc\x63\xf4\x58\x81\x8f\x59\x26\xdb\x7f\x15\x55\xf6\x00\xc4\x56\x6a\x7a\x9a\xea\xbf\x9d\x23\x72\x57\x4f\x59\xe7\x15\xf9\x9e\xdc\x2e\x6f\xe5\x49\xcb\xb9\x79\x71\x94\xb0\x11\x4b\x7b\x2c\x7a\x0a\x91\xab\x1a\x50\xdc\x68\x6b\xcb\xf7\xfd\xfd\xce\x5e\x67\xbf\xb3\xe7\x82\xc3\x2b\xeb\x35\x3f\x63\x6d\x32\xa5\xf1\x28\x72\xed\x97\xd1\xe2\xfd\x79\x32\x76\x0b\xe5\x0e\x26\x6b\x3a\x87\x9a\x8f\x88\x74\xbf\x27\xcb\x22\x23\xdf\x77\x5d\xa5\xec\x3b\x79\x06\x2a\x76\xb0\x08\xd5\xee\x07\x5e\xdd\xca\xbb\x19\xc4\x16\x3c\x25\xf9\x64\x09\x50\xd8\xc3\xf1\xd9\x5a\xf4\x75\xa9\x0e\xd6\x02\xe8\xce\x02\xe0\x3f\xc8\x5e\x51\x99\xe5\xd8\x74\x3b\x95\x62\xb4\x83\xc7\xea\x9e\x3a\xcc\x82\x71\x15\x8d\x61\xd7\x29\xd2\xdc\x61\x38\xa5\xf9\xce\x19\xa4\xd6\x10\x27\x2c\x85\xc7\x68\x9a\xb1\xb8\x0d\x95\x68\x26\x12\x65\x8f\x3f\x22\x4d\xd5\x81\x96\xe9\xfe\x30\xbb\x6c\xc2\xdf\x6d\x3d\x92\x7d\x6f\x24\xfb\xde\x48\xda\x46\x98\xdd\xed\x4a\x7c\x78\xd6\x13\x9e\xca\xeb\x14\xb4\x36\x08\x19\x11\xb2\xbb\x0d\xf5\x1a\x47\xf9\x8a\x3e\x10\x74\x8f\xc8\x0e\x5c\xed\x52\x3e\x95\xb7\xad\x21\x55\x31\x89\xc1\x11\x01\x47\x7a\xdb\x25\xf9\x9d\x3b\xe4\x76\xf3\x40\x92\x0e\xc8\x24\x7f\x3b\xab\x56\x55\x71\x9d\x69\x40\x97\x6e\x1a\x7b\xa6\xa6\x0f\x9d\x0a\xde\xb5\xf4\x3c\xc9\xb7\x01\xbb\x20\x07\xcd\xd6\x53\x72\xbb\x29\xe7\x4c\x81\xca\x5a\xf0\x0c\x6d\xb6\x5a\x9d\x40\x44\xec\x29\xd2\xc4\xd5\xa8\x93\xdc\x1a\x6f\xea\xb9\x07\xc8\xb6\xa1\xf5\x0f\xb0\x0b\x99\xce\x28\x36\x6f\x93\x13\xd9\x9e\x4a\x24\x8d\x75\x4e\xdb\x70\x86\xb4\x48\x8f\xd8\x6f\xf9\x47\x84\x2f\x96\x0a\xf5\x6e\xa4\x37\xa6\xe6\x3b\xfd\x94\x79\xea\x4e\x45\x6e\xbc\x1a\x84\x18\x55\x2d\x74\x60\xa3\x51\xc2\xb0\x9a\xef\x4e\xf4\x50\xe0\xbf\x72\x2c\xba\xa8\x24\xca\x15\x51\x84\xe8\x98\x71\x60\x3f\x6e\x39\x37\x3e\x84\x50\x3e\x23\xad\x92\x73\xea\xf1\x75\x9f\x53\x7f\xf3\xfd\x3d\x2a\xb6\xe4\x7b\xfb\xde\x56\xff\x82\xa5\xc3\x2a\xff\x01\x70\x20\x28\x1c\xca\x76\x4b\x56\x06\x36\x7a\x4e\x91\xee\xc6\x7b\x12\x77\x03\x1e\xa9\xd5\xd6\xca\xf7\xaf\x33\xca\x23\xb0\x3d\x92\xd7\x2f\x44\x07\xb3\x0f\xbc\x83\xc0\x8a\x28\xe4\x19\x7e\x47\x33\xa9\xfc\xd4\x3e\xd9\x68\x6a\xe5\xe4\x1c\x1e\xbf\xfc\xf0\xfc\xf8\xdd\x87\xaa\x49\xdc\x6d\x35\x1b\x7a\x69\x34\xd4\x84\x1e\x3d\x7f\xf5\xb2\x7f\xf0\xfa\xdd\xd1\xe1\xdb\x7f\x59\x35\xef\xad\x2c\x99\x1b\x8f\xcc\x84\xe3\x69\x7d\xf2\xe8\xf4\x44\x37\x71\x8a\xe2\x0a\xf8\x74\xd2\x40\xee\x69\x9c\xe6\x05\xec\x79\xec\xa0\xd9\x45\xb1\x77\xb7\x4b\x58\x1a\xf2\x28\xdb\x51\xae\xf0\x3b\x72\x0b\xd8\x09\x79\xc4\x48\x24\x76\xb2\x49\x22\x2e\x76\x42\xe8\x6d\x78\x8b\xb8\x27\x22\xb4\x99\x0b\x50\x49\x00\x9e\xec\x3f\x05\x81\xee\x15\x19\xd2\x6c\x38\x21\x4d\x49\x58\x79\xdc\xb1\x69\x9c\xcd\x89\x9c\xec\x5a\xd6\x60\x97\x6c\xd8\x26\xe9\x19\x8f\x0f\x42\x91\x1a\xef\x2f\x70\x0d\x73\x4a\x61\x87\x74\x47\xd6\xd2\xcb\xc7\x28\xc9\x41\x65\x43\x47\xcc\x55\x9c\xeb\x29\x55\x67\x5e\xa2\xa6\xd4\x3f\x76\xe0\x18\x4c\xf2\xd3\x4c\xe0\x1b\x6c\x92\x85\x29\xd6\x76\xde\xf2\x9d\xcd\x7a\xba\x55\x75\x3f\xd6\x2a\x06\x0f\x67\x15\x0a\xd9\x86\xa9\x21\xe7\x42\x1e\xf1\x28\x09\xa9\x99\x50\xb3\x77\xc8\x96\x4b\x39\xfb\xc1\xee\xb5\xfa\x89\xe9\x77\x8f\x63\x8e\xaf\x6d\x06\xf4\xa7\x31\xcb\x0e\x26\x3c\x0c\xde\x98\x2b\x40\xae\xc4\x82\x4e\x59\x32\x66\xee\x27\xc9\x12\xc5\xc2\xa5\x5d\x50\x94\xb9\xdd\xbf\xf8\x39\x8b\xc8\x27\x57\xe2\xac\x82\x55\x7c\x6a\xeb\x09\xa3\x7a\x97\x31\x1b\xfb\x19\x83\x3c\x1e\x00\xda\xb9\x45\xd0\x70\x0f\x44\xf8\xe4\xf3\xf7\x57\x36\x22\x5b\x29\x5e\x00\xd6\xdc\x80\x88\xaf\x88\x9e\x01\x31\xf2\x90\x83\xc1\x9f\x61\x82\xdc\xe4\x34\x4d\x5c\x0d\xd9\xb1\x57\x91\xf5\xcd\x9e\x62\x4a\x6f\x87\x7f\xb0\x04\x6b\xe8\x83\x4c\xf5\x01\xea\x9a\xb0\xd9\x30\x71\xb9\x0c\xfe\x2d\x5d\xef\x07\x04\xd6\x3f\x7b\xd8\xc9\xa7\xb7\xb4\x39\x04\x1a\x6b\xa8\x53\x55\xf9\x09\xe2\xbe\xdb\x8c\x66\x61\x08\x3c\x0a\x2a\x6d\xd5\xf1\x96\x6e\xef\x40\x15\x74\xa6\x34\x76\x86\x65\xd9\x7f\x98\xeb\xf4\x10\x1a\x6d\x75\x46\x22\x79\x49\x87\x13\xe7\x2a\xef\x0d\xb1\xdb\x25\xc9\x0c\xd5\xd7\x53\x1a\x5b\x7c\x13\x96\x30\x70\xe0\x65\x34\x20\xa9\xc0\x14\x2d\x12\x4a\x85\xc9\xd7\xc6\xaa\x33\xc8\x1a\x18\x31\xe7\x58\x3e\x41\xaa\x2b\xab\x41\x6f\x5e\xb1\x4f\x8e\x58\x41\x1f\xd3\x57\x86\xdf\x7e\x99\xb0\x88\xcc\xc5\xac\x91\x30\x42\x83\x00\x48\x2e\xe7\x6c\x2a\xce\x21\xf4\xbe\xe6\x1c\x50\xbe\x4f\xe9\x9c\x0c\x00\x4e\xf6\x42\x81\xb1\x40\x1e\x7b\xd9\x84\x49\x74\x29\x05\x1d\x7d\x14\xb0\x04\xb2\xca\x74\xc8\x2f\xcc\x17\x9b\x7f\x3f\x10\xd9\xe4\x7b\x92\xf2\x68\xc8\xc8\x85\xf3\x91\x4f\x67\x61\x46\x23\x26\x66\x69\x38\x97\xb8\x50\xbf\x6f\x63\xce\xcb\x66\x68\x04\x49\x13\x3b\x28\xda\x33\xd3\x97\xd1\x33\x96\x12\x6a\xe5\x79\x29\xcb\x14\xeb\xa6\x88\x2a\x20\x14\xae\x55\xce\x07\x28\x85\x15\x0b\xf3\x3b\xc5\x4b\x30\x87\xb4\x03\x69\x46\xc6\x33\x96\xa6\xd6\x50\x38\x49\xd8\x30\x93\xb8\x40\xbc\xc9\xa3\x71\x87\x1c\x22\x21\x47\xb3\x6c\x96\xc0\x58\xe4\xfc\xc8\xfd\x41\xee\x3b\x72\xbe\x54\xe5\x59\xc6\x43\x9e\x71\x26\x47\x20\x31\x80\x61\xeb\x9b\x59\x98\x71\x60\x33\xa3\xef\x84\x47\x0e\xa3\xe9\x1c\x42\xdc\xa8\xf8\xfb\x17\x08\x2e\xfb\xc5\xc2\x11\x09\x04\x4b\x49\x24\xa0\x27\x01\x97\x7d\x0a\xe7\x4a\x6b\x2a\x6b\x0f\x45\x34\x64\xb1\xc9\x70\x38\x8b\x94\x2e\x58\x4e\x8c\xe6\x69\x18\xb7\x3c\x12\x74\x01\x10\x0e\x92\x66\xc2\x4d\x1f\xb4\xfe\x3c\x03\x9e\xcc\x6f\x26\x7a\x7b\x90\xf8\xf0\xff\x0c\x87\xd0\x54\x71\x19\x0b\xe0\xe1\x28\xab\x7d\x82\xbe\x5b\x31\x9f\xbb\x5b\xe4\x37\xdb\x66\xeb\x53\xa7\xac\x29\x38\xbc\xe0\xff\xae\xbf\xa9\xfc\xae\x07\xf9\xbf\x80\x47\x60\x01\x9a\xe0\x25\x34\x0c\x91\x65\x78\x44\x3e\xc9\x61\x7f\x42\x96\x52\xc5\x12\x97\xfc\x22\x7b\xf9\x09\xd8\x54\xd9\xa9\xa8\x97\x56\xc0\x92\x8e\xbf\x73\x16\x0f\x8a\xa6\x44\x8b\xb1\x70\x71\xb3\x80\xd9\x7d\x86\xff\xf9\xfd\x77\x65\x75\xa9\x4e\x72\xf8\x8f\x2a\x74\x8d\xa2\xc7\x2c\xfb\xb7\xbc\x28\xbe\x12\xc9\xcf\x6c\xde\x3c\x63\xf3\xdc\x36\x05\xdb\x49\x84\xf5\x7f\x80\xff\x9c\xc0\xc6\xd1\x83\x76\x4e\xb4\xa1\x31\xa8\x06\x94\xd9\x0d\xa3\xc3\x09\xd4\x13\x23\x35\x42\x34\xaf\x0f\x79\x6a\x97\x52\x26\xe4\xee\xc5\x92\x8c\x0c\xd8\x48\x24\x2a\xc7\x14\xb6\x86\xa8\xd4\x0e\x36\x80\xa7\xa2\xac\xab\xb6\x67\xa5\x47\x4c\xdf\x33\x30\x91\xab\xda\xa7\x15\x74\x8c\x50\x2a\x5c\xce\x09\x74\xd6\x98\x64\xcb\x21\xfc\x8c\x03\x94\x7f\xba\x61\x23\x9c\x4f\x76\x86\xcd\x47\x8b\xb4\x44\xc5\x94\xeb\xe0\x89\x42\x25\x37\x5b\xa7\xa2\x55\x7c\x95\x75\xb1\xf2\x69\xe8\x36\x1d\xcf\xd2\x89\xee\xa8\x2b\x18\xd6\x63\xe7\x9e\x35\x1e\x3c\x6a\xfc\xbb\x0a\xb2\x88\x99\x0e\xad\xa1\xcd\x8d\x59\x8e\x38\x3f\x26\xf5\xfb\x34\xff\x36\x47\x9b\x75\x4e\xfe\x5e\x98\x05\x5d\x43\x8b\x5c\x08\xf7\x1f\xa4\x0e\xb1\xde\xaa\x7e\x3c\xab\x44\x72\xc2\x4f\xed\xfc\xb9\x83\x3a\xa9\xa9\x71\x8a\xb7\x33\x97\xdf\xfd\x06\x4b\x9f\xb2\x65\xd8\x4b\x30\x45\x0e\x0a\xb3\x18\x78\x44\xc3\x70\xde\x96\xe7\x9f\x3e\x9b\x53\x72\x31\xe1\xc3\x09\x09\x78\x10\x35\x32\x95\xb5\x58\xaf\x01\x1a\xcd\xf5\x82\xc3\x85\x73\xab\x38\xaf\x45\xde\xf3\xa6\xd2\xeb\xae\x03\x5b\x3b\x7e\x05\x50\x08\xc0\x33\xf4\x2e\xb2\x57\x85\xeb\xf6\xde\x97\x15\x96\xe1\x06\x62\x2c\xf8\x9d\xab\x6a\xe3\x51\x05\x7c\x5d\x53\x39\xcc\x5f\x66\x54\x87\x6f\x81\x15\xbe\x05\x56\xf8\xf2\x02\x2b\xdc\x44\x10\x02\x7b\x4f\xac\x5a\xf3\x65\x71\x15\x96\x0b\xa9\x70\x23\xb1\x02\x36\xf5\x95\xfc\x3a\x1c\x11\x97\x49\x1b\xad\xac\xe4\xd2\x36\xc9\xe6\x31\x1f\xca\x23\x9a\xf0\x28\xe0\x43\xf0\x84\xd7\x07\xb5\x9b\xd9\x19\x7d\xcd\xc4\x88\xd0\xc8\x4b\xfb\x0f\x5d\x33\xd6\x77\x4b\xfb\x74\xbe\xe0\x74\xca\x1c\xa7\x52\x37\x71\x34\xa4\x4a\x75\x2c\xf0\x6a\x13\x99\x3a\x69\x46\xfd\x16\x7e\x12\x09\xff\x4d\xbe\x45\x42\xe3\x68\x9c\x33\xf0\x45\x25\x7f\xbe\xcd\xff\x59\xb7\xc1\x7f\xcb\x93\x62\xb8\x6a\x73\xbf\x2e\xdf\xdc\xad\x2b\xb0\xf8\x55\xe1\x2e\x56\x72\x35\xdd\xd8\xcb\x74\x49\x07\xd3\x2d\xfb\x96\xfe\x85\xdc\x4a\x57\xf7\x28\xbd\x66\x67\xd2\x9c\x03\xbd\x89\x9b\x69\xbf\x99\x20\x1e\x25\xa9\x57\xc7\x2c\xc3\xfe\x1c\x15\xa2\xa7\x34\x41\x94\xea\x1b\x7d\xf9\x86\xd6\x18\x52\xbb\xd4\xce\xda\xb1\xec\x76\xa0\xaa\x0c\xbb\x1d\x90\x5f\x0b\x06\x57\x05\x4f\xb2\xb2\x16\xb5\x4b\x59\xd9\x37\x70\x25\xdb\x71\x9d\x61\xba\xe8\x8f\x51\xb0\x27\x46\x2f\xb4\x6a\xd0\xff\xd1\x8f\xae\x9c\xb9\x2f\x86\x87\x7e\xa9\x2c\xde\x6a\x1c\x6a\x8b\xb6\x9c\x39\xf2\xc1\x03\x41\x35\x92\x37\x2a\x56\xad\x5c\x56\xfa\x6c\x2c\x68\xc4\xf0\x41\x55\x23\x5b\x36\x0d\x2d\xb5\x0a\xdd\x28\xcf\x8b\x17\x77\x7f\x7f\xa5\xac\x2f\xd7\x9c\xa1\xc5\x71\xef\x45\xa8\x5a\x6f\x87\xfe\x12\x8b\xc2\x83\xa9\xf6\x76\xe8\xd7\xad\xc2\xf5\xcd\x22\x2b\xf2\x5e\xe8\x30\x29\x10\x23\x13\x3a\x6f\xff\xfc\xd5\xfe\x29\xfb\xd1\x38\xf5\x6c\xd8\xfb\x7a\xdf\xb2\x9b\x58\x71\x4c\x6a\x19\xc8\x61\xb9\x16\x85\xaa\xb8\x08\xaf\x38\x3a\x0f\xaf\x8a\x37\x49\x4c\xa1\x82\x0e\x5d\x57\x6e\x0a\x3f\x9c\x52\xdb\xef\xfe\x6a\x69\x2a\x72\x28\x4d\x58\xa4\xb6\xe6\xc1\x55\xb2\x51\x60\x3f\x0e\x56\xcb\xd9\xa1\x96\xb1\xdb\xad\xfd\x55\xa7\x66\xdf\x0e\xc4\xa7\xb1\xcf\x09\xab\x4c\x4d\x01\xe5\x2b\x9a\x66\x15\xb3\x02\x9e\x77\x9b\xda\xf5\xae\x60\xd2\x4b\x44\xf4\xd2\x49\x97\xe5\x9c\x17\x6d\xf9\x09\x2d\x76\x73\x7b\x7c\x89\xad\xed\x92\x7d\x24\x25\xc6\xc2\x9f\x4b\x33\x0f\xf8\x29\xbd\xea\xd1\x2b\x9c\x3e\xa6\x1c\x03\xb5\xf1\x99\xa5\x06\x93\xbb\x5c\x38\x49\xef\x5a\xe4\xca\x1a\x15\x2f\xcc\x46\xb0\xa4\xad\x70\xb5\x99\xb0\x79\xf7\xd4\xd8\x09\xeb\x46\xf2\x82\xc3\xfd\x2f\x4b\x70\x68\x7d\x24\x8a\x09\x4c\xdd\xd8\xca\xe7\x2c\xca\x90\x22\xe8\x05\x64\x7d\x8f\xb4\x59\x86\x51\xcf\x22\xcb\xc9\x0a\x7e\x58\x5e\x50\x1e\xbb\x0e\x4b\x03\x34\x5f\xcb\xb5\xe2\x7b\x5c\x58\x1f\x21\x43\x07\xf8\xe9\x66\xb8\xcb\x1b\x86\x78\x95\x4d\xa4\x67\x64\x2d\x47\x9b\xe1\x7f\x38\xc1\x71\x9d\x36\x2b\x3a\x61\xc0\xf1\x22\x70\xe7\x8e\xb6\xc1\xf4\x3f\x9c\x34\x44\xd4\x20\x77\xed\x84\x9d\xa2\x5f\x93\x31\xd0\x2c\xe9\x40\x45\xc5\xb2\x9e\xa8\xa1\x9a\xa0\xc3\x20\x9a\x2e\x32\x5f\x09\x31\x8b\x9c\xf8\xe7\xc8\x3c\x61\xc2\x34\xde\x6c\xc4\xe1\xbf\xb8\x34\x1c\x1f\xf7\x5f\xb7\x5c\xf3\x26\x82\xab\x4e\x58\x18\xb3\xa4\x72\x10\xf7\xbf\x34\xf9\xe7\xdb\xea\xbc\x29\x7b\xad\xce\x2a\x48\x7e\xff\xbd\x4a\xc0\x45\xa3\xf9\x96\x62\xae\xce\x52\x96\x1c\xb1\x90\x0d\x33\x1d\xbb\x54\x3d\x46\x51\x3f\x28\x42\x91\x3c\x1f\x0e\xc1\xfd\xc9\x1c\x42\xb2\xb0\xa7\x42\xf7\xc5\x34\x64\x59\xc6\x3a\x29\x1b\x8a\x28\xa0\xc9\xbc\xf3\x7c\x7f\x77\xb7\x04\x07\x86\xe6\xab\xc5\xa1\xc2\xdf\x61\x76\x84\x02\x8a\x03\x11\x65\x89\x17\xfa\xaf\x14\xc9\x98\x65\x1a\xf2\x98\x5d\x66\x4d\xff\x6b\x9c\xf0\x29\x4d\xe6\x27\x0f\x76\x77\x4f\x5b\x85\x26\x5e\xa8\xec\x51\xcb\xf5\x53\xe7\x9a\x2a\xa0\x79\x99\x24\x22\x59\x80\x83\x49\x18\xe8\x46\xa1\xfa\x7b\xec\xe3\x02\x04\xee\x48\xec\xa5\x6d\xe5\x48\x87\x10\x0e\xb2\x82\x7d\x77\x5b\x1d\x11\xb1\x77\xa3\xe6\x89\x8d\x9e\x4b\x1a\x14\xd8\x01\xff\x82\xe3\x19\x92\x31\xe2\x8c\xe7\x73\x31\xc2\x28\xe1\xd5\x8a\xbd\x45\x6f\xbe\x4d\x95\x0b\xc7\x13\x06\x2e\x62\x5a\x6a\xcc\x87\x90\x80\x26\xca\x48\xc8\xc7\x34\x9b\x25\x8e\x74\x5c\x1b\xf5\xf4\xf4\xdd\x63\xa5\x55\x9d\xf7\x13\x59\xa5\x72\xb5\xee\x61\x42\x63\xd6\x5c\x01\x55\xeb\x6b\x0c\xf2\xe8\x63\x39\x06\xf3\x1c\xc9\x6a\xf9\xd0\x98\x1d\x4c\xac\x31\x4b\xb5\x36\x05\xd8\x9c\x28\x36\x27\x17\x13\x16\xa1\xb5\xcf\x14\x8c\xf0\x52\x16\xa5\x2e\x79\x71\x69\xdc\x18\xf7\xa2\x1d\xb1\xd9\x6a\x0f\x87\x78\x47\xd3\x42\x5a\x63\x35\x83\xf9\x89\xcb\xd3\x13\x5b\xc1\x57\xa9\xdc\x2b\x2f\xf3\xaa\x10\x79\x0d\xd5\xc2\xd5\xb9\x88\x43\x61\x5c\x7b\x57\x94\x39\x59\x91\xd3\x52\x69\x57\x43\x91\x18\xa7\xdc\xe5\xa5\x3a\x8d\xa9\x4e\xf1\x23\x57\xab\xc4\x9b\x4b\x40\x5a\x2b\x63\xf8\x7c\x65\xe0\x4f\x54\x17\xc8\x5d\xac\xa3\xae\x0b\x9d\x21\x8d\x79\x46\x43\xfe\x1b\x7b\xc5\x93\x34\x7b\x2d\xb9\x27\x69\x35\x01\xb8\x75\xda\x56\xf3\x05\x69\xa7\x34\x3b\x94\x0b\x66\x96\x17\x46\xb8\x4f\xfc\x4a\xb1\x43\xd9\x9b\x5f\x72\x5f\xc2\xe9\x8e\x8a\x58\xde\x23\x0d\x79\x47\x6f\xe4\xe5\x0d\x43\x63\x40\x49\x30\xbb\x8e\x64\x37\x78\xfa\xc0\x26\x81\xc4\x5f\x2e\x39\x93\x52\x95\x7c\x5e\x7a\x13\xf0\x74\x77\x37\xbf\xce\xf2\xcd\xff\x19\x76\xf1\x5b\x8b\xa5\x73\xa0\x83\x72\xd6\x5e\x2d\x89\x16\x4b\xe6\x1c\x74\x6a\xfd\xd6\x6e\xd9\x4b\x23\x84\x05\x58\xdd\xbb\x6b\xe7\x86\x16\xa8\x38\x46\x2d\x15\x1d\x14\x96\x41\x99\x2b\x3a\x32\xa9\x69\x18\x36\x6b\x00\x9e\xce\xb8\xda\xa1\x1a\xf2\x77\xe3\x69\x99\x04\x60\xb5\x84\x95\x80\x87\x5c\xb5\x9a\xf2\x8f\x56\xed\x73\x7e\xdd\x44\x46\x0f\xae\x33\x91\xd1\x97\x28\x6e\xf8\x8b\x4b\x04\xb6\x2a\x6d\x01\x71\x43\xb7\x4b\xfe\xa9\x56\x03\x0b\x8c\xa4\xd6\xc9\x2d\xfb\x4d\x20\xb1\x58\x20\x01\xdb\xca\x1b\x1a\xf1\x78\x16\x2a\x57\xe2\x72\x6b\x37\xcb\x2d\x76\x82\xab\x68\x5b\x06\x5b\xd7\x2f\x3f\x21\xee\x5f\x57\xfe\xb1\x24\x3e\x75\x4f\x3b\xc6\xc4\xe6\x9b\xf5\xcd\xc5\x75\x93\x22\x9a\xaa\x2b\xe5\x55\x5b\xa7\x4d\x98\xc7\x62\x9c\xd0\x78\x32\xef\x60\x26\x66\x1b\x80\x2e\xe4\x11\xfb\xc9\x64\x4d\xe9\xdc\x67\xd3\x46\x1b\x92\x18\x4e\xe3\x44\x9c\x43\x9c\xd3\x80\x0e\x78\xc8\xb3\x39\x18\x07\x4d\x67\x61\xc6\xc1\xc9\x15\x31\xe9\xf0\x64\x03\x71\x79\xc4\x7f\x03\x93\x85\x06\x26\x9a\xd8\x19\x88\x4b\xa3\xd6\x9a\xf2\xe8\x17\xb4\x08\x79\xfc\xd8\x29\xd3\x2d\xdf\x7b\x68\x12\x58\xa0\xf3\x97\x16\x62\xa4\x31\x1d\xf2\x68\xdc\x99\x45\x1c\x52\xaf\xc4\x97\x4e\x36\x08\xef\x23\x46\xfb\x6c\xc4\x97\x15\xf9\x2e\xf6\xdb\x75\x42\x92\x8c\x5d\x66\x5a\x52\xe2\xe5\xb0\x50\xd9\x34\x8a\xe9\x27\x94\x5b\xc8\x49\xc3\xe6\xce\xd8\xd1\xf7\x9d\xc6\x40\x5c\xee\xa4\x13\x1a\x88\x8b\xc6\xa9\x1b\xec\x2f\x30\xa9\x27\x8a\x08\xf5\xb7\x4e\x3a\x11\x49\x66\x6c\x3e\xfe\x3f\x7b\xef\xde\xdd\xc6\x8d\x24\x8a\xff\xef\x4f\x81\xcc\x66\x4d\x32\x26\x29\x52\x96\xfc\x90\xc7\x93\x75\xe4\x64\xe2\xbd\xf1\x38\xc7\x72\x26\x77\x7f\xbe\x3e\x16\xd8\x0d\x92\x88\x9a\x8d\xde\xee\xa6\x44\x25\xf6\x77\xff\x1d\x14\xde\xe8\x07\x9b\x14\x29\x4b\x32\x67\xf7\xc4\x22\x1a\x28\xbc\x0a\x85\x42\x3d\x75\xda\x91\xfb\x47\x53\x76\xee\xe4\x83\x41\x88\x0f\xfb\x25\x09\x98\x4e\x68\xe1\x24\x15\x02\x6f\x81\xb7\x04\x5c\xcd\x62\x19\x49\xcb\x8d\x54\x6a\x67\xfe\x38\x16\xeb\x22\x93\x93\xba\x94\xac\x3f\xc6\x21\xe9\xb4\x6b\xd6\x0c\x0d\xfa\xc3\x7d\x4b\xfd\xd9\xfa\xaf\x19\x09\x29\x46\x6d\x18\xf4\x11\xe2\x03\xeb\xb4\xdc\xe8\x84\x85\xbe\x5b\xb0\x1e\x09\x4e\x39\x0f\xa8\x2b\x5a\x7a\xcf\xd6\xfd\x6f\x35\x07\xb8\x1e\xac\x7b\xf6\xbf\x6a\x75\x43\x12\x67\x56\x42\x93\x3a\x1c\xec\xa1\x61\x3d\x1e\xba\x38\x68\xf0\xfe\xd1\x41\x19\xde\x6b\xac\x1c\xb3\x38\x17\xa6\x99\x85\x23\x9b\x2c\xde\xb1\xb7\x64\xd6\x2e\x7c\x50\x6d\xf8\xa0\x1c\x19\x65\xc4\xe9\x55\x21\xcd\x8c\x9b\x14\xc9\xe4\x55\xf2\x13\x5e\xe1\x88\x4e\xe2\x57\x39\x99\x95\x65\xc3\xfa\x63\x9e\xe5\x74\x7c\x79\xcc\xe2\x5c\x84\xba\xd2\x3c\xb4\xd5\xff\x38\xc2\xf9\xea\xc2\xc9\x5a\x4c\xbf\x02\x9e\x3a\x7d\xf8\x78\xba\xfc\x84\x6c\x12\x93\x5d\xec\x33\x8b\xb5\x86\xe4\x7c\x5b\xab\xe5\xf5\x72\x33\xd7\x6b\xf3\x22\xfe\x6d\x2d\xe7\x2a\x43\xb8\x79\x6b\x0d\x53\x7c\x25\x4e\x78\x61\xad\x4b\x8f\x7e\x8a\x69\xb6\x54\x2f\x52\xbf\x28\x93\x94\x5c\xbe\x7f\x68\x6f\x4a\x61\x0a\x15\x0d\xba\x16\x33\x02\xb7\xaf\x26\xe1\xf0\x2b\x7b\xbf\x6f\x11\x99\x6f\x9d\xf4\xd4\xde\x85\x52\x09\xe1\xd1\x07\xb5\x4e\x16\xc6\x08\x45\x54\x33\x00\x4f\x4a\x00\x94\x5f\x6a\x95\x20\xcc\x44\x97\x2e\x0d\xdc\xd1\x21\x3d\xa7\x21\x49\x4b\x06\xde\x00\xd5\x8b\x4b\xdd\x7f\x31\x1c\x0c\xb6\x8e\xa5\x15\x5b\x7c\x45\xae\xa0\x7a\x75\x6c\xe3\xaa\xe5\x53\x6a\x36\xa9\x35\xa6\x65\x0e\x62\xc5\x91\xf4\xb0\xf6\x08\xfd\xe5\x9c\xbc\x66\xd7\xee\x1a\x84\x71\xc9\x4c\xd6\xbf\xc8\xcb\xe1\x3c\x1e\xd8\x58\x7e\x2d\x38\x56\x50\x94\x56\xee\x81\x58\xea\x46\x97\x76\xfd\x4a\xbb\x97\x6d\xd3\xb5\xbe\x0a\x23\x50\x09\xe9\xe0\xda\xcf\x74\x89\x25\xc0\x92\x15\xdf\xae\x66\x3f\xbc\xb2\x52\x7f\x8c\x47\xa6\x71\x4d\xba\x45\xfd\xc0\x18\x14\xdf\x09\xba\x48\x25\x87\xd4\x4f\x63\x9d\x1c\xf2\xd1\xd2\x7b\xee\xd1\x87\x35\x6f\xa7\xe1\xfe\x07\x77\xf9\xb7\x69\x2b\x20\x25\x15\xfc\xc1\x6c\xa9\x00\x94\x34\xdf\xd1\x06\x68\x1d\xc0\xc6\xec\x02\x02\xf1\x82\x51\x6a\x66\x4b\x9a\xf1\x65\xcd\x01\x2c\x85\xd6\xfa\x0d\x8f\xbe\x94\xea\xaa\xd2\x93\x6f\x67\x8b\xb0\xaa\x2d\xc2\x7a\xa7\xa3\x6c\x06\x4a\x9a\xcf\xf9\x05\x11\xac\x7c\x4a\x40\x74\x88\x62\x8e\x37\xa2\xea\x8f\x14\x8c\x01\x30\x12\x2b\xc1\x77\x43\xc4\x53\x7f\xf9\xe6\xb5\xce\x30\xc6\x78\x05\xdb\x17\x52\x75\xa2\x94\x63\xa0\xda\x41\x34\x43\x18\x9d\x8a\x23\x75\x6a\xcf\x5b\x47\xc8\x5e\xed\x50\x39\x42\xda\x35\xcf\x96\x0d\x63\x33\x08\x6f\x41\x2c\x1a\xde\xf0\x15\xc8\x66\x38\x8a\x48\xaa\x89\x7b\x17\xd1\x90\xe0\x48\x6e\x01\x84\x6a\x83\x90\xf3\x01\x4e\x43\x69\xfa\x6d\xe1\xbd\x14\x4a\x35\x76\xff\xf5\xbc\x92\xc5\xea\xa3\x0b\x1a\x45\x68\x44\xf4\xe5\x66\xc1\xd7\xd7\xdd\xba\x5d\xf8\xfe\xcc\xd2\x29\xb7\xbc\x4b\x74\x2a\x7f\x0b\xcb\xe9\x53\x34\x9b\x67\x39\xc2\x51\xc6\x78\x5d\x0e\xb5\x30\x34\x60\x71\x45\xf5\xf5\x07\xe9\xa4\xc7\x58\xbe\x1c\x57\xe9\x0e\x80\xf3\x43\x33\x8e\x98\x70\xfa\x96\x59\x3d\xe4\x5e\x70\x72\x47\xe3\x89\xe9\x13\xf8\x85\xc6\x3d\xf1\x73\xf6\xdb\xdb\x5f\xf8\xc9\x8c\x68\x7c\xc6\xff\x95\x84\x46\xef\x36\xcd\x10\xe4\x32\xd0\x8b\xfe\x6a\x8c\x74\x34\x5e\x1c\xa3\x53\x7c\xaa\xcf\xb2\x5a\x0a\xa0\x0a\x38\x2b\x23\x0a\x7c\x8c\xd3\x94\x8c\xaf\xe2\x1d\x6f\xe3\x21\x5f\x1b\xc1\xc9\x15\xd7\x42\x09\x0e\x1a\x2f\x87\x4f\xe3\xf9\x99\x6c\x92\x4f\xd8\xe8\xc4\x84\xaa\xcc\x37\xcb\xb2\x5c\x8f\x74\xb8\xa7\x2f\x6f\xaa\x05\xd4\x40\x7f\x82\x5f\x96\x24\x17\x70\xd9\x7c\x95\x05\x5e\x05\xeb\x38\xf9\x55\xad\x4f\x5a\x20\x8d\x47\xba\xd6\x18\x8f\xb4\x9b\xb2\xd8\x3e\xed\x08\x0c\x3f\xaf\xcf\x9e\xac\x8b\x5a\x30\x77\xdf\x16\xa4\x38\x0f\x5e\x3a\xc6\x23\x70\x74\x84\x41\x3a\xb6\x68\xe3\x08\xe7\xe8\x39\xfa\x46\x4e\xe7\xfe\x7d\xf4\xcd\x18\x8f\x9e\xad\x64\xa9\xb6\x19\x77\x43\x61\xd5\x06\xa1\x9c\xd7\x6b\x2f\x76\x40\x6d\xcc\xa7\x4f\x7c\xe7\xd6\x03\xc5\xb7\x79\xfd\xd6\xb6\xac\x50\x59\xd1\x3d\xf7\xac\xe8\xd6\x19\x94\xd1\x25\x74\xc5\xb6\xdd\xbf\x6f\x43\x57\x0c\xd1\xfa\xd0\xc5\x3b\xbe\x14\xb8\x64\xb1\xd6\x87\xad\xde\xa1\xa5\xd0\x35\xdb\x76\x95\x9d\xd7\x6b\xf3\xcd\xc6\x17\xc7\x16\x73\x94\xc3\xbf\xd2\xfa\xb8\x6f\xfa\xf2\x0e\xae\xb8\x44\x82\x4e\x0a\xe2\xb9\x26\x04\x45\x4b\x35\x99\x6d\xe2\xb3\xdb\xdc\x34\xd4\xb6\xea\x70\x7d\x54\x97\xa4\x9c\x29\x35\x17\xf5\x6e\x84\x23\xe4\x5f\x05\x63\x9b\xa5\xfa\xa6\x9a\xfa\x7b\x52\xc6\x63\xaf\x33\x92\xf5\xbd\x1a\x52\x0c\xe2\x98\xa5\x36\x72\x81\x75\xdd\x5f\x8b\x66\xb0\x24\xeb\x83\x3a\xd3\x08\x7c\x2d\x6b\x57\xe1\x90\x2a\x6c\x5e\xc5\x42\xde\x64\xab\xd7\xf5\x5e\x74\x5e\x57\xcb\x9f\x05\x7e\x83\x26\x7c\xbe\xd7\x66\x19\x63\x5a\xde\x45\x53\x7e\xdd\x6b\xdd\x80\xf3\x2b\xef\x6f\xf5\xae\x1a\xf0\x88\x37\xc5\xa0\xf8\xce\xc8\x81\xbe\x36\x6b\xe6\xf5\x4e\x79\xf3\x41\x48\x19\x4a\xab\x7b\xe7\x84\x28\x4d\xd7\x40\xbd\x00\x6a\xce\x7d\x63\x50\xe6\x0d\xb1\x39\x68\xee\x2b\x64\x73\x70\x37\x09\x52\x3c\x8d\x36\x00\x68\x9a\x92\xf1\xa6\x4e\x98\x7c\xa8\x6d\x64\x5c\x1c\xbb\x1a\x8c\xcb\x76\x17\x90\x1c\x44\x8d\xc3\x80\x3e\xdb\xe6\x22\xd6\x41\xbc\xcc\x3d\xab\x8b\xe0\x1a\xf5\x2b\x38\xb7\xa4\xfe\xa8\x2e\x41\xbf\x76\xa1\xa2\xb8\xc2\x5a\x42\xac\x22\x3c\x17\xae\xea\xa1\x20\xe6\x0d\x3e\x0a\xe2\xcf\x2d\x79\x29\x5c\x2d\xeb\xde\x96\xe2\xfa\x1e\xe3\x34\xac\x32\xea\x3f\x04\xa3\xf0\x25\x1d\x59\x04\x9f\xf7\x42\xe2\xf9\x4c\xa4\xb6\x32\x89\x1d\x27\x24\x3f\x72\x82\xa3\xb7\xbd\x70\xe8\x55\xc6\xdc\x7c\x70\x1d\xb5\x79\x56\x56\x23\x3d\x72\x69\x87\x57\x65\x37\x2f\x92\x09\x2d\x9b\x80\x05\x68\x5b\x93\x90\xe0\x6b\xe7\x22\x5c\xbf\xab\xec\xf3\x0f\x0f\x1f\x37\x9d\x8b\x04\xb4\xad\xb9\x48\xf0\xb5\x73\x79\x0d\xca\xf1\xaa\x99\x34\xde\x15\x00\xb3\xad\x79\x00\xf0\xda\x59\xfc\x4c\x70\x58\x99\xe7\xf0\x10\xf2\x30\x36\x9a\x86\x80\xb3\xad\x79\x08\xe8\x65\x13\xd9\xba\xf7\x83\x47\xe0\xae\x96\xbc\xf3\x4b\xbb\x61\x7d\x29\x57\xab\xad\x7a\x37\xdd\x28\x3f\xae\xad\x78\x4f\xfd\x8a\x93\xea\x33\x7a\xe0\x56\xab\x83\x0a\x15\xae\xe7\xd4\x94\x3b\x9b\xc1\x00\xae\x6e\xdc\xb1\x95\x18\xcf\xa0\xa2\xdd\x84\x0e\xcb\x53\x41\x71\xfa\xe5\x2b\xa0\xb6\xa2\x62\xf1\x74\x20\x8d\x04\x94\x12\x67\xb4\x58\xb2\xda\x77\x9d\x44\xe4\x5c\xba\xa0\xc8\xd1\x7f\x8f\x9e\xa0\x23\xb4\x6f\x44\x82\x42\x48\xc7\xe7\xbb\x9e\x88\xae\xde\xed\x7f\x2d\x31\x52\x53\xcc\xb8\xf7\xb9\xe9\xdb\x44\x3e\x24\x60\x96\x25\xcf\x08\x87\xc9\xaf\x60\xdd\x79\xdb\xed\xb0\xdf\x9b\x4c\xd1\xbc\x73\x12\xfe\xda\x6e\xae\x5d\x4c\xb2\x26\x2e\xc0\x30\xab\x9f\x6b\x03\x93\x3d\x7e\xf2\x75\x3b\xe6\x56\x7b\xbd\x02\x89\xb4\x82\x8e\x69\x83\xd7\x7d\x6d\xa0\x2b\x5d\xd6\xc6\x11\x51\x3e\x76\x8e\xb7\x9a\xc8\x07\x20\xbf\x68\x2b\xdb\xd6\x7e\xb2\x40\x07\xc9\xa2\x75\x4f\x5a\xea\x0a\xb3\x9c\x13\xe1\xb6\xa7\x7a\x9b\xe1\x74\x42\xe3\x23\xd4\x1a\xe8\xba\xab\xda\xbd\x36\x35\x36\xf5\x2c\xe8\x76\xe1\xa7\x6e\x8c\xc9\x67\x19\xdb\x27\x2d\xf3\x50\xc8\x50\xcc\x72\x91\xe4\x90\xa3\x16\x2f\xc5\x91\xc4\x9b\x82\x21\xd9\x0b\x17\xc7\x56\x63\x09\xa5\x88\xc1\xe7\x0c\xcb\x40\xfb\xa6\x3c\xce\x47\x5f\x65\x7a\x65\xfb\xa5\x6a\xdb\xa5\x75\x19\xd3\xb2\x61\x83\x6e\x64\x99\x4d\xd0\x4a\xac\x2c\x0c\xb2\x15\xd2\xf3\x15\xa2\x30\x35\x08\xaf\x0d\xb6\x3b\xba\x49\xc7\x57\x80\x97\xee\xd7\xf7\x66\x37\x8e\xac\xd4\xb2\x3f\xab\xf0\x54\x11\x8b\x89\xca\x88\xc9\x57\x50\xeb\xde\x3b\x56\x02\x58\x35\x02\x87\x92\x19\x5d\xb8\x85\x43\x5f\x46\x21\xbe\xf2\x21\xb8\x29\x6a\xd7\x5d\x1c\xa7\x6a\xfd\x93\x7f\x46\xeb\xb5\x34\xb6\x66\xc5\xc6\xc7\x92\x77\x51\x39\xb6\xd4\xbd\x92\x56\x53\x70\xd8\x42\x61\xf4\xb9\xd3\xb6\xa5\xb8\xdb\x79\x6b\x3d\xd9\xbd\xb5\x76\x6f\xad\xaf\xf9\xad\x85\xd3\x58\x66\xfb\x28\x1b\xfa\x81\x5f\xb1\xf6\x99\x25\xaa\x5c\xd7\x3b\xee\x26\xbd\xcc\x6e\x66\x74\x22\xff\x9d\x66\xfc\x3c\x45\x04\x93\x56\x00\x7e\xa8\x5d\xef\xe3\x5b\x92\x10\x2c\xa2\x47\xf7\x52\xf8\xbb\x50\xe5\x57\xa6\x02\xee\xa8\xa7\x9c\x7a\xb2\xf1\xfe\x40\x61\xa5\x3a\x75\x82\x9a\x38\x8f\x35\x70\x4c\xd5\x62\x65\x48\x7e\xdc\x3a\xa7\x21\x61\x60\x7c\x33\x0f\x29\xfc\x91\xd0\x20\x9f\xa7\x60\x26\x4e\xc7\xa9\x34\x32\xa7\xb3\x49\xeb\xc3\x06\xde\x7c\xb7\xf2\xe9\x33\xc3\x13\xc2\x87\x25\xdc\x63\xf8\x4b\x5b\x38\x86\x60\x6b\x83\x10\xe5\xb5\x5c\x97\xb1\x53\x28\x3b\x45\x2c\x45\xa7\x59\x1a\x9c\xc2\x0b\x41\xb8\xf7\x8c\x08\xca\x12\x12\xd0\x31\xd5\x1e\x29\xff\x62\xb9\xcc\xca\x1d\x48\xef\x28\x5e\x51\xd4\xba\x94\x4f\x7e\xc1\x44\x5f\xd0\x8c\x88\xb0\xcd\x30\x32\x90\xbe\xf3\x07\xd8\x88\xa0\x73\x91\x72\xc6\x2c\x1b\x54\x59\x69\xba\x2f\x62\x84\x23\x8a\x33\xf0\xc6\x52\x53\x48\xe4\xb5\x23\xc7\xfa\xe2\x1c\xd3\x48\xe4\x4e\x8f\xa3\x4b\x91\x97\x5f\xb8\x3d\xfb\x5b\x87\x5e\x7b\xc5\x47\xe8\x14\x70\xee\xb4\x8b\x4e\x01\xe7\xf8\x1f\x12\xe7\xf8\x9f\x02\xe7\xe0\xaf\xd9\xc4\xf2\x91\xcb\xd2\x60\xa5\x69\xf8\x7b\x2f\x73\xba\xac\x80\x3d\x46\x01\xc3\x57\x42\xa4\xf1\xe2\xa4\xdb\xda\xe9\x3b\xee\xbc\x57\xf2\x00\x87\xed\x6c\xe4\x19\x74\xe5\x87\xb3\xc0\x6e\xf5\x19\x7e\xa9\x4f\x82\x62\xa8\x4f\xf0\x4b\x7f\x4a\x03\xf3\x21\x0d\x54\xb1\xde\x4c\xd7\xd1\x48\x95\x5e\xd9\x51\xa7\xc2\x39\x07\x46\xcd\xff\x80\x31\xc2\x1f\x69\xd0\x72\xcc\x15\xd5\x73\x7d\x25\x85\x8f\xe2\x0e\xcc\x50\x7e\x60\x2c\x22\x38\x6e\x8b\x55\xfb\xf4\x89\x2f\x44\xa7\x8b\x5a\xaf\x55\xd4\xe8\xdf\x5e\x1d\x21\x52\x43\x98\xf8\xf1\x2e\x21\x4e\x2d\xfe\x54\x51\x59\xed\x55\xa2\xfb\xec\xb5\x73\x95\xa0\xe7\xfe\xdd\xd2\xa7\x71\x48\x16\x6f\xc6\x6d\x67\xdd\x3b\x30\x9f\xde\x50\xbb\x13\xf1\x8f\x19\x09\x4f\xe4\x76\x7e\x53\x00\x7c\xff\xbe\x44\x83\xef\xab\x25\x13\x86\x08\xbf\x12\xc4\xae\x35\x4f\xa3\x76\x0b\x3d\x90\x4d\x1f\xa0\x56\x07\x22\x43\xc3\x1e\xf0\xe9\xc0\x1f\xfe\x20\x9a\x25\x10\xdb\xa4\x6f\x53\x61\xba\x6b\xba\x8b\x28\x0e\xa0\x5b\xd8\x98\x6a\x97\x8c\x15\xdc\x31\x9c\x2d\xac\xd6\x75\xde\xf3\x9d\x2f\xfc\x75\x15\x67\x4c\xd2\x61\x67\xeb\xe5\x17\x4e\xe1\x0b\x18\xf0\x3d\xb2\x31\x1a\x1d\x99\x27\xd7\x3d\x54\xa6\x44\x85\xe6\x5f\xca\xd9\xe1\x66\xdc\x04\x6b\x59\xc8\x57\xb4\x6f\x6c\x28\xbf\xdd\x9b\xe8\x2e\x9a\xcd\xab\xbb\x61\x23\xc0\xc4\xb5\xb2\x19\x50\xf2\xaa\xda\xcc\xaa\xdd\x6d\xb3\x7c\x5f\x96\x27\xa8\x4f\xa9\xa1\xb4\xa6\x0d\x20\x6d\xdf\x98\xf8\x4e\x58\x42\x2a\xe1\x9d\x30\x5d\xdc\x8e\xe8\xee\xe9\x4e\x74\xb7\x13\xdd\x5d\x45\x74\x57\x61\xde\x66\x99\x41\xdf\x7a\xe9\xde\x35\x58\x52\xbc\xd3\x71\x6e\xab\xd0\x66\x50\x52\xb7\xae\x13\x53\x6b\x75\x13\x7a\xbf\x76\x5d\x3f\xb6\xbd\xfb\x0d\x93\x27\xde\x14\x4b\x8f\xf5\x52\xd0\x95\xda\x7f\x94\x5b\x80\xd8\x51\xd9\xf0\x39\xce\xb1\x95\x66\x8d\x37\x06\x33\x8f\x01\xc2\xf3\x9c\x99\x58\xcd\xa0\xc8\x7f\x2b\x6c\x4e\xca\x23\x8c\xdb\x60\x03\x15\x02\xd9\x83\x3b\x44\x43\x01\xd7\xae\x9c\xd3\x9c\x3f\x07\x54\xac\xc6\x6c\x3e\x9a\x82\xd5\x3a\x2f\x5a\x2b\xc4\x5a\xa5\xa9\xc9\x0b\x98\xad\x0e\xf3\x04\xee\x2d\xc2\x42\xde\xc8\x72\xd4\x8a\xdc\x62\xdd\xea\xed\x37\x35\x69\x66\x17\x64\x61\xca\x9d\xd9\xad\x92\x99\x03\x9a\xbe\xe3\x87\xc4\x4c\x5d\x9e\x99\x5b\x3c\xed\x12\xc1\xa2\x38\x8a\xbe\x64\x51\x1c\x48\x2d\xaf\x13\x3f\x37\x1b\x5b\x48\x23\x92\x11\x1b\xaa\x12\x9d\xf0\x80\x2f\xb8\xfe\x0c\xbf\xae\x2a\x30\x14\x33\xa9\x8b\xeb\xa3\x47\xc1\x7f\x40\x9f\x6b\x24\x8d\xab\x30\xc8\x31\x01\x39\xf6\xf6\xd0\x8b\xf0\x8f\x79\x96\xcf\x40\x25\x04\xfa\x87\x90\x24\x9c\x54\x30\x11\x41\x2b\x49\x49\x46\xe2\x00\x72\x45\xe2\x58\xee\x88\x1c\x04\x0c\x4b\x2a\xe1\xe4\x56\x7d\x8f\x5a\x23\x16\x5e\xee\xb7\xd0\x11\x6a\xf1\x09\x44\x34\x26\x2d\x25\x6c\xd3\x93\xaa\x69\xc4\xff\x1a\xb6\x56\x0d\x17\x62\xf3\x20\xcd\xe2\x85\x54\x25\x93\x77\x2c\x95\xe4\x00\xef\xdf\x6f\x18\xb4\xc3\x58\x52\x55\xc4\xec\x90\x00\x75\xd0\x0e\xbd\x9e\x08\xad\x14\x1d\x64\x69\x47\x8a\x90\xe8\x9e\x1a\x26\xde\xb7\x99\x46\x77\x21\x45\x57\xc2\xcf\x56\xef\x7c\xd7\x79\xda\xca\xf4\xfa\x25\xc3\x11\x67\xc8\x0a\x4e\x0d\x05\xf2\x57\x67\xb3\x63\xd4\x7f\x29\xaf\x60\x07\xed\xec\x80\xd6\xc5\xb1\x3b\x1f\x85\x73\xb3\x8e\xc7\xeb\x7e\x2d\xce\x51\x77\xa3\xab\x59\xf3\xf5\x3f\x76\xbc\x30\x2d\x86\x08\x7e\x19\xe9\xe5\x1d\xe0\x7d\xee\x8c\x68\xd0\xa6\xfd\xb7\x78\x3f\x1a\x87\x24\x80\xdb\xed\xb6\x4f\xd5\x96\x05\x6e\x42\xb2\x27\x9d\x83\x95\x68\x4f\x7a\xf3\x6e\x45\xb6\xf7\x68\x70\xc7\x65\x7b\x5b\x95\xb4\x7d\xe5\x49\x18\xef\x84\x59\xde\x35\x08\xee\xa6\xb5\xde\x4f\xfb\x07\x5f\xb7\x4c\xec\x56\x1b\xfe\x5d\x55\x6c\x37\x8a\x58\x70\xe6\xc9\xdb\x8e\xd0\xc0\x16\x94\xc9\xca\x07\x25\x79\xd0\xd4\x27\xa7\xe2\xc3\xea\x8a\x0f\x9d\x8a\xfb\xd5\x15\x5d\xf7\xb2\x61\x75\xc5\x61\x57\xfa\xa5\x89\xe7\x5e\x49\x45\xf5\xc9\x91\xfa\x15\x6a\x59\x4f\x6b\xc9\x02\x59\xe9\xe6\xac\x7a\xe6\xa3\x34\x94\xe4\x8f\xc7\x92\x7a\x50\x6e\xaa\x94\xcd\x00\xca\xa5\xe0\x12\x27\x4e\x0e\x42\x53\x49\x7e\x91\x90\x20\x14\x50\x19\x28\x91\x42\xd2\x78\xdf\xfd\x42\xc6\xd6\x76\xe7\x64\x91\xbf\xe0\xc5\x47\xa8\x15\x91\xb1\x9b\x1e\x0a\xea\x1f\x83\x8c\xb6\xbc\x45\x99\xfc\x96\x7f\x92\x62\xd9\xb2\x26\x29\xff\x54\x6c\xf1\xdf\x22\x53\x5d\x79\x1b\x99\xc6\xce\x69\x15\xb3\xdf\x53\x9c\x98\xfa\xec\x9c\xa4\xe3\x88\x5d\xf0\x07\xbe\xc8\xbf\xde\xb5\x20\xbd\x31\x5f\x49\x14\xd1\x24\xa3\x99\xfe\x7e\x31\xa5\x39\x39\x49\x70\x40\xc0\xda\xf5\x22\xc5\x89\xd3\xd3\x64\x9e\xe7\x24\xfd\x81\xe5\x39\x9b\x99\xfe\xc4\x79\x50\xa5\xad\x41\xff\xe1\x21\x99\x39\xed\x12\x9c\x62\xd8\x84\xaa\x46\x4d\xa4\xd6\xab\x66\xf4\x82\x6f\xab\x67\xf3\x2b\x80\x38\x51\xcf\xcb\x25\x40\x20\x29\x93\x7e\x8b\x16\xc0\xac\x9a\x2a\xef\x60\x30\x28\xc0\xf8\x31\x4d\x59\xba\x04\x04\x64\x17\xb7\x9a\xaf\x25\xa5\xaf\xa1\xdf\x76\xc4\x40\x49\xd8\x64\x20\x6b\xa0\x5d\xd6\xdf\xfb\xd6\xdf\x43\xfe\xb7\x16\x37\x59\x6f\x8a\x96\xa1\x15\x22\x01\x69\x28\xda\x09\x29\x13\x7f\xbc\x89\xb3\x0d\x65\x22\xde\xd7\x55\x52\xa9\x60\x71\x8e\x96\x4c\xcc\x8a\x7f\x08\x94\xa0\x6b\x3c\x74\xd5\xb1\xed\x9a\xb3\x28\x72\x4d\xdd\x09\xcf\xaf\xbb\xa2\x9d\xd8\x72\xe6\x90\x1f\x2e\x75\xe2\x90\x0b\x82\x66\x38\x11\xb9\x54\xf8\xa1\xc9\x19\xc2\x68\xc2\x58\xa8\x6b\x28\xac\x2f\xf5\x9e\xbe\x21\x26\x69\x5b\xcf\x2c\xf2\x65\x53\xd2\x94\xc7\x33\xb5\xe4\x86\x76\x70\x53\x20\xa0\x2d\x2b\x3e\x9e\x9f\x9c\xc6\xf3\xb5\xe6\x74\x5f\x18\xf9\x0b\x0f\x6b\x34\x82\x4b\xad\xe0\x5f\xed\x5e\x9e\x35\x3e\x88\x6e\x6f\xbf\x13\x84\x53\x82\xc8\x2c\xa1\x29\x0d\x70\x14\x5d\x72\x84\x4b\xf4\x6a\xf1\xdd\xd3\xf6\xc1\x80\x7d\x29\x8e\x27\xa0\x0e\x08\xe9\x78\x4c\x52\x8e\xc5\x36\x46\xf3\x16\x12\x8f\x7f\x62\x29\xa2\x71\x96\xe3\x38\x20\x5d\x34\x1d\xf2\xf6\xd3\x47\x7d\x3e\xc3\x4b\x36\x47\x17\x34\x9b\xc2\x09\x9f\x02\x44\xb9\x0b\xd0\x77\x17\x2a\x04\x38\xe6\x7d\x9f\xd3\x90\xf0\xdf\x29\x62\x17\xb1\x72\x41\x88\x72\x92\xc6\x38\xa7\xe7\x24\xba\x34\xb5\xe7\xd2\x35\xe2\x54\xef\xbf\xef\xbc\x00\xb9\x3b\xe4\x91\x79\x2d\x3a\x5b\x82\x9c\x7f\x7d\x6e\xba\x41\x31\xcb\x11\x67\x6a\xba\x9c\x49\x84\x99\x13\x2c\xc3\x23\xe5\xe9\x3c\x0e\x30\x47\x38\x9a\x4f\x11\x8e\x91\x62\x8e\xcc\xa8\x14\x9f\xd5\x78\xeb\xd6\x44\x14\x8b\x5b\x6a\xdc\xd5\x0b\xa0\xc7\x99\x75\x80\x0c\xe3\x2b\x5f\x3d\x96\x82\xb2\x2e\x9a\xf4\x17\xbf\xdc\x3d\xe5\xa3\x51\x25\x34\x71\x6b\x80\xfb\xdd\xe8\x23\xf9\xaf\x4d\xa7\x3a\x69\xe4\xa8\x50\x93\x11\xc5\xa6\x03\xba\x86\x5d\x68\xf2\xe6\x39\xa7\x40\xd7\xf5\xca\x55\x75\x81\x9e\xba\x96\xf8\xa9\x3e\x6a\x9c\xd2\xdf\x75\x89\x7e\x1c\x08\x9e\x4f\x2a\x51\x2d\x45\xcc\xda\x3a\x54\xbe\xfa\xf5\xa9\x51\x8c\xf1\xa9\xc9\x93\x62\x2f\x85\x8d\x58\x72\xba\xbc\x48\xcc\x0d\xc8\xb9\x9a\x45\x4b\x85\xce\xdd\x88\x12\x96\x64\xef\x39\xb0\x0f\x5d\xb4\x11\x87\x82\xf7\x72\x76\xe8\x81\x68\x3c\x55\x31\x13\x70\x42\x73\x1c\xd1\x3f\xc9\x4f\x34\xcd\xf2\x5f\xf8\x8d\x97\x76\xda\x50\xb9\xf3\x41\x25\x23\xf9\x86\xdf\xef\xea\x32\x5a\xcf\x07\x41\x22\x83\xc4\x91\xf5\x60\x38\x28\xea\x60\xf1\x7a\xf0\x0c\x02\x1a\xec\x5c\x0b\x92\xc2\xb4\x86\xab\x0b\x95\xf9\xea\x0a\x5a\xf1\x8d\x97\xea\x65\x69\x8e\x0c\x8e\x58\xb6\x6b\x8d\x4b\x11\x3e\x7d\x42\x6d\x73\xd8\xbe\x47\xad\xa4\x85\x8e\xfc\xa3\x2c\x90\xab\xc3\x2b\x0b\xb5\xe6\x1a\xde\x1e\x35\x51\xed\xea\x15\xe7\x42\x9d\x69\xc8\xea\x97\x51\x67\xae\x7c\xc5\xaf\x92\x11\xe1\x8b\xdf\x61\xbe\xee\x76\xf7\xea\xfc\x2a\xf4\xc2\x77\xdc\x9b\x62\x93\xd9\x26\xae\xfa\x24\x6b\x3a\x1c\x8f\x9b\xd8\x44\xe2\x80\x02\x3f\xb2\x8c\x74\x35\x85\xac\xd9\x9a\x0d\x8c\xd2\x66\x8c\xb6\x9e\x95\xe0\x8b\xd3\x5b\x4f\xbd\x6f\x5d\x6e\x25\xbe\x3e\x92\x1a\x1b\x14\xac\x48\x94\xe0\x3e\xd8\x75\x22\x83\xc2\xcd\xf5\x97\xa7\x00\x6a\x4d\x87\x2d\x5f\xd7\x53\x28\xdb\x2f\x29\x1b\xda\x65\x46\x59\x63\xca\xa4\x5e\xa6\x35\xdd\x6f\x15\xb5\x30\xad\xe9\xc3\x96\xa3\x6e\x69\xe1\x8c\x86\xa4\xe5\xe8\x57\x5a\x89\x8e\x4c\xa1\x9e\xb3\x7a\x62\xd6\xbb\xb3\x90\xb5\x01\x16\x7f\x23\x4e\x51\x66\x6f\xc0\x74\xc2\x71\x6e\xd8\x86\xe9\xc4\xf0\x46\x26\x6f\x98\x92\xe0\x6c\xc4\x16\x55\x06\x01\x8f\xf6\xbf\x74\x02\x07\x39\xc0\x1b\x10\x9d\xfe\xd1\xfe\x1d\x37\x7e\xd9\x39\xb6\xdd\x5e\xe3\x97\xeb\x30\x4c\x39\xb9\xa0\x79\x30\xfd\x01\x67\x95\x26\x15\x4f\x1e\x96\x54\xae\xeb\xc5\xd4\xd2\x0d\x5f\xc5\x21\xc9\x49\x3a\xa3\x31\xce\x09\x1c\xff\x1f\xaa\xe9\xd3\xe3\x41\x7d\xbb\xba\xbe\x4b\x1b\x7c\xdd\xc6\x35\x57\xb7\x5c\xd1\xb3\x5d\x57\x45\xcd\xf7\x81\x84\x6b\xea\xc9\x4d\x0a\xa9\xda\xe6\x22\xe8\xa7\x4e\x4d\x5a\xa6\x9f\x76\x70\x1d\x18\x0b\x0b\xa1\x0d\x63\x71\x05\x0d\x70\x65\xc8\x5c\x2d\xd2\xa1\x99\x5a\x0e\x3b\xcc\xb1\x5c\x9f\x3a\x0e\x98\xf7\xda\x7e\x5f\x27\xb3\xaf\x7f\x66\xfa\x8a\xa6\x77\x53\x82\x68\xc0\x62\x94\x33\xc5\x22\x9a\xcc\xe9\xd5\xe3\xe5\x33\xd3\x4a\x4d\x9a\x29\x0d\x4d\xd8\x45\xb4\x98\x3d\x1d\xa3\x31\x8b\x73\x14\xd1\x09\xce\xe7\x29\x29\xcc\xf8\x55\xc0\x6e\xb7\x70\xe1\xf6\xab\xb4\x7d\x28\xf2\x14\x1c\x2f\x41\xc9\xa5\xfa\xa8\x0c\x4e\x96\xc6\x08\x75\x2c\x0b\x11\xa1\xaf\xd0\x45\x2a\xb2\xb6\x93\xf1\x98\x04\xf9\xf2\x9e\x1a\x24\x46\x5d\xf7\x84\xcc\xe3\x2d\x9c\x11\x7a\xb7\x0e\x47\x25\x45\xc4\x49\x42\x70\x9a\x21\x6a\x5f\xdd\xd6\x32\xd8\xc5\x5b\xd9\xbd\x92\x8e\x37\xb4\x83\x36\xe0\x3b\x46\xeb\x0c\x3f\x6c\xd3\x36\xd0\xbe\xd3\x38\x99\xe7\xa7\xca\x24\xc0\x5e\x8e\x44\xf0\xd1\xab\xd1\xb9\xdf\x32\x69\x1d\x60\x1b\x22\x24\x38\xe3\x0b\x9f\x92\x31\x44\x4c\x1c\xe1\xe0\x4c\xf5\x2f\xec\x02\x44\x6f\x65\x66\x31\xf0\xe1\x2d\x19\x57\x0e\x82\xaf\xb5\x1c\x42\x39\x8d\x8c\x57\x25\xb2\xc7\x6a\x88\x63\x88\xab\xa4\xd1\x30\xcb\x71\x4e\xc4\x15\x8b\xe3\x89\x22\x1f\xb2\xd3\x04\xa7\x78\x86\xfe\x12\x4b\xf2\x19\x91\x73\x8e\xae\x1c\xab\xc5\x5f\x19\x9b\xa7\xc2\x31\x53\xc4\xe4\x17\x3d\xb8\x6d\x47\x22\x2e\xdc\x67\x75\xdf\x42\xf3\x53\xf9\xe3\x54\xbc\x26\x15\x04\x41\xb0\xf5\x1c\x59\x7c\x0c\x63\x6a\xb2\x4a\x15\xcb\x94\xe3\x11\x67\xc7\x17\x57\xe0\x6b\xe2\xf9\x6c\x44\xd2\x35\x38\x1b\x67\x6a\x25\x48\x20\x1f\xd2\xb5\x70\x7d\x47\x65\x29\xb5\xf0\x2d\x05\x2c\x5e\xc6\xca\x24\xa0\xcb\x74\x44\x43\xfb\x3b\xb5\x3f\xd8\x54\xc2\xd4\xb0\x4b\x4b\xab\x3a\x1d\x16\xbe\x5c\x39\xa8\xa1\x99\x01\xc4\x32\x54\xff\xda\xfd\x14\x0a\xa0\xf6\x4a\x29\x08\x0c\x03\xbe\x2c\xb8\x9c\xcd\x31\xba\x4b\xf6\x7d\xc9\xba\x1c\xa1\xc2\x16\xd0\xc6\x4d\x79\xcd\x92\x00\x73\x72\xff\xbf\x50\x7c\xb9\xeb\x7a\x23\xdc\x1d\xe6\xfc\xce\x68\xfe\x5c\x9e\xfc\x06\xe7\xf8\xde\x64\x2e\x6e\x49\x71\x6e\x31\xfe\x35\x9e\xa9\x47\x53\x37\xb1\x78\x05\xaa\xfc\x95\xac\xa4\xe2\x30\x37\x75\x96\x15\xb3\x58\x0d\x8f\x2f\x4f\x63\x1d\xec\x06\x89\x82\x62\xd0\x36\x33\x32\xc5\xab\x2d\x51\xc3\x6e\x82\x59\x6b\x3a\x24\x60\xd1\x56\x4c\x56\xaf\xef\xe8\x12\xcd\xac\xf7\x90\xd4\x5a\xc8\x92\x57\xda\x92\x0c\xa0\xe5\x52\x69\x93\x11\x34\x9e\x47\x51\x67\x33\x41\x1e\xe5\x7c\x84\x23\xb8\x52\x9b\x6d\x47\x97\xf9\xf0\x8e\x6b\xc2\x76\x6e\xe0\xdb\xd5\x84\xa1\xbd\x3d\x84\x2e\x08\x3e\xab\x8a\xf5\xf8\x03\x18\x54\x70\x5e\x7f\xe7\x31\xbe\x5c\x31\x67\x56\xab\x0a\x61\x0f\x4b\xea\xd6\x75\x62\x6a\xad\xe4\x96\x2e\x14\x71\xe2\xb1\x59\x56\xeb\xa9\x5b\xab\x56\x3b\x17\xb0\x98\x57\x2e\xed\xec\x70\x97\x2f\xb4\x89\x52\x8f\x1f\xb3\x1f\xe3\x6c\x9e\x12\x74\x7c\x72\xa2\x82\xf5\x07\x34\xbf\xbc\xb7\x1d\x4f\xf5\x12\x47\x64\x25\x5c\xa8\x0a\x1a\x39\x66\x71\x2e\xb2\xde\x14\xfc\xa4\x93\xc5\x3b\xf6\x96\xcc\x38\x6e\x69\xc7\x60\x91\xb4\xa6\xd4\x4d\xf7\x91\xf1\x57\xa8\x09\x41\xf9\xc8\x78\x22\xc8\xec\xa6\x03\x55\x32\x62\x69\x48\xd2\xb7\x38\xa4\xf3\xec\x08\xb5\x0e\x07\xff\xd9\xea\x36\x50\x23\xf2\x7f\xce\xb5\xdc\x25\x4f\x71\xac\x72\xf0\xc8\x19\xe9\x92\x4c\x72\x07\xed\x96\xc9\x45\xd0\x53\x76\x8a\x26\x1a\x55\x38\x4f\x71\x15\x00\xf5\xad\x9f\x4d\x59\x9a\x93\x2c\x97\xad\x3e\x77\xae\xec\xe8\xbb\x5f\xe2\xe8\x7b\xcc\xe2\x3c\xc5\xd9\x32\x28\x13\x92\xab\x9a\xef\xc8\x22\x6f\x57\x6b\x6b\x8b\xc3\xdc\x80\x67\xf4\x4a\xee\xd8\x57\xd1\x11\x0b\x08\x11\x3f\xa0\xa6\xb9\x93\x48\x49\xa1\x41\x93\x50\xab\xb6\xdd\x1f\xff\x9f\xb4\xa8\x3e\x56\x71\x51\x4b\x87\x2f\x44\x53\x85\xbe\xc9\xac\xe5\xa3\x3f\x14\xda\x4d\xcf\xc8\xe5\x88\xe1\x34\xfc\x89\x05\xf3\xcc\x5e\x00\x83\x8d\xc7\x95\xda\xfa\x90\x9e\x53\x15\x94\x6c\x83\x11\x57\xd7\x94\xd8\x0b\x83\xcb\x32\x69\xad\xf8\xd2\x50\x66\xef\xeb\x7f\x1c\x3d\xc4\x6a\x8a\x9d\x58\x40\xa8\x54\x62\xdf\x01\xf3\xf8\xdb\xaf\xc1\xfe\xb2\xde\xbf\xc6\x4c\xb2\xc2\xea\x3c\x90\x34\xd4\x32\x3a\x5f\xe2\xf3\x2b\xcf\xc1\x35\xa8\xce\x37\xaf\x33\x5f\xf5\xe8\x83\xdb\x7c\xc9\x89\xe7\xe5\xcb\xce\xbb\xd0\xcf\x40\xd7\xdf\xa1\xb7\x64\x4c\x52\x05\xf5\x3d\x67\x34\xb3\x0f\xed\x3d\x40\xdd\x3d\x7e\x88\xb3\x0e\xca\x88\xe0\x7e\x24\x9a\x84\x2c\x98\x73\xc2\x00\x57\x2f\x07\x91\x92\x09\x4e\x43\x85\x2b\x58\xa7\x39\x03\x1a\xc0\x12\x71\x57\xdf\xe3\xe3\xd3\x8c\x14\xef\x47\xb0\xd5\x4d\xfc\x47\x35\x19\xd3\x6a\x1b\x5d\xa2\x79\x92\xed\xe7\xa4\xae\xf1\x1e\x55\x78\xe0\xa7\xcf\x0e\x55\x05\xb9\x2d\xfa\xbb\xfc\x7d\x55\x65\x93\x5e\x86\x46\x39\xae\x6d\x7f\x4e\x4b\x8c\xdd\x92\x83\x59\x23\x07\xb6\xfd\x80\x6a\x16\x3f\xd6\x5f\xee\xe6\x89\xb1\xef\x86\xcf\xa7\x46\x0c\x8d\x33\x35\xe9\xa6\x34\xe6\xc1\xeb\x41\xd1\x14\x65\x46\x5e\xc2\xc5\x1c\x17\xc3\xab\x7a\x35\x7c\x8c\x3d\x42\x1e\x53\x27\x70\xd1\x70\xe0\x9a\xa0\x14\x8e\x5c\xca\x4b\xe5\x67\xd1\x78\xa5\x58\xbc\x4e\xe4\xd8\xd2\x60\xbc\xc0\x5a\x9a\x68\xb0\x92\x59\x30\x27\x9d\xef\x86\xb8\xd8\x38\x1f\xd0\x34\x0a\x2e\xbc\xb5\xcb\x62\xf4\x96\x8c\x00\x28\x98\x15\x8e\x56\xf5\x2d\x0b\x3a\xa8\x28\xf2\x54\xc9\xd6\xfb\x33\x9c\x58\x29\xd6\x35\xe5\x13\x65\x1d\xeb\x85\x43\xc7\xa8\x5d\xcc\xdc\x4e\xb3\xd7\x73\x2a\x47\x2f\x73\xb5\xf3\x13\xaf\xf4\xca\x27\xe7\x13\xa9\x34\xee\x38\xa1\x7b\xab\xce\x6e\xc4\x62\xbd\x16\x12\x98\xdd\x6c\xc5\x13\x09\x6a\x78\xb1\x1a\x7d\x8f\x5a\x76\x2c\xa8\x9f\x3b\xcf\xf4\xaf\xcf\xf7\xee\x79\x63\x84\xe6\xcf\xdc\x27\x9b\x89\xec\x6b\x6e\x88\x2f\xa3\x37\x6e\xca\x3a\xdf\x11\x76\xf6\xce\xe8\x7c\x1b\x7a\x3a\xae\xc7\x7e\xde\x19\x25\xb1\xba\xf2\x97\xe9\xc0\x6c\x1d\x91\x75\x22\x4b\x73\x75\x15\x7d\xf5\xcc\x25\xa3\x95\x46\x1e\x7f\xbc\xb9\xac\xfc\x66\x74\xa0\xf3\x31\x3f\xb7\xa4\xf5\x39\xb8\xe3\x5a\x9f\x9d\xff\xd3\xed\xf5\x7f\xba\x03\xaa\x9c\xaf\x51\x43\xb1\xed\x80\xb9\x34\x8e\x68\x4c\x7a\x6e\xdc\xdc\x31\x8d\xa2\x23\xd4\x0a\xe6\x69\x4a\xe2\xfc\x58\xdc\x9e\x9e\xf0\x74\xff\xc0\x53\x39\x98\x82\x79\x46\xd2\x13\x12\x91\x40\xa4\xe2\x8f\x89\xa3\xe3\x38\x99\xa6\x34\x3e\xb3\xb4\x0a\xcd\x14\x02\x7c\x4c\xeb\x2a\x01\x52\x4f\x07\xb0\x39\xe9\xac\x64\x9f\x33\x10\xcb\x90\x10\xd1\x58\x4a\x4d\x4e\xfe\xfd\x4f\x10\x68\xdc\x00\x09\xe7\x5a\x59\x6c\xfd\x86\x8d\xd3\xd7\x6e\x9a\x09\x75\x58\xf0\xdb\x2e\x5e\xfd\x55\x48\xc8\x33\x84\xd1\x74\x3e\xc3\x71\x2f\x25\x38\x04\xb9\x98\xc8\xea\xa2\x02\x60\xea\x08\x80\x53\x9c\x43\x22\x2b\x4c\xe3\x0c\x51\x25\x77\x9f\xe6\x79\x92\x1d\xed\xed\x5d\x5c\x5c\xf4\x2f\x1e\xf6\x59\x3a\xd9\x7b\xf7\x76\xef\xe4\xdf\xff\xec\x71\xae\x34\xcb\xf6\xfe\xe3\xc7\xff\x9d\xd3\x73\x1c\x91\x38\xbf\xe7\x24\xbb\x7a\x01\xdf\x57\x1a\xf3\x8b\x28\x62\x17\x19\xc4\x05\xcc\x19\x4a\x89\xb8\xaa\xd1\x05\x1f\x9a\x90\x10\xb3\x34\x04\xeb\x9d\x0c\x42\xf2\xb1\x79\x8e\xe6\x31\xcd\x33\x34\x23\x38\x46\x34\xce\x68\x48\x10\x8e\x51\x76\x3e\xf1\xf4\x07\x3f\xb1\x14\x91\x05\x9e\x25\x9c\x3f\xa2\x63\x7d\x70\xd4\xf4\x69\x86\x0e\x07\x03\xd4\x06\x0a\xd3\x41\xa3\x4b\xb4\xcf\x7f\x0a\x12\x24\x04\x0b\xdf\x21\x1c\x87\x30\x38\x10\x8c\x9e\x53\x72\xf1\x03\x5b\x3c\xff\xdb\x00\x0d\xd0\xe1\x00\xed\x0f\xfe\x26\xab\xe5\x53\x2a\x46\x24\x73\x33\xf9\x43\x97\xe3\x04\x24\x3a\x9f\x08\x69\xee\x84\xa1\x71\xca\x66\x42\xdc\xcd\x12\x14\x91\x31\xdf\x8e\x34\x26\x29\xe7\x44\x07\x1d\x09\x9a\xa9\x00\x81\x10\xfb\x07\xb5\x0f\x07\xdd\xfd\x41\x07\x46\x46\x70\x30\x85\xe5\xd0\xf2\xe1\x0b\x96\xe6\x53\x34\x1c\x24\x0b\xcb\x82\x5e\x0c\x7b\x35\x1b\x7a\xf9\xdc\x2f\x9a\xd0\x6f\x5d\xea\x69\xa1\x92\x9b\xcc\x4b\x94\xa9\x6a\x72\x56\xba\x8a\xfc\x7d\x75\x6b\xfa\xe5\x32\x4d\x6b\x34\xfc\xa7\xec\x79\x0d\x69\x66\x2b\x3b\x9f\xb4\xb6\x25\xbe\x2c\x4a\xf5\xc6\x2c\x98\x67\x22\x32\x44\x0b\xde\x41\x2d\x6f\x31\x8f\x90\xb7\x8a\x2d\x9c\x52\xdc\x93\xe1\xc3\x8f\x9c\xad\xf9\x5e\xc1\x40\x47\xa8\xc5\xd9\xfc\x96\x23\xcf\xeb\x58\xa1\x4a\x74\x8b\x66\x72\x3a\x19\x02\x46\xfe\x8c\xe7\x51\x54\x82\x1a\xf7\x94\x38\xcc\x7c\xb7\x64\x65\x42\xa2\x23\x71\xf8\x4b\xb9\x01\xec\x6e\xe4\xab\xdd\xc8\x77\x46\x42\xe4\xd2\x8b\x8d\x80\x54\x34\x67\x35\xa3\x5b\x75\x20\x4a\xa4\x29\x9a\x02\x80\x8d\xd0\xfe\x01\xda\x3f\x10\x81\x7e\x54\x9b\xd9\x9c\x4a\xba\xad\x45\xc1\x1b\x10\xa2\x28\x50\xe8\x73\xa7\x2d\xff\xde\x92\xf8\xe4\xf0\x26\x06\x00\xda\xca\x63\x3c\x99\xa7\x55\xaf\xc7\xfd\x27\x4e\xad\x3a\x98\xfc\xbb\x09\x27\x22\xb6\xa6\x0a\xea\xa1\x5f\xb1\x36\xe8\x88\xde\xe6\x6b\x09\x21\x74\xcf\xf0\xd7\xa8\x87\xa0\x9f\x18\x47\x8e\x26\xfb\xbb\x3d\x2d\x25\xe1\xe3\xae\xbd\xa4\x5a\x09\xce\xa7\xfc\xa9\x88\x42\x8e\xc1\xc3\xa7\xe8\xf0\x7c\x78\xf0\xf3\xe1\xbf\x0f\xa7\xc3\x83\xd9\xa0\xb7\xff\xf3\x61\xd0\x1b\xf6\x87\x68\xd0\xdb\x47\xfd\xa7\xbd\x7d\xb4\x7f\x3e\x3c\x08\x06\x68\xd8\x1f\xf6\x9f\xa2\x7d\xfe\x7f\xd3\xe1\x41\x00\x55\xd0\x7e\x8f\x97\xf5\xf6\xff\x7d\x18\x0c\x78\xab\x1e\x6f\xc1\xff\xef\xcf\x16\xd2\x58\xa2\xec\xd6\xdf\xcc\x73\xfe\x9c\xfe\x21\xc2\xf1\x99\xfd\x38\x2f\xfb\x6e\xf3\x6d\x2b\x68\x57\xd5\xf6\xb9\xda\x2a\xc1\x1c\x29\x4d\xdb\x58\xde\xaf\xd2\x86\xbf\x38\x30\xa0\x00\x80\x5e\xe6\xec\x97\x55\xed\x94\x43\x68\x4c\x69\xca\x1a\x3f\x2b\x9c\xfb\x47\x5f\x52\x6c\xaa\x06\x6d\xe1\xeb\x73\xa0\x01\xab\x11\x80\x8c\xe4\x2f\x85\x50\x45\x2e\x4c\xf9\xd9\x7e\x5a\xd1\xa0\xee\x34\xba\x35\x8d\x04\x2d\xc5\xc9\xf2\x2e\x1f\x1f\x54\x35\xa8\x95\xbb\xb9\x55\xaf\x85\x10\x98\x0e\xe0\x76\x3f\xc6\x51\x04\xe8\xd3\x36\x71\xef\x8f\x59\x9c\xe5\xe9\x3c\xc8\x59\xca\xfb\xa2\x63\xd4\xfe\x46\x7f\xd6\xf1\xf1\xd9\xd8\xa9\xc8\x6b\xe6\xd3\x94\x5d\xa0\x98\x5c\x20\xce\xd0\x40\x72\x96\xf6\xdf\x8e\x71\x1c\xb3\x1c\xac\x68\x10\x16\x1c\xa4\x8c\x40\x20\x47\xf2\xb7\xce\x33\xf4\xd9\x1d\x5a\xc2\xb2\x8c\x8e\x22\x62\x75\xf0\x16\x66\xdc\xce\x48\x34\xee\x02\x30\x3d\x34\x5e\xe4\xf6\x0e\x86\x35\x24\x0e\xd4\x10\xe0\x51\x3a\xc5\x59\xdc\xca\xd1\x88\x10\xfe\x5a\xa6\x39\xc5\x11\xcd\x48\x88\x7a\x28\x9b\x27\x24\x6d\x77\x9c\x1a\xbc\x07\x12\x8a\xa1\x29\xa5\x29\x9f\xc1\xfd\xfb\xa8\xad\xb4\xe1\xfc\x37\xe7\x4f\xff\x26\xb8\xaa\xbf\xa1\x4f\x9f\x50\xe1\x9b\x99\x25\xfa\x5e\x14\x1f\x21\x3e\x62\x6f\x33\xa4\x26\x2c\x6b\x67\xf3\x11\x98\x12\x74\xc5\xb0\xe0\x6f\x35\x55\x09\xdc\x7c\x10\xfc\xba\xee\x82\x8f\xce\xfb\x08\x7e\x3d\x55\x5b\x73\xc2\xeb\xf2\xa3\x9f\x92\x2c\xe3\xc3\x98\xcd\xb3\x1c\x11\x91\x06\x64\x44\xa0\xb1\x48\xf8\xa1\xba\xe8\x42\xca\x80\xbf\xa1\x07\xa8\x30\x16\x58\x2a\x35\x7a\xfe\xd2\xc8\x99\x8c\xa0\x2e\x59\x04\x29\x62\xb4\x06\xe8\x0c\xd7\x34\xe1\x77\x4a\x60\x76\x9e\x23\xb2\x64\x1a\xcc\xe2\xd8\xc1\xfd\x84\x86\x0b\x5d\xa4\x34\xb7\xa2\xfd\x71\x10\x63\x3a\x99\x5b\x11\x00\x39\x9a\x75\x9e\xc1\x52\xda\x8b\x2b\xc7\x97\x11\xce\x07\x8a\x21\xbc\x19\xa3\xef\xcb\xcb\x2b\x36\xc8\x8c\xad\xff\xf1\x23\xcc\xe4\xe3\x47\xf4\xdc\xaa\xa2\x25\xdf\xd9\x94\xcd\xa3\xf0\xb7\x24\x14\xae\xf3\x46\xb2\x6c\x95\xb7\x73\x92\xe5\xce\x9d\x65\x8c\x18\x7e\xc0\x19\xd1\x0e\x2a\xca\x02\x81\x03\x1e\x63\xbe\x5a\x97\xea\xde\x01\x82\x2a\x17\xfd\x27\xf1\xa9\xe3\x35\x7e\x76\x4f\x37\x3e\xa9\x18\x55\xfb\x63\xa1\x2f\x64\x61\xab\xdd\xac\x8b\x3e\x16\x40\x23\x03\xc9\xae\xda\xb6\x2d\x27\x7c\x42\xc4\x4f\x6b\xd7\xa9\x6e\xa0\x99\x3b\xbc\x9a\x44\x88\xf6\x66\x2c\x7d\x9c\x24\xd1\xa5\x2c\xc6\xe9\x04\x2c\xe8\xb2\x8e\x36\x90\xd0\xe6\x11\x76\x97\x06\x1b\xfb\x62\x63\x34\xb8\xaa\x9d\xf3\x2a\xb4\x63\xb2\x10\xef\x0a\x7b\xae\x72\xf4\x7c\x7b\x61\x40\x7d\x29\x6e\x31\x95\xf5\xa8\x9e\x2d\x19\x56\x4a\x62\x91\x04\x5e\x8f\x43\x94\xb4\x4b\xfa\x93\xa8\x61\x75\x59\xd2\x8f\xac\x6b\x77\x27\x2a\x7d\x96\x7c\x75\xbf\xb0\xbd\xfc\x24\x55\xca\x11\x5a\x46\x8e\xd0\x32\x63\x92\xbd\x00\x8a\x7a\x97\xb3\x61\x92\xc4\xd3\xc9\xbb\x48\xcd\x67\x07\x8b\xbb\xa8\x65\x1f\x9d\x56\xa7\xd3\xf6\x70\x47\x29\x23\x2a\xa7\x28\xb5\x14\x45\xc6\x2a\x73\x2a\x6e\xe3\x31\xf6\x78\xa3\x8f\xb1\x1a\x2e\x0b\x48\x0f\xc9\x4f\x72\x9c\xd3\xc0\xc1\x5e\x55\xd8\x3e\x23\x97\x5d\x41\x69\x57\x21\x3d\x7b\xdf\x21\x92\x45\x34\xce\x7b\xd2\xc0\x00\xc5\xac\x07\xc1\x5c\x7a\x29\xc1\x59\x46\x27\xb1\x90\xbe\x22\xe4\xb4\x7f\x7f\x46\x2e\x3f\xa0\xe7\xa2\xc3\x67\x1e\x28\x12\xd7\x43\x92\x43\x73\x00\xd6\xef\xa4\x9a\x65\x91\x2f\x7e\x72\x5d\x5b\x20\x39\xd2\x29\x8e\x22\x76\xf1\xe3\xff\xce\x71\x54\xc5\xef\x0e\x4d\xfc\x4a\xbb\x7a\x2d\xfb\x6a\xd5\xbb\x16\x46\xb2\xb8\xc6\xee\x58\x4d\xa0\x5c\x7f\xc1\x9f\xee\x04\x10\x3b\x01\xc4\x36\x04\x10\x0f\xa5\xc8\xa1\x5c\xe6\xf0\xc4\x15\x3a\x94\x4b\x1d\x9e\x28\xb1\xc3\xac\xf7\x14\x0d\x0f\xa2\xde\x61\xef\x10\x0d\xfb\x07\xc3\x1e\xff\xcf\x2f\xc3\x01\x1a\x1e\xf4\x87\x8f\xa3\xc7\xfd\xc3\xa7\x3d\xfe\x9f\x5f\x86\x4f\xd1\x93\xa8\xf7\x14\x3d\x2d\x93\x54\x94\x49\x27\xae\x55\x22\xb1\x44\x0a\x61\x49\x1e\x56\x96\x36\x14\x0e\xf6\xe3\x4d\x66\x65\xdf\x1d\xec\xdd\xc1\x2e\x1c\xec\xab\xca\x12\x67\xbd\x7d\x34\x1c\xfc\xfc\xf8\xbc\xb7\x3f\x1d\x0e\xce\x1d\xe1\x62\x55\xbc\x67\xe3\x38\x53\x56\xe1\x5a\x0e\x73\xd5\xd0\xca\x4e\x76\x55\x34\xe9\xd2\xf2\xc6\x67\xbe\xb4\x75\x91\x00\xdc\xd0\xdc\x02\x34\xa9\x8c\xdb\xfd\xe5\xf3\x0a\xd0\xe4\x06\xe4\x14\x78\xbc\xc9\x9c\x02\xbb\xd0\x28\xb7\x3c\x34\xca\xc4\x95\x84\x95\x0f\xe1\x49\x45\xf5\xba\x7b\xc9\xad\xe9\x5a\xc2\x6a\x01\x50\xd5\x9c\x9f\x56\xd4\xaf\x9b\xaa\x07\xd9\x40\x00\x9a\x0c\x82\xb9\xaa\xee\x86\x83\xb2\xda\xb5\x9d\x59\x40\x0d\x0f\x50\x25\xa7\xaa\xec\x77\xb8\xbc\x6d\xdd\x28\xaa\x3b\xd4\x70\x95\xf8\xae\x72\x08\xc5\xaa\x75\x3d\x6a\x70\xdb\xe5\xb9\xae\xc3\xb4\xfa\x8c\x5c\x06\xd5\x26\xc7\x8f\x0f\xfd\x8a\x75\xe0\x65\x95\x6b\x8d\xc0\x73\x8c\xe3\x80\x54\x89\x15\x0e\x1f\x3f\xf4\x2a\xd6\x41\x17\x35\xcc\x92\xb2\x88\xa5\xaf\x71\x4c\x93\x79\x84\x73\xf0\xc6\x2d\x47\x1d\xb3\x46\x2f\xce\x71\x8e\xab\x2a\xee\x3f\xf1\x2b\xd6\x0d\x46\xd4\xf8\xba\xad\xd3\x57\xcb\x51\x77\xe5\x71\x29\x38\x5b\x33\x9c\xe7\x0d\x85\x8d\x29\x7a\x8e\x1e\xee\x3f\x53\x1e\xe7\x6e\x10\x10\x9d\xa9\xd6\xc3\xbf\x3e\x99\x25\x53\x9c\xd1\x3f\x49\xc7\x0b\xf3\x62\x00\x98\xf0\x76\x83\x3e\xd0\x34\xd1\x43\x48\x22\x22\xc2\xe6\xd5\xf7\x30\xc6\x61\x01\x38\xc4\x20\x91\xbe\x6a\x1c\xec\xfe\xa3\x8e\x9d\xab\xb4\xcc\x0b\x60\xcc\xe2\xfc\x27\x3c\xa3\xd1\x65\x49\x6c\x21\xf3\x71\x85\x40\x44\xc3\x87\x9d\x55\xe2\xbb\x78\x11\x90\x0a\xe1\x5d\xbc\xef\xca\xf5\x40\xfc\x5b\x1b\x79\xc8\x8f\xb7\xe3\xed\x9d\x1e\x65\x21\xb0\x8b\x57\x50\x1e\xf9\x48\x22\xc7\x1e\xda\xd7\x3e\x10\x53\x9a\x93\x93\x04\x07\x04\x5c\x1e\x2e\x20\x3b\xa0\xeb\x1f\xd1\x1a\xd3\xbc\x17\x88\xb9\xb5\x56\xf2\x7d\xd0\xa3\xdd\xdb\x13\xa1\x75\x84\x2d\xb1\xbc\xdd\x84\x65\x33\xd8\x29\x0b\xab\xd2\x7c\x4a\x62\x74\x1a\x44\x34\x38\xe3\x6f\x81\x53\xa9\xda\x66\xe7\x24\x4d\xc1\xf8\x5c\x34\x60\x29\x1a\xb1\x7c\xaa\x56\x71\x9e\x66\x05\x5f\x3d\xfe\x3f\x26\x4c\x37\xb4\x27\x07\x1f\xc4\xbf\x98\x2a\x46\x10\xd1\x05\xbc\xc8\x8d\xd5\x76\x8c\x8e\xa7\x29\x9b\x11\xd4\xc6\x19\xca\x53\x3a\x99\x90\x94\x84\x68\x74\xa9\xa3\x98\xc3\x83\xb2\xe3\xac\xad\xd3\xc1\x5b\x32\x63\xe7\x04\x9d\x0a\x87\xdb\x53\x59\x45\xd6\x37\x71\xa9\xca\xaa\xca\xaf\xd2\xd2\x55\x58\x9d\xaa\xa5\x30\xa8\x6f\x1a\x4e\x52\x72\x89\xa6\x74\x32\x8d\xf8\x9e\xca\xcf\xbf\x93\xd1\x19\xcd\xdf\xe1\xe4\x67\xf5\xa1\x34\xee\x4f\xc0\x66\x33\x16\x8b\x2d\x4b\x70\x6a\x67\x15\x57\xcb\x99\x30\xea\xe0\x70\xeb\xfe\xd1\x94\xef\x44\x17\xdd\x3f\x82\x85\x6b\x1d\x59\x5a\xb1\x02\x3a\x2e\xa5\x30\x3e\xbe\xa2\x41\x7f\xf0\x44\xad\xec\x67\xab\x57\x11\x84\xcb\xed\x8d\x2d\x4e\xa6\x38\x64\x17\x3a\x12\x18\xfc\xca\xde\x0f\x3f\x74\x37\x3b\xa4\xe1\xbe\x1e\x92\xbd\x31\x40\xef\xdc\x8d\x69\x5d\xc7\xb2\xd8\x63\xc0\x70\x81\x9b\xde\x44\x8e\xff\xb7\x82\xd2\xf4\x7c\x27\xa7\x87\xfb\x3e\x31\x32\x25\x4d\xe8\xe3\xa3\x4e\xb1\xef\x63\x6d\x86\xec\x05\xad\x1a\x3e\xf5\x3b\x1b\x3e\xb5\x9b\x7b\x61\xb6\xd6\xa0\xb8\xf2\xb0\xfc\x42\xc6\x1c\xf8\xbe\x57\x2c\x17\xc1\x94\x57\x3b\x76\xd5\xd1\x3f\x7d\x16\x4a\x83\x8d\xe9\x2b\xef\x1a\x0f\xa7\xa8\xee\xdd\xb6\x4b\x8f\xae\x0e\x1b\xe6\x84\xe7\x13\xf8\x02\x46\xb9\x07\xc9\x02\x0d\x50\xef\x49\xb2\x28\x1c\x77\x07\x9d\x83\x3a\x24\x16\x77\xbb\x3f\x36\x34\xe8\x1f\x78\xe8\xbb\x39\x27\x36\xc9\x0e\x17\x72\x8c\xa8\xa3\xb1\x56\x82\xe4\xab\x26\x47\xde\x6c\x62\xe4\x3b\x10\x9a\xeb\x78\x9e\xe5\x6c\x26\xb1\x16\xe2\x28\xf5\xd1\xef\xd2\xa7\x28\x9b\xb2\x8b\x18\xb1\x38\xba\x44\x74\x8c\x4e\x59\xcc\xdf\x1e\x24\xcb\x5f\x42\xe5\x53\x44\x33\x94\x11\x6b\x67\xed\x53\x77\xf7\x76\x57\x04\x31\x03\x46\x4b\xc5\xa7\x02\x52\x69\xe6\x2f\x29\xe7\x2d\x8e\xcd\x51\x8f\x61\x2c\x3e\xe6\x3c\xcf\x15\xf2\xcd\xb0\xf8\xff\x90\xcb\x97\xec\xa2\x3a\x19\x7e\x11\x86\xc9\xcc\xa3\xde\x56\x5e\x8a\x1e\x0b\x77\x21\x51\x0f\x1f\xa3\x9d\xe7\x2b\x23\x82\x7d\x75\x2a\x5e\xd8\x38\xde\xb7\x06\xe8\xe0\xf8\xad\x48\xad\x03\xd4\x5a\xaa\xa5\x8e\xa7\x34\xc9\x50\x4a\x92\x94\x64\x1c\x51\x39\xb1\x89\xc8\x02\x91\x38\xa7\x90\x09\x8a\xc6\x28\x9b\x61\x3e\xf7\x88\x05\x67\x60\xd5\x17\x4c\x85\x81\x2a\x78\x84\x06\x96\xf6\x4a\x6a\x12\x2c\xe3\x38\x40\x9e\x6f\x3d\x9b\x18\xb8\x71\xb4\xe0\xcc\x56\xba\xd2\xa4\x8b\x0a\x6d\xe0\xfd\x68\x69\x89\x69\xd2\xb6\xcd\xfa\x64\xc8\x02\xfd\x33\x27\x33\x0e\x45\x5a\xb9\xa5\x24\x97\x1f\x8d\x37\x9c\x91\x8c\x9a\xbe\x45\x75\xd0\x36\xc8\xfa\xfc\x65\xd2\x06\x88\x11\x78\x31\x6a\xcb\xb8\x7e\x44\xe2\x49\x3e\x05\x5b\x39\x7e\x89\xbd\x48\x53\x7c\xd9\xe6\xb5\x3a\x5d\x10\x7c\xa1\xe7\x68\xf0\x4c\xfc\xf5\x77\x68\x2d\x7e\x3c\x78\x60\xac\xbc\x78\xd3\xf7\x1f\xa5\x85\x8f\x86\x2c\x4a\x94\x41\x96\xa3\x1e\x49\x09\xb8\xcc\xc0\xec\xc4\x1f\xfc\xf5\xa4\x54\x5c\x95\x72\x50\x7f\x82\xca\x59\x8d\x4f\xd4\x32\xc4\xfc\xf4\x49\x00\xf2\x24\xd5\xee\xd6\x74\x3a\x60\xc4\x25\xcd\x05\x85\x7b\xd1\x7b\x0e\xf6\x43\x3f\x60\x71\x80\xf3\x36\x9f\x55\x07\x72\xab\xf3\x62\xf5\x6f\x3f\x98\xd2\x44\x44\x98\x03\x17\x3c\x59\x3a\xc5\x71\x18\x91\x97\x86\xc3\xe0\xc7\xd0\xc1\x1e\x48\x8a\xd5\xb1\xf9\xb1\x93\x9c\x25\xc2\x33\x19\xf2\x65\xc1\x6b\x73\x34\x1f\x8d\x22\x1a\x4f\xd0\x3c\xd1\xe9\xca\xf8\x70\x4f\x65\x33\xa8\xda\xcf\x72\x96\x70\x22\x86\x27\xe0\x91\xdf\xd6\xf6\x7d\x7c\x87\xbd\x43\x8c\x9e\xcb\x21\x0a\x7f\x51\xef\xab\xb6\x07\xa4\x63\xd4\xf6\xbe\xd9\xa6\x85\xde\x27\x39\x9b\x67\x1e\xf3\xef\x2c\x86\xa4\x75\x75\x8b\x20\x50\x7c\x4a\xb3\x6f\x13\xc9\x43\x59\x43\x35\xcf\x25\x4d\x7b\x55\x85\x6f\xd5\x5c\xa0\xd4\xad\x58\x3a\xf9\x6f\x4b\x27\xef\x36\x34\xe3\x75\x9b\xc8\x72\xbd\x52\x7c\xd0\xe2\x5c\x00\x96\x29\xd9\xb0\x41\x2f\xb5\x36\xce\xca\x8a\xf1\xdf\xbf\x8f\xda\xd0\x16\x42\xaa\x71\xd6\xbe\xc5\xd1\x55\x17\x89\x97\x84\x13\x6a\x4c\xec\x78\x92\xc2\xbf\x4a\xee\x69\xc5\xfb\x92\xa0\xfd\x1d\x41\x24\xca\x48\xd9\xae\xf2\x31\xe8\xfe\xf8\xcd\x22\x86\xb1\x5a\x97\xb5\xc8\x60\xba\x36\xf3\xca\x82\x95\x7a\xe0\x8d\x9d\xe3\xe6\x06\x5f\x73\x3e\xf5\x47\xd1\x3c\x6d\x3b\x11\xd0\xd4\xbf\xce\x0e\xc8\x7d\x74\xb1\x5a\x16\x56\xe3\x33\x99\x25\xca\x39\xb1\x09\x61\xb2\x28\x75\x47\x28\x78\xd5\x15\x61\xab\x95\xfc\x5b\xe2\xbd\x18\xd2\x19\xe1\x0f\x4d\x61\xd8\x2b\x5f\x3b\x52\x55\x5a\x6d\xf5\xab\x8f\xd0\x3e\x7a\x0e\x42\x28\x07\x4f\x3f\xaa\x73\x55\x7e\xac\xc4\x63\x84\x53\x12\x8e\xf5\x02\xe1\x45\x99\x5d\xcb\xf8\xb6\x7f\x2c\x75\x6e\x47\xb6\xa3\xb6\x0b\xac\xe0\xe5\x8e\xd4\x13\xdb\xd4\x81\x9f\x15\x87\xbd\xe6\x9c\x5b\xc7\xd5\x3b\xa9\x4b\xe8\xc1\x52\x52\x60\x18\x79\x77\x32\xa6\xdc\xae\xad\x38\x1d\xb7\xae\x2a\x75\xc6\xb2\x9a\x6f\xfe\x47\xed\x9c\x2f\xb6\xa4\xce\x35\x1f\xd6\xb0\x25\x92\xee\xf0\xa5\x12\x7f\xca\xf5\x10\x3f\x9c\xe9\x42\x64\x52\x3d\x9d\x96\x9d\x5f\x47\xb9\xf3\x2b\x14\xb2\x43\x17\x34\x0e\x21\x5a\xeb\xcb\xfb\xd7\x67\x13\xa6\x53\x8b\x11\xbb\x6a\xdb\x97\xba\x02\xdb\xcd\xb5\xb0\xab\xeb\xef\xb4\x1d\xdf\x93\x03\xe9\x38\xe7\xc2\xcc\x5d\xde\xe3\xcf\xaa\xaf\x41\x4e\x30\x3d\x94\xb8\x7f\xbf\x60\xf7\x43\xb3\x7f\xe3\x88\x86\xca\xf0\xc7\x6d\xe0\x10\x74\xa7\xef\xda\xf8\x91\x2e\x10\x37\x90\xa4\x7e\x8d\x54\xb3\x1f\xa5\xe7\xb3\x49\x20\x05\x0b\xd1\xbd\x99\x57\x07\xa1\xfc\xdc\xe0\xea\x69\xbe\x0a\x6e\x3a\x23\xa9\xbe\x34\x0a\x9e\xd2\x18\xa2\xf6\xa8\x1b\xac\x8e\x3d\x62\x1b\x35\xb0\xd2\x63\xfa\x68\x61\x11\xcb\xe5\xfb\x6f\x2a\x3b\x7b\xbf\xb7\x87\xbe\xe5\xcf\xd0\x9f\xe8\xe2\x35\x41\x3d\xa1\x35\x88\x18\x3b\xcb\xa4\x41\x4d\x74\x89\x02\x96\xa6\x24\xc8\x85\xf3\x15\xa4\xd1\xb8\x98\x5e\x22\x9a\x23\x92\xa6\x2c\x15\x62\x13\x8b\x7a\x2f\x43\x22\x33\x12\x17\x81\x56\xc2\x08\x79\x29\x58\x17\x46\x01\x13\x1c\x6c\x93\xd2\xd7\xe3\xd5\xfb\x38\xd6\x91\x5c\x8b\x7d\xf9\x50\x4b\xb1\xcf\xde\x4b\xad\x1a\x79\xee\x90\x69\x87\x35\xfb\x46\x7d\xb1\xf7\xc9\x6a\xa8\xd0\xe5\xd3\xa7\xc2\x65\xf2\x3d\x1a\xa0\x23\xd4\x1b\x16\xfa\x6e\x6e\x1b\xc8\xff\xd7\x0a\xe9\x79\xcb\x2c\xdf\x92\x90\x28\x00\x9f\x41\x30\x13\xa1\x9e\x69\x55\x9c\xf3\xd2\xbb\xd7\xbc\xcb\x4b\x6f\x28\x75\x6c\xea\x6e\x5c\xe7\x50\xc9\x32\xb3\x11\x85\xb8\xc6\x48\x45\x30\xb6\x78\x98\x71\x3b\x66\x21\xe9\x78\x91\x71\x05\x1b\x63\x3f\xb0\x58\x48\x9e\x59\x55\x3e\x5b\xfb\xdd\xf5\x8e\x81\xf9\xdd\x70\xd5\xfd\xc8\xc8\xa8\x61\x74\x64\xa4\x38\x18\xfd\xdb\x1a\x8b\xa1\x41\xb2\xc8\x72\x48\xfa\xfc\x01\x7e\x48\xdc\xe0\x8c\xdf\xb3\x7b\xca\xd9\xca\x0a\x6b\x6c\x4b\x0a\xae\x9e\x9d\x8d\x26\x32\x33\x9b\x10\x05\x78\x76\x80\x9b\xcc\xa8\xb6\x33\xe1\xde\x99\x70\x4b\x13\xee\x7d\xb4\x7f\xfc\xa8\x7f\xf0\x18\x4c\xb5\xe5\x1f\xc3\xfd\xec\x80\xff\x35\x1c\xe8\xff\xef\xc9\x82\xde\x70\x70\x32\x7c\xdc\x3f\x7c\x08\xd5\xd0\xfe\x9f\xb3\x43\x34\x7c\x08\xde\x16\x87\xfd\xc3\xa7\x68\xf8\x98\x17\x0f\x1f\xf6\x0f\x86\xe8\x09\xff\xcf\xf0\x31\x7a\x8c\xe4\xb7\x01\xfc\x77\x1f\x3d\x16\x9f\xe0\x3f\xa2\xbe\xf8\x02\xb5\x1e\xf3\x26\xa2\x29\x40\xe1\x9f\x25\x04\xc7\x8f\x43\xd9\x53\x19\xf9\x1c\x94\x5c\x8f\x0f\x87\xea\xbc\xd4\x83\x43\x99\x67\x89\x3f\x9a\x7b\x6f\x40\xf5\xe2\xc1\xdf\x64\x50\xdd\x8d\x1d\xfc\x97\x14\x47\x6c\x52\x69\xce\x76\xf8\x85\x8d\xb7\xc5\xf0\xca\xcc\xb7\xad\xd1\xbf\x00\xb0\x55\x36\x7f\x87\x8f\x1f\x35\x99\x84\x03\x6a\x7b\x53\x91\x1d\x2c\x99\xd1\x3b\x08\xa2\x58\x35\x9f\xc7\xcd\xe7\xf3\x4e\xc4\x37\xdb\xd6\x6c\x00\xfc\x92\xb9\x48\x2b\xa8\xca\xd9\x3c\x69\x3e\x9b\x63\x65\x74\xb4\xad\xf9\xc8\x0e\x9a\xcd\xe8\x1d\x59\x54\xcf\xea\xe9\xca\xb3\xe2\xe0\xb6\x3e\x33\xde\x49\xe5\xec\x38\x8b\xf3\x9a\x8d\x68\x44\xea\xa9\xc2\x93\x41\x93\xc9\xf9\xd0\xb6\x31\x37\xbf\x8f\x9b\xe0\xe7\xb1\xc9\xe0\x5f\x37\x31\x76\xfa\xce\x2d\x64\xcb\xb1\xd3\x2b\x12\xe5\xbe\x66\x21\x8e\x6e\xbb\xf5\xff\x75\x58\xe8\x37\x4e\x5f\x0b\x2b\x5a\x69\x65\xff\xd8\xad\x57\x37\x08\xa8\xa0\xab\xff\x84\x2b\x6d\xd6\xf7\x1f\x3f\x71\xaa\xd5\x01\xe5\xdf\x75\x65\xcb\x98\xb6\x6a\xe1\xcc\xbc\x7e\xc5\x09\xa9\x72\x0a\x38\xf4\xaa\xd5\x8d\x00\x2a\xec\x3c\x02\x1a\xc0\xd3\xa7\xf4\x9d\x88\xc7\x54\x63\xc2\xb1\x1a\xe0\x77\x7a\xdf\xb5\x4d\x4a\x05\x66\x0d\x1a\x4f\xbe\x04\xe6\x06\x97\xc2\x40\x7f\x29\x63\xd7\x6f\x72\xc4\x1a\xe6\x97\x48\x36\xb0\xcc\xac\xbf\xcc\x40\x55\x2a\x35\xc5\x2b\x94\x9f\xa7\xa5\x66\xae\xca\x0e\xb3\x34\xa7\xf1\x81\x9d\x80\xe0\x25\x4d\x45\xf2\xc2\x23\xc8\x0c\x34\x9f\xc5\xc5\x1c\xcc\x43\x37\x07\x73\xc2\x94\x91\x7e\x2b\x25\x11\x64\x58\xb5\x3a\x5e\xfc\xac\x2c\x43\x9f\x0e\xce\xa7\xc6\x72\xfe\x9c\xa4\xe3\x88\x5d\xfc\x8f\x36\x19\x45\x7b\x7b\xe8\x27\xba\x40\xaf\x7e\x1c\x0e\x11\xcd\xb2\x39\xe9\x8a\x98\xea\x60\xec\x8a\x73\x94\xb1\x19\x41\x60\x77\xaa\x44\xe7\xa5\xf6\xd0\x9e\x4d\xbe\xa7\x09\x36\x8b\xf6\x3b\x0d\xf3\xe9\xff\xcd\x6c\xe3\xe6\xc5\xef\x76\x82\xe8\x51\x4a\xf0\x19\xf4\x97\xf5\x81\xa5\xc9\xfa\x8b\xac\x1c\xcc\xc9\x6c\x25\x30\xd9\xac\x1c\xcc\xeb\x70\x25\x30\x33\x27\xaf\xf0\x78\x1e\x45\xb2\x45\x69\x6e\x61\xbf\xee\x49\x90\x12\xdb\xae\x5a\xe1\xc8\xc0\x77\xcd\x70\x32\x13\x9b\x61\xb9\xe5\x26\x6d\xb0\x57\xfb\xe7\xd2\x0f\xae\xcb\xc8\xc0\xc8\x56\x37\x63\xb4\x2b\xdf\x1a\x26\x9b\xdc\x3c\x9b\xe3\x28\xba\x04\x3b\x1c\x1a\x07\xd1\x3c\x24\x21\xca\xe6\xa3\x5e\xa9\x19\xeb\x5d\xc8\x4f\x76\xfb\x6d\x7a\xad\x4c\xb2\x56\x86\x00\x8e\xba\xbd\x0c\x70\x57\xc3\xb7\xd1\x79\x9d\x44\xb5\xa0\xbc\x56\xe9\x58\xf9\xe5\x15\xa6\x2c\x11\x3d\xc6\x2c\x07\x43\x4d\x61\xc1\xa5\x15\x47\xc7\x11\xcb\xc8\xa9\x4e\x32\x6b\x96\x4b\xcc\xfc\x07\x09\xa3\xde\xd0\xb4\x76\x4c\x53\x9a\xe7\x7c\x48\x24\x0b\x70\x42\xae\x32\x98\x1f\x01\xc2\xff\x21\x97\xbf\x25\x2b\x0c\xe5\xdd\x94\xe8\x2c\x32\x3a\xf5\x86\x61\x19\xbb\x88\xc6\x68\x46\xa3\x88\x8a\x1c\xf0\x12\x63\xd0\xff\xb0\x39\x9a\xe1\x4b\x94\x25\x24\xa0\xe3\x4b\x84\x51\x46\xe3\x09\xe4\xf0\x98\x11\x36\xcf\x01\x14\x8e\x22\x0b\x54\xd6\x45\x2c\x45\x34\x86\x1c\xe1\xe2\x98\x72\x0e\x1c\x61\x60\xfb\x48\x60\x99\x66\xe7\x85\x4b\x7b\xd5\x33\x5a\xc6\x4a\xac\x79\x62\x4b\x40\x6d\xe6\xfc\x16\x01\x7b\xa7\xf9\xa5\x8c\xea\x21\x10\x61\x86\x17\x82\x56\xeb\x7c\xc3\x40\xfd\xfa\xd6\x3e\x0a\x72\x28\x2a\x4d\x52\x76\x21\x92\x91\x08\x22\x40\xff\x24\xaa\xa1\x38\x56\x5d\xa1\xcd\xd6\x79\x95\x69\x86\xe6\x40\x3e\x04\x40\xa6\xcc\x95\xb3\xb3\x9c\x9f\x92\x29\x49\x09\xe4\x18\x99\x81\xdf\x5f\x4c\x38\x65\xe5\x57\x75\xc0\xf8\xa7\x38\x47\x21\x1d\x8f\xc5\x5f\x62\x04\xd0\x25\x0e\x52\x96\x41\xe6\x94\x54\xc0\x05\x3a\x14\x88\xcc\x44\x7a\xc3\xcd\x75\xb3\x24\x3d\xe1\x02\x6c\x69\xb2\x19\xff\xef\x2c\x2c\x4b\x7c\x2d\x30\x92\x92\xb0\x8b\xb2\x3c\x25\x79\x30\x25\x99\x5a\x99\x9c\x99\x55\xec\x3b\x64\xa5\xbe\xf7\xe2\xb1\x31\x66\xde\xae\x75\xb7\xa6\x2a\xbe\x69\xb7\x30\xd7\x6e\x46\x30\xea\xac\xca\xa1\xbb\x11\x19\x33\x49\x1e\xe4\xcc\x80\x63\xcc\xec\xae\x7e\xe4\x25\xeb\x1f\x1b\xf3\x66\xb8\xf2\xb1\xd1\xa0\x36\x7d\x6c\x14\xe0\x4e\xb3\xbd\x91\x4b\x45\x33\xb1\x5a\x9c\x35\xf6\xd7\x0b\x5c\x2a\x77\x4b\xe6\x2f\xd9\x14\xcb\x35\x73\xb1\xf9\x47\x51\xb4\x5b\xb1\xcc\xac\x98\xbc\xc7\xcf\x08\x10\xd4\x94\x44\x04\x67\x24\x84\x34\x48\x40\xc4\x41\x6e\x44\xc1\xb3\x01\xde\x34\xce\x7a\x36\xb8\xc1\xd7\xa1\x0d\x0b\x9a\xbb\xfd\x2c\x68\xbe\xdb\xb4\x72\xca\xb0\xa0\xb9\x4f\x18\x44\xd1\x6e\xc1\x2a\xe8\xc2\x82\xe6\x1e\x59\x80\x92\xdd\x7a\x59\xeb\xa5\x5f\x5c\x28\x15\xbc\x7c\x06\x09\xd3\x08\x0a\x38\x4f\x2f\x57\x4f\x3e\xaa\x20\xa6\x2e\xfa\x4b\xf0\xc4\x9f\xa5\xb3\xc9\x3b\xed\x76\x92\xb1\x79\x1a\x68\x56\x4e\x3d\x06\xee\x15\x5c\xc2\xe0\xb5\xb0\x02\x19\xb1\xde\x24\x1c\xf0\x4b\x7d\x24\x58\x42\x6c\x97\xb3\x64\xa5\xd7\x97\x59\x31\xc7\x5a\xa5\xc0\xe7\xaf\x8a\x2d\x9e\xd4\x74\x4d\x44\x71\xa1\x6c\x06\x47\x1c\x98\xc2\xdb\x4d\x99\xf0\x88\x35\xcd\x10\x4e\x09\x08\xc6\x22\x4c\x43\x79\x23\x80\x70\x08\x8d\xe0\xae\x30\xcf\x73\xf9\x40\xd2\x5c\xa5\xb0\xf3\xd1\x12\x48\x01\xcf\xcf\x7d\xf7\x51\x3f\xc3\x85\x6f\xc1\xf9\xf5\xe4\xc3\x33\x8f\x73\x5d\xc7\x14\xa9\x4a\x25\xcf\x66\x5d\xbb\xe4\x9b\xdb\xcc\xba\x1e\xbd\x46\xd6\x97\x62\x50\x11\x4b\x96\x2c\x6d\xfd\x0b\x9f\x7c\xa9\x97\xae\xaa\x0a\xec\x49\xba\x35\x74\x89\x96\x78\x26\xd6\x0a\xf0\x1f\xfa\x43\x5c\x3e\x6f\xaf\xdc\x54\x2f\x9b\xaf\x53\x6a\x55\xe5\x9c\x98\x5d\x89\xff\xf6\x3e\xd3\x78\xe2\xd7\x00\x59\x8c\x53\x89\x84\x7e\x1d\x91\x26\x4e\x56\x59\xd0\xdc\xfe\xbe\xa0\xb9\xfb\xd1\xeb\x43\x94\xb8\x55\xdc\x1e\xa0\xc0\x54\xb0\x69\x97\x55\xcd\x2e\x56\x95\x0d\x65\x91\x9e\x1c\xfe\xe6\x5e\x47\x8a\x45\x83\xe1\x90\x30\xbf\x88\xc1\xa6\xd8\xda\x37\xf0\xdf\x28\x20\x21\x3c\x69\x25\xbe\x29\xd8\xfa\x07\x47\x24\xe1\x17\x52\x00\xef\xa0\x84\x2c\x10\xba\x05\xfd\x27\x8d\x27\xd6\x2f\x48\xbf\xdf\x12\x8b\x6f\xfe\x32\x75\x60\x4f\x1c\x27\x14\x58\x78\x77\xd4\x6b\xa4\x91\x94\xca\x50\xd7\xbc\xee\x3a\x12\x4a\xaa\x25\x2b\x0a\x5c\x8e\x4a\xe8\x44\x0d\xad\x3a\x2a\x2b\xac\x24\x52\x47\xc5\xa2\x0a\x5a\x70\xe4\x17\x94\x12\x81\x23\x54\x71\xfa\xdd\x1b\xbf\xfc\xb8\x64\x53\x76\x71\x04\xc4\x49\x2a\x08\x9c\xfc\x97\x8d\x6c\xb0\xdd\x13\xa7\x00\x1b\x8d\x0c\x4e\x12\x02\xa1\x32\xa4\x69\x8e\xf8\x5f\x8b\xc6\x2d\xd1\xb1\x29\x93\x42\xc2\xba\xd5\xb7\x44\x18\x1e\x39\x73\x1f\xeb\x45\x4a\xe6\xbc\x4c\x0b\x44\xcc\xbc\x7f\x5c\xfa\xe5\x70\xfa\x05\xd2\x65\xb3\xb5\xea\x2f\xa5\x71\x52\x75\x1a\xda\xb1\x4b\xdd\xb9\x7b\x0a\xdc\x85\x44\x88\x44\xe4\x5c\x22\xa8\x49\x29\xbe\xf2\x79\x00\xa6\x42\x3b\x5f\xbd\x6f\x19\x0d\x54\x0b\x3d\x10\xed\xa5\xc1\x43\x3f\xc0\x09\xcd\x71\x44\xff\x24\x3f\xd1\x34\xcb\x7f\x21\x79\x4e\xd2\x4e\x5b\xd1\xa3\xce\x87\x2e\x6a\x5b\x8c\x05\x7a\x8e\xfe\x5a\x9e\xf6\xd2\xd4\x37\x1e\x60\x16\x4f\x60\xb1\x0c\xcb\xf3\x49\x56\xc1\x12\x77\xaf\xb9\x98\x3b\x5d\x9b\x01\xea\x58\x2e\x27\x66\x19\xad\x0c\xac\xfc\x7f\xa2\x4e\x47\xe7\x63\x15\x6c\xd5\x97\x49\xc7\x7a\xa3\x38\xe2\xb5\x52\xb4\x56\x42\x68\x9c\xab\x75\xfb\x5c\xf9\x4d\xc9\x81\xbb\x49\x45\xe0\x9d\x49\x43\xeb\xf0\x54\x35\x0f\xcd\xa6\xf0\xca\xb9\xb2\x8d\x01\x76\x99\xaf\x0d\x80\x2d\xe5\x0c\xbf\x0a\xed\x57\xd3\x15\xb2\xb8\xe4\x55\xd5\x45\xab\x20\xe1\x92\x3e\x56\xd9\xd3\x22\xdb\x5e\x23\x97\x69\x0e\x54\xf1\xf9\x5f\x85\xa4\x6d\xc5\x65\x11\xef\x99\xdd\xca\x14\x57\x06\x1e\x77\xbb\x85\x71\x17\xa6\x09\x15\x5f\xf1\x70\x8a\xe7\xf5\x6e\xa1\x0b\xab\xb2\x3b\x9a\x15\x0b\xb3\x3b\x99\xc5\x75\xf1\x44\x50\x9b\x38\x9a\xc9\xa6\x58\x4b\x4b\x1c\xb6\xea\xbe\xdd\x16\x05\x46\x07\x82\x23\x8d\x3b\xe8\x08\xfd\xf5\xf9\x99\x7a\x1b\xcb\x85\xb0\x8d\x32\x6d\xe3\x3c\x91\xf3\xb7\xca\x4c\xce\xfb\xea\x48\xb8\xf4\xb7\x32\x13\x30\x21\x21\x21\x42\x2a\x64\xfb\x35\xf4\x95\x05\x5b\x5f\x59\x76\xd8\x6a\x07\x02\xe2\x9e\xf2\xfa\x11\xc1\xe7\xba\xfa\x3d\x29\x25\xb0\x8c\x5f\x39\xeb\xe8\x9a\x08\xe9\x11\x0a\x4d\x58\xc9\x80\x8f\xa4\x83\x86\x5a\xa5\x8a\xa4\x97\xab\x85\x06\x90\x8e\x70\xe8\x73\xa7\x2d\xfd\xd5\xb6\x92\xf2\xf4\xf1\x17\xcd\x43\x7f\x0d\x2e\x68\xd7\xef\x25\xb6\x55\xa7\xb7\x9b\xe7\x82\xb6\xf3\x32\xab\xf3\x32\x2b\x0f\x68\xf1\xf8\xeb\xf5\x94\xda\xdb\x43\x27\x0c\x5d\x10\x14\xb2\xb8\x95\xa3\x29\x3e\x27\x08\xc7\x97\x3a\x53\x03\x4a\x52\xca\x52\x0a\xf6\xa9\xd9\x9c\xf4\xb7\xe3\x9e\x53\xe1\x4f\x53\xf0\xda\xe1\x5f\x7b\x24\x0e\x1b\x05\x96\xaf\xf1\xc6\x79\x80\x5a\xc9\x02\xb5\xd0\x83\xb2\x8f\x7b\x68\x5f\x54\x28\xba\xe4\x0c\x84\x4b\x8e\xed\xe3\x81\x03\xfb\x72\x74\x62\xb1\x2f\x85\x6f\xc3\x11\xc1\x89\x2c\x38\x34\x96\x37\xde\xa3\x83\x4d\xfb\x6d\x94\x04\xa7\x2e\xb1\x0e\xb9\x13\x62\xd9\xdb\xe8\x9f\x21\x8c\x56\x3c\x33\x13\x19\x7d\xc2\xb7\x36\xb9\x06\xcb\x92\xad\x29\xf0\x57\x57\x61\x5b\xa1\xbf\xaa\x14\xd7\x57\x53\x59\x2f\x53\xcc\xaa\x70\x6b\xfd\x19\x4e\xda\xc6\xef\xc9\x44\xec\x15\xc7\xb8\x90\xd1\x7f\x49\xf8\x3b\xd5\xaa\x24\x50\x5e\xb3\x20\x68\xa5\x91\xb8\x04\x69\xb2\x35\x6f\xb5\x91\xef\xc4\x20\xae\x10\xf5\x4e\x01\x10\xff\xd6\xc5\x3e\x54\x9a\x3f\x19\xed\xcb\xd7\xfd\x49\x5c\xff\x32\x2a\xc0\x3b\x41\xf6\x6e\x83\x36\xca\x7e\xd7\x6e\xe6\x79\xa6\x42\x00\x99\x57\x9a\x8a\xd9\xb3\x9d\xc7\xda\xe3\xdd\x63\x6d\xf7\x58\xdb\x3d\xd6\xb6\x1a\x12\xe4\x9d\xce\x60\x55\x85\x13\x83\x92\xba\x75\x9d\x98\x5a\x5f\xef\xb3\x6f\x1b\x8f\xb8\x82\x67\xbb\x4e\x92\x57\x1a\x0f\xe1\x61\xfd\x2b\xcc\x54\x10\xff\xdb\x1f\x34\xa8\xbb\xe4\xc5\xb6\x7b\x41\x7d\x25\x2f\xa8\x5a\xd7\x0a\xfd\x64\xba\x00\x91\xc7\x88\xa0\x8b\x14\x27\x89\xc8\x0e\x89\x91\x49\x99\xe7\x6f\x29\xfa\x09\x1c\xa8\xb3\x1c\xc7\x01\xe1\xb0\x70\x8e\x02\x1c\x73\x08\x73\xbd\x2c\xbc\x40\x64\x1d\x40\x38\x46\xd3\x03\x68\x40\x70\xc8\xd1\x04\xeb\x89\x84\x34\xc3\xa3\x88\x18\x52\x54\xeb\xd3\x51\xfa\x20\x84\x00\x7e\x5f\xe0\x39\x58\x18\xba\xae\x5a\xf8\x72\x1d\x26\xe0\x85\x4e\x6f\xc3\xb3\xb2\xb8\x86\xdf\x9b\xad\x3b\x6a\xf6\x06\xb4\x6f\x3b\xdf\x9a\xf5\x2f\x20\x38\x47\xa8\x95\x43\x10\x49\xf3\x04\x74\x4c\x2f\xfd\x67\x17\x60\xd4\xee\xd1\x75\xa7\x1f\x5d\x8d\x00\x16\xcf\xd4\x32\x75\x6d\x51\x47\x29\x90\xa9\x44\x51\x59\x42\xfa\x40\x89\xb7\x41\x35\xdd\x3b\x89\xf5\xea\x15\x28\x62\x9d\x6e\xe7\x0d\xf8\x64\xf7\x06\xdc\xbd\x01\x77\x6f\xc0\x6d\xbd\x01\x77\xcf\xb3\x95\x9e\x67\xd0\x50\x3c\x8d\x20\x8b\x55\xd9\x53\xe9\xd9\x92\x8c\xfc\xe2\xe9\x34\xf4\xe3\xcf\x15\x43\xc9\xf9\xcf\x3c\xa9\xf2\x52\xfd\x9b\xe7\xdd\x92\x12\x3b\x53\xf1\x98\xa6\x59\xde\x03\x76\xc0\x09\x37\x27\x3b\x79\xc7\x92\x23\xd5\x58\x39\x00\xed\xde\x76\x5f\xd5\xdb\xae\xf4\x31\x24\x55\xc4\x85\xe7\xd0\x92\xd7\x4e\xa3\xd7\xd2\x96\xb4\x63\xd6\x7b\xc6\x7f\xe6\xdc\x16\xed\x98\xf5\x9a\xb0\xdf\x11\x72\x33\x76\x2f\x89\x3b\xfd\x92\xd8\xbc\xfa\x46\xe5\x08\x30\x8c\xbb\x0a\xea\xbf\x1d\xd6\xfd\xe9\x8e\x75\xbf\xcb\x11\xd9\xb7\xfa\x8e\xd8\xb1\xee\x3b\xd6\x7d\xeb\x9a\x95\xaa\x5b\xfc\x73\x57\xb2\xf6\x46\x56\xdd\xcf\xe6\xa3\x29\xc1\x9c\x47\x36\x16\x1c\x01\x8b\x58\xaa\xd4\x2f\x09\x8e\x48\x9e\x93\x7e\x4e\x16\x79\x5f\x44\x13\xc5\xe9\xa5\x6f\x2c\x37\x30\x16\x19\x3b\x76\xfa\x6b\x67\xa7\xdf\x91\x45\x91\xa5\xfe\xba\x0c\xce\x92\x1b\xc4\x50\xf3\xed\xd8\x31\xd5\x3b\xa6\x7a\x1d\xa6\x1a\x52\x54\x15\x18\x6b\xc8\x29\xb5\x15\xe6\xfa\xc9\xe0\x56\x33\xd7\xd7\xc2\x41\x6e\x81\x6d\xbc\x48\x71\xf2\x52\x18\xd3\x4b\x1a\x5b\xca\xf2\x1f\x54\x35\xa8\xe5\xee\xdc\xaa\x0e\x6f\xa8\x82\xb2\x95\x4e\xe6\xc9\x41\xb1\xee\x32\x36\x52\x04\x93\xb9\x61\x5c\xe4\xcf\x74\x32\x25\xe9\x9b\x34\x24\xa9\x49\xee\x54\x95\x84\xe8\x51\x63\xbe\xb2\x14\xec\x06\xf3\xba\xfc\xa0\x73\x5a\x54\x21\xf2\x7e\xe3\xb1\x5a\xb0\x36\x38\xc2\x57\x31\x3f\xaf\x24\x2c\x65\x20\x5f\x8d\x11\xcd\x00\x1f\x5e\xb2\x8b\xb8\xcd\x12\x61\x1c\x6c\x32\x75\x74\xba\x6a\xfb\xf9\xf9\x75\x03\x8b\x37\xc8\x57\x60\xdd\x75\x25\xe1\x22\x45\x4a\x80\x94\x64\x09\x8b\x33\x7a\x4e\xa2\x4b\x95\x1e\x41\xc6\x71\x47\xdf\xe1\x1c\xb1\x14\x8d\x48\xc4\x2e\xbe\x03\x26\x6f\x42\xcf\x49\x8c\xcc\x00\x39\xb4\xb6\x44\x3d\x88\x3c\xda\xca\x66\x2d\x08\xd1\x3f\x83\x0c\x78\x28\x24\xe7\x34\x20\x59\xa7\xcf\x6b\xfe\x8b\xe5\x34\x20\xc2\xbc\x04\x42\xc4\x0b\xfc\xe8\x41\x2e\x0f\x64\x30\x04\xa2\x18\x73\xf6\x11\xe7\x74\x14\x11\x11\xac\x32\x23\xe9\x39\x49\x51\x46\x43\x22\xcd\x50\x44\x38\x5d\x99\x9f\xb6\x24\x4f\xa0\x3e\x60\xfe\xb7\xb6\x61\xfa\xe4\x9a\xa3\xe7\x08\xa7\x93\xf9\x0c\xb8\xd5\x88\xc4\x93\x7c\x8a\xfe\x81\x06\xfc\xc4\xe9\xf2\xf7\x83\x0f\xc0\x82\x68\x69\x04\xfa\xde\xfd\xc8\x8f\xa1\x59\x1a\xe1\xe3\xc9\xdf\x1a\x9a\x2d\x33\xc6\xf4\x26\xb9\xb3\x7c\xd2\x00\x4a\xd9\xd8\x5c\x44\x06\xc1\xe1\x21\x03\xe5\x77\x7f\x5a\x16\x43\x8b\x9a\x26\x1f\xd7\x23\xe9\x56\x73\x82\x36\xba\xe9\x9b\x1a\xf0\xb6\x6f\xe1\x6f\xa7\x6d\xc6\xda\x95\x1c\x30\x04\xc4\x07\x66\x50\x8c\x4d\x67\xc1\x86\x7f\xfc\x09\xac\xc5\x02\x7a\xb9\x6a\x6a\xf9\x10\xfb\x40\xc0\x38\x24\x43\x82\x64\x0a\xf8\xca\x3e\x5b\xa6\xcf\x96\x59\xe0\xc2\xf8\x43\xe7\x82\x12\x4b\xe5\x5d\x43\x56\x2a\x5f\xb3\xf2\xc5\xbc\x94\xee\x42\xc9\x9d\x74\xd7\xde\x02\xd5\x69\xfb\x43\x81\xf6\xf2\x9d\x5b\x64\xb7\xfc\xee\xb6\xc3\x28\x0d\x6f\x66\x6e\xe1\x73\x1a\x56\x67\xa2\x7b\xb2\xff\xc5\x93\x0b\xc3\xf8\x6e\x40\xd2\xd0\x27\xfb\xb7\x9a\xd1\xdd\x25\x0d\xdd\x19\x80\xec\xa4\xc8\x9b\x36\x85\x57\x69\xda\x86\x05\xf1\x2a\xe4\xdf\x7b\x4b\x32\x92\xa3\x51\xca\x2e\x32\x92\xaa\x31\x89\x1e\x54\xce\x3d\x91\xb9\x4d\x65\xd7\xb3\xcd\xda\x4f\xa6\x29\x8d\xcf\xb4\xa4\x56\x1a\x94\xaa\x79\xa9\x11\x8c\x70\x70\x36\x49\xd9\x3c\x0e\x8f\x2b\x85\xc0\xa1\x20\xa2\x36\x1c\x1a\x67\xa4\x60\xd2\xff\x0b\x19\xe7\x47\xe8\xf1\xbe\x5d\x31\x12\x13\x5c\xa5\x3b\x68\xf2\xb2\xd8\x27\x1e\x65\x2c\x9a\xe7\xc4\x40\xb3\x52\x1d\xaa\x8f\x56\x4a\xbb\x3c\x67\x33\xcb\xcb\x20\x82\xd1\x95\xa7\xd3\xdb\x90\x69\x88\x19\x61\xe3\xc0\xfb\xb7\x43\xf8\x5b\x6b\x27\x2f\xd1\x43\xa7\x84\xa3\x71\x48\x62\x27\xd7\x84\xc4\x96\xc6\x8b\x52\xd7\x81\x88\x3c\x20\xf0\x8a\xa4\x42\x75\x61\x7a\x92\xe8\xb6\x8a\x8d\x3c\xc0\x6e\x12\x9c\x5f\xed\xae\x16\x48\xab\x82\x55\x25\xda\xbf\xda\x81\xd0\x0b\x52\x6d\x58\x2c\x13\x38\x9f\xff\xd2\x28\x0c\x29\xbd\xd4\x27\xf8\x75\x55\x59\xb8\x39\x37\xd5\xa6\xf3\x30\x06\xfe\x07\xf4\xa8\xa5\xe3\xda\x70\xc6\x66\xd0\x1b\x88\xb5\x37\x13\xa0\x58\x2f\xbe\xde\x97\xf5\x82\x13\x8b\x05\x16\xab\xbe\x1a\x04\xb1\x1b\xdf\x6b\x48\xe2\xb7\x71\xab\x56\xb6\xf6\xc0\x44\x79\xf1\x8e\xbb\x2e\x36\x74\x9e\x35\x56\x37\xb4\xa6\x69\xab\xe6\x71\xe9\xbb\x77\xc3\xde\x68\xed\x81\x52\x16\x00\xce\x7f\x19\x15\x41\x23\x1a\x79\x1b\x44\xf0\xcd\x62\xcf\xca\xa3\xb3\x81\x20\x66\xe2\xf0\xad\x66\x60\x2f\xf6\xb9\xc4\xb8\xde\xec\x82\x89\xf2\x25\x88\xb4\xfe\x2d\x49\xe9\x26\x6d\xee\x61\x38\x52\xbb\x20\xde\x65\xdb\x79\x2a\x3f\xdc\x3d\xb5\x76\x4f\xad\x1b\xfa\xd4\xb2\x89\x6e\xf9\x51\x2e\xd4\xac\x03\xae\x2b\xed\xde\x72\x77\xc1\x22\xa8\x21\x3c\xc9\x0c\x88\x98\x94\x57\x1c\x9b\x0d\x6b\xab\xfe\x06\x90\x47\x11\x9e\x7d\xda\xe5\x40\xbd\xfb\x92\x94\xce\x70\x7a\xf9\xde\x7b\x0d\xea\x90\x9b\xe2\xee\x43\xdf\xa3\xd6\x8b\xc7\x83\x41\x0b\x1d\xa1\xd6\x8b\xfd\xc1\xa0\xf5\x61\x99\x8f\x02\x8b\xf3\x9f\xf0\x8c\x46\x97\x47\x45\x4b\x28\xf3\xb1\x5b\x67\x07\x45\xe3\x64\x9e\xf7\x23\xbe\x98\xef\xc8\x42\x33\xdc\xbc\xf5\x09\xfd\x93\x94\x00\x4e\x16\xef\xd8\x5b\x32\x6b\x0f\x1f\x75\x0c\xe7\x1e\x93\x9f\xfd\xc7\xbe\x76\x88\x70\x9e\xe8\xb0\x4c\xc4\x4a\x3d\x2f\x47\x65\x96\xcf\xae\x4d\xd2\x94\x7f\xac\xb5\xe4\x82\x3a\xfd\x17\x07\x03\x57\x14\x20\xfc\xeb\x8a\x1d\x95\x4d\x5f\x55\xde\xf9\x50\x7c\x55\x46\x5f\xc5\x1c\xe4\x26\x43\x22\x47\x52\x9d\x89\x9c\x1f\x3b\x14\xb3\x50\x6a\x55\xd1\x8f\x14\xde\xa3\x18\x09\x38\x7c\x2e\x9c\xab\xc2\xe8\xe5\x9b\xd7\x88\x08\x8a\x83\x18\xaf\x50\xb6\xdd\xaa\x68\xd5\xfd\x76\xc8\xe2\x9a\xdb\x6e\xc3\xd8\xcc\xee\x5b\x10\x8b\x69\xb0\x6d\x39\x07\xd0\x18\x94\x4d\xd9\x3c\x0a\xd1\x88\xa8\x68\x87\x24\x44\x34\x46\x58\x1f\x58\x94\xe5\x38\xb7\xd4\xd7\xe6\x20\xaf\x2b\x60\xa9\xef\x38\x16\x44\xc6\xef\x56\x52\x9e\x75\xfb\x04\xba\x22\xce\x3c\xcd\xe4\x08\x68\xa6\xa8\x1f\x6a\xc3\x7f\x47\x97\xe8\xf4\x27\x96\xce\xfe\x99\xb2\x79\x72\x6a\x1d\x87\x8e\xa5\xbd\x57\xf4\xf2\x6a\xb3\x07\xe1\x12\x8d\x43\x1a\xe0\x5c\x2b\xd5\xd5\x30\x21\x45\xb0\x78\xc3\x9a\x8e\x55\xc9\x2a\xe2\x26\x3e\x99\x5f\x78\x7f\x4a\x02\x03\xc4\x6f\x91\x5f\x53\x5a\xc8\x7a\xc9\x93\x6d\xab\x22\xab\x68\xa5\xaa\xac\xa2\x70\xcd\x01\xa4\x0a\x55\x25\xc0\x0c\xa7\x06\x94\x98\x9b\x13\x36\xcc\xa9\x20\xcb\xba\x5a\xd7\x2e\x96\xd6\xa9\x93\x5a\x52\x84\xab\x88\xbc\x9a\x44\x8b\xd0\x13\xb7\x42\x47\x40\xae\x3d\x98\x09\xa4\xfd\x13\x23\xe6\x7f\xaa\x81\x81\x64\x4c\xec\xd8\x6c\x4e\xf9\x56\x1f\xb3\x38\x4f\x59\x84\x9e\xab\x7d\xee\xbb\x1f\x8c\x20\x4d\xc1\x40\xcf\x9d\xc9\x3f\xb3\x79\x27\xf8\x6a\xad\x9e\xfa\xa8\x09\xc3\x73\x67\x7f\xd4\x67\x71\x7a\x9f\x9b\x6d\x01\xbc\xa2\x63\xd4\x76\x07\xa3\x54\xaa\xfc\x8b\xa4\xbb\x66\x54\x9c\x9a\xea\x77\x68\xcb\xb6\x8a\xd0\xe3\x76\xa1\xe9\xed\x7a\xa6\x79\x06\x07\xb4\x9e\x51\x15\x64\x33\x65\x0f\xb0\xfc\x50\x01\xd7\x2c\x46\x15\x60\x6b\xb9\x3c\xc8\xea\x4b\x05\x68\xb9\x90\x55\x70\xd5\x3a\x7b\x40\xa1\xd8\x40\xfc\xfc\xe5\x45\xa7\xea\xb0\xa9\x25\x5e\x4f\x70\xaa\x4f\xbd\x5e\xd0\xf5\xe0\x08\xda\x20\x56\xaf\x89\x94\x14\x44\xf1\x59\x4e\x52\x9a\x9d\x1d\x37\x5a\xc3\xfa\x41\xf1\x45\x2c\x1d\xcb\x0a\x42\xd9\x7b\x0e\xf9\x6c\x6e\x09\x5e\x22\xa2\x75\x0d\xbc\xbb\xf7\x9c\x43\xd6\x34\xee\x67\x2b\x4b\x70\xdc\x32\x51\x5e\xac\x2e\x8b\x4b\xa7\x83\xbe\xb4\xfe\xdf\x7c\x7f\x30\x78\xfa\x9d\x50\x87\x99\xa8\x2f\xfa\xd2\xfa\x42\x46\xe5\x37\x84\x1d\x5c\x2b\xcd\x5e\x45\xfb\xc6\x49\xf6\xb6\xcb\x8e\xee\xcc\xf7\x6f\xb0\xee\xc0\xe6\x41\xee\xda\x3b\x68\xc5\x08\x43\xe1\x66\x54\x28\x8a\x79\xdb\x00\x28\xc3\xfe\x6d\x00\x98\x66\x20\x57\xd1\xee\x18\xaa\x5c\xa2\xdf\xb1\x68\x66\x0b\xde\x37\x2d\x78\x88\x98\x36\x92\x1f\x55\xc4\x9c\xb7\x71\xf9\x96\x23\x5b\x00\xad\x6f\x1b\x71\x24\x36\xa2\x0e\xd2\x63\x01\x85\x90\xfe\xb5\x25\x95\xd0\xc1\xcd\xb2\x9e\xfc\xc2\x3a\x9e\x1b\xa5\x71\x99\x10\x5e\x9c\x33\x4e\x24\xde\x8c\x2b\x86\xf0\xa4\xa2\x7a\x9d\x52\xc1\xad\xe9\x6a\x3d\x8e\x71\x14\x1d\x4f\x49\x70\x56\x35\xe7\xa7\x15\xf5\xeb\xa6\xea\x41\x36\x10\x80\x47\x03\x8e\xab\xaa\xbb\xe1\xa0\xac\x76\x6d\x67\x16\x50\xa3\x33\x62\x59\x46\x47\x11\x39\x66\x71\x96\xa7\xf3\x20\x67\xe9\x5b\x60\x60\x2b\xfb\x1d\x2e\x6f\x5b\x37\x8a\xea\x0e\x35\x5c\x1a\x4f\x49\x4a\xf3\xea\xa9\x17\xab\xd6\xf5\xa8\xc1\x6d\xd7\x43\xea\x3a\xd4\x68\x21\x19\xb1\x79\x1c\x54\xe9\x70\x0e\xf7\x0b\x35\xeb\x3a\x50\x75\xdc\x19\xff\x78\x4e\xe2\xfc\x17\x9a\xe5\x24\xae\xb4\xd3\x3e\x78\x58\xd3\x66\xe9\x92\x39\xb5\xef\x94\x8a\x30\x65\x17\x99\xd0\xda\xa0\xe7\x68\xff\x60\xa9\x02\x0c\xac\x3d\x2d\x05\x94\x65\x9f\x98\x92\x08\xe7\xf4\x9c\x33\x87\x7b\x7b\x68\x44\x02\xcc\xaf\x14\x10\xfa\x4f\x71\xc8\x2e\xd0\x14\x67\x35\xf6\x8c\xbe\xb5\x22\xbc\xd9\xf8\x05\x8e\x53\x82\x55\x77\x4e\x25\xd1\x4e\x19\x98\xda\x65\x29\xc9\x40\x6f\x65\x9b\x8c\x8e\x19\xb0\x0a\xf2\x6c\xc9\x42\xa3\x9f\x92\x8f\xd2\x79\x9a\xb1\xb4\x50\x6d\xc4\x16\x27\xf4\x4f\x11\xd9\x4b\x98\xa3\xf6\x46\x4c\x05\xeb\xb2\x15\x5f\x85\x76\x45\xd3\x55\x36\xcf\x79\x0b\xb7\xd0\x18\x8d\x1e\xc9\x5c\x7e\x09\x4e\x39\x5f\xac\x16\x42\x2c\xe1\x91\x76\x09\x28\xce\x6f\x6f\x0f\xbd\x91\x71\xc9\x10\x8e\x32\x86\x62\x42\x42\xa1\x63\x99\x92\x94\xf0\x7f\x53\x32\x63\xe7\x62\x4b\xc8\x22\x4f\x31\xdf\x7d\xd5\x16\x87\xb2\xb2\x5a\xf2\x0c\xd1\x18\xfd\x44\x53\x32\x66\x0b\x61\x8a\xab\xc2\x9e\x1d\xa1\xd6\x94\x86\x21\x89\x4d\xcf\xff\xa6\x19\x1d\xd1\x88\xe6\x97\x76\xb7\x34\xb4\x3b\xe3\x80\x11\x87\x8c\x58\x8c\x68\x82\xc3\x4c\x38\x32\xe9\xa6\x3e\xdc\x6a\x5c\xd1\x7b\x6e\x45\x5f\xbb\x98\xd2\x9c\x9c\x24\x38\xe0\xeb\x92\xa4\xa4\x77\x91\xe2\xa4\x25\x9c\x21\x36\xa0\xc6\xbb\x8d\xda\x2c\x1f\x8a\xa4\x01\xff\x16\x9c\x5a\xd5\x70\x62\xf2\x66\xcc\x57\xa4\xfd\xbe\xbe\xab\x2a\x00\xf1\x7c\x36\x22\xe9\x87\xce\x92\xb1\xac\xae\xd2\xf1\x41\xb0\xf8\x78\x8a\xe3\x49\xf5\x54\x38\x05\x75\x41\xfc\x0b\xc6\x86\xd8\x18\x08\x1f\xdf\x31\xa9\x08\x42\x17\x53\x12\xa3\xd9\x3c\xca\x29\x3f\x9d\xd2\x9b\x0e\xd1\x0c\x65\x24\x87\x63\xe1\xf8\x53\xf2\xd6\xd7\xbd\x82\xaf\xf1\x82\xce\xe6\x33\x14\x6f\x70\x0e\xaf\xf1\xe2\xba\xa7\xf1\x5b\x26\x75\x4f\x89\x7c\x54\xf0\x91\x25\x38\xcb\x10\x46\x29\x19\xa3\x40\x65\x7c\xe5\x03\x9e\x12\x14\xc3\xa5\xa2\xc9\x92\x52\xad\x9a\x79\xa8\x2f\x6f\xc9\x78\x05\x4c\xf0\x91\xe9\xfc\x7a\x0e\x05\xd0\x22\xe9\x55\x2b\x87\x80\x7a\x08\x2e\xf8\x18\x47\x8e\xaa\x58\xfa\xa9\xbe\x53\x13\xb7\xac\x4f\xda\x1f\x81\x76\x7d\xeb\x79\x85\xc2\xeb\x54\x33\x98\xe6\x6d\xaa\x40\x74\x51\xa1\x1d\x08\x80\x35\x5c\x55\xb1\x6d\x7b\x99\x4a\x7b\x31\xfd\x33\x27\xb3\xa4\x8b\x3e\xe6\x53\x9a\xc1\x73\x3d\x97\x1f\x8d\x74\xda\xbc\x24\xcc\x18\x44\x75\xd5\x41\x47\xb6\x19\xb3\x14\xb5\x01\x6a\x04\xba\x3f\xdf\xa7\xb6\xcb\x4b\x38\x2d\x7e\x91\xa6\xf8\xb2\xcd\x6b\x75\xba\xe8\xe3\x19\xb9\x44\xcf\xd1\xe0\x99\xf8\xeb\xef\xd0\x5a\xfc\x78\xf0\xc0\x68\x2b\x78\xd3\xf7\xbc\xf0\x83\x0d\x59\x94\x94\x79\x4b\xf2\xb9\xf0\x37\x3e\xcc\x50\xfc\x31\xa5\x99\x7a\xf5\x57\xbf\x1d\xfc\x49\x2a\x71\xb0\x9a\x6c\xff\x23\xbf\x5b\x72\xf6\xf1\x23\xfa\xf4\x49\x00\xf3\x5e\x78\xc5\xad\xea\x74\x40\x0c\xd0\xe7\x77\xcb\xa5\x14\xa2\xbc\xe7\xe0\x3f\xf4\x03\x16\x07\x38\x6f\xf3\xd9\x75\x20\x29\x2e\x2f\x56\xff\xf6\x41\x85\x2d\x2f\x2f\xfb\xaa\x8c\xe7\x51\x24\x6d\x63\x64\xcd\x29\x8e\xc3\x88\xbc\x05\x56\x42\x4d\x52\x33\xe1\x66\x44\x06\xe9\xc8\xb9\xe5\x7f\x8c\x54\x7f\x97\x71\x20\xb8\x1f\xfe\xfe\x3d\x01\x36\x45\xd6\x7c\xa6\xfa\x1b\x3e\x7a\xd4\xf1\x7b\x1d\xbf\x02\xb5\xb3\x8d\xd4\x31\x0b\x89\x0f\x9e\xca\x5a\xfc\xdb\x33\xe5\x3e\x30\x96\x5b\x23\xf3\x6a\x59\x04\xa0\x63\xc5\x49\xad\xa8\x22\xba\x51\xb0\x3e\x97\xaf\xc9\xf8\x84\xc6\x93\x88\x70\x32\x2a\xa6\xb4\x74\xa0\x59\xb1\x81\x19\x73\x09\xfc\x86\x50\x97\xc2\x12\x57\xa0\x03\xa8\x74\x9f\x80\xbe\x71\x8e\x9e\x7f\xec\xe7\x38\x9d\x90\x5c\x14\xca\xa3\xe8\xe8\x01\xed\xb5\x93\x2d\x5d\x9d\x20\xe8\x69\xac\x21\xda\x0b\xbf\xb7\xe7\xd9\xd1\xd0\x0c\xc5\x2c\x07\x05\x71\xca\x22\x50\xa8\x5d\x10\x60\x14\xc1\x6a\x26\x09\x85\x3d\x02\x3c\x14\x22\xce\xbf\x42\x97\x7d\x6f\x27\x45\x47\x7a\x22\xd6\xb4\x9e\xf9\x35\x97\xe1\xa4\x3e\xf9\x45\x64\x52\x4c\x45\x15\x26\xa9\xef\x05\x78\x7a\x6f\xc8\x2c\x51\x52\xd1\x26\x34\xc3\x22\xa4\xc2\x07\xfb\x9e\xa2\xe4\xb6\x94\xa4\x8c\x98\xbf\x17\x23\x3c\x23\x9c\x73\xd6\xab\xfd\x3b\x8d\xa2\xd7\x6c\x1e\xab\x37\x88\xbc\xd8\x34\x7a\x14\x2b\xb6\xcd\x5c\xf7\xf6\xd0\xdf\xe1\x60\xfe\x83\x3f\xfd\x48\x90\x67\xae\xc1\x5a\x86\x68\x2e\x83\x29\x64\xe2\x45\x91\x25\x2c\x86\x6d\x6c\x41\x47\x2d\x03\x28\x63\xe2\x9e\xa7\x22\x35\x48\xc0\x2f\x04\xce\xa2\x80\x4d\x43\x3e\x25\x97\xfc\x31\x80\x42\x9a\xe6\x97\xb2\x91\x83\xa8\x05\x0c\xfc\xf4\xc9\x2e\xb3\x79\x59\xfe\xa9\xd5\x7a\x66\x43\xc9\x48\x7e\xc2\x29\x61\xdb\xec\xa2\xa2\x84\x82\x07\x6c\x5b\xb0\x38\x27\xd4\x41\xdf\x59\x8f\x61\xb5\xab\x1d\x4b\xab\xad\x82\xc9\x79\xeb\xfd\x92\x86\x8d\x96\x5b\xd5\xb3\x56\xbb\x1a\x59\x39\xb5\x6e\xd0\x37\xdf\xc2\xb7\x24\x20\xf4\x1c\x44\xb4\x59\x93\x2d\xb7\xeb\xb7\x63\xb2\x10\x42\x75\x33\x28\x7e\x20\x74\xb1\x5c\xfa\x6f\x9e\x97\xef\x87\x5c\x4a\x53\x5d\xf2\x94\x1d\x68\x51\xbe\xd0\xfc\xb3\x7d\xb8\xea\x17\xa1\x8b\xcc\x10\xbd\xb3\xb6\x64\x5d\x7e\x8b\x67\x4d\x4f\x81\xac\xea\xef\x8c\x7d\x41\xf6\x03\x1c\x07\x24\x6a\x57\x6f\x4a\xd9\x14\x2a\x3a\xaf\xa1\x4f\x7a\x04\x9c\x29\x4a\xe4\x43\xb4\x24\xd2\xc8\xd0\x8d\x34\x32\xac\x8b\x34\x32\xfc\x80\x8e\xac\xed\x73\xe9\xbd\x75\xcb\xdc\xbf\x8f\x4a\xaf\xb2\x65\xb4\x7d\x6d\xba\x6e\x5d\x38\x05\xec\xfa\xa6\xca\x06\xc5\xe0\x8c\x7b\x1f\xb8\x97\x15\xf0\x3b\xe8\x7b\xd4\x6a\xa1\x23\x74\x02\xbc\x79\xdb\xaa\xd1\x31\x57\x86\xbe\x09\xc4\x9a\x1b\x69\x8e\xa2\x41\xfe\x72\xf4\xb3\x80\xcf\x56\x54\x7a\xe6\x34\x8e\xc9\x85\xd7\xb6\xac\x85\xbd\x98\xff\x9c\xe3\x34\xa4\xf1\x04\x38\xe1\x3f\xb2\x90\xcd\xba\x9c\x46\xa6\x04\xd9\x6d\x10\xcd\xe2\x16\x7f\x31\x91\x4c\x3d\x7d\x14\x80\x13\x42\xd0\x34\xcf\x93\xec\x68\x6f\x6f\x42\xf3\xe9\x7c\xd4\x0f\xd8\x6c\x2f\x9f\x25\xe7\x38\xdd\x03\x88\x7b\x90\xaf\x3a\xdb\x1b\x0e\x86\x0f\x9d\xb5\xb7\x86\x6b\x23\x8f\xbb\xd6\x82\x39\x2e\x5d\x2f\x0e\x43\x1e\x72\xf7\x7c\xa3\x7f\xe8\xd3\x6f\x51\x58\x17\xae\xbd\x56\xaf\x71\x3e\xed\xcf\x68\x5c\x01\xed\x3b\x6b\x57\xba\xa6\x61\xf9\x26\x16\xe1\xe2\x85\x99\x69\xd7\x02\xd5\x79\xe6\x4e\xc5\xf0\xcf\x7d\x71\x57\x00\x12\x9a\xee\x4a\x50\xb0\x78\xcb\x20\x9b\xe7\x56\x4d\xad\xaf\x9f\x9d\x51\xdb\xff\x96\xd0\x14\x71\xd3\x56\x50\x11\xf1\xb1\xed\x92\x8c\x8f\x8a\x66\x98\x03\xd5\xb5\x7a\x37\x56\x94\x1f\x4b\xcd\x28\x91\x17\x96\xf2\x63\x85\x1d\x25\x42\xae\x34\xc9\x54\xb5\x4b\xed\xda\x8a\x6f\x32\x35\x55\x89\x5d\x0b\x24\x1a\xba\x06\xff\xe5\x7f\x7d\x8d\x17\x6e\x85\xd7\x78\x61\xd7\xb1\x38\x7d\x53\xcf\x2a\xb4\xeb\x9e\xbb\x43\x3f\x2f\x8c\x79\x35\xf3\xcb\x8f\xa5\x11\xed\x9d\x0c\x5d\xd6\xe2\xf0\xdf\x6a\x09\xc0\xc4\x92\x5d\x64\xea\xdf\xd7\x78\xc1\xff\xb4\x86\xcd\x7f\x0a\x06\x4b\xf9\x26\xa3\xa6\x01\x9b\xf4\x84\x9a\x24\x4a\x16\x46\x78\x20\xd7\x3c\x42\x7f\x69\x4c\x2e\x1e\x8d\xcf\xb5\xc9\x94\x9d\x01\x94\x69\x5c\x8c\xeb\xf0\x5f\x48\x3c\x46\x8e\x50\xeb\x82\xc6\x70\x69\x22\x16\xbf\x95\x12\xee\xe2\x4b\xf5\x73\xa7\x69\xbf\x7a\xfd\x5a\x5d\x8f\xa2\x8d\x3d\xc0\x85\xe7\x5e\xe9\x79\x68\x12\xd6\x54\x10\x7c\x63\x6e\xa7\x86\xd0\x71\x70\x14\x8f\x5e\xc5\x21\x59\x1c\xa1\xde\xd0\xc7\xef\x23\xd4\x1a\xb6\x9c\x42\x82\xc3\x37\x31\xb8\xf7\xa4\x2e\x7a\xb6\x70\x4a\x71\x4f\x8a\xcc\x41\x6f\x30\x27\xad\x02\x7e\x1f\xa1\x56\xcb\x50\x9c\xad\x2c\xde\x17\x5f\x32\x9f\x50\x2c\x5d\x99\xea\x45\x75\x65\xe4\x55\xd4\x4c\xae\x2c\xfc\x73\xc5\xc5\xad\x32\xa2\x5c\x3a\xc9\x95\x16\x39\xd7\xaf\x46\x13\x72\xf7\x6a\xd3\x2e\x23\xee\x0e\x66\x88\x22\xb3\x3a\xd2\xfc\x73\x29\x3a\xc1\xfb\xd3\x5a\x54\x3f\x45\x3a\xbf\x26\x85\x19\xba\x24\x7f\xea\x45\xfc\xec\xde\xe7\x76\x21\x4b\xbd\x2d\xe9\xd4\x02\xb9\x12\x73\x22\xb1\xc6\xc3\x7b\x1b\x88\x36\xab\xba\x01\xab\x1f\x5b\xe2\xe9\x19\xec\x1c\xee\x7c\xb8\x77\x3e\xdc\x57\xf1\xe1\xde\xfb\x0e\x91\x2c\xa2\x71\xde\x93\xda\x34\xf4\x47\xb6\xe8\xe1\xe1\xf0\x72\x0f\x2c\xe2\x7a\x53\x9c\xf5\xf8\xc3\xe2\xbb\xbd\x9d\xbf\xf7\x2e\x81\xf7\xb5\x3a\x95\xcb\xab\x6e\x53\xbe\xdb\x9b\x74\x2d\xbf\x9d\x19\x30\x2c\xdf\x9e\x24\xc2\x97\x60\x6b\xc2\x19\xd6\xde\x38\x22\x26\x6f\x1c\x8e\xe8\x24\x7e\x95\x93\x19\x67\x24\x03\xc2\xd1\x40\x7f\xd3\xc6\x2d\x10\x71\xd5\xfa\x00\x71\xd8\xc0\x34\x64\x92\x92\x4b\x34\xa5\x93\x69\x64\x3d\x5b\x7f\x27\xa3\x33\x9a\xbf\xc3\xc9\xcf\xea\x43\x69\x64\xb3\x80\xcd\x66\x2c\xee\x5b\xd6\x2b\x6e\xc8\x37\x11\x3b\xad\x37\x3c\x70\x8b\xdf\xaa\x17\x46\x49\x82\xbe\x7d\x3e\x34\xed\x85\x9b\xb2\x0b\x25\x02\xc1\xb0\x6e\x6c\x8c\x52\x1c\x52\xb6\x07\xb2\xe5\x11\x5b\x48\x21\xfc\x3d\xd4\xdc\xf9\x5b\x86\x7f\x73\xdd\xfb\xf4\x4a\xa9\xb8\x9d\x36\x60\x20\xad\x06\xea\x3c\x23\xe9\x09\x89\x48\x90\x2b\x7b\x1c\xc3\xa6\x6c\xc6\x83\xdc\x4f\xda\xad\x65\x6f\x38\x49\x08\x4e\x33\x94\x41\xf7\xb6\xe3\x26\x2c\x48\x8d\x71\xc5\x72\x7d\x36\x98\x5f\xd4\x1b\x9b\x94\x68\xf6\x6f\x9d\x89\xcc\x0b\x25\xbd\xd4\x76\x05\x5e\x6a\x73\xaa\x13\x9b\x8f\x08\xc2\xe8\xf4\x2d\x47\xb8\xd3\x2e\xff\xf3\xe4\x82\xe6\xc1\xf4\x54\x38\x79\x9f\x1e\x4b\x1c\x3c\xb5\xbd\xbc\xa5\x9d\xf9\x5a\xbe\x0d\x57\xf5\x6b\xb8\x8a\x33\xcf\x55\x1c\x79\x36\xeb\x4b\xe1\x3a\xf0\xd4\x1e\x0b\xb1\x8f\x2a\x46\x9f\x3a\xd3\x57\xf2\x22\x5f\xd3\x58\x45\x68\xad\x4b\xfc\xfe\xe1\xc3\x6a\x86\x2a\xef\xa6\xc2\xf8\x85\x77\x21\xd2\xeb\x6b\x9f\xf5\x38\x88\x58\x46\xe3\x89\xf4\xef\x2e\x58\xc6\x48\x4a\x75\xcd\x9e\x4e\x6b\xe1\x9d\xdf\xb0\x31\xd2\x6d\xda\xb7\xaa\x88\x6e\xe5\xe4\x26\x5e\x95\xd2\x1c\x2b\x54\x19\xc3\x04\xc1\x56\x4b\x10\x48\x9c\x13\x50\xa3\xc0\x7b\x59\xe2\xab\xec\x34\xc1\x29\x9e\xa1\xbf\x04\xfd\xfb\x2c\x94\xf7\x80\x11\xe2\xaf\x8c\xcd\xd3\x80\xe8\xb0\x22\xb2\x07\xb7\x2d\x47\x6a\x82\xe3\xcf\xea\x4e\x80\xe6\xa7\xf2\xc7\xa9\x94\x81\x4a\x08\x19\x50\xb4\x7b\x57\x30\xb0\xe3\xc0\x1d\x90\x25\x87\xa0\xde\xd4\xca\xce\xc5\xa4\xd2\x0f\xa4\x2c\xe1\x38\x9f\x92\x24\xc2\x81\x8c\xac\x21\xc0\x6b\x7a\xac\xa9\x31\x8e\x43\x8b\x18\xbb\x16\x55\xf2\x3c\x83\xce\x4a\x2b\xb0\xc6\xe8\x92\xcd\xd1\x05\x8e\x73\xdb\x96\x8e\x9f\x2f\x30\x5b\x85\x43\x24\xcc\xb1\x9c\x18\x07\xd2\x89\xa8\x3e\xd4\x81\x5a\x73\x13\xd5\x00\x7e\x6f\x36\xa8\x41\xa0\x5d\xf0\x55\x48\x03\xf8\xbd\x52\x40\x03\x45\x98\xac\xa8\x9c\xa2\x40\x87\xf7\x01\x12\xa3\x03\x73\xf2\x5f\xea\x53\x6c\xa7\xb0\x8a\xed\xec\x55\x46\xe6\x5f\x2e\xf2\x2f\xd1\xdd\x5d\x3d\xf4\x01\xac\x70\x7d\xe4\x03\x58\x1f\x3f\xee\x81\x9a\x31\x84\x01\x05\xaf\xad\x2e\x6a\xc5\xb2\x8d\x2d\xa9\x37\x72\xf8\x55\x23\x21\x2c\x09\x66\x70\xcf\x51\x89\xca\x61\xf6\xdd\x0d\xab\x52\x8c\xae\x1b\x1f\xa0\xbc\x17\xcf\x99\xbf\x51\x24\x85\xcd\x86\x25\xb8\x5a\x10\x81\xc6\xee\xf0\xa5\x2e\xfe\xeb\x06\x2e\x85\xc1\x2b\xdc\x81\x1f\x57\xf2\x90\x2f\x74\x16\xb1\x58\xf7\xa5\x0e\x79\x61\x71\x8f\x50\xe1\x35\xa3\x1e\x03\xa5\x88\xa5\x49\x94\x67\xe0\xf5\xbd\x26\x5e\x47\xe5\x2d\xec\xe3\xef\x57\x01\x92\xf0\xe9\x13\x2a\xa3\x06\x7e\x5d\x4d\x25\x3e\x7d\x42\xa5\x04\xc2\x6f\xa0\xcd\x4f\x1c\x82\x61\x58\x2b\xb7\xb6\xa6\x6c\x9f\x3e\xe9\x3a\x02\xcb\xaa\x96\xb9\x4c\x7b\x66\xcb\x63\xb4\xee\x4a\x7e\x2b\x55\xa4\x09\x7a\xf9\xd9\x21\x9f\xf0\xb7\x1b\x74\xc0\xbe\x45\xbe\x54\x42\xbb\x6b\x79\x2a\xde\x21\x9f\x75\x75\x7b\xec\x5e\x75\x1b\x79\xd5\x7d\x19\x47\x79\xeb\xb6\xaf\x61\x6e\x1b\x47\x2e\x96\xfc\xc2\xee\xa9\xb5\xde\x53\xab\xe9\x3a\xc7\x1b\x3c\xc8\x16\x4b\xb7\x01\x0c\x38\x97\x36\x1d\xcb\x86\xe6\xc7\x37\x70\x2e\x80\x9b\x11\xb2\xc0\x1e\x92\x8e\x5c\x60\x17\x6e\x29\x80\xc1\xa3\x5b\xad\x0f\xbd\x91\x4a\xc2\x2d\x68\xfb\x7e\x06\xab\x8a\xff\xae\x54\xc5\x3d\x7d\x54\xa8\x5a\x07\x5c\xd5\xf1\x1a\x1d\x67\x55\x1d\x1c\x3e\x79\x5a\xac\xbb\xbc\x87\xe3\x6c\x17\x77\xf9\x6e\x64\xc8\xbc\x8d\x51\x76\xef\xcc\x45\xbd\x0d\x1d\xcc\xcf\xca\x4f\xdc\x4f\x16\xda\xb6\x83\xa0\x32\x30\xd7\x5a\xfe\x48\x59\x6d\x67\x6d\x74\x5f\x73\x7f\x2d\x10\x9b\x59\xf3\x1f\xec\x74\xae\x55\xa7\x26\x4d\xf1\xe5\x9b\x71\xfb\x4e\xcd\xb6\xe3\x6b\x14\x5f\x8d\x85\x7d\x9e\xcc\x2f\x9b\x09\xd9\x2d\x98\x81\xe2\x38\x44\xf3\x44\x6b\x7b\x84\xad\x9f\xc1\x96\x45\xf6\x5b\xb2\x5a\xbc\xdc\x35\x3b\xca\x66\xd7\xd4\xd1\x2c\xbc\xa6\x8e\xa2\xc9\x35\x75\xb4\x88\x36\xd9\x51\xc8\x2e\xe2\x1a\x74\x78\xc9\x2e\xea\x73\x1f\x6f\xae\xb3\x6c\x76\x8d\x9d\xcd\xc2\x6b\xec\x2c\x9a\x5c\x63\x67\x8b\x68\xc5\xce\x4e\x12\x12\xd0\xf1\x25\xba\x98\xd2\x60\x8a\xe8\x2c\x11\xb2\x06\x61\x2b\x22\xc2\xb3\xf7\x11\x6a\xfd\x91\xb5\x10\x15\x7e\x8d\xda\x08\xbd\x15\x64\x59\x0b\x5d\xb0\xf4\x2c\x43\x23\x92\xe7\x24\x05\x8b\x13\x91\x42\x5a\x40\x2f\xe4\x91\x56\x2a\x5d\xa7\x9f\xfa\x1b\xaa\xfd\x9e\xf7\x2e\xbb\xf3\x89\xdd\xff\xb0\x39\x98\x1a\xcc\x95\x8e\x4a\xeb\x9c\x41\x57\x18\x4c\x99\x50\xf6\x82\xda\xeb\x8f\xec\xd4\x9f\x61\x6d\xd2\x6b\xad\x52\x7c\x91\xa1\x53\x61\x67\xdf\xa7\x71\x4c\x52\xc8\x0c\x7c\xca\x17\x64\x1e\xe3\x73\x4c\x23\xb0\x23\x64\x52\x37\x09\xd0\xba\xa2\xe5\x85\x5e\x2f\xe1\xf9\x29\x81\x83\xa6\x6c\x96\xe4\x97\x9a\xe1\xe2\x3c\x58\x38\x4f\xd5\x58\xc7\x34\xcd\x72\x04\x1e\x76\x32\x74\xfe\xab\x18\x65\x6c\x46\x50\x46\xf3\xb9\x18\xfb\x25\x9b\xa3\x19\xf8\x15\x28\x3d\x1c\xc4\xd2\x8f\xd1\x94\xa4\x34\xcb\x69\xc0\x8b\x70\x92\xa4\x6c\x41\x67\x38\x17\x1c\x87\x18\xa2\xc8\x3c\x0e\x81\x81\x34\xe7\x17\x51\x3e\x06\x95\x55\xd2\xae\x62\x2f\x85\x6b\xe8\xc1\x87\x10\xa8\xf0\xf0\x73\xbd\xd2\xf3\x8c\xa4\x3d\x3c\x91\xc1\xfc\x0d\xf4\xde\x94\x6a\x13\x16\x70\xc0\x3a\xda\xdb\x0b\x70\x4c\x39\x92\x05\x6c\xb6\xf7\x1f\x19\xc1\x69\x30\x7d\x2e\x6a\xff\xe7\xfe\x60\x0a\xd9\xcf\xb5\x1d\x00\xcd\x29\x8e\x7e\xaf\x4d\x41\x2d\x62\x46\x38\x9a\xd0\xb7\x76\xf2\xf5\x29\x0d\x49\x66\x22\xa7\x8f\x70\x46\x42\xb3\x73\xc2\x24\xc8\x43\x12\x4f\x8f\x29\x9e\x46\x7e\x66\x40\x0f\xaf\xb4\x46\xd0\x29\xbe\xaa\x9e\xce\x85\xa6\xbd\x5a\xe8\x18\xb5\xfd\xfe\x39\xa7\xf2\x47\xd6\xf2\xf3\x21\xd7\xfb\x9c\xe8\xb7\xa7\xf1\x34\x11\xba\x15\xed\x63\xbd\x0a\x1c\xfe\xc4\x2c\x02\xfa\x7c\xef\x9e\xf8\xbc\x96\xe4\x7e\xa5\xe7\x8e\x10\x18\xc9\xde\x4a\xcc\xd7\x7d\x2a\x04\x74\x46\xf3\x41\x3a\xe3\x99\xe0\x56\xf4\x4f\xc1\x53\x98\x7c\x68\x13\xe7\xa7\xb8\x9f\xcd\x4f\x79\x87\x5a\xc0\xbc\x02\x75\x17\x59\x00\xbd\x02\x45\xd3\xeb\x52\xae\x89\x49\x6e\x47\xc4\xf4\xf8\x4a\x22\x26\x51\xb1\x2f\xeb\xf1\x95\x47\x7f\x93\xe3\xfe\x5b\xf9\x29\x3e\x7c\xf2\x04\x78\x78\x25\x3b\x10\xf2\x22\xf4\xb9\xe8\x0c\xf0\xe4\x4a\x23\x03\x45\x29\x4b\xab\xc4\x09\xfb\x0f\x3b\xcf\xa0\xce\xb7\xff\x7d\xf2\xe6\x5f\xa0\xf5\x4d\x49\x1f\xfe\xfe\xf4\x09\xb5\xcd\x2f\x3e\x25\xf1\x44\xa3\xe3\xcb\x23\xc4\xcb\xfa\xfa\x37\xf8\x2e\x16\xd6\xc0\xb2\x62\x95\xf5\xda\x34\xef\xa0\xbf\xd0\xde\x9e\x67\x9d\xde\x83\xa8\x44\x31\xeb\xcd\xe3\x79\x46\xc2\xde\x39\x4e\x33\x73\x0e\xbf\x75\x3b\x93\x91\x4f\xa0\xb4\x6b\x9c\x99\x3b\xcf\x34\x3d\xb4\x57\xef\xe9\x1d\x10\x1d\x9e\x91\xcb\x2a\x99\xd7\xc3\x87\x4e\xad\x3a\x69\x17\xff\x7e\x33\xa5\x91\xd7\xef\xb1\xb1\x55\x07\x94\xad\x08\x57\x2f\x70\x1a\x73\xce\xa3\x02\xec\x81\x5f\xb1\xd6\x01\x41\x54\xf1\x82\xae\x9a\xe7\x76\x15\xb2\x1d\x98\x39\x4e\x49\x94\x90\xb4\x52\xd4\x7b\x70\xa7\x42\x61\xde\x30\xa9\x2d\x2a\x7a\xf7\x8c\x23\x76\xc1\x9b\xef\xc9\xca\xbd\x73\x1c\xd1\xb0\x37\xa6\x11\xe9\xe1\x38\x66\x92\x61\x52\xde\x3e\x0d\xc7\x22\xee\x5b\xc5\x4c\x94\xce\xeb\xc9\xa3\xc6\x33\xb3\xa1\x6d\x41\xe8\x5b\x65\x50\xf3\xb9\xbb\xd6\x74\x9f\x57\x79\x2c\xf1\x11\xa2\xef\xd1\x5f\x9f\x9b\x4b\x5d\x2d\xc0\xdd\x9d\x70\xfa\xcb\x0b\xa7\xb7\xed\x8e\x60\x75\x2c\x6e\x71\x43\xa6\x26\x24\x26\x29\xce\xc9\x49\x69\x96\x48\x21\xe8\xd0\x31\xda\x8c\x43\x8f\xf2\x1e\xf9\xec\x98\x9c\x15\xe8\x76\x9f\xdf\xf1\xfd\x94\x84\xf3\x80\x58\xe1\xd9\x94\x3a\xf7\x8c\x5c\xaa\xa7\x92\x28\x7a\xdf\x62\x71\x74\xd9\x42\x0f\xc4\xe9\x91\x44\xbd\x1f\xe0\x84\xe6\x38\xa2\x7f\x92\x9f\xf8\x0b\xfd\x17\x10\x7b\x74\xda\xbc\xf9\x07\x13\x0f\xae\xc6\x86\x4e\x38\xd2\x8c\xac\x81\xf1\x7e\x00\x40\x57\x4e\x52\xfa\xec\xca\x71\x9c\x91\x4b\xf4\x00\xb5\x7e\x4b\x5a\xeb\x76\x30\x4f\x96\x83\xe7\x2f\x8c\xb5\x3b\x08\xd9\x45\xec\x77\x61\xbf\x3a\x45\x57\xcf\x64\xa8\x8e\xcf\xe2\x11\xe8\xb8\x79\x2d\xf7\xea\x2a\xc5\x8e\x67\xab\x45\x86\xf4\x9e\xf0\xc7\x59\xe6\xbf\xe2\xaf\x9a\x51\x8d\xef\xa5\x65\xb8\x6b\x52\x88\xf2\x27\xa5\xfe\xc0\x7f\xa8\x0f\xfc\x71\xa9\x3f\xf0\x1f\xda\xd1\x2b\xb4\x3e\xf0\x1f\xda\x2a\x6e\x62\x7d\xe0\x3f\x74\x1f\x91\xdd\x47\x64\x7d\x80\x47\xa8\xd5\x3d\xff\x69\x06\xe0\x7c\x14\x3f\xcd\x20\x9c\x8f\xe2\xa7\x19\x88\xf3\x51\xfc\x34\x83\x71\xfb\x8c\xec\x8f\x1b\x4e\xd1\x06\x27\xb5\x8b\x5a\x7c\x5d\xf9\xbf\x7c\x19\xf9\xbf\x7c\xd5\xc0\x30\x79\x22\xfe\xe5\x6b\x22\xea\x01\xba\x43\x4d\xf5\x97\x98\x9a\xa8\xad\xfe\x12\x83\xd6\x62\x96\xc6\xd6\x85\x60\x3c\x22\x79\x4d\x2f\xdd\x14\xbc\x44\x4c\x99\x10\x8a\xa8\x08\x55\xfc\x3e\x1a\xe8\x70\x97\x4b\xab\x42\x38\x2b\x28\xee\x4f\x71\xf6\xe6\x22\xd6\xcf\xa8\x56\x4a\xc6\xad\x4e\x17\xb5\x5e\xe3\x9c\xa4\x14\x47\xbd\xdf\x5e\x1d\xa1\x79\x9c\xcd\x13\xfe\xbe\x22\xa1\x12\x93\x52\x92\xa1\x54\xc4\x36\x0b\x91\x26\x76\xe5\x3d\xff\xc1\x68\xdc\xe6\xcb\xd2\xe1\x04\x03\x72\x30\xfe\x5d\x1c\x24\xb4\xf7\x8f\xd3\x7e\xab\x83\x8e\xd0\x39\xa3\x21\x1a\x3c\x2b\x33\x43\x7e\xff\x41\x84\x4d\x55\xc1\x4b\xa9\x08\x46\x4a\xd1\xdf\x2b\xa9\xb5\x98\x2b\xaf\xf3\xe0\x39\x1a\xda\xe1\x55\x47\x8e\xc2\xbd\xbc\xf9\x7b\x2a\x03\x96\xba\x0d\xcc\x19\x79\x6f\x41\x91\x14\xb6\xac\x81\x8d\xc7\x5e\x13\x81\x1e\x92\xd8\xd1\x31\x6a\xdb\xdd\x18\x13\x6e\xbd\x0c\xfd\x64\x9e\x4d\x95\xd9\x75\x49\xf7\x1d\x3f\xc3\x9c\x3b\x8a\x15\x21\x6a\xe4\x2d\x98\xa5\xf3\x03\xa3\x80\x55\x80\x5a\xe9\xfa\x03\x78\x1f\x56\x94\x12\x0a\xc3\x6f\x2b\x23\x59\xa5\x81\xb7\x18\xa7\x3c\xfb\xda\x12\x58\x13\xf1\xeb\x12\x24\x5e\xd5\x4c\x4c\x0f\x18\xec\xc3\x6c\x0b\x9b\x2d\x48\xed\x9e\x0e\x6e\xb5\x74\x67\x17\x28\xe3\x8b\x07\xca\xb8\xe5\x49\x54\xb6\x1d\x37\xe2\x6b\x13\xe1\x38\xc9\xe3\x36\x13\x9f\x02\x60\xed\x62\x54\xc8\x3b\x5d\xd8\xc3\xa3\x07\x28\xa4\xe7\xe8\x1f\xe8\x7e\xeb\xc8\x0a\xfa\x24\xc2\x3e\xbc\x63\xc9\x11\xea\x95\x47\x7d\x90\x55\x55\x4c\x65\xf8\x47\x25\x03\x39\xc9\x71\x6a\xf5\xb4\x24\x86\x44\x19\x84\x1f\xe3\xd0\x6f\x2f\x42\x53\x54\x35\xdf\x5c\x24\x87\x3a\x41\x50\x17\xc5\x2c\x9d\xe1\x28\x02\xdf\xd3\xd3\x57\x01\x8b\x7f\x98\xe7\x39\x8b\x21\xc0\x80\xd0\x8b\xdc\x00\x61\xd1\x26\x45\x37\xb7\x3f\x7c\x84\x1b\x0b\x57\x47\x2a\xe1\x23\xe7\x27\x02\xc2\xb6\x4b\x1b\x81\x1f\x29\xbc\x14\xb1\xdc\x4a\x6d\xe3\x80\x5e\xbe\x79\xad\x5c\xf7\x45\x28\x89\x32\xd9\xe0\x0d\x49\x10\xbb\x85\x3c\x99\x05\x83\x21\x2d\xb8\xa0\x99\xb5\x5a\x53\x12\x2b\xc7\x46\x74\x91\xe2\x24\xe1\xa5\x34\x46\x18\x59\xb7\x63\xc9\xca\xc9\x36\xa6\xd2\x0a\x06\x45\x7c\x77\x15\xd5\x10\x26\x39\x38\x64\x69\x0c\x3b\x95\x4d\xc1\x56\x44\x84\x60\x41\x2a\xf7\x95\x8a\x03\x71\x0a\x41\xec\xac\x50\x20\x26\x97\xd1\x12\xfb\xa0\x8c\xd3\x37\x48\xc3\x1e\x87\xad\x0f\x1d\x47\xc8\xe8\xc8\x18\xa1\x87\x17\x6a\x3c\xbe\xf4\x67\xad\x1c\xfb\x0d\xb2\xe3\x37\xf5\x58\xaf\xf6\x56\x2f\x6c\x88\xef\x93\x6e\xbe\xa8\x26\x7a\x0f\x54\x4d\x55\xb0\x51\x21\x8c\x9d\x0f\xbf\x32\x80\xab\x3f\x44\x5e\xa8\x46\xa3\xa5\x2b\x1b\x4f\xa8\xed\xaf\x6e\x93\x88\x8f\x9b\x4c\xa7\xee\x5c\xbe\x5d\x6b\x3f\x38\x45\x11\x18\xbb\x5e\x66\x74\xeb\x4e\xf6\xc1\x72\xfc\xaf\x4e\x96\xde\x91\x37\xbb\xe3\x30\xad\xfc\x9b\x35\x9e\x8b\xe1\x71\x02\x02\x09\x2b\xbe\x29\xe2\xde\xf7\x1b\x71\xff\x15\x81\xa5\x5a\x19\x09\x58\x1c\xe2\xf4\xb2\x65\x1c\x7f\xad\xb7\x3e\x42\x1d\x74\x54\x7c\xfc\xbb\x07\x79\x97\x80\x7c\x5d\xef\xd6\xdb\x91\x80\x7c\xb5\xfb\x68\x97\xbd\xfc\x46\x7b\x82\xef\xb2\x97\x97\x5d\x88\x1b\xf0\xce\xd6\x57\x6a\xf5\xde\x2f\xe5\x97\x3c\x67\x5b\x8f\xcc\x2e\xc9\x28\xae\x42\xa5\x97\x1c\xd7\x3a\xdb\xc5\xd5\xa4\xa8\xee\x90\x40\x94\xea\x16\x6d\x49\x9e\x3a\xdc\xc9\x53\x77\xf2\xd4\x1b\x2a\x4f\x4d\x76\xc1\x84\x9b\x05\x13\xfe\x89\xa5\xb3\x4a\x1f\xec\xe1\x4d\x13\xb9\xde\x6e\x79\x26\xc4\xb4\x1d\xb3\x74\xf6\x26\xa5\x13\x1a\x1f\xa1\x56\xce\x12\x14\x91\xb1\x1b\x19\x76\x6c\x07\x6a\xf8\xcb\x7b\xbc\x16\xb3\x18\x23\x80\xa0\x73\x4f\x23\x94\xb3\xc4\xfa\xb5\xb7\x87\x32\x88\xb6\x8b\x70\x94\x93\x54\xbb\x31\x65\x09\x09\x90\x94\x52\xf2\xdf\x33\x9c\x07\x53\x74\x4e\xb3\x39\x8e\xc4\xc7\x94\x64\xf3\x28\xf7\xc7\xae\x32\x4b\x47\x38\x27\xfc\x9e\x02\x8d\x68\xa9\x00\xf6\x21\xea\xa1\x21\xa8\xc6\x93\x45\x07\x65\x01\x8e\x48\x7b\xd8\x29\x06\xc1\x7d\x49\xe2\x8c\x1c\xd9\xc9\xe3\xf8\x7b\x96\xc4\x99\x18\xab\x92\x84\x09\x61\x88\x08\xc4\x04\x4d\x4e\xc5\xea\xf7\xd7\x1f\xe1\x7e\xff\x10\x3d\x58\x36\xc6\x6c\x9a\xd2\xf8\xac\x64\x17\xfd\x7e\x86\xfd\x43\x03\x64\xd0\x7f\x7c\xd8\xd1\x3b\xd4\x70\xe7\x71\x0c\x6e\x49\xa1\xd7\x99\xdc\x78\x31\x05\x53\x92\xc9\x47\x66\xbb\xa5\xc1\x3b\x59\x36\xc2\x79\x8a\xab\x5a\xaa\x6f\xfd\x6c\xca\xd2\x5c\x3a\x67\xc1\xff\x08\xce\x20\x43\x79\xb1\x8d\xf8\xc2\xff\x21\x6f\xe6\x26\xb7\x9d\x3d\x81\x86\xd1\x92\x61\x0f\x75\xd0\xb4\x2d\x8a\xc7\x33\x1d\xe0\x11\x90\x07\xc2\x8e\x9c\xee\xc4\xdf\x37\x4c\xfc\xed\x85\xe0\x35\x38\x27\x0f\x84\x4c\x3f\x5d\x19\x8a\xf7\x85\xaa\xb5\x9a\x4b\xa9\xea\x13\x5c\x44\x4c\x54\x41\x98\xc3\x95\xc2\xfd\x7a\xf3\x11\x5a\x2c\x2b\xa0\x70\x12\xe1\x4b\x13\x7e\x37\x4d\x41\x31\x83\x73\x2b\xa9\x36\x14\xae\xd0\xe3\xa9\xdc\xbc\x53\xe3\xed\x69\xed\x36\x1c\x00\x2b\xfa\xce\x69\x31\xc6\xaf\xf5\xf5\x78\x0d\x3c\xf0\x66\x2c\x02\x17\xcb\x7c\x7c\x72\xfe\x34\x43\x63\x16\xcc\x33\x7b\xff\x64\xc1\x8a\x4b\x1b\x02\xf1\xef\x8a\x15\xc5\xe1\x1f\xf3\x2c\x47\xe7\x9c\xc1\x0c\xe0\xe6\x12\x14\x1e\xbd\xe3\x5d\x43\xca\x58\xa9\x0e\x63\xa3\x1c\x43\x52\xc3\x73\x8a\x55\x6c\x4d\x34\x4e\xd9\x4c\xbb\x71\xea\x38\x92\x7a\x80\x42\xaf\xb7\x54\xda\x0e\x23\x2a\x78\xe2\xd2\x4a\x34\xa0\x71\x48\x03\x91\xd5\x10\xe7\xd6\x8a\xd1\x0c\x49\xf8\xd6\x22\xa9\x92\xab\x22\x20\xcd\xf8\x55\x36\x8f\xcf\x2c\x17\x73\x79\xb5\xd5\x00\x2e\x53\x17\xd4\x07\xab\x2d\xd3\x19\x58\x21\x3b\xcb\x03\xc7\xfa\x27\xd9\xaf\xa8\x3f\xf8\x02\xd1\x75\xed\x52\x1b\x06\xc5\x2d\x9e\x0b\x5d\xb7\xf8\x49\x1b\x90\xc2\xb2\x3a\x80\x45\x91\x9b\xb2\xc0\xa9\x20\x8a\xae\xaa\x89\xb0\x03\xd1\xfa\x2b\x07\x5a\x88\x72\x73\x51\x47\x39\x51\x9c\x17\xd8\x85\xc2\x04\xc0\x2e\x14\x46\x7a\x85\xc0\xb5\x02\x14\x7a\x6e\xad\x93\x1f\xb4\x56\x55\x29\x66\x8b\x2e\x8f\x1f\xab\x41\x16\x02\xc2\x72\x52\xf8\xe9\x93\x5f\x2e\x09\x4f\xc9\x17\x50\xcd\x91\x10\x54\x14\xcf\xec\x00\xb2\x62\xda\xbc\x0b\xbd\x79\xcf\xdc\x41\xab\x1a\x4d\x07\x6d\x20\xba\x43\x10\xe5\xcf\xae\x1c\xbd\x76\x23\x3a\x1b\xeb\x31\xd2\xf5\xe7\xb1\x16\x40\xc5\xe3\x76\xb5\x1e\x45\x63\xe8\x7a\x00\xe5\xd1\x92\x38\xb0\x1e\x8c\xd2\xf8\xbd\x6b\xc0\x31\xef\x99\xae\x83\x0e\xe2\x82\xa8\xd6\x43\xfd\xba\x46\x84\x60\x78\xba\x03\x15\xfa\xc5\x84\xd1\xae\x8c\x14\xdc\x0a\x71\x8e\x7b\xf2\x14\x1f\x21\xb5\x68\x65\xf6\xa5\x5d\xc3\x0a\x96\x90\x3f\x4f\x59\x56\xae\x87\xfa\x82\x81\x68\x1b\xf1\x6b\xe5\x6d\x9a\xf1\x91\x3b\x65\xca\x0d\x56\xa6\x94\x5c\x7a\x1b\xd0\x23\x6c\x36\x66\x2c\x30\xf7\x9b\x01\x55\x7a\x57\x6f\x64\x67\xe4\x0d\xb9\x99\x61\x4a\x96\x61\xa9\x16\x46\xf1\xd1\x4d\xe1\x2a\xd6\x78\x33\xa3\xd4\x2c\x4e\x3d\xac\x82\x36\x48\x10\xbb\x12\x4d\x90\x21\x45\x3a\x72\x45\x91\xd2\x18\x3d\x90\x05\xec\xcb\x47\x70\x35\x83\x31\x0a\xa5\x2d\x46\x6d\x7d\xba\x7f\xc7\x95\x49\x37\x4a\xfb\x72\xc7\x34\x5b\x22\x8b\xe5\x1e\x7a\x81\x26\x29\x0d\x1d\x4b\x4a\x1d\x3d\x8a\x45\x11\xbb\x80\x24\x47\x74\x94\x21\x9c\x21\x1a\x67\x09\x95\x42\xd0\x7b\x7b\x7b\xbc\xfd\x4f\x52\xd2\xec\x45\xc1\xe1\x9f\x7a\x2a\x38\xd3\xf9\x41\x0f\x47\xc9\x14\xf7\x27\x24\x1f\x31\x96\x67\x79\x8a\x13\x08\xd5\x14\xe1\x4b\x36\xcf\xf7\xc6\x11\x59\x8c\xd8\xa2\xc7\x87\xb2\x67\x9a\x7a\x89\xf5\xcf\x52\x9a\xe5\x6c\x4c\xd2\x3f\x58\x46\x92\xa9\x6a\x05\x8d\x46\x11\x1b\xed\xcd\x70\x96\x93\x74\x2f\x4b\x83\xbd\x20\xcb\xec\xef\xfd\x20\xcb\x2a\xe1\xa6\xec\x32\x22\x64\xf0\x78\x70\xb0\x07\x1c\x64\xcf\x1e\x8e\xdb\x6a\x26\x3d\xe1\xfa\x38\x9e\xcc\x23\x9c\xfe\x91\xf5\x59\x3a\xd9\x8b\x70\x4e\xb2\x5c\xcd\x86\x72\x6a\x23\xd9\x33\xbd\x4a\x7c\x29\x85\x68\x47\x42\x47\xff\x9c\x43\xf0\x4d\xa6\xa2\x9e\x71\xf4\x4f\xb3\x1c\x4b\xf9\x23\xfc\x8c\x2e\xf9\xf2\xcf\x58\x48\xa2\x23\x77\x24\x41\x96\xf5\xf8\xd9\x3d\x03\x4b\xc1\xbd\x2c\xa6\x49\x42\xf2\x0c\x26\x8e\x7b\x13\x0e\xbb\x97\x33\x35\x95\xad\x26\x21\xbd\x2b\x6a\xbd\x35\xa2\x74\xc8\x42\x7e\xbc\x7e\xc2\x41\xce\xd2\x2a\x37\x91\xc3\xa7\x0f\x6b\x1a\xd5\xaf\xb5\x5f\xdb\x8b\xc1\x5c\xa9\x89\x3c\xf4\x2a\x2e\x8f\xd4\xfc\x75\xab\x2e\xef\x8e\x0b\xcb\x97\x8d\x2b\xf2\xcf\xdf\xde\xbd\xfb\xf1\xed\x09\x7a\x8e\xde\x0f\xba\xe8\x49\x17\x0d\x1f\x75\xd1\xfe\x41\x17\x1d\x0c\x3e\x88\x58\x58\xff\x7c\xfb\xea\xe5\xc7\x93\x57\xff\xdf\x8f\x50\x49\x84\xa9\x1c\x76\xd1\x7e\x17\x3d\xec\xa2\x83\x2e\x3a\xec\xa2\x47\x5d\xf4\x18\x1a\x3f\xed\xa2\xe1\xa0\x8b\x86\xc3\x2e\x1a\xee\x7f\x78\x56\x12\xea\xe1\x9f\x29\x0d\xdb\x93\x88\x8d\x70\x74\x22\xb9\x32\x50\x9d\x75\x2d\xf7\x5b\x21\x3f\xb2\xee\x2b\x3c\xcf\x19\x12\x04\x9b\xc6\x13\x25\x65\x53\x14\x66\x79\xfc\x82\x16\xbf\x1c\x7a\x2d\xf4\xc0\xea\x44\x29\x12\x39\xd1\xfd\x01\x67\x34\xd3\x2a\x65\x5e\xf2\xcf\x94\x5d\x1c\x21\x99\x42\x7f\x86\x17\x32\x02\x61\x6b\x38\x18\xfc\x27\x84\x9e\x10\xc2\x0c\xb3\x36\xfd\x31\x4b\x7f\xc4\xc1\xd4\x0e\x34\x41\xff\x24\x25\xf9\x9f\x20\xaa\x27\xbc\x8b\x65\xca\x39\x2b\xf3\xd3\xde\x1e\x3a\x39\xa3\x89\x15\x0f\x92\xc5\x84\x5f\xe6\x22\xeb\x3b\xc2\x23\x76\xae\xf5\xc1\xe2\x54\x2b\x5f\xdf\x7b\xb2\xfd\x9b\x38\xba\x44\x67\x84\x24\xe8\x11\xca\xe8\x24\xa6\x63\x1a\xe0\x38\x47\x22\x4a\xa2\xd0\xfb\xc0\xfa\x89\x50\x90\xcf\xd1\x6b\x9c\x4f\xfb\x29\x9b\xc7\x21\x8c\x18\xed\xa1\xe1\x3e\xfa\x4e\x14\x27\xec\xa2\xcd\x37\xf4\x51\xa7\x83\xf6\xdc\xa2\x03\x50\x2a\xff\x67\x4b\xba\x42\x17\xa3\xf0\xcc\xf0\xa2\x17\x91\x58\x08\xe2\x85\xd6\x3b\x62\x99\x36\xfd\xd7\xbc\x45\x81\x1b\x91\xb5\x4b\x2e\xff\xfc\x62\x94\xed\xe9\x86\x82\x8f\x18\x0d\x0e\x07\x4f\xf0\xd3\xc7\x87\xe1\xe3\xe1\x30\x7c\x34\xda\x3f\x08\x06\xc3\xf1\xe1\xe3\x30\x3c\x3c\x38\x38\x0c\xf6\xf7\x1f\x3d\x7d\x3a\xc6\xc1\xc1\x5e\xc6\x6f\xdb\x19\x5d\xd0\x38\xdb\xfb\x08\x7c\x06\x2f\xf9\x8f\x5f\x1e\x3d\xf5\x26\x40\xe2\xb2\xf1\xab\x18\x21\x25\xa8\xc4\x17\x02\x8a\xf8\xfa\x7d\xd0\x01\x4b\x1c\xdc\x82\xd5\x36\xe2\x71\x85\x50\x50\x2c\x76\xf0\x99\x41\xab\xbd\x3d\xf4\x2f\x86\x62\x22\xdd\x64\x30\x9a\x91\x90\x62\xf4\xbf\x73\x92\x5e\x6a\x73\x01\x81\x1f\xbc\xcb\xfe\x3d\xdf\x75\x5c\xe0\xd7\xc2\x04\x83\xac\x10\x9b\xb9\x07\x31\x53\x57\x2c\x42\x9f\x11\x89\x32\x22\x1b\xdb\xb5\xde\x97\x06\x1b\xb1\xce\x2e\x9f\xbf\x15\xfd\xe3\xde\xe7\x32\x22\x30\xe7\x4c\x54\xbb\xe2\xe0\x3b\x87\xfb\x2f\x11\xe4\x45\x92\xa9\xb2\x53\x26\xf4\x61\x5d\x44\xe3\x90\x2c\xec\xf3\x06\x05\x22\xc2\x42\xf9\x09\x53\x4f\x47\xc7\xca\xa2\xe4\x54\xa9\xad\x97\x5d\x55\xee\xbe\xf8\x6c\x23\x80\x52\xaf\xf5\x94\x1d\xca\x1e\xda\x57\x48\x70\x21\x49\x4a\x80\xa3\xa0\xcd\xe9\x0a\xc4\x58\xd0\x60\xa4\xc9\x86\xb6\xb0\x68\xdd\x47\xff\x40\xdf\x72\x1a\xf2\x2a\x27\x33\xc7\x53\x30\xc1\x61\x08\x26\x0d\x56\x2f\xae\x6f\xa0\x85\x5b\x5e\x80\x96\xcf\xf7\x38\xab\x2a\xf9\x05\x74\x7c\x72\x22\x9e\x7e\xc0\x80\x73\xf4\x3d\x42\xad\x01\x1a\x02\x05\x6e\x75\x55\xe1\x4b\x9a\x92\x40\x1a\xeb\xa4\xec\x42\x7c\x70\x52\x6a\xf3\x5a\x3d\x69\x73\xaa\x5a\xfd\x9e\xe2\x04\xa2\xf7\x5c\xa4\x38\x11\xc5\x7f\xcc\xb3\x9c\x8e\x2f\x8f\x85\x31\x83\xdf\xee\xaa\x26\x4a\xb5\x6e\x22\x7c\x25\x79\xbf\x98\xc6\x24\x35\xab\x39\x62\x8b\x13\xfa\x27\xac\x66\x6b\xc4\xd2\x90\xa4\xbd\x11\x33\x79\xc3\x4d\x10\x22\x27\x9d\xb8\x35\x3d\x39\x39\x77\x8f\xd5\xb5\xa1\xed\x48\xd4\x3e\x36\xee\x58\xef\xc5\x40\xed\x85\x8b\x61\xad\x41\x4b\xdd\x98\x76\x52\xe6\x56\x86\xe6\xc2\x60\x02\x82\x23\x83\x4e\x08\x02\x20\x63\x74\x3a\xa6\x93\x79\x4a\x5c\x5d\xb9\x1a\x5f\x2b\x54\x5b\xdc\x5b\x64\xbd\x80\x45\xf3\x59\x6c\xe1\x9c\x8f\x04\xb2\xc2\x32\x08\xbd\x94\x9c\x93\x34\x23\x4b\x21\xe9\x8a\xd5\x10\x53\x76\xd1\x00\x9c\x5d\xcb\x81\xc5\xb7\x89\x83\x91\xd8\xe8\x42\x70\x31\xb5\xb4\x1d\xfc\x5b\xde\xbf\x85\x08\xe5\x7d\xc3\x49\xe9\x51\x7e\x54\x60\x6d\x44\xfa\x79\x03\xa4\x2c\x39\x7d\x1d\x00\xeb\xd0\x54\x00\xb1\x6a\x2c\x05\x44\xe2\xb0\x16\x0c\xff\x5e\x07\x64\x84\x33\x12\xd1\x98\x54\x01\xd1\xdf\x4b\x80\x48\xab\xa6\xea\x55\x31\x94\xa2\x7a\x5d\x2c\x20\xd5\x2b\x53\x4a\x72\x1a\x00\x2b\x59\x1d\x0f\x54\xc5\xfa\x58\x80\x38\x99\x26\xbd\x11\xc9\x2f\x08\x89\xab\xa1\xb9\xd5\x9a\x80\xc4\xc0\xc6\x2d\x83\x28\x6b\x39\x00\x25\x21\x2e\x5d\xf8\x02\x91\x2e\x5b\x7a\x0b\x40\xc9\x3a\x95\xd3\xf9\xc2\x4a\x59\x40\xaa\xd6\xa8\x00\xa9\x66\x95\x0a\xe0\x0a\xeb\x53\x01\xcd\x59\x21\x11\xc3\xac\x9c\x75\x01\x16\xab\xdb\x3c\xf6\x1c\x0e\x82\xf9\x6c\x1e\xe1\x9c\xa5\x4e\x00\xba\xbd\x3d\x48\xb9\x0c\xe1\xe8\xc9\x78\x4c\x82\x1c\xb1\x73\x92\x22\x3a\x9b\xcd\x73\x3c\xa2\x11\xcd\x05\xe3\x27\xc5\x4f\x09\x49\xc7\x2c\x9d\x71\x2a\x2f\xc8\xb6\xf3\xbc\x72\x7a\x91\x23\xe5\x9d\x09\xa6\x46\x5e\x8e\x56\x25\x13\xa6\xad\xb3\xb2\x81\x22\xef\xf0\x84\xfe\x59\x63\x87\x7e\xd5\xcc\x98\x52\x77\x32\xfc\x50\x9d\xe5\x45\x56\xd9\x5f\x5e\xe5\xe1\xf2\x2a\x07\xcb\xab\x1c\x2e\xaf\xf2\x68\x79\x95\xc7\xcb\xab\x3c\x59\x5e\xe5\xe9\xf2\x2a\xc3\x41\x83\x3a\x0d\xd6\x77\xb8\xff\x01\x42\x3e\xdd\xf5\x2c\x54\x3b\xe3\xd5\x5d\xec\x86\xed\xc6\x6e\xb0\x8d\x17\xcd\xda\x82\xe9\xe4\x14\x9f\x8b\x2c\x5f\xfc\x8a\x44\xdf\x05\xea\x89\xf2\x1d\x1a\x91\x29\x3e\xa7\x2c\x95\x8b\xfd\x3f\x6c\xae\xa2\x2b\x8c\xac\x58\x0f\xdf\x01\x23\xf6\x9d\xe2\xf2\x2d\x00\xf6\x52\xeb\x77\xcf\xba\x26\x97\xf5\xa3\xe6\x63\xd8\xe4\x80\x29\x3c\x95\x1a\x8f\xf5\x25\x08\x03\x45\xee\x9a\x53\x87\x57\x92\x2e\x15\xda\x8a\x58\x65\x5a\xe1\x0f\x25\x75\x02\x41\xe4\x12\x45\x2a\x1f\x4a\xc6\x6f\x37\x33\x14\x97\xa5\x5a\xea\x75\x99\x92\x3c\x98\x82\x09\xa2\x60\x9a\xba\xee\x1b\xd7\xe2\x84\xba\x3e\x2f\xd3\xf5\xd8\x11\xdf\xfc\xb6\x64\x96\xb0\x94\x1b\x9a\xa3\xe4\xd7\x97\xcc\xd0\x9d\x8c\x37\x49\x35\x2d\xb3\x0a\x9a\xf9\xaf\x9d\x0c\x34\xd6\xaf\xbd\xca\xf9\x40\xe4\x93\x46\x13\x0a\xcd\x93\x70\xc9\x7c\x40\x9c\xe1\xbe\x1b\xbb\xfa\x7d\xdb\x2d\xbc\x4f\xeb\xa6\x01\x9b\x87\xe4\x6e\x0a\xc3\x7f\x4e\x5e\x4e\xf9\x26\x9d\xfa\x14\x90\x4f\x27\xc0\xb1\x08\x27\x0b\x99\x75\x44\x92\x1a\x2c\x1b\xe9\x53\x51\x68\x09\x76\xce\x42\xf0\xb3\x6c\x76\x05\x09\x7f\x91\x32\x25\x29\x3b\xa7\x21\x09\xa5\xf5\x39\x3f\xa5\xe2\x64\xbe\x17\x9a\x85\x0f\xed\x3d\x9c\xd0\x3d\x19\xf4\xd7\x22\x03\x38\x0e\x65\x62\x42\x13\x68\xd4\x0c\x50\xd4\x5f\x95\xb2\xfb\x31\xc8\xd7\xa1\xec\x36\x8c\xcd\x50\x76\x0b\x62\x1d\x12\xab\xd7\xc7\x32\xca\xd3\x1c\x8b\x25\xc4\xcd\x9c\xc9\xf5\x49\x0d\x80\xe1\x88\x71\x75\x42\x73\x01\xa2\x92\x25\xd3\x51\x02\x43\x25\x5b\xf3\x44\x2b\x75\x63\x15\x4a\x0f\xce\x63\x4e\x52\x1a\x66\xde\xcd\x45\x33\x34\x61\x86\x4f\xa9\x1b\xbe\x95\x42\x0b\xa6\x20\xce\x04\xf8\x1e\xb0\x0b\x92\xe5\x28\x49\x29\x4b\xa9\x5a\x03\x91\x4b\xaf\x49\x1a\xce\xdd\x8b\xe8\xf6\xbf\x88\xb6\x8c\x7f\x70\xe8\xb2\xd9\xa9\xad\x73\xe0\xd4\xf6\x82\x86\x3a\x6b\x5b\x86\xe8\x18\xc5\x4c\x88\x0d\xd2\x42\xa2\xc5\x1d\x26\xee\x30\x71\x53\x98\x38\x0b\xd7\xc7\xc4\x59\xb5\xd5\xfa\x0e\x13\x77\x98\xb8\x22\x26\x46\x93\xf5\x31\x31\x5a\xc2\x2c\xef\x30\x71\x87\x89\xcd\x31\x71\x11\xd5\x63\xa2\x9d\xad\x77\x87\x77\x5f\x07\xde\x79\x8e\xc5\xa0\x99\x69\x12\x7d\x74\x23\x6e\xbd\x3a\x60\xa6\x5b\xad\x10\xa6\x54\x49\x15\xac\x2a\xb2\x44\x55\xa1\x39\x99\x99\xdc\xb6\x39\x99\x75\x4b\x74\x8b\xba\x82\x5d\xd8\x2d\x68\x7f\xdd\x6a\x50\x64\x0c\x2b\xa4\x84\xc6\x72\x8c\x96\x25\xda\xeb\x58\x5a\xb7\x68\x97\x63\x69\xf9\x23\x3f\xeb\x74\x51\xe2\xab\xf8\xd9\x75\x15\x7d\xfa\xab\xfc\xad\xed\x34\x52\x6c\x56\x89\xff\x30\x79\x74\xac\x1c\x3a\x26\x7f\x8e\x95\x3b\xc7\xe4\xcd\xb1\x72\xe6\x98\x7c\x39\x56\xae\x1c\x93\x27\xc7\xca\x91\x73\xe5\xd0\xac\x15\x4e\xce\x6e\x98\x56\xb5\xa9\xfc\x07\xdf\x43\xfe\xaf\xbd\x55\xfa\x37\xec\x89\x70\xae\x96\xab\xaf\x64\x03\x34\x9e\xf0\x3f\xc5\xb2\xf2\xbf\xe4\x12\xda\xef\xf2\x85\xf0\xa4\x9e\x89\xec\x3a\x22\xb3\x8e\xc8\xaa\xa3\x63\xbe\x36\x77\xf6\xdd\x8c\x7b\xaf\x63\xe6\xd3\x35\x08\xbf\x9e\xfb\xab\x32\xdb\xe9\xc2\xb1\x58\x0b\x86\x31\x23\x5b\x64\x60\x36\x76\x02\xba\x12\x65\xc7\xd6\xf9\x60\x0d\x12\xdd\xbf\xaf\xb1\xfe\x1b\xb0\x63\x5b\xaf\x47\xc7\x70\xc6\xea\x53\x97\xf3\x5e\xcd\x09\xe4\x5d\x71\x72\xe5\xb8\x7c\x99\xf3\xb8\xe6\x20\x94\xe5\x8c\xd5\x3f\x2f\xe2\x5d\xc3\xf1\x2b\xef\x15\xaa\xac\xd7\xa1\x67\x97\x62\xf5\x6b\x50\x9d\xf7\x6e\xd1\xa7\xf2\x31\x58\xd5\xaf\x32\x12\xcb\x5c\xc3\x1f\x8b\x3c\x86\x7a\x34\x8a\xac\xd6\x8c\x47\x35\x59\x6f\x44\x96\x69\x84\x35\x16\x59\xca\x87\xa1\x08\x66\xf9\x08\x54\xc5\xf5\x3a\x07\x13\xda\x45\xd6\xfa\xd0\x05\xfa\xfa\xfc\x39\xf8\x99\x5d\x0d\x98\x3d\x8d\x05\x6c\xeb\x22\xe3\xc7\x67\x21\x36\xf5\xaa\x1d\x64\x33\x3e\x5a\x4e\xf8\x37\x02\xcc\x39\xf8\xb3\x8e\x00\xcd\x0f\xfb\x6c\x23\xa3\x9d\x85\x7c\xb4\xfc\x46\xda\x08\x30\x7b\xb4\xb3\xb0\x23\x40\xdf\xbf\xcf\xff\xbb\x89\xd1\x46\x13\x3e\x5a\x7e\x55\x6e\x04\x98\x3d\xda\x08\xe8\x69\x34\xe1\xa3\x8d\x26\x1b\x19\x2d\xbf\xcb\xba\x70\x87\x6f\x04\x98\x83\xb7\x51\x47\x80\xe6\x78\x1b\xd9\xa3\xad\x8f\xaa\x20\x6e\x55\x0e\xf0\xd7\x25\xe9\x5f\xab\xd2\x6d\xe9\x54\xfd\xd2\x92\x5c\xa9\x77\xfe\xb2\x2d\x86\x9a\x45\x00\x97\xee\x4b\x7e\xf4\x6f\x97\x1d\xab\x07\xe5\x30\xaf\x5d\x33\x31\x11\x89\x6d\xc5\x9c\x63\x95\xc0\xc0\xf6\x19\x48\xdb\x2e\x94\xb8\x18\xd6\x1d\x0d\x25\x7e\x27\xec\x88\xee\x4c\x00\x8b\x5d\x34\x70\xf7\x3d\xb6\x81\xb8\x0e\xf2\x45\xb7\x01\x48\xde\x9b\xf0\x7a\xad\x5b\x56\x1a\xa4\x7a\xa8\x6e\xcd\x3c\xa5\x79\xe8\x14\xf3\x50\xde\xb4\x6d\x49\xe3\xc0\x1e\xfa\x7d\xbe\xaa\xfd\x47\xd3\x1e\xf4\xb3\xff\xae\x19\x70\x34\x5d\x00\x23\xed\xb8\x06\xe3\x8b\xa6\x83\x92\x72\x97\xab\xda\x4f\x34\xed\x6e\xb1\xec\xc0\xed\x84\xd7\x77\x45\x78\xdd\x98\xf2\xd4\x5c\x3c\x3b\x94\xf8\x2a\x51\x62\x56\x13\xad\x6a\x87\x12\x5f\x25\x4a\x44\xcb\x58\x93\x1d\x4a\x7c\x6d\x28\xb1\x88\x76\x28\xf1\xf5\xa0\x84\x1d\x52\xb0\xa0\x4d\x90\x52\x34\xdf\x57\x55\xbd\xca\x3c\x7f\x04\xe7\x43\x59\x2a\x2a\xcb\xb9\xc5\x8a\x4a\xe8\x07\x2c\x30\x26\xe9\x3a\x92\x5d\x57\x3b\x9a\xe8\x76\xda\xe2\xda\x0d\x4c\x60\x19\xdc\x0f\x1f\x75\xb5\x1d\xb3\xe0\xaf\x41\xef\xbf\xb7\x87\x5e\x84\x21\xc2\xc2\xcd\x85\xa4\x96\x5d\x49\xce\xb4\xb7\x26\xca\xd8\x8c\xa0\x29\x89\x78\x8d\x19\xc9\x32\x3c\x21\x19\xa2\xb1\x8c\x4e\x71\x4e\x22\x96\xcc\x48\x9c\x73\x70\x24\x3e\xa7\x29\x13\x49\xb9\xe0\xb7\x13\x6d\xa5\x17\x93\x45\xde\xe3\x4f\x57\x44\x67\x09\x4b\xf3\xbd\x98\xf5\xc0\x77\x34\x22\x3d\x19\x3a\x41\x44\xf3\x49\x69\xf8\xbb\x1c\x93\xd0\xec\x3c\xbb\x77\x8f\x8e\x51\xbb\x52\xf0\xd9\x32\x82\xcf\x96\x31\x5d\x90\xdb\x2d\xcd\x0b\xe0\xc8\x5b\x45\x2a\x54\x96\x39\xf6\x2d\xde\x55\x4b\x46\xcd\x71\xc6\xe0\x58\x48\xc8\x62\xdb\x50\xa2\xa1\x9c\x97\xb7\xee\x0a\xb5\xba\x90\x10\xab\x48\x2a\xdf\xf2\xa7\xe0\x4f\x74\xf1\x9a\xa0\x1e\x0a\x70\x1c\xb3\x1c\xcd\xe8\x02\x45\x64\x82\x83\x4b\x64\x84\xbf\x60\xd2\x1d\xcc\xd3\x94\xef\xd2\xcf\x6f\x8e\x51\x82\xf3\x9c\xa4\x71\x79\x20\xba\x31\x0e\xc8\x88\xb1\xb3\xbd\x71\xc4\x2e\xf6\x68\x96\xcd\x49\xb6\x77\xf0\xe8\xe0\xe0\x3f\xe0\xef\x80\xcd\xf8\xb0\x7a\x0f\x1f\xee\x1f\x3e\x1c\x3c\x1d\x3c\x75\xe7\xed\xc8\x9c\xc5\x2c\x5d\xfc\xb7\x16\xb3\x6d\xc9\x8b\x64\x50\x62\xfb\x40\xd4\xd7\xb4\x30\xbf\xbe\xa2\x46\xf5\xfa\x6a\xd1\xc4\xab\x01\xc2\x27\xf9\x71\x16\xd6\x7c\xcc\x66\x75\x1f\xd5\x79\xaa\xef\x5d\x9c\xb3\xfa\x3a\x0b\x7f\x4d\x44\x3f\x32\xfd\xca\xd5\x03\x87\x02\x22\xa3\xcf\x9d\xb6\xb5\x9d\x5b\x8a\x19\xfa\x70\x83\x31\x43\x37\x10\x04\x74\x6f\x0f\xa1\x0b\x82\xcf\x84\x03\x70\xf1\xb8\xdb\x87\xb9\xf8\xb5\xad\x49\xe0\xbf\xf0\x8c\xbc\x8a\x7f\x4c\x53\x96\x56\x11\x94\x32\x38\x6d\xf9\x37\xe8\x6f\x3c\xda\x60\x5c\xec\xa5\x65\x0c\xff\x47\xc6\xfa\xb6\xbb\xed\xa2\x88\x05\x22\xcf\x02\x54\xf9\x69\x1e\x45\x90\x27\x57\x87\x04\xe0\x63\xb1\xbf\x9c\xe0\xb1\xca\xd2\xac\x8a\xd0\xa7\x4f\x1a\xbe\x0c\x7f\xe5\x44\xf8\x82\x21\xbc\x57\x35\x3e\x08\x2a\xea\x06\xcc\xff\x46\xd4\xb1\x67\xf4\xa1\x63\x85\xf4\x91\xd3\x8a\xc9\x05\x82\x75\x6a\xb7\x20\xc9\xb6\xca\x7d\x72\xda\x42\x0f\x8a\xa3\x7c\x80\x5a\xa7\x88\x8d\x45\x3e\xa8\x16\xd4\x29\x5b\x73\x51\x6f\x36\xcf\x72\xdb\xd1\x0c\xaa\xdb\xe3\x81\x6a\xfd\x56\x47\x86\x0d\xd0\xd1\x90\xcc\xe0\xe6\x51\x24\xe3\x24\x49\x82\xab\x3f\x59\xbb\xf6\xac\x22\x5a\x6f\x11\x41\x9e\x15\xf0\xff\xe0\x66\xe1\xff\x2e\xa3\xe2\x97\x8c\xe9\x3b\x21\xbc\x38\x67\xfc\x90\xbd\x19\x57\x0c\xe1\x49\x45\xf5\xba\x70\x9a\x6e\x4d\x37\xfc\xe9\x31\x8e\xa2\xe3\x29\x09\xce\xaa\xe6\xfc\xb4\xa2\x7e\xdd\x54\x3d\xc8\x5e\x4c\x53\x88\x73\x5e\xd5\xdd\x70\x50\x56\xbb\xb6\x33\x0b\xa8\xc9\x09\xc9\xb2\x8c\x8e\x22\x72\xcc\xe2\x2c\x4f\xe7\xfc\xf8\xbd\x85\x93\x5b\xd9\xef\x70\x79\xdb\xba\x51\x54\x77\xa8\xe1\xd2\x78\x4a\x52\x9a\x57\x4f\xbd\x58\xb5\xae\x47\x0d\xae\xb3\xcb\xc3\x59\xc4\xbe\x6b\x0d\xd8\xbb\x8b\x52\x7b\x83\xa3\xd4\x6e\x3a\x07\xa8\x0c\x54\x37\x34\x41\x03\xa5\x29\x34\xcd\x72\x40\x09\x08\xac\x16\x93\x42\x04\x3b\x9d\xd0\x53\x87\x33\x34\x25\x26\x37\x68\x4a\x22\x9c\xd3\x73\x37\x7a\x98\x6e\xf1\x97\x0b\xe2\x1d\x4b\x54\x66\x46\x3b\x31\xa6\xd7\xd1\x0f\x2c\xcf\xd9\xac\xac\xa2\xdd\x47\xe8\x26\xf1\xac\xef\xc1\x8e\xf3\xb8\xb4\x17\x1d\xae\x51\xe5\xe3\x9c\x8f\xa6\x04\x87\x76\x54\x42\xbb\xb7\x81\x09\x4b\xb5\xf1\x74\x92\xbb\x68\x3c\xbb\x68\x3c\x5f\x6f\x34\x1e\x3e\x67\xce\x22\xe8\x5c\x8b\xf2\xd8\xa1\x90\x64\x74\x12\xcb\xa5\x3e\x23\x97\x23\x86\xd3\x10\xbc\xbc\x66\x8c\x2f\xa9\x48\x6e\xa8\x12\x60\xaa\x4d\x11\xf0\x21\x46\x00\xcd\x84\x53\x18\xfc\x01\x16\xe9\x7d\xe4\x3c\xe8\x68\x86\xf0\x39\xa6\x11\x44\x1e\xce\x19\xef\x31\x20\x71\x88\xe3\xdc\xc2\x3f\x84\xc1\x47\x4d\xc0\x95\x59\x22\x75\x2e\x3a\x13\xeb\x44\x10\xaa\x3a\xc9\x79\xd5\x02\x14\x26\xae\xa6\x94\x92\x19\x3b\xe7\xb3\x4a\xd9\x4c\xcf\xa8\x90\x42\xf4\x57\x45\x86\x1b\xf7\xfd\x5b\x26\x53\x44\xea\x85\xc8\x19\x4a\x70\x96\x21\x8c\x52\x32\x46\x01\x8e\xa2\x11\x0e\xce\x54\xd0\x68\x40\xf1\x12\x6c\xe5\xe5\x6f\xc9\xb8\xb2\x67\x8e\x83\x65\xe7\xa8\x9c\xe8\x75\x4d\x4e\xcd\xd3\x5f\x68\x96\xbf\xca\xc9\xcc\x4a\xaa\x6b\xd1\xe7\x5b\x4c\x0a\xf5\xd5\xc1\x67\x68\xdf\xf6\xed\x8f\xd0\xee\x5b\x6d\x38\x2b\xae\x7c\x10\x92\x69\xc6\xdb\x88\xc8\x78\xf3\x2e\x2a\xb4\x01\xb9\x88\x86\xc9\x2b\xb5\x9d\x58\xd4\xde\x6b\xc9\xc0\xcb\xa7\x34\xeb\x42\x03\x37\x5e\x21\xb4\xaa\x7e\x7b\xf8\x00\x60\x5c\xfd\x8f\x7c\xd2\x39\xfb\xf8\x91\xb3\x42\x00\xc1\x7b\x16\xba\xf3\xe8\x74\xfa\x90\x2b\x57\xc2\xc0\xe9\x64\xce\xa9\x46\xd6\x31\x36\xc7\x62\xf0\xd6\xd3\xcb\x5f\x89\xf7\x62\x92\x67\xe4\xf2\x08\xb5\x26\x24\x3f\xe6\xf7\xe6\xb1\x38\xa4\x92\xe7\x91\x72\x05\x2b\x2c\xb6\x53\xab\x6d\x04\x41\x0e\x9f\x65\x71\x21\x7c\x7c\x7d\xe9\x26\xc7\x4b\x94\x84\xe6\x99\xe1\x0d\x54\x7c\x7b\x31\x90\x94\xc4\x21\x49\x2b\xfa\x17\x1f\xdb\xae\x0c\xcc\xf7\x4d\xd4\xe5\x89\xe4\x21\xcc\x18\x4c\x6e\x6d\x3b\x2b\xe9\xc7\x52\xff\x45\x54\xe2\xc3\xf8\xb1\xc2\x89\x11\x95\x38\x32\x7e\xac\xf0\x64\x44\xc8\x27\x43\xa6\xb2\x5b\xee\x8c\xc4\x24\x59\xfd\x58\x9e\x65\x55\x2f\xba\x05\x0e\xd2\x1f\x5a\xdf\x35\x41\x30\x75\x74\x91\x5d\x4f\x52\x29\x53\x4b\x16\xd8\x75\x56\xf4\x03\xfc\xb8\x9a\x23\xa0\xbb\x12\x7e\xc2\x54\x91\x9d\xac\x8b\x5a\x7a\xf4\xc2\x5c\x11\x06\x29\x3c\xf8\x0c\x1e\x7c\xb9\x8c\x9d\x62\xfd\xe5\xae\xdc\xbf\xaf\xd3\x6c\xca\x59\xad\xe7\xd9\x27\x6f\xbc\xee\x66\xa0\x99\xed\x37\xc8\xd1\x24\x39\x26\x5a\xd1\xdb\xc2\x3b\x1f\x06\x91\xd6\x73\x00\xe9\xc2\x2b\x7c\x7c\xa4\x31\xf5\x73\xc7\x80\x2c\x41\x69\x2b\x37\x26\x52\x9e\x19\x92\xfc\x88\xec\xb9\x72\x2e\x9c\x32\x3e\xbb\xf7\xb9\xed\xcf\xc9\xb9\x2e\x80\x60\x97\xe8\x85\x6d\x1d\xef\x3c\x02\x12\x26\xa9\xa0\x9f\x74\x4e\xf3\x1f\x26\xe5\x9c\x80\x1a\x58\xd4\xd5\x56\xba\x29\x56\xa9\x24\xd3\x9c\x4e\x0d\x7d\x55\x75\x11\x1f\x00\xa8\x8b\xe4\x95\xe6\xcb\xb8\x0f\xef\x78\x5e\xb8\xeb\x97\x5a\x6f\x55\x08\x7f\xa3\x44\xe2\x3b\x89\x66\xa5\x44\x13\xa7\xb1\xe4\x01\xca\xd6\xe6\xc0\xaf\x58\x2b\xcc\x14\x55\xbe\x46\x69\xa9\xbc\x6e\x36\x25\x94\xfc\x22\x02\x49\x99\x83\xe3\xe1\x23\xed\x8a\x48\xe8\x64\x9a\xdb\x25\x63\x16\xe7\x27\xf4\x4f\xa2\xa4\x73\xf9\x65\xc2\x26\x29\x4e\xa6\x97\xfd\x64\xf1\x8e\xbd\x25\xb3\xf6\xf0\x49\xc7\x15\x58\xbe\x15\x40\x0e\x6c\xc9\x1d\x0d\x58\x5c\xe8\x78\x7f\xe0\x77\x6c\x4a\x1a\x74\xbc\x3f\xe8\x5c\xa7\xc0\xcf\x7e\xfb\xbe\x38\xc7\x39\x4e\x4f\xaf\x2e\x03\xd4\x68\x74\x35\x79\xd0\x55\x5c\x15\xaf\xe2\xa6\xb8\x59\x19\x94\xeb\x9e\x78\xfb\xe4\x91\x82\xaf\x02\x30\x2a\x1c\x12\xca\x20\x87\x97\x36\x76\xcb\x19\x0c\xf8\x52\x04\x47\x92\x82\xaa\x19\x0b\x89\x3a\xdc\x39\xb3\xb1\xeb\xbb\xbd\x7b\x8e\xa4\xe0\x55\x4e\x66\xe2\xab\xb2\xe6\x90\x42\x2e\x71\xd6\xe9\x18\xb5\x95\xd4\x4b\x3e\xcd\x9e\x5b\x8c\x87\x7a\xc6\x36\xf6\xe4\x05\x76\x4e\x5e\x03\x86\x97\x13\xcc\x25\x6a\xbd\x96\x59\x44\x7b\xbf\xbd\x3a\x42\x7f\x77\x87\xf7\x0f\x90\xdb\xd5\xce\x5e\x0c\x50\x4c\xfb\xff\xc5\xe2\xd4\xe7\x0c\xfd\x5d\x02\xe8\x43\x54\xec\x90\x41\x9c\x32\x48\xf8\x45\x73\x34\x8f\x23\x92\x65\xe8\x92\xcd\x11\x4e\xc5\x51\x4d\x59\x14\xa9\x54\xaf\x30\x88\x7f\x48\xc8\x3a\xf6\x6a\xab\x83\x8e\xd0\x39\xa3\x21\x1a\x38\x72\x13\xf7\x59\xab\xe5\x18\xf0\x84\x33\xaf\xdf\xf2\xc7\xef\x66\x62\x11\xad\x1d\xda\xc6\x7a\x9a\x96\xbe\x6e\x55\x4c\x99\xaa\x17\x53\xc4\x62\xfd\x60\xd2\x53\xab\xcf\x0a\x65\x1d\x82\x9a\xc8\x34\x4b\x13\x0e\xba\xcf\x5e\x07\x59\xfd\x87\x5f\x57\x6f\x43\xdf\x5b\x3f\x79\xe1\xa8\xcf\xc7\x9b\x1d\x1a\xbf\xab\x4a\x86\xe6\x8d\xc5\xef\xbb\x23\x44\x4b\x22\x5c\x80\x70\xa1\x77\x8f\x44\x59\x66\xef\x26\xcf\x2c\x0f\xca\x6c\x4e\xa5\x6c\xa1\xe5\x7e\x69\x6d\xe8\x49\x66\x41\x54\x8f\x33\x53\xb4\x25\x73\xbe\x47\x77\xfc\xa9\xb7\xb3\x7e\xda\xe6\x53\x6f\xfc\x0c\xb9\x06\x98\xbb\xe7\xdf\x17\xcd\x40\xfd\x4e\xf3\xea\x55\xf8\x3e\x28\xa9\x5b\xd7\x89\xa9\x75\xd3\xde\x81\xd7\x6b\x35\x73\x5d\x26\x29\xda\x6c\xa4\x35\x40\xc3\x47\xc9\xc2\xca\xb5\x79\x04\xd9\x55\x7b\x70\xff\x95\xe5\xda\xfc\x85\x8c\x73\x65\x8a\xa1\xb3\x6c\xca\x47\x60\x9c\x11\xab\xf3\xa6\xb0\x4a\xec\x42\xbe\x43\x8f\xcb\x3a\xf0\x2c\x51\x9a\x3c\x5e\x1f\x76\x6c\x00\xfc\x7e\x3e\x02\xe9\xfb\xde\x1e\xfa\x35\x25\x99\x74\x4b\xc1\x90\xf7\x9e\x53\xde\x34\xc6\x11\x0a\xe6\x59\xce\x66\xf4\x4f\x30\x97\xd6\x0d\x5f\x56\xf5\xde\x92\xca\xc1\xd6\xa6\x9f\xab\xb7\xe3\x59\x54\x9f\x2d\x47\x71\xda\x17\x2c\x6e\xe5\x3a\xfd\x0d\x09\xd1\xe8\x52\xa4\xf8\x50\xa4\xc4\x4f\x0b\xe2\x26\xf4\x04\x5d\x79\x80\x63\x69\x66\x20\x97\x85\x17\x08\x1d\x1e\xc2\x31\x9a\x1e\x40\x03\x82\x43\xfe\xb8\xc7\xbe\x92\xde\x10\x99\x2b\x24\xff\xd1\xd3\x91\xf6\x01\x34\x0e\x49\x9c\x93\xb0\xaf\x04\x0c\x34\xb3\x52\xfd\x80\x41\x04\x05\x41\x43\x4a\xf8\x93\x29\x66\x28\x22\xe3\x1c\x61\xe0\xb6\x10\x4b\xc5\x4f\xce\x92\x5a\x39\x7f\xc4\x39\xaa\x1d\x23\x7f\xe5\xd1\x19\x4e\x2f\x6f\xb5\x2a\x1e\x1c\xca\x48\xc0\xe2\xf0\xb6\xcf\xc4\x8b\x79\xab\xb8\xea\x77\x64\x91\x97\x3e\xe5\xb7\x1b\x04\xb7\x80\xf1\x56\x6c\x59\xef\x8b\xbe\x12\x04\x3a\xe9\x8a\xf2\xb7\x8e\xfc\xaa\x76\xc9\x04\x80\x55\x25\x3a\x5e\x2e\x47\x5b\x13\x30\x97\xff\xda\x56\x8c\xd7\xc2\x2c\x78\xa1\x1c\x31\xa8\x71\xd5\xd8\x20\xec\x2b\x1f\x49\xeb\x83\x0e\x17\xa7\x94\xda\xce\x0b\xf0\xd9\x6a\x21\x5a\xb7\xad\xdd\x5d\x4f\xf9\x2a\xd6\x5c\x6c\x44\x13\xa5\x6b\x73\x85\xab\xf6\x31\x5d\x57\xc1\x2a\x9f\xf4\x0a\xcb\xee\xdf\x47\xed\x22\x92\x7e\xaf\xbf\x1f\x35\x8c\xb9\x67\xb1\x97\x7e\xdc\x3d\xc3\x6d\xf0\x53\x7a\xa4\x75\xfb\xa0\xfe\x37\x8a\xdc\x26\xb2\x05\x1d\x04\x97\x2c\xf2\x65\x1b\x63\x4b\x1a\x34\xd7\xa0\x76\xb5\xa3\xb8\x1a\xef\xd4\xc1\xaf\x8e\xf2\x08\xd4\x47\xad\x6a\x95\x4c\x8d\x8d\xae\x53\xc0\x22\x96\x1e\x39\xa7\xc7\x5f\xc3\x11\x0b\x2f\x87\x37\x67\xf9\xf4\x48\xe5\x02\xde\x03\x55\xbc\x25\x9a\xe1\xf4\xf7\xfa\xa3\x1c\xde\x99\x90\x75\x65\x74\xb6\x86\x2d\x69\x1c\xb6\x0d\x28\xf2\x46\x40\x19\xa2\x7f\x8b\x99\x87\xc6\x31\x87\xac\x6b\xed\x76\x4f\xd7\x0e\x8b\xe0\x9c\xd5\x12\x33\x98\x12\xf6\x5d\xdb\xbf\x68\x26\x58\x97\x58\xec\xa4\x2e\x93\x0c\xb5\x31\x8e\x71\xba\x5c\x53\x6e\xbb\x29\x59\x2c\x1f\x83\x23\x89\xe5\x05\x5b\x92\xc3\x3e\xde\xb9\x95\x7e\x55\x16\x2d\x77\x40\xe2\x78\x93\x84\x81\x77\xc1\x28\x44\x9b\x62\x1c\x94\x5a\x75\x94\x0a\xe3\xb4\x47\x97\x32\xec\x38\x30\x69\x54\x80\x65\x14\xad\x12\x1c\x91\x3c\x27\x7d\x0c\xc3\x82\x7f\xce\xf5\x93\x74\x1c\x91\xc5\xc9\x34\xa5\xf1\xd9\x35\x3b\x72\xd9\x76\x1d\xaf\x02\x16\x9f\x76\xd1\xe9\xc9\xf9\x44\xfc\x29\x9a\x83\x2b\xd0\xe9\x4c\xe9\xbb\xe7\xb4\x47\x03\x16\x67\xa7\xe8\xe4\xdf\xff\x04\xd9\xcc\x26\xdd\xc2\x76\x26\x21\x77\xd5\x24\xe4\x45\xa5\x3d\x04\x38\xd3\x9c\x5a\x36\x20\x38\x96\xc8\xc8\x71\x4f\xa3\x63\x85\x45\x08\xff\xe6\x27\x50\xda\x59\x30\xac\x67\xc1\xe0\xd9\x27\x34\xb4\x47\x28\xea\xfe\x37\xc5\xfd\xf1\xbd\x75\xb8\x3f\x5e\x50\x62\x2c\xfd\xe4\x8e\x6b\xd0\xaf\x5f\xc9\x7d\x6d\x7a\xe5\x1d\x13\xb6\xd3\xc8\x1a\x7f\x76\xe3\xd0\x8f\x47\x19\x8b\xe6\xb9\x89\x07\x90\x4a\xc3\x5a\xf5\x3b\x67\xc9\x11\x6a\x1d\x0e\xfe\xd3\x8b\x18\x00\xce\xf0\xbd\x52\x4e\xed\xe1\x17\xe2\xac\xd4\x7d\xf6\xc3\x3c\xcf\xe5\xad\x96\x91\x48\x66\xd5\x92\x66\x7c\x3b\x8f\xfa\x1b\xc2\xae\x14\x18\x8c\x13\x25\x33\x79\xa1\x69\xff\x56\x78\x8d\x22\x9f\x51\xcf\x04\xd4\xea\x21\xfe\xba\xd2\x85\xdf\x51\x42\x64\xcb\x93\xcb\x15\x1d\x7b\x8b\xf2\x85\x72\xe5\xdc\x85\x93\x72\x1b\xc4\xe1\x65\x02\x49\x1f\x03\x4a\x4c\x33\xbd\x2a\x9b\xb4\xd1\xf4\x41\xdb\x4c\xa2\xf7\x6d\x4b\xd2\xc2\xa7\x77\x9c\xe7\xdc\x59\x6d\xde\x01\xab\xcd\x3b\xc0\x5d\x43\x43\x11\x0b\xb9\x72\x12\x07\x37\x8d\x0d\xff\x92\x91\xbb\xbe\x8a\x97\xc2\x88\x2d\x4e\xe8\x9f\xc2\x4a\x73\xc4\xd2\x90\xa4\xbd\x11\x5b\x58\x51\xc5\x62\xf2\xb3\x94\xe5\xb6\x0e\x9e\x24\x8b\xe5\xf1\xc6\x96\x5b\x5d\xfa\xa1\xbb\x1a\x09\x85\x4b\x65\xc0\x60\x59\x53\x30\x11\x1a\xb3\x38\xff\x09\xcf\x68\x74\x59\x62\xb3\x69\x3e\xda\xd5\x7f\x27\xf6\x18\xbc\xea\xe2\xe3\x6b\x12\xd2\xf9\x6c\x05\xcf\xc2\x52\x58\xbc\x8d\x63\x2c\x0a\xf3\xfa\x55\x29\x18\xff\xaa\x9b\xad\x54\x43\xbe\x3f\x1c\x0c\x3e\x14\x40\xbc\x12\xd6\xa1\x05\x10\x9e\xd9\x68\xa9\x0d\xed\xf2\x2d\x7b\x6a\xb7\xce\x72\x1a\x9c\x5d\x96\xbe\x36\xc5\xa7\x96\xf3\xb6\xd4\xde\x98\x7f\xbe\x8a\x43\xb2\x38\x42\x43\x55\x30\xc2\xc1\xd9\x04\x92\x32\x1d\x97\x0e\x76\x17\x83\xed\x2b\x79\x31\x5e\x7f\x0c\x36\xe8\x44\x31\xcf\xc0\xd4\x09\x5f\xc3\xd3\x91\x90\x2d\x7c\x85\x91\xda\xc4\xb2\x47\x2c\x2d\x9e\x10\xe1\x87\x3a\xcf\x94\x8b\x24\xd0\x08\x24\xe9\x12\xba\x98\x92\x58\x98\x4e\xcf\xf0\x19\xc9\x50\x46\xe2\x8c\xd8\x0b\x08\x67\xbb\x3e\x95\x45\x4b\xee\x85\x67\x62\xa9\xe8\xc1\x87\xea\xa8\x72\x7c\x3c\x10\x63\xeb\x44\x87\x09\x02\xb3\xe9\x98\xe5\x82\x52\xa9\xe0\x66\x39\x4b\x50\x38\x07\x34\xc9\x82\x94\x45\x51\x21\xc0\xda\x89\x24\x6c\xeb\xda\x6d\x97\x0d\xa3\x60\xbd\xdd\xcc\xf6\xba\x44\x86\xa2\x01\xfb\x92\x93\x52\x0b\xdf\xeb\xd1\xdc\xf8\xe1\xa3\x2a\xa2\x47\x09\xb4\x32\x9f\x23\x96\x7a\x46\xc4\x62\xe9\x7d\x03\x62\x51\xba\x4d\xd3\xdf\x65\x1a\x24\x3f\xc2\x13\x8c\xdd\x32\x0e\x3e\x91\x17\x9e\x6d\x00\xfc\xa5\x6d\x7c\xdf\xcb\x51\xa2\x07\xa2\xb1\x64\xfa\xfb\x01\x4e\x68\x8e\x23\xfa\x27\xf9\x89\xa6\x59\xfe\x0b\x3f\xbc\x69\xa7\x0d\x95\x3b\x1f\xba\x72\x97\x20\x9a\xbe\x3a\x8d\x1b\xb1\x10\x5e\x27\xc0\x93\xd8\x78\x1d\x2d\x4a\x2c\xf3\x66\xad\x8d\x4b\x42\x3b\x5d\xc9\xea\xb8\x54\xc6\xa7\x0f\xed\x2e\x0b\xf6\xba\x76\x04\xbb\x2c\xd8\x3b\x19\xea\x2e\x0b\xf6\x3a\x59\xb0\xc5\x55\x75\x45\xc6\x6b\x45\x2b\x6e\x7d\x21\x5e\x9b\x05\xb7\x2f\x54\x37\x24\x77\x49\xb4\xbb\x88\xca\x84\x66\xe2\xed\xa9\x17\xa2\xc8\x10\xd6\xdb\xf8\x9a\x0e\x3d\xd9\xbd\xfe\xb0\x29\x89\xbd\x01\xa8\xe4\xf4\xba\x64\x2b\xd2\xf9\x47\x83\xc1\x4e\x3a\x7f\x47\x4c\x7f\x77\xf9\x5d\x76\xf9\x5d\x6e\x5e\x7e\x17\xf8\xf5\x92\xcd\xaa\x34\x12\x4f\x0b\x35\x97\xc2\x7e\xc9\x66\xd7\x12\xa7\x50\x66\xc6\xab\x52\xa6\x0c\xf7\x9f\x14\xaa\xd6\x6a\x84\x64\x1d\x4b\x57\x37\x62\xf3\x38\xa8\x52\x2e\x1c\xee\x17\x6a\xd6\x81\x57\x75\xdc\xf5\xfc\xf1\x9c\xc4\x39\xbf\x47\x48\x2c\xc2\x2b\x97\xd1\xc0\x87\x35\x6d\x96\xee\x86\x53\xfb\x5a\x75\x5d\xaf\x59\x88\xa3\xca\xcd\x79\xec\xd6\xab\x83\x0d\x15\x74\xf5\x7f\xa6\xec\xa2\x6a\xd0\x83\xa1\x53\xad\x0e\x28\xff\xae\x2b\xff\x8a\x93\xca\xe5\x3f\x3c\x70\xab\xd5\x01\x85\x0a\x37\x4d\x87\x77\x6d\x0a\xb2\xbd\x3d\xf4\x5f\x92\x6c\x91\x50\xbf\xee\x11\x6c\xdf\x4a\x23\x7e\x97\xe2\x58\xa8\x34\x8e\xb5\x94\xac\x94\x3a\x0d\x1a\x8f\xbf\x08\x72\x83\x2a\x48\x0b\xb8\x4a\xe8\xb0\xc9\x01\x2b\x98\xcb\x46\x6c\x07\xdc\x7f\x33\x1e\x67\x24\x7f\x07\x59\x25\x83\xdc\xa4\xbe\x30\x52\x4b\x06\x35\xd0\x73\x34\x00\xb9\x8d\x95\xdf\x51\xa7\xc9\x80\xf7\x57\x3c\x9f\x8d\x48\xda\x52\x61\x07\x75\x33\x55\x0b\x42\xee\x21\x12\x65\x04\x60\xb8\x8d\x03\xc2\xd1\xbf\xd8\x98\x0f\xaa\x2f\x9c\x54\xd0\x1e\xda\xaf\x85\x31\x82\xcc\x42\xb5\x30\x74\xd8\x3f\x75\xa0\xa0\x0e\x08\x81\x8a\x8b\xf2\x0b\x19\xe7\x72\x55\xa6\x2c\xa5\x7f\x72\xba\xdf\x68\x5d\x4c\xed\xfa\x95\x31\xf5\xbc\x79\xf9\x00\x6a\x57\x07\xbc\x70\x4a\x16\xc7\x07\x02\xf6\xa4\x75\x30\x1a\x2e\x0e\x20\xdc\x98\xa5\xb3\x37\x29\x9d\xd0\xf8\xdf\x9c\x95\x6f\xe7\x6e\xa1\xa3\xce\x7e\xef\x7d\xec\x9b\x91\x75\x91\xff\x4d\x6d\xe9\x87\xfe\x0c\x27\x6d\x93\x8c\x23\xf6\x12\x9d\xca\xa5\x8e\x9d\x15\x46\xdf\xa3\x18\x3d\x40\xad\x64\xd1\x42\x47\x48\x04\x79\xec\xf4\xff\x60\x34\x6e\xb7\x50\x4b\x08\xfb\xf6\xf6\xd0\xc9\x5c\x24\x6f\x11\xda\x85\x77\x2c\x41\x23\x92\x5f\x10\x12\xa3\xfc\x82\x29\x6d\x54\xd6\x77\x66\x7d\x02\x75\x7f\xc5\x29\x89\xf3\x76\x02\xff\x48\x0f\x01\x83\x11\x44\x3b\x84\xc1\x07\x15\x61\xc2\x74\xa3\x70\xe5\x62\x4a\x23\x82\xda\xaa\xfe\xfd\xfb\xba\xe9\x37\xcf\x9f\x23\x01\x5d\xcd\xd7\x00\x95\x7f\xf5\xc5\x77\x4e\x68\x45\x80\x4b\x03\xff\x81\xa9\xa4\x0b\xc5\xae\xea\x75\xb3\xca\x3f\x2f\xb3\x54\xe0\x03\x48\xf8\x4d\xa5\x54\xc8\xd5\xe6\xca\xec\x9c\xa4\xe3\x88\x5d\xfc\x0f\xff\x64\x62\x4b\xa9\xe2\xff\x7b\x84\x5a\x22\xcf\xb8\xfc\xc0\x77\x81\xa1\x0b\x82\x32\x02\x5a\x2a\x94\xb0\x84\x57\x16\x3a\x2a\x9a\xb7\x32\x44\x66\x49\x7e\xd9\x57\xb5\x41\xb1\x35\x63\x59\x8e\x22\x7a\x46\xa2\x4b\xc4\x62\x04\x09\xa6\xf9\x1f\xf3\x8c\xa4\x11\x8e\x85\xe2\x06\xcd\x68\xfc\xbb\xf0\x4c\x1b\xca\xc8\xc6\x33\x1a\x2b\xe3\x08\x5d\x84\x17\xb2\x52\x2b\xc0\x51\xd0\x1e\x0e\x06\xe7\x17\xa8\x87\x1e\xee\x27\x8b\x4e\x4b\xd7\xd1\x36\x15\xba\xd2\xd4\xab\xd4\xba\x7f\x34\x66\xc1\x3c\xb3\x22\x5a\xb1\x79\x1e\xd1\x58\x1b\x5c\x18\x1d\xf9\xaa\x2a\x72\x71\x26\xe4\x4e\x98\x53\x53\xaf\xa3\xe3\x30\xda\xef\x97\x08\x93\x22\x32\x06\x65\xdd\x32\xa1\x93\xa4\x3c\x0d\x6a\x0a\xf2\x52\x53\x51\x9c\xd1\x0f\xbe\x3c\x56\x1d\xf8\x0d\x4c\x2a\x67\xc9\x66\xe7\x24\x6f\x94\xd5\x26\xc5\x37\x79\x15\x33\x08\x79\xa6\xe4\x2e\x83\x25\x46\x6d\x67\xde\xfa\x45\x60\x0c\xd2\xb4\xc5\xaa\x83\x2b\xb7\xd1\xa0\x19\xa2\x90\x82\xcb\x51\xdf\x4b\xcd\xf2\xa5\x0a\x75\x25\x6a\xe7\x0c\xf1\x8b\x46\x9c\x71\x39\x55\xa9\xb7\x96\x67\xde\xa8\x5b\x71\x1c\x4c\x59\xfa\x63\xa4\x65\xf3\x3f\xbf\x7b\xfd\x4b\xa5\x87\x64\xc5\x9c\x55\x94\xb0\x37\xe3\xb6\xd5\xbc\x53\x2d\xe0\xc5\xf1\xa5\xaf\x60\x37\x13\xd4\x63\xbe\xda\xec\xa4\xd2\x9e\xa5\x21\x8d\x71\x4e\x32\x08\x68\xac\x72\x38\xa2\x9c\xdd\xd3\x39\xd2\xc0\xda\x43\xa4\xe6\x6e\x65\x28\x88\x28\x9f\x3b\x4e\x09\xf6\x97\xe9\x57\x4d\x8c\x6b\x05\xd7\x82\x28\xad\x8c\x56\x2b\x23\x16\x02\x59\x24\x2c\xa3\xb5\x8a\x21\xc9\x49\x3a\xa3\x31\xc9\xf8\xa5\x17\x4c\xe5\xd8\x41\x35\xcc\x17\x2f\x25\x63\xe1\x19\x29\x16\xd2\x2c\x43\x43\x5c\x79\xcb\xdb\x93\x38\xa8\x36\x5c\x51\x67\x59\xe1\x56\xab\x8b\x5a\xee\x02\x16\x8c\x16\xdc\xfd\xa7\x71\x8e\x60\xff\x89\x1a\xfc\x05\xc4\x6f\xb3\x46\xd5\xca\x44\xc3\x53\xd5\xc9\xa9\xb0\x29\xc0\x79\x8e\x83\x29\xca\x59\x5f\xc3\x8c\x99\xb4\x94\x91\xc6\x18\x32\x8b\x9d\x37\x1b\x5e\xd3\x1f\xa5\x98\xba\xa8\xfe\x26\xe1\x45\xd9\x91\xf8\x65\x48\xe8\xfb\x1c\x1c\x17\x81\xc0\x75\x91\x20\x5f\x1f\x9e\x89\x5a\xf6\xfd\xf1\x9e\x6f\xae\xa9\x08\xb4\xfb\x83\xbf\xb6\xe2\xf6\x69\x84\x5e\x77\xf4\x6e\xba\x8b\xb7\x93\x75\x4e\x6f\x87\xcd\xdd\x5a\x2a\x69\xbf\x61\x63\x5d\xf4\xa6\x35\xb5\x37\xc4\xa3\x9d\xef\x31\x89\xc8\x39\xae\xa5\xa9\xba\xc6\x12\xba\x5f\x42\x2e\xf5\x5b\x89\x66\x90\xad\x92\x84\x88\xc6\x08\x0c\x95\x05\x9d\xcf\x53\x4a\xce\x89\xc4\x2e\x81\x6c\x92\x9c\xaa\x27\x8b\x34\xd5\xe2\x8c\x3e\xaf\xc5\x12\xb8\x03\x88\x1a\xad\x45\x5c\x75\xb0\xff\x22\x02\xbb\x30\xad\xe0\x9b\x38\xd6\x85\x34\xce\x68\x48\x4a\x2e\x69\x69\x3d\xa7\x96\x3e\xe5\x6f\xe3\xe8\x52\xbe\x99\x20\x71\x69\xf3\xcb\x5e\xd5\x00\x33\xb6\x3c\xc5\x39\x99\x5c\x22\xbe\x08\xe0\xf1\x3f\xc3\x67\x75\x6b\x81\xfe\x98\x67\x39\xc2\x23\x26\x56\xcc\xbe\x23\xdc\xe5\xe2\xbb\x36\x21\xf9\xb1\x80\xf2\x42\xf3\x4f\x15\xdb\x57\xcc\xff\x79\x92\x90\x80\x8e\xf9\xa8\xa6\xec\x02\x05\x11\xcb\x88\xb2\xc3\x23\xe1\x44\x2f\xfe\x05\x8d\x43\x76\xe1\xbc\xd4\x02\x1c\x73\x4c\x25\xd8\x42\x20\xe9\x91\x3a\x4d\x49\x36\x65\x51\xb8\x12\x1a\x69\xf1\xd5\x18\x4e\xec\x88\x8c\x59\x4a\x5c\x6a\xc4\x91\x0b\xc8\x23\x8d\x27\xa6\x53\x16\xff\xc8\xcb\x56\x25\x4c\x65\xc2\xb8\x35\xc9\x54\x09\xa8\xcd\x90\x90\x22\xe0\x4e\xed\xa2\x29\xa6\xa2\xe1\x92\x81\x3b\xc1\x6e\xd5\x4a\x56\x6d\x8a\xe5\xb2\xd9\xd6\xa0\x72\xd5\x48\xb8\x5b\xb4\x9a\xf3\xb9\xa0\xb9\x8f\x6b\x0b\xba\xb2\x5d\xdb\x5d\x5c\xb2\x8a\xd3\x59\xbe\x60\xbb\xb3\x59\x7b\x36\x17\x34\xf7\x8e\x26\x94\xec\x96\xac\x74\xc9\x78\xe7\x24\xcb\x81\xf5\x18\x11\x71\xcd\x87\xf6\x83\xf2\xbf\x12\x9c\xe2\x19\xfa\x4b\xf0\x8e\x9f\x11\x39\xe7\xcd\x80\x6b\x84\xbf\x32\x36\x4f\x03\xcd\x0d\xa8\x74\xe4\xf6\xfa\xbf\x15\x5d\x1c\x73\xd0\x2b\xf0\x1f\x9e\x65\xbe\x62\x2e\x68\x86\xce\x29\x58\x52\x58\x7d\x24\xa4\x9a\x31\x1d\x31\x16\x55\xf2\xda\xc6\xcc\xc6\xe6\xad\x81\xa9\x04\x4d\xec\x69\x91\xa9\x82\x72\x10\x7f\x5d\xc9\xb1\x26\x65\xd1\xaa\x3e\x35\x15\xb2\x07\x23\x20\xa7\xc1\x54\xd4\x75\x65\x0c\x96\x84\xa2\x95\x21\x26\xd4\x29\x6b\xca\x0c\xba\x68\xd1\x4e\x16\x9d\xa6\xa2\x03\x55\xdd\x2c\x9f\xa7\xd6\xd9\x09\x11\xbe\x06\x21\x02\x8e\xe9\x4c\x3c\x30\x2d\xe7\x08\xef\xc0\x19\x9a\x84\x33\x44\x73\xc1\x64\x71\x74\x05\x92\x9e\xd9\x89\x13\xd4\x2b\x4f\x38\x7c\x85\x94\xbf\xc6\xd0\x88\xc6\xa1\x74\x20\x7b\x7f\x7a\x7c\x72\x62\x88\xa3\x71\x7a\xc9\x4e\x3f\xb4\xa7\x79\x9e\x64\x47\x7b\x7b\x60\xdb\x12\xb0\xd9\x6c\x1e\xd3\xfc\xb2\xcf\xd2\x89\x28\xea\xe5\xba\x61\x6f\x92\xb2\x79\xb2\xf7\x1f\x0e\xb4\x1e\xef\xbd\x67\x39\x31\x78\xb8\x6d\x9b\x08\x5c\xe1\xd2\x51\x66\x0b\x57\xbf\x73\x24\xa4\x8d\x5f\x39\x02\xae\xb7\xdb\x27\x04\x12\xa5\x08\x55\x1f\x44\xb0\x9b\xe7\x8c\xef\x7d\x00\xf1\x7f\x02\x1c\x05\xf3\x08\xe7\xc4\x5a\x2b\x94\xd3\x19\x41\x23\xcc\x5f\xd7\x2c\x96\x81\x27\xcb\x16\xf5\xe5\x3c\xad\x97\x41\x2c\x3f\x2d\xf2\x79\xd9\x84\xe8\x10\xf1\x74\x5c\xf2\x4e\x85\x9a\xc0\xc5\xd6\x56\x14\xe7\x62\xa9\x24\x9a\x2f\xda\x87\xce\x87\x8e\x56\x07\xfe\x2a\x69\xbb\xe5\x1c\xde\xfe\x08\x7b\xf3\xad\x49\x0d\x0e\x4a\x18\x30\x45\xd6\x66\x81\xc6\x10\x59\x42\xe8\xa2\x42\x33\x50\x38\x6b\xb0\xb2\x5e\x5b\x69\x97\x75\x74\x86\x7b\xe6\x67\x4e\x66\x49\x17\x7d\xcc\xa7\x34\x03\xa3\xed\x5c\x7e\x34\xbe\x51\xc6\xfa\xd3\x8c\x40\x54\x97\xf0\x55\x16\xf7\x31\x4b\x51\x1b\x80\x46\xe0\xe2\x86\xd3\xc9\x5c\x28\xd7\x23\x12\x4f\xf2\x69\x97\x97\x64\xe8\x39\x7a\x91\xa6\xf8\xb2\xcd\x6b\xf1\xf5\x3b\x23\x97\xa0\x2b\x17\x7f\xfd\x1d\x5a\x8b\x1f\x0f\x1e\x74\xb4\x9a\x95\x37\x7d\xcf\x0b\x3f\xd8\x90\x45\x89\xca\xc0\x6e\x9b\x0c\xf0\xa9\xa0\xe7\xa8\x0d\x13\x14\x7f\x70\x32\x23\xed\xbb\xab\xcd\x3d\xfd\x39\x2a\x67\x1f\x39\xd7\xfe\x47\x7e\x6e\x72\xf6\xf1\x23\xfa\xf4\x49\xc0\xf2\x6c\x72\x0b\xdb\xd4\xe9\x80\x99\x77\x1f\xc2\x41\x4a\x23\xfa\xf7\x1c\xf8\x87\x7e\xc0\xe2\x00\xe7\x6d\x3e\xb7\x0e\x84\xc6\xe6\xc5\xea\x5f\xe3\xb0\xf7\x3b\x8d\xa2\xdf\xe2\x19\x9b\x83\x65\x80\xc1\x1a\xb3\x3a\xa2\xc1\x14\xc7\x61\x44\xde\x92\x8c\xfe\x49\xfa\x01\x8e\x03\x12\xb5\x55\x7a\x7a\x05\x34\x23\xf9\xaf\x46\x58\x75\x52\x88\x53\xa0\xec\x14\x0c\x6c\x3a\x2e\x33\x5e\x10\x86\x03\x1d\x2b\x85\x00\xdf\x79\x5b\x0e\xf6\x5c\xf6\x38\x29\xf6\xa8\x3b\xd1\xf9\xff\x91\x0b\xb7\x9f\x0b\xc7\x45\xd3\x8e\x97\x3c\xab\xa8\x0c\x79\x74\xdc\xda\xbc\xa8\xaa\xba\xc7\xae\xf8\xfd\xb8\x5f\x15\x90\xcf\xee\x32\xfe\xff\xec\xbd\xfd\x7f\xdb\x36\xf2\x20\xfc\xbb\xff\x0a\xb4\xcf\x6e\x28\x35\x92\xac\x57\xbf\xc8\x75\x7b\x49\xda\xee\xe6\x73\xed\xa6\x4f\x92\xdd\xbd\x7b\xb2\xb9\x18\x22\x41\x9b\x1b\x8a\xd4\x91\x94\x5f\x9a\xf8\x7f\x7f\x3e\x18\xbc\x83\x20\x45\xc9\x52\xe2\x26\xee\x7d\x6f\x63\x81\x83\xc1\x00\x18\x00\x83\x99\xc1\x8c\xa3\x53\xf5\xa3\x48\x47\xc7\x52\x98\xc9\x11\x62\x4f\x27\xad\xaf\x72\x68\xf6\xf7\x11\x2c\x3f\x9e\x4c\x88\x7b\x8c\xc0\xc5\x88\x4b\xfa\x24\xe0\xa2\x20\x1d\xf6\x34\x41\x38\x41\x51\x92\x90\x4c\xea\x1b\x93\x34\x20\x7b\x1a\x21\xbe\xae\x41\x7c\x21\x9c\x83\x64\xcf\x9e\x95\x3f\x6b\x33\x26\xa9\xfa\x1b\x57\x8f\x72\xef\xa2\x34\x14\x37\x06\x45\x0c\xaf\xa5\x35\x8d\x2b\xda\x34\x1a\x73\xd0\xa7\x58\x45\x38\xdf\xbc\x24\xe0\xf8\xac\x18\x90\x47\x28\x16\x93\xcd\xac\xa9\xe0\xf7\xa1\x92\x56\x88\x10\xc8\x26\x10\x73\xfc\x10\x33\xed\xe8\xa2\x64\x0a\x2e\x6a\x9b\xd2\xba\x54\x35\x17\x39\x89\x43\x8d\xcc\x32\xa7\xc9\xfe\x5a\x8e\x55\x2d\xd1\xa3\x8e\x6b\x72\xda\x06\x33\xc8\xf3\x56\xb4\xab\xb1\xaf\xde\x38\x2c\x21\x7d\xbc\x61\x55\x75\x2b\xbd\xb0\x4e\xb4\xca\x7c\x49\x19\xb5\xa1\xac\x5c\xdd\x74\x6c\x13\x08\x98\xa8\x89\x4e\x81\x8c\xc7\x72\xc2\x34\xd7\x3c\x01\x09\xa2\x36\x3a\x65\x4d\x6a\x90\xdc\x4d\x4d\x75\xfc\xdf\x42\x2d\xcd\x57\x48\x8e\x0a\xfc\x9e\x72\x59\x26\x0c\x3f\x6c\x09\xa1\x28\xa1\x42\x8a\xef\xd3\x0d\x53\x6b\x88\x35\xad\x2f\x3f\xa6\xe8\xee\xc1\x62\x61\x3c\x80\xba\xf6\x2a\xd5\x49\x05\x92\xaa\x10\x00\xa7\xb9\xea\x57\xac\x63\xe9\xcf\x88\xaf\xa3\x1c\xd2\x20\xe7\x28\xbf\x88\xc2\x42\x4d\x23\xb8\x19\xa6\x0b\xf4\xbd\x8d\xd4\xde\x77\x83\x28\x0c\xf9\x58\x57\x76\x00\xb1\xcf\xa7\x00\xac\x15\x56\x70\x03\x7a\x6c\x42\x6a\xce\x86\x7c\x6e\x7f\xb0\x47\xd4\xa6\xea\x1d\x27\x8b\xc3\x77\x6d\xf8\x12\x65\xef\x9a\x93\x66\x80\xde\x8a\x31\xbe\x63\xfa\x6b\x8b\x4b\xd1\xf7\x25\x9e\xf9\xf8\x11\x7d\x63\x43\xd1\x32\x0b\xae\x83\xde\x98\x39\xb4\x0d\x5b\x8a\xae\x10\x2c\xd2\x14\x15\x54\x3c\xf0\x3a\xc8\x7b\x95\x42\x00\x87\x0c\x36\xd3\x88\x25\xbd\x4b\x52\x48\x9d\x97\x13\x92\x88\xfd\x26\xf7\x33\xfa\xab\x05\x6f\xc9\x6d\x6a\x4a\xa3\xdc\x66\x4e\x92\x6d\x68\xe1\xf7\x98\xe0\x1c\x0c\x51\x79\x04\xa9\xf3\x20\xc6\x0c\x0b\x81\x7e\xdd\x65\x35\xcf\xa8\x8c\x1f\xcd\x17\x19\x37\x48\x81\xc7\x5d\x97\x5c\x2f\x48\x16\x91\xc4\x27\x3d\xef\x2d\x77\xb3\xfc\x4f\xe2\xb5\xf5\x0c\xdc\x15\x9c\xae\x39\xa7\xd6\xf3\x3a\x6c\x01\x2b\x99\x1d\xa6\x7e\x28\x76\x8c\x1a\x7e\x67\xdf\x39\xaf\x0c\xab\xf9\x4a\xa3\xef\xb1\x0d\xad\xb1\x3d\xdb\xa8\x7e\xb0\x76\x01\x27\x75\x23\x74\xca\xf7\xb5\xae\x05\x5e\x41\xdd\x68\x2d\xea\x46\x25\xc6\x37\x82\x49\x21\xe1\x03\xc4\xf6\x5e\x4f\x0b\x10\x25\x3c\x7d\xf8\x66\x6b\x7e\x2a\xe9\x71\x9a\x3a\x00\x9b\x27\xa7\x14\x92\xd4\x35\xef\xe7\x58\x7f\xe6\xd7\x31\xe4\xd5\xbf\x69\x7e\xe9\xe8\xd4\x70\x53\xaf\x00\xfc\x95\x1d\x4e\x86\xef\xb6\x09\x0a\xa6\x9b\xd5\x62\xad\x2e\x7e\x71\x7b\x8f\x3e\x9d\x8e\xcf\x25\x39\x48\xce\x40\xb5\x78\x6d\xd5\xb9\xed\x38\xc4\x75\x71\x31\x91\x8f\x86\xb4\x9c\xfc\x0e\x79\xdf\x74\x40\x56\xaf\xb0\x64\x64\x85\x30\x4a\x82\x9f\x5e\xfc\xf6\x8f\x34\x20\xad\xf2\x64\x48\xea\xd7\x21\x7a\x70\x70\x00\x57\x13\x32\x5f\x88\xa7\xc2\x4d\xae\x51\xda\xd5\xb2\x2d\x9d\xce\xd9\xed\x52\x7b\xeb\xe7\xb8\xdc\xbe\x61\x9d\x7d\x4f\x6e\xa6\xc8\xb3\x24\x44\xaf\xb3\xc7\xc6\x7d\x7f\x1f\xb1\x16\x73\x11\x4d\x66\x1f\x58\x5b\xc9\xa4\xba\x01\x5f\x54\xa1\xe2\x81\xd4\xa4\x9a\xee\x5e\x62\x54\x5b\x29\x95\x61\x82\x1b\xca\x27\x49\x9a\x80\x93\x16\xdd\x11\xa3\x80\x04\x6d\x7e\x7d\x86\x67\xad\xba\xdf\xf8\x4a\x21\x56\x4e\xe0\xfe\x3e\xfa\xcb\x2f\x71\x7a\xf5\x4b\x74\xfd\x1b\xd1\x26\x15\xb4\x32\xf4\x42\xa6\x58\x4f\xad\x4f\xe5\x33\x49\x27\x9d\xf1\xa5\x28\x29\x43\x29\x99\x53\x87\x64\xa5\x65\x68\xe5\x8d\x66\x55\x90\x1f\xca\x75\x34\x6f\x56\xa3\x8a\x28\x3f\xd9\xdb\xd3\x16\x5b\xa9\x9d\xd3\xd3\x92\xdb\x9b\xbe\xfa\xf8\x96\x66\xa3\xb4\x96\x9d\xba\x53\xa8\x0c\x2d\x72\x94\x3e\x7e\x44\x41\xea\x83\xaa\xa0\x47\x27\xf3\xa4\x54\x89\x5f\x22\x0c\x0c\x54\x3c\x7f\x9a\x2e\x41\xf5\xf8\x0c\xee\x07\x14\xaa\xd5\x2e\xd7\xfe\x97\x7c\x92\xe2\xbe\x52\x9d\x9e\xa2\x3e\xfa\xd1\x98\x0f\x25\xc4\x4c\xe5\x53\x8f\x93\xfa\x5d\x5c\x51\xda\x63\x1b\x7a\xc5\xe6\xd9\x52\x80\x1d\x8b\xc0\xb6\xbd\xff\x6b\x38\xf9\x51\x50\xb5\xd1\x3a\xb0\x96\x0e\x26\xfb\x00\x70\xae\x4d\xd9\x71\xb5\x36\xcd\x5b\x2a\xe4\xc6\x80\x45\x68\x5d\xb9\x12\xca\x3f\x62\xf1\xed\xb1\x84\x0c\xd6\xe6\xe0\xb8\xb2\xf2\x83\xcd\xb1\x4c\xeb\xee\xb7\xc6\x16\xcb\xb8\x7a\x58\xb9\x1c\xcb\xce\x38\x72\x29\x0c\x4b\x17\x69\xd7\x1a\x2d\xaf\xba\xa1\xbd\xec\x4e\x56\x5f\xdc\x95\xe4\x45\xd7\x99\x83\xa8\x47\x8f\xca\xed\xa9\xd5\xf7\x73\xec\xd9\x42\x8c\x5f\xea\x55\x19\xab\x4b\x89\x43\xdb\xb7\xeb\x3e\x7a\xc4\xb7\x7b\xf1\xdc\xd6\x94\xb7\xd9\xdb\x1a\xb3\x4e\x5b\xa7\xa7\xfc\xae\xc6\x7e\xa1\x53\x89\xe6\x44\x43\xe2\x1e\x3a\xab\x46\x2f\x95\x92\xc8\xe3\xd2\x37\x5d\x57\x80\xf6\xd1\x10\x75\x35\xaa\x3e\x7e\xa4\xd3\x20\x1a\xbb\x55\x43\xb2\xbf\x8f\xbe\x39\x05\x8e\x36\x02\xdb\xc9\xef\x77\xbc\xb2\x68\x22\x8a\x7b\x9b\x81\x89\x2e\xd2\x85\x57\xba\x93\xdc\xa4\x4b\x79\xc3\xf0\x2f\x70\x72\x4e\x0c\x32\xcf\x9c\xf8\xce\x78\x5c\x3e\xb0\x3b\xe3\x38\x4f\x11\x8b\x51\x42\x17\xa7\x08\x44\x77\x56\x66\x16\xe5\xc6\x27\x6c\x43\xa5\xdb\x10\xdc\x4f\x5e\x24\xf1\x0d\x04\x0b\xa4\x47\x2e\x3f\xbd\x8b\xab\x54\xd4\x8e\x58\x24\xb0\x57\xa4\x70\x37\x52\xa4\x28\x59\xc6\xb1\x4c\xae\x5d\xd5\x87\x65\xc2\x3a\x1c\x88\xab\x8c\x71\x8d\xb1\xe6\x90\xef\xca\x0e\x06\x72\x6f\x77\x40\xf4\x8c\x5e\xb3\x4a\x6a\x23\x15\xac\x4f\xd7\x8c\xed\xef\x83\xbb\x21\xd7\x66\x38\x1c\x05\xf9\x8e\xa9\xeb\x35\xe8\x52\x03\x84\xc4\xbd\x21\x5a\x72\x7b\xf5\x66\x58\xa5\x88\x32\x77\x42\xf7\xea\xb1\x35\xfc\xe8\x07\x34\x80\xcd\x46\xea\xe7\x07\x6f\x81\x97\xa5\xe8\x4f\x4f\x43\xfd\xe3\x54\x8d\xb7\x5b\x61\xa6\xf1\x77\x49\x33\x5b\x75\x6a\x2a\x13\x6c\xd5\x49\xa9\xb4\x6d\x55\x3a\x86\xb6\xbd\x01\xb0\xca\x9a\x26\x51\x33\x60\x57\x9e\x9d\xd5\xed\xd4\x1c\x9e\xa5\xe9\x64\x69\xee\x2b\xa6\x90\x7d\xb4\xee\x06\x20\x74\x8b\x73\xcb\x38\x41\xd8\x29\x33\x6a\x2e\x61\x8e\x6a\x44\xcc\xf2\xf1\x35\xda\x40\x6a\x1c\x59\x62\xe3\x4a\x51\x76\x54\x29\xcb\x6a\x01\x16\x05\xa8\x1d\x62\x11\x19\x61\x16\x25\x94\x19\x68\x11\x21\xcd\x3f\x5a\x03\x93\x65\x0d\xa5\x80\xd1\x0a\x29\xc0\x61\x11\xe0\xf5\xac\x2f\x7a\x25\x7e\x15\xd5\x80\x79\x89\x03\x88\x1b\x62\x4c\x38\xf0\x43\x29\x81\x92\xa0\x0c\x49\xec\x86\xaf\xa3\xc2\x84\xba\x8e\x8a\x32\x48\xa9\x55\x56\x56\x06\xb4\xdb\x84\x22\x03\x6c\x61\x4c\x26\xfd\xa9\x7f\x56\x8e\x3b\x1a\x90\x2a\xd4\x41\xb3\x34\xd6\xd9\x94\xfe\xd4\x3f\x3b\x54\xf5\x1c\xd2\xfa\x52\xaa\x64\x87\x24\xd0\xab\xe9\xdf\xdc\x15\x85\x01\xdc\x59\x53\x7c\x34\x46\x64\xbd\xa0\x9a\x1c\x29\x3d\xfc\xcb\x8f\xa2\xe4\x2a\x75\xbc\x93\x92\x25\xe2\x00\x41\x55\x71\x39\xe5\xa2\xa0\x3f\xca\xfc\x4e\x4b\x2d\x6e\xa6\x45\x9c\xc3\xb4\x3f\x21\x3b\xbb\xfc\x45\x04\xd4\x75\x54\xa8\xbf\x14\x0c\xb0\x0a\xfc\xbd\x60\x14\xa9\x69\xa7\xbf\xe8\xfc\xd2\x7f\x0b\xfb\x1c\xe4\x45\xfa\xcc\x98\x85\x62\xd0\x65\x9e\x3a\x84\xd6\x09\x60\x49\xff\xe3\xd1\x4b\xec\x74\xeb\x35\xa1\x2c\xf3\x8b\xf4\x6a\x0a\xdc\xde\x41\x4f\xb1\xff\x3e\xc8\xd2\xc5\xf3\x84\x7b\xc5\xb1\xd8\x59\x76\x64\x4b\x68\xa8\x19\x3d\x88\x47\x3e\x29\x13\x84\x0c\x41\x1b\x71\x1f\x7f\xd6\x60\xc7\xf8\xe2\x45\x89\xc7\x29\x34\xca\x95\x43\xbe\xa5\x7e\x73\x82\x81\xa3\xab\x7b\x1b\x32\x5c\xae\x9d\xfb\x8f\x72\x2f\x2e\x6f\x3c\x86\x27\xad\x73\xc7\xd1\xfd\x46\x5d\x5b\x8d\xf0\xdf\xb3\x77\x06\xb7\x0f\x50\xdd\xea\x46\xe0\xfe\x92\x2e\x8b\xa9\x63\xa1\xdb\x4d\xa6\xc5\x4b\x12\xea\xe7\x39\x2b\x69\x25\x69\x40\xda\xd6\xec\x70\x85\xdd\xd0\xd6\xac\x26\x32\x3c\x80\xf8\xef\x56\xfb\x75\xab\x37\xd9\x98\x63\x90\x88\x6c\xe3\x62\x9a\x6a\x4e\xb6\xe8\xb5\x43\xb4\x92\xbc\x07\x41\x06\x3a\x16\x9c\xf6\x18\x49\xfe\x69\x76\xa8\xa3\x6d\xf6\x6d\xb3\x7a\x7d\x9f\x5c\xf1\x91\x64\x9f\xd0\x07\x54\xe0\xec\x9c\x14\x53\xe4\x31\x63\x9e\xd7\x01\xff\xd6\x9c\xa7\x11\xb0\xf5\xb4\xb7\x56\xdb\x5a\x7c\x59\xf1\x5f\x7b\xcf\xfe\xab\xad\x89\x76\x6f\xe1\x07\xdf\x4f\xb8\xb2\xf3\x64\xef\xb6\x65\x77\xc2\x70\xea\x11\xde\x27\x8e\xd8\x89\xa5\xa7\xb1\xda\x3e\x5f\x7a\xdd\xc9\xfd\x80\xa4\x7c\xcc\x2e\x86\x50\xa8\xcb\xb3\xcc\xa1\x72\x8f\xb3\x4e\xc9\x2c\xb0\x39\x16\xcb\xe7\x4b\x45\x8f\xd0\xe6\xff\xa8\xe3\x7a\x5b\x34\x38\xd8\xbb\x3d\xb9\x73\xb8\x46\x3e\x8e\x10\xa8\x51\x79\x2f\xed\x22\x44\xe3\xe0\x7e\xa5\x5b\x7f\x88\xab\xf8\x10\x57\xf1\x21\xae\x62\xb3\xb8\x8a\x62\x93\x01\x35\x23\x86\x5b\x83\xf8\x73\xa7\x51\x17\x0d\x97\xe4\xca\x60\x76\x43\x37\x7c\x5d\x33\x06\xa0\x11\xc2\xef\x35\xa4\x8c\xa8\x60\xd6\x61\x19\x74\x55\xb0\x3f\x00\xba\x6f\xa1\xee\x3e\x71\xea\xfe\x8a\x80\x77\xc6\x24\x40\x64\x2a\xd0\x75\x32\x66\x13\xc9\x54\x48\x5e\xe4\xbd\x87\xa0\x78\x9f\x34\x28\x1e\x2c\xec\x16\x1c\x98\x46\x24\x33\x2f\x87\x0f\x1e\x7a\xcc\x55\xde\x8f\x41\xd5\x8d\x1e\xa3\xdf\x70\x71\xd1\x5b\xa4\x57\xac\x52\x07\x0d\xc1\xc5\xa6\xed\xc9\x28\x5b\x6b\x13\xae\x6b\x01\x76\xee\x07\xdf\xd4\x0b\xbe\x89\x0f\xfc\x3a\x1e\xf0\x5b\xc8\x18\x65\xbf\xb8\x12\xd7\xd5\xc6\xb9\x61\x9e\xa0\x3c\x4a\xce\x63\xc2\xe4\x76\xa9\x67\x2f\xbd\x08\xdb\x34\x00\x46\x65\xfc\xa2\xf5\xea\xdf\x25\x33\xc3\x5d\xb2\x32\x6c\x37\x30\x7e\x75\x3c\x0c\xed\x21\x60\x7e\xc1\x43\x0d\x48\x43\xd0\x09\x2a\xb2\xe8\xfc\x9c\x64\xcc\x6e\x0c\xec\x2a\xde\x0c\xa9\x67\x47\x7a\xde\x9e\xcd\x1e\x0a\xda\xcc\xf4\x35\x87\x16\xa8\x18\x8b\xaf\xf5\x5d\x72\xc5\x70\x7c\xa5\x4f\x8e\x1d\xa3\xf1\xb5\x3e\xf2\x77\x0f\xc5\xc3\x32\x79\x78\x98\x8f\xfe\x99\x13\x16\x37\x50\xf7\x74\x58\xe0\x3c\x47\x18\x65\x24\x94\xef\xe8\x85\x03\x04\x64\x4d\x74\xc4\xde\x92\x2a\xe1\xc6\xcf\xea\xed\x69\xc8\x59\x06\xd8\x35\x23\x46\x3d\x3c\xe8\xfd\x5a\x1e\xf4\xda\xfc\x02\x89\x23\xd7\xe6\x97\x40\xdc\x59\x42\xdd\x63\x8f\x59\xf0\x51\x94\xa0\x79\x14\xc7\x11\x4b\x03\x2c\x18\xe3\x7f\xa7\x4b\x88\xaa\x99\x43\x1c\xaa\x1b\x84\x85\x34\xce\xed\x25\x80\x0a\xc7\xb1\x86\x2a\xef\x50\xee\xa2\x6c\x73\x19\x05\x4b\x78\x70\x7c\x15\x15\x17\x08\x83\xd6\x80\xf8\x85\x1e\xf5\x60\x07\x2f\x95\x85\x21\xe7\xab\x78\x9e\x0c\xf3\xcb\x66\x17\x12\x2a\x68\xc3\x14\xf1\x58\x69\xb3\x1b\x98\xeb\xdf\x4b\xde\x5b\x7b\x2a\xa4\x1a\x5d\xe1\x6f\xdc\xeb\x54\x2d\xed\xf3\xa8\xb8\x58\xce\x7a\x7e\x3a\x67\x4b\xfa\xbf\x79\xc5\xd2\x6e\x23\x50\x21\x25\x74\x0a\x69\x2b\xfb\x70\x8b\xe4\x09\x1f\x36\x7d\x42\x4d\xab\xaf\x7c\x3f\x4d\x81\x76\xf6\x78\x5a\xa4\x9a\x40\x5f\xfa\xcb\x69\xda\xd1\x75\x9e\x4d\xc3\xc0\x6c\xfa\x66\x9a\xf2\xf3\x6b\xbe\x99\x54\xbe\x38\x29\xbf\x0e\x31\x8d\xad\x90\xca\x98\xbd\x15\x4e\x17\xd8\x8f\x0a\x3a\xcc\x5e\xdf\x3b\x29\x7f\x57\x1e\x7e\x4a\x49\xdc\xea\xf7\x0e\x27\x6d\xc3\x27\x77\x83\x87\x26\x40\x52\xc5\xeb\x63\xad\x1b\xcc\xd5\xa6\xaa\x27\xd2\x17\xec\x2f\xe2\x5d\xc1\x3b\xb7\xdb\x57\x21\x14\xc1\x0a\xb8\x07\x65\x06\x90\x1c\x58\x03\x8c\x95\x1a\x5e\x66\x81\xd2\x67\x99\xce\xc9\x12\x05\xb8\x1f\xd3\xcd\x47\x1f\x07\xad\x1a\xcf\xd3\xae\xce\x01\x78\x24\xbc\x2c\x52\xe6\x7f\x2b\x14\x66\xd0\x5f\xc3\x33\x57\x73\xfa\x75\xb1\x84\x68\xc2\xf1\xbe\x8b\x8b\x01\x06\x89\x56\x36\x07\x9b\x48\xd1\xf5\x32\x2e\xf6\xa5\xbe\x5e\x0f\x36\x7c\xab\xb6\xaa\xb0\xbf\xcf\x62\x4b\xf2\x03\x9e\x45\x00\xba\xc2\x59\x42\x4f\x57\x58\x93\x3e\xe6\x29\x9d\x75\x77\x55\x9b\x3b\x85\x39\xe1\x4d\x79\x48\x99\xb9\xa7\xe5\x71\x2e\xf7\x3a\x0e\x72\xa7\xf2\x2f\xd1\x50\xbb\xe3\x98\x1d\x81\x4a\x2e\x88\x15\xc8\xd0\x77\xa8\xdf\x3b\x38\x38\x90\x48\xc5\x9b\xc2\x8e\xa7\x96\x8e\x7b\x21\x0e\x1a\x2f\xc4\xc1\xca\x55\x18\x25\xe7\x2b\x16\x62\x94\x9c\x37\x59\x8b\xcc\x31\xae\xe1\x3a\x1c\xae\xb5\x10\x87\x0d\x57\xe2\xf0\x61\x29\xde\x61\x29\x5e\x47\x76\xe5\xaf\x6c\x25\x2a\xfe\x0a\x48\x8c\x6f\x2c\x80\xd1\x68\xb4\xc1\x52\xdd\xe2\x99\x79\x1d\x15\x35\x2b\xf5\x3a\x2a\x6a\x57\x29\x0e\x82\x9f\x93\x40\xcb\xa9\x66\xae\xd4\x0e\x4a\xc8\xb5\xe5\xf2\xae\xd6\x98\xf5\xbc\xd9\x26\xae\x7e\x21\x59\x4b\xd5\x58\x03\xfa\xa3\x91\x12\xd3\xd9\x15\xad\xd3\xd6\xe2\xb5\x9c\x14\x1c\x6b\x8b\x76\xa5\x23\xaa\xeb\x8f\x4e\x77\xfc\x72\x93\xc9\xd4\x6f\xee\xe8\xb9\xbe\xe2\x01\x24\x18\x7c\xb4\x07\x87\xf0\xbb\xd6\x05\xdc\xe9\x01\x6e\xfb\x50\x37\x74\xa1\xae\xf6\xa0\xd6\x1d\xa3\x1d\x7e\xd1\x5c\xa9\xa3\x40\x78\x81\x0e\x03\xab\x83\xa7\xec\xe7\x50\x50\xd4\xcc\xe3\x78\x85\xc3\xb1\x62\x26\x83\x8f\x9c\x47\x4f\x85\xf8\xb7\x91\xe7\x31\x38\x1e\xc3\x24\xd9\x1e\xc4\x75\x0e\xc0\xdc\xe7\x97\x0f\x12\xfd\x13\x46\xa2\xda\x7b\x97\xf5\x06\xfe\xa4\x64\x1b\xbe\xbb\x32\xef\x91\xa0\xdd\xe1\xb6\x78\xdb\x91\x8c\xd3\xd3\x87\x5e\x4d\x8a\x11\x83\xe5\x97\x34\x43\x39\xc9\xe8\x0d\x18\xa2\x8b\x33\x56\x16\x81\x5d\xf9\x1e\xf1\x8d\xb6\x6c\xa3\x84\x2e\x76\x36\x10\xfa\xee\x50\xb3\x63\xda\xef\x8f\x9a\xfa\x1e\x9b\x6e\x21\xcd\x7d\x90\xf5\x35\x24\x15\x67\x2b\x3c\x5d\x1b\x39\xff\x1a\xb6\xa4\xf2\xf5\xa5\xbc\x90\x4c\x30\x6b\x25\x99\x3b\x39\x07\x35\x0b\xcb\x1b\xc6\x14\x95\x37\x0a\xae\x25\x85\x7f\x64\xb1\xf0\xb1\xee\x18\x9e\xb7\x19\x09\xa7\x62\x09\x2b\x50\xcd\x13\xd4\xf2\x02\xad\xf4\xf7\xa4\x5b\xe4\x4a\x67\x4f\xb8\x30\xbb\x3c\x3d\x2d\xdf\x6c\xa9\x9b\x52\x6e\x94\x0e\xe5\xe6\x87\xdb\x15\x8e\x93\xcc\xb1\x47\x31\x02\xbf\x81\x9f\x94\x5c\x1a\x87\x9f\x33\xeb\xb4\xe8\x80\xe6\x1f\x74\x0a\x23\x61\xb9\x2c\xa2\x53\xc4\x9d\x25\x71\x9e\x47\xe7\xb0\xec\xd4\x59\xcf\x7c\x7d\xdb\xe8\x83\x52\xb9\x44\xe8\x14\x0d\x4e\x50\x84\xbe\x2f\xa9\x5d\x4e\x50\x04\x8a\x14\xb6\x83\xb0\xa0\xb8\xba\x0a\x25\x7a\x7b\xa2\xf0\xbc\x27\x37\x54\x1a\x64\x60\xb4\x12\xdd\x02\x38\x29\x0b\xa1\xe8\xe8\x5d\xe0\xfc\xc5\x55\x22\x3c\x38\x99\x73\x29\xab\xd2\xa1\x18\xda\x6d\xe9\x90\xfc\x86\x6b\x6c\xd8\x57\xf8\x75\x82\x6e\xe1\xff\x89\xac\x78\x00\x77\x82\x6e\xa5\xb3\x9d\x50\x05\x57\xba\x91\x88\x10\x84\x3a\xa0\xe9\xa0\xf5\xef\x28\x0e\x7c\x9c\x05\x2d\x85\x4d\xba\x81\xe1\x20\x00\xb6\xaa\xf4\x4d\x1b\x95\x40\xeb\x1c\xc6\x04\x8c\xe6\x2f\x37\x4f\x2f\x49\x7d\x13\x13\x17\x74\xbd\x8f\x9d\x04\xdb\x6d\xd2\xe4\x95\xbe\x7b\x87\x07\x0e\xd8\x3a\xfc\x0e\xa7\xbd\xdf\x57\x4c\xf1\xf0\xf0\xf8\x93\xb8\xdf\x55\x35\x20\xd9\x87\xb7\x40\x17\x81\x13\xbd\xd9\xfc\x89\x14\x7f\x61\xad\x25\xe4\xea\xc5\xec\xbf\x74\xdb\xbb\x3d\x91\x28\xbe\x39\x85\xb7\xbd\xc6\xe2\xe5\x8b\x4e\x6b\xac\xd1\x8a\x4b\x67\xff\x15\xcb\x8d\x35\x25\x16\x5b\xca\xff\x64\x2b\x8d\x7d\xd3\xf6\x4c\xa0\x94\x53\xcd\x3e\x02\xa0\x3e\x1c\xa6\xd6\xb7\x25\xf2\x93\x75\x90\x26\x69\x0b\x5a\xbf\x91\x9f\x91\xf8\x23\x0d\x0d\x40\xd8\x0e\x2e\xb2\xf4\x8a\x36\x87\xe8\xc4\xff\x9c\x65\x69\xd6\xfa\xf6\x19\x4e\xe0\xd9\x36\x8e\x63\x84\xd9\x79\x8d\x70\x8e\xb0\xdc\xeb\xbe\x6d\x97\x48\xab\x94\xf9\x5b\x39\x89\xc3\x0e\x20\x93\xa4\xd1\x22\xb3\x75\xf9\xc4\x80\x93\x00\xf7\xde\x0b\x9c\x27\x5e\x81\x66\x84\xd0\xbb\x70\x54\x44\x38\x8e\x72\x12\xa0\x2e\xca\x97\x0b\x10\xee\x75\x08\x96\x2b\x86\x91\x26\x5e\x55\xd3\x1e\x3c\x7a\x24\xaf\xfc\xf0\x9b\xde\xa4\xbe\x65\x12\xe6\xb7\x74\x03\x2f\x7d\x53\xbd\x44\x3f\xb2\xe2\x29\xa2\x14\x97\x78\x93\x29\xfe\x5b\xf9\x72\x06\x3b\x40\x87\x91\xc5\x76\x03\xde\x55\x8e\x5c\x7d\x60\xaf\xef\x65\x13\x94\x3a\xeb\xa3\xe0\x43\xe7\xd4\xbc\xa2\xb0\xf4\x3c\xcc\x48\x9e\x53\x32\xe6\xcb\xbc\x40\x24\x02\xe9\x79\x46\xe4\x03\x75\x35\x57\x1d\x78\x82\xff\x2d\x7a\x8c\x4a\xb4\xc0\x50\x09\xea\x15\x57\xab\x53\x8e\xdf\xf6\x35\x02\x0d\x72\x55\x95\x0e\xfa\x00\x61\xbf\xf8\xcc\x4f\x61\xa9\xc1\x85\x4c\x0d\x0e\x49\x96\x73\x92\x61\x78\x72\x16\xe2\x38\x27\x1d\x74\x95\x45\x05\x96\x6f\xd0\x20\xc4\x42\x18\x9d\x2f\x33\xac\xbd\x4b\x43\xb7\x6d\xb6\x4c\xf5\xc1\xe5\xf4\xe5\xa6\x23\xfe\x8f\xee\xf2\x8a\x09\x52\xb4\x69\x06\x84\x53\x0d\x44\xba\x02\x6b\x47\x93\x9c\x7e\x51\xc6\x6f\xf8\xfc\xfd\x91\xe1\xe3\x29\x1e\x02\x3f\x7a\x24\x9f\x27\xe5\x8b\x38\x2a\x20\x83\x6c\x2f\x4c\xb3\x9f\xb1\x7f\xa1\x45\x60\xf2\xad\xc4\xb4\x20\x44\xc9\xb3\x4e\xc9\x50\xbc\x45\x76\x6d\x6e\x9f\x88\x44\x8c\xe6\x01\xa7\x5d\x84\x65\xf1\xae\x69\xd5\x0f\xcd\x5a\x72\x81\x5e\x43\xa0\xe0\x02\x16\xdc\x95\xde\x39\x6e\x18\x3d\x09\x4d\x85\xe7\xdd\x79\x17\x48\x17\xce\x04\xcf\x09\x04\xb0\x98\x11\x19\x1d\x06\x02\x29\x44\x05\xd3\xd0\xcd\x08\xca\x97\x61\x18\x5d\x73\xf7\x6a\x82\xfd\x0b\x94\x17\xf8\x9c\x4c\x11\xe9\x9d\xeb\x96\xe3\x33\x45\xd5\xe9\xb7\x21\x0e\xc8\xb7\x67\x9c\xba\x1c\x9d\xd1\xdf\x5d\x20\xe6\xac\xa3\xff\xea\x62\xbf\x88\x2e\xc9\x59\x87\xe3\x60\x5f\xae\xa3\x42\x81\x5d\x47\x85\x84\xe2\x65\x4c\x8c\x3f\xeb\x00\xa9\x7a\x91\x00\xe4\xfd\xa4\xd3\xa9\x19\xbe\xf5\x71\x83\x6c\x4c\x71\x0e\xe9\x1d\x72\x9e\xd3\x29\xa0\xb0\x64\x41\x2f\xa2\x49\x11\xdf\x40\xe6\xdc\xa9\xde\xc3\xb3\xb3\xff\xf2\xcc\x85\x5a\x5f\x3f\x7c\x60\x45\xf2\x72\xe1\xcd\x6f\xba\xe2\xbe\x6e\x7c\x7a\x02\xc4\x71\x00\xf8\xdb\x86\xe3\xe6\x6b\x0a\xc0\xe2\x1a\x19\x1f\x1c\xf5\x2d\x28\xb8\xf9\x41\x6d\xb8\xfe\x6b\xc5\xae\xba\x1a\xcc\xed\xad\xec\xa2\xd6\xe1\xff\x01\x1b\xe5\x07\x96\x77\x01\x7d\x44\x66\x4f\x7f\x9c\x22\x91\x91\xa1\xdc\xcb\xd2\x47\xa0\xd4\x5d\x5a\x55\xe3\x3a\x2a\x9c\x85\x6e\x78\xde\x05\x99\xf1\x8d\x5f\xbe\x95\xbc\xa7\xf9\xc7\xbc\xba\xc0\x0b\x62\xbb\x35\x9f\x7d\xaf\x96\xe4\x0f\x67\xca\xd9\x88\x65\x09\x89\xe6\x73\x12\x44\xb8\x20\xf1\x0d\xc2\x61\x41\x98\xc3\x86\xc7\x26\x80\x2e\x30\xa1\xa3\xe1\xa2\x44\xc4\x39\x85\x2f\xd0\x5e\x69\x58\x7f\x11\x77\x34\xba\x75\x4c\xd1\xdf\x8b\x79\xfc\xb3\x88\xc2\x13\xe5\x4f\x00\x19\x5c\xf8\x67\x69\xca\x22\x5c\x98\x2e\xb6\xaa\x5f\x65\x77\xa6\xbb\x74\x86\xb3\x07\xed\x13\x43\xe6\x19\x6b\x4b\xf5\x6f\x57\x5d\x83\x2f\xbb\xea\x5d\xa9\x5b\x9e\x3c\x15\x70\x46\xd0\x77\xdf\xb1\xed\x3d\xf8\xee\x3b\x14\x66\xe9\x5c\x26\xed\x05\xe5\xfb\x96\x3b\x4a\x82\xdd\xf4\x93\xae\xeb\xbb\x73\xa1\x41\x2e\x6c\x2c\x3b\xa2\x55\x32\xd6\x66\x2c\xb5\xe7\x70\x24\xdd\xed\xa8\x12\x31\xa8\xdb\x64\x18\x7b\xb8\xcb\xcc\xc1\x5e\xa1\x72\x07\xa3\x27\xe8\x4c\x75\xe2\x4c\x3b\xf7\x99\xef\xd0\xb3\x57\xaf\x74\x0f\x30\x38\x28\xa5\xfc\x90\x2b\x4f\xa3\x28\xc9\x17\x2c\x3d\x19\x73\x4a\x22\xd7\x3e\x89\x63\x8a\xe7\x4d\x72\xde\x65\x35\x08\xf3\x38\x9a\xee\xef\x5f\x5d\x5d\xf5\x92\x73\x5e\x0a\xae\x84\x6d\x14\x47\xb3\x0c\x67\xe0\x56\x44\xb1\x9a\x2e\x89\x4a\x02\xc0\x68\x81\xa3\x0c\xd1\x2b\x08\x30\x66\x02\xa7\x70\xb0\xcc\x64\xc4\x2b\x79\xa8\x9f\x71\x39\x61\x0f\x72\x38\x06\xe8\x0c\xe4\x01\x26\x75\xe4\x32\xa2\x95\x72\x7b\x04\xe1\x28\x8c\xb2\xbc\x28\x6d\x4d\x2c\x28\x14\xc4\xd9\xa2\xd8\x98\x2b\x1d\xfa\x96\x31\xdc\xb7\x02\x5c\xcb\xbb\x09\x5f\xc0\xbd\x8d\x0a\x53\xf4\x46\xa8\x3d\x96\x80\x0e\xfe\x5b\x64\x8b\x3a\x8b\x12\x16\x92\x8b\xc5\x20\x3e\x3f\x8f\x99\x18\xc6\x5e\x65\x00\x88\x7a\xba\x06\xc2\xd4\x39\x29\xf6\x78\xba\xe6\x33\x72\x8d\xe7\x8b\x58\xc8\x44\x30\x5f\xfc\x0a\xca\x53\x9b\x9a\x10\x42\xb0\x51\x80\x30\x3a\x41\xc0\xf2\x86\xd2\x0a\x09\xb9\x2e\x50\x11\xf9\xef\x55\xf2\x64\x4c\xef\x1a\x97\x24\x01\xa1\x51\x3a\xe8\x01\x76\xcd\x57\x14\x3a\x21\xe7\x8f\xc9\x38\xdf\xa1\x68\xbe\x48\x33\xeb\xcd\x1d\xe3\x70\xaf\xc2\x7f\xd4\x00\xf5\x4e\x38\x42\xb8\x30\xa1\x5f\x70\x00\xb6\x83\x0f\x52\xcf\xdb\x41\xbd\x1e\xd3\xec\xa3\xdb\x36\x3a\xfd\x01\xb5\x28\x34\xfa\xde\x7c\xe4\x47\x8b\x10\xfa\x20\x40\x6f\x79\x01\xd7\xdb\x9e\x7e\x98\xf4\xfb\xa2\xac\x24\x7e\x42\xf9\x0f\xec\xeb\x07\xd1\x2c\x83\xfe\xde\x24\x16\x80\xda\x92\x62\x98\x07\x4a\xf1\xf3\xe4\x49\x12\xbc\x58\x16\x48\x68\x46\xc1\xd9\x4d\xa9\x9a\xa9\x40\xf4\x1d\x0b\x8c\x27\x2e\x85\xad\x5e\xaf\x07\x8e\x55\xe2\x1b\xe2\xd7\x78\x51\x7e\x22\x8a\x59\xdc\xd8\x02\x17\xe4\x14\x89\xe8\x25\x70\x63\x44\xb7\x9c\x10\xc4\x8c\x92\xcf\x29\x03\x5c\xe2\xb8\xd5\x82\x71\x92\x78\x05\x0a\x52\xbc\xa2\x58\x64\x08\x94\x6f\x14\xe6\x1e\x3c\x0d\xba\x6d\x8b\x2a\xb7\x1d\x34\xe9\xf7\xfb\xfc\x37\x1f\x39\xdd\x88\xf8\x9d\x6e\x2e\x69\xa9\x96\xbe\x87\x09\x8c\x92\xd3\x0f\x16\xf2\xdb\x1f\x14\x10\x42\xdf\x07\xd1\xe5\x0f\x7f\x27\x71\x9c\xa2\xab\x34\x8b\x83\xef\xf7\x69\x81\x86\x66\x9f\xe2\x91\x05\x3a\x1d\xb7\x7b\x42\xfc\x64\xfb\x1b\x5f\x06\x7e\x9a\x66\x19\xc9\x17\x29\xf3\x7a\xa6\xec\x2f\x9c\x65\xcf\x80\xa8\x1f\xb4\xcd\x6f\xaa\x98\xd8\x67\x2b\xa4\xa7\xae\x1a\xa2\x7b\xdc\x52\x34\x45\xfd\x5e\x7f\x70\x22\x9a\xb6\x80\x7b\xa5\x2b\x4a\xa9\xfa\x80\xcf\xa4\x5a\x07\x53\xf1\x91\x0e\xf2\x3c\x47\x04\xe7\xa4\x0b\xf9\x2f\x4a\x6d\x5c\x47\x45\x05\xc2\x32\x60\xcf\xbe\x07\x55\xf7\xc4\x4d\xcd\xc8\x49\x0d\x1f\xec\x7d\x76\x4f\xb5\x5f\x4e\xaf\xf2\x0a\x55\x8a\x21\xa3\xe6\x4a\x87\x50\x03\xda\xf4\x0c\xad\x72\x05\xb5\x15\x82\x0c\xa0\xf4\x22\x1b\xfd\x69\xbc\x40\x6b\xd4\x88\xbc\xf3\xd6\x18\x1a\x9e\x9c\xd6\xb7\x86\x5e\x9d\xca\x5a\x6f\xbb\x6d\x60\x21\xa5\xba\x7c\xad\xce\x49\xf1\x4c\x5d\x9a\xf5\x04\x27\xb2\xb4\x25\x11\xa0\x1f\x95\x50\x3d\x15\xf2\x76\xbb\x14\x35\x8e\xd6\x92\x6e\x57\x06\x2a\x75\x43\x3b\x31\x63\x82\x6b\x3a\x17\x22\x14\x3c\x4c\x22\x93\xde\x2a\x2e\x55\x15\xc5\xb4\x53\x2f\x52\xc3\xbf\x61\xf3\x81\x1d\xde\x7d\x64\xd9\xce\xf0\xac\x7e\x7c\x87\x3d\x0b\xac\x34\xcc\x61\x9c\x5e\x3d\x49\x82\x27\xe6\x60\x5a\xb5\x3e\x81\x4b\xa0\x1e\x50\xaf\xc1\xb8\x56\x73\xc9\x8a\x21\x5c\xd5\x13\x12\xac\xe8\x08\x09\x56\xf5\xa3\xa9\x5b\xa3\x31\x53\xa3\x0a\x8e\xe0\x4c\xbf\xc6\x9a\x1a\xad\xb7\xa8\xf8\x10\x59\xe1\xed\xdd\xeb\x4f\x0c\xe1\x1d\x16\xe0\xdd\x5c\xd2\xf4\x50\x89\x6b\x0e\xf0\xb8\xf9\x00\x37\x5a\x5a\xe3\x4f\xb0\xb4\x58\x5f\xeb\xc7\xab\xc1\xc2\x12\x41\x23\xab\x46\xac\xc1\x96\x5b\x4b\x63\xed\x9a\x81\xef\xb5\x14\xda\x47\x8e\xe6\x7a\x70\xb3\xb0\x26\xd6\x2f\x9f\x4d\xdc\x61\x4d\x7e\x30\x9d\x98\xf4\xc5\x22\x4c\x62\x0a\xc7\x37\xa7\xa7\xc8\x63\x4a\x45\x0f\xfd\xa8\x7d\x79\x43\x61\xdf\xa2\xa9\x0e\xfc\x18\x79\x5d\x8f\x1b\x9c\x0c\x77\xe1\x32\xbf\xac\xdb\x12\xc5\xcd\x94\x9c\x9e\xd1\x28\xb4\xc9\xb5\x25\xa5\xd8\xbd\xa5\x40\x71\xf4\xcf\x12\x83\x4d\x4b\xe4\xdd\x96\xdc\x1b\x6b\xe4\x13\xa7\x43\xa3\xf9\x0a\x51\xd9\x8d\x0d\x16\xaa\xb0\xd6\x48\xde\xd2\x27\x57\x04\x94\x32\xf8\xc0\xb1\x58\xa1\x8e\xe6\x42\xa4\x2f\xd1\x0a\xc1\x42\x41\x3b\x96\xb5\x59\xc7\xbd\xa0\x55\x23\x8f\x1e\x55\x99\x9d\xf8\x4a\x76\xb5\xe2\xac\x54\xde\x04\x20\x96\x71\xed\xd0\x5a\xdb\x89\x39\xbc\xee\xbd\x46\xd1\xc6\xc7\x19\x9c\xb2\x99\xaa\x00\x2e\x55\x29\xfd\xc7\x27\xf0\xda\x76\x81\xa3\x84\x7b\x8d\xed\xef\xb3\x2c\xca\x08\x12\x0f\xf9\x24\xcf\x71\x76\x63\xa8\x4d\x34\xdf\x6c\x16\x33\x8e\x07\x37\x17\xa9\x91\x94\xce\x87\x79\xf7\xed\x7f\x87\x48\x1e\x47\x49\xd1\x0d\xa2\x1c\xcf\x62\x82\x92\xb4\xbb\x4c\x96\x39\x09\xba\xca\xec\x9b\x33\x7d\x98\xf0\x7c\x16\x81\xe2\x4f\x2c\x14\x24\x59\x8d\xa1\xe6\x70\x5a\x3d\xd4\xf4\x7a\x6c\x8e\xaf\xe1\x75\x2b\xcc\x7c\x25\x13\x9f\xda\x8f\xc4\x96\x19\x90\x98\x14\xcc\x0b\xde\xda\xa3\x50\x53\x2f\x45\x97\xdd\xb0\x63\xb6\xcb\xbd\x46\xc5\x46\x69\x7a\x18\x5a\x5e\xba\x7a\x58\x06\x43\xf0\xb2\x00\x94\xeb\x61\xd9\x7f\xd7\x70\x39\x34\x1d\x77\xf5\xc7\xfd\xc6\x89\x6d\x02\xe8\xcd\xc3\x4f\xb6\x25\xb5\xb5\xe9\xe1\x83\x63\xcc\xd2\x4a\x3f\xc0\xd2\x9c\x4a\x5b\x6c\xd3\x9c\x01\xaa\xce\x14\x7d\xb8\xd5\x42\x9b\x29\x97\x16\x8b\x24\xe6\xce\xd7\xe3\x70\xe8\x54\xf8\xf5\xbd\xf1\x78\x15\xef\xed\x6e\xe2\x25\x8e\xee\x57\xbc\xc4\xf2\x40\x89\x45\x28\x3c\xb1\x2e\x70\x5e\xef\xa9\xa6\xa2\x29\x0a\xd0\x3a\x5f\x2f\x01\xf3\x69\xbd\xb7\xe4\xce\xa2\x52\x68\x98\xdb\xac\x96\xfc\x95\x2d\xf9\x5f\xa3\xbc\x68\xa3\x52\x51\x0f\x07\x41\x4b\xdb\x98\xe4\xeb\x9b\x6f\xc0\xed\x40\x8e\x40\x29\xf7\x47\xdb\x42\xc6\x4f\xb3\x72\xd9\x63\xe4\x41\xf0\x2d\xed\x42\x70\xdb\x8c\x5d\x6d\x56\x1b\xdf\x77\x56\x13\xa3\x75\xa2\x26\x4a\x14\xad\x3b\x51\x9c\x47\xbe\xf9\xc6\x38\xf9\xcb\xd3\x27\x92\xb3\x94\xe6\x50\x68\x53\xbf\x05\xff\x24\xd7\xb4\x7c\x8b\xbe\x6d\xf7\xa2\x24\x20\xd7\x2f\x42\x0e\x66\x7f\x86\xbd\xa9\x3b\xa8\x9d\xb1\x6f\x79\xff\xbf\x75\xcc\xd8\x64\xab\x33\x56\x22\xc1\xe9\x88\x73\xe7\x15\xc1\x90\x95\x06\xb4\x11\xb7\xf7\x32\xb2\x88\xb1\x4f\x5a\xcc\xf1\xee\xfc\xe7\xeb\x45\xcb\x6b\xfd\x9f\x8f\xff\xf9\x4f\xde\xf6\xac\x01\xf6\x5a\x3f\x4e\xff\xf3\x9f\xfc\xe3\x5f\xda\x10\x7f\xdd\x6b\x77\x90\xf7\x97\x81\xd7\x96\x38\xf6\xff\x93\x3f\xde\x3f\xef\x20\xf0\x13\x92\x85\xff\xe7\x3f\xf9\x77\x1f\xff\x93\x7f\xf7\x17\xf8\xe4\x71\xaf\x1f\x6b\xe0\x0f\x3e\xa7\xcb\xf7\xd6\x56\x56\x2e\xb2\x5c\xcb\xf7\xe0\x62\x67\x36\x71\x57\x05\x13\x3d\x6c\xbb\xe1\xeb\x22\x8a\x5a\x98\xef\x67\x94\xdc\x9d\xc6\x03\x86\x58\x09\x15\xc1\x30\xe9\x02\x79\x5e\x90\xf9\x2e\xfd\xb1\x61\x8d\x24\xe2\x7a\xed\xf2\x95\x76\x80\xd6\xa1\x57\x50\x46\x60\x54\x99\x43\xdd\x29\x06\x38\x40\x57\x05\x51\x65\x50\xb2\xa2\x18\xab\xaa\x5e\x1c\x1f\x95\x40\xeb\x5a\x10\x30\xf7\x2d\x4a\xeb\x3f\xd2\xa0\x2a\x12\x6d\xf3\x10\xad\x80\x64\x8b\xe1\x4a\xf9\xbd\xe5\x35\x73\xb9\xdd\x4a\xf8\x58\xc0\xd5\x84\x44\xb9\x6b\x95\xb6\x31\x39\x6d\xac\xa4\x05\x4f\xde\x0c\x5f\x51\xee\xf8\x99\xa6\xc5\xb4\xee\xc9\x1b\x7f\x3c\x7c\xb3\x48\xcf\x33\xbc\xb8\xb8\xe9\xe5\xcb\xd9\x05\xc1\xf4\xde\xab\x6e\x60\x22\x65\xfa\x70\x2c\xae\x3d\xb3\xf4\xfa\x55\xf4\x07\xdc\x8b\x3c\x1e\x41\xb3\x3b\x4b\x55\x26\xd9\x19\xf6\xdf\x9f\x67\xe9\x32\x09\xa6\xc8\x4b\xd2\x84\xc8\x2f\xe9\x25\xc9\xe8\xf5\x7e\x8a\xbc\x8b\x28\x08\x48\x22\xbf\x14\xe4\xba\x78\xa1\xbe\x92\x38\x8e\x16\x79\x94\xcb\xef\x57\x17\x51\x41\x5e\x2d\x30\x44\xb8\x4f\xd2\xab\x0c\x2f\xe4\x37\xef\xd1\x34\x4c\xfd\x65\xee\x4d\x35\xd5\x9d\x4e\x04\xeb\xe7\x02\xc7\xa4\x28\x48\x8f\x36\xd5\x03\xb7\x4a\x88\x92\x83\xf4\x14\x09\xde\xa3\xe9\x05\x44\x88\x77\xa3\x7a\x96\xc6\x69\xd6\x04\x1f\xbf\x02\x32\xb4\x39\x89\x89\x0f\xd7\xc4\x0f\xa5\x11\x6a\x86\xf1\x96\xdd\x24\x6f\xb7\x10\x42\xf5\x37\x92\x2c\x51\x44\xf7\x13\x3e\x75\xf9\xdd\xa3\x9e\xb2\xb5\xbb\x61\x14\x2c\xa8\xbc\x9d\xc0\x57\x14\x55\x39\x2a\x5b\xb8\x8c\x51\x91\x72\x37\x08\x96\x40\x1b\x5e\x83\x6a\xde\xc7\xd2\x08\xaf\x0f\x46\xcc\x5f\xd0\xad\x11\x17\xcb\x8e\xac\xa5\x69\x35\xab\xfa\xc7\xbd\x40\x6d\x7f\x69\xdd\x27\x4a\x44\x87\x16\x41\xe3\x94\x77\x16\xfa\x99\x3d\x2b\xc0\xdc\x9b\x94\xf6\x85\x0a\x5d\x18\xbc\xb8\x44\x2e\x5b\x78\x6c\xe0\x88\x34\xa7\x5c\x0f\x36\x8b\x72\xcb\xb6\xc5\xbb\x45\xba\x05\x1c\x5b\x8d\x3a\xfb\x9a\xe9\x55\xeb\xa6\x85\x25\x7a\x59\x63\x46\x20\xb6\x5f\x0a\x1c\x73\x23\x97\x33\xb0\x91\x78\xf3\xcb\x02\xef\xc9\x85\x5e\x13\x8f\x16\x56\xb1\x3a\x7a\xe9\x7a\xa4\xe7\x71\x8b\xe9\xda\xb8\x20\x9b\x69\x39\xca\x34\x85\x9b\x7a\x7d\x2b\x39\x8b\x3f\x18\xb7\xb4\x72\x12\x4c\xb2\x91\x04\x91\xb6\x77\x0e\x22\xbb\x23\x20\x44\x81\x00\xe0\x99\xb3\xc4\xbb\x75\xf5\x20\x7d\xcd\x07\xe1\xf2\x3d\xb8\x96\x3b\x4a\x12\x0c\x3f\x04\x69\xf0\xe0\x9b\x53\x21\x93\x39\x89\x27\xdd\xb6\x25\x44\x05\xdb\x62\x12\x9c\x6a\x50\x3c\x93\xa0\x8b\xa6\x23\xf2\x6b\x1b\x02\xbc\xf5\x02\x9c\xc3\xcb\x01\x90\x63\xd3\xee\x98\x03\xde\xd6\xb5\x7a\x2b\x54\x9e\x52\x28\x53\x0a\xcf\xda\x27\xd8\xb3\x65\x51\xa4\x89\x9e\x82\xc9\xce\x4b\x54\xe0\xd9\x73\x7a\xdf\x9e\xa2\xee\xa0\x63\xea\xf5\x75\xeb\xc9\x9e\xc1\x00\x53\xf5\xe7\x9e\x7a\xe7\xdc\x6e\x43\xd0\x72\xc1\x84\x1b\x69\x19\x45\xa0\xaf\x0f\x8d\x37\x4d\x23\x24\x73\xa3\xe5\x68\xd5\x68\xb4\xd0\xac\x3a\x5f\xc4\xe1\xb6\x77\xbb\x8a\x91\x59\xb0\x34\x6d\x8d\xd5\xce\x44\x7b\x1d\x74\x7c\x9d\xd6\x4e\x54\x63\x84\xda\x5a\xff\xd2\x0e\x9f\xa6\x63\xc0\x73\xd4\x6d\x65\x3c\xb5\xed\xb2\x66\x49\xb4\xc1\xfa\x19\xb6\xb9\x3d\x40\x2e\x7b\x47\xb4\x01\xb6\x28\xbd\x39\x49\x96\x54\x5a\xf4\xcc\x65\x07\xbe\x9e\x7b\x6e\x93\xc2\x7a\x29\x99\x04\x0d\x90\x93\x49\xfc\xd8\x51\x52\xa6\xc3\xfb\xa5\xf9\xe5\x69\x5c\xa2\xcc\x5f\xc6\x38\xfb\x3d\x4b\xcf\x33\x52\x63\x50\x80\x7b\xfe\x8a\x46\x3d\x1b\x1b\x0f\xfe\xa4\xbf\xec\x14\x07\x0b\x64\x3d\xd3\x33\x61\xb4\xac\x17\x83\x95\xf9\x64\xac\x36\xda\x62\x86\x99\x51\xfd\x56\xd3\x47\x24\xa4\x41\xc7\x8e\x9b\x74\xcc\xc4\xb5\x8b\x6e\x99\x2d\xb8\x3a\xb5\x73\x7d\x89\xc5\xaf\x47\x0f\xea\xd7\x2d\xab\x5f\xbf\x9e\x0c\x68\x2c\x54\xed\x83\x7a\xb5\x46\xbd\xfa\x49\xd4\x9f\xaf\x9e\xff\x7f\x3f\xa3\x53\x34\xe9\x5b\x69\x87\x5e\x92\x18\x17\xd1\x25\xf9\x17\x5d\x35\x22\x93\xd0\x3c\x4a\x3a\x68\x8e\xaf\x8d\x6b\xe0\x7c\x41\x02\x80\x42\xa7\x2c\xf5\xd0\x3c\x4a\x5a\xec\x0f\x7c\xdd\x82\x2a\x2c\x7b\x11\xab\xaa\x85\x1b\x6a\x19\xb5\xbb\x14\x7d\x1b\xed\xa3\xd6\x1c\x5f\xf3\x5f\x32\x65\xd1\xb6\xb4\x8d\x42\xc3\x15\x44\xf9\x02\xa2\x08\x7a\x51\x12\x47\x09\xe9\xce\xe2\xd4\x7f\xef\xed\x69\xda\xb6\x45\x16\xcd\x71\x76\xc3\x35\x60\x1f\xe4\x8d\xd5\xa1\x10\xe3\xa0\x6f\x26\xfd\xfe\x5b\x1d\x05\xf6\x7d\x92\x14\x4d\x30\xb0\xd7\x53\x38\xbb\xe9\x3d\x19\xf6\xfb\x3a\x8e\xfc\xf2\x9c\xde\xa6\x0a\x92\xcd\xa3\x04\x17\x44\x21\x92\xcf\xa7\xa8\x1c\xb4\x8c\xba\x0b\x7e\x34\x74\x7d\x7e\x00\x76\xb3\xb4\xc0\x05\x41\x83\xde\x38\x47\x31\x1c\x1f\x28\x4a\xc2\x28\x89\x0a\xe2\x59\x6d\xfc\xe4\x6a\x41\x86\x42\x9c\x52\x69\x10\x1e\xc2\x74\x8f\xfb\x01\x39\x6f\x1b\xd5\x69\x7b\xb1\x56\x2d\x2f\xb2\xf4\x3d\x95\x9f\xfc\x65\x96\x89\x01\x90\xea\x50\xf6\x95\x9e\x66\x3e\x5e\x00\xe2\x65\x12\x38\xf0\x6d\xdc\xeb\x00\xe7\x17\xac\xcf\xfc\x59\x46\x37\x5d\x16\xaa\xe3\x82\x8e\xfd\x7d\xf4\x2a\x9d\x13\xb1\x30\x78\x16\x2d\x48\x91\x10\xa7\xe9\xfb\x1c\xd1\x2d\x1a\x5d\x61\xe6\x04\x2b\x34\x5c\x2a\x50\x40\x91\xa2\xf7\x91\xff\x3e\x47\x51\xd2\x33\xba\xf6\x13\xce\x2f\x70\x96\x01\x77\x1d\xf5\x3b\xc3\x7e\xdf\xea\x3b\x05\x48\x21\x0b\xff\x14\x19\x73\xed\xfd\x8f\xf7\xe4\x26\xcc\x60\xd7\xaa\x9b\x51\x4d\xfd\xeb\x0d\xfa\xfd\xbf\x1a\xea\x60\xc7\xa4\x8d\x0e\xb4\x49\x53\x4e\xa1\x0d\xdb\xa4\xe3\xa9\xb7\x68\xb5\x57\xee\xf4\xc0\xe8\x73\x75\xaf\x75\xc5\xf6\x64\x35\xd6\x7e\x7f\x25\xde\xee\x60\x52\xc2\x5c\x1a\xa0\x4d\x51\x0f\xfb\xe6\xf8\x6d\xa4\xf4\x86\xb5\xb0\x22\x8f\x5a\xeb\x8d\xc7\x77\x14\x48\x73\x0e\x9b\x08\xfd\x8b\x5b\x2a\xbd\x75\x73\x95\xfd\x56\x6d\xbb\xd2\x9a\xd4\x56\x1b\x6b\x4c\x2f\xd8\x4a\x7a\xb4\x3f\xaf\xb2\x9b\xce\x19\x7f\x1c\xab\x14\xd5\x7a\x3e\x01\x78\x36\x0b\x01\x2a\xf9\x8e\xce\x9c\x34\x61\x37\x99\xe3\xf7\x24\x47\x39\x49\x78\x0c\x5e\xae\xdc\x86\x53\xe0\x6e\x6c\x50\x26\x95\x1e\x9d\x6c\x23\x4b\x43\x24\x96\x32\x8a\x12\xa4\x4d\x26\x9a\x4b\x05\xfd\x3e\xe4\x32\xbe\x5e\x99\xd4\xa1\xd4\x4c\x94\xac\xdd\x4c\x4d\x1e\xb4\xca\x66\x28\xe3\xa6\x21\x4b\xc2\x76\x93\x2e\x33\xd9\x56\x0f\x19\xc7\x03\xab\x42\xf7\x68\x3e\xec\x24\x23\xe0\x51\x9b\x72\x32\xe9\x27\x59\x97\x41\x6b\x27\x1e\x7c\xf6\xd3\xa4\xc8\xd2\x38\x26\x81\xea\x11\x54\xd6\xfa\x00\x0f\xcb\xef\xb6\x8e\xca\xbd\x84\xc4\xdd\x82\xbb\xe0\xe8\xd3\x54\xf6\x90\xe7\x7b\x8d\x61\xdb\x4e\xb2\x9d\xe2\x22\xf2\xdf\x27\x74\x04\x2a\xe8\x92\x00\x6b\xcf\xe9\x9a\x6c\xc3\x6f\x6d\x2b\xd2\x3c\x1a\x26\x0b\xfb\xfe\x6f\x9b\x2e\xde\x59\xce\xc1\xeb\x98\x33\xea\x4c\x19\x6c\x63\x17\x66\x8c\x38\x95\x7e\xc0\x30\xc1\xd2\x7c\x11\xfd\x41\x94\x38\x70\xa3\xd9\x2e\x8c\x68\xba\x6a\x06\xc4\x67\x59\x22\x40\xe6\x6c\x5b\x67\x5f\xe9\x0f\xf1\xe1\x92\x4b\xe3\xec\x0b\x93\xdd\x45\x9d\x28\x51\x55\x22\x19\x73\x98\x6e\x1b\xb2\x18\x5f\xef\xce\x82\x02\x82\x20\xf2\xe8\x20\x98\x61\x73\x45\xe7\xe8\x0f\xda\x17\xfa\x2f\x50\x0e\x05\x11\x84\xe4\x9d\xe3\x6b\xc3\xcc\x42\x45\x7a\x79\xd0\xdc\xaa\xb9\x04\x5e\x7d\xc5\xc7\xf6\x03\xbc\xc1\x88\x42\xd4\x9a\x4b\x4d\xb9\xbe\x22\x75\x4f\xf3\x8c\xc4\xff\xc2\x31\x8b\xfb\xbd\xe2\x02\xf4\x1d\x1a\xf4\x79\x70\x6c\xd1\xe6\x72\xce\x23\xd0\xa1\x53\x34\x44\xdf\xb1\xcb\xd0\xef\xcf\xd1\x77\xa8\x05\xb7\xac\x7d\x34\x44\x5d\x24\xc3\x88\x6b\x64\xf6\x6c\x71\x43\x5c\xa5\x40\x36\x6e\xb5\x06\xfd\x3e\xea\x72\xea\xe8\x0d\x89\xfe\xfe\xce\x6a\x13\x08\xea\xf3\xaf\x7d\xf4\x18\x79\x8b\x6b\x1e\xac\xd7\xdd\x12\x08\x3f\x66\x43\x75\x18\x85\x1f\xbd\x18\xf3\x37\x1e\xce\x22\xdc\x85\x81\x49\xd2\x2b\xef\x2d\x3a\x65\x8c\x77\x52\x0d\x47\xe7\x91\xc2\xcd\xa3\xa4\x0e\x8a\x4e\x33\x85\xc2\xd7\xf2\x19\x4c\xf3\x20\xc3\x5e\x10\x5d\x72\x41\x6e\x45\x28\x61\x4d\x20\x68\x6a\xa4\x63\x8b\x1c\x1e\x18\x89\x53\x58\x0b\x78\xf6\x86\x7d\x7e\x8c\x3c\x76\xe3\x79\xab\x7b\x67\x1a\x6b\xbe\xda\xed\x05\x5d\x45\x41\x71\x31\x85\x3d\xa3\x23\x9d\x5b\x60\x07\xb9\xe5\xe1\x9e\xdb\xba\xe5\x73\x8a\x3c\xb1\x91\xce\x70\x26\xae\x51\x6a\x60\x85\x21\x8d\xd5\x69\x14\xa4\xd9\xcb\x2f\xcf\xa5\x28\xac\xc4\xe6\x46\xc3\xd5\x7a\x67\x3c\x1b\xfb\xb0\xda\x1e\xa4\xe0\x35\x0b\xa7\x75\xe7\xed\x20\xb5\x76\xcd\xf3\x74\xb5\xfd\xa1\x02\xff\x4f\x6e\xec\x16\x6e\xad\x76\x5b\x7b\x0c\x75\x19\x91\xab\xa7\xe9\xf5\x14\x79\x7d\xd4\x07\xb7\x6f\x58\xe0\xc2\x07\x9c\xfe\xb0\xaf\x21\xf5\x23\xef\xb1\x25\x6a\xa4\x42\x58\x8b\x3d\x59\xfd\x75\xac\xc8\x8e\x4b\x76\xcd\x30\xb7\xf5\xab\x11\x30\xb0\xb6\xa9\x68\xaf\xc4\xae\xa7\x48\xec\x75\x5a\xe9\x8d\xab\x34\x53\x85\x74\x5b\x54\x1f\xc2\x28\x8e\x6d\xcf\x2c\x71\x23\xfb\x37\x5b\x1d\xf2\xb8\x10\xc3\x0c\x11\x7e\x10\xfd\x5f\xa6\x33\xb2\x65\x80\xcf\x63\x39\xde\x8a\x90\x6f\xdb\x96\x57\x4b\x84\x56\x8d\x6d\x48\xad\x16\xca\x26\x52\x99\x4d\xc5\x4a\xf9\xdf\xae\xb0\xf2\x5e\xa2\x55\xf8\x82\x0c\xcf\x4c\x44\xba\x1b\xcf\x34\x6d\x8d\x1e\xb5\x95\x6d\xb1\x41\x6e\x8c\x0a\x64\xb4\xed\xa0\x62\xf2\xdf\xdd\x38\xb6\xb1\x65\x9a\x89\xa2\x5b\x21\x5c\x88\xb3\x5b\x61\x2d\x5d\x24\xde\x0a\x75\x42\x9c\x5e\x85\x4c\x37\xc1\x97\xf6\x51\x87\x29\x9e\xef\x72\x8a\x27\xe5\x2e\x35\xee\x77\xcc\xbb\xe2\xa8\x77\xa0\x76\x24\x6b\xca\xb4\x7d\xa5\x2f\x37\x8c\xbe\xdc\x09\x06\xfd\xfe\x56\x0c\xfa\x25\x0b\x34\xba\x6d\xb7\x4a\x26\xe3\xdd\x18\xf8\x8f\xbf\x70\x83\xe9\x4e\xcd\x97\x5f\xf9\x63\x98\x2f\xc2\x60\x8a\xb3\x84\xe7\x2b\x72\x91\x3e\xb6\x01\x6b\x6d\xa5\x0c\xe4\x8b\x32\xc6\xbe\x7e\xf9\xe4\x1f\xaf\x9e\xd3\x55\xfc\xee\xa7\x7f\xbe\x7c\x02\xcb\xf9\x14\x8d\x4f\xd0\xfe\x3e\x1a\xf7\xfb\xf3\x7c\x37\xc6\xd0\x45\x2a\xa2\x9a\x79\x19\xd7\x7a\x34\x78\x12\x21\xee\xa6\x93\xd5\x46\xd3\x15\xef\x09\x84\xf9\x74\x60\x99\x4f\x75\x64\x4f\xf1\xfa\xf8\x6c\x73\x2c\x2f\xff\x09\xe7\x17\xee\xd7\x0e\x74\x00\x70\x10\xe1\xb8\x7b\x4e\xff\x85\x9b\x19\x7a\x5c\x43\x2d\x5c\xf9\xfa\x7f\xed\xa0\x06\x60\x83\x83\xbf\x76\x98\x71\x6e\x81\x33\x92\x14\x68\x3c\xfc\x6b\xdb\xf1\x28\xe5\x15\x1c\x9d\xde\xa0\xbf\xb8\x46\xf4\x7f\x1c\x20\xbf\xab\x09\xa3\x50\xdd\xe1\x68\x71\xed\xad\x34\x3c\xaf\x18\x35\xcd\x04\x3d\x30\x4d\xd0\x1a\xb6\x75\xa6\x41\x43\x38\x76\x21\xbc\xe3\x3c\x98\xf4\xd6\xcc\x84\x03\xf0\x53\xce\xc5\x4c\x1f\x32\xae\xdd\x61\x46\xc9\x4e\x79\xfd\xe1\x59\x9e\xc6\x4b\xcd\x4a\x1d\x93\xb0\xe0\x62\x10\x20\x4b\x8b\x22\x9d\x6b\x05\x45\xba\xd0\x7f\x69\x11\x0a\x55\x86\x45\xd4\xef\x0d\x85\x03\x80\xd7\xb1\x6d\xfb\x2f\xb2\xe8\x9c\x8a\x5a\x1e\x6d\xca\xa0\x3c\xb0\x26\xa8\x8e\xce\x39\xce\xce\xa3\xe4\xb5\x41\x8d\xd8\x21\xcc\xde\x3a\x87\x40\xb7\xea\xcf\x96\x61\x48\x32\x34\xca\xa5\xcd\x5e\xd0\x6e\x0c\x2b\x40\x3d\xc5\xd9\xd0\xf2\x57\x28\x77\xbf\x47\x79\xc2\xb5\xb7\x3e\x46\x5e\xee\xc2\x4d\xb7\xc7\xa7\x80\xbf\x86\xd9\x3d\x8d\x7f\x4a\xb5\xff\xdf\x25\xc9\x6e\x6a\x1d\x29\x06\x47\x65\x47\x0a\x43\x20\x7e\x8a\xb3\x41\x99\x71\x64\x2e\x2d\x56\x18\xc7\xcf\x2e\x70\x72\x4e\xf8\xf4\x75\x50\x46\x87\xdc\x39\xac\xf3\x65\xd4\x35\x1a\x18\xa0\x61\x6f\x90\x23\x7f\x39\x8b\xfc\xee\x8c\xfc\x11\x91\xac\xd5\xef\x1d\x4c\x3a\xa8\xdf\x3b\x1a\xc0\x3f\x87\x23\xf8\x67\x74\x3c\x69\xbb\x3d\x47\x6c\x8a\x87\x3b\xa5\x78\xe8\xa4\x78\xc0\x49\x1e\xd3\xff\x1d\x8f\x3b\x68\xd0\x2e\x7b\x7b\x48\xbc\x3f\xb1\xec\xa1\xde\xa0\x37\x98\xe4\x26\xbb\x57\x8f\xbd\x46\xb4\x96\xb7\x74\xcb\x5c\x27\x39\x5a\x6b\xfa\x0f\xfe\x92\x62\xb0\xb3\xc6\x86\xbf\xb3\x83\x6a\x3b\xab\xa8\xbc\x3f\xae\x75\xe2\x2b\xaa\x9e\xc0\x11\xf1\x49\x89\xaa\x3e\x00\xf7\xf7\xd1\xaf\xe4\x9c\x5e\x47\xa6\xe2\xf7\xc7\x8f\x28\x23\x8b\x8c\xe4\x24\x29\x72\x30\x91\x5e\x46\xe4\x8a\x8a\x63\x02\xa2\x8b\x74\x08\x8c\x62\xca\xe7\x1a\x0d\x02\xee\xda\x82\x0b\x70\xf6\xde\x06\xb3\x9d\x74\xcc\x75\xac\x79\xb7\xec\xef\x23\xf4\xb1\x4b\xff\xa3\xff\x7b\xdd\xfd\xc8\x7f\xf0\x7f\x84\x86\xdf\xf2\x88\x61\x87\x8c\xd7\x1d\x4d\xfe\xaa\x69\x5c\x33\x7d\xf7\xb6\xf5\xd9\x66\x43\xaa\x85\x8f\xd7\xd7\xd7\xd7\xaa\xa1\x03\x77\x4b\xc6\xde\xaf\x5a\xea\x1e\x3b\x5a\x2a\x3b\xf0\xac\x81\x44\x9f\xc5\xda\x41\x1c\xda\x83\x48\xfb\x71\xcd\xff\x77\xad\x41\x1c\xba\xc9\x5a\x6f\x14\xbb\xd7\x46\x53\x95\xc3\x78\xe8\x1c\x81\xa3\xb5\x46\x71\x25\x8e\xaa\x41\x64\xab\xb5\xc6\x35\x4c\x85\x5f\x56\x0d\x34\x91\x9c\xea\x1c\xc3\x54\x60\xe6\xcd\x71\x96\xc6\xa2\x31\xa1\x74\x76\x4b\x78\xf7\xd0\x76\xdf\x40\x3f\xf8\x49\xdd\xdd\x4f\xca\xe9\x1c\x55\xe9\x4e\xd4\x31\x05\x99\xbd\xf5\xdd\x89\xb6\xe3\x1e\xd4\x11\xd2\x2f\xfd\xeb\xff\x52\x19\xd2\xd9\x91\x92\x0f\x4d\x07\xa5\x49\x7c\x83\xae\xd2\xec\x7d\xc9\x9f\x06\x27\x01\x5f\xa9\x9a\x6b\x0d\x62\x3e\xd7\x33\x52\x5c\x11\x92\xa0\x3e\x40\x0d\xfa\xfd\xf5\x1c\x6f\x6a\x28\x63\x2d\xda\x74\x6d\x4a\x87\x10\xc6\xd7\x71\x03\x32\xdf\xcb\xd4\x38\x01\x19\x66\xde\xa1\xf1\x6b\x64\xfc\x1a\x7f\x1a\x77\xa1\x4d\xfc\x7a\xb4\x51\x32\x01\x58\xd9\xce\x1d\x7a\x4a\x2e\x3b\x5a\xe3\x86\xcf\x0e\xbb\x53\x8a\xd0\x74\xab\x0d\xdb\x0c\xbe\x83\xb6\xe3\x58\x60\x68\x80\x84\x3b\x07\xd8\xbb\xc5\x0e\xb2\x99\x43\x81\xae\xd0\x30\xd0\xf2\xdd\xc8\x76\x25\x38\xd1\x5d\x98\x9e\x6d\xf2\x5a\x5c\x67\xd9\x75\xc7\x63\x58\x1a\x10\x90\x87\xef\x3c\x1e\x43\x7b\x40\xca\x68\xd5\x78\x6c\x82\x55\xdd\xcb\x75\x57\x05\xbe\x63\xde\x01\x27\xdc\xd6\x75\x94\x6c\xeb\x35\x67\x6d\xd8\xb6\x63\x9b\xb2\xe0\xa4\x6c\x00\xd7\x9a\xc3\x19\xce\xcc\x29\x1c\xad\x3b\x85\x23\xf7\x14\x3e\xc5\x77\x9f\xc5\x91\x73\x16\x6d\xcc\x1b\x4c\xa4\x86\xb8\xa4\xe8\xa8\x76\x3d\xa1\x37\x2d\xc7\xc4\x6c\xd2\x6a\x4d\x9b\x9b\xfa\x14\x69\xd8\xd5\xf5\xdd\xcd\x9c\x7a\xad\xb6\xe4\x1f\x79\xe9\xbc\x23\x07\x8d\xd7\xe5\xa0\xb1\x83\xf2\xe1\x1d\x97\xd5\x78\x3d\xae\x44\x8f\x1e\xb1\xf6\xbe\xd9\x6e\x7b\xf5\x8d\x6d\xa1\x73\xab\xd7\xc5\x36\xbb\xb6\x62\x2f\xdd\x66\xc7\x4a\xea\xbc\xb5\xd7\xa5\x8e\x57\x71\x39\x7b\x64\x27\xcd\x73\x1f\xc4\xb6\x39\x05\x9e\x95\x6b\x80\xfe\x64\x31\xd3\x2b\xdc\x7b\x57\xbb\xf1\x52\x08\x26\x27\xd1\x91\x97\x16\x6a\x15\xda\x5e\x27\x45\x70\x4d\x4f\x29\x94\x4e\x91\x97\xfb\x38\x26\xff\x0b\x2c\x0e\x0c\x13\x73\xb8\x7d\x8c\xbc\xb6\x27\xe2\xea\xd7\xba\xc1\x6a\x1e\xb5\xec\xe5\x23\x8f\x02\xcf\x73\x88\x0b\x6d\x7a\x53\x2f\x34\x70\x6f\xe0\x06\x51\x35\x81\x3c\x01\xb2\xf7\x1b\x2e\x48\x16\xe1\xb8\xfb\xcf\xe7\x53\x7a\xa9\x41\x09\x61\xf7\x43\x9e\x73\x16\x61\xde\x8b\x05\x67\x02\xb0\x90\x78\x70\xb1\xb1\x1e\xc0\x47\x6e\x5f\x7c\xaf\x8d\xa6\xe8\x32\x8d\x02\xd4\x3f\x51\x57\x5d\x24\x63\xe8\x96\x99\xef\xd3\xce\x85\x81\x45\x29\xf1\xaa\xf0\xb4\x74\x59\xf9\xe3\x47\x24\x3c\x9c\x75\xa4\xf7\x65\xaa\xaa\x67\x49\xbf\x49\xb9\x27\x68\xeb\x6e\xd3\xba\x66\xc0\x94\x5b\xab\x1d\x8e\x4b\xbc\x81\x7e\x5c\xe5\x0a\x0b\x84\x98\x29\x17\xf4\x4b\xc3\x2d\xed\x6c\xb2\x8c\xe3\x26\x1e\xcd\x2e\x64\xb6\xc4\xd6\x11\x1e\xad\x2e\x6e\x94\x41\xf2\xdc\xbb\x0e\xfa\x91\xe5\x4b\x9f\x6e\x40\x47\xf9\xe4\x77\x53\x22\xe1\x98\x97\x2b\xf3\x6f\x35\x79\xe2\xd3\x7b\xb7\x3e\xf8\x5b\xae\xe1\x64\x79\x77\x77\x46\xa7\x5e\x68\xdb\x7e\x7f\xcd\x91\x3d\x15\xb4\xac\xe3\x4a\x68\xb1\x6c\x43\x47\x42\xa7\xab\xe0\x56\x1c\x01\xad\x88\x2d\xe8\xb6\xdd\xb2\x42\xac\xec\xc4\x09\x70\xd0\xbf\x8f\x51\x7e\x5e\xe2\x20\x4a\xab\x1c\xa7\x06\x83\x26\x11\x70\x44\x48\xfb\x1d\x84\xbe\x01\xea\x2a\xc3\xf8\xc0\xd7\xbf\x65\xe9\x72\x51\xd9\x81\x71\x93\x0e\x28\x3c\x3b\xeb\x03\x60\xbf\x07\xa1\x7b\x06\x83\x2f\xc2\x13\x15\xc6\xf4\xa7\xd4\x77\xfa\xc2\xdd\x83\x70\x3e\x19\x09\x87\xe0\xbc\x87\xae\x08\x7e\xbf\x4b\xef\xcd\x4f\x11\xe9\xfb\xd5\x55\x54\xf8\x17\x4f\x71\x5e\x19\x6c\xfa\x68\xe4\x00\xae\x6b\x45\x41\x99\xab\xf9\x29\x04\x99\x84\x94\xa4\x10\xf9\xd3\xbd\xaa\x87\x35\x95\xea\x5a\x2d\x43\xbb\x10\xfd\x33\xf1\x57\xb4\x3f\xaa\xad\xd6\x90\x02\x09\xff\x75\x47\x3c\xbf\xbb\x4f\xab\xec\x6d\x6d\xa0\x1d\x88\x5d\x2d\x45\x6a\xdd\xb2\xcd\xa7\x61\xc3\x50\x3f\x3c\xd7\xd6\xaa\xea\x18\xba\xd2\x13\xd0\x2e\xcb\xb1\x38\x8a\xd7\x93\x66\xa0\x16\x08\x31\x50\x4f\x5b\x7e\xe6\xc3\xd7\x28\x59\x2c\x21\x0c\x24\xf7\xb1\x64\xae\x59\x1c\xe4\xb9\x9f\x26\xab\xae\x32\x6e\x5e\x57\xc1\x63\xe9\x7d\xa8\xad\xe1\xe4\x2b\x6c\x5d\xd4\xcf\xdc\x88\xf7\x20\x6f\xd5\x1e\x00\xf6\x78\x10\x27\xae\x34\x65\xe7\xb7\xe7\x94\x0c\xe1\xd3\xc9\x9d\x0d\xf3\xcf\x43\x9e\x81\xbe\x63\x9a\xb8\xe9\x9d\x9c\x8f\x84\x1e\xad\x9c\xf3\x53\x9d\xe0\x4f\x5b\x6d\xbd\xa9\x09\x89\xb9\xe2\x9a\xe3\xb2\x0e\x47\x3e\x8b\x4e\xc4\x87\x47\xda\xb0\x6b\xe8\xa5\x3d\x93\x41\xba\xa3\x5c\x28\x24\x82\x0e\x8a\x78\x7e\xfd\x19\x61\x91\xbe\x71\x8e\x30\x0a\xd3\xa4\x40\x71\x74\x8e\x8b\x65\x46\x4a\x3d\x66\x53\xfd\x27\x8e\x62\xfb\xe7\x0f\xd1\x6e\x63\x31\xd7\x62\x6d\x58\x62\x13\x91\xc5\xf1\x39\x6c\x2b\x92\x23\xc4\x36\xa6\xba\xac\xb6\xc1\x4d\x9b\xc8\xa2\xc5\x22\x26\x88\x84\x21\xf1\x8b\xd5\x2d\xbd\x04\xf0\x35\x9a\x6b\xbe\x42\x96\xc9\x0e\xd6\x48\xf4\x65\x2d\x0e\xe5\x36\xa0\x2f\x06\x3a\x94\x67\x70\xd2\x9c\xc9\xe4\x51\x6a\x04\x68\x39\x6c\xaf\x6b\x2d\x0c\x88\x71\x7f\x81\x0b\xa5\x1c\x2d\x52\xb4\xc0\x79\x0e\x19\x35\x43\x44\x6f\xe3\x33\xec\xbf\x17\xed\x27\xf0\x8e\x85\xb5\xe6\xca\x2e\x00\x1f\x5e\x92\xb0\x92\x08\x3a\xd6\x9c\x04\xf7\xa2\x4a\xd6\x5d\x95\xcf\x04\x89\x61\x94\x91\x40\x71\x5d\x0e\x51\xfa\x60\x4f\xc6\xc9\xb9\xe0\x37\xde\xe8\x02\x67\x78\x8e\x3e\xb0\x21\xb9\x45\xe4\x92\x72\x27\x65\x62\xf6\x57\x9e\x2e\x33\x5f\x85\x0f\xe2\x2d\x98\x75\xe9\x22\x20\x38\xb9\x15\x1b\x34\x54\x3f\xe3\x3f\xce\x94\xcf\x8e\x5a\xe1\xb2\x8f\xf4\x20\x66\x8e\xcf\xab\x47\xa9\x62\x98\x54\x38\xf8\x8d\x0f\x42\xee\x6d\xb4\xfe\x51\x68\x74\xcd\xc1\x04\xf5\x4e\x4e\x0c\xaf\x14\xcc\xb8\xbe\x74\x85\xa6\x37\x5f\xe0\xc4\xe3\xd2\xca\xc9\xde\x9e\x96\x06\x16\xbc\xc8\xf2\x34\x26\xf1\x0d\xcb\xeb\x1a\x9d\x9f\x93\x0c\xe1\x45\x84\x82\xd4\x47\xe7\x24\x21\x19\xb8\xa8\xd3\x4a\x66\x0a\xd7\x6e\x42\xae\x8b\x6e\x1c\x25\x7a\x2a\xd6\x4b\x9c\xe5\x4a\x62\xb4\xae\xc1\x7a\x99\x94\xa0\x65\xa1\xee\x0d\xa5\x6c\x04\x21\x08\xa1\x12\x68\x73\xad\xf2\xf0\x4e\x41\x13\x3e\x95\xdc\xf4\xe5\x08\x2c\xcd\xb4\xf1\xc3\x2d\xab\xe3\x87\x5b\xd7\xc7\x0f\x95\x1a\x91\x8b\x2a\x2b\xe3\xc5\x37\x44\xca\xc5\x87\xed\xa2\x63\xb2\xc7\x96\x70\x52\xc1\x60\xed\x64\x03\xf7\x8a\x0b\x9b\x77\x55\x4a\x00\x5b\xe3\x43\x71\x9a\x57\x23\xa4\x03\xd4\x18\x5d\xb2\x4d\x8e\x16\x67\xe8\x96\x68\x13\xe7\xe9\x0a\x93\xd2\x36\x0e\xd4\xc6\x34\xad\x30\x31\xc9\x01\x03\x78\x61\x10\xda\x85\x71\x65\x78\x1f\x8d\x2b\x3b\xd1\xf8\x2e\x96\x59\x95\x7a\x6e\x78\x64\x40\xd5\xe1\xa4\xdf\x95\xce\xf6\xf2\x9c\x1e\x85\x55\x58\x27\x36\x60\xad\x66\x97\x81\x7c\x2a\xdb\xc6\x9e\x12\x3c\x51\x17\x41\x3b\x09\x8e\x0d\x91\xef\xbb\xfd\x35\xa4\xb8\x05\x2e\x2e\xc0\x60\x1f\x4c\x91\xf7\xdb\x60\x88\x0e\xfd\xee\xb0\x77\x78\x80\xfa\xdd\x09\x1a\xf6\x86\xe3\xee\x04\x4d\x72\xfa\x07\x9a\xb0\xff\xd7\x65\x3f\xba\xec\x8f\x2e\xfd\x63\xf2\xc7\xbc\xdf\x9d\x3c\x3b\xe8\x8d\x8f\xd0\x10\x0d\x11\xff\x63\x30\xcc\xc7\xf4\xaf\x41\x5f\xfe\x5f\x97\x17\x74\x07\xfd\x57\x83\xc3\xde\x64\x08\x60\x68\xf8\xc7\xbc\x8f\x06\x47\x3e\xfd\x3c\x44\xfd\xee\x51\x77\xd4\x9b\x1c\x75\x8f\xba\x47\x39\xfb\x03\xc1\xff\x47\xf4\x07\xa2\x3f\xd8\x1f\xb4\xec\x0f\x0f\x49\x06\x74\xaa\xd4\x4d\xa1\xd0\xf8\xea\x96\x0e\x57\x79\x90\x48\xae\x90\x2a\xbb\x3d\xee\x3b\xb3\xc8\xa5\xaf\x46\xc8\x3d\x18\xb8\x98\x69\x13\x05\xbb\x0d\xf0\xac\xda\x63\x9c\xda\xfa\x72\x61\x6f\xbe\x8c\x84\x26\x90\x53\x52\xa3\x0b\x34\xaa\x96\x12\x0b\x0f\xee\x59\xba\xf7\x87\x6d\xe4\x4b\xd9\x46\x86\xf7\x6a\x37\xd0\x4d\x5c\xae\xfd\x40\x7e\xff\xd4\x3b\x82\x4e\xd8\x8a\x3d\x41\xb7\x9f\xb9\x8a\x37\xd9\x17\x64\xe5\xf2\xce\xb0\xcd\xec\xfc\x9f\xde\x70\xfe\xb5\x65\x99\x39\x27\xb4\xb8\x48\xe9\x25\xe5\x45\x58\x41\xc2\x51\x05\x78\xdd\xbe\x64\x42\x9a\x91\x91\x9e\xe1\x38\x86\x93\xa5\xaa\xcf\xc7\x15\xf0\x75\x5d\xb5\x30\x2b\x0c\xb0\xec\xc0\x85\xb0\xaa\xb9\x41\xdf\x05\x5d\xdb\x98\x86\x54\x9d\x01\x69\x9e\x47\xb3\x98\x3c\x4b\x93\xbc\xc8\x96\x7e\x91\x66\x2f\x61\x2b\xa8\x6c\x77\xb0\xba\x6e\x1d\x15\xd5\x0d\x4a\xbc\x3c\xe2\x61\x75\xd7\xcb\xa0\x75\x2d\x4a\x74\xbb\x3d\x73\x7f\x49\xb3\x79\x9d\xbf\xd2\xf0\x78\x58\x86\xad\x43\x2f\x81\x64\xb5\x0b\x12\x2f\x48\x56\x19\xca\x6b\xfc\xd5\x3a\x1b\x54\x64\xfc\x97\x23\x78\xf7\xd7\xdb\xec\x25\x34\xe4\xae\xae\xd1\x3c\x7f\x11\xe9\x3e\xcb\x0a\xf7\x84\x9e\xb4\x60\x04\x2b\x52\x94\x11\x11\x4a\xbc\x28\xeb\xe2\x21\xd9\x42\x6f\x73\x63\x8a\x6d\x66\x48\x93\xa7\xf1\xb2\xfa\x89\x70\xd9\x4e\xe1\xb2\xc6\x60\x04\x3e\x11\x3c\xc9\x2d\x8a\x72\x99\x53\x72\xdb\x36\x19\xd6\xa5\x5b\x3e\x2a\x60\x90\x81\x3f\xcf\xa4\x21\x46\xe4\x3d\xd6\x29\xda\xa6\x5d\x26\x4d\xfe\x27\xb9\xf9\x29\xbd\xaa\x0e\xcb\x5b\xc6\xf1\x2f\xc3\x54\xe4\xa2\x70\x43\xdb\x8a\xe1\xc3\x29\x37\xa6\xd6\x3b\x60\xbf\xbf\xc8\x75\xca\x24\x50\x90\x08\xe5\x7e\x6e\x49\x85\x80\xa4\x83\x4a\x35\xe1\xfd\x90\x29\xe4\x02\x68\x4b\x4f\x00\xc0\xa3\x2c\xca\x9f\x05\x99\x53\x5c\xc5\x45\x94\x83\xf2\xaa\xe0\x1f\xd5\x03\x3d\x75\x78\x2b\x3a\x18\xb8\xe6\xf0\xc9\x6b\x85\x69\x86\x5a\x80\x37\x26\xf4\x7a\x84\xb3\xf3\xe5\x1c\x5c\x06\x62\x92\x9c\x17\x17\x1d\x5a\x42\xf7\x93\x27\x59\x86\x6f\x5a\x14\xaa\xdd\x41\xef\xde\x93\x1b\x74\x8a\xfa\x27\xec\xaf\xef\xa1\x36\xfb\xf1\xf8\xb1\x7a\x4b\x43\xab\xbe\xa1\x85\x6f\x75\xcc\xac\x44\xbc\x0a\x31\xfc\x54\x33\x48\x33\xd0\x82\x3e\xb2\x3f\x2e\x22\xf9\x26\xbb\xfa\xc0\xb6\xbb\x29\x9e\x11\xa8\xee\xf6\xde\xd1\x6d\xa2\x48\xdf\xbd\xa3\x9b\x31\xa0\xb3\x04\x2b\xd7\x94\xb5\xdb\xa0\xf3\xeb\x41\x12\x73\xee\x6d\xfe\x86\x36\xf1\xb6\xe7\xa7\x89\x8f\x8b\x16\xed\x61\xbb\xdd\xe6\xf3\x21\xfe\xed\x01\xf7\x51\xc2\xdf\xbc\x15\x45\x61\xea\x2f\x0d\xc3\x57\x4b\x7b\x73\x14\xa2\xd6\x37\x46\xcd\x8f\x1f\x91\x51\xc0\x67\xa3\xad\xc5\x07\x61\x63\x76\x22\x03\x7e\xc8\x57\xf7\x19\x82\xb6\x5e\x0a\x1a\x0c\x3c\x61\x14\x17\x24\x6b\x29\x2a\x92\x32\x4e\xf4\x8d\xf2\x06\x93\xf8\x05\xc3\x70\x6a\xb5\x26\xd6\xa3\x4d\xac\x50\xc3\xa5\x8c\x8b\x06\xbd\x30\x4a\x82\x76\x4b\xc3\xdd\x41\xf5\x94\x26\x3d\x79\x2b\x72\xd2\x69\xb4\xa6\xd7\x37\x3e\xb0\xc9\x69\xb5\x4f\x56\x75\x40\xa3\xec\x4d\xff\xad\x59\xed\x56\xcc\xf4\x05\x4e\x82\x98\x00\x14\xdb\x10\x8d\x59\x87\xed\xb8\x23\xcc\x7c\x26\x0f\x88\x0b\xe6\xa3\x47\x1c\x15\x0b\x9a\x20\x36\x56\x9d\x7e\xd7\x77\x81\x1b\xfe\xe9\x15\x38\x3b\x27\x45\x4f\x7f\xed\xa7\xe2\xe6\xb0\x6d\x44\xe8\xd2\x9b\xac\x2c\x6d\xc3\x69\xcb\x14\x18\x6c\xcf\xd1\x04\x78\xf7\xc6\xf7\x86\xd1\xfd\x9e\xdc\x40\x38\xcf\x24\x20\x22\x00\x16\xdf\x90\xe5\xf0\xb0\x8f\xda\xd2\x60\x5b\xde\x45\x04\xe2\x34\xfd\xf7\x44\x67\x26\x38\xfb\x73\xfe\xa5\xa7\x5d\xe2\xb9\xbb\x23\x17\x68\xe8\x22\xe0\x41\x2d\x78\x89\x0e\x95\xb0\x9b\x38\x87\x48\xb4\x80\x18\x48\x0b\x70\xf1\xce\x11\xe1\x82\xfe\x27\x06\x5f\x81\x88\x12\x03\x6a\xbd\x20\x17\xef\x54\x94\x0b\x4e\xb0\xa7\x2c\x40\x2a\xa0\x85\xb4\xe2\x88\x68\x16\x88\x65\xe9\x31\x36\x20\x39\x60\xcd\x95\x24\xc0\x60\x4a\xca\x37\x55\x25\xa8\xee\x39\x1e\x4f\xff\x01\xcd\x9f\xc3\xb3\x05\x95\x37\x5f\x55\xb7\x49\x78\xc6\x3b\xd9\x9b\xe3\x45\x4b\x4e\x91\xb6\x68\xa0\x8c\x05\xc4\xb9\xd6\x57\x81\xd8\x3a\x2d\x7c\x51\xfe\x2f\x1c\x47\x81\xe8\x13\xd4\x6e\x9b\xf5\xd4\x0e\xb2\x8c\xe3\x13\xed\x83\x5c\xeb\x75\x43\x16\xa7\x09\x31\xb0\x77\x2c\xe4\xc0\xea\x40\x6e\xc7\x28\x67\x22\xa5\xcd\x63\xba\xe7\x8f\xec\xb4\x28\x6a\x25\x54\xac\xb5\xf0\xb3\x8e\xbb\xbf\xf0\xcd\x61\x28\xb6\xfc\xc5\x32\xbf\x60\xa0\x27\x16\xe4\xad\xf1\xfb\xd6\x24\x49\xfa\x3c\xf0\x15\x70\x7a\xca\xd6\x53\xaf\x62\x21\x18\x02\x20\x23\xa0\xb4\x13\xea\xe3\xac\x51\xc3\x53\x65\x80\xd2\x4d\xd0\x75\xfb\x56\x4f\xcb\xaa\x76\x93\x93\xbd\xdb\x56\x89\x7f\x74\x89\x4a\x3b\xf4\x37\x71\x16\xf9\xf0\xe5\x5c\x84\x1a\xde\x60\x1a\xde\x53\x1a\x0b\xf8\xcd\xc5\xf8\xa6\x02\x39\x37\xce\x56\xe8\x47\x39\x5b\xec\xc2\x74\x3b\xf9\x02\x34\xab\x5f\x79\x8c\xfa\x9d\x2a\x96\x8b\x94\x8a\x4c\xcb\x39\x15\x95\xe1\x82\x54\xa9\xf4\x3b\xaa\xa9\x54\xd7\x64\xb9\x85\x07\x45\xf2\x83\x22\xf9\x1e\x2b\x92\x3f\x45\xce\x86\xf7\xe4\xc6\xaf\x56\xce\x1e\x4e\x6c\xc0\x3a\xf4\x1c\xe4\x93\xe4\x83\xf8\x8d\x24\xcb\x0a\xc4\xa3\x7e\xdf\x00\xab\x43\x4b\xbf\x4b\xe0\xe7\xe0\x4c\x5e\xb5\xeb\xa8\xa1\x78\x92\x65\xe9\xd5\x4f\x59\xba\xa0\xe7\x72\xe5\xf3\xc1\x03\x37\x7c\x1d\x35\x06\xe0\x57\xab\xc3\x5f\x87\x28\x7e\x73\xb8\x33\x5d\x02\xcf\x16\x49\xab\x7a\x62\x06\x4f\xcd\x41\xc3\x0a\x21\xd4\x85\xba\x75\x91\x2e\xd2\x4b\x92\xb1\xa7\x26\x78\x59\xa4\x73\x5c\x44\x54\xd6\xba\x41\x33\x82\x72\x52\x20\xec\xfb\x69\x16\x40\x98\x55\xf6\x06\x22\x2a\xc8\x3c\x47\x51\x92\x47\x01\xe8\xe0\x59\x13\x73\x92\x2c\xf9\x3d\xf1\x2a\xca\x89\xfe\x7c\x05\x17\x28\x26\x38\x2f\xca\xad\x33\x1d\x0e\xbb\x28\x29\x1d\x2f\x25\x83\xa7\xe4\xab\xf1\x81\x35\x1c\xbc\x6d\x8b\x41\xba\x00\xfe\xe5\xcf\x44\x72\x78\xd5\x91\x2e\x96\x31\x2e\x88\xde\xf0\x55\x54\x5c\xf4\x84\xe2\x3e\x81\x1e\xa7\x73\x82\xce\xe8\xfa\x7c\x5e\x90\xf9\x19\x53\xe0\x9f\xb1\x67\x1f\x67\x28\xca\x11\x84\xdd\x81\x80\xa2\x67\xac\x11\x07\x0c\x1d\xeb\x7b\x60\x94\xd1\x46\x68\xf3\x8a\xd3\xcf\x75\xfb\xa9\x9c\xdf\x4f\xfb\x74\x8e\x72\xd3\xb3\x57\xaf\x58\x5d\xa6\x69\x32\x99\xb7\xf4\x14\x69\xb3\xc7\x75\xf6\x9b\x38\xc1\xa0\xbb\x7b\x13\x27\x2d\x2d\x74\x41\x53\xb6\xe5\x0f\xd7\x48\x00\xfa\x47\x14\x85\x28\x2a\x78\xb6\x72\xfa\x99\xcc\x17\xc5\x0d\x5f\x2d\xff\x3b\x5d\x22\x1f\x27\x2c\x10\xef\x92\x2f\x77\xf1\xf2\x48\x2e\x05\xf9\xa8\x2a\xca\xd1\x19\x2c\x9c\x33\xd4\x12\xba\x26\xa3\x2b\xb4\xdd\x9f\x29\xfe\xcd\x96\x7c\xe5\x13\x5a\xf5\x82\x8e\x6e\x60\x58\xbc\xdf\x3a\x63\x7d\x77\xbc\x23\x63\x00\x1b\x53\xc1\x76\x59\x61\x74\x9b\x2f\xf3\x02\x36\xc0\x04\xb1\xbc\xc8\x98\x73\x2b\xdd\x2c\x19\x6d\xf9\x72\x41\x6f\x83\x68\xbe\x8c\x8b\x68\x11\x8b\x59\x89\xd2\x24\xdf\xc5\x50\x8b\x66\x36\xeb\x60\xcd\xbb\x3c\xba\x63\x3a\x86\x93\x16\xaf\xff\x2a\x0f\x3c\xab\x70\x51\x64\xd1\x6c\x59\xc8\xf5\x26\x27\x2d\xcd\x10\xcb\x1a\x55\xfd\x1c\xf0\x73\x1a\x7e\x85\xf0\x64\x58\x80\x61\xc6\xc5\x42\xdb\x95\xf9\x57\xd4\x85\x13\x07\xea\xb2\x0b\x02\x1f\x1e\xf6\xd2\xf1\x0a\x2b\x02\xb6\x6b\xf9\xfd\x25\xf5\x97\xd5\x13\xbd\x1a\x43\x46\x70\xf0\x22\x89\xeb\xf7\x00\x13\xc5\x4b\xb0\x36\x98\xdb\x19\x2c\xbe\x5d\x2c\x1e\x66\xda\xf8\x57\xad\xc2\xab\xdc\xcb\x0d\x9f\x98\x56\x9d\x2e\xac\xbc\xe1\x13\xd3\x95\x8f\x16\x3b\x28\x13\x07\x7d\x98\x66\x08\x0b\x17\x8a\x98\x04\xeb\xbf\x6c\x5c\xfd\x42\x84\xaf\xbc\x15\xf1\xdf\x85\x9c\xf4\x97\x97\x9c\x21\x9e\xb0\xa4\xf2\xb6\x28\x54\x81\x25\x4a\xf2\x02\x27\x3e\x79\x11\xb6\x4c\x0c\xed\x6a\xf1\x04\x27\x37\x6f\xdb\xe0\x37\xb0\x96\xbf\xee\x2b\x98\x0c\x71\x81\xdb\xd4\xc3\x40\xc3\xb2\xd2\xc5\x40\x83\xdd\x99\x8f\x81\xd6\xc6\x57\xe1\x64\xa0\xf5\x77\x1d\x2f\x03\x7d\x98\x36\x75\x33\x60\x8f\xb4\x4f\xd5\x50\x24\xfe\x45\x9a\xfd\x1c\xeb\xc1\x28\x11\x4a\x17\xf4\xf6\x00\x1b\x93\x69\xa8\x66\x4c\xfa\x0f\x72\x5d\xd0\xd3\x8a\xb2\x20\x0b\x0a\xaa\x9b\xb1\x9f\xc5\x91\xff\xbe\x6c\xc0\x6e\xeb\x89\x69\x5e\x2c\x48\x22\x12\x69\xb0\x93\x2a\x47\xe7\x29\xbf\xf3\xcd\x28\xea\xe2\x82\xf4\xd0\x73\x25\x50\x81\xe1\x9c\x04\x90\xcf\x84\xed\xa8\x7e\x9c\xe6\xfc\x48\x93\xd6\xed\x12\x7d\x54\x3e\x3a\x31\x40\x72\x52\xbc\x82\xd4\x65\x7a\xde\x14\xb8\x2c\x65\xba\x75\x4a\x0d\x0c\xb3\x8d\xfb\xcb\x2c\x23\x49\xf1\x1a\x4c\xe4\x7b\xa6\x41\xca\xb6\xe3\x93\xff\xbb\x24\x79\xf1\x8c\xd2\x57\xe1\xbe\xb1\x82\x14\x35\xf2\x95\x8d\xd0\xdb\x62\x79\xa4\x99\xdd\x52\x36\xc3\xf9\xb7\x72\x26\x0c\x3f\x12\x9e\xa9\x81\x0b\x6c\xa6\x91\xb0\x92\x5e\x37\xcd\x25\x6b\xdd\x9e\xd1\xe0\x2a\x4f\x05\xbe\xa5\xe8\x76\x72\x47\x8d\x93\x3d\xbb\x82\x30\xbc\xeb\x41\x64\xb5\xcf\xcc\xbd\x41\xfb\x6e\x19\x85\x75\x27\x08\xdb\x46\xaa\x2a\xeb\x50\x95\x56\x60\xbb\x97\xee\x51\x45\x8a\x64\xd8\xc6\x7a\x51\xce\xb7\x33\xad\x2a\xf3\xc6\x40\x3f\xa2\x37\x72\x6d\xc3\x36\x51\xb6\x09\x58\x9e\x17\x46\x7d\x7a\x14\xbd\x79\x6b\x5a\x73\x21\xa4\x75\x41\xe6\xf0\x0e\x93\x0e\x32\x13\x64\xc0\x06\xfd\x22\x6c\x95\x4c\xb7\x96\x31\x98\xf6\x51\xab\x7e\x7a\x8a\xba\x83\xb2\x69\x99\x23\x05\x8b\xf2\x2a\x8c\x56\xbc\x62\x0b\x45\xbe\x88\x23\x9f\xa8\x26\x3b\x68\x60\xd7\xdf\x5b\x81\x4b\x0e\x77\x89\x92\xca\x99\x64\xd3\xbd\x20\x59\x1e\xe5\x45\xcb\x68\x50\xe7\x04\x71\x18\x38\x3c\x1c\x60\xe1\x02\x50\x07\x7d\x90\x12\x0d\xa3\x44\xf3\x3d\x02\xfa\x6c\xbf\x1c\xb6\x9e\xf5\x85\xc4\xff\x75\xee\x09\x62\x4f\xae\x5a\xee\x8a\x2b\xed\x7d\xf2\x94\xed\x94\xfa\xf4\x41\xc8\x07\x82\x78\x66\x51\xa5\xdd\x40\x38\xa3\x62\x7e\x7c\x43\x77\xeb\x94\x09\xb6\xb3\xe5\x6c\x16\xc3\x6f\x26\xee\xb1\x91\xd9\x33\x07\x2a\x2f\xd2\x05\xbd\x9a\xe1\x73\x08\x0f\xa1\x8f\x65\xdd\xe1\xb2\xd2\xc3\xaa\xbc\xa3\xd0\xea\xd5\x9e\x4f\xf4\x2b\x1f\x19\x87\x8f\x93\x1a\x4d\x6e\x90\x6e\x36\xa0\x0c\xb9\xb8\x50\x34\x70\x6c\xa3\x55\xdf\x78\xf9\x02\xfb\xe0\x97\x03\xd1\x3a\xbd\x20\xbd\x4a\xbc\xb7\xbd\x28\xf1\xe3\x65\x40\x72\xb6\xd0\x85\x45\x42\xb1\x14\xa3\xc2\x70\x4f\xe1\x6c\x9a\xc1\xbf\x42\x6d\xae\x8d\xf0\x4e\xce\xdc\x46\xa7\x6e\xed\xe1\xe1\x3a\x79\x9b\x9d\xbd\xfa\x01\xe3\x9c\xbe\x57\xe2\xde\x62\x4c\xa0\xe9\xff\x52\x3a\xfd\xe4\x65\xa7\xc1\x0c\x3a\xeb\x69\xbd\x4b\x20\xe6\x6f\xa2\x65\x3e\x82\x69\x78\x7a\xc3\x2e\x63\xa5\xe8\x3e\x38\x47\x57\x04\x5c\x04\x72\x42\xaf\x6a\x91\x7f\x81\xd8\x05\x1b\xb5\x40\x9b\xd3\x56\xe3\x2e\x76\x11\x7b\x9f\x77\xc9\x0c\x3b\xf6\xda\x33\x2e\x13\x9f\xcb\x6d\x4f\x6a\xf0\x95\x4f\x9d\x2c\x5a\xdf\xbd\x4f\x2a\x54\xe9\x76\xa5\x81\xda\xd9\xaf\x24\x2c\xb3\x5c\x3a\x93\x68\x21\x2d\xaa\xa2\x02\x12\x25\x16\x94\xd4\x4a\x1a\x90\xb2\xb4\xb9\x0b\x22\x67\x2c\xed\x3b\xfd\xad\x43\x48\xfd\x9f\x84\x11\x25\x3a\x14\xfb\xf4\x17\xa9\x55\x53\xd0\xb2\x48\x07\x2f\xc3\xe9\x55\xf5\xec\x09\xe8\x47\xf4\xe1\x96\x5e\x8f\x2d\x28\xd3\x4f\x92\x6f\x27\xef\xf4\xad\x7b\x03\x4f\x4a\xa6\x28\xd2\x81\xa0\x40\x87\x11\x3b\xb7\x02\x12\x25\x26\x94\x54\xc8\xe8\x80\xb2\x50\x87\xcd\xb5\xfd\xe7\x9d\xb5\x4b\xac\xe5\x2d\xba\xa9\x1f\xa8\x5c\x00\x90\xe2\x4c\x73\x0a\x35\x73\x9f\xa9\x9c\x68\x5a\x78\x19\x4f\x67\x3b\xdd\x91\x34\xe1\x79\xf5\x91\x27\xd8\x85\xfe\x2d\xa7\x8f\xb9\x98\xd2\x69\xf2\xcc\x90\x21\x1e\x1f\x73\xfa\xa7\x18\x59\xf6\xb7\x1c\x3c\xfa\x53\x8e\x90\x72\x5a\xd5\x1d\x55\xc1\x83\x11\x28\xd0\xf7\xe7\x3b\xe6\xb5\x50\x2b\xe1\x54\xde\x67\xcb\x49\x2e\x7c\x9c\xa0\x24\x2d\x40\xa7\x67\xe8\xf2\xc0\x32\x27\x70\x48\xd5\x5e\x44\x72\x96\xa1\x04\x33\x2b\x64\x4e\x97\x6b\x11\xcd\x09\x15\x99\x30\x3a\x7b\xc5\x55\xcb\x4a\xc7\x53\x4a\x7f\xb1\x85\xae\x7d\xa3\xf3\xa6\xd5\x29\xe8\x84\xf6\xdd\xd4\x4a\xf2\xae\x06\x68\x76\x63\x9c\x54\xf3\x05\xd3\x0f\x82\x08\xb7\x1b\x9a\x8d\x1d\xcf\x45\xb4\x0e\x70\x67\xaa\xad\x53\xbe\xa9\xaf\xb3\x91\x6a\x84\xfd\x67\xa4\xc5\xd0\xf3\xb2\x99\x6e\xb2\x8d\x1b\x40\x62\x39\x78\xa6\xcf\x6c\xd5\x3d\xc3\xba\x35\x69\xc4\xac\x4e\xc4\xc5\x1a\x5a\x15\x27\x87\x5e\x65\x64\x16\x32\x71\x82\xc9\xd3\x4d\x4f\x2c\x47\x2b\xb7\x3b\x16\x45\x55\x9e\xcc\xba\x6d\xd1\x75\x30\x22\xa4\xcc\x23\xe5\x33\x00\x19\x6e\xc4\xae\xfd\x1f\x21\xcd\x58\xe0\xd8\xfb\x91\x12\x4f\x1c\x2e\xca\xba\x99\x40\xfc\x65\xde\x3a\xb9\x17\x82\xed\xd0\x4d\x2b\x86\x53\x75\x0e\x98\x95\xda\xb6\xeb\x34\xdb\x9f\xb5\xc2\x76\x73\xae\xb1\x5c\x6f\x54\xb4\x61\x27\x4f\x42\xdc\x50\xe9\x40\x2d\x5d\xa8\xad\xcb\x89\xf2\xe1\x76\xa4\x3c\x42\xa8\xb8\xc8\xd2\x2b\x94\x90\x2b\xf4\x73\x96\xa5\x59\xcb\xb1\x4e\x2f\xcb\xdb\x8a\x54\xfe\xab\xec\x4d\x2a\xa3\x6e\x79\x53\x04\x7f\x09\xb1\xd5\x9e\x32\x43\x49\xcf\x2b\xd3\x0b\x29\x39\x79\x14\x54\x5b\xfd\xa3\x7d\x7b\x15\x25\xe7\x20\xf1\x78\x9e\xe3\xeb\x6f\x4a\x22\x52\x9a\x12\x48\x93\x9a\xce\x17\xcb\x82\xfc\x24\x1b\xe0\xf7\x52\x0e\xb2\xbf\x8f\xfe\x91\xca\x24\x48\x82\x0c\x9c\xdc\x08\x4b\x36\xbb\x13\x87\x11\x89\x03\xd3\xac\xcd\x47\x1a\x16\x1d\xd3\x06\x47\xf9\x4f\x51\x56\xdc\x30\x85\x71\x8f\x87\xab\xf8\xf8\xd1\x90\x0d\x6d\xf5\x9d\xb6\x87\x9b\xea\x17\x35\x22\x1a\x48\xcb\x56\xbc\x38\x14\x25\xa5\x0e\x9b\xf7\xb9\x5b\xd7\xf0\x33\x27\x9d\x72\x28\x91\x66\x0f\x35\xca\x2a\xc9\xf5\xdf\x67\x38\x5f\x67\xdc\x6a\x57\x26\xf5\x92\xcc\xa5\x03\x84\x1c\x60\x4e\x35\x1d\x10\x64\x2a\xe8\x84\x52\xcd\x5c\xf1\x1b\xac\x89\x92\xc5\x7e\xad\x85\x21\xc5\x0e\x6d\x51\x20\x5b\x83\xa5\x77\x7a\x85\x82\x0f\x8e\xe9\xee\xe0\xc4\xea\xbc\xc4\xf0\xe8\x91\xc5\x1b\xf6\x08\x58\x4b\xa9\xac\xf6\x13\x1c\x60\x91\x5b\xc3\x8c\x36\xf9\xee\x67\x25\x77\x26\x59\xee\x0d\x2e\x6a\x2b\x88\x5d\x2d\x3c\xac\x78\xf5\xc3\xdf\x3e\x31\xbf\x2e\xaf\x7c\x7b\xa0\x27\xa2\xf8\xcb\xba\xf7\xc4\x91\xff\xde\x7a\x35\x23\x4d\x02\x7c\x79\xb8\x34\x25\xe6\x5b\xc7\xea\x91\x51\x7b\x87\x14\x8f\x7f\x2c\xcd\xee\x7f\xd3\x28\x69\x51\x49\x9d\x0a\x54\xc6\x38\x3a\x77\xe8\x79\x94\x44\xf3\xe5\x9c\x5e\x16\xc4\x5d\x5d\xd9\xa4\x7a\x42\xe9\x83\xbe\x39\x65\xd9\xc8\x1e\x3d\x42\xdf\xa8\x7b\xfd\x8f\x2e\xd8\x9e\x1f\x47\x24\x29\x18\xc4\xd4\xc8\x95\x52\x3f\x2f\x6e\x99\xcb\x12\xe9\x1a\x09\x74\x77\x90\x17\x4d\x01\x60\x13\x71\xcd\xfc\xfd\x1b\x78\x44\x6e\x59\x84\x33\x05\x52\xc8\x12\xb9\xc8\x48\x9e\x93\xc0\x9b\xea\x53\x92\x2e\x48\x82\x7e\x44\x1e\x3d\x2a\x3c\x34\x45\x1e\x1c\x92\x96\xe8\xaa\x82\x28\x4b\x95\x88\x4c\x3d\xd7\x37\x41\xf9\xd2\x60\xcf\xf1\x2d\x34\x8c\x8c\xf4\x2a\xc9\xdd\x34\xcc\x49\xb2\xec\x42\x92\x44\xd0\x92\x7c\xfc\x88\x3c\xcf\xcc\xb7\x67\x62\xba\xc0\xf9\x22\x5d\x2c\x17\xde\x94\xd3\x6f\x3f\x52\x93\x6f\x93\xca\xea\x61\x1b\x94\x89\xa9\x96\x52\xbe\xf4\xe8\x8d\xad\x5e\x39\x08\x1f\x3f\x2a\x05\x84\x1c\x10\xdb\xa4\x6a\x23\x31\x05\x5a\x7d\x87\x72\x68\x95\x94\xb0\xd7\x94\x75\x59\x30\x52\xaf\xd3\xe4\xbe\xc1\xa5\x67\xd7\x19\x89\x7e\xe4\xa7\x0e\xdf\x2c\xd8\xe5\xcb\x16\xb3\xdd\x57\x83\x1a\xc1\xdb\x2d\x74\x83\xc0\xed\xd2\x01\xeb\x58\x0b\x96\x36\x84\x79\x74\x79\xda\x26\xd9\x78\x68\x36\x12\xb7\x37\xd8\x32\x98\x5b\x7f\xf9\x2d\x6d\xc3\x3b\x60\x14\x4c\x2b\xd6\x82\xc9\x4a\x4a\xdd\xee\xd8\x62\x2d\xae\x63\xfa\x7a\x73\xc9\xd9\x8c\xa9\xdb\xbf\x8d\xe9\xd0\x3f\x18\xfc\xaa\x14\x87\xf6\x25\x8a\x7e\xf8\x35\xca\x45\xa4\xfd\x1a\x1b\x9b\x44\xd1\x33\xea\x38\x6e\x65\x6c\x67\x89\xa3\xbc\x98\xa5\xd7\x5e\xed\xb5\xec\x77\xbc\x20\xd9\x3a\x6d\xab\x0a\xe5\x86\x79\x5a\xcc\x86\xf7\x77\x44\xcf\x4b\xee\x95\x6e\x9f\x9c\x16\x68\x05\x05\xf2\x24\xfd\xd1\xf9\x99\xe5\x26\xe2\xdb\x62\xdb\x1a\x86\xbd\xaa\x31\x01\x39\x5f\xed\x26\xfc\xaf\xca\x57\xb8\x9a\x75\x60\xe5\x33\x5c\xdd\x2d\x46\x0f\x77\xa7\x8a\x3d\xd7\x8b\x4e\xa3\x89\x5d\x3c\xe9\x3c\x78\x08\xa3\xf9\x10\x46\x73\xeb\x61\x34\x0f\xd1\xa0\x1f\xb3\x98\xbb\x13\x3d\xb0\xa5\xfd\xea\x4a\xf6\xd4\xf8\xf0\x49\x42\x59\xee\xd9\xb4\xb8\x82\x58\xda\x8f\xb9\x8c\xdf\x8d\xc3\x56\x1a\xb5\xca\xf1\x2a\x0f\xef\xe3\x12\x7c\x95\x60\xff\xfd\x0c\x67\x95\x4f\xe3\x8e\x3e\x73\xc2\x51\x41\x60\x65\xce\x51\x01\xf0\x8c\x07\x7a\xab\x7a\x68\x38\x69\xd2\x11\x0b\xd9\x2e\x3b\xc4\x9b\xb8\x0f\x29\x48\x8f\xee\x17\x67\xae\xce\x1f\xfa\x10\x36\xf5\xe1\xb5\xfb\xc3\x6b\xf7\x46\xaf\xdd\x3f\x47\xaa\xdd\x3f\xe9\xfb\x7a\x68\xf1\xe7\x4b\x92\x14\xf4\xe6\x45\x12\x52\x75\x2a\x8e\x47\x35\x75\x56\xf6\xc9\x80\xfe\xa4\x69\x83\x8b\x0c\x27\x79\x04\xef\xe4\xaa\x1a\x51\x5b\x27\xe8\x6b\x9e\x5c\xe1\x9b\x15\x83\x31\x3c\xee\x57\xd7\xa9\x23\xb0\x04\xbc\x56\xc8\x5c\x76\xf6\xc7\x51\xe5\x43\xf7\xe1\xd1\xc0\x84\xab\x95\xca\x29\xc0\x66\x22\x85\xab\x46\x6d\x53\xd6\xf9\xff\x10\x3a\xe0\x4f\x1d\x3a\x40\xde\xfe\x69\x79\x05\x81\xfc\x7d\xd9\x7a\x88\x5f\xcb\xc5\x2a\x5f\x49\x56\x30\x7a\xbf\x71\xff\x1d\x38\xb7\x38\x14\x0a\xfb\x4f\x4b\x96\x3e\x6f\x9b\x14\x4b\x9c\x3b\xcb\x61\x4d\x2b\x9e\x2f\x8b\x02\xb6\x3a\x96\x2c\x3a\x5f\x60\x3f\x4a\xce\x7b\xcb\x24\x2a\xd0\x77\x68\x74\xc2\xc1\x0a\xf0\xa9\xfc\x40\xff\x9d\xa2\x3e\x73\x65\x87\x91\x4a\x8b\x22\x9d\xc3\x27\xf6\xa7\xf1\x35\x8b\xce\x2f\x0a\xf8\xf8\xdf\x65\x5e\x44\xe1\x0d\xdf\x03\xa6\xc8\x0b\x63\x72\xdd\x25\x49\xe0\x29\xe8\x98\x84\x75\xc0\x79\x81\xb3\x42\x03\x2f\xd2\xc5\xab\x05\xf6\x89\xa2\x8b\xf7\xc5\x22\x4e\x01\x09\x0a\x6d\x38\x20\x53\x81\xc1\xcf\x32\x14\x25\x4f\x01\xd1\x5f\x65\x18\x9f\x24\x6c\x34\xd9\xcd\x88\x01\x79\x93\xfe\x5f\xb9\x75\x82\xa3\x06\x37\x3f\x5e\x04\x67\x54\x98\x66\x73\xb0\x63\xe0\x24\x8f\x71\x41\xfe\x57\xab\x3b\xe9\xff\xb5\xed\xb1\xf4\xdc\x76\xba\xf1\x2c\x4d\xb5\x5c\xe3\x7f\x70\xeb\x0c\x9b\x40\xf6\xab\x97\xf3\x4d\x57\x68\x01\x17\x29\x63\x2a\x3a\x98\xd1\x35\x09\xa4\xb5\x84\x9b\x1a\xf8\x20\xcb\x62\x46\xb9\x34\xef\x70\xba\xe5\xef\xd2\x0c\xb1\x8e\xcb\xea\x38\x8e\xce\x93\xe7\x05\x99\xe7\xea\x1b\x53\x36\x32\x08\xa6\xa8\x7e\x9d\x2e\x9e\xc1\xb7\xe9\x2a\x03\x18\x47\xcb\xae\x2e\x53\xf4\xa6\x48\x17\x22\x05\x3a\xef\xf7\x2c\x23\xf8\xfd\x22\x8d\x92\x22\xef\x2d\x17\x2d\x6f\x1e\x78\x6d\xa5\xcd\x95\x15\x19\x2d\xbc\x6e\x5b\x27\xe6\x29\x30\xc7\x86\xf4\x30\xce\xda\x36\x49\xaf\xd3\xc5\x4b\x36\xf0\xeb\x0f\x4f\x87\xcd\xd9\x5a\x24\x71\x76\xd5\x98\xd3\xc4\x09\xdc\xdf\xd1\x96\x4b\xf5\x38\x6e\x46\x37\x1b\xc6\xad\x93\xae\xed\x03\xab\xa8\x7f\x9d\x2e\x7e\x05\x54\x9b\x8c\x38\x25\x62\x2d\xaa\x1d\xdb\x81\x73\xc4\xe5\xd6\x53\x3d\xe0\x1b\x51\x2d\xc6\x7b\xcb\x84\x1b\xe3\x5d\xa2\x9d\xed\x69\xb7\xeb\x1d\xb5\x2f\xb2\xe8\x3c\x4a\xf8\xc6\x7a\x91\x66\xd1\x1f\x69\x52\xe0\xf8\x0e\xaf\xcc\x01\xa2\xf5\xc6\xa3\xf4\x79\x6f\xdb\xf5\x19\x0d\x5b\x6f\xc4\x2e\xd6\x00\x12\x06\xa7\x0e\x90\xbd\x60\x67\x79\x60\x2f\x49\x06\xa1\x94\xb6\xd0\x93\x22\x5d\x6c\xb7\x23\x6c\x1e\x9b\xf4\x84\x4e\xe7\x36\x92\x57\x60\x26\xaa\x28\x97\x3c\x2d\xde\x93\xcf\xce\xaf\x3f\x75\xa8\xd6\x52\x7f\x61\x05\xcb\xd8\x25\xe2\xaa\x74\xa6\x75\x1b\x20\x18\xfb\xaf\x20\x85\x2d\xce\x2f\x69\x71\x7c\x31\xcb\x83\xed\xd9\xa5\x8c\x25\xf0\x99\xce\xfe\x3c\x8a\xe3\x28\x27\x7e\x9a\x04\x10\x86\xec\x0a\x47\x05\x9a\x91\x30\xcd\x88\x15\x6f\x2d\x88\xf2\x79\x94\xe7\x54\x46\x17\x88\xa2\x1c\xcd\xc8\x05\xbe\x8c\xd2\x8c\x07\x68\x62\x0e\x2a\xb3\x1b\x71\x35\x66\x9e\x87\xec\x05\xc4\x32\x8e\xcf\xf4\xe8\x27\x22\x96\xda\xdf\xa3\x80\x88\x2b\x47\xe5\x68\xf3\xd8\x1b\x1b\xf6\x44\xd1\x8e\x70\x48\xe5\xe4\x65\x4e\x32\x66\xa3\x63\xab\x9b\x77\xe9\x79\x88\xce\x6c\x92\x0c\x97\xe4\xc4\x2b\x50\xbe\x20\x7e\x14\x46\x24\xe8\xa0\xa8\x40\x41\x4a\xe0\x25\xc1\x85\x1a\x98\x95\x58\x14\x0a\x34\x5b\x16\xe8\x2c\x23\xf9\x72\x4e\x4c\x70\x68\xab\xc3\x10\x5e\x11\x39\x9e\x45\x5a\xc6\x8d\xf6\xd1\xf0\x0c\xcd\x73\x3d\x14\x8c\x8d\x70\xad\x81\x7d\x1e\xc2\x23\x96\xab\x28\x67\x73\x57\xe0\xf7\x32\x7b\x0d\x82\x78\x7c\x10\xa5\x45\xbc\x8e\xb3\xa3\xb6\xc8\x17\x30\x4b\x3b\xb6\x0c\x1f\xa0\x7f\x2b\x87\xd5\xa8\xe8\xa0\x24\x55\x1b\x10\x17\xec\xcf\x1c\x41\xb2\x98\x5b\xb2\x1e\x64\x6c\xd3\xd0\x75\x52\xc9\xb1\xe1\xf6\x2c\xea\x6f\x67\x87\xe6\xd8\xda\x9f\x33\x8c\x9c\x1d\xeb\x68\xb3\x20\x71\x30\xaf\xfc\xfc\xa4\x93\x2b\x9d\x41\xfd\x34\xc9\x89\xbf\x84\xe7\x35\x62\xa6\x73\x14\x66\xe9\x1c\x61\xf1\x66\x9c\x4d\x2f\x8b\x83\x96\x83\x5b\x28\x43\xfa\xbd\xa8\xb0\xff\x43\x07\xe1\x80\x0d\xc4\x7b\x72\x63\x04\x2c\x22\x49\xbe\xcc\x08\x04\xc4\x5f\x50\x3c\x49\x81\x8a\x8c\xe0\x62\xce\x13\x52\x11\xec\x5f\xa0\x39\xc9\x73\x7c\x2e\x62\x2f\x91\xde\x79\x4f\x21\xa7\x18\x4f\x3f\x70\x88\x5b\x44\xdb\x92\xc1\x22\x3b\xfc\x11\x34\x7c\x43\x73\x7c\x83\x96\x8b\x00\x17\xa4\x1b\x25\xdd\x45\x4c\xef\xe5\x38\x61\xb1\xaa\x50\x48\x70\xb1\xcc\x48\x8e\xf2\xa5\x7f\x81\x70\x5e\xda\xe0\xa0\xfa\x8c\xd0\xe5\xe1\x13\x23\x62\x1e\xbc\x82\x95\x3a\x93\xf7\xe4\xa6\xc5\xdf\xe6\xd1\x7f\xe0\x1d\xa9\x9a\x6d\xfa\x53\x18\x41\xc1\xdf\x9c\x5b\x02\x17\xc2\xce\xd4\xbb\xc0\xf9\x8b\xab\x44\x88\xe2\xcc\x97\xc5\xc2\xa7\x39\xa4\x97\x5c\xd1\xe1\x29\xeb\x99\x87\x1e\x4b\x68\xf4\x18\x79\x67\xe8\x02\xe7\xb0\xd6\xd0\x7f\x3c\x9c\xdc\xfc\xc7\xeb\xc0\x06\x76\x85\xd9\x63\xaa\x45\x96\x5e\x46\x01\xe3\x4c\xa8\x6c\x10\x0c\x18\x7a\xe8\x77\x9c\xe7\xda\xcb\xce\x34\x83\xc7\x0f\xec\xdd\x22\x3b\x1d\x3c\xdd\x3f\xa8\xbc\xe5\x8b\x89\x70\xc9\x6a\xfc\xdb\x17\x24\xac\x59\x19\xbb\xf8\x81\x06\xbb\xb2\x54\xd8\xc1\x3b\x11\x7a\x98\xc9\x33\x88\x45\x3c\xfb\x99\xa9\x14\xd6\x1b\x0b\x97\x36\x74\xc3\x91\x71\xa0\xda\xce\x38\x95\x11\xd7\x8f\x9a\x8c\xa9\xd6\x70\xcc\xa2\xe4\xfc\x61\xd8\xdc\xc3\x46\x77\x00\x18\x37\x7d\xef\xe2\xc3\x46\x82\x87\x51\xab\x5b\xa2\xd7\x51\x61\x73\xdb\x75\x54\x3c\x8c\x59\xf5\x02\x75\x8f\xd8\xc3\xf2\xac\x5f\x9e\xd7\x51\x61\xad\x4e\x28\xf9\x2a\xc7\xac\x1c\x07\xf4\xb7\x74\x99\x13\x7e\x34\xde\x21\x9c\x28\xa0\xf9\x95\xe0\x9a\x70\xbc\xcd\xf2\x6f\x9a\x77\xa7\x8c\x79\xbd\xc3\x15\x96\xca\x89\x2a\x84\x8e\x10\x81\x6e\x16\xfc\x46\x7e\x66\x3a\xcf\x43\x6c\x6f\x91\x86\x34\x27\x05\x62\xd1\xfb\x22\xd6\x82\x1d\x99\x49\x5c\x2d\x2f\x22\xff\x42\xaf\x28\xae\x79\xa6\x5a\x08\x9d\xa5\x0b\xc2\x2f\xb1\x06\x31\x2c\x2c\x00\xce\xe1\x86\x8b\x33\x3c\x27\xf4\x7a\x0d\x31\x4d\xe1\x99\x9a\x08\xd5\xee\x42\x9f\x91\x7c\x41\x2f\x06\x20\x2e\x5a\x7d\xe1\xe4\x85\x69\x86\xc8\x35\x9e\xd3\x4b\x04\xcc\x00\xbd\x1f\x9c\xf9\x71\xe4\xbf\xc7\x57\xf8\xe6\x6c\x57\x19\x4a\x59\x97\x78\xd4\xf5\xe9\xd9\xb7\x45\x34\x27\xe9\xb2\xf8\xf6\x0c\xb5\x1c\x57\x7b\x72\xbd\xa0\xd3\xd9\x46\x69\x36\x45\x67\xdf\x4a\xf2\xbe\x3d\xd3\xf8\xc5\x7c\xe7\xd0\x98\x63\x54\xd4\x66\x35\x19\x51\x0e\x4f\x2b\xb4\x15\x0e\x0f\x2d\xb6\x1c\x33\xb9\x74\x25\x2f\x05\x7b\xb5\x20\xd6\x8f\xa4\xac\x56\xaf\x2b\x9c\xab\xda\xd6\xd6\xdd\xb9\x2c\x57\x81\x0d\x37\x2d\x13\xcb\x76\xf6\x2b\x03\xa7\x43\x33\x17\x88\x7b\x22\xe5\x7c\x73\x6f\xef\xd0\xa5\xac\x6b\xb9\xb4\x20\xc2\xf4\x56\xc9\x94\x4a\x37\xf2\xfa\x8c\x38\xd3\xb2\xd0\xb9\x71\xac\xa1\xca\x3b\xf4\xde\x15\x25\x41\x74\x19\x05\x4b\x58\xa3\xa0\xa8\xc3\x09\x8f\x21\xe5\x9a\x04\xa5\x4a\xda\xf4\x18\x51\xce\x0a\x77\x3e\x46\x24\xaa\x6d\x1f\x23\x02\x71\x5b\x1a\x8a\x34\xc7\xed\x8d\x43\xe8\x0a\xa3\xf8\xca\xf8\xb9\x1c\x70\x77\xc1\x73\x85\x93\xf7\x57\x11\x39\x97\x77\x76\xad\xb0\xb9\x62\x80\xb6\x15\x33\x77\x7f\x1f\xfd\x93\x1f\x7e\x10\xe6\x9b\xe9\xb9\xc0\xaa\x74\x49\x90\x70\x97\xc8\x7b\xd2\x96\xc9\x44\x35\x47\x38\x5d\xba\x9e\xb3\x27\xfc\xf4\x41\xec\xb5\x96\x19\xc5\x4e\x89\x36\xeb\xc4\x21\xd4\x45\xa2\xea\x40\x88\x0a\xc6\x19\x0e\x11\x19\x84\xfc\x8e\x97\x39\xa9\x48\x5c\xab\x04\xa7\x0d\x88\x84\x7a\x2b\x88\x04\x98\x06\x44\xbe\x04\x2d\x79\x05\x95\xd2\x67\x72\x3d\x22\xf5\x53\xbe\x9a\x4c\x1d\x4a\x04\xef\xf4\xa4\xd8\xe0\xd5\x87\x2a\x84\xb1\xad\x88\x14\xec\xc7\x04\x67\xaf\xd9\xbe\xdf\x72\x70\x4d\x55\x08\x62\x3a\x10\x35\xb9\xa3\x75\xea\x4b\x1a\x4d\xfe\x6e\xd0\x0e\xca\x61\x46\xba\xb4\xed\x11\x10\x3b\xc2\x19\x2a\x46\x8b\x00\x29\xa8\xa6\x1d\xca\x56\x20\x34\x42\x44\x98\x31\x18\xf5\x28\x0c\x15\xb8\xeb\x7b\xf8\xf1\x23\xea\xb7\xd1\x77\xa8\xdf\x9b\xd4\x4f\x8d\x3a\x46\xd8\x8d\xab\x61\x3c\x67\xb9\xe8\xa9\xa4\xf7\x69\xc3\x31\xca\x83\xc9\x88\xc5\x28\x85\xb1\x7f\x47\x71\xfc\x5b\xba\x4c\x8a\x8a\xb8\x8c\x65\x40\x3b\xeb\xb8\xce\xf7\x0b\x92\x98\x41\x81\x1a\x8c\x82\x1c\x69\x50\x06\x23\x27\x95\x3f\x45\x41\x23\x22\x05\x9c\x45\x63\x03\x12\x4d\x6e\x59\x83\x34\x3a\x2e\x2f\x89\x4f\xa2\x4b\xc2\x43\xde\xad\x1e\x47\x1d\xbe\x95\x90\x6b\x26\x58\x9b\x34\xcb\x62\x16\xc6\xe0\xd1\x23\xfd\x99\x35\x1b\xc8\x26\x43\xcd\xd2\x45\xad\x39\xd6\xff\x04\xeb\x47\x83\xc1\x66\x80\xad\x45\x46\x2e\x1d\x5d\x90\xc5\xac\x0b\x74\x43\xa8\x99\x89\x15\x13\xb5\x72\xaa\xdc\xa1\x8b\xf4\xed\xb2\x72\xb7\x44\x46\x14\xa3\x26\x33\xfe\xcf\x64\xde\x74\xd1\x70\xd0\xaa\x3d\xbc\x7a\x0b\x67\x92\xd3\xfe\x3e\x82\x8e\x32\x3b\x2b\xbf\x5d\xe7\x28\x20\x31\xd8\x99\x40\x13\x29\x64\x0c\x30\x46\xa1\x8b\x28\x20\xf9\x5e\xb9\x03\xf6\xd0\x55\x10\x5f\x1e\xe1\x86\x31\x59\x4b\xbb\x6a\x59\xd8\x44\x3f\xa0\x3e\x65\x65\x25\x2a\xf6\xdf\x9a\x07\x05\xfa\xd1\xfc\x38\xe5\x01\x9c\xaa\x76\x1c\xe3\xa4\xa5\xfb\x78\xdd\x36\x7f\x5a\x3e\xc8\x2a\x82\xf9\x36\xe5\x1b\xa7\xd8\x96\x93\x42\x54\x75\x1d\x0e\x7a\x9c\xe1\x61\x65\x3f\x8c\xcf\x4d\x7a\xe2\x3a\x14\xcd\x53\xd1\xdd\x58\x8b\x49\x99\x1e\xbf\x4c\x6a\xb2\x49\xa7\x3c\xa5\x2b\x06\x18\xce\x51\x9b\x7d\x99\x38\x03\x57\x5d\x60\x64\xa9\x13\x63\x3e\x1a\xb9\x72\xd3\x48\xce\x95\x3b\x89\x38\xb8\x04\x96\xd4\xae\x78\xc1\xd3\xff\xa1\xab\x28\x09\xd2\xab\xde\x9e\x6c\xf0\x25\x01\x87\xee\xba\x26\x93\x14\xc5\x69\x72\xae\xfb\x88\x34\x6d\x9c\x35\x07\x4e\x1e\x17\xe9\x55\x02\xd1\xb0\x7b\x8e\xe5\xb6\x41\xb8\xe3\x15\x41\x8d\x7d\xf1\x0e\x80\x8f\x3e\xfc\x76\x84\xe7\xd5\x1d\xbb\x34\x70\xad\xd4\x08\x38\xcb\xfd\xa0\x54\x8c\x5e\x1d\xb2\x27\x3e\xeb\x55\x94\x23\x58\x45\x25\x05\x60\x47\x65\xb6\x36\x88\x77\x6e\x46\x32\xa3\xbe\x94\x44\x4b\x2d\xd6\xae\xfd\x6d\xc3\xe8\xce\x2b\x22\x36\x4b\x6f\x89\x15\xd1\x9f\xcb\xba\x14\x55\xa1\xfc\xcd\x88\xbf\xcc\x6d\xde\x2a\xfc\x32\x2b\x30\xc3\x7c\x89\x9b\x9f\x0c\x5c\x0c\x05\x0e\x18\x9e\x7f\xd6\x00\xe3\xa9\xda\x2d\x48\x3d\x0c\xb5\x2c\xb2\xe0\xae\xa3\xc2\x00\xba\x8e\x8a\x32\x84\xdd\x24\x2b\x2a\xc3\x59\x0d\x42\x89\x09\x65\x5c\x72\xdf\x95\xaf\xa7\x0e\x68\x71\xdb\x7c\x57\xbe\x27\x9a\xd0\x56\x32\x96\x77\xae\x1d\xd1\xa8\xb1\xd0\xf9\xc7\x0e\x6f\xe3\xd2\x8f\x2a\x68\xd7\x57\xbd\xb6\xba\x4c\x98\x81\xc5\x35\x8d\xa0\x4e\xc9\xc6\x81\x9f\x99\x12\xae\x83\x3c\x7d\x8d\xc2\x6f\x6b\xd9\xb1\x08\xcc\xf6\x92\x72\xc6\x8b\x66\x21\xa2\x8d\xd0\xd1\x65\x06\x87\xb8\xd0\x8c\x8f\x59\xcc\xe7\x9f\xd9\x53\x0e\xf9\x67\x94\x9c\x6b\xbf\x58\xa8\x69\xc6\x13\xea\x2f\x05\x03\xac\xc2\xfe\x56\xcc\xa0\xfd\x86\xe9\x66\xbf\xf5\xe9\x84\x92\x05\xa3\xdd\x35\x25\x26\xed\xa5\x00\xd3\xdf\x34\x92\xbf\x1d\xd1\x26\x8d\x60\x77\x85\x31\xd7\xb9\xa6\x3e\x42\x28\x4a\xa6\xc8\xe4\x2c\xbc\x58\x10\x9c\xd9\x99\x10\xf8\x09\x3d\x75\x6c\x33\x0a\x48\x3a\x85\x94\x36\x07\xdd\xf5\xc1\xb5\x25\x68\x36\x7e\xc7\x46\x20\x4c\xd9\xf6\xf2\xd7\x0c\xb6\x8e\x45\xaf\x2c\x93\xc0\xb6\xfc\x35\x2a\x8f\x45\xf2\xec\x02\x53\x91\xef\x17\x7e\x28\xf2\x28\xa7\xee\x8b\x76\x47\xa2\x12\x31\x86\x6e\x4f\x9c\xc3\xab\x1e\x9a\xca\xed\x9f\x4a\x53\xf5\x01\xbc\xec\x37\xa7\x2a\x84\x57\x55\x74\x26\xe5\x88\x24\x36\x6a\xe9\x46\xce\xcf\xe9\xdb\x8e\x73\x7b\x68\xb7\x4f\xdc\x7c\x51\x8a\x54\x4b\x99\xcf\xdc\x22\x8c\x0b\x9f\x5e\xb1\x71\x08\x31\x13\x9f\xfb\xe8\x2a\xed\x53\xa5\xc1\x95\xdf\x94\xac\x68\x5f\xbd\x36\x23\x8f\xbf\x2e\x5e\x27\xc4\x19\x0a\xa2\x8c\xf0\x91\x57\xa2\xcc\xe9\x29\x02\xaf\x6c\xf4\x23\xcf\xa2\x82\xa6\x90\x54\x05\x5e\xa1\x98\x3d\x6d\xaf\xdb\xd5\xcd\x82\x49\xba\x9e\xb7\x97\xfb\xf9\x01\xb1\xd4\x40\x53\xe4\x31\x39\xd3\xeb\xa8\xd0\x7e\x25\x85\x5e\xc7\x15\x60\x90\x89\xdb\x9b\x84\xa4\x74\xbc\x39\x77\xcd\xc4\x07\x11\xb1\x90\x42\x96\xe3\x12\x82\x4a\x75\xe3\x10\xe7\x76\x54\xcc\xdd\xc4\x37\xcf\xd2\x54\x85\xcb\x7c\xc3\xcf\x45\x88\x8a\x67\xec\x52\x78\x11\x15\x38\x8e\xfe\x20\xbf\x44\x59\x5e\xfc\x4a\x8a\x82\x64\xed\x96\xe0\xb2\x76\x43\x78\x25\x0c\xb7\xdf\x6a\x01\x35\x4b\xf1\xd0\x4d\xc7\x05\xa7\xd2\xbf\xa2\x0a\x77\x52\x70\xaa\xe0\x8d\x1a\x22\x4c\xa2\xd5\xb6\xe2\x7a\xad\x58\x0b\x08\xbe\x67\x2c\x01\x47\x54\x37\xbe\xcf\xad\x0e\xe9\x26\xec\x35\xfc\xab\x7e\x16\x9a\xcf\x51\x3e\x68\xef\x33\xc4\x73\x88\x8e\xf1\x02\x45\x3c\xa7\x60\xbc\xe6\xb2\x62\x32\x16\xe1\xcf\x2e\xf5\x88\x0d\x3d\x61\x84\xed\x09\x07\xc1\x57\x7e\x46\xc4\x01\x4c\xe0\x9c\x73\xc3\xc7\x04\x5f\x4a\x70\x16\x65\xc8\x15\x83\x8e\xe5\x32\x50\xb1\x25\x14\x07\xb2\xa7\xd2\x1d\xf4\x01\x85\x71\xb4\x98\x8a\x04\x13\x2c\xe0\xa5\xf7\xdb\x32\x12\x43\xe4\xa1\x5b\xcd\x56\x55\x0e\x81\x75\x7c\xbf\x02\x0d\xf1\xd8\x0d\x05\x59\x2c\x2a\xc3\x5b\x1c\x1e\x7f\xee\x00\x58\x8c\xbc\xea\xf8\x57\x05\x59\x54\x46\xa8\x38\x68\x14\xf4\xaa\x20\x8b\x5d\x51\x5e\x4b\xf6\x53\x08\x8c\x5b\x15\xd5\x61\x34\x6c\x4a\xfc\x53\x1e\x60\x77\x37\x5d\x60\xd8\x6b\x3b\x52\x1f\x28\xe4\x80\x45\x2c\x69\xd2\x93\x5d\xc6\x1d\x53\xe8\x6b\xfb\xf2\x2b\x9e\x91\xb8\x92\xa1\x0e\x9b\xf6\x04\xd0\xec\xaa\x1f\x80\xfc\x1e\x44\x4e\x1b\xf6\xb7\xb8\xa1\xd5\x84\xfd\x54\xb8\x79\x62\x1a\xa8\xfe\x67\x0f\xb4\xf6\xe9\x43\x53\xdd\xab\xd0\x6e\xcc\x7f\xe6\xcf\x1d\x32\x6b\xc7\x51\xab\xee\x53\x60\xa4\x17\x59\x24\xb2\x2f\x55\x8b\x0a\x4d\xc3\xda\xe8\xc8\x76\x16\xcf\xa6\x26\x48\x4a\x18\x93\xeb\x29\xf2\x06\x68\x00\x0a\x6e\x23\x18\x49\x1c\x25\x44\x41\xaa\x80\x28\xb3\x38\xf5\xdf\xcb\x7b\xce\x2c\xcd\x02\x92\x3d\x4b\xe3\x34\x13\xb1\x56\x16\x38\xa6\xb7\x87\x1e\x45\xd0\xcb\x99\xd8\xa2\x23\xa6\x24\xfc\x4b\x0a\xc8\xa2\x81\x39\xce\xce\xa3\x84\xc5\x6b\x18\x0c\x3b\x68\x7f\x1f\x5d\xe0\x38\x44\x91\x2f\x25\xfb\x05\x0e\x02\x50\xd6\x78\x7d\xd4\x87\xec\x22\x8e\xe8\x3c\x8f\x91\xb7\xb8\x2e\x75\xe4\xef\x9a\xf0\xfd\xc1\x20\xfd\x75\xba\x78\xc5\x82\x59\x7b\x79\x1a\x47\x81\xd5\xb3\xd7\xe9\x82\x07\xae\x1e\xd8\x38\xcb\x7d\x60\x55\x68\x1f\xea\x50\xd2\xef\x02\xa7\xf8\x32\x8f\x92\xbf\x13\x16\x3d\x62\x38\xd6\x1b\xc2\x31\x84\xea\x2d\xa2\x4b\x02\xa7\xdd\x4b\x63\xfe\xb4\xf8\x35\x78\x96\xa7\xf1\xb2\x50\x01\xff\x21\xf6\x8f\x73\x80\xc6\x66\x38\x1b\xcf\xc7\xb1\xdf\x9a\xf4\xff\x8a\x1e\xa3\x61\x7f\x71\xdd\xf6\xac\xf8\x36\x0c\xa0\xab\x43\xd4\x91\xf8\xab\xc1\x38\xfa\xbc\xf6\xd5\x1d\x6c\xed\x50\x17\xce\xe0\x08\xba\xe3\x3b\x7a\x45\x0a\x19\xd9\x38\xbe\x41\xb3\x1b\x04\x32\x31\x18\xbf\xa2\xc2\xcb\x51\xbe\xe4\x4e\xc4\xd2\x56\x66\x93\x6e\xbd\x05\x86\x47\xe0\x16\x48\xad\x27\xf3\x26\xaf\x64\x0d\x0f\xfb\xfb\xf0\x50\xb6\xf4\x9a\x40\x6d\x52\xeb\x7a\xd7\x1a\x9b\xe5\x86\x6e\xb5\x3a\x8e\xed\xf8\xd3\x6a\x18\x99\x23\x6d\xf3\x08\xd9\xca\x17\x96\x89\xd1\x09\xf1\x8b\x34\xd3\x23\x58\xab\x83\x94\x0e\x7c\xde\xd1\x7f\x0c\x41\x7d\x0a\xfe\x06\x36\xe3\x9d\x22\x6e\x4d\xb4\x3e\x88\xa5\x68\xe7\x71\xad\x30\xe4\x29\x83\xa0\xd3\x1e\x98\x1a\x87\x17\xb7\x0b\xa9\x32\x09\xb6\x9e\xb9\x46\x59\x6b\x2c\xe2\xeb\x32\x74\x6a\xcd\x4a\xb3\x05\xc4\x0a\xd3\xcc\x95\xd5\xca\xb0\x96\x36\xaa\x74\x53\xb8\x5d\x95\x2c\xc6\x98\x12\x53\x95\xf6\x8d\x4d\x76\x7b\x63\x64\xe2\x48\xe8\x98\x23\x4d\x39\x5f\xa8\x84\xbc\xcd\xb0\xbb\xce\x81\x4e\x89\x8d\xda\x06\xbb\x95\x52\xe0\xc8\x98\x6d\x51\xc2\x9c\xed\x56\x8e\xb3\x68\x9e\xd6\xe8\x20\x9d\xb4\xe1\xba\xc3\x3e\x54\x9d\x31\x4f\x64\xc7\x60\x29\x5d\xd9\x5a\xc3\x65\x35\xb1\xed\xd9\x18\x56\x4f\xc7\xaf\x30\x3e\xf5\xd3\x31\xe4\xe6\x93\xe6\xba\x77\x4d\xa3\x5c\x69\x42\xb0\xb3\xb4\xc0\x94\x5a\xba\xd2\x15\xc1\xfc\xf3\x05\x06\xad\x89\x8e\xcb\x64\x11\x08\x4f\xd5\x3e\xd9\xbb\xdd\xdb\x33\x36\x3e\x70\xf4\x80\xdd\x95\x6d\x27\xcd\x92\xa5\x72\x07\xf8\x0f\xeb\x9e\xae\xc6\x3b\xa1\xa6\x27\xa4\x55\xe9\xfe\x1c\x66\x1a\x61\x77\xae\x3f\xbd\x1f\x87\xa9\x46\xd2\xde\xea\xad\x01\x5e\x2d\xb8\xce\x8c\x1a\x16\x58\xbd\x5c\x19\x56\x75\xd0\xd4\x32\xc7\x5a\xe8\xf8\x21\x56\x2b\x49\x35\x45\xa8\x9f\x7e\x9d\x2f\x4e\xa8\x6a\x83\x93\x77\xd8\xa6\xd7\xed\xdb\x13\x6b\xcb\x70\x99\x4f\x4a\xbb\x00\x33\x2d\xd8\xeb\x55\x3f\x17\x40\x70\x5b\xdf\x7a\xd1\x6e\x19\xd4\xb4\x77\x92\x66\x67\x38\xf8\xc2\xf5\x81\x9f\x23\x9a\xfc\x9f\x5f\x4b\x06\x8f\xde\x9e\x45\x99\x1f\x57\x45\x88\x3e\x18\x0e\x5d\xd0\xb5\xe1\xd3\x15\xd8\x27\x0d\x22\x4f\x97\xd1\xef\x5c\xfd\x50\x93\x15\xe9\x60\x38\xaa\xac\x52\x1b\x1e\xdd\x82\xbd\x6f\x6a\xc0\x9a\x2e\x0f\x46\xc3\xc6\x0a\x40\x40\xf3\x39\x34\x7f\xb6\x3e\x4f\x57\xe8\xd0\x3b\x6f\x4c\xc0\xf3\x49\x2a\x0a\xa3\x38\xb6\xf5\x7b\x8b\x2c\x9a\xe3\xec\xe6\xcd\xa4\xdf\x7f\xbb\x6d\xc5\xce\xbf\x2f\x08\xdc\x41\xe1\x89\x65\x5e\x90\x05\x8a\x72\xfe\x2a\xd1\x8c\x7d\x59\x13\xe0\xa0\xac\x90\x01\x81\x96\x5e\x8f\xc3\x34\xd3\xa2\x1a\x30\x95\x8c\xbf\xcc\x8b\x74\x1e\xfd\x81\x99\xd9\xfc\x4e\x8a\x98\xdf\x70\xf6\x9e\x6b\x7b\xc8\x02\xe1\x5c\x0d\x69\x0f\x3d\xcf\xd1\x82\x62\x64\x11\x07\x2e\xa2\x38\x70\x07\x4a\x53\x93\xd0\xb8\x7f\xaf\x2f\x08\xe8\x4b\xc5\xec\xb2\x68\x87\x92\x8e\x98\x4e\x88\x6a\x81\x42\xae\x2b\x03\x33\xb6\xdf\x50\xe8\x80\xca\xdb\x91\x36\x60\x4b\xb8\x8b\xee\x86\x22\xb0\xd5\x36\x72\xc8\x95\xfa\x44\x94\x08\xcd\x48\xe4\x6b\x9a\x13\xfa\x43\x86\xf6\x66\x2f\x66\xa5\x1a\x07\x7e\xae\xd0\xca\x30\xa5\x07\xbc\x1d\x62\x93\x10\xc9\xd1\x65\x81\x0f\x3d\x78\xb3\x60\x7f\x63\x92\xa6\xa7\x87\x58\x93\x74\x2a\x2f\xbb\x46\xb7\x4c\xe3\x90\xa9\xc8\xfd\xb9\xa6\x47\x52\x4f\xa3\xe5\x56\xf3\xba\x69\x4a\x51\xe9\x90\x58\x91\x92\x94\x35\xae\x14\xe1\x30\x29\x72\x6b\xe0\xd3\x72\xab\xde\x1b\x72\x2a\x28\x98\xbc\xcf\xd2\x76\xee\x7c\x95\xdd\xe8\x3a\xda\x60\x0b\x6b\x7c\x93\xda\xf6\x9d\x47\xcc\xe3\x76\x6e\x64\x74\xc0\xd7\xbe\xea\xdc\xab\xed\xc6\xba\xd5\x6c\x7a\xf7\xe0\xd2\xcc\x2e\xae\x1d\xc3\xfb\xe8\x57\xf5\x90\xdd\xf3\x4f\x9e\xdd\x73\x30\x44\xc3\x67\x07\xbd\xf1\x11\x1a\xa2\x21\xe2\x7f\x0c\x86\xf9\x98\xfe\x35\xe8\xcb\xff\xeb\xf2\x82\xee\xa0\xff\x6a\x70\xd8\x9b\x0c\x01\x0c\x0d\xff\x98\x77\x87\x68\x30\x89\xbb\x93\xee\x04\x0d\x7a\xe3\x41\x97\xfe\xcf\xaf\xb4\xce\xb8\x37\x38\x8c\x0f\x7b\x93\xe3\x2e\xfd\x9f\x5f\x07\xc7\xe8\x28\xee\x1e\xa3\x63\x3d\x89\xa8\x79\x6b\x92\xc3\xa9\x15\x7f\x92\x04\xa2\x26\x19\xae\xec\xa1\xe6\x4d\x4c\xfb\xd5\x38\x73\xa8\x56\xa7\xe4\x34\x39\x1c\x3d\xe8\x14\xb6\xaf\x53\x18\xfe\xe9\x95\x0a\x9f\xe4\xae\xff\x27\xdd\x1a\xbf\xa2\xfb\xbc\xeb\x82\xce\xa3\xc7\x8b\xc8\xf7\x86\xcf\x06\x97\x3b\xd7\xbb\xdf\xf3\xd4\x4c\xe4\x7a\x45\xc3\xe7\xa4\x78\x96\x26\x45\x86\xf3\xe2\x35\xb9\x2e\x5a\xd5\x78\xa5\x33\x7f\x98\x26\xc5\xab\xe8\x0f\x22\x50\x15\x37\x8b\xf4\x3c\xc3\x8b\x8b\x9b\x9e\x8f\x21\x58\x5f\x4f\x80\xe8\x55\x7e\xc1\xf3\x28\xbe\x71\x54\x52\x1f\x1f\x54\x13\x3b\xf0\x11\x79\x2d\x74\x0a\xe2\xe2\x05\xe1\xc4\x79\xc2\x03\x45\xa0\xba\x96\xfd\x89\xe5\x7e\xc9\x35\xcd\x84\x27\x1f\xce\x6f\x66\x4f\x05\xe7\xba\xa1\xd7\x41\xfe\x8d\xf8\x2b\xa3\x7f\xf4\xb9\x7c\xb3\x99\xee\x42\xbf\x1e\xdb\x3a\x0c\x39\x1f\x42\xd7\x20\x0a\x1a\x7a\x88\x34\xf4\x33\x71\xaa\x3b\x4e\xd6\xf3\xe1\x30\x6f\xf0\x2b\x72\x34\xdd\x6a\xb6\x77\xa6\x5b\xe1\x34\x38\x9c\x1c\xb6\x21\x06\x56\x1a\xd6\xa5\x64\xd8\xc4\xb4\xce\x47\xcb\xa3\x5b\xa6\xf4\xaa\x73\xaa\x31\x28\x44\x07\x49\x7e\x01\x76\x39\xa0\xf7\x65\x72\x5d\x3c\x81\xd7\x45\x53\xe4\xcd\xa3\x20\x88\x89\xa7\x5e\xa8\x89\xc9\x85\x9f\xa6\x8d\x5e\x67\x92\xcd\x75\x1b\xc3\x7b\xa1\xdc\x18\x6e\x59\xbb\x31\xdc\xba\x49\x97\x62\x14\x93\xf1\x45\x68\x39\x86\x77\x55\x73\x58\xc6\x9b\x5d\xa8\x3b\xc6\x5f\xf8\x8d\xe8\xe1\xd5\xc5\x9f\xf7\xd5\xc5\x15\xce\x12\x1e\x55\xc4\x85\x76\x6c\x03\xd6\xde\xc8\x18\xc8\xa7\xb5\x55\xa7\x71\x8c\x17\x79\x95\x92\x6d\xd4\x3f\x2a\x81\xd6\x5a\xa9\x39\xcc\xd7\xf8\x62\xe4\x5e\xa6\xd2\x6e\x9c\xa4\x99\xce\xf4\x8e\xb3\x34\x7f\x8d\x2f\x6f\xd8\xb3\x88\xd7\xee\x37\x1a\x9d\xb5\xdf\xc4\x30\x18\xe7\x6b\x0f\x5e\x91\xe1\x42\x8f\xab\x30\xf0\xd4\xb4\xd5\xc4\xa8\xc7\x2b\x54\x36\x5d\x5c\x23\x78\xdb\xa2\x3d\xc3\x59\xf5\xee\x27\xc6\x79\xe1\x7a\x2b\x33\x45\x5e\x92\x26\xc4\x70\x41\xd0\xa3\xab\x7f\xd8\xd5\x83\x91\x9f\xaf\x17\x18\xf2\xf1\x5d\xb0\x04\x72\xc6\xfb\x8b\xb5\x6f\xf0\xf7\xfb\x2d\x0a\x34\x5f\xea\xe4\xa6\x39\xea\xee\x9c\x92\x6a\x23\xe7\x57\xbb\x62\x63\xaf\xd7\x6d\x27\xc1\xaa\x4c\x58\xe0\x54\xae\xdc\x8b\x47\x3c\x9b\xb8\x93\xd8\x38\xd8\x02\xfe\x64\x0b\x42\xe4\xe8\x70\x2c\x04\xf1\xe9\x0e\x9d\xb9\x3f\x8e\xe0\x3b\x70\xc0\xb5\x74\x8b\x42\x96\x5b\x91\xc6\xa2\x71\xda\x8f\x27\xc1\x7f\x97\x39\x8b\x51\x29\x53\x42\xc8\x3c\x9b\x2c\x04\x02\x81\xbd\x55\x43\xcf\xf3\x41\xfc\xce\x5c\x9f\x40\x5b\xb8\xd0\x72\x24\x5a\x99\x82\x6a\x29\xbd\x97\xb9\x1e\x36\xda\xd1\xea\xd1\x34\xde\xdf\x3e\x65\xe6\x09\xc3\xc7\xff\x64\x6f\xaf\xf4\x24\x8e\x4e\xbf\xad\x95\xac\xf5\x8e\x5a\xff\x2d\x9c\x8a\x8d\xe9\x0e\x8d\xb9\x9d\xc7\x72\x0d\xdc\xc1\xe8\x8e\x28\xbf\xd2\x1f\xe2\xc3\x6b\x3d\x84\x58\x55\x64\x44\x67\xc4\xcd\x55\x01\x37\x9b\x3e\xe1\x13\x9b\xa7\x84\xe1\x05\x77\x7e\xe3\x07\x73\xe7\xb9\x5f\x6e\x94\x63\x2d\x3a\x5e\xfe\xe9\x8e\x45\x1e\x1d\x34\x2b\x88\x61\x65\x38\x46\xf3\xd1\x84\x27\x7a\x24\x9f\x0f\x36\xd6\x6c\x82\x02\x8b\xdf\xbb\x55\x17\xab\x1f\x89\x75\x90\xf7\x1b\x2e\x48\x16\xe1\xb8\xfb\xcf\xe7\x53\xf4\xbd\x1e\xec\x65\xff\x07\x48\x79\x94\xc4\x37\x28\x20\x79\x74\x9e\x90\x00\x8c\x38\xcb\x9c\xa8\xb3\x4c\x46\x77\xe3\x72\x71\xcf\x6b\xa3\xa9\x8c\x99\xf7\x49\xd4\xe6\xc0\x9e\xc0\xb1\x77\x55\x99\x7f\x9a\x67\x69\xa5\x95\x24\xf5\xe7\xfc\x5f\x84\xbc\x28\xf1\x84\x8f\x9f\x8a\x0a\xe6\xd2\xae\x3b\xa2\x92\x3a\xcf\x93\x9a\xe0\x94\x4b\x16\x0b\xfd\x85\x48\x8b\x98\x2d\x45\x7c\xb2\x5b\x7b\x63\x72\xa8\xe3\x39\xb7\x7c\x1e\x2f\xc3\x86\x87\x7c\x65\xad\x87\x03\xf7\x7e\x1c\xb8\x0d\x8d\x2a\x9d\xf5\xaf\x8a\x0f\x57\xc1\xbb\x5f\x05\x3f\x9b\xa3\xee\xb6\x1f\x27\x6e\xd9\xf3\x97\x1f\xf1\x5b\xc0\x24\x4f\xfc\xed\x60\xfb\xd2\xdf\x60\x36\x1a\x05\x43\xf0\xaa\x39\x1c\xd6\xc7\xa7\x89\x6e\x0f\xc7\xc6\xe7\x3c\x36\xdc\xcf\x71\x41\x1c\x71\x3c\xc6\x35\x84\x05\x69\xdb\xd1\xbd\x23\x5c\x82\x81\xc7\xe2\x47\xdd\xf1\x51\x6e\xc1\x62\xad\xee\xc2\x58\x3c\xb9\x8f\xbe\xf1\x7e\x3a\x9f\x57\xfb\x1d\x1e\x0d\x9a\x44\x59\x64\x38\x76\x11\x62\x91\x61\xae\x8c\x12\xc9\xd3\x2f\xb8\xec\x8f\x87\x8d\x62\x76\xb2\xa0\xf9\x5b\x27\x9b\x72\x7c\x15\xcd\x8b\x28\x79\x5f\x49\x74\xa3\xe1\xa6\x18\x76\x41\x35\xc5\x5b\x4d\xf6\x32\x5b\xd4\x3c\x1a\x6e\x14\xde\x95\xe1\xd8\x09\xe9\x80\xb9\x92\xf8\x80\x90\xc5\xef\xf5\x1d\x68\x14\x4e\x54\xe1\xd9\x45\x27\x14\xf6\xca\x8e\x44\x49\x10\x9d\xa7\x95\xec\xd3\x6f\xd2\x09\x86\x63\x17\x1d\x60\x98\x2b\x89\x9f\xc5\xcb\xea\xf1\x3f\x6a\x42\x3a\xc5\xb0\x0b\xc2\x29\xde\x4a\xb2\xe3\xe8\xfc\xa2\x78\x5a\x47\x7b\xa3\xc0\xcc\x12\xcd\x2e\x3a\x20\x91\x57\xf6\xc2\xbf\xc1\x95\x0f\xe4\x47\x8d\xf8\x86\x62\xd8\xc9\x1e\x7f\x83\xab\x77\xf8\x82\xe0\xaa\x10\xc0\x07\xa3\x46\xbb\x25\xc5\xb0\x0b\xb2\x29\xde\x4a\xb2\xcf\x33\x42\xaa\x87\xbb\xd1\xd1\x04\x28\x76\x41\x38\x20\xae\xe7\xf6\xbf\xd5\x92\x3f\x6a\xcc\xee\x7f\xdb\x55\x1f\x14\xf6\x9a\x8e\xcc\x2b\x57\xec\xa8\x51\x18\x6c\x8a\x61\x37\xc4\xcf\xab\xd7\xe9\x0d\x89\xe3\xf4\xaa\x92\xf0\x49\x13\xc2\x19\x8e\x5d\x90\xce\x30\x57\x12\x8f\xe7\xb3\xca\xf0\xf5\x07\xa3\x46\x32\x02\xa0\xd8\x05\xe9\x80\xb8\x92\xf2\x34\xc3\xc9\x79\x35\xbf\x34\x92\x0e\x18\x8e\x5d\xd0\xce\x30\xd7\x8a\x37\x2f\xea\x3b\xd0\xe8\x78\x55\x78\x76\x25\xde\xbc\xa8\xef\xc8\x2c\x4b\xaf\xaa\xf7\x9d\x46\xc7\x2c\xa0\xd8\x89\x8c\x40\x11\xd7\x6d\xf8\x37\x95\x97\xa8\x46\xc7\x2b\xc5\xb0\xa3\xed\xfe\xa6\x56\x24\xfb\x5b\x35\xe9\x07\xe3\x46\xa4\x0b\x2c\xbb\x12\xcd\xfe\x56\xd1\x85\x4f\x1d\x63\xff\xe0\x7e\x5d\xe0\xf7\xf7\xd1\xbf\x71\x54\xa0\x8b\xa2\x58\xe4\xd3\xfd\xfd\xf3\xa8\xb8\x58\xce\x7a\x7e\x3a\xdf\x0f\xb1\x4f\x66\x69\xfa\x7e\x3f\x8c\xd3\xab\xfd\x28\xcf\x97\x24\xdf\x1f\x1d\xf5\x51\x91\xa2\x19\x41\x61\x74\x4d\x02\xda\x27\x92\xc7\x51\x52\x74\xf9\xfb\x3c\x44\xa1\x8b\x9b\x05\xd9\xe7\x94\x77\x2f\x71\x1c\x05\xdd\x30\x8a\x49\x17\x27\x49\xca\x55\x85\xdf\xed\x33\xf6\x91\x77\x42\x4a\xdd\xa4\x3f\x45\xde\xff\x13\x8e\xc8\x24\x9c\x80\x69\x6e\xd0\x87\x12\x32\x98\x11\x72\x08\x25\x43\x56\xe2\x93\xe3\x51\x70\x04\x25\x23\x56\x32\xc3\x07\x47\x3e\x2b\x19\xb3\x12\x3c\x1b\x1f\xce\x7c\x28\x99\xb0\x92\x63\x7f\x78\x38\xeb\x43\xc9\x01\x2b\x39\x22\xc3\x31\xc6\x50\x72\xc8\x4a\x0e\x67\x83\x10\x0f\xa1\xe4\x88\x95\x1c\xe0\xc1\xec\x98\xc1\x1c\xb3\x92\x31\x1e\x8c\x8f\x18\xe6\x27\x82\x44\x7c\xd4\x0f\x79\x11\xa7\x91\xf4\xc7\xfd\x70\xc6\x8a\x38\x49\xc1\xa4\xdf\x0f\x8f\x59\x11\x6f\x0f\xe3\x7e\x3f\x0c\xa1\xc8\xe7\xaf\x0d\x39\xef\xf1\x70\xe4\x4c\x0c\xaa\x52\x4a\xb1\xf1\x2b\xbf\xb3\x3e\x7c\xe0\x33\x83\xcf\x8c\xeb\xbb\xe2\x35\x12\x90\xc3\xf0\x40\xe7\xb5\x60\xe0\x8f\xc9\xb1\xce\x6b\xb3\xd1\x71\x10\xcc\x74\x5e\x3b\x9e\x1c\x4e\xfc\x40\xe7\xb5\x43\x32\x39\xf4\x87\x3a\xaf\x1d\x1c\x8e\xf0\xec\x50\xe7\xb5\x09\x19\x4d\x66\x03\x9d\xd7\x26\x83\x61\x80\x8f\x74\x5e\x1b\x4f\x86\x87\xb8\xaf\xf3\xda\x68\x30\x98\x1d\x0f\x0d\x5e\x9b\x8d\x8e\x8e\x38\xcb\x08\x5e\x3b\xf4\xc7\x81\x28\xe2\x24\x1d\x4c\x06\xa1\x28\xe2\xed\x1d\x0c\xfb\x7d\x82\x37\xe6\x35\x35\x86\x65\x7e\x3b\x7a\xe0\x37\x83\xdf\xb8\xa2\x42\xe3\xb4\x51\x38\x0c\x03\x9d\xd3\x66\xb3\x80\xf0\xfd\x81\xcf\xe2\x71\xdf\xc7\x7c\x7b\xe0\x9c\x76\x30\x9e\x4d\x38\x7f\xf2\x69\x1d\x0f\xb1\xd8\x1d\x39\xa7\x0d\x07\xc7\x07\xe1\x48\xe7\xb4\x01\x39\x3a\x22\x13\x9d\xd3\x06\xc7\x87\x07\x81\xb1\xab\x0d\x26\x07\x13\xdf\xe0\xb4\x7e\x30\x3e\xc4\x03\x83\xd3\x8e\x86\xb3\x81\xc5\x69\xe3\xf1\x11\xb6\x38\x6d\x78\x7c\x78\x6c\x71\xda\xf0\xf8\x60\x78\x87\x5d\x8d\x8e\x5e\x99\xc7\xee\x59\xc2\xad\xcf\xce\x63\xba\x56\x49\x63\xb4\x41\x38\x09\x89\xc1\x68\xf4\x40\xf5\x75\x46\x3b\x1a\x04\xe3\x10\xeb\x8c\x36\x0e\xfd\x51\x78\xa8\x33\xda\xf0\x78\x76\xc0\x59\x8f\x33\x5a\x7f\x84\x8f\xc3\xb1\xce\x68\xfd\xd1\xf1\xcc\x64\xb4\xfe\xf0\xe8\x28\x18\xe8\x8c\xd6\x1f\x1e\x1e\xce\x02\x83\xd1\x06\x93\xc3\xe3\x99\xc9\x68\xfd\xc0\xde\xd2\xc6\x7d\x7f\x6c\x31\x5a\xbf\x3f\xeb\x5b\x8c\xd6\xef\x1f\x0f\xea\xb7\xb4\x00\x67\xef\xab\xf8\x4c\x8e\x60\x89\xd9\x46\xdb\x4c\x86\xf4\x25\x30\x1b\x57\xfe\x69\x7c\xd6\x0f\x0f\x39\x0f\x09\x3e\x1b\x92\x59\x38\x34\xf8\xac\x1f\x10\x62\xf2\x59\x10\xf4\xc9\xc0\xe0\xb3\x03\xff\x20\xc0\x06\x9f\xf5\x67\x7e\x60\xf2\x59\x1f\xfb\xbe\x71\x74\xf6\xfb\xc7\x87\xf8\xd0\xe0\xb3\xfe\xd1\xe8\x28\x34\xf8\xac\x7f\xd0\x3f\x18\x9b\x7c\x36\x0e\x43\x8b\xcf\x06\x47\xaa\x48\xf2\x19\x99\x94\xf8\x6c\x76\xc4\x69\xda\x80\xcf\xe8\xe0\x95\x59\x6c\x9b\xf1\x75\xbf\x04\x16\xe3\x8a\x5a\x83\xc5\x86\xe1\xc0\x64\xb1\x20\x0c\x66\x26\x8b\xf9\x33\x7f\x6c\xb2\xd8\xec\x00\xfb\x26\x8b\xe1\x83\x63\x8b\xc5\x8e\x0f\x8e\x8e\x4c\x16\x3b\x3a\x3e\x9c\x99\x2c\x76\x78\x7c\x30\x33\x59\xec\xe0\x78\xe2\x9b\x2c\x36\x0e\xc6\x7d\x83\xc5\xf0\x61\x18\x92\x99\xc1\x62\x07\xe3\x30\xe4\x2c\x2e\x58\x6c\x10\x90\xe3\xd9\x81\xcd\x62\x21\x9e\x6c\xca\x62\x74\xf0\xca\x2c\x76\xcf\x62\xa9\x7d\x76\x16\x13\x4a\x75\x8d\xc7\x8e\xc2\x09\x97\xf7\xf9\x04\xfa\x47\xe4\xc0\x37\x6e\x00\x78\x12\x1c\xf0\xcd\x66\x24\x0e\x50\xff\xf0\x68\xac\xf3\xd8\xc1\xc1\x6c\x76\x60\xf0\xd8\xd8\xc7\xe1\xc4\xb8\x6d\x8e\x47\xb8\x3f\x3e\xd4\x79\x6c\x74\x74\x44\x46\xbe\xce\x63\x43\x72\x18\x8c\x86\x3a\x8f\x0d\x66\x13\x32\x34\x79\x6c\x76\x1c\x1e\xf8\xd8\xe4\xb1\xe3\xb0\x8f\x89\xbd\x8d\x1d\x1c\xda\x3c\xe6\x1f\x4d\x46\x9b\xf2\x18\x8c\x5e\x99\xc9\xb6\x19\xd3\xeb\x4b\x60\x32\xc3\xfe\xa1\xe9\x35\x06\xe1\x91\xc9\x69\x81\x4f\x02\xae\xb3\x10\x7a\x8d\x09\x19\xf0\x3d\x80\x73\x1a\x26\xc1\xe4\xc8\x38\x30\x8f\x7d\xdf\x3f\x30\x6e\x00\x47\x33\x7f\x34\xc6\x3a\xa7\x1d\xfa\xb3\xd1\x78\xa8\x73\xda\xc1\xd1\x71\x38\x32\xee\x9a\x93\xc9\xd1\x6c\x68\x1c\x98\xa3\xd1\xc1\xf1\x80\x18\x9c\xe6\xfb\x61\x78\xdc\x37\x38\x6d\x36\x0c\xc3\xc9\xb1\xc1\x69\x87\x07\x61\xd8\x1f\x99\x77\xcd\x71\x10\x0c\x0e\xef\x24\x98\xfd\xcd\xcd\x6e\xdb\x0c\x98\xf0\x65\xb0\xdb\xdc\x52\xa0\x1d\x87\x33\xae\x2e\xe3\xb3\x18\xf6\xc3\xb1\x3f\xd2\x19\x8d\x1c\x10\x72\xec\xeb\x8c\x16\xf8\xe4\xf0\x70\xa2\x33\x5a\x30\x26\x83\xc9\xa1\xce\x68\x7e\x10\xf8\xa3\x63\x9d\xd1\xfc\xbe\x8f\x47\x23\x9d\xd1\x70\x38\x1b\x0f\x8d\x63\xf3\x98\x1c\x07\xc3\xb1\xce\x68\x47\xc3\xc3\x43\xce\x1c\x82\xd1\xc2\x71\x18\x72\x3e\x97\x0a\x34\x12\x86\xe3\x81\xc1\x68\x3e\x65\xb4\xbe\xa9\x40\x23\x04\xf3\xa2\x8d\x18\x6d\xee\x10\xfe\xef\x99\x9b\xd5\x67\x67\x31\x69\x51\xd4\x98\x2c\x0c\x03\x8b\xc9\xc2\xf0\x98\x4b\x62\x43\x59\x32\x39\x0e\x74\x26\x0b\xc3\x70\x70\x68\xe8\x33\xc2\x90\x90\xc9\x91\xce\x64\x54\x7c\x1a\xcd\x74\x26\x0b\x83\xe0\x68\x64\x5c\x33\xc3\x99\xdf\x1f\x06\x3a\x93\x85\xc7\xf8\x68\x38\xd1\x99\x2c\x9c\x1c\x86\x36\x93\x85\x61\x78\x14\x18\x4c\x46\x8b\x04\x47\x29\x92\xb0\xc5\x64\x61\x18\x1c\x6c\xce\x64\x6c\xf8\xca\x6c\xf6\x60\x0c\x30\xd9\x4c\xd8\x7e\x0d\x2e\x3b\x22\x03\x93\xcb\x88\x3f\x1b\x99\x5c\x46\xfa\x47\x43\x93\xcb\x82\xc9\x38\x34\xb9\xcc\xc7\x43\x8b\xcb\xfc\x41\xdf\xd0\xcf\x86\xe1\x6c\xc4\xe7\x58\xce\x3a\xee\xf3\x12\xc1\x65\xe1\x91\xe0\x16\xc1\x65\xe1\x81\xe4\x1f\x45\xe2\xe4\x30\xb4\xb8\x2c\x38\x1c\xdb\x5c\xe6\x8f\x4b\x5c\x86\x67\x9b\x73\x19\x8c\x5e\x99\xc9\x1e\x2c\x01\x26\x93\x49\x33\xbd\xc1\x65\x23\xd2\xb7\xb8\xac\x3f\x1b\x9a\x5c\xe6\xfb\x47\x7d\x93\xcb\x66\x87\xe3\xc0\xe4\x32\x7c\x38\x3c\x30\xb9\xec\xf8\xa8\x6f\xdc\x01\xc2\xd9\x91\x6f\x71\xd9\xe4\xd0\x37\xb9\x8c\x84\x07\xbe\xc9\x65\xe4\x60\x32\x28\x71\x59\x30\x38\xea\x5b\x5c\x86\x67\x25\x2e\x3b\x1e\x94\xb8\xec\x20\xd8\x9c\xcb\xd8\xf0\x95\xd9\xec\xc1\x00\x50\x36\x38\xbd\x70\xb0\xda\x8c\x1c\xdb\xc7\xa6\xef\xcf\x7c\x93\xd5\xf0\xec\x78\x60\xb2\xda\x11\x3e\x98\x98\xac\x76\xd8\x1f\x8f\x4c\x56\x9b\x1c\x0e\x87\x06\xab\x8d\x27\x03\x2e\xce\x1f\x0a\x36\x1a\xe3\xc1\xb1\xce\x6a\xc1\xd1\x78\x34\x30\x8e\xcd\x59\x38\x3a\xe8\xfb\x16\xab\x1d\x93\x12\xab\x1d\x90\x12\xab\x8d\x02\x8b\xd5\x82\x60\xe8\xd7\xb3\xda\x4a\x83\xd3\x8b\x0a\x7e\x7b\x30\x06\x58\x06\x27\xee\xf7\xa2\x69\x36\x42\x32\xb3\xee\x9b\x87\xbe\x6f\xde\x37\x67\x3e\xc6\xd8\xd0\x9e\xe1\xc1\xd1\xd1\xa1\x71\x76\x1e\x05\x07\xe4\xc0\x60\xb5\xc3\xe3\xc9\x64\x6c\x68\xcf\x0e\x82\xb1\x3f\x36\x6d\x9b\xc1\xb8\x3f\x32\x14\xb4\x63\x32\x1a\x0f\x89\x71\xdf\x24\xc3\xc3\xe1\xc8\x60\x35\x8d\xc4\x27\x65\x1a\x9f\x94\x49\x7a\x52\x6e\x6f\x23\x8b\x13\x1d\xbe\x12\x97\x8d\x1f\xac\x00\x65\xb3\x26\x77\xf6\xd1\x18\xcd\x27\xa1\xa9\xa6\xf5\xc3\xe0\x28\x30\xf6\xb4\x59\x7f\x46\x7c\x43\xb1\x71\xdc\xc7\x63\xae\xb0\x12\x5a\x84\xa3\xe3\xfe\xb1\xe1\xb0\x71\xd0\x3f\x0c\x8e\x8c\xab\xc0\x64\x7c\x40\x0e\x0d\x87\x8d\xf1\x64\x82\xb9\x96\x9f\x33\xda\xe8\x70\x7c\x38\x36\x14\x1b\xc3\x83\xd1\x90\x2b\x3f\x9e\x94\x49\x7c\x52\xa6\xf1\x49\x99\xa4\x27\xe5\xf6\x36\x35\x6d\xd2\x11\x2c\xf3\xda\x3d\x33\x07\xf0\x58\xe8\x57\x51\xe1\x5f\x54\xfa\x76\x35\x72\x43\xe6\x9d\xdf\x85\x6b\x17\x23\xef\x1e\x38\x76\x8d\xb7\xa9\x69\xbf\x8f\x61\x3c\x3f\x7d\xa4\xcd\x9d\x06\x0e\xbd\x77\x61\x3c\xd1\xfe\x3e\x42\x57\x04\xbf\x7f\x48\xe5\x60\xb5\xe1\x4a\xe5\x00\xcb\xfe\x29\xae\x8c\xec\x39\x38\x1a\x39\x80\x6b\x33\x3a\x48\xa8\xaf\x3b\xf2\xe6\xee\x52\x34\x46\x49\x1c\x25\xa4\x1b\xc6\xe4\x1a\x4e\x4f\xfa\xdf\x55\x14\x14\x17\x53\x74\x30\xec\x58\xb1\xc0\xa7\xc8\xcb\x48\x8c\x59\x94\x1e\x91\x2a\x21\x26\xd7\xaf\x2e\xb2\x28\x79\x3f\x45\x7d\x3d\xce\xe2\x0c\x67\x76\x48\xc6\x97\x38\x88\x96\xf9\x14\x1d\x76\x4a\x74\xb0\x54\x91\x8e\x06\xf1\x2c\x4f\xe3\x65\x41\x6c\xea\x46\x63\x51\x70\x41\x58\x7c\xc9\x81\x2c\x29\xd2\xc5\x14\x79\x93\xfe\x5f\x65\x25\x2d\x26\x66\x57\xb6\x1e\xb3\x08\x91\x65\x38\x16\x3a\xb2\x3b\x90\x90\xfa\xc3\x65\x9e\x0f\x42\x96\xe4\x3c\xb8\x4c\xeb\x8d\x97\x2e\xb0\x1f\x15\x37\x5e\x07\x79\x33\xec\xbf\x3f\xcf\xd2\x65\x12\x74\x7d\x2a\x81\x78\x6f\x3b\x5a\x74\x99\x40\x45\x3d\x29\x61\x13\xdf\x7a\xf9\x45\x9a\x15\x24\x2f\x44\x28\x18\x99\xd0\x42\xe1\xe6\xc2\x8d\x19\x24\x93\xb2\x16\x7b\xd5\xce\x64\x1e\xf4\x23\xd8\x18\xfb\x1e\xe2\x6a\x15\xd9\x5b\x4e\x6f\x03\x04\xfd\xde\xe8\x08\x4d\xe9\x3f\xfa\x14\xb3\x34\x8f\x6a\x8e\xaf\x5f\x5d\xe0\x20\xbd\x92\xa1\x3e\xe1\x57\xfe\x66\xf0\xb6\x92\x72\xcf\x5f\x66\x19\x49\x98\x94\x66\x4f\xf1\xb0\x6f\x4f\xb1\x2a\x31\x19\x0a\xe6\x50\xa7\x6c\x7f\x1f\xfd\x92\x66\x48\xed\x1f\x50\x2a\x97\xbc\x20\xf9\x8f\xe7\x49\x40\xae\xa7\x68\xd0\x91\x81\xb9\x9a\x0d\xa8\x95\x94\x24\x23\x37\x6f\x26\xfd\xb7\xa8\x94\xad\x84\x7e\x18\xf7\xfb\x6f\xd7\x62\x24\x16\xe8\x20\x4c\xb3\xb9\x77\x77\xa6\xd1\x47\xc5\xbf\x20\xfe\x7b\x3d\xf7\xaa\xb3\xbb\x7a\x12\x15\x83\x6e\x4a\xd1\x94\x87\x61\x88\x71\x41\xfe\x57\x6b\x30\x5e\x5c\xb7\xe5\xb4\x79\x8f\xd0\x63\xf4\x97\x19\xce\xbc\xa9\x46\xf6\x0a\x6e\x75\xb5\xa6\x71\x66\xbf\x37\x11\x5d\xd1\x7b\x22\x12\xcf\xac\xe8\x4a\xb3\x99\xa3\x13\xe4\x9e\xba\x23\x8d\xa8\x8d\x7a\xd7\x7c\x2d\xae\xb7\x1a\x07\x43\x58\x8d\x03\x73\x6c\xcc\x60\xb6\xc6\x79\x0c\x71\x12\xb4\x43\x57\xc5\x49\x68\x6f\x21\xf6\xed\xf3\x10\x9d\x51\xb1\xf5\xac\xc3\x23\x35\x8a\x24\x33\x51\x2e\x98\x4e\x8f\x0c\xcb\xb9\xb0\x2a\x44\x4d\x42\x5e\x84\xb4\xd5\xd6\x9b\xba\xc0\x42\xf5\x01\x69\xde\xb6\x2b\xf2\xd7\x16\xa9\x38\x75\x58\x84\xd0\x7a\x7a\x69\xcf\x30\x62\x28\xe9\xc7\x45\x96\x5e\x46\x01\x09\x3a\x28\x2a\xd0\x55\x14\xc7\xf4\x1a\xbf\x94\x61\x27\xc3\x34\x29\x50\x1c\x9d\xe3\x62\x99\x91\x52\x8f\x9f\x6f\x90\x15\xf7\xce\x31\x90\xb6\x19\x91\xc8\x1c\xd2\x7f\xe6\x24\x5c\xc6\x74\x40\x99\x20\xcf\xb3\x01\xdf\xc4\x04\x61\x1e\x70\xb5\x48\xdd\x09\x88\xef\x4d\xec\x5a\xbe\x0a\x9e\xad\x60\xc9\x72\xcc\x57\x8b\xe3\x73\x76\x23\x17\x1c\x21\xb6\x27\xd5\x65\xb5\x61\x6d\xda\x44\x16\x2d\x16\x31\x41\x24\x0c\x89\x5f\xac\x6e\xe9\x25\x80\x6f\x92\xe1\x79\xe5\x0a\x59\x26\x3b\x58\x23\x9b\xa4\x8c\xbe\xc7\x8b\x43\xdd\x28\xf5\xc5\x40\x87\xf2\x2c\x4a\x16\xcb\xe2\x0c\x11\x16\x8c\x50\x1b\x01\x5a\x0e\xdb\xeb\x5a\x0b\xe3\x9f\x39\x41\xc5\x05\x2e\x8c\x98\xb7\x0b\x9c\xd3\xb1\xce\x48\x88\x7c\x1c\xc7\xf4\x94\x12\xed\xb3\xc8\x6d\xac\x35\x57\x30\x5c\xf8\xf0\x92\x84\x4d\x82\xf6\xba\x17\x55\xb2\xee\xaa\x7c\x26\x48\x0c\x21\xe8\x91\xe4\xba\xbc\xc0\x05\x61\x7b\x32\x4e\xce\x05\xbf\xf1\x46\x17\x38\xc3\x73\xf4\x81\x0d\xc9\x2d\x22\x97\x94\x3b\x29\x13\xb3\xbf\xf2\x74\x99\xf9\x44\xc6\x0e\xe6\x2d\x98\x75\xe9\x22\x20\x38\xb9\x15\x1b\x34\x54\x3f\xe3\x3f\xce\x98\x3e\x46\x60\x60\x2b\x5c\xf6\x31\x4d\x9e\x01\x4d\x6b\x84\x36\xb6\x87\xa9\xc0\x33\x2e\x7e\x6e\x7c\x10\xb2\xa4\x68\x1b\x1c\x85\x46\xd7\x1c\x4c\xc0\x55\x51\xb5\x78\xed\x18\xbd\x30\x40\xa5\xc4\xe7\x0d\x73\x82\x55\x87\xd2\xdd\x34\x9a\xac\x1e\x16\x56\x86\xb1\x7b\xdb\x96\x21\x51\x79\xbe\xf5\x15\x29\xd7\x20\x1e\xa9\x3b\xaf\x16\x20\xb8\xbd\x43\x84\xd3\xcd\x73\xa1\xd3\x2a\x6d\x2d\x63\x58\x4d\xa3\x4a\xe6\xeb\x54\x86\x54\xe5\x23\xcd\xb6\x60\x3d\xf5\xbc\x3c\xa8\xb5\x5b\x88\xb8\x43\x09\xb2\x8c\xdc\x66\xc6\x2d\x43\xa6\x6d\x67\x05\x0a\x42\x1d\x86\x12\x89\x9e\x48\xd2\x08\x7b\xaa\x49\x4e\x32\xb3\x84\x0c\xf6\xda\x28\xda\x6b\xdd\x1c\xce\x70\xc6\xee\x48\x3c\x9c\x2a\x0c\xd6\xe7\x89\xa4\xfa\xc9\xc4\xe2\x2f\x47\x1e\xfd\x62\xc2\x62\x9a\x62\xe8\x76\x62\x50\x8a\x25\xb5\x55\x6c\x4c\xaa\xfc\x8c\x69\xfb\xef\x15\xff\x35\xee\xa9\x94\xec\xb6\xc5\x81\x42\x48\xdb\x4e\x60\xcd\x64\x8b\xac\x2c\x04\xa3\x2d\x85\xfc\xe4\x32\x52\xcd\xb8\x6d\x4b\x48\x6a\x4a\x12\x88\x46\x0d\x46\x4b\x8f\x8b\xb9\x7e\xdc\x4a\x7a\x5e\x31\x39\xda\xfb\x6d\x19\xb1\x73\xc9\x43\xb7\x6d\x7e\x9e\xef\x26\x92\xe5\xf8\x9e\x3d\x1a\x61\xa6\xa2\xd7\xe0\x13\x51\x65\xec\x6e\x14\xf1\x69\x87\xc6\x6e\xa0\xae\x32\x0e\x0b\x7c\x7d\x9a\x06\xd5\x81\x58\x1a\x05\x7e\x92\x68\x76\xd6\x03\x8a\xbc\xbe\x17\xcf\x48\x5c\x15\xb1\x6d\xd4\x6f\x14\xc2\x47\xa2\xd9\x59\x2f\x28\xf2\xfa\x5e\xfc\x92\xa6\x45\x75\x28\xab\x71\xa3\x50\x56\x1a\xa2\x9d\xf5\x84\xa1\xaf\xef\xcb\xdf\x09\xae\x0a\x93\x7a\x30\x6e\x14\xd9\x4a\xa2\xd9\x59\x3f\x28\xf2\xfa\x5e\xfc\x8e\xcf\xa3\xa4\x2e\xf5\xde\xc1\xb8\x51\x90\x2b\x0b\xd9\xce\x7a\xa4\x9a\xa8\xef\xd7\xcb\xea\x68\x6f\x93\x46\xd1\x97\x04\x96\x9d\xf5\xe4\x65\x4d\xc4\x37\x00\x78\x95\x66\x85\xc8\x9b\xe3\xee\x48\xa3\x48\x8d\x26\xae\x9d\x75\x47\xb6\x70\x1f\x3c\x8f\xee\xd9\x7b\xb8\xcf\x9c\x11\xf8\x5e\x39\xf6\x9c\x13\x5a\x5c\xa4\x54\x8e\x7f\x11\x56\x90\x70\x54\x01\x5e\xe7\xad\x62\x42\x9a\x4e\x3b\xcf\x70\x1c\xc3\xf5\xae\xaa\xcf\xc7\x15\xf0\x75\x5d\xb5\x30\x2b\x0c\xa0\xff\x78\x46\xbf\x56\x35\x37\xe8\xbb\xa0\x6b\x1b\xd3\x90\xaa\xe8\xd1\x69\x9e\x47\xf4\xe0\x4d\x93\xbc\xc8\x96\x7e\x91\x66\x2f\x61\x09\x55\xb6\x3b\x58\x5d\xb7\x8e\x8a\xea\x06\xb5\x58\xca\x17\x24\x8b\x8a\xea\xae\x97\x41\xeb\x5a\x94\xe8\xda\x3b\xcd\xea\xac\xeb\x9c\xdc\x57\x8b\x12\x64\x1d\x72\x09\xf4\x25\xb9\x99\x7d\xbd\x0e\x60\x0d\xf1\x71\x95\xe7\x6b\x70\x19\xb8\x23\x6d\x3a\xae\xcf\xe1\xa3\x16\xa6\x49\xf1\x0b\x9e\x47\xb1\xf4\x88\x28\x6e\x16\xe9\x79\x86\x17\x17\x37\x3d\xf5\xd1\xf2\x19\xf2\x06\x7d\xcd\x9d\x8b\x79\x09\x89\x4c\x13\x53\xe4\xf9\xfc\x4f\x0b\xe2\x15\x4b\x4a\x3c\x45\xd2\xbf\x28\xbd\x24\x59\x18\xa7\x57\x53\xe4\x5d\x44\x41\x40\x12\xcf\xe5\x62\x71\x17\x9f\x89\xd7\x5a\x4a\x4b\x6e\x88\x29\xa8\x18\xd3\x41\x49\x9a\xcd\x21\x95\xe9\x99\x14\xa1\x49\x76\x86\x70\x12\xf0\x12\x7a\x59\x3b\xbb\x07\xa9\x76\x1f\x7c\x0b\xca\x13\x2a\xec\xe4\x60\xf0\x0e\xd3\x8c\xd9\xee\xd3\xb4\x40\x49\x1a\x70\x7b\x37\xfa\x39\x02\xa3\x96\xb4\x9a\x17\x29\xe4\xf4\xc3\xe8\xa7\x17\xbf\x09\xc3\x30\x4a\x29\x80\xc3\x36\x27\x8b\xd6\x9d\x6f\x63\x77\xd8\x70\xda\x75\x1c\xdb\x99\x7d\x0d\x63\x5b\x2e\x2c\xa1\xf3\x91\x5b\x47\xeb\x1d\xd4\xff\xcb\x33\xd1\x79\xb6\x7f\x80\x1a\x4d\x9e\xe2\x4a\x89\xf6\x9a\xad\xa4\x52\x25\x30\xd6\x49\xa4\x00\x25\xef\x18\xca\x02\xa7\x84\x2f\x85\xb1\xb8\x88\xf2\x0e\xab\xd1\x3e\xd1\xef\x24\x50\xad\x5a\x96\xb1\x31\x30\xd2\x7a\xef\xe8\x00\x14\xe9\xbb\x77\x74\x6f\x05\x14\x96\x9c\x69\xf5\xa5\xdd\xee\x51\xc6\xbf\xe1\x58\x70\x76\xbe\xa4\xa3\x96\xb7\xdb\xec\x92\x23\xc6\x42\x17\xe6\x4a\xc3\xf1\x86\x75\xf4\x3d\xb9\x99\x22\xef\x9c\x14\xcf\xe8\xc6\x01\xb9\x71\xae\x0b\xbe\x23\xf2\x8b\x83\x7e\x09\xd3\xa1\xe4\x60\x81\x8b\xa5\xf9\x6c\xa9\x1b\x47\x09\x61\x6b\xa7\x3b\x27\xc5\x45\x1a\xe4\xdd\x65\x4e\xba\x94\x62\x5e\xc7\xd8\xee\xc1\xaf\x90\x5d\x00\x3f\xdc\x0a\xc3\xdf\x89\xda\x66\x85\xef\x23\x23\x37\x23\x49\x40\xb2\x0a\x2a\xd9\x47\x8d\x38\x29\x28\xd1\x6d\x97\x12\xd0\x63\x76\x61\xd9\xb0\x9e\xa2\xf5\x9d\xd3\x34\x8d\x1c\xd9\x5e\xdf\x55\xd8\xa8\x91\x99\x3a\xf6\x9d\x3b\x77\x2c\xfd\x4f\xb2\xa2\x85\x51\x14\xeb\xb0\x6b\x5a\xbe\xdf\xd5\x9b\xbe\xed\x14\xaa\xa2\x45\x61\x13\x17\xc3\xb6\x49\xaa\x50\x47\xce\x4f\xfd\xd6\xde\x24\x19\xa7\x35\x34\x6a\x1c\xee\x94\x07\x14\xd9\xa9\x33\xc1\xd2\x2b\x59\xec\x2d\xfc\xe0\x64\xc2\x22\x39\xd9\xbb\x6d\xd9\xf4\x1a\xdb\x07\x5b\xbe\x8e\xe4\x56\xda\xb6\xec\x01\x5b\xb3\xc7\x66\xbc\x82\xaf\x2d\x22\x21\xe6\x7f\xd8\x93\x0b\x40\x13\xea\x65\xb3\x6c\xc6\x37\xcc\x7b\x65\xda\x0f\x80\x06\x30\x1f\x88\x0d\xcc\xd6\x57\xdc\xb3\xe0\x2a\x0f\xfa\x8a\x07\x7d\xc5\x83\xbe\xe2\x41\x5f\xf1\xa0\xaf\x78\xd0\x57\xfc\x89\xf4\x15\xaf\xa2\x3f\x88\x43\x5b\xb1\xb8\x7e\x9d\xbe\x24\xf3\xd6\x60\xd4\xae\x7f\x68\x44\xae\x0b\xf1\x20\xe6\x13\xa8\x1b\x94\xd0\x69\xab\x1c\x5e\xa6\x57\x0f\xfa\x85\x07\xfd\xc2\x17\xae\x5f\xe0\x7e\x19\x77\xd2\x31\x50\x1c\xcd\xf4\x0c\x14\x72\x7d\x5d\x03\xf8\x65\xdc\x5d\xdf\x40\xd1\xac\xad\x73\x80\xb6\xef\xae\x77\x60\x43\x74\x7f\x75\x0f\xda\x8d\x7b\x96\x06\x37\xfc\x16\x22\x8a\x1e\x34\x13\x0f\x9a\x89\x7b\xa1\x99\xa0\xcb\xa8\x99\x76\x02\x16\xfb\x2a\x0d\x05\x65\x75\x5d\x43\x01\x95\xee\x81\x96\x02\xbc\xdc\xa4\xa6\x82\x6f\x7f\xb6\xb6\xe2\x9e\xc5\xe8\x7c\xd0\x56\x3c\x68\x2b\x1e\xb4\x15\x0f\xda\x8a\x07\x6d\xc5\x83\xb6\xe2\x0b\xd2\x56\x0c\x1b\x68\x2b\x72\xe2\xa7\x49\xf0\xa0\xaf\x78\xd0\x57\x3c\xe8\x2b\x76\xad\xaf\x90\x6f\x17\xee\xa4\xb1\x60\x58\x9a\xe9\x2c\x18\xec\xfa\x5a\x0b\xfe\x7a\xe1\xee\x7a\x0b\x86\x68\x6d\xcd\x05\x6f\xff\xee\xba\x0b\x31\x58\x7f\x0a\xed\x45\x08\xc4\x3e\xe8\x2f\xee\x97\xfe\xe2\x53\x6b\x1c\x36\xd3\x8c\xdc\x59\x3d\xc1\x56\x4a\x33\x05\x05\x5f\xd5\xab\x54\x14\x94\x9f\x75\x15\x05\xaf\x76\x0f\x94\x14\xfc\xf1\x97\x54\x53\xc8\xfd\xce\x56\x54\xdc\xb3\x3c\x0f\x0f\x8a\x8a\x07\x45\xc5\x83\xa2\xe2\x41\x51\xf1\xa0\xa8\x78\x50\x54\x7c\x91\x8a\x0a\x0a\xfd\x6f\x1e\x2c\xd6\xf9\x68\x84\x7d\xfc\x8d\x04\xd1\x72\xfe\xa0\xdd\x78\xd0\x6e\x3c\x68\x37\xee\x8b\x76\x83\x47\x33\xb8\x93\x6e\x83\xe2\x68\xa6\xd9\xa0\x90\xeb\xeb\x35\x20\x9a\xc1\xdd\xb5\x1a\x14\xcd\xda\x3a\x0d\x68\xfb\xee\x1a\x0d\x36\x44\x7f\x0a\x7d\xc6\x05\xc1\xc1\x83\x36\xe3\x7e\x69\x33\xd4\xb0\x7d\xdd\xde\x18\x74\x19\x35\x53\x76\xc0\x62\x5f\xa5\xea\xa0\xac\xae\xab\x3a\xa0\xd2\x3d\x50\x74\x40\x6c\x18\xa9\xe6\xe0\xdb\x9f\xad\xe4\xb8\x67\x59\x06\x1f\x94\x1c\x0f\x4a\x8e\x07\x25\xc7\x7d\x56\x72\x7c\x8a\x6c\x44\xcf\xfd\x34\x79\xba\x2c\x8a\xca\xb0\x52\x83\x51\xdf\x01\x5c\xd7\x8a\x82\x52\x15\x21\x8a\x76\x55\x03\x03\x13\xae\x16\x37\x05\x90\xe0\xbf\x91\x64\x59\xa5\x9e\x39\x56\xab\xe7\x15\x89\x49\xe5\xec\x8c\xfa\x23\x0b\xb0\x36\xd3\x12\x40\xc8\x0a\x0d\x23\xbe\x99\xb0\x75\xf8\x55\x78\x36\x59\x2d\x4d\xe3\x19\xae\x0a\xc5\x36\x38\x3a\xb2\x21\x6b\xd1\x33\x10\x55\x45\xde\xfa\xab\xf6\xf8\xbe\x03\xb6\xb6\x05\x09\x25\x2b\xfe\x4f\x72\x33\x4b\x71\x16\x3c\xc9\xb2\xf4\xea\x57\x12\x56\xce\x84\xb6\x01\x95\xea\xd4\xb5\x59\x02\x76\xa3\x79\x19\x9d\x5f\x54\xb7\x3d\xa8\xa9\xd4\xb8\x71\x80\xfe\x6a\x75\x6f\xfb\xfb\xe8\x7f\xf0\xad\x91\x04\x52\xc2\x43\x92\xa7\xbf\x5a\xe5\xdc\xfe\x3e\x7a\x9e\xd0\xc3\x12\x72\x10\x10\x94\x2f\x88\x1f\x85\x91\x1f\xb1\x2c\x04\xe9\x25\xc9\xb2\x28\x20\x6a\xa4\x7a\xbc\xa2\xf7\x68\x1a\xe3\xbc\xe8\x82\x88\x6b\x24\xd4\x59\xe0\x20\x60\xa1\x58\xf6\xf4\x2b\x1f\x8f\x08\x5e\xb0\x75\xae\x2a\x88\xcc\x50\x93\x03\x99\xc2\x2b\x4a\xfe\x5e\x2a\xe4\x58\x5f\xf2\x34\x52\x3a\xca\x7c\x81\x7d\xa2\x61\x0c\x63\x72\x3d\x45\xde\x00\x0d\x10\xc4\x92\xd1\x61\x7d\xbc\x60\x19\x98\x74\x60\x67\xf6\x33\x08\xd0\xeb\xd2\x62\x7a\x9c\x91\x0c\xbc\x39\xec\xbe\x2f\x8d\xb1\x65\xa9\xc8\x5e\xea\xba\xcc\x9c\x85\xa9\xe9\x2d\x93\xa8\x40\xdf\xa1\x71\x19\x85\x5d\x9d\x65\x32\x2b\xd7\xae\x4c\xa6\x46\xef\x1a\x4f\xe2\xe8\x1c\x72\xbd\x41\xbe\xa1\x8a\x21\x1c\xae\xa1\x3d\xb5\xd3\x78\x8d\x64\xe5\x38\x4a\x88\x98\x2d\x6f\x34\x5c\x5c\x1b\xc3\x82\x81\x25\xf3\x8a\xe1\xde\x80\x80\xfa\x41\x41\xdf\xa1\x21\x4f\x37\xb5\x99\xaa\x17\xa2\x0f\xfe\xc4\x72\xa7\x90\xe0\x65\x7a\x95\x3f\xc9\xce\xc5\xad\x2d\xcc\xd2\x79\xa5\x0e\x8d\xc5\x28\xb6\x22\xc2\x17\xe9\x7a\xf0\x7e\xba\xa4\xb7\xc9\x75\xaa\x2c\x70\x4d\x0a\x8b\x52\x0d\x3a\x1e\x77\xd5\x7c\x7f\x5a\x5d\xef\x83\x96\xf6\xce\x5a\xda\x15\xca\xf3\x34\x7e\xb5\xc0\xc9\x0a\x1e\x2a\x4f\x4a\x91\x16\x38\x46\xec\x2b\x4a\x43\x94\xa5\x57\xfa\x54\xaf\xcb\xc9\x6e\x0e\xf3\x97\x79\x91\xce\xa3\x3f\xd8\xe1\x14\x88\x85\x09\x8d\xa1\x98\x0e\x85\x6a\x32\x2e\xad\xdd\x35\x52\xbb\x54\x35\x09\x0d\x2d\x48\x06\xeb\x8c\xb7\x88\x9e\x27\x97\xe9\x7b\x12\x20\x7a\x69\x41\x18\x9d\x7d\x80\xad\xa1\x83\x8a\xb4\xc3\x3a\xde\x61\xe0\xb7\x67\x0c\x39\xcf\x16\x61\x52\x4a\x09\xfc\x9d\x64\xbf\xc3\xfa\xfd\x62\x0c\x41\x55\x89\x80\x60\x3c\xb4\x3c\x40\xe6\x18\x16\x57\xa9\x52\x85\xc3\xc6\xce\x73\x00\x61\xb6\xbd\x30\xdc\x80\xa3\x48\x51\x7e\x91\x5e\xa9\xc1\x14\xe1\xea\x7f\xaf\xdb\x08\xe9\x38\x55\xb2\x5b\x15\xcd\x26\x6f\x2b\x2e\x58\xa3\x1b\xac\x01\xe8\x4b\x99\x62\x83\x03\x36\x21\x9c\x2e\xc3\x3f\x48\x96\x76\x67\x98\xee\x8b\x51\x12\x90\x6b\x69\x8c\x64\x69\x39\x81\x62\xd5\xf4\x7a\xa7\x45\xb9\xb5\x8a\x21\x51\x0d\x64\x0d\xfa\xb4\xa2\x9d\x67\x62\x01\xe6\xd0\x91\x14\x04\xb6\x5c\xf4\xcb\x9c\x0a\x26\x33\xa1\x30\x22\x71\xe0\x24\xe2\xc5\x82\x0b\x20\x55\x92\x75\x96\xe1\x9b\x17\x61\xab\x96\xd4\x15\x3b\x28\xc8\x21\x2b\x0e\x35\x29\x88\xbc\xcb\x48\x08\x0a\x9c\x5a\x55\x39\x57\x37\xc8\xd4\x3c\xf4\xa6\xc5\x2c\x33\xff\x4c\x02\x92\x51\xa1\x8b\xe9\x4b\xd1\xad\xa6\xc2\x09\xc7\xab\x11\x3b\xae\x90\xaa\x95\x64\xa9\x5d\xef\x33\x12\x4e\xd6\xc4\x07\xd7\xe1\x6a\x74\x07\xdb\x45\x77\xb8\xa5\xde\xc2\xc4\x7e\x87\x9e\x68\xc6\x7a\xc4\x56\x94\x12\x3c\xa8\xcc\xb1\x88\x41\xd2\x44\x51\x92\xd3\x2b\xd1\x99\xe6\x38\x78\xc6\x00\x64\x60\xf1\xde\x1e\x65\x0d\x69\x19\x35\x22\xa4\xdf\xc9\x3e\xaa\x30\x35\xb3\x92\x2a\x78\x69\x33\x13\xc3\xc7\x8d\x37\xf0\xb3\x20\xf3\x45\x07\xbd\x63\x46\xc9\x77\x19\x29\xf8\xc7\xc6\x76\x55\x2d\xa6\x3a\xaf\x4a\x07\xa4\x05\xc8\x63\x30\x95\xc9\x8d\xb1\x17\x93\xe4\xbc\xb8\x00\xe3\x27\x15\x2e\x9f\xd0\x25\xd8\xa2\x50\xed\x0e\x7a\xf7\x9e\xdc\xa0\x53\xd4\x3f\x61\x7f\x7d\x0f\xb5\xd9\x8f\xc7\x8f\x95\xd5\x8f\x56\x7d\x43\x0b\xdf\xea\x98\x59\x89\xb0\xfa\xec\x99\x86\x29\xb0\x9f\x40\x47\xd9\x1f\x17\x51\x2e\x2c\x2a\x6b\x58\x7f\x79\x8e\x28\xab\xcf\x6b\x9b\x82\xb5\xe1\x6a\x43\xaa\x0f\x6e\x15\x66\x19\x4a\xde\xd0\xc6\xde\xf6\xfc\x34\xf1\x71\xd1\xa2\x7d\x6d\xb7\xdb\x7c\x7a\xc4\xbf\xbd\x0b\x9c\x04\x31\x79\x8a\xfd\xf7\x4c\xa3\xf9\x2c\x8e\xfc\xf7\x06\x7b\xc1\xb1\xa3\xc6\xec\x9d\xb2\x8e\xf6\xf4\x43\x93\xc1\x75\x8c\xef\xb0\xb9\x76\xd1\x40\x98\xd0\xcc\x46\xff\x41\xae\x8b\x5d\x35\xfa\xd8\x6c\x94\xcc\x17\x22\xad\x4b\x93\x59\xd2\x38\xb8\xb9\x41\x5d\x5f\x53\x86\x59\x5d\x2e\xff\x7f\x47\x71\xfc\x92\xf8\x24\xba\x24\x3c\x09\x90\xd3\x38\x5d\x09\x0f\xf3\x3a\x34\x8d\xd6\x20\x28\xb2\x1d\x2c\x1c\xf6\x98\xd8\xa8\x9b\x84\xb5\xc1\x92\x50\x7a\xa1\x0e\xac\x1d\x78\x12\x56\x2b\x33\xac\xbe\x09\xb9\xfa\x15\xe7\x05\x87\xfd\x0d\x17\x17\xbd\x39\xbe\xa6\x63\x04\x7f\xfb\x24\x8a\x5b\x8c\xb6\x7d\x1d\x6f\x5b\x63\x07\x84\xa2\x10\xb5\xec\x99\xfb\x41\x47\xdd\xd6\x14\x42\xc6\xbc\xd3\x4d\xb7\x63\x40\x9e\x98\x6a\xa2\x7b\xe2\x10\xa0\x94\x84\xf5\xa6\x7b\x7e\x7d\xb2\x8d\xfc\x50\x68\xc2\x2d\x4d\x5c\xd6\x7c\x97\x6f\x2f\x0a\xb8\xfc\xad\x54\xf3\xa5\xc9\x01\x5a\x3d\xed\x4b\x1d\x7f\x95\x97\xa8\x0b\xda\xd9\x8c\xe3\xa3\x5e\x77\x61\x00\x2f\xea\x59\x97\x01\x65\x6e\x4c\x65\xb9\xce\x59\x85\x7f\xd3\x6b\x82\x88\xa6\x80\xe1\xe7\xd6\x1d\x30\xa4\x9f\x05\xfc\x00\x0e\x60\x7f\x2e\x59\x59\x79\x1a\x65\xa9\x36\x74\x9e\x96\x82\xcb\xfe\x6d\x81\x2d\xf8\xbf\x99\x59\x5c\x1e\x0a\x5a\x0a\x7d\x36\x1e\xb4\xb0\x5d\x08\xe8\x44\xa7\xe8\x32\x8d\x02\xd4\x97\x5b\x05\x5d\xe1\xda\x1a\x38\x3d\xd5\xcd\x44\xd2\x25\xe1\xe3\x47\x64\x02\x79\x45\xe0\xe9\x6b\x5f\xe1\xd7\x17\xca\xc7\x8f\x68\xd0\xef\xf7\x4f\xd0\xfe\x3e\x2d\xef\xe6\x14\x24\xbd\x24\x19\xbd\x2a\x65\x37\xc5\x45\x94\x9c\xcb\x5d\xe1\x6e\x2e\x26\x1b\xb8\x97\x28\x67\x17\xa1\x1a\x11\xbd\x70\xf8\x9c\x34\xa4\x07\x29\x23\x58\x39\xdf\x26\x72\xa7\xb6\xe4\xaa\x72\x95\x4b\x73\x75\x7b\x75\x99\x32\x99\x9a\x1c\x9c\x3e\x9a\xa2\xd3\x00\x91\x61\x66\x73\xf5\x81\xf6\x82\x4a\x3b\xf4\xe0\x64\x5a\x76\xaf\xe3\xa2\x83\x7f\x34\xbb\x55\xde\xc6\xb4\x8f\x1b\x53\xcc\xad\xa6\x15\xd4\x1a\xbf\xf4\x54\xa9\xdc\x46\x22\x07\x4e\xea\xf6\x3b\x52\x49\x6f\x7e\xb3\xfb\x82\x10\xdc\xdf\x9e\xc5\xa5\xe4\xab\xe2\x3f\xb3\x05\xb0\x35\x58\x30\x25\x94\xdc\x20\x01\x17\x48\xfb\x1b\x3f\x15\x2b\xf6\x4d\x84\xf4\x74\xc7\x8e\xcd\x64\xaf\xa6\xe1\xf2\x6e\xd2\x9b\xe3\x45\x4b\x49\x7c\x25\x80\x76\xa9\xbf\xeb\xad\x5d\xf1\x1f\x18\xd1\x7b\xf4\x7f\x9e\x17\x64\x6e\x77\x88\xb2\x1b\xc8\x07\xa5\xf6\x3b\x8e\xe1\x78\xe1\xe4\x39\x67\xff\x2c\x08\x29\x9f\xf0\xd1\x69\x6f\x83\x31\x3f\xc1\x52\x32\x0e\x9a\x96\x3d\x23\xcc\x96\xc1\x85\x92\xd3\x53\xd4\x47\x3f\xa2\x3e\x9a\xb2\xc3\xfa\x3b\xe3\x54\x7e\x8c\x06\xf6\xa8\x15\xe9\x94\x4b\x8e\x51\xd2\xe2\x1a\xcf\x96\x14\xdf\xcd\xfa\x6d\xbb\x32\x57\x0d\x97\x24\x20\x84\x84\x7e\x6a\x51\x62\xc9\x6d\x0c\xba\x96\xb7\x59\x8d\xb2\x63\x50\xb9\xcd\xca\x1e\xd4\xb5\x98\x57\xf7\x47\x71\x4f\x30\x6d\x9c\xdf\x9f\xa6\xa8\xfa\x42\xd7\xd1\x52\x2d\x33\x41\x0a\x26\xab\xc4\xc7\xcc\x16\x16\x44\x19\x61\xab\x12\xce\xe2\xac\x88\x3d\xf4\x23\xd7\x0c\xb1\x9d\x63\x62\xd4\x6b\xef\xba\x8b\xa5\xd5\xe6\xea\xb2\x75\x9d\x2c\x2f\x51\x6b\x08\x7e\x38\x6d\x70\x55\x59\xb5\x9b\xae\x1a\xb0\x03\x3e\x60\x87\xe6\x80\xed\xb9\xfe\x16\x7f\xd5\x3b\x9c\xaa\x6b\x66\x33\xb7\x53\x4d\xbd\x50\xef\x7c\xea\x10\xcc\x3a\x4e\x2b\x83\xf7\x52\x57\x9e\x4e\xbd\x4e\x85\xd5\x44\xee\xed\x8e\x8d\x84\x8e\xc9\x91\xae\x4a\xa2\x3b\x09\xbf\x74\x1e\xf5\xc0\x0e\x22\xc7\xa5\x48\xe5\x87\x22\xd5\xdc\x74\xb5\x9b\xef\x11\xbb\x09\x19\x1e\xf9\x80\xf1\x31\xf2\xba\x1e\x7a\x4c\x71\x3c\x46\x1e\x4a\x43\x44\x7f\x49\x60\x98\x4f\x97\x9e\xf7\xcd\xa4\x83\x06\xfd\x0e\x1a\x4e\xde\xee\x6d\x9c\xb7\x95\x7e\x7e\xcd\xb4\xba\x90\xd9\xce\x76\xaa\xd5\x92\x14\x4a\xd7\x5a\x53\x03\x66\x39\xd8\x1e\x6f\xd1\xc1\xb6\x26\x6d\xac\xc2\xcd\x93\x9e\x43\xf5\x4f\xe0\x8f\x6b\xe2\xae\xf2\x65\x3c\x6c\xbb\xe1\xeb\x1c\x1a\x2d\xcc\xf7\xd3\x49\x77\xa7\xee\xc8\x19\x09\xe1\xa2\x84\xae\x08\x7e\xbf\x4b\xa7\xce\x87\x87\xa5\x7f\x4e\xe7\xb6\xad\x3a\x86\x55\xdd\x92\xf9\xee\xbd\x48\xf3\x88\x39\x50\x79\x19\x89\x71\x11\x5d\xaa\x4c\x5c\xdc\x3c\x3f\x45\x5e\x18\x93\x6b\x59\x8c\xe3\xe8\x3c\xa1\x12\x7c\x4e\xc5\x59\x42\xe7\x45\xf8\x08\xf1\x53\x78\x1e\x5d\x47\x89\xbc\xef\x72\xa1\xe4\x7c\x59\x14\x24\xcb\xa7\x26\x0c\x2f\x6d\x7d\x00\x91\x70\x4b\x6f\x39\x3f\xb1\x47\x0b\xbf\xd6\xcb\x47\x43\x68\x99\x2f\xe1\xb1\x28\x46\xf3\xe8\xba\x58\x66\x84\x1e\x77\x67\x4a\xbe\x3a\xeb\xa0\x33\xfe\x17\xcf\x21\x26\xaf\x0f\x5f\xf6\xb3\xd2\xed\x3c\xf4\x7c\x1e\xa2\x33\x7a\x96\x9d\x49\x61\x3a\xe7\xdc\x25\x5c\xe2\xd4\x20\x72\x80\xbf\x09\xe6\xab\x68\x66\x96\xa6\x31\x7b\xec\xa3\xcc\x6d\x6c\x5a\x5b\xa0\x1a\x6c\xf3\x73\x34\xd3\x1f\x8b\xb9\xdf\x8a\x29\x65\xb4\x53\x17\x6d\x3f\x4c\xab\x78\x97\x66\xd2\x2d\xe1\xcc\x62\x99\x1a\x6f\x3d\x6d\xa7\x52\x76\xea\xaf\xca\x2a\x5e\x9e\x99\x2d\x4a\x7d\xe3\xa6\xef\xcd\xea\x13\xfa\x7f\xb8\xed\xc8\x6b\x1b\xdf\x19\x3a\xe8\x1b\x93\x84\xb6\xf3\xd1\x5a\x73\x8d\x84\x76\x6d\xbc\xd3\x03\x35\xed\x71\x5a\xfb\x64\xef\x76\x6f\x8f\x33\x4c\x4f\x0f\x18\xc1\xc5\xb6\x1e\x49\x2e\x7b\xff\x78\xf1\xd3\xcf\xef\x7e\xfe\xc7\xbf\xd0\x37\xa7\xa7\xe8\xdb\x45\x96\x06\x4b\xe0\xb4\x6f\xd1\x8f\xd2\x0e\xf9\xa1\xf1\x1e\x64\x38\x01\xae\x1a\x57\x66\x86\xd4\xe6\xb8\x16\x75\xbb\x29\x3a\xc5\x3e\x7f\xe2\x1d\xaa\x71\x6f\xb5\x55\x51\xbb\x59\x35\x45\x68\xad\xac\x4a\xac\x74\x6f\x6a\x83\x0d\x34\x6c\x53\x31\xe6\xf6\x44\xb2\x9a\xe3\x1e\x69\x6f\x78\x21\x8e\x73\xb2\x9d\xe7\x87\xac\x51\x76\x43\x92\xaf\x3b\x6a\x6e\x2f\xb7\x60\x09\x6f\xd5\x5d\x87\x5a\xa3\x76\xbb\x6d\xdf\xae\x26\xfd\x2f\xfc\x76\xb5\xd3\xeb\xc5\x57\x7e\x75\x63\x8e\x30\x0f\xe1\x80\x1e\x6e\x6d\x9f\xff\x71\xcf\x17\x7d\xb1\x14\x37\x48\xfe\xd8\x43\xbe\xa2\x29\xdf\x1e\xe1\x75\x7c\x37\x4b\xaf\x3c\xfb\xd9\xc9\xf8\x48\x94\x78\x8f\xa6\x61\xea\x2f\x73\xe3\xe5\x51\xba\x2c\x98\x67\xa4\x97\xa4\x09\xf1\xf6\x2c\xd5\xef\x25\x5d\xfb\x3e\x8e\xc5\xeb\x98\x79\x14\x04\x31\x31\xde\xab\xb0\x80\x15\xe5\xa7\x49\x3a\x8c\x08\xd2\x59\x0f\x75\x91\x5e\xea\x40\xde\xa3\x29\x94\x18\xf4\xce\xb0\xff\xfe\x3c\x4b\x97\x49\x60\x3f\x7e\x51\x5f\x7a\x3c\xc8\xd0\x2f\x19\x9e\x13\xd3\x53\x46\x7f\x36\x44\x34\xb2\x1b\xa1\xc5\x8b\xc5\x53\x9c\x29\x7d\xf5\xda\x37\x69\x1e\xd6\xc0\x8a\x68\xd0\x58\x04\xbd\xfb\x3b\x94\x57\x17\xe9\x32\x0e\xd0\x8c\xd0\x13\x35\x0a\xd0\xd9\xf7\x45\xf6\xc3\x99\xba\x70\xe5\x4b\xff\x02\xe1\x9c\xfb\x69\x3e\x23\x71\xfc\x65\x5f\x96\x1f\x62\x30\x3d\xbc\xee\xd1\x75\x1d\x32\x1f\x3d\xca\xd2\x2b\x74\x15\xc5\x31\xca\x2f\x70\x40\x50\x9a\xb0\xdd\x49\x0d\x0f\xdf\xac\x6a\x2e\x14\xeb\xb4\x72\x81\x2f\xf9\x63\x52\xbe\x35\x41\xbb\x86\x9a\x45\x6d\x5a\x2b\x15\x2c\xdc\x3b\xfb\xdf\x14\x33\x5e\x16\xe9\x1c\xc3\x26\x1e\xdf\xa0\x9c\x14\x28\xb8\x49\xf0\x3c\xf2\xa1\x71\xb6\x11\x53\x60\xe6\xbd\x9d\xb2\x67\x1c\x73\x5c\x90\x2c\xc2\x31\x27\x53\xb0\xca\x02\xc3\xfb\x88\xd6\x05\x84\x53\x9a\x41\x8a\x2b\x52\xf8\x6d\xe6\xba\x6d\x7a\x51\xbf\x4c\xaf\x84\x16\xc4\x67\xdb\x9e\x52\xf0\xbc\x93\x9c\x9f\x9f\x18\x9a\x8e\x3b\xeb\x74\x56\xaa\x8e\x74\x1f\xc5\x0a\x17\x45\x98\x59\xf9\x19\x7e\x89\x4f\x72\x76\xc4\x57\x51\x70\x67\x35\xd1\x5a\x41\x89\x3a\xc8\x63\x27\x63\x07\x79\x82\x02\x8f\x59\x4f\xe9\x50\x16\x3c\x8f\x3c\x1f\xf7\x5e\xc1\x72\x3c\xdf\x49\xa7\xa4\x4d\x19\x3d\x54\x56\xab\x43\x14\xbc\xd2\x37\x31\xbe\x61\xe4\x3d\x7a\xc4\xfe\x80\xc2\xd5\xf7\x79\x17\xba\x90\xc7\x29\xb7\x10\xb2\xe2\xcd\x50\xb2\xd9\x56\x18\xe1\xf7\x66\xa8\x24\x6b\x28\x6c\xa2\xa8\xdd\xd1\x97\xc0\x5d\xb5\x6d\x96\xdf\xde\x96\x35\x6e\x7c\x2d\x7f\x7a\x95\x5b\xe7\x1e\x9d\x41\x1a\x59\x77\xae\x3f\xbd\x1f\x67\xa0\x35\xd2\xab\x8f\x33\xab\x42\xa3\xe3\xc8\x9e\xce\x2f\x41\x82\xfc\x6c\xaa\xe0\x6d\x2b\x47\xf5\xf3\xe4\x4b\x93\xf0\x9a\x8e\x81\x38\x46\xeb\xf5\xc2\x8d\x50\xc9\x83\x78\x2d\x2d\xb3\xd8\x5e\x1d\x6a\x66\xbe\x24\x41\xbb\x6c\xae\x38\x59\x64\x84\xd3\xcb\x58\x2c\x3d\x89\xd2\xff\xac\x41\xf4\x5e\xa6\x57\xca\xd1\xe7\x65\x7a\xb5\x23\x3d\xf6\xe0\x41\x8f\xfd\xa0\xc7\xbe\x8b\x1e\xbb\x22\xcc\x11\xf3\x1d\x78\x8a\x73\xf2\xe0\x3e\x54\xab\x88\x86\x8a\x6a\xb4\xaa\xf8\x74\xe2\x80\xad\x6b\x44\x41\xc9\x8a\xf0\x20\xf9\xa7\xf4\x2a\xb9\xc2\x59\x50\xd5\x97\xc9\xd0\x0d\x5f\xd7\x96\x01\x78\xdf\x94\xeb\x7f\x72\xcd\xf5\x32\xcb\x41\x75\xbd\x48\x61\x28\x1d\xaa\xeb\x28\x89\xa3\x84\x74\x0d\xff\xa7\xff\x2e\xf3\x22\x0a\x6f\x9e\x31\x3d\x2e\xf7\x8e\xea\xe6\x05\xce\x94\xf2\x9b\x16\xfd\x24\x7c\x91\x1d\xca\x71\x97\x0f\x55\xa7\x4e\xb5\x5c\x1d\x52\x69\x91\x45\x73\x11\x0f\x5f\x53\x8e\x3b\x15\xea\x8d\xb1\xe8\x0a\x69\xec\x17\xd1\x25\x29\x29\xfc\xab\x91\x28\x12\xd0\x5f\x22\x3f\x4d\x4c\x9d\xfe\x02\xfb\x51\x71\x33\x95\x1e\xdd\x46\x5b\x14\xbc\xac\x89\x1f\x1c\x98\xe1\xa2\x78\xc4\xab\xb1\x2b\x88\x94\x2c\x94\x0d\xc9\xb0\x54\x45\x86\x13\xe1\xed\xc6\x53\x11\xc8\x92\x9c\x5f\x5e\x5b\x6f\x3c\x5e\x11\xde\xd8\xd1\xef\x61\x9a\xcd\xbd\xb7\x1d\xad\x0f\xc1\x32\xc3\x55\x68\xc4\xb7\x5e\x7e\x91\x66\x05\xc9\x44\x2f\xa5\x6b\xfe\x32\x27\xd9\x2b\xfe\xea\x88\xd9\x35\xac\xd0\x5f\x03\xc3\xee\x10\x90\xdc\x57\x23\x22\x09\x9a\x22\x2f\x4b\x0b\x4a\x70\x3f\x20\xe7\x6d\x33\x48\xd7\x8a\x1a\x83\x23\xbd\xce\x46\xc6\x82\x9f\x94\x9f\x7d\xe5\x05\x22\x21\x2f\xc2\xd6\x1b\x0f\xe7\x3e\xf8\x11\x91\xdc\x67\xde\x43\x77\xb5\x13\x58\xca\x4a\xf0\x69\xb7\x14\x95\x8c\x65\x61\x37\x88\x92\x73\xd4\xca\xa5\x69\x01\x62\x6c\x08\x95\x74\x4e\x67\x28\xa0\x0c\xbd\x9c\x27\x6d\xa5\xcd\x14\x1c\xdf\x58\x7f\x0a\x61\xc6\x44\xfa\x88\x9c\xd1\x85\x33\xa9\x40\x9d\x81\xc6\x9e\x24\x01\x09\x4c\x95\xe7\x83\xfd\xe2\x3e\xda\x2f\x78\xa4\x1d\xca\x1d\x48\x3e\x28\xd1\x5d\x0a\xe5\xbe\xbe\x16\xeb\x1b\xea\xef\x27\x68\xc6\x42\xe1\x32\xd5\x36\x63\xe2\xca\xa0\x24\x60\xec\x82\xcf\x8c\x57\x81\x36\xa6\x80\x2f\xe9\xb6\x5f\xa5\x59\x01\xfc\x68\x7b\x2e\xf2\x45\x21\xb4\xc3\xec\xe7\x76\xbd\x16\x57\x6a\xb8\xb5\xf7\x39\xd2\xa3\x91\x97\xdc\x55\x4b\xcd\xfa\x53\xe7\xca\xa8\xeb\xab\x65\xb3\x22\x88\xfe\xee\x1d\x1a\xf9\x80\xf3\x79\x70\x2b\x56\x29\x15\xf4\x0c\x7c\xb6\x16\x25\xb4\xc6\x1a\x94\xbc\x91\x9d\x7f\xdb\x41\xdf\x7c\x23\x7f\xb5\xd7\x55\xee\xea\xe2\xb2\xf9\x64\x6c\x2d\x3d\x6f\xc7\x50\x15\xe4\xec\x99\x3d\xf7\x63\x7b\x19\x2d\x16\xb1\x8c\x8d\xe4\xd6\x07\xb3\x5f\x2b\x22\x07\xfd\xff\xec\xfd\x7b\x73\x1b\x37\xb2\x00\x8a\xff\x6d\x55\xed\x77\x80\xf3\xdb\x9f\x49\xc6\x24\xf5\x70\xec\x64\xa5\xd5\xfa\xc8\xb6\xbc\xd6\x3d\xb6\xe5\x92\x94\x64\xf7\xfa\xa8\x22\x90\x04\xc5\x59\x0f\x07\x3c\x33\x43\x51\x8a\xad\xef\x7e\x0b\xdd\x78\x34\x30\x18\x3e\x24\xd9\x71\x4e\x92\xaa\x5d\x8b\x03\xa0\xf1\x6a\x34\x1a\xfd\xf4\x19\x6e\x1a\x88\x89\x0c\xc9\x5f\x7a\x30\x49\x27\x92\x66\x7b\xb2\x6e\x2d\x6f\x5e\xe2\x82\x09\xa5\x93\x37\x91\x50\xdf\x94\x52\xdd\xc4\xb6\xd4\x1e\xbf\x3b\x90\x56\xfd\x01\x0d\x4b\xbf\x62\x51\xac\x23\x95\xf5\x23\x8c\xa2\x51\x4c\x9c\xe8\xce\x50\x44\xa8\x68\x8e\x85\x15\x21\x12\x04\x46\xa0\x77\x27\x02\xb4\x03\x71\x82\x40\xfb\xe9\x33\x89\x03\xb7\xbe\xae\xac\x1c\x9f\xd3\x48\x72\x9a\xd7\xc9\x05\xb6\x7e\xf0\x6a\xcd\xb5\x8d\x9c\xe6\x4e\xc0\x72\x7c\x71\x7e\xd0\xaf\x7d\x6f\x6c\x3d\x0e\x2b\xce\x0d\xad\x8f\x55\xbe\x88\x34\x45\xf3\x7b\x9a\x3d\x65\x1d\x06\xfd\x64\x3c\xf5\xcc\x5a\x74\x70\x39\x7d\x45\x2c\x88\x09\x32\xe1\xe5\x08\x82\x82\x0c\x14\x3e\x6f\x6d\xb0\xcd\xad\xb4\xb3\xd9\xfd\x6e\x13\xfe\xef\xf5\xe6\x23\xb6\xf9\xa4\xbb\xf9\xfd\x4f\xdf\x8d\x3a\x5b\x17\x9b\x5b\xdd\xcd\xef\xd3\xce\xe3\xee\xe3\x1f\xd4\xff\xfd\xed\xf5\x77\xaa\xfa\x0f\xec\x07\xf6\x43\xe7\x87\x5f\x1b\x2e\xde\x60\x28\xc1\xb2\x2b\xe3\x15\x50\xa6\x72\x05\x46\xc1\x6c\x8a\xcf\x25\x90\x40\x4e\x6a\xe6\xfa\xb6\xdd\x59\x5b\x0b\xc7\x82\xf1\xc2\x14\xba\xb8\x93\x1d\x0a\xc6\xbc\xdf\xdd\xf1\x34\xd1\xec\x53\x43\xf7\xdd\x88\x52\x0e\xaf\x55\xc5\xcf\xf7\xf1\xa3\xaf\xf1\xc8\x9e\xf0\x5e\xad\xb8\xf4\x31\x08\xdd\x17\x74\xd4\xd0\xf3\x6f\x60\x2f\x22\x9b\x8e\x45\x8e\xda\x17\x70\x8f\x5e\x63\xec\x5c\x94\x7e\xa6\x31\x1b\x91\xcb\xec\x7a\x7d\x5a\x89\xa2\x65\x16\x18\x43\xb6\x79\x23\xaf\x1b\xf8\x93\xad\x65\x06\x7e\xc2\x7b\x9f\x69\xd0\xb1\x31\x7f\x09\xe2\x40\xb1\xed\xbb\x3f\xf5\x45\xff\x47\xb2\x3c\x25\xc5\x5b\x5e\x7b\x57\x7d\xff\xc8\xaf\x37\xef\xaa\x82\x0a\x7f\x26\x8f\xfa\x33\x79\xd4\xdd\x24\x8f\xfa\xf2\x4a\xd5\xcf\x93\xae\x8a\xe7\x59\x92\x9d\xd7\x81\xfd\x2e\xac\x38\x57\x63\x88\x55\xbe\xa8\xda\x13\x66\xb3\x7f\x21\xb2\xf2\x75\x52\x94\x22\x13\x75\x49\x97\xbe\x7b\x34\xa7\xcd\xc2\xf5\xf2\x6a\x93\x3d\xed\xc9\x69\xd6\xaf\x63\xd0\x1f\x6f\x55\x6a\xce\xeb\xc8\xd4\xf1\xc7\x79\xdc\xcf\x65\x9a\xf6\x78\x7e\x9c\xfc\x5a\xd7\xd1\x93\xc7\x8f\xe7\x34\x5a\x38\x39\xaf\xb6\x05\x84\x89\x9a\x93\x5f\x05\x16\xcf\xc9\x01\xf5\xe4\xb1\x43\xf3\x02\x2a\xd7\x56\xfc\x21\xa8\x38\x6f\x6c\x58\xe3\x8b\x2a\xb8\x4f\x78\xef\x20\x1b\x24\x7d\x5e\xca\x3a\x3c\x7a\xb4\xf9\x28\x5a\x7d\x41\x82\x30\x5b\x8f\x36\xc6\x95\x9d\x9b\xc9\xed\xc9\x93\xcd\xba\x16\x0b\x7a\xa4\x55\xbf\x36\x6d\xb7\x35\xc0\x98\xe3\x4c\xa6\x43\xfc\x7f\xcd\x0e\x60\x4b\xc2\xb3\x7b\x0f\xd8\x36\x07\xaf\x96\x1d\x60\x00\xf0\xb7\xd0\xf8\xcb\x0b\x91\x0f\x53\x39\xdb\x66\x8d\x51\x32\x18\x88\xcc\xea\x5e\x49\x8e\x2a\xe7\x94\xf6\xb3\xe8\x7d\x48\xca\x43\xdd\x08\x51\x13\x32\x61\x35\x4a\x39\xed\x8f\x1a\x6c\x7d\x9d\xed\x0d\x06\x2c\x39\x3c\x66\x63\xa9\x9e\xbb\xd3\x31\x2b\x4c\xb5\xae\xe7\x64\x96\x8a\xcb\xe7\x32\x2b\x79\x92\x51\x37\xb2\x20\xc4\x8a\xe7\x07\x66\xe0\x44\x9a\x2d\x17\xb5\x45\x1b\x2f\xf4\x52\xd9\xff\xe0\x59\x26\xe8\x64\x5a\x7c\x5a\x4a\xa7\x7c\x1e\x25\xa5\x38\x9e\xf0\x3e\xba\xdb\xcd\x72\x3e\xf1\x86\x33\x4c\x2e\xa9\x4f\x9a\x59\xc9\x7f\x55\x97\x52\xab\xb1\x1b\x95\x5c\x5d\x38\x23\x3f\xab\x34\x85\x83\xe5\x7e\x7a\x2f\x30\x8d\xa0\x1d\x57\xac\x2f\xfc\x08\x34\xf0\x0f\xaa\xd6\xf6\xa6\xa5\xdc\x5e\x42\x2b\x82\x3a\xfc\x5e\x2e\xf8\x07\x30\x04\x29\xba\x03\x39\xcb\x9a\x8d\x62\xdc\x68\xb5\x23\x3b\xe5\x7c\x11\xef\x32\x66\xcd\xc9\x48\xb0\xe7\xc7\xc7\x28\xe8\x07\x61\xa5\xc9\x90\xa1\x2f\x27\xad\x2f\xd4\xee\x2e\x44\x5b\xda\xd3\xa1\xf6\x6e\x19\x4a\x45\x3b\xfe\x14\x56\x65\x6d\xd6\xbe\x6b\x06\x98\x14\x20\xb1\x51\x4b\xc8\x92\x02\x04\x59\xa0\xd2\x1e\xca\x9c\xa5\x3c\x3f\x17\xec\x22\x11\x5e\xd2\x20\xbb\x7b\x4b\x6b\xd2\xd1\x81\x0c\xf6\xd6\x66\x3e\x89\xb8\x7f\xfd\xa9\x2d\xff\x1a\xb4\xe5\xb5\xd8\x73\x9e\xcb\x99\x75\xe8\x4b\x53\xb4\x87\xb8\xe0\x09\x1c\x7e\xcc\xef\xb7\x14\x56\x15\x63\xd5\x1a\xb0\xaa\xcd\xd2\xe4\x03\xf8\xba\x8d\x65\x2f\x49\x49\x8a\x9a\xe1\x34\x4d\x7f\x46\x9a\xb3\x12\x9a\xc5\x4f\x5b\x62\x39\x29\x7d\xd2\x5c\x47\xb6\xe8\x66\x67\xed\x85\x28\x45\x3e\x4e\x32\x9d\x07\x07\xcc\xa8\x2a\xbd\xc6\x7a\x43\x7b\xab\x79\xaa\x17\x85\x5e\xcd\xf7\x8b\x94\x33\xfd\x3e\x26\x8d\x5f\xa8\xc6\xd1\x76\x5c\xf3\xaa\xe2\x04\x4f\x97\xcc\x16\x05\xa2\x22\x9d\x64\x49\x63\xae\xc6\xc3\x09\xcf\xf9\x98\x7d\x44\x1c\xbd\xd6\x59\xa2\x4e\x6c\xbe\xa8\x42\x4e\xf3\xbe\xdd\x9b\xbe\x06\xef\xb7\xc5\x9c\x3e\xd7\xba\x93\x9f\x85\xe1\xf2\x14\x02\xea\xb5\x25\x69\x94\x14\xe5\x58\x0b\x33\x37\xdd\x30\x5d\x53\x3e\x55\xd0\x2f\xe4\x07\x51\xb8\xeb\xda\x60\x73\x22\x0a\x08\xee\xc5\xd3\x54\xce\x00\x9b\x47\x32\x4f\x7e\x55\x97\x39\x38\x3b\x9a\xfa\x08\xab\xa9\xb0\x7d\x96\x4c\xd4\x4b\xd4\x1c\x26\xd6\xe3\x04\x1f\xe8\xed\xb9\x34\x9e\x5b\x9c\x63\x3d\x31\xe2\x17\x09\x62\x9c\x77\xa3\x14\x7a\x9b\xd4\xe1\xe5\xb9\x00\x2f\xcc\x52\xea\x3a\x08\xe5\x4c\x71\x0a\x67\x78\xb4\x65\x96\x5e\xb1\x49\x2e\x0a\xb5\x3d\xea\xea\x84\x23\x29\x06\xc9\x74\x0c\xd3\x85\x8b\x20\x87\x33\x0b\x2c\x9b\x86\x20\x33\xdd\x9e\xa7\x33\x7e\x55\x78\x10\x4c\x95\xe1\x50\xd7\xc9\xc4\x85\xc8\xab\x55\xdc\x2a\xe0\xfb\x60\x0e\xc9\x33\x28\x0f\x1c\x0e\x6b\x80\xee\xb2\x21\x87\xc3\x46\x88\xb1\x11\x87\xe5\x52\xea\x24\x14\xd5\xdb\x97\x50\xdd\xe0\xad\xb2\xea\x4d\x14\xbc\x25\x6e\x78\x25\xf9\x50\xee\xe6\x6e\xf2\x60\xb6\x96\x27\x61\x67\x27\xbc\x47\x1c\xf2\x4b\x71\x59\x2e\x41\xb9\x1c\x5d\x6a\x33\x4b\x77\xda\xce\x60\x36\xdc\xaf\x9b\xe4\xea\xaa\xee\x38\x92\x0a\x3f\xb3\x1a\x38\x20\x6b\x0f\x5a\x32\x17\x75\xc9\x5d\xc9\x29\x1b\xc8\xac\x51\xb2\x19\x87\x24\x76\x61\xd5\x36\x54\xe9\xf3\x0c\x4f\x8f\x77\xa7\x95\x92\x9d\x81\x42\x9b\x2c\x4e\x98\xf4\x04\x7e\x1b\x53\x26\xf5\x4f\x60\x16\xa3\x7e\x1a\x55\x46\x32\x64\xcd\xfb\x5a\x58\x3f\x31\x32\xdb\xee\x88\x17\x87\xb3\xcc\x70\xb8\xa8\xa1\x0e\xe0\xb5\x5c\x1c\xf7\x72\xa4\x2e\xe8\x4c\xcc\xd8\x7e\x9e\xcb\xbc\xd9\x00\xb3\xae\xb3\x06\x7b\x68\x6b\xb3\x87\xac\x71\xc6\x46\xbc\x00\xc4\x66\xff\xd3\xe0\xd9\xd5\xff\x34\xda\xea\x20\xb0\x19\x2f\x58\x26\x4b\x55\xf7\x22\x19\xe0\x91\x39\xc3\x70\xbe\x64\xc0\x00\xa1\xcb\xde\xa9\x1b\xd6\xaa\x02\xc0\xa3\x3f\xbb\xd2\x56\x5e\x30\xef\x6e\x83\xc6\x59\x5e\x31\x92\xc4\x09\xef\x15\x6f\x44\xc9\xad\x23\x67\x02\xe9\x7a\xe6\x71\x03\xd1\xb4\xab\x85\x15\x17\xdd\xb4\xdd\x5b\x23\x79\xaa\x67\x77\xe7\x40\x58\x79\xc8\x6b\x90\xeb\xf9\x39\xcc\xf7\x48\xf4\xcb\x35\xc6\xd2\x95\x47\x9f\xe3\x8b\x77\xd9\x26\xf6\xa1\xa3\x35\x90\xb7\xc8\x7c\x56\x2c\x93\xee\xac\xf8\x9c\x39\xce\x8a\x3f\x4a\x62\xb3\x62\xc5\x6c\x66\xc5\x8d\x53\x98\x15\x25\x2f\x85\x3e\x89\x40\xaa\x3c\x89\x0f\xf5\x02\x40\x54\xdd\x70\x31\xc4\xb5\xd0\xc0\xa6\x18\xb7\x41\x0d\xe0\x74\x88\x2a\x04\xb4\xf9\x7f\x26\xcb\x52\x8e\x63\xed\x46\x98\x6e\x10\xef\x68\x62\x52\x64\x0a\xc1\x87\x20\x5a\x3a\x96\xd3\xcc\x79\x32\x6a\xb9\x82\x9e\xe1\xb9\x28\x9f\xcb\x6c\x00\xc2\x17\x9e\x6a\x1b\x07\xff\x28\x04\x99\xab\x54\xb3\xbf\x9a\xf4\x55\xbf\x2c\xcc\x5f\xe5\xaa\xc7\x92\x58\x05\x4f\xfd\xa0\x41\x50\x4a\x1b\x3a\xe6\x31\x68\xe3\x0a\xaa\xd5\x35\x97\x15\x6d\xa1\xcb\x68\xa3\x80\x23\xd2\x96\xc2\xb4\x69\x50\x23\x9a\xd0\x89\x54\x87\x6f\x3b\x7e\x76\xa3\xd8\xda\x7f\xbc\x36\x29\x3d\x22\xe5\x7a\xbc\x5a\x4f\x40\xd4\x2d\x64\x49\x9e\x2e\x32\x1e\x8d\xa8\x27\x88\x05\xa9\x9d\x86\xcc\x5e\x4b\xae\xc8\x3f\x49\x86\xe0\xb5\xc2\xd7\x46\x9b\x34\xb0\xef\x8f\xf9\x4d\x0c\x7a\xb7\xd8\x36\xa4\xb9\xf4\x56\x45\xa1\xf3\x71\xb0\x63\x64\x76\x0f\x1e\xb0\x66\xb0\xa1\x8a\xdd\x04\xde\x58\x11\x84\x48\x99\xcc\x1a\x2d\xdb\x45\xfd\xa2\x62\x1b\xad\x63\xa9\x8e\x62\xd1\xb2\x46\x10\xc6\xf3\xb2\x71\xc6\x7f\xf3\x92\x3b\xe8\xa4\xf8\x6c\x9b\x35\x14\x55\x69\x78\xab\x8b\xb9\x29\xe8\xe2\x3a\xa2\x10\x24\xa7\xb8\x48\x80\xb4\x6e\x53\x5a\xd6\xf5\xc9\x08\x49\x79\xe0\x24\x00\xf5\xe6\xd9\xcb\x9b\x86\x3b\x81\x65\x3b\xb6\x1d\xb0\x55\xad\x76\x78\xfc\x5b\xb5\x58\xb1\x68\xcb\x80\xf8\xfd\x96\x7b\x06\x3b\xa5\xb6\x0c\x37\x6f\xc1\x9e\x11\x5a\xbd\xec\xa6\x91\x26\xbf\x9b\x5d\xd3\x2c\x40\x64\xf3\x76\x2a\xb7\x10\xe1\x7b\xdd\xd5\x03\xec\x74\xdb\x6d\x82\x7f\x15\x95\xae\x89\xc9\x0d\x87\x85\xea\x45\x81\x80\x55\x15\x9a\xed\x49\x35\x53\xb0\xec\xd5\xa5\x2a\xa8\xee\x9f\xc9\x69\x36\x48\xb2\x73\xc7\x7f\x36\x49\x5e\xa5\xf5\x75\x86\x58\xc3\x38\x3c\x32\xf0\x19\x86\x39\xb5\x5d\x0b\x2d\x7c\xc3\xbb\xf1\x21\xe1\xa4\x2d\x9c\xd2\x67\xee\xdd\x36\x52\x26\xdf\x8e\x4b\xe1\xae\x1b\x24\xa9\xc4\x3c\x4e\x23\xe0\xf5\x6b\x9a\xbb\x3a\xf5\xad\x3d\x8e\x9f\xc2\x01\x14\x8a\x68\xa2\xd5\xca\xb9\x46\xee\x7b\x8b\x2c\xbf\xb7\x7d\xd1\xae\x17\x4c\x9c\x54\x0a\xdb\x23\xd7\xa5\xa0\x77\xd5\x9f\xb4\x48\xbf\x04\xa0\x2c\xc7\xb0\x5b\xfa\xbf\x6b\x97\xcf\xd3\x47\xa6\x25\x70\x49\xdd\x3d\xf8\xd6\xbe\xbf\xbb\x8b\xfc\x54\x88\x5e\xbf\x10\x9f\x21\xba\x7d\xfa\xeb\xfb\x8d\x53\xfb\xb7\x3d\x28\xba\x1b\xf3\x5d\xf3\xe9\xec\x1f\x6c\xc3\x4f\x55\xa6\x07\xaa\x20\x5b\x78\xd8\x07\x0c\xea\x44\x1e\x64\x03\x71\xf9\x1e\x7e\x9c\x9e\xd2\xbc\x60\x4b\x3b\x75\x80\xe1\xb9\x36\x32\x71\x54\xe2\x99\x94\xa9\xe0\x59\xb3\xe4\xbd\x56\x9b\x35\xde\xe8\x88\x65\x9d\x1f\x0f\xb6\x89\x3c\xd4\x3e\x9f\xe1\xed\x8c\xdf\xe0\xd5\x0d\x62\x70\x08\x82\xd8\x50\x38\xe0\xaf\xb0\x3e\x18\x7a\xf5\xd5\xf4\x9e\xaa\xff\xaf\x3b\x95\x96\xc8\xd8\xfd\x5c\xf3\xff\x35\xea\x52\x7b\xda\xb6\xed\x5f\x6d\xd3\xd1\xb6\xed\xf1\x3a\x20\x45\x25\xbe\x04\xed\xfb\xde\x7c\xa7\x0b\xac\x63\x72\x79\x14\x5d\x14\x68\x18\xa2\xa9\xad\xb6\x33\x71\x2b\x18\xe3\xa7\x11\xc0\x74\x32\xe0\xa5\x20\xca\x64\x5e\x8a\x26\x61\xac\x2d\x1d\xa2\xd5\xe9\x9d\x85\x2d\x5c\x52\xe2\xcd\x27\x4f\x82\x24\xcc\x01\x8f\x50\xc3\xde\xd7\x93\x4d\xfc\x3a\x96\x17\x42\x91\x69\x84\xd4\xec\xc4\x89\x53\x98\x2e\xb7\x3d\xf7\xe6\xbb\x9b\xa1\xdc\x64\x24\x11\xa6\xd4\x97\x00\x54\x33\x22\x5b\xce\x1b\x35\xeb\x36\x93\x71\xf0\xdd\x1e\x6b\x7d\x87\x8b\x12\x77\xc8\x4d\xa2\xf6\x11\x18\x3e\x03\x3b\x01\xe8\x2a\xd2\xc7\x13\x60\xbb\xb5\xb9\x05\x4a\x2e\x8b\x63\xfe\x66\x78\x8b\x38\x10\x69\xc9\x83\x5b\x9b\x3e\x8c\xba\xfe\xc3\x68\xa9\xfb\x7b\x3c\x4d\xcb\x64\x92\x26\xf0\xe8\x99\xc7\x94\x75\x36\xd9\x36\xdb\xdc\xf1\x1a\x67\xe2\xb2\xf4\x2d\xa9\xa2\x57\xe4\x43\x06\x23\x67\xdf\x92\xde\x3c\x76\xe0\x65\x72\x09\x72\x96\xfd\x01\xc9\x04\x08\xce\x8e\xd9\x85\xc8\xcb\xb9\x23\x53\xef\x97\xba\x0b\x75\x20\x4a\x61\x5e\x66\x20\xaf\x6e\xb6\x74\x4b\x71\x21\xf2\x42\xc4\xe6\x65\x8c\xb8\x2c\x87\xab\xee\x42\xef\x06\xd6\x83\xfa\x36\x98\x7e\xdd\x01\x41\x78\xc7\x5a\x22\x7c\x90\x95\xf2\xa7\x44\xcc\x96\x13\x0a\x6c\xd5\x4b\x05\x22\x4f\xe2\xad\x6a\xa6\x63\xbc\x36\x82\x5a\xf0\xd1\x7b\x23\x62\xb1\xcf\x38\x56\x98\x49\xc3\x40\x06\x7b\xe1\x65\x15\x2c\x83\xf6\x14\x66\xd7\x5e\x1c\xd1\xbb\x2a\x5a\x5f\xfd\xeb\x25\x29\xbe\x6f\x1a\x7c\xfa\xc4\xee\x1b\x80\x14\xa9\xf1\xc2\xaa\x70\x25\x90\xc2\x1c\x9b\xc2\x8e\xb2\xbf\xdb\xb1\xc2\x6f\x0a\x62\x7d\x1d\x78\x21\x06\x2e\xd6\x72\x68\x6c\x2b\x92\x82\xc9\x29\xd8\x1d\x5c\x24\x62\x36\xff\x20\x58\xd8\xde\x31\xf0\x47\xd0\x09\x46\xb0\x0a\x0e\xd6\xa1\x1e\x13\x69\x21\xbc\xc9\x02\xbb\xc6\xfe\xe1\xfa\x82\x0f\xc1\x74\xb1\xd2\xf2\xf3\xfd\x65\xd5\x09\x63\x07\x9d\x70\x14\xab\x4c\xf9\x97\xe5\x8e\x5b\x0d\xb5\x5d\xee\xbc\x3d\xaa\x3f\x6f\x75\x32\xb2\x47\xab\x0b\xc9\x1e\xd5\x4b\xc9\x22\xa7\xfa\xd1\x7c\x82\x0e\xc1\x39\x3d\x71\x8e\xdf\xf3\x7d\x90\xd8\x0c\x87\x8d\x0a\x6b\x0d\x5d\x68\x0e\x8d\x2c\x34\x19\x8d\xdd\x16\x7c\x2f\xec\x92\x36\xf4\x21\x11\x34\xa1\x6f\x2b\xaf\x09\x29\x20\xcc\x3a\xb1\x9c\xd5\xb8\x74\xbb\x07\x52\x48\x9e\x2a\x5d\x79\x42\x9b\x05\xb7\x9e\x37\xff\x7f\xf8\x73\x7b\xe8\x0d\x7b\xdb\xfb\xf5\x0f\x92\x5b\x9d\xf4\x4b\x18\xb6\xe5\x3a\x36\xc0\x1c\xf8\xc5\x43\x09\x1f\x42\xc1\x84\x15\x42\xd4\x0b\xb1\xc0\xf0\x32\x1c\x6a\xac\x09\x29\xf7\x9f\x55\x21\x9f\x56\x11\xb6\x07\x03\x6a\x57\x05\xee\x95\x01\x5c\xb7\xea\x5e\x28\x70\xee\xc5\x78\x62\xdc\x95\x97\xd1\x81\x10\xa5\x50\x0b\xfd\xb9\x8c\x36\x8a\x7a\x8c\x84\x0a\xa9\xf7\x38\x49\x48\x42\xed\x02\x50\xbe\x48\x06\x6f\x30\xe3\xff\x1a\x63\x55\xd5\x6d\xa5\x1e\xa1\x3d\xeb\xeb\x4c\x14\x69\x92\x95\x1d\x1d\xcd\xa0\xa3\x28\x5c\x27\x4d\x32\xc1\x40\xca\xb6\x9e\xc9\xce\x20\x19\x74\x40\xe5\xd0\x29\x44\xd9\x81\xe5\x5f\x33\xa4\xc2\x5f\x66\xab\x98\xc0\x60\x08\x76\xc5\xea\x9f\x45\x91\x57\xd1\x52\x0c\x2b\x24\x64\x65\x75\xcb\xf1\x23\xb4\x5e\x62\x3d\xb0\x62\x73\x92\x8b\x8b\x77\x46\x17\x2d\x2e\xa0\x2b\xaa\x8b\x9e\x3f\x20\xb7\x96\x27\xd6\x98\x67\x0c\x97\x0d\x84\xfb\x41\xa3\xa2\x01\xe3\x25\x9a\x6b\xf0\xb1\x60\x65\x32\x46\xfb\x30\x6c\xf7\xb3\x60\x99\xd0\xf6\x73\x23\xd1\xff\xc0\xf8\x39\x4f\xd0\x30\x09\x6f\x2d\x67\xf3\x65\x0c\x6b\xbb\xab\x2d\x2d\x65\x41\xdc\x21\xf2\xd5\x5f\x70\xc6\xec\xfc\x83\x42\x7a\xc0\xe6\xf0\x94\xcd\xf0\x4e\x9c\xb3\x51\x3f\x27\x69\xfa\x63\x36\x5e\x06\x75\x49\xd5\x66\xb0\x31\xf4\xb9\xde\xed\xf3\xac\x2f\xd2\xa6\x8f\x4b\xe1\x0b\x2a\xa8\x15\x19\x62\x6c\x3d\x6b\x86\x18\x5d\x7a\xe2\x82\xcc\x82\x57\x12\x79\x1f\xc5\x98\x64\x2c\x8e\x70\xc7\x3e\x63\x7c\x5b\xbe\x78\x05\x96\x78\x1e\x37\xac\x46\x96\xe2\x85\xb9\xb1\x13\x61\x73\x75\x54\xf1\x0a\x83\x8c\x9a\xb2\xdc\x45\xda\x99\x77\x0d\x45\xd8\x3a\x77\x03\xb3\x87\xae\x9c\xde\x46\x9d\xb0\x99\x11\x37\x46\xa0\x39\xba\x9e\x5a\x46\xb2\x96\x45\x06\x1b\x12\x33\xf2\xa8\xe0\x31\x09\xdd\x12\x42\xa5\xb2\x2f\xd9\x5c\x5f\x67\x6f\xf8\x15\xeb\x09\x36\xcb\x65\x76\xce\xa6\x59\x99\xa0\x3d\xea\x50\x66\xa5\xe2\x80\x53\xc9\x07\xda\xc8\x19\xfe\xd3\x9a\x68\xb3\xc6\x4f\xed\x78\x67\x46\xa4\x6a\x86\xe5\xed\x49\xd3\x1f\x18\xce\x46\x1d\xf9\x5a\x82\x80\x55\x3e\x7d\x0a\xa6\xa4\xfb\x99\xdf\x14\xea\xb4\x14\x02\xdc\x47\x23\x0b\xf0\x23\x75\x17\x5a\xa4\xa7\xe5\x6b\x23\xf0\x2a\x49\x72\x37\x51\xa8\xd8\x0f\x36\xe5\x7a\x31\x99\x42\x0b\xbb\x9a\x53\x8f\x85\x21\x13\xef\x82\xd2\x3f\x6a\x87\xdc\xc8\x96\x3e\xb5\xfe\xa9\x36\x6a\xf7\x38\xbf\x1f\x51\xa6\x2f\xd4\xa3\x1b\x8b\x76\x57\xd9\x7c\xa9\xd1\xe7\xd7\xaa\xf2\x8d\x40\xda\xa8\xc9\xe3\xf1\xb2\x58\x24\xf6\xd6\x2f\x35\xc1\xb7\xd4\x7f\xd6\x16\xda\xd5\xb3\x9f\x68\xbd\xaa\x29\xb3\x6b\x50\x2d\x8b\xb7\x04\xe3\xbf\x48\x2b\xf5\x9d\xb6\x30\x4a\x6e\x57\xd7\x7c\xa9\x7f\x7d\xad\x64\x9c\x70\x33\xbb\x84\xc5\x26\x09\xc6\x82\xd1\xd5\xb6\x9f\xa2\x2f\xba\x05\x97\xcf\x2f\xe4\xf6\xf1\xd6\x67\xb5\x80\x67\xbf\xd8\x88\x67\x01\x9e\x42\x88\x33\x8d\x8d\x61\x18\xb4\x30\xd1\xab\xa9\x6f\x91\x03\x6d\x2e\xc3\x8d\xf7\xbf\xaa\x89\xa3\x35\x2d\x6e\x1f\x64\xf8\xb0\x5b\xe4\x7e\xe9\x3d\x68\x60\xbc\x06\xba\xbc\x10\x53\xd3\xac\x21\xfc\x50\x8b\xa5\xfe\x80\x55\xb1\xd9\x65\xcd\x09\xbe\x49\x40\xb6\x30\xaa\x9a\x83\x66\xc4\xc8\xab\x05\x57\xab\xfa\x61\xf9\x19\x47\x1e\xad\x9a\x72\xe4\x11\x49\x12\x92\x5c\x8a\x41\x9b\xdd\x77\xab\xb8\x4a\x3a\x0f\x02\x88\x9c\x14\xe6\x01\xa3\xd5\x5b\xde\x6a\x94\xbc\x77\x50\x8a\xb1\x9d\xd5\x6a\xab\xe2\xf9\xb3\xad\x12\x05\xcf\xd2\x4b\x47\x4b\xd5\xbd\x44\x06\xdd\xda\x89\xde\xf7\x0b\xe3\xe2\xf8\x8e\xad\x31\xfb\x9c\x02\x6f\xab\xda\x6b\x35\x6a\x29\x30\x8f\x1c\xea\x50\xb8\xfe\x11\x21\xaa\x06\xca\x27\x57\x34\x62\x74\x33\xe0\x80\x9a\xa2\x8d\x4a\x89\x56\x8f\x06\xd3\x7f\x6e\xf4\x9f\x63\x3e\x69\xd2\xfb\xa4\x4d\x24\x61\xf0\x9d\xde\xe5\x20\x63\x0d\x41\x25\xc5\x4f\x3c\x4d\x06\x66\x29\xb1\x91\xff\xea\xd7\x7a\xc2\x50\x99\xe8\x73\x9d\xaa\xdd\x4f\x9a\xde\xc1\x8f\x2e\x21\x7a\x8a\xd7\x71\x13\x25\x92\x41\xb8\xc1\x7d\x9d\xac\x83\x74\x6a\x40\x05\xad\xe0\x44\xbb\x94\x47\xb4\xeb\xdd\x5d\xe6\xf3\xf8\x8c\x2e\xf0\xc3\x5d\xaa\x0d\xa8\x0b\x62\x94\xca\x4c\x78\xcb\xd1\xf6\x56\x83\x38\x1d\xcd\xbf\x60\xb7\xdd\x20\x15\x9e\xeb\xb9\x22\xf6\xe9\x07\xbd\x2a\xb0\xf5\xbd\x9b\xce\x26\x55\x08\x53\x39\x31\xcf\x78\x2c\x76\x9f\x12\xfb\xfb\xe8\xad\xa5\x79\x2e\xb7\x6c\x6e\x4f\x1d\xf7\xd6\x5a\xc2\xfa\x6e\x8e\x5d\x24\x79\xbe\x2f\x1f\x2b\x8a\xf9\x39\xba\xd9\x6d\xb3\x06\xb1\xc5\xb1\x21\x23\xa1\x15\x68\x80\xc8\x92\xe7\x10\x59\xa8\x31\x4b\xb2\x81\x9c\x35\xda\x4c\x66\xf8\x22\xde\xae\x3e\x92\x49\xa4\xe7\x15\xec\x11\x97\x1d\x2a\xd9\xc0\x60\x8d\x18\xab\x2e\x47\x48\xa7\x9d\x79\xec\xfc\xc1\x39\xbb\x3e\x8f\xd1\x5e\x76\x64\x91\xb1\x31\xef\xf0\x30\x9f\xc2\x56\xee\xe5\x76\x50\xb7\x4a\xb7\x3d\x8d\x70\x58\x3d\x17\x43\xef\x31\x31\x6c\x66\x72\x20\x5a\x95\x21\x58\xca\xa3\x45\xe4\xaa\xd6\x4e\x50\xe7\xba\x02\x5c\xaa\xa1\x40\x4e\xd3\xa4\x28\x1b\x61\xb1\xcc\x8c\x88\x33\x2a\x1c\x59\x9b\x03\x7b\x85\xf5\x8d\xae\x70\x80\x01\xf5\xf7\x7b\x65\x4e\x24\xb1\x96\xfb\xaf\xe5\xd7\x22\x8b\x1f\x23\x5b\x6b\x35\x0d\x97\xb2\x44\xb4\xf5\x8d\x6d\x1c\x95\x1d\x61\xea\x38\x4d\x3f\xd4\x4a\xee\xac\x5d\x37\x2b\x57\x21\x75\x22\x00\x9b\xf7\x48\x78\x49\xe7\x8e\x6c\xed\xbd\x29\x19\x37\xdf\x42\xc7\x4b\xeb\xa0\x14\x38\xe1\xb9\xdc\x37\x94\xeb\xdd\xd6\x86\x7f\xed\x98\x8f\x58\x25\x18\x06\x8d\x87\x47\x28\xb6\x75\x7f\x5a\xbb\xde\xb9\x61\xb8\x4b\x55\x7c\x82\xce\x51\x10\x1e\xcd\x8f\x7f\x59\x98\xa8\x97\xc5\x67\x8a\x75\xf9\xf8\x6b\x0c\x9c\xb7\x5c\x54\x9a\x27\xf1\xfa\x73\x03\x4a\xd2\x8a\x5f\x24\x6c\x49\x15\x29\x7e\x89\xdb\xa7\x57\x63\x1a\x3e\xf9\x2d\xb7\xe6\x5e\x7c\x67\xfe\x0c\x6c\xf6\x67\x60\xb3\x5b\x05\x36\xfb\x7d\xe6\xfa\xff\x4d\xe3\x80\x95\xa3\x5c\x96\xe5\x9c\xd0\x3e\x5b\x95\xaa\xf3\x7a\x32\x75\xbe\x58\xd4\x26\x1b\x0b\xe8\xe3\xda\x3d\x12\x73\x66\x72\xd9\x68\xaf\xdd\x33\xa9\x63\xdc\x17\x12\x33\x87\xf7\x0a\x99\x4e\x41\xe9\x74\xaf\x94\x93\x6d\xd6\xe8\x6c\x6e\xa8\xff\xb0\x26\x89\x12\xa4\x43\xd2\xb4\xd7\xee\x8d\x0b\x1b\x07\x08\xb9\xd1\x86\x65\xe4\x1b\xd6\x2f\x32\xbc\x60\x88\x79\xa4\xe7\x1a\x79\xaf\xce\x33\xd2\x03\xd0\x66\xbf\x78\x7c\xcd\x3d\x0b\xce\xab\x06\x72\xf2\x7b\xf7\x88\x8b\xa4\xfe\x11\x73\x90\xbc\x77\x6f\x19\xf7\xc8\xca\x7d\x76\xef\xde\x67\xf2\x92\xbc\x77\xef\xde\x7c\x17\xc9\x7b\xf7\xae\x55\xf7\x9f\xc9\x3d\xd2\x9b\xe8\x2a\x7e\x92\xfe\x0a\xdd\xd8\x61\x52\x94\x6f\x04\x2f\xa6\x79\x8d\x1f\xe1\xbd\x7b\xf7\xa8\x89\xa1\x67\x4a\x0b\xdf\x21\x9f\xba\x1c\x0e\x0b\x51\xea\x92\x0e\x2d\x41\x9d\x9d\x31\xb3\xad\x42\xf3\x4c\x78\x28\x30\xa3\xe6\xab\xc0\xd2\xb6\x3d\xf7\xee\xcd\x35\xe8\xb6\xf4\xa2\xce\x7a\xf6\x1e\xa2\x28\x55\x0d\x10\xfb\x56\xf3\x59\xf1\x17\xba\xe6\x24\x17\x17\xc1\xdc\x2b\x66\xc4\xa4\xaa\x3f\x31\x7f\xbe\x74\x21\xfc\xf5\x6f\xb6\xa0\x2c\x19\xb2\x26\xe9\x8f\xd8\xc6\x04\xbb\xf0\xe9\x13\xe9\x2c\x52\x0d\xcd\xaa\x71\xba\xf7\xcc\xa4\x9a\x1f\x43\xc3\xe8\xed\x38\xf8\x36\xf3\x01\x55\xaa\x61\xbf\xd7\x38\xe8\x6b\xdc\x13\x63\x68\x7c\x2b\x83\x19\x38\x72\x73\xcc\x65\x02\x2a\xf5\x5e\x4d\xb0\xde\x6a\xe6\xde\xbd\xe5\x6c\x66\x2c\x4e\xbc\x96\x7c\xe0\x69\xed\xba\xf8\x4d\xa3\x83\xda\x1e\xfc\x60\x96\x76\xce\x5e\xde\xc3\x9a\xb1\x45\x5f\x6e\xcd\x17\x2d\xf9\xda\x3d\xd0\x6c\x56\x16\xc0\x37\xbf\x98\xb3\x06\xa1\xf1\x85\x99\x4f\x8d\xe5\x45\xb5\x4b\xab\x4a\xbd\x77\x6f\x7d\x9d\x3d\x97\x79\x2e\x8a\x89\xcc\x06\x05\x2b\x25\xdb\xdc\x60\xc3\x1c\x82\x99\xf2\x92\x3d\xd9\x60\xaf\x7e\xed\xae\x45\x46\x43\x34\xae\xf7\xcc\xed\xe1\xab\x55\xab\x27\xb6\xfe\xc0\x2e\x27\xec\x53\xbb\xa3\xc5\x18\xea\xcf\x6c\x9a\xa6\x6d\xef\xa4\x2c\xe9\x97\x7b\x77\x82\x3b\xed\x2b\x83\xa3\x58\x10\x84\x1f\x06\xae\xf1\xef\x9e\x16\x50\xe9\xd7\x37\x7e\xab\x97\x42\x41\xf1\x3d\x2d\x7b\xca\x30\xf6\x23\xca\x9e\xa0\xe0\x1a\xfe\xb9\x6e\xa9\x7f\xec\x86\x9f\xaa\xbf\xf4\xba\x7a\xc7\xcf\x49\x43\x7c\x21\x88\x7f\xb3\x55\xa4\x21\xf7\x8c\xaf\xb2\x9e\xb0\x13\x26\xab\x0f\x71\xb1\x43\xd0\x6f\xf8\xae\xfc\xfe\x0e\xdf\x95\x7f\x59\xf1\x5d\x49\x1f\xfc\xea\x78\xfe\x65\x6d\x7d\x9d\x3d\x83\xd4\x5a\x32\x63\xa3\xb2\x9c\x14\xdb\xeb\xeb\xe7\x49\x39\x9a\xf6\xba\x7d\x39\x5e\x87\x15\xeb\xf4\xa4\x2c\x8b\x32\xe7\x93\xf5\x81\x1c\x77\x46\x22\x9d\x88\xbc\x58\xef\xa5\xb2\xb7\x3e\xe6\x45\x29\xf2\xf5\x22\xef\xaf\x4f\xcb\x24\x5d\x4f\xb2\x17\x87\x6f\xba\xff\x29\xfe\xb2\x86\x5a\xa9\x17\x87\x6f\xd8\x2e\xbb\x7f\xbf\xa9\xe3\xfe\x20\x8a\xa1\x31\xae\xf5\x86\x02\xe7\x05\x2c\xe9\x0e\x64\x1f\x38\x9b\xc8\x27\x1f\xb7\xd4\xe8\x41\xdc\xce\xfb\x23\x31\x50\x0f\x86\x9d\xbf\x10\x8e\xba\x10\xc4\xdf\x01\x7a\x6f\xb1\x8f\x7f\x01\x79\x99\x6b\xa1\x8e\x27\x36\xbc\xfe\x8b\xdd\x49\xbf\xa9\xba\x1d\xbd\x0f\xc1\xa2\x95\x23\xc1\xfe\xf3\xbf\x53\x91\x5f\xb1\x09\x84\x61\x89\x2d\xa3\x2c\x47\xb9\x10\xeb\x58\xaf\x9b\x97\xa9\xf6\xc0\xe9\xa8\xde\xc9\xa8\x43\x3f\x8d\xa6\x1d\xb3\xa2\xe6\x6e\xdc\xf6\x33\x23\xfe\xb0\x74\x1d\x40\x2c\xe8\x5a\xde\xc7\x8d\xf8\xf4\x89\xdd\x0f\xd7\xb4\x27\x07\x57\x31\x70\x8d\x24\x1b\xe8\x30\x46\xbc\x14\x0d\x1f\xa6\x5a\xf7\xc1\x74\x3c\x56\x4c\xeb\xdc\x4d\x42\x02\xd0\xd2\xad\xa1\x49\x17\x73\xfc\x81\x56\xae\x19\xb4\x3a\x11\x97\xe5\x5b\x39\x10\xcd\xc6\xde\xb3\xe7\x2f\x1a\x2d\xbf\xe1\x20\x51\xef\x3e\xb0\xc8\xf2\xbe\x03\x3d\xe9\x0e\x65\x56\xea\xf7\x44\x63\xf3\xbb\xc9\x65\xac\xce\x4c\xf3\x3b\x8d\x9a\xf2\x91\x61\x9d\x1a\x9b\xf1\x0a\xe6\x75\xa4\xaa\xd8\xe7\x51\xa4\x5e\x09\xc6\x13\xf8\x5e\x8a\x43\x32\xaf\x27\x55\x4d\x3f\x9f\x4c\x2d\xba\x35\xfe\x6a\xa9\xf6\x66\x4d\x3c\x2c\xb6\x8e\x3c\x3b\x6e\xd3\x75\x6f\x9e\xf9\xb4\xb7\xd3\x3e\x04\x93\xec\xc2\xdf\x69\x70\xa3\x20\x6d\x2a\x40\x77\xd9\xe6\xce\x5f\x3c\xad\x69\xb5\xca\xee\x6e\xd0\x73\xb5\xf7\x4c\x9c\x63\x7c\x56\x02\xec\xda\x1b\x89\xbf\x2c\xb9\x18\xcb\x0b\x11\x59\x96\xd8\x69\x20\x87\x3b\x3c\x61\x6c\xb7\x72\xe8\x6a\xa8\x62\x51\xf2\xfe\x07\xb3\x6b\x70\xaa\xf9\xfa\xd6\x77\x8f\xfe\xf6\xdd\xa3\xef\x9f\x90\x23\x5c\x63\x9a\xdf\xd4\x61\x12\x7d\xb7\x73\x77\x9a\xbc\x15\x35\x21\x15\x89\x75\x20\xd6\x5c\x5f\x67\xef\x44\x3e\x94\xf9\xd8\x04\xfa\xeb\x4f\x53\xc8\xa3\x5a\x60\xc4\x39\x88\x51\xe7\x2c\x18\x93\x82\xe5\x25\x44\xcb\xe4\xe0\x1d\x3b\x16\x45\x91\x64\xe7\x6c\x3a\xc1\x9c\xa0\x65\xce\x7a\x1c\x03\xde\x11\xbc\xb1\xcd\xef\x1b\x03\xc8\x18\x81\xa8\x0c\x8e\xd0\x86\x32\xbe\xb2\xcd\x16\x41\xcf\xd2\x46\x74\xf3\x29\x4d\xac\xaf\xb7\x18\x62\xe9\x2d\x7f\xeb\xf7\x55\xcc\x92\xb2\x3f\x62\x3e\x79\x47\xe4\x2a\x04\x41\xaa\x6d\x1f\xf5\x34\x54\x7f\x99\xcd\x5b\xce\x7c\xf5\xdd\x0a\x2a\xb3\x75\xbd\x98\xa3\x77\xdb\x4e\x3a\xb5\x4b\x1a\x5b\x71\x82\xd3\x35\x28\xc7\x76\xeb\x90\x91\x5e\x94\xc5\x22\x7c\x75\xbd\xc6\x70\xf7\xab\xc0\xc8\xea\x79\xb1\xa1\x5d\x82\x1d\xd3\x4e\x71\x9f\x1b\x61\xef\x04\x4b\xa3\xb3\x8a\x23\x4e\x0c\xc9\x6a\x70\x56\xfd\x07\x41\x9c\x97\xc5\xe3\xb9\xc3\xb8\x11\x56\xd7\x0d\xc3\x08\x30\x97\xe8\x7f\x29\x98\xd7\xde\x29\xa9\x41\x74\x05\xac\xf6\x94\x54\x98\xf7\x1f\x6e\xc5\xbc\x43\x9c\x10\x5e\xa7\xb7\x79\xf2\xf8\x6f\x2d\x22\x13\xd6\x11\x35\xc1\x8c\xbf\xcd\xec\x71\x2c\x65\x9b\xc9\x09\x1c\xb0\xb6\x8d\xf4\xea\xb2\xd7\x42\x7e\x75\xb6\xcb\x1e\x66\x62\xc6\x5e\xa0\x93\x8c\xfa\x3e\xcc\xe5\xd8\xed\xdb\x7b\x05\xf4\xd4\xa4\x73\x85\x47\x73\x0a\xe6\x41\x18\xcb\x4b\x17\x08\x85\x16\xbb\x2c\xc9\x0e\xa7\xe5\x71\x92\x19\x50\x26\x75\x37\xdb\x65\x8f\x1e\x6f\xa8\xca\xe6\x74\xc8\xa1\x19\x5a\x10\xaa\xd3\x18\x15\x98\xf1\xb2\x5d\x53\x71\x0d\xd5\xd7\xc8\x66\x40\x1d\x0b\xc1\xfe\xf5\xe9\x13\xfb\x88\x16\xd2\x7a\x44\xba\xa0\x0b\x3f\x3f\x7d\x82\xcf\x9a\xc1\xb2\x43\x33\x75\xec\xa7\x4f\x9f\x6c\x71\x38\x16\xfb\xe7\xa7\x4f\xbe\x64\xf1\xda\x38\x45\xa9\x19\xe2\x12\xee\xee\xb2\x52\x06\xf9\xb2\x4c\x7b\x63\x7d\x40\x22\x46\x6a\x3e\x98\xf1\x34\x17\x7c\x70\x05\xfe\x37\xf0\xdc\x36\xfb\x6b\x38\xca\x86\xb5\x07\x08\xf7\x08\xf5\xfd\xd7\x5e\xd4\x3f\xdc\x33\xe7\xc0\x49\xf7\x10\x74\x86\x61\x03\x9e\x25\x63\x5e\x0a\xd6\x2c\x93\xb1\x28\x4a\x3e\x9e\xd0\x40\x99\xb6\xb9\xb3\xfe\xa8\x99\x9a\x37\x39\xed\x94\x66\x5b\x37\x88\x4d\x43\x75\x16\xc6\x6e\xe1\xda\x05\x27\xcc\x80\xff\xa5\xb8\xaa\xc9\x71\x02\xf6\x95\x6f\x78\x39\xea\x8e\x93\xac\xb9\xd9\x66\xcd\xa6\xaa\xdc\x41\x04\x6f\xb1\x75\xbb\x99\xad\x96\x6d\x26\x80\x67\xdb\x85\x7f\x61\xa2\xad\xb5\xb5\xca\x58\xd8\x2e\x6b\x62\xc5\x6f\x59\xb3\x94\xac\x03\x67\xa3\xd5\x62\x0f\xe1\x0f\x6c\x01\x03\xf8\x3b\xdb\x64\x4f\xd5\x81\x6d\xea\xd5\x6b\xb1\x6d\xf8\x19\x73\xa0\xb5\x0b\x05\x92\x02\xbf\x4b\x3d\x6f\xbb\x8d\x14\x24\x49\x25\x8c\xeb\xb8\x76\x4d\x88\x80\x3d\x7b\xac\x99\x79\x69\x1b\xba\x8f\xd5\xf0\x37\x59\x07\x17\xa9\x2f\x8b\x26\xfc\xf1\xee\x80\x7d\xcb\xd4\x9a\x5c\xaf\xad\x21\x5d\xea\x6a\xb2\xa4\xad\x3b\x40\x91\xe3\x26\xb0\x0c\x5d\x09\x18\x90\xa6\x7e\xaf\x9c\xc8\x49\x63\x21\x61\x5a\xd3\xf6\x3b\xe8\x74\x72\x27\xfd\xbe\x86\xf0\x65\xcb\x74\xac\x16\x21\xa4\xe0\x7f\xbb\x35\x05\x3f\x4f\x65\x8f\xd7\x66\xc1\x79\xb2\xd1\xb2\xd9\x2c\xcf\xd4\x77\x51\x94\x7b\xb0\xd7\x89\xcc\x5e\xe6\x7c\x2c\x9a\xad\x33\xc8\x64\x89\xd7\x01\xd6\x50\xbc\x1a\x80\xed\x46\x9b\xac\x31\x45\x9a\x74\x8d\x19\xa4\xdb\x38\x5a\x58\x6f\x2c\x7f\x9d\x53\x69\x68\x82\x84\xaf\x19\x65\x80\x77\x12\xed\x4e\x99\x7a\xac\x39\xcc\xdc\x35\xd3\x9f\xe6\x79\xe4\x96\x19\x17\xf6\xd4\xf2\xcb\xe6\x46\x9b\x6d\x3e\x61\x1d\xd6\x84\xda\x1d\xe8\x04\x4e\xab\x9e\x38\x5e\xbd\x27\xc9\x58\xc8\x69\xd9\x1c\x66\x6d\x36\x2e\x5a\x0e\xc5\xf5\x98\x54\xe3\xb6\xaa\xbe\xe6\xd2\x84\x9e\xe1\x51\x99\xb3\xae\x9a\x40\xda\x65\x8d\x35\x88\xac\xea\xf3\x45\xd5\xc6\xf2\xd7\xfa\x3a\xfd\x54\xf0\x5c\xcf\x67\x6d\x4d\x11\xd6\x97\x7a\x19\x49\x08\xe2\x5e\x92\x0d\xcc\x51\x36\x7b\xaf\xff\x82\xb2\x26\xf6\xa4\x16\xc2\x4e\x02\xff\xf0\x8b\x9d\x75\x0b\xdb\x65\x95\xa3\xae\x21\x5a\xee\x27\x00\x55\x39\x17\x4f\x36\x6e\x75\x2e\x96\x4a\xa3\xa8\x47\xce\x3e\xaa\x0d\x9a\x25\xd9\x0e\xae\x51\x55\x32\xf8\x8d\x95\x0c\x7e\x63\x28\xc1\x2c\xc9\xac\xac\x69\x67\x8d\x86\x77\xc0\xd6\xfa\x50\xce\x6d\x8d\x75\x62\xad\x0b\x91\x0e\x2b\x6d\x69\x53\x55\xc1\x36\xa4\x05\x1f\xaf\x77\xa2\xa4\x16\xa7\x77\x4b\x93\xb1\xef\x36\x23\x36\x63\x4f\x36\xff\x8f\xa7\xbf\xfc\xf2\xc9\xf7\xfe\x38\x09\x37\x73\x31\x7c\xb4\xa3\x1e\xed\x6c\x26\xf8\x87\xcf\x69\x14\xf4\x25\xf2\x03\x7e\x89\xac\x71\x68\x81\xfa\x0c\x1f\x1e\x51\xec\x78\x1c\xa9\x3b\xaf\x13\x57\xcb\x36\xfc\x6f\x71\xd5\x93\x3c\x1f\x40\x9a\xe5\x39\xc9\xf8\x1e\x11\xdb\xb7\x4a\x9b\x79\x7d\x56\x2a\xc7\xc1\x98\x80\xa7\xf1\xbe\x37\xe7\x34\x5a\xba\xf3\x23\x1d\xef\xe6\x0b\x1b\x3f\xdd\x51\x66\xb4\x7e\x60\x78\x1c\xa4\x0b\xdb\x60\x1b\xac\xc1\x1e\x6a\x4f\xf2\x62\xc2\xfb\x49\x76\xde\x9d\x66\x49\xc9\xbe\x65\xdf\xb3\x87\xac\x31\x31\xd9\xcb\xee\x2e\x25\xd6\xef\x31\x25\xd2\xcf\xa3\xa4\x3f\x22\x62\xc1\x62\x24\xa7\x29\x8e\xdc\x04\x5d\x42\xf3\x72\xf1\xd4\xf6\x44\x82\xe6\x2e\x48\x95\x81\x01\x8e\x4d\xd4\xdc\xd3\x56\x6d\x6a\x1a\x9b\x88\x07\x16\x4f\xf4\xa7\xa5\x80\xf8\x6b\x7a\x0c\x93\x5c\x14\x64\xb9\x5c\xd0\xdd\xfa\x2c\x38\x3e\xfc\xe3\xca\xb4\x7a\xc2\x26\x6c\x91\x39\x64\x69\x63\x7d\x99\x15\xd3\xb1\x97\xef\x09\x92\x5f\xd8\x98\xbd\xf5\x59\x6c\x2c\xfe\x2c\x95\x11\x3f\x42\x32\x9c\x19\x80\x7a\xb6\xd2\x6b\x62\x6b\x45\x70\x48\x05\xaa\xf0\x96\x4e\xec\x4f\x33\x1a\x50\xe3\x7f\x1a\xc7\xc2\x3a\xbb\xc2\x11\x8e\x3a\x8d\x87\x6e\xe0\x35\x5e\xe0\x24\xca\x83\xae\x62\xbf\x98\x2a\x7a\xbb\x6d\x05\xfd\xdb\x14\xeb\xfd\x71\xe1\x32\xf0\xb7\x6d\xbd\x9a\xbb\xb2\xf5\x56\xa6\xee\xc8\xd4\xbf\xd8\x0e\x4f\xbb\x16\xab\xa1\x80\x47\x30\x76\x6b\x7d\x82\xef\xca\x1f\x58\x0b\xbd\xee\x6b\xf8\x61\x86\xf8\xa5\xac\x3e\x6a\x1c\xcf\x5c\xac\xa1\xe5\xdd\xdd\xe8\xdd\x4a\xbd\x41\x56\xf4\x7a\x6b\xbb\x43\x6c\xb6\x13\x3c\x80\xb2\x81\xa2\xdf\x9d\xcd\xd0\x2b\x2e\x08\x06\x82\xf1\xb8\x9f\xe2\x71\xdb\xc6\x73\xb2\x06\x7e\x38\xd7\xe0\x4f\x43\xf1\xb6\x4b\xcd\xa2\x97\x0e\x94\x0b\x1c\x9a\xcd\xd2\xb2\x0c\x79\xf6\x12\x8f\x2c\x74\x8b\x56\xe0\x3d\xa7\xf7\xb9\xb0\x17\xbb\x59\x53\x78\x1a\x55\xe7\x5e\x03\x4b\x43\xa4\xf8\x7e\x73\x72\xbf\x74\x77\xee\x44\xcd\x21\xee\x4b\x43\x33\x87\xb2\x16\x9a\x22\xde\xad\x36\xf2\xe3\x2d\xc5\xc0\x5c\xef\x54\xf0\x27\xe2\x9a\x65\xef\x04\x7c\x4e\xed\xc4\x1c\x5c\x96\xf1\x7a\xf2\x9c\x9c\xbc\xc8\x03\xda\xdf\x29\xc8\x2f\xfc\x19\x5c\x9f\x9e\x6c\x7d\x5d\xae\x4f\x8b\xdf\xa5\x1f\xc4\x55\xdd\x3b\xe3\x91\xf3\x3b\x50\xb5\xe6\x31\xc3\xaa\xfc\xeb\x7c\x1b\xfe\xe9\x5c\xf4\xa7\x73\xd1\xad\x9c\x8b\x7e\x33\xc1\xcd\xa3\x65\x05\x37\xdf\x2d\x16\xdc\x3c\xfa\xbc\xbe\x52\x7f\x8a\x45\x56\x10\x8b\x68\x4b\xd3\xba\x95\x72\xdb\x7b\xd0\xaf\xcd\xb1\xff\x37\xbf\xd6\xbc\x11\xa8\xf2\xaf\x2d\x99\xbe\xd1\x1f\xdf\x36\xed\xbd\x81\xb3\x20\x9d\xfc\xfa\x3a\xfb\x2f\x7d\xb0\xc5\xc0\x1a\x4a\x33\xb7\x37\x77\x2b\x56\xa1\xbc\xfb\x77\xb1\x74\xe3\xe5\xd5\x44\x9e\xe7\x7c\x32\xba\xd2\xe1\xc6\x16\xc6\xd0\xd1\xcf\xaf\x31\xbf\xd4\x9e\x09\x5b\x4f\xbe\x33\x6f\xb2\x79\xf9\xe0\xc7\x49\xa6\x1b\x7c\xbf\x65\xeb\xf3\xc1\x00\x12\xd9\xdb\xf4\x20\xa3\x4a\xf2\x7b\x2d\xf9\x81\x6c\xe7\xf6\xed\x57\xc9\x9f\x8f\x32\x9f\x58\x12\xf5\xe9\xa4\xd9\x18\x0f\x68\x0a\x75\x37\x92\xcd\x27\x1b\x5a\x73\xac\x9f\x23\x6a\xd5\x5e\xab\x0d\x57\xa8\xea\xa4\x52\x66\x54\xdf\x6f\xe9\x7e\x6c\xe5\x3d\xf0\xc9\xaf\xc8\xaf\x70\x18\x13\x9e\x8a\xb2\x14\x10\xae\xab\x5b\x88\xbe\xcc\x06\x3c\xbf\x8a\x83\x38\xb6\x31\x56\xe6\x82\xb2\x50\xba\x7b\x5b\x1b\x1b\x71\x50\x2f\x30\xc8\xeb\x22\x50\x30\x2a\x1d\x10\x76\x10\x42\x7a\x87\x29\x50\x6f\x35\x31\x0d\x63\xc9\x99\xe9\xa4\xab\xef\x1f\x6f\x6c\x9c\xd6\x40\xba\x8b\x89\x1d\xe0\xe1\x5b\x2c\x71\x94\x13\xde\x4f\xca\xab\x6d\xb6\xd1\xfd\xbe\x06\x48\x75\x66\xb6\xd1\x66\x4d\x93\xea\x14\x48\x3f\xdf\xd1\x46\x24\x24\xc4\x47\x72\x14\xfe\x99\x2b\xb4\xf7\xc0\xcf\x72\x3e\x99\x88\xdc\xd5\x1b\x24\xc5\x24\xe5\x57\x30\xa9\x34\xc9\x44\x47\x35\xb4\x13\xe3\x69\x72\x9e\x1d\x94\x62\x5c\x6c\x9b\x40\x6d\xb6\xec\x3f\xd3\xa2\x4c\x86\x57\xcf\x31\xf3\x7d\xb5\x9c\xf8\xb7\xfe\xff\x3d\xd9\xec\x0b\x27\x3b\x6c\xf4\x65\x3a\x1d\xdb\x23\x09\xff\xa4\xea\x4c\xd9\x10\x20\xdb\x4b\xd2\x18\x4d\x1e\x4e\xe4\x64\x9b\x3d\x09\x68\x86\x49\xb5\x11\x7e\xc7\x74\x4a\x9b\x21\x89\x39\xc2\x03\xbc\xb9\xb5\x0a\xa1\xf0\x40\x46\x45\xce\x8f\xe2\xdd\xc4\xeb\x6a\x52\x43\x56\x64\xd9\x85\x30\xa6\xf7\xdb\x55\xaa\x3d\xb9\x3c\x91\x47\x62\xdc\xac\x14\x98\x36\xd6\x64\x68\x36\x4a\x4a\x71\x3c\xe1\x7d\x01\xe4\x34\x1f\xf3\x74\x25\xb2\x79\x9b\x41\xb0\x0e\xdb\x6c\x55\xe7\xff\x33\x60\xee\x60\xe1\x32\x44\x47\x38\x90\xb3\xec\x8e\xc7\xb8\x45\x0d\x89\xfe\xb8\xca\x83\x83\x21\x3b\x53\xef\xf6\xb3\xb6\x4d\x01\x0f\xf9\xd0\x7b\x82\x19\xb2\xda\x25\x5a\x03\x43\xd1\x96\xce\x06\x1f\x8e\x92\x90\xba\xa5\x61\x40\x10\x6e\xc5\x95\x1a\xf3\x55\x35\x6a\xce\x70\x3a\x0c\x13\x5f\x43\x56\xab\x36\x4b\x4a\x3b\x7c\x48\xac\xce\x0b\xc6\x31\xec\x6e\x9a\x9c\xf3\x72\x9a\x13\xa5\x40\xd2\x5f\xa4\xfe\x00\xb3\xe5\xf7\xf3\x57\x73\xc5\x24\xec\x96\x07\xbd\x61\xfa\x75\xd3\xfe\x6e\x12\xaf\x1b\xf7\xaf\x79\x29\xcf\xd9\x4b\x99\xb3\x42\xe4\x17\x22\xc7\x64\x1e\xe8\xb8\xa9\x96\xbe\x2f\x33\xf5\x05\x6d\x07\xdb\x6c\x26\x58\x2a\x74\x4c\x74\x13\x80\xae\xe4\x3d\x84\x42\xf2\xdb\xdb\x68\x47\x64\x2f\x5c\xec\xba\x3f\x37\x24\xb2\x21\xea\x08\x00\x19\xb5\x67\xc0\x2e\x9d\xbe\x5d\xfe\x5c\xb6\x05\x78\xac\xb5\x8e\x26\xf9\xed\xb2\x6a\xc7\x08\x88\x15\x15\x97\x21\x04\x17\x62\xf1\xc6\x54\x54\x3b\xff\xde\xe2\xb6\x20\x91\xbf\x6e\x8c\x39\x46\x67\xa0\x83\x95\x9d\xb6\x16\x6a\x17\x34\xe3\xbf\x4c\x55\xc3\xa3\xcf\xa9\x8a\x98\x1b\xee\xf9\xbf\xe5\x94\xf5\x79\x66\x2e\x05\x76\x25\xa7\x39\x93\xb3\x4c\x67\xfe\x67\x87\xe5\x48\xe4\xb3\xa4\x10\x40\xb0\x86\x44\x6b\x0d\x4e\x37\xa3\x24\x1d\xd8\xc7\x2d\xe6\x7e\x20\x7a\xe4\xc0\x87\x1d\x7e\x1b\x7d\xa3\xfa\x07\xf5\x62\xf6\x8a\x87\xe4\xab\xc4\x36\xfc\xbe\x16\xad\x3b\x0b\xc6\x11\x2f\x0e\x67\x99\x61\x84\x50\xfe\x1f\xc0\x6b\xd1\xfc\x08\xb9\x9c\x51\xab\x71\x50\xcc\x42\x2e\x47\x53\x1b\xd3\x39\x8e\x78\x81\x7e\x38\xff\xd3\xe0\xd9\xd5\xff\x34\x20\x25\x2c\x9b\xf1\x82\x65\xb2\x74\x59\x20\x4b\x89\x8d\xbd\x01\x03\x84\x2e\x7b\xc7\x8b\xc2\x09\xee\x99\xcc\x19\xcf\xae\xb4\x2a\x16\x97\xb2\x41\x63\xe6\xd1\x44\xfd\xb7\xcb\xd3\xbf\x4c\x9a\xfe\xcf\x99\xa5\xff\x8f\x92\xa4\x7f\xc5\x1c\xfd\x77\x96\xa2\x1f\xdf\xb0\x83\x13\x71\x59\x46\x13\xde\x63\x84\x84\x48\xbe\x47\x71\x61\xd1\x87\xad\x92\xeb\x3e\x0c\xf9\xf2\xd7\xfa\x90\xf0\x91\xd4\x76\x91\xe8\xe9\xd6\x98\x21\x00\xa7\xbe\xfa\x29\xb5\x4c\x1f\x2d\x2f\x65\xbb\x8e\xca\x02\xf3\x69\x63\x9f\xad\x68\x72\x39\x0d\x33\x68\xad\x3e\xe9\xc5\xa8\xc9\x57\x86\xac\x42\x24\x47\x2a\x24\xa3\x51\x2b\xaf\x9e\x63\x0b\x33\x7b\x02\x98\x4a\x8a\x2f\xb2\x7f\x76\xcd\xa1\x26\x84\xe4\xb5\x79\x60\x8b\x66\xcb\x65\xc9\x25\xd1\x8f\x1d\x78\x0c\xed\x49\xc1\x41\x40\x1b\xf2\x61\x41\x12\x28\x0f\x93\xbc\x71\xfd\xe6\xb9\x9d\x3e\x43\x6a\xa7\xea\x06\xfe\x26\xc9\x93\x82\x8c\x43\x1e\x36\x78\xe9\x86\x6a\xf6\x51\x5f\xd4\xf8\xdf\xb7\x6c\xaf\x64\x7d\x91\x97\x90\x1d\x49\xc1\xe0\x19\x3c\x1a\x18\xa2\x4e\xd1\x66\x9c\xa5\x3c\x3f\x17\x39\x3e\xe3\x20\x6c\xca\x98\x5f\xc1\xde\xc3\xa5\x3d\x93\x2c\x4d\x32\x51\xb0\xd9\x28\x49\x05\xbe\x3e\xc6\x3c\x4d\x45\x4e\xbb\x71\x8d\x8b\x52\x3d\x10\xc1\x9f\x56\x73\x13\x05\x93\x99\x00\x20\x5d\xc6\x4e\x14\x59\xc5\x9c\x4d\xf0\x92\x54\xf3\x01\xa7\x33\xc5\x0c\x0c\x93\x2c\x29\xcd\x0b\x88\xa5\x52\x4e\xbc\x3e\x72\x99\x31\xd9\xef\x4f\x73\x7c\x98\x66\xac\x1c\xf1\x92\x15\x7d\x91\xf1\x3c\x91\x5d\x52\x77\xdd\xfe\x5d\xbf\xab\x77\x9b\xca\x84\xc6\xd6\xf1\x42\x2c\xbb\x68\xfd\x5b\xab\xa4\x32\x59\x2a\xe1\xc8\x0a\x69\x44\x8c\x6c\xc1\x55\x33\x5f\x6e\x94\x6c\xa4\x1f\x66\xdd\x50\x5f\xa2\xd1\xd2\x23\xf9\x44\xbc\x04\xe6\xf0\x02\xf1\x40\xc1\xa7\x1b\xa4\x1b\x71\x91\xe3\x4d\xfe\x90\x48\x88\x75\x60\xed\xfd\xfe\x8a\x30\xe2\xf4\xb2\x69\x42\x3e\x5b\x1a\x90\x7a\xc3\x3a\xdc\xb2\x6a\x9e\x8f\x3e\x1a\xdb\xd9\x25\x56\x3f\x60\x1d\x2b\xd9\x3d\xf4\x9a\xc0\xdf\x6a\xe2\x95\x04\x1e\xf1\xbc\x1d\x09\xaa\x2d\x4d\xe2\x72\x42\xac\x2c\x2e\xa8\xdb\xc5\xde\x88\x5e\x7e\x02\xad\xf2\x9c\x9f\xa1\xc0\xc0\x69\xb1\xa7\x0e\xbf\xb6\x97\x8f\xa1\x8d\x3a\x53\xdf\xe0\x0e\xff\xc3\x80\x48\x55\xec\xb5\x9f\xaa\xdc\x81\x9a\xb2\xb9\xe5\x23\x73\x76\x58\x5b\x3b\x69\xd3\xfa\x8e\xa3\xbf\xfb\xe2\x7f\x3f\xf0\xf7\x2a\xe1\xdc\x8b\x09\xcf\x96\x8f\xe7\xbe\xd8\x32\x13\x0f\xed\x0a\x59\x43\xa8\xd4\xba\xcd\xe2\x37\x5e\xab\x75\xeb\x40\xf0\x66\x1b\xa2\x91\xe0\xbd\xdf\x41\x0c\x75\xbb\xc5\xe4\x6b\x6b\x01\xc6\xdc\xc4\x98\x95\xa6\x7f\xd9\x5a\x35\xf1\xcc\x96\x5d\xcf\xf7\x0d\x05\x4e\x3d\x36\xa1\xb1\x36\x47\xe8\xf6\xf9\x24\x29\x21\x5a\xc0\xcb\x24\x2f\xca\xd7\xa2\x2c\x45\xde\x6a\xda\x03\xdf\x3a\x6d\x83\x5d\xd9\x2a\x49\x6a\x6e\xdf\xa9\x7a\x02\x1b\xf5\x5d\xe3\xb4\x6d\x2f\xa7\x2f\x3f\x0a\xa3\x77\x54\xa3\x30\xa4\xf1\x66\xa3\xe8\x7a\x0a\xef\x36\x12\xbd\x07\x0f\x10\x8f\x6e\x08\xd2\xdd\xbd\xee\x66\xf6\x33\x00\x6d\xb5\xa2\xe6\xd0\x06\x21\x0b\x93\x51\xcf\xcf\x6c\xe7\x2e\x38\x08\x52\xa2\x05\x4c\x90\x7c\xd0\x2f\x31\x52\xa2\x56\x98\x72\xa7\xdb\xd7\xf7\xa3\x6d\x50\x39\x10\xa6\x6f\x98\x38\x98\x1a\x06\xe6\x9d\xe4\xfd\xb2\xc1\x9e\xce\x33\xb0\xc0\x1b\xda\xdd\xdd\x2d\xb6\xed\x7e\xdc\x30\x21\x49\xbd\x95\x36\x0b\x2c\xb5\xbf\xab\x6a\x11\x19\xc8\x2f\xfa\xd3\xe2\x28\x99\x4c\x8c\x91\x6b\x94\x35\xa3\x06\xdd\x21\x1b\xa2\x27\x41\xbf\xbb\x5c\x14\x1e\x71\x6e\xf0\x3c\xe1\x1d\x7b\x77\xc7\xb3\xc7\x38\xf5\x91\xa7\xb1\x47\xda\x86\xcc\x88\x9f\xf1\xc6\xca\x5a\x2b\x72\x01\xd7\x70\xe9\x94\x2b\x74\xb4\x95\xcb\x25\x7a\x95\x69\x65\xbb\x4f\x78\x43\x3e\x12\x8e\x8f\x23\xbb\xae\x28\xcc\x53\x31\x2f\xc1\xc4\x32\xf9\x25\x62\x36\xcc\x6e\x45\x51\x8e\x72\xe3\xd4\x0d\x9e\x11\xb3\x31\x5c\x6e\x55\x02\x2e\x3e\x79\xf4\x75\x19\x1a\xa3\x2d\x9a\xba\x89\x5f\x26\x22\x1d\xd4\xc6\x11\x00\xbb\xb5\x05\xbd\xd9\xa0\x6d\xd8\x95\xc8\xa6\x63\x91\xf3\x1e\x3d\x3c\x10\xd9\x93\x46\x27\x6b\x86\xae\x1c\x35\xd6\x70\x76\x84\x2d\x97\x23\x01\x64\xa6\x5f\xc4\x44\x2e\xd8\xc3\xef\x7e\xd7\x3e\xcf\x7f\x3c\x2f\xe3\xcf\x60\x39\x3b\xe3\x79\x96\x64\xe7\x75\x60\xbf\x0b\x2b\xce\x35\x68\xc5\x2a\xce\x32\x34\x9b\x4c\x6b\x07\xfc\x68\xd3\xaf\x37\xd7\x84\x54\x55\xb0\xd5\x5f\xca\x1c\x12\x0b\xe5\xb2\x2e\x5c\xc8\xd6\xdf\x1e\xc5\x6a\xcf\xeb\x82\x54\xf3\x9a\xbe\x02\x16\xcd\x48\x38\xa3\x7d\x7d\x57\xd3\x60\x51\x77\xae\xa6\xcb\xf9\x02\x77\x65\x9d\x3b\xc4\xc6\x77\x41\xc5\xb9\x59\x61\xa0\xc6\x97\xa1\x2a\x71\xf3\x56\xb2\xa4\x2b\x59\xd4\xbc\xc5\xa0\xc4\xb7\xb3\xcc\x05\x20\x0b\xcc\x72\x57\x19\x94\x49\x77\x08\x1a\x9e\x5b\x8f\xce\x87\x76\x87\xc3\x8c\x5a\x23\x81\x20\x73\xa2\x29\x2c\x53\x8f\x8e\x82\x4d\x0b\x91\x43\x8c\xee\x61\x92\xa6\x6c\x28\xf3\x71\xc1\x86\x10\x75\xb8\xcd\x44\x31\x11\xfd\x84\xa7\xe9\x15\x93\x19\x1b\xcb\x5e\x92\x0a\x36\x10\x17\x49\x5f\x68\x4b\x25\xb0\x42\x50\x9c\x02\xe8\x57\x7b\x82\xf5\x65\x36\x9c\x16\x60\xfb\x91\x94\x8d\x82\x8d\x65\x2e\x58\x9a\x7c\x10\x8c\x67\x8c\x4f\x4b\xa9\xba\xe9\xfa\x6a\xd9\x54\xf0\x3c\x63\xbc\x27\xa7\x25\x5a\xeb\x94\x23\x14\x93\xf2\xbc\x4c\xfa\xa9\xb6\x39\x31\x81\x42\x07\xe2\x42\xa4\x12\x9e\x4b\xe7\x52\x9e\x03\x5f\x3f\x5e\x9f\x89\xde\x3a\xa6\x69\x2f\xd6\xb7\x36\x36\x1f\xaf\x6f\x3c\x59\x07\x11\xaa\x9c\x96\x1d\x9c\x4f\x47\x01\xee\x98\x31\x58\x05\xae\xfa\xa0\x70\x35\x15\xe5\xad\xec\xa4\x12\x20\x72\xc6\xd4\x08\x38\x6d\x31\x60\x83\x29\x08\x7e\x21\xd5\xb7\x7a\xd2\x31\x08\xb1\xde\xf5\x7a\x7f\xa9\xea\xde\x42\xf5\x6f\x12\xa7\x6d\xaf\x68\xb0\x11\xa0\xf2\x0d\xcd\x36\x7c\x28\x77\x63\xbc\xe1\xc1\x5c\x60\xc0\x71\x33\x23\x37\x85\xb7\x86\x1f\x46\x99\xa8\x1c\xc2\x2e\x9d\xc1\x1d\x73\x56\x35\xaa\xd1\xb5\x7f\x42\xe6\xe3\xae\xf0\xe4\x4e\x2c\xea\x82\x1e\x50\x7e\x44\x7a\x98\xa4\xfc\x4a\x0c\x58\x92\xa9\x43\x28\xf2\x5c\x42\x20\xc3\x92\x18\xbe\xc1\xc7\x15\x7a\x74\x6c\x09\xb5\x63\x84\xf5\xf3\x6f\xb4\xc8\x42\xfa\x15\x80\x50\xad\x64\xb7\x52\xbf\x9e\x25\xff\x20\x4c\xa8\xd3\xe1\x34\x4d\xd1\x60\x59\xed\x6c\x52\x16\x8a\x34\xa1\x04\xd2\x0d\xe5\xa6\xa6\x87\x28\xaf\x41\xed\x54\x1f\xad\xa5\x1d\xd0\x91\x9d\xdb\xaa\x07\x12\x2f\xbc\x1b\x9e\x43\x68\x7c\x37\xc7\x4f\x81\x8a\x58\x9b\x3d\x3f\x3e\xc6\xd3\x86\x14\x5f\x1f\x18\xba\x16\x95\xbd\x76\x6b\xf1\xfc\xc6\xc7\x34\x19\xd8\xb3\x99\xd4\x9c\xcd\xa4\xfe\xb4\xd4\x41\x8d\x4f\xa6\xbe\x07\xf5\xfd\xe6\x73\xa8\xe9\xad\x8e\xd6\x1c\xdc\xbc\xb7\x39\x27\x13\xa0\x82\xb8\xaf\xae\xcb\xd7\x46\x80\xbc\xda\x89\x9c\xd3\xe7\xdc\xf5\xbc\xd3\x9e\xe6\xae\xe5\xea\x3d\xfd\x58\x08\x64\x42\x2c\xbf\x54\x4a\x36\x51\x3b\xc8\x59\x2e\x86\x2e\xa8\xa9\xee\x3f\x03\x7f\x27\x4d\x8d\x68\xec\x0d\x3a\xe1\x23\x31\x5c\xc1\x4a\xd0\x59\x78\x56\x68\x8c\xb6\xf0\xfc\x03\x90\x97\x79\x26\xae\x37\x3b\x21\xe4\xfe\xe0\x40\xb6\x78\x2e\xb8\xe9\xc1\x5e\x9b\xa8\x32\x87\x5b\xb3\x28\x05\x07\x1a\x04\x0a\xff\xc9\x94\x0c\x63\x3c\x4d\xcb\x24\x4d\xb2\xf9\x71\x64\xfc\xfe\x41\xd9\xc2\xcb\x32\x4f\x7a\xd3\x72\x31\xe5\xc9\x56\x9d\x9f\x8d\xba\x33\x4c\xd4\xf8\x21\x42\xb8\xea\x01\xd9\x1c\x30\x65\xe0\xd9\xb9\x61\x39\x34\x53\x35\xe1\x39\x1f\xb3\x8f\x78\x12\xae\x19\x1a\x38\xa8\x5d\xc1\xbf\x0a\x39\xcd\xfb\x76\xac\x06\xf7\xd7\x6e\x61\x44\xab\x60\x17\x23\x99\x97\x6c\x94\x64\xa5\xcf\xa5\xb8\x6b\xbd\x27\x86\xea\x01\xa1\x3e\xa8\x87\x0a\x03\x7f\x24\x75\x04\xd1\xdc\xd0\x0e\x60\x92\xf2\xbe\x18\xc9\x74\x20\xea\xb9\x98\x25\x78\x33\x44\xb6\xa4\x20\xc3\xe1\x85\xb1\x09\x21\x3c\x9a\xf9\xb2\xc2\xae\xaf\x4a\x4f\x72\x29\xa3\x74\x44\x7d\x5f\x8d\x8c\x60\x74\x7f\xb5\x77\xb9\x9c\xc1\x53\x4f\xcf\x0e\x51\xc3\xa2\xb0\x8e\xf2\xaa\xa6\x5f\x88\x12\xc6\x91\xd3\x35\x56\xad\xef\xc0\xa8\xbc\xa6\x38\x83\x51\x86\x96\xbb\x6f\xf8\x65\x32\x9e\x8e\x59\x76\x87\x73\x78\xc3\x2f\xbf\xf4\x34\x8e\xd0\x3a\x88\xb3\x33\x94\xc6\x9c\x39\x72\x03\x16\x4a\x0a\x0f\xcc\x33\x31\xb8\xc8\xc0\x20\xd7\xb4\xe2\x85\xa5\x13\x70\x60\x45\x69\xb8\x59\x85\xc9\x60\xfe\xe9\x2f\xc0\x95\x9c\xb2\xf1\xb4\x28\x11\xd3\x14\x78\x13\xf5\x5b\x1f\x65\x54\xca\x28\xc0\xe6\x15\xe9\x16\x0b\xcb\xee\xe6\x55\x10\xcc\xdb\x75\x82\x05\xab\xdf\xcf\x90\x5d\xa4\x4a\x45\x03\x2e\x80\x1d\x94\x26\xf8\x59\x4f\x20\xd9\x48\x06\xec\xd5\xc9\x9b\xd7\x8f\x35\x85\x01\x93\x6b\x3b\x1a\xf5\x6b\x65\xe6\x6e\xde\xfb\xb1\x6d\x69\x05\x18\x0f\x73\xb8\xca\x21\x6b\xfc\x20\x76\xba\x2f\xe6\xbe\x2e\x3f\x13\x76\x2a\x22\x38\x10\x59\x21\xce\x98\xcc\xd9\x19\x3a\x07\x9e\xb5\xf1\x2a\xe4\x03\x88\xa2\x76\xa1\xf6\xb5\xcf\x53\xa6\xdd\x1a\x71\xba\x49\x01\xc6\x79\xe6\x65\x35\x88\x7a\xb2\x8d\x79\x7e\x9e\x2c\x8e\x2a\x87\x2e\xde\xac\x01\x23\x51\x7f\x68\x27\xc5\xd3\x16\xd8\x91\x93\x00\x66\x46\x73\x12\x86\x2e\xa3\x92\x1c\x1b\x37\x8c\x7e\xb4\x3e\xb0\x46\xe8\xe2\xd5\x82\x2f\x36\xce\x99\x3e\x0d\x2e\xc4\x99\xfe\x50\x09\x84\x36\x27\x08\x1a\x91\x18\xb8\x38\x68\xe4\xa3\x8b\x96\x66\x0d\xdd\xe2\x76\x6e\xf8\x66\x37\xa5\xf0\xcb\x14\x25\xae\x55\x62\xeb\xfb\xaf\x15\x57\xc1\xfb\x6c\x2a\x1f\xc4\x2b\x1f\x44\x2b\x3b\xbe\xdd\x0b\x00\xe7\x3e\x7b\x50\x8d\x14\x92\x40\xf4\x2a\x19\xa6\xd8\x87\x73\x24\x86\xa6\x82\x31\x85\x89\x58\xd9\xf9\x1c\xa0\x5f\x27\x3e\x47\xf7\xba\xf1\x87\xe4\xbe\xbb\x38\x04\x44\xd8\x8f\x35\xdd\xa7\x6a\xa5\xea\x28\x22\x65\xa6\x59\x44\xfc\x61\x9b\x45\xca\xac\x9b\x35\x31\x73\xac\xb1\x72\xb4\x94\xc6\xd4\x30\x1f\x4c\x05\x9d\x86\x45\x9b\x07\x5e\x4d\xec\x98\xdc\xfd\x69\x4a\xed\x17\x53\x25\xa3\xd3\xcb\xc8\x7c\x88\xa5\x63\xdc\xd0\x91\xf0\x66\xb6\x0e\xf9\x66\x47\x8f\x8c\x8d\x1b\x3c\xfe\x76\xc5\xb3\x82\x94\xcd\x0a\x5a\xf0\x86\x5f\x7a\x65\x6f\xf8\xa5\x29\x2e\x8c\x26\x85\xda\x57\x9a\x42\x72\xf9\xd8\x1a\xe4\x9b\x8d\x45\xe8\x9d\x60\xcf\x66\xf2\xa6\x71\x08\x29\x59\x52\xc4\xce\x12\x20\x30\xa0\xd4\xb4\xa6\x6a\x4c\x49\x88\x47\x68\x5c\x09\x54\x01\x0c\x2a\x07\x68\x56\x49\x8f\xaf\xfa\x72\x50\xf9\xe2\x4e\xad\x2d\xb7\xbf\xcc\x49\xf4\xac\x32\xfd\xc3\x65\x1b\xb9\x03\xa4\x3e\x39\xdc\xf7\x7f\x79\xed\x22\x98\x5e\xb1\x10\x35\xe8\x0b\xe6\x9e\x57\x13\x68\x67\xf1\x12\x6e\x08\x0d\x8c\x1a\x8b\x12\xcc\x02\x18\x88\x45\xf8\xe7\xac\x30\xff\xbe\xe1\x97\xce\xb2\x54\xfd\x45\x76\xbd\x6a\x50\x8a\xb9\x16\x09\x3d\xf3\xa9\xa0\x8d\xe6\xe8\xaf\xb9\xf5\xf2\xa2\x2d\xeb\xc2\x29\x86\xb7\xca\x76\x40\xc3\xd1\x50\xa4\x4d\x80\x39\xb7\x83\xa5\xa3\x1f\x82\xd5\x87\x56\xdf\xba\xbe\xef\xeb\x23\xf2\xe9\x13\x7b\x26\x65\x2a\x78\xd6\x34\x08\xd8\x6a\xb3\xc6\x1b\x5e\x8a\x3c\xe1\x69\xe7\xc7\x83\x6d\x76\x66\x4a\xce\x90\xad\xec\x21\xef\x6a\x9e\x99\x53\xc7\xc5\xda\x5b\xfa\xcc\x31\x05\xa8\xda\x39\xc3\xfe\xce\xba\x8d\x16\xdb\xa6\x96\xaa\x6a\x99\x11\x49\x6d\x83\x85\x41\x52\x51\x65\xec\xe2\xa2\xce\x5d\x5f\x5f\xd5\x53\xe5\x0c\x88\x32\x26\x60\x08\xc8\xbe\xc4\xee\x45\x5f\x37\x50\xbd\xe2\xab\x66\x4e\xf8\x9d\x88\x0f\x02\x82\x8b\xaf\x7e\x47\x67\xf1\xf1\xe5\xe8\x9e\x7d\xc8\x78\xe4\x0e\xd9\x57\x47\xd9\x35\x3b\x49\x28\x56\x32\xd8\x66\x86\x4f\xa0\x32\xb8\xf0\x02\x77\xe2\x2a\xff\x4a\x76\x2f\x7d\x9f\xcc\x7b\x0f\x70\xf2\x03\x1d\x15\x1c\x69\x69\xa1\xb1\xdf\x0a\x91\x49\xa9\xde\x7e\xb9\xd0\xa4\xe1\x8d\xb9\xcd\x2a\x57\xe5\x3c\x5b\x37\xad\x0b\xf1\xb8\x2c\xf7\xe0\x37\x7f\x99\x03\x19\xd8\xa8\x81\xb1\xaf\x26\x3a\x58\x85\x46\xbc\x60\x0f\x1e\x2c\x67\x92\x86\x78\x4d\xd8\x13\x33\x90\xda\x70\xac\xa3\x72\x9c\xbe\x54\xe3\x4e\x06\x6d\x3a\xbd\x80\x4d\x32\x9b\xe1\x48\x76\xcb\x63\xa8\xe0\x6f\xfd\x49\xd3\x85\x45\xf9\x8f\xcd\x90\xb5\x29\x42\x68\x98\x58\x3b\x62\x40\xac\xed\xf0\xc4\x5f\xb7\xe9\xad\xdc\x0a\xf9\x71\x1c\x1f\x0b\x9b\x61\x35\xc2\xb6\x2d\xbd\xd0\x81\xa9\xc6\xd2\xa3\x27\x4b\x1c\x63\x04\xaf\xdb\x31\x46\xaf\x55\xe5\x1d\x71\x42\x2e\xca\xad\x21\x9b\x37\x8a\x6f\xbb\x92\x71\x80\x0e\x8b\x6a\x3b\x8c\x18\x13\x3a\xb4\x07\x63\xc2\x36\x11\x0a\x58\xeb\xc2\x88\x79\xa1\x85\xf9\x79\x42\x9b\x3e\xfe\x2a\x2d\x0e\xa5\x4c\xcb\x64\x52\x6b\x6f\xf8\xe4\xb7\xb6\x37\xc4\xf1\x7d\x0d\xd6\x86\x4f\x7e\xd7\xd6\x86\x8b\x23\xd9\xfe\x71\x2c\x11\xbf\x7c\x48\xd2\x3f\xa3\xe8\xfe\x19\x45\xf7\x56\x51\x74\x3f\x8b\xf1\x2c\xfc\x7a\x01\x29\x40\xe3\xa6\xa1\x7e\xcd\xfd\x0b\x91\x95\xaf\x93\xa2\x14\x19\x08\x0f\xa2\x54\xe2\xd1\x9c\x36\x0b\x47\xe6\xd5\x26\xc7\xaf\x27\xa7\x59\xbf\xce\xa8\xf2\xf1\x56\xa5\xe6\xbc\x8e\x4c\x9d\x2f\x62\x42\xfc\x25\x02\xfb\xc2\xca\xbd\x93\xe0\xe0\x51\x77\x8d\x7f\xbf\x7a\xf4\xdc\xbe\x1c\x8f\x6b\xe3\xe7\x6e\xfe\xb0\x19\x54\x9c\x3b\x68\xa8\xe1\xa8\x5b\x2e\x6a\x4d\x50\x7f\xd8\xf0\xaa\xcd\x25\x7d\xb9\xb8\xfa\x52\xd1\x8d\xbf\xa6\xe0\xbf\x5f\xca\xbe\x98\xad\x7f\xcb\x44\x91\x26\x59\xd9\xd1\xcf\x7f\x06\xa8\xb6\x9e\xc9\x0e\x3c\xfb\x3b\x7d\x39\x9e\xb4\x59\x26\x3b\x8a\x97\xc8\x8b\xbe\xcc\x45\x67\xc0\xb3\xf3\x54\x40\xc6\xc5\xaf\x38\xa2\xf1\xda\xfa\x3a\xa8\xb6\xb9\x36\xdd\x70\xb2\x9e\x42\xb2\x19\x9a\x05\x9f\x8b\x12\x95\xdc\x22\x17\x59\x5f\x74\x75\x4c\xa0\xfc\x5c\x94\xcf\x9d\x9a\xe5\xe6\xe1\x81\x28\xa0\x25\x22\x05\xd1\xea\x96\x7b\x5e\x2e\x10\x10\x6d\xaa\x9d\xb7\x34\xa6\xae\x1a\x73\xc7\x87\xb5\x5a\xdc\x1d\x6f\x14\x2d\x1d\x7d\x07\xe1\xda\xb0\x41\xad\x25\xa3\x92\xf8\x6b\xf7\xfe\xe6\x11\x25\xf4\x3a\xb8\xc8\x10\x5d\xad\x01\xad\xf7\x71\xa3\x7d\x2f\x74\x77\xfb\x1c\xe9\xc6\xc2\x48\xb9\xb5\x31\x6d\x8d\x4f\x29\x5b\x5f\x67\x6f\xf8\x07\x81\xaa\x74\xe3\x0c\x08\x36\xee\x65\xce\xb3\x62\xc2\x73\xa3\xce\x35\x2e\x82\x13\xe9\x47\xe7\xfd\x55\x27\xc3\xc1\x40\xa4\xf8\xab\x5b\xe2\xe3\xac\xda\xee\x79\x2a\x0b\xe1\x1a\x43\xec\x53\x91\xc3\xed\x5e\x98\xb0\xd8\xb4\x95\x06\xb4\x6c\x64\xd9\x1e\xef\x7f\x38\xcf\xe5\x34\x1b\x6c\xeb\x6b\xc2\xd4\x79\xff\xfd\xc6\xc6\xa9\x59\x8e\x9e\xcc\x07\x22\x3f\xe2\x83\x64\x5a\x6c\x33\x1b\x5c\x57\xc7\x4e\x36\xf7\x96\xdd\x37\x90\xb6\x8d\x12\xa7\x6f\x1d\xca\xac\x7c\xc9\xc7\x49\x7a\x15\x89\xcc\xea\x0a\x69\xf5\x05\x61\x5c\x37\xbf\xb3\xa2\x94\x71\x92\xbd\x12\x73\x02\xef\xda\xf0\xe4\x6a\x87\x4d\xcd\xc6\xa3\xad\xc9\x65\x24\xd8\x73\x10\xd0\x17\x72\xce\xd5\x64\x9c\xc3\x6c\x73\x56\xb5\xa6\xb6\x7f\x28\xf3\xf1\x36\x6b\x14\x7d\x9e\x8a\xe6\x46\xcb\x2f\xd4\xa1\xd1\xf5\x94\xec\x97\x42\xcb\xa5\x9a\xef\x1b\x7a\x18\xa0\xee\x30\xe0\x1a\xa7\xd4\xff\xd5\x24\xe5\x8e\x81\x31\x65\x5d\xb0\xaa\x12\x45\xa9\x5b\x5d\xb7\x8c\xa8\x32\x1e\xe6\xb7\x18\x07\xd1\xd1\xcd\x1a\x6d\x6d\x45\x57\x6e\x8b\xae\xdc\xca\xeb\xb4\xcc\xde\x6e\xf8\xb1\x82\x35\x4e\x63\x1c\xe6\xe5\xf0\xda\x2e\xdf\x61\x9e\x80\xed\x01\x26\x2f\x62\x41\x3c\x6b\x63\x99\x50\x3f\xf8\x6f\xd9\x23\x2f\xad\xe0\x92\x8b\xe8\xe0\x6e\x7e\x67\xdb\xfa\xd3\xd1\xb1\xa2\x6f\x3a\x9f\x54\x0c\xbf\xaa\xe9\x40\x94\xee\x9b\x4e\x06\xe7\xc1\x7a\x10\xd4\xbb\x32\x9d\x79\xf3\x60\x1b\x37\x9b\x89\x9a\x87\x6d\xeb\xcf\xc4\x84\x16\xbf\xe5\x64\x4a\x39\xf9\xad\x67\x72\x38\x11\x59\x34\xd2\xfc\xdf\xea\xa9\xd6\x66\xeb\x56\x09\x34\x53\xde\x9f\xc7\x7e\x12\x73\x1f\xdc\xec\x8e\xc8\x40\xbd\xab\x7f\x15\x25\xcf\x4b\xf7\x1b\x54\xce\x62\x58\x9a\x5a\xf0\xb7\xad\xe3\xe5\x25\x33\x55\xf0\x87\xad\x83\x39\xcb\x14\x41\x95\x13\x53\x45\xfd\x69\x2b\xa8\x6d\x3a\xf5\x1e\x26\xc3\x34\x99\xd8\x79\x34\x27\xe6\x2f\x64\x26\x8a\x59\x52\xf6\x47\x2c\xfc\xcc\x58\x9f\x17\x82\xd1\x49\x6d\xfb\x7c\x91\x3f\xc3\x9d\x6a\x1b\x2c\xa8\x69\xa5\x00\xd2\x36\x66\x36\x61\x75\x37\xb5\xb0\x76\x1c\xbc\x81\xb3\x43\xb5\x98\x41\x25\x3b\xd5\x1d\x93\xf3\xff\xd6\x6e\x88\x5a\x54\x6e\x5f\x04\x31\x4b\xb8\x9b\x3a\xb5\xdd\x51\x14\x62\x92\xe4\xee\x56\x6d\xb7\x7f\xdb\xe8\xc7\xb5\xa9\x59\x7f\x8f\x81\xe9\x5f\x48\x08\x55\x9b\x8b\x62\x22\x33\x18\x1f\x78\x59\xa2\x89\x7a\x51\xf1\xa0\x3b\xc9\x93\xf3\x73\x91\xaf\xea\x5d\x59\xed\x65\x24\x2f\x44\xbe\xa0\x97\x57\xaa\xce\xad\x7a\x49\x65\x76\x8e\x29\x71\x59\x29\xa7\xfd\xd1\x82\x0e\x4f\x54\x9d\x15\xdd\xd6\x30\x2b\x8f\xcc\x8a\x51\x32\x61\x3d\x51\xce\x84\x76\x0d\xd0\x17\x06\x46\x5a\x24\x2f\x1b\xdc\xff\x4c\x94\x2c\xc1\x30\xc1\xfd\x54\xf0\x9c\x0d\x73\x39\x86\x7a\x2f\x0e\xdf\x68\xf3\xe3\x67\x57\x3a\x84\x70\x02\x20\x88\x9f\x71\xdb\x88\x01\xa6\x85\x60\x10\x13\x66\x20\x8a\x7e\x9e\xf4\xc4\xa0\x07\x46\xf0\x85\x4c\x2f\xd0\xc4\x9f\xf7\xfb\x42\xbd\xa0\x93\x34\x29\xaf\x58\x52\x14\xd4\x74\x7b\x45\x1f\xaf\x3a\x2f\x88\xd2\x12\x9f\xff\x9d\x8a\xa2\x04\x5b\xf2\x9e\x60\x7d\xf5\xd0\xba\x5b\x97\x88\x23\xec\x41\x3f\xe1\x96\x36\xd7\x5f\x71\xe0\x72\x62\x4c\xb6\xef\x76\xd8\xc8\x3c\x2c\x3d\xea\x30\x69\x84\x1e\x6c\x52\xb0\x62\x24\x67\xc4\xa8\x5c\xce\x83\x1b\x41\x5b\x0d\xa8\x4c\xca\x94\xda\x69\xab\x9f\x5f\xdc\xff\xe9\x46\x97\x42\xd8\x70\xe9\x1b\xe1\xae\x3d\xae\x6a\xef\x02\xf0\xe1\xb7\x0e\x16\xe3\x24\x4d\x13\xcc\xea\x04\x38\x36\xe3\x89\xf5\xc3\x51\x7b\x69\x2c\xbc\xf4\x16\x13\x1f\x62\xc5\xf7\xbe\x10\x20\x50\x99\x6b\x7f\x7e\xd3\xde\x47\x09\x3c\x36\xe3\xbd\xa7\x82\x5f\x88\x1b\xf4\xae\xf1\xcb\x72\x39\x6b\x9e\x4b\xd1\x18\xf2\x20\xfd\x9e\x58\xd9\xa5\x3d\x32\x50\xd1\x11\xf1\xc8\xc0\x82\xd5\x3d\x32\x2a\xf9\x04\xd4\x33\x66\x01\x04\x17\x22\xde\x9a\x4f\xd4\xcb\x81\xb7\x16\x08\x82\x11\x44\x55\x02\xbc\x15\x8a\x80\xb1\xe2\xb2\x01\xe3\xb7\x56\x8f\x18\xaf\x6d\x2d\x7e\x3f\x51\xe3\xb7\x6e\x11\x36\x5e\x9f\xc4\x55\x44\xd8\x7a\x7d\x56\x0c\x1f\xbf\x65\xff\x70\x01\xe4\xaf\xed\x27\x20\x3f\x27\xc9\x18\x94\x77\x10\x3e\xd5\xc6\xd3\x54\xa4\x21\x5a\x02\x8c\x56\xb4\x24\x29\x9e\x3b\x47\x9d\xa0\x6c\x62\x54\x84\xde\x57\xe2\x31\xe2\x43\x82\x53\xf1\x56\x66\xc0\xb1\xa1\xe8\x56\xa1\x39\x18\x54\x99\x4a\x18\xc8\xee\x48\x40\x38\xea\x5d\x23\x7b\xd0\x3a\x58\xb7\x70\x73\x63\xb3\x9b\x81\xd1\xc0\x87\x5e\x41\xf7\x17\xfd\x6f\xd1\x1f\x89\xc1\x34\x15\x3a\xb8\x77\x35\x64\xfc\xe6\x93\x27\xad\xca\xd8\x2c\x5b\xb0\x28\x02\x3f\x59\x09\xd3\xbf\xe7\x42\xe3\xc7\x75\xc4\x2b\xdc\xb6\x81\x18\x8e\xc8\xd0\x35\xc2\x38\xf3\xa6\x92\x79\x55\xa2\xc2\xa0\x6b\xb5\x28\x32\x4b\xaf\x9c\xed\x32\xf6\x6a\x3b\xc3\xee\x60\xb8\x5d\x74\x84\x00\x4e\x00\x6c\xee\xd9\x83\x07\x3e\xf0\xae\xcc\xe0\xdd\xe0\x47\x69\x8d\x56\x09\xc2\xee\x93\x68\x92\xf1\x1e\xc7\x72\x5a\x08\xf5\x5a\x88\xf6\xfa\x46\x95\x1e\x5e\xf8\xbb\x58\xed\xd9\x56\x8b\xf4\x1e\x8c\x82\xe0\x47\x14\x15\x1f\x3c\x60\x64\x88\xb0\xfc\x70\x2c\xf0\x5e\xa1\xc3\x40\x0a\x52\x09\x9a\x09\x6f\x02\x75\x88\xe4\xb4\x6c\x56\x8e\x9c\x1d\x1a\xc5\x53\xd4\x0f\x59\x7e\x81\xfd\x83\x6d\x44\xb0\xd6\x3b\xb7\x85\x28\x4d\x1f\xb1\x53\x40\x9a\xe5\x0e\x53\xab\xab\xd3\x66\x35\x63\x70\x87\x80\x89\xb4\x10\xd5\xd1\xd4\x83\xf5\x33\x2d\x78\x35\xe7\x1d\x15\xc8\xfe\x12\x21\x37\x91\x95\x20\x09\x0e\x90\x7f\x56\xac\x36\xc9\x68\x10\xdb\x6c\xe3\x8c\x43\x0e\x6e\x8c\x32\x54\x6b\x99\x24\x14\x10\x63\xb7\x6e\x8e\x1e\x51\x80\x27\xce\xff\x25\xaa\xd0\x4b\xa7\xf1\xe3\xf9\x2c\x9d\x2e\x38\x99\xaa\xc6\x8d\x48\x02\x60\x7b\x3d\x4d\x78\xad\x8a\x97\x20\x0a\x50\x6f\x31\x55\xb8\xe9\xa1\x75\x6c\xf6\x9d\x1f\x58\xc0\xa2\x85\x27\x96\x0c\x60\xc9\x13\x1b\x83\x5b\x73\x64\x17\x22\xf2\x12\x77\xba\x87\xc7\x37\x3d\xdf\x00\x69\xb5\x03\x0e\x63\x5f\x7c\xc2\xc9\x6a\xb4\xb1\x9b\x05\x67\x1c\xa6\x78\xac\x2e\x83\x9b\x2f\x8c\x22\x25\x3b\xbf\x13\x5a\x10\x9e\x2a\x37\xff\xf9\xa7\xcf\xd5\xbb\xd9\xe9\x73\xbc\xa8\x6d\x89\x74\x62\x22\xf2\x22\x29\x4a\xc7\xa6\xc5\x98\xd7\x85\xa7\xad\x8e\x99\x0b\x0f\x46\x9b\x6d\x8a\x47\x26\x30\x71\x0c\x15\xf6\xb3\xc1\xef\x99\xd4\x47\xb7\x6d\x3f\x1b\x2c\xb1\xb9\xfb\xd9\xe0\xce\xb6\x76\x49\xfa\x3b\x1f\x03\x56\xa3\xb7\x4b\x50\xc5\x36\xdb\x7c\xbc\xb1\xc1\x1e\x2e\x20\xb9\x37\x4e\x98\xb4\xb5\x4a\xc6\x24\xf3\x9c\x8f\x67\x4d\xfa\x39\x49\xd3\xa5\xd2\x26\xd9\x8a\x41\xfa\x9b\x6a\x2e\x1b\x97\x3d\x04\xbe\x05\x4f\x40\x4d\x47\x27\x1a\x45\xa9\xd5\xbf\xc3\xae\xfb\x95\x96\x5e\x9e\xa3\x75\x14\xa2\xdb\xc2\x36\x08\xc5\xc1\xa6\x27\xe3\x29\x06\xe5\xb3\xb5\x83\xd4\x56\x04\x3b\xc9\x1d\xe1\x10\x71\x71\x8a\xa0\xbb\xc8\x38\x75\x5b\x5f\x53\x9d\xdb\x48\x9f\xf5\x4f\x9f\x98\xff\xc5\x46\x3e\x60\x9f\x3e\xad\xd9\x45\xfb\xeb\xcb\x54\xce\x5e\x26\x97\x6f\xcc\x74\x83\x46\x25\x3f\x7f\xcb\xc7\xa2\x5b\xca\xd7\x72\x26\xf2\xe7\xbc\x10\xcd\x96\xe6\xe4\x20\x62\x7e\xa3\xcd\xde\xfb\x8e\xac\x57\x72\xca\x78\x2e\xac\xd2\xe2\x9c\x71\x17\x86\x01\x1b\x39\x92\xa4\x45\x66\x46\x46\xe5\xb4\x95\x8d\x36\x6b\xec\xb9\x76\x26\x64\xcb\x00\x95\x3b\xc3\x24\x17\x46\x8b\xa3\x6a\x3e\x9b\x96\x1e\x9c\x4c\x08\x14\x72\xa6\x60\xa8\xed\xe5\x9b\x54\xdd\x1a\x70\x08\x82\x06\xbd\x01\x09\x28\x48\xc4\x15\x5c\xf5\x3f\xd0\x58\x33\xce\xce\x06\xc9\xc5\x19\x03\x85\x55\x29\x27\x46\xcc\x6f\x64\x7c\x8d\xd3\xee\x7f\x64\x92\x35\x1b\xff\x93\x35\x5a\xd4\xfb\x76\x11\xc6\xa8\x43\xf4\x63\x36\x5e\xf6\xbc\xe9\xaa\x04\x6f\x3c\x7a\x07\xbb\xe7\xe4\x35\x71\xa2\x88\x49\xe4\xaa\x24\x91\x04\xfe\x47\x79\x49\xb7\xcf\xb3\xbe\x48\xe7\x64\x3e\xbb\x61\x6e\xac\x47\x9a\x3a\xac\x94\x03\x8b\x5c\x1c\x24\xbd\x55\x10\x3c\x84\xad\x9a\x2d\x6b\xb9\x4c\x59\x54\xe3\x59\x49\x9a\x45\x0b\xeb\xdb\x82\x1e\xb3\xae\x2d\x14\xd6\xb7\x85\x4b\xb2\xae\x2d\x14\xd2\xb6\xe4\xf9\x6f\x9b\xb8\x6f\x5e\x7e\x05\x92\x1f\x2b\xf1\xd2\x47\xb8\x9b\x89\xa4\xe2\xb2\xdf\xda\x01\xc9\xf4\xf7\x44\x7d\xf1\x6a\x64\xc1\x6b\xf6\x97\x18\xe7\x1c\x6d\xa1\x5f\xfa\x61\x83\xc3\xa0\x07\x10\x88\x93\xfc\x5c\xea\xa7\x57\xae\x4e\x34\x29\x57\x3f\xbd\x44\x1b\x7c\xe6\x19\xd8\x90\x50\x1a\x63\xeb\x03\x8b\xff\x61\xd9\x5f\x89\x28\xdf\x35\x20\x1f\x2d\x3f\x51\x5f\xdd\xff\x48\x2f\x3e\xf6\x94\x7d\xbc\x66\xdb\x91\x7a\x94\xd5\x7f\xa7\xed\x58\x43\x44\xa6\xf5\xbb\x41\x25\x3a\x13\x2c\x3a\xbc\x49\x5a\x32\xda\x85\xba\x00\x82\x5e\x40\x59\x42\x76\xf3\xc6\x99\xcf\xc2\x68\x1d\xf5\x59\xd0\xe8\x19\xac\x7e\x86\xe3\x55\xfd\x0c\x27\x07\x22\x7c\xd8\xd3\xe1\xc2\x7c\x38\x6c\x87\x40\x18\x13\x1c\x86\x8f\xb3\xde\x97\x43\x5d\x05\xb0\x0f\xfe\x50\x68\x66\x23\x67\x28\x44\x82\xfb\xc4\x2d\x5d\x25\xaf\xda\x84\x20\x21\xda\xaa\x0d\x8c\xad\x34\x5e\xba\x79\x99\x36\xd8\xd3\xc0\x92\x8a\x62\xaf\xba\x7a\xe8\x6f\x8a\x30\x12\x0f\x53\x95\x05\x7b\xea\x0e\xf1\x36\x4d\xbe\xa5\xbe\xc6\x1e\x97\xd6\xf6\xc8\x25\x12\xf2\x8a\xde\x37\x42\x6b\x84\xc6\x29\xdb\x65\x49\xc0\xd1\x45\x36\x83\xf2\x74\xf5\xcf\x40\x33\x89\xf0\x19\xbd\x33\xbf\x2d\xbe\xaf\xc2\x96\xfb\xd9\x20\x2a\x0b\xb8\x1f\x41\xa1\x79\xc3\xb3\x82\x63\xbf\x0f\x82\x1c\xf5\xc3\x73\xf2\xa5\x68\x63\xc0\xb5\x65\x06\x59\x91\xac\x47\xe5\xea\x37\x18\xe0\xb3\x74\x1a\x9f\x57\xfd\xd0\x82\xd7\xe7\x3b\x93\x1f\xcf\xbc\x40\x43\x79\x5c\x97\xc4\x1c\xc3\xff\x6e\xcb\x11\x57\xa1\x6b\xca\x1f\x63\x59\x47\x6a\xf1\x7b\x42\x64\x1e\xe3\x7a\x06\x0d\xce\xbc\xd0\x92\x2e\x73\xb9\x1c\xb2\xbf\x1b\x96\x73\xfd\x1f\xc0\x31\x1e\x89\xb1\x04\x9b\x9b\xa4\xd0\xb7\x8e\x6d\x8a\xc9\xbf\x6b\xc6\x84\x99\xc4\x65\x5e\xc7\x0e\xcf\x63\x2f\xc9\xc2\xaf\x98\xf5\x2a\xe2\xff\x58\xcd\x7e\xf5\x91\x95\xe0\x50\xb2\xcd\x1a\xb3\x24\x1b\xc8\x59\xa3\x0d\x17\x74\xa1\x8d\xcd\x03\xa6\x91\x66\x70\x5a\x3e\x5d\x23\xf1\x10\xec\xbe\xe1\x19\x3f\xf7\xd9\xa1\x65\x82\x45\x2c\x9b\x63\xaf\xef\xc2\x08\x99\x28\x23\xde\x75\xb5\x42\xe2\x44\x6f\xd8\xe8\x76\xd3\xf6\x2a\x84\xc9\x26\x19\x55\xc2\xe7\x62\xb8\x55\x4d\x56\xa8\x08\x2d\x2e\x38\x91\xc5\x0c\xb7\xba\xe4\x5b\x98\xba\x70\xa9\x5d\x0f\x3d\x92\xaa\x49\x12\xf5\x5b\xc6\x1a\xff\xd4\x1f\xdd\x48\xe0\x92\x54\x66\xb6\x2b\xda\xb0\xed\xd3\x12\x85\xbb\x5e\x71\x65\x14\xcb\x27\x75\xd4\x82\x97\x47\x54\x41\x0c\x48\x60\x9c\x86\xbb\xc3\x24\x1b\xbc\x38\x7c\x03\x46\x3a\x08\x26\x5c\x3a\xf5\x1f\x59\xd9\xae\xea\x2f\x80\x1a\x69\x73\x1d\x7c\xb9\x0e\xea\xd0\xf2\x3b\xc1\x2d\xfc\xc7\x5f\xac\x05\x41\x7a\xcc\x7f\xc4\xda\x26\xca\xd0\x32\x23\x0c\x2b\xf6\x33\x1d\x4a\x29\x64\xe0\xd9\xaa\xf9\x3f\x51\x1b\xbe\x4a\x02\x50\xe2\x94\xd5\x66\xf7\xd5\x00\x5a\xed\x90\xc3\x6d\xf9\x6b\xdc\xa6\x1c\x6c\x15\x9f\x57\x4c\x0e\xfa\x88\x18\x1f\x2c\xce\x0e\x1a\xa4\x22\x5d\x61\x5b\x23\xa9\x5d\x59\x24\xdd\xaa\x1f\x4f\xca\x9b\x97\x4e\x0a\x88\x77\x44\x05\x90\x49\x0f\x38\x4a\x06\x03\x91\x35\xb6\x71\x31\xab\xb5\x56\xda\xcf\xd2\x48\x0c\x97\xdf\x50\xe2\x29\xd1\x66\x7a\x3f\x6d\x8a\x4e\x33\xf8\x25\xb3\x74\x5a\xbc\xed\x16\x93\x34\x29\x9b\x8d\x4e\xa3\xf5\x7e\xe3\xb4\x75\xda\x0a\x77\x29\x9c\x27\xdc\xad\xde\x37\xda\x84\x64\x70\xd5\x7f\xd5\xe7\x0d\xc4\x11\x2f\xce\x1d\xa8\x6d\x76\xea\xf3\x07\xfa\xc6\xd3\x36\xfa\x4f\xd4\xe8\xb9\xa6\x54\x5b\x28\xdb\x52\x6a\x1f\x08\x8e\x76\xd4\x64\x0f\x3e\x10\x22\x60\xcc\xe6\xee\x24\x7f\xa1\x41\x42\x88\x3f\x77\x82\x66\x69\x5a\x83\xde\x74\xb6\x5a\x9f\x23\x54\xd1\xf7\x5f\x57\xa8\x22\xb3\x92\x7b\x79\x2e\x67\xc4\x8f\xd6\x06\x3d\x30\x1f\xf0\x1a\x26\x1f\x34\xb7\x13\x0b\x77\xa3\x8b\xea\x22\x76\x3c\x79\xe2\xc2\xb1\xe8\xaa\xf3\x22\x76\x18\x68\x2e\xb0\x12\x0c\xa5\x1e\xfa\xdf\x82\x9a\xf3\x80\x6b\x58\xb6\x05\xce\xbb\x16\xf6\xf7\x1b\x41\xcd\x79\xb0\x35\x2c\xdb\x02\xd6\xb8\x1e\x74\x50\x71\x1e\x64\x84\xf4\x45\xa2\x27\x54\xb7\xdb\xee\x99\x0b\x1c\x55\x41\x12\xb3\xf2\xd5\x2a\x2e\x9a\x86\x5e\xc0\x6a\x15\x83\x8b\x7a\x1d\x5c\x85\xf0\x2c\xfd\xf0\x75\x9d\xa5\x4a\xfc\x1d\x4f\x2b\xaa\xb6\xc1\xfe\xf2\x3a\x49\x44\xd1\x44\x5e\xae\xcd\xcc\x63\xd2\x99\x88\x26\x68\xf2\x99\xb0\xbf\x9b\x78\xc6\x60\x22\xba\xc3\x12\x30\xfa\x04\xbe\x1b\x25\x16\x93\xd2\x85\x84\x7e\x9f\x9c\xee\x90\xcf\x5d\x17\x39\x8c\xed\xd6\x7c\xff\xf4\x49\x9b\x2b\xd0\xf2\xbe\xcc\x86\xc9\xf9\xd4\xb4\x04\xb5\x3d\x3c\x93\xbf\x81\xd9\x7f\xc3\x92\x8c\x54\x6f\xd1\xa6\xb3\x3c\x29\xbd\x66\xf1\x05\x36\x33\x27\x2d\x3f\x88\x2b\xfa\xbb\xb5\xc3\xae\xd9\xb5\xc1\x61\xb7\xa2\x44\xb9\x08\x0b\x57\x4a\x2d\xd8\x2b\x4a\x5e\x26\xfd\x77\x66\x29\xd5\x70\x5d\x71\xab\xba\xf8\x04\x50\x77\x62\xec\x53\x29\xc8\x16\xce\xd9\x83\x3b\x0f\x8a\x3f\x84\x1d\x33\x74\x52\x63\x07\x8e\x57\xf3\xf3\x06\x21\xa2\x01\x03\xe3\x46\xd7\x95\x9a\xf3\x80\xdb\x4a\x5f\x84\xf0\xb8\x0e\x6a\x44\xaf\xaa\x8b\x36\xfb\x20\xae\x0a\x73\x0c\x4a\x43\x7e\x3e\x5e\xef\xd0\x03\x94\xc0\x00\x0c\x2a\xa8\x16\xdd\x24\x1b\x88\xcb\xc3\x61\x33\x69\xb1\x7f\xec\xb2\x8d\x16\xa8\x60\x93\xcc\x60\xf7\x7d\x8d\xab\x16\x1b\xba\x23\x5e\x1c\xce\x32\x83\xb5\x78\xfb\xc3\x00\x92\x16\x6d\x8c\x43\x78\x9f\x9c\xb2\x5d\xd5\x27\x1c\x43\x8b\xba\x58\x18\xcc\xce\xb7\x1c\x6f\x26\x59\x51\xf2\xac\x2f\xda\x14\x5b\xcc\xd0\xef\xdb\x62\x66\xfe\x90\x43\xaf\xa2\xaa\x59\x8e\x14\xfd\xcc\xc4\x0c\x52\x22\xec\xe7\xb9\xcc\x9b\xdf\x3c\xe7\x19\x68\x9a\x79\x9a\xda\xd0\x2c\xbc\x60\xdc\x9e\xa7\x6f\xf0\x98\xd1\xa1\xd5\x6a\xf1\x9b\x85\x48\x87\x6d\x00\x66\x87\xa6\x3e\xf9\xbd\x1f\x19\x6f\x4e\x3d\x04\x10\x2e\x8d\x78\x91\x35\x4a\x94\x58\x25\x59\x52\x26\x3c\x4d\x0a\x31\x60\x1d\x56\x4c\x27\xa0\x75\xa3\x35\x54\x0f\x62\x80\x43\xd3\x8b\x08\x33\x78\xf0\xc0\x09\xea\xd4\xef\xdd\xdd\x5d\xf6\x0d\xe2\xc9\x37\x8a\x90\x55\xca\xdc\x2c\xd9\x53\xfc\x0c\xe9\xc7\x87\xc1\x66\x18\x27\x82\x66\x31\xed\x01\x09\x6f\xe3\xb0\xe0\x6f\x33\x55\x0d\xdc\x15\xa0\x70\xcf\x76\xa1\x46\x17\x14\x66\x53\x5c\xa9\xe8\xd6\x1c\xab\xba\xea\xbe\xca\x45\x51\xa8\x61\x40\x20\x65\x91\x80\xfa\xa1\x27\xa0\x31\x83\x54\x11\xa6\x8b\x36\x68\x93\xbf\x61\x0f\x59\x65\x2c\xb0\x54\x66\xf4\x0e\x7f\xd9\xae\x21\xbf\x3a\xb8\x04\x19\xa0\x37\x5c\x4a\x00\x3f\x2a\xc4\x36\x3b\xbf\x0d\x87\x0c\x6e\x3c\xb7\x38\x34\x20\xa5\xb6\x5f\x37\x64\x5f\x47\xa8\x64\xf4\x06\x31\x4c\x36\xbb\x36\x14\x95\x2c\xae\x1e\x5f\xe1\xc7\xf3\x7b\x1a\xff\x5e\xb3\x41\x6e\x6c\xc4\xfb\x60\x97\x54\xb1\x11\xa1\x1c\x3f\x43\x24\x5b\x41\x80\x21\x87\x0e\x46\xb4\xc7\x7e\xa9\x8b\x22\xa4\x6b\x2c\xeb\x42\xe2\x79\x90\x84\x34\x00\x2b\x68\x88\xbf\x23\x9f\x11\x50\xe5\xd5\xd2\x0c\xdf\x49\x44\xcf\xce\x77\x12\xd1\x5b\xed\xbb\x89\x98\xc5\x5f\xd5\x39\xc4\xfc\xdb\xfd\xa5\x10\x25\xf2\xa3\x3a\xbe\x97\xdb\x71\x5f\xb4\xa2\xab\x97\xb4\xae\x13\xaa\x5c\x5b\x78\xe7\xb5\xf0\x2a\xd1\x8f\x2a\x20\x2b\xf6\x52\x73\x56\x8c\x60\x8a\x33\x90\xa2\x0c\xa6\xc3\x4b\xcf\x24\xca\xc8\x4b\x9f\xcb\xac\x84\xa0\xfb\x51\x33\x87\xa0\x56\x75\xec\x44\xa3\x01\xac\xba\xee\x6c\xdb\x13\xfa\x78\x6b\xab\xc5\xea\xfe\x82\x53\xd9\xc6\x79\xac\xb6\xf7\xd1\x99\x2f\x19\x1d\xc1\x5d\x1a\x71\xcc\x37\xd5\x28\xf9\x39\x51\xb6\xf3\xf3\x98\x19\xc7\x7c\x13\x8e\x5c\x14\x4e\xfc\x5d\xc7\xb7\x38\x45\x71\xc9\xcf\xbd\xec\x0e\xa7\x2d\xdf\x10\x92\x9f\xc3\xed\x81\x46\xb9\x15\xbf\x0b\x22\x34\xf6\x25\x77\x2d\xd5\xb2\xed\x06\xe3\x64\xd9\xf5\x16\xd2\xe6\x76\xb5\x06\x99\x74\x17\xac\x5c\xc9\x09\x96\x34\x32\x38\xc1\x92\x2f\x4f\x32\xc7\xbb\x4f\x30\xcc\xb0\xa2\xaa\xd3\x00\xa3\x08\x03\x6a\xe5\x53\xb8\x7c\xc4\x47\x75\xed\x7a\xc7\xc2\xa5\xac\xad\x82\x57\xf2\xf3\x1a\x28\x24\x43\x52\xa4\xd8\xa6\x47\x8a\x94\xf5\xa4\x4c\x31\xd7\x90\xe9\x35\x22\x1d\x83\x8e\x41\x34\x1a\x17\x4c\xd9\x75\x0a\x1f\xaf\x7f\xfb\x1a\x1f\xaf\x5a\x2c\xef\xb8\x05\x5e\x14\xc9\x39\x98\xe5\x39\x22\x87\xc4\xac\xf2\x48\xdd\xc4\x47\x6a\x78\x2f\x79\x0f\x55\xed\x6b\x4e\xef\x18\xc5\x21\x5b\x38\xea\x8e\x4a\x32\x5d\xcd\xf0\x5b\x4b\xf1\xe2\xd8\x04\xde\x03\xc8\x04\x23\x23\xae\xaf\x34\x2c\x85\x5f\xf8\x98\xac\xf2\xe4\x7f\xbe\xc4\xfe\x98\x2f\x31\x17\x7a\x92\xde\xe4\xf8\xc5\x64\xe7\xe9\x23\x01\x73\x89\xc5\xb4\x39\x51\x9f\xa4\x25\xd1\x97\x82\x9f\x7f\x80\x31\x5a\xa5\xda\x2a\xb0\x9e\x02\x3a\xe2\x0c\xa8\x2a\xc0\x92\x2c\x13\xb9\x9f\x1d\x0b\x3f\x84\x49\x11\x6a\x93\x94\x2d\x75\x41\x39\x43\x26\x33\x00\xcc\xff\x83\x7d\xc5\x6e\x2c\x30\x02\xa2\x24\x9d\xed\x9a\x45\xeb\x7a\xdf\x6d\x6d\xdc\x01\x9c\x8b\x5d\x75\xfb\xd1\x63\xcc\x3c\x00\x5d\x8f\xb7\xa0\xca\x51\xf2\x34\x73\xeb\xe4\xc5\x76\x20\x9e\x76\xba\x02\x6d\xaf\x03\x5c\xad\xc5\x9d\x10\xe2\x90\xaa\x4a\xef\x8f\xa8\xc0\x73\xd3\xbb\xf6\xa2\x82\x1a\x78\xcd\x8f\xb4\xdd\x36\xfd\x41\x2e\xee\x6d\xb2\x5f\xd7\x8e\x05\x04\x9b\x26\xb3\x35\x76\x37\x35\xed\x06\x6d\x96\x6d\xd6\xaa\x4c\xc8\x43\xbe\xd0\xad\xc2\x87\xda\x45\x56\xdd\xce\x05\x06\x40\x19\x87\xa0\x3a\x41\x4f\xbf\x0d\xe1\x1b\xea\x79\x16\x87\xed\x01\x5c\x8f\x7d\x51\x3b\x84\xfb\xdf\xed\xdf\x1d\x5b\x61\x40\x86\x6c\x85\x1d\xc8\x8d\x98\x0b\x85\x5c\x71\xd6\x42\x21\x12\x1a\x1b\x9a\x35\x8b\x77\x80\x61\x55\x68\xec\xab\xcf\x30\x8c\xba\x9c\x1d\x48\x23\x43\xc6\xe5\xfb\x8d\x3f\x19\x97\xaf\x92\x71\xf9\x53\xf1\xf0\xa7\xe2\xe1\x0f\xa0\x78\xd0\xc9\x26\xe6\xc5\xe4\xff\x7e\x33\xa8\x38\x17\x38\x86\xc8\xf8\xb2\x8c\x74\x80\x8a\x86\x7f\x6e\x23\x75\x23\xfc\x31\xe1\x98\xe3\x58\xec\x9a\x7e\xf4\x93\xbb\x55\x93\x05\x45\x44\xb1\xa1\xb8\x16\x04\xb3\xe6\x8a\x07\xb6\x59\xd3\x21\x80\x49\x18\x68\xd9\xfb\xcf\x1f\xe0\x6d\xf0\xa7\x96\xe6\x4f\x2d\xcd\x9f\x5a\x9a\xdf\x50\x4b\x93\x49\xe9\x45\x00\x53\xbf\x9b\x5e\x14\x7f\xb5\xec\x2e\x2a\xb1\xb5\x2e\x59\x46\xa9\xa3\x8d\x53\xeb\x75\x3a\x58\xe1\x0e\x55\x3a\xef\xec\x5d\xf3\x7f\x50\xa3\xa3\x4d\x7e\x97\x50\xe8\xe8\x65\xb8\xa9\x3e\xa7\x12\xea\x0b\x14\x0e\x60\x2c\xb4\x9c\x82\x87\x93\xaa\x77\xa2\xdf\x89\x8a\x3a\xba\x1e\x98\x66\x2b\xd2\xcb\xe1\x70\x58\x88\xd2\x67\xd7\x07\xbc\xe4\x95\x6e\xf4\x3a\xaa\x4b\x11\x2a\x74\x25\xb6\x6c\x75\xc7\x7c\x42\xbc\xfb\xd5\x23\xa2\x2a\xd4\xa7\x2d\xde\x3b\x04\x70\xf6\xdf\x6e\x50\x49\xf1\x82\x97\xfc\x45\x92\x97\x57\x73\x46\x65\x63\x8e\x68\x87\x2b\xbf\xd4\xf6\xfb\xff\x1c\x1f\xbe\xd5\x12\xf6\x64\x78\xd5\xac\xcc\xbb\x0a\xa3\x05\x74\x78\x61\x3b\xac\xbb\x48\x97\x41\x63\x8c\x5c\x07\xf3\x9c\x42\xa0\x33\x70\xa4\x7f\x23\x07\xc9\x30\x01\xaa\x61\x40\x08\x63\x51\x6e\x92\x2c\xaa\xff\x20\xe5\xc5\x36\xfb\xdb\x86\xcd\x09\x31\xcc\x88\xc2\x69\x98\x35\xc3\x65\x70\xcb\x44\xd7\x55\x8f\xbe\x1a\xf7\x86\x06\x7d\x51\x75\xb6\xe1\xff\x3d\x23\xfd\xeb\xd8\xd6\xd6\xcd\x51\x9d\x3a\x40\x48\xb0\x89\xad\xc1\x63\x78\xc5\xa9\x6e\x76\x59\xb8\x1b\x56\x17\xb5\xbe\xce\x0e\x86\x86\xb6\x26\x70\xef\x23\x63\x53\x26\xbc\x14\x83\x36\x1b\x25\x03\x8c\xd7\x8b\x07\x40\x8b\x74\x5c\xeb\x52\x32\x0e\x9e\x3f\xc3\x94\x17\x23\x26\x87\x6c\x9a\x81\x5d\xee\x00\xa5\x84\x59\x59\x0d\x91\x63\x62\xd3\x41\x48\x80\x1a\x04\xa3\x4b\x38\x91\x26\xa1\x46\x83\xf7\x0a\x99\x4e\x4b\xe1\x19\x99\x47\x33\xa5\xf8\x0e\xc1\x26\x1c\xbe\x5b\xee\x8a\xa3\x12\xe6\x42\xe3\x25\xff\xab\x3e\x4f\x7f\xb5\x4f\x11\x7a\xca\x8c\x27\x01\x55\x2e\xa2\xab\x71\xa4\x6d\xb7\xf4\xfd\x49\x20\x93\x43\x4d\x55\x55\xd6\x8e\xcc\xba\xae\xbe\x29\x77\xfe\x9a\x86\x70\x59\x71\xe1\x5a\x75\x05\xcd\x5f\x66\xf6\x6d\x9c\x5c\x61\x92\x76\xd5\xe0\x19\xf5\x45\x9e\x43\x33\xef\xdf\x0f\x31\x8d\x3d\xad\x20\x9f\xf3\x62\x66\xdb\xd4\xc2\xb8\xa6\xeb\x57\xc9\x22\x4a\x1d\xe9\xf5\xc1\x83\x6a\xb7\x80\xca\x4f\x59\xa3\xb1\xa0\x5b\xb8\x6e\xe6\x1d\x2c\x82\xc9\xa4\x4b\x85\xcc\x95\x3e\x0d\xd2\xc0\xbd\x14\x43\xf3\xeb\x5a\x52\x67\x43\x13\xfc\x15\xe0\xfd\xd5\xe2\x40\xe4\x3c\xfb\xfd\xf8\x2e\x07\x1a\x3b\x63\x90\x42\xf4\x74\x08\x1a\xad\xad\x0a\x49\x84\x1d\x33\x05\xd5\xc3\xb6\xfa\xbf\x36\x34\xdf\x46\x20\xd7\x11\xda\x75\x07\x66\x11\x86\xb3\xfb\x12\x56\x11\x15\x73\x08\xcb\x88\x10\x6b\x08\xfb\x2d\x30\x86\x70\x58\x44\x8c\x21\xdc\xc7\x15\x8c\x21\xee\x22\x94\x0b\xbd\x1a\x0d\xef\xbb\x54\x87\x18\x36\x74\x89\x1e\x75\x7c\xd1\x94\x1b\xf5\x84\x77\x5c\xec\x67\x72\xf8\x15\x3f\xe0\xac\x35\x48\xc1\xa7\x4f\xcc\xd5\xf7\x1c\xc1\xc2\x36\x5e\x21\x3d\x5e\xf5\xf3\x0d\x7d\x82\xe9\x7d\xf4\xe0\x01\xe9\xd8\x0b\x52\x45\xfa\xb4\x1a\x8b\x4a\x77\xcb\x45\x5c\xfd\x9c\x91\x57\x70\x1c\x03\x51\x94\xb9\xbc\x5a\xb8\xcf\xde\xfa\xd4\x74\x18\xac\xe1\x32\x3d\xd1\x85\x0d\x1d\xdc\xf0\x2b\x1e\xe8\xea\xbe\xd4\x8d\x93\xd6\xaf\x1b\xa7\x0f\x73\x15\xdb\xa0\xc9\x92\x71\x36\x7c\x4c\x74\x71\x4c\xe8\x67\x2f\x7c\xcc\x58\xb3\x9f\x15\x1d\x1e\xc1\x26\x5b\x87\xba\x0b\xc2\xbb\x49\xd3\x8e\x8f\x8e\x65\xd5\x81\x02\xdd\x98\x08\xab\xbb\xcd\x6a\xb9\x5f\xf2\x22\xa8\xec\x8f\x7d\x2f\xd1\x4d\xb2\x63\xc2\xeb\x84\x70\xcf\xcc\xf3\xc9\xf5\x21\xcc\x61\xad\xbc\x43\xb6\x0b\xe2\x17\x23\xbe\x35\x5a\xa9\x66\xe4\x7d\xd6\x6c\xe9\xa5\xfa\x05\xf5\x5c\x84\x3e\xcf\xf5\x20\x0d\x7c\x47\xbd\x9f\xed\xea\x2c\xb7\xdd\x9f\xd5\xa5\x5a\x5f\x67\xe6\x3c\x33\x9e\xe9\x15\x57\x5c\xef\x98\x7f\x10\xac\x98\x62\xd4\xa7\xfc\xaa\x1c\x25\xd9\xb9\xa2\xfb\x85\x65\xb1\x80\x05\xce\x73\xd1\x27\xec\x32\x1f\x42\xf2\x2b\xa1\x2a\x53\x46\x3b\xb2\x50\x35\x74\x24\x76\x3e\xbc\x63\x58\x77\x40\x82\xb3\xea\x91\x67\xda\x6f\x2d\x5d\xd3\x00\x96\x38\xb0\x37\x8c\xc1\xb4\x55\x1f\x83\x69\xab\x3e\x08\x53\xc5\x0a\x63\xab\x6a\xaa\xc1\x7c\x0b\x0b\x53\x2f\xb4\xb1\x88\x53\x83\xad\x55\xc8\xc1\x56\xb7\x06\xdd\x98\x4f\x0e\x74\x65\x77\xfc\xe9\x94\x42\x83\xc4\xad\xdb\x5a\x24\x6e\xcd\x35\xf9\xf0\x82\xc1\x78\xc3\x57\x1f\xec\x10\xeb\xec\x19\x9d\x85\x48\x60\xf3\x61\x3f\x56\xfc\x9c\x75\xc8\x41\x38\xd7\x15\xf7\xe6\x55\xac\x3d\x58\x8d\xc5\x07\xab\x72\x56\x74\xa0\x86\xbb\x8f\xbd\xa6\x1d\x7e\xbb\xfa\xef\xbc\x28\x38\xf1\x97\x51\xac\x9d\x7e\xbb\x44\x5e\x34\xcd\xd6\xdc\xc0\x98\xf5\xf3\x25\xba\xaf\x77\x41\xc8\x4b\x32\x5e\x8d\x16\xcd\x5f\xfc\xdf\x1f\x3d\xf4\x19\x6e\xbb\x2d\xa2\x88\x55\xe0\xcd\x43\x96\xca\xad\x69\xc5\xd9\xda\xeb\xa2\xcd\x1a\xea\xb9\xd0\xa1\x18\x15\xac\x60\x6b\x39\x08\x97\x1d\x39\x2d\x3b\x72\xd8\xe9\xc9\x69\x36\xe0\x79\x02\x81\x96\xdc\xaa\xe2\x3b\xc2\x36\x23\xdb\x5e\x31\xc7\xf1\xde\xd4\x24\xdd\x05\xed\x35\x76\xac\x88\x89\x8e\xb7\x3a\x1e\x59\xde\x66\x21\x07\x39\x87\x86\xbb\x65\xac\x32\xa3\x2b\x58\xfe\xd0\x9b\x50\xef\x55\xbc\x22\x3e\xeb\xdb\x74\x27\x49\x98\x80\x70\xab\xb6\xc3\xad\x0a\xab\xc6\xf6\x64\x9b\xec\x49\x0d\xa3\xb1\x8c\x75\x12\xab\xb3\x50\xb2\x08\x5a\xfb\x4e\xae\xb7\x54\xaa\xb6\x0d\x24\x25\xb7\xb5\x58\x62\x71\x03\x6a\x3c\xe5\x75\xf6\xd3\x5a\x98\x7e\x87\x26\x4e\x06\xe2\x5c\x83\xec\xd5\xe1\x7d\xad\x16\x53\x34\x59\x4f\xdd\x38\x9a\x21\x7f\xe9\xee\xf0\x02\xba\x0a\x78\xc4\x3a\x23\x71\x55\x95\x30\x8a\xf5\x4b\xf8\x45\x4c\xb9\xde\x19\x46\xac\x62\xab\x4e\xf6\xc6\x06\xf3\x88\x44\x58\x88\xcc\xdc\xc8\xc1\xc9\x2c\x3f\x5e\xc7\x0d\xde\x0d\x5e\x87\x66\x63\x9b\xf3\xcc\xc6\x9c\x19\x87\x06\xf8\xcb\x2f\xcb\x9a\x90\xc5\xcd\x22\xa2\x00\x03\x63\x32\x6a\x4a\x06\xf4\x68\x4e\xbc\x07\x37\xe4\xf3\x54\xf6\x78\xda\x62\x1f\xd7\xbf\xfd\xf6\xfe\x1a\xfb\x96\xfd\xd7\x30\x49\x21\x80\xda\x45\x22\x66\xec\xbf\x93\xfe\x07\x5e\x14\x2c\x4d\x7a\x39\xcf\x21\xf0\x16\x52\x0d\x48\xa5\x07\xab\xad\xcf\x5a\xc1\x32\xc1\x21\x70\x56\x92\x93\xcc\x97\xfa\xe5\x54\x74\x01\xf6\x85\xc8\x41\xd9\xbc\xd9\xdd\xdc\xea\xfe\x00\x9f\xd2\xa4\x2f\xb2\x42\xa8\xbf\x9f\xcb\xc9\x15\xe6\x31\x6e\xf6\x5b\x6c\x6b\x63\xf3\x09\x7b\x29\x06\x22\x4f\xfa\x92\xfd\xbf\xc9\x85\x4c\x25\xf4\x0a\xe1\x85\x93\xde\xb4\x94\xea\xf1\xf2\xad\x6a\xf9\x4e\xe4\xe3\x04\xf5\xd8\x49\xc1\x46\x22\x17\xbd\x2b\x76\x9e\xf3\x0c\xe4\xf9\xc3\x5c\x40\x42\xb8\xfe\x48\x3d\xb3\xda\x20\xbf\xcf\xae\x98\x1a\xb4\xcc\x98\xec\x95\x3c\xc9\x30\xd0\x58\x5f\x4e\xae\x14\x3c\x08\x2b\x9b\x14\xac\x90\xc3\x72\xc6\x73\x9c\x2d\x2f\x0a\xd9\x87\x97\x0b\x1b\xc8\x3e\x68\x20\x39\xea\x4a\x92\x54\x14\xea\x41\x21\xd8\x37\xc7\xba\xc5\x37\x2d\xe8\x67\x20\x78\xaa\x00\x26\x98\xe3\xce\x94\x42\xa0\x0e\x39\x85\xfc\x88\xb0\xf3\xa0\x5f\x4f\xb2\x7e\x3a\x85\x90\x67\xa6\x38\x4d\xc6\x89\xee\x44\x35\x87\xc5\x51\x73\x56\xa0\xa7\x05\x28\xba\x27\x57\x6d\xc4\x63\xf5\xaf\x80\xf9\x4d\xa6\xbd\x34\x29\x46\x6d\x36\x48\x0a\x5c\x29\xd1\x66\x85\xfa\x08\x4b\xdd\x56\xb3\x59\x97\x39\x2b\x44\x0a\x83\xeb\xcb\x49\x22\x0a\x13\x4b\xd7\x8c\xb1\x8d\xd9\x12\xa5\x5a\xa7\x71\x52\xea\xe5\xc2\xa4\x65\x23\x9d\x1f\xd1\xce\x27\x81\x51\x0d\xa7\x79\x96\x14\x23\x4c\xc2\x35\x90\xac\x90\xd0\xaf\xc2\x68\x13\xb2\x6d\x28\xd3\x14\x73\xac\xf5\x65\x36\xc0\xd4\xde\xdb\x7a\x17\x4f\x46\x82\xf1\x9e\xbc\x10\x30\x2d\xc4\x84\x4c\x96\x49\x5f\xe8\xc4\x8d\x49\x81\x83\xc1\x9d\xd6\x45\xc5\x88\xa7\x29\xeb\x09\xbd\x7c\x62\xa0\x16\x9b\xfb\x33\xcb\xd5\x30\xf4\xcb\x33\x65\xea\x04\xa9\x7e\xc3\x19\x77\xcd\x38\x5e\xed\xb3\xe3\xc3\x97\x27\x3f\xef\x1d\xed\xb3\x83\x63\xf6\xee\xe8\xf0\xa7\x83\x17\xfb\x2f\xd8\x37\x7b\xc7\xec\xe0\xf8\x9b\x36\xfb\xf9\xe0\xe4\xd5\xe1\x8f\x27\xec\xe7\xbd\xa3\xa3\xbd\xb7\x27\xff\x66\x87\x2f\xd9\xde\xdb\x7f\xb3\xff\x3e\x78\xfb\xa2\xcd\xf6\xff\xf5\xee\x68\xff\xf8\x98\x1d\x1e\x29\x68\x07\x6f\xde\xbd\x3e\xd8\x7f\xd1\x66\x07\x6f\x9f\xbf\xfe\xf1\xc5\xc1\xdb\x7f\xb2\x67\x3f\x9e\xb0\xb7\x87\x27\xec\xf5\xc1\x9b\x83\x93\xfd\x17\xec\xe4\x10\xfa\xd4\xd0\x0e\xf6\x8f\x15\xbc\x37\xfb\x47\xcf\x5f\xed\xbd\x3d\xd9\x7b\x76\xf0\xfa\xe0\xe4\xdf\x6d\x05\xeb\xe5\xc1\xc9\x5b\x05\xf9\xe5\xe1\x11\xdb\x63\xef\xf6\x8e\x4e\x0e\x9e\xff\xf8\x7a\xef\x88\xbd\xfb\xf1\xe8\xdd\xe1\xf1\x3e\xdb\x7b\xfb\x82\xbd\x3d\x7c\x7b\xf0\xf6\xe5\xd1\xc1\xdb\x7f\xee\xbf\xd9\x7f\x7b\xd2\x65\x07\x6f\xd9\xdb\x43\xb6\xff\xd3\xfe\xdb\x13\x76\xfc\x6a\xef\xf5\x6b\xd5\x9b\x02\xb7\xf7\xe3\xc9\xab\xc3\x23\x35\x50\xf6\xfc\xf0\xdd\xbf\x8f\x0e\xfe\xf9\xea\x84\xbd\x3a\x7c\xfd\x62\xff\xe8\x98\x3d\xdb\x67\xaf\x0f\xf6\x9e\xbd\xde\xc7\xde\xde\xfe\x9b\x3d\x7f\xbd\x77\xf0\xa6\xcd\x5e\xec\xbd\xd9\xfb\xe7\x3e\xb4\x3a\x3c\x79\xb5\x0f\x93\x54\x35\x71\x98\xec\xe7\x57\xfb\xea\xab\xea\x75\xef\x2d\xdb\x43\x92\x73\xf8\x92\x3d\x3f\x7c\x7b\x72\xb4\xf7\xfc\xa4\xcd\x4e\x0e\x8f\x4e\x6c\xeb\x9f\x0f\x8e\xf7\xdb\x6c\xef\xe8\xe0\x58\xad\xcc\xcb\xa3\xc3\x37\x30\x53\xb5\xba\x87\x2f\x55\xad\x83\xb7\xaa\xe9\x5b\x4d\xbb\xd4\xca\xfb\x1b\x74\x78\x04\xbf\x7f\x3c\xde\xb7\x30\xd9\x8b\xfd\xbd\xd7\x07\x6f\xff\x79\xac\x1a\xeb\xb9\x9a\xfa\x6a\x93\xd7\xc1\xba\x22\x29\x9e\xe5\x72\x56\x60\xa8\x48\x64\xd8\x30\xb2\x1e\x46\x59\xb3\xea\x12\x88\x91\xa8\x2b\x98\x83\x1f\x56\xd9\x01\x88\xa9\xcc\xce\x85\x09\xf0\xac\x81\xab\xdb\xea\x7d\x63\x7f\x70\x0e\x31\x48\x4f\xf2\x64\xa0\x1f\x9d\x2f\x93\x5c\x0c\xe5\x65\xe3\x14\xdb\x96\xd8\xea\x85\xce\x72\x0f\x36\x11\x6b\x31\xeb\xd5\x68\x27\xce\x9a\x95\x3d\xdc\x65\x9b\xc8\x62\x2a\x4e\xd4\x4d\xf2\xc1\x03\x96\xf1\x8b\xe4\x9c\x97\x32\xef\x4e\x0b\x91\xef\x9d\x43\x2e\x5f\x6d\x94\x16\x05\xfb\x3e\x39\x35\xb6\x6a\xc8\x7c\x56\x47\xb9\x89\x2c\x21\x64\xf3\xb6\x19\x94\xed\x73\x78\x9c\xf4\x73\x59\xf2\xe2\xc3\x0b\x9d\xec\xab\x39\xcc\x9c\xdf\x09\x5a\x5a\xb9\xc4\x22\xac\x6a\x9c\x6a\x3a\x86\xd4\x06\xdc\x0f\x38\x4f\xf3\x35\xe1\xc3\xd7\x02\x74\xca\x72\xdc\xd2\xee\xbb\x5c\x8e\x93\x42\x74\x73\x01\xe9\x58\x9b\xad\x6e\x39\x12\x59\x34\x93\x40\x75\x54\x0c\xb4\xe3\x56\x1a\x85\x6a\x9a\x1d\x6f\xa2\xb5\x73\x34\xaf\xa1\xe5\xa7\x79\xdf\x36\x71\x63\xa2\x50\xa8\x21\xc0\xc2\xa4\x08\xd1\xee\xc3\x19\x61\x56\x76\x7f\x6b\x7d\x37\x12\x6d\xc0\x54\x4c\x27\xc0\x7e\xbc\x51\xdb\x7a\xc2\x8b\x0f\x0a\xbb\x3d\x14\xf3\x97\x1b\xf9\xa6\xb5\x6f\xd9\x73\xcd\x34\x30\x93\xf4\x6d\xc0\x0c\x2f\x20\x87\x8c\xb3\xb1\x28\x47\x72\xd0\x66\xe5\x88\x97\x8d\x82\xf1\xe2\x2a\xeb\x8f\x72\x99\xc9\x69\x91\x5e\xb1\x81\x62\x27\x14\xa3\xfe\x2d\xeb\x4d\x4b\xb3\x41\xfa\x4e\x1d\x27\x59\x32\x9e\x8e\x61\xfc\xcc\xa8\xd9\xba\x6b\xaa\xd7\xff\x42\xb0\xf8\xd7\xb8\x27\x72\x69\xf4\xfe\xdd\x1f\xcb\x24\x2d\x54\x81\x31\x26\x62\x1f\x5f\xea\x05\xbc\x66\xc3\x4c\x95\xe0\x26\x15\xa4\x60\x4d\x53\x0e\x33\x09\xb4\xf2\x0a\x57\xe4\x69\x15\xeb\xd9\xb6\x87\x20\x7a\x59\x14\xcb\x33\x12\xfd\x0f\x6a\xd7\xd5\x4c\xce\x93\x0b\x91\x29\xa4\x49\xc0\xde\x3b\xa1\x96\x92\xc0\x2b\xe9\xe9\xb0\xda\xf9\x30\x6f\x42\x7b\xd9\xd5\xb5\x05\x70\x22\xb1\xaf\x8e\xeb\x40\x31\x73\xea\x1b\x34\xb3\xb3\x7d\x26\x65\x2a\x78\x76\xcd\x78\x56\xcc\x20\xcc\xfe\xb6\x3f\x94\xa7\x40\x41\x2d\xba\x25\x85\x59\x9f\x66\xd0\x97\x3b\x04\xe7\x02\x5e\x67\x3a\x58\x71\x05\xff\xcd\xd8\x1e\x3c\x30\x35\xbb\xa5\x3c\x86\xd7\x32\x1a\xbd\x56\x00\xc3\x7b\xfa\x3d\x3e\x43\x98\xe9\xff\xb4\x01\x88\xaa\x97\xf6\x9f\xa2\x64\xcf\x8f\x8f\xe1\x99\x30\x55\x4c\x9b\x0d\x01\x2b\xe9\x72\x0b\x63\xdd\xb1\xfa\xfa\xee\x43\xcb\x6b\x0f\x84\x2b\xc5\xf1\x5f\xdb\x6e\xfd\x55\x3b\x17\x25\xc8\x26\x9e\xeb\xd1\x39\x5f\x11\x04\xd6\xb6\xed\x1c\x2d\x37\x59\x0e\xd4\xb3\xe9\xc4\x24\xb3\xdb\x34\xa7\x5d\xaf\xe9\xfb\x53\xa4\xc2\x20\x7a\x7f\x7b\x78\xb2\xbf\xcd\x36\xd9\x8b\xc3\x37\x3a\xf9\x34\x30\xc7\x86\xfc\x82\x6b\xc5\xb9\x28\xcd\x20\x50\x16\x68\x47\x00\x06\xa4\x64\xbb\xec\x02\x3e\x55\x4d\xdf\x9b\x9f\xa7\x6c\x5b\xfd\xa6\x6b\x7f\xa4\x91\x09\x8c\x68\x78\x2e\x32\xb4\x3d\xd3\x81\x75\x47\xb2\x28\x83\xcc\x0d\x37\x5a\xfe\x34\xb2\xfe\x16\x8d\x6d\x29\xf6\x5f\x59\xfd\x77\x76\x58\x66\xc2\xf1\x85\xc6\xa0\xee\x0a\xdd\x5e\x9d\xbc\x79\xdd\x08\x56\x5b\xd7\x34\x4b\xee\x7f\xed\x92\xa9\x7f\xfa\x64\xbf\xaa\xe9\xd7\x2d\x56\xd1\xcf\x65\x9a\x2a\xf6\x18\xdb\xde\x1d\xae\x2e\xb7\x58\xd8\x7f\xdd\x9a\x1d\x43\x29\xae\x9c\xbf\x6a\xeb\xeb\x7a\x1a\xac\x27\x07\x57\x6d\x76\x66\x6b\x9f\xb1\x59\x92\xa6\xac\xe4\x1f\x04\xeb\xab\xa7\x42\x29\x15\x28\x8c\xdf\x8c\xaa\x22\x76\x86\xdd\x9e\xc8\xc9\x19\xe6\x5e\x4f\x4a\xbd\x13\xf7\xbd\x5e\x9c\x9d\x98\x66\xc3\xba\xaa\x37\x6b\x34\x51\xcc\x92\xb2\x3f\xaa\x6e\x9f\x75\x07\xe4\x85\xd0\xdb\xb8\x4d\x3e\x3c\x3b\x7c\xf1\x6f\xfd\xa1\xb2\x83\x72\x96\x89\xfc\x45\xd8\x9b\x69\xf9\xff\x33\xe3\xa8\x6b\xee\x0d\x6f\x7d\x9d\x69\x9e\x8f\xcd\x78\x56\xb2\x69\x61\x29\x30\x3b\xeb\x5c\x9e\xc1\x23\xe7\xac\x73\x75\x86\x14\x1a\x9f\x28\xbc\x60\x33\xf5\x4c\x33\x9e\xba\x31\xba\x81\x87\x78\x2e\x39\xb1\x22\x50\x79\x21\xf2\x61\x8a\x01\xe9\x62\x8d\xba\xa6\x42\xd8\xe0\x5f\x0b\x5b\xfc\x2b\x6c\xf2\xef\x85\x4d\xfe\x6d\xfd\x39\xd7\x9b\x7c\x5a\xca\x4f\x88\x08\xad\xf5\x6e\x29\x8a\xb2\x69\x07\xfb\x90\xc0\x74\x7f\xff\xab\x35\xef\x34\xba\xe3\x18\x62\x6e\xfc\xf4\xb7\xea\xce\x24\xda\x19\xfd\x46\x07\xd2\xeb\xbc\x72\x20\xd1\x82\xb4\xe6\x40\xce\x27\xfe\x92\x34\x65\xbb\x36\x17\xcf\x83\x07\x0e\xf7\x49\x8d\x1d\xdd\xca\x51\x44\x1f\xc0\x83\x07\xde\x6f\x7b\xf4\xec\xfe\xde\xb7\x2d\x3f\x7d\x62\x3e\x5d\x85\xf3\x57\xfd\xec\x91\x5b\x42\x95\x2b\x26\x4c\xf1\xb3\x6a\x8e\xe6\x7e\x4a\x32\x30\xf8\x46\xe2\x83\x39\x75\xcd\x89\xf5\x56\x01\x49\x99\xb1\xc7\x55\x04\x2c\x95\x85\x28\x4a\x76\xf2\x42\xdd\x6d\x27\xf0\x5a\x4e\x32\xa0\x0e\x6b\x3a\x1d\x96\xbf\x4e\x49\xc1\x26\xb9\x28\xe0\x7a\x3d\x60\x23\xd0\xab\x8f\x92\x82\xfd\x47\xf6\xba\xdd\xae\x5e\xab\xf7\x8d\x93\x17\xf0\x58\x54\xf0\x1a\xa7\xf6\x89\x16\x5d\x61\xb4\x31\xee\x6c\x6a\xe6\x29\x4e\x05\x68\xcb\x36\x6b\x18\x6d\x7d\xa3\x65\x14\x13\xbc\x4c\xfa\xe1\xdd\x16\xe2\x17\x05\xd2\x0a\xcf\x98\x8f\x2c\xf4\x65\x94\x14\x08\xe5\xb9\xcc\x4a\x9e\x64\x22\xf7\x37\x32\xc0\xaa\x90\x76\x5b\x04\x8a\xe0\x4c\x30\x5e\xfb\xbc\x21\x37\x71\x04\xa5\x14\xa6\xd5\x1c\x9d\xee\x30\xc9\x0b\x83\x05\x60\x37\x87\x0b\x64\xe9\x8a\x23\x10\x2f\x13\x48\xe0\x3f\x12\x2c\x97\xb2\x84\x7e\x58\xd3\xe0\x51\x9b\x15\x23\x3e\x90\x33\x75\xf2\x54\x71\xeb\xee\xa9\x46\x06\xd6\x27\x51\x92\x61\x07\x54\x21\x17\x47\x52\x96\x44\x2f\x6d\x96\x95\xf2\x29\xc4\x71\x28\xc0\x05\xdb\x98\x54\xaf\xa0\x01\x6a\xb5\x63\xcb\xe4\x53\xd1\xbe\x1c\x8f\xa5\xcd\x08\x56\xce\xa4\xce\xf7\x20\x06\x00\xa2\xb8\x0b\x8a\xba\xb9\xa0\x7c\xab\x66\xfd\xf4\xd8\xe6\x50\xde\x61\x92\x0d\x9e\x43\xad\x18\x16\x6d\xb6\x6d\x0f\x96\x16\x9f\xa8\x43\x8e\x57\x7d\x52\x40\x62\x34\x14\x92\xa2\x1d\xb9\xc8\x73\x99\x17\x86\x72\x30\x99\x89\x80\x3d\x2e\xb4\x9d\xba\x89\xad\x31\x94\x39\x88\xb0\x73\xc1\x0b\xb0\x6b\xa6\xbc\xd2\x26\x98\xe5\x9a\x1f\xee\xb5\x40\xbe\x6e\x79\x3f\x6c\x95\x3a\x2e\x6b\x0e\x7d\x7c\x25\x72\xc1\x66\x82\x98\x06\x29\xfe\x2e\xb9\x10\x8a\x73\xf9\x06\x72\x6c\x7f\x43\x67\x02\x2f\x7c\xb5\xc4\xa2\x60\x70\xda\xcc\x33\xfe\xc5\xe1\x1b\x73\x33\xe5\x03\x8c\xd5\x6c\x66\xa0\x5e\x70\x3c\x17\x86\xb4\xbf\xd3\xd4\xab\xe9\x56\xf9\x01\x53\xd8\xd8\x7d\x71\xf8\xfc\xc7\x37\xfb\x6f\x4f\x7e\x79\x77\x78\x7c\x70\x72\x70\xf8\xf6\x97\x97\x87\xaf\x5f\x1f\xfe\x7c\xf0\xf6\x9f\xe6\x02\x2b\x74\xe6\x1a\xec\xe4\xa9\xed\x84\x6d\xdb\x4d\x33\x55\x05\x24\xaa\x09\x2a\x6e\xb9\x8a\x9b\x3b\x7a\x0d\xd4\x4b\x53\x23\x0d\xcf\xfa\xa2\x28\x65\x0e\x4a\x0a\xa0\x76\x1a\x58\xce\xb3\x73\xf0\x19\x37\x6b\x8a\x6a\x94\x23\xf5\x19\xc5\x30\x50\x43\x3b\x4d\xe4\x65\x13\x06\xda\x66\x1b\x7e\x19\xa4\xe8\xcc\x06\xe6\xbb\x56\xa0\x8f\x65\xb6\xa7\x3b\xb6\x54\x96\xed\xea\x56\x35\xe5\x66\xf0\xcf\x64\x39\xc2\x33\x07\xf9\x02\x93\xac\x48\x06\x82\x59\xce\x76\xcd\x7f\x12\x6d\x02\x81\xa8\xeb\xd2\x31\x0f\x5b\x73\xeb\x7d\xfa\x84\xfb\xd0\xd5\xab\x54\xa8\x39\xb5\xe8\x5d\x5f\xbd\x34\x6a\x60\xb5\x2a\xec\x40\xed\x7c\xab\x0c\x40\x78\x0d\xd4\xf5\x41\x11\x9e\x1c\x4e\x5c\xb5\xa4\x30\x8b\x66\x89\x7e\x1b\x28\x04\x9b\x8d\x92\xfe\x48\x35\x30\x08\xa5\xd7\x10\x08\xf4\xae\xa5\xa9\xe6\x33\x74\x43\xd7\x5a\xd5\x83\xd7\x62\x78\xd1\xcd\x27\x3f\xb6\x19\xa1\x43\x95\x58\x27\xcb\x81\x6a\x87\x83\xdc\x6a\xe1\x80\xac\xa4\xd7\x09\x5b\xe8\x03\x16\x75\x91\xd1\x5b\xcf\x9c\x77\xfc\x08\xeb\xd6\x2c\xe5\x04\x1e\x3f\xa9\x18\x96\xad\x3b\x63\xa6\xab\xa2\x18\xe8\xed\xac\x54\xcf\x4c\x99\xb3\x33\xd5\xdd\x99\x7f\x09\x64\x53\xd5\xd9\x35\xe3\x60\x65\xac\x26\x80\x13\x12\x03\x36\x49\x2e\x05\x74\x1c\x7b\x13\x57\x79\x9a\x02\xcd\xa0\x42\x2f\x48\xf6\x0f\x06\xac\x9a\xf3\x61\xdc\x3c\xf5\xf3\xad\xb2\xa7\x7e\x21\x64\x99\x98\x34\x6c\xa8\xa1\x29\xd8\xb5\x20\x74\xec\x44\xb1\x36\xaa\x0a\x7b\xca\x1a\xf6\x25\xdd\x50\x0d\xf1\xd7\x6b\x31\x2c\x1b\x11\x0e\x7e\x15\x5e\x6b\x01\x7f\xae\x20\x8f\xca\x71\x4a\xa0\x2e\xc1\x8e\xa3\x7c\x5c\x4b\x3c\x74\x49\x2d\x84\x4a\xc5\x4f\x9f\xa0\x4b\x2f\x20\x51\x58\xe9\xbd\x5d\xad\xd3\x90\x55\x11\x91\x1a\x80\xd0\xa0\x2d\x9a\x8e\xb5\xd6\xb0\xcc\x79\xbf\xf4\x6e\x30\x8a\xe2\x05\x6b\x82\xe7\x07\xaa\x4a\x27\x2d\x14\x5f\x70\x8d\xdd\x20\xdc\x40\x21\xe5\xf2\x58\x3d\xe1\x39\x1f\xb3\x8f\x68\x08\x70\x8d\x30\x3a\xec\xc8\x81\x82\x44\x59\x20\x41\x00\xf1\x81\x22\xf2\xb4\xa1\xda\x97\xf0\x3c\xb0\x0e\x28\x57\xcd\x2f\x18\x24\x68\x63\x9d\x81\x2a\x1f\x54\x0f\xb0\x37\x20\x2b\x17\xb6\x8b\xd2\x61\x8a\x41\x52\x3c\x5c\x3e\x15\x0a\x71\xe8\xc0\xbc\xa5\xab\x02\x35\xee\x27\xc1\x34\xd5\x28\x8d\x55\x46\xb0\x7c\x54\xe4\x8c\x9a\x5e\x7d\xf4\x54\x35\x4b\xea\xc8\x01\x34\x03\x88\x1e\xc2\x2d\xff\x10\x6e\xcd\x3b\x84\x5b\xea\x10\xba\xdc\xf7\x0e\x6b\x4f\xac\xec\xc5\x23\x02\x6d\x3c\x8e\xf6\x86\x76\xa7\xb0\xa6\xb6\x42\x21\x57\x7d\xec\x3c\x38\xed\x1c\x9e\xaa\x17\xde\x36\x2a\xdb\xd4\x7c\xbb\x8a\x64\x3e\xdc\x25\xe3\xf8\xd6\xb6\xb3\x75\xd0\x00\x66\x61\x35\x40\x60\x5b\x09\x86\x19\xa9\x85\xea\xf8\xf9\xd5\x60\x4b\x55\x6d\x72\x92\x5e\x41\x52\x19\xb4\x85\x28\xd5\x86\xf6\x80\xa3\x2a\x50\xef\x73\xc3\x07\x91\x46\xc9\xe7\xc7\xc7\xf0\xde\x7d\x21\xfa\x29\x47\xb5\xd5\x35\x5a\x07\x16\x28\xc4\x29\xa6\x29\x10\xf1\xb3\xba\x97\xf1\x19\x93\x59\xcd\xcb\x4c\xf7\x61\xee\x0e\x7e\x99\x14\xac\xc3\xce\x2e\xf1\xee\xb8\x3a\xf3\xd0\xd8\xdc\x1b\x66\x72\x88\xc9\xe6\x17\x24\x64\xf3\x2e\x43\x05\x0d\x70\xda\xbb\x4b\x9e\x61\xfd\xe3\xe4\x57\x61\x13\xbd\xa8\x9a\xfe\xad\xb2\xa7\x30\x5a\x8d\x06\xc8\xf0\x25\x90\x7d\x20\xf1\x8a\xe2\x9f\xc0\x55\xe1\x2a\x3f\xd3\xb7\xc4\x1e\xd6\xc6\x7a\x4f\x59\xe3\x48\x6d\x27\xb4\x78\x86\x66\x52\xd4\x98\x6f\xc2\xf3\x42\xbc\x4c\x25\x2f\xf5\x30\xde\x37\x70\x2a\x0d\xf6\x50\x43\x7b\xc8\x1a\x3f\x27\x83\x72\xd4\x38\x6d\xb3\xcd\x8d\x16\x7b\xb8\xb8\xd1\xb3\xb0\x11\x7d\x28\x9e\x88\x34\x2d\x0c\x0d\x51\x8c\x68\x3e\xcd\xc0\x28\xe7\x00\x92\x87\x8b\x92\xed\x5f\x4e\x52\x99\x8b\x9c\x6d\x6e\x2c\x8f\x28\x55\xad\x56\x52\x1c\xec\x03\x04\x63\x04\xa0\x7e\x46\xd2\xbe\x60\xc1\x5f\x37\x23\xfe\x90\xc8\xa0\x62\x3b\x4a\x34\x2c\x03\x6b\x60\x3a\x7d\x3b\x9f\x4c\x7e\x42\x7d\xa7\x95\xe6\x34\xde\x1c\x1f\xec\xb3\xcd\x8d\x86\x91\xe0\x04\xa2\x0b\x84\x82\xc1\x20\x3c\x86\x43\x61\x87\xda\xff\xb6\x96\xb5\xab\x4b\xb0\x6d\xd5\x5c\x68\xf1\x4a\x63\x4a\xbc\xe1\xe5\xa8\x3b\xe6\x97\x4d\x55\xfd\x7d\x03\xdf\xb5\x6a\x53\x14\x90\x53\x84\xf2\x5e\xb3\x0a\xe4\xb3\x02\xfb\xbe\xd1\x4f\x13\x91\x95\x95\xcf\x15\x20\xf8\xb9\x02\xc4\xac\x62\xb3\xc5\x9e\xc6\x9b\xb2\x87\xfe\xd0\xdf\x37\xc6\x3c\x3f\x4f\x32\xc8\x4a\xe5\xd0\xfc\x95\x40\x84\x7d\x8a\x28\xae\x10\x17\x70\xb9\x75\x03\x00\x1a\xe3\x15\x0c\x3c\x06\x2d\x45\xe0\x35\x3e\xd2\xa5\xfe\x19\x94\xd9\x6a\xc1\x8b\xa6\x3b\x83\x6a\xbd\xe8\x4b\xce\x08\xf9\x09\x0f\x34\xef\xe5\x6c\x8c\x9e\xed\x80\x41\x85\x6e\x97\x09\xc5\x78\xbe\x46\x4e\x41\xf5\xac\x6d\x11\xcf\x46\x30\xa5\x6d\x8b\x14\x66\x8e\xf3\x10\xa3\xad\x8d\x22\x06\xe5\x88\x34\xc4\x53\x39\xaf\x9d\x67\x06\xe0\x47\x03\xf1\x4e\x48\x5d\x28\x21\x23\xa3\x58\x26\x98\x10\x5a\x9a\xdc\x34\xa0\x10\xbe\x4c\xf4\x29\x9e\x13\x45\x8e\x86\x46\x59\x18\x47\x0e\x86\xb4\x6c\x2c\x39\x62\xdd\x1e\x8f\x28\xa7\x2b\xdc\x30\xae\x5c\xb5\x75\x2c\xba\x1c\xb1\x46\x5f\x3d\xc6\x9c\x6e\x7c\xf3\x48\x73\xce\x76\x64\x2d\x66\xee\xb2\x64\xc8\x39\x2b\x0e\xb8\x6d\xd8\x39\x0b\xe8\xa6\xa1\xe7\xe8\x1b\x83\x86\x9f\xd3\xc7\x02\x3c\x5b\xd4\x7f\xb8\xe7\x74\xb9\x3c\xb4\xab\x46\x46\xd3\xe7\xc2\x8b\x8d\xb6\x56\xbf\xf6\x24\x3e\x9a\xc5\x32\x12\x25\x4d\x7f\xab\xc4\x4a\x33\x96\x4d\xd5\x88\x69\xba\xc4\x0f\xa0\x44\xcd\x9c\xa8\xd0\xa0\x12\x41\x2d\x54\x02\xf4\xfe\xe3\x82\x17\xad\x18\xc4\x72\x8d\xad\x14\xc6\xd2\xbd\x1f\xa3\xa1\x2c\x83\x90\x44\x61\x3c\x4b\x72\x38\x6e\x12\xd5\xd2\xf9\x0a\xd6\x46\xb7\xac\xba\x0b\x92\x75\xd2\x31\xd9\x60\xa9\x8c\x00\xc5\x93\x91\xe8\xd0\x06\x6d\x76\x2e\x32\x91\xa3\xb9\x35\x93\xd3\x72\x32\x2d\x59\x91\x8c\x93\x94\xe7\x5a\x8f\xfe\x4c\x4e\xb3\x41\x92\x9d\x3f\x87\x7b\xfa\x68\xa5\x97\xa6\x13\x90\x98\x57\x98\xee\xd7\x67\x9d\x4c\xa1\xeb\x82\xa5\xc9\x07\xa1\xc7\x53\x11\x88\xb8\x6a\x4d\x13\xd6\x87\x72\x23\x9e\xd7\x8e\x9d\xa7\x16\x4a\xe1\x7d\x66\x02\x3b\xe0\xc3\xc4\xfe\x84\x4b\x0b\x11\x16\x5f\x36\xae\x26\xbc\x86\xec\x2f\xbc\x17\xd7\x10\x85\x7d\x83\xa0\x9e\x5e\x2e\x86\x7c\x8d\x7e\x62\x0e\x6f\xf9\x0e\x89\x3d\xb9\xa3\xaf\x5c\xd2\x6b\x65\xdd\xaa\x3b\x59\x15\x2a\xc1\x70\x6d\xc6\xf7\xf5\x75\x06\x8c\xe6\xe6\x06\x7b\x79\xf0\xaf\x6d\xf6\x2e\x15\xbc\x10\x6d\x36\x90\x59\xa3\x64\xbc\xf8\xd0\xf6\xe4\x16\xa0\x42\xc0\x66\x7d\x09\x12\xcb\x1c\xad\xe8\x5e\x1c\xbe\xc1\xd3\x31\x16\xac\x9f\xe4\xfd\xe9\x18\x6f\xe6\x02\x55\x92\x46\x7d\x81\x2a\x88\x5c\x60\xda\xef\x04\x4c\xd4\x32\x1c\x01\x48\xe8\xcb\xa4\x97\xa4\x49\x79\xa5\x1e\x85\xf0\xdc\x39\xd8\xdf\xdc\xf4\xd8\x65\xc5\xe0\xd8\xfb\x3d\xbf\x22\x92\xdb\x3e\x95\xfb\xc4\x17\xc3\x73\x35\x5c\xfa\xfd\xed\x37\x58\xea\x0d\x6e\x46\x54\x79\x63\x7b\x85\xd5\x57\xb3\x57\x1c\x79\x7b\x7b\xe5\x91\xe7\xb4\xbe\x34\x59\x9f\xa3\x15\x4b\xae\xf8\xa6\xeb\xaa\xe0\x76\xd9\xb5\xb2\xc1\xb5\x73\x7c\x07\x1b\x57\x48\x0c\x58\x62\x27\x81\x27\x0a\xe2\x99\x98\x59\x7b\x4c\x22\x19\x6e\x27\x6c\x65\x38\x50\x3a\xe5\x8e\x05\x63\x23\x90\xaf\xaf\x3b\x49\x06\xce\xb7\x07\xcf\xd3\x5f\x05\x8a\xa2\xd4\x5f\x85\x7d\xb4\xfe\x0a\xde\x57\x73\x6c\xb0\xd8\xd3\x2a\x73\xbe\xad\x2d\x0b\x15\x08\x18\x38\xbc\x7b\x7f\x15\x9a\x6c\x50\xfb\x2b\x3c\x84\x3f\x9b\xcf\xb8\x3a\x64\x86\xf0\x33\xd5\x1b\x02\x4c\x3d\xcc\xd2\x02\xd4\x3f\x2b\x10\x5f\xd9\xef\x1a\x06\x59\x10\xf8\x5d\x2a\x1c\x30\x30\x65\x9e\xfc\x7a\x6c\xd7\x62\x37\xb0\xba\xc0\xd1\x75\x70\x2a\x66\x1c\x17\x22\x2f\xeb\x9b\xe8\xee\x3b\x7a\xb8\x66\xe1\x93\xa1\xba\x3b\x46\x57\x13\x59\x8e\x44\x99\xf4\x79\x4a\xb6\x20\x29\xb4\x54\x46\x0c\xda\xa0\xc5\x9b\x16\x25\xeb\x69\x45\x5e\x52\x36\x0a\x88\xf9\xc8\xd9\x19\xbe\xe4\xcf\x10\xa4\x51\xf7\x95\x4e\xa9\x69\x9d\x39\x78\x0a\xb7\xee\x44\xe4\x43\x99\x8f\x81\xd1\x47\x25\x65\xa1\x29\x41\x30\xf1\x4f\x9f\xfc\x69\x79\x57\x3b\x88\x11\x96\xb1\x6e\xc2\xa3\x13\x80\xee\xec\xd6\xc9\x54\x1a\x97\xe6\xa4\xfb\x4b\x3a\xa7\xc5\x55\xc3\x78\x78\xea\xcd\x44\xb4\xea\xec\x06\xbd\xee\xd0\x3a\x1a\x53\x3a\xbb\x7e\x3f\x11\xfb\x24\x72\x76\xb1\x6d\xf5\x31\x8a\x0a\x1a\x55\xe5\x48\xa4\xbc\x4c\x2e\xc4\x89\xdc\xcb\x7b\x49\x99\xf3\xfc\x0a\x2c\x99\xac\xc3\xbc\x56\x5a\xbb\x7b\xc3\x4a\x24\x1c\x1d\xde\xb1\x45\xea\x4c\xa9\xd7\x89\x6f\x57\x42\xce\x9b\x7d\xb5\x6a\xf8\x47\x48\x82\xe2\xa4\xc7\x73\x15\x05\xef\x6c\x80\x3b\xb7\xcd\xc4\xd9\x94\x38\x5a\x6d\x4d\x93\x42\xf3\x2d\xd2\xc3\xda\xb2\x88\x12\xf4\x80\xe8\x7c\x22\x27\x3f\x6b\x52\x51\x11\x5e\x75\xfd\x2a\x5a\x5e\x45\x5b\x2b\x92\xbd\xa8\xb9\xad\xa3\xdb\x7b\xb6\x57\xc6\xf8\xd6\xad\xc3\x47\x47\x8a\xe9\x5a\xc3\x45\xd4\x21\x0b\xa9\x3f\x04\x43\x24\xc4\xdd\x6b\x0d\x37\x95\xd7\x5c\x7f\x09\xc7\x48\xa9\xbe\x07\x81\x70\x5e\x86\xe2\x7b\xe5\x1e\xc3\xc5\x2c\x1f\x86\x72\x18\xbc\xa4\x37\xaa\x05\xfa\x32\xde\x30\x94\xea\xd8\x5c\x11\x58\x0c\x12\xe2\x40\x7e\x62\x4d\x24\x80\x36\x61\x48\x91\x69\x21\x06\x8c\x17\xd6\x50\x43\x53\xa8\x81\x44\xfa\x24\xb3\xf4\x8a\xc9\x8c\x01\x96\xf7\x44\x9f\x4f\x4d\x73\xb0\x4a\x51\xa5\x9e\x69\x42\x4f\x8c\xf8\x05\xdc\x46\xeb\xeb\x6c\x90\x0c\xc1\x91\xb1\x4c\xaf\xd8\x6c\x24\x32\x3b\x34\xf0\x09\x9c\x4c\xd2\x04\xcd\x38\x92\xb2\x8b\xaa\x0b\x52\x4c\xdc\xd1\x10\x58\x09\x12\xe1\x4b\x23\x08\x0e\xa6\xd6\x36\x8a\x51\x09\x21\x78\xd5\x2c\x81\xfa\x1a\xa3\xb0\xfb\xfa\x0c\x3f\x78\xa0\x8f\x2c\xa5\x94\x74\xa5\xab\xb8\x68\x4b\x2d\x16\xd3\x56\x7a\x1b\xea\x9a\xa9\x62\x87\xbd\xcc\x63\xb9\x3b\xbb\xe1\x49\xea\xb8\xa1\xec\x78\xd5\xcd\x5d\xb8\x7c\x0b\x44\xd2\xdd\xca\x69\xeb\x90\x71\xfb\x2d\x72\x43\x6d\xe7\x37\x81\x36\xeb\xeb\x6c\xaf\x2c\x79\x7f\x44\xd6\x8e\x67\x03\xba\x26\x16\x59\x62\xac\x31\x5e\x82\x57\x60\xca\xa3\xb6\x6d\xec\x8d\x84\xee\x47\xcd\xf4\xbc\xc5\xf7\x67\x74\xbd\xe6\x0b\x99\x9f\x1a\xda\x6c\xcd\x25\x28\x85\x54\xbc\x8f\xb6\xaa\x52\x24\xdb\x23\x9e\x0f\x1e\x78\xbf\x1d\x71\xbf\x5f\x31\xa2\x73\x34\xc9\xd7\xae\xd9\x27\xda\x64\x9e\xe1\x5f\x51\xb9\xae\x7e\x4a\xc4\x6c\x22\xf3\x9a\x6b\xab\xa4\xf7\x56\xe5\x99\xb3\xaa\x26\x19\x99\x5c\x84\x8e\xfd\x21\x69\x5d\x7c\x65\x5a\xfe\x5f\x8b\x58\x7d\x06\xd2\x4a\xce\x55\x29\xe5\x1b\xdb\xc6\xcf\x09\xbc\xf7\x2d\x2b\xe9\xae\x08\xcb\x32\xc6\x40\x20\xa7\xe6\xc3\x70\xcc\x23\xb9\x27\xe2\xaf\x1c\x6f\xa8\x35\xef\x1a\x14\xe1\xda\x47\x8d\x77\xef\xd8\x87\x00\x5c\x34\xae\x8f\x4e\xb0\x86\xfa\x55\x1d\x7c\x74\xc4\x84\xdc\x37\x64\x14\x15\x28\xfa\x15\x1f\x05\xf3\xda\xbe\x24\xf4\xb5\x13\xb9\x69\xdc\xe5\xb2\x53\xcb\x33\xe1\xc4\xbc\xd7\x7e\xc4\xb3\xca\x3d\x84\xd9\x30\xb9\x14\x03\x26\x73\x62\xbd\xc3\xf5\x47\x6b\xf0\x77\xd7\x56\x28\xce\xc0\x70\x5a\x94\x72\xfc\xdc\x59\x88\xcd\x77\xbf\x62\xdf\x24\xc5\x4b\x35\xb4\xa7\xdf\x54\x3c\xaf\xd4\xe7\x15\xed\x69\x6f\x6a\xe2\x11\xb3\xb2\x55\x90\x16\x7b\x32\x55\xec\x8d\x61\xa1\x43\xc0\x46\xf0\xec\xa9\xc0\x70\x82\x4b\x18\xec\x9b\xde\xf5\x2d\x6b\x62\xb5\xa0\x07\x7d\x01\xa4\xdd\xd9\x6d\x8f\x6f\x27\xe1\xc1\x80\x07\xb5\xc5\x36\xf8\x01\xad\x61\x14\xc4\x13\x3e\x50\xcc\x6f\x6d\x63\x37\xf4\x7d\x6b\xba\x61\xfe\x02\x4e\x07\x14\xe9\xc3\x24\x13\xc1\x4c\x6b\x64\x76\x52\xe6\x83\x24\xe3\xa5\xf3\xef\xf7\x9a\x44\x44\x50\x50\xd4\xd4\x11\x7f\xdd\x64\xda\x66\xe8\xed\xea\x18\x97\x74\x39\x20\xdb\xb2\x6b\x42\xa8\x6e\x98\x00\xaa\x1b\xcc\xbe\xdf\x03\xd7\x84\x1a\x1b\xb5\xca\x08\x5b\x86\x91\x7c\xc5\xb3\x41\x2a\xd8\x85\xbe\x81\x8c\x39\xbe\x42\xd6\xea\xf2\x02\x42\x9a\xaa\x16\x27\xbd\xa1\xae\x76\x9b\x55\xcd\xe4\xa9\xf8\xc6\x0d\x8f\xf2\x79\x3d\xae\xb6\x56\xa2\x28\x4e\xd0\xed\xe6\x85\xb7\x61\x2c\x5c\x49\x1d\xd3\x1d\xcc\x88\x37\x9c\x9e\xa3\x66\x9e\x94\x19\x20\x71\x88\x2a\xe0\xe6\x7b\xcc\xb8\x15\xf7\xa2\x5f\xfa\x50\xba\x73\x0c\xf6\xa3\x7d\xea\xe8\x51\x4b\x98\x8d\x59\xb1\x3a\x2e\xec\x9c\xf9\xe2\x0d\x3b\x6f\xa6\xcb\xf7\x1a\x04\x61\xaa\x40\xaa\x0c\xc1\xb3\x38\xad\x3c\xfb\x16\xf3\x26\x7e\x0f\x6d\x16\x20\x96\x41\xa7\x03\x63\x35\x3e\x84\x37\x0e\xc8\x71\x80\x2b\xe5\xee\xf9\xa2\x95\xb9\xdc\x46\xc1\x5e\xb8\x5f\x28\x68\x7b\xf0\x80\xdd\x37\x44\xd8\xeb\x3e\x88\x64\xe8\x8b\xe3\x70\x82\x9e\x7c\x8e\x06\x13\xb3\xbc\x51\xd0\x4c\x3f\x23\x69\x55\xc3\x88\x85\x35\xb5\x58\xac\xb2\x15\x46\x64\xeb\x3d\x52\xaa\x5c\xf9\x4e\xb5\xa1\x7e\x9f\xec\x9a\xd1\x3d\xa4\x30\x22\xf5\x8d\xf8\xd7\x7f\xad\x44\xb8\xfb\x48\xdb\x5c\xcf\x1f\x67\xf7\xd0\x83\x11\xc5\xb5\xf5\x75\xb4\xf8\x4f\x53\xf2\x42\x24\xa4\xa2\x68\x9b\xb7\x2e\x78\x8d\x9f\x4b\x39\xa8\xf4\x6a\x3d\xb6\x8a\x40\x39\xab\x5e\x42\x83\x81\xa1\xee\x8a\xc6\x44\xa6\xa9\x4b\x77\xd6\x62\xab\x1d\x2f\xb4\xaf\xb1\x78\xb1\x7b\x10\xda\x72\x77\xf1\xbb\x7a\x95\x77\xc5\x5e\x2e\x38\xa4\xd7\x70\xec\x8e\xc5\x92\x5c\x0c\xa9\xac\x82\xa2\x9a\x2a\x22\x82\x51\xdd\x0f\xb6\xfc\xd6\x8a\x4c\x1d\x3f\xa1\x38\x80\xa4\xbc\xb2\x77\x6e\x99\xf3\xac\x18\xca\x1c\xed\x26\xcf\xf8\xb4\x94\x67\x24\x6e\xa6\x76\x64\x71\x1f\x66\x49\x39\x62\x63\x99\x03\x13\xc0\x2f\x78\x92\x82\x7e\xbd\x98\xf0\xbe\xe8\xde\x46\x45\x07\x71\xd7\xd1\xbc\x0c\xfe\xd4\x36\xa1\x46\x51\x38\x60\xbd\x2b\x13\xb1\x95\xf4\x10\x51\xf5\x4d\xd0\xc1\xb4\xc3\xde\xd8\x18\x9d\x56\x3f\x0c\x8b\xad\x78\x26\x5d\x2b\xce\x5c\x04\x63\x30\x2e\xeb\xe9\x95\x31\x0b\x1c\xf8\x1c\x86\xb6\x28\xd9\x9b\x96\xd2\x45\x90\x74\x71\x46\xd5\x4d\x7e\x84\x70\xaa\xcc\x47\x0d\xcf\x81\x02\x46\xc0\x9f\xb8\x9d\xe7\x63\xdf\xce\xf3\xf1\x3c\x3b\xcf\xc7\x60\x06\x64\xad\xa0\xed\xc8\x9c\xc9\x96\xda\x76\xcd\xc4\x76\x42\xc7\x7b\x5b\xdd\xd3\xbd\x84\x8c\xc4\x8d\x59\xac\x9d\x35\xa2\x03\x2c\xfc\x37\x9c\xa1\x13\xfa\x11\x45\x4e\x59\xe4\x34\x6c\x9b\x75\xb6\x52\x44\x7a\x9e\x91\x36\xb4\xa9\x3a\xb6\x1e\xba\xd3\x99\x20\xc0\x9c\xd2\x6f\xd3\x1b\xa9\x6f\x9f\x72\xb6\x0b\xa3\xc8\x5d\x71\x06\x11\x3a\x62\x07\x81\x1f\x68\x27\xc8\x60\x06\x5d\x98\xea\x56\x16\xea\xd1\xbc\x25\x27\x61\x5f\xa5\x68\x89\x90\x97\x62\xa0\xe8\x13\xb1\x79\x80\x1c\x37\xb0\x65\x73\x92\xdb\xd4\x25\xb1\x80\xc8\xc2\x1f\xc4\x95\x9e\x0c\x6e\x3d\xd8\x17\x38\xfb\x0f\x9e\x0b\xbe\x6d\x09\xa3\xab\xd1\xa2\x46\x1c\xad\xae\x1a\x1c\xe9\x9c\xb7\x59\x2f\xe8\xbd\xd7\x55\xa0\x58\x87\x71\xf8\x63\x67\xcd\x46\xb5\x54\x93\x1b\x26\x69\x29\x72\x37\x3d\x32\xd9\x2e\x96\x11\xe8\x8a\xda\x6e\x51\xf9\x24\xa5\xd0\x5b\xfe\x96\x06\x44\x7a\xcb\x52\x69\x32\x34\x6c\xfe\x0f\xcb\xad\x51\x0d\xde\x83\x07\x06\x40\x58\xfe\xca\x02\x22\xf3\x30\x56\x6d\x5e\x72\x0f\x3a\x37\x47\x3a\x36\xd8\x53\xbf\xe8\xfd\xc6\xa9\xda\x4f\xb6\x4d\x67\xaf\x3f\xda\x0e\xac\xef\xbe\x62\x2e\x2d\x05\x29\x26\x69\x52\x36\x1b\x9d\x46\xeb\xfd\xe6\x29\xbd\x81\xaa\xe3\x79\x08\x26\x2b\x1a\xc6\x53\xd6\xe8\x34\xd8\x43\x02\x75\x9b\x35\x1a\x15\xb3\x06\xc3\x59\xea\x6b\xa8\x12\x7e\xef\xc6\xde\x07\x90\x0e\x83\x16\x04\x8f\x60\xd6\x21\x89\x72\x62\xe6\xd3\xd5\x57\xb1\x6e\x52\x19\x23\x06\xd0\xd3\x90\xc0\xd1\xba\x27\xac\xd4\x08\x67\x96\x14\xad\xf8\x4d\xb4\x97\x99\x7b\x50\x8b\x48\xd5\x7d\xe0\xbc\x4e\x0b\xed\x8a\x65\xa0\x12\xc9\xbd\xeb\xb3\xea\x2d\x6b\x46\x68\xf2\x34\xc1\x62\x44\x6e\x27\x12\xd0\xaa\xf2\x4c\x5d\xed\xfd\x5a\xf5\x4c\x9b\xf7\x40\x20\x17\x47\xb5\xe3\x0a\x8e\xc0\x72\x4c\x4b\x61\x54\xec\x51\xe7\x2c\xcd\xe5\xa3\x6e\xfe\xa1\xd1\x67\xdc\x9d\x4f\x56\x65\xe7\xaa\xdb\x86\x87\x5d\x31\x1f\xfa\x5c\x4f\xac\x81\x5e\x35\xfe\x81\x9a\x0f\x3e\x31\xaa\xfe\x1f\x44\x29\x18\x0d\x70\x63\x65\xa8\x97\xf3\xb5\x26\x51\xe3\x76\x5d\x8c\xa6\xc4\x16\xd2\xd5\x02\x45\xca\x3c\x50\x60\x8a\xdc\xda\x89\xdb\x6c\xe8\x4b\x2b\x66\x24\xf0\x90\x5d\xf9\x02\xd3\xa8\x59\xc0\x43\x76\xb9\xa6\xc3\x82\x5b\x3f\x0d\xd5\x43\x14\x4b\x26\x20\xb0\xa3\xec\xac\x87\x2c\xe0\xd1\xb8\x3a\x42\xd8\x80\x48\x06\xaa\x8f\x11\xa6\x78\x98\x26\x93\x89\x18\x78\xd5\x82\x5d\xd7\xe3\x8b\x30\x91\x44\x87\xc0\x8b\x11\x88\x99\xf0\xf6\x6f\xe4\xda\x34\x5a\x33\x35\x28\x1a\x6f\x5b\x06\x04\x2c\x86\xda\xc8\x4e\x99\xc8\xb1\xde\x72\x39\x5a\x9e\x0b\xf8\xbb\xb9\xae\x40\x7c\x02\x78\x9f\xb0\xc5\xa7\x52\x4e\xd6\xcf\xdb\xc4\xbc\x71\xcc\xcb\xfe\xc8\x79\x06\x68\x58\x6a\x6c\xef\x75\xd1\xe9\x4e\xd4\x50\x2d\xa0\xe8\x44\xe4\x78\x13\x32\x6e\xf3\x6a\x75\x20\x24\x96\xfd\xa9\x40\xbf\x23\x14\xf7\x5c\x94\x86\x38\x2e\x90\x7e\x2e\x24\xfc\xce\xb1\xcb\xa7\xa2\x15\xf2\x6f\x66\xba\x3c\xf9\x0f\x3c\x73\x1c\x96\x76\xa8\x77\xee\x05\x4f\x93\x01\x45\xe1\x79\x4f\x19\xec\xd7\x0d\xf1\xb3\x5c\x28\xef\x68\x27\x55\xfa\x7f\x68\x35\x6d\x3e\x36\xd3\xec\x0c\x51\x8e\x62\xe3\x94\x7a\xa2\xeb\x25\x84\x88\x14\xd4\xb0\xca\x44\x06\x37\x76\x18\x84\x76\x4e\x48\x22\x4f\x23\x0e\xd0\x28\xd2\xae\xd2\xe3\x52\x32\x39\x75\xd2\x2c\xe3\xa0\x47\x3a\x71\x89\x20\x3d\xea\xe5\x46\x10\xb3\x28\x20\xa5\x81\xca\x67\x7d\x9d\x0d\xc4\x44\xa0\xe1\x66\xef\x8a\x22\x1e\x79\x70\x0b\x36\xe2\x88\x29\x9a\xa7\x62\x89\x1a\x9d\x1e\x4a\x91\x2a\x90\xe9\x15\x55\xe9\x3b\x0b\x18\x99\x27\xbf\x42\x9c\x4e\x43\x25\x90\x3c\xb8\xd0\x2b\x64\x4b\x9c\xb3\x0e\xea\xd0\x93\x4c\x3b\xe3\x1a\x38\x4f\xb5\x37\xae\x21\x32\x56\x55\x27\xfa\x52\x3d\x22\xae\xaa\xf5\x53\xe3\xbe\x55\x12\xf7\xad\xb1\xe0\xc5\x34\x37\x3b\x4f\x6a\x8f\x84\x75\xde\x82\x75\xac\xf6\xf0\xc6\x6b\x7a\x7f\x7e\x5b\x1b\x2e\x5d\x6f\xdb\x7b\x33\xa7\x53\xb6\x5b\xc1\x4e\x52\xf8\x30\x52\xe8\xfa\x3d\x65\xeb\x6c\x8b\x75\xc8\xb6\x56\x4a\x77\xc2\x87\x36\x2a\xb0\xe9\x32\x19\xc2\xe9\x0f\xd0\xab\x12\x1d\x65\x50\xc3\x1b\x46\x6c\x95\x4e\x2b\x82\xfa\x55\x7b\x8c\xde\x4b\xfe\x5c\x2a\x2e\xc8\x5e\x1f\xf4\x06\x78\x93\x8c\x93\x3e\x5a\xa8\x9c\x29\xf6\xf1\x4c\xcb\x72\x14\x6d\x83\xf4\xb9\x37\x0a\x07\xa9\x1a\x5e\x33\x9e\xe7\x7e\x81\xe2\xaf\xfc\x2f\x60\xdc\xef\x11\x4a\x38\x07\x4c\xe6\xac\xb3\x59\x0d\x85\xd2\xe4\x79\xde\x46\x43\x40\xab\x09\x9a\x16\x82\x65\x48\xbb\x21\x16\x42\x32\x34\xa1\x32\x21\xf1\x8f\xda\x76\x18\x0f\x31\xbc\x57\xf5\x82\x8b\x92\xe7\x39\x7c\x6e\x22\x70\x1a\x87\x41\x75\x70\x86\xcf\xb3\x33\x20\x49\x10\xc6\x1b\xbd\x8d\xf9\x58\xa0\x1d\x4f\x22\x73\x70\xff\x84\x35\x5c\x0b\xc0\xc2\xa3\x15\x01\x03\x09\x0d\xa3\x7f\x01\x2c\x3d\x71\xbc\x52\xe0\xca\x56\x44\x68\x55\x9f\xee\x2f\xb0\x09\x07\xaa\x10\x77\x42\xc1\xf2\x3c\x4c\xaa\xfb\x01\xb5\x97\xdd\x14\xa8\x5c\xb3\x33\xd8\xad\x63\x78\xfa\xd3\xbc\x1a\x91\x63\x9a\x43\xb0\xc8\x53\x38\xdf\xd6\x73\xc4\x4a\x27\xfc\x1d\x55\xd8\xfe\x90\x9d\x69\xca\x7b\xa6\x46\x75\x66\x7b\x3a\xd3\x56\xe8\x74\xd8\x48\x86\xcb\xfe\x48\xbf\xb5\x70\x11\x3c\xa7\x9b\x60\xf0\xb2\xf7\x9f\xd8\x80\xae\xe9\x0b\x4c\x4d\xd0\x50\x7f\x80\xee\xb1\x68\xaf\xa5\x9c\xb0\x32\x97\xd3\xf3\x11\x60\x46\x9a\x60\x48\x4b\x97\xef\x08\x34\xce\x53\x54\x37\x83\x6b\x4f\x3e\x80\x0c\xaa\xdf\x32\xc1\xfb\x23\x8d\x51\x63\x1d\x1c\x71\xa4\x9e\x60\x83\x04\xd9\x6f\x22\x52\x5d\x41\x52\xac\x99\x22\xd5\x98\x8a\x8a\x69\x99\xc6\x3d\x92\xf9\xab\xca\x4c\x81\xc7\x4e\x87\x1d\x4e\xb4\x31\xaf\x75\x46\xcf\xd4\xa1\x32\x2a\xc9\xa2\x74\xfc\xa8\xe5\xa5\x48\xd7\x3e\x7a\xe6\xd3\xcc\xca\x98\x9b\x24\xf9\x9b\x6a\xd0\x86\x1e\x1d\xdb\x6e\x8b\x4f\xe4\xd1\x34\x63\xbb\x38\xa0\xdd\x40\x66\xeb\x96\x99\x24\x32\xeb\x16\x69\xd2\x17\xcd\x8d\x36\x39\x0f\xa4\xb7\x86\x9a\x41\x43\xf7\x87\xbc\x8e\xdf\x59\x77\x28\xf3\x7d\xde\x1f\x11\x6c\x36\x15\xa8\x2f\x9a\xf9\xf6\xde\xe5\x2a\x3a\x6d\x51\x55\x8d\x28\xd2\x24\x2b\x3b\x83\xa4\xe0\xbd\x54\x74\xd2\x24\x13\x6c\x20\xcb\x4e\x26\x89\x02\x0e\x9c\xb1\x0a\x99\x8a\xee\x8c\xe7\x59\xb3\x71\x66\xc0\x76\x0d\xd4\x33\xb4\xce\x9e\xe4\xa2\x8f\x69\x89\xe1\x7c\xb8\x6a\xd9\xd9\xfd\x06\x71\xb4\xd3\x62\x3a\xb5\x64\xb1\x11\xb2\x4f\x9f\x18\x69\xbb\xb3\xf4\x40\xe9\x94\xbb\x3a\x2d\x1f\x1a\x21\xba\xb0\xbf\x59\xcb\x5b\x00\xe0\x1f\xed\xa3\x1d\x88\xb3\x7b\xcd\x68\xcb\x71\x31\x86\x74\x0b\xe3\x49\x2a\x4a\xa1\xfd\x62\x8e\x68\xbc\x07\x03\x8c\x98\x72\xf6\xc4\x50\xe6\x02\xcf\x8f\xc5\x4b\x2f\x2d\x1d\x70\x86\xb9\xb8\x48\xe4\x14\xb5\x61\x03\x29\xb4\xd7\x8b\x06\x37\x16\x45\x81\xca\x99\x72\x24\x0a\x61\x43\x52\xc0\x7f\x91\x9c\xc7\x15\x1b\xdd\x48\x1d\xab\x05\xf7\xca\xdc\x0b\x67\x2e\x88\xc0\x7c\xc1\x80\x51\xb4\x0c\x53\x70\xb7\xed\x5c\xa9\x5b\xa5\xe7\x0e\x8c\xe9\xad\x89\xf2\x0a\xf4\x3f\x3a\xfc\xae\x79\xeb\xe9\x3b\xcc\x3c\x3b\x90\x49\x36\xcf\x9a\x4c\xcc\xec\x26\x41\xae\x8b\xc9\x24\xbd\xd2\x76\x2a\xa6\x1c\xa4\x15\xdd\xbf\xf7\x72\xb6\xfe\x0f\xf5\xfd\x1d\x0c\x9d\x9d\xf9\xf9\x9e\xce\x20\x3c\x27\x3b\x9b\xea\x5f\xc6\x8a\x52\x0e\x63\x4e\x01\x8b\x08\x9c\x4f\x48\xa6\x3a\x2b\xa0\xb9\xd4\x92\xa1\x79\x07\xc0\x51\x81\x54\x7d\xea\xa4\xa0\x03\x94\xee\x0e\x02\xa5\x0d\xa7\x39\x28\x4d\xa7\x26\x27\x95\xcd\x00\x88\x09\x85\x93\xe2\x85\x69\xee\xdf\x15\x9e\x32\x47\x6f\x8c\xa6\x05\xda\x7f\x19\xb3\x61\xe1\x5b\x06\x05\x3a\xdb\xec\xa3\xd6\x3c\x70\x9b\xfb\x96\x7e\x2c\x75\x52\x0e\xf2\x4d\x0b\x3d\x74\x98\x91\x36\xb5\xc8\xdc\xd6\x4e\x40\xe6\x29\x64\x5e\x37\x55\x01\xaa\xf5\xde\x9b\x8b\x88\x15\xb1\xa6\x5b\x06\x93\xa5\x53\xa3\x08\xfc\xa8\x9a\xd7\x98\x01\xf0\x69\x29\x49\x2a\x4a\x75\x29\xe4\x54\x66\xa4\xed\xea\x82\x2b\xad\x8d\x40\x1c\x05\xb7\x6f\x68\x1d\x92\x1c\xee\xc1\x33\x0b\x06\x18\x00\x0c\x98\x87\x2d\xd1\x94\x6b\x88\x47\x5f\xe6\xc9\x79\x92\xf1\xf4\x1d\xd5\xc4\x7e\xc8\xe4\x0c\x1f\xeb\xba\xd4\xf0\x52\x2c\x48\xc5\xbd\x1b\x57\x49\xc2\xbc\xb5\xb8\x80\xe4\x41\xac\x59\xd5\xb9\x8b\xa6\x7f\x1b\x60\xee\xae\x52\x1b\xde\xad\x68\xf9\xe6\x57\xd7\xda\x41\xbb\x11\xb8\xe0\x18\x48\xd9\xc4\x38\x0f\x57\xff\xac\xb2\x42\x67\x16\x3f\x2a\x6b\xb7\x1b\x2c\x50\xb8\xe3\xe4\xe1\x5d\x83\x6b\x94\x68\xfa\xe2\x0e\x6f\x91\xea\x56\xd2\xef\x1e\xe8\x5d\x04\x7c\x97\xa4\x89\x77\xd9\xf1\xcd\x60\x35\xd3\xe5\x25\x38\xd5\x07\xd7\x63\x44\x60\x40\x01\x37\x62\x97\x16\x82\x23\x41\x78\x42\x4b\xc8\x00\x4f\x21\xf2\xc0\x99\xcc\x30\x9f\xc1\x19\xfc\xee\xf1\xfe\x07\xd7\x0a\x8d\x33\x64\x26\x0a\xbf\x85\xa1\x8e\xa4\x05\x98\xf5\x7b\x44\x08\xc1\x0e\x5c\x0c\x84\x6a\x99\xe7\xa2\xef\x61\x8b\x19\x55\x53\xcf\x24\x78\xd0\x06\x75\x75\x86\x55\x57\x97\xdc\x1f\x3a\x66\x8f\xb1\x7d\x80\xf3\xe4\x59\xd2\xda\xdb\x37\x29\x4c\xaa\xde\x15\x58\xd5\x8a\xad\x6b\x68\xd6\x6a\x36\x49\x27\xec\xa2\x5c\x9c\xf9\xd3\xc5\xf5\xd6\x77\x20\x61\x03\xe5\x58\x04\xca\x48\xaa\x8b\xcc\xd0\x30\x16\x2c\x42\xd4\xdf\x24\x87\xae\xcb\x6b\xaa\x0a\x85\x49\x6f\x4c\x5e\x0e\x84\x01\xca\x8c\xad\x14\x1d\x52\x5c\x98\xab\xd9\x12\xb4\x2f\xb6\x4f\x17\x17\x4f\x5f\x81\xba\x95\x44\xdd\x00\x6a\xf6\xf9\x58\xa4\xcf\x79\x21\x5a\x71\xe1\xba\x1d\x45\xa4\x89\x7a\x59\xbe\xe3\x45\x9f\xc3\xaf\x36\x91\xb9\x69\x49\xf1\x85\xc8\x06\x32\xd7\x30\x5a\xd5\x48\x78\x66\x62\xc6\x02\x58\x2d\x48\xd3\x4f\x63\x00\x32\x42\x1c\x03\x24\xc6\xc1\xeb\x8e\x35\xc6\x90\x69\xf5\x67\xd1\xfb\x90\x80\xf8\xed\x8d\xfc\x55\xfd\x73\xd8\x38\xdd\xa1\x61\xef\x74\xb4\xf3\x89\x75\xce\x1f\xf1\x7c\xaf\x6c\x6e\xb4\xba\xa5\xfc\x51\x55\x50\x23\x6f\x82\x96\xc5\x54\xc1\x47\xc1\x26\x9e\xec\x78\x04\x0f\x1c\x8e\x51\xfc\x76\x20\xf4\x80\x1f\x64\x00\xeb\x40\xcf\x58\xd9\x46\xf1\x80\xd4\x3d\xd2\xc4\x41\xd1\xf5\x9e\xb2\x46\x03\xc6\x00\xbf\x1e\x92\xb1\x6f\xdb\x81\x39\x5b\xcd\x20\xb5\x10\xc4\x93\xc1\x2c\x96\xef\x35\xe4\xd3\x30\xdd\x50\xe5\x89\xad\x2b\x52\xd3\x2e\x17\x93\x77\x9a\xa6\x14\x23\x35\xa7\xb3\xbc\x5e\xc1\xdf\x69\x9b\x12\x19\xc6\x10\xe7\xa1\x2c\x91\xd2\x74\x51\x4e\xfb\x23\x30\x58\x03\x7f\x2b\xf5\xa2\x77\xe9\xbe\xcf\x62\xd4\xc4\x3a\xc0\x84\xa4\x20\xa4\xda\x0d\x07\xa8\xd1\xf2\xe8\xa6\xbe\x2b\x72\x31\x96\x17\x62\xcf\xf0\x5c\xcd\xc6\x25\x49\xff\xd9\xda\xa9\xd4\x47\x2e\x37\x45\x87\x8a\x46\xa3\xae\x02\xbd\x82\x6a\x2b\x95\x80\xad\xb5\xe5\xef\x6b\x0f\x4d\xc3\x9a\x9b\x35\x5a\xa7\x16\x04\xf0\xa1\x00\x45\x3f\xd9\xf6\x2f\x44\x56\xbe\x4e\x8a\x52\x64\xea\x46\xb3\xb7\x17\xce\x99\x5e\xd7\xc9\x50\x51\xf3\x9c\x89\xcb\x49\x9a\xf4\x93\xf2\x8a\xf1\xe2\x83\x0e\x24\x0c\x0c\x9a\x48\x05\xbe\x12\xec\x06\x6b\xc1\xbb\x04\x17\x60\x78\x7b\x22\x58\xc7\xd2\x1f\xec\x6f\x6e\x9a\x17\x96\x21\x6b\x2e\x75\x83\x77\xdf\x60\xd3\xc3\x4c\x63\x48\x6c\xa3\x5c\x54\x69\x5d\x1b\x02\x70\x53\xbe\xa1\x15\xb8\x07\x60\xde\xec\x2a\xa9\xd5\x59\xbc\x48\xbe\x3e\xf3\xe0\x5b\xe4\x99\x11\x55\x55\xa3\xe1\xe9\x75\x85\xde\xe1\xf7\xaa\xe2\xd9\xb3\x25\xae\x73\x63\x22\x92\x26\xbf\xfe\x53\x16\xd8\x22\x63\x2a\xca\x9f\x12\x31\x63\xdb\x7a\x6a\xbe\x51\x24\x07\x3f\xb6\x13\x49\x2d\xb6\x7d\x17\xb1\x36\x26\xc0\x6c\x5b\xe6\xa3\xed\xb9\x85\x15\xd4\x51\xf8\x19\x46\xb7\x8a\xbb\x8d\x39\x53\x6e\x43\x96\x31\x94\x09\x66\x81\x52\x2d\x9f\xfa\x2d\xe7\xcd\x85\x56\x54\xe0\x10\x54\x97\x0f\x06\x1e\x5e\x37\x2b\x63\xff\xc8\x26\xbc\x28\x92\x0b\x9a\xec\xd2\x79\x49\xaa\x61\x18\xfc\x8a\x2f\x4d\x68\xdd\xae\x3b\x26\x61\xcd\x17\x2e\x98\xc1\x44\xef\x6b\x77\x32\x2d\x46\x26\xa2\x0d\x45\xcc\x63\x51\x4e\x27\x26\xea\x37\x40\x06\x81\x21\x9c\x5a\xcb\x65\x99\x34\xfb\x44\xb9\xa5\x69\xcc\x0a\x42\xc0\x3c\xb9\x40\x83\x1d\x82\xaa\x85\xea\x3d\x20\x15\x84\xe7\xd6\x47\x14\x03\x1e\x89\xb6\x1e\x07\xd8\x29\x92\xdc\x2e\x60\x10\xe2\x0f\x5d\xd1\x0a\xc4\x47\xb5\x10\x70\x05\x90\xb6\x6c\x97\x42\x52\xeb\xe5\x8e\x8c\x7b\x53\x56\x77\xbb\x91\x43\x5f\x8d\x76\x15\x64\xed\xce\xaf\xaf\x33\xdc\xd0\xc8\x08\xbd\x8c\x36\x85\xe7\x35\xe7\x22\xce\x86\x18\xe1\xdb\xe4\xcc\x3b\x60\xf6\xe1\x66\x62\xdf\x45\xc7\x8d\x9f\xaa\x28\x44\xbf\xbb\xd1\x78\xbf\x5d\xb5\x30\xf9\xbe\xbd\x61\x4d\xec\x5b\x55\x8b\xa2\xdd\x81\x4e\x58\xc1\x07\xea\xc5\xac\x56\x75\xbd\x20\xcb\x84\x92\x1e\x0c\x88\x9e\x8b\x3e\x4f\xfb\xd3\x94\x97\x5a\xe8\x13\x17\x1b\x59\x51\x03\x38\x43\x97\x23\x71\x05\xae\xce\x65\x9e\x9c\x9f\x8b\x7c\xf1\x23\xc0\x47\x4c\xbc\xeb\xc3\x4b\xcc\xc5\x8a\x23\xbc\x85\x37\xf7\xea\xf3\x48\x2d\x5a\x04\xcb\xe7\xbd\xc5\xdb\xac\x22\xf7\xf0\x05\x59\x95\x57\xd1\x11\xde\xaa\x5f\xfc\xfc\xe2\x6d\x58\x7f\x80\x61\x0a\xe4\xa8\xc2\x28\xf3\x85\x27\x36\x7a\x1c\x23\x7d\xcd\x3b\x91\xf6\xf8\xe9\x5e\x8b\xa5\x4f\x61\xe4\x44\x44\xe4\xef\x34\x3a\x98\xbd\x20\xa2\x63\xac\x3f\x7d\x2d\x62\x01\x8a\xa4\x4c\x94\xc6\xae\x31\x4a\xb6\x90\x5f\x8e\x0e\x51\x3d\x59\x4e\xeb\x0f\xae\xdf\x32\x3c\xaf\x61\xf6\xc7\xda\xf3\x9a\xd3\x2d\x8c\x1c\xd9\x99\xc4\x40\x4c\xe6\xc8\x46\x11\xae\xee\x84\xaa\x5e\x78\x5a\x48\x0d\x45\x17\x30\x23\x10\xb0\x37\x1e\xe3\xd9\xd5\x58\xe6\x02\x54\x56\xd3\x2c\x15\x45\x01\xb1\x59\x51\x9e\x61\x84\x22\x5a\x2d\x3d\xe6\xd9\x94\xa7\xe9\xd5\x6a\xe7\xbf\x86\x8b\xb5\x04\x60\xd1\xf9\xef\xf3\xac\x2f\xd2\xbd\x2c\x19\x83\xba\xe2\x65\xae\x58\xe7\xba\x93\x1c\x90\x8b\xe8\xa1\x8a\xd2\x0b\x3c\x5e\x21\x31\xb0\xf1\x6a\x4d\x0c\xe3\x24\x9b\x4c\x4b\x4c\x94\x88\xbe\x9e\x2b\xab\xee\xbe\xbd\xd6\x40\x22\x79\x19\xeb\x65\x25\x6f\xa7\x63\x91\x27\xfd\x66\xe6\x49\x43\x32\x7c\x31\x1a\x0f\xae\xb7\xfc\x6d\x93\xd8\x1d\x66\xad\x96\x56\xe1\x24\x59\x52\x8a\x66\x16\x72\x2b\xa8\x46\x87\xe0\xa4\xda\xa4\x09\x27\xb9\xaa\x19\x5a\x3d\x8b\x4d\xdc\x5a\x4b\x89\xea\x06\xaf\xd3\x1a\xaf\x15\x17\xdc\x19\xbf\x20\x67\xcf\xad\xfe\x95\xa8\x9d\xd4\x49\xd1\x31\xda\xe7\x1a\x6b\x39\x9e\xdf\xe7\x99\x50\x6c\xef\xbc\x98\xb1\x6b\x5c\x65\x6a\xdc\xaf\xbf\x47\xa8\x97\x1a\x0c\x95\x22\x4c\xb3\x84\x3e\x2a\xd7\xd7\xe1\x66\x86\xaf\x89\xb5\x59\x9b\x82\x0b\x57\x86\xbb\x0a\x93\xd0\x8e\x5d\xfa\x22\xb6\x09\xb4\xad\xfc\xe0\xbd\xb6\xe4\x69\x5b\xeb\x9e\xb6\x31\x67\x74\xf6\x4c\x26\x19\x7e\xd5\xb2\x09\x06\xe9\x72\x48\x39\x8c\xd2\x51\x9c\x41\x51\x4e\x14\x7c\x66\x16\x93\xcb\x06\xd5\x3e\x9a\x57\x0e\xbe\x6c\xb5\x76\x9d\x51\x18\xec\x21\xb4\xad\x8a\xc8\x0c\xc2\x39\xc5\xc8\x97\xc6\x3a\xaf\xe7\xdf\x1e\xf5\xac\xb4\x82\xa0\x9f\x1b\x62\x15\x05\x49\xd9\x12\x68\x88\x48\xb6\x4b\x20\xe2\xfe\x38\x89\x14\xd6\x50\x38\x01\x77\x96\xdb\x7b\xbb\xc9\x64\x8c\x4d\x34\x37\x09\xa1\xb5\xa2\x9e\x8c\x06\x40\x28\x95\x81\x31\xfa\xea\x4d\x87\x1f\xff\x15\x24\xc1\xd5\xfb\xfe\xc6\xb3\x63\xb8\x99\xa7\x5c\x70\x91\xcd\x81\xd4\xd5\xf6\xe4\x1d\xf6\x5a\x6f\x38\x92\x2a\xb2\xed\x1d\xb3\xe9\x0e\xb7\x64\xcc\x42\xb6\xa6\x03\x82\x84\xae\x13\xfb\xf1\x6e\x3a\xba\x23\xaf\x3f\xb0\xb0\x22\x8b\xea\x63\xb0\x13\xc9\xa1\x7a\xc1\xb0\xa6\x3c\xbb\x72\x72\x67\x9d\x06\x8f\x25\x19\x3b\x23\xeb\x7b\x36\xdf\xa6\x56\x6b\x0f\x13\x14\xfe\xb0\x19\xbf\x62\x33\xc5\xb3\x64\xd6\xae\x80\x3d\xca\x21\x86\x47\x79\x45\x8d\x71\x06\x03\x1d\x75\xc3\xb8\x05\x40\xd0\x26\x9d\x01\x49\x30\x3e\xe3\xb9\x68\x93\x06\x7d\x39\x4d\x07\xa0\xc9\xce\x8d\x0e\x93\xac\xbf\x31\x44\xd1\xf6\x66\xc6\xe2\x00\xc1\xa5\x49\x66\xbc\x2b\x92\xc2\x82\xbc\xbf\xc6\xc8\xa5\x02\x13\x36\x0a\x64\x5f\x2b\xa6\xaf\x13\xc3\xae\xce\x5f\x33\x87\x32\xcb\xad\x1b\xf0\x83\xa6\xa2\xe2\x83\x79\x81\x81\xb1\x08\xee\x85\x89\x79\x03\x82\x34\x67\xe8\x84\x0c\xd1\xe8\x83\x79\x2e\x67\xfb\x2e\xf4\x8a\x59\x3c\x30\x33\x70\xfa\x71\x36\xe2\x05\xc6\x59\xa2\xfe\x1e\x40\x8e\x10\x38\x05\xf3\xe0\x81\x47\xff\x5c\x85\x63\x7d\x19\xa3\x2c\xdf\x10\xae\x60\xe1\x29\x28\x33\x74\xd2\x38\xb4\xd2\x0c\xad\x2b\xcc\x75\x45\x04\xc9\xe4\x98\x1a\x23\x95\x0b\x91\x5f\x95\x60\x2c\x08\x04\xd0\x45\x1e\xd3\xb8\xd5\x43\x6b\x2a\x30\xb0\x90\x80\xa0\x26\x78\x98\xb7\x71\xf6\x6b\x26\xc4\x00\xca\x7a\xc0\xa3\x23\xe3\x3f\x20\xd9\x74\x15\x24\x93\x50\xd7\x57\xd2\x2e\x54\xcd\x45\x2d\xc2\xe2\x31\x4d\x34\x41\xad\x1a\x1f\x98\x67\xb0\xe7\x5b\xb0\x20\x52\x8a\x75\x25\x50\x20\x01\x0f\xc3\xd8\x17\x5a\x36\x1c\x73\x2c\x70\xa4\x4c\xcf\xe2\x3f\x05\x21\x5c\x51\x72\x74\x98\xbd\x96\x7c\x40\xdf\xce\x06\x7f\xad\x50\xc0\x2c\xc5\xa1\x27\x15\xb3\x24\x6c\x19\xe3\x0b\x74\xdf\x09\xbc\x1e\xe2\xa6\x17\xb5\x1e\x65\xff\x07\x6c\x2d\x40\x6f\xb6\xc8\xd4\x22\x62\x65\x11\xf1\x87\xa8\x3a\x4a\x2f\x6f\x50\xb1\x8c\x2d\x85\x51\xca\x50\xae\xc6\xd3\x13\x51\x9f\x0c\xeb\x25\x01\x17\xef\x99\xc1\xf7\x33\x72\x07\x6b\x1a\xc0\xb3\x08\x05\xd0\x01\x0a\x93\x72\x24\xa7\xa5\x6f\xa1\x65\x28\x37\xde\x68\x8d\x92\x9d\x4f\x79\xce\xb3\x52\xb8\x4c\xd9\x24\x8e\x47\xe1\xdd\x28\x66\x8d\x3e\x5a\x70\xdb\xc4\x36\x22\xb0\x17\xd3\x6b\xf2\x55\xf1\x58\xbf\x5d\x3c\x02\xc7\xa9\x58\x6c\x71\x0a\x91\x4b\xb6\x6b\x51\xe8\xd2\x98\x0a\x5c\x91\x8f\x36\xf5\x87\x35\x7d\x89\x58\xac\x04\x62\x32\xe0\x0c\x52\x71\xce\xfb\x57\x4e\x6f\x96\x11\x3a\x76\xb1\x65\x4c\xce\xb0\xd6\x3f\x27\xd3\xbd\x7e\x5f\xa4\x02\x97\x02\x89\x93\x31\x77\xf6\x6f\x64\xa2\x1b\xad\xb7\x63\x0d\x6c\x26\xba\xd6\x96\x81\xaa\x53\xb5\xe7\xf8\xb9\xdf\xb7\x71\xda\x98\x37\xb0\xfb\xb1\xac\x38\xbe\xbd\xeb\xcf\x7b\x47\x6f\x0f\xde\xfe\x73\x9b\x9d\x05\xf0\xcf\xf4\xca\x32\xb5\x52\x70\xa3\x9c\xd1\x7d\x22\xda\x62\x10\x85\x29\x82\x96\x49\x1d\xb4\xd8\x18\x56\x24\x19\x1b\x4e\xcb\x69\x2e\xd8\x05\x26\xdd\x01\xae\xc6\x2e\xaf\xb6\x9b\xbd\xd6\x4b\x1c\x0c\x80\xed\xce\x5d\xf4\x30\x7c\xc4\xbc\xba\xdb\x16\x4b\x2a\x8b\x18\x0f\x75\x15\x26\xa4\x8c\x31\x5b\xad\x58\x98\xac\xb9\xe1\x75\xab\x81\x83\xd6\xd7\xd9\xb1\x7e\xce\xfa\xbe\xb2\xc6\xf7\xc5\x90\x90\xc0\xe0\x8a\xda\x21\x0e\x53\x29\x31\xc7\x54\xe1\x32\xd9\xf6\xd2\x69\x9e\x5f\xb1\x52\x5c\x96\x95\x58\xb7\x34\xfa\x38\x84\x45\x04\x08\x9a\x72\x81\xc6\xbd\x45\x62\x91\x57\x6b\x94\x72\xd2\xf2\xa3\x46\x54\xeb\x60\x49\xcb\x8b\x5f\x51\xad\x05\x05\x2d\x3f\x78\x83\x4e\xac\x75\x89\xc7\xc0\x78\x80\x12\x5f\xae\x9e\xc9\x93\xe5\x27\xd7\xba\xc2\x06\xb9\xcd\x2e\x64\x7d\xb9\xf0\x13\xe1\x84\x43\x44\x4b\x0a\x93\x40\xef\xac\xcc\xa7\xe2\x0c\xb3\x08\xda\x40\x33\xaa\xd8\xa0\xb4\xbe\xc9\xd5\xd5\x00\xaa\x78\xa8\xa5\x38\xc0\x47\x83\x33\x5f\x94\xe1\xf8\x2f\x8f\x8d\x9c\xe9\x8b\x47\x31\x12\x63\x0e\x71\xc0\x53\x88\x6e\x83\x52\x37\x62\x93\xa4\x0d\x84\xf4\xc9\xf1\x38\x02\x62\xbd\x33\x20\xf9\x4d\x96\x32\x63\x30\xeb\x90\xc9\x59\x9b\xa5\xa2\x6c\x14\xf8\x64\xe3\xac\x28\xc5\x84\x69\x91\xf3\x80\xa5\x52\x7e\x60\xbc\xd4\xc1\xc5\xe5\x40\x27\x59\x4f\xaf\x58\x73\x56\x0e\x9f\xb6\x74\xde\x83\xa1\xb6\x7b\xcc\x4a\xe2\x9e\xac\xe7\x7a\x9e\xcb\x59\xc1\x24\x24\x19\xc2\x38\xc1\x20\x44\xc2\x75\x11\x83\xb6\x7d\xf9\x8d\xf9\x15\x1b\xf1\xc9\x04\x24\xe5\xbc\xf4\x60\x28\x9c\x1d\x27\x05\xdc\xfb\x03\x6a\xc5\x6c\xcc\xa1\x75\xdf\x3a\x2b\xec\x85\xc8\x87\x28\x97\x03\xb7\xc3\x48\x04\x06\xc8\xa3\x60\xce\x09\xcc\x6e\x92\xcb\x5e\x2a\xc6\x10\xb1\x4b\xa7\xbf\x86\x54\xd8\xe6\x2a\x6c\x5e\xc2\x8a\x5c\xb5\xda\x5a\x8c\xc4\xd3\x14\x54\x37\xda\xd4\x50\x51\xd4\xe9\xd8\x24\xd7\xb3\x31\x01\xb5\x0b\x3f\x32\x64\x5d\xbb\x5e\x33\xca\x69\xd8\x17\x82\xc2\x93\x09\xe6\xe2\xab\x8c\xb9\x6d\xde\xd6\x85\xd0\xe3\x3f\xbb\x3c\x43\x74\x95\x93\x33\x6a\xcc\x4f\x57\x9e\x95\x72\xc6\xf3\x41\x01\xeb\xa0\x80\x2b\xfa\x25\xf8\x80\xc9\xa1\x3e\x09\x65\xa1\x4f\x70\xd7\x5e\x72\x60\x6d\x83\x41\xec\xcc\x25\x8b\xc6\x33\x2e\xb0\x1d\xa4\xef\x71\x99\xec\xf4\x71\x6c\xb9\x38\x38\x6c\x97\x75\x42\x9a\xd8\xad\x84\xf3\xc2\x76\x55\xeb\x48\x68\x1f\xc4\xfc\xba\x26\xdd\x3e\xa3\xe7\xbc\x45\x88\x59\xb4\xdb\x30\xb4\x57\x6e\x43\x91\xd0\x4e\x75\xf3\x30\xfe\x97\x8d\xac\x19\xd0\x8b\x07\x0f\x2a\xa7\xcf\xbe\x70\x8d\x9c\xd5\x2f\x06\xdb\x21\x42\x2b\x9a\x0d\xf6\x90\xe9\x80\xac\x8d\xc9\x65\x9b\xa9\xdf\x18\xe6\x15\x7e\x6e\xb4\xb4\x4c\x57\xc3\x83\xf5\x3e\x35\xe1\xbb\xbd\xcf\xcf\x2a\x9f\xbb\xea\x32\x7e\x3e\xd2\x89\xae\xc9\xd9\x8f\x05\x41\x94\xe5\x68\x26\xf2\xa4\x10\x6d\x43\xd3\x50\xfa\xcf\x15\xff\x3e\x40\x0c\x6b\xeb\x14\xbd\x6d\x76\x86\xbb\x86\x14\xf2\x0c\x16\xf3\xcc\x97\x13\x68\xf3\x95\xec\x42\xe4\x25\x06\xcc\xad\xe2\x8a\x97\x45\x93\x36\xd0\xe1\x73\x2b\xdb\x1c\x34\x08\x17\xa5\x84\x7c\x9a\xb6\xcf\xf8\x12\xa5\x98\x28\xd3\x75\x54\xbf\x64\x36\xb3\x22\xee\x0b\x80\xa0\x0e\x72\x4e\x0a\xa3\xcf\x0d\x91\xda\x98\xeb\xd5\x7b\xb6\x6c\x07\x06\xd5\xf4\xfa\xd6\xea\x3e\x90\x23\x9d\x11\x48\x46\xd1\x11\xca\x67\x8c\x29\xb6\xd7\xa7\x97\xcc\x87\xc2\xa8\xca\x83\x98\x27\x45\x0d\x9a\x9a\x34\x0b\xbe\x04\x8c\x55\x64\x33\x61\x3b\x8f\xd5\x86\x7a\x51\x79\x4e\xbd\x2c\x67\x79\x4b\x67\xb4\x86\x2d\x74\x82\xdf\xcc\x9a\x79\x13\x87\x98\x83\x12\xf5\x76\x85\x01\xa1\x2d\x7e\xa8\x7d\x23\x28\xc5\x51\xf8\xb5\xba\xe1\x74\x8d\x1f\x1f\xeb\x54\xfd\x0f\x63\xbe\x7d\xb9\xf8\xdf\xa9\x28\xca\x24\x3b\x07\x63\xae\x0e\x9a\x30\xcb\x21\x29\xb0\x00\xe6\xb4\x17\x83\x78\x73\x32\xd3\xd5\xcc\xbc\x8f\xc4\xff\x4e\x93\xdc\xb7\xf3\xf6\xc7\xda\xf6\xfb\xa6\x09\x91\xec\xc8\xf5\x6b\x28\xfa\xfe\x59\x64\x03\xee\xd9\x78\xdb\xc7\x90\x3f\x86\x20\x90\x54\x52\x98\x61\xb3\x5d\x76\xff\x3e\x19\xc8\x83\x07\xf5\xc6\xe8\x4b\x3f\xc4\xfc\xb5\x26\x20\xa9\x0f\x9e\xfd\x06\xce\xa5\xec\xef\x64\xc4\xf8\x89\x8c\x59\x5b\xc7\x99\x41\xd3\xd5\xf8\xc5\x5b\xc5\xc6\x59\x03\x5c\xfb\x3d\x5c\x79\xa8\x3e\x3b\xb2\xe9\x76\x3c\xa8\xaf\xc7\x4b\xaa\x7b\xcf\x3e\xd7\xee\x21\x6b\x78\xe7\x22\x37\x8b\xd9\xbb\x02\xe2\x47\xc7\xe4\xd7\xd5\xae\xb4\xea\xb8\xce\x64\xfe\xa1\x6d\xf3\xd5\x94\xd2\x84\xae\x67\x49\x69\x64\x30\x11\x58\xe4\xf9\x67\xe3\x4c\x9b\x65\xf9\x42\x22\x91\xaf\x34\x40\x23\x50\xcd\x3a\x49\xc8\x2f\xea\xfb\x5f\x35\xb1\xfd\x2b\x54\xb5\x4a\x0a\xf5\xc3\x52\x48\x99\xb1\x0f\x42\x4c\x4e\xe4\xb9\x00\x22\x19\xee\x98\x43\xc6\x0a\x01\xa8\x15\x65\x34\xa0\x0b\x75\x31\x52\xd0\xce\xe2\xdb\x23\xef\xc4\x63\xcf\xd3\x1a\x38\xa1\x8d\x48\x3d\xff\xa6\x88\x96\x42\x3d\x4b\x72\x08\xc5\x08\x6f\x23\x93\x33\x84\x43\xfc\x9c\x42\xa4\xa2\x5f\xca\x7c\xcd\x33\xe0\xf7\xfb\x82\x70\xcb\x00\xc2\x72\x8b\xc1\x60\x62\x8f\xfb\xee\xff\x4e\x45\x7e\x75\xac\xe1\x37\x69\x0b\x12\xf2\x37\x32\xde\x4c\x96\x6c\x88\xc6\x86\xe8\xfd\x18\xba\x41\x59\xe5\xee\x7d\x0f\x68\xe8\x48\x60\x56\x50\xeb\x61\x03\xae\x4d\xdf\x6b\x41\xe7\x90\x6d\x8e\xc1\xc8\xed\xd2\xd8\x6c\x52\x98\x1f\xca\x3c\xaf\x0c\x20\xfd\xdc\x19\x80\x53\x00\x84\xaa\x81\x54\x52\x49\x0a\x21\x2e\xd4\x0b\x81\x84\xb1\x71\x43\x8f\x2e\x99\xcd\x8a\xe1\x4d\xcc\xcd\xac\x4e\xf0\x04\xd5\x0d\x2a\x9c\xd9\xdc\x57\xb1\x51\xe8\x4a\xf7\x69\x82\xb8\xd8\x72\xad\x45\xe4\xde\x3e\x0b\x16\xc6\xed\x89\x9c\xad\x40\x84\x68\xde\x43\x56\xbe\xe8\x55\xee\x3a\xfd\x1e\x0e\xcb\xf9\x7a\xfa\xf5\x6c\x09\xb9\xc1\x7e\x52\xec\x73\x9f\xa7\x10\xfa\x46\x07\xc4\xd2\xac\xef\xdc\xd0\x37\xf6\xd9\x96\x81\xe1\xb7\x05\x33\x37\x36\x4d\x32\x10\xcf\xf9\x24\x29\x79\x9a\xfc\x0a\x17\x87\xdf\xd0\xcb\xea\x4c\x1b\x69\xc6\x98\xb4\xed\x96\xf2\xb5\x9c\x19\x67\x1f\x53\x97\xa7\xa5\x0d\xac\x43\x01\x47\x63\xeb\xc8\x49\xb4\x6e\xcf\x65\x86\x36\xd2\x9b\x2a\x1d\x39\x4e\x7e\x15\x95\x10\x4a\x1e\xee\xbd\x4f\x45\x66\x62\x32\x21\x85\x31\xb9\x50\x3d\xc2\x68\x43\x94\x8c\xf9\x07\x75\x37\x39\x17\x76\xdc\x6a\x30\xfe\x29\x0b\xe3\xd3\x61\x76\x16\xc2\x1c\x89\x0c\x62\x4f\x4c\x92\x4b\x91\x16\x90\x16\x49\x66\xff\x99\xea\xeb\x4a\x75\x6b\x3c\x6f\x26\x10\xa6\x0c\x96\x50\x93\x2b\x0b\xe9\x3d\xae\xc2\x29\xeb\x54\xe7\xf7\x77\x3d\x08\x78\xc8\xd8\xf8\x06\x11\xd1\x36\x56\x80\x38\xce\xde\xef\xe5\xfa\xb1\x37\xf1\xfa\xba\x96\x09\xac\x63\x50\xd9\xe8\x78\x0b\x1d\x77\xa8\x32\xda\x7f\x98\xce\x75\x4f\x8b\xc7\xfb\x90\x84\xf0\xa9\x87\xdb\x09\xe0\x9a\xd1\xde\x3c\x50\x80\xaf\xd6\xeb\x8b\xac\x04\x3d\xad\xa7\x2d\xc5\x50\x92\x58\x14\x1b\xa6\xfb\xa2\xf0\x4c\xc7\x59\xaa\x8c\x1d\x02\x2c\x61\x77\xcf\x89\xff\xae\x02\xf2\x13\xd8\xf7\x4c\x0b\xe3\xfd\x8f\xec\xc8\xa0\xea\xdb\xab\x30\x88\x7f\x08\x74\xd1\x0a\xdb\x78\xbf\x2f\xa7\x99\xcb\x91\x04\x51\x1a\xd4\x3d\x80\x31\xb8\x20\x5d\x68\x36\x94\x2e\xf2\xb5\x99\x55\x31\x37\x4d\xdb\x5c\x79\x37\xfe\x7c\x03\x63\xd0\xa7\x97\xd8\x34\xf6\x8b\x82\x66\x7e\x0f\x48\xc6\xa9\x97\xc0\x0d\x21\x61\x9e\xbf\x1a\x48\x98\x42\x2a\x02\x49\x71\x90\x98\x2e\xdd\x87\xe9\xd6\x75\xd7\xec\x5d\x67\xde\x79\xa9\x4e\xa7\x53\x19\x97\xd9\xbf\x49\x8e\x16\xd5\xde\xbd\x0b\x0f\x51\x4c\x81\xa6\x85\x94\x90\x1a\x5d\x66\x65\x72\x3e\x95\xd3\x02\xad\x82\xdc\x25\xb6\xc6\xbc\x31\xda\xc4\x44\xf8\x47\x92\x69\xe1\x38\xe2\x54\x15\x9f\xda\xae\x75\xab\x6d\x92\x14\x55\x2d\x33\x76\xbd\x86\x15\x07\x6e\xe4\x14\x77\x59\x33\xc2\x4d\x42\x62\xdb\x76\x90\x3e\x3b\x56\x11\x87\xd2\xc6\x29\xe4\x8a\xe9\x69\xba\xb1\xb5\x96\x83\xa0\x6f\x8b\x36\x6b\x34\x5a\xed\x18\x6f\x3b\x57\x6c\x30\x27\x52\xa6\x8b\xd4\xfb\x59\x62\x66\x3a\xf8\x4b\x46\xcf\xf4\x1a\xc4\xe3\x68\xfe\x64\x6a\xb8\xc0\xc3\xce\x08\x9b\xc4\x33\x56\x2c\xad\xc8\x2a\x89\x7b\x1a\xe0\x42\x42\xa5\x7c\x91\x76\xff\x1f\x7b\x6f\xbb\xde\xc6\xad\x24\x0c\xfe\xd7\x55\x94\x3d\xe7\x98\xa4\xd4\xfc\x94\x3f\xa9\xc8\x1e\xc5\x56\x12\xcf\xd8\x96\x5f\xdb\x49\x4e\x46\xd1\x4a\x50\x13\x14\x3b\x6e\x76\xf3\x74\x37\x25\x32\xb6\xf6\x99\xbf\xfb\x7f\xff\xbc\x17\xb0\x7b\x61\x73\x25\xfb\xa0\x0a\x9f\xfd\x41\x91\x22\x9d\x78\x76\xe2\x79\x26\x47\x44\x03\x85\x42\xa1\x50\x28\x14\x0a\x55\x54\x27\xdf\x52\x40\xcb\x9d\xc5\x74\x3b\x27\xdc\x92\xf2\x86\xf3\x7d\x3e\x71\xe2\x1c\xe0\xdd\x93\x90\x40\x2c\x55\x4e\x71\x92\xee\xb6\x5b\x03\xe9\xfd\x96\xa9\xe6\x27\x37\x38\x24\x66\xec\xeb\x8b\x0f\x4d\x19\xdb\x5f\xfe\x9d\xc5\x13\xf5\x27\x59\x1d\xe5\x0f\x69\x8f\x94\xbf\xd0\x4a\xb9\x05\x88\xea\x21\xf3\x47\x16\xf5\x7d\x16\x91\x4c\x64\x16\x67\xe0\xd2\xa5\x4b\xe0\x20\xcd\x54\xbf\x4d\xa4\x91\x82\xd9\xe4\x18\xb2\x6c\x9b\xb0\x95\x2d\x55\x66\xc1\x8c\x27\x93\x84\x0b\x42\x70\x96\x06\xf4\xa4\x76\x1e\x4f\x05\xcc\xe8\xa3\x8e\x2d\xc5\x28\x02\x0c\xee\xff\x59\x4c\xd7\x61\xf8\x34\x20\x09\xb2\x8c\x47\x10\xb2\xe8\x62\xca\x2e\x78\xda\x02\x8c\x0f\x28\xf4\xe8\x30\x9c\x43\x9d\xec\xfb\x68\x6b\x95\x03\x6d\x78\x70\x46\xe8\xa1\x11\x4b\x40\xc4\xcf\x12\x49\x3c\xc1\x0b\xf0\x36\x89\xa5\x5e\x85\x00\x91\x42\xb6\xf5\xd6\x05\x98\xc9\xec\x7b\x08\x4f\x14\xe8\xfb\x01\xf2\xb8\x8a\xc7\x2a\x9e\x27\x9f\xb1\xf1\x04\xcd\x93\x66\xc2\xb2\x78\x82\xd4\x82\xba\xb9\xce\xb0\x7c\x45\x48\xa1\x60\x61\x70\x11\xf1\x41\xc3\x9e\x4d\x49\x71\x6c\x47\xb5\xdc\x96\x88\x96\xdb\x4e\x19\xa2\x45\x13\xfa\xdb\x93\xe2\xde\xd4\x11\x0c\xd4\x94\x46\xea\xba\xf4\x84\x42\x4d\x56\x27\x85\xa0\x3c\x10\x66\x77\xf4\xa8\x1b\xe4\x18\x75\x8c\x3e\x9f\x5b\x4e\x27\x92\x10\xff\x9a\x66\x2c\x0b\x7c\xfc\x53\x9c\x3a\x95\x2d\x10\x0b\x78\x34\x35\xc6\x3a\x29\x1d\xd8\x20\x8e\x42\x3b\x5a\xa0\xc5\xf3\x95\x0f\x34\x9c\x13\x0c\xbe\x79\xc1\xc4\x07\x44\x2d\x71\x44\xc0\x34\x08\xf2\x7f\x05\xe5\xa5\xc3\xb9\xa9\x20\xbd\xcf\xe5\xc4\xe8\x53\x85\xa9\xa0\xfd\xd2\xa9\x5c\x56\x22\x82\xba\xbf\xac\x72\xdd\x5a\x70\x93\xaa\xa5\x8e\x2d\x58\x46\x35\x84\xea\x2d\x83\xa1\x26\x01\x1e\xe5\x64\xbe\x8e\x33\x33\x0c\xc9\x8c\x6a\x04\x67\x5b\xd2\x33\x3a\x30\x91\xd8\x53\x3b\xde\xaa\x8a\x2e\xb6\xdb\xc8\xe7\xec\x67\x42\x21\x0a\xb2\x80\x85\xe0\x78\x31\x91\x60\x56\x39\x5b\xd2\xe9\x79\xca\xff\x39\xc5\x50\x7f\xce\x0c\xf8\x61\xec\x7f\xbc\x0a\x52\x0e\xf5\x38\x01\xd4\xaa\x78\xd2\xd4\xa5\x0d\xb5\x06\xd6\xdf\x39\x9a\x70\x50\x08\x8a\x5b\x0f\x32\x29\x54\x53\x23\x9f\x64\x98\x5d\x03\x4b\xe7\xa4\x93\xe8\x41\x93\x9c\x20\x63\x7a\x85\x99\xc5\x70\xc5\xc2\x8f\x6e\x06\x94\x54\x55\xd6\x43\x71\x37\x2c\x69\xc4\xb6\xea\x93\xf1\x4e\xea\xa4\x81\x15\x49\x3f\xe7\xcf\xa7\x01\x96\x85\x7d\x56\x18\x96\x26\x03\xe9\xba\xc9\x40\xba\x8b\x92\x81\x74\x4f\xa0\xaf\x9e\x6c\xa9\x03\x33\x06\x4d\xdc\xcf\xb3\x49\xc9\x49\xd9\x3a\x36\x96\xd4\x27\x4e\x22\x68\x3b\xd0\x6d\xb4\xfc\x38\xf2\x59\x56\x2f\xaf\xd7\xf1\xa8\xe3\x86\x1d\x9d\x50\x0d\xf3\x19\xc6\x29\x14\xea\x61\x82\x81\x2f\xfa\xe2\x37\xee\x9c\xa2\xfb\x6f\x0f\x7f\x38\xf8\xe9\xe5\xd1\xbb\xf7\xf2\x7a\xe8\xbb\x57\x2f\xdf\xf6\xa1\x26\x74\x84\x9a\xb7\x05\xf0\xfc\xd5\xd1\xf3\x7f\xff\xf9\xe5\xfb\xc3\x3e\xd4\x34\x55\xe9\xcb\xd1\x8f\x6f\x3e\x1c\xbe\x73\x2a\xe4\xa6\xb3\xb6\x75\xbd\xf7\x3f\xd8\x56\x2a\x88\x58\x66\x2a\x25\x2b\xd9\x19\x26\xf5\x2c\x0d\x6d\xe1\x19\xff\x3e\x75\xed\x79\x26\x80\x9d\xd9\xa6\xba\xf2\xe0\x17\xd5\xe6\x51\xec\x6e\xb1\x39\x54\x7b\x52\x2b\x15\xf1\xde\xbd\x42\x3c\xac\xfd\xfd\x8a\xd0\x50\x0d\x63\x03\x4c\x39\x1f\x0b\xc5\xe5\x23\x47\x1a\xe0\xf6\x9d\xcc\x71\xd9\xc6\x10\xc6\xf1\x04\x49\x77\xce\xce\xc9\x21\x25\xe1\x32\x8b\xbc\xb4\x58\xd0\xce\x87\x33\x32\xd7\x6f\x9a\x04\x46\x94\x1f\x29\x18\xc8\xeb\xdc\x2a\x8b\xee\x82\x84\x3a\x0b\x5c\xd3\x75\x69\x89\x0f\xa9\x4e\xba\xa3\x0a\x16\x24\xdf\x59\xd5\xb0\xa7\x3f\x2b\x5d\x5b\x1a\x8e\x16\x44\xb0\xdf\x2b\x49\x24\x52\xdd\x55\x17\x23\x3b\xd6\x6a\x26\x51\x4b\x18\x4c\x8e\xd0\xdc\x4e\x6f\x55\xc5\xb1\xef\x2a\xc8\xfc\x11\x68\x67\x5b\x65\x77\x32\xef\x28\x53\x6e\x64\x45\x0b\xa5\x84\xb4\x27\x3a\xd0\xac\xed\xad\x30\xae\x13\x9d\xe7\x2c\xe1\x4c\xc6\xa1\xc9\xc1\x35\xc2\xa4\x04\x78\x99\x50\x5f\x02\x64\x5e\x4c\x2d\x07\xd9\xc3\x7d\xab\x0c\xbe\x8c\x50\x51\x06\x27\x4f\x3d\xcd\x95\xba\x52\xc9\xdb\xab\x34\xe3\x13\x25\xbf\xad\x18\xa2\x86\x8d\xc4\x06\x84\x0e\x50\x9f\x3f\x5b\x80\xe4\x8e\x25\xd6\xa3\xd9\x26\x16\x99\xea\xc9\x6d\x6f\x05\xe6\x84\xdb\xb1\xa6\x89\x88\x94\x0b\xf4\x5e\xea\xf4\x6a\xae\x0b\x87\x15\x35\x5d\xab\xb4\x0c\x03\x2c\x64\x09\x79\x17\x2a\xf3\x52\x79\xc6\x80\x31\x9b\xab\xf0\xfc\x30\xe0\x7e\x30\x66\x21\xe6\xe5\x16\x67\x24\x21\x71\x2e\x62\x29\x95\xfc\x18\xdd\xe3\x13\x95\x8c\x54\xad\x14\xd1\xc5\xbe\xe5\x1f\x68\x30\x8e\x2f\x79\x12\xb2\x49\xfa\x8e\x0f\x6d\x2d\x90\xce\xb2\x64\x51\xbe\x77\x0f\x6c\xa7\xc2\x23\xdb\xd3\xa7\x01\x4f\xe5\x47\x33\x74\xf2\x70\x14\xf3\x9c\x03\x27\x7d\x4d\x2a\xe0\x51\xab\x6f\x8a\xe0\x64\x47\x45\x78\xe8\xb0\x58\x01\x4d\xfa\x47\x96\xa1\x97\xc5\x93\x32\x68\xca\x24\x5e\x01\x10\x5b\x95\x60\x77\xae\x12\xa3\x38\x24\x1d\x86\xf1\x55\x2a\xbd\x6d\x6e\x1e\x6c\x2e\x27\x57\x63\xaf\x08\xeb\x9d\x4c\x1d\xb5\xc4\x4c\xe4\xf3\x96\x95\x81\x23\xcf\xa1\x1b\xc7\xe9\xa6\x4c\x2b\x03\xf4\xad\x4a\x27\xb9\xcc\x24\x14\xb2\x99\x95\x92\xed\x5b\x7b\xe3\xab\xe2\x48\x97\xc8\x8b\x78\x2d\x47\xc2\x6a\x36\x72\x88\xb3\x90\x3f\x72\xa3\x37\x4b\x1a\xf5\x04\x7a\xdf\xac\xf6\xb4\x60\xa8\xaf\xfc\x8d\x33\x96\x7b\x21\x25\x0f\x91\xb2\x83\x1b\x72\x31\x98\xcd\x6f\xc2\x07\x3f\x59\x5b\xe7\x9d\x3b\x4a\x70\x8b\x8f\x96\x25\xe5\xde\x3d\xa1\x62\xe9\x1e\xef\xdd\x83\x52\x93\x55\x29\x55\x17\xb6\x13\x07\xd3\x72\x0a\xdf\x59\xb5\x3f\x49\xf2\xc5\xed\x0a\xfd\x7d\xeb\x30\x91\xd8\x6f\x6c\x71\xf6\xf9\x73\x29\x4f\xc9\xfd\xc7\xa6\x9e\x13\xd4\x99\x22\x30\xd3\x41\x90\x1c\x4e\x33\xa1\xaa\x63\x70\x5d\x31\xbd\x42\xf3\xb3\xc3\x20\x2b\x2d\xd3\x8a\x53\xb3\x3c\x36\x76\xa2\x60\x7b\x57\xd3\x3b\xe4\xb1\xde\x16\xb5\xe2\x71\x6d\x77\x51\x3d\x14\x70\x14\xab\x1b\xac\xa0\x05\xd8\x85\x00\xb2\x93\x15\xf3\xb6\xe5\x08\xea\x26\x99\x49\xad\xe7\x44\x78\x4c\xb8\x62\xf4\xca\x0a\x1f\x7e\x26\x97\xe8\xd8\xc2\xc2\x18\xb3\x64\x65\x23\x03\x4b\xcc\x82\xd0\x62\x33\x0a\xda\xae\x1f\x8c\x5e\x71\xdc\x24\xd9\x40\xbf\x55\xa5\x77\x11\xf6\x68\x0a\xd7\x58\xd5\x1e\x76\x4a\xa5\x2e\x04\x77\x5d\xa0\x79\xdf\x1c\xe5\xb5\x10\xf8\xda\x09\xd3\x5a\x79\xe6\xa1\xb3\x17\x1d\x66\x73\x4f\xc7\x2b\xed\xf6\xff\xf3\x8e\xa9\xf6\x85\xb3\xf5\x1a\xfb\x4f\x73\x3a\x58\xf5\x00\x55\xae\xa4\xad\xbb\x5b\x58\xbe\x05\xae\x03\x40\xa2\xbd\x17\x72\xcf\x3d\x2a\x1c\x06\x96\x4a\xdc\x63\x37\x20\xa7\x08\xd1\x42\x7a\x4a\x98\x74\xb3\xf6\xf5\xa0\xa5\x51\xb9\x77\xe8\x8d\x45\x57\xdb\xea\x9e\x7d\xbf\xb2\xb5\xb9\xd1\x1e\xe7\x93\xdf\xb8\x68\x28\x50\x4f\x0b\xa0\xd2\x35\xd0\xa0\xb6\x37\x3d\xb0\x7e\x1e\xa3\xb3\xb4\x71\xc2\xb2\x93\x70\x51\x6c\x8a\x1d\x19\x36\x25\xca\x62\x60\x30\x99\xc9\x62\x2b\xf2\x4e\xf9\x4a\xff\xa4\x05\xc8\xff\x49\x48\x5f\xe7\xe2\x6e\x95\x99\x50\xd3\x2c\x81\x26\xfc\x64\x77\x4c\x78\x55\xd4\xb7\xe7\xbf\x09\x67\x34\xd1\x67\x10\x27\x70\x86\xd3\x7f\x56\x21\x1e\x1c\x2d\xb1\xa2\x4e\xfe\x75\xac\x2b\x25\xde\xe0\xf8\x3f\x5b\x77\x00\x84\x75\x10\x49\x4f\x11\x4f\x60\xa1\x9f\xea\x4a\xea\x06\x43\x88\x62\x1d\xb0\x84\x27\x1c\xf8\x2c\x4b\x98\x9f\xe5\x85\x49\x16\x23\xb8\x7a\x9a\x25\x9e\x3d\x4a\xcf\x45\xbd\xf8\x86\x57\x9b\xc6\x52\x3e\x61\x42\x64\xca\xf9\xc2\x8b\x30\x41\x50\xb5\x26\x85\x08\xc0\xb0\x31\x49\x0b\x93\xae\xd4\xdb\xf5\xfa\xb3\xfe\xaf\xcd\xcf\xbf\xee\x34\x9e\xfd\x3a\xd8\xfe\xb5\x25\xfe\xdb\xa8\xb7\xb6\x1b\x6d\xcb\x52\x42\x57\xda\x3b\xd8\xfc\xb8\x6b\x62\x06\x53\xa8\x1a\x2a\xee\xe9\x2c\x69\x2f\x87\xe4\xcc\x27\xce\x88\x2a\x5a\x93\x74\xef\x8b\x40\x48\x53\x96\xc5\x89\x07\x2f\xe1\x62\xca\x53\x15\x84\xe0\x8e\x95\x4f\xc7\x0a\xe1\x95\x38\xf6\x35\xd1\xa1\xc9\x16\xfd\x77\x99\x2a\xba\x63\x3b\xdb\x72\x7d\x51\x6e\x9e\xb6\x18\x13\x8d\x00\x60\x79\xae\xb1\x94\x43\xed\xef\x93\x5a\x5f\x2b\x2f\xa6\x79\x2e\x79\x94\xaa\x60\x19\x33\x34\x00\xdd\x5e\xfe\x4e\x74\x41\xce\xde\x61\xc3\xcf\xcf\xa1\x63\x6a\x50\x89\xa8\x0b\x5e\x2f\x76\x6e\x4d\x2b\xd5\x64\x31\xfb\x57\xb7\xd3\x81\x6d\x2b\xf7\x8e\xb9\x39\xa6\x59\x13\x9a\xed\xe5\xa8\x26\x14\x44\xab\xe0\xaa\xd6\x70\xbc\x11\xd1\x53\xf3\x72\x24\xb8\xfa\xf2\x4a\x5a\x56\x55\x50\x34\xba\x76\xfb\x9d\xc3\x39\x4b\xf9\x40\x07\xb1\x0e\xf8\xd5\x24\x4e\x32\x3d\x8c\x94\xdc\xb9\xec\xd9\x28\x60\x61\xa6\x44\xd6\xd6\xde\x13\x3a\x6a\xb3\xfa\x43\x9a\x0c\x9d\x1c\xc4\x9e\x8c\xba\xd7\x42\x33\xad\xcc\xc8\xf9\xf9\x33\x74\xca\x83\xe4\xac\xd8\x07\x7a\xa3\xb8\x5d\x50\x66\x50\xbb\x07\x87\x6b\xc9\x3d\xa8\x7c\x06\xf2\xd4\x8d\x74\xcc\x60\x12\x21\x38\x1b\x48\xe9\x0b\x73\xbf\x86\x4e\x44\x82\x60\x42\x7f\x11\x2a\x87\x89\x66\x55\x00\x17\x8c\x25\x38\x02\x84\xeb\x6e\x32\xf3\xe8\x39\x2f\x57\x38\xfe\x36\x4d\xb3\x1c\x10\xed\x20\xa0\x10\xb6\xb6\x8c\xb7\x2c\x49\xb9\x80\x7e\x46\x62\xfd\x4c\xc9\xb6\x2c\x26\x61\x36\x89\x91\x27\xce\x66\xf2\xe2\x6f\x7e\xa6\x63\x6c\x39\x51\x32\x36\xb8\x6d\x50\xcd\x4d\xcb\xfa\x62\x3f\x82\xbd\xdf\x96\xe7\x54\x55\xd9\xc6\xf0\x59\xa1\x8f\x21\xeb\x98\x28\xa2\x9b\x68\xf9\xbc\x50\xdb\xd3\x82\x48\x0a\xc3\xdc\x85\x1b\xfa\x46\x11\x0e\xf2\x2d\xf1\x8d\x02\xdf\x73\xb1\xb2\x82\x23\x6b\x75\xf3\xb8\xe3\x81\xc9\x5c\xf9\x63\xca\x55\x7e\xc9\x60\x68\x07\xb6\x90\xde\x06\x71\xa2\xee\xf1\xa3\x81\xb4\x89\x06\x29\x74\x28\xdd\x02\x5e\x9f\xa2\x1b\x9a\xe0\xfb\x62\x88\x20\x93\xcd\x41\xbe\x8d\xc4\x67\xe3\x53\xe2\x18\x36\x0b\xe8\xb1\x13\xca\x0b\x4c\xd8\x47\xde\x3a\x14\xa7\x41\x56\x74\x52\x3b\xa8\xed\x25\xe5\x3f\xa8\xdc\xe5\xd5\xa9\x23\x73\x84\xb0\x7c\x68\xdb\x6d\x78\x8f\x1b\x9e\xf5\x6a\xd3\xb0\xad\x4c\x68\x67\x02\x8c\xc9\x0d\x9a\x8e\x08\x3c\x61\xd1\x40\xba\xe8\x51\x40\x96\x0b\x3e\x13\x07\xbd\x84\xa7\x29\xd7\xbe\x30\x3a\xf0\xf5\x24\x9c\xa6\x82\x88\xe3\x20\x9a\xa6\x90\x06\x17\xe8\xc6\x37\x4c\xe2\x28\x83\xfa\x4e\xb7\xe3\x41\xb3\xd7\xf1\x80\x67\x7e\x43\x69\xde\x09\xbb\x50\xd7\xe0\x84\x9c\xd4\xd0\xdb\xf5\x5f\x77\x3e\xff\xda\x6c\xb4\xf3\x19\xed\x45\x8b\xdc\x06\x29\x8a\x5a\x59\x12\x8c\xeb\xb9\x30\x9c\x2f\xc8\x7c\x20\x1d\xca\xdd\xc1\xeb\xd3\x30\x83\x09\x0b\x12\x6b\xec\x71\x22\x74\xc2\x20\xba\x08\xb9\x99\x23\x0c\x6a\xa4\x83\xea\x28\x0d\x03\x0f\x65\x7e\x3c\x1e\x33\xd1\x0a\x6f\x9d\x54\x16\x9f\xe0\x32\x20\x93\xbe\x1e\xa2\x9e\x2c\x7c\x42\xa4\x8b\xed\x27\x44\x55\x83\x4b\x39\x4b\x84\x9e\xe2\x7d\xfe\x35\x6d\xdb\x67\x8c\xeb\x86\x79\x78\xa3\x21\x1e\xcb\xce\x4f\xd0\x9e\x5a\x28\x35\xba\x83\x27\x75\x87\x66\xb7\x3c\x7e\x82\xb2\xa7\x3b\xc3\xbd\x1a\x05\x99\xf4\x2d\xa9\xa7\x0d\xb4\x83\xe7\x13\x88\x31\x49\x93\xba\xd7\x50\x0f\x73\x5b\x35\x27\x0d\xdf\xcb\xa1\xa6\x50\x90\xaa\x37\x05\x57\x5c\x16\x3a\xd9\xee\x4a\x38\x12\x4d\x43\x58\x53\x4f\xce\x58\xa0\x16\xe3\x04\xff\x03\xeb\xfe\xd2\xb2\xd5\xbd\x77\xc8\xb9\xfb\xd0\xfe\x35\xdd\xf6\x7e\x4d\xb7\x3f\xff\x9a\xee\xb4\xcd\xb1\x0b\x4f\xa6\x12\x1f\x19\xa5\xf0\x19\x1c\x9b\x99\xd3\x97\xe4\xb2\x92\xbe\x4d\x3f\x2e\x21\x2f\x31\xb0\xe9\x56\x9c\x34\x4f\x1a\x1e\x2c\x57\xb7\x7b\x72\xa2\x80\xe7\xfb\x57\x18\xee\x40\xb7\xd1\x38\x81\xbe\x05\xf1\xc4\x78\xe1\xe2\xb1\xc6\xec\x6a\x72\x79\x8a\x7d\x90\x42\x28\xc8\x70\x2d\xca\xab\x5b\x14\x85\x61\x7c\x85\xe9\x76\x73\x91\x5f\x88\x30\xf1\x24\xcd\xad\xc1\x38\x7f\xdd\xd4\x6e\xc3\xeb\x38\xcd\xec\x5d\x3a\x85\x84\x87\x73\xa5\x10\xc5\x89\x50\x22\x1c\x97\x45\xed\x30\x5a\x76\x9e\x95\x8e\x0b\x82\x39\xc5\x54\xdc\x31\x52\xb0\x6f\x24\x62\xa3\xf2\x2d\x80\x02\x99\x5c\xf0\x9f\x83\x6c\xf4\x56\x65\x6b\xb3\xe2\xe3\x5a\x71\x6a\xd4\x10\x3e\x08\x51\xce\x2e\x2e\x12\x7e\x81\x99\xcd\x58\x34\x87\xb3\x1d\x3a\x53\x35\xcf\x48\x9e\xe1\x1b\x13\x96\xf0\xa8\x96\xe9\x1b\x1f\x3e\xd0\x0a\x7d\xaa\x60\xf1\xd6\x45\xab\x0f\xdd\x0e\xec\xc0\xce\x03\xd8\x7f\x0a\xc7\x42\xfc\xed\x78\xb0\xf3\xe0\x04\xeb\xb4\x12\x3e\x98\xfa\xf6\xb3\x3d\xe6\xc1\xb9\xd1\x01\xc5\x8a\x66\xc7\xcc\x4a\x18\x42\x89\x24\x29\xdc\xea\x71\x6d\x47\xec\x02\x4d\x7b\x0b\x50\x72\xc1\x36\x43\x16\x20\xc0\xb9\xd1\xe2\xcb\xe8\x63\xd2\xfe\x58\x24\x62\xda\x44\x69\x14\xe8\x42\xe3\x45\xdd\xee\xdc\xd8\xaf\x35\x2f\x0b\x3a\xfe\x54\xa8\xa0\xd6\xca\xb9\x65\x46\xc5\xff\x7a\x70\x7c\xd2\x50\xb3\xf1\x83\x38\x6f\x5e\x61\x30\x03\xbd\x3a\xe4\x3e\x20\x17\x09\x1e\xf2\xe5\x29\x4d\x16\xd5\xc5\x81\x76\x46\x30\x72\x0b\x20\xcd\x8a\x09\x48\x6f\x7f\x6e\x95\xda\x73\x6e\xf3\xca\x67\xff\xd4\x99\xf3\x84\x6e\x45\xf2\x90\xcf\xb8\xaf\x5c\xee\x89\x03\xcd\xc2\x2d\xb9\x27\x2e\x2c\xdb\x78\x52\x52\x4b\xc8\x14\x59\xaf\xe7\xb2\xa3\x89\xda\x8a\xfb\x94\x3d\xe1\x12\x39\xb2\x98\xe3\x7c\x8b\x2a\xb0\x2d\x3a\xa5\xc2\x9e\xc5\xc2\x4d\xf3\xe8\x3d\x3f\x6d\x9a\x08\x66\x7d\x16\x33\x17\xff\xb7\xb3\xb0\x1a\x18\xae\xf1\x44\xdf\xf7\xd3\x20\xf7\x3b\x18\xf5\xd9\xe8\x2a\x64\x74\x60\x98\x77\xd0\x4f\x82\x73\x13\x0e\xd2\x7a\x32\x2e\xbe\x4c\x8a\xce\xda\xb7\x35\xe6\x52\xd7\xd2\xeb\xc8\xbc\x69\x36\x7a\xb5\x7a\xd3\x4c\xbf\x0a\x4e\x28\x05\x9b\xab\xb2\xe0\xfe\x29\xa6\x60\x47\x31\xbe\x21\xb7\xbd\x7b\x74\x70\x83\x82\x18\xde\xdf\xa1\x2a\x9a\xfd\xad\xc3\xc6\x8e\x3a\xb8\x74\x8a\xa9\xbe\x4d\xb5\xea\x93\x8e\x13\x7d\xce\x55\xe9\x1d\x0b\x50\x6e\x50\xfa\x72\xd6\x4d\x64\x8e\x99\x81\x76\x74\xe4\x0f\xe3\x93\x61\x62\x21\x41\xd3\x7c\xee\x9e\xe4\x4c\x24\x25\xbd\xb8\x81\x49\x96\xef\x66\x67\xb5\x6e\xb2\x78\x92\xef\x24\x0f\x26\xd7\x8b\xc0\x61\xc5\xb1\xe4\x62\xbb\x2c\xdf\x4f\x71\x30\xfa\x95\x8a\x66\x5f\xe3\x9c\xf2\xc7\x5f\x12\x7d\xb5\xa1\xf0\xe4\x0b\xa3\x23\x79\x15\x5b\xf5\x06\xbc\xe0\x19\x67\xfb\x45\x15\xbe\x7d\xfe\xbc\x6c\x40\x33\x7d\xf2\x70\xe2\xa1\x05\x69\xce\xf1\xc7\x8e\x4b\x94\x70\x7c\x5a\x20\x6f\x48\x09\xc0\x45\x8c\x91\xd2\xd1\x9f\x6a\x4a\x2f\x0a\xd4\xd9\x3d\xe2\xb3\xcc\x85\xce\xec\x28\x4d\x0a\x82\x8c\xce\xa4\x23\x1b\x59\x11\x7c\x75\xb6\x62\x8a\x9b\x85\x09\x11\x74\xc0\x2a\x74\x87\x3c\x4f\xe2\x8f\x3c\xb2\x5d\x2d\x8b\x6e\x87\xc8\xe0\x45\x07\x43\xc9\xe9\x65\xf4\xcd\x93\xb0\xcc\x3b\xf1\x8f\xf1\x8f\x2c\xef\xb9\x38\xff\x60\x8f\xd0\x88\xef\x9c\x1f\xdd\x24\x09\xe2\x24\xc8\x96\x8f\x9f\x88\xee\xdd\x32\xd1\x9e\x14\x0c\x49\x30\x66\xc9\xbc\x0f\x16\x1f\x63\x49\xde\x33\x1c\x72\xa1\xcf\xe5\x45\x95\xae\xa5\x9d\x08\xac\x1b\x30\xf3\x11\xbe\xb1\xc6\x63\x97\xdf\xbb\x07\xda\xbb\x84\xa7\x3e\x9b\xa0\xea\xac\xa3\xbc\xba\x4e\x07\xb9\x67\x77\x85\x5e\xbc\xf2\x4e\x72\x5a\x98\x91\x5a\xee\x23\xb7\x4f\xd7\x9e\xfd\xfc\x80\x2e\x2b\xa4\xf6\x2a\x73\x13\xa3\x69\xcb\x25\x97\x2e\xab\x22\xd8\x98\x99\xb7\x96\xa5\x9e\x44\x65\x77\xa0\x15\xd4\x56\xb0\x6e\x20\xf6\xd3\x4d\x13\xdb\x3c\x6d\xd4\x18\x54\xd0\x1a\x9a\xb6\x6b\xa6\x3b\x4c\xb9\xcb\x50\x60\x2f\x1d\x18\x91\x8e\xb8\x8d\x15\x26\x49\xe1\x90\x9b\x23\x1d\x9a\x29\xae\xf0\x24\x2d\x4c\x90\x75\x87\x6d\x1e\xef\x8b\x29\x58\x70\xf7\x2d\xa6\x4b\x2e\x11\x9c\x31\x3d\xff\x35\x7b\x2b\xcd\xfb\x80\x28\x49\x81\x8b\x8f\xee\x70\xeb\x8e\xfb\x86\x3e\x1b\x95\x3b\x94\x58\x6b\xf8\xaf\x2d\xd7\xac\xbd\x51\x30\xcc\x72\x2e\x19\xd5\x9a\xfa\xde\xaa\x4a\xb3\x64\x10\xd1\x89\xed\xf0\x54\xe1\x44\x6e\x45\x42\xc1\x26\xf9\x86\x41\x0a\xe9\x84\xfb\x38\x0c\xaf\x2c\xb6\x08\x86\xc9\x73\xda\x38\x11\x86\x96\x38\x5f\x2c\x75\x78\x30\x95\x17\x1e\x47\x2c\xff\xc9\x9c\x9b\x88\x79\x54\xe6\x2e\x95\x0a\x2b\x7d\x6e\xa1\xdd\xe0\xfc\x71\x5b\xf7\x0f\x6b\xae\x8e\x72\xe1\x52\x81\x12\xb4\xf5\xcb\x44\x09\xbd\x82\xce\x7b\x57\x28\x12\xf1\x68\xb0\x7c\x2b\x27\xaa\x80\x73\x53\x5b\xea\x30\x42\x96\x97\x6b\x89\xfc\x12\x6e\x64\x4a\x84\xd8\x63\x3c\x76\xf9\xe5\x66\xbf\x90\xff\x76\xb6\x85\xb5\x65\xc4\x28\x18\xd8\x39\x34\x56\x0f\x9b\x24\x00\x08\x66\xcf\xe9\xf7\x37\x07\x4e\x4a\xf8\x50\xc6\x14\xae\xf2\xd7\xb7\xd4\xcd\x2f\x12\x89\x3a\x8f\x32\x6d\x33\xad\x9c\x66\x29\x03\x84\x60\xd0\x4d\x5a\xdb\x4a\x5b\xc3\x03\xe1\xe7\xcf\x6a\x24\x74\x7c\x94\xca\x05\x79\x80\xdb\x5f\x45\x65\xf5\x51\xc2\xb1\xbe\x52\x75\x05\x98\xbc\xd4\xb5\x79\xfd\x00\xcf\x0c\xd3\x28\xe2\x3e\x4f\x53\x96\xcc\x31\xa8\x11\xf3\xc5\x2f\x81\xdf\x65\x90\x06\xe7\x41\x18\x64\x73\x18\x31\x0c\x96\xe4\x63\xc4\xc7\x81\xf6\x35\x40\xba\x8d\x50\xc4\xec\x93\x9d\xf7\xe6\xc7\x1e\x56\x1b\xcb\x32\x9c\x8b\xbb\x78\x5c\x9b\x35\xe3\x69\xd6\x8c\x87\x4d\x43\xb7\x9a\x95\x51\x38\x77\xe7\xbf\xe9\xa1\xe4\xd2\x07\x2d\x33\x16\xcb\xda\xbc\xf4\x60\x74\x9b\x3f\x49\x7a\x7c\xb5\x3a\x06\x3a\x83\x7c\x69\x1d\xe3\x4f\x0a\x5e\x85\x21\x0b\x16\x46\xae\xaa\xbe\x79\xc7\xed\x76\x7a\x8e\x4e\x6e\xaf\xe4\x5b\x2b\xe3\x43\xba\xf8\x02\x7f\xdf\x80\x91\x3b\xa3\xc2\x25\xaf\x12\x9c\x38\xd1\x7b\x1c\x30\x78\xd4\xc8\x61\xf0\xac\x04\x5e\x41\x5f\x38\x81\xbe\x13\x7c\xc5\x9e\xcd\x25\x1e\x16\x2e\x13\xb8\xc8\xb6\xca\x54\xac\x25\xc5\xc0\x5a\xb0\x7b\xc0\x99\x3f\xb2\x6c\x25\x26\xec\x85\x65\xbd\x26\x83\x0a\x06\x2e\x60\x69\x8a\x71\x15\x64\xfe\x9b\x20\x4b\xe1\x6c\x18\x9d\x99\xbc\xfd\x26\x90\xc4\x87\x11\x4f\xb9\x06\x63\x92\x98\xf8\x2c\x0c\xc9\xaf\x0b\xfb\xa6\x35\xe8\x49\xa3\x0d\x67\x51\x4a\x37\x82\xf3\x78\x8a\xb1\xdd\x04\x28\xb4\xea\xa8\x30\x5b\x94\x19\x73\xc2\x93\x61\x9c\x8c\x59\xa4\x5f\xa8\xea\x60\xf6\xfa\x93\xcf\x31\xd6\x43\xc8\x23\xee\x7f\x4c\xf5\x8b\x7c\x3d\x32\x45\x8e\xef\xa2\xdc\xd2\x17\x74\xfb\xaa\x04\x89\x8d\xd0\x92\xc2\x24\x3f\xe7\x14\x83\x64\x12\x4e\x31\x2d\x91\x8a\x9c\xcb\xc2\x8c\x53\x2a\x79\x1d\xd5\x2c\xc6\x98\x24\xca\xb0\x93\x5a\x33\x6a\x12\x5d\x4c\x53\x8e\x6e\xbe\x1c\x2f\xa8\x9f\x58\x31\x6d\xf1\xd5\x03\xc5\x44\x57\x31\x14\xce\x59\x1a\xf8\x9a\x11\x58\x18\x50\xec\xe7\x6d\x15\x67\xf7\x7c\x2e\xbd\x13\xce\x13\x96\xcc\xd5\x34\xfd\x98\x62\x6a\x52\xe4\x03\x8a\x51\xa5\x5e\x55\x38\xe9\xbd\xce\xf0\xe0\x7d\xe6\x11\x1b\xa2\x8f\x58\x8c\xe9\x82\x88\x27\xc9\x3d\xec\x40\x62\x42\x9e\x40\x76\xc6\xbf\x84\xbb\x53\x20\x99\x4f\xbb\xa5\x64\x57\x9c\x7d\x54\xc1\x7e\x85\x92\x43\xef\xa0\xed\x78\xbd\x14\x78\xc3\x50\x80\x8e\x00\x48\x7d\xb0\xd7\x9c\x22\x39\x1d\xd4\xac\x78\x71\x2a\xd4\x08\x66\x74\x8e\x13\x71\x02\x50\x71\x0c\xb5\x18\x22\x58\x2a\x0d\x9f\x9a\x12\x70\xb2\xcf\xb2\x41\xee\xb1\x56\x49\x44\x9d\xc2\x3a\x95\x20\xc4\xc2\x3f\x47\xe7\x1c\xe0\x01\x52\x89\x22\xd9\xd0\x4d\x3d\x85\xde\x68\x51\x6d\xb3\x07\x5b\x54\xc0\x0f\xb8\x6d\xe1\xdf\xed\x2d\xa0\x71\xf6\x95\x92\xb2\x8d\x7e\x77\xf1\x04\x3e\xd1\x95\xf0\x35\x59\x4c\xf6\xbb\x9d\x0e\x34\xe1\x25\xfa\x26\x28\x0a\xd9\x41\xf1\xd1\xfa\x18\x0f\xe5\xc5\xac\x18\x15\x02\x97\x06\x97\x3e\x74\x3b\x32\xf2\xbc\xd5\x83\x8e\x7b\x21\x9f\xee\xef\x63\xb8\x8b\x26\xfc\x3c\xa2\x00\x7e\xce\x6d\x9f\x79\xe1\x2f\xc6\x1a\xc5\x99\xea\x40\x96\x52\xca\xf2\x42\x1f\x46\x76\x5c\xab\x06\xc3\xa8\x4f\x83\xde\x42\xe3\x9d\xcd\x04\x1f\x90\x53\xa5\x8b\xa3\x23\x6d\x89\x1b\xac\x05\x07\x14\xa1\x66\x84\xf3\xcf\x66\x41\x4a\x64\xd7\x33\xa5\xc2\x7e\x38\x49\x45\xc9\x3f\xa4\x4f\x95\x9a\x70\x36\x99\xe1\xcc\x89\xd2\x90\xa7\xa9\xe7\xc4\x1e\x62\xa9\xf4\x54\xd1\xd5\xff\x4e\xf3\xfc\x77\xb1\x8e\x26\x3c\xf1\x79\x94\xb1\x0b\x0e\x09\x0f\x59\x16\x5c\xea\x64\xb2\xd2\xff\x40\xb2\x55\x59\xae\x04\x09\x6e\xb2\x0a\x9c\x7c\x02\x44\x09\xe4\xf2\xea\xcc\xc3\xa8\xad\xca\xf3\x97\xbc\x04\x95\xdb\xb9\xac\x34\xca\x57\x92\xce\x88\xba\x16\x55\xfd\x2e\x4e\x54\xaf\x18\xe2\x4e\x9c\x70\x39\x2d\x97\x31\x7a\xeb\xcd\x30\x96\xb1\x8b\xa6\xd9\xa3\x1d\x4c\x9d\xa5\xf3\x21\xb7\x6b\x49\xc7\x38\xc7\x11\x92\xc2\x32\x09\x02\xcb\x28\x44\x9e\x4d\x05\xb5\x2d\xca\x28\xab\xdb\xea\xb1\x41\x0b\x5e\x46\xe4\xf8\x1d\x0f\x65\xa8\x2a\x84\x41\x01\x8a\x3c\x08\x32\xbb\xa9\x1c\xb7\xcd\x2b\xbf\x60\xd6\xe7\xc8\x88\x63\xe5\x81\x47\x66\xd6\x3a\x4b\xe1\x8c\xee\xce\x09\x30\x5d\xa0\x9f\x35\x3c\x72\xd7\x73\x5d\xf8\x08\xa4\x68\x22\xab\x49\xbf\x2d\x94\xde\xcc\x38\xec\x09\x01\x52\x8f\x13\x8c\x96\xd4\xb0\x1d\xdb\xd2\x1c\xd9\x38\x84\x2c\xcb\x68\xfd\x31\xcb\xdd\x4d\xa5\xa6\xb6\x12\xef\x85\x9c\x91\x83\x9a\x90\xd4\xd3\x54\x6d\x94\x72\xf4\x04\x90\x12\x93\xe2\x5d\xfe\x65\xcf\xe9\xea\x40\xbf\xaf\x0b\xe7\x48\x35\xb5\x80\xd4\xc3\x3b\x99\x4f\x5f\x2a\x75\x58\x70\xce\xb3\x2b\xce\x23\x18\x04\x43\xe4\x71\xe2\x27\xb9\x12\xe1\x4d\x8c\x0e\x22\x2c\x83\xf1\x34\xcc\x82\x49\x18\xf8\xcc\x00\x12\x74\x49\x55\xcc\x2f\xb1\x6d\xe9\x24\x2d\xf6\xe4\xfc\x54\x16\x15\x0b\x67\xff\xec\x8c\xfe\xe8\x76\xe8\x7f\x6b\xdd\xce\xdf\x6b\xfa\x4f\x0f\xba\x1d\xf3\xeb\xef\xee\x4f\xd8\x01\xa7\x32\x34\xe1\xc1\xe5\x08\x76\x60\x57\x17\x36\xbb\x9d\xc9\x0c\x76\x44\xb9\x07\x0f\x26\x33\x68\xc2\x43\xf5\x51\x77\xfd\x14\xb6\xb7\xdf\x7c\xbb\xbd\xdd\x87\x97\x14\x9f\x6c\xc0\xd3\x80\x22\x75\x53\xc2\x1a\x75\x68\xc8\x62\x47\x55\xc0\x08\x93\xd2\x73\x57\x50\x87\xcd\x75\xa6\x91\xb1\x7a\x9a\xaf\x7a\x50\x1e\xae\x41\x52\x76\x51\x38\x8d\x86\x71\x92\x4d\x23\x96\x71\x31\x6b\x02\x07\x9c\x6e\x0a\x53\x19\xab\x14\xe4\x65\x51\x58\x5a\xaa\x87\xd7\x71\xc2\x69\x6f\x0d\x52\x38\x16\xdb\x23\xc5\x28\x12\x02\x20\x4d\xa7\xfc\xa4\x3e\xca\xb2\x49\xda\x6f\xb7\x2f\x82\x6c\x34\x3d\x6f\xf9\xf1\xb8\xfd\x1d\xff\xfd\xa7\x84\xa5\x19\x6b\x4f\x94\xb2\xd3\xc6\xda\x69\x7b\xf7\xd1\x6e\xc3\x9a\xc1\x65\xb7\x41\xa2\xd5\x8d\xfb\x60\x6f\xcd\x7d\xb0\xf7\x75\xed\x83\xd2\x0b\x23\x5f\x3b\xef\xab\xa3\x7d\x74\x40\x8b\x85\x5b\xfa\xe9\x80\xa2\xb7\xa1\x78\xa7\xb8\x0f\x17\x94\x31\x15\xa2\xd3\xda\x88\xec\x00\x9d\x3a\xf9\x10\xc4\xd3\x4c\xa7\x6a\x94\x66\x8c\xb9\xbd\xa0\x0f\x22\x48\x7d\x1e\xb1\x24\x88\x81\xcf\x82\x34\x4b\xe1\x6a\xc4\x93\x7c\x0c\x8c\x20\x4b\x79\x38\x54\x91\xbf\xc5\x22\x90\xa3\xb2\x82\x09\xd8\xd2\xeb\x67\x99\xc9\x87\xcd\x85\xe8\x1a\xb1\x14\xee\xd2\x25\xda\x20\xd7\xea\x2e\xfc\xd7\x7f\xfe\xdf\x62\xe6\xf0\x05\x86\xaa\x74\xd7\xd5\xf3\xe4\x62\xc0\x5d\xe5\x8a\xf2\x5c\x10\x9f\xf9\x18\xe6\xce\x62\x0b\x49\x8b\x74\x84\x8a\x30\xa9\x84\x7d\x6b\xb8\x4d\x18\xf0\x4c\x1c\xdf\x64\x4c\x44\x7b\x8c\x94\x7d\x12\xf7\xd5\xbb\x59\xc2\x26\x02\x0f\x28\x0c\x53\x6c\x33\x0a\x56\x20\xb4\x5d\xd5\x59\x70\x11\xc5\x89\x4b\x68\x04\x29\xc7\x44\x92\xc3\x51\x8e\xef\x5a\x88\xfd\x3c\xe2\x11\x9c\x95\x5c\x34\x9e\x99\xbc\x5d\x56\xda\x2e\x6b\x66\x52\xcb\x53\x80\x60\xa9\x39\xa7\xcc\x47\x06\x71\x3b\x3f\x97\x90\x4a\xea\x25\xbc\x0c\x05\xa7\xdd\x0d\x42\xce\x2e\x39\xc9\x8c\xdc\xe0\x9d\xe0\xfa\x92\x56\x2c\x13\x04\xb5\xb2\x8c\x0f\x2e\x78\x41\xd7\x6a\xdd\x42\x02\xe5\x2c\xb2\x37\x8a\xa2\xdd\x35\x45\xd1\xee\xd7\x25\x8a\x72\xc3\xd7\xcd\x94\xd0\x91\xad\xe5\x9b\x9b\x63\xe5\xdf\xb0\xaf\x0c\x54\xea\x85\x08\x99\x99\xf4\x4b\xe5\x13\xd5\xfe\xad\xc5\x09\x59\x32\xb7\xa5\x8a\x66\x0c\xa3\xa8\x67\x68\x15\x91\x9d\x08\x4e\x38\x9f\xab\xd7\x7c\x9e\x82\x98\x8d\x78\xe4\x99\x94\xc3\x1a\x8a\x3c\x28\xea\x30\x9e\x26\x6c\x26\xee\x83\x05\x3f\x8f\x33\x47\x2c\xaa\x81\xf5\x0b\xa6\x37\x13\xf9\x51\x0d\xae\x8a\x48\x8a\x51\xa4\x6f\xc9\xfe\x03\xf5\xfd\x60\x8c\x71\xa5\xe3\xa1\x7a\x6d\xe6\xf2\x0d\x83\x71\x10\x05\xe3\xe9\x58\xec\xdc\x19\x59\x66\xa4\x8e\xe5\x2e\x0c\x05\x4f\x3d\xec\x91\xcb\x8c\x8c\x43\xec\x23\x4f\x0b\xd1\xd6\x85\x4c\x64\xe1\x15\x3a\xf0\x42\x18\x64\x59\xc8\x15\x7a\x0a\x98\xdd\x95\x58\x55\xa9\x3a\x5e\xcb\x17\x2b\xd2\x67\x5e\x13\x8a\x5a\xf7\xe1\x41\x15\x19\x68\xff\xfa\xec\x24\x45\x2e\x50\x7f\xbf\x96\xfa\x49\x1c\x86\xe4\xff\x53\x53\x20\xac\xd8\x1d\x48\x24\x69\xfd\x50\xcc\xef\xa9\xa3\xf8\x99\xdd\xfa\xcc\x13\xc7\x82\x68\x10\x5f\x9d\x69\x2e\x39\x53\x67\x1e\x54\xdf\x59\x44\x46\x7f\x65\x22\x70\x46\x54\xc0\xad\x0f\x05\xe4\x6e\xda\x29\x1d\x1b\x5c\x4e\xda\x5b\x29\x17\xd2\x8c\xcd\x21\xe2\x2c\x41\xeb\x1e\x1a\x5c\xa4\x54\x52\xb9\x73\x85\x54\x14\x2b\x41\x60\x7c\xc1\x26\xce\xec\x64\x57\x71\x0b\x0e\x67\x13\xee\x07\x2a\xd1\xe1\x70\x1a\x8a\x9d\x29\x32\x19\x2c\x20\x90\x10\x95\x90\xc0\xe7\x70\x42\x45\x94\x06\x22\x96\x22\x9e\x01\xc5\xe0\x88\x03\x2a\x2d\xcd\xef\xd7\xb2\x2c\x20\x89\x60\x8c\x28\x9c\x03\x3b\x57\x39\x7e\xe9\xf5\x99\x38\x1d\x92\x12\x8a\x7b\x71\xa6\x35\x51\xa5\xf7\x52\x80\x58\x0c\x09\xbe\x55\xe0\x38\x37\x2b\x40\x25\x0a\xcb\x4a\x73\x3b\x32\xc4\x8d\xa2\xfc\xfe\x9a\xa2\xfc\xfe\xd7\x25\xca\xed\xb1\x97\x19\x59\x6c\xb7\xbf\xc0\x18\x39\x65\xf2\x5e\x2e\x73\x87\x28\xe9\x98\x33\x40\x48\x1e\x27\x58\x8a\x81\x82\xd4\x56\x02\xed\x69\x2d\xa6\x12\xcf\xad\x84\x02\x87\xb9\x66\xba\x78\x2a\x4e\xbf\xf8\xa6\x57\x09\x70\x17\x3b\x4c\xaf\x62\x22\xf6\x8c\xe2\x2b\x18\xb3\x48\xaa\x26\xf2\xa9\x51\x3c\xb4\x12\x48\x50\x00\x35\xb4\xa9\xe6\x6c\x46\x42\x46\x46\x31\xf0\xe1\x50\x3e\xde\x8b\xe2\x7c\x6f\x94\xd7\x12\x8f\xf4\x2b\x32\x24\xc2\xb9\x91\x13\x1f\xac\xc9\x89\x0f\xbe\x2e\x4e\xa4\x70\xf4\xf9\xca\x65\xfb\x02\x57\xbb\xc1\xf1\xac\x89\xad\x4e\x6a\x18\x87\x57\xe6\xdb\x89\x29\x57\x8e\xce\x9c\x4f\x12\x4e\xa1\xa6\xa5\xb5\x69\xbc\x84\xa8\xd6\x71\xbb\x88\x13\x6b\xa9\x65\x8f\x42\x51\x8a\x91\x30\x58\x42\x27\x78\x79\x30\x97\x29\x4b\xd0\x96\x52\x2a\xa1\xe8\xa3\x74\x5e\x48\xa5\x65\xd9\xd5\xad\x2c\xdb\xa6\xcc\xe3\x85\xc1\x3e\xdc\x3c\x52\x36\xb4\xed\xed\x37\x47\x1f\x0e\xfb\xdb\xdb\x39\x9f\x5d\x5c\x2a\x68\xb3\x4c\xa6\x13\x12\xc5\xfe\x34\x21\x4b\x0c\xb9\x7c\xf8\x73\x3f\xe4\xda\x0e\xa4\x10\x27\x1b\x7a\x90\xc9\x13\x05\x2d\x9d\x54\x27\xf5\x73\x89\xa3\xaf\x47\x57\xe3\x77\x01\xe0\x46\x76\x7f\xb8\x26\xbb\x3f\xfc\xba\xd8\x5d\x8c\xf9\x06\x65\x48\xea\xcf\xea\x1a\x69\x9f\x22\x3c\xd9\x27\x7b\x7d\xc3\xa4\x08\x42\x4e\x08\x15\x9c\xda\xca\x5d\x4b\x60\x1a\x5a\x52\x7c\xd0\xe0\xe3\xc1\x99\x0e\x11\x8a\x3f\x72\x71\x8e\xa5\x56\x64\x3f\x9c\x77\xde\x64\x07\x03\x05\xcf\x8a\x65\x5d\xc7\x7a\x74\x05\xc7\x42\x3b\xb4\x76\x4e\xa1\x92\x43\xb1\xa3\x32\xaf\xa4\x2f\x7f\xc8\x1d\x21\x29\x24\x2f\x32\xed\x28\x90\x1c\xab\x55\xd5\xa5\xb4\xfb\x4d\x29\xad\x4a\xab\x74\xa6\x4e\x6d\x71\x94\xcf\x18\x31\xb6\xb8\xd9\x3a\xd7\xba\x5b\xaa\xda\x3a\xed\x93\x8d\x33\xec\x88\x5f\xa2\xac\x50\xa9\x50\xd4\x89\x5b\x82\x51\x01\xbe\x8b\xe7\x83\x3a\x9f\xf9\x7c\x82\xeb\xdc\x4d\x5a\xa7\xd9\xbe\x71\xa3\x06\x6c\x8f\x74\x29\xed\xd7\x36\x12\x85\x3a\x63\x32\x16\xa3\x88\xa8\xbc\x19\x91\x12\xe6\x5b\x73\xd4\x53\x2a\x6d\x4e\x63\x91\x76\xcd\x41\xd1\xc6\x50\xa0\x91\x31\x2b\xac\xab\x51\xe2\xaf\x1b\x25\xda\xa3\x35\x25\xda\xa3\x65\x24\x1a\x7a\x04\xdd\x5e\xa4\x61\xf3\x65\x65\x9a\x22\xc2\x4d\x53\x3f\x52\x66\x3f\x35\x1d\xb4\x83\x96\x68\xf2\x02\x43\x97\x83\xa5\xb2\x46\x0d\x2d\x13\x9f\x56\x07\x53\x9e\x01\x83\xb3\x12\x0f\x29\x2b\xb9\xaf\x5c\x76\x3e\xd3\xa7\x0b\x17\x39\x29\xdc\xec\x14\x87\x37\x20\xac\x4e\x50\xe2\x9c\x13\x0f\x6d\xcc\xbe\xc0\x56\xbf\x34\x23\x8a\xc1\xdc\xc8\x87\x8f\xd7\xe4\xc3\xc7\x5f\xd7\xce\x3a\xa2\xa5\x9c\x63\x42\x99\x61\x2b\x95\x8e\x01\xf3\x50\x5e\x38\x29\x51\xc0\x26\x93\x30\x30\xa6\x42\xf7\xc4\x21\x4a\x2f\xb8\xd2\xe6\xb4\x77\x88\x39\xc7\xd8\x93\x6c\x2e\xb3\x4a\x34\x30\x31\xb8\x2c\x9e\xfa\xf4\x5c\xfa\xc5\xd1\x6b\xb4\x4a\xa1\x85\x79\x92\xf0\x09\x4b\x6c\x0c\x65\x7f\x69\x4c\xe0\xce\xf0\xaa\x08\xf3\x85\xe5\xae\xbc\xe9\x0e\x29\xc8\x5a\x74\x62\x93\xa1\x30\xa4\xbb\x3a\x9d\xf8\x09\x54\x20\x2f\x40\xc5\xc9\x5b\xa9\x6f\x09\x47\x31\xe8\x82\x97\x0b\xc0\x9f\xa6\x59\x3c\xc6\x48\x45\x48\x08\x04\x6a\x0f\xd6\x3d\x21\x8a\x53\xd1\xd9\xe3\x07\x9d\x33\xbc\xd7\x24\x3f\x12\x79\xef\x80\x12\x3f\xa0\x10\xd5\xe7\xcc\xff\x88\x72\xde\x8f\xc7\x13\x96\x49\x47\x4a\x63\xd3\x40\x6b\x1f\xbe\xb9\xbf\xe4\x09\xdd\xfc\x99\x14\x1f\xbf\xa5\xd2\x9e\x91\x39\x4c\x94\x12\x37\x62\xe6\x66\xe9\x32\x04\xe4\x51\x25\x75\xa2\x20\x92\x21\x3f\x61\xcc\x7e\x8b\x13\x07\xb4\xeb\x2c\xb3\xb2\x39\x58\x26\xb1\x43\xd2\xdd\xbc\xda\x1e\xac\xb9\xda\x1e\x7c\x55\xab\xcd\x1e\x7b\x95\x9e\xa4\xd1\xcb\xe5\xf1\x47\x34\x55\xdd\x97\x43\xea\x57\xac\x07\x74\x86\x12\x48\x0b\x01\xbc\x3b\x00\x9d\x41\x9f\xc9\xe8\x7b\x7a\xe9\xd9\x5e\x04\x0a\xd2\x91\x8a\x84\x64\xae\xf4\x75\x7e\x09\x93\xcf\x89\xee\xff\x8d\xe7\x92\xab\x8e\xe6\x30\xcd\xd1\x24\x37\xbe\x54\x5e\xbe\x1d\xcf\xf6\xb5\xbd\x57\x55\xf9\x99\xae\xac\x62\x60\x91\x3f\x92\xbb\xc8\x3f\xc8\x3b\xa2\xae\x73\x28\xc5\x09\x61\xd6\x68\xc1\xc1\xbf\x1f\xc0\x3f\xd4\x95\x1d\xc5\x27\xd4\x03\x7b\xae\xb4\xfb\x20\x95\x79\xae\x92\xdc\xb5\xd2\x05\x1a\xf3\x22\x60\x30\x08\x12\x4e\x36\x0c\x73\xe5\x8e\x37\x4b\x26\x63\x97\x35\xdc\x99\x89\xf3\xb9\xcc\x20\xc9\x2f\x74\xd1\x10\x7f\x51\x43\xcc\xbb\x59\xc8\x21\xfe\xf2\x45\x87\xa8\x32\x94\x59\x23\x9c\xeb\x4c\xa6\xc5\xbd\xe1\x00\x65\x3f\x71\x9c\xe4\xe7\x81\x4a\xfe\x5f\xba\x1f\x38\xd7\x94\xd2\x13\xee\xc5\xd1\x6b\x18\xb3\x28\x98\x4c\x43\x2b\x43\x59\x18\x8c\x83\x4c\x6d\x2b\x96\xa8\x94\x92\x5a\x8b\x67\x25\x99\x09\xa6\x6d\x7a\x15\x67\xf6\x0b\x8c\x14\x69\x9c\x05\x03\x8c\xe9\x02\x0c\x86\x09\x1b\x73\xa1\x17\x60\xdc\xbf\x80\x5f\x29\x31\xa6\x2c\xb8\x52\xa8\x4a\x58\x03\x1e\x62\xd8\x18\xed\x48\x58\x44\x1a\xcd\xba\xe5\xdb\x99\x4c\xad\x66\x3c\x05\xac\xf1\x78\xda\xbb\x34\x67\xd6\x2e\xf3\x45\x12\xdb\x04\x99\xf5\xe4\x22\xa6\x4b\x44\x38\x53\x71\x7f\xce\x94\x06\x64\x86\x2c\xb6\xb9\x01\x99\x9c\xc5\x78\xef\x58\x18\xfe\x9b\xe8\xb5\x14\x2b\x72\x1f\x21\xe1\x2a\xf0\x8b\xaf\x50\x78\x30\x7f\x14\x70\x69\xc0\x24\x47\x8c\x81\xb4\xe4\xdd\x46\xfa\x9b\x6d\xf3\x46\xd9\xff\x64\x4d\x4d\xeb\xc9\xd7\xa5\x69\x99\x91\x17\x5a\x7c\x27\x7d\x53\x75\x7d\x72\x21\xb5\xdb\x1c\x61\x49\x51\xdc\x58\x9e\x4b\x69\x20\x54\x6b\xb9\x53\x43\xb7\xd5\xed\xb4\x3a\xf2\x20\xa7\x02\x7b\x93\x93\x92\x60\x1e\x7b\x27\x3a\x73\xb3\x7d\xff\xff\x6b\x2b\xd2\x69\xba\x28\xf4\xa3\xc9\x3d\x85\x3e\x91\xc6\xb1\xf9\x4c\xc6\x99\x74\x43\xab\xe3\x45\x91\x5c\xfe\x41\xa4\x47\x62\xee\xce\xf4\x9a\x43\x8f\x74\x2b\x36\xfb\x05\xcf\x60\xc2\x52\x7d\x05\xa0\xbd\xa0\x23\xad\x36\x9f\xc5\xd1\xf3\x84\xa3\xe3\xb6\x74\x1c\xfe\x51\xfa\x71\xfb\x2c\x0c\x85\xde\x97\x1a\xc7\x5f\x30\xa8\x6e\xa9\x19\xc2\x39\x75\x9e\x9c\xe8\x67\x54\x38\x3c\x47\x06\x62\x71\xae\xa9\x72\x84\xc9\xbd\x09\x30\xaf\x38\x2c\x45\x5f\x45\xf7\xaa\x06\x50\x48\xff\x64\x01\x52\xdf\xc2\xb9\xb6\xaa\xc4\x94\x01\x2f\x07\x51\xf3\x9c\x93\x0e\xe0\x83\x58\xa6\xc1\xd0\xbe\x74\x3d\xe7\x3c\xd2\x79\x4b\xcf\x65\x3a\x01\xc3\xc8\x0b\x80\xe2\xa1\x55\x41\x2c\xbf\x4b\xa1\x93\xb4\x7b\x36\xf5\xd4\xee\x93\xc5\xf0\x31\x8a\xaf\xa4\x0d\xa5\x70\x42\x6f\xe5\x3a\x77\x2c\x5e\xc5\xd4\xb7\x6f\x8a\xe6\xf7\xf3\xb9\xfc\xa3\x62\x38\xce\x8c\xcb\xad\xf7\x20\x9a\xe3\xaa\xd3\xb5\x14\x99\x51\xdf\x58\x78\x70\xc3\xe5\xc6\xf1\x94\x40\xab\xf7\xdf\xd8\x25\x7b\x8f\xbe\x4d\x10\xc5\x63\x1e\xf9\x21\xc3\xb3\x40\x9d\x5f\xb4\xe0\x8c\x2e\x1a\xbf\x95\x19\x3e\x17\xa1\x86\x83\x78\xbf\x36\x7e\xf2\xb6\xe3\x4b\x61\x69\x99\x0f\xd5\x33\x5a\xd7\x8c\x68\x9b\xff\xaa\xc1\x28\xa7\x44\xb1\xf0\xac\x47\xaf\x08\xac\x10\x0c\x08\x17\x3c\xcd\xb1\x64\xb9\x34\xcf\x36\x65\xc0\xd5\xdb\x1b\x14\x87\x9e\x94\x85\x9e\x72\xd9\xf5\x4c\xd0\x70\xe5\x35\x7b\x33\x44\x83\xd2\x06\x81\xd2\x5d\x51\x51\x6a\xab\xe7\x5d\x74\xcf\x4d\x66\x75\x72\xcf\x54\x0c\x90\x53\x4e\x3b\xce\x5b\x92\x17\x64\xbd\xd4\x2f\x59\xd4\x8d\xa1\x60\x17\x4b\xf9\x89\xa3\x34\x4b\xa6\x7e\x16\x27\x85\xe7\x40\xca\xa0\x2f\x9f\x70\x44\x56\x36\xf3\x33\x09\xf5\x4c\x67\x73\x74\xcf\xd1\x16\x28\xeb\x0d\x08\x86\xfe\xa6\xa7\x4c\xa9\x38\xf8\xcf\x51\xe8\x8b\xa5\xbc\x9b\x0c\x0c\x24\xb3\xb1\xe8\xd0\xaa\x29\x1b\xa3\x38\x26\x5c\x05\xe3\xaa\x97\x4e\xea\x61\x8d\x74\xcf\xc5\x7c\xb5\xe8\x1c\xbb\x0d\x11\xbf\x92\x28\xd5\x13\x3e\xc4\x07\xd2\x9e\xd0\xa3\xb6\x01\xcc\x1e\xd3\x57\x25\x65\xbe\x57\x39\x6b\x25\x5c\x53\x55\xfc\x9f\xeb\x86\xd5\x95\xcc\x14\x2b\xe7\x37\x9f\x46\xb6\x2a\x01\xac\x9c\xa2\xc2\x33\x94\xb7\x85\x0b\x96\x2d\x5b\xd3\x90\x64\x36\x57\x21\x56\x8a\x4f\x7d\x4c\xd4\x4a\xa4\xfe\x64\x1f\xc4\xec\xde\x94\x3a\x87\x83\x4f\xa1\x9e\xf0\x94\x72\x91\xa3\xd3\x49\x43\xa6\x43\xc6\xec\xab\xe1\x5c\x51\x64\xab\x54\xf5\x21\x10\x87\x96\xba\xa8\xd1\x70\x3e\x29\x65\xd0\x46\xc3\xce\x76\x2a\xcf\x03\xda\x47\x64\x9a\xc5\x42\x97\xa0\x4c\xc7\xe4\x3e\x9e\x37\x9a\x9a\xe3\x8d\xaf\x74\x90\xb3\x01\x4f\xb3\x24\x9e\xab\xa7\x5e\xad\x72\xa4\x09\xde\x51\xf4\x82\x6a\x93\x5d\x5b\xe3\x9d\xfb\xaa\xed\xd6\x8e\x05\x50\x6a\x20\xea\xb9\x9c\x76\x81\x91\xf8\x05\x29\xf8\xa8\xbb\x0c\x1c\x17\x4f\xfb\x8a\x41\xfb\x3b\x42\x14\x37\xe3\x89\xeb\x15\x4f\x6f\x83\x8b\x0a\x0a\xad\x8f\x33\x47\x97\x39\x73\x47\xa9\xb4\xa6\x6b\x3d\x20\x55\x62\x85\xa8\x51\x45\xf5\x06\x7c\xca\x1b\x37\x6f\x1e\x1a\x5d\xf2\x0e\x3c\xe5\xaf\x2a\x1b\x48\xb7\x59\x6a\x27\x2d\xd8\x91\xd4\x0d\x91\x99\x82\xdf\x51\x3d\x6c\x23\x69\x0a\x91\x51\x3d\x38\x17\x3a\x05\x89\x3e\x2b\xb5\x2f\x41\xa2\x3e\xd3\x3f\x81\x9c\xa4\x75\xda\xe4\xa4\x12\x87\x9c\x54\x54\x42\x4e\x95\x64\xdd\xa8\xb8\x53\x5b\xe9\x25\xf7\x32\xb5\x39\xca\x93\xaa\x7e\x46\x59\xba\xdf\xb7\x94\xb5\x94\xcf\xf5\xeb\x91\xb1\x15\x8c\x36\xf7\x94\xcf\x11\xd3\xce\xd0\x34\x4a\x66\x6c\x96\x90\x34\x07\x55\x3b\x23\xad\x9e\x6c\xc5\x41\xb4\xdf\xb1\x84\x8d\x8b\x0f\x33\x9d\xdd\xc9\x6e\x4a\xd4\x5a\xa2\x69\x1b\x28\x0b\x73\xbb\x0d\xaf\x71\x45\xa7\x28\x46\xdf\xaa\x37\xb6\x26\x04\x42\xc3\x15\xa8\x84\x1c\x30\x6b\x4b\x70\x15\x7d\xa4\x83\x1f\x32\xcd\x17\x8a\x34\x84\x8f\xa5\x95\x7e\x36\xf1\x4b\xf3\x21\xe4\xe5\xcb\xd3\xa2\x82\xac\x1d\xd8\x8b\xe7\xb9\xca\x7e\x54\xf8\x7a\x09\x54\x7c\x71\xe1\xb1\xd4\xe5\x00\x05\xa3\xf8\x82\xf5\x17\x8c\x6d\x4c\xf6\x76\x55\x9a\x7f\x9a\x19\x47\x3c\xd5\x5a\x66\x10\xc1\xb1\xda\x9b\x4e\xea\xff\x22\x57\x55\x2a\xbd\xa3\xe5\x4b\x57\xd3\x93\x5e\x3f\x84\xaa\x79\x6d\x5b\x41\x69\x74\xcc\x50\x53\x65\x36\x68\x15\x13\x4d\xbe\x8d\xb6\x43\xdb\xa0\x64\xd9\x47\x01\x63\xa7\xed\x93\x63\x29\xcd\x43\xdd\x73\xf3\x50\xf7\x16\xe5\xa1\xee\x9d\x40\x1f\x3e\x5d\xcb\xf4\xa7\x82\x0b\x84\xd8\x7b\x3e\xe2\xfe\xc7\xba\xe8\xd3\x93\x58\xaa\x2c\x5a\xa2\xac\x95\xfa\x23\x3e\x98\x86\x9c\xb8\xb7\x84\xfb\xc0\x4e\xce\xf1\xcf\x29\x4f\xb3\x83\x28\xa0\x23\xf1\x77\x09\x1b\xf3\x3a\x0e\xab\x45\xa2\x4c\xc5\xa8\x32\x09\xfd\xd0\xd8\x35\x55\x82\x64\xc0\x85\x62\xed\x0b\x31\xab\x2e\x6d\x02\x29\x1e\x93\x69\x94\x02\xcb\xe4\xaa\x8f\x7c\xde\x9c\xf0\xa4\x99\x05\xfe\x47\x83\xec\x54\x21\xa9\xe0\xd4\xad\xe2\xd6\x79\x10\x0d\xb0\x40\xe7\x09\xc3\xb0\xfc\xd9\x08\x3e\x5d\x63\xdc\x60\x7b\xf9\xe4\x55\x33\x35\x0b\xd2\x72\x48\x4f\xf9\xa8\x57\x33\x41\x4e\xa0\x1a\xc9\x16\x8a\xc3\x4c\x0c\x44\xd3\x79\x40\x09\x80\x50\x2c\x68\x82\x67\x34\x04\x1d\x93\x37\x95\x7b\x72\xee\x36\x59\x7c\xa1\x05\x9f\x2f\xb7\xdd\x68\xd3\x3e\x1c\x9f\xe4\x69\x8e\xe9\x36\x9c\x63\x87\x6b\x64\x4c\xa1\x4e\xd1\xc2\x7f\xfb\x5f\x53\x9e\xcc\xe1\x0a\x5f\x4c\x24\xb4\x32\x08\x4b\x3b\xc0\x82\xf9\xfb\xde\x3d\xeb\x59\xc0\x6f\xff\xc4\xc6\xcf\xac\xc0\x05\x1d\xc1\x81\x4e\xe0\x17\x09\x2e\x17\xe0\x4b\x00\x52\x8f\x9d\x14\x14\x19\xd1\x00\x41\x38\xa1\x99\x30\x05\x00\x9f\x50\xc0\x69\xfb\x3a\x4b\xbd\x5a\xcf\xcd\x53\xcb\x79\x17\x2d\x97\x03\x2d\xf2\xd6\x47\x3e\x4f\xeb\x8b\x66\xd1\x0e\x45\x53\x80\xd7\x68\x94\x44\x5b\x8b\xd8\xd8\x8a\x5b\x72\x5a\x8e\xc9\xb1\xa8\x75\x72\x03\x07\x15\xaa\x7f\xfe\x2c\x76\xde\x22\x1e\xf0\xac\x58\x26\x9b\x08\x01\x60\x85\xa2\x56\x04\x7c\xc7\x87\x4c\x1c\x8e\xf0\xf6\x4f\x35\xa9\x91\x6f\x52\x9d\x68\x03\xfb\x4f\x01\x1d\xaa\x2c\x2e\xb0\x29\x69\x53\xb0\x7c\x90\xf9\x24\x0f\x2e\x65\xa4\x0c\x31\x04\x90\xe5\x00\xa2\x5e\x1f\xff\x2b\x8b\xae\xbd\xc5\x74\xd4\x03\x54\xc3\x4b\xe3\x24\x7f\xd9\x79\x3e\x27\x9b\x30\x56\x69\x89\x0a\x95\x41\xda\x75\x14\x72\x32\x2f\x37\xe1\x9c\xfe\x2a\x92\xd1\x80\xa7\x57\x81\x23\x0e\x4c\x06\xb9\xc1\xec\x31\x14\xc8\x9b\x25\xe7\x41\x86\x77\x0c\x7e\x4c\x6f\x9c\x22\x6b\x0f\x11\x8b\x53\xc8\x05\x19\x09\x47\x60\x3f\xf5\x47\x54\x35\x48\x15\x10\xfd\xf4\x4c\x1c\x19\x8d\xdd\x3b\xc8\x52\xd7\x70\xeb\x26\xb5\x60\x83\x01\x0a\x37\x2b\xdc\x00\x69\x59\x81\xd9\x66\x9c\xd8\x03\x0a\xc6\xb7\x87\x70\xf0\xf3\xc1\xbb\xc3\xbe\x8c\x7b\x20\x00\x59\x7b\xec\x59\x61\x22\x30\xfa\xd2\x19\x2a\xb7\xe2\xbb\x2a\x3f\x92\xe7\xe9\x3b\x25\x3c\x54\xb2\x76\x72\xcd\xdc\x40\xe5\xb9\x8f\x2d\x65\x97\xbf\x77\x0f\x82\x54\x99\xcf\x0b\xb5\xc8\x8c\xee\x84\x35\x2f\xaf\x22\xf7\x2d\x6b\xc7\x3e\xb5\x44\x55\x8e\x03\xbd\x3c\x10\xf5\x1d\xa5\x79\x49\xf8\x73\x45\xd8\x61\x20\xaf\x79\xc8\xad\x5f\x6e\x60\xe5\x4a\x94\x9a\x72\x0a\x21\x85\x07\xde\xfc\xd6\x57\xb7\xf3\xfd\x3a\x67\x51\xa9\x57\xe8\x25\xe3\x7c\x34\xb9\xaa\x9c\x62\x27\x6b\x6b\xca\xb3\xe9\x84\x60\xa2\x5c\x10\xea\x0f\x3d\x3c\x9b\xcb\x87\x46\x62\x27\xf7\x19\x19\x2d\xd4\x40\x10\x79\x39\x92\x20\x52\x91\xff\x7c\x48\x83\x6c\xca\x8c\x7c\x96\x83\xa0\x29\x3c\x14\x7d\xbc\x52\x5d\xd4\x1b\x4e\x80\x27\x43\xd5\x56\x7e\x7c\x85\x21\xa9\x3c\x24\xf4\x62\xb1\x86\x1a\x25\x29\x3e\xf6\x0a\xb0\x32\x83\xcf\x25\x7b\x8b\x35\x88\x63\x54\xcb\x8c\xe0\xe8\xa6\x59\x4c\x91\x67\xa2\x01\x25\x49\x83\x34\x9b\x0e\x87\x14\xba\xf7\x7d\x10\x89\x93\x5c\x36\x3d\x4f\xb7\x44\xff\xa4\x55\x3c\x17\x4d\xeb\x6f\x25\xef\x1c\x13\x5d\x3f\xf2\x79\x1f\x6a\x44\x2a\x79\x6d\x8c\xf6\x34\xeb\x90\x45\x1f\xff\xf6\xb7\x6e\x51\xdb\x92\x5a\x8d\x38\x61\x90\x56\x63\xc5\xff\xf4\xc0\xee\x41\x1a\x08\x2a\xba\x90\x5f\x4b\xfb\x90\xdf\x96\xe9\xa4\x6c\xee\x2a\x7a\x2c\xab\x5a\xda\x7d\x59\xc5\xa5\x06\x4c\x77\x99\x4b\x21\x53\x5a\xb7\x9c\x18\x65\x35\x4b\xd0\xc9\x5f\xc8\xbd\x97\x2a\x34\xb0\x48\x87\x16\x52\x97\x59\xc9\x34\x52\xf6\x02\x8c\x2b\xfd\xe3\x4b\xb5\x74\xd8\x25\x0b\x42\xd1\x9f\xbe\x80\x93\x61\x08\x5c\x8d\xdc\xfa\x9a\xb3\xbe\xc9\x1b\xb0\x02\x3a\xcf\xe3\x30\xe4\x3a\x8e\xd2\x34\x0b\xe4\x91\xd9\x7e\xd8\x74\x95\x04\x19\xe6\x4f\xa2\xe3\x94\x91\xd1\x7a\x4c\x19\x4b\xb0\x06\x9a\x64\xcd\x05\xe3\x23\x1d\x35\x09\x71\x0d\x52\x33\x0e\x52\xe3\xc9\xe6\xa5\xc0\x04\x91\x1f\x4e\x07\x1c\xce\x48\xc2\x35\x05\x36\x69\xeb\xb7\x54\xdf\x5f\x9f\xe9\x37\xef\x67\xaa\x6f\xd5\x76\x7b\xfb\xc5\xe1\xdb\x77\x87\xcf\x0f\x3e\xbc\x3c\x7a\xb3\xbd\xdd\x27\x87\x00\x7c\xea\x1f\xab\x40\x73\x44\x0b\x3c\x4e\xa3\x2f\xab\xbe\x19\x55\x40\xac\xa8\x0d\x6e\xc0\x86\x3b\x98\x47\x2c\xd3\x37\x66\x04\x63\x1c\xe3\x44\x92\xe3\x84\x18\x8d\xcc\x7b\xa4\xc0\xbd\x98\xea\x50\x1d\xa3\xe0\x62\x44\x07\x42\xa9\x01\x48\x4b\x05\x51\xc6\x3c\xf4\xc3\xfe\x10\xba\x4c\x3a\x18\xd5\x32\x05\xee\x62\xca\x12\x16\x65\x5c\xc6\x2b\xc8\x62\xf9\x6a\x13\x52\x3e\xbe\xe4\x49\x4b\xe1\x38\x06\x26\x03\xb6\xc4\x57\x11\x24\x41\x4a\xd7\xfb\x60\x1b\x68\x41\x59\x41\x64\xa2\x39\xf9\x3b\x67\xd1\x85\x1b\xaf\x90\x1f\xe7\x38\x4e\x1a\x2b\x6e\x64\x43\x80\xeb\x13\x3b\xe3\xc7\x5b\xa9\xc3\x5f\xe3\x9e\x65\x5f\xc0\xe6\x4c\x0f\xb9\x5b\x58\x3c\x14\x4a\x13\x10\x65\x01\x8c\x32\x9e\x0c\x99\xcf\xb5\x37\x5c\x28\x6d\x5c\xce\x45\x2c\x06\x58\xe7\x59\x8a\xc6\x53\x19\xc6\x03\x03\xb7\x3b\x31\x55\x18\x46\x83\x47\xb7\x8e\x28\x1e\x70\xcb\xc2\xaf\x62\x97\xd0\x56\x61\x58\xdc\xde\xab\x99\xda\xa9\x55\xdc\x96\x90\x98\x51\x45\xa5\xf2\xe3\x38\x19\x04\x11\xcb\xe8\xca\xc4\x76\x26\xa4\x8d\x47\x06\x3a\x53\xdd\x8b\xc6\x98\x6a\x2b\x75\x9e\x5b\x6f\x57\x5a\xff\x6d\xba\x29\x13\xc3\x9b\x78\x80\x1a\x88\x6a\x22\xfe\x7a\xf3\xad\x5c\x2e\x43\x4e\x17\x64\x41\xea\xc4\x05\x11\xa8\xbd\x14\x74\x8d\x78\x06\x87\xb3\x49\x18\x27\x3c\xc1\xf8\x1f\xea\xea\x39\xd7\x59\xee\x06\xc8\x78\x2f\xa0\x99\x51\x05\x8f\x0f\xa2\x0b\x13\x1d\x0e\xa3\x60\x19\x39\x8c\xf3\xaa\xa2\x8b\x95\x51\xac\x30\xbd\x28\x34\x29\x3c\xce\x59\x69\x0f\x96\x45\xdc\xc1\x4e\xf9\x94\x20\x6e\x56\xe6\xcb\x2d\x0a\x9a\x70\xf8\xfe\xa1\xd0\x00\x28\x0a\x19\xd3\x8f\xe4\x28\xff\xcf\x48\xa6\x06\x54\xcb\xf9\x32\x48\xb2\x29\x0b\x4b\x3d\xde\x6f\xea\x94\x12\x5c\x2d\xd9\xab\x8c\x22\xb4\x4c\xb7\x42\xe8\x4b\xde\x27\xb1\xb5\x0f\x75\xb1\xce\xe3\xa1\x4c\xed\x89\x46\xa2\x9a\xb6\x12\xd5\xe0\x99\xfa\xd0\x87\x8b\x30\x3e\x67\x61\xa3\x65\x89\xbd\xbd\xad\xc2\x5d\x8c\x1d\xcb\xd1\x7c\xb7\x6e\x7a\xd4\x9f\xb8\xb6\x61\xc4\x92\x71\x1c\x69\xcb\x35\xf0\x19\x46\x46\xda\x6e\xc3\xe9\xe9\x15\x3f\x9f\x30\xff\xe3\x29\x95\xa5\xa7\xa7\xc7\x77\x65\xb5\xbb\xe2\x44\x5c\xd7\x46\xa9\x76\xfb\x5f\x20\x8d\xa7\x89\xcf\x5f\xb3\xc9\x24\x88\x2e\x7e\x7c\xf7\x6a\x5f\xef\x0f\xe2\x70\x89\x7d\xfd\x7c\xf8\xed\xdb\x83\xe7\xff\x0e\x3f\x1d\xbc\x83\x97\x6f\xfe\xed\xf0\xb9\xd8\x1f\x60\xbb\x7d\x4d\x5b\x75\x49\x87\x9e\x85\x45\x42\x1e\xe6\xa7\xa7\xf5\xfb\xdd\x46\xa3\x81\x92\x69\xbb\x0d\xd7\x0d\x4f\xc0\x7e\xf8\xa8\x27\xc8\x4b\x65\xfa\xa0\x52\xa7\x6d\xc1\x93\xc3\x4a\x4b\xe1\x09\x75\x62\xeb\xae\x58\xcd\x69\x96\x04\x7e\x76\x77\x6f\x6b\x6b\x4b\x1e\x9a\x73\xb1\x95\x35\x98\xbb\xa7\xa7\x3c\x7d\x8d\xc0\xef\x7a\x32\xec\x26\x6a\x2f\x78\xe7\x84\xe7\x08\x34\x1c\xca\x33\xb3\x39\x85\x53\x4c\x44\xf8\xfc\xd9\x32\xd7\x65\x2c\xb9\xe0\x59\x03\x3e\xc1\x30\x4e\xa0\x8e\xa1\x2f\x61\x1f\xba\x7b\x10\xc0\x37\x05\xdb\xe2\x1e\x04\x3b\x3b\xa2\x32\x06\xb8\x44\xaa\xdb\x16\xc8\xe3\xe0\x64\xcf\xc0\xf9\xc8\xe7\xa8\xdd\x63\x35\xd1\x48\x1c\x25\x24\x2a\x5a\x5d\x6e\x8d\x58\x7a\x74\x15\xa9\x51\xd2\x6c\x50\x13\x4f\x40\x10\x67\x32\x20\x24\x8f\x3f\xf2\xb9\x98\x7b\xfa\x8a\xbf\xf6\xe0\x1a\xff\x4f\xad\x08\xac\xb7\x87\x56\x2d\x24\x41\xc2\x19\xc6\x18\x2e\x9b\xc9\x6e\xc3\xa9\xd5\x13\xd5\x70\xd7\x88\x27\xf2\x41\x81\xe4\xd6\x3a\x55\xd0\xd5\xc5\xea\xfd\x30\x9f\x60\x1e\x8a\x32\xc0\x9d\x62\xcd\x45\xc0\x75\x25\xd1\x4c\x4f\x4c\x45\xed\xf8\xfc\x37\x41\x10\x95\x1f\xeb\xfc\x37\x71\xb0\x8d\xcf\x7f\x6b\x19\x9e\x80\x67\x58\xde\x87\x4f\x3a\xfb\x32\x16\x5c\xef\x09\x2d\xd4\x74\x40\x3b\xe7\xcf\xf4\xd8\xfd\xad\x3e\xf9\x88\x2e\x90\xf2\xa9\x9a\x67\xa2\x2a\x99\xc5\x6c\x2e\x09\x10\x01\x35\xb1\xa2\x85\x0e\x69\x1a\x34\xe0\x29\xe6\xa5\x16\xfa\x4c\x10\x4d\xf9\x1e\xc5\x96\x5e\x6a\xf6\x11\x81\xa0\x61\x37\x96\x0c\x10\x88\xe9\x8f\xcf\x7f\x43\x3e\x2b\xce\x3a\x51\xfd\x00\x9d\x25\x2c\x93\x34\x16\xd4\x31\xc8\xa2\x87\x30\xf9\xcc\x4a\x18\x8b\xf4\x4f\xff\x26\xb6\x91\x38\x92\xf1\x68\x31\x1e\xa3\x2e\x51\x16\x54\xbb\x4a\xb1\x55\xce\xc0\x5e\x4b\x27\x2c\xaa\x41\xbf\x50\x53\xdb\x69\xa3\x88\x27\xef\xf8\x50\xf7\xa7\x0a\x74\x77\xa3\x20\x1c\x24\x3c\x32\x08\xc9\x02\x13\xce\x36\xc5\x79\x43\x3e\xac\x9a\x4d\x39\xec\xe3\x9a\x46\xa0\xe6\x41\x4d\xf5\x25\xfe\x56\x60\x6b\x27\x0d\x1d\xbb\x56\x5b\x5e\x25\xb9\xf2\x69\x52\xd0\x6d\x83\x90\xd7\x64\x56\x65\x75\xa1\xa3\xe4\x52\x2b\xa5\x3c\xc3\x59\x10\x5a\x07\x7d\x37\xc6\x05\xb9\x07\x19\x7a\x88\x5d\x48\x41\xb5\x32\x63\xab\x0a\x76\x7b\x99\xd6\xc2\x42\x0a\x9d\x88\xb4\xc9\x58\xe8\x18\x07\xba\xb8\x6e\x12\xa6\xca\x4e\x0d\x8d\x4b\x3b\xd5\x50\x15\x99\xcd\xd9\x6f\xd8\xd7\x03\xd6\x16\x76\x72\x56\x35\x68\x28\x0b\xbb\x75\x5a\x54\x1d\xd6\x3f\x59\x80\xfb\xd6\xdf\x9e\x99\xd6\xbe\x35\xc3\xd7\x6e\x12\x1e\x3d\x99\x7a\xfe\x6d\x0b\xb1\x6e\xa6\xce\xbf\x12\x33\xa7\x92\x41\xd3\x6a\x40\x3e\x62\x0d\x93\x70\xc3\xa6\x95\xc3\xeb\x35\x72\x5c\xaf\x99\xec\xb1\x36\x46\xad\x04\x79\x43\x51\xa8\x10\x0a\x3c\x57\xdb\x5a\x0b\x4e\x13\x2b\x42\x70\xbd\xe3\x49\x41\xdd\x22\xdb\x89\x4a\x11\x54\x37\x2b\x2b\x07\xd6\xd3\xd4\x6e\xec\xe1\xcd\x2d\x72\x42\x4b\xb2\xb4\x92\xe0\x9f\x74\x9c\xe5\xbe\x2d\xb0\x5b\x52\x76\xb6\x68\x61\xb5\x82\x54\x45\xc3\xb7\x40\xd9\x3b\xc1\xa7\x2d\x6b\x58\x15\xa0\x22\x7e\x34\x14\x65\xf5\xe3\xb2\xcf\x82\xaf\xbd\xd2\x86\x82\x31\x29\xf1\x82\xa2\x54\x79\x07\xa2\x9e\xa8\xa5\xc6\xfd\x45\xd0\xc0\xf1\x4b\x65\x44\x7d\x82\x7d\x92\xb2\x7b\x05\xcd\x68\x77\x83\x9a\xd1\x02\x35\xce\xc0\x96\x9a\xaa\x68\xbd\x21\x3d\xea\xcb\x28\x11\xe2\x7c\x55\x0e\xb3\xf7\xd8\xa9\xb5\x50\x77\x98\x26\x5c\x57\x7e\x7f\x79\xf1\xd2\xc7\x24\x2c\xa5\x50\x1f\xe4\x2b\x2e\x02\x2c\xab\xfc\x21\x2a\x89\xc0\x49\xf6\xf7\x9c\x2c\x4b\xfb\xf2\xbc\xd1\x3a\x3d\x7d\xfd\xe3\x4b\x85\xcc\xe9\xa9\x50\x5d\x35\xf6\x8a\xf7\xcc\x04\x0c\x29\x3d\xa5\x98\x07\xcd\xb3\x8e\xb0\xa8\xd7\x26\x2c\x1b\xd5\x3c\x81\x47\x1f\x6a\xaf\xbb\x0f\x5a\xf7\xbb\xf0\xa8\x75\xbf\xfb\xaa\x7b\x1f\x1e\x86\xcd\x87\x40\xff\xd7\x6d\xdd\xef\x36\xbb\x58\xde\x69\x3d\xde\x85\x6e\xef\xf7\x1a\x68\x8e\x78\x3e\xe2\x97\x49\x1c\xbd\xe2\xc3\xcc\xde\x00\xad\x62\xda\x76\x49\x36\xaa\x2b\xac\x85\x88\xa1\x54\x74\x88\x40\xbb\x0a\x6d\xdf\xf8\xa7\x18\xe0\x16\x80\x94\x65\x2e\x0e\x28\x1d\x91\x59\x14\xfc\x46\xdd\xaa\xd1\xd8\xb3\xeb\xb7\xc6\xd3\xe0\x0d\xa6\xc1\x80\x9a\xec\xb2\x56\xba\xa4\xad\x36\x0b\x17\x9f\x3c\x43\x2d\x5a\xcd\x15\xe7\xa6\xfb\x7f\xee\xb9\xa9\x6a\xc5\x5b\xd6\xf9\xbc\x6f\x83\x6d\x21\xb7\xba\x11\xaa\x16\xe9\xa1\x14\xe6\x3c\x2d\x9c\xa8\x3a\x74\xa2\x22\x55\xae\xe4\x34\xa5\x82\x44\xc6\x89\x52\xf8\x50\xcb\x35\xc5\x2d\x1e\x4d\xc7\x3c\x41\xa3\xe9\x7e\x45\xb9\x38\xda\x61\xae\x0a\xfb\xbb\xbe\xbb\xa3\x96\x98\xcc\x03\x37\xf6\xbb\x38\x7a\x0c\x79\x68\xaa\x37\xec\xa6\x57\x49\x90\x39\xcd\xca\x49\xac\x46\x6e\xb5\xfc\xc8\xe7\xf6\xef\xc6\x9e\x7d\x4e\x33\x14\x7d\x6e\x5c\x70\x3d\xba\x43\x91\x5b\x37\x19\x28\xdf\x2a\x52\x62\x2a\x37\xfd\xb9\x51\x24\xbe\x05\xc8\x1c\x2f\x6c\x90\x0d\x1a\xb3\x03\x77\x11\x14\x17\x85\x3d\x85\xba\x55\x63\x0f\xe5\x57\xfd\x0b\xef\x13\x5f\xf0\xb0\x49\xbc\x2e\xb8\x1c\x03\xc6\x57\x6d\x1c\x25\x55\x17\x75\x61\x6a\xe9\x86\xf2\xe5\x41\x39\xfc\x07\x66\xbb\x3b\x98\x4c\xbe\x65\x49\xe5\xb6\x78\x3f\x57\x71\x11\x16\x54\x43\x37\xf8\x10\xc7\xe1\x79\x25\xe8\xee\xe3\xc7\xf9\x9a\x8b\x60\xcb\x2a\xa6\xc9\x7c\x12\x5f\x24\x6c\x32\x9a\x57\xc0\xbf\xdf\x29\xa9\xbb\xb0\x07\x5d\x4b\x37\x14\x62\xfa\xdb\x69\x96\x55\x6e\xf0\xdd\xdd\x4e\x49\xe5\x45\xbd\x98\x5a\xba\xe1\x6b\x1e\x4d\x2b\xe0\x3f\x7c\xf4\xc0\xa9\xb6\x08\xb2\xf8\xae\x2b\x3f\x8f\xc7\xe3\x4a\xac\x9f\x3c\xf8\x83\xcd\x1e\x39\x17\x37\xe5\x9c\xe7\xd9\x2b\x5b\x49\x9c\x3b\xfa\xb3\x76\xe2\x8b\x87\x4e\x45\xb4\x4e\x8d\x92\xf8\x0a\x4d\xee\x62\x65\x1d\x26\x49\x9c\xd4\xef\x3e\x67\x91\xf2\x00\x06\x26\xef\x88\x59\x6a\xa5\x2b\xb9\x4b\x22\xd1\x46\x6d\x12\xa7\x69\x70\x1e\x72\xab\x83\x77\x38\xe2\x7a\xca\xc3\xa1\x87\xc0\x34\x6a\xa2\xc8\xed\x5d\x47\x90\x95\x28\xe0\x7d\x84\x4c\xa3\x84\x6f\xa0\x94\xef\x71\xca\x07\xd0\x84\x74\x3a\xe1\x49\xbd\xe1\xd4\x20\x87\x65\x42\x4d\x9d\x58\xc5\x08\xee\xdd\x33\xc7\x40\xf1\x5b\x9c\x00\xef\xd2\xc9\xe8\xae\xd8\x74\x0a\xdf\xcc\x28\xe1\x19\x15\xf7\x41\x60\x9c\x9b\x8c\x20\x1a\xf1\x24\xc8\xd2\x7a\x3a\x3d\xc7\xed\xd6\x23\xb4\xf0\x6f\x35\x54\x09\xdc\x7c\x40\x43\xb5\xe9\x42\x60\x97\xfb\x18\x4d\x89\x52\xa5\x53\xf3\x7e\x8a\x5e\x6d\xb3\x49\xc2\x53\xbc\xbe\xc2\xf7\xb5\x32\x9b\xc4\x39\xc7\xc6\x14\x5a\xde\x64\x9f\x11\x73\x79\x17\x76\xa0\x80\x0b\x92\x4a\x61\x6f\x76\x1e\x63\x74\x25\x5d\xa2\x6e\x21\xe8\xa0\x6b\x6f\x56\x9f\xec\x17\x29\x7d\xd4\x0b\x50\x3b\x31\xc4\x31\x5b\xbd\xf2\xee\x03\xb5\x45\xcb\x67\x05\x60\xef\xf6\x54\x26\xd8\x4c\xed\x7e\x16\x71\x25\x7e\x29\x17\xa7\x65\x42\xe1\x68\x08\xcf\xca\xcb\x2b\x26\xc8\xe0\xd6\x3a\x3d\xc5\x91\x9c\x9e\xc2\xbe\x55\x45\x50\xa7\xdd\x86\xe7\xf1\x64\x4e\x0e\x2a\xbd\x4e\xf7\x11\x79\xca\xc6\x4d\x7c\x7a\xc1\xa7\x63\x38\x98\x66\xa3\x38\x41\xdf\x66\xba\x7f\x0a\x42\x74\x6b\x9a\x60\xa2\x11\xba\xdb\xb0\xeb\xeb\xa0\x12\xed\x36\xb5\x29\xfd\x2c\x20\x0c\x13\xce\x21\x8d\x87\xd9\x15\x4b\x78\x5f\x87\xc6\x4c\xf8\x20\x48\x55\xd0\x9a\x00\x23\x22\xb6\x63\x99\x1b\x65\x2e\x40\x06\x19\x5a\xf3\xe8\x9d\x6f\xc6\x93\xb1\x7e\xea\xf5\xfd\x9b\x1f\xe1\x15\x4f\x53\x9e\xc0\xf7\xe8\xec\x1b\xc2\xdb\xe9\x79\x18\xf8\xf0\x2a\xf0\x79\x44\xf7\x72\x13\x51\x92\x8e\xf0\xbd\xe1\x16\x79\x5b\xc1\x77\x02\x95\xf7\x12\x15\xf8\x0e\x9f\x8a\xc9\xd4\x46\xc4\x7a\xea\x36\x75\x57\x75\x25\x01\x62\x00\xea\x76\x1b\xea\xfa\x3a\x17\xbd\x75\x1a\x18\x98\x34\x64\x99\x69\xba\x04\x41\xcc\xb8\xb5\xb3\xd8\x28\x9e\x70\xed\x55\xab\xae\xbd\xe9\xde\xdf\x13\xd0\xce\xa7\x19\xfc\xfc\xf2\xc3\x0f\x47\x3f\x7e\x80\x83\x37\xbf\xc0\xcf\x07\xef\xde\x1d\xbc\xf9\xf0\xcb\x9e\x8e\x94\xca\x2f\xe5\xc3\x88\x60\x4c\x5e\xfa\x57\x2c\x49\x58\x84\xd7\xdb\xe8\xb0\x7e\xf8\xee\xf9\x0f\x07\x6f\x3e\x1c\x7c\xfb\xf2\xd5\xcb\x0f\xbf\x88\xc5\xf5\xdd\xcb\x0f\x6f\x0e\xdf\xbf\x87\xef\x8e\xde\xc1\x01\xbc\x3d\x78\xf7\xe1\xe5\xf3\x1f\x5f\x1d\xbc\x83\xb7\x3f\xbe\x7b\x7b\xf4\xfe\xb0\x05\xef\xe9\x82\x5b\xb4\xbf\x99\xe6\x43\x99\xca\x01\xa3\x7d\x07\x61\xaa\x28\xf1\x4b\x3c\x55\x11\x0e\xf0\x16\x35\xe1\x3e\x0f\x2e\xf9\x00\x53\x41\x4c\xe6\x4b\x4f\xaa\x80\xc5\xc2\x38\xba\x30\x97\x8c\x65\x0c\x09\x2f\x87\x42\x54\x78\x90\x72\x0e\xdf\x8c\xb2\x6c\xd2\x6f\xb7\xaf\xae\xae\x5a\x17\xd1\xb4\x15\x27\x17\xed\x90\xc0\xa5\xed\xa7\x2d\xf4\xe9\x97\x6f\x1e\x87\x32\xbe\xc3\x0f\x9c\x0d\xb8\x65\xde\x6b\xe1\x0e\xaa\xd5\x27\x93\xdb\x15\x4b\xea\xd9\x88\x1b\x67\x49\xe5\x99\xae\x3d\xd8\x18\xaa\x40\x7d\xab\x84\x2c\xb2\x74\x2d\xdd\x87\x9a\x8a\x0b\x50\xf3\x9c\x1a\xf8\x16\x5b\xd6\xc1\x1e\x5a\xa6\x24\x55\xf2\xec\xb8\x46\xef\x26\x6b\x9e\x4a\x22\x76\xe2\xe5\x7a\x12\xff\x38\x4b\x31\xd8\x5b\x11\x0e\x7d\x69\xa5\x23\x96\x4c\xbc\x42\xbb\xc1\x54\x47\x08\x29\xb4\x54\xdf\x5a\x32\x40\xef\x7b\x3f\xe1\x3c\x72\x40\x48\x27\x4f\x30\xd9\xa9\x0d\x41\xde\xdb\xe9\x7e\xd4\x3f\x1a\x8c\x38\xe9\xf6\x95\xc2\xd2\x7a\xf1\xee\xe0\xe7\xc3\x77\xa7\x3f\xbf\x7c\xf1\xe1\x07\x17\x43\x1c\x70\x1f\x6a\x3e\x0b\xfd\x7a\xb7\xd3\xf9\x3b\x34\xa1\x06\x3b\xa5\x2d\x61\x07\x6a\x93\x59\xe3\xcf\xa4\x31\x67\x29\x3f\x9a\x66\xb7\xa4\x32\x17\x1a\xd9\x2a\x64\x1e\xf3\x68\x4a\x6a\xe5\x22\x2a\x77\x7b\x5e\xc9\xb7\x77\x62\x93\xe8\x43\xaf\x53\x06\xd8\x0e\xbb\xa5\x87\x10\xa4\x93\x90\xcd\xfb\x50\x8b\xe2\x88\xd7\x4c\x33\x65\x7c\xc7\x27\x3b\x6d\xb5\xb2\x12\x2e\xa4\xba\xd0\xc3\x46\x58\xe0\xa9\x90\x65\xe4\x77\x83\x3e\x06\xc1\x80\x9f\xe3\x0b\x0b\x21\x09\x20\xf0\xe3\x48\xbd\xfc\x62\xf8\xde\xdb\x0f\xe3\x94\x0f\x5a\xa4\xdd\x4a\xb8\xb6\x95\x40\x70\x01\x2d\x5f\xb5\x34\x8d\x9e\xf3\x83\xec\xd5\xaa\x23\x7d\x33\x75\x7b\xaa\x52\xb7\x7d\x51\xf3\x4a\x2b\xbd\xcb\xa0\x8a\xaa\x3d\x58\xde\xd2\xd5\x8a\x24\xb5\x94\x68\x58\x7b\xf6\xe7\xcf\x6a\xdf\xbf\x70\xf7\x7d\xd9\x49\xa3\x85\x11\x26\x64\x7b\x7d\xe1\xdb\x70\xdd\xdb\x6c\xc3\x89\x1e\xea\xb1\x19\x07\xf9\xe1\xd1\x1c\x58\x0b\x22\xef\x7c\x47\x15\x1c\x0a\x00\xb9\x9b\x8a\x8d\x0d\x69\xc1\x53\xf3\x3e\x1c\x13\x25\x09\xdc\xe9\x79\xbf\x10\xd0\x24\x56\xeb\x2a\x18\xa6\xee\x27\xd1\xad\xa5\xe3\xab\xbc\x59\xa3\xc2\xbd\xad\x2d\xa7\xfe\xf2\x96\x3b\xfb\x9f\x3a\x9c\xb6\xdc\x68\xf9\xd6\xbf\x4f\x84\xc5\x1b\xf4\x60\x47\xd3\x9d\x75\xb2\x36\x06\x3c\x89\x55\x8b\xc4\x96\x67\x23\x8c\xbc\x89\x4e\xcd\x6e\x25\x94\x6d\x0d\x7b\xcd\x68\xac\x56\x1b\x04\x36\x51\x47\xe1\xea\x91\xd0\x68\xa4\x0b\xe4\xf7\xd3\x2c\xc3\xf7\x72\x77\x8a\x98\x96\x60\x74\x4b\xac\xb0\x99\x75\xbe\x5d\x8c\x1c\x22\x58\xf9\x05\xf0\x2a\x2a\xc4\xf0\xa8\x42\x02\x24\x2c\xcd\x6a\xd5\x80\xc4\xbf\x1a\x4b\x02\xd6\x0c\xd9\x39\x0f\x6b\x7d\xa8\x89\xe1\xc1\x20\x61\x57\x0e\x43\x97\xfd\x8b\xa3\xe7\x61\xe0\x7f\xec\xe7\xa7\x71\x71\xab\x95\x18\xc5\x08\xde\x1b\x98\x45\x08\xd2\x46\x65\xbf\x15\x73\x05\x37\xce\x17\x99\x05\xf4\x84\xd0\x29\xac\x14\x56\x63\xb3\xec\x60\x19\x55\x96\x60\x07\x3c\xc4\xf5\xa1\x96\x05\x59\xc8\x6b\x9e\xe6\x00\x29\xa4\x6b\xe2\xb4\xf7\x73\xc2\x26\xea\xf4\x54\x0d\xaa\xf6\x7d\x0c\x87\x4a\x07\x7c\xc1\xd2\xd1\x79\xcc\x92\x41\xad\x7c\xc8\x85\x52\xb7\x44\x3f\x07\xd0\x7b\xd7\x89\x12\xed\x52\x0e\x91\x40\xdd\xdb\xba\x96\x36\xc2\x96\xb3\x87\x48\x91\x9e\xbf\x92\x04\x35\xe9\x4b\xde\x6e\xd2\x60\x89\x65\xca\x9b\x9c\xc7\x71\x58\xda\xa0\xfa\x4e\x32\x7f\x7b\x5a\xbc\x6a\x40\xe6\x26\xad\xb6\x65\x04\x78\xa3\x9e\xca\xff\x35\x7b\x5d\xee\x06\xe1\xc1\x5f\xf7\x8b\x7f\xdd\x2f\x7e\xad\xf7\x8b\xbb\xd0\x7d\x3c\xea\x3e\xbe\x6c\xf6\x7e\xd8\xbd\xec\xfd\x3e\xee\x34\x1f\xb8\x3f\x1f\x5d\xf6\x46\xdd\xc7\x3f\x3d\xfc\x61\xd7\xbe\x5f\x94\x46\x58\x93\xfe\x97\x47\xd3\x2f\x7f\xa3\x28\x7b\x2d\xbb\x4a\x94\xe6\x5c\xf1\x3f\x4b\x5f\x1e\x8a\xca\x5f\xe8\xd6\xf0\xe1\x5f\xb7\x86\x7f\xdd\x1a\xfe\x75\x6b\xf8\xd7\xad\xe1\xd2\xf7\x4b\x58\xef\x87\x78\x5c\xb5\x25\x3e\x7c\xf4\xc8\xa9\xb6\x08\x53\xf1\xfd\x0f\xbe\xb3\xca\x2d\x1c\xe5\xa1\xeb\x91\x20\xb2\x3c\x70\x2d\x9f\xdc\xf2\x35\x67\x9a\xea\xdb\x05\xfc\x1f\xf7\x6a\xa1\xea\x26\x21\x7f\xdb\x80\xf7\x0a\xca\xb1\x0f\x1d\x73\xa5\x8b\x36\xc2\xb4\x2e\x91\xe2\xf3\xdf\xfe\xba\x86\xfb\xeb\x1a\xee\xaf\x6b\xb8\xbf\xae\xe1\xfe\xba\x86\xfb\xeb\x1a\xee\xab\xbb\x86\x7b\x1e\x47\x19\x8f\xb2\xf7\x57\x41\xe6\x8f\xc0\x1f\xc5\x71\xca\x53\x99\x77\x97\x2e\x0c\x4c\x74\x64\x98\xb0\x0b\x4e\x0f\x23\xd4\x05\x9d\xdb\x7c\xd9\xbb\x00\xa7\xd5\xc2\x2b\x01\xa7\xe6\x12\x37\x03\x4e\xfd\x5b\x5d\x10\x38\x10\x96\xb9\x27\x70\xbb\xbc\xc5\x75\x41\x8e\x1a\x1b\xbb\x35\x48\x69\x52\xea\x96\x41\x94\xf9\x59\x70\xc9\xf3\x15\xd1\x56\xc6\x52\xae\x6f\xf1\x3e\x1c\x7c\xff\xbe\x35\x8a\xc7\xbc\x15\x0c\xfa\xa5\x36\xbd\xa5\x0e\xe2\xa4\x50\x1a\xab\xe8\x27\x18\xf3\x71\x9c\xcc\x1d\x4b\x30\x15\x79\x90\x25\x6c\x38\x0c\x7c\xe7\x9b\x2c\xf3\xe4\x0a\x52\x21\xf7\xac\x1a\xf6\x07\xb8\xb6\x2c\x89\xd5\xe3\xf2\x47\x2c\x88\x6e\x1a\x98\xd8\x82\x97\x01\x86\xf7\x86\xcc\xa7\x8b\xc3\x0d\xc1\x8c\x78\x86\x99\x79\xaa\xc0\xb5\xdb\x70\x14\x85\x73\xba\x3a\xe7\x69\x16\x44\x17\xad\x4d\xf4\x9b\xce\xd3\x8c\x8f\x37\x35\x8a\x30\xbe\xb8\x91\x22\xb7\xb4\x7a\xd7\x06\xc1\xe5\x82\x3b\x07\x81\x61\xf5\x57\x8b\x79\x10\x45\x37\x06\x53\x18\x5f\x78\x80\x6f\xf9\xca\x16\xc9\xe6\x86\xb0\xe4\x50\xd4\xbf\x4f\x24\x0a\x10\xb1\x45\x66\x79\xf5\x2f\x8c\x2f\x16\xd6\x29\x59\x28\xea\xdf\x75\xc5\xbd\x85\xdb\xe2\xba\xec\xba\xd0\x65\x8d\x0a\x5b\xbe\x23\xed\xaa\x4c\xfa\xae\x10\x2e\x5a\xf6\x49\x8e\x95\x9b\xdd\xe9\x79\x56\xc1\x4e\xef\x8a\x90\xe5\xdf\x3b\xb5\xdb\xca\x0b\x45\xdf\x94\x9b\x7c\x4a\xda\x7d\xe5\x35\x0b\xa2\x0d\x39\xaf\xc8\xfd\xb5\x5f\x38\xfc\x7e\x2a\xf5\xc4\xe8\x76\x3a\x7f\xaf\x95\x39\x14\x90\xb3\x41\xf3\x66\x9f\x8e\x61\xc8\x67\xdf\x63\x82\xd8\xae\xfb\xe1\x9c\xf9\x1f\x2f\x12\xa1\x27\x3e\xa7\x8b\x22\xf2\x95\x98\xb0\x90\x67\x19\x6f\x99\xcf\xe5\x57\x4f\x3a\xdf\x21\x35\x4b\x27\xcc\x17\x13\x33\x8d\x82\x0c\xb6\x61\xf7\x16\x6e\x21\xc6\x2b\xe4\x2b\xf2\xb7\x29\xa3\xfd\x87\x78\xd2\x87\x07\x0f\xdd\x4f\xb1\x8e\x30\x5d\x63\xd3\x2c\xb6\x3c\x36\x3c\xd9\x37\x06\x4f\xc2\x6c\xd8\x69\x6b\x3a\xa9\xd7\xd2\x71\xad\x91\x1f\xab\x66\x8f\x22\x09\x28\x24\x42\xce\x3b\xe7\xe1\xfd\xa2\x0f\x4e\x0e\xd1\x87\xf7\x2b\xd6\xb6\x3d\x38\xd9\xef\x8d\x3e\x44\x9d\x3f\x7a\x5e\xff\x10\x1f\x9f\x9c\x4f\x0d\x2e\x77\xe3\x51\x63\x1e\x88\x2a\x79\xe0\x6a\xca\x74\xb7\x21\xda\x94\x6b\xc8\xbd\xa2\x8a\x2c\x6a\xdb\x9a\x71\xaf\xa0\x1a\x8b\x1a\x4b\x68\xc4\xa2\xda\xad\x14\x61\xd1\x70\x19\xfd\x17\x3b\xb8\x85\xda\x4b\x23\xfc\x9f\xe6\x23\x53\x1b\x33\xc1\xe8\xeb\x7a\xc6\x48\xd6\xba\xc1\xdb\xc1\x5e\xb3\xb7\xf0\x8d\xc9\x1d\x4c\xca\xf5\x21\xb5\x15\x17\x4e\x19\xe5\x5a\x4a\xf5\x09\xa0\xb4\xfa\xa2\x53\x41\x69\x03\xa1\xd3\xf5\xf3\x4a\x5e\x79\xd5\xa5\x0e\x15\x85\x96\xd7\xab\x3a\x2f\x08\x3e\xaf\xd2\x73\x70\x8d\xfd\x49\x8e\x0b\x7f\xa0\x0e\xb5\xba\xd7\x83\x92\x5a\xb9\xfb\xcf\x47\x7f\xdd\x7f\xfe\x75\xff\xf9\xd7\xfd\xe7\x9f\x79\xff\xf9\x7d\x12\x0c\xaa\x6e\x3e\x9f\x3c\x72\xaa\x2d\x02\x2c\xbe\x5b\x63\xf4\x47\x2c\xc9\xaa\x70\x7e\xf8\xe8\xf1\x97\xb8\x1a\xfd\xeb\xe9\xdd\x5f\x77\x7e\x7f\xdd\xf9\xfd\x75\xe7\xf7\xd7\x9d\xdf\x5f\x77\x7e\xff\xb3\xee\xfc\xc4\x66\x8b\xfb\xb8\x31\x61\x5c\x88\x9f\x2a\x06\x6f\x82\x43\x4b\x78\x3a\x89\xa3\x34\xb8\xe4\x40\xdb\x73\x4b\x4d\xb3\x0e\x1e\x26\x98\xea\x9d\xda\xbc\xb5\x15\x24\x05\x0a\xb7\x25\xe6\x44\x21\xfe\x5a\xb0\x4c\xc0\xc2\xe6\x8f\x2f\x6b\x29\xcc\xcc\x01\x5d\xde\x23\x6a\x94\x96\xbe\x43\x54\x2d\x16\xdf\x1f\xaa\x5a\xcb\xdc\x1d\xaa\xba\xb7\xbb\x37\x54\xad\x97\xba\x33\xd4\x5d\xdd\xe6\xbe\xd0\x8c\x7c\x63\xd6\x93\x5b\x3e\xf8\x41\x2d\x6f\xe1\x73\x1f\xc5\x51\x6a\xa7\x90\x56\x60\xf7\xbc\x4d\x65\xcb\x18\x28\x9e\x4b\xce\xc3\x6b\x1b\xdb\x46\xa3\x22\x04\x5a\xdc\x83\x65\x55\xd7\x38\xeb\x5d\xdf\xdc\x34\x70\x43\x80\x20\xe3\x63\x35\xf6\x59\xda\xa7\xa5\x23\x91\x9e\xa5\xb7\x7f\x71\xb2\xf0\x7a\x47\x2b\xd4\xad\x77\x7a\x0d\x3f\x57\x33\xb1\xf8\xf6\xe8\x53\xee\x62\x41\x1b\x95\x6d\xc4\x65\xec\xdd\x1b\x2e\xa2\x0a\x03\x08\xe3\x48\xe3\x8f\xe0\xd0\x5d\x9c\x65\xcc\x85\x4e\x39\x34\x73\x17\x73\xca\xdf\xef\xc6\xab\x2f\xb0\xee\x54\x1c\x47\x3f\x15\x8f\x70\xd1\xbf\xeb\x46\xd5\xfd\x17\x94\x3e\x64\x81\xf2\xbb\xb4\x95\x6d\x44\x7a\x49\x57\x5e\x88\x69\xe9\x52\xb4\x16\xe9\x25\x55\x1a\xd3\x0e\xc3\x2c\x97\x5c\x6a\xa1\x4f\xa8\xed\xe3\x31\x12\x05\xd6\x15\x16\x3d\xf2\x24\xcf\xd1\x25\x8d\xd6\xa2\xf6\x62\xa3\xb5\xa8\xb1\xcc\x03\x4f\xe9\x69\x9a\x9b\xd0\x25\x9e\x77\xc6\x63\xbe\xd4\xe3\x4e\xd1\xc1\x6d\x9e\x76\xe2\x08\x0b\x62\x97\x76\x7b\x3d\xee\x1f\xed\x14\x16\x50\x22\x85\x4b\xeb\xd7\x23\x3e\xcb\xde\x9a\xc7\x0e\xe6\x9f\x1c\xfe\x1d\xb4\x9a\xc9\xfb\xbc\x20\x7d\x33\x0d\xc3\xa3\xe4\x47\x15\x7a\xb5\x61\xda\x3b\x16\xcc\x63\x7d\x03\x78\xf0\xe1\xe0\xf4\xdf\x0f\x7f\x79\x2f\x2d\xae\x27\x0d\x41\x9f\x8d\x01\x95\x66\xd9\x93\x22\xb7\xdb\xa6\xe3\xf5\xb6\x29\x0c\xca\x3b\xe2\xc8\x93\xb6\x45\x58\x14\xed\x6d\x15\xaa\xd2\x38\xf1\xf2\x12\x1b\xd8\xb7\x97\x93\x24\x18\xb3\x64\x7e\xbc\xdb\xe9\x9c\xec\x15\x3b\xa1\xc1\x94\x37\x4d\xb9\x1f\x47\x03\xd3\x78\x03\x3b\xa9\xd9\xd3\x4b\x36\x51\xbd\xc0\x7b\xf7\x37\xf5\xc0\x55\x6f\x10\x07\x09\x67\xd8\x79\xd5\x13\x57\xb1\x69\x3d\x34\xdb\xc0\x6e\xa7\x23\x9d\xaf\xd3\x12\x23\xfe\xed\x5e\xbb\x1a\x6c\x7e\x39\x98\x89\xa5\x88\x27\xe9\xf5\x20\x89\x71\x79\xe6\xc5\xe3\x38\x8e\xe2\x2c\x8e\x78\xcd\xc3\x0d\xe7\xdf\x91\x0b\x71\x18\x35\x0f\xd2\x2c\x89\x3f\xf2\xbe\xcd\x2e\x9e\x38\x0e\x86\x4e\x51\xd9\xce\x50\x82\xe4\x5a\xb3\xf1\x2a\x88\xf8\x26\x66\x43\xb2\xef\xba\xd3\x21\xd0\x59\x95\x88\xf6\xca\xf1\x60\x10\x67\x3a\x8b\xf2\x7f\x1f\xf2\x7d\x6d\xcc\xfc\x9c\x25\x19\x4f\x03\x16\x91\xd6\xff\x49\x13\xbb\xf6\x2f\x9c\x1b\xe2\xbf\x60\xe9\x48\x9c\x81\xc5\xb4\x3c\x80\x07\xb5\x82\x73\xc2\x1f\x31\xff\xce\x22\xfa\x63\xa7\x7f\x53\xb2\x6c\x43\xab\xe7\x96\xb3\xe6\xc1\x25\x4f\x30\xeb\xb5\x21\xdd\x1f\x2f\x0b\xdd\x65\x4c\xc2\xd0\xd9\x14\xcb\xe6\x73\x45\xad\x57\x28\x53\x95\x8f\xba\x85\x22\x57\xd4\x75\x71\x23\x5e\xe9\x5e\xf4\xcb\xdd\x59\x7e\x40\x37\xae\x7a\xa3\xae\xb4\xd5\xdc\x65\xe5\xe3\x45\x97\x95\xcb\xa6\xdd\x28\xb9\xb8\x2c\xbf\x53\x2b\x05\x98\xbb\xc2\xb4\xaf\x2f\xd1\x5b\xd6\x4a\x45\x12\x8c\x55\x0a\x12\xbc\x3f\x39\x95\x8f\x57\x4f\x5f\xbe\x7e\x7b\xf4\xee\xc3\xe1\x8b\xd3\xd7\x47\x2f\x7e\x7c\x75\x78\xda\x39\x3d\x9d\xc4\xe1\x5c\x70\x04\x9a\x5d\xcb\x2f\x6c\x9e\xdc\x0e\x78\xf7\xf4\x54\x5b\x0c\x4e\xdf\x4f\x31\x8d\x51\x65\x2f\x4f\x1e\xba\x9d\x24\x5c\xa6\x51\xa9\x9f\x07\x98\xf9\xa6\xe1\x26\x54\xd1\x2d\x5b\x83\x0a\x6a\xc9\x1e\xef\x1a\x2b\x42\xdd\xba\x01\x5a\x15\xed\xe3\xbb\xec\xee\xc9\xde\x6d\xe9\xdc\xb3\x61\xbe\x62\x73\x9e\x54\x12\xa2\xfb\x64\xd3\x84\xc0\xfe\x56\x26\x43\x19\xca\xeb\x11\x61\x57\x40\x94\x52\xe1\xf4\x15\xbf\xe0\xd1\x60\x01\x15\x1e\x6d\x9c\x0c\xd8\xe3\xca\x74\x28\xc5\x7a\x3d\x42\xdc\xb7\x41\x7e\x88\xe3\x30\x0b\x26\xd5\x94\xd8\x7d\xbc\x69\x4a\xc8\x2e\x57\x26\x45\x39\xde\xeb\xd1\xe2\x81\x0d\xb3\xc4\xc0\x55\x49\x97\xc7\xbb\x1b\xe7\x90\x92\xee\x57\xa6\xd1\xcd\xe3\x59\x8f\x5e\x0f\x6d\xf8\xcf\xf9\x02\xb9\xdd\xed\xec\x6e\x9a\x40\xa2\xbf\x95\x29\x52\x82\xf1\x7a\x24\x78\xe4\xb0\x21\x9f\x65\xd5\x5b\xd7\xe6\x97\x0e\x9f\x65\x2b\x53\xa0\x04\xe1\xf5\x28\xf0\xd8\x91\x49\xec\x9c\x57\x73\xc1\x83\x07\x9b\xdf\x4e\xce\xf9\xea\x5c\x50\x86\xf2\x7a\x44\x78\x52\x80\xf8\x2a\x48\xab\x79\xe1\x51\xf7\x8b\x10\x42\xf4\xb9\x32\x31\xaa\x50\x5f\x8f\x20\xdd\xce\xe9\x69\x3a\x62\x13\x7e\xfa\x9e\xfb\x59\xbc\x40\xc5\x78\xd0\xd9\xb8\xb2\x85\x3d\xae\xae\x6b\x15\x50\x5e\x93\x04\x5d\x05\xef\xf9\x34\xb9\xac\xd6\x36\x1f\x6f\x5e\x34\x8a\xfe\x56\x1f\x7f\x1e\xdf\x35\x87\xdf\x53\xe0\xde\x71\x3f\x63\xd1\x45\xb8\x80\x04\xbd\xcd\x6f\x9f\xb2\xcf\xd5\xc9\x50\x86\xf7\x9a\xa4\xd8\x55\x20\xdf\xc6\xe1\xfc\x02\xc3\x22\x55\x38\xba\xf5\x36\x2e\x22\x65\x97\xab\xd3\xa1\x88\xf4\x9a\x54\xb8\xaf\x00\xbe\x88\x17\x88\xc6\x8d\x8b\x83\x17\xf1\xea\x42\x31\x87\xeb\x9a\x03\x7f\xa0\x17\x56\x12\xa7\x69\xe5\xd0\x77\x9f\xdc\xdf\xb8\x24\x10\x1d\xae\x3e\xfa\x3c\xc2\x6b\x8e\xff\xa1\x16\xac\xf3\xf1\x79\x1c\x56\x53\xa0\xfb\x64\xe3\x4a\x92\xec\x72\x75\x1a\x14\x91\x5e\x93\x0a\x8f\xd0\xbe\xc1\x12\xb1\x9e\x58\xf2\x7d\x12\x54\x9f\x38\x9f\x6c\xfe\x3c\xa1\x3b\x5d\x9d\x12\x65\x88\xaf\x49\x8b\xc7\x0e\xc8\x77\x6c\x10\x4c\xd3\x83\x59\xb0\x80\x33\x1e\x6c\x5c\x65\xca\x75\xbd\x3a\x5d\xaa\x07\xb1\x26\x75\x9e\x38\x80\x0f\xc4\x16\x74\x03\x71\x36\xbe\x7f\xba\x3d\xaf\x4e\x9b\xca\x21\xac\x69\xbb\xea\x68\xb8\x41\xb5\x3a\xb1\xbb\x79\x03\xde\xdb\x60\x75\x4d\x22\x87\xec\x9a\x23\xef\x2a\x60\xef\xd8\x80\x55\xeb\xd3\xbb\x9b\x37\x56\x61\x87\xab\x8f\x3e\x8f\xf0\x9a\xe3\xef\x59\xe0\x02\x16\x7e\xbb\x90\x06\x1b\xdf\x46\x74\xa7\xab\xd3\xa1\x0c\xf1\x35\x69\xb1\x7b\x7a\xea\xab\x3b\xa0\xd3\x6f\x93\x69\x3a\x5a\x40\x8b\x8d\xdb\x70\xb1\xc3\xd5\xe9\x50\x86\xf4\x9a\x74\xb8\x6f\x83\xd4\x0f\x06\x5e\x05\xd1\x22\xd9\xf0\x05\xce\x1a\x56\xc7\xab\xd3\x65\xd1\x20\xd6\xa4\xcf\x83\x52\xd0\x8b\xd4\xef\xdd\x27\x1b\xdf\x67\xed\x7e\x57\xa7\xce\x82\x21\xac\x49\x9c\x87\xa5\x90\x0f\x12\xce\x16\x50\x67\xe3\x67\x75\xa7\xe3\xd5\xc9\xb3\x68\x10\x6b\xd2\xe7\x91\x0d\x5a\x5f\x39\x2f\x54\x44\xee\x77\x36\xce\x3d\x4e\xc7\xab\xd3\x67\xd1\x20\xd6\xa4\xcf\xe3\x52\xd0\x8b\xf5\xfa\xfb\x1b\x17\x3e\x4e\xc7\xab\xd3\x67\xd1\x20\xd6\xa4\xcf\x13\x1b\xf4\x42\x99\xdc\xeb\x6d\x5c\x5f\xbb\x9d\x28\x2e\x41\x79\xcd\x6b\xc6\x8e\x0d\x71\xa1\x6c\xe9\xf5\x36\xae\xb8\xdd\x4a\xa4\x94\xa1\xbc\x26\x11\xba\xce\xce\xbf\x40\x71\xeb\xf5\x36\xae\xb8\xdd\x46\x65\x2b\x41\x78\x4d\x0a\xf4\x6c\x80\xef\x7d\x96\x65\x0b\x6e\x13\x7b\xbd\x8d\xab\x6c\xb2\xcb\xd5\x29\x51\x8e\xf8\x9a\xd4\x70\x34\xc1\x7f\x2c\xdc\x51\x1e\x6f\xdc\x24\xf6\x8f\x5b\x6d\x24\xa5\x38\xaf\x49\x06\x47\xf1\xfb\x65\x31\x19\x36\x6e\x16\xfe\xe5\x76\x64\x28\xc3\x79\x4d\x32\x38\x1a\xde\x7f\xdc\x60\xe8\xd8\xb8\xfe\xf5\x1f\xb7\xa3\x43\x19\xd2\x6b\xd2\xc1\x51\xe5\xf0\x71\xef\x22\x51\xd9\xed\x6c\x5c\x48\xa8\x3e\x57\xa7\x46\x05\xea\x6b\x12\x44\xe8\x6e\x23\x96\x64\xa7\xda\xfb\x76\x81\x62\xb5\x71\xc6\xd0\x9d\xae\x4e\x8e\x32\xc4\xd7\xa4\xc5\x63\x05\xf2\x5b\x96\xdc\x44\x8a\x8d\x2b\x53\xaa\xcf\xd5\x29\x51\x82\xf6\x9a\x84\x78\xa2\x20\xbe\x0d\x6e\xe4\x89\xcd\x1b\xd1\x83\xdb\xb2\x44\x09\xda\x6b\xfa\x6d\x75\x14\xc4\x0f\x09\xe7\x63\x56\xed\xb4\xf5\xe4\xfe\xe6\x3d\x4f\xa8\xcb\xd5\x9d\xb6\x8a\x48\xaf\x49\x85\xae\x02\xf8\x9e\x45\x1f\xf9\x7c\x01\x11\x36\xaf\x53\x61\x8f\xab\xd3\xa0\x80\xf2\x9a\x24\xe8\x29\x78\x68\x67\xbd\x61\x4d\x6c\xfe\xa6\xc0\xf4\xba\x3a\x29\x4a\x51\x5f\x93\x1c\xbb\x9a\xbc\xa4\xad\xde\x44\x90\x8d\x6f\x1c\x76\xbf\xab\x93\xa4\x02\xfd\x35\x89\x72\x5f\x41\xd5\x2f\x19\x16\x50\x64\xe3\x2a\xb7\xee\x74\x75\x72\x94\x21\xbe\x26\x2d\x1e\x58\x4c\x47\xf6\xf8\x9b\x08\xb2\x71\xe5\xdb\xed\x79\x75\xaa\x54\x0e\x61\x4d\xd2\x3c\x54\x70\xf1\xc5\x44\xca\x07\x37\x51\x66\xe3\xaa\x86\xd3\xf1\xea\x84\xa9\x1a\x80\x45\x97\x2f\xfc\x2f\xf7\x54\xe3\xc9\x17\x7a\xaa\x71\xab\xf7\x15\x7e\x9c\xf0\xd3\xdf\xd2\x53\x9e\x3e\x3c\x1d\xb3\xac\xfa\xd2\xe8\xe1\xe3\xce\x6d\xdf\x70\x14\xfb\x38\x35\x0f\x5d\xca\x38\x21\xaa\xaf\x06\x8e\xde\xc3\x00\x4f\xc3\x20\xca\x20\x8a\x9b\xf8\x24\xbb\x0f\x1d\x41\x69\x7c\x61\xcb\xd3\x8c\x5e\xb2\xc0\x3e\x7c\xba\xde\xdb\xda\xa2\xe0\x57\xe5\x11\x82\x3e\x7f\xb6\x1a\x98\x07\xde\x8d\x86\xcc\x2e\x98\x40\xc4\xb2\xe0\x92\x7f\xef\x36\xdb\x2f\x7f\xfe\x8d\xcf\x90\x4a\xbf\x38\x6f\xdd\xe9\x61\x90\x7a\x83\x2c\xd0\x8b\xf3\xfd\xeb\xf7\xc9\x26\x4a\x98\x53\xc1\x79\x49\xae\xc2\x64\x97\x60\x4a\x19\xe1\x08\x25\x4f\x42\xc1\x07\x54\xd7\x7b\x5b\xd7\x79\x76\x7d\xdc\x59\x2b\x0c\x62\x39\x2b\x75\x1b\x7b\xe5\x5f\xf0\x32\xa5\xfc\xcb\xfd\xca\x2f\x0f\x2a\xbf\x3c\xac\xfc\xf2\xa8\xf2\xcb\xe3\xca\x2f\x4f\x2a\xbe\x3c\xea\x54\x8d\xe7\x51\xa7\x57\xf9\xa5\x6a\xa4\x8f\x3a\x55\x23\x7d\xd4\xa9\x1a\xe9\xa3\x4e\xd5\x48\x1f\x75\xaa\x46\xfa\xa8\x53\x35\xd2\x47\x68\x47\xa0\x29\x6e\xc9\x19\xae\xf4\xce\xea\x34\x5a\xaf\x59\x36\xda\x2b\xc8\xb9\xc7\xdd\xb5\x18\xa7\xdd\x86\x5e\xa7\xd5\x6b\xf5\x5a\xbb\x20\x3a\x68\x31\x3f\x4e\x47\xf5\x59\x03\x17\xf4\xdf\xe4\xa6\x52\x61\x2d\x15\xf3\x21\xaa\x85\xf1\x45\x77\x52\x75\x71\xd7\x7d\x20\x6b\xa5\xff\x44\x48\xd8\x8b\xf8\x9b\x4a\xff\x86\x1d\xaa\x72\xfc\xb1\xb7\xb5\x25\x3b\xae\xcb\xff\x6d\xbd\x87\x1d\x85\x4c\xeb\x3b\xd8\x86\x3b\x75\x6a\xb7\x85\x41\x82\x7f\x7a\x0c\xe7\xd3\x8b\x3e\x8c\xb2\x6c\x92\xf6\xdb\x6d\x3f\x1e\xf0\xd6\x45\x1c\x5f\x84\xbc\xe5\xc7\xe3\xf6\xa4\x7d\xf9\xb8\x1d\xa4\xe9\x94\xa7\x6d\x8a\xeb\xf4\x2c\x18\xec\xef\x3e\xe8\x3c\xd9\x02\xb8\x77\x8f\xba\x1e\x86\x71\x9c\x48\xb0\xf5\x37\x14\x62\xe3\xf5\xc1\x3f\x4e\x7f\x3a\x78\xf5\xe3\x61\xa3\x01\xfb\xfb\xf0\xa8\xdb\xa1\x0e\x3f\xc4\x09\x7c\x9b\xc4\x57\x29\x4f\xa8\x67\x8b\x74\x2f\xa3\x61\x10\x05\xd9\xbc\x01\xcd\xa7\xf0\x86\xbd\xa1\x2e\xfe\x96\xff\xb8\xbf\x0f\xea\xc7\x56\xc3\x83\xda\x6b\x99\x6b\x73\x0b\x00\xab\x5a\x81\x13\xd4\x94\xb8\xd1\xe5\xeb\x33\xd8\x87\x9d\x59\x03\xbe\x81\x2e\x3c\x13\x3d\x41\x1f\x66\xf0\x14\x9e\xdc\x7f\xd2\x79\xd8\x7b\xf8\xa0\xf5\xb0\x77\xbf\xf7\xa0\xfb\xe0\xa1\x14\x67\xcf\x08\xcb\x30\xbe\x10\xb0\x76\xe8\xd7\xab\x37\x3d\xf9\xb9\x4f\xd3\x58\x9f\x41\x13\xba\xb0\x83\xd3\x45\x3f\x1a\xb0\xad\x7e\xed\x40\x97\x42\x69\x5c\x53\xa8\xd4\x3c\x33\xf6\xd6\x62\x46\xc1\x0f\x2c\xd2\x3b\x48\xb9\x50\xdb\x95\xec\xf4\xf2\xf0\xf1\xe9\x8b\xa3\xd7\xa7\x2f\x0e\xbf\x7b\xf9\xe6\xb0\xb2\xfa\x7d\x59\x3d\x8b\xdf\x26\xc1\x38\x10\x62\xba\xb2\xee\x43\x59\x77\xf0\xd6\xec\x32\xee\x93\x4c\xeb\x11\xe9\xb0\x72\xad\xf6\x1a\x26\xfa\x9d\xdb\x1c\xfa\x15\xb1\x63\xe7\xf5\x23\x0f\xde\x7a\x70\x90\xc9\xa0\x6a\x32\x5e\x88\xa2\x46\xfd\x08\xa9\x2e\xf0\xb2\x06\x52\x7f\xeb\xe1\xbb\x4f\xfc\xa6\xab\x5a\x30\x44\xb9\xd8\xe3\x5c\x5a\x35\x20\x4b\xe6\x2e\x33\x0d\xde\x16\x11\xc0\x69\x06\x9f\x61\xc2\x19\xcc\xcb\x27\x36\xff\xf1\x24\x9b\x0b\x6d\xe4\x5a\x82\xae\x5d\xf0\xac\x06\x41\x64\xb5\x14\x3b\x7b\x2d\x2d\x14\x37\x64\x14\x45\x13\x41\xb1\x76\xe0\xfb\x3c\x4d\xe3\x24\xc5\xb8\x88\xe9\x74\x22\x48\xcb\x07\x77\x6a\x1a\x73\xf9\x88\x39\x0f\xe9\xe8\xf8\xed\x09\xec\x5b\x45\x14\x61\x68\xcf\xe4\x93\x3d\xa2\xc0\xee\x79\x06\xdd\x5d\x9b\x41\x83\x74\x21\x83\x76\xd1\x8d\xa3\x20\xd5\x8d\x06\x12\x48\xed\x03\x55\x23\x05\x4c\x94\x16\xe9\x13\x64\xb0\x03\x35\x08\x88\x3c\x4c\xa9\x22\x92\x3c\x72\xa0\x41\x56\x3e\xd2\xfb\x6b\x8d\xb4\x30\x80\x3b\x95\xbc\x7e\xef\x5e\xc5\xc7\xdd\xdd\x46\xdd\x09\x9c\x6c\xcd\xce\x0d\xef\x9d\xed\x55\xf9\xa0\x51\xc7\x94\x2a\x42\x4a\x32\x4c\x47\x7c\xc1\xb3\x7e\x2e\x24\xb3\x84\xfb\x08\x63\xa1\x36\x5a\x0c\xee\xec\xc3\xa3\xbd\x72\x21\xb5\x5e\x96\xed\xa5\x79\x00\x25\x49\xec\x63\x00\xa2\xaa\x8a\x8f\x9f\x34\x5a\xaa\xce\x1e\x06\x78\xa4\xb8\xa0\xaa\xcc\x7d\xff\x2f\x38\xa1\x46\x3c\x80\x2b\x22\x0e\x07\xf0\xf2\x50\x62\x04\xfb\x1a\xad\xba\x6a\x8e\x93\x53\x28\x75\x81\x2e\xc7\xad\x8a\xd9\x52\x78\x56\x81\x1c\x56\xed\xa3\xda\x5f\xc6\x8e\xeb\xa5\x39\x6e\xb7\xe1\x51\xab\xdb\xea\xc2\x07\x4b\xfa\x05\xd1\x64\x9a\xc1\xb1\x07\x6f\x13\x3e\xe4\x49\xc2\x07\x62\xe9\x9c\x34\x96\x9f\xa2\x76\x1b\xe3\xf1\x72\x36\x50\x01\x1c\x0f\xdf\x3f\x84\x74\xc2\x7d\x15\x09\xd3\x83\x2b\x0e\x83\x60\x10\xd5\x32\x0c\x4a\x49\xf3\xf0\xaf\xff\x6a\x6f\x27\x3e\x93\x71\x1d\xa3\x01\xe5\x91\xc1\x58\x42\x3a\xf8\x14\x34\x61\x18\xb2\x0b\x68\xc2\x44\xe1\x89\xd3\x2c\x88\xc9\x80\xc2\xb2\x2f\x9e\x02\x0f\xde\x57\xca\x0c\x4b\x0a\xd0\xa1\x69\x18\x61\x00\x0c\x25\x40\xdf\x0b\x16\x90\x5c\x55\x1f\x46\x82\x4b\xb2\x56\x16\xbf\xc7\x6e\x51\x0d\xa9\xa9\xae\x6a\xb8\x94\x35\xf8\x4b\x16\x0a\x3c\x22\x3a\xc7\x88\xce\x74\x6f\x16\xfc\x3c\x68\x94\xc3\x47\xc3\x0d\x40\xbe\xf3\x25\x51\xcf\x8b\xda\xbb\xcf\x99\x98\x62\x3f\x8e\x2e\x79\x92\x49\x41\x0b\x59\x0c\x13\x3d\xcd\x14\x29\xbd\x51\xce\xde\xcb\x44\xb1\x2f\x17\xac\x66\xa2\xcf\x83\x6c\xcc\x26\x26\x0f\xee\x56\x2e\x93\x90\x1d\xb4\xf7\x8e\xac\x0d\xf7\xa0\x2b\x43\x89\xb8\x01\x7b\xad\x0a\x3d\x59\xc1\x44\xf8\xb5\x3e\xde\x97\x1f\xed\xb0\x7a\x5b\x3a\x2f\x4a\x7e\x98\x0b\xe3\x5f\x2c\x25\x3a\x29\x57\xfd\x02\x79\x48\x82\x73\x14\x0c\xaa\xf4\xb4\xdd\xae\xd2\xe9\x46\xac\x32\xbc\xb8\x06\xf4\xfe\xdd\xf3\xaa\x3a\x4f\x3a\x8d\x7a\x2d\x4d\xfc\x9a\xac\xfa\xe1\xe8\xf4\xfd\x87\x77\x2f\xdf\x7c\x0f\xfb\x50\x53\x7c\x56\x93\xc7\x14\xf5\x1b\xf6\xe1\x3b\x39\xf0\x63\xdd\xe0\x44\x02\x78\xfb\x0a\xf6\xa1\x5e\xab\x89\xd3\x8a\x66\xd4\x56\x3a\x09\x83\xac\xae\x2b\x8b\x2d\xa9\xf2\x90\x17\x44\x42\xfa\x64\xef\xe3\x69\xe2\xf3\x45\x92\x58\xc3\xd7\x3c\x4e\x33\x56\x5f\xc0\x60\x47\x26\xd1\xb2\x07\x29\x1b\x72\x63\x6a\x09\x52\x35\x2a\xa1\x62\xd2\x9a\xc3\x55\x64\x2f\x32\xb5\x32\x4d\x65\x8c\xfa\x5d\x47\x78\xb5\x88\x8d\x79\x0d\xe3\xcf\x89\xc9\xb3\x0b\xb1\x5b\xad\xd2\x1d\xc9\xbc\xca\xfb\x98\x59\x59\x2d\xcc\x85\xb0\xdf\xbf\x7b\x9e\x03\xfc\xfe\xdd\x73\x0f\x24\xa4\x67\x80\x14\x97\xbf\xfa\x62\x1a\x5a\xbf\xc5\x41\x54\x27\x02\xd5\x45\xe7\x0d\xd3\x3d\xf6\x4c\x6c\xa8\x8e\x54\x47\x56\xaa\x67\x52\x7b\x31\x0b\x34\xc5\x47\xd7\x74\x02\x18\xf0\x90\x67\x5c\x56\x27\x3b\x10\xa2\x64\x11\xb6\x91\x6b\x4f\x75\x6f\xe8\xe8\xd3\x02\x50\xb8\xb3\x0c\x06\x30\x64\x1f\xb9\x66\xbd\x7f\xd1\xec\x38\x8c\x13\xf0\xe3\x24\x11\xe2\xea\x2a\x4e\x3e\xc2\x55\xc2\x26\x13\x3e\x80\x31\xcf\x46\xf1\x20\x85\xb6\x1d\x0c\x3c\xa5\xe8\xbd\xea\x5b\x18\x7c\xe4\xf0\x2a\x7e\xc1\xd2\x11\x04\xe9\x1b\x34\x62\x6d\x5d\x37\xea\xaa\x1b\x3b\xa8\xb8\xe6\x5f\x2b\x1e\xab\xc2\xc2\x55\xee\x24\xfb\x60\xd8\xf8\x82\x90\x16\xa5\xc7\xef\xdf\x3d\x3f\x11\xf3\x99\x63\x62\xf1\xad\x51\xa1\xb4\x2d\x34\xe7\xda\x02\x56\x0a\x86\xa3\xab\x48\x9f\xba\xf6\xe1\xd3\x75\xcb\x2d\xbb\x41\xe9\x21\x8e\xb5\x07\xe5\x36\x57\x8b\x4e\x71\x76\x89\xac\x7c\xb2\x8c\x45\xcf\x68\x94\x03\xcc\x0f\x82\x7f\x4f\x66\xca\x1c\x92\xb0\x68\x10\x8f\xeb\x8b\x55\xb4\x3c\xa6\x35\x7a\x36\x57\xaf\xb5\xfc\x38\xf2\x59\x86\xa9\xd4\x05\xcf\x4f\x55\x04\x48\x5a\x31\x7d\x62\xb4\x5a\xe3\xb4\xe6\x41\x7d\x67\x27\x18\xc0\x0e\x4c\x66\x0d\xbd\xc5\xd6\x77\x1f\x36\x2a\xc6\xb6\xb6\xd1\x89\x42\x8f\xb3\x10\xda\x90\xa2\x5e\x45\x99\xb5\x66\x19\xc8\xfb\x0b\x32\x06\x58\x42\xa9\x5c\x84\xf7\x16\xd3\x46\x28\x43\xd9\x88\x65\x1e\x50\xba\x15\x79\xaa\x56\x60\xeb\xc3\x48\xcb\x05\x0c\x5c\xee\x90\x49\xeb\x0c\x43\x94\x4e\x2a\xf7\xaa\x0d\x49\x66\xc9\xec\xf6\x8b\x69\x4d\x58\xc1\x90\xac\xf4\x11\x42\x88\xa9\x90\xa4\x7b\x06\x4e\xaf\x0c\x8e\x07\xe7\x37\x81\x12\x55\x8a\xd0\x76\x2b\xa0\x79\xe0\x2f\x01\x50\xd4\xb2\x60\x5e\x1b\x06\x33\xd0\xda\xdb\xd0\x6a\xb5\x58\x72\x91\xc2\x76\x3b\x67\x9f\x1a\x46\x3a\x14\x2b\x82\xd4\xa1\x58\xf7\x2a\xd5\x8b\x27\xcb\x98\x8f\x6e\xd2\xa2\xec\xf3\xb5\x94\x44\x41\x26\x8e\x83\x46\x0e\xdd\x78\xd2\xd6\xe0\x96\x3a\x6a\x3f\x59\xcf\xa8\x60\x4c\xb0\x0f\xa4\x1d\x31\x0d\xa2\x55\x4d\xb0\x7f\xc3\x46\xda\x8c\x2a\x7e\xd8\xe9\x50\x14\x48\x5b\x4e\xdc\x09\xd2\xef\x82\x28\xc8\xb8\xb6\x24\x7e\xfe\x0c\x33\x21\xb1\x3b\xf0\x0c\x66\x68\x4d\xfc\x06\xff\x6e\x52\xf3\xe6\x4c\x1c\xf0\x8c\x11\x51\xd9\x10\xa5\x6d\x70\x1b\xb4\x7d\xf0\x1a\x47\x55\x61\x25\x45\x58\x1d\x34\x8f\x36\x3b\x4b\x59\x7a\x71\x68\xf7\xee\x41\x17\xda\x72\xa0\xa2\xfd\x53\xe8\xd8\x86\x53\x1a\x63\x9f\xfe\x07\xca\xf6\x90\x27\xeb\x99\x44\xcc\x3c\x3d\x92\x23\xc9\xd8\x2d\xe6\x49\x34\xd2\xf3\x24\x7e\xec\x2d\x22\x16\x76\xd1\x24\x6a\x2d\x47\x2c\x84\xaf\x89\xa5\xdb\x7f\xe3\x52\x4b\x48\x41\xf1\xcd\x36\x33\xcb\xe1\x54\x98\x99\x2d\xbe\xd0\x2c\x50\xef\xc2\x0e\xcc\x1a\xd0\x86\x7a\x17\x9a\x30\x6b\x88\x3f\x7b\xd5\xf6\xe1\x27\xeb\x99\x5e\xcc\x0c\x3c\x21\x1c\xfc\x73\xc1\x79\x2b\x4d\x40\x1a\x5c\x54\xed\x26\x5d\xbc\x16\x2b\x12\xd9\x25\x9b\xe8\xd3\xa2\x9a\x44\xc1\x25\x9a\xe8\x44\x13\x6e\x9b\x70\x9d\xc4\x57\x75\x9a\xd3\xf3\xb4\x3e\x6b\x78\x38\x41\xbb\x0b\x8c\xe9\x4f\xd6\x36\x99\x48\x62\x75\xbb\x92\x5a\xe1\xef\xbb\xbd\x15\xc8\x75\x23\x25\x04\x3c\x9b\x14\x12\x7e\x81\x81\x9e\x3e\x7d\xba\x0f\x9d\x06\x3c\x83\x5d\xc1\x26\xd6\x75\x8b\x23\x4c\x3a\xad\x07\x9a\x5a\xaf\x8e\xbe\xef\x1d\x0a\x71\xb3\xbb\x88\x9d\xd6\xcb\x1d\x67\x51\xa8\x27\x29\xb4\xfa\xdd\x17\x9f\x4d\xd4\x6a\xe6\xb3\xc9\x12\x44\x73\xef\x76\xca\xaf\x76\xf8\x6c\xa2\xd9\x67\x47\x74\x21\x64\xef\x4d\x6b\x6b\xbd\xb3\xb9\x45\x8c\xfb\x7a\x38\xe3\xee\xaa\xe2\x0d\x1b\x55\xae\xaf\xfb\xa5\x5c\x95\x13\x62\x75\x09\xe4\xce\xbe\x85\x87\x23\xe9\xb1\xa4\xaf\x3a\x2b\x25\xc6\x32\xc7\x85\xa5\x88\xf1\x50\xb2\x2b\x26\x45\xde\xd4\xe2\x01\x02\xd7\xaf\x88\xc3\xd2\x69\x94\x0d\xea\x51\x67\x3d\x1f\x81\x9b\x06\x75\xa3\x64\xc4\xb3\x49\x7c\xa5\xd8\x7d\x12\x5f\x51\xd9\xe1\xdb\xf7\x2f\x5f\x1d\xbd\x81\x7d\xf1\xb5\xde\xf3\xa0\x89\xbe\x8e\xd6\xa7\xdd\x9e\xf5\xb1\xa7\x60\xbd\x3e\xf8\x87\xfd\xa1\xdb\x7b\x24\x96\x7f\xbd\x07\x4d\xd3\x4e\x55\x7d\xe9\xc2\xe8\xe2\xbb\x35\xfc\x84\x63\xf8\x10\xf0\xf4\x43\x7c\x78\xc9\xdd\x74\xbc\x91\xa3\xf0\x44\x42\x3d\x81\xb6\xc6\xb7\x69\xff\x22\xcd\xae\xa0\x57\x5a\x74\xc2\xcc\x8a\x0a\xb4\x26\x9d\xb6\xa0\xfc\x8d\x9d\xeb\x06\x24\xe2\x95\x45\xf6\x6f\x92\xb2\xb4\x2b\xe8\x62\xe6\x41\xc2\xd3\x69\x98\xa9\x13\x08\x42\xf8\x86\xc6\xaa\xcf\x1e\xd4\x78\x3b\x3f\x4c\xaa\xdc\x96\x84\x69\x5b\x04\x13\x12\x14\x0b\xb7\x4d\x21\xde\x0f\xc2\x3e\xe0\x7e\x6d\xe6\x44\x37\x13\x8d\x04\x40\xd2\x75\x53\x72\x19\x62\xd0\x84\xba\xf8\x8f\xf8\x82\x58\xb7\xdb\xd2\xf9\xa7\x39\x08\x52\x76\x1e\xf2\x66\xc4\x67\x59\x33\x0c\x22\x0e\x51\xdc\x4c\x79\x38\x6c\xfa\xf1\x78\xc2\x12\x2e\x87\x24\x81\x3d\x95\x73\xfd\xf9\xb3\x02\x7f\x67\x5f\xfe\x55\x18\xa8\xba\x15\xb7\xf4\x6e\x4d\x03\x49\xae\xa2\x0e\xfe\xa8\xb3\x29\x37\x88\xae\x54\xee\x46\xf3\x49\x9c\xd5\x8f\xd1\x1e\xda\x3d\x96\x46\xd9\xde\xb1\x07\xff\xf5\x9f\xff\x2f\x9c\x9c\x9c\xac\x24\x16\x5d\xd6\xb8\x79\x93\xc0\xce\xad\x5d\x82\x90\x21\x5c\x14\x2a\x78\x21\x5b\x98\x10\x35\x17\xd3\x68\x9a\xf2\x41\xf3\x92\x25\xa9\x34\xef\x26\x90\x4e\xc7\x64\x64\x50\x05\x81\xfb\x93\xbd\xc2\xe5\xa3\x4f\x6a\x2a\x45\xa9\xae\x10\xb2\xe4\x22\xd7\x24\xb9\xf0\x60\x10\x5c\x52\xc9\xd5\x28\x08\x39\xd4\x03\xf8\x06\x61\x99\x43\x26\xb5\x13\xab\x42\x03\x3f\x0e\x76\x76\x4c\x5e\x09\xc1\x2b\x08\xfd\x1b\x51\xd7\x4e\x11\x31\x08\x2e\x61\x9f\x7a\x6e\x8b\x6f\x26\x02\x35\x0d\x47\xfc\x77\x1b\x6b\xd1\x7f\x77\xa0\x6b\xaa\x48\x84\xad\x66\x96\x65\x4e\x7c\x13\x67\x88\x42\x67\xd4\x57\x58\xe8\x6c\x67\xdf\xf4\x93\x83\x27\x3f\xeb\x26\xd7\xf6\x76\x4e\x58\x58\x0e\x1f\xf0\xcc\xfc\xd9\xa7\xcf\xdb\xd6\x51\x2a\x9d\x8e\xab\xd5\xc2\x47\x9d\xf5\x7c\x2c\x2c\x4e\x7f\x4c\x7d\x06\xe3\x69\x58\x9f\x79\x30\x5f\x6d\xa7\x17\xcd\x14\x53\x8b\xbf\xe9\x18\x93\xc6\x63\x0e\x3f\xf3\xf3\x7f\x0f\x32\x75\x85\x96\xc2\x90\x05\xa1\xb4\x3c\x9e\x07\x17\x40\xf9\x6b\x52\x8f\x2a\x8f\x58\x0a\x57\x49\x1c\x5d\x00\x4b\x82\x6c\x7e\xa3\x7a\xb0\xea\x55\x33\x22\x5a\xef\xcc\x86\xf2\x9f\x07\x0f\x1a\x42\xfc\x34\x1f\xa0\x05\x52\x7c\x95\x8c\x2e\x4a\x7b\x7b\x5b\xd7\xb9\x73\x92\xa8\x61\xad\x45\x43\x2e\x9d\x3f\x38\x81\x1f\x5f\xbe\xf9\xd0\x7d\x28\xd6\x06\xf6\x63\x16\xc8\x2c\x42\x35\xce\x14\xcc\xb1\x60\x6e\xd5\x10\x54\x94\xed\xef\xc1\x2c\xb2\xaa\x3a\x5f\xe6\xf2\x8b\x1c\x56\x07\x3e\x8b\xa6\xdb\xa2\xd6\x0e\xd4\xeb\x16\x04\xa1\x6f\x43\xf7\x61\x43\x7d\xc4\x6a\x75\x0b\x90\xae\xf0\xcd\x37\xd0\x7d\x88\xbf\x3a\x8b\x38\x6e\x53\xf6\x8d\x5e\x57\x1f\x1d\xbb\x9d\x0d\x1e\x44\x10\x9e\x35\x45\x0a\xbe\xab\x55\xdb\xde\x4f\xe6\x94\xd1\xed\x1c\x2e\x18\xf9\xa6\x2c\x06\xbd\x8e\x19\xf9\x64\x63\x5a\x24\x42\x2b\x57\x22\x77\xbb\x0f\x2a\x94\xc8\x4d\x1d\xc1\x7b\x3d\x3d\xa4\x4d\x1e\x2a\x05\x38\x77\x2a\x8b\x47\x4a\x7b\x26\xdb\xda\x8f\x6d\xc1\x34\x6e\xea\x24\xdd\x93\x22\x53\x6a\x72\x9b\x99\x45\x01\xac\x7c\x12\x85\xda\x5d\x3e\x89\x9b\x3a\xf8\xee\x76\xd4\x80\x56\xb6\x64\xdd\x7c\xd2\x2b\x3d\x1e\x93\xbb\x66\xc4\x31\x41\x64\x12\x8f\x83\xe9\x18\x76\x1f\xe3\x2e\xc0\x60\x92\xc4\xe7\x21\x1f\xd3\x56\x71\xc9\x93\x39\xa4\x63\x16\x86\x6a\xc7\xd8\xf8\xde\x70\xc7\x0c\xbe\xd9\xe3\xcd\xee\x23\xda\x19\xf0\xcf\xe2\x46\x40\xf6\x45\x93\xf0\x2b\x28\x31\x97\x19\xf5\xdf\x78\x67\x6a\xff\xcb\xba\x3a\x52\x43\x93\xc8\xa7\x8f\xf5\xda\x07\x53\x1e\xfd\xd1\xeb\xb2\x29\x4f\xfe\xf8\x0b\x8f\x46\x08\xfd\x50\x34\x58\x24\xae\x37\x65\x08\xd8\x95\x2e\xc1\xb7\x30\x73\xde\x92\x39\x6e\x90\x0d\x39\x83\xa5\x6b\xaf\x44\x75\x14\xf6\x25\x61\x25\xf9\xcd\x66\x7a\xae\x3f\x35\x55\xb1\x9c\x32\x06\xae\x6a\xd6\x85\xbe\xa8\xed\x94\x35\x45\x21\x1e\x86\xce\xd1\xda\x89\xb3\x64\xdb\x66\x16\x4c\xc7\xa6\x4c\x11\xbb\xd2\x2e\x93\x25\xd3\xc8\xdf\xa0\xc4\x45\x78\x36\x59\x11\x7e\x90\xe5\x8d\x52\x81\x38\xc7\x75\x94\x1b\x31\xda\xef\x94\x2d\xd8\xe7\x41\xd8\x20\x1f\x84\x2a\x32\x74\xd7\x33\x5e\x90\x8f\x02\xb9\x65\x57\xf2\xd5\x43\x99\xb1\x65\x0b\xb6\x01\x53\x0f\xa6\x42\xd1\x3f\xc3\xf3\xd2\x19\x04\x29\x9c\xbd\x61\x6f\xce\x5a\x5b\x80\x35\xb6\xb7\xdf\xc4\x19\xef\x6f\x6f\x53\xae\x68\xba\x13\x17\xb5\xce\x59\xca\x07\x10\x47\xa2\xd2\xf1\xd9\x1b\x95\x6d\x51\xb4\x3d\xa9\x2b\x1f\xf3\xf1\x20\x6a\x05\x71\x9b\xbe\xb6\xf1\x6b\x03\x3d\xc0\xe4\x1d\x12\x3a\x82\xb1\x31\x07\x96\x0a\x38\xd2\xed\xe5\xf8\xac\x02\x8e\x04\x70\x35\x0a\xfc\x91\xa4\x78\x0a\x67\x59\x22\x10\x1f\xc6\x89\x00\x71\xa6\x2f\x26\xcf\xb0\xa3\x18\x93\x3d\x47\x71\xd4\x24\xf1\x28\xd3\x1e\xa9\xe1\xfd\x6b\x9a\xb1\x2c\xf0\xf1\xcf\x31\x17\x15\x8e\x86\x70\x4a\x5f\x82\xc8\xe7\xd0\x69\x75\x5b\x1d\xfc\xed\xb3\x8c\x5f\xc4\xc9\x1c\x5e\xb1\xe8\x02\x4b\x26\x2c\x61\x63\xf8\xb4\x7d\x2d\xf3\x6c\x7e\x18\x49\xff\x27\xc8\x62\xf0\x05\x69\x5b\x58\x4f\x61\xfa\xe9\x3c\x8e\x43\xce\xa2\x6b\x78\xe7\xe2\x5e\x42\x7f\x8f\x8e\x4c\x67\x98\x08\xe9\x8c\xe0\xf0\x19\x1b\x4f\x42\x2e\x51\x3f\x25\x6a\xd7\x05\x49\xf6\x44\x41\xbb\x0d\xfb\x4f\xd1\xd5\x39\x57\x23\xe2\x57\x40\x53\x80\x95\x2b\x6a\x53\x5d\x73\xaf\xbb\x18\x66\x69\x3d\x44\x76\x4b\xb0\xb0\x39\x08\x60\x6d\xcb\x59\xab\xdd\x86\x83\x88\xc6\x68\xb9\x8d\x05\x94\x8a\x33\x8e\xc2\xb9\x22\x21\xa6\xc8\x26\x36\xe1\xff\x9c\xb2\x50\x10\x35\xc8\x52\x1e\x0e\x5b\x04\xe6\x2d\x4f\x86\x71\x32\xc6\x86\x67\xea\x3a\xfe\x03\xbb\x38\x23\xda\xc3\x30\x48\x52\xf4\x4e\x63\x97\x71\x30\x00\x9e\x24\xda\xb5\x43\x9c\xa9\x24\x2e\xbe\xe8\xff\x1f\xd2\x97\x2d\x85\x20\x82\x97\x87\x2d\xdb\x97\x53\x52\x4e\x0e\xe1\xde\x3d\x89\xdf\x9d\x7d\xd8\x91\xee\xd4\xd7\x25\x26\x31\x1c\x77\xc9\x02\x5f\x68\x81\xf9\xa3\x1f\xdc\x61\xfa\xa9\xea\x10\x1e\xb7\x7d\x63\x27\xc1\xae\xf5\xb0\x4e\xc2\xb8\x6d\x36\xa5\x49\x12\x4f\x4e\xb3\xf9\x84\x57\x07\x6b\xb9\xe5\x13\x42\x17\xf6\x1a\x63\x74\x01\xdd\x36\x57\x12\x66\x91\x8d\xd8\x78\xc1\x40\x7b\x9b\x80\xbd\xc6\x40\x5d\x40\xb7\xce\x87\x34\xcd\x82\xf0\xf4\xed\x34\xe1\xef\x30\x45\xea\x82\x20\x3c\x6b\x64\x1a\xba\x6d\x0a\xae\x15\x52\xf8\xdc\x32\xd4\xf8\x0a\x49\x6f\x90\x52\xef\xc4\x02\xfa\x31\x0b\x16\xf5\xa1\xee\x18\x4e\x29\x6d\x7d\x6a\x1e\xf4\xb0\x14\xad\xc9\xb6\x31\xbf\x9e\xb1\xe4\x82\x0b\x85\x07\xdd\xe9\xea\xca\x36\xda\xdd\x83\x80\x2c\x92\xae\x41\x14\x82\x9d\x9d\x06\xa6\x5e\x4b\x20\x55\x9e\x9a\x96\x65\xf3\x64\xcf\xc0\xf9\xc8\xe7\x42\xf2\x52\x35\xd1\x08\x9d\x02\x09\x15\xed\x5d\xd7\x2a\xf3\x2e\xa3\x26\xe4\x61\x26\x1a\x12\x92\xca\x81\x90\xbe\x92\x23\x22\x5c\xe3\xff\x29\xf7\x3b\xac\xb7\x07\xd7\xf2\x82\xc4\x4e\x76\xec\xdc\x8e\xe0\x78\x4b\x9f\x23\x05\x3c\x95\x34\xf1\x30\xa9\x7f\x5a\x20\x4d\x87\x48\x43\xc9\x15\x4b\xc8\x32\xe0\xa9\x9f\x04\x93\x0c\x53\xed\x62\x2d\x24\x8b\x29\x6e\x19\x6f\x66\xd8\xaf\x28\x17\x73\x24\xf6\x5d\xa7\x9d\xed\xe6\x0c\xfb\xb8\x81\xef\x21\x51\xef\x92\x83\xb6\xa0\xb6\xa9\xde\xb0\x9b\x2a\x07\x68\xdd\xac\xfc\x19\x8a\x1a\xb9\xd5\x12\x3d\xe5\x2c\xa8\x7b\x36\xc1\x0d\x45\xad\x1c\xd6\x48\xb8\x2c\xc6\x34\xcb\x1e\x90\x2e\xa6\x12\x41\x23\xba\xe6\x73\xa3\x48\x7c\x0b\x90\xed\x83\x69\xb5\xa1\x31\x3b\x70\x17\x41\x71\x51\xd8\xd3\x49\xca\x4d\x0d\xc1\x30\x70\x5d\x6f\x68\xae\x11\xfc\xe2\xc9\xff\xed\x79\x70\x9a\xf1\xf1\xc4\xf6\x29\x3a\xcd\x91\x2d\x3e\xff\xcd\xf8\xae\x4e\x35\xaf\xcb\x05\x10\x9f\xff\x26\x4a\xca\x29\x6e\x9a\xba\xf9\xdd\x3d\xc7\xe7\x9d\x32\xee\xbb\x6e\xee\x54\x66\x3c\xdb\x55\x1a\x44\xed\x59\x2b\x3a\xb6\x9c\x6e\xc5\xac\x5f\x5b\x2f\xbb\xf7\xe0\xda\x1e\x52\x2e\x73\x79\x10\xa5\x19\x8b\xc4\x22\xb4\x08\xa5\x06\x76\x47\x7f\x06\xf5\x47\x3c\x74\x2a\xe2\xaa\x45\x4f\x33\xa1\xa7\xba\x8f\x0d\x84\xf2\x27\x96\x39\x30\xc0\x4e\x01\x0d\x20\x0a\x93\xbb\xc4\x61\x36\x6a\xd5\x79\xd2\x85\xe2\xe8\x21\x30\x8d\x9a\x28\x72\x7b\xd7\x11\x6a\x25\x0a\xe8\x9d\x3b\x62\x69\x54\xcb\xe0\x9c\xf3\x08\xc4\x51\x37\x60\x61\x20\xce\x3e\x4d\x48\xa7\x13\xcc\xd5\x6d\xd7\x10\x3d\xf0\x01\xa1\x26\x29\x88\x23\xb8\x77\x4f\x7b\xda\xe1\xef\xfd\xfd\x7d\xb8\x4b\x5a\xe7\x5d\x7c\xe5\x9f\xff\x66\x46\x09\xcf\xa8\xb8\x0f\x02\xe3\xdc\x64\xe8\x1c\xf4\xe9\xf4\xfc\x39\x71\x23\xa2\x85\x7f\xab\xa1\x4a\xe0\xe6\x03\xdc\x71\xba\x10\xd8\xe5\x3e\x62\xf6\xde\xaa\xa9\x79\x2f\xea\x8a\xf3\x68\xc2\xd3\x54\xa0\x31\x9e\xa6\x19\xf0\x00\x0f\x5b\xe7\x1c\x1b\x43\x9c\x58\x73\xe5\xa1\x22\x7f\x17\x76\xa0\x80\x0b\x92\x4a\x61\x6f\x16\xb2\xd9\x8c\x48\x34\xd7\x2d\x04\x1d\x74\xed\xb5\xff\xc9\xf6\xe3\xee\x9b\x85\x62\x88\x63\xaf\x15\x94\x9b\xf9\x85\x51\xb6\x78\xf0\xbd\x9c\x14\x26\x16\x71\xcb\x43\x36\x3c\x2b\x2f\xaf\x98\x20\x83\x9b\x95\xbe\x7f\xdf\xaa\x82\xf3\x2d\xcf\xeb\xff\x3a\x0c\x42\x7e\x74\xc9\x93\xcb\x80\x5f\xc1\x0b\xa9\x92\x51\xa6\x45\xb1\xa8\x32\x1e\x65\x78\xfe\x52\xff\xf0\x71\xc7\xcb\xff\x38\x84\x7d\xf4\x11\xc2\x27\xc1\xcf\x8f\xde\x9c\x7e\xf8\xe5\xed\xe1\x7b\x54\x0b\x56\xd1\x23\x8e\xef\x9e\xdf\x85\xf6\x36\xbc\x3a\xfc\xfe\xf0\xcd\x0b\x09\x64\xbb\x7d\xd2\x1a\x06\x61\xc6\x13\xcb\x80\x28\x86\x5c\x70\x77\x47\xbe\xaa\x45\x71\xc4\x6b\xd2\x7f\x5d\xe0\x23\x47\x41\x83\x90\x63\xd0\x73\xbf\x40\xad\x2c\x53\x09\x8f\xef\x32\x44\x50\x29\xab\xdb\xed\x93\x46\x9d\xe4\x15\xec\x43\x1d\xa5\xb3\x18\x35\x89\x6b\x67\x9f\x3f\x35\x59\x78\x11\x6f\xb3\xb0\xca\x10\xf4\xe0\xd4\xc9\xda\x0b\x06\x52\x59\x75\x9d\xcf\x3f\x2f\x3b\x85\x80\xf1\x4a\x9b\xe4\x52\x06\x2f\x90\x6c\x04\xa3\x14\x4d\x8b\xa5\x3e\x7f\x2e\x0f\xfc\x51\xda\xae\xd1\xd0\x6e\xc9\x02\xb6\x71\x4b\x96\xb6\x2b\x41\x1f\x4b\x61\xaa\x20\xd1\x31\x8d\xf9\x23\xe6\x59\x4e\x70\x8a\x5e\xfa\x71\x54\xf3\xb6\x68\x68\xc8\xd4\xe2\xdf\x36\xd0\x04\xe2\x51\x7e\xc2\xb2\x11\xc4\x43\x08\xfc\x38\x52\x9f\x95\xa9\x85\x46\x70\x8d\xe9\x9b\xe1\x85\xf8\x4f\x3c\x04\xce\xfc\x11\x84\xb4\x06\x82\x8c\x8f\x75\x23\xf5\x2e\x8c\x2c\x03\xd7\xf0\x56\x40\xe6\xf4\x3a\x51\x56\x6a\xdb\xcf\xba\xf4\x14\x1a\x5c\xeb\xa2\x27\x73\xf9\x8d\x8a\x5d\xc4\xd0\x66\x40\xd9\xa0\xf7\xed\xfc\xd9\xce\x27\x39\x7f\xd4\x68\xc4\xc2\xe1\xfb\xe0\x77\x21\xd4\x70\x39\x4a\x27\x35\xed\x74\x10\xcc\xb2\x91\xfb\xfd\xa1\xfd\x3d\x1b\x05\xc9\xc0\xfd\xbe\x6b\x7f\xf7\x25\x2e\x02\x5b\x8d\x05\x3c\xcb\xe1\xda\xa7\xef\xbe\x83\x9d\x90\x69\x58\x4c\x32\x57\xac\xd0\x30\x88\x78\xcd\xbe\xf1\xbf\x31\xb0\x51\xe1\xcc\xdf\x62\xb9\x77\xaf\xb5\x89\xb1\xa5\x6a\x77\x01\x4c\xb9\xfd\x73\x30\xc8\x46\x7d\xb8\x6f\xa7\xfa\xa6\xb4\xdb\x24\x2a\xbc\x42\x8b\x3e\x8d\xd7\xfe\x30\xe8\x43\xed\x75\xc7\xab\xc1\x8e\x21\xf5\x0e\xd4\x46\xa2\xc0\x10\x6f\x07\x6a\xbf\x46\x60\xfd\x3b\x10\xdf\x0d\xf1\x77\xa0\xe6\x15\x4b\x3a\x5e\xd7\xeb\x62\x79\x0f\xb6\x5d\x68\x85\x0e\x5d\xf0\x3f\x88\xcf\x38\x5f\x3b\x50\x7b\x7d\x1b\x08\x2b\x22\x58\x0d\xda\x26\x16\xca\xa0\x37\x6c\xcc\x71\x59\x52\xae\xf4\x26\x2d\xa0\xa6\x58\x75\x35\x93\xbf\xbc\x51\xe2\x12\x92\xe3\x96\x84\xfb\xd9\x1f\xc7\x2d\x65\x5c\x41\xdc\xb2\x88\x27\xe4\x9a\x79\xac\x79\x42\x4d\xca\xa5\xfe\xb1\x0d\xbb\xd0\x86\xfb\xba\x46\x53\x55\xf9\xbd\xb6\x36\xed\xb6\xb6\x36\x46\x99\x55\x4c\x0b\x25\xbb\xa1\x4d\xd2\x52\xb2\xf9\xb3\x7e\x09\xcf\xf8\xf3\xb2\xd2\x34\xf8\x9d\xf7\x91\x7a\x6e\xd9\x07\x4a\xb7\x3f\x08\xd8\x98\x67\x3c\xb1\xe8\x47\x89\xf8\x35\x03\x6d\xb9\x94\xba\x2e\x6c\x0b\x2f\x12\x76\x85\x32\x3d\x15\x82\x9e\xc8\x5c\x10\xef\xa8\xa1\x48\xfa\x5c\xc3\x4b\x51\x5b\x4b\x77\xb1\x5b\xa9\x31\x3b\xfb\x90\xa8\x55\xf3\x16\x49\x7f\x51\xa3\xee\x8a\xfe\x53\x21\xeb\x7b\x52\xe6\x3b\xf2\x1d\x6d\x79\xa9\xb3\x1b\xd8\x5c\x33\x61\xf3\x30\x66\x03\xa1\x7a\xd0\x4e\x21\x0b\xec\x3a\x82\x7b\xa4\x88\x97\x95\x54\x89\x5d\x2b\x64\xf3\x78\x9a\x99\x3a\xf4\xdb\x59\x0d\x71\x32\xc6\xd0\x8c\xa6\x92\x2e\x72\x70\x16\x3a\xe4\xb7\xf1\x0c\xf6\xe1\x13\xcc\xfa\xd0\xf1\x60\x8e\xff\xbd\x22\x81\x8c\xf3\x0a\x23\x1e\x5c\x8c\x32\xfa\xa5\xde\x4d\xc9\x7d\x30\xe3\xe3\xf7\xd9\x1c\x0d\x05\xb6\x73\x58\x3a\x09\xd9\xbc\xaf\x11\x15\x22\x62\x14\x27\xc1\xef\x71\x94\xb1\xb0\x06\xcf\xa0\x16\x44\x62\x87\x69\x9e\x87\xb1\xff\xb1\x06\x7d\xa8\xd1\x5f\x66\x10\x63\x96\x5c\x04\xd1\x3b\xea\x19\xc3\x09\x81\x79\xb5\x25\x77\xcc\xcb\x0b\xdd\xb9\xe9\xd4\x05\xed\xc1\xa5\x38\xe3\xfb\x2c\x3c\x08\xd1\x7d\xa0\x36\x0e\x06\x83\x90\xd7\x3c\xb7\x87\xfb\x68\x05\x72\x96\xa8\x9c\x9f\xd6\x98\x4d\x2c\xad\x96\x47\x59\x32\xf7\x20\xb0\xa5\x9d\x31\x03\x08\xa9\x60\xb8\x42\xc6\x19\x08\x22\x16\x7e\x67\xcd\x08\x82\x30\x13\x82\xd6\x1b\x33\x3b\x76\x53\x0d\x73\xa1\x9a\x5e\x6e\xa5\xad\x37\xea\x75\x0b\x29\x67\x86\xa0\x44\x70\x65\x7c\x5c\xeb\xcb\x6b\x1e\xf9\xef\xda\x2b\xd8\x2e\x2c\x88\x1e\xd4\xac\xb6\x4d\x21\x30\x03\x19\x66\xe7\xa6\x76\x4a\x27\xa9\x79\x92\x18\xaa\xa0\xe1\xd9\x84\x6c\x34\x2c\x52\x8a\x6d\x87\x2a\x9b\x7d\x07\xb7\x81\x86\x33\x30\xe5\xc2\x3c\x0d\x43\x43\xcb\xeb\xad\x4d\xee\x4c\x36\x19\xc3\xc0\xd9\x1a\x94\x15\xb5\x6e\xa3\xe4\xec\x18\xfa\x4f\xcf\xa9\x91\x0a\x46\xee\x9b\x05\xe5\x7e\x25\xb1\x55\xa0\xb6\x55\xe7\xda\xbb\xf9\xb4\x54\x7e\x9c\x1b\xe2\xfe\x40\xa7\xb7\xc3\x4b\xa1\xe1\x1f\x0d\x9f\x8f\x82\x70\x20\x4f\x4e\x28\xef\xa4\x38\x03\xcd\xfd\x0d\x67\xd4\x9b\x21\xe6\x22\x40\xe5\x96\xf9\xb2\xdd\xcd\x01\xf8\x49\x49\x32\x2d\x47\xb5\x34\x33\x25\x52\x08\xf6\xd5\x1f\x9e\x9a\x0d\x2d\x60\xae\x5d\xa8\x92\x26\xd6\x11\x01\xe9\xd2\xb0\x2a\x7d\x19\xfa\xd4\xd2\x09\x8b\x6a\xf9\x21\x2e\xd4\x47\x04\xb3\x64\x7c\x96\xd5\xf2\x83\xc8\x89\xa5\x67\xb9\x02\xb9\xd6\xb4\x75\x51\x49\xbd\x3e\x58\x1f\xec\x01\xeb\xbf\x8d\xce\xd3\x30\x3e\xbe\xa5\x3b\xf0\xc2\xcd\x37\xbf\xef\x22\x07\xf6\x96\xde\x5e\x7b\x65\xfb\x6b\x6e\xe7\xec\x95\x6c\x9d\x2c\x94\xaf\x3b\x64\x0d\xfc\xbd\xb7\x65\x1f\x95\xee\xa8\xbe\x3e\x7f\x06\xf5\x77\xcb\x7d\xec\x0c\xe5\x92\xe8\xda\xde\x7b\x91\xde\xc5\xdd\x73\xc2\x06\x83\x20\xba\x10\xdb\x70\x6e\x33\x74\x8a\xc4\x9c\xca\x2d\xad\x7a\x9b\xa5\xc1\xa0\xe8\x18\x66\x35\xb3\x87\x6e\x4e\x17\xd5\xf8\xd4\xa6\xa1\xc5\x98\x15\x4c\x29\xa1\x48\xe6\xac\xe9\x85\x66\x91\xc2\xe2\x52\x9c\x68\x47\x13\xdb\x72\x38\x0c\xf9\xea\x84\xf6\x08\x39\x94\x32\x23\xc4\xde\xd6\xf5\x32\xd7\xcc\xc7\x77\xb5\x35\xe7\xee\x89\xde\x87\x7a\x2d\xa9\x58\xc8\x5d\xb8\xf6\x4a\xa1\xae\xbe\x0b\x3e\x11\xda\xae\xda\x61\x7d\xea\xb5\xbf\xf2\xfd\x71\x8b\xb5\xa4\x61\x42\x90\x40\x89\xa7\x5b\xc1\x21\x3f\x17\x05\x86\x74\xf1\x5b\x80\x89\x23\x7e\x34\xac\x1b\x63\x21\x0a\x35\xe2\xb6\x35\xe0\x1d\xdb\x4c\xea\x41\x4d\x29\x68\xb5\x13\x84\xcf\x42\xe9\xe6\x79\x6b\xf0\x3e\x8f\xf0\xc8\x21\xd9\xde\x83\x5a\x22\x44\xbe\x84\x9f\xd3\x07\xd7\xe8\x27\x8b\x27\x02\xf8\x79\x9c\x65\xf1\x58\xfc\x25\x55\x4b\xea\x47\x0a\x86\x5b\xf5\xc0\x92\x84\xcd\x8f\x86\x4b\x7b\x0e\x58\x4d\xf1\xfc\x57\xff\x64\x0b\xd6\xdb\x20\x10\xcd\x69\x1d\x06\xb7\x1c\x80\x6a\x9f\xad\xc7\x7b\x9b\xb1\x4d\x0b\xb9\x71\x4d\x2a\x8b\x63\x0d\xbb\x15\x62\x14\x87\x4c\xc0\xd2\x4a\xfb\xad\xe0\x88\xed\x4e\x40\x89\xa3\xd7\xf1\x34\xe5\x87\xd1\x86\x00\xbd\xe2\xec\xf2\x76\x24\x37\x80\x9e\x87\x81\xff\xf1\xd6\x30\xb6\xae\x2d\xe9\x49\x5f\xde\xca\xa3\xf1\x27\x47\xb2\x75\xef\xdb\x02\xc5\x11\x0b\x46\x10\xe8\xe5\x5c\x5c\xbb\xfa\x2c\x57\x9c\xd8\xda\xbf\xf8\xbe\x5f\x43\x4c\x32\x3e\x9e\x34\x30\x66\x03\x21\x45\xc1\xb9\x95\x4f\x85\x52\x1d\xa5\x7b\xa8\x13\x0b\x5e\x7b\x60\x61\x6c\x76\xd8\x2f\x37\xb0\x4b\x5f\x4a\xdb\xc3\x6b\xe1\xcb\xa3\x3f\xda\xc3\x6b\xb0\x7b\x3a\x59\x14\x49\x3d\x9f\x8d\x79\x79\x2f\xa8\x53\xbc\x68\x63\x51\xb5\xff\xd8\xc3\x5b\xfa\xc8\xf4\x4e\x17\x47\x7f\x47\xcf\x18\xf1\xcf\x04\x65\x48\xfc\x97\x51\xc4\x65\x8e\xf3\xfa\xc0\xb9\x79\x1a\xb4\x02\xf3\x0d\x9d\xf5\xec\x76\x47\xd3\xac\xb2\x5d\x6c\xbe\x15\xda\xbd\xcf\x58\x92\x61\xde\xf0\x42\xb3\x54\x7f\x2a\xb4\x3a\x8c\x06\xe5\x6d\xb8\xfc\x50\x68\xf1\x96\x95\xb7\x80\x7b\xf7\x60\xd0\x9a\xc8\xaf\x7b\xd0\x6e\x03\x3a\xea\xea\x98\x41\x77\x1c\x48\x81\x58\x46\xa9\x38\x22\xce\x3a\x1e\xcc\x3b\x1e\xcc\xba\x1e\xcc\xbb\x1e\xcc\x7a\x1e\xcc\x7b\x1e\xcc\x76\x3d\x98\xef\x9a\x97\xba\xb3\x6e\x07\xf6\x61\x86\x11\x2b\x44\x13\xfc\x39\x17\x3f\xe7\x5a\x13\x9d\xe1\x73\xe3\xd9\xae\xa8\x23\xc0\xe0\xcf\xb9\xf8\x39\xef\xa9\x3a\x42\xe3\xae\xcf\xf0\xa5\x6d\x7d\xde\xc1\x4f\x0d\xf1\x5f\x2a\x99\x75\xb0\x2d\xfa\xf7\xd7\xa9\x4c\x74\xdc\x04\x6a\x31\xef\x76\xec\xd0\x32\xc7\xb3\x0e\xec\x40\x46\x95\xc4\x30\xe4\xaf\x79\xb7\x73\xa2\xe2\xa9\x08\x45\x6e\x9a\x71\x98\xf0\x64\xc2\xa3\x41\xe0\x4f\x43\x96\x40\x3c\x1c\xa6\x3c\x03\x7c\xf8\x89\x96\x44\x7c\xca\x96\xf8\x2d\xd1\x64\x94\x65\x93\x7e\xbb\x2d\x98\xee\x2a\x4e\xc2\x41\xeb\x2a\x0e\x87\x09\x1b\x63\x58\xec\xe7\x41\xe2\x87\xbc\xf9\x2a\x88\xf8\x4b\x45\xc4\x20\x8e\x5a\xa3\x6c\x1c\x6e\x59\x11\x0a\x92\x88\x27\x1f\x58\x74\x21\x0e\xd1\x05\x22\x27\xe2\xff\x7d\x0f\xfc\x2b\x8b\xc0\x9d\xae\x20\x1e\x0e\xb6\xab\xa8\x35\xc7\x42\xa2\x93\x2e\x0c\x63\x41\x43\xff\x0a\x9e\x41\xe2\x43\x1f\x9a\x89\x2f\xe8\x75\xe3\x99\x5f\x2f\xa4\xe3\xbb\x21\xee\x8d\x18\x5c\x1c\x4f\xf6\xa2\xf3\x6d\x44\x61\x07\xfb\xdc\x16\xff\xd5\xe7\x56\x34\x0a\x86\x31\x95\xea\xc2\x39\xec\x43\x13\x4b\x67\xa6\x74\xd6\x95\xa3\xd8\x81\x78\xa6\x47\xd1\x95\xa3\xd8\x81\x78\x6e\x6a\x4a\x86\x72\x6b\x4a\xb6\x72\x6a\x76\x3a\xc8\x34\x5d\x0c\x9c\xd2\xed\xe0\xe3\x0f\x43\x21\xfc\x38\xc7\x8f\xf3\xdc\xc7\xc1\x0c\xbb\x20\x9a\x6a\x1c\x07\x73\xec\x83\x88\x6a\x4a\x05\xb3\x0e\x66\xb0\x2d\xfe\xb3\x23\x2a\x6d\xc3\x40\xe3\x90\xc0\x3e\x24\x82\xdb\x13\x5f\x15\xbd\x40\xd8\x5d\xe2\x37\xec\xa1\x83\x7f\x1b\x88\x02\xb1\xc1\x5c\xc5\x03\xea\x42\x9f\xc2\x82\xaf\x33\x51\xab\xb4\x1d\x61\xdb\x31\x9b\x51\xd3\x8e\x07\x09\x6c\xe3\xff\x0f\x7a\xd0\x84\x17\xb0\x0d\x2f\x8c\xf1\xc6\x9f\x21\x21\x5f\xe0\xb0\xa1\x29\x49\x21\xc8\x39\xd0\xf4\xf4\xe7\x58\xa7\xf9\x82\xa8\xd4\x94\x54\xca\x55\x9a\x75\x2d\x40\x3b\x15\x80\xba\x36\xa0\x9d\x52\x40\x03\xc4\xc8\xa7\x25\xd1\xe9\x98\xe9\xc3\x62\x5a\x14\x56\x31\x76\xeb\x4b\x09\x65\xd5\xc6\x62\x29\xa9\x3a\x78\x40\x6c\xb7\xe1\x6d\xe0\x7f\xc4\xeb\x65\x3f\x8c\x53\x9e\xa8\x48\xb6\xd9\x55\x6c\x64\xa3\x58\xc8\x93\x38\x88\xb2\x54\x7a\x98\x7f\x38\x7a\x71\x04\x2f\xd1\x35\x3d\xe1\xc0\x60\xc8\xd2\x8c\x27\x70\xc5\xe6\x90\xc5\x30\xe0\x19\x4f\xc6\x42\xa2\xd0\x83\x04\x07\x4e\x16\xc3\x34\xe5\xcf\xe4\x0b\x7f\x31\xb2\x6d\x1c\xdf\x0e\x0e\x67\x1b\xff\xfb\x14\xc7\xb0\x8d\xff\xdd\x41\xc4\x45\x79\xb7\x21\xa7\xc6\x17\xd2\xc3\x97\x83\xef\xda\x27\x5d\x19\x54\x6d\xd6\x17\x35\x65\x5c\xd3\x79\x5f\xd4\xa5\x1f\xb3\x4e\xb7\x0f\x4d\xb5\xca\xe6\xf4\x4b\xb2\xf6\xac\xdb\xc5\x66\x42\xfa\x26\x5d\x68\x43\x82\x2f\xa7\x64\x55\xfc\x38\xcf\x7f\xb4\xd2\x71\x00\xbd\x99\x5f\xa0\x42\xe1\xe6\x4e\xb5\xf4\xe6\x2d\x6b\x9d\xea\x77\x38\x75\x3b\x71\x8e\x8a\xae\x69\xb6\x69\xf4\x14\xb5\xf7\x74\x2d\x84\xcc\x96\x4c\x75\xac\xfd\x5b\xf3\x1a\xca\x62\x5d\xe9\xc6\x15\xe4\xe8\x32\xa5\x1e\x24\x1d\xbd\x68\x26\x6c\xa0\x01\x47\xd3\x30\x54\xe5\x66\xcf\x27\xb4\x8c\x7a\xa0\x6a\xa8\x1d\x9e\xbe\x2b\x45\xc0\x82\x6b\x7d\x55\x9b\xbe\x19\x11\x45\xfd\xdb\x97\x06\x25\xdb\xdd\x84\x25\x7e\xdd\x7e\xdd\x75\x3e\x1d\x0e\xb9\x75\xa1\x67\xff\x29\x58\x69\xc7\x22\x73\x85\x93\x87\xd5\x42\xac\xa5\x1d\x8b\xe8\x37\xb6\x60\xa2\x0f\x43\x8d\x8a\xfa\xd0\x5c\x46\xff\x3b\xbe\x7b\x81\x73\x31\x62\xe1\xf0\x6d\xe0\x1a\x78\x59\x17\x2f\x53\x06\x5f\xb6\x97\x01\x5b\x86\x81\x2c\x50\xc4\x3c\xec\x3c\x25\xc6\x61\x42\x0a\xb1\x8e\x45\x1f\xff\x4a\x4c\x71\x17\x9e\x02\xeb\x48\x5b\x1c\x9a\x15\xe5\x14\x37\xac\xb9\xa6\x99\x5c\x06\x01\x4b\xcf\x57\x28\xa0\x17\x0d\xe2\xa0\xee\x51\xda\x6d\x38\x8c\xd2\x69\x22\x9f\xd6\xe0\x73\x1b\x31\xb1\x90\x10\x43\x07\x29\xb0\xf0\x8a\xcd\x53\x8c\xb5\x80\xce\x38\x2c\xc2\x6a\xc8\x31\xb2\x5a\x4b\xa3\x9c\x74\xe1\x1b\x48\x3a\x0d\xb9\x55\x7a\xc4\x2c\x89\xd8\x75\x04\x0f\x24\xa6\xdb\x97\x29\x04\x19\x30\x92\xad\xcf\xcc\x98\x05\x88\xa7\xcb\x4d\x11\x5d\x54\xf0\x49\x1a\x84\x71\x84\xe3\xd2\x94\x6a\x8d\xe3\x4b\xfe\x21\x16\xdb\x5d\xc7\x1a\xeb\x11\x86\x7b\xc7\x7e\x7d\x54\xe1\xd0\x1f\x31\x8a\xa6\xe1\x34\x25\x1c\x2c\x87\x86\x65\xd1\x18\x23\x1a\x19\x9b\x0a\x14\x96\x65\xaf\x22\xee\xda\xe2\x9b\x1b\x42\xd2\x5d\x51\x5b\xe0\x08\xda\x8f\x15\xbb\x75\x1a\x38\x0d\xab\x01\xf9\x48\x2a\x47\x10\x69\x20\xda\x8a\xaf\xf0\x13\x42\x46\xd0\x97\x34\x59\xd6\xf1\x80\x75\x3d\xb8\xe3\x5f\x39\xb1\x49\x92\xce\xed\xa7\xd3\x32\x82\xe7\x89\xd2\x59\x93\x28\xdd\x06\xb2\xe4\x7a\x44\xe9\x1a\xa2\x94\x92\x45\x92\x44\x90\xc6\xa2\xca\xb5\xb4\x55\x57\x30\x25\x1d\x4d\x24\x5b\xb2\x04\x84\xf2\x10\x27\x16\x77\xda\x97\x20\x0c\x8f\x06\xac\xe3\x5c\x58\xa0\xa2\xcd\xba\x4e\x19\x2a\xc8\xf9\x7a\x9d\x42\xbd\x01\x8a\xea\x01\x73\xcb\xba\x85\x32\x36\x81\x7d\xbd\x3f\x55\x49\x5a\x4b\x07\xc7\x7d\x43\xb4\xa9\xb3\xc9\x1a\xfc\x70\xef\x1e\xd4\xcd\x6e\xfb\x0c\x76\xf4\x8f\x2a\x1c\xfa\x6b\x29\xda\xc8\x21\x89\x50\xd0\x70\x01\x25\x5d\xf7\x9a\x33\xf1\x57\xdc\x09\x02\x52\xc6\x15\x03\xad\xb1\x89\xd0\x31\x44\x1e\x74\x60\xc7\x56\x6f\xaa\xbc\x34\x5d\xcc\x51\x1c\xfb\x6e\x59\xb7\x50\x96\x39\x1c\x93\x75\xf5\x4d\x51\xbb\x0d\x07\xa2\x1b\x75\x3b\xf5\x0c\x2d\x0d\xb4\x8b\xd0\x23\xd9\xa4\x0b\xff\xf5\x7f\xfd\x3f\xb8\x08\x04\x07\x89\xbf\x07\xac\xd3\xb2\x45\xc3\x3a\xac\xe0\x3a\x5b\x4c\x3a\x2b\xce\x84\x4f\xe4\xd4\x6b\x39\x99\x08\xc5\x76\x5d\x81\x30\x71\xa9\x0c\x30\xe9\x6e\x04\xaf\x75\xa5\xf7\xc4\x16\x54\x82\xf4\x75\xb1\xd0\x9b\xfb\x82\x6e\xdb\xd0\x6b\xac\x31\x0f\x02\x82\x32\x44\x88\xc3\x6d\x53\x48\x56\x21\x6e\x76\x04\x74\x0f\xa5\x0c\x76\x64\x10\x40\x29\x46\x92\xa6\xe3\x29\xd1\x84\xc2\xa8\xce\xc4\x5a\x63\xdd\x86\xed\x0b\xab\x31\xee\x22\xa0\xee\xda\x18\x77\x4b\x31\xee\x22\xc6\x42\x5c\x77\x65\x47\x05\x8c\xbb\x0a\x63\x12\xb0\xdd\x2a\x8c\x9d\x5b\x5d\x32\xe9\xac\xbf\x8b\x77\x1d\xd6\x9a\xdf\x0e\x6a\x61\x5b\x77\xa1\x92\x39\x66\xfd\xcd\xb5\xe3\xe2\x7a\x3b\xa8\x85\xdd\xb6\xd3\x28\x8a\x1f\x0c\xee\xc7\x07\xf2\x7c\x27\x95\x38\x29\x5e\xfc\x8d\x89\x17\x32\x68\xad\x3d\x87\xdd\x6e\x4e\x3c\xcc\x6f\x07\xb7\x40\x99\x3c\x5c\x32\x96\xad\x3d\x8f\x9d\x4e\x1e\xdf\xdb\xc1\x2d\x70\x5d\xc7\xf6\xe3\x6a\xb7\xe1\x1d\xa7\x1b\x0d\x32\xc6\xe0\x54\xaa\x13\x08\xf3\xfd\x38\x11\x3b\x0c\x64\xb1\xca\x11\x94\xa1\x7a\x24\x34\x0f\x47\x44\x0c\x18\x7c\xb3\xdc\x84\xff\x46\xc7\xa1\x20\x3f\xd7\x34\xdb\xb1\x8f\xfa\xce\xed\x15\x57\x74\xb2\x37\xb6\xf5\xae\x87\x26\x53\x34\x48\xa1\xb1\x0a\xed\x90\x68\x24\x94\x36\xeb\x6e\x47\x68\x2a\xc7\xea\x47\xce\x67\x09\x80\xa1\x09\xb3\x23\xf6\xfc\xd8\x3f\x2e\xf9\x8e\xc6\x4c\xf5\xbd\x5b\xf8\x7e\x3e\x93\x66\xca\x8a\xf6\xe7\x64\x0c\xad\x6c\xff\x51\x50\xa4\xbb\xa2\x79\x39\x37\xeb\xab\x34\xa5\x5b\x5b\xa6\x39\xb1\xce\x66\xb0\x2d\x46\xb1\x23\x86\xba\x0d\xe7\x73\xbc\x1b\x58\x47\xb5\x43\x88\x4c\x43\x64\xf3\x75\x8d\xb2\xe7\x1a\xc5\x73\x89\x22\x05\x28\x6a\xe4\x89\x19\xae\xaa\x35\xe6\x7b\xc2\x29\x84\x6d\x9a\x4a\xd8\xa1\x29\xa3\xdf\xdd\x13\x6b\xa3\x57\x6a\xde\x1a\x1a\x6a\xe2\x7b\x78\x84\x6b\x42\x88\xd7\x0b\xf5\x8f\x3e\xc5\x54\xda\x2b\x28\x8e\x6b\xf7\xd2\x75\x7a\xd9\x71\x7b\xb9\xce\x6f\xad\x64\x42\xb0\x04\x82\x1f\x87\x21\x9b\xa4\x7c\x80\xd1\x3d\xf0\x56\xc7\xde\x0d\xee\xa0\x02\xb1\x39\xcb\x82\x5a\xd6\xce\x9e\xf4\x22\xe6\x36\x4e\xff\xf5\x9f\xff\x3b\x55\xf6\x14\x21\xc1\x46\xec\x92\x57\xed\x58\xda\xf0\x20\xa8\xb9\x89\x7d\x2b\x43\x1b\x71\xfe\x0a\x4a\x4b\x20\x2d\x95\xe8\x1a\xaa\xeb\x1c\x51\x85\xaa\x5f\xd2\xba\x20\xb5\xf2\xad\xab\x8e\xeb\x59\xa7\xe5\x8b\x95\x91\x75\x5a\xd8\xb1\xf8\x3d\xa7\xdf\x0e\x09\x91\x88\x3f\x08\x2a\x99\x8d\x20\x85\x31\x4f\x2e\xf8\xe0\x99\x23\xeb\x05\x95\xbe\x81\xc4\x6f\x38\xe7\x6e\xec\x47\x82\x97\x78\xad\xc2\x96\x03\x12\x3b\x19\x8b\x7a\xc4\x98\x84\x9f\x27\xf1\x6e\xac\x0b\xad\x2b\xa1\x75\x25\xb4\x3b\x2e\xd1\xda\x6d\x38\xca\x46\x3c\xb9\x0a\x52\xee\xc1\x20\x61\x57\xfa\x3a\x42\x91\x42\x25\xca\xc3\xcc\x3f\xae\x7a\x6a\xef\x62\xff\x8d\x68\xd2\x69\x21\x47\x09\x68\x5d\x43\x93\xf2\xa1\x18\x6b\xd3\xba\x7d\x6a\xee\x93\x7d\x6b\xee\xec\x6e\x62\x96\x09\x7a\x57\x42\xef\x4a\xe8\xdd\x25\x46\x88\x95\xa9\xcd\x66\x26\xcb\x20\xb1\x99\xa1\x95\x31\xf0\x22\x19\x4d\xc6\x2d\xcb\xae\x2c\xe4\xe0\x6f\xd3\xd4\xb1\x76\xb1\xc4\x77\xc4\x60\x95\xa8\xf5\x2a\x6d\x8f\x74\x6c\xcb\xad\x28\xbd\x45\x24\x1c\xa2\x58\x59\xac\x83\xe8\xc2\xa3\x70\x63\x19\xca\x67\x0b\x0f\xdb\xd4\xa6\xb0\x9f\xf0\x64\xc4\x26\xa9\xae\x1d\xe5\x0c\x73\xd6\xbe\x33\xa0\x20\x5f\xca\x22\xe2\x6c\x3e\x6b\x99\x41\x3f\x7f\x86\x3b\xf5\x75\x14\x52\x6b\xfb\x12\xfb\xa2\xa0\xa9\xd2\x3b\x6f\xda\xbe\x0c\xd5\xa0\x1e\x27\x64\xae\x6f\x2c\xbb\x93\x6d\xc6\xf6\x5b\xba\x93\xe9\x1d\xc8\xec\x4a\x49\xc7\x83\x66\xe2\x77\x96\xd9\xca\x4a\x94\xf2\x5c\xf3\xc2\x5e\x26\x29\xf7\x25\xf6\xb2\xce\x12\x7b\x59\xe7\xeb\x92\xdb\x5f\xc5\x5e\xf6\x95\xd1\xe4\x16\x7b\xd9\x06\x46\xf0\x67\xee\x65\x2b\x6c\x65\x6b\x8f\xf4\xeb\xd9\xca\x2c\x99\xb8\xec\x56\x96\xbf\x15\x22\xc3\xa7\x45\x40\xd9\x93\xaa\x8f\x1e\x29\x6f\x59\x36\xd2\x57\xb5\x42\x52\xd0\xed\xaf\x4e\xfc\xe0\xba\x00\x78\xea\x72\x78\x07\xee\x62\xf4\x18\xf5\xd0\x04\x41\xb3\xc4\x6f\xf9\x3c\xca\x92\x18\x13\x26\xe6\x5c\x2d\xc8\xf0\x91\xc0\x3e\xd4\x97\xf0\x05\x80\x9d\x65\xee\xff\x73\x17\x40\x98\x45\x63\xe7\x66\x2f\x80\x1d\xd8\xb9\xe1\x0a\x1f\x01\x2f\x7b\xd1\x6a\x9b\x7a\x8c\x8d\x56\xf9\x0e\xae\x63\x1d\x6b\xc0\x36\x24\xab\xb1\x61\xde\x10\x86\x20\x4e\x64\x5a\x3f\x39\x49\xae\xc7\x8b\x9e\xa7\xd3\x5c\x50\xd9\x7c\x68\x35\x78\x06\x75\xb7\xa9\x8c\xa9\x73\x9a\x8b\x1c\x04\xcf\xe0\x74\x99\x6b\xb1\x9b\x3d\x60\x76\x4e\x1b\x62\x5a\xfc\x06\xf4\xc1\x71\xa7\xb5\x87\xe3\x3a\xe7\xac\x34\x1c\xb7\xe9\x1f\x3a\x1c\xc7\xcb\xd7\x1e\x4e\xce\x8f\x68\xa5\xf1\xe4\xda\xfe\xa1\x03\xb2\xfb\x76\x47\x64\x7b\x2f\xad\x34\x1c\xbb\xa1\x18\x04\x05\x78\x7a\x46\xff\xd3\xff\x63\x87\xa7\x71\x71\xc7\xe6\x78\x60\xad\x34\x38\xa7\xe5\x1f\x3a\x14\xdb\x53\xdc\x1e\x8b\xe5\x2b\xb6\xd2\x48\xac\x76\x7f\xe8\x38\x8c\xf7\x7a\x8e\xdb\x6e\x35\x0a\xab\xdd\x1f\xcd\x58\x25\xa3\x30\x1b\xef\x4a\x83\xa8\x9b\x76\x25\x0b\xc6\x59\xad\x58\xcf\x74\xaa\x81\xfa\xa5\x49\x9e\x1f\x75\x17\x26\x1a\x59\xe3\x81\x09\x5e\xae\x07\x2a\xd6\xfc\xdb\x97\xf2\x11\x17\x9b\xc2\x3e\xc6\xad\x99\x04\x54\xa2\x8e\x6e\xfb\xd0\xe5\xcd\x87\xba\xd6\xa1\x2e\x16\x4d\x9a\xaa\x9a\x1d\x0c\x91\x94\x1c\x8a\xa7\x3e\x0a\xd2\xd6\x29\xfa\xb9\xd2\x9f\xe8\xe7\xda\x6e\xd3\x9a\x80\x78\x08\xfe\x34\x49\x78\x94\x41\x3a\x3d\x9f\xb0\x6c\x64\xda\x74\x4d\x9b\xae\x72\x89\xc4\x24\x4f\xd1\x60\x51\x3b\xd8\x87\xbb\x77\xdd\xf7\x15\x13\x83\x8f\x7a\xb0\xcb\xaf\x10\x4b\xac\xf7\x16\x13\xb8\x59\xf1\xe8\x26\xf9\x02\xf9\xe6\xd3\x04\x9c\x13\x4d\x04\x45\xc8\x9c\x61\xde\x35\x3b\xb9\x70\x24\x3e\x3b\xfb\x70\xf7\xf5\x5d\xd8\x81\x7a\x81\x18\x38\x46\xca\x6b\x78\xd7\xb3\xaa\xcc\x3b\xee\xd8\x77\x28\x61\x3c\xbe\x9b\xd5\x6a\x64\xbf\xa8\xf1\x51\xea\x66\x09\xd9\x8a\xee\x27\x35\xb6\x02\x61\x67\x1d\xcf\xee\x46\x75\xbe\xe7\xd4\xc7\x01\xfc\xc7\x5d\xfb\x9d\xf7\x16\x00\x1d\x9d\x6f\x1e\xf9\x2b\x7b\xe4\x55\xc3\xcd\x8f\xf1\x9f\x53\x36\x48\x58\x16\xf8\xcf\xa7\x49\x9e\xc0\xea\x3d\x4b\x79\x77\xff\x0b\xc1\xee\xcc\xba\x56\x27\x3b\xf3\x6e\xa1\xcb\xa5\x51\x39\xe7\xbf\x07\x3c\x59\x80\x87\x7a\x57\x53\x8e\xcf\xf3\x1b\xf1\xd9\x99\xf5\x9c\x6f\xbd\xdb\xe3\xca\x12\x7f\x21\x8e\x89\x42\x50\x42\xc4\xcf\x08\x03\x2b\x61\x19\x56\xc5\x32\xd1\x40\xfc\x91\x58\xe9\x99\x6c\xd6\x35\xe7\x00\x87\x5d\x4d\xf1\xac\x87\x6f\x46\x7a\xce\xcb\x17\x80\x39\x16\xcf\x7b\xce\xdb\x17\x28\x7f\x27\x53\xf1\x52\x06\x20\xec\x74\x4f\x7b\xf2\x06\xb5\xf0\xc0\xc5\x71\x49\x45\x7b\x04\x29\x35\x11\xbf\xc0\xac\xfe\xcf\x00\xe3\x5b\x5a\x3e\xae\x98\x11\xd8\x8a\x81\x29\xe3\x5f\xaa\x06\x12\x40\x1f\x03\x5b\x26\x8d\x1c\xfc\x20\x25\x37\x5c\x3e\x9e\x64\xf3\x67\xf0\x3a\xbe\x44\xa3\xa1\x20\xff\xbc\xdb\x68\x15\x57\xe6\x7e\xc5\xca\x2c\x8a\x0a\x24\x49\x91\x7b\x71\xd6\xe6\xdd\x5c\x3c\x25\x71\x9e\xf5\xc4\x81\x56\xf6\x0c\x7e\x1c\x44\x7e\x30\x10\x52\x12\xc3\xe1\xd7\x67\x1d\x6f\xde\x69\x3c\x83\x17\x31\x44\x71\x36\xd2\x56\x1a\x6d\xdf\xbb\x53\x27\xc2\x3e\x55\x62\xbd\xd1\x80\x4f\x2e\x7c\x96\x70\x05\xc8\xd3\x3d\xb1\x68\x00\xf5\x59\xcf\x13\xdc\xeb\xc7\xa1\x10\x0e\x4c\x5a\x5d\xdb\x6d\x38\xfc\xe7\x34\xb8\x64\x21\x8f\xb2\x70\x7e\x03\x82\x08\xe2\x59\x6e\x3c\xd6\x14\xfe\xce\x93\xf8\x19\xbc\x0a\xa2\x22\x89\xad\x41\xe8\xc4\x33\xc4\x12\x82\x11\x9b\xc8\x77\xc8\x2a\x0d\x6b\x78\x68\x88\x4d\x4a\x27\xa2\x20\xb9\x56\x99\x88\x9c\xa1\x8c\xe1\x46\x7f\x67\xab\x60\x0e\xc3\x55\xd5\xeb\xe8\x75\xe2\x38\xe7\xcd\xf1\x03\xad\x14\xe7\x43\xd8\x93\xdc\xdf\x53\xc3\xdb\x91\xc3\x9b\xf7\xba\x6e\xc5\x8e\xac\xd8\xc1\x8a\x1d\xac\x88\xef\x99\x7a\x79\x88\x4a\x23\xc0\xb4\x7b\xd8\x83\x73\xcf\x1d\x76\x72\x35\x3a\x85\x1a\xb0\x8f\xaf\x90\x54\x9e\x9c\x7a\x7d\x12\xa8\x0c\xc7\xcc\x8f\xd3\x3a\x41\x85\x1d\xb9\x7a\x9b\x84\x1e\x5e\x0f\x0b\xc5\x23\xc4\x11\x84\x9d\x6e\xd9\x35\x7b\x86\xdd\x87\xd0\x16\x15\x9c\x0f\x3d\xfd\xa1\xe7\x38\x33\xbe\xa4\xa7\x3f\xa4\x68\x64\x64\x26\x56\x99\x26\x2a\x56\x86\x47\x2f\x07\xb3\xd8\xf6\x69\xd4\xcc\x94\xa1\x37\x86\xcb\x3e\x96\x49\x3b\xcf\x39\xf8\xda\x27\xeb\x68\xa6\xd3\xac\x33\x37\x1f\xc8\xbc\x4c\x00\xb4\x61\xca\x82\x74\x80\x02\x47\x37\xa5\xbf\x3a\x5e\x47\x6e\x16\x9a\xbf\x3b\xf0\x54\x8a\xc2\x79\xaf\xd3\x28\xdf\x41\x08\x1f\xc5\x31\x55\xac\xac\xeb\xcc\x7b\xdd\x46\x6e\xcf\x67\x89\x9f\xdb\xf0\x3d\x48\x8c\x9f\xb8\xaf\x9e\x3d\x02\x50\xc6\x21\x0f\xe6\xb8\x93\x14\x37\x12\x7c\xc0\xa7\x79\x45\xf0\x86\xf3\x7a\x02\x5f\xf2\xe9\xcf\x69\x10\xb9\x9f\x71\x1b\xc2\xd7\x65\xb3\xdc\x26\x84\xef\xd2\xe6\xb9\x67\x18\x5d\xf8\x3f\x04\x6e\xb9\xe7\x1e\x3e\x7a\x0b\x32\xb1\xb1\xb0\x2e\xf4\x41\xbe\xe1\xf8\x5a\xf6\x0e\xe4\xc7\x5b\xed\x1d\xf8\xfa\x8c\xa6\x56\xa9\x72\x25\x3b\x04\xc2\x2f\x5d\x0b\x18\x9c\x35\xe1\x97\x41\x3c\x4d\xe5\x5b\x0e\x4b\xe0\x5a\x78\x69\x81\x6b\x56\x88\xc2\x52\x48\x32\x6b\x9d\x08\x29\x9b\xab\x24\x1f\xee\x95\x2e\xa6\xfc\x52\x5a\x38\x22\x45\x46\x96\xf8\x8a\x8a\x3f\xf3\xff\xfa\xcf\xff\x9d\x70\x18\xc4\x11\x37\x24\xbc\xa3\xad\xac\x66\x0e\xf4\xf5\x18\xfa\x9e\xc1\x05\xf9\xa3\x51\x06\xce\x2b\x36\x7f\x06\xdf\x85\xc1\x04\xcb\x06\x41\x22\x5f\x04\x6b\x80\xe8\x9c\xd6\x69\x10\x3b\x0d\x18\xfc\x1d\x4f\x44\x3b\xe2\xbf\xc5\x59\x66\xe0\xc7\xe3\x49\xc8\x33\x2e\xdf\xa9\x3c\xa3\xa8\x87\xd9\x55\x2c\x50\x4f\x31\x97\x90\xaa\x81\xd7\x4b\x58\xcb\xe9\xed\xa9\x75\xfe\x2a\xa5\x56\x85\xb8\xe8\xe2\x2f\xff\xca\x2c\x79\x7c\xe3\x69\x6b\x94\xf8\x32\x74\x8e\x05\x4b\x03\xb1\x65\x4b\xa7\x42\x9e\x74\x0a\x5b\xa3\x3d\x5f\x51\x1c\x35\xe5\x9c\xbd\x28\xdd\x26\xf5\xc0\x17\xf1\x48\x05\xc2\x52\x44\x8a\xe6\xfb\x30\x09\x2c\xa9\x58\x35\x08\x6c\x6c\xcb\xa4\x6e\x51\x94\xd2\xb0\xec\x9a\x28\x9e\xb4\x67\x93\x16\x96\x82\x5d\x0a\xd2\xf2\xca\x83\xd1\x17\x39\x1e\x8a\x2a\x23\x1a\xf1\x15\xfe\xb8\xa4\x1f\x23\xeb\x4b\x93\xbe\xd0\x51\x0e\x71\x54\xd9\x94\x4a\x8e\x92\x2a\x9e\x37\xf6\x22\x33\x99\xad\x13\x55\x43\x48\xb9\x32\x2b\xc7\xc2\xa4\xa2\x7f\x74\x18\x8d\x2f\x17\xec\xa2\x7b\x7a\x3a\xe0\xa9\xcf\xa3\x41\x10\x5d\x54\x42\x7f\x74\xdb\xa4\x36\xbd\xd3\x53\x94\xe0\x41\x36\x5f\x00\xfc\x96\xb8\xef\x2e\x1b\xa8\xe3\xcb\xbe\x1b\xa6\x7c\x5c\x8b\x83\x64\x5a\x54\x58\x10\x37\x30\x8d\x93\xec\x27\xcc\x0f\xb7\x10\x5c\x6e\xce\x6e\x00\xb8\xe8\xa5\xf0\x12\x2f\x3b\x97\x7f\x9b\x6c\x59\x7f\x37\x00\x77\x89\x69\xcf\xbd\x87\x6c\x94\x3c\x66\xde\xc8\x00\xdd\x07\xcf\x93\x80\x3b\x51\xd9\xf1\xe9\xb8\xd1\xe1\x22\x15\x06\x9d\x6c\xb1\xe6\xc3\x6f\xe6\xcf\x8f\xe6\x4f\x99\xee\xdd\x14\x04\xd1\x80\x0b\x25\x54\x68\x6c\x07\x49\xc2\xe6\xf5\xc8\x7e\xde\x2c\x76\xe4\xca\x8f\xf8\xbe\xfa\xc6\x6b\xcf\x9c\xbe\x89\x7b\xc5\x38\x58\x94\x41\xab\x8a\xe2\x9e\x6c\xcc\x66\xf5\xe6\x6d\x5a\xdf\xfc\x7e\x9a\x75\xec\x67\x4e\xf6\x03\xc2\x89\x8d\xba\xd6\xe1\x06\x4c\x9c\xd0\x22\xef\xa6\x07\x83\x16\xd0\x89\x20\xc2\x04\xb6\x95\xde\x64\x42\x67\x98\x3a\x97\x52\x6f\xc2\xec\x4a\x56\x66\xa5\x68\x0f\x76\x76\xac\x70\xbc\xf8\x7a\x88\xb2\xd3\xfb\xe9\x31\x4e\xe5\x71\x20\xb6\x19\xfc\x0f\xe5\xeb\x43\xe6\x39\x0e\x4e\x3c\x08\x3c\xe4\x94\x46\x23\x9f\xe1\x5e\x26\xaa\xbf\xac\x7c\xc6\x29\x63\xec\x84\x73\x5a\xe1\xa8\x28\x0a\xce\x38\x9f\x6b\x0d\x39\x9c\x37\x7d\x0a\x45\x33\x90\x39\x27\x21\x4e\x44\x05\x64\x4e\xad\xbd\x59\x22\xe7\x8e\x52\xe0\x11\xef\x96\xf8\x62\xc4\x5d\xe0\x01\xa6\x06\x92\xdb\xaf\x69\x56\xa7\xa1\x9e\x78\x34\xe6\xdf\x4e\x1a\x7b\x3a\xf8\xa6\x56\x95\x10\xcb\x55\xe1\x1b\x42\xe1\x1f\x1a\xb2\xa2\x82\x8a\xb4\xa3\x46\x7f\x07\x3e\x8c\xf8\x1c\xed\x40\x69\x16\x27\x7c\x00\x01\xbd\x1f\x8f\x93\xe0\x22\x88\x58\x88\x70\x6a\x82\x0e\x03\x2e\x0f\x4a\x66\x42\x3d\xf8\x88\x69\x4f\xc6\xf0\x0c\x39\xa1\x09\x11\x6c\xc3\x04\xf9\x49\x94\xf6\xdd\x39\xf7\x68\xb5\xb1\xae\x99\xb7\xdf\xc4\x3c\xcb\x29\xf7\x40\x73\xc1\x6f\x82\x34\xf4\x74\x56\x28\x3b\x97\x32\x3f\xeb\x25\x6c\xc3\x47\x01\x55\xe8\x3e\x13\xa6\xc9\xe7\x46\xb3\x66\x19\xeb\xab\xe1\xe7\x64\x44\xdf\x96\x3a\x2a\x1f\x93\x25\x58\xb4\x18\xe8\x3b\x8f\x71\xd5\x9a\xeb\xbb\xab\x89\xa9\xd2\x89\xe2\x39\x47\x3f\x36\x97\x42\xa9\x76\xf3\x98\x04\xbc\xa5\xf6\xbe\x95\xee\xa6\x54\xa3\x35\x6f\xd7\x6e\x16\xdd\x78\xbb\x36\x09\x78\x03\x64\xaa\x2a\x73\xcb\x25\x90\x77\xb6\xdb\xd5\xae\x6c\x9d\x8d\xda\x73\xf6\x59\xd5\xa1\xa9\x53\xec\xf5\x36\xfd\x99\x9e\x74\xcf\x85\xfe\x72\x3d\x7d\x15\x57\xd2\xab\x4d\x53\xd9\x95\xb4\x18\xcb\x9f\x7f\x25\xbd\xda\x38\x8a\x57\xd2\x62\x14\x7f\xfe\x95\xf4\x6a\xa3\x28\x5e\x49\xab\xf8\xf4\x01\xaf\xb8\x1d\x7e\xf0\xe5\xcf\x4d\xab\x1d\xf0\x34\x12\xcc\x83\x73\xe7\xb2\xf5\x1c\xbe\x01\xa6\xb6\xfb\x73\x78\x8a\x3f\xe4\xdf\xfb\xf8\xa3\x03\x7d\xc0\x3c\xba\xa5\x43\x7d\xf8\xd5\x0e\x35\x17\xac\xaf\x02\xff\x47\x5f\xd7\x11\x77\x9a\x5c\xf2\xd3\x84\x0d\x02\x16\x56\x1e\xe9\x76\xbb\xb7\x0f\x18\xc9\x12\xce\x16\x00\xbe\x7d\xb4\xc8\x30\x88\xf8\xbb\x9b\xf0\x56\x67\xd1\x2f\x7a\x14\x5d\x2a\x5c\x90\x26\x45\xe9\xf2\x6f\xb4\x70\x22\x6e\x10\x21\xce\x5c\x29\x38\x58\x4a\x84\x78\x85\x17\x6d\xce\xa9\xcc\x17\x2a\x10\x01\x37\x81\xf6\xb0\x4c\xd0\xef\x1f\x26\xa8\x63\xd7\x14\x5a\x71\x09\x75\xe1\x2f\x1d\x13\xbc\xcf\x14\xd2\x0d\x0b\x6b\x31\x15\xc5\xaa\x35\xf3\x60\xc0\xd1\x6a\xc9\x5a\xb3\x3d\xfc\xe8\x46\xc9\x6a\xcd\x3a\x76\x95\x0e\xd5\xb1\xe3\x64\xb5\x66\x5d\xbb\x46\x97\x6a\x24\x3a\xfc\x57\x6b\x6e\x7d\x9e\xd3\xd7\x5c\x14\xb1\xd6\xdc\xee\x64\x2e\x3b\xc9\x85\x11\x6b\xcd\xed\x7e\xe6\xb2\x1f\x31\xae\xf7\xa5\x5b\xb8\xa5\x28\x2f\xe3\x12\x6a\xf3\xa7\x9a\x2b\x53\xa6\x02\x32\xd6\x1b\x42\xbf\xb6\xf0\xa0\x69\x31\xb8\x1c\x96\x6c\xc1\x5f\x02\x93\x6e\x39\x26\x16\x55\x5e\x96\xfb\xad\x7e\x01\x64\xe6\xe5\x64\xf9\xc5\x22\xcb\x51\xb9\xd7\xe9\x97\x40\xa6\x9c\x32\x9a\xf7\x71\x6d\xad\xa8\x5a\xf8\x37\xbf\x6c\x2e\x59\xef\xe7\x25\xf6\x9a\x06\x7a\x93\xd5\x1b\x2d\xaa\x5d\x74\x28\xab\xd8\x85\x1e\x7f\xb9\x5d\x28\x27\x68\xa5\xe8\x0c\x83\xe8\xe3\x0f\x3a\xdc\x33\xf5\xbe\xa0\xea\x4f\x32\xee\xf3\x8d\x15\xf5\x54\x7d\x75\xa1\x92\x31\xa4\x7b\xf5\xde\xd4\xbb\x65\x2a\xfa\xde\x17\xb4\x4b\xef\x9e\x9e\xe2\x15\x5f\x75\x56\x79\xbc\xa1\xbe\x5d\x9e\x75\x84\x7c\xe3\x8e\xfd\x44\x59\x8f\x8d\xc3\x9e\x98\xe6\xf7\x98\xd3\xbb\x18\x75\x19\x8b\x5d\xff\x3e\x51\xfd\x03\xe6\xa9\x2e\x54\x97\xf9\xbf\x0b\xd5\xeb\xb8\x78\xcc\x8e\xae\x33\x97\x9b\xae\x75\x64\x63\x04\x21\x3f\x51\x37\x7a\x0f\x5d\x68\x3f\x36\xb4\x55\x92\x66\x66\x1b\x8d\xe7\x4b\x37\x26\x31\x30\xb7\x1b\x2f\x0a\x15\x89\xe3\x2b\x89\x15\x29\xe4\xd2\xe5\x4d\x16\x6f\xc9\xc3\x0a\xe3\x34\x0c\x7c\x8e\xb9\x5f\x31\x0d\xbb\x65\xdd\x84\x54\x27\x5e\xcf\x1b\xff\x2e\x1b\x1e\xc6\x83\x26\xca\x15\xbf\xee\x99\x3b\xd9\x2f\x1a\x0f\x11\x09\x85\x5a\x96\x84\xee\xc1\xce\xcc\x41\x47\x0c\xe8\xf2\xb8\x83\x39\xe4\x25\x72\x0d\x0f\x76\xe6\x65\x23\xaa\x6e\x9a\x2d\x6e\x6a\x8d\x77\x8d\xd7\x3e\x62\x56\x5b\x9a\x4d\x57\x34\x6b\xc8\x56\xa7\xe8\xe0\xf2\x91\xcc\x18\xb4\x8e\xd4\xee\x81\xe0\x35\xab\xaf\x04\x5e\xb7\xb2\xc0\xab\x75\xe7\x80\x9f\xad\x0a\x79\xb6\xfe\x41\xbc\xb7\xdc\x41\x5c\xe1\x3d\xcb\xa1\x3c\x5f\x15\xe5\xf9\x1f\x8e\xf2\x3c\x87\xf2\x17\xf3\x64\x57\x1d\x56\xb9\xb2\x8b\xef\xae\xa4\xc5\xc5\x67\x74\x00\xb3\x0c\xdd\xc0\xe9\x0d\x93\x54\xc7\x7e\x22\xee\x29\xf7\x01\xf5\xc5\xf1\xc5\xad\x53\x5c\x6b\xf4\x0d\x99\x75\x65\xd4\x3c\x84\xd9\x91\x5e\xaf\x04\xbb\x04\x23\xa5\x6a\x6c\x1a\x1f\x8f\xce\x4f\x75\x8c\x88\x3e\x57\x38\x21\xcc\xce\x22\x7c\x68\x8b\x5c\x8c\xcd\xf2\x21\xf1\xf2\x1b\x6f\x29\x07\xc9\xd1\xe8\xab\xbc\xa5\xc2\xbd\xac\x00\x39\x4f\x06\xd3\x53\x6f\x73\x3d\x75\xdd\x31\xec\x6e\x16\x72\xd7\x99\x6b\xc9\x05\x93\xce\x71\xe7\xc4\x83\x49\x47\xc5\xe5\x29\xe7\x85\x49\x97\xaa\x75\x8f\xbb\xe2\x7f\x7a\xf4\xab\x47\xbf\x76\xe9\xd7\x2e\x81\xc8\x6b\x26\xd6\x72\x71\x74\x19\xa3\xb5\x98\x1a\x25\xcd\x35\x6f\x57\x34\x56\xdf\x4b\x9a\x4a\x36\x34\xfc\x16\x4a\xa5\xa7\x6e\x71\x29\x0e\x3a\xd4\xe7\xff\xd0\x3a\xff\x87\x74\xfe\x0f\xcd\xc9\x3d\xb4\x4e\xee\xff\x1f\x7b\x6f\xbf\xde\x44\xae\x24\x0e\xff\xcf\x55\x08\xce\xf9\xc5\x6d\x70\x1c\xdb\x01\x86\x49\xc6\x93\x65\x02\x33\xc3\xee\xf0\xf1\x10\xe6\xcc\xee\x06\x1f\xa7\x63\x2b\x71\x13\xbb\xdb\xdb\xdd\x06\x3c\x24\xef\xfd\xbc\xd7\xf1\xde\xd8\xfb\xa8\x4a\x1f\x25\xb5\xba\xdd\x8e\x03\x87\xf9\x2d\xb3\xcf\x1e\xe2\x96\x54\x2a\x95\x4a\xa5\x52\xa9\x54\x35\xc5\x93\xbb\x42\x08\xba\x77\xcf\x28\xdf\x7f\xe9\x33\x4a\x86\x39\x74\xbf\xc6\xc3\x04\xa2\x36\x44\x37\xb0\x8a\x43\xc5\x35\xd5\xf3\x9e\xe9\x21\x4d\xb2\xac\xa2\x83\xde\xb5\x4f\x16\xb2\x83\x71\x14\xce\x92\x78\x5c\xd1\xc5\xee\xb5\x8f\x18\xb2\x8b\x2c\x0f\xd3\x0a\xf8\xf7\xaf\x07\xff\x81\x81\xff\x3f\x8b\x30\xad\x9a\x85\x6b\xfa\xed\x3c\xd4\x3d\xe4\x69\x04\x6b\xaa\xa2\x8f\x6b\x1e\xf1\xbe\xd3\x7d\x7c\x58\x56\x81\xbf\x26\xab\x3e\xaa\x7b\x3a\x35\xff\xc1\x81\x4b\xae\xbc\x3e\x3b\xbe\x55\x95\x3d\xb3\xb8\x12\x4a\xfc\x70\xd6\x60\xf5\xb5\x21\x78\x78\x79\x6d\x18\x45\x66\x5a\x1b\x84\xcb\xef\x6b\x03\xf0\xb1\xdb\xda\x40\x1c\x7e\xf2\xb4\xbf\x35\xd8\xc4\x53\xd0\x63\x6f\x97\xcf\xf0\x56\x6e\xee\x8f\x36\x70\x77\xaa\xc5\x68\x5a\xd9\xc8\x30\x83\xf7\x0d\x60\xf4\xf0\x7e\xb3\xce\xa1\x1e\x71\xf3\x1c\xeb\xbf\xe4\x61\x5a\xcc\x43\x89\xa7\x4f\x7b\x9c\x86\x1f\xc8\x39\x5b\x10\xa8\xcc\x29\xe8\x46\xce\xc3\x48\x10\x99\x28\x7a\xcd\x03\x2b\xb6\xd9\xf0\x98\x56\x83\xd9\x9a\x2d\x89\x66\x53\xbe\x9e\x37\x67\x26\x89\xbe\xe4\xa3\xf5\x8e\xf3\xd8\xe6\xb3\xa3\x7f\xcf\xc6\x5f\x74\x5b\xc0\xff\x9a\x87\xcd\xea\xb3\x26\xed\xb5\xec\xb0\x89\x35\xfc\xb6\xee\x5e\xe7\xab\xba\x71\x8d\x93\x64\x5e\xba\x35\x76\x77\xaf\xa9\x3a\x74\x87\xc3\xd3\x30\x8b\xca\x35\xb7\xee\xae\xdc\x75\xb5\x0c\xf9\x49\xd4\x3f\x9c\x26\x19\x1f\x07\x5a\x56\x98\x57\xda\x66\x52\x34\xd1\xaf\x6e\xdd\x22\x8d\x0a\x6f\xa2\xc3\x94\x87\x70\x75\x56\x95\x47\x52\x53\xa0\x64\xa7\x11\x40\x9e\xc6\x95\x39\x48\x57\x81\xd0\x57\x78\x1e\x47\x76\xbf\x57\xbd\xfc\xb3\x67\xfe\xdc\x35\x7f\xde\x67\x7d\xd2\xd4\xf5\xb6\x97\x7f\x9a\xa6\x4b\xd3\x74\x79\x9f\xf5\xd1\x93\xc1\xb4\x87\xe3\x26\xf8\x32\xd2\xb7\xd3\x30\xe2\x02\xb2\xd9\x87\x28\x1f\x4d\x94\x9f\xbf\x8c\xcc\xa6\xb3\x88\x84\x19\x67\xdd\xbd\xc2\x9b\x33\x37\x32\xa7\x1c\x9a\x7e\xda\xdd\xa3\x91\xd3\xac\x16\x56\x48\x22\x55\xe5\x34\xe5\xe1\x85\xed\x12\x29\xfb\xee\xad\xec\x5b\x77\xce\xee\x41\x2c\x01\x45\xdb\x26\xdb\x61\xbb\x2d\xfd\x7e\xc1\x2e\x5e\x62\x71\x29\x96\x32\x4a\x5b\xa0\x27\xca\x82\xdd\x73\x60\xdb\xc5\xcb\x5e\x35\xec\x35\x29\xb0\x5b\xa0\x00\xcc\x51\x0d\x9a\x5b\xf5\x76\x5b\x66\xe8\x55\xf5\xee\xeb\x7a\xf7\xab\xd1\xd3\xaf\x4e\xa0\x79\xc9\xab\x7c\xfb\x51\xde\x7e\x4d\x86\xeb\xec\x39\x7c\xdc\xdd\xa7\xab\xe7\x63\x8b\x2e\x88\xe5\xbe\x8d\x9d\x62\x59\x1b\x42\x6f\x9f\x2e\x3a\x03\x61\xb7\x0c\x42\xcf\x85\xb0\xbb\x4f\xd6\x2a\x81\x70\x1f\x21\x54\xf2\x66\x87\xdd\x63\xf7\x0d\xff\x40\xf2\x41\xc1\x24\x0f\x5b\xe4\x7d\x0d\xad\x02\x8f\x22\x21\x3c\xf5\xc3\xa6\x83\x9d\x94\x43\xf5\x62\x94\x48\x71\xad\x32\x42\xe0\x58\x30\x74\x19\x68\x48\x30\x57\x56\x07\x57\x65\x12\xac\x45\x65\xd9\xc7\xfd\x32\x69\x65\x45\x77\x58\xde\xc0\x2b\x1e\xcd\x57\xd6\xf6\x41\x82\x6a\xf8\xb6\x98\x92\x4d\xba\xfb\x55\x6d\xd2\xf5\xf6\x52\x7b\x2b\x7d\x39\xe7\xf1\x9a\x1b\xa9\x68\x52\xb5\x8d\x96\x6c\x5f\xf0\x2c\x99\x6e\x21\x7a\xd3\xac\x6e\x20\xb7\xa2\xab\x6b\x6d\x92\x15\x7b\xe0\x06\x5b\x9c\x79\xcd\x0a\x38\x5e\x5e\x5a\x3f\x6f\xf7\xfb\xac\xc3\xb6\xb6\x6c\xc0\xfd\x3e\xdb\x6d\x36\x57\x89\x6e\x6b\xe4\x5d\xb6\x4d\x3e\xec\x7f\x59\xf9\x58\x4f\x06\xd6\x93\x73\x3a\xee\x46\x0d\xf9\xb5\x24\xf5\xca\x85\xd8\x3e\xa5\xd4\x81\x7f\xb3\x95\xf7\x03\x6c\xcf\x2f\x4b\xd5\x65\x88\x67\x0c\xbb\xee\x18\xee\x43\xd4\x9e\x79\x9a\x8c\x38\x1f\xaf\x2d\x37\x3b\xff\x8b\xe4\xa6\x25\x4f\x4a\xa4\xe6\x57\x95\x76\x7c\x6d\xa9\xb9\x88\xc7\x53\x72\x1b\x7f\xca\xd5\xfb\x2e\xa4\x37\x80\x93\xef\xae\xea\xb1\x04\x1e\x07\x80\x7a\x82\x25\x08\xf5\x34\x4c\x9e\x87\xac\x0f\x5d\xa1\x18\x06\x1c\x0a\x32\xb8\x86\x74\x64\x7d\x76\x3c\xb0\x78\xa6\xf0\x05\xf0\x32\x1e\x85\x41\xb3\x86\x40\x84\x05\x6e\x78\x94\x44\x34\x30\x1c\x49\x9e\xb7\x09\xc6\x55\x27\xe9\x6d\xd6\x25\xa1\x44\xdf\xd9\xef\x9b\xb4\xe0\xf8\xe8\xa4\x07\xc1\x48\x09\xce\x47\x4c\xa9\x7c\xfc\x6e\x50\x88\x42\x82\x69\x95\xb1\xc4\x0e\x43\x12\xb1\x3e\xdb\xb6\x83\x71\xe8\x00\x1c\x1f\x26\xd1\x94\xb3\xe0\xde\xbd\x88\xfd\xd0\x87\x37\x47\x46\xcf\x65\x7d\x16\xb1\x1d\xf6\xce\x55\xca\x91\x7a\xa8\x01\x53\xa0\x66\x1e\xef\x32\x78\xe8\x75\x8f\x05\x46\xbe\x23\x13\xdd\x95\x57\xc1\x39\x24\xda\xb5\x43\x87\xd0\xf6\xcb\xf2\xf6\x3a\xcf\xf8\x78\xd9\xd4\xcd\xfd\x39\xfe\x0c\x47\x18\x4e\x50\xd6\xa9\x22\x2f\x3c\x8d\xc7\x84\x13\xaa\xb6\x20\x09\xb7\x3d\x5f\x64\x93\xe0\xde\x47\x6b\x63\x5b\xca\xaf\x32\xe0\x93\x12\x48\x37\xe4\xe5\x1c\x90\x2b\xe9\x2c\x4f\x66\x81\x5a\x9b\xd4\x08\x79\x6a\xad\x5f\xc7\xce\x83\x0b\xad\x2f\xb6\xde\x83\x1b\x58\xc1\x6c\x0f\x05\xa3\x4f\x64\x68\x23\x20\x22\xd4\x96\x6b\x5c\x93\xd4\xc8\x15\x8d\x9d\x1c\xd5\x3d\xd3\x9e\x5a\x93\x10\x8e\x10\xb9\x41\xa7\xfd\xe8\x41\xd3\x27\x79\x3f\x57\x3c\xbe\x6b\xba\xf1\x87\xe9\x38\x8a\xc3\x29\xea\xda\x15\xd7\x3a\x8f\xae\x6d\x5e\xfa\x3c\x76\xab\x9e\xc0\x3d\x9f\x2d\xa6\xd3\xd7\xc9\xac\xc2\xed\xb0\x27\xaf\x8c\x34\xf3\x1d\xea\x56\xf6\xf9\xa2\xc5\xc2\xe9\x7c\x12\xae\x50\xc0\x55\x11\xd4\x65\x7d\x6c\x03\x1b\x82\x0b\xf7\x7a\x56\xae\xee\xe6\x56\xae\x55\x20\x6e\xde\xca\xa5\xfe\x7c\xb0\x99\xc1\x4b\xfe\xf9\xa0\x78\x30\x98\x76\xba\xc3\x50\xd7\x98\x76\x7b\xf4\x57\x6f\x57\xfc\x72\x6a\xf7\xec\xea\x3d\xbb\x7e\xcf\x6e\xf0\x2f\x32\xad\x55\x98\x6f\x3e\x83\x69\x4d\x25\x29\xf8\x6c\x7d\xaf\x30\x6a\x6d\x66\xac\x2a\xd6\x7b\xa0\xeb\x3d\xf8\x0c\x46\x2d\xe7\x8c\xe9\xcc\x33\x86\x5b\xdb\xa5\x4b\x63\x9b\x7d\xb4\x63\xae\xed\x52\x96\xdf\x66\x4b\x3b\x1a\xa6\xe4\x5a\x12\x08\xcd\xe6\x4e\x2c\x98\x27\x1f\x02\xd1\xcf\x5d\xe8\xed\x1e\x40\xbd\x2b\xfe\xb7\x45\xc5\x50\xd3\x0e\x8e\xb3\x91\x2d\xae\xa6\x25\xad\xdc\x16\xe7\x67\x75\x8f\x79\xcd\x7b\xea\xab\xb0\xd0\x3d\xb0\x40\x3c\xf0\x60\x56\xff\x34\xe8\x6c\x1e\xfa\xa2\xb2\xce\x91\xb0\x5a\x2c\xb5\xca\x65\x94\x2b\xd0\x0a\x22\xaa\x55\x25\xb0\xf6\x6b\x9d\x45\x15\x3b\xb6\x2c\xdb\x6a\xbd\x03\xaa\x62\x56\xc7\x12\xfb\x25\x94\x44\xbd\xf3\x52\x2d\xd1\xcc\x50\x89\xa6\x88\x7b\x30\x2a\x89\x2b\x77\xf5\xbd\xd5\xba\xa4\xab\x0b\x29\xb6\x38\xb4\xbe\x53\xed\x12\x73\xc8\x4b\xae\x30\xf8\xb6\x95\x76\x60\x1e\xb3\x1a\xd5\xa2\xa0\x4a\x62\x59\x41\x97\x34\xe0\xa4\x3e\xe9\x57\x27\xbf\xb2\xc0\x47\x92\x54\x2f\xe7\x3c\xae\x50\x26\xbf\xbf\xb6\x32\xb9\x8e\xce\xe7\x51\xf9\xa8\x69\xe4\xe6\x14\xbe\xbf\x92\x35\x96\x08\x86\x7a\xba\xda\xd7\xab\x8a\xfd\x75\x4c\xc0\xff\xeb\xb4\x89\x9b\xb4\x5c\x93\xc9\x28\xb1\x32\xbb\xbb\xde\xb2\x57\x6a\x71\xf6\x54\xfd\x02\xd6\xe7\xee\x37\x7d\xe3\xff\x5a\x7d\xc3\xbb\xa5\xac\xa1\x6d\xe0\x56\xe9\xea\x1a\xe2\xeb\x57\xa6\x69\x7c\x81\x50\x21\x37\xeb\x0d\x45\x34\x00\x0c\x70\xb0\xae\xcf\x12\x6d\xf5\x17\x76\x5a\xba\xde\x9e\x2a\x45\x7d\xe5\x4e\x79\xad\xbb\xd0\x15\x5d\xa8\x9b\x43\x10\x85\xd0\x00\xe2\x92\x39\x5b\x4c\xcb\x2f\xde\x75\xab\xcf\x7d\xd1\xe6\x65\xa8\x92\xbb\xb6\x2f\x10\x78\x46\x8e\x2a\x88\x66\xb3\x45\x1e\x9e\x4e\x79\x73\xc5\x08\x67\x49\x9c\xe4\x49\xcc\xff\xf3\xba\x60\x4e\x2d\x30\xff\xb5\x6f\xd6\x5a\x16\x9d\xc7\xc1\x47\x8b\x62\x1f\xad\x48\x7d\xb0\xb6\x76\x76\xd8\x61\x38\x1d\x2d\xa6\xa1\x8c\x09\x97\x4d\x93\x39\xcf\x58\x82\xe1\xd6\x65\xa0\xf5\x8c\x05\xbf\xf2\x74\x16\xe5\x7c\x1b\x96\x1e\x24\xcf\x9f\x27\xd3\x50\xf4\xd4\x64\xa7\xa1\xd8\x1e\x92\x58\x40\x13\xad\xce\x92\xe9\x34\xf9\x10\xc5\xe7\x6c\x1e\xce\x79\xba\xc7\x8e\x72\x7e\x76\xc6\xe3\x16\x7b\xde\x66\xdd\xef\xbf\xef\xb4\xd9\x63\x76\x14\xcd\xe6\x53\xce\x9e\xf3\x7c\x92\x8c\x21\xa4\xdc\x73\x1c\x45\x34\x12\x70\x9e\xd1\x2e\x58\x14\xb3\x97\x31\x67\x4f\xa2\x19\x8f\xb3\x28\x89\xdb\xec\x71\x96\xa7\x49\x9c\xcc\x96\x90\xad\x00\x7e\xcd\x27\xcb\x2c\x1a\x65\x2d\xf6\x8f\x64\xda\x66\xbd\xdd\xef\x5b\xec\xc5\xcb\xb6\x00\xf6\xe2\xe5\x3f\x82\x67\xcf\x9a\x2d\xf6\xaa\xcd\xee\xdf\xdf\x6d\x21\x12\x84\x56\x62\xd0\xbb\x41\x3e\x09\x73\x95\x5f\xc3\xb8\xab\x4f\x70\xeb\x0c\x73\x19\x0b\x5b\xfe\xa9\xef\xce\x26\x3a\x2f\x86\xaa\xa4\xdd\xca\xe5\x05\xbe\xf8\xba\x34\x4d\x97\x1d\x08\x92\x3f\xe9\x08\x5d\x79\xd2\x85\x49\xd9\xda\x62\xdb\xe6\xf1\x5b\xd6\x85\x17\x77\x06\x26\xbe\xbb\x0b\x26\x5d\x68\xd2\xf1\x34\x99\x8b\x16\x59\x87\xdd\x15\x10\xef\x09\x08\x77\xd9\x44\x77\x74\x8f\x4d\xf0\x01\x9c\xe4\x84\x00\xb8\x23\x83\x30\x7a\xf8\x67\xb7\xd9\x54\x21\x90\xad\xd8\x90\x59\xa7\xd9\x32\xd1\xbe\xb3\x6e\xb3\xc5\x3a\xed\x07\xaa\xaa\xf8\x36\x6f\x42\xde\x85\x4e\x91\x9f\x42\x96\xc4\x7c\x3b\x8b\xc6\x7c\x8c\x24\x76\x49\xde\x93\x24\xcf\x09\xb5\xfd\xc4\x26\xb8\x83\xcb\xb1\x50\x99\xcb\x28\x3b\x11\xbf\x31\x07\xe1\x1e\xcb\x15\x5a\x8f\x47\xa3\x44\x6c\xea\xe7\x2c\x4f\xd8\x24\xcf\xe7\xd9\xde\xce\x0e\x8f\xdb\x1f\xa2\x8b\x68\xce\xc7\x51\xd8\x4e\xd2\xf3\x1d\xf1\x6b\xe7\x70\x71\x1a\x8d\x86\x92\xe3\x87\xd9\x5c\xc8\xc2\xbf\xbd\xe6\xf3\x94\x67\x3c\xce\x81\x23\x33\x01\xf2\xce\x32\x59\xb0\x51\x18\x8b\x05\x9b\xf2\x2c\x63\x23\xd1\x90\xc9\x86\xf6\x2a\x81\xb0\x8a\x3c\x9d\x65\x98\xed\x48\xd4\xfb\xe9\xff\xfb\x7f\xff\x8c\x78\x8a\xaf\x46\x01\x20\x44\x6c\x4f\x79\x36\xe7\xa3\x5c\xa0\x89\x8b\x69\x91\xaa\x58\x94\xf3\x4e\x8b\xcd\xc5\x6c\xce\x3a\xe8\x26\x39\x17\x63\x9f\x75\xd5\x8f\x3b\x84\xc0\xca\x4a\x0b\xf4\xed\xb4\x58\x4e\x9e\x9e\x7e\x24\x2c\xdd\xb1\xa2\x05\x29\x3a\x5a\x71\x85\x5c\xbe\x5e\x9a\x8f\x26\x8b\x0b\x5c\x39\x07\x3a\x5a\xfc\x0e\xdb\xc5\x53\xbb\xa8\x55\xfa\xe4\x17\x82\xfe\xb3\x25\xfe\xc1\xee\x02\xa2\x00\x02\x3e\xe3\x1f\xe2\x73\xd9\x03\xe0\xe7\x4a\x7e\xd6\xd7\x26\x74\x93\xbf\x8a\xa9\xa0\xdc\x3e\x40\x4a\x20\x05\xf3\x67\x75\x55\xee\xb9\x47\x39\xfb\xd4\x47\x0e\x15\x65\x47\x39\x73\x6f\xd0\xd2\x58\xb7\x8c\x20\xa0\x9f\x9b\x3e\x0f\xa0\x6b\x1a\x1a\xba\x9f\xdf\xd0\x00\xaf\x9a\xb4\x27\x5d\xa5\xca\xf5\x11\x70\xd2\xb3\xbb\xb5\x25\x6a\xf4\xcd\xac\xea\xac\x06\x10\x5d\xff\x3c\x4e\x52\x4e\x73\x3a\x00\x16\x59\x7b\xe3\x1b\x86\x4a\x6f\x31\x18\x59\x99\xaf\x58\xe1\x6c\xbc\xb1\x65\x81\xf2\x85\xcd\x0d\x82\xa4\x7a\x6f\xd6\x27\xf3\x26\x08\xb3\xb2\x5b\x07\x3f\x97\x95\x81\x2a\x3f\xe5\xdf\x8c\xa7\x99\xb5\x3e\xf3\xae\xd4\x89\x3d\x12\xec\xbf\xaa\x25\x98\x50\x76\x5f\xf3\xb3\x29\x1f\xe5\x87\xf8\x91\xaa\xbb\xb7\x6e\x05\x1a\x8e\x25\xd6\xd0\x24\xd2\x1e\xa5\x3c\xcc\x79\xe0\x11\x7d\xcd\x66\x5b\xcd\x84\x87\xb3\x3d\x0d\xb0\x3a\xc6\x8f\x41\x42\x2e\x5b\xec\xa3\x40\x82\xe6\x0c\x2c\x41\x75\xa5\x70\xb6\xdb\x15\x24\x74\x59\x82\x3e\x3f\xab\x22\x62\x95\x79\xf6\x2a\x04\x43\x75\x62\x3c\xff\xca\xa1\x3d\xae\x99\x6a\xce\x01\x68\xef\x94\x3a\x00\x46\x4f\xb6\x93\xfd\xd8\x44\x9f\xf9\x37\x43\x72\x5c\x2a\x6e\x97\xf6\x76\x3a\xf3\x33\xa3\x07\xc2\x7f\xd9\x10\xdc\xb3\xd6\xe7\x0a\x92\xa9\x31\x7d\x11\xe6\x8b\xd4\x44\xd9\x58\xcd\x59\xb2\xc1\xd7\xbb\xe9\x57\xf8\x23\xde\xa8\xcb\x61\x4c\x5c\x0e\x89\x49\xbc\x90\x8c\xa5\x72\x87\x80\x98\x17\xcb\xe3\xce\xa0\x7c\x9f\x30\x55\x94\x88\x86\x6e\x60\xb3\xeb\x35\x57\xf9\x47\x7c\x84\xe0\x1a\x4b\x15\x97\x03\xa4\xb3\x9d\x6b\x4d\x06\x51\xf9\x28\xe7\x39\x4d\xa6\xaf\x60\x6f\x0c\x6c\x77\x41\xc6\xe6\xcb\x42\x95\x25\x71\x55\x80\x60\xe6\x90\x8e\xa0\x83\x11\xcd\xa3\x2e\x6e\x94\x51\x57\xc7\x2d\xef\xb4\xc4\xff\x76\x29\xd6\x2e\xde\x4e\xc4\x10\x31\xfc\xe3\x08\x22\x83\x2c\xcd\x9f\x62\x54\xfa\xab\xfa\xf3\xe3\x71\x84\x63\x8d\xc8\x60\x69\x86\x7b\xb2\x35\xd5\x54\x81\xe2\x1b\x52\x7c\xaa\x5d\x23\x6f\xde\xff\x71\x87\x1d\x71\xae\x0f\x67\x1f\x3e\x7c\x68\xcf\xc3\x34\x8f\x46\x53\x1e\xc5\x23\x3e\x9d\xb6\x47\xc9\x6c\xa7\xd7\xe9\xf6\x76\x90\xdc\xdb\x78\x36\xcb\x76\x60\x16\xc7\x3c\x8d\xde\xc3\x61\x8b\x1c\x83\x5c\xde\xd0\x67\x20\x1d\x07\x3e\x76\x7c\x70\xd5\xf7\x99\xfa\x23\x2c\xc9\x1d\x71\x5a\xf2\x3d\x75\xbe\x8b\x01\x86\x18\x5b\xac\xd3\x62\xa7\xf8\x57\xaf\xc5\x52\xfc\x4b\xb0\x8a\x7c\xe5\x26\xf8\x43\xd4\xd6\x01\xf6\xbb\x32\x7a\x3e\xf8\x06\x63\xd6\x84\x10\x73\x23\x74\x05\x24\xf8\xeb\xbe\x80\x84\x7f\x19\x8f\x5a\x84\x16\xb1\x7b\x0c\x21\x86\xc7\x00\x43\xf6\x7c\x6a\x7e\x7d\x27\x5a\xeb\x5f\x8f\xa0\x99\xfc\x79\x4f\xfc\xe9\xc7\x47\xe2\x32\x63\x7d\xc4\x67\x47\x20\x03\xad\x24\x5a\xdb\x7d\x36\x93\x78\x89\x3f\xd9\x5d\xf1\x37\x54\x70\xb0\xd1\x9d\xef\x68\xac\xac\x1e\xc5\xa7\x9e\xe8\xf5\x47\xc8\x1f\xb1\xbd\x6d\x48\x10\x20\x78\xf1\x13\xc6\xd9\x44\x34\xa0\x3d\x19\x61\x20\x46\xc1\xee\xe9\x4e\xc1\x32\x60\xf5\xd1\x29\x52\x59\xd2\x96\x92\x91\xf4\x44\xac\x11\xc7\x61\x8b\x9d\x0e\xd0\xc8\xf0\xd9\xcc\x9c\xee\x6e\x57\x62\xe1\xfc\x8c\x41\x41\xaf\x61\x9a\x1c\xc1\xe0\xb2\x9c\xcf\x7f\xe2\x67\x49\xca\x37\x33\x71\x0a\x38\x8f\xcf\x72\x9e\x12\x25\xe0\x28\xe7\x73\x73\x33\xb3\x4a\x09\xd0\xaa\xb8\x10\x66\x30\x61\xa2\xfd\x57\xad\x10\x18\x99\xbb\xe1\x13\xad\x0e\xfb\x41\x8f\x5e\x1f\x91\x73\xf6\x03\xeb\xfa\x4e\xcc\xbd\x92\xcb\x00\xa5\x60\x28\xbc\x9a\xee\x4d\xc2\x4d\x9f\xcb\x1d\xc8\x42\x04\x34\xc9\x2c\x9a\x0d\x2b\x6f\xdd\xb8\xb3\xc0\x5f\xe3\x84\x5d\x7e\x1b\x6e\x54\x15\x43\xc5\x9c\xfd\xd0\xb7\x93\xe6\x54\xbb\xa7\x9a\xcb\x9f\x2a\x55\xcd\xae\x55\x50\xd3\xa4\x82\x4a\xee\xa9\xd9\x5d\xfa\x62\x23\x6f\x8a\x9d\x46\x3f\x6d\xcb\x57\x77\xd8\x75\x39\x70\x45\xe5\xa5\x47\xad\x2a\xf5\x51\xa5\xeb\xcf\xb0\xfa\x97\x7a\x39\x66\x8b\xb4\x4e\xfb\x81\x92\xf5\xc6\x70\xae\x05\x6a\x5d\x20\xce\x21\x4f\x4b\xd2\x9a\xed\xbb\xfe\x23\xde\x67\x8c\xee\x76\x8d\x7b\xe8\xcf\x14\xac\xb9\xfb\x19\x83\x35\xf7\x86\xc3\xe4\xec\x2c\xe3\xf9\x30\x4e\xe2\xf2\x50\x5e\xdf\x5f\xd3\x4b\x6f\x77\x38\x84\x94\x4d\xd5\xd0\xbb\x9d\x8e\x0a\xe6\x45\x18\x24\x1c\x5d\xfc\x03\xb3\x6e\xb5\xd8\x05\x5f\xda\x51\x98\x8f\x2f\xf8\xf2\xa6\x14\x1e\xa3\x8e\x5f\xf0\x65\x56\x33\x0f\xc3\x8a\x40\x37\xc7\x26\xae\x13\x10\x60\x55\x60\x66\x4a\xa5\x8a\xac\x80\x38\x57\xab\x32\x16\x5a\x33\x5a\x01\x4d\x65\x73\x32\xb4\x76\x02\x44\x89\xef\x85\x8c\x79\x17\x7f\xb2\x3e\x50\x6a\x65\x92\x3a\x92\xe5\x6a\x56\x96\x5b\x4f\x1c\x7c\x2e\xfe\x2c\x7c\xce\xfe\x2c\xcd\x95\x97\xfc\x59\x33\xa5\x9b\x3e\x54\x5f\x44\xd0\x09\x24\xf7\xca\xc4\xdf\xd9\x9f\xa8\x59\x9b\x0e\x66\xcd\x16\xbc\x83\xec\x88\x1a\xef\xf6\xd9\x3b\xf6\x03\x9b\x09\x78\xd6\x33\xc3\x2c\xc2\x34\x5f\x59\x24\xea\x1e\x8b\x13\x39\x49\x0c\xf7\x6e\xd0\x62\x17\x51\x8b\xbd\x93\xc9\xe1\x06\xfb\xa4\xe1\xbb\xb6\xf8\x26\xa9\x70\xfc\x6e\xe0\x3e\x9b\xc8\xa2\xf6\x05\x17\x12\xfe\x22\xb2\xec\xc0\x34\xcd\x59\x22\x88\x02\x9c\x12\x64\x7f\x36\xfd\x83\xce\xfe\x3c\x4e\xc4\xe8\x06\x6d\x95\x8e\xd0\x86\x87\xbc\x11\x64\x7f\x0a\x70\x72\x4b\x52\xf1\x8f\xfe\xd4\x5e\x45\x30\xf3\x6d\xb9\x1c\xd6\x0a\xc3\x24\xdb\x6c\x18\x49\x6a\xf5\x02\xab\x23\x88\x4b\x22\x8e\x0f\x9b\xcd\x16\x8e\x50\xa8\x3f\x02\x61\xe3\x06\x85\x03\xff\x57\xe6\x46\x5b\x3d\x74\x0c\xa2\xa5\xf0\x77\xb2\xa3\xe1\x00\x94\xcc\x59\x6b\x00\x5a\x50\x91\xf8\x59\x9b\x08\x2d\x19\xa0\xec\xaf\xc1\x06\x30\x96\x02\x19\x95\xb8\x5d\x8f\x8e\x5a\x48\xd7\x22\x64\x0d\x81\x2d\x23\x98\x69\x5c\xa1\x7a\xc1\x77\x0f\xca\xfd\xa7\xf2\xdd\xaf\x2d\x7c\xd9\x2a\x5d\xe3\x26\xf6\xf5\x8c\xa7\x11\xcf\x5a\x38\xb5\x38\x6f\x10\xd3\x30\x08\xc4\xa6\x83\xa5\x72\xda\x30\x8f\xa7\x49\xe6\x4e\x2d\xb2\x2d\x16\xeb\xbd\x61\xa6\x1b\x1e\x77\x06\x6a\xd3\x62\x4b\xdf\x7e\x01\x00\x96\xf0\x2e\xbd\xb0\x43\x2d\xd9\x3d\x0d\x27\x1a\x1c\xbf\x1b\x1c\x77\x07\xd2\x7d\x45\x9d\x95\x96\xcd\xd2\xfd\xcd\x6d\xb8\xa3\x8f\x05\xac\x56\xf0\x8b\x52\x36\x6b\x3a\x24\x2b\xe1\xa5\xcf\x18\x65\xe7\xa6\xf3\x6b\xad\xc9\x02\xdd\x52\x16\x90\xf3\x3f\x6e\xb1\xf1\xb2\xc5\x96\xf3\x16\x5b\xc6\xc0\x18\x84\x23\xa0\x93\xe3\xce\x40\x31\x46\x39\x57\xcc\xc5\x49\x2e\x96\x96\xfe\x15\x39\x69\x21\x56\x42\x30\x76\xbb\x89\x06\x62\xfa\x9b\xc7\x60\x12\x1c\xc3\x25\xc8\x8f\xce\xb1\x7a\x8c\xa6\x5d\x81\xec\xf8\xb8\x8b\x7f\x0a\xc6\x1b\x2f\x9d\xdb\x0c\x48\x89\xbf\x64\x3f\xb8\xcd\xb1\x4d\xdc\xd2\x90\x62\x6f\x73\x4f\x8f\x9e\x57\x97\x7e\x5e\xfa\xba\x62\x8f\xfc\x95\xe4\x92\xd2\x56\x3b\x1e\x06\x34\x9c\xd9\x59\xc5\x8b\xc0\xdf\x08\x6a\xb9\xb6\xa0\xca\x3a\xf2\x93\xa8\x05\x7f\xc3\xfc\x6f\x2f\x95\x75\xfb\x4b\x89\xa4\xaf\x2b\x90\xc2\x57\xca\x46\x62\xe2\x6e\x07\xc1\x4c\x3a\x69\x16\xd9\xa6\xb9\x9a\xeb\x96\xc8\x2a\xef\xf0\xf2\x27\x13\x5b\x62\x4b\x70\xcb\x6a\xee\x02\x77\x52\xf1\x6f\xaf\x5c\xe0\x41\x14\xef\xc8\x23\xea\xe8\x65\x6a\x16\xbd\x03\xe4\x23\xc2\x8e\x4e\x79\x57\x96\xc3\x55\x8b\xb7\xce\x2e\x10\x41\x40\xda\x86\x06\xfa\x3e\xc6\x3e\x38\x22\xaa\x17\xec\x07\x16\x09\x54\x2f\x9a\xce\xcd\x6f\x76\xe1\x22\x7b\x61\x23\xcb\x58\x76\x81\xe8\x5e\x94\xa0\x0b\x35\xba\xb2\x86\x85\x30\x39\x3e\xee\xc2\x0a\xbb\x40\x74\x2f\xde\x75\x0b\xa7\xc7\x2e\x54\x88\xde\x21\x81\xc5\xdf\xbb\xec\x2e\x7c\xa0\xce\x6b\x62\x8d\xea\x2e\xe4\x9a\xc5\xdf\x28\xb7\x8d\xfa\x91\x75\xc5\xe2\xdf\xee\x0b\x68\x3b\x2c\xeb\xaa\xc5\x5c\x07\xc2\x97\x58\xf0\x5f\xd7\x53\xd7\x30\x1b\xf1\x78\x1c\xc5\xe7\x15\x0f\x51\x77\xd5\xb2\xff\x3c\x3a\x8e\x65\x1e\xab\x33\x03\x04\xe7\x8a\x69\x68\xb6\x53\xfe\x9e\xa7\x19\x0f\xca\x66\xe2\x6b\x7b\x0a\xb4\xd2\xce\x78\xcd\x44\x7c\xb5\xa7\xf8\x73\xcf\xb1\x68\x5a\x90\xf0\x4a\xa2\x68\x93\xdb\x3b\xed\xc6\xbf\x98\x65\xa6\xf6\x2c\x9c\xaf\xc8\x2f\x4b\xd9\x02\xb3\xc4\x65\x8b\x99\x15\xa8\x5e\xd9\x09\x6e\x64\x9d\x37\x21\xab\x7a\x21\xd5\xb3\x3e\xd3\x2e\x66\xd9\xf1\xa9\xd0\x71\xe1\xaf\x70\xb0\x0f\x9c\x87\x88\xe4\xc9\x1c\xf6\x14\xe5\x0a\x91\xe4\x79\x32\xa3\x5f\xf2\x64\x0e\xe9\x20\x06\x76\x95\x4c\x3a\x35\xf9\xae\xdf\xad\x1d\xe9\x9d\xb2\xb7\xc9\x0b\x7d\x79\x8d\x95\xcc\xd9\x0f\x12\x14\x71\x58\x4a\x40\xb9\x06\x34\x8d\x79\x4f\x60\x80\x4e\x26\xef\xd4\x5b\x5a\x5b\x69\x96\x48\x17\x5b\x4a\x54\x9d\xc6\xca\x40\xa7\x82\x4c\xc9\x4a\x7a\x91\xb6\x47\x49\x3c\x0a\x73\x81\x63\x56\xb6\x62\xbf\xc0\x1b\xa4\x9b\x5d\xb1\x5f\x93\xd8\xac\xc1\xd0\xab\x24\x66\xa5\x5f\xa2\xa4\x7a\x39\xcd\xc5\x30\x8f\xf2\x70\x74\x51\x76\xcd\xb4\xdb\x95\x0b\x84\xff\xcf\x22\x9c\x82\x79\x3b\x2b\xad\xbb\x4b\xeb\xfe\xb4\x7c\x13\x9e\x97\x54\xfd\xee\xe1\x77\xb4\x2a\x92\xaa\x0c\xee\x77\xdf\x29\x1c\xce\x79\x5e\x01\xf3\xd1\x03\x59\x2d\xca\x00\xcf\x32\x2e\x78\xa4\xab\xfd\xa4\x92\x4f\xf8\x87\x63\x2a\xbe\x59\xce\xf9\xb8\x0a\xe8\xee\x2e\x28\xe2\x3b\x77\xef\xb2\xdf\x05\x63\xe5\x09\x1b\x25\xb3\x79\x92\x71\x76\x1a\xe5\xb3\x30\xbb\xc8\x40\x3a\xa0\x59\x57\x14\x85\x69\x94\x25\x71\xd6\x16\xd3\x27\x66\xe1\xf0\xe5\xf3\x57\x8f\x5f\x3f\x1d\xbe\x7a\xfc\xfa\xcd\xb3\xc7\xbf\x0d\x7f\xfe\xed\xf1\x2f\x70\xf9\x8e\x50\x4f\x90\x46\x7f\xcb\x93\xa3\x3c\x8d\xe2\xf3\x13\x96\xf2\x4c\x30\x4b\xca\xcf\x78\xca\xe3\x11\x37\xa0\xc2\xf4\x3c\x43\x3a\x35\x8e\x13\x68\xc6\x1e\x2b\xcb\xe2\xa0\x81\x63\x02\x6b\x66\xa1\x52\x1a\x2e\x55\x05\xfc\xe6\xd4\x40\x24\x06\x0d\x3a\x54\x31\xac\xd3\x45\x34\xcd\xb7\xa3\x98\xcd\xf0\xed\x9b\x07\x29\x84\xf0\x2a\x4d\xf2\xc4\x78\x71\x6b\x4f\x15\x97\x76\x13\x3e\xba\x90\x4d\x90\x70\xc9\x87\x98\xcd\xd3\x64\xce\xd3\x3c\x22\x50\x27\x61\xf6\xf2\x43\xfc\x0a\x0b\xc4\xe4\x90\x6e\xda\x76\x21\x76\x71\x8b\xdd\x65\x8f\x59\x36\xe7\xa3\x28\x9c\x46\x7f\xf2\x31\x13\xcb\x2b\x4a\x62\x96\x9c\xb1\x93\xd3\x30\xe3\xcf\xb2\xa7\x82\x27\x4f\xa0\xdb\x10\x19\x3e\x8c\xc7\x1a\x9b\x0f\x93\x68\x34\x61\x73\x9e\x9e\x25\xe9\x2c\x13\xf0\xc6\x9c\xcf\xe9\x9c\x42\xf5\x3c\x0d\x47\x17\x99\xf8\x07\xd6\xaf\x69\xcf\xe3\xf0\x74\x1a\xc5\xe7\x06\x60\x94\x4f\xd8\x28\x4a\x47\x8b\x69\x98\x0a\x78\x86\x7a\x82\x16\xa7\x8a\x5f\xf8\xb8\x7d\x8b\xc1\x00\xfe\x6d\x0e\x6e\x81\x1c\xff\x0e\xd3\x70\xc6\x3e\x21\x45\xaf\x24\x54\xf6\x66\xc2\xd5\x9f\x92\x17\xc3\x94\xb7\xbd\x0d\xf2\x09\x4f\xb1\x3e\xfc\x55\xdd\x2a\x5e\xcc\x4e\x79\x7a\xa5\xb8\x1a\xda\xa9\xbf\xcf\xa6\xe1\x79\xd6\x06\x87\xc7\x22\x25\x67\x49\xca\xd9\x98\xe7\x61\x34\xcd\x2c\x88\x3f\x4b\xa1\x75\x25\x5f\x93\x47\x7f\x4a\x74\xf4\xcd\xa1\x40\x45\x15\x59\x6b\xc7\x0f\x06\x44\x8a\xf8\x59\x80\x32\xe6\x39\x4f\x67\x51\xcc\x45\x9d\xe8\x7d\x38\x85\x87\xa0\xc9\x99\x7c\x8c\xe6\x25\xcf\x31\x18\xc2\x07\xec\x8d\x3b\x9f\x27\x48\xa8\x13\x98\xed\x13\xa0\xdd\x89\x9a\x53\x84\x84\x1b\x41\xc6\x3e\x9d\x26\xc9\x94\x87\xf1\x15\x7b\x2d\xbf\x9c\xe4\xe9\x82\x9f\x88\xfd\x3f\xd7\xf3\x94\xb1\x30\xa5\x88\xb5\x70\x6b\x3f\x39\x0b\xa7\x19\x3f\x11\x10\x77\xcc\x85\x36\x21\xef\x13\xce\xe7\x01\x82\x68\xe1\x14\xb6\xd4\x8c\xb4\x08\x49\x5b\x86\x2e\xda\xf8\xaf\x14\xc0\xe4\xf4\xdd\x33\x21\x33\x59\x5f\xc9\x4e\x09\xd0\x68\x69\xf9\xa4\x50\x43\x74\x65\x2a\x9c\xbe\x43\x59\xa1\x61\x1d\x18\x19\xb3\x27\x25\xb7\x07\xaa\x6c\xa4\xc0\x7b\x1b\x41\x47\xa0\x60\xd1\x5e\xe0\x8f\xbe\x16\x76\x07\x44\x62\xed\xc9\x72\xa1\xe6\xd0\x3e\xaa\x9b\x40\x39\x74\xa3\x69\xf2\xf2\xf4\x9d\xd5\x99\xae\x6f\xd1\x45\xd6\xd2\xf0\x0b\xb5\xa2\xec\x28\x9c\x71\x17\x73\xd2\xa1\x50\x04\x4d\xa5\xad\x2d\xbd\x37\x29\x8a\x51\xcf\xb7\xdb\xa6\x10\x28\x63\xb4\x46\xa9\x79\x00\xc7\xd0\x93\x3a\x99\x5f\xc1\x78\xfb\xe6\x23\xa2\xae\x1b\x5c\xf9\x70\xb9\xad\x6a\xea\x97\x75\xa0\x30\x5c\x5e\xb2\x20\x93\xaa\x03\xba\xd8\x08\x9e\xb2\xee\x80\x03\xdd\xf1\xe5\xa5\xb5\x8b\xea\x61\x49\xc4\x0f\xa8\x7a\x71\x3d\x66\x96\x90\xf6\x88\xf2\xe1\x02\x42\xd2\xd7\x05\x48\xe9\x71\x3b\x50\x32\x6e\xcb\xbb\x51\x37\xa9\x4b\x03\x0c\xfa\x8f\x34\x9c\xcf\xf9\x58\x2d\x08\x41\xe7\xad\x2d\x67\xbb\xc2\x9b\x43\x85\x64\x63\x38\xfc\x80\x8d\x86\xc3\x06\xf5\x50\x10\x2c\x46\xc0\x29\x8e\x2b\x03\x87\x63\xb5\xa1\x91\x57\x11\x16\x76\x97\x97\x16\x78\xdb\x76\x96\x9c\xbe\xfb\x3d\xfe\x60\x8f\x43\x35\x54\x4b\x07\x2f\xb7\x83\x26\x2e\x39\x31\x0e\x62\x8c\x4a\xf2\x89\x05\x80\x0e\xe4\x00\x27\x85\xb6\x17\xbf\x75\x78\xe6\xd5\x3c\xa6\xb9\x4c\xcf\x5c\x40\x31\x6e\x59\xdd\x97\x4c\x7a\x46\xe0\x5d\xd1\xf9\xd6\x0b\xc0\xb9\xa1\xb5\x56\xca\x2a\x1c\x29\x7e\x52\xc5\xbd\x1e\x6f\x83\x6b\x12\xea\xf4\x6d\xa9\xd2\xb3\xbe\xbb\x07\x78\xce\x06\x95\xde\xd3\x12\x10\x1c\x03\xa4\x62\xf4\x9a\xcf\x92\xf7\x3c\x63\xe1\x74\xca\x2e\xf8\x72\x1b\xb5\x55\x1e\xe7\xe2\x28\xc2\xce\xd2\x64\x06\xfb\xd5\x34\xca\x72\x36\x0a\x47\x13\xee\x55\x48\xe2\x70\xc6\xd9\x68\xca\x51\x99\xf9\xb7\x19\x17\x1a\xc3\xcb\x33\xf6\x5b\x94\xe5\x87\xa2\x95\xbd\x95\x4d\xd5\xe7\x43\xd1\x24\xa0\x2e\xcf\xc3\x71\x98\x87\x70\x9c\xc3\x57\x43\xf0\x55\x66\x17\xeb\xf8\x89\x62\x43\xf3\xd0\xa4\xd2\xc9\xaf\xd6\x79\x29\xcc\xb2\x64\xf4\x2c\x1e\xf3\x8f\x2f\xcf\xca\xce\x18\xf7\x3b\xcd\x6b\xe8\xc8\xb0\xf7\x29\x15\x19\x84\x61\x41\x43\xfe\x49\x41\xc1\xb9\xf1\x00\xc9\xe6\xe0\x99\xd0\x27\xd0\xda\xf8\x6d\xbf\x30\xd1\x27\x17\x7c\x89\x0a\x4c\x94\x67\x12\xe4\x5a\xd3\x8c\xb9\x73\xcb\xe7\x59\xab\x53\x19\x9c\x5a\xae\x04\x5b\x81\x5a\x26\xfe\x95\x11\x39\xb0\xdb\x3c\x61\x29\x60\xb5\x9e\xee\x24\x98\x73\xc9\x3e\x84\x99\x6c\x3d\xae\x54\x9b\x34\x77\x3c\x01\xbc\x03\xed\x09\x28\x08\x27\x5d\xaa\x2c\xd6\xd3\x3b\xb8\x74\x7f\xa2\x73\x0f\x7e\x5a\xe8\x4d\x68\x36\x71\xa8\x47\xee\x3e\x7d\x72\x03\x52\x17\x87\x59\xfe\x4c\x02\x25\xae\x6c\x18\x31\x9f\xc2\xea\xf7\x4d\x5d\x05\x14\x1a\xcc\x93\xb9\x8c\x95\x43\x6d\x40\x38\xd3\xb8\x15\x20\x7e\x00\x06\x7d\x5e\xb1\xfb\xed\x6d\xbd\x8e\x88\x94\x42\xc5\xa0\x72\x49\x21\xd1\x8a\x6b\xea\x7e\xa5\x3f\xc8\xcd\xaf\x29\xc1\x20\xbf\xf0\x3c\x73\xb8\x54\xf1\x6f\x92\x22\x5f\x97\x73\xed\x39\xcf\x6f\x88\x65\xcf\x79\xee\xf0\xeb\x5d\xc3\xa9\x86\x3f\xa1\x7e\x19\x2f\xfe\xc2\xf3\x9b\x65\x44\x39\xa3\x9a\x17\xd9\x01\x5b\xc4\x63\x7e\x16\xc5\x7c\xcc\xf6\xd0\x67\x10\x0a\x07\xf0\x38\xab\x72\xce\x7f\xe1\xb9\x67\xc2\x2b\x9d\x36\x3e\xcf\x84\x1f\x4e\xb8\x38\x7f\x45\x67\x2c\xac\x98\x73\xc6\x3f\x46\x19\x9e\xbf\xfc\x53\x3f\x09\xb3\xcd\xa6\x1e\x27\x54\xd9\x28\xea\x0b\xab\x30\x96\x4d\x5d\x5c\xeb\x09\xac\x5f\xc3\x2c\x70\xfd\x96\x2d\x1e\xb0\xb9\x05\x7d\x9c\x7f\x64\xdb\xdd\x15\xf3\xfb\x6b\x98\x79\xe6\xb7\xd2\x91\xe2\xf3\xcc\xef\x91\x67\x41\x23\x99\xf2\x84\x9d\xc0\x34\x57\xac\xe8\xec\xc6\x56\x74\xa6\x56\xb4\x6c\x73\xf7\x4a\x96\xbd\xf1\xd6\xd2\x53\xaf\xec\x05\x74\xf1\x93\xa1\x44\xe0\x78\x38\x2a\x15\x02\x47\x28\x04\x5a\xd8\xc5\x67\xde\x94\xee\xdd\xb3\x76\x00\xb5\xa1\x2c\xb2\x49\x70\x6c\x90\x18\x14\x77\x17\x5b\x74\xb0\x3e\xf1\x17\x25\x3b\xc9\x24\xca\x56\x70\xdd\x91\x57\xaa\x54\xfa\x5d\xd4\xe2\x3a\x3d\xeb\xa5\xe1\xfb\xbe\x6f\x16\xb5\xa0\x15\xea\x2e\x7a\x6f\xae\xa3\xe9\xc2\x11\xc0\x9e\x68\x00\x52\xa5\xe1\x62\xec\x37\x89\x7e\x4d\x65\xd7\x00\xf5\x50\xb3\xf2\x52\xbb\x42\xf9\xaf\xd4\x09\x57\xd0\xc2\xa7\x0e\x2a\x62\x7c\x65\xaa\x20\x8c\x64\x5d\x35\x50\xda\xdc\xa5\xdf\x7d\x03\x87\xdb\x18\x04\x7a\xb9\xd1\x49\x83\x45\xe5\x68\x59\x08\xa0\x62\x36\x4b\x75\xac\xca\x9b\x71\xcf\x74\x6a\x05\x09\xcf\xa6\xd7\xd7\x8d\xae\x35\x7f\x1b\xe8\x45\x80\xaf\xa5\x13\x11\xb9\xa2\x67\xa4\x7d\x2e\x6b\x54\xd0\xd2\xaf\xbb\x54\x5e\x58\x7a\x08\x49\x15\x0f\x2f\x2d\xd7\xd7\x39\xd6\x21\xe9\x97\xd5\x37\x60\x80\x3e\x5d\xc3\x26\xfe\x44\xd6\xa8\x20\xbe\x5f\xb1\xd8\xfc\xb6\xb2\x8e\x88\xc7\xe5\xfa\x3c\x9c\x97\x3a\x57\x3c\x34\x75\xaa\x80\xf5\x3a\xdf\x59\xe7\xf8\x50\x2e\x29\xb1\xc0\xf3\x04\xaf\x72\x38\x9b\x86\xe9\x39\xc7\xe3\x36\x4b\xe6\x79\x34\x8b\xfe\xc4\x88\x7a\xfa\x4c\xfe\xdb\xe3\xd7\xbf\x3c\x1d\x3e\x7e\xfd\xfa\xf1\x7f\x0d\x8f\x9e\xfd\xf7\x53\xd6\x67\xbd\x4e\xc7\xa3\xfc\x20\x83\x6d\xa0\xf7\x5c\x6b\xb5\xde\xa4\xce\x83\x23\xa8\x54\x7a\xa0\xca\x3a\x0a\x8f\x3a\x11\x43\x99\x02\x9a\x10\x25\x8f\x9a\x5f\xe7\x61\x94\x66\x4a\xfc\x52\x08\xd2\xb4\x27\xd8\xe2\xf2\x92\x05\x50\x4f\x1d\xbb\x7f\x28\x4e\xd1\x36\x38\x70\x2b\x83\x28\xd6\xf6\xab\x48\x8c\xd9\x82\xff\xde\x3d\x4b\xf4\x13\x33\x00\xaa\x46\xc6\x30\xef\x1b\xac\xd4\x05\x14\x67\x22\x9e\xfa\xf0\x8e\x90\x6d\xda\xb9\xda\x82\x6f\xe3\x29\x57\xca\xd4\x6c\x78\x56\x6b\x1d\xfb\x61\xf5\x6a\x8d\x32\x75\x2f\x57\xb6\x5c\x1f\xea\x4b\xf6\xe7\x61\x76\x01\x86\x62\xef\xed\xfe\xfd\xef\x75\x45\x64\xbb\xb2\x9b\x78\x75\x6b\x9f\x27\x47\xc9\x22\x1d\x95\x2d\xed\xdd\xdd\x1e\x51\x05\xd5\xc5\xf3\x2c\xcc\x47\x13\x76\xf2\x9a\x9f\x3f\xfd\x38\x3f\x11\x25\xc7\xd9\x32\xce\xc3\x8f\x6c\x34\x09\xd3\x70\x94\xf3\x34\x1b\x04\x93\x3c\x9f\xef\xed\xec\xf0\xd1\x2c\xdc\x86\x90\x98\x31\xac\xf7\x70\x0a\x01\x37\xe1\x73\xef\x61\x6f\xe7\xbb\x76\x67\xe7\x6f\x19\x1f\x6d\xcf\xc3\x5c\x54\xca\x9a\xb8\x10\x04\x61\x52\x8e\x7d\x1c\x4e\xc2\x94\xf5\xd9\xce\xf1\xdb\xb7\xff\xfc\x7b\xfb\xee\xbd\x83\xa0\x79\xfc\x76\xf0\xe9\xea\x72\xb0\x73\xee\x5c\x8a\x8f\x79\x2e\x86\x3d\x49\xc4\xa1\x22\x89\xb3\x3c\x5d\x8c\xf2\x24\xcd\x58\x70\x14\x9e\x85\x69\xd4\x6c\x1b\xe0\xcf\xb2\x5f\x93\x2c\x3f\xcc\x13\x00\xfe\xcf\xb7\xea\x02\xbf\x7d\xef\xe0\xd0\x34\x7d\x3b\xf8\xfb\xce\x35\xcc\x94\x82\x15\x94\x95\x52\x4d\xaf\x31\x54\x52\xf7\x81\x9a\xd7\xfd\x29\xcf\x92\xe9\x7b\x8c\xd6\x3b\xe6\xa3\x64\x36\x8f\xa6\x7c\xcc\x32\x9c\xbf\xe4\x4c\x5f\xe2\xda\x38\xbc\x91\xbe\x10\xf2\x49\x15\x9a\x3a\x95\x83\xc4\x17\xf3\x28\x70\xe7\x07\x14\x05\x49\xbc\x28\x63\x82\x35\xde\x73\x6b\x6a\x5e\xc0\x27\xd6\x67\xc8\x02\x41\xe3\x9f\x0d\x76\x4f\x3e\x95\x55\x63\x42\x0b\x9e\xdd\x5f\xb3\x9d\xf2\xf9\x34\x1c\xf1\x80\x72\x4f\x8b\x35\xde\xbe\xfd\xfb\x56\xa3\x79\x8b\x31\x5d\x61\xc7\x6e\x79\xa9\x97\x6f\xb3\x7d\xf7\x20\x38\xe8\xbf\x7d\xfb\x36\x68\x5e\x02\x1d\xda\xf7\xe4\x87\x41\x73\xe7\xbc\xc5\x1a\x7f\xef\xb6\xef\x1e\x34\x9a\xec\x1e\x6b\xfc\xbd\x71\x8b\xac\x11\xb8\xea\x0f\x33\xce\x20\xcc\xf1\x4c\xc5\x8d\x05\xc7\x89\x61\x3b\x92\xc3\x3a\x01\x7f\x86\x64\x91\xb3\xd3\x70\xcc\xb2\x49\x34\x43\xda\xfb\xf5\xa3\xca\x0d\x67\x4d\x8d\x47\x6e\x96\x82\xe8\xa1\x24\xbb\x66\x9c\x96\x80\xb2\xfa\x42\x1d\x87\x10\x90\x2d\x49\xde\x06\x49\x67\x2e\x59\x00\xb7\x99\x28\xae\xe4\xa7\x55\xe6\x5e\x29\x01\xe0\xfa\x5c\x2d\x19\x05\xed\x80\x32\xc5\x9e\xb5\x78\x89\x00\x97\x10\xda\x39\xcf\xf2\x40\xc9\x36\xd5\x7b\xd5\x05\x11\x02\xf6\x48\xf7\xcd\x6f\x42\x46\x49\xca\xff\x3d\x7b\x82\x9b\x98\x57\x6a\x3f\xe8\xb8\x6e\x51\x72\x95\xe0\x02\xc9\xd8\x2c\xcc\xfe\x67\xc1\xd3\x10\xc2\x18\x87\x85\xe5\x32\x0b\xb3\x8b\xa3\x74\xf4\x1f\xf0\x98\xd9\xf7\xc8\x7e\x11\x8d\x41\x7c\xfe\xb3\x3d\xb8\xf7\xf7\x9d\x36\xff\xc8\x47\x01\x41\x6b\x6b\x8b\x20\x89\x4f\x90\x8b\x9f\xda\xcf\x9e\x0e\x5f\xbd\x7e\xf9\xe6\xa5\x98\xd8\x46\x83\xde\xdd\x09\xf0\x07\x2c\x68\x1c\x2d\x67\xa7\xc9\x34\xc8\xd2\x51\x73\xd8\x6d\x37\xd8\x3d\x51\xd2\x64\x7b\xac\xd1\xd8\xbf\x75\x15\x34\xbd\x86\xca\x13\x81\xef\x89\x90\x28\x70\x94\x96\xe2\x6c\x06\x7c\x53\xb5\x1a\x8c\x2b\xcb\x99\xcf\x8b\x65\xdd\x65\x81\x58\x44\x99\xec\xb9\x52\xff\xd7\x6c\x2d\xbe\x58\x07\x80\xdb\xb7\xc9\x5c\x6c\x6d\xb1\x80\xfc\x8c\x62\x40\xb0\x84\x0d\x15\xcc\x22\x0b\x3e\xd8\xfc\xe2\x20\x4d\x92\x52\x4d\xa0\xe0\x92\x27\x79\x2f\x79\xcf\xd3\x94\x87\xa3\x89\xe0\x39\xc1\x0b\xdb\xef\x32\x90\x54\x66\x17\xb0\x38\x5b\xf4\x71\xdc\x18\x0e\x65\xd5\x61\x36\x09\x53\xb8\x57\x1f\xec\x7b\x86\x6b\x9a\x7a\x06\x5c\xc7\x70\xee\x3d\xc5\xa3\x50\x0c\x73\x79\x36\x10\x32\x57\xfa\x1f\xd5\x71\x0a\x93\xdb\xff\xc0\x71\x0b\x13\x2b\x6f\xd9\xae\x79\x5a\x98\xab\x2d\xb1\xce\xf1\x5e\x57\xf6\x9d\xf0\xcf\x79\x8e\xb1\x38\xd4\x65\xb8\x7b\xd8\x94\x18\x9a\xf7\xce\xf4\xfa\x02\x0b\x4d\xc8\x8e\xc2\x04\x28\xf0\x1e\xf2\x6f\x6e\xd7\xfe\x35\xcc\x26\xa5\xc2\x4e\xf9\xbf\xde\xd4\x19\x75\x6d\x53\xe5\x2c\x9c\xaf\x65\xa8\x54\x87\x0c\x7b\x7e\x66\xf2\x6b\xc1\x5c\x69\xac\x91\x45\xfb\x25\xee\x7f\x8d\x49\x98\x4d\x1a\x98\xa4\x46\x90\x0a\x47\xd9\x98\x85\x73\xf9\x31\x90\xc7\x2f\x73\x74\x93\x55\x90\xf3\x48\x53\x7c\x90\xee\x9b\x60\x0b\x3f\xcf\x2c\x6f\x6e\x47\x16\xa3\x00\xe8\xa5\x53\x7d\x5f\xe2\x2d\x6a\xa2\xcd\xae\xb4\xea\x03\x52\xf5\x17\x5e\x26\xad\xbe\x7b\xf0\x90\xd4\xfb\x35\x2c\xf5\x86\x7e\xf0\x1d\xa9\x77\x54\x01\xef\x11\xdd\x94\x20\x5c\xb2\x50\x8c\x44\x2b\xe5\xbc\xe3\x63\x15\x72\xb2\xa0\x82\x01\xbc\x11\xae\xd8\xb1\x64\xb9\x81\x92\x0e\x92\x13\xf1\xd0\x2d\x36\x27\xe5\x2f\x40\xf8\x49\xcc\x66\x20\x1b\x92\x68\x95\xf2\xf6\xc2\x24\x68\x97\x67\xf1\xbe\xe6\x6b\x23\x00\x3a\x6c\x4f\x7d\xa5\x81\x5e\x81\x09\x47\xc8\xa6\x82\x29\x4d\x52\x77\x79\xe5\xa1\x9e\x20\x1a\xf3\x00\x1a\xc5\x74\x1f\xf2\x36\x83\x44\xa2\x13\x87\x6b\xa8\x04\xe1\x5e\xf1\x2f\x19\xc6\xf4\x4a\x25\x5e\x18\x8f\xb5\x02\x93\x27\xec\x44\x0c\xf0\xa4\x7d\x4b\xfc\x43\xc2\x4a\x8f\x24\x03\x69\x66\xda\x77\x6a\x18\x03\xb2\xac\xa5\x8c\xbf\x0e\xa0\x73\x98\x64\xc9\x3e\x85\xd2\x09\xb0\x8a\x64\x9a\x42\x69\xa6\xdb\xe2\x11\xbf\xb0\x98\x44\x7d\xcf\x1a\xaa\x73\x7b\x50\xbd\x86\x50\x93\x43\xc6\x2b\xbd\x01\xec\xae\x2f\xe3\xc4\x58\xd6\x12\x72\x28\x4c\x28\x43\xea\x19\x29\xbb\x8b\xa1\xa8\x1f\x58\x3f\x03\xc1\x90\x42\xf1\xfb\x74\x55\xf3\x92\x86\x4c\x7f\x81\xca\xeb\x1a\xf5\x6b\xdd\xd1\x54\x13\xc8\x77\x45\x23\x29\x54\x50\x1b\x40\x56\xbc\x91\x20\xc1\x3c\x92\x8c\xa3\xb3\xda\x1a\xc3\x17\xbc\xcd\x31\xab\xc7\xbe\xcc\xd1\x17\x36\x30\x51\xca\x6c\x2d\xf4\x57\xa4\x83\x3d\xf5\x52\xa9\xa0\xd3\xba\xdd\x57\x30\x0e\x58\x97\xed\xb1\x4e\xcd\xcb\x1c\xba\x9c\x0b\xd3\x5e\xe7\x0a\xe2\x06\x17\x97\xd6\x7f\xb3\x3c\x8c\xc7\xdb\x42\x5b\x4f\x52\x76\xa2\x95\xaa\x13\x9c\x5f\xe9\x04\xaf\x54\xe0\x5f\x1f\x1f\xfd\x3a\xfc\xfd\xc5\x93\xa7\x3f\x3f\x7b\xf1\xf4\x09\xeb\xb3\xc6\x70\x38\x4d\xc6\x61\x36\x19\x8a\xea\x43\xdd\x7c\x38\xfc\x8b\xbf\x07\xd1\x4a\xb6\x21\xc3\xb5\x6e\xca\xdc\x65\xf4\x99\x2f\xca\xe4\x86\xb0\xfa\xf6\x52\x99\xcf\x29\xd3\xd0\x2d\xd1\xbe\xd5\x54\x6b\xc0\x61\x73\x08\xba\xe4\xf0\x84\xad\x98\xab\xe5\x60\x39\x03\xf8\x5c\x94\x8d\x8b\x02\x3b\x30\x7d\xb2\x3d\x03\xad\x7c\x4d\x79\xef\xf4\x1e\x6c\x7e\xad\x74\x8d\x05\xf5\xd7\x63\x74\x7a\x95\xe9\xe3\xf5\xf5\x6f\x32\xd7\x60\xf9\x2f\x7b\x91\x29\xf5\xa1\x7a\x8b\x43\x05\x0a\xb5\xb7\xfd\xc0\xb0\xe6\xed\x7e\xdf\x30\xa7\xd8\xfd\xab\xd9\xba\x9c\x7d\xbd\xb7\xa2\x0f\x36\xbf\x67\xf9\x2a\xf7\x03\xeb\x66\x13\x40\x6e\x70\xb1\x79\x1d\xe1\x7a\x93\xf7\x9a\x80\x7f\xc9\x85\xa6\x54\xaf\xd7\xba\xcf\x34\x2a\xc6\x3d\x57\x3b\xc1\xe3\x0e\xf8\x01\x1b\x16\xec\xdb\xf2\x5b\xa8\x30\x32\x46\xa0\xcd\x9b\x07\xee\x44\x91\xa0\x7e\x2b\xef\x02\xcd\x39\xc1\x65\xd1\xcd\x8d\xc5\xe7\x3c\x7f\x1e\xce\x2b\x8c\xc5\xdd\xfb\x3d\xcf\x69\xa0\x52\xd5\xad\xb4\x77\xf8\x34\x5d\x62\xf0\xf8\xca\x34\x58\x65\xd4\xa8\xd4\x62\x0d\x0d\x65\xa0\x54\x51\xad\xe0\x87\x74\x13\xfa\xab\x8d\x4e\x91\x21\x1e\xd6\x31\xdd\xfa\xdd\x68\xc8\x3d\x4d\xb6\x88\x20\x54\x3e\x08\xa0\x45\xc6\x59\x98\xb1\x45\x1c\xfd\xcf\x42\x5b\x29\x2f\xf8\xf2\x4b\x5e\x1c\x29\x84\x56\x18\xc9\xff\x83\x2f\x45\xad\xc0\x59\xeb\x32\xe6\xbe\x8c\x53\xe9\x2e\xbb\x00\x8b\xfb\xda\xd6\xc5\x2e\x2f\x99\xfe\x86\x0f\x6b\xed\x6f\x19\xdc\x3a\xd8\xdf\xe4\x38\x1a\xf8\xe0\x4d\x47\x0a\x15\x3b\x54\x63\x38\x04\xbd\x62\x38\x94\xa5\x7b\x3a\x8e\xa8\xb4\xa4\x94\x5a\xe8\xe5\x80\x3c\xf3\xbc\xb9\xab\xf7\x9a\x0b\x5f\x6b\xe3\xb3\x70\xbe\x81\x32\x7e\xdd\x95\xbe\x81\x42\xae\xd6\x8c\xcf\x79\xcd\xbb\x72\x57\x38\xb1\x11\x78\x9e\x89\xd9\xdc\x96\xbd\xe6\xc4\x50\xed\xd1\x33\x37\xeb\x2b\x8f\x6b\x4e\xd1\x97\x55\x20\x15\xf1\x7d\xce\x70\xfe\xc9\xac\x76\x8a\x23\xf0\x3c\x93\xb9\xb9\xc9\x7a\xcd\xc9\x3c\xa2\xab\x6c\x03\xb5\xec\xba\xcb\xec\x26\x55\x33\x31\x84\x4a\x87\x33\x45\xfb\x15\x3a\x9a\x77\x5a\x75\xe4\xa3\x82\x6f\x55\x2d\x6f\xac\x7b\xa4\x89\x90\xdf\xf0\x2f\x51\xf0\x56\xaa\x64\x04\x77\x0f\xdf\xac\xe3\xe4\xfd\x25\xd5\xfe\xc7\xe3\x71\xa6\xf7\x55\x99\xf6\x17\x1d\x24\x57\x3c\x28\x0c\xc7\x63\xc7\xa1\x91\x93\x77\x1c\xe1\x34\x0a\x33\x36\x5f\xd8\x47\x81\x12\x25\x40\x75\xb4\x82\x7b\xaa\x5d\x15\x65\xef\x8f\xc7\x63\xba\xd9\xdb\xde\xb0\x82\x01\xa0\xb0\xe5\x50\xab\x59\xcf\x01\xcf\xf4\xe1\x99\xe1\x75\x4d\xc4\x5e\x3d\x2b\x8a\xeb\xcf\x40\xd1\x5b\x99\x17\x5f\xd2\x94\x2d\xd7\x30\x1d\x4d\x04\x5b\x39\x74\x57\x51\x43\x2a\x75\xaf\xb3\x64\x11\xaf\xf0\xd9\xe7\xe6\x31\x14\x99\x8d\x52\x17\x65\xb5\x20\xab\xa8\xee\x97\xc7\xeb\x3a\x89\x97\x87\x94\x19\xb6\xb3\x64\xc6\xad\x68\x32\xca\x41\x2a\x5b\xcc\x21\x90\x94\x28\x8a\x72\x9e\x86\x39\x07\x22\x67\x93\x24\xcd\x27\x61\x3c\xae\xf4\x99\x52\x37\x72\x00\x14\xef\xe3\x70\x7e\xf3\x44\x41\x03\x4f\x87\x92\x28\x29\xf3\x94\x8f\xa3\x91\xa8\x64\xf9\x97\x44\xf1\xfb\xe4\x82\x8f\xd9\x9c\x2b\x9c\x20\xf9\x5c\xfd\xbd\x76\xc9\x38\x3a\x87\xb1\x79\x98\x65\x5c\xb9\x03\xa8\xce\x60\xef\x5e\xe9\x8d\x05\x03\x39\x4a\x66\x3c\x80\xbf\x5a\x06\x40\xad\xfb\x43\xa4\x83\x7d\x7b\x08\xdf\xe8\xdd\xe1\x8a\xbb\xc2\xe8\x8c\x05\xba\x57\x44\x43\xde\x15\xea\x27\xb5\xf0\xb1\x18\x7e\xc3\x84\xd8\xb8\xb2\x6d\xa1\xd2\x2b\xcc\xc7\x8d\x7a\xc0\x1e\x5e\xbc\x81\x08\x5f\x70\x8e\x28\x0b\x21\xab\xbc\x16\x7e\x8f\xe2\xfc\x51\x55\x90\xab\xef\x1e\x3e\xd2\x51\xbb\x4a\xbd\x16\x1e\x5c\x23\x5e\xd8\x2c\x9c\xbf\x49\xaa\x7b\x56\x0e\x13\x19\xcf\x57\x54\xfd\xae\xe0\x72\x76\x43\x91\xb8\x10\x01\x55\xfa\xfb\x8b\x97\xaf\x9f\x3c\x7d\xfd\xf4\x89\x2a\xef\x5d\x23\x52\x97\x58\x49\x4e\x88\xad\x9f\x70\x71\xa9\x30\x5c\xe3\x30\xe7\x4e\x8d\x27\x61\xce\x55\x31\x4f\xd3\x24\x75\xca\x9f\x8a\x6f\xaa\x82\x20\xad\x5d\xfc\x3c\x9c\xab\x42\x14\xcb\x4e\xf9\x0b\xf8\xa8\xaa\xa4\xfc\x9c\x7f\x74\x41\xa0\xf3\xa9\xaa\x92\x71\x37\x4c\xd8\x11\xcf\x75\x21\xd0\xc0\x2d\x87\x8f\xba\x0a\x70\xa7\x5b\x05\x3e\x42\xa4\x31\x1d\x19\x01\xa3\xde\xf8\x82\x96\x61\x09\xa1\x59\xf8\x8f\x88\x7f\x28\xd2\x0d\x3e\xdb\xe1\xcb\x80\x3f\xe2\xf7\x3c\xcd\x25\x22\x70\xa5\x3f\x4f\xa3\x59\x94\x47\x70\x1d\x1d\x8f\xe5\x28\x48\x8c\x05\xa8\xa9\x6c\xfa\x72\x79\x1d\xc8\x3f\x48\xfe\x3d\x72\xa5\x41\xc7\x0a\xee\x49\xf0\x2e\x96\x02\x3a\xa0\xbf\x30\x30\xca\xcb\x33\xfb\x56\x64\xad\x08\x66\x4f\x38\x9f\xe3\xbe\x23\xb9\x9c\xc4\x1c\x4b\xce\x6e\x41\x7a\x32\xce\x32\xb1\xe7\x9f\x28\x66\x7d\x13\x9e\x6b\xed\xff\xee\xdd\x17\x49\xce\xf7\xee\xde\x65\x6f\x26\x62\x7b\x56\xc2\x39\x89\xa7\x4b\xb5\x77\x65\x04\x36\x2a\x8e\x18\xce\x2c\x0f\xcf\x55\x27\x27\x92\xa3\x4f\x5a\xec\x44\xb0\xae\xf8\x17\x58\x54\xfc\x81\xcc\x26\xfe\x92\x2e\xf7\x2d\x26\x74\x52\xb9\x72\xbe\x82\x78\x67\xea\x2c\x93\x87\xe7\xd0\xc6\xa2\x94\x3a\xd5\x28\xaa\x7e\x8b\x99\x86\x24\xc6\x37\x40\x5f\x57\xc4\xb4\xf2\xb0\x50\x79\xfd\x98\x50\xb0\xd5\xeb\x14\x8a\x26\x3a\x10\x24\x33\x24\x62\x67\x4f\xbd\xd0\x3e\x63\x81\xec\xae\x7d\xba\xcc\xf9\x6f\xa8\xa1\xdc\xee\xcb\xe8\x47\xe6\x5b\x93\x5d\x5e\x92\xd0\x49\xb4\xd1\x4b\xcc\x00\x63\x35\xc2\x6f\x4d\x1a\x41\xbc\x18\xfc\xcb\x44\xf4\x56\x0e\x95\xca\xf1\xeb\x14\xe4\xe5\xbe\x09\x62\x06\x51\x30\x25\x78\x59\x66\x06\x66\x0b\xdf\x8d\xc7\x76\xdb\x04\x6c\x8a\xf9\x07\xa2\x76\xe8\xf0\x70\xcc\xfd\x8e\x71\xce\xea\x8e\xd6\xd2\xc3\xcc\x30\xe4\x66\xbb\x67\xcd\x18\xb7\xbf\xe8\x1d\x51\x8d\x72\x67\x87\x1d\x26\x3c\x1d\x61\x73\x1e\xc6\xe8\xf1\xd5\x3d\x01\x39\xd5\x41\x5e\x1e\x83\x6f\x5d\x9e\xb0\x59\x34\x9d\x46\x19\x1f\x25\xa8\xbb\x2b\x08\xcf\xe2\xf7\xe1\x34\x52\xf5\x04\xd3\x8e\x00\x26\xec\x3e\x27\x2f\xc2\x17\x27\x6d\x37\xa4\x55\x70\x4f\x71\xe9\x3d\x12\xff\x4e\x62\xa9\x76\xfd\x3d\xbb\x95\x9c\x0c\x38\xc5\xf5\xd5\x34\xc0\xaf\xad\x2d\x55\x38\xe3\x59\x16\x9e\x93\x72\xf9\x81\x82\xd7\x7b\x3e\x21\x8c\xde\xc7\x8b\x84\x81\xea\x38\x7e\xb9\x4f\xca\x00\x98\x3c\xcc\xd5\x97\x96\xbb\xa3\xca\x15\xdc\x32\xd0\xc2\x0c\xd7\x5b\x5b\x67\xcc\x96\x09\xb3\x6b\x3f\xb3\x42\xbc\x89\xf3\x5b\x9e\x60\xf7\xa6\x13\x8f\x54\x2d\x52\x50\x10\x07\x79\x8e\xdd\xc3\xf7\x00\x86\x0e\xa8\x4f\xed\x91\x30\x69\x4a\x7b\xe8\x13\x35\x96\xb6\x40\xf5\x88\xb6\x88\xb2\x57\x61\x9a\x47\xa1\xd0\xc8\xab\xe3\xca\xe9\x64\xa9\xb2\x8f\xcb\x4b\x16\x98\xfe\x8c\x2e\xdc\xd4\x71\xd3\x64\x88\x37\x31\xd5\x60\x6a\xd2\xcb\x11\x7e\x6d\x6d\xb1\xdb\xba\xf7\xba\xcb\x69\x67\x87\x3d\xce\xb2\xc5\x8c\xb3\xd1\x72\x34\x8d\x46\x6a\xa3\x97\xc2\x37\x9c\xb6\xc9\xd8\x40\x4e\xc2\x2b\x3e\x0c\x15\x70\xce\x73\xb5\xac\x69\xd2\x7c\x59\xcd\x83\x82\x06\xd0\x57\x11\xe1\x6c\x6c\x14\xc1\x2e\xfb\x25\xaa\xb8\x26\xc5\xce\x0e\x7b\xcd\x47\x8b\x34\x8b\xde\xf3\xe9\x52\xed\xcc\x7a\xef\x08\xb2\x45\x36\xe2\xf3\x3c\x3a\x9d\x4a\x7b\xd1\x74\x2a\x77\xae\xa9\x60\x55\x78\xad\xc7\x98\x8a\x45\x07\x56\x1e\x6b\xe7\xd0\x03\xb2\xae\xe8\x68\x20\x43\x39\x55\x46\xae\xe9\x0f\x18\x3b\x73\x8d\x48\x84\x1a\x0f\x72\xdb\xe7\xd0\xd5\xb9\xd5\x23\x1c\xa8\x14\x6c\x2a\xba\x2d\x4d\xd4\x37\x0f\xb4\x9c\x46\x2a\x6c\x82\x19\xd3\x53\x6a\xd1\xa4\xfe\xd1\xd7\x6c\xcc\x9e\xb3\xef\xe6\x9e\x11\xb5\x1e\x88\xac\x8e\xaa\x66\x1d\x8e\x05\xcc\xb6\xf9\xe2\x73\xab\xb5\x4a\xdd\x51\xd5\xb9\x4c\xb7\x6c\x7a\xc8\x36\x19\x3b\x99\x85\xf3\x13\x34\xf0\x64\xae\xf7\x75\x1d\x65\x79\x16\xce\x41\xc1\x13\xff\x9a\x83\x8f\xa3\x7b\x49\xc3\x12\xb5\x91\x7a\xba\xb2\xcd\xeb\x52\x0e\x05\xb3\x70\x5e\x65\xa1\xd1\xab\x44\xd7\x06\xb9\x84\xe2\x4b\xfc\x3a\x4b\xd2\xa7\xe1\x68\x62\xa8\x22\xed\xaa\xfa\x06\x46\xc1\x38\x96\x76\x9b\x01\xeb\x33\xfa\x20\x1b\xdc\xcf\x9a\xf5\x2f\xb9\x8d\xc0\x76\x26\xe9\xbb\xb5\x2f\xb8\xf5\x24\x65\x3c\x87\x49\x0a\x63\x15\x14\xe0\xcc\x38\x2f\xd4\x9a\x27\xa1\xef\x89\x79\x12\xff\xae\x33\x4f\xa6\x07\xdb\x6a\xaa\xa6\x47\xe8\x8c\xf5\xa7\x27\xe3\x39\x99\x1e\xf1\xcb\x3f\x3d\xe5\x33\x63\xc2\x03\xd5\x9d\x12\x83\xac\x67\x4a\x6e\xe4\x2e\xfa\xf1\x74\xfa\x1f\xbc\xd4\x28\xf5\xdd\x77\xbd\xcf\x1b\xc8\xfd\x2f\xea\x3a\xb8\xa6\xc5\xc1\x8a\x6d\x4e\xec\xdc\x02\xd4\x5c\x2a\x3f\x6e\xd8\xf4\xaf\xe0\xb4\xff\xed\xa4\xfe\xb5\x9c\xd4\x37\x8a\x97\x6b\x44\x5c\x6d\x4d\x9b\xc4\x31\x17\xcc\x2f\xdf\x11\x4a\x59\x51\x88\x5b\x7e\xfa\xee\x37\x75\xd7\xa0\x1a\x38\xa9\x73\x92\x7c\xe2\x83\x63\xc7\x4c\xcf\x27\x06\x8c\xac\x4f\x6f\x28\xa4\x2e\x6f\x1d\xac\xe5\x0f\xaf\x22\x5f\xf6\xf8\x5c\x09\x7a\x0d\x8b\x3c\x95\x82\xb2\xed\x6d\x2b\x25\x37\x5f\x92\x71\x59\x0f\xa4\x30\x16\xb6\xa1\xea\x01\x54\x8e\x62\xb9\xb8\xfc\x7e\xb1\x72\xea\xc4\x16\xbe\x32\x56\xb9\xf8\xff\x5a\xe7\x8d\x1a\x67\x0d\x72\xce\x10\xf4\x22\x75\xac\xb0\xe9\x15\xe7\x8e\xab\xc2\x2b\x12\x79\xb5\x53\x75\x22\x20\x65\x3a\xec\x38\xa2\xa4\xd0\xbe\x88\xe6\x32\x32\x87\xa6\xa4\xf7\xf1\x9a\x9e\x2f\x85\x6a\xc5\xcc\xc8\xed\xe2\x1f\x32\x6d\x34\x79\x24\x6b\x45\x12\xd7\xe5\x02\x35\xe9\xea\xaf\x67\xd6\xac\x29\x3b\x10\xb8\x4a\x3f\x41\x11\xd6\x40\x0f\xc8\x52\x0c\x54\x0f\x2d\x8d\x0b\xcc\x3b\x8d\xc0\x0e\xd4\xb2\x42\xb6\x33\xb6\x67\xc1\xd0\x2d\x0d\x34\x84\x61\x8b\x02\x37\x76\xf7\x8d\x1d\xf8\x90\xc9\xcd\xa0\xa9\x7f\x2d\x31\x63\x1d\xb0\xc0\x10\x1c\xb9\x06\x7f\x5c\x5e\xda\x21\xc9\x0b\xa3\xa9\x08\x45\xde\x24\x1d\xec\x69\xc2\xeb\x8f\xd6\xfa\x91\x3c\x69\x9d\xd9\x4f\x53\x1e\x5e\x58\x49\xfa\x14\xb3\x41\x98\x72\xc3\x79\xc0\x4a\x7d\xd6\x20\xcf\x3d\x1b\x56\xc8\x7b\x09\x5f\x08\x1a\xd5\xcc\x09\x72\x2f\x21\x49\x6b\x03\x01\x64\x71\x9c\xaa\x05\x46\x08\x52\x49\xf2\xdd\xce\x0e\x7b\x91\xc4\xea\xd2\x4c\x6d\x32\xda\x1d\x43\x6a\x10\xe3\xe8\x0c\x94\x23\x27\xf0\x8d\x98\xdd\x38\xc9\xa9\x15\x42\xca\x4c\xe8\x15\x25\x26\xfc\xb9\xb5\xa5\x71\x0a\xac\x31\x83\xf0\xc2\x3e\xb7\xb6\x58\xb1\x08\x96\x35\x6d\x7e\x3b\x90\xee\x9d\x9a\x02\x7d\xd6\x50\x7b\x57\x43\x5a\xda\xa0\x80\x04\xaa\x52\x9f\x08\x1c\xa6\xdc\x44\x35\x8d\x0a\x70\x64\x01\x85\x83\x9f\x56\xb0\xc1\x15\x8d\x4f\xef\xb7\x17\x14\x8a\xb4\xf8\xaa\xa1\xa3\xd3\x0d\xda\xa3\xa5\x6f\xee\x98\x28\xd4\xab\x5f\x56\x6b\xea\xbb\x26\x2d\xd4\x91\xbc\xba\x2b\xab\xaa\x9e\x6b\x5f\x94\xc3\xeb\x75\xbc\x0f\xa6\xc9\x19\x4e\xe8\xd3\x3c\x5e\xcc\x78\x0a\x3e\xcb\x3a\xc6\x41\x1c\xce\xd4\x3d\xa1\x44\x63\xcd\xf0\x0c\x5e\xad\x96\x04\x67\xa8\x3a\xf2\x69\xec\xca\xd1\x29\x86\x5f\x70\xf4\x1a\xea\x45\x63\xd3\x9e\x86\x68\xc8\x5a\x84\xd2\x25\x5e\x35\x06\xb6\x87\x31\x36\x77\x72\xc4\x90\xf6\x8b\xd2\x10\x0c\xbb\xbb\x0f\xeb\xe6\x00\xab\x17\xd7\xc8\x8c\x47\xea\xc2\xe6\xc3\xb3\xf8\x44\xe6\x82\x5a\x64\x1c\x5c\xa6\x4e\x04\x91\x7e\x86\x68\x2b\x50\x57\x92\x1f\xbf\xa0\x6b\xb1\x74\x64\xad\xe0\x21\x70\x00\xfa\x3c\x6c\x54\x38\x4b\x28\x7c\x0b\x47\x09\x85\x29\x2c\x17\x07\x0b\x0f\x1c\x32\xd0\x52\x50\x25\x63\xba\x69\xe6\xae\x60\x5f\x79\x42\x30\xb8\x7a\x1e\x58\xa8\x7a\x54\x56\xaa\x70\xea\x76\x66\x24\x08\xdb\x04\xad\xf6\x0c\x5b\xca\x5d\xd3\xea\x45\xe7\xba\x29\x0f\xd2\xf4\x4b\xd5\xaa\xd9\xfc\x25\x3e\xa0\xf7\x73\x34\xcd\x2b\x72\xdd\xa9\xa0\x12\x59\xbe\x38\xad\x76\xaf\x79\xf0\xd9\x1e\x41\xae\xb6\xc2\x2a\x36\x78\x96\x3d\x35\x6b\xc8\x36\x60\xf8\xaa\x00\x7c\x03\xbe\x80\x26\x8c\x22\x9f\x24\x19\x97\xde\x0b\xca\x2f\x02\x5d\x52\x33\x79\xbc\x39\x41\xbf\xd7\x13\x15\xfb\x41\xa3\x85\x0f\xb3\x7e\xa1\xdb\x90\x1c\xe2\x39\xcf\xc9\x79\x48\x16\x57\xef\x32\x70\x6a\xb6\x77\x9a\x7f\xe5\xb6\x62\x2d\x33\x69\x42\x33\xc3\xbc\x5d\x18\xfa\x01\x61\xa1\x3d\x2d\x09\xac\x9d\xc6\xdc\x51\x29\x1f\x3d\xe7\x2c\x86\xd9\x5e\xae\x6e\x91\x8b\x6b\x19\x80\xad\xb8\x2c\x09\x73\x07\x2e\x32\xe6\xe2\xc5\x24\xea\x84\x12\xa7\x3f\x1f\xcf\xd8\xc9\x99\x64\x33\x65\xca\xbc\xf2\x99\xfc\x0d\x61\x3c\xab\x78\x5d\x37\x5e\x70\xb9\xd1\x8c\x8a\xf3\x12\xc2\xbd\x38\x9f\xcd\xf3\xa5\x74\x67\x54\x4c\x90\x89\x2d\x6b\x64\xbb\xed\x0e\xb1\x24\x8a\x47\x9c\xdd\x6f\x77\x77\xdb\x1d\xf8\x30\x0a\x73\x7e\x9e\xa4\x4b\xf6\x7b\x1e\x4d\x57\xb2\x81\xa7\x43\xf6\x6f\xfc\x63\x28\x76\x4a\xd9\xb9\x96\x30\xa0\x58\xb5\xf3\x68\xc6\xb3\xa0\xd7\x62\xc3\xb6\x66\x04\x41\x37\xa8\x2b\xd4\xeb\x64\xca\xdb\xd3\xe4\x1c\x5d\x2a\x21\xb0\xe9\x5d\x71\x0a\xe8\xff\xc8\x8e\x8f\x07\x2d\x76\x3c\x18\x94\x56\x86\xb4\xe0\x7d\xe9\x2d\x99\xc9\xa8\x2c\xaa\x35\x28\xc0\x6e\xa0\x59\x89\x40\x60\xa9\x38\xc7\x25\x81\xa3\x74\x75\xcf\xfc\x6d\x1e\xb2\x41\x08\xfa\x37\x82\x38\xa5\x92\xf5\x3b\xa2\xbb\xc8\x74\x9d\xa5\xba\xea\xf7\x9f\x2d\xd7\xa9\xca\x4a\xe3\xed\xb7\xdb\xb9\x7e\x4e\xd4\xbf\x9e\xd1\xbb\x4c\x3c\x97\x2b\x70\xb2\x02\xd4\xde\x9e\x46\x17\xbc\xf2\x49\x4d\xa5\x33\x7d\x51\x71\xd3\xa6\xd6\x28\x9e\xf0\x34\xca\xf9\x98\x1d\xcd\xf9\x28\x3a\x5b\x4a\xce\x8e\xe2\x73\x52\x66\xa3\x76\x6d\x65\xcb\xe7\x9a\xfd\x5b\x74\xc1\x41\xbf\x92\xd7\x73\xba\x53\x6a\x7a\xb5\xd3\x45\xe2\x4d\x91\xc9\x88\xf8\x38\x3d\x17\xfb\x07\x56\x83\x8c\x87\x9a\xe9\x0b\x75\x05\xef\x5a\x95\x6f\x63\x7b\x9a\x28\xd1\x6d\xf3\x06\xdf\x62\xfa\xda\xc8\x04\x8a\xd8\x9c\x24\x25\xb4\x41\x64\x17\xd1\x1c\xd6\x02\xcf\xd4\x30\x30\xf0\xa7\x80\x02\x7f\x00\x10\x9d\xd9\xb0\x70\x89\x46\x01\x1c\x98\xe5\x8f\xdd\x28\x73\xb1\xf4\x85\x6d\xb2\x3d\x92\x58\x5c\x3b\xb2\x23\x2c\x6a\x13\x86\x14\xe3\xca\x4a\xab\x54\x25\xea\xb3\x1e\x18\x06\xb8\xbc\xf4\xda\x63\xc9\x95\xaa\x63\xd9\xa0\x18\x6f\x6d\xb1\x80\x18\x2b\x84\x90\xc5\x30\xc3\xec\x7b\x88\x68\x49\xd6\xc0\x49\xa8\x66\x4e\x62\x7a\x22\x30\xc3\x4c\xde\x6c\x96\x8c\x79\x9b\x02\x52\x96\x27\xac\xda\xb0\x7d\xc3\xd0\x1e\x34\xe6\xed\x77\x19\xeb\xb4\xbb\x1d\xb7\xab\x38\x89\xb7\xd1\x3c\x6a\xd6\x38\x13\x6a\x3f\x30\x41\x66\x75\x14\x98\x69\x0e\x54\xa7\x09\xf8\xcd\xc1\x8b\x5a\xf5\x69\x1e\xa6\x3c\xce\x1b\xcd\x66\x11\x93\x57\x93\x30\xce\x93\xd9\xbf\x1f\xb1\x5e\x5d\x44\x84\x8c\x1a\xcb\x0d\xca\xc5\x06\x58\x92\x62\x83\x58\x5b\xd8\x18\xaf\xb9\xc2\x67\xf4\xf9\xf3\x22\x7a\x74\x11\xcd\x99\x8b\x8e\xd5\xbd\x94\xeb\xf8\x50\x4d\xbe\x74\x20\x66\x45\xd7\xa0\x84\x91\xce\xd5\x73\xf2\x82\x3b\x47\x95\x75\xc8\x12\x10\x9e\x9d\xb4\xce\x73\x06\x5b\x13\xaa\x0a\x3b\x0c\xea\xc6\x49\xe5\x93\x1a\xf2\x9e\x46\xc0\x4b\x52\x36\x0b\x3f\x4a\x69\x27\x57\xda\xea\x08\xc5\xea\x66\x30\x06\x7c\xf0\x17\x48\x7b\xd8\xd1\xf3\x44\x3e\x9c\x61\x27\xaa\xd7\xb2\xb3\xb2\xc6\x6a\xed\x67\x37\x55\x22\x1b\x27\xc4\x77\x18\x46\x99\x13\xb7\x74\xc7\x6b\x38\x00\xc4\x4d\xff\x4b\x99\xd8\xb9\xf1\xd7\xf7\xfd\xaa\x0f\xbc\x56\x6a\xee\xd7\xe7\x1a\x8d\xaa\x87\x63\x36\x77\x02\x92\x87\xec\xf2\xe4\xf1\x3a\x74\xa7\x0a\xf5\x2c\x18\xb8\xa4\xee\xfd\xfb\xcd\x1b\x4f\xca\x5e\x3f\xca\xb6\x6e\x74\x0d\x95\x62\x83\x80\xda\x31\x91\xf2\x27\x26\xd7\x6b\x31\x84\xb6\xbb\x8b\x53\xc5\x9b\x12\x57\x15\x6f\x6d\x91\xd9\x51\x1f\x4d\x92\xe6\xaa\xc8\xd6\xba\x2b\x0f\xcf\xac\xeb\x62\xe5\x3b\x6f\x91\xeb\xe9\x1b\x3c\x65\x15\x09\x6e\xba\x71\xcf\x56\x85\xe3\xd4\xcf\xa2\xaa\x75\x66\x82\xc6\x2d\x3c\xfd\x0c\x8a\xc7\x1f\x68\x60\x1f\x7f\x2a\x7c\xf1\x74\x8b\x22\x45\x1f\x6d\x1e\xab\x79\x9d\x55\xa8\x2f\xc6\xfd\xc7\x90\xee\xbf\x76\xb9\x62\xe7\x3a\x55\xb9\xfb\x1c\x49\x55\xf8\xfc\xcf\xbb\x20\x65\x80\x5d\xae\xb6\x9a\x9b\x7a\x01\x66\x72\xa4\x93\x2a\x48\xc9\x2f\xf8\x48\xec\x03\x0f\x2f\x9e\x17\x46\xf2\x07\x7e\xfd\x4c\xcf\xc4\x24\x89\xa7\x49\x98\xef\xf6\x5c\x2a\xe3\x57\x6b\xba\xa1\xe6\xc3\xfb\xbe\x9a\x0f\xef\x5b\x35\xa3\x38\x7f\xe4\x54\x7b\xa6\xfc\x45\x49\x9d\xee\xc3\x62\xa5\xee\x43\xb7\x56\x01\xb7\x67\xb1\x8b\xd9\xc2\xd3\xa1\xf1\x50\xb5\x6a\x1d\x4e\xc3\xd9\x9c\x8f\x7d\x95\x65\x51\xa1\x4d\x01\xcd\xdf\xa3\x02\x9e\x0b\x1f\xa2\xbf\x47\x04\x53\xe7\x64\x1f\x8d\x79\x9c\x8b\xa3\xad\xfd\xe2\x4a\xfa\x82\x08\xcd\x8b\x6a\xda\x6a\xd9\xe6\xfa\x34\xf7\x26\x3c\x17\x12\xed\xd3\xd5\xfe\x2d\xfb\xe3\xb1\x99\xd0\x81\x0c\xd6\xe3\x16\xc2\x1c\x0e\x58\xdf\x6d\x29\xa9\xe8\x69\xa6\xa8\xe0\x6f\x54\xd6\xd9\xc2\x00\x74\x5b\x39\x73\x51\xd2\xb8\xac\xcf\x85\xd5\x29\x38\xad\x38\x35\xa4\x7c\xf3\xc0\x55\x52\xcd\x03\xd6\x5e\x5e\x9e\xb6\x52\xe0\x79\x9a\x92\xc5\xe6\x69\x27\xc5\xa0\xa7\x9d\x92\x80\xbe\xa9\x42\xd9\xe7\x69\x84\x22\xcf\xd3\x44\x8b\x3b\x4f\x23\x2d\xe7\x3c\xed\xb4\x80\xf3\xb4\x43\xc9\xe6\x69\xa4\xa5\x9a\xa7\x91\x11\x67\x03\x73\x77\x5f\x57\x05\x34\x26\x0b\x73\xf0\x51\x87\x66\x3b\xff\xd8\x17\x4d\xb9\x42\x16\x64\xa5\x7f\x1f\x2a\x6f\x05\xbb\xcb\x6a\x45\xd1\x52\x0d\x2c\x33\x0a\xa8\x91\xb7\x6f\xbb\xdc\xe8\xea\x95\x25\x76\x5f\x17\x21\x8f\xf2\xb3\x99\xe7\xf1\xce\x5d\xf6\xc7\xd3\x9f\x5e\x3d\x3e\xfc\x0f\xf6\x8f\xc7\xaf\xd9\xb3\x17\xff\xfe\xf4\xf0\xcd\xb3\x97\x2f\xd8\xdd\x1d\x17\x5a\x93\x7d\x82\xf4\x46\x29\xe7\xbf\x4c\x93\xd3\xb0\xec\xd5\x7e\xef\x91\xf6\x53\x7e\x82\x59\x2d\x44\x13\x71\xac\x8b\xd0\x26\x23\x91\x3a\x31\x19\x93\x52\xce\x9f\xea\x31\x4b\xe7\x13\x4d\x84\x3e\x6b\xe0\x02\x00\xd7\x13\xf5\x59\x50\x55\xfe\xdd\x8e\x93\x31\x57\x16\x0c\xf9\xad\x12\x01\x1c\x8f\xdd\xff\x73\xf8\x26\x38\x9e\x20\xb3\xb5\xa5\xb0\x99\xc9\x62\x1b\x19\xf9\x55\xe0\x22\xa7\x8e\xa2\x82\x9f\x6c\x4c\x20\xe4\x44\x32\x5f\x4c\xc3\x94\x1d\x26\xb3\x59\x12\xff\xfb\x11\xe3\x1f\x73\x1e\x83\xd7\xf2\x89\xcd\x01\x06\x45\xfc\x6e\x88\x44\x50\xde\xda\x22\xbf\x0c\xef\xf4\xad\xa1\x54\xd2\x63\x9e\x26\x23\x9e\x65\x27\x18\xbd\x50\xae\x57\x8b\x3a\xaf\xb0\x06\xeb\x3b\x88\xc8\xbe\x91\x1f\xda\x12\x8e\xb3\x5d\x86\x23\x68\x7a\x16\x66\x39\x4f\xb5\x34\x98\xf0\xe9\x9c\xa7\xe4\xa2\x32\x19\x73\x71\x22\xf1\x24\xd3\xc9\xd3\xa5\xe3\x46\x4a\x30\x92\x18\xc8\x9f\xed\xd3\x28\x86\x7c\x3d\xfe\xcf\x41\x63\x91\x47\x53\xe9\x4d\xc6\x46\x90\x51\x2d\x10\x8c\x7d\xa5\x32\xe5\x14\x56\xa0\xc2\x6b\xbf\x72\xad\x5c\xa1\xfd\xb2\x6a\xb9\x05\xdd\xef\xee\x37\xd5\x52\x6a\x36\x0b\xeb\x78\x73\xdf\xa4\x28\x7b\xa5\x9f\xf7\x97\x5c\xe4\x3c\x52\xc7\x18\xbc\x8f\xac\xf2\x61\x7a\x74\xff\x2f\x7e\x45\x52\xbd\x57\x5d\x80\xe3\x0c\x7a\xc9\x8c\x13\x9e\xc5\x8d\x5c\xbd\x0b\x9d\x87\xa9\x7a\x5a\x9c\xb1\x30\x63\x63\x1e\x67\xfe\xa8\x44\x9f\xdf\x59\xca\xb3\x41\x15\xdc\xa3\x64\x22\x30\x3d\xf9\xda\xad\xc3\x5e\x35\x66\xca\xe9\x5d\x75\xc1\x91\x18\x6f\xb8\x5d\x63\xbe\x7d\xc9\x4d\xad\xfa\x5e\xbf\x6a\xe3\xdb\x02\xfb\x9f\x00\x72\xdb\x75\xe9\xbc\x39\xbb\xae\xa2\x8a\x67\x77\xac\xe3\xd8\x65\x47\x21\xbb\x41\x46\x2f\x0d\x7a\x35\x8d\x2e\xf8\x74\xc9\x42\x66\xe2\x71\x48\x5f\xd5\x2f\xaa\x16\x99\xc4\x88\xd5\x31\x45\x0d\x67\x39\xd1\xe9\xa4\x07\x2d\x22\xa3\xc2\xfe\xfa\xfc\x6d\xe7\x92\x4e\xca\x43\xd5\xef\x56\x2a\xbe\x1a\x1a\x42\x32\x3b\x42\x66\x30\xf8\x4a\x6e\x30\xb1\x43\xe7\x58\xe4\x8f\x1d\xfa\x8a\xcc\x87\xcb\x19\x9b\x3b\x2f\x25\xef\x79\x8a\x77\x85\xde\x3b\xe6\xfb\x32\xda\xcf\x67\xf7\xee\x91\x52\x5c\xa2\x13\x48\x5e\x44\xb7\xc8\x97\xda\xc3\xbf\xb8\xb3\xe9\xc6\x1e\xea\xd4\x71\x0a\xa9\xa6\x8e\x32\x56\x94\xee\x2f\x0f\xd7\x48\x86\xfc\x2a\x4d\x66\x51\x56\xbe\xad\x29\xff\x84\x8a\xa4\x43\x8f\x94\x1f\x81\xb4\xcc\x94\xd6\x53\xfe\x0b\xf5\x6d\x82\xb5\xf3\xb9\xae\x65\xe7\xab\xb4\x8e\xd5\x30\x7d\xcd\x91\x66\x4e\x1d\x49\xc9\x5a\xc6\xaf\x7a\x96\xad\x75\x63\x1a\xa9\x34\x8b\xe1\x3c\x6b\x89\xfe\xb3\x16\x38\x4d\x8a\xce\xc4\x37\x3d\x7e\x05\x57\x48\x05\x9d\x4d\x55\xa7\x97\x54\xe0\x4d\x9c\x2e\x7f\xbd\xe7\xe1\xbc\x69\xd1\xc3\x5f\x4d\x92\xc5\x84\xf2\xf2\x57\x3b\xe2\xea\xa9\x95\xa4\x8d\xbf\x9a\x24\x91\x2f\x74\x70\x21\x4a\xcf\x4d\x78\x61\x68\xc9\xaf\x62\x02\x51\xcd\xa2\x10\x41\x49\x3b\xcb\xe1\x8c\x19\x3e\xdf\x87\x14\x52\x3f\x87\xd3\xe9\x69\x38\xba\x00\xe1\x04\xf1\x47\xdf\x47\xfc\x43\xd6\xf2\xce\x18\x7c\x14\x0a\xc2\xb3\xa7\xac\xdb\x85\xcf\x92\xce\xf0\x55\x69\xfb\x3f\xb0\x87\xed\x5b\xe0\x03\xa0\xc5\xc2\xd6\x96\x44\x01\x42\xad\xa8\xcf\xf0\x83\x58\x44\x83\x6e\xb3\xd9\x14\xba\x03\xe1\x32\x7d\xcb\x0c\x19\xdb\x6c\x38\x82\xea\xa2\x3a\x2e\x1e\x53\x53\x09\x10\x53\x5b\x7e\x69\xcb\x0c\xbf\x01\x76\x63\x16\x8d\x69\x2b\x84\x8a\xdd\x8b\x60\x03\x51\x1b\x57\x8f\xa9\xa9\x44\x8b\x5d\x5b\x71\x83\x68\x61\x96\x94\x54\xa2\xf4\x34\xf8\x1f\x2e\x5b\xaa\x59\xc1\x6a\x60\x9e\xb3\xc8\x9d\x58\x27\x44\x21\x02\xe2\xa0\xb8\x2d\x17\xa3\x7f\x89\xff\x46\x94\x97\x01\xe0\x81\x61\x69\x7c\x65\x83\x59\x45\xcd\xb3\x2c\xdd\xc2\x68\x73\x2a\x06\x91\xaf\xcc\x09\x47\x64\x16\xcf\x9e\xda\xd8\xc9\x34\xef\xdb\x8d\xac\x15\xae\xeb\xe3\x3c\x3b\x55\x0b\x2b\x7d\x8f\xb8\x53\xca\xe9\x75\x9a\x58\x2b\x5e\x57\xcf\xe4\xb2\xb0\xaa\x16\x56\xbe\xae\x6e\x26\xd7\x0e\x0d\x72\x45\xd5\x70\x92\x8b\xa6\xf4\xa1\x82\x37\xe2\xc4\xa3\xcd\x1d\xfd\xce\x79\xae\x33\x3c\xfb\x76\xaa\x87\x6a\x1f\xad\x11\x9a\xa2\x4a\xad\xc9\x27\x61\x0e\x4f\xa0\xde\xf3\x34\x3a\x8b\x50\xee\x9f\x72\x37\x85\x2e\x51\x11\x34\x66\x81\xe8\xba\xc5\x1a\xaa\xac\xe1\xd5\x5d\x54\xa9\x87\x4a\x9b\xc7\xa4\xfc\xca\xa8\x64\x74\x9f\x02\x91\x64\x91\x9f\x46\xb2\xd0\x43\xa2\xcd\xbd\x16\xbe\x32\x12\xa1\xda\x57\x20\xcf\x11\xcf\xfd\xa4\xf1\x46\xac\x7e\x74\x23\x89\x44\xbe\x26\xb2\x18\x4d\xb7\x40\x1a\x59\xe4\x27\x8f\x2c\x2c\x92\xe8\xfb\xcd\x6e\xda\xef\x2c\x64\xb8\xae\x51\x7e\x47\x00\x97\x27\x15\xdc\x88\x94\x05\xc1\x18\xd1\xee\x0c\x87\x3c\x43\xb3\xe6\x9d\x96\x3c\x73\x4e\x17\x7c\x0f\xae\x8d\x6e\x5d\x35\xa5\xfe\x39\x94\x67\x4a\x6d\x39\x56\x31\x65\xfb\x7d\x76\x47\x21\x79\x87\xd8\x72\x65\x2c\x4c\xf4\x08\x82\x73\x68\x9f\xdd\x41\x37\xfa\x3b\xec\xc0\x78\x3e\x05\xc9\xe9\xbb\x26\xfb\xa4\x83\xb6\xe9\xc7\x95\xfb\xec\x8a\x3c\x20\x70\xeb\x25\xa7\xef\x0a\x9d\x79\x90\x49\x4e\xdf\x59\x5b\xb2\xa8\x21\x2b\x63\x29\x24\xce\x28\xc4\xed\x3c\x30\xa8\xee\xd9\x28\xed\xdf\xba\xa5\x0c\xe2\x63\x7e\x16\xa2\xca\x30\x02\x3f\xe1\xc7\x71\x34\x0b\x73\xfe\x3c\x8c\xc3\x73\x08\xa0\x07\x74\xcb\x78\xfe\x3a\x3c\x7b\x13\xcd\x78\xb2\x28\x3d\x36\x7d\xdf\x6d\x7a\xeb\xf7\x44\x03\x08\x7d\x96\xcc\x5f\x63\xf5\x27\xd8\x6b\x60\x57\x14\xcd\x35\xa9\x4a\x5a\x78\x09\x28\x08\x64\x38\x80\x1d\xc0\xf7\x3d\xf6\x89\xc9\xd1\x41\xbe\x65\x76\xb5\xcf\xae\x68\x07\xb9\x8c\x27\x13\xa6\x29\x01\x09\xdf\xda\xca\xe1\x17\xca\x0e\x58\x98\x0a\x45\x08\x8b\xce\xd2\x64\x06\xdf\x6d\x70\x3e\xf2\x91\x14\xef\xa3\x45\x9a\x1e\xe5\x4b\xb8\x37\xc0\xac\x9b\x68\xad\x8c\xc7\x53\x7e\x38\x09\xe3\x73\x4e\x14\x3b\xeb\x7b\xe0\x1a\xe7\x16\xd3\xa9\xd4\x09\xe4\x53\xfc\x49\xb2\x98\x8e\x8f\xf2\x64\x4e\x6e\xe1\x64\x11\xcf\x55\xa7\x34\x92\x0e\x7c\x0b\x86\x99\xf8\x87\x1a\xe8\x0c\x24\x37\xc4\x81\x32\xb4\xe9\xaa\x36\x99\x24\x28\xd3\x0a\x0c\x8d\xf8\xb5\x6d\x87\xa4\x76\x61\x6a\xa8\x2a\x1c\xc2\x72\x8a\xaf\x0b\xe0\xaf\x7d\x5a\x36\x34\x85\x6a\xee\xf0\x0b\xd1\x6e\x19\x50\x5a\xb7\xcf\x8e\x3b\x03\x5a\x98\xf2\x0c\x47\x6f\xba\xc8\xda\xd9\x34\x1a\xf1\xa0\x6b\xc7\x9f\x93\x0b\x06\xa1\x91\xdc\x36\x74\x1c\x41\xa7\xe5\xf2\xba\x5a\x50\xcd\x40\xd1\x19\x6e\x14\x20\xe3\x6a\x8b\x74\xdf\x6c\x01\x68\xd3\x67\x29\x55\xf4\x7c\xc9\xfa\x9b\x77\xed\x04\x5b\x2b\xcc\xad\x1a\x3b\xd2\x07\x47\xaf\x0f\x01\x0d\x76\x60\xfd\xda\x53\x52\xd5\x30\x41\x9f\xdc\x7d\x19\x72\xd1\x15\xa0\x26\x17\x4b\x2c\x6e\xd7\xd5\x9a\x05\xbc\x3c\x68\x69\xa3\xa0\xe9\x07\x8b\x03\x6a\x1b\xa6\xf6\xc0\x4f\xd2\x59\x27\x99\x13\xb9\x2c\x7e\x06\xe4\x60\x42\x57\x14\x89\x84\xae\x1c\x7d\xc2\x34\xb7\x1a\x87\x69\x1e\x58\x8b\x89\x79\x17\xa5\x33\x9f\x19\x1d\xa5\x04\xbd\x38\xcd\x46\x69\x74\xca\x29\x78\xf5\x2d\x18\x52\x42\x99\xae\x1c\x21\x62\xd5\xd2\xec\xa5\xee\xc3\xf4\x4e\x44\xf9\x78\x2d\x31\x64\xc1\x53\xc2\x48\xf2\xac\x66\x5e\x8b\xf8\x57\x05\xe5\x60\xb3\x9b\xe8\x1b\x57\x0e\x8a\x9b\xa1\xb5\xb2\xd4\xae\x96\x86\x67\xa5\x16\x5c\xb3\xf7\xa5\xe1\x59\xd5\x8e\x97\x86\x67\x5f\x76\x9f\xb3\x86\x12\x8c\xa4\xc9\x86\xe4\xfb\xd2\xbb\xba\xfb\x02\x82\xfd\xc8\xba\xa2\x5b\xfd\xfd\xb8\xeb\x64\x91\x84\xad\x91\x14\x42\x6a\x36\xb2\xe3\x89\x5e\xc1\x37\xdb\xec\x48\xb0\x2e\x7e\x9f\x8f\x31\xc7\xa3\xc1\x92\x7c\x0f\xe2\xe4\x03\xdd\x96\x34\xa4\x1f\x58\xc7\x96\x27\x12\x7e\x9c\x7c\x28\x08\x8b\x38\xf9\xc0\xb6\x4d\xa5\x1f\xd5\x38\x09\x00\x49\x0a\xe8\x6e\xbf\x08\x75\xbb\x2b\x81\xe2\x95\xc7\x27\x2a\x79\xc5\x24\x13\x79\x4b\x90\x2f\xc8\x9d\xd5\xf5\x8b\xeb\x63\xb3\x1b\xde\x5a\x9e\x1a\xf2\x06\xbe\xc9\x3e\xed\xec\xb0\x5f\x78\x0c\x3e\xef\x63\x76\xba\x64\x87\xc9\xd9\x19\xe7\x47\xa3\x34\x9a\xe7\xac\xdb\xee\xf6\xda\xbd\x5b\xee\x45\xbb\x3e\xc2\xc4\xc9\x11\x46\x0a\x6e\xb1\x49\x2a\x48\xdc\x62\xd3\x24\x1c\xbf\x81\xbf\x10\xe3\xdf\xf4\xef\x38\x19\x93\x5f\x8b\xb9\xf8\x57\x07\x89\x52\xe2\x7d\xce\xd3\xb3\x24\x9d\x85\xf1\x08\x13\xc2\xdd\xd1\xdc\x06\xca\xb0\x5b\x8c\x2f\x6f\xed\x82\x36\x61\xa0\xc2\x91\xc5\x19\x09\x11\x66\x0e\x04\xbd\x85\xa0\x0f\x00\x30\x81\x85\xa8\xf4\x2b\xf0\x21\x49\x8a\x0c\x82\xd2\xc3\x00\xe9\x74\x0d\xfc\x02\x9b\xe2\x41\x93\x6d\x5b\x24\x6d\xb2\x1d\xd6\xe5\x0f\x09\xd6\x4c\x4e\x0a\xeb\x3b\xbd\x63\xa1\x0d\xcf\xdf\x37\xa8\xa9\x3a\x80\xed\x44\xa8\x56\x08\x22\x70\x63\xb6\x4e\xd2\xe3\xce\x80\xdd\x65\x5d\xfe\x3d\xbb\x27\x7e\x75\x07\x16\x2a\x36\x37\xa8\xa3\x26\x19\x0e\x56\x43\xb6\x20\x18\x2f\xe6\xd8\x1d\x82\xc6\x4a\x74\xd8\xda\xd5\x44\x7f\xd8\xd6\xbc\x65\x4d\xdc\x93\x30\xbf\x2e\x6b\xa8\xa6\x40\x73\xc5\xe0\xd6\xe8\xa6\x06\x1b\x53\x99\x20\xb0\x76\x97\xd2\xd6\xcd\x03\xc8\xb0\xf7\x06\x49\xb0\xba\x73\x5f\x33\xbc\xbd\xbf\x75\xd5\xc4\x3b\xf7\x7c\x12\x65\x60\x39\xd8\xf9\x1b\xcb\xc0\x66\xfb\x3c\x9c\xcf\xa3\xf8\xfc\xf7\xd7\xbf\xf5\xc9\x22\xd8\x8e\x93\x0f\xed\x77\x59\x7b\x16\xce\x37\x76\x69\xd9\xf5\x38\xb2\x7c\xbf\x59\x2c\x95\xcf\xa6\x06\x64\x93\x70\x3a\x4d\x3e\x40\x64\x44\xd6\xb7\x52\x57\xc0\x0e\x1f\x65\xaf\xa6\x61\x14\x63\x7f\xbd\x52\x95\xa0\xd7\xf4\x36\xd8\xad\x50\x0e\x6c\xc8\xa4\x3d\xe0\x52\xd6\xd5\xfd\x87\x6e\xcd\xea\x3e\x10\x18\x69\x03\x67\xa9\x32\xe8\x18\x66\x86\xd6\xac\x86\x8e\xc0\xbe\x99\x5c\x0a\x26\x97\x2f\xa8\xf2\x11\x06\x16\x60\x1f\x43\xdc\xb9\x9f\xac\xc0\x15\x8f\x31\xde\x9b\xfe\x5c\xc8\xfc\x74\xe5\x6e\xcc\xba\x51\x9d\xc3\xa0\xa8\x0c\xf7\x64\xc4\x0d\x12\x9d\x34\x1e\xeb\x44\xae\x10\xce\xcd\x00\xff\x69\x1d\xe0\x3f\xf9\x81\xff\x64\xb2\xc4\x96\xc6\x93\xbc\xa5\x23\x44\x66\x8f\x8d\x43\xce\x85\xf4\x76\x7a\xdc\xdc\x27\x15\x7e\x2a\x56\xf8\xa9\xa9\x55\x16\x00\xa1\x94\x65\x81\x0d\x34\x71\x0c\x1e\xa5\x08\x9c\xfe\xea\xfa\xaa\x39\x0e\x52\x70\x7a\x97\x3d\x12\x3f\xab\x88\xf5\x59\x67\x9f\x45\xec\x07\x46\x11\xd8\x67\xd1\xbd\x7b\x4e\x08\xcc\xc7\x32\x1a\xd0\xe3\xe3\x88\xc6\x48\x14\xc3\x3c\x16\xc5\x03\xcd\x04\xf8\x93\x28\xc7\x49\x9c\x47\xb1\xc9\x01\x06\xff\xec\xec\xa8\x00\xba\x10\xcc\x0e\x3d\x51\x30\x7a\x42\x92\x4a\x3a\x19\x2b\x82\xd0\x7b\x95\xc4\x30\xba\xaf\xe9\xdb\x35\x17\x95\x37\xd0\xd8\x49\x0e\xc2\x9f\x94\xf0\xa6\x52\xa9\xb9\xc9\xc9\x0b\x60\xd4\x02\xd5\x31\x4a\x4e\x1f\xa6\x2d\x4a\xa2\x7a\x19\x07\xa8\xbe\x88\xe0\xe9\x16\xb0\x06\x39\x4a\x9b\x51\xa2\x7c\xee\x21\xdc\x76\x78\x35\x50\x4c\x65\x4d\x09\x7c\x19\x58\xf3\x81\x9f\x56\x07\x4c\xbd\xe5\x88\x1f\x8f\x34\x3b\xc4\x38\x92\x81\x8a\x24\xd8\x62\x31\xff\x98\x43\x10\x51\xfc\xf3\x28\xd7\xa9\xf5\x24\xac\xdb\x96\x20\xd4\xd9\x31\xe7\xa6\x0d\x34\x47\x12\xfa\xeb\x66\x02\x28\x85\xef\xe2\x26\x4e\x72\x02\xb5\x24\xe6\x71\xae\xce\xaf\xab\x10\x73\x86\x84\x89\x5a\xbd\xad\x44\x77\x3b\x77\x19\xcf\xa6\x51\x9c\x6f\x8f\xa3\x4c\x3e\xdc\xdf\x06\x87\x8f\xed\x94\x87\x59\x16\x9d\xc7\x96\x1b\xde\x7c\x91\xf2\xd7\x3c\x1e\xf3\xf4\x09\x1f\x25\xb0\x8d\x42\x24\x50\x40\x11\xf1\xd0\x3f\x49\xa2\x11\xef\x58\x58\xdf\x3f\x46\x81\x57\x89\xbe\x44\x7f\xfa\x6c\x2b\x1e\xf4\xf6\x0b\xaa\xe1\x17\xf3\xb9\xab\x13\xb1\xeb\x9c\xe7\xd4\x5f\xda\x71\x9f\xa3\xa5\x2f\xcf\x2a\x1d\xe9\x68\x55\xcf\x9d\xd9\xe6\xae\x74\xe0\x1b\x5c\xee\xb2\xd6\xbd\x7f\x9f\xb8\xac\x3d\x13\x6a\x48\xc6\x91\x69\xca\x2e\x75\x1e\x92\x06\xaf\x79\x56\x7a\x17\xa9\x21\x8f\xc2\x2c\x7f\xac\xc2\x27\xbc\x54\xa1\xaf\x7c\x6d\x1e\x75\x3b\x2b\x82\x55\xca\x34\xfa\xf2\xbd\x9c\xbe\xcb\x8c\xe2\xd1\x74\x31\xe6\x63\x16\xc5\x2c\x9c\x4e\xd9\x79\xf4\x9e\xcb\x56\x10\x1d\x61\x91\x45\xf1\x39\x3b\x3e\x39\x0a\x67\x1c\xc2\xd5\xfe\x37\x4f\x93\x93\x41\x20\xf3\xf1\xd4\xce\xc5\x93\x85\x33\x0e\x7d\xff\xc9\xd3\xa4\x29\x20\x8b\x4d\x18\x22\x87\x46\xf9\xd2\x0e\x9c\x0f\xae\xdc\xe9\x98\xa7\xe0\xd9\x44\x6e\x60\x75\x60\x03\x12\x02\x5a\x80\xd2\x91\xce\xc1\xe8\x92\x4f\x38\x3b\x8b\xd2\x2c\x5f\x33\x28\x56\xa7\xdd\x75\x5f\x6b\x03\xf1\xa9\x53\x58\xbb\xdd\xb6\xf2\xac\x66\x24\xd1\xaa\x0c\xfb\x20\xb6\xf5\x1a\xa9\x19\xc4\xe1\xd2\x64\x83\xd0\xec\xa3\xf3\xe6\xf9\x9f\x7f\x47\x84\xcf\x82\xe3\x5e\x8b\x75\x07\x2d\x26\xfe\xdd\xb5\x62\x5f\x1d\xf7\x06\xda\xe5\x2c\xb2\x59\x53\x31\x9f\x59\x15\x32\xf0\x96\x36\x46\xcd\xc2\xf9\x1c\x82\x3b\xab\x15\x20\x6b\xb4\x7c\xfc\x48\x43\xaf\x05\xd8\x52\x29\x13\x5b\x5b\x12\x94\x13\xa6\xab\x33\xc0\x48\x23\x07\x85\x95\x23\x01\x60\xf1\x1e\xc6\xe5\xf2\x2e\x7e\x3a\x26\xcf\xe2\xdf\xdc\x67\x47\xe5\x38\x2e\x75\x2e\x55\x4b\x14\xc6\xf4\x0c\x17\x51\xe9\xab\x8e\xef\xbf\xf3\xd5\xfe\x23\x2a\x7d\xd0\xfe\xa8\xd3\xa3\x2d\xea\x4a\xa1\xdf\xe3\x30\x2d\x8b\xbe\xd5\xeb\xf6\xb4\x54\xc1\x34\xc7\xa5\x63\x7b\xf0\x85\x5c\xa8\x9f\x47\x82\x21\x9f\x87\xf9\xa4\x3d\x8b\xe2\x5a\x6f\x48\x24\x20\x86\xa1\xb4\xec\xf5\x70\xd2\x72\xc3\xbe\x28\x31\xe3\x89\xfc\xd2\x92\x22\x70\x34\xe2\xf3\xdc\x96\x94\xde\xc5\xbc\x22\xeb\xb2\x6c\x53\x21\x0b\x0a\x81\x5f\x8e\x15\x56\x28\x42\x34\x8e\x34\xf4\x8b\x4c\x9d\x5c\x06\x01\xa5\xa6\xd8\xf5\x11\x86\xf9\x5d\x0e\xa5\xb6\x4c\xca\x26\x10\xee\xdc\x9b\x42\xa6\xb0\x70\x95\x84\x50\xa3\x68\x11\x5c\x68\x80\x19\xbd\x4e\x08\xaa\x07\x9e\x65\xb1\x67\x7f\xf3\x67\x74\x16\xa2\xa4\x98\x66\xe1\x37\xbb\x4e\xb1\x82\x0a\x68\xa7\xeb\xb6\xf4\x2d\xc6\x68\x02\xc8\xe9\x2c\x83\x32\xdc\xbe\xaa\x30\x0b\x3f\x6a\xe8\xcf\xe2\xb3\x28\x8e\xf2\x65\x21\x54\xce\xf1\x80\x06\xc9\x51\xfd\xd9\x29\x15\x64\x42\x6a\x35\x0c\x55\x89\x64\x55\xd0\x78\x6e\x6d\x39\x91\x7a\xb4\x54\x28\x48\xe8\x96\x11\x02\x81\x6e\x63\x45\xc4\xa7\x03\xd0\x6b\x30\xa0\xa9\xb0\x5b\xa6\x8e\x6c\x89\x54\x31\x38\xb2\x3e\xbb\x4d\x66\x6f\x6b\x8b\xe9\xce\xc0\x0a\xa1\x2e\xbc\xfa\xac\xdb\xeb\xe0\x9d\x97\x01\x2f\x3f\xeb\xb8\xf6\x07\x4c\x7a\xf6\x82\xb4\xb5\x46\x8d\xd9\xb4\x65\x3d\x2b\xeb\x2d\x8e\xc6\xa1\x61\x67\xa0\x2f\xc6\x8a\x71\x8c\x32\xce\x85\xa8\x91\x43\x91\x55\x93\x45\xce\xd3\xbd\xf2\xcc\xdf\x02\x09\x2b\xe0\x1a\xfb\x81\x10\x87\xcc\xa6\x7c\x17\xc3\xac\xa4\xe0\xfa\x54\x28\x68\xb5\xc8\x31\x5b\x82\xa2\xd3\x81\x89\x8c\x24\x1d\x8f\xf7\x54\x6e\x24\x09\x15\x21\x06\x84\xd0\x97\x97\xf2\xb3\x38\x14\x76\x9a\xca\xc3\x18\x2f\x0a\xcd\x51\x57\x0c\x95\x5c\x2e\x1f\x68\x71\x0f\x25\x2d\x8d\x8e\x9d\x59\x40\xad\x4c\x1d\xb0\x58\x55\xb3\x16\xb2\x6e\x42\x8e\xbd\xbe\x05\xa5\x0e\xbf\x92\xb0\xdb\xdb\xaa\x12\x3d\x2d\xc3\xc5\xa6\xdc\x63\x5d\x1e\x33\xf7\xe0\x32\xf9\x82\x28\x27\x08\x3b\x23\x83\x3f\xfc\x43\x73\x86\xe7\x2e\xb8\x92\x81\xda\x10\xec\xeb\x7a\x65\xce\x41\xfe\x21\x37\xf6\xb7\xec\x7f\xc1\x0b\x88\xf3\x98\xb6\x16\xbf\xf1\xc9\x9d\xc6\xb5\x98\xac\xd4\xbc\xcb\x43\xde\xb8\xd6\xcb\xbc\x67\xd5\x1a\xd2\xe6\xfe\xba\xd8\xc9\x98\x7f\x7c\x59\x76\x93\xff\xdd\xf7\x34\xaa\x7a\x79\xc2\x28\xb1\x8b\xe3\xf4\x60\xee\x24\xb9\x81\x7a\x42\xb8\x41\x2c\x74\x8c\x70\x29\x14\xe5\x30\x96\x4b\x3d\x4f\x58\xc6\xc3\x74\x34\x81\xb7\xd4\x35\xb6\x6b\x54\xde\x89\xee\x5e\xb6\x5d\xdf\xbd\x62\x79\x98\x9e\xcb\xf4\x6b\xfa\x15\x88\xea\x2d\x49\xd7\x78\x04\x88\x80\xe0\x15\xe0\x59\xb2\x88\xc7\x95\xef\xff\xac\xed\x4f\x89\x77\xe7\x21\xa0\xbd\x1b\xaa\xd8\xc9\xec\x80\x75\xd4\xfe\xa9\x23\x45\x1a\x3b\xce\x6d\x23\xdc\xc8\x14\x5a\x3d\xb4\x84\x78\xf9\x11\x2e\xed\x4b\x03\xfa\x29\xd4\x3c\xbc\x75\x33\xe1\xd9\x7e\x8e\xe2\x71\x55\xe8\xd9\xef\xbe\xa7\x4f\xc6\x9e\x65\x2f\xc2\x17\xa5\xca\x74\xa7\x69\xe2\x0a\x8d\xf2\x6a\xae\x7d\xd4\xe9\xd6\xcc\x05\x20\xf8\x16\x20\x99\xa8\x1b\x27\x82\xff\x00\xfe\x09\x3b\x15\x73\x9c\xd5\x08\x25\x48\x55\xc8\x5a\x1c\xe9\x79\x96\xe4\x32\xa4\x13\xa5\x50\xa3\x85\xaa\x66\xc9\xa2\x21\x7c\xac\x1a\x52\xed\x10\x9b\xc9\x88\xb6\xb3\x30\x1f\x4d\x94\x7a\xa8\x38\x79\xbb\xeb\x8d\xed\xe1\x65\x31\x8d\x92\x65\xcd\x33\x4f\x4c\xe1\x2f\x79\x4e\xb4\xe6\xad\x14\x8e\x3c\x35\x5a\xcc\x43\x15\x23\xe0\x11\xda\xa0\x4a\x7a\x42\x57\x1e\xe6\x5e\x3f\x8e\x5c\x15\x03\x9d\x29\x3c\x65\x86\x08\xfc\xf2\x5b\x98\xe5\xf2\xab\x64\x2c\x10\x7c\xd5\xa1\x2c\x6f\x8e\xc3\xcc\x01\x63\x9e\xf2\x71\x34\x0a\xf3\xfa\xc1\x29\xaf\xc9\x77\x6e\x40\xe3\x63\x51\xf4\x3a\x3a\x9f\xe4\x03\x1d\xd2\x58\xf6\x14\x9f\x63\xc0\x8c\x54\x94\x0a\x60\x53\x7e\xe6\x1e\x6d\x6e\x92\x7b\x0b\xac\xa4\x89\x42\x58\x09\xff\x04\x84\xcb\xc4\xb3\x73\x0e\x51\x3a\xaa\xa1\xd0\x3d\x16\x68\x20\xec\x80\x75\xd9\x1e\xdb\xee\x5a\x01\x37\xad\x72\x99\xa8\x8d\xed\x31\x57\x6f\xb5\x02\x05\x68\x6c\x03\x4b\x3b\xc5\xe6\x2d\xa9\x64\x17\x2e\x15\xa0\xd4\xab\x77\x94\x6d\x0a\x16\xa9\x0a\xeb\xe6\x51\x67\xdd\xec\xa9\xab\x62\x1e\xbd\x08\x5f\xf8\xa3\xbc\xaa\x50\xac\x18\xdf\xe2\x4b\x3e\xed\x87\xc4\xed\x35\x22\x1d\xbd\x08\x5f\x78\x42\x1c\x19\xdd\x5e\x1e\x04\xca\x23\x13\xbd\x08\x5f\x78\x28\x5c\xc7\x11\x94\x52\xb8\x5a\x21\x53\x1b\x1b\x84\xea\x90\x8e\x2c\x99\x8a\xe1\xac\xcc\xb6\x18\x95\x5f\x5b\x6e\x4d\x6e\xc9\x16\x8b\xda\xbc\xcd\x4e\xfa\xfd\x7e\xe5\x1b\xdb\xff\x9b\xb7\xbe\x7a\x9b\x56\x21\xf8\xae\xc1\x77\x9b\x75\xfd\x76\x0f\x1a\xff\xbb\xe4\xec\x4a\x45\x00\x5d\xf8\x66\x6b\xbd\x81\x35\x6f\x8d\xd0\xc3\x91\x75\x5c\x2f\x0b\x31\x57\x49\x04\x0c\x69\xe5\xb3\xf4\xcd\x13\xc6\x3f\x8e\xf8\x3c\x47\xf3\x5d\x44\x2c\x78\xe4\xfc\xf6\x2f\x38\x01\x14\xd3\xbb\x9a\x93\xfb\xda\xa6\xb9\xcf\x73\x8a\xf8\x23\xca\x27\x0e\x1f\xfa\x8d\x74\xae\xf5\x64\x8d\x73\x46\x3d\x8e\x34\xdd\xaa\xe0\xf3\x94\x47\x8b\xdb\x11\x79\x37\x50\x3b\x8d\x7c\x61\xe8\x1e\x06\xbd\x81\x04\x64\xf3\xf9\xb4\xcc\xe2\xfe\xa8\x73\xff\x4b\x19\xd2\xc3\x8f\xda\x90\x1e\x7e\xac\x9b\xa4\xf9\x35\xcf\x72\x25\xe1\xf3\x34\x8c\x33\x94\xf1\x02\x85\x94\x17\x6e\xcf\x3c\x4b\xc9\x30\xfb\x99\x2f\xd3\x17\xd2\x26\x44\x60\xd0\x84\xe7\x3c\x65\x79\xe2\x95\xd3\xc7\xf0\xf6\xa3\x2f\x00\x48\x6e\xda\xee\xe2\xf2\x84\x02\x36\x4f\xb2\x48\x69\x00\x1a\x45\x0d\xb5\x64\x11\xea\x61\x01\x20\x33\x2a\x53\xe0\xac\x3c\xd3\xd4\xb5\x8b\xab\x91\x39\x2b\x2c\x79\xcf\x53\x7d\x9d\xd6\x42\x5c\x5b\x06\x3c\xb2\x32\x8e\xa0\x6f\x66\x2b\x90\x5f\x9c\x07\x00\x01\x19\xbd\x10\xff\x4d\xb6\xa7\x20\x76\xe8\x45\x5b\xc1\xd3\x55\x45\x28\xa6\x2f\x0f\x8c\x05\xb2\xb8\xa2\xc9\x9a\x36\x38\x09\x00\xa6\x73\xdd\xaf\x69\xa3\x2c\xae\x68\x1e\x9f\x2a\x23\xf1\x2d\x62\xea\x2b\x5b\xf5\x8c\xd9\xbb\x10\x60\x8b\x53\xce\xee\x31\x9a\xb8\x16\xed\x60\x06\x65\x92\xce\x56\x2c\x85\xc7\x38\x4a\xf5\x64\x0d\xdb\x77\xa5\x8d\xac\x80\x04\x54\xb0\x6c\x95\x08\xc1\xc1\xa3\xd8\xbf\xa9\x09\x20\x30\x6c\xaa\x9c\x53\x94\xa1\xb2\x4b\x95\x75\x4a\xf0\xba\xe4\x01\x74\x41\xd1\x10\x9a\x15\x51\x07\x14\xf7\x78\x64\x53\x1d\xaf\x0d\x5b\x9d\x93\xb1\xfe\xc2\xa9\xbc\x8d\x7f\x0f\x1b\xd5\x89\x62\xe9\xbf\x01\x8e\x27\x88\x9f\x7b\x98\xcb\xd8\x89\xf8\x72\x22\x20\x69\x41\x74\x22\x6a\x9e\x30\x15\xdd\x4f\xc8\x0d\xf1\xe5\x71\x7a\x8e\xc7\x55\x8c\xa0\xa6\x32\x13\x89\x62\x41\xcd\x4a\x85\x6f\x85\xc8\x40\x64\x0a\xfb\x2f\x76\x0a\xb5\x3d\x38\x01\xe2\x6d\xaf\x5a\x79\xae\xae\xe4\x14\x92\x24\x31\x03\x34\x83\xc1\x3a\x32\xe0\xae\xbd\xf8\xe5\xc5\x8e\xd5\x13\xdd\x62\x9d\x99\x7f\x9c\x9e\xb7\xa0\x67\xb9\xf4\x65\x60\x0e\xb2\xb8\x14\x3f\x42\x5c\x8b\xce\x1e\x5d\xd4\xc6\xa9\xfc\x71\x7a\xae\xef\x5f\x32\xce\xba\xe5\xd5\xb0\xb7\xe3\xce\x80\xd6\xef\xd5\xa8\x2f\xff\xe8\x5a\x0d\x77\xd7\x69\x28\xff\xe8\x0d\xdc\xcc\x0e\xd0\x16\x29\x63\xd3\xa4\x64\xaf\x16\x35\x3d\x6b\x60\x73\x27\x1e\xb1\xcf\x1d\xf1\xfc\x4d\xa2\x43\xac\xf8\x77\x6a\xe5\x9a\x03\xf6\x94\x97\xa5\x0f\xb3\x1f\x75\xbe\x27\xc6\xc1\xa3\x42\x78\x21\xb5\x41\x1b\x6e\x11\x1c\x27\x89\x72\x82\x71\x82\x36\x59\x1f\xb3\x64\x1c\x9d\x95\x65\xef\x44\xf0\x72\x95\x38\xa1\xae\x56\x6e\x73\x94\xb7\xe5\x73\x67\x42\x34\x45\x96\xc0\xa1\xa7\xd7\x39\x83\x34\xf5\xcc\xe9\xe6\xbe\x19\xe0\x4c\x1e\xc6\xe5\x73\xa4\xbc\x2d\xec\xe7\x0b\xa5\xd5\x75\xaa\x33\x88\x30\x5e\x51\xb1\xa6\x5d\x98\x8c\xdf\x6f\xa2\x98\x24\x39\x9b\x26\xc9\x1c\xc9\x1a\xc5\xe7\x7f\x09\x8e\x28\x2e\xa5\xdb\x0e\x81\x0f\x0c\x09\x49\xa6\x47\xa5\x18\x99\xa0\x44\x2a\xea\x90\xfd\xba\x04\xeb\x35\x14\x9e\x8d\x96\x14\x93\x8d\x51\x12\x9f\x45\xe7\x0b\xc8\xb3\xd4\xc0\x37\x26\x38\x61\x0d\x93\x7f\xa9\xb1\x87\x67\x01\x59\x00\xa7\x8a\xc6\x9e\x66\x95\x40\x76\x2f\x8b\x3f\xa4\x51\x4e\xa0\x55\x25\x71\x74\x46\xed\x61\xe8\x75\xf3\x17\x69\xe7\x3c\x32\x8f\xe2\x2c\xab\xb3\x8c\x38\xa1\xc9\x56\xb9\xad\xf5\xda\xf7\x4b\x93\x8c\x54\x1a\x4e\x74\x5c\xdf\x64\xe6\xd5\x72\x6b\xa9\xc5\x7a\x31\xda\x2d\x8b\x29\x21\x55\xc0\x59\x27\x27\xa4\x9e\xa1\x4f\xac\x11\x36\xf6\x58\x97\x5d\x35\xbd\xe9\x21\x65\x7b\xcb\xcb\xcd\xb4\x69\x31\xf3\xb7\x2f\x5f\xa4\x6c\xad\x3c\xd1\xd4\x4f\x3b\x63\x24\xf2\x02\xdd\xdc\x35\x76\x45\x7b\x5d\x41\x07\xa7\x76\xbc\x0a\x95\x4f\x81\xf4\x70\xd2\x17\x89\x10\xa4\xe2\x07\xba\xb2\xb1\x3c\xfe\x33\x84\xa3\x16\xb2\x87\x46\xb4\x79\x29\x83\xcd\x36\x6c\x40\x0d\xa9\x4b\x88\xfa\xc1\xa7\xab\x16\x6b\x88\x75\x7c\x65\x2b\xcb\xa2\x70\x8d\x60\xd0\x76\x0f\x1e\xba\xad\x73\x27\xe3\x06\x44\x14\xb2\x58\xb5\xc9\xd8\xe9\x92\xa4\xf2\x12\xba\x0f\x5e\x43\x47\x31\x0b\x59\x36\x0f\xd1\x05\x2d\x9a\x4e\xa3\x0c\x1f\x5a\xea\x73\xf8\xaf\x2f\xdf\x0c\x0f\x5f\xfe\xfe\xe2\x0d\xeb\xb3\x47\x9d\x0e\xca\x19\xf1\xf1\xe8\xd5\xe3\x17\xac\xcf\xba\x0f\xbf\x8c\x25\xe0\x45\xf2\x81\xbc\x9a\xf4\x78\x04\xdb\x42\xa7\x31\x9d\xe2\x26\xc4\xc4\x1e\x25\x74\x7a\x9d\xb6\x4c\x4a\xf2\x13\x16\xc5\x59\xce\x43\xc8\x43\x6e\xb4\x9a\x0f\x13\x1e\xb3\x28\x6f\x64\x40\x25\x3e\x66\x27\x9a\x02\x27\x90\x51\x2d\x49\xb9\xcc\x85\x16\xc5\x58\x28\x28\x01\xe7\x0b\x8b\x80\xd7\xdf\xf9\xc4\x69\x3e\x8d\x0a\xae\xb6\xe5\xa2\x0a\x06\x0a\x3e\xff\x25\x67\x79\xad\xe5\x9c\x59\xc9\xc0\x47\xc9\x02\x94\x8d\x8e\xb6\x87\x85\x59\x7e\x88\xc3\xee\xcb\x57\xfa\x55\x07\xf3\x2c\x0f\x67\x73\x7d\xd2\x7e\x91\x7c\x08\xc8\x99\x3a\xe5\xb3\x30\x8a\x71\x3f\xd5\xfc\xb2\xcd\x02\x6c\xb4\x4d\xfa\x52\x27\x6d\xab\x77\xa8\x66\xdc\x7f\x0c\xb4\x1f\xe9\xfb\x7e\x51\x74\xef\x1e\x8e\xe3\xc7\xbe\x61\x56\xcf\xe3\x15\x13\x83\xa0\x33\xf0\xbe\x61\x31\xaf\x9a\x24\x55\xe8\xb1\xb9\xa8\xfe\x9b\x88\x87\x06\x74\xd5\x89\x58\xcd\x41\x71\x99\x77\x37\x4f\x38\x25\x5f\x44\xd5\xf0\xa6\xa7\x3e\x00\x87\x61\x96\xeb\x6d\x19\x0c\x5b\x31\xcd\x81\x2c\xa8\x0b\x2b\x21\x4e\x72\xe3\x47\x0a\xa6\xeb\xeb\x86\x97\xae\x70\x22\xbf\x54\x61\xcf\x29\x77\x8f\x42\x65\xd8\xda\x76\xfa\xa5\x7b\x59\xd1\x79\xdb\x9b\x69\xa3\xa4\x8e\x71\x37\x2b\x4b\x97\xec\xe9\xc0\x33\x8b\x9b\xc5\x2b\x71\x66\xb1\xcc\x2b\xba\x73\x9d\x7c\x60\x6e\xda\xb7\x88\xb8\x19\x9b\x2e\x8b\x17\x10\xd3\x4c\xde\x1a\xd2\x80\xe3\x02\x18\xe6\xc9\x73\x98\x60\x75\xd2\xb8\x8e\xab\xce\xfd\x16\xc6\xe7\x9f\x35\x26\x79\x5c\x64\x9e\x96\x00\x54\xb8\x5a\xf0\x3c\x48\x28\xf0\xcb\x71\xb7\xc5\x0a\x0f\x12\xa4\x6a\x55\xd6\x66\x9c\x8c\x40\x34\xb4\x4f\x93\xf1\xb2\x3d\x9a\x44\xd3\x71\xca\xe3\x35\x00\x34\xc2\xd3\x51\xc3\x97\xfd\xbb\xac\xc1\xb0\x1d\x27\xc9\x7c\x45\xbe\xf0\xd2\xc5\xb0\x3a\x87\x21\x69\xaa\xdd\xf8\xfc\xe1\xd2\x57\x2f\x99\xcd\x42\x98\x7c\xa6\xf8\x7f\x67\x90\x62\xbf\xec\xa5\xfb\xa3\xee\xae\x53\xb3\xea\xa5\xbb\x84\xa5\x5b\x40\x6a\x16\x88\xa2\x21\x91\x95\x2f\xf3\x2e\x2f\xc9\x63\x74\xbc\x08\x6b\xb2\x4f\xf6\x73\xde\x2e\x3e\xe7\x75\x03\xf0\xa8\x27\xbd\xb8\x23\xab\xc0\xe1\x66\xb7\x8b\x06\xfb\x85\xf4\x0b\x58\x4d\x34\x12\x1b\xa8\x9b\x6d\xa0\xed\xcb\xc1\x80\x4d\x54\x32\xe5\x4f\xf2\xea\xf0\xf8\x82\x2f\x07\x62\x73\x83\x52\xf8\xb5\xcf\xae\xe0\xff\xd4\x0d\x17\xd4\xc3\xc7\xed\x18\x9f\x6d\x1a\x8d\xf8\xf8\x4d\xa2\x12\xaa\x5b\xd1\xa6\x48\xac\x1f\x51\xed\x99\x7c\xe0\x1f\x84\x69\xda\x62\x91\x1a\xe5\x30\x84\xe8\x6d\xc7\x83\x7d\xfc\x19\xab\x08\x5c\xf8\x73\xac\xa3\x69\xe1\x6f\x6e\xc5\x67\x40\xfd\xdf\x90\x64\x18\xe1\x9d\xda\xb1\x13\x54\x60\x10\x34\x5b\x6c\x98\xed\xb3\xdb\x01\x74\x10\x0c\xe1\x88\x17\xb5\x63\xfe\x31\x0f\x9a\xcd\xf6\x38\x89\x79\x73\xdf\xf4\x2e\xb0\x13\x98\xa1\x87\xeb\x30\x6b\xcb\xd5\x01\x34\x8e\xc4\xd2\x81\x52\x75\x3f\xd1\xef\x8b\x01\x9d\xa6\x3c\xbc\x40\x92\xa9\x23\x03\x46\x1a\x84\x51\xe0\xa0\x60\x00\x3c\x4d\x45\xb5\xb3\x28\x0e\xa7\x53\x31\x00\x1c\x06\xc6\xd0\x8b\x01\x7a\x74\x7c\x07\x89\x7e\x67\xd0\xb4\x7e\x05\x4d\xbb\xa9\x68\x34\x1c\x37\x59\x3e\x49\x93\x0f\x6c\xc8\xf7\xe9\x84\x09\x24\xf7\xcd\x4f\x33\x3d\x66\x0e\x8a\xb1\xfd\xc2\x34\x6d\x92\xb8\x04\x12\x84\x7e\x1a\xec\xc6\x6b\x30\x19\x40\x9c\x86\xde\x59\xd7\xa0\x3e\x49\x8c\x85\xce\xfb\x66\x39\xe7\x90\x20\x32\xb8\xf3\x2c\x7e\x1f\x4e\xa3\x31\x0b\xf3\x5c\x68\x2f\x78\x06\xc2\xa8\x0c\x8b\x54\x26\xb0\xce\x65\x36\x6b\xf5\x66\xf7\x0e\x40\xbd\xda\x67\x57\x41\xf3\x73\x84\xee\x82\xaa\x0b\x4c\x40\xe4\x7f\xde\xb4\xfb\xc5\x23\x59\x1e\x26\x71\xb6\x98\x09\x32\x58\x31\x2d\xcb\x67\xd3\x8e\x26\x00\x77\xd9\x3d\x7d\x45\x65\x78\xb9\xa9\x04\x53\xea\x8a\x24\xd1\xe0\x38\x1a\xc8\x05\x16\x0d\x08\x5f\x89\x22\x32\xb1\x56\x60\x4d\x1a\x3d\xd3\x1e\x84\x23\xdb\x93\xd3\x77\x20\x91\x8c\x03\xb1\x0a\xb9\x20\x58\x4c\x12\xcf\xbf\x2d\x98\xa6\x9f\xd4\x3e\xa0\xdc\x5e\xb4\xed\x4d\x9a\xe4\x18\xb5\xd3\xa9\x6f\xca\xd2\x86\xbf\xd9\x15\xe5\xd2\xe4\xf4\x9d\x12\x8c\x68\x34\x31\xc3\xc6\x40\x1f\xf2\x8a\x7d\x3a\x9f\x84\x54\x02\xc2\x87\xe0\x94\x9f\x47\xb1\x40\x63\xdc\x62\x17\xd6\x8e\x0c\x25\xec\x1e\x0b\x78\x3c\x66\xdb\xf8\xb3\xc9\xee\xb2\x0b\x30\xf1\xc1\x59\x99\xf3\xf1\xa1\x72\xe3\x27\x90\xe9\xf7\x60\x98\xf2\x33\x73\x08\x04\x2b\x59\x9f\x89\x8f\x40\x78\x75\x82\x83\x04\x2b\xf0\x35\x4f\xe8\x0d\xad\xa8\x7e\xbb\xdf\x67\x90\x26\x05\xf4\x4b\x50\x9f\xc6\x3c\x83\x60\x60\x51\x12\xef\x89\xa3\x33\x1a\xdd\x44\x65\xd4\xe3\xc4\x11\xfc\x3d\x9f\x26\xa3\x28\x87\xc9\xe1\xe1\x68\xc2\xb2\x9c\xcf\xe7\x3c\x25\xaa\x9d\x60\xe3\x63\x08\x7a\xa8\x66\x6a\x20\x3e\x01\x62\x2c\x4f\x5a\x06\x86\xe0\x0c\x65\x22\x18\x85\xd3\x23\x04\xf5\x8f\x70\x4a\x23\x26\x39\x25\x01\x0f\xb3\x28\x3e\x07\x57\x47\xf1\xbb\x05\x18\x90\x17\xa2\xf8\xa6\x9e\xcf\x25\x18\x88\x98\x20\x56\x71\x7b\x16\xce\xe5\xb3\xd0\xc0\x48\x44\xc5\x79\xd4\x03\xc4\xa2\xb4\x28\xb3\xa3\x64\x0d\x11\x03\x21\xd0\xe1\x0f\x51\x05\xc9\x2e\x00\xb5\x61\x84\xe1\xb4\xad\x46\x69\x05\x2d\x95\x6d\x41\xfa\x58\xbb\x68\x30\x54\xe3\xea\x59\x0d\x62\xfe\xe1\x3f\x45\x65\xd9\xce\x09\x73\x1a\xf3\x0f\xff\xa0\xa5\xdd\x81\x1b\x08\x52\xa9\x2b\x60\xef\x7a\x1f\x4e\x5b\xe4\x54\x2d\x70\xde\x83\x1e\x0c\x4c\x85\x35\x7c\xff\x87\x3a\x63\xdb\x31\x3a\x8d\x31\x11\xce\xca\x7a\x2a\x4c\xc0\x14\x98\x12\xf6\x03\xeb\x3a\xf6\xc7\x35\x27\x63\xe5\x74\xd4\x1a\x26\x1d\x14\x2e\x4f\x3a\x3d\x2d\x8b\x61\x60\xcd\x93\x32\xe4\x2d\x4a\x72\x24\x9a\x81\x83\x13\x5f\x84\x81\xdf\xb1\xbd\x79\x86\xd3\x2c\x84\x7d\xb5\x89\xe9\x90\xd3\x0e\x99\x51\xb2\x10\x68\xdf\xb2\x47\xf0\xcf\x90\x6b\x7b\x47\xcb\x3e\xce\x16\x18\xeb\x41\x51\xdc\x17\x1e\xda\xcc\x86\x59\xb0\xaa\xa7\xf1\x02\xdd\xa9\x5b\x2c\x85\xb8\x0e\xd4\x2f\x2b\xe7\xa9\xcc\x3a\x64\x26\xf9\x9c\xe7\xf4\xa9\x8f\x28\x6f\x6a\xb0\x3a\xfe\x4e\x1e\xcd\xa2\xf8\x5c\x85\x8c\xd5\x90\xda\x29\x1f\x2f\x46\x9c\xb0\x47\xca\x33\x99\x40\xcc\x62\x2a\x6b\xee\xa1\x8e\xbb\xc7\x88\x02\xe0\x2d\x70\xdd\x86\xf9\x11\x18\xc0\x1f\x03\x7c\x84\x78\x25\x2d\xc1\x2a\x7c\x25\xd2\xf9\x8b\x20\xa5\x38\x15\x39\xcb\x60\x78\xcb\x65\xde\x8e\x91\xeb\x7b\x0a\x7d\xe4\x19\x7b\x0c\xea\xf9\xda\xd9\xb3\xb1\xf6\x52\x11\x5f\xe6\x29\x97\xc1\xe3\xde\x27\xd1\x18\x8d\x63\x70\x79\x26\x36\x21\x6f\xc9\xa2\x10\xbf\x13\xbf\x54\xc4\xaa\x36\x41\x23\x0f\x49\x20\x60\xdd\x9e\x7e\x77\xa1\xac\x2d\x1d\xcc\xda\x81\xe5\xa6\x17\x10\x9d\xbd\x66\x49\x0c\x6d\x8c\xe0\x8d\x61\x07\x9c\x30\x2f\x56\xb1\x8b\x24\x86\xe0\x91\xc7\x46\x12\xea\x93\x74\xd9\xb2\xf6\xea\x26\x79\xe7\x84\xf4\xd9\xd9\x51\x18\x4a\xde\x37\x08\x80\x91\x23\x9b\xa7\x51\x7c\x6e\x73\xa2\x27\x92\x2a\x2d\x70\x43\xa9\xde\x96\x73\x6d\x68\x65\x26\x9f\x44\x51\x55\x5b\xda\x98\x4f\xf3\xd0\x14\xb3\x6d\x55\x7d\x9f\x18\x8a\x85\x5c\xe9\x93\xaa\x3b\x52\x2e\xb4\xc7\xb9\xdc\x75\x9c\x55\x53\x22\xaf\x6c\x52\xa1\x84\xc4\x7e\x76\x76\x04\x7f\xb0\x45\x2c\xe3\xd9\x82\xc6\x11\x8e\xc7\xe8\x0a\x9a\x47\x42\xfb\x9f\xa7\xfc\x2c\xfa\x28\x67\x44\x08\xa1\xc0\x5a\x6a\x46\x68\x59\x9c\x66\x71\x44\x53\x59\xab\x1d\x9a\x18\xea\x79\xf9\x80\x46\x94\xc5\xa5\xe5\x09\xf9\xba\xf0\x07\x87\xdd\xd9\x61\x39\xeb\xff\x28\x58\xd5\x3f\xe7\xa3\xc5\x69\x34\xda\x3e\xe5\x7f\x46\x42\x97\x22\x72\xb1\x38\xf1\xf4\x7b\x61\xde\xf5\x5a\x36\xd8\xd2\xe5\xed\x46\xd0\x85\x7e\xc4\x48\x70\xd6\x49\xeb\x1d\x2d\xed\x0d\x0f\xd0\xd0\xde\xd7\x5d\xac\xb0\x73\x16\xed\xef\x9e\xb3\x8d\x68\xdd\x1e\x25\xf1\x28\xcc\x83\x63\xa9\x6a\xe5\xcd\x81\x7e\x34\xde\xa2\x3b\x87\x9a\xd2\x1b\x65\x21\x13\xa3\xbc\x49\xb8\x23\xa7\x8a\xcd\x1a\xcc\x60\x5f\x51\x80\xde\x2e\x8e\xf3\xd7\x26\xe8\x0d\x91\xb4\x6b\x48\x5a\x46\xd4\x55\x74\x32\xe3\x68\x16\x38\x5f\x6f\x21\x52\x58\x44\x99\x94\x09\xf0\x74\x8e\xca\xb6\x3d\x8b\xb3\xd5\xb2\x51\x56\x05\xf0\xa6\x0c\xb5\xd0\x46\x33\x78\xf1\x72\xcb\x04\x3c\xaf\x9a\x0f\xc5\x2a\x1a\x78\x32\xf7\xc1\xae\x0c\xa7\xae\xe0\xb7\x47\x61\x3c\xe2\xd3\x66\x00\x8c\x60\xc5\x12\x56\xa7\x2b\xcb\x60\x7a\x03\x7e\xdd\x62\x2e\x7f\x86\x1d\xa8\x34\x4c\xca\x77\xe4\xfd\x69\x65\xd5\x47\x5d\x2b\x54\x94\x7a\xbb\x57\x76\x77\xd1\xd3\x77\x17\xca\xf8\x57\x1e\x4b\x54\x5e\x5b\x48\x98\x19\x38\x94\xaa\x47\x05\xe8\x92\x39\x4a\xa6\x53\x1d\x1f\x05\x69\x2d\xdf\x4e\x9b\x80\x27\xd3\xa9\x6e\x23\xa0\x9d\xe8\x47\x63\x27\xda\x2b\x25\x4f\x17\xf9\x64\x09\xef\x1d\xe0\xda\xc1\x3c\x0d\x8c\x32\xfd\xa2\x41\x5e\x5c\xa7\x1c\xee\xb8\xb4\x71\x75\x8f\x29\x37\x7f\x70\xb4\xbd\x84\x75\x66\xf0\x6a\xaa\xbb\x91\xbb\x77\x5f\x24\x39\xdf\xbb\x7b\x97\xfd\x1e\xab\x9b\x97\x94\xcf\x92\xf7\x5c\x79\xad\xea\x5b\x73\x44\x2a\x34\x11\x4b\x36\x89\xf2\x74\xa8\x51\x29\x38\x91\xea\xeb\x36\x83\xae\x7c\xce\xa1\x7f\xe6\x89\x7a\x8e\x09\xd4\x2f\x8b\xd5\xa2\x09\xd6\x1f\xb6\xd5\xe5\xfa\xa0\xf6\xbb\xca\x55\x51\x5b\x50\x59\x52\xe9\xf6\xb1\x4d\xc6\x39\x13\x04\xc4\x50\x92\x5e\xa7\x9c\x45\xc6\x53\xa1\x71\x1c\xc3\x6d\x0f\xfb\xc4\x1a\xe2\x4b\x63\x8f\x35\x4e\xc3\x34\xe6\xcb\x46\x8b\x35\xc2\x73\xde\xd8\x63\xbb\x0f\xc5\x9f\xa3\x3c\x7a\xaf\xbc\xa6\x20\xd1\x82\xd3\xea\x2c\xe5\xe3\x46\x8b\x31\xd5\xea\x7e\x87\xb6\x02\x6b\x33\xd8\x23\xd8\x60\x5f\xdf\xcd\x20\xea\x01\xa0\xd2\x32\x37\xe8\x09\xb1\xe8\xdd\x4e\xda\x08\x64\x1f\x8f\x77\xea\xca\x86\x26\xb1\x3e\xc6\xce\x95\xf3\xcf\xce\x0e\xba\xbd\x0d\xdb\xf8\x5c\x2b\x3b\xf1\x3c\x9a\x6d\xfb\x30\xf8\x54\x35\xe4\xf2\xde\x25\xc1\x4a\xfb\x57\x87\x92\xda\x78\x1c\xab\xbe\x5b\x48\xb8\xc1\xda\x23\x9f\xaf\xdb\xa5\xea\xb1\xd6\x28\xc9\x3d\x99\x84\x62\x16\x05\x79\x25\x4b\x4c\x68\xe8\x43\xa4\xcc\xa7\x44\x00\xa8\x10\x40\x52\x8a\xee\x11\x91\xea\xbc\x7a\xb0\xfa\xa0\xd2\x34\x20\xcf\x72\x77\x9b\x25\x97\x6d\x67\x12\x64\x61\xc3\xd8\x3c\x44\xa2\xc0\xe5\x69\x38\x2a\x0b\xe8\xb5\x7b\xff\x41\xed\xa8\x02\x88\xa5\xdf\x75\xf4\x3a\x0f\xbf\x6f\x4c\x86\xad\xff\x1c\x7c\x7d\xb1\x55\x78\x7d\x5d\x87\xb3\x9c\x34\xea\x6a\x2e\xac\x66\x7a\x5a\xe9\x56\x64\x6d\x43\xde\x57\xd3\xa5\xb5\x9b\xde\x4c\xea\x85\x88\x2d\xf4\xd9\xce\xaa\x98\x2d\x3f\x97\xb1\xe7\xcd\xf8\xc1\xff\x9c\x94\x2b\x28\xca\xff\xfd\x02\xed\x4b\xfe\xbc\xd0\x8f\xea\xb3\x70\x92\xbe\xfc\x10\xdf\x08\x0b\x57\xa6\xf9\xaf\xc1\xb4\xba\xbb\xb5\x79\xd6\xf5\xb4\x39\xc1\x7e\xbd\x41\x02\x60\xbc\x3a\x03\xbf\x1d\xb0\xcb\xdc\x69\x08\xac\x65\xdc\x95\x9f\x93\xb4\x50\x1d\x8c\x55\x65\x6f\x24\x4c\x37\x1e\x06\xb9\x01\xa7\x7a\x70\x10\xfc\x69\x05\x9b\x7c\x57\x93\x03\x0c\xb2\xea\x81\x61\x64\x69\xa8\x8a\x94\x02\x8e\xdc\xa5\x22\x9e\x49\x4a\x61\x14\xcf\x13\x41\x8b\x9f\xc1\xd9\xd0\xf8\x25\x66\xec\x44\x11\x0b\x63\x05\xc1\xfd\x88\xda\xe7\xda\x44\x15\xe6\xc4\xab\x73\x16\x2e\x19\xff\x18\xe5\x66\xa6\x19\x0f\xd3\xe9\x52\x74\xc3\x3f\xce\xa7\xd1\x28\xca\xa7\x4b\xa2\x1c\x13\x8f\x97\xaf\x86\x2d\x0b\x10\x14\x7d\x0a\x8e\x91\xe2\x70\x2e\x04\x2c\xac\x65\x31\x1b\x84\x6f\x6b\xb3\xb7\x2d\x34\x2c\xee\x08\xbc\x5e\xba\xb2\xb2\x87\x39\xaf\xef\x20\x0f\xec\x65\xb4\x8c\x24\x2d\xc4\x7f\x3c\x4b\xd2\x67\xb1\x09\x9e\x82\x2c\x57\x35\x6f\x37\x15\x62\xa4\xdc\xcd\xd4\x42\xda\xf5\xc1\xb3\xe8\xe8\xc4\x0c\x71\x7d\x48\xfd\xe2\xe1\x67\xed\x9b\x5a\xf6\x5c\x9b\x31\x7d\x8f\xaf\x1c\x68\x24\x2c\x72\xcb\x02\x81\xbb\x65\x48\x7b\x01\xb2\x58\x43\xbf\x10\x85\xaa\xf4\x85\xb7\x7e\x68\x29\xdf\xe9\x6e\xdb\x97\x77\x17\x7c\xa9\x5a\x1d\xd3\x88\x25\x12\xa0\x0e\x58\xa2\xfd\x4b\xc1\xf3\x43\xe9\x71\x0a\x77\x79\x85\x00\x67\x45\xf5\x0d\xf3\xe1\xc1\xe2\xa4\x36\x1a\xf4\x0e\xb1\x9d\x55\xa9\x69\x21\x91\x8e\x55\xe5\x3e\xf9\x74\x5a\x3c\x1c\xbc\xb9\x63\x7e\x3d\x9f\x45\x9f\xbf\xf6\x89\xd2\x66\xc0\xaf\x5a\xff\x02\xa2\x9e\x58\x7c\xb6\xda\x8f\x5a\x48\x4b\xaf\xc8\xa0\x02\x0b\x22\x29\x28\x35\xe7\xb3\x84\xe7\xd9\x74\xed\x80\x6e\xa7\xc6\x52\x08\xbd\xe3\x2e\x23\xaa\x04\xba\x91\x34\x31\x18\x81\x56\x83\x9d\x7c\x17\xe6\x56\x50\x57\xb1\xde\x28\x9f\xb1\xe0\x36\xf5\xf3\x2b\xd1\x0e\x01\x84\x42\xd7\x8f\x8e\x7b\x59\xa0\xd7\x1e\x99\x09\x3b\x7e\x90\x1d\x41\xa8\xb0\xc4\xaa\xa5\x01\x41\xd4\x5e\xd0\xeb\x46\x18\x2a\x5b\xbb\x4e\x94\xa1\x0d\xd7\xaf\x4d\xfe\x95\x6b\x58\xb0\x87\x67\x11\x6f\x9e\x68\x1a\xa3\xef\x3c\x07\x07\xb4\x12\x0d\xa9\xa7\xde\xcb\x9f\xf3\x1c\x2a\x3e\x09\xf3\xb0\xb4\xb2\xf2\x52\x96\x26\x82\x23\x70\xd2\xc4\x4c\x06\x72\xc2\xfc\x67\xc9\xba\x6a\x18\x31\x7e\xa0\x16\x36\x4e\x78\x16\x37\x72\x36\x9a\x26\x31\x67\x27\xe8\x8f\x58\x4b\xcf\x91\x2e\x93\x44\xcf\xc1\xb4\x6d\xf8\x7c\x48\x45\x95\x4f\x70\x28\xf5\x9f\x64\xcc\xf9\xa8\x6c\xbd\x8b\x41\x3d\x47\xf4\x03\xed\x89\xa9\x43\x94\x1b\xd2\x52\x4a\xab\x8a\xfb\xd2\x49\x42\xd7\x33\xfe\x84\x98\x87\x51\x17\x1c\x77\x06\xc7\xbd\x81\x73\x01\x59\x32\x1f\x81\xd5\xaa\x33\x68\xd9\x60\xba\xde\x67\xd0\x64\x2b\x77\x7a\x91\x74\x14\x4b\x42\x52\xf7\xf2\x92\xf2\x98\x56\x00\x94\x53\xa9\xee\xad\xea\x01\x05\x21\x5b\x71\x11\xf4\x36\x7f\x43\x71\x94\x87\xa3\x8b\x52\x9b\x78\xd7\x8a\xc9\xa8\xd2\x58\xf8\x8f\x93\xca\xef\x5e\x3f\xc9\x82\x4c\x1a\x19\x67\xa7\x51\x3e\x0b\xb3\x0b\xb4\x39\xa1\x5f\x94\x95\x1f\x40\xaa\xa7\x87\x2f\x9f\xbf\x7a\xfc\xfa\xe9\xf0\xd5\xe3\xd7\x6f\x9e\x3d\xfe\x6d\xf8\xf3\x6f\x8f\x7f\x61\x7d\x15\x34\x49\x95\xfe\xfe\xe2\xe5\xeb\x27\x4f\x5f\x3f\x7d\xa2\xca\x7b\xb5\xa3\x3b\xe2\x34\x7c\x81\x53\xac\x27\xec\xd0\x06\xeb\xce\x0e\x82\x60\x96\x0a\x9a\xed\x65\xcb\x38\x9c\xf1\xac\xa5\xc3\x75\x09\x05\x1a\x69\xcc\xd9\xd9\x34\x3c\x2f\x81\x49\x63\x8f\x2f\xb2\x3c\x99\x45\x7f\xf2\x74\x50\x50\x27\x74\x99\x35\x6f\xf5\x9f\x26\xc8\x93\x08\xbc\x4d\x40\x2c\x6a\x84\x55\x5b\xb1\x66\x5a\x06\x2b\x4f\xb0\x23\x57\x50\x14\x42\x1f\xe1\x4e\x26\xbf\xc6\xc9\xa1\x86\x05\xe1\xb0\xf5\x2f\xed\x9e\xa5\x17\xb7\x2f\x83\xd6\x6d\xe2\xae\x70\x8b\x69\x41\xe0\x28\xeb\xfb\x26\x98\x52\x54\x0c\x21\x3e\x46\xe9\x67\x24\x50\xe4\x44\x10\x0f\x2c\x2c\xb7\xb6\xa0\x85\x90\x75\xc4\xd3\xea\x00\x3f\x76\x75\xa6\x21\x3e\xca\x8f\xc7\x28\xcf\x06\xa4\xde\x1e\xbb\x1d\xc8\xcf\xd2\x65\x54\x20\xa8\x2b\xac\x4e\x4a\xb4\x32\x40\x4c\xe5\x70\xcc\xa9\x42\x22\x61\x94\x9b\xe4\xf4\xdd\x3f\x64\xb0\x6c\x89\x3e\x75\xec\x61\x2c\x4b\x47\xaa\x5c\x0e\x75\x9f\x26\xb6\xf5\x53\xc8\xd2\x6e\x4c\x0f\x56\xb4\x9e\xad\x2d\x76\x9b\xb8\xd0\x0a\x7a\xac\x95\x0b\x8a\x9e\x98\x32\x29\x53\x21\x16\xba\xf8\x9b\x9e\x8c\x5c\xb6\x35\xcd\xb4\xd9\xd3\x54\xd1\xd8\xb6\xf4\xc8\xe5\x19\xca\x5d\x18\xd0\x67\x21\xfa\x34\x86\xdb\x56\x80\xe9\x80\x09\x37\xe8\xd4\x1d\x28\xe0\x03\xd3\x93\xe9\xdd\x2b\x9c\x2f\x4b\xa4\x32\x5d\x9b\x0a\x33\xab\xbf\x3d\x39\x56\xf2\xb1\x2e\xb5\xed\x1d\x59\xa7\xc4\x2a\x09\xad\x08\x42\xc4\xb3\x6f\xde\xc4\xab\xb5\xda\xea\xdd\xda\xc6\xd8\x5f\x54\x20\x92\xfa\xe2\xdd\xb1\x0b\x5d\x6b\xdf\xfa\x9f\x05\x4f\x97\xab\x0d\xfd\xb0\xa6\x71\x81\x3b\xbd\x12\x19\x6e\x69\x71\x54\x5d\xb2\x18\x5d\x25\x0e\xa4\x96\x0a\x2d\xa2\xad\x58\xfd\x34\x14\x9d\x6b\xa6\x30\xe2\x04\x9b\x1c\x63\x05\x22\x35\xde\x17\x45\xca\xbe\x72\xcc\xa5\x2d\x58\x9f\x1d\x1b\xc7\xfa\x96\x67\x92\xe5\x8d\xc0\x60\xbf\x7e\xf8\x76\x4a\x0a\x0f\x2b\x6e\xf6\x1a\xcc\x9c\x63\x56\x29\x67\xfa\x1c\x53\xca\xa7\x2a\x70\xca\x24\xcc\x9e\x95\x65\xbd\x7a\xd4\xd3\xe1\x55\xb2\xff\xe0\xe5\xc9\x69\x76\x75\xad\xb5\x97\xc9\xfa\xa7\x27\x6c\x97\x27\xe5\x08\x75\xf5\x7d\xdd\xd7\xaa\x9d\x16\xae\x95\xfd\x27\x3c\x29\x9a\x2b\x17\x39\x06\x47\xb9\x62\xf3\x30\x9f\xa0\x96\x28\xfe\x90\x71\xf6\xb4\x48\x41\xcb\xb2\x1b\x9b\x4b\xef\xaf\xd6\x5b\xd4\xcf\x72\x0a\xd4\x6e\xbd\x02\x3d\xb3\xbf\x35\x75\x2a\x56\xe0\x30\x28\x95\x4f\x30\x0b\x8b\x51\xb7\xa9\x79\xe0\x03\x16\x41\x88\xa4\xc3\x7a\xa7\x3c\x19\xf4\x44\x69\x1f\xe7\x3c\xd7\xca\x29\x00\xb4\x42\x62\x54\x68\x19\x56\x89\xc6\xe1\x96\xda\x88\x61\xf1\xd9\x90\x6f\xa9\x4d\xf3\x46\x37\xe9\x9a\x87\xce\xf2\x38\x1d\xbd\xcd\xdd\xb2\x66\x7c\x96\x44\x7f\xf2\x43\x95\xa1\xcc\x2f\x71\x0a\x07\x4b\xdc\x81\xec\xcd\x51\x05\xf6\xd0\x5f\x05\xe9\xcc\xf2\x4d\xf9\x6f\x3c\x1c\x47\xf1\xf9\x93\x44\x08\xc0\x9d\x7f\xbe\x6d\xef\xb4\xe4\x8c\x89\x21\xbe\x08\xc1\xd9\x73\xe7\xf8\x9f\xed\xe3\xb7\x83\xc1\xbd\xcb\xb7\xc7\xc1\xc1\x5e\xb0\x7d\xf0\x76\x7c\x2f\x38\xd8\x7b\xdb\x7e\x3b\xbe\xd7\x3c\x68\x5e\x06\xc7\x77\x1a\x83\x66\x20\xca\x0e\x6e\xbf\xed\x35\x8f\xff\xf9\xf6\xed\xe0\xf2\xed\xdb\x76\xf3\xee\x41\xf3\x6d\xaf\xf9\x76\x70\x19\x1c\xf4\xa1\xc5\xe5\xdb\xe3\xb7\x83\xa6\xf9\xf3\xf2\xef\xcd\xe6\xce\xb9\x77\x28\xa7\xe1\xe8\x22\x9b\x86\xd9\x04\xe3\x6b\x94\x8e\xe1\x69\x36\x0a\xe7\xfc\x70\x12\x8a\x63\xca\xce\xdb\xb7\xc1\xdb\xb7\xcd\x03\x05\x13\xec\xcc\x49\xfc\x9e\x8b\x39\x54\xc1\xc9\x20\xbe\x81\x0d\x70\x75\x20\x50\x25\x40\x48\xbc\x29\xf9\x27\xc8\x4d\xe8\x62\xb5\x9e\x50\xd2\xa9\x8c\x47\x06\xf0\xde\x24\xaf\x42\xd8\xeb\x2d\x46\x30\xcc\x44\xa3\x4c\x79\x1c\x03\x30\x44\x86\x99\xd8\x76\xce\x33\x1d\x1b\xca\x88\x04\x73\x9d\xdf\x68\xe8\xc5\x8e\xb5\xda\x29\x9f\x4f\xc3\x11\x0f\x0c\x17\x10\xd7\x02\x79\x54\xc5\x10\x32\x2d\xf6\x3f\x8b\x24\xe7\x76\xe8\x2b\x1b\x3c\x54\x90\xf9\x0d\x2c\xd8\x66\xde\x5a\xac\xf1\xf7\x6e\xa3\xc9\xf6\x58\x20\x23\xd3\x5c\x5e\x22\x13\xc8\x07\x09\x5e\x07\x03\x7f\x5c\x36\x42\x42\xcf\xea\xdc\xdc\x07\x46\x4e\x4a\xe9\xba\xb4\xb7\xd4\x50\x69\x87\x1f\xa3\xd9\x62\xa6\x1b\x63\x4a\xa0\x2c\xfa\x93\x6b\x3e\x7e\xfe\xf8\x3f\x87\xcf\x9f\x3e\x7f\xf9\xec\xbf\x9f\x0e\x8f\x9e\xfd\xf7\x53\xd6\x67\x0f\x3a\x9d\x7a\xa9\x65\x24\x58\xb5\x3d\x8e\xa6\x3c\x4c\x65\xc7\x58\x32\xd6\xd3\xd7\x00\xe7\x47\xec\x5f\xc6\xb7\x81\x58\x0f\x7c\x9c\xb1\x13\x17\x87\x4d\xa2\xf8\x4d\xc2\xf7\x9c\x45\x79\xc6\x92\x45\x3e\x5f\xe4\x1a\x93\xda\x1b\x66\x01\x75\x67\xd3\x2c\xae\x0e\xcf\x92\x90\x95\x64\xdc\x35\x3d\xe3\xe4\x9d\x0d\x9c\x3e\x05\x39\xda\x19\x4c\x6b\xbf\x5f\x98\x0a\xea\xa3\x2d\x2a\x02\x7d\x83\xa6\x27\x26\xcc\x05\x5f\x2a\x7e\xbd\x65\x27\x7f\x92\x2b\x02\x7e\xd6\xf4\x96\xb1\x06\xe8\xe1\xe5\xcd\x1d\x66\x9e\x87\xf3\xaa\x04\x90\xbd\x8e\xb2\xc1\x33\x78\x5e\xcd\x66\x3c\xcb\xc2\x73\xae\xc3\x7b\x19\x29\xfc\xf3\xef\x2f\x0e\x87\x4f\x5f\xbf\x7e\xf9\x7a\xf8\xe6\xe9\x7f\xbe\x61\x7d\xd6\x78\xfa\x71\xce\x47\xb9\x58\x03\x86\xf9\x56\xc6\x6a\x52\x83\x2e\x89\x4a\xca\x9e\x9d\xb1\x93\x94\x67\xc9\xf4\x3d\x4f\x4f\x58\x94\x49\xdf\x8a\xf7\xd1\x98\x8f\x5b\x82\x97\x75\x96\x54\x15\x34\x66\x84\x4e\x02\xa0\xc8\x66\x79\x82\x02\xdb\xc0\x16\x9b\xfa\x98\x41\xef\xb6\x3f\xaf\x06\x2b\x98\xd9\xbb\x94\xda\xec\xa7\xa5\x7a\x67\xdd\xb2\x12\xb2\x22\x08\x8a\x5b\x29\x10\x16\x65\x6c\x61\x49\x8a\xb9\x41\x1a\xbd\x90\x4d\xd0\xda\xa2\x17\xb2\x2f\x56\xac\x1f\xd9\x82\xfb\xf1\x1b\x4d\x9e\x28\x03\x76\x21\x58\x9c\x40\xc1\x89\xd9\xad\x90\x40\x1a\xac\x80\x64\xc8\xf0\x2c\xcf\xf0\x66\x0a\x96\x65\xb8\x64\xa7\xdc\xd8\x3a\xc0\xcf\x05\x85\xbe\x22\xbd\x91\x58\x6d\x60\xbf\x13\x15\xc8\x0e\xde\xe9\x27\x29\x0e\x4e\xa8\xf6\x1f\x20\x54\x98\x7a\xa8\x9f\x99\x43\x82\x9a\xae\xe3\x93\xe7\xe1\xfc\x1a\x99\x7a\x8d\x3f\xce\x76\x72\xb6\x9d\x4f\xf8\xf6\x2c\x9c\x6f\xeb\xb0\x17\xdb\xda\xf8\x77\x57\x07\xca\x11\x50\xcf\xc2\x11\x47\x87\x73\x21\x02\x4e\x5a\xec\x64\xcc\xa7\x3c\xe7\xe2\xaf\x73\x9e\x8b\x7f\x26\x61\x76\x82\xb6\x88\x93\x8c\xe7\xf5\x23\x1c\x7a\x5c\xb6\x95\x6c\xbc\x31\xa9\x5b\x34\x70\xab\xb5\x54\x34\x6f\xcb\x12\x7b\x15\x6d\x26\xbc\xcb\x23\x26\xb2\xbe\x0e\x6d\xd8\x62\x8d\xd3\xc6\x1e\xeb\xc1\xd3\x87\xbb\x26\x26\x36\x56\x19\x35\xf6\xd8\x6e\x8b\x35\xc6\x8d\x3d\x76\x1f\xab\xa8\x5a\xf2\x9a\xa0\xcf\x34\x77\x05\x43\x8c\xbb\x21\xe3\x29\xe2\xdf\xc4\xf0\xac\x43\x2c\x76\x5b\xac\x37\xd0\xa0\xb0\x96\xe8\xd3\xaa\xb4\xdb\x62\xf7\x55\x25\x19\xee\x28\xc4\xb3\x6c\x6d\xd8\x3b\x3b\xec\x39\x84\x32\xa5\x12\x08\xf7\x14\x03\xa4\x2d\x77\x23\x72\x94\x3a\x6e\x84\x0d\xa0\xcb\x60\xd5\x48\x74\x45\xd3\xe3\x6b\x54\xb8\x8a\xab\x4e\x7a\x47\x5b\x1f\x59\x9f\xfd\xc1\xc3\x8b\xe7\xe1\x7c\xdf\xbb\xdb\xca\x8d\x54\xb1\x8d\x39\x96\x8a\x55\x93\x9c\x21\x53\xde\xee\xb3\x86\x16\xf9\x90\x2e\x53\xd5\x17\x45\x90\x56\x61\x6b\x8b\xc9\x16\xb4\xc8\xb4\xd2\x8a\xaa\x2f\xca\x87\xb3\xd9\x68\xed\x95\xa8\x67\x63\xf2\xd0\xad\x66\x00\x79\x6d\x2c\x43\x74\x0e\xf4\x9f\x24\xc6\xb3\x0a\x7a\xbd\xa7\xa3\x44\xeb\xe6\x6a\xa3\xd7\x2b\x4e\x6e\xf5\x8e\x92\x31\x09\xb3\x40\xc6\xcd\x71\xdc\x2f\xa0\x58\x1c\xa0\x45\xb1\xeb\x2b\xa1\x15\x9a\x33\x3b\xe8\xb4\x8e\x38\x0d\x36\x22\xab\x6b\x95\x71\x12\x38\x09\xec\x77\x08\xa4\x29\x66\x44\xeb\x21\x05\x4d\x44\xbe\x39\x2a\xc0\x12\x53\x10\xd8\xbc\x72\x79\xa9\x35\x08\xaa\xa0\xab\xa6\xa0\xd5\xec\xec\xb0\xa7\xb0\xb7\xb0\x13\x55\xf7\xa4\x7d\xcb\xe5\x39\x55\xe4\xd3\xe8\x65\x5d\x8f\x02\xb4\xb9\x43\xa8\xd8\xfd\x57\x85\xcd\xee\x51\x47\x04\x73\x94\x24\x91\xf2\xd4\xd1\x86\x3d\x56\x31\xf3\xe4\xc1\x30\x22\xde\x9e\x42\xff\x38\x11\xbc\x0f\xbb\x1d\xec\x0f\xda\x02\x72\xa2\x96\x3e\x9e\x2a\xa3\x73\x54\xec\xb7\x3b\x70\x3b\x38\x4f\x79\xc6\xd3\xf7\x28\xc4\x6b\xed\x25\xd7\x0f\xaf\xe6\x3d\xc6\xaa\x93\xaf\x15\x8d\x0f\x6b\xf2\xb1\x1a\xbc\x47\xbe\x0f\xdb\x2a\xce\x71\x00\xf7\x83\x44\x50\x35\x1a\xc5\x3a\xdb\x1d\xab\xc6\x76\xc7\x53\xc7\x1b\x77\xad\xd1\x6d\xf5\x5a\xbb\x0d\x5b\x60\xe9\x26\x65\x59\xa8\x4c\x86\x97\x46\x43\x9a\x91\xde\xd8\x6d\xfc\x6a\x79\x5e\x1a\x25\xb9\xb7\x79\xc2\x51\x8c\x8e\x54\xc2\x8a\xdf\xef\xae\x9b\x2f\x7d\xe5\xeb\x3a\x6d\x8f\xae\xea\xf7\xbb\xef\xdc\x33\xad\x13\xd1\xf5\x7d\x98\x46\xc9\x22\x63\x27\x2f\xe0\xf4\x7e\xe2\x39\x20\x3c\x7b\xf1\xf3\xb3\x17\xcf\xde\xfc\x17\xeb\xb3\x2e\xdb\x61\x9d\x82\xdd\x19\xd8\x89\x65\x80\x07\x5c\xcc\xcf\xd3\x68\x16\xe5\xd1\x7b\x71\x48\x88\x15\x9b\x19\x80\x58\xf3\x95\xd0\xd8\x58\x5f\xd1\xed\x40\xfe\x61\x02\x98\xd1\xa4\xca\x32\xfa\x3d\xd4\xa0\x71\xdf\x09\xa4\x03\xfa\x4b\xb3\x9d\x9d\x99\xb9\x9e\xe9\xda\x84\x22\x77\x6c\xd6\x72\xa4\x82\xf7\xa2\x6c\x62\xb6\x73\x31\x66\x2a\x3d\xae\x91\xd6\x6d\x9e\x26\x23\x9e\xb9\x4e\x08\xbe\xe5\x6b\x16\xad\x63\x86\x7e\xe3\x59\x36\x20\xc3\xa3\x5c\xfa\x93\xe3\x41\x0a\x30\x04\xe9\x07\x91\x1e\x42\x95\x3e\x4d\xe8\xe9\x6c\x12\xe5\x18\x5a\x6e\xc6\x19\x8f\xdf\x47\x69\x12\x63\x98\x3a\x5b\x59\xd0\xeb\xb0\x81\xf0\x1a\xa5\x51\xa6\xb5\xed\x5b\x3f\x3f\x26\xe6\x6d\xd0\x71\x46\x8b\x34\x8b\xde\xf3\xe9\x52\x13\x58\x52\x35\xc8\x16\xd9\x88\xcf\xf1\xc5\xb6\xe0\xb4\x70\x3a\x95\x77\xd1\x53\xc1\x60\x59\xb3\x4d\xfb\xd4\xc9\xc6\xe5\x65\x17\xa5\x49\x93\xdd\x63\x8d\x86\x8d\x10\xf2\x9b\x83\x91\x7a\x0e\x6c\x73\xda\x81\xf3\x01\x83\xe9\xe9\xd4\xd8\x06\xb2\xb5\xe1\x63\x05\xe8\x99\x6e\xb2\xe6\xfa\x9a\x35\x3a\x0d\x48\x50\x2e\xd6\x95\x84\xd6\xef\xb3\x6d\xb5\xe2\x9a\x42\xc2\x6d\x77\x1a\xfa\x7e\xb9\xdc\xba\x5d\x1e\x00\xbe\x77\x33\xf9\x6e\x7f\xad\xbc\x44\xfb\xde\x5c\xb5\x49\x0b\xa8\xb7\xde\x2e\xcd\x51\x70\x68\x62\x92\xce\xc3\x7c\x22\xdd\x69\xc6\x51\x0a\x5e\x44\x29\x8b\xe2\x09\x4f\x23\xb1\x4f\x99\xb3\xac\xe7\x56\xf8\x1a\x3b\x2a\xde\x1a\x5f\xe7\x1e\xd9\x7a\xb7\xe6\xbf\x97\xba\x46\xa8\x53\x1c\x3e\xff\x18\x65\x62\x26\x56\x05\x35\xb5\xce\x5e\xc3\x36\x3a\x96\xaa\xf8\xf4\xf4\xb7\x3c\x8c\x35\xe5\xb3\x50\xdc\x8f\xed\xfb\x98\x46\xd8\x28\x8d\x62\xea\xd6\x6c\x9f\xd6\xad\xeb\x1e\x7a\x56\x03\x3f\xf5\x06\x47\x25\x02\xce\x73\x8d\xe4\x79\xbc\x44\xce\x28\x92\x13\xad\x26\x2d\xc3\xc9\x25\x1a\x02\x74\xe3\x59\x43\x37\x9b\x56\x17\x7a\xf1\xfb\xed\x8d\x39\x9f\xcb\x6b\x92\x1a\x6e\x0f\xc7\x38\xba\xc1\x9a\x0c\x2b\xce\x4b\x6f\xa4\x71\xed\x1a\xec\x7a\xc1\x97\xe5\xdc\xea\x6c\x4a\xbf\x5a\xf3\xa6\x8d\xb7\xa5\xd3\x26\x3d\x96\x5c\x4f\xb3\x32\xb1\xf7\xab\x7f\xbe\x76\x37\xf7\x23\x1d\x85\x59\x5e\x21\xca\x76\x1f\x74\x88\xa2\xa6\x0c\x8f\x65\xc6\xd8\xef\xd7\x55\xea\xaa\x32\x8b\xf7\xba\xa6\xeb\xdf\x94\x73\x89\xbf\x62\x77\x2d\x57\x02\xaf\x50\xc6\x79\x66\x49\x7c\xa3\xfe\x38\x6b\xcb\xd1\x82\xfd\x6b\x12\xfa\x5f\x97\x41\x1b\xf2\x68\xef\xc6\xc4\xb0\x2d\x8c\x3c\xb2\x45\x62\x84\x0c\x3e\x47\xd6\x51\x5c\x24\x7d\x02\x34\x3f\xaf\xce\x65\x29\x1a\x38\xce\x9e\xc6\x92\x80\x7e\x64\xab\xbd\x16\x8d\x27\x91\xf1\x14\x50\x59\x2c\x8d\x27\xa6\x71\xa8\xf3\xcb\x51\xf2\xfe\x4a\x46\x0e\x26\x91\x85\xcc\xdb\x08\x99\x99\x4e\xed\x4c\x96\x6f\x92\xd1\xbb\x64\x57\x97\x97\xfa\xd5\xc6\xed\xbe\x83\x75\xd1\xac\x71\x8b\x10\xc6\xf6\x5c\x95\x59\x3e\xa5\x55\xcf\xf8\xad\x2a\x4f\x56\xe9\xca\x8a\xfe\x16\xb8\x5a\x54\x66\x40\xfc\x86\xb9\xb3\xc1\xc8\x62\xbe\x03\x1a\x5a\x67\x55\x7e\x13\x97\x97\x74\xb1\xab\xcf\xe5\x3b\x89\xff\x22\x73\x77\x73\x5f\x3d\x21\xf9\x56\xa5\x8d\xda\xed\x11\x57\x77\x55\xf9\x89\xd8\x5d\xca\x1a\xec\xae\xe5\x08\xb5\x86\x48\x59\x91\x50\x28\xd7\xe7\xa0\x30\x57\x8b\x30\x39\x63\x21\x3b\x8f\xde\xf3\xb5\xe3\xd3\xd7\x48\x37\x54\x25\x75\xaa\xbc\x8a\x6a\x18\xcf\xc3\x91\x38\xc5\x25\xe9\x1a\xe9\x86\x4c\x6c\x13\xa1\xbf\x19\xb5\x8d\xc6\x2f\x21\x25\x5d\x19\x32\x95\x86\x28\x99\x85\x73\x95\x41\xa8\xc5\x4c\x5c\x8d\x00\x75\x36\xcb\xca\xdc\x6b\xb1\xee\xc0\x6a\x38\x6c\x67\x49\x9a\xff\xb4\xf4\x42\x20\x9a\x5c\xd3\xa3\x03\x6a\x13\x39\x11\x8e\x73\xea\x06\xe5\x84\xa2\x37\xfe\x4f\x07\x16\x5f\x52\x47\xa6\xa6\xb4\xe8\x50\x9e\x0d\xa4\x47\x92\x6f\xa1\xcd\x4b\x1d\x7a\x76\xd7\x4f\xf0\x5c\xa5\xb5\x99\x70\x25\xd7\x57\xdc\x7c\x1a\xd8\xe7\x60\x39\x47\x0b\xd3\x74\x76\x15\xb0\x9a\x2f\x80\x94\xa8\x35\x8e\x5f\x7b\x05\xf9\x5e\xae\xa4\x95\xbb\x5c\xed\x6e\xee\x72\x25\x3a\xf8\xa5\xc2\x09\x94\x26\x44\xac\xce\x37\xec\xba\x2a\xca\xd9\xcd\x6a\x4e\xed\x97\x96\x2a\x25\x53\x6c\x96\x4b\xfd\x79\x96\x34\x2c\xfa\xff\xd5\x98\x54\xd1\x9f\x67\x62\x37\xf3\xd6\xf9\x4c\x39\x21\xf0\x68\x7c\x38\x0d\xb3\xac\x3c\x65\x81\xd5\x49\xc4\x33\x99\xc8\xa1\x85\x2f\xc6\x8b\x01\xd5\x31\x6c\xba\xf5\x08\x9d\xe6\x72\x50\x11\xb5\x21\x4e\x01\x3e\x3a\x8f\x06\xfb\xe4\x73\xdb\x44\x2a\x87\xd8\x9a\xbe\xef\x97\x97\x2a\x15\x02\x29\xa7\xf1\xcc\x75\x96\x01\xa1\x62\xdd\x81\xd1\xdf\x11\xe7\x28\x53\xbd\x49\x9b\xaa\xb0\xe7\xba\x99\x9f\xc0\x6a\xe4\xa4\x25\x28\x4a\x04\xaa\x95\x74\xc0\x50\xf4\xd0\xb8\x04\x00\xe1\xf2\x44\x00\x85\xd8\xc4\x62\xfb\x7e\xa5\x48\x89\xc1\x6c\x54\x71\xb3\x48\x7c\x02\xc8\x58\x86\x29\x48\x99\x99\xc1\x82\x5b\x05\xc5\x46\x61\x5f\xa1\x4e\x6a\xec\x3b\x09\x05\x46\x82\x5f\x5a\x6c\x98\xf3\xd9\x5c\xa7\x0f\xe0\x61\x69\x76\x26\x92\x64\x40\xd4\xaa\x4c\x33\x20\x2a\xe8\xea\x6f\xd2\x30\xc6\x24\xe2\xbf\xa4\xc9\xa2\x4c\x51\xeb\x3d\x7a\x58\xd6\xa2\xaa\x2b\xa7\xaa\x06\x21\x58\xf2\xcd\x72\xce\xcb\x0e\xaf\x9d\x62\xcd\xaa\x6e\x74\x25\xdd\x0c\xc3\xa7\x72\xe8\xf5\x70\x12\x4d\x4b\xfd\x62\x77\x1f\x94\xb7\xa9\xea\xb2\x50\xf9\x0b\xa7\x64\x00\xfe\x38\x0c\xa7\x53\x38\x3b\x07\xca\xe5\xa5\x45\x79\x4a\xf1\xfa\x6d\x5d\xac\x5d\x63\x92\x33\xab\x62\xb3\x2c\x3f\xc6\x61\x18\xc7\x49\x8e\x46\xf0\x90\x41\xa7\x2c\xa4\x5a\xf5\x9d\x62\xa2\x85\x79\x92\x65\xd1\xe9\x94\x93\x0e\x70\x6f\x09\x32\x3e\x3d\x6b\x01\x30\x8d\x9a\xf8\x64\xf7\xfe\x5a\xdd\x15\x49\x14\x20\xc6\xe1\x24\x84\xcb\x90\x53\xce\x63\x16\xc5\x51\x2e\xb6\xd3\x8c\x8f\xd9\xb6\xd8\x30\x79\x1a\x34\xad\x1a\x98\x7e\x0f\x51\x33\x31\xcc\xe1\x64\xa9\xee\x12\xe0\x77\xbf\xdf\x67\x77\x70\xff\xb9\x23\xc4\x5d\xa1\xcc\x8c\x92\x1d\xe0\xe7\x3d\x26\x30\x76\x26\x43\x1a\x8d\xb3\x20\x5b\x9c\x1e\xe2\xc2\x05\xb4\xe0\x6f\x35\x54\x09\xdc\x14\xc0\xf3\x42\xd3\x85\xc0\xce\x29\x94\xaf\x24\xfd\x53\x73\x24\xea\x8a\x5d\x2d\xe5\x19\xa8\x14\xb3\x45\x96\x33\x1e\x81\xf3\xcb\x29\x47\xed\x29\x49\xc9\x5c\xb5\x20\x1b\xdb\x1d\x76\x8f\x15\x70\x01\x52\x29\xec\xc9\x6d\x98\x4e\x36\x24\x0d\xbc\x04\x41\x0b\x5d\x2a\x26\x3f\x51\xdf\xac\x3d\x93\x23\xc3\x10\x87\xa6\xc9\xc0\x0c\xb5\x4e\x4e\x0c\x5f\xde\x0c\xc1\x66\x4a\xee\x12\xe2\x4a\xfc\x32\x9e\xbf\x52\x28\xbc\x3c\x63\x07\xfe\xef\x25\x13\x64\x70\x6b\x0f\x87\x30\x92\xe1\x90\xf5\x49\x15\x9d\x77\x83\x2e\x7b\x48\xec\x23\xe4\xb3\x10\x13\xa3\xc2\xfe\x3e\x3c\x4c\x66\xf3\x24\xe6\xb1\x54\x7c\x0c\x97\x50\x20\x2d\x46\xea\x81\x75\x45\x43\xa0\xd5\xb4\x4f\x8a\xbb\xf0\xd1\xa9\x83\x56\x6d\xee\x5b\xd9\x12\x2a\x96\x23\xb6\xb5\xd0\x21\xe3\xbf\xbc\x54\x34\x3c\xb7\x69\x68\x75\xd6\x74\x9d\x4b\x64\x36\x43\x93\x44\x80\x2a\x40\xce\xd0\x8f\x3f\xa9\x27\x7d\x7b\xac\x81\xa1\x7e\x1b\xad\x5b\xfa\xad\x99\xc9\x97\xac\xe2\x00\x3b\x09\x31\x54\xbc\x1e\xd1\x39\x9c\x94\x32\x9a\x31\x61\xa4\xe8\x2a\xe6\x07\x55\x25\xfd\xc9\xaa\x27\x33\xab\x91\x6a\xf2\x0b\xad\x15\xce\xe7\x1c\x5e\x0c\xc8\x3a\xf8\x9b\xd6\xe0\xb1\x8c\x76\x8b\x15\xe0\x27\x2d\x9f\xf2\x10\x73\xd0\x2a\xb5\x2d\x7c\x0f\x5e\x2a\x96\x5b\x8f\xdc\xbe\x55\xec\x60\xb9\xee\x9e\xe2\xc1\x30\xd0\xd0\x0a\x9b\xb0\x6a\x60\x3a\xfc\x64\x08\xb0\x47\x68\x71\x65\x6a\x60\x5f\xed\x43\x39\x5a\x38\x98\xeb\xa1\x13\x4e\x86\x6f\x32\x6e\x49\xd3\x4a\x70\xb1\x1e\xd2\xd0\x67\x71\x97\x2d\xa2\x0e\xe8\x5b\xbf\x14\xfd\x5f\x42\x96\x98\x6c\x8f\x15\xc9\xaf\xa7\x40\xd7\x29\xcc\x80\x9e\x05\x5d\x05\x7e\xb9\x55\x90\x1f\x61\xd4\xdb\x0d\x76\x0f\x07\x6e\xd5\xb9\xb2\x9b\x40\x55\xfa\x0c\x77\x5f\xff\xb8\x52\x0f\x8f\x68\xfc\xc3\x41\x93\xe6\x47\xa5\x14\xd9\xbf\x75\x15\xa8\x69\xd1\x62\xa1\x25\x57\x7d\x9b\xaa\x4d\x82\x3e\x48\x84\x3d\xaa\x25\xe9\x39\xd0\x19\x0b\x91\x0c\xab\x2a\x01\x21\xaa\x2b\xdd\x32\x4b\xa5\xa4\x62\xcc\x5f\x9e\x89\x6f\xc1\xb1\xaf\x18\xae\xca\x5b\xde\x96\x32\xd0\xf2\x00\xcc\x7c\x84\x6d\xbd\x60\xe2\xe5\xad\x2b\x4d\x12\xf9\xf5\x95\x94\x04\x9f\xec\xf6\x8d\x6c\x1e\xc6\x0d\xa8\x2e\x04\x75\x73\xdf\x93\x78\xc4\x26\xbf\x7b\xa4\xdc\xcc\x69\xfe\x33\x1d\x29\xa3\x0c\x1d\x67\xca\x12\x0d\x76\xbf\x7f\x58\xa8\x5b\x95\x6a\x50\xc3\xfb\x96\x6c\xd0\x24\x1b\xfc\x76\x6e\xff\x76\x6e\xdf\xec\xdc\xde\xfb\x42\x07\xf7\x32\x37\x3c\xdf\x91\xbd\xde\x69\xfd\x8b\x1f\xd4\x4b\x63\x27\x75\xdc\x9a\x35\x0e\xe5\x5f\xf8\x28\x8e\xfb\xe3\x1f\x68\x9e\x27\x7c\xa4\xd2\x04\x66\x6a\x75\xe3\x0a\x11\xbb\xd4\xd5\x3e\x95\x0b\x26\xdf\xa0\xcc\x40\x98\xb5\x41\xe5\x78\x79\x16\x44\x4d\xf6\x63\x9f\x75\x9a\xe2\x3c\x04\x59\x7d\x90\x81\x6f\xd7\x12\x85\x80\x40\xd4\xa4\x8d\xa5\x34\x84\xbc\x8a\xc9\xe9\x3b\x3b\xaf\xa2\x16\x81\xdf\x0c\x0d\xdf\x0c\x0d\xdf\x0c\x0d\xff\x52\x43\xc3\x3c\x4c\x33\xfe\x44\x66\x42\x7a\x79\x76\x14\xc5\xe7\x53\x6e\x89\x7c\x73\xf7\x59\x5d\x35\x30\xcf\x5c\x13\x3c\xf6\x50\xb5\x4b\xc5\x00\xfc\x91\x75\x04\xa1\x8d\x3a\xd6\xc1\xf0\x57\xe6\xf2\xed\xc0\x2e\xdc\x13\x52\xec\x96\x9d\xa3\x4b\xc2\x6f\xc3\x6f\x75\x44\x52\xe9\x9c\x48\xb9\xc9\xf0\x64\x27\x6e\x14\x33\x2d\xfe\x68\x7b\x5d\x33\xb0\xc8\x97\x08\x0f\x1e\x54\xf2\x38\x4f\x97\x85\x67\x32\xd2\xf3\xe3\x1e\x0b\x20\x6f\x8e\xd6\x86\x4d\x72\x1e\x68\xa7\x51\x02\x07\x0d\xfb\x13\xd0\xe6\xc0\xfd\xb8\xc7\x3a\x26\x21\x54\xc7\x98\x3b\x20\xca\x58\x49\x57\xba\x13\x67\x64\x34\xe3\x15\x4d\xbc\xd8\xc1\x44\x3e\xae\xe1\x49\x19\xb4\xd1\xfa\xd4\xdb\xc4\xfc\x74\x88\x47\xfb\x5a\x36\x28\xa8\x6b\x3d\x8e\x1a\xa6\xfc\x6c\xdf\x24\xf4\x02\x74\x84\xee\x03\xb6\xa0\x61\xca\x55\x7e\xb6\xd5\x46\x2b\x6d\x42\x17\xd5\x4d\x7e\xed\x29\x58\x65\x5c\x66\x6d\xa9\x57\x59\x32\x83\xe9\x94\xc7\xe2\x8c\x8c\x3e\x47\x9d\x7d\xfc\xeb\x07\x68\x8d\x3f\x40\xc1\x96\x7c\x01\x0f\xb1\x86\xf2\x38\x60\x38\x7a\xa8\xae\x94\xdd\x6c\xa3\x62\x18\xd4\xd2\x17\xc0\xf0\xc0\x8c\xb3\xca\xb0\x26\xc8\xe3\x1c\x30\x61\x9c\xeb\x1a\xd9\x90\x38\x4d\xd8\xd4\xa5\xb9\x4d\x80\x6e\xb1\x63\xd1\xd1\x40\x25\xd6\x82\x97\x5d\xcd\xa6\x9c\x00\xf5\x6f\x5b\x68\xb0\x5c\x1e\x8d\x19\xba\x03\x42\x42\x93\x3d\xe5\xf1\x8a\x2c\x8c\x95\x27\x61\x3c\x9e\xf2\xa7\xd2\x92\x65\xb8\x29\x4e\xc6\x10\xc9\xe9\x31\x58\x1c\x48\xe4\x06\x35\xf3\x93\x28\xfb\xbb\x32\xc7\x0d\xfd\xf6\x38\xcb\x82\xa3\xaa\xfd\x9d\x5a\xd3\x64\x59\xc1\xa8\xe6\x6f\x43\x8b\x8c\x1d\x8d\x8e\x03\x52\x83\xe1\x68\x03\x82\xbb\x10\x65\x16\x2e\x7b\x56\x37\x66\x59\x5b\x34\xf9\x18\xe5\xee\x39\x70\x45\x97\x84\x0e\x6d\x6a\x76\xa2\x1d\xf0\xd9\x5c\xcc\x54\x39\x2f\x91\xd5\x54\xc3\xa6\x2a\xd7\xb3\x65\x58\x2d\x20\x56\x62\x63\x2d\x0e\x00\x92\x29\xdb\x81\xff\x9c\x4f\x72\x5f\x89\x75\xba\xc2\xa7\xf1\x18\xa2\x6a\x2c\xa7\xbc\xed\x7c\x3e\xf0\x12\x8f\x41\xfe\xc6\x62\xf5\x80\x1a\xd1\xd8\x9e\x4c\xf5\xa9\x3f\x21\x6b\xf3\xfc\x48\x70\xb7\x9d\x1f\x2e\xc3\x04\x8f\xb4\x03\x1b\xf4\x9e\xf3\x9b\xf2\x9b\x59\x1d\xe8\x39\xae\xcd\x78\x4d\x4f\x08\x3d\xd5\x09\xd2\x19\xf6\xe1\x37\xd1\x8c\x27\x8b\xbc\x84\xc4\xb4\xca\x7a\xc6\xec\xc2\xe2\x59\x73\xdd\x14\x97\x4c\xc1\x34\x5d\xa8\x4d\xbf\x16\x0c\xd5\xab\xb4\x0e\x0b\xb3\x26\xbb\xb7\xb2\x81\xb5\x04\x6b\xd4\xf7\xad\xa8\xe2\xa4\x5c\xe3\x56\x41\x4c\x40\x4f\x4e\x84\xe6\x38\x33\x45\xbd\xf2\x0b\x07\xf7\x22\xa1\x57\x71\x93\xe0\x52\xbb\xb7\xe6\x5c\xf6\xd6\x9b\xcc\x9e\x35\x9b\xb4\xba\x96\xda\x65\xe7\x58\x09\xa0\xc5\x8e\x1b\x6a\x38\x90\x02\x8d\xa2\x2b\x3e\x50\x7c\xc4\x6f\xda\x61\x63\xd0\x2c\x64\x08\x5f\xfb\xa6\xc3\x73\x53\x60\x2d\x7c\x9c\x10\x67\xe1\x3f\x45\xeb\xb7\xbb\xbb\xb5\xec\x4a\x1f\xa3\xdc\xae\xf3\x31\xb2\xee\x23\x72\x5c\xb3\xb2\x8e\xbd\x8c\x89\x90\x30\x4d\x88\x95\x54\xe3\x0f\xb2\xea\xa6\x2e\x50\x4a\xae\x4d\x90\x7b\x71\xd3\x77\x4a\x9c\xdb\x9e\x24\x9e\x2e\xf5\x75\x4f\xb3\xe4\xf6\x62\xad\xcb\x0b\x00\x7d\x9d\x1b\x0c\x7d\x1d\x53\xe3\x22\xa3\x66\x5d\xfb\x9a\xa7\xba\x6e\xf5\xad\x86\xbc\x9b\xd0\x97\x08\xbd\x95\xb7\x08\x92\x0e\xee\x55\x42\xe5\xf3\x73\x63\xfd\x92\xb0\x87\xc3\xba\xd7\x0a\x3b\x77\xd9\x24\x4c\x67\x49\xbc\x64\xd1\x0c\x5c\x43\xef\xee\xa0\xbc\x1a\xfe\xf1\xf4\xa7\x57\x8f\x0f\xff\x63\xf8\xec\xf9\xab\x97\xaf\xdf\x3c\x7d\x32\x7c\xfe\xf2\xc9\xef\xbf\x3d\x1d\x76\x86\xd3\x64\x1c\x66\x93\xa1\xf4\x36\x87\x53\x68\x69\x42\xcd\x1b\xe9\x60\x68\x68\xe5\xe9\xa8\x1d\x07\xeb\x00\xbb\x1e\x52\x5d\xe4\xcb\xf2\xc1\x6e\x08\x76\x83\x21\x6a\x18\xd7\x43\xa1\x07\x8c\x3b\x14\x67\x87\xac\x74\x78\x9d\x9b\x80\xbd\xc1\x18\x6d\x40\xd7\x43\x66\x77\x08\xa9\x8a\x87\xaf\x16\x29\x7f\x0d\xbb\x77\xf9\x6c\x3e\xb8\x5e\x17\xf7\x65\x17\x4f\xc2\x3c\xfc\x3d\x8f\xa6\xe5\x04\x85\xcc\x5f\x0c\xdc\x7c\x6b\xfe\x77\x97\xfd\xdb\x59\x34\xe5\x2f\xdf\xf3\xf4\x7d\xc4\x3f\x30\x69\x8d\x66\x6f\x92\x64\x9a\x47\x73\x76\x98\xc4\x39\x44\x82\xaa\x0b\x6f\xe7\xdb\x7d\xdd\xb7\xfb\xba\x6f\xf7\x75\x9b\xdf\xd7\xc1\xbf\x3d\xe3\x70\xfb\xed\x02\xe4\xdb\x05\xc8\xb7\x0b\x90\x7f\xd1\x05\x08\xfc\x87\xf2\x15\xf6\xc7\x9f\x93\x74\x16\xe6\x8e\x4d\xd2\x2d\xf3\x04\xee\xb9\x8e\x7e\x1a\x34\x15\xa0\xad\x2d\xf5\x22\x7c\x2d\x65\xe1\xf8\x0e\xbf\xc3\x76\xee\x32\xb0\xff\xbf\x4c\x8f\xf2\x94\xdd\xdd\x19\x48\xa8\xc7\x9d\xc1\x67\x02\xdc\x1d\x88\x95\x03\x7f\xb7\xdf\x25\x51\x1c\x34\xd8\xff\xc3\x20\x46\xae\x0c\x8b\xa2\x36\x4a\xa9\x73\x48\x95\x43\x6a\x1c\x26\xcf\xca\x7a\xba\xd7\xf1\x9d\x10\x70\x52\x5a\x21\x20\xa4\x6f\x23\x1c\xf7\xd8\x5e\xcd\x0b\x0a\x2f\x86\x15\x97\x14\xde\xfa\x2b\x3c\x66\xbd\x6d\xd6\x76\x9d\xf5\x42\xa9\x63\xde\xf7\x77\xbf\xa6\x33\x6d\x09\x9d\x3c\x5e\xb5\xb2\xac\xd2\x0c\xe6\xd2\xad\x96\x59\x72\x1e\x2e\xa7\x49\x38\x36\x36\x43\xf9\x81\xd6\xc9\xf8\x3c\x4c\x43\xd4\x91\x64\x2d\xfd\x89\xd6\x3b\x23\xab\x5c\xd6\xd3\x9f\x2c\x13\x6d\xce\x67\x60\xa5\x36\xf5\xf4\xa7\x42\xbd\x24\xb5\x00\x9a\x6f\xc6\xa0\x09\x6a\x8a\x1c\xc7\xd6\x96\x1a\x92\x73\x07\xa9\xe8\x31\x8d\xb2\x5c\x75\xfe\x89\xcd\xc3\xf1\x38\x8a\xcf\xf7\x58\xa7\xc5\x66\x61\x7a\x1e\xc5\x7b\xac\x03\x2a\x29\x6d\x23\x3a\x85\x47\xa3\x12\x72\x96\xa4\x79\x60\x30\x69\x82\xe3\xad\x59\x18\x70\xd1\xd8\x62\x91\x6d\x29\x82\x64\xf1\x51\x1c\x4e\x9f\xd1\xe1\x6b\xf3\x97\x75\x64\x18\x47\xd9\x7c\x1a\x8a\xe9\x3f\x9d\x26\xa3\x8b\x86\x6d\x08\x92\x48\xbf\x49\xe6\x7b\xec\xbe\xb7\xe8\xa7\x24\xcf\x93\x59\xa1\x74\x94\x4c\xc5\x36\x83\x17\xa1\xf0\x43\x30\x78\xe3\x6f\x9d\x4e\xa7\x41\x2a\x5e\xb5\xcc\x14\x11\x5b\x12\x0e\x61\x12\x66\x32\x4a\xfc\x4d\x8a\x40\x44\x29\x0e\x67\xc5\x0e\x81\x66\x74\x03\xc1\xba\x86\xd9\x84\xfa\x4d\x7f\xb8\xfb\x0a\x99\xcc\x1a\x1b\x4b\xc1\x18\xd0\x0e\xab\xac\x79\x8d\x69\xe4\xcc\xce\x27\xd4\xfd\x04\x91\x60\xf9\x8e\x26\x61\x9a\x67\xdb\x39\x2e\xf2\x6d\x41\xd9\x46\x4b\x2e\x6e\xfa\x11\x3d\x95\xe5\xed\xc7\x9e\xcb\x2a\x8e\xc3\xb2\x9a\x85\x83\x9b\x1b\x09\x93\xce\xb6\xae\x33\x75\x8d\xf1\x6c\x8b\x89\x6b\xb8\x38\x32\x66\x66\xd5\x2a\x68\xca\xdb\xa0\xaf\x7a\x48\x5a\xc2\x79\xc6\xa5\xcb\x6a\x0c\xeb\xab\x18\x0c\x6c\x18\x9e\x81\x38\x6b\xeb\xc0\xf9\x20\x97\xa5\x8c\x8c\x66\x66\x53\xfe\x0d\x22\x4e\x89\x13\xa8\x64\xd3\xe3\x2b\x24\xc4\x22\x8e\xf2\x52\x46\x15\x85\x20\x10\x1b\xf6\x38\xca\x1e\x06\x10\xc1\x72\xb3\x62\xa5\xb1\x98\x5a\xa3\xab\x33\x32\xb1\xaf\x35\xb4\xf4\x30\xbb\xdc\x95\xbb\xa3\x66\xb7\x0a\x83\xb9\x72\x6e\x76\xf0\xaa\x96\xdd\xd8\x85\xdc\x8a\x6b\xb7\x69\x78\xca\xa7\xb6\x42\xd0\x6b\x9b\x8f\x85\xaa\x6e\xad\x42\x85\x9f\x0b\x8a\x88\xac\xf9\xb3\x4f\x1d\xf9\x90\x86\xf3\x39\x4f\x5d\x04\xe8\x67\xeb\x16\x11\xd6\x48\xc5\x06\xae\xf5\x08\x92\x97\x5c\xa9\x19\x5d\xf2\xf1\x34\x1c\x5d\x9c\xa7\xc9\x22\x1e\x1f\xe2\xbe\xdc\xf8\xdb\xd9\xd9\x19\x99\xf8\xd3\x24\x1d\x73\xf1\xbd\x3b\xff\xc8\xb2\x64\x1a\x8d\xd9\xdf\x46\xa3\x11\xa9\xf1\x61\x12\xe5\xfc\x68\x1e\x8e\x04\x5f\xc4\x89\x40\x59\xf1\xee\x55\xcb\x1a\x98\x9e\x6b\x3d\x82\xdf\x2c\xaa\x57\x0c\xc3\x00\x34\x73\x62\x81\x9b\x84\xd9\x6f\x72\x5e\x6e\x52\x27\x80\xde\x4a\xf0\xc6\x50\x39\xf8\xe7\x81\xe4\x0a\x8c\xa8\x48\x74\x42\x5d\x63\x6b\xcb\xe1\x0b\xaa\x99\x59\x40\xed\x6a\x0e\x0a\xee\x32\xb9\x91\xd5\xde\x18\x47\xef\x1b\xd6\xa3\x2f\xdf\x52\x97\x60\xd4\x92\x6f\xd8\x6a\x42\x61\xa5\xdf\x94\x1c\x9a\xaf\x23\x86\x80\x58\x0e\x66\x84\xc9\x2c\x41\x64\x0a\x8d\x34\x6a\xd9\xbe\x21\xce\xa1\x66\xe5\x45\xa6\xf7\x30\x05\x97\x99\xab\x89\x71\x7c\x47\x1f\x4d\xef\x0c\xf4\x65\x67\xaf\x2d\xf5\x70\xa9\xf0\x36\xbc\x5d\x34\x4c\x75\xf7\x72\x54\xeb\x09\x7b\x6b\x5f\xcf\xb4\xc3\x36\x06\x05\x11\x54\xd1\xea\xed\xb5\xe0\x40\x04\xf7\x5b\xb6\x9c\xbb\x16\x20\x73\xe1\xaa\x8f\x07\x1b\xc2\x31\x02\xe5\x26\x00\xfd\x7c\x23\x64\x02\x50\xd7\x82\x10\xc6\xcb\xd6\x2d\x7d\xa4\xbe\x1e\x88\x34\x0d\x97\x2f\xcf\x6a\x5f\xc2\x51\x76\x99\x84\x73\x2e\xe5\x77\x0c\x4b\xf4\xfa\x43\xd0\x1b\xfb\x75\x26\x85\x3c\x22\x5c\xbf\xb5\xca\x32\x75\xfd\xf5\x72\x6d\xb2\x0f\xa4\x04\x12\x6a\xe0\x75\x89\x07\xb9\x80\x9a\x7a\x89\x80\x79\xe0\xda\xdc\x68\x5e\x49\xf6\x7c\xcf\x24\x89\x74\x69\x88\xcd\xcf\x59\x98\x9f\xae\xdc\x15\xf6\xe9\xca\x3c\xa4\x84\xb8\x74\x08\x1c\x1c\x1d\xf4\x2d\xab\x32\x04\xa2\x17\x03\xbb\xbb\xe3\xf3\x6c\x38\xbe\x13\xde\x19\xb0\x7e\x89\xfd\xac\x59\x74\x9d\xa8\x0c\x94\xfe\x2f\x72\x9d\x18\xf3\xd3\x64\x11\x8f\x78\xe9\xf5\xf0\x83\xde\x86\xbe\x13\xa6\x87\x9b\x70\x9e\x30\xd0\xbe\x79\x4f\xfc\xaf\xf5\x9e\x80\x15\x0b\xa9\x1e\x4b\x07\x7a\x4d\xae\xb5\x61\x6f\x30\x50\x1b\xd0\x75\x7d\x38\x90\x21\x52\x9e\x45\x7f\xf2\xe1\x98\xe7\x7c\x94\x27\xe5\xbe\x22\x8f\x76\xaf\xe9\xe7\x54\xda\xd1\x06\x04\x28\x85\x79\x3d\x14\x1f\xac\xe7\xcf\x72\x8d\x1e\x1e\xca\x1e\x7e\x4b\xce\xab\x3b\xd8\x7d\x00\xaf\x5d\xbf\xf9\x6b\x7c\xf3\xd7\xb8\xa1\xb8\x68\xdf\xdc\x34\xbe\xb9\x69\x7c\x73\xd3\xf8\x17\xb9\x69\xc8\x00\xa7\xb6\x4b\xe3\x1f\x68\x26\x20\x11\x87\x20\x41\xf3\x05\x67\x68\xef\x61\xe1\x38\x9c\xe7\x2a\xbf\x25\xe4\x50\x4d\xce\xd8\x3c\x4c\x45\xd5\xbb\xec\xc9\xcb\xe7\x10\x66\xf4\x16\xf1\x02\x79\xcd\xb3\x79\x12\x67\xd1\x7b\xb1\x82\xf2\x30\x8a\xc1\x32\x7b\xbd\xd8\x5b\x1e\x58\x15\x9e\x05\x9e\xda\x81\xda\x79\x2a\x9c\x0b\x3c\xcd\x9a\xd6\x3b\xc9\xba\x2f\x08\x3d\x80\xea\x78\x17\xf8\xfa\xc7\xe7\x83\x12\x30\x8e\x41\xe1\x84\xef\xd4\x16\xf3\x71\x98\xf3\x27\xd1\x8c\xc7\x62\xf5\x64\xcf\x66\x33\x3e\x8e\xf0\xed\xa0\xef\xe1\x16\x48\x2b\x6c\x3a\x4b\x16\x71\xce\xc7\xd4\x2c\x8a\x52\xa6\x60\xfa\x14\xc3\x8f\xf9\x87\x23\x99\x11\x19\x5a\x9f\xf3\x5c\xa3\x29\x0a\x82\xa6\x65\x86\x95\xd5\xdd\x8b\x78\x7c\x09\xa8\x1e\x37\x92\xa7\x8e\xf6\xe5\x4c\x32\x1d\xff\x11\x8d\x31\x5b\x81\x69\x21\xb6\x6b\xec\x10\x0a\x0b\x4d\x7e\xe5\xd1\xf9\x24\x2f\x6b\x83\xa5\xfb\x16\x3a\x36\x40\xcc\x7f\x27\xd0\xae\xec\xc9\x81\xe8\x6b\xa5\xfa\x32\x77\x45\x90\x1b\xd0\xee\x4d\x88\x46\x3d\xd0\xcb\xcb\x02\x5c\x59\x8e\xbf\x6c\xb7\x82\xa1\xfd\x90\xee\x93\x33\x90\x3d\xe7\x77\xcb\x85\xbd\x57\xe8\xec\xca\xf3\x7e\x44\xbe\x99\xb3\xf8\xcd\x7d\x97\xea\x76\x6c\xd2\x13\x14\xba\xdc\xee\x7a\xe0\xe1\xc3\x9d\xd7\x1c\xd3\x32\x4b\x1d\x50\x1d\x7a\xe5\x1b\xee\x6b\x1d\xba\x83\x66\xb0\x62\x85\xb4\x9c\xde\x84\x00\x5d\xd1\xc4\xca\xa5\x38\xc4\xa7\x66\x72\x9d\xec\xdc\x65\x3c\x9b\x46\x71\xbe\x3d\x8e\x32\x50\x0c\x19\x1c\x08\x76\xe2\x64\x7b\x1c\x8d\xb7\x61\xb5\x6d\x67\x3c\xdf\x46\x12\x82\xb4\x74\x5c\x83\xbc\x62\xce\x72\x0c\xd2\xf2\xf9\x49\x34\x7e\x2e\x20\x96\x5c\xc9\x15\xea\x11\x11\x40\x17\xbf\xd2\x5e\xe9\x4a\x97\x53\x51\x67\x95\x67\xce\x12\xb7\xd9\x12\x4a\x57\x3e\xc0\xd4\xa8\xfe\x11\x4d\xa7\xbf\xc7\xb3\x3a\xa3\x22\x55\xcb\x07\x26\x53\x5f\x94\x74\xeb\x8e\xac\xa4\xcb\x22\x01\x6c\x51\x0a\x7d\x6a\x56\x2f\xca\x52\x72\xad\x5a\xbc\x4b\x32\x95\xdd\x65\x64\x83\x6d\x8f\xa6\x11\x8c\xda\x92\x45\x85\x05\xe6\x6d\x84\x85\x0a\x81\x15\x17\xbc\x87\x62\xb3\xaf\xf6\x37\x13\x35\xdc\xab\x5e\x25\x14\xfc\xe2\xbc\x20\x64\x87\xab\xa4\x79\x51\xc2\xba\x4d\x5c\x01\xeb\x11\xaf\x3f\xb0\x8e\x4f\xaa\xfe\xc0\x3a\x75\x67\xa9\xce\x03\xdf\x6c\x2e\x93\x6b\xc9\x97\xbd\xf0\xdb\xba\x68\x56\x83\xc6\x0a\x1f\xdc\xb1\x4e\xf4\x10\xb1\x02\xfe\xa6\x35\x66\x51\xfc\x87\x0d\x44\x7d\x71\x6a\xfd\xea\x80\xd2\x9f\xac\x7a\xe1\xc7\x42\x3d\xf5\xa9\x5e\x7c\x4d\x43\xf5\x95\x17\xbf\x45\x1b\x83\x72\x3d\xfd\x10\xa6\x31\xde\xf8\xae\x04\xe2\x31\x85\x1c\xdf\x39\x97\xb7\xc7\xaf\x78\x3a\x02\x1d\x54\x80\x02\xe2\x36\x8d\x86\x75\x23\x40\x71\x42\x9a\x2d\xd6\x78\x33\xe1\x38\x9d\xc1\xff\xc9\x9a\x90\xae\x12\xcb\xf0\x67\xca\xd9\x69\x92\x4f\xd8\x59\xf4\x91\x8f\x19\x5e\x69\x64\xad\xb7\xb1\xa6\xfb\xf2\x94\xb3\x65\xb2\x60\xe3\x24\x7e\xdb\xc8\x59\xcc\x31\x29\xe6\x22\xe3\x2c\xf4\x29\x9f\xed\x46\x0b\xbb\x6b\xc9\x7e\x8c\xec\xbd\x11\xc2\xdf\x96\xcc\x7b\x79\xa9\xd8\xf8\x47\xd6\x91\xc3\xc4\x0f\x30\x30\x38\x8f\x9d\x72\x76\x0e\x1b\x55\xca\xf2\x49\x18\xb3\x3f\x79\x9a\x08\xfc\xb0\x5e\xd3\xda\x3f\x46\xe1\x74\xb4\x98\x86\x39\xd7\x3a\xdc\xcd\x4f\xf1\x81\x2b\x55\xf6\x90\x54\xfb\x5e\x3c\x34\xc3\xdf\x3c\x5b\x50\x4c\x64\x37\x7b\x72\xba\xac\x9d\x52\x52\x78\x6b\x8b\xd0\x9a\xca\xa1\x9d\x1d\xf6\x4a\x66\x00\x86\x23\xd6\x98\x67\x51\x0a\x69\x58\xa1\x36\xbc\xa7\x37\x92\xbf\x38\x32\x97\xe8\x3b\xb2\xe5\x3e\xed\x21\x3a\x23\xcb\x3f\xca\x58\xc6\xf3\x16\x4b\xde\xf3\x54\x1c\x5b\xb9\x28\x2e\x40\x8e\x32\x7b\xe2\x75\x7b\x4b\xb3\x35\x50\xb7\xb6\x8a\x30\x7e\x34\xad\x6c\x35\xd6\x33\x0e\x5d\xd3\xa7\x8e\xde\x24\xf7\xbb\x04\xfb\x51\x6e\x17\x45\xe4\x3b\xab\x96\x7e\x72\x86\xa7\x64\x96\x4d\x92\xc5\x74\x5c\x58\x2c\x1d\x23\x05\xe6\x53\x1e\x66\x5c\x66\x1e\xc3\x14\xad\xcb\x29\x9c\xa5\x47\x46\xe3\x4b\x52\x9d\x02\x24\x2b\xed\xd5\xc0\x4c\x52\x16\x8e\xc7\x2c\xd4\x1b\x05\x22\x95\x9a\x2d\x41\x7d\x00\x51\x63\x56\x36\x66\xe4\xcd\xd3\x64\x2a\xfa\xd3\xf0\xe4\x8e\x24\xba\x83\xce\xc5\x3a\x77\xa8\xd5\x2a\xd0\xc9\x11\x55\x2d\x8d\x4c\xcb\xa0\x51\x14\x17\xd7\xf3\xa9\x99\x26\xb1\x76\x5c\x31\x91\x8f\x0d\x63\x7d\x90\x67\x20\x07\xe7\x5b\xf6\x96\xbb\x57\x18\x83\xe2\xb3\xaf\x23\x2e\x45\x61\xdb\xef\xd5\xdc\xf7\x7b\xfe\x8d\xff\x83\x03\x6c\x95\x26\xd2\xf3\xa9\x22\x05\xe5\xa1\xe7\xd7\x1e\xa2\x31\xa9\x11\x59\x0f\x0b\xb4\x3b\x11\x0d\xb8\xa1\xbe\xd9\x07\x11\xed\xb1\x2f\x67\xd4\x62\xb1\xbd\x02\xab\xed\xf9\x98\x6e\x8f\xf2\x9f\xc6\x75\x8f\x0c\xe5\x6a\x43\x76\xac\xe7\xe2\x65\x11\x67\x8f\x95\xd0\xa4\xca\x6d\xc0\x7f\x57\x17\x34\x03\xe3\x95\x95\x6a\x2d\x62\x5b\xcb\x13\xb1\x7a\x15\x78\xcb\x3b\x57\xba\x6c\x65\xae\xbb\x65\xca\xcf\x2c\xae\x3e\x83\x38\x52\x4d\x27\xb6\xb7\x0c\x59\x31\x22\xb6\x3d\x51\x8d\x3a\xf2\x5f\x19\x11\xee\x77\xf3\xc2\xb3\xc4\xcd\x78\xb0\x6d\x70\xdb\xd7\x0e\x5b\xec\x93\x0c\xa4\xa4\xce\x5f\x60\xbd\xc5\x4f\xfa\x78\x05\xdf\x92\x18\x8d\x15\x56\xe0\x11\x69\xbf\xa8\x11\x36\xdc\xa3\xe7\x6d\xe4\xae\xe6\x7a\xab\x79\xe0\x37\xca\xe3\x78\x80\x38\xbe\x96\xab\x8a\x74\xd9\xb9\xa5\xa5\xed\x17\x77\x1a\xda\xc0\xf3\x07\x91\x47\xd7\x1f\x25\x4c\xfe\xaa\xf8\x13\x41\xf7\x17\x1e\xc2\x1f\x7f\x6d\x26\x22\xfb\xca\x5f\x75\x08\x24\x9c\xce\x35\x00\x25\x63\xde\x8e\x32\x19\xad\x19\xb6\x36\x65\x55\xdd\x50\xba\x44\xd7\x73\xa9\xfc\x3a\x48\x5a\x67\x57\xff\x7a\x87\x50\x9d\xaf\x41\x8a\xfd\x46\xb7\xd3\xf9\x3f\x0d\x2a\x48\xcd\x17\xc3\x02\x1d\x9a\xcc\x61\x03\xcf\xc3\x92\x2b\x3a\xc7\xef\xf0\xd1\xd7\x98\xfd\x01\x55\x84\x27\x52\xf9\x28\xf5\x68\xfa\xbe\xa4\x41\x55\x00\x75\xbb\xe6\x17\x89\xa3\x5e\x0c\xa5\xe5\xe2\xab\x8a\x8a\xd3\x53\x27\x41\xfe\x17\x9f\x9e\x6f\xa1\x78\x86\xd9\x34\x1a\xf1\xf1\x9b\x44\xe5\x9d\x2f\x71\xee\x82\x6a\xcf\x72\x0e\x5e\xc8\x41\x98\xa6\xf8\xe8\x19\xcf\xb4\x61\x2a\x58\xfb\x78\xb0\x8f\x3f\x63\xed\x1d\x05\x3f\xcd\xad\x0c\xfe\x16\xf4\xd0\xa1\xaa\xf7\x59\x9e\x2e\x29\x69\x87\x11\x90\x2b\x3d\x3e\x5a\xce\x4e\x93\x69\x3b\x92\x7d\x0e\x02\xa1\xfd\x66\xfb\xec\x76\x00\x1d\x04\x43\xb8\x96\x8f\xda\x31\xff\x98\x07\xcd\x66\x7b\x9c\xc4\xbc\xb9\x6f\x7a\x17\xd8\x09\xcc\xda\xf3\x45\x36\x09\x86\x19\x3e\x5b\x94\x4e\x18\x91\x60\x7d\x28\x55\x69\xc3\xfb\x7d\x31\x20\xcc\x56\x0e\x04\x1b\x85\xf9\x68\xc2\x02\x9e\x82\x2b\xd2\x50\x5f\x9a\xe1\x00\x78\x9a\x8a\x6a\xf0\xb8\x65\x2a\x06\x80\xc3\xc0\x8b\xf6\x18\xa0\x47\xc7\x77\x90\xe8\x77\x06\x4d\xeb\x57\xd0\xb4\x9b\x8a\x46\xc3\x71\x53\x7a\xca\x0c\xb9\xe5\x1a\x26\x90\xdc\xf7\x79\x8a\x99\x39\x10\xed\x61\xfa\xda\x2a\x21\x79\x98\xa2\x5b\x94\x6c\x24\x41\x40\xc2\x7a\x51\xd9\x21\xad\x60\x41\x69\x5d\x73\x1a\x7a\x67\x5d\x83\x2a\xf1\xed\x79\x16\xbf\x0f\xa7\xd1\x98\x85\xb9\x10\xfd\xe0\x3e\x32\xe6\xe8\x33\xb1\x48\x39\x8b\x93\x78\x1b\x7a\x3e\x9d\x1a\x97\x2e\xe9\x89\x65\xbb\x8f\x7d\x73\x3a\xfc\xe6\x74\xb8\xb6\xd3\xe1\x67\xc9\xdf\xf2\xd9\x53\xab\xa4\xd6\x36\x0a\x8f\x38\xca\xfa\x7a\x74\xbf\xf3\x2d\x7f\xe9\x37\x77\xcd\x6f\xee\x9a\xff\x37\xbb\x6b\x4a\x57\x4a\xfb\xec\x50\xd3\x67\x92\x34\xaa\x76\x97\x24\x15\x57\x44\x60\x2a\x9e\x35\xd8\x75\xfc\x23\x09\x8c\x9a\xae\x91\xb4\x57\xe2\x15\xe9\xb8\x43\xba\xee\x69\xfc\xe3\x3c\x8c\xc7\x10\xda\x57\x19\x68\xf4\x63\x7c\x52\x26\xcd\x4f\x4e\xd1\xd1\x28\x4d\xa6\xd3\xdf\xf8\x59\xb1\x15\x16\x41\x30\x1e\x5d\x92\x4d\xd2\x28\xbe\x58\x55\xe2\x80\x9b\x86\x59\xee\xf6\x2e\xbe\x69\x6c\x3d\x3e\x73\x29\xcf\xb8\x76\x73\xc4\x5f\xed\xd3\x28\x1e\xff\xff\xec\xfd\x7b\x97\x1b\xc9\x71\x20\x8a\xff\xcd\x3e\x67\xbe\x43\x10\xbf\x15\x51\xd5\x28\x00\x55\xe8\x37\x9a\x20\x3d\xe2\x70\x24\xfe\xa4\x99\xe1\x1d\x8e\x5e\x8b\x69\x37\x0b\x40\x02\x28\x36\x50\x85\xa9\x2a\x74\xa3\x39\xec\x7b\xb4\x5e\xc9\x6b\xef\xca\x2b\x9d\xb5\xe5\x87\xec\x6b\xdf\xdd\xb5\xd7\x7b\xbc\x6b\x49\xbb\xf6\xda\x1a\x59\xb2\xbe\xcb\x9e\x21\x67\xf4\x97\xbf\xc2\x3d\x19\xf9\xae\x07\x1a\xdd\x6c\xf2\x52\xbe\xd3\x73\x86\xa8\xca\xca\x8c\x8c\x8c\x8c\x8c\x8c\x8c\x8c\x8c\x64\x0e\x6f\xdc\xf6\x6c\x5c\x6f\x80\x35\xcb\x12\x7a\x62\xbe\x60\xa1\x77\x5b\xd6\x4d\xcd\xe0\xac\x62\x0f\xb5\xaf\x05\x93\xc9\x4a\x2e\x6a\x32\x63\xd6\x95\x6b\x18\xc5\x7d\xf2\x15\xf4\xc5\xb3\xca\xf7\xe4\xae\xc2\x25\x8e\x69\x99\xba\x9f\x97\xd8\x96\xeb\x9b\xce\x5f\xfa\x3e\x89\x59\x00\x67\x79\x63\x09\x65\x99\x19\x1c\x68\xd9\x85\xfb\x71\x26\x98\xae\x7b\x50\xbc\x29\x97\xc9\xe6\x1d\xc8\x6d\x2b\xc5\x06\x56\xd6\x5f\x44\xcb\xc0\x34\x5d\xb1\x7d\x51\x98\xb3\x80\xba\x6c\x4b\x5b\x8a\x0e\xd6\x1b\x25\x14\x2e\xcc\x6b\xd1\x55\x19\x57\x22\xe9\x63\x26\x9c\xba\x58\x8c\x4a\x0c\xd9\x14\x24\xca\xe0\xfc\xa8\x06\xb6\xf8\x86\x40\x56\xe2\x88\xa5\x08\xe7\x33\x66\x59\x90\x8d\xf6\x46\x22\x87\xae\xe0\x0b\xe3\xc3\xd7\x74\xd7\x93\xfc\xe7\xf7\xa2\x59\x61\xb1\x2f\x9a\x6e\x22\xac\x9d\x28\x2a\x0a\x2a\x34\x3e\xe4\x2b\x34\x3e\x6b\x15\x1a\xe9\xba\x67\x45\x21\xdd\xce\xf7\x87\xec\x97\x38\x43\xf2\x7e\xec\x6a\xac\xa6\x6d\xa8\xd1\x69\x3b\xe3\x9d\xc8\xce\x0e\xf0\xdd\xbb\x46\x34\x1c\x26\x84\x3b\x38\x42\x0e\x86\xf2\x2d\x59\x01\x08\xcb\x7c\xb0\x64\x0f\x3f\x21\xe5\x3e\x8e\x74\x10\x9d\xe3\x3c\x6d\x7a\x80\x72\xa5\xe6\x24\x08\x07\xd1\x09\xea\x6f\x55\x69\xd2\xa8\xae\xe8\x5b\xcf\xcf\x51\x64\x45\x8e\xd9\x3c\x63\x6b\x7c\x16\xc9\x1b\xc5\xaa\x6c\x5d\x54\xdd\xd7\x90\x62\x05\x1b\xfd\x79\x4c\x7f\x1f\x64\x6f\x7f\xd1\x4a\x17\xe4\x6c\x88\xcf\x12\x57\x65\x2f\x60\xcd\x64\x6e\xc1\xd3\xd9\x3c\x25\x83\x65\xc0\x4b\x72\x73\xf4\xec\x7c\x45\x7a\x13\x24\x98\x8e\x6a\xa3\x51\x0f\xc3\x3c\x31\x50\xa6\xf4\x88\xc9\xc4\xc7\x0b\x73\x72\xb4\xce\x78\xcd\x4b\x50\x05\x5a\x82\x3e\x5a\x75\xbe\x82\x9a\x11\xce\x27\xaf\x43\xe4\x0b\xb2\x11\x60\x96\xd3\xa6\xfd\x32\x37\x58\x5d\x0b\xc8\x70\xe0\xf9\x8e\x2a\xfa\x14\xbf\xfc\xe2\x20\xcc\x62\x91\xab\x65\x6a\xd2\x98\xc5\xe4\x98\x0a\x56\xe1\xa4\xb0\x2f\xbf\x24\x69\x34\xa3\xb2\xdd\x1f\xe1\x1d\x31\x96\x9d\xf1\xf9\xc8\xba\x12\x9b\x4e\x33\x86\xfc\xd9\xb8\xf0\x2c\xbd\x79\xde\x2c\xbd\xb1\xda\x34\xbd\xb9\xda\x34\xbd\xa9\x4f\xd3\x6c\xfc\x88\x93\x1f\xcc\xa1\x59\xf2\x01\x9d\xe8\xc6\xea\xdc\x87\xfa\x9a\xf7\x9b\x5b\x75\x36\xcf\x32\x7e\xb9\x86\xf0\x82\x3d\x9d\x0a\xfb\x54\xfb\xce\x55\xea\x5c\x54\xaa\x33\xa7\xd8\x1c\xd2\xd0\x46\xdd\x83\xec\xb5\x51\x7c\x5f\x8a\x11\x30\x3b\x3c\xf3\x3e\x60\xb9\x7c\xb9\x11\x96\xf1\x0d\x5a\xed\xce\x97\x5c\x80\x27\xee\x6c\x53\xdc\x1e\x26\xca\x78\x53\xf2\xee\x37\xab\xf8\xde\x98\x8e\x37\x46\x58\xa8\x55\x6f\xa9\xc9\xe0\x7c\x31\xac\xa3\x90\x49\x12\xc3\x2d\x86\x25\xad\xd4\x24\xd9\x28\xd6\x15\xd9\x16\x65\xda\x74\x5e\xab\x58\x53\x54\x03\x74\x0e\x3b\x53\xa1\xfd\xec\x5f\x59\x2a\x31\xb5\xee\x8a\xa9\x54\xdc\x00\x56\x95\x1a\x6c\x06\x01\x57\xf1\x77\xd2\x40\x16\x5e\x33\xb4\x5f\xb4\x9d\x98\x2d\xb7\xb6\x96\xb1\x1a\x64\x7d\x99\x0c\xf7\xad\xa2\x1b\x81\x7a\x51\x84\x41\x03\x4d\xa7\xae\x65\x39\x95\xab\x57\x51\x2e\x16\xac\x67\x3f\x87\x58\xc1\x5e\xb9\x81\x1b\x33\x3d\xe5\x10\x91\xc9\xaa\x56\xc9\x0b\x52\xcc\x93\xcc\x15\xa4\x84\x2d\xd0\xcf\x72\x9b\xac\x9b\xee\xab\xb5\xc9\xaa\xb4\x5c\x21\xe6\x45\x97\x9b\xa9\xb4\xac\xd0\xe5\xda\x50\xf5\x7b\x49\x34\x99\xf3\xf5\xdb\x44\x59\x4e\x52\x69\x5e\x89\x35\xa3\x4e\x8f\x07\x40\xc6\x97\xe8\x98\xc4\xc3\x49\x74\x42\x95\xa1\x60\x30\x20\x2c\x74\xe8\xe3\x7b\xe1\x80\x2c\xc4\x31\xc5\xe3\x20\x09\x7a\xc1\x24\x48\x4f\x55\x2e\x19\x71\x3d\xc7\xf7\x0a\xe7\x82\x4f\x17\x46\x5c\xf8\x4f\xb4\x72\xfe\x13\x98\x22\xd1\xc8\xce\x75\x1a\x1a\x05\x9f\x2e\x8d\x46\x89\x1b\x47\x11\x6b\x79\xcf\xc5\x5a\xfc\xf8\x39\xdf\x77\x18\x90\x19\xd5\x25\xc2\x7e\x40\x12\x3c\x41\x4e\x9b\xdc\xf3\x27\x7e\xd8\xc7\x33\x7c\xc5\xdb\x1e\x2d\x1b\xf3\xb1\x4b\x85\xdf\xe4\x28\xdc\xf1\x99\x89\xab\xb0\xc4\x06\x2b\x31\x25\x8b\x59\x69\x9e\x2d\x5b\x62\x87\xa6\x4b\x3f\x4c\x35\xa4\xde\x7a\xfd\xeb\x87\x0f\xde\x7b\xfd\xce\x97\xa0\x03\x9e\xeb\x42\xb3\xa9\xb9\xfb\x93\x30\x9a\x8f\xc6\xb8\xc1\xe8\x43\x82\x77\x1e\xa2\x77\xb9\x65\x37\x1a\x0d\x2c\xfe\xf6\xdd\x07\xef\xdd\x7d\xe3\xf0\xce\xeb\x5f\xbe\x73\xf8\xee\x5d\xe8\x40\xd3\x7a\xbf\xf6\xe4\xfd\xfa\x93\xf7\xd7\x9f\xbc\xff\xfe\x93\xee\xaf\xfb\xf5\xc7\x07\x4f\x6c\xeb\xfd\x64\xdd\xb6\xde\xb7\xec\xe6\x48\x22\xf3\x85\x49\xd4\xf3\x27\x54\x53\x0a\xfc\xde\x44\x43\x29\x49\xfd\xfe\x91\xcc\x76\x77\x31\x8b\x12\xc2\x89\x72\xe7\xc1\x83\x3b\xfe\xa4\x0f\xb3\xc9\x7c\x14\x84\x6b\xc0\x8e\xfc\xa3\x71\xfd\x43\x41\xb0\x33\x04\xc4\x3a\xae\xc1\xfb\x0d\x3a\x26\x00\x09\xfd\x5d\x4c\x85\x3b\x0f\x1e\xf0\x86\x41\x10\xd2\xb6\x72\x37\xa3\x93\x31\x09\xc9\x31\x89\x21\x48\xab\x09\x08\x0b\xb0\xa8\x77\xe6\xc7\xfe\x14\x3e\x7c\x80\x99\xcf\x98\x70\x80\x7e\x92\x40\x10\xce\xe6\x29\xa2\xa1\xcd\x7b\x5a\xf5\x16\x8f\x42\x3c\x20\xfd\x60\xea\x4f\xee\xc7\xa4\x1f\x24\x78\xdf\x33\xc6\x42\xa3\xed\x87\x0e\xda\x48\xb3\x39\xa0\x03\x6f\xf9\xe9\xb8\x31\x8b\x4e\x2c\xcf\xcd\x43\xc0\x45\x8d\x7e\x4d\xf6\x16\xb4\xf3\xd5\xe0\xc1\xde\x26\xbc\x3e\x99\x44\x27\xa2\xdd\xb8\xe7\x31\x49\x83\xd9\x84\xc0\x24\x08\x69\x7f\xf0\x16\x75\xf8\x45\x0e\x31\x99\x4d\xfc\x3e\xb1\x9a\xef\x87\xb5\xe6\xc8\x81\x0a\x54\x18\x24\x76\xe7\xd4\x3a\xdc\xa5\xf9\xfc\x94\x24\xe0\x87\xda\x5e\x0a\x7e\x64\x39\xb2\x24\xcb\x64\x82\x5f\x63\x13\x40\x22\x73\xac\xb1\x7b\xa5\x34\xb3\x3e\xe1\x95\xdc\x55\x7b\x35\x96\x02\xe3\xc8\x8c\xf7\x06\x24\x4c\x83\x61\x40\x62\xb9\x49\x86\x53\x0c\xdf\x9d\xed\x1f\xd5\x6a\x70\x4b\xb1\xbf\x52\x49\x74\xf2\x03\x2e\x32\xc4\x7e\x91\xdc\xc6\x9b\x4c\x78\x2e\x21\x8d\x71\x88\x54\xa0\xc6\x6a\xe2\x4a\x83\xac\x4e\xdb\x56\xc2\x8d\xb0\x8a\x6e\x8d\x33\x81\xe7\xb1\x87\x1a\x54\x2c\xbb\x0d\x55\x01\x9e\x26\x54\xd9\xfe\x14\xd7\x94\xc1\x47\x9f\x03\x0c\xa0\x9b\xcc\xfc\x3e\xe1\xfc\x5b\x31\x30\xd1\xb1\x90\x54\x7c\x9b\x24\x29\x19\x28\x5a\x1a\xa4\x64\x8d\x91\x3b\x21\xf3\x30\xc0\x91\x34\x22\xe9\x57\xe8\xe3\xbd\xb0\xb0\x1c\x2f\xd1\x6c\xc2\xbd\x21\x1e\xf8\xd1\x2a\xe6\x08\x27\x8a\xd5\x18\xd0\x28\xc6\x21\x28\x65\x81\x23\x40\xa4\x63\x12\xc2\x84\xa4\x59\x40\x3d\x02\x56\xd0\x20\x0d\xe8\xc5\xd1\x49\x42\x62\xce\xc5\xb6\xa4\x39\xc2\x55\xf7\xc9\x7b\x74\x21\xaa\xca\x37\x02\x3a\x5f\xbe\x33\xb4\x2a\xc7\x7e\x6c\x55\x6c\xb8\x05\x75\x2f\x67\xf5\x2b\xe9\x0c\xda\x11\x1a\x2a\x35\xa8\xd8\x15\x9d\xd0\x82\x56\xe8\x05\x14\xb0\x0b\xea\x9f\x3c\x81\x4a\x65\xcd\xc0\x8e\xf1\xc2\xe7\x34\x66\x68\x36\xa9\x84\x3e\x26\x71\x0a\x33\x76\x26\xcf\x1f\x91\x04\xd2\x48\x1e\xbb\xa4\xcf\x4c\xbf\xd2\x30\x48\x60\x12\x1c\x91\x36\x6c\xb9\x9f\x83\x75\xfc\xd7\x3a\x09\x26\x13\xe8\x91\x7e\x34\x25\x6d\x68\x6d\x7d\xce\x6e\xab\x2a\xfa\x51\x98\x44\x13\xd2\x98\x44\x23\xa3\xd7\x58\x06\x93\x4b\x14\xc1\xd4\xe0\xef\x75\xdd\xfa\xde\xfb\x8d\x83\xda\xe7\xa8\x10\x90\x33\x25\xc7\xb8\xe0\x10\x32\x5e\x50\xfa\xe6\x24\xf2\x53\x91\xa9\x81\xa6\x0a\xcb\x75\x28\xd5\x6d\x58\x07\xb7\xe1\x7a\x72\x6d\xaa\xd3\xb2\xd9\x84\x77\xc9\x34\x3a\x16\x8c\x12\xe8\x82\xa5\x2d\xc9\x9d\x46\x42\xf6\x14\x63\xcd\xb6\xc2\x47\x77\x17\x33\x24\xbd\x03\x95\x51\x50\xb1\x1d\x3a\x14\x25\x0c\x76\x39\x3f\xab\x16\x7d\x9d\x24\x33\x24\x4c\x77\xa7\xb3\x6c\x83\x0e\x1c\x4b\x55\x67\xcb\x05\x02\x48\x7f\xaa\xab\xe2\xa3\x66\x13\xf0\xba\xd9\x61\x14\x4f\x31\xc0\x36\xed\x7d\x5f\x63\x0d\x8e\x5a\xfb\x1c\xb6\xe2\x0d\x58\xc7\x09\x3e\x53\x81\x3f\x78\x44\x05\x09\x46\xee\x0e\xc2\x11\x24\xe3\x20\x15\xdf\x2c\xb7\xe1\x61\xdf\xb4\x10\xa6\xdb\x70\x5b\xae\xf9\xb7\xa9\xc6\x5b\xbe\x8d\x62\xf0\x3d\x79\x02\x4b\xf1\xe2\x33\x1a\xa2\x60\x09\x5c\x0b\xa6\xc6\x66\x2e\x2d\xd3\x96\xd7\x07\x03\xac\x69\x4d\x03\x5e\x63\x63\xd0\xb8\x49\x87\x77\xb4\x0c\x70\x91\x9b\xbd\x42\x14\x8a\xfa\x08\x7b\x31\x53\xd8\xf9\xc2\x97\xd3\x4a\x8d\x02\x2a\x06\xfb\xa8\x01\xf9\x71\x0a\xc3\x38\x9a\x16\x60\x4b\xf9\x84\x84\xc9\x3c\x26\xa2\x74\x8f\x60\x04\x79\x29\x2c\xa3\xe9\xcc\x4f\xf9\x1a\xa1\x60\x72\x28\x18\xf6\x96\x75\xbb\xfd\x7e\xbd\x4b\xd5\xb9\xda\xfb\x75\xfb\x36\x45\xc2\x46\x2d\x40\x1b\x42\xa2\x61\x83\xfb\x14\x3b\x3a\xd3\xc9\x4f\x61\x14\xde\xcd\x7c\x35\x29\x87\xb9\xa6\x74\x08\x11\x16\xd5\xff\x64\x1c\x4c\x08\x58\x16\x4f\x83\x4e\x46\xd9\x6c\x90\x05\xe9\x5b\x59\xb8\xb6\x6d\x9a\x7c\x79\xe9\xae\x7b\xc0\x64\x7e\xf6\x80\xb2\x89\x72\xad\x93\x43\xb4\x91\xcc\x7b\x6c\x3a\xb5\xf0\x5e\x1d\x13\x9c\x5d\xb4\xef\x21\x14\x7d\xda\xb3\xd0\x91\xaf\x56\xc5\xaa\x38\x74\x90\x3b\xcb\x2a\x51\xa0\x6d\xad\x19\x3a\xc8\x46\x2f\x1a\x9c\xe6\x34\x89\x02\x45\xa5\x9a\x97\x30\x17\x52\x1c\x32\xcd\x92\xa4\xd2\xf4\x07\x8d\x79\x73\x28\x52\xde\x30\x94\x88\x02\x6a\x1b\x85\x66\x31\xa1\x08\x8b\x3c\xbc\x4c\x01\xe7\x98\xa5\xa2\x24\xd5\x25\x81\xb0\x21\x98\x55\xe5\xc0\x88\xf1\x2f\x85\x42\x76\xd1\x25\x94\xf4\x62\xd6\x7f\xdf\x6a\x3a\x05\x54\xb0\xd7\x54\x28\x32\xf4\x2f\x49\xe0\x64\xec\xa7\x7c\xf6\xf2\x63\x02\xf3\x84\x0c\x70\x91\x61\xaa\xc8\x85\x2b\x0a\x23\x83\x26\x59\xd0\xc2\xcf\xd6\x39\x6b\x7a\x48\x97\xa5\x6a\x19\x37\x60\xa0\x6e\xf2\xc1\x9c\x7c\x85\x6b\x73\xdd\x03\x23\xf9\xcb\xd1\x09\x89\xef\xf8\x49\xe1\xf7\x14\xe7\x50\xba\xca\xeb\xbe\xdf\x70\xeb\x7b\x07\x56\xf7\x73\x48\x16\xbb\x39\x0a\xd6\x8c\x21\xcc\x95\x1f\x2c\xc0\x46\x6a\x46\x43\xe4\xc3\x9b\x67\xd7\xb5\xf3\xeb\x02\xc4\x93\x27\x20\x9e\xf1\x46\x39\x3d\x38\x53\x10\xf2\x1b\x5a\xce\x0c\xad\x2a\xd7\x02\xa9\xe9\x29\x40\x8d\x34\x92\x79\x2c\xdb\xc6\x91\xa4\x6b\x7f\x1a\x7d\x98\x6b\xb5\x86\x83\x91\x25\x53\x53\x26\x6f\xa6\x1a\x1d\xd9\x95\x68\x64\xf2\xa7\x86\x14\x65\xb1\xac\xf1\xa2\xb5\x82\xf1\x02\xed\x14\xb9\x75\xb1\x18\x4b\xfb\x8a\x93\xa4\xc0\xf2\x1d\xe8\x39\x54\x26\x30\xe2\x60\xc0\x07\xdd\xeb\x91\xa9\x54\x36\xf8\x18\xe1\xe0\xb4\x47\xde\xa2\x0d\xa3\xc5\x68\x99\x7d\x5e\xa4\x57\x54\xa4\x67\x16\xe9\x89\x22\x9c\x8b\xa8\xdc\x8c\xfd\x70\x44\x34\x1c\x74\xfb\x6b\x0c\x37\x6e\xf0\x0e\x4b\x52\x3f\x4e\xdb\x10\xcb\xad\x2b\x12\x0e\xe8\xab\xc7\x5f\x67\x31\x9e\x06\x8e\x95\xd2\x49\xb3\x72\x1b\x39\x95\x53\xfa\x57\xfa\x09\x6a\xe0\x73\xe5\xc5\x41\x38\x3c\x2f\x15\x34\x66\x5e\x8f\xe6\xed\x89\xcb\xd9\xd6\xd0\xa1\x49\xf7\x65\xd4\x1a\x18\x93\x91\x46\x49\x1c\x28\xd0\x41\x60\x53\xf1\x1d\x09\xc6\xdb\x37\x85\xdb\x30\xa5\xb8\xb4\x79\x0c\x9f\xb3\xb5\x35\xd1\x2d\x0d\x24\x8c\x20\x90\xd6\x6f\x59\x82\xc9\xaa\x7a\x64\x94\x38\xf4\x5f\x07\xad\x65\x0e\x33\x2f\x3a\x5c\x13\xda\xe7\xb9\xfc\x80\x63\x24\x86\x8c\x6f\x8b\x4f\xbd\xec\xa7\x9e\x43\xb3\xd7\xc0\x93\x59\xf0\x54\x43\x80\x7d\x84\x7c\x12\xc0\xad\x0e\xb8\xb4\x9b\x7a\x81\x3e\xe9\x52\x5c\xd8\x59\x0a\x7c\x9d\x30\x5f\x10\x0a\x9b\x7b\xab\xaf\xe9\xb3\xbf\x82\x72\x9d\x21\x6b\xce\xee\x01\x74\x68\xad\xfa\x2c\x48\xe1\xb3\xa1\x18\x68\xb1\xdf\xf2\x6d\x73\x40\xe1\x0f\xa6\x37\x00\x82\x90\xc7\x26\xc0\x33\xd7\x34\x5c\x69\xed\xf2\x9a\xa2\x99\x65\x3b\xb4\x8d\x07\x19\x48\x06\x4a\x74\xa0\xc9\xec\x0a\x2d\x5e\x1b\xdc\x44\x3a\x98\xdb\x22\x9c\x32\x3d\x32\xd2\xf7\x42\x62\xbe\x21\xdb\x0b\xf4\x48\x22\xaa\xaa\x82\x8e\xca\xb4\x53\xee\xdb\x62\x87\xc1\x4d\x5a\xe6\xc6\x0d\x10\x1d\x76\x9b\x3e\xb5\x25\x7c\x4d\xbc\x6a\x64\x29\x50\xe2\xbb\x3a\x6b\x81\xee\xa7\x62\xcc\xb2\x8c\xe1\x0a\x24\xd8\xc6\x73\x9a\x5f\x9f\xdb\xfa\xba\x69\x67\x6d\x8e\x0f\xf3\x4a\xc1\xc3\x4b\xd8\x1c\xf5\xf2\xb2\x8a\xaf\xf9\x93\x23\xaa\xb0\xcd\x47\x63\xf0\x27\x13\x5d\x7d\x57\x7a\x05\x55\xf7\xa7\x18\xb1\x24\x08\x13\x12\xa7\xec\x3d\x08\x79\xbc\xd2\x01\xe9\x4f\x7c\x0c\xa1\x93\x55\x20\x98\x82\x60\xae\x60\xd4\x57\xb6\xed\x71\x96\x29\xaf\xeb\x12\x05\xda\x90\x30\x89\x8a\x3c\xef\xde\x65\xba\x1d\x5d\x98\x2a\x49\xc3\xbc\xbd\xb9\x1a\xa9\xfa\x7d\x44\x52\x1d\x58\x52\x00\xcd\x6e\xb0\x4a\x55\xe7\x8b\x3c\xcc\xd1\x5f\xd7\xed\xd8\x17\xb9\x38\x89\x7a\x8f\x1a\x4b\xd6\xd8\xf4\x33\x9f\x71\x99\xea\x5c\x63\x4a\x38\xa5\xb2\xd1\xc4\x6c\x46\xac\xba\x00\xb2\x6a\x38\x7b\x32\x9a\x61\x33\xa7\x03\x86\xa2\xae\x0e\xde\xf7\xe3\x84\x24\xc6\x3a\x0d\x35\x70\x7e\xd9\x5c\xb9\x49\xb9\x44\xf7\x83\x5f\xf3\x67\x01\xcc\xe2\xe0\xd8\x4f\x49\x5e\x17\x34\xe9\x9d\x43\x53\xf6\x98\x8e\x0f\x6a\x7b\x3c\x7d\x18\xa2\x3d\x9f\xbb\xcc\xa8\x92\x6c\xe1\xc1\xd7\x09\x70\x1b\x34\xd3\x4a\xe5\xfd\xf7\x7b\x48\x71\x2d\x37\xa5\xf5\xfb\xef\x5b\x15\x1b\xda\x5a\xf2\x1a\xc0\x20\xe2\x7d\x8a\x26\x7f\xe2\xc7\xfd\x31\xce\x94\xd0\xc1\xaa\x99\x3e\xa4\xcc\xa9\xfc\x7c\x83\xcc\x96\x33\xb2\x64\x56\xeb\xdc\x26\x83\xd6\x5e\x55\x8a\xce\xd8\x86\x85\xbc\xdc\x12\x5b\x79\x2b\x48\x92\x20\x1c\xe1\x48\x1b\x06\x31\xae\x9a\xe6\xb3\x89\x16\x21\x78\x4c\x92\x00\x17\xdb\x23\x6e\xa0\x94\xf4\x0f\x14\x17\x06\x21\x98\x24\xd1\x4d\x46\x8c\xd0\x74\xc0\x18\x38\x2a\xba\x50\xdd\x06\xf7\xf6\xcc\x3c\x4c\xbc\x67\x97\xcd\xc5\x6b\x4d\x4a\x43\x6d\x7d\xa9\x40\xda\xf6\x5a\xa1\xce\x2d\x86\x00\xe6\x64\x6e\x3b\x1a\x76\xee\x81\x98\x1a\xeb\xfa\xcc\xa8\xc8\xf7\xe0\x34\x4c\xfd\x05\x37\x67\x87\xc2\x7c\x3d\xe5\xd4\xec\x4f\x22\xfc\xad\xda\x55\x4a\x1a\x4a\x35\xb6\xcb\x60\xda\xb7\xcb\x4c\xd7\x7c\x6a\xff\x90\xe3\xd8\x16\xc8\x16\xd9\xfd\xdb\x30\x0c\xb9\x35\x91\x8b\x25\xd1\x32\xbe\x64\x3c\x53\xcb\x10\x64\xb9\x94\x24\x29\x63\x39\x5b\x9b\xb3\x74\xc6\x52\xa3\xb9\x74\xaf\xe3\x42\x0b\x39\x69\x22\x5a\x3a\x9a\xb3\x82\x0a\x72\xe2\x73\x45\xd9\x84\xbd\xd5\x6c\xd2\x09\x27\x3a\x81\x98\xf4\xe7\x71\x12\x1c\x33\x1b\x90\x76\xb4\x87\x96\xb6\x2e\x3a\x05\x2c\xd9\x79\x29\x9a\xee\x37\x3f\x5b\xb0\x7c\xb6\x60\xf9\x6c\xc1\xf2\xd9\x82\xe5\x57\x76\xc1\xb2\xf5\x5c\x0b\x16\xf4\xbd\x20\x8b\x59\xa7\x78\x31\xb2\x6d\xef\xbf\xb6\x46\xbf\x6b\x51\x12\x86\x51\x3c\x9d\x4f\x7c\x3a\xf3\x64\x8f\x8b\xbf\xb6\x76\xcd\xf0\x6d\x7a\x6d\xed\x9a\xf4\xa4\xe8\x74\x0f\x9c\x59\x34\xf3\xe8\x3f\x2d\xfa\xcf\x86\xf8\x3c\x08\x92\x59\xa7\x7b\x20\x5e\x53\x32\x9d\x75\xaa\x55\xf1\xea\xc7\x71\x07\xdd\xf9\x70\x7e\xa6\xa9\xc3\x28\x66\xe7\xcc\x3b\xee\x7e\x70\x53\xc5\x16\xd8\x0f\x6a\x35\x9b\xe2\x70\x2d\x18\x5a\x7e\x1c\x77\x83\x83\x06\xc5\xb8\xd3\xe9\x78\x4f\x9e\x98\x09\x1b\x2c\xe3\x35\x5a\x37\x9f\xcb\x99\x53\x55\x26\xdb\x6d\xfe\x9e\x8c\xa3\x13\xf1\x8d\x19\x64\x69\x8e\xb6\x77\x46\x09\x74\xed\xda\x19\xfd\x87\x8f\x83\x6c\xd5\xe7\x55\x45\x41\xaf\x0c\xcd\xd5\x80\x75\x11\x22\x6b\x7b\xdd\x3b\xe8\xe4\xc1\xd6\x2c\xed\xe5\x7a\xa7\x52\xaf\xdc\xae\x58\x95\x76\xa5\x62\xd7\x0a\x00\xb0\x86\x15\x95\xb1\xb1\x0c\x43\xd2\x3d\x3b\x0f\xc7\x9d\xf3\x71\xb4\x8a\xaa\xa7\xc5\xaf\x77\xbc\x55\x50\x5c\x5a\x9c\x61\x5b\xcb\x91\x77\xe7\x5c\xcc\x3d\x41\x5e\xca\xa8\x1d\xd6\x61\x28\x78\x44\x62\x2b\x97\xa8\x60\xd0\x8a\x3a\x9d\x4e\xf5\x7e\x55\x32\x9b\x48\xba\x53\xb5\x73\xbd\x5f\xb9\x99\xcc\x67\xb7\x2a\x35\x0a\x95\x37\xab\x72\xb3\xc9\xd2\xf4\x2e\xa4\xf9\x7a\x2c\x9f\xa7\xe7\xeb\xdd\xaa\x70\xae\x71\x39\xdb\xb0\x46\xe5\x2a\xb2\xb0\x86\x2c\x71\xb5\x6a\x33\x19\x38\xf9\x34\xfc\xbc\x0c\x7e\x2b\x73\x6b\x2b\x3b\xec\xf6\x2e\x4c\xdf\xab\x6a\x8e\x31\x2a\xb0\x4d\x05\x20\x3c\x0d\x84\x97\x05\xc1\x5a\xad\xb5\x67\x85\xb1\xdf\xba\x70\x7b\xa9\x60\x3c\x9f\x08\x06\x83\x58\xd8\x49\x1b\xa2\x93\x1c\x93\xa7\x1c\xb3\x0b\x6d\xd1\x7b\x2d\x0d\x7d\xfa\x3f\x9f\x69\x70\x64\xb9\x07\x52\xda\xd2\x31\x63\xea\xbe\x1d\x3a\x1f\xe4\xfd\x16\xb7\x5f\xe4\x3c\xb4\x53\x30\x0f\x51\xb5\x72\x18\x2c\x72\xf3\xd0\x57\x12\x12\xbf\x21\x97\xd5\xaf\xad\x5d\xab\xaa\x29\x09\x67\x15\x2d\x43\x47\x7b\x7e\xf2\xe4\xc3\xb3\xcc\xe7\xc6\xfd\x7b\x1d\xf4\x0a\xb8\x7f\x2f\xfb\xe5\x2e\xfb\x70\xf7\x05\xcd\x71\xa8\x3c\x46\xd1\xa4\x23\x0e\x0b\xe9\x75\x87\xd7\x3b\x9d\x8a\xb4\x1d\x54\xec\xcb\x4e\x8a\x9c\x39\x11\xf5\x22\xf6\xba\xd8\x44\xb7\x51\x0a\x4e\xc3\xbd\xab\x83\x3e\xb8\xf0\xb4\x17\x0c\x65\xc8\x05\x5a\x4b\x97\xd5\x65\xce\x01\x1d\x93\x38\xac\xe0\xb5\xe2\xfc\xcc\xa3\x10\x71\x65\x15\xf2\x01\x77\xa6\xe4\xe9\x92\x82\x1d\xbd\x31\xd6\x92\x8c\xe7\xb6\x6f\xe7\x9f\x79\xfb\x76\x75\x39\xc8\x19\x24\x23\x08\x73\xa9\x3a\x1f\x31\x3e\x71\xf2\xdc\x69\x29\x51\xe7\x28\x31\x67\xaf\x20\x9a\xdd\x4b\xa0\xa4\xba\x47\xce\x31\xc5\xbd\xa1\xb0\xea\xe0\x63\x3f\x0a\xfb\x7e\x8a\xd3\x0a\x07\xa5\x65\x29\xe8\x1f\xbd\xf1\x34\x63\xbe\xdb\xb4\x73\x84\x72\xb2\xca\xe0\x02\x0a\x19\xaf\x31\x0f\x93\x71\x30\x4c\x75\x68\xec\xc3\xb9\x95\x7b\xb9\xca\x3f\xcc\x65\xbb\x5c\x07\x81\xf6\x77\xf6\x5c\xaa\xc4\x55\xf6\x1f\x64\xfe\x74\x47\xc5\x0c\xf5\x5a\xcb\x7b\xf7\xff\xab\xfd\x2a\x80\xae\xac\x19\x15\x74\x54\x9e\x0a\xd7\xcb\xa9\xd0\xe9\xd2\x7f\x0f\xf4\xf6\x14\x33\x00\x6a\x57\x97\x97\x34\x1b\xaa\xc1\xa2\xed\x21\x39\x41\xc5\x85\x51\x74\x15\xc1\xb3\xa1\x64\x3d\x9d\xe1\xed\x02\xaa\xaf\x34\x6d\x6e\x9c\x95\x08\x73\x06\x84\x17\x39\x30\xb5\x3c\xe9\x76\xce\x45\xf8\x2d\x8f\x13\x12\x0d\xe7\x96\x68\x4d\x83\x2c\xfa\x64\x86\x2a\x5c\xe5\x2b\x61\xdf\x9f\x8f\xc6\x29\xb7\xa8\x03\x89\xe3\x28\xae\xd8\x08\x57\x53\x1c\xd9\xf4\x20\x34\xc7\x5b\x5e\xc6\x47\xf3\x76\xe5\x5e\x38\x0c\xc2\x20\x3d\xad\xb4\x35\x4f\x5c\xb3\x54\x23\x8d\xde\x0c\x16\x64\x60\x79\x5b\x08\xff\x4c\x68\x7d\xe4\xd8\x9f\x74\xf4\x1d\x39\x27\x8d\x8e\x48\x98\x38\x51\xef\x11\x12\x50\x63\x18\xf6\xa5\x70\xcc\xe8\xe1\x30\x26\x64\x41\x01\xd9\x8d\x34\xba\xcf\x34\x49\xcb\xd6\x75\x4a\x4b\x36\x30\x3b\x2e\xa3\xde\xa3\x42\xe8\x39\x1c\x38\x8d\xb3\x8c\x8b\xdd\x55\x80\x0a\x6f\xd3\x39\x18\x21\x3a\x65\x20\xca\xcb\x72\xd8\x7a\x9b\x4a\x28\x72\x2e\x1a\x94\xe6\x17\x59\x19\x2c\xbd\xa8\xfe\xdc\x95\xc1\x6b\x72\x7b\x69\xc9\xfa\x60\x97\x22\xf4\xda\xda\xb5\xcc\x12\x41\xb6\xa0\xc0\x50\x95\x5b\x16\x5c\xe3\x91\x1f\x52\xaa\xc5\x93\x09\x99\xd2\x61\x3e\x23\x03\x67\x16\x93\x19\xfd\x87\x26\xf2\x59\x4b\x57\xf9\xc5\x7a\xde\xe2\x2b\xab\x4d\x9a\xb7\xed\x9e\x1d\x48\xa0\x79\xf5\xfe\x9a\x0a\x96\xd8\x91\xf1\x4d\xe3\x4c\xa0\xc4\x8c\x7d\xa1\xd4\x94\x95\x4d\xa0\x12\xe6\x5a\xb3\x19\x70\x36\x84\x20\xe1\x8e\xfb\x4e\x9f\x1f\xbc\x72\xa2\x18\x42\xeb\x64\x1c\xf4\xc7\xf4\xab\x3f\x49\x22\xf0\x21\x99\x91\x7e\xe0\x4f\x40\xe4\x82\x20\x84\x68\x1e\x43\xdf\x4f\x88\xcd\x84\x54\xc1\x1a\x82\x7d\xb8\xa6\x0b\xa8\xce\xdb\x58\x9d\xa5\xa7\xa9\xb9\x29\x49\x97\x2b\xa4\xb9\x3a\x36\x0b\x44\xe4\xca\x85\xb7\x44\x61\x34\x8c\x5b\x16\xeb\x53\x7d\x0e\xb0\xc5\xec\x22\xeb\xd1\x90\x64\xd9\x05\xf2\x67\xe7\x56\xe7\x79\x57\x5f\x5f\x66\xde\x56\xdf\x35\x44\x38\x24\xca\xb6\x5c\x6b\x17\xf4\x8e\x49\x87\xa6\x36\x66\x31\xd9\x97\x99\x3a\x85\xca\xbc\x2a\x32\xa3\x65\xb4\x22\xb8\x41\x3c\xf1\x47\x98\xcc\xfa\xb8\x53\x15\x27\xc0\xaa\x37\x6e\x60\x0d\xb9\xf4\x7d\xc9\x34\xb3\x98\xdc\xa2\x60\x6d\xad\x29\xb4\x8c\x2d\x51\x52\x6d\xe0\x94\xa3\xd9\x6f\x75\x66\x31\xb9\x71\xe3\x3a\xad\xfa\xc9\x13\xfa\xef\x8d\x1b\xb3\x98\xdc\x44\x50\x22\xfb\xb5\x3c\x89\xf7\xc5\xa7\xf3\x9a\x5a\x4e\xfa\x42\x32\x5c\xbb\x26\x88\x50\xd0\x5a\xa4\x42\x29\x11\x44\x5f\x5e\x2b\xa1\xc0\x59\x46\x6d\x12\x37\xe7\x29\xf5\x22\x49\x99\xf4\xe6\x22\x68\x25\xd1\xfb\x7c\xb1\xba\xcf\x11\xba\x7b\xcc\xf0\x20\x9d\x0d\xc2\x3e\x46\xae\x3d\xf6\xb9\x4e\xb3\xd4\x24\x81\xcd\x65\x9c\x5a\xeb\x1c\xfb\x93\x7d\xad\xd1\x7e\x1c\x8b\x79\x8a\x9d\xaa\x39\x22\x61\xa7\x5b\x4d\x82\xb0\xea\x54\xfb\x51\x52\x75\xaa\xa9\x4f\x9f\x67\x41\xd5\xa9\x5a\x55\xa7\x6a\x57\x9d\xea\xfd\xaa\x53\xbd\x53\x75\x28\x1c\x80\xaa\xcf\x72\xfb\x2c\xbb\xcf\xf2\xef\x54\x9d\xea\x6e\xd5\xa9\xee\x55\x9d\x6a\x10\xa6\x32\x73\x3f\x4a\xc6\x3c\x33\xfd\x9d\xd0\xbc\xbf\x5e\x75\xaa\x71\x14\xa5\x55\xa7\xba\x59\x75\xaa\x5b\x55\xa7\xba\x5d\x75\xaa\xcd\xaa\x53\xbd\x2e\x0b\xa6\x7e\x38\xe6\xe0\xe9\xef\x5b\xd1\xa0\xea\x54\xbd\xaa\x53\x6d\x55\x9d\xea\x46\xd5\xa9\xae\xcb\xac\x49\xc0\xb2\xf2\x5f\x42\xeb\x89\x46\x55\xa7\xea\x56\x9d\x6a\xa3\xea\x54\x6b\x55\xa7\x5a\xaf\x3a\xf8\xdf\x83\x60\x34\xf5\xab\x4e\x95\x22\x72\x9f\x36\x92\x72\x92\xb4\x1e\xa1\x59\xb9\x88\x1e\x37\x66\xc1\x7e\x31\x45\xce\xa7\xc7\x3d\x41\x8f\x2c\x35\x60\x19\x39\x6e\x0c\x82\xe3\x60\x40\xf6\x15\x55\xb2\x34\x81\xb7\xa2\x01\x64\xa8\x72\x23\x0d\xa6\x24\xd9\xe7\x05\x0a\x28\x03\xe5\xa4\xb9\x81\xb4\xd9\xe7\xc4\xb9\x71\x1f\x5b\x6c\x90\x87\x1c\xfb\x9d\x2e\x6a\x02\x53\x3a\x08\x93\x20\x74\xd4\x5b\x3f\x4a\xb4\xb7\xd4\x0f\x9d\xea\xfd\x7b\x8a\x66\xea\xd3\x7d\xed\xf9\x0e\x22\xaa\xde\x7d\x13\xa6\x6f\x02\xf5\x11\xaa\x46\x5b\x94\x05\xc3\x49\x14\xc5\x19\x38\x94\xc2\x19\x38\x63\x96\x7b\x12\x8d\x1c\x21\x42\xd8\x43\xf2\x41\x9c\x1a\xb4\x57\xe5\x06\xc1\xb1\xf6\x36\xf4\xfb\x69\xa6\x1e\xda\x15\x19\x04\xf5\xf7\x69\x34\x30\xfa\x47\xfb\x32\x9f\x64\x40\xd1\x4e\x72\x4c\x4a\x8c\x9d\xea\x5d\xbd\x10\xc5\x5d\x74\x9d\x96\x73\x30\xd0\xde\x92\x79\x0f\xbb\x53\x07\x3c\x9a\xfa\xd8\xa9\x5a\x1f\x04\x92\x08\xb2\x77\x67\x31\xe9\x93\x41\xe7\x43\xb7\xed\x79\x8e\xd7\x76\x9d\x56\x7b\xc3\xd9\x68\xbb\xce\x66\xdb\x75\xb6\xda\xae\xb3\xdd\x76\x9d\x1d\xfa\x71\x97\xfe\xb3\xd7\xf6\x1c\xcf\x6d\x7b\xae\xe3\xd1\xcc\x5e\x0b\x8b\x6d\xf0\x6d\x2c\x14\x2f\x74\xe6\xee\xba\x0e\xfd\x6f\xc3\xd9\x74\xb6\x1c\x9a\xd9\xc5\x76\xb3\x54\x0f\xff\x33\x52\x54\x72\xcb\xd9\x91\x1f\x5a\x32\x4d\xa4\x6c\x60\xbe\x6d\x67\xcf\xd9\x73\x68\xc5\x2d\xc7\xdb\xa0\xff\xee\x62\x7b\xa0\xb9\xfe\xda\xda\x35\x57\xf3\x49\x83\x93\x20\x1d\x43\xc2\x56\x5a\x22\xf1\x30\xf4\xa7\xc4\xa2\x94\x48\x0e\xc9\x62\x46\x65\xa7\x87\x0e\x0e\x78\x1a\xf3\xb5\xb5\x6b\x2d\xdc\x78\x0e\xfd\xf8\x14\xa2\x19\x0b\x22\xce\x4e\x63\xc2\x3a\x34\x71\x00\xe2\xa6\xb8\x9f\x24\x51\x1f\x6f\x2f\xf7\xc3\x01\x24\xfe\x94\x70\x6a\x92\xb0\x4f\x57\x03\x1b\xd0\xc6\x43\x70\x4a\x03\xc4\xd9\x8c\x83\x22\xce\x2c\x70\xee\xc4\xf3\xb0\x3f\x26\x31\xf8\x21\xad\x78\x13\xda\xb4\xc6\x30\x08\x47\xd0\x8b\xfd\xfe\x11\x49\x5f\x5b\xbb\xb6\x05\x6d\xe9\x60\xa5\x52\xb7\xd5\x11\xf0\xd7\xd6\xae\xed\x94\x35\x1a\xdb\x89\xcd\x34\x9a\xff\xda\xda\xb5\xdd\x95\xc9\x44\x8b\x7b\x8e\x78\x6a\x51\x82\xed\xe5\x49\xc4\x9a\x55\x73\xea\x94\x9e\x6e\xc9\xe7\xfb\x70\x07\xa2\x18\x7e\x9d\xe6\xf1\xda\x40\x3b\xd6\x6b\x65\x11\x71\x20\x21\x58\x8a\x0c\x20\x1d\xc7\x84\x00\x3a\x5e\x91\x94\x75\x8f\xb7\xd1\x96\x67\x8a\x21\x1a\x02\x4a\x30\x09\x82\xf2\xc1\x7a\x53\x63\x46\x97\x32\x37\x46\xcc\xf5\xd8\xcf\x06\xfb\xd9\x64\x3f\xdb\xec\x67\x97\xfd\xec\xf1\x9c\x2d\xfe\xcb\xf2\x9e\x39\xcd\x26\x05\xc5\x53\xe9\xe3\xa6\x7a\xdc\x53\x8f\x9e\xa7\x9e\x5b\xfa\x73\xeb\xb5\xb5\x6b\x98\x21\x8b\x4c\xab\x08\xa7\x2d\x03\xb5\x9d\x42\x0c\x05\x18\x6f\x29\xc6\x1b\x0a\x87\x2d\xf5\xb8\xa3\x61\xb6\xc1\x31\x3b\x54\xa8\x99\xc8\xec\x96\x54\x40\x97\xbd\xd3\x59\x7a\xda\xf9\x10\x9f\x11\xc6\xc6\x45\x68\x5d\x82\xf2\xa1\x86\xe8\xa1\x86\xe9\xa1\x44\x75\xbb\xf3\xa1\xa7\x90\x08\xc9\xc9\xeb\x71\xa7\xdb\x3d\x40\x29\x71\xad\x5b\xf1\x2a\x4e\xa5\x55\x71\x2a\x1b\x15\xa7\xb2\x53\x71\x2a\xbb\x15\xa7\xb2\x57\x71\x2a\x9b\x15\xa7\xb2\x55\x71\x2a\xdb\x15\xa7\x52\xab\x38\x95\x7a\xc5\xa9\xac\x57\x9c\x4a\xb3\xe2\xd0\xd5\x66\xc5\xae\x38\x95\x5f\xaf\x38\x95\xeb\x15\xa7\x72\xbf\xe2\x54\xee\x54\x9c\x0a\xa9\x38\x15\xb7\xe2\x54\x1a\x15\x07\xff\x0b\x2b\xb2\x9a\x59\x50\x71\x2a\x93\x90\x66\x0e\x54\x6a\x12\xd0\x94\x7e\x94\x54\x9c\x4a\xea\xd3\xe7\x37\xc8\xa4\xe2\x54\x82\x30\xad\x38\x95\xb7\xa2\x01\x2d\x14\x8d\x2a\x4e\x65\x16\x9d\xa8\x62\x3e\x2b\xe7\xb3\x82\x3e\x2b\x49\xe7\xaf\x8a\x53\xa1\x7a\x02\x83\x46\xdf\xe8\x0c\xa1\x95\xe3\x79\x7c\xfe\x15\x27\x90\x8a\x53\xc1\x31\x51\x39\x38\x30\x54\x4a\xe6\xe2\x95\xa4\xb1\xe7\x24\x69\xdc\x72\x02\x67\x61\xaa\x96\xc3\x8e\xbb\x3f\xbc\xb9\xd8\x1f\x8a\x4d\x2e\x6e\xe0\x8a\xbd\x6e\x50\x1b\x1e\x5c\xef\x74\x68\xb9\xee\xf0\x80\x2f\x53\xc5\x49\x68\xbc\x35\x20\xab\x6b\x63\xcc\x7f\xae\x77\xe2\x1c\xe4\x0f\x06\xef\xa1\xee\x29\x55\x67\x6e\x1a\x91\x38\x30\xd5\xd6\xb0\xf6\xa8\x0d\xb7\x6b\x8b\x0e\xfb\x82\xeb\x43\xfa\x24\xb2\xe0\x57\xb9\x0f\x58\xf7\x98\xf1\xe2\xda\xb5\x66\x13\x79\x03\xd7\xe4\x62\x39\x3e\x39\xc5\xdb\x6a\x47\x21\x19\xc0\xc0\x4f\x31\x28\x08\xbf\xe1\x21\x08\x81\xad\xe1\xbd\x37\xa8\xce\xec\x9f\x82\x9f\xc2\x24\xea\xfb\x3c\xac\x11\x0a\x9b\xd6\x80\x7f\x1b\xfb\x09\xb0\x90\x11\x31\x15\xcc\x28\xb8\xb8\xb3\x96\x07\x2d\xf6\xde\x62\x33\x43\x04\x54\x2c\x49\x7a\x2e\x6e\x22\x5a\xc2\x87\xe9\x5a\xb3\x89\x1d\x83\x37\x9c\xe2\x55\xab\xba\xa9\x21\x26\x88\xf3\x78\x3e\x62\xd3\x4c\x18\xa5\x40\x16\x41\x92\x06\xe1\x48\xac\xa2\xae\x31\xf3\x04\x46\xa1\xa7\x00\xc8\x00\x82\x14\x58\xb4\x80\x98\xf8\x47\xb4\x65\x21\x59\xa4\x18\x01\x04\xfc\x44\x0b\x25\x82\xfe\x59\x0c\x0e\xed\x80\xd3\x8e\xbb\x7f\xca\xd0\xeb\x2e\x84\x4b\xf0\xfe\xa9\xec\x02\x6e\x95\x33\xbb\xa1\xd3\xe9\x88\x12\xdd\xd3\x03\xb5\x90\xc4\xde\x60\x1d\x25\xdc\xc0\xf4\x7c\x72\x11\xc8\x2e\x2f\x31\xd7\x75\x67\xca\x6e\x4d\xa1\x74\x3a\x75\x4f\x9a\xa8\x19\x48\x5c\xf2\x65\x30\x11\x30\xd9\x86\x76\x26\xc3\xe9\x4c\x5a\x4d\x02\x8e\x09\x6f\xe0\xcd\x12\xc6\x12\xc6\x18\x86\x75\x71\x9e\x03\xbe\x0d\x7d\x5e\xb6\xa5\xf8\x92\x63\x3f\xfb\xdd\xb0\xf2\xd0\x15\x4a\x36\x03\x4d\x2b\x35\x5c\x60\xb6\x2e\x25\xdd\x41\xb6\x6d\x1a\x89\xf2\x19\x4e\x67\x44\xa1\x94\xfb\xac\xec\x6d\x0c\xa5\x5c\x06\x9a\x98\xd9\xb0\x40\xbd\x10\x87\xff\x84\x2c\xd4\xc8\x0f\xc2\x99\xa3\x8f\xfe\x42\xeb\x61\x92\xc6\x9d\xee\x87\xdc\x0a\xa8\xcc\x82\xe8\x3c\x46\x1f\xb2\x86\xc1\x59\xda\xa7\xbd\x71\xad\xd9\xbc\x6f\x7a\xf2\x53\xed\x89\xd0\xd1\x9c\x8e\x09\xf4\xc8\x28\x08\x51\xc5\xa2\x72\x61\x98\x92\x18\xc7\x36\x62\x23\x20\x05\xe1\xec\x41\x1a\x77\x82\x70\x26\x81\x1f\x91\x53\x6d\x8f\x0d\xab\xeb\x47\xf3\x30\x25\x71\xc7\x55\xa6\xc9\xc9\x24\x3a\x21\x83\x0e\xea\x1d\x32\x95\x2a\x6d\xef\x45\x77\x28\x12\x7a\xde\x24\x25\x71\xd0\x3f\xea\xe0\x2c\xaa\x1a\x11\x93\xe3\x2f\x91\x53\xee\xce\xc0\xb0\x71\x16\x0e\xcb\xa0\x76\xdc\x18\xf1\x32\xb6\x70\x24\xbd\x21\x6b\x75\x43\x35\xc2\x8a\x7a\x8f\x3a\xcc\x31\x43\x93\xb8\xac\xb9\x79\x89\x8b\xbe\xad\xf8\xad\x1b\x1c\x74\x3a\x55\xa8\xca\x41\x28\x4e\xeb\xea\x1c\x78\xa4\xd0\xbe\x96\x90\x7e\x9b\x56\xb0\xe8\x58\x06\xf4\x7a\x70\xcb\x18\x7b\xf5\x96\x7d\xdb\x78\xf7\xda\x99\xfc\xf6\xfe\xe2\x96\xbb\xbf\xa8\xd7\x85\x64\x59\x5d\x50\xb1\x09\x8f\xc1\x73\x34\xd9\x83\x33\x9f\x12\x54\x14\x6f\xed\xab\x29\x98\x20\x21\xfd\x42\xe1\xc4\x45\x54\xad\x73\x44\x4e\x25\xf2\x72\x63\x94\xc2\xec\x74\xaa\x55\x51\x4b\xf9\x86\xd0\x1d\x3f\xac\xa6\x28\x92\x63\xba\x4a\x18\x70\x9e\xac\xd4\x38\x1d\x98\x97\x77\x60\xdb\xc6\x68\x67\x5c\x3a\x20\x8b\x8c\x84\x3d\x22\xa7\xb6\x9a\x10\xfb\x6c\xc2\x65\xbc\x2b\xd3\xe8\x0a\x0d\xc7\x3f\x16\x3a\xd0\x3e\xdd\x3d\xee\xd0\x81\x9f\x4b\xbf\x1f\x93\x0e\x5b\xdb\x74\xb1\xb8\xfa\x76\xad\xff\x60\x1c\x9d\x74\x50\x1c\x64\x8b\xcd\x62\x42\x15\x86\xae\xf2\xaa\x96\xa6\x42\xda\x87\x8f\x3a\xb3\xb4\x2f\xba\xee\x51\xbd\xbe\x8f\x76\xf6\x49\x14\xcd\x30\x02\x13\x1d\xce\xca\xe2\x99\xf6\xbb\x8f\x0e\x34\xd7\x15\x4c\xed\xd2\x35\xe2\x86\xb3\xa5\xad\x06\x0f\x24\x25\x10\x51\xfb\x3a\x4e\x1d\xb2\xab\x83\xa1\xc5\xc7\x28\x6f\xc8\xf5\x4e\x07\x6f\xdd\x92\x39\xca\x7b\xea\x88\x9c\xd6\x2a\x68\xfe\x8f\x52\x31\xd2\x65\x67\xf1\x61\x6b\xab\x69\x4d\x58\x28\xaf\xd1\xe6\x1b\xae\x8a\xc2\x69\x6c\x8b\x49\x30\x2e\xd0\xec\xca\x99\x2a\xac\x0b\x12\x4f\xa5\x0a\x91\xc1\x94\x6d\x99\x1e\x84\x7d\x4a\x21\xa7\xee\xd9\xa6\xc5\xb6\x88\x61\xcf\xa1\xc0\x95\x34\x5f\x55\xc5\x31\xe6\x75\x75\xcc\xba\x18\x2b\xb6\x38\xb6\x94\xfb\x0c\x5b\x89\x48\x47\x0e\xab\x70\x2b\x57\x45\xa4\x52\x9e\x14\x24\x08\x3a\x41\x5d\x0d\x43\x4c\x04\x8e\x04\x0a\x3c\x46\xf8\xfe\xdd\x63\x46\x78\xac\x17\x89\x4f\xa1\x30\xfa\x63\x2d\x67\x72\xfc\x32\xd4\x34\x7e\xcb\x8b\x76\xad\x3f\x94\x08\x57\x9d\xd1\xb2\x59\xaf\xb7\x94\xbf\x00\xe7\x03\xbe\xe3\x57\xc8\x1b\x99\x6d\x2f\x39\xd9\x15\xec\x4e\x6b\x58\x4a\x0e\x67\x9b\x03\x59\x97\x34\xb4\xbe\x73\x97\xc5\x4e\xff\xee\xb1\x60\x0f\x81\xaa\x97\xd9\x21\x31\xf6\x0f\x8a\xd0\x3e\xcb\xd3\xc4\xcb\xd2\x84\x2d\x2a\x97\x61\xdd\x7a\x0e\xda\x96\xd3\xb4\xb8\xae\x0d\xfb\xc3\x66\x53\x18\x62\xca\xfb\xe3\xfc\x16\x6d\x2c\xab\x65\xb3\xc8\xe3\x45\xe8\x09\x35\x5d\xde\x15\x64\x63\xda\x0b\xab\x53\x53\x19\x6a\xb5\x02\xdc\x96\x52\x69\x65\xa2\x6c\x69\x6c\x73\x5d\xab\x52\xb2\xcd\x92\x59\x8b\x1b\xa4\xf4\x33\x93\x7e\x4c\x60\x1a\xc5\x04\xd2\xb1\x1f\x4a\x43\x56\x14\x12\x07\x4e\xfc\x20\x85\xaf\x8d\xfd\xf4\xfa\xf5\xeb\x15\x5b\x63\xa3\x2c\x15\xf8\x6e\x15\x27\x19\x9d\xf4\xf3\x73\x02\x6e\x19\x5f\x42\xb4\xf2\x72\x05\xb5\x66\x54\x39\x83\xfe\xf5\xfa\x45\x79\x63\xf5\x0e\xd8\xce\x8c\xdb\xb1\x9f\xbc\x41\xfa\x2b\x90\xff\xbd\x93\x48\x58\xff\x18\xdd\x75\xa1\x1c\xb0\xd5\x2a\x33\x68\x1a\xd4\xce\x88\x88\xeb\x19\x11\x21\x04\xa5\xcb\x3d\x49\xb9\x86\x4d\x35\xea\x19\xad\x83\x90\x01\xea\xd3\x3d\x02\xfd\xb1\x1f\x8e\xe8\x04\x90\xc8\xb5\x26\x55\xae\x27\x7e\xc2\xcd\x9c\x10\x46\x27\x3c\x6f\xe2\x0f\x71\x75\x3d\xf1\x53\x0c\x53\x35\x20\x59\xd1\x32\x8b\xe5\x5a\x47\x9f\xcc\xca\xa5\xcd\x76\x46\x20\xc8\xbc\x85\x03\xa2\x50\xfa\x29\x7a\x77\x84\xa9\xa2\xac\x9b\x76\x8a\x04\xd5\x72\x16\xc8\x21\x56\xca\x13\x5a\x3d\xbb\x97\x16\x88\x9b\x7c\xb2\xd9\x7c\x09\x93\xcd\x5e\xf1\x64\xb3\xa7\x6b\x66\x92\xe2\x9d\x4e\xc7\xd8\xb4\xd0\xf6\x99\x65\x16\x6d\x46\xc2\x54\xdc\x90\xc3\xf9\x38\xa7\xe1\x78\x59\xd5\x46\x62\x57\x5c\x63\x32\xef\xdd\xb8\xc1\x14\x88\x4e\xa7\x5a\xaf\x16\x55\x6f\xe0\x97\x47\xa4\x5a\xab\x9e\x8f\x86\x3e\x71\x9a\x03\x6c\x0b\xf7\xd8\xc5\xdb\x8e\xf1\xe6\x19\x6f\x1b\xe6\x37\x36\x63\xe1\x30\xc3\xcb\x7d\xa3\x70\x72\x8a\xa1\x6b\x21\x24\x23\xbc\x33\x84\x2a\x63\xc3\x68\x1e\x0e\x14\xdd\xb9\xc2\xcf\xdb\xda\x6c\x0e\x22\x2a\x19\xc6\x54\x0e\x0f\xa3\x18\x6a\x6a\x99\xcb\xff\x68\x16\xba\xfe\xf0\x07\x03\x66\xb3\xa2\xa3\xd8\xef\x45\xc7\xe8\xa3\x85\x17\x0e\x4c\x49\x98\xd2\x71\x9e\x8e\x7d\x3e\xd2\xe3\x39\x3b\xe3\x2d\x9c\xe4\x78\x1e\x79\x84\x9e\x16\x8d\x42\xb8\xc3\xac\x58\xb5\x22\xa5\xd6\xcd\x2b\xb5\x3a\x5f\x2f\x51\xa3\xf2\x7c\xac\xed\x00\x22\xb9\x1e\x04\xa3\x90\x9f\xae\x42\xc6\x6e\x79\x9c\xb3\xeb\xba\x8a\x7d\xe1\xd1\x50\xd4\xd9\xcb\x94\xa4\xbc\xb6\x52\x20\xc8\x96\x8d\xee\x12\x5d\xef\x79\x54\xd2\x8b\x4e\x50\xca\x01\xe7\xea\xb5\x0f\xef\xf2\xfa\xdf\x36\x67\x8a\xed\xe7\x11\x77\xe7\xa8\xd4\x1b\x17\x17\xfa\xe5\x32\x3e\x3b\xa7\x09\x2b\x8f\x58\x99\x63\x36\x61\x86\x5f\x75\x61\x9c\x5b\x17\x97\xb4\xdb\xae\x48\x3d\x48\xd7\x8e\xa4\xc7\x6b\xd9\xfa\x51\xb9\xcf\xe0\x51\x6a\xbe\x6a\xdc\x92\x2b\x46\xbe\x44\x28\xd7\x52\xfa\xd1\x74\x36\x21\x2c\xe2\x8d\x16\x2d\x41\xa8\x24\x08\x9a\x29\x7c\x86\xbe\xc5\xec\x58\x17\x6b\x06\x2d\xa2\x4a\xf0\xcf\x05\x05\x55\xcf\x37\x9b\x45\x2e\xe9\x78\xc2\xff\xb5\x02\x8f\x21\xf1\x61\x99\xc3\xd0\x6b\xf9\xf3\xc4\xab\xdc\x1f\x8f\xde\x41\xd7\xa4\x7b\x90\x0a\xbe\xeb\xc7\x09\xe1\x33\xa6\x72\x78\xec\xb0\x64\xd6\xe6\x33\xcd\x51\x93\x4a\xc0\x0e\x73\x9d\x4d\xde\x20\xa3\x98\x10\xb6\x79\x06\xcd\xe6\x34\x1a\xe0\xee\x45\xdf\x9f\xf4\xe7\x13\x3f\x8d\x62\x9a\xcd\xef\x47\x49\x5b\xd6\xc6\xf7\x82\x44\xc3\x2d\x25\x55\x05\xb8\xdb\xde\xae\xdb\xe4\x07\xb8\xd6\xdf\x12\x2e\x16\xd6\xc2\x6e\xeb\x2f\xbc\x6f\x71\x87\xca\x1f\x0c\x54\x05\xbe\xd3\x33\xab\xf0\x6b\x3d\x3d\x6f\x12\x84\xcf\x89\x4d\x12\x84\x0a\x1b\xf6\x62\x60\x93\xfa\xcf\x5b\x43\xea\x6b\x35\xb0\x17\xa3\x86\x7e\x94\x8c\x4b\xab\x10\xae\x28\xd6\xa2\x26\x7d\x50\xac\xc5\xfa\xa2\xee\x99\x40\x92\x20\xbc\x38\x90\x9a\x97\x6b\xeb\x0a\x40\x2c\xaf\xb6\xb0\x9b\x96\x57\x37\xdb\x71\x47\x95\x0c\x9d\x98\x97\x65\x26\xbd\xa8\xe3\x39\x51\x3a\x26\x71\x27\xac\xc7\x4e\x7f\x1c\x05\x7d\xd2\x89\x95\xdd\x04\x13\x6e\x62\x0e\x5e\x8e\xe7\xc1\x24\x96\x8f\x95\x8f\x75\x09\xa9\xbc\xdb\x58\xf6\x9a\xb7\x1f\xdc\xec\x84\xca\xb9\xed\xda\x2c\x8e\xd6\x3b\xc1\xbe\xde\x8c\x59\x1c\x35\x4d\x4f\x1d\x8b\x55\xac\x35\x45\xa9\x04\xa5\xd4\xa8\x2f\xf4\xfc\x45\x63\x22\x18\x16\xb0\x87\xbd\xd0\x54\xc7\x34\x7a\xd7\x1f\x04\xc8\x10\xfb\x39\x4a\xb3\x81\x61\x56\x52\xde\x39\x96\xbc\x0b\x80\x9d\x89\x74\x16\x76\x2d\x9b\x54\xf7\xd6\x17\xb6\xdd\x6c\x69\x30\x07\xc1\x71\xc1\x58\x13\x43\xad\xa9\x0f\x35\x4a\x29\xad\x87\xa5\xc3\xbd\x15\x7e\xce\xbb\x4e\xe7\x12\x5e\xaa\xf2\xf6\xeb\x6f\x57\xf6\xcd\xce\xdf\xcf\x74\x57\x6b\xb5\x7e\xd2\x6a\x0f\xc2\x63\x12\x27\xa4\xb4\xfd\x5e\x53\xef\x8f\x49\x34\x52\x39\x83\x12\x36\x0e\xec\xa6\x7c\xf6\x5c\x9d\xd2\xd3\xa8\x48\x02\x09\xaa\x7c\x4e\xa7\xca\x74\x3e\x59\x92\x75\x5d\xcf\x7a\x3f\x33\x3e\x32\xd4\x01\x45\x1e\xe5\xac\x66\x85\x76\x5d\x7b\x8b\x6d\xc6\xe2\x46\x06\x8d\x8c\x06\x1d\x33\x94\xd4\x10\x09\x14\x26\x93\xe8\xc4\x19\x07\xa3\xb1\x43\x16\xd9\x11\x9b\xed\xb4\x49\x74\x42\xeb\xa6\xb9\xb5\xed\x1e\x56\x25\xf7\x36\x27\x0b\xe3\x94\xc2\x87\x61\x3b\x38\x33\xcd\xbb\x85\x9d\x3b\x8b\x4e\x3c\x77\xa1\x90\x22\x1a\x2a\x0b\x81\x08\x9b\xf3\xe9\x4c\xff\xe1\x62\xbd\xe3\xb9\xfb\x06\x40\xbd\xf7\xd1\x8d\xed\xbc\x26\x26\xf3\xa9\x30\xdc\x9c\xdb\xc4\x64\x3e\xad\x5d\xb8\x89\xc9\x7c\x6a\xe0\x54\x20\x4a\x9e\x53\x42\xb0\xc9\xca\xac\xe4\x42\x12\xa2\xbe\x82\x84\x48\xe6\xbd\x25\x0c\x5e\xd7\x19\xbc\x70\xa6\x7c\xce\x36\xa6\x7e\xa6\x8d\xcb\xa7\x28\x0a\x94\x52\xc1\xb7\x16\x36\x93\xf2\x54\x6a\xfa\x19\x10\xbc\xc2\x52\x30\x8b\x75\x3e\x81\x37\xbd\x5d\x57\x6a\x9d\x6a\x57\x5a\x6a\xab\x4a\xed\x9a\x92\x24\xf1\x47\x44\xd3\xbb\x78\x4a\x87\xff\x9e\xa7\x06\x66\x95\xc0\xad\xe7\xbb\xdf\x8a\x9f\x79\xf1\x4f\xef\xcf\x93\x71\x49\xa0\xcb\x8d\x8d\x6d\x1e\x1e\x2a\x48\xde\x9c\xf8\x69\x4a\x42\x74\x8f\x2b\x09\x8b\xb9\xe5\xd9\xfb\x32\xe8\xd9\x7b\x63\x02\x3d\x9f\xae\x7e\xa8\xb6\x4e\x57\xf2\xdc\xe3\x65\x08\x0f\x0f\x1b\x43\x06\xed\x21\xf7\x11\x9c\xcf\x28\xb6\x68\x4c\x88\x09\xdb\xb0\x47\xe3\x02\xcb\x15\x84\xa3\x86\x0c\x96\x26\xa3\x9e\x65\x03\x58\x32\x07\x1a\x5a\x2d\x7b\x4a\x23\x51\xbe\xa1\xe7\x66\xf6\xcb\x33\x18\x90\x59\x3a\xc6\xec\x53\x7f\x11\x4c\xe7\x53\x11\xe3\x2c\x0a\xd9\x37\xa3\x54\x2f\x8a\x26\xc4\x0f\xcf\xa0\x3b\x8b\xc9\x20\xe8\xfb\x29\xe9\x18\x34\x39\x40\x50\x9a\x9f\xfd\x71\x74\x44\x06\x30\xc3\xfb\x80\x08\x0b\x9c\x59\x02\x31\x48\x1e\x60\x8b\x0f\xe0\x5d\xde\x76\x8a\x3b\xf7\xea\x44\xf3\xc8\xcc\x4f\x12\x78\x28\x6b\x7e\xc8\x1c\x72\x92\x46\x01\x15\xba\x2c\x0a\x51\xa7\x7b\xc0\x30\x0a\xc2\x20\x0d\xfc\x89\x08\x65\xc4\x4e\xf0\x15\x45\x89\x84\x77\xf9\x3b\x5d\x55\xd1\xf5\x09\x27\x1e\xe1\xae\x49\x0d\xf3\x8e\x22\xda\xb5\xbc\xf9\x16\x7e\x77\x18\xd5\x1c\x90\x68\x3a\x20\x5a\x26\x82\x71\xa9\xa0\x5d\x01\x8f\x53\xc8\x2e\x21\x63\x11\xa1\x58\x48\x2a\x5e\x9b\x16\x2f\x4b\x02\x84\x27\x4f\xc0\x52\x6f\x1d\x93\x2b\x79\x84\x31\x6c\x26\xcd\xa8\x82\x37\xf1\xeb\xf8\x78\xd4\xad\x5a\x8d\x55\x7e\x13\xcc\x70\x4f\x14\x2d\x71\x89\x11\xe2\x20\x76\x9e\x65\x8c\x28\xc6\x32\xb7\x58\xc8\x2e\x89\x07\x8b\xfd\x9e\xb9\x4a\x40\x64\x35\xc2\x6b\xe1\xd5\x0c\x2c\x8e\x1e\x99\x9c\x0a\x02\xb3\xca\x12\xb0\x92\x79\x82\x52\x83\x8e\xb0\x34\x62\x71\x08\xd9\xd5\x41\x93\x60\x1a\xa4\x89\xdd\x50\x91\xb0\x34\xea\xcb\xfb\xa1\x66\x2c\xce\xe2\xf2\x1e\x28\x8d\xe3\x25\x65\x01\x27\x9c\x03\xdc\x59\x48\x86\xd6\x02\x33\x90\xd8\x75\x01\x3b\x1b\x2f\x8b\xb3\xa0\xf0\x51\x12\x77\x42\xe9\x41\xb3\x8a\x62\x66\x15\x04\xef\x93\x8d\xdc\xcf\x2d\x81\xb7\x9e\xef\x0a\x36\xda\xd9\x0f\x4e\xa7\xbd\xa8\xec\xbe\xb4\xbd\x0d\x29\xf9\x5e\x8f\x47\x73\x2a\xbf\x92\x92\xac\x2d\x77\x4f\xcb\x4b\x45\x4f\x71\x3e\x6f\x97\x8b\x47\xf8\xfc\x3c\x98\xa4\xf5\x20\xe4\xfc\x16\x93\x21\x89\x49\xd8\x27\x49\x43\xde\x6b\x36\x8b\x89\x3f\xa0\x6c\x2d\xb1\xe4\x0f\xb7\xf9\x43\x23\x48\xee\xe0\x91\xf6\x07\x32\x2b\xb4\x95\x0f\xde\x7e\xf6\x6a\x81\x60\x08\x0f\xb1\xba\x87\xcc\x73\x71\xa8\xc9\xf3\x87\xbe\x68\xe2\x43\x88\x30\xe0\x2f\x44\xb1\x1a\xf6\x65\x82\x77\x5d\xdc\x63\xf6\x9e\x8c\xcc\x29\xbc\x0d\x33\x22\x46\x0a\x3b\x21\x64\x1e\xa6\x31\x62\x62\x20\xa5\xa1\xe4\x30\x3e\x7b\x88\x4e\xa0\x0f\x33\xb2\xc7\x18\xf6\x7c\xf8\x21\x0f\x72\xa6\xe2\xdd\x20\xbe\x3c\x79\xa2\x77\xa2\x4a\xc5\x2e\xbb\x7e\xdd\xca\xd1\xfa\xc6\x0d\xde\x1a\xf1\xd0\xcd\x66\xa1\x12\xa5\x88\x65\x0d\xcc\x0a\x98\x76\x95\xd0\xfb\x2b\x4c\xd9\x6f\xf9\x65\x57\xf8\x79\x9b\x9b\x22\xf8\xa3\x9f\x90\x7b\x38\xf3\x90\xb2\x09\xdb\x73\x5b\x5a\xe6\x72\xa0\xbb\x5b\x1b\x5a\xbe\x07\x51\x9c\x7e\xbe\x8c\xc7\x77\xb7\xf4\xfa\xbf\x82\xbe\xfa\x25\xa3\xc6\x13\x95\xe3\x0d\x33\x31\x79\x4b\x5c\xf3\x55\x06\x79\x4b\x8c\x32\x8c\x19\x9a\x96\xa2\xe0\xae\xac\x85\x44\xf1\x80\xc4\x9f\x3f\x65\x5a\x48\x34\x4f\xd9\x89\x00\x18\xcd\xfd\x78\x90\x9c\xab\x72\x3c\x11\xb1\xb1\xfb\xd1\x64\x42\x18\x6b\xd2\xfa\xb4\xd7\x34\xe2\xb3\x3f\x41\x1b\xab\x31\x61\x8b\x70\xa9\xdd\x03\x0e\xa8\x7b\xf0\x84\xb9\xfd\x76\x0f\xce\x44\x31\x92\xb0\x59\x5c\xbe\xa5\x11\x24\x54\x55\xea\x9d\x1a\xc0\x54\x41\x6c\x13\x2b\x85\x19\xf9\x3b\x6d\xb0\x84\xf2\x70\x35\x0d\x80\x96\x5f\x32\xfd\xbf\xc3\xa8\x67\xa9\xf6\x3a\x0a\x51\x87\x57\x5c\x34\xe5\x63\xec\x54\xd9\xa2\x8e\xe4\x69\x4b\x26\x8a\x00\x95\xb7\xb5\x7c\x6d\xe8\x8a\x9e\x3f\x70\x14\x7b\x59\x3a\xa3\xdb\x5a\x90\x55\x31\xfd\x73\xde\x36\xd0\x94\x63\x8f\x4f\x9e\x47\xe4\xd4\xd1\xfa\x4d\x57\x09\xfa\x31\x45\x21\xf0\x0b\xf1\xd4\x20\x89\xb4\x5c\xb0\x69\xf1\xc1\xd2\xe7\x53\x71\x6f\x3d\xcf\xf3\x21\x54\x45\x3d\xd5\xb6\xac\xd2\x81\x2a\x12\xad\xda\x06\xae\xb4\x38\x50\x45\x28\xd5\x36\x97\x50\x67\x78\xfb\xad\x11\x3d\x56\x8d\x51\x39\x93\x4b\x24\x99\x70\x77\x80\xd9\xb3\xcc\x40\xe9\x99\x61\x68\xe6\x95\xdd\x29\xea\x2b\x9b\xb0\x39\x53\x14\xc8\xbe\xe7\x0b\xda\xcf\xc2\xf2\x27\xe4\xae\xdf\x2f\x5d\xad\x6c\x6e\x99\xf3\xf0\x97\x83\xa3\x72\xd1\xb7\xfa\x5a\x65\xea\xcf\x94\x84\xd0\x97\x2a\xa2\x67\x21\x19\x47\x71\x3a\xf6\xc3\x97\x27\x34\x94\x80\x58\x79\xdd\x71\xde\x68\x9f\xfa\xb3\xd9\x92\xd1\x9e\x1d\x42\x26\xbf\x17\xeb\xf4\x72\x0c\x6a\x1d\x62\xe9\xc3\xec\x36\xb0\x99\x5a\xa5\xc9\x18\xac\x6d\x8c\xa2\xbb\x06\xb2\xd7\x2f\x33\x80\xb9\x42\xca\x47\x0f\x55\x45\xcd\xd1\x98\x2f\x28\xf8\x7b\x65\x0d\xf5\x2d\x7f\x56\xc0\xec\x2b\x87\xac\x5e\x89\x03\x13\x1c\xce\x0f\xf9\x41\x92\x79\x42\x12\x78\xc8\x87\x6b\xfc\x90\xf2\x0b\x53\xfa\x68\x57\x52\x60\x4a\xee\x63\x79\xec\xd1\x87\x78\xce\x83\xdf\x82\x90\x28\xa9\xc6\x46\x79\x22\x77\xe9\x83\x18\xfa\x51\x1c\x93\x64\x16\xe1\x2d\x7f\x14\x1e\x5b\x8a\x5e\x6e\x09\x4e\x71\x29\xe1\x60\xd1\x02\x93\x83\x55\x6b\x54\x33\x96\x33\x30\x6f\x60\x01\xcf\x72\x31\xc8\xd7\xa7\xa2\x3e\xc5\xb1\xe5\x6b\x4e\x96\x40\x31\xb0\x64\xb1\x7d\xb5\x86\xe4\x7e\xc7\x75\xc1\x67\x6c\xbd\xa8\x16\x3c\xc6\x7b\x43\x2e\x7f\xb4\x85\x0f\xe6\x28\xe7\x2a\x86\x79\x01\x63\x3d\x7f\x24\x61\xde\x9e\xd7\x93\x3e\x61\xf7\x38\x96\xe9\x5b\xdb\x9a\x84\xfc\x4a\x42\x06\xd0\x3b\x35\x94\x26\xaa\xeb\x33\x58\xea\x8a\xd6\x19\xbb\x18\x3d\x20\xa8\x71\xf8\x6a\x55\xe0\x87\x38\x8f\x50\x58\x78\x7a\x29\xc5\x85\x07\x76\x71\x3a\x26\x53\xc1\x5c\xf7\x86\xf0\x90\xcd\x34\xb8\x22\x98\x87\x78\xc0\x6a\x18\x90\x81\x83\xe7\xa2\xb8\x55\x84\xd6\xc9\xb5\x93\x20\x04\x5f\x36\x85\x71\x0b\xbc\x43\xab\x3a\x09\xf0\x32\xf9\x75\x76\x46\x6b\x78\x0a\x7e\xa8\x06\x45\x65\x40\x92\x7e\x05\xa5\x38\x7d\x92\xc5\xa1\xe2\x8b\x74\x05\x55\x31\x22\x05\x17\x0d\xcd\x11\xb2\xc2\xf0\x10\x32\x9f\xaf\xad\x28\xbf\xf3\x47\x45\xc3\x46\x61\x01\xda\x10\x96\x1f\x9f\x96\x97\xe2\xab\x2c\x43\x8f\xd4\xd4\x41\xd6\x78\xa5\x40\x62\x2b\x09\x9d\x4f\x79\xaf\x9d\x66\xc6\x99\x30\x95\xe9\x33\x85\x26\x5b\x82\x10\xad\x0c\x51\x8c\x80\x1e\x32\xdc\xb2\xc3\x70\x35\xad\x62\xc9\x1c\x12\xf5\x1e\xdd\x51\x2a\x18\x2b\xde\x90\x1a\x92\xc8\x94\x8e\xf5\x4c\x14\x76\x2e\x8f\x1c\xec\x1a\x44\x11\x09\x5f\x80\x41\x6c\xbe\x2c\x33\xe2\xab\x2e\x16\x56\x30\x21\xc9\x39\x2f\x3b\xce\x2c\xad\x5e\x6e\x5a\x72\x74\xc4\x79\x9a\xad\xec\x4d\x85\x41\xe1\xd9\xc5\x94\x1d\x03\xd7\x82\x8b\x74\x55\xf4\x7b\x65\xbc\x61\x08\xb2\xce\x13\x00\x0c\x23\x57\xa6\x34\xac\x83\xc5\x73\x77\xa0\x4a\xc7\x49\x15\x6e\x43\xdd\x83\xb6\x0c\xb9\x2e\xcc\x39\xcd\x26\xbc\x19\x2c\xd8\x0d\x17\x0f\x51\x3e\xff\xff\x28\xa7\x3c\x84\xde\x7c\x24\xee\xee\xf8\xff\x3f\x00\x12\x8e\xa8\x64\x27\xd3\x1e\x19\x0c\xd8\xe0\x7d\x7d\x10\xf5\x08\xf8\xb3\xd9\x24\x60\x67\x22\x93\x35\x7e\x9b\xb3\x9f\x42\xdf\xc7\xc9\x2e\x48\x1d\x76\x94\x05\xfa\x24\xc6\xcb\x28\xfb\x41\xdc\x9f\x4f\xd9\xc5\x0b\xec\xaa\xe3\x59\x1c\x1d\x07\x03\xe6\x14\x82\xa7\xe6\x99\xe8\x19\x46\x31\x83\x27\xf8\x13\xc5\xcf\x43\x64\x91\x87\x0d\x78\x40\x08\x8c\xd3\x74\x96\xb4\x9b\xcd\x51\x90\x8e\xe7\xbd\x46\x3f\x9a\x36\x1f\xf9\xc9\xf8\x88\x84\x7e\xd2\x64\x27\x68\xfa\x51\x4c\x9a\xb3\xf9\x64\xd2\xf4\x5a\x9b\x3b\x0c\x20\x65\x7a\xf4\x4b\x1e\x90\xd4\x0f\x26\x54\x00\x40\xb3\xc9\xbe\xbd\x37\x16\x11\x9b\xd8\xdd\xaa\x78\x54\x54\x13\x79\x41\x08\x5f\xdd\x45\x4c\xd8\xb8\x66\x74\xe1\x20\x0c\xa4\x7a\xf3\x51\xd2\xe8\x8f\xe3\x68\x1a\xcc\xa7\x8d\x28\x1e\x35\x67\xcd\xe3\xdd\x66\x90\x24\x73\x92\x34\x59\xd5\xb7\x83\x41\x67\xcf\x2d\x44\x88\xf7\x27\x1f\x36\x8c\x79\xea\x7c\x80\xe0\x5b\xf1\x14\x94\x19\xb5\x05\xf3\xd0\xf3\x47\x12\x0e\x92\xa5\x06\xb8\x9d\x1d\x6d\xfa\xb9\xc3\xf0\x49\xa4\x55\x3c\x52\x53\x47\xd1\x0c\x70\x71\xa3\x55\x81\x38\x5d\xcf\xcb\xdf\xe2\xfc\x97\x14\x98\xcc\xf0\x55\x2c\x2f\x95\xd4\xe0\x7a\xaa\xb6\x62\xa3\x62\x80\x21\x72\xbd\xd3\x31\x97\x72\xdc\x86\x7d\x2f\xe1\x21\x09\x85\xed\x15\x73\x4a\xdb\xa0\xa3\x1d\x38\x9c\xdc\x4b\xde\x9e\xe3\x85\x37\xdc\xf6\xdd\xe9\xe0\xa5\x1c\x99\x3c\xef\x92\xe1\x84\x2c\x82\x63\x62\x64\x64\xb8\x99\x39\x65\xa7\x8a\xfe\x95\xeb\x5e\x89\x61\x94\x8e\x75\x0c\x19\x69\x4b\x30\xc4\xbc\x1c\x43\x96\x31\x8f\x21\xe6\xd1\x31\x54\x19\xd9\x34\x63\xe6\xcc\x63\xc8\xdd\x3b\xd4\x6d\x10\xd6\x75\x55\xef\x8d\x1b\x70\x5d\x2f\x47\xdf\xf5\x96\x4a\x6b\xe1\x2d\xd1\x17\xdc\xb4\x48\xff\xac\x4c\x4e\xa3\xe9\xe2\x5d\xa1\x2e\xeb\x2a\xaa\xb9\x00\xb0\xc8\xb6\x1c\xac\x59\xf0\xba\xc1\x20\xcb\x33\x5f\x37\x3b\x3f\x67\xdb\xf0\xf6\x33\xf7\x67\x71\xe8\x12\xfd\x4c\xf3\xb3\x84\x64\x84\xbb\x59\x44\xb8\x7c\x4e\x03\xe9\x0c\x57\xca\xba\x8a\x6a\x2e\x00\x2c\xb2\x2d\x07\x9b\x21\x5c\x96\xca\x4b\x32\x5f\xcf\x12\x35\x43\xb8\xba\x57\xb8\x1d\xe2\x2e\x15\xc7\x52\x28\x14\xc8\xe3\xe7\x8b\xdf\x28\xad\x2b\x8b\x34\x26\xd3\xf9\xb4\xd4\xba\xbc\xad\x59\x77\xbf\x90\x96\x19\x62\xa4\x11\xf8\x22\xa6\x5a\x2a\xe3\xe7\x29\x61\x52\x53\xec\xc9\x32\x06\x51\xab\xd8\x06\xae\x10\xf8\x8a\x36\x48\x00\xdd\x78\xa9\xde\x8e\x1b\x05\xa7\xa8\xef\x3f\x94\x62\xe4\x21\x8b\x75\x40\x49\x4b\x06\x72\x52\x48\xe8\xda\xba\xcf\x1e\x83\xb0\x4f\xc0\x6d\x78\x0d\x17\xdf\xa7\x54\x33\x89\xdf\x19\xc2\x21\xbe\xf6\xfd\x94\x8c\xa2\xf8\x14\x3d\x0d\x56\x5b\xef\xe6\x2d\x37\x72\x76\x58\x37\x27\x06\xa3\x89\x2c\x2b\x59\xf8\x74\xf9\xcf\x11\x3d\x6c\x4c\xfd\x85\xd5\xdd\x74\xa0\xe5\xc0\xae\x03\xdb\xa8\x1b\xae\x53\x0d\xa1\x73\x0b\x76\xcd\x5c\xc6\x37\x49\x00\x73\x6e\xa1\x19\x11\x51\x63\xb7\x84\x25\xe1\x2d\x39\xda\x2a\x98\xdd\x85\x76\xdb\xe0\x0a\xb1\x90\x16\xbd\xea\x70\x36\x60\x79\x8d\xcd\xa7\x22\x2e\x9e\xfa\x8b\x02\xc6\x7d\xbe\xe8\x77\xc6\x4d\x36\x6b\x6b\x6b\x6c\xe1\xd4\x60\x78\xdc\xe7\xcb\x1a\x4b\x82\xa9\x1c\x1e\x92\x84\xdd\xfc\x59\x71\xf8\xa2\x63\x32\x27\x6d\x0c\x2b\xb2\x86\x76\x54\x3a\x14\x0e\x47\x24\x7d\x3b\xe8\x93\xf7\x82\xfe\xd1\x57\x99\xc6\x51\xb6\x48\xde\xa3\x65\xce\xa9\xb5\x3a\x22\xa9\x02\x55\x65\x15\x93\x70\x3e\x25\x31\x55\x09\x59\xed\x74\xc0\x8c\x48\xaa\x45\x2d\x1a\x91\xd4\xca\xd8\x68\xf3\x88\x35\x0c\xd8\xcc\xc8\x40\xdb\xb1\x02\x4a\x26\xa0\xab\x47\xcb\x4c\xb9\x10\x6a\xaa\x18\x86\x1a\x7e\x23\x9a\xfa\x41\xf8\x22\x09\xa7\x55\xa3\x10\xcd\xb2\xea\x2a\x5e\xd7\x2f\x91\x55\x79\xd6\xd2\x86\x40\x07\x0a\xb3\x98\xe9\x39\x3e\xd7\xb7\x90\x71\x30\x60\xa8\x80\xc1\x7b\x91\xd8\xdb\x36\x82\xf4\xaa\x37\xcc\xc6\x36\x62\x22\x0c\x2b\xeb\x40\x40\x33\x20\x0c\x3f\x8e\xd9\xbd\x68\xec\x95\xe2\x86\xc7\xe3\xd8\x2b\xd5\x02\x59\xb8\x1f\xf6\x4e\x0c\x34\x20\x8d\x4f\x69\x45\x22\x1a\xef\x61\xc0\x2c\x6c\x5d\xb1\x11\xce\xeb\x3c\xb0\x6c\x07\x0e\x93\x7d\xb8\x6e\x61\x05\xd6\x21\x0e\xdb\xa0\x11\x92\x45\x6a\xd9\x76\x63\x10\x85\xc4\xde\x57\xb5\x53\xec\x28\x66\xcc\xbd\xff\x30\x11\xe1\x51\xf8\xed\x6b\x37\x6e\xb0\xaf\xf2\xb2\xb4\x0e\x6d\x10\x8b\x2b\x03\x67\x70\x06\x7d\x0c\xb0\x63\x91\x38\x46\x48\x03\xd9\x28\x6c\x00\x89\x63\x9a\x6d\x18\x84\x18\x6b\xe7\x43\xde\x0c\x74\x9d\x38\x0c\x11\x7a\xd0\xad\x30\xfe\xac\x1c\xd8\xc6\x9b\x65\x9b\x45\x69\xa1\xc3\x81\xcd\x6f\xce\x3c\x24\xac\x7e\xc1\xdb\x3e\xab\x49\xc4\x4d\x92\xdd\xa3\xfa\x80\x96\xc7\xee\x6b\x88\xbd\x71\x3f\x8e\x6d\xfa\x45\x8b\xe6\xa9\x3b\x77\x64\x48\x4b\xd7\x58\x8c\x5f\xb3\x05\x0b\x7b\x5d\x82\xfa\x50\xbb\xeb\xf3\xbd\xd3\x19\xe1\xd7\xa5\xde\x0b\x8f\xfd\x49\x30\x00\x3f\x4d\xe9\x04\xce\x6c\xbe\x2a\x64\x52\x18\x85\x75\xac\x99\xae\x97\xc5\xf5\x8a\x15\x84\x7a\xb6\x0f\x67\x94\x38\xa8\x33\x7c\xf6\xf7\xd9\xdf\x2b\xf9\xb7\x0e\xbf\x36\x0c\x26\xe4\x9d\x63\x12\x1f\x07\xe4\x44\x1e\x90\x21\x90\x06\xfd\x23\x61\xc4\x88\x86\x90\xf4\x7d\xaa\xee\x7d\xf6\xf7\xd9\xdf\x2b\xf9\xb7\x0e\xbf\xe6\xcf\xd3\x71\x14\xc3\x22\x98\x90\x6d\xcf\x73\xc0\x8f\xfb\xe9\x78\x1e\x7f\xc6\xb4\x9f\xfd\xbd\xa2\x7f\xeb\xf0\x6b\x03\x2a\x6b\x5b\xae\xb7\x55\x77\xf7\xea\xde\xce\x67\xcc\xfa\xd9\xdf\x2b\xfa\xb7\xde\xe4\xab\xac\x79\x1a\x4c\xca\xcc\x0c\x1b\x5b\x3b\xd2\x34\xe1\xc7\x41\x3a\x9e\x92\x34\xe8\x97\xd9\x24\xb6\xdd\x82\xcc\x2d\x5c\x0a\x85\x29\x89\xa3\xd9\xbb\x2c\xef\x1b\x64\xe8\xcf\x27\xa9\xa5\xe5\xa2\x05\xe5\xfa\xa1\x24\x7b\xd4\x7b\xa4\xe9\xff\x51\xef\x11\xda\x90\x7b\x8f\x1a\x6a\xc1\x0a\xb7\x31\xbd\x0d\x1f\xc2\x80\x95\x6a\x63\x02\xd5\xde\xf5\x0a\xd2\xe8\x4e\x14\x26\xf3\x29\x55\xf4\xd5\xb2\x64\xe9\x7a\x45\xdd\xc9\x02\x1d\x70\xe9\x74\x14\xd3\xa6\xc9\x4c\xc2\x7c\x55\x76\x5f\x0b\x16\xe8\x06\xdc\x49\xa3\x1b\x1c\x68\x2b\x27\xfa\x49\x5b\xba\xf0\x54\x86\xc7\x30\x8e\xd0\xfe\xc5\x56\x21\xca\x68\x29\x35\x3b\x1f\x90\x5c\xc7\xfe\x84\x79\x3e\x4c\x83\x50\xb3\x60\x62\x04\x3e\xd3\xe4\x67\x5e\xff\x0f\x1f\xbe\xcd\x37\x8f\xa6\x41\xc8\x79\x03\x0f\xa7\xe8\x60\x8a\xf3\xfb\x0b\x3d\x7f\xa6\x0a\x61\x7f\x94\x36\xcb\xd7\x43\x89\xa8\x69\x1d\x1c\x91\xf4\xab\x74\x55\x76\x8f\x7f\xb5\x0e\x63\x32\x54\x3b\xf3\xf4\x0d\x99\xc8\x30\x07\x60\x26\x07\x84\x2b\x2f\x20\xf6\x1d\x96\x59\xde\x59\x0f\x88\xa3\x48\xf5\x0e\xa4\x8f\x26\xae\x02\xdf\xc2\x12\xd3\x20\x74\xe4\x26\x35\x4d\xc5\x12\xcc\x64\x88\x9b\xa2\x64\xc1\xce\xdc\x8a\x3b\xd8\x69\x45\xb7\x68\x06\xb5\xf7\xa5\x80\xd1\x62\x59\x50\xc2\xb2\xa3\x2c\x9f\x5d\x51\xc4\x91\x19\x0f\xd0\x74\x99\xeb\x5c\xdc\xc8\x4b\xc9\x0c\xe4\x75\x3c\xc4\x4f\xd0\xde\xab\x45\x58\xec\x91\xf4\x84\x90\x10\x75\xfc\xc4\x61\x91\xc9\x3d\xd7\x81\x16\xfd\x7f\xab\xac\xbb\x21\x8e\xe6\xa3\xf1\x03\x0a\x5c\xeb\x46\x4c\x64\x55\xca\xc5\x03\x3a\xe0\x0c\xc8\x71\x80\x1b\x9d\xdc\xd7\x6b\x10\x0c\xf9\xe1\x01\xfa\x95\xe2\x49\xab\xbf\x13\xcd\xc3\xd4\xa8\xee\xf3\xc2\x03\x1f\x03\x2e\xbc\x21\x82\x3c\x01\xc0\xeb\x34\x41\x96\x14\x91\x98\x64\x18\xa8\x28\x86\x30\x32\x61\x51\x0e\x19\x51\xdc\xd1\x0f\x06\xb9\xe7\x4d\xbf\x9f\x46\x31\xbc\xae\x25\xc1\x10\xd3\x0c\x1e\x94\x8d\x7e\xef\x42\x04\x3d\x89\x18\x6e\x39\x86\x7d\x33\x8a\xa7\x7e\x4a\x89\x67\x49\x32\x3a\x66\x13\x9d\x1c\x96\x6a\x17\x55\x91\xfe\x66\x47\x5d\xe2\xaf\xf6\x62\x38\xbb\xb0\xbb\x61\x47\x41\x8a\x64\xa5\x8c\xac\xc9\xd5\x06\x97\x70\x8d\x11\x49\xdf\x90\x99\x14\x68\x74\x94\x40\x97\x00\x02\xe8\x8e\xa9\x9a\x65\xf6\x33\x6d\x31\xf2\xd9\xd4\x9f\x4c\x48\x92\xf2\x48\x5b\x9c\x42\x18\x18\x1a\x7a\xc1\x68\x44\xb8\x43\x83\xf4\x65\x9a\xfa\xa3\x30\x48\xe7\x03\x76\x5a\x2c\x0b\x97\xe3\x4f\x1f\xdf\xc5\xea\x3b\x1a\xc7\x35\x41\x1e\xf0\xa4\x9c\xaa\x1a\x29\xb0\xfe\xda\x98\x84\xe0\x33\x91\x31\xc2\x1b\x05\x06\x78\x76\x24\xf2\x53\xe1\xf4\x85\xbe\x59\x18\xdf\xa7\xdf\x9f\xc7\x7e\xff\x94\xe2\xc4\x1d\x48\xa6\xfe\x29\x65\xa6\x93\x38\x0a\x47\x1c\x11\x7f\x4a\xc2\xc1\x03\x0d\x1b\x8d\xb2\xd7\x3b\x1d\xf0\xe0\x76\x31\x7d\x79\x75\xa7\xec\x28\x6a\x9f\x04\x13\x4b\x35\xaa\x09\x6e\xc3\xdd\xb2\xa1\x96\xeb\x6d\x87\x7f\x69\x5f\x12\xaa\x57\x06\xd4\x53\xbe\xe6\x43\xc9\x86\x65\xcc\x21\xab\x31\x9b\xef\x94\xd2\xdf\x70\xe9\x36\xc7\xec\x6d\xbd\xbe\x36\x28\xc4\x55\xb2\xad\x8b\xb1\xbe\x21\xc6\xd8\x20\xc7\x88\x4f\x69\x76\x7e\x01\xf2\xc1\x9c\xd6\x90\x46\xf9\x1d\xaa\x52\xf9\xc5\x4a\x42\xc9\x9c\x35\x27\x60\x5e\x61\x56\x04\xb8\x40\xb4\x48\x29\x26\xa1\x62\x30\x3d\xca\x5b\x42\x14\x9c\x2b\xdc\x56\x97\x6c\x99\x39\x32\xfb\x57\x2c\x7c\xde\x0b\xfa\x47\xef\x0c\x1f\x04\xe1\x68\x42\xd0\x7a\x2e\x7c\x35\x24\xee\x19\x51\xa4\xb9\xb9\x25\x6f\x4e\x4a\x05\x09\xfd\x18\xf9\xa9\x76\x5e\x40\x0c\x60\xe8\xb0\x1d\xf7\x66\x33\xd3\xa9\xd3\x60\x30\x98\x10\xb5\x5b\xca\x11\xc6\x82\xfc\x9b\x3c\x85\xc7\x65\x1f\x43\xe1\xc6\x8d\x22\x14\xf9\x48\xed\x25\x5f\xc5\x6b\xbb\x59\x5c\x92\x5e\x62\x7a\x72\x60\xf4\x1e\x96\xe5\xa6\x7e\xce\x91\xcb\x3a\xc4\x37\x19\x47\xf3\x09\x15\xe4\x52\x68\x48\xa1\xc6\xf9\x4f\x9b\xbf\x82\x84\xcb\xbe\x98\xc9\x31\x8f\x03\xe4\x2d\x37\x46\xca\x0a\x12\x98\x9f\xf3\xaa\x83\x27\x30\x06\x45\x8b\x15\x64\x01\x8b\x9e\xc0\x48\xda\x44\x24\x6c\x87\xfd\xec\x67\x8f\x42\x72\x32\xdc\xca\x90\xe1\x5d\x71\x6f\xa3\xe2\x78\x21\x47\xe5\x98\x30\x5a\xcc\x0f\x77\x30\xea\x88\x97\x20\x81\x51\x4c\x30\xc8\xa1\x41\x16\xd9\x96\x2c\xb6\xba\x6b\x9e\xc2\x51\x79\xed\xc8\x89\xae\x08\x82\xa5\x06\x1e\xa5\x1c\x34\xa1\xc5\x7c\xe2\xb5\x83\x9f\x85\x1c\xb3\x1c\x1d\x39\x8f\xb2\x6c\xf7\xb8\x9b\xe7\xb9\x15\x0b\x01\x8b\xfb\x39\xb4\xdf\x71\x99\xd4\xe8\x47\xd3\x59\x94\x10\xdb\xd2\xd2\xa6\xfe\xcc\xb6\xd4\xe6\x47\x98\xdd\x01\x2c\xea\xf1\x64\x3e\xb5\x18\x46\x25\x2c\x25\x59\x22\x84\xba\x8e\x3b\xe7\x04\x7e\x5c\x40\xe2\x10\x53\x0d\xd5\x10\xdd\xc3\x90\xa2\x28\xdb\x66\x2f\xd7\x2f\x4b\x85\xac\x5a\x14\x94\xad\x0d\x70\xd5\x61\xe8\xf6\x45\x60\xe4\x5a\xa1\x6c\xc9\xb0\x0c\x4c\x89\x70\xbe\xb4\x7c\xbe\x94\xf2\x29\xdb\x72\x61\xe5\x53\x38\x55\x4b\xf1\xe4\xe4\x29\xc8\x75\xf7\x1c\x49\x0a\x66\x00\x29\x81\x51\xfd\xa4\xeb\x17\x5a\x6c\x15\xe9\x9f\xc3\x9c\xae\x45\xf9\xf1\x54\xb1\xdb\x78\x0b\x36\x99\x4b\x06\x4f\xef\x6e\x1e\x98\x2e\x72\x70\xdb\xfc\xd8\xa6\x0a\xeb\x9a\x29\x7e\x2f\xa8\x5c\xeb\xf3\x8c\xa9\x5c\x5b\x94\x71\xe8\x00\x08\xe9\xc0\xcc\x0c\xd5\xf3\x15\x6e\x81\xd8\xeb\x30\x25\x83\xc0\x9f\x9c\x37\x51\x45\xc1\x40\xb5\x06\x55\x50\x97\xb6\x22\x08\x13\xe1\xe1\x2b\xf8\xd3\x01\xd7\x98\x64\x28\x3c\x6d\x81\x48\xd5\x7a\x4a\x46\x8a\xfe\xad\x22\xc9\xe7\x6a\xb2\x8d\x7d\x5a\x3a\xb7\xae\x9d\x3f\x89\xb0\xbb\xf6\xac\x25\xe2\x86\x31\x8a\xed\x70\xc9\x8a\x55\x4e\x83\x70\x9e\xb0\xb0\x1f\xd1\xca\x55\x61\xa1\x73\xe4\x17\x42\x94\x79\x94\xd0\xc2\x5a\x93\x34\x0e\x66\x2b\x54\x84\xf9\x24\x10\x6f\xdb\x14\xe9\x3d\x32\x89\x4e\xc4\xd2\x48\x69\xa3\x3c\xbf\x62\x1b\x39\x77\xd2\x42\xf3\x59\x51\x09\xce\x65\xb4\x5c\xae\x04\xee\x95\x89\x42\x5a\x9d\x35\x09\xab\x46\xb5\x23\xde\xfb\x5a\xee\x5b\x9a\xf8\x55\x9d\x8c\x6c\xc5\xe2\x4a\xa3\xe4\x09\x09\x19\x30\xcf\xde\x63\x9c\x69\x75\x1e\xcb\xe8\x32\x6c\x15\xd6\x30\x0e\x4f\x5e\x50\x18\xe4\x07\x09\xc5\x3e\x3b\xd3\x6a\x8d\xb8\x59\xde\x88\x09\x49\x12\xde\x88\xbe\x1f\x16\x36\xe0\x84\x08\xf4\xfd\xc1\x00\x92\x68\x4a\xe8\x43\x40\x6b\xf7\x27\x72\x10\x82\xd6\x2b\x38\x62\xc0\x85\xdb\x1a\x75\x8d\x71\xaf\x70\xa3\x6b\x2b\x9e\x89\x71\x96\xc1\x10\x0a\x90\x96\xdc\x36\x3b\xb0\x0c\x70\xd6\x60\xc3\xda\x4d\x7b\xa3\xcd\x04\xf8\x9a\xd0\xce\xdf\x0a\xc2\xb2\x05\xde\x0a\x83\x44\x4c\xf2\x0a\x29\x31\x54\xb4\x1a\xfc\x45\x49\x0d\xab\x2b\x11\x9c\x4a\x02\x38\x6d\x1d\xd5\x07\x0a\xd5\x01\xd6\xa1\xb9\xd9\xb8\x54\x3d\x70\xd4\xe4\x3e\xa5\xc4\xc8\x29\x08\x98\xa1\x5d\x62\x24\x7c\xd5\xd6\x5f\xc5\x2b\x2e\xd3\x57\xe9\xcd\x10\xad\x8f\x1b\xa6\x8d\x72\xb3\xd8\x46\xb9\x51\x6c\xa4\xdc\x2c\x34\x52\x6e\xea\x46\x4a\x45\x89\xc2\x69\xda\x33\xa7\x69\x6f\xd9\x34\xed\xd1\x69\x7a\x5b\x08\x34\x93\x58\x85\xc0\x5b\x26\xf0\xd6\x32\xe0\x2d\x0a\x1c\xfd\x8f\xf8\xc4\xf9\x96\x0c\x9a\x2f\xe7\x78\x4d\x88\x31\x92\x4b\x8d\x44\x93\xc5\x53\x7f\x61\x69\x72\x4b\x53\xc3\x0f\xb3\x36\x62\xa6\x28\x98\x66\xe3\xae\x60\xc6\x03\x49\xef\x5c\xb9\x22\x43\x72\x36\x8f\xde\x61\xfd\x28\xe6\x7d\x96\x83\xa4\x75\x20\xcd\xc5\xfa\x30\x9f\x8b\x77\x28\x95\xaa\x02\x58\xa7\xc3\x4b\x64\x56\x0a\x85\x4b\x7b\x56\x68\x89\x76\x27\x65\x55\xb3\x09\x5f\x20\xa9\x32\x19\xe7\x15\x2d\x41\x4d\x63\xd2\x80\x4e\x66\x12\x11\x35\x32\x1c\x1d\xd6\x47\xd9\x5a\x1d\x73\x8d\x6c\x82\x6c\x28\x19\x29\xa5\x64\x3e\x13\xff\x60\xe4\x63\x54\x2c\xc8\xc7\xed\xf1\x32\x56\x52\x52\xa6\x32\xe0\x4a\x08\xdb\x21\xe0\x4b\xc8\x35\x70\x1b\x1e\xac\x73\x15\x9c\xcf\xf1\x4a\xc8\x4b\xc3\x3e\xdc\xd6\x97\x7c\x31\xc1\xf8\x8e\x36\x5b\x54\x26\x74\xd2\x39\xe6\x8e\xa5\xfa\x9e\x92\xe9\x0c\xc9\x24\xc4\x96\x29\x21\xb6\x8b\x25\xc4\x56\xb1\x84\xd8\x2e\x94\x10\xdb\x9f\x49\x88\xd5\x24\xc4\xc6\x65\x45\x44\x91\x1c\xcf\x01\x5f\x4d\x46\x6c\xae\x24\x23\x36\x5f\xa2\x8c\x28\x5f\x68\x71\xfc\xea\xbc\x39\xb8\xdc\xea\x97\x2f\xb5\xdc\x2b\xb5\x91\xf0\x56\xd7\x20\xe4\xc3\xb3\xdc\xbc\x61\x48\x00\x66\xe4\x40\x34\xed\xc6\x30\x98\xa4\x24\xd6\x6a\x21\x61\x1a\x9f\x66\x6a\xc2\x34\xba\x24\xe3\x55\xde\xb8\xc1\x93\x6e\x0a\x82\xe7\x03\x9b\x5c\xa5\x60\x50\x5e\xd2\x5c\x46\xec\x38\x59\x05\x5b\x88\x8b\xdd\x62\x71\xb1\x53\x2c\x2e\x76\x0b\xc5\xc5\xae\x2e\x2e\x5e\xa1\x51\x9d\x1b\x04\x5b\x97\x1d\xae\x45\x42\x35\x07\x7c\xb5\xe1\xba\xbd\xd2\x70\xdd\xbe\xc8\x70\xed\xb2\x0c\x07\xc6\x00\x3c\x4f\xa4\x5d\xf1\x30\xcd\x8c\x99\xee\x41\xa3\x8f\xf1\xdb\xac\x02\x37\x88\x73\xa6\x54\x53\x35\x80\x3a\xb8\x8d\xbd\x3d\x73\x46\xb5\x1d\xd6\x68\x7f\x71\xf0\xfc\x83\x88\x22\x5e\x74\x54\x60\xd9\x31\x02\x5d\xea\x90\x69\x14\x3c\x26\xb6\x55\xa0\xc2\xdb\xfb\x02\x7a\x19\xe4\x55\xa0\x9e\x07\x71\x85\x53\x11\x66\x96\xf3\xeb\xd1\x25\x48\xfe\xac\xc8\xf6\xf3\x05\x67\x7d\x41\xc7\x9a\x56\xf0\x31\xe2\x6b\xd1\x67\xff\xf6\xdf\xfe\xf2\xf7\xfe\xe8\xd3\x1f\xfd\xe8\x93\x1f\x7c\xeb\xd9\xf7\x7f\xfc\xec\x77\x7e\xf8\xe9\xcf\xff\xfb\xb3\xbf\xfe\xcf\x18\x4f\x03\xad\x41\x6e\xc3\xdd\x33\xff\x76\xed\x8e\xdb\xf0\xf4\x63\x72\x62\x7d\x1a\xce\xa7\xdc\x50\xfc\xe9\x3f\xfe\xee\xd3\x6f\xff\xc5\xd3\x6f\xfe\xac\x28\xdb\x2c\x26\xfd\x00\x03\xb0\x7e\xf2\x3f\xff\xf1\xe9\x4f\xff\x4b\xa1\xeb\xc0\xb3\xef\xff\x98\x15\xd7\x96\x86\x0c\xa3\x70\x3e\x55\x92\x5b\xc1\xba\x1a\x9d\xcc\x6b\xe9\xa3\xa8\x86\xb7\x25\xb0\x6d\xba\x70\x3e\x6d\xa4\xd1\x7d\x51\x9f\x25\x6b\xb6\x0d\x63\xff\xd3\xdf\xfa\xf3\x67\xbf\xff\xd7\x8c\x96\xcf\xfe\xf0\x47\x4f\xbf\xf7\x5f\x3e\xfe\xc9\x4f\x9f\xfd\xaf\x1f\x7e\xf2\x1b\x1f\x7d\xf2\x3f\xfe\xe1\xe9\x9f\xfe\x3b\x73\x71\x6f\xd0\xce\xa4\x9a\xa0\x88\x5c\x75\x33\x70\xcf\xfe\xf0\x47\x19\x70\x4d\x51\xb7\xe9\x8d\xfe\xf1\x4f\xbe\xf9\xf1\x4f\xff\xf8\xe9\xb7\xff\xfb\x27\xbf\xf7\x5f\x3f\xf9\xc1\xb7\x3e\xfd\xc5\xf7\x3e\xf9\xe1\x1f\x3c\xfb\xfd\x8f\x9e\xfd\xcd\xf7\xd7\xf2\x1e\xbf\x6b\x85\xfe\x94\xd9\x70\x8c\x9c\x10\xe6\xc1\xc2\xe6\xaf\x5b\xdd\x5a\xfd\xe0\xb6\xfd\xfe\x60\xfd\xfd\xc6\xfb\x83\xda\xbf\x68\x36\x52\x92\xb0\x9c\x6b\x00\x06\x7d\x3e\xfd\xf7\x7f\xff\xf4\xbb\xbf\xcf\x7a\xf7\x93\x1f\x7c\xeb\xe3\x9f\xff\xce\xb3\xef\xff\x18\x09\xf7\xed\xbf\xfb\xf8\x27\x7f\xfd\xc9\x3f\xfc\x5f\x4f\x7f\xf4\xd1\xd3\x6f\xfe\xec\xe9\xff\xf8\xd3\x8f\x7f\xfa\xef\x9f\x7e\xe7\xa7\xbf\xfc\x83\xbf\xed\xba\x0d\xcf\x01\xcf\xfe\xa7\x9f\x7d\x07\x9e\xfe\xe3\x1f\x3c\xfd\xad\x1f\x7f\xf2\x83\x6f\x3d\xfd\xe6\xcf\x3e\xfe\xc9\x4f\xf1\x3c\x67\x59\x21\xd7\x63\x1b\xf8\xff\xf4\xb3\xef\xc8\x62\xac\xc2\x8f\x7f\xf2\x53\xa8\x7b\x4b\xcb\xb2\xc2\x6e\x69\xe9\x56\x99\x95\x86\x19\xbd\x25\xff\xaa\x8e\x94\x46\x17\xd9\x68\xd3\xec\x91\xdf\xd4\x14\x5c\xee\xf7\x92\xa2\xfd\xd9\x4c\x24\x12\xcd\x9e\x5e\xb2\x13\x28\xb3\x7a\x39\x7b\xb8\xfc\xa4\xed\xd5\xc9\xa8\xf8\x7e\x2f\xb1\x85\x13\x09\x8f\x92\x6f\x33\x33\xac\x69\xb8\x53\x41\xb4\x44\x6f\xff\xf0\x3f\x52\xa6\x13\xbd\xfd\xf4\xc7\xdf\x7d\xf6\xfd\x1f\x7f\xf2\x1b\x1f\x3d\xfd\xde\xbf\x37\x3a\x3f\x47\x44\x9f\x13\x90\x12\xff\xbb\x3f\xfa\xf4\x5f\xff\x9c\x8e\xa2\xef\xff\xed\xb3\xef\xff\xf8\x9f\x7e\xf6\x9d\x8f\x3f\xfa\x33\x95\x88\x63\x41\x80\xc9\x91\x1a\x4a\x89\xcd\x26\x6d\x8d\xe6\xbe\xa2\x77\x92\xe2\x66\x0d\xdc\x86\x6a\x15\x6a\xe0\x43\x1b\xaa\x55\xa1\x77\x25\xfd\x80\x84\x69\x30\x0c\xfa\x10\x46\x2c\x7e\x97\x30\x46\xa7\xb1\xbc\x40\xb6\x4a\xaa\xb6\xb1\x17\xa1\x07\x33\xa7\x9d\x88\xa2\xe5\x5e\x98\x62\x29\x76\x4d\x6f\xae\x7c\x0d\x95\x0c\x4a\x6d\x11\x56\x8a\xc5\x06\x3d\x85\x0e\x60\xb1\xd9\x24\x48\xad\x6a\xa3\x6a\xba\x91\xc4\xa7\xba\x04\xa4\x32\xee\xb4\xeb\x89\x7b\x8e\xd9\x0e\x92\xec\xa1\x8f\x3f\xfa\xc3\x67\x7f\xf3\x7d\x26\x1c\xfe\xe9\x67\xdf\xf9\xf4\x2f\xff\xf3\xd3\xdf\xfc\x9b\x8f\x7f\xfa\x9b\x8f\x12\x96\xf6\xc9\x0f\xbe\xc5\xa4\xf4\x2f\xff\xe0\x87\xbf\xfc\x4f\x7f\x58\xd2\x59\x9f\xfe\xa7\xff\x46\x01\x95\x74\x66\x0f\xb4\x8f\x39\x1f\x31\xf8\xe4\x2f\x7f\x94\x39\xc0\x2c\xbd\x68\x1c\xe8\xe9\x41\x83\xd2\xd7\xa1\x03\x92\x70\x16\xeb\x1c\xbb\xc1\xc3\x9d\x51\x42\x38\x50\xad\x32\x92\xed\xab\x52\x9f\xcf\x97\xea\x9d\x53\x4a\x28\x8d\x65\x9c\x52\x2b\xfe\xd2\x33\x3a\x02\x11\x5e\x67\x18\x64\x5c\xb0\xfa\x72\x97\x58\xcc\x1b\xff\xf6\xff\xbe\x9a\x7e\xa0\x80\x4a\xfb\x41\xfb\x98\xef\x87\xa7\xff\xe1\x3b\x99\xf9\x76\x3e\xcd\x74\x41\x4e\x97\x2e\xa1\x8f\x53\x46\x1e\x46\x1f\x03\x4c\x96\x24\x6a\x62\xd1\xf9\x80\x7d\x85\x9a\x62\x8e\x9e\x48\xa4\xa2\xa9\xcf\xb6\x25\x14\x39\xff\xcd\x77\xaf\x88\x9c\xff\xe6\xbb\x4b\xc8\xa9\x3e\x16\x90\xf3\xef\x7f\x98\x61\x6b\xdc\xa2\x50\x04\x55\xf7\x43\xd0\xc4\x7a\x4f\x67\x87\x5f\xfe\xd1\x9f\x5f\x0d\xfe\x14\x50\x29\xfe\xda\xc7\x82\x61\xf9\x0f\xbf\xfb\xec\x4f\xff\xc4\x6c\x02\xdf\xf5\xcc\x30\x85\x5f\x3e\x50\xe4\x78\xea\x95\xe5\xe9\xe9\x23\xf5\x25\x8c\xef\xcc\xf0\x6c\x32\x00\xeb\x19\x5e\xec\xd1\x35\x9f\x6f\x9b\xb6\x05\xbe\xcb\x6a\xb6\x7e\x1a\x0d\xf4\xb9\x99\x4b\x00\x3a\x1d\xf4\x8a\xdc\x4d\x7d\x73\x6d\x1a\x66\xa6\x5c\x1f\x9a\x14\x62\x76\x2d\xc7\xf8\x46\xb2\xfe\x34\x1a\x38\xb4\xac\xa9\x7a\x3e\xfb\xce\x6f\x7f\xf2\xed\xbf\x7c\xfa\xc7\x3f\x7d\xfa\xc3\x1f\x50\x7d\xfe\xaf\xff\xe2\x97\xdf\xff\x05\xd3\xb7\xba\x49\xea\xc7\xa9\x03\x24\x1c\xd8\x9f\xfe\xe2\x8f\x3e\xfe\xc9\x5f\x31\x45\x47\xaa\xfd\x38\x66\x3e\xfa\xbb\x8f\x7f\xf2\x7b\xbf\xfc\x93\x6f\x7e\xfa\x5f\xfe\xd5\xd3\x3f\xff\xd6\x27\xdf\xa3\xdc\x86\x13\x38\x63\xb5\x4f\x7e\xf0\x2d\xc9\x6d\x85\x0c\x85\x95\xc0\xa7\xff\xeb\xef\x3f\xf9\x8d\x8f\x0a\x33\x90\x70\x80\x8c\xf5\x5b\x9f\xfc\xc6\x47\x74\x1e\xff\xc9\xef\x3c\xfd\xce\xb7\x9f\x7e\xef\xbf\x7d\xfa\xa3\xcc\x5a\x41\x87\x49\x66\x00\xac\x2d\x4b\x7c\xf8\x3e\xfd\x77\x7f\xf1\xf4\xa3\xff\x59\xb4\x68\x50\xcb\x69\x45\x03\xbe\x78\x96\x7d\x18\x62\x28\x14\xfc\x9e\xd3\xaa\x78\x78\x52\x1e\x12\x8e\xe6\xbc\x89\x64\x34\xf4\x26\x76\xb4\x9c\xea\xbb\xdc\x07\x8d\x43\x9c\x4f\x69\xa2\xe6\x4f\xb6\x54\x5b\x7a\xfa\xa3\x8f\x58\x0b\x3e\xfd\xc5\x1f\x7f\xfa\x1f\xbf\xf3\xc9\x4f\x7f\xf1\xec\x9b\x7f\xf9\xec\xbb\xff\x81\xb5\xa9\x64\x8c\xc3\xd3\x1f\xfe\xe0\xe3\x8f\x7e\xfb\xe9\x9f\xfd\x19\xed\xcc\x3f\xfd\x57\x65\xb4\xef\xad\x9c\x33\x05\xe8\xba\x0e\x78\x07\x4f\x7f\xf3\xdb\x34\xe7\x9f\x7d\x8f\xf2\x4b\x46\x99\x55\x72\x42\x81\xcd\xe7\x67\x51\xee\x71\x5f\x73\x16\x4d\xfc\x94\xb0\x62\x19\x0b\xe6\x3c\x8e\x4f\x75\x7b\x25\x1d\x60\x0e\x68\xf6\xb9\x90\x9c\x50\xc9\x50\xf3\xf7\x55\x02\x1d\xf4\xb5\x9e\x3e\x4e\x30\x57\x0d\x30\x9e\x1d\x66\xa8\x63\x12\x1d\x23\xf6\xbe\xa0\xb1\x4e\x54\xca\xd0\xdf\xfc\x4d\x26\x50\xcb\x09\xbc\x32\x7d\x57\xcc\xb8\x80\xa7\xdf\xfd\xd1\xc7\xff\xf0\x17\x9f\xfe\xf0\xcf\xa9\xfe\xfa\x87\x3f\x62\xc8\x70\x95\xf8\x27\xdf\xfc\xf8\x27\x7f\x45\x17\x82\xff\xe6\xa7\xe5\x24\x7f\xfa\xf3\xdf\x5d\x3c\xfd\x93\xff\x0a\x3e\xfc\x9f\xd0\x63\xe3\xf9\xd3\xef\xfc\xeb\xa7\x7f\xfc\xb7\x4f\x7f\xf3\xdb\xcf\xfe\xe0\xef\xe8\x84\xf1\x8b\xdf\x7b\xfa\xc7\x7f\x2a\x97\x35\xac\x3f\x65\x87\xcc\xc3\xcb\x75\xc9\x42\x75\xc9\x20\x18\x0e\xa1\x03\x54\x4e\xd2\x6e\x59\x03\x91\x82\x3f\x4f\x9e\xc0\xbd\x70\x18\x84\x41\x7a\xaa\xf7\x90\xb5\x80\x3a\xf8\x74\xbe\xa6\xb9\x56\xea\x17\xba\x00\x40\xb9\xf4\xec\x4f\x7e\xfb\xd9\x6f\xfd\xd5\xb3\xdf\xff\x6b\x4a\xdd\xdf\xfd\x9d\x8f\x7f\xfe\x27\xbf\xea\x5d\xc6\x44\xf0\xf2\x2e\xfb\xa7\x9f\x7d\x07\x25\xc3\xcf\x7f\x77\x41\xa5\x65\x11\x00\x56\xfa\xe3\x9f\xfd\x80\x91\xe7\xe9\x6f\xfd\x98\xe5\x01\x3d\x53\x71\xd7\xbf\x17\xcf\x43\x16\x8d\xf1\xa5\x74\xbf\xd4\x1a\x5d\xee\x10\x3f\x0d\x42\xcb\x73\x32\x6c\x61\xf3\x01\x2b\x03\x9f\x70\xc3\x28\x74\x98\xd6\x24\xe4\x79\x5b\x3d\x3a\x6b\x20\xcc\x13\x6d\xf1\xc0\xe3\xc5\x28\x4d\xa3\x6d\xbe\x8a\xef\x59\x85\xa4\x5d\x98\xea\xd0\x66\x24\xf3\x69\x9b\xfe\x43\x8b\xe2\xa4\xdc\x66\x3f\xf8\xce\xe7\xe6\xb6\x7c\x72\x90\x28\x54\x5f\x6a\xf3\x5f\xcc\x87\x3a\x44\x9b\xff\xd2\x14\xb4\x6a\xb5\xd9\x0f\x56\x93\x1b\x9b\xed\x7c\x12\x2d\x58\x30\x8a\xdb\x45\x89\xb9\xbc\xaa\xdb\xdb\x65\x1f\xd6\xce\xf2\xb6\xce\xa5\x57\xb1\x28\x5b\x23\xef\xb6\xc3\xc3\x55\xed\x9e\xcd\x75\x18\xfb\xf1\x34\x0a\x4f\xb9\xc5\x14\xac\x60\x3a\x9d\x63\x1c\x4d\x1b\xd6\x9b\x45\xb0\xbb\x15\xbf\x72\x80\x41\x94\xc3\xc1\x65\x21\xf4\x10\xc2\x2c\x0a\xe8\xca\x41\x03\x11\x4c\x11\xc4\x7a\x93\xed\x9d\x1c\x7e\xed\xee\xe7\xef\xbf\x7e\xe7\x4b\x87\xf7\xde\xba\xff\xce\xbb\xef\xdd\x7d\xe3\xf0\xad\x77\xde\xf8\xca\x97\xef\x1e\xba\x87\x83\x8d\x43\x8c\x95\x75\x78\x58\x62\x6d\xdd\xdc\xb1\x2f\x05\xda\x3b\x3c\x8c\xe2\x41\x10\xfa\x93\x52\xd0\x1b\x3b\xe8\xf0\xbe\xa6\x87\xc2\x0e\x07\x96\x66\xc4\xe8\xfb\xe8\xea\xc7\x03\xba\xac\x56\x19\xa5\x2b\x34\xd7\xc5\x79\x4e\x58\x6f\x1e\xd8\x96\xdd\x98\x87\x47\x61\x74\x12\x5a\xd2\x72\x2a\xf7\x77\x06\xc2\x94\x8e\xd5\x35\xd8\xab\x16\x68\x97\x82\x7d\x97\x8e\x53\x99\x05\x47\xad\x0c\x1d\xcf\x3f\x31\x69\xa7\xbb\x39\x88\x67\xda\xaa\x93\x60\xa0\xa2\xf7\xc6\xd1\x3c\x94\x91\x84\x44\xe2\xcc\x1f\x0c\x82\x70\x74\x2f\x0c\x71\x2a\x73\x33\xe9\xef\xcc\x53\x33\xdd\x9f\x04\x23\x8a\xb5\xdb\xd8\x62\xd2\x8b\xe0\x55\xc3\x0c\x43\xde\x5a\xfc\xa0\xf4\x48\x82\x1f\x2d\xfd\xe8\x04\x85\xc0\x5a\x6c\xd9\x99\x18\xc3\x54\xe8\xe1\x5e\x0b\x74\x58\x23\xbb\xde\x01\xdc\xe4\x8f\x6a\xe3\x0b\xb8\xd2\x2c\x32\x89\x42\x75\x30\xf3\x44\x33\x05\x07\xea\x02\x36\x8f\xe7\xcb\xf7\xae\x2c\xcc\x56\x67\x10\xa5\xbd\x8e\xca\x5b\xcf\x81\x10\xea\x26\x91\x6a\x26\x6d\xd6\xa5\x9b\x2a\x3f\x31\x47\x55\x5c\xfd\x48\x06\x5b\x9f\x68\x07\x23\x18\xe2\xb5\x4c\xbd\xf8\x4b\x66\xa8\x83\x65\xaa\xb4\x6d\x58\x67\x84\xe7\xfe\x83\xa2\x67\x51\xf7\x66\x65\xbc\x6c\x99\x02\x9c\x18\xbd\x10\x29\x4c\x63\x8a\xbd\xed\x18\x00\xb5\xcf\x32\xd9\xde\xd7\xa3\xa7\xb2\x9d\xa6\x73\x47\x87\x3e\xca\xbb\x15\x82\xa3\x83\x71\x2d\x8e\x8d\xd0\x6e\x4c\xfd\x99\xa5\x5d\x32\xaa\x05\x4d\x62\x14\x12\x8d\x0b\xf6\xb3\xf7\x81\xe8\xe3\xc3\x12\x5d\x7f\x5b\x44\x1a\xe7\x09\x96\xda\xa5\x53\x4b\x08\x7d\xb4\x69\xb1\xba\xac\xc3\xec\x72\x33\xbb\x27\x72\x1b\x2c\xce\xb1\x87\xb6\xa3\x98\x9a\xd6\x21\x38\x79\x9f\x39\x2c\xca\x5a\xc4\x18\xbd\x50\x25\x72\x60\xd7\x0e\x29\xbb\x43\xed\xb0\xeb\x1d\x1c\x64\x6a\xc4\x4c\xdc\xf8\x59\x5c\xed\xbb\x62\xb0\x97\xd5\x5d\x5a\x0f\x2f\xc8\x2e\xb1\x96\xb5\x66\x2b\xd1\x59\x46\xd6\x91\xa9\x42\xe6\xc9\x16\xe6\xc3\xa3\xac\x9c\xf4\xac\xd0\x1b\x75\x5e\x7b\x0a\x69\xc9\x0b\x5d\xbf\x7e\x98\x25\x20\xfd\x92\xad\x83\x8f\x9f\x8b\xd6\x92\x11\xa1\x19\xc9\x59\xa6\xbb\x1d\xda\x59\x36\xd2\xe1\x94\xa0\x26\xea\x78\x1e\xfc\xae\x14\x21\xd1\xca\xcb\x20\x74\x69\x0a\x61\xc1\x2c\x42\x62\x62\xba\x10\x26\xa2\xd0\xea\x28\x48\x31\xac\xd7\xdd\x8f\x66\xa7\xe7\x8c\x03\xcb\x96\x93\x12\x97\x3e\x42\x9c\xd8\xda\x97\x98\x09\x34\x74\x23\xd2\x52\x51\x1a\x33\x31\xae\x52\xf5\xde\x31\xfa\x38\x9f\x07\x09\x66\x90\x5d\xcb\x83\x2d\x62\x94\xd0\x46\xb9\x32\xb5\x88\xf1\xaf\x1b\xf4\x50\xf7\x0b\x92\x31\xf3\xc0\xd7\xcd\xdc\x48\x08\x45\x95\xc2\xd1\x95\xe7\xa0\xfd\xac\x26\x91\x65\xbd\xa2\x8f\xbc\xe4\xaa\xbd\x20\x71\xa6\xf9\x2c\x3b\xdf\x56\x84\x52\xd0\x4e\xcb\xb0\x3a\x4b\x30\xac\x57\xcd\x6e\xf0\xb8\x61\x31\xbb\x02\x58\x7a\xaf\xdd\xd5\xac\x00\x56\x57\xbe\x0f\x67\x7e\x10\x27\xe5\xfa\xf1\x36\xd3\x8f\x9b\xeb\x30\x0f\xe7\x09\x19\xc8\x2a\x84\x6e\xcb\x97\x0a\xa2\x2a\x96\x4b\x42\xe2\xb9\x78\x63\xa8\x7a\x65\x5e\x46\x94\xb8\xfc\xea\xcc\xc4\xa3\x63\x6b\x30\xef\x6b\x0c\x14\xba\xe2\x20\x6e\xe2\x66\x14\xc3\xd0\x93\x9f\xbc\xcc\x27\xa9\x94\x84\xe4\x84\x87\x3a\x09\x5d\x58\x87\xd0\x93\xea\x76\x20\x35\xd8\x40\x5e\x9d\x11\x18\xe5\xd5\x06\x30\x43\x0a\x78\x1c\x75\x1b\xc4\xfb\x4a\x54\x15\x0b\x01\xfa\x4a\x35\x1d\xa6\x0c\x47\x31\x58\x01\x6d\x1b\x86\x65\xd9\x87\xc0\x85\x9b\x10\xba\xfb\x50\xab\x05\xd2\xd2\xcd\x63\xb7\x50\x5c\x14\x15\xba\x01\x9d\x9d\x03\x8f\x97\xf3\x68\x39\x0f\xcb\x79\x0e\xfd\x57\x9d\xa8\x65\x05\x58\xec\x16\x86\x32\x07\x26\xe9\xdd\x0d\xbc\x03\xe3\x62\x0a\xc5\xd6\xd2\x9b\xc9\xce\xc7\x20\xde\x5e\x7a\x35\xd9\xf3\xb1\xef\x55\xb3\x58\x6e\x97\xa8\x07\x37\x71\x43\x1a\xaf\xe5\xe8\xc1\x2d\x7c\xe1\xcf\x6c\xab\xda\x85\x36\xbc\xed\xbf\x5d\xd2\xf6\xa5\x37\x55\xbd\xf4\xa1\xbb\x7c\xd5\xbc\xb1\xbd\x75\xe9\x65\x73\x2f\x48\x48\x3f\x2d\x07\x8d\x91\x9c\x2f\x01\xba\x75\x78\xd8\x8f\x30\x46\x69\x39\xf0\xdd\xcb\xe2\xbd\x71\x78\x48\x16\x29\x59\x02\x7a\x63\x7b\xf3\x72\xa0\x37\x0f\x0f\x45\x1c\xef\x25\x78\x6f\x5f\x0e\xf8\xd6\xe1\x21\x4e\xf2\x4b\xd0\xbe\x24\xe4\xed\xc3\x43\xf4\x68\x5d\x02\xf9\x92\xa6\x95\x9d\xc3\xc3\x74\x1c\x93\x64\x1c\x4d\x06\x87\x49\x3a\x8f\x47\x64\x59\x2d\xbb\xcc\xc8\xc2\xfe\x5e\xc0\x40\x57\x73\x86\xb8\x94\x7a\xc5\xbe\x2c\xb0\xd4\xe4\x6c\x32\x2b\x71\xdc\x12\x40\x92\x50\x4b\x61\x15\x53\xb4\x00\xac\x69\x50\x19\x07\x49\x1a\x8d\x62\x7f\x6a\x0d\xfc\xd4\xd7\xcd\x2a\x81\xb2\x7c\xa0\x85\xc5\x4f\xb3\x37\x38\x01\x2c\x8c\xfb\x48\x72\xd3\xa6\xd8\x87\x63\x33\x16\x9f\x74\xe8\x9c\xb3\x5f\x3e\xd9\xe0\x33\x22\xd3\x0d\xe8\x5c\xe5\x60\xcd\x72\xa2\x91\xe8\x2d\x1e\x2b\xb3\x0f\x5f\x97\x6b\x78\xd1\x39\x6f\xf1\xd8\x30\xf1\x2c\x3c\x96\xe6\x69\x69\x29\x05\x22\xc9\xc6\xe1\x38\xb0\x70\x1d\x58\xc8\x48\x16\xcd\x26\xdc\x89\xc2\x63\x12\xcb\x80\x1a\xd1\x50\x15\x4a\x20\x08\xf1\xb0\x77\x30\x8c\xe2\xa9\x96\xde\x90\x36\x93\xeb\x66\x74\xb5\xf4\xb1\x76\x7f\x39\x62\x70\xae\xf9\x43\x0d\xc4\x6e\xa5\x8f\x1d\x4a\x5f\xf1\x24\x13\xda\x3f\x18\xc2\x0e\xa4\x8f\xe5\x15\xe2\xab\x01\x56\xb2\xa3\xd0\xe6\xa8\x8e\x0b\x2f\x5c\x68\x52\xf0\xb0\x0e\xe9\x63\x47\x37\x46\x2d\x3c\xe3\x0b\x45\x81\x87\x10\x9b\xcc\x93\xe0\x98\xe8\x1d\x87\x71\x3a\xa6\xd1\x31\x01\x3f\x3c\xd5\x69\x18\xcd\x53\x79\xdc\x9c\x75\x6a\x43\xf6\xf4\x94\xf6\xd1\x63\x79\x33\x18\x4d\xe6\xfb\xc0\x29\xed\x61\xb8\xd9\x81\x85\x6b\xd3\x2c\xc9\x38\x18\xa6\x96\xed\x40\xbd\x3e\xcd\x66\x9c\x42\x1d\xbc\x03\xb8\x45\x3b\x96\xe6\x9d\x45\x33\x99\x53\x56\xd5\x0b\x42\x93\x85\xa7\xcc\xfb\x4b\x32\x4c\x2f\x08\x15\x57\xdc\x63\xd7\xfd\x07\x8f\x09\x16\x6c\x14\xf1\x7a\x07\xa6\x19\x66\xef\xa1\x50\xa0\x05\x18\xc3\x77\xe5\x7d\x60\xbd\x20\x6c\x2c\x98\x5e\xc7\x0e\xf1\xa6\x8f\xbb\x01\x43\xbb\x0d\x0b\xd7\xc8\xe6\x61\xb6\x9b\x30\xe5\xd9\x30\x8b\xb7\x9f\x21\xf6\xeb\x49\x42\xd7\xa4\x74\x04\xe1\x81\x50\xda\xbc\xde\xa9\x38\xa2\x1a\x8c\xc2\x28\xa6\xab\x28\xda\x19\x65\x3d\x70\xde\xd8\x5d\x48\xed\xb2\x1b\xc8\x96\x50\xae\x5f\xb8\xd8\x33\x70\xe3\x06\x2c\xf0\xc9\xb8\x9e\x1f\xdb\xbf\x8a\x51\x5c\xa8\x12\x85\xfc\x49\x19\x6e\xe1\x80\xeb\xc0\xd4\x3e\x60\xdb\xff\x5c\x72\x64\xaf\xd2\x5f\x33\xd6\xd0\x41\x98\x48\x23\x9e\x94\x80\x0d\x21\xfb\x2f\xb4\xea\x17\x85\xd2\xd3\x19\x89\x86\x70\x88\xbe\x9e\x15\x01\xa2\x02\xb7\xe1\x10\xda\xe7\x0f\x44\x43\xb3\x29\x6c\xeb\xa1\xed\x28\x5c\xa5\x35\x52\x2d\x3c\x55\x3b\x9e\xc7\x20\xf9\x32\x5a\xd2\x65\x46\x42\xb4\x11\x66\x1b\x35\x50\xd7\x42\x64\x5a\xa5\x49\x8b\x0b\xb6\x4c\x9f\x40\x97\x37\xce\x14\xd4\x87\x36\xdc\xbe\x92\x9e\x5b\x41\x09\xef\x56\x7a\x58\x10\xcd\xb0\xb4\x58\xa3\xef\x4f\x26\xd6\x21\xda\x89\x5e\x04\xf7\x48\xa2\xe4\x4c\x17\x32\x5b\xc9\x22\x66\xe9\xad\xa8\x57\xb3\x88\xc9\x2b\x74\x4b\x76\x1f\x15\x12\x0b\x63\xb1\x56\x66\xbb\x59\xf0\x16\x17\x36\x6e\xe9\x55\x7b\xaf\x50\xe3\x16\x25\xf8\x2f\xbd\x9a\xea\x9f\xd1\x0a\x53\x5e\x42\x58\xbe\x9e\xf2\x2e\xbd\xc6\x64\x6a\x5e\x29\x64\xcf\xbd\xe4\x32\x70\xe3\xf0\xf0\x83\xb9\x1f\xa6\xc1\xa4\x7c\xb1\xd6\xf2\xb6\xc4\x62\xe7\x85\x19\xcd\x1c\x19\xc3\xc2\x56\x07\x98\x92\xf3\x6c\x52\x52\x52\x31\xf1\x32\xf5\x67\x4a\x4e\x09\xb8\x2b\x91\xb5\x48\x40\xb1\xeb\x9f\x57\xed\xf2\x22\x08\xfb\x19\x17\x17\x33\xca\x0d\x3b\x35\xd8\x82\x75\xb0\xce\x95\xa6\x46\x37\x15\x4a\x53\xd1\x5c\xb7\xb1\xb3\x65\x43\xfd\x7c\x01\x7d\x11\x90\xad\x2d\xdc\xa3\x95\xae\xb0\x7c\x23\x92\xaf\xbd\xa0\x4e\xf5\xed\x0d\x5b\x3a\xe8\x64\x25\xc0\xd2\x3b\xbe\x5e\xba\x04\x18\x90\xe3\x00\x7d\x59\x96\x48\x81\xd6\x8b\x35\x11\x67\xb9\xfd\x3c\x26\xd9\x68\x6c\xc1\xfa\x2a\x5b\xd2\x7a\xe3\x96\xf4\xe9\xf3\x74\xe6\xd2\x5b\xb0\x5e\x2d\x63\xa9\x20\x36\xfe\x46\x5a\x30\xeb\x50\xae\x10\x32\xf6\x83\xc0\xb8\x7b\xda\xb8\xdf\x54\xc4\xa2\x96\x47\xa8\xa2\xa1\x32\xa1\x7f\xa8\x2f\xed\x6a\x35\x5c\x95\xd8\xf0\x21\xbb\x17\x99\x07\xf6\x1d\x06\x71\x92\xf2\xbb\x1c\xf1\x6a\x23\x71\xf3\x9f\x5c\x9f\x48\xcd\x5d\xae\x5e\x6c\xb8\xce\xaa\xd0\xae\x19\xe5\x9f\xf5\xa5\x0b\x3b\x23\x2d\xb5\x6f\xf6\x57\x88\x0d\xbf\x49\x97\x05\x09\x26\x54\xb1\x35\xae\x30\x97\x7f\xab\xa3\xa3\xc7\xe0\x5e\x8a\x8f\xba\x86\x5a\x3d\x9d\x99\xc6\x7a\xed\xdc\xd9\xd5\xd2\x32\x1a\x5a\xb2\x11\x68\xc1\xe1\xe3\xe0\x15\xa2\xef\x45\x50\xbc\x4a\x9a\x8b\xc3\x04\x7e\x89\xfe\xb6\xb3\xf4\x28\xf3\x4b\x97\xde\x2b\x29\x42\x2f\x54\x74\xaf\x2e\x4d\xa6\xd0\x81\x70\x05\xd1\x92\xe0\xa1\x00\xf7\xc2\xe2\x45\x63\xf7\xeb\x41\xf2\xb6\xff\xb6\xe4\xa8\x55\xa6\x8a\x65\xba\x8f\x62\x45\xdb\xb6\x11\xbf\x5a\x86\xb7\x70\xa8\x4a\xa3\xd6\x4a\x23\xf8\x45\xa3\x5b\x3a\x82\x2e\xd6\x04\x0c\x1e\x69\x6b\xa7\xb0\xa0\x09\x25\x0b\xcf\x9d\x97\xe0\xfa\x7a\x91\xb5\xcd\x0b\x5b\x81\x78\x2f\x6e\x05\xd2\xba\xd0\x0a\xe4\x95\x18\xd7\x4b\x86\x32\xa3\x52\xa2\xce\x07\xbd\xa4\xf1\xec\x5d\x64\x3c\xab\x89\x83\xa3\xcb\xec\x94\x7a\xf4\xe8\x0b\x4d\xcd\x2f\x1a\xef\x65\x03\xfb\x32\x6d\xe1\x43\x7b\x15\x1b\xd6\x39\x4b\x24\x51\xe7\x39\x4b\x45\xf7\xdc\xa5\x22\x5d\x65\x6d\x95\xa8\xdc\x3b\x2f\xd0\xbd\xe6\xca\xfd\x13\xe8\x8a\x3c\x31\xc7\x10\x4b\xcb\xce\x8d\xc5\x83\xe9\x91\xee\x8c\x3d\x25\xf1\x88\x0c\xa4\x6b\x36\x05\xa3\x9f\xb9\x93\x0c\xf8\x88\x8a\x76\x56\x4b\x37\x38\xd0\xb6\x65\x18\x00\x63\xfb\xe4\x91\xad\x83\xa8\xd7\x43\xe3\x30\xbe\xcf\xef\xb8\xe5\xc0\x42\xbe\x7d\x30\x15\x49\x45\x5b\x3e\xf5\xfa\xd4\x80\x21\xaa\xed\xd6\xeb\x8f\x0e\x44\xc1\xee\xf4\xa0\xd8\x31\x85\xe5\x2d\xe9\xf8\x5f\x25\xc7\x14\x7e\x37\x78\x38\x20\x0b\xa2\x5f\x75\x00\x1d\x91\x28\x97\x98\x33\x12\x4f\xf1\xaa\x77\xbd\x63\x02\x1c\xad\x9c\xa6\x41\xbd\x6e\xcb\x6c\xf2\xba\x26\xff\xb4\xcb\x41\x75\x83\x83\x03\xcd\xba\x22\x72\x96\x90\xf1\x15\xf3\x71\x59\x6d\x96\x7e\xa1\x73\x1d\x5b\x39\x11\x75\x15\xce\x75\x2b\x37\xdb\xd9\x42\x07\x92\x87\x2b\xf5\x21\xeb\x16\x8e\xd8\x85\xdc\xa2\x5f\x3c\x52\x0b\xc7\x47\x7a\xa4\x2e\xb6\x3e\x92\x53\xa1\x4c\x58\x99\x68\x65\x0e\x04\xc5\xd3\x92\x56\xa9\xb5\x08\xf4\xc5\xac\x03\x8b\x47\x36\xdc\x04\x17\x9e\x3c\x01\x99\xe5\x11\x4b\xbe\xde\x31\x46\x34\xb6\x66\x11\x38\xd8\xda\xa0\x40\x61\xcc\x96\xe7\xe1\x55\x38\x7f\x3e\x2a\x61\xcc\x17\xb8\x6f\xf1\xa2\xc6\xb7\xeb\x40\xe0\x69\xa7\xdc\x69\xa6\xc0\x13\xfd\x89\x41\x45\x94\x9c\x84\x36\x66\xae\x0b\xe7\x40\x57\xcb\xe7\x42\x1b\x6a\x81\x2b\x77\xb2\x53\xc9\x5d\x7a\x6f\x4e\x65\x3f\xca\xb3\x1b\x7e\x38\x88\xa6\x96\x0d\xeb\x30\xad\xd7\xe1\x09\xf0\x5d\xe8\x54\x89\x5a\xa8\x41\xe0\x72\x79\x6b\x24\x29\x31\x92\xcf\x12\xc8\x2c\x69\xf6\x40\x36\x9f\x79\x0a\xbb\xf0\x05\xee\xce\xbc\xd2\x8a\xee\x15\xac\x59\x85\x92\x58\xd3\xec\x4b\xc6\x3a\x0d\x9a\x4d\x78\x3b\x4a\x49\x1b\x1e\x93\x38\xc2\xcb\xa7\x90\x79\xa8\xbc\xa0\xa4\x3b\xf6\x27\x24\x4c\x1b\x97\x52\x54\xcd\xca\xcb\x8d\x2f\xf9\x85\x63\x76\x06\x4f\xe6\x65\xab\xc3\x57\x6b\xe7\x2b\x8d\xfd\x30\x99\x45\xc9\x12\xaf\xbc\x1d\xf7\x45\x4d\x3c\x86\x9d\x7b\x95\xe5\xbe\x86\x6d\xa1\xe6\x2d\x77\xd5\xcb\x94\xe6\x57\x6b\xd3\x21\x89\xfb\x87\x21\x49\x96\xf8\x88\xee\x70\x07\xd4\x0c\xe5\x63\xc2\xa9\x49\x4b\xb3\x26\x5d\x66\xf5\x4e\xeb\x4f\xc8\x92\xea\x77\xdd\xe5\xd5\x27\xe4\xb2\xb5\xb7\x58\xed\x53\x7f\xb6\x64\x7d\x9f\x71\x07\x95\xd5\x5a\xbd\x00\xa7\xfd\xcc\x69\x5d\x59\xb4\x31\xb0\x0a\xfb\xb2\xe2\x57\x1c\x63\xbb\x5d\xde\x03\xb4\x12\x9e\xb8\xd7\xcd\x8e\xe5\x5d\x6e\x53\x95\x42\x3a\x22\xa7\xe5\x1e\xa4\xbb\xc2\x14\x53\x46\x70\x5a\xfa\x92\x14\xdf\x64\xf5\x33\x19\xb6\x04\x83\xd6\x72\x0c\xf8\x1e\xec\xe5\x70\xd8\x62\x38\x90\x30\x8d\x83\xa5\x48\x6c\x2c\x47\x82\x03\xc0\x8b\x72\xa5\xb7\xad\x31\xd0\x5f\xe0\x86\xd4\x25\x06\xfa\xf9\x6c\xfe\x82\xdd\x85\x91\x6f\x3a\xd0\x55\x87\xa6\xa3\x38\xfd\x52\x51\x22\x8b\x64\xaa\x8e\x4f\x4f\x26\x73\x79\xba\x9a\x4a\x1b\xd3\x2d\xd7\x9f\x61\xc4\x2d\xa6\x06\x0e\xc8\x8c\x2e\xe4\xfa\x78\x31\xd9\xbb\x18\xaf\xc6\xa1\x22\x82\x3d\xea\xba\x37\xe6\xa4\xeb\x63\x8a\x97\x58\x59\x18\x33\xb1\x42\x45\xec\x74\xd8\x5c\x89\x44\xab\x8a\xfa\x2c\xcd\x39\xe2\xf0\x16\x62\x2c\xb7\x47\x6e\xf3\x04\x86\x23\x1e\x66\x63\x7a\x1b\x98\x6e\xba\xa6\x52\x03\xca\x44\x91\xf3\x25\x3e\x22\xa7\xc0\x10\xef\x62\x33\x6a\xb5\x03\xe3\xe3\x57\x75\x85\x28\xa3\x1f\x09\x17\x86\xcf\x9f\x7e\x09\xa1\xac\x32\xe7\x49\xd1\x93\x3f\x69\x9f\x05\xab\x1f\x27\xe7\x01\x89\xf4\xce\xb0\x84\xa7\xf0\xb9\x2a\x50\x22\x75\x3f\xc4\xb4\x31\x22\xa9\x25\x9a\xc6\x1a\x2f\x55\x25\xae\x27\x1f\xd8\x50\x83\x4a\xc5\xb0\xbd\x71\xed\xb1\xc8\xf4\xa6\x2b\x64\x19\xb2\x34\x12\xad\x32\x07\xef\xe3\x9d\x93\x12\x3f\x49\xbd\x18\xf1\xfb\xe3\xbc\x5a\x7b\x44\x4e\x15\x4a\x92\x17\xad\x98\x73\xe7\x11\x39\x75\x38\x13\x8b\x12\xe7\x70\xb1\xf0\xf0\x16\xb4\xcc\x84\x67\xe2\xa8\xc9\x01\xc2\x25\x95\x35\xf5\x67\x1c\xb4\x3e\x0e\x6a\x35\x3e\x12\xcc\x81\x20\x77\xdf\x66\xea\x0c\x3a\x1f\x63\x7c\xdc\x42\x47\x8e\x60\xc6\x85\xe8\x7e\xab\x1f\x7f\x37\x46\xc1\x8d\x1b\x50\x3c\xe4\x84\x69\x6b\xea\xcf\x1a\x02\x55\xde\x42\xec\x21\xf1\xbd\x7b\xe0\xb0\x3c\x26\x91\x1d\x38\xe2\xd7\x67\xfb\xa7\xac\x9f\x3f\x3c\x22\xa7\x6d\x38\x12\xba\x72\x5b\x12\xe0\x58\x34\xff\xcc\xce\x9d\x6c\x17\x8d\xba\x9e\x59\x2f\xe2\x50\xcf\x9e\x72\xca\x14\xb2\xfc\x06\x76\x62\x8f\xfe\x20\x68\x7d\x8c\x9f\x19\x11\x9f\x12\x11\x16\x06\x20\xc2\x91\xd7\x06\x73\x29\xab\x81\x37\x24\x9b\x2b\xf8\x81\x0d\x58\xe4\x07\xf6\x48\x6b\x64\xc3\x6e\xea\xcf\x2e\x0c\xee\x2d\xca\x15\x09\x49\xdf\xf2\x67\x0a\x10\xa7\xd8\x12\x60\x82\xa6\xe7\x03\xc5\x28\xe3\x02\x30\x76\x8d\x04\x3a\xa0\x00\x91\x19\x98\x3f\xb2\xbd\xaf\x13\x4a\x16\x12\x6c\xa6\x95\xc4\x4b\x86\x69\x69\xc9\x82\x1a\x4f\x31\x3f\xf0\x0e\xbb\x89\xb8\x1c\xe4\x57\x39\x7b\x14\x03\x95\xa1\xbd\x97\x40\x61\x2c\xae\x41\x18\x22\x85\x18\xe3\x77\x60\x98\x2d\xa5\x39\x53\xaa\xeb\xfa\xb4\x4e\x35\x57\x23\x1f\x9e\x99\x87\x62\x65\x87\x5b\x11\x67\x01\xe4\x3a\xcd\x29\x80\xa5\x53\x52\x1c\xa8\x2d\xf7\xb3\x5c\x65\x6f\xf9\xb3\x8b\xaf\x7b\x96\xcc\x01\x39\x34\x69\x05\x28\x6d\xb2\x08\xd2\xf1\xcb\x65\xab\x48\x2f\x3a\xb7\xbb\xfb\x6a\x6d\xed\xaf\xa2\x3a\xc9\xe6\x3f\x20\xd8\x8d\x3c\x3a\xfd\x2c\x8e\xd2\xe8\x3c\x1b\x62\x19\x69\x1b\x58\x3a\x3d\x9d\x91\xfd\xb5\xb5\x07\x24\x55\xef\x54\xf6\x66\xde\x3f\xc4\x30\xa5\x61\x92\xc6\xf3\x7e\x1a\xc5\x6d\x8a\x08\xe5\xd2\xb1\x9f\xb4\x19\x1a\x8d\xb1\x8f\xd3\xb3\x3f\x18\x68\x2c\x6b\xf8\x94\xb0\x19\xb5\xd6\x81\x4a\x85\x1b\xaf\xc6\x41\xd2\x5d\x05\x79\xe6\x92\x3d\x8b\xc9\x30\x58\x50\xdc\xa1\xc6\x80\x1d\x98\xbe\x1f\xb1\xb8\x7a\x36\x60\xa7\x0a\x1c\x64\xc2\x69\x74\x4c\x04\x92\xec\x8d\xa6\xf7\x27\xc4\x8f\x45\x32\xbe\x38\xd2\x01\x53\x24\xd3\x51\x8f\x31\xa9\x82\xc7\x12\x02\x7d\xa6\x69\x64\x3a\x4b\x4f\x45\x22\xbe\x60\xaa\xdf\x1f\xcb\x44\xbf\x3f\xc6\xc0\x51\x3a\xf3\xca\xd1\xa5\x19\xa2\xe8\x22\x93\xed\x09\x3c\x20\xa9\x88\xab\x7c\x27\x9a\x9d\xea\x24\x6f\x70\x8b\x13\x2b\x0f\x01\x3a\x99\xf7\x49\x34\xa4\x85\x6c\x3e\x38\x8b\x74\x04\x14\x39\x24\x6d\xf8\x83\x81\x50\x52\xc4\xe4\xde\x6c\xc2\x3b\xe9\x98\xc4\x27\x41\x42\x1c\xf0\x93\x64\x3e\x25\x10\xa4\xff\xfb\x9b\x7f\x94\x80\xcf\x0d\x80\x0d\x61\x5c\x52\x95\x1b\x87\xd3\x98\x5a\x89\xea\x24\xc7\x41\xdf\x2c\xa2\x85\x34\xeb\x58\x56\x2f\x13\x78\x71\xd1\x22\x4f\x8b\x60\x85\x65\x99\x87\x2a\x3b\x1a\xad\x38\x52\xb9\x80\x92\x09\x49\x79\x3c\xd0\xab\x5a\x77\x24\x24\x2d\xb0\xb9\xec\xbe\x40\x77\x88\xab\x5e\x30\x4d\xfd\x59\xc1\x9a\x69\x7f\x4d\x1e\x53\xc7\x54\x08\x50\x37\xb3\xb5\xd9\x13\x75\x0f\x45\x5b\xfa\xa1\xd8\x02\xb5\xfb\x2b\xb4\x6d\x6b\x50\x43\xae\x0b\x96\xd0\x43\x57\xf8\xa7\xfe\x0c\xe7\x42\x9d\x2c\xcb\xce\xdb\xef\xfe\x0a\x6d\x6b\x1a\x84\x11\xb6\x88\xa5\x94\xe1\x99\x0c\x1d\x59\x4e\xc3\x6d\x10\xc4\x3a\xd3\xa9\xc5\xcb\x94\x90\xeb\x25\x6c\x5f\x5e\x38\xbe\x9e\x38\x6f\xfc\x62\x8e\x61\x6c\x5f\xf2\x30\xbe\x77\x78\x38\x09\x42\xe2\x2f\x73\x53\xba\xe4\x01\x8f\xf3\xcf\x60\x6c\xec\xba\xdc\x49\x49\x5d\x8d\xc1\xa9\xa4\x99\x67\xe4\x99\x36\x16\xd9\xce\xb4\xb1\xb0\x60\x34\xd9\xdb\x8b\x6a\x8b\x4c\x78\xaf\x80\x1d\xfd\xed\x88\x90\x2e\xf9\xb8\x5f\xcf\x11\xa0\x6b\x85\x43\xe2\xe7\x9c\xbc\x38\x7c\x8e\x43\x17\x0e\xf0\x90\x3b\xe2\xdc\x5d\x59\x14\xb0\x73\xa2\xe1\x28\xca\x9b\xe1\x88\xf2\x61\x71\x56\x71\x51\x12\x4c\x25\xf4\x2f\xf6\x1e\x24\x63\xa6\x99\x33\x94\x0b\x35\xec\x97\x70\x32\xed\xc2\x63\x77\xe2\xf7\x8a\x64\x25\x87\xf3\x65\xbf\x97\x31\xf9\x5e\x38\x74\xe6\xb8\x3f\x59\x52\xc1\x17\xfb\x93\x4b\xda\x94\xf1\x7c\xc3\x30\x08\x97\x39\x0a\x5e\x5e\x72\xf4\xa3\x49\x54\x3e\xba\x5b\xde\xee\xa5\x05\xc7\xd4\x4f\xc7\x4b\x36\xdd\x5a\x5c\x6c\x50\x38\x5f\xa2\x23\xcf\xdb\x65\xeb\xde\xaf\xb3\x48\x94\x7b\x5b\xee\xe6\x8e\xeb\x50\x25\xf5\x8d\xed\x2d\xc0\xfb\xdb\xfd\x78\x00\x31\x19\x92\x98\x84\x29\xe6\xfd\x06\x16\x64\xe5\xfe\x25\x3e\x37\xdc\xdd\xdd\xdd\x0d\xee\x9a\x91\xba\xd0\x81\x4d\x68\x42\x6b\x8f\x27\x78\xd0\x81\x6d\x3d\xa1\x05\x1d\xd8\x80\x75\xfa\x85\xfe\xc3\x53\x37\xa0\x23\x52\xf0\x1f\x5d\x8b\x9f\xf8\x3d\x1e\x86\xc0\x8a\x94\x2b\x49\xa4\xab\xe4\x5f\xf6\x7b\xb6\x16\x87\x9b\xbe\x5b\x51\x63\xe2\x40\xd4\xf0\xe9\x3f\x3d\xfa\x4f\x34\xf3\xfb\x41\xca\xd4\xaa\x1c\x84\x2f\xf6\x27\xba\x9a\x3d\xa6\xea\x75\x63\x0c\xeb\xab\x90\x5c\x49\x98\x51\x2b\xf6\x07\xcc\x55\x44\x93\x12\x06\x46\xec\xf4\x4d\x94\x58\x63\x1b\xd6\x21\x6a\xf4\x79\x52\x12\x84\x5a\x92\x89\xed\x99\x74\x9f\x31\x70\x5e\x85\xcf\x84\x2c\x79\x77\xd4\x43\x29\x62\x43\xb4\xa2\xc3\xa4\x04\x30\x66\x41\x27\x47\xa2\x17\x98\x34\x8a\xe4\x15\x08\x3d\xe8\xd0\xaf\xad\xc5\xe9\x63\x2b\x6a\xc4\xd2\x88\xec\x1b\xe9\x23\x99\x3e\x31\xd2\x7b\x32\x7d\x01\x1d\x58\x9c\x3e\x6e\x4d\xfc\x9e\x65\xb9\x8d\x4d\xaf\xb5\xb9\xb5\xbd\x09\xeb\xd0\xc3\xcb\x5c\x37\xb6\x76\xb6\x76\xb6\x29\x7b\xf8\xec\x72\xd7\x5d\x77\x73\x63\x67\x0b\xd6\x61\x62\x43\x13\xbe\x1e\x4a\x40\xa7\x26\xa0\x96\xd7\xda\xde\x69\xed\x49\x40\x3b\xde\x96\xb7\xd5\x6a\x49\x40\xee\x4e\xcb\xdb\xd9\x72\x05\xa0\x6f\x28\x40\x8f\x4d\x40\xae\xb7\xb7\xb1\xb1\xa1\x00\x79\xde\x9e\xb7\xd7\x72\x25\xa0\xbd\x2d\x77\xc3\xdd\xf4\x04\xa0\x7f\x19\xea\xca\x97\x60\x02\xcf\xdb\x86\x75\x38\x85\x3a\x78\xdb\x0e\x6c\xb9\xb4\x38\x46\xa0\x3e\xb5\x1d\x68\xb1\x57\xfa\xf5\xb1\x6d\x72\xc1\x99\x39\x22\xac\x89\x03\x2c\x2c\xb6\xc8\xa2\x9b\x80\x72\x33\x6e\xa7\xd3\xc1\xbb\x78\xb4\xb1\x34\xa1\xb3\x9f\xc0\x2a\x0b\x4d\xf3\xa0\xf1\xa0\x0d\xc5\x68\x14\x15\x64\x68\xa4\xe3\x20\x69\xd0\x7e\xae\x4d\xf6\xc5\xab\x2f\x43\xe8\xe3\x6b\x8f\x07\xd0\xe7\xaf\xb2\x5e\xa8\xf1\x47\xac\x6b\xb5\xc3\x68\x4c\x58\x17\x9a\xb3\xbe\xec\xf7\x1c\xda\x6a\x67\xc5\x73\x6d\x02\x14\x1b\x35\x18\xa4\x66\x70\xde\x61\x76\x7d\xb0\x30\x14\xee\xd0\x57\x0c\x65\x83\xe4\xe8\xc5\xc1\x68\x9c\x92\x58\x33\xd4\x1c\x65\x34\x09\xd1\x11\x9c\x72\x35\x2a\xa2\xd7\xc1\x3a\xca\x74\xc4\x91\xed\x70\x6a\xf2\xdf\x9e\x63\xd0\xcf\x96\x76\x98\x81\x1f\x1f\x5d\xa4\xc6\xfa\x73\xd7\x18\x8f\x7a\xed\xbc\xa6\x44\x25\x04\xed\x56\xd5\x32\x6f\x9b\x8e\x0e\xcf\xdb\xd6\x42\xd4\x50\x5d\x1f\x5d\xba\x59\x55\x36\xdc\x86\x53\x68\xc3\x29\xd4\x04\xf3\x34\xe9\x58\x51\x25\x1e\x9b\x25\x7a\xaa\x44\x5d\xf0\x57\x93\x0e\x27\x26\x88\x29\x02\xdf\xa0\xcd\x9b\xf8\x4c\xee\x9c\x72\xc3\x07\xad\xf8\xeb\xfa\x87\x05\xff\x40\xe1\xff\x4b\xfd\xc3\x63\x3b\x27\xd3\x2f\x21\x7f\x2d\x21\xeb\x4e\x1f\xb7\xe2\x51\xcf\x82\x8d\x46\x6b\xd3\xdd\xdc\xda\xa4\xe2\x88\x4a\x01\xaf\xb1\xb5\xb1\xe3\x6d\x50\x8d\x0e\xdb\xe2\x36\x36\xf7\x76\xb7\x36\x3c\x2a\x07\xa9\x48\xe0\xb3\x73\xfd\x16\x24\xef\x7e\xe1\xf3\x19\x68\x75\xb7\xb1\xb7\xbd\xd7\xda\xde\x76\x11\x5a\x0d\xbc\xc6\xee\xce\xb6\xeb\xb9\xbb\x08\x0d\x85\xdd\xa6\xb7\xb5\x85\xdf\x1f\x2b\xc1\x2b\x90\x71\x1b\xee\xd6\xd6\xf6\xe6\xc6\x26\x47\xc6\x6d\xb4\xdc\x4d\xb7\xb5\xb5\xc7\x8b\x7b\x0d\x77\x6b\xa7\xd5\xda\x6a\x19\xc5\x75\x6e\xc0\x24\x3e\x67\x9d\xd9\x86\x69\x5c\x08\xd2\xd4\x90\x54\x29\xdc\xa2\xb3\xff\x6d\x75\x50\x34\x75\x80\x9d\x0d\x85\x36\xa4\xd0\xa4\x1a\x43\x0d\x52\x37\x27\x01\xb1\x57\x0a\x80\x51\x31\x97\x52\x25\x02\xff\x6f\xd3\xf2\xeb\x60\xa5\x94\x2f\xdc\x8c\x00\x13\x0d\x37\xcf\xc7\xb6\xb6\xb6\x98\x4c\xbe\x49\xd5\x22\xd7\xdd\xf0\x36\xdc\x5d\x3a\x1a\x5a\x8d\x3d\xd6\x4d\x6d\xa4\xc4\x96\x7e\xbc\x75\xc1\xb0\x6e\x35\x36\x6d\x24\x9c\xbb\xb5\x95\xa9\x4c\x4c\x79\x66\x65\xd6\x02\x9a\x1d\x5a\xa5\xcd\xab\xa3\xdc\x00\xb7\x61\x41\x87\x08\x56\xd8\x56\x95\x58\xec\x5a\x73\x0a\x9b\x7e\xa6\x0f\x0e\x56\x69\xd6\x34\xee\x4f\xce\x53\x98\x50\xdd\xd1\x58\xf9\x8b\xfd\x89\x15\x35\xc6\x8e\xd0\x3e\x26\x45\x0a\xd3\xf5\xbc\xd2\xc5\xd4\x09\x43\x43\x13\x6a\x81\x0c\x83\xed\xa7\x7e\xd8\xb2\xb8\x12\xe6\xdb\xab\xea\x54\x3d\x1e\xeb\x7a\xd0\x1a\x90\x91\xd0\xa9\x32\x28\x8f\xd1\xb1\xf6\x36\x8c\xa1\x06\x1b\xdb\x2e\xb4\x61\x2c\xd4\xa9\x0f\x28\x32\x0d\x1f\x15\x2a\x3a\x3d\x47\x8d\x1e\x3e\xf7\xec\x82\xf6\x65\xa8\x67\x8d\x1d\xe8\x3b\x30\xb9\xe0\xe4\xaa\xd1\x7d\x2c\x26\xd7\x2f\x16\x40\x5b\x69\x72\x2d\x2a\xa8\x4d\xae\x94\xba\xb5\xb1\x9c\x3e\xfb\xf4\xb5\xbf\x5f\x32\xf5\xbe\xa8\xc9\xf5\x8b\xfd\x89\x43\x5b\xfd\xab\x30\xb9\x52\x7a\x32\xca\xf1\xf9\xab\xef\xc0\xaa\x93\xed\xe5\x26\xd7\x25\x35\x9e\x3b\xd9\xae\x38\xb9\xf2\xda\xb4\xf1\x47\x4b\xdb\x0d\x2a\xd4\x0c\x29\x9c\x35\x18\xbc\x84\x68\x2f\x17\x36\x18\xf4\xe7\x3d\x32\x26\x93\x60\xb1\x64\x55\x7f\x47\xe4\xf9\x6c\x6d\x5f\xb6\xb6\x7f\x1d\x3a\x50\x77\x1b\xde\xe6\xee\x36\x5f\x5d\xe3\x5d\x55\x5e\x63\x67\xb7\xb5\xb3\xc3\x52\xee\xb0\x3c\xad\xbd\x56\x8b\xa7\xbc\xc1\x52\xf6\xdc\xed\x4d\xbe\x52\xbf\xcb\x4a\xed\xed\xb4\xf6\x36\x79\x0a\xcd\x74\x17\xd6\xe1\x0d\xfe\xfe\x79\xfe\xfe\x79\x5e\xcf\x9d\xc3\x37\x68\xed\x9f\x87\x75\xb8\x03\x75\x78\x03\xd6\xe1\x75\x63\x77\x5c\xf4\xde\x79\xd3\x93\xec\x66\x63\x92\x92\xa9\x62\xaa\x4a\x56\x9d\xaa\x5e\x91\x95\x72\x8c\x56\x85\x98\xea\x09\x5b\x5b\x42\x7d\x1a\x61\xe2\xc8\x4c\xec\x61\x62\xcf\x4c\xa4\x52\xdd\x62\x44\x66\x4b\xd0\xbb\x94\xc2\x31\xd4\x69\x4f\xac\xc3\x08\x83\x78\xb0\xef\xf8\x8d\xa6\x4b\x2d\xad\x37\xe1\x17\x26\x4d\x44\xca\x11\x05\x47\xbb\xcf\x1a\xd1\x64\xaa\xb7\xdc\xa1\x80\x71\xf1\xfa\x86\x74\xe1\x13\xd3\x38\xce\xa8\x47\xb0\x0e\x47\x50\xa3\xd0\x44\x4e\x04\x31\x11\xb7\x67\x4c\x6c\xa6\xa4\xbe\xed\xbf\x4d\x3b\x62\xd2\x71\x21\x8a\x61\xd2\xf1\x38\x38\xbc\x6d\x43\xa8\x7b\x4c\x33\x38\x72\x10\xd2\x65\xd5\x02\xaa\x34\xb7\x64\xf4\x61\x28\x66\x98\x42\x45\x21\x61\x73\x6b\x89\x1e\xd0\x57\x85\x65\xd6\x8b\x68\x03\x39\x66\x97\x3a\xc1\x9d\x52\xc8\x2b\x69\x06\xe5\xc5\xcb\xf5\x03\xda\x8b\xb5\xe4\x65\xeb\x07\x12\x53\x47\x51\xe3\x95\xd5\x15\xe8\x70\xd0\xe7\xe3\xd5\xaa\x61\x41\x49\x05\x5c\xe4\x47\x4d\x61\xbf\x2c\x0c\x07\x8e\xf2\xcb\x4d\xd5\xef\x86\x56\x91\x48\xad\x62\x1d\x8e\x2e\xae\xb0\x5c\xae\xd9\x03\xd6\xd9\x08\xf5\x72\x8d\xce\x42\xb8\xf2\x26\x97\x9b\x23\xc6\xa6\xed\x60\x6c\xf3\x73\x62\xfc\x95\x2e\x74\x5b\xee\xca\x02\x29\x67\xfb\x55\x46\x0a\x1c\x66\x0c\x53\x95\xe8\x9b\xb5\x27\xa2\x76\x3e\x4e\x0d\x59\xaa\x4a\xf5\xa3\x44\x2e\xa8\x98\xf5\x58\xbb\x9f\x29\x08\xe5\x37\x66\x46\xbe\x4a\x53\x05\x5f\x0e\x4f\xf0\x26\xf2\x75\xb0\xe8\xe4\x83\xd8\xd4\x70\xa2\xa7\x95\xdb\x12\x99\x6c\xe6\x3b\x2a\xf3\x1b\xe7\x66\xbe\xcb\x33\xdb\x2b\x9a\x16\xb2\x4a\xed\x4b\x38\x08\x75\xc9\x10\x86\xb9\x78\xfa\xcc\x18\xea\xd0\x09\xb9\x03\xbe\x76\x86\x24\xcd\xa8\xf6\xda\x45\x52\x74\x15\x4b\xd7\xb0\xa9\xbd\x24\x8e\xe3\xee\x0b\x3c\x90\x54\xac\x92\x1b\x17\xf8\xf9\x61\x32\x8c\xe2\xe9\x9d\x44\x1c\xe8\x58\xbd\xcc\x83\xe3\xd1\xe5\x95\xfa\xf3\xc2\x86\x3c\xc7\x4d\x78\x78\xb5\xf3\x92\x93\x25\x7b\x99\x7b\xf0\x8a\xda\xc6\xae\xdb\x77\x60\xb6\xb8\x13\x4d\xa7\x3e\x7d\xb8\xef\xc7\x24\x74\xa8\xdc\xc0\x27\xa4\xb8\xb6\x47\x3f\x8b\x66\x56\x92\xe1\x05\x6d\xff\x3c\x61\x61\x9c\xa1\x06\x15\xa8\x40\x9b\x7b\xf8\x99\x9e\xe2\x78\xb6\x8d\xa2\x61\x2d\x7c\x07\x4e\x7d\x07\x16\x3d\x07\x4e\x7b\xa8\x34\x7c\xa0\x7b\x8d\x2f\x7c\x3c\x89\xbc\xe8\xc1\x93\x27\x70\xca\x5e\x4e\x7b\x7a\x98\x72\xe6\x78\xc6\xdd\x4d\x2a\x0a\x72\xc5\xc1\x79\x43\x6b\x99\x78\x65\xad\x12\x4e\xf6\x1f\x70\x47\x95\xa0\x0d\x01\xd4\x61\xd3\x81\xc5\x0a\xd1\x5d\xcf\x8b\xc7\xb3\xc0\x36\xd9\x67\x0e\x08\xc0\xad\xab\x01\x4c\x89\x75\xda\xb3\x85\x57\xf9\x99\xf2\xc8\xe3\x34\xd2\x88\x53\x40\x14\xa8\x51\x5a\xd6\x04\x51\xa0\x06\xa7\xec\x55\x27\xca\x59\xae\xc3\xe2\x28\xa5\xc5\xd9\x7e\x4a\xb6\x8f\x58\xaf\xf4\xcc\xb3\x15\x3e\xd4\xf1\x36\x0e\x6f\xd7\xb5\xe9\x8a\xa0\x43\x95\xdb\x7d\x85\x2d\xd5\xf7\x7d\xf1\xdd\x97\xdf\x9b\x4d\x48\xc6\x51\x9c\x92\x24\x85\x99\x9f\x8e\xf3\x9d\xc4\x1b\xc5\xb9\xb0\x06\x15\x8e\x9b\xec\x6f\xc5\xb7\x57\x46\x74\x14\x92\x05\x24\xcf\xd3\x3a\x8f\x16\x8a\xc6\x9a\xc2\xaa\x8c\xc4\xc9\x11\x39\xf9\xfa\xaa\x14\x5e\x46\x0f\x06\xe8\x55\x23\x07\xc7\x6a\x65\x6a\x30\x47\xa0\xab\x95\x0e\x1a\x36\x08\x5e\xd2\xa8\xe2\xa8\x47\xbb\xf2\xcf\x52\x34\x5c\xc7\xb5\x1f\x0a\x08\xf6\xbc\xac\xaf\x18\x75\x84\xac\xa8\x38\x15\x21\x27\x14\x75\xb2\x87\xc0\x0b\x14\x0a\xee\xd2\xcc\x8f\xd4\xd0\x91\x9d\x62\x68\x7b\x11\x16\x3b\xc1\x03\xed\xb3\x89\xdf\x27\xe3\x68\x32\x20\x71\x22\xf5\xc6\x0f\x98\x8b\x21\x2d\xc4\xef\x77\x50\x73\x57\xc4\xf3\xf9\x78\x17\x5f\x9c\x10\xcb\xb7\x1d\x34\x4b\xb0\xb7\x1e\xc7\x50\x49\x3d\xbf\x21\x9f\xbf\xee\x80\xf6\xf6\x0d\x07\x7a\xc6\xb7\x9e\xf1\x0d\xd9\x8d\x2b\xac\x5c\x00\x36\xd8\x03\xcd\x29\x9e\xb4\x5c\x7c\x0c\x37\xf0\x97\xe6\xe1\x0f\x7a\x16\xa4\xad\xdf\xc0\x5f\xc4\x06\x9f\x10\x13\x91\xd6\x93\x69\x5a\x41\x1f\x8d\x24\x6c\x31\x84\x84\x19\xf5\xf5\x19\x38\xaf\xa6\xe5\xbd\xb2\x3f\x90\x01\x68\x22\xc1\xe2\x39\xcf\xea\xae\x15\xd1\x9c\xdd\xe0\xc0\x6e\x60\xd8\x99\xa8\xb1\xb0\xd2\xec\xc9\xc3\xa4\xf1\x28\x0a\x42\xab\x22\xb9\x41\xe8\x7d\x6b\xd9\x7b\xed\x0d\xc5\xab\x53\xac\x82\xac\xa2\xe4\xa8\x6b\xb7\xe2\x84\x30\x25\xee\xc0\x81\xca\x6c\x41\x47\x2f\xfd\xb5\xe9\xcf\x80\x8c\x90\x43\xcb\x90\xa0\x9a\xdc\x73\x21\xd1\x53\x48\x30\xad\xf0\x80\xd5\x8f\x82\x43\x48\x8f\x9c\xe6\xfb\x12\x4e\xe8\x5e\xd8\xa6\x2d\x08\xf9\x9c\x97\x44\x73\x4a\x5c\x3e\x16\x71\x3f\x9a\x2e\x8d\xc9\xb0\xbb\xc7\xbc\x4a\xf1\xfa\xc1\x24\x79\x3b\x1a\xf0\x23\xa6\xfd\x24\x79\x37\x8a\x52\xf9\xf2\xd5\x80\x9c\xf0\x43\x57\xc7\x23\x9a\x4d\xb7\xef\x8a\xd6\xea\xc7\x50\xb4\x28\x18\x9d\x0e\x54\xc2\x28\x24\x15\xfb\xfc\x63\xf2\x26\xd6\x82\x25\x84\xbf\xa5\xd8\x0e\x44\x53\x2f\xc7\xd7\x16\x88\xe3\xf5\x38\x7d\x34\xca\x35\xd8\x11\xa9\xbb\x13\x42\xdf\xac\xca\x1b\xf7\xbe\x5a\xb1\x1d\xd1\x28\x3d\xa3\x78\xe0\x59\x1d\xd1\x56\x23\x0f\x9b\x07\x68\x32\xad\x9c\x57\xd7\x48\xd2\xd3\x09\x61\x22\x0d\x6f\xc2\xd1\x8e\xc8\x88\x33\xad\x1c\x58\x63\x44\xd2\x3b\xd1\x74\x36\x4f\xc9\xe0\x01\x2d\x65\x71\x4c\x1a\xfe\x6c\x46\xc2\xc1\x9d\x71\x30\x19\x58\xa2\x3d\x6c\xb2\xb4\x69\xa1\xfb\x71\x34\x23\x71\xca\x8e\xb0\x72\x55\x93\xd6\xc5\x24\x83\x00\xc2\x0e\xdb\x98\x40\x74\x2c\x58\xf4\x5a\xe6\xe9\xba\xe3\x40\xdd\xb3\x1b\xc9\x6c\x12\xa4\x56\xc5\xa9\xe8\xae\x4a\xab\x19\xe8\xb4\xce\x29\x98\x26\x59\xc0\x13\x76\x27\x2e\x7b\xf4\xd4\x63\x4b\x3d\x6e\xa8\xc7\x4d\xf5\xb8\x75\x90\xbd\x2a\x93\x8f\x80\x32\xce\x92\x77\x0c\x5e\x1d\x5b\x71\xfe\xb6\x05\xa3\x97\xb2\xd5\xdb\x0f\xac\xca\x38\x4d\x67\xed\x66\xf3\xe4\xe4\xa4\x71\xb2\xd1\x88\xe2\x51\xb3\xe5\xba\x6e\x33\x39\x1e\x51\x79\x35\x62\xe4\xe5\x80\x1a\x09\x49\x5f\x4f\xd3\x38\xe8\xcd\x53\xa3\x33\xd5\x21\x3a\xb1\x89\x21\x7a\x4e\x94\x94\x79\x1b\x3d\x3f\x21\x5f\xf5\x27\x0d\x3a\xcd\x47\x93\x60\x40\xe7\x4d\xdb\xbe\x32\x0a\x98\x2c\x33\xf5\xd3\x38\x58\x5c\x31\x87\x30\xd0\x3e\x6f\x74\xa3\x27\x1e\xfa\xe2\x61\x20\x1e\x88\x78\x18\x16\x7a\x3f\xef\xbd\x84\xf3\x85\xcf\x1b\x27\xa4\x57\x12\x27\x44\x1e\x70\xc0\x23\x62\xe8\xb9\x4f\x46\x31\xc1\xd3\x1f\xde\xae\x2b\x6e\x51\xbf\x7f\x6f\x9f\xcf\xf9\xa2\x9f\xd8\x11\x41\xa5\x55\xb5\x59\x74\x34\xa5\x58\xf1\x04\xa6\x3f\xf1\x17\x54\x94\xc4\x33\xaa\x41\x6d\xe6\xcc\xcb\x34\xa1\x36\x78\x78\x7e\xee\x6a\xec\x5d\xe8\xbb\x30\x70\x80\x98\x67\xef\xb8\xf6\x25\x75\x2f\x8a\x92\x60\x78\xf6\xd1\xd8\x70\xf2\xb9\x77\x65\x0f\xd6\xa1\x67\xd3\x45\x6c\xb3\x23\x81\xf4\xd4\x8b\x04\x41\xe1\x41\x07\x0d\x8a\x7d\x5e\x6e\x60\x43\x1f\xed\x6c\xb0\x0e\x5c\x57\x1c\xd0\xf7\x9e\x78\x37\xea\xff\x86\x51\x7f\x9f\xc3\x19\x20\x1c\x0a\x48\x54\xf9\x0d\x0a\x45\x7b\x61\x35\xcb\x04\x01\x93\x56\x3a\x80\x9b\x58\x59\xdf\x46\x05\xb3\xee\x33\x4d\xba\xde\x13\xa5\x3a\x50\x17\x4a\xac\x20\x41\x5d\xb5\x4b\x9c\x20\x36\x15\xee\xaf\xb7\x81\xcf\xd1\x7a\xa7\x0f\x1d\x4d\x93\x6e\xeb\xdb\x6c\x3d\x07\xd0\xf9\x86\x33\x98\xa3\x74\x69\x2d\x1b\xa3\x5f\x3e\x1b\x67\x16\x4e\x78\x95\xf6\x0d\x9e\xf6\x8d\x72\x8b\xe4\xde\x8b\x3a\xae\x87\x3b\xaa\xe3\x48\x74\xd7\x83\xff\xe3\xdd\xf7\x5a\xbc\xf5\xe3\xa8\x05\x1d\x50\x6f\x9b\xd0\x01\xbe\x89\x4d\x66\x49\x30\x89\x42\xfa\xdd\x23\x75\xaf\x65\xec\x4f\x47\xc9\x38\xeb\x9f\x65\x2d\x44\x05\x64\x31\xb3\x16\x36\x5d\xbb\x79\xd0\x84\x85\x0d\x4d\x68\x65\x0e\x4b\x07\xe1\x0a\xe5\xeb\xa5\xe5\x53\xff\xbc\xf2\xe8\x7f\xc6\x60\xe0\xde\x2b\x3a\xf9\x31\xa9\xd8\x6c\xc2\xcc\xa5\x2b\xba\xf9\xc2\x75\x60\x7e\xea\x3a\x70\xe2\x1e\x60\xb2\xc7\x92\x3d\x9a\xec\x39\x70\xe2\x1d\xbc\x88\x43\x6c\x33\xd7\x81\x99\x16\xb4\x6f\x8e\x57\xba\xcd\x5c\x54\x02\xe6\xa7\xfc\x85\xaa\x01\x27\xfc\xb9\x25\xf7\x4a\xe6\x78\xaf\xdb\xcc\xe3\x79\xf9\x0b\xe6\xe5\xcf\x2a\xef\x80\x52\x84\x16\xa8\xd3\x2a\x64\x2a\x95\x89\xb4\x64\x1d\xdb\x2e\x52\x69\x3f\x0f\x16\x94\x9f\x29\xa9\x06\xa7\xf4\xe9\x34\x77\x75\xf1\x03\x71\x3c\xf7\xc1\x8c\xf4\x03\x7f\x02\x7d\x3f\x21\x78\xf0\x6e\xee\xc2\xff\xfe\xed\x6f\xc3\xdc\x13\xe7\x81\x07\x2d\xb8\x29\x99\x48\xac\x02\x1f\x88\x3e\x9a\x44\x23\xeb\x84\x76\xef\x89\x4b\xfb\x27\x1e\xf3\x35\x60\xa0\x1f\x22\xd2\x16\x8f\xbc\x97\xbb\x72\x4d\x4e\x89\x56\x43\xdf\xc5\x81\x76\xc7\x24\xa5\x1e\x4f\x3d\x55\xa9\x27\xae\xf0\x40\xa4\xac\x41\x87\x02\xf3\x7a\x7c\x20\xee\x25\xcf\x06\x83\x6d\x36\xe1\x0b\x24\x24\x31\x6f\x60\xc3\x8c\x63\x87\xb3\x8f\x67\x48\xbf\x41\x4b\xbf\x02\x90\xf6\x1a\x6d\xdd\x3a\xed\x94\x3a\xab\xfe\x84\x22\x86\x23\x6c\x1d\x06\x2d\x79\xd7\x0c\x7e\xc3\x61\xb8\x0e\x03\xe3\x1e\x41\xaf\x18\x48\xbd\x08\x88\x57\x02\x24\x76\x75\x7a\x2b\x74\x7b\x14\x58\xcf\xc5\x31\x01\x75\xe8\xb9\x7a\x19\xaf\xa4\x0c\xad\xa4\xe7\xc9\x32\x1e\x5f\x6c\xd3\x2e\xb5\x62\x8a\x62\xbc\x5a\x57\x0a\x33\x0c\xf6\x80\xaa\x97\x6d\xdd\x21\xc6\x28\x5e\x62\x1d\x29\x80\x39\x74\x68\xf3\x9b\x60\xa9\x86\xc2\x3a\x58\xbc\xd0\x3a\x93\x09\xac\x6f\x13\x4a\x6a\x97\x62\x89\x82\x26\x76\xed\xac\xc5\x20\xcb\x47\xf3\x42\x3e\x9a\x17\xf1\x11\xaf\xb0\xc9\xb1\xd4\x2b\x2c\xe1\xa6\xa0\x31\x98\xc7\x78\x0b\x0c\x74\xe0\x01\xac\x83\xe7\xba\xae\x7e\xe6\x2d\x28\x99\x10\x5e\xde\x89\x65\x2e\xa5\xc6\xc9\xe4\xcb\x51\x78\xf9\xed\xa5\xc1\xc6\x39\xae\x5d\x5b\x97\xbc\x67\xf8\x5c\x9f\x31\xcf\xdd\xc9\x6c\x2f\x8d\x93\x89\x35\x16\x4b\xa0\xac\x59\x2a\x49\xfd\x38\x75\x80\x84\x83\xec\x7e\xf7\x78\x4e\x2c\xf6\x79\xb5\x28\x51\xaa\xc9\x62\xab\x7e\x9c\x4c\xf8\x39\x44\x0a\xc5\xb6\x1b\x63\x07\x2c\x12\x0e\x9e\x1b\x1e\xc5\xd6\x6e\x18\x1b\xda\x17\x75\xbc\x2a\x58\x5e\x20\x96\x8d\x04\x89\xd1\xd0\xaf\xc8\x9d\x5c\x19\xf0\x09\x03\xae\x6f\xd3\x2b\x4f\x9a\xab\xa9\x82\xc3\x63\x15\xe9\x2e\x0e\x4b\x4d\x92\xac\x2c\x76\xbb\x66\x55\xe4\x14\xa1\xcb\xc9\x5c\x2a\x25\xca\x24\x97\xaa\x5a\xc3\x9f\x0a\x6c\x94\xc8\x52\x35\x19\x62\xe4\x8c\x6f\xd0\x5f\x65\x18\x08\xca\xf2\x17\xf1\xa4\x19\xcf\x09\xf3\xe0\x63\x3a\xa2\x18\xfd\x1d\x58\x1d\x50\xd1\x2d\x6b\x39\x39\xf6\xf2\x02\x0c\x70\x5a\x28\x7c\x7e\xf5\xe5\xd8\xc4\xef\xe5\xc4\x15\xad\xe4\x2a\x86\xe7\x65\x05\x1d\x61\xc7\xae\xfd\x9e\x29\xe8\x26\x97\x15\x74\x19\x78\x4c\xd0\x4d\x8c\x03\x92\x57\x23\x26\x7c\x26\x20\x7c\x5b\xf7\x1f\xbd\x1a\xd0\x3d\x06\x5a\x1d\xd3\x7c\x69\x22\xae\x54\xc0\x15\x89\x2c\x4e\x07\xba\xf2\xcf\xa4\x51\x52\xf4\x32\x69\xe5\x82\xad\x50\xac\x9d\x15\x9a\x9d\x5e\x60\xc0\x8c\x12\x35\xa6\xff\xcf\x48\x8d\xe9\xbf\x74\x35\x86\x4f\x0e\xfd\xab\x52\x63\x32\xf0\xf2\x6a\x4c\xff\xca\xc6\x48\x9f\x8d\x8e\xfe\x67\x6a\x8c\x48\xa5\xb4\xed\xff\x8a\xa9\x31\xfd\xe7\x53\x63\xfa\x52\x8d\x59\x19\xd0\x4a\x6a\xcc\x4b\x0c\x1e\x72\xd5\x61\xb6\xa5\x57\x39\xa5\xcc\xa5\x03\x69\xbf\x5a\x92\x51\x3b\x77\x90\x91\x8f\x56\x3e\xcf\x17\xfc\xe9\xd4\xb7\x64\x44\x5a\x74\xe1\x3f\xe5\x81\x64\x0b\x20\xe6\x05\xeb\xd5\x88\x56\xb6\x89\xd4\xd7\x0e\x67\x5d\x85\x80\x2d\x84\x9a\x17\xb3\x2f\x78\xbd\xf8\x82\x45\xed\x4b\x15\xb6\x4b\xc5\x6d\x99\xc0\x2d\x5b\x39\x9a\x42\x57\x3f\xbf\x7d\x6a\xe7\x32\x2d\x93\xc1\xa5\x52\x98\xcb\x61\x19\x9d\x59\xb2\x42\x63\x44\xf9\x5e\x3f\x33\x88\x03\xc1\x8c\xa0\xac\x9d\x27\x04\x38\xb3\x2d\x61\x27\xbf\x32\x81\xae\xc6\xd5\x73\x88\x75\x43\x84\xe9\x2d\xba\x4a\x11\xff\x2b\x74\x7d\x8c\xee\x82\xe6\x88\x58\xe2\x68\x5b\xf5\xa7\xb3\x49\xe6\x36\x2f\xe6\xda\x28\x03\xe4\xe1\x8d\x51\xfb\x80\x5e\x56\xfb\x50\xab\x05\xb6\x28\xc5\x2e\xf7\xd2\x61\x5b\x01\x34\xc1\x0a\x71\x27\x45\x5f\x6e\xf0\x02\x25\xa6\xcb\x57\xea\xae\x95\xc1\xc6\x39\x01\xee\x2e\xef\xf5\x3e\xd8\x38\x1c\x46\xf1\xd4\x2f\xbf\xca\x63\x83\x5f\x1f\x76\x05\xbb\xc5\x2c\x66\x9a\x03\xfd\x68\x1e\xa6\x0e\x24\x33\xd2\x0f\x86\x01\x06\x6f\x16\x7d\xcf\xa7\x25\x96\xb3\xeb\xaa\x0b\x06\xd2\x68\xa6\xd2\x79\x2c\x37\x2d\x6e\xb4\xca\x47\x66\x2b\x4f\x40\x32\xea\xdc\x08\xc7\x56\x1a\xf4\x8f\x1e\xd0\xf2\x4a\xc6\x3a\x58\x31\xc7\x58\x3f\xb4\xe7\x42\x9b\x25\x4a\x09\x3f\x8b\x49\x3f\x48\x82\x08\xef\x37\x93\x4d\x5b\x4d\xd8\x6b\xbd\x20\xa4\x07\x7b\x7f\x20\xe1\x30\x9c\x14\x58\x89\x4a\xc5\x19\x56\xa0\xad\x11\x13\xeb\x3f\x09\xd2\xfe\x18\x54\x81\x46\x7a\x3a\x93\xf1\x82\x71\xd3\xab\x92\x54\xda\x86\x6e\x20\x5c\x41\x50\xc0\x4f\xfd\x05\x93\xf4\x7e\x2f\xe1\x13\x3c\x0f\xb8\xc0\x12\xa2\x99\x12\xfd\xb8\xa3\x2e\x2b\x92\x74\x90\x38\xde\xb8\x01\xfc\x1e\x4f\xed\xdb\x85\xc9\x42\x44\xa8\x62\x06\xe1\xbe\x8c\x59\x4c\xbb\x8a\xcc\x84\x4f\x8d\x6d\x43\x21\x2e\x66\xff\x68\xb3\xc7\x45\xf1\xe8\x69\xdd\x63\x20\x21\x6a\xd5\xbd\x7b\xc4\xad\x03\x8c\xe2\x95\xb6\xf6\x42\x8c\xb7\x91\xf1\x36\x33\xde\x62\xad\xa3\x5e\x0e\xad\x87\x26\xad\xdf\x8d\xe6\xe2\x4c\x26\x23\xf5\xca\x2c\xb2\x42\x77\x40\x3d\xcb\xa6\xcc\x81\x90\x28\xcf\xf1\x5e\x4c\xfc\xa3\x3c\x39\x87\x06\x95\x3e\xf7\xd2\xa9\x34\x30\xa9\xf4\x66\xb0\x20\x1a\x95\x9e\xa3\xe9\x9f\xab\xd8\xb0\x0e\xad\x92\xe6\x9f\x5d\x28\xd8\xa4\x81\xb1\xaf\xf1\x6e\x86\x6b\x4b\xee\xbd\xda\x7b\x09\xf7\x5e\xbd\xa8\x45\x23\x6b\x67\x6e\xb5\xf8\xa2\x5c\xbc\x74\x91\x20\x2b\x7d\x31\xf6\xfd\xc3\x49\xd4\xf7\x97\x5c\x70\xbd\xb1\xdb\x92\x5e\xbe\x2c\x2b\xd3\x41\x39\x45\xb4\x67\x8e\xee\xda\x1a\x47\xe9\xcb\x98\xdb\xa2\x03\x69\x40\xfa\xc1\xd4\x9f\xb4\xa1\xd2\xa8\xa0\xcb\xd9\x38\x9a\x27\x7e\x38\x48\xda\x78\xc2\x63\x0d\x60\x14\x47\xf3\x59\x10\x8e\xda\xd0\xdd\xc0\x19\xb8\x3f\x8f\x63\x12\xf6\x4f\xdb\xd0\xad\xfc\x8b\x8a\x03\x95\xca\x41\xe6\xde\x04\xb3\x1a\x3c\xfd\x1d\xd0\x0f\x6c\x6a\x62\xb8\xae\x78\xbd\x8d\xa0\x41\xe1\x0a\x49\x83\xcc\x35\x47\xca\xf2\x1d\x5e\x43\x43\x10\x02\x4c\x41\x9e\xf9\x2e\x88\xa3\xe2\xaf\x70\x5a\x16\x18\x89\x5f\x82\x53\xfa\x25\xb5\x2e\xd1\x4b\x8e\xea\xc1\x62\x6b\x2c\xbb\x70\x08\x4e\x82\x81\xba\x6b\x46\x68\xdb\xcc\x2f\x33\x7b\xa3\x51\x6a\x5c\x02\x95\xb9\xbc\x95\x45\xbc\x10\xb5\x6b\xba\x1c\x80\x88\xa0\xc0\x2f\x7c\x54\xf7\xf4\xc2\x2d\x70\xa9\x74\x1e\xd1\x07\xf3\x08\x1c\x2f\x53\x83\x11\x3a\x66\xdd\x12\x78\x8e\x74\x95\xc5\xe3\xe8\x43\x9d\xd7\x21\xe7\x90\x54\xbb\x4d\xa8\x91\xcc\x7b\xec\xf4\x8c\x15\x40\xbd\x03\x23\x07\x02\x0a\xd8\x54\x69\x64\x8d\x1d\x56\xa5\xad\xea\xd4\x24\x72\xa6\x95\x94\x02\xd6\x23\x96\xfd\x73\x32\x99\x13\xee\xc0\x58\xe4\x8a\x58\x66\x8d\x98\x1c\x93\x38\x21\x96\xcd\x8e\x81\xa8\x5e\x2a\x3f\xfe\xbb\xe7\xbe\x04\x5f\xd8\x4b\xf2\x5b\x38\x9f\x92\xd8\x9f\x2c\x63\xb2\xcc\x79\x57\xd6\x29\x31\xc1\xc3\x4b\x56\xb3\xeb\xd6\xf7\x0e\x9a\x23\x4d\xca\x06\x39\x47\x2a\x51\x49\xb7\x16\x08\xaa\x2e\x25\xd7\x0b\xbc\x4a\xe0\x39\xc9\xb5\x70\x80\xc7\x84\xc7\xb8\xa8\x8d\x34\xba\x2f\xf4\x03\x6b\xc6\xae\x93\x88\xe6\x69\x5b\x2d\x7e\x43\xcc\x26\xce\x1e\x05\x18\xa7\x17\xef\xc2\xc5\x93\x49\x81\x67\xae\x8b\xf9\x4e\x1a\x5f\x0f\x2c\xf0\xbe\x2d\x41\x4b\xa6\x38\x35\x2a\x6d\x56\x3c\xf0\xf0\x36\x62\x93\xbb\x59\x1e\x97\xe6\x19\xb2\x7b\x77\xd9\x55\xc4\xac\xc4\xfe\xb2\x42\xa4\xd2\x66\xc9\xb4\x01\xe2\x13\xa7\x92\x04\x77\x4b\x02\x73\xf7\xf3\x9a\x8e\xe6\x63\x84\x59\xe1\x36\x2c\xf8\xc1\x06\x97\x36\xda\x86\x9a\x4c\x08\xb8\x6f\x57\x1b\x16\x25\x4c\xf0\x02\xfd\x91\x2e\x31\x87\xb3\x39\xe6\x0d\x36\xcb\x96\x07\x93\x6a\xb5\xc4\x25\x7f\x57\xc6\x68\xe8\x00\xb8\xe2\x2c\x9b\xc1\xb2\xf8\x0c\x26\x85\x2c\x0f\x33\x0c\xe4\xe1\x84\x85\x34\xf1\xa1\x01\x2c\x22\xc3\x61\xd0\x0f\x48\x88\x2b\x7c\x6d\x42\xa0\x48\x87\x22\xd9\xd3\xe3\xff\xc9\x2f\x2c\xaa\x4f\xc5\x6d\x54\xa0\xa6\xd9\x85\xea\x22\x03\x97\x9d\x15\xb7\x42\x59\x42\xab\x8a\x57\xd1\xd6\xd3\x84\xe1\xe0\x96\x82\x5f\x63\xa1\x7c\xb4\x3c\x92\xcb\xf4\x3c\x78\xa0\x13\x71\xc8\x67\x35\xf2\x15\x55\x6b\x60\x2e\x73\xd7\x8b\x30\xab\x41\x4b\x6b\x51\x09\x3b\xbf\x40\xb7\x94\xe7\x65\x35\x43\xf6\x97\x0d\xc7\x57\xeb\x1e\x7d\xd1\x21\x4b\x62\x4b\xec\x5d\xd1\x48\xc4\xe5\xa1\x4e\x21\xa9\xbf\xb8\x0e\xd4\x57\x19\x95\x0a\xd9\xc2\x01\xa9\xad\xc2\x71\x21\x5a\xd2\x01\x2f\x61\x43\xf0\xd5\xed\x00\xe3\x86\xb3\x82\x7e\x90\xcf\xf5\x5d\xf1\x12\x84\x96\x78\x1e\x4e\xa2\x28\xb6\xae\xa0\xab\x38\x12\x4d\xd8\xb0\x6d\xba\xea\xdf\x80\xfa\x4a\x72\xf9\x6a\x38\xe0\x25\x84\x87\x7c\x95\x39\x60\xea\x73\x49\xc5\xcd\xc6\x26\xd5\xf0\xbb\x9e\x8a\xd9\xeb\x98\x79\xbf\x98\x69\xae\xa0\xe7\x78\x25\x57\x00\x89\x75\x3d\x9d\x8e\x4a\x7a\xff\x25\x6c\x72\x5c\xfc\x36\x91\xe8\xb2\xa7\x9f\x5f\x81\x5d\x92\xcb\xc5\xfc\x14\x11\x1c\x96\xe8\x80\x97\x04\xbe\x71\x78\x18\x06\xfd\x65\x76\xa2\x4b\xba\x3b\x6c\x22\xd6\x69\x10\xce\xa3\x79\xf9\x6d\xdc\xde\xe6\x2e\x8f\x57\x6a\x58\x80\xb4\x80\x01\xf9\x80\x59\x56\x4f\x3f\xbe\xd1\x83\x26\xf8\xb6\xd0\xa6\x6e\x83\xa1\x61\x18\x03\x90\xe6\x5e\x60\x6e\x68\x42\x6f\x9f\x1b\x8a\xa9\x06\x76\xee\x48\x32\xba\xa0\x70\x24\xf5\xb2\x21\xbe\x97\xb7\xc1\xa7\xea\x6a\x1e\xe7\x54\xc3\xb9\x2e\xb7\xd1\xeb\x3d\x07\x52\x5b\x0f\x31\x5e\xf7\x1d\xf0\xa0\x0e\x78\x45\xac\x6c\x46\x21\x18\x59\x26\x07\x44\x87\x91\x39\x62\x1d\x9d\x78\x6e\x46\x45\x0b\x92\x37\x83\x30\x48\xf1\xb2\xa8\xdb\x50\xb3\x2a\x1e\xc1\x80\x25\xb8\x9a\xe2\xca\xb7\xcb\x57\x56\x26\xa8\x99\xd5\xf3\x13\x73\x16\xa5\x09\x2c\x3a\x26\x2d\x86\xd5\xc9\x56\xc8\x6f\x88\xe8\x5d\x11\x20\x94\x2c\x66\xf9\x86\xe6\xfa\x18\x1b\xea\x27\xc4\x81\x45\xbe\x59\x93\x68\xb4\x0c\x17\xb3\xbe\x49\x34\xca\xa3\xe4\xa1\xe9\x49\x7c\x97\x48\x3f\x79\xa2\xb2\xb4\xf4\x1c\x2d\x95\xc1\x62\x39\x34\xc6\xa5\x88\x38\xe7\xf1\x2b\xf2\xaa\x9f\x10\x66\x2e\x36\x39\x6c\x38\xa1\x5c\x3b\x2c\xb6\xa2\x64\xef\xf4\xaa\x0f\xad\xfa\xc2\x56\x2e\xac\x3a\x55\xac\xcc\xa1\xdc\x55\x16\x7e\x99\xf1\x2d\x76\xbd\x32\x26\x56\x6d\x10\x38\xe6\x98\x90\xd7\x64\x75\x3d\x07\x3c\xf7\x40\xee\x92\x66\xae\x14\xe3\x3b\xc2\x62\xa3\x83\x11\xd1\x93\x26\xc4\x49\x34\x4a\xd8\x9c\x30\xb3\x3c\x75\x9e\x6a\x16\x9d\xd0\x64\xe4\x3e\xcf\xb5\xcd\x4b\xcf\x62\xc2\x82\xc2\x08\x0a\xe9\x30\x78\xaf\xe8\xe5\x31\x89\x1f\xf8\x1a\x8a\xeb\xca\x2c\xbb\xeb\x1e\x50\xb6\xb7\x45\x71\xd1\x1f\xf4\x55\x41\x10\xa9\xf4\x35\xe3\x57\xcc\x0c\xc5\xc6\x3d\x6b\xbc\x79\x17\xba\x3e\x8d\x97\xa9\x1d\x3a\xaa\x61\x36\x67\xda\xfd\xcc\x1d\x66\x92\xb6\x97\xb8\xa0\xcd\x3a\xb4\x33\x35\x08\x4a\x64\x6b\x49\x83\xfe\x51\xa2\x57\xc2\xb6\xc1\xf5\xb3\x85\x72\xa3\x5e\xbf\x68\x7e\x9e\x59\xf4\x03\x1c\x63\xca\xa0\x68\x1b\x1f\x20\xe6\x96\x61\xbc\x93\x1c\x3a\x70\x0c\x37\x61\x6e\xa3\xb9\x6b\xee\x20\xb0\x63\x07\x21\x04\xfb\xe6\x5d\xfc\xb4\x87\xac\xb9\x6d\x1a\xa5\x31\xf1\x58\x4b\x9c\x69\x37\xef\x6b\xf6\x6c\xf3\x1a\xff\xc2\x5d\xff\x1a\xf3\x5e\x90\x19\x1f\xf3\xfb\x1b\x25\xb6\xd7\x59\xa7\x7d\x0e\x3c\x9b\x4a\x8b\x47\x50\x87\xec\x6d\xf9\x42\x52\xb0\x78\x8f\x01\x1e\xf3\x75\x10\x51\x2d\xf9\x11\x57\xdd\x78\x99\x21\x58\x73\x66\x2d\x43\x4b\x20\xb3\xf2\x3d\x32\xac\x7c\xf4\x0f\x3f\x1e\x31\xa3\xe0\x8c\x31\x79\x62\x05\xf6\x3e\x1c\xc1\x4d\x2e\x6b\x6a\xb5\x23\xbd\x04\x33\xe3\xcf\x60\x1d\x8e\xf6\xb5\x44\x5a\x61\xca\x88\xce\x45\x01\xc9\x7f\xbe\x05\xc7\x19\x6b\x38\x92\x84\xd9\xda\x75\xc7\x2f\x31\x8f\xf1\x30\x5a\xab\x35\x01\xe9\x58\x2f\x68\xc9\xad\x0e\x78\xfb\x50\xaf\xff\xbf\xd8\x8e\x35\xad\x35\x02\x87\xc7\x17\xf7\x3c\x19\x4b\xcf\x93\x84\x49\xd5\xc0\x81\x47\xda\x7a\x13\xb9\xc7\x81\xd0\xb6\x1b\x53\x7f\xa6\x0b\x1a\x73\x17\x21\x86\xdb\xf0\x58\xed\x24\x40\x1b\x1e\x17\x0d\xdc\x37\xc5\x3e\x98\x39\x7a\x73\xbe\x38\x99\x2d\x74\x15\x78\x45\x77\x6c\x31\xe7\xf9\x4a\xc3\x25\x18\xa1\xd2\xa9\x28\x71\x9a\x9e\xce\x48\x34\xd4\x4a\x5d\xef\x74\xa0\x22\x2a\xaf\xd8\xcf\xe5\x28\xb3\x7c\x37\x5b\xa0\x20\x06\x71\x07\xee\x85\xb8\x27\x78\x2a\xed\x93\x32\x7b\x3e\x37\x6f\x2e\x7f\x05\x8f\xdf\x2f\x84\xb7\xb3\x66\x36\x9c\x90\x0c\xeb\x3c\x6b\x53\x97\x92\x96\xdd\x10\xbb\x50\xd0\x6c\xc2\x7b\xef\xbc\xf1\x0e\x0c\xfd\x24\x05\x92\xa4\xc1\xd4\x4f\xc9\xed\x42\xcf\xf8\x41\x3e\xe6\xd8\x00\x9a\x8c\xff\x35\xf9\x80\x32\x6d\x60\x9b\x9b\x56\x01\xac\x33\x84\x6e\x8a\xd1\xe3\x36\xb6\xa8\xd8\x5c\xef\xc8\x39\x43\xab\x33\x80\x9b\x1d\x38\x82\xdb\x8a\x14\xb4\xf6\x76\xc6\x3d\x5e\x63\x22\xba\x9c\x58\x72\x4f\x26\x17\xfb\xe7\xf6\xa4\x5c\x98\x14\x6f\xde\x8a\xc9\x43\xd2\x01\xcd\x2d\x25\xaa\xa1\xa2\x0b\x33\xca\x20\x5d\x16\x94\x2e\xe2\xc2\x7f\x80\x3e\x09\x26\xe7\x16\xa7\x99\x8c\xd2\x7c\x5f\xe9\xa2\x97\x85\x5e\x5c\xbb\x62\x34\x40\xb0\xea\x06\x50\x87\x29\x6f\xa8\x36\x30\x35\x25\x7f\xdb\x68\x52\xb2\x1f\xbd\xe7\xbe\x44\xbf\x8d\xd5\x83\xa4\x45\x27\xcf\x17\x1f\x2d\xf9\x20\x4e\x2f\x6b\x5c\x7a\x71\xab\xec\x17\x7b\x4d\xf0\x85\xd6\xd9\x4a\x0b\xf6\x83\x84\x58\x0b\xb5\x7b\x61\x5a\xe4\xf9\x92\x4e\x5b\x85\x1a\x59\xdb\xc6\x7d\x57\x32\x3d\xb7\xf8\xd3\x96\x16\xda\x1e\x8e\x27\x9d\x31\x57\x5d\x6e\xb4\x9e\x77\xb9\xb1\x74\x79\x61\xae\x0f\xca\xec\x0f\xa6\x05\x82\xd1\xaf\xa7\x13\xa5\x0e\x96\x2f\xbf\xf8\xda\x17\x69\x9f\x28\xb5\x50\x58\x05\xdd\x51\xcf\x99\x2a\x56\x32\x56\xb8\x2b\x19\x2b\x72\x11\x87\x4b\x1b\x7d\xe1\xc6\x96\x9f\xe6\x92\xba\x08\x2b\x24\xa2\x98\xb3\x0b\xd3\x14\x13\x89\x33\x57\x52\x9c\x6a\xac\x73\xa1\x95\x8b\x56\x8e\xae\x8f\x8c\x8b\x99\x31\x46\x5a\x5b\xd6\x7a\xd5\x12\x3c\xc7\xb0\x25\x12\x1c\xc7\x88\x6c\xa0\x65\x52\xf1\x05\xde\x1b\xad\x22\x15\x7d\x10\xa7\x96\x31\xf6\x33\x28\x51\xf5\xa0\x70\x02\x79\x15\xa3\x6c\x7e\x30\xf7\xc3\x34\xa0\x33\xde\xab\x66\x21\x5e\xe5\x06\x7a\x5d\x3e\x8b\x96\x14\x5e\xe5\x2e\x97\xc1\xe2\xc6\x75\x95\x92\x8e\x63\x92\x8c\xa3\xc9\x20\x51\xcb\xce\x52\xd3\x87\x3c\x2a\xc1\x02\xd6\xea\x4a\x2b\x42\x6e\x18\x3e\x52\x06\x68\xed\xe8\x05\x9e\x9c\xd8\xd7\xdd\xb4\x64\x7c\x5b\x55\xa4\x1b\xe0\xfa\xfd\xe2\x0b\x20\xe6\x44\x2b\xc8\xa1\xeb\x7f\x0e\x04\xd0\x84\x70\x99\x5d\x25\x1b\xe0\x5a\x5f\xbc\x70\x07\xdf\x05\x95\x0e\x0b\x15\x30\x11\x1b\xde\xbd\x20\x92\x6c\xb8\xf5\x82\x84\xf4\xb9\x90\x55\x2d\x77\x60\x61\x1f\xec\x17\xdd\xa8\x7f\x77\x91\x66\xa4\xda\x69\xb6\x67\x58\x37\x04\xe1\x80\x2c\xde\x19\x5a\x99\xa3\xb2\x01\x9f\xa5\xbb\x6f\xfb\x6f\x3b\xf0\xb6\xff\xf6\x01\xb4\x65\xe4\x9f\x80\xbb\xc3\xe4\xbb\xa0\x9d\x3f\x3d\x41\x21\xa9\x8c\x4a\x84\xea\x85\xb5\x82\xf9\xe3\x15\x08\xe7\xe0\x02\x06\x27\xec\x81\xac\xd0\xb6\xcd\x65\x82\x7e\x17\x3f\xe8\xec\xcf\x12\xcc\xd3\x3e\x8c\x85\x0f\xa5\xdf\xd3\xc0\x74\x73\x42\xdb\x1d\xcd\xd0\x0d\x0e\x1c\x18\xc0\xf5\x9c\xa7\x37\xfd\x5a\x1b\xfc\x3f\xec\xbd\x79\x77\xdc\x36\xb2\x38\xfa\xbf\x3f\x05\xe2\xdf\xbb\x51\xb7\xdd\x6e\x03\xe0\x2e\x8d\x26\xd7\x71\x9c\xc4\xef\x3a\x76\x8e\xad\x4c\xc6\x3f\x3f\x1f\x05\xc4\x62\x71\xdc\x22\x35\x24\x65\xab\x27\xd6\x77\x7f\x07\x1b\x09\xb2\xc9\xee\x56\x4b\x56\x32\x73\x1d\xe7\x40\x4d\x2c\x05\xa0\x50\x55\x28\x6c\x55\xd3\xa9\xad\x5c\x2d\xed\x59\xa7\xf2\x79\x55\x94\xdb\x13\x85\x16\xf9\xa4\xa2\x5c\xdd\x23\x36\x4f\xb2\xdc\x35\xb9\x65\xc7\x3e\xde\x2c\x5b\x5f\x69\xb6\xb3\x85\xb6\x91\x42\x96\x62\x15\x82\x65\xc3\xe6\x94\x2c\x16\xab\x7b\x7c\x9a\xfc\x9c\x61\x70\x5b\x69\x79\xb2\x5a\x33\x51\x3a\x44\x35\x02\x65\xc3\x4c\xdb\xca\xc1\x46\x09\x9a\x77\x26\x72\x27\x5e\xb5\x56\xe3\xe1\x0a\x2b\x21\x74\x8b\x56\x43\xaf\x38\x91\xfd\xeb\xdf\x74\x22\xdb\x6d\x21\xb3\xd5\x1a\x69\x60\x92\xfc\x97\x3b\x49\x2a\x53\x83\xcd\xf9\x80\x32\x26\xd8\x2c\x37\x72\xf7\xa3\x15\x27\x70\x1e\xac\x4e\xa8\x70\x06\x50\x6f\xf6\x1c\x98\x43\x94\x6b\xe0\x8b\x9b\x9e\x3b\xec\xf4\x76\x31\x53\x62\xcd\x99\x3d\x36\xce\xe4\x0f\x50\x4f\x58\xf6\x9f\x48\xae\xce\xd1\x46\xa6\xab\x77\x91\x93\x49\xa6\x6f\xb1\xdd\x03\xca\xac\xe2\x44\x4e\x19\xb9\xfa\x54\xb6\xef\x26\xb9\x31\x33\x39\x3a\xe3\x5e\xe7\xa4\x41\x8d\xdd\xfd\x63\x65\xfa\x51\x8d\xdc\xfd\x63\x65\xf9\xb1\x23\x92\xde\x5c\x40\x99\xba\x32\xd7\xec\x24\x33\x73\x65\xdb\xef\x26\x04\xe7\xd4\x99\x0d\xaf\x22\x44\x3f\x97\x26\xe0\x2c\x19\x65\x22\x92\x89\x12\x73\xcd\xd4\xdf\xcd\xf1\xd7\x43\x90\xcb\x2c\x26\x39\xd7\x87\x2d\x12\xcf\x4e\x36\x9b\x9a\x99\xd4\x86\x72\x56\x06\x63\x2b\xa1\xfe\xaf\x21\xa1\x6e\x87\x77\x5b\xb1\xbe\xcd\x4a\x6c\xfb\x65\x51\x7f\x6a\xb8\x85\x5b\xe1\x57\x9e\x1a\x9a\x29\xf5\xdf\x73\x6e\x70\xe5\x77\xd3\x95\xc1\x55\xce\xb8\x5c\xee\x08\xf4\x3f\x9d\x90\xbe\xfe\x61\xeb\xf5\xb5\xb8\x76\x39\xd7\x28\x4a\x8d\x66\xec\x2e\xed\xd4\xda\xcd\x18\x9b\x6e\x0f\x75\xc7\x84\xd5\x1f\xa9\x97\xee\xda\xa3\x5b\x90\xbe\x37\x26\x17\x1d\x7e\xf8\x6c\xda\xee\xad\xdb\x5c\x3d\xcd\x16\x0b\xc9\x37\x45\xce\xaa\xdd\x1f\x34\xaa\xed\xc9\x0f\xeb\xde\x41\x84\xcd\x8b\x46\xa7\xc6\x2d\x1f\x31\xb4\xd0\x07\x77\x4c\x7b\xe3\xf5\xf0\x21\xc8\x8b\xe2\xec\xce\xa5\x73\x7f\x87\x69\xe7\x44\xcd\xc5\x6d\xf9\x3d\xaf\x78\x7d\x94\x9d\xf2\xc9\x7d\xf9\x05\xee\xeb\xe4\x83\x4e\xb9\xbe\x21\x1e\xfb\xae\x21\x67\xea\x22\x29\x29\x6b\x73\x37\xf3\xe1\x43\xf0\x28\x07\xc5\x59\x9d\x9d\x66\xff\xe2\x4c\xe2\x4e\x7b\x9d\xd0\x86\x77\xe5\x62\xb8\x3e\xc9\x2a\x50\xa9\x04\x63\xd6\xd9\xc1\xc4\x9c\x7f\xe0\x65\x87\xf8\xcc\xe1\x78\x73\x5c\xa9\x4f\xc7\xde\xb7\x0f\x35\x9a\x4b\x5f\xef\xa7\xe0\xd3\x27\xf0\xd5\xe4\xbd\xba\x5f\xd0\xba\xe2\x3e\x5f\x2c\x9a\xcc\x2a\x11\xb5\x89\x4e\xd5\x07\x57\xf3\x17\xb1\xed\x60\x48\xa4\x5a\x06\xea\xa0\xdb\xe9\x8d\x42\xfc\x43\xf0\x5e\xaa\xb0\xef\x8d\x4b\xd8\xf1\x41\x5b\x33\x6c\x83\xe5\x57\xad\x28\xd9\xfd\x7c\x67\xfc\xa4\xde\xfc\x5e\x5b\x9e\x39\xb8\x9e\x57\x05\x07\xa5\xc6\x66\x4c\x87\xb7\x0e\xdd\x4f\x2d\x1e\x56\xef\xf4\xa2\x5b\xb7\x55\x7a\x4b\xac\xbf\x9b\xc2\x62\x0d\x57\x8f\x2b\x43\xe6\xe4\x4c\xdd\x8e\xfb\x1c\x22\xa5\xa5\xe2\x0d\x34\xbc\x65\x3f\x1a\x87\xca\x26\xe6\x95\x6e\xb4\xac\x74\xad\x23\xe3\x6d\x81\x1c\xec\x26\xf6\x3e\x43\xdd\x23\xa2\xb3\xcf\x7b\xd7\xae\x76\xb5\xc7\x9d\xfa\x54\x97\xdf\xf1\xfa\x97\xa3\xc7\xba\x4c\x35\xb1\xaf\x29\x76\xe6\xf4\x0e\x93\xb7\xfc\xbd\x81\xb5\x6f\xdd\x0e\xe9\x69\x96\x9f\xd7\xfc\x3f\x81\xb5\x75\x4f\xfe\xf4\xac\x4d\x3b\x24\xfa\x93\x6e\xf4\x55\x59\x7b\x14\xc8\x2d\xb0\xf6\x96\x75\xdf\x34\x6b\x8f\x55\xbb\x25\x6b\xeb\x02\x37\xc0\xd7\x9a\xcc\x9a\xc9\x5b\x73\xcf\xa1\xf9\x35\xca\xd7\x9f\xf1\x19\xde\x88\x7d\xe1\xe2\xbc\xfc\x4f\xe0\x6a\xd9\x8f\xcf\xc6\xd3\xb2\x82\x42\x88\x8a\xab\x67\xc9\x86\x52\x24\x73\xfc\xab\xc8\xf9\x0b\x95\x30\xb9\x11\xbe\x04\xff\xb5\x3d\x8c\xb4\x03\xe3\x47\xd9\x7f\xc7\x95\x9d\x69\xae\xba\xb7\x6e\x7e\xdf\xdf\xb0\x30\xdf\x0e\xf8\x98\x7c\x33\x72\xe2\x81\xa9\xed\x4a\x3c\x3b\x5c\xdb\x95\x30\x3a\x0c\x02\xdc\xb7\xcd\xb9\x05\x81\x37\xd2\x8b\xcf\x2b\xee\xc6\x06\x6a\x2b\x61\x27\xb3\xdf\x80\xa8\x93\xbc\x67\x0d\x16\x2b\x71\x72\xa8\xfe\x8e\x0a\xb9\xdb\xb3\x4c\x69\x6d\x2c\x91\xe5\x7f\x82\x8c\x63\x64\x2b\x83\xb1\xd7\x52\x5b\x34\x49\x40\xb5\xd3\x29\xff\xdf\x92\x71\xbe\x23\x35\x9f\x58\xb2\x52\x1f\xd3\x2b\x6d\x82\xb8\xf4\x0f\x1e\xa8\xcf\x41\x19\x6b\xb2\x0c\xa5\xdd\x8c\x62\x74\x15\xde\x23\x1d\x20\xdf\x91\xe5\x15\x58\xcf\xe0\xe8\x41\xf3\x20\x77\x67\xee\x63\x64\x69\xdd\x48\x4a\x32\x97\x13\xd4\x72\x94\xf5\x6e\xf1\x99\xef\x4d\xdb\x54\xab\xce\x73\x46\x96\x37\x6e\xc2\x6d\xcc\x62\xdc\x69\xd1\xa9\x6e\x58\xb0\xd4\xe7\xbc\x62\x6a\xdc\xc7\xf3\x7c\xe4\x2c\x77\x73\xdd\x54\xc3\xe9\x48\xc3\xeb\x93\xf3\xb2\xda\xdc\x74\x51\x66\x9b\x5a\x5e\x91\xfa\xbc\xdc\x98\x49\x0d\x4b\xb5\x36\x8f\xc6\xe5\xfa\x3c\x06\x95\xeb\x33\x35\xb8\xdc\x00\xcb\xa0\x60\x7d\x2e\x8d\x81\xf5\x79\x2c\x0a\xfe\xdd\xa7\x8f\xe6\xd0\xec\x23\xe7\xef\x19\x59\x5a\x33\x5a\xb7\xb4\x57\x3b\x34\x3d\x3c\x00\x4e\xcc\x52\xcd\x17\x11\x78\x00\xb2\x29\xf8\x2f\x10\xd9\xbb\x58\xe3\xb3\xd2\xb6\xdb\xbb\xe3\x33\x13\xb8\x67\xea\xb9\xf2\x3e\xef\xbf\xcd\x0c\xc5\x3b\x40\x7e\xe5\xfc\xbd\x55\xe3\xcd\x23\x63\xb5\xe9\xa4\x38\x18\x1c\x36\xb4\x01\xed\xaa\xb5\xe8\x25\x20\x93\x60\xc5\x5e\x9b\x82\x4d\x4a\x2b\xec\xda\x34\xcf\x96\x32\x5c\xe9\x24\xf9\x26\xc9\x08\xa3\x36\x21\xb0\x1b\x62\x56\x04\xb5\x49\xea\xf0\xa7\x6d\xb7\xda\x2c\x53\xbf\xec\xa4\xd7\x36\x5d\x2d\xb8\x8b\x7e\x5a\x23\x69\x0e\xed\x4f\x37\xd5\x11\x31\x87\xed\x47\xa7\x7c\x23\x5d\x0e\x9b\xdf\x6e\xba\x95\x2b\x87\xe6\x97\x9b\xd6\xca\x93\xc3\xe6\xf7\xe8\x64\xfd\x19\xdf\xed\x8c\xca\xe9\xfa\xe4\xb6\x4e\xee\x64\x5d\x9f\x5d\x9d\x55\x0c\xaf\x6f\x31\x5d\x53\xc3\xfd\x49\xb6\xb7\x11\x24\xfa\xeb\x6a\x3a\xae\x91\x18\xb6\xa8\x23\x28\x5a\x68\x56\xac\x7c\x7f\xbe\x58\xbc\xe6\xa4\xec\xe6\x6b\x63\xa5\x28\x41\x78\xdb\x3d\x2d\x0d\xfe\xda\x3b\x5a\x12\x4c\x2b\x1a\x24\xa5\x1c\xea\x1f\xa3\x14\xfc\x19\x1f\x0e\x0c\x53\xf0\x92\x93\xcf\xbf\x9d\xa5\x09\x58\x56\xf5\xd9\xe9\x57\x0f\x1d\x9c\x81\x1b\xa1\xe1\x86\x7e\x2c\x65\x38\x64\xb6\x03\x25\x6f\x22\xd2\x2d\xc9\xb3\x53\x60\xe7\xf3\x6f\x39\x1c\xa3\x07\xdf\xa6\x46\xe7\x98\xbb\x7f\x12\xde\x39\xf6\x06\xdf\xe8\x1b\xe3\xdb\xbd\xc1\xba\x8e\x62\xd4\xf4\xbd\x77\x52\xd0\x43\x6f\xe7\x58\x7b\x94\x3a\x6e\x44\x5f\xda\x4c\x23\xed\xf9\xf8\x75\x4f\xb9\xe5\x98\x19\x81\xa2\x19\xf7\x50\xfd\x1d\x13\x27\xf8\x33\x5e\xdf\x1e\x16\x27\xe7\x35\xfd\xe9\x3f\xe6\xe0\xab\xe9\xcc\x67\x97\x5a\xce\xf9\xe8\x15\xa4\xd3\xff\xc2\xd3\xa6\x5f\x8e\x1e\xdf\xd8\x81\x53\x33\xbc\x86\xa3\x1c\xda\x3d\x6c\x3f\x46\x79\xeb\x33\xde\x7f\x1d\xe5\xad\x1f\xff\x43\x0e\x9f\x4c\x57\x6e\x83\xaf\x2c\xb9\x5c\x6d\xe2\xff\x5f\x76\xae\xf1\xcb\xd1\xe3\x1b\x3a\xda\x30\x23\xdb\xb2\xd4\x8f\xe6\x80\xc3\xfc\x1c\x65\xa7\x5b\xbf\x7b\x79\x5e\xd3\xef\xfe\xfd\xf7\xa9\x0c\x96\xbf\xbb\x85\x93\x8e\x86\x48\xae\xac\x46\xff\x72\xf4\xb8\xb3\xab\x64\xbf\x77\x3f\xf2\xb8\xb5\x63\x87\xb6\xa9\x37\x70\xf2\xa0\x07\xaa\xe5\x8d\xef\xf4\xbe\x86\xfe\x35\xca\x19\xb7\x60\xaa\xfa\x73\x1d\x41\x9c\xd7\xf4\xd5\xed\x9e\x42\xc8\x79\x7b\x9b\x83\x88\xf3\x9a\x1e\x6d\x71\x16\x71\x5e\xd3\x5f\x6f\xf9\x38\x42\xb6\x6c\xbb\x13\x89\xf3\x9a\x7e\xbf\xf9\x50\x42\x8e\xc1\x36\xe7\x12\xcd\x58\xad\xdf\xe0\x6f\x10\xbc\x31\xdb\xd1\x36\x07\x14\x2e\x82\x37\x43\xdc\xea\x98\xa2\x41\xcb\xc6\x6c\xaf\xfe\xd3\x0e\x2b\x14\x36\xff\x88\xf3\x8a\x71\x09\xef\x9c\x5a\xa8\xc8\x0d\x07\x17\xc3\x93\xcc\xb6\x6b\xf1\x4d\x13\xcd\xee\x27\x18\x37\x7f\x8a\xd0\xf0\x9b\x9e\x01\x7e\xed\x9d\x25\x34\x7c\xd6\x4d\x46\x6d\xf2\x51\x73\xa8\xe0\xa4\xe3\x36\xfd\x57\xe7\x68\xc1\xc9\xe1\x39\x10\xda\x03\x06\x27\x83\xdf\x66\xf8\xde\x1e\x33\x38\xc9\x41\x9b\xfc\xaa\x3d\x6c\x70\x32\x34\xe7\x0d\x8e\x44\x39\x6c\x3f\xdc\xdd\x7d\x47\x98\x1c\xb6\x1f\xbd\x1c\x47\xed\xf1\x43\xfb\xd5\xcb\xf3\xab\x7b\x08\xe1\x7e\xf7\x61\x39\x47\x11\xce\x67\x2f\xd7\xf7\xcd\x81\x44\xf3\xd1\xcb\xf1\xca\x39\x96\x70\x3e\x47\xe7\xf0\x5b\xbf\x7e\xac\x91\x79\x6b\x87\x13\xb6\xba\xdb\x50\x42\x07\x8e\x28\xae\xa5\x9a\x76\x0f\x2a\x9a\x88\x9d\x76\x78\x9d\xd2\xce\x0e\x6f\x07\xe6\xa4\xcd\x3a\xbc\x1f\xdc\x49\xb8\xd2\xb9\x45\x5b\xcf\x4d\xec\x8d\x38\xa7\x17\x2d\x35\x1d\x36\xbf\x47\x69\xfd\xd6\xaf\xe4\x9e\xd7\xf4\xf5\xed\x1d\x63\x98\xda\x6e\x65\xef\x62\xf8\x30\xe3\x5a\xd4\xbe\xb2\x5d\xdd\xa5\xc3\xdd\x68\x7e\x0b\x42\xde\x9e\x84\x6f\xe6\x78\xc3\x0c\xd3\xbf\xdf\x09\x87\x8b\x81\x81\x43\x8e\x2e\xb6\x47\xce\x39\x56\x69\xe7\x06\x35\xac\xad\x28\xe8\xe6\xce\x3c\xcc\x40\xb6\x92\xe8\xb5\x39\xf9\xb0\x23\x3c\x26\x87\xfe\x5c\xfe\x59\xb2\xaa\xf8\x7e\x83\x1b\x8c\x04\xee\xbe\x54\xe0\x8e\x6b\xd0\x35\x56\x3a\xfd\xde\x82\xe1\x8c\x94\x15\x7f\x5a\x15\xcf\x49\x9d\x7d\xe0\x13\xed\xd8\xd1\x31\x38\x40\xd4\xe1\x47\xce\x3f\x02\x35\xeb\x9a\xf4\x03\xd7\xf9\x81\xb2\x0f\xa5\xe8\xb8\x61\x11\xf9\xd9\xe8\xb9\xb6\x0a\x70\x08\xee\x37\x80\xee\x62\x08\xe1\x03\x88\x1e\x40\x74\x04\xe1\xbe\xfa\x7f\x0e\x21\xfc\xbf\x77\xf5\x2b\xee\x6f\x7a\x2d\xbb\x03\xb6\xb3\xf0\xb8\x8a\x0a\x7b\xe4\x70\x5e\xd3\x9f\x25\x48\xcd\x81\xdb\x0e\x95\x65\xdf\xac\x2a\xba\xee\xc4\x35\x45\xdf\x90\x5f\x7f\xdb\xd7\x01\x3f\x33\xf8\x4f\xe5\x4c\xff\xb8\xce\x4e\xd7\x79\x44\xb9\x8e\x93\x18\x05\x7a\xa3\xa7\x98\x78\x57\x13\x4a\xb6\x86\x71\xde\xf0\x8c\x09\xa5\xeb\x3b\x48\xba\xf2\xd2\x5b\xb7\xac\xb1\x84\x49\x16\x3c\x67\xa4\xdc\x44\xaa\x4e\xa7\xde\xdc\xfd\x60\xa9\x5c\x29\x27\xf7\x1e\xbe\x9d\x6d\x87\x8e\x37\x77\xff\x69\x4b\x6a\x0d\xfe\x2a\x45\xcf\x6d\x51\xbb\xc6\xdd\xba\xe4\xc2\x96\x34\xdb\xb1\x5b\x17\x3c\xb5\x05\xed\x11\xc7\xd6\x25\x8b\xa6\x9f\xcd\xa9\xe3\xd6\x65\x4b\x5b\xb6\x7d\xfa\xba\x75\xd9\xbc\xad\xb7\xb5\xbd\xb0\x01\xc0\x2a\x47\xd8\x13\x1e\xb9\x22\x6d\xad\xb6\x37\xa6\x81\xa4\x54\x9d\xff\x72\xf4\x78\x22\x05\xab\x9a\xd5\xd1\x74\x06\x56\x63\xf1\xf4\xed\x88\x3f\x33\x7c\x0b\x56\xaf\xaf\x64\x72\x7a\x51\x94\x6b\xcc\x36\xc3\xf8\x7a\xde\xcc\xb6\x33\x16\xac\xdb\x30\xa8\xc4\xdd\x45\x22\x8a\x52\x5f\x88\x48\x40\x8e\x29\x81\x98\xb2\x10\x47\x38\x4e\xfc\x30\x4a\x59\x4c\x83\xd0\x4f\xb9\x17\x45\x14\x47\x42\xfe\x4b\x69\xca\x30\x46\x51\xca\xa9\xb8\x3b\x1d\x1a\x81\x5b\x30\x1b\xfb\x1f\x35\x02\x5e\xe2\xa5\x51\x12\xe0\xc0\x27\x5e\x98\x86\x9c\x8a\x84\x26\x9c\xf1\xd0\x8b\x12\x2f\x89\x29\xc1\x01\x4e\x03\x2a\xc2\x94\x72\x96\x26\x34\xa6\x21\xf3\x50\xca\x12\xee\x25\x3c\x4a\x49\x80\x79\x44\xd3\xc4\x8f\x7d\x8f\x7a\x09\x61\x7e\xe2\x13\x16\x86\x28\x4c\x79\x94\x84\x09\x8d\x52\x1f\x45\x1e\x09\x02\x94\xf8\x94\x87\x2c\x65\x8c\x27\x9c\x85\x83\xa3\xe7\xdd\x82\xad\xc4\xff\xac\xd1\x43\x31\x4e\x59\x98\x12\xce\xc2\x84\x53\xc2\x11\x0d\x59\xca\x05\x0f\x83\x00\x32\xc1\x62\xe6\x51\xc1\x08\x0f\x53\xc1\x18\x24\xd8\x43\xc4\x0b\xfc\xc8\xa7\x7e\x14\x12\xc4\x92\x24\xa5\x11\x4f\x28\x8c\x82\x30\x4d\x51\xc2\x13\x42\x63\xc9\x63\x8c\x32\xc2\x08\x4f\x43\x4f\xfe\x4b\x42\xf9\x2f\x65\xf2\x1f\x4b\xe4\xbf\xe1\xd1\xbb\x05\x73\x66\xff\x51\xa3\xa7\xa5\x1f\xe1\x34\xe2\xb1\x96\x81\x42\xa4\x69\x14\x6b\x49\x98\xc4\x4c\xc4\x44\xcb\x43\x21\x92\x38\x09\xb5\x54\xa4\x41\x0a\x59\xa0\x65\x23\xf5\x13\x9a\xf8\x5a\x42\x8a\x28\x0d\x99\x91\x93\x34\x92\xff\xb4\xb4\x94\xc3\x16\x33\x2d\x33\x13\xce\x08\x0f\x86\x47\xef\x4f\xe5\x9d\x9a\x79\x1a\x77\xa3\xc3\x17\xec\x7c\x26\xc4\xbc\x63\xc7\x18\xfd\x1a\xfa\xd0\xfb\x55\x9f\x91\x40\x56\xdb\x62\x35\x14\x27\xf2\xf1\x79\xca\x4f\xf8\x22\xbb\x78\x56\x18\x23\xbf\xdb\x50\x5e\x8b\x3f\x0b\x92\x5a\x38\x1a\x86\xa7\x94\x99\x79\x20\x03\x38\xdd\xca\x73\xe8\x46\x98\x0f\xb0\x6f\x81\xa2\x39\x9c\x0e\x52\xd9\xbf\xc1\x49\xfc\xd8\xa9\xf2\x47\x52\x9e\xde\xda\x21\x3c\x2d\x8a\xc5\x4a\x65\xff\x96\xfc\xa3\x1e\xb8\x90\xf2\x74\x6b\x0f\x4b\x7f\x10\x47\x3c\x40\x9a\x25\x22\xc5\x13\x5e\x70\x43\x4c\x11\xcb\x75\xc4\x3c\x50\xa0\xe3\xa9\x3d\xd7\x93\xc3\xfb\x67\x47\x08\x0e\x6f\x0f\x1f\x25\xc9\xf2\xb4\xf8\xb8\xb5\xfd\xfe\xf5\x75\xec\x76\x6e\x93\xf6\xb6\x20\x8c\xcf\x1a\xeb\xc0\x0d\x82\x4f\x9f\x40\xad\xac\xd0\x81\x1a\x3c\xe8\xec\x74\x6b\x17\x6d\xea\xa1\x56\xe5\x7a\x6c\xae\x8d\x03\x2c\xb5\xdb\xa7\xbb\x38\x3f\x01\x87\xc0\x0b\x21\xb8\x27\xa1\x00\x04\xa1\x9b\x28\x4b\xa3\x79\x20\x13\xe6\x81\xcc\x52\xb9\xa9\x92\x64\xe0\x3c\x56\x40\x93\x36\xb5\x71\x7b\xa2\x50\x78\x5f\x79\xcf\x1a\x5a\x9e\x7a\xb7\xe0\xf1\xfe\x73\x09\xdf\x53\xf2\xee\x94\xdc\xb8\xf4\x1d\xbb\x74\x95\xe5\x82\x97\x79\x71\xe3\xf5\xb1\x91\xfa\xce\x16\xa4\x1a\xe8\xde\xcd\x6b\xbb\xad\x85\x6f\x72\x7a\x66\xac\x7b\x36\x5b\xd5\x79\x63\x89\x54\xdb\x3a\x3d\x18\xf0\xfc\x5a\xf7\x2e\x78\x68\x73\xb7\xab\x8e\xeb\xb3\x5c\x7b\xee\xe8\xf8\xab\xaf\xc1\x3d\x90\x4f\xa7\xd3\xb7\xad\xa7\xd8\x9d\xb5\x2b\xd5\x81\xeb\xeb\xe0\xbe\x0f\x51\xe0\xfb\x3e\xc4\x41\xe8\x07\xd0\x0f\x22\x3f\x80\x41\x90\xf8\x21\x8c\x02\xe2\x87\x30\x0e\xa8\x1f\x42\x12\x30\x3f\x84\x69\xc0\xfd\x08\xb2\x10\xfa\x11\xe4\x21\xf2\x23\x04\x43\xcf\x8f\x10\x0a\x7d\x3f\x42\x5e\x18\xf8\x31\xf2\xc3\xc8\x8f\x51\x18\xc6\x7e\x8c\xa2\x30\xf1\x63\x14\x87\xc4\x8f\x11\x09\xa9\x1f\xa3\x34\x64\x7e\x8c\x68\xc8\xfd\x18\xb1\x50\xf8\x31\x12\x11\xf4\x63\x0c\x23\xe4\xc7\x18\x45\x9e\x1f\x63\x2f\xf2\xfd\x18\xfb\x51\xe0\xc7\x38\x88\x42\x3f\xc6\x61\x14\xf9\x31\x8e\xa3\xd8\x8f\x71\x12\x25\x7e\x84\x49\x44\xfc\x08\x53\x15\xb2\x28\xf5\x23\xb9\x0c\xf7\x23\x2c\x22\xe6\x87\x1e\x8c\xb8\x1f\x7a\x58\x85\x5e\x24\xfc\xd0\xf3\x63\xe8\x07\x5e\x10\x23\x3f\xf0\x22\x15\xc6\x31\xf6\x7d\x2f\x89\x3d\xdf\xf7\x88\x0a\xd3\xd8\xf7\x3d\x8f\xa9\x90\xc7\x81\x8f\x3d\x21\x43\x1f\xc6\xa1\x8f\x7d\x14\x87\x3e\xf2\x71\x1c\xf9\xc8\xf7\xe3\xc8\x87\x7e\x10\xc7\x3e\xf4\xc3\x38\xf6\x84\x1f\xa9\x30\x8e\x13\x8f\xfb\x89\x0a\x89\x0a\x69\x4c\x3c\xe6\x33\x15\xf2\x98\x78\xd4\x17\x32\x0c\x60\x9c\x7a\x69\x80\x54\x88\xe3\xd4\x23\x81\xa7\x42\x3f\xa6\x5e\x12\x04\x2a\x0c\x63\xea\xc5\x41\xac\xc2\x24\xa6\x5e\x14\x10\x15\xa6\x31\xf3\xc2\x80\xaa\x50\xae\x70\x83\x80\xab\x50\xc4\xcc\x93\x03\x26\x43\x14\x33\xcf\x0b\xb1\x0a\xbd\x98\x79\x38\xf4\x63\xee\xe1\x30\x88\xb9\x27\x07\x47\x86\x91\x0a\xe3\x98\x7b\x30\x4c\x54\x48\x62\x8e\x45\x98\xaa\x90\xc6\x1c\xf3\x90\xa9\x90\xab\x50\xc4\x1c\xb3\x08\xaa\x10\xc5\x1c\x53\x13\x62\x15\x7a\x31\xc7\x69\xe4\xab\x30\x88\x39\x26\x51\xa8\xc2\x48\x85\x71\xcc\xe5\xc8\xa9\x90\xa8\x50\xd6\x12\x47\x54\x85\xb2\x96\x28\xe2\x2a\x94\xb5\x44\xb1\xac\x25\x8c\x91\x0a\x71\x13\x06\xb1\xa7\x42\x5f\x85\xb2\x16\x3f\x0e\x55\x28\x6b\xf1\xe2\x58\x85\x89\x0a\x49\xcc\x30\x8e\x53\x15\x52\x15\xb2\x98\x61\x14\x73\x15\x0a\x19\x26\x50\x85\x28\xa6\x18\x26\xd8\x09\xbd\x98\x22\x91\xf8\x2a\x0c\xe2\x14\x89\x24\x54\x61\xa4\xc2\x58\x85\x49\x4c\x90\x48\x48\x4c\x10\x4f\x52\x15\xd2\x38\x41\x3c\x61\x71\x82\x44\xc2\x55\x28\xe2\x18\x09\x02\x55\x88\x4c\x18\x21\x41\x70\x1c\x61\x48\xbc\x38\xc4\x90\xf8\x71\x88\x11\x09\xe2\x00\x23\x12\xc6\x01\x96\xc8\x92\x61\x1c\xfb\xd8\x23\x49\xec\x61\x9f\x90\xd8\xc3\x01\x49\x63\x8c\x03\x42\x63\x8c\x43\xc2\x62\x84\x23\x15\xc6\x84\xc7\x10\x27\x44\x44\x02\x93\x14\x46\x02\xd3\x14\x45\x1c\xb3\x14\x47\x0c\xf3\xd4\x93\x4b\xe3\xd4\x8f\xa8\x87\xd2\x20\x4a\x3d\x9c\x86\x11\xf1\xfc\x34\x8c\x12\x2f\x48\xa3\x28\xf1\xa2\x34\x8e\x62\x2f\x4e\x93\x28\xf2\x48\x4a\xa2\xd0\x4b\xd3\x34\x0a\x3c\x96\xd2\xc8\xf7\x44\x4a\x23\xcf\x87\x29\x8b\xb0\x8f\x53\x1e\x21\xdf\x4f\x25\xcf\x86\x14\x4a\xfe\xa5\x28\xe4\x3e\xa1\x28\x64\x3e\xa5\x38\xa4\x3e\xa7\x5e\x98\x06\x90\xfa\x21\x09\x30\x0d\xc2\x24\xf0\x69\x10\xc6\x41\x48\xc3\x30\x0a\x62\x1a\x85\x81\xec\x44\xe8\x07\x94\xc6\xa1\x17\x70\x9a\x84\x38\x84\x94\x84\x30\xf4\x68\x1a\x88\x30\xa0\x69\xc0\xc3\x88\xd2\x80\x86\x09\x65\x41\x1a\x52\xca\x02\x12\x72\xca\x83\x38\x82\x54\x04\x51\xe4\x31\x18\x84\x51\xc0\x60\xe0\x47\x11\x43\x81\x17\x11\x86\x02\x14\x51\x86\x03\x18\x09\xe6\xf9\x3c\x46\xcc\xf3\x59\xec\x33\xdf\x4f\xe3\x90\x05\x92\x2f\x59\xe0\xc7\x71\xca\x42\x3f\x8c\x39\x0b\xfd\x20\x81\x2c\xf2\xbd\xc4\x63\x91\x8f\x92\x80\xc5\x3e\x4c\x62\x16\x7b\x3c\x49\x59\xe2\xd1\x84\xb1\xc4\x4b\x09\x64\xc4\x4b\x08\x66\xc4\x8b\x48\xc0\x52\x2f\x24\x31\x4b\x3d\x9f\x10\x46\x3d\x4c\x18\xa3\x1e\x4c\x21\x63\x58\xa4\x98\x31\xcc\xd2\x80\x71\x9c\xa6\x31\xe3\x38\x49\x09\xe3\x38\x4e\x19\x13\x38\xa4\x90\x09\x1c\x50\xcc\x04\xf6\x68\xc0\x21\x46\x34\xe6\x10\x43\x4a\x38\x42\x82\x32\x8e\x10\x63\x90\x23\x44\x19\xe6\x18\xa5\x2c\xe0\x18\x11\xc9\x1a\x28\x61\x84\x7b\x28\x61\x8c\x7b\x28\x66\x42\x86\x1c\x73\x1f\xc5\x3c\xe0\x3e\x4a\x78\xa4\x42\xc2\x03\x44\x24\x92\x50\xca\x05\x0f\x10\x15\x88\x07\x88\x09\x9f\x87\x88\x8b\x90\x87\x18\x8a\x98\x87\x18\x89\x94\x47\xd8\x13\x8c\x47\x38\xb8\x3b\x6d\x74\x50\xa5\x62\xa8\x29\xf0\x46\x66\x16\x28\xff\xf3\x21\x82\x10\x06\x10\x41\x04\x43\x15\xc6\x10\x43\x04\x13\x88\x21\x86\xa9\x0a\x19\xf4\xa0\x07\x85\x0c\x11\x86\x3e\xf4\x91\x0f\x03\xe8\xa3\x10\x86\x30\x40\xb1\x0a\x09\x8c\x60\x88\x28\x8c\x61\x84\x38\x4c\x60\x84\x21\x24\x30\xc6\x12\x46\x82\x7d\x48\x61\x82\x43\xc8\x20\xc1\x09\xe4\x30\xc5\x29\x82\x30\xc5\x0c\x21\x48\xb1\x40\x18\x32\x0f\x21\x0f\x32\x4f\xc2\xe6\x5e\x88\x02\xc8\xbd\x18\x85\x50\x78\x29\x8a\xa1\xf0\x18\x4a\x10\xf4\x04\x22\x08\xfa\x18\x51\x04\x7d\x1f\x31\x24\x67\x38\x8e\x90\x9f\x60\x88\x90\x9f\x62\x84\x90\xcf\x31\x46\x28\x80\xd8\x47\x38\xf0\x70\x80\x70\x10\xe0\x08\xe1\x20\xc6\x09\x42\x01\xc1\x04\xa1\x80\x62\x8a\x50\x20\x64\xfd\x21\xc2\x02\xa1\xd0\xf3\x10\x42\x61\xe0\x79\x08\x86\x91\xe7\x23\x18\x26\x5e\x88\x60\x98\x7a\x31\x82\x21\xf5\x12\x28\x42\xee\xa5\x50\x44\xd0\x63\x50\x44\xc8\x13\x50\x44\xd8\x87\x50\x44\xbe\x8f\xa1\x88\x02\xdf\x87\x22\x0a\xfd\x00\xc1\x28\x92\x33\x6f\x14\xfb\x89\x0a\x09\x82\x51\xe2\x53\x84\x22\xe2\x73\x84\xa2\xd4\x17\x08\x47\x69\x80\x10\x8e\x68\x80\x91\x17\xd1\xc0\x47\x5e\xc4\x02\x39\x65\xb3\x20\x42\x41\xc4\x83\x44\x85\x04\x85\x11\x0f\x28\x0a\x23\x11\x30\x14\x45\x22\x10\x28\x8e\x44\x08\x51\x1c\xc3\x10\xa3\x24\x86\xa1\x8f\x48\x0c\xc3\x40\x85\x11\x4a\x63\x18\xc6\x88\xc6\x28\x24\x2a\x4c\x11\x8b\x51\xc8\x54\xc8\x11\x8f\x51\x04\x91\x88\x51\x84\x55\xe8\x61\x18\xa3\x28\xc0\x48\x2a\x03\x2a\x8c\x31\x8e\x51\x94\x60\x1c\xe3\x28\xc5\x5e\x8c\x23\xaa\x42\x29\xc5\x71\x0c\x25\x22\x63\x89\x4e\x14\x7b\x6a\x06\xf0\x55\x18\xe2\x28\x46\x71\xac\xc2\x04\xc7\x31\x8a\x53\x9c\xc4\x52\x72\x27\x6a\x96\x20\x31\x4a\xa0\x0a\x11\x4e\x63\x94\x78\x38\x8d\x61\xe2\x63\x1a\xc3\x24\x54\x61\x8c\x59\x0c\x93\x44\x85\x29\xe6\x91\x48\xa8\x0a\x39\x16\x91\x20\x50\x85\x48\x6a\x0e\xc4\x53\x61\xe0\xa1\x88\x93\xd0\x43\x11\x93\xe2\x37\x62\x84\x78\x5e\xc4\x48\xea\x79\x11\x25\xcc\xf3\x23\x4a\xb8\xe7\x47\x69\x0a\xbd\x20\x4a\x53\xac\x42\xcf\x0b\x23\x92\x06\x2a\x8c\xbc\x28\x4a\xd2\x58\x85\xc4\x8b\xa3\x38\xa5\x9e\x9c\x42\x98\x97\x44\x51\x2a\x3c\x12\x45\x14\x7a\x24\x0a\x29\xf6\xd2\x28\xa0\xbe\x47\xa3\x80\x06\x1e\x8d\x7c\x1a\x79\x2c\xf2\x68\xec\xf1\xc8\xa3\xc4\xe3\x11\xa6\xd4\x13\x11\xa2\xcc\x87\x11\xa2\xc2\x87\x11\x64\x92\x45\x04\xc3\x3e\x0e\xa5\xbc\xf3\x42\xce\x02\xdf\x0f\x99\x94\x6b\x21\x65\xb1\x0a\x13\x3f\x0c\x53\x96\xfa\x51\x48\x18\xf5\xe3\x30\x61\xdc\x4f\xc2\x98\x09\x9f\x84\x31\x87\x3e\x0d\x25\xe2\x59\x18\x72\xcf\xe7\x61\xc0\x7d\x5f\x84\x3e\x0f\x02\x18\xfa\x3c\x0a\x70\x28\x15\x21\x2f\xc4\x3c\x09\xfc\x10\x73\x12\x84\x21\xe2\x69\x10\x85\x90\xd3\x20\x0e\x21\x67\x01\x09\x04\xe7\x41\x1a\x70\x2e\x02\x16\x70\x01\x03\x11\x70\x81\x42\x18\x48\xa1\x87\x55\xe8\x07\x54\x78\x61\x10\x50\xe1\x87\x91\x0a\x93\x80\x8a\x20\x54\x07\x2b\x21\x55\x21\x0f\xa8\x88\x22\xa8\x42\x1c\x50\x11\x47\xbe\x0a\xc3\x80\xca\x89\x37\x60\x22\x89\x12\x15\xa6\x01\x13\x24\x92\x75\x91\x48\xd6\x45\x62\x14\x08\x91\xc6\x9e\x0a\x83\x10\x8a\x34\x8e\x42\x24\x68\x9c\xa8\x90\x84\x58\xd0\x98\x86\x9e\xa0\x31\x0f\x7d\x41\x13\x18\x06\x82\x25\x38\x0c\x85\x44\x50\x24\x58\x12\x86\xb1\x60\x49\x1c\x26\x82\x25\x24\x24\x82\x25\x69\x98\x0a\x9e\xb0\x90\x0a\x9e\x88\x90\x09\x4e\x50\xc8\x05\x27\x5e\x28\x04\x27\x41\x84\x04\x27\x51\x84\x05\x27\x49\xe4\x09\x4e\x48\xe4\x0b\x4e\x68\x14\x0a\x4e\x78\x14\x09\x9e\xc2\x28\x16\x3c\xc5\x11\x11\x3c\xf5\xa3\x54\xf0\x34\x8c\xa8\xe0\x69\x14\x71\xc1\xd3\x24\x12\x82\xa7\x69\x8c\x04\x4f\x59\x8c\x05\x4f\x45\xec\x0b\x4e\x51\x1c\x08\x4e\x71\x1c\x09\x4e\xfd\x38\x16\x9c\x86\x31\x11\x9c\xc6\x31\x15\x9c\x12\x29\xfe\x29\x8d\x85\xe0\x94\x25\x50\x70\x2a\x12\x2c\x38\x43\x89\x2f\x38\xf3\x92\x40\x70\x16\x24\x91\xe0\x2c\x4a\x12\xc1\x59\x9c\x10\xc1\x18\x49\xa8\x60\x8c\x26\x5c\x30\xc6\x09\x14\x8c\x43\x82\x04\xe3\x98\xc8\x59\xc0\x23\x81\x60\x3c\x20\x91\x9c\x11\x48\x22\x18\x4f\x08\x11\x8c\xa7\x84\x0a\xca\x29\xe1\x82\x72\x9e\x42\x41\x05\x4c\xb1\xa0\x02\xa7\xbe\xa0\xc2\x4f\x43\x41\xa5\xb2\x28\xa8\x88\xd2\x44\x50\x91\xa4\xa9\xa0\x22\x4d\x99\xa0\x82\xa5\xe6\x7c\x52\x79\x78\xd0\xab\xc9\x5b\x9a\x5a\x88\x9a\x54\xa8\x0a\x39\xf4\x20\x46\x32\xaf\x9e\x5a\x3c\x33\xb5\x44\x30\x84\x3e\x4a\x60\x04\x03\x94\xc2\x18\x06\x88\xc1\x04\x86\x48\x40\x02\x23\x35\xa9\x44\x6a\x52\x89\xd5\xa4\x12\xab\x49\x25\x51\x93\x4a\xa2\x26\x15\xe2\x41\x24\x35\x38\x8c\x7c\x98\x7a\x3e\x0a\x60\xea\x45\x28\x84\xa9\x97\xa0\x18\x52\x8f\xa2\x04\x52\x8f\xa3\x14\x52\x1f\x21\x0a\xa9\xef\x21\x0e\xa9\x1f\x20\x01\xa9\x5c\xe8\x40\xea\x13\xec\x41\xea\x53\x59\x8f\x2f\xa4\x06\x14\x20\x1c\xc3\x34\xf0\x70\x02\xd3\x20\xc0\x29\x4c\x83\x08\x33\x98\x06\x09\x16\x90\x04\xa9\x87\x20\x09\xa8\x87\x21\x09\xb8\xe7\x43\x12\x08\x2f\x84\x49\x88\x3c\x25\xe3\xbc\x04\x26\xa1\xe7\xa5\x30\x09\x7d\x8f\xc1\x24\x0c\x3c\x0e\x93\x30\xf4\x21\x24\x61\xe4\x63\x48\xc2\xd8\xf7\x55\x18\x40\x12\x26\x7e\x04\xd3\x90\xf8\x89\x0a\x09\xa4\x61\xea\x53\x15\x32\xc8\x42\xea\x0b\x19\x06\x08\xf2\x90\x06\x18\x72\xa9\x3f\x41\x11\xb2\x20\x50\xa1\x5c\xf8\xc9\x29\x44\x86\x04\x21\xc9\xbc\x08\x87\x3c\x60\x2a\x14\xc8\x0b\x79\x88\x54\x88\x91\x1f\xf2\xd0\x47\x41\xc8\xc3\x40\x85\x11\x0a\x43\x1e\x26\x2a\x24\x28\x0a\x79\x48\x51\x1c\xf2\x90\xa9\x50\xa0\x24\xe4\x11\x52\xa1\xd4\x88\x79\xe4\xab\x30\x40\x69\xc8\xa3\x08\xd1\x90\x45\xb1\x0a\x09\x62\x21\x8b\xa8\x0a\x19\xe2\x21\x8b\x04\xe2\x21\x8d\x21\x92\x8b\x17\x8c\x61\x48\x63\x1f\xc3\x30\x95\xaa\x75\x98\xc6\x91\x0a\x95\xf6\x1c\x13\x15\x52\xec\x85\x49\xcc\x54\x28\xb0\x1f\x26\x89\x5c\x05\xc7\x09\x56\xa1\x87\xc3\x30\x4a\x02\x15\x46\x38\x0a\xc3\x24\x56\x21\xc1\x71\x18\x24\x29\x4e\x42\x3f\x61\x2a\x14\x98\x84\x1e\x81\x2a\xc4\x38\x0d\x31\xf1\x30\x0d\x91\xd4\x7f\x43\x48\x42\xcc\x42\x48\x62\xcc\x03\x41\x12\xcc\x03\x4e\x52\x2c\x02\x4e\x98\x07\x03\xa9\xd7\xc1\x80\xa6\xd0\x43\x41\x9a\x22\xa5\xe5\x7b\x2a\xf4\x3d\x2f\x48\xd2\xd0\xf3\x83\x38\x8d\xbc\x20\x88\xd2\xc4\x0b\x82\x30\x25\x52\x8e\xa6\x72\x19\xe8\xa7\xcc\x8b\x03\x2f\x15\x5e\x12\x60\x39\x91\x04\x88\x22\x8f\x04\x90\x7a\x9e\xe4\x50\xdf\x93\xca\x78\x28\x97\x9f\x34\x92\x4b\x51\x2a\x97\xa8\x29\x25\x3e\xf4\x09\x4d\x7d\xe4\x27\x94\xfa\xd8\x8f\x29\xf7\xe5\x6c\x26\x7c\x39\x7b\x40\x3f\xf0\x03\x86\xfd\xd0\xf7\xe5\x1c\xe7\x7b\xcc\xf7\x63\x1f\xb3\xc0\x27\x3e\x62\x91\x9f\x7a\x82\xc5\x3e\xf5\x38\x4b\x7c\xe6\x31\x46\x7c\xee\x51\x96\x06\xd0\x4b\x19\x0b\x90\x47\x18\x0f\xb0\x17\x33\x11\x78\x5e\xc4\x61\x10\x78\x21\x47\x81\xd4\xf3\x71\x10\x79\x3e\xf7\x82\xc4\xf3\xb8\x1f\x10\x0f\xf1\x20\xa0\x1e\xe4\x61\xc0\xb0\xe0\x51\xc0\x31\xe7\x71\x08\x31\xe3\x49\x88\x70\x2a\xe7\x5e\x4c\x78\x1a\xfa\x38\xe1\x69\x18\xe2\x98\xd3\x30\xc2\x21\x67\x61\x82\x03\xce\x43\x82\x7d\x2e\xe4\xdc\x29\x75\x5b\x8c\x04\x0c\x05\x86\x02\x45\x08\x09\x81\x22\x0f\x31\x81\x23\x1f\x51\xe1\x45\x21\x4a\x85\x5c\xf5\x27\xc2\x8f\x12\x14\x8b\x20\x4a\x51\x24\x02\xb9\x6e\x10\x61\xc4\x91\x2f\xc2\x18\x22\x4f\x44\x31\x46\x58\x44\xb1\x8f\xa0\x88\xe3\x00\x0a\x11\xc7\x11\xe4\x22\x8e\x13\x48\x45\x12\xa7\x30\x15\x49\x4c\x21\x11\x49\xcc\x61\x22\x48\x02\x61\x2c\x07\x15\x46\x82\x24\x3e\x8c\x44\x9a\x84\x30\x14\x69\x12\xa9\x30\x51\x61\xaa\x42\x06\x23\x41\x13\x21\x43\x82\x60\x2c\x28\xf1\x60\x22\x28\x09\x20\x11\x72\xed\x43\x05\x25\x31\x64\x82\x12\x02\x85\xa0\x84\xca\x35\x01\xe1\x08\x0b\x9a\x42\xe4\x0b\x9a\x62\x14\x0a\x39\x6c\xb1\x48\xd3\x10\x11\x21\xe7\x0e\x26\xd2\x94\x20\x21\xd2\x94\x4a\xb5\x3e\xe5\xd8\x13\x84\x42\x1c\x0a\x42\x31\x8e\x05\xa1\x3e\x26\x82\xd0\x10\x33\x91\xd0\x08\x0b\x91\xd0\xc4\xc3\x22\xa1\xa9\x17\x88\x98\x32\x2f\x12\x31\x15\x1e\x11\x11\x43\x1e\x13\x11\xf3\x34\x9b\xfb\x9e\x08\x59\xe4\x87\x22\x60\x89\x9f\x88\x80\xa5\x3e\x15\x3e\x63\xbe\x10\xbe\x1c\x5b\xe1\xcb\x51\x15\x1e\xf7\x02\x22\x3c\x1e\xc8\x69\x9e\x87\x21\x12\x98\xc7\x61\x20\x30\x27\x61\x22\x10\xa7\x21\x13\x88\xb3\x08\x09\xc4\x45\x14\x08\x24\x50\x94\x08\x2c\x70\xc4\x04\x16\x7e\x8c\x85\x27\x82\x38\x14\x9e\x90\x93\x9c\x2f\xe2\x98\x8b\x40\x24\x09\x16\xa1\x20\x49\x28\x62\x91\x26\x44\x24\x82\x26\x4c\x10\xc1\x08\x12\x54\x08\xe2\xb7\x53\x8b\xde\x38\xbc\xc1\x99\x85\xc1\x38\x8e\x10\x84\x51\x1c\x4b\x6d\x30\x4e\x50\x08\xa3\x98\xa0\x04\x86\x31\x45\x29\x0c\x63\x86\x18\x0c\x63\x8e\x21\x0c\x63\x21\xc5\x4c\x02\xb1\x0f\xc3\x04\xe1\x10\x06\x89\x94\xe1\x41\x82\x31\x81\x41\xe2\x61\x0a\x83\xc4\xc7\x1c\x06\x49\x80\x05\x0c\x92\xd0\x43\x30\x48\x22\xcf\x53\x61\x00\xfd\x24\xf6\x22\xe8\x27\x89\x17\x43\x3f\x21\x1e\x51\x21\x85\x7e\x92\x7a\x1c\xfa\x09\xf5\x84\x0c\x7d\x04\xfd\x84\xf9\x1e\xf4\x12\xee\xfb\x2a\x0c\xa1\x97\x08\x3f\x56\x61\x02\x65\xc1\x14\x7a\x04\xf9\x14\x62\x82\x7c\x0e\x31\xc1\x01\x54\x21\x82\x98\x78\x81\xa7\xc2\x00\x62\xe2\x07\x21\x44\xc4\x0f\x62\x15\x26\x10\x91\x20\x48\x55\x48\x21\x22\x61\xc0\x65\x18\x42\x15\x22\x08\x49\x14\x7a\x2a\xf4\x55\x18\xaa\x30\x82\x90\xc4\x61\xa2\x42\xa2\x42\xaa\x42\xae\x42\x21\x43\x89\x44\x12\x47\x18\x22\x12\x47\xbe\x0a\x03\x15\x46\x2a\x8c\x55\x28\x85\x66\x1c\xa5\x2a\x64\xd0\x23\x71\xc4\x65\x18\x43\xe8\x93\x38\x46\xd0\x27\x51\xec\xc1\x80\x44\xb1\xaf\xc2\x10\x86\x24\x8c\x23\x18\x91\x30\x8e\x61\x4c\xc2\x98\xc0\x84\x04\x71\x0a\x09\x09\x62\x06\x53\x12\xc4\x1c\x52\xe2\xc7\x02\x32\x22\xd7\x47\x9c\x78\x09\x86\x82\x78\x89\x8f\xe4\xea\x30\x40\x88\x20\x39\x69\x12\x94\xc4\xc8\x27\x30\x49\x50\x90\x88\x84\xa0\x30\x11\x09\x45\x51\xc2\x13\x86\xe2\x84\x25\x1c\x25\x09\x23\x10\x91\x84\x12\x84\xd2\x24\x25\x18\xb1\x84\x48\xc1\x95\x10\x12\x20\x91\x24\x24\xc4\x30\x89\x49\x84\x51\x12\x91\x18\xe3\x24\x24\x04\x7b\x49\x40\x52\xec\x27\x3e\xa1\x38\x4c\x7c\xc2\x70\x94\x78\x84\xe3\x38\xc1\x29\xc4\x49\x82\x52\x84\x49\x02\x53\x8c\xd3\x58\xa4\x1e\xa6\x31\x4f\x7d\xcc\x63\x96\x06\x58\xc4\x34\x0d\x3d\x18\xa7\x69\xe4\xa1\x98\xa4\xb1\x87\x63\xb9\x78\xf0\xe2\x38\x4d\x3d\x3f\x96\x4b\x88\x20\x8e\x52\xe6\x45\x71\x98\x72\x2f\x8e\x03\x29\xff\x63\x5f\xca\xff\xd8\xa3\xc8\x4b\x63\x4c\xb1\x47\x63\x44\x3d\x8f\xc5\x52\xf1\xe0\x91\xa0\x81\x0f\x23\x4e\x43\x1f\x45\x8c\x46\x3e\x8e\x28\x8d\x7d\x2f\x4a\x69\xe2\xfb\x11\xa1\xc4\x0f\x22\x39\x23\x84\x91\x9c\x11\xa2\x28\xa6\xd4\x4f\xa2\x88\x32\x5f\x2e\x4e\xb8\x9f\x2a\x9d\x9d\x46\x3e\x83\x3e\x8b\x3c\x86\x7c\x1e\x61\x86\x7d\x11\x21\xe6\x05\x28\x42\xcc\x0f\x70\x04\x99\x14\xf6\x82\x05\x81\x2f\x85\x74\x10\x84\x8c\x45\x41\x28\x97\x22\x41\x14\xa6\x2c\x09\xe2\x90\x30\x12\x10\x15\xa6\x61\xc2\xd2\x80\x86\x31\xa3\x01\x0b\x23\xc6\x02\x1e\x86\x8c\x07\x22\x0c\x18\x0f\x51\xe8\x33\x11\xca\xe5\x07\x0c\xbd\xd0\xe3\x28\x94\xcb\x0f\x1c\x06\x21\xe2\x38\x0c\x43\xb9\x86\x97\x7a\xb2\x5c\x48\x70\x1e\x84\x24\x60\x5c\x2e\x27\x18\x57\xcb\x09\x1e\x85\x3c\x48\x79\x14\x8a\x80\xf0\x38\x82\x41\xc2\x93\x08\x05\x31\x4f\x22\x1c\x44\x9c\x44\x7e\x10\xf1\x34\x0a\x82\x90\xa7\x51\x18\x04\x9c\x46\x51\xe0\x4b\x9d\x39\xf0\x38\x8b\x48\x80\x39\x97\x0b\x68\x2e\x22\xaa\x42\x1e\x40\x29\xba\x7d\x21\x60\x0c\x7d\x2e\x50\x8c\x7c\x26\x50\xec\xf9\x54\xe0\xd8\xf7\x53\xe1\xc5\x81\x0a\x23\x9f\x08\x3f\x8e\x7d\xc9\x9c\x89\x1f\x8b\x20\x4e\xfd\x48\x04\x31\xf5\x43\x11\xc6\xcc\x0f\x44\x18\x0b\xdf\x17\x51\x02\x55\x88\x7c\x4f\x44\x89\xe7\x63\x11\x27\xbe\x8f\x44\x9c\x48\x45\x2b\x91\x6b\x0a\x91\x24\xb1\xc7\x25\x99\x79\x5c\x90\x24\xf5\x98\x20\x09\xf5\xa8\x20\x09\xf7\x52\x91\x26\x52\x6e\xa7\x04\x79\x89\x48\x09\xf6\xd4\x9c\xa2\xc2\xc0\x93\xb3\x4c\xe8\x85\x72\x4e\xf1\x02\x41\x49\xe2\xf9\x42\x2d\x5d\x05\x23\x54\x85\xdc\xc3\x82\x11\xe1\x21\xc1\x52\xe4\x41\xc1\x52\x8c\x85\x60\xa9\xaf\xc2\x00\xcb\x25\x4a\x84\x99\xe0\x92\xa0\x04\x4f\x89\x0a\x53\x2c\x97\x31\x0c\xcb\x25\x0d\x97\x21\x85\x38\x11\x8c\x62\x15\x7a\x38\x16\x8c\x06\x38\x12\x8c\x86\x2a\x8c\x55\x48\xe4\x0a\x95\xa6\x38\x14\x94\x32\x1c\x08\x4a\xb9\x0c\x19\x54\x21\xc6\x81\x48\x99\x87\x7d\x91\xb2\x40\x85\x11\xf6\x05\x61\xb1\x0a\x09\xf6\x45\xc2\xa8\x0a\x65\xd9\x98\x09\x19\x72\x84\x03\x11\x71\xac\x42\x1f\x07\x6a\x7b\x2b\x14\x21\x8f\x71\x28\x02\x9e\xa8\x30\xc5\x91\xf0\x39\xc3\x91\xf0\x38\x97\xa1\x80\x38\x92\xb3\x0f\x8e\x04\x12\x72\xdd\x8c\x44\x80\x03\xbd\xd3\x22\xa0\x48\x30\x1a\xbe\x1a\xf4\x19\x9f\xa3\xed\xec\xa7\xb2\xe2\xff\x3c\xe7\x79\x9d\x91\xc5\xae\x47\x66\x5b\x3a\x04\x6e\x7d\x3f\x36\x35\x4e\xda\xc3\xf7\xa2\xdc\xce\x39\x30\x5d\x90\xd3\x33\x70\x08\x04\x59\x54\x7c\xad\x4f\x49\x75\x8a\x0c\x0e\xc1\xe4\x02\x3c\xb0\x7e\x71\x95\xb7\xdc\x0b\xd8\xf3\xca\xea\x34\x62\xa2\xe1\x7f\x03\x06\x4f\xe2\xd0\x0c\xd4\xca\x57\xac\x3e\xa7\xfe\x6c\x9e\x74\x1b\xaf\x88\x63\x5e\x74\x1b\x2c\x5c\xa5\x36\x5b\xe8\xab\xaf\x8e\x9d\x2a\x54\xec\xaa\xc3\xc5\x16\x25\x57\xad\xa6\x57\xd6\xad\xcb\x4d\xba\xa2\xcf\xc5\x31\xa2\x59\x71\x48\xab\x71\xa3\x3b\xbb\x83\x1f\x5a\x78\x0d\x3f\xb4\xde\xda\x67\x5e\x86\xf3\x14\xfb\x3e\xbc\x77\xef\x0e\xb8\x07\x7e\xe0\x75\x05\xea\x13\x0e\x16\xa4\xaa\x01\xd7\x2f\x09\x41\x21\xc0\x6f\xca\xd1\xe6\x6f\xf3\x3b\x40\xe5\xfb\xef\xaa\x26\x75\x46\xd5\xcf\x53\x7e\x9a\xf2\xf2\x85\x00\xc7\x3a\x25\xcb\x29\x07\x70\x8e\xe6\x50\x7d\x53\x52\xf3\x77\x45\xb9\xd4\xde\xa4\x55\xd4\x19\x29\xc9\x29\xf8\x5d\x45\x5c\x02\x05\x19\x1c\x9d\x70\xf3\xab\x2e\xc0\x3f\xcf\x79\xb9\x9c\xab\xbc\x1a\x4d\x15\xf8\xfd\xde\x25\x78\x69\x7e\x6f\x68\x20\xf8\x6f\x7e\x41\x4e\xcf\x16\xdc\x34\xf6\x78\x2e\x33\x4f\xde\xa0\x19\xc0\x33\xe0\x29\x67\xfa\xf7\xc0\xc3\x87\xe0\xf0\xaf\xc0\xbb\x23\x31\xd4\x70\xac\xca\xa8\x20\xb5\xcc\x6f\x08\xe9\xd0\x34\xef\xf0\x50\xbf\xe4\xfa\x06\x40\xb0\xaf\xe3\x56\x4f\xd5\x1b\xe2\x53\xe9\x6f\x5a\x0f\xa3\x6f\xc1\x3e\x38\xcf\x19\x17\x59\xce\x99\x1a\x32\x3d\x1a\x73\x33\x18\xe0\x50\xb5\x61\x40\x54\xff\xa9\xde\x3a\x95\x9c\xd0\xf1\x97\x48\x68\xd7\xcb\x0e\x06\xac\x7d\x05\x36\x0c\x7e\x9e\xaf\xe5\x16\x03\x63\xd7\x4b\x70\x67\x65\x71\x76\x5c\x2f\xcf\xf8\xf8\x95\x8b\x9d\x5f\x22\xba\xb0\xaf\xd1\xc7\x2e\xa0\x9d\xdd\xe6\x9f\xd7\xd9\xe2\xf8\xe7\xf3\x92\xbf\xe4\x39\xe3\x6b\xa6\xcb\x60\xb7\x2a\x3c\x5b\x45\xb1\x20\xe5\x2f\x75\xb6\x18\xc7\xa8\xb7\x63\x15\xbe\xa9\xe2\xa5\x1c\xf3\xf5\x55\x20\x6b\xda\xe3\x98\x5f\xd4\x5c\xbb\xc5\xd3\xb2\x77\x4e\xaa\x2a\x7b\x97\x83\x4f\x9f\xda\x99\x7b\x52\x93\xf2\x1d\xaf\xa7\xe0\x77\xf5\x82\x7a\x62\xdd\xf9\xa2\x03\xe5\x15\xbd\x3f\xcb\x1c\x80\xec\xfe\x7d\x99\x59\x59\xe5\x2e\xce\x4b\xca\x95\xbc\x30\xb9\xde\x64\x6f\x0f\x5a\x38\xef\xf9\x12\x64\xb9\xc9\x26\x0b\x65\xc2\x5e\x29\x9e\x9f\x95\x45\x5d\xc8\x81\x9d\x9f\x90\xea\xc5\xc7\xfc\xe7\xb2\x38\xe3\x65\xbd\xd4\xee\x8c\x75\x91\x99\x84\x30\x95\x05\x75\x23\xdf\xbc\xe7\x4b\xa5\x37\xa9\x54\xf5\x75\x00\x2e\xd5\x3f\xeb\xc4\x41\xe5\x3b\x50\x13\x8f\x42\x01\x2d\x39\xa9\xf9\xe3\x05\xa9\x2a\x67\x86\x03\xea\xe2\x52\xf3\xa5\x85\x94\x69\x41\xc6\x2b\x83\x93\x19\x90\xd4\x57\xad\xa0\x06\x6a\xd4\xa8\xc4\x21\xb4\x30\x5e\xd1\x32\x3b\xd3\x73\xb0\xca\xa5\xd0\xd2\x46\xcf\x79\x7e\x7e\xca\x4b\xa9\x22\x82\xc3\x91\x78\x39\x46\x4a\xcf\x72\xd3\x69\x91\x8b\xec\xdd\xb9\x2d\x59\x97\xe7\xfc\x40\x21\xf5\xee\x07\xb2\x38\xe7\x77\x25\xb6\xdb\xec\x53\xb7\xe8\xc7\x32\xab\x3b\xc5\xcc\x38\x74\xfa\xbe\x6c\x7a\xee\x94\x7c\xcf\x97\xee\xf7\xf4\xc0\x45\x78\x8b\xd1\xc7\x45\x5e\xd5\xe5\x39\xad\x8b\x52\x21\xae\x2e\x24\xd0\x6a\x06\xf4\x04\xfa\xb3\x45\xa5\x6c\x6e\x9b\x3c\x5d\x45\xbe\x03\xa8\xa5\x12\x17\xe4\x54\xf7\xb9\x03\x77\x1d\x94\x6e\x13\x0e\x6c\xd3\x9d\x1c\x92\x60\xc0\xe5\x64\xda\x50\x8d\xa4\x97\x99\xf9\x8b\x67\xe0\xb8\xe6\x52\x51\x6b\x67\x4f\x9d\xf2\x98\x2c\x16\x8f\x4f\x38\x7d\x3f\xc9\xf2\xaa\x26\xb9\xa4\x58\x07\xaa\xed\xed\x57\x4d\x32\xb0\x3f\x0a\xd1\xc9\xa8\x48\xfc\xa4\x2c\x3e\xaa\x37\xd6\x47\xcb\x33\xfe\xa4\x2c\x8b\x72\x72\xf7\x31\xc9\xf3\xa2\x06\x92\x27\x00\x01\xaa\x52\x40\x2a\x40\x1a\xbc\xdf\xd5\xc3\xe1\x36\xed\xac\xa8\xaa\x2c\x5d\x70\xa7\x02\xad\x4e\x4c\x2a\xbe\x10\x33\x05\xac\x69\x9a\x8c\xea\xd6\xfe\x92\x0b\x5e\xf2\x9c\xda\x26\x28\x9b\x0a\x27\xa4\xca\xf7\x6a\x90\x72\x2e\x75\xf6\x4c\xea\x82\x59\xc5\x95\x59\xa4\xf3\x33\x5e\x4e\xa6\x9d\x1c\xb2\x06\xce\x74\xd3\xec\x5d\x70\xd9\x83\xaf\xbf\x06\x13\x39\x98\x85\xd0\xdf\x87\x87\x87\xe0\x6e\xa1\xe8\xf0\xae\xba\x99\xda\x4f\x6b\x7b\x09\xbe\xd1\xd1\xfb\x40\xb6\xf8\xa0\xdb\xe3\x2c\x3f\xe1\x65\x56\x57\x93\xea\x3c\x7d\xac\x87\x4e\x35\x4b\xfd\xb6\x5d\x35\xc0\xdb\x04\xf0\x55\xa7\x0a\xd9\xba\x5e\xa2\xd4\x7e\x46\x87\xe6\x95\xcc\x2b\x35\xcb\x92\x57\x95\x6c\xc6\xe9\xb9\xd4\xd3\xb2\xfa\x84\x97\x20\xe5\x5a\x75\x2a\x4a\x67\xac\x66\x40\x8e\xe5\x5d\x70\x1f\xac\xb4\x45\xa1\xca\xb6\xbe\xa5\xfa\x56\x72\x6b\x39\x36\x71\x1a\xd8\x69\xae\xcb\x28\xbf\x03\xda\x8e\xfc\xbe\x92\x49\x8b\x73\xbe\x0f\x5a\xe4\xb4\x62\x66\x5f\x0b\x99\x19\xb0\xe2\x61\x5f\x49\x87\x19\x70\x25\x8d\x8e\x93\x64\x66\x39\xcf\x41\xae\x69\x5f\xc5\xeb\x9f\x6d\x13\x5e\x08\xf0\xcd\x70\xfc\xc8\x00\xb5\x6d\x9b\x1f\x1f\xab\x9e\xa8\xc9\xad\xcd\xa2\xc6\xdb\x28\xee\xff\x2d\xb2\x05\x7f\xf1\x81\x97\x1f\x32\xfe\x11\xa8\x29\x17\xfc\x50\x66\x4c\xa9\xb7\xfa\x3f\xc9\xc3\x2a\x41\xc6\x6f\x73\x1f\x7b\x48\x47\x18\xdc\x5c\xd6\x7c\x2f\x57\xb6\x4a\x24\xc8\x19\x58\xcb\x88\xce\xe4\x72\xfc\xb8\x38\x3d\x2b\x72\x9e\x9b\x9b\xa6\x2d\x81\x36\xad\x9a\x01\x27\x53\x77\x2d\xdd\xe4\x69\xd6\x61\x7d\x69\x23\x59\x72\xd6\xe6\xd3\xe5\x1b\x8d\x7c\x8d\x00\xd0\x05\xdb\x56\x38\xe8\xfe\xf4\xc9\x0e\xd9\xbb\xee\x90\xb5\xd5\x4c\xe7\xe4\xec\x6c\xb1\x34\x50\x9a\x39\x7f\xda\x2e\xc8\xdd\xe9\xd6\xed\xeb\x1b\xdd\x8f\xf7\x7c\xb9\x0f\xf6\x24\xfc\x62\xb1\x7c\x57\xe4\x3f\x93\xfa\x64\x6f\x66\x76\x0c\x14\x8d\x36\x48\xe8\x66\x9a\x94\x84\x65\xe7\x95\xc5\x87\x5e\xad\x28\xdd\x50\x3b\x13\xc9\x14\x03\x9c\x55\xb3\xc6\xf7\x3f\x00\xf4\x42\x8e\x8e\x9e\xa4\xe9\x45\x27\x65\xe9\xa4\x2c\xdd\x14\xb9\xb2\x2d\x1f\xe5\xef\x16\xca\xf8\xb3\xc9\xe2\x44\xca\xc5\x4a\xdb\x80\x33\xa2\x16\x4b\x7b\x7b\x07\x36\xd6\xc9\x3a\x17\x45\xf9\x84\xd0\x93\x49\x4b\x16\x44\x26\xcc\x40\xd6\x76\xc3\xc0\x29\xb2\xbc\xde\x86\x4c\x87\xf4\x4c\x6b\x66\x4e\x55\x7d\x54\x3c\x26\x65\xcd\xab\x8c\xe4\x9a\x5e\xe9\xc5\x0c\xd0\xe5\x0c\x68\xfc\xcd\x80\x6a\xc2\xb4\x69\xaf\x7e\x19\xd0\x69\x10\xd0\xdd\xba\x7f\x08\xf6\x9e\x81\x3d\x70\x5f\xb7\x6e\x7e\x01\xee\x83\xbd\x59\xfb\xbd\x3c\x68\x4a\x5c\x02\xbe\xa8\xf8\x30\x88\x9f\xb6\x04\x61\x7e\x5d\x4e\x6d\x5c\x03\xe1\xff\xb6\xd8\xb5\x17\xcd\x89\x5e\x80\xda\x62\x4a\x2e\xc8\xff\xee\x81\xef\x4a\xf2\x11\x90\x8b\xac\x92\xeb\x64\xd9\x67\xb2\x50\x5b\x08\x36\xdd\xac\xb1\xc1\xef\x6f\x24\x71\xbf\xbd\x54\x6b\x71\x99\xa1\x32\x39\x1e\xde\xd1\x26\x70\x5c\x7a\x2d\x95\x40\xf8\xb9\x1d\xda\x11\x92\x5d\xc9\x37\x19\xa2\x57\xbc\x0d\xc1\xe2\x71\x8a\xc5\x3d\x92\xcd\xf2\x9c\x97\x2f\xd5\xf0\x3a\x79\x9c\x58\x37\x73\x71\x5e\x0f\x64\x76\x62\x37\x31\x03\x1e\xe6\x06\xa5\x4a\xb8\xf9\x3f\x7d\x02\xee\xb7\xd1\x92\x5d\x3a\x33\x23\x21\x67\x49\x3b\xe6\x97\x2e\x6f\x19\xde\xb6\x6b\x98\x49\x5b\xb2\xaa\xcb\xe2\x3d\xdf\x07\x7b\xff\x87\x52\xba\x67\xcb\x6e\xf1\xb2\x67\x68\x0d\xf5\xe6\xee\x7b\xc5\x3e\x4a\xe8\xf1\xca\x5a\x93\x7a\x54\xd7\x65\x96\x1a\x07\x06\x6f\xa7\x93\x76\xc4\xa6\xd3\x3e\x3d\x5e\x61\x99\x3f\x27\x66\x22\x7f\xa2\xb7\x73\x26\x4d\xa7\xf6\xde\xed\xb5\xb8\xff\x5d\x6b\x7a\xcf\xc9\x29\x57\xf4\x47\x4f\x48\x59\x57\x0f\x14\x42\x1f\xbc\x2b\x33\xf6\x40\xf1\xf1\x1e\xb8\x6c\xcb\xb8\xd8\x3e\x25\x67\x8e\xd8\xe1\x79\x5d\x2e\x7b\x62\x47\x23\x59\x3b\xe5\xfa\xac\x82\xc7\x25\x44\xa0\x5a\x32\x3d\xe8\xb5\x82\xe7\x5b\xcd\xd1\xbb\xb7\xc1\xa5\xef\xa6\x0d\x4e\x23\x6e\x60\x1c\xf7\xa4\x10\xd9\x9b\x39\xe4\x7a\x69\x56\x8f\xb3\x0e\xd6\xad\x4c\x91\xd9\x1f\x48\x51\x98\xcd\x3a\xa9\x17\x68\xdf\x18\x4e\xbb\xe8\x26\x2c\x9b\x84\x65\xaf\x04\xde\x57\x16\xd8\xfa\xf9\x4d\xf4\xd2\x89\xbd\x9c\x3a\xb8\xbf\x9c\x9a\x9f\xd3\x75\xb2\x94\x16\x39\x95\x18\xcb\x28\xa0\x59\x49\x17\x8d\xa0\x6c\xb6\x36\x9f\x9f\x9f\xa6\xbc\xbc\x34\x33\x8c\x12\xa8\xe6\xa7\xd4\xe4\x55\x99\xb1\x22\x59\xce\xf8\x05\x50\x45\xf4\xcf\xd1\x12\x9a\x38\x2e\x01\xbf\xa8\x4b\xa2\x96\x71\xe0\x89\xfc\xa9\x51\xbc\x22\xdd\x15\x83\x9b\xa1\xb9\xec\x82\x1c\x17\xf0\x8f\x9b\xae\x3e\x56\x05\xd6\x4a\xf9\x7e\xe6\x89\x9d\x60\x55\x47\x66\x4e\x43\x87\xe6\x00\x6f\x9b\x39\xc0\x1b\x9f\x03\xbc\x39\x5d\x1e\xdc\xf9\xb7\x90\x96\x2e\xf9\x8b\x6c\xb1\xd8\x07\x7b\x79\x91\x73\xa7\x21\x0e\xaa\x6e\x52\xb2\xee\x51\x33\x8a\x1b\x78\x72\x93\xa4\x6d\x39\xe0\x01\x75\xe9\xa2\x25\x1f\x1d\xad\xb9\x59\x8d\x7e\x0b\xfb\x62\x1f\xb8\x83\x48\x97\xfb\xc0\x9d\xbd\xcb\x7d\xc3\x2b\x77\x7a\x0c\xba\x91\x19\xcf\xb4\x6e\xbc\x89\x1b\xe5\x7f\x5d\x8e\x34\x05\x37\xb0\xa4\x2d\xd7\xb0\xe5\x48\xb1\x6b\xf1\x65\x17\xe6\x36\x8c\x69\x56\x04\x5b\x72\xa6\xc9\xbd\x2d\x6b\x7e\xe1\xa1\x55\x1e\x3a\x53\x0b\xb4\x9b\xe3\xa0\xb3\xce\x00\xb6\x03\x2d\xeb\x19\x62\x20\xb6\xaf\xe5\xe4\xf0\x6a\x70\x95\x6b\x36\xb1\x8d\x5c\x1a\x6c\xa0\xca\xc7\x23\xb9\xeb\x82\x15\xe0\x85\x31\x3e\xaa\xce\xe5\x72\x72\x7a\x95\x59\x65\xcd\x62\x77\x28\x6b\x7f\xf1\x20\xf1\x60\xd7\x0e\x1d\xd9\xaf\xa7\x04\x7f\x74\x4a\x51\x23\xd1\xd3\xf9\xfd\xb9\x13\xeb\x66\x96\x03\x76\xa4\x37\x9e\x6c\x4e\x1b\x35\xa4\xed\x1b\xb0\x8d\xb6\xaf\xbf\xb7\xd5\xf6\xff\x78\x35\xba\x25\x8d\x55\x5d\xda\xf4\x65\x1b\x5d\xda\xf4\xa0\x45\xde\xe1\xa1\x9d\x16\xf6\xc0\x37\x66\xec\xe6\x23\x9a\x43\x0b\x72\x7f\x2c\xa7\x95\x64\x4d\xd6\xf5\x6a\xdc\x20\x21\xae\x25\xbd\x1e\xb1\x75\x97\x89\x2d\x59\xb9\x2b\xc5\x2e\x39\xb8\x25\xfe\x72\x08\xe0\x9f\x7f\xec\x3b\x03\xae\xba\x38\xb0\x7e\x1f\xcc\xd1\xe7\xd3\x81\x01\x78\x3b\x75\x2f\x3e\x34\x1b\x61\x07\x77\x2e\xb7\x39\xd0\x7d\x73\xb7\xd9\x1a\xbc\xfb\x76\xda\x1c\x43\xcc\x59\x56\x9d\x2d\xc8\x52\xf6\x09\x1c\x82\xbd\x06\xec\x5e\x9b\x45\x0e\x93\x24\xc1\xee\x44\x76\xb9\xce\xc6\xe0\xf0\x1c\xa5\xad\xa5\xfe\xfc\xf2\xc9\xab\x27\xcf\x8f\x1e\x1d\x3d\x7d\xf1\xfc\xf8\xd1\xd1\xd1\xcb\xa7\xdf\xfe\x72\xf4\xe4\x95\x36\x5b\x28\x47\x58\x6a\x38\x57\x3d\x07\x9e\x93\x79\xae\xd4\x0d\x89\x5d\xa9\x12\x5d\x0b\x80\xb3\xc0\xbc\x26\x24\x87\x86\xaf\x05\xe9\x4e\x67\x31\xbe\x13\x28\x75\x97\xe2\x85\xd8\xfa\x64\x7c\xa5\x15\x8a\x72\x1d\x31\xf6\x07\xb6\xc2\x4a\xc5\x9d\x9a\xa0\xbc\x80\x4f\xde\xec\x35\x8a\x43\x23\x57\xdf\x4e\xef\x5c\xba\xbc\xa1\x8b\xfc\x6c\x94\x38\x4b\x9b\xd0\xd2\x18\x5c\xa1\x15\xb8\x32\xe6\xb0\xdb\xdc\xa6\xd2\x3b\x97\xe6\x04\x50\xdb\x02\xd7\x55\x5e\xc7\x96\x75\x67\xe7\xbe\x77\xf9\x65\xad\xf9\x4d\x03\x6a\xfc\xc2\x8b\x94\xde\x29\xa9\xb8\xd4\xc2\xf9\xe9\xf9\xe9\xd8\x15\x01\x3f\x34\xb2\x4d\x66\x7e\x5a\xf3\x92\xd4\x9c\x8f\x5e\x22\xc4\x4e\xe6\x67\x23\xf7\x38\x26\x9e\x32\xc7\x64\x4f\x69\x8e\x4e\xb2\x0a\x9c\xf2\xfa\xa4\x60\x20\xab\xc0\x22\x7b\xcf\xc1\x6f\xc7\xf3\xd3\x2c\xff\x0d\xf0\x0b\xca\xcf\x6a\x50\x9f\x90\x1a\x64\x35\x20\x54\x7e\x56\xe0\xb7\xcc\xb4\xe3\x37\xf0\xf1\x24\xa3\x27\x40\x6a\x5f\xf7\x40\x96\x7f\x28\xde\x73\xa6\x8e\xe0\x39\xa1\x27\xcd\x55\xa8\x2c\xb7\x57\xa1\x40\x5d\x80\x77\x3c\x57\xa5\x95\x6a\x46\x4b\x09\x4b\xce\x6f\xe9\x52\x03\x93\x90\x64\x8a\x9a\xff\x64\x8b\x4a\x92\xbf\xe7\x6c\xae\x97\x39\x16\x01\x59\xd5\x54\xf7\x31\xab\x4f\x40\x91\xf3\xe6\x9c\x63\x1f\x4c\x54\xe1\xe9\xd6\x37\xc3\xfc\x39\xec\xdf\x0c\xfb\x89\xd4\x27\xdb\x5d\x0c\x33\x6d\x02\xc5\x07\x5e\xce\xdd\x22\xdf\x1b\xa2\xb8\x04\x6f\x6c\xbb\x0f\x8f\xe7\x19\xe3\x79\x9d\xd5\xcb\xb7\xbd\x0e\x99\xde\xa8\xa3\x4a\x8d\xb7\xf5\x97\xcd\x4e\xb3\x3c\x93\x74\xa3\xba\x3a\x74\xc5\x4c\xe9\x07\x6a\xdd\x23\xf9\xec\xcd\xef\x60\x2f\xdf\xdb\x07\x48\x29\x1d\xfa\x37\x06\x97\x6f\x0f\x9a\x0b\x69\xa7\x59\xfe\xed\x72\x62\x4a\x38\x96\x63\x0a\xc7\x74\x4c\x31\xcf\xb5\xdd\x98\xe6\xb2\x5a\x0b\xd6\x00\x7a\xf8\x50\x75\xec\xb7\x63\x35\xc5\xf1\xb2\x5e\xfe\xd6\xf6\xb2\x3a\x29\xca\xfa\x84\xe4\x6c\x3e\x58\xe7\x5e\xbe\x37\x0a\xdb\xb9\x11\xa7\x4b\xa9\x01\x98\x35\xb0\xbb\xae\xe7\xf4\xe8\x7c\xfd\x75\xe7\x32\x9c\x35\x55\xee\xf2\x9d\x05\xe3\xb2\xd7\xc4\xc2\x9c\x01\x3c\x9d\x19\x66\xd2\x85\x37\xde\x94\x53\x6d\x1b\xb8\x2a\xb7\xd6\x54\xec\xd6\xd2\xe2\x25\xc9\xdf\x8d\x71\x7f\xe2\x43\xc3\xfd\x59\x65\x7b\xf2\x58\x1d\xd0\x8f\x48\x01\xcf\x64\xaf\x0b\xed\x51\x61\x14\x2e\x72\xc4\xc5\x63\xa5\xd2\x55\x80\xc8\x11\x56\xf6\x78\x7e\x03\x45\xd9\x7c\xbc\xcc\xde\x9d\xd4\xbf\x35\xc4\xd3\x70\xe0\x59\x99\x7d\x20\x35\x77\xd9\x23\x2d\x8a\x05\x27\x92\x3b\x44\x59\x9c\xaa\x82\x6f\x81\x36\xda\xbe\x34\xa3\x9a\xe5\xef\x80\x4c\x04\xa5\x4c\x95\xcc\xb6\xe0\xa2\xcf\x17\x2d\x9b\xb9\xec\x91\xf3\x8f\xda\x5c\x50\xa7\x2d\x0e\x11\x69\xdd\x54\x21\x74\xd2\x34\xa0\x43\x44\x03\xee\x34\xba\x3e\x16\xf4\xdd\x16\x7e\x26\xe9\xcc\x5e\x14\x90\x9f\x5f\x1d\x82\x3d\x3d\xaf\xee\xc9\xa4\xee\x70\xac\x42\x6b\x55\x70\xbd\xc1\xae\x60\x1c\xba\x84\x06\xda\x9d\xa6\x87\xe0\x49\x5e\x9d\x97\x5a\x7a\xaa\x3b\x62\x85\x00\xbf\x3d\x80\xbf\x49\x91\x78\x56\xf2\x8a\x97\x1f\xb8\x64\x2f\xb5\x1b\xa2\x4f\x0d\xec\x00\xeb\xaa\x8d\xfa\x2b\x1b\xaf\xea\x3b\x74\xaa\x5a\x6d\x0a\x29\x6b\xbb\x16\xb0\xe0\xa0\x69\x50\xf7\x34\x51\x17\x68\xaa\xe2\x39\xeb\x6c\x91\x99\x4e\xe9\x3f\x6e\x95\xe0\x1b\xa0\xdb\x05\xfe\xa2\x60\x7c\x03\x10\xd8\x07\x0f\x90\xba\x41\xde\x36\x9c\x9f\x75\xef\xa3\x37\xdc\xb0\x82\xcf\x19\x68\x87\xb3\x35\xfd\xb4\xc2\xa8\xce\xf8\xaf\xb2\xab\xbf\xd6\x36\x70\xf7\x92\x32\xf8\xf6\x3c\x5b\xd4\x0f\xb2\xdc\xce\xa2\xa5\xbd\x97\x53\x19\x57\x27\x45\xc5\xf5\x2c\xa5\xc6\x4c\x2e\x0a\x72\x19\x90\x0a\x14\xea\x0e\xca\x6f\x8b\x82\x91\xea\xe4\x37\x03\xa0\x9a\xcb\xca\x95\x8d\x2c\xe5\x4b\xe1\x31\xcf\x16\xd6\xce\x1b\xe5\xd9\x42\x73\xad\x4e\xfb\x89\x5c\xd8\xa4\x53\x72\xe1\xce\xea\x5c\xa1\xa8\xef\x7b\x45\x12\x4b\xc3\xb7\x24\x67\x7d\xc6\xd5\xf3\x39\x2b\x78\x95\xef\xd5\x12\x10\x2d\x78\x49\xb9\x73\xbb\x70\x0d\x47\xe7\x66\x6f\x52\x0f\xa7\x6c\x82\xfe\x55\x08\xd5\x73\x6d\xed\x6b\xa8\x80\x1c\x77\x99\x5d\xfe\xdd\x98\x59\x91\xd0\x51\xa3\x21\xc8\x19\x38\xa7\xa5\xb9\x74\x5d\x02\xc6\xed\x47\xba\x9c\x7f\x0e\x79\x63\x34\x01\x57\xd8\x68\x41\x53\x08\xa0\xdb\x58\xf5\x44\xcd\x76\xb4\xda\x5c\xee\xd6\x7b\xb9\x87\xe0\x41\xf3\x9e\xa3\xb9\xee\xdd\x0c\xfa\xa4\x25\x8d\x49\xdf\xed\x9d\x96\x49\x9f\x3e\x01\x34\x9d\xce\x00\x6c\xd6\xc6\x25\xaf\xf4\xe5\x5e\xd5\x83\x89\x99\x13\xd5\xfa\xf7\xe3\x49\xb6\xe0\xc0\x44\x3d\x78\xd0\x3e\x2b\x90\x25\x5a\x7c\x81\x6f\x6c\x53\xf6\xc1\xfd\xfb\xaa\x9d\x6f\xbb\x52\x42\x0f\xf8\x7d\xcd\xe8\xfa\xb6\x49\x6b\xbd\x4d\x41\x1b\xe6\xc6\x06\x45\x03\xbc\xb8\xd6\xd2\xf3\x56\x53\x67\x5d\xe8\x6d\xf3\x31\x57\x12\xb1\x67\x66\x38\xf0\x4b\xc5\x99\x64\xcc\x1e\x0f\x7f\x20\x65\x56\x9c\x57\xe0\x37\x0d\xe7\x37\x7d\x71\x8b\x48\x7e\xb0\xbc\xfa\xf4\xf9\xf7\x4f\x9f\x3f\x3d\x7a\x0d\x0e\x01\x02\x0f\xed\xcb\x9c\x9f\x1e\xfd\xfd\xf8\xe9\xf3\xa3\x27\x3f\x3c\x79\xa9\x8c\x2d\x46\x49\x14\x26\x1e\xf2\xfc\x38\xc4\x1e\x0a\x22\x7e\xdf\x83\xb1\x33\xbb\x16\xf9\x07\x2e\x31\xf2\x9b\x22\x6e\xa5\x2f\x13\x20\xf4\xf4\xac\x89\xeb\x0a\x4a\x2d\xc2\x7d\xad\xf6\x19\xc9\xdf\xb9\x3c\x71\xef\xd2\x70\x51\x87\x9f\xa8\x6e\x45\x8f\xee\x2d\xff\xb9\x84\x6f\x72\x72\xe6\x34\x6e\xf5\xa9\x43\x23\xc6\xbd\x39\xee\x3c\x74\x98\xe3\xd5\x3c\x1a\xc3\xf3\x9f\x9e\x3e\x3f\xfe\xdb\xa3\x67\xbf\x3c\x71\x0b\x04\xfc\x81\x87\xfd\xd5\x32\x4f\x73\x85\xa2\xa5\x9b\x77\x04\xd7\xab\x85\xf7\xbc\x39\xde\x5b\x6d\x96\xc3\xbf\x4d\x56\xbd\xac\x68\x0c\x75\x7e\xe5\x7c\x37\x54\xae\xb1\x28\xa7\x38\x08\xbe\x31\x5f\xfb\x7a\xce\xbc\xbc\x03\x6c\x72\x43\x92\x06\xe6\x81\x01\xd9\x96\x6e\xe8\xe9\xd3\x27\x07\xe6\x03\x1b\xed\x3e\xe0\x52\x6a\xc0\xa1\x2d\xfc\x17\x55\xf1\x03\x39\x8b\xa2\xee\x9c\xa9\xf2\xdd\x73\x69\xb2\xc7\xa1\x6d\x3d\xfa\x57\xa7\xfd\x43\x6c\x6b\x31\x33\xc0\xb5\x7f\x2a\x0b\xdf\x7a\x82\x3d\xce\x2a\xab\x2c\x8e\xdf\xc9\xdf\xd1\x54\xf1\x60\x1d\xd7\x7a\x34\x32\x00\x6f\xd7\x47\x1e\x9f\xe5\x69\x0c\xba\x81\xa7\x31\xe8\x7a\x4f\x63\xf0\x67\x7c\x1a\x83\x6f\xea\x69\x0c\xbe\x81\xa7\x31\xde\xe7\x7f\x1a\x73\xd5\x77\x2b\x77\xbe\xbc\x5c\xf9\xf2\x72\xe5\xcb\xcb\x95\xcf\xf8\x72\x45\x6f\x8b\xfd\x9a\xd5\x27\xc5\x79\xed\x54\x5b\xa4\xff\x50\x54\x5b\x59\x62\xd0\x08\x05\x87\xe0\xf7\xcb\x03\x97\x8c\xb2\x1c\x14\xe9\x3f\x2c\x42\x64\x89\xb9\xd2\xd9\x5f\x88\x49\x36\x05\x7f\x55\xa7\x7f\xb4\xc8\xeb\x2c\xb7\x63\xfc\xd5\x56\x9c\xa3\x1a\x90\x4d\xdd\xc2\x86\x79\x32\xc9\x3a\x45\xfa\x0f\x45\x8c\xab\x1c\xf3\xe5\x5d\xce\x97\x77\x39\x5f\xde\xe5\xfc\xb9\xde\xe5\xb4\x57\x71\x07\xde\xe6\x34\x89\xdb\xbe\xcf\x19\x52\x54\x3e\xcb\xfb\x9c\x4e\xcb\xd6\xbc\xd1\xe9\xe4\xdb\xf0\x4e\xa7\x93\xf7\xca\x6f\x75\x3a\xa5\xb7\x79\xaf\xd3\xad\xee\x8a\x6f\x76\x7a\xfd\x7f\xb3\x7a\x8f\xe4\x59\x96\xf3\xa7\x35\x3f\x5d\x7b\x9f\xc4\x66\x9a\x14\x67\x9a\xc1\xce\x56\xef\xdb\x2d\x4c\x1e\x70\x08\x3e\x14\x19\x93\x6b\x41\xe7\x42\xc9\x15\x16\x08\x73\x32\xcf\xaa\xbf\x91\x45\xc6\xec\x95\x10\x5d\xeb\xd4\xbd\x84\xe2\xd4\x76\x35\xd0\x74\x51\xe4\xbc\x0b\xd8\x76\xa7\xb9\xcd\xa2\xb7\xac\xd7\x37\x7b\xed\x4a\x6e\x32\xdd\xd0\x66\x9d\x3a\x19\xac\xb7\xfb\x98\x48\xd9\x32\xd1\x0a\xde\x05\xea\xdf\x21\x6f\x92\x96\xa8\x7f\x8b\xbc\x2d\x85\xfb\x37\xc9\xdb\x52\xbd\x24\xa9\x25\xdb\x34\xa9\x6b\x75\x12\xd5\x26\xb4\xba\x87\x32\xa6\x71\x98\x9b\x84\x6f\xf6\x2e\xd0\xde\x0c\xec\x2d\x55\x78\x81\xd5\x6f\x15\xbe\xe7\xcb\xbd\xb7\xee\x5d\xfd\xdd\x47\x71\xf3\x6d\xfd\xcf\x79\x99\x53\xe3\x62\xda\x7d\x0b\x70\x81\xf6\x41\x77\x88\x96\x68\x1f\x74\x47\xe6\x02\xef\x83\xee\x80\x2c\xf1\x3e\xe8\x8e\x83\x7b\x25\xd4\x8d\x57\x5c\xfb\x9e\x2f\x9d\xbb\x62\xd3\xb1\x0b\x58\x16\xb1\x6b\x2f\x52\xd6\x27\x1c\x9c\x14\x65\xf6\xaf\x22\xaf\xc9\x42\xdd\x94\xe8\x3c\x9e\xea\x9f\x6a\xb7\x79\x7f\x2e\xb2\xbc\xae\xec\x24\x7c\x46\x2a\xa9\xa3\x64\xb9\x54\x99\xf4\xb5\xdb\xa2\x6c\x0e\xf0\x99\xde\x2b\xb7\x12\x65\xe5\xba\xe6\x0f\x65\x71\x7e\x76\x09\x7e\x6c\x1b\xb2\xdd\x03\xae\xb6\xc0\x5a\xd1\xd5\x66\x9b\xf4\xdb\x7f\xb5\x1b\x99\xa3\x17\x32\x9d\x77\x89\x9d\x0b\xfe\x1f\x33\xa6\x76\xe3\x4d\x9a\xfa\x74\xd3\x1d\xd4\x37\x99\xda\xb8\xde\xf5\xcc\x15\xdc\x7f\xfa\x04\x56\x22\xaf\x78\x51\x53\xa9\xff\x35\x3f\x95\x5d\x5b\x01\xb5\xf9\x9e\xe4\xf0\x25\x6b\x75\xb7\x46\xdd\x7a\x1c\x78\x2e\xa3\x58\xa4\xcf\x21\x1a\x76\x9f\x49\xc0\x7d\xb0\x82\x31\xfd\x08\xa6\x97\x7b\xdd\x03\x1c\xb5\x8e\xd9\x07\x99\xc3\x32\x8e\xf4\xb1\x73\xb6\x7b\x49\xb3\x99\xe9\x5a\x84\xac\x4c\x0f\x57\xb8\x93\xbd\x59\x76\x5d\xe9\xba\x23\xb5\xd3\xb9\xbe\xee\xda\xb6\xb1\x73\xfb\x51\x8d\x69\xff\x16\xe3\xa0\x04\xf8\x20\x25\x37\xdd\x86\xf7\x6d\xce\xcf\xc0\xf9\x7f\xb3\x8d\xd8\x8e\xef\x6d\xf6\xb5\x5c\x6f\x33\x4d\xba\xed\x1e\xe0\x78\x6f\x9c\xe3\xc7\x9f\x76\xba\xcf\x37\x3b\xc4\x78\xc2\xd5\x01\x58\x9b\xaa\x23\xdc\x2c\x0d\xce\xdb\x4c\x36\xaa\xc7\xf3\x3d\x9c\x4b\x8e\xef\x46\x5d\x83\xdf\x7b\x80\xae\xcb\xed\xde\x18\xb7\xaf\xb0\xab\x9a\x13\xfb\xdc\xbe\x9a\x4b\xce\x8a\xe0\x3e\x58\x45\xdf\xcd\xb0\xbb\xd7\x67\x77\x8b\x8f\x3f\x2f\xb3\xdb\x16\x6e\x66\xf5\x11\xc6\xf9\x96\xd0\xf7\xef\xca\xe2\x3c\x67\x6b\x59\xa7\xcd\xd6\xbb\x45\x2e\xf5\x92\xee\xf5\x71\x19\xd3\xa3\x59\x95\xe9\xd3\x27\x93\xf9\xf0\xd0\xe8\x31\x57\x21\xd1\x4d\x6f\xea\x24\xe8\x17\x67\x84\x66\xb5\xfb\x82\xce\x89\x1d\x9e\x9c\xbd\xee\xec\xec\x96\x5d\x8e\x4f\xdb\xde\xc0\xbc\xdd\xe5\x71\xcf\xf0\x78\x8b\x88\x1b\x20\x14\x49\x05\xf5\x9e\xcb\x4e\x17\x9d\x99\x73\xd9\x61\x22\xd5\xc4\xfd\xfe\x7c\xa9\x9b\xb5\xbf\xc2\x43\xcd\xeb\xa7\x9e\x86\xa9\xf5\x4e\x19\x76\xe3\x0c\x56\xf7\xc1\x20\x8a\xb7\x21\xdd\xf4\xdd\x9e\xc3\x4e\x6b\x89\xf4\x2a\xcf\x1a\x36\xbd\x94\xb9\x70\x5e\xbd\x8c\x8c\xbd\xbf\x6e\xec\xfd\x8d\x63\xef\x0f\xc8\xf7\x01\xb5\xce\x77\xf4\xba\xb5\x53\x81\xdf\x4c\x05\xc3\x10\x1f\x17\x45\xc9\xb2\x9c\xd4\xbc\xfa\x41\x4f\xb2\xda\x2e\xe4\x4a\x2d\x43\x19\x87\x6a\xde\x00\x70\x5d\xb6\x0e\xa6\x1f\x5d\x64\xee\x6b\x24\xf5\xdd\xc1\x78\x2f\xc3\xb2\x9f\xa1\x10\xa2\xe2\x2e\x62\x75\x44\xe7\xc1\xac\xa4\xad\x5f\x7b\x23\xd4\x46\xae\x64\xfd\xb1\x3f\x56\x4e\x6c\x57\x6a\xe9\x61\xff\xcb\xa1\xf6\xa7\x69\xc6\xd8\x7e\x5e\xa8\x2d\xca\xfb\x17\xf2\xf7\x52\xff\x5e\x5e\x5d\x9c\x05\xa3\x54\xba\xa2\xd9\xdb\x06\x07\xf3\x7e\xd2\xd0\x08\xae\x14\xea\x26\x74\x3b\xba\xfb\x76\xc6\x7a\xd2\xea\x6c\x73\x0c\x74\x68\x7d\xe9\xc9\xef\x9a\x3e\xf6\xf5\x9f\x99\x95\x67\xc3\x63\x6b\xc5\x9a\x33\x9a\x33\x43\x3e\xfb\x96\x8c\x2e\x57\x17\xc6\xd7\xeb\xfe\x3a\x46\xe8\x74\x7e\x65\x58\xd6\x95\x9c\xfc\xae\x39\x67\x5f\xff\xf9\x3c\x1d\xff\x63\xd5\x96\xb1\x67\x59\xae\x96\x31\x1b\x20\x1d\x75\x59\xb6\xcd\xbe\x6e\x15\x3f\x5b\x41\x7e\xaf\xf0\xd8\x62\x60\x40\x6f\xea\x3e\xf4\xea\xec\x9e\xae\x7f\xec\x85\xae\xf8\xd8\xab\x03\xfa\x0f\x7c\xf0\xb5\xf6\xbd\xd7\xf0\xe5\x86\xce\x23\xab\xb5\xcf\xbd\xb6\x28\x6f\x28\xfe\x5a\x30\x2c\x63\x5c\x0f\x48\x43\x56\x3b\x01\x52\x0f\x9b\xe4\xc0\x4d\xde\xec\x52\x5a\xed\x55\xae\x1b\xe4\xd1\xa2\xe6\x15\xc8\x4e\x65\xa5\x7a\xb5\x53\xc1\xb4\x28\x16\x6f\x15\xe3\x59\x96\xfa\x82\xb4\x2b\x20\xad\x2f\xc2\x76\x42\xde\xe6\xd7\x7c\x1b\xa8\xbe\x33\x7e\x7f\x78\x43\xd6\xab\x08\x3b\x35\x4c\x8d\xd4\x9d\xf5\xca\xee\xb5\x00\x9b\xc9\x7b\x77\xda\xbd\x03\xac\xe6\x73\x2d\x18\x56\x09\xb8\x16\x90\x56\xe9\xb8\xa6\x24\x75\xf4\x93\x6b\x40\xda\xf4\x1a\xd4\x3e\x06\xb5\x6f\x41\xcd\x44\x02\xdd\x09\x01\xf6\x05\xbb\x3a\x73\xef\x48\x2d\x1b\x63\xde\xa3\x35\x04\x02\x0a\x31\x7a\x36\xb2\xca\xbe\x6f\xde\x3a\x30\x48\x5a\xd1\xac\xaa\x88\x82\x31\xbc\xc3\xda\xe7\x3a\x59\xfe\x4e\xdf\x2e\x89\x04\xd9\x31\x0f\x72\xd3\xcf\x56\x57\x0e\xb2\x7b\x77\x73\xbd\x3f\xd3\xdd\xdc\x63\xbb\xab\xfc\x58\xdf\x52\x57\x0c\x2d\x29\x6d\xf4\xfe\x61\x10\xed\x7a\x63\xf5\xb8\xd1\x61\x8f\x9f\x65\x39\x1f\xad\x01\xe3\x1d\xaf\x01\x63\xb7\x8a\xbf\x4b\x09\x30\x5a\x47\xec\xef\x7c\x17\xb4\xad\xe2\xf5\xfa\x2a\xae\x79\x17\xb4\xa1\xa3\x0d\xf7\x41\x91\xbe\x63\x3b\x70\xbb\x44\x62\x19\xa8\xd1\x74\x6e\x96\xec\x4c\xd7\xdb\x38\xa6\x18\xa7\xa6\xc1\x7b\x28\xbf\x5b\xb9\x66\x56\x3b\xb2\xc1\x2a\xbf\xe2\xd2\x1f\x4a\x72\x76\xa2\x41\x64\x0b\xb6\xfe\x61\xfc\x0a\x6d\x0d\xd4\x27\x61\x92\x8b\xac\x6a\x56\x12\x52\x44\xfc\xae\xa2\xcc\x53\x76\x35\xf3\xec\xcd\xc0\x23\x93\x6b\xbd\xa0\x5d\x25\xb6\x81\x4a\xf5\x8b\x5f\xa7\x8e\xe5\x15\xea\x18\xa2\xb6\xc1\x3a\x54\xdf\x44\x51\x9e\x92\x5a\xe6\xfa\x89\xac\x05\x3b\x46\x61\x16\x74\x07\x90\xac\xe0\x8e\x3a\x13\xef\x0b\x32\xff\xf6\x7c\x05\xa5\x59\xce\xb2\xfc\x5d\xcf\x53\x50\x7b\x05\x9c\x4d\x06\xeb\xbb\x9b\xde\x9d\x75\xfc\xb5\xd8\x25\x28\xff\xc0\xf3\xfa\x31\xcf\x6b\x5e\xea\x27\xd5\x37\x58\x27\x19\xa9\xf3\xd5\xeb\xe7\x8f\x8f\x9f\xfc\xed\xc9\xf3\xa3\x95\x2a\xb7\x97\xd7\xaa\xe1\xe3\xc2\x20\xf1\x77\x14\x3a\x2d\xe4\x6b\x3d\x9b\xb0\x40\x9a\x2b\xea\x0e\xa2\xc1\xa1\xba\x83\x78\x95\x36\xcc\x89\xba\xb2\xab\x5e\xcb\xb6\x80\xe6\x15\xaf\x7f\x22\x17\xcf\xb2\xaa\x96\xe2\xc6\x1c\x3f\xae\xc9\x30\x51\x22\xf2\xd2\x34\xa9\x1d\x07\x70\xd8\x6e\xb0\xcc\xab\x65\x4e\x7f\x2a\xce\x2b\xfe\x44\x35\x62\x6f\x95\xde\xd7\xfa\xc6\xea\x3c\x4b\x7d\x08\x1e\x17\x67\x4b\xfd\x8e\xf1\xff\x2d\x96\x6a\x4d\xf4\x34\xa7\x73\xf5\xe8\x53\x3f\x3b\x7d\x5e\x30\xf5\x82\x4b\xdf\x80\x29\xca\x6a\x7e\xe7\xe1\x43\x59\xf2\x67\x5e\x9e\x66\xfa\x4a\x66\x56\x81\x13\x5e\xf2\x74\x09\xde\x95\x24\xaf\x39\x9b\x01\x51\x72\xf5\xd6\x51\x36\xfa\x1d\x9f\xa9\x27\x6a\xf9\x12\x9c\xf1\xb2\x2a\x72\x50\xa4\x35\xc9\xf2\x2c\x7f\x07\x88\x04\xa5\x1c\x16\xa9\x27\x9d\x59\x05\xaa\x42\xd4\x1f\x49\xc9\x55\x1b\x48\x55\x15\x34\x53\x87\xc9\xac\xa0\xe7\xed\x13\x55\x39\x7f\x54\x60\x52\x9f\x70\x09\xe0\xee\x2b\x53\xe8\xee\x54\x55\xc5\x38\x59\x80\x2c\x57\x57\x5c\x6c\x92\x7a\x5c\x5b\x9c\xd7\xa0\xe4\x9a\x83\xd5\xd5\xaf\x2c\xa7\x8b\x73\xc9\x3e\x12\x8c\xcd\xb1\xc8\x4e\x33\x53\x8f\x7a\xb8\x29\xf1\x53\x49\xb8\xe7\x95\xba\xb3\x79\xb6\x9c\x81\xd3\x82\x65\x42\xfe\xe5\xaa\x7f\x67\xe7\xe9\x22\xab\x4e\x66\x12\x0c\xcb\x2a\x73\x5f\x68\x06\x2a\x19\x4f\x79\x2e\x0b\x92\x9c\x3d\x2c\x4a\x50\xf1\xc5\x42\x02\xc9\xb4\x9a\xe9\xb6\x51\xe5\x91\x15\x9d\x49\xe4\xd6\x12\x98\xc6\x98\xaa\xfd\xe3\x49\x71\xda\xed\x52\x56\x01\x71\x5e\xe6\x59\x75\xc2\x55\x31\x56\x80\xaa\x50\x95\xca\x29\x50\xc6\x18\x04\x89\x62\xb1\x28\x3e\x4a\x84\xd3\x22\x67\x99\xec\x5a\xb5\x6f\x06\x52\x2b\xad\xc5\x07\xae\x7a\xa6\x89\x21\x2f\xea\x8c\xea\x21\x50\x83\x72\xd6\x0e\xb6\x49\xaa\x4e\xc8\x62\x01\x52\x6e\x30\xc8\x99\x04\x95\xe5\x80\x38\x9d\x2b\x65\x4b\xd4\x0b\xc8\x8c\x2c\x80\xa4\x3b\x59\x6f\xbf\xd3\x96\xa0\x8e\x7e\x7c\x02\x5e\xbd\xf8\xfe\xe8\xd7\x47\x2f\x9f\x80\xa7\xaf\xc0\xcf\x2f\x5f\xfc\xed\xe9\x77\x4f\xbe\x03\x77\x1f\xbd\x02\x4f\x5f\xdd\x9d\x81\x5f\x9f\x1e\xfd\xf8\xe2\x97\x23\xf0\xeb\xa3\x97\x2f\x1f\x3d\x3f\x7a\x0d\x5e\x7c\x0f\x1e\x3d\x7f\x0d\xfe\xe7\xe9\xf3\xef\x66\xe0\xc9\xdf\x7f\x7e\xf9\xe4\xd5\x2b\x09\xea\xc5\x4b\xf0\xf4\xa7\x9f\x9f\x3d\x7d\xf2\xdd\x0c\x3c\x7d\xfe\xf8\xd9\x2f\xdf\x3d\x7d\xfe\x03\xf8\xf6\x97\x23\xf0\xfc\xc5\x11\x78\xf6\xf4\xa7\xa7\x47\x4f\xbe\x03\x47\x2f\x54\x9d\x06\xda\xd3\x27\xaf\xc0\x8b\xef\x65\xe9\x9f\x9e\xbc\x7c\xfc\xe3\xa3\xe7\x47\x8f\xbe\x7d\xfa\xec\xe9\xd1\xeb\x19\xf8\xfe\xe9\xd1\xf3\x27\xaf\x5e\x81\xef\x5f\xbc\x04\x8f\xc0\xcf\x8f\x5e\x1e\x3d\x7d\xfc\xcb\xb3\x47\x2f\xc1\xcf\xbf\xbc\xfc\xf9\xc5\xab\x27\xe0\xd1\xf3\xef\xc0\xf3\x17\xcf\x9f\x3e\xff\xfe\xe5\xd3\xe7\x3f\x3c\xf9\xe9\xc9\xf3\xa3\x39\x78\xfa\x5c\x02\x7b\xfe\x02\x68\x1e\x7e\xf5\xe3\xa3\x67\xcf\x54\x85\x8f\x7e\x39\xfa\xf1\xc5\xcb\x57\xb2\x95\x8f\x5f\xfc\xfc\xfa\xe5\xd3\x1f\x7e\x3c\x02\x3f\xbe\x78\xf6\xdd\x93\x97\xaf\xc0\xb7\x4f\xc0\xb3\xa7\x8f\xbe\x7d\xf6\x44\xd7\xf6\xfc\x35\x78\xfc\xec\xd1\xd3\x9f\x14\x61\x7d\xf7\xe8\xa7\x47\x3f\x3c\x51\x05\x5f\x1c\xfd\xf8\xe4\xa5\xca\x69\xda\xf8\xeb\x8f\x4f\x54\xd4\xd3\xe7\xe0\xd1\x73\xf0\xe8\xf1\xd1\xd3\x17\xcf\x25\x7e\x1e\xbf\x78\x7e\xf4\xf2\xd1\xe3\xa3\x19\x38\x7a\xf1\xf2\x08\xbc\x78\xa9\xf0\x23\xb3\xfe\xfa\xf4\xd5\x93\x19\x78\xf4\xf2\xe9\x2b\x89\x9c\xef\x5f\xbe\xf8\x69\x06\x24\x76\x5f\x7c\xaf\xf0\xf7\x5c\x16\x7d\xfe\x44\x03\x92\x98\xef\x0e\xd0\x8b\x97\xf2\x5b\x02\xfb\xe5\xd5\x93\xb6\x45\xdf\x3d\x79\xf4\xec\xe9\xf3\x1f\x5e\xc9\xf2\x6e\xfe\xb9\x73\x91\x5c\x09\xae\x27\xa7\x59\x5d\x37\x67\x7a\x6a\xbb\xd6\x88\x55\x7b\x54\x62\x3f\x3f\x7d\x02\xbf\x5f\x1e\x34\x99\x4e\x1d\x81\xd9\x64\xed\x44\x7e\xfa\xd4\xb5\xbf\xb1\xf2\x20\xd1\x6d\xc0\x81\x12\x83\xdf\x12\xfa\xfe\x23\x29\x59\xf5\x80\x16\xa7\x67\xa4\xd6\x2f\xf1\x73\x29\xfb\xe0\x1c\xc1\xf9\xc5\x1d\xb7\xcc\xdc\xfd\x58\x85\xd7\xc9\xda\x3e\x92\x68\xbb\xe7\xb4\x6e\x2c\x6f\xaf\x97\x4e\x09\xd5\xdc\x56\x27\x76\x01\x54\xe0\x63\xb6\x58\x80\xb3\x32\xcb\x6b\x40\xc0\x47\x52\x2a\x19\x9b\x09\x70\x5a\x28\x63\x10\x24\x07\x08\x82\x45\x03\x98\x94\x4a\x3a\x10\xc6\xb4\xfc\xc8\xea\xb9\x36\xf5\x93\x55\x80\x48\x69\x27\xce\x17\x4d\x4d\xfa\xd5\xff\x09\x5f\x9c\x55\x40\x68\x9d\x03\x9c\xf2\xd3\xa2\x5c\x82\x05\x27\xef\xab\x79\xb7\x33\xa6\xd8\x4f\xdd\x8e\x20\xa8\x7b\xf0\x22\xfd\x90\x15\xe7\xd5\x62\xa9\x2e\xeb\x4b\xa1\xd1\xf4\xa1\x3a\x29\xce\x17\x4c\x8a\x16\x25\x87\x75\xcb\x10\x34\x2d\x6b\xa8\x88\x48\x89\x56\x49\x58\xca\xf2\x50\x5d\x18\x61\x54\x72\x52\x71\x36\x07\xaf\xb8\x8a\xfc\x17\x2f\x0b\xf5\xdc\xe5\x3c\x37\xe0\xe6\x63\x48\xef\xcd\xc6\xae\x0b\xbd\xdc\x79\xcf\x9b\x55\xe6\x51\x6e\xae\x16\xe2\xb9\x7a\x4b\xfb\xe9\x13\xc8\xaa\xe7\xe4\xf9\x24\x9f\xea\x83\x05\xfd\x98\xa1\x7d\xc8\xb0\x67\x5e\x2e\xa4\x1c\x10\x70\x56\x54\x59\x9d\x7d\xb0\xaf\xb5\xd5\xc3\xe2\x61\xf2\xce\x1d\xdf\x6c\xfa\x9e\xd2\xe5\x38\x85\xf1\xd3\xac\x76\x5b\x2d\x23\x5b\x8b\x01\xbc\x9c\x81\x13\x92\xb3\x85\xfc\xb1\xe0\xb9\xba\x3f\x5e\xcd\x40\x36\x6b\x29\x42\x1d\x7f\xa8\x5e\xba\x2c\x68\x7b\xd4\xe1\xd1\xdf\xb5\x37\xc0\x87\x0f\xc1\x53\x25\xcf\xf5\x74\x94\x17\x60\x8f\xcb\x0e\xef\x69\x45\xa7\x01\x2d\xb3\xe4\x1a\x2b\x73\x53\x47\xdd\x18\x57\xd4\x25\x5c\x8b\x29\x9d\xfa\xe7\x2a\x1d\x7c\xfa\xd4\x1c\xf5\x4c\xb2\xca\x2c\xf3\x56\xf3\x4d\xc1\xd7\x5f\x83\x81\xf2\xf6\xba\x94\x63\xbe\xa4\xec\x3c\x19\xd4\xce\x21\x6d\x0b\x78\xe9\x3e\x23\x7a\xa2\x21\xff\xee\x1c\x66\xc9\xf1\x95\x6a\xb9\x14\x81\xb9\x46\x2c\xeb\x76\xde\x9e\xc5\xf5\x2f\x76\x3f\x7c\x08\x1e\xd5\x92\x69\xaa\x1a\xbc\x93\x64\x50\x15\xa7\x1c\xbc\xcf\xb4\x61\x0b\xa9\x6c\xf1\x0b\x3b\x7b\x4b\x2e\x2c\x3b\xd7\xb0\x78\x69\x55\x54\x43\x59\xbf\xe4\x94\x9c\xab\xe3\xc0\xf3\xbc\x52\xa6\x2a\x32\xce\xc0\x5d\xd5\x92\xbb\xba\x25\x73\x30\xd9\x03\xf7\x65\x87\xef\x83\xbd\xe9\x9e\x63\x71\x92\x97\xea\x35\x9f\xaa\xf1\x50\xf6\x67\xa5\x87\x65\xd7\xa0\xff\xa5\x7d\x69\x60\x68\xa9\x27\xae\xb5\x2b\x86\x86\x8e\xb2\xea\x17\x2b\xba\x26\xa6\x80\x61\x10\xfb\x6e\xaf\xf1\x3e\xaa\xb3\xdb\xf3\xd7\x36\xb7\x41\x5c\xf5\x31\xab\xe9\x09\x98\xf4\x1f\x82\xb6\x83\x22\xf5\x1c\x89\x52\x4a\x2a\x7b\x91\x50\xfd\x06\x68\xbf\x3d\x62\xd4\x50\xf5\x13\x35\xd9\x6e\x07\x15\x69\xc9\xc9\xfb\x03\xb7\x20\x5e\x53\x70\xd6\xa1\x9c\xb5\x60\xbc\xad\xc1\xb8\x5f\x78\x14\xe8\xc3\x87\xa0\x5a\x14\x1f\x1b\xba\x30\xa2\xb6\xad\x45\x32\xb6\x35\xe1\xe1\x0a\x38\xa9\x8a\xea\xaa\x9b\x6a\x66\xcd\xfb\x7f\xb7\x79\xbd\x57\x26\x95\x7b\x48\xda\x3e\x8f\x68\x98\xb0\x3f\x56\x3b\xd5\xbf\x70\xc4\x9e\x6d\x87\x2a\x31\xb1\x19\x78\x0e\x0e\xdb\x6c\x8e\xf3\x4a\xa0\x1f\x34\x3a\x6f\x62\x17\x3c\xd7\x4f\x61\x4d\xd7\x9a\x52\x6f\xb2\xb7\xc3\xbd\xbb\x74\x4e\x7e\xd5\xc3\xd4\x75\x92\x96\x30\x66\xa5\x74\x5f\xe0\xb6\xd2\xb4\x15\xbd\xa7\xad\x5c\x75\x28\xbc\xc9\x37\x32\x63\x34\xa2\xb3\x9d\x38\x6c\x4d\x7b\xd3\x9d\x24\xf5\x51\x01\x88\x7a\x9d\x53\x72\x7a\x5e\xea\xb5\x9b\x5e\xe3\x28\x3a\xd5\x13\xa9\x95\xca\x77\x73\xfe\xd1\x76\xf2\xee\x57\xe0\x5b\x2e\x8a\x92\x6b\x38\x84\xa9\xd9\x3f\x6b\x84\x54\x83\xde\x19\x10\x59\x59\xd5\x40\x4d\x45\x1d\x08\x8d\xd4\x77\x05\xb3\x93\xc1\x69\xba\x2c\x3c\xd9\x73\xd2\xf6\x66\xaa\x59\xdd\x17\x29\x00\x0c\xe0\x72\xde\x22\xff\x9b\x5e\xee\x95\x2c\x60\xbf\x1d\xaa\x61\x74\x6a\x61\xa6\x5b\x26\x95\x16\xd7\x5e\xb4\xc2\x58\x21\x94\x51\xc1\x06\x34\xf8\xae\xc8\xf7\x6a\x90\x73\xa9\xb5\x9c\x70\x6d\xc9\xdb\x58\x01\xd4\x67\x2d\xf3\x95\x11\xd2\x95\x38\x94\x2d\xa9\x71\x95\xc7\x06\xda\xd5\x34\xec\xa9\x00\x1f\xf9\xde\x07\x0e\xc8\xa2\xe4\x84\x2d\xc1\x3b\xa9\x54\xe5\xc0\x98\xad\xfb\x87\xa4\x1f\x72\x76\xc6\x73\x36\x56\xfd\xfc\xec\xbc\x3a\x99\x38\xe8\xd0\x4d\xb0\x15\x3c\xd2\x03\xae\x4c\x53\x71\xb9\x84\x04\xcd\x19\xaa\xee\x6b\x21\x57\xfa\xf9\x3b\x65\x19\x46\x5b\xd3\x1b\xef\xe7\x9b\xd5\xd8\x96\x69\xde\x5a\x5a\x55\x6f\xee\x14\x5f\x37\xe3\x25\xd5\xcc\x66\xa2\x18\x47\xcb\xca\xfc\x6f\xba\x28\xf5\xe1\xd6\x7a\x99\xe1\xc6\x76\x7a\x5a\xd5\xbf\x1c\x55\xe1\x74\x70\xa9\x31\x68\xe3\xec\xb4\xb7\x22\x18\xd2\x84\x3b\xd7\xf2\x65\x4b\x4e\x65\xa3\x4f\xc1\x5f\x01\x6c\x6e\xaf\x74\x1b\x6f\x4c\x2a\xfd\x15\x9c\xb6\x8d\x1a\xed\xa3\x7d\x5b\x6f\x27\xa1\x22\xaf\x0a\xb9\x02\xd2\x72\x65\x22\xd7\x35\x53\xbb\x3c\xd8\x07\xf6\xd1\x62\xa7\xd5\x56\xb5\xdf\x03\xf7\x7b\x7c\xa4\xff\xdb\x93\x83\x01\x18\xaf\x39\x95\x3a\x35\xf8\x2f\xe6\xae\x2b\xe4\x82\x62\x3e\x5e\xf6\x97\x8a\x2b\x09\x31\xb4\x07\x36\x6d\x8c\x75\x49\x06\x53\x3a\xfb\x7c\xaf\xcf\xf9\xa3\xfd\x6f\xec\x55\x19\x09\xd1\xbe\x48\xb6\x48\xa8\x4b\x42\x8d\xda\xd9\x4a\xd3\xae\x72\x26\x97\x24\xd5\xf9\x99\x5c\x2e\xea\xe7\x0d\x4f\x9f\x00\x04\xdb\x3b\xaf\x2e\xa4\xc9\x74\x44\x3d\xda\x56\x69\x2f\xf2\x3e\xbd\x0c\x4e\x33\xeb\x00\x28\xd3\x17\x6b\x27\xa1\x9b\x9f\x7a\xf4\x95\xf0\x52\xd1\xda\x80\x07\xf9\x77\xcd\x65\x5d\x73\x13\xeb\xb4\xf8\xc0\x6d\x5f\x4c\x13\xdf\xd9\xcb\xf5\xe6\xea\x78\xe9\x9a\x16\xb4\xb0\x5d\x3a\x6e\xc4\xec\xf0\x23\xd8\x83\xee\x00\xbc\x6b\x05\x7d\x57\xb6\xaa\x16\x35\x88\x7a\xd7\xb9\xf3\xd5\x0e\xd7\xc3\x87\x8a\x44\xe5\x42\x78\xaf\xdb\x7c\xbb\xb4\xc9\x84\xe8\x4c\x7e\xe0\xa3\xb2\x09\x26\xb3\xb2\xb1\xc1\xea\x42\xda\x46\x77\x90\x31\x33\xb3\x62\x2c\xf2\x99\xb1\xad\x36\x03\xd9\x6d\xe9\x14\xea\xe5\xc9\xd8\xac\xd8\x41\xdb\x1d\x3d\x44\x23\x2b\x02\xc7\x42\x9d\xcc\xe5\xa8\x6f\xb6\x73\xca\x9c\x5d\xd3\x08\x0d\xea\xb0\x1d\xbb\x76\x01\x38\xe9\xf5\xd8\x99\xf5\xbf\xfe\x1a\x74\x62\x3a\x10\x1a\x81\xce\xf8\x82\x2b\xe3\xc2\x43\xcd\x1c\xd0\x53\xba\xc3\x36\x75\xe5\xaf\x56\x56\x7a\x14\x62\xf4\x95\x9e\x7e\x31\xa4\x3a\xcb\x1c\x4d\xb3\x1a\x2d\xb6\x31\xe6\xf2\xe0\x81\x9c\x13\x0e\x5a\xbe\xb0\x98\x51\x56\x34\x06\x91\xa3\x10\x64\xb2\xb4\x68\x30\x78\xe9\xc4\x0d\xa2\x06\x80\xce\x80\x64\x23\x6b\x90\xcb\xfe\x0c\xd6\x94\xf9\x0b\x80\xd3\xee\xe5\x53\xe7\x81\x95\x6d\xbe\x9d\xcf\x64\x13\x50\x5b\x75\x27\xc9\xda\x10\xdd\x38\x5c\xbd\x09\x58\x01\xa9\xce\xd4\xd2\xa1\xe5\x1b\x34\x5d\x99\x74\x6f\x7a\x88\xaf\x28\xf9\x35\xc0\x47\x8b\xc5\xe0\x96\x53\x77\xf3\x46\xd9\xbe\xd9\x6a\x9b\xa6\x8f\x73\x33\x9f\xe9\xb2\xca\x76\x65\x51\x82\x6e\x5f\x66\x20\x2f\x1a\x3d\x4e\x76\x76\x08\x7a\x1f\x41\x8e\x1a\xd5\x5f\x92\x6b\xc3\x76\xd3\x01\x2d\xc5\xac\x46\x64\x74\xc3\x0a\x63\xa2\x65\xe3\xb0\x77\x7a\x6a\x70\x6f\xa4\x76\xaf\x83\xaa\xcf\x64\xb1\x70\x54\x14\xbd\x83\xa8\x25\x79\x75\x67\x6d\x3f\x5c\xe6\x34\x96\xa4\x3a\x68\xef\xf0\xa6\x7a\x44\x7f\x78\xb8\x32\x67\x38\x76\x70\x5c\xbc\xac\xd2\x80\x84\xd0\x31\x8a\x3b\x96\x6f\xa5\x86\x83\xb1\xc5\xdf\x18\xb2\x16\x2b\xfb\xe8\x23\x7b\x38\x2b\xd3\x4b\xab\x1a\x8f\x4f\xef\x6d\xde\x83\xae\xec\x5b\x74\x0f\x44\xd5\xa0\x3d\x7b\xfa\xfd\x0b\x50\x94\xcc\xec\x69\x58\x53\xa3\xbd\xb5\xfe\x74\x15\x75\x63\x95\xbe\xe9\x97\x05\x0f\x80\xd9\xa6\x91\x68\x5d\x43\x5a\x57\xe0\xe0\xc5\x66\xc6\x2d\x79\x7d\xb0\xcb\xac\x2a\xd7\x49\x6f\x7b\x2b\xc1\x66\x18\x46\xd7\x82\xa6\xe0\x6a\xfa\xdb\xce\x8a\x4e\x67\x1b\x50\x9f\x9d\xfd\x96\xc6\x1e\x6b\xbd\x15\x0a\x1e\x17\xe7\xf9\xc8\xe6\x73\x9f\xc9\x5d\xab\x94\xfc\x83\xa3\xa4\x8d\x8c\xc6\x0a\x15\xb6\x85\xa6\xbd\x99\x06\xf5\x64\x8b\x93\xb3\x9b\xb1\x4d\x70\xf4\x10\xc7\xc8\x25\x1c\xe8\xf4\x68\x57\xcd\x52\x46\xcf\x08\x1d\xeb\xe0\x7c\xa8\xa8\x46\x8d\xae\xa0\x51\x98\x9d\xee\x91\xf2\x5d\x07\x88\x59\xc0\x90\xf2\x5d\x6f\xd9\xa2\xee\x0a\x38\x10\xcc\xb9\xc4\xa6\xf2\xe6\xd0\xa1\x5f\xda\x28\x24\x9b\x4a\xeb\x6d\x8c\x3d\x6d\x36\xff\x5d\x63\xc0\xa9\x0f\xad\x5d\x57\xf7\x01\x5a\x48\xd6\x4c\xcc\xe5\xaa\x59\xd0\xf0\xcb\xd5\xc3\xe3\x6f\xc9\xb8\xf9\x46\x8c\xe3\x2f\x37\x0f\x6f\xe2\xe6\xe1\xb7\xa4\xfc\xb7\xba\x78\xf8\x2d\x29\xaf\x7d\xef\x50\x11\xd6\x97\x6b\x87\x9f\xfd\xda\x61\xf4\x67\x12\x62\x9f\xcf\x04\x2e\xbc\x29\x13\xb8\xf0\x06\x4c\xe0\xa2\x5b\x94\xd6\xf8\xf8\x58\xb9\xe4\x3a\x6e\x7d\xcc\xad\x95\x76\x28\xc0\x3b\x4b\x54\xa7\x22\xed\xde\x6a\x43\x4d\x3b\x5a\x6b\xf6\x07\x9c\x72\x8f\x7a\x86\xd9\xad\x8a\xa0\xe9\x4c\x36\x7e\xb3\xde\x4b\xc2\x31\x89\xfd\x73\xb6\x7a\x55\xfc\x33\x8a\xec\xb5\x04\xb5\x95\xc8\xfe\x39\xdb\xe9\xaa\x78\x17\x4f\x23\xe2\x5a\xa9\xca\x46\x70\x66\xd6\x8a\xdf\x82\xbf\xe3\x39\x7b\x5c\xe4\xb5\x72\x73\xb5\x47\x65\x55\x25\xd7\x6e\x5a\xd7\x0b\x78\x62\x89\x78\x7b\x21\x3f\xcc\x02\xdb\x48\xfa\xb2\x21\xe4\xed\xc5\xfd\x08\x1f\xdc\xa0\xd0\xef\xfa\xa3\x4f\x87\x05\xfe\xec\x4e\x73\xe8\xae\x1e\x25\xed\x9b\x15\xcd\x82\x2c\x8b\x73\x85\x73\xe3\x86\x54\x9f\x5b\x28\x7f\x17\x0a\x3b\xfb\xd6\xe5\x03\xcf\x99\x89\xf0\x42\x13\x45\x2f\xf6\xc1\x5e\x00\xff\xcb\x14\xa2\xcb\xce\xe7\xaa\xb3\xbb\x9e\xbb\xbb\xbd\x18\xfe\xd7\x9e\xb2\xab\x71\x07\x80\xe6\x1d\x71\xbf\x65\x57\x95\xe3\x8e\xd3\x3e\xdb\xa7\xb7\xd3\xd5\x5e\xed\x00\xb6\x7d\x31\xe6\x62\xe3\x9a\x80\xd6\x3b\xb0\x5c\xdf\xc5\x4d\x2f\x51\x37\x35\x60\x97\x8a\xe5\xa4\x9e\xbf\xb3\x18\x5d\xef\x3d\xf3\xcf\xde\xfa\x2d\x5d\x77\xfe\xd9\xbb\xb1\xa5\xdf\xd0\x3f\x6f\x37\xd4\x46\xc6\xa0\x46\xba\xd6\x19\xe5\x17\x6f\x1b\x5f\xbc\x6d\x7c\xf1\xb6\x71\x15\xad\x5c\xe3\xa9\x3a\x2d\x8a\xfa\x64\x5c\x95\xdd\x79\x1b\xa5\x0b\xfe\x1a\xbd\xed\x83\xda\x75\x6d\xa0\x5e\x1c\xe7\xe4\x74\xcd\xc0\xee\xb8\xc2\xe9\xc2\xbe\x46\x57\xbb\x80\x76\x5e\xa1\xd0\x22\xaf\x49\x96\xf3\xf2\xf8\xd5\x79\x29\x08\x1d\x5f\xa9\x24\x3b\xca\xa6\xd0\xad\xe4\x19\x59\xae\xf3\xd5\x92\xec\x56\x45\x74\x7c\x5c\x9d\x90\x33\x7e\xfc\x92\xd3\x5a\x69\xf6\xe3\x1b\x71\x3b\x8e\x5b\x7c\x45\x77\x30\x3b\x54\x91\x48\x44\x99\xf5\xca\xf1\x51\x51\x2c\xea\xec\x6c\x4d\x25\x3b\xee\x8b\x22\xf8\xf9\x7d\xe7\x20\x64\xf7\x95\xe4\x72\x70\x3d\xb6\x30\x6e\x9d\xe7\x7c\xf1\x1c\xf3\xc5\x73\xcc\x0d\x79\x8e\xc1\x07\x5f\x1c\x32\x7d\xf1\x9e\xf3\xc5\x7b\xce\x17\xef\x39\x5f\xbc\xe7\xdc\xa2\xf7\x9c\xa3\x92\xf3\x53\x72\xb6\xb2\x6d\xdd\xba\xd0\x91\x2a\xce\x79\xcd\xd5\x63\x7b\x67\x8e\x77\xa2\x27\xc7\x25\x17\xed\xb5\x12\xc6\xcf\xb4\x21\xd4\x92\x8b\xb9\xfa\xb0\x57\xa4\x73\x0d\x43\x25\xc8\xdf\x36\xde\x3a\x0c\x56\x09\xea\xc3\xa6\x28\xd4\xff\x8f\x72\xfe\xa1\x12\xed\xf7\x81\xa9\xcb\x6e\x20\x83\x43\x05\x7c\x6e\xbf\x9b\x7b\xc0\x2a\xe2\x3b\xd3\x22\xdd\xb2\xfb\xfa\x2a\x86\xd3\x37\xf6\xb8\x05\xd3\x40\xfc\xfa\xeb\xe6\xb7\xbd\xa6\xf3\x4d\x1b\xd3\x35\x4b\xae\xa2\x1d\xb3\xe4\x96\x69\x1d\x1c\xfd\xae\x6b\xdf\x77\x5a\x34\x53\x6d\x36\x31\xb3\xc6\x46\xf8\xac\xe9\xf5\x7e\xdb\x7f\x6d\x3e\xf3\x52\x8e\xb5\xb5\xe7\x2a\x3b\x60\xbd\xb1\x3a\x7e\x6d\x24\x81\xad\xe9\x44\x7b\xc3\x45\x97\xec\xa3\x60\x5e\x72\x76\x4e\xb9\xd3\x39\xed\xf6\x78\xa6\x01\xb5\x37\xca\x3a\x4e\x91\xc1\x7d\x9d\xac\x07\xc8\x5c\x11\x9b\x01\xe8\xde\xaf\xea\xd6\x6b\x9e\xa4\x16\x8c\xbf\xb1\x9d\x7c\xab\x1f\xad\x76\xa2\xb4\xb1\xdb\x6f\x00\x94\x1d\xef\xa4\xf4\xef\x34\x76\x6c\x52\x2a\xea\x32\x35\x5a\x04\xec\xaf\xf4\xb5\x63\xd1\x59\xfd\x99\xd9\x51\xd2\x74\xdb\x8c\x89\xfc\x73\x47\x1b\x89\xb6\x6e\x13\x45\xb6\xa8\x79\x29\x17\x30\x2e\x5b\xb4\xb1\xe6\x29\x83\x73\xbb\xe4\x77\x70\xa1\x3b\x31\xbf\x98\x81\xa5\xf9\xb9\x6c\x6c\xab\xaa\x4f\x6d\xd7\xb9\xb1\x13\xa6\xe2\x8c\xd9\xdf\xcb\xe6\xf2\xf7\x63\xdd\x0f\x75\xc3\x9b\x94\x9c\xa8\x59\x9f\x13\x7a\xa2\xfb\xaa\x9c\x51\x33\x50\x58\x7f\xb8\x5f\x83\x8a\x92\x05\x9f\xab\x66\xbf\xe3\xf5\xa3\x92\x93\x17\xc2\xa1\xf9\xf6\x6a\x7c\x3f\xb1\xa1\xa4\x99\xaa\xe8\x6f\x12\xde\x4b\x52\x67\x85\x73\x8b\x4c\x7e\x2a\x75\xca\x4d\x37\x5e\x7c\xe5\xb0\x75\x13\xdc\x4b\x6c\xeb\xb8\xc9\xbd\x89\xa5\xfa\x78\xe8\x52\x18\xb8\xa7\xeb\xed\xf9\xb8\x72\x49\xc0\x70\x95\x25\x57\x09\x63\xdf\x50\x9d\xfc\xad\x68\x4d\x01\x76\x28\x4c\x7e\x6b\xda\x35\xec\xd6\x47\xb9\xf6\x1a\x5d\xd1\xa2\xe4\xc6\x37\x3e\x07\xed\xbb\xd6\xb2\xf8\x38\x93\xea\x85\x8c\xfd\x58\x94\x55\x0d\x88\x4c\xac\x75\x5b\x1b\xfc\xff\x2a\x93\x5e\x29\x18\x5d\xdc\xb7\x09\x13\x05\xea\x8c\x94\x3c\xaf\x5f\x65\xff\xe2\x33\x03\xa9\x87\x7b\x9d\xe1\x91\x46\x4f\x9b\x1b\xdc\x73\x3e\xac\xa8\x28\x8b\x8f\x26\x63\x59\x7c\x9c\xab\x9e\xdf\x6b\x7e\x36\xf2\xf2\xb8\x2c\x3e\xfe\x3f\x5a\x04\x98\x9c\xdb\xc9\x03\x4b\xe2\xf6\xa1\x51\x96\xef\x1b\xaf\xfe\x59\x6e\x4a\xc8\x9f\xa6\x94\xaa\xb3\x31\x8f\x7b\x4a\x2e\x6c\x66\x72\xd1\x64\x26\x17\x9d\xcc\x7a\x58\x0e\x8c\x75\x76\x5d\x81\x75\x9b\x3d\xd3\x20\xa0\xda\x4e\x6e\x1a\xa0\xe6\x8c\xa6\x37\xaa\xf6\xb6\xc2\x7e\x22\xb9\x70\x09\xd3\xe2\xea\x9b\xb6\x59\x0e\xaa\xef\x29\x00\xf7\xdc\x21\x01\x0f\x6d\x99\x59\x53\xf8\x21\xe8\x15\xca\xf2\x6e\xa1\xa9\x94\xe6\xb6\x0f\xad\x60\x71\x8d\xf8\x35\x77\xdd\x1b\xf4\xaf\xa6\xae\xd2\x8a\xfe\xfd\x52\xd9\x20\xcd\xaa\xef\x17\xe7\xd5\x89\xc3\xaf\xc5\xc7\xc6\xfe\xb8\x43\x32\xa6\xab\xda\xf0\x71\x43\x21\x0f\x9d\x2c\x53\xed\x46\xbb\xbd\x79\x2b\xe1\x4a\x2e\x6a\x21\xfe\xd5\xa9\xda\x88\xad\x86\x40\x56\xaa\x75\x32\x35\xb2\x5c\x4d\xca\xe7\xe5\xdf\xbb\x99\x2e\x3a\xd3\xbd\x33\xdd\x81\xde\xd6\xc1\xcc\x3c\xc4\x95\xed\x6f\x96\x7e\xee\x93\x5b\x77\x4a\xd0\xf9\xe4\x5a\xa5\x8d\x9b\x4b\xc2\x90\x0d\x70\xe3\x96\xdd\xd6\x2c\xdd\xb4\xc6\xec\x7e\xd3\x3f\x37\xd5\x5a\xed\x6f\x39\xa1\xc1\x42\x07\xdf\x2d\x9d\x6b\x42\xfa\xd1\xa0\x6e\x5f\x76\xc9\x45\x04\xb8\xef\x7e\x6a\xf0\x0f\x54\x83\xcd\x15\x6b\x85\xbc\xfb\x87\x6e\xfd\xf6\xfa\xe8\xc3\x87\xe0\xe3\x09\xa9\xf7\x2a\xf0\xaf\x3b\xb6\x81\xff\x72\x9e\x31\xe9\xc7\xb3\xda\xac\x10\x3f\x25\x59\x0e\x2e\x9a\x37\xb4\xa4\xaa\xd5\x6b\xd2\x42\xc8\xe6\xdd\xe9\xf6\xef\xfe\xe1\x96\x6d\x3c\x18\x9b\xae\x5d\x82\xd5\x23\xb4\xdc\xef\xa0\x1c\xdc\x6f\xd1\xa2\xb9\xd8\xce\x90\x2b\xb4\x04\x1e\xb4\x59\x7b\x53\x76\x6b\xdc\x72\x95\xaf\xfa\x69\x57\xe7\x2a\xeb\x00\xe0\xc6\x98\x4a\x03\xfc\xeb\x0a\x36\x1d\x96\xea\xd6\xd9\x66\xe9\x33\xd4\xeb\x01\x12\xbe\x3d\x86\xea\xb3\xb2\xcb\x58\xb2\x71\x43\x2c\x63\x3b\x37\xc8\x6c\x2e\x3f\x69\x14\xac\x65\xa7\x5f\x35\xd6\xfa\xdc\xb4\xec\x52\x6a\x43\x3e\xb2\x49\x2d\x3b\xbd\x6e\xd9\xc9\x15\x56\x2e\x07\x99\x47\x86\xbd\x66\x76\xd9\x62\x5d\x65\x57\xe0\x8b\x8b\xfd\x3e\xaf\xd9\xfe\x69\xb6\x30\xba\xe4\x00\x03\xda\x7c\x3d\x9e\x38\x1b\xe0\x85\xb3\xab\xf3\x80\xda\x77\x6c\x09\xff\xf0\x70\x95\x26\x7b\xaa\xc2\xae\x13\x59\x5f\xef\xdf\x8d\x71\x1b\xc5\xee\xa5\x36\x37\xf0\x81\x2f\x96\xea\x75\x78\xfe\xce\x2a\x79\x8d\x5a\x27\x95\xf0\xbd\xaa\x5d\x19\x66\x79\x5d\x80\xea\x9f\xe7\xa4\x6c\xd4\xbe\x4a\x2b\x77\x26\x72\xe9\x22\xd3\xc6\x4d\xf4\x9a\x64\x50\x8f\x5b\xbb\x8c\xdd\x7a\x41\x57\x82\xd2\xac\x46\x7a\x8b\x90\x83\x36\x43\xf1\xb1\x79\xbd\xa1\x63\x52\xae\x5e\x45\x36\x6a\x08\x50\x56\x8b\xb8\x8e\x97\xd9\xb5\xb2\x5b\x15\x40\x90\xb2\x29\xd5\x95\x1b\x8e\x07\x1f\xa3\xd5\x1a\x79\x62\x81\xd1\xf3\x52\x0e\x41\x0b\xaf\x01\x54\x29\x6a\x71\x55\x45\x4b\x2e\x33\xd5\x1b\xab\x45\x28\x50\x66\xe7\x0c\x14\x65\x66\xad\xed\xb5\x80\xe4\x12\xc7\x59\xd3\xac\x5b\xca\xb4\x95\x48\x15\xd8\x61\xc7\x87\x1a\xfd\x6a\x89\xe1\x60\xad\xe6\xa7\x67\x0e\xe8\x4e\x55\xed\xbb\x14\x2b\x93\xe7\x66\xb9\x62\xdd\xcc\x9a\x07\x43\x2e\x90\xf6\xc9\x3c\xec\xd8\x88\x91\xf8\x51\x46\x2a\xec\x1a\xbb\xf8\xa8\xad\x1f\x58\x7c\xbb\x40\xde\xc0\xd6\x0a\x4b\x53\x6d\x23\xab\x1a\xad\xde\x1d\x96\x81\x35\x46\xb5\xb2\xba\x70\x1f\xa8\xeb\x82\x7f\x39\x54\xe4\xd0\x7b\x8a\x6e\xb7\x7f\xb5\x41\x32\xb5\xcd\xd9\x1f\x18\xf5\x20\xca\xed\x77\x75\x92\x89\x7a\xe2\x1a\x8f\xd1\xe4\xa7\xea\x19\xf5\x36\x2b\x35\x93\xb4\x28\x6b\x63\x83\xb0\x5c\x02\x02\x58\x26\xd4\x3e\x6b\x3d\x58\x69\x83\x8f\x07\x7a\xee\x3a\x2b\xce\x26\x53\x83\x93\x26\x8f\x66\x96\xae\xb0\xd3\xe8\x28\x95\xac\x50\x62\xdd\x69\xeb\xd6\xb4\xda\x69\x46\xf3\x64\xb4\x4b\x1a\x3d\x04\xb4\xcb\x00\x83\x83\xfe\x83\xd0\x16\x94\xbb\x05\xb3\xa1\x07\x52\xb5\xeb\xd0\xc8\x9a\xc6\x5c\x8e\x2f\xa5\xcd\x6e\x8a\xb3\x93\xd2\x65\x81\xde\xf2\x7d\xc0\x07\x51\x23\x04\xe9\x30\xad\x5d\x4e\xed\x92\xdb\x91\xec\xb2\xda\x76\xa2\x32\x3b\x95\xdb\x38\xf1\x1e\x3c\x32\xdd\xc6\x8b\x37\xbe\xb2\x1b\x6f\xd3\xaa\x35\x0e\xbc\x4d\x8e\x89\x2b\xa7\x8f\x4b\x2e\xb0\xe1\x4e\xed\xef\x91\x9f\x9e\x19\x87\x85\x33\x99\x5a\x9b\xc4\x61\x3f\xdf\x06\xa4\x95\x39\x8d\xca\x76\xac\x95\xb5\xfe\xf1\xd7\xac\x63\xf4\x68\x22\x73\x4d\x67\xe0\x58\xfb\x54\x86\x07\xfa\xd7\x5f\x54\x69\xfd\xd1\xea\x75\xda\x5e\xd2\x9b\x63\x73\x86\xd5\x1e\x99\xa9\x98\x41\xc2\xd1\x0f\xf8\x1a\xaf\xe8\x13\xd5\x29\xe5\x05\x6a\x93\x03\x72\x85\x15\x70\x68\xbb\xb7\x8d\x0b\x72\x8b\x89\xa9\x3a\x9a\x32\xc6\x17\x14\x9c\x99\x7e\x6a\xf8\x76\x4e\x8b\x9c\x12\xf5\x76\xac\x9a\x4e\xa7\x06\xc9\xf6\xef\xbc\xaa\x49\xad\xf6\xa4\xd5\x97\x3e\x25\xf8\x4e\x53\xc8\x2b\x99\x34\x99\x5a\xd3\xf6\xb3\x75\x3d\x70\x46\x6e\xc4\xdf\x79\x43\x28\x1d\x4f\xe7\xcd\xfd\x81\x5f\xb3\xc5\xe2\x25\xa7\x3c\xfb\xa0\x8e\x59\xab\x11\x6f\x73\xa3\xf9\x27\x39\xbf\xa8\x7f\xee\xfa\x3e\x97\x62\xa3\x89\x9e\x33\x52\x13\x75\x2a\xe3\xb8\x49\x94\x71\x5d\xcb\x71\x12\x25\xdc\x74\x7d\x14\x25\x03\x76\x45\x3a\x1e\x5c\x35\x52\x2a\xcb\x6a\x52\x1a\x55\xbc\x06\x1a\xd7\x76\xdb\xac\x36\xfc\xac\x2e\xa4\xcf\x6d\xd1\xc6\x05\xab\x1e\xef\x4b\xf0\xeb\x49\xb1\xe0\xea\xec\x48\x15\x37\xf9\x86\x9c\xb0\xae\xb6\x74\x0c\x89\x03\x5d\xea\x6f\x6b\xb7\x38\xc9\x2a\x73\xb5\xe3\x11\xad\xb3\x0f\xcd\x89\x4f\x93\x4e\x54\xf4\x73\xb5\x93\x9f\x9f\x2f\x16\x16\x35\xa3\xee\x04\xb5\x01\x31\x6d\x27\x39\xaf\x47\x1d\x0b\xf6\xb3\x19\xfd\x91\x0f\x79\x1a\x1c\x75\xe1\x56\xe4\x2d\x80\xd6\x97\xb3\x1b\xdb\x75\x4e\xd7\xe8\x38\x26\x67\x47\x11\xb5\x75\xd6\x1a\x1f\xc6\x3d\xfa\x46\x69\x3c\x74\x13\xe7\xcd\xdd\x4c\x5f\x5f\xcf\x72\xbd\x1b\xff\xed\xf2\x68\x79\xc6\xb5\x50\x6e\x15\xb5\xab\xde\xbd\x19\x92\xf1\x1d\x67\xff\x4e\xd3\xc7\xe9\xde\xf5\x14\xbb\x32\xfa\xd6\x2d\xc7\xe0\xf0\x17\x8c\x37\x49\x97\xb3\xee\x85\x18\x17\xa8\x00\x13\x77\x0c\xba\xa9\xdd\x51\x6b\x86\xfd\xc0\xc9\x72\xd9\xd6\xd2\xf7\xd1\xbf\x0e\xf6\x5a\xb8\x97\x5b\xd0\xeb\x33\x4e\x3e\x8c\x71\x55\x3f\xdb\x3a\x7a\x1d\xf7\x5f\x6c\x9a\xa8\x20\x38\x7e\x88\xdd\xe8\xb5\x14\x8b\xbf\x90\xec\x26\x81\x35\x2a\xb2\xb6\xa5\x59\x35\x0a\x23\x34\xdb\x1d\xfa\xab\xd3\xec\x0a\xec\xb5\x70\x37\xd0\xec\xe3\x45\x46\xdf\xaf\x25\x57\x95\xc3\x39\xa9\xb3\xf4\x52\xe4\x2a\xa5\xeb\x54\xd8\x44\x76\x1d\x57\x9a\xc8\x6e\x93\x1d\xb0\x1b\x9b\xaa\x3d\x01\x3e\xca\xb3\x53\x52\x73\xf6\xd4\x3e\x95\x1a\xf3\x34\xeb\x66\x9c\x50\xfd\x92\x4a\x6b\xe8\xe6\x42\x58\x56\x3d\xe3\x44\x0c\xf8\x13\xc7\xe3\xfe\xc4\xc7\x5d\x1a\x67\x95\xae\x30\x2b\x72\x4d\x4e\x8e\x77\xe1\x95\xb4\x0e\x8d\xd9\xa4\x6f\xf9\xbb\x2c\x77\x4a\x75\x13\x06\x8b\x7c\x77\x5e\x12\xb3\x27\xb5\x52\xca\xa6\x0d\x16\x7c\x42\xaa\x2c\x7f\x37\x54\x4c\xa7\x74\x7b\xf6\xcb\x19\x23\x35\x5f\xd7\xbf\xc1\x1c\x07\x0e\xfa\xec\x6e\x65\x83\xff\x35\x8e\x79\xdb\x3c\xab\xae\x79\x2f\x3a\xe9\x2b\x2e\x81\xdb\xa4\x65\x57\xac\x95\x24\xaf\x16\xa4\xe6\xe6\xc0\xa4\xe2\x4f\xf3\x7a\x32\xd1\x5b\xa1\x24\x67\xc5\xe9\x64\x0a\xee\x01\x0c\x1e\x00\x24\x7f\x98\xc5\x2a\x82\x53\xb7\x13\xda\x64\x58\x63\x8c\x13\x34\x56\x2d\xba\x84\x04\xda\x8c\x23\x1a\xc6\xbe\x26\xa2\xbe\xe6\x32\x4f\xb3\x9c\x19\x25\xbf\xe9\xc9\x74\x4c\xea\xaf\x02\x51\xd1\xdb\x00\x51\x6c\xd7\x29\xaf\x62\x86\x8b\xb6\xe2\xe8\xb3\x3a\x26\xbd\xfa\x35\xfa\x39\x71\x3c\x99\x3a\xfd\x13\x65\x71\xba\xaf\x2f\x11\xe8\xfb\x03\xed\xd5\x81\xde\xad\x01\x7b\x61\xc0\xc5\x4e\x5d\xec\x5e\x96\x19\x9e\xdb\x5f\x65\x51\x37\x1b\x57\x3c\xb6\xdf\x67\xc7\x9e\x38\x31\x93\xd2\x08\x73\x39\x53\x51\xf3\xd3\x59\x87\x97\x5c\x78\xdd\x99\xc7\x1c\x70\xa8\x23\x43\x95\xdc\xe5\x1e\xa0\x37\xf1\xd5\x01\x88\x4e\x5e\x0e\x25\x37\xce\x9b\x55\x96\x15\x1e\xb6\xd9\x5a\xc7\xcd\x2a\xdf\x89\x73\xe0\x77\xf3\x94\x73\x7d\xea\xe9\x53\x50\x4b\x45\x7b\x8d\xe4\x50\xc6\xb7\x1d\x39\x72\x1f\xec\x9d\x5d\xcc\xc0\x50\xec\x74\xc5\xd6\xa5\x24\x2a\x07\x14\x9c\x01\xb8\x9a\x89\xd4\xc6\xe5\x88\x79\x75\xac\xf2\x8b\xa2\x3c\x5d\xc9\x99\xca\x19\x61\x1f\x8c\xcf\x10\x60\x3b\x2a\x03\x3d\x4a\x5b\x33\x4d\x81\xf5\xe4\xdd\xc9\x79\x39\xdb\x72\x6c\xae\x38\xc8\xeb\x40\x0d\x3d\xc6\x18\x79\x71\xdd\x41\x92\x94\xd4\xfd\x48\xad\x05\x18\xd7\xc3\xe6\x11\x76\x57\x8d\x58\xd9\xf5\x33\x3a\x45\x9f\x88\x06\xf4\x82\x2d\xf0\x3c\x3a\xe7\xee\x83\xaf\x46\x52\x56\x41\x58\x47\xd4\x96\x69\x57\x73\x34\xde\xa8\x1b\x86\x5d\xcd\x73\xa1\x93\xff\xbe\x9a\xb2\xd4\x29\xaf\x7b\x09\x97\xd3\x69\x27\xc6\xfd\x72\xd4\x5c\xab\xe4\x4e\x47\x57\xff\x2b\xd8\x5f\xab\xed\x0d\x8e\x52\x3b\x87\x75\xb6\x7a\xae\x46\x8f\x59\xf5\x37\xb2\xc8\x98\x25\x48\x03\x7c\x3a\xb0\x77\x7b\x45\x3a\x5f\x14\x39\xef\x41\x75\x9b\x3c\xa0\xfa\xef\xee\xfc\x7c\x4d\xab\x4d\xd2\x64\xa0\xe6\x1b\x9c\xe6\xaf\xf6\xc4\x69\x88\x71\x1d\x9e\x6b\x27\x3c\xed\x5b\xf3\xff\x08\x21\x1c\x19\xd9\xfa\xe0\x84\x10\xee\xd9\xce\xb8\xb8\xdd\x44\x75\x72\xc5\xb7\x96\xdc\xd4\x4d\xd5\xb2\x28\x6a\xbb\xe7\x9f\x0d\xac\x23\xbc\xa1\x75\x84\x41\x77\x77\xc1\x64\x22\x3b\x19\x9b\xd6\xf6\xdd\x88\xef\xb8\x28\x7f\xaf\x30\xaa\xb6\x85\x79\x65\xcf\x81\x1e\xd9\x29\xa7\xd2\xcb\xf3\xb6\x4d\xd3\xf6\x34\x43\xf6\x73\x5f\x85\xce\x8a\x54\xdd\x7c\x50\x8a\x2f\x38\x04\x5f\x75\x0e\x63\x95\x59\xbc\x4e\x4c\x63\x9f\xed\x56\xf5\xc6\x2b\x4f\x09\xbf\x37\x44\x60\x1c\xe1\x9b\xad\xd7\x07\xb2\x33\x0f\xe4\x4c\x9f\xcd\x86\x3d\xe6\xdb\x8c\xea\x36\xac\xca\xa9\xfa\xaf\xef\x51\x0f\xbb\xcf\xdf\x76\x7d\xda\x16\xee\x22\xf9\xeb\xaf\xc1\x10\x8e\xc1\x37\xbd\xe8\xe1\x0b\xd8\x39\xe3\x17\x5d\xfd\xd0\x8e\x89\xa2\xdc\xb9\x43\xe6\x9a\x0c\x3a\x05\x1d\x39\x6e\x2f\x5a\x6f\x29\xcf\x1f\x2d\x16\x12\xe8\xd8\xb6\x7d\x37\xd3\x64\x68\x4b\xcc\x1f\x5d\x82\xdb\x35\xa6\xc9\xb7\x66\x85\x69\x73\xac\xae\x2f\xd5\xe6\x7f\x9b\x41\x7e\xf6\x93\xcd\x2d\x7b\x27\xc7\xff\xf0\x8e\xae\xec\x5e\x77\x6c\x33\x3a\xb1\xed\xc6\x88\xbe\x6a\x50\xd4\xed\xfd\x72\x7d\x07\xbe\x81\x66\x6e\x59\xc3\x2e\x15\xec\x77\xce\x18\x55\x23\xb5\x37\x65\xed\x4b\x79\xeb\x15\x8b\xb9\xb5\xed\x40\x6f\x6f\xd4\x9b\x8e\x59\xf1\x39\xed\x08\x27\x6d\x4d\xe5\xa5\x6e\x79\x73\x66\xa9\x05\x62\xf7\xd8\xb2\xcb\xf1\x0e\xfd\xab\x8e\xb6\x70\x66\xc0\xfd\x0d\x37\xd1\x91\xd9\xb9\x5b\x4b\x46\x26\xcf\x20\x15\x05\xa3\x54\xb4\xb2\x53\x1a\x34\xbc\xe4\x66\xcb\xc9\x29\x77\x29\x21\x98\x9b\x98\xff\x94\xed\xd4\xaf\x46\xf6\x53\xed\x99\xb3\x79\x5c\x01\x5c\x45\xa1\xc5\x6f\xb8\x25\x97\x86\x1b\xb9\x34\x1c\xe1\x52\x17\xf9\xa1\x65\x43\x77\x76\x3a\xb6\x47\x96\xed\xf9\x65\x77\x85\xdd\xd9\xfd\x95\xb0\x54\x9e\x79\x2f\x61\x78\x3f\xb8\xcd\xde\xc6\x75\x46\xfe\x43\xc6\x3f\x7e\x5b\x5c\x80\x43\xbd\x99\xb0\x25\x6b\x1e\x74\x34\x05\xeb\xca\x1c\x1c\xba\x35\x7f\xe3\x0c\xc6\xc5\xbe\x93\xa2\x6e\xb9\x39\x9f\x1a\xd3\x0f\x01\x6e\xbb\xb0\xec\xe4\x5f\x76\xf3\x37\x77\x7b\x70\xa3\x7a\xee\x77\xc6\x59\xdf\xa4\x5f\x2e\x0a\xc2\xd4\xc3\x94\x2e\x02\xbf\xfe\xba\xdb\xca\x37\x8e\x2d\x72\x5d\xc8\xad\xdc\x11\x68\x6a\x2e\xdd\x7c\x57\x61\xe8\xe9\xf5\x9b\xbb\x1f\xad\x5a\xa3\x5e\x4e\x7c\xbb\xfc\xce\x90\x86\x62\x0f\xa7\x3a\xcb\xb0\x33\xb0\xb7\x37\xed\xc9\xbb\x5b\xa8\xdd\xd0\xa7\x5d\x0d\x5d\xbe\x05\xfb\xea\x76\xd9\xb5\x14\x22\x77\x05\xe1\x70\xab\xbb\x0c\x35\x64\xb8\x6f\x7f\xf4\x8f\x63\xf7\xfb\xc3\xd8\x66\x68\xe9\x6f\xdf\xf9\xdd\xa6\x2f\x48\xca\xa5\xf6\xed\x68\xde\xcd\x38\x9b\x1f\xce\xe4\x01\xd6\x49\xf3\xb5\x62\x7c\xd2\x5d\xbd\x7d\xb5\xa3\x14\xfd\xa7\x1a\xaa\x0f\x72\x2d\x47\x6a\xae\x96\xc4\x66\x97\xaa\xd1\x7c\x87\x96\x47\x1b\xe4\x5c\xb4\xa5\x9c\x8b\x36\xca\xb9\x68\x40\xce\x35\xba\xa6\x93\xab\x89\x73\x33\x56\xf5\x72\xe1\x66\x52\xdf\x6b\x67\xb5\x68\x70\x56\x53\xfe\x82\xd5\x8a\x63\xec\x55\xb5\x29\x3d\x03\x6f\xf6\x54\x8f\xf6\x66\x60\x4f\x37\x5c\xfe\x6a\x1a\x27\x3f\x54\x23\x54\xac\xb5\x5e\xf7\xb6\xab\x45\x90\xba\x2e\xab\xdd\xe7\xc5\xad\x56\x34\xba\x47\x2b\x8a\xc8\x8d\x2c\x3d\xf6\x58\xf6\x61\x6f\x78\x0f\xda\x59\x25\x5c\xd5\x64\xca\x64\x3a\x69\x17\x16\x1f\x4b\x72\x76\xa6\x3c\x15\x34\x10\xa7\x2b\x03\xbf\xdf\x5d\x20\xea\xc1\x07\xbf\x37\xf7\xdd\x14\x9f\x2d\x88\x64\x6f\x09\xe8\xbc\xac\x8a\x72\x1f\xec\x99\xfa\xf6\x36\x4d\x4a\xce\x09\xc0\x6c\x8b\x65\xd7\x95\x36\xf5\xae\x6a\xc2\x65\xc3\x96\x5e\x07\x0f\x8a\xbc\x24\x1e\x36\x74\xaf\xb3\xfb\xef\x2c\xd0\x9a\x55\x88\x9b\x61\x47\x5a\x7d\x67\x74\xb8\x45\xcd\xcb\x57\x1f\xde\x19\x4c\x54\x5d\x2d\xae\x45\xf4\x74\x70\xc9\xd8\x28\xb4\x03\x8b\xad\xb7\x1d\x17\x38\xe6\x12\xd5\xc1\x9d\xcb\x6d\x76\xbb\xde\xdc\x6d\xee\xe4\xdd\x7d\x3b\x6d\x0c\x4e\xcc\x59\x56\x9d\x2d\xc8\xd2\x08\xa0\x3d\x03\x74\xaf\xcd\xd0\x98\x28\x34\x67\x5d\x06\xd1\x57\xb5\xfe\xd4\x31\x00\x68\x87\xe7\x5a\x40\xe4\x74\xbb\x13\x08\xed\x6d\xed\x4e\xcb\x58\x57\x07\xa1\x25\xa7\x32\xd4\xd9\xae\x84\xae\xd9\x1f\x6a\x2d\x81\xee\xd2\x9e\x6d\x8c\xd9\x8d\x96\x6e\x7c\xc4\xed\x50\x56\x4e\xe4\xda\x24\x9f\xde\xa8\xdb\x01\x84\x36\x88\xa7\x07\x44\xef\xea\x5d\x0b\xc8\x56\x62\x79\x0b\x38\x46\x99\xfc\x03\xc6\xc3\xb4\xe1\x1a\xe4\x74\xbd\x91\x34\x8a\xec\xff\xc2\x9e\xb7\x1b\x2e\xb7\xde\x75\x25\x95\x5e\x88\xad\xad\xe1\xb9\x5d\x2f\x18\x9f\xee\x86\xb4\x82\x71\xd9\xf3\x3b\xfd\xbb\x0b\x3b\x62\x71\x76\xa7\x7f\x7f\xe1\x5a\x80\xcc\x1d\x86\x9d\x61\xdc\x19\x3c\x9b\xdb\x01\x5c\x5a\x14\x8b\xd9\x9d\x35\x67\x76\xd7\x80\xd9\x3d\xe1\xbd\xe6\x24\xb2\x72\x68\x7b\x53\xf0\x9e\x98\x93\xe6\x5d\xf9\x62\xf2\x66\x8f\x93\x4a\x2d\x15\xe4\xdf\x07\x59\xde\xfc\x2c\xce\x6b\x27\xda\x7e\x2e\xb2\x9c\x93\x72\xef\xed\xf4\xce\xa5\xa3\xad\x38\xc6\x9c\x8d\x3e\xd2\x08\xab\x3d\xb5\xb4\xdc\x5b\x99\x94\xe1\x3c\x00\xf7\xc0\x04\x81\xfb\xfa\xb5\x4a\xf5\xcf\xb2\x9e\x04\xd3\xe9\x6c\x98\x3a\x76\x5d\x7b\xe6\x4a\xfb\xcb\xaa\x57\x55\xa9\x35\xbe\xe9\x5a\x82\xb9\xd9\x6a\xfa\x34\x04\x47\x68\x01\x05\x10\x0e\x0e\xab\x45\xb7\x42\xb6\x7a\xfd\x31\x55\x46\x21\x34\xe2\x0f\xae\x61\xba\xdd\x79\x9f\xd1\x33\x73\x9b\x7c\x31\x73\xfb\xa7\x31\x73\x6b\x40\x55\xe7\xa7\xdf\x2e\xc7\x8d\x68\x06\x3b\x1a\x84\xed\xc3\xbf\x96\xd9\xdb\x2e\xa8\x5d\x2d\xd4\x1a\x28\xa7\xd9\xf8\x40\x7b\xc1\x8e\x16\x24\xbb\xd0\xaf\x65\xff\xd6\x05\xb4\xab\x81\x5a\x0b\x83\x5c\xac\x19\x5b\x2f\xd9\xb1\xb3\x7d\xf8\xd7\x32\x80\xdb\x05\xb5\xab\x91\xda\xcf\x62\xb3\xd9\xbf\x01\x9b\xcd\xfe\xf5\x6c\x36\x07\x9f\xd1\x66\x73\x70\x53\x36\x9b\x83\x1b\xb0\xd9\x1c\x7e\x46\x1b\xc6\xe1\x4d\xd9\x30\x0e\x6f\xc0\x86\x71\x74\x1b\x36\x8c\xe3\xcf\x6f\xc3\xf8\xf6\xac\xff\x7e\x6e\x53\xc9\xcd\x21\xd0\xe7\xb4\x30\x8c\x3f\xbf\x3d\x66\xe4\x5d\xd9\x8a\xf1\x17\x43\xc6\x5f\x0c\x19\xdf\xb0\x21\xe3\x2f\x76\x8c\xbf\xd8\x31\xfe\x62\xc7\xf8\x8b\x1d\xe3\x2f\x76\x8c\x6f\xc1\x8e\xf1\x7a\xfb\xc5\x7a\x96\x55\xca\xee\xe3\xe6\xa6\xc7\x0b\x61\x94\xb5\xde\x1d\x26\x60\x0d\x8d\x64\x79\xcd\xcb\xb3\x62\xa1\x36\x8b\x7e\xd0\x1e\xf6\xd4\x1c\xdd\xba\x10\x1e\xcc\x31\x21\x33\x90\x3a\x6e\xf1\x09\x38\x04\xf7\x89\xb5\xb4\xf6\x3e\x05\x87\x20\x05\x0f\xc0\x7b\xe2\xb8\xb0\x76\x66\x82\x9e\x79\xac\xf7\x04\xdc\x97\x85\xee\x01\x6d\x70\x4c\x19\x42\x51\xf7\xa7\xb8\xac\xfd\x75\xc7\x16\xb3\x8e\x5a\xb5\x38\x9b\xdb\xeb\x50\xfa\xda\xee\x12\x3c\x04\xb8\x01\x64\xaf\xf7\xf4\x8c\x90\xaa\xb8\x09\xcf\xeb\x72\xd9\xf5\x17\x2d\x63\x24\xb5\xa9\x1f\xc6\x0c\xeb\xa7\x4f\xc6\x1d\xb5\x01\xf8\xea\xfc\xf4\x85\x78\xca\xaa\x1e\x4c\x1b\x3d\x59\x64\xf9\xfb\x6a\x06\x32\x56\x75\x60\x67\xac\x1a\xb7\x33\x9a\xf5\x8d\x8c\x36\x26\x87\x9b\xd6\x2a\xb0\x6f\x32\x66\x9c\xa8\xeb\x8b\x96\x9d\x56\xc9\xf9\xe7\x57\x75\x04\xcb\xd9\x2b\x3b\x73\xf6\x9a\xb8\x9a\x67\x52\x97\x5c\x79\x6e\xbf\x4e\xab\x65\x23\x24\x04\x70\x08\x9a\x76\xb6\xb6\xa5\xf4\x74\x6a\xee\xde\xc9\xea\xde\xc8\x4c\x73\x1d\xfd\xb6\x6b\xdf\xb6\xb5\xb5\x6c\x06\xbc\x2d\x3c\x05\xf7\x76\x45\xc7\x91\x9d\x77\xd7\xa0\x43\xe7\xb9\x05\x74\xe8\x49\x76\x05\x1d\x3a\x7a\x13\x3a\xda\xc2\x5b\xa3\x83\x54\x94\xe7\x2c\xcb\xdf\x75\x18\xaa\x8d\x75\x98\xda\xfa\x08\x9f\x2f\xc1\x03\x90\xce\x1d\x8b\xad\x15\x27\x25\x3d\xd1\x38\xaa\x1e\xe5\x86\x78\x3a\x4c\x30\x92\xa5\x65\x88\x56\x70\xb4\x83\x5a\x35\xb6\xda\xda\xf8\x67\xb2\x40\x27\xbe\xed\xf5\x50\xbc\x9b\x7f\xd4\xbc\xa3\x6a\xc5\x5a\x03\x8f\xab\xa3\xe6\x3a\xc0\x77\x48\x56\x4d\xd8\x99\x63\x27\xdc\x69\x9e\xb6\x65\xe6\x0c\x68\x73\xe3\xde\x69\xab\xce\x94\x4d\x3b\xc6\x85\x9a\x4a\xac\x92\xd8\xab\xc4\xc1\x99\x53\x89\xd1\x7d\x0f\x3a\x99\x06\x2b\xe9\x1a\x9e\xfa\xdd\x85\xb7\xef\x7e\xcc\x5c\x20\xfb\xee\xc7\xcc\xed\xc3\xbe\xfb\x31\x73\x51\xb0\xdf\x19\xae\xcb\x96\x86\xce\xd5\x99\x89\xb2\x0b\xff\x42\x18\x3a\x71\x09\x68\x28\xdd\xf0\x23\x3d\x2f\x9f\x37\x92\x7f\x95\x22\x4c\xf2\xdc\x89\x5d\x43\x0a\xee\x70\x6d\x22\x88\x46\x63\x57\x8c\xea\x94\x7c\x93\xbd\x75\xc9\xa3\x59\xe5\x74\x46\x7b\x6e\x1d\x05\x34\x36\x96\x6d\x4b\x1b\x3b\xfd\xb3\x4e\xd6\xf6\xb6\xdb\x1a\x64\x74\x08\x4b\x0f\xac\x45\xb1\x6d\x9d\xd4\x19\x7a\xe2\xae\x89\x57\x4f\x8c\x67\xf6\x4e\x95\x9c\x36\x7f\x6d\x6d\x57\xda\xf7\x4b\x95\xeb\xc4\xa0\xb9\x1d\xb9\x30\x9c\xa6\x52\xd4\x47\x63\x55\xbb\xd6\x35\xaa\xec\xbd\x97\x2b\x6a\x36\xed\xbd\x5c\xd1\xa6\x1c\x2b\xbd\x47\xb7\x49\x72\x98\x97\x2b\xae\x60\xec\x5c\x17\x33\x15\x58\x41\xdc\xbe\x19\x50\xca\x60\x83\xfb\x81\x59\xda\x58\xe2\x76\x88\x7c\x3a\x1b\x9a\xcd\x4d\x3e\x87\xe4\xa7\xcd\x45\x2f\xfb\xd0\x43\x0f\x47\x63\x55\x7d\x9c\xfc\x4a\xce\x37\xd2\x5d\xee\x4c\x0f\x1d\x39\xa4\x9f\x67\xb9\xc2\xa0\x6f\x32\x6f\x0d\xe5\x38\xe6\x3a\x2e\x8d\x89\x57\x59\xd9\x29\xb9\xb0\xfe\x23\xae\x7e\x22\x30\x99\x1a\xe0\xbd\x01\xef\x69\x34\x5a\xa5\x52\xb8\xd2\x18\xb2\xbf\x8d\xf9\xcf\xa6\x0d\x7f\x3d\x04\xc8\xc5\x84\xba\xbc\x61\x1f\xaf\x4f\xac\xa9\x57\x87\x6c\x1f\x36\xed\xd7\x3d\x6b\x6d\xc5\x19\xb4\x1f\x0f\xe0\xfd\x38\x6b\xcd\xc1\x65\xae\x31\x38\x55\xd0\xc5\xfe\x71\xf6\xb6\xfb\xba\x42\xa5\xce\x57\x85\x88\x7b\x05\xf9\xd8\x79\x44\x76\xd8\x6b\x5f\xfb\x84\x56\xe7\x52\x86\xda\x9d\xfc\xf7\x9c\x2e\x1f\x74\x72\x32\x6b\x43\xc3\x49\x5b\x15\xec\xb2\xd5\xfb\x40\x8f\x89\xad\x79\xbf\x1d\x63\x47\x20\xbf\xe3\xb5\x8a\x1b\x90\x16\x4d\xbc\x1a\x5c\xc7\x08\xb4\xe5\xd9\xb5\x93\xed\x35\x49\x5c\x57\xf2\xa6\xc5\xc9\x5b\xd7\x78\x59\x3f\xcd\xb1\xf6\xda\xd8\xe9\xeb\xe7\xd1\x93\x61\x43\xfe\x2e\xc2\x74\xe6\xfe\x2c\xf5\xfa\x85\xe8\x63\xa5\x93\x30\x61\x16\x41\xf6\x5a\xaa\x79\x01\x48\x18\x53\x77\x9d\x94\xe0\x68\xf1\xb6\x6c\x1e\x95\x5d\xf1\x7c\x71\x32\x6d\xab\xea\xc9\x55\x25\x6b\x7b\x6c\x36\x69\xac\x2e\xeb\x64\xfb\xb6\xd0\x58\x47\x71\x9a\x28\x19\xe7\xea\x67\xbb\x93\xa9\x86\x3b\x6b\x74\x4f\x23\xf0\x7a\x12\x8f\x69\x72\x70\x24\x4b\xdb\x0b\x4b\x18\x0c\xfc\xa5\x65\x0d\xc0\x5a\xea\x18\x26\xaa\x06\xc0\x1b\xf6\x76\x2d\x71\x75\xc8\xcb\x2d\xf5\xc6\x61\x65\xb3\x6e\x3c\x04\xd9\x81\x1b\xc3\xac\x2d\x9a\xc6\x09\xc7\xd2\x3c\xfc\x1b\x62\x36\xad\x54\x76\x47\x45\xc6\xf5\x06\xa5\x33\x59\xc9\xf4\x19\xf8\x1d\xb0\xe5\x7e\x57\x7f\x9f\x36\x95\xf5\x7c\x73\x18\xbe\x2b\x16\x1f\xf8\xe3\x62\xb1\xc8\xaa\xac\xc8\x3b\x8a\xd3\x4a\xe2\x06\xea\xd4\xcd\xdb\x80\xe5\xad\xf8\xb7\xea\x60\x38\x73\x56\x39\x79\xa3\x0c\x74\x5e\x10\x3f\x7c\x08\x5e\x15\x65\x0d\xd2\xa5\xb2\x90\xa8\x91\x5c\x08\xa0\x5f\x2b\xea\x02\x55\x51\xd6\x93\x76\x7d\x32\x75\xac\x88\x2e\x61\x6b\xcd\xb5\x69\xff\x3f\xf4\x49\xc4\x3f\xc0\x5f\x40\x7e\x00\xfe\x31\x42\x08\x0a\xf6\x9b\x7f\xbc\x75\x9f\x44\xa9\xd1\x5e\x42\x33\x9f\x38\x96\x87\xa4\x18\x62\xcb\xae\xf1\xe2\x86\x66\xee\x1f\x02\xb6\x5c\x79\x59\xa2\x9a\xb6\xb2\x1b\x71\xdf\xc5\x7b\x47\x48\xa9\xfc\xd6\x8e\xfa\x6a\xae\x76\x16\x93\xdd\xcb\x25\x03\x1f\xc8\xdf\x7f\xd5\xf6\x4c\xff\xf1\xe0\xc1\xc0\x9c\x85\x9b\x7e\x1e\x77\x3b\x7a\xac\x7a\xaa\xf3\xa8\xf6\x99\x9f\xfd\x16\x82\x07\x60\x09\x3b\x58\x38\x5e\x45\x43\x03\xe6\xc1\xa1\x04\xdc\x3e\x29\x56\x5d\xb2\xa9\xa3\xa6\x8e\xd3\x92\x93\xf7\x03\x36\xc3\x1c\x5a\x5f\x90\x8b\x67\x5c\xd4\x47\xc5\x4b\xf3\xd0\xc6\x21\xf5\x6e\x9a\xd1\x3d\x1c\x7a\x37\x1a\x1b\x59\x9c\x9d\x90\x61\x42\x5f\x2b\x94\xb2\x8e\x50\xda\x8a\xe4\x07\xa8\xd1\x72\x53\x87\x03\x14\x85\x2a\x4e\xda\x4c\xa3\xce\x08\x38\x0a\xdf\x33\x67\x11\xeb\x8e\x48\xbb\x76\x7e\x75\x7e\xaa\x8d\x60\xf7\x35\xd8\x3e\x14\xe7\x25\xb8\xb2\xf2\x65\x37\x85\x9c\xf2\x9b\x36\x8b\x36\x80\x94\x14\xe7\x82\x7d\xd8\x36\xb1\xe9\x9f\xcb\x53\x93\x25\x78\xd0\xdd\xe7\x93\x12\x51\x8d\xe3\x08\xb5\x34\xc4\xa2\x48\xe1\xa8\x90\x74\xb1\x42\x2c\x4e\xda\x95\x89\xa5\x4f\x1e\x9a\x0b\x33\xc3\x84\x59\xcb\x83\x7f\x2c\x71\xb8\x5b\x0b\xc3\xc4\xa1\x73\xac\x27\x0e\x77\x71\x73\x35\xe2\x18\xda\x3a\xdb\x00\x72\x95\x38\x9a\x26\xde\x20\x71\x34\x2a\x9b\xdd\x22\x5a\x55\xe6\x54\x8a\xdb\xf4\x75\x93\xe3\x4e\x7a\x6d\xc3\xa0\xcb\x76\xee\x52\x63\xb2\x74\x2c\xe8\xaf\x8c\xa3\x9a\x04\x5b\xad\xa2\xdd\xa3\x03\xce\x9b\x7c\xbb\x79\x58\xbd\x21\x6f\xed\x06\xa2\xda\xbb\x73\x52\x52\x27\xe5\xc0\x59\xa3\x82\x15\xfe\xdd\xa1\x4e\xb3\x87\x3b\x50\x67\x93\xd2\xd6\x39\xc8\x0a\xf5\xb3\xd6\x27\xc4\x2a\x1d\x6b\xb6\x90\x79\x06\xf8\xa2\xb3\x59\xd7\x07\xf0\xe6\x1f\x6f\xbb\x9c\xe2\xea\x65\xc0\xec\x65\xcc\xd5\x98\x54\xce\x14\x56\x29\x6a\x53\x69\x6c\xd8\x52\xbd\x33\x31\x63\xdd\x85\xca\xe9\xc2\xaa\x9c\x3e\x50\x19\xff\xa2\x72\xa9\xdf\x2b\xab\xcd\xd5\x7e\x38\x50\xde\x1c\xff\x03\xf7\x7a\x72\xdc\xef\xca\xb1\xde\x37\x94\x7d\xa9\x9d\xbe\xd4\xaa\x2f\xc7\x23\x9d\x71\x67\x5c\x63\xc1\xe2\x3b\x6d\x42\xa3\xef\x00\x53\x46\x6b\x8b\xe3\x8e\x07\x4c\x63\x6d\x43\xc6\x76\x6c\x6d\x7c\x74\xcc\xcc\xe1\xee\xd3\xd9\x13\xd7\xb4\x1c\xee\x3d\x9a\xcd\x6a\xae\xaf\x33\x57\x4d\x86\x36\x6a\xe6\xa8\xe8\xbf\x76\x2a\x68\x62\xdc\x2c\x56\x99\x71\x33\x39\xca\x95\xa5\x1d\x25\xac\x49\x4d\x7a\x3b\x59\xc7\xbd\x4d\xb4\xce\xde\x99\xb6\xd8\xb1\xb2\x77\x66\x6b\x37\xbb\x60\x1d\x10\x73\x19\xd9\x40\x67\xce\x82\x7b\x75\x9d\x6d\x9b\x97\xf3\x8f\x56\x64\xed\xb2\xec\x34\x0f\x0a\xaf\xb8\x2a\x68\xda\xa8\xc4\xaa\xba\xa3\xd1\x97\x84\xfa\xd6\xc6\xa1\x33\x5a\x1d\xf1\xb7\x79\xc2\xb5\x1d\x33\x73\x2e\xb8\x77\x08\xe0\x3c\x49\xda\xdd\xbd\x5d\xda\x0c\xb6\x50\x0b\x7b\x15\x5f\xa3\x42\x23\x09\x06\x67\x10\x5b\x4b\xe7\x49\xe7\xef\x7a\xea\xb6\x7b\x32\x0b\xbd\x7d\xde\x0c\x71\x77\x43\x66\xf8\x14\xd7\xdd\x9a\x19\xc8\x31\xe1\x8b\x99\x3a\x69\x6f\x3d\x15\xe9\x33\xf5\xc3\x43\xb0\x27\x2b\xdf\xeb\x3b\x31\x04\x17\xfb\x80\x2f\x94\xdd\x09\xbe\x70\xec\x4d\x80\xa5\x8a\x5f\xea\xf8\xd6\xae\x84\xf1\x4b\xe8\xf6\x4a\xc1\xbb\xd8\x07\x13\xbe\x30\x02\xeb\xef\xba\x94\x96\xc2\x7f\x9f\xb6\x06\x2c\x96\x6e\xae\xd7\x6e\xae\xd7\x53\x63\xb5\xa2\x8b\x85\x9f\xb5\x15\x82\x31\x14\xf4\x93\x9b\xfe\x37\xc6\x22\x5c\x07\x92\xd6\xec\x05\x5f\xcc\xcd\x47\xb3\xeb\xb8\x1e\x4b\x8d\x1d\x8c\xc6\x3a\x02\x5f\x34\x72\x66\x4b\xdb\x17\x43\x17\xf6\x36\x58\x9f\x30\xb5\x0d\x1b\xbe\xd8\xda\xec\xc5\x75\x2a\x36\x8f\x6e\x8c\x47\xca\xb7\xd6\x1d\x98\xf6\x80\xa5\xf2\xd8\xa3\xb0\xaf\xbf\xb6\xc8\x99\x77\x8f\x40\x9c\x63\x3e\xfd\x08\xf9\x73\xb6\x78\x6e\xef\x73\xb9\x18\x5b\x39\x71\xbd\x85\x76\xd8\x4b\x83\xdd\x76\x5c\x8d\xa6\x1c\xac\xdd\x07\x7b\xe0\x81\x36\x54\xda\x74\xe1\x8f\x27\x84\x56\x06\xbc\x79\xdb\x72\xed\x2b\x92\x6b\x77\x2b\xdb\x5b\x64\xb9\xaa\xef\x9a\x2b\xbb\xae\xd1\x6d\x5a\xe3\xb9\x46\x67\x98\x9c\xb9\xa6\x26\x87\x1d\xd2\xe8\x9c\xd3\x8e\x47\x9b\x6d\xbd\xbe\xe8\xb2\xdb\x38\x7b\x31\xb5\x68\x5f\x2f\xa6\xf8\x99\x35\x7c\xa8\x5b\xb7\x9d\x4f\x97\x33\xc7\x1e\xa4\x6b\x1f\x6e\xd8\x73\x8b\xc5\xd3\xed\x39\x6e\xf9\xb0\xd9\xb1\x47\xc7\xa0\xdb\x8a\x3d\xb7\xae\x91\x96\x8d\x36\x5a\x06\x4c\xb4\x9c\x92\xd2\x35\xdb\x3e\xd7\xdf\x1d\x43\x53\x1d\x9d\x54\xe7\x5a\x55\x4a\x57\x14\x53\x9d\x71\x45\x33\x1d\xd0\x4e\xdb\x9c\x56\x81\x73\xf3\xf6\xec\x94\xad\x98\x29\x1b\x71\x7e\xa3\x7e\x7c\xfa\x04\xda\x24\x8d\x2b\x99\xa6\x7f\x75\x12\x0d\xa2\x64\xaa\xf9\xf9\xe9\xd3\x16\xef\x18\x47\x98\x38\x55\x4c\x5c\x9d\x90\xc5\xa2\xf8\xf8\xe4\x9f\xe7\x64\xa1\x39\xb9\xad\xcf\xa0\xd9\xa0\x7f\xda\x6d\x8c\x83\x71\xd9\x20\xe7\xb3\x93\xad\x45\xb7\xba\xbb\xd8\x7c\xad\x64\xb2\xb8\xb6\xd9\xec\x77\x37\xa3\x41\xb4\xca\xe4\xaa\x0f\x46\xa7\xdf\xca\x63\x90\x63\x7f\xf3\x46\x7c\x07\x55\x5a\x9c\xf6\x5c\x07\x9d\x91\x92\x9c\x82\xd6\x75\x90\xe6\xa0\x23\xe5\xbf\xb6\xe6\x55\xad\x23\x9a\xec\x7f\x8c\xa7\xa1\xb3\x55\x56\x37\xbc\xbc\x9e\x95\x37\x71\xf2\x46\x46\xde\x8a\x8f\xb7\x65\xe3\xad\xb9\x78\x85\x89\x87\xac\xc6\x5a\xa8\xf6\xfc\x7a\x62\x1a\xfd\xf5\xd7\xa6\xf9\xf3\x05\x17\x8a\xf5\xe0\x74\x30\xb9\xb4\xac\xd9\x75\x6c\x60\xc0\x37\x56\xdb\xdb\xe3\xbf\x15\x08\x75\x71\xb6\x06\x7e\x5a\xd4\x75\x71\x6a\x2b\x70\xa5\x74\x77\x73\xc0\xdd\x13\x70\x8c\x5d\x2a\xab\x2d\xdd\x81\xb5\x66\xac\x1d\x04\xb4\x89\x8d\x05\x6b\xb7\xfd\x8e\x79\xcb\x66\x78\xf6\x9d\xdf\xce\x8a\x7b\xbf\xfd\xd9\x59\x9f\xed\xbb\x1f\x96\x0d\x3b\x66\x80\x9a\x3b\x2c\x4e\x4f\xf4\x0e\x40\x7f\x88\x57\x72\xe5\xcd\xc5\x22\x30\xe4\x46\x4b\xdb\x65\x33\x06\x82\xb4\xfd\xbd\xbe\xd1\x36\x93\x78\xb4\x3c\xe3\xfd\x0c\x9b\x7c\xda\x98\x35\xa4\x39\x7d\x35\x8b\x48\xf5\xc7\x76\xf3\xc6\xdd\x71\xb5\xab\xaa\xdd\x5c\x1c\x75\x7d\x72\xe1\xed\x9d\x72\xdd\x8c\x8b\xa3\xc1\x07\x59\xff\x36\x3e\x8e\x7a\xd4\xc4\x17\xab\xe6\x2c\x3b\xd4\xa4\x06\xca\x15\x7a\x43\x6e\xbd\x9a\xf4\x9b\x72\xdd\xe5\x92\xc8\x4d\xbb\xef\x1a\x82\x7d\xe3\x2e\xbc\x36\xd0\xf8\xb8\xdb\xa0\x41\x37\x5e\xde\xf6\x6e\xbc\xbc\x2f\x34\x3e\x22\xf3\xae\x48\xa4\x9b\x7d\x75\x5d\x8f\x48\xd7\xfb\xeb\xba\x12\x91\x6a\x63\x70\xcf\xb2\xfc\xfd\x46\xb7\x08\x36\xd3\xa4\x38\xd3\x0f\x6a\xce\xae\xe2\x0e\x61\xe5\x59\xfb\xaa\x3b\x04\x0d\xf7\x6a\xde\x10\x86\xc0\x76\x6c\x99\x76\x1b\x7b\xa3\x8e\x10\xc6\xdb\xab\x53\x26\x67\xc3\x2e\x10\xda\x8d\xa8\xbf\x37\xca\x9a\xf9\xee\x98\x63\x34\x7b\x93\xdd\x2c\xaf\x57\xb3\x3c\x2e\xf2\xba\x2c\x16\x7d\x60\x36\xba\x63\x92\x50\x6f\x84\x36\x39\xcd\xf7\x6a\x96\xd7\xbd\x2c\xaf\x57\xb3\xac\x54\xdb\x8d\xee\x6b\x38\x5d\x2d\xb6\x89\xb9\x9a\xc5\x50\x2d\xf3\xc0\x9b\x3d\x83\x2f\x65\x1a\x54\xe3\xa5\xfd\x69\x5b\x20\x63\x4c\x07\xdb\x9f\xaf\xdb\x9f\x6e\xbe\xa6\x3d\xae\x5d\xd1\xdd\xa8\xaf\x63\x9e\x72\xef\x8c\x28\xbb\xa6\x03\x0e\x27\x06\x8d\xff\xeb\x45\xd6\x03\xd9\x1c\xc7\x1a\x28\xdb\x07\x7b\xff\x5f\xde\x22\xea\xa7\x3d\x70\x1f\xb4\x3b\xdc\x7b\xb3\xf6\xfb\xb5\xfc\x76\xf3\x3e\x6e\xd3\x9a\x11\x1b\x28\xe2\xec\xe9\xad\x64\xb3\x24\xd1\xcd\x36\x98\xde\xd6\xec\x34\xdf\xb8\xd6\xc8\x8b\x9c\x0f\xba\xd6\xf0\x3c\x6f\x25\xde\xe8\xd4\x03\x74\xa2\xd3\x5f\x9c\x11\x9a\xd5\x52\x84\xc1\x39\x76\x1c\x73\xec\x3a\x3f\x5d\xc5\x00\xec\x46\x9f\x1f\xea\x18\x65\xa3\x30\xed\x5c\x76\xe8\xef\x44\x6d\x70\x1e\x38\xee\xb9\x40\xc2\x7c\x7c\x5e\x7e\x20\xf5\x79\xc9\x1d\x9f\x01\x9d\xf8\x95\x02\x8d\x27\x11\x37\xfb\x9a\xbd\x29\xdf\x2c\x6a\x7b\x9a\xc2\x99\xba\x5b\xdc\x59\xdc\xb9\x6b\xc3\x85\xbe\x0e\xd3\x5f\x5f\xde\x24\xc3\x35\x4d\xbe\x9a\x9d\x8a\x0d\xbe\x3c\x36\xf1\x6a\xb5\x37\xeb\xfb\xfb\xe8\xa4\xba\xd6\x6e\xc7\xae\x68\x76\x1c\xbf\x80\xce\x3c\xf1\xd2\x58\xdc\x7d\x6d\x0e\xe5\xe7\xd5\x8a\x43\x35\xcd\x83\x2b\x19\xeb\x95\x8c\xae\x2c\x6e\x0e\xe2\x07\x6b\x6d\x6e\xf8\x74\x1f\xc7\x75\xb3\x36\xcf\x51\x9c\xac\xcd\xc3\xb1\x21\xa8\x7f\x6f\x9e\xb3\xab\xb3\x3e\xf3\x93\xc9\xdf\x92\x20\x86\xe1\xff\xbd\x79\x24\x33\x1f\xcb\xd8\x79\x1f\x2a\xe7\x6b\x70\x38\xf6\x66\xd4\x4e\xb6\x16\xf8\x74\xb8\xa5\xce\x04\xb7\x02\x7c\xd2\x61\xa7\x15\x00\x2b\x33\xe4\x2a\x00\x04\x1e\x80\xf5\x40\x5a\x05\xc0\x20\x69\xd9\xe0\xab\x1d\xe7\xfb\xce\x80\x3e\x04\x58\x4a\xe3\xe2\x6c\xb8\x39\xaf\x5b\x24\x2e\x1b\xa9\xbd\x11\x52\x0f\x94\xcc\xb3\xea\x4a\xa8\x43\x63\x06\xbd\xf6\xdc\xa8\xc5\xb3\x7d\x87\xd5\xf3\x00\x66\xfa\x69\xf3\xbf\xb6\xf9\x5f\xdb\xfc\xaf\x87\xf2\x5b\xe4\xee\xf7\xbe\x67\x3d\xe4\xef\x83\x71\xbd\x04\xf4\xd1\xb9\xdf\x8f\x98\xf5\xd1\xb4\xdf\x8f\xe8\xc2\x6b\x50\x38\x38\x75\x81\xd6\x4f\x4a\xd6\x8d\x6d\xce\xde\x06\x6f\x66\xeb\x46\xd9\xc6\xd9\x36\xd9\xa6\xb8\x56\xb5\x3f\xff\x1c\xe8\x4c\x17\xd3\x15\x92\x55\x2e\xf0\xaa\x9e\xb7\xd2\x15\x9b\x9f\xda\x25\xde\xb0\xc7\x52\x9d\x38\x6b\xe9\xcc\x28\x67\xff\x3f\x7b\xd7\xd6\xdb\x36\x8e\x85\xdf\xfd\x2b\xce\x3e\xb4\x8e\x9b\xac\xe3\xf8\x92\x7a\xdd\xcd\x16\x49\x11\x2c\x0a\xcc\xb4\x45\x9a\x19\xcc\x4c\x11\xd8\xac\xc5\xc4\x44\x6d\xc9\x90\xe4\x24\x9e\x20\xff\x7d\x20\x5e\x24\x4a\x22\xa9\xab\x33\x4e\xc6\x2f\x81\x22\x8b\x87\x3c\xe4\xe1\xe1\xc7\xc3\xcb\xd7\x6c\x1d\x68\xa7\x53\x2a\x91\x12\x7f\xa9\x5e\xa4\x5c\x6d\x31\x4b\xaf\x73\x20\x82\x7a\x07\x23\x88\x5d\x4d\xce\x47\x1d\xaa\x0e\xec\x03\x09\x9a\x9f\x35\x42\xa2\xbe\x62\x3c\x84\xe1\x54\x4e\x6a\x4c\xa9\x7e\x74\x3c\x7b\xaa\xbb\xc2\x75\x94\x67\x99\xd3\x49\xf1\xd1\x6e\x3a\x59\x71\x3a\x59\x83\xad\x16\xbc\x0a\x2b\x2f\xa5\x9e\x09\x35\xd9\x11\x2d\x1e\x48\xec\x7b\x9d\xce\x70\x78\x9d\xfc\x41\xc6\xfa\x43\x09\xeb\x2f\x73\x13\xf0\x99\xc1\x38\xbb\x9a\x5f\x87\xc2\x95\xd4\x7b\x59\xcc\x4f\x81\xb0\x24\xa8\x1e\xd0\x70\xbd\x01\x54\x0f\x76\xa0\x5a\x36\x0f\x3d\xa8\x66\xbf\xca\xa0\x5a\x75\xca\xd7\x4e\xb2\x29\x8a\x1a\x13\x87\x16\xd3\xac\xc5\xe1\x59\xab\x14\x6c\x0e\x4f\x3a\xb6\xad\x54\xaa\xe8\x88\x96\x02\x4b\xdb\xa5\xb9\x17\xab\x8c\xd2\x92\xfd\xb5\x92\x54\xb2\xf7\x23\x10\x20\x3a\xae\xc9\x7a\x04\x6b\x06\xfb\xe2\xef\xf9\xba\x59\x52\x71\xb1\x62\x66\xad\x0b\x21\x9c\xa0\x68\xf2\xc0\x5b\x01\x44\xf4\x4c\x20\xa2\x17\x63\x40\xe4\xdb\xe9\x32\x41\x44\xcf\x04\x22\x94\x22\x5f\x0c\x88\xa0\xea\x64\x83\x08\x99\xd0\x91\x0e\xe0\x92\xad\x29\xb9\xde\xcb\x81\x88\xaa\xac\x7c\x7a\xd6\xb8\xd4\xc2\xc7\xb1\x92\xbf\xa8\x0e\x72\xb9\xe4\x8e\x99\xe3\x3a\x98\xfd\xb6\x6a\x85\xa5\x34\xb5\xdf\xa6\x18\xf5\x78\xd7\x49\x92\xea\xf1\xd7\xc6\x25\x4b\x4d\x9a\xe0\xa7\xcd\xf3\xf1\x89\x72\xbf\xd7\xed\xa8\x8e\xeb\x91\x2e\x7d\x0b\x46\x86\x8b\xb7\xd4\xbc\x7b\x8a\xac\x53\x3b\x99\xb3\xf2\x95\x76\x38\x17\xe3\xa1\xcb\x04\xdb\x3b\x1e\xba\xac\x3e\xbf\x23\xa2\xdb\x3a\x22\x3a\xe6\x41\xba\x5a\xcf\x16\xee\xf6\x61\xdf\x19\x36\xfa\xf0\x0f\xe2\x7b\x7c\x6e\x8b\x70\xdd\xd5\xb0\xd6\xb1\x91\x69\x44\x55\xb2\x3b\xf5\xdd\xda\xcf\x9d\xec\xae\x10\x1c\x2c\x7a\xd7\xf7\xa6\xc9\xee\xca\xda\x62\x3e\x32\xbb\xd8\xea\x73\x44\x62\xa7\x58\x45\xd3\x7c\x29\x4f\xf1\xc3\x2f\xaa\x32\xe3\xb1\x4d\xea\x66\x62\xbc\x7e\x41\x62\x3c\x26\x53\xc3\x8b\x17\x6b\xa5\xc2\x55\x3d\xa5\x55\xfd\xe5\xe2\xfc\xeb\xf9\xa7\xcb\xd3\xcb\x8f\x9f\x3f\x8d\x4f\x2f\x2f\x2f\x3e\x9e\xfd\x72\x79\xfe\x95\x07\x71\x8a\xca\x64\x46\x75\xfe\xeb\xf9\xa7\xcb\x94\xb0\x87\x46\x3e\x76\x33\x35\x25\x40\x5e\xa2\x2b\x6d\xea\x6c\x8e\x2f\x6d\xd2\x6c\x8e\x2f\x6d\xd2\x42\xec\x66\x2f\x54\xf3\x4c\xea\xc6\xac\xec\x73\x51\x37\xe6\x10\x92\x45\xdd\xa8\xaf\xc1\x19\x5a\x8a\x8d\x61\x7c\x9b\x6b\x09\x29\x21\x01\x24\x88\xdd\xb1\x65\x85\x18\xf9\xda\x72\x69\x01\xe1\xa2\x51\xa5\x1a\x85\x70\xcd\xac\x06\x41\x1c\x1b\x97\x96\xc3\xfc\x72\xab\xd5\x60\x3b\xaa\x1b\x10\xdf\x77\x5d\xa9\x7c\xd2\xbe\xee\x4a\x72\x62\x4b\xbc\x15\x65\xc9\x7b\xd0\x2b\x08\xe2\xda\xfd\x0d\x8e\x89\xd3\x99\x96\xc9\x38\x07\x77\x68\x0e\xcf\x14\xb4\xc6\x3f\x4f\xef\x3c\x14\xb4\x59\x65\xcf\x4b\x78\x9a\x35\x28\xe5\x24\xbf\xdc\x50\x43\x54\x70\xa6\x76\x16\xf9\xa5\x31\x25\x33\x3f\xb6\x46\x53\x79\x44\xf2\x9d\x65\x65\xef\xeb\xd6\x30\xbc\x02\xb0\x33\x3a\x95\xc5\xcc\xf1\x75\x95\xb2\x50\xff\xdf\x78\x6c\x19\xf9\x1b\x63\x43\xc3\x51\x27\xe1\xe3\xf9\x0b\x01\x56\x9b\x36\x9d\xee\x6b\x68\x1f\x13\x3e\xbd\xd3\x1e\x24\xbd\x73\xaf\x2b\x37\xf7\x03\x6b\xb1\xc1\x81\xa8\xf5\xc1\x41\x58\x73\x83\x03\xae\xfd\x00\x1e\x43\x52\xc4\xba\x38\x11\xa3\x23\xc2\x71\x4a\xc4\x41\xc7\x44\x89\xc8\xe5\xe8\x69\x10\x6f\x91\x0b\xdf\x91\x87\x3f\x52\x8d\xd9\xfd\x22\x2a\x4a\xa1\x4e\x97\xcf\xb0\x82\x8f\xd9\x55\x4d\x6a\xba\xbf\x23\x5e\xc4\x06\xbc\x81\xcb\x19\xf1\x60\x81\xfd\x99\x63\x01\xf1\x60\x4e\x7e\x60\x98\x8c\xdb\xde\x6a\x31\x01\x7c\x3f\xc5\x4b\x1f\xfc\x19\xf2\x81\xf8\x80\xa6\xc1\xbf\x1e\x4c\x08\x2f\xc8\x04\xee\x66\x64\x3a\x03\xe2\x05\x92\x88\x7d\xeb\xfc\xc0\x16\x3d\xc0\x88\xd1\x74\x06\xdc\x97\x02\xb1\x61\x42\x3d\xc1\x04\x7c\x07\x6e\xd8\xbe\x30\x2c\x5d\xff\xe7\x3b\xf0\x1d\x83\xb7\x5a\x2c\xb0\xd5\x66\x85\xc2\x20\x32\x09\x4a\x25\x44\xdf\x11\x7f\x06\x8e\x8d\x43\x3e\x98\x11\xec\x51\x11\xad\x20\x19\x65\x4c\x60\xfc\x36\xf4\x71\x81\x03\x6b\xfd\x7c\x0d\x63\xf6\x0b\xb1\xa7\x18\xfa\xed\x4e\xbb\x43\xff\x9f\x22\x1f\xdf\x38\xee\x9a\xde\x0f\xdc\x88\x0e\x57\x3e\x9c\x06\x65\x7d\x04\x5a\x64\x5a\x14\xf6\xe4\x3b\xa2\x4c\xe0\xdc\x62\xb7\x2d\x27\x11\x3b\x0c\x1e\xe1\x9b\x28\xf7\xc9\xb8\x4d\x2c\x6c\xfb\xc4\x5f\x5f\x25\x14\xe2\xda\x50\x4e\x0d\x56\x47\x4c\x98\xcb\xcf\x85\x3e\xb0\x7e\xf6\x18\x1e\x14\xa5\xe7\x41\x57\x0b\xf6\x15\xbe\x47\x8b\xe5\x1c\x73\x85\x03\xe3\x60\x63\x06\xbd\x01\xfd\x01\x9a\x76\x73\x04\x7d\x1a\x24\x65\xcf\x5d\xe9\x79\x28\x3d\x1f\xb3\xf3\xfc\x54\x0a\x6d\xf0\xb3\xf5\x1e\x97\x14\x1d\xbb\xd8\x73\x5a\xf0\x10\x6e\x8c\x68\xdb\xef\x58\x24\xf6\x0d\x1c\x1e\xc2\xc9\xff\xa0\xdb\xe1\x02\x0e\x0f\xa9\x8e\x93\x31\x9d\x40\x63\xd7\x5f\x4f\x22\x85\xbd\x99\xe3\xfa\x33\x64\xb3\xc6\x4d\xe5\xd5\xb4\x9b\x29\x99\x87\x11\xe5\x09\xfb\x9a\x81\xfb\x50\x66\xec\xba\x7a\xf6\x23\xbc\x7e\xcd\x5a\x4a\x5c\x81\x46\xfb\xc2\x7b\xd1\x1b\x84\x04\xb9\x27\xed\x09\x71\x07\xd0\x6d\xb1\xef\x47\x94\xec\xa1\xd1\x60\xbd\xb3\xcd\x3b\x27\x65\xe8\x58\x9c\xad\xdf\x35\x52\x7d\xfb\x28\x47\xdf\xa6\xdd\x38\xec\x70\x98\x96\x01\x48\xd0\x8a\x0b\x11\x0f\x04\xe7\x3a\xec\x77\xc8\xb6\xf8\xf3\xd9\x7a\x42\x8d\xde\x59\xf9\xe0\xad\x96\xd4\x09\x5d\x3b\x2e\xed\x6e\xa9\xda\xf5\xc2\x4e\xb0\x74\xc9\x2d\x3d\xde\x5b\x93\x51\x87\x79\x05\x09\x25\x8a\x90\xc8\x8e\x43\x6f\x9c\xdf\x92\xa5\x26\x4e\x34\x51\xbc\x91\xa3\x5b\x87\xc5\x44\x86\xae\x78\xc3\x09\xfc\xfb\x48\xbc\xe1\xb7\xf3\x9d\xc4\x0c\x80\xc6\x8e\xee\x66\x64\x8e\x61\x6f\x7f\x9f\x25\xfa\x2f\xc4\xef\xc7\xa3\xab\x43\x2b\xd7\x65\x4b\x58\x22\x63\x56\x90\x6f\x34\xc9\x15\x0f\x48\x91\x6b\xd8\x13\x5f\xfe\xeb\xe4\x04\x56\x36\x23\xda\xb2\x92\x57\x13\xc3\x49\xf8\x20\x7f\x06\xef\xc3\x8c\x46\x82\x33\x02\xf6\xc5\xbb\xc4\xa5\xdc\xc9\xab\x89\x15\xf6\xc8\xeb\x4c\x61\x91\xdd\x6d\x22\xe0\xdd\x1c\xb5\x65\xa7\x2e\x6a\xcb\x4e\x0d\xd4\x96\x47\xe3\xb1\x18\xd8\x3e\xb0\x71\x85\x4c\xd1\x9c\xde\xb8\xa2\xd5\x7b\xf0\xb6\x2c\x0f\xed\x78\xe9\xcc\x91\x3b\xbe\x40\x16\xd2\xd3\x18\xf6\xfe\x53\x52\x7e\x4f\xc8\xff\x12\xfc\x3d\xb5\x6f\xe6\xf8\xf4\x9e\x18\xb8\x0c\x07\x25\x49\x19\xfb\xb1\x8c\x2e\x90\x45\x56\x5e\x46\x4e\x25\x59\x5e\x07\xe2\xae\x8a\x20\x23\x33\x6b\x62\x8f\xb1\x3f\x46\xfc\x4b\x9f\x6f\xb1\x7b\x4b\xf0\x1d\xd0\xea\x86\x14\x0d\x53\x69\xb8\x98\x1d\xc3\x37\x19\x95\xf2\xbe\x9c\x07\x3a\xdf\x43\xae\xcf\xf7\x79\xd1\x22\xd3\x04\x14\x49\xff\xdf\x45\xcb\x19\x93\x41\xe6\x96\x99\xf5\x3d\x6e\x63\x9a\xf5\x0c\x74\x4f\xbc\x30\xce\xee\x8d\x02\xfc\x11\xbc\x62\x07\x92\x9b\x48\x98\x4e\xf3\x00\x4e\xf9\x97\xa6\x4c\xb5\x86\xa7\xc8\x9d\x01\x19\x29\x33\x37\x34\x9f\x9c\xb9\xe9\xad\x4f\x99\x1d\xd5\xf7\xda\x71\x17\xc8\x0f\xbe\xfa\x19\x65\x4c\x0a\xd3\x06\x27\x2e\x47\x89\x09\x11\x35\x29\x4f\xa1\x46\x7c\x44\x99\xa3\xb5\xb3\xf2\x47\xd0\x9c\x62\x3b\x70\xc2\x7c\x0d\xcf\xf3\x91\xeb\xd3\xda\xe1\x8c\xf0\x00\xd8\xb6\xf8\x8b\xde\x31\x7f\x35\xbd\x1f\x41\x73\xd0\x79\xc5\x13\x4d\xd7\xb1\x7f\x89\x6d\x63\xae\x73\x28\xc4\x59\xf9\xd1\xbb\xe6\xb0\xf3\xaa\xd9\xe0\x4b\x69\xe1\xa2\x48\xb2\x64\x45\xbd\xb3\x88\x28\xec\x7d\x0b\x75\xba\x6a\xa5\xb5\x2a\x21\x56\x9e\xdf\x46\xb5\x51\x51\x50\x50\x87\x65\x55\xcc\x0a\x9a\x64\x15\xa0\x4c\xc6\x2c\xe8\x23\x6a\x74\x6a\x5c\x0c\xd9\xf6\xd2\xc7\x2c\xf4\xf9\xaa\x11\xeb\x54\xcf\x51\x0d\x76\x4f\x6c\x4b\x11\xd5\xe8\x6d\x13\xce\x7c\x3a\xf8\x75\x34\x1e\x4f\x91\xeb\x63\x8f\x20\x7b\xfc\x75\x8a\x7c\xdf\xc0\x25\xdd\xed\x96\xa4\xde\xee\xca\xb9\xfc\x66\x44\x45\xc3\x7e\x69\x9c\x17\x65\xf1\xbb\x39\x8b\x92\x94\xd8\x7d\x39\x8b\x3f\x32\xb0\x5d\x49\x4a\x6c\x31\xd4\x7e\x10\x19\x65\x30\x6f\x1f\x75\x74\x00\x8f\x37\xe6\x53\x42\x3c\xa3\xe1\xe6\x82\x78\xbc\xd0\x65\x40\x9e\xda\x92\x35\x50\x8f\xee\x50\xe6\x58\xcb\x23\xc1\xf0\xda\xcc\x46\x80\xf7\x05\xf0\x98\xca\xe2\xf3\x00\xbf\x75\x31\x84\x99\x32\xf9\x3c\x79\xfc\x59\x0c\x57\xa6\x6c\xbe\x46\x44\x99\x34\x73\x21\x3a\x85\x2a\xd5\x4e\xbb\xbf\x73\xda\xe3\x53\x17\x23\x83\xc7\x2e\x3f\x2d\x7f\x19\x1e\xbb\x26\x6f\x1a\xd4\x72\xca\x95\x6e\xb3\x27\x0d\x0a\x5c\xd9\x8d\x32\xdb\x2a\x35\x5d\x7e\xb6\xce\xb2\x98\x23\xd3\x59\x58\x41\x47\x36\xd8\x26\x47\xb6\x8b\x72\x6e\x2e\xca\xb9\xe9\x28\x64\xef\xc9\xa2\x90\xfd\xc2\x51\xc8\x32\x60\x38\x8c\xdb\x11\x34\x3f\x33\xc6\x87\x87\xe6\x48\xe7\xd9\x33\x8c\x76\x32\x9d\xcb\x78\x71\x55\xcd\x69\xdc\xf8\x1c\xdf\x60\xdb\xe2\x67\xf0\x46\xd2\xd9\x84\xfa\x43\xa2\xda\x5e\xb0\x91\x90\xa8\xbe\x2b\xd4\xe8\xf7\xeb\x09\x89\xba\xb4\x95\x5e\x54\x44\x94\xab\xb4\x0b\x88\xee\x02\xa2\xbb\x80\xe8\xf6\xaa\xa1\x0f\x88\x1e\x6f\x13\x24\x7d\xb9\x73\x6b\x13\xa8\xe9\x76\x87\x35\x4c\xad\x7f\x22\x36\x36\x64\x71\x5c\x43\x30\x74\x63\x81\xe3\xc1\xe6\xc3\x10\xc7\x9b\x0f\x43\xbc\x7d\x82\xc0\xf1\xb0\xb6\x50\x07\xc5\x7b\x1e\xb6\xd2\x70\x79\xcb\x43\x1e\xa2\xe0\x7a\xc0\x6c\x70\xb2\x8a\x2e\xa3\xbe\xaa\xa8\x6a\xe4\xa4\x90\x63\x28\x28\x40\xdd\x29\x15\x42\x6a\x0e\xe0\xa8\xba\x69\xdd\x01\x1c\x55\x3f\xad\x3b\xda\xad\xea\xa8\x35\x4c\x16\x74\x7d\x33\x6f\x90\x88\x3e\xd0\xe7\xab\xd6\xbb\xbf\x02\x00\x00\xff\xff\xae\xc3\xe9\x8b\xa5\x1d\x33\x00") + +func publicBundleJsBytes() ([]byte, error) { + return bindataRead( + _publicBundleJs, + "public/bundle.js", + ) +} + +func publicBundleJs() (*asset, error) { + bytes, err := publicBundleJsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "public/bundle.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _publicDashboardHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x52\x4d\x8b\xdb\x30\x10\xbd\xe7\x57\xcc\x0e\x14\x5a\xa8\xd6\xd9\x5b\x49\x2d\x43\xd9\xa4\xa5\xa7\x94\x92\x85\xf6\x28\x5b\xb3\xd6\x34\xfa\x70\xa5\xb1\xb7\xf9\xf7\xc5\xce\x2e\x09\xfd\x38\x8d\x86\xf7\xde\xf0\x34\x6f\xea\x9b\xed\xfe\xfe\xf0\xfd\xcb\x0e\x9c\x04\xdf\xac\xea\xb9\x80\x37\xb1\xd7\x48\x11\xa1\xc8\xc9\x93\x46\x47\xdc\x3b\xd9\xc0\xdd\x7a\xfd\x0a\x9b\x15\x00\x40\xed\xc8\xd8\xf3\x73\x69\x03\x89\x81\xce\x99\x5c\x48\x34\x3e\x1c\x3e\xaa\x77\xf8\x27\xec\x44\x06\x45\x3f\x47\x9e\x34\x7e\x53\x0f\x1f\xd4\x7d\x0a\x83\x11\x6e\x3d\x21\x74\x29\x0a\x45\xd1\xf8\x79\xa7\xc9\xf6\xf4\x97\x3a\x9a\x40\x1a\x27\xa6\xa7\x21\x65\xb9\x12\x3c\xb1\x15\xa7\x2d\x4d\xdc\x91\x5a\x9a\xb7\xc0\x91\x85\x8d\x57\xa5\x33\x9e\xf4\x1d\x36\xab\xcb\x34\x61\xf1\xd4\x7c\x4a\xb0\x13\x47\x99\xc6\x00\x5b\x53\x5c\x9b\x4c\xb6\x75\x75\x06\x2f\x64\xcf\xf1\x08\x99\xbc\xc6\xe2\x52\x96\x6e\x14\xe0\x2e\x45\x04\x39\x0d\xa4\x91\x83\xe9\xa9\xe2\x2e\x21\xb8\x4c\x8f\x1a\xe7\x3f\x96\x4d\x55\xd1\xf3\xec\xdb\x94\xfb\xea\xd1\x4c\xb3\xe8\x76\xe6\x55\xd7\x56\x6e\x94\x82\xc3\x7e\xbb\x87\xd7\xc7\x31\x1f\x53\xe0\xc2\x6f\x36\xf0\x95\x64\xcc\x11\x24\x81\x38\x02\xfa\x25\x94\xa3\xf1\xe0\xb9\xcd\x26\x33\x95\x19\x29\x03\x91\x85\x71\x58\x28\xed\x18\xad\xe7\xd8\x83\x1d\xf3\x52\x68\x22\x9f\x86\x40\x51\x40\xa9\xe7\xc0\xaa\x4b\x62\x75\x9b\xec\xe9\x5f\xe1\xbe\x87\x60\x72\xcf\x71\x03\xeb\xeb\xfd\x5b\x9e\x80\xad\x46\xfb\xb2\xa7\xff\x5c\x46\x5d\x59\x9e\xae\x74\xa5\xcb\x3c\x08\x94\xdc\x69\x5c\x3c\xd2\xed\x8f\x32\xd3\xce\xc0\x8b\xb1\xd9\x4d\xb3\xaa\xab\xf3\x0d\xfe\x0e\x00\x00\xff\xff\x58\x5e\xc8\x63\x94\x02\x00\x00") + +func publicDashboardHtmlBytes() ([]byte, error) { + return bindataRead( + _publicDashboardHtml, + "public/dashboard.html", + ) +} + +func publicDashboardHtml() (*asset, error) { + bytes, err := publicDashboardHtmlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "public/dashboard.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "public/bundle.js": publicBundleJs, + "public/dashboard.html": publicDashboardHtml, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "public": {nil, map[string]*bintree{ + "bundle.js": {publicBundleJs, map[string]*bintree{}}, + "dashboard.html": {publicDashboardHtml, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/dashboard/assets/.eslintrc b/dashboard/assets/.eslintrc new file mode 100644 index 0000000000..04ae15d013 --- /dev/null +++ b/dashboard/assets/.eslintrc @@ -0,0 +1,52 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// React syntax style mostly according to https://github.com/airbnb/javascript/tree/master/react +{ + "plugins": [ + "react" + ], + "parser": "babel-eslint", + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + "modules": true + } + }, + "rules": { + "react/prefer-es6-class": 2, + "react/prefer-stateless-function": 2, + "react/jsx-pascal-case": 2, + "react/jsx-closing-bracket-location": [1, {"selfClosing": "tag-aligned", "nonEmpty": "tag-aligned"}], + "react/jsx-closing-tag-location": 1, + "jsx-quotes": ["error", "prefer-double"], + "no-multi-spaces": "error", + "react/jsx-tag-spacing": 2, + "react/jsx-curly-spacing": [2, {"when": "never", "children": true}], + "react/jsx-boolean-value": 2, + "react/no-string-refs": 2, + "react/jsx-wrap-multilines": 2, + "react/self-closing-comp": 2, + "react/jsx-no-bind": 2, + "react/require-render-return": 2, + "react/no-is-mounted": 2, + "key-spacing": ["error", {"align": { + "beforeColon": false, + "afterColon": true, + "on": "value" + }}] + } +} diff --git a/dashboard/assets/components/Common.jsx b/dashboard/assets/components/Common.jsx new file mode 100644 index 0000000000..5129939c5a --- /dev/null +++ b/dashboard/assets/components/Common.jsx @@ -0,0 +1,52 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// isNullOrUndefined returns true if the given variable is null or undefined. +export const isNullOrUndefined = variable => variable === null || typeof variable === 'undefined'; + +export const LIMIT = { + memory: 200, // Maximum number of memory data samples. + traffic: 200, // Maximum number of traffic data samples. + log: 200, // Maximum number of logs. +}; +// The sidebar menu and the main content are rendered based on these elements. +export const TAGS = (() => { + const T = { + home: { title: "Home", }, + chain: { title: "Chain", }, + transactions: { title: "Transactions", }, + network: { title: "Network", }, + system: { title: "System", }, + logs: { title: "Logs", }, + }; + // Using the key is circumstantial in some cases, so it is better to insert it also as a value. + // This way the mistyping is prevented. + for(let key in T) { + T[key]['id'] = key; + } + return T; +})(); + +export const DATA_KEYS = (() => { + const DK = {}; + ["memory", "traffic", "logs"].map(key => { + DK[key] = key; + }); + return DK; +})(); + +// Temporary - taken from Material-UI +export const DRAWER_WIDTH = 240; diff --git a/dashboard/assets/components/Dashboard.jsx b/dashboard/assets/components/Dashboard.jsx new file mode 100644 index 0000000000..740acf9592 --- /dev/null +++ b/dashboard/assets/components/Dashboard.jsx @@ -0,0 +1,169 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import {withStyles} from 'material-ui/styles'; + +import SideBar from './SideBar.jsx'; +import Header from './Header.jsx'; +import Main from "./Main.jsx"; +import {isNullOrUndefined, LIMIT, TAGS, DATA_KEYS,} from "./Common.jsx"; + +// Styles for the Dashboard component. +const styles = theme => ({ + appFrame: { + position: 'relative', + display: 'flex', + width: '100%', + height: '100%', + background: theme.palette.background.default, + }, +}); + +// Dashboard is the main component, which renders the whole page, makes connection with the server and listens for messages. +// When there is an incoming message, updates the page's content correspondingly. +class Dashboard extends Component { + constructor(props) { + super(props); + this.state = { + active: TAGS.home.id, // active menu + sideBar: true, // true if the sidebar is opened + memory: [], + traffic: [], + logs: [], + shouldUpdate: {}, + }; + } + + // componentDidMount initiates the establishment of the first websocket connection after the component is rendered. + componentDidMount() { + this.reconnect(); + } + + // reconnect establishes a websocket connection with the server, listens for incoming messages + // and tries to reconnect on connection loss. + reconnect = () => { + const server = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/api"); + + server.onmessage = event => { + const msg = JSON.parse(event.data); + if (isNullOrUndefined(msg)) { + return; + } + this.update(msg); + }; + + server.onclose = () => { + setTimeout(this.reconnect, 3000); + }; + }; + + // update analyzes the incoming message, and updates the charts' content correspondingly. + update = msg => { + console.log(msg); + this.setState(prevState => { + let newState = []; + newState.shouldUpdate = {}; + const insert = (key, values, limit) => { + newState[key] = [...prevState[key], ...values]; + while (newState[key].length > limit) { + newState[key].shift(); + } + newState.shouldUpdate[key] = true; + }; + // (Re)initialize the state with the past data. + if (!isNullOrUndefined(msg.history)) { + const memory = DATA_KEYS.memory; + const traffic = DATA_KEYS.traffic; + newState[memory] = []; + newState[traffic] = []; + if (!isNullOrUndefined(msg.history.memorySamples)) { + newState[memory] = msg.history.memorySamples.map(elem => isNullOrUndefined(elem.value) ? 0 : elem.value); + while (newState[memory].length > LIMIT.memory) { + newState[memory].shift(); + } + newState.shouldUpdate[memory] = true; + } + if (!isNullOrUndefined(msg.history.trafficSamples)) { + newState[traffic] = msg.history.trafficSamples.map(elem => isNullOrUndefined(elem.value) ? 0 : elem.value); + while (newState[traffic].length > LIMIT.traffic) { + newState[traffic].shift(); + } + newState.shouldUpdate[traffic] = true; + } + } + // Insert the new data samples. + if (!isNullOrUndefined(msg.memory)) { + insert(DATA_KEYS.memory, [isNullOrUndefined(msg.memory.value) ? 0 : msg.memory.value], LIMIT.memory); + } + if (!isNullOrUndefined(msg.traffic)) { + insert(DATA_KEYS.traffic, [isNullOrUndefined(msg.traffic.value) ? 0 : msg.traffic.value], LIMIT.traffic); + } + if (!isNullOrUndefined(msg.log)) { + insert(DATA_KEYS.logs, [msg.log], LIMIT.log); + } + + return newState; + }); + }; + + // The change of the active label on the SideBar component will trigger a new render in the Main component. + changeContent = active => { + this.setState(prevState => prevState.active !== active ? {active: active} : {}); + }; + + openSideBar = () => { + this.setState({sideBar: true}); + }; + + closeSideBar = () => { + this.setState({sideBar: false}); + }; + + render() { + // The classes property is injected by withStyles(). + const {classes} = this.props; + + return ( +

+
+ +
+
+ ); + } +} + +Dashboard.propTypes = { + classes: PropTypes.object.isRequired, +}; + +export default withStyles(styles)(Dashboard); diff --git a/dashboard/assets/components/Header.jsx b/dashboard/assets/components/Header.jsx new file mode 100644 index 0000000000..7cf57c9c03 --- /dev/null +++ b/dashboard/assets/components/Header.jsx @@ -0,0 +1,87 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import {withStyles} from 'material-ui/styles'; +import AppBar from 'material-ui/AppBar'; +import Toolbar from 'material-ui/Toolbar'; +import Typography from 'material-ui/Typography'; +import IconButton from 'material-ui/IconButton'; +import MenuIcon from 'material-ui-icons/Menu'; + +import {DRAWER_WIDTH} from './Common.jsx'; + +// Styles for the Header component. +const styles = theme => ({ + appBar: { + position: 'absolute', + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + }, + appBarShift: { + marginLeft: DRAWER_WIDTH, + width: `calc(100% - ${DRAWER_WIDTH}px)`, + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + }, + menuButton: { + marginLeft: 12, + marginRight: 20, + }, + hide: { + display: 'none', + }, +}); + +// Header renders a header, which contains a sidebar opener icon when that is closed. +class Header extends Component { + render() { + // The classes property is injected by withStyles(). + const {classes} = this.props; + + return ( + + + + + + + Go Ethereum Dashboard + + + + ); + } +} + +Header.propTypes = { + classes: PropTypes.object.isRequired, + opened: PropTypes.bool.isRequired, + open: PropTypes.func.isRequired, +}; + +export default withStyles(styles)(Header); diff --git a/dashboard/assets/components/Home.jsx b/dashboard/assets/components/Home.jsx new file mode 100644 index 0000000000..f67bac5559 --- /dev/null +++ b/dashboard/assets/components/Home.jsx @@ -0,0 +1,89 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import Grid from 'material-ui/Grid'; +import {LineChart, AreaChart, Area, YAxis, CartesianGrid, Line, ResponsiveContainer} from 'recharts'; +import {withTheme} from 'material-ui/styles'; + +import {isNullOrUndefined, DATA_KEYS} from "./Common.jsx"; + +// ChartGrid renders a grid container for responsive charts. +// The children are Recharts components extended with the Material-UI's xs property. +class ChartGrid extends Component { + render() { + return ( + + { + React.Children.map(this.props.children, child => ( + + + {React.cloneElement(child, {data: child.props.values.map(value => ({value: value}))})} + + + )) + } + + ); + } +} + +ChartGrid.propTypes = { + spacing: PropTypes.number.isRequired, +}; + +// Home renders the home component. +class Home extends Component { + shouldComponentUpdate(nextProps) { + return !isNullOrUndefined(nextProps.shouldUpdate[DATA_KEYS.memory]) || + !isNullOrUndefined(nextProps.shouldUpdate[DATA_KEYS.traffic]); + } + + render() { + const {theme} = this.props; + const memoryColor = theme.palette.primary[300]; + const trafficColor = theme.palette.secondary[300]; + + return ( + + + + + + + + + + + + + + + + + + + ); + } +} + +Home.propTypes = { + theme: PropTypes.object.isRequired, + shouldUpdate: PropTypes.object.isRequired, +}; + +export default withTheme()(Home); diff --git a/dashboard/assets/components/Main.jsx b/dashboard/assets/components/Main.jsx new file mode 100644 index 0000000000..b119d1ffd5 --- /dev/null +++ b/dashboard/assets/components/Main.jsx @@ -0,0 +1,109 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import {withStyles} from 'material-ui/styles'; + +import {TAGS, DRAWER_WIDTH} from "./Common.jsx"; +import Home from './Home.jsx'; + +// ContentSwitch chooses and renders the proper page content. +class ContentSwitch extends Component { + render() { + switch(this.props.active) { + case TAGS.home.id: + return ; + case TAGS.chain.id: + return null; + case TAGS.transactions.id: + return null; + case TAGS.network.id: + // Only for testing. + return null; + case TAGS.system.id: + return null; + case TAGS.logs.id: + return
{this.props.logs.map((log, index) =>
{log}
)}
; + } + return null; + } +} + +ContentSwitch.propTypes = { + active: PropTypes.string.isRequired, + shouldUpdate: PropTypes.object.isRequired, +}; + +// styles contains the styles for the Main component. +const styles = theme => ({ + content: { + width: '100%', + marginLeft: -DRAWER_WIDTH, + flexGrow: 1, + backgroundColor: theme.palette.background.default, + padding: theme.spacing.unit * 3, + transition: theme.transitions.create('margin', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + marginTop: 56, + overflow: 'auto', + [theme.breakpoints.up('sm')]: { + content: { + height: 'calc(100% - 64px)', + marginTop: 64, + }, + }, + }, + contentShift: { + marginLeft: 0, + transition: theme.transitions.create('margin', { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + }, +}); + +// Main renders a component for the page content. +class Main extends Component { + render() { + // The classes property is injected by withStyles(). + const {classes} = this.props; + + return ( +
+ +
+ ); + } +} + +Main.propTypes = { + classes: PropTypes.object.isRequired, + opened: PropTypes.bool.isRequired, + active: PropTypes.string.isRequired, + shouldUpdate: PropTypes.object.isRequired, +}; + +export default withStyles(styles)(Main); diff --git a/dashboard/assets/components/SideBar.jsx b/dashboard/assets/components/SideBar.jsx new file mode 100644 index 0000000000..ef077f1e0e --- /dev/null +++ b/dashboard/assets/components/SideBar.jsx @@ -0,0 +1,106 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import {withStyles} from 'material-ui/styles'; +import Drawer from 'material-ui/Drawer'; +import {IconButton} from "material-ui"; +import List, {ListItem, ListItemText} from 'material-ui/List'; +import ChevronLeftIcon from 'material-ui-icons/ChevronLeft'; + +import {TAGS, DRAWER_WIDTH} from './Common.jsx'; + +// Styles for the SideBar component. +const styles = theme => ({ + drawerPaper: { + position: 'relative', + height: '100%', + width: DRAWER_WIDTH, + }, + drawerHeader: { + display: 'flex', + alignItems: 'center', + justifyContent: 'flex-end', + padding: '0 8px', + ...theme.mixins.toolbar, + transitionDuration: { + enter: theme.transitions.duration.enteringScreen, + exit: theme.transitions.duration.leavingScreen, + } + }, +}); + +// SideBar renders a sidebar component. +class SideBar extends Component { + constructor(props) { + super(props); + + // clickOn contains onClick event functions for the menu items. + // Instantiate only once, and reuse the existing functions to prevent the creation of + // new function instances every time the render method is triggered. + this.clickOn = {}; + for(let key in TAGS) { + const id = TAGS[key].id; + this.clickOn[id] = event => { + event.preventDefault(); + console.log(event.target.key); + this.props.changeContent(id); + }; + } + } + + render() { + // The classes property is injected by withStyles(). + const {classes} = this.props; + + return ( + +
+
+ + + +
+ + { + Object.values(TAGS).map(tag => { + return ( + + + + ); + }) + } + +
+
+ ); + } +} + +SideBar.propTypes = { + classes: PropTypes.object.isRequired, + opened: PropTypes.bool.isRequired, + close: PropTypes.func.isRequired, + changeContent: PropTypes.func.isRequired, +}; + +export default withStyles(styles)(SideBar); diff --git a/dashboard/assets/index.jsx b/dashboard/assets/index.jsx new file mode 100644 index 0000000000..1e5fdc8929 --- /dev/null +++ b/dashboard/assets/index.jsx @@ -0,0 +1,36 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React from 'react'; +import {hydrate} from 'react-dom'; +import {createMuiTheme, MuiThemeProvider} from 'material-ui/styles'; + +import Dashboard from './components/Dashboard.jsx'; + +// Theme for the dashboard. +const theme = createMuiTheme({ + palette: { + type: 'dark', + }, +}); + +// Renders the whole dashboard. +hydrate( + + + , + document.getElementById('dashboard') +); diff --git a/dashboard/assets/package.json b/dashboard/assets/package.json new file mode 100644 index 0000000000..53376e5c8c --- /dev/null +++ b/dashboard/assets/package.json @@ -0,0 +1,22 @@ +{ + "dependencies": { + "babel-core": "^6.26.0", + "babel-eslint": "^8.0.1", + "babel-loader": "^7.1.2", + "babel-preset-env": "^1.6.1", + "babel-preset-react": "^6.24.1", + "babel-preset-stage-0": "^6.24.1", + "classnames": "^2.2.5", + "eslint": "^4.5.0", + "eslint-plugin-react": "^7.4.0", + "material-ui": "^1.0.0-beta.18", + "material-ui-icons": "^1.0.0-beta.17", + "path": "^0.12.7", + "prop-types": "^15.6.0", + "recharts": "^1.0.0-beta.0", + "react": "^16.0.0", + "react-dom": "^16.0.0", + "url": "^0.11.0", + "webpack": "^3.5.5" + } +} diff --git a/dashboard/assets/public/dashboard.html b/dashboard/assets/public/dashboard.html new file mode 100644 index 0000000000..e064a2b512 --- /dev/null +++ b/dashboard/assets/public/dashboard.html @@ -0,0 +1,17 @@ + + + + + + + + Go Ethereum Dashboard + + + + + +
+ + + diff --git a/dashboard/assets/webpack.config.js b/dashboard/assets/webpack.config.js new file mode 100644 index 0000000000..13f8c3fbc6 --- /dev/null +++ b/dashboard/assets/webpack.config.js @@ -0,0 +1,36 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +const path = require('path'); + +module.exports = { + entry: './index.jsx', + output: { + path: path.resolve(__dirname, 'public'), + filename: 'bundle.js', + }, + module: { + loaders: [ + { + test: /\.jsx$/, // regexp for JSX files + loader: 'babel-loader', // The babel configuration is in the package.json. + query: { + presets: ['env', 'react', 'stage-0'] + } + }, + ], + }, +}; diff --git a/dashboard/config.go b/dashboard/config.go new file mode 100644 index 0000000000..57d902aeeb --- /dev/null +++ b/dashboard/config.go @@ -0,0 +1,45 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package dashboard + +import "time" + +// DefaultConfig contains default settings for the dashboard. +var DefaultConfig = Config{ + Host: "localhost", + Port: 8080, + Refresh: 3 * time.Second, +} + +// Config contains the configuration parameters of the dashboard. +type Config struct { + // Host is the host interface on which to start the dashboard server. If this + // field is empty, no dashboard will be started. + Host string `toml:",omitempty"` + + // Port is the TCP port number on which to start the dashboard server. The + // default zero value is/ valid and will pick a port number randomly (useful + // for ephemeral nodes). + Port int `toml:",omitempty"` + + // Refresh is the refresh rate of the data updates, the chartEntry will be collected this often. + Refresh time.Duration `toml:",omitempty"` + + // Assets offers a possibility to manually set the dashboard website's location on the server side. + // It is useful for debugging, avoids the repeated generation of the binary. + Assets string `toml:",omitempty"` +} diff --git a/dashboard/dashboard.go b/dashboard/dashboard.go new file mode 100644 index 0000000000..10a3636192 --- /dev/null +++ b/dashboard/dashboard.go @@ -0,0 +1,305 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package dashboard + +//go:generate go-bindata -nometadata -o assets.go -prefix assets -pkg dashboard assets/public/... + +import ( + "fmt" + "io/ioutil" + "net" + "net/http" + "path/filepath" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/rcrowley/go-metrics" + "golang.org/x/net/websocket" +) + +const ( + memorySampleLimit = 200 // Maximum number of memory data samples + trafficSampleLimit = 200 // Maximum number of traffic data samples +) + +var nextId uint32 // Next connection id + +// Dashboard contains the dashboard internals. +type Dashboard struct { + config *Config + + listener net.Listener + conns map[uint32]*client // Currently live websocket connections + charts charts // The collected data samples to plot + lock sync.RWMutex // Lock protecting the dashboard's internals + + quit chan chan error // Channel used for graceful exit + wg sync.WaitGroup +} + +// message embraces the data samples of a client message. +type message struct { + History *charts `json:"history,omitempty"` // Past data samples + Memory *chartEntry `json:"memory,omitempty"` // One memory sample + Traffic *chartEntry `json:"traffic,omitempty"` // One traffic sample + Log string `json:"log,omitempty"` // One log +} + +// client represents active websocket connection with a remote browser. +type client struct { + conn *websocket.Conn // Particular live websocket connection + msg chan message // Message queue for the update messages + logger log.Logger // Logger for the particular live websocket connection +} + +// charts contains the collected data samples. +type charts struct { + Memory []*chartEntry `json:"memorySamples,omitempty"` + Traffic []*chartEntry `json:"trafficSamples,omitempty"` +} + +// chartEntry represents one data sample +type chartEntry struct { + Time time.Time `json:"time,omitempty"` + Value float64 `json:"value,omitempty"` +} + +// New creates a new dashboard instance with the given configuration. +func New(config *Config) (*Dashboard, error) { + return &Dashboard{ + conns: make(map[uint32]*client), + config: config, + quit: make(chan chan error), + }, nil +} + +// Protocols is a meaningless implementation of node.Service. +func (db *Dashboard) Protocols() []p2p.Protocol { return nil } + +// APIs is a meaningless implementation of node.Service. +func (db *Dashboard) APIs() []rpc.API { return nil } + +// Start implements node.Service, starting the data collection thread and the listening server of the dashboard. +func (db *Dashboard) Start(server *p2p.Server) error { + db.wg.Add(2) + go db.collectData() + go db.collectLogs() // In case of removing this line change 2 back to 1 in wg.Add. + + http.HandleFunc("/", db.webHandler) + http.Handle("/api", websocket.Handler(db.apiHandler)) + + listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", db.config.Host, db.config.Port)) + if err != nil { + return err + } + db.listener = listener + + go http.Serve(listener, nil) + + return nil +} + +// Stop implements node.Service, stopping the data collection thread and the connection listener of the dashboard. +func (db *Dashboard) Stop() error { + // Close the connection listener. + var errs []error + if err := db.listener.Close(); err != nil { + errs = append(errs, err) + } + // Close the collectors. + errc := make(chan error, 1) + for i := 0; i < 2; i++ { + db.quit <- errc + if err := <-errc; err != nil { + errs = append(errs, err) + } + } + // Close the connections. + db.lock.Lock() + for _, c := range db.conns { + if err := c.conn.Close(); err != nil { + c.logger.Warn("Failed to close connection", "err", err) + } + } + db.lock.Unlock() + + // Wait until every goroutine terminates. + db.wg.Wait() + log.Info("Dashboard stopped") + + var err error + if len(errs) > 0 { + err = fmt.Errorf("%v", errs) + } + + return err +} + +// webHandler handles all non-api requests, simply flattening and returning the dashboard website. +func (db *Dashboard) webHandler(w http.ResponseWriter, r *http.Request) { + log.Debug("Request", "URL", r.URL) + + path := r.URL.String() + if path == "/" { + path = "/dashboard.html" + } + // If the path of the assets is manually set + if db.config.Assets != "" { + blob, err := ioutil.ReadFile(filepath.Join(db.config.Assets, path)) + if err != nil { + log.Warn("Failed to read file", "path", path, "err", err) + http.Error(w, "not found", http.StatusNotFound) + return + } + w.Write(blob) + return + } + blob, err := Asset(filepath.Join("public", path)) + if err != nil { + log.Warn("Failed to load the asset", "path", path, "err", err) + http.Error(w, "not found", http.StatusNotFound) + return + } + w.Write(blob) +} + +// apiHandler handles requests for the dashboard. +func (db *Dashboard) apiHandler(conn *websocket.Conn) { + id := atomic.AddUint32(&nextId, 1) + client := &client{ + conn: conn, + msg: make(chan message, 128), + logger: log.New("id", id), + } + done := make(chan struct{}) // Buffered channel as sender may exit early + + // Start listening for messages to send. + db.wg.Add(1) + go func() { + defer db.wg.Done() + + for { + select { + case <-done: + return + case msg := <-client.msg: + if err := websocket.JSON.Send(client.conn, msg); err != nil { + client.logger.Warn("Failed to send the message", "msg", msg, "err", err) + client.conn.Close() + return + } + } + } + }() + // Send the past data. + client.msg <- message{ + History: &db.charts, + } + // Start tracking the connection and drop at connection loss. + db.lock.Lock() + db.conns[id] = client + db.lock.Unlock() + defer func() { + db.lock.Lock() + delete(db.conns, id) + db.lock.Unlock() + }() + for { + fail := []byte{} + if _, err := conn.Read(fail); err != nil { + close(done) + return + } + // Ignore all messages + } +} + +// collectData collects the required data to plot on the dashboard. +func (db *Dashboard) collectData() { + defer db.wg.Done() + + for { + select { + case errc := <-db.quit: + errc <- nil + return + case <-time.After(db.config.Refresh): + inboundTraffic := metrics.DefaultRegistry.Get("p2p/InboundTraffic").(metrics.Meter).Rate1() + memoryInUse := metrics.DefaultRegistry.Get("system/memory/inuse").(metrics.Meter).Rate1() + now := time.Now() + memory := &chartEntry{ + Time: now, + Value: memoryInUse, + } + traffic := &chartEntry{ + Time: now, + Value: inboundTraffic, + } + // Remove the first elements in case the samples' amount exceeds the limit. + first := 0 + if len(db.charts.Memory) == memorySampleLimit { + first = 1 + } + db.charts.Memory = append(db.charts.Memory[first:], memory) + first = 0 + if len(db.charts.Traffic) == trafficSampleLimit { + first = 1 + } + db.charts.Traffic = append(db.charts.Traffic[first:], traffic) + + db.sendToAll(&message{ + Memory: memory, + Traffic: traffic, + }) + } + } +} + +// collectLogs collects and sends the logs to the active dashboards. +func (db *Dashboard) collectLogs() { + defer db.wg.Done() + + // TODO (kurkomisi): log collection comes here. + for { + select { + case errc := <-db.quit: + errc <- nil + return + case <-time.After(db.config.Refresh / 2): + db.sendToAll(&message{ + Log: "This is a fake log.", + }) + } + } +} + +// sendToAll sends the given message to the active dashboards. +func (db *Dashboard) sendToAll(msg *message) { + db.lock.Lock() + for _, c := range db.conns { + select { + case c.msg <- *msg: + default: + c.conn.Close() + } + } + db.lock.Unlock() +} diff --git a/metrics/metrics.go b/metrics/metrics.go index afdfd89fa7..c82661d802 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -30,6 +30,7 @@ import ( // MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. const MetricsEnabledFlag = "metrics" +const DashboardEnabledFlag = "dashboard" // Enabled is the flag specifying if metrics are enable or not. var Enabled = false @@ -39,7 +40,7 @@ var Enabled = false // and peek into the command line args for the metrics flag. func init() { for _, arg := range os.Args { - if strings.TrimLeft(arg, "-") == MetricsEnabledFlag { + if flag := strings.TrimLeft(arg, "-"); flag == MetricsEnabledFlag || flag == DashboardEnabledFlag { log.Info("Enabling metrics collection") Enabled = true } From 463014126f11a20c5e40f912a6f7415a0bbc910b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 15 Nov 2017 13:54:40 +0200 Subject: [PATCH 257/272] core/bloombits: handle non 8-bit boundary section matches --- core/bloombits/matcher.go | 6 ++-- core/bloombits/matcher_test.go | 57 +++++++++++++++++++++------------- eth/filters/filter.go | 1 + 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index d38d4ba83e..ce3031702f 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -192,10 +192,12 @@ func (m *Matcher) Start(ctx context.Context, begin, end uint64, results chan uin } // Iterate over all the blocks in the section and return the matching ones for i := first; i <= last; i++ { - // Skip the entire byte if no matches are found inside + // Skip the entire byte if no matches are found inside (and we're processing an entire byte!) next := res.bitset[(i-sectionStart)/8] if next == 0 { - i += 7 + if i%8 == 0 { + i += 7 + } continue } // Some bit it set, do the actual submatching diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index 4a31854c58..7a5f78ef3a 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -56,33 +56,48 @@ func TestMatcherWildcards(t *testing.T) { // Tests the matcher pipeline on a single continuous workflow without interrupts. func TestMatcherContinuous(t *testing.T) { - testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 100000, false, 75) - testMatcherDiffBatches(t, [][]bloomIndexes{{{32, 3125, 100}}, {{40, 50, 10}}}, 100000, false, 81) - testMatcherDiffBatches(t, [][]bloomIndexes{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, false, 36) + testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 0, 100000, false, 75) + testMatcherDiffBatches(t, [][]bloomIndexes{{{32, 3125, 100}}, {{40, 50, 10}}}, 0, 100000, false, 81) + testMatcherDiffBatches(t, [][]bloomIndexes{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 0, 10000, false, 36) } // Tests the matcher pipeline on a constantly interrupted and resumed work pattern // with the aim of ensuring data items are requested only once. func TestMatcherIntermittent(t *testing.T) { - testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 100000, true, 75) - testMatcherDiffBatches(t, [][]bloomIndexes{{{32, 3125, 100}}, {{40, 50, 10}}}, 100000, true, 81) - testMatcherDiffBatches(t, [][]bloomIndexes{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 10000, true, 36) + testMatcherDiffBatches(t, [][]bloomIndexes{{{10, 20, 30}}}, 0, 100000, true, 75) + testMatcherDiffBatches(t, [][]bloomIndexes{{{32, 3125, 100}}, {{40, 50, 10}}}, 0, 100000, true, 81) + testMatcherDiffBatches(t, [][]bloomIndexes{{{4, 8, 11}, {7, 8, 17}}, {{9, 9, 12}, {15, 20, 13}}, {{18, 15, 15}, {12, 10, 4}}}, 0, 10000, true, 36) } // Tests the matcher pipeline on random input to hopefully catch anomalies. func TestMatcherRandom(t *testing.T) { for i := 0; i < 10; i++ { - testMatcherBothModes(t, makeRandomIndexes([]int{1}, 50), 10000, 0) - testMatcherBothModes(t, makeRandomIndexes([]int{3}, 50), 10000, 0) - testMatcherBothModes(t, makeRandomIndexes([]int{2, 2, 2}, 20), 10000, 0) - testMatcherBothModes(t, makeRandomIndexes([]int{5, 5, 5}, 50), 10000, 0) - testMatcherBothModes(t, makeRandomIndexes([]int{4, 4, 4}, 20), 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{1}, 50), 0, 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{3}, 50), 0, 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{2, 2, 2}, 20), 0, 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{5, 5, 5}, 50), 0, 10000, 0) + testMatcherBothModes(t, makeRandomIndexes([]int{4, 4, 4}, 20), 0, 10000, 0) } } +// Tests that the matcher can properly find matches if the starting block is +// shifter from a multiple of 8. This is needed to cover an optimisation with +// bitset matching https://github.com/ethereum/go-ethereum/issues/15309. +func TestMatcherShifted(t *testing.T) { + // Block 0 always matches in the tests, skip ahead of first 8 blocks with the + // start to get a potential zero byte in the matcher bitset. + + // To keep the second bitset byte zero, the filter must only match for the first + // time in block 16, so doing an all-16 bit filter should suffice. + + // To keep the starting block non divisible by 8, block number 9 is the first + // that would introduce a shift and not match block 0. + testMatcherBothModes(t, [][]bloomIndexes{{{16, 16, 16}}}, 9, 64, 0) +} + // Tests that matching on everything doesn't crash (special case internally). func TestWildcardMatcher(t *testing.T) { - testMatcherBothModes(t, nil, 10000, 0) + testMatcherBothModes(t, nil, 0, 10000, 0) } // makeRandomIndexes generates a random filter system, composed on multiple filter @@ -104,9 +119,9 @@ func makeRandomIndexes(lengths []int, max int) [][]bloomIndexes { // testMatcherDiffBatches runs the given matches test in single-delivery and also // in batches delivery mode, verifying that all kinds of deliveries are handled // correctly withn. -func testMatcherDiffBatches(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermittent bool, retrievals uint32) { - singleton := testMatcher(t, filter, blocks, intermittent, retrievals, 1) - batched := testMatcher(t, filter, blocks, intermittent, retrievals, 16) +func testMatcherDiffBatches(t *testing.T, filter [][]bloomIndexes, start, blocks uint64, intermittent bool, retrievals uint32) { + singleton := testMatcher(t, filter, start, blocks, intermittent, retrievals, 1) + batched := testMatcher(t, filter, start, blocks, intermittent, retrievals, 16) if singleton != batched { t.Errorf("filter = %v blocks = %v intermittent = %v: request count mismatch, %v in signleton vs. %v in batched mode", filter, blocks, intermittent, singleton, batched) @@ -115,9 +130,9 @@ func testMatcherDiffBatches(t *testing.T, filter [][]bloomIndexes, blocks uint64 // testMatcherBothModes runs the given matcher test in both continuous as well as // in intermittent mode, verifying that the request counts match each other. -func testMatcherBothModes(t *testing.T, filter [][]bloomIndexes, blocks uint64, retrievals uint32) { - continuous := testMatcher(t, filter, blocks, false, retrievals, 16) - intermittent := testMatcher(t, filter, blocks, true, retrievals, 16) +func testMatcherBothModes(t *testing.T, filter [][]bloomIndexes, start, blocks uint64, retrievals uint32) { + continuous := testMatcher(t, filter, start, blocks, false, retrievals, 16) + intermittent := testMatcher(t, filter, start, blocks, true, retrievals, 16) if continuous != intermittent { t.Errorf("filter = %v blocks = %v: request count mismatch, %v in continuous vs. %v in intermittent mode", filter, blocks, continuous, intermittent) @@ -126,7 +141,7 @@ func testMatcherBothModes(t *testing.T, filter [][]bloomIndexes, blocks uint64, // testMatcher is a generic tester to run the given matcher test and return the // number of requests made for cross validation between different modes. -func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermittent bool, retrievals uint32, maxReqCount int) uint32 { +func testMatcher(t *testing.T, filter [][]bloomIndexes, start, blocks uint64, intermittent bool, retrievals uint32, maxReqCount int) uint32 { // Create a new matcher an simulate our explicit random bitsets matcher := NewMatcher(testSectionSize, nil) matcher.filters = filter @@ -145,14 +160,14 @@ func testMatcher(t *testing.T, filter [][]bloomIndexes, blocks uint64, intermitt quit := make(chan struct{}) matches := make(chan uint64, 16) - session, err := matcher.Start(context.Background(), 0, blocks-1, matches) + session, err := matcher.Start(context.Background(), start, blocks-1, matches) if err != nil { t.Fatalf("failed to stat matcher session: %v", err) } startRetrievers(session, quit, &requested, maxReqCount) // Iterate over all the blocks and verify that the pipeline produces the correct matches - for i := uint64(0); i < blocks; i++ { + for i := start; i < blocks; i++ { if expMatch3(filter, i) { match, ok := <-matches if !ok { diff --git a/eth/filters/filter.go b/eth/filters/filter.go index e208f8f38e..43d7e2a812 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -158,6 +158,7 @@ func (f *Filter) indexedLogs(ctx context.Context, end uint64) ([]*types.Log, err return logs, err } f.begin = int64(number) + 1 + // Retrieve the suggested block and pull any truly matching logs header, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(number)) if header == nil || err != nil { From 5aa3eac22d80c754d70651a918bccc9b3d1d216f Mon Sep 17 00:00:00 2001 From: jtakalai Date: Thu, 16 Nov 2017 13:14:51 +0200 Subject: [PATCH 258/272] eth/downloader: minor comments cleanup (#15495) it's -> its pet peeve, and I like to imagine I'm not alone. --- eth/downloader/downloader.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index cca4fe7a93..b338129e00 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -333,7 +333,7 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode } // synchronise will select the peer and use it for synchronising. If an empty string is given -// it will use the best peer possible and synchronize if it's TD is higher than our own. If any of the +// it will use the best peer possible and synchronize if its TD is higher than our own. If any of the // checks fail an error will be returned. This method is synchronous func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode SyncMode) error { // Mock out the synchronisation if testing @@ -1003,8 +1003,8 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv return errCancel case packet := <-deliveryCh: - // If the peer was previously banned and failed to deliver it's pack - // in a reasonable time frame, ignore it's message. + // If the peer was previously banned and failed to deliver its pack + // in a reasonable time frame, ignore its message. if peer := d.peers.Peer(packet.PeerId()); peer != nil { // Deliver the received chunk of data and check chain validity accepted, err := deliver(packet) @@ -1205,8 +1205,8 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { case <-d.cancelCh: } } - // If no headers were retrieved at all, the peer violated it's TD promise that it had a - // better chain compared to ours. The only exception is if it's promised blocks were + // If no headers were retrieved at all, the peer violated its TD promise that it had a + // better chain compared to ours. The only exception is if its promised blocks were // already imported by other means (e.g. fecher): // // R , L : Both at block 10 From 4013e23312257d79caf4fb5030881d30a62cb618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 16 Nov 2017 13:51:06 +0200 Subject: [PATCH 259/272] rpc: allow dumb empty requests for AWS health checks --- rpc/http.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/rpc/http.go b/rpc/http.go index 3f572b34c0..2ac9f6c371 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -146,13 +146,17 @@ func NewHTTPServer(cors []string, srv *Server) *http.Server { // ServeHTTP serves JSON-RPC requests over HTTP. func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Permit dumb empty requests for remote health-checks (AWS) + if r.Method == "GET" && r.ContentLength == 0 && r.URL.RawQuery == "" { + return + } + // For meaningful requests, validate it's size and content type if r.ContentLength > maxHTTPRequestContentLength { http.Error(w, fmt.Sprintf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength), http.StatusRequestEntityTooLarge) return } - ct := r.Header.Get("content-type") mt, _, err := mime.ParseMediaType(ct) if err != nil || mt != "application/json" { @@ -161,14 +165,13 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.StatusUnsupportedMediaType) return } - - w.Header().Set("content-type", "application/json") - - // create a codec that reads direct from the request body until - // EOF and writes the response to w and order the server to process - // a single request. + // All checks passed, create a codec that reads direct from the request body + // untilEOF and writes the response to w and order the server to process a + // single request. codec := NewJSONCodec(&httpReadWriteNopCloser{r.Body, w}) defer codec.Close() + + w.Header().Set("content-type", "application/json") srv.ServeSingleRequest(codec, OptionMethodInvocation) } From b0190189a386d13eb2e8bbdb6d64d9ef8c0e572a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 16 Nov 2017 18:53:18 +0200 Subject: [PATCH 260/272] core/vm, internal/ethapi: tracer no full storage, nicer json output (#15499) * core/vm, internal/ethapi: tracer no full storage, nicer json output * core/vm, internal/ethapi: omit disabled trace fields --- core/vm/logger.go | 26 +++---------------- core/vm/logger_test.go | 24 ------------------ internal/ethapi/api.go | 57 ++++++++++++++++++++++++------------------ 3 files changed, 36 insertions(+), 71 deletions(-) diff --git a/core/vm/logger.go b/core/vm/logger.go index 623c0d5632..75309da921 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -45,7 +45,6 @@ type LogConfig struct { DisableMemory bool // disable memory capture DisableStack bool // disable stack capture DisableStorage bool // disable storage capture - FullStorage bool // show full storage (slow) Limit int // maximum length of output, but zero means unlimited } @@ -136,14 +135,13 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui ) l.changedValues[contract.Address()][address] = value } - // copy a snapstot of the current memory state to a new buffer + // Copy a snapstot of the current memory state to a new buffer var mem []byte if !l.cfg.DisableMemory { mem = make([]byte, len(memory.Data())) copy(mem, memory.Data()) } - - // copy a snapshot of the current stack state to a new buffer + // Copy a snapshot of the current stack state to a new buffer var stck []*big.Int if !l.cfg.DisableStack { stck = make([]*big.Int, len(stack.Data())) @@ -151,26 +149,10 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui stck[i] = new(big.Int).Set(item) } } - - // Copy the storage based on the settings specified in the log config. If full storage - // is disabled (default) we can use the simple Storage.Copy method, otherwise we use - // the state object to query for all values (slow process). + // Copy a snapshot of the current storage to a new container var storage Storage if !l.cfg.DisableStorage { - if l.cfg.FullStorage { - storage = make(Storage) - // Get the contract account and loop over each storage entry. This may involve looping over - // the trie and is a very expensive process. - - env.StateDB.ForEachStorage(contract.Address(), func(key, value common.Hash) bool { - storage[key] = value - // Return true, indicating we'd like to continue. - return true - }) - } else { - // copy a snapshot of the current storage to a new container. - storage = l.changedValues[contract.Address()].Copy() - } + storage = l.changedValues[contract.Address()].Copy() } // create a new snaptshot of the EVM. log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, storage, depth, err} diff --git a/core/vm/logger_test.go b/core/vm/logger_test.go index b6fa31132a..915f7177e7 100644 --- a/core/vm/logger_test.go +++ b/core/vm/logger_test.go @@ -63,32 +63,8 @@ func TestStoreCapture(t *testing.T) { if len(logger.changedValues[contract.Address()]) == 0 { t.Fatalf("expected exactly 1 changed value on address %x, got %d", contract.Address(), len(logger.changedValues[contract.Address()])) } - exp := common.BigToHash(big.NewInt(1)) if logger.changedValues[contract.Address()][index] != exp { t.Errorf("expected %x, got %x", exp, logger.changedValues[contract.Address()][index]) } } - -func TestStorageCapture(t *testing.T) { - t.Skip("implementing this function is difficult. it requires all sort of interfaces to be implemented which isn't trivial. The value (the actual test) isn't worth it") - var ( - ref = &dummyContractRef{} - contract = NewContract(ref, ref, new(big.Int), 0) - env = NewEVM(Context{}, dummyStateDB{ref: ref}, params.TestChainConfig, Config{EnableJit: false, ForceJit: false}) - logger = NewStructLogger(nil) - mem = NewMemory() - stack = newstack() - ) - - logger.CaptureState(env, 0, STOP, 0, 0, mem, stack, contract, 0, nil) - if ref.calledForEach { - t.Error("didn't expect for each to be called") - } - - logger = NewStructLogger(&LogConfig{FullStorage: true}) - logger.CaptureState(env, 0, STOP, 0, 0, mem, stack, contract, 0, nil) - if !ref.calledForEach { - t.Error("expected for each to be called") - } -} diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 59a29d7226..cf15d1c71e 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -710,45 +710,52 @@ type ExecutionResult struct { // StructLogRes stores a structured log emitted by the EVM while replaying a // transaction in debug mode type StructLogRes struct { - Pc uint64 `json:"pc"` - Op string `json:"op"` - Gas uint64 `json:"gas"` - GasCost uint64 `json:"gasCost"` - Depth int `json:"depth"` - Error error `json:"error"` - Stack []string `json:"stack"` - Memory []string `json:"memory"` - Storage map[string]string `json:"storage"` + Pc uint64 `json:"pc"` + Op string `json:"op"` + Gas uint64 `json:"gas"` + GasCost uint64 `json:"gasCost"` + Depth int `json:"depth"` + Error error `json:"error,omitempty"` + Stack *[]string `json:"stack,omitempty"` + Memory *[]string `json:"memory,omitempty"` + Storage *map[string]string `json:"storage,omitempty"` } // formatLogs formats EVM returned structured logs for json output -func FormatLogs(structLogs []vm.StructLog) []StructLogRes { - formattedStructLogs := make([]StructLogRes, len(structLogs)) - for index, trace := range structLogs { - formattedStructLogs[index] = StructLogRes{ +func FormatLogs(logs []vm.StructLog) []StructLogRes { + formatted := make([]StructLogRes, len(logs)) + for index, trace := range logs { + formatted[index] = StructLogRes{ Pc: trace.Pc, Op: trace.Op.String(), Gas: trace.Gas, GasCost: trace.GasCost, Depth: trace.Depth, Error: trace.Err, - Stack: make([]string, len(trace.Stack)), - Storage: make(map[string]string), } - - for i, stackValue := range trace.Stack { - formattedStructLogs[index].Stack[i] = fmt.Sprintf("%x", math.PaddedBigBytes(stackValue, 32)) + if trace.Stack != nil { + stack := make([]string, len(trace.Stack)) + for i, stackValue := range trace.Stack { + stack[i] = fmt.Sprintf("%x", math.PaddedBigBytes(stackValue, 32)) + } + formatted[index].Stack = &stack } - - for i := 0; i+32 <= len(trace.Memory); i += 32 { - formattedStructLogs[index].Memory = append(formattedStructLogs[index].Memory, fmt.Sprintf("%x", trace.Memory[i:i+32])) + if trace.Memory != nil { + memory := make([]string, 0, (len(trace.Memory)+31)/32) + for i := 0; i+32 <= len(trace.Memory); i += 32 { + memory = append(memory, fmt.Sprintf("%x", trace.Memory[i:i+32])) + } + formatted[index].Memory = &memory } - - for i, storageValue := range trace.Storage { - formattedStructLogs[index].Storage[fmt.Sprintf("%x", i)] = fmt.Sprintf("%x", storageValue) + if trace.Storage != nil { + storage := make(map[string]string) + for i, storageValue := range trace.Storage { + storage[fmt.Sprintf("%x", i)] = fmt.Sprintf("%x", storageValue) + } + formatted[index].Storage = &storage } } - return formattedStructLogs + return formatted } // rpcOutputBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are From c5b8569707cabe19f861cb67062c07598aff2aa1 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Fri, 17 Nov 2017 04:07:11 -0800 Subject: [PATCH 261/272] rpc: disallow PUT and DELETE on HTTP (#15501) Fixes #15493 --- rpc/http.go | 43 ++++++++++++++++++++++++++++--------------- rpc/http_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 rpc/http_test.go diff --git a/rpc/http.go b/rpc/http.go index 2ac9f6c371..68634e3fdf 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -33,6 +33,7 @@ import ( ) const ( + contentType = "application/json" maxHTTPRequestContentLength = 1024 * 128 ) @@ -69,8 +70,8 @@ func DialHTTP(endpoint string) (*Client, error) { if err != nil { return nil, err } - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Accept", "application/json") + req.Header.Set("Content-Type", contentType) + req.Header.Set("Accept", contentType) initctx := context.Background() return newClient(initctx, func(context.Context) (net.Conn, error) { @@ -150,21 +151,11 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" && r.ContentLength == 0 && r.URL.RawQuery == "" { return } - // For meaningful requests, validate it's size and content type - if r.ContentLength > maxHTTPRequestContentLength { - http.Error(w, - fmt.Sprintf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength), - http.StatusRequestEntityTooLarge) - return - } - ct := r.Header.Get("content-type") - mt, _, err := mime.ParseMediaType(ct) - if err != nil || mt != "application/json" { - http.Error(w, - "invalid content type, only application/json is supported", - http.StatusUnsupportedMediaType) + if responseCode, errorMessage := httpErrorResponse(r); responseCode != 0 { + http.Error(w, errorMessage, responseCode) return } + // All checks passed, create a codec that reads direct from the request body // untilEOF and writes the response to w and order the server to process a // single request. @@ -175,6 +166,28 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { srv.ServeSingleRequest(codec, OptionMethodInvocation) } +// Returns a non-zero response code and error message if the request is invalid. +func httpErrorResponse(r *http.Request) (int, string) { + if r.Method == "PUT" || r.Method == "DELETE" { + errorMessage := "method not allowed" + return http.StatusMethodNotAllowed, errorMessage + } + + if r.ContentLength > maxHTTPRequestContentLength { + errorMessage := fmt.Sprintf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength) + return http.StatusRequestEntityTooLarge, errorMessage + } + + ct := r.Header.Get("content-type") + mt, _, err := mime.ParseMediaType(ct) + if err != nil || mt != contentType { + errorMessage := fmt.Sprintf("invalid content type, only %s is supported", contentType) + return http.StatusUnsupportedMediaType, errorMessage + } + + return 0, "" +} + func newCorsHandler(srv *Server, allowedOrigins []string) http.Handler { // disable CORS support if user has not specified a custom CORS configuration if len(allowedOrigins) == 0 { diff --git a/rpc/http_test.go b/rpc/http_test.go new file mode 100644 index 0000000000..f4afd52167 --- /dev/null +++ b/rpc/http_test.go @@ -0,0 +1,40 @@ +package rpc + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestHTTPErrorResponseWithDelete(t *testing.T) { + httpErrorResponseTest(t, "DELETE", contentType, "", http.StatusMethodNotAllowed) +} + +func TestHTTPErrorResponseWithPut(t *testing.T) { + httpErrorResponseTest(t, "PUT", contentType, "", http.StatusMethodNotAllowed) +} + +func TestHTTPErrorResponseWithMaxContentLength(t *testing.T) { + body := make([]rune, maxHTTPRequestContentLength+1, maxHTTPRequestContentLength+1) + httpErrorResponseTest(t, + "POST", contentType, string(body), http.StatusRequestEntityTooLarge) +} + +func TestHTTPErrorResponseWithEmptyContentType(t *testing.T) { + httpErrorResponseTest(t, "POST", "", "", http.StatusUnsupportedMediaType) +} + +func TestHTTPErrorResponseWithValidRequest(t *testing.T) { + httpErrorResponseTest(t, "POST", contentType, "", 0) +} + +func httpErrorResponseTest(t *testing.T, + method, contentType, body string, expectedResponse int) { + + request := httptest.NewRequest(method, "http://url.com", strings.NewReader(body)) + request.Header.Set("content-type", contentType) + if response, _ := httpErrorResponse(request); response != expectedResponse { + t.Fatalf("response code should be %d not %d", expectedResponse, response) + } +} From 3c6b9c5d726e6dda72f469fefd1a37b37a0a1621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 17 Nov 2017 14:18:46 +0200 Subject: [PATCH 262/272] rpc: minor cleanups to RPC PR --- rpc/http.go | 32 ++++++++++++++------------------ rpc/http_test.go | 34 ++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/rpc/http.go b/rpc/http.go index 68634e3fdf..5941c06776 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -151,41 +152,36 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" && r.ContentLength == 0 && r.URL.RawQuery == "" { return } - if responseCode, errorMessage := httpErrorResponse(r); responseCode != 0 { - http.Error(w, errorMessage, responseCode) + if code, err := validateRequest(r); err != nil { + http.Error(w, err.Error(), code) return } - // All checks passed, create a codec that reads direct from the request body // untilEOF and writes the response to w and order the server to process a // single request. codec := NewJSONCodec(&httpReadWriteNopCloser{r.Body, w}) defer codec.Close() - w.Header().Set("content-type", "application/json") + w.Header().Set("content-type", contentType) srv.ServeSingleRequest(codec, OptionMethodInvocation) } -// Returns a non-zero response code and error message if the request is invalid. -func httpErrorResponse(r *http.Request) (int, string) { +// validateRequest returns a non-zero response code and error message if the +// request is invalid. +func validateRequest(r *http.Request) (int, error) { if r.Method == "PUT" || r.Method == "DELETE" { - errorMessage := "method not allowed" - return http.StatusMethodNotAllowed, errorMessage + return http.StatusMethodNotAllowed, errors.New("method not allowed") } - if r.ContentLength > maxHTTPRequestContentLength { - errorMessage := fmt.Sprintf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength) - return http.StatusRequestEntityTooLarge, errorMessage + err := fmt.Errorf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength) + return http.StatusRequestEntityTooLarge, err } - - ct := r.Header.Get("content-type") - mt, _, err := mime.ParseMediaType(ct) + mt, _, err := mime.ParseMediaType(r.Header.Get("content-type")) if err != nil || mt != contentType { - errorMessage := fmt.Sprintf("invalid content type, only %s is supported", contentType) - return http.StatusUnsupportedMediaType, errorMessage + err := fmt.Errorf("invalid content type, only %s is supported", contentType) + return http.StatusUnsupportedMediaType, err } - - return 0, "" + return 0, nil } func newCorsHandler(srv *Server, allowedOrigins []string) http.Handler { diff --git a/rpc/http_test.go b/rpc/http_test.go index f4afd52167..1cb7a7acbf 100644 --- a/rpc/http_test.go +++ b/rpc/http_test.go @@ -1,3 +1,19 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package rpc import ( @@ -8,33 +24,31 @@ import ( ) func TestHTTPErrorResponseWithDelete(t *testing.T) { - httpErrorResponseTest(t, "DELETE", contentType, "", http.StatusMethodNotAllowed) + testHTTPErrorResponse(t, "DELETE", contentType, "", http.StatusMethodNotAllowed) } func TestHTTPErrorResponseWithPut(t *testing.T) { - httpErrorResponseTest(t, "PUT", contentType, "", http.StatusMethodNotAllowed) + testHTTPErrorResponse(t, "PUT", contentType, "", http.StatusMethodNotAllowed) } func TestHTTPErrorResponseWithMaxContentLength(t *testing.T) { body := make([]rune, maxHTTPRequestContentLength+1, maxHTTPRequestContentLength+1) - httpErrorResponseTest(t, + testHTTPErrorResponse(t, "POST", contentType, string(body), http.StatusRequestEntityTooLarge) } func TestHTTPErrorResponseWithEmptyContentType(t *testing.T) { - httpErrorResponseTest(t, "POST", "", "", http.StatusUnsupportedMediaType) + testHTTPErrorResponse(t, "POST", "", "", http.StatusUnsupportedMediaType) } func TestHTTPErrorResponseWithValidRequest(t *testing.T) { - httpErrorResponseTest(t, "POST", contentType, "", 0) + testHTTPErrorResponse(t, "POST", contentType, "", 0) } -func httpErrorResponseTest(t *testing.T, - method, contentType, body string, expectedResponse int) { - +func testHTTPErrorResponse(t *testing.T, method, contentType, body string, expected int) { request := httptest.NewRequest(method, "http://url.com", strings.NewReader(body)) request.Header.Set("content-type", contentType) - if response, _ := httpErrorResponse(request); response != expectedResponse { - t.Fatalf("response code should be %d not %d", expectedResponse, response) + if code, _ := validateRequest(request); code != expected { + t.Fatalf("response code should be %d not %d", expected, code) } } From c7b0abf86bf3039a87b5b5ae88635326a762cf31 Mon Sep 17 00:00:00 2001 From: tsarpaul Date: Fri, 17 Nov 2017 15:07:57 +0200 Subject: [PATCH 263/272] Added output to clarify gas calculation in txpool.inspect --- internal/ethapi/api.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index cf15d1c71e..025f426177 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -151,9 +151,9 @@ func (s *PublicTxPoolAPI) Inspect() map[string]map[string]map[string]string { // Define a formatter to flatten a transaction into a string var format = func(tx *types.Transaction) string { if to := tx.To(); to != nil { - return fmt.Sprintf("%s: %v wei + %v × %v gas", tx.To().Hex(), tx.Value(), tx.Gas(), tx.GasPrice()) + return fmt.Sprintf("%s: %v wei + %v gas × %v wei", tx.To().Hex(), tx.Value(), tx.Gas(), tx.GasPrice()) } - return fmt.Sprintf("contract creation: %v wei + %v × %v gas", tx.Value(), tx.Gas(), tx.GasPrice()) + return fmt.Sprintf("contract creation: %v wei + %v gas × %v wei", tx.Value(), tx.Gas(), tx.GasPrice()) } // Flatten the pending transactions for account, txs := range pending { From 2ab5c11261f742ee44afb0b70a33241fe2008c9d Mon Sep 17 00:00:00 2001 From: Martin Michlmayr Date: Fri, 17 Nov 2017 14:26:55 +0000 Subject: [PATCH 264/272] README: fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 57b0ea92bc..61e36afec4 100644 --- a/README.md +++ b/README.md @@ -266,7 +266,7 @@ instance for mining, run it with all your usual flags, extended by: $ geth --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000 ``` -Which will start mining bocks and transactions on a single CPU thread, crediting all proceedings to +Which will start mining blocks and transactions on a single CPU thread, crediting all proceedings to the account specified by `--etherbase`. You can further tune the mining by changing the default gas limit blocks converge to (`--targetgaslimit`) and the price transactions are accepted at (`--gasprice`). From f5091e5711fc18205ed3a7c2d9d6a7fe7f0262f2 Mon Sep 17 00:00:00 2001 From: Pulyak Viktor Date: Sat, 18 Nov 2017 04:56:03 +0300 Subject: [PATCH 265/272] internal/ethapi: fix js tracer to properly decode addresses (#15297) * Add method getBalanceFromJs for work with address as bytes * expect []byte instead of common.Address in ethapi tracer --- internal/ethapi/tracer.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/internal/ethapi/tracer.go b/internal/ethapi/tracer.go index 0516265270..fc742e6c44 100644 --- a/internal/ethapi/tracer.go +++ b/internal/ethapi/tracer.go @@ -130,28 +130,28 @@ type dbWrapper struct { } // getBalance retrieves an account's balance -func (dw *dbWrapper) getBalance(addr common.Address) *big.Int { - return dw.db.GetBalance(addr) +func (dw *dbWrapper) getBalance(addr []byte) *big.Int { + return dw.db.GetBalance(common.BytesToAddress(addr)) } // getNonce retrieves an account's nonce -func (dw *dbWrapper) getNonce(addr common.Address) uint64 { - return dw.db.GetNonce(addr) +func (dw *dbWrapper) getNonce(addr []byte) uint64 { + return dw.db.GetNonce(common.BytesToAddress(addr)) } // getCode retrieves an account's code -func (dw *dbWrapper) getCode(addr common.Address) []byte { - return dw.db.GetCode(addr) +func (dw *dbWrapper) getCode(addr []byte) []byte { + return dw.db.GetCode(common.BytesToAddress(addr)) } // getState retrieves an account's state data for the given hash -func (dw *dbWrapper) getState(addr common.Address, hash common.Hash) common.Hash { - return dw.db.GetState(addr, hash) +func (dw *dbWrapper) getState(addr []byte, hash common.Hash) common.Hash { + return dw.db.GetState(common.BytesToAddress(addr), hash) } // exists returns true iff the account exists -func (dw *dbWrapper) exists(addr common.Address) bool { - return dw.db.Exist(addr) +func (dw *dbWrapper) exists(addr []byte) bool { + return dw.db.Exist(common.BytesToAddress(addr)) } // toValue returns an otto.Value for the dbWrapper From 8a7983604446b3ad4a95c9d175e354339370b606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 20 Nov 2017 12:20:46 +0200 Subject: [PATCH 266/272] accounts: list, then subscribe (sub requires active reader) --- accounts/manager.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/accounts/manager.go b/accounts/manager.go index 78ddb13683..96ca298fc5 100644 --- a/accounts/manager.go +++ b/accounts/manager.go @@ -41,6 +41,11 @@ type Manager struct { // NewManager creates a generic account manager to sign transaction via various // supported backends. func NewManager(backends ...Backend) *Manager { + // Retrieve the initial list of wallets from the backends and sort by URL + var wallets []Wallet + for _, backend := range backends { + wallets = merge(wallets, backend.Wallets()...) + } // Subscribe to wallet notifications from all backends updates := make(chan WalletEvent, 4*len(backends)) @@ -48,11 +53,6 @@ func NewManager(backends ...Backend) *Manager { for i, backend := range backends { subs[i] = backend.Subscribe(updates) } - // Retrieve the initial list of wallets from the backends and sort by URL - var wallets []Wallet - for _, backend := range backends { - wallets = merge(wallets, backend.Wallets()...) - } // Assemble the account manager and return am := &Manager{ backends: make(map[reflect.Type][]Backend), From 6810674de969145fe259714fa622d91b59fce025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 20 Nov 2017 12:21:52 +0200 Subject: [PATCH 267/272] accounts/keystore: lock file cache during scan, minor polish --- accounts/keystore/account_cache.go | 113 ++++++----------------------- accounts/keystore/file_cache.go | 102 ++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 91 deletions(-) create mode 100644 accounts/keystore/file_cache.go diff --git a/accounts/keystore/account_cache.go b/accounts/keystore/account_cache.go index 4b08cc2029..71f698ece7 100644 --- a/accounts/keystore/account_cache.go +++ b/accounts/keystore/account_cache.go @@ -20,7 +20,6 @@ import ( "bufio" "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" "sort" @@ -75,13 +74,6 @@ type accountCache struct { fileC fileCache } -// fileCache is a cache of files seen during scan of keystore -type fileCache struct { - all *set.SetNonTS // list of all files - mtime time.Time // latest mtime seen - mu sync.RWMutex -} - func newAccountCache(keydir string) (*accountCache, chan struct{}) { ac := &accountCache{ keydir: keydir, @@ -236,66 +228,22 @@ func (ac *accountCache) close() { ac.mu.Unlock() } -// scanFiles performs a new scan on the given directory, compares against the already -// cached filenames, and returns file sets: new, missing , modified -func (fc *fileCache) scanFiles(keyDir string) (set.Interface, set.Interface, set.Interface, error) { - t0 := time.Now() - files, err := ioutil.ReadDir(keyDir) - t1 := time.Now() - if err != nil { - return nil, nil, nil, err - } - fc.mu.RLock() - prevMtime := fc.mtime - fc.mu.RUnlock() - - filesNow := set.NewNonTS() - moddedFiles := set.NewNonTS() - var newMtime time.Time - for _, fi := range files { - modTime := fi.ModTime() - path := filepath.Join(keyDir, fi.Name()) - if skipKeyFile(fi) { - log.Trace("Ignoring file on account scan", "path", path) - continue - } - filesNow.Add(path) - if modTime.After(prevMtime) { - moddedFiles.Add(path) - } - if modTime.After(newMtime) { - newMtime = modTime - } - } - t2 := time.Now() - - fc.mu.Lock() - // Missing = previous - current - missing := set.Difference(fc.all, filesNow) - // New = current - previous - newFiles := set.Difference(filesNow, fc.all) - // Modified = modified - new - modified := set.Difference(moddedFiles, newFiles) - fc.all = filesNow - fc.mtime = newMtime - fc.mu.Unlock() - t3 := time.Now() - log.Debug("FS scan times", "list", t1.Sub(t0), "set", t2.Sub(t1), "diff", t3.Sub(t2)) - return newFiles, missing, modified, nil -} - // scanAccounts checks if any changes have occurred on the filesystem, and // updates the account cache accordingly func (ac *accountCache) scanAccounts() error { - newFiles, missingFiles, modified, err := ac.fileC.scanFiles(ac.keydir) - t1 := time.Now() + // Scan the entire folder metadata for file changes + creates, deletes, updates, err := ac.fileC.scan(ac.keydir) if err != nil { log.Debug("Failed to reload keystore contents", "err", err) return err } + if creates.Size() == 0 && deletes.Size() == 0 && updates.Size() == 0 { + return nil + } + // Create a helper method to scan the contents of the key files var ( - buf = new(bufio.Reader) - keyJSON struct { + buf = new(bufio.Reader) + key struct { Address string `json:"address"` } ) @@ -308,9 +256,9 @@ func (ac *accountCache) scanAccounts() error { defer fd.Close() buf.Reset(fd) // Parse the address. - keyJSON.Address = "" - err = json.NewDecoder(buf).Decode(&keyJSON) - addr := common.HexToAddress(keyJSON.Address) + key.Address = "" + err = json.NewDecoder(buf).Decode(&key) + addr := common.HexToAddress(key.Address) switch { case err != nil: log.Debug("Failed to decode keystore key", "path", path, "err", err) @@ -321,47 +269,30 @@ func (ac *accountCache) scanAccounts() error { } return nil } + // Process all the file diffs + start := time.Now() - for _, p := range newFiles.List() { - path, _ := p.(string) - a := readAccount(path) - if a != nil { + for _, p := range creates.List() { + if a := readAccount(p.(string)); a != nil { ac.add(*a) } } - for _, p := range missingFiles.List() { - path, _ := p.(string) - ac.deleteByFile(path) + for _, p := range deletes.List() { + ac.deleteByFile(p.(string)) } - - for _, p := range modified.List() { - path, _ := p.(string) - a := readAccount(path) + for _, p := range updates.List() { + path := p.(string) ac.deleteByFile(path) - if a != nil { + if a := readAccount(path); a != nil { ac.add(*a) } } - - t2 := time.Now() + end := time.Now() select { case ac.notify <- struct{}{}: default: } - log.Trace("Handled keystore changes", "time", t2.Sub(t1)) - + log.Trace("Handled keystore changes", "time", end.Sub(start)) return nil } - -func skipKeyFile(fi os.FileInfo) bool { - // Skip editor backups and UNIX-style hidden files. - if strings.HasSuffix(fi.Name(), "~") || strings.HasPrefix(fi.Name(), ".") { - return true - } - // Skip misc special files, directories (yes, symlinks too). - if fi.IsDir() || fi.Mode()&os.ModeType != 0 { - return true - } - return false -} diff --git a/accounts/keystore/file_cache.go b/accounts/keystore/file_cache.go new file mode 100644 index 0000000000..c91b7b7b61 --- /dev/null +++ b/accounts/keystore/file_cache.go @@ -0,0 +1,102 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package keystore + +import ( + "io/ioutil" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum/log" + set "gopkg.in/fatih/set.v0" +) + +// fileCache is a cache of files seen during scan of keystore. +type fileCache struct { + all *set.SetNonTS // Set of all files from the keystore folder + lastMod time.Time // Last time instance when a file was modified + mu sync.RWMutex +} + +// scan performs a new scan on the given directory, compares against the already +// cached filenames, and returns file sets: creates, deletes, updates. +func (fc *fileCache) scan(keyDir string) (set.Interface, set.Interface, set.Interface, error) { + t0 := time.Now() + + // List all the failes from the keystore folder + files, err := ioutil.ReadDir(keyDir) + if err != nil { + return nil, nil, nil, err + } + t1 := time.Now() + + fc.mu.Lock() + defer fc.mu.Unlock() + + // Iterate all the files and gather their metadata + all := set.NewNonTS() + mods := set.NewNonTS() + + var newLastMod time.Time + for _, fi := range files { + // Skip any non-key files from the folder + path := filepath.Join(keyDir, fi.Name()) + if skipKeyFile(fi) { + log.Trace("Ignoring file on account scan", "path", path) + continue + } + // Gather the set of all and fresly modified files + all.Add(path) + + modified := fi.ModTime() + if modified.After(fc.lastMod) { + mods.Add(path) + } + if modified.After(newLastMod) { + newLastMod = modified + } + } + t2 := time.Now() + + // Update the tracked files and return the three sets + deletes := set.Difference(fc.all, all) // Deletes = previous - current + creates := set.Difference(all, fc.all) // Creates = current - previous + updates := set.Difference(mods, creates) // Updates = modified - creates + + fc.all, fc.lastMod = all, newLastMod + t3 := time.Now() + + // Report on the scanning stats and return + log.Debug("FS scan times", "list", t1.Sub(t0), "set", t2.Sub(t1), "diff", t3.Sub(t2)) + return creates, deletes, updates, nil +} + +// skipKeyFile ignores editor backups, hidden files and folders/symlinks. +func skipKeyFile(fi os.FileInfo) bool { + // Skip editor backups and UNIX-style hidden files. + if strings.HasSuffix(fi.Name(), "~") || strings.HasPrefix(fi.Name(), ".") { + return true + } + // Skip misc special files, directories (yes, symlinks too). + if fi.IsDir() || fi.Mode()&os.ModeType != 0 { + return true + } + return false +} From e2b3a23663393f5101a0a38086ca0911568ed427 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 20 Nov 2017 12:35:30 +0100 Subject: [PATCH 268/272] accounts/keystore: Ignore initial trigger of rescan-event --- accounts/keystore/watch.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/accounts/keystore/watch.go b/accounts/keystore/watch.go index 602300b107..bbcfb99257 100644 --- a/accounts/keystore/watch.go +++ b/accounts/keystore/watch.go @@ -81,10 +81,14 @@ func (w *watcher) loop() { // When an event occurs, the reload call is delayed a bit so that // multiple events arriving quickly only cause a single reload. var ( - debounce = time.NewTimer(0) debounceDuration = 500 * time.Millisecond rescanTriggered = false + debounce = time.NewTimer(0) ) + // Ignore initial trigger + if !debounce.Stop() { + <-debounce.C + } defer debounce.Stop() for { select { From 72ed186f46a31ec29bb255bfcadfbfd036cce791 Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Mon, 20 Nov 2017 16:18:50 +0100 Subject: [PATCH 269/272] eth, internal: Implement getModifiedAccountsBy(Hash|Number) using trie diffs (#15512) * eth, internal: Implement using trie diffs * eth, internal: Changes in response to review * eth: More fixes to getModifiedAccountsBy* * eth: minor polishes on error capitalization --- eth/api.go | 83 +++++++++++++++++++++++++++++++++++++ internal/web3ext/web3ext.go | 12 ++++++ 2 files changed, 95 insertions(+) diff --git a/eth/api.go b/eth/api.go index e91f51bb99..12448a6a11 100644 --- a/eth/api.go +++ b/eth/api.go @@ -636,3 +636,86 @@ func storageRangeAt(st state.Trie, start []byte, maxResult int) StorageRangeResu } return result } + +// GetModifiedAccountsByumber returns all accounts that have changed between the +// two blocks specified. A change is defined as a difference in nonce, balance, +// code hash, or storage hash. +// +// With one parameter, returns the list of accounts modified in the specified block. +func (api *PrivateDebugAPI) GetModifiedAccountsByNumber(startNum uint64, endNum *uint64) ([]common.Address, error) { + var startBlock, endBlock *types.Block + + startBlock = api.eth.blockchain.GetBlockByNumber(startNum) + if startBlock == nil { + return nil, fmt.Errorf("start block %x not found", startNum) + } + + if endNum == nil { + endBlock = startBlock + startBlock = api.eth.blockchain.GetBlockByHash(startBlock.ParentHash()) + if startBlock == nil { + return nil, fmt.Errorf("block %x has no parent", endBlock.Number()) + } + } else { + endBlock = api.eth.blockchain.GetBlockByNumber(*endNum) + if endBlock == nil { + return nil, fmt.Errorf("end block %d not found", *endNum) + } + } + return api.getModifiedAccounts(startBlock, endBlock) +} + +// GetModifiedAccountsByHash returns all accounts that have changed between the +// two blocks specified. A change is defined as a difference in nonce, balance, +// code hash, or storage hash. +// +// With one parameter, returns the list of accounts modified in the specified block. +func (api *PrivateDebugAPI) GetModifiedAccountsByHash(startHash common.Hash, endHash *common.Hash) ([]common.Address, error) { + var startBlock, endBlock *types.Block + startBlock = api.eth.blockchain.GetBlockByHash(startHash) + if startBlock == nil { + return nil, fmt.Errorf("start block %x not found", startHash) + } + + if endHash == nil { + endBlock = startBlock + startBlock = api.eth.blockchain.GetBlockByHash(startBlock.ParentHash()) + if startBlock == nil { + return nil, fmt.Errorf("block %x has no parent", endBlock.Number()) + } + } else { + endBlock = api.eth.blockchain.GetBlockByHash(*endHash) + if endBlock == nil { + return nil, fmt.Errorf("end block %x not found", *endHash) + } + } + return api.getModifiedAccounts(startBlock, endBlock) +} + +func (api *PrivateDebugAPI) getModifiedAccounts(startBlock, endBlock *types.Block) ([]common.Address, error) { + if startBlock.Number().Uint64() >= endBlock.Number().Uint64() { + return nil, fmt.Errorf("start block height (%d) must be less than end block height (%d)", startBlock.Number().Uint64(), endBlock.Number().Uint64()) + } + + oldTrie, err := trie.NewSecure(startBlock.Root(), api.eth.chainDb, 0) + if err != nil { + return nil, err + } + newTrie, err := trie.NewSecure(endBlock.Root(), api.eth.chainDb, 0) + if err != nil { + return nil, err + } + + diff, _ := trie.NewDifferenceIterator(oldTrie.NodeIterator([]byte{}), newTrie.NodeIterator([]byte{})) + iter := trie.NewIterator(diff) + + var dirty []common.Address + for iter.Next() { + key := newTrie.GetKey(iter.Key) + if key == nil { + return nil, fmt.Errorf("no preimage found for hash %x", iter.Key) + } + dirty = append(dirty, common.BytesToAddress(key)) + } + return dirty, nil +} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 1ae6e2d738..ef0d2b4e6e 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -354,6 +354,18 @@ web3._extend({ call: 'debug_storageRangeAt', params: 5, }), + new web3._extend.Method({ + name: 'getModifiedAccountsByNumber', + call: 'debug_getModifiedAccountsByNumber', + params: 2, + inputFormatter: [null, null], + }), + new web3._extend.Method({ + name: 'getModifiedAccountsByHash', + call: 'debug_getModifiedAccountsByHash', + params: 2, + inputFormatter:[null, null], + }), ], properties: [] }); From b4f2e4de8fcbaab22f1b8ac1faa0c99517bd9405 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 20 Nov 2017 17:32:23 +0100 Subject: [PATCH 270/272] .github: add CODEOWNERS (#15507) --- .github/CODEOWNERS | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..6076fe46a4 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,9 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +accounts/usbwallet @karalabe +consensus @karalabe +core/ @karalabe @holiman +eth/ @karalabe +mobile/ @karalabe +p2p/ @fjl @zsfelfoldi From bedf6f40aff0dd14bfab533a37c329ddc9a4bdd5 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 20 Nov 2017 17:39:53 +0100 Subject: [PATCH 271/272] cmd/geth: make geth account new faster with many keys (#15529) --- accounts/keystore/keystore_passphrase.go | 7 +++++ cmd/geth/accountcmd.go | 21 +++++++++++--- node/config.go | 36 +++++++++++++++--------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/accounts/keystore/keystore_passphrase.go b/accounts/keystore/keystore_passphrase.go index 535608a600..eaec39f7df 100644 --- a/accounts/keystore/keystore_passphrase.go +++ b/accounts/keystore/keystore_passphrase.go @@ -28,6 +28,7 @@ package keystore import ( "bytes" "crypto/aes" + crand "crypto/rand" "crypto/sha256" "encoding/hex" "encoding/json" @@ -90,6 +91,12 @@ func (ks keyStorePassphrase) GetKey(addr common.Address, filename, auth string) return key, nil } +// StoreKey generates a key, encrypts with 'auth' and stores in the given directory +func StoreKey(dir, auth string, scryptN, scryptP int) (common.Address, error) { + _, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP}, crand.Reader, auth) + return a.Address, err +} + func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { keyjson, err := EncryptKey(key, auth, ks.scryptN, ks.scryptP) if err != nil { diff --git a/cmd/geth/accountcmd.go b/cmd/geth/accountcmd.go index 0f53c92b0a..0db5c4ce0f 100644 --- a/cmd/geth/accountcmd.go +++ b/cmd/geth/accountcmd.go @@ -291,15 +291,28 @@ func ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrErr // accountCreate creates a new account into the keystore defined by the CLI flags. func accountCreate(ctx *cli.Context) error { - stack, _ := makeConfigNode(ctx) + cfg := gethConfig{Node: defaultNodeConfig()} + // Load config file. + if file := ctx.GlobalString(configFileFlag.Name); file != "" { + if err := loadConfig(file, &cfg); err != nil { + utils.Fatalf("%v", err) + } + } + utils.SetNodeConfig(ctx, &cfg.Node) + scryptN, scryptP, keydir, err := cfg.Node.AccountConfig() + + if err != nil { + utils.Fatalf("Failed to read configuration: %v", err) + } + password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) - account, err := ks.NewAccount(password) + address, err := keystore.StoreKey(keydir, password, scryptN, scryptP) + if err != nil { utils.Fatalf("Failed to create account: %v", err) } - fmt.Printf("Address: {%x}\n", account.Address) + fmt.Printf("Address: {%x}\n", address) return nil } diff --git a/node/config.go b/node/config.go index be9e21b4fa..1ee02d8963 100644 --- a/node/config.go +++ b/node/config.go @@ -360,35 +360,43 @@ func (c *Config) parsePersistentNodes(path string) []*discover.Node { return nodes } -func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { +// AccountConfig determines the settings for scrypt and keydirectory +func (c *Config) AccountConfig() (int, int, string, error) { scryptN := keystore.StandardScryptN scryptP := keystore.StandardScryptP - if conf.UseLightweightKDF { + if c.UseLightweightKDF { scryptN = keystore.LightScryptN scryptP = keystore.LightScryptP } var ( - keydir string - ephemeral string - err error + keydir string + err error ) switch { - case filepath.IsAbs(conf.KeyStoreDir): - keydir = conf.KeyStoreDir - case conf.DataDir != "": - if conf.KeyStoreDir == "" { - keydir = filepath.Join(conf.DataDir, datadirDefaultKeyStore) + case filepath.IsAbs(c.KeyStoreDir): + keydir = c.KeyStoreDir + case c.DataDir != "": + if c.KeyStoreDir == "" { + keydir = filepath.Join(c.DataDir, datadirDefaultKeyStore) } else { - keydir, err = filepath.Abs(conf.KeyStoreDir) + keydir, err = filepath.Abs(c.KeyStoreDir) } - case conf.KeyStoreDir != "": - keydir, err = filepath.Abs(conf.KeyStoreDir) - default: + case c.KeyStoreDir != "": + keydir, err = filepath.Abs(c.KeyStoreDir) + } + return scryptN, scryptP, keydir, err +} + +func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { + scryptN, scryptP, keydir, err := conf.AccountConfig() + var ephemeral string + if keydir == "" { // There is no datadir. keydir, err = ioutil.TempDir("", "go-ethereum-keystore") ephemeral = keydir } + if err != nil { return nil, "", err } From 4bb3c89d44e372e6a9ab85a8be0c9345265c763a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 21 Nov 2017 11:54:19 +0200 Subject: [PATCH 272/272] params: release v1.7.3 stable --- params/version.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params/version.go b/params/version.go index 40d4591625..4fb1d0847a 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 7 // Minor version component of the current release - VersionPatch = 3 // Patch version component of the current release - VersionMeta = "unstable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 7 // Minor version component of the current release + VersionPatch = 3 // Patch version component of the current release + VersionMeta = "stable" // Version metadata to append to the version string ) // Version holds the textual version string.
+ Your request yields ambiguous results! +
+ Your request may refer to: +
+ {{ .Details}}
" + msg.requests[i].account + "
" + moment.duration(moment(msg.requests[i].time).unix()-moment().unix(), 'seconds').humanize(true) + "
" + msg.requests[i].account + "
" + moment.duration(moment(msg.requests[i].time).unix()-moment().unix(), 'seconds').humanize(true) + "
" + msg.requests[i].account + "
" + moment.duration(moment(msg.requests[i].time).unix()-moment().unix(), 'seconds').humanize(true) + "
" + requests[i].account + "
"; + if (done) { + content += " funded"; + } else { + content += " " + moment.duration(-elapsed, 'seconds').humanize(true) + ""; + } + content += "
"; + if (done) { + content += "
"; + } else if (elapsed > 30) { + content += "
"; + } else { + content += "
"; + } + content += "
"; + content += "